image

qke 奇客

Nov 19 2008

越狱中的胡克定律-拆墙受力关键点示意图

Filed under: unsorted

越狱中的胡克定律-拆墙受力关键点示意图
越狱第一季才出来的时候,LBJ同学就极力推荐。昨天终于有时间开始来细细品位了。
真不错,不然我会错过一部精彩连续剧。一天一口气看了十集,足见俺也是一个Tv show
Fans,LOL.里面有一个有意思的镜头,Michael和狱友利用胡克定律拆掉一堵水泥厚墙。因
为俺不是结构力学方面的专家,对胡克的认识也只有初中物理上,关于弹性系数f与其产生的力F
之间存在一个线性关系,真想不到胡克还是一个结构力学方面的天才。
仔细找了相关方面的资料,原来还真有那么回事。
材料力学和弹性力学的基本规律之一。由R.胡克于1678年提出而得名。胡克定律的内容为:在材料的线弹性范围内,固体的单向拉伸变形与所受的外力成正比;也可表述为:在应力低于比例极限的情况下,固体中的应力σ与应变ε成正比,即σ=Εε,式中E为常数,称为弹性模量或杨氏模量。把胡克定律推广应用于三向应力和应变状态,则可得到广义胡克定律。胡克定律为弹性力学的发展奠定了基础。各向同性材料的广义胡克定律有两种常用的数学形式:
σ11=λ(ε11+ε22+ε33)+2Gε11,σ23=2Gε23,
σ22=λ(ε11+ε22+ε33)+2Gε22,σ31=2Gε31,(1)
σ33=λ(ε11+ε22+ε33)+2Gε33,σ12=2Gε12,及
式中σij为应力分量;εij为应变分量(i,j=1,2,3);λ和G为拉梅常量,G又称剪切模 量;E为弹性模量(或杨氏模量);v为泊松比。λ、G、E和v之间存在下列联系: 式(1)适用于已知应变求应力的问题,式(2)适用于已知应力求应变的问题。
参见百度词条:http://baike.baidu.com/view/127907.htm
找到我所关心的拆墙受力关键点示意图吧,呵呵,说不定以后可以用这个才取乐,有机会还真想亲自试试它的威力。

好了废话就不多说了,看看这些 Michael的各位徒弟是怎么”越狱”的吧。:)
实战图片

这是我们要拆除的一部分墙,可以通过上面的密码找到我们,你也可以来《越狱》!
实战图片

看看这个墙的材质,你就知道这是不是糊弄人的了!
实战图片

专用打孔设备
实战图片

我们的“作案”工具
实战图片

哈工大土木工程系一位朋友帮我计算出来的胡克定律效果图
实战图片

我们在墙面上选择了12个点,作为受力点
实战图片

每个点都要用工具打通。
实战图片

事实证明,用越狱里用打蛋器来钻孔是极其不可取的,会把人累死的!看看我半个小时的杰作。
实战图片
好在我准备了Michael也带不进监狱的东西:电钻
看看我的超强武器 其实就算用电钻也一样很吃力的

实战图片

墙体太厚了
实战图片

终于快钻出来了!
实战图片

每个点都对我们来说很重要
实战图片

事实证明越狱的确不是一件易事
实战图片

越狱不仅是脑力活也是体力活
实战图片

看看吧,这就是希望
实战图片

知道么,看见绿色的一刻 我也觉得自己就要出狱了!
实战图片

为了外面的美好世界……………
实战图片

有了电钻果然效率提高了很多,如果Michael当时有电钻的话,估计可以提前几个小时出去,哈哈
实战图片

又是体力活
实战图片

纹丝不动的墙!
实战图片

越狱需要坚持
实战图片

毛主席教育我们一不怕苦二不怕累
实战图片

开了一个口的墙,看看吧,这砖头真结实!
实战图片

终于成功了!
实战图片

再看一眼我们的场地吧
实战图片

这是我们逃离的监狱
实战图片

