Be a Creator!

0%

三星堆考古文摘整理,内容主要整理或参考自《追寻三星堆》《翦商》《巍山彝族简史》《梅葛》《勒俄特依》《三星堆文明是中华文明多元融合前的一朵奇葩》与维基百科等。

三星堆面世时用了一个词叫“一醒惊天下”,当人们第一次站在他们面前的时候没有谁不会为之震惊,你会惊讶于它的巨大,惊讶于它“不太中国”的造型,风格上与中原迥异,隔着玻璃站在几千年前的他们面前时,诸多疑问自然而然产生:

这么多人面青铜器干什么用的?为什么他们长得如此奇特?怎么看着像是外星人?它们是如何被铸造的?那些硕大的青铜器从何而来?三四千年前的三星堆人是怎样的一群人?他们从哪儿来?他们又去了哪里?为什么造型上极具现代审美?埋葬它们的是祭祀坑还是亡国坑?跟同一时代的殷商又有什么关系?

面对这些问题,许多人分析说“三星堆就是夏朝夏都”,也有人从服饰和太阳历等类比说现在的“彝族就是三星堆人的后裔”,青铜神树就是山海经里的扶桑古树,上面站的就是金乌,言之凿凿,丰富有趣,我尝试着对相关资料进行梳理,并拼凑出一个较为合理的猜想。

三星堆发掘简史

1929年,三星堆被当地村民燕道诚在挖水沟时无意发现,出土400余件玉器。
1934年,美籍传教士葛维汉组建考古发掘队,在月亮湾进行发掘工作,第一次正式发掘就出土文物600多件。葛维汉同时是考古学家和人类学家,他编写的《汉州发掘简报》是历史上第一份有关三星堆的科学报告。
1982年,中国国家文物局决定对三星堆进行专款专项考古发掘。
1986年,四川省考古所对三星堆进行大规模发掘工作,发现了两座与商代同时期的大型祭祀坑,这就是后来大家熟知的1、2号坑,此次发掘出土了1700多件青铜器、玉器、漆器、陶器等,还有80根象牙,以及4600多枚当时的货币、海贝、铜贝等。
2021年,三星堆新发现6座祭祀坑,到2022年6月13日,三星堆遗址考古发掘成果发布,共计出土编号文物近13000件,其中较完整的3155件。新发现龟背形网格状器、铜神坛、顶尊蛇身铜人像、铜戴象牙立人像、铜猪鼻龙形器等大量造型前所未见的文物。
迄今,整个考古历程已接近百年。

考古现场


1986年发现了1、2号坑,两坑之间距离30米,1号坑比2号坑略大,约有15平米,1号坑共420件出土遗物,与之相比,2号坑出土遗物的数量要多得多,也精美得多,出土了1300件遗物,其中有735件是青铜器,金器61件,玉器486件,2号坑出土器物是1号坑的3倍多。

3到8号坑则是2019-2020年间新发现的,六个新坑几乎是夹在1、2号坑之间的30米距离内,四大两小,大的与1、2号坑类似,小的则呈正方形。2、3号坑在整体遗物的类别和埋藏方式上相似度极高,表层是象牙,象牙下堆积着大量青铜器,2、3号坑可能有相同的性质与功用。

3号“祭祀坑”中埋藏的文物以青铜器与象牙为主,数量均已超过300件,包括铜顶尊人像、铜顶坛人像、铜人头像、铜面具、铜神树、铜眼形器、铜蛇、铜圆尊、铜盆等,除此之外,还发现了金面具、玉石器、海贝等遗物。其中大型青铜面具宽135厘米、高74厘米,一件青铜器以立人手举头顶神坛的造型,形制极其复杂罕见。另有一件铜顶尊人像形制和体量也非常震撼,通高115厘米,下部为一个三星堆风格的跪坐铜人,双手合握于身前,头部顶一块方板,方板连接一中原风格的大口尊,尊的肩部还附有多条精美的龙形装饰。

4号坑内是大面积的黑色烧士,用火痕迹极其明显,灰烬堆积很厚,在灰烬层里检测到了蚕丝蛋白,也就是发现了丝织品的水解物残留,这是首次在三星堆遗址发现丝绸,堪称三星堆祭祀区第二次发掘的最大亮点之一。此外,灰烬层中还检测到竹、楠木等好几种植物的残留。坑内其他遗物计有金器、铜器、玉器、石器、陶器、象牙、纺织物等逾700件(片)。其中一组三件青铜扭头跪坐人像极为珍贵,其姿态和面部表情即使在三星堆都显得相当罕见,估计这三件铜扭头跪坐人像是一个组合器的底座。

综合各方面信息推测,4号坑与1、2号坑的年代应该是有距离的,并非同时的。灰烬层有另一个很大的作用,就是取样进行碳-14测年,确认器物坑的大致年代,这个将在后面详细说明。

5号“祭祀坑”中的器物以大量象牙器残片、玉器残片、金箔片、珠饰等小件器物为主。圆形金箔片带有穿孔、遍布全坑且分布似有规律,推测为附着在衣服或纺织物上的装饰。坑内其他器物还有金器、铜器、玉石器、陶器等,数量约50件(片),以大型金面具(残)、鸟形金饰最为重要,部分象牙器残片上雕刻有云雷纹、蝉纹、羽翅纹、弦纹等纹饰,十分规整、精细,这些纹饰与中原的类似。再加上那半扇黄金面具,目前考古人员猜测,5号坑有可能掩埋的是巫师的行头。面具、象牙礼器、金片衣饰物,都是一位巫师在祭祀活动中需要的衣着,这个推测,让5号坑充满神秘色彩。

旁边的6号坑呢?更神秘,且无解。6号坑与5号坑形制相似,正方形,边长2米左右,有一个空木箱子,且只有一个空木箱子。“木箱”,长约1.7米,宽约0.57米,高约0.4米,内侧涂有朱砂,四周侧板形制完整,但已完全炭化,“木箱”内的南半部现已清理,除已检测到丝织品的残留外,未发现肉眼可见的遗物或者是人骨,但在“木箱”北部西侧侧板与底板交界处出土了一把玉刀,另外填土中还发现了少量铜器、玉器、石器、陶器和木器等遗物。“木箱”类的遗存为三星堆遗址首次发现,其功用目前尚无法知晓。

6号坑有一部分与7号坑重叠,压在了7号坑之上,但又没破坏7号坑内的遗物,7号坑因此开挖较晚,出土了象牙以及少量金器、铜器、石器、骨器和陶器等遗物。6、7号坑的叠压关系,意味着6号坑一定晚于7号坑,但这个早晚是一个相对概念,晚一天也是晚,晚100年也是晚。

8号坑灰烬层里的东西太过繁复,全是碎片,较大型的青铜器被有意识地打碎,碎片主要来自青铜神树,提取的文物包括铜器、金器、玛瑙器、玉器、石器、陶器等约3800件(片),包括铜人头像、铜面具、铜跪坐人像、铜“鼓”、铜铃、铜贝、铜戈等。石器中的一件大型石磬极为珍贵。在灰烬堆积中还散布着不少金器,部分可辨是黄金树叶和穿孔圆形金箔片。除此之外,在部分铜器残件表面还发现了未完全燃烧的纺织物残片。目前大家倾向于将8号坑看作“填埋坑”,填埋坑是个中性词,它像是一场大型祭祀活动之后打扫完‘战场’、倾倒废弃物的埋藏坑,因为一是坑内器物种类多,二是残片非常碎。

测年断代

前面讲到灰烬很重要,这是因为考古工作者可以取样进行碳-14测年,从而测定三星堆确认器物坑的大致年代,2021年3月,四川省文物考古研究院联合北京大学,对6个坑的73份炭屑样品进行分析进行了碳-14测年工作,4号坑得到的数据被认为是比较有效的。

根据以往的测年和研究,三星堆“祭祀坑”所处的年代在三星堆文化晚期,相当于殷墟时期,也就是晚商。而最新的4号坑测年数据显示,这个坑最晚有可能已进入西周初年,但碳-14测年的结果是有误差的,不能完全依据这个数据就断定4号坑的年代到达了西周初年,综合下来,推断三星堆年代属于商代晚期至西周初期。

这些年,三星堆文化的分期有了一个基本共识:第一期在新石器时代晚期,第二期处于二里头文化至商早期,第三期相当于商代中期或略晚,第四期则在商代晚期至西周早期。

三星堆“祭祀区”一直存在一个争议,就是8个坑的埋藏顺序,是同时埋的,还是有先有后?谁先谁后?这个问题对搞清当时的祭祀礼制,以及三星堆作为都邑的社会性质、权力结构等大问题都很重要。

现在看来,同时埋藏的可能性比较小,2、3、8号坑是同时期的,4号坑很有可能是最后一个,或是最后的几个之一。

2023年7月三星堆博物馆新馆开馆,新展出的铜罍座倒立鸟足顶尊神像,由出自1986年发掘2号坑出土的铜鸟足人像、2021年3号坑出土的爬龙铜器盖、2022年8号坑出土的铜顶尊撑罍曲身人像、铜持龙立人像、铜杖形器四个部分拼合而成,同一物品的不同部分出现在三个坑中,这说明2、3、8号坑是同一个时代的,不然无法被拆分到3个“祭祀坑”里。

器物坑定性:祭祀坑?埋葬坑?亡国坑?窖藏坑?……

坑的性质决定了三星堆的性质! 对还原历史,搞清当时的祭祀礼制,以及三星堆作为都邑的社会性质、权力结构等大问题都很重要,所以对器物坑准确定性十分有必要。

在专业的考古工作者报告里,称呼三星堆“祭祀坑”时会特意将【祭祀坑】三个字打上引号,这是因为现在还无法断定这些坑的性质,祭祀坑只是其中最流行的说法,还需要明确的证据或论证,性质错了分析上也就南辕北辙。

坑内掩埋的很多器物的确属于宗教祭祀的像设和器具,但损坏并埋藏这些像设和器具却不一定是为了祭祀,窖藏坑、墓葬坑、掩埋坑、祭祀坑的可能性都还不能排除。

据目前考古勘探,这些坑出现的大时代可能相差不大,但是多坑之间的年代是有差距的,前面说了,2、3、8号坑应是同时期的,其他却不太确定,根据时间判断,既然不是同时形成的,亡国坑的可能性大大减低,因为人们离开三星堆将器物埋藏时出现不同时期的坑越多,这种可能性越小。

也有学者将这两座器物坑与墓葬挂起钩来,或称之为墓葬陪葬坑,或称之为火葬墓。但三星堆《二号坑简报》结语中已经指出,在三星堆一带,经过“半个多世纪的调查发掘,附近没有发现墓葬区。在两坑的周围,砖厂10余年烧砖取土,也没有发现墓葬”,因此,三星堆器物坑是墓葬陪葬坑的可能性很小。

答案似乎只能是“祭祀坑”,但根据古代文献记载和现代考古材料,中国古代祭祀无论是埋祭还是燎祭,它们所用的祭品不外乎牲、玉两类,殷商有大量使用人牲祭祀的情况,历史也从未见有过将大量金、铜、玉、石、骨器一起焚烧或一起掩埋的现象,铜在商周时期还是稀缺物品,除了是权贵用品外,还能制成戈斧钺这样的武器,在铁还没产生前铜就显得尤为珍贵,三星堆器物坑埋藏物品的巨大数量,也使人难以相信这是用于祭祀的目的,且不要说经常举行这样的祭祀非一般国家财力所能承担,就是一年或十年举行这样一次祭祀也太劳民伤财,这些也都是祭祀坑之说难以解释通的。

而根据其破碎的程度和一件青铜器碎块同时在2、3、8号坑的分布的事实,我个人倾向于是——“掩埋坑”,这可能是宗教冲突后被破坏的结果,宗教冲突在历史上并不鲜见,即便是现在也是这样,“恐袭”“圣战”“十字军”“异教徒”这些字眼背后都是血淋淋的宗教冲突。

我们假设这样一种可能,三星堆土著原本信仰“拜日教”,他们崇尚太阳,倾心铸造了许多高大、肃穆、神秘又伟岸的青铜祭祀品,把它们被陈设在宗祠里,每日膜拜,日经月累。有一天,东方来的新族群攻陷了三星“城”,他们信仰的是“拜火教”,与“拜日教”格格不入,是他们砸碎了这些青铜器,焚毁了宗祠,土著信徒们最终战胜了他们,但许多青铜器已经破碎无法复原,于是土著们挖坑将这些东西填埋了起来,填埋并不是随意的,他们有着自己的仪式,先将青铜器放在最底部,玉器、黄金饰品、焚毁的丝织物等掺杂其中,表层再用象牙覆盖。

这个故事成立的前提依赖于几个背景信息:

  • 青铜器的艺术造型独立于中原且领先许多,但上面的纹饰却跟殷墟的很相像,这说明受到了商文化的影响;
  • 出土的陶器与二里头文化出土的陶器类似,说明受到了“夏”文化的影响(二里头被视为夏朝遗址);
  • 出土了大量象牙、海贝。黄金权杖国内从未出土过;
  • 太阳神树的确很像扶桑。

这些说明古蜀国不是完全隔离的,与中原文化有着密切的联系,是中西文化的汇聚点之一,众多文化在这里交汇融合,再结合当地的土著的信仰及文化传统,从而形成了个性鲜明、独特瑰丽的区域文明,最终造就了三星堆的与众不同。

隐藏的信息

