wordpress初体验–在自己的主机上建个WordPress用来学习与测试

最近看了这里的安装的过程忍不住 自己动手实践了一把。

准备工作:
下载: XAMPP
下载:phpmyadmin
下载:wordpress

好了,准备工作搞定,下面开工。

由于我下载的是完整版本的,直接一路下一步安装完成,选择完安装路径下一步,注意选择安装服务,如果不知道是什么服务,就把3个勾都勾上,下一步安装好 后,所有服务会自动启动的。打开浏览器(推荐使用Firefox,因为过后有很多Firefox插件,比如“Firebug”等等,实在是太好用……), 在地址栏输入“localhost”之后回车,即可看到“XAMPP for Windows”的页面(地址栏中的地址将被自动转至http://localhost/xampp)。

phpMyAdmin

phpMyAdmin是一个MySql的Web界面管理程序。在“XAMPP for Windows”的页面的左侧边栏找到“phpMyAdmin”链接,点击之后,就进入phpMyAdmin的管理页面了:

  • 在“创建一个新的数据库”下的文本框中输入:“mydatabase_wp”(随便起个名字,但要记下来,一会儿要用到),而后点击“创建”按钮;
  • 找到“权限”链接,进入“权限”设置页面,“添加新用户”;输入用户名(比如“myusername”)、输入两遍密码(比如“mypassword”)、“主机”之后的文本框里输入“localhost”;
  • 点击页面右下角的“执行”按钮;
  • 回到“权限”页面,点击用户“myusername”那行最后一个图标(“编辑权限”);
  • 在“用户 ‘myusername’@’localhost’ : 编辑权限”页面中的“按数据库指定权限”中,拉下“在下列数据库添加权限”右侧的下拉框中选中“mydatabase_wp”;
  • 在其后的页面中,点击“按数据库指定权限”右侧的“全选”链接;
  • 点击该文本域右下角的“执行”按钮。

至此,MySql数据库设置告一段落。

WordPress

WordPress安装步骤:

  • WordPress官方网站下载最新版本;
  • 把下载的zip包里的“wordpress”目录拷贝到“安装目录的\xampp\htdocs”目录中;
  • 打开浏览器,在地址栏里输入http://localhost/wordpress
  • 按照指示,填写数据库连接信息:
    Database Name: mydatabase_wp
    User Name: myusername
    Password: mypassword
    Database Host: localhost
    Table Prefix: wp_
  • 而后要设定博客名称(Blog Title):Wordpress Testing Site;email地址(Your e-mail):abcexample@gmail.com;(这两项在安装之后都可以在后台“设置”页面重新设定)
  • 在随后的页面中,WordPress会自动生成一个用户“admin”并为其设定一个随机密码——要把这个密码拷贝粘贴至记事本,以防一会儿忘记;
  • 使用用户名“admin”和刚刚得到的密码登录WordPress;
  • 在后台页面右上部可以找到“Users”链接,点击进去修改用户“admin”的密码。

中文版安装步骤:

  • 使用这个链接访问WordPress中文包链接列表;
  • 也可以直接选择“WordPress 中文团队”;
  • 下载简体中文语言包(语言包目前是2.6.2版本的,但基本上并不妨碍WordPress最新版2.6.3使用);
  • 其实只需要找到“languages”目录,把这个目录拷贝到“安装目录下\xampp\htdocs\wordpress\wp-content”目录下即可;
  • 而后用记事本修改“安装目录下\xampp\htdocs\wordpress\wp-config.php”文件,找到“define (‘WPLANG’, ”);”,修改成:“define (‘WPLANG’, ‘zh_CN’);”;
  • 重新访问“http://localhost/wordpress”,WordPress已经是中文版了……

搞定!

可以把“http://localhost/wordpress”放到收藏夹,或者Firefox的“书签工具栏”上,以便随时访问……

读”学习C++:实践者的方法”

非常庆幸在寒假中读了有关C++方面的书,假如没有读这本书(郑莉,清华大学出版社)的话,我想我也永远不会了解C++的魅力,只沉浸在c语言的迷潭中, 尽管,现在我对它只是最浅薄的了解,但是C++的美让我魂不守舍!于是,找了很多有关方面的书和资料,下面我找到一篇觉得最有价值的指导性的文章,感谢作 者刘未鹏为我们初学者做了这么好的介绍,指导!文章讲了很多 关于C++学习的方方面面,如何学习,如何避过陷阱和缺陷…

摆脱自我服务偏见–理性的思考前提

为什么要要摆脱自我服务偏见呢?说小了,是为了成为一个更优秀的程序员。说大了是节省生命(因为偏见可能导致越陷越深,浪费时间)。如果你能够理性的思考我们将要讨论的问题,避免自我服务偏见(就当你从来没有花时间在C++上一样),那么我们便可以开始讨论真正的问题了。

为什么要学习并使用C++?

公认的事实是:

1.C++在工业界仍有稳定的核心市场。

2.C++程序员玩玩能享受到有竞争力的薪酬。

3. C++的整个生态圈这么些年来在学习C++的哲学上,是在没有多少改善。

4.市面上的绝大多数C++书籍(包括很多被人们广泛称为“必读经典”的)

原因:书中充斥的是介绍C++中的陷阱和对于C++的缺陷的各种workarounds(好听一点叫Idioms(惯用法)或techniques(技术))。这些书中列出来的缺陷和陷阱根本不区分常见程度。最最关键的是:这些书当中介绍的内容与成为一个好程序员根本毫无关系,它们顶多只能告诉你——嗨,小心跌入这个陷阱。

5.就算记住一门语言的所有细节也不能让你称为一个合格的程序员。

6.了解语言实现固然有其实践意义(在极端场合的hack手法,以及出现底层bug的时候迅速定位问题),然而如果为了了解语言机制而去了解语言机制便脱离了学习语言的本意了。

7. 80%的C++书籍(包括一些“经典”)只涉及到20%(或者更少)的场景。
建议:有辨别力地阅读(包括那些被广泛称为”经典“的)C++书籍。
养成随时查阅资料和文档的习惯(RTFM)。
8.每个人都喜欢戴着脚镣跳舞。
9.我知道它们很有趣,但实际上它们只是补丁方案。
C++的复杂性
C++的复杂性有两种分类办法,一是分为非本质复杂性和本质复杂性;其中非本质复杂性分为缺陷和陷阱两类。另一种分类办法是按照场景分类:库开发场景下的 复杂性和日常编码的复杂性。从从事日常编码的实践者的角度来说,采用后一种分类可以让我们迅速掌握80%场景下的复杂性。

二八法则

以下通过列举一些常见的例子来解释这种分类标准:

80%场景下的复杂性:

1. 资源管理(C++日常复杂性的最主要来源):深拷贝&浅拷贝;类的四个特殊成员函数;使用STL;RAII惯用法;智能指针等等。

2. 对象生命期:局部&全局对象生存期;临时对象销毁;对象构造&析构顺序等等。

3. 多态

4. 重载决议

5. 异常(除非你不用异常):栈开解(stack-unwinding)的过程;什么时候抛出异常;在什么抽象层面上抛出异常等等。

6. undefined&unspecified&implementation defined三种行为的区别:i++ + ++i是undefined behavior(未定义行为——即“有问题的,坏的行为,理论上什么事情都可能发生”);参数的求值顺序是unspecified(未指定的——即“你 不能依赖某个特定顺序,但其行为是良好定义的”);当一个double转换至一个float时,如果double变量的值不能精确表达在一个float 中,那么选取下一个接近的离散值还是上一个接近的离散值是implementation defined(实现定义的——即“你可以在实现商的编译器文档中找到说明”)。这些问题会影响到你编写可移植的代码。 (注:以上只是一个不完全列表,用于演示该分类标准的意义——实际上,如果我们只考虑“80%场景下的复杂性”,记忆和学习的负担便会大大减小。)

20%场景下的复杂性:

1. 对象内存布局

2. 模板:偏特化;非类型模板参数;模板参数推导规则;实例化;二段式名字查找;元编程等等

3. 名字查找&绑定规则

4. 各种缺陷以及缺陷衍生的workarounds(C++书中把这些叫做“技术”):不支持concepts(boost.concept_check 库);类型透明的typedef(true-typedef惯用法);弱类型的枚举(强枚举惯用法);隐式bool转换(safe-bool惯用法);自 定义类型不支持初始化列表(boost.assign库);孱弱的元编程支持(type-traits惯用法;tag-dispatch惯用 法;boost.enable_if库;boost.static_assert库);右值缺陷(loki.mojo库);不支持可变数目的模板参数列表 (type-list惯用法);不支持native的alignment指定。 (注:以上只是一个不完全列表。你会发现,这些细节或技术在日常编程中极少用到,尤其是各种语言缺陷衍生出来的workarounds,构成了一个巨大的 长尾,在无论是C++的书还是文献中都占有了很大的比重,作者们称它们为技术,然而实际上这些“技术”绝大多数只在库开发当中需要用到。)

非本质复杂性&本质复杂性

此外,考虑另一种分类办法也是有帮助的,即分为非本质复杂性和本质复杂性。

非本质复杂性(不完全列表)

1. 缺陷(指能够克服的问题,但解决方案很笨拙;C++的书里面把克服缺陷的workarounds称作技术,我觉得非常误导):例子在前面已经列了一堆了。

2. 陷阱(指无法克服的问题,只能小心绕过;如果跌进去,那就意味着你不知道这个陷阱,那么很大可能性你也不知道从哪去解决这个问题):一般来说,作为一个合 格的程序员(不管是不是C++程序员),80%场景下的语言陷阱是需要记住才行的。比如深拷贝&浅拷贝;基类的析构函数应当为虚;缺省生成的类成 员函数;求值顺序&序列点;类成员初始化顺序&声明顺序;导致不可移植代码的实现相关问题等。

本质复杂性(不完全列表)

1. 内存管理

2. 对象生命期

3. 重载决议

4. 名字查找

5. 模板参数推导规则

6. 异常

7. OO(动态)和GP(静态)两种范式的应用场景和交互

总而言之,要告诉你从一个较高的层次去把握C++中的复杂性。其中最重要的一个指导思想就是在学习的过程中注意你正学习的技术或细节到底是80%场景下的还是20%场景下的。

说了这么多,还是列书一个书单来:

第一本

如果你是一个C++程序员,那么很大的可能性你会需要用到底层知识(硬件平台架构、缓存、指令流水线、硬件优化、内存、整数&浮点数运算等);这 是因为两个主要原因:一,了解底层知识有利于写出高效的代码。二,C++这样的接近硬件的语言为了降低语言抽象的效率惩罚,在语言设计上作了很多折衷,比 如内建的有限精度整型和浮点型,比如指针。这就意味着,用这类语言编程容易掉进Joel所谓的“抽象漏洞”,需要你在语言提供的抽象层面之下去思考并解决 遇到的问题,此时的底层知识便能帮上大忙。因此,一本从程序员(而不是电子工程师)的角度去介绍底层知识的书会非常有帮助——这就是推荐 《Computer Systems:A Programmers Perspective》(以下简称CSAPP)(中译本《深入理解计算机系统》)的原因。

第三本(是的,第三本)

另一方面,C++不同于C的一个关键地方就在于,C++在完全保留有C的高效的基础上,增添了抽象机
制。而所谓的“ 现代C++风格”便是倡导正确利用C++的抽象机制和这些机制构建出来的现代C++库(以STL为代表)的,Bjarne也很早就倡导将C++当作一门不 同于C的新语言来学习(就拿内存管理来说,使用现代C++的内存管理技术,几乎可以完全避免new和delete),因此,一本从这个思路来介绍C++的 入门书籍是非常必要的——这就是推荐《Accelerated C++》的原因(以下简称AC++)。《Accelerated C++》的作者Andrew Koenig是C++标准化过程中的核心人物之一。

第二本

C++是在C语言大行其道的历史背景下发展起来的,在一开始以及后来的相当长一段时间内,C++是C的超集,所有C 的特性在C++里面都有,因此导致了大量后来的C++入门书籍都从C讲起,实际上,这是一个误导,因为C++虽然是C的超集,然而用抽象机制扩展C语言的 重大意义就在于用抽象去覆盖C当中裸露的种种语言特性,让程序员能够在一个更自然的抽象层面上编程,比如你不是用int*加一个数组大小n来表示一个数 组,而是用可自动增长的vector;比如你不是用malloc/free,而是用智能指针和RAII技术来管理资源;比如你不是用一个只包含数据的结构 体加上一组函数来做一个暴露的类,而是使用真正的ADT。比如你不是使用second-class的返回值来表达错误,而是利用first-class的 语言级异常机制等等。然而,C毕竟是C++的源头,剥开C++的抽象外衣,底层仍然还是C;而且,更关键的是,在实际编码当中,有时候还的确要“C”一 把,比如在模块级的二进制接口封装上。Bjarne也说过,OO/GP这些抽象机制只有用在合适的地方才是合适的。当人们手头有的是锤子的时候,很容易把 所有的目标都当成钉子,有时候C的确能够提供简洁高效的解决方案,比如C标准库里面的printf和fopen(此例受云风的启发)的使用界面就是典型的 例子。简而言之,理解C语言的精神不仅有助于更好地理解C++,更理性地使用C++,而且也有其实践意义——这就是推荐《The C Programming Language》(以下简称TCPL)的原因。此外,建议在阅读《Accelerated C++》之前先阅读《The C Programming Language》。因为,一,《The C Programming Language》非常薄。二,如果你带着比较的眼光去看问题,看完《The C Programming Language》再看《Accelerated C++》,你便会更深刻的理解C++语言引入抽象机制的意义和实际作用。

第四本

《Accelerated C++》固然写得非常漂亮,但正如所有漂亮的入门书一样,它的优点和弱点都在于它的轻薄短小。短短3百页,对现代C++的运用精神作了极好的概述。然而要 熟练运用C++,我们还需要更多的讲解,这个时候一本全面但又不钻语言牛角尖,从“语言是如何支持抽象设计”的角度而不是“为了讲语言特性而讲语言特性” 的角度来介绍一门语言的书便至关重要,在C++里面,我还没有见到比C++之父本人的《The C++ Programming Language》(以下简称TC++PL)做得更好的,C++之父本人既有大规模C++运用的经验又有语言设计思想的最本质把握,因此TC++PL才能 做到高屋建瓴,不为细节所累;同时又能做到实践导向,不落于为介绍语言而介绍语言的巢臼。最后有一个需要提醒的地方,TC++PL其实没有它看起来那么 厚,因为真正介绍语言的内容只有区区500页(第一部分:基础;第二部分:抽象机制;以及第四部分:用C++设计),剩下的是介绍标准库的,可以当作 Manual(参考手册)。

参考文档:
第二本

《C++ Coding Standard》。无需多作介绍,这是一本浓缩了C++社群多年来宝贵的经验结晶的书,贴近实践,处处以80%场景为主导,不钻语言旮旯,用本为主…总 之,非常值得放在手边时时参阅。因为书薄所以也不妨先往脑袋里面装一遍。书中的101条建议的介绍都很简略,并且指出了详细介绍的延伸阅读,在阅读的时候 还是要注意不要陷入无关的细节和不必要的技巧中,时时抬头看一看你需要解决的问题。在C++编码标准方面,Bjarne也有一些建议。

第一本

《The Pragmatic Programmer》,用本程序员的杰作;虽然不是一本C++的书,但其介绍的实践理念却是所有程序员都需要的。

第三本

《Code Complete, 2nd Edition》,这是一本非常卓越的参考资料,涉及开发过程的全景,有大量宝贵的经验。你未必要一口气读完,但你至少应该知道它里面都写了哪些内容,以便可以回头参阅。

其它

所有优秀的技术书籍都是资料来源。一旦养成了查文档的习惯,所有的电子书、纸书、网络上的资源实际上都是你的财富。不过,查文档的前提是你要从手边的问题分析出应该到什么地方去查资料,这里,分析问题的能力很重要,因此:

第四本:

《你的灯亮着吗?》。不作介绍,自己阅读,这本书只有一百多页,但精彩非常,妙趣横生。
如对本文章干兴趣,可参考作者的原文

一些值得借鉴的学习习惯

看过mind hacks的文章里面有很多很好值得借鉴的学习习惯!

有关学习方法的:

1. Google&Wiki(遇到问题的第一件事情,做学某个东西的功课。 wikipedia

2. 看书挑剔,只看经典

3. 做读书笔记。一是将自己阅读的时候的思考(包括闪念)总结下来,二是将书中的好例子摘抄下来。人与人学习的差距不在资质上,而在花在思考的时间和思考的深度上(后两者常常也是相关的)。

4.将思考成为习惯还有一个很大的好处

5. 重要的事情优先(详见史蒂芬·柯维的《高效能人士的七个习惯》《要事优先》)。

6. 重要的事情营造比较大的时间块来完成。

7. 多看心理学思维的书,因为它们是跨学科的。知识分两种,一是我们通常所谓的知识,即领域知识。二是关于我们的大脑吸收知识的机制的知识,后者不妨称为元知识。

8. 学习一项知识,必须问自己三个重要问题:1. 它的本质是什么。2. 它的第一原则是什么。3. 它的知识结构是怎样的。

9. 获得的多少并不取决于读了多少,而取决于思考了多少、多深。

10. 善于利用小块时间

11. 养成良好的习惯

有关时间管理的:

12.经常要反思

1) 你的问题到底是什么?(提醒自己思考不要偏离问题。)

2) OK,到现在为止,我到底有了什么收获呢?(提醒自己时不时去总结,整理学习的东西)。

3) 设想自己正在将东西讲给别人听(有声思考;能否讲出来是判断是否真正理解的最佳办法)。

4) 时常反省和注意自己的思维过程。

5) 养成反驳自己的想法的习惯

6) 人的思维天生就是极易流于表面来理解事物的

13. 重视知识的本质

14. 重视积累的强大力量,万事提前准备:计划订长一点,自然就可以多获得准备的时间。

15. 抬起头来:人的思维是非常容易只见树木不见森林的

16.杂项

1)        退订RSS

2)        总结总结最近得到的新知识吧

3)        看本书吧。传统的阅读和思考永远优于所谓的在互联网上汲取新知识

4)        制定简要的阅读计划:选出最近认为对你最有价值的书,先总览一下,决定阅读的顺序(哪些章节可以优先阅读)

有关阅读方法:

1. 趁着对一件事情有热情的时候,一股脑儿把万事开头那个最难的阶段熬过去

2. 根据主题来查阅资料,而不是根据资料来查阅主题

3. 好资料,坏资料好资料的特点:从问题出发;重点介绍方法背后的理念( rationale ),注重直观解释,而不是方法的技术细节;按照方法被发明的时间流程来介绍(先是遇到了什么什么问题,然后怎样分析,推理,最后发现目前所使用的方法)。 坏资料的特点是好资料的反面:上来就讲方法细节,丢掉了问题解决背后的思维过程。作者正在尝试在这里试着分析。

4. 学习一个东西之前,首先在大脑中积累充分的“疑惑感”。你对问题的疑惑越大,在之前做的自己的思考越多,当看到解答之后印象就越深刻。在大学里面的 课本总是瀑布式地把整个知识结构一览无余地放在面前,读的过程倒是挺爽,连连点头,读完了很快又忘掉了,为什么?因为没有带着疑问去学习。

5. 有选择地阅读。这里的选择体现在两个地方,一是选择 一本书中感兴趣的章节优先阅读。二是对一本书中技术性较弱或信息密度较低的部分快速地略读。一般来说在阅读的时候应该这样来切分内容:1. 问题是什么?2. 方案是什么?3. 例子是什么?

6. 为什么看不懂?如果看不懂一个知识,一般有如下几个可能的原因:

1)      你看得不够使劲。

2)      其中涉及到了你不懂的概念。这种情况就需要 Cross Reference 。如果一句话中用到了你不懂的概念,那就去查,

3)      作者讲述的顺序不对,你接着往下看,也许看到后面就明白了前面的了。

杂项

7. 如何在阅读之前就能获得对一本书质量的大致评估

基本上有几个线索:

1)      看作者。牛作者写的书一般都不错。

2)      看目录和简介。一份好的目录和简介能够透露这本书质量的相当一部分信息。目录结构是否清晰,是否直白(而不是装神弄鬼),都是衡量的线索。

