2020年8月

不久前,小组讨论了一次AliExpress搜索结果页筛选功能的设计。过后有一些思考,记录下来。

一、搜索和筛选的关系

首先,搜索和筛选是什么关系?

先说筛选,Excel中的筛选多数人都用过,也是高频功能,其作用是过滤出需要的数据。使用Excel筛选时,有个不易被察觉的前提条件:筛选需求和数据都是结构化的。比如,有个员工信息表,需要筛选出职位是「产品」、年龄「35岁以上」的员工,我们之所以能这样做,是因为表格中有职位和年龄两列数据,并且我们的筛选需求能对应到这两列。

再说搜索,从结果看,其目的也是过滤出需要的数据。但多数时候,搜索的需求是非结构化的。试想一下:Google搜索「中美关系」,其数据库中不可能有一列专门记录「中美关系」,然后根据这一列把相关网页筛选出来。用户看到的结果,是Google经过复杂的算法逻辑挑选出来的。

所以,搜索和筛选,都是过滤信息的手段,但筛选基于结构化的数据进行简单的规则匹配(如大于、小于、等于),搜索则处理非结构化的需求,由算法进行复杂的过滤。

页面交互上,搜索只有一个框,用户可以任意搜索;筛选则要定义好数据维度,用户只能在有限的维度上选择。——无限和有限,是搜索与筛选在用户体验层面的重要区别

Google搜索框:任意搜索
Google搜索框:任意搜索

汽车之家找车:有限的筛选维度
汽车之家找车:有限的筛选维度

显然,在过滤信息的共同目标下,二者并不互斥,所以搜索引擎常常提供筛选功能,支持一些筛选维度,进一步缩小信息范围,找到所需信息。

到目前为止没有提到排序,需要指出,无论搜索或筛选,背后都对应一套排序逻辑。(Excel的筛选表面看没有排序,但其实隐藏着默认排序的逻辑)

二、搜索中两个基础的筛选交互

搜索引擎中筛选功能的交互,有两个基本类型:指令式交互与可视化交互。

1、指令式交互:在搜索框中使用指令关键字

这是一种非常极客的方式,当年知乎搜索非常烂的时候,不少人通过Google搜索知乎优质内容,方式如下:

Goole搜索指令
Goole搜索指令

其中site就是指令关键字,它告诉Google,从搜索结果中过滤出zhihu.com网站的内容。Google支持的指令很多,比如:filetype:pdf筛选PDF文件,intitle:产品限定网页标题包含「产品」,这里有一份比较完整的Google指令列表。

在「把搜索引擎当筛选功能使用」这条路上,走的最远的是同花顺的问财搜索。看下图案例。

问财搜索
问财搜索

搜索词为市值小于100亿 净资产收益率大于15 负债率小于50% 最近20天涨幅小于0 ,本质就是一个基于指标的选股条件,返回的结果也是股票数据表格。(曾经在该团队待过,很多股票数据都是收费的,但问财可以免费搜索到,非常不错的产品)

无论Google还是问财,他们都以一种显式的方式告诉搜索引擎,需要筛选哪个条件,区别只是Google的指令是固定死的,问财的指令(指标名称)允许一些口语化表达,比如「负债率」改为「资产负债率」也能正确筛选出结果。

其实,还有一种隐式的方式(用户并不感知),搜索引擎自己识别搜索词的类型,再根据类型进行搜索结果的筛选。比如天猫搜索「红色 连衣裙」,如下图。

天猫搜索:红色连衣裙
天猫搜索:红色连衣裙

细心的用户会发现,多数商品除了红色也有其它颜色,那为什么结果页只出现红色呢?是因为搜索引擎识别出「红色」是一种颜色,实现类似于「连衣裙 color:红色」的指令搜索。

识别一个词属于什么类型的技术叫「命名实体识别」(Named Entity Recognition,简称NER)。在搜索中,NER的目的就是将非结构化的数据进行结构化,进而实现可筛选。

2、可视化交互:更低的交互门槛

指令式筛选,其优势是所有交互均在搜索框内完成,搜索体验统一,不占用额外的页面空间,并且可扩展性非常强。劣势也很明显,使用门槛高,同时输入成本(尤其在移动端)高。

