“人生苦短,何必学Python?”

标题的名字,不是我说的,不出你所料是鼎哥说的。

话出有因,我用Python写的同步印象笔记的代码不能同步中文笔记,我对Python不熟,调试了好久也没有弄清问题的症结在哪,只能让鼎哥来。最后,鼎哥果然神勇,花了三个小时,通过加了个str函数解决了这个问题。

鼎哥抚了抚袖子,长吁一口气:人生苦短,何必学Python

这就是标题的来源。

这个debug的故事说明了两个问题,一个是Python的字符操作要谨慎;另一个问题是,要不要学Python

以前我如果介绍牛逼的程序员的时候,我会用这样的词汇,比如此人精通八种计算机语言,熟练使用八种计算机语言输出“helloworld,现在估计我不会这样去介绍别人了。

你会再多语言也不过是码农,就像一个农夫只是换了一个锄具,你能在别人的面前炫耀你会使用八种锄头锄田吗?作为一个农夫,你原本就必须使用八种甚至更多锄头才行。

再说一个问题,我为什么瞧不起码农? 在外人眼里看来,我也逐渐要成为一个码农了,每天上班的事情别无二致,从计算机的角度讲,是最低级的编码人员。

但是,我有意规避了这个称谓,我自称“web艺术家,想甩别人一条街。在我看来,码农的可替代性太强了,耕田谁不会,但是web艺术家,可能还讲究一些故弄玄虚的奇技淫巧。

说白了,我自称web艺术家,也是遮掩自己对计算机懂得不多的弊病。

有人会说,你瞧不起码农,比尔盖茨、莱纳斯、扎克伯格都是码农,你瞧不起他们?我不会回答这个问题,因为问这种问题的人,连码农的概念都没有搞清。 再回到题目,人生苦短,要不要学Python?我的回答是,当然要学,但是不止于Python。道家说过,知止于不知,何等的嘲讽,但是做人总要有些挣扎。

怕老婆,你站哪边?

今天遇到两个问题,一个问题是用户的验证问题,在同一个函数里用户的唯一标识居然换了,个人觉得是 session 的问题,但是也不一定,代码调试了之后,这个问题居然奇迹般的不见了,我并不知道问题出在哪里;另一个问题是印象笔记同步的问题,下班后又调试了一个多小时,终于将流程打通了。

继续阅读“怕老婆,你站哪边?”

怪谈“观察者模式”

对于代码的设计模式,我用的不多,又不甘心说自己是乱说,所以只能取个“怪谈”的名字。

观察者—我对这个名字充满了好感,如果你也像我一样,对这个名字多念了几次,就能读出世态炎凉人情冷暖的味道来。

所谓观察者模式,就是“冷眼旁观”的写程序,我在一旁盯着,老板说这个功能不要了,那好,我撤销一个观察者;过了一些时日,老板又说,你再加个功能,很简单,我再加一个观察者。在这样的情况下,无论老板怎么虐我,我都能快速的组织代码,实现功能。

不过大家不要误会,我拿老板做例子,不是总是树立雇佣双方的矛盾,在实际开发中,需求改变在所难免。

观察者模式的代码实现具体是怎样的呢?

abstract class Observer { abstract function update(); } class Observer1 extends Observer { public function update(){ echo “我是第一个观察者<br>”; } } class Observer2 extends Observer { public function update() { echo “我是第二个观察者<br>”; } } class Eventer { private $observers = array(); public function addObserver($observer){ $this->observers[] = $observer; } public function trigger(){ foreach ($this->observers as $observer) { $observer->update(); } } } $eventer = new Eventer(); $eventer->addObserver(new Observer1()); $eventer->addObserver(new Observer2()); $eventer->trigger();

上面的代码串的意思是使用了一个叫做“Eventer”的观察者类,来管理继承了“Observer”这个父类的类,通过Eventer观察者来处理操作监听Observer类的状态,反正思想大致如此,具体实现随便玩。

有时,我为了强用设计模式,甚至写出这样的代码来记录一个日志:

interface Observer { public function addLog(); } class LogObserver implements Observer{ private $file_path = “./error.log”; private $message; private $special_message; public function __construct($special_message) { $this->message = date(“Y-m-d H:i:s”).”===”; $this->special_message = $special_message.PHP_EOL; } public function addLog() { error_log($this->message.$this->special_message,3,$this->file_path); } } class LogMaster{ function __construct(Observer $observer) { $observer->addLog(); } } new LogMaster(new LogObserver(‘log info’));

