-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
403 lines (313 loc) · 30.1 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Fort ColdHumour</title>
<subtitle>我们一路奋战,不是为了改变世界,而是为了不让这个世界改变我们</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://coldhumour.github.io/"/>
<updated>2017-06-25T08:45:48.906Z</updated>
<id>http://coldhumour.github.io/</id>
<author>
<name>Jasper Wu</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>Python实现Excel-Word联合自动化</title>
<link href="http://coldhumour.github.io/2017/06/25/Python%E5%AE%9E%E7%8E%B0Excel-Word%E8%81%94%E5%90%88%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
<id>http://coldhumour.github.io/2017/06/25/Python实现Excel-Word联合自动化/</id>
<published>2017-06-25T07:00:38.000Z</published>
<updated>2017-06-25T08:45:48.906Z</updated>
<content type="html"><![CDATA[<p>这个博客搭了挺久了,本意是当技术博客写的,想记录一些日常开发中积累的技巧。Project Euler的Review是一个不错的切入点,不过我还是高估了自己,430+之后有好几题都比较卡,导致完全没法按计划推进。当中也有过调整策略的想法,该跳的要果断跳。但是光跳433就下了挺大的决心,说服自己改变准则对我这样的人来说还是有点难的。</p>
<p>扯得有点远,回到技术博客的话题上来。这篇的主题其实早就有了腹稿,一直拖着没动。就像减肥或者跑步之类的念头,人总是时不时地会产生跟拖延症抗争的念头。总算这回努力小人打败了懒惰小人,来更一篇。</p>
<p>先说下背景吧,前段时间工作中会面临要定期不定期地经常出一些报告,后台的业务逻辑部分早就写好了,如果对输出要求不那么高的话也能凑合着看。不过领导们嘛总归是并不懂技术,而且报告要给客户们发,更是不能指望,所以开会拍板定下来还是以Word(或者存成pdf)的形式来发。自然而然地,图表风格要用公司的BI,格式也都要统一。作为能写几行代码的人,自然不愿意每次都手动做,但是查了查又没什么通用的方案可以借鉴,到头来还是得自己开动脑筋造个轮子。</p>
<a id="more"></a>
<p>在最终解决方案出来之前,还是要再岔一句准备工作。前面说到后台数据都算好了,就数据本身而言输出的初步内容大致是几十张大小格式各异的表,为了防止程序中途出错,我分拆了初步输出,即大致把内容归了归类,每一块里面如果是DataFrame就直接导出csv,有特殊要求的就输出成json。这样即使数据有问题也只要重跑有错的部分就行了。</p>
<p>然后就是最终的格式要求了。为了展示得清晰和突出重点,审阅的人提了不少很有价值的需求,不过他们自然是从Excel的角度提的,自然也就满是Excel的特殊格式,比方说边框啊合并单元格啊什么的。这种东西通过DataFrame这种东西设置起来实在太过费劲,索兴就仔仔细细做了一套工作底稿的模板,有些要算的指标以及要画的图全部设置成公式自适应,然后把输出的那堆东西按固定位置往里填,就完工了。</p>
<p>说到Excel的输出就多说一句,我起初用的方案还是当年学的xlrd和xlwt,用起来有点吃力。后来委托实习生调研方案的时候提到了xlwings,虽然他实现的思维有点僵化,字里行间倒是透出些飘逸。于是直接去查了xlwings的文档,果然能够飘逸很多,功能什么的比那两个package强大多了,可以自由地在相对位置写入,而且可以写值、可以写公式,还不会影响调好的格式。Nice!</p>
<p>回到Word的问题上来。因为曾经写过VBA,所以大概对Word有宏这件事情有点概念,对解决方案的大概想法是就算Python不能直接生成格式要求如此复杂的Word,底层我就用VBA来解决,然后用Python来调用VBA。至于VBA要做的事情嘛,一是因为主要麻烦的地方在图上,二是为了让实习生也能写,我就分了两步,第一步把Excel里的图都导出来,第二步在Word中从外部导入图片。</p>
<p>我仔细想了想这个思路实现起来应该不难,就把想法跟实习生说了,委托他写一段能跑的通的代码出来。他照着这个方向研究了一阵子,提交了一份代码给我,解决了第一步,但在第二步上遇到了问题。</p>
<p>先来说第一步,他照着我说的先写了段VBA,把图导出成图片,然后用Python来调VBA。尽管这种绕大圈子的方案最后舍弃了,但是这当中引入了一个至关重要的东西——win32com。实习生代码的流程大致是这样:xlwings写入数据 -> win32com调用VBA把图片导出到固定位置。我先看了看VBA部分,似乎是通过一个什么全局的方法来实现的,其中方法的名字和xlwings以及win32com的一些方法很像,于是拆了Python部分的代码分段运行看了看中间结果,又查了查文档,发现xlwings底层是win32com,然后win32com是一堆Python调度Office文件的API。不过win32com的文档很是难用,那个阶段还是靠摸索为主。稍微费了一点功夫成功摆脱了VBA部分,可以直接用win32com导出图表了。</p>
<p>不过最大的拦路虎还是第二步。Word VBA相关的东西本来就少,而且不像Excel那样有单元格作为天然的定位基准,想在指定位置插入或替换图片实现起来无比困难,我们讨论一番后还是否掉了这个方案。好在现在有了第一步的方案,知道了win32com是<strong>Office</strong>的接口,那么自然可以试试Word.Application里有些什么东西。这东西和Word VBA类似,有这种需求的人太少了,网上的资源比较有限,只有一些简单格式的文章生成之类。</p>
<p>之前试图调用VBA的时候需要另存为xlsm,因此遇到了一些奇怪的固定参数,查Excel.Application的时候发现了这个:</p>
<ul>
<li><a href="https://msdn.microsoft.com/en-us/library/office/ff198017.aspx" target="_blank" rel="external">Excel File Format Enum</a></li>
</ul>
<p>顺藤摸瓜发现了</p>
<ul>
<li><a href="https://msdn.microsoft.com/en-us/library/office/ff194068.aspx" target="_blank" rel="external">Excel Object Model</a></li>
</ul>
<p>也是对整体的结构框架了解得更清楚了。</p>
<p>所以,抱着试试看的心态,去找了找Word的相关文档:</p>
<ul>
<li><a href="https://msdn.microsoft.com/en-us/library/office/ff837519.aspx" target="_blank" rel="external">Word Object Model</a></li>
<li><a href="https://msdn.microsoft.com/en-us/library/office/ff839952.aspx" target="_blank" rel="external">Word File Format Enum</a></li>
</ul>
<p>在当中发现了当时实现图片导出时用到的sht.ChartObjects十分类似的东西:doc.InlineShapes,于是就此突破。</p>
<p>这里首先得赞美一下win32com自带的Visible模式,即可以在Word或Excel打开的时候直接看到win32com运行的结果,有点像实时调试,关键是还能<strong>撤销</strong>!所以,再分别对sht.ChartObjects和doc.InlineShapes循环选中,发现恰好就是各自文档中图的序列。其中Excel是根据图的生成时间排序的,而Word就是简单粗暴的前后顺序。这样一来,一个简单的想法自然而然就形成了:跟手工操作的时候一样,直接Excel选中某张图,复制,然后去Word里相应位置粘贴即可,只不过需要精心安排一下图片的顺序,再加上一个配置文件,就齐活了!</p>
<p>接下来,当然是想着表格是不是也能如法炮制。Excel选中某个Range自然是再简单不过的事,但是Word就比较蛋疼了,因为选中粘贴的结果是:你会得到两张表…… </p>
<p>替代方案一:把表格内容复制下来,然后覆盖掉Word里对应位置的内容。但是在遇到有合并单元格的时候,Word会非常诡异地不让你覆盖,而且直接报错……</p>
<p>替代方案二:把表删了,然后粘贴。这次会遇到两个问题,第一个是Word默认delete是删掉表中内容,不删表本身,于是第二个问题是合并单元格……</p>
<p>替代方案三:把表剪切了,然后粘贴。这次总算能粘过去了,并且只会留一张表。<strong>但,是,</strong>表的格式变了……</p>
<p>尽管方案三也有着问题,但是最严重的问题解决了,调格式这种东西其实只是劳动密集型的试错工作。所以在花了两个下午不断的通过查文档和录制宏确定代码语法之后,终于把相应代码写进去了,其实也就几行,但是费的功夫真心不少。</p>
<p>结局就是把所有东西拼到一起,我就可以轻松愉快地按需生成报告啦!</p>
<p>最后还有些其他的小Tips:</p>
<ul>
<li><p>win32.Dispatch的方式不能自动补全代码和?,使用win32.gencache.EnsureDispatch的话就可以,这样会大大减少win32.constants的工作量。</p>
</li>
<li><p>在Visible的时候,如果win32com调用的操作之间相隔时间太短,操作是会相互冲突的,所以解决方案是:要么Invisible,要么sleep。</p>
</li>
<li><p>嵌套表格或者表格嵌套图问题都不大,配置文件写清楚就行。</p>
</li>
</ul>
<p>代码示例:</p>
<pre><code>import os
import win32com.client as win32
from time import sleep
# Word Object Model: https://msdn.microsoft.com/en-us/library/office/ff837519.aspx
# Excel Object Model: https://msdn.microsoft.com/en-us/library/office/ff194068.aspx
# Word File Format Enum: https://msdn.microsoft.com/en-us/library/office/ff839952.aspx
# Excel File Format Enum: https://msdn.microsoft.com/en-us/library/office/ff198017.aspx
# {(sheet name, xls chart index): doc chart index}
CHART_MAPPING = {
("Sheet1", 1): 1,
("Sheet1", 2): 2,
("Sheet1", 3): 3,
("Sheet2", 1): 4,
("Sheet2", 2): 5,
("Sheet2", 3): 6,
("Sheet2", 4): 7,
("Sheet2", 5): 8,
("Sheet3", 1): 9,
("Sheet3", 2): 10,
("Sheet3", 3): 11,
("Sheet3", 4): 12,
("Sheet3", 5): 13,
("Sheet3", 6): 14,
("Sheet3", 7): 15,
("Sheet4", 1): 16,
("Sheet4", 2): 17,
("Sheet4", 3): 18,
("Sheet4", 4): 19,
("Sheet4", 5): 20,
("Sheet4", 6): 21,
("Sheet4", 7): 22,
}
# {(sheet name, xls range):
# (doc table index sequence, doc table width %, fitcontent)}
TABLE_MAPPING = {
("Sheet1", "A3:C12"): ((1, ), 60, True),
("Sheet1", "A14:G17"): ((2, ), 100, False),
("Sheet1", "A53:E56"): ((5, 1), 100, True),
("Sheet2", "A4:F7"): ((6, ), 100, False),
("Sheet2", "A11:E20"): ((7, ), 100, False),
("Sheet2", "A25:G27"): ((8, ), 110, True),
("Sheet2", "A57:G59"): ((11, ), 110, True),
("Sheet2", "A105:L115"): ((15, ), 110, True),
("Sheet3", "A7:B10"): ((16, 1), 100, False),
("Sheet3", "A45:H47"): ((19, ), 100, False),
("Sheet4", "A4:F5"): ((25, ), 80, True),
("Sheet4", "A49:D51"): ((29, ), 65, True),
("Sheet4", "A64:D66"): ((31, ), 65, True),
}
def update_doc_report(product, is_save=True, is_visible=False):
docfile = os.path.join(OUTPUT_PATH, product, "report.docx")
xlsfile = os.path.join(OUTPUT_PATH, product, "data_draft.xlsx")
app_wd = win32.gencache.EnsureDispatch("Word.Application")
app_xl = win32.gencache.EnsureDispatch("Excel.Application")
if is_visible:
app_wd.Visible = 1
app_xl.Visible = 1
else:
app_wd.Visible = 0
app_xl.Visible = 0
try:
doc = app_wd.Documents.Open(docfile)
print("{} is open.".format(docfile))
xls = app_xl.Workbooks.Open(xlsfile)
print("{} is open.".format(xlsfile))
# replace charts
for (sht_name, i_xl), i_wd in CHART_MAPPING.items():
print("Chart Mapping: {}-{}".format(sht_name, i_xl))
sht = xls.Worksheets(sht_name)
chart = sht.ChartObjects(i_xl)
# 也可使用chart.CopyPicture(),但图片质量较差
chart.Activate()
chart.Copy()
doc.InlineShapes(i_wd).Range.Paste()
if is_visible:
sleep(1)
# replace table contents
for (sht_name, rng), (idx_wd, table_width, isfitcontent) in TABLE_MAPPING.items():
print("Table Mapping: {}-{}".format(sht_name, rng))
sht = xls.Worksheets(sht_name)
xlsrange = sht.Range(rng)
table = doc.Tables(idx_wd[0])
for i in range(1, len(idx_wd)):
table = table.Tables(idx_wd[i])
table.Range.Select()
app_wd.Selection.Cut()
if is_visible:
sleep(0.5)
xlsrange.Copy()
if is_visible:
sleep(0.5)
app_wd.Selection.PasteSpecial()
# the raw table is cut, so table must be relocated
table = doc.Tables(idx_wd[0])
for i in range(1, len(idx_wd)):
table = table.Tables(idx_wd[i])
table.Rows.Alignment = win32.constants.wdAlignRowCenter
if isfitcontent:
table.AutoFitBehavior(win32.constants.wdAutoFitContent)
else:
table.Range.Select()
app_wd.Selection.Cells.DistributeWidth()
if table_width > 0:
table.PreferredWidthType = win32.constants.wdPreferredWidthPercent
table.PreferredWidth = table_width
if is_visible:
sleep(1)
rng = xls.Worksheets(sht_name).Range("A1")
if is_save:
xls.Save()
print("{} is saved.".format(xlsfile))
doc.Save()
print("{} is saved.".format(docfile))
except:
traceback.print_exc()
finally:
try:
doc.Close(0) # don't save here
print("{} is closed.".format(docfile))
except:
pass
try:
app_wd.Quit()
print("Word is quitted.")
except:
pass
try:
xls.Close(0) # don't save here
print("{} is closed.".format(xlsfile))
except:
pass
try:
app_xl.Quit()
print("Excel is quitted.")
except:
pass
</code></pre>]]></content>
<summary type="html">
<p>这个博客搭了挺久了,本意是当技术博客写的,想记录一些日常开发中积累的技巧。Project Euler的Review是一个不错的切入点,不过我还是高估了自己,430+之后有好几题都比较卡,导致完全没法按计划推进。当中也有过调整策略的想法,该跳的要果断跳。但是光跳433就下了挺大的决心,说服自己改变准则对我这样的人来说还是有点难的。</p>
<p>扯得有点远,回到技术博客的话题上来。这篇的主题其实早就有了腹稿,一直拖着没动。就像减肥或者跑步之类的念头,人总是时不时地会产生跟拖延症抗争的念头。总算这回努力小人打败了懒惰小人,来更一篇。</p>
<p>先说下背景吧,前段时间工作中会面临要定期不定期地经常出一些报告,后台的业务逻辑部分早就写好了,如果对输出要求不那么高的话也能凑合着看。不过领导们嘛总归是并不懂技术,而且报告要给客户们发,更是不能指望,所以开会拍板定下来还是以Word(或者存成pdf)的形式来发。自然而然地,图表风格要用公司的BI,格式也都要统一。作为能写几行代码的人,自然不愿意每次都手动做,但是查了查又没什么通用的方案可以借鉴,到头来还是得自己开动脑筋造个轮子。</p>
</summary>
<category term="Knowledges" scheme="http://coldhumour.github.io/categories/Knowledges/"/>
</entry>
<entry>
<title>The Eudaemonic Pie</title>
<link href="http://coldhumour.github.io/2017/03/20/The-Eudaemonic-Pie/"/>
<id>http://coldhumour.github.io/2017/03/20/The-Eudaemonic-Pie/</id>
<published>2017-03-20T14:28:20.000Z</published>
<updated>2017-03-20T14:30:00.546Z</updated>
<content type="html"><![CDATA[<p>这是一本书,从读的时候开始,直到读完了之后回想细品,我一直都在尝试着给其定一个具体的分类。说它是小说吧,里面的人和事都是真实的;说它是传记吧,对话和描写又显然沾染了很多文学演绎的气息。思虑再三,好像也就是“传奇”可以略略贴近一些。可能把真实发生的事情称作legend略远,然而称作lengedary却是丝毫不为过。这本书少有地于我触动极大,无论是从“励志”的角度,还是从人生经验的角度,用“受益匪浅”来形容都有些不甚恰当了,留下来的更多的是让人仔细品味反复琢磨的东西。</p>
<a id="more"></a>
<p>在知道这本书之前,业已听说过这个beat roulette的故事,虽然可以清晰地记得一些科普读物中提到过,但是似乎模模糊糊地记得最早听人说起是在本科时期,忘了哪门课或者哪个老师话题发散提过一句。各种真真假假的信息碎片拼起来,只是知道曾经有这么一群人做了一件很酷的事情。其时的大概印象,一如《在路上》、《禅与摩托车维修艺术》亦或是各种公路片,时间和景色呼啸着逝去,闪过杂乱的三极管、硅谷的林荫道、内华达的沙漠公路和拉斯维加斯的霓虹灯,成功的喜悦如焰火绽放,而后大家各自散去。</p>
<p>后来读到本书,里面详细地提到了这本书和里面的这些人,Wiki了一下又惊讶地发现和Santa Fe有着千丝万缕的联系,于是就试着去找了找这本书的资源。没有想到的是这书如此冷门,遍寻网络只找到一鳞半爪的信息。亚马逊上原版纸质书倒是有卖,当时还是学生,觉得150+的价格实在太高,于是只能按下满心好奇,留个心眼时不时找一找。没想到的是,这么一拖三四年就过去了,才终于找到了一个机会得以一睹这书的庐山真面目。</p>
<p>我读过的科学史和科学家传记也有几本了,这类书的一大问题就是文笔。有些作者过于想要塑造科学家的伟大,渲染各种类似《读者》或者语文课本里的类似于鸡汤的故事,在作者的想象中科学家就应该具有典型科学家的各种特质;有些作者视角不错,但是对相关领域一窍不通,一说到科学家的具体工作或成就上就只能语焉不详,让人只知道科学家花费了很多心血推公式做实验,但并不理解为什么这些东西是困难的;有些作者是专业出身,能把相关研究和理论的精妙之处描绘出来,而人的存在感就比较稀薄,但是理论往往并不是顺着逻辑顺序研究出来的,如何从未知当中梳理出逻辑贯穿始终的理论体系才是科学家们的价值和魅力所在。</p>
<p>废话了这么多,其实只是想说,这书文笔方面的扬长避短做得非常好。作者是学文学的,于数学和计算机方面了解并不深,然而好就好在他亲身经历了一部分的故事,和那些科学家混久了,对他们在干什么以及为什么能有个概念。通过细致的观察和描写,作者能够把电路元件、制作工艺和开发过程生动地呈现出来,如果读者对科学理论部分有一定了解的话,不难把相应的部分脑补出来。而且在这个过程中,结合自身的经验,对于做这样的一件事情遇到的困难也更是能够设身处地地去感受和体会。</p>
<p>这种文笔也是阅读的一大障碍。我在拿到书之后满怀欣喜地信手翻了两页,发现这本书是个硬骨头。厚是最直观的一个方面,文笔又是另一个方面。作者不愧是学文学出身,用词和句法真是文艺,比方说可以用drink的地方会放一个imbibe,再比方说一堆十几个字母的形容词中文查出来都是五六个字的复合形容词。本来以为我的词汇量读个这种类型的书应该还凑合,结果就实际情况看又学了一堆生词,真是意想不到的收获。也正是拜此所赐,我整整看了有3个多月,一般通勤单程地铁上20分钟能看掉1%-2%,我就已经很开心了。</p>
<p>说到描写,作者对于景物和环境的描写功力相当不错,地下室、逛鞋店、买零件、拉斯维加斯巡游、两次Holloween party,读过必定印象深刻。在这种生动的笔触下,人物塑造也就不成问题了。作者在这方面另一个巨大的优势是,他认识这些人,他跟这些人很熟,所以对话更多是日常交流而非台本,这些人自然而然地就活了起来。每个人都是那么的个性鲜明,能够参与到Eudaemonic Pie核心的人都不是一般人,他们各擅胜场,也正是这种技能的互补,才能够得以把一个看上去几近天方夜谭的想法实现出来。书中提到过,这一想法并没有那么稀罕,诸如Claude Shannon, Edward Thorp等大神早就产生过类似的想法,但是限于时代和人力,他们在实现过程当中撞到了不可逾越的障碍,从而只能将之束之高阁。而Farmer, Norman他们则有了一试的机会,并终于有所斩获。从偏工程师的角度看,这种理论指导实践的实例是科学最大的魅力之一吧。</p>
<p>内容方面没什么好剧透的,就是一群人有了一个想法,然后努力地去付诸实践,取得了一定的成果,但是止步于更大的困难。在这个故事里,过程比结果更为重要。主角们更是从小时候写起,让读者可以了解他们是怎么一步一步学习、成长、相遇,是怎么产生idea、修正idea、设计方案、实践、debug、升级……我个人在做PE的时候经常会遇到类似的局面,比如面对一片空白挑选着手点的时候,想方设法评估思路是否可行的时候,遇到困难斟酌到底是正面进攻或者需要换角度绕过去的时候,以及解决了但是代码不那么漂亮尽力去优化的时候。现在养成了一个习惯,每次完成整理代码的时候都会不自觉地想一想,有没有什么点是可以等到review的时候可以进一步深挖的,这个思路有没有什么更抽象的层级可以应用到其他地方。我做一道小题目的复杂度和格局当然比他们要小得多,不过他们解决问题的方法、态度、考虑的约束都有可借鉴之处,共鸣也好自作多情也好,看到大神们也会为同样的事情所困惑挣扎,是一件比较令人宽慰的事情。</p>
<p>总体说来,除了为这一传奇故事的精彩所吸引,以及从故事中人们的行为当中学习之外,这本书对我最大的意义是给予信心。一些比较复杂的个人项目不定时都有筹划,但性格问题导致目前最大的障碍还是可行性分析,即常常困在我到底有没有能力去完成这些东西,因为时间和精力投入的机会成本实在是太高了,而且基本上不会得到他人的支持。The Eudaemonians给了我一个极佳的范例,即使要做的事情没有先例,即使并不知道会遇到什么困难,即使最后花了三年时间仍然失败了,但是在自己的时间里做一些自己的事情绝对是值得的。</p>
<p>读完这本书,我又再次上网找了找相关的人和事情,发现Thomas Bass还写了一本书,主角还是这一群人,然而故事却改变了,不过那书更加难找就是。幸好Cecilia帮忙,应该可以在美国买到,接下来等她什么时候休假回国就行了。反正The Eudaemonic Pie都等了这么久,也不急于这一时。</p>
]]></content>
<summary type="html">
<p>这是一本书,从读的时候开始,直到读完了之后回想细品,我一直都在尝试着给其定一个具体的分类。说它是小说吧,里面的人和事都是真实的;说它是传记吧,对话和描写又显然沾染了很多文学演绎的气息。思虑再三,好像也就是“传奇”可以略略贴近一些。可能把真实发生的事情称作legend略远,然而称作lengedary却是丝毫不为过。这本书少有地于我触动极大,无论是从“励志”的角度,还是从人生经验的角度,用“受益匪浅”来形容都有些不甚恰当了,留下来的更多的是让人仔细品味反复琢磨的东西。</p>
</summary>
<category term="Reading Life" scheme="http://coldhumour.github.io/categories/Reading-Life/"/>
</entry>
<entry>
<title>Hexo Guide</title>
<link href="http://coldhumour.github.io/2017/03/14/Prophet%20Guide/"/>
<id>http://coldhumour.github.io/2017/03/14/Prophet Guide/</id>
<published>2017-03-14T13:52:00.000Z</published>
<updated>2017-03-14T13:55:09.378Z</updated>
<content type="html"><![CDATA[<p>这两天看到Facebook的Prophet很火,于是也想上手玩玩,试了下才发现这东西并不好装。幸好有之前配置Cython的经验,省去了很多烦恼。</p>
<ol>
<li><p>参见Cython安装教程,配置好Cython和Visual C++ Build Tools 2015</p>
</li>
<li><p>pip install pystan</p>
</li>
<li><p>从<a href="https://github.com/facebookincubator/prophet" target="_blank" rel="external">github/facebookincubator</a>下载prophet-master,解压,进入~/prophet-master/python,python setup.py install</p>
</li>
<li><p>使用方法见<a href="https://facebookincubator.github.io/prophet/" target="_blank" rel="external">官方文档</a></p>
</li>
</ol>
]]></content>
<summary type="html">
<p>这两天看到Facebook的Prophet很火,于是也想上手玩玩,试了下才发现这东西并不好装。幸好有之前配置Cython的经验,省去了很多烦恼。</p>
<ol>
<li><p>参见Cython安装教程,配置好Cython和Visual C++ Build Tools 20
</summary>
<category term="Knowledges" scheme="http://coldhumour.github.io/categories/Knowledges/"/>
</entry>
<entry>
<title>Literature Links</title>
<link href="http://coldhumour.github.io/2017/02/18/Literature%20Links/"/>
<id>http://coldhumour.github.io/2017/02/18/Literature Links/</id>
<published>2017-02-18T07:38:41.000Z</published>
<updated>2017-02-18T11:28:43.694Z</updated>
<content type="html"><![CDATA[<p>一些未曾来及看的或反复看的文章</p>
<a id="more"></a>
<ul>
<li><p><a href="http://www.wildml.com/2015/09/implementing-a-neural-network-from-scratch/" target="_blank" rel="external">Implementing a Neural Network from Scratch in Python</a></p>
</li>
<li><p><a href="http://www.math.harvard.edu/library/sternberg/" target="_blank" rel="external">Dynamic System, Harvard</a></p>
</li>
<li><p><a href="https://gist.github.com/jdkanani/4670615" target="_blank" rel="external">Change Browser to Code Editer</a></p>
</li>
<li><p><a href="http://www.mit.edu/~evanchen/coursework.html" target="_blank" rel="external">Mathematics Course Notes</a></p>
</li>
<li><p><a href="http://www.bearcave.com/misl/misl_tech/wavelets/hurst/" target="_blank" rel="external">Estimate Hurst Exponent</a></p>
</li>
</ul>
]]></content>
<summary type="html">
<p>一些未曾来及看的或反复看的文章</p>
</summary>
<category term="Knowledges" scheme="http://coldhumour.github.io/categories/Knowledges/"/>
</entry>
<entry>
<title>Hexo Guide</title>
<link href="http://coldhumour.github.io/2017/01/01/Hexo%20Guide/"/>
<id>http://coldhumour.github.io/2017/01/01/Hexo Guide/</id>
<published>2017-01-01T04:00:00.000Z</published>
<updated>2017-03-14T13:48:20.785Z</updated>
<content type="html"><![CDATA[<p>其实也没什么特别的Guide,搜索hexo分分钟一大把网页,这里只是为了记一下一些常用的命令和链接,以免临时想写博客结果忘了怎么部署的尴尬。</p>
<pre><code>hexo new "post title"
hexo server # 本地调试
hexo clean
hexo g
hexo d
</code></pre><a id="more"></a>
<p>以前一直在用不老歌,作为个人博客当然没的说,但是作为技术博客还是差了一些功能。之前从@taotao.li大神那里学习了搭github.io,但是那个博客需要对前端倾注太多心血,一直也没空钻研。偶然有一天上S1发现有人提到Hexo,说是简单好用,于是就此存了个心。后来终于找到个比较闲的周末,外面狂风骤雨不得安宁,索兴找了几个教程一步一步走下来,于是也就有了这里。</p>
<p>不得不说Hexo还是相当人性化的,像我这种对前端几乎一窍不通的人也能很轻松的搭起来,简单个性化一下的需求也可以很快地利用现成的主题修改完成,简直懒人福音。</p>
<ul>
<li><a href="https://hexo.io/" target="_blank" rel="external">Hexo.io</a></li>
<li><a href="https://github.com/wuchong/jacman" target="_blank" rel="external">Theme: Jacman</a></li>
<li>页面配置看_config.yml,根目录或者主题目录下都有</li>
<li>hexo server可以实时查看效果</li>
</ul>
]]></content>
<summary type="html">
<p>其实也没什么特别的Guide,搜索hexo分分钟一大把网页,这里只是为了记一下一些常用的命令和链接,以免临时想写博客结果忘了怎么部署的尴尬。</p>
<pre><code>hexo new &quot;post title&quot;
hexo server # 本地调试
hexo clean
hexo g
hexo d
</code></pre>
</summary>
<category term="Knowledges" scheme="http://coldhumour.github.io/categories/Knowledges/"/>
</entry>
</feed>