Giter Site home page Giter Site logo

maskblog's People

Contributors

mask2012 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

maskblog's Issues

babylonjs资源

babylonjs https://www.babylonjs.com/
是和threejs很像的 js 3d引擎,前者偏向于游戏开发,功能强大,社区活跃,文档例子丰富,我喜欢他的playground,例子多就好学。
clipboard

各种资源

国内教程翻译版
http://blog.cangzhitao.com/post/translate/babylonjs/02-elements.htm

查询babylon的api,学习必不可少
https://doc.babylonjs.com/api/classes/babylon.vector3

帆船游戏,这个就是我当初设想的原型,只差我去实现啦!
http://race.assassinscreedpirates.com/
clipboard

里边用到的声音manager
http://www.schillmania.com/projects/soundmanager2/

阿里巴巴开会用three做的互动暖场
https://102.alibaba.com/detail?id=129

国人写的战斗机游戏
https://github.com/renjianfeng/flightSimulator

免费模型下载推荐

http://artist-3d.com/free_3d_models/
http://www.aigei.com/3d/
https://sketchfab.com/
https://free3d.com/
http://www.xiadele.com/
http://www.cgmodel.com/
https://www.blendswap.com/

《健康长寿饮食指南》

从1983年到2008年,在世界卫生组织的资助下,家森幸男的足迹遍及了全世界61个地区,用他的话来说,这20多年的时间,终于让他明白了一件事,就是“为什么有人能长寿,有人却短命”,导致这种差异的决定性因素就是一个字——吃。

思考

在看完《谷物大脑》《救命饮食》,地中海饮食,低碳饮食,生酮饮食后,发现营养学界的争论点非常多,低碳还是高碳?吃肉还是不吃肉?高蛋白饮食怎么样?这些在科学界都是没有定论的,各家各派都在说自己的观点。
于是乎我在想,健康的饮食不就是参考健康长寿的人的饮食就好了吗?这个可信度应该是最高的,按照这个思路得到的观点也一定是很可靠的。

正文

第1节:开篇语

  千百年来,长寿都是令人向往的。从徐福东渡寻求不老仙药,到如今各种关于长寿的保健方法,无一不体现了人们对长寿的渴望。

  但是,人们追求长寿仅仅是为了寿命长而已吗?

  如果,各种慢性病缠身,每日比吃饭还准时的是吃药,每月比生活费还多的是医药费……

  如果,生活无法自理,终日躺在病榻上看着辛苦一天的子女下了班还要伺候自己……

  这样的“长寿”会有人向往吗?

  答案肯定是:没有!

  那么,人们追求向往的长寿到底是怎样的?那样的长寿又需要通过什么样的方法才能真正获得呢?

  现在就让我们随着世界知名长寿学博士家森幸男一起开始他的世界长寿村之旅吧,让我们看看真正值得向往的长寿是什么样子,又源自何处。

  推荐序 健康长寿,饮食中来

  说到饮食健康的话题,几乎能够吸引所有人的注意力——谁不想让自己生命蓬勃,健康长寿呢?但是,这方面的信息,又实在太过混乱,令大多数人感到无所适从,难以操作。

  有的人听说,肉类是魔鬼,一定不能吃。也有人听说,内脏胆固醇高,完全不能沾。有人听说豆制品含植物雌激素能让孩子早熟,也有人听说奶类会致癌连酸奶也不能喝……这种种说法,似乎都有科学证据,但果然能够让人信服吗?如果细细地分析那些研究结果的偏颇之处,解释为什么不能用好坏来绝对划分食品,吃肉喝奶并非对人人有害,合理搭配、适度摄入才益于健康……恐怕非专业人士只会听得云里雾里。翻翻家森幸男教授所著的这本《健康长寿饮食指南》,各种有关饮食的疑惑,或许就能豁然开朗。家森教授作为世界知名的长寿学专家,毕生致力于饮食与健康关系的研究。在世界卫生组织的协助下,他历时20余年,走遍全球6大洲25个国家61个地区,去完成有关人类饮食与健康长寿的一项调查,而这本书就是他这项研究的经历和体会,可以说浓缩了人类饮食与健康长寿的研究结果。

  跟着家森教授,我们走进那些耄耋老人个个精神矍铄的世界著名长寿区域,也走过那些寿命很短、大腹便便、慢性病肆虐的地方。我们看到,虽然长寿地区的饮食习惯各不相同,有的爱吃肉类,有的喜欢内脏,有的爱喝酸奶,有的喜欢豆腐,有的喝酒,但他们都有一些极为相似的生活理念和生活方式。而即便是在传统长寿地区,现代西方饮食方式也正在让人们远离健康长寿的道路。

  这本书娓娓道来,没有说教,只是将事实展现在人们的面前。但是,事实是检验真理的唯一标准,人们可以信服,其实天然的食物无所谓好坏,只要合理利用,都是促进健康长寿的营养来源。

  我这里也有一段和长寿之乡有关的文字,正好和家森教授的内容互相呼应。

  近日,网友shepherdess给我留言说:

  某作家出差**,打听著名长寿之乡和田地区的长寿之道。一个100多岁的维族老人用并不流利的汉语说:“早上一个馕,中午一个馕,晚上不吃馕。”他们只吃玉米面的馕,晚上为什么不吃?是因为没有。老人说,他们也想吃牛羊肉,可没有。另一位95岁老人,在50岁之前没得过什么病,只是近几年偶尔感冒。她早晨喝茶、吃馕,中午吃拌面、汤饭和馍馍,晚上吃半个馕。

  答案有点让人大跌眼镜。和田地区处于沙漠边缘,蔬菜种类不多,日常饮食是馕,配上糖分很高的瓜果和果干(葡萄干、杏干、桑葚、无花果之类),肉类应该只是偶尔食之。当地人的生活,怎么都感觉不那么“健康”:没看到绿叶菜,没看到蘑菇,更没看到鱼。提到的肉都是红肉,而大量吃的瓜果都是哈密瓜、葡萄这些高糖分的……

  “不理解啊不理解……真是疯了,这样的饮食难道不是该批判的吗?

  怎么还会长寿呢?”她问。我说:“不,这些老人的饮食方式比我们健康多了,只是我们没有意

  识到。”

  这些老人虽然得不到大量的蔬菜,但通过吃瓜果依然可以得到足够的抗氧化物质、维生素C和钾元素,在某种意义上弥补了不吃蔬菜的损失。桑葚、无花果都是营养价值非常高的水果。哈密瓜和西瓜中钾含量非常丰富,葡萄干里面还有较多的铁。这些水果都是新鲜天然产品,没有加糖,没有加脂肪,没有加香精,而且没有经过长途运输,比我们吃到的水果更为健康优质。

  这些老人吃不到高度加工食品,所有的食物都是天然状态。因为经济限制,他们吃不起过多的肉,用不起过多的油脂,蛋白质和脂肪从不过量,食品中各种污染物质都很少,再加上足够的运动,慢性病和癌症的风险自然很低。

  老人们的饮食都不过量,每餐定量,并不会暴饮暴食。这里所说用玉米面做的馕属于粗粮,普通的馕是小麦粉做成,其中的矿物质经过发酵之后便于吸收,而维生素含量也在发酵之后升高。他们用来做馍馍和馕的面粉不会像我们这么精,没加入过多的氧化剂,所以营养质量比我们的白馒头更好。长寿老人通常不抽烟,饮酒很少,没有任何不良嗜好。

  此外,和田地区的老人还能享受到充足的阳光,新鲜的空气;他们有愉悦平和的心情,还有终年不辍的辛勤劳作,从来不缺劳动。而光照、环境、劳动和开朗心情,都是保证健康的重要因素,和饮食同样重要。

  家森教授在书中所给出的10大长寿饮食原则,不仅有少吃盐、少吃脂肪含量高的食物、多吃蔬菜与水果、多吃新鲜鱼类与大豆制品等举世公认的健康准则,还有全家人一起热闹用餐的建议,实际上也包含了愉悦心情和良好家庭关系的因素。

  我相信,健康和长寿与每日饮食密不可分,而这绝不是不吃某种食物,或者大吃某种食物,就能达到的目标。条条大路通罗马,如何找到适合自己的,有特色、多样化的健康饮食,相信读者在阅读本书之后,会有更多的体会。而对那些妖魔化某些天然食物的说法,或者过分夸大某种食物健康效果的说法,会具有更多的抵抗力。

  范志红

  2011年4月于北京

第2节: 正确的饮食,健康的长寿

  健康与长寿是人类长期以来的梦想,1983~2008年间,我在世界卫生组织(WHO)的资助下,开始了有关健康长寿与饮食的调查。经过20多年坚持不懈的努力,我走遍了世界25个国家、61个长寿地区,终于弄明白“为什么有人能长寿,有人却短命”,导致这种差异的决定性因素就是——吃。

  不过,也有人说,现在是“基因时代”,要是本身不具备“长寿基因”,吃什么都没有用。我要告诉你,基因不可能决定一切。即使是生活在长寿之乡(在别人看来,携带“长寿基因”),如果不按照正确的方法来吃,一样不能长寿;而没有生活在长寿之乡(被看做不具备“长寿基因”),只要坚持正确的饮食,照样能活过百岁。所以说,饮食才是性命攸关的头等大事,有食物才有生命力,也自然能长寿。

  那么,每天应该吃什么,吃多少,怎么吃,才能长寿?为什么同样吃鱼,冲绳人平均寿命世界第一,而苏格兰人就吃出心脏病;同样是吃肉,法国人就能做到长寿,而有的人则早夭。掌握这项秘诀,你就拥有了长寿的超能力。

  现代人的平均寿命普遍提高,医疗技术也日益进步,但生活习惯病的阴影却屡屡挥之不去。肥胖、高血压、心脏病、脑梗死都让人不得不担心以后的日子。活得久更要活得健康,无病无灾的晚年生活,才是每个人的愿望。

  在这20多年的调查研究中,我亲自体会了世界各地的饮食差异。那么,有没有放之四海而皆准的饮食原则?当然有!它不外乎以下十点。

  其一,少吃盐。

  其二,少吃脂肪含量高的食物,特别是动物性脂肪含量高的食物。

  其三,多吃蔬菜与水果。

  其四,多吃乳制品。

  其五,多吃鱼类与大豆制品。

  其六,很多人一起、热闹地用餐。

  其七,食材均衡。

  其八,每天有一餐吃饱、吃好。

  其九,相信自己可以长寿。

  其十,对生活抱持乐观的态度。

  以上是研究长寿地区民众饮食生活所归纳出的健康十大条件。

  总之,能否长寿,决定权在每个人手上,就看你是否认真改进每天的饮食习惯、建立长寿的超能力!换言之,要想健康长寿绝不困难,只要适当调整每天的饮食,健康长寿确实是一个可以达到的目标。

第3节:长寿的人都在吃什么(1)

  **?贵阳——豆制品造就的长寿之乡

  以豆制品为主食

  位于**西南部的贵州省省会贵阳,长期以来一直是国际著名的“长寿之乡”。

  1987年我接受**同行的邀请,初次造访当地。我先乘飞机飞往**的南方城市广州,然后转机贵阳。飞机来到贵阳上空所看到的景象,至今仍令我印象深刻。

  那是个海拔1500米的高原,虽然群山被清澈的河川所围绕,整体风景却和**山水画所描绘的截然不同:一个个平缓的圆弧形山丘间杂着成形的喀斯特地貌,由上往下隐约可看出石灰岩特有的白色地层。

  这样含有大量石灰成分的土壤,显然并不适合种水稻。我立刻联想到,此地民众的主食可能不是稻米,而是其他食物。

  我试着请教当地人,当地人回答说:“以大豆与玉米为主是贵州饮食特色。”果然不出所料。

  受自然环境的制约,这里的农作物多以大豆为主,有些地方一日三餐皆以豆制品为主食,就像我们吃米饭一样。当地各种各样利用大豆做成的食品,令我大开眼界。

  一般日本人提到大豆,大概都会直接联想到豆腐。可当地人吃豆腐的方法,更可说是变化多端。有类似日本的油豆腐,有像是奶酪一样发酵制成的豆腐乳,甚至,有用特殊工艺制作出的非常硬的豆腐。

  在**,民众多半是双薪家庭,几乎所有人的早餐都在外边解决。所以,贵阳街头上,到处都能见上班族和学生拿着像油豆腐般的硬豆腐,像吃汉堡一样大口地吃着。

  看到此情此景,我不禁感慨,豆腐不愧是**发明的,从贵阳民众的饮食习惯中,就可见一斑。

  而更令我惊讶的是,长期以来日本人都认为是自己发明了纳豆,却不料,在贵阳我也看到当地民众在制作这种会拉丝的食物。

  豆制品富含大豆异黄酮,能预防心脏病

  在贵阳调查研究期间,我曾多次拜访近郊农家。

  当时正值晚餐时刻,该农户的饭桌上摆着炒花生、毛豆炒猪肉、纳豆炒豆芽菜以及豆腐丸子汤等几道菜,其中豆制品占有相当高的比例。

  我在当地民众的协助下,获得他们的尿液标本,仔细测定后发现,尿液中大豆异黄酮的含量是日本人平均值的1.5倍。

  之前在世界其他地方实施调查研究时,我也已经发现,尿液中大豆异黄酮含量越多的人,越不容易罹患心肌梗死等现代文明病。

  还有一个全球性的现象,就是女性罹患心肌梗死致死的病例,只有男性的三四成,原因是雌激素可畅通血流。因此,说心脏病有“性别歧视”一点也不夸大。

  然后我们调查世界60个地区女性停经后的身体状况变化,发现大约2/3,也就是40个地区的女性,进入更年期后血压与胆固醇值急速上升,剩下的20个地区则没有明显变化。这20个地区的共同特点是,居民日常生活中食用相当多的大豆。

  豆类多富含蛋白质,大豆的含量更是丰富。此外,大豆也含有大量大豆甙元(daidzein)与染料木甙(genistein)等异黄酮成分,是非常具有特色的食物。

  异黄酮的化学构造非常类似雌激素,同样能预防心脏病,减轻女性更年期不适。可想而知,这种营养素就是贵阳民众长寿的重要功臣。

  距首度造访十年后,1997年我再度来到贵阳。虽然当地民众的穿着有了很大改变,街上也多了熙来攘往的汽车,然而早上上班上学的时间,大人小孩一同嚼豆腐的场景,则没有任何改变。虽然社会现代化,所幸当地民众仍维持这种良好的饮食习惯。

  高加索地区?格鲁吉亚——吃肉也能长寿

  真有那么多长寿老人吗

  夹在黑海与里海中间的高加索地区,一直是全球著名的长寿圣地。其中,格鲁吉亚更是以拥有众多百岁人瑞而出名。

  1985年,世界卫生组织首次开展“循环系统疾病与饮食调养”国际共同研究,就把目标锁定在格鲁吉亚,他们无非是想用科学的手段来验证,当地“是否真有那么多长寿者”,以及“长寿的秘诀与原因”何在。我是这个团队的领导者。

第4节:长寿的人都在吃什么(2)

  在我们计划拜访高加索地区时,格鲁吉亚还是苏联的加盟共和国之一,因此即使仅是医学调查研究,我们也不是那么容易就能进入的。首先,我们得向莫斯科科学院提出申请,单单等候审查与相关交涉,就用了一年的时间。

  获得许可后,我们携带仪器设备前往莫斯科,正准备进行相关调查时,对方却说,还要取得位于基辅的老人病研究所的同意才行。于是我们只好前往该研究所拜访,说明调查内容,没想到对方还是不同意,他们表示:“要想进行医学研究的话,必须取得医学科学院的许可。”

  我们就这样被当做皮球踢来踢去,医学科学院针对我们研究调查的申请审核同样耗费时间,直到1986年,也就是在我们提出申请的第三年,才顺利成行,来到格鲁吉亚共和国的杰瓦村。

  吃肉多,胆固醇却不高

  杰瓦村位于高岗之上,三百六十度的视野一望无际,眺望远处,接近两千米的高山群围绕四周,景观之优美远远超出我们的想象。

  因为单单申请就费时三年,所以在我们踏上那片土地时,所有工作人员的内心都非常激动。当地人也颇为热情好客,我们甫一抵达,就受到当地居民热烈的欢迎,他们还以盛大的宴会款待我们。

  就像相邻的亚美尼亚共和国早就出现拉丁字母,格鲁吉亚的文明历史也比俄罗斯早得多。当地民众多半信奉希腊正教与基督教,过去他们长期受北方民族征服、蹂躏,格鲁吉亚人独立的心愿非常强烈,并对自己的文化颇为自豪。

  虽然我没有见到传闻中140岁的超级人瑞,却到处可见九十、一百岁左右的老人家。而且,这些老爷爷老奶奶并非躺在床上,个个都是身体健康,充满活力。

  我们所进行的长寿研究,主要内容是调查中老年人群罹患心脏病的风险程度。基本上,心脏病的发病率和长寿率成反比;也就是说,五十岁左右的民众罹患心脏病的比例越低,该国国民平均寿命就会越长,正所谓“人和血管同步老化”。我很好奇,这句话在格鲁吉亚是不是也适用?

  众所周知,心脏病致死的最大凶手是胆固醇。

  可是,我们针对格鲁吉亚五十出头的民众实施健康检查,结果却发现,当地居民日常肉类的摄取量是很大的,大约已经达到了日本人的两倍,但他们血液中的胆固醇值却不高。苏联相关医学统计资料也显示,格鲁吉亚地区民众的心脏病致死率在该联邦是最低的。

  这是什么原因呢?很幸运,我们很快就从格鲁吉亚民众招待我们的食物上,发现了长寿的秘诀。

  秘诀之一:不吃肥肉,多吃蔬菜

  当地民众吃牛羊肉的方法同样奇特。他们最有代表性的肉类料理“哈修拉玛(Haslama)”,就是一道将大量肉块放入汤中煮熟的丰盛大餐。煮熟以后,不要肥肉,只把蛋白质最丰富的瘦肉留下,蘸着果酱大口吃。

  不过,果酱并不是甜酱,而是梅子肉加上大蒜、韭菜与洋葱。

  另外,以独特香木取代竹签做成的烤羊肉串,同样是去除肥肉。加上香辛料调味后,香气四溢。搭配野菜一块入口,和日本吃串烧只蘸盐的做法明显不同。多吃肉原本就不利于健康,烤肉又蘸盐,更会提高人体对脂肪成分的吸收,容易造成动脉硬化与肥胖。

  然而格鲁吉亚人不吃肥肉,搭配食用大量具有抗氧化力的蔬菜,即便多吃肉,也可长寿。因为他们摄取的全是高质量的蛋白质。吃肉时,村民一定搭配食用大量的芹菜等青菜。不管男女老幼,格鲁吉亚人几乎每餐都能吃完满满一大盘的各色蔬菜。这些具有香味的蔬菜大多含有丰富的抗氧化营养素,是延缓格鲁吉亚人衰老的一大功臣。

  秘诀之二:吃葡萄不吐葡萄皮

  我们所造访的杰瓦村村民,普遍喜欢吃蔬菜与水果。研究证实,近年来在日本大受欢迎的梅干(西洋李的一种),原产地就是格鲁吉亚,它能畅通血管,被当地民众称为“生命的果实”。此外,当地盛产各种枣类与李子、杏子等,直接生食或做成水果干,都很营养美味。

第5节:长寿的人都在吃什么(3)

  我们抵达格鲁吉亚之际,正值葡萄收获的季节,因为年成好,大丰收,我们每个人都得到一大盘葡萄。

  大家聚在一起边吃边聊,逐渐地我发现一个奇怪现象,那就是我们这些日本客人的餐桌上出现一堆葡萄皮和葡萄子,当地人的桌面却保持得干干净净。

  原来,他们把葡萄皮与葡萄子全都嚼碎吃下肚。

  一开始我觉得不可思议,但仔细想想就明白,其实这才是最健康的吃法。葡萄皮含有大量食物纤维,葡萄子更含有大量可降低胆固醇值的不饱和脂肪酸与抗氧化营养素,这对于预防心脑血管疾病都是非常有利的。

  于是,我们学习当地民众,把葡萄皮与葡萄子都嚼碎吃了。虽然一开始觉得怪怪的,但其实也不是不能入口。

  秘诀之三:常喝葡萄酒

  格鲁吉亚人相信,要活得长寿必须多喝酒,所以当地人即使年老后也仍然好饮,白天晚上照喝不误。此地盛产葡萄,民众不仅连皮带子一起吃下肚,还大量酿造葡萄酒,家家都有祖传的巨大酒瓮,处处飘香。

  酿好的酒瓮埋入土中贮藏,主人特地为我们挖出其中一只,酒瓮直径竟然超过一米。宴会上,主人也搬出一瓮百年陈酿葡萄酒,用葫芦做的勺子从瓮中舀出大飨宾客。

  也有人自己酿造啤酒,它和日本啤酒相比,气味浓郁得多,一打开盖子就喷出二氧化碳气泡。倒入杯中,颜色并不透明,显然里面还留有啤酒酵母。

  宴会开始,主人递给我两只牛角酒杯,大的装满红葡萄酒,小的则装满伏特加。牛角尾端很尖,无法放在桌上,接过酒杯后别无选择,我只能一饮而尽。

  “干杯!”“干杯!”主人不断斟酒,大家也不断起哄着干杯;带头劝酒的,还是一位名叫“达马达”的最高龄长老。

  据说,当地曾有一晚盛宴,干杯达一千次的纪录。我是没有亲眼见过这样的场景,估计也有些夸张。不过当地人好喝酒,特别是葡萄酒,这倒是千真万确的。

  秘诀之四:儿孙满堂,热闹用餐

  格鲁吉亚人习惯一个大家族围在一起热热闹闹地吃饭。即使不是什么节庆活动的日子,也要亲戚故旧成群结伴,围着餐桌开心用餐。而餐桌上的主角,永远都是老爷爷与老奶奶们。

  当地还过着农耕畜牧型的生活,经验丰富的老人受到年轻一辈的敬重。此地常常可以见到七八十岁的老人仍带领孙子甚至曾孙一起放牧牛羊,或者到葡萄园里工作。他们每天生活忙碌,根本不晓得什么叫做“退休”。

  与此对比,日本情况完全相反,数十年来家庭的规模不断变小,许多老人被迫独居、独自用餐。这在日本已经变成社会问题,但在格鲁吉亚,绝不可能发生。

  人要活得健康长寿,吃什么当然重要,而且必须做得好吃,否则无法食指大动。只是,年纪大了,食量当然会稍微减少。

  格鲁吉亚人喜欢吆喝家人与朋友一同,边聊天边唱歌,优哉游哉地享用美酒与食物。百闻不如一见,我亲眼目睹后终于感受到,想长寿健康,热闹用餐是非常重要的。

  老人的智慧受到尊敬,在大家族里生活,即使活到一大把年纪,仍备受社会与家族重视,因此老人特别有自信。我想,这也是格鲁吉亚人长寿的关键秘诀之一。

  秘诀之五:早餐一定有酸奶

  待在格鲁吉亚的杰瓦村期间,我们几个队员先后吃坏肚子,其中一人还出现脱水症状,差点丧命。原因虽然不明,但我想可能是卫生方面的问题。

  杰瓦村属于畜牧区,像古代日本农家一样,牛羊畜舍与住家一体,房屋内外整天都有苍蝇飞舞,饭菜上桌,当然也吸引很多苍蝇聚集。

  但为什么当地民众没有因此拉肚子?而且还能很长寿呢?后来我才发现,秘诀在于他们早餐几乎都要喝自制的酸奶。

  日本传统家庭常年备有所谓“妈妈味道”的米糠酱菜,格鲁吉亚人则代代相传制作酸奶,家家户户都自豪地说:“我家的酸奶最好吃。”

  虽说都是酸奶,每个家庭的味道却有所不同。研究调查期间,我拜访几个家庭,吃过的酸奶什么味道都有,有的酸,有的不酸,有的清爽,有的黏稠,有的做成固态,必须用汤匙才能吃,有的却很稀,能像饮料一样地喝。

第6节:长寿的人都在吃什么(4)

  为了进一步研究,我向居民要了一些酸奶带回日本,进行营养分析。一路上我并没有将它们冷冻,只是放在冷藏库保存,几天以后,我取出来小心翼翼尝了一口,发现味道和在当地吃的一模一样。

  我委托京都巴斯德研究所(Institute Pasteur)的细菌专家分析,发现了很不可思议的事情:该酸奶含有乳酸菌等三种菌,却没有容易造成腐败的大肠菌存在。此外,这种酸奶被证实可提高体内干扰素(Interferon,一种抗癌物质)的活性。

  喜好牛乳的菌不在少数,乳酸菌多的话就会发酵;大肠菌多则会腐败。专家们初步研判,这些酸奶之所以不易腐败,大概是因为乳酸菌等两三种菌大量增加,不让其他杂菌有生存空间。

  听到这样的分析结果,我直觉猜测,酸奶一定含有某种天然抗生物质,然而分析检查却无所获。

  从此,酸奶成为我家早餐的必备食物。后来,从其他的医学研究中得知,每天喝酸奶确实可以提高人体的免疫力。

  调查花絮:切尔诺贝利核泄漏带来的食品安全担忧

  当我们调查工作大致完成、准备收拾行囊返回日本时,却遭遇到一个麻烦。为了后续研究,我们收集格鲁吉亚杰瓦村村民的各种食物,总计约150千克,准备带回日本当做研究样本。这些食材先行送到莫斯科机场存放。

  不料,机场以超重为由,要求我们必须先支付1万美元。当时1美元约等于280日元,任务完成就要回国的当下,我们手边当然没有这么多钱。

  办理出国手续的机场人员威胁我们:“不付钱,你们可能会以申报不实的理由被叫去详细盘问呢。”争执不下的结果,只好看着预定搭乘的飞机凌空而去。

  无计可施之下,我们试着联络日本大使馆,使馆工作人员的态度却很冷漠,只淡淡说:“想避免问题闹僵,唯一的方法是丢掉那些研究样本。”

  好不容易交涉三年才来到格鲁吉亚,做完调查却无法带回样本,研究等于是半途而废。所幸,来机场送行的莫斯科专家想了一个两全其美的办法,他建议我们暂时将样本交由他来保管,合适的时候再取回。

  觉得可行,我们便依记行事,隔天顺利坐飞机回到日本。过一阵子,那位专家接受某学会邀请到日本来访,就顺便将研究样本给带了过来。

  为何莫斯科机场规定如此严格?

  原来,我们在1986年7月拜访格鲁吉亚,距离乌克兰切尔诺贝利核泄漏事件,不过才三个月的时间。

  格鲁吉亚一向是苏联的重要谷仓之一,盛产各种蔬菜、水果。虽然我们是为了长寿研究而搜集食物样本,苏联方面却担心,如果日本学者化验可能遭受核辐射污染的食物并且发表,将对苏联国家食物安全造成巨大冲击。

  厄瓜多尔?比尔卡班巴——管住嘴,迈开腿

  位于赤道附近的南美小镇比尔卡班巴,是与高加索地区齐名的世界著名长寿之乡。我从很早之前就对这个位于安第斯山脉的小地方感兴趣,很想了解当地人长寿的秘诀。很凑巧地,1986年,厄瓜多尔政府通过世界卫生组织请求日本政府协助,希望查明该国城市居民罹患心肌梗死疾病人数越来越多的原因。政府向我征询意愿,我二话不说,立刻答应整装前往当地进行健康调查。

  我们一行人首先抵达厄瓜多尔的首都基多,然后搭飞机前往南方城市洛哈,由此再开车三小时,终于抵达比尔卡班巴。

  比尔卡班巴虽然也属于山区,但它海拔只有1500米,和位处2800米高原的基多相比,已经算是“低地”了,所以这里的空气并不稀薄,我们全都呼吸顺畅,完全不必担心遭受高山反应的侵袭。

  由于地处赤道附近,比尔卡班巴一整年的气候都很稳定,气温维持在18℃~24℃之间,早晚温差非常小,直觉上,此地应该很适合生活。

  我站在高处眺望四周,能看到的大都是光秃秃的山坡,其间只有一处名叫“神圣之谷”的盆地,不可思议地绿意盎然。盆地里一整年盛产各式各样的蔬菜水果,和高加索地区完全一样。

第7节:长寿的人都在吃什么(5)

  在我们住宿的旅馆里,每天早上都能喝到现榨的蔬果汁,餐后点心则有淋了黑蜜的无花果等堆满盘子的各种水果可以享用。走进市场,放眼望去尽是多到架子摆不下的各色新鲜蔬果,把狭窄的市场变得更拥挤了。

  管住嘴——少吃肉,多吃素

  比尔卡班巴民众的主食是玉米与一种名为“尤卡”的芋头。玉米的产地原本就是安第斯山脉,因此也是南美洲民众自古以来的主要食物。

  玉米与尤卡都富含食物纤维与钾等营养元素。

  安第斯山一带也盛产小米和稗子等野生谷类,其中最令我感兴趣的,就是名叫“丘丘斯(chochos)”的豆子。我们将它带回日本进行成分分析,才知道这种豆子的蛋白质与钙质含量非常丰富。

  在我们之后离开厄瓜多尔转往秘鲁进行调查时也发现,秘鲁民众和厄瓜多尔人一样,食用大量小米与稗子,这也就难怪,他们虽然住在海拔4000米的高原上,不仅血压正常,也很少罹患脑卒中等疾病。

  比尔卡班巴民众还有一项日常食物,那就是被称为“葛索”的奶酪,做法与豆腐非常类似。

  将牛的十二指肠在水中泡一会儿,就会形成看似胆汁颜色、有点绿的萃取物,等这种萃取物凝结成块,放入牛奶后保温,即可发酵。该萃取物含有可让蛋白质凝固的酶,一小时之后即可做成葛索。

  每个家庭几乎都有自己手工制作的葛索,可以用来做汤,每天食用。不仅如此,炒菜时还可当做调味料,甚至当成色拉酱使用。在我看来,虽然是奶酪,用法却和日本的味噌差不多。

  在比尔卡班巴地区,家畜是珍贵的食物,人们很难每天都吃肉。不过,可能是信仰天主教的缘故,每逢周末,村落就会有人宰杀牛或猪、羊,与全体村民一起分享。

  当地民众另有一种取代家畜的重要蛋白质来源,那就是名叫“克耶”、类似天竺鼠的老鼠,家家户户都会在厨房养几只,就像养宠物一般。

  每当有客人来访或是逢年过节等喜庆日子举行宴会,便会到厨房抓克耶现场宰杀。做法是先将一整只克耶丢进沸水中烫过,拔完毛后,再烧烤或油炸。

  克耶的内脏与脑髓似乎很可口,大家吃得津津有味。天主教修女大啃老鼠头的样子令人惊骇,但我不得不承认,如此残酷的吃法最为健康。事实上,肝脏、肾脏与心脏等内脏器官,都含有大量可降低血压与胆固醇值的牛磺酸。

  只是,虽然当地民众大快朵颐,但毕竟是如假包换的鼠类,我们这些日本访客当然敬谢不敏,半点食欲也没有。

  迈开腿——运动永远都错不了

  我们为比尔卡班巴民众进行体检的地点,位于日本人所建的“可基奇欧塔尼医院”。

  当地民众穷困,没有交通代步工具,居民前来医院接受健康检查,得走两三小时的山路,但我却发现每个人都脸不红、气不喘,脚力相当惊人。

  我不禁好奇,已经上了年纪的他们,为何健步如飞,可以轻轻松松走这么远的山路?我问了几个村民,他们回答说,因为主食尤卡不易保存,必须每天早上去挖这种食物回来煮,对此已经习惯了。我测量了80名50~54岁当地居民的血压,发现只有2人罹患高血压。如果在日本,这个年纪的人恐怕至少一两成都有高血压。除此之外,比尔卡班巴民众血液中的胆固醇值平均只有4.40mmol/L。

  为了进一步了解当地人的身体状况,我让一些居民二十四小时佩带心跳计,结果发现,即使是上了年纪的人,心脏功能依然强健稳定,就算使用跑步机型体力测定器与健身脚踏车让他们运动一会儿,心跳速度仍然维持平稳,并未急速上升。

  由此推定,食用玉米、尤卡、小米与稗子等食物,日常大量活动身体,又住在四季如春的环境里,这都是居民很少罹患高血压且心脏功能稳定的主因。

  比尔卡班巴地区海拔1500米,只有0.8个标准大气压。适度的低气压,让居民从水果中大量摄取的钾更能发挥作用,促进血管扩张,因此较不易罹患高血压。

第8节:长寿的人都在吃什么(6)

  反之,在首都基多实施健康检查,150人之中高血压患者却多达16人。“和过传统饮食生活的比尔卡班巴民众相比,首都民众饮食普遍欧化,似乎正是这一点导致高血压变得严重。”我向厄瓜多尔政府卫生医疗主管官员说明调查结果,对方闻言似乎相当惊讶。官员表示,原本以为生活富裕可以更健康,没想到刚好相反。

  长寿饮食文化急需抢救

  2000年,我再度造访南美洲厄瓜多尔的长寿乡比尔卡班巴地区进行医疗调查,距离第一次访问已经过了14年,当地有了非常大的改变,令我相当惊讶。

  从洛哈前往比尔卡班巴的崎岖道路已经铺上柏油,变得美轮美奂。原来,当地住进许多美国人,皆是听到“只要住到比尔卡班巴,就不会罹患心脏病”“据说此地能令人长寿”等传闻而大举迁入。许多人在此兴建别墅与长期居住的旅馆,然而,追求“长生不老”的美国人大量流入,却让原本的世外桃源大受破坏。

  虽然仰慕当地人而来到此地,美国人却没有放弃自己原有的生活习惯与饮食;非但没有学习当地人的做法,反而把自己的不良饮食习惯带进来,污染、摧毁了比尔卡班巴民众的饮食特色与质量。

  首先,主食尤卡开始大量生产,市场上到处都买得到,村民再也不必每天清晨下田去挖。然后,为了做富裕美国人的生意,人们经营各种商店,坐着不动,运动量急剧降低。肉食量也明显攀升。十四年前,村民每周杀猪一次(4只),全体分享;现在变成每周四次,肉类摄取量倍增。再者,把猪油加在面包这个新主食里全部吃掉,又导致油脂摄取过多;就连做菜添加的盐分也大量增加了。

  调查他们的肥胖度发现,BMI(用体重千克数除以身高米数平方)平均值已经达到26~28。超过25就算过重、肥胖,可见村民不分男女,已经变成每两人就有一人过胖。

  1986年,比尔卡班巴男性血液里的胆固醇值平均只有4.40mmol/L左右,现在却变成5.56mmol/L。胆固醇值越高的人越容易罹患心脏病,就医学角度而言,胆固醇值提高近三成,心肌梗死发生率恐将跳升三倍。从居民平均寿命推估,十四年来当地民众大概缩短了十年寿命。

  事实证明,世界上不可能有一住过去就长寿的地方。想长寿,最根本的重点是,保持祖祖辈辈流传下来的良好饮食习惯。

  坦桑尼亚?汉德尼——与高血压无缘的马塞族人

  饮食习惯改变,非洲不再是无高血压的净土

  20世纪初,许多欧洲医学研究者宣称“非洲大陆没有任何人罹患高血压”,为了验证这项行之多年的“定论”,1986年我首度踏上非洲土地。

  调查研究工作一波三折。首先是,我们人已经到了坦桑尼亚首都三兰港,器材却迟迟不来。原因是,为了节省经费,我们将健康检查所需的采尿器、注射器与跑步机型体力测定器等器材委托船运,但船被耽搁了。

  久等不耐,我们打电话回日本询问船舶公司,他们调查后发现是波斯湾出现水雷,船只无法通过,因此目前还停留在迪拜。

  当时没有计算机与网络,为了确认这件事,船舶公司花了不少时间。知道结果后,我们只好把那些必须用到的器材用飞机从日本送来。本来是为了节省经费,现在花了时间还得多花钱,早知如此,当初干脆直接委托空运就好了。

  三兰港和我们在日本所想象的完全不同,根本不像非洲。可能是首都的缘故,这个都市相当现代化,居民的生活习惯病发病率甚至不输发达国家。

  检测血液,结果发现,有高血压问题的民众相当多,在100名50~54岁男女之中,高血压患者竟高达40%,几乎比全球平均值(约20%)多一倍。放眼望去,民众之中有很多胖子,尿液检查同样发现,许多人疑似罹患糖尿病。可见,所谓“非洲大陆没有任何人罹患高血压”的说法目前已经不适用了。

  马塞族人没有得高血压的

  我们的下一个目标,是距离三兰港陆路约三百公里的内陆农耕地带汉德尼。

第9节:长寿的人都在吃什么(7)

  虽然是柏油路,但柏油是直接铺在泥土上,途中到处都是坑坑洼洼的洞以及翻倒的卡车残骸。一路上颠簸震荡,我们耗费了一整天才辛苦抵达。

  和三兰港相比,汉德尼胖子很少,罹患高血压的比例只有9%,相当低。我深入了解他们的饮食习惯,得知其主食为混合小麦与玉米粉做成的“鸟卡里”。不管是玉米还是小麦,都是将壳碾碎一同吃下去,因此可摄取大量食物纤维与钾。

  除此之外,当地居民经常食用原产中南美洲的木薯,以及名为“基德尼比滋”、形状像肾脏的芸豆。这两种食物都含有可预防高血压的重要营养成分。

  在汉德尼实施健康检查期间,有两位年轻人一直充满好奇地注意我们工作。这两人是短暂离开自己故乡、四处云游进行“武者修行”的马塞族人。

  我们原本没有为马塞族人进行健康检查的计划,之所以有如此机缘,只能说是偶然。马塞族人大多居住在乞力马扎罗山山麓,在非洲大草原进行游牧生活。

  这个民族有一项习俗,男性到了一定年龄,必须两人一组离开村落一两年,周游各地闯荡“外面的世界”。这一只手拿着长矛、几乎每天都来我们这窥探的两位年轻人,显然也是这种身份。

  年轻人一再露出不可思议但又很想了解的眼神,我跟他们打招呼:“要不要进来看看?也可以帮你们量血压。”于是两人便接受检测。自动血压计一量,都在正常值内,可见两人健康状况非常好。

  他们似乎对于知道自己身体健康很高兴,几天后又上门,提议说:“家森医师,您是否能到我的家乡为村民检查身体?”当然,我立刻答应。

  为马塞族人实施健康检查,最令我惊讶的是血压。即使是五十几岁的居民,几乎都血压正常,没有任何高血压患者。一时不敢相信,我甚至怀疑从日本带来的血压计是不是出故障了。

  这令人惊讶的检查结果,让我产生强烈的研究兴趣,为了得到更详细的健康资料,我主动提议帮村民验血,但马塞族人相信“血代表灵魂”,说什么也不肯挽起袖子,我费尽唇舌才说服他们,完成采血工作。

  从验血结果发现,不只是血压,他们的胆固醇值也很低。这代表他们不会有动脉硬化的问题。但为什么所有村民都如此健康?为了得到答案,1989年我再度造访马塞族村落,实施更正式的调查。

  我对此行充满期待,相信会得到非常不错的研究成果,不料天有不测风云,刚到坦桑尼亚,就遭遇挫折。

  事情是这样的,在我们隔天就要进入村落的时候,上次为我们做现场口译的翻译却突然说:“很抱歉,这次没办法帮你们翻译。”原因是上次健康检查所采集的血液样本被带回日本,马塞族人为此“怒不可遏”。他担心,这次造访当地,可能会遭到报复。

  确实,此次前来,还是为了找寻马塞族人健康长寿的原因,可能还要抽血。但若临时喊停,到目前为止为研究计划所投入的一千万日元经费就会打水漂。当然,这是我最不愿见到的结果。

  面对强壮、勇健的马塞族人,我相信日本人也必须拿出武士精神,才能和他们平起平坐。为了以防万一,调查团成员都投保七千五百万的高额保险,才起程飞往非洲那片一望无际的游牧地。

  不仅是马塞族,非洲传统村落的村长都拥有极大权力。为了说服对方,我很有诚意地携带大量资料,包括之前在全世界37个地区调查完成的血压资料,以及二十四小时尿液检测所取得的食盐摄取量资料,和村长展开“高峰对话”。

  一开口,我丢出准备好的那句话:“马塞族是全世界最棒一句话,却感觉必须很久才能传到对方耳里。

  我紧张地看着村长,突然对方粲然一笑,说道:“原来健康检查这么有用。好,我请全体村民帮你吧。”

  他的回答让我大感意外。照村长的意思,我得帮他们村所有人,不论男女老少都做检查。这虽然超出研究目的,但我仍然答应了。就连幼儿都用压迫带包住大腿,顺利取得血压数据。对于初次体检的马塞族人来说,似乎是非常高兴。

第10节:长寿的人都在吃什么(8)

  让我特别感兴趣的是,用跑步机进行体力测定,增加运动负荷之后再调查当事人的心脏功能变化。马塞族人习惯驰骋于沙漠与草原,终日奔走不以为苦,我想他们踩几下跑步机心跳应该不会加快,不料每个人的数字都跳升得非常厉害,仔细了解才发现,原来是大家从没碰过跑步机这种机器,因此感到紧张,心跳加速。

  经过一番折腾,终于完成马塞族人的第二次健康检查,结果同样优异,当地五十多岁的村民里没有一位高血压患者。

  每天喝2~3升酸奶

  为什么马塞族人很少罹患高血压?经过一番调查,我找到了个中原因,那就是他们的传统饮食完全不使用盐。

  少盐的饮食的确是健康的一大保证,但完全不吃盐,身体也是受不了的,因为那会导致钠摄取不足。马塞族人是怎么做到既不吃盐,又不缺钠的呢?

  那就是,当地人不论男女老幼,每天平均喝2~3升的酸奶。酸奶的原料牛奶原本就是优质蛋白质,含有适量的盐,所以即使他们吃的其他食物完全不用食盐调味,那么单靠喝酸奶,每天也是可以摄取约2.5克的钠。

  再者,不加盐调味的食物本身,其实也是多多少少会含一些盐的,合计起来,一天大约有3克钠摄入人体,再加上前面说的酸奶,就已经够一日所需了。这样的食盐摄取量相当适合人体,因此不易罹患高血压。

  牛奶也含有丰富的钾、钙、镁等矿物质。只不过,牛奶也有欠缺的营养素,那么,这该怎么办呢?

  好比说食物纤维。为了改善这个问题,当地人把玉米粉混入酸奶一起吃。这种食物被称为“马滋伊哇”,感觉有点像燕麦片,口感非常好。

  也有一些马塞族人用锐利的剑去刺牛头,把流出来的血混入酸奶里饮用。

  红细胞含有可运送氧气的血红蛋白,以及大量铁质;牛的血液也含有维生素C。虽然我不认为马塞族人的祖先具备这类营养学知识,刻意将牛血混入发酵乳饮用,但不可否认的是,这种吃法让马塞族人更加健康。

  一天只吃一顿饭

  马塞族人一天只吃一次正餐。

  他们每天早上四点左右起床,女性先将牛奶挤入葫芦,男性提着这些新鲜的牛奶当早餐,外出到草原放牧。

  午后三时左右,男性回到家,直到接近黄昏才用餐。

  一般来说,日本人是很难只靠一顿饭来获取一整天所需要的热量的,这样做容易带给负责糖分代谢的胰脏过大负担,因而罹患2型糖尿病。

  然而,马塞族人的整体热量摄取远低于发达国家,所以一天只需要吃一顿正餐。热量低的食物如果分几次食用,会立刻变成热能散掉,很难有饱足感;反之,一次性地多吃一些,反倒是能将热能蓄积体内,提供足够的热量供身体消耗。

  坦桑尼亚首都三兰港的民众同样是一天只吃一顿饭。只不过,近来首都民众改吃类似欧美的高脂肪、高热量食物,肥胖者越来越多,十年内几乎增加一倍。

  所以,未必传统的饮食习惯就是好,还得看吃什么、怎么吃。此外,若生活形态改变,原本有益的食物也可能有害健康。

  前面我说过,酸奶是马塞族人的主食,也是健康的关键。可能有些人又糊涂了,牛奶本身的胆固醇含量很高才是,为什么当地民众一天喝超过三升,血液里的胆固醇值却不高,也不易罹患动脉硬化?

  原来,他们将牛奶装入名为“基布优”的葫芦,就会自然发酵成为酸奶。我向当地民众要了几个基布优作为样本,带回日本化验,发现马塞族人吃的酸奶是以植物乳酸菌发酵做成的。

  马塞族人养牛采取自然放牧,让牛在大草原上自由地吃草,可想而知,牛奶中含有大量植物纤维的成分。但令人惊讶的是,最近因高度抗氧化作用受到注目的新宠儿——多酚,竟也大量地蕴藏在其中。

  所以我推测,即使牛奶本身含有大量的胆固醇,但马塞族人不吃盐,这些脂肪极少能在肠道被人体吸收,并且因为多酚发挥了抗氧化作用,动脉不至于硬化。

第11节:长寿的人都在吃什么(9)

  **?广州——少吃盐,少得高血压

  自古以来,**人就有“食在广州”的谚语。一千年来,位处珠江三角洲的广州一直是**南部的谷仓,以及对外贸易的重要港口。其纬度几乎与**相同,气候温暖,物产丰富,到处可见肥沃的土壤。

  1985年我初次前往广州调查研究,发现市场上能买到各种各样的山珍海味。位处亚热带的广州,市场里有许多日本罕见的热带水果,物美价廉。茄子与栉瓜等蔬菜,都在近郊农田当日采收,鲜绿清脆。海鲜水产的种类也数不胜数,鳗鱼与青蛙等甚至可现买现杀。

  找不到一例高血压患者

  我们在距离广州市约五十千米的农村谢村实施健康检查。相对于广州都市高楼大厦林立,谢村却是非常类似日本农村的田园地带。走进村落,乡间民众个个都戴着大斗笠,农夫赶着水牛正在耕田种稻。

  我们通知当地民众要实施健康检查,农民们直接赤着脚从田中走来,令我想起战前日本的农村情景。不过,让我印象最深刻的是,每个农民都很瘦,几乎找不到胖子。

  首先检查血压。我们主要针对50~54岁的民众,原本以为“应该会有1/5左右的人患有高血压”,结果发现全部正常,令我惊讶不已。

  按理说亚洲人吃饭口味重,放盐放得多,高血压的情况应该比欧美民众还明显,广州乡下的农民却没有任何人罹患高血压,真是令我大开眼界。

  我搜集民众的二十四小时尿液样本,调查他们一天盐分摄取量,换算成食盐后,等于每人每天平均摄取5.7克,稍微低于世界卫生组织所建议的健康摄取量,也就是一日6克。

  吃“苦”得健康

  我在谢村也看到,民众大都是三代同堂的大家族,这在日本已经是很罕见的现象。

  农家除了大片田地,通常还会有一小片自家用的菜园,种些芋头、枸杞与茄子等日常食用的蔬菜。他们煮饭仍用大锅、大灶,午餐饭菜皆由媳妇负责。

  他们利用自家菜园刚采下来的枸杞叶做药膳汤,以花生油炒猪肉,把类似鲤鱼的巨大草鱼蒸熟而食。他们蒸鱼的方法很特别,煮饭时直接在饭锅内放蒸盘,饭煮好,鱼也熟了。

  晚餐由爷爷奶奶负责。除了把午餐吃剩的草鱼重新炸过、淋上梅肉与姜做成的酱汁外,还有青菜肉丸汤、鸡肉炒黄韭菜与豆芽、香菇蒸鱼丸等,非常丰盛,堪称色香味俱全。

  广州人擅长使用辛香料与药草等调味,所以,盐不必放多。我们到访时刚进入春季,正好盛产虫蛆,餐桌上堆满一大盘。在虫蛆之中,水稻虫被视为最好美味,食感和口味与蝗虫类似。

  昆虫体力充沛,营养素非常丰富,含有大量的钾、钙与镁,都可降低血压。不仅如此,昆虫的优质蛋白质非常有益健康,属于优良食物。

  昆虫吃起来都有点苦,就像可预防心脏病的红葡萄酒拥有独特涩味。或许,苦涩口感代表食物含有可促进健康的成分。广州人的晚餐通常呼朋引伴,和亲戚一起享用,热闹非凡。农民喜欢十几个人围坐大圆桌,饭菜一大盘一大盘地端上来,然后每人夹取放到自己的碗中。就吃**菜而言,这堪称是标准场面。

  负责煮饭的老爷爷告诉我们:“大量使用鱼和蔬菜的各式菜色,跟大家一起快乐地享用,是最健康的。”

  广州有块名为“天医书”的石碑,内容强调“无药可治的病也可靠正确饮食自然治愈”,为人们指出健康之道。

  正如该石碑所述,广州盛产蔬菜、水果、鱼与昆虫等丰富资源,正因为如此,广州人相信,只要巧妙地利用食材就可健康长寿。这是非常重要的生活智慧。

  吃盐越来越多,高血压发病率随之上升

  **经济近年来快速发展,我们不禁怀疑,民众的健康是否会受到影响。

  相隔四年之后,1989年,我们再度造访广州近郊的谢村。虽然只差四年,却发现谢村附近出现一座巨大的跨河大桥,村内道路也已铺上柏油,所以,此行我们并非从广州坐船进入,而是开车直达。

第12节:长寿的人都在吃什么(10)

  原本很像战前日本农村的谢村,这次却发现田间出现巨大的工厂。原来,香港企业前来投资,利用低价劳动力生产家电。当然,工人全是当地人,四年前来接受健康检查几乎都打赤脚的农民,这回穿起皮鞋,打扮变化不少。

  见了村长后,我更是大吃一惊。他给我的名片上密密麻麻地列举了该村所生产的家电产品名称。显然,他同时也是该家电工厂的营销业务员。

  健康检查结果也同样令人惊讶,1985年时没有任何村民罹患高血压,但这回包含列入临界高血压的民众在内,13%的男性与18%的女性村民血压升高了。

  接着调查二十四小时尿液样本,由此便可看出饮食生活剧烈变化的结果。比如,原本每日平均摄取5.7克的理想食盐量,这次急增到8.3克。虽然和日本人相比仍属偏低,但过去不太吃盐的人突然增加食盐摄取量,就容易造成血压跳升。

  反之,从蔬菜水果摄取的钾与镁,则大幅减少。

  因为到工厂上班,村民午餐的地点从家里改成工厂,但大多是面包、馒头之类或事先做好的加工品,其中的防腐剂含有大量盐分,大幅提高民众的盐分摄取量。

  近来,**孩童肥胖的问题越来越多,尤其在经济发达的火车头上海,问题更是严重。最近中日专家学者共同调查,发现**肥胖儿童的数量多了日本近一倍。可能是多年计划生育政策下,家长过分宠爱孩子,让孩子任意吃了太多甜食与垃圾食物所致。

  这样下去,**人的健康将大受威胁,国家未来的发展也堪忧了。

  法国?奥尔良——葡萄酒促成的长寿之国

  又是一个吃肉也能长寿的国家

  法国人喜欢享受含有大量脂肪的美食,但却很少罹患心肌梗死等疾病,这是在医学界长期以来备受重视的“法国悖论(FrenchParadox)”。当然,这个谜至今也没有完全解开,但根据雷诺博士等人的研究资料,应该和红葡萄酒有关系。

  任职于法国国立健康医学研究所的塞吉?雷诺(Serge Renaud)博士,经过长达15年的追踪调查,在1998年发表了一份让世人震惊的调查报告,那就是为什么法国人吃大量的高脂肪食物,心肌梗死致死率却是欧洲最低的,这其中的关键就在于,法国人大量饮用红葡萄酒。

  葡萄酒含有大量多酚,多酚是植物所含的天然物质,具有抗氧化作用,进入人体内,可防范坏胆固醇(低密度脂蛋白胆固醇)被活性氧自由基所氧化。一般而言,胆固醇氧化会遭受免疫系统中的巨噬细胞攻击而死亡,尸体大量堆积在血管壁,进而造成血流堵塞与动脉硬化。反之,摄取含多酚的食物,可避免体内胆固醇氧化,因此比较不会发生动脉硬化。

  雷诺博士的论文还指出,多酚和酒精在一起会较为稳定,更容易被人体吸收,这就是葡萄酒有益健康的原因所在。

  除了红葡萄酒之外,法国人也好饮同样含有大量多酚的白兰地。

  白兰地通常是放在橡木桶里待其成熟,雷诺博士研究发现,年份越久的陈酿白兰地,对身体健康越有益。原因何在?

  原来,橡木本身也含有多酚,被用来装白兰地放置一段时间后,木材本身的多酚融入酒精,让白兰地也含有大量多酚,因此和红葡萄酒一样有益健康。这是雷诺博士的看法。

  不过,近年来酒庄酿造葡萄酒,渐渐不用橡木桶保存,这样做的结果是红葡萄酒仍旧能避免动脉硬化,预防心脑血管疾病,而白兰地的预防效果就差了许多。原因是红葡萄皮本身就含有大量多酚,但白兰地就不会有这样的效果了。

  不止多酚,红葡萄酒也含有类似植物雌激素的物质,这种物质被发现具有防止血栓、抑制发炎的作用,其化学构造非常类似雌激素等女性激素,历来备受医学界重现。

  此外,波尔多地区所产的红葡萄酒,铜含量非常高。这主要是因为制酒人员在菌类筛选上的考虑,必须以添加硫酸铜的波尔多液作为消毒液,这对健康也颇有帮助。

  当然,并非铜这种元素对身体健康有益,而是其进入体内可产生一种酶,防范坏胆固醇氧化。

第13节:长寿的人都在吃什么(11)

  葡萄酒能避免动脉硬化,降低罹患心脏病风险。因此适度饮用红葡萄酒对身体有益,这已经是全球性的健康共识。雷诺博士认为,每天喝2~3杯红葡萄酒是最适宜的。

  当然,即使红葡萄酒对身体有益,也不可过度饮用。虽然大量饮用葡萄酒能增加多酚的摄取量,但红葡萄酒毕竟还是酒,喝太多同样会对肝脏造成负担。

  来吃动物内脏吧

  为了彻底解开“法国悖论”之谜,1991年,我们的研究团队来到了与法国传奇人物圣女贞德颇有渊源的奥尔良小镇。

  在奥尔良实施健康检查、企图解开法国悖论之谜的我们,多亏当地一位女性保健师的协助,才得以顺利完成调查。这位女性保健师穿着鲜红的合身骑马服,就像画像中的圣女贞德一般。

  我们分别为五十岁出头的男女镇民各100人实施尿液与血液检查。他们的二十四小时尿液样本化验结果显示,法国人体内所含的牛磺酸不输给日本人,甚至有过之而无不及,这就让我们非常惊讶了。

  牛磺酸是氨基酸的一种,存在于人体脏器等组织。牛磺酸含量较多的食物是乌贼、章鱼与柴鱼等鱼贝类。这种氨基酸可促进肝脏功能、减轻疲劳、降低胆固醇值与血压,尿液中牛磺酸量越多的人,越不容易罹患心肌梗死。

  日本人临海而居,饮食中鱼虾等海产品占的比例大,体内当然存在较多的牛磺酸。我没想到地处内陆的奥尔良民众也能摄取那么多的牛磺酸,一点也不输给日本人。照理说,他们没有机会大量地吃鱼贝类食物。

  深入访谈调查后,我发现一个有趣的现象。

  奥尔良民众喜好肉类食物,他们不只是吃里脊肉与五花肉,就连肝、肾与心等内脏,他们也全都入口。奥尔良那边最著名的家庭大餐“牛肉蔬菜锅”,就是用内脏来熬汤。

  通过动物内脏摄取大量的牛磺酸是法国人很少罹患心脑血管疾病的又一个重要原因。

  喝矿泉水,预防心脏病

  法国人心脏病患较少的原因还有一个,那就是常喝矿泉水。法国人自古以来就有这种习惯,偏好矿泉水而不喝自来水。毫无疑问,常喝矿泉水对健康有帮助。

  早年间,我曾在以色列进行健康调查,发现当地民众心肌梗死的病例非常少。答案就在于以色列这片由石灰岩构成的雪白土壤。

  对以色列人来说,水相当珍贵,主要水源来自加利利湖,这里的储水经由配送系统运送至全国。因与石灰岩接触,加利利湖的湖水含有非常多的镁与钙等矿物质,实验证明,就是这样的水质让以色列人不易罹患心肌梗死。

  法国人喜欢喝的深山涌出的矿泉水,同样也富含土壤中的镁与钙等元素。研究证实,尿液里这类矿物成分含量越高的人,血压就越低。原因是,镁与钙可促进盐分排出体外。

  所以,法国人虽然吃肉多,脂肪摄取量大,但依然不易罹患心肌梗死等心脏病的原因,不仅是好喝红葡萄酒,吃动物内脏、饮用矿泉水也都是关键所在。

  南欧——地中海式长寿

  这样吃,不得心脏病

  欧洲人有个普遍共识,就是常吃地中海食物,比较不容易得心肌梗死。可到底是为什么,一直没有科学的解释。为了探明真相,我和我的科研团队分别在意大利与西班牙各两处、葡萄牙与希腊各一处,实施调查研究。

  首先,我们发现,以上六个地区的民众都非常好吃鱼,且种类繁多。除了一般鱼类,欧洲民众最喜欢吃被当地称为“恶魔鱼”的乌贼与章鱼,或烤或烫,甚至用橄榄油或醋腌渍,都吃得津津有味。

  比如,西班牙人喜欢吃的西班牙海鲜饭(paella)与西班牙冷汤(gazpacho)都放入各种鱼类。当地生产的鳀鱼与鲤鱼可生吃也可用醋腌渍,其他鱼类大多或烫或炸,都很可口。

  希腊人则因信仰东正教,每周五不可吃肉,只能吃鱼。希腊人吃鱼虾贝的种类非常多,食量也非常大,这点和长寿的日本人饮食习惯颇为相似。

  鱼虾贝等海产品的牛磺酸含量非常丰富。牛磺酸是一种可降低血压的氨基酸,是长寿不可或缺的食物元素。在对地中海沿岸居民进行健康检查时我发现,他们尿液中的牛磺酸含量,远远高于欧洲其他地区的人。

第14节:长寿的人都在吃什么(12)

  只不过,令人惊奇的是,当地食物的口味一点也不清淡。这可是与长寿饮食原则相违背的。

  在15到17世纪的所谓大航海时代中,西班牙与葡萄牙相继称霸于美洲新大陆,海港城市巴塞罗那与里斯本不断有大量船只出海航向大西洋,而远洋航海一趟可能耗时数个月甚至数年,船上所携带的食物当然不是不易保存的新鲜食品,而是腌渍好的鱼与肉类等。所以,当地民众好吃腌渍品,可说是大航海时代留下来的习惯。

  经过化验后得知,马德里民众每日的食盐摄取量高达14克。

  为什么食盐摄取量那么高,可罹患心脏病的人却很少。经过一段时间的观察和研究,我猜想,秘密应该是藏在蔬菜水果里。地中海民众每天都要吃非常多的蔬菜水果。走进西班牙、意大利、葡萄牙与希腊的任何市场,都可发现琳琅满目的蔬菜水果,不管是种类和数量都非常惊人。这很大程度上是得益于当地温暖的气候条件。

  地中海地区民众的尿液牛磺酸含量,大约是世界平均值的1.5倍,能充分预防脑卒中,也非常接近每日理想摄取值。

  总之,地中海式饮食大量摄取蔬菜水果与鱼类,堪称是健康且长寿的做法,若鱼类吃法也能像日本那样讲究,可能就是世界最高质量的长寿饮食了。

  但南欧民众仍有个必须注意的问题,那就是肥胖。虽然食物丰富且美味,若饮食过量而变得肥胖,就白忙一场了。

  “拼了命才完成”的西西里岛调查

  为了追寻全球各地民众的长寿秘密,我们的研究团队风尘仆仆地奔走于文化形态各异的世界各国,过程中当然也会遇到各种危险,其中最令我毕生难忘的便是拜访意大利西西里岛的巴勒莫(Palermo)。

  巴勒莫是黑手党的故乡,1998年我初次踏上这块土地。

  此地的调查最初是委托当地巴勒莫大学协助,可是在我们将健检仪器送过去后,调查工作迟迟没有展开。我认为这样等下去会毫无进展,便在伦敦参加完学术研讨会后,一个人前往察看。

  巴勒莫大学的教授来机场接我,我们一同在饭店吃完午餐。虽然想尽快与对方正式讨论,但因为我有睡午觉的习惯,便向对方表示希望先休息到下午四点。

  于是,教授就先回去了。一觉醒来,我发现时间尚有余裕,为了打发时间,就毫无准备地只拿着饭店给的地图,单独出门去散步。然而,我这样做犯了大忌。

  首先我来到一处老城区,一间巨大的天主教堂矗立其中。走进去后发现里面的马赛克壁画非常美丽,沐浴在静肃的气氛下,我稍做祈祷才出来。

  往前走一会儿,我看到“教授街”的木牌标示。早期教会与修道院多半也身兼大学,顾名思义,这条街道过去住着许多大学教授。

  但沧海桑田,如今街道与建筑老旧,反而有点像是贫民区。面对眼前的今非昔比,我产生一探究竟的好奇心,流连其中。但我这样又再度犯了错误。

  站在密密麻麻铺着石板的巷子正**,凹陷处就是下水道;十字路口有处涌泉,几个家庭主妇站在那里聊天——这是日本老街寻常可见的情景,颇有午后的优哉情调。

  在这样温馨的光景下,我毫无防备地拿起照相机,喀嚓喀嚓地连续按下快门。到了差不多该折返饭店的时候,我才刚走回道路正**,忽然有个骑摩托车的男子以极快的速度冲过来,从我身旁呼啸而过,我赶紧闪到路边,整个人几乎跌倒了。

  瞬间,不知从何处冒出五六个男子,把我团团围住。对方强行用手捂住我的嘴巴,我直觉想大喊“救命”,但又心里发凉,在这个陌生环境中喊救命能传到哪里呢?

  那些人迅速抢走相机与钱包之类的值钱物品,马上就一哄而散。惊惶之下,我回到方才进去祈祷的天主教堂,心想这里应该很安全。

  午后的阳光透过彩绘玻璃倾泻而下,这时我才注意到,我的白衬衫上染着血迹。原来是对方持刀刺在我胸口的伤口所致,所幸只伤到皮肤。

  受到生命威胁,对方又用刀子抵着我的胸口,惊慌失措下,就算想大声求救却怎么也喊不出口呀。