有人说,上班久了,无聊了,要开始炫技了。

四点记录

没看过什么书,没什么工作经验,浅谈。 我想团队协作的基本原则是沟通顺利和互不影响各方的工作,如此一来就会面对工作同步或者滞后的问题。

刚刚开始没有经验的团队,一般流程是出设计稿、编码、测试,甚至是出设计稿、编码、出设计稿、改码、出设计稿……,永远不知道什么时候是测试时间,有一天老板心血来潮要体验产品,结果一堆bug,产品实现人员被骂得狗血淋头。 好像一开始就扯远了文不对题了,好,开始数点。 1.前后端如何配合 前后端的配合主要是数据获取和操作的问题。一般的做法的是各方自己写自己的,前端需求有了问题或者API调用不对头,后端改一下。很明显,这样并不好,会导致沟通成本增加(不要太简单的理解沟通成本)。 既然这样有问题,你可能会问那前后端在工作开始就确定API的调用接口不就好了?这样其实是没有什么用的,因为你还没有进行编码工作,你对这个产品并不了解或者细节了解的不深,双方的沟通是没有深度和不清晰的,即使一开始沟通了,后来还是再次沟通。

前端其实一开始不需要数据,可以自己模拟一些数据来实现界面设计的实现,这个时候后端编码人员也在同步进行API设计。

界面快要完成了,前端和后端编码人员进行API的核对和商讨,这个时候,编码人员对整体的架构都有清晰的认识,沟通就比较高效。

工作上也谁都不耽搁。 我这么说不是否定沟通,而是如何进行高效沟通。

2.面向对象编程如何设计你的类 在数据驱动的产品中,用户的所有的操作都是操作他的数据,一个类的设计也应该围绕数据操作来进行,如果有一个user表,那你的代码肯定也有一个user模型,围绕增删改查来组织你的代码,无论你的c层的逻辑如何,m层的代码实现也不会受影响。 这样的好处是m层和c层的代码耦合度很低,以后改起来很方便。以前写代码没有经验,写了很多难维护的代码,也不优雅。 3.作为一个编码人员的基本素养是什么 在目前,我只能简单的理解为你要对你的代码负责,负责包括写好注释,测试代码的功能和使用流程。

当然,我也问过很多人这个问题,他们都说不知道,这个问题了太难了。反过来想,有答案不见得是好事,追求答案的状态才是重要的。

一个编码人员在不同阶段对素养的理解和追求应该也是变化的。

只能说,我要做一个有职业素养的人。 4.2015的总结 上了半年班,可能是人生最后的寒暑假没有了,我心里很不情愿,我还没有做好心理准备,lol还没有上大师,心有不甘。

但是我是适应能力很强的人,所以没有上的大师以后再上。 说到最后都是感谢。如果有两个关键字的话,我想一个是拒绝一个是迎合,无论我得到的是拒绝还是迎合,我都学到很多东西,特别是那些我去实现和追求某些东西能开导我的道理,感谢你们。

毕业实习报告

终于要毕业了。第一次参加这么长的社会实习,也算不得“社会”二字,毕竟同事也是学校的老师和同学,但是算得上幸运。因为公司是老师和学生开的,大家在一个桌子上共事了许久。

读书十六载,用到“载”字,估计语气也沉重了许多。这次毕业不像小学毕业、初中毕业或者高中毕业,这次毕业很有可能意味着是我学生时代的终结。读了这么多年的书,终于要换一个环境,或者说终究要换一个环境,以后都不再踏入校园,心情多少回有点不一样。 还是说我的毕业实习的情况。 一:早点起床。 上班的日子,让我最印象深刻的是要勤奋。如果你今天8:30起床,那么你明天就会8:30之后起床,这样就会增大上班迟到的风险。同时,如果你早上8:30起床的前天晚上睡觉时间是12:00,那么你就更有可能在下次睡觉时间推迟到1:00,这样一来总有迟到的那一天。迟到了一天,如果一个人知道警醒,就会做出调整,如果这个人不是never learn,那么这一次调整就是最后一次调整。不过我重点要说的还是要早点起床,回到一日之计在于晨这句话,只有早点起床才会有更大的发挥空间。 比如说,早上起来可以看《道德经》,在实习期间,我不只一次想早起看《道德经》,但最终因为道德品质太差起床太晚导致读经失败。说到读经,有下面一段有意思的文字:

顾栋高先生复初,清康熙辛丑进士,性倨慢不合时,仅三载即归田。深于经学,自幼至老,未尝一日不读书,于五经皆有发明。

