作者归档:月夜

让你撰写的文档看上去更好一些

docstyle

工作和生活中不可避免要写一些文档,文档的内容是否好需要深练内功,是一项需要长期锻炼的活儿。内容之外,文档的排版格式有一些规范规则,比如学位论文编写规则「GB/T 7713.1-2006」。

在实际写文档的过程中,除非要求非常严格的场景,一般很少完全按照标准规范执行,但基本的东西还是要注意一下,至少要让文档看上去是那么回事。

在实际工作中接触和阅读的很多文档都非常别扭,以下是比较常见的情况:

  1. 目录与目录指向的正文不对应;
  2. 正文的页码不是从第 1 页开始;
  3. 段落首行缩进很随意;
  4. 整个文档中各段落行间距不一致;
  5. 标题「目录」在文档中不对应。

当然还有更多的地方看上去也是别扭的,比如题注、图、表的说明及在正文中的交叉引用等,但是只要解决了这比较常见的五种情况,基本上这个文档看上去会好很多。

解决这些其实蛮简单,我们以 Word 作为文档编写工具「WPS类同,两者在操作上高度一致」来看看怎么处理这些。

在新建一篇空白的文档之后,不要着急开始写,先找到「分隔符」按钮菜单,选择分隔符中的分节符下一页,操作两次,将整篇文档分成三节,这分成的三节分别对应文档的封皮、目录、正文。分隔符一般在页面布局中可以找到。

分好节后在 Word 中可以看到有三个空白页。第一页中可以写文档的标题、副标题等等;第二页用于展示文档的目录,可以先不用管;文档的内容从第三页开始。

找到「页码」按钮菜单,在第三页页面底端插入页码,插入页码会自动在整个文档中插入页眉和页脚,出现页眉页脚工具设计菜单,找到「链接到前一条页眉」取消与第二节的链接,然后在「页码」按钮菜单中「设置页码格式」,将页码编号由「续前节」变更为「起始页码」,并由 1 开始。

我们可以开始写内容了,找到「多级列表」按钮菜单,一般在 Word 的第一个选项卡中可以找到,选择如下这个即可。多级列表是组织你文档结构的,同时也可以由这些多级列表生成目录。

1 标题 1
1.1 标题 2
1.1.1 标题 3
1.1.1.1 标题 4
……

写完标题后,开始新的一行写正文,一个段落完成后,选中这个段落的所有文字,选择字体大小为小四,一般字体使用宋体即可,然后单击鼠标右键,在弹出的菜单中选择「段落」,然后对「缩进和间距」进行设置。在特殊格式中选择「首行缩进」,在行距中选择「多倍行距」,设置值为「1.25」,也可以在行距中选择「1.5 倍行距」,设置完后确认即可。

还有一个常用的按钮菜单「格式刷」会经常使用,如果想在新的内容中应用前面的格式,可以先选中前面的内容,然后鼠标左键点击一下「格式刷」,到要应用的地方鼠标左键再点击一下,这样新的内容就有了跟前面一样的格式了。

写完正文内容后「写一部分也是可以的」,回到第二页,找到「目录」按钮菜单,选择「插入目录」,使用默认选项即可,这样就会自动插入目录。当内容修改后,可在第二页目录上单击鼠标右键,然后选择「更新域」进行目录的更新。

进行这些操作后,撰写的文档基本上就没有那些常见的问题了,看上去会好很多。

更好的方式是针对不同类型的文档建立不同的模版,这样在以后使用时就可以不用再次设置。网上也有不少这样的模版可供下载使用。

本文首发于我的微信公众账号「时间易逝」,用微信扫描下方二维码可订阅我的微信公众账号。

微信搜索「doevents」

记一次手术的切身感受

今年七月份开始身体有些不大好,一开始继续采用保守治疗的方式,并不像往年马上就好了,断断续续持续两个月始终不见好,中间到医院两次,八月底去医院,主任建议采用手术进行治疗,于是有了这么多年第一次手术的切身体验,目前身体已经恢复,有必要记录一下。

