九天雁翎的博客
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。 -- Paul Graham

3D 图形编程的数学基础(3) 矩阵基本变换

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

这里开始,是真正的与3D图形编程相关的知识了,前两节只能算是纯数学。

 

平移矩阵

要想将向量(x, y, z, 1)沿x轴平移yyyy_html_1d45df16个单位,沿y轴平移yyyy_html_m6cec65e6,沿z轴平移yyyy_html_m63b4a2d4个单位,我们只需要将该向量与如下矩阵相乘。

N(p) = yyyy_html_m1964a5f8[4]

从中可以看出4*4矩阵N中的N41,N42,N43分别控制其在x轴y轴z轴上的平移单位.

yyyy_html_m75c5e44f是单位矩阵,我们已经知道,乘以其他矩阵相当于没有乘的家伙。这个矩阵就是从单位矩阵稍微变下型,多了第4行的几个值。我们先来看yyyy_html_1d45df16为最后结果做出的贡献,向量M(x,y,z,1)与矩阵N(p)相乘后,最后X坐标的值(也就是矩阵M11的值)为x*1 + y*0 + z*0 + 1*px = x + px。(套一下矩形相乘的公式)

y,z的公式一样,就不多说了。这里可以看到,对于实施矩阵平移计算来说,需要将原向量(3维)扩充的一维(一般用w表示)设为1,不然的话,上述x坐标=x*1 + y*0 + z*0 + 0*px=x,也就是说,完全不会改变原矩阵了。

GNU Octave(matlab) 验证一下:

> p = [1,0,0,0;0,1,0,0;0,0,1,0;2,3,4,1]
p =

   1   0   0   0
   0   1   0   0
   0   0   1   0
   2   3   4   1

octave-3.2.3.exe:6:d:/Octave/3.2.3_gcc-
> x
x =

   1   2   3   1

octave-3.2.3.exe:7:d:/Octave/3.2.3_gcc-
> x * p
ans =

   3   5   7   1

octave-3.2.3.exe:8:d:/Octave/3.2.3_gcc-

x = 2 + 1 = 3,依次类推,结果正确。

在irrlicht中,平移矩阵的代码直接偷懒。。。。。利用了上述公式的推导结果,转换后的x值为x+px。。。。汗-_-!,理论和实际果然还是有差距的。不过想想,说来也是,一个加法就可以完成的平移,为啥非要整个矩阵乘法去完成?此公式的存在就让人郁闷。。。难道仅仅是因为需要的是用矩阵进行的计算。。。。。。

template <class T>
inline void CMatrix4<T>::translateVect( vector3df& vect ) const
{
    vect.X = vect.X+M[12];
    vect.Y = vect.Y+M[13];
    vect.Z = vect.Z+M[14];
}

D3D中利用函数:

// Build a matrix which translates by (x, y, z)
D3DXMATRIX* WINAPI D3DXMatrixTranslation
    ( D3DXMATRIX *pOut, FLOAT x, FLOAT y, FLOAT z );

实现矩阵的平移,具体方式不明。

 

缩放矩阵

我们将一单位矩阵沿X轴缩放X倍,Y轴缩放Y倍,Z轴缩放Z倍,可令该向量与下列矩阵相乘。

html_html_m2794d7de

按公式推导:X(M11)坐标值为X*x+y*0+z*0+0*0=X*x

y,z的推导类似。

GNU Octave(matlab):

> x = [1,2,3,0]
x =

   1   2   3   0

octave-3.2.3.exe:6:f:
> p
p =

   2   0   0   0
   0   3   0   0
   0   0   4   0
   0   0   0   1

octave-3.2.3.exe:7:f:
> x * p
ans =

    2    6   12    0

结果正确。其实看了实现的源代码后也会发现这种公式还是没事找事,事实上直接乘多省事啊。

irrlicht中利用下面的实现来构造一个缩放矩阵:

    template <class T>
    inline CMatrix4<T>& CMatrix4<T>::setScale( const vector3d<T>& scale )
    {
        M[0] = scale.X;
        M[5] = scale.Y;
        M[10] = scale.Z;
#if defined ( USE_MATRIX_TEST )
        definitelyIdentityMatrix=false;
#endif
        return *this;
    }

 

D3D中利用下面的实现完成缩放运算,直接乘就好了。。。。。。

D3DXINLINE D3DXVECTOR3* D3DXVec3Scale
    ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, FLOAT s)
{
#ifdef D3DX_DEBUG
    if(!pOut || !pV)
        return NULL;
#endif

    pOut->x = pV->x * s;
    pOut->y = pV->y * s;
    pOut->z = pV->z * s;
    return pOut;
}

 

 

旋转矩阵:

旋转矩阵是在乘以一个向量的时候有改变向量的方向但不改变大小的效果的矩阵。旋转矩阵不包括反演,它可以把右手坐标系改变成左手坐标系或反之。所有旋转加上反演形成了正交矩阵的集合。需要注意的是,进行旋转变换时,扩充3维向量的办法是令w=0;

我们可用如下3个矩阵将一个分量分别绕着x,y,z轴顺时针旋转θ弧度。

X(θ) = yyyy_html_m5a3e8644

Y(θ) = yyyy_html_6d8ae198

Z(θ) = html_html_3de18d4c

还是先看第一个公式,向量M(x,y,z,0)与矩阵X(θ)相乘后,最后X(M11)坐标值为x*1+y*0+z*0+0*0=x,Y(M12)坐标值为x*0+y*cosθ+z*(-sinθ)+0*0 = y*cosθ + z * (-sinθ),Z(M13)坐标值为x*0+y*sinθ+z*cosθ+0*0 = y*sinθ + z*cosθ,w(m14)坐标为x*0+y*0+z*0+0*1 = 0。

这个就复杂了。。。。。不太好直观的看到验证的结果,我们将其收到2维去看结果。

我们利用GNU Octave(matlab) 的compass命令在2维空间中直观的显示出向量x = [ 1, tan(pi/3), 0, 0](实际显示在x,y平面中)

我们用其围绕Z轴顺时针旋转30度时,方式是乘以θ为30的如上矩阵,结果如下:

image

 

> a = pi / 6
> p = [cos(a),sin(a),0,0;-sin(a),cos(a),0,0;0,0,1,0;0,0,0,1]
p =

   0.86603   0.50000   0.00000   0.00000
  -0.50000   0.86603   0.00000   0.00000
   0.00000   0.00000   1.00000   0.00000
   0.00000   0.00000   0.00000   1.00000

octave-3.2.3.exe:26:f:/Octave/3.2.3_gcc-4.4.0/bin
> x = [1, tan(pi/3), 0, 0]
x =

   1.00000   1.73205   0.00000   0.00000