第15节:长寿的人都在吃什么(13)

  所以,西西里岛的调查工作对我而言真的是性命攸关,差点没办法活着回来。

  日本?冲绳——世界第一长寿地区

  吃盐最少的地方

  第一次受世界卫生组织之托前往冲绳调查研究,已经是1986年的事了。在琉球大学的协助下,我的研究团队采集了冲绳民众二十四小时尿液样本进行检验,以调查他们的饮食生活。初步了解,他们每日食盐摄取量是

  8.2克,大约是当时日本平均值的2/3,也是四十七都道府县中,唯一一个低于日本政府标准值10克的县份。

  高盐饮食有害健康,容易引发高血压;高血压状态持续久了,则可能造成脑出血。医学研究显示,摄取过多盐分会让人体吸收更多胆固醇,增加心脏负担,导致心脏病与胃癌。

  显然冲绳人普遍长寿的主要原因是他们能将减盐食物变得可口美味。

  营养均衡的“全猪”盛宴

  冲绳人厉害的不只是食物减盐,猪肉的吃法也令我大开眼界。

  前往公营市场参观时,我发现这里的热门食物包括冲绳特有的岛豆腐与苦瓜等食材,但其中,最令我感到好奇的,则是猪肉。

  冲绳人对猪肉的吃法琳琅满目、变化多端。连皮的三层肉用酱油、砂糖、泡盛(冲绳米酒)熬煮,做成卤肉;猪耳朵、猪皮烤过再烫,搭配小黄瓜与萝卜丝做成凉拌菜等。整头猪从头到尾无一浪费,全都吃下肚。

  这样的“全猪”吃法,营养非常均衡,因为猪内脏含有大量铁质与矿物质,猪耳朵、猪皮与猪脚富含胶原蛋白。此外,不管哪种吃法,猪肉都先汆汤再运用,这可以去除多余脂肪,只留下优质蛋白质部分。

  我不禁好奇,冲绳人如何想出这种汆汤去油、有益健康的吃法。正好这次有机会针对当地七十岁以上的老人实施健康检查,我便请教他们有关吃法的由来。

  原来,早年间冲绳人每逢年节喜庆的日子都有宰杀猪羊与大家分享的习惯。在没办法当场吃完的状况下,剩下的肉得想办法保存到下次节庆使用。

  冲绳四面环海,取海水即可做成盐巴。气候炎热时为避免食物腐败,不得不用大量食盐腌渍食物。当然,食用前还得再多一道手续,否则味道会太咸。而去盐的最简单方法,则是将肉稍微烫过。这道工序不止去盐,还可去除猪肉所含的脂肪,堪称是最健康的吃肉方法。

  经过长期而大量的相关调查研究工作,我们得出一项结论,那就是日本人若能每日降低盐摄取量2克,即可延长一年平均寿命。

  冲绳民众平均每天摄取8克食盐,比日本平均值少了4克,因此,冲绳人平均寿命多了日本平均值两年。若能进一步降低到世界卫生组织所建议的每日6克,日本人的平均寿命还可以再提高3年。

  若能避免致死率最高的癌症,日本人的平均寿命当然会更高,但现实状况是,无论医学再怎么进步,癌症始终难以扑灭,反之,食盐减半却是可努力达成的目标。

  极具冲绳特色的豆腐吃法

  在冲绳人日常生活中,还有一个不可不提的食物,那就是豆腐。冲绳豆腐确实好吃,每块重量超过四百克,甚至接近一千克,几乎是一般豆腐的两倍。不过,用取自大海的盐卤制作,质地比一般常见的嫩豆腐稍硬。

  盐卤的主要成分是镁,这种矿物质能降低食盐对身体的不良影响。在脑卒中老鼠实验中发现,即使持续让老鼠喝浓度1%、咸味接近味噌汤的盐水,只要同时喂食镁与大豆蛋白质,老鼠仍然不会得脑中风。世界各国研究证实,充分摄取镁这种营养素,还可帮助降低血压。

  通过分析健康检查的结果,我发现,冲绳人不止是吃盐少,他们体内的胆固醇值也低;平均100毫升血液中,只含有180~200毫克的胆固醇,在全世界范围来说也是很理想的数值。

  许多人误以为胆固醇值越低越好,其实不然。我研究的案例显示,某些胆固醇值过低的地区,脑卒中与脑出血病例反而特别多。

  不少人上了年纪就不太吃肉,其实这对健康并无帮助,因为不吃肉反而容易有蛋白质摄取不足的问题。对七十岁以上的老人来说,就会罹患脑卒中,导致卧床不起,或是罹患老年痴呆症等疾病,同样也会缩短寿命。

  猪肉、豆腐的最佳拍档——昆布

  若冲绳人长寿食物的主角是猪肉与豆腐的话,那最佳配角就是昆布了。冲绳人的昆布消费量与富山县并列日本第一,当地民众每天早餐的味噌汤里都会放入切碎的昆布。

  昆布所含的纤维进入人体,可吸附多余的钠、胆固醇与糖分,能预防高血压、动脉硬化与糖尿病等生活习惯病,非常有益。冲绳是全球著名的长寿地区,1995年,当地政府发表了“世界长寿宣言”。可惜,在此之后,冲绳地区的人均寿命开始逐年下降。

第16节:长寿不可能一蹴而就(1)

  冲绳男性的长寿传统不再

  2000年,日本内阁厚生劳动省发表“都道府县别平均寿命排名”,看到这项报告,冲绳人恐怕要感到失望了。虽然女性继续排名首位,男性却从1995年的第四名大幅后退,掉到第二十六名,甚至低于日本平均寿命,当地人称此为“二六震撼”。

  冲绳的长寿传统为何式微了呢?其实当地仍有许多健康的高龄者,但中老年人的死亡率大增,降低了男性平均寿命。

  排名45~49岁冲绳男性死亡率前几名的疾病,分别是脑血管疾病、脑出血、肝病与糖尿病,都进入全国最严重地区的前十名。

  此外,五十几岁男性的肥胖比例据说也高达六成。

  冲绳民众原本就好酒,同时这里也是美式饮食最早进驻日本的地区。大部分日本人可能会感到意外,那就是就人口比例而言,冲绳拥有全日本最多的美式快餐店。而美式饮食的一大特征就是动物性脂肪与热量过剩。

  冲绳老人们从年轻时起就习惯饮用泡盛等酒类,然而传统民众大多务农,劳动量大,工作之后喝点酒无可厚非。但今日产业形态改变,中老年务农者已经大幅减少。

  此外,冲绳公共交通设施不足,居民得自行买车,就连下田也开车。走路时间减少,又改吃欧美化高热量食品,这便是动摇冲绳长寿传统的元凶。相同状况也发生在长年名列长寿榜首的冲绳女性身上,近年来四十几岁这一代的肥胖者不断增加,榜首地位岌岌可危。

  另一项不可忽略的现象是,冲绳人接受健康检查的比例远低于其他县市。许多人即使罹患糖尿病与高血压,也不愿到医院接受治疗。虽然长期高居长寿排行榜榜首,但受此不利因素影响,恐怕未来好景不再。

  走访全球各地调查饮食生活与健康关系的过程中,我们强烈地感受到,长寿绝不可能从天上掉下来,必须小心谨慎地维持。

  专家早已指出冲绳所面对的长寿崩解危机,日本虽名列世界顶级长寿国多年,同样不可掉以轻心,避免重蹈冲绳的覆辙。

  巴西?大坎普——平均寿命减少十七年

  从大都市圣保罗往西约八百千米,在靠近玻利维亚的地方有个名叫大坎普的小镇。此地位处内陆,和圣保罗不同,居民只会讲葡萄牙语,但这里却有许多冲绳移民过来的日本人。

  居住在大坎普的日裔巴西人,几乎都是来自圣保罗的移民子孙。二战以后,有许多日本人移居巴西,包含其二代、三代在内,人数不少。来自日本的移民大多从事着铁道铺设工作,随着新设铁路往内陆地区延伸,这些移民的后代也不断地往西迁徙,在那边聚集形成新的城镇。

  早期的日本移民都居住在圣保罗,他们多半保持在日本的饮食习惯,喜好吃寿司与生鱼片。根据调查,圣保罗的日裔民众每周至少要吃鱼1~2次。反之,移居大坎普的日裔家族,餐桌上很少看到鱼,取而代之的是大坎普民众的日常食物,也就是在日本本土也非常有名的“巴西烤肉”。

  在热带大草原放牧、成长的牛群,肉质鲜美有嚼劲,居民平均每天要吃掉0.5千克牛肉,青壮年男性更是能一顿吃掉一千克而面不改色。

  大坎普的冲绳人到了第二、第三代,已经称不上是冲绳人了。我们调查研究发现,他们的平均寿命比冲绳地区民众少了17岁之多。再详细调查得知,中老年人中,死于心脏病的非常多。

  这些内地日裔巴西人的血液磷脂质中,所含的DHA(二十二碳六烯酸)与EPA(二十碳五烯酸)等脂肪酸比例,平均只有2%~3%,而同样出身冲绳而居住圣保罗的日裔巴西人却是他们的两到三倍。

第17节:长寿不可能一蹴而就(2)

  研究指出,深海鱼油中含有丰富的DHA与EPA,可预防血管内产生血栓,有益健康。

  我的研究团队在进行全球性饮食调查时也发现,磷脂质中的脂肪酸含量超过6%,可减少心肌梗死致死风险。

  大坎普地区的日裔人士血液脂肪酸含量只有2%~3%,当然难以预防血栓与心肌梗死,因此,他们进入中老年后,罹患心脏病的比例相当高。

  1996年,我以400名大坎普日裔人士为对象实施健康检查,从中选出100名高血压、高脂血症与高血糖等生活习惯病罹患倾向较强的人。

  这100人分成几个小组,有的每天吃海带食物纤维5克,有的在饭里加含有50毫克异黄酮的大豆胚芽。我让他们连续吃十周这样的饭菜,进行营养改善研究,希望能了解他们体质的变化。

  令我们惊异的是,研究进行到第三周,就已经出现明显效果。摄取海带组的民众,血液中堪称高脂血症与动脉硬化元凶的坏胆固醇值明显下降。研究成果也指出,更年期女性摄取异黄酮,可改善血压与胆固醇值,降低骨骼中钙质的流失。某次在演讲后的提问中,有人问道:“家森先生,长寿的关键因素是遗传,还是环境呢?”

  这个问题,我想我们已经在大坎普找到答案。

  那就是海带、大豆与鱼这些日本人每天都要吃的食物,乃是让日本成为长寿之国的关键。

  美国?夏威夷——日裔移民还能保持长寿吗

  1987~1995年间,我曾四次前往夏威夷,对当地日裔美国人进行健康调查研究。研究地点位于希洛,该城市规模仅次于瓦胡岛上的首府檀香山,当时人口约四万。不过和檀香山不同,希洛还没有进行商业化的开发,是个宁静的小镇。

  一走到港边市场,我立刻看到写有“SUISAN”字样的招牌,这显然是“水产”的日语罗马拼音,它说明商家是经营水产业的日裔人士,而且也显示日裔在当地水产业的活跃。商店里面摆满刚从太平洋捞上来的新鲜海产品。此地日裔人士依然保持着日本的饮食习惯,爱吃生鱼片和用天然盐卤做的硬豆腐,这些都很容易买得到。

  我在市场里面转了一圈,发现除了奇异果、木瓜、菠萝等熟悉的热带水果外,丝瓜、冲绳苦瓜、地瓜等日本传统食物也不难买到。

  此地不少日裔人士都是从冲绳移民过来的,所以他们见到我们,没有丝毫的陌生感。很幸运地,我获邀进入其中一户家庭拜访,发现他们的日常菜色非常丰富。不只如此,他们还保留着冲绳最具特色的乡土饭菜——豆腐炒苦瓜与猪肉汆汤、去除脂肪的吃法。

  除了冲绳传统饮食,他们的餐桌上还有名为“拉乌拉乌(laulau)”的波利尼西亚特色料理;吃法很简单,就是用一种芋头的巨大叶片包裹牛肉或猪肉、鱼肉,蒸熟而食。

  整个烹煮过程都不太放盐,所以吃起来味道很清爽,当地人连包肉的叶子也一块吃下肚。我们入乡随俗跟着享用,发现芋叶有微微香气,口感及外观也都很美味,更重要的是,这种吃法可以摄取大量的低脂食物纤维。

  早期的移民吃盐少,比日本本土人还长寿

  通过冲绳同乡会协助,我和我的研究团队于1993年与1995年两次在当地实施健康检查,两次的调查对象分别是50~55岁的中年人与70岁以上的高龄者。

  根据二十四小时尿液样本的分析,我计算出这些日裔人士每日食盐摄取量平均是6克,这个数字甚至低于冲绳的平均值8克,只有日本平均值(每日12~13克)的一半左右。

  夏威夷州政府的调查结果显示,20世纪80年代日裔人士平均寿命是男性约78岁,女性约84岁,高于同期的日本本土民众平均寿命,堪称是全球最长寿的族群。

  可能是盐分摄取量少,这些日裔人士的脑卒中致死率非常低,超过70岁的老人也依旧是精神矍铄,很少有卧病在床或得老年痴呆症的。

  日本人常见的胃癌在此也不多。因为营养均衡,他们血液蛋白质中的白蛋白量,也高于日本本土的老年人。这项调查研究让我们了解,血液蛋白质中的白蛋白量高低,大体上和寿命成正比。

第18节:长寿不可能一蹴而就(3)

  此外,这些日裔人士的骨密度特别高,很少罹患骨质疏松症,这就大幅降低跌倒骨折、卧病在床的风险。原因很简单,就是源自冲绳的豆腐、大豆等食物,充分发挥了健康效果。

  第一代日本人移民夏威夷是在20世纪初,当时日本人普遍摄取大量盐分,而且蛋白质不足。这些移民来到夏威夷之后,既保存了日本传统饮食习惯好的一面,又改善之前饮食的缺点,加上大量摄取热带水果,食物选择更丰富。当然,夏威夷四季常夏、气候温暖,对健康长寿也是很有帮助的。另外,日裔人士吸烟比例很低,男性中也只有3%的吸烟人口,这也是保证长寿的一个重要因素。对于日裔人士而言,夏威夷堪称如假包换的“长寿之岛”。

  年轻一代饮食西化,肥胖问题明显

  然而,这样的优良传统在传承上遇到了很大的困难。除了老人,生活在夏威夷的年轻人饮食习惯已经严重西化,他们平时很少吃日本的传统食物。

  1995年的调查就发现,五十多岁的受检对象体内,大豆异黄酮含量只剩七十岁以上者的1/4。在此情况下,血液中的胆固醇值当然越来越高,年轻一代肥胖问题也越来越明显。

  可见,除非保持正确的饮食习惯,否则健康长寿无法传承下来。怀抱着这样的忧虑,2000年我再度拜访夏威夷希洛。

  改吃豆类食品,血压立刻下降

  这次的调查对象是五十岁出头的中年男女,一般而言,这个年纪罹患动脉硬化与心肌梗死的风险快速提高。我们首先调查218个人的胆固醇值与血压,从中选出80位动脉硬化症的高危民众,建议他们实施为期两个月的营养改善计划。我把实施的方法与目的都和他们清楚说明,顺利取得大家的同意。

  于是,在连续两个月的饮食改善研究期间,他们每人每天吃大豆25克。为了达到这项目标,我除了让他们直接吃黄豆粉,也给他们吃添加了黄豆粉的面包、奶酪,或者是以大豆蛋白做成的咸饼干。

  这项研究数据是否具有科学可靠性,关键在于参加者是否能长期坚持,是否能连续两个月按照我们所设定的食谱来吃。参加者人数越多、研究期间越长,成功概率也就越低,即使在日本也不易完成。

  所幸,所有自愿者都非常配合,研究过程相当顺利。我问其中的一个人,他说之所以会如此积极,那是因为参与这项研究虽然未必能改善自己的健康,但可帮助全世界更多人预防动脉硬化与心肌梗死等疾病,非常有意义。

  两个月的实验很快结束。结果发现,不论男女,血压都降低了,血液中的好胆固醇值(高密度脂蛋白胆固醇)也获得改善。

  大豆改善健康的效果在此得到证明。换言之,长期以来让日本人乃至于夏威夷日裔人士长寿的大豆食品,也可添加于面包中,让全世界所有民众享用。只要养成习惯,预防心肌梗死也不是那么困难。

  长寿究竟靠遗传,还是靠生活环境

  1997年,我造访冲绳的名护市,之所以会选择它作为研究基地,主要是因为二战以前那里有许多民众移民巴西与夏威夷。前面以夏威夷希洛与巴西大坎普的日裔人士为对象的调查研究显示,移民夏威夷的冲绳人平均寿命提高,移居巴西的反而缩短。如果也调查名护市民众的健康状态,我们就能了解长寿的关键因素究竟是遗传因子还是生活习惯。

  在冲绳做调查时,我获得了泌尿科医生协助,同时实施前列腺癌的检查。前列腺癌是少数可用验血来判别的癌症,因为罹患这种癌症的人,血液会产生前列腺特异抗原(PSA)。

  检查结果发现,七十岁以上高龄者血液PSA平均值和五十多岁的人几乎没有差异。我请教了当地居民饮食生活后发现,大家几乎天天都吃豆腐,而豆腐含有丰富的大豆异黄酮。

  大豆异黄酮与女性激素之一的雌激素,两者在化学构造与作用上非常类似,不仅可预防停经后骨质疏松症,而且也能预防男性前列腺癌。

  相对于欧美民众尿液中几乎验不出异黄酮素,冲绳高龄者民众的尿液里却有很多异黄酮。

第19节:长寿不可能一蹴而就(4)

  **?**——同样是丝路居民,有人长寿,有人却短命

  位于**西北部的**维吾尔自治区,人口虽只占全**的1/80,却拥有1/5的百岁人瑞,堪称是屈指可数的长寿地区。

  特别是位于丝绸之路沿线绿洲的乌鲁木齐、吐鲁番与和田三个城镇,到处可见年纪非常大却仍然身康体健的老人。

  反之,在周边的其他地区,却很少人能活到百岁。同样属于丝路地带,为何寿命的差距如此大呢?

  我和我的团队拟定计划,准备进行调查研究,希望找到两个地区民众寿命长短差异的关键因素。这个计划在1988年得以顺利实施。

  平均寿命偏低的阿勒泰人

  首先,我们前往阿勒泰地区进行调查。日本没有直接飞往**维吾尔地区的航班,我们只能先到上海,辗转进入乌鲁木齐,再乘坐直升机抵达该地。

  在阿勒泰地区进行的健康检查结果让我们非常惊讶,没想到当地民众的饮食习惯如此不健康!

  阿勒泰地区居**要是**五十六个民族之一的哈萨克族,他们至今仍然过着游牧生活。春季到秋季在山地牧羊,入冬后把羊赶到低地。

  他们过着典型的草原生活,全家人住在一个蒙古包中,整个蒙古包就只有一个房间,厨房寝室全包括在内,地面铺着色彩鲜艳的地毯,感觉相当舒适。

  草原生活的另一个特征是游牧。当羊群把附近的草吃光后,他们就得收拾行囊,带着所有家具与财产,准备搬迁。由于经常迁移,当然不可能种植蔬菜水果。此外,当地民众似乎自古就有“蔬菜是草,是动物的食物,不是人吃的东西”的观念。

  所以,他们的主食是羊肉,以及羊奶做成的奶油与奶酪。不仅如此,大麦粉做成的面包他们也不是直接食用,而是用羊油煎过再吃。

  每天骑马赶羊的游牧生活,对体力的消耗很大,食用羊肉与羊油,确实可以补充大量能量,但每天都吃这样的食物,也不利于健康。原因在于,肉类食物容易提高血液中的胆固醇值,造成动脉硬化与心肌梗死,即使充分运动仍无济于事。

  实际状况是,我在阿勒泰逗留的那些日子,发现超过六十岁的老人比较少见。打听后才了解,许多人三十几岁就猝死。此外,我亲眼看到,才五十几岁就罹患脑梗死、瘫痪在蒙古包的牧民。

  长寿的吐鲁番人

  离开阿勒泰,我们经由乌鲁木齐走陆路前往吐鲁番。沿途眺望远处的天山山脉,车子颠簸地开在沙漠凹凸不平的道路上。这一带是**最炎热的地区,我们正好在夏天抵达,白天的温度经常超过四十度。

  但来到吐鲁番附近时,风景却大不相同,眼前绿意盎然,到处流水潺潺。这是**所谓的“绿洲”,顾名思义,就像沙漠中绿油油的岛屿。

  绿洲水源丰沛,为了运用这丰富的水资源,人们想出各种办法。其中之一是建造名为“坎儿井”的人工水利设施,有效地将天山山脉积雪溶解的水引入城镇。

  具体做法是,每隔20~30米挖一口井,在地下形成联结的水路,水路出口就在城镇边缘。如此一来,即使周遭是沙漠,雪水从山上流到城镇也不会中途蒸发而浪费。

  其实,这种坎儿井对于人体健康也颇有帮助。因为雪水流入地下,会变成饱含钙质的矿泉水。身体吸收适量的钙质能预防高血压,我想这也是当地民众长寿的要因之一。

  108岁的婆婆爱吃手抓饭

  一到盛夏,吐鲁番白天气温动辄超过四十度,不过这里并不干燥,因为地下水源充沛,所以灵活运用,仍可栽培大量蔬菜水果。

  另外,虽然吐鲁番属于内陆气候,冬季严寒且会下雪,但当地人还是吃得到水果干。比如说,葡萄在秋季收成后,被吊在通风良好的小砖屋里整颗风干,就能制成美味的葡萄干。它们不仅种类繁多,甚至连药用的都有。

  此外,夏季高温让当地盛产哈密瓜与西瓜等甜美水果。当地人把这些水果放在地下储藏室里过冬,来年再继续食用。

  当地的主食则是名为“朴劳”的手抓饭。做法是,将烤过去油的羊肉、洋葱、胡萝卜与少量的米放入锅中熬煮约一小时,只用少量盐调味。

第20节:长寿不可能一蹴而就(5)

  煮好的手抓饭颜色红彤彤,显然是放了大量胡萝卜所致。胡萝卜含有丰富可抗氧化的β胡萝卜素,能抑制公认的老化元凶——体内活性氧自由基的作用。洋葱则含有槲皮素(Quercetin)这种可预防动脉硬化的成分。

  吐鲁番人喜欢把葡萄干与梅子干混合起来,搭配清淡的香料与石榴醋等作为调味料,再把这些调料撒在肉串上,不仅美味无比,更是营养丰富且均衡。

  吐鲁番当地原本就不产米,变通之下才会形成手抓饭这种吃法。换言之,生活智慧让吐鲁番民众拥有更长寿的机会。

  在接受我健康检查的民众里,最高龄的是一位108岁的老婆婆。不仅血压正常,对于我的问诊她也能思路清晰、口齿清楚地回答。她表示,家族里包括曾孙在内的子孙共有五十人,每天一大群人围坐在地毯上一同吃饭,其乐无比。

  到处都是寿星的和田

  告别吐鲁番,我们来到和田。当地位于塔克拉玛干沙漠南缘,夹在两条昆仑山脉流出的河川中,因而形成绿洲。当地的绢织地毯非常出名,妇女都忙着采桑叶、养蚕、缫丝与织布等工作。

  虽说是绿洲,但毕竟还是靠近沙漠,风一来照样是满天沙土飞扬,让人连眼睛都睁不开。我不禁怀疑,环境如此恶劣,本地真的有很多长寿老人吗?

  1982年,**的人口调查显示,**维吾尔自治区865位超过百岁的人瑞中,有200位住在和田。确实,我在当地市集上,看到非常多年纪一大把却神采奕奕的老人家。

  接受我们健康检查的民众中,有一对男性120岁、女性110岁——合计230岁的夫妇前来。当然,两位老人家的年龄都是自己告知的,我也不知道是不是完全可信,但老人家头脑清晰、动作敏捷的样子,还是很让我羡慕。

  和田也是水果天堂,市场里有非常多的桃子、苹果、葡萄、梨,还有木瓜、西瓜与香瓜等。特别是盛夏季节,琳琅满目的水果肯定让人食欲大开。这些水果不仅美味,它们也都有不同程度的保健功效,比如瓜类可生津止渴,是补充水分的重要来源,葡萄酿成的葡萄酒更是可以预防心脑血管疾病。

  每天吃着美味又健康的食物,和田人即使年岁已高,也都是身体硬朗,仍然可以继续工作。他们夫妻同心协力,从早到晚忙着栽培各种蔬菜水果,享受着快乐的生活。我想这堪称是世界上最健康的生活方式了。

  长寿还是短命,归根结底,是吃什么决定的

  回顾丝路沿途的调查研究工作,我最大的疑惑是,为什么生活在山区的游牧民族哈萨克人很多短命,而居住在绿洲的维吾尔族人却很长寿,原因何在?首先,最关键的一点在于两个民族对蔬菜水果的看法完全不同。哈萨克族人生活条件严苛,他们的生活方式与所处的自然环境,使得他们难以获得蔬菜与水果;反之,住在沙漠地带但受惠于绿洲,维吾尔族人能食用大量蔬果。

  两个民族对动物性脂肪的摄取方式也同样是天差地别。哈萨克族人每天必须大量劳动,所以得摄取非常多能量。不管做什么菜,他们都喜好使用羊油,因此血液中累积了过多的胆固醇,导致动脉硬化。再加上,他们喜欢喝加盐的酥油茶,盐与脂肪的组合成为生活习惯病的元凶。

  另一方面,维吾尔族人显然较能用优哉的心情面对每一天,享受生活,发挥生活智慧。确实,绿洲自然环境远优于哈萨克族居住的山区,但更重要的是,维吾尔族人将大自然的优良条件做最大的发挥与享受。耕作的冬季里食用。而且他们采取低温储藏方式,能一年四季吃到各种蔬菜水果,维持饮食均衡。

  再者,透过坎儿井灌溉系统,他们不仅可以种植大量蔬菜水果,还能喝到富含钙元素与镁元素的矿泉水,补充人体所需矿物质,维持健康。

  生活在绿洲的居民运用创意栽种并大量食用有益健康的食品,因此得以延年益寿。其中,以手抓饭这种食物作为代表所发挥的米粮健康效果,更是值得特别注意。

  白米饭进入人体后,消化吸收率高达98%,几乎完全被体内消化器官消化与吸收,是非常优异的热量来源。以稻米为主食的人很少肥胖,且胆固醇值偏低,罹患心脏病的人也不多。

  近来日本人越来越不爱吃米饭,平均每人一年消费量约62千克,是四十年前的一半,特别是年轻人,为了减肥,越来越不喜欢吃米饭。

  想要补充优质热量,或许可模仿手抓饭这种吃法,摄取大量蔬菜与干燥水果。当然,煮饭时添加菇类、海藻或海带等海洋植物乃至于各种野菜,也是不错的做法。米饭是日本人过去长寿的关键因素,具有非常难得的营养与优质热量,放弃这种食物实在太可惜了。

  瑞典——生活习惯的改变与寿命的缩减

  北欧的福利国家瑞典也是长寿之国。世界卫生组织2006年版的《世界健康报告》中指出,该国2004年平均寿命是81岁(其中男性约78岁,女性约83岁),与最长寿的国家日本仅有1岁之差。不过,单就女性而言,瑞典就比日本差3岁了。

  瑞典和其他国家一样,女性比男性长寿,但男女平均寿命差距不像日本那么大。我们获得世界卫生组织协助,于1987年前往瑞典的歌德堡进行相关研究。当时瑞典男女平均寿命差距只有3岁。

  一般而言,气温寒冷,血压会跟着上升。但我们在靠近北极的城市实施健康调查,却显示出令人惊讶的结果——当地女性高血压患者远远多于男性。

  这是一个非常罕见的现象,在我调查过的众多国家和地区中,都是男性比女性容易罹患高血压。原因是,女性在更年期以前,身体会持续分泌雌激素,这种雌激素可促使血管内皮细胞产生N2O,促进血管扩张,进而降低血压。

  在日本,很多女性是不上班的,而瑞典不存在这个问题,该国两性的就业率差异不大,即使结婚、生了小孩,大部分妇女仍不会离开工作岗位,它们的女性就业曲线不像日本那样呈“M形”,而是中间没有凹陷的“山形”。

  女性不让须眉地在职场打拼,会承受来自工作的压力;为了解压,不少人养成抽烟喝酒的习惯。在实际的调查中,我发现当地有吸烟喝酒习惯的人,男女几乎一样多。

  吸烟喝酒容易造成血压升高,增加罹患心肌梗死的风险。即便有雌激素保护,女性生理上的优势也会被这种不良生活习惯所抵消。

  况且,瑞典位处北欧,受气候与土壤影响,蔬菜与水果产量有限。当地民众所摄取的食物中,钾、食物纤维与抗氧化营养素多半不足,体内的N2O容易遭到破坏,罹患心肌梗死等心脑血管疾病的风险就会随之提高。

  虽然瑞典提供给民众优厚的社会福利,但不可能连国民的饮食生活都介入,原本有机会成为长寿状元的瑞典,因此将世界最长寿国家宝座让给日本。

  近年来,日本对女性进入职场的限制越来越少,日本女性进入职场的风气越来越明显,这是可喜现象。

  只是,过于忙碌、饮食不正常,加上蔬菜与鱼类摄取不足、压力难以消解等,她们的健康受到严重的威胁。尤其在家事方面,日本人不像瑞典人那样彻底地男女平等分工,有家庭的日本上班族女性负担日益加重。目前日本男女平均寿命差距是7岁,恐怕将来会逐渐地缩短。

简化版总结

1.贵州饮食以大豆与玉米为主食,油豆腐,豆腐乳等各种豆腐制品很多。当时正值晚餐时刻,该农户的饭桌上摆着炒花生、毛豆炒猪肉、纳豆炒豆芽菜以及豆腐丸子汤等几道菜,其中豆制品占有相当高的比例。我在当地民众的协助下,获得他们的尿液标本,仔细测定后发现,尿液中大豆异黄酮的含量是日本人平均值的1.5倍。之前在世界其他地方实施调查研究时,作者也已经发现,尿液中大豆异黄酮含量越多的人,越不容易罹患心肌梗死等现代文明病。还有一个全球性的现象,就是女性罹患心肌梗死致死的病例,只有男性的三四成,原因是雌激素可畅通血流。因此,说心脏病有“性别歧视”一点也不夸大。

2.格鲁吉亚——吃肉也能长寿。当地居民日常肉类的摄取量是很大的,大约已经达到了日本人的两倍,但他们血液中的胆固醇值却不高。秘诀之一:不吃肥肉,多吃蔬菜。他们最有代表性的肉类料理“哈修拉玛(Haslama)”,就是一道将大量肉块放入汤中煮熟的丰盛大餐。煮熟以后,不要肥肉,只把蛋白质最丰富的瘦肉留下,蘸着果酱大口吃。果酱并不是甜酱,而是梅子肉加上大蒜、韭菜与洋葱。格鲁吉亚人不吃肥肉,搭配食用大量具有抗氧化力的蔬菜,即便多吃肉,也可长寿。因为他们摄取的全是高质量的蛋白质。吃肉时,村民一定搭配食用大量的芹菜等青菜。不管男女老幼,格鲁吉亚人几乎每餐都能吃完满满一大盘的各色蔬菜。这些具有香味的蔬菜大多含有丰富的抗氧化营养素,是延缓格鲁吉亚人衰老的一大功臣。普遍喜欢吃蔬菜与水果,他们把葡萄皮与葡萄子全都嚼碎吃下肚。秘诀之三:常喝葡萄酒。秘诀之四:儿孙满堂,热闹用餐。秘诀之五:早餐一定有酸奶

