技术 / 设计
验证码生成
function uf_output_yzm()
{
header ("Content-type: image/png");
session_start();
$_SESSION['validate_code']=strtoupper(substr(md5(rand()),20,4));
$im = @imagecreate (80, 20)
or die ("Cannot Initialize new GD image stream");
$background_color = imagecolorallocate ($im, 200, 200, 200);
//设置干扰像素,防止被OCR
for ($i=0;$i<=128;$i++)
{
$point_color = imagecolorallocate ($im, rand(0,255), rand(0,255), rand(0,255));
imagesetpixel($im,rand(2,128),rand(2,38),$point_color);
}
//逐个画上验证码字符
for ($i=0;$i<=3;$i++)
{
$text_color = imagecolorallocate ($im, rand(0,255), rand(0,128), rand(0,255));
$x = 3 + $i * 20;
$y = rand(3,3);
imagechar ($im, 10, $x, $y, $_SESSION['validate_code']{$i}, $text_color);
}
//输出PNG图像
imagepng ($im);
imagedestroy ($im);
}
SEO
这个新的blog今天被百度和google收录了,虽然只有一两页。
刚刚把sitemap提交到了google,过几天看有没有什么效果。
同时也开始使用google analytics服务。
wordpress搬家
在bluehost租用了空间,把在my.donews的blog搬到了这个新的地址。
终于成为独立blogger了。
记录下几个功能的实现方法:
- Random Posts:使用“wordpress中文工具箱”。
- 订阅图标:使用feedsky生成的js代码即可。
- “永久链接”和“标题”:设置成搜索引擎友好的方式。参考这里。
- 翻页:使用pagenavi这个插件。
- 搜索的加强:使用search everything和search hilite。
- 添加文章到网摘:使用add bookmarks插件。
- 后台加速:no ping wait 和 kill preview,另外再为Dashboard减减肥。
- 引用留言:使用Quoter。
- sitemap页面:使用Dagon Design Sitemap Generator。
- Live Archives:使用Extended Live Archives,注意options中,wordpress的目录和URL要设置成一致。
- 标题SEO:使用SEO title tag 这个插件可以很容易的设定title格式。
- 数据备份:WordPress Database Backup
- 邮件乱码解决:Cube Mailer
- google服务:Google Analyticator和Google Sitemaps
- URL唯一:Permalink Redirect
未完待续。
Hoekey——让手指飞起来
如果让我选择装机必须要装的几个软件,那么hoekey绝对是其中之一。
配置说明:
^ = ctrl, _ = shift, @ = alt, ~ = win
- 设置:
=Rem|-- General --
^_Q=Config ; ctrl+shift+Q, 调出hoekey配置窗口
Config=Run|E:\tools\vim\vim70\gvim.exe %i||1 ; 用gVim作为默认的配置编辑器 - 窗口操作:
=Rem|-- Window --
~7=Apps
~8=UnHideAll
~9=UnHide
~0=Hide||1
~Y=Editify
~K=Kill - 启动应用程序:
=Rem|-- Programs --
^@C=Run|cmd.exe
^@Y=Run|sndvol32.exe
^@Q=Run|E:\Tools\qq\qq.exe - 输入简化命令运行程序(类似“运行”对话框,但只要输入简化的命令,而不必全路径):
^R=Input|运行:|||%u
=RunAlias|%u*cmd=Run|cmd.exe
*snd=Run|sndvol32.exe
*es=Run|E:\eclipse\eclipse.exe
*sr=Run|"E:\tools\sr\sr32.exe"
*cz=Run|"E:\tools\ConvertZ\ConvertZ.exe"
; 按ctrl + r, 在对话框中输入es,即可启动eclipse - Web搜索:
=Rem| --- WWW ---
^G=Run|http://www.google.com/search?q=%s ; ctrl + g , google 搜索
^I=Run|http://www.iciba.com/search?s=%s&lang=gb2312&Submit=%CB%D1+%CB%F7&t=word - 模拟鼠标操作:
^Z=Keys|\z7\k\d\d\r ; 在当前目录解压。该命令的意思是:右键菜单 =》按“7”(即跳到7zip的菜单项)=》下 =》 下 (即移动到“解压到当前目录”)=》回车。
^7=Keys|\z7\k\d\r
^E=Keys|\zv - 模拟键盘按键:
hoekey在模拟键盘时存在问题(v1.13),功能键在按下后不能弹起释放,可以配合VBS脚本来进行按键的模拟。
比如,以下脚本实现了用gVim编辑当前编辑窗口内的内容:set oShell = CreateObject("WScript.Shell")
oShell.SendKeys"^a"
oShell.SendKeys"^c"
oShell.SendKeys"^{Home}"
ReturnCode = oShell.run ("""E:\\tools\\Vim\\Vim70\\Gvim.exe"" +ClipBrd +only",0,True)
oShell.SendKeys"^a"
oShell.SendKeys"^v"
oShell.SendKeys"^{Home}"将该脚本存为runvim.vbs,然后在hoekey.ini中加入:
=Rem|-- Scripts --
^@V=Run|"E:\tools\script\runvim.vbs" ; ctrl + alt + v , 使用gVim编辑
GPL协议理解
mysql是少数几个采用双重授权的开源软件之一。因为对合适需要购买mysql的商业授权有很多疑问,所以上网搜寻了一些资料。对GPL的理解又深了一层。
- 我使用开源软件,组装了一个系统,并且将该系统卖给客户,我是否需要购买商业授权(如mysql)?是否需要将自己的代码也开源?
答:不需要。GPL的初衷是保障开源软件的长期发展,防止有些人将开源代码据为己有。是否需要购买商业授权,或者是否需要将自己的代码也开源的判断依据不是你是否用开源软件来进行盈利,而是你的软件是否是基于开源软件的“源代码”。如果你没有修改原开源软件的源代码,没有调用开源软件的库代码,没有和开源软件的源代码一起重新编译生成新的软件,那么你可以使用开源软件而且不需要购买商业授权或者将自己的代码开源。
- 基于LAMP开发的电子商务网站,是否需要开源?
答:如上所述,不需要。
- 如果我只是调用了基于GPL的软件库的API,我是否需要将自己的软件开源?
答:是需要开源的。如果你不想开源,那么可以使用基于LGPL的软件库(Linux下的软件库大多采用LGPL)。
理解GPL协议的要点是:
- GPL不但不反对你使用GPL的软件来盈利,相反,GPL鼓励你通过提供GPL软件相关的服务来获取商业利益。也就是说,你可以使用LAMP来预装服务器并卖钱。
- GPL所要求的开源只是对你的客户开源。比如,你修改了一个GPL的软件,并且将它卖钱,你必须保证购买该软件的客户可以得到该软件的源代码。同时,你的客户一旦购买你的软件,他就拥有GPL赋予的权力,也就是他可以将你修改好的该软件复制、出卖等,你无权干涉人家怎么处置该软件。
- 只是使用而没有修改、使用源代码或者调用API,那么你可以不开源。
补充中......
php代码片段[10-28]
// 文件上传表单
<form class="main_form" action="mag_mod.php" method="post" enctype="multipart/form-data">
<label for="mag_cover">封面:</label>
<input type="file" name="mag_cover" value="" /><br />
<input type="submit" name="submit" class="submitbutton" value="下一步" />
</form>
// 点击时要求确认
<a href="mag_mod.php?act=del&mag_no=<?=$row['mag_no']?>" onClick="return confirm('确定要删除该笔资料!?')">删除</a>
<input type="submit" name="submit" value="删除" onClick="return confirm('确定要删除该笔资料!?')">
// 遍历所有POST变量
$param = array_merge($_GET, $_POST);
if($_POST['submit_delete'])
{
while(list($key , $val) = each($param))
{
if(substr($key,0,6)=='chkno_')
{
if(!empty($strin))
$strin .= ",";
$strin .= $val;
}
}
if($strin)
{
$sql = "delete from member where member_no in ($strin)";
myquery($sql);
redirect("member_list.php", "删除成功!转向管理页面。");
}
else
redirect("member_list.php", "删除失败,请选中某项再删除!转向管理页面。");
}
// 表格行全选
<table>
<tr>
<th><input type="checkbox" name="checkall" onClick="javascript:CheckAll()" title="全选/取消"></th>
<th>标题</th>
</tr>
<tr>
<td><input type="checkbox" name="chksn_<?=$row['mag_no']?>"></td>
<td><?=$row['mag_title']?></td>
</tr>
</table>
function CheckAll()
{
for (var i=0;i<document.mag_list.elements.length;i++)
{
var e = document.mag_list.elements[i];
if ((e.name.substr(0,5)) == 'chksn'){
e.checked = document.mag_list.checkall.checked;
}
}
}
// 得到当前的url的完整地址
<?php
function getUrl(){
$url="http://".$_SERVER["HTTP_HOST"];
if(isset($_SERVER["REQUEST_URI"])){
$url.=$_SERVER["REQUEST_URI"];
}
else{
$url.=$_SERVER["PHP_SELF"];
if(!empty($_SERVER["QUERY_STRING"])){
$url.="?".$_SERVER["QUERY_STRING"];
}
}
return $url;
}
echo getUrl();
?>
js代码片段[10-28]
// 遍历表单, 并根据遍历结果重组URL
function page(url)
{
for (var i=0;i<document.setpreview.elements.length;i++)
{
var e = document.setpreview.elements[i];
if ((e.name.substr(0,5)) == 'chkno')
{
if(e.checked)
url = url + "&" + e.name + "=" + e.value;
}
}
window.location = url;
}
// 打开新窗口
function cover_browse()
{
var path = document.getElementById("mag_path");
var url = "cover_browse.php?input=mag_cover_path&path=" + path.value;
var popupWin = window.open(url, 'cover_browse', 'scrollbars=yes,width=600');
}
// 设定父窗口的某个输入域为特定内容
function set_cover(filename)
{
var input = opener.document.getElementById('<?=$_GET['input']?>');
input.value = filename;
window.close();
}
[Backup] 异步OnReceive()
char buf[10240];
ZeroMemory(buf, 10240);
char* pbuf = buf;
int nRead = Receive(buf, 10240);
if(nRead == 0)
Close();
if(nRead == SOCKET_ERROR)
{
if (GetLastError() != WSAEWOULDBLOCK)
Close();
else
return;
}
if(! m_bHeadReaded)
{
if(m_nReaded + nRead >= sizeof(Reply_head))
{
size_t to_copy = sizeof(Reply_head) - m_nReaded;
memcpy(&m_head + m_nReaded, buf, to_copy);
m_bHeadReaded = TRUE;
nRead -= to_copy;
pbuf = buf + to_copy;
m_nReaded = 0;
}
else
{
memcpy(&m_head + m_nReaded, buf, nRead);
m_nReaded += nRead;
return;
}
}
if(m_head.m_lSize = m_head.m_lSize)
{
memcpy(m_pData + m_nReaded, pbuf, m_head.m_lSize - m_nReaded);
m_bHeadReaded = FALSE;
m_nReaded = 0;
m_pData -= sizeof(Reply_head);
Notify(CEV_RECEIVE_DATA,(long)m_pData);
delete[] m_pData;
m_pData = NULL;
ZeroMemory(&m_head, sizeof(Reply_head));
}
else
{
memcpy(m_pData + m_nReaded, pbuf, nRead);
m_nReaded += nRead;
}
[VC & MFC] VC6项目设置
- General -> MFC:设置动态还是静态链接MFC。
- C/C++ -> Code ganeration -> Use runtime library:设置使用静态/动态、单线程/多线程版本的C运行库。stlport和boost都需要多线程的版本。
- C/C++ -> Preprocessor:设置编译选项和额外的包含文件的地方。如果想设置工程专用的头文件目录,就可以在这里修改。
- Link -> Object/Library modules:额外的库文件目录,如果想设置工程专用的库文件目录,就可以在这里修改。
[VC & MFC] 几点经验
- 使用第三方库,你所需要的是:1、头文件; 2、库文件;3、如果是动态连接的,dll文件需要在path路径内。所以,一般只要把第三方库头文件目录加入VC的include directory内,将库目录加入library directory。
- 在非MFC工程内使用CString:#include <afxext.h>即可。
- #pragma warning (disable: 4018) --- 忽略4018警告消息。
- 对话框中控件要使用中文,对话框的属性内必须选择中文。
- ImageList可以像Toolbar一样,使用一个位图文件来表示多个图标,只需要在Create的时候设定好大小,就可以使用从0开始的索引来引用图标。
- 不要使用CString作为函数的参数,用const TCHAR* 代替。



