Showing posts with label M$. Show all posts
Showing posts with label M$. Show all posts

Thursday, November 4, 2010

使用MinGW编译FFmpeg

友情提示: 编译FFmpeg本来就是一件体力活, 使用MinGW来编更是相当蛋疼, 因此, 如果你没有刚刚作出一个非常艰难的决定, 请立即停止这种自虐行为.

FFmpeg的人估计恨死Window$了, 如果你曾经有过使用VS编译的想法, 现在可以放心抛弃这种打算了. 这时如果你依然很不幸需要用到MinGW来编译, 那么下面的一些提示应该对你的编译过程有所帮助.

  1. configure的参数会稍微特别点:
    $ ./configure --enable-memalign-hack --disable-debug
    
    --disable-debug建议加上, 否则编译出的archive会很大很大...
  2. 现在先不忙着敲make, 我们需要patch一下MinGW的库文件, 否则就会出现诸如"implicit declaration of function 'strncasecmp'"这样的错误. 打开这个链接: http://fate.arrozcru.org/mingw32/patches/, 依照着里面的diff文件挨个patch吧, 完成就可以顺利编译了, 别忘了还要安装Yasm哦.

  3. 编译完成之后你应该可以在各个子目录中找到archive文件, 拿着这些文件做爱做的事吧.

不过小a娘也不好调教, 如果你需要再拿去链接, 可以参考FFmpeg这篇官方指南: http://www.ffmpeg.org/general.html#SEC23. 你可能还会遇到下面一些链接错误.

  • "unresolved external symbol _strcasecmp", 这个不知是不是MinGW的bug, 居然没有提供strcasecmp()函数, 解决方法是自己实现一个相同的函数, 可以参考GNU C Library
  • "unresolved external symbol __imp____lc_codepage", 这是一个更加诡异的错误, 解决方法我在这篇文章中找到, 主要就是把"Runtime Library"从/MD改为/MT
  • "error LNK2005: XXX already defined in LIBCMT.lib MSVCRT.lib", 最诡异错误出现, 操蛋的VS库啊, 在这篇文章的帮助下, 找到了解决办法, 在"Ignore Specific Library"里添加"MSVCRT.lib"即可.

Tuesday, October 27, 2009

wxPython & py2exe & Python多线程编程

这两天一直在帮别人弄个小程序, 一个用于辩论赛的计时器. 以前有人做过一个, 但现在规则改了, 估计写程序那人也找不到了, 就打算重新做一个. 开始看了一下程序, 觉得功能挺简单的, 就答应了下来, 事后我还很纳闷地跟小兰同学说我怎么就把这么一个活给接下来了, 照我以前的思维, 这种Window$下的程序我应该直接推掉才是.

不过也管不了那么多了, 既然答应了下来, 就得按照我的风格完成. 首先是GUI库的选择, 他们想要的是那种不用安装就能直接运行的轻量级程序. 这样就最先把C#给淘汰了, 那庞大的.NET Framework是肯定不行的. 其实做这种Win下的小型程序最好的选择就是VC++了, Window$系统对于MFC良好的支持, 使得程序编好之后就可以到处运行. 不过MFC自从大二上学期学过之后, 我就再也没有碰过, 况且我的机器上连VS都没有... 我最想用的其实是Python的GUI库, 主要是我最近也在学这东西, 可以练练手. 如果不用微软的GUI库, 那剩下的选择就主要有wxWidgetsGTK+QtTk这四种了, 它们都是跨平台的, 并且都提供有Python的实现接口. 其中wxWidgets不同于其它三种, 它编写出来的程序具有系统的原生界面 (look and feel native), 而其它的则是在所有系统下都一个样. 于是我选定了wxWidgets作为GUI库, 对应的Python实现是wxPython. 但对于Python这种解释型语言来说最大的限制就在于目标机器上必须也有对应的解释器才行, 这样就跟C#一样了. 不过通过我在网上的进一步了解, 发现了一个叫做py2exe的东西, 它的目的主要就是将你的Python程序打包, 使得在没有安装Python的机器上也能运行. 这不正是我想要的结果吗?! 有了上面的准备, 更让我确定了要用Python去开发的决心.

学习wxPython可以从"How to Learn wxPython"开始, 同时wxPyWiki也有一定的参考价值. 然后就是不断地翻API了, wxPython官方提供的那个Python接口的API我觉得基本没有用处, 虽然全部都是Python的代码, 但由于对于接口的参数没有一点解释, 导致你看了也是白看, 只是知道了这个方法有什么参数而已. 还是看wxWidgets的文档好点, 即使里面是以C++作为实例, 其实很容易转换到Python的. wxWidgets也有类似于GTK+中的Glade的可视化界面绘制工具, 比如wxGlade (这个很明显是模仿的Glade), wxDesigner (这是收费的软件).

