帐前卒专栏

code, software architect, articles and novels.
代码,软件架构,博客和小说

今天花了两个小时解决了Nat连接问题。(环境:vmware workstation 7.0,外部os是XP,虚拟机OS也是XP.
另外防火墙和安全卫士360将vmware.exe设置为例外,内部网络为DHCP。所以我的机器一旦重启ip地址一般会变化。虚拟机的网络设置为NAT)

是用的vmware workstation 7.0,然后虚拟机里面的os是xp.之后xp就怎么都不可以访问外网。

首先检查了下vmware nat服务是否已经启动了。然后虚拟机配置中Network Adapter是否是NAT模式。之后是用ipconfig
/all看看外面的xp是否有VMnet8 这个接口。这时发现VMnet8这个接口存在,就是它的ip实在是太诡异了:162.XXX.XXX.XXX,子网掩码是
255.255.0.0.另外看看虚拟机中的ip地址,显示的也是162.XXX.XXX.XXX,也有子网掩码,但是没有DNS和网关,并且虚拟机中的网络连接显示
受限连接。于是顺手把虚拟机中的ip地址从自动获取改为固定的ip,并且将网关ip写为外面os的VMnet8中的ip地址。这时网络连接不再受限,并且可以由虚拟机
ping通外部os的VMnet8 ip地址。但是依旧不能出外网。

再后来索性看到vmware的工具栏菜单的编辑选项卡中有编辑虚拟网络。然后看到其中的NAT网络。这个网络的子网是192.168.128.0。外部os
VMnet8和虚拟os ip的地址根本就不在这个范围内。难怪有问题。所以解决方案为:

在vmware中编辑->编辑虚拟网络->选中 VMnet8在下面的subnet IP 中将192.168.128.0改为192.168.127.0(这里只要
和其他的网络不冲突即可),然后Apply.可以马上看到外部OS的VMnet8在连接中。之后将虚拟机中的网络连接重启,即可。

这鬼东西让我很头痛。我知道云计算是非常重要的,也被推上了各种公司政府的计划。但是我总觉得云这东东和熟知的系统比较起来…貌似还是差了一截。当然或许因为它尚处
于发展的初级阶段。关于它的缺陷总结起来有那么几句话:

1.它充分的利用了硬件的资源,它也内耗了相当一部分硬件资源。当我看到某某机房中每个网站占用一个服务器的时候,觉得云计算是非常非常有必要的东西。其实那些服务器
很费电而且服务器中的网站从我开始用互联网到今天,从来没有登录过。那些网站是知名的…吗?当我用自己的机器在linux下全虚拟化出一个xp的时候。我顿时觉
得虚拟化就是一坨…不,是一坨坨…机器是不能持久超负荷运转的;满负荷机器也是不能搞虚拟化的;另外廉价的服务器对我来说还是挺贵的。

2.GFS的确是绕过了虚拟化技术。hash,排序加二分。很好很强大。只不过BigTable + mapReduce +
GFS有时还是不如mysql灵活。怎么说mysql, sqlite也支持个事务…想要创建个事务需要自己添加用户锁的代码。如何想加入行级锁或者列族级锁…
.可以考虑修改源码…再说安装hadoop和安装mysql一样灵活吗?

3.锁还是不锁,这是分布式头痛的问题。我也很头痛。锁吧,效率低,不锁吧,check一致性。于是折中,只加写锁。写读和写写冲突解决了。读写冲突还继续残留着…
于是保持写的势头,不在意读的先后。反正程序不嫌烦,多读几次也没关系。

4.租房真的很划算吗?租机器真的很节省吗?我觉得它只适用于短期的大项目以及长期的小项目。Facebook目前是租了部分Amazon,不过如果Amazon的价
格变动了,每年环比上涨一下下…你懂吗?…

5.一坨怎么搅拌都还是一坨…或者是一坨坨…MIPS(million instructions per second)小的机器,咋米都难虚拟出mips
大的机器。(你想让每个服务器都自动超频吗?…这貌似可以成为破坏云的好方法…)所以个人认为:廉价的机器搭云的确需要像Google那样找到理想的大规模并
行分布式计算模型mapReduce.否则使用虚拟化方法,性能只降不升。mapreduce模型是分布式中常用的hash+summary,效果很好,就是针对特殊
可优化计算时性能较差。

关于未来:

我觉得云还是很有前途的。否则我研究它干啥?但是云应该发展成为异质网络,另外虚拟化技术还要再发展发展。另外编程语言还要再进步些。另外就说这么多了…

Sometime crontab in Linux or Unix can not run some program. Because the environment of crontab is not as same as that of system. If you want to know the difference between those two environments settings. look up /etc/cron.d/anacron file and ~/.profile and ~/.bashrc and xxxx. I can not remember all of them. /etc/cron.d/anacron file is just for crontab. ~/.profile and ~/.bashrc is for system. If you want to know more, search "linux environment file" in Google.

I think to find all difference between two environment is waste time obviously. Another method is write own timer codes. So Here is my solution:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
/**
* @author chico chen chillycreator #@@& gmail.com
*/
void usage(){
cout << "timer"<<endl;
cout << "input your time point:[minute] [hour] [innerday] [innerweek]"<<endl;
cout << "input your program name:[your program]"<<endl;
cout << "all of input should be more than zero!"<<endl;
cout << "you should run this program earlier than you wanted."<<endl;
cout << "or else your program will run at next time point."<<endl;
}

int main(){

// user input
int min, hour, howday, howweek;
string program;
cout<< "input [min] [hour] [innerdays] [innerweeks]"<<endl;
cin >> min >> hour >> howday >> howweek;
cout <<"input your program"<<endl;
cin >> program;
if (program.size() <= 0 || min < 0 || hour < 0 || howday < 0 || howweek < 0){
usage();
return 1;
}
cout << "your timer will run program at "<<hour<<":"<<min<<endl;
cout << "your program is "<<program<<endl;
if (0 == howday || 1 == howday){
howday = 1;
cout << "run this program in every day"<<endl;
}
else{
cout << "run this program at "<<howday <<" days intervals."<<endl;
}
if (0 == howweek){
cout << "run this program in every week"<<endl;
}
else{
cout << "run this program at "<<howweek <<" weeks intervals."<<endl;
}
// set sleep time and loop time
int looptime = (howday-1)*3600*24 + howweek * 7 * 3600 * 24;
int sleeptime = 0;
bool bFirst = true;
while(true){
time_t now;
time(&now);
struct tm * timeinfo = localtime(&now);
timeinfo->tm_hour = hour;
timeinfo->tm_min = min;
time_t futuretime = mktime(timeinfo);
sleeptime = futuretime - now;
sleeptime = sleeptime >= 0 ? sleeptime : 24*3600+sleeptime;
if (!bFirst){
sleeptime += looptime;
}
bFirst = false;
cout << "wait time:"<<sleeptime<<endl;
sleep(sleeptime);
cout << "start to run:"<<program<<endl;
system(program.c_str());
cout << "end program..."<<endl;
}
// loop end
return 0;
}

Write your own code will bring new bugs in your solution. Another drawback is spending your own time and this timer is not in common. However, you can control it!

工作是定下来了。与之前本科的工作相比,没有什么值得骄傲的。只不过薪水多了一些。不过公司不大,还在成长阶段。福利待遇算是可以。户口问题是要拼人品的。大概就这些。

找工作面试笔试还是很重要的。我往往死在笔试那一环,所以以后的面试自然都没有机会。或者往往笔试成绩不佳,当了别人的备胎,等别人推掉了那个offer,自己才能有点机会。所以工作还是早点找或者晚点找。中间时段和别人抢着找,实在吃力不讨好。主要因为在普通大学读书的小朋友们有更多的时间复习,而自己却还必须在实验室干活。幸好在研究生之前有过大公司的实习经历。否则简历关就会被筛掉。在科苑读研有不用交学费的好处,不过读书阶段不能实习而且需要在实验室干活是一个弊端。不过对于找个稳定工作的人来说,留在科苑也是不错的选择。今天还碰到一位刚拿到实验室offer的小朋友,他还在问这里有没有饭补。

