Linux软件包管理

RPM包管理

1) 查选MySQL是否安装(以MySQL软件包为例)
   # rmp -q mysql

   — 可以使用rpm -e命令先删除原来安装的MySQL,然后安装新版的

2)安装MySQL服务器和客户端
   # rmp -ivh MySQL.rpm

3)查询软件包的描述信息
   # rmp -qi software_name

4)查询软件包中的文件列表
   # rmp -ql software_name

5)查询某文件所属的软件包
   # rpm -qf 文件或目录的全路径名

6)查询未安装的软件包信息
   # rpm -qp 软件包文件全路径名

7)升级RPM软件包
   # rpm -Uvh 软件包文件全路径名

8)验证某软件包
   # rpm -Vp rpm包文件名

TAR包管理

tar option file-list

    -t    查看包中的文件列表
    x     释放包
    -e   创建包
    r     增加文件到包文档的末尾
    -z   代表gz格式的压缩包
    -j    代表.bz或.bz2格式的压缩包
    -f   用于指定包文件名
    -v   表示在命令执行时显示详细的提示信息
    -C   目录路径名
    C     用于指定包压缩释放到目录路径
1)将/etc目录下的文件包打包成mylinux.tar
     # tar -evf mylinux.tar  /etc/

2)创建压缩的TAR包
     # tar -[ z|j ]cvf 压缩的tar包文件名   要备份的目录或文件名

3)释放tar包
    # tar -xvf tar包文件名
   如果是压缩包: # tar -[ z|j ]xvf  压缩的tar包文件名

设计模式

我们在写程序中遇到许多问题,会发现一些的解决方法很是类似。其实,这些解决方法原理,也是许多programer广泛重复使用的方法。这就涉及到设计模式 — 用来描述在程序设计中解决特定问题的一种可重复的方法。

但是,如果过度使用,为了增加设计的灵活性和架构的适应性,以便应对可能永远不会出现的未来需求,导致应用的实现被该用哪些设计模式比较恰当等这些因素所阻碍,这就是所谓的“分析瘫痪”状态。

所以,设计模式只在一些特定的情形中才是有用的。

有个小小体会,程序的“职责分离”,尽量创建小的,易读的,易修改的代码块,用来解决特定的问题。

真谛

真谛难寻。开花只是预言,预言是软弱的;结果只能反馈,反馈是迷乱的。也许唯有凋谢和跌落才生的生动而惊心地反证什么,可这时粗心的人们却不会特别去留意,更很少自觉的参悟。

真谛从你眼前滑过,而你睁着眼却在困惑。

有时你无意中开始优雅的只有自己一个读者的诗行里设计真谛,梦想的翅膀把真谛倾诉成浪漫的平平仄仄,缥缈的意象把真谛摇曳成更难意会的隐隐约约。你的心情很好,你很满意自己的灵气,只是从此春天别来春寒,秋天别来秋风,上路别跌倒,抬头别撞墙,你害怕惊扰那温暖的脆弱的梦。

然而,只有风风雨雨起起落落,才会撞击自设的欺骗,才会清醒自入的梦乡,恰恰在这时真谛就在痛苦中起舞,你能看明白,但更需你咬着牙爬起来去捕捉。真谛,原来是你经历中最黯淡的时候转瞬即逝的一抹光亮。

真谛就在你奔走的脚下,而你一旦脚步悬在了空中,就是真谛深情的望着你,你也不会理会它。有时你甚至更迷恋名人的演义和演义中无意甩出的话语,因为他们的钥匙已经打开迷宫的门,他们的步履已证明了一种逻辑,于是你想把握住那万能的真谛。诚然,精彩的故事本身就清晰出一种秘诀,但与此同时这种秘诀又模糊出一种美丽的光环,天真的人们沉醉于此,又模糊于此,殊不知名人的“芝麻开门”咒语,只是他的秘密武器,于你只能欣赏而不能操作。名人的成功只是他做出的解,其实还有万千方程在冥冥中等候着你。别人的真谛也许会把你导入糟糕的误区,因为一旦某种真谛已显示出魅力,那么随着这种魅力到达顶峰,这种真谛便逐渐作废。

