吐槽编程问题的五张漫画

大家可能知道,我时常活跃于Stack Overflow——当今最热门的程序员问答网站。该网站的好同志们公开了他们的数据,任何人都可以通过这个页面查询他们的数据库:data.stackexchange.com

那里的很多问题和回答都配上了XKCD(由Randall Munroe 创作)的漫画链接,于是我决定扒一扒,哪几篇漫画最爱被程序员拿来吐槽他们遇到的奇葩事。

我使用的查询很简单:

  1. SELECT  link, cnt, id [Post Link], score
  2. FROM    (
  3.     SELECT  link, id, score,
  4.         COUNT(*) OVER (PARTITION BY link) cnt,
  5.         ROW_NUMBER() OVER (PARTITION BY link ORDER BY score DESC) rn
  6.     FROM    (
  7.         SELECT  id, score,
  8.             ‘http’ + SUBSTRING(start, 1, PATINDEX(‘%/%’, SUBSTRING(start, 13, 30)) + 12)
  9.         FROM    (
  10.             SELECT  id, score,
  11.                 SUBSTRING(body, PATINDEX(‘%://xkcd.com/[0-9]%’, body), 20) start
  12.             FROM    (
  13.                 SELECT  TOP 400000
  14.                     id, body, score
  15.                 FROM    posts
  16.                 ORDER BY
  17.                     id DESC
  18.                 UNION
  19.                 SELECT  TOP 4000000
  20.                     postId, text, score
  21.                 FROM    comments
  22.                 ORDER BY
  23.                     id DESC
  24.                 ) q
  25.             WHERE   body LIKE ‘%://xkcd.com/[0-9]%’
  26.             ) q
  27.         ) q (id, score, link)
  28.     ) q
  29. WHERE   rn = 1
  30. ORDER BY
  31.     cnt DESC

TOP语句是用来限制查询范围的,因为他们的服务提供商不允许全文索引,所以不这样的话,就会请求超时。这个查询只能涵盖最近的帖子和评论,所以一些经典的帖子可能被忽略了。不过,这样已经足够说明问题了。

你可以从这儿看全部结果,本文只讨论排名最前的五篇。

#5 随机数 (10次引用)

1

引用这篇漫画的自然是吐槽各种随机数生成器坑爹的帖子,其中被顶最多的是这一篇:

161803398是一个特殊的数吗?Math.Random()里用到的


我猜答案可能是「数学原理,不解释」,但我还是希望有人能通俗地解释一下此中玄机…

起因是,我今天在鼓捣BCL的源代码,想看看以前用过的那些类是怎么实现的。因为以前没考虑过如何生成(伪)随机数的问题,所以我打算看看在这儿是怎么实现的。

全部代码在此:http://referencesource.microsoft.com/#mscorlib/system/random.cs#29

  1. <code>private const int MSEED = 161803398; </code>

次生成Random()类的随机数种子都要用到这个MSEED值。

这个神奇的数字:161803398,我想破头也想不出它是怎么来的。它不是个质数,也不是2的某次幂,跟哪个稍微有点意义的数字都不搭边儿。我也查了它的二进制和十六进制形式,怎么看都只是一个没有特征的数字。

我Google过了,没有结果。


这个数来自于Phi值(黄金分割比)。
161803398 = 1.61803398 * 10^8 ≈ φ * 10^8

有关黄金分割比
另外,强烈推荐数学爱好者读读这一篇
我还找到一篇含同样观点的关于随机数生成器的学术论文。(见53页)

也就是说,出于某些(也许是有道理的)原因,黄金分割比貌似很适合拿来做随机数生成器的种子……有意思的是,上面引用的那篇论文,编程语言中的伪随机数生成器,第一页就引用了上面这篇漫画。

#4 goto (10次引用)

2

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:\xampp\htdocs\game.php on line 12

源代码如下:

  1. <?php
  2.     $words=$_GET[‘words’];
  3.     $array=explode(“,”,$words);
  4.     $j=count($array)-1;
  5.     goto a;
  6. a:  shuffle($array);
  7.     $num=$array[0];
  8.     echo “The Number Is = $num”;
  9.     echo “”;
  10.     echo “Please Enter The Number Within 10 Seconds”;
  11.     echo “<form method=\”get\” action=\”$_SERVER[\’PHP_SELF\’]\” “;  **<–Line 12**
  12.     echo “<input type=\”text\” name=\”num\””;
  13.     echo “<input type=\”submit\” value=\”Press Me! \””;
  14.     $input=$_GET[‘num’];
  15.     goto b;
  16. b:  if($input==$array[0] && $array!=NULL)
  17.     {
  18.         array_pop($array);
  19.         goto a;
  20.     }
  21.     elseif($array!=NULL)
  22.     {
  23.         goto a;
  24.     }
  25. else
  26.     break;
  27. ?>

请别揪着GOTO不放,告诉我怎么解决这个错误就好,我只是在试验用这段代码解决个问题。

#3 密码强度 (11次引用)

相比用一串随机字符(很难记)当密码,Randall建议使用基于自然语言的密码短语(passphrase),既安全又好记。

得票最多的评论来自这个求助帖:

使用正则验证密码复杂度


我在写一个javascript的正则表达式,用于验证密码的复杂度,密码必须符合这些条件:

至少包含12个字符
至少包含一个以下字符:* ^ !
至少包含两个大写字母
至少包含两个数字
至少包含一个小写字母

我在网上找到一个例子,修改了一下:

  1. (?=.*[0-9]{2,})(?=.*[a-z])(?=.*[A-Z]{2,}).{12,}

但是还缺特殊字符的验证,而且两个大写字母和两个数字必须连在一起才能通过验证,结果如下:

  1. aMMericano11 – true
  2. 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。我还能想到的就只有使用子查询,或者把我的代码漏洞再搞大一点。

  1. <?php // Check to see if there was a request method that is a post type
  2. if ($_SERVER[‘REQUEST_METHOD’] == ‘POST’)
  3. {
  4.     // Check to see if username field is null
  5.     if (!emptyempty($_POST[‘username’])) {
  6.     // Connect to the server using credentials
  7.     $con = mysql_connect(‘localhost’,’root’,’sqlcool1′);
  8.     // If the connection was not successful
  9.     if (!$con){
  10.         echo ‘OUCH’;
  11.         die(‘Could not connect: ‘.mysql_error());
  12.     }
  13.     // Select the correct database from the server
  14.     $db = mysql_select_db(‘injectme’,$con);
  15.     // Pass a sql query through the table to pull the user field that was entered in the form
  16.     // Return the results in an array
  17.     $sql = mysql_query(‘SELECT * FROM user WHERE username = “‘ . $_POST[‘username’] . ‘”‘);
  18.     $row = mysql_fetch_row($sql);
  19.     // compare $row[“password”] to $_post[“password”]
  20.     // if they match it’s good: log them in
  21.     // if not, they’re beat: don’t log them in
  22.     if ($_POST[“username”] == $row[1] && $_POST[“password”] == $row[2]) {
  23.     // do something to let them know that it worked
  24.     echo(‘<html>
  25.         <head>
  26.             <meta http-equiv=”refresh” content=”3; url=search.php”>
  27.         </head>
  28.         <body>
  29.             <p style=”color:green”>logged in</p>
  30.         </body>
  31.     </html>’);
  32.     } else {
  33.         // do something to let them know it didn’t work
  34.         echo(‘<p style=”color: red”>Invalid username or password.</p>’);
  35.         echo(‘<form name=”login” action=”login.php” method=”POST”>
  36.             Username: <input type=”text” name=”username”>
  37.             Password: <input type=”password” name=”password”>
  38.             <input type=”submit” name=”submit_button” value=”Submit”>
  39.             <button type=”submit” formaction=”register.php”>Register</button>
  40.         </form>’);
  41.     }
  42.     //Close the connected session with the server
  43.     mysql_close($con);
  44.     } else {
  45.         // Repost Form
  46.         echo (‘<p style=”color: red”> No username / password provided.</p>’);
  47.         echo(‘<form name=”login” action=”login.php” method=”POST”>
  48.             Username: <input type=”text” name=”username”>
  49.             Password: <input type=”password” name=”password”>
  50.             <input type=”submit” name=”submit_button” value=”Submit”>
  51.             <button type=”submit” formaction=”register.php”>Register</button>
  52.             </form>’);
  53.         }
  54.     }
  55.     else
  56.     {
  57.         echo(‘<form name=”login” action=”login.php” method=”POST”>
  58.             Username: <input type=”text” name=”username”>
  59.             Password: <input type=”password” name=”password”>
  60.             <input type=”submit” name=”submit_button” value=”Submit”>
  61.             <button type=”submit” formaction=”register.php”>Register</button>
  62.         </form>’);
  63.     }
  64. ?>

这位作者很奇葩地想故意把代码写得能被SQL注入,结果却做不到……

原文链接: EXPLAIN EXTENDED   翻译: 伯乐在线 – 轻如纸张

译文链接: http://blog.jobbole.com/73411/

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据