土匪养成记

2014-2-25                                           雾霾                        冷

大小:两个月+

土匪昨晚、今早、中午拉的粑粑都不是干干的条状,有点湿。丢girl查了一下,有可能是吃多了、喝了凉水、感冒。

吃多了——确实,,,,惭愧。昨天中午在食堂打了二两饭+肉汤+肉渣,然后回来和上妙鲜包+狗粮,一共乘了满满的一饭盒。小土匪全给消灭了,过多。

喝凉水——给喝了矿泉水,估计放在书包里在外面走的时间太久了,矿泉水凉。

感冒——小土匪丢肚子上没有毛毛,每次出都想找一个地方躲风,应该是觉得冷了。

以后注意,以后注意。

large_En41_3a58000005b9118f

是否

我们会否因为某些改变而改变,土匪丢

小忧郁,理解你。才只在你那充满父爱母爱和兄弟姐妹欢声笑语的家呆了九九八十一天,就被狠心的大奉丢和小丢girl给带走了。新家里没有哥哥姐姐弟弟妹妹,没有爸爸妈妈,只有两个高大的猴子,虽然有一个很漂亮,但另一个太吓人了,就知道这不准那不准,那不准这不准。

“再也不笑了”,你对自己说。

我心里的秘密 是你给的甜蜜
我们之间的距离每天一点点靠近
这是种别人无法理解的特殊感情

其实大丢丢心里有一个秘密哟,是你给的甜蜜呢,看着我们之间的距离每天一点点的靠近,G.E.M说这是种别人无法理解的特殊感情。

你知道吗,你来了以后大丢丢跟他的小丢girl也改变了很多习惯哦,我们不再一回来就开电脑,不再一直坐在椅子上上网。我们特别喜欢你趴在身边的样子,我们特别喜欢直接坐在地毯上,跟你坐在一起,这是一份我们一直都想拥有的恬静。

谢谢你土匪丢!希望你健健康康,快快乐乐成长。

IMG_1567

PHP 调用 SHELL 需要注意的地方

最近需要从前端调用系统命令实现一些东西,然后返回到前端来。

思来想去,觉得 html <-> php <-> shell的模式应该不错。从html到php可以用ajax实现动态交互,但php调用shell的这个过程需要注意一些地方。在这里浪费了不少时间。

第一:调用方式

PHP提供共了3个专门的执行外部命令的函数:system(),exec(),passthru()。具体的用法Google一下已经很多了。

第二:权限问题

由于我的web项目是在apache目录下的,但apache并没有足够的权限执行一些诸如mkdir等命令,导致我拔一些东西并储存的时候毫无反应。简单的做法就是修改一下web项目所在目录权限就可以了。

比如

$ chmod -R 777 /home/www/example

 

05高19班九周年聚会回忆录

春风疑不到天涯,二月山城未见花。这个,,其实山城还是有些梅花。

大年初四,一群05高19班的童鞋以及童鞋家属们风风火火的热闹了一把,探讨了诸如“雅玉十号”等历史性问题。

整个聚会历时1,2,3,4,,,好多个小时。具体就如下图所示啦,没有来的,接女朋友接男朋友迟到的,中途神秘消失一圈又回来的,以及早退的(本大秘书长第二天要送大学姐回娘家,错过了最后一个活动不算),个人看一哈错过了哪些,记账到下盘儿的十周年。错过一项罚一(到时候再说)。

图片1

回忆录就要有一个回忆的样子,其实整个过程是这样的:

寒假某日,收到班长短信。

IMG_8736

老板:“对啦,就是我啦!”

说九周年了,让组织一下聚会,顺便为十周年准备准备。

我想行啊,说来也有好久没见他们了,说干就干,讨论了一下时间、地点等问题,就开始宣传通知。

一路耍到KTV的时候,数了一哈,手头还剩下几十张大家交妮毛主席,想着啷个才能花出去。这里有大猫儿这个金牌vip,也花不了多少钱。

IMG_8753

大猫儿:“嘿嘿,大家好,对了对了,这个说的就是我了。”

老赖:“大猫儿上次穿起制服就来了,牛逼得很”