所以,将支持的这些指令可视化,是个非常自然的想法。具体设计上,又可分为搜索前筛选和搜索后筛选。

1、提前设定好条件进行搜索

Google的高级搜索
Google的高级搜索

2、获得搜索结果后再进一步进行筛选

Google搜索结果页的筛选项
Google搜索结果页的筛选项

过滤信息是一个从大到小、不断聚焦直到找到所需信息的过程。所以,先获得搜索结果,再通过依次添加筛选条件,不断缩小范围,更符合直觉。所以,第2种方式更常见一些。

第2种方式有个难点:不同行业的筛选维度是不同的,需要准确判断用户需求行业,才能正确的给出筛选维度。

Google图片搜索的筛选维度,与网页搜索不同
Google图片搜索的筛选维度,与网页搜索不同

三、电商搜索中的筛选功能

因为工作,之前看了各个电商APP的搜索筛选,不妨看一些例子。都是移动端、可视化、搜索后的。

1、淘宝

淘宝
淘宝

  • 顶部业务划分,包括全部、天猫、上新、特卖、店铺、经验等等。支持限定在某业务内搜索。
  • 然后是排序和筛选,其中销量排序作为常用项,单独列出。
  • 部分情况默认展示一些筛选项,比如「iPhone」,默认展示的筛选项不再出现在折叠筛选页中。

2、京东

京东
京东

  • 价格和销量排序都放出来,但店铺筛选与排序选项同排,逻辑上是有些奇怪的。
  • 然后默认展示一些筛选项,更多的则折叠,并且默认展示的筛选项在折叠筛选页中也有。
  • 「iPhone」增加了推荐词,点击后进行组合搜索,比如「iPhone 耳机」,也是缩小搜索范围的一种方式。

3、拼多多

拼多多
拼多多

  • 与京东类似,品牌与排序选项同排,逻辑不一致。
  • 默认展示的筛选项,也不再出现在折叠筛选页中。
  • 提供重点营销活动的筛选,百亿补贴、开学季等。

4、小结

三家的设计大同小异,默认展示出重要的排序项和筛选项,其它的全部收起来。有三点:

  • 品牌、店铺与排序项同排,应该是为了节省空间考虑,但会不会对用户造成理解上的困扰?
  • 热门筛选项默认放出来,可能导致用户无法发现一些冷门筛选项。「冷门」是统计意义上的,对单个用户,可能只是不知道还有XX筛选功能。强制用户进入折叠筛选页,可能让用户发现意想不到但十分有用的筛选项。
  • 淘宝和拼多多默认展示的筛选项不再出现在折叠筛选页中,会造成一个问题:当需要筛选多个属性时,在折叠页可以平铺开来一起选择最后确认,但展示在外面的需要左右滑动一个个选择,交互成本高很多。

以上只是主观感受,没做过实验。如果做实验,筛选功能价值的衡量,可以有两个:

  • 覆盖率。有多少用户使用筛选功能。容易理解的交互尤为重要。
  • 购买转化率。筛选就是帮助用户更快找到商品,使用筛选的用户应该比搜索整体转化更高。这个考验筛选维度的设计。

又开始折腾了。

最近开始用obsidian作为主力笔记软件,自然也想用它写博客,但obsidian没有MWeb一样强大的发布功能,于是自己动手,基于Python和MetaWeblog API写了一段脚本,实现命令行发布文章到typecho博客。

这段时间博客中经常出现测试文章,就是在调试脚本。本文是obsidian写完、该脚本发布的。

一、脚本实现功能

  1. 发布文件,若已发布过,自动更新。
  2. 自动将obsidian的[[]]转化为markdown标准格式,包括链接和图片。
  3. 上传图片到又拍云,并替换文章中的图片链接。
  4. 支持常用的Front Matter信息,与正文之间用+++分隔,meta支持:

    1. title: 标题,必填
    2. date: 日期,必填,yyyymmddhhmm格式,比如202008231859
    3. slug: 自定义URL,可选,若不填以date中的一段作为slug
    4. categories: 分类,可选,英文逗号分隔
    5. tags: 标签,可选,英文逗号分隔

二、文章格式

如下图,+++分隔Front Matter和正文。

三、脚本使用

脚本在文末,基于Python3.8开发,依赖第三方库upyun(又拍云的SDK)。准备好环境后,正确填写脚本中的个人信息配置,保存为typecho.py,按如下格式使用:

typecho.py post_file.md post

第一个参数是要发布的markdown文件,必须。
第二个参数是可选的,表示发布文章的类型,post是文章,page是页面,不填默认是post。

更新成功返回如下内容:

更新成功,信息如下:
 {'title': '使用Python和MetaWeblog API发博客', 'date': '202008231735', 'categories': ['科技'], 'tags': 'Python,MetaWeblog API,Typecho', 'slug': '20082317'}

发布成功信息类似。

四、开发过程

非专业人士,代码不保证健壮性,勉强能用。过程中有些想法:

1、要实现更新文章,需要在本地保存发布状态,MetaWeblog API只能使用cid对文章进行更新,所以需要在本地保存cid,最初我考虑将cid回写到本地文件的Front Matter区域,但最后放弃了。因为回写是高风险的操作,可能破坏本地文件。所以,最后也选择了使用本地文件.slug_cid_mapping.txt保存发布状态。若是MetaWeblog API支持使用slug更新文章,就完美了。

2、图片的上传状态没有记录,所以原则上每次更新都会重新上传图片到又拍云,但发现又拍云上并没有重复,可能又拍云有相关策略控制。

3、Front Matter是个非常好的理念,可扩展性强,但我觉得每次写Front Matter还是有些麻烦。博文最重要的信息包括标题、发布日期、类目和slug,类目可以取本地文件夹名、标题和发布日期可以写在文件名上、slug可以直接用发布日期。这样就不需要Front Matter了。

4、[[]]的处理,没有过滤代码块,如果代码块中被正则匹配到,代码块也会被修改。这个问题暂时不会解,好在我的文章代码不多。

5、MetaWeblog API有个坑,struct中,categories是字典,mt_keywords(即tags)却是逗号分隔的字符串。

五、脚本分享

#!/usr/bin/python3
# -*- coding: UTF-8 -*-

import xmlrpc.client
import datetime
import time
import re
import upyun
import sys

# 个人信息配置
BLOG_USERNAME = '' # 博客用户名
BLOG_PASSWORD = '' # 博客密码
UP_SERVICE = '' #又拍云服务名
UP_USERNAME = '' # 又拍云操作员名称
UP_PASSWORD = '' #又拍云操作员密码
UP_PATH = '/blog_static/' # 又拍云上传图片的目录
PICTURE_PATH = '/User/obsidian_note/media/' # 本地保证图片的目录
METAWEBLOG_API = '' # 博客metaweblog api地址
SLUG_CID_MAPPING = '/User/obsidian_note/blog/.slug_cid_mapping.txt' # 保存slug与cid的mapping文件,默认隐藏


# 解析markdown文件
#     入参:markdown文件路径
#     返回:data字典,data['meta']为front_meta字典,包含title/date/category/tags(列表),data['content']为文章正文[[]]未经特殊处理
def file_read(file):
    with open(file, 'r') as f:
        file_content = f.read().strip()
    array = file_content.split('+++\n')
    if len(array) != 2:
        print('格式错误\n\n\n')
    else:
        front_meta_txt = array[0].strip().split('\n')
        front_meta_dict = {}
        for kv in front_meta_txt:
            key = kv.split(':')[0].strip()
            value = kv.split(':', 1)[1].strip()
            front_meta_dict[key] = value
        if 'title' not in front_meta_dict or front_meta_dict['title'] == '': 
            print('必须有title且不能为空')
        if 'date' not in front_meta_dict or front_meta_dict['date'] == '': 
            print('必须有date且不能为空')
        if 'categories' not in front_meta_dict:
            front_meta_dict['categories'] = []
        else:
            front_meta_dict['categories'] = list_strip(front_meta_dict['categories'].split(','))
        if 'tags' not in front_meta_dict:
            front_meta_dict['tags'] = ''
        else:
            front_meta_dict['tags'] = ','.join(list_strip(front_meta_dict['tags'].split(',')))
        if 'slug' not in front_meta_dict or front_meta_dict['slug'] == '':
            front_meta_dict['slug'] = front_meta_dict['date'][2:-2]
        data = {'meta': front_meta_dict, 'content': array[1].strip()}
        return data

# 格式化字符串list,去掉空值,去掉字符串两端的空字符
def list_strip(lst):
    result = []
    for v in lst:
        if v.strip() != '': result = result + [v]
    return result

# URL替换函数:把[[]]替换为[]()标准markdown链接
def url_repl(matchobj):
    meta = matchobj.group(0)[2:-2].split('|', 1)
    if len(meta) == 2:
        return '[{txt}]({url})'.format(txt=meta[1], url='/' + meta[0][-10:-2] + '.html')
    else:
        return '[{txt}]({url})'.format(txt=meta[0], url='/' + meta[0][-10:-2] + '.html')

# IMG替换函数:上传图片到又拍云,并把![[]]替换为![]()标准markdown图片
def img_repl(matchobj):
    meta = matchobj.group(0)[3:-2].split('|', 1)
    file_path = PICTURE_PATH + meta[0]
    up_path = '/blog_static/' + meta[0]
    upload_picture_to_upyun(file_path, up_path)
    if len(meta) == 2:
        return '![{txt}]({url})'.format(txt=meta[1], url=up_path)
    else:
        return '![{txt}]({url})'.format(txt='', url=up_path)

# 将[]]和![[](/]]和![[.html)转化为标准的[]()和![]()
def to_stard_markdown(content):
    content = re.sub('[^!]\[\[(.+?)\]\]', url_repl, content)
    content = re.sub('!\[\[(.+?[png|PNG|jpg|JPG|jpeg|JPEG|gif|GIF].*?)\]\]', img_repl, content)
    return content

# 上传图片到又拍云
# 入参:file_path本地文件路径,up_path定义又拍云路径
def upload_picture_to_upyun(file_path, up_path):
    up = upyun.UpYun(UP_SERVICE, UP_USERNAME, UP_PASSWORD)
    with open(file_path, 'rb') as f:
        res = up.put(up_path, f)
        
        
# 根据slug获取本地的cid
def get_cid(slug):
    with open(SLUG_CID_MAPPING, 'r') as f:
        kvs = list_strip(f.read().split('\n'))
    if kvs == []:
        return '0'
    else:
        mapping = {}
        for kv in kvs:
            mapping[kv.split(':')[0].strip()] = kv.split(':')[1].strip()
        if slug not in mapping:
            return '0'
        else:
            return mapping[slug]

# 保存slug和cid的关系
def save_cid(slug, cid):
    if int(cid) > 0:
        with open(SLUG_CID_MAPPING, 'a') as f:
            f.write(slug + ':' + cid + '\n')
    else:
        return 'cid不对,保存失败'
            
# 创建文章,若文件已经存在,则自动更新,
#     入参:file要发布的文件,post_type发布类型(post-文章,page:页面)
def new_post(file, post_type='post'):
    data = file_read(file)
    slug = data['meta']['slug'] # 基于date获取slug
    # 构建发布内容
    struct = {
        'title': data['meta']['title'],
        'wp_slug': slug, 
        'dateCreated': datetime.datetime.strptime(data['meta']['date'],'%Y%m%d%H%M')-datetime.timedelta(hours=8),
        'description': to_stard_markdown(data['content']),
        'categories': data['meta']['categories'],
        'mt_keywords': data['meta']['tags'],
        'post_type': post_type,
    }
    client = xmlrpc.client.ServerProxy(METAWEBLOG_API)
    
    cid = get_cid(slug)

    if int(cid) > 0:
        try:
            result = client.metaWeblog.editPost(cid, BLOG_USERNAME, BLOG_PASSWORD, struct, True)
            print('更新成功,信息如下:\n', data['meta'], '\n\n')
        except Exception as e:
            print(e)
    else:
        cid = client.metaWeblog.newPost('',BLOG_USERNAME, BLOG_PASSWORD, struct, True)
        if cid != 0:
            save_cid(str(slug), str(cid))
        print('发布成功,信息如下::\n', data['meta'], '\n\n')


if __name__ == '__main__':
    try:
        if len(sys.argv) == 3:
            file_path, post_type = sys.argv[1], sys.argv[2]
            new_post(file_path, post_type)
        elif len(sys.argv) == 2:
            file_path = sys.argv[1]
            new_post(file_path)
    except Exception as e:
        print(sys.argv)
        print(e)

最近看到三条消息:

  1. 腾讯邀约收购搜狗
  2. Google 2020Q2营收创史上首个同比下跌
  3. 夸克入局知识短视频

关注到夸克,是因为其背后的神马搜索团队我曾经待过,主打极简浏览器+无广告的搜索。当时就觉得,它迟早要走UC的老路,切入内容生态,只是UC选择了图文,它直接上短视频。

做过搜索就明白,通用搜索越来越难做了。首先,搜索产品技术已经非常成熟,暂时看不到突破的方向,只能修修补补,做些微创新(这点不限于搜索,所有成熟产品都陷入到类似的困境);其次,搜索的前提是丰富的内容,但随着移动互联网的发展,内容生态越来越封闭,搜索变的「无内容可搜」(这是搜索独有的困境)。

移动互联网的内容生态有三个重要特征。

第一、内容向头部网站集中

作为一个博客爱好者,很明确的感受到博客越来越少了,大家都集中到公众号、知乎专栏等少数平台发表内容。论坛也是如此,天涯、猫扑,还有无数小站长搭建的论坛,也渐渐消失。音乐和视频网站也不例外,曾经百家争鸣,如今两三家垄断。

下图是中国网站数量的统计,2018年开始下降,相信这种趋势还会持续。

图1
图1

不过,强者恒强的马太效应也并非互联网独有,几乎每个新兴行业起步时,都是百家争鸣,经过十数年发展成熟后,形成几家巨头垄断市场。传统的汽车行业也是如此,今天遍地开花的造车新势力,将来也逃不过。

第二、内容网站越来越封闭

内容向头部网站集中本身并不影响搜索的发展,搜索不生产内容,而是爬取全网内容,所以内容在哪个网站都行。

但问题在于:随着头部网站控制着越来越多的内容,它们也变的越来越封闭,不允许搜索引擎爬取它们的内容。这很容易理解,反正内容全在我手上,与其让用户通过百度找到我的内容,不如让用户直接来我的网站找内容(通过站内搜索)。这样可以把用户圈在自己的网站上并实现流量价值最大化。因为缺少头部优质内容,搜索作为内容获取入口地位自然下降了。

还有个微妙的变化,PC时代很多垂直网站的搜索功能,也是百度提供的,现在几乎消失了。

从用户习惯看,也有变化:以前找内容,首先上百度。现在找内容,会到各个垂直App中去,比如找热点上微博,找问题答案上知乎,找电视电影上优爱腾……只有找特别长尾的内容,可能才会想到百度。搜索突然从一等公民变成了二等公民。

内容集中与生态封闭,二者互相成就。越集中越有底气封闭、越封闭越能绑架用户生产更多内容。

第三、内容碎片化、即时性及暴发式增长(内容过剩)

这三点是移动互联网独有的特征,对搜索也是极大的挑战。比如即时性,搜索不生产内容,即时性无论如何也比不过那些生产内容的平台。前面说内容是搜索的命门,但内容过剩,如何找到用户想要、真正优质的内容也会更加困难。通用搜索难就难在「通用」二字,在爱奇艺搜索,用户要的肯定是视频;在知乎则是问题;但在百度,可能是任何东西。

通用搜索是刚需没错,在中长尾需求上有非常大的基本盘,但头部需求被垂直App瓜分,入口地位下降也是事实。对此行业的普遍解法是:保持通用搜索能力的基础上,构建自己的内容壁垒。比如百度的百家号、好看视频;搜狗独享的公众号内容;夸克的知识短视频;Google的Youtube生态等。除此,也没别的办法了。

但头部内部产品也在染指通用搜索,典型的便是头条搜索和微信搜索。所以,无论是内容App还是通用搜索,最后殊途同归。

7月的复盘。

综合收益

账户收益率
账户收益率

富途账户数据截止30日,31日数据未更新。

1、7月份A股太牛了,心痒痒的,但最后还是忍住没进,曾经吃过太多亏。不过,基金账户跟随市场收益12.61%,尚可。
2、港美股在月内全部清仓了。在月底又接回部分,但仓位都不重。富途账户收益7.84%,跑赢相关指数。(富途包括了期货账户)
3、这个月,最后两笔期货亏的很惨,心态有些蹦了,暂时退出。

股票交易

股票持仓状态如下:

股票持仓
股票持仓

本月操作也不复杂,先是账户全部平仓了,下旬又开始建仓,但目前仓位均不高。此外,平台奖励的腾讯控股1股碎股卖掉了。

阅文集团

16号进行了清仓,清仓价格在55.55。原因新丽传媒导致业绩预亏,预计会有一定程度的回撤,因此暂时退出,等机会再入。心里预期是50港元以下重新建仓。

很快在24号,短暂跌到50以下,在50的位置买入少量,50以下会慢慢加仓。

阿里影业

买入时赌的就是影院复工,16号消息终于落地,不念战,兑现利润退出。盈利13.43%,尚可。

中芯国际

各种迹象都表明,中美关系将走向长期的对抗。所以,中芯国际作为国内芯片制造的独苗,地位毋庸置疑。长期来看,我觉得可以无脑买,而且越跌越买。

前期涨的太多不敢进,本月跌到27开始建仓,在24.2进行了加仓。目前平均成本25.6,浮盈16.60%。希望能再跌跌,让我加仓。

爱奇艺

6月复盘提到已经清仓,并说会在20以下再建仓,结果7月等来了20以下。也如期开始建仓,但目前仓位低。后续会择机继续加仓。

蓝城兄弟(新股)

打新,没什么可说的。上市第二天卖的。盈利56.31%,但只有10股。

期货交易

期货持仓
期货持仓

6月的一笔持仓,到7月卖掉,账户收益32.59%,觉得自己无敌了。结果后面两笔火速打脸,连续亏损。目前已停止期货交易。

基金交易

基金持仓
基金持仓

1号定投加仓,无它。

思考

期货不适合长期主义者。

虽然我的股票交易多为中短线,但我每次买入都是基于能长期持有的判断,「投资性买入、投机性卖出」比较能形容我现在的策略。

但期货,有截止日期,所以期货永远无法长期持仓,虽然长期看好恒生指数,但两个月恒指会如何,不确定性非常大。

7月的MHI2007赚了32.59%,让我有些膨胀了,以为能够长胜下去,但接下来两笔打脸,尤其是最后一次,中途加仓,做多2手MHI2008,最后大亏,而且是卖在了分时线的最低点,如下图,可见当时心态有多崩溃。

卖在分时最低点
卖在分时最低点

加仓是有扳本心态的,一旦有了这种心态,就已经输了。

期货短期不确定性太大,控制不好心态,所以暂时不玩期货了。

上周团建去了丽水缙云仙都景区。

最初目的地投票时,海南、桂林、厦门是最热门的三个选项,但最后因疫情及南方暴雨的原因,将目的地限定在了省内,选出了缙云。

周五早上9点园区集合出发,平时9点半上班,这天成了我起的最早的一次。当然,毕竟40来人的大部队,毫无意外的有人迟到了,最后9点半才出发。大巴司机全程无休,开到缙云,已经是下午1点钟了。

午餐在「三松农家大院吃的」,很有特色,是一间四合院,木质结构的房屋古色古香的,有天井,中间有一口真的井,井水特别冰凉。750元一桌的饭菜感觉吃出了1500的份量,但除了量大,也没其它特色了,味道一般,与之后的几顿相比尤其明显。

下午到景区民宿办理入住后自由活动,我和几位同事打德州,很不幸,创造了个人输钱最快的记录,不到2个小时输了500元,全场最惨。以致于晚上老板请客时调侃「多谢我请客」,晚餐非常棒,店名叫「好溪人家」,值得推荐。

