解决软件界面乱码问题

早上刚到公司启动电脑,发现大多数软件运行时界面会出现乱码,而昨天下班时还是一切正常。

检查电脑的使用记录,昨晚有其他同事在这台电脑上访问 PPTV 观看视频。

搜索解决办法,基本上都是提到“区域和语言选项”,具体操作:

控制面板->区域和语言选项->高级->非 Unicode 程序的语言,选择“中文(中国)”,确认,重新启动电脑。

但是我按此操作之后并没能解决问题,恰好又搜索到《PPTV网络电视界面乱码解决方法》一文,尝试重置“Internet 选项”–“高级”设置,问题解决。

帝国CMS无限级栏目导航

最近利用帝国CMS(ECMS)制作一个网站,遇到以树形目录的方式显示三级栏目列表的需求,但是纵观帝国CMS本身提供的各种标签,也只能满足二级栏目列表的需求。搜索了很久,也没有找到满意的解决方案,咨询王猛(帝国CMS开发人),他给出了两种实现的思路,一种是以模板的方式手动制作,另外一种是自己编写递归函数。鉴于网站最终是交由第三方使用,第一种方式不适合,遂考虑函数——自定义标签。

其实细心的用户应该可以发现帝国CMS本身已经实现了无限级栏目菜单——当我们进入信息管理,左边展示的栏目导航便是无限级的。该菜单对应的文件是e/admin/listEnews.php,其中的函数ShowClass_ListNews便是我们需要寻找的目标。将这个函数修改一下,得到如下函数:

function user_ListCats($bclassid, $showMore) {
	global $empire, $dbtbpre;

	//	classpath 为地址
	$sql=$empire->query("select classid, classname, bclassid, islast, classpath, classurl from {$dbtbpre}enewsclass where bclassid='$bclassid' and wburl='' order by myorder,classid");

	//	判断是否有类别记录
	$num=$empire->num1($sql);
	if ($num == 0 && $bclassid == 0)//无记录
	{
		echo $GLOBALS['notrecordword'];
		return "";
	}
	if ($num == 0)
	{
		return '';
	}

	echo '<ul>';

	$i = 1;
	while ($r=$empire->fetch($sql))
	{
		//	如果不是终极栏目,显示其子目录
		if(empty($r[islast]) && $showMore)
		{
			echo '<li class="moredeep"><a href="' . $r[classpath] . '">' . $r[classname] . '</a>';

			user_ListCats($r[classid], $showMore);
		} else {
			echo '<li><a href="' . $r[classpath] . '">' . $r[classname] . '</a>';
		}

		echo '</li>';

		$i += 1;
    }

	echo '</ul>';
}

将这段代码加入到e/class/userfun.php,然后我们就可以自定义自己的标签了。例如我自定义为ulistcats,调用语法[ulistcats]栏目ID,显示更多栏目[/ulistcats]。两个参数,分别代表最上级栏目 ID 和是否显示多级栏目。其中第二个参数设置为 0 ,则只显示指定栏目下的一级子栏目,如果为 1 ,就为无限级子栏目。

我个人对 PHP 和帝国CMS 都还不熟悉,只是尝试解决问题,上面的代码难免有不完善之处,欢迎大家提出意见和建议。

相应,一个三级栏目导航的例子,请浏览

Discuz! 7.2 之 与 UCenter 通信失败

之前安装的论坛,突然出现用户不能登录的状况,进入 UCenter 查看应用,发现“通信失败”。检查应用的设置,并没有任何变更出现。网上搜索了一些相关的文章,基本上都集中在“应用的 IP”和“通信密钥”这些部分。所以我对问题的排查也围绕这些方面展开。

首先便排除了“通信密钥”错误的可能,然后尝试更换默认“应用的 IP”(127.0.0.1)为域名绑定 IP,但是还是“通信失败”,最终只能从代码入手,一步步查找问题出现的位置。

最终问题定位在/uc_server/model/misc.php中的如下代码:

$fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);

在提供了 IP 的情况下,我们在浏览器中直接输入 IP 无法浏览到网页,所以$fp也不能获得“预期”的结果。

解决办法,就是修改上面的代码为:

$fp = @fsockopen($host, $port, $errno, $errstr, $timeout);

当然,如果通过修改服务器的设置能使得127.0.0.1或者外网 IP 可以浏览到内容,也可以解决问题。目前我还没有找到如何进行这方面的设置,暂且记录在此。

更新 2011.07.08

今天折腾服务器,发现在网站属性中,指定了 IP 地址,将之清除,选择“全部未分配”,问题解决。所以看来,一开始就走了弯路,在添加网站时画蛇添足的行为导致问题出现。

参考文章

UCenter 通信失败 和 无法同步登陆的调试方法
[UCenter] 地狱之旅

CSS 选择器之属性选择器

CSS:Attribute selectors

[att]
具有 att 属性的元素,不考虑属性值。例如

