吐槽编程问题的五张漫画

大家可能知道,我时常活跃于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) rn
    FROM    (
        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) start
            FROM    (
                SELECT  TOP 400000
                    id, body, score
                FROM    posts
                ORDER BY
                    id DESC
                UNION
                SELECT  TOP 4000000
                    postId, text, score
                FROM    comments
                ORDER BY
                    id DESC
                ) q
            WHERE   body LIKE '%://xkcd.com/[0-9]%'
            ) q
        ) q (id, score, link)
    ) q
WHERE   rn = 1
ORDER BY
    cnt DESC

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

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

#5 随机数 (10次引用)

image

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

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次引用)

image

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[&#039;words&#039;];
    $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[\&#039;PHP_SELF\&#039;]\" ";  **<--Line 12**
    echo "<input type=\"text\" name=\"num\"";
    echo "<input type=\"submit\" value=\"Press Me! \"";
    $input=$_GET[&#039;num&#039;];
    goto b;

b:  if($input==$array[0] && $array!=NULL)
    {
        array_pop($array);
        goto a;
    }
    elseif($array!=NULL)
    {
        goto a;
    }
else
    break;
?>

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

虽然楼主声明不要在GOTO上挑三拣四,不过说了也白说,被顶最多的评论就链接到上面那篇漫画。

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

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

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

使用正则验证密码复杂度

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

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

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

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

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

aMMericano11 - true
aMmeRican1o1 - false

我希望第二个密码也能通过验证,当然还需要特殊字符的验证。

谁能帮帮我吗?

问题在于,这个正则显然不能允许密码短语的使用,所以下面的评论用XKCD的链接巧妙地指出了这一点。

#2 前人的智慧 (16次引用)
image

所谓挫败感:在网上搜索一个罕见的、奇特的问题,只找到一个帖子,描述的问题一模一样,但是最后解决了没有,如何解决的,没有下文。

被顶最多的评论来自这个帖子:

部署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次引用)

image

一个没安好心的老妈给他儿子取的这个名字,只要输入到未防范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[&#039;REQUEST_METHOD&#039;] == &#039;POST&#039;)
{
    // Check to see if username field is null
    if (!empty($_POST[&#039;username&#039;])) {

    // Connect to the server using credentials
    $con = mysql_connect(&#039;localhost&#039;,&#039;root&#039;,&#039;sqlcool1&#039;);
    // If the connection was not successful
    if (!$con){
        echo &#039;OUCH&#039;;
        die(&#039;Could not connect: &#039;.mysql_error());
    }
    // Select the correct database from the server
    $db = mysql_select_db(&#039;injectme&#039;,$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(&#039;SELECT * FROM user WHERE username = "&#039; . $_POST[&#039;username&#039;] . &#039;"&#039;);
    $row = mysql_fetch_row($sql);

    // compare $row["password"] to $_post["password"]
    // if they match it&#039;s good: log them in
    // if not, they&#039;re beat: don&#039;t log them in

    if ($_POST["username"] == $row[1] && $_POST["password"] == $row[2]) {
    // do something to let them know that it worked
    echo(&#039;<html>
        <head>
            <meta http-equiv="refresh" content="3; url=search.php">
        </head>
        <body>
            <p style="color:green">logged in</p>
        </body>
    </html>&#039;);
    } else {
        // do something to let them know it didn&#039;t work
        echo(&#039;<p style="color: red">Invalid username or password.</p>&#039;);
        echo(&#039;<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>&#039;);
    }
    //Close the connected session with the server
    mysql_close($con);

    } else {

        // Repost Form
        echo (&#039;<p style="color: red"> No username / password provided.</p>&#039;);
        echo(&#039;<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>&#039;);
        }
    }
    else
    {
        echo(&#039;<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>&#039;);
    }
?>

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值