三星堆祭祀区属于商代晚期,中原地区已有大量此时期的甲骨文,甚至青铜铭文出现,因此,如果三星堆出现文字,并不是一件让人意外的事,但目前还没有,2023年出土了类似“中国”字眼的图案,但尚未获官方认定。发现文字,最重要的是找到文字的附着载体,那么,古蜀的文字有可能出现在什么上面呢?丝绸的出现提供了一种可能性。

4号坑内,肉眼看不见的信息中,灰烬层是其一,另一个则是丝织物。这是此前1、2号坑从未涉及过的领域,但在最近的检测中发现,1、2号坑的出土物中也有织物信号,只是在当年的抢救性发掘中,没人注意到它们。

这里需要明确两个概念:丝绸残留物与丝蛋白信号。丝绸残留物,指的是有明确经纬组织结构的丝织物,但大多数也是小到肉眼不可见,只有在显微镜的观测下才能看到它的形态。而丝蛋白信号,是一种通过生物学反应得到的能够显示或反映有无丝织物的信号,是不可见的,也更抽象。比如一堆填土,通过某种生物学的验证,检测出有丝蛋白存在的信号,则表明土中曾经有丝绸遗物

从目前的提取物来看,3、4、8号坑有丝绸残留物的出现,6号坑中也检测出丝蛋白信号。检测后发现,在出土的残件和完整器物上,有13种器形、40多组器物上有明确的丝织物附着。

丝绸残留物多附着在青铜器上,这是个有趣的现象。至少目前并未在陶器上发现,其他材质的器物,像金器、玉器,尚未进行大规模的检测。但青铜器是目前与丝织物关系最密切的器物,因为青铜器为丝织品的保留提供了生存条件,青铜器上的锈蚀物有抑菌作用,是可以沿着丝织物的组织结构生长的,最终使其贴附在青铜器上成为一个整体。

2号坑出土的青铜大立人像身着华服,说明当时已经有先进的用丝制度和纺织工艺,丝织物的出现用实物印证了这一点。

发现丝绸为发现文字或者符号提供了一个物质载体,其书写材料很有可能是朱砂、墨或是其他颜料。朱砂,在3号坑的几件青铜器上有所发现,其中一件罍通体涂过朱砂,还有一只小铜铃也涂了朱砂。那当时的人会用朱砂进行书写吗?有可能,但丝织物很难经过几千年保存下来。

墓葬

三星堆研究有一个很大的问题就是没有发现墓葬,如果有墓葬,通过墓葬形制、布局、规模、等级、陪葬品等能对当时的族群规模、社会形态、宗教习俗有充分的认识,但在三星堆《二号坑简报》中已经指出,三星堆一带经过半个多世纪的调查发掘,附近没有发现墓葬区,在两坑的周围,砖厂10余年烧砖取土,也没有发现墓葬。

而三星堆文化的继承者,在成都的金沙遗址,发现了3000余座墓葬,可奇怪的是没有发现一座高等级墓葬,这些墓葬没有明显的地位悬殊特性,而且多位于居住区附近,甚至与居住区重叠。

三星堆没有墓葬极有可能当时的他们不是土葬习俗,火葬、水葬都有可能,在从三星堆文化向金沙文化过渡过程中,由火葬(或水葬)慢慢地演变成了土葬,这种风俗习惯的变迁必然伴随着文化的融合甚至宗教信仰的变化。

据说古羌人有火葬习俗,根据地层判断,这会不会是一个古羌人的火葬坑?古羌人是现在很多民族的共同始祖,是商周时期居住在中国西北地区(今青海、甘肃一带)的古代部落,主流学认为古羌源自原始汉藏族,原始汉藏族乃汉族、藏族、羌族等民族的先祖。

陶器与青铜

陶器是考古学中重要的断代物证,因为自古以来陶器数量巨大,器形更新迭代比较快,每个时代、地域都有着鲜明的风格特征。相比之下,青铜器则属于历史中更迭变化较慢的器物,往往一种器形可以出现在前后相差几百年的不同历史阶段,因此不太适合拿来作为断代参照物。

三星堆文化的陶器明显跟宝墩文化不一样,宝墩文化是分布在成都平原的新石器时代文化遗址,与三星堆文化有密切的关系。目前被中国考古界认为是成都平原迄今为止被发现的最早的考古学文化。宝墩人制作陶器是源自西部甘肃马家窑文化人群的习惯,因崇尚自然,他们不太重视器物的造型,但是重视器物的装饰,所以陶器的造型很简单,但是上面有绳纹、附加堆纹等装饰,口缘还做成花边。而东部人重视器物的造型,线条很复杂,不断地转折,但是不重视外表装饰,几乎都是素面。三星堆的陶器明显大量来自东部的传统,造型很丰富,不重视装饰。

在墓葬出土中,时常能看到成套的有明显等级之分的陶礼器,这就为青铜礼器埋下了伏笔,当治金技术出现后,礼器制度延传下来,人们采用更高级的青铜工艺来彰显身份与等级,并创造出一套更加复杂的礼制,相应地,礼器结构也更复杂。

中原商王朝的青铜器,更像是人与神之间的一般中介物,是一种沟通的媒介,但在三星堆的宗教系统中,这种介质不再是几何形的器物,而是神像或祖先本身,以从多的人形、头部、脸谱形式存在。另一个不同点在于其他地方出士的青铜器非常少,而且体积很小,都是些类似于二里头文化中的青铜饰牌和青铜铃等小物件,但三星堆的青铜器不光体形巨大,数量还很可观。

三星堆的这套礼仪用器为什么要做这么大?可能因这一时期社会参与面广,就像我们今天几万人开演唱会,多远都能看到,有震撼力。到金沙时期已经做得小了,金沙遗址中已经看不到那种外形宏大庄严的青铜器物,可能社会参与面没有那么广,主要是一些神职人员参与祭祀,也不需要做那么具有震撼力的东西。这种变化的更大可能在于,在这一时期的金沙,世俗政治权力在不断增强,而宗教影响很可能在降低。

通过对三星堆两个器物坑出土的大量青铜人像的比对分析,三星堆的统治阶层明显分为辫发和笄发两个族群,前者代表的是掌握行政权力或军事权力的世俗贵族,后者代表的是掌握祭祀等宗教权力的神职贵族。到了金沙时期,无论是小铜立人像还是地位低下的双手反缚的石跪人像,都是辫发而未见笄发,这说明其中的辫发一方在社会中已经占据绝对主导地位,金沙王国很可能出现了辫发贵族阶级单独执政,一统天下的局面。

从陶到铜,看似是一个简单的材质变化,但其背后蕴含的是社会体制和组织结构的复杂化,这个变化催生出真正意义上的早期文明和早期国家,因为铜器与陶器相比,不仅制造技术更复杂,还意味着社会组织的复杂化。现有的各个文明基本上都会经历石器时代、陶器时代、青铜时代、铁器时代这样几个文明阶段,这是普遍性,每个地区发生的形式会不太相同,中国在这个过程中并不是特殊。

