e迹江湖—阿度

电子商务、网站建设、Linux、PHP……

用户体验的目标是,做到“自然”

个人对用户体验的目标是,做到“自然”。

  举几个例子,

  1,我观察3岁的小孩用iphone很容易上手。比如,iphone的开锁,小孩甚至不用学就会用。因为触摸是人的天性,同时iphone通过箭头图标,向右滑动的文字条(小孩看不懂文字),来暗示手指触摸向右滑动来解锁。自然和人的天性是一致的。大人因为成年后受污染较多,反而不一定立即学会iphone解锁,可能需要看文字解释来理解。所以不识字的小孩可能比老年人更快学会使用iphone。需要用文字来解释的交互不是好交互。

  2,Apple在“自然”体验上做了很多尝试。比如,通常PC下的“文件夹”(甚至“文件”)是不太自然的电脑概念,被从iOS里面取消(文件只有和能解释它的应用关联才有意义)。MacOS尝试改变触控板的传统滚动方向,将手指滑动改为和内容一致的方向,并称之为“自然”模式,即,以前的触控板的滑动方向是“不自然”的。这样的改变很需要勇气,但也许Apple觉得长远来看更自然的模式才更有生命力,哪怕暂时会改变用户习惯而让用户不适应。

  3,自然往往和人的本性相关的。微信的摇一摇是个以“自然”为目标的设计。“抓握”,“摇晃”,是人在远古时代没有工具时必须具备的本能。手机提供了激发人类这项远古本能的条件。设计“摇一摇”时,目标是和人的“自然”或者说“本能”动作体验做到一致。摇一摇的体验包括:动作 – 摇动;视觉 – 屏幕裂开并合上来响应动作; 听觉:有吸引力(男性是来福枪,女性是铃铛)的声音来响应动作;结果 – 从屏幕中央滑下的一张名片。整个界面没有菜单和按钮。但几乎没有比它更简单的交互体验了。感谢手机,让远古时代人们通过投掷石头来“连接”到其他人,进化到摇动手机来虚拟地“连接”人。

  摇一摇上线后,很快就达到每天一亿次以上的摇一摇使用次数。“简单而自然”的体验人人都会用,并且因为“自然”,而“自然而然”地去用它。它也没有高端和低端人群之分。摇一摇给我们的最大启示是,一种通过肢体而非鼠标(甚至触屏)来完成的交互,也许代表了未来移动设备的交互方向(bump在这方面做得更早)。(顺便说下,经常有人说微信摇一摇是学line的,事实上,我们做摇一摇的时候,还不知道有line这个软件。考据一个应用“抄袭”了谁,除了获得心理安慰之外,并不能提升自身的能力)

  pony三年前曾经送给很多人一本书,《don’t make me think》,光从字面理解,也是这个意思。自然的体验是不需要用户去思考的。我个人也欣赏原研哉等设计师的设计理念,设计应当挖掘人的本原的体验倾向。

  “自然”并不只是在交互等体验上体现,更是一种思维方式。程序员都知道面向对象的方法的核心是更“自然”的对复杂事物的建模方法,“分类”是其核心之一。同样地,产品经理在面对一个复杂问题时,需要有一种符合“自然”原则的建模方法,来通过产品结构模块以及模块之间的联系来映射和解决问题。没有开发训练的人同样可以建立“自然”思维方式,事实上,“分类”是人类模式化和识别外部世界的本能方式,如果有意识地对任何问题都从“分类是否合理”的角度来考察,时间长了,会建立起直觉式的分类感觉,而避免形成“大杂烩”式的结果。而对任何一个界面和交互,同样可以用“don’t make me think”或者“是否自然到人人都能自然而然地使用”来反复思考。

  比如,我们会鼓励每个界面尽可能有且只有一个突出的按钮作为用户不用思考就默认去点的操作点。当思考过一千个界面的交互后,对哪些交互是自然的哪些是不自然的就会很容易判断到。即便对于司空见惯的体验点,加以反思也会发现改进余地,比如,对一个列表,需要显示总的条目数吗(比如通讯录有多少人,用户需要这个数字吗)?一个进度条,需要显示百分比吗?数字对用户是自然能接受的反馈吗?

  “自然”可能容易导致玄学,因此这里想强调的是,“自然”的思维方式一般是需要长期的非常理性的训练才能获得,而不是突然幻想自己获得了一种使用“自然原则”的能力。记得知乎上有个问题问“乔布斯为什么能凭直觉知道该怎么做”。我认为没有任何人有天生的可重复的直觉来立即成为一个领域的专业人员。比如,对于复杂事物,如何“抽象”为一个简单模型,是需要大量案例锻炼的。但是,如果经过一万小时的有意识的朝某个方向的训练(比如对“自然”的反复思考和实际工作练习),并且是极为理性的思维和实践训练,是可以获得一些直觉的。大量的理性训练有助于形成一种对同类事物的识别模式,这种模式形成直觉。比如大部分中国人其实是没有经受过“简单是美”的训练的,表现在现实中,很多人其实是很难接受一套极简主义的装修风格的居室的。只有当对“极简”有反复体验和思考,才能将“简单是美”变成骨子里的审美观,并体现在设计中。

  简单和自然是什么关系?简单为什么就美了?留给你去想。

我们知道,PHP进行数据库查询首先需要建立数据库连接,而频繁的数据库连接会占用较多的系统资源,从而导致服务器的结果响应变慢。为了减小这种请求开支,我们会想到减少数据库连接次数。那有没有必要在查询结束时对连接进行关闭呢?

首先看PHP手册中的下面这段表述:

PHP 会为向 web 服务器提出的每个 PHP 页面请求生成并结束一个 PHP 解释器线程。由于该线程会随每个请求的结束而结束,因此任何在这个线程中利用的任何资源(例如指向 SQL 数据库服务器的连接)都会随线程的结束而关闭。(完)

那么在单一PHP线程中的数据库连接在执行完查询之后,有没有必要关闭呢?有些同学认为mysql_close()是必要的,也有的是像我一样不清楚到底是否需要关闭。那我们就用测试数据来给出答案吧。

第一个测试对比数据表是为了证明第一段描述,即相同数据库连接请求mysql_connect()将不会建立新连接,而将返回已经打开的连接标识,几乎不耗时。而如果对于每次mysql_connect进行mysql_close,频繁的连接请求会耗时较多。

上表中的三个数据介绍:

次数(次):程序执行数据库连接 或 连接+关闭的次数,下称N次。

耗时1: 程序执行N次 mysql_connect(),未执行关闭耗费的时间。

耗时2: 程序执行N次 mysql_connect()+mysql_colse ()耗费的时间。

第二个测试数据表可以用来解答第三段提出的问题,即mysql_close在同一PHP线程中有没有必要。图表中显示了10组数据。

上表中的三个数据介绍:

测试序号:相同的程序(是指程序的所有查询语句相同)执行的次数编号,下称第N次。

close: 第N次执行 含有mysql_connect()+mysql_colse () 的程序耗费的时间。

unclose: 第N次执行 没有mysql_colse() 的 程序耗费的时间。

上面的数据对比可以看出,在单一PHP进程中是否关闭数据库连接耗费的时间几乎一致。

10次测试后二者的平均值分别为,前者为532.5ms,后者为532.62ms。

关于ndoutils表的一些使用心得

(转)http://mopishv0.blog.163.com/blog/static/54455932201151991236508/

ndo的表有很多,对我们有意义的表没多少,抛开我不太清楚的notification,我把我所了解的大概的东西讲一下,每张表的描述大概分三段,第一 段是表的功能描述,第二段是我觉得我们查询时候比较重要的列,第三段是已有的索引。有些索引并不是自己带的,而是我后来建的,有些是为了优化ndo2db 的delete,有些是为了优化centreon的查询,对于自建查询来说,还是有点用处的。