我逃走了,不服气的话来抓我吧!
实战图片

Nov 18 2008

有意思的fork

Filed under: cpp

有意思的fork
pid_t fork(void)函数用来创建新的进程。
相关函数有wait exec等。
该函数创建一次,返回两次。
可以根据返回值区别当前进程是父进程,还是新创建的子进程。
子进程中返回值为0,父进程中返回其子进程号,出错为-1.

在fork()这个地方,新加了一个执行入口。子进程
拷贝了父进程的所有数据,堆栈空间,并继承了父进程的用户代码、组代码、环境变量、已经打开的
文件代码、工作目录和资源限制。子进程从父进程继承下列属性:
实际用户号、有效用户号以及保留的用户号
实际组号、有效组号以及保留的组号
补充组号列表
环境
文件描述符
执行时关闭标识
信号处理设置
信号掩码
配置处理开|关状态
记录帐号中的命令名
Nice值
所有连接的共享内存段
当前工作目录
根目录
文件模式创建掩码
文件大小限制
实时优先级
因为是数据的备份,所以这些数据并不能相互影响。
下面看一个例子:(是从Linux 高级程序与设计 人民邮电出版社 P151变形而来,原书中给出的结果有错误)

  1. //getpgid_example.c
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. int main(int argc ,char** agrv)
  6. {
  7.         int i;
  8.         int num = atoi(agrv[1]);
  9.         printf("\t pid\t ppid\t pgid\n");
  10.         printf("parent\t%d\t%d\t%d\n",getpid(),getppid(),getpgid(0));
  11.         for(i=0;i<num;i++)
  12.         {
  13.                 if(fork()==0)
  14.                 {
  15.             printf("-----------------------------\n");
  16.                         printf("child%d\t%d\t%d\t%d\n",i,getpid(),getppid(),getpgid(0));
  17.                 }
  18.         }
  19.         return 0;
  20.  
  21. }

执行
#./getpgid_example 2
请问会打多少行”—————————–\n”
我首先因为粗心的原因,按原书思路,不加思索就是2行,因为只会创建2个子进程。
看结果
parent  27049   21267   27049
—————————–
child0  27050   27049   27049
—————————–
child1  27051   27050   27049
—————————–
child1  27052   27049   27049
其实不然,n 与行数的关系是 行数=2^n-1 (n是2的指数)
#./getpgid_example 5 则会打印 2^5-1=31行。

Nov 17 2008

Vim常用命令

Filed under: opensource

vim txt.txt 创建文件
ESC用于换切模式
i:Insert
h:left
l:right
k:top
j:bottom
x:delete a char
dd:delete a line
J:join lines
u:undo
ctrl+R :redo
a:apend
o:new line after the cursor
O:new line before the cursor
3k:向上移3行
ZZ:save and exit
:q!:abort and quit
i:Insert
h:left
l:right
k:top
j:bottom
x:delete a char
dd:delete a line
J:join lines
u:undo
ctrl+R :redo
a:apend
o:new line after the cursor
O:new line before the cursor
3k:向上移3行
ZZ:save and exit
:q!:abort and quit
w:向前移动一个单词
b:向后移动一个单词
$:end 移到行尾
^:Home 移到行首
fx:在当前行向前查找x
Fx:在当前行向后查找
tx:在当前行向前查找,光标定位在匹配字符前
Tx:在当前行向后查找,光标定位在匹配字符后
%:查找匹配括号
7G:移动7行
G:移动最后一行行首
gg:移动到第一行行首
50%:移动到行数的50%位置
H:Home头
M:Middle中
L:Last 尾
Ctrl+G:这里显示了你正在编辑的文件的名称,你所处的当前行的行号,全文的总行数,光标
以前的行占全文的百分比,和你所处的列的列号。
:set number 加行号
:set nonumber 去行号
:set ruler 显示光标坐标

Nov 17 2008

浏览器地址栏可以执行JS代码

Filed under: Internet Technology

今天收到朋友发的一条信息:

随便进入一个网站 然后在地址栏输入这段代码回车 那个网站的图片就会旋转 很神奇 javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; DI=document.images; DIL=DI.length; function A(){for(i=0; i-DIL; i++){DIS=DI[ i ].style; DIS.position=’absolute’; DIS.left=Math.sin(R*x1+i*x2+x3)*x4+x5; DIS.top=Math.cos(R*y1+i*y2+y3)*y4+y5}R++}setInterval(’A()’,5); void(0);  
这就一段JS,地址栏可以执行JS?这引起了我的兴趣,试了一下,IE7,FF3.0都能成功执行。后面想了想,这是个好特性呀。这段js不难理解,前面就是获取文档对象中的所有图片对象,然后定时变改变位置,产生一个流动花圈的效果。后面有加一个void(0),这是一个忽略返回值的用法。大家可以去掉这个语言试试,呵呵。只会看到几个数字,返回的只是定时器的标识符。类似用法有here。可不可以可以利用这特性写个小工具呢,可以增加浏览器的功能,比如自动滚屏,非法字符过滤(这个对小孩有用,哈哈,以前看人家还用到了抓包的原理,用JS实现会简单很多呀,当然也可以看一些插件的原理,在每个浏览的页面注入js),还有背景切换,字体变换之类的(有时浏览一些人的webpage,背景颜色与字体差不多,不知是不是在测试读者的眼力),我就先想了这么多了,天马行空的。

Nov 07 2008

一道c面试题atol atoi isspace isdigit strcpy memcpy 的实现方法

Filed under: cpp

下载: src.cpp
  1. void * my_memcpy(void* mem_des,const void* mem_src,size_t size)
  2. {
  3.     assert(mem_des != NULL && mem_src != NULL);
  4.     void* addr = mem_des;
  5.     unsigned char *des,*src;
  6.     des = (unsigned char*)mem_des;
  7.     src = (unsigned char*)mem_src;
  8.     while(size-- >0)
  9.         *des++ = *src++;
  10.     return addr;
  11. }
  12. char * my_strcpy(char* cpy,const char* src)
  13. {
  14.     assert(cpy != NULL && src != NULL);
  15.     char* addr = cpy;
  16.     while((*cpy++ = *src++)!='\0')
  17.         continue;
  18.     return addr;
  19.  
  20. }
  21. int my_isspace(int c)
  22. {
  23.     return c==' ';
  24. }
  25. int my_isdigit(int c)
  26. {
  27.     return c<='9' && c >= '0';
  28. }
  29. //atol 实现版本
  30.  
  31. long my_atol(const char* str)
  32. {
  33.     long total = 0;
  34.     char sign= '+';
  35.     char c ;
  36.     while(my_isspace(*str))
  37.         str++;
  38.     c = (int)(unsigned char)*str++;
  39.     if(c == '-' || c =='+')
  40.     {
  41.         sign = c;
  42.         c = (int)(unsigned char)*str++;
  43.     }
  44.     while(my_isdigit(c))
  45.     {
  46.         total = total*10 + c-'0';
  47.         c = (int)(unsigned char)*str++;
  48.     }
  49.     if(sign == '-')
  50.         total = -total;
  51.     return total;
  52. }
  53. //atoi 实现版本
  54. int my_atoi(const char * str)
  55. {
  56.     int total = 0;
  57.     char c;
  58.     char sign;
  59.     while(my_isspace((int)(unsigned char)*str))
  60.     {
  61.         str++;
  62.     }
  63.     c = (int)(unsigned char)*str++;
  64.     if(c=='-' || c=='+')
  65.     {
  66.         sign = c;
  67.         c = (int)(unsigned char)*str++;
  68.     }
  69.     while(my_isdigit(c))
  70.     {
  71.         total = total*10+ c-'0';
  72.         c = (int)(unsigned char)*str++;
  73.     }
  74.     if(sign == '-')
  75.         return -total;
  76.     else
  77.         return total;
  78. }