3.厄瓜多尔?比尔卡班巴——管住嘴,迈开腿。比尔卡班巴民众的主食是玉米与一种名为“尤卡”的芋头。比尔卡班巴民众还有一项日常食物,那就是被称为“葛索”的奶酪,做法与豆腐非常类似。将牛的十二指肠在水中泡一会儿,就会形成看似胆汁颜色、有点绿的萃取物,等这种萃取物凝结成块,放入牛奶后保温,即可发酵。该萃取物含有可让蛋白质凝固的酶,一小时之后即可做成葛索。当地民众穷困,没有交通代步工具,居民前来医院接受健康检查,得走两三小时的山路,但我却发现每个人都脸不红、气不喘,脚力相当惊人。因为主食尤卡不易保存,必须每天早上去挖这种食物回来煮,对此已经习惯了。我测量了80名50~54岁当地居民的血压,发现只有2人罹患高血压。由此推定,食用玉米、尤卡、小米与稗子等食物,日常大量活动身体,又住在四季如春的环境里,这都是居民很少罹患高血压且心脏功能稳定的主因。

4.坦桑尼亚?汉德尼——与高血压无缘的马塞族人。主食为混合小麦与玉米粉做成的“鸟卡里”。不管是玉米还是小麦,都是将壳碾碎一同吃下去,因此可摄取大量食物纤维与钾。除此之外,当地居民经常食用原产中南美洲的木薯,以及名为“基德尼比滋”、形状像肾脏的芸豆。这两种食物都含有可预防高血压的重要营养成分。他们的传统饮食完全不使用盐。马塞族人是怎么做到既不吃盐,又不缺钠的呢?那就是,当地人不论男女老幼,每天平均喝2~3升的酸奶。酸奶的原料牛奶原本就是优质蛋白质,含有适量的盐,所以即使他们吃的其他食物完全不用食盐调味,那么单靠喝酸奶,每天也是可以摄取约2.5克的钠。当地人把玉米粉混入酸奶一起吃。这种食物被称为“马滋伊哇”,感觉有点像燕麦片,口感非常好。他们每天早上四点左右起床,女性先将牛奶挤入葫芦,男性提着这些新鲜的牛奶当早餐,外出到草原放牧。午后三时左右,男性回到家,直到接近黄昏才用餐。坦桑尼亚首都三兰港的民众同样是一天只吃一顿饭。只不过,近来首都民众改吃类似欧美的高脂肪、高热量食物,肥胖者越来越多,十年内几乎增加一倍。所以,未必传统的饮食习惯就是好,还得看吃什么、怎么吃。此外,若生活形态改变,原本有益的食物也可能有害健康。他们将牛奶装入名为“基布优”的葫芦,就会自然发酵成为酸奶。我向当地民众要了几个基布优作为样本,带回日本化验,发现马塞族人吃的酸奶是以植物乳酸菌发酵做成的。马塞族人养牛采取自然放牧,让牛在大草原上自由地吃草,可想而知,牛奶中含有大量植物纤维的成分。但令人惊讶的是,最近因高度抗氧化作用受到注目的新宠儿——多酚,竟也大量地蕴藏在其中。

5.**?广州——少吃盐,少得高血压。搜集民众的二十四小时尿液样本,调查他们一天盐分摄取量,换算成食盐后,等于每人每天平均摄取5.7克,稍微低于世界卫生组织所建议的健康摄取量,也就是一日6克。1989年,我们再度造访广州近郊的谢村。接着调查二十四小时尿液样本,由此便可看出饮食生活剧烈变化的结果。比如,原本每日平均摄取5.7克的理想食盐量,这次急增到8.3克。虽然和日本人相比仍属偏低,但过去不太吃盐的人突然增加食盐摄取量,就容易造成血压跳升。

6.法国?奥尔良——葡萄酒促成的长寿之国。任职于法国国立健康医学研究所的塞吉?雷诺(Serge Renaud)博士,经过长达15年的追踪调查,在1998年发表了一份让世人震惊的调查报告,那就是为什么法国人吃大量的高脂肪食物,心肌梗死致死率却是欧洲最低的,这其中的关键就在于,法国人大量饮用红葡萄酒。葡萄酒含有大量多酚,多酚是植物所含的天然物质,具有抗氧化作用,进入人体内,可防范坏胆固醇(低密度脂蛋白胆固醇)被活性氧自由基所氧化。一般而言,胆固醇氧化会遭受免疫系统中的巨噬细胞攻击而死亡,尸体大量堆积在血管壁,进而造成血流堵塞与动脉硬化。反之,摄取含多酚的食物,可避免体内胆固醇氧化,因此比较不会发生动脉硬化。我们分别为五十岁出头的男女镇民各100人实施尿液与血液检查。他们的二十四小时尿液样本化验结果显示,法国人体内所含的牛磺酸不输给日本人,甚至有过之而无不及,这就让我们非常惊讶了。奥尔良民众喜好肉类食物,他们不只是吃里脊肉与五花肉,就连肝、肾与心等内脏,他们也全都入口。奥尔良那边最著名的家庭大餐“牛肉蔬菜锅”,就是用内脏来熬汤。通过动物内脏摄取大量的牛磺酸是法国人很少罹患心脑血管疾病的又一个重要原因。法国人心脏病患较少的原因还有一个,那就是常喝矿泉水。法国人自古以来就有这种习惯,偏好矿泉水而不喝自来水。毫无疑问,常喝矿泉水对健康有帮助。研究证实,尿液里这类矿物成分含量越高的人,血压就越低。原因是,镁与钙可促进盐分排出体外。

7.南欧-地中海式长寿。对地中海沿岸居民进行健康检查时我发现,他们尿液中的牛磺酸含量,远远高于欧洲其他地区的人。西班牙人喜欢吃的西班牙海鲜饭(paella)与西班牙冷汤(gazpacho)都放入各种鱼类。当地生产的鳀鱼与鲤鱼可生吃也可用醋腌渍,其他鱼类大多或烫或炸,都很可口。当地民众好吃腌渍品,可说是大航海时代留下来的习惯。经过化验后得知,马德里民众每日的食盐摄取量高达14克。为什么食盐摄取量那么高,可罹患心脏病的人却很少。经过一段时间的观察和研究,我猜想,秘密应该是藏在蔬菜水果里。地中海民众每天都要吃非常多的蔬菜水果。

8.日本?冲绳——世界第一长寿地区。他们每日食盐摄取量是8.2克,大约是当时日本平均值的2/3,也是四十七都道府县中,唯一一个低于日本政府标准值10克的县份。冲绳人对猪肉的吃法琳琅满目、变化多端。连皮的三层肉用酱油、砂糖、泡盛(冲绳米酒)熬煮,做成卤肉;猪耳朵、猪皮烤过再烫,搭配小黄瓜与萝卜丝做成凉拌菜等。整头猪从头到尾无一浪费,全都吃下肚。这样的“全猪”吃法,营养非常均衡,因为猪内脏含有大量铁质与矿物质,猪耳朵、猪皮与猪脚富含胶原蛋白。此外,不管哪种吃法,猪肉都先汆汤再运用,这可以去除多余脂肪,只留下优质蛋白质部分。在冲绳人日常生活中,还有一个不可不提的食物,那就是豆腐。冲绳豆腐确实好吃,每块重量超过四百克,甚至接近一千克,几乎是一般豆腐的两倍。不过,用取自大海的盐卤制作,质地比一般常见的嫩豆腐稍硬。盐卤的主要成分是镁,这种矿物质能降低食盐对身体的不良影响。在脑卒中老鼠实验中发现,即使持续让老鼠喝浓度1%、咸味接近味噌汤的盐水,只要同时喂食镁与大豆蛋白质,老鼠仍然不会得脑中风。世界各国研究证实,充分摄取镁这种营养素,还可帮助降低血压。冲绳人不止是吃盐少,他们体内的胆固醇值也低;平均100毫升血液中,只含有180~200毫克的胆固醇,在全世界范围来说也是很理想的数值。许多人误以为胆固醇值越低越好,其实不然。我研究的案例显示,某些胆固醇值过低的地区,脑卒中与脑出血病例反而特别多。不少人上了年纪就不太吃肉,其实这对健康并无帮助,因为不吃肉反而容易有蛋白质摄取不足的问题。对七十岁以上的老人来说,就会罹患脑卒中,导致卧床不起,或是罹患老年痴呆症等疾病,同样也会缩短寿命。若冲绳人长寿食物的主角是猪肉与豆腐的话,那最佳配角就是昆布了。冲绳人的昆布消费量与富山县并列日本第一,当地民众每天早餐的味噌汤里都会放入切碎的昆布。

9.巴西?大坎普。居住在大坎普的日裔巴西人,几乎都是来自圣保罗的移民子孙。早期的日本移民都居住在圣保罗,他们多半保持在日本的饮食习惯,喜好吃寿司与生鱼片。根据调查,圣保罗的日裔民众每周至少要吃鱼1~2次。反之,移居大坎普的日裔家族,餐桌上很少看到鱼,取而代之的是大坎普民众的日常食物,也就是在日本本土也非常有名的“巴西烤肉”。大坎普的冲绳人到了第二、第三代,已经称不上是冲绳人了。我们调查研究发现,他们的平均寿命比冲绳地区民众少了17岁之多。再详细调查得知,中老年人中,死于心脏病的非常多。我的研究团队在进行全球性饮食调查时也发现,磷脂质中的脂肪酸含量超过6%,可减少心肌梗死致死风险。大坎普地区的日裔人士血液脂肪酸含量只有2%~3%,当然难以预防血栓与心肌梗死,因此,他们进入中老年后,罹患心脏病的比例相当高。1996年,我以400名大坎普日裔人士为对象实施健康检查,从中选出100名高血压、高脂血症与高血糖等生活习惯病罹患倾向较强的人。这100人分成几个小组,有的每天吃海带食物纤维5克,有的在饭里加含有50毫克异黄酮的大豆胚芽。我让他们连续吃十周这样的饭菜,进行营养改善研究,希望能了解他们体质的变化。令我们惊异的是,研究进行到第三周,就已经出现明显效果。摄取海带组的民众,血液中堪称高脂血症与动脉硬化元凶的坏胆固醇值明显下降。研究成果也指出,更年期女性摄取异黄酮,可改善血压与胆固醇值,降低骨骼中钙质的流失。

10.美国?夏威夷。此地日裔人士依然保持着日本的饮食习惯,爱吃生鱼片和用天然盐卤做的硬豆腐,这些都很容易买得到。除了奇异果、木瓜、菠萝等熟悉的热带水果外,丝瓜、冲绳苦瓜、地瓜等日本传统食物也不难买到。除了冲绳传统饮食,他们的餐桌上还有名为“拉乌拉乌(laulau)”的波利尼西亚特色料理;吃法很简单,就是用一种芋头的巨大叶片包裹牛肉或猪肉、鱼肉,蒸熟而食。整个烹煮过程都不太放盐,所以吃起来味道很清爽,当地人连包肉的叶子也一块吃下肚。我们入乡随俗跟着享用,发现芋叶有微微香气,口感及外观也都很美味,更重要的是,这种吃法可以摄取大量的低脂食物纤维。根据二十四小时尿液样本的分析,我计算出这些日裔人士每日食盐摄取量平均是6克,这个数字甚至低于冲绳的平均值8克,只有日本平均值(每日12~13克)的一半左右。夏威夷州政府的调查结果显示,20世纪80年代日裔人士平均寿命是男性约78岁,女性约84岁,高于同期的日本本土民众平均寿命,堪称是全球最长寿的族群。日本人常见的胃癌在此也不多。因为营养均衡,他们血液蛋白质中的白蛋白量,也高于日本本土的老年人。这项调查研究让我们了解,血液蛋白质中的白蛋白量高低,大体上和寿命成正比。此外,这些日裔人士的骨密度特别高,很少罹患骨质疏松症,这就大幅降低跌倒骨折、卧病在床的风险。原因很简单,就是源自冲绳的豆腐、大豆等食物,充分发挥了健康效果。
除非保持正确的饮食习惯,否则健康长寿无法传承下来。怀抱着这样的忧虑,2000年我再度拜访夏威夷希洛。我们首先调查218个人的胆固醇值与血压,从中选出80位动脉硬化症的高危民众,建议他们实施为期两个月的营养改善计划。我把实施的方法与目的都和他们清楚说明,顺利取得大家的同意。两个月的实验很快结束。结果发现,不论男女,血压都降低了,血液中的好胆固醇值(高密度脂蛋白胆固醇)也获得改善。大豆改善健康的效果在此得到证明。换言之,长期以来让日本人乃至于夏威夷日裔人士长寿的大豆食品,也可添加于面包中,让全世界所有民众享用。只要养成习惯,预防心肌梗死也不是那么困难。七十岁以上高龄者血液PSA平均值和五十多岁的人几乎没有差异。我请教了当地居民饮食生活后发现,大家几乎天天都吃豆腐,而豆腐含有丰富的大豆异黄酮。

11.**?**。平均寿命偏低的阿勒泰人。他们的主食是羊肉,以及羊奶做成的奶油与奶酪。不仅如此,大麦粉做成的面包他们也不是直接食用,而是用羊油煎过再吃。每天骑马赶羊的游牧生活,对体力的消耗很大,食用羊肉与羊油,确实可以补充大量能量,但每天都吃这样的食物,也不利于健康。原因在于,肉类食物容易提高血液中的胆固醇值,造成动脉硬化与心肌梗死,即使充分运动仍无济于事。实际状况是,我在阿勒泰逗留的那些日子,发现超过六十岁的老人比较少见。打听后才了解,许多人三十几岁就猝死。此外,我亲眼看到,才五十几岁就罹患脑梗死、瘫痪在蒙古包的牧民。
吐鲁番附近时,风景却大不相同,眼前绿意盎然,到处流水潺潺。这是**所谓的“绿洲”,顾名思义,就像沙漠中绿油油的岛屿。当地的主食则是名为“朴劳”的手抓饭。做法是,将烤过去油的羊肉、洋葱、胡萝卜与少量的米放入锅中熬煮约一小时,只用少量盐调味。
告别吐鲁番,我们来到和田。当地位于塔克拉玛干沙漠南缘,夹在两条昆仑山脉流出的河川中,因而形成绿洲。当地的绢织地毯非常出名,妇女都忙着采桑叶、养蚕、缫丝与织布等工作。和田也是水果天堂,市场里有非常多的桃子、苹果、葡萄、梨,还有木瓜、西瓜与香瓜等。特别是盛夏季节,琳琅满目的水果肯定让人食欲大开。这些水果不仅美味,它们也都有不同程度的保健功效,比如瓜类可生津止渴,是补充水分的重要来源,葡萄酿成的葡萄酒更是可以预防心脑血管疾病。
两个民族对动物性脂肪的摄取方式也同样是天差地别。哈萨克族人每天必须大量劳动,所以得摄取非常多能量。不管做什么菜,他们都喜好使用羊油,因此血液中累积了过多的胆固醇,导致动脉硬化。再加上,他们喜欢喝加盐的酥油茶,盐与脂肪的组合成为生活习惯病的元凶。

总结的几个点:
1.葡萄籽,蔬果等抗氧化
2.豆腐制品补充大豆异黄酮
3.少吃盐减少高血压风险
4.吃肉时不吃肥肉,同时吃多酚等抗氧化物可以抵消吃肉带来的坏处,
5.牛磺酸具有多种生理功能,是人体健康必不可少的营养素。保护视网膜,保护心肌,抗氧化,促进免疫,促进脂类消化吸收
来源:心脏,脑,肝脏;最丰富的是海鱼,贝类,海洋植物紫菜,墨鱼,章鱼,虾。在坚果和豆科植物的籽实如黑豆、蚕豆、嫩豌豆、扁豆及南瓜籽中也含有较多的牛磺酸。动物内脏也是富含大量牛磺酸
6.喝矿泉水
7.昆布可吸附多余的钠、胆固醇与糖分,能预防高血压、动脉硬化与糖尿病等生活习惯病,非常有益。

最后我个人认为这种健康地区的调查还是比较片面,很多观点还都是假设性的个人想法,观察一个地区的每个细节都是很重要的,而作者只展示出了他认为有必要说的点,但也许还有更多的点是影响健康的重要因子未被提及。
但从宏观上讲还是可以得到比如盐用量和健康的强关联关系,和其他一些点与健康的强关联关系。

abc

#fadfdasf
##fadfadsf
###fdfadsfadsf

web移动端 出现浮层时 禁止body滚动条滚动

此解决方案完全是张鑫旭大神的转载,原文在此
https://www.zhangxinxu.com/wordpress/2016/12/web-mobile-scroll-prevent-window-js-css/

工作中遇到弹出一个浮层,并且此浮层自带滚动条时,浮层的滚动会引起下边窗口滚动条的滚动,解决这个用简单的办法做不到。

还是张鑫旭大神想得比较周到,一剂药下去,药就除了,把这个写到公共方法里,爽得不行

smartScroll: function(container, selectorScrollable) {
        // 如果没有滚动容器选择器,或者已经绑定了滚动时间,忽略
        if (!selectorScrollable || container.data('isBindScroll')) {
            return;
        }

        // 是否是搓浏览器
        // 自己在这里添加判断和筛选
        var isSBBrowser;

        var data = {
            posY: 0,
            maxscroll: 0
        };

        // 事件处理
        container.on({
            touchstart: function(event) {
                var events = event.touches[0] || event;

                // 先求得是不是滚动元素或者滚动元素的子元素
                var elTarget = $(event.target);

                if (!elTarget.length) {
                    return;
                }

                var elScroll;

                // 获取标记的滚动元素,自身或子元素皆可
                if (elTarget.is(selectorScrollable)) {
                    elScroll = elTarget;
                } else if ((elScroll = elTarget.parents(selectorScrollable)).length == 0) {
                    elScroll = null;
                }

                if (!elScroll) {
                    return;
                }

                // 当前滚动元素标记
                data.elScroll = elScroll;

                // 垂直位置标记
                data.posY = events.pageY;
                data.scrollY = elScroll.scrollTop();
                // 是否可以滚动
                data.maxscroll = elScroll[0].scrollHeight - elScroll[0].clientHeight;
            },
            touchmove: function() {
                // 如果不足于滚动,则禁止触发整个窗体元素的滚动
                if (data.maxscroll <= 0 || isSBBrowser) {
                    // 禁止滚动
                    event.preventDefault();
                }
                // 滚动元素
                var elScroll = data.elScroll;
                // 当前的滚动高度
                var scrollTop = elScroll.scrollTop();

                // 现在移动的垂直位置,用来判断是往上移动还是往下
                var events = event.touches[0] || event;
                // 移动距离
                var distanceY = events.pageY - data.posY;

                if (isSBBrowser) {
                    elScroll.scrollTop(data.scrollY - distanceY);
                    elScroll.trigger('scroll');
                    return;
                }

                // 上下边缘检测
                if (distanceY > 0 && scrollTop == 0) {
                    // 往上滑,并且到头
                    // 禁止滚动的默认行为
                    event.preventDefault();
                    return;
                }

                // 下边缘检测
                if (distanceY < 0 && (scrollTop + 1 >= data.maxscroll)) {
                    // 往下滑,并且到头
                    // 禁止滚动的默认行为
                    event.preventDefault();
                    return;
                }
            },
            touchend: function() {
                data.maxscroll = 0;
            }
        });

        // 防止多次重复绑定
        container.data('isBindScroll', true);
    },

调用时是这样的

$.smartScroll($('#quitBoxHolder'), '.quit_box');
第一个参数是弹出层的holder元素,第二个参数是弹出层需要滚动的元素
如果弹出后只是要让后边不动,那么第二个随便写什么都行;

sublime的那些牛逼的加速操作

sublime说好的人多,不过展现出他加速性能才是让人最激动人心的,对于频繁的操作,如果能省时省力,将会节省很多时间用于真正有意义的事情

多光标操作1

1

多光标操作2

2

多光标操作3

3

emment写css1

emmet css1

emment写css2

emmet css2

emment写css3

emment css3

emment写css4

emment css4

自定义marco宏写css

sublime macro css3

sublime选择文字以单词为单位跳动

sublime

接下来是sublime的加速选择操作

ctrl+0 是向父层找html标签内容 依赖emmet插件

ctrl0

ctrl+9 是向子层找html标签内容 依赖emmet插件

ctrl9

ctrl+8 选择 " " 内的内容,依赖 selecti quoted插件

ctrl8

ctrl+7 expand_selection to brackets是选择到括号对 () [] {} 按第一下为选择括号内的内容,继续按会选择包括括号并依次往父层找括号对

ctrl7

ctrl+6 expand_selection to indentation 是选择缩进段内的内容,非常适合选择{}内的内容(前提是语句缩进了)依次按会往上找父层的{} 内的内容

ctrl6

ctrl+5 expand_selection to scope

ctrl5

快捷键是修改过的,修改过的配置如下

 {"keys": ["ctrl+8"], "command": "select_quoted"},
 { "keys": ["ctrl+7"], "command": "expand_selection", "args": {"to": "brackets"} },
 { "keys": ["ctrl+6"], "command": "expand_selection", "args": {"to": "indentation"} },
 { "keys": ["ctrl+5"], "command": "expand_selection", "args": {"to": "scope"} },
 {
        "keys": [
            "ctrl+9"
        ], 
        "args": {
            "action": "balance_inward"
        }, 
        "command": "run_emmet_action", 
        "context": [
            {
                "key": "emmet_action_enabled.balance_inward"
            }
        ]
    }, 
    {
        "keys": [
            "ctrl+0"
        ], 
        "args": {
            "action": "balance_outward"
        }, 
        "command": "run_emmet_action", 
        "context": [
            {
                "key": "emmet_action_enabled.balance_outward"
            }
        ]
    }

一个很好用的日期格式转换的公共方法

工作中经常用到的日期转换,拿着时间戳,转成形如2018,09.06这样的格式,此公共方法可以快速搞定

dateConverter: function(formatData, timestamp) {
    Date.prototype.format = function(format) {
        var o = {
            "M+": this.getMonth() + 1, //month
            "d+": this.getDate(), //day
            "h+": this.getHours(), //hour
            "m+": this.getMinutes(), //minute
            "s+": this.getSeconds(), //second
            "q+": Math.floor((this.getMonth() + 3) / 3), //quarter
            "S": this.getMilliseconds() //millisecond
        };

        if (/(y+)/.test(format)) {
            format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
        }

        for (var k in o) {
            if (new RegExp("(" + k + ")").test(format)) {
                format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
            }
        }
        return format;
    };
    var timeFormat = new Date(timestamp);
    return timeFormat.format(formatData);
},

调用起来是这样的,yyyy表示年,MM表示月,dd表示日,hh表示小时,mm表示分钟,ss表示秒

$.dateConverter('yyyy-MM-dd',timeStamp);

如果mm只写一位m,表示在一位数的时候,省略前边的0
image

[与时俱进] CSS 4里的颜色升级

CSS Color Module Level 4

= <rgb()> | <rgba()> | <hsl()> | <hsla()> |
<hwb()> | <gray()> | <device-cmyk()> |
| | currentcolor |

可以看到,新的css颜色支持了比ps还多的模式

css2时代

rgb 这个是red green blue alpha 这个属于css2时代
name-color 是颜色名字,gold之类,这个实际中使用很少,属于css2时代

css3时代(只要别和我说你用的是ie7,ie8这种古董浏览器,现在已经可以全部兼容了)

image

rgba这个是red green blue alpha 经常用到
hsla 这个是色相Hue 饱和度Saturation 亮度 Lightness 透明度alpha
transparent 透明度 经常用
currentcolor 这个是用在background-color:currentcolor 然后颜色就继承了color的颜色,这个从未用过

css4时代

在can I use上可以看到css4的有2项,一项是Rebeccapurple color,这个就是增加了css2里的name-color,但这个我不用,忽略了

另一个就是 rrggbbaa hex color notation 这个就是今天要说的。来看看他的兼容性

image

得出的结论就是:

1. pc端页面还是别用了,因为国内还是得兼容ie的,ie11都不支持,所以还要等几年
2. mobile端如果需要兼容ios10.2以下的,安卓需要兼容4.X的,都不要用这个新特性

ok,以上如果都通过了,我们就可以继续了

先看代码

elem {
    background: rgb(0, 0, 0);           /* RGB notation (no alpha). */
    background: #000;                   /* 3-digit hexadecimal notation (no alpha). */
    background: #000000;                /* 6-digit hexadecimal notation (no alpha). */
    background: rgba(0, 0, 0, 1.0);     /* RGBA notation. */

    /* The new 4 and 8-digit hexadecimal notation. */
    background: #0000;                  /* 4-digit hexadecimal notation. */
    background: #00000000;              /* 8-digit hexadecimal notation. */
}

十六进制的6位和3位大家已经很熟悉了,#00aaff可以简化成 #0af,意思就是如果十六进制里的两个两个相等,就可以进行简化,如果是#00abff就不能简化了
那么新增加的8位和4位其实也是类似的原理,#00aaff04 后边增加的04表示的就是透明度咯,而且是16进制的。
这就有些难以理解了,16进制的透明度是个什么鬼?拜托我们普通人只会0-1或者0-100或者0.1到1 好不好
我的猜想就是透明度的十六进制是从0-255来表示,就类似rgba里每个值也是0-255表示一样
那就做实验验证一下,比如我写一个颜色叫#0000007f 7f在十进制里是127,乘以2就是254,如果alpha的范围在0-255之间,而十进制的范围在0-100之间,那么我需要50的透明度,那十六进制就应该是127的十六进制,而实验验证了就是这么个道理

image

知道了原理,接下来就是,如果我要写透明度,怎么写呢?

那就反推吧!比如
我需要80%的透明度,就用80*(255/100) 得到204,再把204转成十六进制就是cc,验证一下结果

image

呵呵,好累啊,所以实际使用中,这么做并不算很直观呀!必须有一个转换器可以秒转16进制透明度和10进制透明度,才能具备实用价值,留待后边再找工具吧!

而目前他最大的作用就是

装逼

参考文章

css draft 撰写 https://drafts.csswg.org/css-color/
css tricks https://css-tricks.com/8-digit-hex-codes/

[d3js] 为x轴添加decoration指示效果

奇葩需求来了,先看最终效果图

d3-decoration

实现分析

几乎所有的画x轴y轴的教程,都不会告诉你,轴线上还能画这个东西,所以这是我发明的独门秘籍~
实现方法是从柱子上的数字得到的灵感,其实想到了就很简单了,想象把顶端数字的y轴固定一个位置,就是x轴的底部,不就可以实现了吗?嘿嘿,不过要实现要注意几点
1.这个矩形+箭头的decoration,要先于x轴画,否则就会压住x轴
2.矩形好画,箭头难画,svg的rotate和css有巨大的不同

代码实现

image

svg里边rotate的语法很奇葩,来体验一下

rotate的第一个参数是角度,第2,3个是x,y值

详情可以参看张鑫旭大神的demo,链接在此https://www.zhangxinxu.com/wordpress/2015/10/understand-svg-transform/

至于切柱子时decoration跟着变,就靠着得到当前的elementIndex,然后改变各个元素的class
image

image

gulp3升级到gulp4之踩坑记录

之所以从gulp3升到4,绝对不是自愿的。
由于node从8升到了10,gulp3在运行的时候crash了,搜了一下stackoverflow没有得到明确的结果,怀疑是gulp3和node10匹配有问题,于是升级gulp4,于是开始了一段漫长的过程。。

升级gulp3

npm install -g gulp-cli
npm install --save-dev gulp@4

完成后gulp-v看到如下字样

CLI version: 2.2.0
Local version: 4.0.2

就算是对了,cli版本一直是2.几,而local就是gulp本身了,看到4.0就算是升级到4了

AssertionError: Task function must be specified

这个原因可以从这篇文章找到
https://www.liquidlight.co.uk/blog/how-do-i-update-to-gulp-4/
这是因为gulp4大幅改变了异步逻辑,并启用了2个新语法,series和parallax
https://blog.skk.moe/post/update-gulp-to-4/
于是把所有的异步从这个样子

gulp.task('cooperateuglifyjs',["cooperateclean"], function () {
    gulp.src([
            config.soucePath+'public/cooperate/js/*/*.js',
            config.soucePath+'public/cooperate/js/*.js',
        ])
        .pipe(uglify()).on('error', function(e){
            console.log(e);
        })
        .pipe(gulp.dest(config.distPath+config.vision+"/js/"));
});

改成这个样子

gulp.task('cooperateuglifyjs', gulp.series('cooperateclean', function() {
    gulp.src([
            config.soucePath+'public/cooperate/js/*/*.js',
            config.soucePath+'public/cooperate/js/*.js',
        ])
        .pipe(uglify()).on('error', function(e){
            console.log(e);
        })
        .pipe(gulp.dest(config.distPath+config.vision+"/js/"));
}));

Error: File not found with singular glob

升级完成,运行任务,在clean的时候报这个,并建议我用allowEmpty:true,于是变成这个样子

gulp.task("clean", function() {
    return gulp.src([config.distPath+config.vision, config.distPath+cdnNewVersion], {
        read: false,
        allowEmpty:true
    })
    .pipe(clean({ force: true }));
});

在移动的时候也可能出现这个报错,因为gulp4的新改造的流不允许出现空,所以在src的第二个参数里加入配置项

gulp.task('cacheJsComponentMove',function() {
    return gulp.src([
            config.distPath+config.vision+'/script/component/table-sorter.js',
            config.distPath+config.vision+'/script/component/picker.js',
            config.distPath+config.vision+'/script/component/privilege.js',
            config.distPath+config.vision+'/script/component/searchBar.js',
            config.distPath+config.vision+'/script/component/introSearchBar.js',
            config.distPath+config.vision+'/script/component/picker.min.js',
            config.distPath+config.vision+'/script/component/monthSwitcher.js',
        ],{allowEmpty:true})
        .pipe(gulp.dest(cacheOption.destPath+"/"+cdnVersion+"/script/component"));
});

The following tasks did not complete: default, del Did you forget to signal async completion?

在这里可以找到答案
https://www.liquidlight.co.uk/blog/how-do-i-update-to-gulp-4/
总之就是异步任务方面的问题,每个任务都需要return 返回流给到下一步

gulp.task('cooperateuglifyjs', gulp.series('cooperateclean', function() {
    return gulp.src([
            config.soucePath+'public/cooperate/js/*/*.js',
            config.soucePath+'public/cooperate/js/*.js',
        ])
        .pipe(uglify()).on('error', function(e){
            console.log(e);
        })
        .pipe(gulp.dest(config.distPath+config.vision+"/js/"));
}));

使用gulp4的新特性

发现gulp4的依赖做得确实更清晰了,不必要在每个任务里边都依赖clean,这个当时在做的时候就觉得很变态。这里有详细解释
https://blog.skk.moe/post/update-gulp-to-4/
https://www.zcfy.cc/article/the-complete-ish-guide-to-upgrading-to-gulp-4

series和parallel分别管理异步和同步,并不必每个子任务都注册task,直接用函数就可以了
如果是传统定义的task,那么在引用的时候加引号
如果是函数定义的,在引用的时候不加引号

