存档

‘转载’ 分类的存档

指导性架构设计原则

2010年11月11日 16hot 没有评论

下面的指导性设计原则描述了我们的设计理念

  • 只要某一功能的缺失不会导致无法完成某个实际的应用程序, 就不新增该功能。
  • 决定系统不做成什么样子, 与决定将它做成什么样子同样重要。 不去满足所有的需要, 而是让系统具备可扩展性, 使其能够向上兼容。
  • 尽可能抽象代码中的通用部分, 除非没有可以用来抽象的实例。
  • 如果没有完全理解一个问题, 最好干脆不提供任何解决方案。
  • 如果能用 10% 的工作完成 90% 的工作, 则选择较简单的解决方案。
  • 尽可能隔离复杂性。
  • 提供机制而非策略。 具体而言, 将用户界面策略交由客户去选定。

摘自 Scheifler & Gettys: “X Window System”

http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/developers-handbook/introduction-archguide.html

分类: BSD/linux, 转载 标签:

Bash Shell中命令行选项/参数处理

2010年11月11日 16hot 没有评论

转自: http://www.cnblogs.com/FrankTan/archive/2010/03/01/1634516.html

0.引言

写程序的时候经常要处理命令行参数,本文描述在Bash下的命令行处理方式。

选项与参数:

如下一个命令行:

./test.sh -f config.conf -v –prefix=/home

我们称-f为选项,它需要一个参数,即config.conf, -v 也是一个选项,但它不需要参数。

–prefix我们称之为一个长选项,即选项本身多于一个字符,它也需要一个参数,用等号连接,当然等号不是必须的,/home可以直接写在–prefix后面,即–prefix/home,更多的限制后面具体会讲到。
在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景。

* 手工处理方式
* getopts
* getopt

下面我们依次讨论这三种处理方式。

1. 手工处理方式

在手工处理方式中,首先要知道几个变量,还是以上面的命令行为例:

*    $0 : ./test.sh,即命令本身,相当于C/C++中的argv[0]
*    $1 : -f,第一个参数.
*    $2 : config.conf
*    $3, $4 … :类推。
*    $#  参数的个数,不包括命令本身,上例中$#为4.
*    $@ :参数本身的列表,也不包括命令本身,如上例为 -f config.conf -v –prefix=/home
*    $* :和$@相同,但”$*” 和 “$@”(加引号)并不同,”$*”将所有的参数解释成一个字符串,而”$@”是一个参数数组。如下例所示:

1 #!/bin/bash
2
3 for arg in ”$*”
4 do
5     echo $arg
6 done
7
8 for arg in ”$@”
9 do
10     echo $arg
11 done
12

执行./test.sh -f config.conf -n 10 会打印:

-f config.conf -n 10    #这是”$*”的输出

-f   #以下为$@的输出

config.conf

-n

10

所以,手工处理的方式即对这些变量的处理。因为手工处理高度依赖于你在命令行上所传参数的位置,所以一般都只用来处理较简单的参数。如

./test.sh 10

而很少使用./test -n 10这种带选项的方式。 典型用法为:

#!/bin/bash

if [ x$1 != x ]
then
#…有参数
else
then
#…没有参数
fi

为什么要使用 x$1 != x 这种方式来比较呢?想像一下这种方式比较:

if [ -n $1 ]  #$1不为空

但如果用户不传参数的时候,$1为空,这时 就会变成 [ -n ] ,所以需要加一个辅助字符串来进行比较。

手工处理方式能满足大多数的简单需求,配合shift使用也能构造出强大的功能,但在要处理复杂选项的时候建议用下面的两种方法。

2. getopts/getopt

处理命令行参数是一个相似而又复杂的事情,为此,C提供了getopt/getopt_long等函数,
C++的boost提供了Options库,在shell中,处理此事的是getopts和getopt.

getopts和getopt功能相似但又不完全相同,其中getopt是独立的可执行文件,而getopts是由Bash内置的。

先来看看参数传递的典型用法:

* ./test.sh -a -b -c  : 短选项,各选项不需参数
* ./test.sh -abc   : 短选项,和上一种方法的效果一样,只是将所有的选项写在一起。
* ./test.sh -a args -b -c :短选项,其中-a需要参数,而-b -c不需参数。
* ./test.sh –a-long=args –b-long :长选项

我们先来看getopts,它不支持长选项。

使用getopts非常简单:
代码

#test.sh

#!/bin/bash

while getopts ”a:bc” arg #选项后面的冒号表示该选项需要参数
do
case $arg in
a)
echo ”a’s arg:$OPTARG” #参数存在$OPTARG中
;;
b)
echo ”b”
;;
c)
echo ”c”
;;
?)  #当有不认识的选项的时候arg为?
echo ”unkonw argument”
exit 1
;;
esac
done