首先呢,要比别人更早的去面试笔试。我的两个offer就是在8月时搞定的。当别人还在看书复习时,offer已经到手。这个时候不要吝惜各种内推的途径以及各个bbs中的工作帖。另外值得注意的一点是:一旦被内推,一定不要参加它的大规模笔试。否则内推就没有用了。

得到offer最重要是看户口,钱什么的都是浮云。因为物价在上涨,通货在膨胀。当然有些hr说的户口,也是很不靠谱的。这个要自己衡量一下。

如果不幸的沦落到需要参加大规模笔试。那就几个人一起准备一下吧。一个人准备是很难搞定所有可能的问题的。不过笔试题大题小题变化不大。大题:无非是链表,排序,动态规划。小题:操作系统,数据库,语言编译加运行。反正变着花样,这个公司的题明年会在另一个公司的题中出现。背诵默写一下总会过笔试的。即使你以前没有写过代码。葵花宝典(程序员面试宝典)等秘笈一定一定要看的…要做好自宫的准备…当然看到最后一页会发现自宫是没有必要的…

面试大都问问项目经历,哪个项目重要,你的贡献,你的优缺点。然后现场技术题。不幸的是我11月初才掌握技术题通用写法,并传授给了我家mm。

offer没有拿很多,有一部分是我说已经有XX offer后,他们觉得自己给不了那么多,索性把我拒掉了。偶太诚实了。

一两个小时的面试,很难面出一个人啥品质。谦虚的人可能被认为自卑,技术大牛被认为傲慢。反正啥情况都会出现。往往在于你能不能让面官看中…这和相亲以及闪婚差不多。当然首先要从hr那里打听:面你的是谁以及性别问题。例如mm面mm,那就不能打扮的太pp,否则面官会有很大压力。依此类推…当然这些都是从我mm的面经中总结出来的。

IT工作的大类一般分三种:项目经理(产品经理),开发(研发),测试。当然还有研究员等等。我只面过开发研发,其他一概忽略。主要因为在这个浮躁的大环境下,核心技术的开发是有必要的。测试的氛围不行裁员严重,另外待遇也低。

另外语言相对来说较为重要,虽然行业中有传言:只要懂编程,不用太在意语言。但其实招聘的时候这方面是相当看重的。例如招网站或者做J2EE项目的就不会看中c程序员。而操作系统,数据库,算法开发的招聘鄙视java程序员。所以还是不要轻信传言了。大公司的招聘只看潜力不看重编程能力的年代一去不复返了.

另外发现一个很有趣的现象:就是公司培训。我惊讶于某些逃课的小朋友会看重这个事情。

当然工作最重要的是钱多、清闲、离家近。找工作就像买机器一样,挑个性价比最高的。只不过这个机器也会挑人罢了。

所有 HTTP 状态代码及其定义。
代码  指示
2xx  成功
200  正常;请求已完成。
201  正常;紧接 POST 命令。
202  正常;已接受用于处理,但处理尚未完成。
203  正常;部分信息 — 返回的信息只是一部分。
204  正常;无响应 — 已接收请求,但不存在要回送的信息。
3xx  重定向
301  已移动 — 请求的数据具有新的位置且更改是永久的。
302  已找到 — 请求的数据临时具有不同 URI。
303  请参阅其它 — 可在另一 URI 下找到对请求的响应,且应使用 GET 方法检索此响应。
304  未修改 — 未按预期修改文档。
305  使用代理 — 必须通过位置字段中提供的代理来访问请求的资源。
306  未使用 — 不再使用;保留此代码以便将来使用。
4xx  客户机中出现的错误
400  错误请求 — 请求中有语法问题,或不能满足请求。
401  未授权 — 未授权客户机访问数据。
402  需要付款 — 表示计费系统已有效。
403  禁止 — 即使有授权也不需要访问。
404  找不到 — 服务器找不到给定的资源;文档不存在。
407  代理认证请求 — 客户机首先必须使用代理认证自身。
415  介质类型不受支持 — 服务器拒绝服务请求,因为不支持请求实体的格式。
5xx  服务器中出现的错误
500  内部错误 — 因为意外情况,服务器不能完成请求。
501  未执行 — 服务器不支持请求的工具。
502  错误网关 — 服务器接收到来自上游服务器的无效响应。
503  无法获得服务 — 由于临时过载或维护,服务器无法处理请求。
-----------------------------------------------------------------------------