octave-3.2.3.exe:27:f:/Octave/3.2.3_gcc-4.4.0/bin
> x2 = x * p
x2 =

   0.00000   2.00000   0.00000   0.00000

octave-3.2.3.exe:28:f:/Octave/3.2.3_gcc-4.4.0/bin
>

精确的30度。

irrlicht中设置旋转矩阵就有学问了:

    template <class T>
    inline CMatrix4<T>& CMatrix4<T>::setRotationRadians( const vector3d<T>& rotation )
    {
        const f64 cr = cos( rotation.X );
        const f64 sr = sin( rotation.X );
        const f64 cp = cos( rotation.Y );
        const f64 sp = sin( rotation.Y );
        const f64 cy = cos( rotation.Z );
        const f64 sy = sin( rotation.Z );

        M[0] = (T)( cp*cy );
        M[1] = (T)( cp*sy );
        M[2] = (T)( -sp );

        const f64 srsp = sr*sp;
        const f64 crsp = cr*sp;

        M[4] = (T)( srsp*cy-cr*sy );
        M[5] = (T)( srsp*sy+cr*cy );
        M[6] = (T)( sr*cp );

        M[8] = (T)( crsp*cy+sr*sy );
        M[9] = (T)( crsp*sy-sr*cy );
        M[10] = (T)( cr*cp );
#if defined ( USE_MATRIX_TEST )
        definitelyIdentityMatrix=false;
#endif
        return *this;
    }

为了解释这个函数的作用,看看下列程序:

#include "irrlicht.h"
#include <math.h>

#pragma comment(lib, "Irrlicht.lib")

using namespace irr;
using namespace irr::core;

int _tmain(int argc, _TCHAR* argv[])
{

    f32 a = 30;
    f32 M[16] = { 1, 0, 0, 0, 
                  0, 1, 0, 0,
                  0, 0, 1, 0,
                  0, 0, 0, 1};
    matrix4 mt;
    mt.setM(M);

    vector3df vec(0.0, 0.0, PI / 6);

    mt.setRotationRadians(vec);

    for(int i = 0; i < 4; ++i)
    {
        for(int j = 0; j < 4; ++j)
        {
            printf("%.6f/t", mt(i, j));
        }
        printf("/n");
    }


    return 0;
}

运行结果为:

0.866025        0.500000        -0.000000       0.000000
-0.500000       0.866025        0.000000        0.000000
0.000000        0.000000        1.000000        0.000000
0.000000        0.000000        0.000000        1.000000

看到是啥了吗?没错,就是GNU Octave(matlab) 那个例子中的矩阵:

p = [cos(a),sin(a),0,0;-sin(a),cos(a),0,0;0,0,1,0;0,0,0,1]

事实上,上面程序中的vec表示不绕x,y轴旋转,绕Z轴旋转PI/6,实际的作用就是构造了上述的矩阵P。

上述矩阵通过以下成员函数应用以使用生成的矩阵,其实就是乘法-_-!

template <class T>
inline void CMatrix4<T>::rotateVect( vector3df& vect ) const
{
    vector3df tmp = vect;
    vect.X = tmp.X*M[0] + tmp.Y*M[4] + tmp.Z*M[8];
    vect.Y = tmp.X*M[1] + tmp.Y*M[5] + tmp.Z*M[9];
    vect.Z = tmp.X*M[2] + tmp.Y*M[6] + tmp.Z*M[10];
}

//! An alternate transform vector method, writing into a second vector
template <class T>
inline void CMatrix4<T>::rotateVect(core::vector3df& out, const core::vector3df& in) const
{
    out.X = in.X*M[0] + in.Y*M[4] + in.Z*M[8];
    out.Y = in.X*M[1] + in.Y*M[5] + in.Z*M[9];
    out.Z = in.X*M[2] + in.Y*M[6] + in.Z*M[10];
}

//! An alternate transform vector method, writing into an array of 3 floats
template <class T>
inline void CMatrix4<T>::rotateVect(T *out, const core::vector3df& in) const
{
    out[0] = in.X*M[0] + in.Y*M[4] + in.Z*M[8];
    out[1] = in.X*M[1] + in.Y*M[5] + in.Z*M[9];
    out[2] = in.X*M[2] + in.Y*M[6] + in.Z*M[10];
}

上面程序后加上如下几句,使用上面刚生成的矩阵:

vector3df x(1.0, tan(PI/3), 0.0);
mt.rotateVect(x);

printf("x = [%f, %f, %f]/n", x.X, x.Y, x.Z);

输出结果:

x = [-0.000000, 2.000000, 0.000000]

与通过GNU Octave(matlab) 的一样,精确的30度旋转。

与旋转有关的还有vector的几个函数:

//! Rotates the vector by a specified number of degrees around the Y axis and the specified center.
/** /param degrees Number of degrees to rotate around the Y axis.
/param center The center of the rotation. */
void rotateXZBy(f64 degrees, const vector3d<T>& center=vector3d<T>())
{
    degrees *= DEGTORAD64;
    f64 cs = cos(degrees);
    f64 sn = sin(degrees);
    X -= center.X;
    Z -= center.Z;
    set((T)(X*cs - Z*sn), Y, (T)(X*sn + Z*cs));
    X += center.X;
    Z += center.Z;
}

//! Rotates the vector by a specified number of degrees around the Z axis and the specified center.
/** /param degrees: Number of degrees to rotate around the Z axis.
/param center: The center of the rotation. */
void rotateXYBy(f64 degrees, const vector3d<T>& center=vector3d<T>())
{
    degrees *= DEGTORAD64;
    f64 cs = cos(degrees);
    f64 sn = sin(degrees);
    X -= center.X;
    Y -= center.Y;
    set((T)(X*cs - Y*sn), (T)(X*sn + Y*cs), Z);
    X += center.X;
    Y += center.Y;
}

//! Rotates the vector by a specified number of degrees around the X axis and the specified center.
/** /param degrees: Number of degrees to rotate around the X axis.
/param center: The center of the rotation. */
void rotateYZBy(f64 degrees, const vector3d<T>& center=vector3d<T>())
{
    degrees *= DEGTORAD64;
    f64 cs = cos(degrees);
    f64 sn = sin(degrees);
    Z -= center.Z;
    Y -= center.Y;
    set(X, (T)(Y*cs - Z*sn), (T)(Y*sn + Z*cs));
    Z += center.Z;
    Y += center.Y;
}

事实上这些函数就是前面两步的一步实现,实际就是利用了上述公式推导最后的结果,可以去对比一下。

比如下列代码:

vector3df x(1.0, tan(PI/3), 0.0);
x.rotateXYBy(30);

printf("x = [%f, %f, %f]/n", x.X, x.Y, x.Z);

输出:

x = [-0.000000, 2.000000, 0.000000]

