Thursday, September 18, 2008

XAMPP是什么

XAMPP是什么―xampp for windows又是什么?

XAMPP是什么

XAMPP是什么?XAMPP 是一个功能全面的 AMPP (Apache、MySQL、PHP、Perl)软件包,这是 Linux 平台上可以使用的几种非商业 AMPP 中间件之一。采用这种紧密的集成,XAMPP 可以运行任何程序:从个人主页到功能全面的产品站点(虽然这仅仅用于开发目的;出于安全考虑,XAMPP 还不适于用在产品服务器上)。

基本的软件包

基本的软件包包括系统、编程和服务器软件:
Apache,著名的 Web 服务器
MySQL,一种杰出、免费的开源数据库
PHP,一种编程语言(在撰写本文时版本为 4.3.8 和 5.0.1)
Perl,一种编程语言
ProFTPD,一个 FTP 服务器
OpenSSL,可以支持安全套接字层

图形软件包

XAMPP 包括以下与图形有关的软件包:
GD,"Graphics Draw"库
libpng,官方的 PNG 参考实现库
libjpeg,官方的 JPEG 参考实现库
ncurses,字符图形库

数据库软件包

如果没有以下的数据库软件包,怎么还能叫集成软件呢?
gdbm,标准的 UNIX® dbm 库的 GNU 实现
SQLite,一个相当小的、无需任何配置的 SQL 数据库引擎
FreeTDS,一个数据库,让 UNIX 和 Linux 程序可以访问 Microsoft® SQL 和 Sybase 数据库

XML 软件包

为了开发 XML 程序,XAMPP 应该包含以下软件包:
expat,一个 XML 解析器库
Salbotron,一个 XML 工具包
libxml,一个 XML C 解析器和 GNOME 工具包
PHP 软件包
为了开发 PHP 程序,XAMPP 应该包括以下软件包:
PEAR,PHP 库
一个 pdf 类,可以使用 PHP 生成动态的 PDF 文档
TURCK MMCache,一个 PHP 性能增强器

其他软件包
最后,XAMPP 中包含了以下软件包来展示自己的强大功能:
zlib,一个压缩库
mod_perl,在 Apache 中嵌入了一个永久的 Perl 解释器
gettext,一个工具集,可以帮助 GNU 软件包生成多语言的消息
mcrypt,一个加密程序
Ming,一个 Flash (SWF) 输出库
Freetype2,一个软件前端引擎
IMAP C-Client,一个邮件编程 API

Friday, September 12, 2008

支持google adsense

首先,我们说说什么是Google Adsense推介 ,简单的说就是如果有人点了你网站上面的Google Adsense推介图标,然后如果他通过这个链接注册了Google Adsense帐号的话,那么在他得到第一次的100美元的广告费的同时,你也会得到100美元,但是他不会有任何损失。也就是说,你给Google拉来一个新的赚钱工具后,如果确认了他有赚钱能力(得到第一次的100美元),那么你就会得到100美元的奖励。

这100美元很容易赚么?我不这么认为。我的所有的Blog(至少有6-7个,不同领域的内容)都放有Google Adsense广告,即使这样我的第一张100美元支票,仍旧让我等上了整整一年多才挣到。那我为什么还要放这个推介呢?那是因为即使没有任何收入,我也愿意向别人推荐Google Adsense广告。

是,我知道Google Adsense也有很多的问题,比如广告和内容的相关性没有像Google说的那么好,比如对发布商非常苛刻的用户协议(不能公布统计数字,不能作弊,否则就会被干掉),等等。然而,我还真没有更好的选择可以推荐给我的朋友们。我反对强制性的广告,强制弹窗广告严重影响用户体验,只能帮用户练习快速关闭新窗口的技能。我反对内容无关的广告,我正在看一篇感人至深的文章时,一个突然冒出来的性用品广告可能会让我感到非常不快。我反对晃眼睛的广告,他们让我精力严重分散,甚至经常逼得我把整个页面关掉了事儿。