武器与贝壳

在三星堆出土的青铜器中,极少能看到青铜武器,反倒是玉制的武器有一些,但玉器显然不适合真正意义上的战斗,用玉制成武器更多地是呈现一种跟玉璋类似的宗教上的意义,是一种礼器,这点倒强化了器物坑是“祭祀坑”的说法。

青铜器虽然易脆,但如果用铜制成武器,与同时代还在使用用木质、石头制成的武器而言也有跨时代优势的,没有青铜武器这说明当时的青铜的产量极为稀少,很可能极为珍贵,除了祭祀外几乎没有产量可以用来铸造武器。

青铜很少,贝壳却不少见,有据可查的是1986年三星堆就出土了4600多枚当时的货币、海贝、铜贝,受制于四川盆地地形古蜀国的交流相对闭塞的多,发现贝壳本身就很异常,这说明在3000多年前三星堆人就与外界的滨海文明有着交流,而不是像人们以为的那样,它不是一个封闭隔绝的世界。

是人是神

三星堆出土的那些青铜人像是古蜀人供奉的神明吗?如果是神明,为什么这些神长得那么像,从嘴巴到眉毛,从耳朵到表情,简直像一个模子刻出来的,他们大小基本一致,难道这些神明没有等级之分吗?在一个宗教里,所有神明身份一样地位一样显然不现实,从出土文物来看,三星堆人不缺乏想像力,完全有能力创造出更完善的神明体系。

如果不是神明,那么还有另外一种可能,他们长得像并不是因为受限于三星堆人的想像力,而是尊重事实,因为,这些人出自同一血脉,他们有可能是古蜀国的国王,父传子、子传孙,世袭罔替。正是因为拥有相同的血脉,底层基因决定了他们长得差不多,同时在相对封闭的四川盆地,社会流动性较低,叠加商周时期森严的阶级制度,血脉更不容易被外来族群稀释,从而保持了血脉上的纯净,看看那些人面青铜像,除了额头、脸型等细微的区别,其他方面都很雷同,像一个模子刻出来的也就不奇怪了。

我们再看看历史上各帝王的画像,除了极个别的例外,他们也大多长得很像:

祖先崇拜起源极早,殷商时期已经形成了完整的仪式,他们认为死去的先人会成为祖灵,祖灵生活在祖地,那是一个仿若天国地方,祖灵能对子孙降祸赐福,因此需要供奉祖先来祈求平安,即便是现在,东亚东南亚祭祀祖先依旧盛行。

与三星堆同期的殷商具有浓厚的祖先崇拜文化,他们通过人牲祭祀然后进行甲骨占卜,事实上就是在向死去的祖先询问他们的意见,问下妇好的病,问下能不能打仗,先人的回答以龟裂纹的形式呈现,经过祭师解读获得答案,有时商王也自己解读,而青铜器礼器正是与祖灵沟通的媒介,越是强大的祖先被祭祀的频率越高,据现存甲骨文卜辞记载统计,商朝被祭祀最多的是商王武丁,献祭了9021人,整个商代共用掉了超1.4万个活人进行祭祀,残暴而血腥。

三星堆那些人面青铜刻画的会不会正是逝去的古蜀国的掌权者,是国王或大祭司,那些覆盖着黄金面具的人应该曾经很强大,带领族群赢得了战争,或是让族群强大到了一个新高度,所以被黄金面具特殊加持,而那尊有完整身体的青铜立人则是三星堆人的始祖或者说建国的初代国王。那唯一的黄金权杖则是类似玉玺这样的权柄信物,上面雕刻的鱼与鸟,则是“鱼凫”之意,三星堆难道就是是所谓的“鱼凫”王朝吗?。

那只肉肉的“猪儿虫”其实是桑蚕,仔细看它的身体有多个像蚕一样的环节。而太阳神树就是“扶桑”,扶桑本质来说就是桑树,这点争议不大,而桑叶可以用来养蚕。那个龙形龟背“烧烤架”其实是用来养蚕结茧的簸箕,网格模拟的是竹条编织。太阳轮指的是太阳,这几乎没有争议,夏季的太阳离赤道最近,桑叶与蚕生长最迅速,因此夏季是养蚕最好的时节。蚕变茧、茧蜕蛾、蛾产卵、卵化蚕,这种生命上的轮转循环赋予了桑蚕神性–永生,这大概是它被像神一样供奉的主要原因,“蚕丛(虫)”时代由此而来,“丛”在文字释义中有“聚集”的意思,而蚕恰好又是批量养殖的,一个家庭一次性也能养殖成千上万只。

只是这一切在祭祀场景下被人为做了艺术化处理,神化了人与动植物的外形,小指粗的蚕被放大了百倍,塑造成了神蚕的形象,单看太阳轮人们容易想到太阳崇拜,单看神树会联想到神话里的扶桑或建木 ,神乎其神,玄而又玄,但当我们抛开那些神话性的东西,返璞归真,以人性的视角把这些放在一起当作一幅画来看待时,事情开始变得不一样,你会发现所有图画、雕塑都有它要表达的主题,而养蚕就是这幅图画的主题之一,一副养蚕的自然画卷油然而生。

让我们还原现场:夏季,红日初升,桑树上站满了小鸟,树下栖息着各种动物,这正是养蚕的好时节,国王主持盛大的仪式,祭祀祖先和蚕神,祈求人民无病无灾,桑蚕能顺利结茧、抽丝,风和雨顺,国泰民安。

三星堆人中当时一定有一位超越时代的艺术家、雕塑家,他的相像力和造型能力超越了时代,超前了数千年。“蚕丛及鱼凫,开国何茫然!尔来四万八千岁,不与秦塞通人烟” ,李白在《蜀道难》里感叹时距三星堆时期最近也有1800年了,再到隔了1000多年的今天,这仍是个谜,但三星堆的出世让这份迷雾薄了许多。

古蜀文明与中华文明

三星堆文化是一种多元复合型文化。遗址出土数量最多的是陶器和石器,而这些器物绝大多数都具有很明显的地域特征,受本地的宝墩文化和马家窑文化的影响。与此同时,三星堆文化还深深烙印着其他文化的印记,体现了三星堆海纳百川的包容性和吸附性:以金杖、金面具为代表的黄金制品,以大立人像、人面像为代表的青铜雕像,还有三星堆古城使用土坯的城墙筑造技术可能与西亚两河流域乃至更远地区的文明有着某种关联性。

就文明的发达程度、对后世和周边地区的影响来看,三星堆文明并没有达到中原地区夏商文明的高度,但是在艺术的想象力和创造力、大型铜器的铸造、黄金的锻打和利用方面则远远超过了当时的中原。

夏、商、周三个时代似乎都有一个国家占据着优势地位,但这个国只是它们那个时代最显赫的国家,而绝不是唯一的国家,古蜀国,就是这样一个与中原王朝并存且独立的古国,而且是一个未曾间断的、自成系统的文明体系。

三星堆文明鲜明的地方特征,是中华文明最终形成前,众多区域文明中发展程度最高,同时也是最为独特的一朵奇葩,它以地域性鲜明的土著文化和传统的中原文化为基础,广泛吸收了来自周边以及其他古代文明的文化因素,从而呈现出独特的文化特征,极大地丰富了中华文明起源和形成过程中的文化内涵,同时,三星堆文明对于世界文明也有着杰出贡献:

  1. 以神树、人像、人头像、人面像(具)、半人半神像为代表的青铜雕塑作品在东方青铜文明中绝无仅有;

  2. 以金杖、金面具、金鸟形饰为代表的金器所展现出的辉煌的黄金工艺成就,在东方农耕文明中极为独特;

  3. 种类和形制都十分丰富、近乎狂野的用玉现象在中国青铜文明中十分突出;

  4. 数量惊人的象牙、海贝集中埋藏的现象,在世界青铜文明史上绝无仅有。

因此我们可以这样认为,来自黄河流域夏商文明的青铜铸造技术、礼器制度和用玉传统以及可能源于其他文明的雕塑艺术、尚金习俗和黄金冶炼加工技术在四川盆地这个独特的地理单元中产生了碰撞和交融,古蜀人的创造性由此被极大地激发,对这些外来的人工制品、制作技术、使用习俗和审美情趣按照自己的意愿与本土文化进行了有机的整合,从而形成了鲜明的区域特征。

从这个意义上讲,那一套看似怪异的东西仍然可以视为土著文化的范畴,是古蜀文明极具开放性和创造性的生动体现,当然也是早期中国文明的一部分。

最后,即便那些看上去很怪异、“不那么中国”的器物,它们身上也有很多大家熟知的中国符号和元素:比如说铜跪坐人像(祭司)手里拿着的牙璋;铜跪坐人像(祭司)头上顶的尊;1号大神树、大立人以及神殿上龙的形象。另外,如果大家仔细观察,就会发现云雷纹、夔龙纹、兽面纹、回纹、蝉纹、连珠纹等大量中原商代青铜器上的典型纹饰,都被应用到了大立人、小立人、兽首冠人、神树、神坛等器物上。因此,从这个角度观察,三星堆文明中那些“奇特”的物品,仍然可以视为土著文化的范畴,也是中国早期文明的一部分。

三星堆遗址上下历经2000年,完整地记录了人类文明从孕育、诞生、发展、辉煌到开始衰弱的过程,是一部早期蜀国的物质文化史。四川古称蜀,是位于中国西南部的一个古老国家,这个名称曾多次出现在甲骨文和金文当中。但关于蜀的文献记载大多较为简约,而且大多有着神话色彩:“蚕丛及鱼凫,开国何茫然”“蜀之先,称王者有蚕丛、柏灌、鱼凫、杜宇、开明”,三星堆遗址的发现和发掘,不仅将传说中的蜀国历史在很大程度上变成了信史,而且还展现出古蜀国璀璨的青铜文明。

严格的文明定义至少包含三个必要要素:文字、冶金术和城市,称之为“文明三要素”,三星堆迄今还没有被发现被证实的文字,从这个角度讲又还算不上严格意义上的文明,略有遗憾。

Airpods Pro的体验是真的好,美观、便携,手机电脑自动切换,降噪、空间音频的体验也很不错,逃不过的“真香定律”。

耳朵问题

一开始以为是游泳导致的,诸如进水、环境不卫生之类的,表现为耳朵发炎,伴有液体,且反复发生。

用了一些滴液,看了专科医生,也仅能维护短暂的时间。停止游泳后,问题依旧,慢慢观察才怀疑上Airpods,知乎上也有很多人大倒苦水,例如这些

网上有些文章或视频会告诉你要注意卫生,经常清洁耳机,在这样的理论指导下我试过了对其全身酒精SPA,开水炖煮耳塞等,没什么卵用,耳机就这样闲置了大半年。

一度怀疑是因为 Made in Vietnam的质量不过关导致的。

过敏原因

后来有意识地搜索了下相关文章,《你正在使用的苹果耳机AirPods Pro,可能是引发耳朵过敏性接触性皮炎的元凶?》这篇文章比较好地解释了发生的原因,专业人员进行了过敏性的分析,评估出了耳机各部分对过敏的影响,摘录如下:


测试了患者会接触到到 AirPods Pro 的三个部分,这些部分在佩戴时会与皮肤接触,即硅耳尖、耳机的白色塑料外壳和黑色不锈钢声学网(上图a、b、c)

测试结果(见下图)显示患者对硅耳尖反应强烈,对白色塑料外壳反应微弱。这些被认为是当前症状相关的。她对黑色不锈钢声网也有怀疑(+/+)反应。

苹果的官方建议

苹果在其官网公开了一些过敏性材料的描述,但那几乎不是常人所能理解和检测的,主要涉及的材料为丙烯酸酯(这是啥玩意儿?),它同时提醒到:

如果您的皮肤出现发红、肿胀、发痒或任何其他刺激反应,建议您咨询医生后再决定要不要继续佩戴 AirPods、EarPods 或 Beats 设备。

从网友的经验来看,对硅胶耳塞过敏是主要的原因,这意味着换其他品牌的耳机大概率也是会过敏的,为啥我这么肯定呢,因为我换过!!!!

独家配方

知道了原因后,解决的方法也很简单,换掉硅胶耳尖,隔离开耳机与耳朵的接触

难得是什么样的耳塞质量上会超过苹果官方?

经过试验,最终我的Airpods被裹成了木乃伊,经过一天一夜的佩戴,效果却是立杆见影,无任何不适:

具体采购清单如下,总价79元

| 替换品 | 商品 | 价格 | 购买链接 |
| —- | —- |
| 耳塞 | 绯乐Latex-AR700耳塞 | 69到手 | 淘宝 |
| - | 弘生透气防过敏无纺布 | 9.9 | 京东 |

以上方案适用于所有硅胶过敏的情况,其他耳机要找相适配的耳塞。

实际上,我还尝试过其他耳塞+防水胶布(是真薄),还采购了笛膜(纯天然还够薄),测试后再更新。

苦了我的耳朵!

整理电脑时看到之前在公司分享用的两份PPT,做的挺好看的,记录下来。一份是给市场人员介绍基本IT知识用的,一个是给小组成员总结经验用的。

如下:

图片
图片
图片

PDF版:

《后台开发组会议要点2017.06.13》PDF版
《互联网安全初探_邓羽浩_2017.02.17》PDF版

KeyNote版:

《后台开发组会议要点2017.06.13》KeyNote版
《互联网安全初探_邓羽浩_2017.02.17》KeyNote版

推荐选用云服务器,按流量付费,使用后及时销毁

注意选择香港区域的服务器,保证网络的联通,避免额外工作,这算是小小的经验吧,我这里选择的是腾讯云香港服务器(4核8G)。

国内服务器可以使用ProxyChain4配合代理来无障碍安装软件

注意服务器版本选择,因为要用到Docker,而根据经验CentOS最好使用7+的版本,我们这里选择的是7.4

根据文档来看,在Windows、Mac环境下都会多做一些额外工作,建议使用CentOS或Ubuntu这样的系统。

我所用系统内核:

1
Linux VM_***_centos 3.10.0-693.el7.x86_64

按官方文档安装系统环境

http://hyperledger-fabric.readthedocs.io/en/latest/prereqs.html

具体要求如下:

  • Docker version 17.06.2-ce or greater.
  • Docker Compose version 1.14.0 or greater.
  • Go version 1.10.x is required.
  • Node.js - version 8.9.x or greater,9.x is not supported at this time.

安装DockerCE社区版

参考官方文档 https://docs.docker.com/install/linux/docker-ce/centos/

确认Docker正常:

1
2
docker --version
Docker version 18.05.0-ce, build f150324

安装Docker-compose

参考官方文档:https://docs.docker.com/compose/install/#install-compose

确认Docker-compose正常:

1
2
docker-compose --version
docker-compose version 1.21.2, build a133471

安装 Go

Fabric是由Go开发的,智能合约Chaincode也是Go实现的

参考文档:https://golang.org/doc/install?download=go1.10.2.linux-amd64.tar.gz

确定Go正常:

1
2
3
4
5
6
go version
go version go1.10.2 linux/amd64

# test code
go run hello.go
hello, world

Node.js 安装

这里使用NVM进行多版本管理

参考:https://github.com/creationix/nvm/blob/master/README.md

确认安装正常:

1
2
3
4
5
nvm install 8.9.4
nvm use v8.9.4

npm -v
5.6.0

按文档安装Fabric

http://hyperledger-fabric.readthedocs.io/en/latest/install.html

执行:

1
2
3
4
5
# 如果系统没有GIT则先安装GIT
sudo yum install git -y

# 安装 Fabric
curl -sSL https://goo.gl/6wtTN5 | bash -s 1.1.0

没问题的话用docker images命令会看下列结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest e38bc07ac18e 6 weeks ago 1.85kB
hyperledger/fabric-ca latest 72617b4fa9b4 2 months ago 299MB
hyperledger/fabric-ca x86_64-1.1.0 72617b4fa9b4 2 months ago 299MB
hyperledger/fabric-tools latest b7bfddf508bc 2 months ago 1.46GB
hyperledger/fabric-tools x86_64-1.1.0 b7bfddf508bc 2 months ago 1.46GB
hyperledger/fabric-orderer latest ce0c810df36a 2 months ago 180MB
hyperledger/fabric-orderer x86_64-1.1.0 ce0c810df36a 2 months ago 180MB
hyperledger/fabric-peer latest b023f9be0771 2 months ago 187MB
hyperledger/fabric-peer x86_64-1.1.0 b023f9be0771 2 months ago 187MB
hyperledger/fabric-javaenv latest 82098abb1a17 2 months ago 1.52GB
hyperledger/fabric-javaenv x86_64-1.1.0 82098abb1a17 2 months ago 1.52GB
hyperledger/fabric-ccenv latest c8b4909d8d46 2 months ago 1.39GB
hyperledger/fabric-ccenv x86_64-1.1.0 c8b4909d8d46 2 months ago 1.39GB
hyperledger/fabric-zookeeper latest 92cbb952b6f8 3 months ago 1.39GB
hyperledger/fabric-zookeeper x86_64-0.4.6 92cbb952b6f8 3 months ago 1.39GB
hyperledger/fabric-kafka latest 554c591b86a8 3 months ago 1.4GB
hyperledger/fabric-kafka x86_64-0.4.6 554c591b86a8 3 months ago 1.4GB
hyperledger/fabric-couchdb latest 7e73c828fc5b 3 months ago 1.56GB
hyperledger/fabric-couchdb x86_64-0.4.6 7e73c828fc5b 3 months ago 1.56GB

添加PATH环境变理:

1
2
# 具体路径以你实际情况为准
export PATH=$PATH:/root/go/src/fabric-samples/bin

运行第一个测试网络

参考:http://hyperledger-fabric.readthedocs.io/en/latest/build_network.html

fabric-samples/first-network目录下执行:

1
2
3
4
5
6
7
8
9
10
11
12
./byfn.sh generate
./byfn.sh up

# 直到出现下面的提示
========= All GOOD, BYFN execution completed ===========


_____ _ _ ____
| ____| | \ | | | _ \
| _| | \| | | | | |
| |___ | |\ | | |_| |
|_____| |_| \_| |____/

这个时候再使用使用docker ps,会出现如下结果:

1
2
3
4
5
6
7
8
9
10
11
12
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
61be9101c099 dev-peer1.org2.example.com-mycc-1.0-26c2ef32838554aac4f7ad6f100aca865e87959c9a126e86d764c8d01f8346ab "chaincode -peer.add…" 3 minutes ago Up 3 minutes dev-peer1.org2.example.com-mycc-1.0
eda8b0fd85ff dev-peer0.org1.example.com-mycc-1.0-384f11f484b9302df90b453200cfb25174305fce8f53f4e94d45ee3b6cab0ce9 "chaincode -peer.add…" 3 minutes ago Up 3 minutes dev-peer0.org1.example.com-mycc-1.0
6107fb4406fc dev-peer0.org2.example.com-mycc-1.0-15b571b3ce849066b7ec74497da3b27e54e0df1345daff3951b94245ce09c42b "chaincode -peer.add…" 4 minutes ago Up 4 minutes dev-peer0.org2.example.com-mycc-1.0
b8204bfc0734 hyperledger/fabric-tools:latest "/bin/bash" 4 minutes ago Up 4 minutes cli
83ff712ca3bd hyperledger/fabric-peer:latest "peer node start" 4 minutes ago Up 4 minutes 0.0.0.0:8051->7051/tcp, 0.0.0.0:8053->7053/tcp peer1.org1.example.com
677a3fc1c6c7 hyperledger/fabric-peer:latest "peer node start" 4 minutes ago Up 4 minutes 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer0.org1.example.com
193de4b51d5a hyperledger/fabric-peer:latest "peer node start" 4 minutes ago Up 4 minutes 0.0.0.0:9051->7051/tcp, 0.0.0.0:9053->7053/tcp peer0.org2.example.com
ebafff254a5b hyperledger/fabric-orderer:latest "orderer" 4 minutes ago Up 4 minutes 0.0.0.0:7050->7050/tcp orderer.example.com
ebe3b1c8f9e8 hyperledger/fabric-peer:latest "peer node start" 4 minutes ago Up 4 minutes 0.0.0.0:10051->7051/tcp, 0.0.0.0:10053->7053/tcp peer1.org2.example.com