就是前面通过两步得出的结果。上面irrlicht代码需要注意的是,参数是degree是表示单位是度数,其他时候都默认为弧度。

D3D中使用下列函数实现旋转,没有实现源代码,没有太多好说的。

// Build a matrix which rotates around the X axis
D3DXMATRIX* WINAPI D3DXMatrixRotationX
    ( D3DXMATRIX *pOut, FLOAT Angle );

// Build a matrix which rotates around the Y axis
D3DXMATRIX* WINAPI D3DXMatrixRotationY
    ( D3DXMATRIX *pOut, FLOAT Angle );

// Build a matrix which rotates around the Z axis
D3DXMATRIX* WINAPI D3DXMatrixRotationZ
    ( D3DXMATRIX *pOut, FLOAT Angle );

 

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

更改windows live writer的本地保存目录

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

这个世界上总是有很多片让人不爽的事情,很多事情我们没有办法改变,因为程序员也没有办法控制世界的改变,虽然事实上我们在改变着世界,但是,只要这个让人不爽的事情发生在电脑上,那么,作为程序员,我们就能让这个不爽变得极爽。。。。。。呵呵,此为一例,原文来自:http://www.ditii.com/2009/01/30/guide-to-move-windows-live-writers-my-weblog-posts-folder-onto-a-seperate-location/

百度知道上:http://zhidao.baidu.com/question/63748594.html

极为误导,枪毙之。有人有百度账号的话给他回复一下,别继续误导人了。

我仅仅是大概翻译一下:

1.都是先将整个目录拷贝到你想要放在的位置。

2.

Vista/Win 7 用户:

命令行下:

mklink /D “目前本地保存目录” “你想要的新的保存目录”

Windows XP用户痛苦点(比如我)

先下个Junction,(好像是微软官方提供的)

junction “目前本地保存目录” “你想要的新的保存目录”

其中,目前本地保存的目录就是Windows live writer默认的那个My Weblog Posts

我将其放在了DropBox的目录里面。。。。。。。。。不会丢失辛苦的劳动成果了。

 

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

3D图形编程的数学基础(1)-向量及其计算

因为大学时在高等数学课程中学习过线性代数相关的内容, 所以学习3D编程的时候这一段事实上是跳过去了, 学习到某些内容的时候觉得很郁闷, (4, 5年没有用了, 难免忘掉)最后常常依靠高级API完成, 但是事实上这些高级API的算法具体实现啥的基本看不懂, 于是还是决定回来好好的将基础部分弄明白, 当然, 首先是数学部分. 为了更好的达到直观的效果, 还有在复杂矩阵运算的时候验证运算结果, 将引入MATLAB的使用. 具体牵涉到计算的时尽量实现DirectX与Irrlicht两个版本, 也会参考部分源代码. (主要用于看看公式用C/C++的实现)基本上, 我希望能以概念的讲解为主, 最好是直观的讲解.

阅读全文....

谷歌金山词霸是完全免费的吗?谷歌自己的软件呢?

write by 九天雁翎(JTianLing) -- www.jtianling.com


讨论新闻组及文件

缘起

在中国有多少人关心一个软件是否免费?有人关心吗?有的,我以前寻找优秀的免费软件常常到“善用佳软

”中看推荐,对于自己工作效率的提高有很多帮助,但是最近我换了新工作,因为是外企,使用软件的版权限制比以前会更加严格,不仅仅是不能使用盗版,而且要求此软件不仅仅是个人免费,还需要是商业使用免费的才能在公司使用,这样,“善用佳软

”这样的网站就不能起到帮助我的作用,甚至容易起误导作用了。。。。。。因为有太多的软件是表明个人使用免费并且不允许商业使用的,却又往往夹着100%免费软件的口号推广(最典型的就是谷歌金山词霸了,所以多讲了点)。。。。。。。其实本文是为“个人使用,商业使用都免费的常用软件列表”作的。。。。。算作前篇吧。特别是为身处相同环境的人提个醒,不论事实上一些软件看起来多么号称“免费”,还是不一定能在企业环境中使用。

原来我有个类似的使用软件列表,见《程序员手中的利器(1)--工欲善其事必先利其器
》,那时候对软件使用比较随便。。。。因为新公司对软件使用的版权限制很严,所以,我自己也需要一份可以免费商业使用的日常软件列表,(准备以后完成一个)以防不注意掉进版权的漩涡之中。。。。。要是以前,我写这样的文章那自然是被人骂“莫装B,装B被雷劈”了,现在是有这个真实的需求。事实上,为了维持工作环境的尽量统一,我是尽量保持公司家里一套软件环境而不是公司一套家里一套,这样会很麻烦,比如会碰到公司的openoffice文档在家里没有办法用office来编辑和查看的问题。

 

开源版权与自定免费版权

首先,让我们了解各种版权(以前有人关心吗?)你知道什么是GPL
,LGPL
,BSD,MIT……….吗?对于使用来说,类似的开源协议软件是我们的首选,因为此类软件的日常使用(不开发就不需要了解各个开源协议的不同了)肯定不会有版权纠纷,此类协议的设计宗旨之一就是free(自由) to use(当然,不仅仅是这一点),虽然很多次的强调了此free仅仅表示自由,但是现实中,选择此类协议的软件即便收费也都是靠服务收费的,也就是说,个人使用,即使是商用,你不寻求服务,也是免费和自由的,(有的pro版例外,我们也不追求这个)我选择软件时肯定也是尽量选择GPL协议(或其相容协议)的开源软件的。。。。。

其次,自定的免费协议,这类协议需要特别注意,一不小心就会掉进版权的陷阱之中,此类软件比较多,需要非常小心,比如谷歌金山词霸,这是最最典型的,

入选“Google 软件精选
”的一个软件,什么是“Google 软件精选”?原主页描述如下:

image

永久免费?aha?

还有说明的文字:

关于软件精选: 免费程序

Google 软件精选中的所有软件都是免费的。 有些程序可能提供付费版本以提供其他功能或正在进行的更新,但您可以选择不安装这些付费版本。
Google 软件精选中的 Spyware Doctor 和 Norton Security Scan 版本均包含订阅,可以进行自动更新。这些更新可让程序找出并消除新的威胁因素,并且用户可以免费使用这些更新。 虽然通过这些更新可以升级到付费版本,但您可以继续使用 Google 软件精选提供的免费版本(只要您已安装了这些免费版本)。

在谷歌金山词霸的主页上有更多类似“免费”的标志:

image6

主页光是一个title的图片就是3个免费。。。。。。。。。。

主页下载链接:

image12

纵观金山词霸全网,都是推荐产品的广告,竟然没有任何产品的licence信息说明。。。。。。(去看看国外的软件网站,必有)