HTTP 400 - 请求无效
HTTP 401.1 - 未授权:登录失败
HTTP 401.2 - 未授权:服务器配置问题导致登录失败
HTTP 401.3 - ACL 禁止访问资源
HTTP 401.4 - 未授权:授权被筛选器拒绝
HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败
HTTP 403 - 禁止访问
HTTP 403 - 对 Internet 服务管理器 (HTML) 的访问仅限于 Localhost
HTTP 403.1 禁止访问:禁止可执行访问
HTTP 403.2 - 禁止访问:禁止读访问
HTTP 403.3 - 禁止访问:禁止写访问
HTTP 403.4 - 禁止访问:要求 SSL
HTTP 403.5 - 禁止访问:要求 SSL 128
HTTP 403.6 - 禁止访问:IP 地址被拒绝
HTTP 403.7 - 禁止访问:要求客户证书
HTTP 403.8 - 禁止访问:禁止站点访问
HTTP 403.9 - 禁止访问:连接的用户过多
HTTP 403.10 - 禁止访问:配置无效
HTTP 403.11 - 禁止访问:密码更改
HTTP 403.12 - 禁止访问:映射器拒绝访问
HTTP 403.13 - 禁止访问:客户证书已被吊销
HTTP 403.15 - 禁止访问:客户访问许可过多
HTTP 403.16 - 禁止访问:客户证书不可信或者无效
HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效
HTTP 404.1 - 无法找到 Web 站点
HTTP 404 - 无法找到文件
HTTP 405 - 资源被禁止
HTTP 406 - 无法接受
HTTP 407 - 要求代理身份验证
HTTP 410 - 永远不可用
HTTP 412 - 先决条件失败
HTTP 414 - 请求 - URI 太长
HTTP 500 - 内部服务器错误
HTTP 500.100 - 内部服务器错误 - ASP 错误
HTTP 500-11 服务器关闭
HTTP 500-12 应用程序重新启动
HTTP 500-13 - 服务器太忙
HTTP 500-14 - 应用程序无效
HTTP 500-15 - 不允许请求 global.asa
Error 501 - 未实现
HTTP 502 - 网关错误

我发现windows自己的API一般不能做到与windows自己的历史兼容。很神奇…

下面几个函数都前后不兼容.

例如GetFileTime这个函数。本来是得到文件的读写时间。但是因为windows自己很有趣,自己的的读写时间其实并不是用户真正的读写时间。当然可能人家考
虑了效率等其他的问题。下面一段是摘抄自MSDN中的介绍:

Not all file systems can record creation and last access times and not all
file systems record them in the same manner. For example, on FAT, create time
has a resolution of 10 milliseconds, write time has a resolution of 2 seconds,
and access time has a resolution of 1 day (really, the access date).
Therefore, the GetFileTime function may not return the same file time
information set using SetFileTime. NTFS delays updates to the last access time
for a file by up to one hour after the last access.

不是所有的文件系统都能记录创建时间和最后的访问时间。也不是所有的文件系统都以相同的方式记录他们。比如在FAT上,创建时间误差是10微秒,写时间的误差2秒,访
问时间的误差是1天!(…我觉得hacker可以在这个一天上做些手脚…)因此,就是你使用SetFileTime这个函数,GetFileTime也不可能会
返回相同的时间…NTFS会延迟一小时更新最后的访问时间…

真是无语呀…

FindNextFile这个函数有些小问题,就是不能以字母序返回文件…在FAT和在NTFS系统上的表现不一样…大概的原因在于那个文件描述表中存放顺序
是不一样的.FAT是使用的时间顺序存放,而NTFS是使用的按字母序存放。这个FindNextFile根本没有做啥事情,直接读出来…这个API就是仅仅追求效
率…顺便一提…它其实应该再开发一个API叫做FindSortedNextFile…这样更好些…不过我想它也不能做…解决途径…上层排个序先。