这是一个恶性的循环。因为广告是用干扰用户的方式推出的,所以往往效果不好。商家发现投放广告效果不好后,只能加大投放力度,这样就更近一步的干扰了用户,同时也更加降低的广告的效果。在这样的恶性循环下,种种掩耳盗铃的手段出现了,用户不是不爱点这些广告么,我们把广告放在滚动条那里,叫你一拖滚动条就点到;用户不是看到广告就关闭么,我们做个假的关闭按钮,点了以后其实是打开广告,等等等等。页面上广告越来越多,页面对用户的实际价值也就会越来越低,这些做法不仅仅在损害用户和商家的利益,而且他们在摧毁这个价值体系。他们在降低网络广告的可信度和含金量,这样的恶性循环发展下去,就会毁掉整个网络广告行业。

但是我不反对广告。有很多消息我们是从广告知道的,比如现在正在进行Google Code Jam大赛的消息,我就是在Donews的广告发现的。当我想租房子的时候,我甚至会去注意平时鄙视的电线杆广告。广告本应是消费者和商家的桥梁,帮助消费者找到需要的产品和服务,帮助商家找到消费者。一个不需要的信息在你眼前乱晃的时候就是垃圾,一个广告在你需要他的时候冒出来,那就是有价值的信息了。

Google Adsense正是把广告信息化有序化的一种努力。让广告出现在相关的搜索结果的旁边,让广告出现在内容相关的文章旁边,这些保证了看到广告的人正式需要这些广告的人。Google Adsense这种内容相关的,非强制性的广告成为一种标准后,我们的互联网会更加有价值,用户也会更容易找到他需要的东西

如何申请adsense

This summary is not available. Please click here to view the post.

Thursday, September 11, 2008

超聪明司机

一名警察要一位超速行驶的男士把车停到路边,之后开始了下面的问话调查:

  警察:我能看一下你的驾驶执照吗?

  司机:我没有驾照,因为第五次酒后开车,我的驾照被吊销了。

  警察:我可以看看你车子的牌照吗?

  司机:这不是我的车,是我偷人家的。

  警察:车是偷的?

  司机:对。但是让我想一想……我想起来了,车主的牌照……噢,放在仪表签盘上的小柜子里面了。当我把我的手枪放进小柜子里时,我看见过车牌照。

  警察:仪表盘上的小柜子里有一把手枪?

  司机:是的,先生。我杀了这部车的女主人,把她放进车后边的行李箱里,然后,把我的枪放进了那个小柜子里。

  警察:你是说后备箱里有一具女尸?

  司机:是的,先生。

  听到这里,警察大惊,立刻向警察局呼叫求援。很快,这部汽车被一群警察包围了。一名警官走向司机,去处理这一紧急情况。

  警官:先生,我能看一下你的驾照吗?

  司机:当然可以,给。

  警官:车是谁的?

  司机:我的,警官先生。这是我的牌照。

  警官:你能打开仪表盘上的小柜子上我看看里面的手枪吗?

  司机:我可以打开小柜子,长官。但是,里面没有什么手枪。

  小柜子打开了,里面果然没有手枪。

  警官:我被告知你车尾的行李箱里藏着一具尸体。你不介意打开它吧?

  司机:没问题。

  行李箱打开了,没有发现尸体。

  警官:我不明白这是怎么回事。那名让你停车的警察说,你没有驾照,车是偷的,小柜子里有一把手枪,后备箱里装着一具尸体,难道是我们这位警察谎报吗?

  司机:那当然!他还谎报我超速行驶了呢!

幽默问答

