erlang游戏开发
erlang emakefile编译

erlang emakefile编译
Erlang的emakefile是一种用于编译Erlang代码的文件。
它可以帮助我们自动化编译过程,使其更加简便和高效。
下面是一个简单的emakefile示例:
```
{"src/*", [{outdir, "ebin"}, {i,"include"}]}.
```
这个emakefile将指定目录下的src文件夹中的所有文件作为源文件
进行编译。
编译后的文件将会输出到ebin文件夹中。
另外,它还指定
了一个include文件夹作为头文件目录。
要使用emakefile进行编译,我们可以使用Erlang的构建工具rebar。
我们可以在项目根目录下创建一个名为rebar.config的文件,并将emakefile的内容添加到其中。
然后,我们可以在命令行中运行rebar compile命令来编译我们的代码。
使用emakefile进行编译可以帮助我们更加方便地管理和组织Erlang
代码。
它可以自动处理依赖关系,只重新编译需要更新的文件,提高
编译效率。
此外,emakefile还支持并发编译,可以利用多核处理器的优势,加快编译速度。
希望这个简单的emakefile示例可以帮助你开始使用Erlang的emakefile进行编译。
你可以根据实际需求进行进一步的配置和定制,以满足项目的要求。
Erlang入门手册

Erlang/OTP R11B 文档Erlang/OTP R11B documentationv0.1a2目录第1部分 入门 (1)1.1 简介 (1)1.1.1 简介 (1)1.1.2 其它方面 (1)1.2 顺序编程 (1)1.2.1 Erlang Shell (1)1.2.2 模块和函数 (3)1.2.3 元子(Atoms) (6)1.2.4 元组 (7)1.2.5 列表 (8)1.2.6 标准模块及用户手册 (11)1.2.7 将输出写到终端上 (11)1.2.8 一个更大的例子 (12)1.2.9 变量的匹配、守卫和作用域 (14)1.2.10 更多关于列表 (16)1.2.11 If和Case (21)1.2.12 内建函数(BIFs) (25)1.2.13 复杂函数 (27)1.3 并行编程 (29)1.3.1 进程 (29)1.3.2 信息传递 (31)1.3.3 进程名称注册 (35)1.3.4 分布式编程 (36)1.3.5 一个更大的例子 (40)1.4 [#1]健壮性(Robustness 鲁棒性) (49)1.4.1 超时(Timeouts) (49)1.4.2 错误处理 (51)1.4.3 增强健壮性之后的大型例子 (54)1.5 [#1]记录和宏(Records and Macros) (59)1.5.1 将大型的例子分割在多个文件中 (59)1.5.2 头文件(Header Files) (64)1.5.3 记录(Records) (64)1.5.4 宏(Macros) (65)第2部分 OTP设计原则 (66)2.1 概述 (66)2.1.1 监督树 (66)2.1.2 Behaviour (66)2.1.3 应用 (70)2.1.4 发布 (71)2.1.5 发布控制 (71)2.2 Gen_Server Behaviour(文档缺失) (71)2.3 Gen_Fsm Behaviour (71)2.3.1 有限状态机 (71)2.3.2 实例 (72)2.3.3 启动一个Gen_Fsm (73)2.3.4 事情通知 (74)2.3.5 超时 (74)2.3.6 All状态事件 (75)2.3.7 停止函数 (75)2.3.7.1 在监督树中 (75)2.3.7.2 独立Gen_Fsm (76)2.3.8 处理其它消息 (76)2.4 Gen_Event Beheaviour (77)2.4.1 事件处理原则 (77)2.4.2 实例 (77)2.4.3 启动一个事件管理器 (78)2.4.4 加入一个事件处理器 (78)2.4.5 事件通知 (79)2.4.6 删除一个事件处理函数 (80)2.4.7 停止 (80)2.4.7.1 在监督树中 (80)2.4.7.2 独占式事件管理器 (80)第1部分 入门1.1 简介1.1.1 简介这是一个入门指导教你开始使用Erlang。
erlang 运算

erlang 运算Erlang是一种函数式编程语言,最初由爱立信公司开发用于构建可靠和高效的通信系统。
它以其并发性和容错性而闻名,特别适合于创建分布式系统。
在本文中,将介绍Erlang的基本运算,包括算术运算、逻辑运算和位运算等。
算术运算是编程语言中最基本的运算之一。
在Erlang中,可以使用加法、减法、乘法和除法等算术运算符进行数值计算。
例如,下面的代码展示了如何使用Erlang进行基本的算术运算:```erlang1> 2 + 3.52> 5 - 2.33> 4 * 6.244> 10 / 2.5.0```在这个例子中,我们使用加号(+)、减号(-)、乘号(*)和除号(/)进行了加法、减法、乘法和除法运算。
Erlang中的除法运算符(/)返回的结果是一个浮点数,如果想要得到整数结果,可以使用双斜杠(//)进行整数除法运算。
除了基本的算术运算,Erlang还提供了一些其他的数学函数,如绝对值(abs)、取整(round)、取余(rem)等。
下面的代码展示了如何使用这些数学函数:```erlang1> abs(-5).52> round(3.5).43> rem(10, 3).1```逻辑运算是另一类常用的运算。
在Erlang中,可以使用与(and)、或(or)、非(not)等逻辑运算符进行逻辑计算。
例如,下面的代码展示了如何使用逻辑运算符进行逻辑计算:```erlang1> true and false.false2> true or false.true3> not true.false```在这个例子中,我们使用与运算符(and)、或运算符(or)和非运算符(not)进行了逻辑计算。
Erlang中的逻辑运算符返回的结果是布尔值,即true或false。
位运算是一种对二进制位进行操作的运算。
在Erlang中,可以使用位与(band)、位或(bor)、位异或(bxor)等位运算符进行位运算。
Erlang开发及应用

Erlang开发及应用litaocheng@What is Erlang_ERicsson LANGuage函数式编程语言(FP)面向并发(OC),基于消息Ericsson创建, 最初用于电信系统开发成熟, 稳定, 具有20多年历史适于电信系统, 分布式系统, 高并发服务器Open Source, 跨平台, GC______ 不适于底层系统开发History1980s Ericsson实验室思考如何轻松开发电信系统应用1987年左右, Erlang浮出水面1989年JAM虚拟机C语言实现_1996年OTP项目启动, 融合开发经验, 提供易用, 强大的Erlang开发库1998年开源2007年《Programming Erlang》出版目前版本Erlang R13B1 (5.7.2)Erlang优势多核SMP支持内建分布式支持基于轻量进程及消息的高并发模型代码热替换开发速度快, 高性能, 高稳定性FP编程,代码灵活高效, 副作用小丰富的分析及监控程序经过商业产品, 长久大规模验证OpenSource, 代码面前无秘密Erlang Hello World代码hello.erl:1 -module(hello).2 -compile([export_all]).34 main() ->5___ io:format("hello world!~n").编译:_$ erlc hello.erl运行:_$ erlEshell V5.7.1_ (abort with ^G)1> hello:main().hello world!ok__Erlang Hello World CON'T1 -module(hello).声明模块名称,其必须和文件名一致.模块是Erlang项目中代码组织的基本方式.2 -compile([export_all]).指明编译选项,export_all 用来导出所有本模块中的函数,exportedfunction是模块的接口,其他模块只能调用exported function4 main() ->为函数头(head),包含函数名称和参数, 后紧随一个'->'分割符5___ io:format("hello world!~n").为函数体(body),包含Erlang表达式,这里调用io模块的format函数在默认输出中打印"hello world!"在上面的运行结果中,最后有一个"ok",这是io:format/1的返回值,表示打印成功,Erlang中任何函数都有返回值.Erlang 语法Data Types____ 8种基本类型integer - 4,_ -4, 2#100, 16#4, 920828990801238101010..float - 3.0, 3.5e2, 6.5e-2, (IEEE754 64bit)atom - hello, your_name, root@host, 'IsAtom'binary - <>reference - make_ref(),一个随机值fun - fun() -> some_expr endport - 与外部应用进行交互的接口pid - process identifier, 用来操作process____ 2种复合类型tuple - {foo, male, 28, china, <>}_list - [{ip, any}, {port, 1234}, binary]Erlang 语法CON'TPattern Match_ _ 语言层级的模式匹配, 代码更加简洁.___ 适用于函数调用, case, receive, try表达式及"="操作___ case Value of______ N when is_integer(N) -> N;______ _ when is_list(Value) -> list_to_integer(Value)___ end_变量大写字母或"_" 开头, 只能包含数字,字母,"_", "@".如X, Name1, _Phone, _, Host@变量分为Unbound和Bound, Unbound变量只能用在模式匹配中.变量Bound后,Value就不可修改_变量只能单次赋值(并发及调试考虑)N = 3 (ok)N = 4 ( oops! not match)________Erlang 语法CON'TBinary匹配使用binary可以轻松的实现二进制协议.(1)解析IP包:-define(IP_VERSION, 4).-define(IP_MIN_HDR_LEN, 5)....DgramSize = size(Dgram),case Dgram of<> when HLen >= 5, 4*HLen =OptsLen = 4*(HLen - IP_MIN_HDR_LEN),<> = RestDgram,___Erlang 语法CON'T_(2)自定义协议假如我们定义了一个协议, 前2 bytes(16位) 标记消息体的长度, 后面为消息体, 最后为占用1个byte的结尾符0xef, 示意图如下:[--- length ---][--------- payload ------][ef]|------ 2 -------|---------- Length -------|-1-| (单位byte)则对应的binary匹配表达式如下:...Packet = ...case Packet of___ <> ->__ ____ {body, PayLoad};___ _ ->_______ {error, invalid_packet}end.___Erlang 语法CON'T序列化与反序列化Erlang中序列化非常简单term_to_binary/1 - 将任意数据转化为二进制序列binary_to_term/1 - 将编码的二进制数据转化为Erlang数据比如:Obj = {apple, {price, 2.0}, {origin, shandong}},Bin = term_to_binary(Obj),Obj = binary_to_term(Bin)CouchDB中大量使用erlang的序列化相关函数,完成数据的存储与加载. ___Erlang 语法CON'T函数_ __ 一切皆函数, 每个调用都有return, 函数可以作为基本数___ 据类型.作为返回值:op_fun('+') ->___ fun(N1, N2) -> N1 + N2 end;op_fun('-') ->____ fun(N1, N2) -> N1 - N2 end.作为参数:> FIsEven = fun(E) -> E band 2#1 =:= 0 end.> lists:filter(FIsEven, [1, 2, 3, 4, 5, 6]).> [2, 4, 6]___Erlang 语法CON'TTail Recursion尾递归Erlang中没有for, while关键字可以利用递归实现循环在server开发中,确保使用尾递归:server_loop(Args) ->___ ...some action...___ server_loop(Args).使用尾递归,可以消耗很少的内存,仅仅是一个地址跳转. server_loop(Args) ->___ ...some action...___ server_loop(Args),_ _ other_fun().Erlang 语法CON'T_发送Message "!"_ __ 基于消息通信,No Lock! No Shared Memroy!____ Pid ! {msg, "hello, I love erlang"}____ 向Pid(本地或远程主机)代表的进程发送消息receive1, 阻塞等待任意消息:receive____ Msg -> okend3,等待消息,超时为5 sec:receive_____ Msg -> okafter 5000 ->____ timeoutend2,实现sleep:receiveafter Time ->___ okend4,检测是否存在消息:receive____ SomeMsg -> existafter 0 ->_____ no_existendErlang 并发关于Process每个Process拥有一个mailbox,保存消息Processes之间通过发送异步Message进行交互,无共享状态轻量,兼有OS Process的隔离及OS Thread的高效Process具有自己Stack, Heap, GCProcess可以位于Local,也可以位于Remote MachineProcess能够进行多种形式的管理及控制(link, monitor, exit signal) Process为erlang高并发,高容错,分布式的基础并发Process数: default 32768, max 268435456Erlang 并发CON'T创建Processspawn(Fun), 比如> spawn(fun() -> io:format("i'm ~p~n", [self()]) end).i'mspawn(Mod, Fun, Args),比如> spawn(io, format, ["i'm ~p~n", [self()]])._i'mspawn_link,_ spawn_opt, spawn_monitor ...销毁Process进程内部调用exit(Reason), 比如exit(normal), 正常退出进程内部发生异常导致程序退出其他进程调用exit(PidBeTerminate, Reason) _Erlang 并发CON'T基于Process的http server 框架(one loop process, per conection per process): _setup up listen socket,spawn(listen_process).in listen_process:__ while can accept new_ client connect_ _ _ _ accept_,_ _ _ _ spawn(client_process)__ loopin client_process:_ _ process protocol,___ close socket.__ _Erlang 并发CON'T使用Erlang我们可以:以清晰的风格开发高并发的应用_我们将不在受困于:线程池的复杂死锁,竞赛的窘迫内存泄露局部问题,导致的全局崩溃与跨平台多核SMP的格格不入__Erlang 分布式Erlang Node是分布式通讯的基本单元,可以位于同一机器or 多台机器, 实现了原语级的节点通讯Erlang Node 通过erl -sname Name_ or erlang -name Name启动, 同一台机器可以启动多个Node每台机器上启动Erlang Node时,都会启动一个epmd(Erlang Port Mapper Daemon, port 4396),用来进行Node和Machine之间的映射不同机器的Node之间通过Tcp连接进行Message传输(可以自定义分布式通讯实现,如通过ssh)global维护一个全局的Nodes网络spawn[_link|_opt]都具有分布式版本,可以再其他节点创建Process Erlang 分布式CON'Trpc 模块可以在其他Node上执行操作slave, remsh, remote shell等方式启动,连接Erlang NodeErlang中进程具有位置透明性通过message及receive表达式,轻松实现同步or异步, timeout等网络通信中多种机制Erlang本身提供tcp,udp等常规的网络编程方式使用Erlang内建分布式机制,可以快速开发多种应用,也可以基于socket 开发各种专有应用Erlang 分布式CON'TErlang 分布式CON'T节点A2连接节点B2步骤Node A2, B2启动,绑定一个本机端口,并注册到本机的epmd(default port 4396)A2连接HostB epmd,请求获取B2节点的绑定端口HostB epmd将B2的bind port及dist协议版本等信息返回给A2_A2与B2协商,建立tcp连接,如果连接成功,维护一个tick,来定期检测B2节点_A2与B2节点之间的消息,通过此连接进行发送_Erlang OTPOTP(Open Telecom Platform),其定义了一系列项目开发中需要的模式及部署升级策略,为提高开发效率,构建高效,稳定系统提供了巨大的帮助. 同最初时的专有电信平台应用已没有太多关系当前系统都是采用OTP进行开发Erlang中各种lib都是基于OTP开发可以理解成某种轻量的框架,或者具体化的设计模式behaviours包含:application, supervisor, gen_server, gen_fsm, gen_event application,release,release handling提供应用的部署,升级,回退等实现Erlang OTP CON'TBehaviours通过定义一些简单的callback模块实现特定功能.application - 定义application,实现某种功能,由其他behaviours组成supervisor - 定义一个supervisor tree,实现各种策略的任务重启机制gen_server - 定义一个通用的server模型,一个process loop,提供同步异步接口gen_fsm - 实现一个状态机gen_event - 实现一个event manager及event handler模型与其它语言的交互External App外部应用崩溃不会影响Erlang虚拟机Ports - 通过port与外部应用交互(stdin/stdout)Erl_Iterface - 提供c的封装,方便开发port应用Link in Drivershared library (SO in Unix, DLL in Windows),影响Erlang虚拟机稳定性(不推荐)Port dirvers -提供c封装,运行在erlang虚拟机内部C Nodes遵照erlang的交互协议, 使用c实现的一个erlang nodeJinterface提供一系列与Erlang进行交互的Java包Erlang 代码片段求某个数的阶乘_ _ _ __________ factorial(0) -> 1;________ factorial(N) -> N * factorial(N-1).获取远程机器的issue信息(linux)______ -module(issue).__ _ _ -compile([export_all]).__ _ _ %% start server______ server() ->_ _ _ _ _ _ register(issue_server, spawn(fun server_loop/0)).____ _ server_loop() ->___________ receive_________________ {From, {get, issue}} ->_________________ From ! {issue, get_issue()};___________ _ ->_______________ ok___________ end,__________ server_loop().____Erlang 代码片段CON'tget_issue() ->___ {ok, Bin} = file:read_file("/etc/issue"),___ Bin.%% start clientclient(ServerNode) ->___ true = net_kernel:connect_node(ServerNode),___ {issue_server, ServerNode} ! {self(), {get, issue}},___ receive_______ {issue, Issue} ->___________ io:format("server issue:~s~n", [Issue])___ after 1000 ->___________ io:format("receive issue time out~n")___ end.调用:$ erl -sname server(server@litao)1> issue:server().true$ erl -sname client(client@litao)1> issue:client('server@litao').server issue:Ubuntu 9.04 \n \l____产品开发流程架构设计单台or 分布式Master-Slave or Grid _ Monitor,____ Failover, Net Comunication, Database, Replica ...OTP Behaviourhow many applicationuse supervisor, gen_server, gen_fsm, gen_eventCoding, 及单元测试用例. 每个module都经过测试(eunit)编写系统测试框架,覆盖测试,确保系统正确(common test)压力测试,分析性能瓶颈,进行优化(fprof)系统上线,监控功能(ganglia, nagios, monit)新的功能或需求,重复2-7一些工具appmon - OTP application监控工具cover -_ erlang代码覆盖测试ntop - 显示Node中进程信息(unix top)make - erlang中的make工具pman - erlang中进程管理器tv - ets 和mnesia 查看器fprof -_ erlang系统性能分析common_test - erlang测试框架dialyzer - 代码静态分析debugger - 单步调试工具,基于(tcl/tk)学习资源Erlang官方网站/docErlang China/Erlang Mailist/Erlang-Questions-f14096.html Erlang Planet/Erlang非业余研究/Erlang Display/开源项目ejabberd - the Erlang Jabber/XMPP daemon RabbitMQ - AMQP serverCouchDB - schema-free document database Tsung - multi-protocol distributed load testing Scalaris - distributed key-value storeDisco - MapReduce FrameworkMochiweb - Powerful Http Server Tookit自己动手发起erlang开源项目!案例AXD301高并发的电信交换机99.9999999% 可靠性(~3ms 故障/年)超过100万行Erlang代码软实时系统高容错案例WEB IM后台(mochiweb)_7+ 百万活跃用户~100 serverajax + comet(long-polling)更多应用。
erlang 创建进程原理

erlang 创建进程原理以erlang 创建进程原理为标题,写一篇文章。
Erlang是一种函数式编程语言,它具有并发和分布式的特性,这使得它在构建可靠的并发系统方面非常强大。
在Erlang中,进程是并发编程的基本单位,每个进程都是独立的,拥有自己的数据和执行环境。
本文将介绍Erlang中创建进程的原理。
在Erlang中,创建进程非常简单。
使用`spawn`函数可以创建一个新的进程。
`spawn`函数接受一个函数作为参数,该函数将在新的进程中执行。
在Erlang中,函数是一等公民,可以像其他值一样传递和使用。
这种将函数作为参数传递给`spawn`函数的方式被称为“匿名函数”。
创建进程的过程可以分为以下几个步骤:1. 定义要在新进程中执行的函数。
这个函数可以包含任何Erlang代码,用于完成特定的任务。
例如,可以定义一个函数来处理网络请求,或者执行一些计算任务。
2. 使用`spawn`函数创建一个新的进程,并将要执行的函数作为参数传递给`spawn`函数。
`spawn`函数将返回一个进程标识符,用于引用这个新进程。
3. 可以使用进程标识符来与新进程进行交互。
通过发送消息的方式,可以将数据发送给新进程,或者从新进程接收数据。
4. 新进程可以使用`receive`函数接收消息。
`receive`函数会阻塞进程,直到接收到指定类型的消息为止。
一旦接收到消息,进程可以根据消息的内容进行相应的操作。
创建进程的原理是基于Erlang虚拟机的调度器。
Erlang虚拟机使用一种称为“进程轮转”的调度算法来管理并发执行的进程。
每个调度器负责管理一组进程,它会按照一定的规则将CPU时间片分配给这些进程。
当一个进程的时间片用完时,调度器会挂起该进程,并将CPU时间片分配给下一个进程。
在Erlang中,进程是非常轻量级的,它们的创建和销毁是非常快速的。
这使得Erlang非常适合构建高并发的系统。
每个进程都有自己的堆栈和消息邮箱,通过消息传递的方式进行通信。
erlang函数

erlang函数Erlang是一种函数式编程语言,用于开发高可用、实时分布式系统。
它最初由爱立信(Ericsson)开发,旨在满足对电信系统的高可用性和容错性的要求。
Erlang提供了强大的并发处理能力,通过轻量级进程和消息传递机制来实现。
在Erlang中,函数是语言的核心组成部分。
一个函数由函数名、参数和函数体组成。
函数名用于唯一标识函数,参数用于接收输入值,函数体则定义了函数的具体执行逻辑。
Erlang的函数体通常是由多个表达式组成的代码块。
下面是一个示例函数,它接收两个参数并返回它们的和:```erlangadd(X, Y) ->X+Y.```在上面的例子中,函数名为`add`,参数为`X`和`Y`,函数体定义了`X + Y`的求和操作。
这个函数可以被调用来计算任意两个数字的和,例如`add(2, 3)`将返回`5`。
除了基本的算术操作,Erlang还提供了丰富的内置函数和模块。
这些函数和模块可用于字符串处理、列表操作、文件操作等各种任务。
以下是一些常用的内置函数示例:- 字符串连接函数:`string:concat("Hello", "World")`将返回字符串`"HelloWorld"`。
- 列表反转函数:`lists:reverse([1, 2, 3])`将返回列表`[3, 2, 1]`。
- 文件读取函数:`file:read_file("file.txt")`将返回文件`file.txt`的内容。
除了内置函数,Erlang还允许用户定义自己的函数。
用户定义的函数可以在模块中定义,并通过导出语句使其可供其他模块使用。
下面是一个示例函数,它使用模式匹配来处理不同类型的输入:```erlangcalculate_area({rectangle, Width, Height}) ->Width * Height;calculate_area({circle, Radius}) ->3.14 * Radius * Radius.```在上面的例子中,`calculate_area/1`函数接收一个元组作为参数。
erlang基础知识集锦

Erlang基础知识集锦声明:此文档只作为对erlang的认知之用,如果需要学习并使用erlang 请系统学习介绍erlang的书。
1.简介●Erlang是一个并行编程语言和运行时系统,最初由爱立信(Ericsson)于1987年为电信行业所开发。
1998年爱立信在改良的MPL(Mozilla Public License)许可下将Erlang发布于开源社区。
●Erlang是:a)一种“小众”语言。
b)一种函数式语言(变量只能赋值一次)。
c)一种动态类型语言(变量类型在运行时决定,代码需要编译后才能执行,与Python,Ruby等不一样)。
d)一种强类型语言。
e)一种面向并发(Concurrency Oriented)的语言。
2.特性●并发性 - Erlang支持超大量级的并发线程,并且不需要操作系统具有并发机制。
●分布式 - 一个分布式Erlang系统是多个Erlang节点组成的网络(通常每个处理器被作为一个节点)。
●健壮性 - Erlang具有多种基本的错误检测能力,它们能够用于构建容错系统。
●软实时性- Erlang支持可编程的“软”实时系统,使用了递增式垃圾收集技术。
●热代码升级-Erlang允许程序代码在运行系统中被修改。
旧代码能被逐步淘汰而后被新代码替换。
在此过渡期间,新旧代码是共存的。
●递增式代码装载-用户能够控制代码如何被装载的细节。
●外部接口-Erlang进程与外部世界之间的通讯使用和在Erlang进程之间相同的消息传送机制。
3.数据类型3.1.变量3.1.1.在erlang中的变量只能被赋值一次,变量第一个字母要是大写的。
3.1.2.符号”=”是值类型匹配操作(带有赋值的意思)。
(pattern matching)3.1.3.在erlang中变量是不可变的,也没有共享内存的概念,也没有锁。
3.2.浮点数3.2.1.整数除法示例: 4 div 2。
3.2.2.求余示例: 5 rem 2。
职位描述岗位职责

