To enable multithreading globally, use the threaded option: [text] options {threaded(yes) ; }; [/text] To enable multithreading only for a selected source or destination, use the flags(“threaded”) option: [text] source s_tcp_syslog { tcp(ip(127.0.0.1) port(1999) flags(“syslog-protocol”, “threaded”) ); }; [/text]

配置了远程记录日志,重启后报错,配置没有问题,所以不贴了,报错内容如下: [bash] 启动 syslog-ng:Error binding socket; addr=‘AF_INET(0.0.0.0:6000)’, error=‘Permission denied (13)’ Error initializing source driver; source=‘s_test2_network’, id=‘s_test2_network#0’ Error initializing message pipeline; [失败] [/bash] 问题出在 SELinux上,关掉就OK 特此记录。

[bash] top - 17:00:51 up 98 days, 4:59, 2 users, load average: 0.00, 0.00, 0.00 Tasks: 164 total, 1 running, 160 sleeping, 0 stopped, 3 zombie Cpu(s): 0.2%us, 0.1%sy, 0.0%ni, 99.6%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1880380k total, 1672504k used, 207876k free, 233416k buffers Swap: 4030456k total, 2884k used, 4027572k free, 1018268k cached [/bash] 第一行: top - 17:00:51 - 当前时间 up 98 days, 4:59, - 系统连续运行了多少时间 2 users, - 当前登录用户数 load average: 0.00, 0.00, 0.00 - 系统负载【任务队列的平均长度】 分别表示 1/5/15 分钟的值 第二行: Tasks: 164 total, - 进程总数 1 running, - 正在运行的进程数 160 sleeping, - 睡眠中的进程数 0 stopped, - 停止的进程数 3 zombie - 僵尸进程数 第三行: Cpu(s): 0.2%us, - 用户空间CPU使用率 0.1%sy, - 内核空间CPU使用率 0.0%ni, - 用户空间内改变过优先级的进程的CPU使用率 99.6%id, - 空闲CPU 0.1%wa, - 等待输入输出的CPU使用率 第四行: Mem: 1880380k total, - 总物理内存 1672504k used, - 使用的物理内存 207876k free, - 空闲物理内存 233416k buffers - 用来内核缓存的内存 第五行: Swap: 4030456k total, - 交换分区总量 2884k used, - 使用的交换分区 4027572k free, - 空闲的交换分区 1018268k cached - 缓冲的交换分区总量

python编译后性能并不会提升,但是1来可以减少文件量,2来可以对明文的代码封装,还是挺好的。 makefile #编译后文件的去处 BINDIR := …/bin #源代码所在目录 BASEDIR := …/src #编译参数 可选 DBGFLAGS ?= -O ifeq ($(findstring -O,$(DBGFLAGS)),-O) COM := .pyo else COM := .pyc endif define dirflow FILES := $(wildcard $(1)) DIRS := $$(foreach e, $$(FILES), $$(if $$(wildcard $$(e)/), $$(eval DIRS := $$(DIRS) $$(e)))) FILES := $$(filter-out $$(DIRS),$$(FILES)) ALLFILES := $$(ALLFILES) $$(FILES) $$(foreach e,$$(DIRS),$$(eval $$(call dirflow,$$(e)/))) endef $(eval $(call dirflow ,$(BASEDIR))) sources := $(filter %.py,$(ALLFILES)) clean_com := $(patsubst %.py, _clean_%.py, $(sources)) MKDIR := mkdir -p TEST  := test -d RM    := rm -rf .PHONY : all all:$(sources) %.py:bin_dir @echo Go into $(dir $@) $(shell $(TEST) $(subst $(BASEDIR),$(BINDIR),$(dir $@)) || $(MKDIR) $(subst $(BASEDIR),$(BINDIR),$(dir $@))) python $(DBGFLAGS) -m py_compile $@ mv $(patsubst %.py, %$(COM), $@) $(subst $(BASEDIR),$(BINDIR),$(dir $@)) @echo Compile $@ done. bin_dir: $(shell $(TEST) $(BINDIR) || $(MKDIR) $(BINDIR)) .PHONY: clean clean: $(clean_com) $(RM) $(BINDIR) $(clean_com):bin_dir $(RM)$(patsubst _clean_%.py, %$(COM), $@)

DMI (Desktop Management Interface, DMI)就是帮助收集电脑系统信息的管理系统。 使用 Dmidecode 这个工具可以查看硬件的各种信息。 Dmidecode 应该在主流的 Linux 发行版中都可以找到,因此你只需通过所用发行版的包管理器安装即可,如: aptitude install dmidecode # Debian/Ubuntu yum install dmidecode # Fedora pacman -S dmidecode # Arch Linux emerge -av dmidecode # Gentoo 在linux上,我们可以使用dmidecode来查找DMI信息,其中的“system information”就包含了这些系统信息,如: 命令截图               -t 是指定要查看的信息类型 可以看下dmidecode的在线帮助,还有很多种信息的

0.Notice

环境是64位的Centos6.3 牵涉到的用户:

  • 实体用户 vsftpuser (linux用户)
  • 虚拟用户 ftpuser 这个只是vsftp 配置中的用户,非linux 用户

1.安装vsftp (此处略去50字)

2.生成密码数据库

用户密码文件 /etc/vsftpd/vuser.list,一行用户一行密码

1
2
ftpuser 
ftppass

生成密码库的命令如下:

1
2
3
# 没有db_load的 apt install db-util
db_load -T -t hash -f /etc/vsftpd/vuser.list /etc/vsftpd/vuser.db
chmod 600 /etc/vsftpd/vuser.db

2.1 /etc/pam.d/vsftpd.vu

1
2
auth required pam_userdb.so db=/etc/vsftpd/vuser 
account required pam_userdb.so db=/etc/vsftpd/vuser

