今天终于把答应节前调整的界面搞定了,其中有各种小疏忽,还四处打扰正在忙碌的小伙伴。

事实证明,现在这个基于数据对象定义既创建数据库又创建交互界面的架构,在信息维护类的应用系统范畴内,真是方便。

尤其是在清晰定义了对象之间的关联关系的情况下,可以直接进行关联定义,并且任意一处的信息变动,在关联的各处看来都相应变化,让人心情愉悦。

当然,还是有一些值得再完善的地方,比如查询条件目前只能基于对象的属性进行,尚无法基于被关联的信息来查主对象。

下一步,可以开始关注如何替换数据采集部分的python程序了。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 界面调整完毕

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

一早起来,开始按昨天晚上走通的方式,将新的数据接口替换成旧的接口格式,以便维持对端的程序兼容性。

昨天主要解决两个问题,一个Enum.map的使用,一个是map/struct如何实例化。关于Enum.map我一开始只是没有注意到,该函数实际上是直接将list做了返回的,后来偶然在某篇网文中注意到有个变量赋值是接收该函数的输出,才恍然大悟。

newlist = Enum.map(oldList, fn(x)-> … end)

另一个是map与struct的区别,实际上struct是基于map构造的,所以

%{}

表示一个空的map的情况下,struct是需要声明的

defmodule Astruct do

defstruct attr1: nil, attr2: “defaultValue”

end

则新的struct可以以下方式表示

%Astruct{}

这里面一开始我对于匿名函数如何写也很困惑(现在依然困惑),但搜索网文是某篇文章时看到一句话“函数总是以最后一行的输出作为返回值”,还是帮了我不少忙。


晚饭后外出散步,陪苏菲去SM广场转转。总是经过,却似乎就没进去转过,126路三站就到,幸好方便。先到一期,走进去才发现人头攒动,人气旺盛,显然是消费升级依然完成的局面。其实去年回来的时候,万达广场那边也就是类似情况。

从一期连接二期的廊桥走到“新生活广场”这侧,有个生鲜超市让我们很意外,榨果汁、煎三文鱼、烤牛排、滤咖啡……在货架间安排了一些可以现做现吃的摊位,这样的形式显然是我们以前逛超市没有想到的,算是年轻人生活时尚带来的新消费方式?

嗯,忘了拍照了,回头想办法补上。

到家的第一天。先支起小桌子把工作环境建起来,开始继续研究如何将mysql的timestamp类型在ecto无法直接转换成string的情况下,从query结果的map里取出来做处理。缺省情况下,ecto将naive_datetime类型转换成一个结构,如下:

{{y,m,d},{h,m,s,ms}}

然后ecto缺省的json封装接口poison无法正确处理这个结构,必须手工处理。一天功夫,终于摸索出方法:

shops = Enum.map(shops, fn x -> %{id: x[:A_ID], item_name: x[:P_ITEM_NAME], begin_time: transform(x[:P_BEGIN_TIME]), end_time: transform(x[:P_STOP_TIME])]}

defp transform({{y,m,d},_}) do
Integer.to_string(y) <> “-” <> Integer.to_string(m) <> “-” <> Integer.to_string(d)
end

函数式写起来还是很畅快的。

一早起来,开始整理以“gra”作为前缀的几个近期开发的项目。发现

  • graMeta
  • graForm
  • graGit
  • graFlow

这样一套“graX”组合起来,确实可以很灵活地处理掉一堆的MIS类问题。设计目标实际上初步是达成了,只不过后续还有一堆的优化问题。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: GraX

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

今天的时间也是安排得很紧。一早起来先去超市买菜,然后赶着去接上苏菲,再去拜会丈母娘。下午还得赶着回公司讨论需求。

原本倒是没这么赶,只是吃早饭的时候临时通知,董事长临时出现在公司了,同事约好下午可以讨论一下需求。

实际上也没有真正解决问题,依旧是敷于表面。我们实际上希望在业务层面深入讨论,但老师显然习惯思维是如何布局项目建设。

于是,回到家,我尽快补充了资源预算,以便可以在节前来得及交作业。

今天在现场忙了一天,我主要是给juyou重写接口程序,没人打扰,进展较快。

Chen则忙着部署。显示环境各种连不上,然后是各种缺软件,下午中午部署成功了,却没有将行方指定的数据库采集过来。

从行里回到宾馆,大概六点左右。顺着采集数据的事情,一路聊到我们为什么要循着元数据的思路做采集。

接着Chen抛出大问题:前天大家讨论问题的时候,一开始可以跟上,但后来大家开始进行数据模型设计的时候,发现思路跟不上,听不懂了,心理很挫败,感觉通过漫漫讨论就可以很快抽象出数据结构很厉害。

我一想,首先这不奇怪。这些人都是十几年的工作经验,何况大家之前还都不同程度地接触过jBPM,所以能快速给出process management的模型在我看来很正常。甚至我觉得太过于收到jBPM的影响反而不美。

给Chen分析了一下,提出需要“从业前的知识准备”的观点,简称“职前知识准备”。1、凭兴趣最好,否则也需要如何锻炼身体一般,机械性地广泛了解这个行业的相关历史或者了解都有哪些专业领域。当然也需要结合工作本身,否则一个行业大小领域几乎不胜枚举。2、不仅宽泛,也必须有坚持有某一两领域是专精的,否则缺乏有方向的牵引力和有穿透力的观察力。3、建立职前知识体系也是一个建立一个信息取舍规则的过程,看得多不是为了懂得多,而是为了更擅于识别。建立起自己的去芜存菁的规则体系。实际上,这个取舍体系有了,职前知识准备也基本就具备了。

知识体系本身是需要不断更新的。联系自身,职业经历中有过两次较大的变更。但两次都不彻底,如果说第一次还是无意识中不能深入的话,那么后一次则直接是有些主动回避了。

难怪职业道路有越走越窄的感觉。

 

等到交流完,想起来买火车票。结果app打开一看,居然近的车次都没票或者只有商务座了。很晕。

才明白过来:春运期间!

赶紧找了晚点,发现四点多还有一张。结果下单半天没法提交成功。只好使用app的抢票功能,结果瞬间抢到一张五点半的。

只好在南京南的偌大的候车厅里转了十来圈,走了1.2万步。一边转悠,一边想明白两个问题:数据结构的设计必须把前后依赖的结构关系与取值之间的依赖关系分开来,必须将信息的录入跟数据的表示分开来。

午夜时分,小舞发来半身裸妆,反复揣摩,不得要领。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 南京南站

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

今天的讨论收获还是有些惊喜的。

首先是总结了模式的核心4个步骤:发现、记录、归纳、发现。其次是从“新知识的获取”进一步提升为“知识使用新模式”。然后,初步聚焦为“找我不会的知识点”。

其中最为核心的概念是“知识使用新模式”,单丝这个词组还是不足以概括脑海中迷迷糊糊出现的那些场景。这些场景中有相当一部分是电影里钢铁侠的车库总管Jarvis所体现出来的那些特质。

  • 可视化能力非常突出。
  • 问答式知识交互。
  • 明显有个知识库。

结合自身需求,有几个潜在的突出述求:

  1. 启发式的大范围搜集
  2. 抽丝剥茧式的知识整理
  3. 知识点之间关联性的准确直观呈现

于是,模式上就要把传统的依靠书籍的记载,转变更为轻熟的电子化聚集方式。知识的学习从自己在实践中顺藤摸瓜,转变为快速切入场景应用需求的蛙跳空降方式。

所以,其实重点应该不是“寻找知识点”,而是“定位知识点”更为准确。

然后,要确实实现“定位”(这个中文的语义跟Locate 相比,在“查找……的地点”含义上还是差一些),你必须有一个大家能理解的map。从这点上说,蕾再次正确了。

佩服她的直觉!有了这个才是进一步如何locating的问题。于是衍生问题就出现了,为了能更准确地判断你所声明的知识点,你必须给出足够多的“参考定位点”。

所以,记录的本质是为了积累并找出足够多的参考点!而启发式的搜索则是为了尽可能准确地定位。其次才是如何整理呈现的问题。从工具的角度,引导大家进行梳理,也应该首先突出如何能更准确地捕获到某个具体个人的所谓“知识点”的参考定位点。

从这个角度,爬山虎已经具有了记录功能,需要在两个方向进一步加强,一方面是启发式搜索,一方面是在记录基础上的参考定位点校正(诸如“你想了解的知识是不是在这个领域范围内”这样的问题)。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 知识的Locate

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

找到几篇综述文章,汇总记录一下:

好文章还是太少。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: GenStage综述

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

今天证书又过期了,更新的时候出现以下提示:

$ sudo ./certbot-auto renew –pre-hook “service nginx stop” –post-hook “service nginx start”
Saving debug log to /var/log/letsencrypt/letsencrypt.log

——————————————————————————-
Processing /etc/letsencrypt/renewal/luke.jmeerkat.com.conf
——————————————————————————-
Cert is due for renewal, auto-renewing…
Plugins selected: Authenticator nginx, Installer None
Running pre-hook command: service nginx stop
Output from service:
Stopping nginx: [FAILED]

Renewing an existing certificate
Performing the following challenges:
tls-sni-01 challenge for luke.jmeerkat.com
nginx: [error] open() “/var/run/nginx.pid” failed (2: No such file or directory)
Cleaning up challenges
nginx: [error] open() “/var/run/nginx.pid” failed (2: No such file or directory)
Encountered exception during recovery
nginx restart failed:

Traceback (most recent call last):
File “/opt/eff.org/certbot/venv/local/lib/python2.7/site-packages/certbot/error_handler.py”, line 100, in _call_registered
self.funcs[-1]()
File “/opt/eff.org/certbot/venv/local/lib/python2.7/site-packages/certbot/auth_handler.py”, line 284, in _cleanup_challenges
self.auth.cleanup(achalls)
File “/opt/eff.org/certbot/venv/local/lib/python2.7/site-packages/certbot_nginx/configurator.py”, line 902, in cleanup
self.restart()
File “/opt/eff.org/certbot/venv/local/lib/python2.7/site-packages/certbot_nginx/configurator.py”, line 698, in restart
nginx_restart(self.conf(‘ctl’), self.nginx_conf)
File “/opt/eff.org/certbot/venv/local/lib/python2.7/site-packages/certbot_nginx/configurator.py”, line 936, in nginx_restart
“nginx restart failed:\n%s\n%s” % (out.read(), err.read()))
MisconfigurationError: nginx restart failed:

Attempting to renew cert (luke.jmeerkat.com) from /etc/letsencrypt/renewal/luke.jmeerkat.com.conf produced an unexpected error: nginx restart failed:

. Skipping.
All renewal attempts failed. The following certs could not be renewed:
/etc/letsencrypt/live/luke.jmeerkat.com/fullchain.pem (failure)

——————————————————————————-

All renewal attempts failed. The following certs could not be renewed:
/etc/letsencrypt/live/luke.jmeerkat.com/fullchain.pem (failure)
——————————————————————————-
Running post-hook command: service nginx start
1 renew failure(s), 0 parse failure(s)

这里查到这样的命令:

sudo fuser -k 80/tcp

执行后问题果然解决。又根据这篇文章中的建议,设置定时命令如下:

39 1,13 * * * root /home/ec2-user/certbot-auto renew –no-self-upgrade –debug

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: certbot-auto renew

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

Judea Pearl的最新论文:机器学习无法成为强AI基础,突破口在“因果革命”

反事实被放在层次结构的最顶层,是因为它们包含干预和联想的问题。如果我们有一个可以回答反事实问题的模型,我们也可以用它来回答关于干预和联想的问题。例如,如果把价格加倍会发生什么(干预型问题)可以通过提出一个反事实的问题来回答:价格是目前价值的两倍会发生什么?同样,当我们可以回答干预型问题,联想类问题也能得到回答。
相反,有了联想问题模型,并不能回答更上层的问题,比如我们不能对那些接受过药物治疗的受试者重新进行实验,看看他们没有吃药的话有会怎样的行为。因此,层次结构是有方向性的,顶层是最强大的层次。
反事实是科学思维的基石,法律和道德推理亦是。例如,在民事法庭,被告被认为是造成伤害的罪魁祸首。如果没有被告的行为,伤害很可能就不会发生。“如果没有”的计算意义要求比较现实世界和没有发生被告行为的另一个世界。

这里汇总了一些公开课的课程,摘录一下:

1. Andrew Ng 老师的 机器学习课程(Machine Learning)

机器学习入门首选课程,没有之一。这门课程从一开始诞生就备受瞩目,据说全世界有数百万人通过这门课程入门机器学习。课程的级别是入门级别的,对学习者的背景要求不高,Andrew Ng 老师讲解的又很通俗易懂,所以强烈推荐从这门课程开始走入机器学习。

这里有老版课程评论,非常值得参考推荐:Machine Learning

2. 台湾大学林轩田老师的 機器學習基石上 (Machine Learning Foundations)—Mathematical Foundations

如果有一定的基础或者学完了Andrew Ng老师的机器学习课程,这门机器学习基石上-数学基础可以作为进阶课程。林老师早期推出的两门机器学习课程口碑和难度均有:机器学习基石 和 机器学习技法,现在重组为上和下,非常值得期待

3. 台湾大学林轩田老师的 機器學習基石下 (Machine Learning Foundations)—Algorithmic Foundations

作为2的姊妹篇,这个机器学习基石下-算法基础 更注重机器学习算法相关知识

可参考早期的老版本课程评论:機器學習基石 (Machine Learning Foundations) 機器學習技法 (Machine Learning Techniques)

4. 华盛顿大学的 “机器学习专项课程(Machine Learning Specialization)

这个系列课程包含4门子课程,分别是 机器学习基础:案例研究 , 机器学习:回归 , 机器学习:分类, 机器学习:聚类与检索

4.1 Machine Learning Foundations: A Case Study Approach(机器学习基础: 案例研究)

你是否好奇数据可以告诉你什么?你是否想在关于机器学习促进商业的核心方式上有深层次的理解?你是否想能同专家们讨论关于回归,分类,深度学习以及推荐系统的一切?在这门课上,你将会通过一系列实际案例学习来获取实践经历。

4.2 Machine Learning: Regression(机器学习: 回归问题)

这门课程关注机器学习里面的一个基本问题: 回归(Regression), 也通过案例研究(预测房价)的方式进行回归问题的学习,最终通过Python实现相关的机器学习算法。

4.3 Machine Learning: Classification(机器学习:分类问题)

这门课程关注机器学习里面的另一个基本问题: 分类(Classification), 通过两个案例研究进行学习:情感分析和贷款违约预测,最终通过Python实现相关的算法(也可以选择其他语言,但是强烈推荐Python)。

4.4 Machine Learning: Clustering & Retrieval(机器学习:聚类和检索)

这门课程关注的是机器学习里面的另外两个基本问题:聚类和检索,同样通过案例研究进行学习:相似文档查询,一个非常具有实际应用价值的问题

5. 密歇根大学的 Applied Machine Learning in Python(在Python中应用机器学习)

Python机器学习应用课程,这门课程主要聚焦在通过Python应用机器学习,包括机器学习和统计学的区别,机器学习工具包scikit-learn的介绍,有监督学习和无监督学习,数据泛化问题(例如交叉验证和过拟合)等。这门课程同时属于”Python数据科学应用专项课程系列(Applied Data Science with Python Specialization)“。

6. 俄罗斯国立高等经济学院和Yandex联合推出的 高级机器学习专项课程系列(Advanced Machine Learning Specialization)

该系列授课语言为英语,包括深度学习,Kaggle数据科学竞赛,机器学习中的贝叶斯方法,强化学习,计算机视觉,自然语言处理等7门子课程,截止目前前3门课程已开,感兴趣的同学可以关注

6.3 Bayesian Methods for Machine Learning(面向机器学习的贝叶斯方法)

该课程关注机器学习中的贝叶斯方法,贝叶斯方法在很多领域都很有用,例如游戏开发和毒品发现。它们给很多机器学习算法赋予了“超能力”,例如处理缺失数据,从小数据集中提取大量有用的信息等。当贝叶斯方法被应用在深度学习中时,它可以让你将模型压缩100倍,并且自动帮你调参,节省你的时间和金钱。

7. 约翰霍普金斯大学的 Practical Machine Learning(机器学习实战)

这门课程从数据科学的角度来应用机器学习进修实战,课程将会介绍机器学习的基础概念譬如训练集,测试集,过拟合和错误率等,同时这门课程也会介绍机器学习的基本模型和算法,例如回归,分类,朴素贝叶斯,以及随机森林。这门课程最终会覆盖一个完整的机器学习实战周期,包括数据采集,特征生成,机器学习算法应用以及结果评估等。这门机器学习实践课程同时属于约翰霍普金斯大学的 数据科学专项课程(Data Science Specialization)系列

8. 卫斯理大学 Regression Modeling in Practice(回归模型实战)

这门课程关注的是数据分析以及机器学习领域的最重要的一个概念和工具:回归(模型)分析。这门课程使用SAS或者Python,从线性回归开始学习,到了解整个回归模型,以及应用回归模型进行数据分析

这门课程同时属于卫斯理大学的 数据分析与解读专项课程系列(Data Analysis and Interpretation Specialization)

9. 卫斯理大学的 Machine Learning for Data Analysis(面向数据分析的机器学习)

这门课程关注数据分析里的机器学习,机器学习的过程是一个开发、测试和应用预测算法来实现目标的过程,这门课程以 Regression Modeling in Practice(回归模型实战) 为基础,介绍机器学习中的有监督学习概念,同时从基础的分类算法到决策树以及聚类都会覆盖。通过完成这门课程,你将会学习如何应用、测试和解读机器学习算法用来解决实际问题。

这门课程同时属于卫斯理大学的 数据分析与解读专项课程系列(Data Analysis and Interpretation Specialization)

10. 加州大学圣地亚哥分校的 Machine Learning With Big Data(大数据机器学习)

这门课程关注大数据中的机器学习技术,将会介绍相关的机器学习算法和工具。通过这门课程,你可以学到:通过机器学习过程来设计和利用数据;将机器学习技术用于探索和准备数据来建模;识别机器学习问题的类型;通过广泛可用的开源工具来使用数据构建模型;在Spark中使用大规模机器学习算法分析大数据。

这门课程同时属于 加州大学圣地亚哥分校的大数据专项课程系列(Big Data Specialization)

11. 俄罗斯搜索巨头Yandex推出的 Big Data Applications: Machine Learning at Scale(大数据应用:大规模机器学习)

机器学习正在改变世界,通过这门课程,你将会学习到:识别实战中需要用机器学习算法解决的问题;通过Spark MLLib构建、调参、和应用线性模型;里面文本处理的方法;用决策树和Boost方法解决机器学习问题;构建自己的推荐系统。

这门课程同时属于Yandex推出的 面向数据工程师的大数据专项课程系列(Big Data for Data Engineers Specialization)

注:本文首发“课程图谱博客”:http://blog.coursegraph.com ,同步发布到这里。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 机器学习课程

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

今天两个实习生来谈课题的内容。

没啥惊喜,当然也没啥意外。孩子们态度认真,手却也没有想象的长。

下午的男生就稍微有点小失望,尽管我本来指望也不高,只是有些心存侥幸。

自己的表现呢,6分吧。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 实习生

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

今天算是一次全新体验。

又好几年不见的茹,来北京公干。总算有心情找我聊天。

从她这次来帮忙督导的孩子开始聊起。

然后就难得地相互介绍这些年的经历。

接着,似乎总是要进入忆苦思甜阶段,只不过这回其实更多地在剖析我的性格。

去新沸腾鱼乡吃饭,又聊到人在城市应该充分利用一座城市的资源,以及如何打坐。

有那么几个瞬间,仿佛坐在我对面的,依然是那个花样年华精神焕发的茹。

才知道,原来电影里的表现手法真不是想象,只是一种生理现象的如实描写。

嗯,这么多年来,我头一回真心意识到,曾经忽视的那片晴空万里,是如此阴差阳错没心没肺的辜负。

聊天末了,我说:你应该庆幸,鲜花没插在牛粪上。

后设认知Metacognition)或译为元认知,这个名词由Swartz及Perkins发明及定义,[1]即“认知的认知”或“知识的知识”。简言之,就是对自己的认知过程(包括:记忆感知计算联想等各项)的思考。

利用这种现象,我们可以用之于学习策略,让学生了解是一种个人控制及引导心智历程的现象。到自己的思想模式之同时,透过控制自己的思想模式,从而达至效果的学习方法。

后设认知可以分成两大类:

  • 显明的(explicit)
  • 隐藏的(implicit)

约翰·弗拉维尔John H. Flavell)被认为是“后设认知”理论的创立者,以及这个词语的“始创人”。根据他的理论,“后设认知”可以分为“后设认知知识”及“后设认知经验”或“后设认知规则”两部分:

  1. “后设认知知识”(Metacognitive knowledge)指在认知的过程(processes)里所获得的知识(acquired knowledge),亦即可用于控制认知过程的知识;
  2. “后设认知经验”或“后设认知规则”。

而有关“后设认知知识”,弗拉维尔又再细分作三个分类:

  1. 个人变数的知识(knowledge of person variables)、
  2. 工作变数的知识(knowledge of task variables)及
  3. 策略变数的知识(knowledge of strategy variables)

以上摘自维基百科。国内,似乎更普遍地称之为“元认知”。

知乎上这篇答案中,非常生动的例子说明了“后设认知”(我自己可能就会命名为“自我认知”)对于个人命运的重要性。

这种 “下定决心—开始学习—遇到难题—果断放弃” 的学习状态在很多初学者身上都有体现。初学者不是初次学习某项新知识的人,而是指那些不擅长学习的学习者。成熟的学习者能够一边学一边观察自己学的过程,这种观察帮助他们认识到自己的问题在哪里,避免“不懂装懂。与其说专家型的学习者天生比别人更有耐心,不如承认,他们在学习过程中,养成了自我观察和思考的习惯。

我就觉得,回想自己的行为方式,我的后设认知能力是相对很弱的,直接影响了我掌握某个领域中较为复杂信息的能效。

针对“后设认知知识”的部分,上面这篇知乎答案的总结可以跟维基中的文字对照看:

分类1 分类2 分类3
 维基  个人变数的知识  工作变数的知识  策略变数的知识
 知乎  学习者对于自己的认知  学习者对于学习内容的认识  学习者对于学习策略使用方法的认知
 元认知涉及内省  元认知知识(理解这个概念及概念相关的常识)  元认知意识(觉察到“我在思考”、“我在吃饭”、“我在**”……)  元认知监控(让自己时刻对自己的行为思维保持觉察)

知乎答案里接着强调:如果在学习成果已经别检验之后再来反思,元认知能力就属于不过关的。

元认知要求学习者提前了解自己的缺陷和不足,在学习过程中不断认识自己,及时查漏补缺。学习者拟定好了学习计划和方法,行动过程中,必须做到全神贯注,时刻监视自己的行为。

百度百科“元认知能力”

元认知能力的实质是对认知的认知,是个体对自己的认知加工过程的自我觉察、自我反省、自我评价与自我调节、它包括元认知知识、元认知体验和元认知监控三个成分。

另外,这篇网文也颇有些启发内容:

元认知技巧包含五个重要的方面,分别是筹划、选择、联系、调整和追踪。

好的学习者:(提前规划)学习新知识时,首先推理出必须做哪些事,然后指定一个计划来完成学习,适当地安排时间和资源。

好的学习者: 看、听、研究、分析,然后从杂乱无章的资料中筛选出关键要素,去芜存菁。

好的学习者: 不断寻找新旧知识之间的联系。企图理解新内容并将其与已知内容联系起来。能够自我创造有意义的推理和记忆方法。

好的学习者:接受了新信息并进行练习后,他或她会进一步分析和研究新知识。调整推断策略并试图准确地理解新信息。抛弃错误的假设和过去有用但现在不需要的学习方式。

好的学习者:在学习中,用更为成功的策略代替低效或存在不足的策略。应用新知识时,对概念化的模型进行改进,找出新知识应用的局限和可行范围。坚持理解和运用新知识并随时做出调整。

综合以上,上述表格可以进一步归纳成:

分类1 分类2 分类3
 维基  个人变数的知识  工作变数的知识  策略变数的知识
 知乎  学习者对于自己的认知  学习者对于学习内容的认识  学习者对于学习策略使用方法的认知
 元认知涉及内省  元认知知识(理解这个概念及概念相关的常识)  元认知意识(觉察到“我在思考”、“我在吃饭”、“我在**”……)  元认知监控(让自己时刻对自己的行为思维保持觉察)
 元认知能力 自我觉察
元认知知识
 自我反省
元认知体验
 自我评价与自我调节
元认知监控

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 时刻自省

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

其实还是得逼自己每天写点什么。

今天一早醒来就已经八点。而且颇有睡意。往常一定要给自己找借口接着再睡一会儿。今天想到原来计划要一早开会讨论本周的工作如何展开,所以想了想,八点半左右应该还可以找到车位,就匆匆起床出门。

尽管已经停满了车,但还是找到车位。吃过早餐,尽管比我预期晚了半小时,不过还是按计划进行了如何开展具体工作的讨论。对每天完成内容做出了微调。但今天的问题在于:下班前没有考察今天的进展。

总体来说,只要不做延误起床的活动,基本上还是可以尽早出门的。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 尽早出门

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

一早从麦当劳出来,经过假日旅店楼下那个洗衣房的后门,正好有辆五菱在装货还是卸货,从一旁匆匆经过。

突然想起来97年那会儿刚回厦门,在香港的同学给我介绍了其老板在北京有个洗衣房缺管理人员,觉得是个不错的机会。当时也没多想,就想接触一下。但好不容易盼到我回厦门的父亲非常不乐意,正好那是也赋闲在家,跟着我到了北京。

后来由于各种原因,这事儿没成。今天想起来,对于当时父亲为了省钱直接睡在洗衣房心里挺膈应。不过,却意外地想,也许当初父亲没有拦着我,我反而可能由于洗衣房这事儿心灰意冷,就此失去了外出漂泊的勇气,留在厦门也说不定。

现在想想,那个时候的我跟十七八岁真是没啥区别。

最近尝试使用phoenix实现restful接口,后台数据库是mysql,用ecto对接。

ecto使用web/models中的模型作为模板,遇到的主要问题是如何对接已经存在的mysql表。目前找到最针对性的一篇文章是“Elixir Example Using Ecto for An Existing MySQL Database”,但涉及问题也浅尝即止。

对于初接触ecto的人来说,如何映射字段类型是一个大麻烦,尤其是哪些数据库自有的类型,比如mysql的timestamp、longtext、mediumblob、JSON之类的数据类型,以及字段属性“是否为空”、“是否关键字”、“是否外键”等等之类。

鉴于这个部分需要查看大量资料(尝试了一会儿发现没有直接针对性文档),放弃使用native建表,而是利用ecto来建表。过程倒是简单:先创建migration文件、针对表结构创建对应的model、执行mix ecto.migrate建表,再利用ecto在iex中插入必要的测试数据。

mix ecto.gen.migration create_tablename

(编辑priv/repo/migrations中的相应“*create_tablename.exs”文件)

(编辑web/models中的相应model.ex)

mix ecto.migrate

简单的语法在官网文档中说得还是比较清楚:hexdocs.pm。给个简单的例子:

#priv/repo/migrations/20171220123631_create_user.exs
defmodule ProjTest.Repo.Migrations.CreateUser do
use Ecto.Migration
def change do
create table(:users) do
add :name, :string
add :password, :string
add :email, :string
add :stooge, :string
timestamps()
end
create unique_index(:users, [:email])
end
end

其中timestamps()会使得ecto相应在数据库表中建立两个datetime类型的字段“inserted_at”和“updated_at”,所以实际上并不是mysql的timestamp。

模型:

# web/models/user.ex
defmodule ProjTest.User do
use ProjTest.Web, :model
schema "users" do
field :name, :string
field :email, :string
field :password, :string
field :stooge, :string
end
end

以上,会自动生成id字段作为关键字。如果不使用缺省方式,需要在@primary_key属性中声明(参加官方文档)。关键字有两种类型::id:binary_id,后者相当于对象键值。而timestamp()方法可以传入opt,也可以在属性@timestamps_opts中提前定义。这篇文章《解决UTC时间戳和本地时间8小时时差的问题》给出了时间戳使用的一些详细信息。

这篇文章《Ecto的建模与查询教程》则详细介绍了外键的使用,提及inner join或者preload加载内容。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 学习使用ecto

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

原文在这里,或者这里。我一开始以为对“圈养”和“放养”的新视角剖析比较,却没有想到结合到社会经济环境背景。但,却正好跟“社会自组织”有了关联性,可以拿来进一步分析。论文里给出了两个维度:社会福利、贫富分化。实际上,后者还是前者的函数。所以,实际上是说福利制度合理的情况下,社会相对均富,有利于个性发展。从这个角度,“让一部分人先富起来”的说法,似乎就变得值得商榷了。

自古以来,养孩子就有截然不同的风格。

一个极端,是事事干涉、严苛的虎妈型教育方式;另一个极端,则是爱咋咋地、除了供养吃喝爱管不管的佛系父母。大多数正常父母可能介于两者之间,软硬兼施,教你做人。

哪种方式更好呢?

三种方式各有优缺点。虎妈型父母完全掌控了孩子的选择,保证了孩子不会走太大的弯路,但也牺牲了孩子的独立性,杜绝了孩子探索自己天赋的可能。循循善诱型父母手段稍微温柔一点,试图培养孩子的偏好,树立正确的三观,但也意味着大量的精力付出。而佛系父母则省心省力,完全按照孩子的天性任其发展,听天由命。

哪种方式最好,不单取决于你爸妈有多爱你,很大程度上还取决于社会环境。其中,对孩子独立性的回报对教育投资的回报两个特性是决定性因素。

在传统社会,职业流动性差,子承父业是主流。没有必要花精力和时间对孩子的天赋进行探索,因为探索完了你也干不了你想干的职业,所以整个社会对孩子独立性的回报很低,而听爸爸的话的回报很高。其结果就是,虎妈型父母教育占据主导。

在现代社会,劳动分工的细化和发展催生了很多新的岗位,技术发展使得老一辈身上的技能价值下降,这就大大提升了孩子独立性的回报。只有给予孩子足够的独立性,才有可能让孩子更好发现其天赋所在,找到与其天赋相匹配的职业,取得更好的回报。这就促使了传统虎妈型教育的衰落。

但是明明已经到了现代社会,为什么你妈还要逼你学习呢?这跟社会对教育投资的回报有关。

在一个贫富分化较大,公共福利较差的社会,早期教育的投入直接决定了之后的经济地位,教育的回报很高。但是孩子的天性大多数是爱玩的,看不到教育投资的意义。这时候父母就需要督促孩子学习,灌输勤奋努力的观念,甚至还有父母选择直接剥夺孩子玩耍的权利。因此,这种社会环境下,兼具循循善诱型特色和一定程度的虎妈型特色的教育方式相比于佛系教育有优势。

而在一个贫富分化很小,公共福利很好的社会,不管你学历高低,你日后的经济状况差不了多少;不管你年轻时怎么折腾探索自己的天性,你也不至于坏到哪里去,反而更有可能成为大才。因此在这样的社会,佛系教育方式就有了优势。

这一理论可以很好的解释为什么发达国家从1960到1970年代开始,佛系教育方式取代虎妈型教育方式,成为主流。1960年代到1970年代,发达国家经济分化程度处于历史地点,几乎没有失业。促使孩子努力学习的回报反而不如保证孩子的自由独立的价值来得大。而自1980年代以来,美国社会不平等开始加剧,教育回报上升,结合了虎妈和循循善诱特点的直升机父母教育方式开始流行,父母在教育照顾孩子上的时间开始上升,对体罚孩子的接受度也在1990年代以来出现了回升的势头。

在不同国家横向对比,我们也会发现,佛系教育方式的比例与不平等程度和教育回报率负相关,另两种与不平等程度和教育回报率正相关:

而佛系教育方式比例与税率累进程度和社会福利支出则是正相关,另外两种是负相关。

因此,在瑞典、挪威这样的高度平等的福利国家,佛系教育是主流。而在美国、中国这样的贫富分化严重的社会,爸妈都爱逼你学习。

原文文献:

Doepke, Matthias, and Fabrizio Zilibotti. “Parenting with style: Altruism and paternalism in intergenerational preference transmission.” Econometrica 85.5 (2017): 1331-1371.

参考文章:http://www.cnblogs.com/hubing/p/6058932.html。

首先,可以使用

systemctl status firewalld

或者

systemctl status firewalld.service

查看当前防火墙服务的状态。

可以使用下列命令之一来查看当前开放了哪些服务:

firewall-cmd –list-services

firewall-cmd –zone=public –list-ports

然后在/usr/lib/firewalld/services/下通过拷贝新增一个配置,其中文件名称本身就是服务名。

然后增加这个服务:

firewall-cmd –permanent –add-service=myservice

然后重启服务:

systemctl restart firewalld.service

首先学习了一下如何将确实postgres数据库切换到mysql,因为我的目标工作环境使用mysql。参考了这篇文章和这篇官网文章。事实说明切换非常容易。总共修改两个文件:先修改mix.ex,然后更新依赖。再修改lib/dev.ex中的数据库信息。

mix中有两处(一处在application、一处在deps)要修改的,都是将postgrex替换为mariaex。

dev.ex中重点是修改adapter信息:

adapter: Ecto.Adapters.MySQL

最好是将config/test.exs and config/prod.secret.exs都一起改掉。

然后,重建依赖,并创建数据库。

$ mix do deps.get, compile

$ mix ecto.create

接着开始尝试用phoenix。第一次接触,看到route.ex的时候,不得不说我联想到express。不过,毕竟phoenix还是依赖了node。

主要参考这篇文章,真心写的不错。

先新建一个phoenix项目:

mix phoenix.new example_proj

然后在web/router.ex中添加一个路由,比如:/users

然后在web/controllers中添加一个控制器,比如:users_controller.ex

接着在web/models中建一个模型,比如:user.ex

此时就可以利用mix和ecto的能力在mysql中映射表了,不过建库语句还是得自己写,但好在语法还是elixir式的。先创建建表的脚本:

mix ecto.gen.migration create_user

然后修改生成的脚本文件,在其中填写建表声明。再真正执行建表操作:

mix ecto.migrate

然后ecto可以在iex中执行,这个没想到。这样就可以使用elixir语法对数据库进行访问了。比如在数据库中插入数据:

iex(1)> alias ApiExample.Repo
iex(2)> alias ApiExample.User
iex(3)> Repo.insert(%User{name: "Joe", email: "joe@domain.com", password: "secret", stooge: "moe"})
iex(4)> Repo.insert(%User{name: "Jane", email: "jane@domain.com", password: "donttell", stooge: "larry"})

数据库查询是这样的:

iex(5)> Repo.all(User)
iex(6)> Repo.get(User, 2)

然后果然出现了文章中提及的错误:

unable to encode value: {nil, “users”}

照着写了encoder,果然就可以正常访问接口了。

顺带说一句:erlang家族的热更新功能还是非常impressive的。

主要参考这份文档,以及这篇。另外,这里有一些更细节的说明,比如esl-erlang与erlang的区别。

sudo yum install epel-release
sudo yum -y update && sudo yum -y upgrade
sudo yum install gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel autoconf java-1.8.0-openjdk-devel git
sudo yum install wxBase.x86_64
sudo yum -y install wget
wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
sudo rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
sudo yum install erlang

(这里很漫长)

cd /usr/bin
sudo mkdir elixir
cd /usr/bin/elixir
sudo wget https://github.com/elixir-lang/elixir/releases/download/v1.2.5/Precompiled.zip

(这里v1.2.5已经不是最新,我下了1.5.2)

sudo yum install unzip
sudo unzip Precompiled.zip
/usr/bin/elixir/bin/elixir -v

(编辑/etc/profile)
export PATH="$PATH:/usr/bin/elixir/bin:/usr/bin/node-v6.1.0-linux-x64/bin"
source /etc/profile
elixir -v

结果是这样的:

[source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:10] [hipe] [kernel-poll:false]

