2013年8月31日星期六

又见日志-从日志中的思考

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
又见日志-从日志中的思考  阅读原文»

又见日志-从日志中的思考

煮酒品茶:文章写的比较烂,如果有更好的方案或者有啥错误的话请指出来,品茶在此谢过了。

前记:换新工作后,这边有另一个部门的同事打电话过来要协助。说操作系统启动不了。报错Duplicate or bad block in use!

询问过程:

1、稳定对方,问题发生了咱们不急慢慢解决,别脑袋短了思路。

2、询问对方是否有备份

答:是台SVN的机器,都有备份,是以前的老机器,重启后就一直进不去。

3、询问对方现象是怎样

答:一直进不去单用户模式,卡死在百分之60之后,操作系统是centos 5 x86机器,出问题前一直很少关注此机器,所以无法回答之前有哪些操作

4、询问此机器服务的重要级别

答:重要级别在他们中排的比较低,所以有大把时间找事情。

处理过程:

1、首先让发图到群里

:根据分析,是mount /dev/sys后触发/etc/fstab 中选项选描机器,最后检测到有坏块。初步分析可能是文件系统坏掉或者磁盘某些磁道坏了。

2、制定方案

:因为级别不重要并且有备份,所以很好处理。先让他进单用户模式,在ro 后面加single,多等会儿,让机器扫描完或者别的。进系统后fsck -a /dev/$(sda),如果实在进不去,最好用同发行版的光盘进入恢复模式,挂载硬盘之后再确认是否有重要数据,再次备份出来。在询问中得之他的硬盘使用年限为2年,一般5年就老出问题了。如果是5年了就直接换块新硬盘装系统恢复继续跑。如果硬盘还年轻就让他装完系统恢复跑着。把监控做好。

3、反馈

3.1 告之我已经进入系统(中午吃饭让他一直跑),然后正在fsck修复。然后1个小时后修复成功。

3.2 告之我发现是硬盘使用量达到100%,出问题也有一部原因吧,心里在想难道没有做监控?最后通过du发现是tomcat 日志380G,nginx日志40G,单硬盘500G。瞧了一眼就发现很多问题。

3.3 让他备份日志,他说日志都不需要备份,最后给他讲了日志的重要性后,他还是决定删除,我就让他先删除2010年再册2012年的,发现基本没释放多少。最后他决定全删除,我也没反对。最后清空得到400G左右的空闲空间

3.4 让他再次重启确定进入系统是没有问题的。

3.5 让他做好监控

4、事后反馈

4.1 本以为事情到这里已经有段结尾了,对方又联系说要支持。一番询问下来得知tomcat日志又把磁盘写满了,我心在想有这么大的量吗?才一天。他告诉我是内网访问大造成的。最后告诉他这是tomcat的日志分割的作用,切分后不会把以前的内容删掉,所以是叠加。当然一想也不行,这么大的日志过来,谁也受不了。

4.2 他询问我有没有办法不要日志,我当然又是一通讲解,日志的作用。最后他还是坚持不要。哈哈,内网的也无所谓了,重要级别又不高。

4.3 最后把tomcat的日志名建了一个/dev/null的链接。写日志都写到空设备上面去。

4.4 这下事情应该有一个小段落了

5、反思

5.1 备份机制一定要做好,可以做做恢复迅练。

5.2 如果是我要搞这个事我会怎么做?监控没做好,一切问题都发现不了。

5.3 日志问题一定要解决,可以传到内网备份服务器上面。

5.4 如果重要级别高的话可以做个小RAID,坏块盘也没事。但前提也是要做好监控。

5.5 另外硬盘的年限就那么久,跑了5年了就让他去死吧。上了5年问题就会慢慢积多。

5.6 机器启动不了是为啥?linux操作很多都不需要重启的,如果你改了某些配置,但没让他生交效,等你下次重启时生效结果发现机器启动不了了,就跟服务一样,你改了配置文件,过几天你要改个配置,结果发现启动不了,你检查你今天改的配置你找的出问题?幸好有错误提示。

5.7 是否有个流程指导我们怎么操作这些事儿?

附图:

阅读更多内容

BITED程序员语言学习心得之:C#语言基础 - BITED

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
BITED程序员语言学习心得之:C#语言基础 - BITED  阅读原文»

  一、HelloWorld

  我们先来看看最简单的C#代码——HelloWorld:

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace DailyCSHARP20130829

8 {
9 class HelloWorld
10 {
11 public static void Main()
12 {
13 System.Console.WriteLine("Hello World!");
14 System.Console.ReadLine();
15 }
16 }
17 }

  二、标识符

  然后我们说说C#标识符。标识符的命名规则有三:

  1. 类名和函数名用大写字母开头的单词组成。
  2. 变量和参数用小写字母开头的单词组成。
  3. 常量用全用大写的单词,用下划线分隔单词。

  

  三、变量和常量

  我们通过以下一段代码来认识C#的各种变量类型。

