Jul 17

    换主机前我还需要考虑很多问题,比如新的空间不支持AspUpload,上传图片时不能方便地获取图片大小。可能风声的UploadClass是用得最多的无组件上传类,但它往往不能读到正确的图片尺寸。昨天研究了一下JPEG图片的文件格式,发现获取图片的尺寸并没有想像中的复杂。我开始查看风声无组件上传类的源码,后来发现是它判断图片格式时JPEG文件头判断不太符合标准。本来想自己动手改一下的,突然想到大家现在都用的2.0版,人家会不会已经出了新版本了。网上一查,果然在官方主页上找到了V2.11版。这个网页现在好像上不去了,我是用Google Cache进去的。但Google又不会Cache下载对象,其它地方也很少见到下载,我找了N久才找到了一份(现在访问又正常了)。V2.11的文件大小为10999字节,反正也不大,我放一份在我的空间里给需要的人下载。试用了一下觉得不错,各种格式的图片的长和宽都能读出来。
http://www.matrix67.com/data/UploadClass.rar

    今天重庆特大暴雨灾害,整天雷雨不断。大家去网上找找那些壮观景象吧,非常牛叉。

Jul 3

昨天在digg上看到了一个交互式小游戏,觉得很有意思,于是自己也写了一个,花了一个上午的时间。

http://www.matrix67.com/guessword/guess.asp
有bug的话请报告一下。

2007.07.08 想加入聊天、留言等功能,但如何排版是一个问题

Jun 24

    不知道大家的PJBlog是否有这个问题:如果某篇日志较短,日志预览内容没有被切割(和原日志相同)时,首页日志预览内容底下仍然要跟一个“查看更多”链接,而按道理说此时是不应该出现这个链接的。我一直以为PJBlog不能判断日志预览内容和全文内容是否一样,直到今天我突然发现首页上的最近几篇日志居然没有出现“查看更多”链接。经过实验,发现只要有空格、引号等特殊字符出现时,PJBlog总会认为日志预览和全文不相同。查看PJBlog的源代码,发现问题果然出现在CheckStr函数上。这不知是舜子的疏忽还是有什么其它的原因(耗资源?)。
    打开class目录下的cls_logAction.asp,查找下面这一行:
if log_View("log_Intro")<>HtmlEncode(log_View("log_Content")) then
    改成:
if UnCheckStr(log_View("log_Intro"))<>HtmlEncode(UnCheckStr(log_View("log_Content"))) then

    打开class目录下的cls_default.asp,查找下面这一行:
<%if webLogArr(10,PageCount)<>HtmlEncode(webLogArr(11,PageCount)) then%>
    改成:
<%if UnCheckStr(webLogArr(10,PageCount))<>HtmlEncode(UnCheckStr(webLogArr(11,PageCount))) then%>

    再次回到PJBlog首页,“查看更多”链接就正常了。当然,如果你的日志是静态的,别忘了到后台初始化一次。目前我是用的静态日志输出,UBB编辑器,按行自动分隔,修改之后一切正常。

Matrix67原创,转贴请注明出处

