人人都能学编程

在看电影和电视剧的时候我们经常能看到,一个电脑黑客随便在键盘上敲几下就破解了别人的电脑系统进入里面盗取资料。


每当看到这样的片段就觉的黑客很牛逼,很羡慕,崇拜,幻想着自己也能有这样的技术。

 

我经常这么幻想着,所以我从小就很喜欢计算机,喜欢捣鼓各种黑科技,高考完几乎全部志愿都是填的计算机相关的专业。

 

现在我虽然没有像电影情节那样随便破解别人电脑,但是以现在的技术找工作还是挺容易的,而且工作挺快乐轻松的。


如果要问世界上什么工作最好,那么我的回答是:做你喜欢的事,感兴趣的事,那就是最好的工作了

 

很多人对编程都很感兴趣,但是苦于不知道如何去学。觉得编程很难,自己数学不好,英语不好,学不下去。 刚开始学的时候其实我也觉的很难,但是现在我告诉你们其实编程一点也不难,要不是傻子人人都能学会,关键看你有没有这个兴趣和耐心了。

 

学习一样东西最好的时刻是现在,当然有兴趣还需要一个好老师,不然再大兴趣也会被磨灭。


想要学习计算机,首先你需要认识它,不要以为你都认识它了,其实你只是认识它的皮囊而已,你只是知道它长什么样



你要了解它的心,才能和它交流,你要知道它想要什么,它才会把你当朋友

 

那么今天小猿就来做这个老师教你如何认识计算机,如何和它交流。

 

大家都知道计算机是一个机器,如何和机器打交道?

 

假如你在大街上遇到一个外国人,你想和他交流,你会怎么做?是不是应该说他能听懂的语言和他打招呼。

 

那么其实计算机也是一样,你如果想要和它交流,你就要学会一门语言,就像你要和英国人交流一样你要学习英语。


这个语言就是计算机语言,也就是计算机能处理和理解的语言,现在世界上有几百种计算机语言,常用的有C,C++,JAVA,PHP,lua等等,这些都叫做计算机编程语言。


 

而这些语言只是我们人类能学习的语言,对计算机来说是一种高级语言,实际上计算机真正能直接处理的语言是机器语言,什么是机器语言?


其实就是二进制代码,什么是二进制代码?


就是010101这样一串0和1的数字组合而已


 

为什么计算机只能处理这样的一串01组合的数字呢,原因是计算机内部使用了成千上万个微型的“通断型”电子开关进行工作:


这些开关在任何时刻要么是通电,要么是断电


或者说,该电路只有两种工作状态:通或断,所以只需要用0和1表示这两种状态。多种状态的组合即多个0和1的组合。

 

为什么我们不直接学习机器代码呢?


机器代码是一堆0和1的数字,你想想如果要你用一串0和1的数字去表示一句话或者是一个数学计算,有多困难,是不是很麻烦呢。只用0和1 去描述一件事或者去计算一个公式是很复杂的过程。所以人类就想出了用其他语言替代机器语言。

QQ截图20180724115129.png



然后再通过编译软件把高级语言翻译成机器语言,再由计算机去执行机器语言。

 

就像是你虽然学习了英语但是你的英语口语并不是很好,外国人并没有听懂你讲什么,这个时候有一个专业的英语老师过来了给你做翻译。

QQ截图20180724120224.png

 

既然是交流,那么就是双方都需要输入和输出。上面讲的是如何把我们人类所要表达的翻译成计算机能理解和处理的,那么计算机理解和处理后如果反馈给我们人类呢?


那就需要把计算机输出的内容转化为我们人类所能理解的语言,然后显示在屏幕上。


 

小猿将会在下一篇文章为您解答二进制的01代码如何转换为人类所能理解的语言。


请关注我的公众号:理想的键盘,学习更多编程知识。


2018_07_24_2158296960.png

人人都应该学点编程

周末去市图书馆逛了一下,本想去找本“人生鸡汤”看看,不知不觉就走到了计算机书架区了,真是职业毛病啊。心想都走到这里了,就看看现在有什么感兴趣的书吧!



走到编程书架旁看着那一排排编程语言的书,仿佛又回到了大学时代,感觉自己就像在学校的图书馆一样,还能感受到刚上大学时那种兴奋感。这个时候突然一个小学生打断了我的幻想,那个小学生说:我要买VB的书,我觉得VB比较实用,后面跟着他的爸爸妈妈,他爸爸说:不是应该学C语言吗?那个小男孩在书架上翻找着。我顿时来了兴趣,没想到现在这么小的小学生都开始学习编程开发了,居然还讨论着哪个语言好坏来了!这通常不是我们正规的程序猿应该讨论的问题吗?毕竟都说PHP是世界上最好的语言,虽然我不这么觉得,但是也轮不到小学生来评价啊。



我心想,现在已经是2018年了,互联网发展如此之快,小学就开始学习编程似乎并不奇怪,毕竟在大城市教育环境和孩子爸妈的教育都比较好,乔布斯曾经说过:”每个人都应该学习编程,因为它教会你思考的方式”,这样类似的话好像特朗普也说过,说明了编程在我们的生活中还是帮助挺大的,毕竟现在互联网如此普遍,以后我们的生活肯定会越来越方便化科技化,如果不学习一些如何与计算机沟通的东西还真的会被OUT掉。


      

从现在小学生就开始学习编程的趋势来看,如果我们成年人还不学习的话我相信马上就会被小学生超越了,到时候或许连小学生讨论的都是编程语言VB,C,PHP,Python这些专业词语。你一个做父母的可能都听不懂,这难道不是一种危机吗?未来的一切设备都可能是可编程的东西,现在越来越流行的是智能家居系统,买房子销售都喜欢吹他们的楼盘带智能装修,智能装修是什么?就是开发商在盖房子的时候已经想到了各种物联网智能家居的东西,把这些高科技的东西都装修到了房子里面,比如你家里的监控和门禁系统都是可以联网的,你只需要手机上装一个APP就可以直接开你家里面的门,开照明,开空调,看监控,各种你想的到和想不到的。



你可能会觉得这些好像和编程没有什么关系,是的现在是没什么很大关系,但是现在发展是这样,你想想以后会怎样呢?  你是不是发现现在的电视是越来越智能,几乎就是一台能看电视的电脑,未来很可能所有的智能家电都会设计成那样,直接互联网化,甚至没有屏幕,一个投影出来,像美国大片那样,手指随便点击几下就可以控制所有的家电。说到这里你可能还觉得好像和你会不会编程依然没有半毛钱关系,下面小猿就来说说他们到底有什么联系。



大家都知道现在手机上的APP和智能家电上的软件和系统都是编程开发出来的,那么在这个越来越讲究个性化,定制化的世界,这些功能能满足你们所有人的需求吗?每个家庭甚至是每个人对自己家的电视的要求都是不一样的。就比如有些人只喜欢看娱乐节目,有些人只需要看电视剧。然后每次看电视都是一个遥控器从头翻到尾,然后继续循环。是不是很烦?那么如果这些电视的生产商把电视做成可编程化,提供编程接口,让你自己定制你的电视,你自己写代码控制遥控器的功能,你可以让你的遥控器只循环娱乐节目,甚至是根据你的喜好自动选择一个频道给你播放,还可以根据你平时看电视的时间自动开机关机。



这些你都可以自己定制开发,我知道你心里肯定会说,这些东西生产商直接做进去不就好了,你要知道无论什么东西都不能让所有的人满意,就像你不能让所有的人都喜欢你吧,你喜欢的东西未必其他人喜欢,有些人喜欢简单,有些人喜欢科技化智能化。把功能都做进去只会让一个产品越来越臃肿,并且价格还越来越贵。现在很多软件都是可定制化的,我相信未来的硬件也一样是可定制化的(现在已经有很多),而且是可编程扩展的。只要发挥你的想象,每个人都能成为产品经理。


      

我只是举了个小例,未来会编程不只这一点好处,编程以后会是在生活上工作上的基本技能。来你想做的事,你只需要写个程序就可以帮你完成了。




欢迎关注公众号:理想的键盘,获取更多编程知识


Lua实现ECS简单框架

 ECS模式全称就是Entity-Component-System模式.

– Entity是实例,作为承载组件的载体,也是框架中维护对象的实体. 
– Component只包含数据,具备这个组件便具有这个功能. 
– System作为逻辑维护,维护对应的组件执行相关操作.

面向对象:把共同的东西抽象出来然后写在基类里面,然后不断的继承它们.

面向组件:把共同的东西抽象成一个组件,然后组合成一个实体.

虽然ECS的开发思想很早就提出来了,但是我发现没有Lua版本的一个ECS框架,其他语言版本倒是挺多的,今天在github上看到触控的 quick-cocos2d-x 的源码发现了GameObject.lua,Registry.lua,Component.lua.  

这3个文件,觉得这就是ECS的思想啊! GameObject.lua 代表了 实体也就是Entity,Component.lua代表了Component,

Registry.lua 相当于一个注册类,缓存了所有的Component.而里面的具体业务逻辑代码构成了System.

只需要把新的组件继承自Component类,实体继承自GameObject类,然后用实体的addComponent 方法添加需要的组件即可.而Component里

的 exportMethods_ 函数是把Component的里的方法导出到实体中,可以在实体对象中直接访问组件里的方法,

这是一种非常巧妙的设计,我觉的这3个文件完全可以抽出来放当我们的项目中去.


Github地址:

https://github.com/chukong/quick-cocos2d-x

rawget和rawset的作用

在Lua中有时候会遇到rawget  和 rawset 这2个函数,实际这2个函数的意思就是对表的访问和赋值 不使用元表的元方法.如下代码:

Class = {}
Class.mt = {}

function Class.New(o)
	local instance = o or {}
	setmetatable(instance,Class.mt)
	return instance
end

Class.mt.__index = function(t, key)
	return "huangyi.cc"
end

Class.mt.__newindex = function(t, key , value)
	if key == "fgreen" then
		rawset(t, key, value) --原始操作不使用元表方法
		--t.fgreen = value    --会使用元表__newindex方法
	end
end

w = Class.New({})
print(rawget(w,"fgreen")) --第一次打印输出
print(w.fgreen)
w.fgreen = "nVal"
print(w.fgreen)

输出结果:

image.png

可以看到第一次打印输出是nil 说明使用rawget获取表的值时没有去访问元表的__index 方法,而是直接访问了表w ,所以输出了nil.

而第二次打印的时候没有使用rawget方法获取表的值 则调用的了元表的__index方法去获取表的值输出了元方法的返回值.

当直接对w.fgreen赋值时,使用了元方法__newindex,元方法里面又使用了rawset 设置表的值,此时不会再去调用元方法__newindex了,所以设置成功了.

如果将rawset(t, key, value)换成t.fgreen = value的话将会造成死循环,因为t.fgreen = value的直接赋值会继续去调用元方法__newindex,造成堆栈溢出.

关于区块链

    最近的区块链和比特币很火,特别是李笑来的录音,我看了2遍,明白了很多东西,但是很多问题还是没搞懂,有人说可以看他的书,但是不要买他的币。我想有些问题还是要从他的书中才能找到答案吧!中国人就喜欢凑热闹,不管是在大街上还是在互联网还是在创业圈。我觉得不管做什么还是要有自己的一点思考,或者说是 做这件事的一个理由吧!否则你即使成功了也没有一个成功的理由,失败了也没有一个教训。

    区块链是一项技术,一个理论基础,比特币是基于区块链技术的产品。技术无罪无好坏,但是产品有,产品的理念很重要。比特币注定是一个泡沫型的产品,不会长久。

创娱点餐助手

    来创娱半年多了,一直觉的这边的包餐福利挺好的,虽然没有什么大鱼大肉,但是能让员工自己点餐的方式还是挺人性化的,菜单的种类还挺多,基本可以满足我的各种口味吧。但是有一点点瑕疵的是,公司的点餐网站似乎永远不那么人性化,公司500多号人,不要求你做的界面多好看,但是起码要满足同事们的基本需求吧,每次点餐都搞得挺麻烦的。而且界面用户体验很差。

    公司的点餐系统是网页形式的,但是页面巨丑,而且每次选择一个菜项都是一个好长好长的下拉框,而且没有随机点餐的功能,没有自动分类的功能,周一到周五的午餐和晚餐每次都要从一个长长的下拉框选择,要是有不小心刷新了网页或是关闭了就要重新开始选择。公司大群里也经常能看到有同事吐槽这个东西。于是我就想我是程序员啊,我完全可以不用他的点餐系统,自己开发一个,只要从它的内网上获取菜单数据,然后自己选择好提交都它的网站后台就行了啊!越想越兴奋,

马上就开干了。然后就有了如下点餐助手C#开发 哈哈。

QQ截图20180113213741.png

QQ截图20180113214256.png

看起来虽然简陋,但是我感觉比公司运维做的网页版好多了,起码可以帮助有选择困难的同事,随机选择自己喜欢的类型,还不必每次都去选择每天的饭菜。当然为了人性化,如果随机到自己不喜欢的饭菜还是可以自己再自主选择的,而且还加入了2种搭配方式,一开始本来是想自己用的,但是当我发给行政MM后他们都觉得很棒,索性直接发给全公司人用好了哈哈。上面还有关键字过滤功能,我会在下一个版本中完善它。

UGUI屏幕点击关闭Tips小技巧

在做MMORPG 游戏中在UI上会有很多的Tips弹窗的UI,策划的需求是点击Tips外面要关闭这个Tips那么我们首先想到的做法是,获取点击的区域或者对象判断是否点击是 tipsUI如果是则不关闭,

如果不是则关闭Tips,那么这样的做法有很多,其中一个是设置一个透明image背景,然后在这个Image上添加Button组件,当点击这个背景时关闭这个tips弹窗,当然这个背景要扩展到整个屏幕,

然后要设置成透明的这样才能不挡住其他UI。

        但是我感觉这样的方法好像多了一个几个步骤而且有点麻烦,既然我们只要一个透明带raycasts的背景而已,那么用一个空的Text组件也是一样可以实现。把字体和文字都设置为空,这样既可以不用设置透明度也可以达到一个点击屏幕的效果。


RectMask2D和Mask

最近项目中做UI,用的比较多的Scroll Rect这个组件,发现他是通过一个遮罩来显示Scroll Rect里的内容的,在UGUI中Scroll View自动创建的遮罩用的是Mask组件,但是我通过搜索发现还有

RectMask2D这个组件,然后我用上去发现效果是一样的。查了一下U3D的文档:

the limitations of RectMask2D control are:

  • It only works in 2D space    它只能工作在2D空间中

  • It will not properly mask elements that are not coplanar    它不能遮罩不在一个平面上的元素

The advantages of RectMask2D are:

  • It does not use the stencil buffer   它不会使用模板缓存

  • No extra draw calls       不会增加额外的 draw calls

  • No material changes    不会有材质的变化

  • Fast performance    速度更快的显示

是这样解释的,这简直是神器啊,比原来的Mask好用多了,但是前提是你用不到3D UI这个功能,那么如果你是做普通的2D UI 使用这个组件做遮罩是完全没有问题的而且还可以减少draw calls数量于是我测试了一下。


使用了Mask组件的Scroll View,draw calls是5


QQ截图20170910113531.png


使用了RectMask2D组件的Scroll View,draw calls是4


QQ截图20170910113654.png


使用了RectMask2D组件比Mask组件draw calls少了1个,这在移动设备中是非常重要的优化啊。