[转] Quake-III 代码里神奇的浮点开方函数

源贴在这里 (也是转帖): http://www.douban.com/note/196653073/

Quake-III 代码里神奇的浮点开方函数

Quake-III Arena (雷神之锤3) 是90年代的经典游戏之一. 该系列的游戏不但画面和内容不错, 而且即使计算机配置低, 也能极其流畅地运行. 这要归功于它3D引擎的开发者约翰-卡马克(John Carmack).

事实上早在90年代初DOS时代, 只要能在PC上搞个小动画都能让人惊叹一番的时候, John Carmack 就推出了石破天惊的Castle Wolfstein, 然后再接再励, doom, doomII, Quake…每次都把 3-D 技术推到极致. 他的3D引擎代码极度高效, 几乎是在压榨PC机的每条运算指令. 当初MS的 Direct3D 也得听取他的意见, 修改了不少API.

py2exe打包psutil

记录备忘.

原因:

1
2
3
4
5
6
7
8
9
10
Traceback (most recent call last):
File "main.py", line 10, in <module>
File "zipextimporter.pyo", line 82, in load_module
File "utils.pyo", line 10, in <module>
File "zipextimporter.pyo", line 82, in load_module
File "psutil\__init__.pyo", line 138, in <module>
File "zipextimporter.pyo", line 82, in load_module
File "psutil\_pswindows.pyo", line 16, in <module>
File "zipextimporter.pyo", line 98, in load_module
ImportError: MemoryLoadLibrary failed loading _psutil_windows.pyd

解决办法:

1. http://stackoverflow.com/questions/20930173/how-to-include-components-of-psutil-in-py2exe-that-py2exe-cant-find

dll_excludes 至少添加这几项: "IPHLPAPI.DLL", "NSI.dll", "WINNSI.DLL", "WTSAPI32.dll"

令人崩溃的 marrow.mailer 的 py2exe 打包历程

今天在打包一个小工具时, 由于使用 marrow.mailer, 碰到了经典的 py2exe 找不到使用 pip 安装的包 的问题.
于是使用了以前的大法: http://www.py2exe.org/index.cgi/ExeWithEggs
再加上又碰到的各种各种的问题. 虽然最后解决了, 但是过程太崩溃了, 不想多说, 只记下过程.

1. 下载 marrow.mailer 压缩包, 解压, 用上面的大法安装

1
python setup.py install_lib

2. 同上, 依次安装 marrow.util, marrow.interface, futures

Windows下git保存密码

更新: 直接保存密码是不行的, 需要安装 git-credential-winstore.
安装后, 就可以手动添加密码了.

越来越觉得 SourceTree 启动慢, 我都尽量在命令行下使用 git 了 (这样才是正道吧).
每次的推送都要输入用户名和密码, 用了 _netrc 大法也不管用, 隐约记得之前可以的, 是人品越来越好了吗?

总感觉不甘心, 就翻看 http://stackoverflow.com/questions/6031214/git-how-to-use-netrc-file-on-windows-to-save-user-and-password, 看到 git-credential-winstore 这里, 就进去看看, 下载安装, 很小巧的东西, 才十几K.

接着再推送时, 弹出对话框, 输入用户名和密码, 就可以了. 看这个窗口的架势, 是在系统的密码管理里面, 进去一看, 果不其然, 在通用安全里, 静静地躺着刚刚保存的密码.
没有安装 git-credential-winstore (https://gitcredentialstore.codeplex.com/) 的同学可以手动添加试试, 此法仅限于 http 方式的验证, 不适合 ssh 模式.

抓取 <<码农故事>> 文本

偶然看到这样一篇关于码农的小说, 感觉还可以, 就想收集下来慢慢看.
但是都是网页而且还挺多, 就看看有没有整理好的全本, 搜了一下没找到.

接着就手动复制粘贴, 贴了几篇感觉太枯燥, 就琢磨着如何使用 requestsBeautifulSoup 来提取文本.

很少使用 BeautifulSoup, 所以临时去看了一下文档, 开始走起.

使用 NSSM 安装 Windows 系统服务

工厂里的某些测试电脑存在时间不对的问题, 最开始使用简单的批处理加上
nssm 安装成 service 的方式, 比如下面的示例:

sync_time.bat
1
2
3
4
5
6
sync_time:
net time \\a.b.c.d /set /y

sleep 3600
goto sync_time

但在使用的过程中出现了这个 service 吃掉许多 CPU 的问题.
按道理说在 sleep 后应该会进入休眠状态, 不应该再占用 CPU.
不清楚什么原因, 就使用 Python 重写了.

Flask-script 和 gevent 结合使用

之前一直没用过 flask-script, 可是看了很多其他人的例子都在用这么个玩意. 碰巧手上有个现在做的一个应用, 所以打算用一下.

用了之后出现问题了: python manage.py runserver 使用的是默认的 wsgi 服务器, 而我在 windows 下一直使用 gevent 调试的.
看了下文档, 差不多就是这样:

manage.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/bin/env python
#-*- coding: utf-8 -*-

from __future__ import unicode_literals
import os
import os.path

from app import create_app, db
from app.models import User
from flask.ext.script import Manager, Shell
from flask.ext.migrate import Migrate, MigrateCommand

if os.path.isfile('app.env'):
# print('importing environment from app.env...')
with open('app.env') as f:
for line in f:
if not line.lstrip().startswith('#') and '=' in line:
items = line.strip().split('=', 1)
os.environ[str(items[0].strip())] = str(items[1].strip())

app = create_app(os.getenv('APP_ENV') or 'default')
manager = Manager(app)
migrate = Migrate(app, db)


def make_shell_context():
return dict(app=app, db=db, User=User)

manager.add_command('shell', Shell(make_context=make_shell_context))
manager.add_command('db', MigrateCommand)


@manager.command
def deploy():
from flask.ext.migrate import upgrade

upgrade()


@manager.command
def rungevent():
import werkzeug.serving
from werkzeug.debug import DebuggedApplication
from gevent.wsgi import WSGIServer

@werkzeug.serving.run_with_reloader
def run():
app.debug = True
dapp = DebuggedApplication(app, evalex=True)
ws = WSGIServer(('', 5000), dapp)
ws.serve_forever()

run()

if __name__ == '__main__':
manager.run()

然后使用下面的命令就可以了: