iOS应用之间的跳转,看这篇就够了

来源:夜_阑珊

链接:http://www.jianshu.com/p/6b746f95b568



一、前言

泰国渡了半个月的假,回来发现有段时间没更新博客了,顿时感到浑身焦虑啊,而这段时间也不断有小伙伴关注我的简书账号,让我感到欣慰的同时心理也是沉甸甸的压力,唯有写出高质量、好的博文作为回报了。昨天项目经理问我:能不能从我们的app应用跳转到合作商的app应用?我回答说:完全可以啊,这个不是问题。他听完后非常满意高兴的去合作商进一步商谈了。留下身后的我赶紧谷歌相关资料(开玩笑,哥也不可能什么都去记,很早以前做过也忘的七七八八了),但是谷歌一通下来发现网上五花八门的博文并没有几篇讲的清晰明了、深入浅出的,而且大部分年代久远。于是花了点时间专门研究了下,经过实践和总结,本篇博文将涉及到以下知识点:

  • app应用跳转的原理解析

  • 如何实现两个app应用之间的跳转

  • 如何实现两个app之间跳转到指定界面

二、应用跳转原理

相信从一个应用跳转到另一个应用大家并不陌生,最常见的莫过于第三方登录,支付宝支付等等。这些东西大家都耳熟能详,集成进来也很简单,跟着第三方sdk集成文档一步步走下来就是了,通常sdk集成文档都需要你在工程中配置一堆堆的东西,但是配置的这些东西,你真的明白了吗?比如下面这个,第三方登录或分享需要你配置的URL Schemes:

第三方登录或分享需要你配置

不明白呢没关系,开始我也不明白,但是这篇博文看完后,相信你会明白的,下面正式进入主题:

1、一些概念的补充

  • 协议:双方互相遵守的一种规范,只有遵守共同的协议规范才能进行彼此的通信。比如我们最熟悉的网络协议——http协议。

  • URL:资源的路径或地址。在IOS中有一个专门用于包装资源路径的类——NSURL。

  • 一个完整URL的组成

例如:http://123.0.0.1/path?page=100

“http://”:协议类型

“123.0.0.1”:服务器ip地址

“/path”:资源存放的是路径

“page=100”:请求的参数

  • NSURL包装一个完整地址

