diff --git a/README.md b/README.md
index fa2afb5..dce2423 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-WeBlog
+eBlog
======
A simple blog system based on [Flask](http://flask.pocoo.org/)
@@ -11,10 +11,19 @@ Quick Start
$ git clone https://github.com/ghostrong/weblog.git
$ cd weblog
$ pip install -r requirements.txt
-$ python run.py
+$ python create_db.py
+$ python run.py (also you can run shell with: sh start.sh)
````
-Now, visit `http://127.0.0.1:8888` in a browser.
+Now, visit `http://127.0.0.1:5000` in a browser.
+
+Database with MySQL
+-------------------
+If you use MySQL ,create weblog database before ```python create_db.py```:
+
+* Set **SQLALCHEMY_DATABASE_URI** in config.py
+* Login MySQL and execute script ```create schema weblog charset utf8;```
+* python create_db.py
Requirements
------------
@@ -131,12 +140,25 @@ You should provide the markdown file(either file-path or raw-url), the target ap
**Anyone who know the token could publish articles to your blog system, so keep it secret!!**
After starting the web server locally, you can publish an article like this:
+*You should be change your token in config.py file.
````
-$ python publish.py -a http://127.0.0.1:8888/publish -p example.md
+$ python publish.py -a http://127.0.0.1:5000/publish -p example.md -t your_token_in_config
````
+Deploy application
+------------------
+gunicorn -w 4 -b 0.0.0.0:5000 run:app
+Delete blogs
+------------
+```
+from weblog import database,models
+db = database.db
+articles=models.Article
+articles.query.filter_by(id=1).delete()
+db.session.commit()
+```
Features
--------
* Writing blogs in Markdown and YAML
diff --git a/Why_ETL_difficult.md b/Why_ETL_difficult.md
new file mode 100644
index 0000000..bf5539d
--- /dev/null
+++ b/Why_ETL_difficult.md
@@ -0,0 +1,48 @@
+---
+title: 为什么ETL任务困难
+summary:
+ 自传统数据仓库理论形成,ETL 占据其中70%工作量就已经成为常识。可即便经过几十年到今天,各个平台的 ETL 普遍还在初级阶段,这背后深层次的原因是什么?
+tags:
+ - BI
+ - ETL
+ - DW
+ - 大数据
+...
+
+###为什么 ETL 很困难?
+####工具繁多
+从 DataStage到Kettle, ETL 工具覆盖了商业化领域和开源领域, 价格从几十万到免费,起码有几十种选择。
+
+有人要说了,选择多不是一件好事么?如果再早几年,我会同意这是好事,可到现在,我要说 NO!
+
+前面关于决策思维的博文提到一个论点:相比于普通人做出决策,专家是会直接给一种可行方案还是罗列众多方案类比优劣?
+
+答案是前者,也是我反对选择众多是好事这一论点的依据之一。
+
+#####那么选择多有什么坏处?
+* 基础方案混杂。各公司方案不同,甚至一个公司 ETL 环节也采用不同工具及架构,人才无法公用,维护成本高。
+* 数据项目失败案例远多于成功案例, 项目选型越复杂成功概率越低。大量公司做 BI、做大数据,甚至在没有人懂的情况下招人开工!事实上在数据领域,熟手都清楚一个现象,没有成功案例的人很难做成数据项目。很残忍的现实,但也让那些盲目投入资源跟风做项目的公司考虑冷静下来了。
+* 抬高实施门槛。现在大家都想做数据,进入大数据领域,尤其是有很多不具备该领域经验的公司想要做。那么实施前首先就是选型了,如果从三个产品选一个来做还可行的话,那么要从三十个产品中选型,这个工作本身就阻碍了数据项目的开展!
+
+####GUI工具
+说到这里反对的朋友更多了,GUI 所见即所得,降低使用门槛,好处一页都写不完,作为一名数据领域从业者,我决然反对,自己都能感觉到火药味。
+为了论证我的观点,这里要罗列ETL领域那些GUI的罪证了。
+#####ETL 工具的六大问题
+* 工具太大了,卡卡卡!我不是说 SSIS 之类,也不是说 Kettle 相关,我说的是他们所有人……
+* 好用的太贵, 便宜的不好用!
+* 组件式的拖拉开发,性能真的没法起来!尤其是那些依靠组件解决数据变化提取的兄弟们,你们想多了。
+* 我需要一包厕纸而已,你非要给我整个超市。在我蹲之前非得找遍整个超市!大家对比下里面的功能自己使用的比率。
+* 说 GUI 简单好用的,我强烈反对。GUI 好调试么?映射过程报错了大家要怎么办?检查源检查目标也就算了,连映射环节都要排查。除了自己设定的格式类型,还要考虑工具环节自己的转换类型,这不是增加负担么?
+* 部署,我都不想说部署了。一千个任务下来,ETL 工具别谈部署了!这时候有同学开始研究调度,有些关注数据质量,任务数量起来,想什么都是多的,保佑这混乱情况别出岔子就阿弥陀佛了。
+
+####ETL 工具阻碍了设计
+* 直接用工具拉数据的项目,认真找找有没有架构设计,有没有项目文档,有没有扩展性考虑,性能考虑?或者简单点,这项目换人可能接手下来么?
+* 数据项目是团队项目,ETL 工具是个人化工具。如果多个成员不能无缝接替工作,对不起,我认为这不是数据项目。哦不对,不算是一个项目。
+* 组件报错是工具问题,转换异常跟自己没关系。工具的 bug 和我真没关系,我项目做得好好的,ETL 工具崩溃了管我什么事?遇到这种情况不说我也知道做法,崩溃了再起来跑一跑嘛,运气好数据就跑出来了。至于数据质量管理是什么这样的问题,就别问出来了。
+
+[这里有关于 ETL 的一切](http://www.infotrim.cn)
+
+[这里有直接上手的 ETL 方案](http://www.infotrim.cn)
+
+[这里有十年数据解决方案的结晶](http://www.infotrim.cn)
+
diff --git a/about.md b/about.md
index 43d0e07..994e106 100644
--- a/about.md
+++ b/about.md
@@ -1,16 +1,20 @@
About Me
========
+提供专业 *BI* 解决方案。
-My name is Xiaosong Rong. I am interested in search engine, data mining, crawler, web development, and many other topics. I am now living in Beijing, China. I just graduated from Peking University.
+团队编制不足能否做 BI 系统? 能!
-If you want to know more about me, you can reach me by:
+没有服务器集群能否建立仓库? 能! 至少单机几十 TB 没问题!
-* [email](mailto:rongxiaosong@gmail.com)
-* [github](https://github.com/ghostrong/)
-* [linkedin](https://cn.linkedin.com/pub/xiaosong-rong/45/34/9b5)
-* [weibo](weibo.com/rongxs)
+技术积累不足能否开展 BI 项目? 能!
-By the way, the nicknames I used include **cedar**, **cedarrong**, **ghostrong**, **马孔多**, and **Rong** :-)
+项目中有数千个 ETL 需要整合, 能否只用一两个人完成? 能!
+
+跑跑卡丁车的数仓方案就是例证: 成千上万的 ETL、每日数千个计算任务、600+报表输出、单表承载数十亿容量,加上完整的分析系统输出!
+
+* Wechat: todouwang
+* Email: 13585697921@163.com
+* [微信二维码](static/wechat_card.jpg)
About this Website
diff --git a/config.py b/config.py
index 68f904f..bde7aed 100644
--- a/config.py
+++ b/config.py
@@ -1,11 +1,12 @@
#coding=utf8
-SQLALCHEMY_DATABASE_URI = 'sqlite:////tmp/test.db'
+#SQLALCHEMY_DATABASE_URI = 'sqlite:////tmp/test.db'
+SQLALCHEMY_DATABASE_URI = 'mysql+mysqlconnector://blog_user:morningdb.@localhost:3306/weblog'
-AUTHOR = 'Rong'
+AUTHOR = 'Infotrim'
# this is useful for submitting markdow files
# when publish new articles
TIME_FORMAT = '%Y-%m-%d %H:%M:%S'
-TOKEN = '123456'
+TOKEN = 'morningdb.'
diff --git a/decision.md b/decision.md
new file mode 100644
index 0000000..d844bca
--- /dev/null
+++ b/decision.md
@@ -0,0 +1,16 @@
+---
+title: 决策思维
+summary:
+ 我们每个人都被决策所包围,无论是生活中的衣食住行还是工作中的升职加薪,决策思维影响着我们在社会中所 处的位置。我们的决策是否足够理性,是否可以训练?聪明人的决策是否更加高明?一个普通人是否存在通往金字塔顶端的可能性?
+tags:
+ - 决策论
+ - 思维方式
+...
+
+###决策效率
+我们一直做决策系统,那么什么是决策?你买一件上衣,结果在购物网站逛了大半天,最终买了上衣、裤子、 还有一条皮带。在这个过程中,你产生购买上衣的想法是决策么?你逛购物网站是决策么?你买的裤子以及皮带是 否是决策?
+从整个决策流程来看,是否有一个明显的效率问题?买一件衣服需要一个时间单位,但预期之外的裤子、皮带需要两个时间单位。你投入了三个单位时间,收获了三件商品。那么我想问这三个时间单位的价值对等么?或者说购买三件商品所消耗你的资源有差别么?这两个问题回答出来之后,就归结为一个问题:你的决策效率如何?
+对于决策过程来讲,我们是否可以定义出一个“决策率”来衡量决策效率?如果可行,那这个指标又该如何衡量?
+###新手和专家的决策区别
+看到这里,大家停下来考虑下,是不是会觉得新手只能选择一种决策方案并判断可行性?专家呢?是不是会有很多方案比较优劣?通过研究分析,实际情况并不是这样,实际上专家决策往往都是选择一种可行方案,而新手才会关注对比多种方案优劣。
+为什么会是这样的结论?我认为这是经验决策的一个合理解释,专家具备足够的经验,瞬间给出直接可行方案。而新手经验不足以支撑快速决策,才会将精力放在多种方案研究,比较其优劣上面。
\ No newline at end of file
diff --git a/decision_about_big_data.md b/decision_about_big_data.md
new file mode 100644
index 0000000..0cbb758
--- /dev/null
+++ b/decision_about_big_data.md
@@ -0,0 +1,56 @@
+---
+title: 从大数据负责人招聘看决策思维
+summary:
+ 大数据被各大企业奉为灵丹妙药,寄予厚望地想要让数据告诉决策者企业的未来在哪里,而大数据负责人作为项目核心要素,企业会提出怎么样的要求?笔者将十余家大数据负责人沟通经验结合决策思维在此梳理分享。
+tags:
+ - 决策思维
+ - 大数据负责人要求
+...
+
+###决策是非理性的
+我们受到的教育是要理性思考,理性决策,信奉理性至上的思维模式。可惜的是现实并非如此,绝大多数的决策都是采用自然主义决策方式,而情景模拟又是其主流方法。对此感兴趣的朋友建议查看亚马逊近期榜单作品《如何做出正确决策:直击决策真相》了解更多。
+
+简而言之,无论是紧迫条件的救火队员还是军事要务的重大决定,决策的真相都如同我们前面介绍的方式:脑海中假设一条可行道路,一步步证明它是可行的。
+
+说到专家和普通决策的区别,大家还是要注意这个真相:专家决策都是迅速定下一条可行方案,而非拿出多套方案理性对比!
+###大数据负责人的要求是什么
+1. 有成功大数据经验
+
+大家要注意,我举证论据,至少都是讲三点的,可我这里只给出一条。
+经常查看此类招聘的朋友很容易看出来,另外两点因素是职业素养和对大数据生态的理解,我完全同意这个看法,但此处认为和我举证这一点比,其他的都完全不是问题。
+
+####为什么要有成功大数据经验?
+ 1. 因为招聘你去的地方通常是没有成功经验的,不然要你去干吗?
+ 2. 具备成功大数据经验的人真的很少! 这里大家应该慎重考虑下,基于这个观点,跳槽、换团队是大忌。为什么?因为如果你已经有成功经验,机会根本不是问题。而你不幸没有成功经验,跳槽、换团队都不能解决你成功经验的问题。
+ 3. 大数据项目的成功,不会只有一个人,但会取决于核心人物。好好珍惜现有团队,做成项目,并且不要说不懂其他同事的工作。大数据本来就是融合型工作,你永远只会自己做的一块,就不要费时间争取负责人的角色了。
+
+####为什么工作素养和 hadoop 等生态理解不重要?
+ 这个问题起码要说三点:
+
+ 1. 工作素养大部分都能做得很好,极少成为个人瓶颈不是吗?难道不是吗?
+
+ 2. 面试要求的 hadoop、spark、storm……这些不是招聘者的本质要求,招聘你去的真正需求是能将项目做出来,做成功。至于这些细节技术方案,面试者有多少人懂得?再说了,开源系统版本迭代那么快,完全依靠这些方案要踩多少坑招聘者哪里知道?不仅如此,作为负责人是要规避让企业踩坑才合格!
+
+ 3. 我看到好多人转向大数据,学 python 又学 R, 学 Java 又学 Scala, 学数据库又学数据仓库。这样的做法可行吗? 真心奉劝停下来冷静思考下!
+
+大数据是团队项目,不是单兵作战! 再说了,等你把所有学完, 企业等的花儿都谢了好么? 随便学一个感兴趣的, 找到工作再一步步深入, 各种大会、各种社区适合有经验的人、有方法的人,这些场景只要记住大家推荐的书籍回来好好学任务就完成了。
+
+###补偿机制的使用
+我们常说:"打一个耳光给一个苹果",是不是耳光就没那么疼了?
+
+这不止是一个心理现象,在面试大数据负责人这样重要岗位时一样可以用于决策。
+
+通常我们做出决策时,会在自己优势领域选定方案持续推进。要么成功达到目标,要么走不下去调转方向,可最终都是能完成任务的。
+
+那么为什么就算是专家也会遇到放弃方案跳转方向的情况,一方面是我们的确会遇到各种未知的问题,另一个更重要的方面就是:我们每个人在多个维度都有优点,切记!
+
+我们总看到话术中说:"同学你工作做得不好,但你在工作过程中表现出来的沟通能力还是很强的。"类似的情况数不胜数,与其说是心理补偿机制,倒不如说展示出我们每个人其实都不只有一个优势领域!
+
+那么这和大数据负责人招聘又有什么关系呢?
+
+ 1. 大数据负责人也是人,有长处也有短板。就算平时勤快对团队工作都了解, 涉及到每一块深度领域细节所知也是很有限的。
+ 2. 有限的人遇到无知的需求。这里用词不太合适,但其实很多企业寻找人才时对这个领域是一片空白的。那么提出的要求自然是互联网上随处能搜集到的岗位需求模板。虽然大家都理解每个公司、每个团队做数据都有些不同之处,但对于完全不了解行情的公司只能然并卵。除了网上找模板我也想不出更好的办法了。
+ 3. 有限的人要用优点补充缺点。招聘的时候发现你可视化不强,那应该展示自己数据仓库的优势了,如果发现你 hadoop 不熟,你是时候分享对 storm 的研究成果了。
+大家要考虑清楚团队项目中的个人定位, 一味地追求个人什么都会,项目发展会很有限,企业也会很不放心啊。
+
+[更多有用信息](http://www.infotrim.cn)
\ No newline at end of file
diff --git a/files/Why_ETL_difficult.md b/files/Why_ETL_difficult.md
new file mode 100644
index 0000000..bf5539d
--- /dev/null
+++ b/files/Why_ETL_difficult.md
@@ -0,0 +1,48 @@
+---
+title: 为什么ETL任务困难
+summary:
+ 自传统数据仓库理论形成,ETL 占据其中70%工作量就已经成为常识。可即便经过几十年到今天,各个平台的 ETL 普遍还在初级阶段,这背后深层次的原因是什么?
+tags:
+ - BI
+ - ETL
+ - DW
+ - 大数据
+...
+
+###为什么 ETL 很困难?
+####工具繁多
+从 DataStage到Kettle, ETL 工具覆盖了商业化领域和开源领域, 价格从几十万到免费,起码有几十种选择。
+
+有人要说了,选择多不是一件好事么?如果再早几年,我会同意这是好事,可到现在,我要说 NO!
+
+前面关于决策思维的博文提到一个论点:相比于普通人做出决策,专家是会直接给一种可行方案还是罗列众多方案类比优劣?
+
+答案是前者,也是我反对选择众多是好事这一论点的依据之一。
+
+#####那么选择多有什么坏处?
+* 基础方案混杂。各公司方案不同,甚至一个公司 ETL 环节也采用不同工具及架构,人才无法公用,维护成本高。
+* 数据项目失败案例远多于成功案例, 项目选型越复杂成功概率越低。大量公司做 BI、做大数据,甚至在没有人懂的情况下招人开工!事实上在数据领域,熟手都清楚一个现象,没有成功案例的人很难做成数据项目。很残忍的现实,但也让那些盲目投入资源跟风做项目的公司考虑冷静下来了。
+* 抬高实施门槛。现在大家都想做数据,进入大数据领域,尤其是有很多不具备该领域经验的公司想要做。那么实施前首先就是选型了,如果从三个产品选一个来做还可行的话,那么要从三十个产品中选型,这个工作本身就阻碍了数据项目的开展!
+
+####GUI工具
+说到这里反对的朋友更多了,GUI 所见即所得,降低使用门槛,好处一页都写不完,作为一名数据领域从业者,我决然反对,自己都能感觉到火药味。
+为了论证我的观点,这里要罗列ETL领域那些GUI的罪证了。
+#####ETL 工具的六大问题
+* 工具太大了,卡卡卡!我不是说 SSIS 之类,也不是说 Kettle 相关,我说的是他们所有人……
+* 好用的太贵, 便宜的不好用!
+* 组件式的拖拉开发,性能真的没法起来!尤其是那些依靠组件解决数据变化提取的兄弟们,你们想多了。
+* 我需要一包厕纸而已,你非要给我整个超市。在我蹲之前非得找遍整个超市!大家对比下里面的功能自己使用的比率。
+* 说 GUI 简单好用的,我强烈反对。GUI 好调试么?映射过程报错了大家要怎么办?检查源检查目标也就算了,连映射环节都要排查。除了自己设定的格式类型,还要考虑工具环节自己的转换类型,这不是增加负担么?
+* 部署,我都不想说部署了。一千个任务下来,ETL 工具别谈部署了!这时候有同学开始研究调度,有些关注数据质量,任务数量起来,想什么都是多的,保佑这混乱情况别出岔子就阿弥陀佛了。
+
+####ETL 工具阻碍了设计
+* 直接用工具拉数据的项目,认真找找有没有架构设计,有没有项目文档,有没有扩展性考虑,性能考虑?或者简单点,这项目换人可能接手下来么?
+* 数据项目是团队项目,ETL 工具是个人化工具。如果多个成员不能无缝接替工作,对不起,我认为这不是数据项目。哦不对,不算是一个项目。
+* 组件报错是工具问题,转换异常跟自己没关系。工具的 bug 和我真没关系,我项目做得好好的,ETL 工具崩溃了管我什么事?遇到这种情况不说我也知道做法,崩溃了再起来跑一跑嘛,运气好数据就跑出来了。至于数据质量管理是什么这样的问题,就别问出来了。
+
+[这里有关于 ETL 的一切](http://www.infotrim.cn)
+
+[这里有直接上手的 ETL 方案](http://www.infotrim.cn)
+
+[这里有十年数据解决方案的结晶](http://www.infotrim.cn)
+
diff --git a/files/decision.md b/files/decision.md
new file mode 100644
index 0000000..d844bca
--- /dev/null
+++ b/files/decision.md
@@ -0,0 +1,16 @@
+---
+title: 决策思维
+summary:
+ 我们每个人都被决策所包围,无论是生活中的衣食住行还是工作中的升职加薪,决策思维影响着我们在社会中所 处的位置。我们的决策是否足够理性,是否可以训练?聪明人的决策是否更加高明?一个普通人是否存在通往金字塔顶端的可能性?
+tags:
+ - 决策论
+ - 思维方式
+...
+
+###决策效率
+我们一直做决策系统,那么什么是决策?你买一件上衣,结果在购物网站逛了大半天,最终买了上衣、裤子、 还有一条皮带。在这个过程中,你产生购买上衣的想法是决策么?你逛购物网站是决策么?你买的裤子以及皮带是 否是决策?
+从整个决策流程来看,是否有一个明显的效率问题?买一件衣服需要一个时间单位,但预期之外的裤子、皮带需要两个时间单位。你投入了三个单位时间,收获了三件商品。那么我想问这三个时间单位的价值对等么?或者说购买三件商品所消耗你的资源有差别么?这两个问题回答出来之后,就归结为一个问题:你的决策效率如何?
+对于决策过程来讲,我们是否可以定义出一个“决策率”来衡量决策效率?如果可行,那这个指标又该如何衡量?
+###新手和专家的决策区别
+看到这里,大家停下来考虑下,是不是会觉得新手只能选择一种决策方案并判断可行性?专家呢?是不是会有很多方案比较优劣?通过研究分析,实际情况并不是这样,实际上专家决策往往都是选择一种可行方案,而新手才会关注对比多种方案优劣。
+为什么会是这样的结论?我认为这是经验决策的一个合理解释,专家具备足够的经验,瞬间给出直接可行方案。而新手经验不足以支撑快速决策,才会将精力放在多种方案研究,比较其优劣上面。
\ No newline at end of file
diff --git a/files/decision_about_big_data.md b/files/decision_about_big_data.md
new file mode 100644
index 0000000..0cbb758
--- /dev/null
+++ b/files/decision_about_big_data.md
@@ -0,0 +1,56 @@
+---
+title: 从大数据负责人招聘看决策思维
+summary:
+ 大数据被各大企业奉为灵丹妙药,寄予厚望地想要让数据告诉决策者企业的未来在哪里,而大数据负责人作为项目核心要素,企业会提出怎么样的要求?笔者将十余家大数据负责人沟通经验结合决策思维在此梳理分享。
+tags:
+ - 决策思维
+ - 大数据负责人要求
+...
+
+###决策是非理性的
+我们受到的教育是要理性思考,理性决策,信奉理性至上的思维模式。可惜的是现实并非如此,绝大多数的决策都是采用自然主义决策方式,而情景模拟又是其主流方法。对此感兴趣的朋友建议查看亚马逊近期榜单作品《如何做出正确决策:直击决策真相》了解更多。
+
+简而言之,无论是紧迫条件的救火队员还是军事要务的重大决定,决策的真相都如同我们前面介绍的方式:脑海中假设一条可行道路,一步步证明它是可行的。
+
+说到专家和普通决策的区别,大家还是要注意这个真相:专家决策都是迅速定下一条可行方案,而非拿出多套方案理性对比!
+###大数据负责人的要求是什么
+1. 有成功大数据经验
+
+大家要注意,我举证论据,至少都是讲三点的,可我这里只给出一条。
+经常查看此类招聘的朋友很容易看出来,另外两点因素是职业素养和对大数据生态的理解,我完全同意这个看法,但此处认为和我举证这一点比,其他的都完全不是问题。
+
+####为什么要有成功大数据经验?
+ 1. 因为招聘你去的地方通常是没有成功经验的,不然要你去干吗?
+ 2. 具备成功大数据经验的人真的很少! 这里大家应该慎重考虑下,基于这个观点,跳槽、换团队是大忌。为什么?因为如果你已经有成功经验,机会根本不是问题。而你不幸没有成功经验,跳槽、换团队都不能解决你成功经验的问题。
+ 3. 大数据项目的成功,不会只有一个人,但会取决于核心人物。好好珍惜现有团队,做成项目,并且不要说不懂其他同事的工作。大数据本来就是融合型工作,你永远只会自己做的一块,就不要费时间争取负责人的角色了。
+
+####为什么工作素养和 hadoop 等生态理解不重要?
+ 这个问题起码要说三点:
+
+ 1. 工作素养大部分都能做得很好,极少成为个人瓶颈不是吗?难道不是吗?
+
+ 2. 面试要求的 hadoop、spark、storm……这些不是招聘者的本质要求,招聘你去的真正需求是能将项目做出来,做成功。至于这些细节技术方案,面试者有多少人懂得?再说了,开源系统版本迭代那么快,完全依靠这些方案要踩多少坑招聘者哪里知道?不仅如此,作为负责人是要规避让企业踩坑才合格!
+
+ 3. 我看到好多人转向大数据,学 python 又学 R, 学 Java 又学 Scala, 学数据库又学数据仓库。这样的做法可行吗? 真心奉劝停下来冷静思考下!
+
+大数据是团队项目,不是单兵作战! 再说了,等你把所有学完, 企业等的花儿都谢了好么? 随便学一个感兴趣的, 找到工作再一步步深入, 各种大会、各种社区适合有经验的人、有方法的人,这些场景只要记住大家推荐的书籍回来好好学任务就完成了。
+
+###补偿机制的使用
+我们常说:"打一个耳光给一个苹果",是不是耳光就没那么疼了?
+
+这不止是一个心理现象,在面试大数据负责人这样重要岗位时一样可以用于决策。
+
+通常我们做出决策时,会在自己优势领域选定方案持续推进。要么成功达到目标,要么走不下去调转方向,可最终都是能完成任务的。
+
+那么为什么就算是专家也会遇到放弃方案跳转方向的情况,一方面是我们的确会遇到各种未知的问题,另一个更重要的方面就是:我们每个人在多个维度都有优点,切记!
+
+我们总看到话术中说:"同学你工作做得不好,但你在工作过程中表现出来的沟通能力还是很强的。"类似的情况数不胜数,与其说是心理补偿机制,倒不如说展示出我们每个人其实都不只有一个优势领域!
+
+那么这和大数据负责人招聘又有什么关系呢?
+
+ 1. 大数据负责人也是人,有长处也有短板。就算平时勤快对团队工作都了解, 涉及到每一块深度领域细节所知也是很有限的。
+ 2. 有限的人遇到无知的需求。这里用词不太合适,但其实很多企业寻找人才时对这个领域是一片空白的。那么提出的要求自然是互联网上随处能搜集到的岗位需求模板。虽然大家都理解每个公司、每个团队做数据都有些不同之处,但对于完全不了解行情的公司只能然并卵。除了网上找模板我也想不出更好的办法了。
+ 3. 有限的人要用优点补充缺点。招聘的时候发现你可视化不强,那应该展示自己数据仓库的优势了,如果发现你 hadoop 不熟,你是时候分享对 storm 的研究成果了。
+大家要考虑清楚团队项目中的个人定位, 一味地追求个人什么都会,项目发展会很有限,企业也会很不放心啊。
+
+[更多有用信息](http://www.infotrim.cn)
\ No newline at end of file
diff --git a/files/kill_myself.md b/files/kill_myself.md
new file mode 100644
index 0000000..48d5132
--- /dev/null
+++ b/files/kill_myself.md
@@ -0,0 +1,91 @@
+---
+title: 杀死自己
+summary:
+ 今天是苏打的第一千八百个任务,只要任务成功,就能成功获得那枚荣誉钥匙,然而……
+tags:
+ - 故事
+ - 文学
+...
+
+#杀死自己
+
+今天是苏打的第一千八百个任务,只要任务成功,就能成功获得那枚荣誉钥匙,然而……
+
+苏打一眨不眨地盯着眼前气泡飘起,在阳光下映射出不同的色彩,有些气泡很大,有些气泡很小,不过它们都有个共同点,那就是很圆。苏打的脸很圆,透过一个气泡看过去,可以看到和气泡一样圆,苏打伸出圆圆的食指,朝其中一只气泡戳了过去。
+
+“啪!”气泡炸开,瞬间从空中消失无踪,仿佛一场梦境破灭,不留一点儿痕迹。
+
+苏打咯咯地笑起来,感受着指尖传来的凉意,显得越发欢喜,阳光照射下,这个大男孩单纯得像一只气泡,是透明的。
+
+苏打只是一个代号,他的职业是时空猎手,任务是帮助基地清除时空中资源。人们叫他“苏打”,是因为他每次任务之后都玩气泡,看起来就像苏打水打开时的样子。他喜欢人们这么称呼,十年下来,以至于人们已经记不起他本来的名字。
+
+此刻最后一个任务已经拿到,周围的人窃窃私语,都表示同情,看着苏打和平时没什么两样,有些怀疑他失心疯了。
+
+“杀死自己。”
+
+没错,苏打的最后一个任务是要杀死自己。当然,并非要他自杀,而是要他去清除二十年前的自己,那个小胖男孩的自己。
+
+苏打看着气泡一个个破灭,脑海中尽是一个女孩的笑容,女孩笑得很甜,两侧圆圆的酒窝就像是气泡一样,一对长长的马尾辫非常可爱……那个承诺他永远不会忘记。
+
+“苏打,你刚完成任务,先回去好好休息。这个任务嘛,就算不做也没什么大不了的,十年时间一千七百九十九次清理,你已经很厉害了!”老陈也是一名猎手,时间久了,多少都能说几句话。
+
+一口气将最后几个气泡吹起,苏打打了个响指,这是他的招牌动作,代表执行任务的开始。身后那些唏嘘之声,对他没有半点儿干扰……
+
+“没有人愿意看着自己死,哪怕是平行时空的自己。”这是时空猎手的共识,然而苏打并不是一般的时空猎手,他是一个十年成功完成一千七百九十九次清理任务的时空猎手。噢,不,或许是一千八百次?
+
+……
+芦苇随风摇晃,河水清澈见底,岸边圆脸小男孩一手端着皂水,一手拿着小圆环,吹起了一个又一个气泡。远远看去,仿佛是苏打水打开时的样子。
+
+伸出圆嘟嘟的食指轻轻触碰一只气泡,“啪”地一声响,岸边传来男孩咯咯的清脆笑声。阳光照射下,男孩的笑容像气泡一样,单纯得透明。
+
+小苏打七岁,每天都陪着气泡欢乐地玩耍,仿佛人生之中只要有气泡陪伴,便再也没有别的要求了。
+
+芦苇边空间波动,像是水纹荡开,一个圆脸青年出现,看着前面漂亮的气泡,开心得快要挤出酒窝。
+
+“小苏打,我就是未来的你。”青年开口,他上前坐下一起拨弄气泡,笑容没有掩盖住眼神中的一抹狂热。
+
+“你是来陪我玩泡泡的么?”小苏打好奇地打量他,然后注意力再次被气泡吸引,不时地咯咯笑上两声。
+
+苏打眉头耸动,随即脸色微沉,他铭记自己的目标,就算是面对以前的自己,也绝不手软。
+
+“我是来杀你的。”苏打抢先弄破小苏打盯着的气泡想惹他生气,续道:“我知道你想说杀人是犯法的,不过你就是以前的我,你的存在都是为了我服务。这样,我也不为难你,你自己跳到河里,我看着就行了。”
+
+“你知道杀人犯法就好,我不怕你。我好好的,干嘛要听你的跳河里?你早点走吧,不然我喊大人了!”小苏打似乎并没受到多少影响,继续玩着空中的泡泡,不时地再吹起来几个。
+
+苏打出发之前心意已经非常坚定,此时一切尽在手中,就算非要自己出手,也不会有任何问题。只不过他想给一个充分的理由,让以前的自己死个明白,他说:
+
+“二十年后的你就是现在的我,我就是你。你的命运本来就属于我,为自己的将来做件好事,你死也值了!你不愿自己下去,我就帮你一把,让你见识下未来的力量,也让你省掉痛苦。”苏打手中出现一枚黑色按钮,像个小型遥控器。
+
+“你是你,我是我,什么二十年三十年的,你快点走开,不然我真要喊大人了!”小苏打皱着眉头,村里人都很疼他,只要喊一声,就谁也不怕。
+
+“结束了,如果你能多活些时间,一定会感激我的!”苏打按下按钮,“滴”地一声响,小苏打身周空间晃动,仿佛水纹荡过……
+
+紧接着又是“滴”地一声响,小苏打依然好好地在原地,只是奇怪滴看着芦苇边,撅起嘴,仿佛真要生气了。
+
+芦苇边又来了一个人,几乎跟苏打一个模样,然而眼神似乎多了几分深邃,没有苏打眼中的火热,反倒冷静得像是冰山。
+
+“连小苏打都比你明白道理,你就是你,他就是他。就算是统一时空的你,昨天和今天也是不同的,看来你这十年的确是太忙碌,以至于基本道理都弄不清了。”来人看了看苏打,一手拿出皂水,一手拿出丝环说:“我最爱的泡泡,自从你以猎手的身份找到我,我就再也没吹过了。”
+
+“平行时空的猎手?”苏打皱起眉头:“你是什么时空的?”
+
+不同的时空代表不同的力量,即便只差几年,也都是具备碾压级别的技术能力。
+
+来人看着小苏打朝芦苇丛跑过去无动于衷,不带表情地说:“很不幸,我的时空在你之后五年,让你失望了。不过你放心,我不是来清除你,只是自卫罢了!”
+
+苏打身子僵硬,脑海中乱成一团,一对酒窝像气泡一样圆,长长的马尾辫非常可爱,那个女孩儿模样逐渐浮现。
+
+然而面对绝对的时空差异,他知道根本没有机会,他失败了……
+
+芦苇那边小苏打拉着一个一个小女孩努力地吹泡泡,不一会儿就吹起一大片,两个人戳破气泡,发出咯咯地笑声,女孩儿长长的马尾辫很可爱,嘴角的酒窝比气泡还要圆。
+
+“这是你最想要的气泡吗?”小苏打努力地笑,有些腼腆,圆圆的脸上几乎挤出酒窝……他自然没有说,为了准备这些气泡,他足足练习了一个月时间,手上都磨出泡了。
+
+“是的!”女孩儿用力地点头。
+
+“那你可以告诉我下一个你最想要的东西了吗?”
+
+“我想要基地的那枚荣誉钥匙……”
+
+[更多经典故事](http://www.infotrim.cn)
+
+
diff --git a/files/leverage_for_decision.md b/files/leverage_for_decision.md
new file mode 100644
index 0000000..a2de69f
--- /dev/null
+++ b/files/leverage_for_decision.md
@@ -0,0 +1,47 @@
+---
+title: 杠杆原理在决策思维中的运用
+summary:
+ 我么日复一日地努力工作, 但十年努力比不上别人一套房产, 我们渴望用汗水换取成功, 但总觉得投入太多回报太少。 如果杠杆原理运用在决策思维会有怎么样的效果? 能否取得四两拨千斤的巨大量能?
+tags:
+ - 决策思维
+ - 杠杆思维
+...
+
+#杠杆原理在决策思维中的运用
+
+##什么是杠杆?
+
+杠杆就是用较少的力量获得较大的效果,“四两拨千斤”体现的就是杠杆思维。那么在决策思维中,我们的目标是获得更高的投入产出比,和杠杆思维可以说是完全一致。那么如何利用杠杆思想,推进决策思维中的效率,让我们付出更少的劳动,取得更大的成果呢?
+
+##找到杠杆点
+物理学中,要想发挥出杠杆的作用,首先要有支点。武术搏击中利用杠杆思维,则是寻找巧劲,寻找破绽。同样的道理,决策思维想要发挥杠杆的能量,同样需要先找到作用点,我们称之为杠杆点。
+
+杠杆点的作用和支点相同,在决策思维中,就是你最佳着手的地方。也就是说,在这个节点你成功决策,可以产生数倍甚至是指数级倍数效果。
+
+举个例子来说,我们使用的计算机故障了,现在需要排除问题。那么对于普通人来说自然一筹莫展,但对于专业人士是不是听听声音,看看屏幕就知道如何解决了?比较而言,专业人士是不是具备了找到杠杆点的先手优势?
+简单来说,想要找出杠杆点,做出高效率决策,我们要选择自己专业领域,或者构建专业领域知识系统。
+
+##时间投入在正确的地方
+我们通过自己或者专家获取道杠杆点,得到了高回报的决策方案,那就行动起来,将时间全部放在这里。道理大家都很容易明白,但实际工作中,大家总是忙,但回报却始终有限。为什么会这样?
+
+我们的时间都花在哪里了?跟同事聊天?学习游泳?阅读书籍?无论投入在哪里,我们都要思考这些事情和我们的决策是否关系密切。如果是否定答案的话,无论你多么想做那些事情,都应该停下来,保证你的时间给回报最高的决策。
+
+##标记阻塞点
+杠杆点的定位能让我们事半功倍,但与之对应,我们任何决策都会存在风险,且将最容易导致我们失败的节点成为阻塞点。这个节点意味着我们所有付出都会因为它的存在付之一炬。
+
+比如说驾驶员遭遇刹车失灵,比如说电商活动遭遇电缆终端,比如说拿到通知书却凑不齐学费……
+
+我们在任何决策中都要提前分析阻塞点的存在,专业的领域知识更容易帮我们找到它,接下来就是要做好备案,防止该问题阻碍到你收获成功。
+
+##将杠杆点串联
+在运用决策思维时,我们找到了杠杆点,也找到了阻塞点。对于阻塞点我们已经准备了应对措施,但对于杠杆点运用我们还可以更进一步。
+
+杠杆点并不只有一个,可以有很多个,我们要将它们串联起来,充分发挥出杠杆原理的能量才可以获得更大的收获。
+
+简而言之,决策思维的运用关乎我们每个人能取得的成就,投入精力思考是非常有意义的。在决策过程中,我们首先要建立自己领域优势,如果自己没有优势,要注意借鉴行业专家的建议;其次要寻找杠杆点,并将时间精力大把投入进去,要避免把时间损耗在低回报的领域;最后我们规避阻塞点,串联杠杆点,就能做出最有效的决策,收获指数级的汇报。
+
+[决策思维研究分享](http://www.infotrim.cn)
+
+[大数据运用前沿](http://www.infotrim.cn)
+
+[无门槛ETL解决方案](http://www.infotrim.cn)
diff --git a/files/mu_zhi_ming.md b/files/mu_zhi_ming.md
new file mode 100644
index 0000000..91ea154
--- /dev/null
+++ b/files/mu_zhi_ming.md
@@ -0,0 +1,100 @@
+---
+title: 墓志铭
+summary:
+ 我姓陈,叫陈光荣,这是父亲给我取的名字,我以此为荣。
+tags:
+ - 故事
+ - 文学
+...
+
+#墓志铭
+
+我姓陈,叫陈光荣,这是父亲给我取的名字,我以此为荣。
+
+我光荣地入伍,光荣地制服歹徒,光荣地抓贪官、剿敌患,光荣地为一切光荣战斗。
+
+我一生都是勇敢的战士,永远都是我父亲陈伯的儿子,无论遇到多大的困难都不会用自杀这种懦弱的方式逃避。直到陈伯到来,我都还希望看着他乐呵呵地跟我说话,可是我也明白,他最亲最近的儿子这次会给他留下永远无法愈合的伤痛。
+
+我不愿意陈伯受委屈,可是身在组织之中,我更需要服从上级命令,实在无法两全。上级表扬说我是一把最锋利的匕首,到哪里都能直插敌人的心脏。陈伯视若珍宝的一打勋章便是最有说服力的证据,可是我怎么也没想到这次的任务会如此艰难。
+
+明刀明枪我不怕,流血牺牲我不怕,我有强大的体魄和意志。可是这一次的斗争不见刀枪却比刀枪厉害万分,不见血泪却能撕人心肺。
+
+我赴职第一天便意识到局面的困难,从社区到税务,从交通到执法竟没有一人可以为我所用。他们牢牢地捆在一起,形成了一张无形大网,我这柄匕首被捆了一圈又一圈,无从着力,无从下手。
+
+偌大的地方,没有可以信任的人,就连老杨也变得若即若离,不知是否已经站到了敌人的一边。
+
+幸好还有上级特派来的秘书,不然的话,我可真是孤身奋战了。
+
+陈伯教育我说过“邪不压正”,我坚定地相信这一点,所以一直耐性地等待机会,同时暗中寻找敌人的弱点。
+
+一年多的时间,虽然连这张大网幕后主脑都没弄清楚是谁,但我不气馁,我相信心术不正的人早晚有暴露的一天。而我时刻准备着迎接这一天的到来。
+
+在这黑暗的日子里我并不孤单,每个月头我如数地给父亲邮寄两百块钱,他收到钱后又无一例外回寄给我一百块。同时还会带来一张字条,字条上永远是四个字:“为国为民。”
+
+每次收到字条后我都整齐地压在记事本中,和以前的字条整齐地排在一起。这些字条仿佛温暖的阳光穿透乌云,能消除我心中所有顾虑。
+
+不管遇到什么困难,我只要打开记事本,翻一翻这些字条,便又斗志昂扬。
+
+我一如既往地轰走妄图渗透我的敌人,越来越瞧不起他们的烂俗手段,直到邮局小哥送来地址错误的汇款单。
+
+汇款单上“我”邮寄了一千元给父亲,手笔大得吓人,还把地址写错了一个字。
+
+看来有人终于按耐不住要动手了,无法渗透我,这是早晚的事情。不过对我来说,却是一个千载难逢的机会,我等这个机会很久了。
+
+我把地址修改正确,若无其事地交给邮局小哥。然后立即跟秘书用耳语的方式开了个紧急会议,时间不多,我们得抓紧行动。
+
+我们分头行事做准备,然后我又同平常一样,依次巡视镇上的一切。
+
+污浊的河流、漆黑的烟囱、嘈杂的碎石场、强拆的学校和医院,这些真真切切出现在我面前的事情,我都没能阻止,不知道有多少无辜的人因为恶劣的环境深受其害。
+
+如果陈伯来镇上看到这些,一定会很生气。
+
+他教育我要对付一切恶势力,他嫉恶如仇,坚信邪不胜正,更相信自己的儿子永远是一名光荣的战士。
+
+“陈伯看到镇上的变化,他会不会认为你已经被渗透了?这样做太危险,万一……”秘书同志忧心忡忡。
+
+“我们要相信陈伯,他是一名老战士。”
+
+秘书不在的时候,我擦了擦湿润的眼角,想着可能出现的艰难局面,我做了很久的深呼吸都不能平复。
+
+陈伯不愧是陈伯,他出现在镇上,比我们预料的时间还要早。
+
+他看着环境翻天覆地的变化,心里应该很想抽我吧?
+
+他一定会去找老杨寒暄,可是老杨是否还是以前的老杨?陈伯如果发现老杨的变化,他会不会难受?
+
+陈伯走路为什么一瘸一拐的,山路难行,难道受伤了?我是不是该停止计划,先送他去医疗室?
+
+我经历战斗无数,流血牺牲都不怕,可从未像现在这样紧张。
+
+没有刀光剑影,没有杀声震天,没有警铃长鸣,一切都静悄悄地进行着。
+
+陈伯从老杨那里出来后把鸡蛋全扔了,然后一步步地朝我这里走来。一瘸一拐的腿没有丝毫减慢他的速度,倒是一向笑呵呵的脸被拉得老长,像是从地府来索命的黑无常。
+
+“陈伯快到了,你确定要这么做么?太危险了!”秘书眉头皱成了“川”字。
+
+我站在阳台上看着下面越来越多的人,心中不由地称赞秘书能干,然后深深地吸了口气说:“我准备好了,你去忙,一切按计划行事!”
+
+秘书做事干脆利落,也不废话,哒哒哒地冲下楼梯,这时我已经看到陈伯艰难地从人群挤过来,一向腰杆儿挺拔得他竟显得有些佝偻。
+
+我知道时机稍纵即逝,扶着栏杆毫不犹豫地跃了出去。
+
+“光荣啊,明刀明枪地对付敌人你很厉害,可你知道怎么对付那些躲在阴暗中的强大对手吗?”
+
+“躲在阴暗中的人能有多强大?等他们一露头,我就抓住他们!”
+
+“孩子啊,有些敌人比你想象中的要厉害,除非你死,他们是不会主动露头的。”
+
+“要是我死了,墓碑上能刻几个字吗?”
+
+“能啊,你想刻什么?”
+
+“为国为民。”
+
+“好,如果真有这一天,我亲自给你刻上。”陈伯不等说完便扭头走开,早已泪眼婆娑。
+
+我姓陈,叫陈光荣,这是父亲给我取的名字,我以此为荣。
+
+[经典故事分享](http://www.infotrim.cn)
+
+
diff --git a/files/mysql_grant_denied.md b/files/mysql_grant_denied.md
new file mode 100644
index 0000000..4bd2ce3
--- /dev/null
+++ b/files/mysql_grant_denied.md
@@ -0,0 +1,25 @@
+---
+title: access denied for user root @localhost
+summary:
+ When i use grant clause on localhost ,the operation denied for no permission.
+tags:
+ - mysql
+ - upgrade
+...
+
+access denied for user root @localhost
+=================
+
+MySQL upgrade from 5.1 to 5.5 by mysql_upgrade, the mysql.user.password column is changed.
+If your MySQL version > 5.5.50, verify the authentication_string for users.
+
+```
+UPDATE mysql.user SET authentication_string=PASSWORD('******') where USER='root';
+```
+
+restart mysql service by:
+```
+service mysql restart
+```
+
+[reference](http://superuser.com/questions/603026/mysql-how-to-fix-access-denied-for-user-rootlocalhost)
\ No newline at end of file
diff --git a/files/situation.md b/files/situation.md
new file mode 100644
index 0000000..1f4c731
--- /dev/null
+++ b/files/situation.md
@@ -0,0 +1,31 @@
+---
+title: 大数据行业现状
+summary:
+ 每个人都在讲大数据,就连我们的父母辈都知道这些词汇,可是有几个人真正了解这个行业?每次的大数据会议都有成百上前人参加,可是里面有几个能称为专家?这么多人趋之若鹜的行业,为什么参加几百次会议也入不了门?
+tags:
+ - 决策论
+ - 思维方式
+...
+
+###大数据行业现状
+这是大数据的时代,是最好的时代,也是最坏的时代。
+
+我们每个人都有机会加入这个风口领域,我们每个人都很难找到通往领域的这扇大门。
+
+这个时代大家挤破头想进入大数据,这个时代大数据专家始终屈指可数。
+
+有人以为参加大会多交流就能找到机会,可事实上参加大会的90%以上的人都是在大数据门外徘徊。
+
+有人觉得掌握SQL统计数据就是在做大数据,
+
+有人使用可视化工具制作图表就称为专家,
+
+还有人觉得解了方程就是在做数据挖掘,在做机器学习……
+
+可是数据从文件系统到现在这么多年,数据领域总是有专家的。
+
+当然!
+
+不过这些专家可能很寂寞,专业的只是即便是在大数据时代也找不到几个可以交流的人,怎能不寂寞?
+
+这些专家可能还很忙,因为能帮他们一起做事的人太少,好多事情都要自己一个人干……
\ No newline at end of file
diff --git a/files/why_difficult.md b/files/why_difficult.md
new file mode 100644
index 0000000..42c2c63
--- /dev/null
+++ b/files/why_difficult.md
@@ -0,0 +1,31 @@
+---
+title: 为什么进入大数据领域这么难
+summary:
+ 说起热门技术没有什么比得上大数据领域,可为什么这么多人天天谈大数据,大部分人还是只能浮于表面?想要进入大数据领域,认真地做份工作为什么这么难?
+tags:
+ - BI
+ - ETL
+ - DW
+ - 大数据
+...
+
+###想做大数据为什么这么难?
+####专家稀缺
+互联网时代效率为先,软硬件技术大幅提升生产效率,为大家节约了大量时间。
+
+可悲的是互联网从业者却越来越忙,数据专家也是一样的局面。
+
+BAT 大量笼络数据人才,从阿里的千人计划可见一斑。
+
+专业人才供不应求的局面,你说这些人有多少精力出来分享知识?
+
+####技术概念炒作
+* 天天讲大数据的多半不会做
+* 会做这件事儿的闷声加班
+* 会议参加得再多,也做不出数据平台,参会就是被案例各厂产品
+
+####行业的急功近利
+* 企业一提大数据恨不得明天上线
+* 技术一讲大数据离不开 adoop之类生态体系
+* 普片不专业的信息误导领域从业者,增加入门难度
+
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..79f1bdd
--- /dev/null
+++ b/index.html
@@ -0,0 +1,220 @@
+
+
+
+
+ Eblog by whbjob
+
+
+
+
+
+
+
+
+
+
+
+ eBlog
+
+A simple blog system based on Flask
+
+
+ Quick Start
+
+$ git clone https://github.com/ghostrong/weblog.git
+$ cd weblog
+$ pip install -r requirements.txt
+$ python create_db.py
+$ python run.py (also you can run shell with: sh start.sh)
+
+
+Now, visit http://127.0.0.1:5000
in a browser.
+
+
+ Database with MySQL
+
+If you use MySQL ,create weblog database before python create_db.py
:
+
+
+Set SQLALCHEMY_DATABASE_URI in config.py
+Login MySQL and execute script create schema weblog charset utf8;
+
+python create_db.py
+
+
+
+ Requirements
+
+
+ For the server-side
+
+
+Flask
+Flask-SQLAlchemy
+itsdangerous
+Jinja2
+Markdown
+MarkupSafe
+SQLAlchemy
+Werkzeug
+
+
+
+ For the cline-side (for publishing articles automatically)
+
+
+requests
+lxml
+PyYAML
+Markdown
+
+
+
+ Writing blogs
+
+You should write articles in markdown , and provide the meta information such as title, tags in YAML . You should put the meta data in the header lines of the markdown file. Here is an example .
+
+
+ Meta Data
+
+
+
+title
+
+You must give the title the the blog. e.g.,
+
+title: The Zen of Python
+
+
+
+summary (optional)
+
+It's the abstract of the article. If you ignore it, the publish helper will generate the
+summary snippet from the body automatically. e.g.,
+
+summary:
+ Long time Pythoneer Tim Peters succinctly channels the BDFL's
+ guiding principles for Python's design into 20 aphorisms, only 19
+ of which have been written down.
+
+
+
+pub_time (optional)
+
+You can define the publish datetime manually. Or, the system will assign the current
+datetime. The default format is "%Y-%m-%d %H:%M:%S" (such as "2015-06-06 12:40:10").
+You could define the time string format by the value of TIME_FORMAT in
+config.py ,
+and you should conform to the
+format codes . e.g.,
+
+pub_time: 2015-06-06 12:40:10
+
+
+
+tags (optional)
+
+It's useful to assign tags to an article. The value type should be list in YAML. e.g.,
+
+tags:
+ - python
+ - programming
+
+
+
+
+
+ The boundry of meta
+
+The meta data should be located between '---' and '...'.
+The following is an example of meta infomration:
+
+---
+title: The Zen of Python
+summary:
+ Long time Pythoneer Tim Peters succinctly channels the BDFL's
+ guiding principles for Python's design into 20 aphorisms, only 19
+ of which have been written down.
+tags:
+ - python
+ - programming
+...
+
+You should write the body content from here...
+
+
+
+ Publishing blogs
+
+We provide a simple script to make the publishing work easy. Run publish.py
to check the help message.
+
+$ python publish
+
+usage: publish.py [-h] [-p PATH] [-a API] [-t TOKEN]
+
+optional arguments:
+ -h, --help show this help message and exit
+ -p PATH, --path PATH markdown file path/url
+ -a API, --api API api address
+ -t TOKEN, --token TOKEN
+ access token
+
+
+You should provide the markdown file(either file-path or raw-url), the target api, and the access token. In this blog system, the publish url is /publish
. The access token is the value of TOKEN in config.py .
+Anyone who know the token could publish articles to your blog system, so keep it secret!!
+
+After starting the web server locally, you can publish an article like this:
+*You should be change your token in config.py file.
+
+$ python publish.py -a http://127.0.0.1:5000/publish -p example.md -t your_token_in_config
+
+
+
+ Deploy application
+
+gunicorn -w 4 -b 0.0.0.0:5000 run:app
+
+
+ Delete blogs
+
+from weblog import database,models
+db = database.db
+articles=models.Article
+articles.query.filter_by(id=1).delete()
+db.session.commit()
+
+
+
+ Features
+
+
+Writing blogs in Markdown and YAML
+Browsing blogs by PAGE or TAG
+Neat templates :-)
+Search (TBD)
+
+
+
+ TODO
+
+
+
+
+
+
+
+
+
+
diff --git a/javascripts/scale.fix.js b/javascripts/scale.fix.js
new file mode 100644
index 0000000..87a40ca
--- /dev/null
+++ b/javascripts/scale.fix.js
@@ -0,0 +1,17 @@
+var metas = document.getElementsByTagName('meta');
+var i;
+if (navigator.userAgent.match(/iPhone/i)) {
+ for (i=0; i code {
+ padding: 0;
+ margin: 0;
+ font-size: 0.9rem;
+ color: #567482;
+ word-break: normal;
+ white-space: pre;
+ background: transparent;
+ border: 0; }
+.main-content .highlight {
+ margin-bottom: 1rem; }
+ .main-content .highlight pre {
+ margin-bottom: 0;
+ word-break: normal; }
+.main-content .highlight pre, .main-content pre {
+ padding: 0.8rem;
+ overflow: auto;
+ font-size: 0.9rem;
+ line-height: 1.45;
+ border-radius: 0.3rem; }
+.main-content pre code, .main-content pre tt {
+ display: inline;
+ max-width: initial;
+ padding: 0;
+ margin: 0;
+ overflow: initial;
+ line-height: inherit;
+ word-wrap: normal;
+ background-color: transparent;
+ border: 0; }
+ .main-content pre code:before, .main-content pre code:after, .main-content pre tt:before, .main-content pre tt:after {
+ content: normal; }
+.main-content ul, .main-content ol {
+ margin-top: 0; }
+.main-content blockquote {
+ padding: 0 1rem;
+ margin-left: 0;
+ color: #819198;
+ border-left: 0.3rem solid #dce6f0; }
+ .main-content blockquote > :first-child {
+ margin-top: 0; }
+ .main-content blockquote > :last-child {
+ margin-bottom: 0; }
+.main-content table {
+ display: block;
+ width: 100%;
+ overflow: auto;
+ word-break: normal;
+ word-break: keep-all; }
+ .main-content table th {
+ font-weight: bold; }
+ .main-content table th, .main-content table td {
+ padding: 0.5rem 1rem;
+ border: 1px solid #e9ebec; }
+.main-content dl {
+ padding: 0; }
+ .main-content dl dt {
+ padding: 0;
+ margin-top: 1rem;
+ font-size: 1rem;
+ font-weight: bold; }
+ .main-content dl dd {
+ padding: 0;
+ margin-bottom: 1rem; }
+.main-content hr {
+ height: 2px;
+ padding: 0;
+ margin: 1rem 0;
+ background-color: #eff0f1;
+ border: 0; }
+
+@media screen and (min-width: 64em) {
+ .main-content {
+ max-width: 64rem;
+ padding: 2rem 6rem;
+ margin: 0 auto;
+ font-size: 1.1rem; } }
+
+@media screen and (min-width: 42em) and (max-width: 64em) {
+ .main-content {
+ padding: 2rem 4rem;
+ font-size: 1.1rem; } }
+
+@media screen and (max-width: 42em) {
+ .main-content {
+ padding: 2rem 1rem;
+ font-size: 1rem; } }
+
+.site-footer {
+ padding-top: 2rem;
+ margin-top: 2rem;
+ border-top: solid 1px #eff0f1; }
+
+.site-footer-owner {
+ display: block;
+ font-weight: bold; }
+
+.site-footer-credits {
+ color: #819198; }
+
+@media screen and (min-width: 64em) {
+ .site-footer {
+ font-size: 1rem; } }
+
+@media screen and (min-width: 42em) and (max-width: 64em) {
+ .site-footer {
+ font-size: 1rem; } }
+
+@media screen and (max-width: 42em) {
+ .site-footer {
+ font-size: 0.9rem; } }
diff --git a/weblog/static/favicon.ico b/weblog/static/favicon.ico
index dd9880d..a19adc4 100644
Binary files a/weblog/static/favicon.ico and b/weblog/static/favicon.ico differ
diff --git a/weblog/static/google08933a1ce7a7b739.html b/weblog/static/google08933a1ce7a7b739.html
new file mode 100644
index 0000000..1eca876
--- /dev/null
+++ b/weblog/static/google08933a1ce7a7b739.html
@@ -0,0 +1 @@
+google-site-verification: google08933a1ce7a7b739.html
\ No newline at end of file
diff --git a/weblog/static/style.css b/weblog/static/style.css
index df41b6b..d098118 100644
--- a/weblog/static/style.css
+++ b/weblog/static/style.css
@@ -6,7 +6,7 @@
/* general style */
body { font: 17px/25px 'Merriweather', serif;
- margin: 0; padding: 0; font-weight: 400; color: black; }
+ margin: 0; padding: 0; font-weight: 400; color: black;}
a { color: #398ad5; font-weight: 400; }
a:hover { color: #2771b5; }
@@ -27,16 +27,16 @@ h2 { font-size: 42px; line-height: 44px; }
h3 { font-size: 36px; line-height: 38px; }
h1 em { color: black; font-size: 32px; display: block;
- margin-left: 25px; margin-top: -15px; }
+ margin-left: 10%; margin-top: -15px; }
/* layout elements */
-div.container { max-width: 880px; margin: 48px auto; padding: 0 40px; }
-div.header { float: left; }
+div.container { max-width: 880px; margin: 2.5% auto; padding: 0 40px;width: 100% }
+div.header { float: none; }
div.navigation { float: right; }
-div.header, div.navigation { height: 25px; margin-bottom: 42px; }
+div.header, div.navigation { height: 25px; margin-bottom: 12px; }
div.navigation ul { margin: 0; padding: 0; list-style: none; }
div.navigation ul li { display: inline; margin: 0 2px; padding: 0; }
-div.body { clear: both; margin: 0 30px; line-height: 1.6; }
+div.body { clear: both; margin: 0 0px; line-height: 1.6;}
div.footer { margin-top: 55px; font-size: 16px;
text-align: right; color: #7b8894; }
div.footer p { margin: 0; }
@@ -61,6 +61,7 @@ pre, code, tt { font-family: 'Ubuntu Mono', 'Consolas', 'Deja Vu Sans Mono',
pre { line-height: 1.45; background: none; padding: 0; }
code, tt { background: #eee; }
+
/* tables */
table { border: 1px solid #ddd; border-collapse: collapse;
background: #fafafa; }
@@ -86,11 +87,12 @@ div.entry-overview h1 a { color: #2771b5; }
div.entry-overview div.summary,
div.entry-overview div.date,
div.entry-overview div.summary p { margin: 0; padding: 0; }
-div.entry-overview div.detail { margin-left: 140px; }
-div.entry-overview div.date { float: left; width: 120px; color: #7b8894;
- text-align: right; font-style: italic;
+div.entry-overview div.detail { margin-left: 20px; }
+div.entry-overview div.date { float: none; width: 120px; color: #7b8894;
+ text-align: left; font-style: italic;
font-size: 14px; }
+
/* other alignment things */
img.align-center { margin: 15px auto; display: block; }
diff --git a/weblog/static/weather_data_demo.png b/weblog/static/weather_data_demo.png
new file mode 100644
index 0000000..00ab861
Binary files /dev/null and b/weblog/static/weather_data_demo.png differ
diff --git a/weblog/static/wechat_card.jpg b/weblog/static/wechat_card.jpg
new file mode 100644
index 0000000..c63df90
Binary files /dev/null and b/weblog/static/wechat_card.jpg differ
diff --git a/weblog/templates/article.html b/weblog/templates/article.html
index cf0eb62..b9481a8 100644
--- a/weblog/templates/article.html
+++ b/weblog/templates/article.html
@@ -1,6 +1,7 @@
{% extends "layout.html" %}
{% block title %}{{ entry.title }}{% endblock %}
{% block body %}
+
{{ entry.title|safe }}
written on {{ format_date_weekday(entry.pub_time) }}
diff --git a/weblog/templates/layout.html b/weblog/templates/layout.html
index 09e1f34..7286d29 100644
--- a/weblog/templates/layout.html
+++ b/weblog/templates/layout.html
@@ -1,17 +1,64 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{% block htmlhead %}
- {% block title %}Home{% endblock %} | {{ config.AUTHOR }}'s Thoughts and Writings
+ {% block title %}Home{% endblock %} | {{ config.AUTHOR }}
{% endblock %}
+
+
+
+
+
+
{% block body %}{% endblock %}
-
-