艾莉亚的猫 Time is limited, To be a better man

面向对象设计

面向对象的三个基本元素

  1. 封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

  2. 继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

  3. 多态: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。

面向对象的5个基本设计原则

  • 单一职责原则(Single-Resposibility Principle)

    其核心思想为:一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起它变化的原因就越多,这将导致职责依赖,相互之间就产生影响,从而大大损伤其内聚性和耦合度。通常意义下的单一职责,就是指只有一种单一功能,不要为类实现过多的功能点,以保证实体只有一个引起它变化的原因。

    专注,是一个人优良的品质;同样的,单一也是一个类的优良设计。交杂不清的职责将使得代码看起来特别别扭牵一发而动全身,有失美感和必然导致丑陋的系统错误风险。

  • 开放封闭原则(Open-Closed principle)

    其核心思想是:软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。开放封闭原则主要体现在两个方面1、对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。2、对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对其进行任何尝试的修改。

    实现开开放封闭原则的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,所以修改就是封闭的;而通过面向对象的继承和多态机制,又可以实现对抽象类的继承,通过覆写其方法来改变固有行为,实现新的拓展方法,所以就是开放的。

    “需求总是变化”没有不变的软件,所以就需要用封闭开放原则来封闭变化满足需求,同时还能保持软件内部的封装体系稳定,不被需求的变化影响。

100个Linux小技巧

一个关于linux使用小技巧的文档,主要还是分享一下vim相关的tips。100在这里只是表明很多,具体的数目取决于您的参与和贡献。

快捷键

命令行快捷键

  • CTRL + A 移动光标到行首
  • CTRL + E 移动光标到行末
  • CTRL + W 剪切一个单词
  • CTRL + U 剪切光标至行首的内容
  • CTRL + K 剪切光标至行末的内容
  • CTRL + Y 粘贴

向终端粘贴文本

  • Shift + Insert

快速搜索

  • CTRL + R

用途:反向搜索执行过的命令,搜索上几个命令还是[上]键更有效率

清除屏幕

  • CTRL + L

Alias

ls相关宏

  • alias ll=’ls -alF’
  • alias la=’ls -A’
  • alias l=’ls -CF’

cd相关宏

  • alias ..=’cd ..’
  • alias …=’cd ../..’
  • alias ….=’cd ../../..’

自定义

  • mcd() {mkdir -p “$1”; cd “$1”;}
  • cls() {cd “$1”; ls;}

清除屏幕

  • alias c=”printf ‘\033c’”

屏蔽gdb启动时提示信息

  • alias gdb=’gdb -q’

Alias definitions

Put your alias into a separate file like .bash_aliases

if [ -f ~/.bash_aliases ]; then
    source ~/.bash_aliases
fi

Git alias

在git的配置文件.gitconfig中配置如下alias:

[alias]
    co = checkout
    ci = commit
    st = status
    br = branch -v
    l = log --pretty=format:'%h : %s' --topo-order --graph
    g = grep -n --color -E
    cp = cherry-pick -x
    nb = checkout -b
    who = shortlog -n -s --no-merges
    
    addall = !sh -c 'git add. && git add -u'

易错命令

  • alias sl=’ls’
  • alias ptyhon=’python’

Vim相关小技巧

这里分享的技巧全都是vim原生态的,不需要另外安装插件

《美国摄影教程》读后感

一、基础知识

曝光三要素

摄影是用光的艺术,如何准确曝光是学习摄影的基础。为了正确对照片进行曝光,你要根据你为数字相机选择的感光度(ISO)或胶卷的类型,以及拍摄对象的明暗,对镜头的开口大小(光圈)和快门速度进行设置。

  • ISO 可理解为传感器或胶片对光线的敏感程度,光线暗时要增加感光度,光线强时适当降低感光度。比如日光下感光度设为100,夜间照相感光度至少要设400以上。

  • 快门 运动物体使用高速快门定格,低速快门让静止物体表现出动态。

  • 光圈 光圈即镜头开口大小,大光圈小景深,小光圈大景深。

照片对焦

对画面中重要的部分进行对焦,确保这部分是清晰的。拍摄人像时,对焦部分通常是眼睛。

保持相机稳定

数码相机的安全快门通常在1/30s或是1/60s,相机“喀嚓”的瞬间,相机就执行曝光过程,这个时间如果低于1/60s ,便很容易因为手的晃动,而让画面变的很模糊,可以通过提高ISO和光圈将快门控制在安全快门范围内,或者使用三脚架稳定相机。

二、拍照的一些建议

你要拍摄什么?想好你要表达什么。

精心选择拍摄角度

不要试着全部照进去,如果画框装不下就不要勉强(特别是使用定焦镜头拍摄),要有选择。

运用不同视角、不一样的构图,对你的摄影主体多拍几张,这样能让你在对图像的选择、比较和思考中有所提高。

