版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Erlang開(kāi)發(fā)及應(yīng)用litaocheng@WhatisErlang?
ERicsson
LANGuage?函數(shù)式編程語(yǔ)言(FP)面向并發(fā)(OC),基于消息Ericsson創(chuàng)建,最初用于電信系統(tǒng)開(kāi)發(fā)成熟,穩(wěn)定,具有20多年歷史適于電信系統(tǒng),分布式系統(tǒng),高并發(fā)服務(wù)器OpenSource,跨平臺(tái),GC
不適于底層系統(tǒng)開(kāi)發(fā)History1980sEricsson實(shí)驗(yàn)室思考如何輕松開(kāi)發(fā)電信系統(tǒng)應(yīng)用1987年左右,Erlang浮出水面1989年JAM虛擬機(jī)C語(yǔ)言實(shí)現(xiàn)
1996年OTP項(xiàng)目啟動(dòng),融合開(kāi)發(fā)經(jīng)驗(yàn),提供易用,強(qiáng)大的Erlang開(kāi)發(fā)庫(kù)1998年開(kāi)源2007年《ProgrammingErlang》出版目前版本ErlangR13B1(5.7.2)ErlangHelloWorld代碼hello.erl:1-module(hello).2-compile([export_all]).3
4main()->5
io:format("helloworld!~n").編譯:
$erlchello.erl運(yùn)行:
$erlEshellV5.7.1
(abortwith^G)
1>hello:main().
helloworld!
ok
ErlangHelloWorldCON'T1-module(hello).聲明模塊名稱,其必須和文件名一致.模塊是Erlang項(xiàng)目中代碼組織的基本方式.2-compile([export_all]).指明編譯選項(xiàng),export_all用來(lái)導(dǎo)出所有本模塊中的函數(shù),exportedfunction是模塊的接口,其他模塊只能調(diào)用exportedfunction4main()->為函數(shù)頭(head),包含函數(shù)名稱和參數(shù),后緊隨一個(gè)'->'分割符5
io:format("helloworld!~n").為函數(shù)體(body),包含Erlang表達(dá)式,這里調(diào)用io模塊的format函數(shù)在默認(rèn)輸出中打印"helloworld!"
在上面的運(yùn)行結(jié)果中,最后有一個(gè)"ok",這是io:format/1的返回值,表示打印成功,Erlang中任何函數(shù)都有返回值.Erlang語(yǔ)法DataTypes
8種基本類型integer-4,
-4,2#100,16#4,9238101010..float-3.0,3.5e2,6.5e-2,(IEEE75464bit)atom-hello,your_name,root@host,'IsAtom'binary-<<"sometext">>reference-make_ref(),一個(gè)隨機(jī)值fun-fun()->some_exprendport-與外部應(yīng)用進(jìn)行交互的接口pid-processidentifier,用來(lái)操作process
2種復(fù)合類型tuple-{foo,male,28,china,<<"iloveerlang">>}
list-[{ip,any},{port,1234},binary]Erlang語(yǔ)法CON'TBinary匹配使用binary可以輕松的實(shí)現(xiàn)二進(jìn)制協(xié)議.(1)解析IP包:-define(IP_VERSION,4).-define(IP_MIN_HDR_LEN,5)....
DgramSize=size(Dgram),
caseDgramof
<<?IP_VERSION:4,HLen:4,SrvcType:8,TotLen:16,
ID:16,Flgs:3,FragOff:13,
TTL:8,Proto:8,HdrChkSum:16,
SrcIP:32,
DestIP:32,RestDgram/binary>>whenHLen>=5,4*HLen=<DgramSize->
OptsLen=4*(HLen-?IP_MIN_HDR_LEN),
<<Opts:OptsLen/binary,Data/binary>>=RestDgram,
Erlang語(yǔ)法CON'T
(2)自定義協(xié)議假如我們定義了一個(gè)協(xié)議,前2bytes(16位)標(biāo)記消息體的長(zhǎng)度,后面為消息體,最后為占用1個(gè)byte的結(jié)尾符0xef,示意圖如下:[---length---][---------payload------][ef]|------2-------|----------Length-------|-1-|(單位byte)則對(duì)應(yīng)的binary匹配表達(dá)式如下:...Packet=...casePacketof
<<Len:16,
PayLoad:Len/binary,16#ef>>->
{body,PayLoad};
_->
{error,invalid_packet}end.
Erlang語(yǔ)法CON'T序列化與反序列化Erlang中序列化非常簡(jiǎn)單term_to_binary/1-將任意數(shù)據(jù)轉(zhuǎn)化為二進(jìn)制序列binary_to_term/1-將編碼的二進(jìn)制數(shù)據(jù)轉(zhuǎn)化為Erlang數(shù)據(jù)比如:Obj={apple,{price,2.0},{origin,shandong}},Bin=term_to_binary(Obj),Obj=binary_to_term(Bin)CouchDB中大量使用erlang的序列化相關(guān)函數(shù),完成數(shù)據(jù)的存儲(chǔ)與加載.
Erlang語(yǔ)法CON'TTailRecursion尾遞歸Erlang中沒(méi)有for,while關(guān)鍵字可以利用遞歸實(shí)現(xiàn)循環(huán)在server開(kāi)發(fā)中,確保使用尾遞歸:server_loop(Args)->
...someaction...
server_loop(Args).使用尾遞歸,可以消耗很少的內(nèi)存,僅僅是一個(gè)地址跳轉(zhuǎn).server_loop(Args)->
...someaction...
server_loop(Args),
other_fun().Erlang語(yǔ)法CON'T
發(fā)送Message"!"
基于消息通信,NoLock!NoSharedMemroy!
Pid!{msg,"hello,Iloveerlang"}
向Pid(本地或遠(yuǎn)程主機(jī))代表的進(jìn)程發(fā)送消息receive1,阻塞等待任意消息:receive
Msg->okend3,等待消息,超時(shí)為5sec:receive
Msg->okafter5000->
timeoutend2,實(shí)現(xiàn)sleep:receiveafterTime->
okend4,檢測(cè)是否存在消息:receive
SomeMsg->existafter0->
no_existendErlang并發(fā)關(guān)于Process每個(gè)Process擁有一個(gè)mailbox,保存消息Processes之間通過(guò)發(fā)送異步Message進(jìn)行交互,無(wú)共享狀態(tài)輕量,兼有OSProcess的隔離及OSThread的高效Process具有自己Stack,Heap,GCProcess可以位于Local,也可以位于RemoteMachineProcess能夠進(jìn)行多種形式的管理及控制(link,monitor,exitsignal)Process為erlang高并發(fā),高容錯(cuò),分布式的基礎(chǔ)并發(fā)Process數(shù):default32768,max268435456Erlang并發(fā)CON'T基于Process的httpserver框架(oneloopprocess,perconectionperprocess):
setupuplistensocket,spawn(listen_process).inlisten_process:
whilecanacceptnew
clientconnect
accept
,
spawn(client_process)
loopinclient_process:
processprotocol,
closesocket.
Erlang并發(fā)CON'T使用Erlang我們可以:以清晰的風(fēng)格開(kāi)發(fā)高并發(fā)的應(yīng)用
我們將不在受困于:線程池的復(fù)雜死鎖,競(jìng)賽的窘迫內(nèi)存泄露局部問(wèn)題,導(dǎo)致的全局崩潰與跨平臺(tái)多核SMP的格格不入
Erlang分布式ErlangNode是分布式通訊的基本單元,可以位于同一機(jī)器or多臺(tái)機(jī)器,實(shí)現(xiàn)了原語(yǔ)級(jí)的節(jié)點(diǎn)通訊ErlangNode通過(guò)erl-snameName
orerlang-nameName啟動(dòng),同一臺(tái)機(jī)器可以啟動(dòng)多個(gè)Node每臺(tái)機(jī)器上啟動(dòng)ErlangNode時(shí),都會(huì)啟動(dòng)一個(gè)epmd(ErlangPortMapperDaemon,port4396),用來(lái)進(jìn)行Node和Machine之間的映射不同機(jī)器的Node之間通過(guò)Tcp連接進(jìn)行Message傳輸(可以自定義分布式通訊實(shí)現(xiàn),如通過(guò)ssh)global維護(hù)一個(gè)全局的Nodes網(wǎng)絡(luò)spawn[_link|_opt]都具有分布式版本,可以再其他節(jié)點(diǎn)創(chuàng)建ProcessErlang分布式CON'TErlang分布式CON'T節(jié)點(diǎn)A2連接節(jié)點(diǎn)B2步驟NodeA2,B2啟動(dòng),綁定一個(gè)本機(jī)端口,并注冊(cè)到本機(jī)的epmd(defaultport4396)A2連接HostBepmd,請(qǐng)求獲取B2節(jié)點(diǎn)的綁定端口HostBepmd將B2的bindport及dist協(xié)議版本等信息返回給A2
A2與B2協(xié)商,建立tcp連接,如果連接成功,維護(hù)一個(gè)tick,來(lái)定期檢測(cè)B2節(jié)點(diǎn)
A2與B2節(jié)點(diǎn)之間的消息,通過(guò)此連接進(jìn)行發(fā)送
ErlangOTPOTP(OpenTelecomPlatform),其定義了一系列項(xiàng)目開(kāi)發(fā)中需要的模式及部署升級(jí)策略,為提高開(kāi)發(fā)效率,構(gòu)建高效,穩(wěn)定系統(tǒng)提供了巨大的幫助。同最初時(shí)的專有電信平臺(tái)應(yīng)用已沒(méi)有太多關(guān)系當(dāng)前系統(tǒng)都是采用OTP進(jìn)行開(kāi)發(fā)Erlang中各種lib都是基于OTP開(kāi)發(fā)可以理解成某種輕量的框架,或者具體化的設(shè)計(jì)模式behaviours包含:application,supervisor,gen_server,gen_fsm,gen_eventapplication,release,releasehandling提供應(yīng)用的部署,升級(jí),回退等實(shí)現(xiàn)與其它語(yǔ)言的交互ExternalApp外部應(yīng)用崩潰不會(huì)影響Erlang虛擬機(jī)Ports-通過(guò)port與外部應(yīng)用交互(stdin/stdout)Erl_Iterface-提供c的封裝,方便開(kāi)發(fā)port應(yīng)用LinkinDriversharedlibrary(SOinUnix,DLLinWindows),影響Erlang虛擬機(jī)穩(wěn)定性(不推薦)Portdirvers-提供c封裝,運(yùn)行在erlang虛擬機(jī)內(nèi)部CNodes遵照erlang的交互協(xié)議,使用c實(shí)現(xiàn)的一個(gè)erlangnodeJinterface提供一系列與Erlang進(jìn)行交互的Java包Erlang代碼片段求某個(gè)數(shù)的階乘
factorial(0)->1;
factorial(N)->N*factorial(N-1).獲取遠(yuǎn)程機(jī)器的issue信息(linux)
-module(issue).
-compile([export_all]).
%%startserver
server()->
register(issue_server,spawn(funserver_loop/0)).
server_loop()->
receive
{From,{get,issue}}->
From!{issue,get_issue()};
_->
ok
end,
server_loop().
一些工具appmon-OTPapplication監(jiān)控工具cover-
erlang代碼覆蓋測(cè)試ntop-顯示Node中進(jìn)程信息(unixtop)make-erlang中的make工具pman-erlang中進(jìn)程管理器tv-ets和mnesia查看器fprof-
erlang系統(tǒng)性能分析common_test-erlang測(cè)試框架dialyzer-代碼靜態(tài)分析debugger-單步調(diào)試工具,基于(tcl/tk)學(xué)習(xí)資源Erlang官方網(wǎng)站
ErlangChinaErlangMailistErlangPlanetErlang非業(yè)余研究ErlangDisplay
開(kāi)源項(xiàng)目ejabberd-theErlangJabber/XMPPdaemon
RabbitMQ-AMQPserverCouchDB-schema-freedocumentdatabaseTsung-multi-protocoldistributedloadtesting
Scalaris-distributedkey-valuestoreDisco-MapReduceFramework
Mochiweb-PowerfulHttpServerTookit自己動(dòng)手發(fā)起erlang開(kāi)源項(xiàng)目!案例AXD301高并發(fā)的電信交換機(jī)99.9999999%可靠性(~3ms故障/年)超過(guò)100萬(wàn)行Erlang代碼軟實(shí)時(shí)系統(tǒng)高容錯(cuò)案例WEBIM后臺(tái)(mochiweb)
7+百萬(wàn)活躍用戶~100serverajax+comet(long-polling)更多應(yīng)用x=t(q$mZiVfRbO7K4G0D.z`w-s*o!lXhUdQaM6J3F:C<y@u)r%n#jWgScP9L5I1E;A~x+t(p$mYiVeRbO7K4G0D>z`v-s&o!kXhUdQaM6J2F:B<y=u)q%n#jWgScP8L5H1E.A~w+t(p$mYiVeRbN7K3G0C>z@v-s&o!kXhTdQ9M6I2F;B<y=u)q%nZjWfScO8L4H1E.A~w+t*p$lYiUeRaN7K3G0C>z@v-r&o#kXgTdP9M6I2F;B<x=u(q%mZjVfScO8L4H1D.A`w+s*p!lYiUeRaN7J3G:C>y@v)r&o#kXgTdP9M5I2E;B~x=t(q%mZjVfSbO8K4H0D.z`w+s*p!lYhUeQaN6J3F:C>y@v)r&n#kWgTcP9L5I2E;B~x=t(q$mZiVfRbO7K4H0D.z`w-s*o!lXhUdQaN6J3F:C<y@u)r%n#jWgTcP9L5I1E;A~x+t(p$mZiVfRbO7K4G0D>z`v-s&o!lXhUdQaM6J2F:B<y=u)r%n#jWgScP8L5H1E.A~x+t(p$mYiVeRbN7K3G0D>z`v-s&o!kXhTdQ9M6I2F:B<y=u)q%nZjWfScO8L5H1E.A~w+t*p$lYiUeRbN7K3G0C>z@v-r&o#kXhTdQ9M6I2F;B<x=u(q%mZjWfScO8L4H1D.A`w+s*p$lYiUeRaN7J3G:C>y@v-r&o#kXgTdP9M5I2E;B<x=u(q%mZjVfSbO8K4H0D.A`w+s*p!lYhUeQaN6J3G:C>y@v)r&n#kWgTcP9M5I2E;B~x=t(q$mZiVfSbO8K4H0D.z`w-s*o!lXhUeQaN6J3F:C<y@u)r%n#kWgTcP9L5I1E;A~x+t(q$mZiVfRbO7K4G0D>z`w-s*o!lXhUdQaM6J2F:B<y@u)ZiVfSbO8K4H0D.z`w-s*o!lYhUeQaN6J3F:C<y@u)r%n#kWgTcP9L5I1E;A~x+t(q$mZiVfRbO7K4G0D>z`w-s*o!lXhUdQaM6J2F:C<y@u)r%n#jWgScP8L5H1E;A~x+t(p$mYiVeRbN7K4G0D>z`v-s&o!kXhTdQaM6J2F:B<y=u)q%nZjWgScP8L5H1E.A~w+t*p$lYiVeRbN7K3G0C>z@v-r&o!kXhTdQ9M6I2F;B<x=u)q%nZjWfScO8L4H1D.A~w+t*p$lYiUeRaN7J3G:C>z@v-r&o#kXgTdP9M5I2F;B<x=u(q%mZjVfSbO8L4H1D.A`w+s*p!lYhUeRaN7J3G:C>y@v)r&n#kWgTdP9M5I2E;B~x=t(q$mZjVfSbO8K4H0D.z`w-s*p!lYhUeQaN6J3F:C<y@v)r&n#kWgTcP9L5I1E;B~x=t(q$mZiVfRbO7K4G0D.z`w-s*o!lXhUdQaM6J3F:C<y@u)r%n#jWgScP9L5I1E;A~x+t(p$mYiVfRbO7K4G0D>z`v-s&o!kXhUdQaM6J2F:B<y=u)q%n#jWgScP8L5H1E.A~w+t(p$mYiVeRbN7K3G0C>z`v-s&o!kXhTdQ9M6I2F;B<y=u)q%nZjWfO7K4G0D>z`v-s&o!lXhUdQaM6J2F:B<y=u)q%n#jWgScP8L5H1E.A~w+t(p$mYiVeRbN7K3G0C>z`v-s&o!kXhTdQ9M6I2F:B<y=u)q%nZjWfScO8L4H1E.A~w+t*p$lYiUeRaN7K3G0C>z@v-r&o#kXgTdQ9M6I2F;B<x=u(q%mZjWfScO8L4H1D.A`w+s*p!lYiUeRaN7J3G:C>y@v)r&o#kXgTdP9M5I2E;B~x=u(q%mZjVfSbO8K4H0D.A`w+s*p!lYhUeQaN6J3F:C>y@v)r&n#kWgTcP9L5I2E;B~x=t(q$mZiVfRbO8K4H0D.z`w-s*o!lXhUeQaN6J3F:C<y@u)r%n#jWgTcP9L5I1E;A~x+t(p$mZiVfRbO7K4G0D>z`v-s*o!lXhUdQaM6J2F:B<y@u)r%n#jWgScP8L5H1E.A~x+t(p$mYiVeRbN7K3G0D>z`v-s&o!kXhTdQ9M6J2F:B<y=u)q%nZjWfScP8L5H1E.A~w+t*p$lYiUeRbN7K3G0C>z@v-r&o#kXhTdQ9M6I2F;B<x=u(q%nZjWfScO8L4H1D.A`w+t*p$lYiUeRaN7J3G:C>)q%nZjWfScP8L5H1E.A~w+t*p$lYiVeRbN7K3G0C>z@v-r&o#kXhTdQ9M6I2F;B<x=u(q%nZjWfScO8L4H1D.A`w+t*p$lYiUeRaN7J3G:C>z@v-r&o#kXgTdP9M5I2E;B<x=u(q%mZjVfSbO8K4H1D.A`w+s*p!lYhUeQaN7J3G:C>y@v)r&n#kWgTdP9M5I2E;B~x=t(q$mZiVfSbO8K4H0D.z`w-s*o!lYhUeQaN6J3F:C<y@u)r&n#kWgTcP9L5I1E;A~x=t(q$mZiVfRbO7K4G0D>z`w-s*o!lXhUdQaM6J2F:C<y@u)r%n#jWgScP8L5I1E;A~x+t(p$mYiVeRbO7K4G0D>z`v-s&o!kXhTdQaM6J2F:B<y=u)q%nZjWgScP8L5H1E.A~w+t*p$mYiVeRbN7K3G0C>z@v-s&o!kXhTdQ9M6I2F;B<y=u)q%nZjWfScO8L4H1D.A~w+t*p$lYiUeRaN7J3G0C>z@v-r&o#kXgTdP9M6I2F;B<x=u(q%mZjVfScO8L4H1D.A`w+s*p!lYhUeRaN7J3G:C>y@v)r&n#kXgTdP9M5I.A~w+t*p$lYiUeRaN7J3G0C>z@v-r&o#kXgTdP9M6I2F;B<x=u(q%mZjVfScO8L4H1D.A`w+s*p!lYiUeRaN7J3G:C>y@v)r&n#kXgTdP9M5I2E;B~x=t(q%mZjVfSbO8K4H0D.z`w+s*p!lYhUeQaN6J3F:C>y@v)r&n#kWgTcP9L5I1E;B~x=t(q$mZiVfRbO7K4H0D.z`w-s*o!lXhUdQaN6J3F:C<y@u)r%n#jWgTcP9L5I1E;A~x+t(p$mYiVfRbO7K4G0D>z`v-s&o!lXhUdQaM6J2F:B<y=u)r%n#jWgScP8L5H1E.A~x+t(p$mYiVeRbN7K3G0C>z`v-s&o!kXhTdQ9M6I2F:B<y=u)q%nZjWfScO8L5H1E.A~w+t*p$lYiUeRbN7K3G0C>z@v-r&o#kXgTdQ9M6I2F;B<x=u(q%mZjWfScO8L4H1D.A`w+s*p$lYiUeRaN7J3G:C>y@v-r&o#kXgTdP9M5IA~w+t*p$lYiUeRbN7K3G0C>z@v-r&o#kXhTdQ9M6I2F;B<x=u(q%mZjWfScO8L4H1D.A`w+s*p$lYiUeRaN7J3G:C>y@v-r&o#kXgTdP9M5I2E;B<x=u(q%mZjVfSbO8K4H0D.A`w+s*p!lYhUeQaN6J3G:C>y@v)r&n#kWgTcP9M5I2E;B~x=t(q$mZiVfSbO8K4H0D.z`w-s*o!lXhUeQaN6J3F:C<y@u)r%n#kWgTcP9L5I1E;A~x+t(q$mZiVfRbO7K4G0D>z`w-s*o!lXhUdQaM6J2F:B<y(q$mZiVfSbO8K4H0D.z`w-s*o!lYhUeQaN6J3F:C<y@u)r&n#kWgTcP9L5I1E;A~x+t(q$mZiVfRbO7K4G0D>z`w-s*o!lXhUdQaM6J2F:C<y@u)r%n#jWgScP8L5I1E;A~x+t(p$mYiVeRbN7K4G0D>z`v-s&o!kXhTdQaM6J2F:B<y=u)q%nZjWgScP8L5H1E.A~w+t*p$mYiVeRbN7K3G0C>z@v-r&o!kXhTdQ9M6I2F;B<x=u)q%nZjWfScO8L4H1D.A~w+t*p$hTdQaM6J2F:B<y=u)q%nZjWgScP8L5H1E.A~w+t*p$mYiVeRbN7K3G0C>z@v-s&o!kXhTdQ9M6I2F;B<x=u)q%nZjWfScO8L4H1D.A~w+t*p$lYiUeRaN7J3G0C>z@v-r&o#kXgTdP9M6I2F;B<x=u(q%
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 無(wú)人值守巡視檢查制度
- 新業(yè)態(tài)職業(yè)傷害保障的原理與制度
- 推行管理干部崗位資格證書(shū)制度
- 慕課在線課程建設(shè)制度
- 心理咨詢室學(xué)生隱私保護(hù)制度
- 廢舊回收制度
- 【答案】《病理生理學(xué)》(濱州醫(yī)學(xué)院)章節(jié)作業(yè)慕課答案
- 層樓板荷載標(biāo)識(shí)及控制制度
- 石家莊人民醫(yī)學(xué)高等專科學(xué)?!缎W(xué)兒童文學(xué)選讀》2023-2024學(xué)年第二學(xué)期期末試卷
- 柳州工學(xué)院《嵌入式系統(tǒng)實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 航運(yùn)電子商務(wù)行業(yè)發(fā)展前景分析及物流配送體系創(chuàng)新與商業(yè)模式研究
- 2025年陜西中考語(yǔ)文試卷副題及答案
- 腦癱兒童護(hù)理中的職業(yè)治療
- 心理治療方案在消化系統(tǒng)疾病患者中的應(yīng)用
- 篩分設(shè)備安裝施工詳細(xì)方案
- 2025年低空經(jīng)濟(jì)行業(yè)災(zāi)害應(yīng)急演練與評(píng)估報(bào)告
- 醫(yī)美院感知識(shí)培訓(xùn)課件
- 綠色交通系統(tǒng)1000輛新能源公交車推廣可行性研究報(bào)告
- 拜師儀式流程及主持稿
- 廠用電安全知識(shí)培訓(xùn)課件
- Unit 1 Travel (同步練習(xí))-【中職英語(yǔ)】高一英語(yǔ)下學(xué)期(高教版2023基礎(chǔ)模塊2)(解析版)
評(píng)論
0/150
提交評(píng)論