1 class A
2 {
3 public static int x;
4 int y;
5 void F(int[] v, int a, ref int b, out int c) {
6 int i = 1;
7 c = a + b++;
8 }
9 }

  其中x是静态变量,y是实例变量,v[0]是数组元素,a是数组参数,b是引用参数,c是输出参数,i是局部变量。

  四、数据类型

  数组在声明时不能指定大小。

  装箱和拆箱装箱和拆箱是一个抽象的概念装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型利用

各种序列化库的性能数据 - 张善友  阅读原文»

本文内容来自http://theburningmonk.com/benchmarks/,作者收集了各种序列化库的性能数据,数据仅供参考,作为一个经验法则你应该自己动手针对您的实际数据和用例做测试。

1、二进制序列化

Summary table

Bar chart

Properties vs Fields

Seri­al­iz­ers Tested

Bina­ry­For­mat­ter

protobuf-net v2.0.0.480

Msg­Pack v0.1.4298.15470

Mes­sage­Shark

更多信息看这里.

2、Json序列化

image

image

Seri­al­iz­ers Tested

Json.Net v4.5.10

ServiceStack.Text v3.9.28

Dat­a­Con­trac­tJ­son­Se­ri­al­izer

JavaScript­Se­ri­al­izer

Sim­ple­J­son

fastJ­son v1.9.6

Jay­Rock v0.9.12915

JsonFx v2.0.1209.2802

Mon­goDB Dri­ver v1.6.1

更多信息看这里.


本文链接:http://www.cnblogs.com/shanyou/p/3294201.html,转载请注明。

阅读更多内容

2013年8月29日星期四

CentOS Bind DNS自动化部署

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
CentOS Bind DNS自动化部署  阅读原文»

CentOS Bind DNS自动化部署

最近研究DNS主从服务,也是参考了很多文章,这里记录一下,方便大家少走弯路,DNS服务可以算是Linux服务中比较难的一个了,尤其是配置文件书写,少一个字符都有可能造成错误。

那什么是DNS呢?简单的说就是完成域名到IP的解析过程。简洁的域名能让人们更方便记忆,不需要记那么长的IP访问某一个网站。

DNS解析过程到底是怎样的呢?

第一步:客户机访问某个网站,请求域名解析,首先查找本地HOST文件,如果有对应域名、IP记录,直接返回给客户机。如果没有则将该请求发送给本地的域名服务器:

第二步:本地DNS服务器能够解析客户端发来的请求,服务器直接将答案返回给客户机。

第三步:本地DNS服务器不能解析客户端发来的请求,分为两种解析方法

1、采用递归解析:本地DNS服务器向根域名服务器发出请求,根域名服务器对本地域名服务的请求进行解析,得到记录再给本地DNS服务器,本地DNS服务器将记录缓存,并将记录返给客户机。

2、采用迭代解析:本地DNS服务器向根域名服务器发出请求,根域名服务器返回给本地域名服务器一个能够解析请求的根的下一级域名服务器的地址,本地域名服务器在向根返回的IP地址发出请求,最终得到域名解析记录。