The order in which this function returns the file names is dependent on the
file system type. With the NTFS file system and CDFS file systems, the names
are returned in alphabetical order. With FAT file systems, the names are
returned in the order the files were written to the disk, which may or may not
be in alphabetical order.

最近比较繁忙…找工作ing…所以blog就少更新。毕竟笔试题面试题不方便透露,另外一个原因就是问的太杂也记不住…所以等offer确定下来,再写总结
吧…

第一天是研究生论文指导…主要是论文中的数据最好尽量的使用真实数据…但是可以从真实数据中抽取或者sample出对自己算法有利的数据。但是算法必须解决为什
么在这种数据集上就好,以及算法的局限性在什么地方。而不是提出一个算法和XX算法再比较一下就ok了…

第二天是大会开会…顺利的挤到前几排,照了一张露脸相.

有一个是讲LRU的算法改进的。传说改进算法是LIRS.LRU主要的缺陷在于使对于普遍的pattern而不是对于特殊的pattern适用。对于高频率访问数据和
低频率访问数据并没有很好的区分度,很有可能因为低频率的数据使得中高频的数据被替换出缓存,从而导致缺页。

有一个是讲隐私保护的。主要的观点是将共有数据和想保护的数据直接的关联关系去掉。

下午EMC出了一个vplex的东东,这是一个存储平台。当然这东西早就出来了…其实是啥米呢?其实就是pool

1.然后去看demo,发现数据挖掘的东东还是不少的。可惜我的研究方向不是数据挖掘.要不还可以探讨的更加detail一些。不过大概很多也就是求sim(i,j)
只是运用了各种图方法或者规则模型,或者统计模型,或者随时间的统计模型…再有新意的…还是没怎么看到。

2.看了下太极数据库(taiji DB)自从云计算大会时听说后,对这个东东很有期待…后来发现是对Hbase和Cassandra做了层sql解析,然后数据通
过sql或者函数调用放入到两个类型的数据库中。Cassandra是一个支持Available 和Partition的东东,
Hbase是支持最终Consistence 和 Partition的东东。另外Hbase的读很快,但是写不是很支持。Cassandra对于写操作的支持灰常好
~Hbase有锁机制而Cassandra没有,Hbase在Hadoop之上,所以文件系统的管理对于Hbase来说几乎是透明的,Cassandra是自己管理自
己的。Hbase是有主从结构的东东,而Cassandra是p2p的。其实这两个东西统一起来是相当困难的。当然在数据不需要恢复,不需要读取最新的数据时,这一切
看起来很完美…但是一旦有异常发生…这东东就game over 了。因为这两个东东是不同的文件底层控制,也就是Hadoop根本就不知道Cassandra的
情况。另外当数据更新时,网络产生分割,然后再由其他的客户端进行读取时,这整个系统的状态就不一致了。还有一点值得一提的是,Cassandra和Hbase都存在
在一台机器中,本来就对原有的写效率和读效率造成损害。所以…现在的表面融合还能不能做成核心融合,还是很难说,即使做出来了,可能也要失去Hbase和Cass
andra本来的特性。一切就又恢复到database的本来样貌…

3.代理对象数据库。这个demo中的数据存储模式的确在一定程度上解决了数据冗余问题,但是它有带来了极端的效率问题。怎么解释代理对象数据库呢?首先这东东和对象
数据库有什么不同呢?对象数据库就是A表继承B表,那么A既有B中的所有属性,虽然这些属性可以控制是否可见,是否可以更改插入删除等。但是A中必须为这些所有属性消
耗存储代价。当然这里要假设A表是按行存储。现在代理对象数据库解决的问题就是这个存储代价浪费。也就是A表中不再存储物理数据,而是引用B中的数据。将这个继承关系
转换成了逻辑关系。但是这东东并没有解决菱形继承问题。另外我还不小心发现一个很严重的问题:假如对象继承层数增多,那么如果当B中某字段非空,但是此字段又非A中字
段,那么要先要插入B表中一行,然后再插入到A表中一行。继承层数越多,那么需要插入的父表也就越多…时间消耗严重!!~~