搭了一句话,又忙着低头思考他的长城去了,后天得给大红包,先补充补充弹药!

IMG_8746

有了!不是正好带了相机迈,把照片洗出来给每个人都快递一份儿,再整个相册,要是还剩得有,再用他们自己的照片弄一个喀嚓鱼创意杯,肯定就差不多了。

“达尔,把你的地址写一哈,隔天儿我照片洗出来了给你快递过来”

IMG_8830_0

“不干,你龟儿要给我邮递耗儿药”

“爬,耗儿药闹得住你不嘛,快点儿”

“Okay,,,Okay,,。咦?!老子的剪刀手涅?啷个照脱了”

IMG_8790_2

“遭耗儿啃老!”

“。。。”

“好,让我过去找陶小叉”

才几年不见,肥了岂止一圈儿两圈儿,当初的校草现在简直不堪入目,/乐一个, /乐一个。

IMG_8838

“你在说老子迈,还不是一样帅,懂不懂欣赏。”

“爬!”

“过来我跟你说,刚才我去重百看辣妹儿,越来越多老,还没看安逸斗喊我回来,不是说今天儿女生也要来迈?”

“勒里,须须来得最早,你看别个都生了娃儿了,身材还楞个好,而且皮肤比生之前还要好了样。”

IMG_8748_2