Jun 9

    近来可能有人需要这个,我在这里简单说一下。

    我没有找到好的同学录服务提供商,基本上都是些又打广告又骗钱的地方,并且缺乏web 2.0的基本元素。相比之下,可能有的同学会选择自己架设私人单班同学录,这样感觉更自由一些。很可惜,我也没有找到比较好的asp同学录源码,不见任何web 2.0不说,代码奇丑无比。最终我选择了才阿ASP同学录v5.3免费版,因为关键字“asp同学录”在搜索引擎里排第一的就是它。
    虽然代码非常丑,但使用起来没有发现任何后台上的问题。一个比较麻烦的前台问题是,部分页面不支持FireFox。下面是一些需要修改的地方,修改之后该asp程序基本上就可以在FireFox上使用了。

    首先是论坛显示页面严重错误。用FireFox浏览这里你会发现论坛页面的排版惨不忍睹。原因出在代码的表格宽度上,你需要改动两个文件共四处位置。删掉voteview.asp的323行和441行的width="100%",再删掉talkview.asp的318行和366行的width="100%",FireFox浏览就正常了。
    还有,部分页面的提交按钮无效。这是因为FireFox不允许JavaScript再次定义function window.onload()。一个解决方法是把函数内容放在<body onload="">里。这个问题涉及四个文件,分别是reg_fill.asp、umod.asp、talkpub.asp和talkvote.asp。删掉这四个文件中的window.onload函数,前两个文件中的<body>改成<body onload="facesel();">,后两个文件中的<body>改成<body onload="showfj();">。至此,除了无鼠标悬停效果(影响不大)外,FireFox基本上可以浏览了。

    另外,这个asp程序的安全问题很严重,建议大家更改数据库位置(同时需要修改in_conn_db.asp文件)。更好的办法是把数据库后缀名改为.asp并插入一个防下载表。网上相关的教程很多,这里不具体说了。
    最后,可能你不希望来一大帮蜘蛛把你们班的私人信息抓个遍。写一个robots.txt是个不错的方法。

    2007.06.11 发现并修复一个新问题:和PJBlog发生冲突(也有可能与其它同一空间的asp程序发生冲突)。具体表现为时间显示混乱,日和月数字对调。这个问题产生的原因是PJBlog定义了Session.LCID,而这个同学录没有,因此访问了同一域名下的Blog后再回到同学录就出错了。解决方法是更改同学录的in_conn.asp文件,在Session.CodePage=936下面加上Session.LCID=2052。

    以后若发现还有其它问题我将在这里更新。

Matrix67原创
转贴请注明出处

Apr 27

What is it?
    最近大家喜欢在留言板发一些与本站无关的话题并互相引用回复,这说明一个论坛模块是有必要的,于是想到了开发讨论区模块。
    这个单版面讨论区用于访问本站的网友进行讨论和聊天。它和留言板的功能有很大的区别。比如,下面8条消息中,前4条应该发到留言板,后4条应该发到讨论区。
    1. 这个Blog太他妈的牛了
    2. 为什么我要用代理才能上你的网?
    3. 建议把验证码换成3位乘法并加入平方和阶乘运算
    4. 申请友链www.8rong8chi.com,logo可以在www.3gedaibiao.com里找到
    5. 问一下Matrix67的情书那道题
    6. 记者MM的PP到手,请登陆www.colorwolf.com查看。
    7. 跪求Sky Angel Vol.39 - Vol.41和Tokyo Hot n0204
    8. matrix哥哥你好,我是一个可爱的初三MM,我好想跟你聊天啊,+我QQ:xxxxxxxx

    另外,针对某篇日志的留言直接在日志下面写评论就可以了。

History:
    23号的日志里我曾经说过我要写一个PJBlog的单版面论坛模块。实际的工作是从昨天开始的。
    昨天一起床我就开始研究PJBlog的数据库和函数,经过两天两夜的奋战终于写出了一个大致成形的程序。目前这个模块属于VERY Beta版,只用了两个asp文件,里面有很多问题。数据库结构的合理性有待观察,因此数据有可能会重建从而导致数据丢失。目前论坛界面非常简陋,你进去看了别被吓到就是了。任何一个牛人也有菜的时候,如果以后我开发了什么大型web 2.0,我不会忘记今天我写的这个终极菜鸟程序。

Features:
    这个单版面论坛的程序特点就是没有任何特点,除了发帖回贴外这个论坛程序目前不支持任何其它的操作(如头像、签名、高亮、置顶、PM、积分、附件、交易等),并且以后也不打算支持。毕竟这是一个个人Blog的模块而已。
    这个单版面论坛的管理方式就是不进行任何管理。不删除任何帖子,不分版限制话题,用户无需注册即可发言。仅仅是一个大家随意交流的地方。各位在其它论坛发的水贴老被删的话可以到这里来(想不通OIBH为什么不开水区)。请大家自觉远离色情,远离政治。

TODO List:
    加入分页功能
    加入管理员的管理功能
    加入自动清除陈贴的功能
    将浏览方式改为纯Ajax
    一些简单的界面美化
    修复大家提出的Bug
    可能加入其它一些大家提出的有创意的构想