确认采用手术治疗后,首先是办理入院相关手续。拿着医生开具的住院证到住院楼大厅办理入住手续,主要是交钱、量血压、领盆、腕带,然后到所在楼层护士工作站,护士会给安排病房病床。

虽然在患者的标识上增加了条码腕带,但在整个过程中并没有有效的使用起来,依旧还是依靠护士与患者之间的问答来确认身份。在支付上便捷很多,一卡在手即可解决问题。

入院后做必要的检查后,会根据情况安排手术,检查情况一切顺利,安排九月一日第一台手术,术前麻醉师找我谈话,告诉将会采用全麻的方式,确认后签署文档,我额外要求增加使用止疼泵,这个再后来被确认是比较明智的。

在手术前的各项检查中,有很多真是无纸化了,不像之前将手写单据转化为打印单据,这在一定程度上也体现了信息化的日趋完善,与麻醉师确认相关事宜是在iPad上进行的,无线与移动也得到了应用。

手术前一天晚上过12点后就不允许饮食了,同时会进行一些准备工作,第二天一早进行灌肠处理后,等待手术引导人员到来,随后跟着引导人员乘坐专用的电梯来到手术室门口,更换拖鞋,将眼睛交给家人后环顾四周,人影绰绰,跟随着就到了一间等待室,屋子里摆放着很多的轮椅,一排排的大概有五六十个,按照指定的编号做好后,会有护士逐个给扎针输水,之后就是等待手术护士来领人。

大约有半小时,过来一个护士MM,经过身份核对后,让我跟她走,在到手术间的路上询问一些既往情况,比如对什么过敏这样的,然后说你这个是个小手术,别紧张之类的,护士MM的声音很好听,模糊中看着也非常靓丽。很快来到手术间,手术间空荡荡的,除领我前来的护士外,还有一个护士,在领我来手术间的护士MM的帮助下,我躺到了无影灯下的手术台上,躺好之后,仪器的导联线就与身体连接了,身体开始发抖,手术间的温度特么的真低,给护士说冷后,给盖上一床厚厚的被子,然后从背部侧面给用上暖风管,顿时就舒服多了,后来才知道这暖风也是要收费的。

这时候应该是医生查房时间,对我来说就是等待时间,这一等足足等了将近两个小时,我只能时不时抬起头环顾四周,由于近视只能模模糊糊看个大概,手术间很大也很现代化,当模糊看到对面的钟表大约9点半差不多时,医护人员到了,他们之间简短的交流之后,一个氧气面罩盖在我的脸上,呼吸几下后,我就失去了意识,手术开始了。

从事医疗行业的工作前前后后也大概有个八年的时间,这中间也进过手术室「主要是为产品在有需要的情况下提供技术服务」,主要站在旁观者的角度感受患者的术中过程,想来我失去意识的这段时间就如同我以旁观者身份感受的类似。

隐约中听见有人在喊我,伴随着轻拍脸的动作,意识逐渐开始回到我的身体,努力的睁开眼睛,看到天花板在晃,感觉很困想闭着眼睛继续睡觉,旁边有人一个劲的在喊我,并问我一些诸如叫什么名字,做的什么手术的问题,反馈后听到说可以了,然后我就回到了住院病房所在的楼层,进入了监护室,这时候基本上人已经相对清醒了,要在设备的监控下在监护室待够24小时。

在监护室的这段时间人越来越清醒了,虽然还有眩晕感,但总体感觉好多了,疼痛慢慢袭来,好在当时要了止疼泵。随着输液的逐渐增多,我要解决一个问题,就是排尿「由于是小手术,没插尿管」,慢慢尿意越来越严重,几番起身却排不出来,这让我开始紧张起来,于是我频繁的起来躺下,不断尝试,在凌晨2点多终于排出来了,剩下的就是慢慢恢复与忍受疼痛。

