Dust8 的博客

读书百遍其义自见

0%

看csgo的视频, 有很有趣的做法.比如可以看到弹点,看到雷的飞行轨迹,自己还可以飞.
这样练枪和练扔雷很有帮助.下面就说说这些是怎么设置的.

启用开发者控制台

设置==>游戏设置==>启用开发者控制台==>是

启动控制台

在游戏中按 ~ 启动控制台,然后就可以输入下面的命令.
下面这些命令必须是在离线游戏中才能用的.

命令

必须命令

sv_cheats 1 作弊

常用命令

sv_infinite_ammo 1无限弹药

noclip 穿墙.建议使用bind t "noclip" 绑定按键,则按t键为开启穿墙模式

sv_showimpacts 1 显示弹痕,能清晰了解弹道分布

sv_grenade_trajectory "1" 打开手雷飞行轨迹
sv_grenade_trajectory_time "10" 设置手榴弹飞行轨迹的保留时间

bot_kick 踢出所有NPC

想了解编译器原理的朋友, 不要在看龙书或者其他的书了, 强烈推荐先看《编程语言实现模式》.
英文名叫 Language Implementation Patterns - Create Your Own Domain-Specific
and General Programming Languages. 它实战性非常强, 在也不会被催眠了.

来实现一个简单的词法解析器, 解析简单的数字运算, 只支持整数和加减.
原理我不多说, 想了解的就去看我推荐 《编程语言实现模式》.

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
class Token:
def __init__(self, typ, value):
self.typ = typ
self.value = value

def __str__(self):
return '<type="%s", value="%s">' % (self.typ, self.value)


class Lexer:
def __init__(self, text):
'''
text:输入字符

p:当前输入字符的下标
c:当前字符
eof:结束标志
'''
self.text = text
self.text_len = len(text)
self.p = 0
self.c = self.text[self.p]
self.eof = 'eof'

def consume(self):
'''向前移动一个字符, 检测输入是否结束'''
self.p += 1
if self.p >= self.text_len:
self.c = self.eof
else:
self.c = self.text[self.p]

def match(self, x):
'''确保x是输入流中的下一个字符'''
if self.c == x:
self.consume()
else:
raise ValueError('expecting %s ; found %s' % (x, self.c))

def next_token(self):
raise NotImplementedError()


class ListLexer(Lexer):
def __init__(self, text):
super().__init__(text)

def next_token(self):
while self.c != self.eof:
if (self.c == ' ' or self.c == '\t' or self.c == '\n' or
self.c == '\r'):
self.r_ws()
continue
elif self.c == '+':
self.consume()
return Token('OP', '+')
elif self.c == '-':
self.consume()
return Token('OP', '-')
else:
if self.is_number():
return self.r_number()
raise ValueError('invalid character: %s' % (self.c))

return Token('EOF', 'eof')

def r_number(self):
buf = []
while self.is_number():
buf.append(self.c)
self.consume()
return Token('NUMBER', ''.join(buf))

def r_ws(self):
while (self.c == ' ' or self.c == '\t' or self.c == '\n' or
self.c == '\r'):
self.consume()

def is_number(self):
return '0' <= self.c <= '9'


if __name__ == '__main__':
text = '''01+
22'''
lexer = ListLexer(text)
t = lexer.next_token()
while t.typ != 'EOF':
print(t)
t = lexer.next_token()
print(t)

官网例子

pythonqueue 是线程安全的, 所有用起来比较爽.
官方文档或者网上的例子都是比较简单的, 例如

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
def worker():
while True:
item = q.get()
if item is None:
break
do_work(item)
q.task_done()

q = queue.Queue()
threads = []
for i in range(num_worker_threads):
t = threading.Thread(target=worker)
t.start()
threads.append(t)

for item in source():
q.put(item)

# block until all tasks are done
q.join()

# stop workers
for i in range(num_worker_threads):
q.put(None)
for t in threads:
t.join()

实际问题

