黑天鹅之舞:水面镜像中的生命对话

在春日微寒的池塘边,两只黑天鹅正进行着一场无声的仪式。它们弯曲的脖颈构成完美的弧线,在浑浊的水面上投下摇曳的倒影,仿佛现实与虚幻在此刻交融。

黑天鹅,这个常被赋予”意外与颠覆”象征的物种,在这里展现出截然不同的意象——不是突兀的异类,而是和谐的共舞者。它们鲜红的喙尖轻轻相触,如同在交换某种古老而神秘的讯息。这并非偶然的相遇,而是一种精心编排的生命对话。

水面的涟漪扩散开来,打破了完美的镜像,却也提醒我们:真实的生活从来不是静态的完美复制,而是在动态中寻找平衡的艺术。

背景中模糊的人影与绿植,构成了现代都市中难得的自然剧场。我们作为观察者,既是旁观者也是参与者,在这场自然之舞中重新思考人与自然的关系。

黑天鹅教会我们的,或许不是如何与众不同,而是如何在差异中找到共鸣,在流动中保持优雅。

黑天鹅之舞

陪你看灯

重庆的夜晚,总是让人忍不住想与最爱的人分享。

站在两江交汇处,对岸的洪崖洞灯火璀璨,千厮门大桥如一条光的河流横卧江上。这座城市的魔幻与温柔,在夜色中铺展开来,仿佛童话里的场景。

山城夜色

怀里的小人儿已经有些困了,小脑袋靠在我肩上,却还倔强地睁着眼睛,不肯错过窗外的每一盏灯。我轻声告诉她,那是嘉陵江,那是长江,它们在这里相遇,就像我们此刻相遇在这片夜色里。她似懂非懂地点点头,小手紧紧抓着我的衣角。

或许很多年后,她会忘记这个夜晚的具体模样,忘记洪崖洞的灯光有多么绚烂。但我希望她能记得,有人曾抱着她,在江边站了很久,只为让她多看一眼这世界的繁华与温柔。

所谓亲情,不过就是这样——陪你看灯,陪你长大。

江畔对话:在城市灯火中寻找精神坐标

夜幕降临,长江如一条流动的银河蜿蜒穿过山城,两岸的灯火次第亮起,将整座城市装点成一幅立体的光影画卷. 站在观景台上,我与父亲并肩而立,眼前的繁华景象背后,是更深沉的思考.

江畔对话:两代人的城市凝望

重庆的独特魅力在于它的”立体性”——建筑不是简单地平铺在大地上,而是沿着山势层层叠叠地向上生长. 远处那些高耸入云的摩天大楼,与近处依山而建的居民楼形成鲜明对比,仿佛在诉说着现代化进程与传统生活的和谐共存. 每一盏灯光背后,都是一个家庭的故事,一段人生的轨迹,一种对美好生活的向往.

最动人的不是这壮丽的景色,而是身边陪伴的人. 两代人站在同一个观景台,却看到不同的风景:他看到的是改革开放四十年的沧桑巨变,我看到的是数字时代的新机遇. 这种代际视角的交汇,让简单的夜景观赏升华为一场跨越时空的对话.

长江静静流淌,水面倒映着两岸的灯火,波光粼粼,仿佛一条流动的银河. 游船缓缓驶过,船上的彩灯在江面上划出一道道优美的弧线. 时间在这样的时刻变得格外温柔,城市的喧嚣被江水的宁静所抚平.

在这个被灯光点亮的夜晚,我忽然明白:真正的繁荣不在于建筑的高度,而在于人心的温度;真正的现代化不在于技术的先进,而在于文化的传承与创新. 当我们学会在快节奏的城市生活中找到这样的静谧时刻,或许就能理解为什么这座城市被称为”魔幻8D”——它不仅挑战着我们的物理空间感知,更重塑着我们的精神世界.

最好的城市景观,永远是那些能引发思考的风景;最美的时光,永远是那些与重要的人共享的瞬间.

关于正则表达式

起因

正则表达式初次被我重视归咎于百合仙子,当时以为‘他’是美女,当然美女在群里出的题目都大家都相当重视去解决,估计当时有很多兄弟被他忽悠过。不过到现在来看,这种忽悠是值得的,终归最后是拓宽了知识面,同时认识了一群志趣相投的业内人士。