简洁模式

1
2
3
4
5
6
7
8
9
10
11
# docker ps --format "{{.ID}}\t{{.Names}}"

61be9101c099 dev-peer1.org2.example.com-mycc-1.0
eda8b0fd85ff dev-peer0.org1.example.com-mycc-1.0
6107fb4406fc dev-peer0.org2.example.com-mycc-1.0
b8204bfc0734 cli
83ff712ca3bd peer1.org1.example.com
677a3fc1c6c7 peer0.org1.example.com
193de4b51d5a peer0.org2.example.com
ebafff254a5b orderer.example.com
ebe3b1c8f9e8 peer1.org2.example.com

这样就模拟了一个简单的区块链网络,它有1个排序机构(order org),2个节点组织(peer org)每个组织有2个节点(peer)。

上面的组织机构定义在configtx.yaml文件中,而各个容器的拓扑关系定义在crypto-config.yaml文件中,使用 ./byfn.sh down 可以关闭这个网络。

记录一些自己入门遇到的问题与解决方法

怎么将navigation传递到子级组件?

当需要在子组件中使用navigation导航时,一种方法是直接在引入组件时将 navigation 作为props传递,另一种是使用 withNavigation,后者更优雅。

方法一:引用时传递

1
<Component navigation={this.props.navigation} ...otherProps />

方法二:使用 withNavigation参见官方文档

1
2
3
4
5
6
7
8
9
10
11
12
import React from 'react';  
import { Button } from 'react-native';
import { withNavigation } from 'react-navigation';

class Component extends React.Component {
render() {
return <Button title="Back" onPress={() => { this.props.navigation.goBack() }} />;
}
}

// 用withNavigation包一下
export default withNavigation(Component);

然后在引入时更直接:

1
<Component ...otherProps />

RN在iOS真机、模拟器调试时网络兼容问题

在RN生成的XCode项目里,默认是通过远程方式调试,只要手机、模拟器处于同一网络即可,但我们的手机极有可能会切换网络(譬如上下班、吃饭、上厕所…等等),而这会导到远程调试的应用无法打开,可以兼容处理。

打开XCode项目,修改 AppDelegate.m,将原有的

1
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];

修改成

1
2
3
4
5
6
7
#if TARGET_IPHONE_SIMULATOR
// remote debug
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
// release
jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif

这会将真机像发布时一样把文件打包进APP,不受网络切换影响

获取组件的屏幕位置

当使用react-native-modal-popover组件时,有一个参数fromRect用来指明组件的位置,这时候我们取要获取组件的位置,使用NativeModules.UIManager.measure

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import React, { Component } from 'react'; 
import {
StyleSheet,
Text,
View,
TouchableOpacity,
findNodeHandle,
NativeModules
} from 'react-native';
import Popover, { PopoverTouchable } from 'react-native-modal-popover';

....

const handle = findNodeHandle(this.refs[ 'popoverAnchor' ]);
if (handle) {
NativeModules.UIManager.measure(handle, (x0, y0, width, height, x, y) => {
this.setState({
popoverAnchor: { x, y, width, height },
});
});
}

....

<SimpleLineIcons
name="options"
ref="popoverAnchor"
...otherProps
/>
<Popover
visible={this.state.showPopover}
fromRect={this.state.popoverAnchor}
...otherProps
>
{children}
</Popover>

基于webview实现简易浏览器

在APP内经常需要打开一些URL链接,如果通过外部浏览器打开、返回体验不好,一般会做一个内部的导航,用RN的WebView组件很容易实现,主要是利用onNavigationStateChange获得各种状态并处理各导航菜单的表现,同时利用navigation.setParams动态设置浏览器的标题栏。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
...
goBack() {
this.refs[ WEB_VIEW_REF ].goBack(); }

goForward() {
this.refs[ WEB_VIEW_REF ].goForward(); }

reload() {
self.refs[ WEB_VIEW_REF ].reload(); }

openShare() {
Share.share({ message: 'content', title: 'testshare' })
.catch((error) => console.error(error)); }

openWithSafari() {
Linking.openURL(this.state.currentUrl)
.catch(err => console.error('An error occurred', err)); }

onNavigationStateChange(navState) {
this.setState({
backButtonEnabled : navState.canGoBack,
forwardButtonEnabled: navState.canGoForward,
currentUrl : navState.url,
status : navState.title,
loading : navState.loading,
scalesPageToFit : true
});

// 动态更新 headerTitle
if (navState.title) {
this.props.navigation.setParams({ title: navState.title })
}
}

...

<WebView
ref={WEB_VIEW_REF}
source={{ uri: url }}
style={styles.webView}
scalesPageToFit={true}
startInLoadingState={true}
onNavigationStateChange={(e) => this.onNavigationStateChange(e)}
/>
<View style={styles.toolbar}>
{/*退回*/}
{
!this.state.backButtonEnabled && (
<View style={[ styles.toolBtn ]}>
<SimpleLineIcons name='arrow-left' size={18} style={[ styles.headerIcon, styles.headerIconDisable ]}/>
</View> )
}
{
this.state.backButtonEnabled && (
<TouchableOpacity style={styles.toolBtn} onPress={() => this.goBack()}>
<SimpleLineIcons name='arrow-left' size={18} style={[ styles.headerIcon ]}/>
</TouchableOpacity> )
}
...other buttons
</View>

使用react-navigationTabNavigator时Tab之间跳转不能正常返回的情况

如果TabA、TabB同时是StackNavigator,当从一个TabA跳到另一个TabB里的某个路由时,返回时常常会处于TabB中而无法正常返回到TabA,一种方法是修改顶部左侧菜单自定义实现返回逻辑,但这种情况下右滑返回手势仍然不能正常返回到TabA。

换种思维,直接将TabA要跳转的页面引入到相应的Tab路由中,代码仍然是一套,只是配了两个路由,路由名字略微不同即可:

1
2
3
4
5
6
7
8
9
10
11
export const RouteHome = StackNavigator({
Home : { screen: Views.Home },
HBrowser: { screen: Views.Browser },
Scanner : { screen: Views.Scanner },
})

export const RouteSetting = StackNavigator({
Setting : { screen: Views.Home },
Browser: { screen: Views.Browser },
ScannerB : { screen: Views.Scanner },
})