好吧,好吧,既然谷歌和金山都说谷歌金山词霸免费,一个是永久的免费,一个是完全的免费,又没有任何版权说明,那应该就是免费了吧,下一个来用用吧,我去华军这个国内下载速度快的网站去下(上面也有版权提示信息的,而且没有一般没破解版和病毒),一看:

image15

好啊,免费版,下呗。。。。。。。。。。。。。。

 

安装时有个协议:

image21

这个框很小,放不大,只能拖动滚动条,看完累死你,我还需要将其全部选中,然后拷贝出来查看才会方便点。(一般的协议窗口好像都有这样的毛病。。。。其实都当自己是摆设来着)

其中,金山部分第1条:

1.  在一台个人所有计算机、工作站、终端机、手持式计算机或其它数字电子仪器(“计算机”)上安装、使用、显示、运行(“运行”)本“软件” 的一份副本。本“软件”仅供个人所有计算机使用,不得用于法人或其他组织(包括但不限于政府机关、公司、企事业单位、其他组织等;无论该组织是否为经济性组织;无论该组织的使用是否构成商业目的使用)所有计算机。如若个人所有计算机长期固定为法人或其他组织服务,则将被视为“法人或其他组织所有计算机”,无法享受本授权。任何超出上述授权范围的使用均被视为非法复制的盗版行为,金山软件保留权利要求相关责任人承担相应的法律责任包括但不限于民事责任、行政责任、刑事责任。

简而言之,谷歌金山词霸仅限个人使用,不允许商业使用,即使是公共机构的电脑上都不允许使用(不作为商业用途也不行),我不知道谷歌和金山是怎么理解“永久免费”和“完全免费”这两个词的意思。。。。。谷歌金山词霸就太搞了,平时使用的时候一堆堆的无聊信息自动弹出就算了,免费的嘛,结果还是个人免费。。。。。。

其实作为软件开发人员,对中国人没有养成软件的付费习惯这种事情也是很郁闷的,在中国这种大环境下,客户端软件走免费路线,极大的扩大用户群,然后赚增值服务费用和广告费是比较靠谱的做法,对于那些勇于免费的优秀软件我也是很欢迎的,可是见不得谷歌金山词霸这样。。。。。到处说免费,还“永久免费”,“完全免费”来着,那就算了,当是夸大广告推广吧,主页连个版权说明都没有,直到下载回来了,还得仔细的往那么一个小框中的协议中找,才能知道原来此软件仅仅是个人免费的。。。。。。。希望即便是作为免费的推广,你也标志清楚吧?网站连个版权信息都没有,必须等你下载回来安装了才能知道,这样太郁闷了。

 

Google也是个人使用非商业?

这事情到这里不算完,假如仅仅是金山词霸就算了,中国的公司嘛,我什么事情都看惯了,问题是,这次是谷歌金山词霸,入选谷歌软件精选软件的软件,谷歌什么时候开始推广个人免费企业禁用的软件了?你听说过?Google Chrome,Google Gmail,Google Doc,Google Note,Google Calendar只允许个人使用吗?(其实上述软件在Google软件精选中是列入Google企业应用套件的。。。。。。不允许企业使用的企业应用套件有价值吗?。。。。。。。)

这点我很有疑问,于是我查看了一下Google软件精选安装时的协议(最近协议看了无数,头都大了)

最接近的一条是:

您完全理解并同意:

    D) 本软件不能用于以下场合:核设施、生命支持系统、紧急通讯、飞行器导航或通讯系统、空中交通控制系统,或软件故障可能导致死亡、个人伤害或严重人身或环境损害的任何活动。

全文“非商业”一词仅出于:

18. Google 地球的其他规定

    B) 软件的使用。对于个人最终用户,仅可根据此处的服务条款和 Google 地球软件文档的规定下载本软件,并出于个人的、非商业的目的而使用本软件。对于企业实体最终用户或政府实体最终用户,您和您的员工可依照此处的服务条款和 Google 地球软件文档的规定在内部使用本软件(个人最终用户、企业最终用户和政府最终用户在本协议中统称为“您”)。除非您已经得到 Google 的特别许可,否则不得出于下列用途或与之有关的用途将 Google 地球软件和交通工具中安装的、以其他方式连接的或与之通信的任何产品、系统或应用程序结合起来使用,这些用途包括:(a) 实时路线导航(包括但不限于按转弯路口提供的分步路线导航和通过传感器启用的其他路线导航);(b) 任何用于自动或自主控制交通工具行为的系统或功能;或 (c) 调度、车队管理或类似应用。您不得使用本 Google 地球软件使自己或其他任何人能够对纬度和经度数字坐标进行批量下载和收录。

也就是说,注意了Google地球是不允许在企业使用的,但是Google软件精选的其他软件是允许的,但是不准在“软件故障可能导致死亡、个人伤害或严重人身或环境损害的任何活动”中使用而已。。。。。。(当然,我们事实知道,谷歌金山词霸是不允许的),这点,中文的协议让我很郁闷。。。。。。。。。。。既然谷歌金山词霸是非商业的为啥作为入学谷歌软件精选的软件在此不做额外声明?这不是拉着别人往火坑中跳吗?就这一点来说,我可以认为谷歌中国工作有不严谨的地方。(即使不说这是他们工作的严重问题)

这是Google中国,我很怀疑Google是否一直这样,就这样的工作风格和态度怎么能做成全球知名企业,(事实上,作为一名软件开发人员,我是典型的Google fans,因为原来Google App只能使用Python,我甚至因此学习了Python)我决定上Google 英文网站上一探究竟。。。可惜的是,Google 英文网站上没有将谷歌金山词霸入选软件精选(看来这个东西是谷歌公司各国自己搞的了)

谷歌软件精选的英文的协议有如下条款:

Open source software licenses for Google source code constitute separate written agreements.
To the limited extent that the open source software licenses expressly supersede these Terms and Conditions, the open source licenses govern your agreement with Google for the use of Google products or specific included components of Google products.

The Google Software, and any portion thereof, and the Third Party Software, and any portion thereof, are referred to herein as the "Software."
1. USE OF SOFTWARE

The Software is made available to you for your personal, non-commercial use only.
You may not use the Google Software in any manner that could damage, disable, overburden, or impair Google's search services (e.g., you may not use the Google Software in an automated manner), nor may you use Software in any manner that could interfere with any other party's use and enjoyment of Google's search services or the services and products of Third Parties. "Third Parties" means the third party licensors of the Software.

英文软件精选的版权说明就很明确的说明了,除了开源软件额外有版权说明的,其他软件都是仅允许个人使用,非商业的。。。。。

这点也与我对Google的传统形象有所区别,可能毕竟Google软件精选不是完全是Google自家的产品,只能在此放弃了企业用户了吧。。。当然,其他纯Google自家的产品,除了Google地球(可能的确是想靠为一些导航设备或者手机授权赚钱),还是能放心的使用的。