只所以今天重拾正则这个话题,原因是昨天有同事提到一次面试题,遇到此题。

题目

原文:如何匹配一个数字,范围在(1-65555)不可以使用分组|

分析

匹配数字,正则对应的元字符是\d ,单词的开始结束\b ,这样就有了雏形

`\b\d\d\d\d\d\b`

但是此时是配置5位任意数,对于1、2、3、4位数就无法匹配,解决的方法是加入限定符重复零次或一次,即

`\b\d?\d?\d?\d?\d?\b`

这样就可以匹配0-99999的数,要进一步对该值进行限制,就需要加入零宽度断言(?<!exp)最后的结果就是

`\b[1-6]?\d?(?<!6[6-9])\d?(?<!65[6-9])\d?(?<!655[6-9])\d?(?<!6555[6-9])\b`

结果

`\b[1-6]?\d?(?<!6[^1-5])\d?(?<!65[6-9])\d?(?<!655[6-9])\d?(?<!6555[6-9])\b`

这个结果还不是很完美,它包含了0开头的数字, 先做记录,以后再做完整。

「转」使用 Byzanz 录制 Gif 动画或 Ogv 视频

想要录制 Linux 桌面?Byzanz 是一个不错的选择。Byzanz 简单小巧,容易使用,既能录制 Gif 动画,又可录制 Ogv 视频。

Byzanz

安装 Byzanz

可执行下列指令来安装 Byzanz,注意需要 root 权限:

1
2
3
4
aptitude install byzanz # Debian/Ubuntu
yum install byzanz # Fedora
emerge -av byzanz # Gentoo/Funtoo
pacman -S byzanz #Archlinux

Arch Linux 用户可在 AUR 中找到 Byzanz。如果你不能在自己所用的 Linux 发行版包仓库中找到 Byzanz,那么可以获取其源代码,自行编译。

Byzanz 用法

以本文的 byzanz-demo.gif 为例,你可以通过如下命令来完成录制过程:

1
yzanz-record -d 40 -x 0 -y 0 -w 400 -h 320 byzanz-demo.gif

其中:

  • -d 40 为录制的时长为 40 秒
  • -x 0 录制区域的横坐标
  • -y 0 录制区域的纵坐标,记住:屏幕右上角为原点(0,0)
  • -w 400 录制区域的宽度
  • -h 320 录制区域的高度
  • byzanz-demo.gif 保存的文件名

BTW: Byzanz 还带有一个 GNOME panel applet,感兴趣的同学可自行尝试。

Android keyevent抓图,使用jpeg565对数据压缩

实现功能

使用poll池方法监测event3event5和对从FB_DEVICE获得的图像数据进行jpeg压缩,压缩图像由之前的2700k缩小为89k,压缩比显而易见(30倍)。

效果图

Android ScreenShot

抓图实现

FB_DEVICE "/dev/graphics/fb0"获得图像的原始数据,色彩数据分为头和rgba数据,在函数jpg_screen_capture里case 16:中我对原始数据进行了处理,将rgba8888的数据转换为rgb565的数据,最后用generateJPEG对数据进行jpeg compress,具体的可以见capture_jpg.c代码

  • 这里要注意的一点是在读取fb_var.xres值必须为2^5=16的倍数,不够的要补足,也就是如下代码:

    if((fb_var.xres&0x1F)==0)
    fb->w = fb_var.xres;
    else
    fb->w =((fb_var.xres>>5)+1)<<5;

这样可以避免在抓图时出现像素移位,该问题在fb0的图像像素宽不是16的倍数时出现。

capture_jpg.c

/*=============================================================================
#     FileName: capture_jpg.c
#         Desc: capture jgp screenshoot 
#       Author: Lee Meng
#        Email: leaveboy@gmail.com
#     HomePage: http://leaveboy.is-programmer.com/
#      Version: 0.0.1
#   LastChange: 2013-01-15 09:33:23
#      History:
=============================================================================*/
#include <string.h>  
#include <stdlib.h>

#include <math.h>  
#include <stdio.h>  
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

typedef uint8_t BYTE;  
#define true 1  
#define false 0  


#include <jpeglib.h>

#define FB_DEVICE "/dev/graphics/fb0"
static int g_fd;

