不指定 类别: 娱乐 » 视频 | felix021 @ 2010-8-6 13:34 | 评论(0) | 阅读(64)

人人分享 | 娱乐 » 视频 | 引用(0) |
不指定 类别: 电脑 » 其他 | felix021 @ 2010-8-6 09:49 | 评论(6) | 阅读(171)
不知道有多少人注意过标题这句话。其实完整版是:
引用
这是felix021的恶作剧,提醒您IE6很不安全。欢迎光临: http://www.felix021.com

在vista时代,用过IE7,臃肿、缓慢,让我完全没有好感。相反,XP的IE6足够简洁快速,因此即使IE7和IE8都发布了,我都还坚持使用IE6。当然我知道它很不安全,但是真正促使我抛弃IE6的导火索,是它对剪贴板完全没有限制,任何一个网站,都可以轻易地获取/设置你的剪贴板的内容。IE7/IE8也提供这个功能,不过会提示用户是否授权;Chrome/Firefox浏览器则默认禁止此功能。

从那以后我几乎再没用过IE6,同时也想看看这个个不安全特性能做到什么地步,因此写了一个脚本放在博客里头。刚开始的时候这个脚本是很邪恶的,它会随机从十个来访者中抽取一个来访者,将其剪贴板的内容读取并保存在服务器上。过了几天,的确收集到了不少东西(没有密码=。=),但是想想觉得不太厚道,损RP,于是改了改,变成现在这样,每当IE6用户来访,其剪贴板内容都会被替换成前述内容。

然后我几乎就忘了这件事情了,如果不是每个一段时间都有人来我的某个博文留言,内容就是这句话。我想,大概是某个人的剪贴板里有用的内容被我替换了,心里不爽过来烦我吧。刚开始没怎么理会,后来发得多了,见到一条删一条。再后来,心里就琢磨了,不对啊,至于给这么多人留下心理阴影么?

在不久前的某一天,顿悟:原来是那些家伙,用IE6来发广告了。然后再没犹豫过,见一条,删一条。

本以为就这么结束了,但是一次偶然,发现了更囧的情况:这句话不仅仅出现在我的博客上,还出现在其他人的博客,以及与某些博文内容有关的论坛里头……当场就在风中凌乱了…………

这句话,该改了……

点击在新窗口中浏览此图片
人人分享 | 电脑 » 其他 | 引用(0) |
不指定 类别: 电脑 » 软件 | felix021 @ 2010-8-4 23:55 | 评论(0) | 阅读(72)
参考 http://hi.baidu.com/oscarbj/blog/item/43931bfbd4de3c66034f56b6.html

修改~/.subversion/config

diff-cmd = vimdiff_for_svn

下面是代码:
#!/usr/bin/python
import sys, os
diffprogram = '/usr/bin/vimdiff'
fn_old = sys.argv[6]
fn_working_copy = sys.argv[7]
# arrange the args in the order diffprogram expects them
args = ['mydiff', '-d', fn_old, fn_working_copy]
os.execv(diffprogram, args)

人人分享 | 电脑 » 软件 | 引用(0) |
不指定 类别: 杂文-未分类 | felix021 @ 2010-8-3 23:30 | 评论(1) | 阅读(99)
“虽然在改革开放和经济工作方面做了一些有益的工作,但是在指导思想上和实际工作中也有明显失误。”

可怜的老人啊,虽然你已经去世多年,但是你的是非功过,仍然这样不公平地被大部分人如此评判。哪怕只是把前半句的量词稍微加强,哪怕是只把后半句删掉不作评论。可是在这个反历史的地方,现实就是这么残酷无情。

