Ezio's Blog

record


  • Home

  • Categories

  • Archives

  • Tags

  • About

读完《软技能》,妈妈再也不用担心35岁后的我被开除了

Posted on 2017-02-18   |  

工作几年的你是否时不时地经历过职业困惑?你有自己的职业目标么?这个目标意味着的生活方式是你想要的么?作为程序员,你的生活是不是注定就这样每天coding?日复一日的工作是否让你觉得枯燥么?经历过所谓的burn out么?

反正对于工作了好几年的我来说,这些疑问都或多或少,或长或短地在我心底闪现。作为号称“对程序员的全方位关怀”,这本《软技能》很好地回答了这些问题,并给出了一些可行的方法。

说的啥

“Few software developers actively manage their careers. But the most successful developers don’t arrive at success by chance. They have a goal in mind and they create a solid and well-thought-out plan to achieve that goal. If you really want to succeed in the competitive world of software development, you need to do more than just polish your resume and take whatever job you happen to get. You need to think things through and decide what actions you should take, when you should take them, and how you should go forward with them.”

整本书开头就把“干货”亮出来了,总结下来其实就是:要想变牛逼,这样做

  1. think through
  2. decide
  3. plan
  4. do it the right way

think through

《杀妻总动员》里有一句经典的台词:What’s your function in life?我一直印象很深刻。Vinnie Jones对没一个人都会问一个这样的问题,如果没有回答好,就直接被干掉。

电影是无厘头的,但这句话其实细想还是挺有意义的。

你在这个世界上的作用是什么?

虽然回答不出来也不至于一命呜呼,但总是让你反思你在这个世界的位置。

当然,我们不是哲学家,不用去想“我是谁?我从哪里来?我要到哪里去?”这类终极问题,但想清楚哪些是自己想做的和能做的,我们才能选择自己该做的。这样,当我们成功时我们才能更深刻地品尝成功的滋味。

decide

抉择。

就程序员来说,一般的出路有:

  • 上班族
  • 咨询
  • 自由工作
  • 创业

每条路都有利有弊,没有一个对任何人都是最好的选项。

作者鼓励我们在做选择时,首先想象你现在是一个铁匠,拥有铸造的技能,并思考以下问题的答案:
自己可以提供的服务/价值是什么?
如何提升这项服务的价值?
如何针对特定用户/领域提供更专业的服务?
专注在为特定用户/领域提供某方面的专业服务

思考这些问题能让我们反思自己的长处以及如何利用我们的长处创造价值,这间接地决定着我们的职业目标。

然后,想象你理想的生活方式 。铁匠心态代表的是你能做的,现在是想好你想做的。只有你真正想要的你才会真正地投入,才有机会有所收获。

弄清楚每个选项的得失,选择一个对你来说能接受的最好的选项,赶紧出发吧。

plan

结构化的规划 = 内容管理 + 时间管理 + 精力管理 + 自我催眠。

内容管理

做哪方面的规划?本书的副标题是:程序员的生活指南,因此不仅仅是技术层面,反而,我觉得整本书并没有特别针对程序员,任何一个普通人都能从中有一定收获。

作者的规划集中在这几个方面:

  • 打造个人影响力和品牌
  • 高效地学习新技能
  • 提升工作效率
  • 理财
  • 健身
  • 拥有积极心态和坚定信念

时间管理

关于时间管理,我同意作者的说法,其实的确是没有一个最好的方案。

和作者一样,我也尝试过几种主流的时间管理方案,番茄时钟、GTD等,都没有很好地坚持下来。经过作者的解释,我才明白我没坚持下来的原因。其实并不是方法本身不好,而是我们没有理解这套机制的原理和本质。

番茄时钟并不是用规定的25分钟强硬地划分你的专注力--你可以在到达25分钟后跳过休息只接进行下一个时钟--它的本意是用时钟数来度量你的注意力,通过这种正向反馈鼓励你并培养你延长注意力的能力。同时,也能消除你的一些无谓的罪恶感,让你在应该休息的时候可以安心地休息。