3)      看 Amazon 上的评价,这里要注意的是,除了看整体打分之外,更要看打分最低的人是怎么说的,因为小众意见往往有可能来自那些真正懂行的人(除了来踢馆的),如果在打 分最低的意见里面看不到真正有价值的反驳意见的话就相当肯定书是不错的了。

4)      看样章。Amazon 上一般都可以随机浏览一些章节的,表达是否清晰,论证是否严谨,内容是否深刻,基本是几页纸就能看出来的。

8. 如何搜寻到好书

几个线索:

1)      同作者的著作。

2)      Amazon 相关推荐和主题相关的书列(类似豆瓣的豆列)。

3)      一本好的著作(或一份好的资料——不管是书还是网页)在参考资料里面重点提到的其他著作。

4)      有时对于一个主题,可以搜索到好心人总结的参考资源导引,那是最好不过的。

有关知识结构:

抓住不变量

1)      根据Joel Spolsky同学的说法(原文), 编程语言技术是对底层设备的封装,然而封装总是会出现漏洞的,于是程序员被迫下到“下水道”当中去解决问题,一旦往下走,漂亮的OO、N层抽象就不复存在 了,这时候不具备坚硬的底层知识就会无法解决问题。简而言之就是这些底层知识会无可避免的需要用到,既然肯定会被用到那还是预先掌握的好,否则一来用到的 时候再查是来不及的,因为essential的知识也往往正是那些需要较长时间消化掌握的东西,不像Ruby的mixin或closure这种翻一下 manual就能掌握的东西。

2)      如果你不知道某个工具的存在,遇到问题的时候是很难想到需要使用这么样一个工具的,essential knowldge就是使用最为广泛的工具,编程当中遇到某些问题之后,如果缺乏底层知识,你甚至都不知道需要去补充哪些底层知识才能解决这个问题。

3)      你必须首先熟悉你的工具,才能有效地使用它(须知工具的强是无敌的,但这一切得以“了解你的工具”为前提,甚至得以“了解目前可能有哪些工具适合你的问题”为前提)。

4)      分析问题解决问题的思维方法(这个东西很难读一两本书就掌握,需要很长时间的锻炼和反思)、判断与决策的方法(生活中需要进行判断与决策的地方远远多于我们的想象)

5)      学习一个小领域的时候,时时把“最终能够写出一篇漂亮的Survey”放在大脑中提醒自己,就能有助于在阅读和实践的时候有意无意地整理知识的结构、本质和重点,经过整理之后的知识理解更深刻,更不容易忘记,更容易被提取。

如果您对此感兴趣,可参考原文,这里这里这里,还有这里