#42 通过 Windows 命令行(CMD)创建文件

2013-12-24

一、建立空文件的几种方法

  1. cd . > a.txt

cd.表示改变当前目录为当前目录,即等于没改变;而且此命令不会有输出。

表示把命令输出写入到文件。后面跟着a.txt,就表示写入到a.txt。
而此例中命令不会有输出,所以就创建了没有内容的空文件。

  1. copy nul a.txt

nul表示空设备,从概念上讲,它不可见,存在于每个目录中,可以把它看成一个特殊的 “文件”,它没有内容;一般可把输出写入到nul,来达到屏蔽输出的目的,如pause>nul,此命令执行效果是暂停,并且不会显示“请按任意键继续. . .”。
此例子表示将空设备复制到a.txt,同样创建了没有内容的空文件。

  1. type nul > a.txt

此例子表示显示空设备的内容,并写入到a.txt。

  1. echo a 2> a.txt

“2” 表示错误输出的句柄,此例中没有错误输出,所以创建了没有内容的空文件。
其实>默认都是重定向了句柄1,即标准输出句柄。比如 cd . > a.txt,其实就是 cd . 1> a.txt
同样,句柄 3 到 9 也可以使用在本例中,它们是未经定义的句柄,也不会有输出,如 echo a 3> a.txt

  1. fsutil file createnew d:\a.txt 0

使用 fsutil 创建了一个空文件。

  1. 其他命令

只要没有输出,并重定向到文件就可以了

二、建立非空文件的几种方法

  1. echo a>a.txt

最常用的是 echo 命令,此例子表示把字母a和回车换行覆盖输出到 a.txt(如果 a.txt 原来已有内容则覆盖掉原来的内容),如果追加内容,可以使用>>,如 echo b >> a.txt,表示把 b 和回车换行追加到文件末尾。

  1. 其他命令的重定向输出,如
type a.txt > b.txt
copy a.txt b.txt
fsutil file createnew d:\a.txt 1

#41 Python 命名元组

2013-12-23

collections.namedtuple 是一个工厂方法,用来创建一个 tuple 子类。

# python2
collections.namedtuple(typename, field_names[, verbose=False][, rename=False])
# verbose = True 对于 Python 初学者来说非常好,创建类型时,会输出类的完整定义,用来学习 Python 类的一些特性。
# 这个参数在 python3.7 版被移除

# python3
collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
from collections import namedtuple

DBConn = namedtuple('MySQL', ('host', 'port', 'username', 'password', 'db'))
conn = DBConn('localhost', '3306', 'root', '123456', 'test')

conn
# MySQL(host='localhost', port='3306', username='root', password='123456', db='test')

conn._asdict()  # python2 输出 OrderedDict 类型
# {'host': 'localhost',
#  'port': '3306',
#  'username': 'root',
#  'password': '123456',
#  'db': 'test'}

conn.__class__
# __main__.MySQL

conn.host
# 'localhost'

#39 新作息时间表

2013-12-16

新制定一张作息时间表,规范一下自己的作息安排,不论寒暑,不分休息日和工作日。

#38 Cygwin 下安装软件的两种方式

2013-12-15

Cygwin 是一款能在 Windows 平台上运行的类 UNIX 模拟环境的开发工具。

通过 setup.exe

重新运行一遍 setup.exe,通过搜索找到需要安装的包,勾选就行了;

使用 apt-cyg

cwgwin 默认安装了 svn,可以通过 svn 命令下载:

svn --force export https://apt-cyg.googlecode.com/svn/trunk/ /bin/
chmod +x /bin/apt-cyg

或者:

wget https://apt-cyg.googlecode.com/svn/trunk/apt-cyg -P /bin

网上都说要 “chmod +x /bin/apt-cyg”,但是用 ls 查看的结果发现已经是可执行的了。

里面默认使用的安装源是 ftp://mirror.mcs.anl.gov,改成网易安装源:

apt-cyg -m https://mirrors.163.com/cygwin

先查看一下帮助:

先更新一下库的相关情况:apt-cyg update,竟然失败,报了 404。

查看网易的安装源,再比对刚才 update 的地址,发现原来网易安装源下面还有“x86”,“x86_64”这类架构,所以就把重新设置安装源:

apt-cyg -m https://mirrors.163.com/cygwin/x86

总算成功的 update 了,注意到安装目录下多出来了一个 setup 目录,有一个 setup.ini 文件。

随便试着安装一个 httping 试一下,结果失败了,一看下载路径中出现了两个 /x86。

找了一会儿原因,原来是因为 apt-cyg 是通过 setup.ini 中的路径下载软件,所以只好试着把里面所有的 x86/release 都替换成 release,然后通过 apt-cyg 的 -u 参数来禁止每次安装时都更新 setup.ini 文件,果然是有效的。

为了防止每次都需要加一个参数,况且总是将 apt-cyg 输成 apt-get,干脆可以设置别名:alias apt-get="apt-cyg -u"。

用了一段时间之后,发现这不是最佳方案,网友提供的方法才是问题的根源:

apt-cyg 其实是一个 bash 文件,可以直接在其中找出症结,就是每次更新都是通过 wget 命令实现,搜索 "wget -N $mirror/setup" 可以找到两行:

wget -N $mirror/setup.bz2
wget -N $mirror/setup.ini

可以将其中的 $mirror 后面接上 /x86 或者 /x86_64。

我想,一定有一个什么变量对应着这个架构目录名称,setup.ini 中有一个 arch,于是我把 $mirror 替换成 $mirror/$arch 但是还是报错(https://mirrors.163.com/cygwin//setup.bz2),应该是 arch 变量不存在所致。

我并不会弄 bash,这个问题只能留着以后解决了。

上海交大的安装源应该不会存在路径的问题,因为下面没有分 CPU 架构目录:

https://ftp.sjtu.edu.cn/cygwin/

#37 MingW 与 Cygwin

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 来做的。

基本原理

  1. 修改编译器,让 Window 下的编译器把诸如 fork 的调用翻译成等价的形式,这就是 MingW 的做法.
  2. 修改库,让 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 了。

#36 关于东海防空识别区

2013-12-09

原则上,我是反对任何国家(包含中国)设立什么“防空识别区”的,这个东西本身就是个笑话,不受任何国际法保障的东西,完全靠本国武力迫使相关国家遵守自己划定的游戏规则,对于国际局势起到了类似于核武一样不好的推动作用。

#35 使用 Gravatar(全球认证头像)

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 之外,还可以使用以下值:

  • 404:不加载图片,直接返回 404 响应。
  • mm:表示神秘的家伙,返回一个固定的简单卡通人物轮廓。
    b032cbf256037fbfbb6b9aa8b29acd70 (1).png
  • identicon:一个基于电子邮件哈希值的抽象图案
    b032cbf256037fbfbb6b9aa8b29acd70 (3).png
  • monsterid:产生一个不同颜色和面部的怪物
    b032cbf256037fbfbb6b9aa8b29acd70 (2).png
  • wavatar:产生不同的特征和杯具的脸。。。
    b032cbf256037fbfbb6b9aa8b29acd70.png

  • r/rating:类似于电影评级,头像也有级别的管理,避免将将某些头像显示在了不合时宜的场所,可选值:g | pg | r | x

更多详情参见:https://en.gravatar.com/site/implement/

#33 曹操:让县自明本志令

2013-11-14

又名《述志令》,是曹操难得留世的一篇散文。
曹操欲借此表明本志,叙述自己的志向,表明立场,回应朝野质疑,已消除人们对自己“不逊之志”的揣测,有相当的政治目的。
我虽不是文艺青年,但看到这篇文章,但还是觉得文采飞扬,有大气魄。