手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2013年05月的文章

对着谢大的教程写代码(一)

 谢大的教程在:https://github.com/astaxie/build-web-application-with-golang

在复刻和学习的过程中,把问题记录下来的笔记
 
1、
XML/HTML代码
  1. // 声明一个数组  
  2. var array = [10]byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}  
  3. // 声明两个slice  
  4. var aSlice, bSlice []byte  
  5.   
  6. // 演示一些简便操作  
  7. aSlice = array[:3] // 等价于aSlice = array[0:3] aSlice包含元素: a,b,c  
  8. aSlice = array[5:] // 等价于aSlice = array[5:10] aSlice包含元素: f,g,h,i,j  
  9. aSlice = array[:]  // 等价于aSlice = array[0:10] 这样aSlice包含了全部的元素  
  10.   
  11. // 从slice中获取slice  
  12. aSlice = array[3:7]  // aSlice包含元素: d,e,f,g,len=4cap=7  
  13. bSlice = aSlice[1:3] // bSlice 包含aSlice[1], aSlice[2] 也就是含有: e,f  
  14. bSlice = aSlice[:3]  // bSlice 包含 aSlice[0], aSlice[1], aSlice[2] 也就是含有: d,e,f  
  15. bSlice = aSlice[0:5] // 对slice的slice可以在cap范围内扩展,此时bSlice包含:d,e,f,g,h  
  16. bSlice = aSlice[:]   // bSlice包含所有aSlice的元素: d,e,f,g  
主要是加深颜色的那句。。。。
2、
go代码
  1. type human struct {  
  2.     name   string  
  3.     age    string  
  4.     height int  
  5. }  
  6. type student struct {  
  7.     human  
  8.     skills  
  9.     int  
  10.     age        int  
  11.     speciality string  
  12. }  
  13. func (h *human) sayhi() {  
  14.     fmt.Printf("human say hello, i'm %s \n", h.name)  
  15. }  
  16. func (h *human) gogo() {  
  17.     fmt.Println("gogogo");  
  18. }     
  19. type men interface{  
  20.     sayhi()  
  21.     gogo()  
  22. }  
  23.   
  24. 然后用的地方:  
  25.     mike := student{human:human{name:"mike"}}  
  26.     var i men;  
  27.     i = mike;  
  28.     i.sayhi();  
因为这是早期的所见所得编辑器。对于代码高亮做的不好。忍忍吧。。。
上面的代码是会出错的。
cannot use mike (type student) as type men in assignment:
student does not implement men (gogo method requires pointer receiver)
需要:mike := &student{human:human{name:"mike"}}
看到没,在student前有个取址符。主要是因为方法指定的是:(h *human),如果是(h human),就不需要取址符了
*human 是指针,但是你mike不是指针,只是对象,所以没有实现这两个方法,才会报错
然后谢大给出了这个:http://segmentfault.com/q/1010000000198984#a-1020000000199002,说是里面有解释
XML/HTML代码
  1. 假设T是struct,那么Go里面遵循下面几个原则:  
  2.   
  3.    T的方法集仅拥有 T Receiver 方法。  
  4.    *T 方法集则包含全部方法 (T + *T)。  

  5. 所以你上面的例子dept1应该是拥有方法:Name和SetName    
  6. 而&dept1拥有方法:Name、SetName和Relocate  
  7. 这个就是Go里面在设计方法的时候需要注意Receiver的类型  

Tags: go, astaxie

mongodb 的 geo near

 本来是想用mongo的geo功能来做查询,想着这个功能是它自带的,性能一定很牛叉吧?结果事实让我们非常失望。

我们做了一个简单的测试,插了1000万条数据,y=x的方式插入,即[0.00001,0.00001]~[99.99999,99.99999],在坐标上其实就是显示成一条实现。如果我们随便指定一个坐标值,求near。你会发现其实很卡。。。20多秒才能出数据,而且还不准。

要知道我的机器可是:i7 4核,16G内存,SSD的硬盘,都这么卡,而且出来的都这么慢。

当然,其实更重要的是不准。。。我坐标[20,90],查出来的点,居然是[55,55],这太让人伤心了。随便算了算,怎么着都应该是77左右啊。。。

估计,只能用mysql了。。。伤心。

 

Tags: mongo

Getting Started with PhpStorm as Google App Engine PHP IDE

其实我是在oschina看到的这个新闻,那天。。。正在爬长城呢,顺手打开oschina,就看到这个新闻了。本来以为这是个玩笑,以前的毕竟听说gae还是支持PHP的,不过是利用java来支持的。

当这个新闻一出来。然后就看到phpstorm的博客上就出了支持GAE for PHP的文章了。震惊。phpstorm这家公司还是真心不错,早年我说过:jetbrains这个公司越来越象当年的borland了,当年也是狂出IDE,希望它能够坚持下去吧。

