精华内容
下载资源
问答
  • 摄影:产品经理干丝、...4年过去了,本来以为这个装饰器使用起来应该很自然的事情,但还是有同学不知道在什么场景下可以使用它。他们这样说的:classPeople:def__init__(self,name):self.name=nameself._work='...

    cd5c21d1a22ffd005f5d90df43aa7567.png

    摄影:产品经理干丝、火腿丝、香芹

    我在2016年的时候,写过一篇文章,介绍@property装饰器。4年过去了,本来以为这个装饰器使用起来应该是很自然的事情,但还是有同学不知道在什么场景下可以使用它。

    他们是这样说的:

    class People:
        def __init__(self, name):
            self.name = name
            self._work = '还没有找到工作'

        @property
        def work(self):
            return self._work

        @work.setter
        def work(self, value):
            self._work = value

    运行效果如下图所示:

    1e2af4d5a930ab5a5ddeae54c5fd701a.png

    但实际上,这段代码里面,@property装饰器根本没有任何存在的必要,代码完全可以进一步简化:

    class People:
        def __init__(self, name):
            self.name = name
            self.work = '还没有找到工作'

    运行结果完全一样:

    e79f2e0237b1c429815cddb6f8be6796.png

    那么,使用@property装饰器的意义在哪里呢?

    的确,在上面的例子里,@property装饰器没有任何存在的必要,因为这里读取一个对象的属性,仅仅是“返回数据”而已。但有些情况下,不仅仅要读取,还要计算。

    我举一个例子,不知道你有没有这样的经历,你刚刚看了一眼手机,发现现在时间是23:10分。30秒以后,你朋友碰巧问你多少点了,你立刻回答:23:10分。他一看手表,还真是。于是惊呼,你怎么不看表就知道时间?

    例如我们现在要实现一个ProxyProvider类,它读取 Redis,获取最新的代理 IP,然后随机返回一条。另外有一个程序,会增加新的代理 IP 到 Redis 中。但频率不高。

    所以,ProxyProvider这个类,不需要每次获取 IP 的时候都读取数据库,每小时读取一次就可以了。如果不用@property装饰器,你可能会这样写代码:

    import time
    import random


    class ProxyProvider:
        def __init__(self):
            self.pool = []
            self.last_update_time = 0

        def get_proxy(self):
            now = time.time()
            if now - self.last_update_time > 3600 or not self.pool:
                self.pool = self.get_all_proxies_from_redis()
            return random.choice(self.pool)

    如果你经常看 Java 代码,你会发现大量的这种get_xxxset_xxx的写法。

    于是,调用的时候,要这样调用:

    provider = ProxyProvider()
    provider.get_proxy()

    如果用@property,那么代码可以改写为:

    import time
    import random


    class ProxyProvider:
        def __init__(self):
            self.pool = []
            self.last_update_time = 0

        @property
        def proxy(self):
            now = time.time()
            if now - self.last_update_time > 3600 or not self.pool:
                self.pool = self.get_all_proxies_from_redis()
            return random.choice(self.pool)

    于是读取的时候,这样写:

    provider = ProxyProvider()
    provider.proxy  # 注意这里不加括号

    我们可以看到,整体代码逻辑是一样的,代码里并没有精简。不过在调用的时候,前者是调用一个方法,后者是读取一个属性。

    同理,如果要修改数据,不使用@property的时候,需要实现一个set_xxx方法。但是使用了@property装饰一个方法,也可以在设置数据的时候实现一些内部逻辑,例如:

    import time
    import random


    class ProxyProvider:
        def __init__(self):
            self.pool = []
            self.special_ip = set()
            self.last_update_time = 0

        @property
        def proxy(self):
            now = time.time()
            if now - self.last_update_time > 3600 or not self.pool:
                self.pool = self.get_all_proxies_from_redis()
            return random.choice(self.pool + list(self.special))

        @proxy.setter
        def proxy(self, value):
            if not value.startswith('http'):
                proxy = f'http://{ip}'
            if proxy in self.special_ip:
                return
            self.special_ip.add(proxy)

    而对于调用者来说,这些复杂的检查逻辑都是透明的:

    provider = ProxyProvider()
    provider.proxy = '123.45.67.89'

    对于习惯于 Java 的人来说,他们可能喜欢显式写出get_xxxset_xxx方法。但是对于习惯 Python 的人来说,我觉得使用@property会让代码的可读性更好。

    15275ec3617402dfd6e375ef604ff571.gif

    展开全文
  • 什么是NoSQL redis中文网 NoSQL Not Only SQL 的缩写,意即"不仅仅SQL"的意思,泛指非关系型的数据库。强调Key-Value Stores和文档数据库的优点。 NoSQL产品是传统关系型数据库的功能阉割版本,通过减少用不到...

    什么是NoSQL

    redis中文网

    • NoSQL 是 Not Only SQL 的缩写,意即"不仅仅是SQL"的意思,泛指非关系型的数据库。强调Key-Value Stores和文档数据库的优点。
    • NoSQL产品是传统关系型数据库的功能阉割版本,通过减少用不到或很少用的功能,来大幅度提高产品性能

    Redis简介

    Redis:Remote Dictionary Server(远程字典服务器)
    Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储。)。和Memcache类似,但很大程度补偿了Memcache的不足。和Memcache一样,Redis数据都是缓存在计算机内存中,不同的是,Memcache只能将数据缓存到内存中,无法自动定期写入硬盘,这就表示,一断电或重启,内存清空,数据丢失。所以Memcache的应用场景适用于缓存无需持久化的数据。而Redis不同的是它会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,实现数据的持久化

    Redis的特点

    1. Redis读取的速度是110000次/s,写的速度是81000次/s
    2. 原子 。Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
    3. 支持多种数据结构:string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)
    4. 持久化,主从复制(集群)
    5. 支持过期时间,支持事务,消息订阅。
    6. 官方不支持window,但是又第三方版本。

    1,单进程单线程

    采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗)
    why?
    多线程处理可能涉及到锁
    多线程处理会涉及到线程切换而消耗CPU
    单进程不存在线程安全问题
    缺点:
    无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善

    2,默认16个兄弟一起站台

    默认16个数据库,类似数组下表从零开始,初始默认使用零号库

    Redis的应用场景

    1、数据缓存(提高访问性能)

    将一些数据在短时间之内不会发生变化,而且它们还要被频繁访问,为了提高用户的请求速度和降低网站的负载,降低数据库的读写次数,就把这些数据放到缓存中。

    2、会话缓存

    (session cache,保存web会话信息)

    3、排行榜/计数器

    (NGINX+lua+redis计数器进行IP自动封禁)

    4、消息队列

    (构建实时消息系统,聊天,群聊),但一般是用的消息中间件,如ActiveMQ

    展开全文
  • 目前DBProxy在美团点评广泛应用,包括美团支付、酒店旅游、外卖、团购等产品线,公司内部对DBProxy的开发全面转到github上,开源和内部使用保持一致。目前只支持MySQL(Percona)5.5和5.6。 主要功能: 读写分离 从...
  • 「场景化」是伴随着营销始终潜在的前提,「场景化推广」是我最近想到的一个词,App推广场景化是什么意思呢?就是设计一个用户使用场景,让用户通过场景对你所推广的App有个进一步的认识,通过提升转化率,从而更大...

    「场景化」是伴随着营销始终潜在的前提,「场景化推广」是我最近想到的一个词,App推广场景化是什么意思呢?就是设计一个用户使用场景,让用户通过场景对你所推广的App有个进一步的认识,通过提升转化率,从而更大程度激发用户下载欲望。

    换句话说,就是让用户在恰当的环境去刚好下载合适的产品。

    例如:把产品放到一个场景化的「货架上」

    这样的场景,我们会想到:

    把苹果放再天天果园上去卖
    把店铺/衣服放在淘宝上去卖
    把App放在应用商店里去卖

    同时,这些也是用户主动性的使用购买场景。

    天天果园、淘宝、应用商店对于用户来说就是所要购买产品的一个场景,到天天果园就是要买水果的,到淘宝就是要去买衣服等物品的,用户想要去下载一个App,第一反应会到应用市场主动搜索下载(当然现在流量入口很多,会有用户从微博、今日头条等平台下载App,这些是用户被动接受),这是最自然的,也是最合理的需求。

    这种情况下要解决的问题就是,在已有场景去做精准曝光营销。

    举个例子,用户在 AppStore 搜索「直播、理财、斗地主、贷款」等关键词,提升关键词的搜索排名这就是在用户主动需求场景下做精准的推广渠道。

    再或者,超市的货架上有一排酒水,懂酒的人会知道自己要买什么酒,不需要就考虑外包包装、介绍等,但是,超市买酒的人很多是为了送礼等需求,是不懂自己要买什么酒啊!所以,通过对酒水外包包装、介绍等精美设计就会提升用户的选购率。

    没有场景化的货架就需要创造场景

    从电视广告中我们会想一下一些金主的广告文案:

    东鹏特饮:累了困了,喝东鹏特饮。

    就是告诉你在你熬夜加班、体力通透这个状态(场景)下能想到和东鹏特饮这个饮料。

    早期的时候,在OPPO手机主打音乐功能的时候,你一定听过上面这句广告词。

     

    充电五分钟,通话两小时

    在OPPO手机主打电池续航能力的时候,你又对这句广告熟知。


    OPPO R9s 全新拍照手机,这一刻,更清晰

     

    现在,重回拍照定位的OPPO手机,又对你灌输上面这句广告。

    这些,都是通过视频广告、文案等方式创造场景化的方式,让你记住手机、饮料等使用场景。当你加班时候想喝点东西,第一时间想到东鹏特饮;让你在考虑买一款拍照功能不错的手机时候就能想到OPPO手机。

    当然,这些都是偏品牌广告,市场预算相对于效果渠道较多,且视频广告本来就有空间去「制造场景」。但是,回顾一下,像App推广中常用的推广渠道,例如信息流、应用市场 CPT、CPD、ASO等对于这种效果类为主的营销手段,能够可以自己创造「场景」的渠道有限,留给我们更多的是,迎合渠道做「场景化推广」。

    例如:

    安卓手机上百度的「安卓搜索推荐」
    或者用搜索引擎搜索出来的问答结果
    UC浏览器中的信息流广告

    根据以上的分析,我们就可以很清晰认识到,场景化推广无非就是两点:

    1、自己的产品所解决的用户痛点
    2、场景化的推广环境

    产品的痛点是很好理解,就是你的产品能够解决用户什么问题;那么推广的场景化怎么去理解呢,从推广渠道的角度来说是有很多环境的,伴随着流量的碎片化,推广渠道也不仅仅局限于应用市场,也会慢慢出来很多新的推广渠道,例如信息流、各类超级App等等,这类推广的场景化如何去创造?以ASO为例:

    先看几个标题:

    唯品会 一家专门做特卖的网站
    滴滴出行 - 滴滴一下,美好出行
    淘宝 - 随时随地,想淘就淘
    闲鱼 - 让你的闲置游起来

    这些都是利于品牌传播标题,都是用用自己的品牌定位或者广告语,利于品牌传播的标题,强化用户心智定位,在当今流量成本越来越高的时代,想要在用户心智当中抢占优势,有时候比你做再好的ASO更重要,但是,这个通常都会有较大的市场推广或者品牌预算。

    再看一下没有借助品牌依赖效果去做的推广:

    ASO标题:

    喜马拉雅FM (听书社区)电台有声小说相声评书
    携程旅行-预定酒店机票火车票助手
    腾讯新闻-头条新闻热点资讯掌上阅读软件

    可以看到,这些虽说也是在各自行业的佼佼者,也在ASO上下了功夫,一是通过本身品牌的优势做曝光,二是借助应用副标题添加了很多热门关键词,以此吸引用户眼球,带来更多的用户。

    显然,如果不考虑用户对产品定位等其他因素,为了获取更多的用户第二种的优势更为明显。

    最后再补充一个实例运用。
    APP推广实例应用:如何做好用户体验及渠道统计

    类似“APP 邀请注册有奖”这类带有邀请机制的活动,是 APP 的重要推广手段之一,在网上搜索“APP 邀请注册有奖”,可以搜索到了近千万条结果。但这类活动,往往会因为用户懒得输入邀请码而夭折,使得活动效果远不如预期。那我们该如何避免这类问题呢?

    既然用户不愿意填写邀请码,那我们就应该免去这个步骤。采用Shareinstall 的方案,可以把用户邀请码参数直接“安装”到APP中,免得用户再输入邀请码,有奖邀请注册的活动在用户不知不觉间就能够有效开展下去。

    shareinstall的技术原理是让用户在安装 APP时,自动将邀请码传递给用户,用户在打开应用后,通过后台处理邀请码,来实现免填邀请码的安装。

    此外,shareinstall还有一个功能是App渠道安装量统计。如果一个App进行广告推广,投了电视、公交、地铁、网页等广告渠道,今天来了5万用户,但用户是从哪个渠道来的,没有一个准确的数据的话,推广者如何对渠道进行优胜劣汰呢?

    shareinstall的渠道统计功能能让使用者更准确的了解不同渠道的推广效果,更重要的是,这个功能是免费的。

    与传统的推广不同,手机APP推广策划不仅烧脑,而且方案的可实现性也非常重要。很多好的方案往往因为技术上存在的壁垒,而无法到达预期的效果。今天介绍的这两个APP推广中最实用的功能,希望能给大家带来帮助。

    同样,这种思维方式适合任何其他推广渠道,关于信息流广告的场景化是通过图片素材来制造?还是文案上的地域、性别、年龄、制造悬念等特征来创造,可以留言交流。

     

    转载于:https://my.oschina.net/u/3916854/blog/1863245

    展开全文
  • 蓝牙一种低成本的近距离无线连接方式,各种数码设备都可以利用蓝牙进行无线连接,减少了有线的束缚,让使用场景更广。但很多设备音频部分只有外放,无蓝牙功能,这就苦了很多伙伴,比如很多switch产品就没有开放...

    蓝牙是一种低成本的近距离无线连接方式,各种数码设备都可以利用蓝牙进行无线连接,减少了有线的束缚,让使用场景更广。但很多设备音频部分只有外放,无蓝牙功能,这就苦了很多伙伴,比如很多switch产品就没有开放蓝牙,即使有蓝牙耳机也无法使用。最近就入手了一款谷粒新推出的ROUTE AIR解决了此问题,而且体积非常迷你,下面我们一起来看看!

    0f0b8a5de61c05674264ae8d162192a7.png

    谷粒ROUTE AIR包装采用简约设计,正面是ROUTE AIR渲染图,包装右上角是谷粒logo。背面有介绍相关的功能,可以用于switch、PS4,而且还支持A2DP蓝牙音频传输协定,可以直接连接蓝牙耳机使用。

    3350ee76fbd875fcf9f0efb96da1a603.png

    将包装打开,可看到一个精致的包装内盒,里面采用海绵固定两个小的部件,盒子底部印有相关的说明。

    92527bf5854d150ee7201ef3e0ce3ace.png

    5a2f3153ff1d5eae3909f776a8e61300.png

    将这两个小部件取出,发现是一个USB转Type-C数接口的转换头,可以用于电脑、PS4、智能硬件或数码上面进行转接。另一个就是蓝牙适配器谷粒ROUTE AIR,厚度只有5毫米比较迷你,正面是A、B两个实体按键,可以同时连接两个蓝牙耳机,中间是谷粒Logo,下面是四个指示灯。

    134d2c1303d7f46f12338b7f895861c5.png

    将谷粒ROUTE AIR打开,分成两部分,一部分保护盖,另一部分是蓝牙适配器本体,为Type-C接口,不需要充电的,插在主机上面,主机自动为其供电。

    9e7d09526f8a9c5ad88a642197a89222.png

    谷粒ROUTE AIR蓝牙适配器可与附带的转换头搭配使用,可通过转换头直接插在台式电脑上使用,让你的台式电脑也拥有蓝牙功能。如果电脑上有Type-C接口,不需转换头直接插上使用。

    c64ed8e00f7b2cbc265b5e08343dee5c.png

    此蓝牙适配器使用比较简单,将谷粒ROUTE AIR插到Type-C接口,就可看到A键下方的指示灯会亮起,长按A键或B键3秒左右,就可看到指示灯闪烁进入配对状态,此时将耳机转到配对状态,即可完成连接。真无线耳机使用更快捷,将耳机从充电盒子里拿出即进入配对模式,很快连接,如之前已配对,取出就可以使用。

    5f283e279ac5c7c77fe05ee2d785e76f.png

    此蓝牙适配器还支持蓝牙5.0,大幅度提升传输速率,手上刚好有一款蓝牙5.0的耳机,连接测试效果不错,这主要得益适配器的CSR芯片。另外此还支持 aptX、 LL协议,选择支持此协议的耳机带来低延时的听音体验,延迟将进一步缩小。由于此适配器体积较小,插在Switch上面基本不会影响到外观颜值。

    65ea40eeb20b004ce2b41fbcd65ae7a7.png

    带Type-C接口的安卓手机上也可以使用,蓝牙耳机可以通过此适配器进行连接,使用方法与Switch一样。

    5da914941ac2e5286a7e0d8db79c741f.png

    此蓝牙适配器可为台式机增加蓝牙功能,插上此适配器后,可以直接用蓝牙耳机连接听歌,减少了有线的束缚。另外用笔记本测试了一下也是可以的,可见此蓝牙适配器的应用场景较多。

    ddd8d8ca3a0a68271fda9727252aedca.png

    谷粒ROUTE AIR产品解决了很多Switch、台式电脑了等数码器件无使用蓝牙耳机的痛点,而且此蓝牙适配器迷你,使用更方便真,可以畅享无线带来了乐趣。此适配器性价比较高,有需求的伙伴可以去看看,相信会给你惊喜。

    展开全文
  • 问题描述:  1、敏捷开发过程中,相关的系统分析文档,... 2、关于需求,敏捷开发过程中,是否需求方只需要提供一个用户故事,比如“我作为PD(代表用户的意思),在某些场景中期望达到什么目的,所以希望产品如...
  • 产品是什么意思,就是怎样把你知道的东西变成用户也能够拥有的东西(在这个过程中应当考虑清楚服务的对象是谁,什么场景使用产品能给用户带来什么价值,产品的体验过程怎么样。) 我以前在教育培训机构做过...
  • MongoDB面试题

    2019-09-29 20:08:17
    1.你说的NoSQL数据库是什么意思?NoSQL与RDBMS直接有什么区别?为什么要使用和不使用NoSQL数据库?说一说NoSQL数据库的几个优点? Nosql的使用场景(优点) 数据库表schema经常变化 比如在线商城,维护产品的属性经常要...
  • ES6 Set集合用法

    千次阅读 2017-12-16 22:30:36
    场景:近期在开发一个桌面的收银系统,开发过程中遇到这个一个问题,在用户购买完产品之后选择使用购物卡进行支付的时候,...集合是什么意思?集合(Set)是由一组无序但彼此之间又有一定关系性的成员构成,每个成员在集
  • 硬件bypass的制作过程!现实需求:WAF类的产品,很多情况下需要Bypass的,什么是bypass?...而安全防护系统又不得不使用,这时就要求WAF一定要具备Bypass功能,bypass的意思是指:如果waf本身、或waf所在的...
  • 那么,这到底是什么意思呢?简单来说,机器视觉就是为了流程控制或检测所制造的产品而从数字图像中自动提取信息,看下图示范:▲ 机器视觉运用图解为了更好地理解机器视觉,下面,我们以啤酒厂采用的填充液位检测...
  • (2)原型模式的使用场景对象种类繁多,无法将它们整合到一个类中有相同特征的类整合成一个或多个类,这些类实现带克隆实例抽象方法的产品接口,其余的类只要实现该接口就行。生成实例较为复杂时生成实例的过程太过...
  • 4.1.5 用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。 4.1.6 JAVA8的ConcurrentHashMap为什么放弃了分段锁,有...
  • (2)原型模式的使用场景 对象种类繁多,无法将它们整合到一个类中 有相同特征的类整合成一个或多个类,这些类实现带克隆实例抽象方法的产品接口,其余的类只要实现该接口就行。 生成实例较为复杂时 ...

空空如也

空空如也

1 2 3 4
收藏数 68
精华内容 27
关键字:

产品使用场景是什么意思