nagios_objects:

ndo 里最重要的对象表,里面有nagios所有的对象,每一个对象,包括contact,hostgroup,service,host等等,在ndo的库里 都有一个唯一的标志,就是object_id,这个id就是在这张表里定义的。在其他所有的表中出现的所有的对象,几乎都是object_id,所以几乎 每次查询都要过这张表。

表里有两个名字列,name1,name2,这在ndo里面也是很重要的一个标识,这个是我们认为判断这 个对象的唯一的标识。对于大部分对象来说,name2都是空的,比如host,name1是host的名字,name2为NULL;对于 service,name1是这个service所属的host的名字,name2是service的名字。

这个表做了两个索引:
1、主键,object_id。
2、object_type_id,这个索引的定义是:KEY `objecttype_id` (`objecttype_id`,`name1`,`name2`)。

nagios_hosts:

ndo里存储host对象信息的表,查询的时候用到可能不是很多,因为host的信息,大多数情况下是查的nagios_hoststatus表。

nagios_services:

ndo 里存储service对象信息的表,在得知主机的object_id,然后查询这个主机上的service相关信息的时候需要用到,因为ndo里只有这张 表存储了host_object_id和service_object_id的对应。查询的时候,也就是对这两列进行查询。

我们查询的时候,一般只用到两个列,host_object_id和service_object_id。

这个表有4个索引,两个是自带的,两个是后来加的,但是我觉得我们平时用到的是后两个:
1、service_object_id,这个索引的定义是:KEY `service_object_id` (`service_object_id`)。
2、htob_svob_index,这个索引的定义是:KEY `htob_svob_index` (`host_object_id`,`service_object_id`)。

nagios_hostgroups:

ndo 里存储hostgroup对象信息的表,也是很重要的表,在做hostgroup相关查询的时候一定会用到它,因为它也保存了一个唯一的对应关系,就是 hostgroup_id到hostgroup_object_id的对应关系,这个hostgroup_id是完全没有必要出现的一个东西,但是另外一 张表里,nagios_hostgroup_members表里只有hostgroup_id,没有hostgroup_object_id,所以我们如 果知道hostgroup_object_id,然后想知道它所包含的host的时候,就必须通过这张表来做一次转换,然后再到 nagios_hostgroup_members里查找了。

最重要的列有三个,hostgroup_id,hostgroup_object_id,还有一个alias,有些时候我们只用alias就可以定位到hostgroup,而用不着非得去nagios_objects里面去查。

这个表有三个索引:
1、主键,hostgroup_id,用处不大。
2、 唯一键,instance_id,索引的定义是:UNIQUE KEY `instance_id`。 (`instance_id`,`hostgroup_object_id`),如果知道hostgroup_object_id来查的时候可能有点用, 不过一般也不用这么查。
3、idx_hg_ins_ali,索引定义是:KEY `idx_hg_ins_ali` (`instance_id`,`alias`),一般用这个的比较多,主要是用来查alias的。

nagios_hostgroup_members:

ndo里存储hostgroup和host对应关系的表,也是挺重要的一个表,设计到hostgroup的,大多也要查它。

重要的列有两个,hostgroup_id,host_object_id,它居然没用hostgroup_object_id,所以比较恶心,让我查的时 候还要到nagios_hostgroups表里绕一圈。查询的时候也都是,得知hostgroup_id查成员,得知成员object_id查找主机 组。

这个表有两个索引,主键没用,只有一个用的比较多:UNIQUE KEY `instance_id` (`hostgroup_id`,`host_object_id`)。

nagios_hoststatus:

ndo里存储host状态的表,查询host状态的话,这里应该是最后返回结果的一张表了。

重要的列太多了,报警有没有关,现在状态如何,是否自动检测等等,都在这里取到的,一般是用host_object_id来取。

这个表有两个索引,主键没用,只要一个host_object_id的索引就够了。

nagios_servicestatus:

ndo里存储service状态的表,查询service一般最终也是这张表返回的。

重要的列也很多,不过遗憾的是没有host_object_id,所以如果查询一个host的所有service状态,要走nagios_services表

索引有三个:
1、主键,servicestatus_id,没用的东西。
2、唯一键,object_id,是service_object_id,用到比较多。
3、c_state,索引定义为:KEY `c_state` (`current_state`,`service_object_id`),这个是给centreon查询做的索引。

nagios_hostchecks:

ndo 里存储host的历史查询结果的表,是整个ndo里第二大的表,现在保留一周的数据,是个merge的表。查询的时候也可以按周查询,直接找星期数对应的 那张表,比如周一的查nagios_hostchecks_1。存储的是检查的结果,一般的查询都是限定host_object_id,限定时间段来查询 的。

重要的列主要是host_object_id,start_time(检查时间),return_code(返回值,代表是否正常),output(输出),perfdata(性能数据,绘图用)

索引有三个:
1、主键,没用。
2、唯一键,定义为:UNIQUE KEY `instance_id` (`instance_id`,`host_object_id`,`start_time`,`start_time_usec`),一般的查询都用的这个。
3、 idx_hostche__ins_start,索引定义为:KEY `idx_hostche__ins_start` (`instance_id`,`start_time`),原先是做了给ndo2db删数据用的,现在不删了,基本上也没用了,可以考虑删掉这个索引, 节省空间和更新时间。

nagios_servicechecks:

ndo里存储service历史查询结果的表,是最大的表了,merge引擎。总体上和hostchecks表类似。

nagios_instances:

保存nagios主机信息的,只有5条记录,简洁明了,一看就明白。instance_id在查询的时候用的还是挺多的,虽然觉得有点多余,但是大部分的索引都是以它开头的,所以不加也得加…………

我们现在可以写一些脚本来查询ndo的库了,毕竟入库就是为了查询,否则干嘛花那么大力气来搞ndo呢?
至于sql语句,我觉得主要有以下几点需要注意:
1、在把sql写进脚本里以前,一定要在mysql里测试一下,select语句的话最好先explain一下,看大概要扫描多少条记录,是不是走到了索引上,特别是这个语句跑出来需要多长时间,如果真的太慢了,而且查询时间很长,那大家可以讨论下如何优化。
2、 如果在测试的时候卡住了(这个是很有可能的,有些select语句一年都跑不出来),不要光是ctrl+c退出来就好了,特别是两张myisam的 表,myisam是表级别的锁定,select锁了表,所有的插入就都挂住了,搞不好nagios会被拖挂掉,所以一定要再进去show processlist一下,然后把select的线程kill掉。
3、写where语句的约束条件的时候,一定要记得走索引,特别是查 询里面有大表的时候。mysql每次查询每张表只能用一个索引,而且必须按照顺序来,ndo里面的话,我们的索引第一个条件基本上都是 instance_id,那么在写约束的时候一定也要加上instance_id,只要第一个列没合上,那它就不会用这个索引了。这个通过explain 语句是可以看出来的。
4、查一个表,一般是出不来结果的,所以我们的查询估计是好几张表一起查,我写一个查询语句吧,参照一下:

select no.name1, no.name2, sc.state, sc.start_time, sc.return_code, sc.output
from nagios_objects no, nagios_servicechecks_2 sc, nagios_hostgroups hg, nagios_hostgroup_members hm, nagios_services ns
where no.object_id = ns.service_object_id
and hm.hostgroup_id = hg.hostgroup_id
and hg.instance_id = ’4′
and hg.alias = ‘tmp_hostgroup’
and hm.host_object_id = ns.host_object_id
and sc.instance_id = ’4′
and sc.service_object_id = no.object_id
and sc.start_time between ’2009-06-02 07:00:00′ and ’2009-06-02 08:00:00′

