哭,哭是不是一种解压方式好的解压方式吗?最近总是会莫名其妙的想哭。。。。怎么办呢?怎么缓解呢?

11种最好的解压方式 你尝试过吗——心理健康——生活小常识
11种最好的解压方式 你尝试过吗
& 11种最好的解压方式 你尝试过吗
正文共2621字(过滤空格、图,但标点、数字占一个字)
随着社会节奏的越来越快,人的压力也如雪球般,越滚越大。压力太大可以摧毁一个人,所有在现实生活中,我们要适当得给自己降降&压&,一身轻才能很面对学习生活,下面小编推荐最好的解压,让你用健康的方式释放压力,以及十二的解压秘诀。
  1.运用言语和想象放松
通过想象,训练思维&游逛&,如&蓝天白云下,我坐在平坦绿茵的草地上&,&我舒适地泡在浴缸里,听着优美的轻音乐&,在短时间内放松、休息,恢复精力,让自己得到精神小憩,你会觉得安详、宁静与平和。
  2.支解法
请你把生活中的压力罗列出来,一、二、三、四&&你一旦写出来以后,就会惊人地发现,只要你&个个击破&,这些所谓的压力,便可以逐渐化解。
  3.想哭就哭
医学学家认为,哭能缓解压力。心理学家曾给一些成年人测验血压,然后按正常血压和高血压编成二组,分别询问他们是否哭泣过,结果87%的血压正常的人都说他们偶尔有过哭泣,而那些高血压患者却大多数回答说从不流泪。由此看来,让人类情感抒发出来要比深深埋在心里有益得多。
  4.一读解千愁
在书的世界遨游时,一切忧愁悲伤便付诸脑后,烟消云散。读书可以使一个人在潜移默化中逐渐变得心胸开阔,气量豁达,不惧压力。
  5.拥抱大树
在澳大利亚的一些公园里,每天早晨都会看到不少人拥抱大树。这是他们用来减轻心理压力的一种方法。据称:拥抱大树可以释放体内的快乐激素,令人精神爽朗。而与之对立的肾上腺素,即压抑激素则消失。
  6.运动消气
法国出现了一种新兴的行业:运动消气中心。中心均有专业教练指导,教人们如何大喊大叫,扭毛巾,打枕头,捶沙发等,做一种运动量颇大的&减压消气操&。在这些运动中心,上下左右皆铺满了海绵,任人摸爬滚打,纵横驰骋。
  7.看恐怖片
英国有专家建议,人们感到工作有压力,是源于他们对工作的责任感。此时他们需要的是鼓励,是打起精神。所以与其通过放松技巧来克服压力,倒不如激励自己去面对充满压力的情况,例如去看一场恐怖电影。
  8.嗅嗅香油
在欧洲和日本,风行一种芳香疗法。特别是一些女孩子,都为这些由芳草或其他植物提炼出的香油所醉倒。原来香油能通过嗅觉神经,刺激或平伏人类大脑边缘系统的神经细胞,对舒缓神经紧张心理压力很有效果。
  9.吃零食
吃零食的目的并不在于仅仅满足于肚子的饥饿需要,而在于对紧张的缓解和内心冲突的消除。
  10.穿上称心的旧衣服
穿上一条平时心爱的旧裤子,再套一件宽松衫,你的心理压力不知不觉就会减轻。因为穿了很久的衣服会使人回忆起某一特定时空的感受,并深深地沉浸在缅怀过去如梦般的生活眷恋中,人的情绪也为之高涨起来。
  11.养宠物益身心
