Nitro's

Oct 25, 2016 - Comments - tech dev

Android Data Binding代码分析

Android团队推出Data Binding支持已经一年有余,但碍于项目已经在使用原始setXXX的方式,想要完全替换需要一定时间,一直没有进入todo list。最近在一个小demo中试验了一下。详细的开发示例不再赘述,可以参考Android Dev官网的代码示例,中文版可以参考简书的一篇比较新鲜的译文。 这里主要分析一下Data Binding的生成代码和binding过程分析,请确保Support Repository(39)、Support Library(23.2.1)、Gradle plugin(2.2.2)、Gradle(2.14.1)、Android Studio(2.2.2)更新到最新版本。 Data Binding的代码生成由Android Gradle插件根据Layout XML来生成。 示例XML activity_bind.xml <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.example.User"/> </data> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.lastName}"/> </LinearLayout> </layout> 对应生成代码结构 package:android.databinding DataBinderMapper.java //实现Layout的映射 InnerBrLookup—存储BR文件中成员变量名与索引的对应关系 convertBrIdToString()—根据BR文件成员变量索引转换出model成员变量名 getLayoutId()—根据Data binding的Layout tag转换Layout Resource ID getDataBinder()—执行bind并返回对应的binding对象 DataBindingComponent.java DynamicUtil.java //数值转换、版本相关特殊处理工具类 package:com.android.databinding.library.baseAdapters BR.java //类似于R文件,data层model类的int映射 package:apkPackageName.binding _ActivityBind_Binding.java //Data Bind的关键的关键,继承自ViewDataBinding,与XML文件名保持一致 bind()—activity对View的写入和获取,在验证XML后,最终通过_ActivityBind_Binding的构造方法获取到对应的绑定View。 inflate()—与bind()类似,通过LayoutInflater获取到View进行bind()。 executeBindings()—执行model层的数据写入,写入是通过一系列adpter根据android:xxx标签的实现方法一一对应写入,具体的adapter参见后续。 BR.java //类似于R文件,data层model类的int映射

Sep 25, 2016 - Comments - life

山后-零零

杨三儿开着那辆半新的拖拉机慢慢悠悠地从西边地头出来,嘴里叼着金喜烟卷,雾里雾气地倒也和柴油机的烟囱有几分相似。黑里黑黝的脸上写着岁月的沧桑,村里三十出头的男人在这个季节大部分都是外出打工,像杨三儿这样的悠哉悠哉在村里赚几个闲钱的爷们十个手指头数的过来。 “二豆子,你家那破地长满狗尾巴草了,再不割就可以打茅草盖房子了!” 杨三远远望着和他同一个生产队的刘全缩路边墙角里打着哈欠。 “扯你家犊子,老子地头长草管你毛事!”,刘全连一正眼都不看杨三。 虽说杨三靠着自己前几年买的二手拖拉机能挣几个闲钱,但相比家底厚实的刘全来说还是略有差距。刘全老爹也算是老党员老干部,在村里也是有头有脸的人,只是到了儿子这一辈几多荒废,刘全整日游手好闲,人到中年也没有谋到一媳妇,晌午过头,墙角一蹲就是一下午,晒着太阳,打着盹儿,或许这就是生活的美好,至于其它,只能算是午后阳光的一抹云彩。 人说光棍儿认光棍儿,婆娘嫌光棍儿。杨三儿和刘全这两个在第一生产队的光棍,也是不打不相识。早些年,媒婆是踏破了刘家大门,去给刘全找媳妇儿,要么刘全爹看不上人家,要么刘全老不正经,最后都没成。杨三儿正好相反,家里穷,媒人想请都找不到,但杨三娘聪明,前脚到刘全家的媒人刚走,他娘后脚就提着篮子鸡蛋就到媒人家去了。媒人看看他家光景也是只摇头,话说无功不受禄,媳妇总得走一趟,结果也便是无疾而终。渐渐的村里人也都看惯他们两家的前脚后脚相亲,也就见怪不怪了。再苦也不能苦了孩子,在杨三儿娘看来,砸锅卖铁也要给孩子娶上媳妇,但事事并不如愿,就连他自己也渐渐地习惯了这光棍的日子。平日里除了庄稼地里有人要找他拖拉机做活儿其它也不见几个人能登门喝茶吹牛。

Jul 10, 2016 - Comments - tech dev

Android 6.0 运行时权限实践要点

