Quantcast
Channel: 懒得折腾
Viewing all 764 articles
Browse latest View live

6 次 Kaggle 计算机视觉类比赛赛后感

$
0
0

6 次 Kaggle 计算机视觉类比赛赛后感

本文作者:思颖 2018-06-08 09:50
导语:知乎上很多 Kaggler 分享是针对传统 machine learning 类比赛,对 CV 类比赛并不适用,这篇文章供刚刚接触 CV 类比赛的同学参考。

雷锋网 AI 研习社按,本文作者 dawnbreaker,首发于知乎,雷锋网(公众号:雷锋网) AI 研习社获其授权转载。

我从 2017 年年初开始接触 Kaggle。曾翻阅知乎上很多关于 Kaggle 的回答和文章,然而逐渐发现大部分文章中提到的经验和技巧是针对传统 machine learning 类比赛的,对计算机视觉类的比赛并不适用。此刻已是 2018 年 6 月,我也参加过了多次比赛,或多或少有了一些自己的观点和感想。因此我写这一篇文章希望对现存文章进行一定程度的补充,以供刚刚接触 Kaggle 计算机视觉(CV)类比赛的同学参考。尽管此文会充斥个人观点和猜测,我会尽量提供论据并淡化感情色彩。这是我在知乎的第一篇文章,希望大家能够多多鼓励和批评。

一、我的成绩

第一次 The Nature Conservancy Fisheries Monitoring
排名: 16th of 2,293 ⋅ Top 1% ⋅ 角色:队长。另一个队员叫孙鹏,是同一实验室的同学

第二次 Carvana Image Masking Challenge
排名: 12th of 735 ⋅ Top 2% ⋅ 角色:前期单刷,后来基本上由女朋友完成。

第三次 Cdiscount’s Image Classification Challenge
排名: 15th of 627 ⋅ Top 3% ⋅ 角色:基本是单刷。偶尔和女友以及朋友讨论一下。

第四次 Statoil/C-CORE Iceberg Classifier Challenge
排名: 28th of 3,343 ⋅ Top 1% ⋅ 角色:打酱油。队长是孙鹏。

第五次 Google Landmark Recognition Challenge
排名: 9th of 483 ⋅ Top 2% ⋅ 担任角色:单刷

并列第五次 Google Landmark Retrieval Challenge
排名: 22th of 218 ⋅ Top 11% ⋅ 角色:单刷。基本上只用 landmark recognition 比赛的代码跑了一下,没有进行调参等尝试,完全是投机取巧。

这六次比赛皆为计算机视觉类的任务。我还曾试图参加 TensorFlow Speech Recognition Challenge 这个语音识别类的比赛,最终因为自己过于外行和精力不足知难而退。

以上就是我的全部比赛经历。

二、Kaggle上的两个世界

Kaggle 的比赛任务大致都是根据已知信息,对测试集里的数据进行某种预测。按照主流方法是否涉及到 deep learning 来分,大概有两种比赛:

A. 一种比赛比较适合传统的 machine learning 方法,要想取得好成绩,可能要在 feature engineering 和 ensemble 方面大做文章。但基本用不上 deep learning,因此有没有好的 GPU 无关紧要。这类比赛的例子有房价预测等:

House Prices: Advanced Regression Techniques

Zillow Prize: Zillow’s Home Value Prediction (Zestimate)

Two Sigma Financial Modeling Challenge

Sberbank Russian Housing Market

Instacart Market Basket Analysis

Web Traffic Time Series Forecasting

Mercedes-Benz Greener Manufacturing

B. 另一种比赛现阶段主流的解决方案是各种深度神经网络,主要以计算机视觉类为主,任务包括 image/video classification, object detection, image masking。偶尔也有语音识别类任务。迄今为止我参加过的比赛都是这一种。参加此类比赛对硬件有一定程度的要求。比如说有一个台式机和一块或多块 Titan X/1080ti 会对模型的迭代帮助很大。但用笔记本 GPU 甚至完全不用 GPU 并且排名靠前的人也是有的:

例1:我的同学孙鹏,用笔记本上的 980M。

例2:一个叫 Eric 的 Kaggler,用 5 个无 GPU 的电脑跑 PyTorch,Google Landmark Recognition Challenge 中获得 28th/483 排名。参见 I enjoyed this competition: Feedback from a newbie!

例3:一个 ID 为 ImageRecog 的 Kaggler,声称用笔记本打比赛,在 Google Landmark Retrieval Challenge 中赢得季军。(不确定后期有没上更强大的硬件。)

但总归会痛苦很多。

很多 Kagglers 对这两类比赛之一表现出了明显的偏好。砍手豪因为缺少用来训练神经网络的硬件,而倾向于参加 A 类比赛(参见:《零基础自学两月后三月三次轻松进入kaggle比赛top20小结》)。而我自己迄今参加的都是 B 类的比赛,原因是自己习惯于处理计算机视觉类的任务,而对传统 machine learning 任务尤其是时序预测方面了解比较少,不想进去垫底。如此一来 Kaggle 上仿佛存在着两个不同的世界。A、B 类比赛都很投入地去参加的人当然也是存在的,只是据我所见大部分人都倾向于参加其中一类。

我在此强调这两类比赛的区别,一个重要原因是,我发现迄今为止知乎上大部分的 Kaggle 入门指南大都是针对 A 类比赛的。例:

参加 Kaggle 竞赛是怎样一种体验? – Naiyan Wang 的回答 – 知乎 

参加 Kaggle 竞赛是怎样一种体验? – Alex Hsu 的回答 – 知乎 

零基础自学两月后三月三次轻松进入 Kaggle 比赛top20

分分钟带你杀入 Kaggle Top 1%

Kaggle 入门指南

Kaggle 首战拿银总结 | 入门指导 (长文、干货)

随机森林——实现 Kaggle 排名 Top2% 的利器

Kaggle 实战(2)—房价预测:高阶回归技术应用

B类比赛的文章/回答则少得多,例:

参加 Kaggle 竞赛是怎样一种体验? – AI 研习社的回答 – 知乎

我在 Kaggle 數海獅

Kaggle 的比赛在 Machine Learning 领域中属于什么地位? – 幻云羽音的回答 – 知乎

我希望本文可以对关注 B 类比赛的 Kaggler 提供一些参考。

三、靠套路而豪无创新究竟能得到怎样的成绩?

有人说 Kaggle 比赛全靠套路。这句话隐含的意味是要想在 Kaggle 上获得好成绩,靠的是套路而不是智慧和灵感,或者靠的不是真正的技术。如果去杠的话,我们也可以说发 paper 也是靠套路。但我想,即使真的是靠套路,也未必是一件完全的坏事,套路中也能体现高下之分,套路中也能体现出能力的强弱吧。很多 Kaggler 的成绩都是比较稳定的。比如 bestfitting 连续在 6 个比赛中得了 Top 3。比如 Fangzhou Liao 四次参加比赛全部都是冠军。而我大部分时间都进不去 Top10,也从未出过 Top30,大概是因为我总也没参透 Top10 选手的套路,而排名 30+ 的参赛者总也没参透我的套路吧。

那么靠套路而豪无创新究竟能得到怎样的成绩?我来试图给出一个下界出来:

1. 在Carvana Image Masking Challenge 中我的第一个 baseline 模型是 Unet,而且图省事用的是 pytorch-CycleGAN-and-pix2pix 中的 Unet。为了赶快跑出个结果我把图片从大约 1000×700 缩小成了 256×256 大小。没有经过任何调参的第一次提交结果是(Private Leaderboard) Dice coefficent = 0.985517,比赛结束时这个成绩可以排到 top 72%。把图片大小改成 768×512 之后,未经任何其他修改,成绩是 coefficent = 0.995050,比赛结束时可以排到 top 53%。

2. 在 Cdiscount’s Image Classification Challenge 中我的第一个 baseline 模型是 Pytorch 的 Resnet101,第一次提交的成绩是 Accuracy = 0.71929,比赛结束时这个成绩可以排进 Top 12%。

3. 在 Google Landmark Recognition Challenge 中我的第一个 baseline 模型是 ResNet50,第一次提交的成绩是 GAP = 0.115。我后来在讨论区把这个模型的训练公开了,即便如此,这个成绩在比赛结束时居然也可以排到 Top 14%。我的第二个 baseline 模型 DELF 成绩是 GAP = 0.203,比赛结束时可以排进 top 4%!

4. 在 Google Landmark Retrieval Challenge 中我套用了 Recognition 中使用的 DELF 代码,第一个模型即是最后一个模型,没有调优过程,排名 11%.

5. The Nature Conservancy Fisheries Monitoring 是个 two-stage 比赛,两个 stage 用的测试集不同,并且 stage 1 的成绩已被主办方清空所以我无法判断我们第一个 baseline 模型可以在最终的 leaderboard 上排第几。

6. Statoil/C-CORE Iceberg Classifier Challenge 这个比赛我是打酱油的,前期的实验细节我手头暂时缺失。

以上经验表明,只要选择了与任务相对应的 state-of-art 模型,在代码无 bug,没有实验设置错误的情况下,排进 Top 50% 甚至 Top 15% 难度很小。那么另外的 50%~85% 的参赛者出了什么问题呢?我猜可能原因有如下几种:

1. 根本不知道 state-of-art 模型是什么,也不知道怎么检索或者没有检索的意识。

例:想强行套用mnist分类的方法来解决 image retrieval 问题

2. 不想离开心理舒适区,而选择自己相对比较熟悉或容易上手的工具、库和模型。

譬如说因为喜欢用 Keras 或者 Keras 刚入门而只用网上找得到源码的基于 Keras 的模型。

3. 或多或少知道 state-of-art 模型的存在,但硬件条件有限,而选择对计算资源要求不高的模型。

例:因为硬盘小或网速慢而下载缩小几倍的图片代替原图来进行训练的

4. 代码有 bug,debug 苦手。

5. 实验设置有问题。比如存在逻辑错误或者参数有严重问题。

四、参加比赛有什么好处

至于说为什么有 50%~85% 之多,如果说不是向来如此,也许是最近几年 Kaggle 更火了,入门者也更多了吧。我去年(2017)在国内已经发现很多人在求职简历里写 Kaggle 比赛经历。至于 Kaggle 比赛经历对求职有多大好处我还不能确定。值得一提的是,我在参加第一次比赛感觉坚持不下去的时候,是看了 @lau phunter 的帖子坚持下去的:

2017-8-22 更新:两年过去了大家参加 Kaggle 热情高涨标准也水涨船高,以下标准请浮动一级。
原答案:
获奖的都是有真本事的人,在上面练几个题目得个好名次,十分能证明你对数据科学这个领域的实践和理解。我现在招人的时候几乎是这个标准:
写上参加过 Kaggle 比赛,我会看简历。
得过一次 10%,我会给电话面试。
得过 2 次或者以上 10%,我会给 on site 面试。
得过一次前 10,我们会谈笑风生。
楼主加油。

虽然水涨船高,总归有人认可是好事。

我想从一个平常人的角度来讨论 Kaggle 比赛能给我们带来什么。我先来举几个不适合平常人的角度:

1. 一个网上经常被讨论的话题,就是“paper 重要还是比赛成绩重要”。我想,能考虑这个问题的人并不适用那种很极端的情况:例如 ILSVRC(Imagenet) 如果能得第一自然也能把方法发到顶会上去。——ILSVRC 能得冠军的人根本不会疑惑这种问题吧。

2. “如果进了前几名还可以获得奖金。”如果不是 Grandmaster 的级别(例:Vladimir Iglovikov 一年内获得奖金 $28k),平常人的收益风险比恐怕还不如去搬砖。

而平常人真正容易面对的情况是,发顶会 paper 被拒或者根本写不出来,参加比赛成绩不算拔尖或者被吊打。我认为一个人如果花时间可以换来顶会一作,那么不参加 Kaggle 也没有什么遗憾。

Kaggle 常年都有各种比赛,有整理好的数据集,有各种 kernel 和帖子教你怎样下载和使用数据集,甚至会给出一些 baseline 代码。获胜者也会分享他们的 solution。这些特点对于那些想要尝试一些曾经没做过计算机视觉任务的人来说是十分新手友好的。这里的新手指代的不一定是计算机视觉方面完全的新手,比如说如果你本来只熟悉物体识别,想尝试一下语义分割,那么 Kaggle 也可能很适合你。

Kaggle 还有一大特色就是实时的 leaderboard,非常残酷。如果你什么都不做,你的比赛名次只会下降。这会造成一种心理的刺激,给你压力/动力让你改善模型——当然这也是一种精神折磨。

我还有一个感想是:Kaggle 比赛给了每个 AI 爱好者被考验的免费机会。可以让一些喜欢空想和嘴炮的人检查一下自己是不是如同想象的那般厉害。但这个感想的诡异之处在于,由于我上文中提到的,只要正常跑通一个 ResNet101 就可能进 Top 15%,而或许有人觉得 Top 15% 很了不起,这样一些喜欢空想和嘴炮的人参加 Kaggle 之后或许真的觉得自己很厉害了。So paradoxical……!

还有就是会认识很多志同道合的网友,这一点不展开讨论了。

五、陷阱和一些技巧

1. 每场比赛会有多少人参与?

计算机视觉类比赛用到的数据通常是图片和视频,无论是空间占用还是计算量都比较大,大到很多人不得不因为硬件资源,或处理大规模数据的经验和能力问题,而不愿意参与数据集较大的比赛。这导致了一场比赛的参与人数和数据量强相关。小数据集的例子如 2018 Data Science Bowl 训练集只有 80M 左右,参与队数高达 3634,Statoil/C-CORE Iceberg Classifier Challenge 训练集只有 43M,参与队数高达 3343。数据集比较大的如 Cdiscount’s Image Classification Challenge 训练集 60G,参与队数为 627。而 Google Landmark Recognition Challenge 的训练集要 170G 左右,参与队数为 483。

另一个决定参与人数的主要因素是任务的复杂程度和生僻程度。纯分类任务比较受欢迎,其次是语义分割等任务。这些比较受欢迎的任务特点是门槛比较低,网上找得到大量现成的代码和模型(如 VGG、ResNet、Unet、SegNet),会调库无需深入了解原理甚至可能不用调参就能跑出像模像样的结果。(因为诸如图片分类等任务门槛特别低,以至于被某些人当做 AI 从业者的黑点。对此类黑点的态度不在本文的讨论范围。)Google Landmark Recognition Challenge 和 Google Landmark Retrieval Challenge 数据集大小几乎一样,因为 retrieval 问题的门槛相对比较高,后者的参与队伍数不到前者的一半。而 NIPS 2017: Targeted Adversarial Attack 这个对抗攻击任务,只有 65 队参加。

硬件条件好,经验丰富,能力强的人不太在乎如上两点因素,并且排名靠前经常霸榜的人大都是这样的人,因此一个人的期望排名和参与总队伍数并非是线性关系。——譬如说,我在两千队参与的比赛中得了第 16,那么同样的水平和发挥,我在六七百队参与比赛中就能进前 10 吗?没那么容易,事实证明我在六七百队参与的比赛中依然是第十几名。当然这里没有考虑到运气成分,只是个粗略的例子。