作者推荐kanban+番茄时钟的方法:https://kanbanflow.com

精力管理

健身,这个都不用多强调了,身边的同事、朋友都在健身,而我坚持跑步几个月下来,感觉无论是工作效率还是业余生活,都有足够的精力去完成想要做的事。同时:
减少心脏病概率
更自信,更好的人际关系
保持健康,延长寿命
心智更积极,更有创意
外形更有魅力

冥想,也是一种在短时间内快速恢复精力的好办法,和平时说的“深吸一口气”有异曲同工的效果,在家办公的时候倒是坚持了一个月,现在上班了就冥想地少了。

自我催眠

我们的思维方式、观念、信念影响着我们如何看待这个世界,从而影响我们如何与这个世界相处

自我催眠,其实就是主动保持一种心态信念。

领导者都很注重“企业使命”等“洗脑”工作,其实就是这个道理,要去做一件事,首先你得相信这事能成,有了这个积极的心态和必胜的信念,然后为之拼尽全力,这事才能成功。

Your beliefs become your thoughts,
Your thoughts become your words,
Your words become your actions,
Your actions become your habits,
Your habits become your values,
Your values become your destiny.
–Mahatma Gandhi

do it the right way

学习十步法

1.了解大概说的内容(简介和目录,从宏观上拆分新事物)
2.确定想要学习的内容范围(根据学习目的和可用时间来减小范围,专注于学习需要的内容)
3.定义学习成功的具体可衡量标准
4.收集高质量的学习资料和辅助工具:
书籍
练习环境:编码环境、乐器
博客
视频
专业人士
播客
源码和示例工程
文档
5.制定学习计划(参考收集的资料,选择学习优先级和顺序)
6.筛选学习资料
7.学到能实践就行
8.尝试实践,并收集问题
9.带着问题继续学习,专注于解决刚才收集的问题
10.整理学习成果并尝试用易懂的方式教会他人(聊天、博客、视频教程、分享、回答论坛问题)

不过,我觉得,是否使用10步学习法取决于书的类型,如果是学习某门编程语言,这种方法是不错;但如果是学习某种基本原理,很大程度上我们都只是需要了解大致情况,并不需要匆忙实践

养成良好的习惯

提升效率

保持动力

对合适的事情使用并发

争取应得的薪资

找到好的导师

投资首先考虑是否能为自己带来稳定的被动收入

正确的恋爱方法

阅读推荐的书籍

总结

某一技术领域的书籍会告诉你如何实现具体的功能,优秀的技术架构的书籍能引导你从宏观角度去设计一个产品,而这本书就是从宏观的角度去引导你设计自己的人生。

Core Foundation 与 Cocoa类型转换

Posted on 2017-02-11   |  

__bridge //不涉及引用计数,用于不赋值或者不作为返回值时

CFArrayGetcount((__bridge CFArrayRef) nsArray); 

__bridge_transfer //把 Core Foundation类型转换为 Cocoa 类型

//减少cfString的计数,把所有权交给ARC 
NSString *nsString = (__bridge_transfer id)cfString; 
或者
NSString *nsString = CFBridgingRelease(cfString);

__bridge_retained //把 Cocoa 类型转换为 Core Foundation类型

//增加nsString的计数,把所有权交给Core Foundation,PS:别忘了使用后CFRelease
CFStringRef cfString = (__bridge_retained CFTypeRef)nsString;  
或者
CFStringRef cfString = CFBridgingRetain(nsString); 

以上规则的前提是我们拥有这个对象的ownership,否则,我们最好别转移所有权。比如:

NSMutableDictionary *keyAnimationDict = (__bridge id)CFDictionaryGetValue(_dict, (__bridge void *)obj); 

LLDB命令及扩展

Posted on 2017-02-04   |  

br命令:设置各种类型断点

列出断点列表

br l

删除断点(2是断点id)

br delete 2

enable断点