一种选择只有一种真谛,唯一的你要做唯一的寻找,你耐着性子独步吧,真谛就在远处放歌,此时你不已寻找到了那歌声的去向?

真谛难寻,常常是因为有时错把预言当成结论,真谛提前被假象蒙住了。还因为有时错把收获当成成熟,真谛被浅薄的陶醉给吓跑了;甚至还因为有时错把失去当成得到,扭曲的真谛给你一个空虚的满足。

急不得,懒不得,看好了,稳着些,白天上路,夜里琢磨,闯出一重天,蓦然回首,真谛原来就是你的脚窝。

国庆假期

很快,十一假期已结束~

假期,依然是回家。家乡变化不是太大,但空气很好,特别喜欢晚上的寂静。

这些天来,亲朋好友间走走,大半在家和两老唠叨,莫名有着幸福,责任……

很平淡的过完了假期,今天已是返回远离家乡的工作的城市,也觉得,下来的路更要踏实~

数列

还是记下来,方便使用:

1 等差数列
1)公差d:d = an-an-1
2)通项公式:an = a1 + (n-1) d = S1 = Sn – Sn-1 (n >= 2)
3)等差中项:A = (a+b) / 2
4)前n项和:
Sn = n(a1 + an) / 2 = na1 + n(n-1) * d / 2
5)a1 + an = a2 + an-1 = ….

2 等比数列
1)公比q: q = an / an-1
2)通项公式:an = a1qn-1
3)等比中项:b2 = ac
4)前n项和:Sn = a1(1-qn) / (1-q) (q != 1)
5)a1an = a2an-1 = …..

动态级联下拉框

今天需要遇到添加商品的某一类型的时候,原来的类型只有一个下拉框,虽然下拉框有层次缩进,但太长了,很不好使用,于是,想有这么一个处理:

1)首先生成根类的下拉框
2)选择某一个父类的时候,随后生成一个其子类的下拉框,如果有子类的子类(即孙子),不列出它们。
3)以此类推

完成以上功能的话,非JavaScript莫属了。

这里有一个难点,如果处理好只能生成当前父类的子类(如果存在的话),而且不能重复生成子类的下拉框(select)。变化到同级中的另一个父类的时候,之前父类的子类(还有由点击子类生成的其子类(即孙子类)的下拉框,再类推以下几级),都要消失,而是生成当前指向的父类的子类。

说得乱七八糟的吧。其实,也简单,我们要处理的是,当前某层类位置以后东东,我们需要一个东西记录这些东东,以便选择同层中另一个类时候的删除它们,插进该类的子类。

以上也只是自己想得处理这问题的一个方法,当前能力还非常有待提高,所以很期待高人指点。下边贴出代码,JavaScript好些东西是用于致学(即是用的时候,查看了下参考手册,很多东西没了解,用的比较生硬),还有,以下只支持IE,非常郁闷!其它浏览器不支持Event对象的srcElement属性哦!

类别的XML文档category.xml

HTML DOM:

处理xml并生成category的select菜单的JavaScript:xml_category.js

/**
 * @param   xml_name     xml文档的路径
 * @param   target_id      html的DOM的ID
 */