NSURL *url = [NSURL URLWithString:@“http://123.0.0.1/path?page=100”];

  NSLog(@“scheme(协议):%@”,url.scheme);

  NSLog(@“host(域名):%@”,url.host);

  NSLog(@“path(路径):%@”,url.path);

  NSLog(@“query(参数):%@”,url.query);

打印结果如下:

2016-12-02 14:50:38.442 TestDemo[5632:406869] scheme(协议):http

2016-12-02 14:50:38.442 TestDemo[5632:406869] host(域名):123.0.0.1

2016-12-02 14:50:38.442 TestDemo[5632:406869] path(路径):/path

2016-12-02 14:50:38.442 TestDemo[5632:406869] query(参数):page=100

2、跳转的原理

在iOS中,从一个app打开另一个app,这必然牵扯到两个app之间的交互和通信,像这种涉及到整个应用程序层面的事情,苹果有一个专门的类来管理——UIApplication。在ios中UIApplication其实就是代表着应用程序,这点从它的命名就可以窥之。而我们要打开另一个应用程序,如何实现呢?

很简单,其实就是UIApplication下面这个 的API

/**

通过应用程序打开一个资源路径

@param url 资源路径的地址

@return 返回成功失败的信息

*/

(BOOL)openURL:(NSURL*)url;

它的一些我们非常熟悉的用法:

//拨打系统电话

NSURL *url = [NSURL URLWithString:@“tel://10086”];

[[UIApplication sharedApplication] openURL:url];

//发送系统短信

NSURL *url = [NSURL URLWithString:@“sms://1383838438”];

[[UIApplication sharedApplication] openURL:url];

看到这里也许有人会有疑问:拨打系统电话、发送系统短信跟我本篇要讲的应用间的跳转有什么关系呢?

呵呵,不要着急,重点来了:你难道不觉得拨打系统电话、发送系统短信其实就是应用间的跳转吗?只要一执行以上两个方法就会从你当前的应用跳转到系统的拨打电话界面、发送短信界面,这难道还不够应用间的跳转吗?其实你也可以这么理解:拨打系统电话、发送短信它俩就是手机本身自带的两个app应用。

写到这里答案已经呼之欲出,上面打电话和发短信的实现代码大同小异,唯一的区别是传递的NSURL参数不一样,导致他们跳转到不同的应用场景。我们再仔细分析下传给它们的NSURL参数,就会发现NSURL的scheme(协议)不一样,打电话时“tel://”协议,发短信是“sms://”协议。(对协议有疑问的童鞋可以拉上去看)

一个总结:一个应用能打开另一个应用的必然条件是,另一个应用必须配置一个scheme(协议),这样应用程序才能根据协议找到需要打开的应用。

三、实现两个app间的跳转

创建两个示例Demo,TestDemo和Test2Demo,现在需要实现从Test2Demo跳转到TestDemo中

1、在被跳转的TestDemo配置一个协议scheme,这里命名为test(名字可随意配置,当然最好是英文并且跟你项目相关)

targets -> info -> URL Types ->URL Scheme ->填写协议

配置协议

注意:不需要填写成“test://”

2、在Test2Demo执行跳转的方法中实现下面方法

(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    NSURL *url = [NSURL URLWithString:@“test://”];

 

    if ([[UIApplication sharedApplication] canOpenURL:url]) {

 

        [[UIApplication sharedApplication] openURL:url];

 

    }else{

        NSLog(@“没有安装应用”);

    }

}

ok,到这里如果你的系统是ios9.0以下,已经大大功告成了。但是,如果是9.0以后,请看下一步。

3、配置协议白名单

在Test2Demo的info.plist文件中增加一个LSApplicationQueriesSchemes字段,把它设置为数组类型,并配置需要跳转的协议名单

配置协议白名单

到此,两个应用间的跳转已经完全实现,其实说穿了就三步,so easy!但是,很多时候,我不仅要跳转到一个应用上,而且还需要跳转到应用的指定界面,想知道怎么处理请接着往下看。

四、跳转到指定界面

想要跳转到指定界面,必然是上一个app告诉下一个app(被跳转的app)需要跳转到哪个界面,而如何告诉它这里便涉及到两个app的通信。我们从上面可以知道,两个app之间的跳转只需要配置一个scheme,然后通过UIApplication调用它的对象方法openURL:即可实现,除此之外再也没有实现任何代码了。而这之间是如何通信的呢?

答案依然是协议,请看下面步骤:

1、在”test://”协议后面的域名加上一些字段用来标记需要跳转的界面

//进入更多界面

(IBAction)intoMore:(id)sender {

    NSURL *url = [NSURL URLWithString:@“test://more”];

 

    if ([[UIApplication sharedApplication] canOpenURL:url]) {

 

        [[UIApplication sharedApplication] openURL:url];

    }else{

        NSLog(@“没有安装应用”);

    }

 

}

 

//进入设置界面

(IBAction)intoSet:(id)sender {

 

    NSURL *url = [NSURL URLWithString:@“test://set”];

 

    if ([[UIApplication sharedApplication] canOpenURL:url]) {

 

        [[UIApplication sharedApplication] openURL:url];

    }else{

        NSLog(@“没有安装应用”);

    }

 

}

2、来到被跳转的应用TestDemo的AppDelegate类的.m文件中,监听其代理方法application:handleOpenURL:

//当应用程序将要被其他程序打开时,会先执行此方法,并传递url过来

//注:下面这个方法9.0后就过期了,请注意适配,9.0后用这个方法:application:openURL:options:

(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

{

    NSLog(@“url:%@”,url.absoluteString);

    NSLog(@“host:%@”,url.host);

    if ([url.host isEqualToString:@“more”]) {

        NSLog(@“进入更多界面”);

        //到此做界面的跳转

    }

 

    if ([url.host isEqualToString:@“set”]) {

        NSLog(@“进入设置界面”);

        //到此做界面的跳转

    }

 

    return YES;

}

当Test2Demo点击进入更多界面打印如下:

2016-12-02 17:11:17.680 TestDemo[6507:495044] url:test://more

2016-12-02 17:11:17.681 TestDemo[6507:495044] host:more

2016-12-02 17:11:17.681 TestDemo[6507:495044] 进入更多界面

当Test2Demo点击进入设置界面打印如下:

2016-12-02 17:10:38.745 TestDemo[6507:495044] url:test://set

2016-12-02 17:10:38.745 TestDemo[6507:495044] host:set

2016-12-02 17:10:38.745 TestDemo[6507:495044] 进入设置界面

五、结束语

到此本篇博文要讲的基本结束,由于自身水平所限,如有疏漏之处望海涵和斧正。写技术博客真的不易,需要消耗大量的时间和精力,本人会持续更新一些自认为有用的技术点。

编写现代 CSS 代码的 20 个建议

明白何谓Margin Collapse

不同于其他很多属性,盒模型中垂直方向上的Margin会在相遇时发生崩塌,也就是说当某个元素的底部Margin与另一个元素的顶部Margin相邻时,只有二者中的较大值会被保留下来,可以从下面这个简单的例子来学习:

.square {  
    width: 80px;  
    height: 80px;  
}  

.red {  
    background-color: #F44336;  
    margin-bottom: 40px;  
}  

.blue {  
    background-color: #2196F3;  
    margin-top: 30px;  
}

在上述例子中我们会发现,红色和蓝色方块的外边距并没有相加得到70px,而是只有红色的下外边距保留了下来。我们可以使用一些方法来避免这种行为,不过建议来说还是尽量统一使用margin-bottom属性,这样就显得和谐多了。


使用Flexbox进行布局

CSS实战之Flex详解以及其在微信中的兼容实现

在传统的布局中我们习惯使用Floats或者inline-blocks,不过它们更适合于格式化文档,而不是整个网站。而Flexbox则是专门的用于进行布局的工具。Flexbox模型允许开发者使用很多便捷可扩展的属性来进行布局,估计你一旦用上就舍不得了:

.container {  
    display: flex;  
    /* Don't forget to add prefixes for Safari */display: -webkit-flex;  
}

我们已经在Tutorialzine上提供了很多的关于Flexbox的介绍与小技巧,譬如5 Flexbox Techniques You Need to Know About。

使用CSS Reset

虽然这些年来随着浏览器的迅速发展与规范的统一,浏览器特性碎片化的情况有所改善,但是在不同的浏览器之间仍然存在着很多的行为差异。而解决这种问题的最好的办法就是使用某个CSS Reset来为所有的元素设置统一的样式,保证你能在相对统一干净的样式表的基础上开始工作。目前流行的Reset库有 normalize.css, minireset以及 ress ,它们都可以修正很多已知的浏览器之间的差异性。而如果你不打算用某个外在的库,那么建议可以使用如下的基本规则:

* {  
    margin: 0;  
    padding: 0;  
    box-sizing: border-box;  
}

上面的规则看起来没啥用,不过如果不同的浏览器在默认情况下为你设置了不同的外边距/内边距的默认值,还是会挺麻烦的。

一切应为Border-box

虽然很多初学者并不了解box-sizing这个属性,但是它确实相当的重要。而最好的理解它的方式就是看看它的两种取值:

  • 默认值为content-box,即当我们设置某个元素的heght/width属性时,仅仅会作用于其内容尺寸。而所有的内边距与边都是在其之上的累加,譬如某个<div>标签设置为宽100,内边距为10,那么最终元素会占用120(100 + 2*10)的像素。

  • border-box:内边距与边是包含在了width/height之内,譬如设置了width:100px的<div>无论其内边距或者边长设置为多少,其占有的大小都是100px。


将元素设置为border-box会很方便你进行样式布局,这样的话你就可以在父元素设置高宽限制而不担心子元素的内边距或者边打破了这种限制。

以背景图方式使用Images

如果需要在响应式的环境下展示图片,有个简单的小技巧就是使用该图片作为某个<div>的背景图而不是直接使用img标签。基于这种方式配合上background-size与background-position这两个属性,可以很方便地按比例缩放:

img {  
    width: 300px;  
    height: 200px;  
}  

div {  
    width: 300px;  
    height: 200px;  
    background: url('http://cdn.tutorialzine.com/wp-content/uploads/2016/08/bicycle.jpg');  
    background-position: center center;  
    background-size: cover;  
}  

section{  
    float: left;  
    margin: 15px;  
}

不过这种方式也是存在缺陷的,譬如你无法设置图片的懒加载、图片无法被搜索引擎或者其他类似的工具抓取到,有个不错的属性叫object-fit可以解决这个问题,不过该属性目前的浏览器支持并不是很完善。

Better Table Borders

HTML中使用Tables进行布局一直是个很头疼的问题,它们使用起来很简单,但是无法进行响应式操作,并且也不方便进行全局样式设置。譬如,如果你打算为Table的边与单元的边添加样式,可能得到的结果如下:

table {  
    width: 600px;  
    border: 1px solid #505050;  
    margin-bottom: 15px;  
    color:#505050;  
}  

td{  
    border: 1px solid #505050;  
    padding: 10px;  
}

这里存在的问题是出现了很多的重复的边,会导致视觉上不协调的情况,那么我们可以通过设置border-collapse:collapse来进行处理:


注释格式优化

CSS虽然谈不上一门编程语言但是其仍然需要添加注释以保障整体代码的可读性,只要添加些简单的注释不仅可以方便你更好地组织整个样式表还能够让你的同事或者未来的自己更好地理解。对于CSS中整块的注释或者使用在Media-Query中的注释,建议是使用如下形式:

/*---------------  
    #Header  
---------------*/header { }header nav { }/*---------------  
    #Slideshow  
---------------*/.slideshow { }

而设计的细节说明或者一些不重要的组件可以用如下单行注释的方式:

/*   Footer Buttons   */   .footer button { }  

.footer button:hover { }

同时,不要忘了CSS中是没有//这种注释方式的:

/*  Do  */p {  
    padding: 15px;  
    /*border: 1px solid #222;*/   }/*  Don't  */p {  
    padding: 15px;  
    // border: 1px solid #222;     }

使用Kebab-case命名变量

对于样式类名或者ID名的命名都需要在多个单词之间添加-符号,CSS本身是大小写不敏感的因此你是用不了camelCase的,另一方面,很久之前也不支持下划线,所以现在的默认的命名方式就是使用-:

/*  Do     */   .footer-column-left { }   /*  Don't  */   .footerColumnLeft { }  

.footer_column_left { }

而涉及到具体的变量命名规范时,建议是使用BEM规范,只要遵循一些简单的原则即可以保证基于组件风格的命名一致性。你也可以参考CSS Tricks来获得更多的细节描述。

避免重复代码

大部分元素的CSS属性都是从DOM树根部继承而来,这也是其命名为级联样式表的由来。我们以font属性为例,该属性往往是继承自父属性,因此我们并不需要再单独地为元素设置该属性。我们只需要在html或者body中添加该属性然后使其层次传递下去即可:

html {  
    font: normal 16px/1.4 sans-serif;  
}

使用transform添加CSS Animations

不建议直接改变元素的width与height属性或者left/top/bottom/right这些属性来达到动画效果,而应该优先使用transform()属性来提供更平滑的变换效果,并且能使得代码的可读性会更好:

.ball {  
    left: 50px;  
    transition: 0.4s ease-out;  
}/* Not Cool*/.ball.slide-out {  
    left: 500px;  
}/* Cool*/.ball.slide-out {  
    transform: translateX(450px);  
}

Transform的几个属性translate、rotate、scale都具有比较好的浏览器兼容性可以放心使用。

不要重复造轮子

现在CSS社区已经非常庞大,并且不断地有新的各式各样的库开源出来。这些库可以帮助我们解决从小的代码片到用于构建完整的响应式应用的全框架。所以如果下次你再碰到什么CSS问题的时候,在打算撸起袖子自己上之前可以尝试在GitHUB或者CodePen上搜索可行方案。

尽可能使用低优先级的选择器

并不是所有的CSS选择器的优先级都一样,很多初学者在使用CSS选择器的时候都是考虑以新的特性去复写全部的继承特性,不过这一点在某个元素多状态时就麻烦了,譬如下面这个例子:

a{  
    color: #fff;  
    padding: 15px;  
}  

a#blue-btn {  
    background-color: blue;  
}  

a.active {  
    background-color: red;  
}

我们本来希望将.active类添加到按钮上然后使其显示为红色,不过在上面这个例子中很明显起不了作用,因为button已经以ID选择器设置过了背景色,也就是所谓的Higher Selector Specificity。一般来说,选择器的优先级顺序为:ID(#id) > Class(.class) > Type(header)

避免使用!important

认真的说,千万要避免使用!important,这可能会导致你在未来的开发中无尽的属性重写,你应该选择更合适的CSS选择器。而唯一的可以使用!important属性的场景就是当你想去复写某些行内样式的时候,不过行内样式本身也是需要避免的。

使用text-transform属性设置文本大写

<div class="movie-poster">Star Wars: The Force Awakens</div>  

.movie-poster {  
    text-transform: uppercase;  
}

Em, Rem, 以及 Pixel

已经有很多关于人们应该如何使用em,rem,以及px作为元素尺寸与文本尺寸的讨论,而笔者认为,这三个尺寸单位都有其适用与不适用的地方。不同的开发与项目都有其特定的设置,因此并没有通用的规则来决定应该使用哪个单位,这里是我总结的几个考虑:

  • em – 其基本单位即为当前元素的font-size值,经常适用于media-queries中,em是特别适用于响应式开发中。

  • rem – 其是相对于html属性的单位,可以保证文本段落真正的响应式尺寸特性。

  • px – Pixels 并没有任何的动态扩展性,它们往往用于描述绝对单位,并且可以在设置值与最终的显示效果之间保留一定的一致性。


在大型项目中使用预处理器

估计你肯定听说过 Sass, Less, PostCSS, Stylus这些预处理器与对应的语法。Preprocessors可以允许我们将未来的CSS特性应用在当前的代码开发中,譬如变量支持、函数、嵌套式的选择器以及很多其他的特性,这里我们以Sass为例:

$accent-color: #2196F3;  

a {  
    padding: 10px 15px;  
    background-color: $accent-color;  
}  

a:hover {  
    background-color: darken($accent-color,10%);  
}

使用Autoprefixers来提升浏览器兼容性

使用特定的浏览器前缀是CSS开发中常见的工作之一,不同的浏览器、不同的属性对于前缀的要求也不一样,这就使得我们无法在编码过程中记住所有的前缀规则。并且在写样式代码的时候还需要加上特定的浏览器前缀支持也是个麻烦活,幸亏现在也是有很多工具可以辅助我们进行这样的开发:

  • Online tools: Autoprefixer

  • Text editor plugins: Sublime Text, Atom

  • Libraries: Autoprefixer (PostCSS)


在生产环境下使用Minified代码

为了提升页面的加载速度,在生产环境下我们应该默认使用压缩之后的资源代码。在压缩的过程中,会将所有的空白与重复剔除掉从而减少整个文件的体积大小。当然,经过压缩之后的代码毫无可读性,因此在开发阶段我们还是应该使用普通的版本。对于CSS的压缩有很多的现行工具:

  • Online tools – CSS Minifier (API included), CSS Compressor

  • Text editor plugins: Sublime Text, Atom

  • Libraries: Minfiy (PHP), CSSO and CSSNano (PostCSS, Grunt, Gulp)

选择哪个工具肯定是依赖于你自己的工作流啦~

多参阅Caniuse

不同的浏览器在兼容性上差异很大,因此如果我们可以针对我们所需要适配的浏览器,在caniuse上我们可以查询某个特性的浏览器版本适配性,是否需要添加特定的前缀或者在某个平台上是否存在Bug等等。不过光光使用caniuse肯定是不够的,我们还需要使用些额外的服务来进行检测。

Validate:校验

对于CSS的校验可能不如HTML校验或者JavaScript校验那么重要,不过在正式发布之前用Lint工具校验一波你的CSS代码还是很有意义的。它会告诉你代码中潜在的错误,提示你一些不符合最佳实践的代码以及给你一些提升代码性能的建议。就像Minifers与Autoprefixers,也有很多可用的工具:

  • Online tools: W3 Validator, CSS Lint

  • Text editor plugins: Sublime Text, Atom

  • Libraries: stylelint (Node.js, PostCSS), css-validator (Node.js)

为什么要好好吃饭、睡觉、运动、读书、冥想?

今天,我们来说一说精力管理。

似乎说到精力管理这个词,就免不了想到时间管理,有节制的人生、自律而规律的生活,以及或许很快就可以逆袭人生的希望。

而事实上,作为80%的普通人中继续普通的我们,终其一生也未必也未必会有真正的“所谓逆袭”,或者实现赚个1000万的小目标。

可是,即便如此,即便或许我们的一生都注定平凡,那是否意味就着我们再也没有必要去费心思了解自己的精力状况,并且对之进行管理?

而正是在这个所有商家都在拼命用尽一切方式夺取我们注意力的移动互联网时代,在这个鸡汤与干货盛行鼓动所有人热血起来不要平庸的时候,我们才更需要留心去保护我们原本就有限的时间与能量。

只有这样,我们才有可能在各种信息的冲击中保持自我的知觉与理性的判断,才能更笃定自己的选择,才能更信任自己的力量。

1、精力管理是什么?


于我而言,精力管理并不是干货也不是鸡汤。

它首先而是一门知识,需要我们去学习与理解,然后是一种自我知觉,一种可以也应该持续一生的自我意识:

我们是否能够有清醒的觉察,能够留意自己的能量摄入,留意自己的精力消耗。

我们能够尽力在大部分清醒的时间里地保持自己身体、思维 、精神、情感的精力状态,持续地寻找或者投入到自己在意的事情中。

而不仅仅只是按照惯性生活。

《精力管理》 一书里说,“从生理的角度看,精力来源于氧气和血糖的化学反应。从实际生活来看,精力储备取决于我们的呼吸、进食的内容与时间,睡眠的长短与质量、白天间歇恢复的程度以及身体的健康程度。”


所以,把“精力管理”(这里侧重于讲身体的精力,思维、情感、精神精力我们之后再讲)放到我们日常每一天的生活中,那就是呼吸、饮食、睡眠以及运动。

2、为什么我们要好好吃饭、睡觉、运动、读书、冥想


 01   冥想

《精力管理》 里说,“生命中最重要的节奏常常被我们视为理所当然,尤其是呼吸和进食。延长呼吸时间有利于精力的恢复,也是健康的终极脉动。”

如果说饮食还算比较容易被注意到,那么呼吸与精力之间的关系几乎是被大部分人所忽视。

常常做瑜伽的人会知道,瑜伽从调整呼吸唤醒身体的热量开始,最终也以调整呼吸完成全身的放松而结束。

平静、有深度、有节奏地呼吸可以激活身体的能量,也能带来放松、平和与宁静。

所以,那么多人在说冥想或者坐享确实是有道理所在。如果我们不是所有人都可以也愿意在瑜伽中体会呼吸带给人的不一样的感受,那么坐享/冥想几乎是所有人都可以做到的事情。

刚起床的清晨或者下班回家后的时间,又或者睡前,找一个不吵闹的地方,躺卧或者盘坐,闭上双眼,专注于自己的呼吸。深深的呼,深深的吸。

不用以为冥想一定是要思考或者有什么更深层的含义,专注于自己的呼吸本身,就是一件足够有难度、有意义且有回报的事情。

每天15分钟专注于自己呼吸的冥想,如果你常常觉得很累,不妨试试看。

 02   饮食

我们体力的第二个重要来源就是食物。可即使是那样日常的一件事情,也未必表示我们在以相对更有利于精力恢复的方式进行。

比如,有些人常年喊着减肥,也常年用节食的方式期望体重能降下来。且不说体重是否真的能降下来,也不说体重降下来是否就等于身材更好。

仅说饥饿的状态代价就是对我们日常精力的必然损耗 — 我们将无法从食物中摄取足够的糖原转化为能量。

在饥饿的情况下,除了食物之外很难有其他事情能吸引我们的注意。我们的精力会更容易集中到食物上,而不是其他。

对于饮食,《精力管理》给出了3个建议:


吃适当的食物(血糖指数低、低热量、高营养的食物 )

以适当的频率 (少量多餐,每天吃5-6顿 )

吃适当的份量(6、7分饱,既不过饱也不过分饥饿)

看似简单,却并不容易做到。因为更常见的方式,是我们就按照自己长大的方式生活 ——读书、饮食、睡眠。


年纪小的时候随着家人的习惯而饮食,成年之后随着社会里上班族的习惯进行饮食(餐厅或者外卖或者快餐)。

所以,我们常常吃低营养高热量的快餐,并被其“美味”所持续吸引。

所以我们常常吃到过饱,以至于下午总是瞌睡连连。即便我们忧心过饮食与体重的关系,在了解精力管理之前,或许也从未真的思考过饮食与精力的关系。

要保持精力,我们需要对自己的饮食有所思考、有所节制和有所挑选。这并不表示我们需要对饮食有多么不近人情的控制。

事实上,长期的适度自律,搭配适度地自由享受,才是饮食的最佳的打开方式。

因为根据“80/20”原则:“如果你摄入的80%的食物都是健康且高效的,那剩下的20%可以是你喜欢的任何事物,只要分量控制得当。”

 03   睡眠

除了进食和呼吸之外,睡眠就是我们最重要的精力恢复来源。

尽管睡眠也是我们每一天的日常,我们或许也未必真的了解睡眠的原理。(今天篇幅有限,不展开,下次单独说。)

我们最常见的想法是:持续加班之后只有狂睡才能将能量补充回来。当我们热血沸腾的时候,就希望自己应该24小时能量满满,觉得睡觉根本是浪费时间,应该尽可能缩短。

包括尝试早起的人,或许很多也是通过减少睡眠时间从而腾出早上的时间来做一些事情。

而事实上,只有当我们得到了足够且高质量的睡眠,无论是身体还是思维都才能更有效地运转。

《超级精力管理术》里建议我们:


每天保证6-8小时睡眠时间;

睡前尽量不要工作或上网,让自己放松下来;

睡前不要摄入咖啡因和酒(微醺真的并没有有助于你的睡眠质量,尤其是后半夜)

如果你愿意将思考精力与睡眠的关系,并在自己的生活中去体会,逐渐的你一定会明白:即便是每一次打了鸡血后,也真的不需要通过减少睡眠去成就点什么。

因为减少了睡眠而多出来的时间里,你也未必能够拥有足够的思维和体能状态真的去做好些什么,或者持久地做些什么。

即使你每一次从无尽疲惫的加班状态中解脱后,你也不愿只通过超长的睡眠来补充体力。

你会明白,足够质量的睡眠就能够带给你一定程度的体能恢复,而全方位的休息与放松,还需要安排一些时间做适量的运动、见一见想见的人、投入一个让你忘掉压力的爱好。


04  运动

其实运动根本不用多说,几乎所有人都知道运动的长期价值。但是即便如此,大部分人还是几乎不锻炼。

原因也很简单,真的运动起来需要我们踏出舒适区,体验不适的感觉,并且这样“不适状态下的运动”需要持续一段时间才会见效。

受到人短视与自动寻求舒适的本性限制,大多数人在看到明显的效果之前就放弃了。

今天我想说的是,我们并不是人人都要成为马拉松跑者,参加健身选美,成为体能冠军。我们根本不需要给自己订过高的运动计划。

有时候,甚至只是每天一个俯卧撑就能让你的生活变得大不一样。

当我们不对健身和运动的效果有太过分的期待,只是将它当做日常的一个简单的环节,那它则很有可能想呼吸一样自然地持续每一天伴随我们。

就比如《微习惯》的作者就是从给自己设定“每天一个俯卧撑”开始,做到了后面一天100个俯卧撑。

他从头至尾的真实目标就只是“每天一个俯卧撑”,以少量到没办法做不到的任务来要求自己务必完成。

至于超额完成的部分,那都是附加值。有状态的时候就超额,而再辛苦的时候你依旧能保持这种持续运动的状态。

这样的状态,与给自己设定“每天100个俯卧撑”但从来坚持不到三天并在内心觉得自己毫无毅力根本无法坚持运动的状态,是完全不一样的!

如果你也愿意拥有更充沛的精力而付出一些额外的努力,给自己培养这样一个微习惯,未必不是一个好主意。

 05   阅读

精力管理和阅读有什么关系?

因为,如果不是阅读,我大概永远也不会在我日复一日又惯常的生活中遇到“精力管理”这个概念。

我也不会去了解到自己的精力状态原来有不同的四个维度(身体、思维、情感、意义或者精神),我也不会在这里将自己的所读、所想、所观与所感书写出来。

读书的确可以带给我们很多额外的价值,打开网页也有很多文章在讲怎样读书更有效,读什么书,以及读书怎样改变了自己的生活(包括我自己的文章)。

但从本质上讲,持续阅读本来就是我们生活的一部分,就像运动、就像饮食、就像呼吸一样,从来不需要有太多的目的和技巧。

所以,即便你不是大篇幅的主题阅读,即便你从来不做读书笔记,阅读也永远都是一件有意义的事。

不信的话,你去问问那些写读书文章的人,即便是远在自己还没开始写读书文章的时候,即便是我们最初并不知道读书有这番实用价值的时候,即便是别人都笑我们是书呆子的时候,我们依旧是和现在一样在阅读。

3、我们为什么要有意识地生活


所以,于我而言,精力管理就是这样一种自我意识:知道自己当下在如何生活,知道自己最终想要如何生活。

而尽可能地去缩小这两者间的距离,则是我们毕生都将面临的挑战,也是我们为什么要选择这样去生活,而不是按照惯性无意识地跟随感觉生活的理由。

昨天我看到一篇文章,讲的是两位二十多岁的女孩子开始创业做自己的工作室独白,文章是这两位姑凉一起写的。

文章的最后她们写到,“十年过后,我们也可以说,我们的二十几岁,每一天过得都充实而有意义。每一天,都是为自己而活着。”

看到这句话,我觉得十分触动。

在二十多岁的时候就能明确感受到自己内心所追随的事情,二十多岁就有能力真的开始做这件事情,二十多岁时可以不受制于太多束缚裹足不前,那是一种多么令人羡慕的美好。

但现实生活就是,我们并不是每个人都有这样的运气、实力和勇气,在年纪轻轻的时候就大放光彩。

但我们依旧有机会,也有权利,也有力量去把握住当下尚未流逝的每一刻,并在以后的每一天都更有自我知觉地生活。

我不为成为牛逼闪闪的人物。

我只为:平凡如我的人生,如果那十万分之一的运气在人生的中间段果真出现,如果我终于在某一天遇见了让自己内心发热的事情 —— 


那时,我还能保持着充足的身体能量与心里的勇气去追随,即便我不再是年轻的岁数,不再有年轻的身体。


你连自律都做不到,还奢谈什么自由?

牛人都是狠角色

据说史蒂夫·乔布斯年轻时每天凌晨四点起床,九点前把一天工作做完。乔帮主说:自由从何而来?从自信来,而自信则是从自律来。

自律是对自我的控制,自信是对事情的控制。先学会克制自己,用严格的日程表控制生活,才能在这种自律中不断磨练出自信。

都是成年人,连最基本的行为控制都做不到,还谈什么自信?又奢谈什么自由? 

前华人首富李嘉诚以勤奋自律著称。他的作息时间非常有名:

不论几点睡觉,在清晨5点59分闹铃响后起床;随后,读新闻,打一个半小时高尔夫;然后,去办公室开始工作。数十年如一日,自律几近自虐。

印象里的牛人都是狠角色,自虐和虐他,必居其一,或者两条都占。 

许多商务人士像职业运动员一样管理自己的作息、饮食、习惯、爱好、体力、欲望等。如果做到了这点,你就快摸到“牛人”的门了。一个能管住嘴、迈开腿、每晚坚持跑步的人,工作上也不会差到哪去。

工作后,逐渐发现,自律是生活的基石:

令行禁止,则容易走上轨道,发现错误,修复错误,表现越来越好,生活明亮,中气十足;

令不行禁不止,则容易溃散混乱,屡错屡战,屡战屡错,“明明知道但就不这么做”,沮丧内疚,乱成一团。

自律决定了个人机器的运转,决定了你的执行力,决定了你能否成为更好的自己。

 

他的成功给了平凡人一点念想

史蒂夫·纳什是我最喜欢的NBA球员。这是个身体瘦弱的加拿大白人,背部神经有着严重伤病,被认为是“天赋最差的篮球巨星”。

这样一个人,获得了“连庄”MVP:连续两个赛季的最有价值球员。历史上只有十个人做到这点,其余九人都是乔丹、张伯伦等旷世大神。 

纳什出了名的自律:

不沾糖、油炸和深加工食品。训练日里,他一天吃六餐:麦片粥(不含谷蛋白)、杏仁切片、生坚果、水果、蔬菜、糙米饭、胡萝卜和生吃芹菜。 

他和队友格兰特·希尔彼此劝励,不吃巧克力,不吃高热量。希尔还“偶尔犯戒被抓住”,而纳什真没被见到破例。

纳什把他的食谱推荐给队友。于是,太阳队的年轻人都成了纳什的跟班,然后表现脱胎换骨。整个球队都在尽量跟着纳什:吃喝,作息,训练,保持健康的氛围……

纳什的成功给了平凡的普通人一点点念想:

如果没有天赋,你永远成不了科比或者麦迪;但如果足够勤奋自律,至少你还有机会成为纳什。 

天赋,上天给的;自律,决定权在你。


让欲望匹配你的现实

欲望管理是重要的人生技能,是要尽早培养锻造的素养。 

从感性的角度,过度的欲望会吞噬你。

饮食男女,人之大欲。欲望连同本心,不必畏惧,但过度的欲望会吞噬你。从人生的角度,一定要懂得节制,不要肆意地放纵欲望。不信?你去问问隋炀帝杨广。

放纵如山倒,自律如抽丝。不要放纵自己,不要给自己找借口。对自己严格一点,时间长了,自律会成为一种习惯、一种生活方式,未来的你会感谢现在的自己。

很多人不知道修心的重要,借口生活压力而放纵欲望。年轻时奋力上进,应该如清理院子一样剪除杂草杂念,专注于自身成长。“为腹不为目”,才是永葆内心幸福之所为。

我不想做欲望的奴隶。我享受不被欲望左右的状态,这种感觉不刺激,但很舒服。

从理性的角度,欲望管理能降低阈值。

穷学生的时候,一顿沙县小吃也津津有味,一顿肯德基如同过年;长大挣钱了,山猛海鲜鲍鱼大虾,也未必能勾起你的兴致。

九十年代,武侠小说的情爱描写都能把你看的面红耳赤;网络色情泛滥的当今,你居然对生活中的女人没了想法。

何以至此?阈值使然。不断持续的刺激,抬高了欲望的触发点。

人们常说,“年轻吃苦不是苦,是福气”。这不纯粹是鸡汤,这有逻辑基础:年少吃苦是种逆风飞扬的快乐,年老吃苦是风中残烛的悲哀。先苦后甜,可以忆苦思甜;先甜后苦,只能垂泪抑郁了。

一定程度的禁欲和自控是必要的,这是防止阈值升高的有效手段。欲望永无止境,中彩票的极度兴奋也只会持续18个月。

最幸福的方式是,让欲望一点点释放,让欲望匹配你的现实:

漂泊北京、合租房子、 独租大房子、拥有自己的房子了、 当上总经理、出任CEO、走上人生巅峰……

如果经历反过来?那真是个悲伤的故事。

 

所谓的工作狂,可能只是不够自律

刚工作那会,不懂得节奏,是个“时间都被工作填满”的工作狂。研究时间管理之后,发现工作生活有很大的改进空间。

尝试做计划、写日记、控制注意力、 要事优先、今日事今日毕、先啃硬骨头、构建自己的时间管理系统、平衡好工作和家庭……

慢慢的,我开始从繁琐失误中抽身出来,“跳出画来看画”;我开始有时间考虑生活和人生的目标;我开始有“心如止水、有条不紊”的感觉——这一切的源头,就是自律。 

自律的结果就是有更多精力去做喜欢的事。

比如写公众号,给我带来了很多不曾预期的乐趣。实际上,搭好架构,想好打法,走上轨道后,这项活动就不会影响我的正常生活了:不太忙的时候,就写几段。就像是一个时间容器,把边边角角的时间都存储了起来。

从2010年开始写日记,习惯保持到现在。经过最开始的一段磨合,所有不适感都消失了,非常自然。几分钟的记录,让我审视自己、平和心态。它不是我的任何负担,也不是一项需要分配的工作,它是老司机的人生行车记录仪。 

几年前开始早睡早起。从最初的“不舒服不适应”,到现在的“每天六点自然醒”。早起的好处是巨大的:凭空多出精华般的两小时;能够从容不迫地好好吃早饭;错开拥挤的早高峰;午饭质量更高,晚饭吃的更少,睡眠更踏实…… 

当身体变得越来越棒时,面对的是一个与众不同的世界。自律让我能去享受生活中好的一面。


自律让你自由

我的人生目标是:自由。它又包括了财务自由、时间自由和角色自由这三个维度

感谢这个色彩斑斓、机遇涌动的时代,让这个目标看起来并非不可企及,但这需要十几年的精耕细作,连续稳定的正向积累,脚踏实地的点滴付出,还有,持续不懈的自律。 

自律让你自由。


“本能”,是当年我们面对蛮荒时最趁手的工具。

“本能”,也是我们今天参与竞争时最凶险的敌人。

原因很简单——

1. 在个体被充分赋能的时代,选择决定命运。

2. 绝大多数人,只会依据本能进行选择。

3. 纵容本能,就是和绝大多数人做同样选择。

所谓“别人贪婪时我恐惧、别人恐惧时我贪婪”,就是一场和“本能”的作战。

严苛的自律,是驱除本能的唯一方法。


[hermit auto="0" loop="0" unexpand="0" fullheight="0"]remote#:4,3,2,1[/hermit]

视频播放器随页面滚动缩放


//

//  ODVideoDetailController.m

//  oudaBuyer

//

//  Created by lixiang on 2016/11/22.

//  Copyright © 2016 ouda. All rights reserved.

//

#import “ODVideoDetailController.h”

#import “LEOHeaderView.h”

#import “ODShopSpecialSingleListCell.h”

@interface ODVideoDetailController ()<UITableViewDelegateUITableViewDataSource>

@property (nonatomicstrongUITableView *tableView;

@property (nonatomicstrongLEOHeaderView *headerView;

@property (nonatomicassignCGFloat smallWH;//播放器最小的时候的宽度 高度

@end

@implementation ODVideoDetailController

– (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    self.navigationController.navigationBar.hidden = YES;

    [self.headerView reloadWithScrollView:self.tableView];

}

– (void)viewDidLoad {

    [super viewDidLoad];

    

    if (kWidthOfScreen == 320) {

        self.smallWH = 100;

    }else if (kWidthOfScreen == 375){

        self.smallWH = 146;

    }else if (kWidthOfScreen == 414){

        self.smallWH = 174;

    }

    

    self.view.backgroundColor = [UIColor whiteColor];

    self.automaticallyAdjustsScrollViewInsets = NO;

    

    self.tableView = [[UITableView allocinitWithFrame:CGRectMake(0self.smallWHkWidthOfScreenkHeightOfScreen – self.smallWH)];

    self.tableView.dataSource = self;

    self.tableView.delegate = self;

    self.tableView.showsVerticalScrollIndicator = NO;

    self.tableView.contentInset = UIEdgeInsetsMake(kWidthOfScreen – self.smallWH000);

    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

    self.tableView.backgroundColor = [UIColor clearColor];

    [self.view addSubview:self.tableView];

    

    self.headerView = [[LEOHeaderView allocinitWithFrame:CGRectMake(00kWidthOfScreenkWidthOfScreenandVideoUrl:[NSURL URLWithString:self.model.videoInfo.pathandWH:self.smallWH];

    self.headerView.tableView = self.tableView;

    [self.view addSubview:self.headerView];

}

– (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    [self.headerView reloadWithScrollView:scrollView];

}

// 有可能成为最终滚动的位置

– (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    if (scrollView.contentOffset.y > 0) {

        [self.headerView confirmSmall];

    }

    if (scrollView.contentOffset.y == –kWidthOfScreen+self.smallWH){

        [self.headerView confirmBig];

    }

}

– (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return 2+self.model.goodsList.count;

}

– (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.row == 0) {

        ODSpecialVideoDetailCell *cell = [ODSpecialVideoDetailCell cellWithTableView:tableView];

        cell.model = self.model;

        return cell;

    }

    

    if (indexPath.row == 1) {

        UITableViewCell *cell = [UITableViewCell new];

        cell.textLabel.text = @”    视频内商品信息;

        cell.textLabel.textColor = ODBlackColor;

        cell.textLabel.font = [UIFont systemFontOfSize:14 weight:UIFontWeightMedium];

        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        UIView *line1 = [[UIView alloc]initWithFrame:CGRectMake(1514.7590.5)];

        line1.backgroundColor = ODFontGrayColor;

        [cell.contentView insertSubview:line1 belowSubview:cell.textLabel];

        

        UIView *line2 = [[UIView alloc]initWithFrame:CGRectMake(13514.75kWidthOfScreen1600.5)];

        line2.backgroundColor = ODFontGrayColor;

        [cell.contentView addSubview:line2];

        

        return cell;

    }

    

    ODShopSpecialSingleListCell *cell = [ODShopSpecialSingleListCell cellWithTableView:tableView];

    cell.model2 = self.model.goodsList[indexPath.row2];

    return cell;

}

– (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.row == 0) {

        return 115+[self.model.videoInfo.desc getLabelHeightWithFont:[UIFont systemFontOfSize:14 weight:UIFontWeightLightwithLineSpacing:6 maxSize:CGSizeMake(kWidthOfScreen30MAXFLOAT)];

    }

    if (indexPath.row == 1) {

        return 30;

    }

    return 120;

}

@end

#import “LEOHeaderView.h”

@interface LEOHeaderView ()<VIMVideoPlayerViewDelegate>

@property (nonatomicassignCGFloat smallWH;//播放器最小的时候的宽度 高度

@end

@implementation LEOHeaderView

– (instancetype)initWithFrame:(CGRect)frame andVideoUrl:(NSURL *)url andWH:(CGFloat)wh{

    if (self = [super initWithFrame:frame]) {

        self.smallWH = wh;

        self.playerView = [[VIMVideoPlayerView alloc]init];

        self.player = [[VIMVideoPlayer alloc]init];

        [self.playerView setPlayer:self.player];

        [self.playerView.player setURL:url];

        self.playerView.backgroundColor = [UIColor blackColor];

        self.playerView.size = CGSizeMake(kWidthOfScreenkWidthOfScreen);

        self.playerView.center = CGPointMake(kWidthOfScreen/2kWidthOfScreen/2);

        [self addSubview:self.playerView];

        self.playerView.delegate = self;

        [self.player play];

    }

    return self;

}

– (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    UIView *hitView = [super hitTest:point withEvent:event];

    CGPoint cPoint = [self convertPoint:point toView:self.playerView];

    if ([self.playerView.layer containsPoint:cPoint]) {

        return hitView;

    }else{

        return self.tableView;

    }

}

– (void)reloadWithScrollView:(UIScrollView *)scrollView {

    CGFloat offsetY = scrollView.contentOffset.y + kWidthOfScreen – self.smallWH;

    if (offsetY < 0) {

        

    else if (offsetY > 0 && offsetY <= kWidthOfScreen – self.smallWH) {

        self.top = -offsetY / 2;

        CGFloat kEachPixel = (1 – self.smallWH / kWidthOfScreen) / (kWidthOfScreen – self.smallWH);

        CGFloat kScale = 1 – offsetY * kEachPixel;

        self.playerView.frame = CGRectMake(0, offsetY / 2kWidthOfScreenkWidthOfScreen*kScale);

    }

}

– (void)confirmSmall {

    [UIView animateWithDuration:0.3 animations:^{

        self.top = –self.smallWH;

        self.playerView.frame = CGRectMake(0self.smallWHkWidthOfScreenself.smallWH);

    }];

}

– (void)confirmBig {

    [UIView animateWithDuration:0.3 animations:^{

        self.top = 0;

        self.playerView.frame = CGRectMake(00kWidthOfScreenkWidthOfScreen);

    }];

}

– (void)videoPlayerViewDidReachEnd:(VIMVideoPlayerView *)videoPlayerView {

    [self.player.player seekToTime:kCMTimeZero];

}

@end

新世相:我为什么劝你过无聊的生活

翻看新世相文章下面的评论区,是我每天最享受的时刻。一天到了最后,整个白天生活的快乐、焦躁都沉淀在一起,不管说什么话,都有可能不小心把这些沉淀的情绪和见识触发。

你能在底下看到简单的一两句交代,或者一些直戳人心的金句。所有精彩都是从普通生活里沉淀出来的。相比于做一个“很酷的公众号”,我更喜欢现在的样子。

最酷的事情往往来自普通生活,而不在普通生活之外。

很多人都期望过更酷的生活。比如,和“在办公室里整理报表”的人生相比,“去地中海当潜水员”的人生显得更吸引人。后者稀有、挑战日常,听起来的确更值得追求。

年轻人会把“无聊的人生不值得过”作为自己的口号,这句话背后的意思应该是:不要盲目地按社会规则按部就班,要刺激,要精彩。这句话是对的,但这句话有一些误导性。

对更酷的、更有趣的生活的热情夸赞,使我们进入了一个圈套。人们按照字面意思理解这句话,认为无聊的人生的确不值得过,进而,认为正常的人生不值得过。

它带来的问题是,当生活进入必要的重复时,我们也认为那是单调、乏味的,并感到害怕。

在毕业典礼上,人们会鼓励我们去改变世界,告诉我们去做让人为之一振的事情是重要的。但很少有人强调:改变世界经常要重复做某种事情,做饭、洗碗、装修房子也是重要的。这其实是个老问题:相对于成为英雄的哪一个闪光时刻,很少有人好好地谈论日复一日上班赚钱的责任。

或者说,那些为了实现伟大理想而必须重复做的并不伟大的事情的重要性,被非常明显地忽视了。没有人教会我们过一种普通的生活也是重要的,我们也不知道如何正确理解那些看似无聊的生活,理解它的价值。

我们患上了“平庸恐惧症”,对稍加重复的生活感到害怕,驱使很多人包装自己,不断地破坏,不断地改变,认为普通的生活是一种失败。于是陷入到一种为了特立独行而特立独行的盲目追求里。改变有时候是正确的,有时候则不是。如果只是因为害怕“没有在改变”而改变自己,那么这种改变可能彻底破坏实现好生活的可能。

一味逃避平庸,可能是不知道自己的终点是什么,因此也没有在这种平庸和重复中看到价值。

有目标感的人是不惧怕单调和无聊的。

比如,编辑辞典,听起来就是很乏味的一件事。日本电影《编舟记》中,在出版社工作的男主角得知自己被调派到辞典编辑部门的时候,简直想要放弃人生。那是一种“闷到生蘑菇”的生活状态,每天固定的时间上班打卡,校对错别字,下班。

当他终于有了“好好编辑一本辞典”的欲望时,面对明明跟以往同样的生活时,自己的状态却发生了完全的改变。

酷是如何诞生的?

没被人发掘出的好东西才拥有变成酷的可能。但是发掘好东西的过程,无论是独一无二的艺术作品、隽永的设计或是绝顶聪明的发明,都是需要大大付出一番重复的苦功。无聊通往酷,酷是漫长的无聊生活中得出的精华。

不要误以为生活可以只有精华。

就像没有人天生就把做一位人口普查员当成自己的志向,但教育方针、福利制度、就业政策,它们都与走访每一户居民的无聊生活密不可分。

事实就是这样,真相是酷的生活也丝毫不酷。即使是成功占领生活中一切乐趣的人,也在乖乖履行着自己的义务,竭力耗尽脑内的灵感与天赋,所有人都进行着乏味的工作。

在为西斯廷教堂的天顶画《创世纪》的时候,米开朗基罗一个人坐在脚手架上,忍受4年5个月的重复的乏味,这是他作为一名画工的本分。这跟地铁运营员每天喊五百次“注意脚下”是一样的。

真正酷的人,其实只是比无聊的人先熬过了无聊生活。

知乎:写作的意义是什么?

[hermit auto="1" loop="0" unexpand="0" fullheight="0"]remote#:4,3,2,1[/hermit]

作者:采铜

幸运的是,写作的意义、动机和喜悦是多重的:

  1. 写作是记忆的重建

我们脑中的记忆可能会消退、扭曲,也可能会重组、强化,而写作就是重新塑造它们的方式。通过写作,某些深潜在心底多年的记忆浮现,童年往事、青涩恋情、久远见闻,如被一条细藤慢慢抽出,让我们重新为之唏嘘。通过写作,脑海中某些重要的经验和知识被提取出来,通过写作而得以强化。个人记忆中的种种碎片,那些因理解而分解的一个个知识点,在我们写成的一篇篇文章中初次相遇或者久别重逢,因写作而联结成网。

  1. 写作是潜意识的外化

林林总总的想法,甚或吉光片羽,初潜于我们的脑中时,只是一些微渺的闪烁的光点。少数可能会被你注意到,而更多的则一闪而灭,如一抹流星消逝在思想的暗夜,或是作为一艘沉船,永远地躺着意识的深谷。而写作则可以把它们点燃,让它们浮现,让它们奔涌而出,让它们自己生长、壮大然后完整。

  1. 写作是思维的检视

我们的头脑中充斥着偏见、盲点和各种自相矛盾。在发牢骚、做白日梦或者与人胡吃海吹时,我们对它们是宽容的,甚至乐于放大和展现它们。而当我们要将想法诉之笔端,变成一篇篇完整的文字时,我们不得不严肃和审慎起来。逻辑上的矛盾、事实上的偏差、理念上的狭隘到哪怕一个错别字都可能格外刺眼。因此对于写作者来说,写作正是他们检视自己思维的良机。一个优秀的写作者一定是一个优秀的思考者,因为正是写作训练了他的思考,而思考又促成了他的写作。

  1. 写作是一种自我探索

写作是这样一种魔法,每时每刻,它都在上演已知和未知的奇遇。写作必须依凭于我们头脑中已知的东西,但同时,在写作中,新的从未出现过的想法又会突然涌现,为我们带来惊喜。而这些新的想法也并非凭空冒出,而是扎根于我们已有的经验中,是对这些经验的重新发现。同时,写作构建了一种深度,这种深度最适合自我审视。通过写作,通过写作中的自省,通过写作中的奇妙探索和相遇,那个原本模糊斑驳的自己逐渐清晰。正如阿兰·罗伯—格里耶所说:「作家,从定义上说,不知该走向何方,他写作是为了明白他为什么渴望写作」。

  1. 写作让写作者成为上帝

当我们写作时,我们就成了上帝,得以自由建筑一个世界。本雅明说:「写一篇好散文要经过三个台阶,一个是音乐的,这时它被构思;一个是建筑的,这时它被搭建起来;最后一个是纺织的,这时它被织成」。写作就是这样一种丰富而多元的创造活动。你可以像一个音乐家一样,像一个建筑师一样,像一个手艺人一样,也可以像一个程序员一样,一个导演一样,为这个世界创作出前所未见的东西。在你的创作世界里,你可以创造一切也可以毁灭一切,你可以歌颂一切也可以诅咒一切,你可以幻想一切又可以逃避一切。你就是上帝。

  1. 写作是一种介入的方式

通过写作,我们发表对世界的看法、忧虑和希冀。写作是一种介入的方式,即便我们蜗居在一个逼仄的隔间,或者坐在轮椅之中,卧在病榻之上,我们依旧可以写作,与世界交谈,并改变着世界。写作主要改变着这个世界的观念,观念无形,却威力巨大。观念的改变是悄无声息的,也常常是缓慢的,所以写作者需要有足够的耐心,与那些坚硬或者凝固的东西周旋。

  1. 写作是对其他灵魂的回应和召唤

阅读一部伟大的作品,也许你可以感受到作者的召唤,而当你也起笔写作时,很可能是在回应那种召唤。所以很多写作者乐意讲述他们思想或者文字上的师承。但是据说,召唤和回应是不对等的。当召唤发出之后,回应往往姗姗来迟,所以人类历史上满是伟大的孤独的灵魂。所以如果你能读懂某种召唤,就请义无反顾地写吧,你的写作是将是一种跨越时空的温情陪伴,也将在未来激起回响。

  1. 写作就是写作本身

写作的意义也在于写作本身,就像美的意义在于美本身。当一个个字、词、句串接在一起,变成一个完好的作品之时,它便有了所有的可能。它可以被各种诠释,它可以构成一种独特的美,它自有其生命力。而写作者,可能只是由文字驱遣的使徒,在那些跳跃的字符的魅惑下,倾尽全力,只为那天赐的作品诞生。写作就是写作本身,它有太多的意义,它也不需要意义,它就是一种桀骜的存在。

而我为什么写作呢?

正因为如上的诸种意义,写作成了我的责任。

给自己插播一则广告:我的第一本书《精进:如何成为一个很厉害的人》上市啦,在当当、京东、亚马逊、天猫等平台搜索“很厉害的人”即可。

教你如何利用搜索引擎高效的学习

[hermit auto="1" loop="0" unexpand="0" fullheight="0"]remote#:4,3,2,1[/hermit]

1. 了解搜索引擎的工作原理

这里有Google搜索引擎的介绍,就不赘述,请移步。
https://www.google.com/insidesearch/howsearchworks/thestory/ "Google: How search works"
我们需要明白的是,我们在利用搜索引擎进行检索时,搜索的不是网络,而是建立好的数据库。

2. 明确搜索引擎是否是获取资料最佳途径

在获取文献,商业库的数据时搜索引擎并不是最佳的获取方式。如你想网购,可以直接去Tmall;购买火车票,直接去12306。因此在获取资料前先评定搜索引擎是否是最佳途径。

3. 如何高效检索

利用搜索引擎进行检索有三个层次:
第一个层次:只会输入关键词,碰到搜索不到的情况便会无所事事;
第二个层次:能用一些关键词组合,会逻辑关系,甚至会用高级检索;
第三个层次:对于互联网有深刻理解,利用互联网进行高效搜索直达结果,黑客级别。
对于第二、三层次的检索需要一定的技巧,下面就一一介绍。
正如大家所知,搜索引擎的种类不少,主要是五大搜索引擎:google,百度,bing,360,搜狗。这里主要以Google和百度为例介绍,Google打不开的建议翻墙使用。

(1)学会用高级搜索

Google 搜索工具

Google 搜索工具

点击Google 右上角高级搜索就会出现下图界面。

Google 高级搜索界面

Google 高级搜索界面

在页面相应位置填写符合你搜索资料的属性,可以大大排除不相关信息,快速定位你需要的内容。
百度搜索引擎首页右上角点击设置便可看到高级搜索,点击后进入高级搜索,和Google类似。

百度搜索工具

百度搜索工具
百度高级搜索界面

百度高级搜索界面

(2)学会使用简单逻辑关系

学会使用简单的逻辑关系能让你事半功倍。
空格=and, + – " "
无需用“+” 来表示逻辑“ 与” ,只要空格就可以了。
范例:搜寻所有包含关键词“暖男” 和“ 绿茶婊” 的中文网页
搜寻:“ 暖男 绿茶婊”
注意:文章中搜寻语法外面的引号仅起引用作用,不能带入搜寻栏内。

用减号“-” 表示逻辑“ 非” 。
范例:搜寻所有包含“ 暖男” 而不含“ 绿茶婊” 的中文网页
搜寻:“ 暖男-绿茶婊”
注意:这里的“+” 和“-” 号,是英文字符,而不是中文字符的“ +” 和“ -” 。此外,”+” 或”-“ 两侧的关键字之间不能有空格。比如“ 暖男- 绿茶婊” ,搜寻引擎将视为逻辑“ 与” ,中间的“-” 被忽略。

用大写的“OR” 表示逻辑“ 或” 。但是,关键字为中文的” 或” 查询似乎还有BUG ,无法得到正确的查询结果。
范例:搜寻包含布兰妮“Britney” 或者披头士“Beatles” 、或者两者均有的中文网页。
搜寻:“ britney OR beatles ”
搜寻:“ 布兰妮OR 披头士”
结果:找不到和您的查询- 布兰妮OR 披头士- 相符的网页。
注意:小写的“or” ,在查询的时候将被忽略;这样上述的** 作实际上变成了一次“ 与” 查询。

(3)搜索图片

Google:搜索工具

(4)学会使用搜索命令

inurl
inurl: 指令用于搜索查询词出现在url 中的页面。bd和Google 都支持inurl 指令。inurl 指令支持中文和英文。
比如搜索:inurl:搜索引擎优化

返回的结果都是网址url 中包含“搜索引擎优化”的页面。由于关键词出现在url 中对排名有一定影响,使用inurl:搜索可以更准确地找到竞争对手。

inanchor
inanchor:指令返回的结果是导入链接锚文字中包含搜索词的页面。百度不支持inanchor。
比如在Google 搜索 :inanchor:点击这里
返回的结果页面本身并不一定包含“点击这里”这四个字,而是指向这些页面的链接锚文字中出现了“点击这里”这四个字。
可以用来找到某个关键词的竞争对收,而且这些竞争对手往往是做过SEO 的。研究竞争对手页面有哪些外部链接,就可以找到很多链接资源。

intitle
intitle: 指令返回的是页面title 中包含关键词的页面。Google 和bd都支持intitle 指令。
使用intitle 指令找到的文件是更准确的竞争页面。如果关键词只出现在页面可见文字中,而没有出现在title 中,大部分情况是并没有针对关键词进行优化,所以也不是有力的竞争对手。

allintitle
allintitle:搜索返回的是页面标题中包含多组关键词的文件。
例如 :allintitle:SEO 搜索引擎优化
就相当于:intitle:SEO intitle:搜索引擎优化
返回的是标题中中既包含“SEO”,也包含“搜索引擎优化”的页面

allinurl
与allintitle: 类似。
allinurl:SEO 搜索引擎优化
就相当于 :inurl:SEO inurl:搜索引擎优化

filetype
用于搜索特定文件格式。Google 和bd都支持filetype 指令。
比如搜索filetype:pdf SEO
返回的就是包含SEO 这个关键词的所有pdf 文件。

site
site:是SEO 最熟悉的高级搜索指令,用来搜索某个域名下的所有文件。
以上简单搜素命令中最常用的是intitle,filetype和site。

学习以上技巧后要经常使用,熟能生巧,经常总结,不断提高搜索效率。

吴晓波:书籍让我的居室和生活拥挤不堪

[hermit auto="0" loop="0" unexpand="0" fullheight="0"]remote#:4,3,2,1[/hermit]

我第一次有记忆的阅读经验应该是10岁那年。刚刚认得了上千个汉字的我,读的第一本“成年读物”是繁体字的《三国演义》,它是“文革”前的遗物,黄旧不堪,躺在一个大木箱子的杂物之中,好像已经等了我很多年。就是这本书让我终生喜欢大鼓齐鸣的刚烈文字,而对婉约温润的风格不以为然。

和许多人一样,在读大学前,我的整个阅读是非常枯燥的,以教科书为主。而我是1986年进的大学,那个时候正是中国出版很活跃的一段时期。诗歌是年轻人的最爱,我记得谢冕编过一套《朦胧诗选》,当时非常喜欢。那时候大学里最流行读的书就是存在主义,于是读了最多存在主义的作品,如尼采、萨特,我们这一代人受他们的影响太大了。周国平写的《尼采:在世纪的转折点上》让我印象深刻,他后来会“转型”成一位心灵鸡汤型的导师,让我非常吃惊。

《尼采:在世纪的转折点上》,周国平著

我在上海读书,而女朋友在杭州,大学四年没有条件见面谈恋爱,所以大部分时间都是在复旦大学的图书馆里度过的。我是学新闻的,课程比其他系的同学都要轻松,所以就在图书馆读书,一排一排地读,从一楼一直读到了阁楼,复旦图书馆的阁楼是向研究生和博士生开放的,本科三年级的时候我就到阁楼上去读书了。那时候的阅读是一种集体阅读,集中在哲学、历史和文学方面。

我大学学的是新闻,专业的书我印象没有多少,但我看张季鸾的所有作品,就是他当年办《大公报》写的评论,印象很深。因为从这些作品里你看到的是一种这个职业的气节,以及敏锐性。新闻是很容易做得平庸的一种职业,特别是你做的时间越长,抱怨和不平衡就会越大,老是写字会感觉得不偿失,但一旦停止写字也就没有了你的价值。做媒体的很容易陷入到这样的情绪里。但是我当了十多年记者,一直没有这样的感觉,就是因为在大学里我读过这样的作品,我知道一个好记者应该怎样让自己留下来。当年的许多政治人物都烟消云散了,但我们依然能记住这些记者的名字与作品。这些作品帮助我们建立一种职业和人生的价值观。

对我影响大的经济学读物有两本,我接触的第一本经济学著作就是萨缪尔森的《经济学》,而我也是凭借这本书进入新华社工作的。因为当时要考取新华分社,但新华社一般招人都会从实习生里选拔,而我没有在那里实习过,所以他们考我就是用萨缪尔森的《经济学》,从此,我开始了13年的商业记者生涯。另外一本是曼昆的《经济学原理》,曼昆的思想和他的创作技巧让我很着迷。在过去20年里,我读过很多财经类图书,如韦尔奇的管理书籍、《长尾理论》等等,但是如果从30年的角度来讲,这些书对我的影响还不如一本《三国演义》大。

我后来成了一个专业从事企业案例和经济史写作的财经作家,在这个领域中,有两位顶级高手,美国的理查德·泰德罗和英国的尼尔·弗格森,他们都出生于1960年代,年强力壮。泰德罗的《影响历史的商业七巨头》,让我见识到当世欧美学者的财经写作高度。尼尔·弗格森的创作更勤勉,《文明》、《货币的崛起》、《巨人》以及五卷本的《罗斯柴尔德传》都堪称精品,他在建构一个雄大题材时的自信、从容及充满了偏见的武断,在当代非虚构类作家中很是少见,他的写作非常迷人。

至于华人经济学家,最喜欢的是张五常的作品。当初读到他的《卖桔者言》时,感觉以这样的手法来写一本经济学书实在很有趣,读他的《经济解释》更是震慑于他的智力。后来我写《激荡三十年》,便恳请张五常为我题写书名,他在西湖边的一个茶楼里,铺纸研墨,一口气连写了十多遍,那个认真劲令人难以忘怀,我向他请教做学问的办法,他说,“问题有重要与不重要之分,做学问要找重要的入手,选上不重要的问题下功夫,很容易转眼间断送学术生涯。”这段话,值得抄在这里送给所有的年轻朋友们。

张五常教授与“激荡三十年”

我现在每年买200本书,也就是每年在家里添一个双门书柜,书籍让我的居室和生活拥挤不堪。望着这些新旧不一的“朋友”,我终于发现,我们并没有生活在单调的年代,也许没有一个年代的人、也没有一个国家的人——尤其是欧美国家的人们——像我们这样的五谷杂粮、精粗不弃,为了求得寸及的进步,我们愿意接受所有的文明形态,这是一个转型年代的特征,我们在思想上左冲右突,其慌乱和惊心宛若物质生活中的所有景象。

二维码扫描动画


#import “ViewController.h”

@interface ViewController ()

@property (nonatomicstrongNSTimer *timer;

@property (nonatomicstrongUIView *line;

@property (nonatomicassignint num;

@property (nonatomicassignBOOL goUp;//从下往上

@end

@implementation ViewController

– (void)viewDidLoad {

    [super viewDidLoad];

    UIView *boxView = [[UIView alloc]initWithFrame:CGRectMake((self.view.bounds.size.width200)/2100200200)];

    boxView.layer.borderColor = [UIColor redColor].CGColor;

    boxView.layer.borderWidth = 0.5;

    [self.view addSubview:boxView];

    

    self.line = [[UIView alloc]initWithFrame:CGRectMake(002001)];

    self.line.backgroundColor = [UIColor redColor];

    [boxView addSubview:self.line];

    

    self.timer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(scanAnimation) userInfo:nil repeats:YES];

}

– (void)scanAnimation {

    if (self.goUp == NO) {

        self.num ++;

        self.line.frame = CGRectMake(0_num2001);

        if ((2*_num == 200 )) {

            self.goUp = YES;

        }

    else {

        self.num –;

        self.line.frame = CGRectMake(0200_num2001);

        if (self.num == 0) {

            self.goUp = NO;

        }

    }

}