img[alt] {}
<img src="..." alt="..." />
<img src="..." />

匹配第一个 IMG 元素,但是不匹配第二个 IMG 元素。

[att=val]
具有 att 属性,且属性值恰为 val 的元素。例如

a[rel="external"] {}
<a href="" rel="external">...</a>
<a href="...">...</a>
<a href="..." rel="internal">...</a>

匹配第一个 A 元素,但是不匹配第二个和第三个 A 元素。

[att~=val]
具有 att 属性,该属性值由空格分隔的多个词组成(也可以仅有一个词),其中恰好有一个词为 val 的元素。例如

div[class~="item"] {}
<div class="item">...</div>
<div class="current-item item">...</div>
<div class="page">...</div>
<div class="current-item page">...</div>

匹配第一个和第二个 DIV 元素,但是不匹配第三个和第四个 DIV 元素。

[att|=val]
具有 att 属性,且属性值恰好为 val 或是以 val 开头并紧跟连字符 - 的元素。例如

a[hreflang|="zh"] {}
<a href="..." hreflang="zh">...</a>
<a href="..." hreflang="zh-CN">...</a>
<a href="..." hreflang="en zh">...</a>
<a href="..." hreflang="en zh-CN">...</a>

匹配第一个和第二个 A 元素,但是不匹配第三个和第四个 A 元素。

[att^=val]
具有 att 属性,且属性值以 val 开头的元素。例如

a[href^="http://fengyouyi.com"] {}
<a href="http://fengyouyi.com">Home</a>
<a href="http://fengyouyi.com/about">About</a>
<a href="/about">About</a>
<a href="http://www.chinahtml.com/">ChinaHTML</a>

匹配第一个和第二个 A 元素,但是不匹配第三个和第四个 A 元素。

[att$=val]
具有 att 属性,且属性值以 val 结尾的元素。例如

a[href$=".html"] {}
<a href="/about.html">About</a>
<a href="/about.htm">About</a>

匹配第一个 A 元素,但是不匹配第二个 A 元素。

[att*=val]
具有 att 属性,且属性值中包含有 val 子字符串的元素。例如

div[class*="item"] {}
<div class="item">...</div>
<div class="currentitem">...</div>
<div class="page">...</div>

匹配第一个和第二个 DIV 元素,但是不匹配第三个 DIV 元素。

Discuz! 7.2 之 无法登录后台和 UCenter

今天安装了 Discuz! 7.2,使用过程中出现后台无法登录的现象,Google 之,得知原因来访 IP 变更导致。修改 config.inc.php,将$admincp['checkip'] = 0;的参数修改为“1”即可。

随后发现又无法登入 UCenter ,再 Google 之,等到解决方法如下:

根据目录找到文件: UCenter 的 model/base.php

查找:$this->onlineip = $match[0] ? $match[0] : 'unknown';,在这代码之后插入一段代码:

//COOKIE <=> onlineIP : 2010-09-25 NurQut.com
$isonlineIP = isset($_COOKIE['onlineipd']) && !empty($_COOKIE['onlineipd']);

if($isonlineIP) {
    $this->onlineip = $_COOKIE['onlineipd'];
} else {
    setcookie("onlineipd", $this->onlineip, time()+3600, "/");
}

unset($isonlineIP);

保存后上传覆盖问题就解决了。

参考:Discuz和Ucenter后台不能登陆解决方

在线 JavaScript 格式化工具

很多网站为了减小文件体积,将 JavaScript 代码进行压缩,去掉了换行、缩进等格式。当我们想要研究学习这些代码的时候,阅读起来就非常困难。而很多编辑器(如 Dreamweaver)本身可以格式化 HTML 代码,但是并不能格式化 JavaScript 代码,这里找了几个网址,提供在线格式化 JavaScript 代码的功能。

1. Online javascript beautifier

很不错的在线格式化工具,格式化后的代码可以直接使用。该工具全部代码已提供下载本地演示)。另外该网站还有一些相应工具或者浏览器扩展的资源链接。

2. JsDecoder – javascript decoder – decode obfuscated script

可以实现代码格式化(缩进、换行)、代码修正(确实的分号、括号)、代码高亮等。下载 | 本地演示

折腾啊折腾

折腾来折腾去,又重新唤回了 WordPress 。先前的“诸多”内容,也不想让它们显示了。

在折腾新皮,简简单单的。因为是一片荒芜的小角落,所以也不期待有多少人会注意到,IE6 ,就被我非常无能地无视了。

刚才听同事在念叨:“每当我找到了成功的钥匙,就有人把锁给换了。”

奠,“五·一二”!

(更多…)

如何计算 CSS 选择器的权重?

之前在编写 CSS 的时候,多次遇到类选择器“无效”(优先级不够)的情况,例如下面的 HTML 代码:

<div class="entry">
    <p>段落内容。
        <a class="links" href="http://fengyouyi.com">链接</a>
    </p>
</div>