如上只是简单介绍了一下DNS相关知识,言归正传,如下通过脚本自动安装并添加域名解析,脚本可以根据自己的需求修改:(脚本适用于CentOS x86_64 5.8系列)

  #!/bin/sh  #auto install config bind server  #wugk 2013-08-28  #定义变量  BND_ETC=/var/named/chroot/etc  BND_VAR=/var/named/chroot/var/named  BAK_DIR=/data/backup/dns_`date +%Y%m%d-%H%M`  ##Backup named server  if        [ ! -d  $BAK_DIR ];then        echo "Please waiting  Backup Named Config ............"        mkdir   -p  $BAK_DIR        cp -a  /var/named/chroot/{etc,var}   $BAK_DIR        cp -a  /etc/named.* $BAK_DIR  fi  ##Define Shell Install Function  Install ()  {    if       [ ! -e /etc/init.d/named ];then       rpm -e --nodeps bind-utils       rpm -e --nodeps bind-libs       rpm -e --nodeps bind       rpm -e bind-chroot       rpm -e caching-nameserver       rpm -ivh --nodeps  bind-9.3.6-20.P1.el5_8.6.x86_64.rpm  bind-chroot-9.3.6-20.P1.el5_8.6.x86_64.rpm    bind-libs-9.3.6-20.P1.el5_8.6.x86_64.rpm  bind-utils-9.3.6-20.P1.el5_8.6.x86_64.rpm   caching-nameserver-9.3.6-20.P1.el5_8.6.x86_64.rpm  else       echo -------------------------------------------------       echo "The Named Server is exists ,Please exit ........."       sleep 1   fi  }  ##Define Shell Init Function  Init_Config ()  {         cd $BND_ETC ;ls ./*         cp   -p  named.caching-nameserver.conf named.conf         sed  -i -e 's/localhost;/any;/g' -e '/port/s/127.0.0.1/any/g' named.conf         echo -------------------------------------------------         sleep 2         echo "The named.conf config Init success !"  }  ##Define Shell Add Name Function  Add_named ()  {  ##DNS name         read -p  "Please  Insert Into Your Add Name ,Example 51cto.com :" NAME         echo $NAME |grep -E "com|cn|net|org"         while          [ "$?" -ne 0 ]           do          read -p  "Please  reInsert Into Your Add Name ,Example 51cto.com :" NAME          echo $NAME |grep -E "com|cn|net|org"       done  ## IP address         read -p  "Please  Insert Into Your Name Server IP ADDress:" IP         echo $IP |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"         while         [ "$?" -ne "0" ]          do          read -p  "Please  reInsert Into Your Name Server IP ADDress:" IP         echo $IP |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"        done         ARPA_IP=`echo $IP|awk -F. '{print $3"."$2"."$1}'`         ARPA_IP1=`echo $IP|awk -F. '{print $4}'`         cd  $BND_ETC         grep  "$NAME" named.rfc1912.zones  if           [ $? -eq 0 ];then           echo "The $NAME IS exist named.rfc1912.zones conf ,please exit ..."           exit  else          read -p  "Please  Insert Into SLAVE Name Server IP ADDress:" SLAVE          echo $SLAVE |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"          while          [ "$?" -ne "0" ]          do          read -p  "Please  Insert Into SLAVE Name Server IP ADDress:" SLAVE          echo $SLAVE |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"          done          grep  "rev" named.rfc1912.zones         if           [ $? -ne 0 ];then         cat >>named.rfc1912.zones <<EOF  #`date +%Y-%m-%d` Add $NAME CONFIG  zone "$NAME" IN {          type master;          file "$NAME.zone";          allow-transfer { $SLAVE; };          also-notify { $SLAVE; };          allow-update { none; };  };  zone "$ARPA_IP.in-addr.arpa" IN {          type master;          file "$ARPA_IP.rev";          allow-transfer { $SLAVE; };          also-notify { $SLAVE; };          allow-update { none; };  };  EOF        else         cat >>named.rfc1912.zones <<EOF  #`date +%Y-%m-%d` Add $NAME CONFIG  zone "$NAME" IN {          type master;          file "$NAME.zone";          allow-transfer { $SLAVE; };          also-notify { $SLAVE; };          allow-update { none; };  };  EOF      fi  fi         [ $? -eq 0 ]&& echo "The $NAME config name.rfc1912.zones success !"         sleep 3 ;echo "Please waiting config $NAME zone File ............."         cd  $BND_VAR         read -p "Please insert Name DNS A HOST ,EXample  www or mail :" HOST         read -p "Please insert Name DNS A NS IP ADDR ,EXample 192.168.111.130 :" IP_HOST         echo $IP_HOST |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"         ARPA_IP2=`echo $IP_HOST|awk -F. '{print $3"."$2"."$1}'`         ARPA_IP3=`echo $IP_HOST|awk -F. '{print $4}'`         while         [ "$?" -ne "0" ]  do         read -p "Please Reinsert Name DNS A IPADDRESS ,EXample 192.168.111.130 :" IP_HOST         echo $IP_HOST |egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"  done         cat >$NAME.zone <<EOF  \$TTL    86400  @               IN SOA  localhost.      root.localhost. (                                          43              ; serial (d. adams)                                          1H              ; refresh                                          15M             ; retry                                          1W              ; expiry                                          1D )            ; minimum                  IN  NS          $NAME.  EOF         REV=`ls  *.rev`         ls  *.rev >>/dev/null  if         [ $? -ne 0 ];then         cat >>$ARPA_IP.rev <<EOF  \$TTL    86400  @       IN      SOA     localhost.    root.localhost.  (                                        1997022703 ; Serial                                        28800      ; Refresh                                        14400      ; Retry                                        3600000    ; Expire                                        86400 )    ; Minimum              IN  NS  $NAME.  EOF          echo  "$HOST             IN  A           $IP_HOST" >>$NAME.zone          echo  "$ARPA_IP3         IN  PTR         $HOST.$NAME." >>$ARPA_IP.rev          [ $? -eq 0 ]&& echo -e "The $NAME config success:\n$HOST       IN  A           $IP_HOST\n$ARPA_IP3         IN  PTR         $HOST.$NAME."  else          sed -i  "9a IN  NS  $NAME." $REV          echo  "$HOST             IN  A           $IP_HOST" >>$NAME.zone          echo  "$ARPA_IP3         IN  PTR         $HOST.$NAME." >>$REV          [ $? -eq 0 ]&& echo -e "The $NAME config success1:\n$HOST       IN  A           $IP_HOST\n$ARPA_IP3         IN  PTR         $HOST.$NAME."  fi  }  ##Define Shell List A Function  Add_A_List ()  {  if         cd  $BND_VAR         REV=`ls  *.rev`         read -p  "Please  Insert Into Your Add Name ,Example 51cto.com :" NAME         [ ! -e "$NAME.zone" ];then         echo "The $NAME.zone File is not exist ,Please ADD $NAME.zone File :"         Add_named ;  else         read -p "Please Enter List Name A NS File ,Example /tmp/name_list.txt: " FILE      if         [ -e $FILE ];then         for i in  `cat $FILEawk '{print $2}'sed "s/$NAME//g"sed 's/\.$//g'`         #for i in  `cat $FILEawk '{print $1}'sed "s/$NAME//g"sed 's/\.$//g'`  do         j=`awk -v I="$i.$NAME" '{if(I==$2)print $1}' $FILE`         echo -----------------------------------------------------------         echo "The $NAME.zone File is exist ,Please Enter insert NAME HOST ...."         sleep 1         ARPA_IP=`echo $jawk -F. '{print $3"."$2"."$1}'`         ARPA_IP2=`echo $jawk -F. '{print $4}'`         echo  "$i             IN  A           $j" >>$NAME.zone         echo  "$ARPA_IP2      IN  PTR      $i.$NAME." >>$REV         [ $? -eq 0 ]&& echo -e "The $NAME config success:\n$i      IN  A           $j\n$ARPA_IP2         IN  PTR         $i.$NAME."  done       else         echo "The $FILE List File IS Not Exist .......,Please exit ..."       fi  fi  }  ##Define Shell Select Menu  PS3="Please select Menu Name Config: "  select i in "自动安装Bind服务"  "自动初始化Bind配置" "添加解析域名"  "批量添加A记录"  do  case   $i   in         "自动安装Bind服务")         Install  ;;         "自动初始化Bind配置")         Init_Config  ;;         "添加解析域名")         Add_named  ;;         "批量添加A记录")         Add_A_List  ;;         * )         echo -----------------------------------------------------         sleep 1         echo "Please exec: sh  $0  { Install(1)  or Init_Config(2) or Add_named(3) or Add_config_A(4) }"  ;;  esac  done  