问:提名大陆扮演黑社会老大最象的演员。
  答:古月。

  问:我的头像牛逼吗?
  答:像。

  问:大家见过公鸡下蛋吗?
  答:没有,不过我见过CCTV说真话。

  问:我新买了一处庄园,有多大说出来吓死你��我开车绕一圈足足用了两个半小时!!!
  答:嗯,以前我也有这么一辆破车~

  问:每天对着单位那群白痴讲话让我觉得前途很渺茫……
  答:幸福吧你~因为对牛弹琴并不可怕,可怕的是一群牛每天对着你弹琴!

  问:你们女人大夏天的戴胸罩不热吗?
  答:我们不戴你们会热……

  问:和女友ML时,女友好像喊了另外一个男人的名字……
  答:你日了别人的女人你还有什么不满意的!!!

  问:为什么胡主席访问日本,日本方面比较冷淡,甚至机场连欢迎标语都没有挂?
  答:怎么挂?热烈欢迎中国老朋友来日?

  问:去年到黑龙江谈生意,晚上找了个俄罗斯小姐狂干俩钟头,你猜射完后她对我说什么?嘿嘿~
  答:Are�you�ready?

  问:利用东西方信息不对称,很多国外地摊货到中国都变成了奢侈品,那中国有啥垃圾牌子在国外冒充高档货?
  答:章子怡。

  问:从来都觉得蝎子精是整部《西游记》里最美的女人,当蝎子精把唐僧逼到床上撩拨时,我心下不住地为唐僧鼓劲:从了,从了,咱就从了吧!但关键时刻,可恶的悟空出现了……
  答:嗯,八戒出现了,这次改蝎子精不从了……

  问:老爸送我老公一根鹿鞭,大家说这是啥意思?还有照片的说~
  答:这是老一辈对青年一代的鞭策啊~~~

  问:怀疑老婆红杏出墙,但苦于没证据……
  答:如果你没本事做陈冠希,那就做谢霆峰吧~

  问:《神雕侠侣》里小龙女胳膊上的守宫砂是什么东西,干什么用的?
  答:守宫砂是处女的桌面快捷方式。

  问:单位人都说我长得像韩国人,大家说像吗?(上照片)
  答:因为你长得像个棒子,单位同事又不好意思明说,所以只好说你长得像韩国人!

  问:帅有个屁用��到头来还不是被卒吃掉!
  答:帅有士陪,有炮打,有马骑,有车坐,有相暗恋……帅怎么不好?!!

  问:夏天要刮腋毛,否则穿短袖会影响淑女形象的~那再弱弱地问一句,**用刮吗?
  答:不刮扎嘴!

  问:问个欠扁的问题,为什么跳水运动员入水时裤衩不会被冲掉?
  答:跳水运动员平时训练主要有两大方面:1.压水花;2.夹裤衩。

  问:是中国人就抵制《古惑仔》之类的烂片,因为这种烂片很容易就把小孩教坏!
  答:晕~像楼主这样的看《鼹鼠的故事》都会去学盗墓……

  问:大家知道,从六教东侧往北的路是个下坡,刚才我来六教时突然看见一可爱MM骑车直冲而下,并高呼"太爽了!"引来不少行人侧目。现在回想起来,MM甜美的声音真是让人回味无穷啊~
  答:明天我就把这丫头的车座再装回去!

  问:反腐真的就这么难吗?
  答:你割割自己的JJ看难不难!!

  问:请用一句话形容中国国家地震台。
  答:事后诸葛亮,事前猪一样!

  问:美军在伊拉克不能抽身说明美国是个负责任的国家!!
  答:那我股票被套牢说明我是个负责任的中国股民??

  问:为什么警察抓坏人时都要鸣警笛?难道不怕坏人老大远就听到跑了?
  答:上级单位来检查之前一般都会事先通知下级单位的~

  问:萨达姆就义前仍振臂高呼,虽听不懂他在喊什么,但还是由衷地敬佩这位领袖!
  答:萨达姆咒道:"中国哪个狗日的说'让领导先走'的!!!"

  问:据香港翡翠台报道,今晨阿娇在其母亲陪同下到圣约翰女子医院做过检查,医院诊断报告证明其处女膜未见器质性损伤,不信大家可以浏览翡翠台网站��我永远的阿娇。
  答:妈的,你是在嘲笑陈冠希的JJ小吗?!!