有Bug请报告一下。

Apr 19

很早就跟别人说我想搞Ajax,今天终于修成正果,实现了首页asp程序Ajax化。Ajax太他妈的牛了。
目前在我这里运行良好,有Bug的话报告一下。
目前已知问题:不支持Opera。目前还不知道是为什么,期待哪位高人给本菜鸟指点一下。现在Opera也可以了,原因出在cache上。

Apr 19

    常去mimima(已封,因此该asp程序不支持), 2kdown, pidown等种子host网站的同志都知道,这类站点有一个非常麻烦的地方就是不支持FireFox,点击Download后不能下载,而是出现一整页的乱码。上这种站点又怕有毒,开IE Tab开得胆战心惊的。今天搞烦了,决定把这个问题解决了。初步认为,错误原因应该是那边的php返回的Content-Type不对。然后,网上搜索半天解决方案都没有,于是想到自己写一个GreaseMonkey脚本,后来写来写去发现怎么也不行,又想搞FireFox扩展。最后突然想到办法,为什么不用asp把那边的数据用XMLhttp偷过来并转化成正确的Content-Type?于是,我的又一个asp小程序诞生了。
    这是一个测试版,可能有很多Bug,大家可以帮忙报告一下。这个asp程序在我这里还没出问题,至少上面提到的两个网站是完全可以的,我今天已经用了好几次了。注意,有一些其它的BT种子上传站点,虽然界面非常相似,但代码不一样(比如onlyff.com),它们是支持FireFox的,同时因为Post方式不一样,该asp程序不支持。

点击这里进入

需要测试一下么?你可以把下面的地址复制到输入框里然后点击Download。
http://www.pidown.com/link.php?ref=M70vw7SS8o
严重NSFW,别因为好奇真下了点开来看。我?我是满了18岁的了,下个月就19了。

    回过来想一下,JavaScript也可以XMLhttp,但是我不知道怎样用JS生成一个二进制文件。我想至少出于安全方面的考虑,这是不大可能的。

2007.04.22  pidown和2kdown也被封了,本asp程序彻底作废,关了。

Mar 24

Update: 现在已经不用PJBlog了,文章中的很多链接已经失效。需要什么帮助请直接联系我。

  
1. 去掉UBB斜体标签

    经常在Blog发布代码的同志会发现斜体标签[i]很恶心,一旦你代码里的某个数组遇上了循环变量,原本整齐的代码就会歪掉一大半。考虑到反正平时不太需要斜体,估计一定有人会像我一样想去掉这个UBB标签。
    去掉它要改两个地方。在common\ubbcode.asp中去掉下面这两行
re.Pattern="\[i\]([^\r]*?)\[\/i\]"
strContent=re.Replace(strContent,"<i>$1</i>")

    还有一个地方要修改,就是common\function.asp中的自动闭合UBB那一段。你需要去掉function closeUBB(strContent)函数中arrTags数组里的"i"。也就是说,找到
arrTags=array("code","quote","list","color","align","font","size","b","i","u","html")
    并替换成
arrTags=array("code","quote","list","color","align","font","size","b","u","html")
    如果不做这一个操作的话,你会发现有多余的[/i]出现。


2. Blog顶部调用Twitter最近三条信息

    最近Twitter确实是火了一把,估计有人需要下面这段代码。为了加快Blog载入速度(Twitter慢死了),我将把JavaScript放在footer中调用。
    添加一个模块并且设为内容栏置顶,代码如下(红色部分需要自己修改):
<div style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px; TEXT-ALIGN: left; OVERFLOW:hidden; WHITE-SPACE:nowrap;" >
WHAT AM I DOING NOW by <a href="http://twitter.com/matrix67" target="_blank">twitter.com</a><br/>
<span id="stat0"></span>, <span id="stat0_time"></span> |
<span id="stat1"></span>, <span id="stat1_time"></span> |
<span id="stat2"></span>, <span id="stat2_time"></span>
</div>

    然后在footer.asp中添加如下代码:
