2008年6月27日星期五
Java数据导出(导入)SQL,Access(mdb),Excel(xls),csv方法整理
最近在做一个数据导出功能,
导出类型有文本格式的SQL,Access文件mdb,Excel文件xls 。
先说说Excel的文件格式xls。
主要有两个Java API可以对Excel文件进行读写,
一个是Apache组织下的POI ,官方地址:[url]http://jakarta.apache.org/poi/[/url]
一个是 Java Excel API ,jxl 网址:[url]http://www.andykhan.com/jexcelapi/[/url]
有个限制 65536,一个sheet,据说要到 Excel 2007里才没有这个限制,但考虑到客户用的大多还是Excel的老版本,没有办法在一个sheet中转入那么多的数据,一种解决方法就是达到 5W 的条件就创建一个新的 sheet。呵呵,但现实中呢,到了2W左右就抛出了Out of Memory 错误 ,cell 对象的个数太多了。查了很多的资料,也没有好的解决方案。
现考虑到两个方法:
一个就是用文本方式来输出,如用html的格式中的table,用td来代替一个cell。保存为.xls文件,用Excel打开,用户就知道有差别。这个方法,在输入文件的时候是没有限制了(文件流,呵呵),但在用Excel打开文件的时候就有65536的限制了
还有就是劝说用户数据不要太大,分多个excel文件输出,采用分批输出为xls的文件。
具体读写xls文件的方法我这里就不写了,参考官方网站上的doc,这里再加上一个:IBM的
利用JAVA操作EXCEL文件 : [url]http://www.ibm.com/developerworks/cn/java/l-javaExcel/index.html[/url]
还有一个在JavaEye上的关于海量数据导出的讨论:
主题: Java往Excel写入海量数据: [url]http://www.javaeye.com/topic/78448?page=3[/url]
再讨论下SQL的导出,文本格式,文件流,没有什么好讲的,create table ,insert into tablename 基本上没有问题。
Access的mdb呢,就要用到SQL中的SQL语句,可以一起写。
连接mdb的jdbc写法:
String strurl = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=E:\\ fileName.mdb";// 你的ACCESS文件位置
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection(strurl);
log.debug("连接成功!");
Statement stmt = conn.createStatement();
stmt.executeUpdate(createSQL);
stmt.executeUpdate(sql);
stmt.close();
conn.close();
代码中出现的两个变量createSQL ,sql分别是创建表,和插入数据的SQL。还有一个要注意的地方,就是mdb的文件的数据,需要等到conn.close()后,才真正的写入。注意,strurl 上的空格。
在来讨论csv格式,其实就是一个文本流了。不过要注意的地方就是在输出纯数字的文本串的时候,象身份证号码:'05284548110008',在Excel打开就显示为5.28E+12,科学计数的格式,这里找到一个方法:在文本前加上Tab键,就可以正常显示为字符串了。不过java里怎么输出Tab键呢,
表3-1 常用格式控制字符
控 制 字 符 作 用
\\ 反斜线 \' 单引号'
\" 双引号" \uxxxx 以十六进制数指定Unicode字符输出
\dxxx 以八进制数指定Unicode字符输出 \b 倒退一个字符
\f 换页 \n 换行
\r 光标移至行首 \t 跳格(一个Tab键)
看了这个大家都知道了吧。
在来看看导入Access的,访问mdb文件的跟上面的是一样的。接着呢,就是要得到mdb中的所有表名和字段名。
这里就有很多中方法可以得到,仁者见仁,智者见智,大家各显神通了。
我想到有两种方法:
1.每个数据库都有相应的系统表,Access作为简单的文本数据库,当然也不例外,系统表中就是MSysObjects 。
要在Access中显示系统表,点击菜单,工具 �> 选项 ,在视图选项卡中点选 系统对象。就可以看到系统表了。
通过或者
String sql ="SELECT Name FROM MSysObjects WHERE Type=1 AND LVProp <> NULL"; // 或用这个where条件 WHERE Type=1 AND Flags=0
ResultSet rs = stmt.executeQuery(sql );
rs.next();
tablename = rs.getString(1);
2.
通过jdbc的接口,DatabaseMetaData来获取table和column。
ResultSet rs= conn.getMetaData().getTables(null, null, "%",
new String[] { "TABLE" });
while (dddd.next()) {
String tablename = rs.getString(3));
}
同样可以得到字段名称
String sql = "select * from " + tablename;// 得到字段名和数据
ResultSet rs2 = stmt.executeQuery(sql);
ResultSetMetaData rsmd = rs2.getMetaData();
int count = 0;
if (rsmd != null) {
count = rsmd.getColumnCount();
String[] columnNames = new String[count];
for (int i = 0; i < count; i++) {
columnNames[i] = rsmd.getColumnName(i + 1);
}
while (rs2.next()) {
String[] value = new String[count];
for (int i = 0; i < count; i++) {
String s = rs2.getString(columnNames[i]);//相应的value值
}
}
}
这样就可以得到表名,字段名,和相应的值了。
2008年3月27日星期四
三款网页CSS设计辅助工具
TopStyle Pro是一款功能专注于CSS设计的辅助工具,功能相当多,附有CSS码检查功能,减少写错的机会。尤其是它的HELP文件中详细的CSS指令介绍,很适于用作参考文件与初次接触CSS的人做为学习使用。
IEDevToolBar
微软的 IEDevToolBar,是免费转为Web开发人员制作的IE插件,主要功能有:1.以树结构查看 CodeDom,并查看每个 Element 属性,可以使用鼠标点击选中 Element;2.生成图片报表,就是将页面上说有出现的图片生成一份详细的报表,这样就省的我们自己去找图片路径和量图片大小等等;3.高亮显示表格,表格单元,Div 等的边框,这个在我们调整布局时也是很有用;4.页面尺子,可以任意在页面上度量长度,大大的提高了工作效率,不用为了量个长度而抓图再用画图工具量。安装之后,在IE顶部菜单的"查看" - "工具栏" 里面钩选"Developer Toolbar"项即可。
颜色选择器 colorpic
colorpic是免费专业彩色采棉. 强大的颜色调整工具,让个人色彩变化自如. 调整运动、顺化、色彩饱和、价值观与四个图形搅拌机. 用完美的屏幕放大镜准确性. 纠正多种颜色的调色. 最新推出的新版本'混合器'节使强大图形分析方法,改变了一些色彩. 颜色可以选择从六角蜂巢的形状、改变或有彩虹色彩基础混合器、调整为六个sliders个人色彩、饱和度、价值、红、绿、蓝颜色的组成部分.
2008年3月18日星期二
JAVA实现数据采集程序基本原理
项目需要,非要采集别人网站的MP3,没办法只能做。。好在成功了,分享一下心得。。
同样的方法,采集FALSH,文本都可以的。。
首先要采集别人的东西就要登陆别人的网页查看源代码找到下载地址,其实就这么简单。。
那就只要先定义一个方法让程序可以自动侦测到网页的源代码了。。
程序代码:[code]public static String getWebContent(String domain){
System.out.println("开始读取内容...("+domain+")");
StringBuffer sb = new StringBuffer();
try{
java.net.URL url = new java.net.URL(domain);
BufferedReader in =
new BufferedReader(new InputStreamReader(url.openStream()));
String line;
while((line = in.readLine()) != null){
sb.append(line);
}
in.close();
}catch(Exception e) { // Report any errors that arise
sb.append(e.toString());
System.err.println(e);
System.err.println("Usage: java HttpClient []");
}
return sb.toString();
}[/code]代码提取到超链接地址
然后村成TXT,直接用FLASHGET下载就行了
那么怎么分析出网页的超链接?
当然是用正则表达式了于是有了下面这个方法
程序代码:[code]public static String matcherStr(String str, String cp, String s){
if(str==null || str.equals("")){
return "";
}
String txt = new String();
txt = str;
if(str!=null && !str.equals("")){
txt = str;
Pattern p = Pattern.compile(cp,2); //参数2表示大小写不区分
Matcher m = p.matcher(txt);
StringBuffer sb = new StringBuffer();
int i=0;
boolean result = m.find();
//使用循环将句子里所有匹配的内容找出并替换再将内容加到sb里
while(result) {
i++;
sb.append(m.group());
sb.append(s);
//继续查找下一个匹配对象
result = m.find();
}
txt = String.valueOf(sb);
}else{
txt = "";
}
return txt;
}
[/code]一次匹配一点,不行就再匹配,直到取出网址,存在StringBuffer里面,等都弄出来了
或者打印另存成txt或者直接用程序存成TXT
只要打开FLASHGET,然后开着TXT 全选,复制,就会自动将地址添加到FLASHGET里面了
批量下吧,兄弟。。。。
从网页上读取内容 同时输出到文件
import java.net.*;
public class SystemIn
{
public static void main(String[] args)
{
try
{
URL url1=new URL("http://www.baidu.com/");
DataInputStream dis=new DataInputStream(url1.openStream());
BufferedReader br=new BufferedReader(new InputStreamReader(dis));
String s;
PrintWriter out1=
new PrintWriter(
new BufferedWriter(
new FileWriter("out1.htm")));
while((s=br.readLine())!=null)
{
System.out.println(s);
out1.println(s);
}
br.close();
out1.close();
FileInputStream fis=new FileInputStream("out1.htm");
}
catch(Exception e){ }
}
}
2008年3月17日星期一
Java代码 错在哪里?
import java.net.*;
import java.io;
public class SystemIn
{
public static void main(String[] args)
{
try
{
URL url1=new URL("http://www.baidu.com");
DataInputStream dis=new DataInputStream(url1.openStream());
//BufferedReader br=new InputStreamReader(dis);
}
catch(MalformedURLException e){ }
while((dis.readLine())!=null)
{
System.out.println(dis.readLine());
}
}
}
2008年3月16日星期日
冒泡排序法 与 选择排序 比较
冒泡排序法 与 选择排序 比较
{
int[] intArray={3,10,1,40,30,10,6,111,90,100};
public static void main(String[] args)
{
maopaopaixu mp=new maopaopaixu();
//mp.bubbleSort(mp.intArray);
mp.selectionSort(mp.intArray);
for(int i=0;i<mp.intArray.length;i++)
{
System.out.print(" "+mp.intArray[i]);
}
}
//冒泡排序
public void bubbleSort(int[] intArray)
{
int n=intArray.length;
int i,j,temp;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
if(intArray[j]>intArray[j+1])
{
temp=intArray[j];intArray[j]=intArray[j+1];intArray[j+1]=temp;
}
}
}
//选择排序
public void selectionSort(int[] intArray)
{
int n=intArray.length;
int i,j,temp;
for(i=0;i<n-1;i++)
{
int min=i;
for(j=i+1;j<n-1;j++)
{
if(intArray[min]>intArray[j])
{
min=j;
}
}
temp=intArray[min];intArray[min]=intArray[i];intArray[i]=temp;
}
}
}
2008年3月6日星期四
“群英会”3月8日深圳会展中心参会企业
混球(125571406) 09:36:12
以下为第28届"群英会"3月8日深圳会展中心参会企业,点击企业名录可查看招聘职位(部分)
●
长城国际
●
华为技术有限公司
●
安踏(中国)有限公司
●
松下电器机电(深圳)有限公司
●
索尼电子华南有限公司
●
伟嘉集团
●
三和国际集团
●
中集集团
●
广东三正集团有限公司
●
IBM国际商业机器科技(深圳)有限公司
●
联想信息产品(深圳)有限公司
●
三星电子(深圳)有限公司
●
富士施乐(中国)有限公司
●
比亚迪股份有限公司
●
深圳迈瑞生物医疗电子股份有限公司
●
观澜湖高尔夫球会
●
富士施乐高科技(深圳)有限公司
●
大北欧通讯设备(中国)有限公司
●
希捷国际科技(无锡)有限公司
●
大族激光科技股份有限公司
●
索斯科锁定系统(深圳)有限公司
●
深圳市康达炜电子技术有限公司
●
深圳恒丰房地产有限公司
●
深圳市万科物业服务有限公司
●
弗雷通信技术(深圳)有限公司
●
星辰通信国际控股有限公司
●
深圳市新纶科技股份有限公司
●
经理人企业管理顾问有限公司
●
百富计算机技术(深圳)有限公司
●
深圳市吉祥星数码科技有限公司
●
深圳鼎识科技有限公司
●
深圳市绿景企业管理集团有限公司
●
东莞市东方雷豹电子有限公司
●
深圳市万家春园艺有限公司
●
中联重工科技发展股份有限公司
●
深圳市金威源科技有限公司
●
康博电子亚洲有限公司
●
深圳市赢家服饰有限公司
●
深圳市北大方正数码科技有限公司
●
深圳市英可瑞科技开发有限公司
●
上海三菱电梯有限公司深圳分公司
●
中华英才网
●
招商信诺人寿保险有限公司
●
深圳华强文化科技集团股份有限公司
●
百度(中国)有限公司深圳分公司
●
深圳市好易通科技有限公司
●
博世力士电子传动与控制(深圳)有限公司
●
飞煌世亚电业(深圳)有限公司
●
天源迪科计算机有限公司
●
深圳欧贝特卡系统科技有限公司
●
捷迪迅光电(深圳)有限公司
●
大中华国际实业(深圳)有限公司
●
美资精量电子(深圳)有限公司
●
记忆科技(深圳)有限公司
●
深圳赛意法微电子有限公司
●
阿里巴巴(中国)网络技术有限公司深圳分公司
●
深业物流集团 宝能地产股份有限公司
●
深圳中兴移动通信有限公司
●
深圳市精密达机械有限公司
●
深圳市光汇(集团)股份有限公司
●
华孚控股有限公司
●
深圳市繁兴科技有限公司
●
深圳市怡亚通供应链股份有限公司
●
深圳世强电讯有限公司
●
深圳市捷顺科技实业股份有限公司
●
美联国际英语
●
深圳市中新联光盘有限公司
●
中华制漆(深圳)有限公司
●
深圳市伊天行技术有限公司
●
飞尚实业集团有限公司
●
深圳市金科威实业有限公司
●
深圳市艾比森实业有限公司
●
深圳市艾苏威尔工贸发展有限公司
●
深圳市茁壮网络技术有限公司
●
深圳珠玑软件有限公司
●
清华同方消费电子事业部
●
深圳市吉斯迪科技有限公司
●
深圳市朗科科技有限公司
●
柯尼卡美能达咨询(深圳)有限公司
●
深圳市海川实业股份有限公司
●
深圳市嘉旺餐饮连锁有限公司
●
深圳市银之杰科技股份有限公司
●
深圳市市东江环保股份有限公司
●
A8音乐集团
●
东莞莫仕连接器有限公司
●
美亚财产保险有限公司深圳分公司
●
美泰玩具
●
TCL多媒体科技控股有限公司
●
TCL通讯科技控股有限公司
●
深圳市华力特电气有限公司
●
job88八方人才网
●
前程无忧
●
深圳市领跑体育用品有限公司、东莞市虎门领跑体育用品有限公司
●
深圳市龙浩天地商贸发展有限公司
●
福瑞博德软件开发(深圳)有限公司
●
维也纳酒店管理集团
●
长安发利达电子厂
●
深圳市中航信息科技产业有限公司
●
深圳市国际企业股份有限公司
●
深圳市安芯数字股份有限公司
●
威世电子(惠州)有限公司
●
深圳市鹏程人力资源配置有限公司
●
7天连锁酒店集团
●
优仪半导体设备(深圳)有限公司
●
深圳瑞红首饰有限公司
●
波科海姆科技(深圳)有限公司
●
微星科技-恩斯迈电子(深圳)有限公司
●
深圳市兆驰股份有限公司
●
环旭电子(深圳)有限公司
●
华南国际工业原料城(深圳)有限公司
●
瑞士利盟国际技术股份有限公司深圳代表处
●
北天星国际贸易(深圳)有限公司
●
中国宝威
●
研祥集团
●
马士基物流(中国)有限公司深圳分公司
●
环球资源
●
艾默生网络能源有限公司
●
艾默生集团雅达电子有限公司
●
艾默生公司
●
深圳市理邦精密仪器有限公司
●
名家国际(中国)有限公司
●
深圳朗杰电子有限公司
●
亨特建材(深圳)有限公司
●
香港商肯萨斯股份有限公司东莞代表处
●
芒果网有限公司
●
泰科电子(深圳)有限公司
●
泰科电子(东莞)有限公司
●
泰科电子(青岛)有限公司
●
泰科电子(珠海)有限公司
●
深圳市思达仪表有限公司
●
优比仕电子(深圳)有限公司
●
深圳市驰创电子有限公司
●
深圳市爱得威实业发展有限公司
●
深圳市慧锐通电器制造有限公司
●
红珏高级时装有限公司
●
深圳市易思博软件技术有限公司
●
同维电子
●
深圳知已迅联通讯有限公司
●
深圳市元征科技股份有限公司
●
深圳市优美轩世界时装有限公司
●
深圳市大丰商业股份有限公司
●
深圳市宝能投资集团有限公司
●
深圳市科陆电子科技股份有限公司
●
赫比(上海)通讯科技有限公司
●
Premium Sound Solutions普瑞姆
●
富士能(深圳)科技有限公司
●
深圳市普天宜通科技有限公司
●
招商银行软件中心(融博)
●
深圳市恩情投资发展有限公司
●
西安华迅微电子有限公司
●
深圳市盈泰森投资有限公司
●
深圳京润珍珠销售有限公司
●
深圳大鹏液化天然气销售有限公司
●
深圳市新力达电子集团有限公司
●
深圳市新亚电子制程股份有限公司
●
深圳景田实业有限公司
●
深圳市博士眼镜有限公司
●
深圳市三三得玖商贸有限公司
●
深圳市新达通科技有限公司
●
山特电子(深圳)有限公司
●
深圳市中旭企业管理顾问有限公司
●
深圳市三旺通信技术有限公司
●
EF英孚教育
●
宇星科技发展(深圳)有限公司
●
Job36行业招聘
●
深圳市星彦地产顾问有限公司
●
信安技术(中国)有限公司 永泰软件有限公司
●
深圳市蓝韵实业有限公司
●
德昌电机(深圳)有限公司
●
深圳市海洋王投资发展有限公司
●
莱茵技术监护(深圳)有限公司
●
惠州市华阳通用电子有限公司
●
深圳市同为数码科技有限公司
●
Tti Group创科集团
●
深圳市珠江投资发展有限公司
●
广东大亚湾核电服务(集团)有限公司
●
蛇口集装箱码头有限公司
●
深圳市傲华医疗设备有限公司
●
深圳市科菱惠智能电气有限公司
●
智联招聘网
●
博世汽车部件(长沙)有限公司
●
博世(珠海)安保系统有限公司
●
德爱电子(深圳)有限公司、德之杰科技(深圳)有限公司
●
南太电子(深圳)有限公司
●
深圳茂业(集团)股份有限公司
●
广东日生集团-深圳市兴日生实业有限公司
●
深圳市康拓普信息技术有限公司
●
深圳市润天智图像技术有限公司
●
深圳市奥拓电子有限公司
●
联通黄页信息有限公司
●
深圳市联特微电脑信息技术开发有限公司
●
亿达利电子(深圳)有限公司
●
深圳市鹏劳人力资源管理有限公司
●
深圳市百佳华百货有限公司 佳华商场
●
深圳市华杰教育发展有限公司
●
深圳市领步科技有限公司
●
深圳市航嘉驰源电气股份有限公司
●
美固电子(深圳)有限公司
●
深信服科技有限公司
●
金蝶国际软件集团公司
●
深圳市泛友科技有限公司
●
深圳桑菲消费通信有限公司
●
卓越置业集团有限公司
●
深圳市深劳人力资源开发有限公司
●
深圳市宇顺电子股份有限公司
●
麦迪实电子科技(深圳)有限公司
●
深圳市添成利实业有限公司
●
新美亚电子(深圳)有限公司
●
深圳平安银行
●
深圳市深茂(集团)有限公司
●
深圳市邦德文化发展有限公司
●
北京炬力北方微电子有限公司深圳分公司
●
美国友邦保险有限公司深圳分公司
●
宜进利时计(深圳)有限公司
●
中孚溯源企业管理顾问有限公司
●
深圳市北科生物科技有限公司
●
深圳市奇辉电气有限公司
●
赛尔康技术(深圳)有限公司
●
大连华信计算机技术股份有限公司深圳分公司
●
先健科技(深圳)有限公司
●
深圳市皇庭地产集团有限公司
●
深圳市心雷工业产品设计有限公司
●
爱瑞思软件(深圳)有限公司
●
深圳市燕加隆实业发展有限公司
●
艾礼富电子(深圳)有限公司
●
深圳市晋年贸易有限公司 东莞市伟来食品有限公司
●
深圳市方胜人力资源服务有限公司
●
深圳长城开发科技股份有限公司
●
深圳市美道实业发展有限公司
●
韦博国际英语
●
艾默生网络能源(中山厂)
●
莱蒙鹏源集团有限公司
●
味奇生物科技有限公司
●
深圳市一体医疗集团有限公司
●
卓然数码科技(深圳)有限公司
●
广东威创视讯科技股份有限公司
●
深圳市创益五金精密模具有限公司
●
深圳香格里拉大酒店有限公司
●
深圳市开天源自动化工程有限公司
●
深圳市世纪星电脑有限公司
●
深圳市英之健科技有限公司
●
英特卡集团
●
广东太古可口可乐有限公司
●
深圳市吉事达科技发展有限公司
●
联泰控股有限公司
●
深圳市得宝实业发展有限公司
●
深圳易拓科技有限公司
●
深圳天祥质量技术服务有限公司
●
深圳市豪恩电声科技有限公司
●
渣打银行(中国)有限公司深圳分行
●
深圳市兴业卓辉实业有限公司
●
深圳华强新城市发展有限公司
●
深圳盐田港珠江物流有限公司
●
黛安芬国际集团-海南优美内衣有限公司深圳分公司
●
深圳市万兴软件有限公司
●
深圳市图泰精密机器制造有限公司
●
深圳市神舟电脑有限公司
●
北京华育网科技发展有限公司
●
花样年集团(中国)有限公司
●
深国投商用置业有限公司
●
深圳华高科技厂
●
中顺电子深圳分公司
●
联邦快递(中国)有限公司
●
深圳市奥宇控制系统有限公司
●
深圳市华普电子技术有限公司
●
第一创业证券有限责任公司
●
深圳华强三洋技术设计有限公司
●
联大集团(香港)有限公司
●
戈尔科技(深圳)有限公司
●
奇胜工业(惠州)有限公司
●
深圳市方直科技有限公司
●
深圳天源迪科信息技术股份有限公司
●
深圳市中佳讯科技有限公司
●
深圳市凯信光电有限公司 深圳市鼎立照明有限公司
●
深圳金活医药集团-深圳金活利生药业有限公司
●
深圳市科思科技有限公司
●
豪佳电子(深圳)有限公司
●
深圳市新宙邦电子材料科技有限公司
●
深圳万讯自控有限公司
●
南太集团世成电子(深圳)有限公司
●
深圳高迪数码有限公司、东莞奥美佳电子有限公司
●
德津实业发展(深圳)有限公司
●
TCL通讯设备(惠州)有限公司
●
深圳市大兴汽车集团
●
泰德富华科技(深圳)有限公司
●
深圳市泛海三江电子有限公司
●
深圳市龙电电气有限公司
●
金达塑胶五金制品(深圳)有限公司
●
深圳天利地产集团有限公司
●
深圳市美之高实业发展有限公司
●
深圳市实益达科技股份有限公司
●
沃特集团
●
伟嘉集团
●
皮尔金顿集团
●
航天科工深圳(集团)有限公司
●
深圳市国际企业股份有限公司
●
深圳市亚宁工具有限公司
●
艾默生电气(深圳)有限公司
●
宁波新禾休闲用品有限公司
●
深圳津村药业有限公司
●
香格里拉大酒店(深圳福田)有限公司
●
联想集团-惠阳厂
●
江西汪氏蜜蜂园有限公司
●
深圳市芯虹科技有限公司
●
深圳市大将电子开发有限公司
●
深圳市飞亚达(集团)股份有限公司
●
理光图像技术(上海)有限公司深圳分公司
●
深圳市深南电路有限公司
●
伟创力集团
●
深圳市维豪多媒体网络有限公司
●
Home Credit 集团
●
国信证券有限责任公司深圳泰然九路营业部
●
深圳艾科泰电子有限公司
●
兄弟工业(深圳)有限公司
●
百仕达地产有限公司
●
深圳健安医药有限公司
●
中国南玻集团股份有限公司
●
中国燃气控股有限公司
●
深圳市淑女屋服饰有限公司
●
深圳市精锐实业有限公司
●
理光数码系统设备(深圳)有限公司
●
珠海市斗门区世荣实业有限公司
●
深圳市长盈精密技术有限公司
●
迪卡侬运动品有限公司
●
深圳市致芯微电子有限公司
●
深圳豪威真空光电子股份有限公司
●
华西证券有限责任公司
●
深圳市荣裕投资发展有限公司
●
深圳市普邦投资有限公司
●
江森自控
●
业聚医疗器械(深圳)有限公司
●
深圳市中兴移动通信有限公司
……
提示:1、以上企业资料为陆续发布,敬请关注; 2、群英会门票10元/张
如何把从ATM机上取出的假钞重新还给了ATM机
前天,出差前,在我所在城市的工行ATM机上取了800元现金,像往常一样,习惯性的检查了一下吐钞口吐出的钞票,其中一张感觉有异,抽出来一看,纸质厚钝,老人家面目模糊,头轰的一下大了,"假钱"!!我当即拿着那张假币在ATM机上的摄像头前晃了一下,以图证明案发时间,然后迅速飞奔到后面的工行营业厅窗口。结果可想而知,柜台MM接过钱冷冰冰的说:对不起,不能证明你是在取款机上取的。我据理争辩要求掉摄像头资料证明,柜台MM说,摄像头只能记录面相,成像角度不能涉及取钞口,言外之意就是说如果我当时在取钞口进行调换以图讹诈银行,也不是没有可能。说完后连假币都不还给我,"啪"的盖章没收。直气的我七窍生烟。要知道我八年前原来是一个财务工作者,自从误收过一次100元假币后,苦练识钞大法,八年来多少假币在我的手里现过原型,八年前误收的那张假币至今在我的写字台玻璃板下压着,未曾想,堂堂的国家银行里,我苦练八年的识钞大法竟然没有了用武之地,还没地儿说理去!!我越想越气,TNND,许霆差你的钱不还,你总不能从我这出吧!
于是,出差也不出了,一定要讨个说法去,闷闷的回家想了半天,终于被我睿智的大脑找到了ATM机的BUG! 公道!!还我公道!!!我咆哮着,用颤抖的双手取出了我珍藏八年的第一张假币,我要还给你,丑陋的银行!
以下细节仅供遭受银行假币之害人观看解气,切勿模仿,动机不纯者敬请自重!
我回到了银行的ATM机前,(注:这个ATM机因为是在银行门外,因此我的还钱成功很大程度也与此有关)。手心里捏着假钞,另一只手把银行卡插了进去,又输入了取800元的指令,很快钱从吐钞口内吐出,我小心翼翼的在吐钞口吐出的钱币中间抽取了一张,然后将假币展开重新塞回那叠钱中间,然后静等10秒钟,ATM机开始滴滴提示音响,屏幕上显示"请尽快取钞,超出时间将自动收回"。继续静等。。。咔哒一声,钱退回机内-----无任何异常---查余额-----金额未变----闪人!人脑终于战胜了电脑,我终于讨回了公道!
高人们也许会问,那假钞退回去难道ATM机不能识别么?呵呵。。你很善于思考,但是你可以放心,不会!如果吐钞口有识别器,那假钱就没那么容易就出来了。既然可以出来自然也可以进去。高人们又问,那你不怕摄像头把你记录在案啊,呵呵。。。这个担心也不必,本文开始时,柜台MM已经暴露了摄像头的成像角度了!高人们再三问,那后面取钱的人不是就倒了霉了嘛?咳。。咳。。这个。。这个也是我回家后在思考的问题,所以也是不希望各位效仿的理由,我当时只考虑咋讨回公道了,没细想到后果的继承人其实不是银行,而是下一个和我一样的受害者,BS自己!!
其实在技术层面上我当时我唯一担心考虑的只有两个问题:
1、 吐出来一堆都是50元面值的。(俄滴神啊,吐血!)
2、 所有程序操作完毕后,回家的路上哼着口哨欣赏着调换成功的百元大钞时。(TNND,怎么换出来的又是一张假币啊!!!!)
各位观众,以上程序请勿自行模仿,如不慎失手,责任自负!工行、中行、建行、农行、招行、交行的大叔大妈姐姐妹妹们,看到此文时你可以升级你的ATM机,但是同时也请升级你们的道德观,要知道,我们的血汗钱不投股市不投基金不投房产只投利率最低的银行,不是让你们来糟践的!!!
2008年3月5日星期三
java string int转换参考
A. 有两个方法:
1). int i = Integer.parseInt([String]); 或
i = Integer.parseInt([String],[int radix]);
2). int i = Integer.valueOf(my_str).intValue();
注: 字串转成 Double, Float, Long 的方法大同小异.
5.2 如何将整数 int 转换成字串 String ?
A. 有叁种方法:
1.) String s = String.valueOf(i);
2.) String s = Integer.toString(i);
3.) String s = "" + i;
2008年2月26日星期二
nicewords 原理分析
我分析了一下
先获得你设置的关键词
然后通过[url]http://d.baidu.com/rs.php?q=[/url]关键词
获得 热门关键词的列表
然后通过[url]http://blog.yodao.com/searchrss?q=[/url]热门关键词
获得信息 进入数据库
原理就是这个。
[url]http://blog.yodao.com/searchrss?q=[/url]
获得的只不过是个摘要,离内容还差很远。nicewords 还是一套不太成熟的作品。加之nicewords 近来使用的人很多,很容易被k 建议不要招惹。
2008年2月23日星期六
发现吊砖还是有用的
经过我4个多月的坚持,发现吊砖还是有用的
我是9月10号左右吊砖的。其实当时真的很无奈,好多的机会都因为身高而错过了,本来想手术,可是觉得风险太大。后来看到一个骗人的叫做"国际增高网"的,鼓吹说三种东西可以增高
我是早上和晚上吊半小时,同时也做单杠(20个)和双杠(50)。在整个期间,有一些反映说出来大家一起分享:
1. 一个月左右后,关节处很火,甚至走路时间长一点就特别容易酸疼,静坐着有时候也会有。
2. 因为经常用双杠锻炼大腿,经常大腿根部的经脉出现剧烈的跳动,就是一抽一抽的。
3. 整个期间,膝关节都会有喳喳的响声。
4. 3个月后左右,我的肘关节处也有那种酥麻的感觉,现在这段时间,肩部关节也有了。
5. 另外就是以上这些现象都不会两只脚或两只手同时发生,所以我有时候担心生长会不会不平衡。所以,我都是用砖头交替着吊左右脚,希望能够左右平衡刺激。
其实,我整个运动时间都没有感到特别的效果,不过,有两个原因我可以肯定我长高了。
1. 上次我二哥来,两人比个子,我和他差不多高了。
2. 以前没有保护好的那段骨头经常用手按就疼痛,今天我去按它,惊奇的发现那个部位上移了一些,大概有1-
3. 以前我的脚毛差不多长到了踝关节处,现在仔细一看,发现隔了很远,并且坐在床沿上看大腿也发现长了一些。
再接着就是说说一些注意问题:
1. 从量变到质变,这是千古不变的真理,当然也适用于吊砖。
2. 循序渐进,不要想一口吃成一个胖子,一定要用适合自己的重量开始,然后慢慢加。
3. 有规律的生活和适当的其他体育运动很重要,当然最关键是心情,要注意潜意识的作用。
4. 如果你觉得这样成功的人还不多,你不妨看看Walk写的帖子,那里面就有20多个成功的案例。为什么总是怀疑别人的动机呢?为什么不能试着相信别人呢?
5. 对于性生活这个问题,我没有什么好说的,因为我觉得很难戒除,只能适当减少吧,至于它是否有副作用,我也说不清楚,反正我比以前少了,感觉腰倒是不疼了。
6. 吊砖以后毅力好了很多,也明白了很多道理,现在的我即使吊砖没有效果我也不会象以前那么悲观了,努力改变自己能改变的就可以了。有些事情就如毛泽东说的:天要下雨,娘要嫁人,由它去吧。那么多女孩,总会有一个属于你的,何必强求呢?
7. 大家要注意保护,我经常就贴一些风湿膏药什么的,我个人意见是只要保护得当,应该没有什么副作用。因为人体的自我调节能力很强的,只要不超出它的极限就行。
8. "一张一弛,文武之道",这句话也很重要,希望大家吊了一段时间,就休息一天左右,这样反而效果更好。不知道大家过英语六级或是四级的时候有没有这个感觉:我就是猛攻一个月然后突然放两天再去看,我觉得头脑清醒很多,效果也好很多,我想这个也使用于身体的增长。
最后,说说我写这篇文章的动机:
1. 我没有Sweetfig和Goolb78那么好,受了辱骂还继续帮助别人。我是因为今天广州有一家知名公司以年薪12W请我去上班,无论如何心情是高兴的。
2. 虽然我的毅力很好,但是也想找几个志同道合的人一起进步。
3. 希望大家不要又攻击我,说我是Sweetfig的化身,我知道有一批文化流氓是专门为了医院的手术而黑心发贴的,这种人我只能说:BS。
Java 集合类
Collection<--List<--Vector
Collection<--List<--ArrayList
Collection<--List<--LinkedList
Collection<--Set<--HashSet
Collection<--Set<--HashSet<--LinkedHashSet
Collection<--Set<--SortedSet<--TreeSet
Vector : 基于Array的List,其实就是封装了Array所不具备的一些功能方便我们使用,它不可能走入Array的限制。性能也就不可能超越Array。所以,在可能的情况下,我们要多运用Array。另外很重要的一点就是Vector"sychronized"的,这个也是Vector和ArrayList的唯一的区别。
ArrayList:同Vector一样是一个基于Array上的链表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector优越一些,但是当运行到多线程环境中时,可需要自己在管理线程的同步问题。
LinkedList:LinkedList不同于前面两种List,它不是基于Array的,所以不受Array性能的限制。它每一个节点(Node)都包含两方面的内容:1.节点本身的数据(data);2.下一个节点的信息(nextNode)。所以当对LinkedList做添加,删除动作的时候就不用像基于Array的List一样,必须进行大量的数据移动。只要更改nextNode的相关信息就可以实现了。这就是LinkedList的优势。
List总结:
1. 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ];
2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];
3. 所有的List中可以有null元素,例如[ tom,null,1 ];
4. 基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作。
HashSet:虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在HashMap的基础上来实现的,这个就是Set和List的根本区别。HashSet的存储方式是把HashMap中的Key作为Set的对应存储项。看看HashSet的add(Object obj)方法的实现就可以一目了然了。
public boolean add(Object obj)
{
return map.put(obj, PRESENT) == null;
}
这个也是为什么在Set中不能像在List中一样有重复的项的根本原因,因为HashMap的key是不能有重复的。
LinkedHashSet:HashSet的一个子类,一个链表。
TreeSet:SortedSet的子类,它不同于HashSet的根本就是TreeSet是有序的。它是通过SortedMap来实现的。
Set总结:
1. Set实现的基础是Map(HashMap);
2. Set中的元素是不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象
周星驰电影大全
| 投票排行榜 |
| 1.唐伯虎点秋香(13930票) 2.大话西游Ⅱ(11963票) 3.国产凌凌漆(9356票) 4.功夫(8193票) 5.长江七号(8069票) 6.大话西游Ⅰ(7961票) 7.鹿鼎记Ⅰ(7058票) 8.喜剧之王(6862票) 9.九品芝麻官(6603票) 10.鹿鼎记Ⅱ(6597票) |
| 11.少林足球(5948票) 12.食神(4817票) 13.大内密探零零发(4780票) 14.武状元苏乞儿(4464票) 15.逃学威龙(4209票) 16.千王之王2000(3606票) 17.逃学威龙Ⅲ之龙过鸡年(3532票) 18.百变星君(3368票) 19.逃学威龙Ⅱ之眼中钉(3262票) 20.整蛊专家(3198票) |
| 21.破坏之王(3162票) 22.审死官(3075票) 23.回魂夜(3022票) 24.算死草(3001票) 25.赌侠(2991票) 26.97家有喜事(2809票) 27.家有喜事(2774票) 28.赌圣(2737票) 29.济公(2537票) 30.赌侠Ⅱ之上海滩赌圣(2439票) |
| 31.行运一条龙(2276票) 32.龙的传人(2159票) 33.赌霸(2102票) 34.情圣(1995票) 35.新精武门(1951票) 36.无敌幸运星(1915票) 37.玻璃樽(1902票) 38.咖喱辣椒(1713票) 39.一本漫画闯天涯Ⅱ妙想天开(1704票) 40.漫画威龙(1593票) |
| 41.师兄撞鬼(1406票) 42.小偷阿星(1384票) 43.非洲和尚(1343票) 44.最佳女婿(1336票) 45.豪门夜宴(1334票) 46.望夫成龙(1272票) 47.龙在天涯(1258票) 48.义胆群英(1246票) 49.霹雳先锋(1236票) 50.一本漫画闯天涯(1225票) |
| 51.风雨同路(1221票) 52.江湖最后一个大佬(1215票) 53.龙凤茶楼(1183票) 54.捕风汉子(1150票) 55.流氓差婆(1118票) |
2008年2月22日星期五
List,Vector之类使用时的提醒问题
| Eclipse3.2中以下代码在.add方法被调用时会出现警告(warnings) |
Java中的Volatile关键字
Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。
生产者消费者进程 正确程序
{
public static void main(String args[])
{ Queue q=new Queue();
Producer pt=new Producer(q);
pt.start();
/* try
{
Thread.sleep(500);
}
catch(InterruptedException e)
{
}
*/
Comsumer ct=new Comsumer(q);
ct.start();
}
}
{
Queue q;
public Producer(Queue q)
{
this.q=q;
}
public void run()
{
for(int i=0;i<10;i++)
{
q.put(i);
}
}
}
class Comsumer extends Thread
{
Queue q;
public Comsumer(Queue q)
{
this.q=q;
}
public void run()
{
while(true)
{
q.get();
}
}
}
class Queue
{
int value;
boolean bFull=false;
public synchronized void put(int i)
{
if(bFull==false)
{
value=i;
System.out.println("Producer put "+i);
bFull=true;
try
{
this.wait();
}
catch(Exception e){}
}
}
public synchronized void get()
{
if(bFull==true)
{
System.out.println("Comsumer get "+value);
bFull=false;
this.notify();
}
}
}
2008年2月20日星期三
JAVA中的集合类
为什么要使用集合类
当你事先不知道要存放数据的个数,或者你需要一种比数组下标存取机制更灵活的方法时,你就需要用到集合类。
理解集合类
集合类存放于java.util包中。
集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
集合类型主要有3种:set(集)、list(列表)和map(映射)。
(1)集
集(set)是最简单的一种集合,它的对象不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。
对集中成员的访问和操作是通过集中对象的引用进行的,所以集中不能有重复对象。
集也有多种变体,可以实现排序等功能,如TreeSet,它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中。它实现的是SortedSet接口,也就是加入了对象比较的方法。通过对集中的对象迭代,我们可以得到一个升序的对象集合。
(2)列表
列表的主要特征是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,当然,它与根本没有顺序的集是不同的。
列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。
关于实现列表的集合类,是我们日常工作中经常用到的,将在后边的笔记详细介绍。
(3)映射
映射与集或列表有明显区别,映射中每个项都是成对的。映射中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。关键字应该是唯一的。
关键字本身并不能决定对象的存储位置,它需要对过一种散列(hashing)技术来处理,产生一个被称作散列码(hash code)的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置。理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码。
集合类简介
java.util中共有13个类可用于管理集合对象,它们支持集、列表或映射等集合,以下是这些类的简单介绍
集:
HashSet: 使用HashMap的一个集的实现。虽然集定义成无序,但必须存在某种方法能相当高效地找到一个对象。使用一个HashMap对象实现集的存储和检索操作是在固定时间内实现的.
TreeSet: 在集中以升序对对象排序的集的实现。这意味着从一个TreeSet对象获得第一个迭代器将按升序提供对象。TreeSet类使用了一个TreeMap.
列表:
Vector: 实现一个类似数组一样的表,自动增加容量来容纳你所需的元素。使用下标存储和检索对象就象在一个标准的数组中一样。你也可以用一个迭代器从一个Vector中检索对象。Vector是唯一的同步容器类??当两个或多个线程同时访问时也是性能良好的。
Stsck: 这个类从Vector派生而来,并且增加了方法实现栈??一种后进先出的存储结构。
LinkedList: 实现一个链表。由这个类定义的链表也可以像栈或队列一样被使用。
ArrayList: 实现一个数组,它的规模可变并且能像链表一样被访问。它提供的功能类似Vector类但不同步。
映射:
HashTable: 实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类是前面java实现的一个继承,并且通常能在实现映象的其他类中更好的使用。
HashMap: 实现一个映象,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个)。
WeakHashMap: 实现这样一个映象:通常如果一个键对一个对象而言不再被引用,键/对象对将被舍弃。这与HashMap形成对照,映象中的键维持键/对象对的生命周期,尽管使用映象的程序不再有对键的引用,并且因此不能检索对象。
TreeMap: 实现这样一个映象,对象是按键升序排列的。
Set和List都是由公共接口Collection扩展而来,所以它们都可以使用一个类型为Collection的变量来引用。这就意味着任何列表或集构成的集合都可以用这种方式引用,只有映射类除外(但也不是完全排除在外,因为可以从映射获得一个列表。)所以说,把一个列表或集传递给方法的标准途径是使用Collection类型的参数。
Vector 还是ArrayList,哪一个更好,为什么?
要回答这个问题不能一概而论,有时候使用Vector比较好;有时是ArrayList,有时候这两个都不是最好的选择。你别指望能够获得一个简单肯定答案,因为这要看你用它们干什么。下面有4个要考虑的因素:
(1)API
(2)同步处理
(3)数据增长性
(4)使用模式
下面针对这4个方面进行一一探讨
API
在由Ken Arnold等编著的《Java Programming Language》(Addison-Wesley, June 2000)一书中有这样的描述,Vector类似于ArrayList.。所有从API的角度来看这两个类非常相似。但他们之间也还是有一些主要的区别的。
同步性
Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。
数据增长
从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。
使用模式
在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢?
这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作,你最好选择其他的集合操作类。比如,LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的―O(1),但它在索引一个元素的使用缺比较慢-O(i),其中i是索引的位置.使用ArrayList也很容易,因为你可以简单的使用索引来代替创建iterator对象的操作。LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销。
最后,在《Practical Java》一书中Peter Haggar建议使用一个简单的数组(Array)来代替Vector或ArrayList。尤其是对于执行效率要求高的程序更应如此。因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分配空间的操作。
关于作者:Tony Sintes是BroadVision的首席顾问。它是SUN的认证程序员,并且从1997年就开始使用Java开发程序。
消费者 生产者java程序 不知道错在哪里?
{
public static void main(String args[])
{
Producer pt=new Producer();
System.out.println("生产者线程启动..");
pt.start();
System.out.println("消费者线程启动..");
Comsumer ct=new Comsumer();
ct.start();
}
}
{
Queue q=new Queue();
public void run()
{
for(int i=0;i<10;i++)
q.put(i);
}
}
class Comsumer extends Thread
{
Queue q=new Queue();
public void run()
{
q.get();
}
}
class Queue
{
int value;
public void put(int i)
{
value=i;
System.out.println("Producer put "+i);
}
public void get()
{
System.out.println("Comsumer get "+value);
}
}
2008年2月3日星期日
photoshop考试作品
1. 初步构思。原图只有空荡荡的楼顶,天空很低,给人很压抑的感觉。楼面很烂,考虑在楼面布置草地,同时扩张天空。
2. 打开草地的图片,作为背景,为了处理背景,选择复制背景 作为一个新的图层"背景副本"。
3. 打开老师给的原图,使用套索工具选择需要的建筑。然后使用移动工具将其移动到背景上,命名为图层4。
4. 打开天空图片,将其移动到我们的图像中作为新的图层,其位置位于图层4之下 背景副本之上。
5. 至此,大致的景象已经出来了。但是存在两个问题,一是草地太绿,也就是太鲜艳太显眼,感觉色彩搭配不好,所以使用了调整中的自动对阶处理。二是,在使用套索工具选择楼房时,不可能很精确地去掉原有的天空,以致在建筑物的原有的天空与现在的天空在边界上明显很不符合。处理方法:使用魔棒工具,在图层4(建筑原图)选择原来的天空,选择好后选择"通过剪切的图层",然后再删除这个新建的图层。这样就基本解决了问题了。
6. 加上版权,ok。不足之处,色彩的搭配仍需改进。虽然作品不是想象中的好,但是仍然对自己手中出来的成果有点高兴,对photoshop更加感兴趣啦。
经验分享:CSS组合CLASS来完成网页布局风格
| 我是这样来做DIV布局代码的.不知道说的清楚不清楚,凑和看吧 我把class分为2种,布局class,风格class,布局class是骨架,风格class是衣服 举个例子: 比如布局中的左栏 首先它的属性有:是左栏,宽度,背景颜色,字体颜色等 1.首先会定义一个class,比如:.layout,主要用来控制页面整个的大小 .layout{width:98%;margin:0 auto;text-align:left;} 2.然后会定义3个基本布局Class(l,m,r) .l{float:left} 我把2栏布局也归类于3栏布局,因为3栏布局中,左右栏的宽度分别为0的时候,3栏就变成了2栏. 我们写基本布局代码的时候,最好还是写成3栏格式. 3.对应布局Class,定义需要的风格Class,比如宽度,高度,背景颜色等等这些都属于风格元素 .class_l{background:#ff0;margin-right: -150px;width:150px;} 布局class只有一套,风格class可以定义很多.比如,要中栏里面在做一个小的2栏布局就可以再定义一个风格class .mid_l{background:#ff0;margin-right: -100px;width:100px;} 4.将布局class和风格class结合起来,在代码这样引用 <div class="l class_l"></div> 将2个class都引用,中间用空格隔开,前面的是布局class,后面的是风格class,后面还可以继续空格引用,如果需要再特殊定义,你可以给这个div取一个id来定义. 其他的一些常用的风格class也可以写成通用的,比如隐含可以定义为 .hide{display:none} 然后需要的时候,class="xxx hide"来引用,很方便. |
2008年2月1日星期五
千万不要嫖妓(爆笑)
| |
2008年1月31日星期四
firefox浏览器对javascript的大小写是敏感的!
最近要做一个文件管理的小系统,就想着用php+ajax来做,刚开始还是有浏览器兼容的问题,由于这个程序并不大,自己觉得还是有必要做好兼容的,如果以后功能进行扩展也会减少很多麻烦,所以就从电脑里翻出一本古董级(N久前下载)的ajax教程,找了一些最基础的代码,进行测试调试,令我吃惊的是这些程序竟不存在兼容的问题,待我仔细对比一番后,还真是发现了几处不同(看来以前是是不用心),具体就是字母大小写不同.
字母大小写不同体现在两个地方,定义头部输出信息:setrequestheader,全部小写的话在firefox就不能正常执行,改为setRequestHeader后,就可正常执行下一步了(在IE中也是正常的,如果使用"GET"的话头部输出信息并不是必须的),接下来要看执行状态:readystate,问题同头部输出信息相同,改为readyState,程序正常执行.
就是这小小的字母问题,困扰了我很长时间,如今终于解决了,总算是舒了一口气,所以把问题总结一下写在这里,如果有遇到同样问题的朋友可以拿来参考下,不过我想应该就只是自己遇到了这个问题吧,呵呵.
滑动门的另一个代码
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>BODY {
MARGIN: 6px 0px; FONT: 12px 宋体; TEXT-ALIGN: center
}
.divArea3 {
WIDTH: 750px
}
.divArea3 .divAreaCol1 {
FLOAT: left; WIDTH: 371px
}
.divArea3 .divAreaCol2 {
FLOAT: right; WIDTH: 280px
}
.divArea3Box {
BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #cccccc 1px solid; MARGIN-TOP: 2px; PADDING-LEFT: 2px; MARGIN-BOTTOM: 2px; PADDING-BOTTOM: 2px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 100%; LINE-HEIGHT: 120px; PADDING-TOP: 2px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 120px; TEXT-ALIGN: center
}
A {
COLOR: #999999; TEXT-DECORATION: none
}
.tabWin {
WIDTH: 371px; HEIGHT: 230px
}
.tabWin {
BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; DISPLAY: inline; FLOAT: left; MARGIN: 0px 3px; OVERFLOW: hidden; BORDER-LEFT: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid
}
.crbl {
BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; DISPLAY: inline; FLOAT: left; MARGIN: 0px 3px; OVERFLOW: hidden; BORDER-LEFT: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid
}
.tabWinInnerBox {
MARGIN: 5px; OVERFLOW: hidden; WIDTH: 361px; HEIGHT: 220px
}
.tabWinLine1 {
WIDTH: 360px; HEIGHT: 29px
}
.tabWinLine2 {
DISPLAY: block
}
.tabWinLine4 {
DISPLAY: none
}
.tabWinLine2 {
WIDTH: 360px; HEIGHT: 1px
}
.tabWinLine4 {
WIDTH: 360px; HEIGHT: 1px
}
.tabWinLine2 DIV {
FLOAT: left; WIDTH: 118px; HEIGHT: 1px; BACKGROUND-COLOR: #cccccc
}
tabWinLine4 DIV {
FLOAT: left; WIDTH: 118px; HEIGHT: 1px; BACKGROUND-COLOR: #cccccc
}
.tabWinLine1 .sepa {
BACKGROUND-IMAGE: url(images/0.gif); WIDTH: 3px
}
.tabWinLine2 .sepa {
BACKGROUND-IMAGE: url(images/0.gif); WIDTH: 3px
}
.tabWinLine4 .sepa {
BACKGROUND-IMAGE: url(images/0.gif); WIDTH: 3px
}
.tabWinLine2 .tabWinLine3 {
BACKGROUND-REPEAT: no-repeat; BACKGROUND-COLOR: #ffffff
}
tabWinLine4 tabWinLine3 {
BACKGROUND-REPEAT: no-repeat; BACKGROUND-COLOR: #ffffff
}
.tabWinLine1 DIV {
FONT-WEIGHT: bold; FLOAT: left; BACKGROUND-IMAGE: url(images/c21_1.gif); WIDTH: 118px; CURSOR: pointer; COLOR: #1f3a87; LINE-HEIGHT: 26px; HEIGHT: 26px
}
.tabWinLine1 .tabWinTitle {
BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; BACKGROUND-IMAGE: url(images/0.gif); BORDER-LEFT: #cccccc 1px solid; WIDTH: 116px; COLOR: #b10000; HEIGHT: 28px; BACKGROUND-COLOR: white
}
.tabWinInnerBox .showblock {
BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 3px; PADDING-LEFT: 7px; PADDING-BOTTOM: 8px; MARGIN: 0px 0px 3px; OVERFLOW: hidden; BORDER-LEFT: #cccccc 1px solid; WIDTH: 348px; PADDING-TOP: 9px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 143px; BACKGROUND-COLOR: #ffffff; TEXT-ALIGN: left
}
.tabWinInnerBox .hiddenblock {
BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 3px; PADDING-LEFT: 7px; PADDING-BOTTOM: 8px; MARGIN: 0px 0px 3px; OVERFLOW: hidden; BORDER-LEFT: #cccccc 1px solid; WIDTH: 348px; PADDING-TOP: 9px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 143px; BACKGROUND-COLOR: #ffffff; TEXT-ALIGN: left
}
.hiddenblock {
DISPLAY: none
}
.showblock {
DISPLAY: block
}
.divTab2 {
DISPLAY: inline; FLOAT: left; MARGIN: 0px 3px; OVERFLOW: hidden; WIDTH: auto; HEIGHT: 232px
}
.divTab2 .TabTitle {
FONT-SIZE: 12px; WIDTH: 280px; HEIGHT: 24px
}
.divTab2 .normal {
BACKGROUND-IMAGE: url(images/mtitle2.gif); COLOR: #1f3a87
}
.divTab2 .active {
FONT-WEIGHT: bold; BACKGROUND-IMAGE: url(images/mtitle1.gif); COLOR: #1f3a87
}
.divTab2 .TabTitle .sepa {
BACKGROUND-IMAGE: url(images/speabg.gif); WIDTH: 1px
}
.divTab2 .TabTitle .border {
BACKGROUND-IMAGE: url(images/speabg.gif); WIDTH: 1px
}
.divTab2 .TabTitle DIV {
FLOAT: left; WIDTH: 92px; CURSOR: pointer; LINE-HEIGHT: 21px; PADDING-TOP: 3px; HEIGHT: 21px
}
.divTab2 .showblock {
BORDER-RIGHT: #064ca1 1px solid; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; OVERFLOW: hidden; BORDER-LEFT: #064ca1 1px solid; WIDTH: 278px; PADDING-TOP: 9px; BORDER-BOTTOM: #064ca1 1px solid; HEIGHT: 198px; TEXT-ALIGN: left
}
.divTab2 .hiddenblock {
BORDER-RIGHT: #064ca1 1px solid; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; OVERFLOW: hidden; BORDER-LEFT: #064ca1 1px solid; WIDTH: 278px; PADDING-TOP: 9px; BORDER-BOTTOM: #064ca1 1px solid; HEIGHT: 198px; TEXT-ALIGN: left
}
</STYLE>
<SCRIPT language=javascript>
var waitInterval;
var mouseDelayTime = 200;
/*选项窗*/
function tabWinMouseOver(tabWinObj,tabWinTotal,obj)
{
window.clearTimeout(waitInterval);
waitInterval=window.setTimeout("ChangeDiv3('"+tabWinObj+"',"+tabWinTotal+","+obj.id+")",mouseDelayTime)
}
function ChangeDiv3(tabWinObj,tabWinTotal,obj)
{
var itemNum;
for(var i=0;i<tabWinTotal;i++)
{
if (tabWinObj+"_Title"+i == obj.id)
{
itemNum = i;
document.getElementById(tabWinObj+"_Title"+i).className = "tabWinTitle";
document.getElementById(tabWinObj+"_Line"+i).className = "tabWinLine3";
document.getElementById(tabWinObj+"_Content"+i).className = "showblock";
}else{
var divID = document.getElementById(tabWinObj+"_Title"+i);
if (divID != null){divID.className = "";}
var ContentDiv = document.getElementById(tabWinObj+"_Content"+i);
if(ContentDiv!=null){ContentDiv.className = "hiddenblock";}
var BDiv = document.getElementById(tabWinObj+"_Line"+i);
if(BDiv!=null){BDiv.className="";}
}
}
var tabWinImg1 = document.getElementById(tabWinObj+"_Img1");
var tabWinImg2 = document.getElementById(tabWinObj+"_Img2");
if(tabWinImg1!=null && tabWinImg2!=null)
{
if(itemNum < 4)
{
tabWinImg1.className = "tabWinLine2";
tabWinImg2.className = "tabWinLine4";
}else{
tabWinImg1.className = "tabWinLine4";
tabWinImg2.className = "tabWinLine2";
}
}
}
/*选项卡*/
function tabMouseOver(tabObj,tabTotal,obj)
{
window.clearTimeout(waitInterval);
waitInterval=window.setTimeout("changeTabDiv('"+tabObj+"',"+tabTotal+","+obj.id+")",mouseDelayTime)
}
function changeTabDiv(tabObj,tabTotal,obj){
for(i=0; i <tabTotal; i++)
{
if (tabObj+"_Title"+i == obj.id)
{
document.getElementById(tabObj+"_Title"+i).className = "active";
document.getElementById(tabObj+"_Content"+i).className = "showblock";
}else{
document.getElementById(tabObj+"_Title"+i).className = "normal";
document.getElementById(tabObj+"_Content"+i).className = "hiddenblock";
}
}
}
function tabMouseOut(){window.clearTimeout(waitInterval);}
</SCRIPT>
<META content="MSHTML 6.00.2900.2180" name=GENERATOR></HEAD>
<BODY>
<DIV class=divArea3>
<DIV class=divAreaCol1><!-- 选项窗开始 -->
<DIV class=tabWin id=tabWin>
<DIV class=tabWinInnerBox>
<DIV class=tabWinLine1>
<DIV class=tabWinTitle id=tabWin_Title1
onmouseover="tabWinMouseOver('tabWin',7,this);" onmouseout=tabMouseOut();><A
class=a4 href="javascript:void(0);">热点概念股</A></DIV>
<DIV class=sepa></DIV>
<DIV id=tabWin_Title2 onMouseOver="tabWinMouseOver('tabWin',7,this);"
onmouseout=tabMouseOut();><A class=a4 href="javascript:void(0);">数据分析</A></DIV>
<DIV class=sepa></DIV>
<DIV id=tabWin_Title3 onMouseOver="tabWinMouseOver('tabWin',7,this);"
onmouseout=tabMouseOut();><A class=a4 href="javascript:void(0);">权证市场</A>
</DIV></DIV>
<DIV class=tabWinLine2 id=tabWin_Img1>
<DIV class=tabWinLine3 id=tabWin_Line1><IMG height=1 alt="" src=""
width=1></DIV>
<DIV class=sepa><IMG height=1 alt="" src="" width=1></DIV>
<DIV id=tabWin_Line2><IMG height=1 alt="" src="" width=1></DIV>
<DIV class=sepa><IMG height=1 alt="" src="" width=1></DIV>
<DIV id=tabWin_Line3><IMG height=1 alt="" src="" width=1></DIV></DIV>
<DIV class=showblock id=tabWin_Content1>ff </DIV>
<DIV class=hiddenblock id=tabWin_Content2>ff </DIV>
<DIV class=hiddenblock id=tabWin_Content3>ff </DIV>
<DIV class=tabWinLine1>
<DIV id=tabWin_Title4 onMouseOver="tabWinMouseOver('tabWin',7,this);"
onmouseout=tabMouseOut();><A class=a4 href="javascript:void(0);">研究报告</A></DIV>
<DIV class=sepa></DIV>
<DIV id=tabWin_Title5 onMouseOver="tabWinMouseOver('tabWin',7,this);"
onmouseout=tabMouseOut();><A class=a4 href="javascript:void(0);">名家专栏</A></DIV>
<DIV class=sepa></DIV>
<DIV id=tabWin_Title6 onMouseOver="tabWinMouseOver('tabWin',7,this);"
onmouseout=tabMouseOut();><A class=a4
href="javascript:void(0);">机构观点</A></DIV></DIV>
<DIV class=tabWinLine4 id=tabWin_Img2>
<DIV id=tabWin_Line4><IMG height=1 alt="" src="" width=1></DIV>
<DIV class=sepa><IMG height=1 alt="" src="" width=1></DIV>
<DIV id=tabWin_Line5><IMG height=1 alt="" src="" width=1></DIV>
<DIV class=sepa><IMG height=1 alt="" src="" width=1></DIV>
<DIV id=tabWin_Line6><IMG height=1 alt="" src="" width=1></DIV></DIV>
<DIV class=hiddenblock id=tabWin_Content4>fffsdafdsa </DIV>
<DIV class=hiddenblock id=tabWin_Content5>ff safasf</DIV>
<DIV class=hiddenblock id=tabWin_Content6>ggfdsafasdfsdafads
</DIV></DIV></DIV><!-- 选项窗结束 --></DIV>
</DIV>
</BODY></HTML>
2008年1月30日星期三
女程序员 羊城的奋斗经历(转载)
作者: IT探花 提交日期:2008-1-26 13:51:29
一.并不成功的开始
我所读的学校是中国西部的一所普通高校。我进大学后也和大多数同学一样,过着60分万岁的日子,除了对编程比较感兴趣外。(呵呵,好多室友都说我外表女人,内心却男人:喜欢写程序,喜欢和男生打星际,喜欢打CS选土匪,拿AK47)四年的大学生活淘进了我刚进校时的傲气与自尊,在栀子花开的季节,我面对的却是无法把握的未来。毕业了,是的,四年象梦一样。男友执意去了中国最繁荣的大都市,我却希望留守相对平静的近在咫尺的西部城市,结局是可想而知的。痛苦十分短暂,因为迫在眉睫的生存问题变得急为严峻。幸运的是,2004年7月我很顺利的找到了一份程序员的工作。
我的第一份工作比较轻松,就是做MIS系统,写写C#代码。工作很轻松,带我的经理也很照顾我。于是我每天过着上班下班的生活,每天穿梭在熙熙攘攘的人潮当中,全然没了生活的压力。这样的生活也让人讨厌,日子太无聊了,无非就是写着重复的代码,再就是在天涯上闲逛。这样的日子结束于我看到的一篇文章,题目我记不太清楚了,好像是:成为IT精英,我奋斗了7年。
当时很受鼓舞,也很自责。大学的四年已经荒废,难道还要重蹈覆辙? 于是我有了想离开这个安逸的城市,去节奏相对较快的城市锻炼一下自己。
于是在今年年初,我毅然背起行囊,踏上了南下的火车。。。。
二。初来乍到
一下火车,我来到人山人海的车站广场,看着人山人海,心里没有底气,毕竟是第一次出远门。但是只觉告诉我,先要找个落脚的地方。虽然我带了5000块,但是我却不敢乱花一分钱,因为在我印象中这座城市消费比原来的城市高多了。我得想办法尽快找到工作。
经过2个多小时的寻找,终于让我找到了一个网吧。于是不顾旅途劳累,趴在电脑前就上51JOB ,简单回顾了自己的工作经历,然后填写了简历,在网上投。时间过得很快,一下子到了中午。我出了网吧,胡乱吃了碗酸辣粉。然后去找旅馆,这里的旅馆真的很多,各种档次都有,我找了一个看上去觉得比较安全的旅馆。130一晚上,好心疼!!!尽管很累但是,大半个晚上我都没有睡着,双手紧紧的抓住手提袋。到了下半夜,我才慢慢的睡着。
早上起来的时候已经是9点多了,我洗漱完毕。双眼盯着手机屏幕,生怕会错过面试电话。也许我运气真的不错,大约10点,手机响了。我赶紧接了,一时高兴得语无伦次。电话里一个女声:您好,请问您是XX么?我们是yy科技有限公司,想约您下午面试......
挂了电话,我高兴得不知东南西北了,没想到这么快就有回应了。下午出门的时候我化了点淡妆,出门了。我按着yy公司的提示,费了将近2个小时才找到地方,真后悔没有买张地图。到yy公司的时候已经是下午4点了。
面试我的是位女经理。30分钟过后,我们谈得比较好。我自信满满的,呵呵。
最后经理问我期望的薪水时,我咬咬了牙,很小声的说了句3500 .经理说,其实你比较符合我们的要求,但是薪水可能不会那么高。我小声问她能给我多少,她说句2000。但是我心都冷了,我来这个城市之前的工资也有1500啊。。我说了句考虑考虑后,出了yy公司的大门。在传说中,这个城市不是每个人都拿高工资的么?怎么会这样?失望和痛苦同时袭来。
回到旅馆我仔细总结了一整天,得出结论:1.不是没有高工资,而是所掌握的技能门槛比较低,导致没有什么竞争力。2.一个规律:IT技能(不精通的情况下),技术门槛低的入门较容易的,在市场上竞争力不大(精通后,每项IT技能的竞争力相差不大。)。
3.所以我决定,去学习新的东西,门槛稍稍高那么一点的东西。
注意拿定,我回顾了自己所学的东西,觉得C/C++基础还可以,而且上学的时候写过一段时间的VC,于是决定啃C/C++。我开始在网上投C/C++相关的职位,把薪水要求降到2500~3000。上天又一次眷顾了我,四天后我找到了一份工作,工资2500,包住宿。唉,总算是定下来了,接着我便写了个学习C++的详细计划,花了1500元买了个二手电脑。工作后,我觉得极其的不适应,这个时候才知道,我对C++的理解是何其肤浅!基础太差了。。。自尊心一向很强的我,受了很大的刺激。我觉得,是时候努力了!
在工作的时候我积极的请教同事,下班后我在宿舍里疯狂的肯C++,在网上下载了教材。一行一行认真的读,上机练习,从基础开始。一步一步的来。在刚开始的一个月里,几乎每天都是凌晨才休息。但是我觉得很欣慰,因为我逐渐适应工作了,而且觉得越来越理解C++的内涵。连续这样3个月后,我终于对工作得心应手了,VC的底子也逐渐厚实。回想原来的夜郎自大,真的很好笑。现在我对C++无疑是敬畏的。
原来以为自己有多厉害,其实自己差得要命。不懂虚函数有什么用,不知道除了构造函数,析构函数外还有拷贝函数,还有深浅拷贝之分。不懂什么是多态,不懂什么是抽象类,不知道C++里居然还有个STL库。随便拿本VC的书就写程序,甚至不知道APP WIZARD生成程序的入口。
经过了三个月的苦心孤诣终于有点眉目了。我没有直接用VC,而是从SDK入手,用SDK写了将近一个月的程序。终于知道了windows里面居然还有消息机制,每个应用程序还有消息队列。编译器分配存储空间的时候居然还有内存对齐。这些新奇的东西让我兴奋,我每天如饥似渴的读着各类电子书。
《深入浅出MFC》,《高质量C/C++编程》,都是我的宝贝。 是的,正象很多人说的一样,没有几年是无法精通VC的。但是,我们无需精通每个方面,我们只需足够熟悉我们工作所用到的部分。DLL,数据库,组件技术,图形技术,进程调度,多线程等等,网络...太多太多了,MFC是如此的庞大。
也许是我心高气傲,当经理跟我说转正给我3000的时候,我拒绝了,我觉得自己可以拿更高的薪水。于是我辞职了。。
这次的离职,没有给我带来什么忧虑,可能通过前断时间的学习有了些许的底气。可能大家很奇怪,为什么上文多次提到工资,请原谅我的俗气!当爱情不能依靠时,金钱是能唯一给我安全感的东西。
作者: IT探花 回复日期:2008-1-26 13:54:00
这一次我打算找名气稍微强一点的企业。正好,TX公司正开招聘会。我一大早赶到招聘会现场,很热闹,已经有很多人在那里面试了。等了大约半个小时,终于轮到我了。面试官没有象我想象的那样提一些基础知识,而是直接问我对UML怎么理解,对UI设计有什么心得这些抽象的问题。我回答得吞吞吐吐,语无伦次,结果是可想而知的。55555555,真的好惨,这个全国著名的SP把我就这样简单的拒绝了,好打击人啊。但是这次来并非没有收获,因为在我走出招聘会场的时候,我留意到unix/linux展台门可罗雀,于是一个计划又在我内心酝酿。我回家后在网上搜集linux入门资料,然后把电脑硬盘格式化,为了表示学习linux的决心,我给windows 15G,给了linux 25G,就这样开始了我的学习linux之旅!
第二天,我从朋友那里打听到GDNT有个招聘会,于是又风风火火的赶去。GDNT的面试也给了我重重一棒子,让我好痛苦。在痛苦中过了3天后,一个高中同学说她们单位要招VC方面的人。我当时真的很高兴,也很紧张,因为这次面对的公司是中国著名电信运营商的研发中心。由于朋友的引见,面试很快确定在2天后。在这两天里,我把所有关于C/C++的知识点复习了一遍,然后阅读了一些网络方面的资料。果然功夫不负有心人,2个小时的比试面试过去了,我成了她们的一员。最后PM许诺试用期给我4K。
这里的工作环境很好,工作也比较轻松,也许所有国企都是这样的把。下午2:00上班,中午可以休息两个小时。单位食堂的伙食丰富而且价格便宜,一般不超过5元,最令人觉得温馨的是饭后偶尔还会发水果。:) 真的是好幸福,呵呵。在这里主要做的是一些交换网管系统,在这期间我跟PM学了不少东西。熟悉了HW,ZTE的很多产品,以及COBAR接口规范。私下还对7号信令做了比较详细的阅读,而且对很多网络协议有所了解了,比如SNMP,RIPv2、OSPF、IGRP,还学会了怎样使用CLEARCASE等工具。但是,最大的收获莫过于对UNIX的学习了。在这里有很多UNIX机器,HP-UNIX ,IBM-AIX,SUNOS 等等。。。
每天下班后我没有直接回家,而是留在了单位telnet到SUNOS上,开始了我学习unix的计划。几乎天天都是10:00以后才离开单位,搞不懂的就问人或者在网上找资料。回家以后,我继续在linux上学习一直到转钟。这期间我真的学了很多,跟windows上写程序完全不同了,似乎更关心细节,更关心操作系统了。经过大约3个月的摸索,终于对unix有所了解了,觉得好多东西豁然开朗。进程通讯,进程管理,页面置换,信号灯,线程池这些东西是我在indows下写程序从未接触过的。
觉得学习unix真的很幸福,每天进步一点,会让我睡得踏实。把《unix高级环境编程》学完后,我开始慢慢的请教前辈,有关嵌入式的开发的问题。
慢慢学着分析内核情景,裁减内核,底层的东西让我觉得好奇。还有一件让人特兴奋的事儿,咱们科室好多开发人员都是女同志,PM也是女人。
时间飞快,转眼四个月已经过去了。我觉得是时候该离开这个安逸的国企了,说真的,真有些舍不得,我向PM提出辞职时,经理非常真诚的挽留我,说我工作做得不错,叫我考虑考虑再走。这里的人真的很好,学习的气氛也很浓,也许我希望日子过得紧张一些。经理说我这样跳来跳去不利于自身的发展。也许她是对的,也许是我太倔犟,终于还是走了。我知道,当我交出那张卡,就再也不能回来了,走出大门站在华景的天桥上我默默的站了10分钟,仰望着那熟悉的大厦。
晚上回去改了改简历,然后在网上投。躺在床上,看着天花板,突然之间觉得好孤单,这里一个亲人也没有,鼻子很酸,好想哭。客厅电视机里传来世界杯预选赛的呐喊(我和一个男生一个女生合租三室一厅)。我走出客厅和那个男生谈了很多,也知道了他很多事情。现在才知道,虽然是合租,但是彼此沟通真的很少。他原来是在XTKJ工作,后来跳到外企,也是搞IT的,也是程序员。一个人到南方。
当时聊了很多,不觉到了凌晨。不过我们都没有睡意,于是他问我会星际否,我一拍即合。他很惊讶的看着我:你真的会。我说试试就知道。于是我们各自回房打开电脑,比赛开始了,呵呵。也许是他太轻敌,第一场,我选虫族,他选人族,结果被我出快狗偷袭成功,不过后来几场我都输得很惨,呵呵。。
第二天睡到中午才起来,1点多的时候突然来了个电话,通知我去面试,职位是linux程序员。我赶快打扮起来:)。照镜子才发现,自己瘦了好多,也憔悴了不少。我穿上了自己最漂亮的衣服,然后简单了画了一下眉,打了粉底和眼影,并且还画龙点睛的摸了腮红。呵呵,自己对着镜子傻笑。
到了面试的公司(一个刚成立不久的外企,VOIP设备商),和PM谈得很顺利。他问的问题也很简单:函数传值传址的区别,常用的进程通讯方式,和我做过的一些项目等等。。最后PM问我期望的薪水是多少。我怯怯的说了句:5K 。 经理摸了摸前额想了想对我说:这样把,你好好干,试用期我给你5.5K.
出了公司门,感觉天空一片蔚蓝。~~~~~~
交大家一招泡妞方法!
2008年1月29日星期二
css 布局感悟
程序代码
@charset "utf-8";
/*定义全局,在这定义了全局中的标签*/
* {margin:0px;padding:0px;}
/* 在这里定义了全局的文字大小为12PX,行高180%;这样的行高看起来眼睛不会太累。 在这里,我把宋体放在了Verdana字体的后边,是为了中页面中的数字和英文能以英文字体显示,这样会漂亮一些;有些人不加宋体,但这样会有问题的,最起码我的测试结果是这样的。 另外,我加了背景色,是因为在某些操作系统下的某些浏览器中,如果要不加背景,那么他的背景就会是其它的色。 我在这里还定义了整体文字色。没有用黑色是为了让眼睛舒服一些; 最重要的一些为是加了textalign;这个是让BODY中的内容全是居中,与里边一个大的DIV块合用,就可以实在如果页面内容是定宽的,那么在IE和FIREFOX等浏览器中内容总在网页的中间,主要是为了解决IE和FIREFOX中的差别,这里把文字弄成居中,然后我们再在BODY中加一个大的DIV块,把这个DIV的块写成文字左对齐, */
body{ font-size:12px; line-height:1.8; font-family:Verdana, "宋体", Arial,Sans; text-align:center; background:#FFF; color:#666;}
/* 这里定义了全局的文字链接样式,我用了简写的形式,样式是和客齐集主站是一样的 */
a:link,a:visited{color:#000099; text-decoration: underline;}
a:hover,a:active{color:#000;text-decoration: none;background-color: #FED762;}
/* 由于布局中将会用到很多的UL和LI,而UL和LI本身的样式并不好看,所以在这里我们去除列表小点以及边距等 */
ul,li{ list-style:none; margin:o;}
/* 这里定义图片的边模框为0,这里全局定义一下。后边有加边框的,另外再加,主要的思想还是从大到小。 */
img{ border:0;}
/* 这个是就包在BODY里的最大也是最外边的一个DIV块,有了就可以控制整个网页内容的宽度了。与BODY合用,就可以实现自动居中了。定义整个网站的宽度和水平居中 1、这里定义了文字全部为左对齐。 2、用MARGIN来实现在FIREFOX中居中。 3、用OVERFLOW是担心有些人定义的内容会太宽而影响了布局。所以缢出就自动隐藏了; */
#wrapper{ text-align:left;margin:0 auto; width:1000px; overflow:hidden;}
/* INFO这里又加了一个宽为百分百的DIV块,加他是为了让有些站长可以把布局定制成全屏的,右边定宽,左边自动适用而加的。并是解决一行两列的的前题基础。 这里我加了FLOAT,是为了"以毒攻毒"就是用浮动来解决浮动。因为右边也要加浮动; */
#info{ width:100%; float:left; }
/* 这里是导航条 用BODER来加上边的绿色 */
#nav{width:100%; text-align:center; border-top:5px solid #5DB30A; background:#FAFAFA; line-height:2.2}
/* 这里用了绝对定位,因为一共有三个以上的页面要用这个,很有可能他会受其它内容的影响,所以就定义为绝对定位,这样基本上不会受到影响。 bykijiji的图片位置 */
#bykijiji{position: absolute; margin-left:550px; margin-top:-20px;}
/* 主体大块*/
#main{text-align:left;margin:0 auto;}
/*底部大块*/
#footer{border-top:1px solid #CDCDCD; padding:10px 0; clear:both; text-align:center;margin:0 auto;}
/*头部大块*/
#header{ clear:both}
/* 这里定义了HEADER区标题文字的大小。色彩等。主要是为了让站长直接加文字LOGO就可以了。 标题*/
#header h2{ font-size:35px; margin-top:0px; font-weight:bold; color:#404040}
/* 以下LEFT和RIGHT是完成一行两列布局为。我在LEFT外边加了一个INFO。是为什么让定制更灵活一些,可以实现页面适度自动适应。 左边大块 这里的LEFT距右边305PX,由于他外边有一个百分之百的DIV。所以,这样就给右边一列留下了305的宽度。就样LEFT就可以自适应了。 */
#left{ margin-right:305px;color:#000; font-size:14px;}
/*这个是LEFT里边的一个最大的DIV。这个是为是解决不同版本浏览器对PADDING的解释和计算的方法的不同*/
leftbox{ padding:10px; font-size:14px;}
/*右边大块 由于他前边的INFO的宽已经是百分百了,而里边的LEFT又给他留了一个305PX的空子。所以让他距左边负的305PX就正好和LEFT挨上了。在这里写了300PX,是和左边大块离开5PX;这样看上去更舒服。 这里我定义了宽是289PX;再加上PADDING左右的各5PX;是299PX; 为了安全,我少写一个像素。 */
#right{ margin-left:-300px; float:left; width:289px; padding:5px;background:#F7F7F7; margin-top:24px;}
/* 这是搜索那一条,没有什么好说的。 搜索那一条*/
#search{ padding:0 0 10px 0; text-align:left}
/*定义标题文字大小*/
h1{ font-size:16px;}
/* 在这里,定议了 公用的三个CSS,他们都是布局中常用的。分别为水平换行,左浮动和右浮动 这样命名很简单,而且字符最短,这样论在CSS文件中,还是页面中,最能作到代码尽量少。 */
.c{clear:both; height:0px; overflow:hidden;} .l{ float:left;} .r{ float:right;}
/*这里定义了一个文字大小,由于上边定义的很多都是12PX;可能或一定会有部分地方要用小字的,所以提前写在这里。*/
.f12{ font-size:12px;}
/*这义SMALL的文字大小。*/
small{font-size:12px;color:#999;font-weight: normal; padding-left:5px;} .h_hr{ height:1px; overflow:hidden; margin:10px 5px; background:#CDCDCD;}
/*++++++++++++++++++++++++++++++++++++++++++++++++++ 以上就是定义的全局。然后在下边又分别对首页,LIST页面,以及单个信息的页面作了单独的CSS; 可以看出,用了上边的基础,下边单个页面CSS写起就方便多了。而且只要很少的代码就可以了。可能首页的代码会多一些; 下边的这些就不一一说明了。很简单的东西。 */
/*单个页面部分*/
.imgbox{ text-align:center; width:200px;} .imgbox img{ border:4px solid #CCC; display:block; margin:0 auto; } .navbox{border-left:4px solid #f5f5f5; margin:5px 0 10px 0; padding-left:8px; }
/*LIST页面部分*/
#listnav{ background:#f7f7f7; line-height:2.0; padding-left:10px; border-bottom:1px solid #D4D4D4;}
.listbox{ color:#666;width:590px;font-size:12px;border-bottom: 1px dashed #CCC;}
/*绿色的时间*/
.listbox p{color: #008000;}
/*大标题*/
#leftbox h2{font-size:14px; margin-top:10px;}
#leftbox span{ margin-left:10px;}
/*首页页面部分*/
#h_center_l{ width:66%; border-left:1px solid #CDCDCD;border-right:1px solid #CDCDCD; float:left; margin-top:10px;}
#h_center_lbox{width:49%; border-right:1px solid #CDCDCD; float:left;}
#h_center_lboxb{width:50%; float:right;}
#h_center_r{width:33%; float:right;margin-top:10px;}
#h_center_l h1,#h_center_r h1{ padding-left:5px; font-size:14px;}
#h_center_l ul,#h_center_r ul{ padding-left:19px; font-size:12px;}
#qcity{clear:both; margin-bottom:20px; margin-top:10px;}
#qcity li{ display:inline; padding-left:10px;}
#qcity h3{ font-size:14px; color:#000}
#links { border-top: 1px solid #CCC; margin-top: 15px; }
/*广告块部分*/
#leftbottomad{ background:#FFFFCC; margin-left:10px; display:none}
#pfm{padding:20px; font-size:12px;}
/*CSS完*/
说一说我个人在写布局和CSS的一点感受吧!说明,只是个人的感受! 1、了解用户群,如果你的用户是白领都是学生。那么你没有必要去考虑IE5以下的版本。那样你会累死的。 2、一行三列或一行二列自动适应,这个例子就可以了,他在IE6,IE7,FIREFOX等的效果都是一样的。没有必要有一堆代码去写一个自动适应。 3、布局最难的就是布表单了。表单中的元素太多了,很难控制,特别是要适应很多浏览器。这个是更难了。如果将来我遇到表单,如果不是非常简单的,那么我一定用表格,我想信,复杂的表单用表格去布局,代码一定会小于那个人家常说的DIV+CSS。而且有表格布这东西,维护特别的容易。 4、在CSS设计的时间,总的来说,是标签从大到小来定义,布局从大块到小块。标签不一定用到很多。 5、有些人认为不要给那些DIV或块加上什么ID; 我认为,加ID是正确的,如果ID中有不同的标签,那么通过CSS来控制就在容易了。有时我们会认为一些同样的色彩应该写在一个CLASS里。然后哪里用到那么我们就在哪里调,如果变色,一改这个CLASS就全变了。但是,我想问,如果不全变呢,只变一块,你怎么办。还去改布局吗? 如果是这样,那么结构和表现分开又有什么意义呢。 6、我们布大局可能会很简单,就像盖房子,大的样子几天就起来。但细细装修就麻烦了,又苦又累。我们常常分为了一个像素,节省一行代码而浪费大量的时间在上边,我感觉时间还是要花的,但是要有一个度。 7、布局时,我们也许把布局和CSS都弄的很NB。但同事一时半会看不懂你为什么要这样写,这样多人开发就很难了。你写的东西可能只有你能改。这样就麻烦了。所以,我们不一定非要布局写的很NB。
IE与Firefox的CSS兼容大全
常见兼容问题:
1.DOCTYPE 影响 CSS 处理
2.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行
3.FF: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中
4.FF: 设置 padding 后, div 会增加 height 和 width, 但 IE 不会, 故需要用 !important 多设一个 height 和 width
5.FF: 支持 !important, IE 则忽略, 可用 !important 为 FF 特别设置样式
6.div 的垂直居中问题: vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行
7.cursor: pointer 可以同时在 IE FF 中显示游标手指状, hand 仅 IE 可以
8.FF: 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和 menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。
9.在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法:
div{margin:30px!important;margin:28px;}
注意这两个margin的顺序一定不能写反,据阿捷的说法!important这个属性IE不能识别,但别的浏览器可以识别。所以在IE下其实解释成这样:
div{maring:30px;margin:28px}
重复定义的话按照最后一个来执行,所以不可以只写margin:XXpx!important;
10.IE5 和IE6的BOX解释不一致
IE5下
div{width:300px;margin:0 10px 0 10px;}
div的宽度会被解释为300px-10px(右填充)-10px(左填充)最终div的宽度为280px,而在IE6和其他浏览器上宽度则是以300px+10px(右填充)+10px(左填充)=320px来计算的。这时我们可以做如下修改
div{width:300px!important;width /**/:340px;margin:0 10px 0 10px}
关于这个/**/是什么我也不太明白,只知道IE5和firefox都支持但IE6不支持,如果有人理解的话,请告诉我一声,谢了!:)
11.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值所以先定义
ul{margin:0;padding:0;}
就能解决大部分问题
注意事项:
1、float的div一定要闭合。
例如:(其中floatA、floatB的属性已经设置为float:left;)
<#div id="floatA" ></#div>
<#div id="floatB" ></#div>
<#div id="NOTfloatC" ></#div>
这里的NOTfloatC并不希望继续平移,而是希望往下排。
这段代码在IE中毫无问题,问题出在FF。原因是NOTfloatC并非float标签,必须将float标签闭合。
在
<#div class="floatB"></#div>
<#div class="NOTfloatC"></#div>
之间加上
<#div class="clear"></#div>
这个div一定要注意声明位置,一定要放在最恰当的地方,而且必须与两个具有float属性的div同级,之间不能存在嵌套关系,否则会产生异常。
并且将clear这种样式定义为为如下即可:
.clear{
clear:both;}
此外,为了让高度能自动适应,要在wrapper里面加上overflow:hidden;
当包含float的box的时候,高度自动适应在IE下无效,这时候应该触发IE的layout私有属性(万恶的IE啊!)用zoom:1;可以做到,这样就达到了兼容。
例如某一个wrapper如下定义:
.colwrapper{
overflow:hidden;
zoom:1;
margin:5px auto;}
2、margin加倍的问题。
设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。
解决方案是在这个div里面加上display:inline;
例如:
<#div id="imfloat"></#div>
相应的css为
#IamFloat{
float:left;
margin:5px;/*IE下理解为10px*/
display:inline;/*IE下再理解为5px*/}
3、关于容器的包涵关系
很多时候,尤其是容器内有平行布局,例如两、三个float的div时,宽度很容易出现问题。在IE中,外层的宽度会被内层更宽的div挤破。一定要用Photoshop或者Firework量取像素级的精度。
4、关于高度的问题
如果是动态地添加内容,高度最好不要定义。浏览器可以自动伸缩,然而如果是静态的内容,高度最好定好。(似乎有时候不会自动往下撑开,不知道具体怎么回事)
5、最狠的手段 - !important;
如果实在没有办法解决一些细节问题,可以用这个方法.FF对于"!important"会自动优先解析,然而IE则会忽略.如下
.tabd1{
background:url(/res/images/up/tab1.gif) no-repeat 0px 0px !important; /*Style for FF*/
background:url(/res/images/up/tab1.gif) no-repeat 1px 0px; /* Style for IE */}
值得注意的是,一定要将xxxx !important 这句放置在另一句之上,上面已经提过
网页设计命名标准(美工) 网页图片命名 网页css命名
文件夹主要建立以下文件夹:
1、Images 存放一些网站常用的图片;
2、Css 存放一些CSS文件;
3、Flash 存放一些Flash文件;
4、PSD 存放一些PSD源文件;
5、Temp 存放所有临时图片和其它文件;
6、copyright 版权信息(可选)
8、readme 说明文件
Css统一命名
注:本CSS命名规则只适合物table制作模式下
1、 css文件统一放在css文件夹下;命名css.css
2、 主样式定义:body、table、td、tr、a
3、 链接样式定义:link_white(白色);link_black (黑色);link_blue (蓝色) 等等;
说明:如有重复的后面加阿拉伯数字;如 link_red01 有下划线的如:link_red_
4、 文字样式定义:font_red (红色);font_red_14 (红色14号字);font_red_14b (红色14号加粗)
5、 边框样式定义:border_red_tblr (红色四个边);border_red_blr(红色底左右三边);border_red_lr(红色左右两个边);border_red_b (红色底一个边)等等;
6、 表单样式定义:text_100 (文本字段宽为100); textarea_200_red (文本区域宽为200有红色边框);select_100 (列表宽为100);button_150 (按钮宽150);
说明:表单用宽度定义,在命名中最长写到:"text_100_red"
7、 线的样式定义:line_X (横线);line_Y (竖线);line_X_red (红色横线);line_X_red2 (两个像素的红色横线);说明:在line中只定义虚线,实线在border中定义
8、 其它样式定义:在这里主要定义一些个性化的样式;
文件命名
head.asp 头文件
foot.asp 底文件
index.asp 首页文件
sort.html 分类嵌套文件
article_channel.asp 文章_频道页
article_list.asp 文章_列表页
article_detail.asp 文章_显示页
注明:如果有多个文章频道,则用article01,article02,article03等等
exhibit_channel.asp 展会信息_频道页
exhibit_list.asp 展会信息_列表页
exhibit_detail.asp 展会信息_显示页
product_channel.asp 产品中心_频道页
product_list.asp 产品中心_列表页
prodect_detail.asp 产品中心_显示页
corporation_channel.asp 会员_频道页
corporation_list.asp 会员_列表页
corporation_detail.asp 会员_显示页
information_channel.asp 商机信息_频道页
information_list.asp 商机信息_列表页
information_detail.asp 商机信息_显示页
job_channel.asp 招聘_频道页
job_list.asp 招聘_列表页
job_detail.asp 招聘_显示页
hr_channel.asp 求职_频道页
hr_list.asp 求职_列表页
hr_detail.asp 求职_显示页
job_hr_channel.asp 人才中心_频道页
job_hr_lisr.asp 人才中心_列表页
job_hr_detail.asp 人才中心_显示页
copyright.asp 版权页
图片命名
1、导航命名:menu_****.gif 如:menu_bg .gif(导航的背景图)
2、会员登录:login_****.gif 如:login_bg.gif (会员登陆的背景图)
3、搜索命名:search_****.gif 如:search_bg.gif (搜索的背景图)
4、小 图 标:ico_数字.gif 如:ico_001.gif
5、线的命名:line_X_颜色.gif 如:line_X_red.gif(红色横向虚线)说明:line只命名虚线
line_Y_red.gif(红色纵向虚线)
6、广告命名:ad_数字.gif 如:ad_001.gif
7、其它栏目的图片:以栏目名的第一个字母_****.gif
如:xwzx_bg.gif (新闻中心背景) cpzx_l.gif (产品中心的左边图)
8、产品与栏目热点图片: pic_数字.gif 如:pic_001.gif
说明:上、下、左、右 可以缩写为T、B、L、R
div+css命名参考
用了一段CSS 布局设计网页,发现自己的命名有点混乱,完全按照自己的想法命名,虽然没什么影响,有不给别人看源文件,但是工作室有时候和团队合作完成项目的时候,就遇到麻烦了,要修改一个地方相当的费事.所以还是有个标准比较好啊!
在网上看到的一个相关的参考,再加上平时也研究别人的代码,发现这样的命名使用很广泛!我再加上自己的经验,希望对看到这篇文章的人能有用!
命名参考
常用的CSS命名规则:
头:header
内容:content/container
尾:footer
导航:nav
侧栏:sidebar
栏目:column
页面外围控制整体布局宽度:wrapper
左右中:left right center
命名全部使用小写字母,如果需要多个单词,单词间使用"-"分隔,比如user-list
常用代码结构:
div:主要用于布局,分割页面的结构
ul/ol:用于无序/有序列表
span:没有特殊的意义,可以用作排版的辅助,例如<li><span>(4.23)</span>天幻网六周年天幻网六周年天幻网六周年天幻网六</li>然后在css中定义span为右浮动,实现了日期和标题分两侧显示的效果
h1-h6:标题
h1-h6 根据重要性依次递减
h1位最重要的标题
label:为了使你的表单更有亲和力而且还能辅助表单排版的好东西,例如:<label for="user-password">密 码</label>
<input type="password" name="password" id="user-password" />fieldset & legend:fildset套在表单外,legend用于描述表单内容。例如:<form>
<fieldset>
<legend>title</legend>
<label for="user-password">密 码</label>
<input type="password" name="password" id="user-password" />
</fieldset>
</form>
dl,dt,dd:当页面中出现第一行为类似标题/简述,然后下面为详细描述的内容时应该使用该标签,例如<dl>
<dt>什么是CSS?</dt>
<dd>CSS就是一种叫做样式表(stylesheet)的技术。也有的人称之为层叠样式表(Cascading Stylesheet)。<dd>
<dt>什么是XHTML?</dt>
<dd>XHTML是一个基于XML的置标语言,看起来与HTML有些想像,只有一些小的但重要的区别。可以这样看,XHTML就是一个扮演着类似HTML的角色的XML。 本质上说,XHTML是一个桥接(过渡)技术,结合了XML(有几分)的强大功能及HTML(大多数)的简单特性。</dd>
</dl> C #content
S #subcol
M #maincol
X #xcol这是纵向布局的XHTML结构,c-smx表示网页有三个纵栏, c-sm表示有两个纵栏, c-mx表示有两个纵栏其中一个是附属的, c-m表示一个纵栏。
其中在三纵栏的布局需要分为两层 第一层是#subcol与#main第二层是#main中的#maincol与#xcol。
自定义命名:
根据w3c网站上给出的,最好是用意义命名
比如:是重要的新闻高亮显示(像红色)
有两种.red{color:red}
.important-news{color:red}很显然第二种传达的意义更加明确,所以尽量不要用意义不明确的作为自己自定义的名字
2008年1月26日星期六
[李锐]元搜索引擎的研究和设计
点评:写得很不错,对元搜索引擎的体系架构、关键要点都有很详细的论述,我做的元搜索引擎思路上和文章上讲的很相似,值得想做元搜索引擎的朋友借鉴学习。
摘要:论文简要介绍了元搜索引擎的相关知识,提出了一个元搜索引擎系统的设计构想。该系统采用了反馈机制,在用户察看结果时进行在线学习和调整。在系统设计中提出了搜索语法的设计、基于用户喜好的成员搜索引擎的自动调度机制、个性化服务的支持等,并给出了建立一个元搜索引擎系统的关键技术。最后分析了该系统的意义以及尚需解决的问题。
关键字:Internet 搜索引擎 元搜索引擎 信息检索 搜索语法
一. 引言
在互联网发展初期,网站相对较少,网页数量亦较少,因而信息查找比较容易。随着Internet的飞速发展,人们越来越依靠网络来查找他们所需要的信息,然而伴随互联网爆炸性的发展,普通网络用户想找到所需的资料简直如同大海捞针,以至于迷失在信息的海洋中不知所措,出现了我们所说的"信息丰富,知识贫乏"的奇怪现象。搜索引擎正是为了解决这个"迷航"问题而出现的技术。搜索引擎(Search Engine简称SE)以一定的策略在互联网中搜集、发现信息,对信息进行理解、提取、组织和处理,并为用户提供检索服务,从而起到信息导航的目的。
现在,网上的搜索引擎有很多,比较著名的有Google,Yahoo,AltaVista,Dogpile,百度等。按照信息搜集方法和服务提供方式的不同,搜索引擎系统可以分为三大类:目录式搜索引擎,以Yahoo为代表(最近改为使用全文搜索技术);全文搜索引擎,以Google为代表;元搜索引擎,以Dogpile为代表。
二. 元搜索引擎概述
据信,一个单一搜索引擎的网络覆盖率最多只能覆盖到整个Internet资源的30-50%[3],因而查全率便无法保障;再加上任何搜索引擎的设计,均有其特定的数据库索引范围、独特的功能和使用方法,以及预期的用户群指向,导致同一个搜索请求,在不同搜索引擎中查询结果的重复率不足34%[5],因而查准率亦无法保证;因此,要想获得一个比较全面、准确的结果,就必须反复调用多个搜索引擎,并对返回结果进行比较、筛选和相互印证。元搜索引擎便应运而生。
2.1 定义
元搜索引擎(Meta Search Engine 简称MSE),是一种建立在独立搜索引擎基础上,调用其它独立搜索引擎的引擎,亦称"搜索引擎之母(The mother of search engines)"。在这里,"元"(Meta)为"总的"、"超越"之意,元搜索引擎就是对多个独立搜索引擎的整合、调用、控制和优化利用。相对于元搜索引擎,可被利用的独立搜索引擎称为"源搜索引擎"(Source Search Engine),或"成员搜索引擎"(Component Search Engine)。从功能上来讲,元搜索引擎像是一个过滤通道:以多个独立搜索引擎的输出结果作为输入,经过一番提取、剔除、萃取等操作,形成最终结果,然后将最终结果输出给用户。
2.2 元搜索引擎的典型工作过程可以归纳如下
① 用户通过统一的查询界面输入查询请求,元搜索引擎对查询进行一定的预处理。
② 元搜索引擎根据成员搜索引擎调度机制,选择若干成员搜索引擎。
③ 元搜索引擎根据选择的成员搜索引擎的查询格式,对原始查询请就进行本地化处理,转换为成员搜索引擎要求的查询格式串。
④ 向各个成员搜索引擎发送经过格式化的查询请求,等待返回结果。
⑤ 收集各个独立搜索引擎的返回结果。
⑥ 对返回结果进行综合处理,例如,消除重复链接,死链接等,形成最终结果。
⑦ 以一定的格式将最终结果返回给用户。
2.3 元搜索引擎的特点
元搜索引擎区别于独立搜索引擎,主要有这样一些特征:
① 不用设立庞大网页数据库,节省存储设备
② 提供了统一的外界模式,将一次查询提交到多个独立搜索引擎
③ 基于独立搜索引擎结果的二次加工
④ 标明结果记录的来源搜索引擎及其局部相关度,提供了全局相关度。
三. 元搜索引擎发展趋势
目前,元搜索引擎的研究、开发十分活跃。它要用到了信息检索、人工智能、数据库、数据挖掘、自然语言理解等领域的理论和技术,具有综合性和挑战性。又由于搜索引擎有大量的用户,由此衍射出许多商机,具有很好的经济价值,据估计现在已有几十亿美元的全球市场,所以引起了世界各国计算机科学界、信息产业界和商界的高度关注,已投入了不少的人力、物力,也取得了不俗的成绩。
一个理想的元搜索引擎应该具备以下功能要求:
① 涵盖较多的搜索资源,可随意选择和调用独立搜索引擎,还可根据一定调度策略进行自动调度。
② 具备尽可能多的可选择功能,如资源类型(网站、网页、新闻、软件、FTP、MP3、Flash、图像、影视等)选择、等待时间控制、返回结果数量控制、结果时段选择、过滤功能选择、结果显示方式选择等。
③ 强大的检索请求处理功能(如支持逻辑匹配检索、短语检索、自然语言检索等)和不同搜索引擎间检索语法规则、字符的转换功能(如对不支持"NEAR"算符的搜索引擎,可自动实现由"NEAR"向"AND"算符的转换等)。
④ 详尽全面的检索结果信息描述(如网页名称、URL、文摘、源搜索引擎、结果与用户检索需求的相关度等)。
⑤ 支持多种语言检索,比如提供中英文搜索等。
⑥ 可对结果进行自动分类,如按照域名、国别、资源类型、区域等进行分类整理。
⑦ 可以针对不同用户提供个性化服务。
目前Internet上面有很多元搜索引擎,良莠不齐。在功能实现上,各有侧重点,能做到"理想"的尚不多见。一些元搜索引擎在某些方面做得很好,但是在其他功能上却存在着缺陷或尚需改进:如大多数的元搜索引擎不支持自然语言检索,不支持中文检索等。元搜索引擎的功能受着源搜索引擎和元搜索技术的双重制约:一方面,源搜索引擎的各具特色的强大功能在元搜索引擎中受到限制而不能充分体现,而另一方面,任何一种元搜索技术都不能发掘和利用独立搜索引擎的全部功能。随着新技术的不断涌现,会使元搜索引擎做得更好,取得更好的用户满意度,这些技术有:
1.提高搜索引擎对用户检索提问的智能理解,体现为对自然语言查询请求的支持。
2.确定搜索引擎信息搜集范围,提高搜索引擎的针对性,体现为主题搜索,多媒体搜索。
3.基于智能代理的信息过滤和个性化服务。
4.重视交叉语言检索的研究和开发[9],提供多语言检索的支持,提供本土化的搜索服务。5.提高信息查询结果的精度,提高检索的有效性。
四. 一个元搜索引擎的设计构想
基于以上的研究,我们提出了一个元搜索引擎的设计构想。在这个构想中,我们采用了反馈机制,但我们并没有具体细化每一步,仅提供了一个整体框架,对于体系结构中的功能模块,我们对它们的功能和实现技术作了较为详细地分析,提供了若干可供选择的技术。在实现的时候可以选用其中的若干模块,以减少系统复杂性;也可以增加若干功能模块,以增加系统的功能,即这个设计构想具有良好的可伸缩性。
4.1 系统结构框架
4.2 功能模块介绍 4.2.1 图形化用户接口(GUI)
这部分是程序和用户的交接面,主要用来接受用户的原始查询请求和将最终结果显示给用户。实现的时候可以采用若干界面,比如可以使用命令行方式,图形界面等。这部分不牵涉到数据的处理,可以很好地实现对一份数据的多个视图。实现是可以考虑多种人机交互技术,将用户的查询请求提交给系统即可。
在界面上可以让用户设定成员搜索引擎列表,每个成员搜索引擎的最长等待时间、返回结果数量等;以及结果显示方式、排序策略、分类方式等。这部分信息可以保存在客户端的用户cookie中,这样以来用户不必每次都输入自己的定制信息,也就提供了个性化的服务。Cookie当中也可以保存用户的搜索纪录,可以对搜索历史和搜索习惯等进行知识挖掘,用于模式发现等。
4.2.2 查询预处理器
这部分接受GUI传来的原始查询请求,并对原始查询请求进行预处理,提供交叉语言检索和自然语言支持等功能。这部分需要用到查询语法和操作,在这里简要介绍一下我们设计的查询语法和操作规则。我们设计的查询语法和操作规则如下:
布尔逻辑运算
包括AND、OR、NOT和()等,这是最基本、最常用的语法规则:AND 表示搜索结果中会包含所有的关键词,可以使用'+'(加号)和空格来代替。OR 表示搜索结果中会包含至少一个关键词,可以使用','(逗号)来代替。NOT表示搜索结果中会排除NOT之后的关键词,可以使用'-'(减号)或'!'(感叹号)来代替。例如:搜索JFC NOT MFC,则结果中就只包含JFC,而不包含MFC。() 用来限制优先级,作用和数学运算中的()运算符相似。
其他简单而又较为常用的语法规则""
用来支持短语搜索,搜索引擎会将""中的关键词或其组合作为一个整体性的短语进行搜索。例如:搜索有关search engine方面的信息,可输入"search engine",搜索引擎就把"search engine"当作一个短语来搜索。如果不用"",就会搜索到既包含search又包含engine的信息,显然其中有很多是你不需要的。通配符 通配符用来代替若干字符组合,类似于正则表达式。通配符可为'*',代表任意多个字符,'?'代表当前位置上的字符可以是任意字符。
常用高级检索语法规则
near 可限定在一定区域范围内同时出现的关键词,这些关键词可能并不相邻,间隔越小的排列位置越靠前,其间隔用near/n控制,n为一具体数值,表示间隔最大不超过n个单词。
intitle 限定仅在标题中搜索关键字
inurl 限定仅在url中搜索关键字
insite 限定仅在给定的站点中搜索资源用户的查询请求可以用以下几部分描述:要包含的关键字(include),不包含的关键字(exclude),可以有任何一个的关键字(any),要包含的短语或句子(all),查询的区域,领域,主题,位置等。对于从GUI送过来的原始查询串,作以下处理:
1.进行自然语言解析,查询数据库,若能找到相应解答,将解答返回给用户。
2.根据搜索语法规则,扫描查询串,形成格式化的查询串,即分开哪部分是全包含,哪部分是不包含的等等。
3.从数据库中读出"stop words",与格式化查询串中的信息进行比较,剔除那些明显不必要搜索的关键字词。
4.对格式化串中的关键字进行"stemming"处理。这一步可以交给各个成员搜索引擎去实现,以减少处理的复杂性。
5.根据关键字词的信息,形成此次查询的领域,主题、区域、位置等信息。
4.2.3 成员搜索引擎调度器
在程序启动的时候,根据以往的用户的搜索历史和习惯,默认设定了若干成员搜索引擎。用户不满意还可以自己设定成员搜索引擎列表。此外程序还有自己的搜索引擎自动调度机制,根据用户的查询主题、领域、区域等信息,以及在以往的搜索中成员搜索引擎的性能表现(响应时间、返回结果数量、用户满意度、领域针对性、支持哪些高级检索功能等),产生一个合适的成员搜索引擎列表。
由于成员搜索引擎的信息(特别是查询串的格式化信息)经常发生变化,如果将它们的代码固定在元搜索引擎得主程序中显然是不合理的,因此我们采用了成员搜索引擎描述文件,以xml进行描述,采用形式化描述,对于每个新加入的成员搜索引擎,只要按照这个形式为其建立一个描述文件,就很容易将其加入到系统中。
4.2.4 查询分发器
接收由成员搜索引擎调度器产生的成员搜索引擎调度列表,连接数据库,读取这些成员搜索引擎的信息,包括主机信息、连接信息、查询参数串格式化信息等等。根据这些信息,同步启动若干线程,分别进行连接相应的成员搜索引擎。向它们发送经查询预处理器处理过的查询信息。这部分的功能的很大一部分是进行数据库的连接,其实有些信息可以让查询代理进行连接数据库,但是为了减少数据库的连接次数,把这部分功能集中起来进行一次连接,多次处理、多次使用。
4.2.5 查询代理
提供元搜索引擎和特定成员搜索引擎的交互接口。它首先接收从查询分发器送来的查询格式串。然后向查询分发器索取自己的查询参数化信息,再根据查询参数化信息,将查询格式串进行本地化,也就是转换成自己的要求格式。在这里有一个细节需要处理,就是有些成员搜索引擎肯定不支持这个元搜索引擎的部分高级检索功能,比如:不支持短语检索,通配符功能等。在处理的时候,删除原来的查询串中的这部分请求信息。
接下来就把本地化的查询请求发送到成员搜索引擎,等待返回结果。由于有时候有些服务不可用,所以可以先使用一个类似于ping命令的程序,先测试服务器是否可用,确定可用后再发送查询请求,开始连接后设置一个等待时间阀值,超时之后放弃。接收到返回结果后,使用html解析器从结果页面中提取检索结果,需要包含以下若干信息:链接信息、得到此链接的成员搜索引擎、在成员搜索引擎中的排序信息、目标页面的站点信息、目标页面的描述信息、锚记文字等。
4.2.6 综合处理模块
这是元搜索引擎实现的核心模块,一个元搜索引擎的执行效率的好坏与这个模块的实现紧密联系在一起,它需要使用若干功能模块,具体实现技术请参考4.3节:
结果收集模块负责同步接收成员搜索引擎的返回结果,并将最先得到的成员搜索引擎的返回结果呈现给用户,以减少用户的等待时间。
网页过滤模块根据重复结果的评判标准去除返回结果中的重复链接,根据用户的资源要求、时间限制、领域限制等信息,去除冗余的链接信息。
网页排序模块是根据一定的结果融合技术对检索结果进行融合处理。
综合处理模块负责将最终结果提交给GUI,由GUI把结果呈现给用户。此模块还负责使用搜索评价机制对此次搜索进行评价,并在客户端的cookie中记录此次搜索。
4.2.7 数据库
这里的数据库是一个比较笼统的概念,既包括实际的数据库,也包括一些配置文件和设置信息等,用来保存系统运行中需要使用的数据。这些信息包括:有关于自然语言问题的解答,成员搜索引擎的信息(主机信息、功能信息、参数化信息、检索性能信息),用户信息(搜索历史信息、个性化设置信息、个人信息等),禁止词表,词汇表(同义词,反义词,翻译信息,领域信息、主题信息等)。在具体实现时,有些信息可以放在客户端,以减少服务器的存储压力。
4.3 实现中的关键技术
重复结果的评判标准[12]
搜索结果中的链接(hyperlink)、锚记(anchor)、描述(description)等可以用来判断两个结果是否重复。我们基于下面的策略进行判断:
1.首先判断两个结果的hyperlink是否相同,若相同则认为是同一结果。
2.比较URL的相似性,如果主机IP地址、路径、文件名完全相同,也认为是同一结果。
3.比较文档的元信息,比如标题、作者、摘要、大小等信息,超过相似程度阀值的结果认为是相同的。对于这一条,为了提高系统的响应速度,可以不予实现。
结果融合技术[6,13,14]
从元搜索引擎的工作原理可以看出,结果融合技术是至关重要的,因此人们也提出了很多种方法来实现。较为简单的方法有:将响应速度最快的搜索引擎的结果呈现给用户;分别显示各个搜索引擎的返回结果,不做任何处理。较为复杂一些的就是根据一定的策略来实现结果融合了。
在文献[13]中,张卫丰等人给出了4种合成算法。在文献[14]中,J.P.Callan 等人针对不同的情况也给出了4种典型的合成算法。具体请参考相关文献。结果融合的实质是对检索结果的重新排序的过程。我们提出技术基于这样的认知:一个检索结果的重要程度取决于3个方面:检索到它的成员搜索引擎的个数,它在检索到各个成员搜索引擎中的排序位置,检索到它的成员搜索引擎的性能评价。假设有m个成员搜索引擎检索到它,它在第i个成员搜索引擎的排列位置是ri,第i个成员搜索引擎的性能评价是wi,那么这条结果的最终权值p是:
根据用户的设定,还可以对检索结果作进一步的处理:检测目标页面是否存在,以消除死链接;取回结果的目标页面,做文本分析,以提供更高的相关度判断和提供网页快照;对处理后的结果进行分类,可以按照领域、主题、站点等进行分类。
有效信息提取技术
在接收到成员搜索引擎的返回结果后,很重要的一个技术就是如何从结果页面中提取所需要的检索结果。由于成员搜索引擎间使用的技术不同,结构也相差很大,能否正确提取结果便是一个十分棘手的问题。基于这样的一个认知:搜索的结果都是动态生成的,因此所需要的结果必定是被包装起来的,也就是可以找到一个头和一个尾,在头和尾之间的内容便是我们所需要的内容。现在的办法是使用人工的方式,寻找这个头和尾,然后在配置信息里面告诉系统,由查询代理负责根据这些信息提取所需要的结果。
现在也有这样的实现方法,就是基于统计的方法,使用人工智能技术,让系统具有自学习的功能,这样以来就不用人工的干预,可以自主形成成员搜索引擎的在结果提取方面的信息。现在像Google提供了web services,可以直接提取相应信息(检索结果、响应时间、结果数量、文档相关度等),但是只有作为注册用户才可以无限制使用。这可能是一个更好的解决办法,因为独立搜索服务提供商更清楚自己的系统和使用的技术,也可以更直接的提供我们所需要的结果信息。
成员搜索引擎调度机制和性能评价机制[3,12]
成员搜索引擎调度技术是元搜索引擎的技术核心,即决定将用户查询发送到哪些成员搜索引擎上,可以收到好的检索效果。元搜索引擎下的每个成员搜索引擎都有自己的由一系列文档所组成的文本数据库,成员搜索引擎调度技术就是为每个查询提供最可能包含有用文档的成员搜索引擎列表,这对元搜索引擎的执行效率是至关重要的。在文献[12]中提到了四种方法:朴素算法、定性方法、定量方法和基于学习的方法。
为了实现成员搜索引擎的自动调度,我们使用用户的反馈信息,实现基于学习的调度机制,这样就需要一个成员搜索引擎的性能评价机制。
评价的依据是多次检索活动的记录数据,包括响应时间、返回数量等,其中主要部分是文档相关度,这部分知识可以通过用户提交(这是最好的方法,但是一般来讲,用户只是使用,而不进行反馈),也可以通过跟踪用户的点击链接活动来获得。评价是分层次来进行的:基于单条检索结果的评价、基于一次检索活动的评价、基于检索词的评价、基于检索领域的评价、整体检索性能的评价。
对于用户给出的搜索请求,如果系统中有各搜索引擎关于请求关键词的评价数据,则选择对这个关键词评价数据最优的一些搜索引擎进行检索;否则进行判断搜索请求是属于哪个领域,并且系统中有各成员搜索引擎在该领域的评价数据,则选择该领域最优的一些搜索引擎进行检索;否则选择整体检索性能最优的一些搜索引擎进行检索;若用户设定了使用相应速度最快或者返回结果最多等方式,则选用相应指标靠前的一些搜索引擎进行检索。
五. 浅析搜索引擎在电子商务中的应用
搜索引擎在电子商务中也可以大展伸手,现在就有很多的网站依靠Google的竞价排名服务来开展业务,这也是一些搜索服务提供商的盈利渠道之一。另外,根据用户的注册信息、搜索历史信息、搜索关键字所属领域、搜索习惯、访问记录等,可以发掘出用户的潜在购买欲望和感兴趣的商品等,这些信息可以被电子商务站点用来发现它们的潜在客户,可以给它们的客户定期发送它们感兴趣的商品更新列表等等。
六. 总结
Internet是一个庞大的信息源,它正处在急剧膨胀的时期,人们现在逐渐倾向于在网络上查找自己需要的信息。为了方便地利用Internet上的丰富资源,人们借助于相关学科的研究成果开发各种工具,搜索引擎便是其中最为常用的工具。
在已有的独立搜索引擎的基础上建立一个高效的元搜索引擎能够扩展独立搜索引擎的处理能力,提高检索的查全率,并且有可能进一步提高查准率。但是各个成员搜索引擎的自治性引起了集成的困难,困难主要来自:检索界面的差异、文档索引方法的不同、相关函数的差异、查询参数的不同、检索功能的强弱等。我们设计的系统吸收了一些成功系统的优点,同时也具有自己的特点:给出了自己的搜索语法;对搜索引擎检索效果的评价机制;成员搜索引擎的自动调度机制;设计了搜索引擎描述文件方法,使系统具有良好的可扩展性;给出了自己的结果融合算法;可以更踪用户的使用,接受用户反馈进行自主学习和调整,使系统具有自适应性。
七. 后续工作
我们选用了JAVA作为实现系统的程序设计语言工具,我们已经利用面向对象的软件工程理论分析此系统结构,并用java实现了其中的部分类的功能,定义了若干接口。接下来的工作是实现整个系统,对其中的部分算法作进一步的优化和改进。还可以根据需要,增加若干功能模块,使系统功能更加强大,系统更健壮。
[参考文献]
[1] Lawrence S.,Giles C.L. Accessibility of infomation on the Web[J]. Nature,1999,400(7):7-109
[2] Barker J. M eta-search Engines. Teaching Library Internet Workshops University of California[EB/OL]. http://www.lib.berkeley.edu/TeachngLib/Guides/Internet/M etaSearch.html,Berkeley,April 2000
[3] 基于Agent的元搜索引擎的研究与设计 陈俊杰,薛云,宋翰涛,陆玉昌,余雪丽。 计算机工程与应用,2003,Vol.10
[4] 集成搜索引擎与元搜索引擎 邢志宇 http://www.sowang.com/zhuanjia/xzhy.htm
[5] 元搜索引擎研究 张卫丰,徐宝文,周晓宇,李东,许蕾 计算机科学 2001 Vol.28
[6] 元搜索引擎系统合成算法的约束条件 阳小华,刘振宇, 谭敏生, 刘 杰, 张敏捷。 软件学报 2002 Vol.14 No.7
[7] 搜索引擎技术及趋势 李晓明,刘建国。
[8] Yang M.H.,Yang C.C.,Chung Y.M. A Natural Language Proccessing Based Internet Agent[J]. System man and Cybernetics IEEE,1997(1):100-105
[9] 交叉语言信息检索研究进展 张永奎,王树锋 计算机工程与应用 2002 Vol.19
[10] Building Efficient and Effective M etasearch Engines ACM Computing Surveys, Vol.34,No.1, March 2002
[11] 搜索引擎与Internet信息获取 薛洪明 盐城师范学院
[12] ISeeker——一个高效的元搜索引擎 彭洪汇,林作铨 计算机工程 2003 Vol.29 NO.10
[13] 元搜索引擎结果生成技术的研究 张卫丰,徐宝文,周晓宇,许蕾,李东 小型微型计算机系统 Vol.24 NO.1
[14] Callan, J.P., Lu, Z., Croft, W.B. Searching distributed collections with inference networks. In: Fox, E.A., Ingwersen, P., Fidel, R.,eds. Proceedings of the 18th International Conference on Research and Development in Information Retrieval. ACM Press, 1995.21~28.
计算技术研究所 李锐colin719@126.com
作者: colin719 2004年12月7日, 星期二 23:13
作者Blog: http://blog.csdn.net/colin719/

