2007-12-29

2007-12-03

Java2D 3 or more Colors gradient paint (use TexturePaint)

Java中的 GradientPaint 画刷好像仅仅只能支持2色渐变,下面我用动态生成纹理画刷的方式变相实现了一个简单的多色渐变的效果:

package test.draw;

import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.TexturePaint;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.font.FontRenderContext;
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;

import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * 彩虹纹理画刷
 *
 * @author h_Davy [dave3068 AT gmail DOT com]
 * @version 2007-11-28 上午02:09:46
 */
public class RainbowText extends JPanel
        implements Runnable, MouseListener {

    private static final long serialVersionUID = 1L;

    RainbowText() {
        super(true);
        init();
    }
    private void init() {
        setBackground(Color.white);
        setTextAttributes();
        //new Thread(this).start();
        addMouseListener(this);
    }


    private String text = "Rainbow Text";
    private Font f;
    private TextLayout tl;
    private AttributedCharacterIterator aci;
    //private FontMetrics fm;

    private void setTextAttributes() {
        f = new Font("serif",Font.BOLD,60);
        //fm = this.getFontMetrics(f);
        AttributedString as = new AttributedString(text);
        //as.addAttribute(TextAttribute.FONT, f, 0, text.length());
        AffineTransform at = new AffineTransform();
        //at.setToRotation(Math.toRadians(45));
        as.addAttribute(TextAttribute.FONT, f.deriveFont(at), 0, text.length());
        aci = as.getIterator();
        Color []c = new Color[]
            {Color.blue, Color.cyan, Color.green, Color.yellow,
                    Color.orange, Color.red, Color.magenta};
        float []w = new float[]
            {.09f, .15f, .16f, .17f, .15f, .16f};
        initTextImg(350, c, w, true);
    }




    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setStroke(new BasicStroke(2.f));

        // draw background
        g2.setColor(getBackground());
        g2.fillRect(0, 0, getWidth(), getHeight());
        g2.setColor(Color.blue);
        g2.drawRoundRect(5, 5, getWidth()-10, getHeight()-10, 10, 10);

        //
        g2.setStroke(new BasicStroke(1.5f));
        FontRenderContext frc = g2.getFontRenderContext();
        //tl = new TextLayout(text, f, frc);
        tl = new TextLayout(aci, frc);
        Rectangle2D rect = tl.getBounds();
        int x = getWidth()/2 - (int)rect.getWidth()/2,
            y = getHeight()/2 + (int)rect.getHeight()/2;
        g2.translate(x, y);
        //g2.rotate(Math.toRadians(-45));
        //g2.setColor(Color.yellow);
        //g2.fill(rect);
        g2.setPaint(new TexturePaint(bi, rect));
        g2.setComposite(AlphaComposite.SrcOver);
        //g2.rotate(Math.toRadians(30));
        tl.draw(g2, 0, 0);
        //AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .5f);
        //g2.setComposite(ac);
        W = (int)rect.getWidth();
        rect = new Rectangle2D.Float(X, 0, W, 1);
        g2.setPaint(new TexturePaint(bi, rect));
        R.setRect(-x+10, y, getWidth()-20, 20);
        g2.fillRect(R.x, 10, R.width, 20);
    }



    private boolean run = false;
    private int X = 0;
    private int W = 0;
    private static Rectangle R = new Rectangle();
    public void run() {
        try {
            while (run) {
                Thread.sleep(10);
                X+=1;
                if (X>=W) X = 0;
                //repaint();
                repaint(10, R.y+10, R.width, R.height);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public void mouseClicked(MouseEvent e) {
        run = !run;
        new Thread(this).start();
    }



    // 纹理
    private BufferedImage bi;
    /**
     * 初始化纹理
     *
     * @param width 纹理总宽度
     * @param c 颜色值数组
     * @param w 各色带宽度所占百分比(w.length=c.length-1)
     * @param cyclic 是否循环
     */
    private void initTextImg(int width, Color []c, float w[], boolean cyclic) {
        bi = new BufferedImage(width, 1, BufferedImage.TYPE_4BYTE_ABGR);
        int n = c.length;
        int m = cyclic ? n : n - 1;
        // initialize widths
        float []ww = new float[m];
        float s = 0;
        int i;
        for (i = 0; i < m-1; i++) {
            s += w[i];
            if (s>=1) {
                break; // 以防输入的百分比过大时产生的异常
            } else {
                ww[i] = w[i];
            }
        }
        if (i<(m-1)) { // 若输入的百分比过大将剩下的均分
            float t = (1-s+w[i])/(m-i);
            for (; i<m; i++) {
                ww[i] = t;
            }
        } else { // 将剩下的分配给最后一个色块
            ww[m-1] = 1 - s;
        }
        // initialize colors
        int []rgbs = new int[n];
        for (i = 0; i < n; i++)
            rgbs[i] = c[i].getRGB();
        // the color's divides
        int a[] = new int[n];
        int r[] = new int[n];
        int g[] = new int[n];
        int b[] = new int[n];

        // initialize the color's divides
        for (i = 0; i < n; i++) {
            a[i] = (rgbs[i] >> 24) & 0xff;
            r[i] = (rgbs[i] >> 16) & 0xff;
            g[i] = (rgbs[i] >>  8) & 0xff;
            b[i] = (rgbs[i]      ) & 0xff;
        }

        // tail of color's divides (if you wana cyclic)
        int ta = ((rgbs[n-1] >> 24) & 0xff) - a[0];
        int tr = ((rgbs[n-1] >> 16) & 0xff) - r[0];
        int tg = ((rgbs[n-1] >>  8) & 0xff) - g[0];
        int tb = ((rgbs[n-1]      ) & 0xff) - b[0];

        // 用于存储平滑过渡的各颜色值
        int []interp = new int[cyclic ? n*256+1 : (n-1)*256+1];

        // 颜色线性平滑插值
        for (i = 0; i <= 256; i++) {
            float rel = i / 256.0f;
            int rgb;
            for (int j=0; j<n-1; j++) {
                rgb =
                    (((int) (a[j] + (a[j+1]-a[j]) * rel)) << 24) |
                    (((int) (r[j] + (r[j+1]-r[j]) * rel)) << 16) |
                    (((int) (g[j] + (g[j+1]-g[j]) * rel)) <<  8) |
                    (((int) (b[j] + (b[j+1]-b[j]) * rel))      );
                interp[i+256*j] = rgb;
            }
            if (cyclic) {
                rgb =
                    (((int) (a[0] + ta * rel)) << 24) |
                    (((int) (r[0] + tr * rel)) << 16) |
                    (((int) (g[0] + tg * rel)) <<  8) |
                    (((int) (b[0] + tb * rel))      );
                interp[n*256-i] = rgb;
            }
        }

        // fill the image
        /*float rt = (float)interp.length / width;
        for (i=0; i<width; i++) {
            bi.setRGB(i, 0, interp[(int)(i*rt)]);
        }*/
        int cur = 0;
        for (i=0; i<m; i++) {
            int wi = (int) (width*ww[i]);
            if (i==(m-1)) wi = width-cur;
            //System.out.print(wi+",");
            float rt = (float)256 / wi;
            for (int j=0; j<wi; j++) {
                bi.setRGB(cur+j, 0, interp[(int)(j*rt)+i*256]);
            }
            cur += wi;
        }
    }





    public void mouseEntered(MouseEvent e) {
    }
    public void mouseExited(MouseEvent e) {
    }
    public void mousePressed(MouseEvent e) {
    }
    public void mouseReleased(MouseEvent e) {
    }


    /**
     * @param args
     */
    public static void main(String[] args) {
        JFrame f = new JFrame("");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(640, 480);
        f.setLocationRelativeTo(null);
        f.add(new RainbowText());
        f.setVisible(true);
    }

}


//EOF Read More...

Java2D Curves Control Point

大家刚接触Java图形编程的可能对 二次曲线、贝尔曲线 的几个控制点有点迷惑,我下面有段示例方便大家理解这两个曲线的几个控制点的作用:
package test.draw;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.GeneralPath;

import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * 方便理解Quadratic/Bezier曲线的几个控制点作用
 *
 * @author h_Davy [dave3068 AT gmail DOT com]
 * @version 2007-11-27 上午01:41:23
 */
public class CurvesTest extends JPanel
        implements MouseListener, MouseMotionListener, FocusListener {

    private static final long serialVersionUID = 1L;

    public CurvesTest() {
        super(true);
        init();
    }
    private void init() {
        setBackground(Color.white);
        setFocusable(true);
        addFocusListener(this);
        addMouseListener(this);
        addMouseMotionListener(this);
    }



    // 二次曲线
    private QuadCurve q = new QuadCurve(new Point(50, 100),
                new Point(200, 150), new Point(300, 100));
    // 贝尔曲线
    private BezierCurve b = new BezierCurve(
            new Point(100, 300), new Point(200, 400),
            new Point(300, 200), new Point(400, 300));


    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setStroke(new BasicStroke(2.f));

        // draw background
        g2.setColor(getBackground());
        g2.fillRect(0, 0, getWidth(), getHeight());
        g2.setColor(Color.blue);
        g2.drawRect(5, 5, getWidth()-10, getHeight()-10);

        // draw curves
        g2.draw(q.getPath());
        g2.draw(b.getPath());
        // fill path area
        g2.setColor(Color.lightGray);
        g2.fill(q.getPath());
        g2.fill(b.getPath());

        // paint drag handles
        g2.setColor(Color.orange);
        DragHandle []dhs = q.getDragHandles();
        for (int i = 0; i<dhs.length; i++)
            g2.fill(dhs[i]);
        dhs = b.getDragHandles();
        for (int i = 0; i<dhs.length; i++)
            g2.fill(dhs[i]);

    }

    private boolean isDrag = false; // 是否在拖动控制点
    private DragHandle curDrag = null; // 当前拖动中的控制点



    public void mousePressed(MouseEvent e) {
        // find out is mousePoint in any DragHandle
        DragHandle dh = q.findDragHandle(e.getPoint());
        if (dh != null) {
            curDrag = dh;
            isDrag = true;
            return;
        }
        dh = b.findDragHandle(e.getPoint());
        if (dh != null) {
            curDrag = dh;
            isDrag = true;
            return;
        }
    }
    public void mouseReleased(MouseEvent e) {
        isDrag = false;
    }
    public void mouseDragged(MouseEvent e) {
        if (isDrag) {
            curDrag.setPoint(e.getPoint());
            q.refresh();
            b.refresh();
            repaint();
        }
    }
    public void focusLost(FocusEvent e) {
        isDrag = false;
    }



    // 控制点区域
    @SuppressWarnings("serial")
    private class DragHandle extends Rectangle {
        private Point pt = new Point();

        DragHandle() {
            width = 5;
            height = 5;
        }
        DragHandle(Point p) {
            this();
            pt.x = p.x;
            pt.y = p.y;
            calcRect();
        }

        private void calcRect() {
            x = pt.x - 2;
            y = pt.y - 2;
        }
        public void setPoint(Point p) {
            pt.x = p.x;
            pt.y = p.y;
            calcRect();
        }
        public Point getPoint() {
            return pt;
        }
    }




    // Quadratic 曲线
    private class QuadCurve {
        // 曲线路径
        protected GeneralPath gp = new GeneralPath();
        // 曲线的几个控制点
        protected DragHandle []pt = null;

        protected QuadCurve () {}
        QuadCurve(Point p1, Point p2, Point p3) {
            pt = new DragHandle[3];
            pt[0] = new DragHandle(p1);
            pt[1] = new DragHandle(p2);
            pt[2] = new DragHandle(p3);
            refresh();
        }

        // 更新曲线
        public void refresh() {
            gp.reset();
            gp.moveTo((float) pt[0].getX(), (float) pt[0].getY());
            gp.quadTo((float) pt[1].getX(), (float) pt[1].getY(),
                    (float) pt[2].getX(), (float) pt[2].getY());
        }

        // 指定点是否在控制点区域内
        public DragHandle findDragHandle(Point p) {
            for (int i = 0; i<pt.length; i++)
                if (pt[i].contains(p)) return pt[i];
            return null;
        }
        // 获得所有控制点
        public DragHandle[] getDragHandles() {
            return pt;
        }
        // 获得该曲线的Path
        public GeneralPath getPath() {
            return gp;
        }
    }
    // Bezier 曲线
    private class BezierCurve extends QuadCurve {

        protected BezierCurve(Point p1, Point p2, Point p3) {}
        BezierCurve (Point p1, Point p2, Point p3, Point p4) {
            pt = new DragHandle[4];
            pt[0] = new DragHandle(p1);
            pt[1] = new DragHandle(p2);
            pt[2] = new DragHandle(p3);
            pt[3] = new DragHandle(p4);
            refresh();
        }

        public void refresh() {
            gp.reset();
            gp.moveTo((float) pt[0].getX(), (float) pt[0].getY());
            gp.curveTo((float) pt[1].getX(), (float) pt[1].getY(),
                    (float) pt[2].getX(), (float) pt[2].getY(),
                    (float) pt[3].getX(), (float) pt[3].getY());
        }
    }





    public void mouseClicked(MouseEvent e) {
    }
    public void mouseEntered(MouseEvent e) {
    }
    public void mouseExited(MouseEvent e) {
    }
    public void mouseMoved(MouseEvent e) {
    }
    public void focusGained(FocusEvent e) {
    }


    /**
     * @param args
     */
    public static void main(String[] args) {
        JFrame f = new JFrame("拖动几个橙色的小点看看 ^_^");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(640, 480);
        f.setLocationRelativeTo(null);
        f.add(new CurvesTest());
        f.setVisible(true);
    }

}

//EOF Read More...

2007-11-01

两个曲谱

一个是经典游戏《天之痕》的:



还有一个是小时候很喜欢的《红蜻蜓》(日本民谣)的。


//EOF Read More...

2007-10-28

VC notes[01]

许久没用Win了,生疏了很多。记些笔记:

  1. 让Dialog中能接收 WM_CHAR,及按键时不要“咚咚”声

  2. 在 Dialog::PreTranslateMessage(MSG* pMsg) 中让Dialog跳过WM_CHAR的处理(return FALSE):
    if (pMsg->message == WM_KEYDOWN 
          || pMsg->message == WM_KEYUP 
          || pMsg->message == WM_CHAR)
        return FALSE; // 解决按键时的“咚咚”声,及让Dialog中能接收 WM_CHAR
    //(Dialog 的回车自动 OK,ESC 自动 CANCEL 也可以用这种方式解决)

  3. 在某窗体中禁用输入法:(标准 Windowz GUI 中控件也是窗体)
    处理 WM_INPUTLANGCHANGEREQUEST 并 return 0;
  4. 自绘输入光标
    WM_SETFOCUS:
    // 注:这里我开始用this->CreateCaret(NULL),发现只有个小黑点,所以用可以定义大小的。
    ::CreateCaret(this->m_hWnd, NULL, 2, 25);//(HBITMAP)1是灰块,NULL是黑块,也可以定制BMP
    ::SetCaretPos(50,15);    // 设置光标位置
    this->ShowCaret();
     
    WM_KILLFOCUS:
     
    this->HideCaret();
    ::DestroyCaret();
  5. 动态设置光标位置
    结合如下API:(注意:DC的字体)
    SIZE    size;    // 字串高度、宽度
    GetTextExtentexPoint32(hdc, str, strlen, &size);
  6. 限制窗口显示的大小
    (注:该消息为Win发送处理,用户只需设置其值就行了,只设置需要的其它的交给系统调整)
    WM_GETMINMAXINFO: 
     
    // 窗口最小能调整到的大小
    lpMinMaxInfo->ptMinTrackSize.x = 640;
    lpMinMaxInfo->ptMinTrackSize.y = 480;
    // 窗口最大能调整到的大小
    lpMinMaxInfo->ptMaxTrackSize.x = 800;
    lpMinMaxInfo->ptMaxTrackSize.y = 600;
    // 最大化窗口时的大小
    lpMinMaxInfo->ptMaxSize.x = 800;
    lpMinMaxInfo->ptMaxSize.y = 600;
    // 最大化窗口时的位置
    lpMinMaxInfo->ptMaxPosition.x = 50;
    lpMinMaxInfo->ptMaxPosition.y = 60;
     
    return 0; // 自己处理后要 return 0;


//EOF Read More...

2007-10-22

诡异的显示器进水事件

前天,突然显示器闪了一下就黑屏了,还不时的发出“喳喳”声。第一反应是“完了,显示器烧了”,马上关电源,果然不一会儿就闻到一股电路元件烧毁的气味……

今天拿去修理,拆开后他说:是进水了……
我说:怎么可能呢!?一来房间不漏水、二来没在上面放过水杯、三来没用湿抹布抹过、四来没向显示器上泼水,这显示器怎么就会进水呢?
于是他让我看。果然,在显示器的线路板下面有个“盘子”里积了十多毫升的水。
说 是边上有根线因为虹吸把水引上电路板导致短路而烧毁的。

后来我就一直在想到底显示器是怎么进水的……
想来想去只想到一种可能,那就是大约今年4、5、6月份的时候空气湿度大,我的显示器放在窗户边上我晚上又不关窗户,当时每天刚开机的时候显示器总是先黑上一分钟之后慢慢的变清晰的,过了那段时间就没事了,我也没怎么在意。
我想可能是当时清晨的时候空气中的水份凝结在显示器内部而流到底下的“盘子”上积累的,但我想不通的是为什么过了一个夏天水都没蒸发??难道是我的显示器“密封性”太好了?
-_-||||

//EOF Read More...

2007-10-20

感觉FF-2.0.0.8字体清晰了很多(Linux版本)

2008出来有一段时间了,不过今天才注意到(前段时间有的忙),发现显示中文字体比之前清晰了很多啊。
不知道是我自己的纯感觉还是真的有提升?
//EOF Read More...

2007-10-04

今年的国庆真忙

我姐今年国庆结婚,10月2日婚宴。
我们10月1日赶过去,然后10月2日忙了一天,10月3日又忙着赶回来……
真有够累人的~~
//EOF Read More...

2007-09-12

sys_calls

/usr/include/asm/unistd.h (sys/syscall.h)
the system call numbers:

sys_call namesys_call num.(hex)
restart_syscall0
_exit1
fork2
read3
write4
open5
close6
waitpid7
create8
link9
unlinka
execveb
chdirc
timed
mknode
chmodf
lchown10
break11
oldstat12
lseek13
getpid14
mount15
oldumount16
setuid17
getuid18
stime19
ptrace1a
alarm1b
oldfstat1c
pause1d
utime1e
stty1f
gtty20
access21
nice22
ftime23
sync24
kill25
rename26
mkdir27
rmdir28
dup29
pipe2a
times2b
prof2c
brk2d
setgid2e
getgid2f
signal30
geteuid31
getegid32
acct33
umount234
lock35
ioctl36
fcntl37
mpx38
setpgid39
ulimit3a
oldolduname3b
umask3c
chroot3d
ustat3e
dup23f
getppid40
getpgrp41
setsid42
sigaction43
sgetmask44
ssetmask45
setreuid46
setregid47
sigsuspend48
sigpending49
sethostname4a
setrlimit4b
getrlimit4c /* Back compatible 2Gig limited rlimit */
getrusage4d
gettimeofday4e
settimeofday4f
getgroups50
setgroups51
select52
symlink53
oldlstat54
readlink55
uselib56
swapon57
reboot58
readdir59
mmap5a
munmap5b
truncate5c
ftruncate5d
fchmod5e
fchown5f
getpriority60
setpriority61
profil62
statfs63
fstatfs64
ioperm65
socketcall66
syslog67
settimer68
gettimer69
stat6a
lstat6b
fstat6c
olduname6d
iopl6e
vhangup6f
idle70
vm86old71
wait472
swapoff73
sysinfo74
ipc75
fsync76
sigreturn77
clone78
setdomainname79
uname7a
modify_ldt7b
adjtimex7c
mprotect7d
sigprocmask7e
create_module7f
init_module80
delete_module81
get_kernel_syms82
quotactl83
getpgid84
fchdir85
dbflush86
sysfs87
personality88
afs_syscall89 /* Syscall for Andrew File System */
setfsuid8a
setfsgid8b
_llseek8c
getdents8d
_newselect8e
flock8f
msync90
readv91
writev92
getsid93
fdatasync94
_sysctl95
mlock96
munlock97
mlockall98
munlockall99
sched_setparam9a
sched_getparam9b
sched_setscheduler9c
sched_getscheduler9d
sched_yield9e
sched_get_priority_max9f
sched_set_priority_mina0
sched_rr_get_intervala1
nanosleepa2
mremapa3
setresuida4
getresuida5
vm86a6
query_modulea7
polla8
nfsservctla9
setresgidaa
getresgidab
prctlac
rt_sigreturnad
rt_sigactionae
rt_sigprocmaskaf
rt_sigpendingb0
rt_sigtimedwaitb1
rt_sigqueueinfob2
rt_sigsuspendb3
pread64b4
pwrite64b5
chownb6
getcwdb7
capgetb8
capsetb9
sigaltstackba
sendfilebb
getpmsgbc /* some people actually want streams */
putpmsgbd /* some people actually want streams */
vforkbe
ugetrlimitbf /* SuS compliant getrlimit */
mmap2c0
truncate64c1
ftruncate64c3
tkillee
io_setupf5
io_destoryf6
io_geteventsf7
io_submitf8
io_cancelf9
exit_groupfc
timer_create103
timer_settime104
timer_gettime105
timer_getoverrun106
timer_delete107
clock_settime108
clock_gettime109
clock_getres10a
clock_nanosleep10b
tgkill10e
utimes10f
kexec_load11b
waitid11c
/* sys_setaltroot11d */
add_key11e
request_key11f
keyctl120
ioprio_set121
ioprio_get122
inotify_init123
inotify_add_watch124
inotify_rm_watch125
migrate_pages126
openat127
mkdirat128
mknodat129
fchownat12a
futimesat12b
fstatat6412c
unlinkat12d
renameat12e
linkat12f
symlinkat130
readlinkat131
fchmodat132
faccessat133
getcpu13e


//EOF Read More...

2007-09-03

位域

位域是C语言里面比较高级的特性,在结构体中比较常见。
现在在嵌入式开发中还比较常用,主要是能够节约内存空间。
如:

typedef struct {
    short int    flag_a: 1;    /* 在内存中只占 1 bit
                               * 超出可能会向高位覆写
                               * 但也可能丢失高位,由编译器而定 */

    short int    flag_b: 1;    /* 占 1 bit */
    short int    flag_c: 4;    /* 占 4 bits */
    short int    flag_d: 2;    /* 占 2 bits */
    short int    flag_e;       /* 占 16 bits */
} flags;
/* 这里整个结构体在内存中只占用了 4 Bytes */
/* 但还要注意:分配内存时还要考虑内存对齐原则,
 * 如,上面 flag_d 之后到 flag_e 之间,内存还有 8bits 的空余。
 * 所以 请尽量把位域字段放在一块儿!
 * 如果在 flag_e 之后再添加一个 flag_f: 8 的话,空间是只会向后扩展
 * 而不会插入 flag_d 和 flag_e 之间空余空间的。
 */

// EOF Read More...

2007-08-30

Star Trek 中曲速航行物理学原理

详见: http://www.ex-astris-scientia.org/treknology/warp1.htm
其中空间坐标换算见 "Space-time diagram" 节。
//EOF Read More...

Starfleet General Order星际舰队指导原则全文

以下所列之指导原则为星舰总部所应遵守之规范。本指导原则乃由星际舰队秘书处所提出,并或联邦议会追认为行政命令,本指导原则适用所有星际舰队成员。本指导原则之指定列管范围乃由联邦议会或军事指挥会议其中一者为之。
相反地,本指导原则亦授权星际舰队得以本指导原则影响联邦政策。本指导原则所罗列支32项条款乃所有星际舰队之任务与作战的基本规范。首六条概已经联邦议会追认为联邦基本法。


指导原则第一条:最高指导原则

凡星际舰队成员不得干涉一有知觉并居住於有正常文化发展且拥有自我慎思能力的环境下之外星种族生活与文化发展,前述之干涉行为包括将高等知识、力量、科技引进至向无能力和先进智慧掌控其发展之世界。星际舰队成员不得以拯救自身生命或船舰为由违反本条款,但若是在未告知该外星世界的情况下,改正另外违反本条款行为或处理因意外而产生之污染则不在本条款限制范围之内。当星际舰队成员执行任务时应将本条款至於最优先考量,并且负起应负之最高心理责任。


指导原则第二条

凡星际舰队成员无论个别或集体行动均不应在非必要情况下动用武力对抗星联成员,且无论情况下都不得违反本条款。本条款授权之对象为议员、代言人、经指定之领袖和非星联成员。


指导原则第三条

每一联邦成员主权必须受到绝对尊重,凡星际舰队成员必须遵守联邦成员行星之司法裁量权管制下的法规、法律、传统风俗与统治者所订立之规范。违反者将被交付当地政府受应负之惩罚。


指导原则第四条

凡星际舰队成员如与迄今向未被发现之智慧生命形式接触时,无论使用文字或动作均不应告知前述之生命形式:除了他们的世界之外,仍有其他世界与生命形式存在於他们的太空边界之外。


指导原则第五条

在极度紧急之情况下,联邦特使经授权得动用紧急权力并依照当时的情况与环境采用不会危及联邦公民之行动。本条款亦许可经授权之联邦公民人员得短暂权宜指挥星际舰队之船舰与成员,星际舰队人员务须服从该员於危急时间所获得之授权。


指导原则第六条

凡星际舰队成员必须将来自联邦公民的警及呼救无条件视为最优先处理项目。
舰队成员必须立即回应该呼救并予以处理且排除排除其他行动。


指导原则第七条

凡星际舰队成员不得以紧急状态或任何理由前往Talos Ⅳ,如本条款与指导原则第六条冲突,则指导原则第六条无效。违反本条款者将被判处死刑。


指导原则第八条

凡星际舰队船舰指挥官若目击并辨别确认所隶属外星政权之战船驶入联邦领域,应判断其进入联邦领域之理由。如该战船表现出明显敌意,联邦船只得援引本条款采取适当行动以保护联邦成员之生命财产。同时该船舰指挥官得依其判断何时采用武力解除敌对状态,但应避免非必要杀害生命。


指导原则第九条

凡正规或预备星际舰队指挥官均不得在未获联邦政府同意下提供任何人政治庇护。


指导原则第十条

如有任何资深军官证明之目击证人存在或有类似相似证据证实之个人违反最高指导原则,本条款授权经过宣誓之联邦政府代表人立即解除该员职务并予以逮捕。该联邦政府代理人亦需立即采取其认为之最适当行动将伤害减低至最低。


指导原则第十一条

凡军阶为上校或将军之星际舰队军官得援引本条款获得完整授权与法定非联邦成员交涉条件与缔结条约。同时在该情况下,本条款授权该交涉军官得以使用联邦特使所有权力。凡援引本条款缔结之条约需经过星际舰队作战部门主任或星际舰队秘书处批准。


指导原则第十二条

凡星际舰队军官仅有在条约许可或必须为在紧急状态下抢救联邦公民为前提方得进入中立区。


指导原则第十三条

凡星际舰队成员除非拥有其他命令声明否则应对行星系之领域与该星系政府完整性有所尊重并且不会对该世界之领域区采取入侵行为。


指导原则第十四条

凡星际舰队成员仅有在得到该星系领袖或民选之领导人请求并接获直接命令方得以保护联邦公民之生命财产安全与维护指导原则完整性为名介入当地行星系事件。


指导原则第十五条

凡将军级星际舰队指挥官不得在未有适当武力之护卫下前往有潜在性威胁之区域。


指导原则第十六条

凡星际舰队成员仅有在不违反最高指导原则与不为及联邦或星际舰队安全之情况下方得提供科技、医疗或其他科学技术与未被承认之星族。


指导原则第十七条

星际舰队船舰舰长必须慎重考虑其船员之生命安全。在有潜在性威胁的情形下舰长需将船员之生命安全考量置於船舰之上。


指导原则第十八条

凡星际舰队成员若被指控叛国,联邦法院有权解除其之职务。若该员已被释放,星舰总部不得在该案上以其他法条追索其罪名。


指导原则第十九条

凡星际舰队成员除非宣布紧急状态否则不得在行星系之间运送被相信用於进攻行为之人员与材料。本条款适用范围包括位於联邦领域内之独立世界。


指导原则第二十条

星舰总部之军官与成员均受雇於处理联邦领域内所有种族违反本身意愿之财产、运输、销售或商业利益交换之事宜。


指导原则第二十一条

凡星际舰队之军官或义务役士兵均不得在未或联邦议会许可下替独立外星政府服务


指导原则第二十二条

个人的意见表达与公开表述应获得尊重,本条款保障星际舰队成员能够在非公开场合讨论联邦政策,但是其内容应避免违反最高指导原则、联邦特别命令与星际舰队指挥程序。


指导原则第二十三条

当可证实之证据证明星际舰队船舰或其他同等联邦职务之资深指挥军官正在或过去曾经违反最高指导原则,星联军官得解除前述军官之职务,并且承担前述军官职务之所有权利以等候蔫帮政府官方的全面调查。


指导原则第二十四条

如果指挥官认为有个人或团体对星际舰队成员或联邦公民进行恐吓,他可以采用任何他认为必要的手段(包括武力)来保护被恐吓者的安全。


指导原则第二十五条

在不危及星联或星际舰队安全的极端紧急状况下受星际舰队成员保护的公民与军人应得到与其军阶或身份相符之合理待遇。


指导原则第二十六条

船舰编制内或地面基地编制的成员无权直接要求其上级长官对行动做出任何说明。同样地,船舰成员在没有直接涉及指挥对抗其指挥官的惩戒性措施的情况下不须分担前述之行动。
本条款适用於有存在证据确实证明有违反最高指导原则的情势。


指导原则第二十七条

如果家庭成员获准登上舰队船舰或被视为舰队编制内的一部份,凡星际舰队成员不应因为标准任务或责任而被要求与其家庭分离。


指导原则第二十八条

除非至少三名资深军官彻底与完全同意,指挥阶级军官不应被剥夺指挥权。但如真有此情况发生之可能,采取此行动之军官群应包括该船舰之首席军官、总医师、顾问以及一名具指挥身份的资浅军官。


指导原则第二十九条

任何星际舰队船舰指挥官之首要责任是要保障包括公民在内的船员福利与社区安全。除非是职务需求或其他不可避免情况,军官不应只是采取对个人安全会造成不当威胁的行动。


指导原则第三十条

星舰总部承认每艘船的指挥官有权在发现新的有知觉外星种族的环境情况下权宜详细解释最高指导原则与生效的其他指导原则。


指导原则第三十一条

指导原则的状态与叙述内容完全适用所有已被发现有知觉的原生或人工外星种族。


除非在最紧急状态下,星际舰队指挥官未经星舰总部特别准许授权不得命令他的船舰飞行快过曲速系数五级。本条款不适用使用变量几何曲速引擎(Variable Geometry Warp Nacelles)或者稳定场域系统(Stable Field System)的船舰。

//EOF
Read More...

2007-08-24

重复定义。。。

今天有人问我他某个头文件中定义的一个函数在编译的时候总是出现“重复定义”的提示,我也有直接在头文件中定义函数体的情况但从未遇到过那种提示啊~~,当时想了半天。。。未果。。。后来吃饭的时候才突然想到,一定是他在多个源文件中include了那个头文件,而那个头文件没有使用如下预编译宏:

#ifndef _XXX_H_
#define _XXX_H_

...

#endif //_XXX_H_


我每次写头文件时都会习惯性的首先添加上述宏,已经成为一种下意识的习惯了,所以当时一时间没有考虑到这种情况。
我还真是的……养成这种良好的习惯后竟然会在考虑问题时自然而然的首先忽略掉这种情况。。。
//EOF Read More...

2007-08-14

ALD

ALD(Assembly Language Debugger)

is a simple beautiful baseline POSIX debugger.
if you wanna debug a asm program this will be a better choice

http://ald.sourceforge.net

//EOF Read More...

2007-08-01

daemon tool : mount from command line

> "\path\to\daemon.exe" -mount 0,"\path\to\image file"
(-mount index,imagefile or -unmount index)

[HKEY_CLASSES_ROOT\ISOfile\shell\open\command]
@="\"C:\\Program Files\\DAEMON Tools\\daemon.exe\" -mount 0,\"%1\""

//EOF Read More...

2007-07-31

分析Delphi编译的程序真郁闷

分析Delphi编译的程序真的很郁闷~~

特别是字符串部分……
Pascal字符串结构是:[字串长]字串字符部分....


Delphi程序的 函数/过程 传值方式大多是以寄存器为主。
其中也有特殊的,比如_LStrCatN:

procedure _LStrCatN (var dest:AnsiString; argCnt: Integer; ...) // AnsiString 的连接

EAX :目标字符串
EDX :源字符串的个数 +2
[ESP+4*i] :第 i 个源字符串的指针

这里的入口参数比较特别

之上有:
push xxx
push xxx
...(EDX个push不一定要在一起)
如:
_LStrCatN (str, 3, LStrFromString(b), LStrFromString(a), IntToStr(n))
这样的就有可能是:
lea    edx, [ebp+tmp1]
mov    eax, [ebp+n]
call   IntToStr
push   [ebp+tmp1]    ; <<== 01
lea    eax, [ebp+tmp2]
mov    edx, ds:off_a
call   LStrFromString
push   [ebp+tmp2]    ; <<== 02
lea    eax, [ebp+tmp3]
lea    edx, [ebp+b]
call   LStrFromString
push   [ebp+tmp3]    ; <<== 03
lea    edx, [ebp+str]
mov    edx, 3
call   LStrCatN

; 这些push分散到了 01,02,03 所指处(一开始我还以为前两个push是LStrFromString的- -)


返回值也不一定在 EAX 中——尽管大多数是在EAX中没错,不过也有放[ESP+4]的。

//EOF Read More...

2007-07-07

Linux下实现getch()

Linux下的int getchar(void)在默认情况下需要Enter后才能继续。那么可否像DOS下那样即时返回的呢?
回答是肯定的:

  1. 使用curses库的getch()。
  2. read /dev/input/event0 (kernel >= 2.6)
  3. 将stdin改成unbuffered:
    #include <stdio.h>
    #include <unistd.h>
    #include <termios.h>
    int getch (void)
    {
        int    c = 0;
        struct termios    tm_old, tm;
        int    ret = 0;

        ret = tcgetattr (STDIN_FILENO, &tm_old);
        assert (ret==0);
        memcpy (&tm, &tm_old, sizeof(tm));
        tm.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT | ECHOKE | ICRNL);
        tcsetattr (STDIN_FILENO, TCSANOW, &tm);
        c = fgetc(stdin);//getchar();
        ret = tcsetattr (STDIN_FILENO, TCSANOW, &tm_old);
        assert (ret==0);

        return c;
    }