你拍得不够好,是因为你离得不够近

合理的裁剪,清楚的知道你要什么,多去尝试,多加练习。

人像摄影不要节省快门,先拍三四张,甚至十几张照片预热。

优秀的人像摄影并不仅仅呈现出人物的外貌,而是要抓取一种表情,展现一种情绪,或者表达一些人物以及摄影师的特质。

人像摄影时要让你的拍摄对象保持轻松,不要忘记保持沟通。有些人初始时面对镜头会不自然,可以先拍摄几张以消除这种不适感。

人物摄影时需要微笑吗?“我通常不喜欢人们对着镜头微笑。当然有时他们的笑容也很美丽。然而通常情况下笑容是一种防卫–人们并不自然。”

学习后期处理,在拍照和最终使用照片之间,用户所做的一切工作称为后期处理。

三、建立一个工作流

一个工作流就是一系列有序的步骤,将使你的数码相机工作起来更加简便。

1、拍摄照片

所谓拍摄就是将一个场景在图像传感器或胶片上曝光,拍摄被大多数人当做摄影的全部,但相机的功能远不止这些。

2、图片的下载和整理

从你的相机记忆卡中下载你拍摄的照片到计算机,整理你的图像,你可能会有成百上千的图像,如果拍摄和整理之间拖延的时间过长,必要的信息可能从你的记忆中滑落,试着按每个拍摄日结束的时间来整理你的图像。

3、编辑

编辑在摄影中的传统意义是让“好”的照片上升到顶部,工作流应用程序让你通过分配一个标志,一种颜色,一些星星或通过把类似的照片分类到一起。编辑的另一层含义是准备图像为下一步的导出做准备,这种数字图像的编辑也被称为后期处理,包括执行大多数标准图像的调整,例如裁剪和旋转,改变尺寸,修改色调、明度和饱和度。常见应用程序如Adobe Photoshop Lightroom、Aperture。

4、输出和归档

输出不限于印刷,尽管印刷可能是最常见的用途。最后记得把你的照片有组织的归档。

四、如何提高?

纽约现代艺术馆的摄影部主任把评价照片的标准定为5点:拍摄视点、画面框取、拍摄时机、画面内容本身、画面细节。 这是摄影编辑对照片评价的标准。 对于一个没有多少摄影经验的人来说,要理解一幅照片的优劣,确实非常难。最根本的解决之道,是自己多练习,对相机、镜头、摄影构图、色彩、数字图像等逐步解决后,再多拍摄,多动手,比较自己的照片与成熟的摄影作品之间的差距,才能够真正有本质的提高。

当然这样太苛求了。介绍一些捷径:

1、人文纪实类照片要有故事。照片传递的信息要丰富,没有文字说明、或配合简洁的文字就能够表现出主题。人物要“活”,打动人心。

2、新闻照片要有关键的瞬间,能以有限的画面表达主题。

3、人像摄影要表现人物的内在精神世界。

4、风光摄影、商业摄影应技术精到,见人所未见。

可以说,摄影是一种非常奇特的艺术形式:既是对客观世界的一种忠实记录,又可以表现出拍摄者的主观意愿。 看照片,就看能否打动人心。有的是用精到的技术、奇妙的构思取胜,有的是因拍摄内容本身而精彩。

一副好的照片,不见得所有的因素都是完美的,只要某一方面有精彩之处,也可以成为好照片。能够发现照片哪里照得不好,离能够评价照片的优劣就不远了。看一看自己家里的生活照,呆板直视镜头的照片,多半索然无味,而记录生活有趣瞬间的照片才弥足珍贵。


参考:

美国摄影教程 蜂鸟网 面对面

系统性能调优经验分享

概述

性能优化的思路

首先是较为精准的定位问题,借助于相应的工具包,分析系统性能瓶颈在哪,在根据其性能指标,以及所处于层级决定选择优化的方式方法。在选择优化的方式方法时,大家可以参照以下章节调优方法,架构优化递进,进行正确的,有针对性,有步骤的优化。可能会发现部分指导思想或许有相悖嫌疑,大可不必较真,系统优化的过程本身就是一个不断分离+共享的组合拳,至于具体选择哪种优化方式,根据具体需求来定,但大型应用发展的总体思路是不断分离,再通过索引(非数据库)进行关联起来。

切记:优化一定要对系统进行细致的望闻问切,找到性能问题根源切入点,而不被表象迷糊,对症下药,发现病症所在的医生并不比操作手术刀的医生水平差。本文有工具包一章节,对于需要做优化的人员,需要熟悉,他就是我们诊断所用的CT,例如我们发现内存高了,首先想到不是内存不够用,而是为什么如此消耗内存,用工具看看内存消耗在什么地方,试想之,如在医院,病人告诉医生,他心脏不好,医生就换心脏,那样的话,每个人只要熟练掌握菜刀,都可以做医生。