本文参考如下文章,非常感谢,欢迎交流、转载!

http://blog.csdn.net/crazw/article/details/8986

redhat linux 6中setroubleshoot 与 audit 关系  阅读原文»

redhat linux 6中setroubleshoot 与 audit 关系

最近在看Linux selinux 对于setroubleshoot与audit不是十分理解。找到如下官方解释

https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Security-Enhanced_Linux/index.html#sect-Security-Enhanced_Linux-Working_with_SELinux-Which_Log_File_is_Used

根据说明,在redhat 6中,retroubleshoot不再作为一个单独的服务,而是分为两个进程,同时,只要在开机加载过程中,如果使用了selinux,安装了retroubleshoot,那么就会自动启动两个进程:seapplet与sedispatch。作用如下:

sedispatch runs as part of the audit subsystem, and via dbus, sends a message when an AVC denial occurs, which will go straight to setroubleshootd if it is already running, or it will start setroubleshootd if it is not running. seapplet is a tool which runs in the system's toolbar, waiting for dbus messages in setroubleshootd, and will launch the notification bubble, allowing the user to review the denial.

根据上面所说,做如下测试。

首先启动selinux,安装setroubleshoot

然后查看状态

[root@localhost ~]# getenforce

Enforcing

[root@localhost ~]# service auditd status

auditd (pid 1222) is running...

可以看到现在selinux与auditd都是启动状态,打开两个终端,然后分别查看messages与audit.log

现在要做的实验是使用ftp服务器,说下实验流程。当安装ftp之后,创建新用户,然后在一个客户端登录该用户。正常情况下,当使用正确用户名与密码登录之后,ftp默认登入位置为当前用户的家目录。可是在selinux中有设置,是不允许客户进入家目录,这时登录成功之后,审计就会在日志中写入,而setroubleshoot则会抓去日志,进行分析,然后给用户一个解决方案。下面来验证这个过程

由于开始时我安装的操作系统是最小化安装。所以需要进行如下操作

[root@localhost ~]# yum -y install vsftpd

[root@localhost ~]# yum -y install setroubleshoot*

[root@localhost ~]# yum -y groupinstall "X Window System"

[root@localhost ~]# yum -y groupinstall "KDE Desktop"

