开始用FDT

一直没能在linux上找到好的IDE用来编写Flex/AS。Adobe的Flash Builder从07年出了个flex3的alpha版本之后就再也没有更新,FDT感觉挺好但是太贵,买不起。

后来听说FDT为Open Source开发者免费提供FDT 4 Max License,因为一直有开源自己的fb-aslib,虽然是个非常龊的项目,但是也厚着脸皮发信请求一个免费的license。过了半个多月,没想到真收到免费的OS license。以后可以在linux上用IDE写ActionScript,挺好!

用了几天,感觉和用Flash Builder差别还是挺大的。

首先,FDT的format很好用,和以前的Flash的Editor一样的快捷键,而且自定义的内容很多;

其次,对SWC和项目的引用和Flash Builder不一样,包括linked sources也不一样,但是这样更直接明了,项目组织比FB更清晰,比较符合我的习惯;

但是文件模板没有Flash Builder好用,不过代码模板还是挺好的,只是我很少用;

然后,我在公司的机器上也装上了FDT,但是明显感觉Windows版的没有Linux的稳定,总是报内存错误然后崩掉,我家的机器只有2G内存,公司的是4G,怎么还是内存不足呢?也许是windows版的eclipse的问题?

最后,代码提示没有Flash Builder来得便捷,但是用起来也算很顺手。

其他的优点,就慢慢再体会了,感谢FDT提供如此棒的免费IDE。

FDT site: http://www.fdt.powerflasher.com/

Thanks FDT so much to provide such awesome Flex/AS IDE.

用Ant编译Flex

有空看了看用ant来编译flex的配置。通过AXDT的build.xml文件,自己整理了一下,生成了一个比较完整的ant build文件。

结构清晰简洁明了,以备后用。

<?xml version="1.0" encoding="UTF-8"?>
<project name="myBuild" default="main">

    <property name="SRC_DIR" location="src" />
    <property name="OUT_DIR" location="deploy" />
    <property name="DOC_DIR" location="asdoc" />
    <property name="TARGET_NAME" value="targetName" />
    <property name="TARGET_PATH" location="src/Main.as" />
    <property name="WRAP_NAME" value="index.html" />

    <!-- 修改这里的depends,加入需要的target -->
    <target name="main" depends="" />

    <!-- flex.frameworks的设置是eclipse里面设置的,这里可以用任何其他SDK路径代替 -->
    <target name="compile">
        <mxmlc output="${OUT_DIR}/${TARGET_NAME}.swf" file="${TARGET_PATH}">
            <load-config filename="${flex.frameworks}/flex-config.xml" />
        </mxmlc>
    </target>

    <target name="wrapper">
        <html-wrapper swf="${TARGET_NAME}" output="${OUT_DIR}"
            file="${WRAP_NAME}" width="100%" height="100%" history="true"
            express-install="true" version-detection="true" />
    </target>

    <target name="asdoc">
        <asdoc output="${DOC_DIR}">
            <load-config filename="${flex.frameworks}/flex-config.xml" />
            <doc-sources path-element="${SRC_DIR}" />
        </asdoc>
    </target>

    <!-- compc编译让我搞了很久。原来compc是不支持include-sources的。所以这里只能用include-classes了 -->
    <target name="library" depends="clean-library ">
        <fileset id="sources" dir="${SRC_DIR}">
            <include name="**/*.as" />
        </fileset>
        <pathconvert property="classes" pathsep=" " refid="sources">
            <chainedmapper>
    <!-- 在windows下面,要将/换成 -->
                <globmapper from="${SRC_DIR}/*" to="*" />
                <mapper type="package" from="*.as" to="*" />
            </chainedmapper>
        </pathconvert>
        <compc output="${OUT_DIR}/${TARGET_NAME}.swc" include-classes="${classes}" >
            <source-path path-element="${SRC_DIR}" />
            <load-config filename="${flex.frameworks}/flex-config.xml" />
            <include-file name="${SRC_DIR}/resources/img.png" path="${SRC_DIR}/resources/img.png" />
        </compc>
    </target>

    <target name="clean" depends="clean-library,clean-compile,clean-asdoc,clean-wrapper" />

    <target name="clean-compile">
        <delete file="${OUT_DIR}/${TARGET_NAME}.swf" />
    </target>

    <target name="clean-wrapper">
        <delete dir="${OUT_DIR}/history" />
        <delete>
            <fileset dir="${OUT_DIR}">
                <include name="${WRAP_NAME}" />
                <include name="swfobject.js" />
                <include name="playerProductInstall.swf" />
            </fileset>
        </delete>
    </target>

    <target name="clean-asdoc">
        <delete dir="${DOC_DIR}" />
    </target>

    <target name="clean-library">
        <delete file="${OUT_DIR}/${TARGET_NAME}.swc" />
    </target>

</project>

数字图像处理作业-空间滤波

3. 空间滤波
(a)噪点生成器。1. 找到(或开发)一段程序能在一个图像中加入高斯噪点,并且必须能够指出噪点的均值和方差。2.找到(或开发)一段程序能在一个图像中加入黑白相间的(脉冲式)噪点,并且必须能指出这两种噪点中每一种的出
现概率。
(b)写一段程序实现空间均值滤波,把你的滤波器应用到在(a)中含噪点的图像上。你可以把你的空间遮罩的大小固定设成3X3,但是系数要是可变的并作为你程序的输入。
(c)修改你在(b)中生成的程序以实现一个3X3 的中值滤波。比较用均值滤波和中值滤波过滤后的图像的不同之处。

结果图:

先把高斯噪声的伪随机数生成方法记下来。其他的以后有空再写。

/**
* 用雅可比变换生成一个呈高斯分布的伪随机数。
*
* @param mu 平均值μ
* @param sigma 标准差σ^2
* @return 伪随机数。
*/
private function getGaussianRandom(mu:Number = 0, sigma:Number = 1):Number
{
	var r1:Number = Math.random();
	var r2:Number = Math.random();
	var rs:Number = Math.sqrt(-2 * Math.log(r1)) * Math.cos(2 * Math.PI * r2 ) * sigma + mu;
	return rs;
}

数字图像处理作业-几何转换

写一段几何转换程序可以按一定数值进行旋转,转换和缩放图像,分别使用用最邻近点算法和双线性差值算法。

开始的时候google了很多关于最近邻点算法(nearest)和双线性差值算法(biliear)的内容,发现挺麻烦的,而且推算下来的计算量很大,觉得无从下手。后来看了课程的讲义,发现老师的要求似乎是很简单的(实际上是我搜索错了算法 O_O)。对于最近邻算法,转换之后的点对应到原图位置后,距离该位置最近的一个点的灰度,即为转换后的点的灰度。而双线性差值算法要稍微多算一点,如下图:

将对应的位置附近的四个点的灰度统一起来做计算即可。公式也很简单,假设目标位置的左下,左上,右下,右上点的灰度分别为f00,f01,f10,f11,x值是目标位置到f00点的x距离,y值是目标位置到f00点的y距离,fxy是转换后的点的灰度值,公式为:

fxy = (f10 – f00) * x + (f01 – f00) * y + (f11 + f00 – f01 – f10) * x * y + f00

结果如下图。

其实为了偷懒,我没有计算rotate值,因为没有想出一个好的方法来将转换后的坐标mapping到原图的位置,干脆就使用Flex中的rotate属性做了一个切换,老师应该看不出来的吧。XD

数字图像处理作业-直方图

还有整整一个月的时间就要交《数字图像处理》的作业了,一直有任何的头绪。本来是打算有了现成的程序之后自己就写点论文就好了,但是看来大家都没有太大的兴致来写。于是横下一条心,干脆自己来做吧!虽然不专业,对位图处理还是有点经验的。开始向用freemat或者opencv之类的东西来做,但是毕竟不是日常使用的东西,不熟悉,看了看作业的要求,似乎只要是能转换成位图矩阵就能使用,所以还是用Flex做吧,发布成AIR,但愿到时候老师知道我的是什么东西。。

这东西只能断断续续的做,还是将自己做的东西记录下来,免得忘掉了。

首要的问题,在AS中似乎没有直接获取灰度值的方法,因此我用的是将RGB值分解之后取平均值。顺便记录一下分解RGB的简单算法:

var red:uint = color >> 16 & 0xFF;
 var green:uint = color >> 8 & 0xFF;
 var blue:uint = color & 0xFF;

如果不将RGB的值转换成一个灰度值,可以分别对三个值进行计算,得到三个直方图,让后用同样的算法对三个值进行计算,之后再组成一个RGB值,可以作为整个图形的计算。

第一题,直方图均衡化

  • 写一段程序计算一个图像的直方图
  • 实现直方图均衡化
  • 你的程序必须大体上能允许所有的灰阶图像作为输入

至少,在你的报告中需要包括原始图像和它的直方图,一张直方图均衡化的图,转换函数,改进后的图像和他的直方图。

实现效果:

按照我自己的理解,直方图的算法如下。未必正确,仅供参考。

// 以下代码仅描述算法,不能直接运行。
// 第一步,获取该位图从0-255的每个灰度值的点的个数。
for(i = 1 ; i < 255 ; i++)
{
	for(j = 1 ; j < 255 ; j++)
	{
		// grays数组的index为灰度值,值为该灰度值的点的个数
		grays[getGrayAt(i, j)]++;
	}
}

// 第二步,获得归一化之后的直方图
for(pi = 0 ; pi < grays.length ; pi++)
{
	p[pi] = grayList[pi] / (imgWidth * imgHeight); // p数组中保存的是每个灰度的百分比
}
// 第三步,累计的归一化直方图
for(ci = 0 ; ci < p.length ; ci++)
{
	c[ci] = 0;
	for(cj = 0 ; cj < ci ; cj++)
	{
		c[ci] += p[cj]; // 数组c中保存的是归一化之后的直方图
	}
}
//
// 最后,转换成新的位图
for(ti = 1 ; ti < 255 ; ti++)
{
	for(tj = 1 ; tj < 255 ; tj++)
	{
		t[ti][tj] = c[getGray(originaImage.getGrayAt(ti, tj))] * (maxGray - minGray) + minGray;
	}
}
// maxGray是原图中最高的灰度值,minGray是最低的。
// 数组t即为新的图的像素矩阵。

补充几个AS的方法:

public static function splitColor(color:uint):Array
{
	var red:uint = color >> 16 & 0xFF;
	var green:uint = color >> 8 & 0xFF;
	var blue:uint = color & 0xFF;
	return [red, green, blue];
}

public static function getGray(color:uint):uint
{
	var RGB:Array = splitColor(color);
	return uint((RGB[0] + RGB[1] + RGB[2]) / 3);
}

public static function getColor(gray:uint):uint
{
	return gray * 65536 + gray * 256 + gray;
}

一点速记

php的问题,遇到:

[code language="c"]Cannot modify header information - headers already sent by[/code]

最简单的解决方法是将php.ini中设置

[code language="c"]set output_buffering = On[/code]

这种方法开启了所有php程序的输出缓存,这样做可能影响php执行效率,这取决于服务器的性能和代码的复杂度。但是至少我现在运行良好。

关于flex中的国际化。

  1. 在任何地方放置语言根目录,然后按照语言创建子目录,比如英文是en_US,简体中文是zh_CN,其他的看手册;
  2. 每个语言包的文件都是xxx.properties,xxx是文件名,扩展名都不变;
  3. 将语言根目录添加到项目的sources Path中,如果本来就在,就不用改了;
  4. 编译的时候设置-locale zh_CN,多个语言用空格隔开;
  5. 如果在SDK的frameworkslocale目录下没有你使用的语言,比如4.0之前的SDK就没有zh_CN,将4.0之后的同目录下的文件直接copy过去使用即可;
  6. 在flex代码中使用resourceManager.localeChain来定义默认的语言和优先级;
  7. 使用的方法一般如下:
    1. 先要绑定:[ResourceBundle("xxx")]
    2. resourceManager.getString(bundle, key);其中bundle是绑定的文件名称,比如前面的xxx,key是文件中对应的每个键值对的key;
    3. @Resource(bundle=’xxx’, key=’….’)这是用在flex中的,用法都差不多。

差不多就这样吧。如果是flex项目用起来似乎还不错,但是不能实时切换。有待改善。

在archlinux上运行FlashBuilder4