到此,对谷歌金山词霸不能商业使用表示理解,但是,对Google中国的不明确表示和谷歌金山词霸的网站无版权说明还是不理解。。。或者是,他们自己本身就没有期望在中国会有人仔细的看这些长篇大论的协议?

民众没有了版权意识的确是中国软件行业最可悲的事情之一,但是,当企业在中国也慢慢失去了版权意识,甚至不知道什么时候应该提示版权,不知道在什么地方应该明确的标志版权,这才是中国软件行业最最可悲的事情。

 

在今天早上再次去看Google中的软件精选安装时的声明时发现有以下条款:

本软件提供给您仅限于个人的、非商业性质的用途。您在使用 Google 软件时不得以任何方式损害、破坏、过载或消弱 Google 的搜索服务(例如:您不得以自动方式使用 Google 软件),也不得干扰他人使用和享受 Google 的搜索服务或第三方的服务和产品。“第三方”是指软件的第三许可方。

我昨天可能看漏了然后错怪Google中国了-_-!表示抱歉,然后修改题目。。。。。。。。。。

 

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com


阅读全文....

从C++到JAVA,C++程序员学习JAVA的指南(2)

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

Technorati 标签: ,,

JAVA is not just another programming language. -- 匿名

学习更新的语言,有助于了解别人对旧语言有哪些不满。 -- 匿名

 

前言

先说明本文的行文习惯,文章写作流程以本人阅读《Java Programming Language》为顺序,一般以一个本人认为值得讲的JAVA与C++不同的特性为一个小节,每小节尽量以JAVA的新特性为标题,首先对比C++,JAVA,Python三者在此上的区别,然后展开讨论。因为没有人能够在每个领域都成为专家,本人也是Python知识浅薄,并且新学JAVA,C++也不过学了2,3年,以此学习方式纯粹为了对比学习,没有厚此薄彼之意。虽然本人常常几书在手,时常查阅,但是文中技术的硬伤因为本人的水平也就这样,估计难以避免,也请大家指正。

 

1.原生整数类型的大小确定

C++ -- 类型大小一般规定最小值,整数类型丰富

JAVA -- 完全由标准定死原生整数类型的大小,整数类型丰富

Python -- 整数仅分标准整形和长整形,标准整形长度不确定,长整形

JAVA的这个特点不算是太大的改动,但是比起C++来说实在是更为方便。C++继承了C的传统,标准中原生类型都仅仅是建议最小的大小,具体多大的权利留给了编译器,因为这种特性,流行着一句"一百家编译器厂商就有一百种C++”的话。所以在C++中,我们通过typedef来获取自己一般想要的大小,(到时候想要改也方便)减少int的使用转而使用长度更加确定的short,long,去减少整数类型大小不确定带给我们可移植性的问题。

事实上,这种特性可能是考虑到不同硬件对不同大小的值执行速度上的差异,比如16位机器一次处理16位整数的效率最高,32位的机器是32位,而64位则是64位,C++作为一门没有完全脱离硬件并且不放弃底层开发市场的语言,无法不考虑这一点,所以才有int的出现,用此类型来自适应当前机器最适合的类型,其他类型也没有强行的规定死,导致了sizeof的使用常常难以避免,特别是在数组等长度的计算时,sizeof的使用简直就是标准用法,JAVA抛弃了这种用法,确定了所有原生类型的大小,在一定程度上简化了程序代码。

Python的原生整数类型基本上完全使用标准整形,并且与支持无限长度的长整形可以默认转换,比JAVA的做法更加激进,事实上使用更加方便,最最重要的是解决了C++,JAVA都存在的数值溢出问题。但是提供给程序员的选择少了,方便是方便了,对于内存的精打细算的歪脑筋也没有办法打了。。。。

数值溢出问题就更是一个大问题了,多少不正常的歪门邪道就由此而来啊,在定义数值的时候因为没有预计到原来可能的规模,最后不得已需要扩大,在大规模程序中也实在是噩梦一场。(我在工作中就碰到过不止一次)而程序员数量较多时,对同一个意义的值使用了不同整数类型,相互之间传递时的溢出Bug,也是相当难以调试,也会使得明明经过自己单元测试的模块最后出现问题,这些,也许就只能放在Python的激进中,通过割舍了节省内存的手段才能解决了。在C++和JAVA中,可能需要更多对程序员的规定才能稍微缓解此情况。

 

2.去掉了无符号整数的使用

C++ -- 整数类型可选择有无符号

JAVA -- 完全由标准定死原生整数类型全部为有符号

Python -- 全部有符号

C++中可以由unsigned选择某个整数类型是否是无符号,默认为有符号。虽然遵循着整形提升的原则,但是有无符号可以在计算中自动转换,常常导致问题,这一点在《C专家编程》1.10中Peter Van Der Linden有过描述,并且推荐大家不要在代码中使用无符号类型,以免增加不必要的复杂性,但是事实上,在我的工作经历中,公司对无符号的使用还是较多,特别是对于那些不存在负数的值,甚至还偏向于使用无符号整数。但是,也不能将无符号整数说的一无是处,在位运算时,特别是位的偏移运算,无符号整数可以让我们减少对多情况的考虑,简化代码,在《C专家编程中》也是推荐只有在使用位段和二进制掩码时,才可以使用无符号数。

对于符号的问题,本人使用C++中最为印象深刻的是另外的问题。(也不能全部定性为有无符号带来的问题)工作中,很多遗留的代码喜欢用-1来表示一个无符号数的最大值,事实上,这样做仅仅当类型是int时才是安全的,其他情况下的确能够获取到最大的无符号数,但是比较的时候却会带来问题,不知道的话也常常会在调试时陷入郁闷当中,当时开发的程序常常通过网络通信(服务器端的程序嘛),更加加大了问题的严重性,我甚至还帮同事调试过几个这样的问题。

比如下面这个例子:

#include 
using namespace std;

int main()
{
    unsigned int d = -1;
    cout <<d <<endl;

    if(d == -1)
    {
        cout <<" d == -1" <<endl;
    }
    else
    {
        cout <<" d != -1" <<endl;
    }

    unsigned short s = -1;
    cout <<s <<endl;

    if(s == -1)
    {
        cout <<" s == -1" <<endl;
    }
    else
    {
        cout <<" s != -1" <<endl;

        if(s == (unsigned short)-1)
        {
            cout <<" s == (unsigned short)-1" <<endl;
        }
        else
        {
            cout <<" s != (unsigned short)-1" <<endl;
        }
    }

    return 0;
}

会输出:

4294967295

d == -1

65535

s != -1

s == (unsigned short)-1

