•     很多时候,我们在系统的数据库设计的时候,可能设计一些自关联的层次结构,比如组织结构这样的层次。比如A是B的上级,B是C的上级。C又是D的上线。我们想一次查出A下面所有的直接和间接下属,包括B,C,D。那我们在这种场景下面就要用到层次查询语句了。

    我们假设表结构如下 :

    表名:test

    字段:

     id 本身的编号

    pid 上级编号

     

    oracle 早就提供了实现以上功能的SQL语句方式如下:

      select id,pid form test start with pid='a' connect by prior pid=id

    sqlserver 从2005 开始提供with 语句提供类似以上功能的支持如下:

      with temp(id,pid) as (

           select id,pid from test where id='a'   --这里是查询出基点成员,就是指查询出父级的记录,从这个点开始

            union all

            -- 递归成员,通过引用CTE自身与test 基表JOIN实现递归

            select id,pid form test  t JOIN temp d ON t.pid=d.id)

    select * from temp
      通过以上语句也能够实现层级查询的结构出来。

     

  • JavaScript闭包的概念虽然网上有大把的文章在介绍,但是基本上大多数文章都是很学术性的,说实话,看起来有点小晕。
    下面是我自已在JavaScript闭包这个概念上的一些小总结,虽然深度不及学术性的文章的介绍,但是能够让你很快了解闭包的概念

    所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
    这是官方给出的闭包的定义。看上去可能有点晕,我们可以先不看这个定义。先初步了解一下。
    先来一个闭包的例子:
    function A(){
        var i=0;
     function B(){
      alert(++i);
     }
     return B;
              }
     var C=A();
     alert(C());
    如上代码,其实就是闭包,其实可能我们早就在工作中用到了,只是我们不知道这就是闭包而已。
    所以我理解的闭包概念如下:
    所谓闭包简单的来说就是充许内部函数(即函数的定义和函数的表达式)位于另一个函数的函数体内,表而内部函数可以访问它们所在的外部函数中所声明的
    变量,参数,和声明的其它的内部函数。当这样一个内部函数在它的外部函数之外的地方调用就形成了闭包。内部函数是在外部函数
    返回会执行。而这个内部函数返回后还需要访问外部函数的成员。这样会保证外部函数不会被GC给回收掉。
    闭包的作用
     1,封装,包装的功能 有时候我们某些变量可能不允许直接访问。可以通过闭包来提供接口来进行这些变量的操作。
     2,保证父函数不被GC回收 这个上面有说到
     3.为函数引用设置延时 比如我们有时候某个fucntion的引用可能需要延时执行。那我们可以使用闭包,返回子函数的引用。然后用settimeout来延时执行。
     4,其它作用 可以参考相关文档。


     闭包需要正确的使用,如果使用不当将会引发一系列问题,比如:我们使用闭包
     让外部函数和内部函数相互相引用的话,按照JavaScript来说当外部函数和内部函数相互引用时,但没有第三者引用,这个时候GC会自动回收该两个对象的内存。但在IE下有一个BUG。当使用DOM和ActiveX 对象是,内存不会被释放,会导致IE崩溃。
    所以多加注意可以避免形成循环引用,而在无法避免时,也可以使用补偿的方法,比如使用 IE 的 onunload 事件来来清空(null)事件处理函数的引用。时刻意识到这个问题并理解闭包的工作机制是在 IE 中避免此类问题的关键。

     PS:以上为个人所理解的JavaScript闭包的概念,难免有偏颇之处,如果有不适当的地方或者有错误的地方,请留言/评论告诉我或者发邮件给我。谢谢!
     同时提供官方学术性的对闭包的介绍,请点击这个链接:http://www.cn-cuckoo.com/wordpress/wp-content/uploads/2007/08/JavaScriptClosures.html#clClose

  • 闲着无事,在ubuntu下搭建了个LAMP服务,具体过程如下,记录一下,以供以后参考:

    我的ubuntu 版本是9.04

    安装apache

    sudo apt-get install apache2

    安装完成后。apache默认会有一个web目录,我们需要将目录指定到我们自已自定义的目录下面。

    执行 sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/hnyangfei

    以上命令假设我们的web应用的叫hnyangfei

    然后我们用vim修改hnyangfei 这个站点的配置。

    sudo vim /etc/apache2/sites-available/hnyanfei

    将文件中的DocumentRoot 的属性修改为你要指定的web目录并将Directory 也同样修改为你要指定的目录。假设我们的目录为/home/yangfei/www 修改后的文件片段因该是如下:

    <VirtualHost *:80>
    ServerAdmin webmaster@localhost

    DocumentRoot /home/yangfei/www
    <Directory />
    Options FollowSymLinks
    AllowOverride None
    </Directory>
    <Directory /home/yangfei/www>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
    </Directory>

    然后保存文件,当然如果有需要。你可以将errlog等 也可以修改为你指定的目录。

    接下来我们要激活我们的站点。撤销之前的默认站点。采用如下命令

    sudo a2disste default && sudo a2enable hnyangfei

    执行完成后。输入命令重启Apache

    sudo /etc/init.d/apache2 restart

    这时候,如果你没有在/home/yangfei目录下创建www目录,或者www目录里面没有

    文件,你将会收到一个警告的信息。

    接下来你可以在www目录下面建立一个index.html页面,在地址栏输入:http://localhost 你将会看到你index.html的内容

    安装PHP5

    输入sudo apt-get install php5

    安装完成后。输入上面的重启apache的命令。编写一个php文件放入到www目录下,输入地址访问,如果弹出下载的框可以尝试一下刷新一下浏览器的缓存即可。

    如果需要增加PHP用于脚本的内存限量。可以编辑/etc/php5/apache2/php.ini文件,增加memory_limit的值即可。

    安装mysql 有时间抽空再另写一篇来记录。同时您 也可以google一下。基本上 sudo apt-get mysql-server即可。

  •      最近Internet上炒得很热的memached系统是由Danga Interactive开发的一个分布式,高性能的内存对象缓存系统,主要用来分担数据库的压力和提高系统的访问能力。

       memcached实际上是在内存中缓存了一张巨大的hash表,memcached在运行时可以用它来存放各种数据,包括视频,声音,大文件,数据库检索结果等 。

      memcached 非常快,它使用了libevent(如果可以的话,在linux下使用epoll)来均衡任何数量的打开链接,使用非阻塞的网络I/O,对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态), 使用自己的页块分配器和哈希表, 因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1).。

     它的特点就是memcached是分布式的,它解决了共享内存只能单机应用的局限。

     使用方法:

      1,首先从memcached网站下载最新版的memcached源码包,同时去libevent下载最新的libevent源码。

      2,解压下载回来的两个包。

      3,由于memcached需要使用libevent我们需要首先安装libevent

           cd libevent

           ./configure --prefix=/usr

           make

           sudo make install (这一步必需要用sudo 执行,否则会因为没有权限而报错,因为在编译过程中需要新建目录)

    如果中间有报错,请参照错误信息来配置或者增加需要的库。

      检测libevent 安装是否成功,输入:# ls -al /usr/lib | grep libevent  会出现如下结果(不同的机器可能有不同的输出):

       yangfei@yangfei-laptop:~$ ls -al /usr/lib |grep libevent
    lrwxrwxrwx   1 root    root          21 2009-07-19 08:45 libevent-1.4.so.2 -> libevent-1.4.so.2.1.3
    -rwxr-xr-x   1 root    root      301588 2009-07-19 08:45 libevent-1.4.so.2.1.3
    -rw-r--r--   1 root    root      386638 2009-07-19 08:45 libevent.a
    lrwxrwxrwx   1 root    root          26 2009-07-19 08:45 libevent_core-1.4.so.2 -> libevent_core-1.4.so.2.1.3
    -rwxr-xr-x   1 root    root      115721 2009-07-19 08:45 libevent_core-1.4.so.2.1.3
    -rw-r--r--   1 root    root      151618 2009-07-19 08:45 libevent_core.a
    -rwxr-xr-x   1 root    root         860 2009-07-19 08:45 libevent_core.la
    lrwxrwxrwx   1 root    root          26 2009-07-19 08:45 libevent_core.so -> libevent_core-1.4.so.2.1.3
    lrwxrwxrwx   1 root    root          27 2009-07-19 08:45 libevent_extra-1.4.so.2 -> libevent_extra-1.4.so.2.1.3
    -rwxr-xr-x   1 root    root      239933 2009-07-19 08:45 libevent_extra-1.4.so.2.1.3
    -rw-r--r--   1 root    root      298406 2009-07-19 08:45 libevent_extra.a
    -rwxr-xr-x   1 root    root         867 2009-07-19 08:45 libevent_extra.la
    lrwxrwxrwx   1 root    root          27 2009-07-19 08:45 libevent_extra.so -> libevent_extra-1.4.so.2.1.3
    -rwxr-xr-x   1 root    root         825 2009-07-19 08:45 libevent.la
    lrwxrwxrwx   1 root    root          21 2009-07-19 08:45 libevent.so -> libevent-1.4.so.2.1.3

    4,接下来安装memcached

        cd memcached

       ./configure --with-libevent=/usr

       make

       sudo make install ()  (这一步必需要用sudo 执行,否则会因为没有权限而报错,因为在编译过程中需要新建目录)

    如果中间有报错,请参照错误信息来配置或者增加需要的库。

      检查memcached 是否安装成功(不同机器可能输出不同): s -al /usr/local/bin/mem*

      yangfei@yangfei-laptop:~$ ls -al /usr/local/bin/mem*
    -rwxr-xr-x 1 root root 210268 2009-07-19 08:46 /usr/local/bin/memcached

    至此安装已经完成。

    下面我们通过命令启动memcached

       /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.67 -p 20000 -c 256 -P tmp/memcached.pid
      -d 代表启动一个守护进程,-m 是分配给memcached的内存 单位是MB,-u 是代表启动memcached的用户,-l是监听的服务器的地址(也可以在程序中增加,维护) -p 是端口号 ,-c 是运行时最大的并发连接数 默认是1024 -P是设置保存memcached的pid文件。更多的参数。你可以通过memcached -h 来查看。

     启动完成后,你可以使用telnet 来查看当前memcached的运行状态。命令:telnet 192.168.0.56 20000

    yangfei@yangfei-laptop:~$ telnet 192.168.0.67 20000
    Trying 192.168.0.67...
    Connected to 192.168.0.67.
    Escape character is '^]'.

    摸黑输入stats 就会打印出目前memcached的服务器状态。uptime 是memcached运行的秒数,cmd_get是查询缓存的次数。这两个数据相除一下就能得到平均每秒请求缓存的次数。其它状态的含义可以查找相关文档,不一一列出。

    如果要关掉memcached服务可以使用:killall -9 memcached

    然后你就可以下载xmemcached 客户端来在java中使用memcached,写了一个简单的示例如下:

    import java.io.IOException;

    import net.rubyeye.xmemcached.MemcachedClient;
    import net.rubyeye.xmemcached.XMemcachedClient;

    public class MemCachedDemo {
        public static void main(String[] args) {
            try {
                MemcachedClient client=new XMemcachedClient("192.168.0.67",20000);
                client.set("key", 20, "object");
                System.out.println(client.get("key"));
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           
        }
    }

    xmemcached是由Dennis基于memcached Client API开发的java的Client API.项目地址为:http://code.google.com/p/xmemcached/  具体使用方法可以参照项目wiki中的示例和文档。注意最新版的client api是基于JDK1.6


     

  •  

     继承:是指一个类(子类) 通过承另外一个类(父类)的功能,并增加自已新的能力。是is-a 的关系

     组合:部分与整体的关系,但是整体消失后,部分将也变得没有意义。拥有共同的生命周期 contains-a 的关系

     聚合:部分与整体的关系,但是部分能够独立存在,即使整体消失后,部分也可以独立存在,has-a 的关系

    关联:是指模型元素中的一种语义关系,是类与类之前很弱的联系,关联可以有方向,可以单向关联,也可以双向

     

  • sqlserver 传统的分页方式是采用top的方式来进行分页,效果和效率一至不怎么样。在SQL2005中MS增加了一个新的函数功能 row_number() over() 该功能能够象oracle中的rownumber一样产生一个标识的数字。从而我们来进行分页会简单得多,效率也会高很多,具体的SQL语句如下:

    select * from (select row_number() over (order by buid) as seq,* from T_BusinessUnit) t where t.seq<10

  • 对修改关闭,对扩展开放

    使用面对接口编程

    尽可能用组合,聚合。少用继承

    任何基类出现的地方都可以用子类实现

  • 2009-07-04

    一种精神 - [胡言乱语]

      这是泰国人拍的潘婷的商业广告,可是在我看来这个小片子完全超越了广告的那种情境,第一次看到它的时候,眼角竟然有一些泪水飚出。

      这个小片子讲述了一个听力尽失的小女孩,在周围的人不理解与瞧不起的情况下,经过自已的努力最终取得成功的小故事。故事讲述的很有说服力,起码能够震撼到我自已。

      而我们呢?拥有着比这个小女孩好N倍的环境,而我们在做着什么呢?而且我们还在不知羞愧的大声叫着 “环境,环境,我们没有好的环境,我没有别人那么好的天赋!”........

      无言,好好思考吧!

  • 2009-06-28

    奇怪的思绪 - [胡言乱语]

           最近一至想着上来更新一篇。其实可写的事情还是有些的比如facebook developer 大会,比如最近工作中的一些感悟,生活中的一些事,最近读的一些书。。。。等等。

          可是每每提笔写至三分之一,或是三分之二,但是却总是感觉不满意或者不适合出现在这样公共的场所上。于是便通篇删除,绞尽脑汁想理清一下头绪重新来过,可是却总归写不出来。只好做罢!

          最近生活有点茫然,连无头苍蝇都不如。起码它还能四处跳窜着。

          还有些删除了,罢了罢了!