依旧长时间不更新 ╮(╯▽╰)╭

啊~~~发现还是没怎么更新博客,进后台一看,没事的时候贴的草稿一大堆,发布出去的几乎没有,懒死了

发现自己还是不怎么喜欢写东西,不喜欢排版,什么时候能做一个把脑子里的的各种印象 memcpy 到电脑的设备呢?那时候就可以很方便的弄东西了。

这个月 7 号,外公去世了,突然一下就走了。我突然发现人年纪大了,身体病痛来了就很容易接近死亡。外公去年还能下地干活,年初突然就身体不好中风了,半身不遂。舅舅在家照顾外公,尽心尽力了,但外公还是去了。

这周五部门年底聚餐,喝了一点酒,我这是很久没喝酒,稍微来一点就不行了。不会说话,不知道怎么给老大敬酒- -、餐桌文化严重缺失啊,作为一个只会动筷子吃东西的吃货,这样太悲催了,以后怎么和老大们搞好关系嘛,哎,这嘴巴确实得练练。几个同事喝的一塌糊涂,都是平时压力太大,都不省人事了,在厕所里守着,看着他们吐得个难受啊。酒这个东西,小饮怡情、大饮伤身,没事还是少喝点。

昨晚上群里冒了个泡,和众撸友撸了好久,好久没玩了,各种坑啊,哎。

明天又要开始上班了,有些地方又要开始坑了,不过就像撸啊撸一样,每个人都有坑的时候,关键只要大家一个团队相互配合、相互帮助,终归是会能克服困难的。

Long time no update

好久没更新了,最近没少折腾东西,但是一直在折腾,木有写什么日志做一些保留神马的。最近信息没怎么梳理,只是在不停的尝试一些问题的解决办法,找到了些有用的资料也就是直接把网页快照下来,所以最近笔记软件没少用,像 EverNote、轻笔记、为知笔记等等,笔记软件用起来挺不错的,各有各的长处吧,但是对我来说主要就是存网页快照了。

最近工作的内容主要是搭环境,一个软件让我弄了快三个星期,简直恶心死了,主要是因为系统版本太低,导致需要解决各种依赖,往往是装一个软件需要 N 多依赖,装依赖的程序的时候发现依赖还需要依赖,然后就成了一棵很大的树了。最开始为了省事,拉下来一个源,结果发现系统版本太低,yum、apt-get 神马的都成浮云了,很多东西都不能安装到指定版本,而且系统还不能跨版本升级,强行升级直接不能开机╮(╯▽╰)╭

最后还是申请了一台机器装了个新版本的系统才搭完了这一套程序环境,我觉得老版本的系统得在这个月老老实实的一个个装依赖了,苦逼啊。。。

关于 SSH 证书登录的问题

使用 SSH 的证书登录是十分方便的,但是有时候明明设置好了,但是登陆的时候却还是要输入密码,这个主要跟目录的权限关系比较大,首先是 root 目录的权限,默认的情况下应该是

drwxr-xr-x

然后是.ssh 文件夹,默认权限应该是

drwx------

authorized_keys 文件,则应该是

-rw-------

如果权限设置有问题,很有可能就登陆不进去了。

关于 Discuz 在反向代理后用户 IP 的获取

原本是 Discuz 的一个安全处理,这时候却给我带来了点麻烦。

CG 最近想给实验室弄个 BBS,于是默认选了 Discuz,主机原来是 Windows 的,装了 Apache + MySQL + PHP,安装 Discuz 的时候还很正常,装完之后 CG 说上不去了。我打开页面,反应了半天还是没出来,于是打算在虚拟机里面装一个 Ubuntu,然后在 Ubuntu 下跑 Discuz。

装虚拟机神马的就不再说了,装完之后,突然想到一个问题,虚拟机的 IP 不能分到一个公网 IP,只能是虚拟网卡的内部 IP,这就意味着只有服务器能访问虚拟机。我知道 Nginx 是有反向代理的,然后上网一搜,发现 Apache 也可以实现反向代理,Apache 还确实很强大啊。于是马上修改 httpd.conf

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
ProxyPreserveHost On
ProxyPass /bbs/ http://192.168.77.80/bbs/
ProxyPassReverse /bbs/ http://192.168.77.80/bbs/
ProxyPass /bbs http://192.168.77.80/bbs