掌教淮阴时,夏月坚闭重门,解衣裸体,寸丝不挂,手执一卷,高读不辍。客至,自门隙窥之,大笑。

先生仓皇著衣而出。谈者传为笑柄云。

我也可以这样。 二:早点吃饭。

大家知道一到吃饭点,人们就会出公司吃饭,这个时候人会巨多,需要排队等候,排队往往会浪费更多时间,看起来因提早吃饭而破坏公司规矩,但是实际上是获得了更好的体验并且赢得了时间。 吃饭的哲学在于细嚼慢咽,而饭菜的哲学是体现食物原来的味道。最恨那种吃饭赶着去投胎,没吃之前你等他半天,吃完了他抹鼻子走人不等你的人;而饭菜,最恨是放了一堆调料,吃不出猪肉和鱼肉的区别。 吃饭有个难点,就是不知道在哪里吃?去这家店子吃了两个月,如果想要换一家反而自己觉得做了亏心事。做顾客做到这样良心发现,估计这家店的味道要变差了。 三:慢的哲学。 代码写的越慢质量越高。如果要得出这样的结论,可能要加上一些故事前缀:

我写代码多年,有一天夜里,我满身大汗醒来,梦到了阿兰·图灵和冯·若依曼对着我说:你写代码太快了,都是bug。

代码之道在于精益求精,而只有“慢”,才能让你写出能运行更久的代码。戏谑者称,代码之道在于慢,以后所有的编码人员都会对着电脑发呆,双手放在裆下,美其名曰:思考未来。 四:不可说的秘密。 我虽然因为起床太晚,没有完全看完《道德经》,所以只记得“道可道,非常道”,实习中的其它体会同样也是不可说的,说出来就没有意思了。 人完全有这样的一种情绪,很微妙,让自己快乐也让自己哀愁,这种情绪是不能袒露的,它的全部意义在于情绪的所有者。

五:想想未来。 哈,这种思考双手不用放在裆下。学生时代的结束,是打工仔时代的开始,这也许是我们每人美好生活的开始。

“顺丰”骗局

首先声明,这个事情和顺丰快递是没什么关系的,只是有不法分子借顺丰之名行骗。

中午吃了一碗酸豆角牛肉盖面(14块钱,太酸了,下次不点这个了)后,接到一个名为“顺丰快递”的电话,说我的一个快件被拒签了多次,快件物品是九张银行卡,属于违法物品,让我向公安局报案处理。我一小老百姓就图个安稳,平生就怕上医院和公安局。

一听,我就觉得这是个事,我要处理一下。

开始我以为是我的个人信息泄露了,别人拿了我的个人信息做坏事。在互联网时代,个人信息泄露是很正常的事。

比如有些没品的网站收集了你的个人信息后卖给其他人,或者因为互联网安全问题,你的个人信息被人窃取。

对方告诉了我快件详情,并告知我电话不要挂断,他会立即转接给“上海市普陀区公安局”。快件详情如下:

快件编号:01038

寄件时间:2016.01.20

内容:九张银行卡

发件地址:上海市普陀区顺丰快递

收件地址:澳门半岛白马杭街108号

收件人:张强

说完之后我就按照他的提示接通到了自称是上海市普陀区公安局的一名民警的电话,我和他聊了一会,最后我不耐烦,挂了。 以下是我分析的疑点:

1.顺丰快递的人操着一口粤语普通话,但是自称是株洲顺丰的。妈的,顺丰在广东起家,广东人跑到株洲就为了接个快递电话了!而且普通话都说不标准,还当个屁客服啊!。当我怀疑他不是顺丰的人之后,他便立即要告诉我编号,我没什么兴趣,就制止了他。

2.事后,我谷歌了一下“顺丰快递”的号码,+8887314595338,以+88开头的是卫星电话,这就足以解释,我和他通电话时,我听不清楚的原因了。

3.上海市普陀区公安局的电话,+66 85 192 7346,一查发现是泰国的电话号码。我靠,打国际电话,这么有钱还骗什么人。 4.收件地址一查,不存在。

5.快递编号只有5位数。我靠,老子也是做互联网开发的好不好,数据库设计也是搞过的好不好,五位数搞个屁啊。

反正是疑点重重,我都懒得再分析了,总之,个人信息千万不要告诉任何不信任的人。待人接物首先是“疑”,以后我不信任你,千万别说“哎呀,你这都不信我”这种矫情的话。

.gitignore文件的作用