flex 是什么

的Macromedia Flash是强大的矢量动画编辑工具,在做动画起家之后,Flash一直在谋求rich internet application(ria富客户端)的霸主地位,最有影响的是,已经推出了面向对象的编程脚本actionscript2.0,并且建立起类似于java swing的类库和相应component(组件)。Flex是通过java或者.net等非Flash途径,解释.mxml文件组织components,并生成相应得.swf文件。Flex的component和flash的component很相似,但是有所改进增强。

运用Flash是完全可以做到flex的效果的,为什么还需要flex呢?这里面有两个原因:1:为了迎合更多的developers(开发者)。Flash天生是为了designer(设计者)设计的,界面还有flash的动画概念和程序开发人员格格不入,为了吸引更多的jsp/asp/php等程序员,Macromedia推出了Flex,用非常简单的.mxml来描述界面给jsp/asp/php程序人员使用.(x/d)html非常相似,而且mxml更加规范化、标准化。

2,为了一个标准。大家一定听说过微软下一代系统longhorn,在longhorn推出的同时微软也会推出新的语言xaml,一种界面描述语言,与之相应的就是smart client和flex非常相似的东西。Mxml和Xaml的也很相似… …这是人机交互技术的进步的重要体现,即内部逻辑与外部界面交互相分离。

Flex和j2ee/.net其实没什么关系,Macromedia用java做出来个应用把flash的技术融合到J2EE里面,再用.net技术做出来个.net应用把flash技术融合到.net里面去;应该说flex解决了J2EE里面和.net里面最繁琐的问题那就是web 客户端的问题。微软比较卑鄙,在ie里面built-in(事先安装好了)很多控件,可以被.net调用比如datagrid(gridview),java就没有办法啦,只能用最原始的html一个tag一个tag地print,真是头疼,还有客户端的javascript是最难调试的,不论java还是.net都束手无策。

3、与FLEX学习相关
[相关链接]
Adobe公司Flex主页:http://www.adobe.com/cn/products/flex/
ACAA教育(Adobe官方高级Flex & AIR富互联网应用开发培训):http://www.acaa.cn/
FlexExamples:http://blog.flexexamples.com/
Adobe - Flex Developer Center http://www.adobe.com/devnet/flex/?sdid=ZFCT
中文FlexExamples(上百个包含代码的Flex例子,主要是翻译的):http://blog.minidx.com
RIAShanghai:http://riashanghai.com
Flex中文社区:http://www.flexcoders.cn/
蓝色理想网站的Flex入门教程:http://www.blueidea.com/tech/multimedia/2004/2130.asp
一个不错的英文Flex资源列表收集站点:http://ntt.cc
关于Flex的Blog:http://www.k-zone.cn/zblog/
《Flex 3.0 RIA开发详解:基于ActionScript3.0实现》 黄曦 电子工业出版社 2008
《Flex与ActionScript编程》. 王睿. 机械工业出版社. 2008

xml文件过大

在项目里面遇到了一些被解析的xml文件超过30M 或 60M 以上的情况, 现在已经不好去说为什么不在一开始产生xml的情况下就把xml 做小点,但是遇到这个问题后,我只能解决问题了,解决问题同时害怕重复发明轮子,我也去看了下现有的xml 解析东西,jdom 的SAXBuilder和 dom4j 的SAXReader都是把XML文件一次读入,xml文件过来 会报溢出的异常 但即使SAXParser是可以批量读入解析,但它也是一次解析完,假设XML文件中有一万条数据,解析后就必须在内存中放这么多的对象 个人觉得这样有些不灵活,就自己做了个小东西来切分 但前提是这个xml文件得有文件头 <?xml version="1.0" encoding="GBK"?> encoding必须跟文件编码格式一致 ,不然解析的时候会出乱码。
 

package searchRing.ring.util.<SPAN class=hilite1>xml</SPAN>BufferTool;

import java.io.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;