检查语法没错,重启 Apache 服务打开网址一看,OK。装上一个 Discuz 测试一下,一切正常。然后看到 IP 我就纠结了,我在论坛上显示的 IP 都是 192.168.77.1,即服务器的 IP,怎么会这样子。这个万一要封 IP,岂不是都不能上了。于是开始郁闷了,在服务器上抓一下包,发现服务器的 Apache 反向代理是会转发连接用户的真实 IP 的,为什么在 Discuz 中不显示呢?开始我还以为是 Discuz 设计的问题,没有怎么仔细去查这个问题。突然,今天同学在实验室上网的时候,显示的登录 IP 是实验室的 IP,我就纳闷了,貌似寝室的 IP 地址 Discuz 不认啊。于是搜一下源代码,发现在 source/class/discuz/discuz_application.php 有如下片段

private function _get_client_ip() {
	$ip = $_SERVER['REMOTE_ADDR'];
	if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
		$ip = $_SERVER['HTTP_CLIENT_IP'];
	} elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#d{1,3}.d{1,3}.d{1,3}.d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
		foreach ($matches[0] AS $xip) {
			if (!preg_match('#^(10|172.16|192.168).#', $xip)) {
				$ip = $xip;
				break;
			}
		}
	}
	return $ip;
}

原来是 Discuz 认为寝室的 IP 段(10.xxx.xxx.xxx)算是伪造的 IP,好吧。把寝室的 IP 段限制删了,马上就正常了。

wget 是个好东西啊

wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP、HTTPS、FTP 三个最常见的 TCP/IP 协议下载,并可以使用 HTTP 代理。

可以通过它来镜像站点,很多时候在做 Linux 的源或者 Apache 的源的时候,第一次下载整个镜像的时间是很长的,所以可以先用 wget 镜像一个比较快的站,然后稍微整理下,就可以直接用 rsync 进行数据同步了。

wget 的具体使用如下:

继续阅读 wget 是个好东西啊

三月上半个月的各种事

好久没写东西了,最近很多纠结的事情,各种各样的。

体检

开始是驾校的体检,真是件很蛋疼的事情,我有一定程度的红绿色弱,但是不是红绿色盲,然后车管所体检的时候,觉得我辨别颜色的能力有问题,直接认定成色盲了。哎,我承认我是色弱,但是我还没到色盲的程度啊,红绿灯我能看得出啊,最后还得给驾校交钱处理。。。

不过反过来想,我现在到是觉得红绿灯的设计有点歧视色觉障碍人士,非得要用颜色来区分干嘛?为什么不能用形状之类的呢?比如通行亮箭头,禁止通行亮个叉之类的,亮与不亮应该都能分得出吧?让我想起了金工实习的时候,一位老师傅的抱怨,新买的机床运行的开关是个红色的按钮,紧急停止是个绿的,容易出事故,让我们以后在设计东西的时候一定要多多考虑。不管怎么说,现在新的交通灯系统已经逐渐在升级了,哎,什么时候交通灯也能再多多考虑点颜色的问题呢?

山西行

额,体完检,过几天顺利通过的那一批就参加理论考试了,所以我家妹纸也去了。考完试就拉着我去她家了,坐火车坐了一晚上,虽说买的是卧铺,可我还是半夜被冻醒了,虽说现在火车不用烧火了,但也不至于让人家半夜冻醒吧。

第二天早上醒来就到了,各种山头啊,密密麻麻的,火车途中还经过了各种煤矿相关的企业,什么煤场啊、焦炭厂什么的,以及各种带烟囱的工厂。到站后,她爸爸来接我们了,回去途中各种绕盘山公路,各种拉煤的大卡车。她们家由于整个村子要整体改造被拆了用于建设新的居民区而搬到别人家去了,现在住的地方在一个山头的半山腰上,去了之后才知道,冬天水管冻坏了,喝水还得去山底下的人家去担水。额,反正让我体验了把真正的西北缺水生活。

