• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Onway

            我是一只菜菜菜菜鳥...
            posts - 61, comments - 56, trackbacks - 0, articles - 34

            一,簡介
            一個歷史項目里面用了c# .net 2.0的FtpWebRequest進行文件上傳;ftp server在各現場用的應該都是Filezilla。
            因業務發展,需要上傳大文件(500M以上吧),某現場就出現了上傳失敗的情況。

            二,網絡問題
            最開始的代碼里面并沒有記錄上傳失敗的具體原因,或者說log記錄沒能準確定位問題。
            代碼修改后還是沒能準確定位問題。
            但從log判斷,似乎是網絡斷開造成的。
            這想到可能現場網絡不穩定,有瞬斷情況。

            三,斷點續傳
            聽過斷點續傳,在百度找了些代碼,修改一下封裝好嵌到項目里面。
            當時只在網絡暢通的情況下測試過,代碼也沒還checkin,發現場用戶也試試。
            反饋還是不行。
            看log更加迷糊了,堆棧顯示在FtpWebRequest.GetRequestStream.Close里面拋出來的異常。
            想不明白啊。

            四,重現爛網絡
            去過現場出差的同事反應,現場的網絡真的好爛。
            這想到怎么去模擬一個爛網絡出來。
            找到一個程序叫clumsy,http://jagt.github.io/clumsy/
            設置延時50ms,50%的丟包率,丫的那個異常堆棧重現出來了。
            異常信息如下:
            這應該說的,連接已經斷開了,再關的話就報錯了。
            程序調試進去發現,最早引發異常的是FtpWebRequest.GetRequestStream.Write,程序里面是有catch,但只是記錄了失敗的位置偏移以便下次重傳,也沒有去記錄失敗原因。
            當時close的調用是放在finally塊里面的,這個close引發的異常導致續傳沒能繼續執行,log記錄的堆棧也就是從這里開始。

            五,重現了也沒個屁用啊
            既然close不掉,那就直接跳到FtpWebRequest.GetResponse.Close好了。
            還真不報異常了,GetResponse就直接阻塞了,一直塞到ftp server都超時斷開了,還沒返回。
            看了一下msdn,說好的FtpWebRequest.Timeout咋的沒生效呢?FtpWebRequest.ReadWriteTimeout可是好好的呢。
            google+stackoverflow也沒找到解決,倒是找到一些吐槽FtpWebRequest和Ftp庫推薦的。
            莫非還真得換庫或者直接調些ftp命令?
            同時stackoverflow發了第一個問題,我只想知道為什么不超時也不返回,因為我連GetResponse.Close都不調用就直接開始下一次重傳的話,會報另一個異常如下:
            不造是否英語太爛,或者是問題沒到點子上,問題沉了。

            6,似乎只能傻逼了
            下班路上想到,出現異常的時候,一個close也不調用,無論是否重新連接,因為網絡已經不通了,server應該還hold住一個連接,把文件鎖住了。
            這應該就是上面異常的情況,文件被鎖了,新連接就沒法操作這個文件,看server log,確實有這個cann't access file的記錄。
            那很好,client出異常了,等一個足夠長的時間,等到server將連接斷開就好了,close也就不管了。
            但想想這也太傻逼了啊,這得等到什么時候啊。

            7,也算徹底解決了,反正可以交貨了
            試了一下filezilla client,有斷點續傳功能,發現網絡異常斷開,開始續傳連接開始之前,server那個連接總會很快斷開。
            這又是怎么解析呢,不是說網絡都不通了,server那個連接是怎么放掉的呢?
            google一下,stackoverflow上看到FtpWebRequest有個Abort函數,說是斷開一個異步請求。
            一試,我同步連接也能斷開啊,網絡異常,啥都不close,直接abort,server那個連接就斷了,很快也就可以重傳了呢。

            8,來都來了
            這個abort做了什么鬼呢,想用wireshark抓個包看看,無奈不懂,十來分鐘連個filter都沒寫好。
            難道是50%的丟包不夠強悍,abort還是有數據逃出去了?
            后來百度知道wireshark在windows下要做特殊處理才能抓取本地數據包。
            無奈增加本機路由后filezilla server連不上了,最后下了個手機ftp server。
            發現abort也沒什么特殊的地方,只是通知ftp釋放控制連接和數據連接然后馬上返回,連接能不能斷掉就聽天由命了。
            100%丟包率的時候,filezilla還真有連接會鎖死文件。

            posted @ 2015-07-11 15:38 Onway 閱讀(1276) | 評論 (0)編輯 收藏

            1,三個部分
            4字節的單精度浮點數32個位分3個部分:
            1.1,從左往右第一位是符號位,0正1負;
            1.2,緊接的8個位是指數部分,不要糾結是原碼,反碼還是補碼,只是一個不帶符號位的二進制數,都一樣。取值區間是[0,255],0和255有特殊含義;取值在[1,254]的情況下,需要減去127才是真正的指數值,這時指數取值是[-126,127]。
            1.3,剩余的23位是尾數部分,用于表示浮點數的小數部分;也是一個不帶符號位的二進制數。

            2,指數部分
            2.1,當指數部分是0,且尾數部分為全0的情況,這表示浮點數0;加上符號位表示正負0。
            2.2,當指數部分是0,且尾數部分不為0的情況,其實際指數是-126,二進制表示的科學計數法的浮點數的整數部分按0解析。
            2.3,當指數部分是255,且尾數部分為全0的情況,表示一個無窮數;加上符號位表示正反無窮。
            2.4,當指數部分是255,且尾數部分不為0的情況,表示不是一個有效數字,NaN。
            2.5,當指數部分取值為[1,254]的情況,需要減去127才是實際指數值,二進制表示的科學計數法的浮點數的整數部分按1解析。

            3,浮點書的規約形式與非規約形式
            3.1,上述的第二種情況的浮點數稱為非規約浮點數;上述的第五種情況的浮點數稱為規約浮點數。
            3.2,最小的規約浮點數是指數部分是1(實際指數是-126),尾數部分為全0的時候,絕對值為1 * 2 ^ -126 ;
            次小的規約浮點數是指數部分為1,尾數部分最低位為1其余位為0的時候,絕對值為1.000...1 * 2 ^ -126;
            它們之間的絕對差值為(1.000...1 - 1) * 2 ^ -126 = 2 ^ -23 * 2 ^ -126 = 2 ^ -149;
            而最小規約數與0的絕對差值是1 * 2 ^ -126 = 2 ^ -126。
            在坐標軸的表現是,兩個非0的規范浮點數的間隔很小,而最小規約浮點數與0的間隔很大,差距是23倍。
            3.3,引入非規約形式的浮點數,可以使得0與最小規約浮點數的間隔變得均勻起來,并且間隔與兩個相鄰規約浮點數的間隔一致。
            兩個非規約浮點數的間隔都是0.000...1 * 2 ^ -126 = 2 ^ -149。
            3.4,最大的非規約數是0.111...111 * 2 ^ -126,最小的規約數是1.000..0 * 2 ^ -126;
            最大的非規約總是小于最小的規約數,也可以認識近似相等。

            4,浮點數舍入
            4.1,四舍六入五成雙。
            Math.Round()
            4.2,向0(截斷)舍入
            整型強制轉換
            4.3,向負無窮大
            Math.Floor()
            4.4,向正無窮大
            Math.Ceiling()

            posted @ 2015-06-14 17:41 Onway 閱讀(622) | 評論 (0)編輯 收藏

            python程序里面需要執行一個系統命令程序,如果命令在限定時間之內結束,則python程序讀取其輸出(如果有)并馬上返回,否則強行終止命令程序。
            原本這個功能是用系統信號SIGALARM和python的異常解決的,但這不能用在多線程的環境里。然后考慮用threading.Timer進行計時,但這個計時是在一個單獨線程進行的,如何將超時信息傳給主線程也是一個問題。
            百度一下,用select可以解決需求:
            但select并不完美,當命令程序輸出的內容多于管道容量的時候,select就會返回,如果此時命令程序再進入阻塞,則時間限制就不起作用了。

            select.py:
            import select
            import subprocess

            popen = subprocess.Popen("./test.sh", stdout=subprocess.PIPE)
            fs = select.select([popen.stdout], [], [], 3)
            if popen.stdout in fs[0]:
                output = popen.stdout.read()
                print len(output)
            else:
                print "timeout"

            test.sh:
            #!/bin/bash

            # a.txt contains 65536 characters

            cat a.txt
            sleep 10
            cat a.txt

            posted @ 2013-05-10 21:26 Onway 閱讀(2766) | 評論 (0)編輯 收藏

            使用getrusage得到的資源統計的類型較多,測試代碼是僅針對ru_utime, ru_stime, ru_minflt三種類型的資源。
            測試環境:Linux kubuntu 3.2.0-38-generic-pae #61-Ubuntu SMP Tue Feb 19 12:39:51 UTC 2013 i686 i686 i386 GNU/Linux
            結論:父進程fork得到的子進程的資源使用被重置,子進程使用execve之后的資源使用不變。
            parent.c:
            #include <stdio.h>
            #include <stdlib.h>
            #include <unistd.h>
            #include <sys/time.h>
            #include <sys/resource.h>

            void
            print_rusage(const char * where)
            {
                struct rusage used;
                getrusage(RUSAGE_SELF, &used);

                printf("In %s:\n", where);
                printf("user cpu time: %ld(ms)\n",
                        used.ru_utime.tv_sec * 1000 + used.ru_utime.tv_usec / 1000);
                printf("sys cpu time: %ld(ms)\n",
                        used.ru_stime.tv_sec * 1000 + used.ru_stime.tv_usec / 1000);
                printf("soft page faults: %ld\n", used.ru_minflt);
                printf("\n");
            }

            void
            consume_rusage()
            {
                int i, j, k;
                char * s = NULL;

                /* about 3 seconds user cpu time */
                for (i = 0; i < 1000; ++i)
                    for (j = 0; j < 1000; ++j)
                        for (k = 0; k < 1000; ++k)
                            i / (j + 1) * k;
                
                /* 1000 soft page faults */
                k = 4096 * 1000;
                s = (char *)malloc(k);
                for (i = 0; i < k; ++i)
                    s[i] = 'a';
            }

            int
            main(int argc, char *argv[])
            {
                consume_rusage();
                print_rusage("parent process");

                if (fork() == 0) {
                    print_rusage("child process, after fork");
                    printf("consuming resource \n\n");
                    consume_rusage();
                    print_rusage("child process, before execve");
                    printf("excl child program now \n\n");
                    execl("./child", "./child", (void *)0);
                }

                wait(NULL);
                return 0;
            }

            child.c:
            #include <stdio.h>
            #include <sys/time.h>
            #include <sys/resource.h>

            void
            print_rusage(const char * where)
            {
                struct rusage used;
                getrusage(RUSAGE_SELF, &used);

                printf("In %s:\n", where);
                printf("user cpu time: %ld(ms)\n",
                        used.ru_utime.tv_sec * 1000 + used.ru_utime.tv_usec / 1000);
                printf("sys cpu time: %ld(ms)\n",
                        used.ru_stime.tv_sec * 1000 + used.ru_stime.tv_usec / 1000);
                printf("soft page faults: %ld\n", used.ru_minflt);
                printf("\n");
            }

            int
            main(int argc, char *argv[])
            {
                print_rusage("child program");
                return 0;
            }   

            好久沒寫博客了,密碼都快忘記了。寫給自己的記憶。

            posted @ 2013-05-10 20:21 Onway 閱讀(2541) | 評論 (2)編輯 收藏

                 摘要: 更新說明:
            a,去掉了本地單詞本功能
            b,增加了simple選項查詞
            c,detail選項查詞更新到有道詞典的5.1.38.3211版本
            d,收錄skyhacker的pyfanyi(那是完全不一樣的界面風格)
            下載:
            https://sourceforge.net/projects/eyoudao/files/  閱讀全文

            posted @ 2012-10-22 13:52 Onway 閱讀(2667) | 評論 (9)編輯 收藏








            我以為自己已經上傳過0.1.0的了,原來沒有。

            在原來那篇“OnlineJudge監測程序”的基礎上,添加了后臺守護進程和單機測試網頁。

            信號處理和系統調用規則,依然不完善。
            依然沒有使用chroot限制根目錄,頭文件,動態庫這些內容還是不會限制。
            java程序的內存統計,依然包含了虛擬機內存。

            在SourceForge搗鼓了好幾天了,還是不太熟悉。
            下載地址:http://sourceforge.net/projects/anoj/files/
            安裝包里有依賴,安裝等說明。

            純粹學習吧,跟HDOJ和POJ比,還差遠著呢。
            如有建議,博客留言或聯系aluohuai@126.com

            posted @ 2012-09-18 11:44 Onway 閱讀(1159) | 評論 (0)編輯 收藏

            今年四月底為一份實習參與了一個在線挑戰,選題是linux平臺的一個http服務器,一個星期多點完成交上去,然后就沒然后了。
            昨晚拿出來運行一下,打開幾個源碼文件,看著感覺是挺不懂事的。
            無論是代碼風格,程序結構,實現技術,還是標準支持,安全性什么都是慘不忍睹的。
            但做這個東西的時候感覺是煞有介事的,也用到了線程技術,實現了CGI,也做了文檔什么的,也算是系統編程的開始吧,因此寫文一篇緬懷一下。

            昨晚想到,有沒必要做一個本地瀏覽器接口程序?其實也就是一個監聽localhost的http服務器程序。
            一些簡單的單機交互程序,跑命令行不方便,雖然用圖形庫寫個界面也是不難的事,但為了一個界面幾個按鈕去學個圖形庫就比較糾結了。
            想法是這樣簡單的界面可以用瀏覽器做,服務程序作為本地程序和瀏覽器之間的橋梁。
            當然如果覺得裝個apache更容易的話,那是無話說了。
            只是簡單記錄一下想法,具體還需更多的需求分析和論證。

            posted @ 2012-08-24 15:25 Onway 閱讀(249) | 評論 (0)編輯 收藏

                 摘要: 3,運行監測程序:
            ./a.out -t time -m memory -f fsize --basedir a_temp_working_directory --datadir input_answer_files_directory \
            --who user_and_group_ID --magic a_random_string --end java Main
            解釋:
            -t,時間限制,單位ms
            -m,內存限制,單位kb
            -f,輸出限制,單位kb
            --basedir,工作目錄
            --datadir,存放輸入和答案文件的目錄,必須包含了ojdlck生成的data.conf文件
            --who,運行用戶程序的用戶ID和組ID,建議為系統的nobody用戶
            --magic,用于在工作目錄產生輸出的文件名
            --end,標志所有的參數輸入完畢,接下來的參數都會視為用戶程序及其參數
            例如:
            ./a.out -t 1000 -m 65536 -f 4096 --basedir /tmp --dat  閱讀全文

            posted @ 2012-08-20 00:35 Onway 閱讀(1976) | 評論 (1)編輯 收藏


            更新說明:
                a,result.xsl在<body>之后加入了兩個html子元素。
                b,classify.txt分類支持空格
                c,選擇單詞分類不再使用zenity,而是直接在顯示的網頁中添加。
                d,單詞本復習支持短語,增加了兩個模式,背誦模式是將選中的單詞批量下載到一個文件,復習模式是顯示單詞和釋義,不記入數據庫。
                e,改變了安裝方式,不再從makefile文件編譯,而是預先拷貝預先的編譯好的可執行文件。(檢測了ubuntu,fedora,centos三個系統,xslt程序使用的動態庫都能在系統里找到)
            下載:
            /Files/Onway/eyoudao-1.2.tar.gz.rar

            posted @ 2012-06-08 11:11 Onway 閱讀(2381) | 評論 (14)編輯 收藏

                 摘要:
            摘自《c專家編程》,代碼和答案都是基于gcc 4.6.1和32位linux系統。
            某些解釋不夠全面和正確,如果是錯誤,請指正。

            1,解釋該聲明的含義:
            char * const *(*next)();  閱讀全文

            posted @ 2012-05-28 11:52 Onway 閱讀(376) | 評論 (0)編輯 收藏

            僅列出標題
            共6頁: 1 2 3 4 5 6 
            久久久精品国产亚洲成人满18免费网站 | 日本免费一区二区久久人人澡| 久久综合给久久狠狠97色| 97久久国产亚洲精品超碰热| 日韩精品久久久久久| 久久久久亚洲AV无码观看| 国产人久久人人人人爽| 亚洲国产成人久久笫一页| 国产精品一久久香蕉国产线看观看| 国产伊人久久| 久久久久亚洲精品天堂| 久久综合色区| 色综合久久久久| 久久影院综合精品| 一本一本久久a久久精品综合麻豆| 国内精品久久久久影院优| 欧美精品国产综合久久| 国产成人精品久久亚洲高清不卡 | 精品无码久久久久国产动漫3d| 精品久久久久久无码中文字幕| 97久久精品人妻人人搡人人玩| 久久精品人人做人人爽电影| 久久久久国色AV免费看图片| 久久精品一区二区| 久久久久无码精品国产| 亚洲国产精品高清久久久| 偷偷做久久久久网站| 日韩十八禁一区二区久久| 久久国产精品无码网站| 国产午夜精品久久久久九九电影| 99久久精品日本一区二区免费| 久久亚洲日韩精品一区二区三区| 久久亚洲sm情趣捆绑调教| 久久青青草视频| 久久AV高潮AV无码AV| 色欲久久久天天天综合网精品| 亚洲人成无码网站久久99热国产| 久久人人爽人人爽AV片| 久久久受www免费人成| 色综合久久夜色精品国产| 久久人人爽人人爽人人av东京热|