p.s. 你相信吗?china.com.cn的网站logo和SUN的“一样”:http://www.china.com.cn/favicon.ico
人人分享 | 杂文-未分类 | 引用(0) |
不指定 类别: 电脑 » 软件 | felix021 @ 2010-8-3 20:53 | 评论(2) | 阅读(90)
svn的diff很好用,但是还不够好用,因为不像vim,可以很直观地看到两个文件的区别。Google了一下,发现一个还不错的解决方案( http://erik.thauvin.net/blog/news.jsp?date=2006-02-14 ),代码在这里: http://vc.thauvin.net/svn/linux/svndiff/svndiff.sh?view=markup ,但是有点小BUG。我FIX了一下,然后增加了一个小feature,允许在命令行后面跟上 "-r REV" 来指定与最新版本比较的版本号。代码如下:
#!/bin/sh

# svndiff -- svn diff with vimdiff.
#
# Written by Erik C. Thauvin (erik@thauvin.net)
# May 11, 2006
#
# Copyright (C) 2006 Erik C. Thauvin. All rights reserved.
#
# This software is provided "as is" without express or implied warranties.
#
# Permission is granted to use, copy, modify and distribute this software,
# provided this disclaimer and copyright are preserved on all copies. This
# software may not, however, be sold or distributed for profit, or included
# with other software which is sold or distributed for profit, without the
# permission of the author.
#
# $Id$
#
# Modified by felix021 (felix021@gmail.com)
# Aug 3, 2010

PROGNAME=`basename $0`

if [ $# -lt 1 ]; then
    echo "Usage: $PROGNAME <file> [-r REV]"
    exit;
fi

filename=$1
pid=$$
TEMP=/tmp/tmp.$pid.$filename
pv=

if [ $# -gt 3 -a $2 = "-r" ]; then
    pv="-r $3"
fi
svn cat $filename $pv > $TEMP
vimdiff $TEMP $filename
rm -f $TEMP

@p.s. 2010.8.4  昨天给Erik发了封邮件,今天发现他已经把我的修改更新进去了:D
人人分享 | 电脑 » 软件 | 引用(0) |
不指定 类别: 电脑 » 程序设计 | felix021 @ 2010-7-29 00:50 | 评论(0) | 阅读(72)
1. 下载gdi+的sdk,安装。当然,可以简化一点,从这里[ http://download.csdn.net/down/1645798/huohuo1120 ]下载gdiplus所需文件包,解压并导入到vc6(将include和lib目录加入vc6的配置中)

2. 在VC6中创建一个Win32 Application,选择“一个简单的Win32程序”。假设项目名是main

3. 在StdAfx.h中加入
#include <winbase.h>
#define UNICODE
#include <comdef.h>
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#include <GdiPlus.h>
using namespace Gdiplus;
#endif

4. 在main.cpp的WinMain前面生命全局的两个GDI变量
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR          gdiplusToken;

5. 在程序退出之前的地方加上
GdiplusShutdown(gdiplusToken);

6. 画图

6.1 创建一个Bitmap对象
Bitmap *pBitmap = new Bitmap(width, height, PixelFormat24bppRGB);

6.2 从Bitmap中获取Graphics对象
Graphics *g = Graphics::FromImage(pBitmap);

6.3 使用各种东西的组合来搞g,比如Pen, Brush, Region, Rect, PointF, Font……
Pen pen_black(Color(255, 0, 0, 0), 3);
g->DrawLine(&pen_black, 0, 0, 100, 100);
更具体的说明和各种例子可以在这里找到:GDI+ SDK参考(翻译版本) http://download.csdn.net/source/642128

7. 保存文件,这个比较麻烦
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
  UINT num= 0, size= 0;

  ImageCodecInfo* pImageCodecInfo= NULL;
  GetImageEncodersSize(&num, &size);
  if(size== 0)
    return -1;
  pImageCodecInfo= (ImageCodecInfo*)(malloc(size));
  if(pImageCodecInfo== NULL)
    return -1;

  GetImageEncoders(num, size, pImageCodecInfo);
  for(UINT j=0; j< num; ++j)
  {
    if(wcscmp(pImageCodecInfo[j].MimeType, format)== 0)
    {
      *pClsid= pImageCodecInfo[j].Clsid;
      free(pImageCodecInfo);
      return j;
    }
  }
  free(pImageCodecInfo);
  return -1;
}

......

CLSID encoder;
GetEncoderClsid(L"image/png", &encoder); // L"image/jpeg", ...
pb->Save(L"result.png", &encoder, NULL);

人人分享 | 电脑 » 程序设计 | 引用(0) |
不指定 类别: 电脑 » 操作系统 | felix021 @ 2010-7-27 22:50 | 评论(1) | 阅读(94)
在ISO C规范中有有一个很诡异的东西,那就是传说中的errno,一个有左值的int。当库函数出错的时候,它很可能会被设置为非0值;且没有任何一个库函数或系统调用会把它置为0。

刚接触到errno,可能会认为这是个在errno.h中用
int errno;
定义的整型。但是一旦开始写多线程的程序,再看到errno的时候,就会抑郁了。如果两个线程调用库函数都出错,那errno怎么办...?

幸而,ISO C并没有规定,errno必须是一个int,如果看errno的manpage (man errno) 会看到:
引用
errno may be a macro.  errno is thread-local; setting it in one thread does not affect its value in any other thread.
实际上GNU的glibc也就是这么实现的,(通常)在/usr/include/bits/errno.h里头:
#define errno (*__errno_location ())

于是errno就是个有左值的int了。至于这个__errno_location,在glibc的源码的 csu/errno-loc.c 里头:
int *
#if ! USE___THREAD
weak_const_function
#endif
__errno_location (void)                                                                                                                                     
{
  return &errno;
}

而这里的真正的errno,在 csu/errno.c 里头:
__thread int errno;

由于包含的都是errno.h,所以对于用户程序而言,可见的只有errno.h中的"errno",实际上是(*(__errno_location()),而__errno_location()返回的是errno.c中的errno的地址。可真绕啊。可是偏偏又不能把 __thread int errno; 放在errno.h中,为什么呢?其实原因很简单也很复杂——C语言真是个纠结的语言。

最后,解释一下“__thread”修饰符:__thread defines number to be a thread local variable. 定义thread-local的变量。详情参见Thread-local_storage的wiki页:http://en.wikipedia.org/wiki/Thread-local_storage
人人分享 | 电脑 » 操作系统 | 引用(0) |
分页: 4/233 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]