废话说了很多,其实我主要是做为了备份,国内用了SAE,ACE,BAE(腾讯的还没有试过),所以GAE还是想试用一下的(python的那个只用了一个功能,你懂的)

这是一个目录:

本来官网上还写了有视频:In this tutorial we'll create a simple Google App Engine PHP application with PhpStorm IDE.Watch this video on Support for GAE PHP in PhpStorm.
可惜,这视频我们看不到,你懂的。。。
PS:介绍页左边的菜单里可是有很多好东西的哦。

Tags: phpstorm, gae

北京游

 这段时间博客一直没有更新。是因为这段时间 几乎一直在外面。。

5月的234在杭州玩。这两天,直到周末应该都是在北京。
昨天晚上出去走了走,发现北京城里,最多的玩意居然是办证,我晕,满地都是,天桥上。。。几乎每个台阶上都是:办证
 
今天在石头的带领下,走了一天,从早上9点走到8点。当然期间有在小酒吧和星巴客喝了点酒和咖啡。环境真TMD的爽
当然也有不爽的地方,那就是杨絮满天飞,还有就是估计PM2.5对我还是有影响的。总觉得嗓子干。
 
经过后海的时候,那些酒吧驻唱的歌声也感染了我,只是唯有一家。吐字也不清,曲调也不准,TNND,这也太不专业了。
 
总之,这两天,有点累,不过。。。也吃了点有特色的东西:涮羊肉,豆汁等。。(一哥们说,你居然吃豆汁。。。吃了大半碗,确实 还能入口,用石头的话来说,这家是相对还有点正宗的了。其他的味更淡)
过两天我集中把照片发上来,iphone拍的。就不用太纠结质量了。。关键是还有点好玩罢了

转:程序员,你会问问题吗?

其实看到这篇文章很久了,我一直忍着没有把它转过来。。在我眼里,这些什么《提问的智慧》,《提问的技巧》等等东西,就象小时候语文老师教的小说四要素一样:时间、地点、人物、情节,英文里称4w(when,where,who,what)。因此,在我看来,提问这玩意无非也就是我在什么时候,什么平台,当前的环境下,发生了什么问题。能够把这个事情说清楚的,即使你没有说,我刚才怎么处理怎么处理,还是没有搞定这个问题,我想别人在你能够描述这么清楚的情况下,也会帮忙解决你的问题的。

好吧。先转一个《提问的智慧》,我晶,居然还有版本修订:http://www.wapm.cn/smart-questions/smart-questions-zh.html,实在太长了,我懒得转了,就最后一句吧:

XML/HTML代码
  1. 伊夫林.米切尔(Evelyn Mitchell)贡献了一些愚蠢问题例子并启发了编写“如何更好地回答问题”这一节,米哈伊尔.罗门迪克(Mikhail Ramendik)贡献了一些特别有价值的建议和改进。  

 

然后再来两个小要点,因为我看现在QQ群里,如果别人提问不回答,这些人还会骂娘。有时候不知道到底是谁在提问,是谁需要回答:

XML/HTML代码
  1. 如果得不到回答  
  2.   
  3. 如果得不到回答,请不要认为我们不想帮你,有时只是因为被问到的小组成员的确不知道答案。没有回复不等于不被理睬,当然必须承认从外面很难看出两者的差别。   
  4. 一般而言,直接将问题再张贴一次不好,这会被视为毫无意义的骚扰。耐心一点,知道你问题答案的人可能生活在不同的时区,有可能正在睡觉,也有可能你的问题一开始就没有组织好。  
  5. 还有其它资源可以寻求帮助,通常是在一些面向新手的资源中。  
  6. 有许多在线与本地的用户组织,虽然它们自己不编写任何软件,但是对软件很热心。这些用户组通常因互助和帮助新手而形成。  
  7. 还有众多大小商业公司提供签约支持服务(红帽与 SpikeSource 是两家最出名的,还有许多其它的)。别因为要付点钱才有支持就感到沮丧!毕竟,如果你车子的汽缸垫烧了,你多半还得花钱找个修理店把它弄好。即使软件没花你一分钱,你总不能指望服务支持都是免费的。  
  8. 象 Linux 这样流行的软件,每个开发者至少有一万个以上的用户,一个人不可能应付这么多用户的服务要求。记住,即使你必须付费才能得到支持,也比你还得额外花钱买软件要少得多(而且对封闭源代码软件的服务支持与开源软件相比通常还要贵一点,也要差一点)。  
  9.   
  10. 如何更好地回答  
  11. 态度和善一点。问题带来的压力常使人显得无礼或愚蠢,其实并不是这样。  
  12. 对初犯者私下回复。 对那些坦诚犯错之人没有必要当众羞辱,一个真正的新手也许连怎么搜索或在哪找 FAQ 都不知道。  
  13. 如果你不确定,一定要说出来! 一个听起来权威的错误回复比没有还要糟,别因为听起来象个专家好玩就给别人乱指路。要谦虚和诚实,给提问者与同行都树个好榜样。
  14. 如果帮不了忙,别妨碍。 不要在具体步骤上开玩笑,那样也许会毁了用户的安装──有些可怜的呆瓜会把它当成真的指令。  
  15. 探索性的反问以引出更多的细节。 如果你做得好,提问者可以学到点东西──你也可以。试试将很差的问题转变成好问题,别忘了我们都曾是新手。  
  16. 尽管对那些懒虫报怨一声“读读该死的手册”(RTFM)是正当的,指出文档的位置(即使只是建议做个谷歌关键词搜索)会更好  
  17. 如果你决意回答,给出好的答案。 当别人正在用错误的工具或方法时别建议笨拙的权宜之计,应推荐更好的工具,重新组织问题。  
  18. 帮助你的社区从中学习。当回复一个好问题时,问问自己 “如何修改相关文件或 FAQ 文档以免再次解答同样的问题?”,接着再向文档维护者发一份补丁。  
  19. 如果你是在研究一番后才做出的回答,展现你的技巧而不是直接端出结果。毕竟“授人以鱼,不如授人以渔”。  

 