对应 CSS 代码如下:

.entry a {
    color: red;
}
.links {
    color: blue;
}

一直以来都简单地按照先后顺序来理解,以为这里链接会呈现蓝色,事实不然。我所理解的先后顺序,只是样式表的层叠顺序。在具体执行时,还需要考虑到样式的权重(原文作 specificity,我个人理解为权重)。

参考官方 CSS2.1 文档中的《6.4.3 Calculating a selector’s specificity》部分,我们可以了解到权重计算遵循以下规则:

  • 如果是通过 ‘style’ 属性声明而不是通过选择器来声明的规则,算作 1,否则为 0 (a 位)(在 HTML 中,一个元素的“style”属性的值是一组样式规则。这些规则没有选择器,所以 a=1、b=0、c=0、d=0);
  • 计算选择器中的 ID 属性个数(b 位);
  • 计算选择器中的其它属性(选择器)和伪类个数(c 位);
  • 计算选择器中的元素名和伪元素个数(d 位)。

这个计算方法仅基于选择器的形式。需要特别说明的是,“[id=p33]”形式的选择器是算作属性选择器的(a=0, b=0, c=1, d=0),即使在源文档的 DTD 中 id 属性被定义为“ID”。

将四个数字串联成 a-b-c-d ,就可以获得选择器的权重了。

我们要如何理解这个呢?其实很简单。所有的选择器的权重都用 a-b-c-d 的形式表示,我们只要按照从 a 到 d 四个位置的数字,对应比较就可以得到权重顺序了。例如 1-0-0-0 的权重高于 0-2-1-2 ,因为在 a 位置,前者为 1 ,后者为 0 ,这样后面的就无须比较了。

更新

2009-10-21 23:38

看到 junp 在这里的评论,我才醒悟过来,他给我参考的那篇文章中那句“HTML标记的权重是 1,CLASS的权重是 10,ID的权重是 100,继承的权重为 0 ”,使我误以为作者将这几组值当作十进制来处理了。这里,如果按照 a-b-c-d 的形式,我们需要将其理解为“HTML标记的权重是 0-0-0-1,CLASS的权重是 0-0-1-0,ID的权重是 0-1-0-0,继承的权重为 0-0-0-0 ”。所以最底部的那部分更新内容,就当作加深了解的范例吧。

对原作者飘零雾雨表示歉意,同时也对 junp 表示由衷的感谢。

2009-10-21 14:22

站长资讯论坛上的 junp 给了我一篇网络上的文章,也是介绍这个的。但是看了作者计算权重的方法,好像是不正确的。因为按照他的方式,得到的最终权重值是 a*1000 + b*100 + c*10 + d 。这个是不正确的。我们可以构想一下,如果两个选择器,A 在 d 位上有 11 个元素名,例如 div div div div div div div div div div div ,而 B 在 c 位上只有 1 个属性选择器,例如 p[id="p33"] ,按照他的计算方式,A 的权重为 11 ,B 的权重为 10 。参考下面 HTML 和 CS 代码:

<div>
  <div>
    <div>
      <div>
        <div>
          <div>
            <div>
              <div>
                <div>
                  <div>
                    <div>
                      <p id="p33">看看文本显示的颜色</p>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>
div div div div div div div div div div div {
    color: red;
}
p[id="p33"] {
    color: blue;
}

结果是蓝色。

所以权重的计算,是按“位”比较,而不是十进制的。不过作者也提到了“按照从左到右的顺序逐位比较”,或许只是表述不清吧。

IE6、IE7 和 IE8 中的 CSS 兼容性速查表

来源:Visual Cheat Sheet: CSS Compatibility with Internet Explorer 6, 7 and 8(BlogSpot 被和谐,访问需要翻墙)

这份兼容性速查表对比了 Internet Explorer 6、7 和 8 中的 CSS2.1、CSS3 兼容情况。

GIF:第一页 第二页
PDF:第一页 第二页

本站:第一页 第二页

你可以用 A3 纸来打印上面的内容。

先前腾讯的 ISD Webteam 也发布了一份 CSS3 参考手册(中文版)本地备份),CHM 格式,大家也可以下载了备用。

假期结束

五天的假期很快便结束了。

一日生日,和两朋友一起吃饭;二日,参加同事婚宴;三日中秋,和两朋友买了一些熟食在住处喝酒。

其它的时间,基本上是在《指环王Online》中度过。因为带朋友升级,所以自己的角色到现在也没有达到 50 级。倒是放假前答应了某位朋友,说等《指环王Online》中的角色满级,便去《剑侠情缘网络版叁》中玩个角色,好以后可以一起玩,没能实现。抱歉!

CHF 这几日是没有去看的,今天看了一下,有平行线发的一篇帖子,是祝我生日快乐的,谢谢大家了。

回想起来,我好像并不是一个习惯去牵挂别人的人,所以每逢节日什么的,我都很少会记得对别人说什么祝福的话。