现在就可以使用:
./test.sh -a arg -b -c

./test.sh -a arg -bc
来加载了。
应该说绝大多数脚本使用该函数就可以了,如果需要支持长选项以及可选参数,那么就需要使用getopt.
下面是getopt自带的一个例子:

#!/bin/bash

# A small example program for using the new getopt(1) program.
# This program will only work with bash(1)
# An similar program using the tcsh(1) script language can be found
# as parse.tcsh

# Example input and output (from the bash prompt):
# ./parse.bash -a par1 ’another arg’ –c-long ’wow!*\?’ -cmore -b ” very long ”
# Option a
# Option c, no argument
# Option c, argument `more’
# Option b, argument ` very long ’
# Remaining arguments:
# –> `par1′
# –> `another arg’
# –> `wow!*\?’

# Note that we use `”$@”‘ to let each command-line parameter expand to a
# separate word. The quotes around `$@’ are essential!
# We need TEMP as the `eval set –’ would nuke the return value of getopt.

#-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项
#如-carg 而不能是-c arg
#–long表示长选项
#”$@”在上面解释过
# -n:出错时的信息
# – :举一个例子比较好理解:
#我们要创建一个名字为 ”-f”的目录你会怎么办?
# mkdir -f #不成功,因为-f会被mkdir当作选项来解析,这时就可以使用
# mkdir – -f 这样-f就不会被作为选项。

TEMP=`getopt -o ab:c:: –long a-long,b-long:,c-long:: \
-n ’example.bash’ – ”$@”`

if [ $? != 0 ] ; then echo ”Terminating…” >&2 ; exit 1 ; fi

# Note the quotes around `$TEMP’: they are essential!
#set 会重新排列参数的顺序,也就是改变$1,$2…$n的值,这些值在getopt中重新排列过了
eval set – ”$TEMP”

#经过getopt的处理,下面处理具体选项。