周小熊:“豆是豆是,我都发现了,我算了一哈,勒是生娃儿的时候体会激素达到了一种平衡,导致了吧啦吧啦吧啦…&%&……%@!(#@!*&x!$,,”

IMG_8737

“算个牙刷儿算,豆你算得出来,我们不是有医生迈,喊医生来分析一哈嘛”

IMG_8879

韩镇长:“不要看我,旁边的申大医生”

张飞:“来,把我跟申大医生放一起”

IMG_8785

雅玉十号:“咦?现在进入合照阶段了哇,不是说先介绍个人的迈?”

“勒张照片我实在不晓得啷个裁剪啊,就当张飞也一起show过了,先把你的整上来嘛”

“销魂一点儿的”

“Okay”

IMG_8856

“这张可以嘛?”

“不错不错,只是有点不过瘾儿,还有没得?”

“肯定有撒,勒里,还有一张”

IMG_8858

猪源:“也,聂不住,你勒两张有点儿张狂哟,小眼镜儿,看勒里,看勒里”

咔嚓咔嚓。。。

IMG_8832

肚皮:“哈哈哈,猪源你龟儿个面瘫,好鸡公傻,胡ka,我也,老子来得最早,还没有漏过脸,来一张特写。”

“好,马上,我找一哈,都有”

猪源:“莫要慌,莫要慌,不跟他龟儿单独照,我要跟我儿子合影一张!”

肚皮:“滚,是跟你爸爸合影”

“。。。他两个妮辈分,我是从高中到现在都还没搞清楚”

达尔:“扯不撑,扯不撑!不管勒些,猪源后天结婚,听他的,让他们两父子合影。哎呀,干脆我也来插一脚”

猪源:“对头,来,达尔,我们一个扯他龟儿一只猪耳朵!”

IMG_8836

王大血:“你们不要只晓得照男妮嘛,你看别个爱里芬好孤单”

IMG_8789

爱丽芬:“爬嘛你,你才孤单,来忧郁一个撒,王大血”

王大血:“好歹是从小遭勒到大的,每天必遭一勒,忧郁豆忧郁”

IMG_8851

罗大肛:“也,表演有点儿到位哟大血管!我也来抖一个撒。”

IMG_8751

张飞:“万般带不走,只有喝杯酒!来来来,下面进入合照环节,乾杯!”

IMG_8819

肚皮:“你龟儿慌啷个嘛,还有家属没有出镜撒,黑,黑”

IMG_8750

达尔:“对头对头,先来照一哈我们家婷婷儿”

IMG_8793

“婷婷儿,看勒里”

不理,继续吃,继续吃,,,,,,

达尔巴:“。。。算老算老,让她先吃点儿”

大猫儿:“来,我也跟我媳妇儿合照一张”

IMG_8844

聂不住:“该我们老,该我们老。来媳妇儿,把酒端起,我跟你讲吧啦吧啦吧啦吧啦,,,,,”

IMG_8806

“。。。你们倒是都看镜头撒”

IMG_8744

张飞:“哟,你女朋友呢?在干撒子”

original_0B65_0a8a000060b1118c

“等风来”

“好了好了好了,下面正式进入合照环节,你们个人耍哈,我给你们照。”

“唱歌滴,看这边看这边,猪源儿,把小白掰过来”

MIMG_8876

“张飞你又成功抢镜了撒,批娃娃。”

肚皮:“他龟儿国外旋了一圈儿,是楞个滴,话筒拿来哟,下一首是我和大猫儿的”

IMG_8839

陶小叉:“来,须须,等他们切唱歌,我来给你指导一哈麻将”

IMG_8758

罗大肛:“也,你只怕不对哟,也来指导一哈儿我撒”

IMG_8773

王大血:“指导你,,,呵儿,呵儿,你看他那样子像是会指导我们的迈,呵儿,呵儿”

IMG_8775

众人:“哈哈哈,,,就是就是,你还不了解他?”

IMG_8827

老板:“赞同赞同赞同,我来带头鼓个掌”

老赖:“是勒个道理”

神经:“。。。。”

IMG_8855

王大血:“来嘛,为同感干一杯”

老板:“来嘛来嘛,酒端倒,碰了我还要跟大猫儿一起唱歌”

IMG_8818

大猫儿:“这首歌送给大家,来,照一个”

老赖:“快,把这个动作抓下来”

猪源:“老子后天结婚,抓一哈给伍佰,各自抓”

须须:“哎呀,挤到我了,茄子~~~~~~~~”

IMG_8861

小白:“来,新年快乐”

IMG_8872

周小雄:“再唱两首换地方老哦,你看这里都一个躺起老”

IMG_8847

肚皮:“最后让大血管跟神经合唱一首嘛,换地方了”

聂不住:“作数”

陶小叉:“。。。你看他们两个都坐好了”

IMG_8820

达尔:“狗日滴你们看大血管好happy,合照了合照了,照完了换地方,哟,还有几个人呐??”

IMG_8852

“合照了合照了,那几个失踪半个小时,先不管,来来来都来”

MIMG_1503

后面由于相机没电了,照片到此为止,换大排档继续龙门阵摆起!一群人,江边边儿。大风起兮云飞扬,安得猛士兮喝趴四方!!!

后记:

洗完1000+张照片,人手一个相册,发现聚会基金即将告罄,看来这次没办法弄惠普喀嚓鱼了,留等下一次。

IMG_1504

2014.2.6 @ 重庆

SHELL 脚本从文件中按行读取数据

今天遇到一个问题:

需要给Shell脚本传递参数,一般来说,我们采用

$ ./test.sh para1 para2 para3 para4

这种方式,然后在shell中使用$1, $2, $3, $4 即可获取传入的参数。

但由于这次需要传递的参数实在太多,大约100K个(通过文件给出,每行即为一个参数),所以得变通一下。Google以后,发现通过awk命令可以实现,具体如下:

[shell]

#! /bin/bash

for x in ` awk ‘{print $0}’ number_sub.txt `
{
echo $x
}

[/shell]

接下来就可以做想做的工作了,解决。

Linux系统启动过程

面试的时候被问到Linux启动过程,没有答得很好。回来收集了一些资料,发现有一篇博客写得不错,不过是英文的。特翻译过来供广大小伙伴们参考:)

原文: http://www.thegeekstuff.com/2011/02/linux-boot-process/

———————————————————- 我是背景 ——————————————————–

通常,我们按下开机键,几秒钟后,我们就能看到Linux的登录界面。

但是你有没有想过,在屏幕的背后,这一切是怎么发生的呢?

下面会为大家分六个阶段简述一下一个典型的Linux操作系统的启动过程。

linux-boot-process