Android在6.0之后添加了新的权限管理模型,每个应用必须在原油的Manifest.xml声明的基础上增加运行时的权限申请才能进行相关API的调用,这对终端用户的隐私保护是一大利好,浏览一下国内的很多应用,一个很简单的APP也会申请Contact、Location、ID、SMS、 *History等权限。自从6.0之后App安装完成未启动前你就可以去应用设置中关闭没必要的权限。当然国内的很多定制ROM比如MIUI、EMUI等在之前android版本中已经定制了相关模型,但这一次是从API级别上标准化了这一设置,所有支持后续版本的APP都必须实现这一原则。 相关运行时权限申请开发过程,可通过Android官方网站浏览。更多Android权限相关。 这里只说明了几个开发要点: 当前流行的运行时权限申请流程有两种: 在App启动时强制检测所有预申请权限,有一项必须权限用户没有授权则弹出对话框提示到应用设置页面进行授权打开。 在App运行时需要某一项或者多项权限时临时授权,然后继续下一项操作 当前国内应用大多采用a)方法,微信、支付宝采用此方法,可能导致后面一票儿的App采用这种方式,而且有些非必要权限一旦拒绝授权,应用立刻退出,体验相当暴力。Google系、国外其他App大多采用b)方法,非必要情况下不会预先申请授权。 采用a)简单直接但是用户体验相当冲突,尤其是用户拒绝申请授权时,所以建议使用方法b)。 多必要权限的同时申请 由于调用_ContextCompat.checkSelfPermission()_时只能进行一项权限检查导致后续的_requestPermissions()_虽然方法支持多项权限的申请,但在此情况下只能进行一项权限授权申请,进而导致后续只能在_onRequestPermissionsResult()_检查第一项权限授权是否通过后再进行下一项授权申请。这其间_onResume()_调用还需要记录每一项权限的授权结果。 方法:构建一个权限数组,_onStart()_时每次循环遍历所有预申请权限,如果所有权限均授权通过,则进行下一步操作,如果是未授权,则调用_requestPermissions()_,如果是拒绝,则提示用户跳转APP设置界面进行授权。在_onRequestPermissionsResult()_方法中不检查权限的授权结果而是继续调用循环遍历来检查权限授权结果。这里需要注意一个无限循环的问题,如下。 权限授权过程无限循环 _requestPermissions()_调用后弹出的是由PackageManager管理的Dialog主题的Activity(B),如果此时用户屏幕锁屏,B调用_onStop()_,授权申请Activity(A)调用_onStop()_,开屏后A将触发_onStart()_再次调用requestPermissions(),此时B还在前台,再创建B‘实例导致B回调_onRequestPermissionsResult()_继续重复要点2的逻辑,导致进入无限循环,在API>23后会有多次请求权限授权的日志输出,可以注意观察。为了避免上述情况发生,可以在授权申请Activity(A)添加标记位避免开锁屏时的重复调用或者锁屏后的_onStop()_中发起取消申请授权,然后在_onRequestPermissionsResult()_中判断是否要继续调用。 取消授权申请 在公开的API中并没有在申请授权过程中的取消操作,因为运行时授权申请本身并不允许并行执行,所以当前状态下只有三种可能性:不再提醒、允许、拒绝。但当出现上述3逻辑时就需要有可以取消的流程。在Activity.java的源码中提供了一种方式: // Dispatch the callback with empty arrays which means a cancellation. onRequestPermissionsResult(requestCode, new String[0], new int[0]); 通过主动调用授权结果返回,然后根据后面两个参数来结束授权流程。 Fragment、Activity中的使用 Fragment中直接使用父类的requestPermissions() Activity兼容模式下调用_ActivityCompat.requestPermissions()_。 友好性的授权拒绝提示 微信、支付宝都是采用对话框的方式,但在用户体验上很冲突,推荐采用SnackBar。

Jun 25, 2016 - Comments - life

"怀疑"死亡

