开发工具 Linux
2013-12-12
首先 MinGW 和 Cygwin 都可以用来跨平台开发。
MinGW 是 Minimalistic GNU for Windows 的缩写,也就是 Win 版的 GCC。
Cygwin 则是全面模拟了Linux的接口,提供给运行在它上面的的程序使用,并提供了大量现成的软件,更像是一个平台。
相对的 MingW 也有一个叫 MSys(Minimal SYStem)的子项目,主要是提供了一个模拟 Linux 的 Shell 和一些基本的 Linux 工具。因为编译一个大型程序,光靠一个 GCC 是不够的,还需要有 Autoconf 等工具来配置项目,所以一般在 Windows 下编译 ffmpeg 等 Linux 下的大型项目都是通过Msys 来完成的,当然 Msys 只是一个辅助环境,根本的工作还是 MingW 来做的。
基本原理
- 修改编译器,让 Window 下的编译器把诸如 fork 的调用翻译成等价的形式,这就是 MingW 的做法.
- 修改库,让 Window 提供一个类似 UNIX 提供的库,他们对程序的接口如同 UNIX 一样,而这些库,当然是由 win32 的 API 实现的,这就是 Cygwin 的做法.
用 MingW 和 Cygwin 编译出来的程序的区别
首先 MingW 和 Cygwin 都不能让 Linux 下的程序直接运行在 Windows 上,必需通过源代码重新编译。
现代操作系统包括 Windows 和 Linux 的基本设计概念像进程线程地址空间虚拟内存这些都是大同小异的,之所以二者上的程序不能兼容,主要是它们对这些功能具体实现上的差异,首先是可执行文件的格式,Window 使用 PE 的格式,并且要求以 .EXE 为后缀名。Linux 则使用 Elf。其次操作系统的 API 也不一样,如 Windows 用 CreateProcess() 创建进程,而 Linux 使用 fork()。
所以要移植程序必然要在这些地方进行改变,MingW 有专门的 W32api 头文件,来把代码中 Linux 方式的系统调用替换为对应的 Windows 方式。而 Cygwin 则通过 cygwin1.dll 这个文件来实现这种 API 的转换,并模拟一个 Linux 系统调用接口给程序,程序依然以 Linux 的方式调用系统 API,只不过这个 API 在 cygwin1.dll 上,cygwin1.dll 再调用 Windows 对应的实现,来把结果返回给程序。
可以用查看他们编译好的程序的导入表来验证这点。
二者生成的程序都是能在 Windows 上运行的 EXE 文件,显然都是 PE 格式,用一个PE格式查看工具检查一下就能发现,Cygwin 生成的程序依然有 fork() 这样的 Linux 系统调用,但目标库是 cygwin1。而 MingW 生成的程序,则全部使用从 KERNEL32 导出的标准 Windows 系统 API。
这样看来用 MingW 编译的程序性能会高一点,而且也不用带着那个接近两兆的 cygwin1.dll 文件。
但 Cygwin 对 Linux 的模拟比较完整,甚至有一个 Cygwin X 的项目,可以直接用 Cygwin 跑 X。
另外 Cygwin 可以设置 -mno-cygwin 的 flag,来使用 MingW 编译。
而与 Cygwin 更有可比性的 MSys 上的工具也是通过 Cygwin 这种模拟的方式来提供的。
总之这两个项目有千丝万缕的关系,一个不恰当的比方,如果 Mingw 是 MFC,Cygwin 就是 .NET 了。
时事
2013-12-09
原则上,我是反对任何国家(包含中国)设立什么“防空识别区”的,这个东西本身就是个笑话,不受任何国际法保障的东西,完全靠本国武力迫使相关国家遵守自己划定的游戏规则,对于国际局势起到了类似于核武一样不好的推动作用。
开发者 互联网
2013-12-09
如何获取 Gravatar 头像地址?
PHP
$email_address = 'abc@xyz.com';
$default = '';
$size = '';
$url = 'https://www.gravatar.com/avatar/' + md5(strtolower(trim($email_address)))
Python
email_address = 'abc@xyz.com';
default = '';
size = '';
"https://www.gravatar.com/avatar/" + hashlib.md5(email.lower()).hexdigest() + "?" + urllib.urlencode({'d':default, 's':str(size)})
其他语言类似。
支持的GET 参数:
s/size:用户头像的尺寸,单位为像素,可选值:1 - 512,默认为 80,即 80 * 80。
d/default:默认头像,在 email 关联的头像无法获取到的时候作为返回值,格式为 urlencode($default_avatar_url)。
除了制定一个 URL 之外,还可以使用以下值:
更多详情参见:https://en.gravatar.com/site/implement/
Git CheatSheet
2013-12-03
Linus 为了托管内核代码的方便,创建了 Git。
之前,Linux 开发者使用的是 BitKeeper,不过社区对这个私有工具总是不放心,然后 BitKeeper 方面对于部分开发者试图逆向工程不满。
对于大多数公司来说, Git 的设计颇为复杂。
但是没办法,现在 Git 已经成为大多数开发者的选择。
基础命令
git config 配置
git init 初始化当前目录为 git 仓库
git clone 克隆一个远程仓库到本地
git add 添加变更(提交之前的挑选)
git commit 提交变更
git push 推送变更到远程仓库
git pull 拉取远程仓库变更,并合并到本地;等于 git fetch + git merge
git status 查看变更状态
git log 查看提交历史
git branch 分支管理
git checkout 切换分支
git fetch 拉取远程仓库变更
git merge 合并分支
示例
git config --global user.name "Your Name"
git config --global user.email "your@email.com"
git clone git@github.com:your-username/example
cd example
# 创建新文件
echo "hello" > newfile
git add newfile
git commit -m "Add newfile"
git push origin master
参考资料与拓展阅读
Python
2013-11-30
一共四种风格,printf(百分号),format 方法,模板,fstring。
阅读 美文佳句 历史
2013-11-14
又名《述志令》,是曹操难得留世的一篇散文。
曹操欲借此表明本志,叙述自己的志向,表明立场,回应朝野质疑,已消除人们对自己“不逊之志”的揣测,有相当的政治目的。
我虽不是文艺青年,但看到这篇文章,但还是觉得文采飞扬,有大气魄。
SQL 安全
2013-11-10
好久没写技术博客,最近研究产品关于用户体验方面较多,加上项目突然比较多,设计原型、跟进开发、设计师等工作着实没时间写博客。
接下来技术上主要 php 深入学习和 mysql 优化。这两天看了关于 sql 注入方面的知识,拿出来分享一下 :)
VirtualBox CentOS 虚拟化
2013-11-10
想整理一下鸟哥私房菜的学习笔记,在家装了 VirtualBox,和 CentOS。碰到了一些问题,好不容易解决了,留下这篇笔记,免得忘掉。
天文 星辰大海 印度
2013-11-06
印度前两天发射了一个火星探测器,取得了第一阶段的成功,目前运转良好。
开发者
2013-10-22
学习程序语言是每个程序员的必经之路。可是这个世界上有太多的程序语言,每一种都号称具有最新的“特性”。所以程序员的苦恼就在于总是需要学习各种稀奇古怪的语言,而且必须紧跟“潮流”,否则就怕被时代所淘汰。
作为一个程序语言的研究者,我深深的知道这种心理产生的根源。程序语言里面其实有着非常简单,永恒不变的原理。看到了它们,就可以在很短的时间之内就能学会并且开始使用任何新的语言,而不是花费很多功夫去学习一个又一个的语言。