易栈网-膘叔

浏览模式: 标准 | 列表 | 图文
[笔记]Ubuntu下修改网卡和DNS

[笔记]Ubuntu下修改网卡和DNS

纯粹是记录吧。在使用 UBUNTU 的时候,如果是ubuntu desktop,那配置起来是相当简单的,就象windows那样配置就行了,但如果是ubuntu server,怎么配置呢?当然是用ifconfig了。
很简单的命令:
ifconfig eth0 192.168.1.2 broadcast 192.168.1.1 netmask 255.255.255.0

  1. eth0是代表第一块网卡,因此,如果你不确认的时候,必须要使用ifconfig查看一下有几块网卡,想配置的是不是eth0
  2. 192.168.1.2是想要配置的IP
  3. broadcast 192.168.1.1 代表了网关
  4. netmask 就是子网掩码了

这样配置完还是不能上网的,因为还没有配置DNS,然后 vi /etc/resolv.conf ,在文件里加入:nameserver 202.96.209.133 ,当然这是上海地区所使用的DNS,有常见的几条,统统加进来就行了。

最后在命令行下执行:/etc/init.d/networking start,对刚才的配置进行重新启动,激活一下网卡配置。
OK,就可以上网了。。

后来我又看了点资料,发现网上还是有详解的:

ifconfig 是一个用来查看、配置、启用或禁用网络接口的工具,这个工具极为常用的。可以用这个工具来临时性的配置网卡的IP地址、掩码、广播地址、网关等。也可以把它写入一个文件中(比如/etc/rc.d/rc.local),这样系统引导后,会读取这个文件,为网卡设置IP地址
1 ifconfig 查看网络接口状态;

ifconfig 如果不接任何参数,就会输出当前网络接口的情况;

[root@localhost ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:C0:9F:94:78:0E
inet addr:192.168.1.88 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::2c0:9fff:fe94:780e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:850 errors:0 dropped:0 overruns:0 frame:0
TX packets:628 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:369135 (360.4 KiB) TX bytes:75945 (74.1 KiB)
Interrupt:10 Base address:0x3000

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:57 errors:0 dropped:0 overruns:0 frame:0
TX packets:57 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:8121 (7.9 KiB) TX bytes:8121 (7.9 KiB)

解说:
eth0 表示第一块网卡, 其中 HWaddr 表示网卡的物理地址,可以看到目前这个网卡的物理地址(MAC地址)是 00:C0:9F:94:78:0E ; inet addr 用来表示网卡的IP地址,此网卡的 IP地址是 192.168.1.88,广播地址, Bcast:192.168.1.255,掩码地址Mask:255.255.255.0

lo 是表示主机的回坏地址,这个一般是用来测试一个网络程序,但又不想让局域网或外网的用户能够查看,只能在此台主机上运行和查看所用的网络接口。比如把 HTTPD服务器的指定到回坏地址,在浏览器输入 127.0.0.1 就能看到你所架WEB网站了。但只是您能看得到,局域网的其它主机或用户无从知道;

如果想知道主机所有网络接口的情况,请用下面的命令;
[root@localhost ~]# ifconfig -a

如果想查看某个端口,比如查看eth0 的状态,就可以用下面的方法;
[root@localhost ~]# ifconfig eth0


2 ifconfig 配置网络接口;

ifconfig 可以用来配置网络接口的IP地址、掩码、网关、物理地址等;值得一说的是用ifconfig 为网卡指定IP地址,这只是用来调试网络用的,并不会更改系统关于网卡的配置文件。如果您想把网络接口的IP地址固定下来,目前有三个方法:一是通过各个发行和版本专用的工具来修改IP地址;二是直接修改网络接口的配置文件;三是修改特定的文件,加入ifconfig 指令来指定网卡的IP地址,比如在redhat或Fedora中,把ifconfig 的语名写入/etc/rc.d/rc.local文件中;

ifconfig 配置网络端口的方法:

ifconfig 工具配置网络接口的方法是通过指令的参数来达到目的的,我们只说最常用的参数;
ifconfig 网络端口 IP地址 hw <HW> MAC地址 netmask 掩码地址 broadcast 广播地址 [up/down]

* 实例一:
比如我们用ifconfig 来调试 eth0网卡的地址
[root@localhost ~]# ifconfig eth0 down
[root@localhost ~]# ifconfig eth0 192.168.1.99 broadcast 192.168.1.255 netmask 255.255.255.0
[root@localhost ~]# ifconfig eth0 up
[root@localhost ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:11:00:00:11:11
inet addr:192.168.1.99 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:11 Base address:0x3400

注解: 上面的例子我们解说一下;

第一行:ifconfig eth0 down 表示如果eth0是激活的,就把它DOWN掉。此命令等同于 ifdown eth0;
第二行:用ifconfig 来配置 eth0的IP地址、广播地址和网络掩码;
第三行:用ifconfig eth0 up 来激活eth0 ; 此命令等同于 ifup eth0
第四行:用 ifconfig eth0 来查看 eth0的状态;

当然您也可以用直接在指令IP地址、网络掩码、广播地址的同时,激活网卡;要加up参数;比如下面的例子;
[root@localhost ~]# ifconfig eth0 192.168.1.99 broadcast 192.168.1.255 netmask 255.255.255.0 up

* 实例二:在这个例子中,我们要学会设置网络IP地址的同时,学会设置网卡的物理地址(MAC地址);

比如我们设置网卡eth1的IP地址、网络掩码、广播地址,物理地址并且激活它;
[root@localhost ~]# ifconfig eth1 192.168.1.252 hw ether 00:11:00:00:11:11 netmask 255.255.255.0 broadcast 192.168.1.255 up
或
[root@localhost ~]# ifconfig eth1 hw ether 00:11:00:00:11:22
[root@localhost ~]# ifconfig eth1 192.168.1.252 netmask 255.255.255.0 broadcast 192.168.1.255 up

其中 hw 后面所接的是网络接口类型, ether表示乙太网, 同时也支持 ax25 、ARCnet、netrom等,详情请查看 man ifconfig ;


3.3 如何用ifconfig 来配置虚拟网络接口;

有时我们为了满足不同的需要还需要配置虚拟网络接口,比如我们用不同的IP地址来架运行多个HTTPD服务器,就要用到虚拟地址;这样就省却了同一个IP地址,如果开设两个的HTTPD服务器时,要指定端口号。

虚拟网络接口指的是为一个网络接口指定多个IP地址,虚拟接口是这样的 eth0:0 、 eth0:1、eth0:2 ... .. eth1N。当然您为eth1 指定多个IP地址,也就是 eth1:0、eth1:1、eth1:2 ... ...以此类推;

其实用ifconfig 为一个网卡配置多个IP地址,就用前面我们所说的ifconfig的用法,这个比较简单;看下面的例子;
[root@localhost ~]# ifconfig eth1:0 192.168.1.251 hw ether 00:11:00:00:11:33 netmask 255.255.255.0 broadcast 192.168.1.255 up
或
[root@localhost ~]# ifconfig eth1 hw ether 00:11:00:00:11:33
[root@localhost ~]# ifconfig eth1 192.168.1.251 netmask 255.255.255.0 broadcast 192.168.1.255 up

注意:指定时,要为每个虚拟网卡指定不同的物理地址;

在 Redhat/Fedora 或与Redhat/Fedora类似的系统,您可以把配置网络IP地址、广播地址、掩码地址、物理地址以及激活网络接口同时放在一个句子中,写入/etc/rc.d/rc.local中。比如下面的例子;
ifconfig eth1:0 192.168.1.250 hw ether 00:11:00:00:11:44 netmask 255.255.255.0 broadcast 192.168.1.255 up
ifconfig eth1:1 192.168.1.249 hw ether 00:11:00:00:11:55 netmask 255.255.255.0 broadcast 192.168.1.255 up

解说:上面是为eth1的网络接口,设置了两个虚拟接口;每个接口都有自己的物理地址、IP地址... ...


3.4 如何用ifconfig 来激活和终止网络接口的连接;

激活和终止网络接口的用 ifconfig 命令,后面接网络接口,然后加上 down或up参数,就可以禁止或激活相应的网络接口了。当然也可以用专用工具ifup和ifdown 工具;
[root@localhost ~]# ifconfig eth0 down
[root@localhost ~]# ifconfig eth0 up
[root@localhost ~]# ifup eth0
[root@localhost ~]# ifdown eth0

对于激活其它类型的网络接口也是如此,比如 ppp0,wlan0等;不过只是对指定IP的网卡有效。


注意:对DHCP自动分配的IP,还得由各个发行版自带的网络工具来激活;当然得安装dhcp客户端;这个您我们应该明白;

比如Redhat/Fedora
[root@localhost ~]# /etc/init.d/network start

Slackware 发行版;
[root@localhost ~]# /etc/rc.d/rc.inet1

戏说GoF设计模式

作者是转载的,我也来转载一下,呵呵。
我转载的地址为:http://www.cnblogs.com/okluo/archive/2009/02/27/1399247.html
不能怪我呀,原文中没有转载的链接

创建型模式

1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory

工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

2、BUILDER—MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语 言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你” builder。(这一定比美军在伊拉克用的翻译机好卖)

建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。

3、FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。

工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

4、PROTOTYPE—跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。(100块钱一份,你要不要)

原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减 少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。

5、SINGLETON—俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事)

单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。

结构型模式

6、ADAPTER—在朋友聚会上碰到了一个美女Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和Sarah之间的Adapter,让我和Sarah可以相互交谈了(也不知道他会不会耍我)

适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。

7、BRIDGE—早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头 发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题,自己用BRIDGE组合一下不就行了

桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。

8、COMPOSITE—Mary今天过生日。“我过生日,你要送我一件礼物。”“嗯,好吧,去商店,你自己挑。”“这件T恤挺漂亮,买,这条裙子好看, 买,这个包也不错,买。”“喂,买了三件了呀,我只答应送一件礼物的哦。”“什么呀,T恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。” “……”,MM都会用Composite模式了,你会了没有?

合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。

9、DECORATOR—Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写 上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起 来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?

装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。

10、FACADE—我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相 机有Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我拍张照片了。

门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。

11、FLYWEIGHT—每天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上 MM的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是Flyweight,MM的名字就是提取出来的外部特征,根据上下文情况使用。

享元模式:FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴 状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享 的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被 共享的对象。享元模式大幅度的降低内存中对象的数量。

12、PROXY—跟MM在网上聊天,一开头总是“hi,你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?”这些话,真烦人,写个程序做为我的Proxy吧,凡是接收到这些话都设置好了自动的回答,接收到其他的话时再通知我回答,怎么样,酷吧。

代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情 况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以 并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。

行为模式

13、CHAIN OF RESPONSIBLEITY—晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的MM哎,找张纸条,写上“Hi,可以做我的女朋友 吗?如果不愿意请向前传”,纸条就一个接一个的传上去了,糟糕,传到第一排的MM把纸条传给老师了,听说是个老处女呀,快跑!

责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接

起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情 况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。

14、COMMAND—俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我。 这不,她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气, 才请我吃面。”,:-(

命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和 发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统 支持命令的撤消。

15、INTERPRETER—俺有一个《泡MM真经》,上面有各种泡MM的攻略,比如说去吃西餐的步骤、去看电影的方法等等,跟MM约会时,只要做一个Interpreter,照着上面的脚本执行就可以了。

解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模 式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要 定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任 何排列组合都是一个语言。



16、ITERATOR—我爱上了Mary,不顾一切的向她求婚。

Mary:“想要我跟你结婚,得答应我的条件”

我:“什么条件我都答应,你说吧”

Mary:“我看上了那个一克拉的钻石”

我:“我买,我买,还有吗?”

Mary:“我看上了湖边的那栋别墅”

我:“我买,我买,还有吗?”

Mary:“你的小弟弟必须要有50cm长”

我脑袋嗡的一声,坐在椅子上,一咬牙:“我剪,我剪,还有吗?”

……

迭代子模式:迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容 器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代 子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。

17、MEDIATOR—四个MM打麻将,相互之间谁应该给谁多少钱算不清楚了,幸亏当时我在旁边,按照各自的筹码数算钱,赚了钱的从我这里拿,赔了钱的也付给我,一切就OK啦,俺得到了四个MM的电话。

调停者模式:调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会 立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协 作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。

18、MEMENTO—同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦。

备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

19、OBSERVER—想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦

观察者模式:观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

20、STATE—跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情 啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,当然你看 电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。

状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对 象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统 可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。

21、STRATEGY—跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦。

策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况 下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影 响到环境和客户端。

22、TEMPLATE METHOD——看过《如何说服女生上床》这部经典文章吗?女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八 大步骤(Template method),但每个步骤针对不同的情况,都有不一样的做法,这就要看你随机应变啦(具体实现);

模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类 可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

23、VISITOR—情人节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花都要针对她个人的特点,每张卡片也要根据个人的特点来挑,我一 个人哪搞得清楚,还是找花店老板和礼品店老板做一下Visitor,让花店老板根据MM的特点选一束花,让礼品店老板也根据每个人特点选一张卡,这样就轻 松多了;

访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式 适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很 容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的对 象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。

jQuery插件——文章自动生成导航

jQuery插件——文章自动生成导航

这个插件很实用,适合那种写着教程内容的页面,以前如果有多个标题的话,必须一个一个的加锚点,然后再加链接,这样不太方便。所以看到这个插件的时候,我忍不住记录下来。

代码我没有细看,我只看了demo,自己觉得还是很有用的。
代码来自CSSRain.cn,图片同样来自他那里。
网站说:

首先根据文章 自动在 右上角生成 导航菜单,
然后导航菜单可以 跟随 滚动条滚动 ,实时导航。
导航采用平滑方式,更人性化。

演示:
http://cssrain.cn/demo/createTitle/title.html

下载:
http://cssrain.cn/demo/createTitle/createTitle.rar

有问题 请留言, 只测试了 google 和 firefox 。

不过,IE或者其他的一些多窗口版的浏览器,会不会把它当成AD层屏蔽掉呢?
截图:
4b904d256102f55f2aa808736b6a6a8b
源码分流:
0aaf23c65f132be5afed04d6df108908

[图]Gmail改变附件选择方式和增加上传状态显示

[图]Gmail改变附件选择方式和增加上传状态显示

http://www.cnbeta.com/articles/78036.htm
这是一条来自cnbeta的新闻,看到这个我很惊讶,确实非常的惊讶。
如果说GOOGLE是采用activex来实现,我恐怕不会惊讶,要知道foxmail等就是采用了这种方法。
但事实上,没有......

在我的猜测里,它应该是采用FLASH实现的。因为在我的想像里,好象只有FLASH才能实现这种多文件上传。
我没有看到具体的源代码,这仅仅是我的猜测,但我确实希望这不是用flash实现的,因为他的进度条,并非用flash实现。

这是一个进步。或许是我们以前的思路出了问题?

服务器合托

服务器合托

本来不好意思写上来的,但想想,还是写上来吧。(穷,没办法,呵呵)
服务器征求合托,以下是服务器的资料,以及待托管的情况:

服务器型号:dell 2850
内存:512M * 4
硬盘:72*4+36*1,作raid 1,scsi硬盘,所以,可用的是144+18,除去系统占用空间,估计最少有100G可用。
托管:考虑是电信,暂不作双线考虑(目前在网通,大致准备6月份左右搬)
准备:提供SVN服务,WEB服务(LAMP + memcached + eacceraltra),(FTP可以考虑。)MAIL服务 坚决不考虑
(目前是windows系统,准备迁出后,大约有2天时间进行 LINUX或FREEBSD的安装配置)
(1k 10G 拍卖,筹够资金后就考虑搬迁,并不一定是非要在6月份,呵呵)

[为避免过于影响浏览者的视线,置顶时间为一个月,谢谢理解]

QQ:19129540
MSN:GOUKIXIAO%HOTMAIL。COM
不好意思,实在是为了防止被抓取到。

学做jQuery中的data()函数

学做jQuery中的data()函数

看到这个内容的时候,很吃惊,其实我在以前看到过一个R开头的网站时(记不清了,实在记不清了),他用JS做了一个cache函数,对函数做了缓存。还用了斐伯拉切函数做了测试。后来我根据他写的代码用jQuery写了一个类似的插件(它是把方法注册到了window对象里,所以加快了一些速度)。后来感觉这样的方法也同样可以用在数据上,又根据这样的想法写了一个存储数据的cache函数。也分别用在了两个不同的项目里。

如今又看到有人写这样类似的东西,就把他贴上来进行分享。

文章的内容来自:

原文如下:http://www.cssrain.cn/article.asp?id=1295

在jQuery中可以使用data()来给元素存储临时的变量:
// jQuery:
// Set data:
$(elem).data('customProperty', 12345);
// Get data:
$(elem).data('customProperty');

在mootools中可以使用store()来给元素存储临时的变量:
// MooTools:
// Set data:
elem.store('customProperty', 12345);
// Get data:
elem.retrieve('customProperty');


下面我们用JavaScript 自己动手写一个:
(function(){

var cache = [0],
expando = 'data' + +new Date();

function data(elem) {

var cacheIndex = elem[expando],
nextCacheIndex = cache.length;

if(!cacheIndex) {
cacheIndex = elem[expando] = nextCacheIndex;
cache[cacheIndex] = {};
}

return cache[cacheIndex];

}

window.data = data;

})();

使用:
var myElem = document.getElementById('id');
// 设置data:
data(myElem).customProperty = 12345;
// 获取 data:
data(myElem).customProperty; // returns 12345

// 用其他的变量
data(myElem).info = {
a : 123,
b : [4,5,6]
};


这个脚本其实很简单,就是往cache 数组里添加 下标 元素。
默认cache=[0] ,当 elem[expando] 没有获取到时,则往数组里 添加一个下标,同时下标又与数组是关联起来的。
如果elem[expando]获取到时,则直接返回 cache[cacheIndex] 。


这点搞定后,那就简单了,就是往一个空对象中 配置 属性了。



进一步修改函数:
// WITH ENCAPSULATION:
(function(){

var cache = [0],
expando = 'data' + +new Date();

function data(elem) {

var cacheIndex = elem[expando],
nextCacheIndex = cache.length;

if(!cacheIndex) {
cacheIndex = elem[expando] = nextCacheIndex;
cache[cacheIndex] = {};
}

return {
get : function(key) {
return cache[cacheIndex][key];
},
set : function(key, val) {
cache[cacheIndex][key] = val;
return val;
}
}

}

window.data = data;

})();

用法:
var myElem = document.getElementById('id');

// 设置data:
data(myElem).set('customProperty', 12345);

// 获取data:
data(myElem).get('customProperty'); // returns 12345


ok,一个类似jQuery的data()函数就完成了。


其实我自己还是觉得用对象更好处理一些,一来,对象不象数组,一定要用下标才能读取,而且对于对象的覆盖等,也方便很多。删除的话也容易。

给自己的备份:居住证评分标准

给自己的备份:居住证评分标准

最近上海的户籍政策作出了很大的变化,其实这也是很正常的。
上海的老龄化呈上升趋势,而社保资金随着社会老龄化的增长会逐渐不够使用,这时候怎么办?当然是需要有更多的人来为他们埋单,光靠上海现在这些年轻人肯定是不够的,于是新政策就会出来,吸引更多的人来加入埋单行列。
毕竟七年之长,才有机会加入上海户籍,但会有更多的人加入办理居住证的行列。(原先有很多人不愿意办,因为办了也是白办,又不在上海,交了这些钱都是白 交的,现在有动力了)

以下据说是现在的标准,好象是从02年开始的:
国内人才申领《上海市居住证》审核试行办法

第一条(依据)

根据市政府发布的《引进人才实行〈上海市居住证〉制度暂行规定》,制订本试行办法。

第二条(适用范围)

凡按规定申领《上海市居住证》(以下简称《居住证》)的国内人员,试行按要素计分审核。

第三条(用人单位)

本试行办法所称用人单位是指信誉良好,具有用人自主权,在本市行政区域内注册登记,符合本市产业发展方向的各类企业、事业、社团、民办非企业机构,以及住所在本市行政区域内的中央及外省市在沪单位。

第四条(评价计分体系)

本试行办法的评价计分体系由一般分和附加分两大部分、共14项要素组成,满分为120分。
一般分部分由基本分、专业能力分、导向分三小部分、共10项要素组成,满分为120分。
附加分由4项要素组成,满分为30分。
申领《居住证》者的得分,为两大部分、14项要素得分的累计分值;累计分值如超过120分,计为120分。

第五条(一般分)

一般分部分由基本分、专业能力分和导向分三小部分组成。

一、基本分部分满分为55分,由年龄、受教育程度、受聘情况、亲属关系、住房情况等5项要素组成。
(一)年龄
年龄项最高分为10分。
本项具体计分标准如下:
1、35周岁以下 10分
2、36??50周岁 5分
3、51周岁以上 0分
(二)受教育程度
受教育程度项最高分为25分,只计最高学历(学位);硕士、博士要求同时取得学历和学位。
本项具体计分标准如下:
1、博士 25分
2、硕士 23分
3、学士 21分
4、大学本科 20分
5、大专(高职) 10分
6、高中(含职校、技校、中专)及以下 0分
(三)受聘情况
受聘情况项最高分为10分,根据受聘于本市用人单位的情况计分。
本项具体计分标准如下:
1、以项目、任务等方式聘用 10分
2、聘用(劳动)合同期限在一年及以上 10分
3、聘用(劳动)合同期限不满一年 5分
4、未受聘 0分
(四)亲属关系
亲属关系项最高分为5分。
本项具体计分标准如下:
1、父母、配偶中有一人为本市户籍 5分
或配偶已取得3年及以上有效期《居住证》
或配偶要素累计分(不含本项分值)达到3年及以上有效期《居住证》标准分
2、其它 0分
(五)住房情况
住房情况项最高分为5分,“在本市有产权住房”是指本人为产权人或共有产权人。
本项具体计分标准如下:
1、在本市有产权住房 5分
2、其它 0分

二、专业能力分
专业能力分部分满分为35分,由专业能力和专业培训等2项要素组成。
“特殊才能”的人才,专业能力的计分标准另行制定。
(一)专业能力
专业能力项最高分为30分,同时符合两个及以上标准只计最高分值。“获得执业(职业)资格”根据不同的执业(职业)资格,给予5?15分。“拥有发明专利”是指由申请人发明创造的专利,经同行专家认定后根据专利水平给予5?10分。
本项具体计分标准如下:
1、两院院士 30分
2、博士生导师 25分
或获得国家级奖励
3、获正高级专业技术职务任职资格 20分
或受聘于事业单位正高级专业技术岗位
或受聘于机关担任局级以上职务
或受聘于企业高级管理或专业技术岗位,缴税月收入在10000元及以上
4、获副高级专业技术职务任职资格 18分
或受聘于事业单位副高级专业技术岗位
或受聘于机关担任处级以上职务
或受聘于企业中级管理或专业技术岗位、缴税月收入在5000元及以上
或获得省部级奖励
5、获中级专业技术职务任职资格 15分
或受聘于事业单位中级专业技术岗位
或受聘于机关担任科级以上职务
或受聘于企业一般管理或专业技术岗位,缴税月收入在2000元及以上
6、获初级专业技术职务任职资格 5分
或受聘于事业单位初级专业技术岗位
或受聘于机关担任一般职务
或受聘于企业初级专业技术岗位、缴税月收入在1000元及以上
7、获得执业(职业)资格 5?15分
8、拥有发明专利 5?10分
9、其它 0分
(二)专业培训
专业培训项最高分为5分。对于国家、本市和境外的专业培训证书,经认定给予1?5分。有多种证书分值可累计,但总分不超过5分。各类开展专业培训、发放专业培训证书的合法机构,可向市人事局申报专业培训证书认定,经认定后纳入本评价计分体系并予以公布。
本项具体计分标准如下:
1、取得经认定的专业培训证书 1?5分
2、未取得经认定的专业培训证书 0分

三、导向分
导向分部分满分为30分,由专业类别导向、产业(行业)导向、地区导向等3项要素组成。
(一)专业类别导向
专业类别导向项最高分为10分,根据年度人才开发目录划分紧缺、需要、控制。
本项具体计分标准如下:
1、紧缺 10分
2、需要 5分
3、控制 0分
(二)产业(行业)导向
产业(行业)导向项最高分为10分,“高新技术、软件、集成电路行业”指经市政府有关部门认定的上述行业的企业引进相关的人才;“本市重点发展产业(行业)”根据年度人才开发目录确定。
本项具体计分标准如下:
1、高新技术、软件、集成电路行业 10分
2、本市重点发展产业(行业) 10分
3、其它 0分
(三)地区导向
地区导向项最高分为10分,重点发展地区根据年度人才开发目录确定,要求居住地、工作地同时在重点发展地区。
本项具体计分标准如下:
1、重点发展地区 10分
2、一般地区 0分

第六条(附加分)

附加分部分最高分为30分,包括同行专家推荐附加分、人才在沪投资创业附加分、境外工作或学习经历附加分以及根据国家和本市法规规定经核定给予的附加分等4项要素,4项要素的得分可累计,但最高不超过30分。
(一)同行专家、行业协会或行业主管部门推荐附加分
同行专家、行业协会或行业主管部门推荐附加分项最高分为20分,如有多名专家和行业协会或行业主管部门同时推荐只计最高分。行业协会或行业主管部门向市人事局提出申请,经市人事局备案同意后具备推荐本行业“特殊才能”人才的资格
本项具体计分标准如下:
1、两院院士推荐 20分
2、行业协会或行业主管部门特别推荐 15分
3、博士生导师推荐 15分
4、其它 0分
(二)人才在沪投资创业附加分
人才在沪投资创业附加分项最高分为20分。在沪投资额可累计;如创办多个企业及机构,缴税额可累计,聘用本市员工人数可累计。
本项具体计分标准如下:
1、投资额在1000万元人民币及以上 20分
或投资创办的企业连续三年缴税额在100万元及以上
或投资创办的单位聘用本市员工100人及以上
2、投资额在500万元人民币及以上 15分
或投资创办的企业连续三年缴税额在50万元及以上
或投资创办的单位聘用本市员工50人及以上
3、投资额在300万元人民币及以上 10分
或投资创办的企业连续三年缴税额在30万元及以上
或投资创办的单位聘用本市员工30人及以上
或在本市投资创办民办非企业机构
4、投资额在100万元人民币及以上 5分
或投资创办的企业连续三年缴税额在10万元及以上
或投资创办的单位聘用本市员工10人及以上
5、其它 0分
(三)境外工作或学习经历附加分
境外工作或学习经历附加分最高分为10分,经历应当连续,不得累计;有多次经历只计最高分。
本项具体计分办法如下:
1、有一年及以上境外工作或留学经历 10分
2、有三个月及以上境外学习或工作经历 5分
3、其它 0分
(四)根据国家和本市法规规定经核定给予的附加分
根据国家和本市法规规定给予的附加分项最高分为20分,是指国家和本市的有关法律、法规和规章有相应规定,经市人事局核定后可给予5?20分。
本项具体计分办法如下:
1、法规有相应规定 5?20分
2、其它 0分

第七条(标准分)

一、暂未被本市用人单位聘用的本科及以上学历人员,要素累计分值在50分及以上者,可办理有效期为6个月的《居住证》。
二、已被本市用人单位聘用或在本市投资创业的人员,可按要素累计分值分别办理1年、3年、5年有效期的《居住证》:
1、分值在90分及以上者,可由申请人任选办理三种有效期的《居住证》;
2、分值在89分以下、70分及以上者,可由申请人选择办理3年及以下有效期的《居住证》;
3、分值在69分以下、60分及以上者,可办理1年有效期的《居住证》。

第八条(本办法的调整)

市人事局根据人才引进宏观调控的需要,及时确定、调整并公布申领6个月、1年、3年和5年有效期《居住证》的条件和标准分。

第九条(附则)

本试行办法自2002年6月15日起实行。

纯粹是一个备份

关于set names

关于set names

一般我们在设置数据库字符集的时候,都是用mysql_query('set names utf8')这样来处理,但其实这样处理的不全,象discuz等都是采用了全部的操作,它是这样的:mysql_query('character_set_connection=utf8, character_set_results=utf8 character_set_client=binary'),也只有这样,才会比较全面。
仔细看手册 ,手册上也这样写着:
  Note: This is the preferred way to change the charset. Using mysql_query() to execute SET NAMES .. is not reccomended.

那么,我们该怎么处理呢?从PHP5.2.3开始多了一个函数,它就是:mysql_set_charset,你可以:

<?
$conn = .... //假设这是连接后的 resource ID
if( mysql_client_encoding ( $conn) != 'utf8' ){
mysql_set_charset('utf8');
}
这样才是比较推荐的用法。不过,这样的用法也是有要求的,手册告诉我们:

Note: This function requires MySQL 5.0.7 or later.

传说需要采用这样的方法,是因为set names在某些字符集的时候有安全隐患。

TP单字母函数整理

TP单字母函数整理

这是一篇TdWeb的笔记,在征得他的同意后,我放了上来。他最初是为Lite版本写的,但现在这些单字母函数在标准版里也都同样存在了。因此这些资料在两个版本的ThinkPHP中都同样适用。由于Tdweb偷了点懒,部分代码都是直接复制过来的,所以,我稍做了一下整理(主要是页面样式的稍做更新,同时对于部分语句进行了一些更新,tdweb莫生气)
原文网址:http://bitctw.cn/hl/docs/
原文如下:(我仅针对单字母函数作介绍)

  TP所有单独的函数,除了两个用来生成项目的buildAppDir之类的,其余都在框架目录/Common/functions.php这个文件里。

  有人不太喜欢TP这种单字母函数,其实这也是TP的一个特色,如果理解了这些函数的作用,不管是背,还是写,都是非常方便的,接下来我们以字母顺序开始。

A函数(基本是Action的简写)

  A函数是用来实例化我们的Action类的,例如我们的程序有2个Action分别是IndexAction和TestAction,在 IndexAction中有个myHello方法能够输出hello world,如果我也想在TestAction中也输出同样一段文字怎么办?最原始的方法首先我们导入IndexAction.class.php这个文 件,然后new IndexAction,最后调用myHello方法才行。

代码一般为 :

<?php
import("@.Action.Index");
//导入本项目目录下Action目录下的Index.class.php文件。
class TestAction extends Action{
public function index()
{
$index=new IndexAction();//实例化IndexAction
echo $index->myHello();//调用myHello()方法
}
}
?>

那么,如果我们用A函数,怎么写呢?

<?php
class TestAction extends Action{
public function index()
{
$index=A("Index");
echo $index->myHello();
}
}
?>

  呵呵,少写很多代码吧。当然,这还不是最偷懒的方法,请看下边的R()函数,就知道什么是偷懒的极致了。

B函数

  这是随着行为应运而生的新生函数,可以执行某个行为,例如B('app_begin');就是在项目开始之前,执行这个行为定义的所有函 数,支持2个参数,第二个参数支持需要接受一个数组,例如B('app_begin',array("name"=>"tdweb","time"=>time()));这样。

C函数

  获取配置值,这个大家用的应该不少。虽然使用方便,但是C函数无疑是一个非常强大的函数。

获取值:  
获取所有设置:C(); 不传递任何参数,返回一个包含所有设置的数组。
获取指定配置:C('URL_MODEL') 这样就能得到URL_MODEL的配置信息
获取指定二维数组配置:C("array.name"),这样就返回数组array下的key为name所对应的值

设置值:
为二维数组赋值C("array.name","value"),原理同上(获取array.name的值),后边的value是值

批量赋值:
$test=array("URL_MODEL"=>1,"THIN_MODEL"=>true");
C($test);
这样直接将数组里的值赋值了

判断是否赋值:
C("?URL_MODEL")这样前边加个"?",如果已经赋值,则返回true

  需要说明的是,这里虽然更改了配置的值,但是仅仅是这个页面做了更改,到下个页面就不起作用了,如果想改就永久更改,那么需要配合F函数,将配置文件写入config.php才行。

D函数

  DAO函数应该是我们写程序用的最多的函数了。和A函数类似,如果不使用D函数,就需要导入Model,然后new Model,剩下都是一样的。

  但是D函数有2个有点,一是如果之前实例化过这个Model,那么就不再实例化了,剩资源;二是方便调试,如果不存在 这个Model,会抛出TP异常,非常人性化。

  如果访问本项目的Model直接D("Model名称");就可以了,如果打算跨项目访问,就使用 D("Model名称","项目名称");其他的就没什么说的了

F函数

  快速读取和保存文件数据

  快速保存数据:F("mydata","这里是要保存的数据"),这样就在项目Data目录下保存了一个名叫mydata.php的文件,里边的内容是该函数的第二个参数。

  指定保存时间 :F("mydata","这里是要保存的数据","60"),这样,如果下次再访问,间隔大于60秒则删除次缓存文件。

  指定保存目录:F("mydata","这里是要保存的数据","60",DATA_PATH) ,这样就指定保存在data目录下

  立即删除缓存:F("mydata",null),第二个参数传递一个null值,这样就删除了mydate这个缓存

  读取缓存数据:F("mydata"),这样就读取这个缓存了

L函数

  语言定义函数,L("intro")获取定义成intro的语言,l("intro","介绍")为intro赋值,关于这个赋值的长久性,道理同C函数一样。

R函数

  还记得我们的A函数吧,如果仅仅想执行某个方法,其实用R函数更方便,刚才的可以替换成

<?php
class TestAction extends Action{
public function index()
{
$index=R("Index","myHello");
echo $index;
}
}
?>

呵呵,是不是更简单?

S函数

  全局缓存读写函数,和C类似,不过是直接写成文件的哦,写在Temp目录下,不过在缓存有一点需要注意,如果缓存名称是aaa,那么缓存生成的文件名称就是md5("aaa")的值,值得注意。

U函数

  U函数是很强大的一个函数,它主要是进行URL组装,同时支持不同模式和路由

例如:
取得当前模块的Action地址 :U("/nowMethod");
取得当前模块的Action地址,并传递参数:U("/nowMethod?params=test");

  (如果不习惯上边那种方式,可以使用U("/nowMethod",array("params"=>"test");这样的数组方式传递参数,效果是一样的)

  访问其他模块的方法:U("Other/otherMethod"),这样就是访问Other模块下的otherMethod方法
跨项目访问:U("appname://Other/otherMethod");
使用路由访问:U("appName://routeName@moduleName/actionName?params");

  另外,如果想直接跳转,那么就在第二个参数写1,例如U("/nowMethod",1);这样就直接调转到指定URL了

  好了,介绍了TP的9大函数,相信你或多或少也有些了解了吧。如果想了解更多更好的功能,请看function.php的代码,注释很详尽

稍微排版了下,也删了点不太和谐的内容,希望可以给大家带来帮助。。

还是IBM网站上的WEB 2.0 资料

还是IBM网站上的WEB 2.0 资料

不可否认,IBM在开发者资源方面做的还是挺不错的,虽然有偏重于IBM自己的工具的倾向,但对于WEB方面的资源还是很多。

对于英文不好的同学,可以查看:http://www.ibm.com/developerworks/cn/

这里的资料是全部中文的,当然你还可以有取向,比如我是做WEB的,我一般就看:http://www.ibm.com/developerworks/cn/web20/ ,WEB2.0的相关资源

如果你对自己写的文章有自信,你也可以去投稿,以期让更多的人了解你,投稿网站在:http://www.ibm.com/developerworks/cn/author/

会让你根据征稿内容和您的特长,然后下载WORD模版写好后发给网站,审核后就会公布哦。