这个sql是取6月2日,7点到8点之间tmp_hostgroup这组机器的service的检查结果。

explain之后,结果如下:

*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: hg
type: ref
possible_keys: PRIMARY,instance_id,idx_hg_ins_ali
key: idx_hg_ins_ali
key_len: 514
ref: const,const
rows: 1
Extra: Using where; Using index
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: sc
type: range
possible_keys: instance_id,idx_serche_ins_start
key: idx_serche_ins_start
key_len: 10
ref: NULL
rows: 30740
Extra: Using where; Using join buffer
*************************** 3. row ***************************
id: 1
select_type: SIMPLE
table: ns
type: ref
possible_keys: service_object_id,htob_svob_index
key: service_object_id
key_len: 4
ref: nagios.sc.service_object_id
rows: 1
Extra:
*************************** 4. row ***************************
id: 1
select_type: SIMPLE
table: hm
type: eq_ref
possible_keys: instance_id
key: instance_id
key_len: 8
ref: nagios.hg.hostgroup_id,nagios.ns.host_object_id
rows: 1
Extra: Using index
*************************** 5. row ***************************
id: 1
select_type: SIMPLE
table: no
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: nagios.ns.service_object_id
rows: 1
Extra: Using where

可以看到,查的5个表里,有4个表可以通过索引直接定位,扫描的行数只有1,只有servicechecks的表索引建的不好,要扫3w行左右的数据,查询以后,耗时0.53s,还是挺快的。

但是如果写的时候少加了instance_id,那就不一样了,如果变成下面的sql

select no.name1, no.name2, sc.state, sc.start_time, sc.return_code, sc.output
from nagios_objects no, nagios_servicechecks_2 sc, nagios_hostgroups hg, nagios_hostgroup_members hm, nagios_services ns
where no.object_id = ns.service_object_id
and hm.hostgroup_id = hg.hostgroup_id
and hg.alias = ‘tmp_hostgroup’
and hm.host_object_id = ns.host_object_id
and sc.service_object_id = no.object_id
and sc.start_time between ’2009-06-02 07:00:00′ and ’2009-06-02 08:00:00′

explain之后是这个样子,功能和上面的sql语句是一样的,select出来的结果也一样,但是……

*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: sc
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4268324
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: ns
type: ref
possible_keys: service_object_id,htob_svob_index
key: service_object_id
key_len: 4
ref: nagios.sc.service_object_id
rows: 1
Extra:
*************************** 3. row ***************************
id: 1
select_type: SIMPLE
table: hg
type: index
possible_keys: PRIMARY
key: idx_hg_ins_ali
key_len: 514
ref: NULL
rows: 421
Extra: Using where; Using index; Using join buffer
*************************** 4. row ***************************
id: 1
select_type: SIMPLE
table: no
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: nagios.ns.service_object_id
rows: 1
Extra: Using where
*************************** 5. row ***************************
id: 1
select_type: SIMPLE
table: hm
type: eq_ref
possible_keys: instance_id
key: instance_id
key_len: 8
ref: nagios.hg.hostgroup_id,nagios.ns.host_object_id
rows: 1
Extra: Using index

少了两个约束条件,结果一个表就直接全表扫描了,另外一个表也从刚刚的直接定位换到扫描421行,执行时间不知道要多多少倍,所以加instance_id这个条件还是很重要的。

还有就是,查询的结果集不要太大,如果查询大量的结果,最好加limit。

ndo入mysql的一些优化 (转)

ndo+mysql用的人还是挺多的,当监控节点多的时候,mysql经常先成为瓶颈,一旦它挂在那里,那整个nagios会因为等待ndo2db返回结果而挂住。所以,如果有必要的话,还是要对它进行一些优化。

一、是ndomod配置的优化

ndo 把乱七八糟很多没用的数据都入库了,很多东西其实我们并不需要,所以需要在源头上做一个筛选,在平时我只留了4个内容,nagios_servicechecks,nagios_hostchecks,nagios_servicestatus,nagios_hoststatus,后两个是centreon用来展示用的,前两个是用来查历史检查记录用的。

如果需要记log的话,那也可以记log,不过ndo本身的log入库不是很喜欢,信息很不全,也不好查,所以log的入库建议单独搞。

选择ndomod的入库内容,是在ndomod.cfg里的一个叫data_processing_options的配置项,这个配置项默认是-1,那就是所有东西都入,如果想做一些筛选,那就需要到源码里查看,文件是include/ndomod.h

#define NDOMOD_PROCESS_PROCESS_DATA 1
#define NDOMOD_PROCESS_TIMED_EVENT_DATA 2
#define NDOMOD_PROCESS_LOG_DATA 4
#define NDOMOD_PROCESS_SYSTEM_COMMAND_DATA 8
#define NDOMOD_PROCESS_EVENT_HANDLER_DATA 16
#define NDOMOD_PROCESS_NOTIFICATION_DATA 32
#define NDOMOD_PROCESS_SERVICE_CHECK_DATA 64
#define NDOMOD_PROCESS_HOST_CHECK_DATA 128
#define NDOMOD_PROCESS_COMMENT_DATA 256
#define NDOMOD_PROCESS_DOWNTIME_DATA 512
#define NDOMOD_PROCESS_FLAPPING_DATA 1024
#define NDOMOD_PROCESS_PROGRAM_STATUS_DATA 2048
#define NDOMOD_PROCESS_HOST_STATUS_DATA 4096
#define NDOMOD_PROCESS_SERVICE_STATUS_DATA 8192
#define NDOMOD_PROCESS_ADAPTIVE_PROGRAM_DATA 16384
#define NDOMOD_PROCESS_ADAPTIVE_HOST_DATA 32768
#define NDOMOD_PROCESS_ADAPTIVE_SERVICE_DATA 65536
#define NDOMOD_PROCESS_EXTERNAL_COMMAND_DATA 131072
#define NDOMOD_PROCESS_OBJECT_CONFIG_DATA 262144
#define NDOMOD_PROCESS_MAIN_CONFIG_DATA 524288
#define NDOMOD_PROCESS_AGGREGATED_STATUS_DATA 1048576
#define NDOMOD_PROCESS_RETENTION_DATA 2097152
#define NDOMOD_PROCESS_ACKNOWLEDGEMENT_DATA 4194304
#define NDOMOD_PROCESS_STATECHANGE_DATA 8388608
#define NDOMOD_PROCESS_CONTACT_STATUS_DATA 16777216
#define NDOMOD_PROCESS_ADAPTIVE_CONTACT_DATA 33554432

可以选择自己需要的入库信息,然后把自己所选择的行右边的数字加起来,写到配置文件里去。
我选择的是如下几项

#define NDOMOD_PROCESS_SERVICE_CHECK_DATA 64
#define NDOMOD_PROCESS_HOST_CHECK_DATA 128
#define NDOMOD_PROCESS_PROGRAM_STATUS_DATA 2048
#define NDOMOD_PROCESS_HOST_STATUS_DATA 4096
#define NDOMOD_PROCESS_SERVICE_STATUS_DATA 8192
#define NDOMOD_PROCESS_OBJECT_CONFIG_DATA 262144
#define NDOMOD_PROCESS_MAIN_CONFIG_DATA 524288
#define NDOMOD_PROCESS_STATECHANGE_DATA 8388608

加起来的结果是data_processing_options = 9189568

这样一来,通过mysql的监控我发现,我的insert的数量减少了一半左右,从80 insert/s降到40 insert/s

二、mysql的优化

1、因为nagios_servicechecks和nagios_hostchecks这两个表基本上是插入,而且select也比较少,所以考虑把它切换成myisam的引擎,这样可以带来更快的插入速度。