//EOF Read More...

2007-07-04

《侠胆雄狮》


最近在看《Dark Angel》,第二季中Joshua("the first one")的出场立刻让我联想到了上世纪90年代中央电视台正大剧场播过的《侠胆雄狮》(Beauty and the Beast)。
很经典的一部电视剧,当时我还很小,很多记忆都模糊了,但是看这部剧的感受还深深的印在我的心头。不过正大剧场好像只引进了第一季呢,没结局。

http://tv.mofile.com/r4s2qzp3/

//EOF Read More...

amulecmd

~/.aMule/amule.conf

AcceptExternalConnections=1
ECPassword=<md5 string> # get this string with this:
$ echo "your passwd" | md5sum | cut -d ' ' -f 1

then:
$ amuled &

you can using amulecmd do a simply control.
$ amulecmd -P "your passwd" [-c "control cmd"]

//EOF Read More...

2007-06-30

最后一次做梦是什么时候呢?似乎已经忘记了吧。想起来好像有好些年没有做梦了~~

啊~ 呵呵,说这些是没有意义的。理论上说,对于人类的正常睡眠每天都有做梦的啦,每次进入深层睡眠会有3到4次的做梦。
但通常意义上的做梦还是指那些清醒后还能够保留在记忆中的那些信息。

我所指的就是后者,真的好想再次做梦哪!哎~
//EOF Read More...