注意:在上面安装过程中,在安装setroubleshoot之后,使用ps aux | grep seapplet,发现没有此进程不需要担心。seapplest与sedispatch在安装X11与桌面管理器KDE之后重新启动就会出现。个人感觉应该是setroubleshoot必须有桌面支持。OK,继续看。

[root@localhost ~]# ps aux | grep sedispatch | grep -v grep

root 1236 0.0 0.0 21200 1140 ? S< 11:28 0:00 /usr/sbin/sedispatch

[root@localhost ~]# ps aux | grep seapplet | grep -v grep

root 2494 0.0 0.3 217800 7208 ? S 12:43 0:00 /usr/bin/seapplet

步骤一:安装vsftpd 安装步骤略过,安装结束之后直接启动vsftpd,不需要做任何更改

步骤二:创建新用户 步骤略过

步骤三:开始监控setroubleshoot日志----messages 与auditd日志-----audit.log,建议使用tailf

步骤四:在客户端使用ftp登录,输入刚刚建立的用户名与密码,是正确的。

步骤五:查看是否日志有变动。看如下截图

clip_image002

操作之前

clip_image004

操作之后,大家可以根据日志信息来进行分析,我用的是KDE桌面

clip_image006

大家可以看到,根据信息,明确能够了解出现问题的原因,正常情况下,会桌面上出现一个五角星标志

clip_image008

下面大家来看看上面两个日志是否有区别:

audit.log

type=AVC msg=audit(1377664273.274:36): avc: denied { search } for pid=2117 comm="vsftpd" name="/" dev=dm-2 ino=2 scontext=unconfined_u:system_r:ftpd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:home_root_t:s0 tclass=dir

type=SYSCALL msg=audit(1377664273.274:36): arch=c000003e syscall=80 success=no exit=-13 a0=7fe0a273afe0 a1=1f4 a2=0 a3=7fffa8c137e0 items=0 ppid=2112 pid=2117 auid=0 uid=0 gid=0 euid=500 suid=500 fsuid=500 egid=500 sgid=500 fsgid=500 tty=(none) ses=1 comm="vsftpd" exe="/usr/sbin/vsftpd" subj=unconfined_u:system_r:ftpd_t:s0-s0:c0.c1023 key=(null)

可以看到 type=AVC标志。而再来看setroubleshoot

Aug 28 12:39:26 localhost setroubleshoot: SELinux is preventing /usr/sbin/vsftpd from search access on the directory /home. For complete SELinux messages. run sealert -l 30972dbc-350e-4f82-9044-a8ffafd9e31c

在setroubleshoot中,能够看到前面localhost主机名之后的setroubleshoot,证明是由setroubleshoot来整理写入。根据上面红色字体部分,我们执行一下看看结果

SELinux is preventing /usr/sbin/vsftpd from search access on the directory /home.

***** Plugin catchall_boolean (47.5 confidence) suggests *******************

If you want to allow ftp servers to login to local users and read/write all files on the system, governed by DAC.

Then you must tell SELinux about this by enabling the 'allow_ftpd_full_access'boolean.

Do

setsebool -P allow_ftpd_full_access 1

***** Plugin catchall_boolean (47.5 confidence) suggests *******************

If you want to allow ftp to read and write files in the user home directories

阅读更多内容

SQLSERVER用无中生有的思想来替代游标 - 桦仔

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
SQLSERVER用无中生有的思想来替代游标 - 桦仔  阅读原文»

SQLSERVER用无中生有的思想来替代游标

昨天在MSDN论坛看到一个帖子,帖子中LZ需要根据某列的值把其他列的值插入到额外列

帖子地址:http://social.technet.microsoft.com/Forums/zh-CN/3eac78ca-d071-4c00-afa0-ef48c8501745/sql-statementcolumn-namecolumnsql-


建表脚本

