吐槽編程問題的五張漫畫

jopen 10年前發布 | 11K 次閱讀 編程

大家可能知道,我時常活躍于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次引用)

d1.jpg

引用這篇漫畫的自然是吐槽各種隨機數生成器坑爹的帖子,其中被頂最多的是這一篇:

161803398是一個特殊的數嗎?Math.Random()里用到的


我猜答案可能是「數學原理,不解釋」,但我還是希望有人能通俗地解釋一下此中玄機…

起因是,我今天在鼓搗BCL的源代碼,想看看以前用過的那些類是怎么實現的。因為以前沒考慮過如何生成(偽)隨機數的問題,所以我打算看看在這兒是怎么實現的。

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

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

每次生成Random()類的隨機數種子都要用到這個MSEED值。

這個神奇的數字:161803398,我想破頭也想不出它是怎么來的。它不是個質數,也不是2的某次冪,跟哪個稍微有點意義的數字都不搭邊兒。我也查了它的二進制和十六進制形式,怎么看都只是一個沒有特征的數字。

我Google過了,沒有結果。


這個數來自于Phi值(黃金分割比)。
161803398 = 1.61803398 * 10^8 ≈ φ * 10^8

有關黃金分割比
另外,強烈推薦數學愛好者讀讀這一篇
我還找到一篇含同樣觀點的關于隨機數生成器的學術論文。(見53頁)

也就是說,出于某些(也許是有道理的)原因,黃金分割比貌似很適合拿來做隨機數生成器的種子……有意思的是,上面引用的那篇論文,編程語言中的偽隨機數生成器,第一頁就引用了上面這篇漫畫。

 

#4 goto (10次引用)

d2.jpg

goto是某些編程語言中的一個構造體(construct),用于跳過所有正在執行的循環和處理,無條件跳轉到程序的任意位置。很多程序員(顯然還有迅猛龍)都認為這是個很糟的編程習慣。

被頂最多的評論來自這個帖子:

解析錯誤:Unexpected &#8220;


我遇到了這么一條錯誤信息: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

源代碼如下:

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

d3.jpg

相比用一串隨機字符(很難記)當密碼,Randall建議使用基于自然語言的密碼短語(passphrase),既安全又好記。

得票最多的評論來自這個求助帖:

使用正則驗證密碼復雜度


我在寫一個javascript的正則表達式,用于驗證密碼的復雜度,密碼必須符合這些條件:

至少包含12個字符
至少包含一個以下字符:* ^ !
至少包含兩個大寫字母
至少包含兩個數字
至少包含一個小寫字母

我在網上找到一個例子,修改了一下:

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

但是還缺特殊字符的驗證,而且兩個大寫字母和兩個數字必須連在一起才能通過驗證,結果如下:

aMMericano11 - true
aMmeRican1o1 - false

我希望第二個密碼也能通過驗證,當然還需要特殊字符的驗證。

誰能幫幫我嗎?

問題在于,這個正則顯然不能允許密碼短語的使用,所以下面的評論用XKCD的鏈接巧妙地指出了這一點。

 

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

d4.jpg

所謂挫敗感:在網上搜索一個罕見的、奇特的問題,只找到一個帖子,描述的問題一模一樣,但是最后解決了沒有,如何解決的,沒有下文。

被頂最多的評論來自這個帖子:

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

d5.jpg

一個沒安好心的老媽給他兒子取的這個名字,只要輸入到未防范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注入,結果卻做不到……

原文鏈接: EXPLAIN EXTENDED   翻譯: 伯樂在線 - 輕如紙張
譯文鏈接: http://blog.jobbole.com/73411/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!