1. BIOS

  • BIOS,即 Basic Input/Output System BIOS,基本输入输出系统。
  • 对系统做完整性检查,即计算机硬件能否满足运行的基本条件。如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止,比如内存卡没有插好。
  • 查找,加载以及执行引导装载程序。
  • 它会在软盘、光盘或者硬盘驱动器等上查找引导装载程序。你也可以在BIOS启动过程中按F12或者F2(一般来说是这两个键)来改变这个顺序。比如重装系统的时候,你在BIOS阶段按F12,然后选择从U盘启动。
  • 一旦引导装载程序被找到并且加载到了内存中,BIOS就将计算机的控制权交给它了。
  • 简单来说,BIOS阶段就是加载并执行MBR

2. MBR

  • MBR,即Master Boot Record. MBR, 主引导记录。
  • 位于启动盘的第一扇区,一般为 /dev/hda或者/dev/sda
  • MBR 共有512位,由三个部分组成,1)第1-446位,主引导加载程序信息 2)接下来64位存放分区表 3)最后两位用来存储MBR有效标记
  • 它包含了GRUB的信息(或者在一些老系统上的LILO信息)
  • 简单来说,MBR阶段就是加载并执行GRUB

3. GRUB

    • GRUB,即Grand Unified Bootloader,启动管理器。
    • 如果你在操作系统分区中装了好几个内核,通过GRUB,你就可以选择启动哪一个。
    • GRUB会展示一个初始化的界面,等待你的选择,如果过了等待时间,它就会加载在grub配置文件中指定的默认内核镜像。
    • GRUB能够识别文件系统(在老Linux系统上的LILO并不能识别文件系统)。
    • Grub 配置文件在 /boot/grub/grub.conf (/etc/grub.conf 只是一个链接)。下面是一个CentOS中的grub.conf文件信息
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-194.el5PAE)
          root (hd0,0)
          kernel /boot/vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/
          initrd /boot/initrd-2.6.18-194.el5PAE.img
  • 正如你从上面所看到的那样,它包含了内核以及initrd镜像的信息,initrd中含有内核所需的一些基本模块驱动。
  • 简单来说,GRUB阶段就是加载并执行内核以及initrd镜像。

4. Kernel

  • 挂载根文件系统,这个已经在grub.conf文件中”root=”指出。
  • 运行/sbin/init 程序来初始化系统环境
  • 由于/sbin/init 是第一个被Linux内核所执行的程序,它的进程ID号为1。可以通过命令“ps -ef | grep init”看到。
  • initrd,即 Initial RAM Disk,是用内存模拟的磁盘,一个临时文件系统。
  • 在真正的根文件系统被挂载之前,initrd被内核作为一个临时的文件系统,其中含有内核所需的一些基本模块驱动,内核启动时展开该initrd来加载相应的驱动,在该驱动的补充之下从而挂载上根分区;

5. Init

  • 根据/etc/inittab 文件来设定LInux的运行级别。
  • Linux的运行等级设定如下:
    • 0 – halt,关机
    • 1 – Single user mode,单用户模式
    • 2 – Multiuser, without NFS,无网络支持的多用户模式
    • 3 – Full multiuser mode,有网络支持的多用户模式
    • 4 – unused,保留,未使用
    • 5 – X11,有网络支持有X-Window支持的多用户模式
    • 6 – reboot,重新启动
  • Init程序根据/etc/inittab指定的默认运行等级来加载适当的程序。
  • 执行命令‘grep initdefault /etc/inittab’可以看到系统默认的运行等级
  • 如果你想给自己找点儿麻烦,你可以把默认运行等级设置为0或者6,鉴于你已经知道了0和6代表什么,我估计你不会那样干:)
  • 通常你会设置默认运行等级为3或者5