个头不高,脸上一层层的皱纹写满岁月的痕迹,穿着一件深蓝色花格子的长袖衣服,下身藏青色裤子,轻微束脚成尖的脚上穿着一双黑色略新的布鞋,上身后躺在床头板儿上,双腿撑起成拱形,双手放在膝盖上,脸上一副安详的表情,没有任何痛苦与挣扎,是的,她就这样走了,当听到阵阵的哭声时,我们周边才意识到这位老奶奶的离去。赶忙跑过去时,村里医生正在验证是否还有生命迹象,把脉,验证呼吸,看眼睛瞳孔,最后告诉旁边已经哭的不成样子的儿子:“三儿,你妈走了,很幸福的走了,别把眼泪滴到你妈身上,别哭了,你妈没病没灾地走的很安心”。一个生命就此宣告-死亡。 死亡,在宗教里意味着升天、皈依,在自然界里意味着回归尘土,这就是那句“生不带来死不带去”的起点,在精神境界里,死亡意味着什么?你是否惧怕死亡?我们需要永生吗? 一个人骑着自行车从农田的十字路口经过,但是庄稼略微挡住了视线,当他骑到十字路口的边缘时,侧方向来车已经无法急刹车,瞬间人被撞飞,血肉模糊,从一个意识清醒的人到瞬间的巨大伤痛,再到脏器受损,最终生命体征消失,这或许只需要几分钟。他在之前的几分钟或许还在思考怎么回家给儿子做一顿可口的饭菜,或许还在想庄稼是不是应该浇灌了,但此刻这一切都不重要了,因为他的意识已经停止了,他在这个自然界唯一可被尊重的东西消失了。从一个社会人走向一个非组织非高级的自然重组过程,他独一无二的意识就此终止于此,如果我们相信记忆可以被存储在上帝那里做一个备份的话,这是一份珍重,一份独一无二的礼物,于他的家人,于与他打过交道的任何一个生命… 当我们不小心患上咳嗽感冒时,或许你没意识到这样的小病还会威胁到心脏,在很多人眼中去医院总不算是一件好事,在医疗发展到今天,在医院治疗后不幸离世的人与在家自然死亡的比率只会越来越高,当然疾病于此也在升级。当踏入医院大楼门诊时,才发现我们的生命在与疾病斗争的过程中所付出的艰辛。人满为患的挂号队伍,住院部里步履蹒跚的病号,周围三五成群的家属,我们为了维持和挽救一个生命所要付出的代价-金钱、精力。 最近某个论坛上特别火的一个讨论:一个小康的家庭,父亲身患癌症晚期,医生提醒他们如果继续进行放疗化疗能够支撑半年或一年但要花费100多万,如果不治疗现在就拔管可能几个月就要准备后事了,因为癌症细胞还在继续扩散。最后妻子决定放弃丈夫治疗,家底虽还算殷实,但想想还没结婚的儿子这是一场徒劳。儿子却坚持继续给父亲治疗。最后这位父亲又坚持治疗了几个月后离世。大家在众说评论中,有人顶儿子尽到了做儿子的孝道,有人也顶妻子面对现实的决绝。目前国内的很多家庭如果家里某个人患上一场大病,基本会导致一夜返贫。在家庭收支的现状下,我们是选择给亲人一个现实的死亡,还是给亲人一个延长生命的机会。作为一个医生,或许早已对此不再颤抖与怀疑,每天面对不同生命的死亡,他们尽力了,身为医者,他们也想让世间多一份不同的欢笑,但自然却不允许。 有一天去医院碰到一位东北来的阿姨,叫号进去之后没多久就被医生说了几句给请出来了,我还在怀疑到底怎么了。原来是这位阿姨的病已经相当严重,她不识字也看不懂化验单,只能挨个来检查,带着之前的一堆单子,医生看了几个单子后没有直接和她明说,只是告诉她去另外一个科室去检查一下,他的这个门诊不看这个病,这个阿姨脸上直接茫然了,在记下了一个电话号码后走了出去。后来医生才私下和我说,那个阿姨基本无药可治了,不止是胸肺有问题,心脏也有严重问题,这样的患者如果收治,基本是无望,尤其是外地的患者情况更加复杂。随后我俩竟也不约而同地叹息了一声。或许这也是医生的一种无奈吧。如我乃是神,我赦无人之死,这或许只是神话。 在医院医生虽手握病人之生命,但谁人也不敢保证你在我的治疗下能够完全康复。无论是医学还是工程学,人类都在试图改造自然,但“人定胜天”的愚蠢在一直警示着我们,尊重远比强权更加重要。在每次手术时,医生都会再三强调手术的风险性,家属也需要签字确认。这是生命的嘱托,也是对生的期待。谈及最近各种纷繁复杂的医患关系,这其中有一环就是对待死亡的双方。医生是否尽到了拯救患者于死亡之外,家属是否认识到疾病的危害性和手术的风险性及死亡的可能性。最近的看到的几起手术死亡医患矛盾的案例,后续的进展大多不了了之,至于医生是否存在手术失误或者不当作为非专业人不可罔顾发言,但作为家属的一方对待死亡的态度是否有足够的心理准备?更有甚者叫嚣以命偿命的可笑之谈,在医生尽专业之力挽救一个生命时的努力患者何时去体会? 生命从降生到死亡,一个更替,一个更迭。 一个生命降临时我们开怀大笑,尽心尽力,奔走相贺,世界为我而生。这是一份独一无二。 一个生命死亡时我们缅怀过去,面对现实,尊重自然,尽力而为,为这一次的落幕争取一份勇气。

Apr 5, 2016 - Comments - hot

健身派 大陆用户使用Google Fit (非root)

Google Location History在国内目前处于非可用状态,可能是由于地图拍照之类的问题,所以基于地理位置实时跟踪的Google Fit也就悲剧了。 网上修复或者绕过的各种路数是手机rooted,然后更改google play注册地欺骗Google通过,还有其他的比如SIM卡贴欺骗,总之的意思就是让Google以为你在国外开放Location History的地方。 手机如果被rooted使用的风险性会大大增加,不建议使用。除了通过Location History来记录健身,还可以通过Google Fit API来正常使用Google Fit。 Google Fit API内建了各种数据模型,比如步数统计、骑自行车、业余训练等等。 相关API详情参考。 这里我也写了一个App,可以提供这些功能,欢迎下载使用。 当然如上这些还是需要某项技能才能同步。

Mar 9, 2016 - Comments - hot

Mac OS X 10.11源码安装GCC 5.1.0

1、环境 宿主:Mac OS X 10.11 安装目标:GCC 5.1.0,手册、下载 第三方依赖库: gmp 6.1.0、mpfr 3.1.4、mpc 1.0.3 2、前提 执行 xcode-select --install 下载Mac OS X Command Line Tools,安装完毕后/usr/include会有下载好的头文件,不执行此步骤会在后续的gcc编译过程中找不到在/usr/include下的系统头文件。 3、第三方依赖库安装 顺序:gmp->mpfr->mpc 过程:./configure->make->make check->sudo make install 编译安装完后,库文件放置在/usr/local/lib,头文件放置在/usr/local/include 4、编译安装GCC ./configure 确保上述步骤执行没用问题 make 这个过程耗时一个小时,结果最后还是出错了,错误如下 -fgnu-runtime -fno-common -DPIC -o .libs/NXConstStr.o /var/tmp//ccc9efWx.s:98:17: error: non-local symbol required in directive .no_dead_strip L_OBJC_Module ^ make: *** [NXConstStr.lo] Error 1 搜索发现这是一个bug,新版本的苦又来了,幸好官方已经给了解决方案。 bug list patch 修改gcc-5.1.0/gcc/config/darwin.c文件中的darwin_mark_decl_preserved方法。 make clean 重新编译。 结果又踩雷一次,编译到与Java运行时库链编时报错 natArray.s:2047:2: error: ambiguous instructions require an explicit suffix (could be 'filds', or 'fildl') fild 14(%esp) ^ This issue can be reproduced with the attached natArray.

Feb 22, 2016 - Comments - tech dev

OAuth2协议和Spring Security OAuth2实现

OAuth2协议在API访问授权中广为使用,Google、Facebook、微博、腾讯的公开API也都使用它。虽然在使用上有些复杂,尤其是服务器端的使用更为繁琐,但它在权限授予、资源访问限制上的优势让其使用广泛。 OAuth2的协议流程如下: 以国内的微博为例, Resource Owner=微博用户; Client=第三方应用,如Fuubo、Weico; Authorization Server=微博平台授权服务器; Resource Server=访问微博、用户信息等资源的服务器 当开发者决定要开发一款基于微博的应用时,需要到 http://open.weibo.com 去填写一些资料,比如应用名称、类型、访问哪些资源,提交相关信息之后,微博后台会创建应用,分配一个client_id和client_secret,这两个字段对你的应用至关重要,以后会派上用场。 下面就开始正式的OAuth2协议流程: A、开发者构造Authorization Request(请求微博用户授权),如果此时微博用户A没有登录会直接跳转到微博登录页面,如果已经登录会跳转到授权页面,如图所示。 此时会列出开发者在申请应用时选择要访问的权限,除了必须的权限以外微博用户A可以不勾选部分权限,这样开发者就无法读取相对应的资源。 B、 Authorization Grant(微博用户授予访问权限),如果微博用户A点击“授权”,开发者将获得这个微博用户A的微博、用户信息等资源的访问,开发者将获取到一枚临时code。点击“取消”将拒绝资源的访问。 C、Authorization Grant(请求微博平台授权)开发者拿着微博用户A授权之后获取的临时code,访问微博平台授权服务器,获取“永久”(也有时间限制)访问微博用户A的授权。 D、Get Access Token(微博平台授予微博用户A的访问)微博平台授权服务器检查微博用户A的临时code,检查通过后给开发者返回一个“永久”的Token。 E、Take in Access Token(发起携带Token的请求),开发者在访问资源的请求中带上Token。 F、Protected Resource(返回微博用户A的微博、用户信息等资源)资源服务器检查Token,根据请求URL的不同返回微博用户A的相应资源信息。 通过这几步就实现了微博用户、微博平台、第三方开发者之间的访问授权,当然如果是用户B使用开发者开发的这款应用还需要进行如上所述的步骤。 以上简单介绍了OAuth协议中最复杂的一种授权访问方式(Authorization Code Grant),也是第三方应用用的最多的一种,其他三种对于特定环境下建议使用,比如: Implicit Grant-多用于浏览器内的应用,可直接回调获取到Token,简单方便。 Resource Owner Password Credentials Grant-用于第三方应用处于可控的风险之下,多用于内部系统的互访问。 Client Credentials Grant-顾名思义,多用于客户端的授权访问,客户端必须保证在开发者手中。 OAuth2协议的可以访问地址查看。 ========================================================================= Spring在security project的基础上实现了OAuth2 的Server端,同时支持四种授权方式,参考了网上的不同示例但都没有完美支持所有方式,阅读官方文档参考源码后完整构建了OAuth2的Server端。 1、代码示例基于 spring-core v4.2.3 spring-security v3.2.x spring-security-oauth v2.0.8 2、自定义Endpoint用于回调、跳转、登录等功能: /login-用户form登录action[POST] /msg/code-授权回调页 /msg/error-授权访问错误页 /msg/login_success-用户form登录成功回调页 /msg/login_error-用户form登录失败回调页 3、OAuth ClientDetail、Token数据库表脚本 访问地址下载。 4、web.xml中除了Spring基础配置还需要添加Spring Security相关配置

Feb 16, 2016 - Comments - life hot

两个回不去的年