1 USE tempdb
2 GO
3
4 --建表
5 CREATE TABLE t1
6 (
7 client VARCHAR(10) ,
8 pay_level INT ,
9 pay_lv_1 INT ,
10 pay_lv_2 INT ,
11 pay_lv_3 INT ,
12 pay_lv_4 INT ,
13 pay_lv_5 INT ,
14 pay_lv_6 INT ,
15 pay_lv_7 INT ,
16 pay_lv_8 INT ,
17 pay_lv_9 INT ,
18 pay_lv_10 INT ,
19 pay_lv_11 INT ,
20 pay_lv_12 INT ,
21 pay_lv_13 INT ,
22 pay_lv_14 INT ,
23 pay_lv_15 INT ,
24 pay_lv_16 INT ,
25 pay_lv_17 INT ,
26 pay_lv_18 INT ,
27 pay_lv_19 INT ,
28 pay_lv_20 INT ,
29 pay_lv_21 INT ,
30 pay_lv_22 INT ,
31 pay_lv_23 INT ,
32 pay_lv_24 INT ,
33 pay_lv_25 INT,
34 );
35
36
37 --插入测试数据
38 DECLARE @i INT
39 SET @i = 1
40 WHILE @i < 8
41 BEGIN
42 INSERT INTO t1 ( client, pay_level, pay_lv_1, pay_lv_2, pay_lv_3,
43 pay_lv_4, pay_lv_5, pay_lv_6, pay_lv_7, pay_lv_8,
44 pay_lv_9, pay_lv_10, pay_lv_11, pay_lv_12,
45 pay_lv_13, pay_lv_14, pay_lv_15, pay_lv_16,
46 pay_lv_17, pay_lv_18, pay_lv_19, pay_lv_20,
47 pay_lv_21, pay_lv_22, pay_lv_23, pay_lv_24,
48 pay_lv_25 )
49 SELECT 'client' + CAST(@i AS VARCHAR(10)),
50 ( 20 + 1 ) * RAND(), ( 20 + 1 ) * RAND(),
51 ( 20 + 1 ) * RAND(), ( 20 + 1 ) * RAND(),
52 ( 20 + 1 ) * RAND(), ( 20 + 1 ) * RAND(),
53 ( 20 + 1 ) * RAND(), ( 20 + 前端异步解决方案――mmDeferred - 司徒正美  阅读原文»

Deferred是前端解决异步操作的一种编程范式,后来出现的Promise规范更是让其普适性大大提高。不过Promise规范也存在分岐。现在最流行的是Promise/A规范。

Promise/A大致是这样的:一个带有then方法的对象,它拥有三个状态,pending,fulfilled, rejected。一开始是pending,执行then 方法后,当其回调被执行,会进入fulfiled或rejected状态。

then方法可传入两个函数,一个是成功时执行,一个是失败时执行,分别叫做onFulfilled, onRejected。then还有第3个参数叫做onNotify,它不会改变对象的状态。这三个函数都是可选的,非函数时会被忽略掉。

乍一看,没什么。主菜在后面。then方法在添加了onFufilled或onRejected会返回一个新的Promise对象。这样一来,就能形成一个Promise链。

显然,jQuery Deferred并不满足后面的那个条件。

后来人们在Promose/A那粗糙的准则上添加更多的细节,形成了Promise/A+, http://promises-aplus.github.io/promises-spec/,重点见Requirements与Notes。

Notes还着重提到为了防止Promise链还没有形成就被用户触发回调,强烈要求使用setTimeout,setImmediate,process.nextTick等异步API来提供回够的构建时间。这思路其实与著名的JSDeferred如出一辙,或者它本来就是从JSDeferred那里剽来的。

此外,大家在实现Promise/A+时,渐渐达成一些共识,添加了all, any等方法,来并归结果或处理竞态状态。现在市面上有三大Promise/A+库,Q, RSVP , when。其中,Q的微缩版被整进angular.js, RSVP 被整进ember.js ,angular, ember 我后面会重点介绍,都是著名的MVVM库。微软出品的WinJs MVVM框架,也内置一个Promise模块。

jQuery Deferred虽然不标准,但它的出现已表明Deferred/Promise这种异步范式的重要了。

随着avalon"王的三柱臣"之一mmRequest工作的展开,我需要一个更精致的底层异步库。这就是mmDeferred的由来。

现在mmDeferred放在github上,拥有完整的示例与API文档,欢迎大家关注与fork

https://github.com/RubyLouvre/mmDeferred

有关异步库的重要性,可以看我以前写的两篇文章:

javascript 异步编程

javascript 异步编程2

或看屈屈写的这篇文章,是介绍when.js的应用的。

异步编程:When.js快速上手

由于Deferred是如此重要的,ecma262下一版已提议内置此对象了,详见这里

strawman:deferred_functions


本文链接:http://www.cnblogs.com/rubylouvre/p/3290833.html,转载请注明。

阅读更多内容

2013年8月27日星期二

Web服务器配置解析

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Web服务器配置解析  阅读原文»

Web服务器配置解析

Web服务器概述

Web服务器也称WWW服务器,主要功能是提供网上信息浏览服务。WWW采用的是客户端/服务器端结构,其作用是整理和储存各种WWW资源,并响应客户端软件的请求,把客户所需的资源传送到客户端的机器上并显示出来。

HTTP协议简介

HTTP(HyperText Transfer Prototcol,超文本传输协议)是Internet上应用最为广泛的一种网络协议,所有的www文件都必须遵循这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。

HTTP事务:一个HTTP事务即客户端发出一个"HTTP请求"命令和服务器回复"HTTP响应"结果的过程。"HTTP请求"和"HTTP响应"均为格式化的数据块,它们被称作HTTP报文。

HTTP方法:HTTP协议支持多个不同的请求命令,这些请求命令称作HTTP方法。每个HTTP请求报文都必须指定其请求方法,用于通知服务器进行什么样的响应动作。常见的HTTP方法有GET、HEAD、POST、PUT、DELETE、OPTIONS、TRACE等。

(1)OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,也可利用向web服务器发送"*"的请求来测试服务器的功能性。

(2)HEAD:这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。

(3)GET:向特定的资源发送请求。

(4)POST:向指定的资源提交数据进行处理请求(比如提交表单等)。数据被包含在请求体中。这种请求可能会导致新的资源的建立或已有资源的修改。

(5)PUT:向指定资源位置上传其最新内容。

(6)DELETE:删除指定资源

(7)TRACE:回显服务器收到的请求。

HTTP的响应码:HTTP服务器回应客户端状态码主要有一下几个:

1xx: 信息性状态码,这一类状态码代表请求已被接受,需要继续处理。

100:客户端应当继续发送请求。这个临时响应用来通知客户端部分请求已被接受请继续发送请求信息。

101:服务器已经理解了客户端的请求,并将通知客户端采用不同的协议来完成这个请求。

2xx: 成功状态码

200:OK:请求已成功,请求所希望的响应头或数据体将随此响应返回。

3xx: 重定向状态码

301:永久重定向,也就是说被请求的资源已永久移动到新位置; Location响应首部的值仍为当前URL,因此为隐藏重定向;

302:临时重定向,也就是说请求的资源现在临时从不同的URL响应请求;又称显式重定向, Location响应首部的值为新的URL喔。

304:Not Modified如果客户端发送了一个带条件的GET请求且该请求已被允许,而文档中的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态吗。

4xx: 客户端错误状态码

404:Not Found请求失败,请求所希望得到的资源未被在服务器上发现,一般这个状态码被广泛应用于当前服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。

5xx: 我的监理生活阶段性总结  阅读原文»

我的监理生活阶段性总结

最近我离开了一家监理公司,加盟了北京肯思捷信息系统咨询有限公司,实际上也是转了一圈,又回到创业之初的监理公司,在很多家监理公司的工作,让我感想很深,也很想做一下阶段性总结,给参与信息系统工程监理的同行分享一下工作经历,希望能够给大家有一点儿借鉴意义。

我是通过参加建设工程监理培训后,才发现自己可以通过从事工程监理来延长自己的职业生命,于是针对自己的职业生涯进行重新规划,恰巧这时候公司在监理业务上,连续接到了几个合同,并成立了肯思捷监理部门,于是就开始了IT监理职业生涯。

我的信息系统工程监理理论,是借鉴了建设工程监理的理论,不断地在信息系统工程监理的实践中总结出来的。在2003年参加了北京市信息系统工程监理规范的编制工作,也有了机会对自己的监理理论进行了一次总结,也第一次有了监理工作规范。

2003年的一次项目机会,使我有机会在广州成立分公司,也让我有机会独立开展市场推广和学习分公司管理,也让我在团队管理和信息化监理推广有了更大的进步。近6年的分公司管理和市场推广实践,让我在信息系统工程监理的理论和实践经验得到更多的积累,在2008年参与了《信息系统工程监理质量控制实务》一书的编制。

在被调回到北京总部后,20103月离开了原来的公司,从而有机会了解其他监理公司的管理,无论是在团队管理和市场营销等方面也接触了更多的理念,但在总结了这些公司管理的优缺点之后,我发现,需要找一个立足于信息系统工程监理长远发展的公司,也想通过一家公司来实现自己的监理生涯理想,真正能够诚信地将信息系统工程监理进行到底。

在加盟北京肯思捷信息系统咨询公司前,我也接触了几家公司,通过综合考虑才做出这个决定的。肯思捷监理经过了近15年的发展,有着丰富的底蕴,虽然经历了改制和股份变更的冲击,业务处于低谷期,但在监理服务执行理念上,仍然本着诚信和守法等原则,在技术层面上,有一些资深的高级监理人员还留在公司,也能给我发挥团队管理和市场推广经验提供一个很好地平台。

虽然刚刚加盟1个月,但我有信心通过公司管理团队的努力,能够带领肯思捷走出低谷,将公司建设成为更有竞争力,得到客户广泛认可的监理公司。坚信诚信监理,一定能将信息化监理事业进行到底。

本文出自 "焦庆武的监理生活" 博客,请务必保留此出处http://jiaoqw.blog.51cto.com/613313/1282869

分享至 一键收藏,随时查看,分享好友!
昵称:
登录快速注册
内容:

阅读更多内容

SVN版本管理教程 - 善小书

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
SVN版本管理教程 - 善小书  阅读原文»

1、 先上SVN for Eclipse的地址

http://subclipse.tigris.org/update_1.8.x

2、 将项目添加到SVN服务器

右击项目—> Team —> Share Project….
选择SVN —> Next
谈谈Javascript的this关键字(this is not this) - know@more  阅读原文»

 前言

    看文章标题你就知道,这篇文章我只讲一个简单的Javascript的this关键字,说它简单——它又不简单,因为曾几何时我也对this关键字有些困惑,它也确实会让不少程序员感到不解——它像是一个身份多变的“指针”,有时仅看代码都很难分辨出其当前所指向的对象;恰好这两天我突然想到应该写篇关于Javascript方面的博客,也算是为以后的公司技术培训做点儿准备。这篇文章,我可能更倾向于,用代码来直接的体现我要描述的内容。好的文章不在于它的篇幅长、内容丰富,而在于或者说更重要的是——应该用言简意赅的内容让读者快速、没有歧义的明白你所要讲解的内容;而对于技术文章,代码往往就是最好的描述。好了,直接切入正题...

  

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2 <html xmlns="http://www.w3.org/1999/xhtml">
3 <head>
4 <title></title>
5 <script src="jquery.js" type="text/javascript"></script>
6 </head>
7 <body>
8 <input id="btnTest" type="button" value="Test" /><br />
9 <input id="btnTest2" type="button" value="Test2" /><br />
10 <input id="btnFun" type="button" value="Inner Fun" onclick="this.value=new Date().getSeconds();alert(this);" /><br />
11 <script type="text/javascript">
12 //#region 全局this对象,即可以通过this访问到当前页面中的所有(标签或jquery等)对象,此this没有什么实际意义,也很少会这样使用
13 this.$.trim();
14 alert(this.btnFun);
15 alert(this.window.location);
16 //

2013年8月26日星期一

Java读取本地文件,并显示在JSP文件中

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Java读取本地文件,并显示在JSP文件中  阅读原文»

Java读取本地文件,并显示在JSP文件中

当我们初学IMG标签时,我们知道通过设置img标签的src属性,能够在页面中显示想要展示的图片。其中src的值,可以是磁盘目录上的绝对,也可以是项目下的相对路径,还可以是网络上的图片路径。在存取少量图片的情况下,采用相对路径存储图片的情况下最方便,也最实用。但是当图片数量过多时,这种方式就显的有些掣肘了。

当系统的图片数量过多时,如果仍把这些图片当做项目的一部分去发布,势必会大大延长项目的发布时间及更新时间。对于某些对于时限性要求特别高的系统来说,采用相对路径存储图片就是不可取的。特别是系统发布补丁时,只能采用增量的方式去更新系统。如果采用覆盖的方式发布系统,就可能会造成系统图片文件的丢失。

基于以上种种原因,很多系统会把大量的图片存在服务器的固定目录下,这样搭建集群环境时,就能访问公共的资源,避免对硬盘空间的浪费,但是问题也就在这里出现了。我们发布好的系统访问磁盘上的固定目录下的图片时,出现了没有权限访问的提示。系统为了保证本地安全,不允许直接访问图片。

咋一看,上面的问题有的不可思议。但仔细想想,系统这么做,也确实有道理的。在服务器上,部署了很多个系统应用。不可能有一个系统的访问权限,就可以随随便便的访问磁盘上的文件。事实上,服务器上的系统是有权限读取其它磁盘路径下的文件,只是没有办法让它显示而已。

要解决上面的问题,我们可以使用流的方式把图片读取出来,然后再输出显示到HTML页面中。f废话了半天,下面关键的实现代码:

JSP页面的展示代码:

<img name="person.personImg" id="personImg" alt="头像照片" src="${person.personImg}" style="width:160px;height:160px;border:1px solid" />
<button id="btnImg" class="btn btn-primary" type="button" title="上传图片" $(function() {
if($("#oid").val()!=="")
$("#personImg").attr("src","favccxx/person/loadUserPhoto?externalPerson.oid="+$("#oid").val()+"&Time="+(new Date().getTime()));
$("#personImg").css("display","");
$("#btnImg").css("display","");
$("#personImg").css("display","none");
$("#btnImg").css("display","none");

采用Struts2框架的java代码:

@Action(value = "loadUserPhoto", results = { @Result(name = "success", type = "stream", params = {
"contentType", "image/jpeg", "inputName", "imageStream" }) })
public String getImage() {
if (person.getOid() != null) {
Person person = personService.findOne("oid", externalPerson.getOid());
FileInputStream is = new FileInputStream(person.getPersonImg());
imageStream = new BufferedInputStream(new FileInputStream(person.getPersonImg()));
} catch (Exception e) {

本文出自 "尘风随影的天空" 博客,请务必保留此出处http://genuinecx.blog.51cto.com/2890523/1282451

分享至 一键收藏,随时查看,分享好友!
昵称:
登录快速注册
内容:
返回顶部

阅读更多内容