【编者有话】
第五期的《挨踢人物传》在阳春之际与大家如约而至。本期的嘉宾是博客的风云人物,15年的挨踢生涯让他对职场有了深刻的感悟——
他说过:不论身处多么困难的环境,即使觉得前途渺茫,也不要放弃学习,否则就是“自断筋脉”;
他还说过:职场首先比拼的不是智商,而是坚持与好习惯!
他经历过很多不同的岗位,通过这些岗位完成了自己能力与知识的积累,成功的打造了属于自己的“品牌”!快来看看TA是谁——
【本期人物档案】
个人信息:
51CTO账号:李云
姓名:李云
性别:男
生日:1975年11月
所在地:杭州
教育信息:大学
关键词:《专业嵌入式软件开发》 一书作者
职业信息:
从业时间:15年以上
行业:电力、通讯、互联网
公司:淘宝(中国)软件技术有限公司
职位:软件开发工程师
关注技术:嵌入式软件开发、互联网技术、C/C++
【李云 的联系方式】
51CTO家园:http://home.51cto.com/index.php?s=/space/831344
新浪微博:@至简李云
博客地址:http://yunli.blog.51cto.com/
【李云是这样的人】
我在《驾驭你的“职场布朗运动”》一文中就自己的学习方法和过去的职场故事做了阶段性介绍,并总结了二十五条职场感悟。由于每个人都有属于自己独特的学习方法和成长故事,林林总总加起来使得我们能看到很多有异却相似的内容。类似内容看多了,难免让我们变得麻木,会觉得这些方法和成长感悟是特有的,无法复制。
“品牌”一词让我们直接联想到的是商品,它往往包含着高品质和高价钱,与之对应的是“山寨”。如果将我们的职场旅程比作一个商品,那么我们都应努力去做一件事:去“山寨”,树“品牌”!那职场旅程的“品牌”是如何铸就的?
追求
在我们的职场旅程中我们首先要有打造“品牌”的追求,才能静下心来好好积累,耐得住与书为伴的“寂寞”,不盲从,不浮躁。没有追求,往往就没有目标。很难想像一个没有目标的工程师能开心而快乐地工作,更别说能憧憬美好的未来。
坚持
大多人都知道勤奋的重要性,然而我想强调的是坚持。勤奋可以理解为今天努力地学习A、明天努力地学习B,入门即放弃了,因而落得样样不精。与之不同的是,我们在某个时间段坚持学习A直到学精。“精”意味着我们达到了一个高度,此时往往也容易做到旁通B。
坚持的另一层含义是,碰到困难时不轻易放弃。解决难题的过程往往是我们积累成长最快的时候。解决难题的过程是一个难得的学习过程,我们没有理由不把握,不坚持去解决。
专业
通过包装获得“品牌”的商品往往难以持久,同样,我们自己这个“品牌”也应具备真材实料的内涵。传统商品的生产者与消费者间存在着较为严重的信息不对称性,而我们自己这个“品牌”是建立于同行之间,这些同行对于我们的技术能力具有很好的鉴别能力。
真材实料不光要求我们能干事情,还包含我们的做事态度和做事方法,更进一步说是需要我们专业做事。什么是专业?我的理解是:用业内共识的科学知识和方法去get job done!做事越是专业,就越符合业内的常识,同行也就更能理解你所做的事,这对于团队协作相当重要。
学习
年纪越大越能体会IT行业的快节奏,唯有学习才能让我们跟上步伐。在这个快节奏的行业,我一直有一个担心,担心年轻的工程师因为整天忙于项目而忽视学习和思考。这个行业不是因为快而没有学习和思考的时间,而是因为学习和思考的时间太少而使得我们低效。如果长时间处于忙得没有时间学习和思考,那真该静下心来好好想一想是不是自己选择了错误的岗位,抑或做事的方法应当“重构”?
学习不能光靠阅读专业领域的书籍,在互联网时代如果不订阅一些newsletter或逛逛技术论坛什么的,那多少显得有点落伍。加入一些开源项目的mailing list也是一种不错的学习方法,它有助于我们了解别人是如何做项目决策和思考技术问题的。
等待
通过时间的沉淀让“品牌”具备内涵需要我们耐心等待。这除了因为技术知识真正积累到一定的深度需要时间外,还因为增加人生阅历的厚度同样需要时间。后者对于职场发展的重要性相对容易低估,也因此容易助长浮躁。
作为社会人,社会大环境的确对我们的职场发展乃至追求幸福的道路有着极大的影响。但无论如何,历史发展的车轮一定是向前的。或许当下我们很难为自己的工程师职业感到自豪,但将来中国社会的健康发展一定离不开高素质的工程师队伍。只要耐心,我们一定能等到那一天!
现状无论如何,为了应对将来的不确定性,我们现在能做的是耐心将事情做到最好!
蝶变
当你发现别人搞不定的问题你能搞定时,真该好好庆祝一下,因为那意味着你很有可能是“名牌”了! 不幸的是,无论你多么“大牌”,或许因为行业的衰落、公司的不景气,抑或职业发展碰及了天花板,终有一天我们会面临职业发展的大变迁。
在树立品牌的过程中,我们的能力不断地得到提升,对薪资的要求也越来越高,并且更加懂得平衡工作与生活。某种程度上,我们适应环境的能力其实在下降。换句话说,适合自己的工作岗位实际上在减少,或许自己还愈加害怕变化!
所有这些都需要我们通过“蝶变”为自己创造新的发展机会!
因为职位变迁,我们可能进入一个新的行业、或走上一个全新的岗位,此时“曾经沧海难为水”的心态将无助于我们面对新挑战。怀着空杯心态,将自己曾经成功过的方法在新环境下再运用一遍,我们一定能达到新的职场高度!
总之,“品牌”并非某些人的专属品,每个人都能将自己打造成“品牌”!
1. 向量绘制,用路径来描述图形,可以是闭合也可以不是闭合。
2. Building Blocks:
- 点: CGContextMoveToPoint
-线: CGContextAddLineToPoint, CGContextAddLines
-圆弧:CGContextAddArc,CGContextAddArcToPoint
-曲线:Quadratic/Cubic Bezier曲线, CGContextAddCurveToPoint, CGContextAddQuadCurveToPoint
- CGContextClosePath会被某些操作默认执行。
- 椭圆:CGContextAddEllipseInRect;
- 矩形: CGContextAddRect;
3. 创建Path CGContextBeginPath + CGContextMoveToPoint
4. Painting Path != Create Path
5. Mutable Path: Path对象,独立于Context存在。CGContextAddPath来使用它。
- CGPathCreateMutable = CGContextBeginPath
- CGPathMoveToPoint = CGContextMoveToPoint
- CGPathAddLineToPoint = CGContextAddLineToPoint
- CGPathAddCurveToPoint = CGContextAddCurveToPoint
- CGPathAddEllipseInRect = CGContextAddEllipseInRect
- CGPathAddArc = CGContextAddArc
- CGPathAddRect = CGContextAddRect
- CGPathCloseSubPath = CGContextCloseSubPath
6. 描边
- 线宽:
- 连接方式:Miter尖角,Round圆角,Bevel平角
- 线头:Butt平头,Round圆头,Projecting扩展平头
- 角限:限制尖角连接的范围
- 点划模板:
- 颜色空间:
- 颜色:
- StrokePattern?
CGContextStrokePath/CGContextStrokeRect/CGContextStrokeRectWithWidth/CGContextStrokeEllipseInRect/CGContextStrokeLineSegment/CGContextDrawPath
7.填充规则:
- nonzero winding:CGContextFillPath从某点出发向图形边缘做一条射线,如果射线和图形某条边相交,且该边从坐向右穿过射线,则相交计数+1,如果该边从右向左穿过射线,则相交计数-1。如果最后相交计数为1,则该点在图形内。
- even odd:CGContextEOFillPath从某点出发向图形边缘做一条射线,如果射线和图形边相交点数为奇数,则该点在图形内。
8. CGContextFillPath/CGContextEOFillPath/CGContextFillRect/CGContextFillRects/CGContextFillEllipseInRect/CGContextDrawPath
9. 混合:CGContextSetBlendMode - GraphicsState, 通常:
- Normal: result = result = (alpha*fore) + (1.0-alpha)*back;
- Multiply: result = fore*back;
- Screen: result = 1.0-(1.0-fore)*(1.0-back);
- Overlay: result = gray(back)>0.5?(1.0-2.0*(1.0-back)*(1.0-fore):fore*back*2.0f;
- Darken: result = min(fore,back);
- Lighten: result = max(fore,back);
- Color Dodge: result = back/(1.0-fore);
- Color Burn: result = 1.0 - (1.0-back)/fore;
- Soft Light: result = gray(fore)>0.5? 1.0 - (1.0-back)*(1.5 - fore):back*(fore+0.5);
- Hard Light: result = gray(fore)>0.5?1.0 - 2.0*(1.0-back)*(1.0-fore):2.0*back*fore;
- Difference: result = abs(fore-back);
- Exclusion: result = 0.5 - 2.0*(fore - 0.5)*(back-0.5);
- Hue: result = lum(back), sat(back),hue(fore);
- Saturtation: result = lum(back),sat(fore),hue(back);
- Color: result = lum(back),sat(fore),hue(fore);
- Luminosity: result = lum(fore),sat(back),hue(back);
10.裁剪: CGConextClip/CGContextEOClip/CGContextClipToRect/CGContextClipToRects/CGContextClipToMask;
1. CGContext类。
2. UIView::DrawRect函数
3. UIGraphicsGetCurrentContext()函数
4. UIView坐标系和Quartz坐标系相反。
5. CGContextRef myContext = [[NSGraphicsContext currentContext] graphicsPort];
6. initWithFrame, intWithCoder, DrawRect
7. CGPDFContextCreateWithURL, CGPDFContextCreate
CFURLCreateWithFileSystemPath(), CGDataConsumerCreateWithURL()
8. iOS 推荐使用 UIGraphicsBeginImageContextWithOptions,它会自动做Quartz和UIKit之间的坐标变换。
9. CGBitmapContextCreate
10. Pixel Format
NULL color space:
- kCGImageAlphaoOnly 8bpp = A8
Gray color space:
- kCGImageAlphaNone 8bpp = L8
- kCGImageAlphaOnly 8bpp = A8
- kCGImageAlphaNone 16bpp = L16
- KCGImageAlphaNone|kCGBitmapfloatComponents = L32F
RGB color space:
- kCGImageAlphaNoneSkipFirst, 16bpp, 5bpc = R5G5B5X1
- kCGImageAlphaNoneSkipFirst, 32bpp, 8bpc = R8G8B8X8
- kCGImageAlphaNoneSkipLast, 32bpp, 8bpc = X8R8G8B8
- kCGImageAlphaPremultipliedFirst, 32bpp, 8bpc = R8G8B8A8
- kCGImageAlphaPremultipliedLast, 32bpp, 8bpc = A8R8G8B8
- kCGImageAlphaPremultipledLast, 64bpp, 16bpc = A16R16G16B16
- kCGImageAlphaNonSkipLast, 64bpp, 16bpc = X16R16G16B16
- kCGImageAlphaNoneSkipLast|kCGBitmapFloatComponents, 128bpp, 32bpc = X32R32G32B32F
- kCGImageAlphaPremultipliedLast | kCGBitmapFloatComponents, 128bpp, 32bpc = A32R32G32B32F
CMYK space:
- kCGImageAlphaNone 32bpp, 8bpc = C8M8Y8K8
- kCGImageAlphaNone 64bpp, 16bpx = C16M16Y16K16
- kCGImageAlphaNone|kCGBitmapFloatComponents = C32M32Y32K32F
11. CGContextSetShouldAntialias for bitmap context, CGContextSetAllowAntialasing for graphics context.
前几天通过36氪了解到了Parse这家伟大的公司,然后这几天都兴奋不已,一直在研究Parse提供的各种服务的文档。
有了Parse,对于个人开发者来说会有多大的好处呢,当然,对于企业来说,也一定有很多的好处,现在我只是站到个人开发者的角度去思考这个问题。
我是一位Android开发爱好者,对于移动开发者来说,最不想接触的就是后台服务器的东西,对于个人开发者来说,也没有那么多的精力和时间去每一个点都去自己动手做。
移动应用用户最关注的就是用户的体验了,而Parse就是让我们全身心地关注用户的体验,做一个漂亮的app
所以,有了Parse,我们就把部署服务器,编写服务器端代码,设计数据库的时候都省下来了,只需要研读一下Parse提供的详尽的Docs,就能通过简单的调用API来完成后端的工作。太酷了。比如说注册功能、用户的管理、数据的保存与调用……
我按我的理解画了一个图来诠释使用Parse开发应用:
Parse提供的服务如下:
只需要在App程序中调用简单的API就能把数据存储到Parse Data 上面。比如String数据,文档文件,图片等。
消息推送是每一个应用不可缺少的,然而开发起来是比较复杂的。Parse也集成了这个功能,而且后台管理非常的方便。
和国内的的一些 移动应用服务平台一样,都上不了对社交的服务。但是Parse对于面向国内用户的开发者来说,是完全没有任何意义的。一位只是支持FaceBook和Twitter这两个社交平台。国内的我推荐使用友盟,我的一款 应用就是使用友盟提供的服务来添加社交元素的 。
云代码就很厉害了。这是所有服务当中最给力的地方。使用JavaScript来编写云端的代码,只要使用Parse提供的SDK就能很快捷的开发出原来服务器所要完成的工作。
多平台的支持,也是Parse吸引人的地方。囊括了所以主流的平台,而且说个平台的管理非常的方便。一点也不麻烦。
更多关于Parse的内容。大家就去官网看看吧,不过全英文的,就当作是学习英语了:https://www.parse.com/