这几天也去逛了逛山头,“太阳出来我爬山坡,爬到了山顶我想唱歌”,站在山顶我确实想唱歌,“我家住在黄土高坡哦~~~大风从坡上刮过~” 果然是黄土高坡啊~~到处都是黄土,不带什么绿色的,大部分山都是光秃秃的,偶尔还能看到几个窑洞、几户人家,大风一吹就是小型沙尘暴啊。不过到处能看到一个个白色的编织袋,好像是肥料和泥土,貌似适用于种树育苗的。估计她们那改造是把居民都从山上移出来,山上全部种树吧。可见山西还是在做转型,或者也是在为改善居住环境作努力吧。他们那也就是一个资源型的城市,如果煤挖完了,确实也就荒芜了。

回学校的线路是另外一条,途中火车各种钻山洞了,哎,怪不得愚公要移山啊,现代的科技给我们带来了便利,也消耗了大量的资源,有些东西到底值不值呢?确实有待衡量啊。

宿舍厕所改造

学校的厕所终于开始改造了,我刚来学校就很看不惯学校的奢侈啊,虽说是挨着黄河,但再怎么说也是缺水的地区,水质也很差,煮开的水有股怪味,还有很厚的一层水垢,果断大二的时候结石了,学校的宿舍也太奢侈了,至少我们楼的厕所的小便池一天 24 小时都是漫流的,想关的话,连个阀门都找不到。当时我就有点无语,我家在南方,挨着洞庭湖,每隔几年还发发洪水,但是我从小到大都没见过这种公用场所 24 小时水漫流的地方。

学校终于改造宿舍的排水系统了,把生活废水(主要是洗衣服、洗漱等)回收下用于冲厕所,竟然还是自动感应的。额,前几天刚刚看了一个视频,讲的是以前的机械师设计的开香槟的机器,可以把香槟打开,并且准确的倒到酒杯里,让我感觉以前的设计师是多么的构思巧妙,纯粹的机械装置,没有什么电机,传感器之类的。最近还看了一个电影—— The Invention of Hugo Cabret ,看到以前人们设想的机器人,也都是纯机械的。有时候看看现在,大部分东西都得依赖电,感觉有了各种传感器,就现代化了,就牛叉了似的。但是有时候我感觉,有些地方用这么多电路却是退化了,很多东西原本可以用机械去触发,我们很多能源都浪费在了不必要的地方。我感觉厕所这种地方,可以设计一种类似于那种原始的拉线开关似的设备,在池边加一块踏板,上厕所的过程中站上去,拉下开关,完了的时候离开踏板。我们高中就是这种储水箱似的冲厕所,不过是用手拉的,我觉得厕所开关应该设计成脚踏的比较卫生。什么时候好好构思一下这个设备,说不定还能当成一个发明,呵呵。

琐事

还有一些妹纸家里的琐事,各种麻烦,最近还没解决掉,暂时也就不多说了,她家兄弟姐妹多了确实是热闹,但是有时候也会有点闹心,不管怎么说呢,我还是觉得一个家里能够有个两个小孩还是不错的,作为独生子女的我感受不到他们的那种情感的。

老妈今年身体不太舒服,这几天刚刚去检查了,开始还被误判为冠心病,弄的我妈各种焦虑。前几天去湘雅检查,说是左前降支心肌桥,医生说是肥胖引起的心血管生长畸形,问题不是很大,但是的注意保养,听到这个结果,我妈又松了口气。哎,我现在倒是觉得我妈心病比身体上的疾病更加厉害啊,心理暗示太强了,文科的老妈伤不起啊,哎~~~

不过不管怎么说,身体健康才是第一的,不管怎么样,都要健康快乐的活着。

Visual C++ 6.0 CDialogBar Create 出错解决方案

今天打算弄一个工具栏,于是设计了一个对话框,然后建立一个 CDialogBar 对象,可是在 Create 的时候老是出错,报错地点如下:

File:bardlg.cpp
Line:48

然后看了一下别人的建立过程,发现别人建立对话框的时候,是直接建立的 IDD_DIALOGBAR 的对话框,于是比较了 IDD_DIALOGBARIDD_DIALOG 的各种参数,发现只要把建立的 IDD_DIALOG 对话框的属性改一下就可以了。

样式:下层;边框:无;
更多样式:取消可见

其他的设置没有测试,默认的对话框按以上设置之后就能当作工具栏使用了。

Visual C++ 6.0 使用心得

Visual C++ 6.0 使用了一段时间了,其中有些东西修改一下能用得更加顺手,于是记录一下。

修改工作空间的图标

打开注册表,定位到 HKEY_CLASSES_ROOT\dswfile\DefaultIcon, 双击默认,然后把 msdev.exe 之后的串删了即可。

新建进程打开项目

直接删除注册表 HKEY_CLASSES_ROOT\dswfile\shell\&Open with MSDev\ddeexec 部分,再次打开 dsw 文件的时候就不会把原来开着的项目给关了。

Windows 7 下添加文件到项

首先下载一个插件 FileTool,然后解压到文件夹 C:\Program Files\Microsoft Visual Studio\Common\MSDev98\AddIns(假设是安装在默认的位置,详情请根据机器调整),然后打开 VC——工具——定制——附加项和宏文件,勾选 FileTool Developer Studio Add-in,这时就会出来一个工具条,就可以通过工具条添加、打开文件了。

VC6 下通过 DirectShow 调用摄像头

首先,我们下载一下 DirectX 的 SDK 开发包,目前我们可以使用的是 DirectX 9.0 SDK(Summer 2004)之后的版本 DirectShow 已经被分离出去了。下载之后安装,安装前最好把 IDE 都给关了,免得路径没有添加进去。

我们开始设计阶段:

我们先通过 MFC AppWizard(exe) 建立一个 MFC 的基本对话框,去除默认的两个按钮和文本,然后我们添加一个图像控件、一个组合框、一个按钮,然后设置属性,详情如下:

然后,我们通过类向导添加成员变量,详情如下:

我们双击 Test按钮,进入代码编写。

首先,我们把摄像头的两个文件加到项目路径下,然后再在文件视图里面添加这两个文件进项目。

然后,我们给窗口类的头文件里面添加引用

#include "CaptureVideo.h"

接着,给窗口类添加一个私有的成员变量

private:
         CCaptureVideo m_cap;

然后再在窗口初始化的时候,初始化设备列表

m_cap.EnumDevices(m_Device.GetSafeHwnd());
m_Device.SetCurSel(0);

然后在按键的时候初始化摄像头就是的

m_cap.Init(m_Device.GetCurSel(),m_Screen.GetSafeHwnd());
m_OK.EnableWindow(FALSE);

我的设计环境为 Windows 7 SP1 、 Visual C++ 6.0 SP6 ,借鉴的别人的程序,如果有其他问题,欢迎一起讨论。
源代码点击下载


关于出现以下错误的解决方案

C:\DXSDK\Include\strmif.h(1018) : error C2146: syntax error : missing ';' before identifier 'HSEMAPHORE'
C:\DXSDK\Include\strmif.h(1018) : fatal error C1004: unexpected end of file found
CapDlg.cpp
C:\DXSDK\Include\strmif.h(1018) : error C2146: syntax error : missing ';' before identifier 'HSEMAPHORE'
C:\DXSDK\Include\strmif.h(1018) : fatal error C1004: unexpected end of file found
CaptureVideo.cpp
C:\DXSDK\Include\strmif.h(1018) : error C2146: syntax error : missing ';' before identifier 'HSEMAPHORE'
C:\DXSDK\Include\strmif.h(1018) : fatal error C1004: unexpected end of file found
Generating Code...
执行 cl.exe 时出错.

在项目的 StdAfx.cpp 里面加上

#include "C:\DXSDK\Include\strmif.h"

编译一次就好了,之后注释掉就好了。