typedef struct
{
	int w;    /* width */
	int h;    /* high */
	int bpp;  /* bits per pixel */
	unsigned char *fbmem;
}screen;


static int init_fb(screen *fb)
{
	if ((g_fd = open(FB_DEVICE, O_RDWR)) < 0)
	{ 
		fprintf(stderr, "Open %s failed:%s\n", FB_DEVICE, strerror(errno));
		return -1; 
	}   

	struct fb_var_screeninfo fb_var;
	struct fb_fix_screeninfo fb_fix;

	if (ioctl(g_fd, FBIOGET_VSCREENINFO, &fb_var) < 0)
	{ 
		fprintf(stderr, "fb ioctl failed:%s\n", strerror(errno));
		return -1; 
	}   
	/*
		 if (ioctl(g_fd, FBIOGET_FSCREENINFO, &fb_fix) < 0)
		 { 
		 fprintf(stderr, "fb ioctl failed:%s\n", strerror(errno));
		 return -1; 
		 }   
		 */
	//fb->w   = fb_var.xres;
	if((fb_var.xres&0x1F)==0)
		fb->w = fb_var.xres;
	else
		fb->w =((fb_var.xres>>5)+1)<<5;
	fb->h   = fb_var.yres;
	fb->bpp = fb_var.bits_per_pixel;
	//	printf("capture_log %d, %d, %d, %d\n", fb_var.xres_virtual, fb_var.yres_virtual, fb_var.xoffset, fb_var.yoffset);
	//	printf("capture_log %d\n", fb_fix.line_length);
#if 1
	printf("width:%d\thigh:%d\tbpp:%d\n",fb->w, fb->h, fb->bpp);
#endif
	fb->fbmem = mmap(0, fb->w * fb->h * fb->bpp /8,PROT_READ | PROT_WRITE, MAP_SHARED, g_fd, 0);
	if (fb->fbmem == MAP_FAILED)
	{
		fprintf(stderr, "fb mmap failed:%s\n", strerror(errno));
		return -1;
	}

	close(g_fd);
	return 0;
}

int term_fb(screen *fb)
{
	munmap(fb->fbmem, fb->w * fb->h * fb->bpp / 8);
	return 0;
}


static int generateJPEG(BYTE* data,int w, int h, const char* outfilename)  
{  
	int nComponent = 3;  

	struct jpeg_compress_struct jcs;  

	struct jpeg_error_mgr jem;  

	jcs.err = jpeg_std_error(&jem);   
	jpeg_create_compress(&jcs);  

	FILE* f=fopen(outfilename,"wb");  
	if (f==NULL)   
	{  
		free(data);  
		return 0;  
	}  
	jpeg_stdio_dest(&jcs, f);  
	jcs.image_width = w;   
	jcs.image_height = h;  
	jcs.input_components = nComponent;  
	if (nComponent==1)  
		jcs.in_color_space = JCS_GRAYSCALE; 
	else   
		jcs.in_color_space = JCS_RGB;  

	jpeg_set_defaults(&jcs);      
	jpeg_set_quality (&jcs, 80, true);  

	jpeg_start_compress(&jcs, TRUE);  

	JSAMPROW row_pointer[1];
	int row_stride;   

	row_stride = jcs.image_width*nComponent;   


	while (jcs.next_scanline < jcs.image_height) {  
		row_pointer[0] = & data[jcs.next_scanline*row_stride];

		jpeg_write_scanlines(&jcs, row_pointer, 1);  
	}  

	jpeg_finish_compress(&jcs);  
	jpeg_destroy_compress(&jcs);  
	fclose(f);  

	return 1;  
}  



//int main(void)
extern int jpg_screen_capture(char * file_name)
{  
	int i = 0, j = 0;
	int w = 0, h = 0;
	int ret = 0;
	unsigned char *p;
	screen fb_screen;

	init_fb(&fb_screen);

	w = fb_screen.w;
	h = fb_screen.h;

	p = (unsigned char *)malloc(w * h * 3);

	printf("0x%x %x %x %x\n", *fb_screen.fbmem, *(fb_screen.fbmem + 1), \
			*(fb_screen.fbmem + 2), *(fb_screen.fbmem + 3));

	short *cursor = (short*)fb_screen.fbmem;
	switch(fb_screen.bpp)
	{
		case 32:
			for(i = 0; i < h; i++)
			{
				for(j = 0; j < w; j++)
				{
					*(p + (i * w + j) * 3 + 0) = *(fb_screen.fbmem + (i * w + j) * 4 + 0);
					*(p + (i * w + j) * 3 + 1) = *(fb_screen.fbmem + (i * w + j) * 4 + 1);
					*(p + (i * w + j) * 3 + 2) = *(fb_screen.fbmem + (i * w + j) * 4 + 2);
				}
			}
			break;

		case 16:
			while(i<w*h)
			{
				short pixel = *cursor;     
				int r = (pixel & 0xF800) << 8; 
				int g = (pixel & 0x7E0) << 5;  
				int b = (pixel & 0x1F) << 3;
				int color = 0xFF000000 | r | g | b;

				*(p + 3 * i + 0) = (unsigned char)(color>>16 &0xFF);
				*(p + 3 * i + 1) = (unsigned char)(color>>8  &0xFF);
				*(p + 3 * i + 2) = (unsigned char)(color>>0  &0xFF);
				i++;
				cursor++;
			}
			break;

		default:
			printf("not support bpp %d\n",fb_screen.bpp);
			return -1;
			break;
	}

	//	ret = generateJPEG(p, fb_screen.w, fb_screen.h, "/data/test/test.jpg");  
	ret = generateJPEG(p, fb_screen.w, fb_screen.h, file_name);  

	term_fb(&fb_screen);	
	free(p);
	return ret;
}

监听keyevent事件

这里为了避免单按键对使用造成影响,需同时监听两个keyevent 分别为event3event5,对这两个事件的监听采用了无阻塞方式,在poll池中对两个event进行检测,通过event.codeevent.value 区别按键(那个按键)动作(按下/松开),最后通过fork_sound()

/*=============================================================================
#     FileName: getevent.c
#         Desc: get events of powerkey and volume + 
#       Author: Lee Meng
#        Email: leaveboy@gmail.com
#     HomePage: http://leaveboy.is-programmer.com/
#      Version: 0.0.1
#   LastChange: 2013-01-15 09:32:53
#      History:
=============================================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <sys/poll.h>
#include <linux/input.h>

#define TIME_DELAY   6000 
#define IN_FILES  2
#define SAVE_PATH "/data/logs"
#define SOUND_PATH "system/media/audio/alarms/Alarm_Buzzer.ogg"

struct timeval tv,tv_event3={0L, 0L},tv_event5={0L, 0L};
static unsigned char  event3_down = 0x00;//
static unsigned char  event5_down = 0x00;
struct input_event event;

static void  fork_sound(void)
{
  pid_t pid = fork();
  if (pid == 0) {
    execl("/system/bin/stagefright", "stagefright", "-o", "-a", SOUND_PATH, NULL);
    /*execl("/system/bin/busybox", "busybox", "tar", "cvf", "/mnt/sdcard/logs.tar",SAVE_PATH, NULL);*/
    //execl("/system/bin/busybox", "busybox", "bzip", "-9", "/mnt/sdcard/logs.tar",NULL);
  }
}
/*int main(void) {*/
extern int event_capture_jpg(void) {
  int pollres;
  struct pollfd  fds[2];
  struct tm *p;
  time_t now;
  char capture_name[128];

  int i, real_read;
  printf("sizeof(struct input_event) = %d\n", sizeof(struct input_event));
  fds[0].fd  = open("/dev/input/event3", O_RDONLY|O_NONBLOCK);//volume button
  fds[1].fd  = open("/dev/input/event5", O_RDONLY|O_NONBLOCK);//power button

  for (i = 0; i<IN_FILES; i++){
    if ( fds[i].fd < 0 ) return -1;
    fds[i].events = POLLIN;
  }
  while(1){
    pollres = poll(fds,IN_FILES,TIME_DELAY);
    for (i = 0; i< IN_FILES; i++){
      if (fds[i].revents){
        real_read = read(fds[i].fd, &event, sizeof(event));
        if(real_read < (int)sizeof(event)) {
          fprintf(stderr, "could not get event\n");
          break;
        }
        time(&now);
        p = localtime(&now);
        sprintf(capture_name,"%s/%d-%d-%d_%d-%d-%d.jpg",
            SAVE_PATH,
            1900+p->tm_year, 1+p->tm_mon, p->tm_mday, 
            p->tm_hour, p->tm_min, p->tm_sec);
        printf("%d %u %u %u\n", i, event.type, event.code, event.value);

        if (i == 0x01 && event.type == 0x01 && event.code == 0x6B && event.value == 0x00)
          event5_down = 0x00;

        if (i == 0x00 && event.type == 0x01 && event.code == 0x73 && event.value == 0x00)
          event3_down = 0x00;

        if (i == 0x01 && event.type == 0x01 && event.code == 0x6B && event.value == 0x01)
        {
          event5_down = 0x01;
          if(event3_down&event5_down)
          {
            jpg_screen_capture(capture_name);
            fork_sound();
            printf("Lee Meng capture jpg:%s\n",capture_name);
          }
        }

        if (i == 0x00 && event.type == 0x01 && event.code == 0x73 && event.value == 0x01)
        {
          event3_down = 0x01;
          if(event3_down&event5_down)
          {
            printf("Lee Meng capture jpg:%s\n",capture_name);
            jpg_screen_capture(capture_name);
            fork_sound();
          }
        }

      } 
    }
    //no sleep
  }

  for(i=0;i<2;i++){
    if(fds[i].fd > 0){
      close(fds[i].fd);
      fds[i].fd = -1;
    }	
  }
  return 0;
}

