发布APIWiki
今天已发布ApiWiki(开源的API文档系统),这个项目是为那些公司内部开发API接口的开发者准备的,使用这个系统,可以减少与APP端开发人员的不必要的麻烦,降低沟通成本,让开发者更专注于开发本身(除花时间去写API文档之外)。
ubuntu firefox提示已阻止使用早期版本的flashplayer
升级到15.10后,ubuntu仍然没有内置升级firefox的flash插件,不得不采用手动升级来解决弹出“已阻止使用早期版本的flashplayer”的提示。
如果我们按照弹出提示进行升级,会发现,升级会打开软件中心,但是软件中心的flash版本确实还很低所以不能靠软件中心来升级。我们进到 https://get.adobe.com/flashplayer/ ,选择下载linux tar.gz包,下载下来以后解压出来,你会看到一个.so和一个usr目录。
cd到解压的目录,执行下面两条命令,来把文件复制到对应的目录去:
>> sudo cp libflashplayer.so /usr/lib/mozilla/plugins/ >> sudo cp -r ./usr/* /usr/
重启firefox,即可使flash成为最新版本,打开优酷之类的网站,可以直接启用flash,不需要激活。
开始积累自己的技术成果,做一个写诗的程序猿
在以前很久一段时间,我把大部分时间都花在思考一门语言的算法,并通过语言实现算法的难度和性能去区分它的好坏。但随着时间的流逝,我发现无论一门语言的语法和性能怎么样,都有它的可贵之处。javascript是一门再浅显不过的语言,然而它在HTML5时代的今天,却比任何一门语言都重要。这启示我一个道理,那就是一门语言无论是被成为烂尾也好,或者当下被夸赞的无法接受也好,到最后,都会随着时代的需要而变革,或退出历史舞台,或自我变革后适应新的需要。而在所有的这些里面,能够实现功能和算法,才是一切技术的核心,无论这些功能或算法是由什么语言实现的。
有段时间,我比较抵制使用第三方工具来进行开发,觉得那不够酷,自己写一大堆代码才能显示出自己的逼格。可是如果不用第三方工具,必然导致开发周期加长,开发效率降低。一个不懂学习最新的第三方工具来进行开发的程序猿,一定是一个落伍者。
除了在使用第三方库上的觉悟,积累技术成果,形成自己的资源库也是很重要的一种技术积累。作为程序员,或多或少会有代码洁癖,会在代码的可读性和美观程度上浪费很多时间。但是,如果一个库的出现,虽然它很好用,但是不能满足一些特定的要求,自己还要去重写的话,远远不如在这个库的基础上进行扩展,最终形成自己的库来的有用。
因此,我打算今后不断的把自己的代码放到服务器上面,不断的去维护和更新。虽然提交到github很好,但是放上去不能预览,所以,我干脆把代码直接丢在博客的子目录,可以被直观的看到。我要放的第一项目,是为公司写的一个HTML5页面,手机扫描下面的二维码来查看,该页面仅作为手机端展示效果,PC上没有效果。
这是一个手机端HTML5展示页,包含的效果包括:
- 左右划屏,iSlider插件
- 划屏时,背景图跟随滚动,类似安卓机桌面切屏时背景视差滚动
- 载入页面时的动作
- 视频播放控制
- 不同屏幕尺寸分为md/sm样式进行切换
这样的案例库,未来会全部以HTML的形式放到我的这个trunk目录下。这也让我养成一个新的习惯,即所有的项目未来必先形成html原型,再转换为模板或php文件进行提交,在后期进行调整之后,有重新整理到html中。这样就可以维持项目效果可以得到收集和展示。
使用群晖nas搭建私有git服务器
项目不易
6月29日入职至今,已经3个多星期,在这3个多星期中,我对项目的理解经历了几次整体的变革,由于自己对项目的把握不够,导致走了很多弯路,现在就把入职了解一个项目及其规划的一些心得写下来,作为今后的一些借鉴吧。
我在面试时,PM给了我一个大致的产品轮廓,让我知道这是一个关于未来创客空间的服务平台,为创客空间内的用户提供设备设施服务和社交服务。设备设施服务包括空间办公室的租赁,会议室的在线订、APP开锁等一条龙无人工在线操作,也就是用互联网解决一些以前需要人工进行解答、赋予权限、操作的工作,方便创业者在空间内充分利用资源,节约时间。而社交服务,主要是在入驻的创业公司之间,构建一个交流平台,不同的创业公司的员工之间可以在一起探讨某个问题,参加一个活动或聚会,甚至私下会面等等。
我对这个项目的兴趣非常浓,因为对创客空间的互联网化比较有信心,相信未来互联网是创业者必备的基础设施。问题是,如何开始呢?从购买服务器、域名备案转移等开始,再到服务器环境的搭建,php框架的选择,中间经历非常漫长的尝试过程。我的第一个星期大部分时间都是在熟悉业务,和搭建服务器环境和编程环境中度过的。
第二个星期,在确定了php框架之后,我终于开始编程。但是,实际上,由于对整个产品的细节理解不到位,对具体业务环节不熟悉,我基本上处于臆断猜测的阶段,凭着自己从PM那里获得的信息,开始了整个产品的后台架构。在T的帮助下,构建数据库结构,开始后台界面的编写等等。
然而,在这个过程中,我发现,每每写好一个功能,又不得不重新打乱写过,因为稍加了解,就发现实际需求不止这样,写的这些功能无法满足这个需要。我这个时候才意识到,我缺少一个产品经理,对这个项目的细节和业务结合在一起的进行分析的东西太少了。于是,我又回头来,重新自己编写了数据库结构文档,并且勾画业务流程图和系统结构示意图。
第三个星期,我第一次和相关业务负责人进行面对面交流,把我们传统的工作流程了解了一遍,才知道,自己很多都没有考虑进去,比如预约体验的部分,当客户过来看房体验的时候,我们应该如何跟踪、记录这些客户信息,如何在系统中对业务进行处理呢?这些都通过和负责人交流后才确定下来。这个时候我才明显感觉到,自己谱写的业务结构才慢慢符合实际,而不是自己脑海中抽象的理想结构,很多实际中的问题才被考虑进来。所以,和具体业务负责人交流,即使他们以前从来没有进行过线上操作,对我们设计系统是很有帮助的。
这个星期,我基本就是根据上周获得的这些信息,进行功能的调整和完善。
因为我仅仅获得了预约和会议室预订这两项具体业务的具体流程,所以,我目前,也就围绕这两项业务进行开发,其他的业务功能,等到后期有需要的时候,再进行扩展即可。因为我们第一期的工作,也就是这两项,不能想的太远,而久久不能做出成形的产品。
明天,可以把办公室的模块完成。完成之后,直接进入手机端界面的开发,因为PC端界面还在设计师的稿子中,所以,我必须通过手机端入手,做出一个成形的产品,否则,进度就变为不可见了。
PHP非阻塞模式
找工作的一些心得
终于可以安静的写一下这段时间的一些经历。上个星期去深圳找工作,非常幸运,已经获得了几个offer,薪资水平都在自己的预期范围内,甚至有公司给出了相对比较高的薪资,让我有些心动,但是,找工作对于刚毕业的我来说,不能光看薪资水平,而更要看潜力,所以应该写一下我的一些想法,梳理一下我未来的一些发展。
刚毕业,虽然可能某些方面的能力都已经具备了,但是实际上在面对社会型多用户多功能高并发等方面的开发中,自己还是白纸一张,还要学很多,刚参加工作,也不太可能被作为主力来用,而更多的可能是作为副手,完成一些思路明确的开发工作,为主力分担工作量。因此,我更倾向于潜力比较大的公司,特别是既有极客风格,又在业务领域有美好前景的公司,在这样的公司,自己可以一步一步看到一个明晰的发展方向。另外,有一家公司虽然给了不错的薪资,公司规模也挺大,但是我回来一想,觉得这家公司的业务已经比较成熟了,从它线上的产品来看,也基本比较完备了,在面试时,我也尝试问了一下主考官公司未来的业务扩展,从他的回答中我大概知道,未来公司也没有业务上的大举扩展,所以说如果我进了这家公司,主要要是作为现有平台的一个“螺丝钉”,对已有平台进行修复和升级,对一些小功能进行扩展,而无法经历一个产品从雏形到上线的种种过程,也就无法在这种过程中成长。所以,最终我还是希望进到另外一家前景较好,业务平台相对来说还不是太成熟的公司。
我自己的开发能力基本上还是处在“便利贴”的层次,也就是哪里拿来都可以用,也可以完成任务,但是无法做到大神般的完美,用一个词来概括,就是“半吊子”。所以,我也逐渐明确自己需要在哪些方面进行提升扩展,也是我未来在工作及业余时,必须自己学习和提升的方面:一,Linux平台下的惯用操作和优化;二,PHP的底层原理;三,MySQL的底层原理;四,PHP算法及思维扩展。在面试的时候,很多题目我只能是一知半解,这主要原因是我在平时的开发中,以实现功能为目的,而没有从底层原理出发去剖析一些更深的知识,如果再去深入学习,相信未来必定会有一个大的突破,也会慢慢从“打下手”的角色逐渐进入“主力”的行列。
人工智能“Y-N”简易记忆进化模型
什么是“人工智能”呢?说的坦白些,就是机器可以自我思考和判断,在无人类判断的情况下,可以做出正确的选择。由于人类大脑的容错空间大,同时又能区分细小的差别,所以机器很难模拟。但是最近的研究表明,机器和所有自然界生物一样,也存在进化现象,而且其进化速度比自然生物更快。所以,实际上,我们开发人工智能,从某种意义上讲,不能靠人类,而是要依靠机器本身的进化。本文就来探讨一个简单的记忆进化模型。
记忆的重要性和选择意义
一个纯然无知的人,他的所有活动,依靠的就是本能,而本能,就是人类大脑中从父辈基因里遗传的种群记忆。一个原始无知的人,不会语言和工具,不懂人际交往,不理解自然界的一切运转规律,他所面临的,仅仅是如何生存,为了更好的生存,必须开始学习,而学习的过程,实际上就是将“Yes or No”的结果存储在大脑里,以备下次在遇到同样的情况时,进行调用。
“Yes or No”是人类最大的选择,它的意义决定了人类和其他动物的区别。自然界任何生物都有自己的选择,连非生物也有自己的选择,但是人类之所以区别于其他,就是人类的这些选择被完整的记忆和传承,并形成了社会记忆,选择的内容也超过自然,一旦脱离了非自然的选择,人类的大脑就开始迅速膨胀,直到可以存储这些选择结果。
进化,等于记忆存量
人的潜意识,是人类大脑的常驻内存。一个人要具备思考的能力,一定要突破这个层面,智商和情商直接决定了他在这个社会中的层次。但是,人类并非生来就是如此的。在人类漫长的进化过程中,必须有那么一刻,突然明白,应该将选择的结果记下来,以确保未来我能够在遇到相同情况的时候获得最好的结果。存储在人类大脑中的这种行为和结果越来越大,IO越来越快,促使人类脑部的新陈代谢极速加快,几十万年的过程中,人脑的容量翻指数的上升,在这个过程中,“Yes or No”的存储量达到了一个瓶颈,当人脑无法完成存储之后,语言和文字出现,记录人类信息的载体出现,信息传播出现,最终形成了社会记忆,也就是磁盘阵列。
接下来,我们来假设机器人的记忆进化。当一个没有视觉、听觉、触觉的机器人诞生时,并不知道这个世界的存在,它所完成的一切工作,都是按照指令来进行。直到在它身上装了一个特殊的存储器,用以记录它所遇到的每一个情况的选择结果。在一个黑箱中,我们给予这个机器人一个“十”字型迷宫,并且只在北方放置一个充电器。
在起始状态下,机器人没有任何感觉,也没有任何记忆,因此会在原地乱动。这个时期,机器人会遇到很多困难,会不停的摔倒,甚至死机。但每一个情况都被它记忆下来,也就是说,当它以“弓”形行动时,会摔倒,这个结果会被记录下来,但它并不相信是因为“弓”形令它摔倒,直到这种情况发生了100次,在我们的记忆存储器中设定到了100次即可作为一种结论,这个时候,它就会确认,“弓”形会摔倒,所以它再也不会尝试“弓”形的行动方式。之后它会尝试其他形状是行动方式,如果这种方式会摔倒,就把它记录下来,再次尝试,如果连续10次都摔倒,就认定这种方式是不可行的。当然,如果某种方式是可行的,那么就再一次执行,如果永远能够执行下去,说明找到了合理的通道。于是,机器人学会了走路。通过这个阶段,机器人学会了肢体语言和触觉。我们仅仅赋予了它一个记忆存储器和100次的上限,其他任何事情都没做过。
这个时候,记忆存储器已经存满了,机器人无法再将新的学到的东西存储下来,所以它只能碰运气找到充电器,否则,只能等待断电。
我们给它换了一块更大的记忆存储器,让它开始自己寻找充电器。后来会发生什么?它已经学会走路,所以会在迷宫中乱走,直到它往北方走了100次,都找到了充电器,于是确认了充电器就再北方。但是,如果我们不换这块记忆存储器,即使它再找到1000次,仍然无法确认这一事实,因为存储器中无法记录每一次是如何选择而找到的电源。
人类之所以伟大,是有一天,突然开始自我反思,反问自己从哪里来,到哪里去。直到有一天,机器人开始反思自己时,就可能在N次尝试之后确认,需要给自己换一块更大的记忆存储器,调整确认次数,到那个时候,就再也不需要人类。
记忆存储数据表设计
关系型数据库的好处是一一对应关系,可以实现快速查找;非关系型数据库的好处是,不用考虑数据类型,存取速度快。因此,在设计时,应该进行结合。
表1 事件记录表
字段 | 类型 | 描述 |
ID | ||
event | index | Mango key 记录传感器信息 |
表2 处理结果表
字段 | 类型 | 描述 |
ID | ||
result | index | Mango key |
表3 “Yes or No”选择结果对应关系表
字段 | 类型 | 描述 |
ID | ||
Event_id | ||
choice | bool | |
Result_id |
表4 确信事件选择结果对应关系表
字段 | 类型 | 描述 |
ID | ||
Event_id | ||
choice | ||
Result_id |
记忆存储逻辑流程图
在记忆存储过程中,其实并不需要特别多特别复杂的流程。下图虽然是为机器人记忆存储设计,实际上和人类的行为选择是很相似的。
是或者否其实是一个比较抽象的概念,它的前提是,需要你以“是否要执行某操作?”这样的选择疑问句为基础的,所以当某事件发生时,需要首先将事件响应转换为选择疑问句的形式提供给机器进行选择。如何转换疑问句呢?我们不能从语义上去转换,而要从事件变量去选择,将所有的变量进行排列组合,得到所有结果,选择其中一个进行保存即可。
整理完这一切,重新上路
2010年,我大二,开始努力自学Web开发的东西。那个时候走了很多弯路,什么都学,电脑上装的软件就像一个全能工具箱。直到大三,才真正步入正轨,开始用编程赚钱,虽然不多,但养得活自己,从那时起,就没在向家里要过什么钱。或许,我这么久,真正学到的,就是依靠自己。
人不走弯路,就不知道这个世界上有一种东西叫智慧。一旦一个人开始做自己,而不是看别人怎么好,羡慕别人的外在或内在,这时,才真正有了自己的个性。每个人可以选择的有很多,如何选择,有的时候仅仅是为了让别人认为自己很牛逼,而有的时候,才真正是想做自己想做的认为有意义的事情,而后者的次数,往往少于前者。我在开始编程之后,就很少像以前一样,疯狂的参加社会活动,基本上就是宅。当我们疯狂了很久之后,开始不疯狂了,不是我们又失去了自由,而是我们找到了自己疯狂之外的价值。
三年的研究生涯,如果一定要说一些学习上的进步,那就是在写毕业论文这段时间,深入的去思考了我档案学理论根源,而其他大部分时间,我都在做跟学习毫无关系的事,虽然学校也没有要求我们不要做这些事。做学问对我来说,更简单,特别我还是年轻的时候,除了几十年的积累,我哪一点都比那些带着老花镜的落伍学者强,但是,这种东西实在太无聊了,不是我真正想要的。
未来两三年,整个社会形势会发生巨大的变化,只有不断调整自己,适应新环境,才有可能在这个操蛋的时代有立足之地,但是这又何其容易?如果以三年或四年为一个循环,我三年四年后,不知道是什么状况,但是,这又有什么可畏惧的呢?只要人还活着,总会有希望。收拾好,上路吧!