在编写过程中还遇到一个小意外, 因为我一直认为这个程序技术上没有什么难点, 只是图形界面我是第一次接触, 可能要花些时间. 结果在第一天就发现这个程序非得用多线程不可... 并且是至少3个线程一起跑. 这就麻烦了, 我根本就没有学过Python的多线程. 怀着搜一搜就会有结果的心态, 找到了Python的threading模块. 以前觉得Python官方的文档挺不错的, 每一个模块写得清清楚楚, 中间还穿插一些示例代码, 让人一下就知道该怎么用了. 但似乎这个threading是个例外, 不仅文字解释模模糊糊, 唯一的几小段示例代码也让人看不懂. 看来这次是碰到硬骨头了, 没办法, 当初自信满满地答应别人一定能在期限之内做完, 硬骨头也得使劲啃. 通常是通过继承threading模块的Thread类来构造线程, 同时你可能还需要重载基类的run()方法. 这些都还比较容易理解, 但我还需要让一个线程中途暂停下来, 等到主进程来激活它. 这个"暂停线程"就把我搞得有点恼火了, 开始一直不能理解为什么其中提供的wait()方法是不带参数的, 没有参数怎么知道该让哪个线程等待呢? 在看过几个例子和自己试验了几次之后, 终于发现wait()是从属于每一个Thread对象的, 看来面向对象的思想还是没有学好... 于是要让一个线程暂停就变得异常简单了:
import threading

class MyThread(threading.Thread):
    ...

    def run(self):
        ...
        self.event = threading.Event()
        self.event.wait()
这里使用的是Event类中的wait()方法. 激活的操作在主进程中进行:
self.thread.event.set()
但Python中不提供彻底终止线程的操作, 每一个线程必须正常执行完之后才能退出. 可以通过设置Thread对象的daemon属性值为True, 使得子线程可以在主进程退出的时候一同结束. 不过这样还是不够"干净", 在主线程没有结束之前, 那些子线程是一直都在运行的, 虽然表面上看不出来, 会白白浪费系统的资源. 于是可以采用让子线程在某种条件下自己结束自己, 具体内容请参考: Python 不支持杀死子线程.

程序写好之后就还剩下打包, 最开始我其实不是用的py2exe, 而是Pyinstaller. 原因在于Pyinstaller可以只生成一个exe文件, 这样程序看起来就会很简洁了. 但用Pyinstaller试过几次之后程序都莫名其妙地无法运行, 只好转战py2exe. 相比于Pyinstaller, py2exe提供了更灵活的配置机制, 但最后生成的文件夹里会包含很多dll和pyd文件, 看着稍微有点乱. 使用py2exe主要是setup.py的编写, 调用的是distutils.core标准库中的setup()函数. setup()函数的参数可以在这里查到, 同时py2exe也附加了一些参数, 其它信息可以参考General Tips and Tricks, 比如怎样自定义程序的图标. 不过故事总会出现波折, 就像公主虽然肯定是和王子在一起, 但也不排除那个王子可能一辈子都是青蛙. 我用py2exe生成的exe文件在没有安装Python的机器上再次出现错误, 在看了"尽量别使用 Py2exe for Python 2.6"这篇文章之后, 才知道是Python 2.6在作怪. 没办法, 为了生成一个通用的exe程序, 只有再去下载Python 2.5, 之后生成的程序就一切OK了, 同时记得把一些py2exe没有复制的dll文件拷过来.

经过这次体验, 深切体会到Window$下的快速GUI开发, 还得靠VS, 拖一拖就都搞定了, 怎一个爽字了得. py2exe虽然也很方便, 但还是尽量在机器上装上Python好点, 毕竟py2exe也不是万能的, 也许会发生某些无法预期的错误. 这个小程序的源代码已经放到了我的Google Code上.

P.S. 在下载Python 2.5的时候, 发现Python官方下载点已经被墙, 只好去其它地方寻觅, #fuckgfw

Tuesday, June 30, 2009

不翻墙观看YouTube的方法

荣耀属于: 不用翻墙访问YouTube的方法[可行][转]

方法是修改本地host文件, 将YouTube的地址解析到谷歌中国的IP, 即这样几行:
203.208.39.104 www.youtube.com
203.208.39.104 gdata.youtube.com
203.208.39.104 upload.youtube.com
203.208.39.104 insight.youtube.com
203.208.39.104 help.youtube.com
203.208.39.104 youtube.com
  1. Linux

  2. 修改/etc/hosts文件, 添加上面几行, 然后重启浏览器.
    $ sudo ifdown eth0
    $ sudo ifup eth0


    7月6日更新:
    Ubuntu 9.04默认使用上面的命令会出现找不到eth0的错误提示, 原因在于ifdownifup这两个命令的配置文件 (/etc/network/interfaces) 里没有对于eth0的定义. 修改一下即可:
    $ cat /etc/network/interfaces
    iface eth0 inet dhcp
    上面的inetdhcp请根据你具体的网络环境设置, 详细参数可以参见man interfaces.


    7月6日再更新:
    刚才重启了下, 发现在改了上面那个文件之后电脑不会自动连上宽带了, 于是又改了回来... 暂时还不知道这是为什么. 大家还是用下面的命令吧:
    $ sudo ifconfig eth0 down
    $ sudo ifconfig eth0 up


  3. Window$

  4. 修改%SystemRoot%\system32\drivers\etc\hosts文件, 同样添加上面几行, 然后也是重启浏览器.... 禁用本地连接后再重开应该能行, 重启电脑也行, 我没试过, 有知道的各位麻烦说下.