main函数及Android.mk

main.c

#include <stdio.h>


int main(void)
{
  while(1)
  event_capture_jpg();
}

Android.mk

LOCAL_PATH := $(my-dir)

commonSources  :=

commonIncludes := $(TARGET_OUT_HEADERS)/common/inc

commonSharedLibraries :=  liboncrpc
commonSharedLibraries +=  libnv
commonSharedLibraries +=  libcutils libxml2 libicuuc
commonSharedLibraries +=  libutils
commonSharedLibraries +=  libjpeg libc


include $(CLEAR_VARS)
LOCAL_MODULE := qlogd
LOCAL_CFLAGS := $(commonCflags)

LOCAL_C_INCLUDES := $(call include-path-for, system-core)/cutils
LOCAL_C_INCLUDES += $(commonIncludes)
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_C_INCLUDES += external/jpeg
LOCAL_SRC_FILES := main.c getevent.c capture_jpg.c
LOCAL_MODULE_TAGS := optional eng
LOCAL_SHARED_LIBRARIES += $(commonSharedLibraries) 
LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
include $(BUILD_EXECUTABLE)

这四个文件放到Android工程下面vendor/qlogd目录下,mmm编译之后就可以在/system/xbin/找到qlogd,将qlogd push到手机上相应的目录/system/xbin/,添加可以执行权限

chmod 777 qlogd

然后运行

/system/xbin/qlogd&

按下power键和音量-键,就可以听到Bi Bi Bi的提示音了。

如何带路径复制文件

背景

前段时间在做代码合并的时候,不得不采取手工merge,由于涉及的文件很多,单个beyondcmp着实抗不住,就想着用命令一次性搞定。

分析

beyondcmp多文件比较需要路径一致,因此如果要做这样的修改,就需要将目前修改的文件放到对应的目录下。

思路

起初的想法是先截取每个文件所在的目录全路径,然后通过cp的方式复制过去,但这样感觉太过复杂,可能还需要写一个小脚本,有点过了。最后就想到之前用tar的带路径压缩解压,至于参数列表可以通过xargs-I参数来解决,这样就可以解决文件路径创建的问题。

做法

使用git diff --name-only可以将当前仓库做的修改文件列出来
使用tar cvf将文件带路径压缩
最终的命令就是

git diff --name-only | xargs -I @ tar cvf 11.tar  @

或者

git status --short | awk '{print $2}' | xargs -I @ tar cvf 11.tar  @ 

前者只列出修改的文件,后者包含了新加的文件–未添加到仓库中
使用tar xvf11.tar文件带路径解压 仓库外的新目录,然后与另一个仓库进行目录比较,最后在beyondcmp中做手工merge

后记

其实这种操作本来可以避免,但是目前由于android的版本太多,多文件比对操作无法避免,上面的做法,简单明了,能很快的将修改文件列出比较,相对与文件逐一寻找比对要方便,时间上也节省不少。