心理健康欣赏
心理健康推荐
豫ICP备号-1
豫公网安备 51号今天刚好用python实现了1024,写了两篇blog,分享一下:&br&&a href=&//link.zhihu.com/?target=http%3A//legendmohe.net//%25E7%python%25E7%25BC%%4%25E6%25B8%25B8%25E6%/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&用python编写1024游戏 (1)&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//legendmohe.net//%25E7%python%25E7%25BC%%4%25E6%25B8%25B8%25E6%/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&用python编写1024游戏 (2)&/a&&br&---&br&添加了ai实现:&br&&a href=&//link.zhihu.com/?target=http%3A//legendmohe.net//%25E7%python%25E7%25BC%%4%25E6%25B8%25B8%25E6%/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&用python编写1024游戏 (3)&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//legendmohe.net//%25E7%python%25E7%25BC%%4%25E6%25B8%25B8%25E6%/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&用python编写1024游戏(4)&/a&
今天刚好用python实现了1024,写了两篇blog,分享一下:
--- 添加了ai实现:
很多人问钱的问题,至少在我这里看到的是,第一个游戏大部分关卡免费,少量关卡收钱,基本不影响游戏;第三个课程可以免费学习,或者交钱拿电子证书,或者也可以申请补助免费拿证书,详细办法可以搜一下知乎相关问题。&br&&br&————&br&大概就是这种东西吧:&br&&br&&a href=&//link.zhihu.com/?target=https%3A//codecombat.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CodeCombat - Learn how to code by playing a game&/a&&br&用编程来过关的战略类游戏&br&&figure&&img src=&https://pic2.zhimg.com/50/92b76ddbff3a82ee8cf5_b.jpg& data-rawwidth=&1304& data-rawheight=&683& class=&origin_image zh-lightbox-thumb& width=&1304& data-original=&https://pic2.zhimg.com/50/92b76ddbff3a82ee8cf5_r.jpg&&&/figure&&figure&&img src=&https://pic3.zhimg.com/50/ae09d063b23a14f52dd6b8f00df58ff2_b.jpg& data-rawwidth=&750& data-rawheight=&350& class=&origin_image zh-lightbox-thumb& width=&750& data-original=&https://pic3.zhimg.com/50/ae09d063b23a14f52dd6b8f00df58ff2_r.jpg&&&/figure&&br&&br&&a href=&//link.zhihu.com/?target=http%3A//codetank.alloyteam.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CodeTank 代码坦克&/a&&br&用编程来操纵坦克的在线对战游戏&br&&a href=&//link.zhihu.com/?target=http%3A//www.alloyteam.com/2012/08/welcome-to-codetank/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CodeTank代码坦克在线编程对战游戏——全世界Javascript程序员的游戏&/a&&br&代码坦克的介绍&br&&figure&&img src=&https://pic2.zhimg.com/50/242d80cab1db_b.jpg& data-rawwidth=&647& data-rawheight=&712& class=&origin_image zh-lightbox-thumb& width=&647& data-original=&https://pic2.zhimg.com/50/242d80cab1db_r.jpg&&&/figure&&figure&&img src=&https://pic3.zhimg.com/50/f487f4ba636909cca942f3850bee7925_b.jpg& data-rawwidth=&654& data-rawheight=&715& class=&origin_image zh-lightbox-thumb& width=&654& data-original=&https://pic3.zhimg.com/50/f487f4ba636909cca942f3850bee7925_r.jpg&&&/figure&&br&&br&评论里有人提到做游戏,那么再次推荐这个玩意:&br&Python交互程序设计入门&br&&a href=&//link.zhihu.com/?target=https%3A//www.coursera.org/course/interactivepython1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Coursera - Free Online Courses From Top Universities&/a&&br&从几乎没有编程基础开始,学习用Python做游戏的在线课程,一共是9周。&br&第一周你做出的游戏是这样的:&br&&figure&&img src=&https://pic3.zhimg.com/50/bba3d721de9deb_b.jpg& data-rawwidth=&807& data-rawheight=&459& class=&origin_image zh-lightbox-thumb& width=&807& data-original=&https://pic3.zhimg.com/50/bba3d721de9deb_r.jpg&&&/figure&几周之后则是这样的:&br&&figure&&img src=&https://pic3.zhimg.com/50/aececb76312_b.jpg& data-rawwidth=&605& data-rawheight=&404& class=&origin_image zh-lightbox-thumb& width=&605& data-original=&https://pic3.zhimg.com/50/aececb76312_r.jpg&&&/figure&这样的:&br&&figure&&img src=&https://pic1.zhimg.com/50/ab91b21a4aa_b.jpg& data-rawwidth=&786& data-rawheight=&534& class=&origin_image zh-lightbox-thumb& width=&786& data-original=&https://pic1.zhimg.com/50/ab91b21a4aa_r.jpg&&&/figure&最后的完全体是这样的:&br&&figure&&img src=&https://pic3.zhimg.com/50/9a04afcaae184f42e2adf822_b.jpg& data-rawwidth=&604& data-rawheight=&451& class=&origin_image zh-lightbox-thumb& width=&604& data-original=&https://pic3.zhimg.com/50/9a04afcaae184f42e2adf822_r.jpg&&&/figure&(最终的游戏代码大概300~400行,课程提供图片资源和简单GUI)
很多人问钱的问题,至少在我这里看到的是,第一个游戏大部分关卡免费,少量关卡收钱,基本不影响游戏;第三个课程可以免费学习,或者交钱拿电子证书,或者也可以申请补助免费拿证书,详细办法可以搜一下知乎相关问题。 ———— 大概就是这种东西吧:
更新:擦,本来只有一句话,推荐Qt,远离微软,有人追问,补充了点,有人又追问,又补充了点,然后出了趟门回来,感觉跟捅了马蜂窝一样。既然都说到微软了,那就接着展开一下。&br&&br&&b&问题的本源&/b&&br&&br&微软就是战线太长了,忙着去主导各种标准,制订各种框架,这样的话,才能更好的夹带私货,用一个你必须用的东西推进另外一个他想让你用的东西,诸如dx和windows,诸如c#和 &a href=&//link.zhihu.com/?target=http%3A//asp.net& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&asp.net&/span&&span class=&invisible&&&/span&&/a&,而又因为主导了开发者,才能进一步主导用户,而主导了用户,大量的利润便会随之到来。在整个链条中,如果消费者没得选择,开发者也没得选择时,微软就能想卖啥就卖啥,完全基业长青了。出个新东西没关系,不符合我的利益我就不支持。如果新东西很有前途,那我自己搞一套,然后再把我的开发者和用户绑架过去。&br&&br&到底哪一个方向会有前途呢?微软自己也说不清。到底哪个领域对今后的软件生态影响比较大呢?微软自己也道不明。只能朝着各种有苗头的地方去努力,以前技术领域比较窄,微软可以囊括整条产业链,编译器/IDE/框架,开发者基本可以躲在微软的圈子里不出来。后面各个技术领域蓬勃发展,分支越来越多,微软就有些力不从心了。但是战略依旧没变,任然试图去主导任何一个技术领域的标准。利用自己的影响力去忽悠各种开发者:“跟我来吧,有美好的明天”,但技术领域每天都在推陈出新,产生新的细分。为了主导更多的新领域,称霸完一个领域后,微软的重心并不是完善该领域,而是继续集中精力称霸其他新的领域。&br&&br&对于支持期的技术,微软会利用自己强大的影响力进行各种捆版整合,告诉你:“新的革命又到来了,你准备好了么?”,告诉你:“用了它之后,你就什么都不愁了”,“XXX即将停止支持”,然后各种社区中,一堆mvp前扑后拥的进行推广:“XXX大法好,MS法力无边”;书店的柜台上,瞬间多出几十本红色封面黑色封面的宝典;CSDN的主页里,各种微软 TechED, 夏令营。很多人一看,我靠,全世界都在用,我再不用是不是就要被淘汰了呀?&br&&br&完成支持后,微软进入绑架期,为了不让你用其他的东西,微软想尽一切你的需求,然后为满足你可能的一切需求,开始拼命的飙版本,来兼容各种各样的东西。很多人觉得这个东西好像挺强的,什么都能做,不用学其他了,微软就笑开花了,觉得可以绑架大家了,于是开始疯狂的用该技术夹带越来越多的私货,或者是新技术,或者是为了强迫其他人用另一个东西,为了兼容这些私货,继续飙版本,这就叫绑架。&br&&br&等到你积累了越来越多的代码,或者成熟框架后,你突然发现,原来你能做的事情,就是只能在微软给你划定的一亩三分地里面不断的耕耘。想用它开发一个微软商业上不支持的东西?没门。依赖微软越久,做出选择的成本越来越高。这时会有两种结局,第一种,微软给你指出下一个革命的方向,你别无选择,斩断原有积累投入到下一个革命中。异或,微软觉得自己在这个领域江山稳固了,竞争对手都没了,不会再出什么幺蛾子了,于是彻底开始不思进取,你用着过时的技术干着急。&br&&br&曾任微软副总裁的李开复回忆:“一个产品队伍一旦失去了假想敌,就会松懈,盖茨和鲍尔默也会撤回对它的投资和支持。比如说,微软IE击败网景之后,微软就降低了投资,致使它的浏览器多年没有再进步,直到又出现了‘火狐’这个敌人,才又开始振作。”火狐就是网景的“遗孤”。&br&&br&&b&微软的绑架&/b&&br&&br&MFC就是一个很好的例子,当年同 VCL竞争时挺上进的,VCL一死,MFC也跟着死了,现代的界面系统都是 windowless直接绘制控件了,笨重的mfc还在基于系统控件。大量的onpaint自己做,人招不到不说,工作效率奇低,熟练的mfc工程师还比不过学习Qt一个月的学生开发效率高,你说我会选啥?mfc还需要各种奇巧淫技才能达到 qt的效果,弄那些技巧的人变动,项目就傻逼了,考虑到这一点,你说我又会选啥?最近两年界面开发又开始脚本化了,你会发现 Qt有各种支持脚本(除了内嵌支持 js的 QtScript外,还有 Python的 PyQt,还有 Lua)任你选择。核心代码C++,逻辑界面python,用过脚本开发UI的人都不会想用回C++写UI,因为界面逻辑脚本化可以提高至少两倍以上的生产力。微软的策略呢?想用脚本?没门,因为我不推脚本但是我推c#,所以你想方便的写高级界面?还是跟着我去弄 .net和wpf去吧,这就叫绑架。面对绑架你别无选择,开发者微软系的代码和经验积累越多,想离选择非微软的东西成本就越高,想不被微软绑架的代价就越大。&br&&br&为啥有人愿意给 Qt脚本化而不愿意给微软的界面系统脚本化呢?并不是微软的技术就比不过Qt,而是大家唾弃微软的臭脾气,外加Qt是开源的,为它实现脚本各种方便。这里并不是说开源的东西就一定比微软的东西好,微软有很多领先的技术甩开源几条街,主要问题在于微软的封闭性。所以我的论点并不是一定要用开源,而是建议大家有选择的余地下,选择非微软技术,比如qt, flash这种。&br&&br&&b&死也要主导行业标准&/b&&br&&br&为了引导行业标准,微软很多设计的很好的东西,各种音视频格式,还有最近的 HD Photo图片格式,比 jpg2000 和google的webp好多了。但是很多人由于微软的封闭不买微软的帐,很多框架和软件都直接支持webp了,也没几个人支持wdp,在这种情况下,我宁肯选择次一等级的 webp。&br&&br&微软的出过很多标准性的东西,比如wmv, wma格式,当年挺先进的,微软也天天忽悠人去用这两个格式,但是由于封闭,最终失去支持,大家选择了更加开放的方案来代替,微软也就不思进取了,最终视频领域 现在是 h.264/265,音频领域是 he-aac v2。&br&&br&微软又试图代替 pdf,引领该领域的标准,然后自己出了一个 xps。论技术,确实高于 pdf很多,但是没人用呀,没软件支持呀,连打印机都只支持扫描成pdf格式。所以我选择 pdf并不是因为 pdf技术比微软强,而是因为它不是微软的。而且我估计个两年出个 pdf2,xps也就跟 wmv一样进棺材了。&br&&br&再比如 SilverLight,微软在没有太大把握的情况下硬推这个东西,就是因为怕c#由于满足不了RIA使得C#开发的开发者流失到微软以外去,为此 .Net还逼迫大家升了几个版本。可惜,大家都知道的,于是微软自己对它的支持都少了很多。&br&&br&你说微软技术弱么?不弱。那为啥这些明显乱七八糟的东西微软都要硬撑着试图主导行业标准但是最终又主导不了呢?那是因为我们先前提到的微软战略,从几十年前到现在都从来没有变过,然而时代变了。&br&&br&&b&Win32 API&/b&&br&&br&Win32 是系统层最稳定的接口,一切功能的基础。这么基础的东西,微软该化大力气持续发展对不对嘛?非也,随便举两个例子你就会发现其实它已经落后世界很多了。微软是任性的,觉得我提供的开发模型可以解决一切问题,为什么要参考其他操作系统改进呢?即便其他操作系统提供的功能很好,我也要给你挑挑刺。而按照微软一贯的规律,系统 API领域,我完全控制了,那么我改进的动力也就不那么强了,庶民们岂能妄自议论 Win32 API,更别说想提交改动 patch给我了。&br&&br&线程同步:如果你写线程同步,你会发现 Win32 API缺很多关键的东西比如:条件变量,读写锁,这两个最基本的能够组合成其他任何同步模型的东西,微软直到 Vista的年代才提供支持(msdn Condition Variable),这就意味着,你如果用了,你将面临很难在 xp下跑的情况。你问微软 xp怎么办,微软说用 event去 wait嘛。你就奇怪了,event这么弱智的东西能代替条件变量么,为啥不再xp年代就支持了?&br&&br&单次初始化:pthread_once,没错,windows下面由于缺少这个东西,你再做一个全局变量供你的接口访问时,你需要保证该变量只被初始化一次。即便多线程同时调用访问该变量的接口,也不会出现两次初始化的情况,pthread_once就是做这个事情的。直接把代码写成:if (inited == false) { init(); inited =} 线程又不安全,外面加一个 CriticalSection,那你又需要在更前面去 Init这个 CriticalSection,还要保证不会发生多次 Init,问题还是没解决。于是很多人在 Windows下的解决方案是,在全局变量声明一个类的静态实例,这样 main()之前,那个类的构造函数能够提前被调用,进而又引入了新的问题,及多个全局实例又会存在谁先谁后被构造的问题,你又得用恶心的 #pragma宏来解决,最后初始化代码一团乱麻。而如果微软提供 pthread_once类似方法,那或许这一切都会变的很清爽。&br&&br&网络接口:用过 winsock接口的人都觉得简陋,你想实现高性能的网络服务,需要控制 TCP的大量细节参数,比如 TCP_NOPUSH, TCP_CORK, 还有 QUICKACK这些控制调整 TCP面向流量优化或者面向流速进行化的基本功能,winsock上看都看不到。更别说 Google的 TCP速率优化(Kernel 3.2.12收录的 Google patch)等现代功能了。即便是对比最基本最传统的 posix套接字,winsock的行为也是错乱的,比如 REUSEADDR,再比如 Win32下你监听一个 UDP端口,给远端发送 UDP数据包,如果远端没有监听该UDP端口,那么你服务端收到 icmp: port unreachable后,那个udp socket就彻底被 reset了,后续什么数据都读不进来,持续给你报 10054,搞笑吧。除非你创建udp套接字时做一大堆 *windows独有的* 专门的设置,否则vista之前,你都会被 10054。vista之前,默认情况下,客户端如果拒绝收服务端的 udp包的话,服务端的 udp套接字就用不了了,这是不是在搞笑么?还有各种基础功能限制,比如:缺乏poll支持(强迫你用iocp代替),select最多64个fd,没有 socketpair。当然,没有这些也可以写网络应用,但写惯 unix下的网络代码突然来 win下写,就会觉得这真是个玩具呀。&br&&br&TLS:TLS有数量限制也不管了,但是线程本地存储这个东西是需要 destructor的,即我创建了一个本地存储来存一个对象,我可以设置一个 destructor函数指针,在线程退出时,这个函数会被自动调用到。比如你想实现一个 per-thread cache(比如类jemalloc的 arena),线程退出时能够被自动析构,这个最基本操作在 Win下却可以把你别扭死,原生TLS API没有这个支持,你又不想所有线程退出都要强迫使用者调用一下 destructor,那么你开一个线程监听所有线程?还是怎么招?看看 boost和 jemalloc这些在 win下的 destructor实现,你就会发现恶心的要死,就像要在一块工整的电路板上,焊接一根非常碍眼的飞线一样。&br&&br&GDI/GDI+: GDI是牛逼的,出生早又承当了 GUI的基础工作,毕竟那么多年了,做成这样是无可厚非的。但是XP年代的 GDI+一出生就落后于时代。比同期的同一个级别的开源项目 Cairo(gtk后端,wine用来模拟gdi/gdi+的后端,webkit/mono后端)和 Quartz(OS X图形后端)来,GDI+除了速度卡外,图像质量差,功能简陋,不支持抗锯齿,对GDI的字体效果也并没有质的改进。所以 Windows下的应用软件,一直因为字体和图像质量受到诟病。直到后面的 Direct2D出来希望改进这个局面,也已经是好多年以后的事情了。大量兼容 xp的程序还在跑在 GDI/GDI+上。&br&&br&( 问题有很多,以下省略若干字)&br&&br&按微软的能力,想改进这些基础接口,应该不是难事。但基础接口的长期滞后,折射出的是该公司全胜时期的傲慢。&br&&br&&b&统治与分治&/b&&br&&br&微软的接口设计向来是缺乏美感的,喜欢复杂化,喜欢什么东西都搅合在一起。什么叫做大一统?就是什么都能做,貌似很强大,一个东西能做的事情很多,开始是好的,但是随着时间的推移,耦合度高,各种盘根错节,一旦其中一个设计很 “巧妙”的东西过时了,那所有依赖它的东西将面临死亡。什么叫做分治?就是保证简单性和可拆分性,每个系统专心做好一件事情。一个不行,换掉即可,整个解决方案是由若干全部可以替换的子模块组成的,这叫分治。&br&&br&Windows技术栈就是一个典型的大一统设计,他有很多很巧妙,依赖性很强的东西。比如,“一切都是窗口”,这个思想,从设计上来说就是有问题的。举个简单例子,WSAAsynSelect 用过的人都知道,这是一个网络接口,用来判断哪个套接字上有事件。但是却又要传一个窗口句柄过去,让窗口来接受网络事件,这就是一个很搞笑的例子。微软为什么这么设计呢?因为应用程序本身有一个消息循环了,就是窗口消息循环,但是如果处理网络的应用程序使用类似 unix poll的方法,去等待消息的话,窗口消息就得不到处理了。如果把poll放到一个线程里的话,那UI线程要找网络线程做点事情,那网络线程在 poll的等待周期中,如果没有新的网络数据过来,可能短时间内没办法理会 UI线程的请求。于是微软的解决方案,就是让网络层的事件合并到 UI的窗口事件中,这样就比较方便了,全部在窗口消息队列,你要把UI和网络放到一个线程也可以,两个线程也罢。这样把两个风马牛不相及的事情搅在了一起的:“巧妙” 设计在微软的技术栈里数不胜数。&br&&br&合理的处理方法应该是啥?应该是继续使用 Poll,每次 poll可以设一个比较短的时间,并且可以被外面线程唤醒,这样就不会出现之前的问题了,两件事情不会搅在一起,这就叫可拆分性。结果呢,不关网络,大量的其他东西都和窗口搅起来了,等到 Windows程序要移植的时候,就会变得万分痛苦。有人说不是有 IOCP么?看看有多少一流的服务器支持 iocp?再说java可以把所有不同操作系统的异步事件模型封装成NIO,对 Windows对的 iocp却提供单独的接口,而且直到 7.0以后才有,微软总喜欢和全人类反着来。&br&&br&缺乏审美的设计,才会导致 Win32 API被 GUI所束缚这样一种结果。这在其他系统对比来说,这时听都没听过的事情。这是设计上的偶合,还有商业上利益的选择。比如网页开发,C# 和 &a href=&//link.zhihu.com/?target=http%3A//asp.net& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&asp.net&/span&&span class=&invisible&&&/span&&/a&绑定太紧,&a href=&//link.zhihu.com/?target=http%3A//asp.net& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&asp.net&/span&&span class=&invisible&&&/span&&/a&和 iis绑定太紧,iis和 windows又绑定太紧。微软的东西才出来都是先进的,可封闭的微软不愿意同外面合作。你要用我先进的东西,你就一个系列都要用。最终全部都搅在一起了,风险是相当大的,系统就像一个吞噬了各种化学物的怪兽一般,蹒跚前行。&br&&br&而所谓简单性和可拆分性的东西,是四处皆可替换的东西。比如你做 web开发,你选一门语言,python,语言就做好语言的事情。外部的网络框架,可以用 django,flask, web.py等等,接口可以用 fastcg / cgi / wsgi / uwsgi / apache_mod, 而外部的服务器,可以用 apache, nginx, lighthttpd。清晰的被分成:语言层、框架层、协议层、服务层 四个不同的层次,每个层次若干备选方案,互相兼容,web.py过时了,我换 flask,apache过时了,我换nginx。每个产品都专注做好自己的事情,并前后适配其他层次的方案,python出问题了,我换 ruby,换php,协议任然用 apache_mod或者 fastcgi。这就是分治,具备美感的设计。&br&&br&这样的情况在微软的技术体系里很难出现,这些技术运行到windows下水土不服不说,微软自己就不让你选:你要写asp .net,那语言你就用 c#(vb比较小众),用了&a href=&//link.zhihu.com/?target=http%3A//asp.net& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&asp.net&/span&&span class=&invisible&&&/span&&/a&你就要用iis,而iis只能跑在 windows下。外部的人很难兼容进来,本来微软就不太愿意支持其他技术。那么好,一开始可能领先,但是随着时间推移,这么长的链条中间一环出问题,可能会导致其他的跟着他一起被人抛弃。&br&&br&微软一方面出于商业考虑,生怕自己技术链中哪个环节被人替换,一方面有些接口设计充满耦合,考虑不周,导致后面大量的主动升级和被动升级,什么 ocx, com, atl, ole,dx1-7类似的东西都可以搞出那么多来折腾人,系统内核 GUI,网络、多媒体,大量的 API偶合在一起。最终简单的一个 Office和 Windows一样臃肿丑陋,这就叫缺乏美感的设计。&br&&br&&b&C#&/b&&br&&br&C#是一门简洁优雅的好语言,是微软中比较少见有品味的设计,这是因为 C#之父 Anders就是来源于微软之外的 Borland。Anders 早年为 Borland 设计的 Turbo Pascal 和 Delphi 就以编译速度快,使用简单和功能强大受到大众的喜爱,所以在设计 C# 时融入了很多早年的审美观。C#语言层面上胜过 java不少。我经常边用边骂 java到9到10了,也没想着好好的学学 C# 的一些特性。Java 这么多年连个 get/set 都不抄一下,连个unsigned都不肯给我用用。用 C#写代码比 java流畅不少,但应用范围太窄呀,我没办法还得接着用 java呀,应用范围广呀。我用 java写的程序随便运行在几乎任何平台上,大量最新的开源成果可以直接应用。可怜的C#却被微软画了一个圈,死死的呆在圈里出不来。其实大家都是欢迎 C#的,不然也不会有 mono这个项目了,但 mono运行效率比 jvm低不少,比原生的 .Net运行时低很多,库也不全,实在难以承当大任。&br&&br&除了部分人专门从事 C#的工作外,现在互联网企业,几乎很难看得到 C#的身影:做移动应用,用原生的 java和 objc。做服务端用 C++/java/各种动态脚本,做页面用 Js 页游用 Flash。做PC游戏用C++/脚本,没C#什么事情。移动游戏主要也在使用 C++/脚本(unity只是众多游戏开发引擎中一个单例未来是否被代替未知,XNA就是个玩具)。唯一只有微软的老本行PC桌面应用,没错,是C#,但是现在也面临诸多挑战: CEF(Chromium Embedded Framework)用js直接写Windows本地应用,如网易云音乐用CEF效果拔群;Qt系列+脚本(越来越多互联网公司在用,如Wps);自己C++UI库/脚本(例子太多了)。这些方案你或多或少都能挑出些问题来,但不可否认的是她们正从各个方向蚕食 C#的传统地盘。你可能说C#在客户端能做很多非 UI的事情(比数据库和网络还有图像),但 CEF/Qt 这些播放点流媒体、访问下网络、弄下图像或者请求下数据库同样很简单。现在 GUI开发的脚本化进程正在席卷各种桌面开发方案, js等脚本运行速度越来越快,C#速度上并不能体现出数量级的优势,而且基于泛型的脚本语言开发效率比原来高很多,同时这些解决方案全是跨平台的。而整个进程中 C# 被排除在外了,这才是 C#真正危机的地方。&br&&br&&b&DirectX&/b&&br&&br&有人奇怪我为何喜欢 OpenGL,话说白了只有一个理由,它是开放的而且它不是微软的。如今很多人会说你看 d3d 接口不错,兼容性高,CPU占用低而且画面好。没错,但记心好点的同志们把时间拉长一点,Win95时代微软强推 DirectX而封锁 OpenGL很多系统调用的事情各位还记得到吧?那各位还记得到 DX才出来时烂成什么样子么?当时业内骂声一片,很多人看了眼接口就扔了,直到 DX5出来的时候,你稍不留神,还会把整个屏幕画花了,或者弄死机了。当年 OpenGL领先 DX不是一个量级。直到 DX8出来了,才算完善了一些。微软为了商业利益,把整个行业拖后了数年之久。直到2006年,很多 3A大作还是以 OpenGL为图形底层,不鸟微软的 D3D。&br&&br&微软的技术架构,向来不太优雅,耦合度又高。Dx7以前,DirectDraw的表面和 D3D设备还有纹理搅在一起,DSound的坐标系统又可以和 D3D的坐标系统搅在一起。大量的数据结构被定义出来,一个矢量一个矩阵还要单独定义一下,不准我跨平台库用自己的定义么?你就不能用个数组么?你强大是强大,但是你耦合度实在太高了。一个环节更新,所有环节被迫更新,然后就飙版本的原因之一。DirectX的设计就是没有品味的,如果按照简单性和可拆分性的思路来重新考虑,Dx软件包中,应该隔的比较开才行,能不定义的对象和结构体,尽量不定义,用C原始的类型或者数组来接口,这样不会妨碍我外面灵活使用。然后游戏开发者靠一门胶水语言把这些独立模块根据需要粘合在一起,这样的方式是不是更清爽一些呀?&br&&br&开放的东西能自我适应性,自我修正。Real Networks估计很多人还没忘记,当年的他开发的 RM / RMVB视频格式,因为压缩比高,同信噪比下码率能有更低的码率,画面质量更好,而赢得了广泛的支持。但是 RM / RMVB却是一个封闭的视频格式,虽然领先了业界数年之久,但是数年后即被开放的 H264所代替,H264虽然一开始接受度不高,但是数以万计的人在帮他完善。学院派今天发研究出一种更有效的宏块搜索方式,不出两个月工程界就跟进了。今天有人发现一个运动估计的改进,明天有人实现个更低延迟的缓存管理,或者提升下错误恢复能力。免费的 x264不论从延迟,性能,画质,码率都直接秒杀很多商业公司的编码器,ffmpeg又可以轻易的播放h.264视频。最终 Real Networks抱着它的 rm/rmvb一起进了坟墓,死前还不忘叫一句它正在开发 rmvb2,超越 h.265标准的编码格式,业内嗤之以鼻。视频领域的玩法已经变了,H.264通过不断发展,最终颠覆了RMVB的商业模式,这就是一项技术自我适应,自我修正的例子。&br&&br&今天的 D3D就像当年的 RMVB,就算他用商业手段狠狠恶心了 OpenGL一把,导致后面 OGL数年发展不顺,但是老话说得好:理胜力为常,力胜理为变;一时之强弱在力,千古之胜负在理。随着 OpenGL新标准的不断完善,虽然暂时不能彻底抛弃 DX,但封闭的 Dx必然会随着微软 Windows 逐渐边缘化,这就叫得道多助失道寡助。&br&&br&&b&全世界玩一套,微软自己玩一套&/b&&br&&br&还是因为微软最初的战略没有改变,导致全世界一套,微软自己玩一套;微软看不起开源界,开源界也不理微软。再次强调,并不是只有开源才好,而是这么多家公司里,只有微软一家试图自己从头到尾建立一套完整的技术体系,只有微软一家采取如此封闭的策略。然而早年微软可以罩住整条产业链,并且活的很爽,但是现在大量基于开源界的最新成果都和微软技术栈水土不服。&br&&br&所以开发者会面临:依赖微软和不依赖微软两种选择。依赖微软,很容易和外界形成隔离。而不依赖微软,你得到的是满天下的选择。前者强调高度集成统一,后者强调可拆分替换。然而,世界潮流,浩浩荡荡,顺之者昌逆之者亡。&br&&br&&b&成也萧何,败也萧何&/b&&br&&br&早年的微软,象一个潜伏在丛林里的猎手,利用自己操作系统的优势地位,寻找着产业链最高端的用户需求。一旦一项技术可以满足用户某种根本需要,微软就不惜牺牲眼前的现金流,来换取未来的行业领导地位和盈利。或快速收购,或恶意打压,或自家出一套,任何一个领域只要有新的东西出现,微软就试图去控制它,并绑架获出钱养活接受了微软标准的软件开发商让他们支持,出钱扶持低端的开发者让他们学习微软标准,于是巨大的利润,随之而来。&br&&br&这样的战略,使微软茁壮成长,并成为接二连三的行业标准拥有者。然而这样的战略有一个致命的BUG,就是标准必须是与时俱进的,微软需要不断调整已有标准,否则越来越多的标准就会成为束缚住微软的一条条绳索,越来越多的兼容性问题象一座座大山一样压得微软喘不过气来。掌握的标准越多,微软越难改变,随着时间的推移,将会被微软体系外更加迎合用户偏好的竞争者们所取代。&br&&br&有人说:“微软错过了移动化浪潮,错过了云计算,是因为鲍尔默的误判。智者千虑必有一失,再牛逼的人也有判断失误的地方”。但是通过上面的分析,我们可以看出这种说法的荒谬性,我们需要清醒的指出,就算没有鲍尔默,微软即便赶上了云计算,他也会错过雾计算;他即便赶上了雾计算,他照样会错过烟计算。&br&&br&这样的战略,使微软早年站到了时代的风口浪尖,又使如今的微软,变得越来越与时代背道而驰,不是微软不想融合,而是融合的成本越来越高。世异则事异,事异则备变,理解了微软的核心战略,就不难理解微软为什么会去弄什么 xps, silverlight;理解了微软的战略,就能理解为何微软的精力总是在制定新标准,而不是改进老标准了;理解了微软战略,就不难理解为何进入2000年以后,微软总是昏招迭出了。&br&&br&病在肌肤,还可以医治,病在肺腑,人就危险了。沿袭了那么多年的战略,成就了微软和他的下游开发商,也害了微软,让微软想改变都改变不了。就像一辆陆地上上装甲车,装甲越厚越坚固,然而现在要到水里开战了,所有装甲一夜之间全成了负担,要寻求救赎,除非把自己从头到尾全拆了才行。进入2009年后,看到当年一致支持自己标准的下游开发商们,粉粉判离微软转投敌营时,微软深刻的意识到,老天已经再也不像原来一样眷顾微软了,这真可谓是:成也萧何,败也萧何!&br&&br&&b&微软的选择&/b&&br&&br&人什么时候会感觉到压力?就是拥有一个东西,但是看着这个东西一天天的减少,越努力抓住他,却又越抓流失的越快,改变意味着放弃,等待意味着死亡。在这样的压力下,微软昏招迭出,这并不能怪微软高管愚昧,也不能说微软运气差,而是自从步入 2000年以后,沿袭了几十年的一家统治世界的战略与时代变得格格不如了。早年的成功让微软无视各种问题,继续靠惯性又活了15年,错过了自我救赎的最佳时机。&br&&br&核心战略出问题,不是一朝一夕的决策对错,很多人还不愿意承认,认为换了鲍尔默就能解决,认为开源 .Net,就能救 C#,就能救微软,其实这是一个天真的想法。微软战略从头到尾就没变过,开源其实相当于承认先前战略是失败的,可它却又没有提出一套新的思路和新的战略。事实上早在2000年时微软就进入了战略迷茫期,所以东一榔头西一棒子,没有重点,缺乏主题。虽然如此,还是能靠惯性继续生存,但是自我否定之后,新战略是什么呢?战略层的自我否定会极大的伤害企业向心力,让微软在未来变得更加艰难,同时又没有确立能够经得住实践验证的新战略,这又会使整个企业变得比原来更加迷茫。&br&&br&但微软能改变么?不能。微软没有办法提出一套和原来战略不兼容的新战略,除非完全把自己和多年经营的生态链砸碎。15年前的最佳改变期被其错过后,如今再怎么变都只能在原有战略框架下寻求小改变,时代的巨流,象一股巨大的引力场,吸引着身躯庞大的微软,无可奈何的掉进自己挖的坑里。&br&&br&&b&无可奈何的结局&/b&&br&&br&直接送货上门发达了,便利店就萧条了。网上购物兴起了,实体零售业也就死亡了。这就叫做 “新经济体” 代替老经济体。判断一个经济体是否衰落,看的从来不是它银行里还有多少钱,而是看它的商业模式是不是还成立。如今的微软,就是一个核心商业模式被颠覆了的企业。这不是开源能够救得了的,更不是盖茨复出能够救得了的。&br&&br&听到微软开源,让我想起之前 Sun公司 Solaris开源为 Open Solaris,希望用开源来挽救自己的颓势,没多久它就倒闭了。如今一项根本技术,比如操作系统,已经很难被一家公司所垄断。商业模式一旦被颠覆了,开源也不能成为救命稻草。&br&&br&事物强弱变换,新旧更替,本来就是自然界的基本规律。盖茨是一个聪明人,看到了未来的局面,知道什么叫月满则亏,水盈则溢,在微软最鼎盛的时候功成身退,高风亮节的做起了慈善,将最苦的差事留给了鲍尔默。所以,聪明的盖茨也是不会复出的,所以,其实我挺同情老鲍的。&br&&br&&b&结尾故事&/b&&br&&br&一开始就没想喷微软,我不是一个极端的人,一开始只是回答问题,建议题主用 Qt,远离微软的技术。但是完蛋了,一堆人上来围攻,那我真得正儿八经的把微软这事情说的清楚点才行了,否则我变成误导题主了。&br&&br&其实世界是欢迎微软改变的,我们这些从小学电脑就用着盗版微软系统的人,对微软也还是有感情的。但是微软这次能否迎来新生,还得看微软自己,我们是帮不了他的。&br&&br&最后,给大家分享个小故事:&br&&figure&&img src=&https://pic3.zhimg.com/50/a4e6e0fd43aa_b.jpg& data-rawwidth=&268& data-rawheight=&329& class=&content_image& width=&268&&&/figure&&br&&blockquote&尼古拉·特斯拉(Nikola Tesla,1856年~1943年),被西方科学界的精英人物誉为是唯一堪比达·芬奇并超越爱因斯坦的伟大科学家,是人类有史以来最伟大的天才、发明创造的巨匠,但由于他身上同时也具有某种神秘甚至超自然的特质,也有人称他为神秘怪客或超人。是他发明和创造了交流电系统,对现代世界工业产生了深远影响。特斯拉引起的革命不仅限于电力工程,也涉及其他领域。他在科学和工程学领域取得了大约1000项发明。&/blockquote&&br&尼古拉·特斯拉,交流电的发明者,当年毅然选择放弃交流电专利带给他的暴利,将交流电公诸于众,从此交流电变成了一项免费的发明。因为他觉得,交流电这么基本的东西,是属于全人类的。如果当年特斯拉选择不开放交流电专利,那估计我们今天的社会,都得倒退一百年。&br&&br&一百年后的特斯拉汽车公司,在
Elon Musk 的领导下将自己领先世界的电动车发动机专利向世界开放,同样也是觉得电池车这种东西,是应该属于全人类的。而公司名称选作 “特斯拉” 也代表着向一百年前的 尼古拉·特斯拉致敬。
更新:擦,本来只有一句话,推荐Qt,远离微软,有人追问,补充了点,有人又追问,又补充了点,然后出了趟门回来,感觉跟捅了马蜂窝一样。既然都说到微软了,那就接着展开一下。 问题的本源 微软就是战线太长了,忙着去主导各种标准,制订各种框架,这样的话…
&p&就我在&b&工程领域&/b&内的见闻,随便说几句&br&&br&1. &br&Matlab比C的最直接优点在于,matlab代码不需要编译,省下你无数debug的时间。只要你果真写过“hello world”以外的代码,自然明白这句话的含义&br&&br&&br&2. &br&为什么我要强调&b&工程领域&/b&,因为matlab这玩意儿就是为工程师设计的,不是为程序员设计的。工程师对编程的需求,和程序员对编程的需求,其实是不一样的。&br&&u&对程序员来说,代码不仅是工具,更是产品&/u&,所以喜欢关注代码本身。&br&&u&但对工程师来说,工具就真心只能是工具&/u&,用起来方便才是王道,至于他的工作原理是不是优雅,对不起我不关心啊。&br&&br&比如变量不需要声明,不需要检测类型。计算机科班出身的人会和你说这是多么多么的大忌,但实际使用中便利是很多的,谁用谁知道。&br&&br&做个直观的比较,两种语言:一种10小时编写,1小时运行;另一种1小时编写,10小时运行。&br&程序员倾向第一种,无可厚非,因为代码的重复使用率极高,先劳而后逸是常态。比如网站,代码写完了挑战才刚刚开始。&br&但工程师不是,我建一个模型,重要的是设计过程,重要的是这个模型的物理意义。设计完了,一个模型跑几天几夜根本不是事儿,我回家睡觉就是了。等到结果出来,以后这个模型再也不碰了也无所谓。所以我在乎的是设计过程,人力成本比cpu运行成本高太多。&br&&br&正如楼下的 &a href=&http://www.zhihu.com/people/df4deb9232dab1f6f8da0& class=&internal&&@张抗抗&/a& 朋友所说:&br&&/p&&blockquote&Matlab追求的是解决问题本身的简洁&br&当你还在关注“术”或“形”上的东西的时候,说明你还没打算解决什么基本问题&/blockquote&&br&&br&3.&br&为什么matlab在工程行业内受欢迎,因为其既是科学计算,又是程序语言,还是图形设计软件。。。互相之间还无缝兼容,所以才强大。核心功能上确实有一些强力的竞争对手,但如果分散到各个专业领域,尤其是那些分开来卖的toolbox,就未必能找到合格的替代品了。&br&不喜欢Matlab的人,认为某某工具比Matlab好的人,&b&因为你们只需要使用那一种工具&/b&。所以尽管挑那一个用就是了呗。&br&&br&matlab还有许多为了大型建模及实体模型而服务的功能,比如Code Generation, Simulink Target, Real Time Workshop等等,恐怕是学生党未必会接触到的东西。所以学生党依据日常做作业的经验而给出的评价,我认为不全面。再说了,高校购买的student version本就不是全套功能。。。&br&&br&我换个说法好了:&u&如果对你来说matlab只是一种程序语言的话,那对不起,这东西确实不适合你用。&/u&&br&换个更简单的说法:&u&如果你用matlab而从未点开过simulink的话,那你也不用和我争了,我懒得和你争。&/u&&br&&br&如果有人说:我觉得自行车比坦克车好用,因为轻便、节能、环保。&br&请问我该如何回答他呢?&br&&br&&br&4.&br&再说个中国用户普遍体会不到的优点:售后服务。&br&正版matlab包含tech support,24小时电话伺候,无论是有bug还是自己不会用,神马问题都可以问。个人用户不觉得什么,对企业用户来说有售后没售后是完全不同的概念。&br&&br&&b&举一个&/b&&b&实际&/b&&b&工作中遇到的例子:&/b&&br&你觉得python免费好用,各种开源的library也应有尽有,你觉得碉堡了,花钱的matlab简直就是垃圾。&br&然后你写了个程序,但是结果就是算不对。这就屌了,你不得不花好几天的时间去debug。最痛苦的不是bug,而是你始终怀疑这个bug不是你自己的,是免费开源代码自身的漏洞——我这里指的不是python的漏洞,而是第三方工具包的作者可能自己犯错了&br&经过了一个星期的努力,挣扎吧,在血和暗的深渊里,你终于确定了是代码自身的问题。&br&这时候就更屌了,人家是免费软件啊,是开源软件啊,谁有空来给你负责啊?你又不会自己重写library,只好到各种技术论坛上去求助。先不说别人未必愿意搭理你,就算愿意,可是你才是专家啊,你干的活别人不懂啊,所以人家也没办法帮你啊。就这样又过了一个星期。&br&然后你的工作这样一卡就卡了两个星期,也不知道什么时候能够解决。python是免费的是吗?可是美国码农时薪40刀/时,两个星期的人力成本就足够你买matlab了,还有找零&br&&br&5.&br&程序员逼格太高,跟你谈算法谈架构,但是对不起啊,我们的侧重点不一样啊。&br&好比一个医生说青龙偃月刀不适合做手术,所以这玩意儿弱爆了。那没办法,什么事都是你说了算,你赢了行吗?&br&过去有人提醒我不要在知乎上和程序员对喷,如今我是服了。世界上不是只有程序员一种工作,请你睁开眼睛看看别人的世界&br&&br&再逐条说几个细节:&br&&br&矩阵表达,据我所知这是matlab的强项,也是创业初期matlab能够在一堆科学计算中脱颖而出的关键。所以这一条我实在不知道你的喷点在哪里,请阐明细节&br&&br&说matlab的代码“丑陋”,“不优雅”。这就真没法说了,请先定义优雅。另外你觉得C比java好看吗?法语比日语优雅吗?还是那句话,光说这些主观感觉的我实在无法回答&br&&br&——————————————————————————&br&我真是服了一些喷子了&br&我这帖一没强买强卖,二没贬低别家,我连横向比较都尽量减少了,单纯分享一下自己的使用体验而已。就这样还能有人喷?还让不让人说话了?知乎是你家开的?&br&工具就是工具,通过贬低别人的工具来彰显自己水平的人,我真是开眼界了,水平真是惊世骇俗啊。&br&&br&有不同意见的我欢迎交流,至于满嘴喷粪的我劝你三思,这毕竟是我的地盘,到时候你辛苦半天喷出一大坨,我点点鼠标就给删了。你说到底是谁比较酸爽呢?
就我在工程领域内的见闻,随便说几句 1. Matlab比C的最直接优点在于,matlab代码不需要编译,省下你无数debug的时间。只要你果真写过“hello world”以外的代码,自然明白这句话的含义 2. 为什么我要强调工程领域,因为matlab这玩意儿就是为工程师设计的,…
先简单的分两种情况:&br&一、&b&有编程基础,或者科班出身的,直接上吧&/b&。&b&强烈推荐郭霖老师的《第一行代码-Android》&/b&&br&二、没编程基础的,先入门java,如果天天都有比较多的空闲时间的话,这个入门时间要在2周完成,如果没有的话,1个月内完成吧,&b&不要让拖延耽搁你的激情&/b&。&br&如果你准备好了进军Android:&br&
不管你什么时候开始学习Android,&b&请使用Android Studio&/b&,首现改主题,然后去网上搜一下常用的&b&20个快捷键截图放在电脑桌面上&/b&!&br&如果是&b&色彩盲,请自行收藏这个网站&/b&:&a href=&//link.zhihu.com/?target=http%3A//www.materialpalette.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Material Design Color Palette Generator&/a&&br&&b&所有书上的UI部分扫一遍就行了&/b&,我相信现在还没有书按material design标准讲解。&br&&b&从一开始起就严格按照material design写&/b&,&a href=&//link.zhihu.com/?target=http%3A//design.1sters.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Material Design&/a&我想你一开始学习的时候身边是没设计师的吧,但是按照标准,你不需要设计师:)&br&&b&不要自定义一堆padding margin&/b&,但你需要边框,边距的时候,请看看&b&?android:attr/&/b&里面有木有你需求的(由于android studio强大的补全功能,你一般只需打几个关键词就有提示了),比如你需要给一个ImageButton加点击效果,&b&不要傻不拉几的去写一个selector了&/b&,你只需要输入 item select这些关键词,自动补全就会给你提示了。&br&&b&不要定义&/b&一大堆乱七八糟的&b&字体大小&/b&了,materail design上的几种基本字体大小可以满足你!&br&再也&b&不要使用ListView了,改成RecycleView吧&/b&!&br&再也&b&不要寻找第三方下拉刷新控件了,SwipeRefreshLayout&/b&肯定符合你的要求(不信你看,知乎Android客户端都是用的这个(●ˇ?ˇ●))。&br&再也&b&不要使用第三方侧滑栏了,DrawerLayout能满足你!&/b&&br&再也&b&不要使用ViewPagerTabStripe这一类的第三方Tab控件了,请使用TabLayout!&/b&&br&再也&b&不用找圆形头像控件,圆角控件了,其他的Univeral Image Loader /Picasso也不用看了,直接上&a href=&//link.zhihu.com/?target=http%3A//www.fresco-cn.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Fresco | Fresco 中文说明&/a&吧,它都有!&/b&不如用省下的时间看看Fresco的源码。&br&&b&少去国内论坛瞎晃&/b&,然后各种求指点,安心写两个月,你会发现自己水平比他们都强,&b&有问题请去stackOverflow搜索&/b&,&b&国内博文除了几个大牛的都少看,都是假的!都是骗人的!很多写着是原创,但是博文内容他们自己都没试验过,鄙视这些不负责任的!&/b&&br&&b&少听一些人说的有问题要写博客记下来!&/b&把这个时间省下,学一下&b&UML图怎么画,&/b&给自己的&b&工程加一些规范的注释吧!&/b&你的这些规范的源码和规范的注释就是你以后的资料库和经验库!&br&&b&请学会使用Git,自己一个人也要用,我们先不说那些团队合作什么的高大上的,就说你这一版代码修残了,要从原来的重新修改,怎么办?用Git,回滚版本!就说你突然一天电脑出问题了,或者你范二了,没备份就重装系统了,想哭怎么办?用Git,再也不用担心代码突然丢啦!&/b&&br&&strong&----------------------------------------------------------------------------------------&/strong&&br&评论里面有些同学有疑问关于如何学习material design控件,我的建议是&strong&去GitHub搜&/strong&,有很多同行给的例子,比如&a href=&//link.zhihu.com/?target=https%3A//github.com/chenyangcun/MaterialDesignExample& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&chenyangcun/MaterialDesignExample · GitHub&/a&&br&这些栗子足够入门。&br&&strong&-------------------------------------------------------------------------------------------------------&/strong&&br&&b&-------------------------------------------------------------------------------------------&/b&&br&有朋友说要是动真格的话,需要NDK以及JVM等的知识,首现&b&NDK并不是神秘的东西,&/b&你跟着官方的步骤走一遍就知道什么回事了,&b&无非就是一些代码格式以及原生/JAVA内存交互,进阶一点的有原生/JAVA线程交互,线程交互确实有点蛋疼,但平常避免用就好了,再说对于初学者来说关心NDK干嘛,据鄙人以前的经历,只在音视频通信和一个嵌入式信号处理(离线)的两个项目中用过,嵌入式信号处理是JAVA-&NDK-&.SO-&MATLAB这样调用的我原来MATLAB的代码,其他的大多就用在游戏上了吧,一般的互联网公司会有人给你公司的SO包的。&/b&&br&&b&至于JVM,该掌握的那部分,相信我,你会掌握的,不该你掌握的,有那些专门研究JVM的人来做,不如省省心有空看看计算机系统,编译原理。&/b&&br&&b&一句话,平常多写多练,这是最基本的程序员的素质,尽量挤时间,读理论基础书籍,JVM不是未来30年唯一的虚拟机,JAVA也不一定再风靡未来30年工业界,其他的系统和语言也会雨后春笋冒出来,但你理论扎实会让你很快理解学会一个语言或者框架,你平常写的多会让你很快熟练的将新学的东西应用到实际中。&/b&&br&&b&初学者,一句话,多练。&/b&&br&&b&------------------------------------------------------------------------------------------------------------&br&&/b&
说说我的情况吧,第一个学过的语言是C,然后C学的很烂的情况下继续学习了C++,为什么没有先把C学好再学C++呢,因为课程设计==,我有自知之明,所以在上C++的前一个寒假就先开始看了,然后先看了一本《易学c++》,虽然那本书在现在浅显至极,但当时还是感觉有点略难,我通过这本书熟练地掌握了std::iostream!==然后基本的对象模型有了一点概念,我比较好高骛远,于是就在此时想直接通过最后一个大作业——命令行下的RPG游戏 彻底掌握C++这门最难的语言!对,你没听错,我当时想的就是这个大作业要是搞懂了,C++还不是被我各种SM,但很不幸,虽然我一行行的把这个大作业的源码比着答案敲了一遍,但还是不懂,于是就在网上找了一个据说是清华的java课件开始学习,你还别说,除了当时感觉java里面把function叫做method(方法)感觉怪怪的以外,真的在不到3天的时间完全弄懂了对象的概念以及对象的继承,然后差不多就开学了==(当年不懂事,整个寒假就看了这10多天的书),所以java大法好。&br&
好,这是我人生入坑的开始,我说的寒假就是2014年寒假!,在接下来的学校的C++课程中我当然如鱼得水,然后一发不可收拾,很快我就自己把那本98清华版的《visual c++程序设计》弄烂了,确实那本书的只是我掌握的滚瓜烂熟,然后我就深入了解MFC,什么用GDI实现AlphaBlend,MFC的设计思想,MFC中数据库的使用什么的,然而现在回首看来这些并没有什么卵用。然后我就天天晚上回到宿舍打开电脑写代码,但显然我很快从社区(知乎==)上得知MFC很烂,大家都说微软大法好!于是入了C#的坑,然后发现生活好美好===天天真是喜欢C#的不得了,不过有一天我成了软黑,winform绘图闪成狗,loadlibrary看着好蛋疼,以及用user32.dll时,蛋疼的语法,蛋疼的函数名字,API参数,然后我得知,原来罪魁祸首不是c#,是winAPI就长这样!&br&
然后就在知乎大声地教唆下,入了Qt教,入门是看的一个外国人录得视频,英文无字幕,但是他的声音好好听,于是就学了Qt,第一次发现各种Layout的自适应布局,通过掌握QGraphicsView熟悉了MVC模型,后来还用QGraphicsView到了真实的项目,发现===好多坑==,坐标系统是坑,事件系统是坑,总之,欲仙欲死,不过说实话,我至今还是认为Qt的设计挺好的,QML想学,但流产了,原因大概是没时间吧。&br&
然后解除了另外两端惨绝人寰的事情,第一个是第一次做音视频的实时网络传输的时候,资料很少,一开始甚至连Ffmpeg都不知道,后来知道了,就入了Ffmpeg的坑,好多莫名奇妙的错误,都需要右键去看源码,然后音视频的编解码以及Rtp/Rtsp协议弄的差不多,demo也出来的时候,为了广域网,又要入P2P Nat穿透的坑,但是很遗憾,没有完全成功。&br&
还有一些其他乱七八槽的事情回来补==今天先说重点。&br&
在今年4月份左右,我第一次下定决心要搞定Android,而且我真的做到了!虽然以前断断续续看过android,但都没屁用,这次是真的白天看书,晚上写代码。郭霖老师的《第一行代码——android》只看了5章,但在这五章的学习过程中,我真的入了Android的门了,然后那本书我再也没有打开过,当然,Android只会画界面是远远不够的,现在的support.design.widget组件集让Android界面开发变得很轻松了,重要的是和服务器的交互,以及嵌入式本地数字信号处理,一不小心写了这么多,第一次发现自己打字这么快,哈哈~
先简单的分两种情况: 一、有编程基础,或者科班出身的,直接上吧。强烈推荐郭霖老师的《第一行代码-Android》 二、没编程基础的,先入门java,如果天天都有比较多的空闲时间的话,这个入门时间要在2周完成,如果没有的话,1个月内完成吧,不要让拖延耽搁你…
当你看完primer,甚至做了几个项目,自认为已经入门了的时候&br&忽然有一天你开始研究别人的代码。&br&当你看到别人写的template的时候;当你看到数字是全部要替换成宏的名字,英文要多长有多长的时候;struct全部用__attriburte__修饰的时候;运算都是位操作的时候;操作符都是重载的时候;网络都是并发缓冲线程池的时候;int只用int32_t声明的时候;继承不用普通的,各种多继承虚继承回调函数的时候;一个hello world也要写捕获异常的时候;中间一堆关键字extern,asm,auto,XXXXX_cast,volatile,explicit,register,template的时候。&br&顿时,那些整天写int,if,else,for的小程序猿开始怀疑人生了。
当你看完primer,甚至做了几个项目,自认为已经入门了的时候 忽然有一天你开始研究别人的代码。 当你看到别人写的template的时候;当你看到数字是全部要替换成宏的名字,英文要多长有多长的时候;struct全部用__attriburte__修饰的时候;运算都是位操作的时…
多图,注意流量.&br&--------------------------------&br&买几本好书,坐电脑前不停的写,废寝忘食的写,编程是世界上最容易的事,你还不用碰底层,先学学基本流程控制和调用API,然后理解下分层思想,这就能写脚本了,然后有兴趣有时间就研究底层,没兴趣就弄好一门语言,专心写脚本开发好app,难度方面你可以放心,是个人就能学会,学不会是不可能的。&br&你要用java就研究好面向对象,一个月有点短但要是全力投入也不是不可能。&br&你知道自己学,这可比那些就差一个程序员的强太多了。&br&祝你成功,有问题可以私信我。&br&---------------------------------------------------------------&br&&b&今天是第1天.&/b&&br&&a data-title=&@题主& data-editable=&true& class=&member_mention& href=&//www.zhihu.com/people/0edcd80b65& data-hash=&0edcd80b65& data-tip=&p$b$0edcd80b65& data-hovercard=&p$b$0edcd80b65&&@题主&/a&&br&书买到了吗?开发环境装好了吗?大体理解接下来29天要学习的内容了吗?还有信心和意志力坚持下去吗?&br&如果决定搞安卓开发,应该学习java.如果决定搞iOS开发,应该学习Obj-C.&br&这两门语言是&u&&b&面向对象&/b&&/u&的语言.它们将程序看成一个个&对象&的互相作用,对象有自己的特征和工作方法.&br&一个App有视图,控制代码和模块三个部分.这被称为&u&&b&MVC模型&/b&&/u&.&br&一个成熟的类似ins的App的开发,要实现移动终端上的程序(&u&&b&Client&/b&&/u&)和专用的服务器上的程序(&u&&b&Server&/b&&/u&).&br&Client 和 Server通过IP协议上层的传输层协议(TCP或UDP)通信.&br&接下来29天,大体要学习的部分就是这些:&u&&b&1.程序开发基础;2.MVC模型;3.网络编程相关知识.&/b&&/u&&br&如果想继续学习,请私信我或留言.&br&Hope you will carry on your career.&br&&br&The end of this section.&br&------------------------------------------------------------------------&br&第1.5天 说明下情况,以免新手被坑&br&鉴于下面有知友说想看后续,于是决定更新.&br&不过更新前必须交个实底,本人学生一名,之前&b&只搞过MFC&/b&(可以理解成Windows窗体程序开发的一种方法),会数据库操作和网络编程,上过计算机网络,自学过操作系统和数据结构.可以称得上熟练掌握的编程语言只有c++.安卓和iOS开发都看过书,但掌握的不是很全面,实际经验也很匮乏.&br&但这些开发的本质,个人看来是一样的.并不会因为语言特性的些许不同和实际操作的一点区别而影响本质.因此希望通过更新这个答案也能巩固自己的学习.&br&(说通俗点就是我是个大菜鸡,非要装成高手写了这么个东西...)&br&-------------------------------------------------------------------------&br&今天是第2天.&br&规定一下格式:&i&斜体字&/i&是非必须看的,新手可以不看,&u&&b&粗体下划线&/b&&/u&是必须掌握的概念.&br&程序开发语言主要分两种:&br&0.面向过程式.(现在多数已经成为面向对象式的一部分,如C语言,在App开发中已经不常用)&br&1.面向对象式.(Java和Obj-C,C++都是面向对象的编程语言,这类型的语言在实际应用中最重要,必须学习掌握)&br&2.函数式.(阳春白雪,相对业务应用少一些,和App开发关系不大.如果在以后希望深入学习算法等,可以考虑学习一门)&br&&br&App开发的核心是程序的书写.因此今天讲面向对象编程思路.(注意,是&思路&.具体的语法不会涉及太多)&br&面向对象的编程将&对象&(Object,物体)视为核心,对象的&动作&称为&b&方法&/b&,对象的属性(特性)称为&b&成员变量&/b&.&br&如果用面向过程的视角来看,成员变量是特殊的&u&&b&变量&/b&&/u&.方法是特殊的&u&&b&函数&/b&&/u&.&br&&i&可执行程序加载入计算机内存后摆放在三个地方:代码段(用于保存函数中的命令),数据段(用于保存全局变量和常量),栈段(用于保存函数调用函数的关系,还有一些其他信息,如上下文切换,这里没必要不介绍).&/i&&br&&u&&b&变量&/b&&/u&的本质是一块&u&&b&内存中的空间&/b&&/u&,能够记录一定形式的数据.&br&&u&&b&函数&/b&&/u&的本质是很多条指令,能够被执行并&u&&b&读取,计算,判断,修改一些&/b&&/u&指定地址&u&&b&变量的值&/b&&/u&.&br&&br&对象是方法和成员变量的集合.&br&类(class)是对象的集合.&br&&br&是不是很抽象?举个例子.&br&人类是一个&类&,某一个具体的人A是这个类的对象,A的体重是变量.人有一个方法叫做吃(记住,方法就是函数,函数就是指令的集合,吃是一个动作,也就是一堆指令),通过执行&吃&这个方法可以改变人的体重.&br&如果还不明白(其实暂时不明白也正常),就拆解的更细致一些:&br&类,就是某种对象的公共特征,比如人,是个人就一定有体重这个属性,因此体重是这个类的成员变量,这个类的每一个对象(具体的人),都有体重这个变量.&br&吃,就是这种对象都可以有的动作,是个人就可以吃,通过这个动作能改变一定的变量(比如人的体重等).&br&那么怎么用代码实现呢?(注意,不同语言的代码看起来不一样,但是实际本质是一样的.)&br&&i&下面有人喊要我讲Obj-C,那我就现学现卖了.&br&定义一个类.&br&@interface Human&br&{&br&&br&}&br&-void eat:(int)foodweightinKG;&br&@end&br&&br&@implementation Human&br&-void eat:(int)foodweightinKG&br&{&br&
weight=weight+0.15*foodweightinKG;&br&}&br&@end&br&&br&这就实现了吃一公斤胖0.15公斤的人这个&类&.&/i&&br&类,对象,函数,变量是以后开发的重要概念,必须熟练掌握.建议想学习的知友买本参考书,用于学习某门语言的语法.这个答案不可能特别具体的讲解每一个语法,但如果有资料辅助的话学习起来是不难的.&br&如果从后面来看我的答案,建议看到这里的时候找一些学习资料,学习一下某门具体语言的语法.这里重要的是理解这个思路,就是通过控制&对象&,修改对象的属性,调用对象的方法来控制程序的行为.&br&&br&The end of this section.&br&---------------------------------------------------------------------&br&今天是第3天.&br&今天主要讲程序设计中的一些基本问题和概念.&br&有些问题要强调一下:&br&
0.本人菜,能搞明白的只有c++,java会的相对比oc好一些,oc非常生疏.但基本原理都一样.&br&
1.看完这个基本上就有思路了,但还是要自己买书实践.篇幅所限不可能内容太完备.如果有具体问题还是要自己查找资料,结合实践解决.&br&
2.这么多赞确实出乎我意料,我会尽力更新.有问题也可以在下面提问,如果能解答的话我会尽力解答.&br&-----------------------&br&今天想告诉大家一些当初我在学MFC时候弄了很久才理解的很简单的道理.&br&一.一个App,甚至一个窗口程序,绝大多数功能,都不是靠自己硬写出来的,而是调用已有的库函数,套用已有的类,加上中间业务逻辑的代码,和自己的算法实现(如果有).&br&
就说最简单的Hello,world 这个东西如果要从一无所有的裸机(没有操作系统)上实现,必须得从头写向显示缓冲区中写数据的汇编指令(假设在8086上).&br&
这个工作量显然不小.但我们不需要这样做.只需要调用系统自带的库函数就可以解决问题.&br&
在Windows程序开发中,我们要画一个窗口,即使用调用WindowsAPI的方法,也要写几十行代码(注册窗口类,设置属性什么的),最后ShowWindow(),才能显示出来.这显然不符合面向对象的设计原则,而且增加了完全不必要的复杂程度.&br&
因此,绝大多数普通开发者(非底层开发者)的日常工作是:寻找一些适当的库,调用这些库中已有的代码,来进行功能的实现.&br&
因此后面讲的网络编程,不是叫你从头控制每个数据包里的每个字段填什么,而是只需采用适当的类(java有个Socket类,c++用socket函数从OS获取句柄),调用其中的函数(bind,listen,connect,accept,send,recv,close/sendto,recvfrom等等)就可以了.&br&
这就是一个非常重要的理念:分层模型.将复杂的逻辑分成多层来实现,上层只和自己紧挨着的下层交互,保证了层与层之间一定的独立性,为复杂应用的开发提供了可能.&br&&b&情况1&/b&.你的软件比较复杂,应该用分层.&br&
比如未来我们要开发一个小型社交软件(假设),那么首先我们要写一个服务端,服务端要记录用户的信息,对话的信息.可以创建一个用户类,用于记录用户的信息.再创建一个对话消息类,从高层上抽象用户与服务器发消息的过程,便于写客户端;再创建一个好友类,用于记录用户和朋友列表的对应关系(&i&可以思考一下朋友列表怎么实现?&/i&).再创建一个记录类,用于帮助客户端实现聊天记录的实时查看,搜索,管理功能.&br&
假设我们已经构造好了这些类.那么在新用户填写完用户名密码,点击注册按钮的时候,就应该创建一个对话消息类的实例(也就是这个类的对象),尝试向服务器发出一组消息,里面包含着新用户的用户名,密码(&i&或者密码的Hash散列,但这个目前先不讲&/i&),一些填写的资料等等.&br&
如果你在点击按钮后被调用的函数(称为&回调函数&,Call back function)中,没有使用你已经创建好的类,而是从头写了一遍TCP报文内容填充代码,那么这显然不是对已有层模型的良好应用.正确的做法是用你已经有的那个高层类的各个函数实现报文的填充.&br&
同理,如果你想创建一个客户到客户的好友关系,不应该自己从头改数据,而应该调用之前建立的好友关系类的成员函数.这样不容易出现问题(比如从头写的时候忘了考虑边界条件),也能大大节约开发,维护,升级(如果你把同样的代码拷贝了一份过去,那么你修改这段代码的功能的时候就必须把拷贝的那份也修改了!)的成本.&br&&b&
情况2&/b&.你的软件和操作系统内核交互,或者想要操纵硬件,那么必须调用系统的API(Application Programming Interface).这种情况下,你被迫接受了分层模型.&br&
这样说可能显得比较抽象不好理解.那么举个具体的例子.&br&
首先,如果你要判断2^17+1是不是素数,而且判断结束后的结果也不输出,就那么放着,那么当然可以不去碰系统的API.&br&
但如果你想把结果输出到屏幕,或者通过网络传输回服务器,或者获取传感器的信息等,那么必须调用操作系统提供的函数.因为操作系统利用地址空间变换,让你碰不到真实内存空间.调用这些API时具体的参数很多,需要时可以上网查找相应的函数参数和返回值的约定.&br&二.一个APP的开发分这几个部分,以安卓开发为例.这里假设大家都已经安装了Eclipse作为开发环境,并且都有Android开发包.如果没有可以去下载一下.这两个软件都是免费的.&br&新建一个空的Android工程.&br&&figure&&img data-rawheight=&582& data-rawwidth=&402& src=&https://pic1.zhimg.com/50/23749eddd095facd3815ca_b.jpg& class=&content_image& width=&402&&&/figure&大概长这样.&br&认识一下图中的文件和目录.&br&1.首先是src和下面的那个package(对就是那个图标像准星瞄准肿瘤一样的东西,好像看它裂成4块啊).&br&src是源代码文件夹.&br&解释一下,在java里一个package相当于一个&包&.&包&里可以有一个或多个*.java的源代码文件.编程的工作就在这些.java文件里进行.&br&2.然后是一些资源文件.在res目录下.&br&比如这个AndroidManifest.xml,这里面记录了一些文档信息.比如软件的版本,包的关系之类的东西.&br&又比如res\layout\main.xml(图中忘展开了,但是你自己建完工程点进去肯定是有的.),这个xml文档控制了你的App的一个界面,App有单界面和多界面的,咱们先死磕这一个界面.双击这个文件,看到的大概是这样的.&br&&figure&&img data-rawheight=&697& data-rawwidth=&1261& src=&https://pic4.zhimg.com/50/5dbedbad6ab779bf29ad2b9_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1261& data-original=&https://pic4.zhimg.com/50/5dbedbad6ab779bf29ad2b9_r.jpg&&&/figure&是可视化的.所以可以做&所见即所得&的编辑,就像编辑文档一样简单(当然了如果要考虑兼容其实也不是那么简单的,但初学者不用考虑太多).&br&&i&当然了,如果你想求根问底那满足你.&/i&&br&&figure&&img data-rawheight=&268& data-rawwidth=&723& src=&https://pic3.zhimg.com/50/db65a04dffae7ce7d4bbf9f_b.jpg& class=&origin_image zh-lightbox-thumb& width=&723& data-original=&https://pic3.zhimg.com/50/db65a04dffae7ce7d4bbf9f_r.jpg&&&/figure&&i&这个的确很容易把初学者吓回去,但是不用担心大部分时间你是不用碰这个的.而且这个xml文档就类似html文档一样.不信你打开一个网页,右键-&查看源代码看到的也是类似格式的东西.用尖括号组表示一个段落,段落之间嵌套或并列,是xml文档的特点.目前不必深入.&br&&/i&然后就是一些其他的资源文件,比如drawable-hdpi里面有图片文件,用于显示.这个和网页制作是有共同点的.后面再介绍.&br&3.可执行文件.&br&&i&这里有必要介绍一下计算机程序的运行过程.&br&计算机程序的运行有两种形式:编译型和解释型.&br&先说编译型.(如C系语言)&br&首先,程序员采用各种高级语言(相对汇编码)编写程序.然后编译器把程序员书写的源代码分析,转换为汇编码,链接器链接多个文件,形成最终的可执行文件.最终发布的时候如果只发布可执行文件,那么用户是看不到高级语言源代码的.&br&再说解释型.(如php,asp等网页脚本语言)&br&首先,程序员书写脚本.然后解释器读取源代码,并动态的分配空间给程序中的变量,判断程序的走向,执行相应的动作.如果要发布给用户(当然脚本一般不发布出去),用户是能看到源码的.&br&&br&而Java就很特殊了!!!&br&Java编写的程序,首先经过初步的编译,生成了Java字节码.(一种比较底层的东西,但不能碰到具体硬件)然后把这个东西放到JVM上跑.因为JVM这个东西每个平台上都有,因此也就相对容易移植到不同平台上.这个JVM的全程是Java Virtual Machine,也就是一个虚拟机.所以性能相对就比较烂,不过现在大多数应用场合是不特别在乎运行性能的,反倒是开发速度和可移植性可维护性比较重要.&br&这个JVM也可以理解成一个大型的解释器(...)因此Java算哪种不好说,两种特点它都有.&br&然后呢,AndroidApp更特殊,在Java这么奇特的大背景下它也算特殊的.为什么呢?为了适配移动设备(低能耗等需求),出了一个东西,叫Dalvik Virtual Machine.这个东西的字节码和java字节码还不一样...&br&所以为了编写一个AndroidApp,你的Java源码经历了这样一个流程:&/i&&br&Java源码-&Java字节码-&Dalvik字节码-&.apk文件&br&
(与资源等打包)&br&&br&说了这么多,那如何得到最终的apk文件呢?&br&点击Eclipse上面那个绿色的箭头就可以了.&br&&br&The end of this section.&br&------------------------------------------------------------------------------&br&今天是第4天&br&今天计划继续研究第一个AndroidApp,HelloWorld工程的结构,并添加一个按钮控件.&br&今天将介绍&u&&b&回调函数&/b&&/u&的概念.&br&如果可能我更一个iOS开发的,毕竟也不能太坑想学iOS的...但是各位小伙伴记住原理都是一样的,只是具体实施方法有那么一些区别而已.&br&&br&&br&遇到点问题卡住了.这个答案更新可能比较慢....等我调一下&br&&br&好的,回来.&br&首先,建立完工程之后,如果没有现成的Android设备(如本人手头的老机器好久没用了得找找),可以建立一个AndroidVirtualDevice.这个在下载开发环境的时候会有AVDManager,在那个里面建立就行.&br&如果建立完之后start有问题,那么改环境变量.附一篇文章:&a href=&//link.zhihu.com/?target=http%3A//jingyan.baidu.com/album/91f5db1beb12d41c7f05e39f.html%3Fpicindex%3D3& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&百度经验——实用生活指南&/a&(如侵犯作者著作权请通知,会删除)&br&然后点击绿色按钮,会在刚才建的虚拟机中出现界面.就像这样.&br&&figure&&img data-rawheight=&796& data-rawwidth=&1610& src=&https://pic4.zhimg.com/50/4d5e146aa2b_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1610& data-original=&https://pic4.zhimg.com/50/4d5e146aa2b_r.jpg&&&/figure&然后呢,工程里的那个R.java不要改,那个是自动生成的,用来配合你写的部分.&br&今天先把开发环境配置好.如果能顺利走下来建立工程打开AVD看到这个基本主要任务就算完成.有中间卡住的可以百度,百度不到可以下面留言问我.&br&然后如果想在界面上加点东西应该怎么办呢?&br&我试试改下main.xml.一会继续更新.&br&&br&好的,现在回来.&br&&figure&&img data-rawheight=&714& data-rawwidth=&1495& src=&https://pic3.zhimg.com/50/750ccbf39b9e4bae4c139e8b976e228b_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1495& data-original=&https://pic3.zhimg.com/50/750ccbf39b9e4bae4c139e8b976e228b_r.jpg&&&/figure&&br&这里你直接拷贝代码是不行的.要注意几点:&br&1.MVC模型中,你创建的&b&视图&/b&(在main.xml的可视化编辑界面中拖拽过来一个按钮)&b&和Button对象MyButton1是没有直接关联的&/b&.要让他们有关联,必须绑定.这个动作在代码中的findViewById中实现.至于那个id参数填什么,可以看你的R.java(别改,千万别手贱),点击那个东西一个个展开,R.java-&R-&id,里面一定有你刚才在视图里创建的那个button的id.找到他就可以了.&br&&i&这个东西的实质是一个类似宏定义的整数,打开R.java,你会发现一堆public static final class,里面有一堆int型的变量,那个其实就是类似于宏定义的按钮的类似&句柄&的东西,用MFC的类比.只要知道这个整数唯一对应着视图域的那个控件就行了.&br&&/i&然后下面的行为就是确定按钮的行为.这里通过setOnClickListener,实现了把自己的回调函数(onClick())绑定到按钮的被点击事件上.可以理解成一旦点击这个按钮,Android就会触发这个函数执行.&br&&br&接下来讲解下回调函数的概念.&br&之前&b&讲变量的时候我埋了一个伏笔&/b&,说&b&所有变量都可以通过他们的地址来读写&/b&.&br&好的,现在回到这个伏笔.&br&可以认为setOnClickListener这个行为传入了一个对象地址,这个对象的地址由new OnClickListener得到,而里面的那个OnClick()函数认为是新创建的这个OnClickListener对象的一部分.&br&&br&这个行为就类似于C++当中传函数指针.如果能理解最好,不能理解就记住这么写就能好使(是不是要求太低了...).&br&The end of this section.咦,this怎么变色了.&br&--------------------------------------------------------------------------------&br&PS[0]:再强调一下,这个东西本人也是第一次写(指的是在这个开发环境下写,之前可视化的开发一直写windows窗口程序的).所以可能更新过程中突然卡住了.答主应该不会弃坑.&br&PS[1]:看这架势有可能不到30天就更完了.如果这样的话很可能太快有人跟不上,有问题随时留言问就好.当然能搜索的请自觉先搜索,搜索不到解决方案再来问.&br&PS[2]:答主好久以前安装的开发环境,如果要开发环境的话我去找找还能不能找到那个包了.这个安装的时候实在太麻烦了,因此学习Android开发我也是拖了很久.希望真的有兴趣开发App的朋友们不要仅仅因为安装过程中遇到一些困难就放弃.尤其是之前没有开发可视化程序经验的新手,如果能成功看到自己写的不是黑框框的东西,会很大程度上提高对编程的兴趣.(当然后来我又主动退回到黑框框里去了,这是后话.)&br&--------------------------------------------------------------------------------&br&第4.5天.&br&咨询下大家意见.我打算接下来25天(可能用不了那么久就完结了)讲快点,做一个聊天工具的开发.这个怎么样?能接受不?还是先回顾下前面?&br&iOS那边我一会看看,争取更一个,今天Android那边打算先停一下,因为前面侧重点太靠这边了,而且这推进速度也不算慢.但注意,原理是相通的,细节略有不同.毕竟前面一直都没怎么偏向iOS这边,不能太厚此薄彼.&br&等下,答主换台mac回来接着更新.&br&好的回来了.&br&首先要搞iOS开发得有台MacOS设备,注意,没有Mac可以弄虚拟机,或者借一台,本人的mac是借的.虚拟机也完全一样,就是有点卡.&br&还有必须说明的一点就是要开发iOS App的过程不需要开发者账号,但如果想发布在AppStore或者在自己没越狱的iOS设备上用,那必须得有开发者账号.付费之后就可以使用.价格记不清了,不低也不算高.如果不买开发者账号,就只能在模拟器上跑.&br&另外就是软件方面.有了MacOS设备之后在AppStore下载安装一个XCode作为开发环境就可以了.&br&------------------------------------------------------------------&br&今天是第5天&br&那么想学习iOS开发的朋友们请打开你的XCode.&i&学习Android开发的朋友可以把之前做的HelloWorld工程自己做一做,加上一个按钮.你在虚拟机里运行完一遍之后可以到你的工程文件夹下找*.apk,然后放到你的真机里去跑跑看.&/i&&br&&br&File-&New-&Project-&iOS-&Application-&SingleViewApplication(暂时选这个).Device那里暂时选Universal就行.&br&然后选择一个喜欢的位置放置工程文件.&br&为了验证你之前的开发环境配置是否正确,点击上面的三角形开始按钮,在模拟器(Simulator)中执行程序.&br&(下面这三段的第一个版本有问题,已经更正.)&br&应该能看到一个模拟器的界面弹出来,当然了整个屏幕不一定放得下,可能需要往上拉右面的滚动条.什么都不用做,等待片刻之后会出来一个界面.你会惊奇的发现它居然和LaunchScreen.xib的视图是完全一样的(不一样就见鬼了),当然,不一会它就没了,取而代之的是一个空白界面.&br&所以这里LaunchScreen.xib表征的就是启动时预先加载的一个Logo摆放的地方.&br&好的,那么由之前几天提到的MVC模型,或者按我个人理解:App工程=源码+视图+资源文件+杂七杂八&br&&br&既然要系统的学习,那么就应该掌握下iOSApp工程的文件结构.&br&等我出去看一下怎么截图.MacOS下我不会截图...&br&好的学会了.图解如下:&figure&&img src=&https://pic3.zhimg.com/50/51ec8cdc914dcae6f859e384_b.jpg& data-rawwidth=&240& data-rawheight=&355& class=&content_image& width=&240&&&/figure&&br&上方为图1&br&&figure&&img src=&https://pic3.zhimg.com/50/b209af4a6ffa8ab1b10ea289fe8bc5b3_b.jpg& data-rawwidth=&573& data-rawheight=&244& class=&origin_image zh-lightbox-thumb& width=&573& data-original=&https://pic3.zhimg.com/50/b209af4a6ffa8ab1b10ea289fe8bc5b3_r.jpg&&&/figure&&br&上方为图2&br&&figure&&img src=&https://pic3.zhimg.com/50/64b1dab71e1cd_b.jpg& data-rawwidth=&787& data-rawheight=&116& class=&origin_image zh-lightbox-thumb& width=&787& data-original=&https://pic3.zhimg.com/50/64b1dab71e1cd_r.jpg&&&/figure&上方为图3&br&&br&那么图1中的各个文件都有什么用处呢?&br&首先看,有一堆.h和.m文件;*.h文件不必说,自然是C系语言都有的头文件.*.m文件是Obj-C的代码文件,就类似于*.cpp文件和*.h文件的关系.由于声明和实现分离是C系语言一贯的德行,而且前面也提到了Human类的接口声明在@interface后面,实现在@implementation后面,我们在这里也就不多说了.&br&&br&接下来说说具体每个文件的用途.&br&AppDelegate.m,里面装了许多回调函数.读那个函数名字,就知道它是在什么时候被调用的.有准备进入后台,已经进入后台,准备回到前台,已经回到前台等事件的监听.监听到事件后会调用相应的回调函数.&br&ViewController.m,里面装载了界面加载和内存不足时调用的回调函数.&br&Main.storyboard,这个是工程的主视图文件.因为建立工程的时候我们选择的是SingleView型的,所以这里只有一个.&br&你可以在这个界面上加入一些控件,比如按钮文本框之类的.当然了,这里的东西现在只能看,不能点,点了也没用,因为对应控件事件的处理函数没有写.&br&那么在哪里写这些事件的处理函数呢?答案是在ViewController.h中.注意这里XCode提供了一种很方便的绑定控件实例与事件回调函数的方法:拖拽.&br&&br&首先打开ViewController.h,和Main.storyboard,要保证两者能同时被看到.然后右键点击你要设置事件的控件,点住相应控件右侧的圆点,向ViewController.h中拖动.然后会弹出一个对话框让你填写函数的名字.给函数起一个好记的,含义充分的名字,以确保自己不会弄混乱.然后在&b&&u&生成的函数体(注意在ViewController.m中!!!)&/u&&/b&中填写适当内容就可以了.&br&注意,C系语言声明和实现的分离,决定了&b&&u&新的函数体在ViewController.m中.找到对应的函数,填写适当的内容即可.&/u&&/b&&br&&br&&figure&&img src=&https://pic3.zhimg.com/50/0cc02abbf55dee1aefa3d_b.jpg& data-rawwidth=&754& data-rawheight=&462& class=&origin_image zh-lightbox-thumb& width=&754& data-original=&https://pic3.zhimg.com/50/0cc02abbf55dee1aefa3d_r.jpg&&&/figure&如图所示.&br&&br&做到这里之后可以休息一下了.今天的内容大概就是这样.求赞求鱼丸甩起(误)&br&&br&The end of this section.&br&----------------------------------------------------------------------------------------&br&今天是第5.5天.&br&看一下题目.要独立开发ins类的app是吧?&br&答主没用过ins,所以可能做的和题主想要的有点出入.&br&然后今天讲什么?咨询下大家意见.突然感觉没什么可讲的了.这哪用的上30天啊(笑)&br&&br&初步计划讲讲AndroidApp的结构,Activity之间的关系,App的状态.&br&然后做个比之前Helloworld稍微大一点的东西.&br&iOS那边先放一放,安装开发环境也挺折腾的,想学iOS的朋友先配置下开发环境把之前那个做出来吧.&br&----------------------------------------------------------------------------------------&br&今天是第6天.&br&讲一下AndroidApp里面Activity是什么.&br&Activity我个人的理解就是视图.可以认为App整体是一个网站,打开这个App之后看到的第一个视图是主页,页面之间可以来回跳转.&br&因此,可以认为Activity是一张类似于网页的东西.&br&仔细观察会发现Activity跟网页真的很相似.还记得那个main.xml吗,里面的布局和html布局的语法是很接近的,甚至有div.&br&布局的时候要考虑这样几个问题:&br&1.Android设备种类多,屏幕分辨率五花八门.网页一般兼容和的屏幕问题就不大了,而Android设备屏幕分辨率有:&br&320X480&br&460X640&br&----------------------上面这两种不常见.------------&br&480X800//这个还有一些&br&480X854//小米1就是这个分辨率&br&540X960//HTC以前的机器用&br&640X960//坑爹3:2,好像魅族用过,相对少见&br&0P,比较主流&br&&br&//1080P,高端机有采用的.&br&据说还有2K的,这个就更好了.&br&&br&基本常见的列举出来了.但也有没考虑到的.兼容这么多就不错了.&br&&br&这些设备别说屏幕分辨率不一致了,就连屏幕长宽比都不能统一.&br&坑爹的15:9,3:2,....(虽说苹果现在也好不到哪里去...)&br&这就决定了在设计界面的时候,必须结合绝对布局和相对布局两种方式.&br&所谓绝对布局,就是给出具体坐标,然后放置元素.&br&所谓相对布局,就是给出元素间放置的关系,然后放置.&br&具体在操作的时候可以通过放置linear layout的线来控制元素的位置.&br&比如这样:&br&&figure&&img data-rawheight=&609& data-rawwidth=&607& src=&https://pic4.zhimg.com/50/dcba4e90f7b8e45ee13d9ba_b.jpg& class=&origin_image zh-lightbox-thumb& width=&607& data-original=&https://pic4.zhimg.com/50/dcba4e90f7b8e45ee13d9ba_r.jpg&&&/figure&&br&这个不多说了,因为我也不是特别懂美术和界面.&br&&br&好的,那么可以发现Activity上控件的布局和网页很相似.&br&那Activity的交互性是怎么实现的呢?前面我们已经看过了,是通过控件元素绑定相应的对象,进而在对象上调用回调函数实现的监听控件动作.&br&那如何将我们的后台的动作(比如socket收到一份报文)反映到控件上呢?&br&同样也是通过调用控件绑定对象的方法.比如,可以把文本框绑定到文本框对象上,然后在收到报文后调用文本框对象的setText

我要回帖

更多关于 有什么好的解压方式 的文章

 

随机推荐