while true ; do
case ”$1″ in
-a|–a-long) echo ”Option a” ; shift ;;
-b|–b-long) echo ”Option b, argument \`$2′” ; shift 2 ;;
-c|–c-long)
# c has an optional argument. As we are in quoted mode,
# an empty parameter will be generated if its optional
# argument is not found.
case ”$2″ in
“”) echo ”Option c, no argument”; shift 2 ;;
*)  echo ”Option c, argument \`$2′” ; shift 2 ;;
esac ;;
–) shift ; break ;;
*) echo ”Internal error!” ; exit 1 ;;
esac
done
echo ”Remaining arguments:”
for arg do
echo ’–> ’”\`$arg’” ;
done

比如我们使用
./test -a  -b arg arg1 -c
你可以看到,命令行中多了个arg1参数,在经过getopt和set之后,命令行会变为:
-a -b arg -c — arg1
$1指向-a,$2指向-b,$3指向arg,$4指向-c,$5指向–,而多出的arg1则被放到了最后。

3.总结

一般小脚本手工处理也许就够了,getopts能处理绝大多数的情况,getopt较复杂,功能也更强大。
有问题请指出,不胜感激。

分类: Shell, 转载 标签:

linux coredump配置与调试

2010年11月4日 16hot 没有评论

1.core文件的生成开关和大小限制
———————————
1
)使用ulimit -c命令可查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。
2
) 使用ulimit -cfilesize命令,可以限制core文件的大小(filesize的单位为kbyte)。若ulimit -cunlimited,则表示core文件的大小不受限制。如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此 core文件的时候,gdb会提示错误。


2.core
文件的名称和生成路径
—————————-
若系统生成的core文件不带其它任何扩展名称,则全部命名为core。新的core文件生成将覆盖原来的core文件。
1
/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core
可通过以下命令修改此文件:
echo “1″ > /proc/sys/kernel/core_uses_pid
2
proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。
可通过以下命令修改此文件:
echo “/corefile/core-%e-%p-%t” > core_pattern
,可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
%p – insert pid into filename
添加pid
%u – insert current uid into filename
添加当前uid
%g – insert current gid into filename
添加当前gid
%s – insert signal that caused the coredump into the filename
添加导致产生core的信号
%t – insert UNIX time that the coredump occurred into filename
添加core文件生成时的unix时间
%h – insert hostname where the coredump happened into filename
添加主机名
%e – insert coredumping executable name into filename
添加命令名

3.用gdb查看core文件:
下面我们可以在发生运行时信号引起的错误时发生core dump.
发生core dump之后, gdb进行查看core文件的内容, 以定位文件中引发core dump的行.
gdb [exec file] [core file]
:
gdb ./test test.core
在进入gdb, bt命令查看backtrace以检查发生程序运行到哪里, 来定位core dump的文件->.


4.
开发板上使用core文件调试
—————————–
如果开发板的操作系统也是linuxcore调试方法依然适用。如果开发板上不支持gdb,可将开发板的环境(头文件、库)、可执行文件和core文件拷贝到PClinux下,运行相关命令即可。
注意:待调试的可执行文件,在编译的时候需要加-gcore文件才能正常显示出错信息!


注意的问题:

Linux下要保证程序崩溃时生成Coredump要注意这些问题:

一、要保证存放Coredump的目录存在且进程对该目 录有写权限。存放Coredump的目录即进程的当前目录,一般就是当初发出命令启动该进程时所在的目录。但如果是通过脚本启动,则脚本可能会修改当前目 录,这时进程真正的当前目录就会与当初执行脚本所在目录不同。这时可以查看”/proc/<进程pid>/cwd“符号链接的目标来确定进程 真正的当前目录地址。通过系统服务启动的进程也可通过这一方法查看。

二、若程序调用了seteuid()/setegid()改变 了进程的有效用户或组,则在默认情况下系统不会为这些进程生成Coredump。很多服务程序都会调用seteuid(),如MySQL,不论你用什么用 户运行mysqld_safe启动MySQLmysqld进行的有效用户始终是msyql用户。如果你当初是以用户A运行了某个程序,但在ps里看到的 这个程序的用户却是B的话,那么这些进程就是调用了seteuid了。为了能够让这些进程生成core dump,需要将/proc/sys/fs /suid_dumpable文件的内容改为1(一般默认是0)。

三、这个一般都知道,就是要设置足够大的Core文件大小限制 了。程序崩溃时生成的Core文件大小即为程序运行时占用的内存大小。但程序崩溃时的行为不可按平常时的行为来估计,比如缓冲区溢出等错误可能导致堆栈被 破坏,因此经常会出现某个变量的值被修改成乱七八糟的,然后程序用这个大小去申请内存就可能导致程序比平常时多占用很多内存。因此无论程序正常运行时占用 的内存多么少,要保证生成Core文件还是将大小限制设为unlimited为好。

分类: BSD/linux, 转载 标签:

判断两个链表有无交点,如果有请给出交点

2010年11月4日 16hot 没有评论
  1. /*
  2. * if list_a and list_b has cross point return the addrss of cross-point.
  3. * else return NULL
  4. */
  5. static List *has_cross(List *list_a, List *list_b)
  6. {
  7. List    *pa;
  8. List    *pb;
  9. int     len_a, len_b;
  10. int     i;
  11. len_a = len_b = 0;
  12. pa = list_a; /* 遍历链表a,并记录下此链表的长度 */
  13. while (pa->next != NULL) {
  14. pa = pa->next;
  15. len_a++;
  16. }
  17. pb = list_b; /* 遍历链表b,并记录下链表b的长度 */
  18. while (pb->next != NULL) {
  19. pb = pb->next;
  20. len_b++;
  21. }
  22. if (pa != pb) /* 如果指针pa,pb最后不相等,则两链表没有焦点 */
  23. return NULL;
  24. /* 较长的链表先向后调整到第N个元素(N = max(len_a, len_b) - min(len_a, len_b))
  25. 然后两链表同步向后调整,同时比较地址是否相等,如果相等则为首焦点。*/
  26. pa = list_a;
  27. pb = list_b;
  28. if (len_a > len_b) {
  29. for (i = len_a - len_b; i; i–)
  30. pa = pa->next;
  31. } else {
  32. for (i = len_b - len_a; i; i–)
  33. pb = pb->next;
  34. }
  35. while (pa != pb) {
  36. pa = pa->next;
  37. pb = pb->next;
  38. }
  39. return pa;
  40. }
分类: C/C++, 转载 标签:

删除C程序中的注释

2010年11月4日 16hot 没有评论
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. int main(int argc, char **argv)
  5. {
  6. char start;
  7. char end;
  8. char cur;
  9. start = end = ’\0′;
  10. while ((cur = getchar()) != EOF) {
  11. if (cur == ’/' && start == ’/') {
  12. while ( (cur = getchar()) != EOF && cur != ’\n’) {
  13. start = cur;
  14. }
  15. start = ’\0′;
  16. } else if (start == ’/' && cur == ’*') {
  17. while ( (cur = getchar()) != EOF) {
  18. if (end == ’*' && cur == ’/') {
  19. start = end = cur = ’\0′;
  20. break;
  21. }
  22. end = cur;
  23. }
  24. }
  25. if (start != ’\0′)
  26. putchar(start);
  27. start = cur;
  28. }
  29. putchar(start);
  30. exit(EXIT_SUCCESS);
  31. }
分类: C/C++, 转载 标签:

管道(PIPE)

2010年10月28日 16hot 没有评论
进程通信(IPC)的几种方式及比较
撰文:黄显国080416
难得闲暇,抽空学习了一下进程通信的知识,现将这几天的所学做一下总结,以备遗忘时参考。
进程通信的方式:
Linux系统继承了三种系统的进程通信模式:
1、 基于system V IPC
2、 基于UNIX IPC
3、 基于POSIX IPC
同时还包含一种socket进程间通信,不过这种是不同处理器系统之间的一种网络通信方式,不是我所关心的。
方式一:管道(PIPE
管道分无名管道与有名管道两种
1、 无名管道。
无名管道用于具有亲缘关系的父子进程,子子进程之间的通讯。它的实现函数有
int pipe(int fd[2]);
//fd[2]为描述符数组,包含一个读描述符与一个写描述符,在使用管道通信时,关闭某些不需要的读或写描述符,建立起单向的读或写管道,然后用readwrite像操作文件一样去操作它即可。
如图便是进程1到进程2的一个读管道。
以下是我写的一个pipe的验证程序,分别在父进程和父子进程里向管道写数据,然后在子进程和子子进程里读数据,当尝试改变各子进程的sleep时间以实现渴望的同步时,会发现结果很有趣。注意创建子进程时将复制父进程的管道。
/*******************************************************************************************/
//pipe.c
//frome the example, we can see:
//pipe创建的无名管道,父子进程,子子进程之间都可以通信,由于read
//write默认为阻塞,而进程与进程之间又有某种意义上的同步方法;
//故而可以从下面的程序中得到一些启示。
/*****************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main()
{
int pipe_fd[2];
char buf_r[100];
char buf_rr[100];
if(pipe(pipe_fd)<0)
{
printf(“pipe create error\n”);
return -1;
}
else
printf(“pipe create success\n”);
printf(“pipe_fd[0]=%d,pipe_fd[1]=%d\n”,pipe_fd[0],pipe_fd[1]);
if(fork()==0)//子进程
{
close(pipe_fd[1]);//关闭子进程的写描述符
printf(“fork()”);
//sleep(2);
if(fork()==0)//子子进程
{
if(read(pipe_fd[0],buf_r,5)>0)
printf(“BUF_R: in child child process,read from the pipe is %s\n”,buf_r);
close(pipe_fd[0]);
exit(0);
}
Else //子进程
{
if(read(pipe_fd[0],buf_rr,3)>0)
printf(“BUF_RR: in child parent process,read from the pipe is %s\n”,buf_rr);
close(pipe_fd[0]);
exit(0);
}
}
else  //父进程
{
close(pipe_fd[0]);
sleep(5);
if(write(pipe_fd[1],”Hello “,5)!=-1)
printf(“write1 parent pipe success\n”);
if(fork()==0)  //父子进程
{
if(write(pipe_fd[1],”PIPE”,5)!=-1)
printf(“write parent child pipe success”);
close(pipe_fd[1]);
exit(0);
}
close(pipe_fd[1]);
exit(0);
}
}
2、 有名管道
有名管道可用于两个无关的进程之间的通信。它的实现函数是:
int mkfifo(const char *filename, mode_t mode)
//创建一个名为filename的管道,模式可选为读或写方式,阻塞或非阻塞方式等。
下面一个实例演示了mkfifo的使用。Fifo_read.c不断从管道文件里读数据,fifo_write.c往管道文件里写数据。改变sleep的值也会产生类似上面进程同步的问题,而会发现一些缓冲区的特性。
两个程序用gcc编译后在两个终端里运行。
//—————————————————————————————————
//fifo_read.c
//创建有名管道,演示两个不相关的进程之间的通信
//int mkfifo(const char *filename, mode_t mode)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#define FIFO “/home/huang/myfifo”
int main(int argc,char **argv)
{
int fd;
int nread;
char buf_r[100];
if(mkfifo(“/home/huang/myfifo”,O_CREAT|O_EXCL)<0)//&&(errno!=EEXIST))
{
perror(“mkfifo:”);
printf(“cann’t create fifoserver\n”);
return -1;
}
printf(“Preparing for reading bytes…\n”);
fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);
if(fd==-1)
{
perror(“open!\n”);
exit(1);
}
while(1)
{
memset(buf_r,0,sizeof(buf_r));
if((nread=read(fd,buf_r,sizeof(buf_r)))==-1)
{
if(errno==EAGAIN)
printf(“no data yet\n”);
}
printf(“read %s from FIFO\n”,buf_r);
sleep(1);
}
pause();
unlink(FIFO);
}
//——————————————————————————————————————
//fifo_write.c
//创建有名管道,演示两个不相关的进程之间的通信
//int mkfifo(const char *filename, mode_t mode)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#define FIFO “/home/huang/myfifo”
int main(int argc, char **argv)
{
int fd;
char w_buf[100];
int nwrite;
if(argc==1)
{
printf(“please send some message\n”);
exit(1);
}
fd=open(FIFO,O_WRONLY|O_NONBLOCK,0);
if(fd==-1)
{
if(errno==ENXIO)
printf(“open error;no reading process\n”);
perror(“open:”);
return -1;
}
memset(w_buf,’a',sizeof(w_buf));
printf(“sizeof(w_buf)=%d\n”,sizeof(w_buf));
while(1)
{
if((nwrite=write(fd,w_buf,strlen(w_buf)))==-1)
{
if(errno==EAGAIN)
printf(“The FIFO has not been write yet.\n”);
perror(“write”);
//     else
//     printf(“error in writting!\n”);
}
else
printf(“write %s to the FIFO\n”,w_buf);
sleep(2);
}
close(fd);
}
分类: BSD/linux, C/C++, 转载 标签: ,

libevent的一些知识

2010年10月18日 16hot 没有评论

1、什么动作会触发EV_READ, 什么动作触发EV_WRITE?
2、为什么connection_accept()的eventflag有EV_PERSIST,而connection_time的没有?

通过查资料,终于搞明白了!
在《UNIX网络编程第1卷(第2版)》第6章 “I/O 复用:select和poll函数”(129页),有解释:

===============
描述字符在什么条件下准备好?
1、下列的4个条件中的任何一个满足时,socket准备好读(即有EV_READ):
a)套接口接收缓冲区中的数据字节大于等于套接口接收缓冲区低潮限度的当前值(可以设定,默认为1)
b)连接的读这一半关闭(即收到了FIN的TCP连接)。(也就是读到结尾了)
c)套接口是一个接听套接口且已完成的连接数为非0。
d)有一个套接口错误待处理。
2、下列的3个条件中的任何一个满足时,socket准备好写(即有EV_WRITE):
a)套接口发送缓冲区中的数据字节大于等于套接口发送缓冲区低潮限度的当前值(可以设定,默认为2048),且:
aa)套接口已连接 或 bb)套接口不需要连接(如UDP)
b)连接的写这一半关闭。
c)有一个套接口错误待处理。
===============

根 据刚才的time server中的例程,当client有socket连上来,应该是EV_READ,因为满足1中的c“套接口是一个接听套接口且已完成的连接数为非 0”,当该连接被acept以后,就有EV_WRITE了,因为它满足2中的a“套接口发送缓冲区中的数据字节大于等于套接口发送缓冲区低潮限度的当前 值,且套接口已连接”。所以,event_set的时候,EV_READ是有人连上来,回调函数是connection_accept(),而 EV_WRITE是在accept以后。

那EV_PERSIST呢?
EV_PERSIST,是在event发生了以后,不从队列中拿开,就是下次再有这个消息的时候,继续调那个回调函数,知道程序主动调用了event_del后,才从队列中删除--就算有那个消息也不回调函数。
connection_accept函数,只要有连接上来,就要调用的,所以它需要设置为EV_PERSIST。
但 connection_time函数,用途是在client连上来以后,给client一个返回,然后就断开连接。那它必须在连接连上了以后,只做一次, 所以不需要设置为EV_PERSIST,而且必须在accept中设置--如果没有accept就算有EV_WRITE也不应该调用它啊。

分类: C/C++, 转载 标签:

4个月宝宝厌奶期怎么办?(转)

2010年9月10日 16hot 没有评论

我儿子4个月多几天,最近吃奶都不好好吃,老是把奶嘴含在嘴里假吃,头转来转去东看西看的.吃一次奶起码要40分钟,平时吃210ML,现在只吃150ML,一天才吃4餐.中间有一餐是米粉加奶粉的,我真怕这样子营养不够.有没有什么好办法啊?

第1招 不用强迫手段

很多家长都担心宝宝喝太少会长不大,于是采用强迫的方式。但是这种做法反而会让宝宝对吃产生恐惧。其实只要宝宝身高、体重等发展状况,都在可以接受的范围内,并不需要强迫他喝奶,这个时期家长应该思考,如何协助宝宝接受半流质的辅食,而非强迫他喝奶。

第2招 改变喂食方式

当宝宝出现厌奶的征兆,爸妈可以从改善喂食方式做起,采取较为随性的方式,不需要按表作业。以少量多餐为原则,等宝宝想吃的时候再吃。可以通过游戏消耗宝宝的体力,例如按摩、肢体活动等,当他精力耗尽、感到饥饿时,进食的状况也会获得改善。

第3招 营造用餐环境

进食的环境尽量柔和、安静。因为此阶段的宝宝开始对外界感到好奇,用餐时若有人在旁逗弄他,或出现很多能吸引他注意力的玩具、声音,宝宝会觉得这些事情比吃饭更有趣,自然就不想吃了。

第4招 奶嘴洞大小要适当

有时候宝宝喝奶少,可能是因为奶瓶上奶嘴的奶洞太小,使宝宝吸得不顺畅,因此喝的量才减少。先将奶瓶倒过来,检查一下奶瓶上奶嘴的奶洞,是否能顺利流出,通常最佳的速度是1秒1滴,滴不出来或滴得太快,对宝宝都不好。

第5招 不要常换奶粉

看到宝宝不爱喝奶,家长可能直接想到:是不是这个牌子的奶粉宝宝喝腻了?可以更换别的奶粉,但更换速度不要太频繁,宝宝会没有时间适应。如果要换 新牌子,也不要一下子全部换,最好和别牌子的奶粉混合搭配,并观察一周排便状况,若排便正常,表示适应良好,此时才可以更换全新的奶粉。进入厌奶期后,更 换奶粉牌子的效果有限,如果试换了一两次仍没有起色,就可以放弃使用这个方法了。

第6招 适时添加辅食

4个月大左右的宝宝,还是以母乳或配方奶为主,辅食大约吃一两餐即可,因此当宝宝感到厌倦,不妨给他一点新的尝试。可从米粉或稀释的果汁开始,陆 续再加入蔬菜泥和果泥。不过记得要遵守1次加1种的原则,从1小茶匙开始,再慢慢加份量。每种辅食可先尝试3~5天,并观察宝宝的状况。

如果他不喜欢或是皮肤出现疹子、便便变稀等情形,建议先暂缓添加此种辅食,等过阵子再尝试。若是有过敏的家庭史,建议喂食母乳或部分水解奶粉到宝宝6个月大,之后再添加辅食,而添加的辅食以低致过敏性为优先。

第7招 轻松对待厌奶

照顾宝宝的人,其心情和压力会直接传达给宝宝,当照顾者焦虑或强迫宝宝喝奶时,他都能感受到,因而产生抗拒。只要宝宝各方面都健康、正常,也没有生病,家长们就可以放宽心,用顺其自然的态度面对待宝宝的厌奶期,不要和宝宝为了吃展开痛苦的拉距战。

怎样帮宝宝轻松度过厌奶期

我的宝宝为什么喝得那么少,该怎么办才好?别担心,如果宝宝不是因为生病厌食,那他可能是进入了厌奶期。只要用对方法,就不必烦恼宝宝长不大哦!
问题1 发生原因&时间

生理、心理皆会影响

生理因素 当宝宝厌奶时,首先要观察一下,是不是身体不舒服所导致的。如果还并发了呕吐、便秘、腹胀、腹泻、发烧等症状,应该立刻就医治疗。

心理因素 由于从出生开始,宝宝每天喝的都是同一种食物,一段时间后,可能会产生厌恶喝奶的情况,这也是宝宝在提醒爸妈,该给他吃些不同的东西了。适时给宝宝流质食物,便会逐渐恢复胃口,如果宝宝活动力佳、精神也好,只是食欲稍差,爸妈并不用太担心。

4~6个月会发生

宝宝4~6个月大时,好奇心与日俱增,因为脖子的肌肉张力较好,开始对身边的事物感到新奇,也会分散他吃东西的注意力,此时正为常见的厌奶期。

舌头碰到东西往外吐的反应也会消失,如果没有适当添加辅食,用小汤匙喂食以训练宝宝的口腔协调功能,宝宝日后可能会只喝奶不想吃固体食物,出现明显的厌食,会营养不均衡。

哺喂母乳的妈妈,当宝宝出现厌奶时,千万不要因此停止哺乳,只要同时提供软流质的辅食,母乳可以哺喂到2岁。
问题2 辨别厌奶的方法

计算奶量

如何知道宝宝是不是进入厌奶期了呢?这是令很多爸妈感到疑惑的问题。宝宝进入厌奶期之后,最明显的症状就是吃的奶量变少了,因此可以计算宝宝每天所喝的奶量,如果低于所需的奶量,没有生病发烧,且到了4~6个月大,宝宝就可能已经进入厌奶期。

宝宝每天所需的奶量

一般而言,4个月内的宝宝,计算奶量的公式是以宝宝的体重和每天的餐次来计算。

(体重×120~150毫升)÷餐次/(天)=一餐的奶量

Example 4个月大的宝宝,体重大约6千克,一天大约喝6餐。

(6千克×120~150毫升)÷6=120~150毫升/每餐

问题3 生长&发育

对应生长曲线表

宝宝生长好不好,是很多家长关心的事,如果又碰上厌奶,会不会对发育造成影响呢?宝宝的身心动作发展,像是头部控制及肌肉张力、人际互动若都符合 其年龄,代表他的发展是正常的。至于身高、体重和头,本来就是因人而异,不需要跟别的宝宝比较。每次带宝宝看健儿门诊时,医护人员都会测量并记录,不妨将 这些数据,对应儿童健康手册上的生长曲线,观察一下是否在正常范围中,若是数值都正常,爸妈就可以放心。

善用儿童健康手册

假设宝宝的生长曲线一直都在50%左右,到了厌奶期,刚开始并不会有太大变化。正常来说,在25%~75%之间都属于可接受的范围。但如果宝宝吃 得很少,又没有额外添加营养食品或辅食,生长曲线就会下降,可能从50%掉到10%,这就表示厌奶已经对宝宝造成生长上的影响。

其实想要多了解宝宝生长发育是否正常,好好利用儿童健康手册,就能获得非常多的信息!手册中会有宝宝每个月应该发展的评估项目,家长不妨自行检视一下,看看自己的宝宝,有没有符合他的月龄该会做的事,通过儿童健康手册,就能轻松掌握宝宝的生长状况。

每个孩子都有段厌奶期的,没有关系的,过段时间就好了的。

没什么事的

宝宝和成人一样,也有胃口不好的 时候,饱不饱,他自己最知道,如果他很快喝完奶或提前哭,就表示可以再增加奶量;如果喝了一点点就不喝了,爸爸妈妈应先搞清楚,宝宝有没有不舒服,环境中 是否有吸引、令他分心的事情,而不必勉强他喝到一定的量,同时,也不必要严守3小时喂食1次的方式,差个半小时、1小时,并没有关系;睡前的一餐,给他喝 多一点,宝宝可能就一觉到天亮,不会半夜吵着喝奶。

不用担心的,你强硬给他吃,只有令他越来越讨厌吃奶,过一段时间就没事的,现在尽量少吃多餐

宝宝厌奶期,首先要换别的牌子奶粉.

或者,每天给他吃马铃薯泥,蕃薯泥,果泥,面条,鱼肉,米粉

分类: 转载 标签:

Using Serial Devices in FreeBSD / How to set a terminal baud rate

2010年8月24日 16hot 没有评论

http://www.clearchain.com/blog/posts/using-serial-devices-in-freebsd-how-to-set-a-terminal-baud-rate

Recently I was working on a php command line program that required access to a serial port.

Initially developed under Linux the program was then shifted to it’s permanent location on a FreeBSD server. This is where we first started having problems. Initially we discovered the server didn’t have a native serial port. We fixed this using a USB to serial converter/dongle (FTDI Chipset). This was fine as FreeBSD has the ufdti kernel module. Upon loading the module new devices appears in /dev

crw-rw----  1 uucp  dialer    0, 157 Oct  6 08:39 /dev/cuaU0
crw-rw----  1 uucp  dialer    0, 158 Oct  6 08:39 /dev/cuaU0.init
crw-rw----  1 uucp  dialer    0, 159 Oct  6 08:39 /dev/cuaU0.lock
crw-rw-rw-  1 root  wheel     0, 154 Jan  8 10:50 /dev/ttyU0
crw-------  1 root  wheel     0, 155 Oct  6 08:39 /dev/ttyU0.init
crw-------  1 root  wheel     0, 156 Oct  6 08:39 /dev/ttyU0.lock

We attempted to connect to our device using screen (screen /dev/ttyU0 115200) and everything worked as expected. We could send AT commands to the device all ok.
We then stopped screen and ran our php program. It ended up hanging on a fgets call to the serial port. This is really strange we though.
Next we queried the port to find out what baud rate it was set at:

>stty -f /dev/ttyu0
speed 9600 baud;
lflags: echoe echoke echoctl
oflags: tab0
cflags: cs8 -parenb

Strange we thought as we’d just connected with screen at 115200. Under linux we use screen to set the baud rate, all other programs accessing the port use the port at 115200. So what had set it back to 9600 baud?
We tried to use stty to set the speed:

>stty -f /dev/ttyU0 speed 115200
>stty -f /dev/ttyu0
speed 9600 baud;
lflags: echoe echoke echoctl
oflags: tab0
cflags: cs8 -parenb

What on earth was happening? We set the speed to 115200 but directly quering the port again indicated it was still at 9600 baud? At this point we were perplexed.
Eventually we found the solution. The newer FreeBSD terminal drivers provide the *.init devices, in this case /dev/ttyU0.init . These devices indicate the terminal settings to be applied to the terminal when the device is closed. Whilst Linux leaves the device in the same state the last program put the port into, FreeBSD restores the terminals state to what ever is specified in the init file. So a quick command:

> stty -f /dev/ttyU0.init -icanon -isig -echo echoe echok echoke echoctl -icrnl -ixany -imaxbel ignpar -opost -onlcr -oxtabs cs8 -parenb -hupcl clocal

And then to check:

> stty -f /dev/ttyU0
speed 115200 baud;
lflags: -icanon -isig -echo echoe echok echoke echoctl
iflags: -icrnl -ixany -imaxbel ignpar
oflags: -opost -onlcr -oxtabs
cflags: cs8 -parenb -hupcl clocal

Excellent. The terminal was now configured exactly how we wanted. We ran the program and it worked like a charm!

分类: BSD/linux, 转载 标签:

WP-Syntax语法

2010年8月8日 16hot 没有评论

Usage

Wrap code blocks with <pre lang="LANGUAGE" line="1"> and </pre> where LANGUAGE is a GeSHi supported language syntax. See below for a full list of supported languages. The line attribute is optional.

Example 1: PHP, no line numbers

<pre lang="php">
<div id="foo">
<?php
  function foo() {
    echo "Hello World!\\n";
  }
?>
</div>
</pre>

Example 2: Java, with line numbers

<pre lang="java" line="1">
public class Hello {
  public static void main(String[] args) {
    System.out.println("Hello World!");
  }
}
</pre>

Example 3: Ruby, with line numbers starting at 18

<pre lang="ruby" line="18">
class Example
  def example(arg1)
    return "Hello: " + arg1.to_s
  end
end
</pre>

Example 4: If your code already has html entities escaped, use escaped="true" as an option

<pre lang="xml" escaped="true">
&lt;xml&gt;Hello&lt;/xml&gt;
</pre>

Supported Languages

The following languages are supported in the lang attribute:

abap, actionscript, actionscript3, ada, apache, applescript, apt_sources, asm, asp, autoit, avisynth, bash, bf, bibtex, blitzbasic, bnf, boo, c, c_mac, caddcl, cadlisp, cil, cfdg, cfm, cmake, cobol, cpp-qt, cpp, csharp, css, d, dcs, delphi, diff, div, dos, dot, eiffel, email, erlang, fo, fortran, freebasic, genero, gettext, glsl, gml, bnuplot, groovy, haskell, hq9plus, html4strict, idl, ini, inno, intercal, io, java, java5, javascript, kixtart, klonec, klonecpp, latex, lisp, locobasic, lolcode lotusformulas, lotusscript, lscript, lsl2, lua, m68k, make, matlab, mirc, modula3, mpasm, mxml, mysql, nsis, oberon2, objc, ocaml-brief, ocaml, oobas, oracle11, oracle8, pascal, per, pic16, pixelbender, perl, php-brief, php, plsql, povray, powershell, progress, prolog, properties, providex, python, qbasic, rails, rebol, reg, robots, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, sql, tcl, teraterm, text, thinbasic, tsql, typoscript, vb, vbnet, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xml, xorg_conf, xpp, z80

(Bold languages just highlight the more popular ones.)

Styling Guidelines

WP-Syntax colors code using the default GeSHi colors. It also uses inline styling to make sure that code highlights still work in RSS feeds. It uses a default wp-syntax.css stylesheet for basic layout. To customize your styling, copy the default wp-content/plugins/wp-syntax/wp-syntax.css to your theme’s template directory and modify it. If a file named wp-syntax.css exists in your theme’s template directory, this stylesheet is used instead of the default. This allows theme authors to add their own customizations as they see fit.

Advanced Customization

WP-Syntax supports a wp_syntax_init_geshi action hook to customize GeSHi initialization settings. Blog owners can handle the hook in a hand-made plugin or somewhere else like this:

<?php
add_action('wp_syntax_init_geshi', 'my_custom_geshi_styles');

function my_custom_geshi_styles(&$geshi)
{
    $geshi->set_brackets_style('color: #000;');
    $geshi->set_keyword_group_style(1, 'color: #22f;');
}
?>

This allows for a great possibility of different customizations. Be sure to review the GeSHi Documentation.



分类: 转载 标签: