• <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

            一,簡(jiǎn)介
            一個(gè)歷史項(xiàng)目里面用了c# .net 2.0的FtpWebRequest進(jìn)行文件上傳;ftp server在各現(xiàn)場(chǎng)用的應(yīng)該都是Filezilla。
            因業(yè)務(wù)發(fā)展,需要上傳大文件(500M以上吧),某現(xiàn)場(chǎng)就出現(xiàn)了上傳失敗的情況。

            二,網(wǎng)絡(luò)問(wèn)題
            最開(kāi)始的代碼里面并沒(méi)有記錄上傳失敗的具體原因,或者說(shuō)log記錄沒(méi)能準(zhǔn)確定位問(wèn)題。
            代碼修改后還是沒(méi)能準(zhǔn)確定位問(wèn)題。
            但從log判斷,似乎是網(wǎng)絡(luò)斷開(kāi)造成的。
            這想到可能現(xiàn)場(chǎng)網(wǎng)絡(luò)不穩(wěn)定,有瞬斷情況。

            三,斷點(diǎn)續(xù)傳
            聽(tīng)過(guò)斷點(diǎn)續(xù)傳,在百度找了些代碼,修改一下封裝好嵌到項(xiàng)目里面。
            當(dāng)時(shí)只在網(wǎng)絡(luò)暢通的情況下測(cè)試過(guò),代碼也沒(méi)還checkin,發(fā)現(xiàn)場(chǎng)用戶也試試。
            反饋還是不行。
            看log更加迷糊了,堆棧顯示在FtpWebRequest.GetRequestStream.Close里面拋出來(lái)的異常。
            想不明白啊。

            四,重現(xiàn)爛網(wǎng)絡(luò)
            去過(guò)現(xiàn)場(chǎng)出差的同事反應(yīng),現(xiàn)場(chǎng)的網(wǎng)絡(luò)真的好爛。
            這想到怎么去模擬一個(gè)爛網(wǎng)絡(luò)出來(lái)。
            找到一個(gè)程序叫clumsy,http://jagt.github.io/clumsy/
            設(shè)置延時(shí)50ms,50%的丟包率,丫的那個(gè)異常堆棧重現(xiàn)出來(lái)了。
            異常信息如下:
            這應(yīng)該說(shuō)的,連接已經(jīng)斷開(kāi)了,再關(guān)的話就報(bào)錯(cuò)了。
            程序調(diào)試進(jìn)去發(fā)現(xiàn),最早引發(fā)異常的是FtpWebRequest.GetRequestStream.Write,程序里面是有catch,但只是記錄了失敗的位置偏移以便下次重傳,也沒(méi)有去記錄失敗原因。
            當(dāng)時(shí)close的調(diào)用是放在finally塊里面的,這個(gè)close引發(fā)的異常導(dǎo)致續(xù)傳沒(méi)能繼續(xù)執(zhí)行,log記錄的堆棧也就是從這里開(kāi)始。

            五,重現(xiàn)了也沒(méi)個(gè)屁用啊
            既然close不掉,那就直接跳到FtpWebRequest.GetResponse.Close好了。
            還真不報(bào)異常了,GetResponse就直接阻塞了,一直塞到ftp server都超時(shí)斷開(kāi)了,還沒(méi)返回。
            看了一下msdn,說(shuō)好的FtpWebRequest.Timeout咋的沒(méi)生效呢?FtpWebRequest.ReadWriteTimeout可是好好的呢。
            google+stackoverflow也沒(méi)找到解決,倒是找到一些吐槽FtpWebRequest和Ftp庫(kù)推薦的。
            莫非還真得換庫(kù)或者直接調(diào)些ftp命令?
            同時(shí)stackoverflow發(fā)了第一個(gè)問(wèn)題,我只想知道為什么不超時(shí)也不返回,因?yàn)槲疫BGetResponse.Close都不調(diào)用就直接開(kāi)始下一次重傳的話,會(huì)報(bào)另一個(gè)異常如下:
            不造是否英語(yǔ)太爛,或者是問(wèn)題沒(méi)到點(diǎn)子上,問(wèn)題沉了。

            6,似乎只能傻逼了
            下班路上想到,出現(xiàn)異常的時(shí)候,一個(gè)close也不調(diào)用,無(wú)論是否重新連接,因?yàn)榫W(wǎng)絡(luò)已經(jīng)不通了,server應(yīng)該還hold住一個(gè)連接,把文件鎖住了。
            這應(yīng)該就是上面異常的情況,文件被鎖了,新連接就沒(méi)法操作這個(gè)文件,看server log,確實(shí)有這個(gè)cann't access file的記錄。
            那很好,client出異常了,等一個(gè)足夠長(zhǎng)的時(shí)間,等到server將連接斷開(kāi)就好了,close也就不管了。
            但想想這也太傻逼了啊,這得等到什么時(shí)候啊。

            7,也算徹底解決了,反正可以交貨了
            試了一下filezilla client,有斷點(diǎn)續(xù)傳功能,發(fā)現(xiàn)網(wǎng)絡(luò)異常斷開(kāi),開(kāi)始續(xù)傳連接開(kāi)始之前,server那個(gè)連接總會(huì)很快斷開(kāi)。
            這又是怎么解析呢,不是說(shuō)網(wǎng)絡(luò)都不通了,server那個(gè)連接是怎么放掉的呢?
            google一下,stackoverflow上看到FtpWebRequest有個(gè)Abort函數(shù),說(shuō)是斷開(kāi)一個(gè)異步請(qǐng)求。
            一試,我同步連接也能斷開(kāi)啊,網(wǎng)絡(luò)異常,啥都不close,直接abort,server那個(gè)連接就斷了,很快也就可以重傳了呢。

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

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

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

            2,指數(shù)部分
            2.1,當(dāng)指數(shù)部分是0,且尾數(shù)部分為全0的情況,這表示浮點(diǎn)數(shù)0;加上符號(hào)位表示正負(fù)0。
            2.2,當(dāng)指數(shù)部分是0,且尾數(shù)部分不為0的情況,其實(shí)際指數(shù)是-126,二進(jìn)制表示的科學(xué)計(jì)數(shù)法的浮點(diǎn)數(shù)的整數(shù)部分按0解析。
            2.3,當(dāng)指數(shù)部分是255,且尾數(shù)部分為全0的情況,表示一個(gè)無(wú)窮數(shù);加上符號(hào)位表示正反無(wú)窮。
            2.4,當(dāng)指數(shù)部分是255,且尾數(shù)部分不為0的情況,表示不是一個(gè)有效數(shù)字,NaN。
            2.5,當(dāng)指數(shù)部分取值為[1,254]的情況,需要減去127才是實(shí)際指數(shù)值,二進(jìn)制表示的科學(xué)計(jì)數(shù)法的浮點(diǎn)數(shù)的整數(shù)部分按1解析。

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

            4,浮點(diǎn)數(shù)舍入
            4.1,四舍六入五成雙。
            Math.Round()
            4.2,向0(截?cái)啵┥崛?/span>
            整型強(qiáng)制轉(zhuǎn)換
            4.3,向負(fù)無(wú)窮大
            Math.Floor()
            4.4,向正無(wú)窮大
            Math.Ceiling()

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

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

            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 閱讀(2787) | 評(píng)論 (0)編輯 收藏

            使用getrusage得到的資源統(tǒng)計(jì)的類型較多,測(cè)試代碼是僅針對(duì)ru_utime, ru_stime, ru_minflt三種類型的資源。
            測(cè)試環(huán)境:Linux kubuntu 3.2.0-38-generic-pae #61-Ubuntu SMP Tue Feb 19 12:39:51 UTC 2013 i686 i686 i386 GNU/Linux
            結(jié)論:父進(jìn)程fork得到的子進(jìn)程的資源使用被重置,子進(jìn)程使用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;
            }   

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

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

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

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








            我以為自己已經(jīng)上傳過(guò)0.1.0的了,原來(lái)沒(méi)有。

            在原來(lái)那篇“OnlineJudge監(jiān)測(cè)程序”的基礎(chǔ)上,添加了后臺(tái)守護(hù)進(jìn)程和單機(jī)測(cè)試網(wǎng)頁(yè)。

            信號(hào)處理和系統(tǒng)調(diào)用規(guī)則,依然不完善。
            依然沒(méi)有使用chroot限制根目錄,頭文件,動(dòng)態(tài)庫(kù)這些內(nèi)容還是不會(huì)限制。
            java程序的內(nèi)存統(tǒng)計(jì),依然包含了虛擬機(jī)內(nèi)存。

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

            純粹學(xué)習(xí)吧,跟HDOJ和POJ比,還差遠(yuǎn)著呢。
            如有建議,博客留言或聯(lián)系aluohuai@126.com

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

            今年四月底為一份實(shí)習(xí)參與了一個(gè)在線挑戰(zhàn),選題是linux平臺(tái)的一個(gè)http服務(wù)器,一個(gè)星期多點(diǎn)完成交上去,然后就沒(méi)然后了。
            昨晚拿出來(lái)運(yùn)行一下,打開(kāi)幾個(gè)源碼文件,看著感覺(jué)是挺不懂事的。
            無(wú)論是代碼風(fēng)格,程序結(jié)構(gòu),實(shí)現(xiàn)技術(shù),還是標(biāo)準(zhǔn)支持,安全性什么都是慘不忍睹的。
            但做這個(gè)東西的時(shí)候感覺(jué)是煞有介事的,也用到了線程技術(shù),實(shí)現(xiàn)了CGI,也做了文檔什么的,也算是系統(tǒng)編程的開(kāi)始吧,因此寫文一篇緬懷一下。

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

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

                 摘要: 3,運(yùn)行監(jiān)測(cè)程序:
            ./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,時(shí)間限制,單位ms
            -m,內(nèi)存限制,單位kb
            -f,輸出限制,單位kb
            --basedir,工作目錄
            --datadir,存放輸入和答案文件的目錄,必須包含了ojdlck生成的data.conf文件
            --who,運(yùn)行用戶程序的用戶ID和組ID,建議為系統(tǒng)的nobody用戶
            --magic,用于在工作目錄產(chǎn)生輸出的文件名
            --end,標(biāo)志所有的參數(shù)輸入完畢,接下來(lái)的參數(shù)都會(huì)視為用戶程序及其參數(shù)
            例如:
            ./a.out -t 1000 -m 65536 -f 4096 --basedir /tmp --dat  閱讀全文

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


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

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

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

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

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

            僅列出標(biāo)題
            共6頁(yè): 1 2 3 4 5 6 
            亚洲美日韩Av中文字幕无码久久久妻妇 | 国产福利电影一区二区三区久久老子无码午夜伦不 | 奇米影视7777久久精品人人爽| 久久综合偷偷噜噜噜色| 久久影院综合精品| 久久久青草青青亚洲国产免观| 中文字幕无码精品亚洲资源网久久| 久久精品免费一区二区| 狠狠久久综合| 亚洲精品乱码久久久久久自慰| 一级做a爰片久久毛片16| 7777久久亚洲中文字幕| 久久久久国色AV免费观看| 97精品国产97久久久久久免费| 久久综合九色综合欧美狠狠| 国产免费久久精品99re丫y| 国产精品无码久久久久久| 久久久亚洲裙底偷窥综合| 国产AⅤ精品一区二区三区久久| 国内高清久久久久久| 777久久精品一区二区三区无码| 亚洲精品乱码久久久久久蜜桃不卡 | 国产毛片久久久久久国产毛片| 久久这里只有精品视频99| 久久99免费视频| 色8久久人人97超碰香蕉987| 亚洲精品久久久www| 久久免费观看视频| 久久久WWW成人免费毛片| 久久99精品免费一区二区 | 久久久久亚洲精品无码网址| 高清免费久久午夜精品| 久久久av波多野一区二区| 久久狠狠爱亚洲综合影院 | 无码人妻久久一区二区三区 | 久久中文骚妇内射| 久久Av无码精品人妻系列| 久久久国产精品亚洲一区| 嫩草伊人久久精品少妇AV| 精品国际久久久久999波多野| 久久精品蜜芽亚洲国产AV|