给本科评估的专家们订做一本科研成果选辑,是体现图书馆能耐的好方式。嘿嘿,这就十分辛苦咨询部的同事们了,加了好多天班呢。不过,当一本本厚厚的成果集出现在专家们面前的时候,那效果可真不错。这不,老大的老大的老大提了一句:“还可以做个光盘。”
首先做的当然是光盘盒的封面、封底和光盘的盘面,基本元素要齐,关键文字不能含糊,秀一下吧:

光盘盒封面

光盘盒封底

光盘盘面
然后就是把内容灌进光盘。但是,那样用起来有些不方便,文件和文件夹混在一起放在光盘目录下,也显得有些乱。所以,老大的老大就说为了方便不熟悉计算机的专家使用,最好能够像看电影一样一点光盘就弹出个窗口,自动把内容一个一个地显示出来。恩,这点子好!
接下来,偶就琢磨开了,要做到像播放电影一样,那可不是一两天就能搞定的小工程,而且,好像也不方便利用。不如折衷吧,做个光盘内容导引的页面,这样即可以让使用者对光盘内容一目了然,又可以保持相关文档的独立性。说干就干,当偶一抬头,已经下午三点半了,偶午饭还没吃呢

恩,要实现光盘的自动运行,只需要在刻盘的时候把自动运行的程序和一个名为autorun.inf的文件一起刻到盘里就行了。这个自动运行的程序用来显示导引页面,可以使用多种工具制作,最常见的莫过于flash,当然,用VB,VC之类的工具也没问题,只要能正常运行就OK啦。autorun.inf用来告诉系统自动运行,使用记事本即可编辑,文件的内容类似于:“[AutoRun] OPEN=autorun.exe”。
不过,今天找到了个好工具,AutoPlay Media
Studio,专门用来制作光盘自动播放的工具,大大节省了时间,否则的话,估计晚饭都没得吃啦

我用的AutoPlay Media
Studio版本是6.0,在
雨林木风这个论坛上有汉化版
下载。软件的使用很简单,和VB差不多,并且有比较丰富的素材库,制作过程中可以通过预览查看效果,完成后,发布到硬盘,再用UltraISO打包成ISO文件,进行刻录即可。
下图是点击光盘后弹出来的界面:
为了让使用者在使用过程中不至于太过单调,偶还加了几个经典的钢琴曲做背景音乐哦~这里可以下载我做的测试文件:
show.iso,使用deamon插入虚拟光盘,就可以看到效果啦~
Tags: AutoPlay Media Studio, 光盘, 本科评估, 雨林木风