function xml_category(xml_name, target_id)
{
  var self = this;             // 私有变量,指向对象本身,在JS“类”的封装和访问机制,理解还有待加强。
  
   this.xmlDoc       = loadXMLDoc(xml_name)        // loadXMLDoc函数见/?p=302
   this.targetID     = document.getElementByID(target_id);
   this.catTree      = new Array();                       // 记录select的情况

   /**
    *  产生select下拉框
    */
   this.createSelect = function(parent_id)
   {
      var xmlDoc = self.xmlDoc;
      var cat, cat_num;

      // 以下为了都兼容各浏览器,不使用用与IE的XML DOM的selectNodes() 方法用一个 XPath(//cat[pid=*])[*表传来对应的parent_id] 查询选择节点.其它浏览器可参考Document.evaluate()。
      cat = xmlDoc.getElementByTagName("cat");
      cat_num = parseInt(cat.length);
     
      if (cat_num > 0) // 类别存在
      {
         var slt;
         var is_set = false;                                            // 为标志该层是否有类别,即有option选项
         slt = document.createElement("SELECT")              // 创建一个select元素节点
         slt.onchange = self.createChildSelect;                 // onchange事件

         // 每次都是整树遍历啊! !--
         for (var i=0, j=0; i < cat_num; i++)
         {
            // 同层的类别
            if (parseInt(cat[i].getAttribute("pid")) === parseInt(parent_id))
            {
               // option选项
               slt.optons[j] = new Option(cat[i].childNodes[0].nodeValue, cat[i].getAttribute("id"));
               is_set = true;
               j++; 
            }
         }

         // 有选项值
         if (is_set)
         {
             self.catTree.push(slt);          // 记录这个select下拉框
             self.targetID.appendChild(slt);
         }
         else
         {
            slt = null;
         }

      }
   }

   /** 
    * 生成子类
    */
  this.createChildSelect = function()
  {
       var slt_len = self.catTree.length;
       
       if (slt_len > 0)
       {
            var s = 0;                     // 标记当前触发option在catTree的位置(如果存在的情况)

            // 很不顺眼的遍历
            for (var i=0; i < slt_len; i++)
            { 
                // srcElement是IE的属性。 !--
                if (self.catTree[i] == event.srcElement)
                {
                    s = i ; break;
                }
            }

            // 删除该层位置以后所有的东东
            for (var i= slt_len - 1; i > s; i--)
            {
                 self.targetID.removeChild(self.catTree[i]);
                 seft.catTree.pop();
             }

            self.createSelect(event.srcElement.value);
       }

  }

}

下来在之前HTML文档位于id=”cat”写下如下JS,便可实现了:

var xml = xml_category("xml_category.xml", "cat")
xml.createSelect(0);

以上处理,还非常欠缺灵活性,就是初始化这个select下拉框的时候,如果输入的parent_id不是根类的ID,而是子类,或以下几层的子类的ID的时候,不能生成相应的select下拉框。

到此,写下这点记录,希望高人指点,也继续更进~

PHP has encountered an Access Violation at 03BF3FC2

今天进入php网站的时候,空白一片,只显示PHP has encountered an Access Violation at 03BF3FC2,之前PHP站一直运行正常,而现在ASP站运行正常,于是估计内存不足?

整了一番,看C盘(Win2003环境),Free space: 0 bytes。C盘一点剩余存储空间都没了!!赶紧查看并整理一番,PHP站终于可以运行了。

Chrome浏览器加载XML文档

Chrome浏览器不支持load方法加载XML文档。网上找了下,需要如下解决:

function loadXMLDoc(xml_name)
{
  var xmlDoc;

  try
  {
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");   // Support IE
  }
  catch(e)
  {
    try
    {
     // Support Firefox, Mozilla, Opera, etc
      xmlDoc = document.implementation.createDocument("", "", null) ;// 创建一个空的 XML 文档对象。
    }
    catch(e)
    {
       alert(e.message);
    }
  }

  // 加载XML文档
  try
  {
    xmlDoc.async = false;   // 关闭异步加载
    xmlDoc.load(xml_name);
  }
  catch(e)
  {
     // alert(e.message)   如果浏览器是Chrome,则会catch这个异常:Object # (a Document) has no method "load",所以,以下实现支持chrome加载XML文档(只是粗略的写下)

    var xhr = new XMLHttpRequest();
    xhr.open("GET", xml_name, false);
    xhr.send(null);
    
    xmlDoc = xhr.responseXML.documentElement;
  }

   return xmlDoc;
}

BTW,各浏览器加载XML字符串也不同。