<script type="text/javascript" src="http://www.twitter.com/t/status/user_timeline/1758881?count=3&named_obj"></script>
<script type="text/javascript"><!--
document.getElementById('stat0').innerHTML = Twitter.posts[0].text;
document.getElementById('stat0_time').innerHTML = Twitter.posts[0].relative_created_at;
document.getElementById('stat1').innerHTML = Twitter.posts[1].text;
document.getElementById('stat1_time').innerHTML = Twitter.posts[1].relative_created_at;
document.getElementById('stat2').innerHTML = Twitter.posts[2].text;
document.getElementById('stat2_time').innerHTML = Twitter.posts[2].relative_created_at;
--></script>

    这样的效果是两行文字,第二行不换行,让它超出边界不管(我觉得这样好看些)。Twitter太慢了,我玩了一天就不玩了,因此不给demo了,这里只贴个效果图:




3. PJBlog自带的一种悬停提示框特效

    header中有一段被注释掉了的js文件引用。把header.asp中的
<!--<script type="text/javascript" src="common/nicetitle.js"></script>-->
    改成
<script type="text/javascript" src="common/nicetitle.js"></script>
    然后你就能看到效果了。控制提示框样式的css在皮肤文件的typography.css中的div.nicetitle一段,你可以参考我所修改的样式(改为灰色背景)。
/*提示框CSS*/
   div.nicetitle {
    position: absolute;
    padding: 4px !important;
    padding: 6px 4px 4px 4px;
    top: 0;
    left: 0;
    font-family:Tahoma, Verdana;
    font-size: 12px;
    width: 15em;
    background: #CCCCCC;
    color: #222222;
    border: 1px solid #888888;
    text-align: left;
}



4. 把PJBlog的验证码改为算式验证码(两位加法)

    我研究这个研究了半天,把GetCode.asp改过去改过来调了半天终于搞出来了,效果见我的登陆界面matrix67.com/blog/login.asp。在分析BMP文件格式时头疼死了,后来才知道每一行输出像素必须是4的倍数(即使图象宽度不是4的倍数,不足的话要用0填空补足)。
    下载下面这个rar文件,解压缩后替换common\GetCode.asp文件。
点击下载此文件
    这样改后,图片宽度增加了,很多地方无法对齐,于是在common\function.asp中需要把
Function getcode()
    getcode= "<img src=""common/getcode.asp"" alt="""" style=""margin-right:40px;""/>"        
End Function

    改为
Function getcode()
    getcode= "<img src=""common/getcode.asp"" alt="""" style=""margin-right:8px;""/>"    
End Function

    这样才能和用户名、密码的输入框对齐。

    你可能还需要在文件内容中搜索所有出现过的“验证码:”并改为“算一算:”。
    昨天发现改了验证码后居然还有垃圾留言,没想通是为什么。



5. 让你的PJBlog支持语法高亮

    不同于网上流行的那个JS,我使用的是这个JS,它要简单一些(只有一个JS文件),而且使用也非常简单(自动查找HTML的<code>标签)。它仅仅是对语法进行高亮,并没有显示行号和折叠等功能。但同时它只对代码颜色进行修改,更加整洁,兼容PJBlog本身的代码显示效果。这里是我的一个效果演示(Pascal代码高亮)。
    你可以在这里下载这个JS脚本的最新版本。这个文件里还带有一份该脚本详细的使用说明。它可以支持的语言我列在了下面,脚本文件总共37KB,因此你可能需要从中删除一些语言支持。至于怎么删除部分语言,你看了那个JS源码后就知道了。

  • Python
  • Ruby
  • Perl
  • PHP
  • HTML
  • CSS
  • Javascript
  • VBScript
  • Delphi
  • Java
  • C++


    这个JS存在一个问题,它的某个定义与PJBlog重复了,前者的comment类是指的注释,而后者的comment是指的评论。你需要把JS文件中所有的'comment'替换为'comments'避免冲突(替换操作时要包括引号,因为我们只替换各个字符串定义)。
    我另外写了一个Pascal的关键字列表,比Delphi的关键字多一些,更适合Pascal语言。你可以把它加在JS文件里,需要的同学可以参考一下(顺便展示JS代码的高亮效果):