例子比较简单明了. 它们都有个特点, 就任务是有限的, 已知的, 先把所有任务放入队列, 然后在执行.
而在实际使用中还有其他情况, 比如, 任务数量未知, 一边消耗, 一边添加. 这样也没有问题,直到给
Queue 设置了 maxsize, 问题就来了, queue 是满的, 所有的线程都卡住了, 包括添加任务
还是执行任务. 原因是默认是 block, 执行的任务还没完成, 添加任务就把 queue 添加满了,这时
在添加任务就不行, 卡在这里, 而执行任务的线程执行完任务后, 来取任务就取不了, 就这样双双卡死.

block

先来看看什么是 block

1
2
3
4
5
6
7
8
q = queue.Queue(3)
i = 0
while i < 10:
r = q.get()
print('get', r)
print('put', i)
q.put(i)
i += 1

上面这个例子就卡住了, 什么都不打印, 因为 q 是空的, 它没取到任务就 block 在那里.
在来看看我的问题

实际问题

1
2
3
4
5
6
7
8
9
10
11
q = queue.Queue(3)
i = 0
while i < 10:
print('put', i)
q.put(i)

if i % 3 == 0:
r = q.get()
print('get', r)

i += 1

这个例子就是我碰到的问题, 任务添加不进去, 任务也取不到, 原因就是 队列满了.

解决方案

如何解决这个问题就看官网文档

1
2
Queue.get(block=True, timeout=None)
Queue.put(item, block=True, timeout=None)

一个方法是把 block 设置为 False, 另外一个就是设置 timeout.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
q = queue.Queue(3)
i = 0
while i < 10:
try:
print('put', i)
q.put(i, False)
except queue.Full:
print('put error', i)

if i % 3 == 0:
r = q.get(False)
print('get', r)

i += 1

这样才可以把 i 全部执行完.

做网页有时肯定有国际化的需求, 看得懂中文的显示中文, 看不懂的就让他选英文.
一般默认的根据浏览器的请求头里面的语言来显示, 有特殊要求的给个列表让他自己选.

python 里面标准库有 gettext 模块, 第三方库有 Babel. 这个第三方现在已经由 pocoo 团队维护了. flask 里面可以用扩展 Flask-Babel.

安装Flask-Babel

1
pip install Flask-Babel

配置

1
2
3
4
5
6
7
from flask import Flask
from flask.ext.babel import Babel, gettext

app = Flask(__name__)
# 设置默认locale好调试, 当然也可以根据官方文档里面的从请求里面获取
app.config['BABEL_DEFAULT_LOCALE'] = 'zh_Hans_CN'
babel = Babel(app)

使用

py文件里面

1
gettext('hello')

jinja2里面

1
{{ _('hello') }}

设置babel配置

保存为 babel.cfg

1
2
3
[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_

翻译

下面都是 babel 模块里面的命令, 文档

1
2
3
4
pybabel extract -F babel.cfg -o messages.pot .
pybabel init -i messages.pot -d translations -l zh_Hans_CN
pybabel compile -d translations
pybabel update -i messages.pot -d translations

今天搞了个新 vps , 用的是 ubuntu 16.04, 默认是 python3 .

python

  • 默认是 python3, 输入 python 无效.
  • apt install python3-pip 安装 pip3, 命令是 pip3 .
  • 安装 bloomfilter 出现 'x86_64-linux-gnu-gcc' failed ,
    apt install gcc python3-dev 来解决.

elasticsearch

安装elasticsearch

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

echo "deb https://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list

sudo apt-get update && sudo apt-get install elasticsearch

启动elasticsearch

service elasticsearch restart

查看配置

ps -ef | grep elasticsearch

可以看到各种目录

安装elasticsearch-analysis-ik

因为 elasticsearch2.3.3 , 所以 IK version1.9.3.

cd /tmp
curl https://codeload.github.com/medcl/elasticsearch-analysis-ik/zip/v1.9.3 -o m.zip
apt install unzip
unzip m.zip
cd elasticsearch-analysis-ik-1.9.3

因还没有安装 maven, 不能使用 mvn.

apt install maven
mvn package

居然还报错 Assembly: null is not configured correctly: Assembly ID must be present and non-empty.,

sed -i '/<assembly>/a\ <id>releases</id>' src/main/assemblies/plugin.xml
mvn package
unzip /tmp/elasticsearch-analysis-ik-1.9.3/target/releases/elasticsearch-analysis-ik-1.9.3-releases.zip -d /usr/share/elasticsearch/plugins/ik
service elasticsearch restart