pop 订阅
本来是指商业销售中的一种店头促销工具,其型式不拘,但以摆设在店头的展示物为主,如吊牌、海报、小贴纸、纸货架、展示架、纸堆头、大招牌、实物模型、旗帜等等,都是林立在POP的范围内。其主要商业用途是刺激引导消费和活跃卖场气氛。常用的POP为短期的促销使用,它的形式有户外招牌,展板,橱窗海报,店内台牌,价目表,吊旗,甚至是立体卡通模型等夸张幽默,色彩强烈,能有效地吸引顾客的视点唤起购买欲,它作为一种低价高效的广告方式已被广泛应用。 展开全文
本来是指商业销售中的一种店头促销工具,其型式不拘,但以摆设在店头的展示物为主,如吊牌、海报、小贴纸、纸货架、展示架、纸堆头、大招牌、实物模型、旗帜等等,都是林立在POP的范围内。其主要商业用途是刺激引导消费和活跃卖场气氛。常用的POP为短期的促销使用,它的形式有户外招牌,展板,橱窗海报,店内台牌,价目表,吊旗,甚至是立体卡通模型等夸张幽默,色彩强烈,能有效地吸引顾客的视点唤起购买欲,它作为一种低价高效的广告方式已被广泛应用。
信息
简    写
POP
外文名
Point Of Purchase
又    名
店头陈设
用    途
信息宣传
中文名
卖点广告
POP工具
绘制一张精美的POP海报,可以利用以下的工具来混合搭配,不限定一定要利用某一种特定的工具,这些都是完成一张POP手绘海报的基本工具,可以在美术行或是书店中买到:一、彩色笔:分角头及圆头二种笔头。二、麦克笔:分角头及圆头二种笔头,又分酒精、水性、油性三种溶液的麦克笔。三、粉、蜡笔。四、粉彩笔。五、彩色铅笔、素描铅笔。六、水彩、广告颜料、圆或平的水彩笔。七、毛笔、墨汁、色丹。八、笔刀、美工刀、割圆器、造型剪刀、剪刀。九、双面胶、口红胶、透明胶带、纸胶带、胶水、照片胶、台湾黏胶。十、切割板、切割钢尺(三十公分、七十公分、一百公分各一)、小尺、波浪尺、软尺。十一、圆规。十二、针笔。十三、立可白、修正带、白漆笔、金漆笔、银漆笔。十四、手提袋、纸卷筒。(注:粉、蜡笔 与 粉彩笔 皆以蜡纸或胶质来凝固,不同于麦克笔具有的渗透性,故纸面的附着力较差,在绘制完成后最好喷上保护胶才不易脱落,画面才能保持完整.)
收起全文
精华内容
下载资源
问答
  • pop()函数 1、描述 pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。 语法 pop()方法语法: list.pop(obj=list[-1]) 2、参数 obj – 可选参数,要移除列表元素的对象。 3、返回值 该...
  • 辞郁POP工具主要用于:打印零售软件中商品POP促销单。 本程序使用于:思迅软件、科脉软件、百威软件、泰格软件、嬴通软件等。 安装配置完连接参数后,用默认管理员账号:辞郁,密码:ciyu登录,主界面左上角,双击...
  • Pop_Icons Pop_Icons是Pop!_OS的图标主题。 它使用带有凸起3D图案的半平面设计来帮助增加图标的深度。 Pop_Icons的灵感来自Adwaita GNOME图标。 复制或重用 该项目具有混合许可。 您可以根据每个许可的条款自由...
  • 辞郁报表设计器主要用于:打印零售软件中商品POP促销单。 安装配置完连接参数后,用默认管理员账号:辞郁,密码:ciyu登录,主界面左上角,双击输入管理员辞郁密码:ciyu 进入设计模式。下载内容中有详细示例截图。 ...
  • 内含4款语音合成工具 1.QT文本转语音-v1.0 2.捷通华声语音朗读软件 3.语音合成_不得大于204个字 ...用于超市打印pop特价标签模板(A4格式),单个打印,批量打印均可,含横版,竖版有多种类型标签模板。
  • pop-cache提供了通过几个不同的适配器缓存经常访问的内容的功能。 根据服务器环境和可用资源,应用程序可以使用以下缓存适配器之一: APC(缓存服务) 文件(磁盘上的目录) Memcache(缓存服务) Redis(缓存...
  • Popmart popmart模拟器程序
  • dpop:DPOP网站-源码

    2021-03-07 22:09:45
    dpop:DPOP网站
  • , Pop = require ( './react-pop.jsx' ) React . render ( < Pop xss=removed xss=removed> Vestibulum interdum dapibus iaculis. Pellentesque a condimentum erat, non tempus erat. Sed pellentesque, ...
  • POP学习教案课程.docx

    2020-12-09 16:29:35
    哈尔滨现代艺术设计职业技术学校 教 案 手绘 POP 第 1 课 课题 POP 简介 备课时间 2014年3 月1 日 授课时间 2014年 3 月 日 知识与技能了解其特点和作用功能 教 学 方法与过程讲授法 目 标 情感态度与价值观 了解和...
  • 360POP-P1-V3.1.2.67551.bin360安全路由器p1升级文件
  • 器具POP缓冲区,作为描述。 安装 $ npm install pop-buffer 例子 var bunny = require ( 'bunny' ) ; var encode = require ( 'pop-buffer' ) . encode ; var decode = require ( 'pop-buffer' ) . decode ; var ...
  • 00ic POP28335原理图

    2017-11-22 13:52:34
    00ic POP28335原理图,对想买开发板并想提前了解开发板的人有帮助
  • pop_layers:我的Pop!_OS配置脚本
  • 主要介绍了Python使用smtp和pop简单收发邮件完整实例,简单介绍了smtp和pop,然后分享了相关实例代码,具有一定借鉴价值,需要的朋友可以参考下
  • PUSH_POP 一个UINavigationController的分类,实现push或者pop的完成回调.以及一些特殊的push或者pop需求
  • 主要介绍了深入了解Python中pop和remove的使用方法,具有一定借鉴价值,需要的朋友可以参考下
  • 易语言Telnet POP邮件接收源码
  • Pop_Os-Config-Backup:将脚本安装到我的Pop!_Os 20.10工作流程中
  • import PopPop from 'react-poppop' ; // not using es6 var PopPop = require ( 'react-poppop' ) ; UMD版本也可用。 如果这样做,则需要包括依赖项: 例如: < script src =" https://unpkg.com/react@16
  • python pop_Python清单pop()方法

    千次阅读 2020-07-18 21:54:52
    python pop 介绍 (Introduction) Today we’ll be going the Python list pop() method. We generally have various built-in methods to remove or delete any element from a list in Python. We have del, ...

    python pop

    介绍 (Introduction)

    Today we’ll be going the Python list pop() method. We generally have various built-in methods to remove or delete any element from a list in Python. We have del, remove(), as well as the pop() method to accomplish the task. But each one of them has their own differences. Let’s find out how to use the pop() method and what are the benefits of using this method.

    今天,我们将使用Python列表pop()方法。 通常,我们有各种内置方法可以从Python中的列表中删除删除任何元素。 我们有delremove()pop()方法来完成任务。 但是他们每个人都有自己的差异。 让我们找出如何使用pop()方法以及使用此方法有什么好处。

    Python List pop()方法的工作 (Working of Python List pop() Method)

    Basically, the pop() method in Python pops out the last item in a list when no parameter is passed. When passed with some index, the method pops the element corresponding to the index.

    基本上,当不传递任何参数时,Python中的pop()方法会弹出列表中的最后一项。 与某些索引一起传递时,该方法将弹出与该索引对应的元素。

    Syntax,

    句法,

    
    #pop() method syntax in Python
    pop(index)    
    
    • When an index is passed, the method removes the element at the index, as well as returns the same,

      传递索引后 ,该方法将删除索引处的元素,并返回该元素,
    • When nothing is passed, the method removes the last element and returns it where the function was previously called.

      如果没有传递任何内容 ,则该方法将删除最后一个元素,并将其返回到先前调用该函数的位置。

    使用Python清单pop() (Using the Python List pop())

    Take a look at the example code below, it illustrates the use of the built-in pop() method in python.

    看一下下面的示例代码,它说明了python中内置pop()方法的用法。

    
    list1=[0,1,2,3,4,5,6,7,8,9,10]
    
    #pop last element
    print("pop() returns :",list1.pop(),"; currently list=",list1)   
    
    #pop element at index 0
    print("pop(0) returns :",list1.pop(0),"; currently list=",list1)
    
    #pop element at index 1
    print("pop(1) returns :",list1.pop(1),"; currently list=",list1)  
    
    #pop element at index 2
    print("pop(2) returns :",list1.pop(2),"; currently list=",list1)    
    
    #pop element at index 3
    print("pop(3) returns :",list1.pop(3),"; currently list=",list1) 
    
    #pop element at index 4
    print("pop(4) returns :",list1.pop(4),"; currently list=",list1)
    
    

    Output:

    输出:

    List Pop In Python
    List pop() In Python
    在Python中列出pop()
    • At first, we initialize a list, list1 as [0,1,2,3,4,5,6,7,8,9,10]. On this list, we perform the corresponding pop operation by passing distinct indices

      首先,我们将list1初始化为[0,1,2,3,4,5,6,7,8,9,10]。 在此列表上,我们通过传递不同的索引来执行相应的pop操作
    • pop() – As stated earlier, by default pop() returns and removes the last element from a list. In our case, the last element was 10, which gets popped consecutively

      pop()–如前所述,默认情况下pop()返回并从列表中删除最后一个元素。 在我们的例子中,最后一个元素是10,它会连续弹出
    • pop(0) – This pops the element in the list1, at the 0th position, which is 0 in our case

      pop(0)–弹出list1中位于第0个位置的元素,在本例中为0
    • Similarly, all the operations pop(1), pop(2), pop(3), and pop(4) return the items at their respective indices. Which are 2 4 6 and 8 as we continue to pop elements out of the list.

      类似地,所有操作pop(1),pop(2),pop(3)和pop(4)都会在其各自的索引处返回项目。 当我们继续将元素从列表中弹出时,它们是2 4 6和8。

    使用Python清单pop()方法时发生错误 (Errors while using Python List pop() Method)

    1.使用Python pop()的IndexError (1. IndexError with Python pop())

    While using the Python list pop() method, we encounter an IndexError if the index passed to the method is greater than the list length.

    在使用Python列表pop()方法时,如果传递给该方法的索引大于列表长度,则会遇到IndexError

    This Error occurs basically when the index provided it out of the list’s range. Let us look at a small example of this:

    当索引提供的错误超出列表的范围时,基本上会发生此错误。 让我们看一个小例子:

    
    list1=["John","Charles","Alan","David"]
    
    #when index passed is greater than list length
    print(list1.pop(10))
    

    Output:

    输出

    
    Traceback (most recent call last):
      File "C:/Users/sneha/Desktop/test.py", line 4, in <module>
        print(list1.pop(10))
    IndexError: pop index out of range
    
    Process finished with exit code 1
    

    In this example, it is clear that the index provided to the pop() method, 10 is larger than the list’s length(4). Hence, we get the IndexError.

    在此示例中,很明显提供给pop()方法的索引10大于列表的length( 4 )。 因此,我们得到IndexError

    2.列表为空时出错 (2.Error when the list is empty)

    Similar to the previous section, when we try to perform the Python List pop() method on an empty list, we face the same IndexError. For example:

    与上一节类似,当我们尝试在一个空列表上执行Python List pop()方法时,我们面临着相同的IndexError 。 例如:

    
    l1=[]
    #for empty lists
    print(l1.pop())
    

    Output:

    输出

    
    Traceback (most recent call last):
      File "C:/Users/sneha/Desktop/test.py", line 4, in <module>
        print(list1.pop())
    IndexError: pop from empty list
    
    Process finished with exit code 1
    

    So, we can conclude that while performing Python list pop() method on an empty list, an IndexError is thrown.

    因此,我们可以得出结论,在对一个列表执行Python list pop()方法时,将抛出IndexError

    Hence, we must check before we apply the pop() method, that the list we are dealing with is not empty. A simple length check can solve our problem.

    因此,在应用pop()方法之前,必须检查要处理的列表是否为空。 简单的长度检查可以解决我们的问题。

    
    l1=[]
    #for empty lists check length before poping elements!
    if len(l1)>0:
        print(l1.pop())
    else:
        print("Empty list! cannot pop()")
    

    Output:

    输出

    
    Empty list! cannot pop()
    

    See, it’s easy. The if-else statement in Python checks whether the list is empty or not and only pops an element from the list when len(l1) > 0 i.e. when the list l1 is not empty.

    看,很容易。 Python中if-else语句检查列表是否为空,并且仅当len(l1)> 0(即列表l1不为空时才从列表中弹出元素。

    Python堆栈上的Python列表pop() (Python List pop() on a Python Stack)

    As we have seen in our Python Stack Tutorial, pop() is also a stack operation used to remove the last task or element pushed. Let us see how we can implement the Python list pop() method in a stack using lists.

    正如我们在Python Stack Tutorial中所看到的, pop()也是一个堆栈操作,用于删除最后推送的任务或元素。 让我们看看如何使用列表在堆栈中实现Python list pop()方法。

    
    stack=[] #declare a stack
    
    print("Pushing tasks into stack...")
    for i in range(5):
        stack.append(i)
    
    print("stack=",stack)
    
    print("Poping tasks from stack:")
    #performing repetitive pop() on stack
    while len(stack)>0:
        print("pop()=",stack.pop(),";  Currently in Stack:",stack)
    

    Output:

    输出

    Pop On Stack
    Pop On Stack
    弹出堆栈
    • After declaring a stack list, we push 5 elements by continuously pushing tasks(elements) using the append() method.

      声明堆栈列表后,我们通过使用append()方法连续推送任务(元素)来推送5个元素。
    • As soon as our stack initialization is done, we repetitively pop() elements until the stack is empty.

      堆栈初始化完成后,我们将反复pop()元素,直到堆栈为
    • Notice that while poping elements from the stack we have used the condition len(stack) > 0 using the while loop. This ensures that the pop operation is performed only while the stack is not empty.

      注意,当从堆栈中弹出元素时,我们使用while循环使用了len(stack)> 0条件。 这样可确保仅在堆栈不为空时执行弹出操作。

    结论 (Conclusion)

    In this tutorial, we learned how the built-in pop() method in python works, errors related to it, as well as its applications in a stack. Feel free to ask any questions about the topic in the comments.

    在本教程中,我们学习了python中内置的pop()方法如何工作,与之相关的错误以及其在堆栈中的应用。 随时在评论中询问有关该主题的任何问题。

    参考资料 (References)

    翻译自: https://www.journaldev.com/36155/python-list-pop-method

    python pop

    展开全文
  • 360安全路由5G 360POP-P2-beta-V2.0.51.50574.bin刷机包
  • python pop() 与pop(0)速度对比

    千次阅读 2019-11-24 16:37:00
    1.pop()即每次弹出列表最后一个元素 pop_list = list(range(2000000)) pop_zero = Timer("pop_list.pop()", "from __main__ import pop_list") print(pop_zero.timeit(number=1000)) 消耗时间为:0.900295891 2....

    1.pop()即每次弹出列表最后一个元素

    pop_list = list(range(2000000))
    pop_zero = Timer("pop_list.pop()", "from __main__ import pop_list")
    print(pop_zero.timeit(number=1000))

    消耗时间为:0.900295891

    2.pop(0)即每次弹出列表第一个元素

    pop_list = list(range(2000000))
    pop_zero = Timer("pop_list.pop(0)", "from __main__ import pop_list")
    print(pop_zero.timeit(number=1000))

    消耗时间为:4.64420000000354e-05

    展开全文
  • 利用 POP 协议,编写一个邮件 Agent,接收和删除自己邮箱的邮件。支持163邮箱。 运行方式./a.out pop.163.com 邮箱 pop授权码
  • POP-Animation 非 CocoaPods 版本的 POP,自 2015.04.10 官网 POP 的 master 版本修改而成 注意 Xcode6以上新建的项目中,需要创建出pch文件,并且在pch文件中添加以下代码 // // POP.pch // POP // // Created by ...
  • 今天用pop的弹出窗口里,出现一个问题,当网页出现滚动条里,不能遮挡住,解决Pop遮罩层无法遮挡滚动条下问题。 pop滚动条遮挡
  • python中的pop函数使用技巧

    万次阅读 2018-10-28 14:54:06
    python 中的pop函数使用小技巧 1.pop()函数是主要作用在列表(list)中,移除列表中的元素,且通过下标值来实现功能,默认情况下移除列表的最后一个元素,每次只能移除一个。如果要移除列表第一个元素开始,则只...

    python 中的pop函数使用小技巧
    1.pop()函数是主要作用在列表(list)中,移除列表中的元素,且通过下标值来实现功能,默认情况下移除列表的最后一个元素,每次只能移除一个。如果要移除列表第一个元素开始,则只需要pop(0)[利用下标值从0开始的属性]就可以实现其功能。
    2.基于上面的功能说明可以结合while循环实现栈循环和队列循环,看代码

      ' for i in range(5)
        	urlList.append(i)  #  模拟先进的过程
        		
        while urlList:   #判断list是否为空
            url = urlList.pop(0)   #实现了先出的效果, 结合上面列表的创建过程,实现了先进先出的效果,就是队列
            print(url)
    
       while urlList:   #判断list是否为空
            url = urlList.pop()  #实现了后出的效果, 结合上面列表的创建过程,实现了先进后出的效果,就是栈
            print(url)
            '
            
    

    补充说明:这些在爬虫策略使用很多。

    展开全文
  • 背景近年来,各大APP内的弹层需求逐渐增多,以手机淘宝为例,日常的弹层上线频率为单端每月50次左右,而在大促期间可以达到240次以上。在手淘内,各类弹层业务都会通过PopLayer中间件...



    背景



    近年来,各大APP内的弹层需求逐渐增多,以手机淘宝为例,日常的弹层上线频率为单端每月50次左右,而在大促期间可以达到240次以上。在手淘内,各类弹层业务都会通过PopLayer中间件的能力进行投放。但业务往往会遇到开发弹层难、慢、稳定性差的种种困难。对比于往年业务研发成本较高的现状,PopLayer在今年提出了【低研发搭投模式】来解决这类问题,形成一套快速搭建+可视化+多端多场景通用的解决方案,在日常与大促期间得到了广泛应用:

    • 研发效率升级:弹层业务的上线成本从3天+,降低到2小时左右

    • 业务覆盖率高:双11大促期间的业务覆盖率达到75%

    • 稳定性极佳:大促期间线上0故障

    在各类APP都逐渐走向存量时代,精细化流量运营的今天,弹层作为一个可以随时随地产生内容并带来高流量的强运营手段,已经从低频需求,变成了面向各类人群投放的高频需求。作为业务支撑方向的中间件,如何为业务提效,将业务的关注重点从开发转向内容运营,助力其完成触达矩阵,成为了一件非常值得探索的事情。


    PopLayer


    弹层,是一种强触达用户的交互形态。PopLayer的定义,则是一个可以在任何APP页面上,在指定时间内,对页面无侵入地弹出任何内容的弹层中间件。其业务定位,则为触达各领域用户的重要流量场。

    为了便于理解,下面以手淘首页近期Pop为例,将手淘内的Pop业务分类举例介绍(本文中Pop即指弹层):

    1、大促氛围打造

    开售倒计时提醒

    2、增强用户体验

     

    死亡恢复浏览飘条

    3、红包发放&提醒

    左图:星秀猫开奖,右图:红包催用提醒飘条

    4、用户指引

    可以看到,弹层业务的交互形态是灵活多变的,业务目标诉求也各有不同。其背后有着各自业务层面的复杂诉求和增长目标。PopLayer为此提供了一套端侧弹层管理SDK+投放系统的整体解决方案。

    PopLayer常规投放&生效流程

    注:PopLayer是以端侧中间件为核心进行建设的,其中每个环节都有比较复杂的链路可以展开,这里我们不展开讨论端侧细节,主要讨论研发效率方面。

    在这套流程中,对业务方负担最重的,也是研发耗时最重的,便是前端页面的研发以及服务端接口的研发。且各个业务的曝光预判接口不断累积,也带来了非常大的资源浪费与QPS压力。随着弹层业务逐年增多,这套模式的弊端越来越凸显:

    • 研发效率低下。以日常期间观察,研发一个图文类型弹层,至少需要一个前端人员投入三天以上时间+一个后端人员投入三天以上时间+测试人员投入一天以上。

    • 运营效率低下。运营策略往往受限于研发成本、资源调控、以及上线时间等等问题,而无法灵活展开与快速迭代。尤其在大促期间,很多快速决策的运营玩法无法及时且稳定地落地,丧失了关键时刻获取流量的机会。

    • 研发质量难以保证。不同于整页研发,弹层存在一些特殊需要注意的问题。而研发人员接入PopLayer的流程熟悉程度往往有限,很容易因缺乏经验而产生线上异常,比如只有背景黑色遮罩弹出而内容加载失败(可以想一想会是什么状况)

    • 业务数据指标没有统一标准,无法形成客观统一的业务指标,无法通过数据快速定位问题,无法形成有效的数据沉淀与对比。

    • 整体方案难以沉淀复用。

    这样的研发成本,对于Pop这类往往需要快速响应的业务需求,是远远不能满足的。尤其在大促期间,对时效性要求很高,一个Pop从决策到上线,可能仅仅只有1-2个小时的响应时间,一旦错过时机对业务的流量损失是巨大的。

    经过建设搭投模式,这套陈旧野生的研发流程终于得到了改变。如今,通过新模式,一个常规的单图Pop几分钟就可以完成搭投。业务方可以彻底解放双手,集中精力在更加优质的内容编排与制作上。

    PopLayer搭投模式对研发流程的影响



    PopLayer搭投模式



    ▐  Pop业务背景分析


    经过长期与业务深入合作,我们发现弹层的需求往往有一定的规律可循。PopLayer领域下的业务特征大体如下:

    • UI结构轻量:主要为底图+内部图文混合的UI结构,视觉复杂度有限

    • 点击交互可枚举:跳转页面、关闭Pop、发送后端接口、切换内部子页面等

    • 组件复用性低、整体复用性高:每个Pop内部可复用的组件几乎不存在,更应该以一个完整的Pop作为一个模板进行维护和复用

    • Pop特有逻辑较多,比如疲劳度规则、各类数据来源变量解析等

    那么实现一套统一标准的搭建-投放链路,从前后端等各个方面逐个击破,来承载业务的大部分高频需求,支持其快速、无研发迭代上线,便成了解决这类问题的首选方案。

    得益于这套标准化的前端协议规则,我们可以将PopLayer的触发范围,从APP站内触达,向其他流量场横向扩展,比如Android桌面、H5环境等,这部分后文将会展开讨论。

    ▐  搭投模式架构


    搭投模式方案框架图

    我们通过锁定 无研发搭建+多端多领域统一框架 的解决方案,支持运营与业务快速完成各类弹层小时级上线。其链路主要包括如下几个部分:

    • 搭建

      • 设计一套Pop业务域内的统一业务描述DSL,来描述Pop的全部UI架构、数据提取规则、交互逻辑等等内容。以其为核心,完成搭建与各端各领域的解耦

      • 搭建IDE,提供友好的编辑界面、实时动态预览、真机预览、搭完即投等业务服务,最终产生标准DSL内容

    • 投放

      • 探索除APP站内之外的更多触达领域,包括Android桌面环境、H5环境

      • 研发DSL运行时解析引擎,并完成统一体验的Pop渲染及交互

    • ServerLess服务

      • 提供一体化人群预判服务

      • 提供权益、AB与模板搭建的打包配置能力,无需业务方自建实验、自研权益对接

      • 将单场景多Pop情况下的预判QPS压力,降低为单场景组合预判模式,有效降低服务端压力

    ▐  搭建

    搭建与DSL

    DSL,即领域特定描述语言,是为了解决特定领域问题而形成的编程语言或规范语言。在Pop业务域下,我们无需形成编程语言,甚至追求尽可能低研发,所以这里的DSL即为一种Pop业务域范围内的规范描述语言。

    Pop的DSL格式为常用的JSON格式。其整体结构为pages-UI动线、props-变量解析、requests-请求接口、env-环境全局配置。

    下面我们从交互动线结构、变量解析、事件结构、疲劳度几个方面分别介绍DSL描述的主要内容。

    1、交互动线与UI结构

    交互动线

    以如上的测试Demo为例,我们可以看到其基本动线为:展示开奖图文,点击后,进入第二页红包获取图文。但实际针对部分不同策略的用户,会如第二个视频,直接展示其红包获取图文。

    对应到DSL,我们提供了多子页面+多版本的描述方案,即通过创建多个子页面+每个子页面的多个版本来完成动线素材,并通过设置事件动作,完成动线串联。对应到DSL的结构,即通过pages+vers以树形结构分别描述各个子页面版本。其整体示例如下:

    布局版型

    Pop的布局版型是多种多样的,但基本可归类为如下几种:居中、四角挂角、四边贴边。DSL设计中,每一个子页面都可以单独设置其布局版型。不同的版型,会以不同的布局逻辑计算其大小位置。

    UI组件

    Pop形态下的UI组件,基于围绕着如下几个类型展开:图片、文本、视频、容器、倒计时、点击热区等。即通过提供大图或视频为背景,并通过容器+内部组件形成内部复杂的界面布局。我们针对各个组件提供了统一的布局配置+各自不同的素材配置。以一个倒计时组件为例:

    2、变量数据提取与绑定

    变量数据提取

    Pop的内容与服务端数据做绑定时,需要提供一套提取数据的描述方案。而数据来源因Pop的整体链路设计,存在多个可能来源。我们通过 指定数据来源+提供插入式Mtop接口配置+接口数据提取Function 完成数据提取的设置,形成一个变量。仍以上述Demo为例,其中红包金额的变量为服务端Mtop接口返回数据。其提取流程示例:

    即通过预判MTOP接口数据源,通过JSONPath,并指定其数据位置完成提取。在某些较为复杂的情况下,有时数据来源需要多层解析(JSONPath+URLDecode+URLParse),那么也支持其设置串行多层解析。

    变量绑定

    解析结束的变量,即视为一种全局资源,其可以绑定到各种内容与其他数据上,哪里需要哪里搬。比如图片地址、文本内容、toast内容、跳转地址、MTOP请求参数等等。其实现方案为常用的字符串模板表达式${prop_name},进行运行时替换。

    3、事件结构

    大多情况下,Pop内的事件,即为用户点击事件,但随着业务复杂度的提升,例如视频播放结束、视频加载失败、倒计时结束等时机也需要响应事件,我们便提供了统一的事件描述,方便挂载到各个组件事件配置上。而事件的类型。即为跳转场景、切换子页面、发送MTOP接口、关闭Pop等,我们分别对这些事件提供了对应的封装描述。此处细节较多暂不展开。

    4、疲劳度

    疲劳度是Pop投放策略的重要组成部分之一。疲劳度的设计分为疲劳度规则+疲劳度消耗规则。例如Pop需要用户每天曝光不设限,但点击后当天不再弹出。那么其疲劳度规则为一天一次,而消耗规则即为点击时消耗。通过这样的实现方式,则可以非常灵活的实现各类疲劳度需求,做到想怎么弹就怎么弹。

    在DSL的曝光、关闭、以及每个事件结构中,均有疲劳度消耗规则,而疲劳度整体规则,则通过不同的疲劳度表达式完成配置。

    搭建IDE

    IDE的核心功能,即为业务用户提供一个实时可视化、随时可真机预览、搭完即投的一站式搭建编辑器。其产出,则是产生一份描述业务完整需求的DSL内容。目前已为业务提供包括页面搭建、数据管理、曝光判定、疲劳度规则、降级策略、埋点配置等方面的搭建服务。

    搭建IDE


    ▐  投放

    如方案框架图所示,搭投模式的目标不仅仅是在APP站内完成Pop投放,还需要在Android桌面、站外H5这样的环境里完成一站式多端投放。我们可以把目前涉及的几个流量域,称为投放领域。

    APP站内的触发流程,即PopLayer端侧中间件,功能上有非常丰富的积累,可支撑几乎所有Pop业务的各方面诉求,此处不进行展开,本文将从弹出Pop后的解析引擎、Android桌面的投放领域支持方面进行介绍。

    运行时解析引擎

    针对不同的投放领域,需要形成各自的运行时解析引擎,目前我们完成了APP站内引擎:负责站内+Android桌面的解析渲染,以及H5站外引擎:负责H5环境下的解析渲染。这里我们主要针对站内引擎进行介绍。

    PreDisplay + Running

    解析引擎的主体工作流程,分为PreDisplay阶段:获取DSL、获取各环境数据、解析变量、完成UI渲染并曝光,以及Running阶段:在曝光后的事件交互处理。

    解析引擎工作流

    在执行display之前,Pop为隐形状态,用户无感知。经过如上图的DSL解析、同步各类环境数据、变量解析、曝光判定、素材加载等流程后,通过display接口,完成最终曝光。

    为了达到双端统一的渲染效果、高适配性、以及高性能渲染的要求,站内引擎的底层载体目前为Rax方案。基于Rax完善的工程化支持,我们得以完成一系列上层方案,无需过度关注动态性、适配性等问题。

    Android桌面流量域打通

    对于手淘这样日活流量足够大的APP,其Android桌面的触达流量价值同样是巨大的。相比APP站内的Pop触达,其更加拥有包括加强唤端、二方流量交换这样的独特价值。在有规则规范的投放前提下,我们可以通过端侧中间件建设,把Pop搭投的能力无差别的输出到桌面环境,使其成为Pop触达生态的一环。其具体的触达形态,则可以是顶部消息、挂角提醒等。其底层实现方案为Android悬浮窗。

    桌面Pop的效果Demo如下:

    桌面Pop方案框架

    首先,我们将桌面与站内进行了包括端侧、投放侧的搭投能力对齐,使一个搭建产生的页面,即可以投放在手淘里,也可以投放在桌面上。为此我们抹平了底层方案不同带来的差异,包括:

    • 搭投模式与站内一致,同样采用标准DSL+解析引擎完成渲染

    • 通过控制Window添加次序来对齐层级管理

    • 通过控制视窗大小位置,控制其可绘图区域;通过搭建输出可视区域位移量,对视窗内容进行位移还原窗口内容

    另外,我们提供了桌面环境的特殊处理:

    • 增加了切换桌面触发时机(计划触发,适合计划常驻),并打通了ACCS消息触发时机(即时触发,适合消息类型)

    • 增加了自由拖拽、边侧自动吸附功能

    由于桌面环境的特殊性,应避免对用户形成严重的干扰。那么桌面触达的规则管理则十分重要。目前我们设计了如下避免过度干扰的规则:

    • 桌面环境的Pop必须有明确明显的关闭按钮

    • 切换其他APP时,需要将Pop内容进行隐藏,对于Android高版本则进行倒计时后自动关闭设置

    • 桌面的弹出管理底层与站内一致,采用分层分优先级管理,并对一次桌面切换的曝光次数进行上限设置

    ▐  ServerLess相关建设

    从上述投放流程图可以看到,业务对于曝光预判、业务数据方面都是需要服务端的人力投入的。即除前端的研发成本问题,服务端同样面临类似的问题。我们梳理业务目前痛点如下:

    • 人力消耗大,大促时效性差

    • 机器资源消耗大

      • 全量配置下发+全量接口预判的模式,导致单活动机器资源消耗大;

      • 单场景(比如手淘首页)下的Pop往往存在多个,活动之间筛选独立进行,导致机器消耗总量增长快(QPS总量随活动数线性增加且无上限)

    • 稳定性风险高

      • 临时开发的模式,加上人员开发质量层次不齐,稳定性很难保障。

      • 业务需要自己投入精力维护稳定性,特别是每次大促的时候应对突发流量

    为此我们实现了对业务进行一站式托管服务。核心目标为:

    • 实现权益、导流这两个业务领域的无研发极速上线

    • 降低机器资源消耗,在线活动数量不再受机器资源限制

    • 托管业务全年0故障

    通过拆解上文的投放流程图,可以看到服务端的工作主要包括曝光预判接口,以及页面内的业务数据接口。我们针对两部分分别进行部分托管建设,架构图设计如下:

    ServerLess服务架构

    • 针对曝光预判接口,我们提供了单场景多活动的人群预判复用能力,即将人群圈选的预判模式统一集中管理,底层与奥格人群平台二方包打通,上层单场景仅透出一个整合接口。从过去每次切换页面触发N次预判接口,变为仅触发一次。业务也无需自研人群接口,仅需把人群包ID进行配置即可。

    • 针对内容数据接口,我们仍在建设中。计划通过底层打通了拉菲权益平台二方包,将权益类型(红包、优惠券等)直接整合进搭建体系中,业务无需进行复杂的权益能力对接,仅需提供权益ID配置即可。


    整体效果


    除文章开头提到双十一期间的业务覆盖率已经达到75%之外,得益于搭投模式对研发效率的提升,今年双十一期间,手淘内Pop的业务量和整体流量也有了大幅度飞跃:

    除此之外,今年我们快速稳定地响应了大促期间的全部紧急需求,避免出现过去几年因封网、研发效率等问题带来的无法上线Pop的情况。


    写在最后


    PopLayer目前除手淘外,已经服务了集团众多APP,包括天猫、淘宝特价版、闲鱼、淘宝直播、饿了么、Lazada、零售通、AE等等。后续也将继续以手淘为核心,服务更多的集团业务。

    通过双十一大促期间以及日常的业务覆盖率,我们印证了搭投模式+ServerLess对业务的价值。站在业务的角度思考,Pop这类“既轻量又复杂”的业务域,经过一番深挖的底层支持,可以大幅度破除业务的桎梏,让其解放双手,去快速通过“提出idea-搭投-AB-看数据-再次迭代”的模式得到最佳的业务结果。这套研发模式的优化,从思考如何研发变为如何尽可能封装研发,对于相对轻量级的业务域来说也是有输出价值的。

    后续,我们一方面将会继续完善相关建设,将AB、标签+推荐系统、引擎加载页面性能优化等等进行深度挖掘,从研发效率提升,升级到业务价值提升;另一方面也会将Pop的建设经验沉淀成流量域方法论的一部分,输出到其他流量域中,为业务探索与构建更有价值的流量增长矩阵。

    淘系平台技术

    我们背靠淘系基础架构和厂商,既有立足5G适配、网络加速、图片体验、网关调用、大内容上传下载等核心技术支撑业务体验升级和改造,又为用户增长提供消息推送、浮层搭投、厂商触达、外链拉端等流量端能力,并沉淀一系列如最小核、全链路数据等架构能力,为手淘及产品升级提供平台支撑,并成为集团移动端基础设施。

    职位:Android研发工程师、iOS研发工程师

    感兴趣的同学可将简历发送到:yangqing.yq@alibaba-inc.com,获取优先内推资格!

    ✿  拓展阅读

    作者|倪群(络天)

    编辑|橙子君

    出品|阿里巴巴新零售淘系技术

    展开全文
  • 音频系统POP音的原理和解决方法

    千次阅读 多人点赞 2019-06-02 20:55:52
    音频系统POP音的原理和解决方法 目录 文章目录音频系统POP音的原理和解决方法目录音频IC与功放IC的电源时序与功能模块使能时序功放IC输入端INP与INN的阻抗匹配增大VBIAS滤波电容BTL输出和SE输出减小输出端耦合电容...
  • Facebook Pop 使用指南 - v1.0,Facebook Pop 开源的Pop动画引擎。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,194,353
精华内容 477,741
关键字:

pop