2007-06-29

不知道overnet2000的Kad Nodes是什么时候开始失效的?

今天早上8:00之前还蛮好的,8:00之后 aMule log 一直持续不断的出现:
ServerUDP: Received invalid packet, protocol (0xe4) and opcode (0x20)
之类的信息,Kad Nodes的连接也一落千丈,上网搜索了发现果然是和Kad有关。
打开,aMule默认填写的 http://download.overnet2000.de/nodes.dat 不知道什么时候就是“404”了。
结果,换一个node吧,更新后Kad的连接是上去了,但源似乎还没更新,后来才意识到aMule更新这些东西后还需要restart的。。。
restart aMule 后一切回复正常。
//EOF Read More...

2007-06-28

十年

十年……又过了十年。
如此轻易的放过了这十年。
十年的时间经历了很多,也改变了很多。
十年前的信念你是否还在坚守?
//EOF Read More...

2007-06-14

Xlib Programming Manuals

SUPER-UX Xlib Programming Manual
http://tucupi.cptec.inpe.br/sx4/sx4man2/g1ae02e/frame.html
The X Window system
http://tronche.com/gui/x/
Basic Graphics Programming With The Xlib Library
http://users.actcom.co.il/~choo/lupg/tutorials/xlib-programming/xlib-programming.html
Xlib Programming Manual (O'Reilly & Associates, Inc.): Table of Contents
http://www.sbin.org/doc/Xlib/index_contents.html

//EOF Read More...

GNU Go

GNU Go is a free program that plays the game of Go.
you can using this to play Go with your PC.
but, GNU Go need a GUI.
then, qGo(QT 3) or Quarry(GTK+ 2) will be needed.

GNU Go : http://www.gnu.org/software/gnugo/
qGo : http://sourceforge.net/projects/qgo/
Quarry : http://home.gna.org/quarry/

//EOF Read More...

2007-05-21

SC2中神族的母舰实在是太强了!

刚才看了那段SC2的演示Demo
神族的母舰可以创建一个时间缓慢场,在那个场中只有神族的航母可以以正常的速度行动,其它的东西的运动都慢得近乎于静止。。。
这个还不止。。。竟然还可以创建一个黑洞!!! Oh,My GOD!!!!!!!!
庆幸的是似乎在一场战斗中只能拥有一架这样的怪物。

SC2的韩国发布会现场:(成堆的丢韩语,只有后面讲E文的时候听得懂 -_-|||)
http://www.tudou.com/programs/view/08zXR3IBE1U/
//EOF Read More...

2007-05-20

FoxTorrent...

汗一个。。。想不到还有做 FireFox 的BT下载插件的。
详见: http://www.foxtorrent.com/

一年前曾经用过 FF 的插件 DownThemAll,也是个多线程、断点续传的下载插件,刚开始的时候还觉得比较新奇,用了一段时间后还是觉得没的专门的下载工具好。

尝尝鲜是可以,但我还是不看好这个 FoxTorrent
我个人是比较喜欢 FF 的,但是。。。有一点,就是 FF 的内存占用确实。。。尤其在游览某含有海量大幅图片的网站后,内存一直居高不下啊。。。而 BT 这个东西是要经常挂的。。。这样的话还不如命令行下面的小巧BT工具划算。
//EOF Read More...

2007-05-14

Parse error: unexpected $end in xxx.php

"Parse error: syntax error, unexpected $end in xxx.php on line 1517"

出现这么一条莫名其妙的错误,1517行又是文件的末尾,真是莫明其妙。
其实,出现这种错误大多是由于文件中不匹配的 括号("()","{}")特别是掉了某个结束括号 引发的。

仔细巡查文档,发现原来在删除一段代码块时多删除了一行(那一行就是一个"}"符号)所致。

所幸,我写的代码格式还算规范,加上使用了VIM这种优秀的编辑器,这样我才能这么快的找到问题所在。

所以说嘛,书写规范格式的代码 是很有必要的!
要不然,就只有通过某种优秀的代码编辑器在成堆的代码中艰难的苦苦探寻才能找到找出问题了。:)
//EOF Read More...