alter table nagios_servicechecks engine=myisam;
alter table nagios_hostchecks engine=myisam;

nagios_servicestatus和hoststatus表因为更新比较快,所以用innodb

2、我把nagios全加上以后,就发现基本上没什么延迟了,但是过了两天,就出现了问题,检查后发现了有大量慢sql语句,这些慢sql语句居然都是delete语句。
原来,是ndo2db在删除过期的数据,但是我的表太大了,每次删除都要全表扫描,所以会很慢,insert语句得不到锁,就一直挂着,nagios等不到ndo返回结果,也一直挂着。

当时考虑的办法是加索引,delete语句加的条件是instance_id和start_time,所以直接对这两个做索引

create index ind_nagios_sc_ins_stime on nagios_serviceschecks(instance_id,start_time);
create index ind_nagios_hc_ins_stime on nagios_hostchecks(instance_id,start_time);

3、装好了centreon以后,在量很大的时候,有些表也是需要加索引的,这个看实际情况而定了

4、进一步的优化

三个方案:
a、如果发现插入太多,mysql顶不住了,那可以考虑把insert换成insert delayed,具体要修改的源码在src/dbhandlers.c中,函数是ndo2db_handle_servicecheckdata和 ndo2db_handle_hostcheckdata。
b、servicechecks和hostchecks表因为是myisam的引擎,所以时间长了文件会越来越大,插入也会越来越慢;而且我的servicechecks数据保存一周,竟然有3000w条还多,查询起来也不方便,所以考虑用merge引擎替换,把它分为7张表,分别命名为nagios_servicechecks_1到nagios_servicechecks_7,代表周一到周日,前端做merge,然后每天插一张表,每天凌晨,就把自己今天要插的相应的表truncate掉,然后把merge表alter一下,改变下顺序即可。