注意了,在C++中,unsigned short用-1赋值后,在与-1的比较中是不为真,这种情况的避免一般可以通过两种方式,一种是在所有的-1使用中全部加上确定的类型,如上面示例中所示,另一种就是全部弃用-1,而是使用0xFFFF…..的形式代替。

统一了符号后,这些问题自然不会存在了。

 

3.类成员变量默认初始化+使用栈上未初始化的变量无法通过编译

C++ -- 使用未初始化的变量时,此变量值不确定,实际使用内存中的残留数据,类及栈上的使用一样

JAVA -- 类成员变量默认初始化+使用栈上未初始化的变量无法通过编译

Python -- 动态类型语言,变量不需声明,使用未定义的变量一律抛出运行时异常,NameError

C++的行为简直人神共愤。。。。。。。呵呵,当然,事实上,公司和C++使用者们就多出了很多规定了避免此事,比如使用变量时一律先初始化,哪怕马上就要用到了,比如分配了内存一律先memset,使用了数组一律先={0},使用指针,一律先=NULL,并且,推迟变量的定义,直到使用时然后才定义变量,以防忘记初始化。

事实上,个人认为还是效率上的考虑让C++如此,(也许因为继承了C)假如都能像JAVA这样不把效率作为己任,C++要更好的多,C++的设计哲学里,可以不初始化的变量,为啥一定要先初始化?呵呵,在C语言所有变量必须在块的前面定义时,给每个变量一个无意义的初始值,也的确是有消耗的。

不用多说了,又是一例方便了程序员(但是耽误了效率)的改进。

 

4.数组本身包含长度信息

C++ -- 原生数组本身无长度信息,但是Vector等容器有

JAVA -- 数组本身包含长度信息

Python -- 数组本身包含长度信息

C++中的原生数组不包含除本身元素外的任何信息,这种方式与C兼容,但是说实话,并不是太好用,使得使用数组的时候有诸多不便,比如传递参数时就需要额外指定一个方式来表示结束方式,要么传长度,要么传结束指针,要么如字符串以零结尾,都不算太好,虽然在STL中提供了Vector作为替换方案,但是使用中,常常因为各种因素(与C兼容,节省内存等),还是常常使用原生数组,但是,说实话,习惯了这种思维,其实也不是什么问题了,当然,对于初学者来说,JAVA,Python这种万物皆对象,数组本身就是一个类对象的方式会更容易接受一些,事实上,最简单的来说,传递参数的时候参数数量会少一些,使用也简单,难以出错一些。

 

5.数组访问范围检测

C++ -- 数组访问范围不检测,部分实现可提供可选检测

JAVA -- 数组访问范围检测,越界时,抛出ArrayIndexOutOfBoundsException异常

Python -- 数组访问范围检测,越界时抛出IndexError: tuple index out of range

数组访问范围检测不会让C++中常见的越界访问问题得到彻底解决,仅仅是运行时碰到时会抛出异常,方便了调试和发现问题。因为此类问题虽然可以通过良好的习惯尽量避免,但是一旦出现非常难以调试,难到出现莫名其妙的Bug时,公司的资深程序员第一反应就是数组访问越界导致的问题(其实相对来说比率还是比较小的),所以我很还是比较支持这种运行时检测的,但是面试时现在公司的程序员老大说当我用了JAVA后就知道JAVA的数组访问有多么慢了,并且认为很大的原因就是因为运行时的范围检测,因为刚接触JAVA,是对是错,我暂时也不敢肯定,但是此话应该有参考价值。

 

后记:

此文是当时刚刚通过新公司的面试还没有进入公司的时候写的,因为还没有完善,一直没有发布,当时以为自己在新公司会使用JAVA,所以趁还没有进入公司现巩固一下(对JAVA的了解很少,仅大概看过《Thinking in JAVA》一书),但是事实进入公司以后,还是做C++的工作。。。。。。。所以,此系列,未完善的文章也先发布了,无意外的话,此系列还就此终结了。。。。。。。。。。。。(假如以后有闲工夫或者工作真的换的时候再开始也未必可知)

 

 

 

参考资料

1.《Thinking In JAVA》,英文版,第4版,Bruce Eckel著,机械工业出版社

2.《JAVA Programming Language》,英文版,第4版,Ken Arnold,James Gosling,David Holmes著,人民邮电出版社

3.《JDK 6 Documentation》,JAVA在线文档集合

4.《The Java Language Specification, Third Edition

5.《Java™ Platform, Standard Edition 6 API Specification

6.《C专家编程》,Peter Van Der LinDen著,徐波译,人民邮电出版社

7. 《Python核心编程》,Wesley J. Chun著,宋吉广译,人民邮电出版社

 

 

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

Google 在 IE , FireFox,Chrome 中的有趣不同点

write by 九天雁翎(JTianLing) -- www.jtianling.com


讨论新闻组及文件

 

因为平时很少用IE了(一般只在迅雷看看中使用),所以虽然天天用Google n次的n个功能,但是平时还真没有注意到,不知道是最近改的,还是一直这样,不知道你注意到这些有趣的细节没有?

IE8中的Google:

image21

FireFox3中的Google:

image9

Chrome4中的Google:

image6

 

看出区别了吗?截图看不出来就实际的去试试,IE的Google主页明显是3个中最丑的(因为我不习惯吗?)。。。。

其一,从页面设计上来说,以简洁的风格搭配浅色调为主,Firefox和Chrome中的按钮都是白色的,比较搭配,IE中那两个蓝色的按钮太丑了!!!与整体的页面风格根本不配嘛。。。。。

其二,Google的LOGO在Firefox和Chrome中都是有阴影的,所以颜色显得柔和一些,立体感也更强一些,类似于3D加光照,而IE中的LOGO完全就是用颜色涂的2D文字。。。。。

其三,在IE中右上角常常会显示提示你下载Google Chrome,而且很明确的告诉你,这是一个更快的浏览网页的方式。。。。呵呵,不仅Chrome中没有,firefox中也不会有。。。。

其四,在IE中,搜索栏下面的文字多出一个选项“Make Google your homepage

”,其他两个浏览器都没有。

这是主页的区别,还有个细节,Chrome中,选中编辑框进行文字输入的时候,编辑框的边沿会高亮,Firefox和IE中都不会有这样的特效。自家的东西配自家就是不一样啊。。。。。

下面看搜索:

IE8中的Google搜索:

image24

Firefox和Chrome除了Chrome的编辑框选中时高亮外以下都一样,以下都仅以Firefox4为例:

image33

这里的界面比主页差异更大,有很大的不一样,在IE中有固定的边栏,Firefox/Chrome中需要点击上面的Show options才会有,并且IE中的边栏显示带有图片,Firefox/Chrome中的就仅仅只有文字。这个差异很大,以前看新闻说这将是Google的新UI,但是现在看来这是Google在IE中的新UI吧。。。。因为经调查发现IE的用户更喜欢bing的固定边栏?(因为都是MS的风格和产品?)所以Google也在IE中使用固定边栏了?