2016 农历新年已经落下大幕,但萦绕在大家耳边的还是“家” “过年”这几个词,从上海女孩去江西男友家的失望到农村人口结构的空心化,从拆迁到搬迁,从逼婚到抱孙子。生活在一个不能思考的娱乐世界里,大家也习惯了这些热点的娱乐化、戏剧化。 一九二九不出手,三九四九凌上走,五九六九沿河看柳,…. 冬日里小时候经常唱的九九歌,现在的城市或许早已无法寻觅这样的天气变化,偶尔的寒风吹到眼角让人心里都要抖一下,城市的供暖让人们不再需要穿上厚重的棉衣来抵御寒冷,从办公区出来走进地铁,从地铁坐上公交,到家依然有热乎乎的暖气,寒冷变成了那霎时的走动,变成一种凝重的风景。今年的北京冷的特别短但又出奇的冷,当大家都在讨论温室效应下的暖冬与雾霾时,雪花却又漫天飘舞,写字楼的人们纷纷掏出手机咔嚓咔嚓,生怕这弥足珍贵的雪花忽然消失在记忆里,对于北方人来说,下一场雪,见怪不怪,长江以北尤其是两广云桂地区见到雪花时他们的兴奋绝对能够抵得上一位珍稀物种造访此地,南方的雪相比北京要小很多,新鲜感与即视感混杂着好奇心刷遍了整个朋友圈与微博。如果只是下雪,冷几日也便会逐渐回归平常温度,冷风却不会答应如此安静的夜晚,伴随而来的几日寒风刷出了即时的存在感,走在大街上风吹的劲头像要把人带到南方去体验温暖,接近零下20度的温度却实实在在的体会到你只是一支在北方的冰棍儿。 进入腊月二十,街上的车渐渐少了许多,商店超市玲琅满目的大优惠大促销高喊着:买XXX就是买孝心,把XXX带回家,幸福过大年。逛来逛去的人们大包小包的挑选着满意的年货,上点档次的就买几瓶葡萄酒,送礼就瞄着茅台五粮液,自己在家喝两盅的二锅头也算是首选,酒对于过年的饭桌之于年终奖,有大家皆大欢喜一起来年努力,没有则总觉缺点什么还又心里说不上来,喝得高兴胡吹一把,喝得痛快撒撒酒疯弄点过年的笑话和意外。年底的最后几天上班族或许是最坐不住的,项目快要收工的抓紧结束,项目开始的等待来年开工,当然最辛苦的算是过年值班的人,虽然三倍工资到手,但不能相聚的那份心意还是略有感伤。 腊月二十七,告别一年朝夕相处的同事,送上提前的祝福,上班族们各回各家,等待除夕夜的到来。伴随着鞭炮礼花的响起,年夜饭就此开启,一年的总结,一年的展望,在声声的祝福中悄然而过。当12点的钟声响起,鞭炮礼花声更加的急促与杂乱,恰似没有节奏的音符跳跃出新的一年。相比乡村邻里,城市的初一略显安静,能够欢乐玩耍的或许就是庙会,被支离分散的朋友要么在老家,要么就是太远不会再相互拜年。这就像长辈所说,过年其实就是小孩子凑个热闹。在庙会走一遭也许印证了这句话,从摇奖玩球到各种小吃,孩子的天下。相比各大旅游景点,外出旅游过年的人是越来越多,初二上午不开门故宫眼睛排开了长长的队伍等待买票,相比回老家过年的人,他们心里也多了一份自在与畅然。 前几年还在济南工作时回家基本上不需要坐火车,也就不需要抢火车票这件烦心事,相比这两年不回家过年,每到年底看到公司里拼命刷票的小伙伴们,多少还是有些烦心,为了一张回家的火车票,需要多少次的点击,浪费多少时间,或许这永远都不会有人统计。虽然在济南过年回家不需要坐火车,但长途汽车依然也是爆满,每每大的节日回家都必须在汽车站排长长的队伍依次等待回程的车送走这满满的归心人,虽然你上了目的地的车但你依然会碰到把你放在县城再把你转送给黑车的可能,那么这一趟归程可能就会从早上9点到下午4点,此时如果家里有三轮车或者汽车还好说,否则你需要再到镇上租一辆三轮车回家,一天的行程就这样耗尽了。到家就是好的,家里或许早已经准备好了饭菜,等待你的归来。 如果公司腊月二十八放假,吃过回家的第一顿饭,除夕夜也就即将到来,时间虽然略显急促,但在家的日子总是温暖的。相比城市的暖气,村里安装暖气还不算普遍,倘若安装上了但农家人节省的习惯也会只在晚上或者过年这几天才会烧起来,家庭条件不太好的则继续烧传统的煤炉,一家人围着煤炉包饺子、炒菜、做饭,偶尔脚凉了,蹭过去,一会儿就会暖和起来,晚饭过后一家人围炉而坐,商量着今年的收入、庄稼粮食、亲戚邻里各种琐事。 除夕夜,家族门户大的人家大家会聚在一起吃饭,小孩子一拨人在外面玩耍鞭炮,长辈们都在忙碌着年夜饭、祭祖准备,时辰一到祭祖磕头烧香跪安,祈求先人祝福,放鞭炮,吃水饺,欢乐声与鞭炮声齐名共舞。虽然经历一夜的忙碌但初一还要继续,准备好糖果瓜子,等待乡村邻里的串门送祝福,一个家族一拨人,齐刷刷走进家门的阵势犹如过年赶大集,问候一下长辈祝福一下小辈,大家相互见个面送上祝福,关系亲密的多聊几句,关心一下彼此的近况。近几年随着年轻一代慢慢向城镇靠拢,在家的过年的人也越来越少,拜年的人也越来越少,能够去逛的地方也越来越少,或许关系也在慢慢的消散。很多从打工的地方回到老家的人虽然人在老家,但现实的冲撞与矛盾也渐渐突出,曾经熟悉的面孔却面面相觑,无言以对,彼此生活的差距与隔阂也造就了语言与生活的隔离,这种纠葛存在于老同学朋友之间,也存在于家庭内部之间。 一个短暂而重要的假期,伴随着冲突与欣喜慢慢结束,在外打工的人也要重回那个熟悉而又陌生的“家”,留守在原地的人也要坚守这份断念而又现实的“家”。 两个家,两个年…… 图:景山公园落日余晖 摄于2014年03月

Feb 8, 2016 - Comments - life book

平凡的世界