职位描述岗位职责职位描述岗位职责1职位描述:职位描述:1.建立与维护良好的客户关系,开拓与发展业务。
2.对自动化行业及其应用有独到的认知,并且有很强的专案管控能力。
3.主导团队研究探讨客户的rfp,并向客人提供dfm,紧密跟踪、检讨并且启动专案开发。
4.在专案开发的每个阶段,要密切与客户沟通,了解客户需求,追踪检讨送样结果,以及样品改善方案,确保顺利量产。
5.能及时准确的传达客户的要求和信息给团队,合理调配专案资源、管理相关标准文件,很好的掌控整个专案开发的全过程。
6.在p1,p2,evt,dvt,mp各阶段及时发送日生产报表给客户。
7.配合客户开发schedule及地域不同配合出差进行on site support。
8.产权管理,售后服务以及维护管理。
任职要求:1.具备自动化领域的相关工作经验优先。
2.拥有工程问题相关方面的问题分析经验。
3.拥有项目管理经验技能者优先(pmp)。
4.有2年项目管理、市场以及技术销售方面的.工作经验。
5.沟通能力佳,同时有较强的客户导向能力。
6.拥有较强的团队合作能力,引导促进团队不断进步。
7.拥有较好的分析、创新能力,以及市场敏锐性。
8.能在紧急生产交期下,作出合理有效的工作安排。
9.能配合工作及客户地域不同出差。
10.形象好气质佳,为人正直诚信。
11.英文读写说流利。
12.大学本科学历或者更高,拥有自动化/电子工程师背景优先13.工作地点:华东地区。
职位描述岗位职责2职位描述:工作职责:1、设计和开发webrtc实时通信服务器、流媒体网关,支持高并发和扩展2、webrtc中的音视频引擎、音频处理算法、音视频编解码算法的研究与实现3、音视频传输算法的研究与实现,比如拥塞控制、fec、jitter buffer 等4、开发音视频实时通信解决方案,如视频会议、在线课堂、voip任职要求:1、有音视频引擎的'实际开发经验,掌握音视频流输入、输出方法,对音视频流在设备之间的传递效率和管理有深刻认识2、有扎实的网络技术基础,对socket通信、udp/tcp/ip和http有深刻的理解3、熟悉webrtc、ffmpeg、licode、kurento、janus、mediasoup等音视频工具4、熟悉h264、h265、opus、vp8等编解码,熟悉rtp、rtmp、rtsp、sip 等传输协议5、有语音的相关算法优化经验者优先,如ns,vad,agc,aec等职位描述岗位职责3职位描述:1、接待并引导顾客,耐心解答顾客的咨询,了解顾客的`需求并达成销售;2、负责做好货品销售记录、盘点、帐目核对等工作,按规定完成各项销售统计工作;3、完成货品的来货验收、上架陈列摆放、补货、退货、防损等日常营业工作;4、做好所负责区域的卫生清洁工作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
缺点: mysql有些庞大,适合结构化数据。social
game中的数据,需要频繁变化,更像一个对 象。
2020/5/4
mnesia
Erlang自带的分布式数据库,与Erlang无缝结合 ,拥有很多不错的特性,如分布式,可配置 内存及磁盘存储,存储任意Erlang Term等。
– 产品 – 美工 – Flash – Server
暂忘利益,谈谈过程。
2020/5/4
选择什么协议?
• HTTP • AMF • 自定义
选择HTTP(JSON): • social game实时性要求低 • HTTP简单,成熟 • 便于调试
使用开源的mochiweb
2020/5/4
mochiweb
2020/5/4
使用redis存储数据
每个用户一个key: [<<"u.">>, Uid, <<".data">>] key对应value为:Hash 其包含多个field: “bag”, “bui”, “user”, “msg”, “setting”, “extra”,
用来存放背包,建筑,用户信息,消息,设置,额外信息。 数据通过Erlang的序列化函数term_to_binary/1转化成二进制存
2020/5/4
Lua,Javascript
• Erlang进行框架开发 • Lua或javascript作为轻量的脚本语言,负责游
戏逻辑处理
github/raycmorgan/erl-lua github/cooldaemon/erluna /basho/erlang_js/
2020/5/4
游戏介绍
• 功能
– 开垦 – 建造 – 收租 – 投资 – 偷窃 – 捡取
• 收费点
收费道具(卡片,特效,场景,自动值守)
2020/5/4
开发语言?
2020/5/4
我懂Erlang 所以选择Erlang!
2020/5/4
开发时间?
2020/5/4
SNS平台
2020/5/4
… 90个漫漫长夜
2020/5/4
系统扩展
多台逻辑服务器满足更大的请求。 也可以采用Erlang自建的分布式机制,对系统
进行拓展(RenRen广告系统)。
加上Nagios,Munin等监控报警工具,提供稳 定的服务。
2020/5/4
2020/5/4
Redis的slave机制 • 使用AOF sync every second,允许少量数据的丢失 • 不考虑严密的防作弊机制,简单的时间戳+密钥的认
证即可 • ...
放弃换来轻松,追求完美的路上,需要一些放弃。
2020/5/4
数据管理及统计
• 统计数据采用mysql存储,便于其他语言( php,python,java)的交互
2020/5/4
引擎运行状态
# ./motownctl status motownlocalhost is running up time:1728104 (20 days) connections: 5
查看内部状态: # ./motownctl debug
... Eshell V5.7.5 (abort with ^G) (motownlocalhost)1>
2020/5/4
经过272次提交:
$ git shortlog litao (272):
initial commit, add protocol.rst
add the arch stuff add include and src, compile ok ...
6139行代码(含1500行测试代码):
缺点: 数据文件大小限制,与其他语言交互不便,效
率不是很好。 Mnesia也是一个不错的选择。
2020/5/4
Redis
• 不仅仅是key-value:
– string – list – set – zset – Hash
• 特点
– c实现,简洁高效 – 支持多种数据持久化存储方式(AOF,DUMP) – 支持VM及Replication – 将支持Cluster
... All 101 tests passed.
• 系统测试: $ make comm_test .... Testing motown.server: TEST COMPLETE, 20 ok, 0 failed of
20 test cases Cover analysing... test/log/index.html... done test/log/all_runs.html... done
• 静态资源采用nginx,用户浏览器cache • 使用Erlang Process Directory,缓存从Redis
获取的数据(erlang:put/2, erlang:get/1), HTTP Connection关闭,Process销毁,缓存 释放 • Redis充分利用内存,大量数据位于内存中( 类似Memcached)
$ ls ./include/*.hrl src/*.erl | xargs wc -l ... ...
6139 总用量
2020/5/4
选择mixi平台
2020/5/4
产品现状
• 成功的代码,失败的产品
– 缺乏相应的运维推广 – 缺乏用户数据分析 – 缺乏更多收费点的开发
• 好的产品需要好的团队
2020/5/4
系统扩展
前端: • DNS轮询 • DNS SRV(XMPP使用,参考
/html/rfc2782) • LVS • Proxy(Nginx,HAProxy)
2020/5/4
系统扩展
数据: Redis Cluster(Redis Sharding) Mnesia Fragmention Riak
• 后台管理界面及统计界面采用PHP实现 • 游戏引擎将统计信息实时保存Redis中,定时
(半小时)导出到mysql • 引擎定期导入mysql中的物品数据
mysql, php, redis, erlang各得其所,发挥各自 特长。
2020/5/4
测试
• 单元测试: $ make unit_test
2020/5/4
系统负载
2020/5/4
关于系统容量的思考
• 单机支持多少并发连接? • 总的用户规模? • 单用户许要数据空间大小? • 用户增长速度? • 总的数据量? • ...
未来很难预测! 数日的尝试,结果徒增苦恼。 先实现,后优化。
2020/5/4
舍弃一些想法
• 不考虑数据拆分,丢掉了Redis空间划分的计划 • 不考虑过高的数据可用性,选择数据定期备份,或
2020/5/4
cache
是否需要引入memcached? • 多种Erlang memcached Client需要评测 • Redis数据放在内存中 • Redis key支持expire
因此,Redis可以兼具cache的功能。 使用Redis作为Cache和持久化存储。
2ห้องสมุดไป่ตู้20/5/4
多级cache
mochiweb 简单轻量高效,将Erlang思想贯彻的淋漓尽 致,提供了处理HTTP/1.1的基本框架。
需要一些额外工作:将URL映射到应用空间。
简单方案: localhost/who/litaocheng 对应 _http_who_litaocheng.erl,通过list_to_existing_atom 判断某个URL是否可以处理。
2020/5/4
更多内容
• Erlang的不便 • lua和javascript • 系统扩展性
2020/5/4
Erlang的不便
• 变量单次赋值 • 一些看似奇怪的语法
if RTime > Now -> do_rent();
true -> return_failture()
end
• 函数式编程没有面向对象普遍 • Erlang群体较小 • Erlang涉及概念较多
2020/5/4
Common Test输出
2020/5/4
服务器简化
• 数据验证 • 数据操作 • 无主动推送数据
如收租: 房屋建造后,根据当前时间(now)及房屋属性计算出收
租的时间点(rtime),保存并返回给client。client计算 剩余时间,开始倒计时,当倒计时完成时,请求服 务器收租,服务器判断rtime < now 是否成立。
储。
使用Hash的原因 • 减少Redis中Key的占用 • 关系更加紧密的数据位于相同的field中 • 减少数据更新量,提高效率 • 便于扩展,增加新属性时增加field
2020/5/4
线上redis运行状态
• # redis-cli info redis_version:1.3.14 arch_bits:64 multiplexing_api:epoll uptime_in_seconds:2299743 uptime_in_days:26 connected_clients:6 used_memory:69993192 used_memory_human:66.75M changes_since_last_save:49533 total_connections_received:66 total_commands_processed:6373566 db0:keys=140638,expires=0
2020/5/4
交互流程
2020/5/4
数据存储
social game 数据是核心,数据丢失,游戏没有了价值。 数据要存储在哪里 mysql,mnesia,redis?