凡东's profile凡东的共享空间PhotosBlogNetwork Tools Help

Blog


    October 22

    sim300收不到短信

    sim300经常出现收不到短信的情况,后来发现当程序读取短信时如果内容不是合法的,
    一般为空,后续的短信都收不到,移动也不会补发。这个信息的号码是10658154,问了移动的客服,
    说是彩信,那么说明接收彩信有问题,客服解释说有的手机需要设置,发送短信:
    手机厂商 手机型号 MMS,发送到10658200。而这个是gprs模块,不知是否可以。当出现这种收不
    到短信的情况时,把卡放到手机里删掉这条短信就可以了。
    October 21

    Java中的观察者模式(Observer)

    观察者模式理解为就是一个对象发生某种变化时,它的观察者做出相应的动作。观察者和被观察的对象之前建立关系。
     
    Java作为一种面向对象的开发语言,对实现设计模式提供了良好的支持,并且提供了许多默认的实现,比如:通过Java中的Observable类和Observer接口可以方便的实现观察者模式。

    下面我们就用一个实际的例子来说明:日常生活中说起观察者,最常见的例子可能就是天气预报,在这里我们的观察对象是地球,而我们是通过发射气象卫星这个观察者来检测地球气象变化的。

    所以这个例子中涉及三个对象:
    地球  (Earth):                                          被观察对象
    气象卫星(Satellite):                        观察者
    气象局(WeatherService):        客户端调用

    被观察对象:地球  (Earth)


     import    java.util.Observable;

     /**  */  /**  
     *  被观察对象:地球
     *  
     *    @author    zjun
     *    @version    1.0  create  on  2006-5-18  9:42:45
       */  
       public      class    Earth    extends    Observable      {
             private    String  weather    =      "  晴朗  "  ;

             /**  */  /**  
             *    @return    Returns  the  weather.
               */  
               public    String  getWeather()      {
                     return    weather;
           }  
     
               /**  */  /**  
             *    @param    weather
             *                        The  weather  to  set.
               */  
               public      void    setWeather(String  weather)      {
                     this  .weather    =    weather;
                     //    设置变化点  
                     setChanged();
                   notifyObservers(weather);
           }  
    }  
    [注意]  在需检测的对象前需要设置变化点setChanged()和通知观察者notifyObservers(),这两个函数是由Observable类实现的,封装了观察者模式实现的细节。

    观察者:气象卫星(Satellite)  

     import    java.util.Observable;
     import    java.util.Observer;

     /**  */  /**  
     *  观察对象:气象卫星
     *  
     *    @author    zjun
     *    @version    1.0  create  on  2006-5-18  9:46:30
       */  
       public      class    Satellite    implements    Observer      {
             private    String  weather;

             public      void    update(Observable  obj,  Object  arg)      {
                   weather    =    (String)  arg;
                     //    捕获天气变化情况,反馈给检测者  
                     System.out.println(  "  近期天气变化:  "      +    weather);
           }  
    }  
    客户端调用:气象局(WeatherService)  

       /**  */  /**  
     *  客户端调用:天气预报
     *  
     *    @author    zjun
     *    @version    1.0  create  on  2006-5-18  9:57:19
       */  
       public      class    WeatherService      {

             /**  */  /**  
             *    @param    args
               */  
               public      static      void    main(String[]  args)      {
                   Earth  earth    =      new    Earth();
                   
                   Satellite  satellite    =      new    Satellite();
                     //    发射气象卫星  
                     earth.addObserver(satellite);

                   System.out.println(  "  天气预报:  "  );
                   System.out.println(  "  ------------  "  );
                   earth.setWeather(  "  台风‘珍珠’逼近  "  );
                   earth.setWeather(  "  大到暴雨  "  );
                   earth.setWeather(  "  天气炎热  "  );
           }  
    }  
     
    [运行结果]  

     天气预报:
    ------------
    近期天气变化:台风‘珍珠’逼近
    近期天气变化:大到暴雨
    近期天气变化:天气炎热
    October 20

    使用Ubuntu搭建Web服务器(PHP)

     

    http://www.linuxidc.com/Linux/2008-07/14178p2.htm(zhuanzai)

    Apache 是一种功能强大的Web服务器。如今,Internet上无数运行在Linux上的Apache服务器正为Web世界的日益繁荣提供着有力的支撑。本文将向读者介绍如何在Ubuntu Linux系统迅速搭建Apache Web服务器。

      尽管Ubuntu 是一种新兴的Linux分支,但Ubuntu 组织却为Apache提供了丰富的支持软件,这些软件都可以从发行版的光盘获取,也可以从官方站点轻松下载。所以,Ubuntu非常适合作为Web服务器的平台。

    一、 安装Apache

      下面,我们首先介绍如何安装Apache。具体安装命令如下所示:

      $ sudo apt-get install apache2

      然后运行Apache,命令如下所示:

      $ sudo /etc/init.d/apache2 restart

      Apache在安装期间将会新建一个目录:/var/www,该目录是该服务器中存放文档的根目录。只要在浏览器的地址栏输入 http://localhost/ 或机器的IP地址就能访问放置在此目录中的所有文档。

      二、 安装PHP

      PHP是一种流行的服务器端脚本语言,一般与MySQL或 Postgres结合起来用于管理Web内容、blog和论坛。下面介绍其安装方法,其实它的安装也很简单,命令如下所示:

      $ sudo apt-get install libapache2-mod-php5

      重新启动 Apache 以加载上面安装的模块:

      $ sudo /etc/init.d/apache2 restart

      为了验证PHP模块是否正确加载,我们可以建立一个PHP文件,然后尝试通过Web服务器访问该文件。此外,我们知道PHP内建了一个phpinfo函数,该函数能够给出它的环境的详细信息。所以我们还可以利用下面的命令来检查PHP的工作情况:

      sudo sh -c "echo '' > /var/www/info.php"

      之后,在浏览器地址栏键入http://localhost/info.php,然后回车,这时应该能看到一个颜面,给出刚才安装的PHP的详细信息。需要注意的是,如果在此过程中浏览器不显示页面,而是提示你下载文件,这就说明 Apache没有正确加载PHP模块。解决问题的办法是,在/etc/apache2/apache2.conf 或 /etc/apache2/mods-enabled/php5.conf文件中加入下面一行命令:

      AddType application/x-httpd-php .php .phtml .php3

      加入上面的命令行后,为了保证Apache重新读取配置文件关闭,我们可以通过下面的命令将其关闭,然后再加以启动:

      $ sudo /etc/init.d/apache2 stop

      $ sudo /etc/init.d/apache2 start

    三、配置动态虚拟主机

      一般情况下,我们会在Web服务器上寄放多个Web站点,并且每个站点都有它自己的虚拟服务器。对于Apache来说,它同时支持基于名称的虚拟服务器和基于IP的服务器。

      对于基于IP的虚拟服务器,每个站点都具有一个单独的IP地址,这样的缺点是使用太多的IP地址,但如今IPv4的地址已有枯竭的迹象,所以不提倡使用,通常在要求使用SSL 时才使用。

    对于基于名称的虚拟服务器,多个Web站点共享一个IP地址。在这种情况下,通常根据HTTP请求头部来决定将其发给哪一个站点。为此,我们需要为每个虚拟服务器分别建立一个配置,给作为Web站点的根的目录以及主机命名。但是,如果这样的话我们每当添加一个新的虚拟服务器时,就要修改 Apache的配置并重新启动,这的确很烦人呢!

      值得高兴的是,如果使用动态虚拟主机技术的话,可以随时加入虚拟主机时而不必重新配置或启动Apache。该技术要用到一个模块,称为vhost_alias。我们可以通过在Apache2已启用的模块目录中建立一个符号链接来启用该模块,命令如下所示:

      $ sudo ln -s /etc/apache2/mods-available/vhost_alias.load

      /etc/apache2/mods-enabled/vhost_alias.load

      要想使vhost_alias正常工作,我们还需要修改/etc/apache2/apache2.conf 来关闭常规名称(canonical names),修改日志文件的配置,并为我们的虚拟主机规定存放位置。下面是一个实例:

      #从"Host:"头中取得主机名

      UseCanonicalName Off

      # 这种日志格式可以从第一个字段中提取出主机名

      LogFormat "%V %h %l %u %t "%r" %s %b" vcommon

      CustomLog /var/log/apache2/access_log vcommon

      # 在返回请求的文件名路径中包含主机名

      VirtualDocumentRoot /var/www/vhosts/%0/web

      VirtualScriptAlias /var/www/vhosts/%0/cgi-bin

      接下来,创建存放虚拟主机的目录,命令如下:

      $ sudo mkdir /var/www/vhosts

      新建一个基干虚拟服务器,命令如下所示:

      $ sudo mkdir -p /var/www/vhosts/skeleton/cgi-bin

      $ sudo cp -a /var/www/apache2-default /var/www/vhosts/skeleton/web

      重新启动apache2,使得上面的配置生效,方法如下所示:

      $ sudo /etc/init.d/apache2 restart

      好了,现在我们可以建立基于名称的虚拟主机了。方法是将基干拷贝到要响应的主机名。举例来说,要想为www.Linuxidc.com新建一个虚拟服务器的话,只要运行下面的命令就行了:

      $ sudo cp -a /var/www/vhosts/skeleton /var/www/vhosts/

      www. Linuxidc.com

      现在,所有到达你的Apache服务器的HTTP连接中,只要其“Host:”头部被设成 www. Linuxidc.com,那么将由对应的虚拟服务器来响应。

      为了早些看到我们的劳动成果,可以在本地进行测试。为此编辑/etc/hosts,加入下面一项:

      127.0.0.1 www. Linuxidc.com

      这样,在本机上就能访问该站点了。但是,为了让所有用户都能访问虚拟主机,还需申请域名,并且我们还需要在公共DNS服务器上进行设置。

    web服务器

    WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。
    Web服务器是指驻留于因特网上某种类型计算机的程序。当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件发送到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。服务器使用HTTP(超文本传输协议)进行信息交流,这就是人们常把它们称为HTTPD服务器的原因。
    APACHE
       apache仍然是世界上用的最多的Web服务器,市场占有率达60%左右。它源于 NCSAhttpd服务器,当NCSA WWW服务器项目停止后,那些使用NCSA WWW服务器的人们开始交换用于此服务器的补丁,这也是apache名称的由来(pache 补丁)。世界上很多著名的网站都是Apache的产物,它的成功之处主要在于它的源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、Linux系统平台上)以及它的可移植性等方面。
      Tomcat
      Tomcat是一个开放源代码、运行servlet和JSP Web应用软件的基于Java的Web应用软件容器。Tomcat Server是根据servlet和JSP规范进行执行的,因此我们就可以说Tomcat Server也实行了Apache-Jakarta规范且比绝大多数商业应用软件服务器要好。
      Tomcat是Java Servlet 2.2和JavaServer Pages 1.1技术的标准实现,是基于Apache许可证下开发的自由软件。Tomcat是完全重写的Servlet API 2.2和JSP 1.1兼容的Servlet/JSP容器。Tomcat使用了JServ的一些代码,特别是Apache服务适配器。随着Catalina Servlet引擎的出现,Tomcat第四版号的性能得到提升,使得它成为一个值得考虑的Servlet/JSP容器,因此目前许多WEB服务器都是采用Tomcat。
     
    October 18

    制作交叉编译链

     
     前段时间研究uboot的修改,只是关注了大概框架的修改,当时下载的uboot1.2.0,交叉编译链也是下载的现成的,cross-2.95.3,当时就是编译不过去。这种标准的文件没有进行修改过编译出问题很奇怪,在网上找到了一些信息,这个交叉编译链只支持到uboot1.1.4。于是又下载了uboot1.1.4,编译成功,很兴奋阿。
    交叉工具链下载地址:
    ftp://ftp.arm.linux.org.uk/pub/linux/arm/toolchain/
     后来在移植内核时发现高版本的内核中已经加入了对s3c2440的支持,所以决定采用高版本的内核2.6,同时uboot决定采用1.2.0。按照上次的思路下载了最新的cross-3.2,居然编译不了,连1.1.4都编译不了。这种情况只能归咎于版本问题。这种现成的交叉编译链有一定的局限性,比如它采用的gcc是哪个版本,
    是否能编译我需要的内核和uboot? 交叉编译链是需要根据自己的情况制作的。 幸好有crosstool这个工具。省去了一步一步制作的麻烦。
     http://kegel.com/crosstool/
     下载crosstool-0.43.tar.gz,解压。
     我的linux为redhat 9。
     硬件平台为arm9,s3c2440
     首先下载制作交叉编译链所需的文件,地址:ftp.gnu.org
    binutils-2.15.tar.bz2
    gdb-6.5.tar.bz2
    gcc-4.1.0.tar.bz2
    gcc-3.3.6.tar.gz
    glibc-linuxthreads-2.3.2.tar.gz
    glibc-2.3.2.tar.gz
    linux-libc-headers-2.6.12.0.tar.bz2
    linux-2.6.10.tar.gz
    将这些文件存放在$HOME的downloads目录下,不用解压。
    进入crosstool-0.43目录中,执行cp demo-arm.sh arm.sh 复制一个模板进行修改。
    执行vi arm.sh进行编辑
    #!/bin/sh
    # This script has one line for each known working toolchain
    # for this architecture.           Uncomment the one you want.
    # Generated by generate-demo.pl from buildlogs/all.dats.txt
    set -ex
    TARBALLS_DIR=$HOME/downloads  //制作交叉编译所需文件的存放位置!
    RESULT_TOP=/opt/crosstool //生成的交叉编译链的存放地址,注意你是否对该文件有写权限
    export TARBALLS_DIR RESULT_TOP
    GCC_LANGUAGES="c,c++"      //生成的工具链支持的语言的种类!
    export GCC_LANGUAGES
    # Really, you should do the mkdir before running this,
    # and chown /opt/crosstool to yourself so you don't need to run as root.
    mkdir -p $RESULT_TOP
    #eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2-tls.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5-tls.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2-tls.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5-tls.dat` sh all.sh --notest   
    #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6-tls.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest
    eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest//这块根据需要我选择了高版本的gcc-4.1.0
    echo Done. //上面表示你要选工具链的版本号!"#"起注释功能!我们可以选择一行!
    打开crosstool-0.43目录下的arm.dat文件,内容如下:
    KERNELCONFIG=`pwd`/arm.config
    TARGET=arm-linux-gnu
    TARGET_CFLAGS="-O"
    这里TARGET=需要根据自己的情况修改一下,比如目前为arm-linux-gnu那么最终编译完成后我的gcc为
    arm-linux-gnu-gcc。
     
    打开crosstool-0.43目录下的gcc-4.1.0-glibc-2.3.2-tls.dat文件,内容如下:
    BINUTILS_DIR=binutils-2.15
    GCC_COR_DIR=gcc-3.3.6
    GCC_DIR=gcc-4.1.0
    GLIBC_DIR=glibc-2.3.2
    LINUX_DIR=linux-2.6.10
    LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
    GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
    GDB_DIR=gdb-6.5
    GLIBC_EXTRA_CONFIG="$GLIBC_EXTRA_CONFIG --with-tls --with-__thread           --enable-kernel=2.4.18"
    注意:这里边的几个版本的文件必须在$HOME/downloads文件夹下有。
    到这里就设置完了。
    到crosstool-0.43目录下执行./arm.sh经过大概1小时就OK了,然后设置环境变量。
    PATH=/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux-gnu/bin:$PATH
    具体设置方法可参考linux应用中的环境变量及设置。