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 阅读(1262) | 评论 (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 阅读(600) | 评论 (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 阅读(2749) | 评论 (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 阅读(2521) | 评论 (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 阅读(2653) | 评论 (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 阅读(1152) | 评论 (0)编辑 收藏

今年四月底为一份实习参与了一个在线挑战,选题是linux平台的一个http服务器,一个星期多点完成交上去,然后就没然后了。
昨晚拿出来运行一下,打开几个源码文件,看着感觉是挺不懂事的。
无论是代码风格,程序结构,实现技术,还是标准支持,安全性什么都是惨不忍睹的。
但做这个东西的时候感觉是煞有介事的,也用到了线程技术,实现了CGI,也做了文档什么的,也算是系统编程的开始吧,因此写文一篇缅怀一下。

昨晚想到,有没必要做一个本地浏览器接口程序?其实也就是一个监听localhost的http服务器程序。
一些简单的单机交互程序,跑命令行不方便,虽然用图形库写个界面也是不难的事,但为了一个界面几个按钮去学个图形库就比较纠结了。
想法是这样简单的界面可以用浏览器做,服务程序作为本地程序和浏览器之间的桥梁。
当然如果觉得装个apache更容易的话,那是无话说了。
只是简单记录一下想法,具体还需更多的需求分析和论证。

posted @ 2012-08-24 15:25 Onway 阅读(240) | 评论 (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 阅读(1966) | 评论 (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 阅读(2370) | 评论 (14)编辑 收藏

     摘要:
摘自《c专家编程》,代码和答案都是基于gcc 4.6.1和32位linux系统。
某些解释不够全面和正确,如果是错误,请指正。

1,解释该声明的含义:
char * const *(*next)();  阅读全文

posted @ 2012-05-28 11:52 Onway 阅读(369) | 评论 (0)编辑 收藏

仅列出标题
共6页: 1 2 3 4 5 6