迭代优化

性能优化未必一次性就能满足的,可能此处瓶颈消失了,系统一旦运转快速后,在其他地方又发现新的性能瓶颈,所以性能优化是一个迭代的工作。直至满足系统需要的性能指标。

优化的成本

系统性能设计或优化是否可以一步升天,按照最好的分布式架构进行设计和优化呢,单个节点一直也运转及其健康,理论上是可以达到共产国际的,但实际实施层面不可取,必须结合实际的非功能需求进行设计和优化,一则一步到极致的话,系统的成本太过虑庞大, 光是性能设计和优化的成本就高于系统本身给客户所提供的价值,也造成研发成本开销过大。二则好像能够架构这样完美系统的人还没诞生。所以一句话也同样适合架构师:有理想而不理想化,废话少扯:具体见法则

调优方法

数据库优化

很多应用,优化DB往往是最直接,最方便,见效最显著的,但并非所有的系统性能都处在瓶颈,或者DB瓶颈解决之后,可能应用层瓶颈,WEB层瓶颈,甚至架构瓶颈都会冒出来了,所以数据库优化十分重要,但往往很多人理解系统优化就是数据库优化,是不全面的。优化角色一般推荐具备较深数据知识的程序员,或者专业的DBA,而不只是只会CRUD的开发人员。

  1. 建立正确的主键,外键,以及索引
  2. 分离原则:读写分离,业务数据分离
    1. 分库
    2. 分区
    3. 分表
    4. 分列(将大字段,不常用的隔离到他表,按需查询)
  3. 选择隔离级别:某些对数据一致性要求不高的,可以牺牲部分一致性,降低加锁阻塞
  4. 保证事务简短以及减少不必要的锁机制。
  5. 查询优化规则:
    1. 避免表内的相关子查询;
    2. 避免排序或为尽可能少的行排序,
    3. 做大量数据排序时相关数据放在临时表中
    4. 尽量在where后多传查询条件,以减少不必要返回的行
    5. 尽量select只需要的字段,以减少不必要返回的列
  6. 分页存储过程:大列表的查询也可以利用分页存储过程达到优化效果。
  7. 利用数据库缓存,视图,临时表等最大程度优化系统,并对存储过程和函数进行必要的优化
  8. 如有需要,可以冗余表中字段,避免联合查询
  9. 如有需要,也可以将表内的大字段分离到单独表中,使其单独查询
  10. 必做多表关联时,尽量过滤不符条件表中数据,减少笛卡尔积计算量
  11. 复杂表:如实时性要求不高,尽量后台任务计算,避免动态查询

安装tensorflow

最近心血来潮想看看google的tensorflow项目,试着在新买的mac本上安装了玩一玩。安装过程也很简单,有丰富的中文版官方文档参考。

只需一行:

pip install https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl

在此之前,Mac是默认安装了Python 2.7.10,但需要你自己另外安装pip工具。

sudo easy_install pip

安装过程🈶️报错误,原因是大致就是说numpy已安装,但是呢版本太低了,尝试着卸载和升级numpy就出错,错误信息如下💻


192:~ yangtze$ pip install -U numpy
Collecting numpy
  Using cached numpy-1.12.1-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
Installing collected packages: numpy
  Found existing installation: numpy 1.8.0rc1
    DEPRECATION: Uninstalling a distutils installed project (numpy) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
    Uninstalling numpy-1.8.0rc1:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
...
...
OSError: [Errno 1] Operation not permitted: '/var/folders/l0/gc9k2fw13d5f5jvl3l2yh8hm0000gn/T/pip-4wa7Fs-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy-1.8.0rc1-py2.7.egg-info'


查了半天资料原来是Mac系统开启的SIP导致的,据说是因为XCode编译器代码被注入的事件后,Mac OS X El Capitan系统的升级,启用了更高的安全性保护机制:系统完整性保护System Integrity Protection (SIP)。简单来讲就是更加强制性的保护系统相关的文件夹,开发者不能直接操作相关的文件内容。

那么解决方案就是暂时的关闭系统SIP,操作步骤如下;

  • 点击Mac电脑的苹果图标

  • 选择 重新启动

  • 按住 command+R,直到进入还原模式

  • 选择实用工具,然后点击 终端

  • 输入 csrutil disable 按下回车

  • 重启电脑

棘手的问题解决,之后你只要执行pip install https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl就可以顺利安装tensorflow了。(现在你也可以再次的开启SIP保护,步骤类似,只要在终端输入 csrutil enable)

最后以官方用例做为结尾


192:~ yangtze$ python
Python 2.7.10 (default, Jul 30 2016, 19:40:32) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print sess.run(hello)
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print sess.run(a+b)
42
>>> quit()