想在Visual Studio 2008中编辑PHP文件, 可以这样添加着色, 使得PHP关键字高亮显示.

效果:

php.jpg

1. 注册表操作

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Languages\FileExtensions下添加一个键, 名字为”.php”, 值为”{B2F072B0-ABC1-11D0-9D62-00C04FD9DFD9}”

2. 添加文件

在C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE下添加一个名为”usertype.dat”的文件, 内容为:

and
or
xor
__FILE__
exception
__LINE__
array
as
break
case
class
const
continue
declare
default
die
do
echo
else
elseif
empty
enddeclare
endfor
endforeach
endif
endswitch
endwhile
eval
exit
extends
for
foreach
function
global
if
include
include_once
isset
list
new
print
require
require_once
return
static
switch
unset
use
var
while
__FUNCTION__
__CLASS__
__METHOD__
final
php_user_filter
interface
implements
extends
public
private
protected
abstract
clone
try
catch
throw
cfunction
old_function
this

注册表中添加如下键:

HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\<9.0>\Text Editor下(你的版本可能不是9.0, 选择你自己的版本)添加字符串值, 命名为”Guides”, 值为: RGB(128,128,128) 4

也可以用这样的值: RGB(128,128,128) 4,8,12,16之类的, 最多可以添加13条参考线. 4,8什么的含义是在第四字符, 第十二字符处画线.

效果如下:

guides.jpg

难得发一个硬件文章. 暑假内部优惠的时候买的Microsoft Wireless Notebook Laser Mouse 6000最近有点不听使唤, 间歇性地出现不灵敏的情况, 就是断断续续的, 移动不连续, 点多次才会激发一次有效单击之类的. 一开始以为是电池没电了, 结果换了好几个电池都是一样的效果. 不过有时候就没事. 今天终于找到原因…
无线鼠标有两种, 一种通过蓝牙, 另一种通过红外波. 当然, 如果附近有红外线干扰源就肯定会干扰信号的发送和接收… 我发现我的无线鼠标接收器附近有一个温度较高的IBM笔记本的电源变压器, 这个东西工作一段时间温度高了, 难免会产生各种波长的红外线, 干扰无线鼠标接收器工作. ^_^
解决方法就是拿走高温物体, 世界从此灵敏起来啦.

C#控制台程序还是很常用的, 尤其是开发Server程序的时候, 对于Server出现的各种提示信息使用不同颜色输出, 对用户将是一个很好的提示. 比如错误使用红色输出, 警告使用黄色输出, 而绿色则表示正常等等. 下面是我实现的一个简单的带颜色控制台类.