CREATE TABLE `nagios_servicechecks` (
`servicecheck_id` int(11) NOT NULL AUTO_INCREMENT,
`instance_id` smallint(6) NOT NULL DEFAULT ’0′,
`service_object_id` int(11) NOT NULL DEFAULT ’0′,
`check_type` smallint(6) NOT NULL DEFAULT ’0′,
`current_check_attempt` smallint(6) NOT NULL DEFAULT ’0′,
`max_check_attempts` smallint(6) NOT NULL DEFAULT ’0′,
`state` smallint(6) NOT NULL DEFAULT ’0′,
`state_type` smallint(6) NOT NULL DEFAULT ’0′,
`start_time` datetime NOT NULL DEFAULT ’0000-00-00 00:00:00′,
`start_time_usec` int(11) NOT NULL DEFAULT ’0′,
`end_time` datetime NOT NULL DEFAULT ’0000-00-00 00:00:00′,
`end_time_usec` int(11) NOT NULL DEFAULT ’0′,
`command_object_id` int(11) NOT NULL DEFAULT ’0′,
`command_args` varchar(255) NOT NULL DEFAULT ”,
`command_line` varchar(255) NOT NULL DEFAULT ”,
`timeout` smallint(6) NOT NULL DEFAULT ’0′,
`early_timeout` smallint(6) NOT NULL DEFAULT ’0′,
`execution_time` double NOT NULL DEFAULT ’0′,
`latency` double NOT NULL DEFAULT ’0′,
`return_code` smallint(6) NOT NULL DEFAULT ’0′,
`output` varchar(255) NOT NULL DEFAULT ”,
`perfdata` varchar(255) NOT NULL DEFAULT ”,
PRIMARY KEY (`servicecheck_id`),
UNIQUE KEY `instance_id` (`instance_id`,`service_object_id`,`start_time`,`start_time_usec`),
KEY `idx_serche_ins_start` (`instance_id`,`start_time`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=gbk INSERT_METHOD=LAST UNION=(`nagios_servicechecks_2`,`nagios_servicechecks_1`,`nagios_servicechecks_7`,`nagios_servicechecks_6`,`nagios_servicechecks_5`,`nagios_servicechecks_4`,`nagios_servicechecks_3`) COMMENT=’Historical service checks’

CREATE TABLE `nagios_hostchecks` (
`hostcheck_id` int(11) NOT NULL AUTO_INCREMENT,
`instance_id` smallint(6) NOT NULL DEFAULT ’0′,
`host_object_id` int(11) NOT NULL DEFAULT ’0′,
`check_type` smallint(6) NOT NULL DEFAULT ’0′,
`is_raw_check` smallint(6) NOT NULL DEFAULT ’0′,
`current_check_attempt` smallint(6) NOT NULL DEFAULT ’0′,
`max_check_attempts` smallint(6) NOT NULL DEFAULT ’0′,
`state` smallint(6) NOT NULL DEFAULT ’0′,
`state_type` smallint(6) NOT NULL DEFAULT ’0′,
`start_time` datetime NOT NULL DEFAULT ’0000-00-00 00:00:00′,
`start_time_usec` int(11) NOT NULL DEFAULT ’0′,
`end_time` datetime NOT NULL DEFAULT ’0000-00-00 00:00:00′,
`end_time_usec` int(11) NOT NULL DEFAULT ’0′,
`command_object_id` int(11) NOT NULL DEFAULT ’0′,
`command_args` varchar(255) NOT NULL DEFAULT ”,
`command_line` varchar(255) NOT NULL DEFAULT ”,
`timeout` smallint(6) NOT NULL DEFAULT ’0′,
`early_timeout` smallint(6) NOT NULL DEFAULT ’0′,
`execution_time` double NOT NULL DEFAULT ’0′,
`latency` double NOT NULL DEFAULT ’0′,
`return_code` smallint(6) NOT NULL DEFAULT ’0′,
`output` varchar(255) NOT NULL DEFAULT ”,
`perfdata` varchar(255) NOT NULL DEFAULT ”,
PRIMARY KEY (`hostcheck_id`),
UNIQUE KEY `instance_id` (`instance_id`,`host_object_id`,`start_time`,`start_time_usec`),
KEY `idx_hostche__ins_start` (`instance_id`,`start_time`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=gbk INSERT_METHOD=LAST UNION=(`nagios_hostchecks_2`,`nagios_hostchecks_1`,`nagios_hostchecks_7`,`nagios_hostchecks_6`,`nagios_hostchecks_5`,`nagios_hostchecks_4`,`nagios_hostchecks_3`) COMMENT=’Historical host checks’

每天凌晨执行的sql为

flush tables;
truncate table nagios_servicechecks_2; // nagios_servicechecks_2为当天要插的表
truncate table nagios_hostchecks_2;
alter table union = (……,`nagios_servicechecks_2`);
alter table union = (………,`nagios_hostchecks_2`); // 把当天要插的表放到最后

这个可以放到crontab里用脚本实现。
这样的话,就用不着delete了,省下大批锁
做法是在源码中把delete的函数注释掉,源码在src/ndo2db.c中,具体位置在函数ndo2db_end_input_data的最后
把ndo2db_db_perform_maintenance(idi);这个函数的调用注释掉即可。

把这个去掉以后,相比以前性能还是提升了不少

+———————–+———–+
| Variable_name | Value |
+———————–+———–+
| Table_locks_immediate | 130032279 |
| Table_locks_waited | 112021 |
+———————–+———–+

现在我的ndo库每秒300左右的insert,在删掉delete语句之前,从锁上来看,两个数字相差两个数量级,现在相差了3个数量级,说明还是有点作用的,呵呵。

c、两个status的表,nagios_servicestatus,nagios_hoststatus,如果允许的话,可以考虑换到memory引擎,速度上那个是飞快,不过前提你的内存要足够大。

因为ndo的原因,最近也草草的看了下mysql相关的东西,相当的不专业。

shell 分割字符串存至数组

shell编程中,经常需要将由特定分割符分割的字符串分割成数组,多数情况下我们首先会想到使用awk
但是实际上用shell自带的分割数组功能会更方便。假如
a=”one,two,three,four”

要将$a分割开,可以这样:
OLD_IFS=”$IFS”
IFS=”,”
arr=($a)
IFS=”$OLD_IFS”
for s in ${arr[@]}
do
echo “$s”
done

上述代码会输出
one
two
three
four

arr=($a)用于将字符串$a分割到数组$arr ${arr[0]} ${arr[1]} … 分别存储分割后的数组第1 2 … 项 ,${arr[@]}存储整个数组。变量$IFS存储着分隔符,这里我们将其设为逗号 “,” OLD_IFS用于备份默认的分隔符,使用完后将之恢复默认。

ajax readystate 状态

readyState有五种状态:
  0 (未初始化): (XMLHttpRequest)对象已经创建,但还没有调用open()方法;
  1 (载入):已经调用open() 方法,但尚未发送请求;
  2 (载入完成): 请求已经发送完成;
  3 (交互):可以接收到部分响应数据;
  4 (完成):已经接收到了全部数据,并且连接已经关闭。
如此一来,你应该就能明白readyState的功能,而status实际是一种辅状态判断,只是status更多是服务器方的状态判断。关于status,由于它的状态有几十种,我只列出平时常用的几种:
  100——客户必须继续发出请求
  101——客户要求服务器根据请求转换HTTP协议版本
  200——成功
  201——提示知道新文件的URL
  300——请求的资源可在多处得到
  301——删除请求数据
  404——没有发现文件、查询或URl
  500——服务器产生内部错误

21个启示故事

有时候静下来,读读小故事还是很不错滴……

1.甲去买烟,烟29元,但他没火柴,跟店员说:“顺便送一盒火柴吧。”店员没给。
乙去买烟,烟29元,他也没火柴,跟店员说:“便宜一毛吧。”最后,他用这一毛买一盒火柴。
这是最简单的心理边际效应。第一种:店主认为自己在一个商品上赚钱了,另外一个没赚钱。赚钱感觉指数为1。 第二种:店主认为两个商品都赚钱了,赚 钱指数为2。 当然心理倾向第二种了。同样,这种心理还表现在买一送一的花招上,顾客认为有一样东西不用付钱,就赚了,其实都是心理边际效应在作怪。
启示:变换一种方式往往能起到意想不到的效果! 通常很多事情换一种做法结果就不同了。人生道路上,改善心智模式和思维方式是很重要的。

2.有个小男孩,有一天妈妈带着他到杂货店去买东西,老板看到这个可爱的小孩,就打开一罐糖果,要小男孩自己拿一把糖果。但是这个男孩却没有任何 动作。几次的邀请之后,老板亲自抓了一大把糖果放进他的口袋中。回到家中,母亲好奇地问小男孩,为什么没有自己去抓糖果而要老板抓呢?小男孩回答很妙:“ 因为我的手比较小呀!而老板的手比较大,所以他拿的一定比我拿的多很多!”
启示:这是一个聪明的孩子,他知道自己的有限,而更重要的,他也知道别人比自己强。凡事不只靠自己的力量,学会适时地依靠他人,是一种谦卑,更是一种聪明。

3.美国知名主持人林克莱特有一天访问一名小朋友,问他说:“你长大后想要当做什么呀?”小朋友天真地回答:“嗯……我要当飞机的驾驶员!”林克 莱特接着问:“如果有一天,你的飞机飞到太平洋上空所有引擎都熄火了,你会怎么办?”小朋友想了想:“我会先告诉坐在飞机上的人绑好安全带,然后我挂上我 的降落伞跳出去。”当在场的观众笑得东倒西歪时,林克莱特继续注视着这孩子,想看他是不是自作聪明的家伙。没想到,接着孩子的两行热泪夺眶而出,这才使得 林克莱特发觉这孩子的悲悯之心远非笔墨所能形容。于是林克莱特问他说:为什么你要这么做?”小孩的答案透露了这个孩子真挚的想法:“我要去拿燃料,我还要 回来!!!”
启示:这就是“听的艺术”。一是听话不要听一半。二是不要把自己的意思,投射到别人所说的话上头。要学会聆听,用心听,虚心听。

4. 有两个和尚他们分别住在相邻的两座山上的庙里。这两座山之间有一条溪,于是这两个和尚每天都会在同一时间下山去溪边挑水,久而久之他么变成为了好朋友。就 这样时间在每天挑水中不知不觉已经过了五年。突然有一天左边这座山的和尚没有下山挑水,右边那座山的和尚心想:”他大概睡过头了。”便不以为意。哪知道第 二天左边这座山的和尚还是没有下山挑水,第三天也一样。过了一个星期还是一样,直到过了一个月右边那座山的和尚终于受不了,他心想:”我的朋友可能生病 了,我要过去拜访他,看看能帮上什么忙。”于是他便爬上了左边这座山,去探望他的老朋友。等他到了左边这座山的庙,看到他的老友之后大吃一惊,因为他的老 友正在庙前打太极拳,一点也不像一个月没喝水的人。他很好奇地问:”你已经一个月没有下山挑水了,难道你可以不用喝水吗?”左边这座山的和尚说:”来来 来,我带你去看。”于是他带着右边那座山的和尚走到庙的后院,指着一口井说:”这五年来,我每天做完功课后都会抽空挖这口井,即使有时很忙,能挖多少就算 多少。如今终于让我挖出井水,我就不用再下山挑水,我可以有更多时间练我喜欢的太极拳。”
启示:我们在公司领的薪水再多,那都是挑水。而把握下班后的时间挖一口属于自己的井,培养自己另一方面的实力,未来当我们年纪大了,体力拼不过年轻人了,依然还是有水喝,而且还能喝得很悠闲。

5.有两个人相约到山上去寻找精美的石头,甲背了满满的一筐,乙的筐里只有一个他认为是最精美的石头。甲就笑乙:“你为什么只挑一个啊?”乙 说:“漂亮的石头虽然多,但我只选一个最精美的就够了。”甲笑而不语,下山的路上,甲感到负担越来越重,最后不得已不断地从一筐的石头中挑一个最差的扔 下,到下山的时候他的筐里结果只剩下一个石头!
启示:人生中会有许多的东西,值得留恋,有的时候你应该学会去放弃。

6.有一家牙膏厂,产品优良,包装精美,受到顾客的喜爱,营业额连续10年递增,每年的增长率在10%~20%。可到了第11年,业绩停滞下来, 以后两年也如此。公司经理召开高级会议,商讨对策。会议中,公司总裁许诺说:谁能想出解决问题的办法,让公司的业绩增长,重奖10万元。有位年轻经理站起 来,递给总裁一张纸条,总裁看完后,马上签了一张10万元的支票给了这位经理。那张纸条上写着:将现在牙膏开口扩大1毫米。消费者每天早晨挤出同样长度的 牙膏,开口扩大了l毫米,每个消费者就多用1毫米宽的牙膏,每天的消费量将多出多少呢!公司立即更改包装。第14年,公司的营业额增加了32%。
启示:面对生活中的变化,我们常常习惯过去的思维方法。其实只要你把心径扩大1毫米,你就会看到生活中的变化都有它积极的一面,充满了机遇和挑战

7.一只火鸡和一头牛闲聊,火鸡说:我希望能飞到树顶,可我没有勇气。牛说:为什么不吃一点我的牛粪呢,他们很有营养。火鸡吃了一点牛粪,发现它 确实给了它足够的力量飞到第一根树枝,第二天,火鸡又吃了更多的牛粪,飞到第二根树枝,两个星期后,火鸡骄傲的飞到了树顶,但不久,一个农夫看到了它,迅 速的把它从树上射了下来。
启示:牛屎运让你达到顶峰,但不能让你留在那里。

8.乌鸦站在树上,整天无所事事,兔子看见乌鸦,就问:我能像你一样,整天什么事都不用干吗?乌鸦说:当然,有什么不可以呢?于是,兔子在树下的空地上开始休息,忽然,一只狐狸出现了,它跳起来抓住兔子,把它吞了下去。
启示:如果你想站着什么事都不做,那你必须站的很高,非常高。

9.一只小鸟飞到南方去过冬。天很冷,小鸟几乎冻僵了。于是,飞到一大块空地上,一头牛经过那儿,拉了一堆牛粪在小鸟的身上,冻僵的小鸟躺在粪堆 里,觉得很温暖,渐渐苏醒过来,它温暖而舒服的躺着,不久唱起歌来,一只路过的野猫听到声音,走过去看个究竟,循着声音,野猫很快发现了躺在粪堆里的小 鸟,把它拽出来吃掉了。
启示:不是每个往你身上拉大粪的人都是你的敌人。也不是每个把你从粪堆里拉出来的人都是你的朋友,还有,当你躺在粪堆里时,最好把你的嘴闭上。

10.从前,有两个饥饿的人得到了一位长者的恩赐:一根鱼竿和一篓鲜活硕大的鱼。其中,一个人要了一篓鱼,另一个人要了一根鱼竿,于是他们分道扬 镳了。得到鱼的人原地就用干柴搭起篝火煮起了鱼,他狼吞虎咽,还没有品出鲜鱼的肉香,转瞬间,连鱼带汤就被他吃了个精光,不久,他便饿死在空空的鱼篓旁。 另一个人则提着鱼竿继续忍饥挨饿,一步步艰难地向海边走去,可当他已经看到不远处那片蔚蓝色的海洋时,他浑身的最后一点力气也使完了,他也只能眼巴巴地带 着无尽的遗憾撒手人间。又有两个饥饿的人,他们同样得到了长者恩赐的一根鱼竿和一篓鱼。只是他们并没有各奔东西,而是商定共同去找寻大海,他俩每次只煮一 条鱼,他们经过遥远的跋涉,来到了海边,从此,两人开始了捕鱼为生的日子,几年后,他们盖起了房子,有了各自的家庭、子女,有了自己建造的渔船,过上了幸 福安康的生活。
启示:一个人只顾眼前的利益,得到的终将是短暂的欢愉;一个人目标高远,但也要面对现实的生活。只有把理想和现实有机结合起来,才有可能成为一个成功之人。有时候,一个简单的道理,却足以给人意味深长的生命启示。

11.孔子的一位学生在煮粥时,发现有肮脏的东西掉进锅里去了。他连忙用汤匙把它捞起来,正想把它倒掉时,忽然想到,一粥一饭都来之不易啊。于是 便把它吃了。刚巧孔子走进厨房,以为他在偷食,便教训了那位负责煮食的同学。经过解释,大家才恍然大悟。孔子很感慨的说:“我亲眼看见的事情也不确实,何 况是道听途听呢?”
启示:推销生意是一种组织性质的生意,因为人多,人事问题也多。我们不时听到是非难辨的话,如某公司攻击另一间公司,如是者往往令人混淆是非,影响信心。因此找出事情的真相,不是轻易相信谣言,辛辛苦苦建立的事业才不会毁于一旦。

12.有位秀才第三次进京赶考,住在一个经常住的店里。考试前两天他做了三个梦,第一个梦是梦到自己在墙上种白菜,第二个梦是下雨天,他戴了斗笠 还打伞,第三个梦是梦到跟心爱的表妹躺在一起,但是背靠着背。这三个梦似乎有些深意,秀才第二天就赶紧去找算命的解梦。算命的一听,连拍大腿说:”你还是 回家吧。你想想,高墙上种菜不是白费劲吗?戴斗笠打雨伞不是多此一举吗?跟表妹躺在一张床上了,却背靠背,不是没戏吗?” 秀才一听,心灰意冷,回店收拾包袱准备回家。店老板非常奇怪,问:”不是明天才考试吗,今天你怎么就回乡了?”秀才如此这般说了一番,店老板乐了:”哟, 我也会解梦的。我倒觉得,你这次一定要留下来。你想想,墙上种菜不是高种吗?戴斗笠打伞不是说明你这次有备无患吗?跟你表妹背靠背躺在床上,不是说明你翻 身的时候就要到了吗?”秀才一听,更有道理,于是精神振奋地参加考试,居然中了个探花。
启示:积极的人,象太阳,照到哪里哪里亮,消极的人,象月亮,初一十五不一样。想法决定我们的生活,有什么样的想法,就有什么样的未来。

13.有一天动物园管理员们发现袋鼠从笼子里跑出来了,于是开会讨论,一致认为是笼子的高度过低。所以它们决定将笼子的高度由原来的十公尺加高到 二十公尺。结果第二天他们发现袋鼠还是跑到外面来,所以他们又决定再将高度加高到三十公尺没想到隔天居然又看到袋鼠全跑到外面,于是管理员们大为紧张,决 定一不做二不休,将笼子的高度加高到一百公尺。一天长颈鹿和几只袋鼠们在闲聊,”你们看,这些人会不会再继续加高你们的笼子?”长颈鹿问。”很难说。”袋 鼠说∶”如果他们再继续忘记关门的话!”
启示:其实很多人都是这样,只知道有问题,却不能抓住问题的核心和根基。

14. 一天夜里,已经很晚了,一对年老的夫妻走进一家旅馆,他们想要一个房间。前台侍者回答说:”对不起,我们旅馆已经客满了,一间空房也没有剩下。”看着这对 老人疲惫的神情,侍者不忍心深夜让这对老人出门另找住宿。而且在这样一个小城,恐怕其他的旅店也早已客满打烊了,这对疲惫不堪的老人岂不会在深夜流落街 头?于是好心的侍者将这对老人引领到一个房间,说:”也许它不是最好的,但现在我只能做到这样了。”老人见眼前其实是一间整洁又干净的屋子,就愉快地住了 下来。第二天,当他们来到前台结账时,侍者却对他们说:”不用了,因为我只不过是把自己的屋子借给你们住了一晚–祝你们旅途愉快!”原来如此。侍者自己 一晚没睡,他就在前台值了一个通宵的夜班。两位老人十分感动。老头儿说:”孩子,你是我见到过的最好的旅店经营人。你会得到报答的。”侍者笑了笑,说这算 不了什么。他送老人出了门,转身接着忙自己的事,把这件事情忘了个一干二净。没想到有一天,侍者接到了一封信函,打开看,里面有一张去纽约的单程机票并有 简短附言,聘请他去做另一份工作。他乘飞机来到纽约,按信中所标明的路线来到一个地方,抬眼一看,一座金碧辉煌的大酒店耸立在他的眼前。原来,几个月前的 那个深夜,他接待的是一个有着亿万资产的富翁和他的妻子。富翁为这个侍者买下了一座大酒店,深信他会经营管理好这个大酒店。这就是全球赫赫有名的希尔顿饭 店首任经理的传奇故事。
启示:事情是从一个富有同情心、满怀仁爱的侍者的智慧头脑开始:“让我来想想办法……” 成功的人生和经历需要的是严密的逻辑,合理的推论及精确的求证,还要凭借的是美好的人性,动人的情节和意外而圆满的结局。

15.有一位表演大师上场前,他的弟子告诉他鞋带松了。大师点头致谢,蹲下来仔细系好。等到弟子转身后,又蹲下来将鞋带解松。有个旁观者看到了这 一切,不解地问:”大师,您为什么又要将鞋带解松呢?”大师回答道:”因为我饰演的是一位劳累的旅者,长途跋涉让他的鞋带松开,可以通过这个细节表现他的 劳累憔悴.” “那你为什么不直接告诉你的弟子呢?”"他能细心地发现我的鞋带松了,并且热心地告诉我,我一定要保护他这种热情的积极性,及时地给他鼓励,至于为什么要 将鞋带解开,将来会有更多的机会教他表演,可以下一次再说啊。”
启示:人一个时间只能做一件事,懂抓重点,才是真正的人才。

16.一个人在高山之巅的鹰巢里,抓到了一只幼鹰,他把幼鹰带回家,养在鸡笼里。这只幼鹰和鸡一起啄食、嬉闹和休息。它以为自己是一只鸡。这只鹰 渐渐长大,羽翼丰满了,主人想把它训练成猎鹰,可是由于终日和鸡混在一起,它已经变得和鸡完全一样,根本没有飞的愿望了。主人试了各种办法,都毫无效果, 最后把它带到山顶上,一把将它扔了出去。这只鹰像块石头似的,直掉下去,慌乱之中它拼命地扑打翅膀,就这样,它终于飞了起来!
启示:磨练召唤成功的力量。

17.雨后,一只蜘蛛艰难地向墙上已经支离破碎的网爬去,由于墙壁潮湿,它爬到一定的高度,就会掉下来,它一次次地向上爬,一次次地又掉下来…… 第一个人看到了,他叹了一口气,自言自语:”我的一生不正如这只蜘蛛吗?忙忙碌碌而无所得。”于是,他日渐消沉。第二个人看到了,他说:这只蜘蛛真愚蠢, 为什么不从旁边干燥的地方绕一下爬上去?我以后可不能像它那样愚蠢。于是,他变得聪明起来。第三个人看到了,他立刻被蜘蛛屡败屡战的精神感动了。于是,他 变得坚强起来。
启示:有成功心态者处处都能发觉成功的力量。

18.一个老人在高速行驶的火车上,不小心把刚买的新鞋从窗口掉了一只,周围的人倍感惋惜,不料老人立即把第二只鞋也从窗口扔了下去。这举动更让人大吃一惊。老人解释说:”这一只鞋无论多么昂贵,对我而言已经没有用了,如果有谁能捡到一双鞋子,说不定他还能穿呢!”
启示:成功者善于放弃。
19.某大公司准备以高薪雇用一名小车司机,经过层层筛选和考试之后,只剩下三名技术最优良的竞争者。主考者问他们:”悬崖边有块金子,你们开着 车去拿,觉得能距离悬崖多近而又不至于掉落呢?”"二公尺。”第一位说。”半公尺。”第二位很有把握地说。”我会尽量远离悬崖,愈远愈好。”第三位说。结 果这家公司录取了第三位。
启示:不要和诱惑较劲,而应离得越远越好。

20.老和尚携小和尚游方,途遇一条河;见一女子正想过河,却又不敢过。老和尚便主动背该女子趟过了河,然后放下女子,与小和尚继续赶路。小和尚 不禁一路嘀咕:师父怎么了?竟敢背一女子过河?一路走,一路想,最后终于忍不住了,说:师父,你犯戒了?怎么背了女人?老和尚叹道:我早已放下,你却还放 不下!
启示:君子坦荡荡,小人常戚戚;心胸宽广,思想开朗,遇事拿得起、放得下,才能永远保持一种健康的心态。

21.一个心理学教授到疯人院参观,了解疯子的生活状态。一天下来,觉得这些人疯疯癫癫,行事出人意料,可算大开眼界。想不到准备返回时,发现自 己的车胎被人下掉了。”一定是哪个疯子干的!”教授这样愤愤地想道,动手拿备胎准备装上。事情严重了。下车胎的人居然将螺丝也都下掉。没有螺丝有备胎也上 不去啊!教授一筹莫展。在他着急万分的时候,一个疯子蹦蹦跳跳地过来了,嘴里唱着不知名的欢乐歌曲。他发现了困境中的教授,停下来问发生了什么事。教授懒 得理他,但出于礼貌还是告诉了他。疯子哈哈大笑说:”我有办法!”他从每个轮胎上面下了一个螺丝,这样就拿到三个螺丝将备胎装了上去。教授惊奇感激之余, 大为好奇:”请问你是怎么想到这个办法的?” 疯子嘻嘻哈哈地笑道:”我是疯子,可我不是呆子啊!”

启示:其实,世上有许多的人,由于他们发现了工作中的乐趣,总会表现出与常人不一样的狂热,让常人难以理解。许多人在笑话他们是疯子的时候,别人说不定还在笑他们呆子呢。做人呆呆,处事聪明,不失为一种上佳的做人姿态。

使用mg-wp2tsina关联blog和sina微博

http://wordpress.org/extend/plugins/mg-wp2tsina/

本插件实现:在保存WordPress博客文章的时候,帮助将摘要信息同步到新浪微博指定帐号上。

插件将允许选择下述内容同步:

■标题(可选)
■分类名称(可选)
■标签列表(可选)
■文章摘要(可选)
■图片(自动选择)
■链接地址(固定包含,使用类似 http://example.org/?p=15 这样的短链接)
上述内容中,除了标题、链接地址和图片,剩余内容在提交前将根据微博信息的长度要求截断,并增加省略号显示。

实际同步文章的效果可以查看 http://t.sina.com.cn/1669337233 。

IT职场人,切不要一辈子靠技术生存

不管你是学习技术为了找工作还是创业,你都要对技术本身有个清醒的认识,在中国不会出现BILL GATES,因为,中国目前还不是十分的尊重技术人才,还仅仅的停留在把软件技术人才当作人才机器来用的尴尬境地。

一。在中国你千万不要因为学习技术就可以换来稳定的生活和高的薪水待遇,你千万更不要认为哪些从事市场开发,跑腿的人,没有前途。

不知道你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开发团队都小的可怜,甚至只有1-3个人,连一个项目小组都算不上,而这样的团队却要承担一个软件公司所有的软件开发任务,在软件上线和开发的关键阶段需要团队的成员没日没夜的加班,还需要为测试出的BUG和不能按时提交的软件模块功能而心怀忐忑,有的时候如果你不幸加入现场开发的团队你则需要背井离乡告别你的女友,进行封闭开发,你平时除了编码之外就是吃饭和睡觉(有钱的公司甚至请个保姆为你做饭,以让你节省出更多的时间来投入到工作中,让你一直在那种累了就休息,不累就立即工作的状态)

更可怕的是,会让你接触的人际关系非常单一,除了有限的技术人员之外你几乎见不到做其他行业工作和职位的人,你的朋友圈子小且单一,甚至破坏你原有的爱情(想象一下,你在外地做现场开发2个月以上,却从没跟女友见过一面的话,你的女友是不是会对你呲牙裂嘴)。

也许你拿到了所谓的白领的工资,但你却从此失去享受生活的自由,如果你想做技术人员尤其是开发人员,我想你很快就会理解,你多么想在一个地方长期待一段时间,认识一些朋友,多一些生活时间的愿望。

比之于我们的生活和人际关系及工作,那些从事售前和市场开发的朋友,却有比我们多的多的工作之外的时间,甚至他们工作的时间有的时候是和生活的时间是可以兼顾的,他们可以通过市场开发,认识各个行业的人士,可以认识各种各样的朋友,他们比我们坦率说更有发财和发展的机会,只要他们跟我们一样勤奋。(有一种勤奋的普通人,如果给他换个地方,他马上会成为一个勤奋且出众的人。)

二。在学习技术的时候千万不要认为如果做到技术最强,就可以成为100%受尊重的人。

有一次一个人在面试项目经理的时候说了这么一段话:我只用最听话的人,按照我的要求做只要是听话就要,如果不听话不管他技术再好也不要。随后这个人得到了试用机会,如果没意外的话,他一定会是下一个项目经理的继任者。

朋友们你知道吗?不管你技术有多强,你也不可能自由的腾出时间象别人那样研究一下LINUX源码,甚至写一个LINUX样的杰作来表现你的才能。你需要做的就是按照要求写代码,写代码的含义就是都规定好,你按照规定写,你很快就会发现你昨天写的代码,跟今天写的代码有很多类似,等你写过一段时间的代码,你将领略:复制,拷贝,粘贴那样的技术对你来说是何等重要。(如果你没有做过1年以上的真正意义上的开发不要反驳我)。

如果你幸运的能够听到市场人员的谈话,或是领导们的谈话,你会隐约觉得他们都在把技术人员当作编码的机器来看,你的价值并没有你想象的那么重要。而在你所在的团队内部,你可能正在为一个技术问题的讨论再跟同事搞内耗,因为他不服你,你也不服他,你们都认为自己的对,其实你们两个都对,而争论的目的就是为了在关键场合证明一下自己比对方技术好,比对方强。(在一个项目开发中,没有人愿意长期听别人的,总想换个位置领导别人。)

三。你更不要认为,如果我技术够好,我就自己创业,自己有创业的资本,因为自己是搞技术的。

如果你那样认为,真的是大错特错了,你可以做个调查在非技术人群中,没有几个人知道C#与JAVA的,更谈不上来欣赏你的技术是好还是不好。一句话,技术仅仅是一个工具,善于运用这个工具为别人干活的人,却往往不太擅长用这个工具来为自己创业,因为这是两个概念,训练的技能也是完全不同的。

创业最开始的时候,你的人际关系,你处理人际关系的能力,你对社会潜规则的认识,还有你明白不明白别人的心,你会不会说让人喜欢的话,还有你对自己所提供的服务的策划和推销等等,也许有一万,一百万个值得我们重视的问题,但你会发现技术却很少有可能包含在这一万或一百万之内,如果你创业到了一个快成功的阶段,你会这样告诉自己:我干吗要亲自做技术,我聘一个人不就行了,这时候你才真正会理解技术的作用,和你以前做技术人员的作用。

[小结]

基于上面的讨论,我奉劝那些学习技术的朋友,千万不要拿科举考试样的心态去学习技术,对技术的学习几近的痴迷,想掌握所有所有的技术,以让自己成为技术领域的权威和专家,以在必要的时候或是心里不畅快的时候到网上对着菜鸟说自己是前辈。

技术仅仅是一个工具,是你在人生一个阶段生存的工具,你可以一辈子喜欢他,但最好不要一辈子靠它生存。

掌握技术的唯一目的就是拿它找工作(如果你不想把技术当作你第二生命的话),就是干活。所以你在学习的时候千万不要去做那些所谓的技术习题或是研究那些帽泡算法,最大数算法了,什么叫干活?

就是做一个东西让别人用,别人用了,可以提高他们的工作效率,想象吧,你做1万道技术习题有什么用?只会让人觉得酸腐,还是在学习的时候,多培养些自己务实的态度吧,比如研究一下当地市场目前有哪些软件公司用人,自己离他们的要求到底有多远,自己具体应该怎么做才可以达到他们的要求。等你分析完这些,你就会发现,找工作成功,技术的贡献率其实并没有你原来想象的那么高。

不管你是学习技术为了找工作还是创业,你都要对技术本身有个清醒的认识,在中国不会出现BILL GATES,因为,中国目前还不是十分的尊重技术人才,还仅仅的停留在把软件技术人才当作人才机器来用的尴尬境地。(如果你不理解,一种可能是你目前仅仅从事过技术工作,你的朋友圈子里技术类的朋友占了大多数,一种可能是你还没有工作,但喜欢读比尔。盖茨的传记)

My thinking:

技术是通过时间和经验累加之后熟练运用的一种工具,个人技术的能力是可以衡量的,除非为了解决暂时的生存问题,它永远不可能依靠一辈子,只有创新,突破性的东西,才是发展需要的。

代运营将是电子商务发展趋势

原文地址:代运营将是电子商务发展趋势      作者:于斌

电子商务代运营商,顾名思义,就是当互联网成为一种越来越不容小觑的交易方式,随着传统企业渴望“触”网,却又要跨越技术、网络推广、客服售后、仓储物流等多重门槛,而出现的一种“中间商”。代运营公司说白了就是网络经销商,像线下经销商一样,他们主要工作就是帮助企业在网上卖货。但他们与传统经销商在工作上完全不同,他们主要从事网站建设、营销推广、分销渠道到仓储物流等电子商务的各个环节。

现在在网上做的比较好的,一是网货品牌,二就是代运营商,很多传统的企业自建自运营企业大都处于停滞状态。国内主流的代运营商确实已经达到了“比传统企业自己做的更好”,以淘宝店运营为例,有了外包商的介入,销售额一般能成长10倍以上。代运营企业的主要客户是传统企业,而这正是目前在进军电子商务、不可小觑的一支庞大军团。有了代运营公司的帮助,传统企业甚至可以当起甩手掌柜。

代运营商与客户合作的一般过程是:搭建网站、拍摄照片,让客户每天检查;进货、促销、发货,客户负责提供产品;销售后分析数据,预测之后的销售趋势;销售量开始爆发后,客户需要投更多的资源进来、配更多的人手。

目前,代运营商的收费模式一般是基础服务费加销售额提成,提成率根据具体情况而定,一般在10%-40%之间,卖的多就收的多,企业比较容易理解。尽管如此,传统企业如果把电子商务当作一个出货渠道、只看重销售量,是个错误的理念。

对于传统企业来说今天不投入,好像对销量的损失不大,但事实上损失的是一个市场。有时候他甚至觉得传统企业非得吃个大亏,才能够意识到电子商务的重要性。随着小熊电器、金泰昌洗脚盆、贝尔莱德挂烫机这样的网货品牌的崛起,传统品牌商的市场实际上在被这些伴随网络流行起来的商品所侵蚀,今天失去了一点订单,明天可能失去市场份额。

代运营公司的IT系统也是传统企业所看中的,国内的制造商还处在纸质订单的时代,对于处理日均100单的销量是可以解决,但对于处理1000单甚至是1万以上日均单量级订单和所对应海量问题的经验,而且缺乏为大客户提供运营服务的能力。再比如IT系统的强壮度,举个例子,商城里上架价格发生错误,本来1000块钱的商品标成1块钱或10块钱是并不罕见但后果较为严重的问题,这时就要靠系统解决。“上架的时候系统会做对比,如果发现这次跟过去价格相比中间相差了10%幅度以上,就会报警要求再审核一次”,电子商务靠细节。

从代运营的环境看,现在大部分代运营商主要是依靠淘宝来进行,但对于未来,将有更多的B2C企业演变成了平台,比如京东、当当、卓越、凡客。这些企业已经允许第三方企业入驻,在其平台上开启店中店,他们收取适当的店面和物流费用。还有一些B2B的平台也将发挥更大的作用,比如阿里巴巴、慧聪等。相信多种多样的电子商务模式,将会是电子商务的发展达到最高点,代运营也是电子商务未来发展的趋势。

———————–

My thinking:

代运营是种趋势,也是传统企业过渡互联网时代的桥梁,但是混乱的中国电商市场是个瓶颈。