去年春节老爸把《老农民》《温州一家人》两部电视剧看完了,今年来到北京本来是想让他看部都市剧《我的老婆大人是80后》,结果老爸还不感兴趣强烈要求换一个。想来想去就想到了根据路遥小说改编的《平凡的世界》,贴近农村生活的味道,果然老爸爱看。 一本小说被搬到荧屏也就是业内人士俗称的IP模式,最近比较火的《寻龙决》(改编自《鬼吹灯》)《九层妖塔》(改编自《鬼吹灯》)《琅琊榜》《花千骨》,当然还有这一部《平凡的世界》。相比朝代历史、玄幻虚构小说,平凡的世界贴切的反映了上世纪60~80年代的陕北农村生活的一幅幅画面。如果你先读了一本小说,然后再去看电影或者电视剧,骂娘的概率应该在六成以上,相反如果你一张白纸的去看电影,好评率可能要高很多,这就是印证了那句话-看小说,那是属于你自己的一部电影。 相比大家都能评头论足的四大名著,我仅仅是读了《红楼梦》,关键是还没有看完,也仅仅是断于前60回,结果还被家里伯伯说小孩子不应该读这种书,哈哈。后来随着四大名著都被拍成电视剧、学业逐渐加重,也便再也没有去仔细看剩下的三部。后来央视的百家讲坛借着这几部名著还成功造就了几位大家,至于解读是不是合情合理,大家见仁见智吧,没有看过。高中的三年大家为了高考时60分的作文引经据典又开始了一波小说阅读高潮,各大文豪、各国名著,只要是语文复习材料上推荐的,大家你一本我一本,分开买,相互借阅着看,当然各类武侠玄幻小说也夹杂着进入了校园视野,以至于到了高三大复习的时候班上一些同学还在与班主任打游击偷偷看玄幻小说。其实那时读的小说也是寥寥,多半的是看了前半段,然后就没有然后了。又拾起读小说这事是从毕业后在豆瓣上参加的读书活动,相比当下流行的韩寒、郭敬明、安妮宝贝真的不怎么感冒,找来找去发现了路遥的《平凡的世界》,四十多岁英年早逝,长篇小说的绝唱之作又平添了几分对此的吸引力。 作为一个农村长大的娃读这部小说,其实也是在读平行世界里的另外一个自己,多的只是时空的转移,如果能从历史课本中寻找到那几分痕迹,那么剩下的部分则由父辈和奶奶来补充。“大跃进”运动、农村学大寨、人民公社、农村责任制、改革开放,这个国家的一系列符号在这个家庭中穿插行进,走过几十年的光景。父辈的身影、独户人家、砖窑、生产队队长…一切就像你从这部小说走一遭,冷暖激荡或许也就自己明白了。看完之后在读书会上自己去分享之后却又说不出是什么感觉,或许这就是只可意会不可言谈。一面是口述的历史,一面是手写的小说,两者重叠出的是三代人的苦言笑痛。对于我,那是部黑白的历史~ 少安、少平,名字里透着孙家对娃娃的祈福,但两人的生活却又充满着坎坷与无奈,在爱情婚姻这条路上更像是跌倒在泥土地里的谷子苗-渴望与希冀破土而出的耀眼,终归还是要回归了谷物仓廪之间的朴实。与其说是这两兄弟的爱情故事倒不如说那一代人的爱情故事。少安与润叶青梅竹马的爱情、未了的婚姻,仕途、家庭、爱情糅合在这个婚姻纠葛中少安最终选择了秀莲,润叶无奈选择向前,明明可以床前凝视对望的两个人变成遥遥的相望,放开脑洞的想象,假如润叶嫁给了少安,以后的日子会幸福吗,或许会…… 少平与晓霞,虽然没有了少安与润叶这一对的苦楚与痛苦,但他俩的家庭、教养、知识才华都在他俩之间产生排斥,虽有偶尔摩擦,但依然磨灭不了青春爱情的渴望与希冀。少平的自卑在晓霞的鼓励声中慢慢褪去,工人成分的转变让政治正确践行渐近,两块烧热的煤在青春中尽情燃烧,但一场洪水带走了晓霞的清纯可爱,一份爱,一份婚姻,嘎然而止…如果说爱情婚姻之于少安是现实的无奈选择,对于少平只有老天的不公与遗憾。回头看两兄弟的婚姻主线,二爸、润生、郝红梅、杜丽丽的爱情婚姻都只能算是他俩点滴的注脚、引子。 这就像今天看的那条新闻一样[女孩跟男友回农村过年 见第一顿饭后想分手],如果你说到底谁有错,其实谁都没有错,错在两个人不应该认识。 56集电视剧,老爸看到了46集,看到兴奋时,和我聊聊那个年代的砖窑、那个年代的小城故事,还有那个年代的人…… 平凡的世界里,都是见证者。

Jan 30, 2016 - Comments - life

元気-致2015