在团队开发中,不是所有的文件都需要共享的,比如数据库配置文件。你和别人在本地开发时,数据库密码可能会不一样,生产环境和测试环境的数据库密码也会不一样。这时.gitignore文件就可以帮你忽略这些更新,比如在.gitignore文件里加入这么一行:

database.config

来忽略你的数据库配置。 另外再值得一提的是,我们一般会配置一些常量,这时最好将数据库常量和其它常量分开,因为上面就提到数据库连接的问题了。

笔者当然经历过调试bug很久,最后发现是git pull下来后数据库常量值变了的苦逼情况。 来看看.gitignore文件的匹配模式是怎样的?

空白行不会匹配任何文件,所以一般为了可读性作为分隔符。

#开头表示注释一行。 连续的两个**号匹配一切文件夹,**/foo/bar匹配一切foo下的bar文件夹,abc/**匹配abc的一切文件和文件夹,但是这些匹配都是相对于当前的.gitignore文件位置来说的。 a/**/b匹配a/b, a/x/b, a/x/y/b。 /*.c会匹配cat-file.c,但是不会匹配mozilla-sha1/sha1.c

/* !/foo /foo/* !/foo/bar 这个感叹号的意思可以看做是不包括,它是对上一条规则的重新定义,比如/*忽略一切文件和文件夹,但是!/foo表示不忽略foo里面的文件和文件夹。

最后我们不要忘记在.git/info/exclude文件里也是添加忽略文件的。

初学ps笔记

HSB(人眼)、RGB、CMYK(印刷)正片叠底——减色模式,往黑里变。滤色相反。所以在正片叠底的情况下白颜色上不去,因为正片叠底是往黑里变。如果要把上面那张画的黑颜色去掉,用滤色就可以了叠加柔光其实就是叠加,颜色不加也不减

  1. HSB(人眼)、RGB、CMYK(印刷)
  2. 正片叠底——减色模式,往黑里变。滤色相反。所以在正片叠底的情况下白颜色上不去,因为正片叠底是往黑里变。如果要把上面那张画的黑颜色去掉,用滤色就可以了
  3. 叠加柔光其实就是叠加,颜色不加也不减
  4. 色相、饱和度等是单一锁定的调节,比如只想改图片的颜色,就选色相
  5. 历史记录画笔工具:在现在和历史记录标记的状态来回切换,局部修饰用。 裁切之后历史记录画笔工具就会禁用,需要把标记换到裁切那一步。历史记录艺术画笔工具其实就是在历史记录画笔工具上加了一点特效
  6. 大楼上的巨幅喷绘,分辨率只需要十几到几十
  7. CAW(佳能)、NEF(尼康)、DNG(哈苏)是camera Raw格式(原数据包)后缀名
  8. 位深度(关于通道)
  9. 在Bridge调数值按住alt键就可以科学的调,而不是凭感觉
  10. 通道是三类颜色,黑白灰。

    通道第一个特征的是记录颜色信息(颜色通道)
    专色通道(有一些颜色用CMYK印不出来,就需要用专用的颜料印,但也不是说印的出来的就不是专用颜色)
    alpha通道用来保存选区
    TGA(Targa)、TIF(TIFF)、PSD支持通道,图层蒙版是一个临时通道,是通道另外一个变种,通道对原始图片无破坏,蒙版大多用画笔处理。调色最主要的是图像的调整,其中最重要的是色阶,曲线,色相/饱和度
  11. 打开图片第一件事就是看色阶,曲线其实和色阶也差不多,但是更细。调饱和度只需要调如天空,就把饱和度打开,把全图改成蓝色调即可,不要用选区。(饱和度打开有两条色相条,上面是输入,下面是输出。有四个标志块,长方形中间是选取的颜色主体范围,三角形和长方形直接是容差范围)但是像衣服那样有很多颜色混合,先做一下选区,把衣服框进去,移动那个标志块(或用色相条上面的吸管吸),把容差值收一收。
  12. 想把画面调成冷或暖色调用色彩平衡对话框很容易实现。把不同来源的图片弄成统一色调,如黑夜,用匹配颜色(比如自己拍的照片怎么拍都不如大师拍的,可以用匹配颜色将自己的图片和大师的匹配就会秒变好看)
  13. 可选颜色(最早用在印刷里面堆油墨)和通道混合器都是针对通道来调色。一张图片高品质的灰度图不是靠去色,也不是把图片改成灰度模式,而是通道混合器的单色或图像的应用图像
  14. 反相指明度和色相都相反
  15. 渐变映射(和渐变及色相有关)里面点击有选项如金属,可在渐变基础上追加金属质感
  16. 照片滤镜就像是拍照的时候加了一个滤光镜头
  17. 在几张几张扫描照片或其他图片之后一张一张裁剪修正很麻烦,可以在文件>自动>裁剪并修齐照片,回车一键搞定
  18. 在去色同级目录下有一个阴影/高光专用来弥补背景过亮,物体过暗无细节的问题
  19. (不重要)色彩均化是把太暗的地方自动调亮一点,太亮的自动调暗一点。 色彩分离可以用来和插画互转
  20. 阈值(用来得到黑白图或线稿):做之前要先滤镜>其他>高反差保留(也可以用来把图片变清晰)可以用阈值来做插图中的线稿提取。得到图像线稿或是黑白图的方法是:执行滤镜-其他-高反差保留(高反差保留就是把明暗交界处、轮廓处保留下来,把不需要的地方遮盖掉),然后在图像-调整-阈值;然后,把不需要的地方擦掉。
  21. 模式的位图和双色调是需要转成灰度之后才可以使用。而位图主要是用半调网屏选项,是用在报纸印刷(只用一种油墨并且没有深浅变化,光盘上的图案也是这样印出来的),双色调是可以选择一到四种颜色作为一种专色,在印刷时直接用专色颜料印就可以了,不像用RGB转CMYK需要印四次,成本高
  22. 索引颜色也是单通道,是图片的精华,文件量小,支持透明,以前用在多媒体动画里面,现在可做GIF(在存储为web格式里面试可设数值),小图标,带动画,有透明才用GIF来做,真彩图片存储为JPEG
  23. 图层>图层样式>混合选型、投影等。
  24. 画笔混合是一边画一边混合,混合选型的图层混合和图层面板上的混合完全一样,是画好了再混合。混合颜色带:把三角形(按住alt键可以拆开,实现容差的效果)向暗部移动会导致亮部与下图混合。可用在如拍的天空无云彩,从别的地方提取云彩;高级混合>挖空:深,直接挖到背景;浅,挖到图层组底部。在做GIF时,画了一个东西在第一帧,移动到另一个位置放在第二帧,在第一帧和第二帧圈选可调出过渡,设置中间穿插几帧就不用一帧一帧做了
  25. 滤镜的抽出(后改为用选区工具时的调整边缘)是可以把物体从背景中抽离出来(就不用花大量时间在抠图上,但只适合背景不是特别复杂的物体抠图),点开后用画笔沿着物体边缘画(把觉得会镂空的也都用画笔涵盖住),用油漆桶填充中间部分(即表示这些都是要抠出来的地方),有些不恰当的地方用清除边缘擦几下。
  26. 消失点(解决有透视关系的画面去大污点修复):创建平面工具,套出一个基调,用印章工具。像楼那种有透视有拐点的,需要套出基调之后再点一次平面工具,点击拐弯处的节点,拖出去就可以了(可以用在游戏的大幅布景、楼顶招牌效果、物体铺材质)。
  27. 滤镜里的极坐标可以用来做爆炸特效,而置换是可以在需要的地方贴一个材质
  28. 可以用滤镜做出冰块,动作:可以用来处理大量图片,如给几万张图片各加个人logo(先设好动作,然后文件下有一个自动)。
  29. 一张图片不能凭感觉认为好与坏,先自动色阶(ctrl+shift+L),然后追加一点饱和度(ctrl+U),然后强化环境周围(色彩平衡:主要调高光阴影部分),最后锐化(模糊要做到边缘留下来,模糊整体;锐化是锐化边缘,整体不动),锐化先复制背景,然后滤镜之高反差保留(一两个像素就可以了,把灰调屏蔽用图层混合>柔光)
  30. 貌似通用
    正片负冲效果(胶片的感觉):在通道针对单通道调色阶(在调单通道时要想看到其他效果可以把其他两个通道点开)。然后图像>应用图像,(蓝色)勾选反相、正片叠底、不透明度50%;(绿色)勾选反相、正片叠底、不透明度20%、(红色)不要反相、颜色加深、不透明度100%。然后再点蓝色通道,色阶(调输入色阶三个值):25,0.75,150;绿色通道,色阶:40,1.2,220;红色通道,色阶:50,1.3,255。点复合通道,图像>调整>亮度/对比度(亮度-5,对比度+20),饱和度+16。

这里有一篇比我详细的笔记(同一教程):http://blog.csdn.net/sqc157400661/article/details/68484801?locationNum=3&fps=1