{“init terminating in do_boot”,{{badmatch,error},[{‘Elixir.System’,build,0,[{file,”lib/system.ex”},{line,177}]},{‘Elixir.System’,build_info,0,[{file,”lib/system.ex”},{line,169}]},{‘Elixir.Kernel.CLI’,parse_shared,2,[{file,”lib/kernel/cli.ex”},{line,153}]},{‘Elixir.Kernel.CLI’,’shared_option?’,3,[{file,”lib/kernel/cli.ex”},{line,113}]},{‘Elixir.Kernel.CLI’,main,1,[{file,”lib/kernel/cli.ex”},{line,14}]},{init,start_em,1,[]},{init,do_boot,3,[]}]}}
init terminating in do_boot ({{badmatch,error},[{Elixir.System,build,0,[{_},{_}]},{Elixir.System,build_info,0,[{_},{_}]},{Elixir.Kernel.CLI,parse_shared,2,[{_},{_}]},{Elixir.Kernel.CLI,shared_option?,

Crash dump is being written to: erl_crash.dump…done

于是再找了这篇,重新安装elixir。结果安装的是1.6.0-dev的最新版。

make clean test

执行的时候看着跑unit test全部都通过,很爽。

接着安装Phoenix。

mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez

再安装postgresql。

yum install -y postgresql-server
postgresql-setup initdb

systemctl start postgresql.service
systemctl enable postgresql.service

然后,在这篇文章中说,要“Set a password for the default PostgreSQL user ‘postgres’”,但我执行

sudo -u postgres psql

不能成功。实际是用postgres用户运行了psql,然后用

\password postgres

在psql中修改postgres用户的密码为postgres。

然后要修改pg_hba.conf中的验证方法为md5:

# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all

这里最后也有错,导致数据库无法启动。疑似应为:

host all all ::1/128 ident

或者

host all all ::1/128 md5

我用了前一种,估计应为我并不使用ipv6,所以错误也没影响。然后启动成功。

systemctl restart postgresql.service

然后继续按照上述文章按照phoenix。

yum install inotify-tools

mix phoenix.new ~/idroot_project_1

这时,需要去~/idroot_project_1/config/dev.mix中确认postgres用户的口令设置是否正确,并先建库:

# mix ecto.create
The database for idroot_project_1.Repo has been created

mix phoenix.server

然后系统提示:

# mix phoenix.server
[info] Running ProjTest.Endpoint with Cowboy using http://localhost:4000
[error] Could not start watcher because “node” is not available. Your Phoenix application is still running, however assets won’t be compiled. You may fix this by installing “node” and then running “npm install”.

还得先按照nodejs……

yum install nodejs

npm install
npm WARN deprecated babel-preset-es2016@6.24.1: 🙌 Thanks for using Babel: we recommend using babel-preset-env now: please read babeljs.io/env to update!
npm WARN deprecated babel-preset-es2015@6.24.1: 🙌 Thanks for using Babel: we recommend using babel-preset-env now: please read babeljs.io/env to update!
npm WARN deprecated coffee-script@1.11.1: CoffeeScript on NPM has moved to “coffeescript” (no hyphen)
npm WARN prefer global coffee-script@1.11.1 should be installed with -g
/root/proj_test
├─┬ babel-brunch@6.0.6
│ ├─┬ anymatch@1.3.2
│ │ ├─┬ micromatch@2.3.11
│ │ │ ├─┬ arr-diff@2.0.0
│ │ │ │ └── arr-flatten@1.1.0
│ │ │ ├── array-unique@0.2.1
│ │ │ ├─┬ braces@1.8.5
│ │ │ │ ├─┬ expand-range@1.8.2
│ │ │ │ │ └─┬ fill-range@2.2.3
│ │ │ │ │ ├── is-number@2.1.0
│ │ │ │ │ ├── isobject@2.1.0
│ │ │ │ │ ├─┬ randomatic@1.1.7
│ │ │ │ │ │ ├─┬ is-number@3.0.0
│ │ │ │ │ │ │ └── kind-of@3.2.2
│ │ │ │ │ │ └── kind-of@4.0.0
│ │ │ │ │ └── repeat-string@1.6.1
│ │ │ │ ├── preserve@0.2.0
│ │ │ │ └── repeat-element@1.1.2
│ │ │ ├─┬ expand-brackets@0.1.5
│ │ │ │ └── is-posix-bracket@0.1.1
│ │ │ ├── extglob@0.3.2
│ │ │ ├── filename-regex@2.0.1
│ │ │ ├── is-extglob@1.0.0
│ │ │ ├─┬ kind-of@3.2.2
│ │ │ │ └── is-buffer@1.1.6
│ │ │ ├─┬ object.omit@2.0.1
│ │ │ │ ├─┬ for-own@0.1.5
│ │ │ │ │ └── for-in@1.0.2
│ │ │ │ └── is-extendable@0.1.1
│ │ │ ├─┬ parse-glob@3.0.4
│ │ │ │ ├── glob-base@0.3.0
│ │ │ │ └── is-dotfile@1.0.3
│ │ │ └─┬ regex-cache@0.4.4
│ │ │ └─┬ is-equal-shallow@0.1.3
│ │ │ └── is-primitive@2.0.0
│ │ └─┬ normalize-path@2.1.1
│ │ └── remove-trailing-separator@1.1.0
│ ├─┬ babel-core@6.26.0
│ │ ├─┬ babel-code-frame@6.26.0
│ │ │ ├── esutils@2.0.2
│ │ │ └── js-tokens@3.0.2
│ │ ├─┬ babel-generator@6.26.0
│ │ │ ├─┬ detect-indent@4.0.0
│ │ │ │ └─┬ repeating@2.0.1
│ │ │ │ └─┬ is-finite@1.0.2
│ │ │ │ └── number-is-nan@1.0.1
│ │ │ ├── jsesc@1.3.0
│ │ │ └── trim-right@1.0.1
│ │ ├── babel-helpers@6.24.1
│ │ ├── babel-messages@6.23.0
│ │ ├─┬ babel-register@6.26.0
│ │ │ ├── core-js@2.5.3
│ │ │ ├─┬ home-or-tmp@2.0.0
│ │ │ │ ├── os-homedir@1.0.2
│ │ │ │ └── os-tmpdir@1.0.2
│ │ │ └── source-map-support@0.4.18
│ │ ├─┬ babel-runtime@6.26.0
│ │ │ └── regenerator-runtime@0.11.1
│ │ ├── babel-template@6.26.0
│ │ ├─┬ babel-traverse@6.26.0
│ │ │ ├── globals@9.18.0
│ │ │ └─┬ invariant@2.2.2
│ │ │ └── loose-envify@1.3.1
│ │ ├─┬ babel-types@6.26.0
│ │ │ └── to-fast-properties@1.0.3
│ │ ├── babylon@6.18.0
│ │ ├── convert-source-map@1.5.1
│ │ ├─┬ debug@2.6.9
│ │ │ └── ms@2.0.0
│ │ ├── json5@0.5.1
│ │ ├── lodash@4.17.4
│ │ ├─┬ minimatch@3.0.4
│ │ │ └─┬ brace-expansion@1.1.8
│ │ │ ├── balanced-match@1.0.0
│ │ │ └── concat-map@0.0.1
│ │ ├── path-is-absolute@1.0.1
│ │ ├── private@0.1.8
│ │ └── slash@1.0.0
│ ├─┬ babel-preset-es2015@6.24.1
│ │ ├── babel-plugin-check-es2015-constants@6.22.0
│ │ ├── babel-plugin-transform-es2015-arrow-functions@6.22.0
│ │ ├── babel-plugin-transform-es2015-block-scoped-functions@6.22.0
│ │ ├── babel-plugin-transform-es2015-block-scoping@6.26.0
│ │ ├─┬ babel-plugin-transform-es2015-classes@6.24.1
│ │ │ ├── babel-helper-define-map@6.26.0
│ │ │ ├── babel-helper-function-name@6.24.1
│ │ │ ├── babel-helper-optimise-call-expression@6.24.1
│ │ │ └── babel-helper-replace-supers@6.24.1
│ │ ├── babel-plugin-transform-es2015-computed-properties@6.24.1
│ │ ├── babel-plugin-transform-es2015-destructuring@6.23.0
│ │ ├── babel-plugin-transform-es2015-duplicate-keys@6.24.1
│ │ ├── babel-plugin-transform-es2015-for-of@6.23.0
│ │ ├── babel-plugin-transform-es2015-function-name@6.24.1
│ │ ├── babel-plugin-transform-es2015-literals@6.22.0
│ │ ├── babel-plugin-transform-es2015-modules-amd@6.24.1
│ │ ├─┬ babel-plugin-transform-es2015-modules-commonjs@6.26.0
│ │ │ └── babel-plugin-transform-strict-mode@6.24.1
│ │ ├─┬ babel-plugin-transform-es2015-modules-systemjs@6.24.1
│ │ │ └── babel-helper-hoist-variables@6.24.1
│ │ ├── babel-plugin-transform-es2015-modules-umd@6.24.1
│ │ ├── babel-plugin-transform-es2015-object-super@6.24.1
│ │ ├─┬ babel-plugin-transform-es2015-parameters@6.24.1
│ │ │ ├── babel-helper-call-delegate@6.24.1
│ │ │ └── babel-helper-get-function-arity@6.24.1
│ │ ├── babel-plugin-transform-es2015-shorthand-properties@6.24.1
│ │ ├── babel-plugin-transform-es2015-spread@6.22.0
│ │ ├─┬ babel-plugin-transform-es2015-sticky-regex@6.24.1
│ │ │ └── babel-helper-regex@6.26.0
│ │ ├── babel-plugin-transform-es2015-template-literals@6.22.0
│ │ ├── babel-plugin-transform-es2015-typeof-symbol@6.23.0
│ │ ├─┬ babel-plugin-transform-es2015-unicode-regex@6.24.1
│ │ │ └─┬ regexpu-core@2.0.0
│ │ │ ├── regenerate@1.3.3
│ │ │ ├── regjsgen@0.2.0
│ │ │ └─┬ regjsparser@0.1.5
│ │ │ └── jsesc@0.5.0
│ │ └─┬ babel-plugin-transform-regenerator@6.26.0
│ │ └── regenerator-transform@0.10.1
│ └─┬ babel-preset-es2016@6.24.1
│ └─┬ babel-plugin-transform-exponentiation-operator@6.24.1
│ ├─┬ babel-helper-builder-binary-assignment-operator-visitor@6.24.1
│ │ └── babel-helper-explode-assignable-expression@6.24.1
│ └── babel-plugin-syntax-exponentiation-operator@6.13.0
├─┬ brunch@2.10.7
│ ├── anysort@1.0.1
│ ├─┬ check-dependencies@1.0.1
│ │ ├─┬ bower-config@1.4.1
│ │ │ ├── graceful-fs@4.1.11
│ │ │ ├── mout@1.1.0
│ │ │ ├─┬ optimist@0.6.1
│ │ │ │ └── wordwrap@0.0.3
│ │ │ ├── osenv@0.1.4
│ │ │ └── untildify@2.1.0
│ │ ├─┬ chalk@1.1.3
│ │ │ ├── ansi-styles@2.2.1
│ │ │ ├── escape-string-regexp@1.0.5
│ │ │ ├─┬ has-ansi@2.0.0
│ │ │ │ └── ansi-regex@2.1.1
│ │ │ ├── strip-ansi@3.0.1
│ │ │ └── supports-color@2.0.0
│ │ ├─┬ findup-sync@0.4.3
│ │ │ ├─┬ detect-file@0.1.0
│ │ │ │ └── fs-exists-sync@0.1.0
│ │ │ └─┬ resolve-dir@0.1.1
│ │ │ ├── expand-tilde@1.2.2
│ │ │ └─┬ global-modules@0.2.3
│ │ │ ├─┬ global-prefix@0.1.5
│ │ │ │ ├─┬ homedir-polyfill@1.0.1
│ │ │ │ │ └── parse-passwd@1.0.0
│ │ │ │ ├── ini@1.3.5
│ │ │ │ └─┬ which@1.3.0
│ │ │ │ └── isexe@2.0.0
│ │ │ └── is-windows@0.2.0
│ │ ├── lodash.camelcase@4.3.0
│ │ ├── minimist@1.2.0
│ │ └── semver@5.4.1
│ ├─┬ chokidar@1.7.0
│ │ ├── async-each@1.0.1
│ │ ├── glob-parent@2.0.0
│ │ ├── inherits@2.0.3
│ │ ├─┬ is-binary-path@1.0.1
│ │ │ └── binary-extensions@1.11.0
│ │ ├── is-glob@2.0.1
│ │ └─┬ readdirp@2.1.0
│ │ ├─┬ readable-stream@2.3.3
│ │ │ ├── core-util-is@1.0.2
│ │ │ ├── isarray@1.0.0
│ │ │ ├── process-nextick-args@1.0.7
│ │ │ ├── safe-buffer@5.1.1
│ │ │ ├── string_decoder@1.0.3
│ │ │ └── util-deprecate@1.0.2
│ │ └── set-immediate-shim@1.0.1
│ ├── coffee-script@1.11.1
│ ├─┬ commander@2.9.0
│ │ └── graceful-readlink@1.0.1
│ ├── commonjs-require-definition@0.6.2
│ ├─┬ debug@2.2.0
│ │ └── ms@0.7.1
│ ├─┬ deppack@0.7.0
│ │ ├─┬ browser-resolve@1.11.2
│ │ │ └── resolve@1.1.7
│ │ ├─┬ deep-assign@2.0.0
│ │ │ └── is-obj@1.0.1
│ │ ├─┬ detective@4.7.0
│ │ │ ├── acorn@5.2.1
│ │ │ └── defined@1.0.0
│ │ ├─┬ glob@7.1.2
│ │ │ ├── fs.realpath@1.0.0
│ │ │ ├─┬ inflight@1.0.6
│ │ │ │ └── wrappy@1.0.2
│ │ │ └── once@1.4.0
│ │ ├─┬ loggy@0.3.5
│ │ │ ├── ansicolors@0.3.2
│ │ │ └── growl@1.8.1
│ │ ├─┬ node-browser-modules@0.1.0
│ │ │ ├── assert@1.3.0
│ │ │ ├─┬ buffer@4.3.1
│ │ │ │ ├── base64-js@1.2.1
│ │ │ │ └── ieee754@1.1.8
│ │ │ ├─┬ crypto-browserify@3.11.1
│ │ │ │ ├─┬ browserify-cipher@1.0.0
│ │ │ │ │ ├─┬ browserify-aes@1.1.1
│ │ │ │ │ │ └── buffer-xor@1.0.3
│ │ │ │ │ ├─┬ browserify-des@1.0.0
│ │ │ │ │ │ └── des.js@1.0.0
│ │ │ │ │ └─┬ evp_bytestokey@1.0.3
│ │ │ │ │ └─┬ md5.js@1.3.4
│ │ │ │ │ └── hash-base@3.0.4
│ │ │ │ ├─┬ browserify-sign@4.0.4
│ │ │ │ │ ├── bn.js@4.11.8
│ │ │ │ │ ├── browserify-rsa@4.0.1
│ │ │ │ │ ├─┬ elliptic@6.4.0
│ │ │ │ │ │ ├── brorand@1.1.0
│ │ │ │ │ │ ├── hash.js@1.1.3
│ │ │ │ │ │ ├── hmac-drbg@1.0.1
│ │ │ │ │ │ ├── minimalistic-assert@1.0.0
│ │ │ │ │ │ └── minimalistic-crypto-utils@1.0.1
│ │ │ │ │ └─┬ parse-asn1@5.1.0
│ │ │ │ │ └── asn1.js@4.9.2
│ │ │ │ ├── create-ecdh@4.0.0
│ │ │ │ ├─┬ create-hash@1.1.3
│ │ │ │ │ ├── cipher-base@1.0.4
│ │ │ │ │ ├─┬ ripemd160@2.0.1
│ │ │ │ │ │ └── hash-base@2.0.2
│ │ │ │ │ └── sha.js@2.4.9
│ │ │ │ ├── create-hmac@1.1.6
│ │ │ │ ├─┬ diffie-hellman@5.0.2
│ │ │ │ │ └── miller-rabin@4.0.1
│ │ │ │ ├── pbkdf2@3.0.14
│ │ │ │ ├── public-encrypt@4.0.0
│ │ │ │ └── randombytes@2.0.5
│ │ │ ├── domain-browser@1.1.7
│ │ │ ├── events@1.1.1
│ │ │ ├── https-browserify@0.0.1
│ │ │ ├── os-browserify@0.2.1
│ │ │ ├── path-browserify@0.0.0
│ │ │ ├── process@0.11.10
│ │ │ ├── punycode@1.4.1
│ │ │ ├── querystring-es3@0.2.1
│ │ │ ├── readable-stream@2.0.6
│ │ │ ├── stream-browserify@2.0.1
│ │ │ ├─┬ stream-http@2.1.1
│ │ │ │ ├── builtin-status-codes@2.0.0
│ │ │ │ ├── to-arraybuffer@1.0.1
│ │ │ │ └── xtend@4.0.1
│ │ │ ├── string_decoder@0.10.31
│ │ │ ├── timers-browserify@1.4.2
│ │ │ ├── tty-browserify@0.0.0
│ │ │ ├─┬ url@0.11.0
│ │ │ │ ├── punycode@1.3.2
│ │ │ │ └── querystring@0.2.0
│ │ │ ├─┬ util@0.10.3
│ │ │ │ └── inherits@2.0.1
│ │ │ └─┬ vm-browserify@0.0.4
│ │ │ └── indexof@0.0.1
│ │ └─┬ true-case-path@1.0.2
│ │ └── glob@6.0.4
│ ├── deps-install@0.1.1
│ ├── fcache@0.3.0
│ ├─┬ init-skeleton@1.0.1
│ │ ├── brunch-skeletons@0.1.6
│ │ ├── hosted-git-info@2.1.5
│ │ ├── ncp@2.0.0
│ │ └── normalize-git-url@3.0.2
│ ├─┬ loggy@1.0.2
│ │ └─┬ native-notifier@0.1.1
│ │ └── tag-shell@0.1.0
│ ├── micro-es7-shim@0.1.0
│ ├── micro-promisify@0.1.1
│ ├─┬ mkdirp@0.5.1
│ │ └── minimist@0.0.8
│ ├─┬ promise.prototype.finally@2.0.1
│ │ ├─┬ define-properties@1.1.2
│ │ │ ├── foreach@2.0.5
│ │ │ └── object-keys@1.0.11
│ │ ├─┬ es-abstract@1.10.0
│ │ │ ├─┬ es-to-primitive@1.1.1
│ │ │ │ ├── is-date-object@1.0.1
│ │ │ │ └── is-symbol@1.0.1
│ │ │ ├── has@1.0.1
│ │ │ ├── is-callable@1.1.3
│ │ │ └── is-regex@1.0.4
│ │ └── function-bind@1.1.1
│ ├── read-components@0.7.0
│ ├─┬ serve-brunch@0.2.0
│ │ └─┬ pushserve@1.0.2
│ │ ├── connect-slashes@1.3.1
│ │ ├─┬ express@4.16.2
│ │ │ ├─┬ accepts@1.3.4
│ │ │ │ ├─┬ mime-types@2.1.17
│ │ │ │ │ └── mime-db@1.30.0
│ │ │ │ └── negotiator@0.6.1
│ │ │ ├── array-flatten@1.1.1
│ │ │ ├─┬ body-parser@1.18.2
│ │ │ │ ├── bytes@3.0.0
│ │ │ │ ├─┬ http-errors@1.6.2
│ │ │ │ │ └── setprototypeof@1.0.3
│ │ │ │ ├── iconv-lite@0.4.19
│ │ │ │ └── raw-body@2.3.2
│ │ │ ├── content-disposition@0.5.2
│ │ │ ├── content-type@1.0.4
│ │ │ ├── cookie@0.3.1
│ │ │ ├── cookie-signature@1.0.6
│ │ │ ├── depd@1.1.1
│ │ │ ├── encodeurl@1.0.1
│ │ │ ├── escape-html@1.0.3
│ │ │ ├── etag@1.8.1
│ │ │ ├─┬ finalhandler@1.1.0
│ │ │ │ └── unpipe@1.0.0
│ │ │ ├── fresh@0.5.2
│ │ │ ├── merge-descriptors@1.0.1
│ │ │ ├── methods@1.1.2
│ │ │ ├─┬ on-finished@2.3.0
│ │ │ │ └── ee-first@1.1.1
│ │ │ ├── parseurl@1.3.2
│ │ │ ├── path-to-regexp@0.1.7
│ │ │ ├─┬ proxy-addr@2.0.2
│ │ │ │ ├── forwarded@0.1.2
│ │ │ │ └── ipaddr.js@1.5.2
│ │ │ ├── qs@6.5.1
│ │ │ ├── range-parser@1.2.0
│ │ │ ├─┬ send@0.16.1
│ │ │ │ ├── destroy@1.0.4
│ │ │ │ └── mime@1.4.1
│ │ │ ├── setprototypeof@1.1.0
│ │ │ ├── statuses@1.3.1
│ │ │ ├─┬ type-is@1.6.15
│ │ │ │ └── media-typer@0.3.0
│ │ │ ├── utils-merge@1.0.1
│ │ │ └── vary@1.1.2
│ │ └── serve-static@1.13.1
│ ├─┬ since-app-start@0.3.2
│ │ └─┬ debug@2.2.0
│ │ └── ms@0.7.1
│ ├─┬ skemata@0.1.2
│ │ └── fast-levenshtein@1.1.4
│ ├── source-map@0.5.7
│ └── universal-path@0.1.0
├─┬ clean-css-brunch@2.10.0
│ └── clean-css@4.0.13
├── phoenix@1.2.5
├── phoenix_html@2.10.5
└─┬ uglify-js-brunch@2.1.1
└─┬ uglify-js@2.6.4
├── async@0.2.10
├── uglify-to-browserify@1.0.2
└─┬ yargs@3.10.0
├── camelcase@1.2.1
├─┬ cliui@2.1.0
│ ├─┬ center-align@0.1.3
│ │ ├─┬ align-text@0.1.4
│ │ │ └── longest@1.0.1
│ │ └── lazy-cache@1.0.4
│ ├── right-align@0.1.3
│ └── wordwrap@0.0.2
├── decamelize@1.2.0
└── window-size@0.1.0

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.1.3: wanted {“os”:”darwin”,”arch”:”any”} (current: {“os”:”linux”,”arch”:”x64″})

然后再运行就正确启动了:

# mix phoenix.server
[info] Running ProjTest.Endpoint with Cowboy using http://localhost:4000
18:26:58 – info: compiled 6 files into 2 files, copied 3 in 1.5 sec

Phoenix缺省首页

Phoenix缺省首页

有两个女生来接机,没想到。

其中一位女生直接当司机,没想到。

3通电话之后,跟小蓓联系上了,没想到。

小蓓的声音一点都没变,没想到。

晚上骑着共享单车转了转古城墙,在郁孤台附件江边转了转。江边黑乎乎的,静谧,却过于冷肃。

看来讲义,感觉专业性还不算太强,对自己的内容稍微有些信心。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 赣州

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

这篇文章介绍的游戏,真是值得好好想想,骑着隐含着不少未来世界的“旋律”。

这是最好的猫,也是最坏的猫。——喆华·沃兹基索德

国外潮流网站Vice的一个科技博主,在今年的10月20日被邀请参加一个新产品体验活动。这个产品源自加拿大的一场Hackthon,由一个名为Axiom Zen的工作室开发。产品是一个虚拟的宠物养成社区游戏,玩家在区块链上购买虚拟的猫,让它们互相或者和其他玩家的猫进行繁殖,每只猫有256种基因,基于一定的算法,可以遗传到下一代。

理论上,假设每个基因的设定是显性和隐形两种,那猫的种类是一个天文数字。开发者给拥有一些特定基因组合的猫打上了标签,比如“猎豹”“天鹅绒”等等,类似人类的双眼皮、蓝眼睛之类。如果一只猫凑齐了几个稀缺的标签或者拥有一组非常罕见的基因组合,这只猫将被称为Fancy Cat。基因的组合和传递是不透明的,这吸引着玩家乐此不疲地买猫和让猫生崽儿。

开发者团队和该科技博主沟通的时候解释,鉴于跟用户解释区块链和智能合约几乎能达到给用户催眠的效果,所以他们就做了这么一个产品,用最简单有趣的方法来教育用户,告诉他们什么是区块链。尽管如此,该科技博主在试玩以后还是表示:“这个有点意思,但是估计只有蛋疼的人才会去玩吧。”

这位科技博主可能不知道,一个月以后他就被这个游戏的火爆程度啪啪啪地打脸了。CrpytoKitties.co 在上线之后,迅速在全球火爆。截止到12月7日,这个平台上一共有超过4万只区块链猫被售卖,交易额达到了600多万美元。

最贵的猫,大约在10万美元上下。而这4万只猫的均价是130美元。

12月初,这个新闻迅速的刷遍了区块链、极客圈,随之又登上不少主流媒体的版头。猫的价格也与日俱增。后来因为这个游戏过于火爆,一度导致这个游戏背后的区块链以太坊交易堵塞,12月5日的一个ICO,甚至不得不因为给买猫的人让路而延后。

真相

这并不是炒作。

这个游戏,虽然简单到只有2000行代码,但是完美地踩到了几个爆款游戏应该具备的要素,无论是灰色与否。

首先,这是一个有现金投资和收益的游戏。玩家可以付费买猫、付费生小猫(少量费用)、借用别人的猫生小猫(略多一点);然后可以出售自己猫用于配种生小猫,也可以出售直接获得上不封顶的利润。

猫的出售是以拍卖的形式在网站上完成的。交易的币种是以太币,在国外的交易所是可以兑换成现金提现的。因此,在用户能持续消费(生小猫)和交易(购买猫)的前提下,区块链撸猫变成了一种能产生现金流回报的资产。

其次,这是一个充满投机意味的游戏。区块链撸猫的设定是,两只猫可以生小猫,但是每只猫有几个要素,主要包括辈分、基因标签。基因标签代表着稀缺性,稀缺性代表着价值;辈分越高的猫则繁殖越快,因此也和价值正相关。

基因标签的生成是个黑盒子,是游戏不透明的部分(游戏大部分是开源的、在白皮书中公开的)。至少目前看来,没有明显的分析能指向如何获得稀缺标签的猫。因此每一次生小猫的过程,都有可能诞生一只价值不菲的稀缺品种,甚至游戏本身的程序设置可能就有随机参数在内。

这上面的两点,已经让区块链撸猫这个游戏脱离了游戏的范畴。区块链撸猫已经可以作为一个能产生现金流、可交易的资产,那么它等同于一个债券或者股票。同时它的价值有不确定性,目前还处于一个市场在定价的过程中,这很像一个IPO。

但是,如果考虑到这个市场上所有的利润来源都是游戏的参与者本身,也就是说,这个区块链撸猫,并不是一个实际的资产,也没有创造经济价值的能力(假设在短时间内如果我们不考虑收藏价值和宠物爱好者)。那么实际上这是一个零和游戏,更像一个期货交易产品。

因此这个游戏的短期平衡,是每一种稀缺标签的猫配种收入除以它的市场价格,大致等于它的货币,即以太币同时间段内的收入预期。举个例子,比如现在以太币是450美元,以太币一周的期货是495美元,也就是10%的月收益。那么,区块链撸猫作为以太币的金融衍生品,如果带有一种标签,比如说Jaguar的猫配种收入(单价乘以每月频次)大约在10个以太币,那么带有这个标签的猫价格就会在100以太币左右。当然,因为一只猫有若干标签,这就不是一个单一的价格,而是一个公式。

长期平衡

这个游戏的长期平衡很有意思,是个哲学问题。首先,这个游戏会不会长期存在,都是一个值得讨论的问题。

在此之前,有一些细节问题我们可以先排除。第一,这并不是传销,因为和传销不同的是所有的交易都是自愿买卖,级别高的猫拥有者不会自动从级别低的猫拥有者的消费行为中获得收益。第二,在国内,虚拟货币,不管是区块链币还是Q币,都是不能兑换成法币的。在这里,结论至少是,在国内应该是不合法的。

同时,这个游戏也不能直接归类在赌博里面。赌博是个模糊个概念,但是参考维基百科对赌博的定义,包含了筹码、概率和奖品三个要素。这三个要素需要是明确的是,任何一种赌博都是概率的换算,比如简单的赌骰子大小、俄罗斯轮盘,到有竞技因素的麻将、赌球。

回报也是明确和概率挂钩的。区块链撸猫的区别在于,它给参与者带来的回报,是对同一事物的信息判断差异,有人认为贵了、有人认为便宜了,这个获利行为不存在概率,因此是交易而不是赌博。最多只能说有一点赌博的元素在内,因为在猫的数量不够多的情况下,稀缺品种怎么繁殖出来,是具有随机性的,而且我们不确定游戏规则是否设定了随机参数。

关于这个游戏,大部分代码是开源的。但要是问这个游戏会不会有一个长期平衡存在,就很难有共识。首先,这个游戏有收藏的概念。任何有收藏价值的品种,比如古董,核心之一是稀缺性。区块链撸猫的最大特点之一是其稀缺性,第一代猫仅有5万只。这样,稀缺性就被人为创造出来了。

当然,可以预测的是,在随后一段时间内,我们会看到区块链养狗、区块链养鸡等类似产品。但是同时,做为区块链上史无前例的爆款游戏,区块链撸猫算是人类历史上第一个成功去中心化应用,也有一定的纪念意义。由于区块链的不可毁灭性,拥有某只猫的人,只要不卖,他可以把这个保留直到计算机网络毁灭。

从这一点上来说,这个产品里面的任何一只猫,比如创世纪猫,就像古董一样,有它见证历史的意义。这个多少带有一点哲学含义。因为传统意义上,一个纪念历史的物品,多少是个实体。而区块链撸猫是虚拟的代码,说最实在的,它是一个以太坊钱包对应的一个参数记录,都是一串数字。那只猫的图片,并不存在于区块链上,今天长这个样子,明天开发者心血来潮,可以换成别的样子。或者因为这个网站并不是在区块链上,可能哪天服务器坏了,这个猫的图片就消失了,只剩一串数字。

当然,你可以说我的茅台股票也是一个交易账号里面的数字;我们每天阅读和书写的内容,他们所构成的历史本身,都是数字和字符;我们每一个人本身,从原子的角度来看,不过是一种排序方式而已,我们本身和数字也没有差异。所以,这很哲学。

把这个游戏做到区块链上,给这个游戏带来了什么价值,很有可能是一种本末倒置的推测。创始团队Axiom Zen在创造这个游戏的初衷,是希望通过这个游戏来科普区块链知识,而不是让区块链赋予游戏独特的价值。

但是无论如何,区块链撸猫的独特性、不可毁灭性,是区块链赋予的。如果这个仅仅是一个电脑游戏的话,运营商确实可以随时修改参数,创造出一堆创世纪猫来,就像很多游戏运营商修改开宝箱、打怪掉宝的概率一样。同时,随着游戏服务器的关闭,游戏账号也会消失。不过仔细看代码的话,区块链撸猫的开发者团队还是可以灵活性修改游戏的,虽然这种设定仅仅可能是为了修改bug。

结论

没有什么结论可言。

总的来说,区块链撸猫短期内是一个金融产品的投机市场,从目前区块链行业参与者的构成来看,市场上投机的气氛浓厚。在国内大家未必知道V神是谁,但是李笑来是都知道的。所以区块链撸猫非常适合目前的区块链参与群体,成为爆款也是因为满足这群人的投机需求。

长期来看区块链猫能不能稳定活跃,取决于参与者对这件事情的信仰。在互联网早期的历史上,不说抢域名,因为域名还有一定商用价值,类似的事件还有抢geocities的账户、拍卖月球土地等如今看起来很无厘头的行为。然而,当年的5位数QQ号,现今已经是很值钱的了。

无论如何,在微信最早推出那个朋友圈打飞机游戏时,也没有人想到,腾讯能够把自己的社交网络发挥到极致,锻造出《王者荣耀》这样的游戏。一个几乎让以太坊大堵塞的区块链撸猫游戏,让我们看到了什么样的未来,仁者见仁,智者见智。

这篇ft文章,提到了几个核心观点:

强制——合法

火灾发生后,北京市政府对城乡结合部等“低端人口”聚集地区实施了地毯式清查,强制关闭了大量合法修建和出租的公寓。

职责——失职

日常的安全检查和环境治理本是政府的应尽职责,事故的发生本身已表明政府失职。

规划——计划

这种政策的远景是按“功能”将各种城市和农村分为三六九等,其中有的是政治中心、文化中心、教育中心、商业金融中心、科技创新中心……有的则集中承担工业制造、能源生产、钢铁冶炼等不那么高大上的功能,有的就只能作为粮食生产基地,说白了就是城市的粮袋、菜篮、肉仓。

充分——自由,平衡——平等

在我看来,充分与平衡的发展即意味着自由和平等的发展。

值得观察。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 往回走?

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

找了几篇文章了解了一下:

使用karma+mocha进行前端测试驱动开发(一)

Karma 不是一个测试框架,也不是一个断言库,仅仅启动一个 http server,并通过你熟知的测试框架生成运行测试的HTML。Karma 支持的测试框架非常多,如前文介绍,我们这里选择的是 mocha 测试框架和 chai 断言库。

karma 可以启动不同的浏览器,所以还可以做兼容性测试。

mocha是单元测试框架。

chai是断言库。

这篇则给出了更清晰的定位:https://zhuanlan.zhihu.com/p/22280891

Karma Mocha Chai(启动器、测试框架、断言库)组合

简述总是出现一些质量不错的文章:http://www.jianshu.com/p/b4b94f50efe8

终于看到了我期待的覆盖率统计。

如果你跟我一样有选择比较强迫症,这篇不错:http://front-ender.me/test/front-end-test.html

以这篇结尾将很合适:2017年JavaScript测试概览,因为它说

通过正确的策略和恰当的工具组合,可以实现几乎全面的覆盖,测试可以非常有条理,简单,而且相对较快。

  1. 提供测试环境(Mocha,Jasmine,Jest,Karma)
  2. 提供测试结构(Mocha,Jasmine,Jest,Cucumber)
  3. 提供断言功能(Chai,Jasmine,Jest,Unexpected)
  4. 生成,display和watch**测试结果(Mocha,Jasmine,Jest,Karma)
  5. 生成和比较组件和数据结构的快照,以确保以前运行的更改(Jest,Ava)
  6. 提供mocks,spies和stubs(Sinon,Jasmine,enzyme,Jest,testdouble)
  7. 生成代码覆盖率报告(Istanbul,Jest)
  8. 提供一个浏览器或类似浏览器的环境,控制他们的场景执行(Protractor,Nightwatch,Phantom,Casper)

首先,找入门的文章。
https://elixir-lang.org/blog/2016/07/14/announcing-genstage/
http://learningelixir.joekain.com/gen-stage/
http://learningelixir.joekain.com/using-gen-stage-to-notify-a-channel/
以下这篇是对其能力的参考信息:
http://www.jfh.com/jfperiodical/article/3948?f=jfperiodical?
然后这里有个同好的“作业”,其代码也许是不错阅读材料:
https://ruby-china.org/topics/33668


GenStage的源码在这里,以及官方文档和ConsumerSupervisor的文档

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 学习GenStage

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

根据这篇文章在本地虚拟机上安装了NPM(Nginx-PHP-Mariadb)。

先centos7最小安装也需要3GB空间,无比怀念只需要400MB的时代。

该文章的操作基本正确:

56 yum install net-tools.x86_64
57 ifconfig
58 ls
59 ps -ef | more
60 yum -y install epel-release.noarch
61 yum -y update
62 yum install nginx
63 systemctl start nginx
64 firewall-cmd –permanent –zone=public –add-service=http
65 firewall-cmd –reload
66 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noar
ch.rpm
67 rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
68 yum install php71w php71w-cli php71w-fpm
69 yum -y install php71w-mbstring php71w-common
70 yum -y install php71w-gd php71w-mcrypt
71 yum -y install php71w-mysql php71w-xml
72 yum -y install php71w-soap php71w-xmlrpc
73 yum -y install mariadb mariadb-server
74 systemctl status mariadb
75 systemctl start mariadb
76 systemctl enable mariadb
77 mysql_secure_installation
78 mysql -uroot -p
79 systemctl start php-fpm
80 systemctl enable php-fpm

其中漏了一步:systemctl enable nginx

该文章中的nginx配置文件是有问题的,最后我改成这个样子:

server {
listen 80;
server_name abc.com;
root /home/user/web/;
index index.php index.html;

location / {
root /home/user/web/;
index index.php index.html index.htm;
}

location ~ \.php$ {
root /home/user/web/;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

然后出现file not found现象。这篇文章提及需要修改php-fpm.d下的www.conf文件里的权限设置,并要相应修改/home/user/web文件的用户owner。

然后就出现了403,这个帖子在我鏖战一个多小时之后出现拯救了我。果然是因为user的缺other的执行权限。

下午人来齐了例会。

市场方面的好消息来自两个方面:一是CRB方面基于过去对我们的理解,对分析这块还是有需求。二是接近会议结束时,Dream提起的话头让大家的思路进入到一个正途——寻找小的具体的数据“治理”领域,可以便于实施,便于切入用户业务之中。

两个人对于招人的态度都是连连摇头。我心里也连连摇头。看起来是他们对市场没底。


上午来的美国客人,王氏兄弟,后来我才知道颇有来头。其一原为GE中国区总裁,引荐人都能到总理级别。冒着凛冽寒风跑到我们这个小公司来,可谓低调谦逊。而我的建议,他们显然意味得比我这个说话人还要深。

金融领域的单词听不懂,导致聊着聊着经常断篇。临散会还问我,你的英语不错,是怎么学的。我愣了一下,看美剧呀。他们愣了一下,然后哈哈大笑。

搞得我也不禁莞尔。