windows7下安装Memcached

系统:Windows7

Memcached版本:memcached 1.2.4 Win32 Beta

在执行以下命令并没有得到成功的信息:

d:\memcached>memcached -d install

failed to install service or service already installed

d:\memcached>memcached -d start

failed to start service

我只是按常理“开始”-“运行”输入:cmd,结果你懂得……

解决办法就是以管理员身份运行CMD,怎么做呢?在开始-附件-右击“命令提示符”,以管理员身份运行,重新执行安装和启动指令就可以了。

你准备好写jQuery插件了吗?

开始之前我得先声明关于几点jQuery的概念:

1、$是jQuery的简写,任何出现$()的地方你都可以转换成jQuery()。

2、jQuery.fn只是jQuery.prototype的一个别名而已。但前提是你要知道JavaScript里面prototype是什么意思。JavaScript prototype整理

OK,如果你清楚上面两个概念,那么我们进入正题:

jQuery提供两种实现插件机制:jQuery.extend(object)、jQuery.fn.extend(object)。

一、jQuery中的$.extend

$.extend也就是支撑起jQuery插件半天边吧,所以我们还是得先了解一下他:

$.extend(object) 将object对象逐个复制给jQuery对象。

问题:

$.extend({ showMsg: function(msg) {  } });

$.showMsg = function(msg) { }

这两者是没有区别,只是第二种方式看起来更加简洁(至少我喜欢这样子写),当然$.extend支持更加复杂操作,比如:

$.extend({

min: function(a, b) { // do something },

max: function(a, b) { // do something }

}); // 逐个将min、max方法复制给jQuery对象。

当然还可以提供另一个对象,并不一定非要复制给jQuery对象,比如:jQuery.extend({ args:'我是args属性' }, options); // 将args复制给options对象

理解上面这些将对我们后面写插件很有帮助。

二、jQuery.extend(object)

扩展jQuery对象本身,意思就是说在jQuery对象本身增加新函数。

当然这是针对jQuery做的一个扩展,实际上你也可以这么写:

jQuery.extend({ pluginName: function(args) { } });

当然还有更简洁、更漂亮的办法:

jQuery.pluginName = function(args) {}

它的使用方法非常简单:$.pluginName(‘我就是这么被调用的’);

jQuery官网就提供一个cookie插件,她就是使用这种插件机制实现的,感兴趣的同学可以看看

三、jQuery.fn.extend(object)

扩展 jQuery 元素集来提供新的方法,绝大部分我们都需要通过jQuery筛选出来一些元素集,然后对元素集进行操作,所以呢,这种插件机制也成了首选。

jQuery.fn.extend({  // 上面已经提到extend如果有多个成员、方法都将会逐个复制给jQuery
 check: function() {
 return this.each(function() { this.checked = true; });
 },
 uncheck: function() {
 return this.each(function() { this.checked = false; });
 }
 });

实现全选和非全选两个插件。

使用方法:$("input[type=checkbox]").check(); // 全选所有checkbox选项框

其中:$("input[type=checkbox]") 是一个元素集。

四、我需要很多参数

很多情况下,我们需要传递很多参数,但是绝大部分又是可选的,比如一个基于FLASH来切换图片效果示例(这在大部分网站里面都会出现的):

$.fn.SwfSlide = function(options) {

options = $.extend({ // 上面我已经讲明了,$.extend可以将对象复制到另一个对象上,而实现可选参数方法是通过她来实现
 swfFile: '/images/pixviewer.swf?1',
 fwidth: 200,  // 默认宽度
 fheight: 160, // 默认高度
 theight: 18,
 files: '',
 links: '',
 texts: ''
 }, options || {});

}

这里面有七个参数,但是当你在调用的时候你不需要七个全指明,也许你只要三个,像这样:$(‘div’).SwfSlide({ files:”, links:”, texts:” });

五、可不是这么就完了

JavaScript脚本框架非常多,最经典像是prototype、yui、mootools等等,如果说一个项目运用多套框架的话,遇到最多关于$冲突问题。jQuery本身提供一些多库共存的解决方案。但是做为我们基于jQuery来写插件,我们还是要考虑到这个多库共存带来的问题。

其实也只是非常简单的一个技巧,将插件代码放到一个包裹器里面:

(function($) {

// 插件代码

})(jQuery); // javascript的匿名对象,强制jQuery对象传递给$,确保我们插件里面使用$都是jQuery对象。

jQuery Boilerplate 插件模板

    // 这个分号的作用是防止和其他jquery插件合并时,别人不规范的jquery插件忘记使用分号结束
    //影响到我们当前的插件,导致无法运行的问题。 
    ;(function ( $, window, document, undefined ) {

            // undefined作为形参的目的是因为在es3中undefined是可以被修改的
            //比如我们可以声明var undefined = 123,这样就影响到了undefined值的判断,幸运的是在es5中,undefined不能被修改了。
            // window和document本身是全局变量,在这个地方作为形参的目的是因为js执行是从里到外查找变量的(作用域),把它们作为局部变量传进来,就避免了去外层查找,提高了效率。

            // 声明默认属性对象
            var pluginName = "defaultPluginName",
                    defaults = {
                    propertyName: "value"
            };

            // 构造函数
            function Plugin ( element, options ) {
                    this.element = element;
                    // 将默认属性对象和传递的参数对象合并到第一个空对象中
                    this.settings = $.extend( {}, defaults, options );
                    this._defaults = defaults;
                    this._name = pluginName;
                    this.init();
            }

            // 为了避免和原型对象Plugin.prototype的冲突,这地方采用继承原型对象的方法
            $.extend(Plugin.prototype, {
                    init: function () {
                                // 初始化,由于继承自Plugin原型,
                                // 你可以在这里直接使用this.element或者this.settings
                            console.log("xD");
                    },
                    yourOtherFunction: function () {
                            // some logic
                    }
            });

            // 对构造函数的一个轻量级封装,
            // 防止产生多个实例
            $.fn[ pluginName ] = function ( options ) {
                    this.each(function() {
                            if ( !$.data( this, "plugin_" + pluginName ) ) {
                                    $.data( this, "plugin_" + pluginName, new Plugin( this, options ) );
                            }
                    });

                    // 方便链式调用
                    return this;
            };

    })( jQuery, window, document );

相比较有这么一个用于开发jQuery插件基础模板,自己写插件也会规范许多。

另外我还写过一篇关于Bootstrap插件开发概述,他所用的jQuery插件开发模板也是非常值得学习的地方。

搜索引擎lucene.net-开篇

没心情说点什么了,反正最近最主要是跟lucene.net打交道,就做个综合的文章吧,说不定哪天我忘记了还可以用得上。

什么是Lucene

Lucene是有很多个版本,而Lucene.net就是针对.NET。

Lucene是一个信息检索的函数库(Library),利用它你可以为你的应用加上索引和搜索的功能.Lucene的使用者不需要深入了解有关全文检索的知识,仅仅学会使用库中的一个类,你就为你的应用实现全文检索的功能.不过千万别以为Lucene是一个象google那样的搜索引擎,Lucene甚至不是一个应用程序,它仅仅是一个工具,一个Library.你也可以把它理解为一个将索引,搜索功能封装的很好的一套简单易用的API.利用这套API你可以做很多有关搜索的事情,而且很方便.

Lucene能做什么?

她可以对任何可以转化成文字格式的资源(E.G:HTML.WORD.PDF…)做索引以及搜索。

如何得到她?

你可以通过SVN下载最后版的lucene.net版本,这里有一份历史版本列表:https://svn.apache.org/repos/asf/lucene/lucene.net/tags/

资源

当我去GOOGLE关键字:lucene.net会有非常多的资源,包括系列教程、优化问题等等都很全面。

python class

从接触python开始大部分都是基于Django进行开发,做的相对于简单得多。而python一切都是面向对象,今天需要做一个功能模块的封装,中间遇到关于继承、私有变量(方法)记录下一些开发中遇到的问题。

1、2.2版本以后使用new style class,任何类都必须继承某个类,如果不需要继承某个类也要继承object。当然如果你还是用老办法来处理子类对父类初始化的话,那就不需要关心这个。


class People(object):
 # 姓名
 name = None
 def __init__(self, name = None):
 self.name = name

 class Student(People):
 def __init__(self, name = None):
 #如果使用super对父类声明的话,哪怕父类不需要继承对象的话,那必须继承object对象
 #老办法不再说明
 super(Student, self).__init__(name)


2、私用变量,具体用法看Python Document,需要注意的是不管是公共变量(方法)、私用变量(方法),在类内部使用他们都加上self.,也许这个习惯可以给你带来开发‘乐趣’。

Django框架笔记-国际化

实现一次国际化真的累死我了,中间的过程就让我非常郁闷,先做一笔记录,给以后做个提醒:

先给复习一个课程:GNU gettext 说简单点就是由于提供一套完整的国际化解决方案,目前绝大部分国际化组件都基于此。

Django本身是完全国际化了的,具体为Python自带的标准模块 gettext。当然了,如果不需要国际化,那还是关掉它可以为Django节省一点开销。

对你的Django应用进行国际化的三个步骤:

  1. 第一步:在你的python代码和模板中嵌入待翻译的字符串。
  2. 第二步:把那些字符串翻译成你要支持的语言。
  3. 第三步:在你的django settings文件中激活做要地区的中间件。

如何做这三步,我后面有相应链接并且是中文的,我呢?只是谈谈中间遇到的一些问题,但是建议你先看完再去读文档,那样就比较不会迷糊:

第一:simplejson和ugettext_lazy冲突

在使用AJAX的时候,JSON是最适合不过的数据传输了,但是由于ugettext_lazy返回的是一个object对象,无法正常的显示数据,你可以使用ugettext实现国际化字符串,要不然你可以这样使用:


u"%s" % ugettext_lazy('操作成功')


第二:生成PO文件

当你的Python、模板、脚本中已经做好编码以后,接下来你只要用工具生成PO文件。而Django已经帮你做了这件事,所以如果你只要通过简单的命令自动帮你生成:

生成出python代码和模板中的字符串命令:django-admin.py makemessages -l zh_CN 其中“zh_CN”是语言类型,你可以改成en、zh_TW等等,这里生成后的文件会存在这么一个目录结构表中

  • $APPPATH/locale/<language>/LC_MESSAGES/django.(po|mo)
  • $PROJECTPATH/locale/<language>/LC_MESSAGES/django.(po|mo)
  • All paths listed in LOCALE_PATHS in your settings file are searched in that order for <language>/LC_MESSAGES/django.(po|mo)
  • $PYTHONPATH/django/conf/locale/<language>/LC_MESSAGES/django.(po|mo)

假设我的项目根目录下建立个locale目录,那么当我执行 django-admin.py makemessages -l zh_CN 自动生成/projectname/locale/zh_CN/LC_MESSAGES/django.(po|mo)。

假设我现在需要增加一下英文版,我只需要django-admin.py makemessages -l en

第三:翻译

有了PO文件,接下来就是翻译。专业一点的话用Poedit(呵呵,非常方便的工具,如果想翻译PO文件建议使用它),否则随便找个编辑器打开它自己改里面的代码,但真的会眼花的,如果你需要翻译量较大的话。

注:Django生成的PO文件使用Poedit保存时会出现一个错误提示,那是因为缺少工程信息,从“类目”》“设置”填写完整的信息后即可。

第四:脚本国际化小插曲

文档中介绍动态生成脚本链接:

<script type="text/javascript" src="{% url django.views.i18n.javascript_catalog %}"></script>
总是出现异常,可以使用
<script type="text/javascript" src="/jsi18n/"></script>
原因不明,是我没有去查。

简化操作

我的项目里面有三种语言:英文、简体中文、繁体中文,所以我做了一个BAT文件,如果点一下自动生成数据:

@ECHO OFF
cd E:\Python\WEB\mood\
cd e:
echo 开始制作Python、HTML的PO文件
django-admin.py makemessages -l zh_CN
django-admin.py makemessages -l zh_TW
django-admin.py makemessages -l en
echo 完成
echo 开始制作JavaScript的PO文件
django-admin.py makemessages -d djangojs -l zh_CN
django-admin.py makemessages -d djangojs -l zh_TW
django-admin.py makemessages -d djangojs -l en
echo 完成
echo 开始编译PO文件
django-admin.py compilemessages
pause

哈哈,很开心的告诉你,你不用担心他的生成会破坏我原有已经翻译好的数据,因为Django已经很智能的帮你处理新数据、删除已经存在PO文件中的数据。

参考资料



			

Django框架笔记-开篇

越来越喜欢Python这种动态编译语言,一个简单的DOS窗口,可以做只要你想得到的事。在很早以前我有过对Python的简单了解,也是直到最近在学习正则表达式才重新对她进行较深入的学习,而这一篇主要还是说一下关于Django框架,她是WEB框架中的一种,其主要选择是因为她的风格和我自己的风格很相像。

一、安装

http://www.djangoproject.com/download/可以下载到最新版,可以放在任何目录下然后执行:python setup.py install。测试一下吧:

>>> import django
>>> django.VERSION
(1, 1, 0, final', 1)

二、创建一个项目

转到Django目录:django-admin.py startproject mysite 其中mysite是项目名称。自动在Django目录下生成mysite目录。

三、运行开发服务器

Django开发服务是可用在开发期间的,一个内建的,轻量的WEB服务,所以在开发过程中无须使用产品级的WEB服务(比如:Apache),只需要执行:python manage.py runserver 8080 当然必须在mysite目录下。你可以通过http://127.0.0.1:8080来访问您的站点。

四、模型(Django数据库层)

(一)、配置数据库,缺省都在:settings.py

(二)、创建模型

在mysite目录下执行:python manage.py startapp books她会自动创建几个模型相关文件在mysite目录下。当然这不是说你就创建一个模型了,我们还得写一些代码。这里的Django模型只是用Python代码形式描述数据在数据库中的定义。

第一步:编写生成文件当中的models.py用Python代码来描述你的模型。

第二步:安装模型。

这一步你需要修改settings.py中INSTALLED_APPS项,把你创建的模型添加到列表中,以便告诉Django需要激活这个模型。你可以先使用python manage.py validate来验证你是否已经正确,如果有错误会明细指出。你还可以用python manage.py sqlall books命令先检查一下Django为你生成的SQL命令是否正确,当然这需要跟你目前配置的数据库来判断。最后用python manage.py syncdb命令来同步你的模型和数据库定义,她傻了一点只会增加你不存在的表,不能同步模型的修改数据库,当然还是有办法的。

第三步:一起HIGHT一下

你可以通过SHELL窗口完成不可思议的操作:

>>> from books.models import Publisher
>>> publisher_list = Publisher.objects.all()
>>> publisher_list
[<Publisher: Apress>, <Publisher: O'Reilly>]

五、Django站点管理

这是Django内置的,你只需要简单配置就可以有一个简单漂亮的站点管理平台,你可以通过他来做一些数据增删改动作。

第一步:对setting.py一点改动

  1. django.contrib.admin加入到INSTALLED_APPS
  2. django.contrib.auth、django.contrib.contenttypes、django.contrib.sessions加入到INSTALLED_APPS
  3. django.middleware.common.CommonMiddleware、django.contrib.sessions.middleware.SessionMiddleware、django.contrib.auth.middleware.AuthenticationMiddleware加入到MIDDLEWARE_CLASSES

第二步:运行python manage.py syncdb同步站点管理需要的数据库表。

第三步:将admin访问配置在URLconf。

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
  (r'^admin/', include(admin.site.urls)),
)

接下来还有什么呢?

The Django Book这里你可以获取到很完整的Django教程,当然他是中文的。

当然也有像The Definitive Guide to Django: Web Development Done Right权威书籍。

最后可别忘了http://www.djangoproject.com/比任何资源来得好,提供非常完整的文档,如遇到BUG咱们上面有人。 😎

© 2017 卡片机色彩 沪ICP备13032872号-3

Theme by cipchk

to top