说到好溪,是一条流经仙都的河,河道挺宽的,成U型,景区核心位置鼎湖峰刚好位置U型底部。水位低、水流不急,一点不像南方雨季该有样子。

好溪
好溪

周六是团队一起行动,逛景区,其实就是爬山。山不高,半天就搞定了,上面的好溪图片便是在山上拍的。

鼎湖峰
鼎湖峰

鼎湖峰算此处的地标,170米左右,形状像笋,号称「天下第一笋」。据说轩辕黄帝在峰顶用鼎炼丹,鼎重达千斤,把峰压成了凹形,下雨积水成了一片湖——鼎湖。轩辕黄帝升天后,这个地方就被人们称为鼎湖峰。——每个景区都得有几个传说。

仰止亭
仰止亭

既然有黄帝的传说,建个黄帝祠宇水到渠成。祠宇内有一张百家姓谱系,有点意思,比如我的胡姓,来自舜的分支。

黄帝祠宇
黄帝祠宇

百家姓谱系
百家姓谱系

对我来说,玩的最high的要属周日,在羊上飞行基地,玩了两项从未玩过的:骑马和滑翔伞。

古装剧中骑马看的太多了,觉得是件很酷的事。试过之后才发现,一点也不酷,完全是个体力活,当马奔跑起来时,人必须随着马的节奏上下,否则五脏六腑都要被颠出来,曾经骑自行车从龙井山冲到九溪烟树,全是石子路,也没有颠的这么惨。周一全身酸痛,全怪骑马。

骑马的基本技巧:双腿夹马的腹部就会走,用力就会跑起来,缰绳左拉就向左、右拉就向右、同时往后拉就是减速或停下。缰绳特别重要,相当于汽车方向盘+刹车,需要全程握在手上,不能松开。有点明白为何古人用「脱缰之马」形容事物失控了。

看起来挺容易,骑起来比手动档还难。

此外,缰绳和脚蹬容易蹭伤手脚,我就中招了,最好戴手套穿靴子。

羊上飞行基地
羊上飞行基地

当然,论刺激程度,非滑翔伞莫属了。排了很久的队才轮到我们。

山顶到山下的海拔差350米左右,山顶的平台不大,铺着绿色的地毯,助跑的距离不超过20米,前方边缘是个大斜坡且没有护栏,站在旁边会有些紧张。

教练准备时,一再跟我强调,助跑的时候不要怕、不要停,往前冲就是了。我便按教练说的,豁出去了。意外的是,双脚离地后,飞的特别平衡,平衡到没有一丝超重或失重的感觉,比飞机起降时还安稳。

如果不喜欢刺激,可以就如此平衡的、缓慢的飘下来。不过好动如我,自然是跟教练要求怎么刺激怎么玩,于是开启了高空海盗船、过山车模式。真玩起来还是有些紧张的,但很快被兴奋感掩盖过去。我一直觉得,人都有自我毁灭的倾向,这大概就是其中一个表现。

除了滑翔本身,上山的过程也让我印象深刻。当地老司机开着皮卡车送我们上山,手动档,非常难走的山路竟然能维持40左右的时速,很多急转变的换挡减速、再加速换挡,超级流畅。同样开手动挡我,除了默默点赞,还能说啥。

住宿方面,我们包了四间名宿。给其中一家打个广告,叫迦乔客栈,老板是位年轻人,非常nice。

周日去玩滑翔伞,地方比较远,老板开车送我们过去,因为排队的原因,一直陪我们到下午两三点。本来我们应该12点就退房,他接待下一波生意,但因为我们推掉了。

老板也是位有钱人,门口停了两辆长江750三蹦子,还有一辆Honda摩托,明显是个玩家,客栈多半是个副业,不为赚钱。

还有下面这辆小摩托,老板自己改装的,玩具定位。特别小,无极变速,容易开,我们都试了下。转动油门,速度还没起来,声浪已经到位,特别有范。不过,油门拎到底,估摸着50码的时速还是有的。

小摩托
小摩托

出发前,目的地从一开始的厦门、桂林级别变成丽水,瞬间没了兴致,但实际玩下来却发现非常不错,超出预期。