6. Runlevel programs

  • 当Linux系统启动以来以后,你会看到有很多服务也跟着运行起来了。比如你可能会看到“starting sendmail …. OK”。这些就是设置运行等级以后会对应加载的程序了。
  • 系统会根据你设置的系统运行等级来运行下面某一个目录中的所有程序。
    • Run level 0 – /etc/rc.d/rc0.d/
    • Run level 1 – /etc/rc.d/rc1.d/
    • Run level 2 – /etc/rc.d/rc2.d/
    • Run level 3 – /etc/rc.d/rc3.d/
    • Run level 4 – /etc/rc.d/rc4.d/
    • Run level 5 – /etc/rc.d/rc5.d/
    • Run level 6 – /etc/rc.d/rc6.d/
  • 请注意,这里面也包含直接指向/etc目录下的符号链接。也就是说,/etc/rc0.d 是指向/etc/rc.d/rc0.d的链接。
  • 在 /etc/rc.d/rc*.d/ 这些目录下面,你可以看到很多名字以S或者K开头的程序
  • 以S开头的程序是在启动过程中使用的,S代表startup。
  • 以K开头的程序是在关闭过程中使用的,K代表kill。
  • 这里还有数字出现在S或者K的后面,它们代表了程序的执行顺序。
  • 比如说,S12syslog 是用来启动syslog deamon,他的启动顺序是12,S80sendmail是用来启动sendmail daemon,他的启动顺序是80。那么显然syslog会先于sendmail启动。

好了,就是这些,这就是在Linux启动过程中所发生的事情。

C++面试题集合

只熟悉C,对C++不甚了解啊,但是面试又基本只有C++和Java的。于是乎,整理一下自己遇到的C++面试/笔试题吧

———————————————–我是背景———————————————————————

题目一:一个C++空类建立以后,会产生哪些成员函数?

分析:当时我就只想到了构造和析构函数啊。答案是6个。

[cpp]
class Empty
{
public:
Empty(); // 缺省构造函数
Empty( const Empty&); // 拷贝构造函数
~Empty(); // 析构函数
Empty& operator=( const Empty&); // 赋值运算符
Empty* operator&(); // 取址运算符
const Empty* operator&() const; // 取址运算符 const
};
[/cpp]

但并不一定是6个,如果编译器发现我们只是申明了Empty,并没有发现创建Empty的实例,那么编译器是什么函数都不会生成的。

所有这些只有当被需要才会产生。比如,
Empty e;
编译器就会根据上面的实例,给类Empty生成构造函数和析构函数。
当使用
Empty  e2(e);
编译器就会生成类Empty的拷贝构造函数。
Empty   e3;
e3 = e;
编译器生成赋值运算符函数
Empty    &ee = e;
编译器生成取地址运算符函数。

经过我们的分析可以这样理解:对于一个没有实例化的空类,编译器是不会给它
生成任何函数的,当实例化一个空类后,编译器会根据需要生成相应的函数。这条理论同样
适合非空类(只声明变量,而不声明函数)。

———————————————————————————————————————————–

题目二:STL中,vector与list的区别?

分析:其实基本就是 数组 与 双向链表 的区别,所以就很显然啦。

vector能够很好的支持随机访问,即有下标操作[],但如果要插入或者删除一个数则需要较多次数的移动元素。

list能够很好的支持插入、删除操作,但由于没有下标操作[],所以查找一个元素的时候比较耗时。

———————————————————————————————————————————–

题目三:内联函数、宏的区别?

分析:

由于内联函数首先它是一个函数,所以可以从宏与普通函数的对比入手,先引用一下别人的总结。

(1)、宏只做简单的字符串替换,函数是参数传递,所以必然有参数类型检查(支持各种类型,而不是只有字符串)以及类型转换。
(2)、宏不经计算而直接替换参数,函数调用则是将参数表达式求值再传递给形参。
(3)、宏在编译前(即预编译阶段)进行,先替换再编译。而函数是编译后,在执行时才调用的。宏占编译时间,而函数占执行时间。
(4)、宏参数不占空间,因为只做字符串替换,而函数调用时参数传递是变量之间的传递,形参作为局部变量占内存空间。
(5)、函数调用需要保留现场,然后转入调用函数执行,执行完毕再返回主调函数,这些耗费在宏中是没有的。

使用宏和内联函数都可以节省在函数调用方面的时间和空间开销。二者都是为了提高效率,但是却有着显著的区别:

(1)、内联函数首先是函数,函数的许多性质都适用于内联函数(如内联函数可以重载)。
(2)、在使用时,宏只做简单的文本替换。内联函数可以进行参数类型检查,且具有返回值(也能被强制转换为可转换的合适类型)。
(3)、内联函数可以作为某个类的成员函数,这样可以使用类的保护成员和私有成员。而当一个表达式涉及到类保护成员或私有成员时,宏就不能实现了(无法将this指针放在合适位置)。

———————————————————————————————————————————–

题目四:实现一个算法,删除字符串重复字符

分析:当时笔试面试已经搞了一下午,头晕眼花,第一次还写错了。回来整理了一下,其实很简单。

用两个指针p, q遍历待处理的字符串str,p负责记录有效位,q负责往前扫描。初始化q指向p的下一个字符。

(1) 如果p的字符和q的字符不等,那么由p记录下来,p与q均往前移动一个字符

(2) 如果p的字符和q的字符相等,那么p不动,q往前移动一个字符

代码如下

[cpp]
// the input str must terminated by ‘\0’
char* str_rm_dup(char *str)
{
char *p = str;
char *q = p;

// if str is NULL, then return
if(!p)
return NULL;

/*
* Assign q to the next address of p.
* Before that, we use *q++, not *++q to check whether *p == ‘\0’ in the first loop,
* because if the str is an empty string, str[0] will be ‘\0’.
*/
while(*q++)
if(*p != *q)
*++p = *q;

return str;
}

int main()
{
char a[] = "aabbbccdeeeeee";
printf("%s\n", str_rm_dup(a)); // abcde
return 0;
}
[/cpp]

———————————————————————————————————————————–

题目五:要求写一个没有错误的二分

分析:主要就是注意两点

(1) 整数相加溢出,比如4位机器上,a和b都等于7,即0111,那么相加就悲剧了。

(2) 防止无限循环

代码如下

[cpp]

/*
* Find the index of v if it is in the array of interval [a, b), -1 if not.
* @para a, the first location of the NOT DESC array
* @para l, the lowest index of the interval to be searched
* @para h, the highest index of the interval to be searched
* @para v, the candicate value
* @return index of v, or -1 if not found
*/
int bs(int *a, int l, int h, int v)
{
int m;
while(l < h)
{
m = (unsigned)l + (unsigned)h >> 1; // avoid the overflow of integer
if(a[m] == v)
return m;
if(a[m] < v)
l = m + 1;
else
h = m;
}
return -1;
}

[/cpp]

———————————————————————————————————————————–

题目六:深拷贝、浅拷贝区别?

分析:我的理解就是,浅拷贝只简单赋值,深拷贝是在需要的时候申请新的内存空间。假设我们有一个简单类A,代码如下所示:

[cpp]
class A
{
public:
A(char *s) : str(s) {}
void display()
{
cout << str << endl;
}
public:
char *str;
};
[/cpp]

然后我们写一个简单的main函数来调用它,如下

[cpp]
int main(void)
{
char name[] = "David";

A a(name);
A b = a;

a.display();
b.display();

b.str[0]=’P’;

a.display();
b.display();

return 0;
}
[/cpp]

结果为

QQ图片20131031155933

这是由于我们在类A中并没有去实现拷贝构造函数,编译器则帮我们实现了一个默认的,默认的构造函数则是简单的变量赋值,所以对象a和b的str成员变量其实指向的是同一块儿内存。所以改了一个,另外一个也会跟着改变。

下面我们修改一下类A,代码如下

[cpp]
class A
{
public:
A(char *s) : str(s) {}
void display()
{
cout << str << endl;
}
A(const A &another)
{
str = (char*)malloc(sizeof(char) * (strlen(another.str) + 1));
strcpy(str, another.str);
}
public:
char *str;
};
[/cpp]

然后看运行结果

QQ图片20131031160544

这次对象a和b的str由于指向的不是同一块儿内存地址,所以改了b的str对a不会造成影响。

还有一个区别是,貌似在消除对象a或者b的时候,如果是浅拷贝,会删除两次str所指的内存空间,会造成不可预料的结果。但是我跑程序暂时还未出现崩溃。

———————————————————————————————————————————–