易栈网-膘叔

浏览模式: 标准 | 列表 | 图文
转:程序员,你会问问题吗?

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

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

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

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

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

如果得不到回答

如果得不到回答,请不要认为我们不想帮你,有时只是因为被问到的小组成员的确不知道答案。没有回复不等于不被理睬,当然必须承认从外面很难看出两者的差别。
一般而言,直接将问题再张贴一次不好,这会被视为毫无意义的骚扰。耐心一点,知道你问题答案的人可能生活在不同的时区,有可能正在睡觉,也有可能你的问题一开始就没有组织好。
还有其它资源可以寻求帮助,通常是在一些面向新手的资源中。
有许多在线与本地的用户组织,虽然它们自己不编写任何软件,但是对软件很热心。这些用户组通常因互助和帮助新手而形成。
还有众多大小商业公司提供签约支持服务(红帽与 SpikeSource 是两家最出名的,还有许多其它的)。别因为要付点钱才有支持就感到沮丧!毕竟,如果你车子的汽缸垫烧了,你多半还得花钱找个修理店把它弄好。即使软件没花你一分钱,你总不能指望服务支持都是免费的。
象 Linux 这样流行的软件,每个开发者至少有一万个以上的用户,一个人不可能应付这么多用户的服务要求。记住,即使你必须付费才能得到支持,也比你还得额外花钱买软件要少得多(而且对封闭源代码软件的服务支持与开源软件相比通常还要贵一点,也要差一点)。

如何更好地回答
态度和善一点。问题带来的压力常使人显得无礼或愚蠢,其实并不是这样。
对初犯者私下回复。 对那些坦诚犯错之人没有必要当众羞辱,一个真正的新手也许连怎么搜索或在哪找 FAQ 都不知道。
如果你不确定,一定要说出来! 一个听起来权威的错误回复比没有还要糟,别因为听起来象个专家好玩就给别人乱指路。要谦虚和诚实,给提问者与同行都树个好榜样。
如果帮不了忙,别妨碍。 不要在具体步骤上开玩笑,那样也许会毁了用户的安装──有些可怜的呆瓜会把它当成真的指令。
探索性的反问以引出更多的细节。 如果你做得好,提问者可以学到点东西──你也可以。试试将很差的问题转变成好问题,别忘了我们都曾是新手。
尽管对那些懒虫报怨一声“读读该死的手册”(RTFM)是正当的,指出文档的位置(即使只是建议做个谷歌关键词搜索)会更好
如果你决意回答,给出好的答案。 当别人正在用错误的工具或方法时别建议笨拙的权宜之计,应推荐更好的工具,重新组织问题。
帮助你的社区从中学习。当回复一个好问题时,问问自己 “如何修改相关文件或 FAQ 文档以免再次解答同样的问题?”,接着再向文档维护者发一份补丁。
如果你是在研究一番后才做出的回答,展现你的技巧而不是直接端出结果。毕竟“授人以鱼,不如授人以渔”。

最后,转原文吧。。。

由于一直从事技术和平台产品方面的工作,我们部门经常会收到公司内外同事和同仁的问题邮件,有些好的问题能让你发现自己技术上的缺陷、产品的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

反向代理增加:play.golang.org

反向代理增加:play.golang.org

反向代理服务器增加play.golang.org,网址是goplay.neatcn.com

昨天终于收到通信管理局的邮件了,我最后一个域名的备案已经被注销了。其实在我的网站迁到国外去之后,就已经明白了。

BTW:五一玩的很开心

mac 更新时帐号突然变成:kyle_chenyujia@hotmail.com的解决方法

mac 更新时帐号突然变成:kyle_chenyujia@hotmail.com的解决方法

在更新macosx的时候,突然间发现了有一个twitter的更新,但是在点更新的时候,突然发现帐号是:kyle_chenyujia@hotmail.com,以为中了病毒,不敢升级。然后网上找了一下原来这个帐号还有一些其他渊源。

解决方法:

删除所有破解软件,如果还不能解决,彻底抹掉磁盘,重装系统!!!千万不要用Time Machine,还会出现问题的

以后请支持正版,不要用破解软件了。。。

特别注意 Transmit 和 忍者跳高(Ninjump Deluxe)

此情况已经反映给 Apple Australia 了,目前无解,以上方法为唯一方法!同时可以解决显示其他人帐号的问题

反正有几个原因,要么是因为transmit要么是因为某个ninja的APP。我肯定是没有装ninja的APP,那就明显是transmit的原因了。

网上有很多教程,比如将Contents里的那个_MASReceipt,如:

找出所有安装的破解软件,然后右键显示包内容/Contents,如果有_MASReceipt这个文件夹,那说明是通过MAS破解的,解决方法是,找一个你从app store下载的软件,我用的是PPTV,右键显示包内容,然后把Contents/_MASReceipt覆盖到你的破解软件中,就不会有更新提示了,以后如果PPTV更新了,记得再覆盖一次。

目前,我暂时没有理它。先由他去吧

mac下如何添加path

mac下如何添加path

说起添加PATH变量,恐怕很多人都说export PATH="$PATH:/newpath"就可以了嘛 。

是的,如果临时这样,当然就可以,但我总不能开一次终端就设置一下吧?export只能在当前终端下有效。。
于是找了一些资料。比如修改~/.bashrc,加入export。但新开终端也是无效的
网上有两种说法:
1、修改/etc/paths,每行一个路径即可
2、建一个~/.profile,加入export
我开始改了/etc/paths,好象无效,后来建了一个~/.profile就成功了。
至此,完毕。
接上篇: E: Sub-process /usr/bin/dpkg returned an error code

接上篇: E: Sub-process /usr/bin/dpkg returned an error code

在上篇升完PHP后,其实还附带了一些其他升级,比如,gearman也是PPA的源,当我upgrade之后,居然说有个组件需要更新,libgearman7,说原来的组件是基于libgearman6的。不能运行了,然后,所有的APT操作都无法运行,出现了: E: Sub-process /usr/bin/dpkg returned an error code 。

这,TMD太让人纠结了。最后用了另外的方法处理。。。比较恶心:

cd /var/lib/dpkg
sudo mv info info.bak
sudo mkdir info

只是这样之后,会报一些notice:

dpkg: warning: files list file for package `liblockfile1' missing, assuming package has no files currently installed.

dpkg: warning: files list file for package `liblaunchpad-integration1' missing, assuming package has no files currently installed.

dpkg: warning: files list file for package `libxau6' missing, assuming package has no files currently installed.

dpkg: warning: files list file for package `gconf-defaults-service' missing, assuming package has no files currently installed.