var PASCAL_KEYWORDS = {'abs': 1,'addr': 1,'and': 1,'ansichar': 1,'ansistring': 1,'array': 1,'as': 1,'asm': 1,'begin': 1,'boolean': 1,'byte': 1,'cardinal': 1,'case': 1,'char': 1,'class': 1,'comp': 1,'const': 1,'constructor': 1,'currency': 1,'destructor': 1,'div': 1,'do': 1,'double': 1,'downto': 1,'else': 1,'end': 1,'except': 1,'exports': 1,'extended': 1,'false': 1,'file': 1,'finalization': 1,'finally': 1,'for': 1,'function': 1,'goto': 1,'if': 1,'implementation': 1,'in': 1,'inherited': 1,'int64': 1,'initialization': 1,'integer': 1,'interface': 1,'is': 1,'label': 1,'library': 1,'longint': 1,'longword': 1,'mod': 1,'nil': 1,'not': 1,'object': 1,'of': 1,'on': 1,'or': 1,'packed': 1,'pansichar': 1,'pansistring': 1,'pchar': 1,'pcurrency': 1,'pdatetime': 1,'pextended': 1,'pint64': 1,'pointer': 1,'private': 1,'procedure': 1,'program': 1,'property': 1,'pshortstring': 1,'pstring': 1,'pvariant': 1,'pwidechar': 1,'pwidestring': 1,'protected': 1,'public': 1,'published': 1,'raise': 1,'real': 1,'real48': 1,'record': 1,'repeat': 1,'set': 1,'shl': 1,'shortint': 1,'shortstring': 1,'shr': 1,'single': 1,'smallint': 1,'string': 1,'then': 1,'threadvar': 1,'to': 1,'true': 1,'type': 1,'unit': 1,'until': 1,'uses': 1,'val': 1,'var': 1,'varirnt': 1,'while': 1,'widechar': 1,'widestring': 1,'with': 1,'word': 1,'write': 1,'writeln': 1,'xor': 1,'assign': 1,'reset': 1,'rewrite': 1,'exit': 1,'halt': 1,'break': 1,'read': 1,'readln': 1,'new': 1,'length': 1,'append': 1,'close': 1};

LANGUAGES.pascal = {
  defaultMode: {
    lexems: [IDENT_RE],
    illegal: '("|\\$[G-Zg-z]|\\/\\*|</)',
    contains: ['comments', 'string', 'number', 'function', 'class'],
    keywords: PASCAL_KEYWORDS
  },
  case_insensitive: true,
  modes: [
    {
      className: 'comments',
      begin: '{', end: '}'
    },
    {
      className: 'comments',
      begin: '\\(\\*', end: '\\*\\)',
      relevance: 10
    },
    C_LINE_COMMENT_MODE,
    {
      className: 'number',
      begin: NUMBER_RE, end: '^',
      relevance: 0
    },
    {
      className: 'string',
      begin: '\'', end: '\'',
      contains: ['quote'],
      relevance: 0
    },
    {
      className: 'quote',
      begin: '\'\'', end: '^'
    },
    {
      className: 'function',
      begin: 'function', end: '[:;]',
      lexems: [IDENT_RE],
      keywords: {'function': 1},
      contains: ['title', 'params', 'comments'],
      relevance: 0
    },
    {
      className: 'function',
      begin: '(procedure|constructor|destructor)', end: ';',
      lexems: [IDENT_RE],
      keywords: {'constructor': 1, 'destructor': 1, 'procedure': 1},
      contains: ['title', 'params', 'comments'],
      relevance: 10
    },
    {
      className: 'title',
      begin: IDENT_RE, end: '^'
    },
    {
      className: 'params',
      begin: '\\(', end: '\\)',
      lexems: [IDENT_RE],
      keywords: PASCAL_KEYWORDS,
      contains: ['string']
    }
  ]
};//pascal, written by matrix67.com


    下面这个压缩包里的css文件定义了各种类型的高亮颜色。各种颜色具体的值是我自己定的,你不喜欢可以修改一下以符合你的界面风格。
点击下载此文件

    现在你需要把这个highlight.css文件连同前面的highlight.js文件保存在common目录下。然后在common\ubbcode.asp中找到
re.Pattern="\[quote\](.*?)\[\/quote\]"
    在它上面加入以下代码:
re.Pattern="\[code=(.[^\]]*)\](.*?)\[\/code\]"
strContent= re.Replace(strContent,"<div class=""UBBPanel""><div class=""UBBTitle""><img src=""images/quote.gif"" style=""margin:0px 2px -3px 0px"" alt=""程序代码""/> 程序代码</div><div class=""UBBContent""><pre><code class=""$1"">$2</code></pre></div></div>")

    然后在header.asp中找到
<link rel="stylesheet" rev="stylesheet" href="skins/<%=Skins%>/UBB/editor.css" type="text/css" media="all" /><!--UBB编辑器代码-->
    在其下面加入这一行代码:
<link rel="stylesheet" rev="stylesheet" href="common/highlight.css" type="text/css" media="all" />
    最后在footer.asp中加入以下代码:
<script type="text/javascript" src="common/highlight.js"></script>
<script type="text/javascript">
   initHighlightingOnLoad();
</script>


    以后你就可以通过使用形如[ code=delphi] TheOneILove:=SexyMM [ /code]的UBB标签来高亮各种语言的代码。
    目前已知的问题:由于这个脚本需要用<pre>,而用了<pre>后将导致无法换行,因此你可能会想为这个UBB框单独设一个css强制换行。我最讨厌换行的问题了,IE和FireFox总是不能兼顾,后来干脆把overflow设成hidden,两边看上去都顺眼,超了右边界的就让它去吧。


6. 让你的TagsCloud看起来更明显,更大

    看看我的标签云,你会发现虽然每个标签的文章也不多,但大小同样很明显。更改tag.asp可以让你的Tags在日志数不多的情况下大小对比同样强烈。
    在tag.asp中找到
<%
  function getTagSize(c)
   dim i
   for i=1 to 10
    if int(c)<i*2.5 then
        getTagSize=12+i
        exit function
    end if
   next
   getTagSize=22
  end function
%>

    改成
<%
  function getTagSize(c)
   dim i
   for i=1 to 20
    if int(c)<i*1.5 then
        getTagSize=12+i
        exit function
    end if
   next
   getTagSize=34
  end function
%>

    说明一下,改了之后的意思为,标签大小共有20个等级,从12px起,每多1.5篇文章字体就大一号,有1.5 x 20=30篇文章时字号达到12+20=32,如果文章数超过30了标签字体大小都是34px。你可以自己改这几个数字直到满意位置。
    字体变大后会引起一个问题:标签过于挤了一些,行与行之间的空隙窄得难以忍受。你可能会想为标签云单独设一个css。还是tag.asp文件,你需要把
<div class="Content-body">
    改成
<div class="Content-tagscloud">
    并把你的皮肤文件夹内layout.css文件中对Content-body的定义复制一份,修改line-height属性并重命名为Content-tagscloud。参考我的改法(不同的皮肤具体的内容不同)。

    我所用的皮肤中相关的定义如下:
  /*---日志内容框--*/
  .Content-body{margin:8px 2px 2px 8px;overflow:hidden;text-align:left;width:98%;line-height: 160%;background-image: url();background-repeat: repeat-y;background-position: right;color: #292929;}

    在它下面添加一段代码,整个内容变成这样:
  /*---日志内容框--*/
  .Content-body{margin:8px 2px 2px 8px;overflow:hidden;text-align:left;width:98%;line-height: 160%; background-image: url();background-repeat: repeat-y;background-position: right;color: #292929;}
  .Content-tagscloud{margin:8px 2px 2px 8px;overflow:hidden; text-align:left;width:98%; line-height: 35px;background-image: url();background-repeat: repeat-y; background-position: right;color: #292929;}

    这样,标签云的行距就拉开了。


发现Bug或者有任何问题请在下面报告一下。

Matrix67原创
转贴请注明出处。