另外,在IE中拖动边框,编辑框也会跟着改变,而在Firefox和Chrome中不会,这个细节都已经不重要了。

很明显,应该是Google特意为IE制作了一套网页。。。。这么大的变化不太可能是因为浏览器显示差异导致的问题。

呵呵,相对来说,个人感觉,Google明显在Firefox和Chrome中的体验会更好一些。。。。。。。。。这就有个问题了,是MS故意让Google在IE中难看(比如主页),以减少Google的用户,将用户吸引到好看的Bing中呢?还是Google故意将IE中的使用做的难看+麻烦,然后将用户吸引到更好的Firefox和Chrome中呢?呵呵,因为他们竞争的连环性。。。。这个就不好说了。。。。。。

但是,搜索的UI差异应该是Google对使用不同浏览器的用户不同的使用习惯调查后进行的用户划分+产品划分吧。。。。。。。。。

作为比较,bing的firefox版本和IE版本就没有什么区别:(并且,我也没有发现传说中的固定边栏,难道是最近升级升没了?Google哭了)

image37

 

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

我都不知道我为什么要在JAVA过了巅峰的时候学习JAVA-_-!

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

曾经看某文介绍JAVA历史的时候说,JAVA虚拟机的机制曾经被视为设计的败笔,因为当时的硬件条件不佳,JAVA程序慢到让人无法忍受,而现在,随着硬件水平的进步,JAVA现在已经是名副其实的NO.1流行语言,并且以前一般仅作为其他语言补充的脚本语言(如Python,Ruby等)也开始大为流行,而C/C++这种老牌的以效率取胜的语言却在新一代的程序员的责骂中蹒跚前行,不得不让人感叹此一时,彼一时。

作为03级的小本,当年学习了C,在选择下一个语言时选择了名字较为接近,名气在当时也的确很响亮的C++,学习有年,使用颇为顺手,在学习Python,LUA作为脚本语言的补充后却也慢慢感觉到其语言为了效率在语法和语言特性上的牺牲着实过大,然后学习了一下Boost和C++1X标准(现在应该肯定是1X标准了)了解了一下C++更面向高层抽象概念的发展方向,的确,这已经不是一个万事都需要汇编优化,万事都需要了解机器代码的时代了。。。。。时代,在进步啊。。。。。

BS都承认,新出来的语言相比旧语言自然会有其一定的优势,不然新语言的创造者应该打屁股^^,慢慢的C#在Anders的发展下都已经有了自己的一片天空,并且已经是JAVA最直接的强有力竞争者了,现在虽然不能说JAVA已经日薄西山,但是我感觉以SUN被卖为标志,很明显JAVA已经过了其巅峰时代了。。。。。。我在JAVA巅峰时不为其所动,偏偏选择现在开始学习JAVA,也真叫是命运弄人啊。(TIOBE也能看到C#逐月流行,JAVA逐月退步,最新的排行JAVA第一的位置都快不保。)虽然我会感叹工作需要,身不由己。

但是,决定开始学习JAVA的时候,我还是如同以往准备学习一门新语言一样兴奋,这,又是一个新的世界^^可叹的就是,总是自叹学习太杂的我,却一直在越学越杂的路上前行,没有回头路可走。说是工作需求,其实当自己选择这样一份工作的时候,其实就已经为自己选择了这样的道路。当一份沿着以前老路(Linux上的服务器端程序开发),和一条崭新的道路(移动平台上的JAVA程序开发)摆在我的面前时,我最终选择了后者。。。。。。。。

虽然早已接受语言不是最重要的,最重要的是设计,即便是coder,重要的也是编程时的思考和逻辑,但是却还是很容易被一些语言的新的特性所吸引,又会搬出“语言决定了你的思维的广度”这样语言来说服自己去学习,矛盾中,常常屈服于对未知世界(新的语言)的好奇,此时我甚至还会搬出Jobs的"Stay hungry”名言来鼓励自己,回头来看自己走过的路,发现自己从一个出发点,向各个方向都走了一些距离,但是没有一个方向真正走的很远-_-!

我哪,自己都不知道自己要折腾到什么时候才能安分,常以为趁年轻的时候多折腾折腾几门语言,但求知识面能宽一些,对各种语言都能有所了解,以求做到在合适的时候知道该用,并且会用怎样合适的语言,但是又常感慨一入江湖岁月催,征战沙场几人回,不胜人生一场醉#%¥@……¥@#……%¥#这样的选择是对是错,现在是难以分辨。。。。明日即将开始新的工作,留此文以志之。

 

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

迅雷非善类,搜狐需谨慎,浅析迅雷发家史

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

近日按习惯在迅雷看看上看看电影,很多电影,包括首页推荐的电影,已经是如下图所示,被迅雷处理掉了

xunleikankan 这点严重的影响了我正常的看片!

一时间觉得很郁闷,突然想起来最近的搜狐告迅雷侵犯版权的事情了,也明白了为啥这么多页面会不存在了,唉。。。。。真不知道是该支持搜狐还是咒骂搜狐。。。。。。

看看迅雷的历史。

最开始下载类软件是netant的天下(不知道今天还有多少人记得当年那一个一个辛勤的小蚂蚁啊),当时netant靠的是多线程的分割下载方式,在网络非常差的时代,为我们提供了非常优秀的下载速度,市场趋于稳定后,也没有见有太大的改变了。但是flashget横空出世,因为提供了一样优秀的下载速度,并且引入了下载分类管理等创新功能(就我的记忆,在中国当时的下载软件里面的确是新的),慢慢将netant挤出了市场,不过慢慢flashget也趋于平静了,没有什么大的改动。下载类软件虽然装机使用率非常高,但是当时的厂商都没有找到太强大的盈利模式,使得靠一两个创新占领市场后,慢慢也没有什么大动作了。

迅雷,就是在这样一片原本稳定的没有清晰盈利模式的市场杀出了一条血路。这一点是我非常佩服迅雷公司的地方,此事情,也算是中国互联网的大事,从此下载软件变新颜。

一开始迅雷就非善类,利用了中国的法律漏洞,网民的维权意识不足和计算机知识的不足,最初靠的是雷区这个下载资源区和其P2SP这样类似BT的下载方式,要知道,在当时,你甚至没有办法去控制自己的上传,基本上,你一旦开着迅雷,你就开始为其他网民的下载提供了上传服务。

当然,贡献上传,互相帮助,人人为我,我为人人,这些本身就是P2P软件下载方式所提倡的,也是BT,Emule存在的根本,但是,那些都是可知的,可控的,我是知道自己在上传的,迅雷就压根不告诉你这些!就这一点,划为流氓软件也毫不过份!那是我还在读大学,与室友共享一个网络,只要一个室友开着迅雷,毫不下载,网络照样卡的要死!

过了很久很久以后,迅雷市场稳定了才承认了其下载的技术(的确此技术是让下载速度快了很多),对迅雷公司这样的发家方式非常不齿!虽然,我承认,迅雷在技术上是比原来的不思进取的flashget,netant之辈更加好的,但是,很明显在中国的大环境下,基本上漠视了大家的基本权益。至于雷区那种靠着号称网友上传,然后置软件版权于不顾的方式,中国大环境使然,也不责怪迅雷了。

不过,迅雷的创新意识和市场把握能力非常之好,这点我非常佩服,也值得学习,随后开始兼容BT和Emule的下载方式,但是此时的流氓作风又尽显,当时我习惯使用的BitComet,怎么也没有办法调回默认方式了,只要迅雷在,基本上,其永远默认,唉。。。。。。。。再以后,BitComet也提供了普通下载方式。。。。但是已经难免颓势。

随后,迅雷又侵入了PPLive,PPStream等软件已经开拓完善并且已经牢牢把握住的在线视频市场,提供了迅雷看看的服务,此服务说来雏形是BitComet提供的边下边看,但是因为技术上不是太完善,下载速度不是太理想,后来并没有太完善和宣传(风行当年似乎以此为宣传)。因为迅雷的下载速度保证,迅雷看看提供的服务的确相当优秀!!视频的清晰度,流畅程度远非当时的PPLive,PPStream可比,比起土豆,优酷那样模糊不堪的视频效果那就更是一个天上,一个地下了,事实上,我发现我的软件使用习惯,在迅雷看看出来后就变了,卸载了PPLive,PPStream,BitComet,Emule等软件,仅仅保留了迅雷及迅雷看看,后来,xunlei的网页也已经改为了迅雷看看了,足见迅雷看看的成功。

但是,此时迅雷为了保证其迅雷看看的下载速度,流氓行径未改,事实上,只要你上迅雷看看的网页上看过一部电影,后台运行的迅雷看看就一直开始默默的运行,并上传,哪怕你退出了网页后,其叶不自动关闭,无数次,我发现上网速度奇慢,原来是刚才看过电影,忘了关闭迅雷看看了。这种做法,人神共愤!

再然后,最近迅雷推出了迅雷看看播放器,开始抢夺暴风影音的市场(当然,我只用kmplayer),不仅可以播放本地的视频,在线的视频播放也得到了很好的支持,同时兼有迅雷看看在其后作为在线的影库,本人甚为欣赏这样的创新,但是,流氓行径仍然不改,关联里面竟然默认选择总是保持文件关联的选项。

xunleikankan2导致安装后,人们会不明就里的让迅雷看看永远霸占自己的所有视频播放权。。。。。当然,看片后,你点击关闭后,迅雷看看只会最小化,不小心,你就让其在后台默默的运行,然后上网速度奇慢了。。。。。

上述,就是迅雷的发家流程。。。。。

我表达一下自己的看法:

迅雷在下载领域的创新我觉得是非常值得鼓励,netant,flashget等软件,在稳握当时市场的情况下还会被后来的迅雷所击倒,的确也因为他们的不思进取。不仅是思想上的创新,技术上的创新,比如P2SP的引入,我觉得也是很了不起,因为实实在在的在中国这种破网络环境下给我们提供了很快速的下载速度,向迅雷致敬!

其后提供的雷区服务,再然后提供的狗狗搜索服务,为我们搜索资源提供了很大的帮助,生僻的资源不需要再去Google或者baidu上去摸瞎了,想起当年,最开始缺少啥的时候肯定是Emule上搜索,但是那个下载速度实在太慢了点,Bt没源又是常事,迅雷这时候帮了我很大的忙。

迅雷看看别具一格,让在线视频不再模糊。。。。。。。改变了我原本的观影习惯,原来看电影,习惯上都是下载到硬盘后然后再看,根本无法接受Youku,Todou和PPLive,PPStream(只用来看电视)之流的模糊视频,这点的贡献怎么说都不为过!

基本上,迅雷围绕着自己的核心技术(下载)提供的周边服务,将其核心技术的价值发挥到了极致,非常值得现在的互联网公司学习,(其模式与汉王很像,汉王的核心技术也就是汉字识别技术,然后其后推出的手写电脑,扫描笔,PDA,电子书等,无不围绕此技术发展),随着迅雷的发展壮大,迅雷慢慢成长为平台提供的公司,比如现在不断的运营网络游戏。

迅雷的发家流程,可看做互联网公司发家致富的经典教材。。。。。。。。。

但是,其中很多做法实在是流氓软件行径,不断的打法律的擦边球,漠视网民的权益,为了尽量让网民提供上传不择手段,我为其不齿!唉。。。其实,也不能全怪迅雷一家公司,大环境使然,想起某人的一句很经典的话,假如犯罪的收益能远远大于被逮住的风险和被逮住后的惩罚,那么人人都会犯罪!迅雷不过也就是衡量了收益和风险后,这样做的另一家公司罢了。。。事实上,上述流氓行为的确也在迅雷发家致富的路上起了很大的作用……假如制度还是不完善,假如相关的法律无法真正实施,网民还是无法形成维权意识,迅雷也是下一家准备利用流氓手段发家的互联网公司的经典蓝本。可叹。。。。。

最近搜狐告迅雷侵权。。。。。。。。。算是中国特色了。。。因为迅雷侵犯的主要是电影公司的权益吧。。。。。但是电影公司没有去告,而是搜狐出来。。。。

迅雷公司回击。。。我们来比一下谁的版权产品多。。。。。。又是典型的中国式回答。。。那么,某一天,杀人犯也会出来说,我们比一下谁没有杀的人多吧!

唉。。。。。。。。最后,还是支持搜狐吧,要知道迅雷一贯并非善类,中国的版权法我都不知道是用来干啥的了。。。。。。只希望,迅雷公司这样的互联网公司,多多保持创新,多多研究用户的使用习惯和行为模式,而不是一门的挖空心思去欺骗用户和弄一些混淆用户的东西。。。。

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....

中国的软件流氓行为何时了?搜狐输入法竟然自动下载并要求我安装浏览器!!

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

在没有经过本人允许的情况下,自动的下载搜狗的浏览器,并开始提示我安装了!!!!郁闷啊。。。。。。。。中国的软件流氓行为实在是无止尽啊。。。如下图。。。。

image 在搜狐输入法被qq黑了的时候,我还以为搜狐是善类,结果为了推广自己的浏览器也是不择手段啊。。。。。。唉。。。。大环境啊。。。。

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

阅读全文....