YouTube

Friday, June 26, 2009

怎样修改MAC地址?

前段时间小妮子的电脑出现了一个很神奇的问题, 校园网连上几分钟就会自动断开, 需要重新连接才行. 并且在Window$和Linux下都有这样的问题, 在进行了各种排错工作——还包括一次重装Win——之后, 问题依旧. 最后请了一个高手来看看, 高手先捣鼓了一阵, 然后就决定改下MAC地址试试, 结果就这样奇迹般地好了.

这是什么原因呢? OK, 我想这个问题恐怕也只有我们学校的人能解决了. 这既不是一个软件问题, 也不是一个硬件问题, 这是一个很操蛋的问题... 伟大的学校网络中心可能最近在抽筋, 就一不小心把小妮子电脑的MAC地址封了, 或者是分配的IP和某人的冲突, 反正当发现原来问题是这个的时候, 我很无语...

不过这次也学到了怎么改MAC地址, 在Win下的方法我还真没见过以前, 比之前用某软件改方便多了. 方法就是在"设备管理器"里的网卡属性里"高级"选项卡里有一个叫做"Locally Administered Address"的东东, 它的值就是MAC地址, 只是少了分号间隔.

Linux下的就交给我了, 在参考了"[精彩] 如何修改mac地址让它一直生效?"这篇文章后, 成功修改. 永久修改的方法是在/etc/rc.local这个文件里添加如下信息:
/sbin/ifconfig eth0 down
/sbin/ifconfig eth0 hw ether 00:11:22:33:44:55
/sbin/ifconfig eth0 up
eth0是你的网卡编号, 如果你只有一个网卡, 那就是eth0了. 如果只是想暂时修改, 就直接依次运行上面的命令就行了.

Saturday, May 2, 2009

在Linux下使用IE的两种方法

Internet Explorer 6
由于老妈需要在IE中处理一些事情, 但家里的电脑又被我折腾得只有一个Ubuntu了, 在老妈的强烈要求下, 我研究了下怎么在Linux下用IE. 这里我们无视IE 8.

本来使用IE最简单同时也是最完美的方法就是装一个虚拟机, 但这无形中又增加了老妈的学习难度, 对于她来说, 最好的方法就是在桌面上放一个经典的e图标, 然后双击就行了, 这就得请Wine出场了.

1. IEs4Linux
这是最著名的直接使用IE的方法, 安装步骤也很简单, 可谓人性化. 需要注意的是官网上写的在Ubuntu下安装的方法已经很久没有更新了, 其实不必设置文中提到的第三方源, 直接用官方源安装好winecabextract以后, 下载最新的IEs4Linux, 解压运行其中的ies4linux安装脚本就行了.

现在的IEs4Linux可以安装IE 5, 5.5, 6, 7这4种版本, 但IE 7使用的是IE 6的界面, 貌似是因为作者也还没搞定怎么才能用上IE 7的界面.

2. 直接Wine原生IE 7
也许你认为一开始我们就应该用这种方法了, 干嘛还要绕那么大个圈去用什么IEs4Linux. 可是如果你曾经试过直接Wine个IE 7的话, 你就会知道那可是一个很麻烦的事情, 完全不同于Wine普通的软件, IE 7果然是非同一般...

具体步骤可以参考国外的一篇文章[Wine Review: IE 7 on Linux with Wine], 并且需要用到最新版本的Wine, 就不能用Ubuntu官方源了, 换上Wine的第三方源 (仅适用于Ubuntu 9.04):
$ wget -q http://wine.budgetdedicated.com/apt/387EE263.gpg -O- | sudo apt-key add -
$ sudo wget http://wine.budgetdedicated.com/apt/sources.list.d/jaunty.list \
> -O /etc/apt/sources.list.d/winehq.list
$ sudo apt-get update
$ sudo apt-get install wine
其它版本的Ubuntu源可以参照这篇文章中的说明. 另外上面那篇国外的文章中提到的需要到XP中拷贝的dll文件也可以到这个网站下载.

用这种方法安装的IE 7虽然拥有了好的界面 (一些细节还是有问题), 但由于在我的电脑上经常无响应, 并且显示中文也有点问题, 就弃用了.

最后献上最强大的Internet Explorer for Mac

Thursday, March 26, 2009

Window$ Server 2008中启用Media Player

想听点网上流媒体的音乐, 发现还没启用Media Player, 找了半天都没找到在哪... 费尽千辛万苦, 终于在一个角落找到了, 囧

Start->Server Manager->Features->Add Features, 然后勾选Desktop Experience, 如下图:
Desktop Experience

重启就OK了.

Monday, May 19, 2008

Visual C++ 中运行多项目解决方案的方法


如图所示, 这个解决方案中有多个项目, 但在编译完毕运行时只会运行第一个建立的项目. 只需稍微设置下就能解决了:

右键那个想要运行的项目名, 选择"设为启动项目", 然后编译运行就OK了.