public class <SPAN class=hilite1>XML</SPAN>BufferTool {
    private static final int defaultLineCount = 10;
    private static final int defaultMaxOutputSize = 50;

    private static final Pattern elementPattern = Pattern.compile("<[a-zA-Z]+>");
    private static final Pattern charSetPattern = Pattern.compile("<[?][[0-9a-zA-Z]|[\\s]|[=]|[\"]|[.]|[-]]+[?]>");

    private StringBuffer <SPAN class=hilite1>xml</SPAN>ContentBuffer;


    /* just used to store and output the data divided */
    <SPAN class=hilite1>XML</SPAN>OutputBuffer <SPAN class=hilite1>xml</SPAN>Output;

    private String charSetTitle = "";

    private String rootElemetMark = "";

    private String childElementMark = "";


    InputStreamReader bufferedReader;
    InputStream fileInputStream;


    public <SPAN class=hilite1>XML</SPAN>BufferTool(String <SPAN class=hilite1>xml</SPAN>FilePath) {

        this.<SPAN class=hilite1>xml</SPAN>ContentBuffer = new StringBuffer();

        try {

            this.fileInputStream = new FileInputStream(<SPAN class=hilite1>xml</SPAN>FilePath);
//             bufferedReader = new InputStreamReader(fileInputStream, "UTF-8");
            String charSet = getCharSet(<SPAN class=hilite1>xml</SPAN>FilePath);
            if (charSet != null)
                bufferedReader = new InputStreamReader(fileInputStream, charSet);
            else
                bufferedReader = new InputStreamReader(fileInputStream);
        } catch (FileNotFoundException fe) {
            fe.printStackTrace();
        } catch (UnsupportedEncodingException uee) {
            uee.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }


        try {
            preparePaser();
        } catch (IOException ie) {
            ie.printStackTrace();
        }
    }


    public String getCharSetTitle() {
        return charSetTitle;
    }

    public String getRootElemetMark() {
        return rootElemetMark;
    }

    private String getCharSet(String filePath) throws IOException {
        char temp[] = new char[512];
        FileInputStream tempInput = new FileInputStream(filePath);
        InputStreamReader tempReader = new InputStreamReader(tempInput);

        int i = tempReader.read(temp);

        tempReader.close();
        tempInput.close();
        if (i < 0)
            return null;

        String tempStr = new String(temp);
        Matcher m = charSetPattern.matcher(tempStr);
        if (m.find()) {
            String charSetStr = tempStr.substring(m.start(), m.end());
            Pattern tempP = Pattern.compile("[\"][[0-9a-zA-Z]|[-]]+[\"]");
            Matcher tempM = tempP.matcher(charSetStr);
            if (tempM.find()) {
                String charSet = charSetStr.substring(tempM.start(), tempM.end());
                return charSet.substring(1, charSet.length() - 1);
            }
        }

        return null;
    }


    private void preparePaser() throws IOException {
        readSomeLine(defaultLineCount);
        Matcher m = charSetPattern.matcher(<SPAN class=hilite1>xml</SPAN>ContentBuffer);
        if (m.find()) {
            this.charSetTitle = this.<SPAN class=hilite1>xml</SPAN>ContentBuffer.substring(m.start(), m.end());
            this.<SPAN class=hilite1>xml</SPAN>ContentBuffer.delete(0, m.end());
        }

        m = elementPattern.matcher(<SPAN class=hilite1>xml</SPAN>ContentBuffer);
        if (m.find()) {
            this.rootElemetMark = this.<SPAN class=hilite1>xml</SPAN>ContentBuffer.substring(m.start(), m.end());
            this.<SPAN class=hilite1>xml</SPAN>ContentBuffer.delete(0, m.end());
        }

        m = elementPattern.matcher(<SPAN class=hilite1>xml</SPAN>ContentBuffer);
        if (m.find()) {
            this.childElementMark = this.<SPAN class=hilite1>xml</SPAN>ContentBuffer.substring(m.start(), m.end());
        }
        this.<SPAN class=hilite1>xml</SPAN>Output = new <SPAN class=hilite1>XML</SPAN>OutputBuffer(this.childElementMark);

        parserBuffer();
    }