最后把任务改造成这个样子

gulp.task('android', gulp.series(
    'clean',
    gulp.series(['uglifyjs','cssmin','htmlBuild','configBuild','imgMove'], gulp.parallel(copyStyle, copyScript,copyViews,copyImages))
));

gulp4的src规则

之前在移动文件的时候,src里边是这样的

gulp.task('secMove', function() {
    return gulp.src([
            "!" + config.default.distPath + config.default.vision + '/views/newsSubject.html',
            "!" + config.default.distPath + config.default.vision + '/views/newsList.html',
            "!" + config.default.distPath + config.default.vision + '/views/shortNews.html',
            "!" + config.default.distPath + config.default.vision + '/views/cardMoneyFlow.html',
            config.default.distPath + config.default.vision + '/views/*.html',

发现!的作用失效了,顺序要改成这样才是ok的

gulp.task('secMove', function() {
    return gulp.src([
            config.default.distPath + config.default.vision + '/views/*.html',
            "!" + config.default.distPath + config.default.vision + '/views/newsSubject.html',
            "!" + config.default.distPath + config.default.vision + '/views/newsList.html',
            "!" + config.default.distPath + config.default.vision + '/views/shortNews.html',
            "!" + config.default.distPath + config.default.vision + '/views/cardMoneyFlow.html',

最后一项有无逗号都是可以的。

移动端的sticky效果

效果展示

在ios和安卓上经常看到这种效果,可是在html5上却不常见
gif
(此代码来自https://segmentfault.com/a/1190000016709368)

其实用移动端的一个新特性是可以实现这个效果的,就是position:sticky
可是在canIUse上的兼容性列表里,可谓是惨不忍睹
image

通过测试,发现安卓下原生浏览器不行(预期内),而qq浏览器,微信浏览器,灯塔app内浏览器(x5核心)均可完美支持。
而ios下需要这么写
position: -webkit-sticky; position: sticky;
然后safari,qq浏览器,微信浏览器,灯塔app内浏览器(UIwebkit核心)就全可以支持了

所以结论是移动端的支持度还是很高的

解决方案

好在我在canIUse的resource里翻找的时候发现了2个pollfill
一个是stickybits https://github.com/dollarshaveclub/stickybits
一个是stickyfill https://github.com/wilddeer/stickyfill
国内作者也有写过解决方案,可是他说他废弃了
https://github.com/filamentgroup/fixed-sticky
还有一个是jquery插件的
https://github.com/webpop/jquery.pin

滚动页面到指定元素

我们现在讲的都是在手机端,滚动的时候,一定需要带上视觉上的滚动效果,那种瞬移的直接就把用户搞懵逼了。

原生h5有一个很好的东东可以支持,叫做scrollIntoView
对此,英文文档有很好的解释https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
这里是网页的截图
image
很美好有木有!又是对齐,又是smooth滚动。

可是,可是来了,实测结果是ios11下safari,qq浏览器没smooth滚动效果,pc上的chrome倒是挺爽

无奈只能放弃自己来了

pageScrollTo:function(options){   //duration,targetId,offset
        if($('#'+options.targetId).length===0){
            return;
        }
        var targetOffset=$('#'+options.targetId).offset().top+options.offset;
        var nowOffset=getScrollTop();
        var step=(targetOffset-nowOffset)/options.duration*20;

        function smoothScroll(){
            if(nowOffset+step>targetOffset){
                setScrollTop(targetOffset);
                return;
            }
            nowOffset+=step;
            setScrollTop(nowOffset);
            setTimeout(function(){
                smoothScroll();
            },5);
        }
        function getScrollTop(){
            var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
            return scrollTop;
        }
        function setScrollTop(scroll_top) {
            document.documentElement.scrollTop = scroll_top;
            document.body.scrollTop = scroll_top;
        }
        smoothScroll();
    },

原理就是每隔一段时间去设定document.documentElement.scrollTop,经测手机端完美,不过pc下还玩不转。

调用的时候是这样的,offset不是必填项,

$.pageScrollTo({
    targetId:‘vipBox’,
    duration:1000,
    offset:-100
});

小白买zen流程

今天是2018年8月21日
目前在https://coinmarketcap.com/上zen排名74

image

跟着这篇教程买zen,可走向人生巅峰,推理过程太长,不解释
图片文字如果看不清可以按住ctrl后按+放大看

1.买 vpn

点这个地址买vpn
1

2.购买支付完成后,开始下载客户端,以windows为例,mac流程类似

https://portal.shadowsocks.to/index.php?rp=/download/category/1/Shadowsocks-.html
2
shadowsocks是软件,pac是配置文件,pac文件放在shadowsocks解压后的目录里

3.安装软件,下载配置文件

3
4
下载到配置文件,同样也放入shadowsocks解压后的目录里,最后结果是这样的,exe是运行程序,把pac.txt和gui-config.json放入后,即可双击执行

5

4.运行shadowsocks

这是shadowsocks运行后的样子

6
首先启动系统代理
然后服务器里可以自行切换服务器,用倍率1.00以上的会比较快,可自行试验
成功后即可在浏览器里访问到google.com了

5.上huobi买币

https://otc.huobi.com/#/trade?coin=1&type=1
首先上来先注册,注册流程就不说了,慢慢弄,然后注意需要完成实名认证

7
购买btc,注意限额和单价,选单价最便宜的,但单价最便宜的可能最少交易额是1w,自己权衡。

然后就是交易过程

8
交易和淘宝的概念是一样的,首先下单,下完单,对方的币就被火币锁定了,这时轮到你付款,付款正确的数额到对方的支付宝或者银行卡(注意写参考号,对方更容易识别到你),然后对方看到后会点击放行,然后你买到的币就会进入你的账户了。

6.转币到火币的币币账户

接下来把法币交易账户里的btc转到币币交易账户,因为最终我们需要在币安才能买到zen。

9
10
注意是从法币账户转到币币账户

7.注册币安帐号,得到充币地址

https://www.binance.com
上币安注册帐号,注册完同样需要完成实名认证。
然后在资产管理里得到btc的充值地址

11

8.火币提现btc到币安

然后就来到火币的币币交易
https://www.huobi.com/zh-cn/

12
13
提币地址填币安的充币地址,我们在步骤7已经得到了币安的btc充值地址,这里填入就好了。

9.币安买zen

买zen,目前一个zen需要0.003409个btc,当然是这个值越低,买到的zen越多咯!

14

在github的issue里写blog是一种怎样的体验?

原来在github里写markdown是一件特别爽呆的事情

之前也玩过markdown,可是一直找不到用武之地,原来最大的用武之地实在github里。。
花半个小时即可学会基本的语法,然后发两遍评论就可以学会了

  • 标题从一个'#' 到6个'#',分别是从大到小,注意#后边要空格,否则就是reference别的issue了
  • 贴代码最开始用编辑器里的insert code,发现不好用,大段的帖进去它就懵逼了,正确做法是整理好代码格式,直接帖进去,帖进去的时候保证4个空格tab即可自动转成代码了
  • 引链接最省事的方法就是写链接地址,它会自动转的,保证格式为‘http://‘开头即可
  • 图片直接截图后粘贴进来,很方便
  • 主要功能到这里就搞定了,文字标题,贴代码,贴图,贴链接,都可以很快实现
  • 接下来就是次要功能,ul ol列表书写,table,插入emojo表情cheat,@某人,都属于不太常用的功能,不知道问题也不大,能用起来可以加分

用issue做blog的优点:

  1. 稳定,无需域名空间,不花钱
  2. markdown格式贴代码,看起来很舒服,这个在有道云笔记里起码是做不到的
  3. 利于分享,自带评论与社交属性
  4. 可自行定义lables,然后根据lables查看,相当于分类了
  5. github自带所有issue的全文搜索,这个屌爆了有木有~!
  6. 无需门槛,是个人,注册即可用
  7. 支持编辑历史查看,这个屌爆了有木有~!

缺点:

  1. 不可以自定义外观风格(我就觉得宽度小了点,只能自行ctrl++调整浏览器字号了)。这个问题可大可小,如果是设计师会觉得这里是什么鬼地方~
  2. 略慢。这个毕竟不像访问国内服务器秒开,不过也还挺过得去啦!

[程序员康复]上交叉综合症

相信只要从事了好多年开发的同学或多或少都有肩颈的问题
而我目前是我们公司里最严重的那一位。
严重到什么程度呢?肩的问题严重到抬手拖衣服都做不了,颈的问题严重到寰椎半脱位(不能转头点头)
形成的原因是长期的姿势不正确,而姿势的不正确过了一个临界点后,就会进入恶性循环,不正确的姿势会加重错误的姿势,形成错误的肌肉不平衡,进而导致进一步的不正确姿势。
而解决这个问题,实际上是一个逆水行舟的过程,一个5年10年的习惯或者说沉疾,也必须有一个过程来纠正,首先要打破旧有的习惯,然后就是重建新的习惯。

上交叉综合症的表现

image
上交叉综合症Upper-crossedsyndrome (UCS)也被称作近端或肩带综合症。从图中可以看到,上交叉综合症症表现为头前伸、颈椎前凸增加、圆肩等。这种状态下,人很难呈现一个较好的精神状态。简简单单一个姿势,背后凸显的确是肌肉肌力不平衡的种种问题。
过紧的肌肉(胸大肌、胸小肌、背阔肌、肩胛提肌、斜方肌上束、胸锁乳突肌、斜角肌)和过弱的肌肉(菱形肌、斜方肌中下束、前锯肌、使肩外旋的肩袖肌群、深层颈屈肌)形成交叉线,强弱肌会引起一系列的形体变化,进而造成颈肩部肌肉酸痛、胸背疼痛、头痛头晕、手臂麻木、肩部损伤、心慌胸闷、呼吸不畅、便秘等问题。

如何检测是否有上交叉综合症

来做一个动作:身体站直,背靠墙壁,两肩打开靠墙,臀部紧贴墙壁。注意观察头部是否碰到墙壁,若没有,说明你的头部姿势前倾,则很可能是因为颈部肌肉较弱。这不是平常“注意”一下就能解决的了,需要平衡肌肉力量。

上交叉综合症纠正训练

重点是拉伸以下肌肉:胸大肌、胸小肌、枕下肌、斜方肌上束以及肩胛提肌。

1、斜方肌上部拉伸

左手放置于头部右侧,慢慢将头部右(左)侧移动,直到颈部左侧感到明显的拉伸感即可。将脸部转向右侧肩膀,使颈部持续感受到拉伸感。保持该动作不变,持续30秒后换另一侧。重复3组。
image

2、背阔肌拉伸

抬起右手,左手握住手腕向左侧转动,然后下压,感受背部拉伸感即可,保持30秒,30s后换另一侧。重复3组。
image

3、胸肌拉伸

保持一侧手臂的前臂放于固定物上,然后身体重心缓慢向前压,以拉伸胸部肌肉,保持这个动作30秒,然后换另一侧。重复3组。
image

4、背部肌群锻炼(中下斜方肌、菱形肌、竖脊肌)

俯卧,呼气挺胸,同时肩关节向后运动,头部跟着身体一起抬离地面,在最高点保持1秒,吸气缓缓回到初始位置,一组15个。重复3组。
image

5、背部肌群锻炼(中下斜方肌、菱形肌)

俯身,双手水平打开,大拇指方向朝上,呼气将胸腔抬离地面,同时肩胛肌肉收紧使双手向上抬起,每组保持30秒,完成3-5组。
image

我的感悟

  • 靠盲人按摩可以缓解病痛,但无法根治,根治要靠建立新的肌肉平衡,要靠主动运动
  • 这个就像减肥一样,通过跑步可以减肥,一旦停止消耗又会长胖,不如花力气增肌,基础代谢高了,自然不易胖

对w-3不饱和脂肪酸的常识总结

脂肪

  1. 脂肪是人体的三大供能营养素之一,对人体有许多重要的生理作用。
  2. 人类大脑的60%是脂肪,而脂肪的成分中大于90%是脂肪酸。
  3. 脂肪酸可分为饱和脂肪酸、单不饱和脂肪酸和多不饱和脂肪酸,
  4. 富含单不饱和脂肪酸和多不饱和脂肪酸组成的脂肪在室温下呈液态,大多为植物油
  5. 以饱和脂肪酸为主组成的脂肪在室温下呈固态,多为动物脂肪,如牛油、羊油、猪油等。
  6. 深海鱼油虽然是动物脂肪,但它富含多不饱和脂肪酸,如20碳5烯酸(EPA)和22碳6烯酸(DHA),因而在室温下呈液态
  7. 多不饱和脂肪酸中ω-6系和w-3系含有人体的必需脂肪酸,也就是人体无法合成而,必须从食物中获取的脂肪酸。
  8. ω-6PUFA的学名叫做ω-6脂肪酸,属于多不饱和脂肪酸。
  9. ω-6多不饱和脂肪酸”就是一种人体必需的不饱和脂肪酸,主要含有亚油酸(LA)、花生四烯酸(ARA)等成分。

ω-3脂肪酸

  1. 人体利用ω-3脂肪酸来帮助维护全身75万亿个细胞的细胞膜,使它们保持完整和发挥正常的功能。
  2. 它维护着我们的头发、指甲、关节和皮肤的健康。
  3. 因为我们的身体到处都用得着它,所以它不会以脂肪的形式堆积起来。
  4. 地球上任何一种脂肪都不会像ω-3脂肪那样受到我们身体的欢迎和利用了。

DHA,EPA

dha和epa属于w-3脂肪酸,是w-3系的突出代表

EPA

• 降低甘油三酯和低密度脂蛋白胆固醇,从而降低血脂,预防动脉硬化;
• 减缓血小板的凝集,延缓血栓形成,预防心血管疾病的发生。

DHA

• 减轻视力衰退的程度。
• 增强记忆力。
• 降低血中胆固醇。
• 抑制血小板凝集。
• 调节血脂。

食物来源

  1. 母乳。初乳中DHA的含量尤其丰富。不过,母亲乳汁中DHA的含量取决于三餐的食物结构。日本的母亲吃鱼较多,乳汁中DHA含量高达22%,居全球第一;其次为澳大利亚,约为10%;而美国最低,仅有7%。
  2. 海参。海参含有丰富的营养成分,其中DHA就是其中之一。在孕妇怀孕期间需要摄入DHA供给胎儿发育,因此,很多孕妈妈都食用海参进补,而海参作为一种绿色天然的海洋滋补品也不负众望。 [6]
  3. 配方奶粉。指添加DHA的配方奶粉。 奶粉所谓的添加DHA的含量是极少的。
  4. 鱼类。DHA含量高的鱼类有鲔鱼、鲣鱼、鲑鱼、鲭鱼、沙丁鱼、竹荚鱼、旗鱼、金枪鱼、黄花鱼、秋刀鱼、鳝鱼、带鱼、花鲫鱼等,每100克鱼中的DHA含量可达1000毫克以上。就某一种鱼而言,DHA含量高的部分又首推眼窝脂肪,其次则是鱼油。
  5. 干果类。如核桃、杏仁、花生、芝麻等。其中所含的α-亚麻酸可在人体内转化成DHA。
  6. 藻类。藻油是直接从海洋藻类中提取出来,含量高,未经过食物链传递,没有重金属污染,不含EPA,安全易吸收。
  7. DHA制品。世界卫生组织(WHO)、世界粮农组织(FAO)、国际脂肪酸和类脂研究学会(ISSFAL)及美国妊娠协会一致推荐孕产妇食用高品质的鱼油DHA制品,并含有适量保护心脏的EPA,其中DHA与EPA的含量必须大于4:1。
  8. 蛋黄里面含有微量的DHA ,吃普通鸡蛋无法起到补充DHA的作用。
  9. 稀有植物油。如只适合生长在**巴马的巴马火麻, [7] 原生长在南美洲安第斯(Andres)山脉的热带雨林地区的南美油藤(星油藤) [8] ,这两种植物所提取出来的植物油所含的α-亚麻酸和α-亚油酸可在人体内转化成DHA和EPA。

大部分的人认为鱼类才是DHA的直接来源。而事实上,鱼自身无法合成DHA,是鱼类食用了富含DHA的藻类,而藻类中的DHA通过食物链的传递在鱼体中累积才使得鱼类成为人类补充DHA的一种重要的饮食来源。

α-亚麻酸系列

  1. α-亚麻酸在紫蘇籽油中占64%,在亚麻籽油中占55%,在沙棘籽油中占32%,在大麻籽油中占20%,在菜籽油中占10%,在豆油中占8%。

  2. 通过给大鼠α—亚麻酸饲料、ω-6系列红花油饲料及普通饲料,来比较其对血小板聚集能的程度。结果表明,ω-3 α—亚麻酸较另两组明显抑制血小板聚集能(P<0.02)同时抑制了血清素的游离能(P<0.05)。流行病学调查表明,爱斯基摩人心肌梗塞和脑梗塞比丹麦人明显的少,不到其十分之一。丹麦是酪农国家,吃动物类食品多。与此相反爱斯基摩人把鱼类及以鱼类为食物的海兽类作为主食。因动物性食品中亚油酸多。 而海洋性食物中α—亚麻酸多。 日本渔村和山村亦有同样的调查结果出现。

  3. EPA和DHA都是α-亚麻酸代谢过程中非常重要的中间代谢产物,在人体的生命活动中起着非常重要的生理作用。

  4. 存在一个误区,那就是补充DHA要比补充α-亚麻酸好,其实这是不正确的,这主要源于人们对α-亚麻酸的认知不够。

  5. α-亚麻酸进入人体后,在酶的作用下,依次生成EPA、DHA,这个过程是不可逆的,也就是说α-亚麻酸比DHA所具有的功效更丰富,所起的作用更全面。而且,当α-亚麻酸进入人体后,人体可以根据自身的需要,合理的进行代谢,只要α-亚麻酸的量充足,机体需要多少DHA就可以补充多少DHA,而多余的α-亚麻酸还可以代谢成EPA等其他物质,完成其他生理功能,DHA则不具备这样的特点,补充了过量的DHA会带来负面影响,如免疫力低下等。

  6. 所以,补充以植物油为载体的α-亚麻酸,要比直接补充DHA更全面、更安全、更科学。

亚麻籽油

注意事项

  1. 低温保存:开瓶之后将亚麻籽油储存在冰箱中。
  2. 容易氧化:开瓶之后,尽可能短的时间内将油用完,并注意每次用完之后将瓶盖盖好。
  3. 避光保存:避免置于温度过高或阳光直射的地方。
  4. 不需加热:食用亚麻籽油时可以不进行加热,如若加热也不适宜加热过久,以免破坏其营养成分。

亚麻籽油的选择

  1. 淘宝能看到的亚麻籽油中,很多a-亚麻酸含量为56.9%,算是一个不错的成绩了
  2. 淘宝某家亚麻籽油店铺有2项专利,分别是物理冷榨和脱蜡的专利
  3. 物理冷榨一般来说成品率低,这个冷榨专利提高了成品率
  4. 亚麻籽油中蜡的存在会导致久放后有沉淀物,并影响人体对亚麻籽油中营养物质的吸收
  5. 此脱蜡的专利不是利用蜡的结晶特性,转而利用蜡的极性特性
  6. 带来的结果是之前费劲心机,重型投入设备,含蜡60mg/kg,新工艺含蜡降至 0.3mg/kg 以下
  7. 所以衡量亚麻籽油工艺的水准可以看久放后沉淀物的多少

亚麻籽油脱蜡专利

image

亚麻籽油压榨专利

image

自己的结论

  1. dha和epa保健品主要来源是海藻油和深海鱼油,海藻油的缺点是没有epa,深海鱼油的缺点是有被重金属污染的潜在风险,并且价格贵,因为他有一个名字叫保健品
  2. dha和epa如果补充过量会带来副作用,影响免疫力。
  3. 亚麻籽油中的a-亚麻酸可以代谢成dha和epa,并且不会过量,因为身体会自我调节dha和epa的产量
  4. 100元可以买到的亚麻籽油为500ml,可以买到的dha/epa鱼油为100粒
  5. 如果说每日需要补充某种营养物质,那一定是亚麻籽油莫属了,每天20ml即可满足成年人的营养补充需求

[健身]ATHLEAN-X 学习之翼状肩胛

发现youtube上ATHLEAN-X真心不错,官方达到了900多万的订阅量,中文翻译的也是很多,决定把所学所用的感悟记录下来,用输出来增进输入。
安利一下youtube,这个东西如果你还没看过,那你就out了,赶紧跟我来,先买个翻墙的梯子#6
另外,如果你不想翻墙,bilibili也是一个替代品,优点是比翻墙快,弹幕评论风景靓丽,缺点是外文资料没有youtube丰富。毕竟他是二手的,很多都是youtube上搬运过来的,你可以称他为油管搬运工。
在某个课题上我会搜集很多资料进行记录,在这里我充当的是kk所说的过滤器的作用,直达有效信息。

翼状肩胛

链接 https://www.bilibili.com/video/av10574095?from=search&seid=2610437774313687484

翼状肩胛的成因

出现翼状肩的主要原因是,因为前锯肌和斜方肌失去力量或过弱,使肩胛骨失去了贴胸的作用力。当上臂运动使肩胛骨旋转时,它就可以出现因脊柱缘失去牵拉而翘起,形成像翅膀一样形状的畸形

翼状肩胛的危害

当我们出现翼状肩胛时,就会使肩部无力、容易疲劳,在上举手臂、推拉重物时肩胛会有不适感,肩、背容易疼痛,关节活动一定程度受限。

  • 如果前锯肌损伤较严重,会引发患者胸痛,且在深呼吸时疼痛加重(前锯肌是辅助吸气肌),患者会感觉肋部疼痛;
  • 上交叉体态下,前锯肌容易无力,而胸长神经走行于前锯肌之上,可以引起前锯肌表面的筋膜卡压;
  • 发生前锯肌筋膜综合征后,患者会反映“气短”或不能深呼吸,在说话时很难一口气讲完一句话;
  • 做肩胛骨前伸动作时,疼痛加剧。肩肱节律很容易受到前锯肌损伤的干扰。
  • 如果前锯肌不能很好地稳定肩胛骨在胸廓上的位置时,肩胛骨就会乱动,容易造成肩关节撞击综合征。
  • 前锯肌短缩和功能降低,很容易使背阔肌过度使用而劳损,还会使斜角肌、胸锁乳突肌等颈部呼吸肌超负荷。因此,如果前锯肌的损伤没有被完全解决,患者的背痛问题就不可能彻底解决。虽然前锯肌损伤也会引起其余颈部辅助呼吸肌的过度收缩,但是膈肌损伤所导致的呼吸代偿更为常见。

前锯肌

https://tv.sohu.com/v/dXMvMzE1NjYyNzgxLzg5Mjg5MzI2LnNodG1s.html
这个3d动画很好地展示了前锯肌的分布,知道了这个原理就能想明白怎样才能锻炼到它
同时这个系列的3d动画都特别好,比图展示更容易理解

改善方法

第一个方法是臀部固定在墙上,手臂前伸
1111

第二个方法
222222

第三个方法是摘苹果
333333

第四个方法是伏地拉伸
444444

第五个方法是转墙
5555555

翼状肩胛扩展阅读

翼状肩胛——害我“驼背” (这一篇图文讲解深入浅出,还有治疗方法)
https://baijiahao.baidu.com/s?id=1568521450121778&wfr=spider&for=pc

饮食问答

1.健康的早餐怎么配?还要能在30分钟内做好吃完的那种

首先列出一个食材选择,
主食:小米粥,粗粮馒头,荞麦面,干焙土豆丝为
配菜:荷包蛋,凉拌莴苣/木耳,番茄炒蛋,豆浆,拌三丝,黄瓜
坚果:开心果,花生,巴旦木
水果:苹果,蓝莓,橘子,火龙果

2.不能在家吃饭时怎么弄?

买个小熊电饭便当,可以煮饭,在公司里备好米,小米,藜麦,煮好饭后买大米先生的菜回来吃

3.有哪些好的能提供植物蛋白质的食物?

豆腐,鹰嘴豆,坚果

4.有哪些好的抑制肿瘤生长的食物?

对《救命饮食》的思考

2018年春节过完,随即检查出颌下腺肿瘤,手术前期,我和身边亲人朋友都很担心恶性肿瘤的发生,手术后,结果显示是良性肿瘤,虽然也留下了嘴歪后遗症,可是心情还是很好,因为我不用成为抗癌斗士了。
可是我的思考并没有结束。至始至终,医院没有对肿瘤的形成没有一点解释,并对今后的预防也没有任何说明,学过中医**的我对这种境况是相当不满意的,对肿瘤这种疾病没有一点有效的预防和控制手段会让我如坐针毡,因为我真的再也不想动手术了,因为手术只是把疾病的果子摘了,病因不明,何谈治疗?如果过不多久我别的地方又蹦出一个肿瘤怎么办?更何况身上还带着肾结石,健康的风险时刻都在提醒我。这应该是一种体质疾病,我必须改变体质大环境。

平时的生活习惯自认为做得不错,每天步行都保持在1w步以上,每天有两个工作间隙锻炼健身,不久坐,无不良嗜好,一周游泳至少3次,那为什么肿瘤还会发生在我身上,肾结石也一点都没有好转?我在北京有一段时间肾结石发生过逆转,去医院检查医生说没有结石,有一点积水,这说明是有方法的,那段时间我就是在饮食上吃得比较清淡,少吃盐,然后一直在变瘦。

所以我开始对饮食加紧研究,《谷物大脑》,生酮饮食,地中海饮食,《如果活过一百岁》,直到看到《救命饮食》,发现果然问题真的就出在这里。

救命饮食颠覆三观

作者柯林•坎贝尔坎博士,康奈尔大学终身教授,被誉为“世界营养学界的爱因斯坦”,四十多年来一直身处营养科学研究的最前沿。他还是最强致癌物“二恶英”的主要发现者。1982年6月,他为美国国家科学院撰写的报告——《膳食、营养与癌症》发表后,震惊了全美国。1983到1989年,在美国康奈尔大学、英国牛津大学、**疾病预防与控制中心,以及**医学科学院肿瘤研究所等多家中外权威机构精诚合作下,坎贝尔教授领导其团队在**的24个省、市、自治区的69个县开展了三次关于膳食、生活方式和疾病死亡率的流行病学研究。

doc版本下载链接

http://vdisk.weibo.com/s/zuXLAHGbWoYnj

pdf版本下载链接

https://pan.baidu.com/s/1Lvh2wXbq42nTjzpmS0nukA

如果以上都失效了可访问此地址然后搜索“救命饮食”

https://www.jiumodiary.com/

《救命饮食》一书就是研究的成果是:动物蛋白(尤其是牛奶蛋白)能显著增加癌症、心脏病、糖尿病、多发性硬化病、肾结石、骨质疏松症、高血压,自内障和老年痴呆症等的患病几率。而更令人震惊的是:所有这些疾病都可以通过调整膳食来进行控制和治疗。

书中有大量的膳食控制对照组试验,证实大量摄入动物来源食物是促成疾病的强关联因素,而通过膳食控制,可以逆转心脏病,冠心病。下边是试验:
1.黄曲霉素致癌
在这个试验中,试验者比较了两组动物蛋白质摄入量和癌症发病率之间的关系,其中一组试验动物饲以黄曲霉毒素和含20%蛋白质的饲料,另一组给予同样剂量的黄曲霉毒素和含5%蛋白质的饲料。摄入20%蛋白质饲料的这组大鼠都发生了肝癌,或癌前病变;而摄入5%蛋白质饲料的这组大鼠,没有任何一只发生肝癌。这并不是一个细微的差别,这是个100对0的差别,而这个结果和我在菲律宾儿童中观察到的现象是吻合的。

这也解释了我肾结石的成因,和我平时爱吃肉有莫大的关系,我几乎每餐都有肉。

改变饮食的思考

对比和思考了很多饮食方案,比如低碳饮食,生酮饮食,发现这些都不能作为长期使用的饮食方案。
而我们平常所说的均衡膳食在我看来都不甚满意
地中海饮食是一种健康的饮食,这种饮食方案的结构是这样的
image

制定饮食原则

参考地中海饮食,制定出我自己的饮食原则:

  1. 少油,少盐
  2. 全谷物为主食,包括红薯,土豆
  3. 橄榄油为主油,自榨亚麻籽油补充欧米伽-3的摄入,各种渠道避免油氧化(黑瓶子,冰箱存放)
  4. 通过豆类补充蛋白质和脂肪
  5. 使用地中海饮食中的动物食物频率控制,鱼每周4到5次,禽蛋每周一次,红肉一个月一次
  6. 戒纯糖食物,禁深加工食品,精米精面少吃

这种吃法看似很贵,超出了平常饮食的花费,实则非常便宜,因为减少了肉的开支,减少了零食的开支,减少了外出吃饭的开支,并大大减少去医院的开支的概率,医院的成本是一天至少一千元,去个几次这些吃的东西全可以买回来了。

选择食材 °表示网购方式可以买到质量更好的食材

主食

小米 ° 米脂县小米
糙米 ° 黑龙江糙米(注意重金属污染)
藜麦 °
荞麦
粗粮馒头 °
红薯 ° 恩施红薯
土豆 ° 恩施土豆
山药

蔬果

番茄 ° 有机番茄
蘑菇,木耳等菌类 °
茄子
西蓝花
胡萝卜
黄瓜

豆制品

豆腐
千张
甘子
鹰嘴豆 °

坚果

巴旦木 ° **巴旦木
开心果 °
花生 ° 恩施花生
板栗
榛子 °
杏仁 °
芝麻

油脂

橄榄油 ° 买大桶装更优惠
亚麻籽油 ° 自榨更优惠健康(容易氧化,避免高温,避免光照,避免空气接触)
芝麻油

动物食物

带鱼,鲈鱼,鲫鱼,草鱼等鱼类
鸡蛋

水果

苹果
蓝莓
柠檬
橘子
橙子

制定菜单

image

实战总结

早餐
小米粥,杂粮馒头,窝窝头,红薯,土豆
米酒
炒青菜
水煮蛋
炒面
难度挑战
蛋饼
https://www.xinshipu.com/zuofa/763868
营养粥
https://www.xinshipu.com/zuofa/223083
薄饼早餐卷
https://www.xinshipu.com/zuofa/13702
创意三明治、面包早餐
https://www.xinshipu.com/zuofa/636068
土豆鸡蛋饼,西葫芦糊塌子,韭香虾米鸡蛋饼,迷你豆沙南瓜饼,韭菜豆腐饼,菠菜饼,
http://www.allyfurn.com/jiankang/422.html

正餐
糙米饭,红薯

油麦菜,莴苣,花菜,茼蒿,黄瓜,白菜,茄子,红薯叶子,番茄,菠菜,茶树菇,西蓝花

胡萝卜,土豆,木耳,豆腐,芋头

清蒸鲈鱼,豆瓣鲫鱼,红烧带鱼

配餐食物
橄榄油,亚麻籽,姜黄素,菌菇,柠檬,苦荞茶,炒米茶,豆豉,巴旦木,开心果,南瓜子,裙带菜

fiddler下ios和安卓安装https证书

fiddle如果要抓https的包,必须安装fiddler的证书,其中在ios下隐藏了一个巨坑,安卓下安装也是各种机器百花齐放,实为前端同学的必备技能

1.打开fillder后capture https connects然后decrypt https traffic勾选上

image

2.找到本机的访问地址,比如192.168.10.215:8888 端口号8888。 拿手机扫描这个地址的二维码,下载FiddlerRoot certificate文件。

image

从下边开始ios和安卓开始不一样了

ios

下载后会提示安装,按照提示安装就可以了,安装完成后,进入通用-关于本机-证书信任设置,针对根证书弃用完全信任里勾选 DO_NOT_TRUST_FiddlerRoot 即可

安卓

安卓机器版本高低不同造成的安装方法各异,有的可以顺手安装上,有的就很麻烦。
用默认浏览器下载后无法直接安装,需要在设置里找到从sd卡安装证书,浏览到目录download/fiddlerCert.cer 文件进行安装, 浏览目录是个比较考验耐心的过程,仔细找。
还有一个办法就是用搜索功能去搜。
有的机器安装证书需要设置密码或者手势图案,只能设置,否则安不上。

我收集的可以省钱,省时间的资源和方法

首先声明一点价值观,省钱并不代表不花钱,而是花出去的钱可以带来比本金大得多的价值,这个叫省钱。
所以有时花钱也是一种节省。时间成本不可不考虑,因为当今社会时间成本已经成为越来越不容忽视的成本。

★★★★
https://secure.shadowsocks.ch/aff.php?aff=16963
翻墙ssr,目前找到的最好用的shadowsocks,比vpn好用
这个是收费的,一年100左右,但实际上也是为你省钱省时间的,因为这里有非常丰富的资料供你学习
目前做很多事情都是基于shadowsocks的,youtube,twitter,google,各种学习资料,chrome插件,没有ss的话已经不知道怎么生活了。

★★★★
https://www.jiumodiary.com/
鸠摩搜书 感觉有着一个搜书的就够了,可以在主要书籍和共享平台搜书,一个字全!

★★★★
https://www.dadatu.co/
达达兔看电影,美剧啥的,《行尸走肉》好多季都是在这里看的,不用再到处找了,手机上看也是爽呆呆的

★★
http://lackar.com/aa/
AnywhereAnything 在多个垂直领域快速搜索,省时间

★★
http://www.aigei.com/sound/
很全的音效网,当你搜不到音乐素材的时候用这个很方便,免费

★★
https://www.easyicon.net/
偶尔需要用图标的时候上这里找即可,免费

★★★
youtube的英语节目不是没字幕也听不懂吗?
其实可以在设置里选择自动字幕,这样既可以学英语又可以学知识啦!

★★★
百度网盘里的资料下下来看好费劲,
其实完全可以下载百度网盘app在app里在线看,方便快捷!
你要做的就是购买百度超级会员,这个钱可以换回无比多的时间

★★★★★
https://www.yunpanjingling.com/
云盘精灵,在这里可以找到很多有价值的资料,由于有商业模式,所以贡献出来的资源质量会相对较高,2.5元就可以有100个豆,而每个豆都可以下到一个资源。
这些资源包括喜马拉雅很多收费资源,得到收费资源,基本就是一个资源大库
image

★★★★★
http://pandownload.com/index.html
pandownload比云盘精灵更牛逼,只要搜到的就可以下了,搜索结果界面没有云盘精灵好,但是只要拿云盘精灵里的关键字去pandownload里搜还是可以搜到的,这些连云盘精灵的豆都省了
pandownload的另一个优点是可以不限速下百度网盘里的东东。

★widegithub
这是一个github插件,让github变成全屏,简单好用。
https://chrome.google.com/webstore/detail/wide-github/kaalofacklcidaampbokdplbklpeldpj

学习总结的营养学观点

1.精米精面会损害健康,还可能导致糖尿病等各种疾病,因为升糖指数高,又是主食

2.动物性食物比例过高的饮食习惯是造成心脏病,糖尿病,癌症的主要原因

3.糖是有百害而无一利的食物,多糖除外

4.现代人健康油脂欧米伽-3的摄入不足,是营养缺乏的重灾区,可通过亚麻籽油,深海鱼油补足。其中深海鱼油有重金属超标的威胁,植物油更安全

5.心脏病,糖尿病完全可以通过膳食控制逆转

6.牛奶会极大提高患乳腺癌的风险

7.糙米营养价值比大米好太多

  • 糙米中钙的含量是白米的1.7倍,含铁量是2.75倍,烟碱素是3.2倍,维他命B1高达12倍。糙米中的维生素E是白米的10倍,纤维素高达14倍
  • 保留了大量膳食纤维,可促进肠道有益菌增殖,加速肠道蠕动,软化粪便,预防便秘和肠癌
  • 膳食纤维还能与胆汁中胆固醇结合,促进胆固醇的排出,从而帮助高血脂症患者降低血脂。
  • 日本研究证明,糙米饭的血糖指数比白米饭低得多,在吃同样数量时具有更好的饱腹感,有利于控制食量,从而帮助肥胖者减肥

发芽糙米

  • 发芽糙米是一个酶被激活、释放的多酶系,发芽后的糙米营养发生了急剧变化,以游离状态发芽激活了酶从而释放出更多营养。发芽糙米芽体是具有旺盛的生命力的活体,它载有各种活性酶,以游离状态存在的微量元素,丰富的维生素,膳食纤维,多种体内抗氧化物质,肌醇六磷酸盐(IP-6),谷胱苷肽(GSH), γ -氨基丁酸 (GABA)。
  • 发芽糙米含有较多的生育酚、三烯生育酚。它可防止皮肤氧化损伤、保持皮肤细胞中VE的正常水平,抗血管硬化、对抑制癌细胞增殖有协同作用。

吃糙米的注意事项

  • 应该选择有机糙米,否则有农药残留和重金属超标的风险

[d3js] 在图表里画渐变area

效果如下

image

目前我知道的方法有些小麻烦,还未有时间寻找简便些的方法

实现步骤

1.在d3画area的时候插入class锚

image

2.在css样式里通过id指定到html结构里的svg

.d3_chip path.area_k { fill: url(#areaGradient); }

3.在html结构里插入svg,在html里设定svg的渐变class

<svg>
	<defs>
	<linearGradient id="areaGradient" x1="0" x2="0" y1="0" y2="1">
		<stop class="area_top" offset="0%" />
		<stop class="area_bottom" offset="100%" />
	</linearGradient>
	</defs>
</svg>

4.对html里渐变的两个class设定颜色

.area_top{ stop-color: #C0E2F9; stop-opacity: 1;}
.area_bottom{ stop-color: #fff; stop-opacity: 1;}

[d3js] 指示线重合后标注的数字的处理

需求

给图表加指示线,看起来挺简单的一件事情哈,可是极限情况会遇到多个数值雷同,或者很靠近的情况,这样文字就会重叠,怎么避免这种重叠呢?
image

需求分析

一个简单的办法就是重叠时,上边保持不动,下边依次往下挪;也可以下边保持不动,上边依次往上挪
image

代码实现

调用的时候是这个样子的,需要标注的线就用line1,line2,line3传入,如果再多一点,也可以写成数组
image

在画图这里,push到一个数组里,这里要加入更详细的属性,入yScale后的真实值,line的样式,txt的样式,等等,然后进行一个从小到大的排序,排序后adjustPostioinDown就是递归实现一条线不动,其余的线依次往下挪。
这里的递归很重要,不用递归是达不到需求的,因为第三条线的变动依赖第二条线的变动最终值。
image

adjustPostioinDown的实现,和计算完成后的for循环画线和文字

image

新的问题

到这里,你觉得就结束了吗?too yong too native,在三个都叠加到最上,或者最下的极限情况下,还是会出现这种样子
image

怎么解决呢?那就再往上排一遍!
image

就顺利达到我们的预期
image

[d3js] 图表交互和上下滑动冲突的解决方案

问题描述

在h5里边,做过图表交互的同学,一定会发现它和上下滑动的冲突,就像这样
11111

意思就是在图表左右交互的时候,上下滑动也同时响应了,这样体验就比较不爽
理想的体验应该是当手指上下滑的时候,页面上下滑,此时并不触发图表交互;而左右滑的时候,页面上下滑是不响应的。

还不算完美的解决方案

时间有限,先做一个挫版的解决方案,效果如下
2222222

这个解决方案的思路就是首先禁止页面上下滑动,这时通过在图表交互时改变that.isChipInteracting的值,就可以控制是否禁止上下滑了

document.addEventListener("touchmove", function(e) {
	if (that.isChipInteracting) {
		e.preventDefault();
	}
}, {
	passive: false
});

image

这里要注意的是,原来的禁止页面滑动不好使了,第三个参数变了,要写成{passive:false}才行,因为默认值改成了不会调用 preventDefault 来阻止默认滑动行为,必须指定false,才可以阻止。这个优化的好处是可以提高页面的滚动效率。

时间的限制暂没有实现完美的效果,初步想的思路是判断图表在开始交互的时候手势是上下还是左右,如果是上下就禁止图表交互,如果是左右就禁止上下滑动。

参考阅读

[移动端新特性] Passive Event Listeners https://zhuanlan.zhihu.com/p/24385322

[健身]郝鹏飞极简健身总结

这本书是电子书里比较容易发现的一本,在我看来也是很有价值的,他给我的意义是,在不使用补剂(我也压根没打算用),不用整天泡在健身房,不请私教,不练器械的情况下,依然可以让上班族锻炼出很好的效果来,而且还是在他每周禁食24小时的情况下。
他和我之前看的《囚徒健身》有异曲同工之妙,实际上我觉得囚徒比极简对我的影响更为深刻,他们最大的亮点就是让你健身不太受限于时间和地点,任何时间,找一面墙,找一个单杠,找一个瑜伽垫即可。另一个就是无需私教指导动作。另一个就是安全不会受伤(要知道受伤对后续锻炼的影响是无比巨大的)。
而囚徒比极简优秀的地方是囚徒有打怪升级路径,这很像修炼武功,总共10层,一层一层练。
而极简有许多特色的地方,一个是重视拉伸,一个是重视有氧,一个是

郝鹏飞健身价值观

  • 抗组训练的成效,就是身体力量的变化,主要反映在对抗阻力的大小和完成动作难度两方面。
  • 如果普通人的肌肉要靠严格的营养控制,不断的刺激才能防止丢失,那么这样的肌肉不要也罢,我们不需要被“宠坏”的肌肉,毕竟健身对于很多人来说并不是生活的全部
  • 阻力训练分四种:自身重量训练,固定路径器械训练,自由重量训练,动态阻力器械训练。
  • 自身重量训练的好处:
    1. 动作符合人体运动轨迹和关节特性,不容易受伤
    2. 肌肉更易生长,锻炼出来的肌肉不容易丢失
    3. 简单易学,更加符合上班族的需要
    4. 动作变化多样,稍微变化形式就可以调整强度或是改变锻炼的身体目标部位,足以满足各类水平健身者的需要。
  • 固定路径器械训练

数组内每个项都是一个对象,对象里某个字段在数组内重复时,合并某个值的方法

image

如图所示,上边数组中sFpshname存在重复项,需求是当sFpshname重复时,合并lInvolvedsum项

调用是这样的

var belowDataCombined = this.combineAddDuplicate({
	data: belowData,
	duplicateKey: 'sFpshname',
	addKey: 'lInvolvedsum',
	addKey2: 'fPctofpledger'
});

合并方法是这样的

combineAddDuplicate:function(options){
    var data=JSON.parse(JSON.stringify(options.data));
    var duplicateKey=options.duplicateKey;  //重复的字段
    var addKey=options.addKey;              //需要相加的字段
    var addKey2=options.addKey2;              //需要相加的字段

    var map={};
    for (var i = 0; i < data.length; i++) {
        if(!map[data[i][duplicateKey]]){
            map[data[i][duplicateKey]]=data[i];
        }else{
            map[data[i][duplicateKey]][addKey]+=data[i][addKey];
            if(addKey2!=undefined){
                map[data[i][duplicateKey]][addKey2]+=data[i][addKey2];
            }
        }
    }
    
    var uniqueArr=[];
    for (var item in map) {
        uniqueArr.push(map[item]);
    }
    return uniqueArr;
},

npm 总结

更换源

将 Npm 的源替换成淘宝的源
npm config set registry http://registry.npm.taobao.org/
修改源地址为官方源
npm config set registry https://registry.npmjs.org/
如果不想这样永久地改变,可以给npm一个别名cnpm,npm源保持官方源,cnpm为淘宝源
npm install -g cnpm --registry=https://registry.npm.taobao.org

条目

  1. nodejs lts的意思是Long Term Support schedule

  2. nodejs包含npm,npm是nodejs的包管理器,npm主要处理各种依赖,安装时会把依赖的包一次性down好,更方便。

  3. npm-v 和node -v用来查看当前版本

  4. npm install npm@latest -g 用来装最新的npm版本。安装时竟然没有进度条?npm从5.7升到了6.4.1

  5. 用NVM,nodeist来作为node.js的版本管理器
    image

  6. npm install [email protected] 安装指定版本。安装好后,会自动把信息保持到package.json文件中

  7. 项目对模块的依赖

  • 兼容模块新发布的补丁版本 ~1.1.0 1.1.x 1.1
  • 兼容模块新发布的小版本,补丁版本 ^1.1.1 1.x 1
  • 兼容模块新发布的大版本,小版本,补丁版本 * x
  1. npm uninstall gulp --save-dev 写在模块在本地
  2. npm的start,stop,restart

image

  1. 发现中文文档有时真不如看英文看得全
    https://docs.npmjs.com/misc/config
    比如这里有所有命令参数的解释,而中文文档竟然是搜不到的
    image

  2. npm config set loglevel=http
    打开这个你会看到所有的 HTTP 请求,除此之外如果还有 \ 长时间打转,那就是外部模块的编译过程,一个字:等。

  3. npm vs yarn https://zhuanlan.zhihu.com/p/27449990
    npm的问题

    • npm install的时候巨慢
    • 同一个项目,安装的时候无法保持一致性

Yarn的优点

  1. 并行安装
  2. 离线模式
    • 安装版本统一
    • 更简洁的输出
    • 多注册来源处理
    • 更好的语义化

Yarn和npm命令对比
npm install === yarn
npm install taco --save === yarn add taco
npm uninstall taco --save === yarn remove taco
npm install taco --save-dev === yarn add taco --dev
npm update --save === yarn upgrade

  1. npm的未来:npm5.0
    有了yarn的压力之后,npm做了一些类似的改进。
  2. 默认新增了类似yarn.lock的 package-lock.json
  3. git 依赖支持优化
  4. 文件依赖优化

如何在手机上方便地播放pc上的mp3

此解决方案我在很早就已经有了, 可能安卓用户的播放器很多,把文件复制到手机也很简单;但ios用户就麻烦了,实际上ios下已经有解决方案,就是app store里的各种播放器,我目前用到最好的就是OPlayer
为什么要在手机里播放pc下载的mp3呢?
源自于罗胖的一本书叫《我懂你的知识焦虑》,里边有很大篇幅在讲王东岳的《物演通论》的**,当时看了后就觉得很有意思, 实际上要表达的就是熵增原理,而今在喜马拉雅上看到王东岳老师的最后一堂课了,讲完就说要去终南山归隐了,然后听了前边的试听的几集,他自己说会很枯燥巴拉巴拉的,而我听了几集就完全地迷上了,可是一看价格300还是有点贵的,正好我的收费群里冒出来了王东岳的这个音频,嘿嘿!
所以剩下的事情就是下载资源,弄到手机里播放了,以下是解决方案

app store里下载oplayer lite

这个很简单,就不说什么了

wifi传输,把pc的mp3拷贝到手机

下载完成后点击wifi传输,此时手机就开放了一个服务,可以被连接

_20181217094903

现在要保证pc和手机都处于同一局域网下,然后用pc下的浏览器,手动敲入地址,就进入了这样的界面

更加高效地解决此需求

后来发现用oplayer播放的需求是个伪需求,因为资源大多数都是在百度网盘里获取到的,直接下载百度网盘app播放即可,如果遇到播放卡顿的,下载下来播就好了,愉快!
接下来就是找资源的过程了,在这篇blog里有说过
#29

babylon学习之单词,颜色,轴,导入

架设环境

fis3在用来学babylonjs时还是会起到很强大的作用的,因为3d的东西需要的反馈量更大,所以即时反馈对于学习效率非常重要

单词

Mesh 直接翻译是网格的意思,但这里我认为是零件的意思
Sprites 直接翻译是精灵,我姑且翻成元动画吧,好像和flash里的元动画有点像
Particles 粒子
Axes 轴, 有world axes世界轴,local axes当地轴
longitudinal 经度 ,或者用alpha代表
latitudinal 维度,或者用beta代表
skeleton 骨骼

color3颜色定义

一上来就遇到了这句话
scene.clearColor = new BABYLON.Color3( 24/255, 255/255, 0/255);
color3的设值是我从未见过的,于是搜到babylon的api,找到了color3的定义
clipboard
这样我就会写了,取值后应该是这样写的,因为最大值是1,所以都除以255即可
scene.clearColor = new BABYLON.Color3( 24/255, 255/255, 0/255);

发现了几个简便用法,这两种是页面时代经常用到的,可能到了3d里边,就是rgb比较重要吧,感觉不太要求颜色精确度了
FromHexString
new BABYLON.Color3.FromHexString('#ff7736')
FromInts
new BABYLON.Color3.FromInts(24,255,0)
简便颜色,试验用
黑 Black
蓝 Blue
灰 Gray
绿 Green
品红 Magenta
紫色 Purple
随机 Random
红 Red
蓝绿色彩 Teal
白 White
黄 Yellow

语句

new BABYLON.Engine
new BABYLON.Scene
new BABYLON.Color3
new BABYLON.FreeCamera var camera = new BABYLON.FreeCamera("camera1", new BABYLON.Vector3(-4, 7, -16), scene); 三要素是camera名字,vector3位置,场景变量
BABYLON.Vector3
new BABYLON.HemisphericLight 周围光,传入的光是vector3,根据api定义是反射方向,不是进来的方向
new BABYLON.SpotLight 点光
BABYLON.Mesh.CreateSphere var sphere = BABYLON.Mesh.CreateSphere("sphere1", 10, 3, scene); 创造一个球体,参数里一个是名字,一个是精细度(越高越精细),一个是直径,一个是场景
BABYLON.Mesh.CreateGround
engine.runRenderLoop()
engine.resize()
scene.render()
camera.setTarget
camera.attachControl
light.intensity = 0.5; 光照强度0-2之间

坐标轴

坐标轴我觉得是得一上来就讲的,但是并没有,而是放在了position那一章才讲,通过调整位置来熟练,在大脑中形成长期记忆,才能不过多占用大脑资源,这样才可以做别的更高级的事情
https://doc.babylonjs.com/babylon101/position
image

极坐标轴

在arc rotate camera中会用到极坐标相机,所以这个极坐标轴的定义也是需要非常熟悉,通过不断调整值来体会并掌握
https://doc.babylonjs.com/babylon101/cameras#arc-rotate-camera
在极坐标里设定看这一张图就了解了
image
要注意的是,如果后续通过setPostion重新设定相机位置,那么这个设定的是vector3坐标,不再是极坐标了

导入元素

3d零件的格式五花八门,导入元素默认babylon是不需要loader的,其余都需要loader
https://github.com/BabylonJS/Exporters
.glTF
.babylon
.OBJ
.STL
image
image
网上下载的3d模型一般是3ds,或者blender格式的,优选blender软件(开源,功能强大,异军突起)
在exporters目录里可以找到blender的插件Blender2Babylon-5.6.zip装上后,就可以把blender里的东东导出为babylon了

[调试]如何调试已发布app中的页面

今天遇到这样的问题,公司给别人做的项目已经上线了,对方app也已经发布了,但页面出现了问题,而且还是和对方app交互的问题。

那么如何高效地在线调试然后修复这个问题咧?

  1. 拿出fiddler,手机代理设置好,https证书安装好。安装https教程点这里 #12
  2. 我们需要用到fillder中的AutoResponder,这里需要用到正则匹配到正式页面地址,代理到本地服务器,然后就可以本机随便修改了
    regex:https://sec.wedengta.com/wx/([\S]+)\.([html|js|css|gif|png|jpg|ttf]+)
    http://192.168.10.239:55552/wx/$1.$2

image

要修复的问题

问题是这样的,客户app可以在线配置是否保留title bar,之前是有title bar的,h5页面内嵌进去,很完美。现在客户app要把title bar去掉了,那么h5页面就得自己画title bar。 这还是次要的,还需要和app交互,完成返回和关闭的动作,还要兼容安卓,ios两端。
image

返回这里有两层动作,如果在顶层行为是退出,如果是二级页面行为就是返回上一层。
最开始想的是用window.history,这个值在ios下默认是1,以后每跳一层加1,而安卓默认是2,这个倒是可以通过判断浏览器搞定。可问题是跳一层后history+1再返回上层,history并不会减少,这样就起不到区别的作用了
接着是document.referrer 这个挺好用,ios下成功了,可是对方安卓下document.referrer一只是空,应该是和实现原理有关吧
那只能暂时用最土的办法了,通过判断url中文件名是否在一级页面列表中,这样做的弊病是以后有任何新加的一级页面都需要加进来。
image

[d3js] 用d3画图表做标注-重点在标注规避

这是需要做到的标注效果

image

制定规则

看到此图后,首先确定了几个规则
1.把图表分成上下两半,处于上半部的线和框显示在下方;处于下半部的显示在上方
2.按规则1显示后,如果遇到标签重叠,就把新画的框进行偏移,如果是往上画的就往上偏移一个固定值,如果是往下画的就往下偏移一个固定值
3.按照规则2做完后,如果超出图表的,只能让其超出,这是因为标签的承载是有限度的,因为有限空间内无法承载大于它能展示的标签数
4.默认框是处于线的右边的,但最右边的标签会显示到图表外,这时需要做判断,如果超出了就改变框的方向让其处于线的左边

初步实现

画标签需要画4个,1圆圈 2线 3框 4文字
这些很顺利地画出来了,接着就是做规避算法

我做的第一个版本,在规避的做法上,我是打了一个点后,记录这个点的位置和方向(这样就可以确定出box的四个角),后续来了新点就去和之前所有的点对比,如果发现有重叠,就进行偏移。
可是这种偏移只进行一次的话,发现是不够用的,应该是一直偏移,偏移到不在别的box中
image

//线只有上下的区别,如果y点在上方则往下画,如果在下方则往上画,还需要考虑规避情况
function getLineY(x,y){
    var direction=y>=yScale(yHalf)?'up':'down';
    if(direction == 'up'){
        y=y-lineHeight;
    }else{
        y=y+lineHeight;
    }
    y=avoidOverlay(x,y,direction);
    return y;
}
function avoidOverlay(x,y,direction){
    var box;
    var point={
            x:x,
            y:y,
            direction:direction
        };
    for (var i = 0; i < points.length; i++) {
        box={
            x:points[i].x,
            y:points[i].y,
            direction:points[i].direction
        };
        if(isInBox(box,point)){
            if(direction=='up'){
                point.y-=lineJumpHeight;
            }else{
                point.y+=lineJumpHeight;
            }
        }
    }
    console.log(x,y);
    points.push({
        x:x,
        y:point.y,
        direction:direction
    });
    console.log(points);
    return point.y;
}

//box宽高是40*17 
function isInBox(box,point){
    var xJudge=point.x>=box.x && point.x<=box.x+boxWidth;

    var boxY1,boxY2,pointY1,pointY2;
    if(box.direction=='up'){
        boxY1=box.y-boxHeight;
        boxY2=box.y;
    }else{
        boxY1=box.y;
        boxY2=box.y+boxHeight;
    }

    if(point.direction == 'up'){
        pointY1=point.y-boxHeight;
        pointY2=point.y;
    }else{
        pointY1=point.y;
        pointY2=point.y+boxHeight;
    }

    var yJudge1=pointY1>=boxY1 && pointY1<=boxY2;
    var yJudge2=pointY2>=boxY1 && pointY2<=boxY2;

    if(xJudge && (yJudge1 || yJudge2)){
        return true;
    }else{
        return false;
    }
}

于是用递归滴方法得到了第二个版本

image

//线只有上下的区别,如果y点在上方则往下画,如果在下方则往上画,还需要考虑规避情况
function getLineY(x,y){
    var direction=y>=yScale(yHalf)?'up':'down';
    if(direction == 'up'){
        y=y-lineHeight;
    }else{
        y=y+lineHeight;
    }
    y=avoidOverlay(x,y,direction);
    return y;
}

function avoidOverlay(x,y,direction){
    var finalY=avoidOverlayRecursion(x,y,direction);
    console.log('finalY',finalY);
    points.push({
        x:x,
        y:finalY,
        direction:direction
    });
    return finalY;
}

function avoidOverlayRecursion(x,y,direction){
    var box;
    var point={
            x:x,
            y:y,
            direction:direction
        };
    if(points.length==0){
        return point.y;
    }
    console.log(points.length);
    for (var i = 0; i < points.length; i++) {
        box={
            x:points[i].x,
            y:points[i].y,
            direction:points[i].direction
        };
        console.log(box,point);
        if(isInBox(box,point)){
            if(direction=='up'){
                point.y-=lineJumpHeight;
            }else{
                point.y+=lineJumpHeight;
            }
            return avoidOverlayRecursion(x,point.y,direction);
        }
    }
    return point.y;
}

实现规则4

做到这里,基本只剩规则4未实现了
为了实现规则4,又需要给记录的每个points引入新的属性,叫horizen,在进行avoidOverlay计算的时候,如果发现是偏左的时候,给出的x是x-boxWidth的,并且在计算isInBox的时候,4个点都需要计算是否在box中。

image

//线只有上下的区别,如果y点在上方则往下画,如果在下方则往上画,还需要考虑规避情况
function getLineY(x,y){
    var direction=y>=yScale(yHalf)?'up':'down';
    if(direction == 'up'){
        y=y-lineHeight;
    }else{
        y=y+lineHeight;
    }
    y=avoidOverlay(x,y,direction);
    return y;
}
function getRectXY(x){
    var y;
    for (var i = 0; i < points.length; i++) {
        if(x==points[i].x){
            y=points[i].y;
            if(points[i].direction=='up'){
                y-=boxHeight;
            }
            if(points[i].horizen=='left'){
                x-=boxWidth;
            }
            break;
        }
    }
    return {
        x:x,
        y:y
    };
}
function getTxtXY(x){
    var y;
    for (var i = 0; i < points.length; i++) {
        if(x==points[i].x){
            y=points[i].y;
            if(points[i].direction=='up'){
                y-=6;
            }else{
                y+=12;
            }
            if(points[i].horizen=='left'){
                x-=boxWidth;
            }
            break;
        }
    }
    return {
        x:x,
        y:y
    };
}

function avoidOverlay(x,y,direction){
    var horizen,finalY;
    if(x+boxWidth>xEdge){
        horizen='left';
        finalY=avoidOverlayRecursion(x-boxWidth,y,direction);
    }else{
        horizen='right';
        finalY=avoidOverlayRecursion(x,y,direction);
    }
    
    console.log('finalY',finalY);
    points.push({
        x:x,
        y:finalY,
        direction:direction,
        horizen:horizen
    });
    return finalY;
}

function avoidOverlayRecursion(x,y,direction){
    var box;
    var point={
            x:x,
            y:y,
            direction:direction
        };
    if(points.length==0){
        return point.y;
    }
    // console.log(points.length);
    for (var i = 0; i < points.length; i++) {
        box={
            x:points[i].x,
            y:points[i].y,
            direction:points[i].direction
        };
        console.log(box,point);
        if(isInBox(box,point)){
            if(direction=='up'){
                point.y-=lineJumpHeight;
            }else{
                point.y+=lineJumpHeight;
            }
            return avoidOverlayRecursion(x,point.y,direction);
        }
    }
    return point.y;
}

function isInBox(box,point){
    //得到box的四个点
    var boxX1=box.x;
    var boxX2=box.x+boxWidth;
    var boxY1,boxY2;
    if(box.direction=='up'){
        boxY1=box.y-boxHeight;
        boxY2=box.y;
    }else{
        boxY1=box.y;
        boxY2=box.y+boxHeight;
    }

    //得到point的四个点
    var pointX1=point.x;
    var pointX2=point.x+boxWidth;
    var pointY1,pointY2;
    if(point.direction == 'up'){
        pointY1=point.y-boxHeight;
        pointY2=point.y;
    }else{
        pointY1=point.y;
        pointY2=point.y+boxHeight;
    }

    var judge1=pointX1>=boxX1 && pointX1<=boxX2 && pointY1>=boxY1 && pointY1<=boxY2;
    var judge2=pointX2>=boxX1 && pointX2<=boxX2 && pointY2>=boxY1 && pointY2<=boxY2;
    var judge3=pointX1>=boxX1 && pointX1<=boxX2 && pointY2>=boxY1 && pointY2<=boxY2;
    var judge4=pointX2>=boxX1 && pointX2<=boxX2 && pointY1>=boxY1 && pointY1<=boxY2;
    
    if(judge1 || judge2 || judge3 || judge4){
        return true;
    }else{
        return false;
    }
}

相关文档

递归
https://www.cnblogs.com/YikaJ/p/4263873.html
图表源代码
liveChart.zip

Blender设置

以下设置都是为了更好地使用blender

界面语言

虽然可以改成中文,但是还是觉得用英文学会在以后学别人的英文教程时不至于懵逼,还是多多接触为好
image

左键选择物体

右键选择实在是不习惯,改过来后立马舒服鸟,因为选择是高频操作,我可不愿用右键来进行高频操作。
在2.8里默认已经改成默认左键选择了
image

增加撤销步数

默认是32步,觉得不怎么够用啊,能改大就改大些,如果内存够的话
image

python提示关闭

作为不用python的人来说,这个提示就不需要拉~
image

由对象形成的一维数组,如何按照某个字段进行归并,形成二维数组

在工作中经常遇到如下的数据,要求按照日期进行分组,因为展示的时候需要分组展示
image

之前都是用for循环很努力地循环判断,现在很自觉就用map做了,用map归类

var map = {};
for (var i = 0; i < data.length; i++) {
	if (map[data[i].sBeginDate.substr(0, 10)] == undefined) {
		map[data[i].sBeginDate.substr(0, 10)] = [];
	}
	map[data[i].sBeginDate.substr(0, 10)].push(data[i]);
}

形成如下样子
image

然后再通过一次循环收集成二维数组

var finalData = [];
for (var i in map) {
	finalData.push(map[i]);
}

变成这个样子

image

这样就很爽呆了,涉及到数据格式变换的可以在分组之前做。

后来把这个做成一个函数,使用起来就更舒服了

getSecondArr = (originArr, key) => {
		let map = {};
		for (let i = 0; i < originArr.length; i++) {
			if (map[originArr[i][key]] == undefined) {
				map[originArr[i][key]] = [];
			}
			map[originArr[i][key]].push(originArr[i]);
		}
		let treeData = [];
		for (let i in map) {
			treeData.push(map[i]);
		}
		return treeData;
	}

[十八般武艺]在东湖学帆船之总结

缘起

2018年9月22日有个 "华发中城荟杯"东湖企业帆船邀请赛在武汉东湖举行,老板在东湖玩过帆船,于是我们公司当然要去参赛啦,我也很幸运地报名上了。
其实各家公司也都不会,毕竟帆船这个项目只有东湖有,一般人也不会去玩的,所以我想这个活动的意义就在于用比赛的形式激起大家对帆船的兴趣,推动帆船活动在武汉的开展。

训练

一上船是很懵逼的,教练一上来就指着各种部件噼里啪啦说,这个是什么,这个是什么,其实是啥也记不住的,连名词都听不懂。
所以我先贴个帆船的图上来。
image

升主帆

一上来首先是升帆,升帆需要顺着风(也就是帆和风没有夹角),这样帆在上下滑动过程中,摩擦力才不会很大,便于操作。
主帆头(也就是主帆的顶部那个三角)最前边有一个圆环,从桅杆顶部下来的绳子首先拉住这个圆环,然后把主帆头插入桅杆的凹槽中,使其可以上下滑动,然后拉动绳子就把主帆头升上去了,升完把绳子卡住。
这个是我们训练的船,船型是珐伊 23。

img_0643

这个是网上看到图,因为训练时忘了拍照
image

接着打开前三角帆,前帆能活动的那个三角(也就是靠近人坐的那个三角)是由两根绳子控制的,一根在左舷,一根在右舷,拉动这两根绳子需要知道什么时候拉什么绳子,以及绳子拉松还是拉紧,这需要首先理解2个概念,第一个是左舷受风,一个是帆的受力原理。

左舷受风,右舷受风

左舷受风就是风从船体左边吹来,右舷受风就是风从船体右边吹来。
顺便了解一下躲避规则。
image

帆船前进原理

首先了解一个事实,在风速20米每秒的情况下,帆船速度是可以达到40米每秒的。
那么结论显而易见,帆船不是被风吹着跑的。否则船速的最大速度只可能是20米每秒。

伯努利定律

其实帆船的前进原理是和飞机机翼产生升力的原理一致的

image

风吹过机翼,由于机翼的一面弧度比另一面弧度大,风走过的距离更长,所以风速更快,造成了相对低压区,从而产生对机翼的升力。
帆实际上和机翼不一样,它不想机翼一样是个实心的,但大致上是类似的,帆的凸面风速快,压强小,所以获得了垂直于帆面的力。(这个力可以分解为拉船往前的力,和使船侧翻的力,所以才会需要用到压舷这个动作,避免翻船。我们练习的船比较大,防止侧翻是硬需求,所以底部有个很大的板子避免侧翻,不用太担心。)
所以虽然风速是一定的,但是通过调整帆面的大小,凹凸的形状,可以调整帆船的牵引力,假想把帆做到100米,那么它获得的垂直力也会很大,牵引力也会很大,牵引力大速度就会非常快,但同时侧翻的力也很大,所以为了防止侧翻船又得做大,船做大了,牵引力需要得也大,所以说帆的大小和船的大小得是匹配的,否则要么太大了会翻,太小了走不动。

我的工作

了解完这些,就可以知道怎么去拉前三角帆的绳子了,因为我的工作就是拉这个绳子-_-!
前三角帆靠近人坐的那个三角伸出来两个绳子一左一右。
我理解的干这个工作就是注意如下的三个细节
1.当左旋受风的时候,前帆在船体右侧,所以要把左边绳子松掉,拉紧右边绳子。
2.当风很小的时候,需要把绳子拉得松一点,因为根据伯努利原理,弧面越大,受力越大,这样就可以获取更多的前进的力;反之风大的时候,需要拉紧一些,否则船受到翻转方向的力会变大,不利于航行。(这里是我想的,不一定对)
3.在改舵换航向的时候,前帆从一边到另一边的过程中,如果风很大,收紧绳子是有一个时间窗口的,如果航向改变完成时绳子还未收紧,这时受到的力会无比巨大,而高效的做法是在还未开始受力时赶紧拉紧。
再一次厚颜无耻地借用一下网上的图片
image
我们船在不升前帆的情况下,掌握前帆是2个人负责,一左一右,控制主帆是一个人,舵手是一个人,然后剩下一个人专门压舷,一个教练专门指挥。

开始比赛

比赛的日子没太阳,不晒,可以说是相当舒服,还有风,不算很大,但是也够用了。
来了好多记者,竖起了大屏幕,拍照录视频,登船后继续拍照录视频,然后就开始比赛了。

起航规则与比赛规则

比赛有三个航标,呈三角形摆放,标和标之间距离大概有1公里。
第三个标和起航船可以连成一条线,这条线叫起航线。
在比赛开始前5分钟开始发命令,这时5分钟倒计时开始,之后每隔1分钟会吹响一声喇叭,最后一分钟会着重提醒一下,然后在最后一秒之前船不可以越过起航线,否则需要回来再出发。
比赛顺序是先绕第一标,再绕第二标,最后通过起航线即为完赛

当天我们比了三轮,一共7只队伍,我们队分别获得了第5名,第3名,第5名,最后综合成绩第四名。

放照片

这是比赛当天分配给我们的教练。这里每个教练都是这个级别的
img_0584

我们船的美女舵手
img_0622

起航前
img_0655

这个是后来获得第一名的女子帆船队
img_0652

近景
_20180927170556

比赛中1
_20180927170544

比赛中2
_20180927170544

比赛中3
_20180927170548

比赛中4
_20180927170552

[d3js] 数据更新与动画

先看效果

gif

实现

首先柱状图正常画

image

在svg的事件中添加更新函数

image

更新竖线,横框,文字,右边筹码分布

image

右边筹码分布重新渲染

image

[项目实战] 归组展示数据

效果预览

gif1

分析

此效果包含了如下几个要点

  1. 数据是接口一条一条给的,得到数据后自己根据日期归组展示
  2. 数据是分页给的,可能存在同一天的很多条被分到2个请求里,这时会需要拼合日期,否则展示2个同样的日期就bug了
  3. 某个日期内数据达到10条时展示一个note
  4. 日期title的sticky效果实现

实现

第一条的实现
可以看出数据是一条一条给的,

{fPreStockNum: 1300, fStockNum: 11300, fStockPrice: 27.82, iBuyDir: 1, sDate: "2018-12-18",}
{fPreStockNum: 1300, fStockNum: 1200, fStockPrice: 590.94, iBuyDir: -1, sDate: "2018-12-18",}
{fPreStockNum: 15500, fStockNum: 7900, fStockPrice: 61.27, iBuyDir: -1, sDate: "2018-12-17",}
{fPreStockNum: 4300, fStockNum: 900, fStockPrice: 39.46, iBuyDir: -1, sDate: "2018-12-17",}

那怎样根据日期归组呢?
在之前的blog #13 说过

第二条的实现
是记录下每次ajax请求的最后一个日期,然后每次拉到ajax请求时把第一个日期和记录下的日期比较,如果发现一样就做个标记,在填dom的时候判断展示title与否。

var transferData = _data.vStockHoldInfo;
for (var i = 0; i < transferData.length; i++) {
	if (transferData[i].sDate == that.lastDate) {
		transferData[i].isDuplicated = true;
	}
	transferData[i].liClass = that.getTransferClass(transferData[i].iBuyDir);
}
that.lastDate = transferData[transferData.length - 1].sDate;

第三条的实现
需要记录下每个ajax请求里归组后的最后一组的个数,然后拿每次请求到的第一组和最后一组的长度相加,如果为10就标记下来,在填dom的时候填入

var map = {};
for (var i = 0; i < transferData.length; i++) {
    if (map[transferData[i].sDate] == undefined) {
        map[transferData[i].sDate] = [];
    }
    map[transferData[i].sDate].push(transferData[i]);
}
var finalData = [];
for (var i in map) {
    finalData.push(map[i]);
}
if (finalData[0].length + that.lastDateLength == 10) {
    finalData[0][finalData[0].length - 1].isShowNote = true;
}
that.lastDateLength = finalData[finalData.length - 1].length;

第四条的实现
这个效果看起来还是很帅呆滴,并且兼容性非常不错了,可以大胆用,即使不支持,fallback了也不会有大问题。
这个在#32 这篇blog里也有谈到过了,不过要注意一个细节,就是可能你做完后发现是这个样子的

gif2

这两者有细微的差别,就在于一个是盖上去的,一个是挤压走的。那么实现时的区别在哪呢?其实是在结构里的层级。挤走的效果是每一个group都包在一个层级里,而盖上去的效果是title和列表是平级的。

另一个要注意的是注意写webkit前缀,否则ios会不认
position: -webkit-sticky; position: sticky; top: 0; z-index: 99;

怎样翻墙玩virtual regatta inshore 帆船模拟游戏

发现了一个非常好玩的帆船比赛游戏,这个对于初学者来说可以很好感受比赛,它不需要考虑调帆的操作,而是更多在考验策略方面,还有对规则的理解和运用。

但是国内要玩这个需要翻墙,下面就把完整的翻墙过程记录如下,这需要你花费100块钱,一台pc操作,和半个小时的时间。
翻墙有vpn和shadowsocks两种,vpn是全局性的,连上后所有请求都会走vpn服务器,那么在聊天,访问常用网站时速度会达不到平时的流畅度,而shadowsocks则可选择局部走国外线路,国内依然保持国内连接。所以我推荐shadowsocks

淘宝买账号,下载potatso lite

第一个步骤是淘宝买香港或者美国帐号,关键字是“苹果帐号美国”,不超过5块钱就可以买到了
买到后到设置里,app store退出然后登入你买到的账号
然后到app store里搜索potatso lite下载下来

买shadowsocks服务

https://portal.shadowsocks.nu/aff.php?aff=16963
在这里购买翻墙服务,之前我们下载的potatso是用来连接shadowsocks服务器用的,这个服务最便宜是100元一年,看起来很贵,可是我却觉得这是生命中最超值的事情了,因为你可以

  1. 和我们组队玩virtual regatta帆船比赛,超好玩
  2. 看youtube视频,这里有极为丰富的视频资料,看帆船比赛(包括vitural regatta比赛也有),学摄影,学健身,学做菜,学游泳,我已经是重度用户了-_-!
  3. 用google搜索,把google设为主页搜索,结果会让你很满意
  4. Twitter,Facebook,Instagram,同样有很多国内没有的人,和资料。你可以关注川普大嘴巴获取第一时间的资讯等等~
    但凡能学到些东西,就赚回来了,在投资自身成长学习上,我个人认为是极为超值的,trust me。

购买完成后,来到产品服务,我的服务,找到如下列表,点击二维码,然后用potatso lite扫描此二维码,就加上了一个代理,点开始,此时你就处于翻墙状态了,左上角会出现vpn图标。
image

你可以把这些都加上,切来切去,选择速度最快的那一个。

玩游戏tips

注册那里一直没有反应,不知为何,我已经放弃了。。
游戏部分一上来会有很友好的新手引导,熟悉操作,完成后就可以参加比赛了

1
游戏开始前会让你选择辅助功能
第一个是起航时的倒计时辅助,辅助一条延长线到起航线,上边显示数字提示以目前速度到起航线需要多少秒。
第二个LayLine是如果只tack一次绕标时能走到的最远的点连成的线,超过这条线tack就不经济了
第三个vmg是自动保持在最快的航行角度
第四个wind shadow是会把每个帆对风的影响区域投影在海面上,走入此区域时船速会受到影响
第五个wind intelligence还木有体会出来 -_-!

个人认为layline和vmg是比较好用的功能,vmg一点就自动保持在最佳航行角度,不用手动调了,节省精力,此时你可以通过拖动画面观察周围船只的情况;layline可以提示给你tack的点,不会走过了;
不过要注意的是每个辅助功能都需要消耗一个绿色六边形的道具,省着点用哈,土豪无视,可以随意购买。

2
接下来进入等选手环节,一直等到13个比赛就立即开始,如果一直等不到,经过一定时间也会开始比赛。
此时船只是透明的,规则不生效。

3
进入倒计时了,此时我起航遭遇了惩罚,惩罚形式是减慢你的速度。
起航时有个好用的技巧是按住松帆,来调整船速,达到最佳起航效果。

4
比赛中,在左侧可以看到加粗的那个是自己,与各个船之间相差的距离信息。

6
每次绕标都会落后排名,此时需要高手指点战略战术-_-!

5
比赛完成后有各种丰富的信息查看。

希望各位帆船爱好者玩起,然后就可以组队比赛啦!good luck!

Blender 资源与笔记

没有软件3d基础的话,做babylonjs会显得很吃力,遂决定学blender,原因有几点
1.blender的几个标签:开源,多平台,全能
2.安装插件即可导出babylonjs文件,完美!
3.建模,雕刻,绑定,粒子,动力学,动画,交互,材质,渲染,音频处理,视频剪辑以及运动跟踪,后期合成等等的一系列动画短片制作解决方案,并以python为内建脚本,支持yafaray渲染器,同时还内建游戏引擎,商业创作永久免费

单词本

orthographic 正交视图 Ortho
perspective 透视视图 Persp
topology 拓扑
dissolve 溶解,解散
proportional editing 比例编辑
shading 着色器
LMB 左键 left mouse button
dbl-LMB 双击 double click left mouse button
Modifier 修整器
extrude 拉伸
Luminance 亮度 ,流明单位就是音译来的
Quaternion 四元
Euler 欧拉
Culling 剔除
Decay 衰变
emitting 发光

资源

我是跟着这个**大神的教程学的,,0基础也能学,1天下来保证你能弄个马克杯和苹果出来,发现还是挺好玩的
仔细一看时间,竟然是7年前的,但是依然毫无障碍。不过2.8版本就开始大改了,用2.7.9学还是没问题
https://www.youtube.com/watch?v=6cweiw9BjpQ

Blender Guru 水平高并且讲解能力强, 10年前开始搞自己的站,https://blenderguru.com,
youtube有68w订阅量
https://www.youtube.com/user/AndrewPPrice

Gleb Alexandrov 的,youtube有11万订阅量
https://www.youtube.com/user/GlebAlexandrov

另外发现一个惊人的实事,也是最近自己发现的,但是意义特别重大
在看英文节目时没字幕会很讨厌,实际上youtube上可以在设置里打开自动字幕,翻译出来的水准已经非常足够我用了,而且有个好处就是英文字幕可以让我对英语语感,单词有更好的硬需求,长期这样看下去听力提升也会杠杠的!

笔记(基于2.7.9版本)

  1. 自创startup files,命名Modaling,以后每次新建都会从这里开始
  2. 调好视窗分配,一般建模4个视窗,透视图,顶视图,左视图,右视图,然后ctrl+u保存设置
  3. 1、ctrl+1 前后视图; 3、ctrl+3 左右视图;7、ctrl+7上下视图 ; 5切换正交和透视视图
  4. shift+鼠标中键平移拖动
  5. ctrl+up 把当前视图扩大/还原
  6. 鼠标中键可以拖拉面板
  7. ctrl+tab 在edit mode下切点线面
  8. z 切换表面视图和线框视图
  9. tab 切 Edit Mode和 Object Mode
  10. Move layer m 把选定元素移动到某图层
  11. B 选区框选(多选)
  12. ctrl+左键 鼠标套索多选
  13. e extrude拉伸工具(视频里说成推挤)
  14. T tools左边的视窗
  15. Shift+A 新建Mesh模型
  16. 第一次建立Mesh时的参数设定只有一次机会
  17. 不会自动保存,自己养成保存习惯
  18. R rotate旋转 S scale缩放 E extrude推挤
  19. 多边形建模时,尽量用最低面数,后期再平滑化(好处是效率高)
  20. Ctrl+R Loop Cut and Slide沿法线方向增加面
  21. subdivition 次分面,细分面,在Modifier整修器里调整
  22. 0 摄影机视角
  23. F12 render快捷键
  24. shading--smooth 也可以做出类似subdivition的平滑效果
  25. 最好单一零件做出来(长出来,而不是拼出来)
  26. F 建立表面 最少三个点即可
  27. N 物体属性面板

阶段成果

image
image
image

上个小狗有很多瑕疵,后来脱离视频又做了一版,细节会少一些,不过算是完整的没大瑕疵
image

[项目实战] 手机端iscroll滚动+滚动导航指示

此效果在手机端还是很常见的,话不多说,直接看效果

(很奇怪ios录屏无法支持录手指操作)

native-scroll

native的效果包含了几点

1.顶部日期是可以横向滚动的,
2.点击某个日期,就把点击的置为当前状态,并把下方内容滚动到对应日期。
3.当用户滚动下方内容时,顶部日期会随着滚动自动跳到对应日期置为当前状态
4.顶部日期置为当前状态时,会尝试把当前状态放置在中间位置(处于边角的日期没法去中间就不管了)
5.用户滚动下方内容时,每块日期条都会随着滚动fix在它能移动到的最上边

目前我实现到1,2,3,4。而5这个特性只有native实现起来比较爽,h5实现感觉代价挺大,目前也没有见到过h5的实例

一起来看看h5实现出来的效果

(windows下有个巨好好用录屏工具叫gifcam,可以录到手指,安利一下)

h5-scroll2

用到的插件

1.iscroll 要滚动肯定iscroll少不了滴
地址 https://github.com/cubiq/iscroll

2.waypoint 这个用来反馈滑动到哪了
地址 http://imakewebthings.com/waypoints/guides/jquery-zepto/

Dom准备好

compile了两部分内容,分别是顶部滚动日期和下方的列表内容
接着就开始加入各种行为事件

//顶部滚动日期
var dateTemplate = $('#dateTemplate').html();
$('#calenderDate').html($.compiler(dateTemplate, {
	"data": dateArr
}));

//列表内容
var calenderTemplate = $('#calenderTemplate').html();
$('#daysHolder').html($.compiler(calenderTemplate, {
	"data": finalData
}));

//顶部滚动,和点击事件
this.scrollTab('calenderDateHolder', 4.5);
this.addScrollTabEvent();
this.addScrollMonitorEvent();

让顶部日期开始滑动起来

scrollTab做的事情是让顶部的日期可以横向滚动,传入2个参数,分别是id和一行展示的列数
首先根据传入的列数和id元素的宽度,计算出每一格的宽度,并设置给每个li元素,
然后把li元素的父层设置一下宽度为li的数量*宽度,实战中发现可能li的宽度是个小数,父层这样计算出来的宽度可能包不住li导致li出现换行
最后使用iscroll让id元素滑动起来,成功后看到dom是这个样子的

image

li的父层还有一个父层,在init的时候指定id要指定最上层,那么iscroll就会找到id的子层,给他设定style的各种translate属性,层级结构是这样的

setScollerItemWidth: function(id, column) { //设定滑动表格每一列的宽度
    if (column === undefined) {
        column = 2;
    }
    var $table = $('#' + id);
    var scrollItemWidth = $table.width() / column;
    var itemNum = $table.find('li').length;
    $table.find('li').css({
        width: scrollItemWidth + 'px'
    });
    $table.find('.calender_date').width(scrollItemWidth * itemNum + 1);
},
scrollTab: function(id, column) { //表格开始滑动
    this.setScollerItemWidth(id, column);
    this.myScroll = new IScroll('#' + id, {
        probeType: 2,
        scrollX: true,
        scrollY: false,
        mouseWheel: true,
        eventPassthrough: 'vertical',
        preventDefault: true
    });
},

实现点击日期后让下方内容滚动,和滚动下方内容时日期的实时变化

addScrollTabEvent:function(){
    var that=this;
    //tab date点击滑动到锚点
    $("#calenderDate li").on('tap',function(event) {
        $("#calenderDate li").removeClass('on');
        $(this).addClass('on');
        that.myScroll.scrollToElement($(this)[0], 400, true, true);
        var order=$(this).index();
        console.log(order);
        $('#day'+order)[0].scrollIntoView(true);
        window.scrollBy(0, -64);
        that.isTaping=true;
        setTimeout(function(){
            that.isTaping=false;
        }, 500);
    });
    $("#calenderDate li").eq(0).trigger('tap');
},
addScrollMonitorEvent:function(){
    var that=this;
    $('.single_day').each(function(index, el) {
        $('#day'+index).waypoint({
            handler: function(direction) {
                if(that.isTaping){return;}
                $("#calenderDate li").removeClass('on');
                $("#calenderDate li").eq(index).addClass('on');
                that.myScroll.scrollToElement($("#calenderDate li").eq(index)[0], 400, true, true);
            },
            offset: '64px'
        });    
    });
},

点击日期让此元素滚动到中间用到的是这一句
that.myScroll.scrollToElement($(this)[0], 400, true, true);
参数可去iscroll的api查阅,不多说了,只需注意iscroll用到的是dom元素,不是$元素

让下方元素滚动到顶部位置是这两句
$('#day'+order)[0].scrollIntoView(true);
window.scrollBy(0, -64);

scrollIntoView在各个浏览器都是有实现的,只是加的参数(比如平滑滚动,对齐特性)有兼容性问题
把下方元素拉到顶后,需要往下回退64个像素,这个距离就是顶部日期的高度

下方滚动影响上边日期展示的就用waypoint,每个元素到哪里了都会在handler里给出一个回调,根据这个回调进行操作。

遇到的问题

第一个问题就是点击日期的时候,下方内容滚动,此时内容滚动监测又发现了这个滚动,反回来影响日期的展示,所以这里要引入一个点击锁,当点击日期的时候锁定,500毫秒后放开。而滚动监测在回调行为里第一个就判断是否点击锁定了,如果在锁定中就不往下执行,这样就断了两者的联动影响。

第二个问题是由于顶部日期fix在顶部,切日期下方滚动时,偶尔会出现日期这个区域闪动一下,我理解为ios下的刷新率不够,后加入 -webkit-transform: translateZ(0); transform: translateZ(0) 后问题搞定。

第三个问题是顶部的滚动不利索,像是卡住了一样,然后翻看iscroll的demo,发现关键点在touch-action:none; 这个加入后,就可以避免原生的手势操作,iscroll的滑动就丝般顺滑了,文档在此
https://developer.mozilla.org/zh-CN/docs/Web/CSS/touch-action

第四个问题是解决了第三个问题后出现的,注意看顶部bar左边部分,下边的内容已经透出来了
image

解决办法就是多增加一层结构

image

于此同时css也要相应处理

image

最后就完美解决,如图,同时我也把顶部bar增加了一个底部border,更好地区分。
image

Blender 拍小狗玩偶,用3视图照片建模

拍照

拍照这里其实很关键,拍照时物体距离相机不能变化,分别拍下前视图,右视图,顶视图。
然后在ps里处理好,导出成正方形图片。为什么是正方形图片呢?在视频教程里,处理好的图片1024*768的,是导出给maya用的,而maya在顶视图时会自动按照照片的宽高比去适配;而到blender里是一直按照宽度去适配的,所以统一最佳的方案就是用正方形,这样就不会有适配困扰

导入图片

image
background image不显示问题的解决方法
在对着照片建模的时候,需要用到背景图片,发现设定好后,照片没显示出来,原因如下:
首先必须在正交视图,不能是透视视图,然后必须是1,3,7正视图,稍有偏移图片就不出来了
另外对图片格式也有要求,第一选择是openexr,第二是png,第三是jpg

建模

首先在前视图中用线框出身体的形状
image

现在是5个点组成的面,在3d软件中5个点会有问题,最多4个,所以需要切分成2个面
image

然后到Modifier里增加mirror镜像,并勾选clipping
image
如果不勾选clipping,mirror镜像时两半不会产生融合效果,变成下边的样子
image
而clipping勾选后,把中间竖线合到一起,就融合了,后续在extrude拉伸时会变成一个整体
image

现在通过E,R,S工具把身子弄好
image

现在把四条腿拉出来,并调整细节
image

然后把头部拉出来调整细节,做耳朵和鼻子用圆球体然后调整形状
image

然后做尾巴并调整细节
image

周六来公司又画了一遍,继续增强感觉,身体和腿让我比较满意了,不过耳朵和嘴还有耳朵没有满意,这一个是因为3d图细节不清,二个是对物体的把握感需要继续增强,细节很重要
image

css油画

这个作品又一次拓展了css的边界
image

github地址在此
https://github.com/cyanharlow/purecss-francine

从热心网友提供的每次commit而做出的动画来看,作者真的是拿css作为绘画工具来用的,貌似还用得很娴熟,这样的画作比一般画作带来的好处是随时可调整
gif

[十八般武艺]东湖家庭帆船赛

在上次的企业杯帆船赛后,对帆船当然是很感兴趣了,正好武汉马上举行家庭帆船赛,幸运地参加了!
选择的船型都是hobie的双体船,有hobie gateway和hobie t2 两种, 前者比后者稍大,我要玩就玩专业点的,选择t2!
image

找到了hobie的官网

Hobie t2 的设计可以实现一个船体飞起来,所以速度应该是会快些,卖9w人民币左右

image

参数
船员 1-4
LENGTH 长度 16′ / 4.90 m 16'/ 4.90米
BEAM 7′ 8″ / 2.34 m
CAPACITY 容量 529 lbs / 240 kg 529磅/ 240千克
WEIGHT 重量 388 lbs / 176 kg 388磅/ 176千克
DRAFT W/ RUDDER UP 10″ / .25 m
JIB AREA 臂架区域 2.2 sq m 2.2平方米
MAST LENGTH 桅杆长度 26′ 6″ / 8.07 m
SAIL AREA 帆区 172 sq ft / 16 sq m 172平方英尺/ 16平方米
HULL CONSTRUCTION 船体结构 Rotomolded Polyethylene 滚塑聚乙烯

Hobie Gateway 偏向于家庭休闲,舒适,售价10w人民币左右

image

参数
船员 1-6
LENGTH 长度 16'7“/ 5.04米
BEAM 7'8“/ 2.34米
CAPACITY 容量 1000磅/ 453千克
WEIGHT 重量 390磅/ 177千克
DRAFT W/ RUDDER UP 10英寸/ .25米
MAST LENGTH 桅杆长度 25'/ 7.62米
SAIL AREA 帆区 180平方英尺/ 17平方米
HULL CONSTRUCTION 船体结构 Rotomolded Polyethylene 滚塑聚乙烯

理论课

帆船的教练都是很厉害的人,黄教练是培养专业队的教练,胡教练战绩显赫,教我们的教练则是全国冠军什么的,都是很敬业很付出的,为他们点赞!
关键字
迎风,横风,顺风,参照物,左弦,右弦,上风,下风,左让右,上让下,后让前。
前边都好说,规则其实门道是很大的 https://www.xzbu.com/6/view-5834748.htm
这次把船下水前绳索的处理,升帆,都慢慢的教了一遍,教得很仔细,教练很有耐心!

实践课

第一天风不大,还一共坐了7个人(包括2小孩),所以基本上可以算是观光游,下午坐了一把珐伊28船
第二天下午风很不错,有了一次我们家庭和教练一共三人的实操,这一次迎风速度跑起来了,然后换舷换了几次,这个t2换舷速度损失挺大,加上操作不对的话,直接就可以换舷换停掉,又得重新起速。而我总结的是,宁可角度换多了,也不可换少了。因为换少了,船在禁行区里,此时没有动力,角度的改变会极慢;而角度换大了,则不至于完全无动力,还可以在有动力的情况下调整角度到最优角。
这个就是得通过多换几次舷来熟练手脑结合。
第二个是调整到横风航行,迎风转横风的时候,需要操舵的时候去调整主帆角度,同时前帆的人也改变帆角;对我们新手来说,操舵已经占据了大脑80%的精力,同时去操作主缭绳就会比较吃力了。
这个也是多操作,让操舵变成和走路一样不耗费心力资源,才可以从容地做其他事情。

想到一个好主意

所以我由此想到了一个idea,就是做一个模拟器,有物理的舵去反馈,做个软件接受舵的角度信息,去改变帆船的朝向。然后电脑接投影仪,就会有一个很大的屏幕,人坐在板凳上都没问题。
模拟器操作的好处是,操作时不受风力,天气干扰,时间充足,让大脑建立起舵和船的神经连接,变成长期记忆,让操舵变成走路一样不需要思考,然后再下船后优化,微调一下这个长期记忆,就学起来很快了,起码可以做到下船实操的时候,不会让操舵占据过多心力资源,像操反舵这种低级错误就不会出现了,教练省心,学员也不会遭遇挫败感。
然后我搜了一下关于模拟器的东东,发现帆船教学模拟器这个还真没有。
我的思路已经有了,在卓航同学又优化了实现,他把手机固定在舵上,手机的罗盘就可以提供角度信息,然后传递给电脑,用这个信号操作帆船,然后投影到大屏幕。
整个模拟器的硬件成本就降低到了0,手机,电脑,都是现成的,还能重复利用,舵随便找个木头即可,座位搬个板凳就行。
剩下的就是软件开发,我怀疑我用threejs来做都可以,因为我看到过threejs的海波模型,和3d的游戏,不过真做起来细节还是会有一些多。
这个简单模型的缺点就是对舵没有力的反馈,如果要加上力的反馈,就涉及到信号输出与机械控制了,这个我还不知道到底有多难,成本多大,我想成本主要是软件,硬件上都不会很高成本。

帆船游戏

模拟帆船的游戏还真被我找到了,一个叫eSail Sailing Simulator;https://store.steampowered.com/app/794860/eSail_Sailing_Simulator/

另一个叫The Sailing Simulator,售价都是70元左右。
https://store.steampowered.com/app/552920/Sailaway__The_Sailing_Simulator/

感觉上The Sailing Simulator做得更全一些,有各种船型,各种海岸,而eSail偏重于操作的模拟,于是我先买了eSail试玩
3d66dcf6-4a19-409c-96bf-fcbe204d8e64

由于没有物理舵的反馈,只能在电脑上操作,是没法实现大脑舵的长期记忆的,不过应该对感受帆船的魅力,增加周边知识有帮助,待试玩后再写。

周四训练

11月1日周四,早上风很大,和另外一组家庭2人,一共三人,教练没上船,练了2小时。
这次的练习我主要想掌握的是迎风转向增加熟练度,和横风行驶,顺风行驶。
转向的问题通过练习,和事后总结,就是转的时候先压船,流畅地转过来,太慢不行,太快也不行,然后人再过来。
横风行驶就是帆打开,这个打开的角度可以通过绳索调节过程中感受力的大小找到力最大的那个点

观看帆船比赛

在youtube上看了2个晚上的帆船比赛,把470,laser,双体船,芬兰人,还有那种很大的帆船,不知道叫啥的,都看了一遍,最好看的还是470,速度快,对配合要求高,有球帆,竞争也是无比激烈,顺风回程还要人力拉帆,简直是全方位考验。
而laser就是虐腰,全程半个小时,腰就没竖起来过,想象一样做30分钟的卷腹是一种什么样的体验?过程中还要摇啊摇,这个项目的队员都是铁人,我只服他们的腰。
那种大帆船有大概10个船员的,就牛逼了,更考验整体配合,偏笨重,然后在大海里风特别大,波涛汹涌的,那滋味,绝对酸爽。

11月3日训练总结

周六早上去的,比较没风,问了教练好多问题,然后上了hobie 16的一个船,这个船绳索很死,然后前帆换帆中间帆骨好长,会被主桅杆挡住,然后我们在基本无风的湖面上飘荡了1个多小时,哈哈,我调整好半天也搞不好,我转了360度,主帆的形状永远是凸向一面,我锲而不舍地折腾了好久,也搞不定。
然后上岸后才意识到问题所在,因为船体的左右倾斜会影响到帆的受风,当时我坐在上风,然后主桅杆其实是朝向上风的,这样帆的受力就不理想。
由于在珐伊23船上的经验都是舵手坐在上风位置,所以就掉这个坑里了。想想当时船员其实也是把船压向下风的!
所以小风下,舵手应该坐在下风位置,把船压向下风,让帆好受力。
现在才意识到了船体倾斜控制的重要性。
风小的时候让帆倒向下风;而风大的时候帆本来就会倒向下风,就需要用人压船把帆拉回来。
前后平衡就是不要太压向船体后边。
然后尽量不要让船体左右摇晃,这样帆的受力也会时有时无,比一直受力的情况就要差。

11月8日训练总结

下午训练的时候,风很大了,今天练习的是绕标,在顺风转横风的时候,速度会变快,速度起来后的那种彪感简直太有感觉了!
进一步熟练了迎风,换舷,横风,顺风的操作,和绳索的摆弄,现在可以在转横风的时候边打舵边放绳子了,不过感觉顺风的时候,帆放到一定位置,就没有足够的风力把帆往外拉了,还是横风偏顺的角度速度超级快!实在是忍受不了顺风的慢,每次想角度走小一点,就会丢失力,即使帆再怎么打开也没有足够的力。教练说这是因为t2主帆没有横杆,所以没法完全打出去,所以走顺风的角度比别的船大。所以我还是先保证受力最大化行船吧!
在回程的时候连续换了几次舷,衔接得比之前好了一点,经验就是别想从迎风角换到迎风角了,先换到顺风角,再调成迎风角,比较容易起速,等娴熟了再说别的吧!
还是风大好玩啊!

风速表

在群里看到有app可以预测风,于是找到了windy,可以预测最近10天的风,
_20181105193320

按照预测,11月6日全天风比较大,最大达到了7米每秒,阵风达到了10米每秒,这就是4级风的水平。
这个预测对比赛还是很有指导意义的。
image

训练照片

_20181109181457
_20181109181451
_20181109181445
_20181109181438
_20181109181423

比赛

比赛的时间是2018年11月17,18两天,正好是天气最湿冷的一个周末,过了这个周末就迎来了太阳。

第一天比赛
17号早上来到军运会码头,场面好大呀,各路人马早已到齐,组委会,大学生志愿者,摄像,无人机,像大海阳光俱乐部的教练们,华帆体育的教练们热情问好,做准备,雨一直在下,到了1,2点开始开幕式,各位领导致辞,鸣笛开幕!
接着排队领帆,装船,第一次全程实操感觉好极了~
在志愿者的帮助下放船下水!实际上大家都挺想赶紧出去先熟悉场地的,风也很大,大家都跑得乎乎的~
我自然也是把速度拉到最大,之前从没有过这么大的风,这速度彪感十足~
跑了有一会就离起航船好远了,准备回去,在这么激动的状态下,大脑不够用了,我没想过先让船慢下来,就直接打舵顺风换舷了,船以很快的速度转向,然后换舷后就直接翻了,基本上就是秒翻,从船身开始倾斜到翻只有几秒钟时间,完全来不及反应。
好在前一天晚上看了翻船扶正的视频,立马爬上船,松开主缭绳和前帆绳,然后把安全绳拿在手里,这时救援船很快赶来了,工作人员帮我拉起桅杆顶端,抬起来,然后我全身倾斜拉安全绳把船扶正,同时我和老婆再次掉入水中,再次迅速爬上船,再把老婆拉上来。
安定后,此时心情肯定是极差的,但自我感觉还没有达到冷得受不了的程度,在晚上躺在床上的时候就考虑过,要是落水了,就不用比了,直接上岸然后赶紧回家换衣服,但此时此景,马上就要开赛了,也没多想就飞奔过去,脑子一直处在不好用状态,过去连方位都辨不清了。
这次的比赛还是三标,跑一个迎风,一个横风,一个顺风,我过去之后,看到了起航船,别人告诉了我一标,我远远的看到了,但没看到起航线的另一个标,可能当我看一标的时候已经冲过起航线了,于是我错把2标看成了起航线的标。
正好在我前方有条船快速地走着,于是我就跟在他后边。
当五分钟倒计时的时候,我还在我假想中的起航线前横风走!
而就这还在起航线打开前越过了我假想中的起航线。
老婆在一旁说随便跑跑吧,就当来玩了,我也松懈下来了,放弃了比赛,直接绕过前方的标冲过终点线。
在我前边的那条sb船是第一个过去的,我是第二,神奇的是我后边还有一条船也跟着过去了,我们3个都是没按照航线瞎走的-_-!
事后看成绩的时候,t2组有5,6条船并列11名,估计都是没按照路线瞎走的,组委会为了颜面给了11名,要是正常比赛应该是没有名次的。
幸运的是比完这轮后,组委会就宣布结束今天的比赛了,可能是看到大家跑得都不好,(事后才知道有3组家庭落水,很多帆船没按照规则行驶)
此时我和老婆都冻得不行了,回到岸上,别人从外表看不出我们是浑身湿透的状态,我们也正常的节奏降下主帆,整理好绳索,领了包,赶紧回家。
回家的路也是相当冷,走到绿道的电瓶车处搭电瓶车,一路上风吹得冻得不行!
晚上也完美地错过水手之夜,有抽奖啊,表演啊,自助餐啊,全部泡汤!
同时老婆手机进水,我们在雨夜骑电动车去工程大学修手机

总结当天的比赛,简直要用脑残来形容,大脑一直处于不够用状态,我想是紧张了,大脑就很难冷静思考。
我把很大精力都花在了对帆船的操作上,而好多事情需要大脑资源来处理的事情就没法思考了。
以后当遇到大脑在处理复杂事物处理不过来的时候,得学会让自己先冷静下来,抓住主要事物,放弃次要事物,我就是过于注意帆船的速度,调帆,却没心思考虑怎么让船慢下来,分析当前的情形。
人在大脑精力不够的时候做出错误的判断是一定的,这时第一个做的事情只能是冷静下来,回归理性。

第二天比赛
第二天比赛是早上9点,我在7点多看一眼手机,发觉不妙,赶紧叫老婆爬起来准备。
好在前一天晚上把雨衣雨鞋全部吹干了,不然今天就没法继续比赛了。
另外幸运的是没有感冒,没有鼻子坏掉,什么都没有,也许是我们这阵子都在锻炼吧,机能还正常。
来到现场,黄剑教练这次细致地说了我们怎么起航,怎么绕标,细致地解答疑问,争取我们每个人都clear。
而这次下水后,大家就按照事前说好的来到起航船附近等待,没有一个人掉队。
雨和风也是小了很多,

数组去重的四种方法

第一种方法

Array.prototype.unique1 = function() {
	var n = []; //一个新的临时数组
	for (var i = 0; i < this.length; i++) //遍历当前数组
	{
		//如果当前数组的第i已经保存进了临时数组,那么跳过,
		//否则把当前项push到临时数组里面
		if (n.indexOf(this[i]) == -1) n.push(this[i]);
	}
	return n;
}

第二种方法

Array.prototype.unique2 = function() {
	var n = {},
		r = []; //n为hash表,r为临时数组
	for (var i = 0; i < this.length; i++) //遍历当前数组
	{
		if (!n[this[i]]) //如果hash表中没有当前项
		{
			n[this[i]] = true; //存入hash表
			r.push(this[i]); //把当前数组的当前项push到临时数组里面
		}
	}
	return r;
}

第三种方法

Array.prototype.unique3 = function() {
	var n = [this[0]]; //结果数组
	for (var i = 1; i < this.length; i++) //从第二项开始遍历
	{
		//如果当前数组的第i项在当前数组中第一次出现的位置不是i,
		//那么表示第i项是重复的,忽略掉。否则存入结果数组
		if (this.indexOf(this[i]) == i) n.push(this[i]);
	}
	return n;
}

其中第1种和第3种方法都用到了数组的indexOf方法。此方法的目的是寻找存入参数在数组中第一次出现的位置。很显然,js引擎在实现这个方法的时候会遍历数组直到找到目标为止。所以此函数会浪费掉很多时间。 而第2中方法用的是hash表。把已经出现过的通过下标的形式存入一个object内。下标的引用要比用indexOf搜索数组快的多。

为了判断这三种方法的效率如何,我做了一个测试程序,生成一个10000长度的随机数组成的数组,然后分别用几个方法来测试执行时间。 结果表明第二种方法远远快于其他两种方法。 但是内存占用方面应该第二种方法比较多,因为多了一个hash表。这就是所谓的空间换时间。 就是这个测试页面,你也可以去看看。

根据hpl大牛的思路,我写了第四种方法:

第四种方法

Array.prototype.unique4 = function() {
	this.sort();
	var re = [this[0]];
	for (var i = 1; i < this.length; i++) {
		if (this[i] !== re[re.length - 1]) {
			re.push(this[i]);
		}
	}
	return re;
}

这个方法的思路是先把数组排序,然后比较相邻的两个值。 排序的时候用的JS原生的sort方法,JS引擎内部应该是用的快速排序吧。 最终测试的结果是此方法运行时间平均是第二种方法的三倍左右,不过比第一种和第三种方法快了不少。

JavaScript 复杂判断的更优雅写法

前提

原文地址:https://juejin.im/post/5bdfef86e51d453bf8051bf8

我们编写js代码时经常遇到复杂逻辑判断的情况,通常大家可以用if/else或者switch来实现多个条件判断,但这样会有个问题,随着逻辑复杂度的增加,代码中的if/else/switch会变得越来越臃肿,越来越看不懂,那么如何更优雅的写判断逻辑,本文带你试一下。

举个例子

/**
 * 按钮点击事件
 * @param {number} status 活动状态:1 开团进行中 2 开团失败 3 商品售罄 4 开团成功 5 系统取消
 */
const onButtonClick = (status)=>{
  if(status == 1){
    sendLog('processing')
    jumpTo('IndexPage')
  }else if(status == 2){
    sendLog('fail')
    jumpTo('FailPage')
  }else if(status == 3){
    sendLog('fail')
    jumpTo('FailPage')
  }else if(status == 4){
    sendLog('success')
    jumpTo('SuccessPage')
  }else if(status == 5){
    sendLog('cancel')
    jumpTo('CancelPage')
  }else {
    sendLog('other')
    jumpTo('Index')
  }
}

通过代码可以看到这个按钮的点击逻辑:根据不同活动状态做两件事情,发送日志埋点和跳转到对应页面,大家可以很轻易的提出这段代码的改写方案,switch出场:

/**
 * 按钮点击事件
 * @param {number} status 活动状态:1 开团进行中 2 开团失败 3 商品售罄 4 开团成功 5 系统取消
 */
const onButtonClick = (status)=>{
  switch (status){
    case 1:
      sendLog('processing')
      jumpTo('IndexPage')
      break
    case 2:
    case 3:
      sendLog('fail')
      jumpTo('FailPage')
      break  
    case 4:
      sendLog('success')
      jumpTo('SuccessPage')
      break
    case 5:
      sendLog('cancel')
      jumpTo('CancelPage')
      break
    default:
      sendLog('other')
      jumpTo('Index')
      break
  }
}

嗯,这样看起来比if/else清晰多了,细心的同学也发现了小技巧,case 2和case 3逻辑一样的时候,可以省去执行语句和break,则case 2的情况自动执行case 3的逻辑。

这时有同学会说,还有更简单的写法:

const actions = {
  '1': ['processing','IndexPage'],
  '2': ['fail','FailPage'],
  '3': ['fail','FailPage'],
  '4': ['success','SuccessPage'],
  '5': ['cancel','CancelPage'],
  'default': ['other','Index'],
}
/**
 * 按钮点击事件
 * @param {number} status 活动状态:1开团进行中 2开团失败 3 商品售罄 4 开团成功 5 系统取消
 */
const onButtonClick = (status)=>{
  let action = actions[status] || actions['default'],
      logName = action[0],
      pageName = action[1]
  sendLog(logName)
  jumpTo(pageName)
}

上面代码确实看起来更清爽了,这种方法的聪明之处在于:将判断条件作为对象的属性名,将处理逻辑作为对象的属性值,在按钮点击的时候,通过对象属性查找的方式来进行逻辑判断,这种写法特别适合一元条件判断的情况。

是不是还有其他写法呢?有的:

const actions = new Map([
  [1, ['processing','IndexPage']],
  [2, ['fail','FailPage']],
  [3, ['fail','FailPage']],
  [4, ['success','SuccessPage']],
  [5, ['cancel','CancelPage']],
  ['default', ['other','Index']]
])
/**
 * 按钮点击事件
 * @param {number} status 活动状态:1 开团进行中 2 开团失败 3 商品售罄 4 开团成功 5 系统取消
 */
const onButtonClick = (status)=>{
  let action = actions.get(status) || actions.get('default')
  sendLog(action[0])
  jumpTo(action[1])
}

这样写用到了es6里的Map对象,是不是更爽了?Map对象和Object对象有什么区别呢?

一个对象通常都有自己的原型,所以一个对象总有一个"prototype"键。
一个对象的键只能是字符串或者Symbols,但一个Map的键可以是任意值。
你可以通过size属性很容易地得到一个Map的键值对个数,而对象的键值对个数只能手动确认。

我们需要把问题升级一下,以前按钮点击时候只需要判断status,现在还需要判断用户的身份:

/**
 * 按钮点击事件
 * @param {number} status 活动状态:1开团进行中 2开团失败 3 开团成功 4 商品售罄 5 有库存未开团
 * @param {string} identity 身份标识:guest客态 master主态
 */
const onButtonClick = (status,identity)=>{
  if(identity == 'guest'){
    if(status == 1){
      //do sth
    }else if(status == 2){
      //do sth
    }else if(status == 3){
      //do sth
    }else if(status == 4){
      //do sth
    }else if(status == 5){
      //do sth
    }else {
      //do sth
    }
  }else if(identity == 'master') {
    if(status == 1){
      //do sth
    }else if(status == 2){
      //do sth
    }else if(status == 3){
      //do sth
    }else if(status == 4){
      //do sth
    }else if(status == 5){
      //do sth
    }else {
      //do sth
    }
  }
}

原谅我不写每个判断里的具体逻辑了,因为代码太冗长了。
原谅我又用了if/else,因为我看到很多人依然在用if/else写这种大段的逻辑判断。
从上面的例子我们可以看到,当你的逻辑升级为二元判断时,你的判断量会加倍,你的代码量也会加倍,这时怎么写更清爽呢?

const actions = new Map([
  ['guest_1', ()=>{/*do sth*/}],
  ['guest_2', ()=>{/*do sth*/}],
  ['guest_3', ()=>{/*do sth*/}],
  ['guest_4', ()=>{/*do sth*/}],
  ['guest_5', ()=>{/*do sth*/}],
  ['master_1', ()=>{/*do sth*/}],
  ['master_2', ()=>{/*do sth*/}],
  ['master_3', ()=>{/*do sth*/}],
  ['master_4', ()=>{/*do sth*/}],
  ['master_5', ()=>{/*do sth*/}],
  ['default', ()=>{/*do sth*/}],
])

/**
 * 按钮点击事件
 * @param {string} identity 身份标识:guest客态 master主态
 * @param {number} status 活动状态:1 开团进行中 2 开团失败 3 开团成功 4 商品售罄 5 有库存未开团
 */
const onButtonClick = (identity,status)=>{
  let action = actions.get(`${identity}_${status}`) || actions.get('default')
  action.call(this)
}

上述代码核心逻辑是:把两个条件拼接成字符串,并通过以条件拼接字符串作为键,以处理函数作为值的Map对象进行查找并执行,这种写法在多元条件判断时候尤其好用。

当然上述代码如果用Object对象来实现也是类似的:

const actions = {
  'guest_1':()=>{/*do sth*/},
  'guest_2':()=>{/*do sth*/},
  //....
}

const onButtonClick = (identity,status)=>{
  let action = actions[`${identity}_${status}`] || actions['default']
  action.call(this)
}

如果有些同学觉得把查询条件拼成字符串有点别扭,那还有一种方案,就是用Map对象,以Object对象作为key:

const actions = new Map([
  [{identity:'guest',status:1},()=>{/*do sth*/}],
  [{identity:'guest',status:2},()=>{/*do sth*/}],
  //...
])

const onButtonClick = (identity,status)=>{
  let action = [...actions].filter(([key,value])=>(key.identity == identity && key.status == status))
  action.forEach(([key,value])=>value.call(this))
}

是不是又高级了一点点?

这里也看出来Map与Object的区别,Map可以用任何类型的数据作为key。

我们现在再将难度升级一点点,假如guest情况下,status1-4的处理逻辑都一样怎么办,最差的情况是这样:

const actions = new Map([
  [{identity:'guest',status:1},()=>{/* functionA */}],
  [{identity:'guest',status:2},()=>{/* functionA */}],
  [{identity:'guest',status:3},()=>{/* functionA */}],
  [{identity:'guest',status:4},()=>{/* functionA */}],
  [{identity:'guest',status:5},()=>{/* functionB */}],
  //...
])

好一点的写法是将处理逻辑函数进行缓存:

const actions = ()=>{
  const functionA = ()=>{/*do sth*/}
  const functionB = ()=>{/*do sth*/}
  return new Map([
    [{identity:'guest',status:1},functionA],
    [{identity:'guest',status:2},functionA],
    [{identity:'guest',status:3},functionA],
    [{identity:'guest',status:4},functionA],
    [{identity:'guest',status:5},functionB],
    //...
  ])
}

const onButtonClick = (identity,status)=>{
  let action = [...actions()].filter(([key,value])=>(key.identity == identity && key.status == status))
  action.forEach(([key,value])=>value.call(this))
}

这样写已经能满足日常需求了,但认真一点讲,上面重写了4次functionA还是有点不爽,假如判断条件变得特别复杂,比如identity有3种状态,status有10种状态,那你需要定义30条处理逻辑,而往往这些逻辑里面很多都是相同的,这似乎也是笔者不想接受的,那可以这样实现:

const actions = ()=>{
  const functionA = ()=>{/*do sth*/}
  const functionB = ()=>{/*do sth*/}
  return new Map([
    [/^guest_[1-4]$/,functionA],
    [/^guest_5$/,functionB],
    //...
  ])
}

const onButtonClick = (identity,status)=>{
  let action = [...actions()].filter(([key,value])=>(key.test(`${identity}_${status}`)))
  action.forEach(([key,value])=>value.call(this))
}

这里Map的优势更加凸显,可以用正则类型作为key了,这样就有了无限可能,假如需求变成,凡是guest情况都要发送一个日志埋点,不同status情况也需要单独的逻辑处理,那我们可以这样写:

const actions = ()=>{
  const functionA = ()=>{/*do sth*/}
  const functionB = ()=>{/*do sth*/}
  const functionC = ()=>{/*send log*/}
  return new Map([
    [/^guest_[1-4]$/,functionA],
    [/^guest_5$/,functionB],
    [/^guest_.*$/,functionC],
    //...
  ])
}

const onButtonClick = (identity,status)=>{
  let action = [...actions()].filter(([key,value])=>(key.test(`${identity}_${status}`)))
  action.forEach(([key,value])=>value.call(this))
}

也就是说利用数组循环的特性,符合正则条件的逻辑都会被执行,那就可以同时执行公共逻辑和单独逻辑,因为正则的存在,你可以打开想象力解锁更多的玩法,本文就不赘述了。

总结

本文已经教你了8种逻辑判断写法,包括:

if/else
switch
一元判断时:存到Object里
一元判断时:存到Map里
多元判断时:将condition拼接成字符串存到Object里
多元判断时:将condition拼接成字符串存到Map里
多元判断时:将condition存为Object存到Map里
多元判断时:将condition写作正则存到Map里

至此,本文也将告一段落,愿你未来的人生里,不只是有if/else/switch。

vs code 学习总结

昨天学了一天vs code,发现上手挺快的,我把他看成是sublime text的升级版

总结一下vs code相较与st的优势

  1. 更新快,st目前的更新感觉是停掉了;社区插件提交活跃
  2. shortcut,插件,preference,都有友好的UI界面,特别值得一提的是插件介绍页,基本上每个插件都自带gif解释,一图胜千言,学习门槛低
  3. 每个插件装好后,可以很方便在shortcut列表页搜到并调整,快捷键有冲突提示
  4. ctrl+p提示更好,没有冗余信息,文件名前置

总体来说就是把我在st中的设置与习惯搬到了vs code上,发现竟然都可以搬过来,有的体验变好了,有的体验变差了。当然我看中的是他未来插件的发展。

皮肤

这个是相处时间最长的,我花了有一段时间,才找到对比没那么强烈的皮肤

image

选择器

快速的选择是提高效率的必备武器,emmet中自带了选择,然后加上插件expand_region,即可实现sublime里边我常用的选择功能,并按照ctrl+0开始设定了快捷键

image
image

line actions

整行操作也是不可获取的效率操作,我改成了和st一致
Copy Line Down 复制本行 ---ctrl+shift+d
Move Line Up 整行上移 ----ctrl+shift+uparrow
Move Line Down 整行下移 ----ctrl+shift+downarrow

跳转定义/预览定义

Go To Definition f12
Peek Definition alt+f12

启动cmd,切编辑器和cmd区

Toggle Intergrated Terminal ---ctrl+shift+`
Focus First Editor Group ---ctrl+shift+alt+upArrow
Focus Terminal ---ctrl+shift+alt+downArrow

github开发者互动

color picker

使用过程中很不喜欢颜色预览,大多数情况下我是不需要这个的,只因为碍眼,真的碍眼
发现在issue里和我有同样感受的不止一个,于是作者应大家的要求很快就加上了去掉颜色预览的option
microsoft/vscode#10943
在setting里搜css.colorDecorators 即可找到此选项

image

keep open

另一个很不喜欢的地方是打开文件默认是当作临时文件的,此时如果打开别的文件,会在当前文件打开,而不是新开窗口。我并不觉得这样的特性有神马好的,如果要关我自己会关的,我既然打开了肯定有用。好在同样搜到了此项设定
在setting里搜workbench.editor.enablePreview 即可找到此选项
image

插件使用

open file path 这个可以按住ctrl点击文件打开文件,省力高效
expand-region 选择用,可以层级往上和层级往下
jce 支持jce语法高亮
vscode-fileheader 在文件头部插入修改日期并自动更新
beautiful UI 我用的这个皮肤
Project Manager 快速切换工程,保存用命令,打开用快捷键ctrl+shift+o 新工程打开

插件使用遇到问题解决

插件color-picker调起时遇到问题,
后来发现他的运行需要依赖某些模块,然后会自动去下载,(去看官方issue也有很多都是启动不了)
通过help-toggle develop tool 发现插件是运行在chrome的环境下的,可爱的是调试信息很丰富。
发现是npm下载遇到了问题,我本机的npm源是我们自己布的一个源,这个源下载失败了
后来切到淘宝源,还是失败了,
再试试切到npm官方源,竟然成功了
image

Settings Sync

同步所有vs code的设置
那么在别的电脑施展vs code的时候,先装上Setting Sync,再下载配置,就可以还原vs code的所有设置了,包括插件,快捷键,snippet等。

上传

  1. Settings Sync插件安装完成后,会弹出界面,点Login with github,授权他写入文件到github
  2. extension.updateSettings 上传快捷键 shift+alt+u

下载

  1. 同样login with github
  2. extension.downloadSettings 下载快捷键 shift+alt+d

实际操作中,在另一台电脑down配置的时候遇到了非预期的东东,最终找到了解决方案,看这里。

[d3js] 树图展开+树图平移缩放

效果

gif

分析

在手机端展示复杂的图表是一个话题,这个话题很少在网络上看到,那我就只能自己琢磨了。
因为要保证看清,在展现复杂图时,对图表进行缩放与平移是必不可少了。(但不需旋转)
然后很重要一点就是当图表有平移缩放时,页面是不可以有滚动条的。
为什么呢?一般来说复杂图表高度都不会很低,至少也有半屏,多则大半屏,如果图表上下有内容,页面有滚动条,这时用户滑动页面到达图表区域后,再进行缩放平移,则图表响应,滚动条不再响应!这时用户想滚动页面就成为非常困难的事情了,必须找到非图表区域滑动。

缩放平移的实现

对缩放与平移的需求如下:

  1. 平移时物体不可以移到显示区外,否则显示区就一片空白了,这不是我们的预期
  2. 缩放时要求有最大值和最小值
  3. 放大后对平移的限制依然生效
  4. 双击可放大缩小(可选)
  5. 支持鼠标滚轮(可选)
  6. 有平移缩放的事件回调(可选)

实现这个特性有几种渠道

  1. 用hammerjs 插件,提供了基本的手势事件,自己去封装实现
    http://hammerjs.github.io/examples/

  2. 找封装好的插件,不巧真被我找到了一个叫pinchZoom
    https://github.com/manuelstofer/pinchzoom

pinchZoom基本满足了前4点需求,使用上有一个需要注意的地方。比如调用是这个样子的

image

那么body的父层必须指定好宽高。

实现树图

先找几个树图的例子
http://mbostock.github.io/d3/talk/20111018/tree.html
image

当遇到极端情况,也就是树的末梢数量特别巨大时,图表的高度需要动态调整才可以,否则item之间会重叠。
当然这应该不算一个硬需求,甚至可以说是一个无关紧要的需求,因为初始时不完全展开即可,用户操作时也不会展开到这么变态的程度让自己看不清,他会自己收起来的。
不过如果要实现全部展开时也能完全看清,我在想就需要count数的末梢的数量,然后乘以item的高度即可。

数树末梢数量的问题在这篇文章有所提及,深度优先和广度优先。
https://blog.csdn.net/chaos_hf/article/details/80150911

而还有更牛逼的一个例子早已默默地实现了一切:缩放,平移,树图展开收拢,
并且还有一个新特性,那就是始终保持当前项处于画面正中。
有一个小小缺点就是平移时没有做限制,可以把图表移到框外。
http://bl.ocks.org/robschmuecker/7880033

数字格式转换器,涵盖了工作中用到的各种数字转换并兼容异常情况

在转换数据过程中,急需一个能适应以下所有情况的转换器,不然每次都要重新写规则,烦都烦死了

  1. 案例1 [34,0,''] 如果出现0或者空就返回 -- ,否则返回34%
  2. 案例2 [34,0,''] 如果出现0就返回0.00,如果出现空就返回--
  3. 案例2 [34,0,''] 如果出现0或者空就返回 -- ,否则返回23.toFixed(2)
  4. 案例3 [233444455555,0,''] 如果出现0或者空就返回--,否则返回带单位的字符串2.342亿元
validConvert({
       data:34,  //待转换的数据,必填
       suffix:'%',  //后缀,可选
       precision:2,   //精度,可选,如不填则不输出精度
       isConvertUnit:true,  //是否转换单位万亿,默认为false
       isPrecisionOnZero:true,//为0时,是否应用精度, 默认为false
       isConvertOnZero:true  //如果为0,是否输出--,默认为false
    })

这里有一个通用规则,就是为空的时候统一返回-- 否则也没必要使用这个转换器了
还有一个参数之间配置的冲突,就是当isPrecisionOnZero:true 设定了需要在0的时候保持精度,返回0.00,那么isConvertOnZero:true就会被忽视。

那么案例1的调用是这样的

案例1 [34,0,''] 如果出现0或者空就返回 -- ,否则返回34%

image

那么案例2的调用是这样的

案例2 [34,0,''] 如果出现0就返回0.00,如果出现空就返回--
当isPrecisionOnZero:true 设定了需要在0的时候保持精度,返回0.00,那么isConvertOnZero:true就会被忽视

image

那么案例3的调用是这样的

案例3 [233444455555,0,''] 如果出现0或者空就返回--,否则返回带单位的字符串2.342亿元

image

最后放出代码

    validConvert:function(options){
        var result=options.data;
        var unit='';
        var isConvertUnit=options.isConvertUnit!=undefined?options.isConvertUnit:false;
        var isPrecisionOnZero=options.isPrecisionOnZero!=undefined?options.isPrecisionOnZero:false;
        var isConvertOnZero=options.isConvertOnZero!=undefined?options.isConvertOnZero:false;

        //只要看到空就转成--
        if(options.data=='' && options.data.length==0){
            return '--';
        }
        //需要转换的情况
        if(isConvertUnit){
            if(result>100000000){
                result=result/100000000;
                unit='亿';
            }else if(result>10000){
                result=result/10000;
                unit='万';
            }
        }
        if(options.precision){
            if(!isPrecisionOnZero && options.data==0){
                //
            }else{
                result=result.toFixed(options.precision);
            }
        }
        result=result+unit;
        if(isConvertOnZero && options.data==0 && !isPrecisionOnZero){
            result='--';
        }else if(options.suffix){
            result=result+options.suffix;
        }
        return result;
    },

[项目实战] h5也能实现屌爆天的表格效果

效果

gif-finish

特性

这个表格拖动效果包含了很多很好玩的特性:

  1. 左列固定,右边多列可以左右拖动
  2. 当每一行的高度不同时,需要保持每一行高度一致
  3. 限定每一行内容最多三行文字
  4. 当上下拖动时,表头置顶
  5. 当滑动到底部时,ajax加载更多,添加到队尾,并保持1,2,3特性不bug

实现

第1个特性

结构上需要两个list,一个是固定list,一个是可滑动list,实现之后的结构是这样的
image

很容易就可以实现了
image

第2个特性

需要计算每一个行的行高,让他们各自相等
image

第3个特性

在需要保持三行的地方写上class=“max_3_row”,然后样式如下
text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 3;-webkit-box-orient: vertical; overflow: hidden; word-break: break-all; white-space:normal;

第4个特性

第一次尝试,发现右边列的标题的sticky效果没出来,这是因为父层有overflow属性
gif1

第二次尝试,想把右边列的标题改到左边去,但发现问题更大
gif2

第三次尝试,源自第一次尝试,必须去掉父层的overflow属性。那就必须改布局
之前的布局是固定列占满屏幕,右边可滑动列绝对定位盖在上边,所以必须依靠右边自身去overflow。
现在改成了固定列在左边,右边可滑动列绝对定位到右边,依靠左边的z-index大来盖住右边。
这样就只剩一个小问题了,那就是在左右滑动时,标题底部的背景色会出现断档
gif-white

这个用一个:before伪元素都可以搞定拉。
gif-finish

第5个特性

首先要注意好分页加载时的各种情况要处理好,包括是否正在loading,是否到底了,是否为空,关键点就在append后list队尾,然后refresh一下new出来的那个iscroll实例
image

不幸的实事

不幸的实事是,pc上很好的效果,在移动端会出问题。
由于第二列左右滑动,宽度是很宽的,但不能overflow的话,右边会超出宽度。
而移动端对于这种超出宽度的会产生横向的滚动条,和pc表现并不一致。
所以由于这个原因,position:sticky是没法用于滚动状态下的表格标题了,至少我想不出来了。
生活就是这样,有时很费劲搞出来以为可以了,最后还是不行,但这个挣扎并不会毫无用处。

[与时俱进] display:grid 学习总结

偶觉得flex已经很强大了,没想到grid一出,flex也逊色不少,最近才发现这么个东东-_-!
在布局上更简洁,更具灵活性,不过还未见到实战的文章
实际项目因为都是mobile下,所以并不会非grid不行,grid更大的用武之地应该是在pc端
比如说这种复杂的布局,用grid可以很优雅很简洁,并且优点就是天生等高特性,和table-cell一样
image
http://wow.techbrood.com/fiddle/33252

参考资料

张鑫旭的教程
https://www.zhangxinxu.com/wordpress/2018/11/display-grid-css-css3/
grid通关游戏
http://cssgridgarden.com/

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.