ColorConsole.cs:
[code=’c#’]
public enum Color
{
Black = 0x00000000,
DarkBlue = 0x00000001,
DarkGreen = 0x00000002,
DarkCyan = 0x00000003,
DarkRed = 0x00000004,
DarkPink = 0x00000005,
DarkYellow = 0x00000006,
DarkWhite = 0x00000007,
Gray = 0x00000008,
Blue = 0x00000009,
Green = 0x000000A,
Cyan = 0x0000000B,
Red = 0x0000000C,
Pink = 0x0000000D,
Yellow = 0x0000000E,
White = 0x0000000F
}

class ColorConsole
{
private int hConsoleHandle;
private COORD ConsoleOutputLocation;
private CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;
private int OriginalColors;

private const int STD_OUTPUT_HANDLE = -11;

[DllImport(“kernel32.dll”, EntryPoint = “GetStdHandle”, SetLastError = true,
CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
private static extern int GetStdHandle(int nStdHandle);

[DllImport(“kernel32.dll”, EntryPoint = “GetConsoleScreenBufferInfo”,
SetLastError = true, CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
private static extern int GetConsoleScreenBufferInfo(int hConsoleOutput,
ref CONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo);

[DllImport(“kernel32.dll”, EntryPoint = “SetConsoleTextAttribute”,
SetLastError = true, CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
private static extern int SetConsoleTextAttribute(int hConsoleOutput, int wAttributes);

[StructLayout(LayoutKind.Sequential)]
private struct COORD
{
short X;
short Y;
}

[StructLayout(LayoutKind.Sequential)]
private struct SMALL_RECT
{
short Left;
short Top;
short Right;
short Bottom;
}

[StructLayout(LayoutKind.Sequential)]
private struct CONSOLE_SCREEN_BUFFER_INFO
{
public COORD dwSize;
public COORD dwCursorPosition;
public int wAttributes;
public SMALL_RECT srWindow;
public COORD dwMaximumWindowSize;
}

// Constructor.
public ColorConsole()
{
ConsoleInfo = new CONSOLE_SCREEN_BUFFER_INFO();
ConsoleOutputLocation = new COORD();
hConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsoleHandle, ref ConsoleInfo);
OriginalColors = ConsoleInfo.wAttributes;
}

public void TextColor(Color color)
{
SetConsoleTextAttribute(hConsoleHandle, (int)color);
}

public void TextColor(Color textColor, Color backColor)
{
SetConsoleTextAttribute(hConsoleHandle, (int)textColor + (int)backColor * 16);
}

public void ResetColor()
{
SetConsoleTextAttribute(hConsoleHandle, OriginalColors);
}
}
[/code]

TestCase:
[code=’c#’]
class Program
{
static void Main(string[] args)
{
ColorConsole cc = new ColorConsole();
cc.TextColor(Color.Red, Color.Gray);
Console.WriteLine(“Server Stopped.”);
}
}
[/code]

参考资料:

[Microsoft Support] 如何通过使用 VisualC # 更改前景颜色和背景颜色控制台窗口中的文本:
http://support.microsoft.com/kb/319883/zh-cn

时代不同了, 内存越来越大. 4GB内存对于服务器来说不算什么. 可是32bit的系统最大支持的内存寻址空间2^32 = 4GB. 因此, 为了支持大于4GB的部分, 需要寻找另外的方法. 最简单的方法就是使用64bit的系统. 这个很简单, 不在这里讨论了.
首先, BIOS里面必须开启large memery support. 不同BIOS不同, 总之要设置好使得开机Tab的时候能够看到所有内out存.
Linux要使用PAE内核. 安装方法如下:

yum install kernel-PAE

自动安装结束之后, 修改下启动设置:

vi /boot/grub/grub.conf

看到这里:

default=1
time=1
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.22.9-61.fc6)
root (hd0,0)
kernel /vmlinuz-2.6.22.9-61.fc6 ro root=LABEL=/1 rhgb quiet
initrd /initrd-2.6.22.9-61.fc6.img
title Fedora Core (2.6.22.9-61.fc6PAE)
root (hd0,0)
kernel /vmlinuz-2.6.22.9-61.fc6PAE ro root=LABEL=/1 rhgb quiet
initrd /initrd-2.6.22.9-61.fc6PAE.img
title Fedora Core (2.6.20-1.2952.fc6)
root (hd0,0)
kernel /vmlinuz-2.6.20-1.2952.fc6 ro root=LABEL=/1 rhgb quiet
initrd /initrd-2.6.20-1.2952.fc6.img

title计数从零开始, 看到加粗标注的PAE, 这里的序号是1, 因此把default设置为1. 另外, 服务器而言可以顺便把timeout改成1, 这样可以使得系统在重启的时候少等几秒钟, 反正在机房嘛.

12月份原来在炎黄的服务器空间就要过期了, 想了想是不是继续续费的问题, 最终决定还是搬到同济网服务器吧. 毕竟是一个经常关心的服务器, 几乎每天都来维护, 放在自己手里毕竟还是放心一点. 无奈同济网服务器上的MySQL字符集还是老的3.25版本的latin1字符集, MySQL的版本也过低, wordpress装不上. 更新字符集的问题老早就提出来了, 只是这个过程实在太复杂, 一直没实施. 其实这其中的每个细节我都仔细想过, 只是没有操作出来而已. 不过即便如此, 今天在真正操作的时候心里也是没底的.

起了个大早, 6点半就开始在Linux主机上工作, 一直做到下午, 一共转了近1000万行SQL数据, 把字符集成功转换成了gbk. 功在当代利在千秋的事情. 从此我们的服务器用上了最新版本的MySQL, Apache和PHP.

如何做的呢? 说下大概过程吧. MySQL的文档里讲推荐逐步升级, 3.x要先升级到4.0, 然后4.1, 然后5.0. 我觉得没必要, 另外4.0这样的老版本根本找不到下载了, 这个文档写的太XX了. 首先在MySQL 3.x里用mysqldump把数据导成SQL文件, 按照数据库导出, 大型数据库要注意对导出后的文件进行分割, 用如下命令:

split -l 100000 filename

进行按行分割, 我们的BBS分成了8个100万行的文件. 这样操作的原因是一旦出错, 修改的时候打开起来方便, 不至于每次打开一个3GB的大文件. 然后升级MySQL到5.0, 建数据库, 整理选成gbk_chinese_ci, 然后在每个将要导入的文件开头加上:

set names 'gbk';

然后用如下命令导入:

mysql -uroot -ppassword --default-character-set=gbk -f target_db < source.sql

这样的话, 就会在phpMyAdmin里面正确看到我们的母语. 别告诉我你不行. 我行你就行, 不然对不起孔子, 也对不起王选.