总之,此次数据库发展方向正在向大内存占有率,混合数据库架构方向发展。当然用column based代替row based的数据库也有展现。从通用数据库向特定
领域数据库转变。这样带来的好处在于这样的数据库操作更加方便,解决特定领域问题时效率会提高。但是这样的缺陷也很明显:不通用,开发维护代价高。所以应该有这样的公
式:C develop +C maintain < V dba +V efficient 当然这里需要假设所有的硬件和软件环境是一致的。

云计算中强调auto tuning.但为什么数据库中不能auto
tuning?另外云计算中调试不方便,许多过程不能repro.这个问题给云中的软件开发带来一些麻烦事。

转自:http://www.ibm.com/developerworks/cn/linux/l-tip-prompt/l-tiptex6/
重复行通常不会造成问题,但是有时候它们的确会引起问题。此时,不必花上一个下午的时间来为它们编制过滤器,uniq
命令便是唾手可得的好工具。了解一下它是如何节省您的时间和精力的。

进行排序之后,您会发现有些行是重复的。有时候该重复信息是不需要的,可以将它除去以节省磁盘空间。不必对文本行进行排序,但是您应当记住 uniq
在读取行时会对它们进行比较并将只除去两个或更多的连续行。下面的示例说明了它实际上是如何工作的:

** 清单 1. 用 uniq 除去重复行 **

$ cat happybirthday.txt Happy Birthday to You! Happy Birthday to You! Happy
Birthday Dear Tux! Happy Birthday to You! $ sort happybirthday.txt Happy
Birthday Dear Tux! Happy Birthday to You! Happy Birthday to You! Happy
Birthday to You! $ sort happybirthday.txt | uniq Happy Birthday Dear Tux!
Happy Birthday to You!

警告:请不要使用 uniq 或任何其它工具从包含财务或其它重要数据的文件中除去重复行。在这种情况下,重复行几乎总是表示同一金额的另一个交易,将它除去
会给会计部造成许多困难。千万别这么干!

** 有关 uniq 的更多信息 **
本系列文章介绍了文本实用程序,它对在手册页和信息页找到的信息作了补充。如果您打开新的终端窗口并输入 man uniqinfo uniq
,或者打开新的浏览器窗口并查看 位于 gnu.org 的 uniq 手册页

,那么就可以了解更多的相关信息。

如果您希望您的工作轻松点,比如只显示唯一的或重复的行,那么该怎么办呢?您可以用 -u (唯一)和 -d (重复)选项来做到这一点,例如:

** 清单 2. 使用 -u 和 -d 选项 **

$ sort happybirthday.txt | uniq -u Happy Birthday Dear Tux! $ sort
happybirthday.txt | uniq -d Happy Birthday to You!

您还可以用 -c 选项从 uniq 中获取一些统计信息:

** 清单 3. 使用 -c 选项 **

$ sort happybirthday.txt | uniq -uc 1 Happy Birthday Dear Tux! $ sort
happybirthday.txt | uniq -dc 3 Happy Birthday to You!

就算 uniq 对完整的行进行比较,它仍然会很有用,但是那并非该命令的全部功能。特别方便的是:使用 -f
选项,后面跟着要跳过的字段数,它能够跳过给定数目的字段。当您查看系统日志时这非常有用。通常,某些项要被复制许多次,这使得查看日志很难。使用简单的 uniq 无法完成任务,因为每一项都以不同的时间戳记开头。但是如果您告诉它跳过所有的时间字段,您的日志一下子就会变得更加便于管理。试一试 uniq -f 3 /var/log/messages ,亲眼看看。

还有另一个选项 -s ,它的功能就像 -f 一样,但是跳过给定数目的字符。您可以一起使用 -f-suniq 先跳过字段,再跳过字符。如果您只想使用一些预先设置的字符进行比较,那么该怎么办呢?试试看 -w 选项。

0%