吐槽编程问题的五张漫画
大家可能知道,我时常活跃于Stack Overflow——当今最热门的程序员问答网站。该网站的好同志们公开了他们的数据,任何人都可以通过这个页面查询他们的数据库:data.stackexchange.com
那里的很多问题和回答都配上了XKCD(由Randall Munroe 创作)的漫画链接,于是我决定扒一扒,哪几篇漫画最爱被程序员拿来吐槽他们遇到的奇葩事。
我使用的查询很简单:
SELECT link, cnt, id [Post Link], score
FROM (SELECT link, id, score,COUNT(*) OVER (PARTITION BY link) cnt,ROW_NUMBER() OVER (PARTITION BY link ORDER BY score DESC) rnFROM (SELECT id, score,'http' + SUBSTRING(start, 1, PATINDEX('%/%', SUBSTRING(start, 13, 30)) + 12)FROM (SELECT id, score,SUBSTRING(body, PATINDEX('%://xkcd.com/[0-9]%', body), 20) startFROM (SELECT TOP 400000id, body, scoreFROM postsORDER BYid DESCUNIONSELECT TOP 4000000postId, text, scoreFROM commentsORDER BYid DESC) qWHERE body LIKE '%://xkcd.com/[0-9]%') q) q (id, score, link)) q
WHERE rn = 1
ORDER BYcnt DESC
TOP语句是用来限制查询范围的,因为他们的服务提供商不允许全文索引,所以不这样的话,就会请求超时。这个查询只能涵盖最近的帖子和评论,所以一些经典的帖子可能被忽略了。不过,这样已经足够说明问题了。
你可以从这儿看全部结果,本文只讨论排名最前的五篇。
#5 随机数 (10次引用)
引用这篇漫画的自然是吐槽各种随机数生成器坑爹的帖子,其中被顶最多的是这一篇:
161803398是一个特殊的数吗?Math.Random()里用到的
我猜答案可能是「数学原理,不解释」,但我还是希望有人能通俗地解释一下此中玄机…
起因是,我今天在鼓捣BCL的源代码,想看看以前用过的那些类是怎么实现的。因为以前没考虑过如何生成(伪)随机数的问题,所以我打算看看在这儿是怎么实现的。
全部代码在此:http://referencesource.microsoft.com/#mscorlib/system/random.cs#29
private const int MSEED = 161803398;
每次生成Random()类的随机数种子都要用到这个MSEED值。
这个神奇的数字:161803398,我想破头也想不出它是怎么来的。它不是个质数,也不是2的某次幂,跟哪个稍微有点意义的数字都不搭边儿。我也查了它的二进制和十六进制形式,怎么看都只是一个没有特征的数字。
我Google过了,没有结果。
这个数来自于Phi值(黄金分割比)。
161803398 = 1.61803398 10^8 ≈ φ 10^8
有关黄金分割比
另外,强烈推荐数学爱好者读读这一篇。
我还找到一篇含同样观点的关于随机数生成器的学术论文。(见53页)
也就是说,出于某些(也许是有道理的)原因,黄金分割比貌似很适合拿来做随机数生成器的种子……有意思的是,上面引用的那篇论文,编程语言中的伪随机数生成器,第一页就引用了上面这篇漫画。
#4 goto (10次引用)
goto是某些编程语言中的一个构造体(construct),用于跳过所有正在执行的循环和处理,无条件跳转到程序的任意位置。很多程序员(显然还有迅猛龙)都认为这是个很糟的编程习惯。
被顶最多的评论来自这个帖子:
解析错误:Unexpected “
我遇到了这么一条错误信息:Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:xampphtdocsgame.php on line 12
源代码如下:
<?php$words=$_GET['words'];$array=explode(",",$words);$j=count($array)-1;goto a;a: shuffle($array);$num=$array[0];echo "The Number Is = $num";echo "<br />";echo "Please Enter The Number Within 10 Seconds";echo "<form method=\"get\" action=\"$_SERVER[\'PHP_SELF\']\" "; **<--Line 12**echo "<input type=\"text\" name=\"num\"";echo "<input type=\"submit\" value=\"Press Me! \"";$input=$_GET['num'];goto b;b: if($input==$array[0] && $array!=NULL){array_pop($array);goto a;}elseif($array!=NULL){goto a;}
elsebreak;
?>
请别揪着GOTO不放,告诉我怎么解决这个错误就好,我只是在试验用这段代码解决个问题。
虽然楼主声明不要在GOTO上挑三拣四,不过说了也白说,被顶最多的评论就链接到上面那篇漫画。
#3 密码强度 (11次引用)
相比用一串随机字符(很难记)当密码,Randall建议使用基于自然语言的密码短语(passphrase),既安全又好记。
得票最多的评论来自这个求助帖:
使用正则验证密码复杂度
我在写一个javascript的正则表达式,用于验证密码的复杂度,密码必须符合这些条件:
至少包含12个字符
至少包含一个以下字符:* ^ !
至少包含两个大写字母
至少包含两个数字
至少包含一个小写字母
我在网上找到一个例子,修改了一下:
(?=.*[0-9]{2,})(?=.*[a-z])(?=.*[A-Z]{2,}).{12,}
但是还缺特殊字符的验证,而且两个大写字母和两个数字必须连在一起才能通过验证,结果如下:
aMMericano11 - true
aMmeRican1o1 - false
我希望第二个密码也能通过验证,当然还需要特殊字符的验证。
谁能帮帮我吗?
问题在于,这个正则显然不能允许密码短语的使用,所以下面的评论用XKCD的链接巧妙地指出了这一点。
#2 前人的智慧 (16次引用)
所谓挫败感:在网上搜索一个罕见的、奇特的问题,只找到一个帖子,描述的问题一模一样,但是最后解决了没有,如何解决的,没有下文。
被顶最多的评论来自这个帖子:
部署EAR时报错:Class bytes found but defineClass()failed for
今天我尝试把一部分使用EJB 1.1的老代码部署到Weblogic 10.3.6,但总是报这个奇怪的错误:Class bytes found but defineClass()failed for
类都被找到了,还能是什么问题?
搞定了,项目代码是用JDK 1.7编译的,但是Weblogic服务器安装的是1.6。
我用JDK 1.6重新编译了一下,然后就能用了!
我把这件事记在这儿,因为这个问题在网上实在太难找到答案了。
发帖的这位显然花了很多时间才找到这个问题的解决办法,于是他好心地把问题和答案都发到了Stack Overflow上。
此答案的评论只是一句「谢谢」,外加这篇漫画的链接。从这条评论和这篇帖子的顶贴数来看,它至少帮到了三个人。
说真的,干得漂亮!大家都向Jarrod Roberson看齐吧。
最后,获得了96次引用的大热门,是这篇:
1 老妈的逆袭 (96次引用)
一个没安好心的老妈给他儿子取的这个名字,只要输入到未防范SQL注入的数据库里,就能把数据库搞坏。
这种事不是第一次听说了,你可以读一读这篇真人真事:搜索一个叫Null的客户把程序整崩了
同时,也有一些人,爱尔兰血统的人(可能是有Null这个名字—译者注),在注册网站的时候,被矫枉过正的SQL注入预防手段弄得很不高兴。
被顶最多的评论来自这个帖子:
SQL注入演示页面
我在为我的学生们创建一个SQL注入演示页面。我写了一个登录页面,但是我好像没法进行注入。下面是我写的页面代码。我已经试过在username字段写入多个语句以绕过SQLi。我还能想到的就只有使用子查询,或者把我的代码漏洞再搞大一点。
<?php // Check to see if there was a request method that is a post type
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{// Check to see if username field is nullif (!empty($_POST['username'])) {// Connect to the server using credentials$con = mysql_connect('localhost','root','sqlcool1');// If the connection was not successfulif (!$con){echo 'OUCH';die('Could not connect: '.mysql_error());}// Select the correct database from the server$db = mysql_select_db('injectme',$con);// Pass a sql query through the table to pull the user field that was entered in the form// Return the results in an array$sql = mysql_query('SELECT * FROM user WHERE username = "' . $_POST['username'] . '"');$row = mysql_fetch_row($sql);// compare $row["password"] to $_post["password"]// if they match it's good: log them in// if not, they're beat: don't log them inif ($_POST["username"] == $row[1] && $_POST["password"] == $row[2]) {// do something to let them know that it workedecho('<html><head><meta http-equiv="refresh" content="3; url=search.php"></head><body><p style="color:green">logged in</p></body></html>');} else {// do something to let them know it didn't workecho('<p style="color: red">Invalid username or password.</p>');echo('<form name="login" action="login.php" method="POST">Username: <input type="text" name="username"><br>Password: <input type="password" name="password"><br><input type="submit" name="submit_button" value="Submit"><button type="submit" formaction="register.php">Register</button></form>');}//Close the connected session with the servermysql_close($con);} else {// Repost Formecho ('<p style="color: red"> No username / password provided.</p>');echo('<form name="login" action="login.php" method="POST">Username: <input type="text" name="username"><br>Password: <input type="password" name="password"><br><input type="submit" name="submit_button" value="Submit"><button type="submit" formaction="register.php">Register</button></form>');}}else{echo('<form name="login" action="login.php" method="POST">Username: <input type="text" name="username"><br>Password: <input type="password" name="password"><br><input type="submit" name="submit_button" value="Submit"><button type="submit" formaction="register.php">Register</button></form>');}
?>
这位作者很奇葩地想故意把代码写得能被SQL注入,结果却做不到……
吐槽编程问题的五张漫画相关推荐
- 要将五张100元的大钞票,换成等值的50元,20元,10元,5元一张的小钞票,每种面值至少1张,编程输出所有可能的换法,程序应适当考虑减少重复次数
源程序: 要将五张100元的大钞票,换成等值的50元,20元,10元,5元一张的小钞票,要求换成30张小钞票,每种面值的至少一张,编程输出所有可能的换法,程序应适当考虑减少重复次数. #include ...
- C语言编程>第五周 ① 目前人民币共有以下几种面值(不包括角和): 1元 2元 5元 10元 20元 50元 100元 编写一个函数计算金额“X“需要多少张面值为n 元的纸币。
例题:目前人民币共有以下几种面值(不包括角和):1元 2元 5元 10元 20元 50元 100元 编写一个函数计算金额"X"需要多少张面值为n 元的纸币. 代码如下: /*代码分 ...
- C语言编程>第五周 ⑤ 编写一个程序,从键盘输入X,Y,Z 3个数, 编写函数计算3个数的立方和并返回计算结果。
例题:编写一个程序,从键盘输入X,Y,Z 3个数, 编写函数计算3个数的立方和并返回计算结果. 第一种方法: 代码如下: #include <stdio.h> int abc(int,in ...
- /* * 编程题第五题(20分): 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“
题目: 编程题第五题(20分): 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***************** 所谓" ...
- 我的世界java版不会玩_我的世界:五张MC趣图,Java版玩家永远不懂基岩版玩家的痛...
<我的世界>1.17版本目前已经更新了8个快照版本,在玩家的期望中,Mojang总算是加入了新的洞穴--噪声洞穴(Noise Caves).虽然这属于洞穴与山崖更新的一大步,Java版玩家 ...
- python编程思维导图_用来梳理 Python 编程核心知识15张思维导图
原标题:用来梳理 Python 编程核心知识15张思维导图 小编这次在逛论坛的时候,无意中发现了一份python的武功秘籍,也就是一份思维导图,堪称业界经典! 思维导图可以有力地激发你的联想,通过一个 ...
- 【转】判断五张牌是不是一个顺子
转自:http://hi.baidu.com/erennetwork/blog/item/f2942435d834e650ad4b5f8a.html 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5 ...
- 这五张PPT告诉你,如何打造无人驾驶“最强大脑”
"英特尔在谈无人驾驶,会成为汽车制造商吗?NO!我们要为无人驾驶提供从车.连接到云的'最强大脑'." 在昨天于北京举行的英特尔无人驾驶分享会上,英特尔无人驾驶事业部中国区市场总监徐 ...
- ASP.NET-权限管理五张表
ASP.NET 权限管理五张表 权限管理的表(5张表) 每个表里面必有的一些信息 序号 名称 字段 类型 主键 默认值 是否为空 备注 1 用户ID ID INT 是 ...
最新文章
- C++STL中的vector
- Java http方式提交短信到短信网关
- php 使用压缩css文件,PHP-使用GZIP压缩静态CSS文件
- vim grep配置及使用
- linux环境OpenRASP使用教程,集成openRASP与攻击测试
- 《JavaScript高级程序设计》红宝书第二遍阅读(动手实践)
- Ubuntu系统桌面任务栏和启动器全部消失解决方案
- 计算机视觉可分计算成像学()五大类,中国大学 MOOC_化工过程与控制仿真实习_期末考试选修课答案...
- eclipse svn 分支合并到主干
- python画正切函数图像_python的pygal模块绘制反正切函数图像方法
- VS2019下cmake项目:利用ELAS方法计算双目视差
- 正则表达式及bash脚本(一)
- 游戏角色/3D电影逼真写实角色是如何制作出来的?
- 天影字幕_天影字幕(GeniusCG) V 12.50 官方版
- 易基因|文献科普:DNA甲基化测序揭示DNMT3a在调控T细胞同种异体反应中的关键作用
- 扫码枪回车键条码_扫描枪怎么设置自动换行 条码扫描枪不自动回车怎么设置...
- 诸葛:大数据带来哪四种思维
- Influx 安装、配置
- 【java毕业设计】基于java+Eclipse +SQL Server的工厂进销存管理系统设计与实现(毕业论文+程序源码)——工厂进销存管理系统
- bim计算机管理室内设计,如何基于BIM进行室内设计?