dpkg: warning: files list file for package `libio-string-perl' missing, assuming package has no files currently installed.

于是我还是把info.bak目录下的内容看了下。最终决定将与gearman相关的删除,重新恢复。OK一切正常。哈哈

info目录里的东西,其实就是一些更新所涉及的路径、目录等,将出错的删除,重新update一下就OK了

升级PHP至5.4(ubuntu 12.04)

升级PHP至5.4(ubuntu 12.04)

当前的虚拟机是12.04的系统,默认的PHP只有5.3.x,因为想用Trait的功能,所以就想升级了。结果。。。死活升不上。于是找了点资料,发现只要三句话:

sudo add-apt-repository ppa:ondrej/php5
sudo apt-get update
sudo apt-get upgrade

三句话一运行,世界就清静多了。只是原来自己装的一些组件就要重新编译了:redis,mongo,gearman,还有APC。因为extension_dir换了位置了。也不能直接将那些so文件拷过来。怕不正常,反正重编译一下也很快。。

如果你喜欢自己编译,也可以看这篇:https://gist.github.com/ziadoz/3130816

放假

放假

一转眼,好久没有更新博客了。

这段时间,我是给自己放假了,辞职、旅游。
一直用笔记本,颈椎伤的太厉害了。所以,我一咬牙,辞职,休息一阵。。。
同是做IT的朋友,要注意一下身体啊。。
如果最近有发博客,一定是转贴的。黑黑
MySQL中show语法

MySQL中show语法

我知道,你看到下面的内容,一定没有兴趣往下读,实在太乱了,所以我准备了两份PDF,希望你们读起来会方便一点(两种不同的排版方式,看各位喜欢了)

1、第一份,原网站的排版:uploadify-v2.1.4-www.7es.cn.rar

2、我自己整理的markdown格式的排版:a59353ca1daaaf38e0787e6145eddae9

mysql show命令

show databases;

show tables from db_name;

show columns from table_name from db_name;

show index from talbe_name [from db_name];

show status;

show variables;

show [full] processlist;

show table status [from db_name];

show grants for user;

除了status,processlist和grants外,其它的都可以带有like wild选项,它可以使用SQL的'%'和'_'字符;

show databases like '%t';

将会列出所有数据库名字末尾为't'字符的数据库

当然了,在这些sql中,你也可以用db_name.table_name来代替 table_name from db_name这样写会更简便些!

如果一个用户没有一个表的任何权限,表将不在SHOW TABLES或mysqlshow db_name中的输出中显示

大家可能还记得describe table_name ,它实现的是与show columns from db_name.table_name一样的效果

show status将可以用mysqlshow --status 来得到同样的效果

  • 列 含义
  • Name 表名
  • Type 表的类型 (ISAM,MyISAM或HEAP)
  • Row_format 行存储格式 (固定, 动态, 或压缩)
  • Rows 行数量
  • Avg_row_length 平均行长度
  • Data_length 数据文件的长度
  • Max_data_length 数据文件的最大长度
  • Index_length 索引文件的长度
  • Data_free 已分配但未使用了字节数
  • Auto_increment 下一个 autoincrement(自动加1)值
  • Create_time 表被创造的时间
  • Update_time 数据文件最后更新的时间
  • Check_time 最后对表运行一个检查的时间
  • Create_options 与CREATE TABLE一起使用的额外选项
  • Comment 当创造表时,使用的注释 (或为什么MySQL不能存取表信息的一些信息)。

SHOW FIELDS是SHOW COLUMNS一个同义词,SHOW KEYS是SHOW INDEX一个同义词。你也可以用mysqlshow db_name tbl_name或mysqlshow -k db_name tbl_name 列出一张表的列或索引。

SHOW INDEX以非常相似于ODBC的SQLStatistics调用的格式返回索引信息。下面的列被返回:

列 含义

Table 表名

Non_unique 0,如果索引不能包含重复。

Key_name 索引名

Seq_in_index 索引中的列顺序号, 从 1 开始。

Column_name 列名。

Collation 列怎样在索引中被排序。在MySQL中,这可以有值A(升序) 或NULL(不排序)。

Cardinality 索引中唯一值的数量。这可通过运行isamchk -a更改.

Sub_part 如果列只是部分被索引,索引字符的数量。NULL,如果整个键被索引。

SHOW STATUS提供服务器的状态信息(象mysqladmin extended-status一样)。输出类似于下面的显示,尽管格式和数字可以有点不同:

+--------------------------+--------+

| Variable_name | Value |

+--------------------------+--------+

| Aborted_clients | 0 |

| Aborted_connects | 0 |

| Connections | 17 |

| Created_tmp_tables | 0 |

| Delayed_insert_threads | 0 |

| Delayed_writes | 0 |

| Delayed_errors | 0 |

| Flush_commands | 2 |

| Handler_delete | 2 |

| Handler_read_first | 0 |

| Handler_read_key | 1 |

| Handler_read_next | 0 |

| Handler_read_rnd | 35 |

| Handler_update | 0 |

| Handler_write | 2 |

| Key_blocks_used | 0 |

| Key_read_requests | 0 |

| Key_reads | 0 |

| Key_write_requests | 0 |

| Key_writes | 0 |

| Max_used_connections | 1 |

| Not_flushed_key_blocks | 0 |

| Not_flushed_delayed_rows | 0 |

| Open_tables | 1 |

| Open_files | 2 |

| Open_streams | 0 |

| Opened_tables | 11 |

| Questions | 14 |

| Slow_queries | 0 |

| Threads_connected | 1 |

| Threads_running | 1 |

| Uptime | 149111 |

+--------------------------+--------+

上面列出的状态变量有下列含义:

  • Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。
  • Aborted_connects 尝试已经失败的MySQL服务器的连接的次数。
  • Connections 试图连接MySQL服务器的次数。
  • Created_tmp_tables 当执行语句时,已经被创造了的隐含临时表的数量。
  • Delayed_insert_threads 正在使用的延迟插入处理器线程的数量。
  • Delayed_writes 用INSERT DELAYED写入的行数。
  • Delayed_errors 用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。
  • Flush_commands 执行FLUSH命令的次数。
  • Handler_delete 请求从一张表中删除行的次数。
  • Handler_read_first 请求读入表中第一行的次数。
  • Handler_read_key 请求数字基于键读行。
  • Handler_read_next 请求读入基于一个键的一行的次数。
  • Handler_read_rnd 请求读入基于一个固定位置的一行的次数。
  • Handler_update 请求更新表中一行的次数。
  • Handler_write 请求向表中插入一行的次数。
  • Key_blocks_used 用于关键字缓存的块的数量。
  • Key_read_requests 请求从缓存读入一个键值的次数。
  • Key_reads 从磁盘物理读入一个键值的次数。
  • Key_write_requests 请求将一个关键字块写入缓存次数。
  • Key_writes 将一个键值块物理写入磁盘的次数。
  • Max_used_connections 同时使用的连接的最大数目。
  • Not_flushed_key_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块。
  • Not_flushed_delayed_rows 在INSERT DELAY队列中等待写入的行的数量。
  • Open_tables 打开表的数量。
  • Open_files 打开文件的数量。
  • Open_streams 打开流的数量(主要用于日志记载)
  • Opened_tables 已经打开的表的数量。
  • Questions 发往服务器的查询的数量。
  • Slow_queries 要花超过long_query_time时间的查询数量。
  • Threads_connected 当前打开的连接的数量。
  • Threads_running 不在睡眠的线程数量。
  • Uptime 服务器工作了多少秒。

关于上面的一些注释:

如果Opened_tables太大,那么你的table_cache变量可能太小。

如果key_reads太大,那么你的key_cache可能太小。缓存命中率可以用key_reads/key_read_requests计算。

如果Handler_read_rnd太大,那么你很可能有大量的查询需要MySQL扫描整个表或你有没正确使用键值的联结(join)。

SHOW VARIABLES显示出一些MySQL系统变量的值,你也能使用mysqladmin variables命令得到这个信息。如果缺省值不合适,你能在mysqld启动时使用命令行选项来设置这些变量的大多数。输出类似于下面的显示,尽管格式和数字可以有点不同:

+------------------------+--------------------------+

| Variable_name | Value |

+------------------------+--------------------------+

| back_log | 5 |

| connect_timeout | 5 |

| basedir | /my/monty/ |

| datadir | /my/monty/data/ |

| delayed_insert_limit | 100 |

| delayed_insert_timeout | 300 |

| delayed_queue_size | 1000 |

| join_buffer_size | 131072 |

| flush_time | 0 |

| interactive_timeout | 28800 |

| key_buffer_size | 1048540 |

| language | /my/monty/share/english/ |

| log | OFF |

| log_update | OFF |

| long_query_time | 10 |

| low_priority_updates | OFF |

| max_allowed_packet | 1048576 |

| max_connections | 100 |

| max_connect_errors | 10 |

| max_delayed_threads | 20 |

| max_heap_table_size | 16777216 |

| max_join_size | 4294967295 |

| max_sort_length | 1024 |

| max_tmp_tables | 32 |

| net_buffer_length | 16384 |

| port | 3306 |

| protocol-version | 10 |

| record_buffer | 131072 |

| skip_locking | ON |

| socket | /tmp/mysql.sock |

| sort_buffer | 2097116 |

| table_cache | 64 |

| thread_stack | 131072 |

| tmp_table_size | 1048576 |

| tmpdir | /machine/tmp/ |

| version | 3.23.0-alpha-debug |

| wait_timeout | 28800 |

+------------------------+--------------------------+

SHOW PROCESSLIST显示哪个线程正在运行,你也能使用mysqladmin processlist命令得到这个信息。

如果你有process权限, 你能看见所有的线程,否则,你仅能看见你自己的线程。见7.20 KILL句法。如果你不使用FULL选项,那么每个查询只有头100字符被显示出来。

SHOW GRANTS FOR user列出对一个用户必须发出以重复授权的授权命令。

mysql> SHOW GRANTS FOR root@localhost;

+---------------------------------------------------------------------+

| Grants for root@localhost |

+---------------------------------------------------------------------+

| GRANT ALL PRIVILEGES ON *.* TO 'root''localhost' WITH GRANT OPTION |

+---------------------------------------------------------------------+

1

getimagesize

getimagesize

看到这个标题,你是不是会觉得很无聊?事实上,我是想表达另外的意思。从php5.2开始,很多操作都是支持streamwrapper的功能的,所以当有一个需求:从网上下载一张图片,存到本地,并使用正确的后缀名,就需要用到getimagesize了。

$data = file_get_contents($url);
file_put_contents('xxx',$data);
$imageinfo = getimagesize(xxx);
$extension = func($imageinfo); //获取文件属性
rename('xxx','xxx.???');

以前的逻辑可以是这样。但现在可以简化一下

$data = file_get_contents($url);
$imageinfo = getimagesize('data:image/;base64,'.base64_encode($data));
$extension = func($imageinfo); //获取文件属性
file_put_contents('xxx.'.$extension , $data);
nginx 的resolv.conf经常被自动清空

nginx 的resolv.conf经常被自动清空

有时候,服务器上用的DNS其实并不是我想要的,有些DNS其实速度慢,而且解析更慢,更新也慢。所以这时候就想要换一个快一点的dns了。

第一个想到要改的是resolv.conf,在里面加入nameserver 114.114.114.114,但改完后,过一阵子看,却发现文件又空了。找了下资料,原来不能这样。。

直接改/etc/network/interface ,在里面加入:dns-nameservers 114.114.114.114 8.8.8.8

看好了,这里是dns开头,而且是复数。完了重启networking即可

参考:http://blog.jsdan.com/3743

因为上面是台湾网站,如果打不开,请看这个PDF:8f51ddd0eb61d1508f86af01065fa7dd