2007-05-13

undefined reference to `vtable for xxx'

C++ 程序链接的时候出现这条信息 往往是有 虚析构函数 出现在基类中而又没有相应实现的情况。
解决方法:
给这个 虚析构函数 一个函数体,或者是定义成一个纯虚函数。

而在 QT 中出现这种情况 很可能是由于在该类中使用了Q_OBJECT宏
(见:http://blog.sina.com.cn/u/496ad465010007sk
http://blog.csdn.net/baymoon/archive/2006/11/23/1409167.aspx
和moc文件相关,解决方法,删除掉 *.o 再重新编译一次。
(对于KDevelop生成的qmake之外的工程,要到./debug/src 目录中删除掉 *.o 还有那些 class-name.moc.cpp ,然后重新编译)
//EOF Read More...

终于决定用Tor了

托我们伟大的国网(GFW)的福,这两天blogspot又不能访问了。。。
而以前的两个代理inblogs和pkblogs又都下线了,不想找别的代理,终于描上了以前听说过的Tor。
其实,原来别人也推荐过我用Tor,主要是保密方面的因素,而我平常也没什么好保密的,也就没有方在心上。
实际上Tor的特性决定了它在除通信保密之外很强的一个用途——可以当作灵活的代理来用——当然为了不要占用大家的资源只能用来作些通信量较小的工作,下载大文件那是最好不要做的。

安装配置方式,使用方法,Tor的主页上都说的很清楚了:
http://tor.eff.org/index.html.zh-cn

//EOF Read More...

2007-05-10

王蓝一

哈哈,以前不是没时间就是忘记了。今天趁着还记得上网搜索了一下
才知道 原来她叫做“王蓝一”,不过还真的有叫“蓝一”……
其实,还是蛮好听的,呵呵。

中央台天气预报的主持人。
我第一次看到她就是“朝闻天下”插播天气预报的那短短的片刻。
虽然只是片刻的时光却给我留下了深刻的印象。
一身职业装、一头短发,鲜明简洁,微笑,亲切,充满朝气(感觉她最适合作“朝闻天下”气象播报的主持人了,就是每天都早起的话太辛苦啊~)
早上能够见到她,那一天都能感觉神清气爽。偶尔几个早上见不到她,不免感觉有些失落。

不过,“中国气象信息网”上的照片都是长发的,还是感觉短发的她——“朝闻天下”气象播报中的那种装束 更加漂亮,更加动人。
似乎比我大呢,70年代末的(会不会对我们80后的有成见呢?)
哈~想这些干嘛?先做好我份内的吧,就像她的座右铭——“也许你不是最优秀的,但记住你一定是唯一的”
//EOF Read More...

2007-05-09

callback 在 C++ 中的使用

C++ 的class中只有用 static 的公有成员函数才有可能作为参数传递给 callback。
但是 static 的成员函数却不能访问非 static 的成员,因为对于static来说this指针是没有意义的。

那么有个变通的解决方法:自己搞一个 ^_^
——用一个该class的指针作参数,通过该参数来变通的访问类的实例。
如下:


#include <iostream>

using namespace std;

typedef int (* FUN)(int,void*);

class AA {
public:
   int aa;
   static int fun(int n, AA* a) {
      return a->aa>>n;
   }
};

int f(int f, void*)
{ return f<<2; }

void p (FUN callback, void* arg=NULL)
{
   cout<<callback(8, arg)<<endl;
}

int main ()
{
   AA a;
   a.aa = 0x1000;
   p (f);
   p ((FUN)AA::fun, (void*)&a);
   return 0;
}

对此,pthread_create 最后一个参数的魔力就体现出来了。
//EOF Read More...

2007-05-05

黑盒测试 和 白盒测试

以前学过的东西,基本忘记了。。。再从书上抄下来加深点映像。

黑盒测试(功能测试)

已知程序具有的功能,检验每个功能是否能正常使用。
(它只检查程序功能:是否能适当地接收输入的数据并输出正确的信息,并保持外部信息的完整性。)
测试以下几个方面:
  1. 不正确或遗漏的功能。
  2. 界面错误。
  3. 数据结构或数据库的访问错误。
  4. 性能错误。
  5. 初始化和终止条件错误。
有以下几种方法:
  • 等价分类法
      按输入条件把输入的数据划分为若干等价类
  • 边界值分析法(BVA, Boundary Value Analysis)
      经验表明,大多数错误都发生在输入的边界值上。
  • 对比测试法(背靠背测试,back-to-back testing)
      通过不同开发的相同功能冗余系统来对照

白盒测试(结构测试)内部功能测试

已知程序内部工作过程,测试动作是否按规格说明书的规定正常进行。
(按照程序内部的逻辑,检验程序中的每条通路是否能按预定的要求工作。)
原则:
  1. 保证模块中每一独立的路径至少执行一次。
  2. 保证所有判断的每一分支至少执行一次。
  3. 保证每一循环都在边界条件和一般条件下至少各执行一次。
有以下两类方法:
  • 基本路径测试
    • 流图(程序图)<把流程图结构用有向图表示,谓词节点>
  • 控制结构测试
    • 条件测试法(condition test)
    • 数据流测试法(data flow testing)
    • 循环测试

黑盒测试 和 白盒测试 不能相互替代,两者应互为补充!


因为不可能进行穷尽测试,所以不可能发现程序中的所有错误,也就是说,通过测试并不能证明程序的正确性。但是,我们的目的只是通过测试保证程序的可靠性,因此,必须仔细设计测试方案,力争用尽可能少的测试发现尽可能多的错误。

实践表明:用无效的输入数据比用有效的输入数据进行测试,往往能发现更多错误。
//EOF Read More...

2007-04-29

鱼刺

从小到大无数次吃鱼,几乎每次都要被鱼刺折磨那么一会儿。
所以,虽然我喜欢鱼的美味但是却讨厌吃鱼。
(大学在校期间没有吃过一次鱼,对外说是“我讨厌鱼腥味”“学校的鱼不好吃”,其实我知道,我是害怕鱼刺!)
其中有两次印象特别深刻的。

一次的在高3的时候,那次也是最让我哭笑不得的一次,以前只知道有钓鱼的,没想到那次我被鱼给钓了。
一根大概1.5cm的鱼刺(处于分裂期——就是以一根鱼刺分裂成两根的那种——这是我的猜想,也只有这样才能解释那种奇形怪状的鱼刺)大概是“K”形的——中间连接在一起,两边都分裂出倒钩的那种——刺穿了我的舌头而那两个倒钩都留在了我舌头内(怎么样很象是鱼上钩的情景吧:D)。
当时痛的很,由于鱼刺很短留在外面的部分很少手更本捏不住,父母把我的舌头拽出口腔外部摆弄了半天未果后终于决定上医务室去。
开始一个女的用止血钳夹着那根刺慢慢的摆弄着,把我的舌头拉出口腔老长都不能弄出来,还把我痛得眼睛都突出来了。
后来来一个男的说“对这种事要速战速决”,于是用木片把我舌头压住,用酒精把伤口周围消毒用止血钳夹住鱼刺狠命一拔——那根形状怪异的鱼刺终于出来了!!除了当时痛那么一下,和之后出了很多血之外到没什么大碍。总比开始那个女的折磨我要轻松多了 :D。
那次之后有1年时间,对于餐桌上的鱼我碰都不敢碰。

然后,昨天晚上。。。母亲弄了糖醋鱼,我的噩梦又开始了。
在快要结束晚餐的时候,就在我放松警惕的时候,噩梦发生了,突然感觉在咽部有个什么东西刺了一下,我意识到“完了!又是鱼刺!!”,我马上停止了吞咽的动作,并且把口腔内的东西吐了出来——之后的事实证明这是个正确的决断!
之后在家里用传统方法摆弄了10多分钟未果,决定去求医了。到医务室,医生看了一下说“这里没有条件弄,要到大点的医院用窥镜才能看到”。
幸好3医院不远,晚上只能看急诊吧?挂号费就要3块~~
到了医生那儿,我对医生说“大概在左边扁桃体附近被扎了根鱼刺”,那个医生竟然说“小子不错啊!竟然懂医呢。。。”(我暴汗。。。这个可是初中生物书上的内容,对于自己的身体大概在什么位置还是了解的吧?)
之后就轻松了,在左边扁桃体后部扎了一根2cm左右的鱼刺,已刺入1.5cm。。。(估计开始没刺入那么多,是后来以那些传统方法处理的时候又推入了不少)
最让我愤恨的是这样竟然花了我¥80RMB(我告诉那个医生刺入位置后根本就没用窥镜),完全是抢钱嘛!!
而且还不给我个消炎药?今天感觉扁桃体还有些痛~~

这件事情告诉我们,在事情完全结束前不要放松警惕,在还没了解事情的真像前不要凭经验随便处理。
//EOF Read More...

随便说两句

最近从Windows转向Linux的桌面用户很多,其中有一部分是被最近Linux上兴起的3D桌面吸引,但很大一部分是不能忍受Windows下多如牛毛的病毒之害的。

唉~怎么说呢?
如果说Windows是个人人得以上之的妓女的话。那么Linux无疑是一个气质高雅的优美女孩,这种高雅的气质是由内而外的,这种高雅的气质不可否认的是来自于Unix。
(注意:是优美而不是完美,优美总是那么的可爱,但完美偶尔是会让人觉得反感的)

嗯。。。
并不是说Linux下就没有病毒了,Linux下生产病毒的可能性是很大的,只不过长久以来Linux的使用者都是一些技术群体,对于这些大家都心照不宣(病毒创造出来后最终受害者是谁?何必更自己过不去呢?)。
而且,由于Linux的这种由内而外的高雅气质,即使有病毒但能够危害到系统基础构架的却基本没有。相当于是穿着一件性感漂亮的内衣,不小心弄脏了,洗一洗,或者大不了丢掉再去换一件新的。并不用花费太多的代价,不用吃药,不用动手术,更加不用“重生”、换人。
当然,不能排除某些牛人狠狠钻研内核后找出某些危险的漏洞,而加以利用的可能性。但这样的牛人有几个?他们会这样不负责任么?即使造出来也不会像现在Windows下的那么泛滥吧。

以上说这么多,其实我并没有诽谤Windows的意思。
只不过,想让新用Linux的那批人正确的看待这件事(病毒)。
其实,Windows刚开始流行之初也是没有这么泛滥的病毒之灾的,当时Windows的大多数使用者也只是一些技术人员,当PC迅速普及之后才有这么泛滥的病毒之灾。难道是之前的那些资格深厚的技术人员还不如当今的那些技术小混混么?很明显不是的,技术的积累不是一朝一夕的事情,看看当今Windows下的那些病毒真正有技术含量的有几个?绝大多数都是小混混的流氓作品罢了。


其实我真的很担心,让太多的人染指Linux 会玷污她那高雅的气质,毕竟人多了就杂 难免会掺杂那么几个混混流氓在里面。
//EOF Read More...

2007-04-21

新版bloger模板设置[3]

这两天才发现新的bloger模板中有一个“Lables”模块,实现的就是那些分类的功能。
不过如果你的Bloger中有很多Lables的话,会出现一大版……影响美观啊~
于是我小改一下(添加 显示/隐藏 功能):
修改后Lables模块如下:

<b:widget id='Label1' locked='false' title='Labels' type='Label'>
<b:includable id='main'>
<b:if cond='data:title'>
<h2 onclick="NodeExpand('lable_list');" style="cursor:pointer;"><span id="mk1">&gt;</span><span id="mk2" style="display:none;">V</span> <data:title/></h2>
</b:if>
<div class='widget-content' id="lable_list" style="display:none;">
<ul>
<b:loop values='data:labels' var='label'>
<li>
<b:if cond='data:blog.url == data:label.url'>
<data:label.name/>
<b:else/>
<a expr:href='data:label.url'><data:label.name/></a>
</b:if>
(<data:label.count/>)
</li>
</b:loop>
</ul>

<b:include name='quickedit'/>
</div>
</b:includable>
</b:widget>

还要在Bloger的模板中添加一个Javascript模块,添加内容如下:
<script language=javascript type=text/javascript>
function NodeExpand(divName) {
objDiv = document.getElementById(divName);
objMark1 = this.document.getElementById('mk1');
objMark2 = this.document.getElementById('mk2');
if (objDiv) {
if (objDiv.style.display == "block") {
objDiv.style.display = "none";
objMark1.style.display = "";
objMark2.style.display = "none";
} else {
objDiv.style.display = "block";
objMark1.style.display = "none";
objMark2.style.display = "";
}
}
}
</script>


还有怎么让那些labels不要显示在一条长列里面呢,模板中添加如下style:
#lable_list ul{list-style:none;}
#lable_list li{float:left;width:100px;}

规定lable_list中每列只占用100px宽,以及横向排列。


BTW: 开始那个手形光标把我搞晕了,很久以前记得应该是 cursor:hand; 的,结果这样竟然无效!?
后来google了才发现原来 hand 是M$的标准,W3C 标准应该用 cursor:pointer; !!
(哎~ M$ 太恶劣了,毒害了一代人啊!)
//EOF Read More...

2007-04-20

console下特殊文件名的操作

有时候会碰到一些特殊的文件名如:"-aaa"
因为文件操作命令会自动把"-"后面跟的东西解析成option,所以一般来说都不能成功。
可以在文件名前面用参数“--”(两个减号),来达到操作这种文件的目的。如:
$ ls -l -- -aaa
(对于其他特殊字符可以用""把文件名括起来,或在特殊字符前加"\"解析符号)

另外,对于非ASCII字符命名的文件操作。(当前系统还未安装该语言支持时)
例:当前目录下有名为“abc你好”的目录
1.利用自动补全功能
$ cd abc<这里按Tab键> 自动补完后回车就可进入(前提是当前目录下无其他以"abc"开头的文件名)

2.需要工具 hexdump(util-linux包中)。
$ ls -ad abc* |hexdump -c
0000000 a b c 304 343 272 303 \n
$ cd `printf "abc\304\343\272\303"`
当然,如果当前目录存在多个以abc开头的文件就会麻烦很多,只有你自己通过后面的编码值来确定那个才是你真正需要的了。

//EOF Read More...

2007-04-19

mount nfs: "can't read superblock"

# showmount -e 192.168.1.21
Export list for 192.168.1.21:
/home/share (everyone)
# mount -t nfs 192.168.1.21:/home/share /mnt/tmp
mount: 192.168.1.21:/home/share: can't read superblock



Solution: try using the -o nolock option from the nfs mount command
# mount -t nfs 192.168.1.21:/home/share /mnt/tmp -o nolock

//EOF Read More...

2007-04-06

买了个DVD刻录机

前两天终于下定决心买了个DVD刻录机,先锋的DVR-112CH。
终于不愁硬盘没空间了,哇哈哈哈哈哈哈!
备份数据也方便多了,再也不怕数据丢失了。
//EOF Read More...

2007-04-03

用Arch了!

其实老早就听说过Arch的大名,但是由于之前一直使用的是RedHat系的,所以之前不想、也不敢放弃RedHat。
01年接触Unix/Linux,02年开始用的RedHat9,之后出FC后用了FC4/FC5/FC6。
中间用过一次Debian、试过一次Ubuntu都不习惯
去年11月开始又开始了近乎自虐的LFS,由于都是是自己编译的运行的那个速度不是盖的啊!
但编译的过程是异常痛苦的,有了LFS的经历也不敢Gentoo了。
Suse去年11月之后就不在我的考虑之列了。
对Mandriva和Slackware还是感兴趣的,尤其是Mandriva。但也不想浪费太多精力
苦苦守候4月1日Arch0.8的发行,终于选定了自己最终的归宿——Arch!!
当然正式使用前当然少不了虚拟机上的试运行
一个current的CD也就500来MB,base安装(带gcc的)后也就400MB多点。
当然,运行速度也是相当快的,虽然和自己优化编译的LFS没得比,但比FC6还是快多了。
配置也很简单(不是指图形界面哦)——配置文件都放在理所当然的地方、配置的方法也是理所当然的。
pacman, ABS 都很容易操作。
上手还是相当容易的,当然前提是你有使用Linux的基础了 :)
决定了,明天就正式安装。
(当然,我短期内还是不会放弃RedHat的)
//EOF Read More...

2007-04-01

愚人节

哈哈,发现老外们在愚人节特别喜欢搞哈。
首先,Arch Linux 的主页被搞成了Ark Linux,连 Logo 都换了。还特别出了个“官方公告”。
而后,Ark Linux 不甘寂寞的改成了 Arch Linux,同样也换了 Logo,照搬的“官方声明”。
然后,Audacious 的主页被搞成了个闪烁背景,播放疯狂劲爆背景音乐的环境。还放上一张巨幅图片上面用鼠标手写的“Gtk+1 is better, so is xmms->polyhead”。
还有,google 推出的无线上网免费解决方案:http://www.google.com/tisp/install.html
……
//EOF Read More...

2007-03-15

Dr. Daniel Jackson的一生

时至今日,历经10年的科幻电视剧StarGate SG1已然结束(如果算上94电影版的话有13年了)。
据官方资料,第10季是SG1的最后一季,今年(2007年)夏季会发行一DVD的电影作为终结。
10年时间打造一部经典,让我们在这结束之际,以StarGate中我最喜欢的人物——StarGate核心人物 Dr. Daniel Jackson 来回顾这10年的经典吧,什么都别说,看图说话: ^_^
(因为时间比较紧,手头上有没有SG1全系列的资源,截图粗糙、纰漏之处大家包涵了,意思一下就行了 :))

94电影版中 James Spader 饰演的 Dr. Daniel Jackson (感觉他满可爱的)





SG1电视剧中 Michael Shanks 饰演的 Dr. Daniel Jackson


..




..



..

..




和Vala终老一生……其实我更看好Adria的(Vala的“女儿”),希望在DVD里可以看到Adria。


..

据官方消息说,如果今年夏季的DVD销量好的话有可能考虑接着出DVD的剧集。so,为了今后还有SG1看,大家行动吧! :D



//EOF Read More...