archlinux awsome3.5 config

awesome config 3.5

由于时间原因,前几天将升级后awesome 3.5回退到3.4.但总感觉不爽,所以昨天终于
忍不住又折腾了一下,把所有的控件都整安逸.还是有点点收获.先上张图

awesome screenshot
awesome 3.5修正了2个 3.4上一直存在的两个问题

  • term不能最大化的bug
  • 对非焦点窗口透明话支持(之前桌面切换会导致无法获得焦点

自己的配置文件已经上传到github上,有兴趣的同学可以下载来看看.欢迎指正

链接地址: 点击前往

ubuntu virtualbox XP 使用adb受限问题

前提条件:

ubuntu 在vbox XP下使用adb shell

问题说明:

C:\Documents and Settings\Administrator>adb devices
List of devices attached
MSM8225I370 device
	
C:\Documents and Settings\Administrator>adb shell
error: protocol fault (status 72 6f 6f 74?!)

原因在于:

virtualbox XP 设置时,USB设备 启用USB2.0 EHCI控制器.如果启用了该选项就会导致adb shell无法启动,偶尔会导致 QTSP中无法烧写model侧img

写了一个类似prey功能的脚本

在网上年到prey(就是传说中的黑客找回已丢电脑那个工具)感觉还不错,就是要注册,使用次数还有限制,所以打算自己折腾一下!

lost 脚本放在/usr/bin 下,请自己加执行权限:

chmod +x /usr/bin/lost

使用方法:

lost -h

脚本源码lost:

#!/bin/bash
####################################################################
# Lost create by leaveboy@gmail.com
# Discription: when your pc lost,it can help you to find it!
# License: GPLv3
###################################################################)
version=1.0
 
scp_user='leaveboy'  #user
scp_server='216.194.70.6' #an online server which pc could connect
scp_path="/home/${scp_user}/" #lost file path
email='leaveboy@gmail.com'  # address msg_file and image send to
msg_file='/tmp/lostinfo'
 
show_version(){
    echo "Prey ${version}"
}
show_usage(){
    echo "Prey ${version} "
    echo -e "\nUsage: `basename $0` [options]"
    echo -e "Options:"
    echo -e "  -v | --version\tShow Current Version."
    echo -e "  -h | --help\t\tShow this message.\n"
    echo -e "NOTICE"
    echo -e "  This script runs under linux system and For Run this script you should have follow software:\
        w3m scrot mutt ssh.\n"
    echo -e "ADD/DELETE CRONTAB"
    echo -e "  Run the follow command to add lost to crontab:"
    echo -e "  \$(sudo crontab -l | grep -v lost; echo \"*/20 * * * * /usr/bin/lost > /var/log/lost.log\") | sudo crontab -"
    echo -e "  Run the follow command to delete lost from crontab:"
    echo -e "  \$(sudo crontab -l | grep -v lost) | sudo crontab -\n"
    echo -e "ACTIVE/UNACTIVE"
    echo -e "  Touch a file named \"lost\"under the scp_path of the scp_server to actived."
    echo -e "  remove the file \"lost\" under the scp_path of the scp_server to unactived.\n"
}
 
until [ -z "$1" ]; do
    case "$1" in
        -v | --version )
            show_version && exit
            ;;
        -h | --help | * )
            show_usage && exit
    esac
    shift
done
 
send_mail(){
    F=`scrot '%F-%T_$wx$h_scrot.png' -e  'mv $f /tmp/ & echo $f'`
    #you can add any what you want in here
    `w3m http://www.ip138.com/ips8.asp  | grep '来自' > ${msg_file}`    #网络地址
    `uname -a >>  ${msg_file}`                                          #系统信息
    `uptime   >>  ${msg_file}`                                          #启动信息
    `ifconfig >>  ${msg_file}`                                          #网络信息
    `ps ux   >>  ${msg_file}`                                           #用户进程
    `more ${msg_file} | mutt -s "lost" ${email} -a /tmp/${F}`
}
#run condition you can change it and get some info from lost,of course,if it has!
if [ -f "/tmp/lost" ]; then
    send_mail && exit
else
    `scp ${scp_user}@${scp_server}:${scp_path}/lost /tmp/lost`
    if [ -f "/tmp/lost" ]; then
        send_mail && exit
    fi
fi