-
Notifications
You must be signed in to change notification settings - Fork 1
/
atom.xml
281 lines (169 loc) · 53.5 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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>小心地滑</title>
<subtitle>Learn as if you were to live forever.</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://raawaa.github.io/"/>
<updated>2018-05-19T06:34:55.524Z</updated>
<id>http://raawaa.github.io/</id>
<author>
<name>Yu Wenjie</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>Build Cross-platform Hello World with CMake and wxWidgets Pt.1</title>
<link href="http://raawaa.github.io/2018/05/19/Build-Cross-platform-Hello-World-with-CMake-and-wxWidgets-Pt-1/"/>
<id>http://raawaa.github.io/2018/05/19/Build-Cross-platform-Hello-World-with-CMake-and-wxWidgets-Pt-1/</id>
<published>2018-05-19T06:08:45.000Z</published>
<updated>2018-05-19T06:34:55.524Z</updated>
<content type="html"><![CDATA[<p>想尝试一下自己能不能入门 C++,给自己设了一个小目标:撸一个跨平台带 GUI 的 Hello World。GUI 库选择了 wxWidgets。最后花了一整个礼拜的下班时间才搞出来。在这里记下折腾过程。需要分几篇才能写完:</p><ol><li><strong>Windows 下项目构建(本篇)</strong></li><li>Linux 下的项目构建</li><li>改进项目目录结构(out-of-source build)</li><li>将整个 wxWidgets 源码库变成项目内的 git submodule (更好地控制版本依赖)</li></ol><p>废话不多,开始吧!</p><h2>Windows 下编译 wxWidgets</h2><p>下载源码包之后根据源码目录里的文档进行编译。编译过程非常顺利。</p><p>Windows 下编译 wxWidgets 有很多选择,微软 msvc 或者 MinGW gcc 都行。我下载时(2018 年 5 月)wxWidgets 的最新稳定版 3.0.4 直接提供了各种编译器的 Makefile,直接使用即可——据说之后新版会用 CMake 来管理构建。<br>最终编译结果(二进制库文件)会根据所使用的编译器和编译选项,存储在源码目录的 <code>lib</code> 子目录中。例如我使用 msvc 编译器,并指定要带 UNICODE 支持的 DEBUG 版本。则编译结果存储在 <code><wxWidgets源码根目录>/lib/mswud</code> 中。<code>mswud</code> 中的 <code>u</code> 和 <code>d</code> 分别代表 UNICODE 支持和 DEBUG 版本。</p><h2>构建 Hello World 项目</h2><p>有了所依赖的 GUI 图形库,就可以着手新建自己的项目了。项目结构如下:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">wxtest</span></span><br><span class="line">└── <span class="selector-tag">main</span><span class="selector-class">.cpp</span></span><br></pre></td></tr></table></figure><p><code>main.cpp</code> 的内容直接拷贝了 wxWidgets 官网文档中的范例。</p><h5>用 CMake 管理编译</h5><p>因为要跨平台(Windows 和 Linux),同时不想框死在某个 IDE 下,试着用 CMake 作为构建工具。项目根目录下加入 <code>CMakeLists.txt</code>:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">wxtest</span></span><br><span class="line">├── <span class="selector-tag">CMakeLists</span><span class="selector-class">.txt</span></span><br><span class="line">└── <span class="selector-tag">main</span><span class="selector-class">.cpp</span></span><br></pre></td></tr></table></figure><p>第一次写 <code>CMakeLists.txt</code>,能不能 work 全靠人品😒(事后证明不 work,哈哈😂):</p><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># wxtest/CMakeLists.txt</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">cmake_minimum_required</span>(VERSION <span class="number">2.8</span>)</span><br><span class="line"><span class="keyword">project</span>(wxtest)</span><br><span class="line"><span class="keyword">aux_source_directory</span>(. srcs)</span><br><span class="line"><span class="keyword">include_directories</span>($ENV{WXWIN}/<span class="keyword">include</span>/msvc</span><br><span class="line"> $ENV{WXWIN}/<span class="keyword">include</span>)</span><br><span class="line"><span class="keyword">link_directories</span>($ENV{WXWIN}/lib/mswud)</span><br><span class="line"><span class="keyword">add_executable</span>(<span class="variable">${PROJECT_NAME}</span> <span class="variable">${srcs}</span>)</span><br><span class="line"><span class="keyword">target_link_libraries</span>(<span class="variable">${PROJECT_NAME}</span> 加入的库太多了不想打字了此处省略)</span><br></pre></td></tr></table></figure><p>解释一下。<code>WXWIN</code> 是我自己设置的系统环境变量,指定了 wxWidgets 源码根目录的路径。<code>include_directories</code> 和 <code>link_directories</code> 指令告诉编译器该去哪里找 wxWidgets 的头文件和链接库。<code>target_link_libraries</code> 告诉连接器把先前编译好的 wxWidgets 库文件链接进来。</p><p>看起来很完美啊,我们来编译一下……</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">> cmake . -G "MinGW Makefiles"</span><br><span class="line">> mingw32-make -f makefile</span><br></pre></td></tr></table></figure><h5>连接器错误 & FindwxWidgets</h5><p>编译过程中发生了许多链接错误,显然是有些依赖的库没有找到。我尝试了在 <code>CMakeLists.txt</code> 中改变 wxWidgets 链接库的顺序;也试过重新把 wxWidgets 编译成单个库文件(默认编译选项为编译成多个独立模块库文件)。都没法解决。最可疑的还是自己手写的 <code>CMakeLists.txt</code> 。研究了一阵子后,重写了 <code>CMakeLists.txt</code>:</p><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># wxtest/CMakeLists.txt</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">cmake_minimum_required</span>(VERSION <span class="number">2.8</span>)</span><br><span class="line"><span class="keyword">project</span>(wxtest)</span><br><span class="line"><span class="keyword">aux_source_directory</span>(. srcs)</span><br><span class="line"><span class="keyword">add_executable</span>(<span class="variable">${PROJECT_NAME}</span> <span class="variable">${srcs}</span>)</span><br><span class="line"><span class="keyword">set</span>(wxWidgets_ROOT_DIR $ENV{WXWIN})</span><br><span class="line"><span class="keyword">set</span>(wxWidgets_CONFIGURATION mswud)</span><br><span class="line"><span class="keyword">find_package</span>(wxWidgets COMPONENTS net gl core base)</span><br><span class="line"><span class="keyword">if</span>(wxWidgets_FOUND)</span><br><span class="line"> <span class="keyword">include</span>(<span class="variable">${wxWidgets_USE_FILE}</span>)</span><br><span class="line"> <span class="keyword">target_link_libraries</span>(<span class="variable">${PROJECT_NAME}</span> <span class="variable">${wxWidgets_LIBRARIES}</span>)</span><br><span class="line"><span class="keyword">endif</span>()</span><br></pre></td></tr></table></figure><p>改写后的 <code>CMakeLists.txt</code> 通过 <code>find_package</code> 指令调用 <code>FindwxWidgets</code> 这个 CMake 模组去自动寻找 wxWidgets 的头文件和库文件位置。</p><p>读 <code>FindwxWidgets.cmake</code> 的源码可以知道,在 Windows 下 <code>FindwxWidgets</code> 模组的行为是根据 <code>wxWidgets_ROOT_DIR</code> 和 <code>wxWidgets_CONFIGURATION</code> 这两个变量的值去寻找相关文件。所以在 <code>find_package</code> 指令前,需要正确设置这两个变量的值。</p><p>尝试再次编译,成功!</p><h5>之前错在哪里?</h5><p>读 <code>FindwxWidgets.cmake</code> 的源码可以知道,在 Windows 平台下,编译 wxWidgets 项目还需要链接一些额外的库:winmm comctl32 oleacc rpcrt4 shlwapi version wsock32(推测是 wxWidgets 自身在 Windows 平台下的依赖)。而这些库在之前的 <code>CMakeLists.txt</code> 中都没有手动加进去,就会 link 不到啦。</p><p>wxWidgets 自身在 Windows 下还依赖哪些库,可能只有 wxWidgets 的作者自己才会知道——当然,如果有心看一下作者源码目录里示例项目的 makefile 也能发现——但是这次吃瘪的教训是,加入第三方库依赖的时候,还是要利用 CMake 提供的模组比较靠谱。好怀念那些带包管理器的「现代」语言😂。</p><h2>总结一下</h2><p>在 Windows 下一个简单的 GUI 程序终于可以运行了。但是还有许多事情要做呢,因为:</p><ul><li>它目前还并没有跨平台;</li><li>编译出来的可执行文件和 CMake 过程文件混在源代码目录里,一片混乱;</li><li>别人要编译我的项目怎么办?需要自己下载相同版本的 wxWidgets 源码自己编译。如果别人下载的版本不对怎么办呢。是不是可以把 wxWidgets 的整个源码包含在自己的项目里,尽可能地做到 self-contained 呢……?</li></ul>]]></content>
<summary type="html">
<p>想尝试一下自己能不能入门 C++,给自己设了一个小目标:撸一个跨平台带 GUI 的 Hello World。GUI 库选择了 wxWidgets。最后花了一整个礼拜的下班时间才搞出来。在这里记下折腾过程。需要分几篇才能写完:</p>
<ol>
<li><strong>Win
</summary>
</entry>
<entry>
<title>用Org-mode与pandoc编写Word文档</title>
<link href="http://raawaa.github.io/2016/10/12/Writing-docx-with-org-mode-and-pandoc/"/>
<id>http://raawaa.github.io/2016/10/12/Writing-docx-with-org-mode-and-pandoc/</id>
<published>2016-10-12T13:14:22.000Z</published>
<updated>2018-05-19T06:30:32.253Z</updated>
<content type="html"><![CDATA[<pre><code>> Do not do unto others as you would they should do unto you. Their tastes may not be the same.> -- George Bernard Shaw</code></pre><p>日常编辑长文档,能用 Markdown/LaTeX之类的纯文本我当然是最喜欢的了。但是周围人大部分用的都是 Word,坚持自己的怪癖会给别人带来困扰。最近发现了一个曲线救国的办法:使用 Emacs 的 Org-mode 写文档,然后用 pandoc 转成 Word 文件。</p><h2>Pros</h2><ul><li>纯文本,便于版本控制。</li><li>Org-mode 与 Emacs 天生绝配,比 Markdown 有更丰富的功能(比如表格公式计算),比 LaTeX 的坑少(原生中文支持)。</li><li>内容与样式分离。pandoc在文档转换时可以指定一个外部 docx 文件作为样式模板。在 Org-mode 中编辑时只需要关心文档结构和内容。</li><li>通过 pandoc 不但可以生成 docx 格式的 Word 文件,还可以直接转成电子书 epub 格式(可惜如果要放进 Kindle 里还需要加工一下)。</li><li>不用碰鼠标。</li></ul><h2>Cons</h2><ul><li>pandoc 对 docx 文件的支持还是有点问题,比如不能生成交叉引用。</li><li>Org-mode 的表格功能虽然很强大,但是竟然不能跨行合并单元格,啊兮吧~!</li><li>Org-mode 中的「强调」、「下划线」等格式标签无法被 pandoc 识别。</li></ul><p>其实我还可以试一试带着 pandoc 口音的 Markdown 方言。然而截稿时间快到了~</p>]]></content>
<summary type="html">
<pre><code>&gt; Do not do unto others as you would they should do unto you. Their tastes may not be the same.
&gt; -- Georg
</summary>
<category term="Emacs" scheme="http://raawaa.github.io/tags/Emacs/"/>
<category term="Org-mode" scheme="http://raawaa.github.io/tags/Org-mode/"/>
<category term="pandoc" scheme="http://raawaa.github.io/tags/pandoc/"/>
</entry>
<entry>
<title>我的 Linux 常用软件</title>
<link href="http://raawaa.github.io/2016/06/14/my-frequently-used-linux-software/"/>
<id>http://raawaa.github.io/2016/06/14/my-frequently-used-linux-software/</id>
<published>2016-06-14T13:51:26.000Z</published>
<updated>2018-05-19T06:30:32.237Z</updated>
<content type="html"><![CDATA[<pre><code>> Lo! Men have become the tool of their tools.> -- Henry David Thoreau</code></pre><p>记得是去年底,在笔记本上大胆地装上了 Archlinux,就一发不可收拾地爱上了 Linux。现在已经成为了我的家庭主力系统,除非工作上要上 QQ,平时是不会进 Windows 了。在至今的大半年里,基本上已经形成了固定的使用习惯。在此分享一下我在 Linux 上经常使用的工具。</p><a id="more"></a><h3>Spacemacs,开箱即用的 Emacs</h3><p><img src="https://ooo.0o0.ooo/2016/05/23/5742dca78dca4.png" alt="screenshot_2016-05-23_698x283.png"></p><p>如果不谈小拇指的梗,Emacs 的实用性可以甩开 Vim 几条街。由于本身是一个 Lisp 解释器,所以 Emacs 的配置方式要比 Vim 灵活得多。类似于大部分 Zsh 用户都会安装 oh-my-zsh,Emacs 也有许多出名的配置集,比如 Prelude 和 Steve Purcell 的配置。近期在这些配置集中,Spacemacs 迅速窜红,成为了 Github 上星数最高的 Emacs 配置。</p><p>Spacemacs 使用称为「layer」的配置子集来实现模块化地配置,默认已提供了各种丰富的 layer,涵盖了日常的各种需求,可按需手动开启,基本做到开箱即用,无需太多自定义就已经十分顺手了。另外 Spacemacs 对 Vim 用户十分友好,通过 Evil 实现了一套完整的 Vim 按键绑定,配合上 Emacs 的强大功能,可以说丢掉 Vim 毫不心疼。对于 Vim 转过来的用户来说,Spacemacs 是一个很好的起点。</p><h3>i3wm,分屏多任务神器</h3><p><img src="https://ooo.0o0.ooo/2016/06/14/575ffc4f670f4.jpg" alt="IMG_2896.JPG"></p><p>i3wm 是我尝试的第一款也是唯一一款平铺式窗口管理器。同类型的平铺式窗口管理器有很多,比如出境率较高的 awesome 和 xmonad 我都没有使用过。还有什么手动平铺和自动平铺我也搞不太明白。i3 易于配置的特点让我一上手就再也不想尝试别的了。它的配置文件简单易读,自定义起来不会太过折腾。配合 Dmenu 作为软件启动器,操作起来行云流水。</p><p>桌面环境我尝试过不少,Ubuntu 的 Unity、轻量级的 XFCE,以及 Gnome2 和 Gnome3,高中的时候还在电脑上试过神奇的 Enlightment(当时对 Linux 还整不太明白)。如今还是觉得简简单单的一个平铺式窗口管理器最为朴实实用。</p><h3>ranger,用 Vim 的指法管理文件</h3><p><img src="https://ooo.0o0.ooo/2016/05/25/5745b797c7e36.png" alt="ranger.png"></p><p>从重量级的 Gnome 转到 i3 窗口管理器之后,很想找一个轻量的、可以脱离鼠标操作的文件管理器。在使用 ranger 并适应了一段时间后,发现它正是我所想要的。</p><p>ranger 是基于 ncurses 的,所以得从终端启动。按键绑定和许多操作都类似于 Vim。通过多标签和设置 bookmark 等方式可以快速地在目录间跳转。并且和 shell 结合得也很好,可以很方便地对选中的文件或目录执行 shell 命令。</p><h3>briss,在 Kindle 上看 PDF 的折衷办法</h3><p>6 寸的 Kindle 看 PDF 是硬伤。PDF 页面在 6 寸的屏幕里,字不比蚂蚁大多少。唯一让自己好受些的办法是,将 Kindle 横屏,并且去掉页面四周的白边,只留下版心。于是某位好心人用 java 开发了 briss。</p><p>briss 可以很便捷地完成 PDF 文件去白边的操作。它将一本 PDF 书的所有页面重叠在一起,侦测页面四周没有字符重叠的区域。经过处理的 PDF 再导入 Kindle 横屏阅读,读起来就没那么累了。</p><h3>mpv,mplayer 后继有人</h3><p>如果还在用 mplayer,赶快换成 mpv 吧。</p><h3>minidlna,实现家庭视频点播</h3><p>现在不少智能电视和安卓盒子都支持 DLNA 的多媒体分享方式。minidlna 是一个 DLNA 伺服器程序。在 PC 上运行后,可以让播放终端(智能电视、手机、电视盒子等)很方便地浏览和点播 PC 硬盘上的媒体文件。相比之下,Windows 自带的 DLNA 功能似乎必须手动在 PC 上推送,一点也不方便。(Windows 上推荐 PS3 Media Server 作为 DLNA 伺服器,十分强大,甚至支持外挂字幕的推送)</p><p>minidlna 唯一的遗憾是不支持外挂字幕,搞得我每次需要把视频和字幕文件重新封装成一个 mkv 文件之后再到电视上点播。</p><h3>qbittorrent,Linux 下的 µTorrent</h3><p>虽然很多发行版默认的 BT 软件是 Transmission,虽然 Transmission 的确有很多优势(比如无 gui 的 daemon 模式),但我还是比较习惯用 qbittorrent。它的设计更类似于 µTorrent,设置项也比较丰富。</p><h3>poppler,简单实用的 PDF 处理工具</h3><p>poppler 提供了一套操作 PDF 文件的终端命令集,弥补了 Linux 上没有 Acrobat 的不足,虽然功能简单,但基本能满足日常需求了。几个主要的命令工具包括:</p><ul><li><strong>pdfdetach</strong> 提取 PDF 中嵌入的文件</li><li><strong>pdffonts</strong> 查看 PDF 中的字体信息</li><li><strong>pdfimages</strong> 提取 PDF 中的图片</li><li><strong>pdfseparate</strong> 提取 PDF 中的指定页面</li><li><strong>pdftocairo</strong> 将 PDF 转换为图片文件</li><li><strong>pdftohtml</strong> 将 PDF 文件转为 HTML 文件</li><li><strong>pdftotext</strong> 将 PDF 文件转为纯文本</li><li><strong>pdfunite</strong> 将多个 PDF 文件合并为一个 PDF 文件</li></ul>]]></content>
<summary type="html">
<pre><code>&gt; Lo! Men have become the tool of their tools.
&gt; -- Henry David Thoreau
</code></pre>
<p>记得是去年底,在笔记本上大胆地装上了 Archlinux,就一发不可收拾地爱上了 Linux。现在已经成为了我的家庭主力系统,除非工作上要上 QQ,平时是不会进 Windows 了。在至今的大半年里,基本上已经形成了固定的使用习惯。在此分享一下我在 Linux 上经常使用的工具。</p>
</summary>
<category term="Linux" scheme="http://raawaa.github.io/tags/Linux/"/>
</entry>
<entry>
<title>在 Emacs 中使用 IBus 输入法</title>
<link href="http://raawaa.github.io/2016/05/05/input-with-ibus-on-emacs/"/>
<id>http://raawaa.github.io/2016/05/05/input-with-ibus-on-emacs/</id>
<published>2016-05-05T12:26:38.000Z</published>
<updated>2018-05-19T06:30:32.220Z</updated>
<content type="html"><![CDATA[<p>最近不再使用完整的桌面环境,改为单独使用 i3wm 窗口管理器。这样清凉的配置可以为我的古董级笔记本电脑带来新生,但是脱离了桌面环境之后好多东西需要手动配置。比如突然发觉 Emacs 中不能正常使用 IBus 输入中文了……最后查出来是 <code>ibus-daemon</code> 在启动时没有添加 <code>--xim</code> 选项。</p><p>IBus 相关的启动配置如下,因为使用了 display manager 所以写在 <code>~/.xprofile</code> 里。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> LC_CTYPE=zh_CN.UTF-8</span><br><span class="line"><span class="built_in">export</span> XMODIFIERS=@im=ibus</span><br><span class="line"><span class="built_in">export</span> GTK_IM_MODULE=ibus</span><br><span class="line"><span class="built_in">export</span> QT_IM_MODULE=ibus</span><br><span class="line">ibus-daemon -d -x</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p>最近不再使用完整的桌面环境,改为单独使用 i3wm 窗口管理器。这样清凉的配置可以为我的古董级笔记本电脑带来新生,但是脱离了桌面环境之后好多东西需要手动配置。比如突然发觉 Emacs 中不能正常使用 IBus 输入中文了……最后查出来是 <code>ibus-daemon<
</summary>
<category term="Linux" scheme="http://raawaa.github.io/tags/Linux/"/>
<category term="Emacs" scheme="http://raawaa.github.io/tags/Emacs/"/>
<category term="IBus" scheme="http://raawaa.github.io/tags/IBus/"/>
</entry>
<entry>
<title>修复 Linux 用户和用户组完整性</title>
<link href="http://raawaa.github.io/2016/04/13/fix-password-and-group-files-integrity/"/>
<id>http://raawaa.github.io/2016/04/13/fix-password-and-group-files-integrity/</id>
<published>2016-04-13T04:17:59.000Z</published>
<updated>2018-05-19T06:30:32.170Z</updated>
<content type="html"><![CDATA[<pre><code>> Don't confuse things that need action with those that take care of themselves.</code></pre><p>Linux 中安装一些软件的时候,会自动在系统中创建相应的用户。比如 mysql、各种 display manager,以及我用来在家里实现 DLNA 视频点播的 minidlna 等等。然而当卸载这些软件的时候,当初自动创建的用户可能还留存在系统中,需要我们手动删除。这几天我就碰到了这样的例子。</p><a id="more"></a><p>连续几个月,我一直在开机日志中看到一句错误提示:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">4月 12 23:00:05 raawaa-desktop-arch systemd[1]: Starting Verify integrity of password and group files...</span><br><span class="line">4月 12 23:00:05 raawaa-desktop-arch systemd[1]: Failed to start Verify integrity of password and group files.</span><br></pre></td></tr></table></figure><p>google 了一番,知道了错误是 shadow.service 这个服务引起的,通过 <code>systemctl status shadow.service</code> 命令查看了一下该服务状态:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">● shadow.service - Verify integrity of password and group files</span><br><span class="line">Loaded: loaded (/usr/lib/systemd/system/shadow.service; static; vendor preset: disabled)</span><br><span class="line">Active: failed (Result: <span class="built_in">exit</span>-code) since 二 2016-04-12 23:00:05 CST; 17min ago</span><br><span class="line">Process: 377 ExecStart=/usr/bin/pwck -r (code=exited, status=2)</span><br><span class="line">Main PID: 377 (code=exited, status=2)</span><br><span class="line"></span><br><span class="line">4月 12 23:00:05 raawaa-desktop-arch systemd[1]: Starting Verify integrity of password and group files...</span><br><span class="line">4月 12 23:00:05 raawaa-desktop-arch pwck[377]: user <span class="string">'lightdm'</span>: directory <span class="string">'/var/lib/lightdm'</span> does not exist</span><br><span class="line">4月 12 23:00:05 raawaa-desktop-arch pwck[377]: pwck: no changes</span><br><span class="line">4月 12 23:00:05 raawaa-desktop-arch systemd[1]: shadow.service: Main process exited, code=exited, status=2/INVALIDARGUMENT</span><br><span class="line">4月 12 23:00:05 raawaa-desktop-arch systemd[1]: Failed to start Verify integrity of password and group files.</span><br><span class="line">4月 12 23:00:05 raawaa-desktop-arch systemd[1]: shadow.service: Unit entered failed state.</span><br><span class="line">4月 12 23:00:05 raawaa-desktop-arch systemd[1]: shadow.service: Failed with result <span class="string">'exit-code'</span>.</span><br></pre></td></tr></table></figure><p>从以上信息可以发现,是 lightdm 这个用户出错了,<code>/etc/passwd</code> 文件中存在这个用户,但是相应的用户文件夹(<code>/var/lib/lightdm</code>)却不存在于文件系统中。回忆当初,我好像确实安装过 lightdm 作为我的 display manager,但之后又把它卸载了。看来卸载过程自动删除了 <code>/var/lib/lightdm</code> 文件夹,却没有连带一起删除 <code>/etc/passwd</code> 中所登记的 lightdm 这个用户。解决方法也很简单,直接将该用户删除。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 删除用户 lightdm,-r 选项确保用户文件夹连带删除</span></span><br><span class="line">$ sudo userdel -r lightdm</span><br><span class="line"><span class="comment"># 重新启动 shadow 服务</span></span><br><span class="line">$ systemctl start shadow.service</span><br></pre></td></tr></table></figure><p>如此一来相信今后不会再出现类似的开机错误信息了。平时也可以通过 <code>pwck</code> 和 <code>grpck</code> 这两个命令来诊断修复用户和用户组相关的配置文件,在此一并记下备忘。</p><p>另外,谁能告诉我 shadow.service 这个 systemd 服务究竟是干嘛的,不胜感激。</p>]]></content>
<summary type="html">
<pre><code>&gt; Don't confuse things that need action with those that take care of themselves.
</code></pre>
<p>Linux 中安装一些软件的时候,会自动在系统中创建相应的用户。比如 mysql、各种 display manager,以及我用来在家里实现 DLNA 视频点播的 minidlna 等等。然而当卸载这些软件的时候,当初自动创建的用户可能还留存在系统中,需要我们手动删除。这几天我就碰到了这样的例子。</p>
</summary>
<category term="Linux" scheme="http://raawaa.github.io/tags/Linux/"/>
</entry>
<entry>
<title>我所遇到过的入门好书</title>
<link href="http://raawaa.github.io/2016/04/09/cs-for-beginners/"/>
<id>http://raawaa.github.io/2016/04/09/cs-for-beginners/</id>
<published>2016-04-09T01:22:57.000Z</published>
<updated>2018-05-19T06:31:12.557Z</updated>
<content type="html"><![CDATA[<blockquote><p>Learn as if you were to live forever.<br>—— Mahatma Gandhi</p></blockquote><p>我写程序的水平很业余,但是对于如何做一名入门级菜鸟这件事,我是很资深的。就好像一个长期留级的一年级小学生,虽然功课很差,但是当小学生的经验却很丰富。在我刚刚自学写程序的时候,喜欢先拿一本语言书开始啃,然后学习一个框架开始直接尝试做做小东西,但是写了没多久脑子里就不断涌现出各种自己回答不了的问题,这些问题像水槽里的脏盘子一样,总有一天不得不面对。我现在只想踏踏实实的回头打一下基础,顺便分享一下过程中遇到的好书吧。</p><a id="more"></a><h3>《计算机程序的构造和解释》</h3><p><img src="https://mitpress.mit.edu/sicp/graphics/main-banner.gif" alt="sicp"></p><p>这本“巫师书”实在是太出名了,常常被简称为 SICP(Structure and Interpretation of Computer Programs),是 MIT 的课本(课程代号 CS6.001)。这门课从 1980 年一直教到 2008 年,横跨近三十年。也说明这是一本经得起时间考验的课本。1986 年,该课程的两位老师(也是这本书的作者) Hal Abelson 和 Gerald Jay Sussman 给惠普员工做了一次全套讲座,讲座全程录像,也是这门课在历史上留下的唯一的视频资料(绝对渣画质)。本书可以免费在线阅读,机械工业出版社出过中文版。</p><p>年初春节的时候,我买了中文版,看了两集讲座视频。让我很介意的是,这门课用 Lisp 作为教学语言,一门可能我今后一辈子都用不到的语言(除了给 Emacs 写配置文件),我不想把宝贵的时间花在学 Lisp 上。况且搞 Lisp 的人后来都出事了(田春冰河跟老婆离婚、李杀穷到交不起房租……)。</p><ul><li><a href="http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/" target="_blank" rel="noopener">http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/</a></li></ul><h3>《Composing Programs》</h3><p><img src="https://ooo.0o0.ooo/2016/04/08/57084401d8fc6.png" alt="Composing Programs"></p><p>这本书只能在线阅读,并没有实体版。这本书同时也是 UC Berkeley 大学本科生计算机入门课程的课本(课程代号 CS61A),作者 John DeNero 同时也是这门课的教师(现在的授课老师好像已经换人了)。另外 UC Berkeley 十分开放,CS61A 这门课的资料是完全公开的,包括讲座视频、幻灯、大作业小作业,以及作业答案。我目前跟着2015 年春季那一期的课程学到第四周。之所以喜欢它,是因为它的内容是根据 SICP 来写的,几乎就是将 SICP 翻译成了 python 的版本。哦对了,我还没有说,它的教学语言用的是 python,相比原版 SICP 课程难度要小一些,没有那么强的挫败感。另外吸引我的一个地方是,课程后期你将学会如何写一个简单的 python 解释器。</p><ul><li>CS61A, Spring 2015: <a href="http://inst.eecs.berkeley.edu/~cs61a/sp15/" target="_blank" rel="noopener">http://inst.eecs.berkeley.edu/~cs61a/sp15/</a></li><li>Composing Programs: <a href="http://composingprograms.com/" target="_blank" rel="noopener">http://composingprograms.com/</a></li></ul><h3>《A Computer Science Tapestry》</h3><p><img src="https://www.cs.duke.edu/csed/tapestry/tapestrycover.png" alt="A Computer Science Tapestry, second edition"></p><p>对这本书的了解不多,只知道是杜克大学的人写的。本书的纸质版本已经绝版,作者把电子 PDF 版本放上了网,大家可以随意下载。我觉得这是一本入门好书是因为,它用的教学语言是 C++,然而却又不是一本只讲语言的书。就好象书的副标题所说的:用 C++ 探索计算机科学与编程。不过这本书的很多地方实在是太偏「入门」了,对我来说有点罗嗦,所以目前并不打算看。何况全书 879 页,堪比《C++ Primer》,读起来是一笔不小的时间投入,推荐给零基础想入门 C++ 的同学。</p><ul><li>A Computer Science Tapestry, second edition: <a href="https://www.cs.duke.edu/csed/tapestry/" target="_blank" rel="noopener">https://www.cs.duke.edu/csed/tapestry/</a></li></ul><h3>Handmade Hero</h3><p><img src="https://ooo.0o0.ooo/2016/04/08/57085000f203c.jpg" alt="Handmade Hero - Announcement Trailer"></p><p>这并不是一本书,而是一套连载的视频教程。某个叫 <a href="http://mollyrocket.com/casey/about.html" target="_blank" rel="noopener">Casey Muratori</a> 的人正在做一款叫 Handmade Hero 的游戏。为什么叫 Handmade 呢?因为他不会用到任何游戏引擎,甚至不用 OpenGL、DirectX 这种东西,完全用 C 从头开始写,并且不是玩玩票的,按他的说法,要写一个 “professional-quality game”。但他的目的并不只是写游戏,而是教大家怎么用这种古早的办法写游戏,每个工作日的晚上8点,Muratori 会在 twitch 上直播他写代码的全过程,并且一边写代码一边解释 "每一行代码",目前他已经坚持了快 300 天了!当我知道有这么一件事的时候,我激动得快要晕过去了,我要把这些视频全部拖下来珍藏。</p><p>最后感慨一下,老师、学伴和一整段连续的空余时间都是很珍贵的东西,但自己在拥有的时候不知道珍惜。</p>]]></content>
<summary type="html">
<blockquote>
<p>Learn as if you were to live forever.<br>
—— Mahatma Gandhi</p>
</blockquote>
<p>我写程序的水平很业余,但是对于如何做一名入门级菜鸟这件事,我是很资深的。就好像一个长期留级的一年级小学生,虽然功课很差,但是当小学生的经验却很丰富。在我刚刚自学写程序的时候,喜欢先拿一本语言书开始啃,然后学习一个框架开始直接尝试做做小东西,但是写了没多久脑子里就不断涌现出各种自己回答不了的问题,这些问题像水槽里的脏盘子一样,总有一天不得不面对。我现在只想踏踏实实的回头打一下基础,顺便分享一下过程中遇到的好书吧。</p>
</summary>
</entry>
<entry>
<title>危险! 分离头指针</title>
<link href="http://raawaa.github.io/2016/04/07/git-detached-head/"/>
<id>http://raawaa.github.io/2016/04/07/git-detached-head/</id>
<published>2016-04-07T04:29:12.000Z</published>
<updated>2018-05-19T06:30:51.883Z</updated>
<content type="html"><![CDATA[<pre><code>> At the source of every error which is blamed on the computer you will find at least two human errors, including the error of blaming it on the computer.</code></pre><p>这个博客是用 <a href="https://hexo.io" target="_blank" rel="noopener">Hexo</a> 生成的静态网站,文章内容用 Git 作版本控制。前几天在一次提交之后,发现提交的内容不见了,到底发生了什么?</p><a id="more"></a><h3>案件回放</h3><p>当时我认为自己正处在 <code>master</code> 分支上,编辑提交后随手查看了一下 <code>git log</code> ,发现 <code>master</code> 分支指针仍指在前一次提交上,并没有前进。这是我第一次碰到这种情况,当我发现有些不对劲的时候,我无知地直接检出了 <code>master</code> 分支。于是刚刚提交的改动都消失不见了,从 log 里也找不到那次提交的痕迹。这也要怪 <a href="https://magit.vc/" target="_blank" rel="noopener">Magit!</a> 没有给我任何警告,倒是命令行下的 git 给出一行提示:我处于分离头指针状态,</p><h3>分离头指针(detached HEAD)</h3><p><img src="http://i.stack.imgur.com/ql2gY.png" alt="detached HEAD"></p><p>通常,我们工作在某一个分支上,比如 master 分支。这个时候 master 指针和 HEAD 指针是一起前进的,每做一次提交,这两个指针就会一起向前挪一步。但是在某种情况下(例如 checkout 了某个具体的 commit),master 指针 和 HEAD 指针这种「绑定」的状态就被打破了,变成了分离头指针状态。我那天遇到的情况是,master 和 HEAD 指针看上去指在同一个 commit 上,但其实已经处在分离头指针状态。当我在此时又做了一次新的提交时,HEAD 指针跑到 master 指针前面去了。如果我直接检出 master 分支,HEAD 指针就会回退一格到 master 指针的位置,而最新的那次提交就变成了孤立的提交,没有任何分支能追踪到它,刚才的活白干了。</p><p>吃一堑长一智,下面是解决办法:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 强制将 master 分支指向当前头指针的位置</span></span><br><span class="line">git branch -f master HEAD</span><br><span class="line"><span class="comment"># 检出 master 分支</span></span><br><span class="line">git checkout master</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<pre><code>&gt; At the source of every error which is blamed on the computer you will find at least two human errors, including the error of blaming it on the computer.
</code></pre>
<p>这个博客是用 <a href="https://hexo.io" target="_blank" rel="noopener">Hexo</a> 生成的静态网站,文章内容用 Git 作版本控制。前几天在一次提交之后,发现提交的内容不见了,到底发生了什么?</p>
</summary>
<category term="Git" scheme="http://raawaa.github.io/tags/Git/"/>
</entry>
<entry>
<title>Nvidia 闭源驱动导致 GDM 故障</title>
<link href="http://raawaa.github.io/2016/04/04/gdm-wont-start-on-boot-with-nvidia-drivers/"/>
<id>http://raawaa.github.io/2016/04/04/gdm-wont-start-on-boot-with-nvidia-drivers/</id>
<published>2016-04-04T14:03:13.000Z</published>
<updated>2018-05-19T06:30:32.170Z</updated>
<content type="html"><![CDATA[<p>昨日升级 Arch 后发生严重故障:启动后 GDM 直接歇菜了。</p><a id="more"></a><p><img src="http://i.stack.imgur.com/64xP5.jpg" alt="Oh no! Something has gone wrong."></p><p>第一想到的就是显卡驱动的问题,于是将闭源驱动替换为 nouveau。系统能正常启动了。到 Arch 官网上搜了一下,2015年十月份的时候已经有鬼佬报了相同的 Bug (<a href="https://bugs.archlinux.org/task/46769?project=1&cat%5B0%5D=2&string=gdm" target="_blank" rel="noopener">FS#46769</a>)。</p><p>再次提醒一下自己,更换显卡驱动的时候不能忘记删除原有的 <code>xorg.conf</code> 配置文件。</p>]]></content>
<summary type="html">
<p>昨日升级 Arch 后发生严重故障:启动后 GDM 直接歇菜了。</p>
</summary>
<category term="Archlinux" scheme="http://raawaa.github.io/tags/Archlinux/"/>
<category term="Nvidia" scheme="http://raawaa.github.io/tags/Nvidia/"/>
<category term="Bug" scheme="http://raawaa.github.io/tags/Bug/"/>
</entry>
<entry>
<title>如何在RIME输入法中使用小鹤双拼(linux)</title>
<link href="http://raawaa.github.io/2016/04/04/how-to-enable-flypy-in-rime-on-linux/"/>
<id>http://raawaa.github.io/2016/04/04/how-to-enable-flypy-in-rime-on-linux/</id>
<published>2016-04-04T07:37:15.000Z</published>
<updated>2018-05-19T06:30:32.197Z</updated>
<content type="html"><![CDATA[<p>在 Windows 版的 RIME 输入法中,已经内置了各种常用的输入方案,而且有图形化的配置工具,开箱即用。Linux 下就是另一回事了,安装之后默认只有全拼,要用上小鹤双拼还得自己动手。</p><a id="more"></a><h1>安装 Rime 和双拼方案</h1><h2>Ubuntu 下:</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装 ibus-rime ,据说 fcitx-rime 不是官方维护的。</span></span><br><span class="line">$ sudo apt-get install ibus-rime</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装双拼方案</span></span><br><span class="line">$ sudo apt-get insatll librime-data-double-pinyin</span><br></pre></td></tr></table></figure><h2>Archlinux 下:</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo pacman -S ibus-rime <span class="comment"># Archlinux 下已自带双拼方案,无需另外安装</span></span><br></pre></td></tr></table></figure><h1>激活小鹤双拼方案选项</h1><p>安装完 Rime 之后默认的方案选单里并没有小鹤双拼,需要自己添加进去。新建配置文件 <code>~/.config/ibus/rime/default.custom.yaml</code>, 添加如下内容:</p><figure class="highlight yaml"><figcaption><span>default.custom.yaml</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">patch:</span></span><br><span class="line"><span class="attr"> schema_list:</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">luna_pinyin</span> <span class="comment"># 朙月拼音</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">luna_pinyin_simp</span> <span class="comment"># 朙月拼音 简化字模式</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">luna_pinyin_tw</span> <span class="comment"># 朙月拼音 臺灣正體模式</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">terra_pinyin</span> <span class="comment"># 地球拼音 dì qiú pīn yīn</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">bopomofo</span> <span class="comment"># 注音</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">jyutping</span> <span class="comment"># 粵拼</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">cangjie5</span> <span class="comment"># 倉頡五代</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">cangjie5_express</span> <span class="comment"># 倉頡 快打模式</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">quick5</span> <span class="comment"># 速成</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">wubi86</span> <span class="comment"># 五笔 86</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">wubi_pinyin</span> <span class="comment"># 五笔拼音混合輸入</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">double_pinyin</span> <span class="comment"># 自然碼雙拼</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">double_pinyin_mspy</span> <span class="comment"># 微軟雙拼</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">double_pinyin_abc</span> <span class="comment"># 智能 ABC 雙拼</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">double_pinyin_flypy</span> <span class="comment"># 小鶴雙拼</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">wugniu</span> <span class="comment"># 吳語上海話(新派)</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">wugniu_lopha</span> <span class="comment"># 吳語上海話(老派)</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">sampheng</span> <span class="comment"># 中古漢語三拼</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">zyenpheng</span> <span class="comment"># 中古漢語全拼</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">ipa_xsampa</span> <span class="comment"># X-SAMPA 國際音標</span></span><br><span class="line"><span class="attr"> - schema:</span> <span class="string">emoji</span> <span class="comment"># emoji 表情</span></span><br></pre></td></tr></table></figure><p>这里不光添加了小鹤双拼,还添加了其他方案的选单。好了,之后就可以通过 Rime 的快捷键 Ctrl-` 来选择小鹤双拼了。</p>]]></content>
<summary type="html">
<p>在 Windows 版的 RIME 输入法中,已经内置了各种常用的输入方案,而且有图形化的配置工具,开箱即用。Linux 下就是另一回事了,安装之后默认只有全拼,要用上小鹤双拼还得自己动手。</p>
</summary>
<category term="Linux" scheme="http://raawaa.github.io/tags/Linux/"/>
<category term="Rime" scheme="http://raawaa.github.io/tags/Rime/"/>
</entry>
<entry>
<title>〔译〕基础能源公司如何从大数据中获益</title>
<link href="http://raawaa.github.io/2016/03/16/How-utilities-are-profiting-from-Big-Data-analytics/"/>
<id>http://raawaa.github.io/2016/03/16/How-utilities-are-profiting-from-Big-Data-analytics/</id>
<published>2016-03-16T12:05:52.000Z</published>
<updated>2018-05-19T06:30:32.207Z</updated>
<content type="html"><![CDATA[<p><a href="http://eandt.theiet.org/magazine/2014/01/data-on-demand.cfm" target="_blank" rel="noopener">原文</a>刊载于工程与技术杂志(Engineering and Technology Magazine)2014年第一期,水平有限,翻译之后读起来反而更费劲了。</p><blockquote><p>在欧洲,面向商用和民用的供电、燃气、供水公司为了深入了解用户趋势、提高效益,都在寻找方法分析它们的智能系统所产生的海量数据。</p></blockquote><a id="more"></a><p>基于智能仪表、智能电网和强大的客户关系管理系统(CRM),在公共服务业的新时代里,公共事业公司们正热衷于分析开始被产生出来的海量数据。欧洲的电力、燃气、水供应商们开始探索如何通过「大数据」分析处理大量的信息,无论这些信息已经存在,还是即将产生于不断问世的大量智能仪表。</p><p>市场分析机构 GTM Research 预测,随着水、电、气的供应商们在世界各地区增加投资,全球的公共事业在数据分析上的支出将从 2012 年的 7 亿美元增长到 2020 年的 38 亿美元。提及那些期望采用 Hadoop 的数据管理平台以及大数据大规模并行处理(MPP)等技术的公司,GTM 的 David J Leeds 将此种对数据分析软件的重视描述为「对公共事业的一次再创造」。</p><p>时至今日,对于分析软件的应用已经些许超越了传统的智能商务和用于市场分析的数据仓库工具的范畴,随着专用硬件和大数据处理平台的发展,对于数据的处理能力正在不断提升,更快地过滤、分析,以及从大量数据集中寻找有意义的信息变得可能,并且正在超越这些主要的应用场景。</p><p>防止客户流失是许多公共事业公司要面临的问题,尤其是在没有政府政策门槛的市场,有更多的竞争者通过限时低价的方式争夺潜在客户。通过对诸如用户的信息与能源用量、打包价以及针对特定企业和个人用户的优化定价等数据的统计学分析,供容易找到它们中的内在联系。此外,从社交媒体网站产生的信息中还诞生了「趋势分析」这个东西——通常指的是对于当前定价和服务水平的客户满意度的分析。</p><p>「数据过去就有,只不过现在数据的量更大了,但同时也产生了过去得不到的新数据,」软件方案提供商 SAP 的能源方案主管 James McLelland 说道,「我们发现一些有趣的用例正在诞生出来,多数是在智能仪表分析和智能电网方面。」</p><p>分析信息的过程遵循一个标准的模式。原始数据从智能仪表、电网上的传感器、工业设备、数据库、收集点或其他设备上采集起来。之后通过某种形式的远距离通信、射频识别(RFID)或有线/无线网络传输至服务器或专用设备上,这些服务器或专用设备只负责单一的工作——清理数据。这项工作以往由「大型数据仓库」实现,但现在通过 Apache Hadoop 集群和内存数据库(此类数据库将数据存储在内存中而非硬盘中)可以大大地提速这一过程。Apache Hadoop 是可运行在商用硬件集群上,用于数据存储和大规模数据处理的一款开源软件框架。</p><p>在「脏数据」(重复的或不完整的数据)被清理掉之后,剩余的信息被发送到分析引擎,在其上运行一系列的算法,这些算法即所谓的「秘密配方」,被设计用来寻找数据的内在的意义,以便之后用于第三方报告或数据可视化软件。</p><h1>智能仪表拓展了数据的疆域</h1><p>对数据规模的精确估计即便可能,也很难做到。SAP 的 McLelland 相信,在智能仪表的帮助下,未来由能源设施产生的数据规模将从几 G 字节上升到几千 T 字节的数量级。另有来自 GigaOM 网站文章估计,智能仪表的普及将在全球产生每年百万 T 字节的数据。可持续能源中心(Centre for Sustainable Energy, CSE)是一家由公共、私人、志愿者组织组成的联合机构,其目的在于探索应对日益严重的能源消耗和气候变化问题的技术和方法。</p><p>2012年,它们与「西方配电」、「苏格兰及南方能源」、「布里斯托大学」合作发起一个项目,开发一套名为「基于 Hadoop 的智能仪表分析」(Smart Meter Analytics, Scaled by Hadoop)的大数据平台原型,根据其设计可以存储、处理、收集最大 20TB 大小的数据集,相当于13个家庭一年产生的数据量。</p><p>毫无疑问,智能仪表的部署提高了仪表读数的读取频率,CSE 估计,英国消费的一半电力是每 6 个月才读一次读数的,尽管电价计费是以半小时为单位的。CSE 还解释道,目前的表计读数无法提供一天中不同时段的用电情况,而这些数据对于建立精确的用户档案十分关键。</p><p>“我们期望能源用户能参与到公司的决策中来,”英国国家电网输电未来策略团队的 Mark Osborne 解释道,"过去,你所能做的只是每季度得到一张账单,或者去 <a href="http://uSwitch.com" target="_blank" rel="noopener">uSwitch.com</a> 换一家服务商。但是如今你可以选择在早晨或傍晚电费便宜的时候洗衣服。"</p><p>E.ON 集团,一家覆盖全球30个国家的跨国公司,已经与瑞典电信设备供应商「爱立信」建立合约,于 2013 年至 2018 年期间在瑞典安装超过 60 万个智能电表,此举被描述为迈向实时大数据计量的重要一步,以便为 E.ON 的客户提供精确及时的用能信息。</p><p>(未完待续)</p>]]></content>
<summary type="html">
<p><a href="http://eandt.theiet.org/magazine/2014/01/data-on-demand.cfm" target="_blank" rel="noopener">原文</a>刊载于工程与技术杂志(Engineering and Technology Magazine)2014年第一期,水平有限,翻译之后读起来反而更费劲了。</p>
<blockquote>
<p>在欧洲,面向商用和民用的供电、燃气、供水公司为了深入了解用户趋势、提高效益,都在寻找方法分析它们的智能系统所产生的海量数据。</p>
</blockquote>
</summary>
<category term="BigData" scheme="http://raawaa.github.io/tags/BigData/"/>
<category term="Hadoop" scheme="http://raawaa.github.io/tags/Hadoop/"/>
</entry>
<entry>
<title>测试 MathJax 公式显示</title>
<link href="http://raawaa.github.io/2015/11/05/test-mathjax/"/>
<id>http://raawaa.github.io/2015/11/05/test-mathjax/</id>
<published>2015-11-05T15:10:11.000Z</published>
<updated>2018-05-19T06:30:32.253Z</updated>
<content type="html"><![CDATA[<p>\begin{equation}<br>E = mc^{2}<br>\end{equation}</p>]]></content>
<summary type="html">
<p>\begin{equation}<br>
E = mc^{2}<br>
\end{equation}</p>
</summary>
</entry>
</feed>