在电脑上看《绝命海拔》,川藏的每一个画面却不断浮现,不是3D,但能够想象的是冰雪与寒冷。如果现在给我一个胆量,珠穆朗玛峰可能是我不可逾越的顶峰。 今年北京的冬天异常的冷,当大家在晒PM2.5时候估计也没想到能把PM2.5冻在这里,零下十几度的冰冻,着实让我这个北方人也吓了一跳。走在大街上,谁都不想多说一句话,快步走着,走慢了寒冷可能已经把身后的气流漩涡凝固了。偶尔有人忍不住的咳嗽几声,也只能证明他的病情在加重。难得在入冬的时候感冒了一次,按照往常的规律,此冬再感冒的机率应该不大,但今年的老爸却不胜冬天的寒冷,在迎接除夕夜的这几天感冒了。 身为一枚互联网的Coder,不仅仅领略了此冬的寒冷,同样也感受到了资本与产业的寒风。如果说一家公司的倒闭意味着竞争对手的狂欢,那么一堆公司的倒闭和大裁员意味产业的迭代与穷途困境。虽然每天的发布会依然继续,但是另一面的裁员减薪潮也在暗中涌动。大家都在讨论着融资、独角兽、Idea,好似大家的创业都能够发一笔横财,立刻身价百亿,但当要成立公司,下手一搏时,却又畏手畏脚,此所谓当下众多蠢蠢欲动的少年之心。有时大家都会把一个人的不良“嗜好”归结为星座问题,好似当下的代际隔离一样,如果我要个性,那么你就是90后;如果你吹毛求疵,那么你就是处女座。作为一个80的尾巴而且还是处女座,难免让人无可奈何。8月份的离职,不能说带着遗憾,也不能说带着希望,只是平静的离开,正如领导所说各自做好本职工作就好,OK,我做好了就OK,但我有权利去告诉这个世界可以变得更好,我会妥协,但我内心不会妥协,我不要求,但我渴求,That’s all。在经历了搬家、甲醛、工作开展不顺的情况,最终选择了离开。此时我依然祝福W公司变得越来越好,尤其是技术领域,与母公司的电商平台差距越来越小,祝福~也祝福母公司的发布会办的越来越好,早日实现全员持股的目标~这次的离职,自己也开始思考职业规划,技术这条路到底应该怎么走,未来3年、5年自己的工作目标是什么?当你每天的朝九晚五时就像上了发条一样工作,虽然不至于乏味,但可能思考这个问题的角度却总不在那条线上,只有失去此时的工作,空余下来才真正去思考这些。从济南到北京,从Java到Android,各种各种,眼前的诱惑多但哪一样最适合你,最值得此刻去做? 从W公司离职以后本来打算休整一下,但前期休假基本用完,所以工作定下来以后也没有太多时间就奔赴新公司,开启了新的征程-B公司。之前面试了几家公司,也算学习了一下,了解一下各种公司的技术开发、风格,从自身的职业发展考虑最终选择了B公司。此刻再谈起做的那个项目,或许只能笑笑而已,因为项目已经全盘交给另外一个团队,对自己来说,失望与失落或许是心里的直观感受。然并卵。。。 如果一个项目能够做成了,比如小米,先要庆幸的是,不管骂娘还是骂爹,人家产品出来了,put到市场了,然而我们连娘家都还没有登门,项目就黄了,着实有点可笑。一切都没了,就像股市里面的钱一样,瞬间蒸发。今年的股市有人笑死,有人哭死,过山车似的曲线,玩倒了很多人,包括我在内。虽一心没想赚大钱,但多少凑个盒饭钱,没成想盒饭没了,就连做饭的锅灶差点也没了。有时你看钱如粪土,有时你却看钱如骷髅,但它就在那里。虽然工资略有涨幅,房东的大妈还要惦记你的工资,时不时的提醒你该涨点房租了,北京的公交系统提醒你以后3元起价了,2015年的房子没了,2016年的房子还在建设。。。 当祖辈的人都离开了,父辈的人也在慢慢变老,大家都在说得到什么都行,别得到病,但当老人都变老时,病虫总是那么的不期而遇,你赶不走,面对它,打倒它,才能让你变得更强大。 谢谢一切的偶遇,谢谢你,才华这个玩意其实真的挺重要~说好的,越过江河湖海,迈过山峦叠嶂,唯爱永存。 看着自己的本命年一溜烟没了,结果25、26岁也没了,还没反应过来,青春也要说再见了。不是自己没长大,而是时间老人把你催熟了。它不需要雄性激素,只需要你花点时间,花点时间….. 2016,猴子君,我来了~