从进入手术室到出来的整个过程,对于家人应该是比较难熬的,尤其是在术前看到那些签字的诸多文档,又碰上整个时间比较长,进入手术室算上等待时间到出来差不多一上午过去了。

在监护室一切顺利,过了监护时间后转到病房,开始在院恢复阶段,中间有单间病房空出来了,就调换到单间病房,然后就是开始输液换药等常规恢复时段,在止疼泵用完后间断的使用了两次止疼针,恢复的还算顺利,住院十天后出院。这段时间家人比较辛苦,两头跑不说,老婆一直在医院陪护照顾着实辛苦,孩子也比较懂事。出院后又卧床约两周加上用药,就差不多可以正常生活工作了,非常感谢家人与医护人员。

医护人员的工作也是比较累的,要充分配合医护人员的工作,如果条件允许,可以买些水果零食以示感谢,另外多沟通交流总是好的。去正规的医院进行诊断治疗是非常有必要的,不要相信江湖传说及某度中搜来的包治百病的广告或者是电线杆上的小广告,治病这事得相信专业性。

目前整个医院的诊疗体系相较前些年有很多进展,硬件设备比较先进,信息化程度也在逐年提高,从开始部署第一代信息化系统到享受到信息化的红利,近年来信息化的投入也在逐年增加,这在一定程度上提高了整体的医疗水平,但可能仍有诸多地方有待进一步尝试:诸如移动信息技术的进一步使用,从医生工作站,护士工作站向床旁延展;诸如信息向患者移动设备的推送;诸如患者在出院后是否建立沟通回访;诸如信息数据的二次挖掘与共享;智能设备在诊疗过程中的使用;向院外提供诊疗服务等等。在医疗这个行业精耕细作是有很多机会的。

查看订单跟踪时,我想看哪些信息?

如今电商已经相当普及了,大部分人都会从网上购买东西,网购已经成为生活的一部分,我也会经常在网上购买一些东西,一次好的网购过程对于我来说是能够以最快的速度拿到购买的东西。

相比传统的实体店购买过程体验,从购买开始的挑选,到最后支付完拿到东西,网购会多一个物流配送的过程「其实传统购买也有配送,只是多数由自己完成这个过程」,这个过程在网购中也会反应用户能够多快速拿到东西,高效率的配送会随着物流体系的建设与完善大大缩短送达时间,在很多时候做电商的如京东、amazon、当当、还有当下的做O2O的,很大程度上其构建的壁垒来自仓储与物流体系。

这里面没有说淘宝及天猫,因为很少在这上面购买东西,挑选东西的成本太高,倒是老婆会经常在上面买些东西。

在这整个过程中商家会提供对购买东西的跟踪,以便让用户清楚知道什么时候能够得到东西。凑着这两天买东西对经常使用的电商平台的购买跟踪进行了比较,在这里说说自己对于购买跟踪的体验。

当产生订单以后我最关注的就是什么时候能够送达,进行分解后应该涵盖下面几点:

我买的东西现在发出去了没?
如果发出去了目前在路途中还是已经送达我所在的城市?
开始往我这里派送了没?
我能联系到派送人吗?

对于我这样一个普通用户来说,我不太关注什么分拣点啊,已经完成分拣什么之类的,同样我也不关注什么扫描入库或者什么扫描出库这类的,这跟我没太大的关系,也不是我想了解的。

先看看亚马逊的「包裹跟踪」,如下图:

amazon_trace

这个是几个对比电商企业中体验最好的一个,涵盖了我最关注的,跟踪详情还能减少一条,对我来说「正在运输途中、已经到郑州、配送员xxx在给你送达的途中」,这样三条信息足以。

再来看看京东的,京东提供给用户的是对整个订单的跟踪,如下图:

jingdong_trace

可以看到巨多的信息扑面而来,会告诉我提交订单、出库、打印、拣货、扫描、打包……等诸多的信息,看到这些信息我就醉了,这些信息跟我有几毛钱的关系呀,我还得对信息进行筛选再加工,体验对我来说及其不好。