br e 2

disable断点

br di 2

设置断点(30是行数)

b ViewController.m:30

设置symbolic断点

br set -n viewDidLoad

设置条件断点

br mod -c "totalValue > 3000" 2

删除条件断点

br mod -c "" 2

在某一个断点处执行多个命令

br com add 2
> bt
> continue
> DONE

继续执行

continue
c

单步执行

n

单步进入

s

退出当前函数

finish

expr命令:可以不用修改代码即可以在程序运行时修改程序数据和行为

expo self.view.hidden = YES
expr -L — 5+5
expr (void)NSLog(@“hello world")
expr -- (CGRect)[self.view frame]

expr int $debugVar = 5
expr NSString *$debugString = @"ezio cham"

expr NSData *$data = [$jsonString dataUsingEncoding: 4] //lldb不认识enum,需要传具体的值

backtrace命令

bt

bt all

thread命令:在排查多线程问题时会用到

thread backtrace

thread backtrace all

显示thread列表

thread list

选择id为1的thread

thread select 1

使用thread命令完成断点功能(100是行号)

thread until 100

修改方法返回值(在代码中的return语句所在行执行)

thread return @"new result"

example:

thread until 63(63行是当前方法的return语句所在行)
thread return YES

frame命令

查看当前frame的变量列表

frame variable

查看当前frame 名为varName的变量的值

frame variable varName

frame info

选择id为2的frame

frame select 2

选择当前frame的下一个frame

frame select -relative -1

watchpoint

查看当前watchpoint列表

watchpoint list


watchpoint delete 1


watchpoint set variable varName

可以watch expression(my_pointer为expression的返回值)

watchpoint set expression — my_pointer

设置watchpoint的条件

watchpoint modify -c “_x > 0” 1

删除条件

watchpoint modify -c “” 1

script命令

查看lldb使用的python版本

script print(sys.version)

进入lldb的python环境

script

使用python脚本

breakpoint command add -s python 1

使用python 函数my_script.breakpoint_func

breakpoint command add -F my_script.breakpoint_func 1

command命令

引入python脚本并指定新command命令:cmd_name

command script import “~/my_script.py"
command script add -f my_script.python_function cmd_name

引入python脚本并设置在断点中使用

command script import “~/my_script.py"
breakpoint command add -F my_script.breakpoint_func 1

引入其他lldb script

command script import “~/my_script.txt"

删除命令pf

command unalias pf

显示命令历史列表(report navigator中有更详细的内容)

command list

alias

获取当前所有alias

help -a 

获取和关键字相关的alias

apropos break 

设置positional alias

command alias sbr breakpoint set -l %1 

command alias pf expr (CGRect)[self.view frame] 

设置regular alias

command regex sbr ’s/(\[0-9\]+)/breakpoint set -l %1' 

command regex pf 
s/(.+)/expr (CGRect)[%1 frame]/ 
s/^$/expr (CGRect)[self.view frame]/ 

持久化alias
创建~/.lldbinit文件 ,添加以下内容:

command regex pf ‘s/(.+)/expr (CGRect)[%1 frame]/’ ‘s/^$/expr (CGRect)[self.view frame]/’ 

custom summary

type summary add CGRect -s "width = ${var.size.width}, height = ${var.size.height}" 

为SavingsAccount设置summary

command script import ~/account.py 
type summary add -F account.count_summary SavingsAccount 

删除

type summary delete CGRect 

过滤,只显示firstName属性

type filter add SavingsAccount —child _firstName 

改变显示格式

typedef int hex_month 
type format add —format hex hex_month 

quicklook

quicklook in lldb
https://github.com/ryanolsonk/LLDB-QuickLook

quicklook in xcode
http://nshipster.com/quick-look-debugging/

扩展LLDB命令

lldb的python接口文档
http://lldb.llvm.org/python_reference/index.html

chisel:Facebook的LLDB扩展

border self.view 
border --color green self.view 

让view透明

mask self.button 

让view从透明状态恢复

unmask self.button 

打印当前界面的layer tree

pca 

打印当前界面的view 层级

pviews 

打印view的responder chain

presponder self.view 

交互式查看view的层级树

vs self.view 

重绘当前界面

caflush 

快速闪烁view

flicker self.view 

显示view

show self.view 

隐藏view

hide self.view 

打印class的继承树

pclass self.property 

截屏预览

visualize self.view 

罗曼波兰斯基

Posted on 2017-01-28   |  

过年这几天看了一本波兰斯基的自传以及三部他的传记电影,加上之前看的一些他的电影,可以说对这个世界级导演有一个比较全面的了解,果然是个命运坎坷却又精彩纷呈的人物。

童年的悲惨经历

波兰斯基的童年正好在二战时纳粹对犹太人迫害最为严重的时候,随着德国对波兰的入侵,波兰斯基一家惨遭不幸:还怀有身孕的母亲以及姐姐被纳粹枪毙,父亲被关入集中营,自己孤身一人辗转于亲友之间。我觉得这段童年时的悲惨经历是他后续放荡不羁的生活态度的一个促成原因。

青年与电影

战后的波兰斯基痴迷于表演,迫于波兰当时的政治形势,在几度尝试考入表演系失败后,在朋友的推荐下成功考入了导演系,此后波兰斯基就开始了他的电影生涯。导演起初的发展并不怎么顺利,在《水中刀》被波兰电影界批评得体无完肤后,波兰斯基来到法国寻求发展。然而几年后莫名其妙地凭借《水中刀》突然获得好几个奖项,从此这位导演才进入到人们的视野中。

爱情与婚姻

波兰斯基的矮个子并不妨碍他获得女性的青睐。来到法国,事业起步后,波兰斯基凭借非凡的个人魅力以及艺术才能,身边的女人换了一波又一波,最终在拍摄《冷血惊魂》时成功“勾搭”上了莎伦.塔特,不久后两人就结婚。本是男才女貌(波兰斯基当时也挺帅气),应该幸福美满才对。然而,上天似乎还是不肯放过波兰斯基,怀有8个月身孕的莎伦惨死于一桩邪教谋杀案,这一打击让波兰斯基重回了童年的阴影了。不过,随着时间的流逝以及波兰斯基风流成性的生活习惯,最终在经历了娈童案之后,波兰斯基被迫逃往法国,并在那认识了艾纽曼儿.塞尼耶,这对有着30多年年龄差距的伴侣最终结婚生子,看来浪子波兰斯基最终也要回归家庭了。

欣赏的电影

波兰斯基的生活曲折惊奇,他的电影也丝毫不逊色。反映二战的《钢琴家》,表现心理恐惧的《罗斯玛丽的婴儿》和《怪房客》,以及反映腐败的《唐人街》,每一部都是经典中的经典。波兰斯基的电影普遍偏于沉重和黑暗,联系到他的童年经历和婚姻,这不难理解,似乎波兰斯基始终相信人性本恶。80多高龄的波兰斯基还在坚持拍电影,2016过去了,真心希望波兰斯基能多活几年,多拍几部好电影。

个人信息系统

Posted on 2017-01-21   |  

在互联网行业工作了几年后,慢慢就形成了自己的一套信息收集和整理流程,今天就介绍了我对这套流程的理解和运用。

什么是个人信息系统

现在企业都会有一个信息部门,通常这个部门会把整个公司的业务流程整理成一套IT自动化系统,提高公司整体的效率。我理解的个人信息系统也就是这么一套系统,能提高个人的生活、学习、工作效率。

为什么需要个人信息系统

我们现在处于知识爆炸的时代,这点在互联网行业工作的人体会更为深刻,然而不是所有的信息对你而言都是有效信息,有些反而是有害的,因此过滤出对你,特别是对某个特定阶段的你而言具有价值的信息,就变得非常重要。个人信息系统就可以作为你的渔网,以价值量作为网格,筛选出你想要的信息并允许你做二次编辑,从而丰富和完善你已有的知识体系。

怎么建立自己的信息系统

就像刘未鹏仔《暗时间》里说的,没有一套完美的时间管理系统能适用于所有人,个人信息系统也是。下面要说的就是我自己的一套信息收集和整理系统。

由提醒、来源、存储、笔记、总结组成。

主动的信息收集本身就是一个值得培养的习惯,台湾的文学大家李敖更是从小就有意识地收藏整理资料,而只要是习惯,就必须经历一段时间的培养,好的提醒工具能帮你更快地养成这个习惯。由于我一直用Fantastical 2作为日历工具,它的提醒功能足够用了。

信息来源渠道很多,渠道本身的筛选固然重要,然而,现在很多渠道上的内容重复度都很高,随便选几个不太冷门的APP,基本都能覆盖大部分信息。RSS工具作为信息聚合工具自然少不了,Mac平台上的Feedly、Reeder界面和体验还不错。
知乎的内容质量普遍来说高于普通的门户,同时以问题的方式组织更有针对性,同时我也挺喜欢即刻以主题订阅的方式推送你感兴趣的内容。豆瓣上一些猎奇的内容和旅行经历作为消遣也是不错的。高质量的微信公众号上的文章也不能落下,还有平时浏览网页时碰到好的文章。

以上这些信息来源基本都必须快速方便地存入一个地方,保证操作的低成本才更有利于习惯的养成。而Pocket作为老牌的“稍后阅读”APP,在各个信息渠道APP中都有集成,如果没有,也可以通过IFTTT等方式与Pocket关联起来,比如豆瓣(IFTTT关联豆瓣和Pocket教程)。

信息过滤到Pocket后,就可以抽时间阅读并作好笔记,我一般利用碎片化的时间阅读。我习惯把笔记放入Evernote。

Evernote只是一个笔记收集容器,它没有提供方便的工具来帮你把信息梳理组织成完整的层次化系统。MindNode作为思维导图能补充Evernote这方面的不足。把零散的笔记提炼总结形成系统的知识体系,这一步,是前面所有工作的最终目的和最有价值的部分。

总结

以上就是我的个人信息系统的简单介绍,在移动时代,这套系统基本只需要在手机上装几个APP以及利用碎片化时间就能建立起来,成本不高。在写这篇文章的同时找到知乎上的一篇不错的文章https://www.zhihu.com/question/23427617,对建立个人信息系统也有帮助。

iOS framework 发布流程总结

Posted on 2017-01-14   |  

之前总结了 iOS framework开发流程,当然,开发完了还需要发布和更新版本,以便开发者能快速方便地使用。

包管理工具

目前苹果生态下的包管理工具有:Cocoapods、Carthage、Swift Package Manager。Cocoapods是老牌的包管理工具,ruby写的,中心化包管理工具;Carthage是随着Swift的诞生出现的,swift写的,与Cocoapods不同,它是去中心化的;而Swift Package Manager,是苹果官方推出的Swift包管理工具,目前只支持OSX和macOS开发,包括Swift server开发的包管理。

因此,我们需要支持Cocoapods和Carthage。

Cocoapods

Cocoapods的framework发布流程有两种,一种是Cocoapods官方提供的 pod lib create命令,优点是会自动生成framework发布工程,包含demo工程、测试框架以及符号重命名,缺点是必须把源码文件添加进去以便打framework。当你不想发布源码时,就得使用第二种方式:自己建framework发布工程。
1.在github上创建git仓库,目录结构:

2.生成podspec:进入新建的git仓库,执行以下命令

pod spec create DTTracker

3.编辑新生成的podspec文件,添加必要的依赖和编译参数

Pod::Spec.new do |s|


  s.name         = "DTTracker"
  s.version      = "0.0.1"
  s.summary      = "DTTracker SDK"

  s.description  = "you can use DTTracker to track your user behavior in your app"

  s.homepage     = "https://www.dtstack.com/"


  s.license      = "MIT"


  s.author       = { "liuyunclouder" => "liuyunclouder@gmail.com" }


  s.platform     = :ios, "8.0"



  s.source       = { :git => "https://github.com/liuyunclouder/DTTracker.git", :tag => s.version }


  s.vendored_frameworks = "frameworks/cocoapods/DTTracker.framework"


  s.frameworks = "Foundation", "UIKit", "CoreTelephony"

  s.libraries = "sqlite3", "z"

  s.requires_arc = true

  s.pod_target_xcconfig = { "OTHER_LDFLAGS" => "-ObjC -all_load" }

end

4.提交修改,打上tag,再次带上tag提交(tag要和podspec里的version匹配)
5.本地校验podspec:

pod lib lint DTTracker.podspec —verbose

6.再次远程校验:

pod spec lint DTTracker.podspec —verbose

7.推送到Cocoapods:

pod trunk push DTTracker.podspec

8.验证是否推送成功:

rm ~/Library/Caches/CocoaPods/search_index.json
pod search DTTracker

Carthage

Carthage目前只支持动态库,而在iOS framework开发流程中,我们新建的framework是静态库,因此,我们需要新建一个framework工程:
1.创建Cocoa touch framework:DTTrackerForCarthage
2.添加valid architecture类型

3.添加compile source(.m文件)和header文件

4.添加link库

5.我们需要让生成的framework名称为DTTracker,而不是DTTrackerForCarthage,因此还需要修改framework名称

6.修改scheme为shared
7.生成framework:进入framework开发工程根目录,执行以下命令

carthage build --no-skip-current
carthage archive DTTracker

8.找到生成的DTTrack.framework.zip文件,放入最开始我们创建的framework发布工程,这时我们的目录结构是这样的

9.打tag,提交远程
10.创建 github release,提交DTTracker.framework.zip

当然,每次还要打开命令行去执行carthage命令,显然是浪费时间,为节省时间同时也方便其它同事打framework,我们可以再添加一个aggregate target:

set -e

carthage build --no-skip-current
carthage archive ${PROJECT_NAME}

mkdir -p "${PROJECT_DIR}/frameworks/carthage"

mv "${PROJECT_DIR}/${PROJECT_NAME}.framework.zip" "${PROJECT_DIR}/frameworks/carthage"

这样,每次我们只需要运行一下这个target对应的scheme就能生成我们需要的DTTracker.framework.zip文件

当然,目前的流程还可以再改进,我们可以再建一个target,修改framework开发工程的版本号后同时为Cocoapods和Carthage打包并copy到framework发布工程,然后修改podspec版本号并打好tag并提交。然而目前就我一个人开发,基本够用,有时间再弄。

参考:

https://guides.cocoapods.org/syntax/podspec.html

https://github.com/Carthage/Carthage#supporting-carthage-for-your-framework

《暗时间》阅读笔记

Posted on 2017-01-07   |  

高效记忆方法

你拥有的知识并不取决于你记得多少,而在于他们能否在恰当的时候被回忆起来,
而能否在恰当的时候回忆起某个知识,关键在于多创造记忆的线索:位置、声音、气味、场景等,相当于多制造索引

  1. 养成习惯,经常回顾一段时间内学习的内容
  2. 创造回忆的机会: 经常和别人讨论、整理笔记、书写体会
  3. 设身处地地“虚拟经历”别人经历过的事情
  4. 抽象和推广
  5. 联系和比较自身的经历

时间管理原则

  1. 思考问题时要问自己:问题的本质是什么?目前的进展怎么样?我该如何条理清晰地向别人说明这个问题?
  2. 注意知识的本质:抓住不变量
  3. 重视积累的力量,做好长时间的计划
  4. 时不时跳出细节,以宏观的角度看待自己目前的阶段,不要急着去处理细节,判断一件事是否值得去做有时比怎么做一件事更重要
  5. 充分利用暗时间:把问题放在大脑里长时间发酵,并保持专注
  6. 要事第一:优先处理重要但不紧迫的事

阅读学习方法

关键在于以下三点:

  1. 能够迅速进入专注状态
  2. 能够长期保持专注状态
  3. 能够具备超强的抗干扰能力

方法:

  1. 趁着对一件事情有热情的时候,一鼓作气把万事开头难的阶段熬过去
  2. 选择好资料
  3. 选择性阅读
  4. SQ3R方法(Survey、Question、Read、Recite、Review)

知识结构

专注于不变量,快速浏览易变量

2016总结

Posted on 2016-12-31   |  

越来越觉得每年过得越来越快了,要是不记录一下都不知道自己都做了什么。

这一年,找了份后端的工作,熟悉了后端开发,也顺带加强了下计算机底层和网络的基础。有人问为什么放着好好的iOS不做,偏去做一个新的岗位,具体原因有很多,最主要的还是希望自己能在互联网这个行业中走得更远更好,所以希望经受短暂的挫折,可以换来更长远的收获。

今年杭州的房价突然上涨,我也忍耐不住,跟着一起买了房。买房的事情比较折腾,但事情有个着落,心里也踏实。通过这次买房让我有了点小收获:眼光很重要,碰到问题要找数据并动脑去分析,而不是以固有的观念去看待。

去年做了个宝宝拍拍的iOS APP,今年手痒,业余时间写了个Mac APP:Arsos,从web前端、移动端,到后端,都是一人独立完成,算是在独立开发者的路上尝试了一小步。都说从0到1是最困难的,从1到100是简单的,希望明年能在产品设计上多思考一下,能解决用户的痛点。

因为公司需要,年底开始做一个数据采集的iOS SDK:DTTracker,幸好平时也持续关注着,老本行做起来还是驾轻就熟。

今年有朋友给我介绍单子,也有我给朋友介绍单子,还有朋友让我帮忙评估单子,人脉和信誉的确很重要。当然,能力才是最重要的。

今年还做了几个小插件,JSONizer、 Portkiller 、Arsos,虽然并没有带来收入,但还是很高兴。

另外一件比较高兴的事情就是考了个证:阿里云企业级互联网架构专业认证(ACP),从此就是有证程序员了。

但今年对我影响最大的就是看了一本书:《软技能》,国外的一位老司机级别的独立开发者写的,关于程序员的各方面的建议,也是因为这本书,让我下定决心在杭州买房。今年看的觉得不错的一本技术类的书就是《深入理解计算机系统》,这本书更多的专注在底层的细节,把《Linux/UNIX系统编程手册》中一些概念做了更详细的说明,另外一本不错的非技术书就是《人类简史》,虽然没有《文明之光》中涉猎的学科和范围那么广,但把从古至今人类社会发展的规律阐述得非常耐人寻味。

最后一件值得记录的事情就是坚持维护了这个博客和微信公众号AppLife,把每周的收获记录下来,和做Arsos以及那些插件一样,希望在能帮助他人的同时增加自己的影响力。

前面路还长,今年能做完这些,对自己还算满意。

请叫我架构师,谢谢

Posted on 2016-12-26   |  

是的,从今往后就可以持证上岗了。

阿里云企业级互联网架构专业认证(ACP):

下个月再去考个讲师,隐隐觉得这可以做一个副业…

C语言中的位操作

Posted on 2016-12-24   |  

记录下C语言中的一些位操作。

#define BIT_POSITION (1 << 3)    // 00001000

为flags设置一个bit:

flags |= BIT_POSITION; 

为flags清除一个bit:

flags &= ~BIT_POSITION;

查看flags是否有某个bit:

if (flags & BIT_POSITION) {     // do something }

查看flags是否设置了MULTI_BITS的所有bit:

if ((flags & MULTI_BITS) == MULTI_BITS) {     // do something }
123…5
Ezio

Ezio

44 posts
© 2017 Ezio
Powered by Hexo
Theme - NexT.Mist