由于我抱以上述观点,显而易见我个人看重绝对排名胜于 Top 百分比。但会有很多人偏好于追求一个漂亮的 Top 百分比。我的建议是,想要 Top 百分比好看,或者目标是铜牌和银牌的同学应该多参加人多的比赛。人再多,Top 10% 都保证有铜牌,Top 5% 都保证有银牌;而人多的情况下进 Top 10% 甚至 Top 5% 的几率也大。(金牌的规则不一样,队伍总数 1000+ 的情况下金牌数只有 10+0.2%*队伍总数。参见 Kaggle Progression System

2. Public Leaderboard 陷阱

数据集小的比赛虽然门槛低,却并不真的简单容易。较小的样本量会导致验证集和测试集的样本分布差异较大。加上由于计算量小,模型迭代(这里指更新换代,不是训练一个 iteration)速度快,很容易导致一种后果:overfit 到验证集上,这种后果导致的常见悲惨结局是比赛结束的时候发现 Public leaderboard 成绩还不错,但是 Private Leaderboard 上的排名一落千丈(通常 Public Leaderboard 会被当成是某种意义上的验证集)。例如 Statoil/C-CORE Iceberg Classifier Challenge 的两个 leaderboard 上有很多人有一百多甚至两百多的排名变化,相比较而言,数据量大了的三个数量级的 Cdiscount’s Image Classification Challenge 绝大部分人排名都没有变化,少数有 1~2 名的浮动。

对此我只有一句空洞的建议:合理的 evaluation 策略至关重要。Kaggle 排名第一位的 bestfitting(真名 Shubin Dai,中国人)称:

A good CV is half of success. I won’t go to the next step if I can’t find a good way to evaluate my model.

———链接:Profiling Top Kagglers: Bestfitting, Currently #1 in the World

这些大佬们每次在比赛结束公布 Private Leaderboard 的时候排名都比较稳定,不太容易下降很多。可见看似是取决于运气的排名大震荡,在大佬手里是有办法控制的。这大概就是真功夫吧。

3. 马甲和私享代码

在数据集小的比赛中,由于迭代速度比较快,每天提交的次数又有限制(大部分比赛是 5 次),所以经常会有人注册小号来提交结果。在数据集较大的比赛中,后期也偶有这样的现象。有的人在排名比较好的时候会私下里把代码分享给别人(比如同学),以求一人得道鸡犬升天……。我在比赛中见过几次别人注册马甲或私享代码。譬如说一夜之间就冒出了一堆三无账号,成绩还都差不多。或者在成绩对参数极其敏感的任务中一次提交就飞进 Top5%,一发入魂。一人多号和私享代码是违背比赛精神的,也是 Kaggle 明令禁止的,并且也是 Kaggle 会探测和封杀的。可悲的是,经常会有中国人这样做。为什么我这么确定?因为有些账号的 ID 用的是拼音,或者地址选了 China。真是又坏又蠢,作弊本已可耻,却还要披着中国人的形象。大概是觉得自己聪明,占了便宜却无人知晓吧……然而最终这些账号都被主办方踢出了比赛或者删号处理。

4. 刷全站排名

全站排名取决于你在过往比赛中取得的总积分,积分公式如下图:

6 次 Kaggle 计算机视觉类比赛赛后感

截图来源:Improved Kaggle Rankings(图侵删)

积分是随着时间呈指数衰减的。这意味着,如果要刷高自己的排名最高纪录,那么参加几次间隔很久的比赛,不如参加几次间隔很短的比赛。

另外参加任何的比赛都不会减分,所以片面地追求全站排名不太在乎提高自身水平的,可以考虑在海量的比赛中打酱油。这是一个病态无聊但可行的策略。

5. 更多的 supervision

在绝大部分的比赛当中,在训练集上做额外的标记都是不违反规则的,只要在规定的时间(有些比赛是 deadline 的两周以前)以前上传到讨论区和其他参赛者分享。譬如说,在鱼类识别的任务中,你可以用 bounding box 标记出鱼的位置。在海狮计数的任务中你可以用 mask 来标记出每一个属于海狮的像素。这些额外的标记通常都能帮助训练出更好的模型。但开销也不小。另外要注意的是,在测试集上做标记是明令禁止的作弊行为。

六、其它

1.参加计算机视觉类的比赛需要多少 GPU

一两块 Titan X, 1080 或 1080Ti 就够了。一块 980 也勉强可以。四块以上的 GPU 当然更好,但 GPU 多了其实很难充分利用到。运算速度快到一定程度,人脑 debug、分析问题、想 idea 的时间就成了主要的速度瓶颈。如果不怎么分析问题,不怎么想 idea,走无脑穷举试错的路线,以图速度或图省事,很容易走偏。高手们会根据自己的经验和直觉来快速尝试不同的模型,所以驾驭得了更多 GPU。如果你有“只要给我更多的 GPU 我肯定能大幅提高排名”这样的自信,不妨试试 aws 上的 spot instance,如果确实如此,那就可以攒钱或求赞助来入手 GPU 了。

诚然,小数据集的比赛对 GPU 要求很低,甚至 750M 这样的 GPU 也可以用。但是因为迭代速度太快,以及 leaderboard 每天都有大浮动,这样的比赛参加起来特别费肝……

2. 什么样的排名算是一个好的排名

Jeremy Howard 在 2017 年年初或 2016 年年末(记不清了)的 fast.ai 的教学视频里(出处懒得求证了)说:排进 Top 50%,说明你的模型还 OK;排进 Top 10%,说明你是这个领域的专家;排进 Top 1说明你是世界上最顶尖的专家。他的这段话过于乐观了。很多时候排名看起来还可以,只是因为真正的(诉诸纯洁:P)专家们和大佬们大多没有时间参加 Kaggle 而已。但这么想似乎也是有失公允的,因为菜鸟和外行们也大都没有参加 Kaggle。所以谁知道呢……?

雷锋网版权文章,未经授权禁止转载。详情见转载须知


IPFS 教學和筆記

$
0
0

IPFS 教學和筆記

因為 IPFS 的繁中資料實在太少了,決定邊學習邊筆記。

本篇教學的網址是:

為什麼要使用 IPFS

IPFS (星際檔案系統) 是用來取代已經太過集中化的 HTTP 的一種方案,這裡不做一般性的介紹,因為其它 blog / Wikipedia 上都有寫了。我想使用 IPFS 的理由是:

  1. 網路過度集中化,使用者自願放棄自由,請參考 網際網路已經完蛋了
  2. 依賴單一公司提供的平台所發佈的文章,即使沒有反政府、侵權、政治不正確 blah blah 還是有各種不同的可能被下架,而你已經在 EULA 中同意不去追究了。
  3. Google Blogspot, Tumblr, Facebook Blog 提供的免費、高品質 blog,仍然有上述的疑慮。
  4. 即使是自己架的 Word Press,哪一天被警察用任何理由抄掉了,上面的網頁就沒有了。

去中心化,才能有民主、自由的網路。即使如此,去中心化仍然需要網路中立性的支持,不然你的 ISP 仍然可以獨厚(加速)大公司的網站。

本篇教學 不會 論述以下主題:

  • 免責或匿名性。這是另一個大題目,去中心化不代表你可以匿名。
  • 挖礦、區塊鏈、或任何虛擬貨幣。
  • ICO 特別是 IPFS 最近的 Filecoin ICO 。

完整的介紹性文章,可以參考 InfoQ 的 IPFS:替代HTTP的分布式网络协议 。

下載、安裝

下載

下載很簡單,請直接到 IPFS 官網 或直接 點這裡下載。我直接下載了 go-ipfs 0.4.10, Mac OS X 請下載 Darwin amd64, Ubuntu 請下載 Linux amd64。

安裝

直接在命令列下打這些指令就好:

$ ipfs init     # 會在 ~/.ipfs 開一個目錄,存放區塊檔,預設是最大 10GB

$ ipfs id       # 列出自己的 ID, 但其實不需要太介意
{
	"ID": "QmNmfAqjiQgdLJscpM3FufbaXY9QEqWZiWqDTbsrUjSKDR",
	"PublicKey": "...",
	"Addresses": [
		"..."
	],
	"AgentVersion": "go-ipfs/0.4.10/",
	"ProtocolVersion": "ipfs/0.1.0"
}

想修改預設的暫存大小的話,請下這個指令:

export EDITOR=/usr/bin/vim
ipfs config edit

找到 "StorageMax": "10GB", 這行,把 10GB 換成你要的大小即可。

新增檔案

先來隨便新增一個檔案吧。打開記事本,隨便打幾行字 lorem ipsum dolor sit amet 存成 README.md

ipfs add 可以把檔案加進 IPFS 裡,它會傳回一組 HASH, 那個 HASH 就是這個檔案的唯一識別代碼了。

$ ipfs add README.md
added QmQhK6KAVA2nJgFYzf7D1yHdH11GiGJv6zRTUhoVZwXpDd README.md

$ ipfs cat /ipfs/QmQhK6KAVA2nJgFYzf7D1yHdH11GiGJv6zRTUhoVZwXpDd
lorem ipsum dolor sit amet

即使你換到別台機器,一樣可以用 ipfs cat /ipfs/QmQhK6KAVA2nJgFYzf7D1yHdH11GiGJv6zRTUhoVZwXpDd 看到這個檔案的內容。

如果要分享給沒有安裝 IPFS 的朋友(建議順便推坑!) 可以請他使用 IPFS Gateway: https://ipfs.io/ipfs/QmQhK6KAVA2nJgFYzf7D1yHdH11GiGJv6zRTUhoVZwXpDd 把後面的 HASH 換成你剛剛新增的檔案的 HASH,就可以了!

我比較習慣目錄

大家都還是比較習慣目錄結構吧?已經 ipfs add 的檔案,可以被放進目錄裡。

$ ipfs files mkdir /SmartCity   # 開一個目錄
$ ipfs files cp /ipfs/QmQhK6KAVA2nJgFYzf7D1yHdH11GiGJv6zRTUhoVZwXpDd /SmartCity/README.md
$ ipfs files ls /
SmartCity
$ ipfs files ls /SmartCity/
README.md
$ ipfs files read /SmartCity/README.md
lorem ipsum dolor sit amet

我目前還不知道怎麼把目錄 export 出去,讓別人也可用使用同樣的目錄結構。

上傳一整個目錄

使用 ipfs add -r 可以上傳一整個目錄。比方說,這篇教學可以用這種方式上傳 (小心 不要把 .git/ 下面的東西都傳上去了!)

$ ipfs add -r ipfs-tutorial-taiwan-mandarin
added QmdpYD8hejksA5SHNdRfDzE2EYzpSkbazyVAJq5hRwbKtp ipfs-tutorial-taiwan-mandarin/README.md
added QmWe7m2K8DThCUTPuw5KcbYvpAwogScXt8gazfG7QiRpSo ipfs-tutorial-taiwan-mandarin

這樣就可以用下列方式取得 README.md 的內容:

  1. ipfs cat /ipfs/QmdpYD8hejksA5SHNdRfDzE2EYzpSkbazyVAJq5hRwbKtp
  2. ipfs cat /ipfs/QmWe7m2K8DThCUTPuw5KcbYvpAwogScXt8gazfG7QiRpSo/README.md

我在 IPFS 上的第一個網頁

IPFS 的本質是分散式的檔案系統,如果只是要 host 分散式的部落格的話,可以使用 ZeroNet 。晚一點我會再寫一篇 ZeroNet 的介紹。

請注意 如果在 pin 或 publish 的過程中遇到任何問題,可能是防火牆的關係。跑 ipfs daemon 的時候,它會列出對外連線的 port 請在防火牆打開。

% ipfs daemon
Initializing daemon...
Adjusting current ulimit to 2048...
Successfully raised file descriptor limit to 2048.
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/192.168.2.1/tcp/4001
Swarm listening on /ip4/220.xxx.xx.xxx/tcp/4001 ← 這個!!
Swarm listening on /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready

Debian 系的 Linux 請愛用 sudo ufw allow 4001 即可。

出於莫名的原因,我決定不要使用最常見的 Jekyll 。以下範例是 Hugo 做的 🙂

Huge 後面還有使用 ipfs 範例中的 mdown 來 render 的例子。

安裝 Hugo

參考 Hugo官網 的說明,在 Mac 上安裝 Hugo:

$ brew install hugo
Updating Homebrew...
Warning: hugo 0.26 is already installed
$ hugo version
Hugo Static Site Generator v0.26 darwin/amd64 BuildDate: 2017-08-08T14:55:38+08:00
$ hugo new site ipfs-tutorial-zh-TW
Congratulations! Your new Hugo site is created in /Users/miaoski/github/ipfs-tutorial-zh-TW.
$ git init
Initialized empty Git repository in /Users/miaoski/github/ipfs-tutorial-zh-TW/.git/
$ git submodule add https://github.com/budparr/gohugo-theme-ananke.git themes/ananke
Cloning into '/Users/miaoski/github/ipfs-tutorial-zh-TW/themes/ananke'...
$ echo 'theme = "ananke"' >> config.toml

修改 config.toml 設定一下 title 和語系什麼的,就可以了。

新增 blog 文章

$ hugo new posts/ipfs-tutorial.md
/Users/miaoski/github/ipfs-tutorial-zh-TW/content/posts/ipfs-tutorial.md created
$ cat ../ipfs-tutorial/README.md >> ./content/posts/ipfs-tutorial.md

修改一下,把 draft: true 改成 draft: false 再執行一次 hugo 就可以 render 出網頁了。

把部落格新增到 IPFS 上

依據 hugo 的建議,先 rm -fr public/ 再重新執行 hugo 比較好…

$ rm -fr ./public/
$ hugo
$ ipfs add -r ./public/
added QmW7dJkAjtLgUtJcgUrTPC2jSLTD8uS4bfzPPXYdsZGhFN public/posts
added QmecA1oy5du9TwNrJrwxjq5emUdG7jbukv8Pzuo2q8CjRc public/tags
added QmT7TX5vGmFz86V8cDkPuTss1vp4qTXeaziGZrjdJhURFf public

請跳到 IPNS 一節閱讀。

mdown

mdown 是 ipfs 範例中的 markdown-viewer 是以 MIT 版權宣告的。有時候我們只是想分享一份簡單的 markdown,它十分輕量,render 出來的效果也不錯。它的背後是 StrapDownJS。

本文的 Github repo 已經把 mdown 加在裡面了,直接 make 就會看到 ipfs add 上去的 HASH。它也會寫在 published-version 檔案裡。接著我們可以用 IPNS 發佈它。

IPNS

拿到網站的 HASH 後,建議註冊 IPNS ,因為每次更新部落格的內容,上面的 HASH 都會變,我們需要一個固定的 ID 指向最新的 HASH 。以本文為例:

$ ipfs name publish QmT7TX5vGmFz86V8cDkPuTss1vp4qTXeaziGZrjdJhURFf
Published to QmNmfAqjiQgdLJscpM3FufbaXY9QEqWZiWqDTbsrUjSKDR: /ipfs/QmT7TX5vGmFz86V8cDkPuTss1vp4qTXeaziGZrjdJhURFf 
$ ipfs name resolve QmNmfAqjiQgdLJscpM3FufbaXY9QEqWZiWqDTbsrUjSKDR
/ipfs/QmT7TX5vGmFz86V8cDkPuTss1vp4qTXeaziGZrjdJhURFf

以後每次更新完網站,都要重新 ipfs add -r ./public/ 一 次,然後再執行 ipfs name publish ... ,這樣/ipns/QmNmfAqjiQgdLJscpM3FufbaXY9QEqWZiWqDTbsrUjSKDR 才會指向最新的 HASH 哦! (注意是 IPNS 不要搞錯!)

使用 hugo 的同學,順便更新 config.toml:

baseURL = "https://ipfs.io/ipns/QmNmfAqjiQgdLJscpM3FufbaXY9QEqWZiWqDTbsrUjSKDR/"
languageCode = "zh-tw"
title = "第一次用 IPFS 就上手"
theme = "ananke"

快取 (pin)

把內容快取到本地端,並且提供給其他人。

ipfs pin add QmT7TX5vGmFz86V8cDkPuTss1vp4qTXeaziGZrjdJhURFf

add 本身就是遞歸的,所有的子目錄都會被 pin 住。可以用 ipfs pin ls 看看本地端 pin 了什麼。 這一篇 的指令都可以玩玩看。

TXT

因為一串 HASH 真的很難記,所以可以用修改 DNS 的 TXT 欄的方式,讓使用者可以用 https://ipfs.io/ipns/miaoski.idv.tw/ 這種方式,存取到你的檔案或部落格。要特別注意, TXT 設定完後,如果你用筆電的話,不要太快離線,不然別人可能還來不及 cache 住 TXT 解析的內容。

$ host -t TXT miaoski.idv.tw
miaoski.idv.tw descriptive text "dnslink=/ipns/QmNmfAqjiQgdLJscpM3FufbaXY9QEqWZiWqDTbsrUjSKDR"

下面的情況都是正常的。但是 ipfs name resolve -r 必須要能正確解析出 /ipfs/ 的位址,別人才看得到你公開的內容。

$ ipfs name resolve miaoski.idv.tw
Error: Could not resolve name (recursion limit exceeded).

$ ipfs dns -r atnnn.com
Error: not a valid domain name

$ ipfs dns atnnn.com
Error: Could not resolve name (recursion limit exceeded).

來試試看我的網頁吧! https://ipfs.io/ipns/miaoski.idv.tw/

我還不懂的部份

  • BitSwap
  • DHT
  • 把 git repo 和 IPFS 整合在一起

參考資料

License 版權聲明

我自己編寫的部份,全部使用 CC BY-SA 4.0 聲明。如果有引用他人的部份,請參考各該文件所屬的版權聲明。

Machine Learning Top 10 Articles for the Past Month (v.June 2018)

$
0
0

Machine Learning Top 10 Articles for the Past Month (v.June 2018)

For the past month, we ranked nearly 1,400 Machine Learning articles to pick the Top 10 stories that can help advance your career (0.7% chance).

Tweet of the month
  • Topics in this list: Google Duplex, Portraits, Grid cells, Neural Network, Airbnb, Loc2Vec, TensorFlow, Keras, 1st Place Solution, CVPR2018
  • “Watch” Machine Learning Monthly Top 10 on Github and get email once a month.

As an article ranking service for professionals, we take quality very seriously and make sure each article you read is great. Mybridge AI considers the total number of shares, minutes read, and uses our machine learning algorithm to rank articles. This is a competitive list and you’ll find the experience and techniques shared by the Machine Learning leaders useful.

Course of the month:

A) Beginners: Python for Data Science and Machine Learning Bootcamp.[21,763 recommends, 4.5/5 stars]

B) Advanced: Artificial Intelligence: Reinforcement Learning in Python.[1,768 recommends, 4.6/5 stars]

Rank 1

Google Duplex: An AI System for Accomplishing Real World Tasks Over the Phone. Courtesy of Yaniv Leviathan

……[DEMO]


Rank 2

Deep Video Portraits: A novel approach that enables photo-realistic re-animation of portrait videos using only an input video. Courtesy of Christian Theobalt

……[Paper]


Rank 3

Navigating with grid-like representations in artificial agents. Courtesy of Andrea Banino, Dharshan Kumaran, Caswell Barry

……[News]


Rank 4

How to build your own Neural Network from scratch in Python. Courtesy of James Loy


Rank 5

Categorizing Listing Photos at Airbnb: Large-scale deep learning models are changing the way we think about images of homes on our platform. Courtesy of Shijing Yao


Rank 6

Loc2Vec: Learning location embeddings with triplet-loss networks. Courtesy of Sentiance


Rank 7

Real-time Human Pose Estimation in the Browser with TensorFlow.js. Courtesy of TensorFlow


Rank 8

Multi-label classification with Keras. Courtesy of Adrian Rosebrock


Rank 9

Google Landmark Retrieval Challenge: 1st Place Solution Summary — Kaggle. Courtesy of Mikel Bober-Irizar


Rank 10

Learning to See in the Dark. Courtesy of Chen Chen, Qifeng Chen, Jia Xu and Vladlen Koltun

……[Video]



That’s it for Machine Learning Monthly Top 10. Visit our publication to find top posts for more programming skills.

Angular Top 10 for the Past Month (v.May 2018)

$
0
0

Angular Top 10 for the Past Month (v.May 2018)

For the past month, we ranked nearly 800 Angular articles to pick the Top 10 stories that can help advance your career (1.25% chance).

Tweet of the month
  • Topics in this list: Angular 6, Architecture, ng-conf, Angular Universal, Singleton, Bootstrap 4, Tutorial, Web Assembly
  • “Watch” Angular Monthly Top 10 on Github and get email once a month.

As an article ranking service for professionals, we take quality very seriously and make sure each article you read is great. Mybridge AI considers the total number of shares, minutes read, and uses our machine learning algorithm to rank articles. This is a competitive list and you’ll find the experience and techniques shared by the Angular leaders useful.

Course of the month:

A) Beginners: Angular 6 (formerly Angular 2) — The Complete Guide.[48,237 recommends, 4.7/5 stars]

B) Build an app with ASPNET Core and Angular from scratch. [1,227 recommends, 4.7/5 stars]

Rank 1

Version 6 of Angular Now Available. Courtesy of Stephen Fluin


Rank 2

Architecture in Angular projects. Courtesy of Cyrille Tuzi


Rank 3

Day 1 Keynote — Brad Green, Miško Hevery, Kara Erickson. Courtesy of Brad Green, Miško Hevery, Kara Erickson

……[Keynote]


Rank 4

Angular Universal: Comprehensive Step-by-Step Guide. Courtesy of Angular University


Rank 5

Trip report from ng-conf 2018. Courtesy of Stephen Fluin


Rank 6

Angular Services do NOT have to be Singletons. Courtesy of Netanel Basal


Rank 7

The Best Parts of Bootstrap 4 You are Missing in Angular Material. Courtesy of Amadou Sall


Rank 8

Optimizing an Angular application — Minko Gechev. Courtesy of Minko Gechev


Rank 9

Upgrading an Application to Angular 6: Step By Step. Courtesy of Dan Wahlin


Rank 10

Using Web Assembly to speed up your Angular Application. Courtesy of Lukas Marx

That’s it for Angular Monthly Top 10. If you like this curation, read best daily articles based on your programming skills on our website.

A complete beginners guide to installing a Bitcoin Full Node on Linux (2018 Edition)

$
0
0

A complete beginners guide to installing a Bitcoin Full Node on Linux (2018 Edition)

How to compile a Bitcoin Full Node on a fresh installation of Kubuntu 18.04 without any Linux experience whatsoever.

Preface

I recently installed a new SSD so I wouldn’t have to prune on my laptop and figured I’d give creating a tutorial a shot.

Never used Linux? Don’t know what “prune” means? Perfect. This one’s for you. I want you to learn Linux, and I want Bitcoin to motivate you to switch. This will be as much a “Linux for Dummies” guide as it is a guide to setting up a Bitcoin node.

If you already know a thing or two and want to skip all the useless words:

Just copy and paste the commands at the bottom of this article.

Most tutorials just give you the steps, and while some are actually pretty good at elaborating a bit this one is literally going to spoon feed you all the questions you might have, down to what each command does. The only precursor knowledge I’ll assume you have is the ability to figure out how to download & mount the ISO image I link below, boot it, and follow the default install instructions. I’ll be making no major changes to the default install configuration except for encrypting my entire drive and importing my desktop preferences and theme. We want to avoid complications, which is why I won’t be installing anything else first, just Bitcoin and the screen capturing software, so any dependency issues along the way we should both have. If you run into any other issues, got confused somewhere, or think I should include something, just comment below or reach out to me on Twitter and I’ll try to assist or amend the article.

This tutorial was semi-inspired by Grubles Lightning Network tutorial.

Part I — Setting Up

Skip this section entirely if you’re already on Linux.

Download Kubuntu ISO image

Kubuntu is Ubuntubut shinyThe most recent LTS release is 18.04.

Install ISO image to USB or CD

Follow follow Ubuntu’s official tutorial for Windows or macOS.

Install the OS

You’ll set up a computer name, user, and password. My username for this tutorial will be satoshi, and the computer name will be nakamoto.

Log In

After installation and a successful login, your desktop should look like the screenshot below. Feel free to play around and get accustomed, but at some point navigate to the Application Launcher and run Terminal (Konsole).

We’re going to be working within this single window for the majority of this tutorial until we get to the end, but I’m going to open up the File Manager, called Dolphin, as well as import my theme and desktop preferences.

Before we enter anything into the terminal let’s take a look at what we already see. At the top of the terminal window it says “Konsole”. That’s just the name of the software specific to this desktop environment. Sometimes you’ll see it referred to as Terminal, Command Line, or just the shell.

satoshi is the username. nakamoto is the computer’s hostname and will show up on whatever network you may be connected to. Yours will be whatever you selected during the installation.

In between the : and $ you’ll see a ~ . This is an abbreviation for your /home/<username> directory. /home/<username> is like “My Documents” in Windows.

These two mean the same thing, but you’ll always just see ~ when in there:

satoshi@nakamoto:~$

satoshi@nakamoto:/home/satoshi$

Part II — Prerequisites & Dependencies

Skim this section for the commands if you’re already on Linux. I’ll even condense them all at the bottom of this article for those who don’t need the explanations.

The first thing we’re going to do in the terminal is check for updates. Type the following and hit enter (along the way you’ll be prompted to type “y” for yes, and your password):

satoshi@nakamoto:~$ sudo apt-get update

sudo is sometimes called “superuser do”. It’s kind of like using “Run as administrator” in Windows, but better. It’s necessary throughout this tutorial because the commands that follow it will try to do things that require superuser privileges.

apt-get lets you interface with available software libraries so you can download software straight from the terminal.

update is one of a few commands that must follow the use of apt-get, and it will check for updates to any packages you have installed and install them.

Next we’re going to install Git. It’s widely used open source-software designed for handling other open-source (and closed) projects. We’ll be using Git to access the Bitcoin repository and download its code.

satoshi@nakamoto:~$ sudo apt-get install git

install should be self explanatory, it’s like update, but for when you’re installing a specific package for the first time. It requires a package name.

git is the name of the Git package, and is recognized as such by the list of sources the apt-get command refers to. It will also function as a command after it is installed.

— — — —

Now we’re going to make a folder within our home directory and then change to that directory so we can copy the files we need right into it. We could clone this into any folder we want, this is just the path I chose to create within the home folder.

First, enter the following line:

satoshi@nakamoto:~$ mkdir -p bitcoin-source && cd bitcoin-source

Now it should look like:

satoshi@nakamoto:/home/satoshi/bitcoin-source$

mkdir makes a directory. This is like right clicking on the desktop or in a window and selecting “New > Folder”.

-p is a flag. Flags are command-line options and will start with a . Each command (like mkdir) has their own set of options, so -p may do something else for another command. In this case -p overrides some errors you might get when trying to create a directory, and actually does what you’d probably want mkdir to do in the first place. If you wanted to create the directory /test1/abc123/haha , without -p, it thinks you just want /haha and you would get an error saying /test1 and /abc123 don’t exist. With -p those errors are ignored and both parent directories that “don’t exist” are created as well.

bitcoin-source is just the directory/folder name we’re going to create.

&& allows you to execute another command on the same line, but will only execute the second command if the first command doesn’t fail with an error.

cd will change the current directory to the one you specify. In this case it will change to the /bitcoin-source directory we just created.

Then enter:

$ git clone https://github.com/bitcoin/bitcoin.git

git clone will copy the Bitcoin repository from Github.com into the directory you’re in when you enter the command. Since were in ~/bitcoin-source, this will create the directory ~/bitcoin-source/bitcoin and place all the necessary files in there.

— — — —

You can check to see if the files installed by using the ls command, or you can browse to that directory in the File Manager.

$ ls bitcoin

ls will output all the non-hidden folders in the directory you’re currently in.

ls bitcoin will look for a /bitcoin folder within the directory you’re in, and then output all the non-hidden folders in that directory.

ls -a will output all folders, including hidden folders if any exist. Hidden folders begin with a . and will look like this: /home/satoshi/.abc123

Navigate to this folder and stay here, you’ll see files get created later when we run some other commands.

— — — —

Now we need to install some libraries, along with the Berkeley Database. When installing libraries you can sometimes list many in a single command and separate them with a single space. In this tutorial I’ve split them into groups per the build documentation on Github for Ubuntu, as I’ve tried to combine them before and have gotten errors:

Libraries:

$ sudo apt-get install build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils python3
$ sudo apt-get install libboost-all-dev
Videos I took longer than 60’s are getting cut by the host site, not much of an issue here though.

— — — —

This will download and verify the Berkeley Database is legitimate:

$ wget http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz
$ echo '12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef  db-4.8.30.NC.tar.gz' | sha256sum -c

After entering the echo command you should get this response back:

db-4.8.30.NC.tar.gz: O`K

I cut the video during the download here, it took about 6 minutes for me.

— — — —

The following commands will extract (tar -xvf)the Berkley Database we just downloaded and checked, then build and install it. It will also set a path shortcut so only BDB_PREFIX needs to be typed when referencing the dependency. Normally when entering a command, if you’re already halfway into the path you only need to reference to the remaining path, but when you’re compiling you want to ensure the full path gets referenced:

$ tar -xvf db-4.8.30.NC.tar.gz
$ cd db-4.8.30.NC/build_unix
$ mkdir -p build
$ BDB_PREFIX=$(pwd)/build
$ ../dist/configure --disable-shared --enable-cxx --with-pic --prefix=$BDB_PREFIX
$ sudo make install
$ cd ../..
The database took about 2 minutes during sudo make install. I cut that out.

— — — —

More Libraries:

$ sudo apt-get install libminiupnpc-dev
$ sudo apt-get install libzmq3-dev
$ sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler
$ sudo apt-get install libqrencode-dev

That concludes the prerequisites, now onto actually installing Bitcoin.

Part III — Compiling Bitcoin Core 0.16.0

We’re still in /home/satoshi/bitcoin-source so let’s move into the /bitcoindirectory, compile, and install:

$ cd bitcoin
$ git checkout tags/v0.16.0
$ ./autogen.sh
$ ./configure CPPFLAGS="-I${BDB_PREFIX}/include/ -O2" LDFLAGS="-L${BDB_PREFIX}/lib/" --with-gui
$ make
$ sudo make install

git checkout tags/v0.16.0 will reference the specific “commit” from the git history. “Branches” can change as updates occur so referencing a branch may make the command not work in the future.

./autgen.sh will, simply put, prepare the build files for install.

The video cut short before the make sudo make install commands, but it took about 25 minutes to complete.

Once that completes you have Bitcoin Core installed.

Part IV — Configuring and familiarizing yourself with your new node

Much of this section isn’t required to run the software. In the future you’ll likely just run it in the background and let it be. Again, this just to help you get a feel for what’s going on behind the scenes, not just trusting a background process to work.

The first thing I want you to do is set up a few windows before we run Bitcoin for the first time. We’re going to run the GUI version first, called bitcoin-qt,then we’ll exit it and run the non-GUI version called bitcoind, and then back to bitcoin-qt, with some steps and configuration in between so you can understand what’s really happening and feel comfortable starting and stopping the software when you need to.

Close all open windows, and open two brand new terminal windows and the file manager. In the file manager navigate to /home/satoshi/. You only have to click Home on the sidebar. Then from the menu bar at the top select Control and check the box for Hidden Files. In one of the terminal windows enter the following:

$ mkdir ~/.bitcoin
$ cd ~/.bitcoin

You should now see a folder named .bitcoin appear in the file manager as well. Navigate into that folder, and we’re now redundantly in this directory both in the terminal and file manager, but for a reason.

— — — —

Now we’re going to create a file called debug.log. When you first launch Bitcoin, both this hidden folder, and the debug.log file are automatically created, but you’ll see why I want to do this ahead of time in a moment:

$ touch ~/.bitcoin/debug.log

Now we’re going to tail the debug.log file. Log files get updated continuously with new lines of information as the program takes a log of it’s actions. The tail command shows you the most recent entries into that file, but only once. Using the -f flag will give you a continuously running stream of those updates. When you enter the following command you’ll see nothing because Bitcoin isn’t running yet, but we’ll leave it like this for now:

$ tail -f ~/.bitcoin/debug.log

In the other terminal window we opened, run Bitcoin by entering the following:

$ bitcoin-qt

You’ll see the loading image and then the GUI with a message that shows the syncing status. If we never created that .bitcoin folder you also see the setup screen where you’d select the location you want to store the blockchain data and other files. The default location is the folder we just created (/home/satoshi/.bitcoin) so it won’t ask and just assume.

You’ll start to see activity in the terminal where you tailed the debug.log file. All of the above should look like this on your screen:

I had to record over the recording here to block out my IP address, so you’ll see another taskbar pop up.

You can watch this for however long you want because it will take a long time to sync, but at some point, in the terminal window you entered bitcoin-qt on, press CONTROL+C. You’ll see the GUI close down, and the log file will stop. You can read the exit messages in the log, and you can scroll up and read all the different events that occurred. Now that it’s stopped, in the same terminal you ran bitcoin-qt in, type the following:

$ bitcoind

You should see the log tail going again, but this time you won’t see the GUI. Bitcoin is running in the background. Hit CONTROL+C again and let it stop.

— — — —

We need to create a configuration file now so n the file explorer create a file called bitcoin.conf . Open it, type the following and save the file:

debug=net

By default, not all the debug information is included in the log file. Setting it to 1 will include all of it, but there’s way too much to that all the info flies by too fast. All the options you can set are: net, tor, mempool, http, bench, zmq, db, rpc, estimatefee, addrman, selectcoins, reindex, cmpctblock, rand, prune, proxy, mempoolrej, libevent, coindb, qt, leveldb.

This is also where you can optionally set your node to prune the blockchain as it goes along. Right now the entire blockchain is about 160 GB in size. If you don’t have enough storage space, you could prune the data down to under 5 GB at the moment. I don’t recommend doing that unless you need to, but this is what you would enter on it’s own line to bring it down to 10 GB:

debug=net
prune=10000

Your config file can have many options set, and it doesn’t matter what order they’re in, so it could also look like this if you hypothetically want to restrict your nodes mempool to 100 MB worth of transactions:

maxmempool=100
prune=10000
debug=net

For now just save the bitcoin.conf file with debug set to net and pruned if you need it. Originally when I recorded this for the tutorial, I made some mistakes and set it to 1, but the steps are the same:

— — — —

Open a third terminal and enter the following:

$ tail -f ~/.bitcoin/debug.log | grep "UpdateTip:"

Again because it’s a tail, you’ll see nothing until you re-run bitcoin-qt or bitcoind.

grep is a command that has a few functions, but in this context, it will take the output from the first command and filter it so it only shows lines that include the text within the quotes. UpdateTip: is specific verbiage that only appears when a new block is added. The | is commonly called a “pipe”, and all it really means is “take the output of the first command and send it through the second command”. You’ll hear people say terms like “pipe it to grep” or “pipe it to more”, and this is what they mean.

In the other terminal enter the following:

tail -f ~/.bitcoin/debug.log | grep -v "UpdateTip:\|Requesting block\|sending getdata\|recieved block\|received: block"

This is the same command but with the -v flag, and will do the opposite of the previous command and filter out any line with the text we specify.

UpdateTip: is included first, because we’re already pulling that specific information into a different window. What you’ll see next are the two symbols \|and what these do is tell the grep command “filter out x and y and z and …”

So now we’ve effectively split a single log file up into two outputs so we can more accurately watch what’s going on, and filter out some redundant info I’ve chosen so you have a slower scrolling output. This way you can keep direct track of the blocks coming in with the second tail command without it forcing the other information out of the way. Feel free to play around with what you want to include and exclude until you’re comfortable using the command.

Now that you have two terminals with tail commands “waiting”, go ahead and run bitcoin-qt again, and this time let it run so it actually starts making sync progress:

That’s it! Just let it sync. Depending on your hardware/bandwidth it could take anywhere from a handful of hours to multiple weeks (unlikely).

When it’s finally synced, blocks will start coming in once every ~10 minutes on average and the the debug.log file will start showing a lot more activity, including transaction relaying information which doesn’t begin until after the IBD (Initial Block Download) period.

Part 0 — For those here who just need the commands:

sudo apt-get update;
sudo apt-get install git;
mkdir -p bitcoin-source && cd bitcoin-source
git clone https://github.com/bitcoin/bitcoin.git;
sudo apt-get install build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils python3;
sudo apt-get install libboost-all-dev;
wget http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz;
echo '12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef db-4.8.30.NC.tar.gz' | sha256sum -c;
tar -xvf db-4.8.30.NC.tar.gz;
cd db-4.8.30.NC/build_unix;
mkdir -p build;
BDB_PREFIX=$(pwd)/build;
../dist/configure --disable-shared --enable-cxx --with-pic --prefix=$BDB_PREFIX;
sudo make install;
cd ../..;
sudo apt-get install libminiupnpc-dev;
sudo apt-get install libzmq3-dev;
sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler;
sudo apt-get install libqrencode-dev;
cd bitcoin;
git checkout tags/v0.16.0;
./autogen.sh;
./configure CPPFLAGS="-I${BDB_PREFIX}/include/ -O2" LDFLAGS="-L${BDB_PREFIX}/lib/" --with-gui;
make;
sudo make install;
bitcoin-qt

我们正在用全世界绝无仅有的方式对抗经济规律

$
0
0

我们正在用全世界绝无仅有的方式对抗经济规律

作者 奶包的大叔
01
在中国,房价问题几乎有一个铁律:越调控越暴涨。
截止至5月中旬,全国各地发布的调控政策数量就已经超过了115个。仅4月份,全国各种房地产调控政策合计多达33次,25个城市与部门发布调控政策,其中海南、北京、杭州等城市发布了多次房地产相关新政策。
为何要如此恐慌式的密集调控呢?因为一个残酷的现实:我们正在用全世界绝无仅有的方式来对抗经济规律。
这样对抗的后果是显而易见的:一旦失败,房地产的崩溃将直接导致中国泡沫经济的崩溃;一旦成功,全人类的经济学教材都将重新改写,包括《资本论》。
一个无法回避的问题是:
我们是如何走到这种命悬一线、无法自拔的境地的呢?
因为人类经济发展的定律:所有的经济问题都可以归结为债务问题。从宏观来看,债务问题体现在国民经济的三大部门:政府、企业、居民。其中,政府和企业部门的债务和杠杆率多年来一直都居高不下,处于高危崩溃的边缘。正是为了降低这两个部门的债务和杠杆率,才出现了上一波的加杠杆和现在这一波去杠杆的迫切需要。加谁的杠杆?加居民的杠杆。去谁的杠杆?去政府和国企的杠杆。这是一个规模宏大的债务转移过程,实现方式具有极强的中国特色(其他国家无法复制):
为什么会提到货币超发问题呢?这又涉及到了汇率和房价的经典问题:保汇率?还是保房价?由于中国庞大的经济体量,几乎决定了失去汇率和房价中的任何一个都会导致灾难性的后果,因此,保汇率还是保房价这个经典问题就变成了既要…又要…的特色问题。
很明显,通过印钞票是无法解决这个问题的,委内瑞拉就是活生生的例子。外汇储备是汇率的基础,也是人民币的货币之锚。唯一(可能)有效的方法,只有外汇管制。然而,在2016~2017的人民币贬值、资金外逃狂潮中,中国的外汇储备从4万亿跌破了3万亿关口;随后在强力的外汇管制和一波媲美于好莱坞大片式的操作下,才扭转了人民币贬值的预期。
但这一次的外汇管制,却没有像过去那样成为起死回生的灵丹妙药:虽然人民币对美元的汇率从6.9回升到了6.25,但中国的外汇储备却只回升了不到2000亿美元,而且还增加了2984亿美元的外债,再加上约3000亿美金的贸易顺差。而目前3.12万亿美元的外汇储备中,外债水平已经达到了约1.8万亿,也就是说,实际上能够用的外汇储备也就一万亿。
现在,随着美元开启了新一轮的升值周期,人民币汇率也开始了七连跌,4月份公布的外汇储备比上个月减少了180亿美元。在这一波美元的升值过程中,如果人民币汇率不能维持在6.6以上,那么汇率贬值的预期将再度回来,而这个时候,我们已经没有多少弹药可以用了。
阿根廷的悲剧已经为我们敲响了警钟,而另一方面,为了防止房价崩盘,体量庞大的房地产市场却需要百万亿级的资金来维持。
偏偏在这时,贸易战爆发了。
于是在外贸、投资、内需这三驾马车中,只剩下内需这一条路了,这也就是为什么新闻上天天高喊内需升级的原因。
然而颇具讽刺意味的是,房地产作为最大的内需,却挤占了几乎全部其他的内需消费空间,这时提升内需几乎成为了提升房地产的代名词。因此,才会出现许多怪诞的情景:博鳌论坛上央行刚刚表示了要进入紧缩周期,但却在10天之后宣布了降准;连中央高层都一再强调了房住不炒,樊纲却提出了六个钱包。
如此矛盾重重的政策背后,不仅仅反映的是贸易战的残酷,还暴露出了更大的风险:经济规律的惩罚,从来都不会因个人意志而消失。
02
股、债、汇、房,这四个交易市场是国家金融的命脉。
先说说这其中的房(地产市场)。
对于一个健康的经济体来说,房产本来是不应该出现在其金融交易市场中的,然而,在房产被赋予了金融属性之后,便开始对整个金融系统产生了不可估量的巨大能量。而在这个叫做地球的星球上,只有三个国家尝试过这种毁天灭地的巨大能量:世界经济排名前三的经济体——美国、中国、日本。(事实上,许多小国也尝试过,但是由于经济体量太小,在世界范围内造成的影响有限。)
美国的次贷危机和日本消失的二十年,让地球人终于深刻的体会到了这种堪比灭霸的能量所具有的毁灭能力。而现在,所有人都在担心中国现在的这个超级泡沫,究竟会给世界经济带来什么样的后遗症。
股市就不说了,说多了都是泪,4000点起点论几乎就是加杠杆去库存的备忘录。
只有汇市和债市,才是真正体量极为庞大的巨无霸。
先说汇市,由于外汇市场的开放性(一种货币相对于另一种货币的汇率通常以显式的方式来表示:双方都同意的交换关系),因此外汇市场的交易量超过了其它所有金融交易的总和。比如,每天全球有价证券市场的交易量大约为3000亿美元,而每天外汇交易量将近6万亿美元。 因此,一个国家或经济体的货币汇率往往决定了它的生死存亡。
值得指出的是,在这一波人民币汇率大幅波动的背后,不止是只有中国在悄悄的操作和严防外汇外逃,美国也(一直)在进行更严密的战略部署。
可以说,中美贸易战是人类经济史上最为严重的贸易战,因为它不仅涉及到全球最大的两个经济体之间的激烈碰撞,也决定着全球经济未来几十年的发展方向和新构架。而从现有的战况来看,形势非常不容乐观。当特朗普打响贸易战第一枪时,举国沸腾,就连商务部的官员和经济学家都在强调大豆、汽车,然而,当美国发出针对中兴的制裁令之后,这时人们才渐渐领悟到这位看似神经不靠谱的总统,其实有着更加精明和长远的战略布局。
作为全世界唯一享受“睡后收入”的领导人,不走寻常路的特朗普可以说是颠覆了所有人的三观,在中国外交的国际政治人物模型里,根本没有这一款型号能够与之对应。
特朗普甚至改变了美国驴象双方的传统:历史上向来是民主党的总统负责搞经济赚钱,共和党的总统则经常搞事情到处打仗花钱,然后没钱了之后继续让民主党上台赚钱。5月10日,美国国会预算办公室表示,美国4月创下史上最大月度预算盈余2140亿美元,创1968年有纪录以来新高。同时,失业率也自2000年以来首次下降至4%以下。因此,特朗普的民调支持率连连上升也就并不意外了。由此引申出的一个问题是:自从特朗普宣布和中国的贸易战那一刻开始,那些被我们当做筹码的大豆、汽车、票仓之类的问题,根本就不是特朗普考虑的核心问题。
而我们对这位整天发推特、到处拉仇恨的总统,又了解多少呢?颠覆传统的特朗普,可以说是超出了所有人的经验。伟大领袖曾告诫我们:经验主义害死人啊。
在这次贸易战中,为什么中国以往买买买的经验模式失效了呢?因为美国发出了一个非常严肃信号:reciprocal。中国的翻译是“互惠”,美国的本意是“对等”。为了不让中国会错意,特朗普还特意说了mirror(镜像)这个词,可谓用心良苦。在第一回合的谈判中,美国直接提出了开放金融服务业市场准入这样触及底线的要求。为什么呢?因为他知道你不会答应。为什么一水鹰派的美国代表团敢于提出这种要求呢?因为他知道你的软肋(远远)不止中兴一个。事实上,美国提出的要求是在关税、市场准入、知识产权等问题上的全面对等。
目前,第一回合的谈判结果已经显现:开放进口汽车市场、开放保险市场,连一直被禁止的高通-大唐合资案,也被光速通过了。嘴上喊着绝不低头,身体却真的很诚实。
再来说说债市。应该说,中国的地方政府性债务(简称地方债)危机,是这一波去杠杆的直接导火索。在2008年全球金融危机时,为了对冲经济全面下滑的风险,中国启动了四万亿刺激政策。中央开始允许地方政府大量举债以满足当地资金需求,于是,地方债从此一发不可收,债务风险越来越高。在经济刺激政策之下,大量资金涌入铁路、公路、基础建设等部门,中国当时的GDP被巨量资金托住并暂时稳定了下来。
然而,这些钱,是需要还的(包括由此产生的巨额利息)。
早在2014年,中国的地方债就已突破24万亿,其规模已经超过了德国GDP。而现在,包括地方政府债和城投债在内,中国债市总量已达到了76.01万亿元,其中地方债务的规模已达22.22万亿。
更为严重的问题是地方政府的隐性债务。尤其是最近三年,地方政府借由PPP、政府购买服务、政府投资基金等方式形成了不少隐性债务,其体量已经超过甚至数倍于显性债务。不断快速膨胀的地方债让所有人都不寒而栗,2016年10月国务院发布《地方政府性债务风险应急处置预案》称:“地方政府对其举债的债务负有偿还责任,中央实行不救助原则。”
这也是建国以来的首次中央不拖底政策,没有了中央的信用担保,地方政府对卖地经济的依赖进入了更严重的恶性循环。于是近年来各个省市的卖地收入不断攀升,而火爆的卖地收入与黑洞般的地方政府债务相比,却依然显得苍白无力。事实上,从2017中央财政收入的角度来看,在全国36个省市(港澳台除外)中,仅仅只有6个省市是财政盈余,盈余总额约为3万亿,而其他31个省市的财政亏损总额则突破了5万亿;这其中的财政缺口已高达2万亿。
另一个危机重重的是企业债务。在目前严厉的去杠杆监管政策之下,尤其是5月资管新政出台之后,许多通道被关闭,于是债务违约潮便成了最直接的显性表现。仅在4月份,全国出现违约的债券就达到了16只,涉及金额高达130亿元。比起往年,这个速度已经密集到令人害怕。与此同时,近期A股也被搅得满目疮痍,出现了大量上市公司因各种不同名目的逾期,涉及到股东股份被冻结或正在被司法拍卖。尤其是盾安集团所爆出的450亿元债务危机——因为一只融资规模只有12亿元的债券发行失败,成为压垮骆驼的最后一根稻草,导致这家中国500强企业资金链断裂。而这只是冰山一角。
为什么短短几个月内,就出现了如此密集的违约潮呢?因为2018年迎来了公司债的偿还高峰期,2018年的偿债规模是2016年以前的4.3倍。
就连房地产企业的负债率也再创新高。事实上,在所有一级行业中,房地产已经成为了负债率第三的行业。其实,面对目前已经涨得连亲妈都不认识了的高房价,房地产商也很焦灼,尤其是在恒大、万达的海外投资事件之后,在杀猴王骇猴式的强监管之下,资产转移的路径被严重限制。这些高负债率的人民币资产,面临着随时被清盘的风险。
在最近的一次投资机构排雷的过程中,天津国资委下属的省级平台违约直接吓坏了一众投资机构。天房集团,这家天津国资委实控的天津最大国有房企惊爆出了1800亿的负债。而几乎大半个金融圈都借钱给了天房集团,接近2000亿的债务就犹如一颗随时会引爆的核弹,一旦爆发,将炸伤大半个中国金融圈,其危险性不亚于美国的黄石公园火山。
悄无声息中,2018年的企业债务似乎正在排队炸雷。一场违约潮正大面积袭来,一场关乎千万人命运的大震荡开始了。不论是轻资产行业、重资产行业、文化类企业,还是制造业企业,通通都无法承受这轮资本大退潮。
唯一还在坚挺的,似乎只有房价了。那么,按照这个剧本和节奏,令所有人都担惊受怕的房地产可能还没来得及崩盘,实体经济就已经率先崩盘了。哥,我先崩了,你随意。
03
如果要用一个词来形容2018年的房地产,那就是“用时间换空间”。直白一点说,就是尽量拖。这也是所有出台政策的最终指向。那么,我们是否有足够的时间来化解这个体量庞大的超级泡沫呢?是否会有外力的因素突然刺破这个泡沫呢?
远在大洋另一边的特朗普,笑而不语。
现实的来说,如果没有美国高科技和知识产权的交流与帮助,中国的产业升级和2025规划是很难实现的。那么,中国的筹码是什么呢?抛开无足轻重的不说(中国出口的绝大部分产品都有替代品,而且损失并非不可接受),我们最重要的核心筹码其实是我们自己:中国将是未来全球最大的消费升级市场。这个市场容量是美国无法割舍的。
然而,最令人痛心的是,这个消费升级的市场却面临着一个刻不容缓的难题:房地产。
一边是内需消费极度萎缩,急需化解房地产的超级泡沫;一边是用时间换空间,尽量拖延房地产泡沫的破灭。对这个核心问题的时机选择和把握,特朗普可谓是稳准狠;估计连美国人自己都没想到,很多中国的热血青年竟然将房价下跌的愿望寄托在一位美国总统身上。
十六年来,北上广深的房价涨了20倍,但全国的GDP上涨了只有不到7倍。目前中国的楼市总市值已经超过了430万亿,是GDP的5倍(超过全球平均值的一倍),是广义货币供应量M2的2.5倍,是储备货币的15倍,是货币发行的45倍。毫不夸张的说,卖掉北上广深四大城市,差不多能买下美国。如此高的总市值,一旦有炒房人和早期的投资客套现离场,那么整个房地产立马就会崩溃:430万亿总市值,哪怕只有5%的抛售离场,那就是21.5万亿的资金流出,几乎相当于我们所有的外汇储备。这就是新闻中密集出现的字眼,严防金融系统性风险出现。如何严防呢?直接冻结流动性,只许进,不许出。
“姐姐,今夜我不关心人类,我只想你”。海子是谁?几十年来,最让我们关心的,只有房价。而在家庭资产中房产占比已经高达70%以上的今天(一线城市占比已达85%),几乎谁都无法接受房价下跌。谁都希望能享受一把“睡后经济”,躺着睡着了就能让房价上涨把钱给赚了。然而,真的是这样么?到底有多少人能赚到这个钱呢?
在股市中,没有卖出去的价格永远都不叫真正的盈利,而房产的套现比股票更难。你确定你能够成为那5%套现离场的吗?与虚幻的高估值对应的,是负资产。而负资产是会吃人的,它吃过日本人、吃过香港人,但还没吃过中国大陆人。
在中国,悲剧有两种,一种是没钱,一种是没房。
如果两种都没有呢?是不是社会就会抛弃你了呢?别搞笑了,社会连你是谁都不知道。
这不是玩笑段子、这就是赤果果的现实。有人说在一线城市没有什么事是一套房搞不定的,如果有,那就两套。还有人说世上99%的事情都可以用钱解决,那么剩下的1%呢?需要更多的钱。
作为货币超发资金池的房地产,就是这个1%。过去十年,美国的货币发行量增加了2倍,而中国的货币发行量增加了20倍。如果没有房地产这个资金池,我们的通货膨胀会不堪设想。马云说,8年之后房子如葱。这个预言全国人民都不敢相信,What?8年之后买根葱会和买套房一样贵?
如果泡沫破灭,天量超发货币将导致严重的通货膨胀,马云的预言就会变成另一个版本的残酷现实。
在进一步讨论之前,我们可以看看人们对于目前高房价和地产泡沫的心态是什么。
对于大部分人来说,这种心态是很复杂的,但是从整体上看,最占据上风的心态是侥幸心理。
正是这种侥幸心理,让许多人都认为:房地产泡沫都被叫喊着崩溃十几次了,不还是依然在延续么?这种心理和吃了第十个包子之后觉得前面九个包子都是多余的心理一样,忽视了累计效应的存在。都已经涨了二十年了,也不差再涨这几年了对吧?事实上,在所有金融交易市场中,对于显而易见的风险视而不见,往往才是崩溃前的最后一个阶段。
一个简单的事实是:当最后一片雪花来临时,没有人能分辨出究竟是哪一片雪花导致了雪崩。一旦雪崩爆发,没有一片雪花是无辜的。
另外一种心态是麻木。尤其集中在不断被割韭菜的年轻人身上,而他们本应该是中国2025规划中的主力军、本应该是我们在贸易谈判中最重要的底气。然而,现实是什么呢?给大家讲个笑话:教室里突然飞进来一只蜜蜂,于是老师说到,同学们考验大家的时候来了,看看你们是不是祖国的花朵。然而话音未落,蜜蜂就飞出了窗外,老师大惑不解,这时同学们齐声说到:老师,我们是祖国的韭菜。
房地产的超级泡沫已经造成了严重的资源错配,掏空了产业升级和高科技发展的根基。如果连00后都变成了韭菜,那么谁还能有资格谈论什么未来呢?
工行董事长在最近演讲时表示,2010~2017年的居民储蓄存款增长与可支配收入之比从25.4%下降至12.7%,降幅达到了一倍;而与此同时,居民家庭债务占GDP的比重已升至49%,几乎占了GDP的一半。这意味着什么呢?意味着空心化。
这种空心化不仅仅体现在实体经济的倒闭潮、外资企业的撤离外逃上,而且还实实在在的发生在每个中国人的心里:这样的生活到底为何?
佛系生活?低生育?就连一线城市中许多人也只能住着一千万的房子过着穷日子,号称中产杀手的学区房能够轻松掏空一个中产家庭的钱包。严重的焦虑感让许多奋斗青年都戒掉了梦想。
你的所有人生规划,都要等到买房之后,所以其实你的人生毫无规划。
刚刚发布的的金融数据显示,4月居民存款大降1.32万亿元,为历史单月最大降幅。同时,市场信贷需求依然旺盛,其中新增贷款1.18万亿元、社融增长1.56万亿元,信贷增加远超居民存款增加。这还是发生在央行降准100个基点之后的数据,可见降准没有改变银行资金短缺现象,说明降准释放的资金并没有进入到银行存款。
那么,钱都去哪了呢?还是房地产。
04
很多童鞋都曾认为房地产业属于实业和基建投资,然而,当房产被赋予了金融属性之后,一切都变了。这时,房价就成了一个不折不扣的金融游戏。
5月出台的史上最严资管新政,其实可以很好地演示房地产的原罪。对于目前高达100万亿的资管通道,其主要流向只有三个:股市、债市、房地产。这时,股市第一个站出来说这个锅坚决不背,为什么?看看现在还在痛苦磨底中的A股就知道了,毫无任何量能可言,所以很明显,没有太多新增资金流入股市。债市更惨,被严打的几乎都要产生危机了,大幅流入资金根本不可能。这时,房地产低头不语,过了许久才用闪着泪光的决定说到:怪我咯?
简单来说,房价上涨的金融游戏是这样:
居民通过存款、购买理财将钱交给银行和机构—>银行和机构将钱贷给房产商—>房产商拿到资金后高价买地—>房产商将产品高价卖给居民—>更多的资金通过资管通道流入—>房产商拿到更多的贷款—>政府以更高的地价拍卖给房产商—>房产商以更高的房价卖给居民
在这个正向循环的金融链条中,可以很清楚地看出羊毛出在谁身上。那么,这种拿你手里的钱变成混凝土砖块再翻倍高价卖给你的游戏应该叫什么呢?房产货币化?庞氏骗局?抢钱?不,这种政治不正确的说法我们不能用。但国进民退的进程却是实实在在的发生着,而且日益恶化。
值得注意的是这个超级泡沫的负债主体。在上一波轰轰烈烈的涨价去库存操作中,翻倍的不止是房价,还有居民部门的杠杆率和负债。而当高库存和高杠杆率从地方政府、国企部门转移到居民部门之后,不仅完成了人类历史上规模最为宏大的债务转移过程,也为管理层创造出了更多的政策施展空间,调控起来也更放得开手脚,这也是为什么今年的调控政策如此密集和坚决的根本原因。
从现实意义上说,经济规律是具有因果律的:当进行一项经济政策和动作之后,一定会产生相应的结果。如果没有看到对应后果的发生,并不是说明这个经济体具有超能力,而是意味着在其他地方发生了对应的损益、或是放弃了某些利益来对冲相应的后果。那么,当一连串的政策和动作之后却没有出现应有的后果时,那就表明在其他部分被放弃的利益已经越来越多,当积累到临界点时,便会反噬整个系统。
许多童鞋都对通胀表示出了担忧,其实这也是最高层重点防御的部分,因为这关系到国计民生。
近期,政府连续约谈了十几个城市,也就是在防止房价继续上涨带来更大的压力。然而现有的市场存量太庞大,采取紧缩的话会造成债务违约和破产的一系列连锁反应,于是放水就成了一个难度极高的技术活,必须处理好平衡。
从静态经济理论的观点来看,产业升级是化解这场危机的必经之路,这一过程虽然痛苦但却无法避免,这也是中央提出房住不炒的最终目的,可以说,这一愿景是理智和美好的。只有壮士断腕般的舍弃房地产经济,才有可能重生。就像上帝给你关上一道门的时候,一定会为你打开一扇窗。然而,为什么我们现在还没有越过这扇窗呢?因为不断超发的天量货币已经让中国经济成为了一个体量庞大的虚胖儿,卡住了。
美国发动贸易战的攻击目标,正是这个胖子。如果说第一回合中美国使用的常规武器是中兴事件的话,那么在第二回合中,美国已经开始动用战略武器了。
这个武器是什么呢?是石油。
5月8日,特朗普在白宫宣布美国将退出伊朗核协议,并对伊朗实施严厉制裁。聪明的你一定看出了这其中的奥秘。是的,伊朗正是中兴事件的发源地,而这一次,特朗普更是直接提出了威胁:任何与伊朗有商业往来的银行和企业未能在规定期限内(3~6个月)解除与伊朗的业务关联,都将遭到美国制裁。很快,法国石油巨头道达尔就发出公告称将撤离伊朗南帕尔斯天然气田项目,这一总价约48亿欧元的项目是欧洲财团对伊朗最大规模的投资,而美国的银行参与了道达尔超过90%的金融活动,美国股东占道达尔超过30%的股权,道达尔在美国的资产规模超过100亿美元。
同时,航运巨头马士基和全球最大的油轮运营商Torm,也已经不再接任何来自伊朗的新订单。马士基在声明中称,将履行5月8日以前的订单,并确保在11月4日前依照美国制裁的要求进行交割。这些信息都说明了欧洲既无决心、也没有气力去阻止美国制裁伊朗。
石油是一个国家经济活动的命脉,也是工业生产和食品加工等行业的重要原料,由此它会带动许许多多相关商品的涨价,这种涨价最终会反映在商品的零售价格和生活必需品上,消费者会因此多付出很多成本,这就是输入性通货膨胀。2007年,原油价格最高涨到了每桶147美元,结果就是造成了国内严重的通货膨胀,物价大幅上涨,严重影响了居民生活水平和国内经济的发展。
通过这个依然历历在目的历史回顾,我们可以看出两点:
一是降房价并非传说中的绝不可能,而是要看是否真心愿意去降。
二是原油价格上涨的输入性通胀,具有极强的杀伤力,如果这次特朗普的伊朗战略使油价上涨到每桶80美元以上,那么到时候就不止是房价下跌的问题了,童鞋们可能要先准备点别的了。
05
而对于伊朗的制裁,似乎正在按照特朗普的剧本进行。
5月15日,美国财政部正式宣布禁令:将中止美国民航公司向伊朗出口飞机的许可证。这道禁令不仅拉开了特朗普正式开始制裁伊朗的大幕,也宣告了一项400亿美金合同的告吹:在特朗普退群之前,空客和波音公司曾承诺将向伊朗提供200架客机以解决伊朗客机老旧和不足的困境,合同总金额高达400多亿美元。值得指出的是,高通收购NXP的金额也不过380亿美金。连到手的钱都不赚,这也显示了特朗普制裁伊朗的决心。为何如此坚决呢?
为了推高油价。一方面制裁伊朗,限制伊朗石油出口;另一方面加大地缘政治不确定性,推动原油价格上涨。美军第五舰队常年驻守在波斯湾,一旦伊朗有大动作或重启核武研究计划,就将封锁霍尔木兹海峡,那么整个中东的石油都将无法运出。这样一来,全世界都会爆发石油荒,石油价格就会暴涨,由此,美国的高价原油就可以源源不断的出口,不但满足了美国石油巨头的暴利收割,同时也会大大改善美国的贸易逆差。最为关键的是,这时华尔街的金融大鳄们还没有出动,从某种意义上说,最终操控全球油价的将是华尔街。
如果这时华尔街说自己不是庄家,估计全地球人都不信。事实上,华尔街已经预测全球原油价格即将突破100美元的重要关口。而那时,最为全球最大石油进口国的中国来说,强烈的输入性通胀将无法避免。
那么,最开心的是谁呢?俄罗斯笑而不语。实际上,俄罗斯财政部已经不得不修正预算草案,将2018年俄罗斯预计石油和天然气销售收入直接提升了5倍,从85亿美元直接增加到了440亿美元。
由此,我们也可以看出这段时间以来中东战事和乱象的来龙去脉。普京当初为何要在2015年9月2号宣布正式进入叙利亚作战?直接原因看似是俄罗斯在叙利亚有军事基地存在,其实,背后真正的原因则是油价下跌。因为如果叙利亚被美国拿下,那么美国将彻底控制中东的石油定价权,并且让石油价格一直处于低位,这将会令俄罗斯彻底的破产。所以普京毅然决然的进军叙利亚,帮助阿萨德恢复政权,因为他很清楚只要打这一仗,就可复制伊拉克战争时期一样让原油上涨,一旦燃油回复到60美元以上,俄罗斯经济将持续恢复;而当油价恢复到60美元以上的时候,俄罗斯也完成了叙利亚的战斗撤军。
通过之前的一波制裁,美国将俄罗斯几乎逼上了绝路,而现在,特朗普制裁伊朗,却即将让油价突破80、甚至100关口,这样峰回路转的剧情,和不久前普京连任总统成功时特朗普发去的贺电,可以说是一幅充满和谐的画面。
这时的中美贸易战,就显得更加意味深长起来。

Angular Top 10 Articles for the Past Month (v.June 2018)

$
0
0

Angular Top 10 Articles for the Past Month (v.June 2018)

For the past month, we ranked nearly 800 Angular articles to pick the Top 10 stories that can help advance your career (1.25% chance).

  • Topics in this list: Tutorial, Ivy engine, Google I/O, Renderer, Bootstrap 4, Library, Angular Material, Ngrx DevTools, Angular Elements, MEAN Stack
  • “Watch” Angular Monthly Top 10 on Github and get email once a month.

As an article ranking service for professionals, we take quality very seriously and make sure each article you read is great. Mybridge AI considers the total number of shares, minutes read, and uses our machine learning algorithm to rank articles. This is a competitive list and you’ll find the experience and techniques shared by the Angular leaders useful.

Course of the month:

A) Beginners: Angular (Full App) with Angular Material, Angularfire & NgRx. [1,301 recommends, 4.7/5 stars]

B) Angular & NodeJS — The MEAN Stack Guide. [6,009 recommends, 4.6/5 stars]

Rank 1

Build A Real World Beautiful Web APP with Angular 6 — A to Z Ultimate Guide (2018) — PART I. Courtesy of Hamed Baatour


Rank 2

Ivy engine in Angular: first in-depth look at compilation, runtime and change detection. Courtesy of Max NgWizard K


Rank 3

What’s new in Angular (Google I/O ‘18).


Rank 4

Angular Ivy change detection execution: How i prefer debugging new Angular Ivy engine. Courtesy of Alexey Zuev


Rank 5

How To Build Responsive Layouts With Bootstrap 4 and Angular 6. Courtesy of Tomas Trajan


Rank 6

The Angular Library Series — Creating a Library with the Angular CLI. Courtesy of Todd Palmer


Rank 7

Creating Beautiful Apps with Angular Material. Courtesy of Oliver Mensah


Rank 8

Angular Ngrx DevTools: Important Practical Tips. Courtesy of Angular University


Rank 9

Building Custom Elements / Web Components with Angular 6. Courtesy of Tomek Sułkowski


Rank 10

MEAN Stack Angular 6 CRUD Web Application. Courtesy of Didin J

That’s it for Angular Monthly Top 10. Visit our publication to find top posts for more programming skills.

小城高利贷样本:一本教你如何作死的说明书

$
0
0

小城高利贷样本:一本教你如何作死的说明书

K的父母又从县城奔来避难了。距离上次帮老人家赎回房子,最多只有两年。

这一次,追债的小弟是半夜上门,把家里的花盆、鱼缸、碗碟全砸了。警察赶到现场,查看一地碎渣后,问:“决定报案处理吗?可以对他们刑拘的。”老人家犹豫半天说:“算了吧。”小混混们再放出来,谁知道还会怎样?

K和我是中学同学,我们同在东南一个山区县长大。K的哥哥是放高利贷的,资金链断裂,跟合伙人又闹翻。现在踪影全无,烂摊子丢给爸妈和他。要命的是,房子被抵押过两次,他也赎过两次。县城房价不高,赎一回得二三十万。产权是爸妈的,总不能让他们年老流离失所吧。

记吃不记打的,不止是他哥哥和父母。这个县城,几乎每隔几年,就被高利贷席卷一次。县域经济像遭了台风,满路狼藉。

只要是县城出身的人,谁没有几个亲友被卷进高利贷呢?

明知你是个火坑,我也要跟你在一起

高利贷风暴,何以总是发生在县城?因为一二线城市,谋生与投资的机会渠道更多。社会底层的高利贷,如果不像北京南城的菲妥妥那样,一家出人命,不太惹眼。

县城高利贷不同,它有时几乎是全民牟利的工具。一般说,经济好而融资渠道越有限的县城,民间借贷就特别多,高利贷生存空间就越大。或者说,高利贷生存空间越大,县城经济也越容易波动。

卷入高利贷的,情况分三类:

一是赌徒;

二是需要短期资金的企业主;

三是放贷赚利差的普通百姓。

先从赌徒说起。明白了赌场生态,也就容易理解县城的民间借贷。

我们这个县,在赌场放高利贷的,行话叫“做火坑”;借钱赌博的,叫“跳火坑”。20年前这么称,也许是贬义,但现在已是中性词。不止是本县,邻近几个县,都沿用“做火坑”这个妙词儿。放贷的可以大方地介绍:“喂,我是做火坑的,请问你要借多少?”

赌场为逃避风险,一般在山里搭帐篷开赌局,所以大家称赌博为“上山”。赌徒担心赌场被冲击,钱被没收掉,都不带现金上山。谁来承担风险?“做火坑”的人。他背着钱到现场借给你赌。一个“火坑”带着5万上山,县城可能还有一个人守着百万块钱,随时准备上山增援。“火坑”每借出一次钱都有利息,过手就要收利息,这叫“过手息”。赌徒一下山,“火坑”就跟着到家里拿钱。如果拿不到钱,可能就翻脸了。

赌徒借1万块,哪里会在乎1000块的利息。如果输了,反正也等于押上了1万块钱。如果赢了,就是一本万利。所以1000块利息,在赌徒心理上是不存在的。“火坑”带3万去,也许一天就有3万赚回来。赚多少得看过手率。过手一次3000,10次就有3万。

“火坑”做得久,名气就大,很多人会来找他。他像一个聪明的军师,观察赌徒心理,在边上提醒或控制你,帮助及时止损。跟着赌博的你,“火坑”才有吃有喝。赌技成熟的老赌鬼,会有“专职火坑”在边上伺候。“跳火坑”的人也有一份迷信,我就是要和你做搭档,赚到钱就要分“火坑”一部分,手气才会旺。“火坑”与特定赌鬼的合作,有的可以持续好几年。

赌场愿意让高利贷者进入,是因为资金池子越大,场子越活跃,大家赚钱机会越多。这似乎是县城民间借贷活跃的畸形缩影。

“明知你是个火坑,我也要跟你在一起。” 在高利贷掀起高潮时,人人都以为火中取栗必定成功,谁知楼起楼倒,都在转瞬之间。

暴利狂欢是怎么开始的?县城高利贷,牵涉面有多广?

以我待过的那个县为例,法院里40%以上的民商事案件,都是民间借贷纠纷。从前案件标的在500万以上的,就要去中级法院起诉。后来逐年下调,2000万以下,也在基层法院起诉。现在是3000万以上,才轮到去中院。案件之多,可想而知。

有个房地产公司老板,在民间大量融资,年息3分。他有个亲戚是小学老师,一传十,十传百,全校老师每人拿了二三十万给他。每人投钱不多,但挡不住人头多,数目也不小。甚至老师的亲戚,也闻风而来。

2014年底,有些公司出现危机,有个老师不放心,找了理由去讨钱。老板一点也没耽误,立即还钱。这老板心里很清楚,消息一旦传出去,形成恐慌挤兑,情势会急转直下。一两天后,老板特意请老师们吃了个饭,还提了两百万现金,放在酒桌上。

他端着酒盅,笑眯眯地说:“现在县里经济不稳定,有些人担心可以理解。今天请大家吃饭,一是感谢你们,二是谁需要资金,也请早些拿走,我好计划下一步投资。”当场就有人把钱领走了,也有人迟疑着没领。

有一位男教师,领了钱回家,被老婆骂了一顿:“你只会教书,赚个工资,好不容易能赚一点利息。别人还了钱,你还真傻傻地领回来!”又列了家里一堆开销,再数落一通。次日,这位老师把钱送回,不好意思地说:“我老婆讲,家里暂时用不上这钱。”

头一晚拿钱的,第二天都像这样送回钱。老板大度地收下,诚恳说,“我已经讲过了,如果真要投资,周期要稍微长一点。如果你确实是闲钱,就放我这边,可不敢半途再收回。”几位老师纷纷说,没事没事,你尽管用,我们就是投资。

半年之后老板跑路了。那一次,他还钱的举动,只是针对这所小学的老师,但消息传扬开后,借势稳定了其他群体。几位老师事后顿足大骂:“太狡猾啦,太狡猾啦!”被老师连累的亲戚也骂:“你们还是当老师的,太愚蠢了!”

在县域经济里,居民投资项目不多。大家都指望房地产不停地涨。只要有一个地块被开发,手上有闲钱的人,都想分一杯羹。有的老板手上只有500万,就敢去标3个亿的地块。很多楼盘,投标前就开始集资,承诺你的本钱三年翻一番。如果没有标到,保证在几天之内,本钱连带3分利息还你。如果中标,他就等于用500万撬动3亿,他再将工程切块分包出去。县城的地块,多数是本地人投标,都是合伙型集资投标。

这种老板偶尔成功,吸引了越来越多的“融资”和“投资”,受害者也越来越多。所谓“投资”的普通百姓,一出事就找法院。法官就是有16条大长腿,也追不了那么多跑路人。

男女之间有性,才有吸引力。借贷双方都想着暴利的高潮,才形成了“火坑”与“跳火坑”的共谋。

本来只想过桥,谁知掉进了火坑

欠下单笔大额高利贷的,都是借“过桥资金”的企业主。

所谓过桥资金,最早是指银行承诺你先找一笔资金,还了我期限内的旧贷款,回头马上再借新款给你。

过桥的比喻,十分贴切。但真正过桥的情形,非常复杂。

有一种情况是,正常的企业主,把资金杠杆做得过大了,自己现金流不够,认为找高利贷者,弄一笔短期资金先过桥再说。以往他多次过桥成功,想不到这一次掉进了深渊。他是有资产的,本来可以先变现来度难关的,但他偏要贪图方便找到高利贷,于是结局注定。

第二种是经营碰上风险,他需要一笔资金对抗。现在是市场的冬天,他指望明天太阳能正常升起,春天正常来临。他希望保住市场,保住资产。刚开始时他有理智,只贷二三分息的款子。当情势日益危急,借款途径越来越少,他只好借新还旧了,而且还的其实还只是利息。

第三种老板,是穷途末路,一脑袋浆糊的,先借再说。他是倒过来想骗高利贷者的钱,反正我还不起嘛。

我有一个朋友,向银行贷款8000万。他平时是哪里能赚钱,资金就投在哪里,虽不合规,银行也睁一眼闭一眼。当银行发现他账目流水有问题,让他先还款,哄他说半个月就再放贷。“你先找一笔过桥资金嘛。”灾难都是这样开始的。

他找了一家外地商会融资,每月5分息,也抵押了财产。结果银行2个月不放款,半年还是不放款。他在等待银行消息过程中,本金还没有偿还,抵押的企业与财产已作为利息烧掉了,公司归了商会里的一个老板。

他是正常经营的企业,根本没想到这是“火坑”,他只觉得需要资金杠杆。

路越走越窄,为了烧利息,他开始到处借钱还利息,最后借到了高利贷头上。他向“火坑”借10万,利息已付了20多万,但10万块本金还未还。每到付利息那天,一分钱不能少。如果少1分钱,罚你多少息由对方说了算。没钱吗?条子写来!

一个人面临恐惧和羞辱时,没有反抗余地。一个耳光,体面全无。开始打你几次,到后来不打你,心理也被绑架了。一年365天,都想着怎么骗钱还利息。他不断幻想着,一夜暴富还钱。什么地方才能暴富?还是赌场。到这种时候,连“火坑”都躲着他走了。

当然,还有情况是这样的:和和气气商谈过桥资金,在达成协议时,双方都乐观地认为,这是短暂“过桥”,毕竟企业度过危机的先例很多。

高利贷者也是走一步看一步的。一个企业找他借贷,等于一只鱼儿往网上撞。他要捕你这只鱼,要先算一算网是否够大。当他的资金足够多,可以把你的财产转化为他的财产,那他会把网逐渐张大。当你形势日益吃紧,高利贷者反而还提供更多过桥资金,那就是张网以待了。如果他觉得你还有实力,吃不动你,那赚个“过桥”高利息就好。反正你这只鱼游走,还有新的鱼来触网。

过桥资金的渠道,非常复杂,未必是放贷者自己的钱。往往是他融资来的钱,里面有亲友的钱,甚至是别人的保证金。后来的追债手段那么狠,就是害怕追不回来,他也要跟着完蛋。

欲望是一条章鱼,不会松开自己的猎物

在高利贷受害者中,老年人是一个很大的群体。

日常生活中,老人似乎淡泊名利,但一涉及到利息,他们总是想高了再高。他们才不去想,什么渠道合法安全呢。那是我合法的钱,钱生钱难道不合法的吗?再说,都是亲朋下属,人家好心才拉我进去。有什么理由不“投资”呢?他们的口头禅往往是:“人家的利息比银行理财高得多啊。”

县里有位老局长,手下有个贴心的年轻人,退休后仍保持密切联系。某日,年轻人来说:“您还有闲钱吧?可以借出去收点利息。”此后,果然持续收到高息。其实年轻人也在放贷,他编了无数理由,不断拿走钱,又不断支付利息。老人家连吃两年多高利息,很是开心。但后来,利息越来越不及时,慢慢就再没钱来了,老局长差不多折了1/5本钱。

想不到的是,过了两年多,那年轻人又登门动员:“我手上还有个项目,投资利息更高。”老局长犹豫,唉,就算了吧。年轻人拿出规划图与标书,说:“这是房地产呢,它还能长腿跑掉?”老人家想了想说:“好确实是好,可我哪有这么多钱啊。”对方又动员:“你可以拿房子抵押,向银行贷款呀,转借给我们,利息更高啊。”结局可想而知,养老的房子没有了。

像这样不止一次上当的老人,占比不少。

被暴利反复蒙骗的原理,其实与年轻男女被性欲欺骗的性质相当。这一次不成功,再试试下一次吧。欲望永远那么年轻。高利息是老年人获利的唯一来源,是致富的逼真幻觉,要放弃谈何容易。

小县城文化的特点,是容易攀亲结友。这也意味着,负面经济现象易于放大。当高利贷的现金流量和流速足够大时,就会卷入大批工薪阶层。人人都觉得,只要我有现金就能赚钱。太多人加入货币游戏时,距崩塌已然不远。

有个朋友在一家公司上班。某日老板说,你们可以把钱投入公司,保证有高息,也算给你们一点福利。当时公司火爆,收入不错,员工抢着投钱。开头给的是3分息,后来公司提出,每个员工都必须投资,利息作为工资结构的一部分。实际情况,是老板拿到外头去拆借放息了。最后,公司倒闭连累员工。这位朋友抵押了父母房子,姐姐帮助赎回房子,但也害姐姐离了婚。

高利息还会引来外地“投资客”。那一段时间,经常有人主动打听:“听说这里利息最少也有2分,快帮助问问,我也要投啊。”这基本是上门送死。我有个同学,在广东开内衣工厂,最忙时要请亲戚去把关。听说县城利息高,他和亲戚们筹集5000万现金“投资”,血本无归。整个家族,都受拖累。

加拿大作家达尼·拉费里埃说:“欲望是一条章鱼,不会松开自己的猎物。它一旦跨入我们的家门,就不会再出去,最后占据所有的空间。”高利贷对有钱的家庭而言,就是这种八爪章鱼。

“做火坑”的人,最终烧死在火坑里

高利贷的可怕在于,即使是精于算计的行业老手,也从不得善终。据我在县城的多方调查,没有求证到“做火坑”的能漂白,甚至成为普通人也极难。

“做火坑”的人,最终烧死在火坑,是不可逃脱的命运。

高利贷者做生意,先是用自己的钱,接着用亲友的钱。比如,先用50万起家,连本带利发展到100万,亲友看你放贷兴旺,又给了你300万,总计有500万在运营。货币流量流速平稳时,他们生活挥霍奢靡。货币流速加快时,赚的钱似乎更多,但他们不会把赚到的高息,作为风险金留下来,而是把赢利加入本金,像滚雪球一样继续滚。他们想象,这个雪球可以滚到无限大。

高利贷者完蛋的原因总是这样:你盯着别人的利息,别人瞄着你的本钱。当发现“跳火坑”者跑路成风时,不但本钱没有了,连亲友的钱也赔上了。

表面看,高利贷有个合理损耗率,做10次可能会跑掉一两单,他还有八九次赚钱。但要命的是,最终跑掉的总是大单。出现风险时,他们优先要还款的,当然是被牵涉的公务人员。县城小,只要跑掉几单,消息传得极快。转两三个圈,所有亲友就全都知道。参与者纷纷上门讨钱时,家里就出现暴力挤兑了。你只能跑路。

他最致命的问题,是食利与快钱,把他的人生态度、消费方式破坏掉了。他们无法适应正常社会。这种人即使真的赚到了钱,下决心离开 “火坑”,对正常行业的风险,也往往麻木。中国人有一种说法,叫“德不配位”,你以这种德行赚了大钱,必然会麻木地支配大钱。在原来的食物链上,你是顶端。换了食物链,你成了底端。

那些当火坑助手的小弟,看到来钱那么快,也一样无法平静生活。他宁可流浪,也不愿再赚那三五千工资。

食利心态,犹如毒瘾。高利贷在县城里,之所以每隔几年刮一趟地皮,是因为普通人就是最深厚的土壤。大家只要有闲钱,必然不愿留在兜里,爱拿去放贷。没借出去放贷,就觉得是金钱损失。他对“得”,已没有常人的庆贺心境;而对所谓“失”,则锱铢必较。

从这一点上说,所有人的本性没有区别。放贷能力越强,欲望就越强,所以失败也更惨。在暴利面前,你有多贪婪就有多危险,你有多狡猾就有愚蠢。气球吹得再大再好看,也对付不了一根针。

这是恶劣的金钱生态。参与共谋的百姓与高利贷者,最终都是受害者。只不过我是小鱼,你是大鱼。大鱼上面还有更大的鱼。最大的鱼,就是贪婪的人性。


Swift Top 10 Articles for the Past Month (v.June 2018)

$
0
0

Swift Top 10 Articles for the Past Month (v.June 2018)

For the past month, we ranked nearly 900 Swift articles to pick the Top 10 stories that can help advance your career (0.9% chance).

Tweet of the month
  • Topics in this list: Swift 4.2, Firebase, Machine Learning, Compile Time, Design Patterns, Chat App, MVVM, UIKonf, Testing, Touch ID
  • “Watch” Swift Monthly Top 10 on Github and get email once a month.

As an article ranking service for professionals, we take quality very seriously and make sure each article you read is great. Mybridge AI considers the total number of shares, minutes read, and uses our machine learning algorithm to rank articles. This is a competitive list and you’ll find the experience and techniques shared by the Swift leaders useful.

Course of the month:

A) Beginners: The Complete iOS 11 & Swift Developer Course — Build 20 Apps. [3,084 recommends, 4.5/5 stars]

B) Ionic 2/ Ionic 3 — Build iOS & Android Apps with Angular. [4,990 recommends, 4.6/5 stars]

Rank 1

Whats-new-in-swift-4–2: An Xcode playground demonstrating the new features in in Swift 4.2. Courtesy of Ole Begemann

……[Tweet]


Rank 2

Firebase Remote Config Tutorial for iOS. Courtesy of Todd Kerpelman


Rank 3

Machine Learning in iOS: IBM Watson and CoreML. Courtesy of Khoa Pham


Rank 4

Compile-Time Constant Expressions for Swift.


Rank 5

Top 5 Design Patterns in Swift for iOS App Development. Courtesy of Radislav C, Gleb B


Rank 6

Build an iOS chat app using Swift and Chatkit — Part 1. Courtesy of Pusher


Rank 7

Migrating Swift iOS Apps from MVC to MVVM. Courtesy of Angela Mugo


Rank 8

UIKonf 2018 — Day 1 — John Sundell — The Magic of UI Testing. Courtesy of UIKonf


Rank 9

The iOS Testing Manifesto. Courtesy of Hesham Salman


Rank 10

Touch ID and Face ID on iOS · Michael Brown. Courtesy of Michael Luís Brown

That’s it for Swift Monthly Top 10. Visit our publication to find top posts for more programming skills.

React.js Open Source Projects of the Month (v.June 2018)

$
0
0

React.js Open Source Projects of the Month (v.June 2018)

For the past month, we ranked nearly 200 React.js Open Source Projects to pick the Top 10.

We compared projects with new or major release during this period. Mybridge AI ranks projects based on a variety of factors to measure its quality for professionals.

  • Average number of Github stars in this edition: 5,426⭐
  • “Watch” React.js Top 10 Open Source on Github and get email once a month.
  • Topics: Router, Image Component, Desktop App, Material Design, React Native DOM, Animated Tree, Slack Clone, Admin Template, Components, App Manager

Open source projects can be useful for programmers. Hope you find an interesting project that inspires you.

Course of the month:

A) Beginners: React 16 — The Complete Guide (incl. React Router 4 & Redux) [5,106 recommends, 4.8/5 stars]

B) Advanced: Advanced React and Redux: 2018 Edition [5,927 recommends, 4.6/5 stars]

Rank 1

React Router: Next Generation Routing for React [2841 stars on Github]. Courtesy of Reach

……[Tweet]


Rank 2

React-ideal-image: An Almost Ideal React Image Component [1991 stars on Github]. Courtesy of stereobooster


Rank 3

Proton-native: A React environment for cross platform native desktop apps [7391 stars on Github]. Courtesy of Gustav Hansen


Rank 4

Material-ui v1.0: React components that implement Google’s Material Design. [37841 stars on Github]. Courtesy of Material-UI

……[Material-UI v1 is out]


Rank 5

React-native-dom: An experimental, comprehensive port of React Native to the web. [2444 stars on Github]. Courtesy of Vincent Riemer


Rank 6

React-animated-tree: Simple to use, configurable tree view with full support for drop-in animations [503 stars on Github]. Courtesy of Paul Henschel

……[Tweet]


Rank 7

React-slack-clone: Complete chat application, built with Chatkit [736 stars on Github]. Courtesy of Pusher


Rank 8

React-reduction: React Reduction: Free Admin Template Built with React and Bootstrap4 [287 stars on Github]. Courtesy of Reduction Theme


Rank 9

Kit: Tools for developing, documenting, and testing React component libraries [862 stars on Github]. Courtesy of Compositor.io


Rank 10

Ram: React Application Manager: create and run React (and other) applications — no command line or build setup required [493 stars on Github]. Courtesy of Brent Jackson

That’s it for React.js Monthly Open Source. Visit our publication to find top posts for more programming skills.

德鲁克谈《自我管理》——《哈佛商业评论》史上最受欢迎的文章

$
0
0

每周转载:德鲁克谈《自我管理》——《哈佛商业评论》史上最受欢迎的文章

文章目录

★背景介绍
★0、前言
★1、我的长处是什么?
★2、我的工作方式是怎样的?
★3、我如何学习?
★4、我的价值观是什么?
★5、我属于何处?
★6、我该做什么贡献?
★7、我要如何处理人际关系?
★8、我该如何管理后半生?

★背景介绍

今天转载的这篇《管理自己》,洋文叫做《Managing Oneself》。此文刊登在十年前(2008)的《哈佛商业评论》(HBR)上,号称是 HBR“有屎以来”(创刊后)重印次数最多的文章。

◇关于《哈佛商业评论》(Harvard Business Review

《哈佛商业评论》,简称“HBR”。在管理界,那可算是大名鼎鼎、如雷贯耳。别的不说,单凭它出自同样大名鼎鼎的【哈佛大学商学院】,就知道这刊物的逼格有多高。
顺便说一下:再过4年(2022),该刊物就将迎来百年庆。

◇关于“彼得·德鲁克”(Peter F. Drucker

不见图 请翻墙
此文作者德鲁克(又译“杜拉克”),被尊称为【管理学之父】。知名的《经济学人》杂志评价他是【大师中的大师】。
这位老兄不但著作等身,而且每本书都是质量上乘。下面列举他的【部分】著作。从中也可以看出:他创作的时间跨度很长,称得上是“与时俱进”。

《经济人的末日》(The End of Economic Man) 1939年
《工业人的未来》(The Future of Industrial Man) 1942年
《管理实践》(The Practice of Management) 1954年
《卓有成效的管理者》(The Effective Executive) 1966年
《管理——使命、责任、实务》(Management——Tasks, Responsibilities, Practices) 1973年
《动荡时代中的管理》(Managing in Turbulent Times) 1980年
《变动中的管理界》(The Changing World of the Executive) 1982年
《新现实——政府与政治、经济与企业、社会与世界》(The New Realities——in Government and Politics, in Economics and Business, in Society and World View) 1989年
《后资本主义社会》(Post-Capitalist Society) 1993年
《巨变时代的管理》(Managing in a Time of Great Change) 1995年
《21世纪的管理挑战》(Management Challenge for 21st Century) 1999年
《下一个社会的管理》(Managing in the Next Society) 2002年

◇关于此文

今天分享的这篇《Managing Oneself》实际上是摘自他1999年出版的《21世纪的管理挑战》一书的第6章(也是最后一章)。
为啥俺要分享此文?因为【这篇长文对每个人都很有帮助】。通过此文的借鉴,可以帮助你更好地规划自己的职业生涯和人生。
这篇文章在网上有很多转载,但有些转载不全(删节了部分段落)。俺对比了几个不同的网站,汇总了一个比较全的版本;然后根据俺自己的理解,标注了重点(文中的粗体)。另外,文章中的插图也是俺从网上找来滴。

今天这篇博文发出后,俺会在这个周末把《21世纪的管理挑战》一书也放到俺的网盘上。

================================ 华丽的分割线 ================================

★0、前言

我们生活的这个时代充满着前所未有的机会:如果你有雄心,又不乏智慧,那么不管你从何处起步,你都可以沿着自己所选择的道路登上事业的顶峰。

不过,有了机会,也就有了责任。今天的公司并不怎么管员工的职业发展;实际上,知识工作者必须成为自己的首席执行官。你应该在公司中开辟自己的天地,知道何时改变发展道路,并在可能长达50年的职业生涯中不断努力、干出实绩。要做好这些事情,你首先要对自己有深刻的认识——不仅清楚自己的优点和缺点,也知道自己是怎样学习新知识和与别人共事的,并且还明白自己的价值观是什么、自己又能在哪些方面做出最大贡献。因为只有当所有工作都从自己的长处着眼,你才能真正做到卓尔不群。

历史上的伟人——拿破仑、达芬奇、莫扎特——都很善于自我管理。这在很大程度上也是他们成为伟人的原因。不过,他们属于不可多得的奇才,不但有着不同于常人的天资,而且天生就会管理自己,因而才取得了不同于常人的成就。而我们当中的大多数人,甚至包括那些还算有点天赋的人,都不得不通过学习来掌握自我管理的技巧

我们必须学会自我发展,必须知道把自己放在什么样的位置上,才能做出最大的贡献,而且还必须在长达50年的职业生涯中保持着高度的警觉和投入——也就是说,我们得知道自己应该何时换工作,以及该怎么换。

★1、我的长处是什么?

多数人都以为他们知道自己擅长什么,其实不然!更多的情况是,人们只知道自己不擅长什么——即便是在这一点上,人们也往往认识不清。然而,一个人要有所作为,只能靠发挥自己的长处,而如果从事自己不太擅长的工作是无法取得成就的,更不用说那些自己根本干不了的事情。

以前的人没有什么必要去了解自己的长处,因为一个人的出身就决定了他一生的地位和职业:农民的儿子也会当农民,工匠的女儿会嫁给另一个工匠等。但是,现在人们有了选择。我们需要知己所长,才能知己所属。

要发现自己的长处,唯一途径就是回馈分析法(feedback analysis)。每当做出重要决定或采取重要行动时,你都可以事先记录下自己对结果的预期。9到12个月后,再将实际结果与自己的预期比较。我本人采用这种方法已有15到20年了,而每次使用都有意外的收获。

不见图 请翻墙
比如,回馈分析法使我看到,我对专业技术人员,不管是工程师、会计师还是市场研究人员,都容易从直觉上去理解他们。这令我大感意外。它还使我看到,我其实与那些涉猎广泛的通才没有什么共鸣。

回馈分析法并不是什么新鲜的东西。早在14世纪,这种方法由一个原本会永远默默无闻的德国神学家发明,大约150年后被法国神学家约翰·加尔文和西班牙神学家圣依纳爵分别采用。他们都把这种方法用于其信徒的修行。事实上,回馈分析法使他们的信徒养成了一种始终注重实际表现和结果的习惯,这也是他们创立的教派——加尔文教会和耶稣会——能够主宰欧洲长达30年的原因。

我们只要持之以恒地运用这个简单的方法,就能在较短的时间内(可能两三年),发现自己的长处——这是你需要知道的最重要的事情。在采用这种方法之后,你就能知道,自己正在做(或没有做)的哪些事情会让你的长处无法发挥出来。同时,你也将看到自己在哪些方面能力不是特别强。最后,你还将了解到自己在哪些方面完全不擅长,做不出成绩来。

根据回馈分析的启示,你需要在几方面采取行动。

首先,最重要的是,专注于你的长处,把自己放到那些能发挥长处的地方。

其次,加强你的长处。回馈分析会迅速地显示,你在哪些方面需要改善自己的技能或学习新技能。它还将显示你在知识上的差距——这些差距通常都可以弥补。数学家是天生的,但是人人都能学习三角学。

第三,发现任何由于恃才傲物而造成的偏见和无知,并且加以克服。有太多的人,尤其是那些术业有专攻的人,往往对其他领域的知识不屑一顾,或者认为聪明的头脑就可取代知识。比如,很多一流的工程师遇上与人相关的事就束手无策,他们还以此为荣——因为他们觉得,对条理清晰的工程师头脑来说,人太混乱无序了。与此形成鲜明对照的是,人力资源方面的专业人员常常以他们连基本的会计知识或数量分析都一无所知而自傲。不过,人们要是对这样的无知还沾沾自喜的话,那无异于自取灭亡。其实,要让自己的长处得到充分发挥,你就应该努力学习新技能、汲取新知识。

另外一点也同样重要——纠正你的不良习惯。所谓不良习惯,是指那些会影响你的工作成效和工作表现的事情。这样的习惯能很快地在回馈中反映出来。例如,一位企划人员可能发现自己美妙的计划最终落空,原因是他没有把计划贯彻到底。同那些才华横溢的人一样,他也相信好的创意能够移动大山。但是,真正移山的是推土机,创意只不过是为推土机指引方向,让它知道该到何处掘土。这位企划人员必须意识到不是计划做好就大功告成,接下来还得找人执行计划,并向他们解释计划,在付诸行动前须做出及时的调整和修改,最后要决定何时中止计划。

与此同时,回馈还会反映出哪些问题是由缺乏礼貌造成的。礼貌是一个组织的润滑剂。两个移动物相互接触时发生摩擦是一个自然规律,不仅无生命的物体是这样,人类也是如此。礼貌,其实也很简单,无非是说声“请”和“谢谢”,记住别人的名字,或问候对方家人这样的小事,但就是这种不起眼的细节,使得两个人能够融洽相处,不管他们彼此之间是否有好感。许多聪明人,尤其是聪明的年轻人,没有意识到这一点。如果回馈分析表明某个人只要一遇到需要别人合作的事就屡屡失败,那么很可能就意味着这个人的举止不大得体——也就是缺乏礼貌。

把预期和实际结果进行比较,也会发现自己不擅长做什么。我们每个人都有许多一窍不通、毫无天分的领域,在这些领域我们甚至连平庸的水平都达不到。人们,尤其是知识工作者,就不应该试图去完成这些领域的工作和任务。他们应该尽量少把精力浪费在那些不能胜任的领域上,因为“从无能到平庸”要比“从一流到卓越”需要人们付出多得多的努力。然而,大多数人,尤其是教师,还有组织,都一门心思要把能力低下的人变成合格者。其实,他们还不如把精力、资源和时间花在将称职者培养成佼佼者上。

★2、我的工作方式是怎样的?

令人惊讶的是,很少有人知道自己平时是怎样把事情给做成的。实际上,我们当中的大多数人甚至不知道不同人有着不同的工作方式和表现。许多人不是以他们习惯的方式工作,这当然就容易造成无所作为。对于知识工作者来说,“我的工作方式是怎样的?”可能比“我的长处是什么?”这个问题更加重要。

同一个人的长处一样,一个人的工作方式也是独一无二的——这是由人的个性所决定的。不管个性是先天决定的,还是后天培养的,它肯定是早在一个人进入职场前就形成了。正如一个人擅长什么、不擅长什么是既定的一样,一个人的工作方式也基本固定,它可以略微有所调整,但是不可能完全改变——当然也不会轻易改变。而且就像人们从事自己最拿手的工作容易做出成绩一样,他们要是采取了自己最擅长的工作方式也容易取得成就。通常,几个常见的个性特征就决定了一个人的工作方式。

不见图 请翻墙
我属于读者型,还是听者型?

首先,你要搞清楚的是,你是读者型(习惯阅读信息)还是听者型(习惯听取信息)的人。绝大多数人甚至都不知道还有“读者型”和“听者型”之说,而且很少有人既是读者型又是听者型。知道自己属于哪种类型的人更少。但是,有一些例子说明了这样的无知可能造成多大的危害。

德怀特·艾森豪威尔担任欧洲盟军最高统帅时,一直是新闻媒体的宠儿。他的记者招待会以其独特的风格出名——不管记者提出什么问题,艾森豪威尔将军都从容地对答如流。无论是介绍情况,还是解释政策,他都能够用两三句言简意赅的话就说清楚。十年后,艾森豪威尔当上了总统,当年曾对他十分崇拜的同一批记者,这时却公开瞧不起他。他们抱怨说,他从不正面回答问题,而是喋喋不休地胡侃着其他事情。他们总是嘲笑他回答问题时语无伦次,不合乎语法,糟蹋标准英语。

艾森豪威尔显然不知道自己属于读者型,而不是听者型。当他担任欧洲盟军最高统帅时,他的助手设法确保媒体提出的每一个问题至少在记者招待会开始前半小时以书面形式提交。这样,艾森豪威尔就完全掌握了记者提出的问题。而当他就任总统时,他的两个前任都是听者型——富兰克林·罗斯福和哈里·杜鲁门。这两位总统知道自己是听者型的,并且都喜欢举行畅所欲言的记者招待会。艾森豪威尔可能认为他必须去做两位前任所做的事。可是,他甚至连记者们在问些什么都从来没听清楚过。而且,艾森豪威尔并不是个极端的例子。

几年后,林登·约翰逊把自己的总统职位给搞砸了,这在很大程度上是因为他不知道自己是听者型的人。他的前任约翰·肯尼迪是个读者型的人,他搜罗了一些出色的笔杆子当他的助手,要求他们每次进行当面讨论之前务必先给他写通报。约翰逊留下了这些人,他们则继续写通报。可是他显然根本看不懂他们写的东西。不过,约翰逊以前当参议员时曾经表现非凡,因为议员首先必须是听者型。

没有几个听者型的人可以通过努力变成合格的读者型——不管是主动还是被动的努力;反之亦然。因此,试图从听者型转为读者型的人会遭受林登·约翰逊的命运,而试图从读者型转为听者型的人会遭受德怀特·艾森豪威尔的命运。他们都不可能发挥才干或取得成就。

★3、我如何学习?

要了解一个人的工作方式,需要弄清的第二点是,他是如何学习的。

许多一流的笔杆子都不是好学生——温斯顿·邱吉尔就是一例。在他们的记忆中,上学往往是十足的折磨。然而,他们的同学有这种记忆的却很少。他们可能在学校里得不到什么乐趣,对他们来说上学的最大痛苦是无聊。有关这个问题的解释是,笔头好的人一般不靠听和读来学习,而靠写来学习,这已成了一种规律。学校不让他们以这种方式学习,所以他们的成绩总是很糟糕。

所有的学校都遵循这样的办学思路:只有一种正确的学习方式,而且人人都得遵从。但是,对学习方式跟别人不大一样的学生来说,被迫按学校教的方式来学习就是地狱。实际上,学习大概有六七种不同的方式。

像邱吉尔这样的人靠写来学习。还有些人以详尽的笔记来学习。例如,贝多芬留下了许多随笔小抄,然而他说,实际上他作曲时从来不看这些随笔小抄。当被问及他为什么还要用笔记下来时,据说他回答道:“如果我不马上写下来的话,我很快就会忘得一干二净。如果我把它们写到小本子上,我就永远不会忘记了,也用不着再看一眼。”有些人在实干中学习。另一些人通过听自己讲话学习。

我认识一位公司总经理,他把一个平庸的小家族企业发展成行业领军企业。他是一个通过讲话学习的人。他习惯于每周一次把全体高层管理人员召集到他的办公室,随后对他们讲上两三个小时。他总是提出政策性问题,在每一个问题上提出三种不同观点。但他很少请这帮同事发表意见或提出问题,他只需要听众听他讲话。这就是他的学习方式。虽然他是一个比较极端的例子,但是通过讲话学习绝不是一种少见的方法。成功的出庭律师也以同样的方式学习,许多诊断医师也是如此(我自己也是这样)。

在所有最重要的自我认识当中,最容易做到的就是知道自己是怎样学习的。当我问人们:“你怎么学习?”大多数人都知道答案。但是,当我问:“你根据这个认识来调整自己的行为吗?”没有几个人回答“是”。然而,知行合一是取得成就的关键;如果知行不合一,人们就会无所作为。

我属于读者型还是听者型?我如何学习?这是你首先要问自己的问题。但是,光这些问题显然不够。要想做好自我管理,你还需要问这样的问题:我能与别人合作得好吗?还是喜欢单枪匹马?如果你确实有与别人进行合作的能力,你还得问问这个问题:我在怎样的关系下与他人共事?

有些人适合当部属。二战时期美国的大英雄乔治·巴顿将军是一个很好的例子。巴顿是美军的一名高级将领。然而,当有人提议他担任独立指挥官时,美国陆军参谋长(可能也是美国历史上最成功的伯乐)乔治·马歇尔将军说:“巴顿是美国陆军造就的最优秀的部下,但是,他会成为最差劲的司令官。”

一些人作为团队成员工作最出色;另一些人单独工作最出色。一些人当教练和导师特别有天赋;另一些人却没能力做导师。

另一个关键的问题是,我如何才能取得成果——是作为决策者还是作为顾问

许多人做顾问时的表现会很出色,但是不能够承担决策的负担和压力。与此相反,也有许多人需要顾问来迫使他们思考,随后他们才能做出决定,接着迅速、自信和大胆地执行决定。

顺便说一下,一个组织的二号人物在提升到一号职位时常常失败,也正是因为这个原因。最高职位需要一个决策者,而一个强势的决策者常常把其信赖的人放在二号位置,当他的顾问。顾问在二号位置上往往是很出色的,但是换到一号位置,他就不行了。他虽然知道应该做出什么样的决定,但是不能接受真正做决定的责任。

其他有助于认识自我的重要问题包括:

1、我是在压力下表现出色,还是适应一种按部就班、可预测的工作环境?
2、我是在一个大公司还是在一个小公司中工作表现最佳?
3、在各种环境下都工作出色的人寥寥无几。

我不止一次地看到有些人在大公司中十分成功,换到小公司中则很不顺利。反过来也是如此。下面这个结论值得我们反复强调:不要试图改变自我,因为这样你不大可能成功。但是,你应该努力改进你的工作方式。另外,不要从事你干不了或干不好的工作。

不见图 请翻墙

★4、我的价值观是什么?

要能够自我管理,你最后不得不问的问题是:我的价值观是什么?这不是一个有关伦理道德的问题。道德准则对每一个人都一样。要对一个人的道德进行测试,方法很简单。我把它称为“镜子测试”。

20世纪初,德国驻英国大使是当时在伦敦所有大国中最受尊重的一位外交官。显然,他命中注定会承担重任,即使不当本国的总理,至少也要当外交部长。然而,在1906年,他突然辞职,不愿主持外交使团为英国国王爱德华七世举行的晚宴。这位国王是一个臭名昭著的色鬼,并且明确表示他想出席什么样的晚宴。据有关报道,这位德国大使曾说:“我不想早晨刮脸时在镜子里看到一个皮条客。”——这就是镜子测试。

不见图 请翻墙
我们所尊从的伦理道德要求你问自己:我每天早晨在镜子里想看到一个什么样的人?在一个组织或一种情形下合乎道德的行为,在另一个组织或另一种情形下也是合乎道德的。但是,道德只是价值体系的一部分——尤其对于一个组织的价值体系来说。

如果一个组织的价值体系不为自己所接受或者与自己的价值观不相容,人们就会备感沮丧,工作效力低下。

让我们来看看一位十分成功的人力资源主管的经历。这位主管所在的公司被一家大企业收购。收购之后,她得到了提升,从事的是她以前做得最出色的工作,包括为重要职位挑选人才。这位主管深信,在选人时,公司只有在排除内部的所有可能人选后才能从外部招聘人才。但是她的新公司认为应该首先从外部招聘,以吸收新鲜血液。对于这两种方式,需要说明的一点是,根据我的经验,适当的方式是两者兼顾。然而,这两种方式在根本上是互不相容的——表面上是政策不同,实质是价值观的不同。这说明在该公司人们对以下三个问题有着不同看法:组织与员工之间是怎样的关系;组织应该为员工以及员工的发展承担何种责任;一个人对企业最重要的贡献是什么。经过几年挫折,这位主管最终辞职——尽管她的经济损失很大。她的价值观和这个组织的价值观就是无法融合。

同样,一家制药公司无论是通过不断的小幅改进,还是通过几次费用高昂、风险巨大的“突破”来取得出色业绩,都不是一个经济问题。这两种战略的结果可能都差不多。实质上,这是两种价值体系之间的冲突。一种价值体系认为公司的贡献是帮助医生把他们已经在做的工作锦上添花,另一种价值体系的取向是进行更多的科学发现。

至于一个企业的经营是着眼于短期结果,还是注重长远发展,这同样是价值观问题。财务分析师认为,企业可两者同时兼顾。成功的企业家知道得更清楚。诚然,每一家公司都必须取得短期成果。但是在短期成果与长期增长之间的冲突中,每一家公司都将决定自己所选择的重点。从根本上说,这是一种关于企业职能与管理层责任的价值观冲突。

价值观冲突并不限于商业组织。美国发展最快的一个牧师教会,其衡量工作成败的尺度是新教徒的人数。它的领导层认为,重要的是有多少新教徒入会。随后,上帝将满足他们的精神需求,或者至少会满足足够比例的新教徒的需求。另一个福音派牧师教会认为,重要的是人们的精神成长。这个教会慢慢地让那些形式上入会但精神上并没有融入教会生活的新教徒选择了离开。

这同样不是一个数量问题。乍一看,第二个教会好像发展较慢。但是,它留住新教徒的比例要远高于第一个。换言之,它的发展比较稳固。这也不是一个神学问题(至少首先并不是神学问题),而是有关价值观的问题。在一次公开辩论中,一位牧师这样说:“除非你先加入教会,否则你永远找不到天国之门。”而另一位牧师反驳说:“不,除非你先有心寻找天国之门,否则你就不属于教会。”

组织和人一样,也有价值观。为了在组织中取得成效,个人的价值观必须与这个组织的价值观相容。两者的价值观不一定要相同,但是必须相近到足以共存。不然,这个人在组织中不仅会感到沮丧,而且做不出成绩。

一个人的工作方式和他的长处很少发生冲突,相反,两者能产生互补。但是,一个人的价值观有时会与他的长处发生冲突。一个人做得好甚至可以说是相当好、相当成功的事情——可能与其价值体系不吻合。在这种情况下,这个人所做的工作似乎并不值得贡献毕生的精力(甚至没必要贡献太多的精力)。

如果可以,请允许我插入一段个人的故事。多年前,我也曾不得不在自己的价值观和做得很成功的工作之间做出选择。20世纪30年代中期,我还是一个年轻人,在伦敦做投资银行业务,工作非常出色。这项工作显然能发挥我的长处。然而,我并不认为自己担任资产管理人是在做贡献。我认识到,我所重视的是对人的研究。我认为,一生忙于赚钱、死了成为墓地中的最大富翁没有任何意义。当时我没有钱,也没有任何就业前景。尽管当时大萧条仍在持续,我还是辞去了工作。这是一个正确的选择。换言之,价值观是并且应该是最终的试金石

★5、我属于何处?

少数人很早就知道他们属于何处。比如,数学家、音乐家和厨师,通常在四五岁的时候就知道自己会成为数学家、音乐家和厨师了。物理学家通常在十几岁甚至更早的时候就决定了自己的工作生涯。但是,大多数人,尤其是很有天赋的人,至少要过了二十五六岁才知道他们将身属何处。然而,到这个时候,他们应该知道上面所谈的三个问题的答案:

1、我的长处是什么?
2、我的工作方式是怎样的?
3、我的价值观是什么?

随后,他们就能够决定自己该向何处投入精力。或者,他们应该能够决定自己不属于何处。

不见图 请翻墙
已经知道自己在大公司里干不好的人,应该学会拒绝在一个大公司中任职。已经知道自己不适合担任决策者的人,应该学会拒绝做决策工作。巴顿将军(他自己大概永远不知道这一点)本来应该学会拒绝担任独立总指挥的。

同样重要的是,知道上述三个问题的答案,也使得一个人能够坦然接受一个机会、一个邀请或一项任务。他们会说:“是的,我将做这件事。但是,我将按照我自己的特点,采取这样的方式来做这件事,进行这样的组织安排,这样来处理当中所牵涉的关系。这是我在这个时间范围内应该会取得的成果,因为这就是我。”

成功的事业不是预先规划的,而是在人们知道了自己的长处、工作方式和价值观后,准备把握机遇时水到渠成的。知道自己属于何处,可使一个勤奋、有能力但原本表现平平的普通人,变成出类拔萃的工作者。

★6、我该做什么贡献?

综观人类的发展史,绝大多数人永远都不需要提出这样一个问题:我该做出什么贡献?因为他们该做出什么贡献是由别人告知的,他们的任务或是由工作本身决定的(例如农民或工匠的任务),或是由主人决定的(例如佣人的任务)。

以前的人大多都处于从属地位,别人吩咐他们做什么,就做什么,这被认为是理所当然的。甚至到了20世纪50年代和60年代,那时涌现出的知识工作者(即所谓的“组织人”,organization man)还指望公司的人事部为他们做职业规划。

随后,到20世纪60年代末,就再没有人想让别人来安排自己的职业生涯了。年轻的男男女女开始提出这个问题:我想做什么?而他们所听到的答案就是“你们自行其是吧”。但是,这种回答同“组织人”听命公司的做法一样错误。那些相信自行其是就能做出贡献、实现抱负、取得成功的人,一般连三点中的任何一点都做不到。

尽管如此,我们还是不能走回头路,让别人来吩咐、安排自己要干什么。对于知识工作者来说,他们还不得不提出一个以前从来没有提出过的问题:我的贡献应该是什么?要回答这个问题,他们必须考虑三个不同的因素:

1、当前形势的要求是什么?
2、鉴于我的长处、我的工作方式以及我的价值观,我怎样才能对需要完成的任务做出最大贡献?
3、必须取得什么结果才能产生重要影响?

不见图 请翻墙
请看一位新任命的医院院长的经历。这是一所享有盛名的大医院,30年来一直就靠名气顺利经营着。新院长上任后决定了自己应做的贡献:两年内在医院的某个重要领域建立起卓越服务的标准。他决定以急诊室为重点,因为该院的急诊室地方比较大,受人注意,而又秩序混乱。他决定,到急诊室就诊的每一个患者必须在60秒钟之内由一名合格的护士接待。一年之内,该医院的急诊室变成了美国所有医院的样板,又过了两年,整个医院的面貌焕然一新。

正如这个事例所表明的,把眼光放得太远是不大可能的——甚至不是特别有效。一般来说,一项计划的时间跨度如果超过了18个月,就很难做到明确和具体。因此,在多数情况下我们应该提出的问题是:

1、我在哪些方面能取得将在今后一年半内见效的结果?
2、如何取得这样的结果?

回答这个问题时必须对几个方面进行权衡:

首先,这些结果应该是比较难实现的——用当前的一个时髦词说,就是要有“张力”(stretching)。但是,这些结果也应该是能力所及的。设定一个不能实现的目标或者只能在可能性微乎其微的情况下实现的目标,根本不能叫雄心勃勃,简直就是愚蠢。

其次,这些结果应该富有意义,要能够产生一定影响。

最后,结果应该明显可见,如果可能的话,还应当能够衡量。确定了要实现的结果之后,接着就可以制订行动方针:做什么,从何处着手,如何开始,目标是什么,在多长时间内完成。

★7、我要如何处理人际关系?

除了少数伟大的艺术家、科学家和运动员,很少有人是靠自己单枪匹马而取得成果的。不管是组织成员还是个体职业者,大多数人都要与别人进行合作,并且是有效的合作。要实现自我管理,你需要对自己的人际关系负起责任。这包括两部分内容。

首先是要接受:别人是和你一样的个体这个事实。

每个人都会执意展现自己作为人的个性。这就是说,每个人都有自己的长处,自己的做事方式和自己的价值观。因此,要想卓有成效,你就必须知道共事者的长处、工作方式和价值观。这个道理听起来让人很容易明白,但是没有几个人真正会去注意。

不见图 请翻墙
一个习惯于写报告的人就是个典型的例子——他在第一份工作时就培养起写报告的习惯,因为他的老板是一个读者型的人,而即使下一个老板是个听者型,此人也会继续写着那肯定没有任何结果的报告。这位老板因此肯定会认为这个员工愚蠢、无能、懒惰,肯定干不好工作。但是,如果这个员工事先研究过新老板的情况,并分析过这位老板的工作方式,这种情况本来可以避免。

老板既不是组织结构图上的一个头衔,也不是一个“职能”。他们是有个性的人,他们有权以自己最得心应手的方式来工作。与他们共事的人有责任观察他们,了解他们的工作方式,并做出相应的自我调整,以适应老板最有效的工作方式。事实上,这就是“管理”上司的秘诀。

这种方法适用于所有与你共事的人。每个人都有他自己的做事方法,也有权按照自己的方式来工作,而不是按你的方法来工作。重要的是,他们能否有所作为以及他们持有什么样的价值观。至于工作方式,人各有别。提高效力的第一个秘诀是了解跟你合作和你要依赖的人,以利用他们的长处、工作方式和价值观。工作关系应当既以工作为基础,也以人为基础。

人际关系责任的第二部分内容是沟通责任。

在我或是其他人开始给一个组织做咨询时,我们听到的第一件事都与个性冲突有关。其中大部分冲突都是因为:人们不知道别人在做什么,他们又是采取怎样的工作方式,专注于做出什么样的贡献以及期望得到怎样的结果。而这些人不了解情况的原因是,他们没有去问,结果也就不得而知。这种不去问明情况的做法,与其说是反映了人类的愚蠢,倒不如说是历史使然。

在以前,人们没必要把这些情况告诉任何人。比如在中世纪的城市,一个区的每一个人从事的行业都一样。在乡村,土地刚一解冻,山谷里的每一个人就开始播种同一种农作物。即使有少数人做的事情和大家不一样,他们也是单独工作,因此不需要告诉任何人他们在做什么。

而现在,大多数人都与承担着不同任务和责任的人一道工作。市场营销副总裁可能是销售出身,知道有关销售的一切,但是,对于自己从未做过的事情,比如定价、广告、包装等等,就一无所知了。所以,那些正在做这些工作的人必须确保营销副总裁懂得他们设法做的是什么、他们为什么要做这件事、他们将如何去做以及期望取得什么结果。

如果营销副总裁不懂得这些高层次的、知识型的专业人士在做什么,错主要在后者身上,而不在自己。反过来说,营销副总裁的责任则是确保他的所有同事都知道自己是怎样看待营销这项工作的:他的目标是什么、他如何工作,以及他对他本人和他的每一个同事有什么期望。

即使一些人懂得负起人际关系责任的重要性,他们和同事的交流也往往不够。他们总是有所顾虑,怕别人把自己看成是一个冒昧、愚蠢、爱打听的人。他们错了。因为我们看到,每当有人找到他的同事说“这是我所擅长的工作。这是我的做事方式。这是我的价值观。这是我计划做出的贡献和应当取得的成果”,这个人总会得到如此回答:“这太有帮助了,可你为什么不早点告诉我?”

如果一个人继续问道:“那么,关于你的长处、你的工作方式、你的价值观以及你计划做出的贡献,我需要知道什么?”他也会得到类似的答复——据我的经验,无一例外。事实上,知识工作者应该向与他们共事的每一个人,不管是下属、上司、同事还是团队成员,都发出这样的疑问。而且,每次提出此类问题,都会得到这样的回答:“谢谢你来问我。但是,你为什么不早点问我?”

组织已不再建立在强权的基础上,而是建立在信任的基础上。人与人之间相互信任,不一定意味着他们彼此喜欢对方,而是意味着彼此了解。因此,人们绝对有必要对自己的人际关系负责。这是一种义务。不管一个人是公司的一名成员,还是公司的顾问、供应商或经销商,他都需要对他的所有共事者负起这种责任。所谓共事者,是指在工作上他所依赖的同事以及依赖他的同事。

★8、我该如何管理后半生?

当多数人的工作是体力劳动时,你不必为自己的后半生担心。你只要继续从事你一直在做的工作就行了。如果你够幸运,能在工厂或铁路辛勤工作40年后撑下来,你就可以快乐地度过余生,什么也用不着干。然而,现在的多数工作都是知识工作,而知识工作者在干了40年后,仍能发挥余热,他们只是有些厌倦。

我们听到了许多有关经理人中年危机的谈论,“厌倦”这个词在其中频频出现。45岁时,多数经理人的职业生涯达到了顶峰,他们也知道这一点。在做了 20年完全相同的工作之后,他们已经得心应手。但是他们学不到新东西,也没有什么新贡献,从工作中得不到挑战,因而也谈不上满足感。然而,在他们面前,还有20到25年的职业道路要走。这就是为什么经理人在进行自我管理后,越来越多地开始发展第二职业的原因。

发展第二职业有三种方式:

不见图 请翻墙
第一种是完全投身于新工作。

这常常只需要从一种组织转到另一种组织。例如,一家大公司某事业部的会计师成为一家中型医院的财务总监。但是也有越来越多的人转入完全不同的职业。例如,公司经理在45岁时进入政府内阁;或者中层管理人员在公司工作20年后离职,到法学院进修,成为一个小镇的律师。还有许多人在第一份职业中取得的成功有限,于是改行从事第二职业。这样的人有很多技能,他们也知道该如何工作。而且,他们需要一个社群——因为孩子已长大单飞,剩下一座空屋。他们也需要收入。但最重要的是,他们需要挑战。

为后半生做准备的第二种方式是,发展一个平行的职业。

许多人的第一职业十分成功,他们还会继续从事原有工作,或全职或兼职,甚至只是当顾问。但是,除此之外,他们会开创一项平行的工作,通常是在非营利机构,每周占用10个小时。例如,他们可能接手教会的管理,或者担任当地女童子军顾问委员会主席。他们也可能管理受虐妇女庇护所,担任当地公共图书馆的儿童图书管理员,或在学校董事会任职等。

最后一种方法是社会创业。

社会创业者通常是在第一职业中非常成功的人士。他们都热爱自己的工作,但是这种工作对他们已经不再有挑战性。在许多情况下,他们虽然继续做着原来的工作,但在这份工作上花的时间越来越少。他们同时开创了另一项事业,通常是非营利性活动。例如,我的朋友鲍勃·布福德创办了一个非常成功的电视公司,现在他仍然经营着。但与此同时,他还创建了一个与新教教会合作的非营利组织,也做得非常成功。现在他又创建了一个组织,专门指导社会创业者在经营原有业务的同时,如何管理自己另外创办的非营利机构。

能管理好自己后半生的人总是少数。多数人可能“一干到底”,数着年头一年一年过去,直至退休。但是,正是这些少数人,这些把漫长的工作寿命看做是自己和社会之机会的男男女女,才会成为领袖和模范。

管理好后半生有一个先决条件:你必须早在你进入后半生之前就开始行动。当30年前人们首次认识到工作寿命正在迅速延长时,许多观察家(包括我自己)认为,退休人员会越来越多地成为非营利机构的志愿者。可是,这种情况并没有发生。一个人如果不在40岁之前就开始做志愿者,那他60岁之后也不会去做志愿者。

同样,我认识的所有社会创业者,都是早在他们原有的事业达到顶峰之前就开始从事他们的第二事业。请看一名成功律师的例子。这位律师是一家大公司的法律顾问,他同时在自己所在的州开办了模特培训学校。早在他35岁左右的时候,他就开始志愿为学校提供法律咨询。40岁时被推选为一家学校的董事会成员。50岁时,他积累起了一笔财富,办起了自己的企业——建立并经营模特培训学校。然而此时,他依旧在那家他年轻时参与创建的公司里担任首席法律顾问,而且几乎是全职工作。

发展第二兴趣(而且是趁早发展)还有一个原因:任何人都不能指望在生活或工作中很长时间都不遭遇严重挫折。有一位很能干的工程师在45岁时错过了晋升的机会。另一位也很能干的普通学院的教授在42岁时认识到,即使她完全具备担任教授的资格,她永远也不会在一所有名的大学里获得教授职位。还有一位则是在家庭生活里出现了悲剧:婚姻破裂或者痛失子女。在这样的时刻,第二兴趣——不仅仅是业余爱好——还可能发挥重要作用。例如,这位工程师现在知道他在工作上并不十分成功。但是,在公司以外的活动中,例如负责教会资金的管理,他是成功的。一个人可能家庭破碎,但是他能在第二兴趣的活动中发现还有社区这个大“家庭”。

在一个崇尚成功的社会里,拥有各种选择变得越来越重要。从历史上来看,却没有“成功”一说。绝大多数人只期望坚守“适当的位置”。唯一的流动性是向下的流动性。然而,在知识社会里,我们期望每一个人都能取得成功。这显然是不可能的。对许多人来说,能避免失败就行。可是有成功的地方,就会有失败。因此,有一个能够让人们做出贡献、发挥影响力或成为“大人物”的领域,这不仅对个人十分重要,对个人的家庭也同样重要。这意味着人们需要找到一个能够有机会成为领袖、受到尊重、取得成功的第二领域——可能是第二份职业,也可能是平行的职业或社会创业。

自我管理中面临的挑战看上去比较明显,甚至非常基本,其答案可能不言自明,甚至近乎幼稚。但是,自我管理需要个人,尤其是知识工作者,做出以前从未做过的事情。实际上,自我管理需要每一个知识工作者在思想和行动上都要成为自己的首席执行官。更进一步来看,这样的转变——从一切听从别人吩咐的体力劳动者到不得不自我管理的知识工作者——也使得社会结构发生了深刻变化。

历史上每一个社会,甚至是个人主义倾向最强的社会,都认为(即使只是下意识地认为)两件事情是理所当然的:

1、组织比员工更长寿;
2、大多数人从不挪地方。

如今,情况恰恰相反。知识工作者的寿命超过了组织寿命,而且他们来去自如。于是,人们对自我管理的需要在人类事务中掀起了一场革命。

俺博客上,和本文相关的帖子(需翻墙)
如何完善自己的知识结构
学习技术的三部曲:WHAT、HOW、WHY
什么是【真正的】兴趣爱好?以及它有啥好处?
成功学批判——简述其危害性及各种谬误
硅谷 CEO 们的教父——分享安迪·格鲁夫的管理经验
如何成为优秀开发人员(系列)
为啥俺要写这个博客——动机的自我分析

Tips for Continuous Deployments with React Native and Circle CI

$
0
0

Tips for Continuous Deployments with React Native and Circle CI

First, why? Most simply, an effective CI/CD pipeline will stabilize and simplify your release cycle, improve your development process, and help guard against code regressions and bugs creeping into production. If that sounds like a good idea, read on.

Since there are many solutions to CI/CD for React Native, this piece is not to be taken as definitive or the best solution. Everyone’s development and deployment process, tool chains, and requirements will be different, so your mileage may vary here, but I’m hoping some of the gotchas I’ll mention will be applicable to anyone looking to automate their deploy process. Other alternatives for CI/CD in the React Native space are Microsoft’s AppCenterBitrise offers a solution, and Buddybuild (my personal favourite) still exists for those who signed up before it’s restructuring, and the list goes on.

This article will focus on CircleCI. It’s a good solution for existing projects that you may already be using for a web/backend project, since centralizing your CI/CD is easier than configuring multiple services. CircleCI obviously supports React Native (through macOS and Linux containers), although, I’m sorry to say it is not free to use. In order to build and release iOS apps you’ll need to use their macOS container plan which is available only to paid users.


Overview:

Once you’ve set up an account, you’ll want to follow the instructions for adding an app from your git provider and add your `.circleci` folder to your project. It’ll give you a big thing to copy/paste to get started. Once that’s done, push to git and see if anything happens!

Now that it’s set up, you can create your own customized workflow to run tests/deploys however you want them configured. I find it useful to run tests on every branch on each git push to ensure that everything is working properly, or to learn what still needs to be fixed before it’s merged back into master. I then deploy to the Testflight/Alpha testing when something is merged to a staging or production branch. An example workflow would look something like this:

# config.yml
... jobs etc.
workflows:
  version: 2
  test-and-deploy:
    jobs:
       — run_tests
       — deploy_android:
         requires:
           — run_tests
           filters:
             branches:
               only: 
                 — production
                 — staging
       — deploy_ios:
         requires:
           — run_tests
           — deploy_android
           filters:
             branches:
               only:
                 — production
                 — staging

This means that the run_tests job will get kicked off on every push, but the deploy_android and deploy_ios will only occur on the production/staging branches, after all the tests have passed


Testing Etc.:

Pretty simple here. Run your commands as usual. If you’re using Jest, it takes a — ci option and a maxWorkers option to prevent out of memory errors. You can also run your linter here as well, or any other tasks you might want to run alongside your tests. If you integrate with other testing mechanisms, you could also do that here.

- run: yarn test — maxWorkers=2 --ci

Deploying:

This is obviously the more complicated bit. But I’ll break it down, and hopefully illuminate some gotchas.

Fastlane:

Essentially, Fastlane is a great utility belt for building/releasing mobile apps. There’s a million posts about Fastlane and React Native, here are two from Infinite Red:

Releasing on iOS with Fastlane 
Releasing on Android with Fastlane

Code Signing:

Fastlane provides Match (as mentioned in that first Fastlane article). It handles all code-signing for you, provided you trust hosting all your keys in a private Github repository. I find it’s best to create a machine user on your iTunes Connect/Developer team, something like “deployer@company.xyz” so that all your teammates can share and download the certs of this user when they run the match command locally. The best part is, if something goes wrong, no worries, nuke all your old certs and regenerate new ones in seconds without consequence. It removes the need to really think about code-signing (for the most part).

Your Fastlane script will also have to run match, so that the CI is able to deploy and release with this account. Make sure you add the setup_circle_cicommand at the top of your deployment lane. You’ll also need to add the environment variables of FASTLANE_PASSWORD and MATCH_PASSWORD to your CircleCI environment variables so that your container will be able to run match/deploy. Refer to the docs here for more info on that if you want

Android App Signing:

This is something that isn’t covered by the Circle CI docs anywhere, and their React Native example repo also doesn’t suggest how to handle this. After reading a few other blog posts online, it seems like a common solution is to host your key-store file somewhere in a private location online. Some recommend DropBox, but I use the same Github repo that is shared with Fastlane’s Match mentioned above.

Store both the key-store file and the developer.json file that Fastlane requires in order to upload your APK to Google Play in the Match repo. Afterwards, it’s as simple as adding a simple shell script command to be run in your circle config:

You may have to give the file executable permissions first:

# circle.yml
... previous build steps in job
- run: chmod u+x download_release_data.sh
- run: ./download_release_data.sh

These files can look something like this:

#!/bin/bash
# download_release_data.sh
# If you’re using bitbucket, you can just set the env-var in the circle config for your bitbucket repo
git archive — remote=ssh://${BITBUCKET_CERTS_REPO} HEAD prod.keystore | tar -x
git archive — remote=ssh://${BITBUCKET_CERTS_REPO} HEAD google-play.json | tar -x
# if you’re using github, you can give your machine user a GH access token to simply grab the file, the names of which can be stored in the circle env-var section as well
curl -L — header “Authorization: token ${GH_TOKEN}” \
 — header ‘Accept: application/vnd.github.v3.raw’ \
 — remote-name \
 — location “${GITHUB_URL_FOR_KEYSTORE}”
curl -L — header “Authorization: token ${GH_TOKEN}” \
 — header ‘Accept: application/vnd.github.v3.raw’ \
 — remote-name \
 — location “${GITHUB_URL_FOR_DEVELOPER_JSON}”

After the key-store and developer.json files have been downloaded, depending on where they end up, you may need to move them so that the react-native cli is able to find and use them accordingly.


Cacheing:

You obviously don’t want to go over your the build limits and end up paying more, and most likely want your build processing time to be as fast as possible, so cache the steps that take the longest! Cache your node modules, your gems, your pods, whatever else you can!

It’s pretty easy, add a step that checks for the cache, in this case our node_modules:

- restore_cache:
 name: Restore node_modules cache
 key: yarn-cache-{{ .Branch }}-{{ checksum “yarn.lock” }}

Here, this cache is branch specific and checksum dependent. You can make it more specific, or less specific. Make sure you add the step to save the cache as well after, in case the branch has changed, or if there was no cache in the first place:

- run: yarn
- save_cache:
    name: Save node_modules cache
    key: yarn-cache-{{ .Branch }}-{{ checksum “yarn.lock” }}

Rinse and repeat for whatever else you need!

By the way, if you are using CocoaPods, CircleCI provides a cache for you to speed up build time!


Gotchas

Out of Memory errors: These are the worst! Android builds take a lot of processing power, and if you’re on the smallest tier, or haven’t enabled some of the other options that CircleCI provides to increase container sizes, it can run out of memory pretty easily and crash. I’ve found that tweaking some limits on the gradle options in the CircleCI script, as well as specifying the amount of workers used in your build.gradle inside your React Native project can solve most of these issues:

# build.gradle
# add this line before the ‘apply from … react.gradle’ as mentioned in the comments that RN ships with in the file.
project.ext.react = [ extraPackagerArgs: [“ — max-workers=1”] ]
# circle.yml
environment:
 GRADLE_OPTS: ‘-Dorg.gradle.jvmargs=”-Xmx1024m      
    -XX:+HeapDumpOnOutOfMemoryError”’

Xcode version: Set it! Circle defaults to 9.0 at the moment. You may want to use something closer to what you’re developing with, as well as some Fastlane commands don’t seem to share the same compatibility between Xcode versions sometimes:

# circle.yml
macos:
  xcode: “9.3.0”

CodePush: No gotcha here, rather CodePush has got your back! You can still use CodePush if you’re using CircleCI and Fastlane. Create a lane to run your release commands, or upload source maps or whatever you need to do!


Conclusion:

I know this isn’t enough to walk away with a working pipeline of copy/paste code, but so often one’s deployment needs are different enough that I thought it best to just give an overview of what’s possible and what bites. Using CircleCI in conjunction with Fastlane is a great way to setup CI/CD solution for React Native. Make sure you take advantage of caching, using CircleCI workflows, tweaking your options to prevent out-of-memory errors, Fastlane and Match to save you time and complexity.

A special thanks to G2i for this post. For those who are unfamiliar, G2i is a hiring platform run by engineers that matches companies with pre-vetted React, React Native, GraphQL, and native iOS/Android focused engineers you can trust.

JavaScript Open Source Projects of the Month (v.June 2018)

$
0
0

JavaScript Open Source Projects of the Month (v.June 2018)

For the past month, we ranked nearly 250 JavaScript Open Source Projects to pick the Top 10.

We compared projects with new or major release during this period. Mybridge AI ranks projects based on a variety of factors to measure its quality for professionals.

  • Average number of Github stars in this edition: 2,086 ⭐
  • “Watch” JavaScript Top 10 Open Source on Github and get email once a month.
  • Topics: Pollyjs, UI toolkit, Graph Drawing, Machine Learning, SVG, Functional Programming, Electron, Parcel Bundler, R tree, Chat bot

Open source projects can be useful for programmers. Hope you find an interesting project that inspires you.

Course of the month:

A) Beginners: The Modern JavaScript Bootcamp (2018). [868 recommends, 4.7/5 stars]

B) Beginners: JavaScript 2018: Modern Approach. [193 recommends, 4.8/5 stars]

Rank 1

Pollyjs: Record, Replay, and Stub HTTP Interactions. [4875 stars on Github]. Courtesy of Netflix

……[Documentation]


Rank 2

JSUI: A powerful UI toolkit for managing JavaScript apps [2719 stars on Github]. Courtesy of Kitze

……[Tweet]


Rank 3

G6: A Graph Visualization Framework in JavaScript [2344 stars on Github]. Courtesy of AntV team


Rank 4

Guess.js: A toolkit for enabling data-driven user-experiences on the Web [2648 stars on Github]. Courtesy of Guess.js

……[Introducing Guess.js]


Rank 5

Vivid: A JavaScript library which is built to easily customize and use the SVG Icons with a blaze. [1303 stars on Github]. Courtesy of Webkul


Rank 6

List v2: An immutable list with unmatched performance and a comprehensive functional API. [998 stars on Github]. Courtesy of Funkia


Rank 7

Tana: Bringing the Picture-in-Picture experience to desktop. [57 stars on Github]. Courtesy of Josue Mavarez


Rank 8

Minipack: A simplified example of a modern module bundler written in JavaScript [895 stars on Github]. Courtesy of Ronen Amiel


Rank 9

Flatbush v3.0: A very fast static spatial index for 2D points and rectangles in JavaScript [326 stars on Github]. Courtesy of Vladimir Agafonkin


Rank 10

Botpress v10: An open-source bot creation tool written in Javascript [5570 stars on Github]. Courtesy of Botpress

That’s it for JavaScript Monthly Open Source. Visit our publication to find top posts for more programming skills.

React Native地图 – react-native-mapbox-gl和GeoJSON数据格式总结

$
0
0

 

 

写在前面

在React Native 地图组件选择中我做了很多尝试,以下是我的一些建议和总结。

1.react-native-maps 对iOS十分友好,但是对android并不友好,需要google play支持。
2.react-native-amap3d 国内优秀开源库基于高德地图SDK,无条件支持,但是在遇到复杂需求时就会比较鸡肋,如自定义瓦片图层、大量数据渲染卡顿等
3.react-native-mapbox-gl 弥补了上面的缺点,而且拓展性非常高,也是这篇文章主要要写的。

GeoJSON

什么是GeoJSON?

使用mapbox不得不先了解以下GeoJSON格式规范,首先po个对比,
使用第1,2个库时,我们渲染多个坐标点可能是这样的,使用类似的组件通过数组遍历并渲染,一个点需要一个

//数据
const data = [
    {coordinate:[100.0, 0.0]]},
    {coordinate:[101.0, 1.0]]},
    {coordinate:[100.1, 1.0]]},
    {coordinate:[101.1, 0.0]]},
]
//组件

    {data.map(marker=>{
        return (
            <Marker
              ...props
              coordinate={marker.coordinate}
            />
        )
    })}
</MapView>

使用mapbox-gl时思想完全变了,
这里先不急介绍组件的用法,可以轻易看出没有了数组的循环遍历

//数据
const geoJSON = {
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "id": "id0",
            "geometry": {
                "type": "MultiPoint",
                "coordinates":[
                    [100.0, 0.0], [101.0, 1.0],
                    [100.0, 1.0], [101.0, 0.0],
                    ...
                ]
            }
        }
    ]
}
//组件
<MapboxGL.ShapeSource shape={geoJSON}>
    <MapboxGL.SymbolLayer 
        style={[styles.mark, 
            {textField: '{text}',iconImage : '{icon}'}
        ]}
    />

GeoJSON文档

GeoJSON是基于JavaScript 对象表示法的地理空间信息数据交换格式
GeoJSON文档地址

GeoJSON解构


type基础类型

  • Point
  • LineString
  • Polygon
  • MultiPoint
  • MultiLineString
  • MultiPolygon
{
    "type":'几何形状的类型',
    "coordinates":[]    //坐标点
}

Geometry primitives
Multipart geometries

type高级类型

GeometryCollection
点、线、面的集合

{
   "type": "GeometryCollection",
   "geometries": [
       {
           "type": "Point",
           "coordinates": [100.0, 0.0]
       },
       {
           "type": "LineString",
           "coordinates": [
               [101.0, 0.0], [102.0, 1.0]
           ]
       }
   ]
}

Feature
GeometryCollection基础上可添加最标点的属性properties

{
   "type": "Feature",
   "geometry": {
       "type": "LineString",
       "coordinates": [
           [100.0, 0.0], [101.0, 1.0]
       ]
   },
   "properties": {
       "prop0": "value0",
       "prop1": "value1"
   }
}

geometry内可以使用”GeometryCollection”

{
   "type": "Feature",
   "geometry": {
      "type": "GeometryCollection",
      "geometries": [
          {
            "type": "Point",
            "coordinates": [100.0, 0.0]
          },
          {
            "type": "LineString",
            "coordinates": [
                [101.0, 0.0], [102.0, 1.0]
            ]
          }
      ]
   },
   "properties": {
       "prop0": "value0",
       "prop1": "value1"
   }
}

FeatureCollection
Feature集合

{
   "type": "FeatureCollection",
   "features": [
       {
           "type": "Feature",
           "id": "id0",
           "geometry": {
               "type": "LineString",
               "coordinates": [
                   [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
               ]
           },
           "properties": {
               "prop0": "value0",
               "prop1": "value1"
           }
       },
       {
           "type": "Feature",
           "id": "id1",
           "geometry": {
               "type": "Polygon",
               "coordinates": [
                   [
                       [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]
                   ]
               ]
           },
           "properties": {
               "prop0": "value0",
               "prop1": "value1"
           }
       }
   ]
}

crs
坐标参考规则:地球坐标,火星坐标

"crs": {
  "type": "EPSG",
  "properties": { 
     "code": 4326,
     "coordinate_order": [1, 0]
  }
}

注意:要使用GeoJSON,就必须抛开之前的靠大量DOM渲染思想,这在理解上会成为绊脚石,我之前就困扰了很久

GeoJSON在线生成工具

http://geojson.io

A Swift Developer’s React Native Experience

$
0
0

A Swift Developer’s React Native Experience

I began this Swift blog almost three years ago when I was a Swift-only mobile developer looking to become a full time iOS developer. I haven’t blogged for a long time here. Let’s just say…things are different now. 😁

I now write 99% JavaScript in React Native. 🤭

Here’s how I got there. And why I ❤ it.

People Are Talking About React Native

React Native over the past month has had quite the rollercoaster ride. It started when this post appeared on Twitter:

It was quickly deemed to be an incorrect statement. Sophie Alpert, an Engineering Manager on React at Facebook, wrote a post about how React Native has a bright future and is being reworked under the hood to be even better. A few days later, another dip as Airbnb announced that it was going to stop using React NativeAsh Furrow, an engineer at Artsy working in React Native who previously worked in native iOS, wrote about The Case for React Native and Airbnb and React Native Expectations, which offered some great pro-React Native perspectives.

React Native at Skip

I’ve been working at SkipTheDishes in Winnipeg since March 2016 on the iOS team. When I started at Skip, the iOS and Android teams were programming purely in native with Swift and Java respectively. Late last summer in 2017, it was decided by the Senior mobile devs that we wanted to see how rewriting the app that our food couriers use in React Native would work. So the iOS and Android teams merged and together we all began learning JavaScript and React Native.

I’ll be honest–initially I was discouraged by the decision, and I struggled a lotwith comprehending JavaScript and React for the first month or two so. It’s so completely different than creating apps natively. Swift and JS are pretty polar opposites, but JavaScript combined with a type system like flow or TypeScripttakes much of the pain away from working with plain JavaScript. Another struggle for me was that I’m a highly visual person so doing UI layout in JSXmarkup using Flexbox rather than Xcode’s Interface Builder was really hard to adapt to at first (now I love it, though, and I can build pretty much anything! 😄).

Overall, I’ve really enjoyed learning React Native and everything that comes along with it. I’m glad I didn’t give up on it. I’ve been working exclusively with React Native at Skip for about a year now, and I actually prefer it to working natively on iOS 😱.

React Nativifying BB Links

My personal iOS app, BB Links, was written in Swift and launched while I was interviewing to work at SkipTheDishes back at the beginning of 2016. It’s now on version 5 after many, many improvements and redesigns. What I’ve learned at Skip has improved my software development skills in every way possible. My iOS app now has over 90K downloads and 23K monthly active users—I’m proud of how much it helps Beachbody Coaches run their home businesses!

Beachbody Coaches with Android devices have continuously asked me for an Android version of BB Links. I had only taught myself how to write apps for iOS in Swift, so writing an Android app in Java would be a completely different beast—and I wasn’t particularly keen on learning Android development from scratch in my evenings/weekends. So my answer to them was always “Sorry, but there won’t be an Android version of BB Links since I only know how to make iOS apps.”

At Skip, as I became more and more experienced with and confident using JS and React Native, I began pondering whether I had the ability to make a version of BB Links in React Native; It would allow me to make an Android version of BB Links without the need to learn native Android development. I knew it would be a challenge, but figured I’d give it a shot.

I made a quick MVP of my app in React Native and kept pushing myself piece by piece until I was sure building the full blown app was definitely something I was capable of. I bought a used Android device on Ebay, and went to work.

It wasn’t easy—there were many frustrations along the way—but the finished app has a 100% custom UI that matches the native iOS app, and has 95% of the same functionality. I decided to make the React Native version Android only, keeping the iOS app native in Swift as a way for me to have a project in Swift that I can continue to work on since my day job at Skip is all React Native now.

BB Links iOS vs Android React Native

This past week I published the completed Android app on Google Play. I’m proud of how it turned out—it functions great, looks like the iOS app, with some paper qualities that fit more on Android, and I’ve become an even better React Native developer while creating it. Having to do every single part of an app from start to finish makes you learn so much more than when you only work on pieces of an app.

Frameworks Used in BB Links React Native

The app uses some great React/React Native frameworks:

5 Things I Love About React Native

Here’s a list of five things I love about React Native overall:

  1. State management with Redux combined with Re-select is brilliant. Redux ensures unidirectional logic flow, which reduces bugs and makes for highly predictable reactive components. Combined with Reselect allows for memoization of logic to eliminate wasteful recalculations, improving performance.
  2. Reloading UI takes seconds with things like Hot Reloading. Change a colour, margin, text, etc. and you can see it updated in the simulator right away. This saves so. much. time.
  3. Creating React Components with Flexbox makes it so easy to make pretty much anything. It takes a while to learn, but once you do, it’s very flexible and intuitive.
  4. Once you learn React Native, you can create websites in React, the original version for web, with needing to learn only a handful of new things. At Skip, I’m now doing some web development in React as well, working on our Courier web portal redesign.
  5. Testing with Jest is great. Once you figure out the mocking part, testing UI, global state, and selector logic is quite easy. Using Enzyme (created by Airbnb), you can take snapshots of your UI with different properties applied to test how it renders and ensure it doesn’t unexpectedly change.

5 Things I Don’t Love About React Native

React Native isn’t perfect. Here are some things that need improvement.

  1. Getting an app started from scratch is complicated. There are things like Create React Native App which help, but if you need any frameworks with native code, which most apps will likely need, setup is much less straightforward.
  2. Needing to write native code that’s bridged to JS is a challenge. As Sophie wrote about in the article linked at the start of this post, Facebook is working to make this easier. Right now, it’s not fun. Also, the fact that a Swift iOS developer would now need to still learn some Android with Java to write the Android native code for the feature complicates things greatly. Now you need to know three languages to do a feature on your own.
  3. Plain JavaScript is too scary for the Swift/Java dev. Once you work with a type-safe language, moving to one that has zero type safety feel like you’re walking on thin ice. Using Flow and TypeScript help greatly with that. Flow is added via a framework, while TypeScript is a subscript of JavaScript and requires a bit more work to use (but greatly worth it in my opinion). The fact that there are two type systems used in the React ecosystem creates some fragmentation and incomplete typings that I wish was better.
  4. There is no official navigation library for React Native. You need to choose one of the externally maintained frameworks; either React Navigation, which is 100% JavaScript and thus very flexible yet has some performance issues, or React Native Navigation, which uses platform native navigation and thus has better performance, but weaker flexibility.
  5. React Native performance on Android isn’t as smooth as iOS. This page in the documentation has some info on how to improve performance of React Native overall.

What’s Next?

At Skip I now get to mentor new React/React Native developers who go through our Incubator program, as well as those on the Courier team who are learning the ropes. I love helping people learn about React and React Native, and I always learn something myself at the same time. Seeing them create things and be proud when they get it is awesome! ❤

I’m also excited to work next on adding the remaining 5% functionality that I held back on for the Android app’s initial launch. It’s the more advanced stuff like in-app purchases for removing ads & tipping, and adding all 100+ themes like the iOS app has (I finished this, but it requires tipping to be released).

Overall, learning React Native has been great. React is an incredible skill I’ve been fortunate to have been able to learn in-depth working at Skip (we’re hiring Senior React developers, by the way). I know it has a bright future. And creating a React Native version of my personal application has been a fantastic experience filled with excitement, amazement that I could do it, and of course—frustration; but you can’t grow if you don’t fail and struggle. Taking the easy way out never has been much of an option for me in life, anyway.


不理解政治,我们就难以真正理解命运

$
0
0

不理解政治,我们就难以真正理解命运

学术与社会

作者介绍:熊易寒,1980年生,湖南衡阳人,复旦大学国际关系与公共事务学院副教授。主要研究兴趣为政治社会学和比较政治学。本文转载自《学术与社会》,原题:学术民工心灵史

一、人生的岔路口

1999年9月,某个阳光灿烂的日子,我乘坐姑父的小车,进入了我的大学。差不多同一时间,以两分之差落榜的同桌兄弟搭上了南下深圳的火车,在那里开始了他的打工生涯。那是一个平凡的日子,以至于我忘掉了日期。
在多年以后,我才意识到,那是我人生的一个岔路口。在那一天,我和同桌兄弟一起告别了农村,不同的是,我办理了户口迁移手续,而他的户口还留在原地。
大学一年级的时候,我和同桌兄弟保持着密切联系。我跟他讲述大学里的逸闻趣事,丰富多彩的校园生活;他跟我诉说工厂劳动的酸甜苦辣,在那里,再没有人欣赏他漂亮的钢笔字,再没有人崇拜他丰富的历史知识,才华在忙碌的流水线上找不到位置。

尤其让他感到挫败的是,高中毕业的他不得不接受一个初中毕业生的管理。我们的生活大相径庭,唯一的共同点是我们都会抱怨食堂的糟糕伙食。

大约一年以后,随着他工作地点的频繁变动,随着我们共同话题的日益减少,我们渐渐失去了联系。

直到2009年的春节,我们在老家的街头不期而遇。他抱着一个襁褓中的孩子,他的妻子牵着一个背书包的小女孩。他们夫妇现在东莞打工,哺乳期的小儿子跟在身边,上学的女儿交由老家的父母照看。

我们激动地寒暄着,多数时候都是我在发问,而他最关心的问题是我一个月赚多少钱,穷追不舍,让我不知所措。临别握手的时候,我才发现他的右手失去了两根手指!我猛然想起,在多年前通电话的时候,他曾经告诉我,一个工友不小心轧断了手指,这让他忧心忡忡:有一天我的手指会不会也被机器轧断?

他留给我一个手机号码,几天后我打过去却是空号。在那一天,我忍不住热泪盈眶,我想起十年前的九月,从那时起,我们便分道扬镳了,一个向左,一个向右,只是当时我们没有意识到而已。十年以后,我成为一名大学教师、一名政治学者,而他和他的孩子则成为我的研究对象——农民工及其子女。命运让我们看起来如此不同,而我知道,我们曾经多么地相似。

二、命定的博士论文

现在想起来,我的博士论文以农民工子女的身份认同与政治社会化为主题,似乎是命中注定的。2007年的春节联欢晚会,一个叫做《心里话》的诗朗诵,在一瞬间击倒了我。

要问我是谁

过去我总羞于回答

因为我怕

我怕城里的孩子笑话

他们的爸爸妈妈

送他们上学

不是开着本田

就是开着捷达

而我

坐的三轮大板车

甚至没有装马达……

孩子们的声音在我的脑海里久久萦绕,挥之不去。三个月后,我终于下定决心,放弃已经执行了一年的博士论文计划,重新选题,写这样一群“城市化的孩子”。当时,我和身边的朋友一样,无法理解自己为什么会那么决绝,那么冒险。直到写博士论文后记的时候,我才逐渐理解自己的选择。

倾听和叙述他们的故事,其实也是在体验我自己的生命。我的命运曾经与他们如此接近:我出生在一个亦工亦农的家庭,父亲是国企职工,母亲在家务农,而我自幼随外公外婆居住在县城边上;在农村念完小学后,我转入质量较好的城镇中学寄读。

为了让每学期一百元的寄读费有所减免,外婆不得不托教育局的亲戚帮忙,然后拿着领导的条子去敲开校长的办公室,这曾经深深刺痛我的心灵;我这个农村小学的尖子生、班长,在那里成绩一落千丈,上课犹如梦游,直到多年以后我依然不明白,为什么自己会突然间变得懵懂;

但我清楚地知道,作为一个农村孩子,我没有成为农民工的一员,纯属偶然。念高中那年,母亲携弟弟妹妹进城,一家五口蜗居在父亲厂里的单身宿舍,母亲在厂里做临时工补贴家用,现在想起来,原来自己也是农民工子女!这或许可以解释:为什么在多年以后,我会选择这样一个博士论文题目。

我不只是在书写他们,我也是在寻找自己。一个从中部农村走进大上海的青年,虽然只是一介穷书生,每月拿着微薄的津贴,不得不四处兼课以求温饱,为什么却会与这些孩子及其父辈有着完全不同的生命体验?这就是阶级政治与身份政治的奥秘。不管我与底层有多么亲近,我还是逐渐地脱离了这个阶级。

我走上了一条通往城市中产阶级的康庄大道(尽管只是“慢车道”),而通过博士论文的研究,我试图回到那个决定我命运的岔路口,去看看,如果我走的是另外一条道路,我的人生将会怎样。

三、城市化的孩子

当我把新出版的博士论文《城市化的孩子:农民工子女的身份生产与政治社会化》送给一位朋友时,她脱口而出:“城市化的孩子?应该是城市化的私生子吧?”这句犀利的玩笑话让我在错愕之余倍感贴切。

我之所以将进城农民工子女称为“城市化的孩子”,是因为:首先,他们都是在当代中国高歌猛进的城市化浪潮中出生和成长的,如此多的“放牛娃”涌入城市在中国是史无前例的;

其次,他们自身也在经历一个城市化的过程,乡土性逐渐地从他们的心性中剥离,与此同时城市以自己特定的方式塑造他们心智、观念、气质和认同,李强称之为“日常生活的城市化”;最后,他们所经历的痛苦、彷徨、迷失是由城市化——更准确地说,是经济上吸纳、政治上排斥的“半城市化”——带来的,最终也必须通过城市化来得到解决。

要研究这样一个群体,就必须把他们放到城市化的时间脉络与城市的空间格局当中来思考,而不是把他们悬置在一个空洞的、无差别的、没有质感的时空之中。

“城市化的私生子”这个说法虽然刻薄,却也道出了部分的真相。一方面,我们的城市化离不开农民工及其子女,他们不仅为中国制造提供了强大的价格优势,也是城市化率中的光鲜亮丽的数字;

另一方面,他们却存在于一个半合法的灰色空间里,仿佛私生子一般见不得光,他们不是官方承认的移民或市民,常常被视为挤占城市公共资源的“搭便车者”,甚或潜在的犯罪者和不稳定因素,就如同私生子构成家产和家庭团结的威胁一样。

这一群体同时兼具三个特征:第一,跨越城乡边界,城乡二元结构深深嵌入其心智结构和生活历程当中;第二,生活在城市,但缺乏地方性公民身份 / 市民资格;第三,绝大多数生活在城市底层。

在他们身上,地域政治、身份政治与阶级政治交汇在一起。城乡对立、身份政治与阶级政治三者相混合,会产生什么样的“化学反应”?这样一个群体对于当代中国政治而言,意味着什么?

而其中至关重要的因素又在于:其一,农民工子女如何定位其自身(我是谁),即身份认同的问题;其二,农民工子女在与政治系统的互动中,形成了什么样的政治倾向,他们的独特经历将会造就什么样的政治心理和政治人格?也即政治社会化的问题。

我的博士论文试图解决这样一系列问题:首先,在政治社会化的过程中,农民工子女的身份认同是通过什么方式形成的?不同的政治社会化媒介在其中发挥了什么作用?其次,农民工子女的政治态度与行为模式与他们的身份认同是什么关系?最后,如果农民工子女的身份认同会对他们政治观念与行为产生重大影响,那么,围绕身份差异而形成的政治态度与行为模式的分化究竟有多大?

农民工子女是主流意识形态的接受者,抑或形成了一套相对自主的底层文化?如此一来,看似后现代的“认同政治”就与政治学的传统议题——政治文化、政治社会化、阶级再生产——紧密地勾连在一起。

这些农民工子女背负着一个沉重的命运。一方面,他们是“回不去的一代”。他们大多生于城市,长于城市,没有务农经历,与乡土社会缺乏文化纽带和情感联系,他们不可能像父辈那样往返于城乡之间,而倾向于定居城市,不可能将农村的土地作为最后的退路或“社会保障”;

另一方面,虽然他们在事实上构成了第二代移民,然而在政策上却仍然被界定为流动人口。在城乡二元分割的体制下,农民工子女无法像城市的同龄人那样享有各种权利和福利。

长期以来,大多数农民工子女只能就读于校舍简陋、师资薄弱的农民工子弟学校,而这些学校不仅无法提供优质的教育,而且时刻面临城市教育行政部门的取缔。

现行的教育制度、高考制度以户籍制度为基础,导致农民工子女在初中毕业时进退失据,处于就学就业的两难境地:如果选择在上海升学,目前只能进入中专、技校或职高。

如果回到家乡念高中,一方面,农民工子女将不得不与父母分离,寄居于亲戚朋友家,不仅需要付出极大的经济成本,而且需要承受因分离而带来情感代价;

另一方面,家乡的教材和教学方式与上海存在较大差异,这些学生回去之后也存在学业不适应的问题。由于升学困难,大部分农民工子女在初中毕业之后选择直接打工,一部分人甚至成为街头混混。

四、学术马拉松

在选择了有趣或重要的问题之后,学术研究还需要你持续地投入你的热情、忍耐和想象力。

一个好的研究者,往往或多或少带有一定的“疯魔”,一旦发现新的资料或解释,会两眼发光,手舞足蹈,兴奋不已;一个好的研究者,往往有一颗赤子之心,研究带给他的快乐就如同玩具带给孩子的快乐,这是一种不含杂质的幸福;

一个好的研究者,未必是一个优秀的“短跑选手”,但一定是一个合格的“马拉松选手”;一个好的研究者,未必是人群中最聪明的那一个,但一定是一个充满想象力的人。

我记得有一回,我的同事唐世平教授在短短的十五分钟内,连续三次敲开了我办公室的门,满脸喜悦,因为他突然想通了一个问题,自己十年前建立的理论模型终于可以在经验上得到证明,所以他激动不已,跟我们两个年轻人兴奋地讨论自己的新发现。

这件事让我意识到,一个好的学者必定有一颗孩子的心,只有纯净的、充满好奇的心灵才能透视纷繁复杂的表象世界。

有了热情,我们才能持之以恒地投入精力;有了忍耐,我们才能克服研究中的障碍;有了想象力,我们才能发现与众不同的另类解释——在通衢大道和通幽曲径之间,我永远选择后者。

这三者缺一不可,没有人可以仅凭聪明和灵感就写出伟大的学术作品。从这个意义上讲,坚持是学者最大的美德,想象力是学者最大的财富。

在写作博士论文的时候,我曾经有8个月的时间写不出一个字,尽管做了大量的田野调查,在农民工子弟学校兼课,到农民工子女家里走访,到NGO做志愿者,却完全没有理论上的进展,当时距离预答辩仅仅只有两个月了,以至于我怀疑自己的选题是不是一个错误。

2008年7月,我对一个刚刚初中毕业的小女孩做了一个访谈。这个来自四川的15岁女孩杨洋梦想成为一个街舞高手,与世界各国的街舞高手同台竞技。

然而,现实与梦想之间总是存在距离,不久以后,杨洋将进入上海市某职业技术学校就读酒店管理专业,在她看来,这是无可选择的选择,因为一共只有三个专业可供农民工子女选择,除此之外就是数控车床和烹饪。

这三个专业与杨洋父辈们的职业——饭店服务员、工人、厨师——何其相近,可是,不管杨洋们有多么不情愿,还是有一只“看不见的手”把他们推上与父辈相似的生活轨道——杨洋的父母称之为“命运”,而学者们称之为“阶级再生产”。

杨洋还跟我讲述了她所在公办学校里老师与学生、农民工子女与城市同龄人之间的互动故事,这些看起来琐碎的故事就像火种一样,让我眼前一亮,醍醐灌顶,突然间以前收集的碎片化信息被串成一个整体,当天我一口气写了一万多字,套用一句广告词,“根本停不下来”。

接下来的两个月,我很顺利地完成了论文初稿写作。学术研究的美妙之处就在于,你不知道你的终点在哪里,你不是搭乘一列上海开往北京的火车,而是骑着一匹不羁的烈马,奔驰在广阔无垠的草原上,等待你的有危险,也有风景,有苦行僧的时刻,但也有意想不到的惊喜!

五、命运的共同体

长久以来,命运一直是文学家、哲学家和艺术家青睐的主题。在主流政治学的分析框架里,我们找不到命运二字。也许是“命运”这个词太抽象,太模糊,太过于情绪化,与社会科学所强调的精确性和价值中立格格不入。

人们以为命运就像手心的掌纹一样专属于自己,其实不然,我们的命运或多或少具有外部性:我们的好运气或许会给别人带来坏运气;反之亦然。正因为如此,政治共同体同时也是命运共同体,我们都在以这样或那样的方式分享 / 分担着彼此的命运。

不理解政治,我们就难以真正理解命运;不关注命运,政治学就缺乏震撼人心的力量。命运不是理所当然的,也不是由一个超验的神秘力量所决定的。

如果说个体的命运带有太多的偶然性和随机性,那么,群体的命运在很大程度上则是由权力结构设定的。国家、市场、社会与家庭是命运的主要塑造者:

第一,国家通过制度和政策来塑造我们的命运。国家不仅对有形的资源进行再分配,也在对无形的机会进行再分配。

从上山下乡到恢复高考、从“文革”到改革开放、从计划经济到市场化改革、从统招统分到教育产业化,国家行为对我们命运的影响何其巨大。国家对机会的再分配不是以个体为单位,而是以群体或社会类属(social category)为单位,譬如阶级敌人、流动人口、高收入群体。国家的再分配必须避免制度性歧视,即对特定社会群体的不公正待遇。

第二,市场包括物质市场和地位市场,前者通过产权、后者通过社会流动渠道为我们的行为提供激励,从而影响我们的命运。唐世平指出,在地位市场中,个人为社会地位而竞争。

和物质市场中的情况相比,地位市场中的竞争是纵向的、零和的,而且地位性商品的供应是内在有限的。简言之,我们通过物质市场获得财富,通过地位市场获得社会地位和外部承认。

第三,社会通过自由结社、社会运动、公共舆论、社会资本、关系网络来影响人们的命运。这对于一个社会中的弱势群体尤其重要,显而易见,劳工运动、民权运动、妇女运动在很大程度上改变了工人、黑人、女性的地位和命运。

第四,家庭是阶级再生产的一个重要环节,所谓“龙生龙凤生凤,老鼠生儿打地洞”,我们每个个体的人生轨迹都不可避免地受到家庭出身的影响。

以上四种力量与个人能动性的互动过程共同决定着我们的命运,每一种力量都不是绝对的。家庭是相对保守的力量,而市场、社会和国家都扮演了双重角色,既有保守的一面,也有变革的一面。

在一个健康的社会系统中,这四种力量应当是相对平衡的,在自由与平等、效率与公平、社会流动与阶级再生产之间找到一个均衡点,让社会成员各得其所,从而避免社会的过度僵化或无序。

而在农民工身上,我们却看到这四种力量惊人地一致:从国家的角度看,他们是“非市民”,无法在城市获得权利资格和公共服务;

从市场的角度看,他们被限制在次级劳动力市场,同工不同酬;从社会的角度看,农民工特别是新生代农民工缺乏社会支持网;

从家庭的角度看,他们的经济资本和文化资本都相对匮乏。这四种力量的叠加效应,使农民工面临比常人更大的重力加速度,重重地跌落在城市底层。

六、正义的成本

为什么我要讨论命运的问题,是因为它关乎正义。命运的政治学追问的是一个最基本的正义问题——如果我们的命运具有某种外部性,那么我们应该做些什么?

桑德尔在《正义——该如何做是好?》一书中讲述了一个叫欧麦拉的城市。这是一个拥有幸福感和公民荣誉感的城市,没有国王和奴隶,没有广告和股票交易,也没有原子弹。

人们过着幸福的生活,只有一个人例外。“在欧麦拉的一栋漂亮的公共建筑的地下室里,或者是在那些宽敞的私人住宅的地窖里,有一扇房间,它有一个锁着的门,没有窗户。”房间里坐着一个孩子,有些弱智,营养不良,并且被人们所忽视。

他在极度痛苦中勉强维生。所有的欧麦拉人都知道,他就在那里;他们都知道,他得待在那里。他们明白,整座城市的幸福和美好都是因为这个孩子所遭受的痛苦。因此,没有人来拯救他,他们不愿意牺牲自己的幸福。

在我看来,这个故事告诉我们:其一,命运是有外部性的。在一个社会当中,每个人或每个群体并不是孤立的,而是高度相关的,正如欧麦拉市民的幸福生活便是地下室孤儿痛苦的“溢出效应”;

其二,正义是需要成本的。如果不愿意分担正义的成本,那么对于正义的呼吁就是叶公好龙;

其三,我们不能用一个人(或多数人)的快乐去抵消另一个人(或少数人)的痛苦。

在一定程度上,农民工及其家庭的处境类似于欧麦拉的地下室孤儿。我们每个人都清楚地知道:没有他们的付出,城市的繁荣便不可想象;没有他们作为廉价劳动力,中国制造的比较优势便无从实现;没有他们,就没有所谓的“中国奇迹”。

“中国奇迹”不是魔法师的作品,毋宁说一场超大型魔术,人们只看到舞台上潇洒自如的魔术师,却看不到后台紧张忙碌的农民工。

改革开放三十年,就这样同时创造着财富与贫穷。我们只看到了日新月异的深圳速度,却没有看到因赶超进度而缺乏劳动保护的风钻工,他们因此而罹患尘肺病。

2009年,有两条关于农民工的新闻格外引人瞩目。一条是河南农民工张海超开胸验肺,证明自己得了“尘肺病”而非肺结核;另一条是中国农民工当选《时代周刊》年度人物亚军。

表面上看,这两则消息似乎风马牛不相及,在第一个故事里,农民工扮演了一个凄惨无助的受害者角色,张海超胸前的绷带是最有力也最无力的控诉;

而在后一个故事里,中国农民工则成了对抗金融危机的平民英雄,6张青春快乐的面孔,成了美国版“劳动光荣”的最佳注脚。

其实,这不过一枚硬币的两面。长期以来,农民工为中国奇迹和世界工厂承担了过多的代价,现在,他们开始为权利和正义而斗争,他们开始主动地提出权利诉求,上访、罢工、群体性事件层出不穷。

我们不能像欧麦拉的人们那样,对农民工的苦难和维权行动无动于衷。多少年来,我们一直在呼唤善待农民工,但这不能掩饰我们内心的害怕:

我们害怕开放户籍,会让他们涌入城市,挤占我们的工作岗位,增加我们的财政负担,危及我们的美好生活;我们害怕提高他们的工资待遇,会让资本外流到其他城市或者国家,阻碍我们的GDP增长。

所以,我们更愿意让农民工作为弱者接受我们的帮助,而不愿意让他们成为我们的一份子。而事实上,他们不是弱者,他们只是缺少基本的权利。

命运的外部性一方面使我们连为一体,另一方面也可以使我们的社会陷入分裂,既得利益蒙住了我们的眼睛,让我们对他者的苦难视而不见。不要将责任完全推给不公正的体制,也要反思我们自身,因为我们在一定程度上也是体制的受益者。

衡量一个社会的物质文明,要看它的穷人过得怎么样;衡量一个社会的精神文明,要看它的富人做得怎么样。如果一个社会的穷人尚且能够过上体面的生活,那么这一定是一个丰裕社会;如果一个社会的富人乐善好施、知书达礼,那么这一定是个礼仪之邦。

相反,不管一个社会的GDP总量如何之大,只要有一部分民众仍然衣食无着、低人一等,这个社会在本质上还是贫困的,只不过有一部分人先富起来而已;

不管一个社会的文化产业多么发达,高等教育如何普及,只要大多数富人过着醉生梦死、为富不仁的生活,那么,这个社会的道德水准必然是低下的。

从这个意义上讲,农民工及其子女的命运,是摆在我们全社会面前的一道考题,它考验着我们对于正义的看法和道德的底线。

Python Open Source of the Month (v.June 2018)

$
0
0

Python Open Source of the Month (v.June 2018)

For the past month, we ranked nearly 250 Python Open Source Projects to pick the Top 10.

We compared projects with new or major release during this period. Mybridge AI ranks projects based on a variety of factors to measure its quality for professionals.

  • Average number of Github stars in this edition: 764 ⭐
  • “Watch” Python Top 10 Open Source on Github and get email once a month.
  • Topics: Pyre Checker, Gif for CLI, Performance, Amazon, Douyin Bot, Datasheets, Zipapps, Spotify Playlist Generator, Utilities, Mimikatz

Open source projects can be useful for programmers. Hope you find an interesting project that inspires you.

Course of the month:

A) Beginners: The Modern Python 3 Bootcamp. [2,190 recommends, 4.7/5 stars]

B) Big Data: Apache Spark with Python — Big Data with PySpark and Spark.[3,414 recommends, 4.9/5 stars]

Rank 1

Pyre-check: Performant type-checking for python. [1637 stars on Github]. Courtesy of Facebook

……[Tweet: Launching Pyre]


Rank 2

Gif-for-cli: Takes in a GIF, short video, or a query to the Tenor GIF API and converts it to animated ASCII art. With Python 3 [1941 stars on Github]. Courtesy of google


Rank 3

Vibora: Fast, asynchronous and sexy Python web framework. [1438 stars on Github]. Courtesy of vibora.io


Rank 4

Amazon-scraper-python: Non-official client to get some info about products sold on Amazon [411 stars on Github]. Courtesy of Thibault Ducret


Rank 5

Douyin-Bot: Python bot for Tinder like app in Chinese [Use auto translator] [3977 stars on Github].


Rank 6

Datasheets: Read data from, write data to, and modify the formatting of Google Sheets in Python [254 stars on Github]. Courtesy of Squarespace Inc.arespace


Rank 7

Shiv: A command line utility for building fully self contained Python zipapps as outlined in PEP 441, but with all their dependencies included. [310 stars on Github]. Courtesy of LinkedIn


Rank 8

Spotify-playlist-generator: A scheduled Python script that scrapes new song titles and builds [116 stars on Github]. Courtesy of Miles Henrichs


Rank 9

Ubelt: A Python utility belt. Extra batteries included! [146 stars on Github]. Courtesy of Jon Crall


Rank 10

Pypykatz: Mimikatz implementation in pure Python [210 stars on Github]. Courtesy of SkelSec

That’s it for Python Top 10 Open Source of the Month. Visit our publication to find top posts for more programming skills.

Vue.js Open Source Projects of the Month (v.June 2018)

$
0
0

Vue.js Open Source Projects of the Month (v.June 2018)

For the past month, we ranked nearly 150 Vue.js Open Source Projects to pick the Top 10.

We compared projects with new or major release during this period. Mybridge AI ranks projects based on a variety of factors to measure its quality for professionals.

  • Average number of Github stars in this edition: 967⭐
  • “Watch” Vue.js Top 10 Open Source on Github and get email once a month.
  • Topics: StoreFront, Slideshow, Starter, Music WebApp, UI framework, Weex, Vue Native, Announcer, Static website, RxJS

Open source projects can be useful for programmers. Hope you find an interesting project that inspires you.

Course of the month:

A) Beginners: The Ultimate Vue JS 2 Developers Course. [998 recommends, 4.5/5 stars]

B) Firebase: Build Web Apps with Vue JS 2 & Firebase. [217 recommends, 4.8/5 stars]

Rank 1

Vue Storefront v1.0: PWA for eCommerce. [1512 stars on Github]. Courtesy of Divante LTD

……[ Launching Vue Storefront 1.0]


Rank 2

Eagle.js: A hackable slideshow framework built with Vue.js [1599 stars on Github]. Courtesy of Zulko


Rank 3

Vue-starter: A flexible, scalable, opinionated boilerplate for production-ready PWAs with focus on performance, development speed, and best practices [537 stars on Github]. Courtesy of Johannes Werner


Rank 4

Vue-music-webapp: A Music WebApp based on the Vue. [940 stars on Github]. Courtesy of Jin


Rank 5

Proppy: Functional props composition for UI components (supporting React.js & Vue.js) [623 stars on Github]. Courtesy of Fahad Ibnay Heylaal


Rank 6

Eros: A set of Vue code, native applications at both ends, maybe we can call us-native [Use auto translator] [899 stars on Github].


Rank 7

KitchenSink-Vue-Native: KitchenSink app for Vue Native (using NativeBase) [136 stars on Github]. Courtesy of GeekyAnts


Rank 8

Vue-announcer: A simple way with Vue to announce any useful information for screen readers. [57 stars on Github]. Courtesy of Vue A11Y


Rank 9

Peco: A static website generator for humans [143 stars on Github]. Courtesy of EGOJUMP


Rank 10

Vue-rx v6.0: RxJS integration for Vue.js. [1700 stars on Github]. Courtesy of Vue.js

…….[Tweet]

That’s it for Vue.js Top 10 Open Source of the Month. Visit our publication to find top posts for more programming skills.

react-native-maps

$
0
0

ITS WORKING

it repeated this failure to recreate successfull working react-native-maps

react – 16.3.1
react-native – 0.55.4
react-native-maps – 0.21.0

step 1
i created app like this
$react-native init tank1

step 2
I followed installation from
https://github.com/react-community/react-native-maps/blob/master/docs/installation.md

step 3
follow installation from
https://itnext.io/install-react-native-maps-with-gradle-3-on-android-44f91a70a395

step 4
in MainApplication.java
use without @Override

  protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
              new MainReactPackage(),
              new MapsPackage()
      );
  }

Note :
I had doub’t about synatx@import GoogleMaps; in AppDelegete.m but this too works fine

Nevermore on ethOS Linux

$
0
0

Nevermore on ethOS Linux

Brian Lee edited this page on Apr 15 · 5 revisions

A Quick and Dirty Guide to a ccminer with x16r (Raven Coin) support on ethos Linux by sponix

Tips/Donations to:

USD: https://www.paypal.me/HarleySportsman

ETH: 0x5044fcd3c57bd2a3640e43f79e4bff44c4ec4164

BTC: 32Lr7GRktRPpmnYDD53g5A85ypxeZNYf6i

ZEC: t1KBh9iAvBXDNVUgaNvuMKLTgbhtnyqJHgT

For the latest releases see: https://github.com/brian112358/nevermore-miner/releases/ or just:

wget -c "https://github.com/brian112358/nevermore-miner/releases/download/v0.2.2/nevermore-v0.2.2-linux-cuda9.zip"

Rough Install DOC listed for the ccminer branch this is based off is is found here: https://github.com/tpruvot/ccminer/blob/linux/INSTALL

So far the tools/libs we have roughly found required to make it function are listed in that INSTALL as follows:

install libcurl4-openssl-dev libssl-dev libjansson-dev automake autotools-dev build-essential

So we now do:

sudo apt-get-ubuntu update && sudo apt-get-ubuntu install libcurl4-openssl-dev libssl-dev libjansson-dev automake autotools-dev build-essential nvidia-cuda-dev

And out of those nvidia-cuda-dev is most likely the only true requirement, but we haven’t got that narrowed down for sure at this point, so we are just rolling with all of it….

Now you can just unzip the nevermore-v0.2.2-linux-cuda9.zip and go into the directory with cd nevermore-linux that it extracts to and test by running ./ccminer

Then you can just:

cd ~ && mv -v /opt/miners/ccminer/ccminer /opt/miners/ccminer/ccminer.OLD && cp -v /home/ethos/neverminer-linux/ccminer /opt/miners/ccminer/

At this point this ccminer should work as a drop in replacement for the older one, it should show miner, log, minestop, allow, and everything very similar to the prior ccminer.

To actually do Raven Coin x16r you just have to specify that in your ccminer-flags -a x16r line as outlined in their example..

I had an someone else test this ccminer, and they said it might have some reporting issues. But I’m unable to confirm because my test Rig only has AMD cards in it.

If given the time, I might image a USB 3 Stick for my Main Rig though with a couple GTX 960 cards in it to confirm..

Viewing all 764 articles
Browse latest View live