3日,加入了VuFind Tech mail
list。个人认为,这是一个比较有前景的开源项目,代码规范,文档齐全,虽然VuFind在SourceForge还没什么人气,但在图书馆界却已经引起了极大的关注,并带动了数个项目的开源。尤为重要的是,他们的思路,和我的想法不谋而合——那就是不再依赖LIS,另谋出路,同时,他们选择的数据引擎SOLR,正是我想多加利用的开源程序之一。
5日,收到Andrew的回复,对于在美国之外有人关注VuFind,他们感到意外和惊喜——看来,他们对中国2.0的发展还不太了解,这需要国内同行多往国外期刊投文章,介绍偶们的实践才行。现在VuFind刚刚完成了翻译系统,已经向国际化迈出了实质性的一步。我加入VuFind Tech,可能会参与到文档翻译和中文版本的相关开发中。
最大的压力源于要做的事情太多,而我更希望能专心的投入做某件事情。Library2.0书稿一拖再拖,目前还有“自己开发一个tag系统”这一小节没完成,都已经不好意思跟万二和其他师友说抱歉了,只有这两天再努力一把,把初稿完成,再和大家一起完善,然后,把精力放到OPAC和网站的改造中去了。
好友现在已经是数据库部门的小主管,主持部门的工作,开始负责了人员招聘和培训,同时也坦言压力很大,担心人际关系过于复杂,担心被fire,呵呵,我说做好本职工作就是了。外面有外面的精彩,图书馆有图书馆的天地,大家都在为理想而努力。
Tags: OPAC, VuFind
友情敬告:开放是出路,服务是前途!
这两天本想继续写Ajax,回应一下
K师的博文和清心的提问,但下午碰到了件事情,之后偶不得不将之前所写的“Millennium系统OPAC整合”系列文章做出一些改动——主要是将一些被某些人视之为神圣的东西,应要求供奉起来。
但说实话,神圣么,偶不觉得,不过《国产007》的司令说了:即使是一张厕纸,也要好好对待的。因此,偶应要求去掉或改写了相关内容:如相关屏幕截图(即使是偶们馆的哦)、相关参数内容及其他。如果有朋友需要进一步交流,请先联系他们,取得授权,否则偶们只能偷偷摸摸的哦~特此公告,嘿嘿~
在
整合之三:构建自己的WebBridge一文中,原本思路是采用系统开放的参数,来提交到第三方服务器,从而实现相关功能。那么,如果系统没有这些参数,或者说偶觉得这些参数过于恶心,不用,还能不能实现我们想要的功能呢?
能!
这就是Ajax。
Ajax伟大的地方 在于其所带来的Web
应用客户端化,在于其提供的异步交互颠覆了传统的“提交/等待/
重新显示” 模式。
那么对于整合之三一文,偶在这里提出一个更好的解决方案,该方案,具有更广泛的应用价值,也就是说,本方案已经不再局限于Mllnnm系统了。
第一节:得到参数
让我们回头看看整合之三一文中所隐藏掉的东西,那是告诉我们如何获取参数的一段话。我们在那里,绕来绕去得到了一个检索词,和一个ISBN号,从而实现参数的提交。
现在我觉得这种方式很笨,我决定,通过Ajax来取得我想要的东西——最正规的方式是通过Javascript脚本将当前用户浏览器的DOM文档分解,使用getElementsByTagName()逐一分析并得出任意页面上的值。
当然,也有些捷径。
一般来说,大部分OPAC系统的参数提交,都是通过GET方式进行——我们可以通过看看浏览器的地址栏上是否带有一串很长的参数得出判断。这一串地址,我们要得到它,可以通过window.location.href、window.location.search等等方式获取。获取这串URL之后,我们可以发现,该URL里面包含了许多丰富的信息,我们所需要做的只是进行简单的文本分析。
比如,通过关键词检索得出《thinking in java》一书的书目详细信息页面Url是:
(该URL不需授权吧?有点怕怕呢……)
将多余的信息去掉,我们可以得出:
SUBKEY=thinking%20in%20java
这其实就是用户提交的关键字。
除了URL,我们还可以用FORM,像在Millennium系统的书目信息页面,仍然提供了检索框,方便用户进行进一步检索,对于该检索框的值,我们可以通过document.form.searcharg.value语句来获取,当然,这是不正规的写法,正规写法是:doucument.getElementsByTagName(”searcharg”).getAttribute(”value”)。
如果说URL和FORM中没有我们想要的值,如本例子中的ISBN号,那么我们只有老老实实的分析DOM,并找出
ISNB号所在的单元格,再通过innerHTML()属性获取相关值。
而上面这一切,都只是通过一段脚本,在用户浏览器上执行的。
那么得到了参数之后,接下来就要和服务器通讯了。
第二节:异步通讯
用户在继续他的操作,而浏览器已经在不打扰用户的情况下,跟我们的服务器通讯了。
这就是XMLHttpRequest对象。
XMLHttpRequest对象可以通过脚本创建,并且可以给服务器发送HTTP请求,当然,毫无疑问的它能接收服务器的反馈。我们通过以下语句创建一个XMLHttpRequest对象:
xRequest=new
XMLHttpRequest();//创建对象,实际上要复杂一些
同时,我们通过onreadystatechange定义它的回调函数,然后将相关参数传送至服务器。
xRequest.onreadystatechange=onReadyState;//定义回调函数
xRequest.open(HttpMethod,url,true);//打开http访问
xReqeust.send(params);//传送相关参数
而在在服务器端,我们接收用户提交的参数,并执行数据库操作,完成后,将相关信息反馈回客户端浏览器。反馈数据的形式可以是txt、html、甚至是JavaScript数组等。
第三节:更新页面的某一部分
客户端浏览器通过侦听回调函数,确定服务器处理完请求后,就可以通过createElement()等方法来实现文档的修改,把相关反馈信息,更新到当前文档即可。代码…..略……
以上三节内容,已经给我们揭示了一个很好的方向,对于一些封闭的WEB应用,我们可以通过Ajax,实现很多原本不可实现的事情。大家一起发挥想象吧~
总结:
呵呵,写着写着,就变成写Ajax了,其实Ajax是非常有用的工具,随着用户“我的地盘我做主”的吼声越来越多,相关技术肯定会不断涌现。保守,只能被淘汰。软件不是什么值钱的东西,服务才是。
Tags: Ajax, millennium, OPAC, 开放
1、请先下载FCKeditor及其JAVA插件:
2、将FCKeditor_2.4.2.zip解压至网站目录,并删除多余的文件(如_sample、_source、asp、php等)。
3、解压FCKeditor.java_2.3.zip。
a、将FCKeditor-2.3\web\WEB-INF\lib文件夹下的commons-fileupload.jar、FCKeditor-2.3.jar两个文件拷贝至网站WEB-INF\lib文件夹下;
b、将FCKeditor-2.3\src文件夹下的FCKeditor.tld文件拷贝至网站WEB-INF文件夹下;
c、将\web\WEB-INF文件夹下的web.xml相关内容拷贝至网站WEB-INF文件夹下的web.xml文件中(resin为例)。
4、引用方式:
<FCK:editor id=”EditorDefault”
basePath=”/FCKeditor/” height=”600″
imageBrowserURL=”/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/jsp/connector”
linkBrowserURL=”/FCKeditor/editor/filemanager/browser/default/browser.html?Connector=connectors/jsp/connector”
flashBrowserURL=”/FCKeditor/editor/filemanager/browser/default/browser.html?Type=Flash&Connector=connectors/jsp/connector”
imageUploadURL=”/FCKeditor/editor/filemanager/upload/simpleuploader?Type=Image”
linkUploadURL=”/FCKeditor/editor/filemanager/upload/simpleuploader?Type=File”
flashUploadURL=”/FCKeditor/editor/filemanager/upload/simpleuploader?Type=Flash”>
</FCK:editor>
Tags: FCKeditor, java, jsp
因为无知,所以进步,只有努力,才能专业——以此自勉。
对于近乎封闭的OPAC系统来说,AJAX是把利剑。为什么这么说呢?
OPAC系统失败之处:
1、绝大部分基于自有web解析服务器,web页面程序不开放,无法进行数据层面的操作和修改;
2、绝大部分基于封闭的数据库,用户无法直接访问数据库取到相关记录;
3、几乎没有支持用户开发需求的第三方接口。
AJAX的锋利之处:
1、运行在客户端浏览器上,与OPAC平台无关。只要能在OPAC页面中嵌入相关脚本,即可实现相关功能;
2、可以通过DOM操作,获取用户当前页面上的所有信息——包括书名、ISBN号、索书号等等;
3、可以在不影响用户操作的前提下,通过xmlhttprequest对象,向某一服务器发送请求,并得到反馈数据;
4、可以通过DOM操作,无刷新改变当前页面的结构与内容。
由上面的对比,可以看到,要做OPAC资源整合,AJAX是绝妙的武器。那么操作AJAX的基础是不是很简单呢?
是的,下面是一些最基本的操作方式,但这些基本的操作方式,已经足以让我们完成80%的工作。
首先,假设有这么一个理想的页面:
sample.html
<html>
<head>
<title>Ajax in
action</title>
</head>
<body>
<table width=”200″
border=”1″>
<tr>
<td>书名:</td>
<!–此处定义了td标签的id–>
<td
id=”t”>Ajax in Action</td>
</tr>
</table>
</body>
</html> |
那么我们要嵌入脚本,是很容易的事情,我们可以把脚本直接写到里面,也可以通过外接脚本文件的形式嵌入,例如,在</head>标签之上加上一行:
<script
type=”text/javascript”
src=”ajax_sample.js”></script>
二、页面信息的读取:
脚本是AJAX的核心,只有通过脚本,才能实现AJAX的操作。
我们现在要实现ajax_sample.js对sample.html页面信息的读取,确切的说,是要得到该页面上的书名。
ajax_sample.js:
window.onload=function() //当网页加载后运行脚本
{
//通过id获取当前文档的书名单元格对象
var
objTitle=document.getElementById(’t');
//输出对象内容
alert(objTitle.innerHTML);
} |
通过document.getElementById()方法,我们分别获取了sample.html网页中的书名单元格对象,并通过innerHTML属性得到了具体的值——“Ajax
in
Action”——这样,我们初步实现了文档内容的分析操作。
当然,sample.html具有一定的理想性——结构清晰、具有id属性——目前OPAC系统里面,我相信大部分页面的HTML是极其恶心、惨不忍睹的,但是这并不能阻挡AJAX的步伐,除了getElementById()方法,我们还可以通过getElementsByTagName()来实现节点的搜索。
三、发送请求到服务器:
好了,我们顺利的分析了文档的内容,那么在这里首先问大家一下:分析用户文档的意义何在?
意义在于,我们要知道读者正在浏览的信息,比如是哪一本书,这样我们才能针对读者的行为给他们更多的惊喜。
在本例中,得到了书名之后,我们就可以通过xmlhttprequest对象,将书名传送到专门的服务器,由服务器去实现更多的功能。
ajax_sample.js:
window.onload=function() //当网页加载后运行脚本
{
//通过id获取当前文档的书名单元格对象
var
objTitle=document.getElementById(’t');
//输出对象内容
//alert(objTitle.innerHTML);
//与服务器通讯
sendRequest(”[服务器处理程序的URL]“,”t=”+objTitle.innerHTML);
}
function
CreateXmlHttpRequest()//创建XmlHttpRequest对象
{
var xRequest=null;//定义
if(window.XMLHttpReqeust)//支持XMLHttpReqeust对象
{
xRequest=new XMLHttpRequest();
}
else if(typeof ActiveXobject !=”undefined”)//支持ActiveX对象
{
xRequest=new
ActiveXobject(”Microsoft.XMLHTTP”);
}
return xRequest;//返回
}
function
sendRequest(url,params)//发送请求函数
{
HttpMethod=”GET”;//传送方式
var
sRequest=CreateXmlHttpRequest();//创建实例
if(sRequest)
{
sRequest.open(HttpMethod,url,true);//打开http访问
sReqeust.send(params);//传送相关参数
}
} |
四、服务器的反馈程序:
通过上面的步骤,已经实现了客户端将数据传送到服务器,这时,服务器可以做的事情很多了,比如,检索一下有没有电子图书,并向用户返回相关信息。
ajaxsample.java
|
//yuanxinz.2007.05.09
package ajaxsample;
import java.io.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.servlet.*;
import java.servlet.http.*;
public class ajaxsample extends
HttpServlet
{
public void init(ServletConfig config) throws
ServletException
{
//…..
}
protected void doGet(HttpServletRequest
request,HttpServletResponse response) throws
ServletException,IOException
{
String s =
request.getParameter(”s”);//获取参数
//执行电子图书数据库检索
……
rs = pool.getRs(”select * from
表 where 题名 like ‘%”+s+”%’);
try{
if(rs.next())
{
rs.previous();
//将结果输出为文本
PrintWriter
out = response.getWriter();
response.setContentType(”text/plain;charset=gb2312″);
response.setHeader(”Cache-Control”,
“no-cache”);
response.setHeader(”Pragma”,
“no-cache”);
String
outstr=”";
int
i = 0;
while(rs.next())
{
outstr
= outstr + rs.getString(”题名”) + “|” + rs.getString(”url”) +
“\n”;
i++;
}
out.println(outstr);
out.close();
}
else
{
response.setStatus(HttpServletResponse.SC_NO_CONTENT);
}
//关闭数据库连接之类的….
…….
}
catch(SQLException e)
{
e.printStackTrace();
}
}
} |
上面的servlet在接到用户请求后,将进行相关检索,并返回一个文本:
Ajax in Action|http://******
……
Ajax in action
**|http://*****
AJAX可以返回多种类型的数据,包括html、XML文档和javascript脚本等等。
五、接收反馈数据,并修改当前文档:
现在一切又回到了用户浏览器,首先,我们要通过定义回调处理函数,来确定服务器已经将相关的数据返回。
ajax_sample.js:
window.onload=function() //当网页加载后运行脚本
{
//通过id获取当前文档的书名单元格对象
var
objTitle=document.getElementById(’t');
//输出对象内容
//alert(objTitle.innerHTML);
//与服务器通讯
sendRequest(”[服务器处理程序的URL]“,”t=”+objTitle.innerHTML);
}
function
CreateXmlHttpRequest()//创建XmlHttpRequest对象
{
var
xRequest=null;//定义
if(window.XMLHttpReqeust)//支持XMLHttpReqeust对象
{
xRequest=new XMLHttpRequest();
}
else if(typeof
ActiveXobject !=”undefined”)//支持ActiveX对象
{
xRequest=new
ActiveXobject(”Microsoft.XMLHTTP”);
}
return
xRequest;//返回
}
function
sendRequest(url,params)//发送请求函数
{
HttpMethod=”POST”;//传送方式
var
sRequest=CreateXmlHttpRequest();//创建实例
if(sRequest)
{
//这里调用回调
sRequest.onreadystatechange=onReadyState;
sRequest.open(HttpMethod,url,true);//打开http访问
sReqeust.send(params);//传送相关参数
}
}
function
onReadyState()
{
var redy=sRequest.readyState;//获取sRequest实例的状态
var data=null;
if(ready=4)//完成状态
{
data=xRequest.responseText;
}
else
{
data=”正在读取相关数据….”
}
} |
用户浏览器收到服务器反馈的文本后,就可以通过createElement()等方法来实现文档的修改。
ajax_sample.js:
window.onload=function() //当网页加载后运行脚本
{
//通过id获取当前文档的书名单元格对象
var
objTitle=document.getElementById(’t');
//输出对象内容
//alert(objTitle.innerHTML);
//与服务器通讯
var
empty=document.getElementById(’empty’);//定义一个空节点
sendRequest(”[服务器处理程序的URL]“,”t=”+objTitle.innerHTML);
}
function
CreateXmlHttpRequest()//创建XmlHttpRequest对象
{
var
xRequest=null;//定义
if(window.XMLHttpReqeust)//支持XMLHttpReqeust对象
{
xRequest=new XMLHttpRequest();
}
else if(typeof
ActiveXobject !=”undefined”)//支持ActiveX对象
{
xRequest=new
ActiveXobject(”Microsoft.XMLHTTP”);
}
return
xRequest;//返回
}
function
sendRequest(url,params)//发送请求函数
{ |
Tags: Ajax, millennium, OPAC