IE使用 loadXML() 方法来解析 XML 字符串:

xmlDoc.loadXML(xml_str);

FireFox等使用DOMParser 对象解析XML字符串:

var parseXml = new DOMParser();
var doc = parseXml.parseFromString(xml_str,"text/xml");

Ajax的call方法

被以下问题郁闷了下。下面比较抽象简述下这个问题。

index.html文件

Test

test.js文件:

/**
  * 定义一个无类型的对象listInfo
  */
var listInfo = 
{
     // 属性info,为对象类型
     info : {
         name : "ljlwill"
     },

    // 方法getName
     getName : function()
     {
          // 我这个例子这样来设置setName,好像“蛮干”哈,现在我只是简化和抽象,实际项目就是要用这些规则
          Ajax.call(this.setName);

          alert(this.info["name"]);
     },

    // 方法setName
    setName: function(name)
    {
        this.info["name"] = name;    // 大家注意这个this
    }
}


/**
  * 定义无类型的Ajax对象
  */
var Ajax = 
{
     // 创建XMLHttpRequest对象
    createXMLHttpRequest : function() 
   {
        var xhr;

        if (window.ActiveXObject)
        {
             var versions = ['Microsoft.XMLHTTP', 'MSXML6.XMLHTTP', 'MSXML5.XMLHTTP', 'MSXML4.XMLHTTP', 'MSXML3.XMLHTTP', 'MSXML2.XMLHTTP', 'MSXML.XMLHTTP'];

             for (var i=0; i< versions.length; i++)
             {
                  try
                  {
                       xhr = new ActiveXObject(versions(i));
                       break;
                  }
                   catch(ex)
                  {
                       continue;
                  }
             }
             
        }
        else
        {
              xhr = new XMLHttpRequest();
        }
    
        return xhr;
   },

   // call方法
   call : function(callback)
   {
       var xhr = this.createXMLHttpRequest();
       
       // 以下也一切从简
       xhr.open("GET", "index.php", true);  //异步
       
       xhr.onreadysatechange = function()
       {
           // 完成
           if (xhr.readySate == 4) 
           {
               swith (xhr.status) 
               { 
                   case : 200    // OK
                      if (typeof(callback) == "function")
                      {
                           callback.call(this, "ljlwill -- from Ajax");   // 将自身绑定到另外一个对象执行
                      } 
               }

               xhr = null;  // 销毁
           }

       }
       
       if (xhr != null) xhr.send(null);
   }

}

这时,我本意要,点击那个Test链接,先弹出“ljlwill",然后在点击一次的时候是弹出“ljlwill -- from Ajax",可是却不论如何点击,都是弹出"ljlwill"。listInfo对象的setName没有执行?里面加个alert,证明是有执行的。

其实,是这个call方法”捣鬼“。

在JavaScript中,将函数自绑定到另外一个对象上执行,有appliy和call方法,它们只是在参数方面有所不同(具体可相关资料,这里不详述)。

Function.prototype.call(thisArg, [arg1, [arg2, ] ...]),所有函数的内部this指针都会指向thisArg,从以上代码中这个thisArg为Ajax对象,非listInfo对象,这样当然改变不了name值了!

所以,把那callback.call(this, "ljlwill -- from Ajax")该为callback.call(listInfo, "ljlwill -- from Ajax"),问题解决。只是这样有一定的隐患,比如listInfo未定义,或改名,牵动的东西还蛮多!所以,可以就让Ajax对象来运行这函数,而函数的方法内部指明关联哪个对象!

以上也是个人愚见,不是有否不足,或不对,期待讨论~

在Win32下仿真UNIX的API的软件

如果想在window平台下学学Unix shell的命令,如tar, gzip或者grep等等,在VMware里,却不能实际操作window的文件等,cygwin/x 可帮到您(当然,还有好多命令还是不允许的,不过还是凑合使用 🙂 )。

在cygwin/x的官方网站有很详细的文档,教你如何安装和使用等。

Try it now