感谢fb4linux项目,在这篇文章的帮助下,成功的在archlinux上安装和运行基于eclipse的flashbuilder4。

整个安装过程非常简单,清晰。fb4linux的作者应该也是国人,相比之下真是自惭形秽。

不过似乎没有找到flashplayer10 debug plus for linux x86_64,debug的时候无法连接player。目前只能使用自己写的调试工具来调试了。

FAS, comes back!

almost 3 years age, i started my first open source project. at that time, i wasnt clear what i real what to do on RIA, i simply want to write some ActionScript code into a library that i can use it directly during developing RIA projects. i call that library “TAS”, means “Tang’s ActionScript”.


» 更多内容 …

quick note

problem:

The livedocs suggest that every UIComponent has automatically set event listeners for keyUp (and keyDown) events. So, I expected that it’s enough to override this method to make
some action on key-click. But that isn’t the case.. Instead – nothing happens.


» 更多内容 …

上帝是文盲

很多次告诉别人我是计算机专业的时候,都会有人很有兴趣的问会不会黑客技术,会不会破解,会不会木马,会不会写病毒。。。其实,我很想说:只有拥有智慧的人类才会将泥土放入火中烤制成瓷器,而打破一个瓷器连一头驴都会,你觉得我是做人好还是做头驴好?

上面的内容不是今天的主题。

51job的效率还是很高的,自从我去年离开topcmm、上51job更新了一下个人信息以后,基本上每个月都能收到2、3次猎头或者HR的邮件或电话,当然工作都是AS方面的。其中不乏一些大公司,但是公司越大态度越不好,尤其是腾讯。打电话给我的HR一腔老子天下第一的语调,很脑残。对付流氓的最好方法就是比他更流氓。我向来认为我是可以很流氓的,于是我对HR说:呃,腾讯啊。。。不咋样的,不去。对方估计噎住了,好半天说了一句“哦”就“byebye”了。那一刻,我觉得自己很流氓,当然我认为还是比范跑跑好很多,毕竟我只是流氓但是我不无耻。

上面的内容也不是今天的主题。

昨天接到了某公司HR的电话,可以说是我接到的HR电话中态度对好的,很让我吃惊。公司的内容是做Flash 3D社区,内容很不错,我觉得很有吸引力。其实说起来,就工作内容和从该公司网站上看到的信息,应该算是所有“可跳槽”选择中最好的一个了——如果我有跳槽打算的话。

这个也不是今天的主题。

一直以来我不看好Flash 3D的,因为AVM的效率一直都是写AS的人员心头的大石头。这是很难解决的问题,但是Flash Player10却引入了硬件加速和3D。最近一个月的时间,我接触和尝试了很多在Flash中进行3D开发东西,从Maya到Flash 3D软件再到AS 3D引擎,其中也不乏很多优秀的东西,但是运算效率和开发成本是很难估算和控制的东西,没有十足的把握还真不敢贸然在Flash中使用3D。上面那家做Flash 3D社区的公司,看起来很好很强大,不知道会发展得怎么样,拭目以待。

常说技术人员到35岁都得转管理,一直以来我不赞同这个观点但是我的行为却一直都在略微的向这个方向倾斜。在未来的技术中,3D固然是趋势之一,但是数据模型和数据交换才是支持这个华丽前台的核心。如何建立最优化的数据模型?如何让交互的数据量减到最小、速度最快?我相信这些才是占领未来信息技术市场的关键,我认为这个关键的根源是“标准”,只有建立了我们自主产权的数据标准、语言规范和通讯协议,才能来将来的信息技术世界占有关键的席位。而这个标准的根源,我认为是自主产权的运算芯片和微指令集。但是如果我现在想转入针对龙芯的底层开发是很困难,也是事倍功半的事情,因此在应用层开发中如何自主开发通讯协议和交换技术,才是我可以去考虑的问题。这就是我的Return to the real world,这是我的真实的世界。

上面也不是主题。今天的主题是:

国内航线燃油附加费上调 800公里以上增加50元

真TMD操蛋!

Hello world

Hi,我是Tang Bin,finalbug.org是我的个人站点。这里有更多关于我的内容。English readers please click here to learn more about me and this site.

Categories