最后,转原文吧。。。

 

由于一直从事技术和平台产品方面的工作,我们部门经常会收到公司内外同事和同仁的问题邮件,有些好的问题能让你发现自己技术上的缺陷、产品的bug或提升的空间,去思考、回答和解决这样的问题真是一件让人愉悦,充满挑战和成就感的事情。但是非常遗憾的是,这样的好问题却是凤毛麟角。我经常会被一些莫名其妙的问题搞的啼笑皆非,比如:

  1. 程序运行过程中突然内存溢出,该如何解决?
  2. 如何配置JVM的虚拟机参数?
  3. 程序部署到Linux上后,页面出现中文乱码,是不是中间件的配置出现问题了?
  4. 集群节点不能自动复制,如何解决?

 

最可气是第四个问题,经过了解环境逐一排查,最后发现两个节点根本就ping不通嘛,这种“异常”在现场该是多么容易发现啊!

当然,类似的傻问题我年轻的时候也问过,谁会不犯错呢,真正让我认识到这一点的重要性,还是在工作中与国外程序员的邮件交流。在2005年期间,与国外程序员共同维护公司内部的一个平台级产品,邮件往来必不可少,慢慢的我发现国外的程序员提的问题或报的bug都非常有规律,每个问题或bug都有非常清晰的标题,正文是环境描述,已经采取了什么措施、结果,相关日志,Core dump,图片等等,一般读完邮件就能非常清楚的了解对方想要表达的意图和希望你能提供的帮助,而且你也知道该做什么,如何回复等等。久而久之,自己也不好意思再去写那些傻问题了。

那么作为技术人员,如何去问一个让双方都满意的好问题并最大程度的得到回复呢?这一点对提问者重要,对被问者同样重要,大好人生,谁也不愿意为一个烂问题浪费时间。

简单总结一下,如果你按照以下步骤进行,提出的问题一定会更靠谱一些,提出好的问题是你提升的第一步,其实这个过程在提问之前已经开始了:

  1. 遇到问题不要急着问别人,在时间允许的情况下看是否自己能够解决,一方面锻炼自己分析问题和解决问题的能力,另一方面,一旦问题解决了,问题就不是问题,而是你的经验和知识库。况且现在互联网有那么多的技术资料和各类问答网站,想碰到一个别人没碰到的问题,已经非常困难了,除非是内部产品。
  2. 如果做了努力依然不能解决,或者客观条件不允许你自己解决了,那么首先要选择提问对象,不管是社区还是公司同事,确保他是你所知道的最佳解决人选。
  3. 你需要一个好的标题,用清晰的短句描述你遇到的问题
  4. 至关重要的正文

    (1)用清晰的语言描述你遇到的问题  (2)提供软件环境,包括操作系统、数据库等相关软件及其版本号  (3)问题是否可以重现,采用什么方式重现  (4)采用了什么措施解决问题,最终结果(可提供日志、程序、截图等描述)  (5)尽可能提供问题相关的可分析文件,包括日志、截图和Core dump等  (6)不要长篇大论,简明扼要,描述主要问题 
  5. 最后,不要忘了说请和谢谢,毕竟你需要别人帮助你解决问题,没人欠你什么。  

 

 ---EOF---

上面这段来自:http://www.cnblogs.com/chijianqiang/archive/2012/09/24/question.html

Tags: 问题, 提问

Records:161234