上面的 HBrowserBrowser用了相同的组件,但路由名不同,在Home路由中按需跳转HBrowser,在Setting中就按需跳转Browser,这样兼顾了代码复用与交互的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
......
<Hyperlink
onPress={ (url, text) => {
if (navigation.state && navigation.state.routeName === 'Home') {
this.props.navigation.navigate('HBrowser', {url: url, text: text})
} else {
this.props.navigation.navigate('Browser', {url: url, text: text})
}
}}
linkStyle={styles.url}
>
<Text style={styles.content} selectable={true} selectable={true}>
{item.content}
</Text>
</Hyperlink>
......

UPDATE: 经测试,不同StackNavigator里可以包含同名路由,导航时会优先从该Stack里寻找路由,所以上面的路由在取名时不需要刻意规避,简化如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const BaseRoutes = {
Browser: { screen: Views.Browser },
Scanner : { screen: Views.Scanner },
};

export const RouteHome = StackNavigator({
Home : { screen: Views.Home },
...BaseRoutes,
})

export const RouteSetting = StackNavigator({
Setting : { screen: Views.Home },
...BaseRoutes,
})

导航时不再区分路由名:

1
2
3
4
5
6
7
8
9
10
11
12
......
<Hyperlink
onPress={ (url, text) => {
this.props.navigation.navigate('Browser', {url: url, text: text})
}}
linkStyle={styles.url}
>
<Text style={styles.content} selectable={true} selectable={true}>
{item.content}
</Text>
</Hyperlink>
......

StackNavigator里嵌套了TabNavigator

如果TabNavigator里的Views是根据程序动态生成的,那边多半面临导航找不到路由的问题

同时如果组件既在TabNavigator里使用,也有可能直接在StackNavigator里使用,这个时候 navigation指向不同,需要特殊处理才能兼容

具体方法,参考:https://github.com/react-navigation/react-navigation/issues/335

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Community   : CommunityTabs, // 这个方法不能让子级最高层级的 TabBar的情况,譬如按需隐藏 
Community : { screen: ({ navigation }) => <TabsNavigator screenProps={{ navigation }}/> },

...

// 调用时做一些处理
navigate = (route, payload) => {
if (this.props.screenProps) {
this.props.screenProps.navigation.navigate(route, payload)
} else {
this.props.navigation.navigate(route, payload)
}
}
...

总结一下用Nginx代理解决的一些问题的思路。

小程序校验domain

docker暴露端口不够

WFG墙翻(反),外网不可以

websockt:ws变wss

IPV6不支持的情况

阿里云、腾讯云都不支持IPV6,如果代理时返回的IPV6将会报错:

1
Address family not supported by protocol

解决办法是在DNS后指定不返回IPV6地址

1
resolver 8.8.8.8 ipv6=off;

最近读了几本运营营销相关的书籍,国内国外的作者都有,书里提到了不少案例,十分精彩,学习了不少新的观点理论,虽然还没读完但总觉得有必要记录一下。

一些新概念

MVP:最小化可行产品(Minimum Viable Product)

Idea is cheap,show me the product。

MVP要求的是在一个点子变成完整的产品之前,应该借助于现有一些平台或工具做出最基本的产品,然后投放给市场进行检验,经过市场反馈有效后再投入更多资源进行开发。MVP并不意味着主体功能的缺失或是体验上的粗糙。

书中提到就算是Goole大约也只有30%的想法经市场检验后确认是比较靠谱的,大多数人自认为有用的需求不过是一厢情愿。

可以实践的方式:微信公众号,微信企业号;WrodPress博客系统;原型基础上做的模拟体验;做出效果视频看用户是否喜欢。

PMF:产品市场适配度(Product Market Fit)

产品是否有用,有多大用,市场说了算。有些产品有用,但可能是很小的一个受众,能找到那个小众群体才算达到PMF,没找到或是找了一群不相干的用户,基本上也是没用,严重甚至的会对产品的运营策略带来误判。

Growth Hacker:增长黑客

增长黑客指的是那些既有技术,又有产品、营销视觉的跨界人才,他们依靠分析产品的各种数据得出增长或是降低的原因,并提出优化方案,使产品、收入进行可持续的增长。

增长团队一般是工程师、数据科学家、产品、营销组成,是一个综合性团队,有些公司在此之上设立增长官Growth Officer,赋予更大的职责和权限。他们所采用的方法也称之为 Growth Hacking。

基本上这类人才很少,相关岗位的设置也多是大公司才有专门设置。据称 Facebook 的增长团队由CEO直接领导,作出了卓越贡献。

可用的一些工具:Mixpanel,growingio.com,Google Analytics等类似平台

附一段百科的介绍:

增长黑客是介于技术和市场之间的新型团队角色,主要『依靠技术和数据』的力量来达成各种营销目标,而非传统意义上靠砸钱来获取用户的市场推广角色。他们能从单线思维者时常忽略的角度和难以企及的高度通盘考虑影响产品发展的因素,提出基于产品本身的改造和开发策略,以切实的依据、低廉的成本、可控的风险来达成用户增长、活跃度上升、收入额增加等商业目的。简单来说,就是『低成本』甚至零成本地用“技术”来让产品获得有效增长。

噪声用户 / 蝗虫用户

并不是所有用户是有意义的,比如女性社区里的大量爷们,企业应用里的个人用户,他们不是产品的服务对象,但却大量消耗相关的资源,对初创公司是非常不利的,社区类产品尤其不利。

有二次元网站为了过滤掉这些用户需要注册用户回答60多道题目,有的需要邀请,有的需要付费才能注册。

可用的手段包括:邀请注册、付费注册、过滤非目标用户、权限控制等。

关于增长

所谓增长就是在曝光量转化率两件事上下功夫:SEO、反链、ASO、AD、内容营销、病毒、事件营销等是为了提高曝光量。交互方式、设计美丑、速度、文案等深刻地影响着注册到付费的转化率,不可小视,提高到理论上就是growth hack,细操起来是苦力活,过程与结果往往很有意思。

一般的产品体验的提升是靠观察与琢磨,growth hack更多靠数据+A/B test说话,比起单个营销事件的而言,GH有可持续操作的特点。当然最基本的还是要讲产品的价值。现在流行的社群概念对冷启动、增长、营销、售后关怀…整个流程都有可能全面的介入。

缘由

没什么具体的原因,一是想深入学习MarkDown写作,二是想分享一些学习内容,三是GitHub可以免费搭建博客,不再为服务器与长城防火墙发愁。

历史

说起来之前的博客大约存在了6年(2008-2014),好的时候每天都出一篇甚至好几篇,后来微博兴起,博客再也没有以前那么热闹了。再后来服务器过期,数据东挪西腾的,搞乱的有,搞掉的有,也就没什么兴趣再把博客维持下去,索性关掉。

将来

现在有了兴趣,不会写的太频繁,会是真正的想写一点东西的时候更新。

tags:

1, ProductHunt
2, HuntNew

categories:

1, 学习
2, 思考
3, 设计
4, 运营