3.配置主文件 /etc/vsftpd/vsftpd.conf

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
#disable anonymous
anonymous_enable=NO
#user config
local_enable=YES
write_enable=YES
local_umask=022

###virtual user config###
guest_enable=YES
guest_username=vsftpuser
user_config_dir=/etc/vsftpd/user.d

chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

#server config
dirmessage_enable=YES
xferlog_enable=YES
xferlog_std_format=YES
connect_from_port_20=YES
listen=YES
pam_service_name=vsftpd.vu
tcp_wrappers=YES
use_localtime=YES
pasv_enable=YES
anon_world_readable_only=NO
allow_writeable_chroot=YES

4. chroot 编辑文件 /etc/vsftpd/chroot_list

1
2
#实体用户
vsftpuser

5.创建实体用户用来做所有虚拟用户的handler

1
useradd -s /sbin/nologin -d /home/vsftpuser vsftpuser

6.虚拟用户配置文件 /etc/vsftpd/user.d/ftpuser

1
2
3
4
5
#虚拟用户根目录
local_root=/home/vsftpuser/ftpuser
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

7.创建虚拟用户根目录

1
2
mkdir /home/vsftpuser/ftpuser 
chown vsftpuser.vsftpuser /home/vsftpuser/ftpuser

8.重启

1
/etc/init.d/vsftpd restart

时间轴 Director 一切都从Director开始,Director是所有游戏都需要的基础对象,它把所有LimeJS的逻辑连接到了网页上的单独空间。如果你熟悉flash的话,你可以把它当作stage(舞台),如果你是cocos2d用户,你可以把它视为cocos2d自身的Director。如果你对两者都不熟悉,你就把它当成一个前端控制器。 每个游戏只有一个Director。它掌控了游戏的全局viewport(视点),并且控制哪个scenes(场景)是可见的。在建立游戏逻辑的开始,你需要创建一个Director实例。它的构造函数的参数包括DOM容器元素、stage(舞台)宽和高(像素)。 var director = new dfkit.Director(document.body,320,460); Scene Scene(场景)是一个包含可视元素的用于覆盖整个viewport(视点)的独立部分。这表示同一时间点上只有一个scene(场景)是激活的。例如:在一般的游戏逻辑里,你可能需要一个菜单场景,一个游戏结算的场景。通过调用 director.replaceScene(scene) 或者 director.pushScene(scene)来让一个场景可视。不同点是后者不会移除之前的scene(场景),只是将其隐藏方便之后通过director.popScene()激活。 var scene = new lime.Scene(); director.replaceScene(scene); Transitions 单纯用replaceScene()在场景间快速切换可能吸引不了眼球。为了做的更好些可以在调用replaceScene()时用 transition 和 duration 属性。transition定义了当前场景消失和新场景激活的动画效果。当前支持 Slide(滑动)和 Move(位移)以及 Dissolve(淡入)效果。 director.replaceScene(menuscene,lime.transition.SlideInRight); director.replaceScene(gamescene,lime.transition.Dissolve,2); ScheduleManager(调度管理) Lime中的所有东西都是基于repaint-dirty (重绘-不一致)模式。也就是说当你每次改变了某些东西,你的方法调用并不等于 DOM或者Canvas2dContext调用。你设置的属性将会被标记为dirty并在下一帧被重绘。这允许我们只更新一次,更新那些需要更新的内容、并无状态的保存所有内容。无状态保存更新允许我们在任何时候切换渲染方法。因为JS没有提供任何on-enter-frame事件,所以我们使用了一个静态的lime.sheduleManager对象来模拟。它提供以下方法: schedule(callback, context) – 在每一帧里调用一个方法。Context是this作用域。 unschedule(callback, context) – 清除之前的schedule方法。 scheduleWithDelay(callback, context, delay, opt_limit) – 和schedule类似,但是回调函数只有在超过delay(自上一次执行的延迟时间)秒数时候才会被调用。 callAfter(callback, context, delay) – 在delay指定的时间后调用一次回调函数。 不要在代理里使用JS自带的setTimeout()和setInterval()方法。lime.scheduleManager给你提供了能实现同一功能但却更丰富的方法。你的回调函数只有超过距离上次执行delay的时间后才会被再次执行。这使你能够让动画更加平滑,即使实在CPU性能急剧改变的情况下。 var velocity = 2; lime.scheduleManager.schedule(function(dt){ var position = this.getPosition(); position.x += velocity * dt; // if dt is bigger we just move more this.setPosition(position); },ball);   Pausing(暂停) 使用scheduleManager代替timer发放可以充分利用暂停功能。当你希望暂停游戏时,只需调用Director对象的setPaused(true)。这将会暂停所有计划中的方法和动画。一旦你调用setPaused(false),所有的代码又会继续执行,就如同什么都没发生一般。当你的游戏暂停时,lime.PauseScene将会被激活。如果你想自定义暂停场景,你可以覆盖这个类的功能。 mygame.director.setPaused(true); Layers(层) 现在我们准备在屏幕上放点东西了。为了更好的管理你的显示对象,我们引入了lime.Layer对象,你可以把它想象成Photoshop里的图层。Layer可以用来装东西。它和其他的可视对象的行为相同,只是它没有body和尺寸,它们只能用来包含子对象。所以你只需创建好它们,添加到树中,设置合适的位置把子对象添加进去。必须申明的是,Layer不是必须的,你可以在场景中加入任何对象,Layer让你的生活更简单。 var layer = new lime.Layer().setPosition(100,100); scene.appendChild(layer); for(var i=0;i<5;i++){ var box = customMakeBoxFunc().setPosition(i*50,0); layer.appendChild(box); }

0%