最后看看当当的,当当也是提供基于订单来跟踪,如下图:

dangdang_trace

当当的文字与京东相比少一些,但同样包含入库、出库、扫描、打包、拣货等这些需要我进行二次加工的信息,体验也是很糟糕的。

以上这些仅代表自己的看法,是自己使用中最直观的感受,大部分时间其实我们是不太关注这些的,以前我也不关注这些,只是目前在从事产品相关的工作,在看很多东西的时候都会从自己使用的角度来分析一下产品,产品是可以持续改善的。

对订单跟踪这个需求面向两个类型用户,分别是企业自身与用户,关注点是不同的,对于信息所需也是不同的。

对于企业来说,对订单的跟踪越详细越好,通过详细的跟踪数据可以最大程度上对整个流程进行压榨,从而不断平衡效率与成本,在竞争的市场中获得竞争优势,建立竞争壁垒。

对于用户来说,不需要很详细大追踪信息,而且也不需要那么多的专业术语,只要能够尽快让用户收到东西就是最佳的体验,用户查看跟踪信息也是了解什么时候能收到东西,在出现特殊情况的时候能够了解并能够联系,这就足够了,对于我的最佳体验是「我今天下单,第二天就送到了,甚至当天就到了,而且东西完好」。

Mac Os X yosemite 中配置Apache

启动Apache

Mac自带Apache环境,所需要做的就是启动它然后进行相应的配置。

打开「终端(terminal)」,输入 「sudo apachectl -v」 ,可以看到Mac Os X Yosemite中内置的 Apache 版本。

在「终端」中输入 「sudo apachectl start」 启动 Apache。

打开浏览器在地址栏中输入「http://localhost」,会出现「It works!」页面。

页面默认的位置在 /Library/WebServer/Documents/ 下,这是 Apache 的默认根目录。 Apache 默认安装在 /etc/apache2/ 。

设置虚拟主机

修改 Apache 配置文件, 在 「/etc/apache2/httpd.conf」 ,使用 vim 进行编辑。

找到 「#include /private/etc/apache2/extra/httpd-vhosts.conf」 ,将其注释「#」删除。

重新启动 Apache , 「sudo apachectl restart」,虚拟主机设置开启。

配置虚拟主机,用 vim 打开 「/etc/apache2/extra/httpd-vhosts.conf」 进行配置,配置代码如下。


  DocumentRoot "/Library/WebServer/Documents"
  ServerName localhost
  ErrorLog "/private/var/log/apache2/localhost-error_log"
  CustomLog "/private/var/log/apache2/localhost-access_log" common



  DocumentRoot "/Users/yourLoginName/Sites"
  ServerName sites
  ErrorLog "/private/var/log/apache2/sites-error_log"
  CustomLog "/private/var/log/apache2/sites-access_log" common
  
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order deny,allow
    Require all granted
  

配置完成后保存文件,在hosts配置文件「/etc/hosts」中增加「127.0.0.1 sites」,重新启动Apache,中浏览器中输入「http://sites」即可正常访问。

jQuery事件处理

在浏览器交互过程中特定事件发生时脚本会进行相应的处理, jQuery 会针对不同的事件进行特定的处理。

浏览器检测到自身发生变化或遇到错误时,抛出的事件称为浏览器事件。比如浏览器页面内容发生滚动时会触发 scroll 事件,浏览器出错会触发 error 事件。可分别对应事件绑定相应的事件处理函数,这样当事件发生时就会调用此函数。

//当一个image标签指定要加载的图片不存在时,产生错误
$("<img>", {
  "src" : "not/an/bb.png",
  "alt" : "no image"
})
.error(function() {
  console.log("图片无法加载");
})
.appendTo("body");

//当滚动浏览页面内容时,触发 scroll 事件
$(window)
  .scroll(function() {
    console.log("窗口滚动");
  });

通常在页面中的 javascript 会在页面加载完成后才能开始执行,为了防止脚本过早执行,而页面中的元素还未加载而导致异常,通常会使用 ready 函数来保证等 DOM 准备好可以接受处理时才触发进行处理,通常会把整个脚本做成一个回调函数传递给 ready 函数。

$(document).ready(function() {
  //脚本
});

在浏览器中可以触发很多事件,jQuery 提供很多快捷方法对应相应的事件,常见的事件有 click 、 blur 、 focus 、 mousedown 、 mouseup 、submit 等,给对应的元素绑定事件及其处理函数可在事件发生时进行相应的响应。

bind()

可以给元素绑定事件处理函数,可最多接受三个参数,第一个参数为事件名,第二个参数为事件处理函数,可以一次为多个事件绑定同一个事件处理函数,也可以为不同的事件绑定不同的事件处理函数。如果为多个事件绑定同一个事件处理函数,在第一个参数中用空格分隔不同的事件。如果要为不同的事件绑定不同的事件处理函数,需要给bind方法传递一个 JSON 对象。另外可接受的第三个参数用于向事件处理函数传递数据,这个参数是一个 JSON 对象,该参数的数据会绑定到事件处理函数的 event 对象,从而完成数据的传递。

//给段落绑定 click 事件,点击段落输出段落被点击信息
$("p").bind("click", function() {
  console.log("段落被点击");
});

//给段落绑定 click, mouseover 事件,并输出事件发生信息
$("p").bind("click mouseover", function() {
  console.log("事件发生");
});

//给段落绑定 click, mouseover 事件,并输出不同的信息
$("p")
  .bind({
    "click" : function() {
      console.log("Click Event");
    },
    "mouseover" : function() {
      console.log("MouseOver Event");
    }
  });

//给事件处理函数传递数据
var Msg = "message 1";
$("#bar").bind("click", {m:Msg}, function(event) {
  console.log(event.data.m);
});

var Msg = "message 2";
$("p.foo").bind("click", {m:Msg}, function(event) {
  console.log(event.data.m);
});

unbind()

可以使用 unbind 方法移除元素的事件,如果不带参数调用该方法,则会移除当前元素的所有绑定事件,如果需要指定移除那个事件,就把该事件名作为第一个参数传递给 unbind 方法,如果要移除指定的事件处理函数,就把准备移除的事件处理函数作为第二个参数传递给 unbind 方法。

//删除绑定在段落中的所有事件
$("p").unbind();

//仅删除绑定在段落中的click事件
$("p").unbind("click");

//删除指定事件处理函数
var fun1 = function() {
  console.log("event one triggered!");
},
    fun2 = function() {
  console.log("another one event!");
};
$("#bar").bind("click",fun1)
         .bind("click",fun2)
         .trigger("click")
         .unbind("click", fun1);

live() 和 die()

live 和 die 跟 bind 和 unbind 类似,也是负责为元素绑定事件和事件处理函数,所不同的是能为动态添加到 DOM 中的匹配元素绑定事件和事件处理函数,用 live 绑定的事件处理和事件处理函数必须使用 die 来解除绑定, 在 jQuery 1.7 以后 live 以过时,应该使用on方法。

one()

跟bind功能唯一的区别就是使用one绑定的事件及事件处理函数是一次性的,事件触发后自动解除绑定,其他功能跟bind相同。

trigger()

触发事件使用trigger,接受两个参数,第一个参数是被触发的事件名,第二个参数可选,为数组类型,用于给事件处理函数传递数据。

//给 id = bar 的元素绑定 click 事件,然后触发
$("#bar").bind("click", function() {
  console.log("Clicked!");
}).trigger("click");

//给事件处理函数传递数据
var notice = "I was triggered!";
$("#bar").bind("click", function(event, msg) {
  var log = msg || "I was clicked!";
  console.log(log);
}).trigger("click", [notice]);