    private int readSomeLine(int lineCount) throws IOException {

        char buffer[] = new char[1024];
        int i = 0;
        int index = 0;
        /* be careful of the sequence of the boolean caculation */
        while (i++ < lineCount && (index = this.bufferedReader.read(buffer)) > 0) {
            <SPAN class=hilite1>xml</SPAN>ContentBuffer.append(buffer, 0, index);
        }

        return index;

    }


    private void parserBuffer() {

        int lastIndex = this.<SPAN class=hilite1>xml</SPAN>ContentBuffer.lastIndexOf(this.childElementMark);

        if (lastIndex > 0) {
            this.<SPAN class=hilite1>xml</SPAN>Output.append(this.<SPAN class=hilite1>xml</SPAN>ContentBuffer.substring(0, lastIndex));
            this.<SPAN class=hilite1>xml</SPAN>ContentBuffer.delete(0, lastIndex);
        }
    }

    public StringBuffer popDividedDataAfterParser() throws IOException {

        while (this.<SPAN class=hilite1>xml</SPAN>Output.getItemCount() < defaultMaxOutputSize) {
            int i = readSomeLine(defaultLineCount);
            parserBuffer();
            if (i < 0)
                break;
        }

        if (this.<SPAN class=hilite1>xml</SPAN>Output.getItemCount() == 0)
            return null;

        StringBuffer returnSB = this.<SPAN class=hilite1>xml</SPAN>Output.get<SPAN class=hilite1>Xml</SPAN>Output();
        this.<SPAN class=hilite1>xml</SPAN>Output.clearBuffer();
        return returnSB.insert(0, this.rootElemetMark).append(this.rootElemetMark.replaceFirst("<", "</"));

    }


    public static void main(String args[]) throws Exception {
        String str = "F:/ringInfo<SPAN class=hilite1>XML</SPAN>/ringTime.<SPAN class=hilite1>xml</SPAN>";

        <SPAN class=hilite1>XML</SPAN>BufferTool <SPAN class=hilite1>xml</SPAN>b = new <SPAN class=hilite1>XML</SPAN>BufferTool(str);

        StringBuffer s = <SPAN class=hilite1>xml</SPAN>b.popDividedDataAfterParser();
        int i = 0;
        Matcher m = Pattern.compile("<ring>").matcher(s);
        while (m.find())
            i++;

        System.out.println(i);
        System.out.println(s);


    }

    private static class <SPAN class=hilite1>XML</SPAN>OutputBuffer {
        private StringBuffer <SPAN class=hilite1>xml</SPAN>Output;
        private int itemCount;

        private Pattern markPattern;

        <SPAN class=hilite1>XML</SPAN>OutputBuffer(String markStr) {
            this.markPattern = Pattern.compile(markStr);
            <SPAN class=hilite1>xml</SPAN>Output = new StringBuffer();
            itemCount = 0;
        }

        public void append(String str) {
            if (str == null || "".equals(str))
                return;
            this.<SPAN class=hilite1>xml</SPAN>Output.append(str);
            Matcher m = this.markPattern.matcher(str);
            while (m.find())
                this.itemCount++;
        }

        public void clearBuffer() {
            <SPAN class=hilite1>xml</SPAN>Output = new StringBuffer();
            this.itemCount = 0;
        }

        public StringBuffer get<SPAN class=hilite1>Xml</SPAN>Output() {
            return <SPAN class=hilite1>xml</SPAN>Output;
        }

        public int getItemCount() {
            return itemCount;
        }
    }


}

代码中popDividedDataAfterParser() 输出的StringBuffer 可用来初始化一个 StringReader 再给dom4j 的saxReader去解析,这样联合一起用, 想处理多少,就先分出来解析多少,特别适合多线程的生产者和消费者的那种情况,希望对大家有用。