-
Notifications
You must be signed in to change notification settings - Fork 0
/
atom.xml
571 lines (542 loc) · 33.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
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
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<id>https://imarkofu.github.io</id>
<title>imarkofu's blog</title>
<updated>2021-06-19T15:46:26.214Z</updated>
<generator>https://github.com/jpmonette/feed</generator>
<link rel="alternate" href="https://imarkofu.github.io"/>
<link rel="self" href="https://imarkofu.github.io/atom.xml"/>
<subtitle>the most important thing is endurance.</subtitle>
<logo>https://imarkofu.github.io/images/avatar.png</logo>
<icon>https://imarkofu.github.io/favicon.ico</icon>
<rights>All rights reserved 2021, imarkofu's blog</rights>
<entry>
<title type="html"><![CDATA[mysql-5.7.34-winx64安装]]></title>
<id>https://imarkofu.github.io/post/mysql-5-7-34-winx64-install/</id>
<link href="https://imarkofu.github.io/post/mysql-5-7-34-winx64-install/">
</link>
<updated>2021-06-19T15:17:48.000Z</updated>
<summary type="html"><![CDATA[<h2 id="下载">下载</h2>
<p>官网[ https://dev.mysql.com/downloads/mysql/5.7.html ]下载mysql5.7.34,选择zip;</p>
]]></summary>
<content type="html"><![CDATA[<h2 id="下载">下载</h2>
<p>官网[ https://dev.mysql.com/downloads/mysql/5.7.html ]下载mysql5.7.34,选择zip;</p>
<!-- more -->
<figure data-type="image" tabindex="1"><img src="https://imarkofu.github.io/post-images/1624116256763.png" alt="" loading="lazy"></figure>
<figure data-type="image" tabindex="2"><img src="https://imarkofu.github.io/post-images/1624116526129.png" alt="" loading="lazy"></figure>
<h2 id="解压配置">解压配置</h2>
<ol>
<li>解压到[C:\Program Files\mysql]目录</li>
<li>建立data文件夹</li>
<li>新建my.ini文件<br>
<img src="https://imarkofu.github.io/post-images/1624116734018.png" alt="" loading="lazy"><br>
my.ini文件内容如下</li>
</ol>
<pre><code class="language-shell">
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=C:\\Program Files\\mysql\\mysql-5.7.34-winx64
datadir=C:\\Program Files\\mysql\\mysql-5.7.34-winx64\\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
innodb_flush_method=normal
[client]
#设置3306端口
port = 3306
</code></pre>
<h2 id="安装并初始化">安装并初始化</h2>
<p>管理员身份打开cmd,进入[C:\Program Files\mysql\mysql-5.7.34-winx64\bin]目录;执行以下指令</p>
<ol>
<li>mysqld --install,生成mysql实例,打开服务:<br>
执行如下命令:net start MySQL<br>
或到电脑服务列表中找到MySQL服务,并启动<br>
<img src="https://imarkofu.github.io/post-images/1624117086839.png" alt="" loading="lazy"></li>
<li>mysqld --initialize --user=mysql --console,此时终端显示随机密码,需要记住,后面会使用到:<br>
<img src="https://imarkofu.github.io/post-images/1624117374482.png" alt="" loading="lazy"></li>
<li>修改mysql密码:输入命令行mysql -uroot -p,输入临时密码即可登录数据库成功<pre><code class="language-shell">ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
flush privileges;
</code></pre>
</li>
</ol>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Debian 官方源换为国内的源的操作方法]]></title>
<id>https://imarkofu.github.io/post/debian-switch-source/</id>
<link href="https://imarkofu.github.io/post/debian-switch-source/">
</link>
<updated>2021-06-09T07:12:24.000Z</updated>
<summary type="html"><![CDATA[<h2 id="描述">描述</h2>
<p>debian操作系统,apt-get update 报错,采用更换源的方式解决问题。</p>
<pre><code class="language-shell">E: Release file for http://deb.debian.org/debian/dists/buster-updates/InRelease is not valid yet (invalid for another 7h 27min 25s). Updates for this repository will not be applied.
E: Release file for http://security.debian.org/debian-security/dists/buster/updates/InRelease is not valid yet (invalid for another 1h 35min 41s). Updates for this repository will not be applied.
</code></pre>
]]></summary>
<content type="html"><![CDATA[<h2 id="描述">描述</h2>
<p>debian操作系统,apt-get update 报错,采用更换源的方式解决问题。</p>
<pre><code class="language-shell">E: Release file for http://deb.debian.org/debian/dists/buster-updates/InRelease is not valid yet (invalid for another 7h 27min 25s). Updates for this repository will not be applied.
E: Release file for http://security.debian.org/debian-security/dists/buster/updates/InRelease is not valid yet (invalid for another 1h 35min 41s). Updates for this repository will not be applied.
</code></pre>
<!-- more -->
<h2 id="解决">解决</h2>
<p>尝试更换源来解决,将 sources.list 文件复制到 /etc/apt/sources.list 下,更新即可。</p>
<h3 id="阿里云源">阿里云源</h3>
<pre><code class="language-shell">deb http://mirrors.aliyun.com/debian/ buster main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib
deb http://mirrors.aliyun.com/debian-security buster/updates main
deb-src http://mirrors.aliyun.com/debian-security buster/updates main
deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib
</code></pre>
<h3 id="清华源">清华源</h3>
<pre><code class="language-shell"># 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free
</code></pre>
<h3 id="docker示例">Docker示例</h3>
<pre><code class="language-shell">RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak && \
echo "deb http://mirrors.aliyun.com/debian/ buster main non-free contrib" >/etc/apt/sources.list && \
echo "deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib" >>/etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian-security buster/updates main" >>/etc/apt/sources.list && \
echo "deb-src http://mirrors.aliyun.com/debian-security buster/updates main" >>/etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib" >>/etc/apt/sources.list && \
echo "deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib" >>/etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib" >>/etc/apt/sources.list && \
echo "deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib" >>/etc/apt/sources.list
RUN apt-get clean && \
apt-get update && \
apt-get install -y --no-install-recommends curl procps telnet net-tools && \
rm -rf /var/lib/apt/lists/*
</code></pre>
<h2 id="注意">注意</h2>
<p>不管是阿里云的源还是清华的源,http和https均可以,自行斟酌即可;<br>
如果遇到无法拉取 https 源的情况,请先使用 http 源并安装:</p>
<pre><code class="language-shell">apt install apt-transport-https ca-certificates
</code></pre>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[spring boot跨域问题]]></title>
<id>https://imarkofu.github.io/post/spring-boot-allowed-origins/</id>
<link href="https://imarkofu.github.io/post/spring-boot-allowed-origins/">
</link>
<updated>2021-06-03T12:12:24.000Z</updated>
<summary type="html"><![CDATA[<h2 id="描述">描述</h2>
<p>目前应用开发前后端分离是大趋势,故而前后端部署在不同的两个域也是大概率事件,那么势必需要解决跨域请求的问题。</p>
<p>本文描述spring-boot项目中如何解决请求跨域的三种解决方案,以及升级spring-boot 2.4后的跨域问题。</p>
]]></summary>
<content type="html"><![CDATA[<h2 id="描述">描述</h2>
<p>目前应用开发前后端分离是大趋势,故而前后端部署在不同的两个域也是大概率事件,那么势必需要解决跨域请求的问题。</p>
<p>本文描述spring-boot项目中如何解决请求跨域的三种解决方案,以及升级spring-boot 2.4后的跨域问题。</p>
<!-- more -->
<h2 id="解决">解决</h2>
<h3 id="方案一">方案一</h3>
<p>通过实现WebMvcConfigurer接口的addCorsMappings方法解决跨域问题。</p>
<pre><code class="language-java">@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 所有的当前站点的请求地址,都支持跨域访问。
registry.addMapping("/**")
// 所有的外部域都可跨域访问
.allowedOrigins("*")
// 是否支持跨域用户凭证
.allowCredentials(true)
// 当前站点支持的跨域请求类型是什么
.allowedMethods("GET", "POST", "PUT", "DELETE")
.maxAge(3600);
}
}
</code></pre>
<h3 id="方案二">方案二</h3>
<p>使用@CrossOrigin注解实现跨域</p>
<pre><code class="language-java">@RestController
@CrossOrigin(origins = "*", maxAge = 3600)
public class TestController {
@GetMapping("/test")
public ApiResult<String> test() {
return null;
}
}
</code></pre>
<h3 id="方案三">方案三</h3>
<p>使用Filter实现跨域</p>
<pre><code class="language-java"> @ConditionalOnProperty(name = "manage.api.cors", havingValue = "true")
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
</code></pre>
<h2 id="注意">注意</h2>
<p>spring-boot升级到2.4版本以后,使用如下方案时会抛一下异常</p>
<pre><code class="language-java">java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a set of origins, list them explicitly or consider using "allowedOriginPatterns" instead.
// 解决方法提示内容中也有香惜的说明
// 当allowCredentials设置为'true'时,allowedOrigins不能包含特殊值'*'
// 可以考虑使用allowedOriginPatterns代替
</code></pre>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[maven项目编译:程序包com.sun.image.codec.jpeg不存在]]></title>
<id>https://imarkofu.github.io/post/maven-compiler-image-api-not-exist/</id>
<link href="https://imarkofu.github.io/post/maven-compiler-image-api-not-exist/">
</link>
<updated>2021-06-03T04:12:24.000Z</updated>
<summary type="html"><![CDATA[<h2 id="描述">描述</h2>
<p>maven编译项目提示<br>
程序包com.sun.image.codec.jpeg不存在<br>
然后这个类位于:jre/lib/rt.jar</p>
]]></summary>
<content type="html"><![CDATA[<h2 id="描述">描述</h2>
<p>maven编译项目提示<br>
程序包com.sun.image.codec.jpeg不存在<br>
然后这个类位于:jre/lib/rt.jar</p>
<!-- more -->
<h2 id="解决">解决</h2>
<h3 id="方案一">方案一</h3>
<p>java_home下面的lib/dt.jar中没有这个文件,导致编译失败。<br>
通过配置maven-compiler-plugin插件可以解决此问题。</p>
<pre><code class="language-xml"><build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<encoding>UTF-8</encoding>
<compilerArguments>
<verbose />
<bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
</plugins>
</build>
</code></pre>
<p>缺陷:在windows下面用';'分隔,linux下面用':'分隔。</p>
<h3 id="方案二">方案二</h3>
<p>更换API</p>
<pre><code class="language-java">JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(os);
en.encode(targetImage);
// 更换为
ImageIO.write(targetImage, "jpg", os);
</code></pre>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[git bash下的Filename too long]]></title>
<id>https://imarkofu.github.io/post/git-bash-filename-too-long/</id>
<link href="https://imarkofu.github.io/post/git-bash-filename-too-long/">
</link>
<updated>2021-06-02T11:12:24.000Z</updated>
<summary type="html"><![CDATA[<h2 id="描述">描述</h2>
<p>从github克隆一个项目下发出现了错误:</p>
<pre><code class="language-shell">cglong@cglong MINGW64 /c/Tools/workspace/idea/open
$ git clone [email protected]:imarkofu/shenyu.git
Cloning into 'shenyu'...
Warning: Permanently added the RSA host key for IP address '52.192.72.89' to the list of known hosts.
remote: Enumerating objects: 53479, done.
remote: Counting objects: 100% (15170/15170), done.
remote: Compressing objects: 100% (4534/4534), done.
remote: Total 53479 (delta 4593), reused 14765 (delta 4365), pack-reused 38309
Receiving objects: 100% (53479/53479), 20.72 MiB | 128.00 KiB/s, done.
Resolving deltas: 100% (17773/17773), done.
error: unable to create file shenyu-spring-boot-starter/shenyu-spring-boot-starter-sync-data-center/shenyu-spring-boot-starter-sync-data-websocket/src/main/java/org/apache/shenyu/springboot/starter/sync/data/websocket/WebsocketSyncDataConfiguration.java: Filename too long
error: unable to create file shenyu-spring-boot-starter/shenyu-spring-boot-starter-sync-data-center/shenyu-spring-boot-starter-sync-data-websocket/src/test/java/org/apache/shenyu/springboot/starter/sync/data/websocket/WebsocketSyncDataConfigurationTest.java: Filename too long
Checking out files: 100% (1439/1439), done.
fatal: unable to checkout working tree
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry the checkout with 'git checkout -f HEAD'
</code></pre>
<p>git可以创建4096长度的路径,然而Windows 默认不支持文件名或目录名长于260个字符,所以Git的Windows客户端默认是禁用长名称支持的。</p>
]]></summary>
<content type="html"><![CDATA[<h2 id="描述">描述</h2>
<p>从github克隆一个项目下发出现了错误:</p>
<pre><code class="language-shell">cglong@cglong MINGW64 /c/Tools/workspace/idea/open
$ git clone [email protected]:imarkofu/shenyu.git
Cloning into 'shenyu'...
Warning: Permanently added the RSA host key for IP address '52.192.72.89' to the list of known hosts.
remote: Enumerating objects: 53479, done.
remote: Counting objects: 100% (15170/15170), done.
remote: Compressing objects: 100% (4534/4534), done.
remote: Total 53479 (delta 4593), reused 14765 (delta 4365), pack-reused 38309
Receiving objects: 100% (53479/53479), 20.72 MiB | 128.00 KiB/s, done.
Resolving deltas: 100% (17773/17773), done.
error: unable to create file shenyu-spring-boot-starter/shenyu-spring-boot-starter-sync-data-center/shenyu-spring-boot-starter-sync-data-websocket/src/main/java/org/apache/shenyu/springboot/starter/sync/data/websocket/WebsocketSyncDataConfiguration.java: Filename too long
error: unable to create file shenyu-spring-boot-starter/shenyu-spring-boot-starter-sync-data-center/shenyu-spring-boot-starter-sync-data-websocket/src/test/java/org/apache/shenyu/springboot/starter/sync/data/websocket/WebsocketSyncDataConfigurationTest.java: Filename too long
Checking out files: 100% (1439/1439), done.
fatal: unable to checkout working tree
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry the checkout with 'git checkout -f HEAD'
</code></pre>
<p>git可以创建4096长度的路径,然而Windows 默认不支持文件名或目录名长于260个字符,所以Git的Windows客户端默认是禁用长名称支持的。</p>
<!-- more -->
<h2 id="解决">解决</h2>
<pre><code class="language-shell">git config --global core.longpaths true
</code></pre>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[CentOS6编译安装Python3.7]]></title>
<id>https://imarkofu.github.io/post/CentOS-install-python3/</id>
<link href="https://imarkofu.github.io/post/CentOS-install-python3/">
</link>
<updated>2019-04-03T12:21:10.000Z</updated>
<summary type="html"><![CDATA[<p>准备编译环境</p>
<pre><code class="language-shell">yum install zlib-devel bzip2-devel openssl-devel ncurses-devel xz gcc-c++ gcc libffi-devel -y
</code></pre>
]]></summary>
<content type="html"><![CDATA[<p>准备编译环境</p>
<pre><code class="language-shell">yum install zlib-devel bzip2-devel openssl-devel ncurses-devel xz gcc-c++ gcc libffi-devel -y
</code></pre>
<!-- more -->
<p>下载并解压</p>
<pre><code class="language-shell">wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz
tar xf Python-3.7.3.tar.xz -C /usr/local/src/
</code></pre>
<p>编译安装</p>
<pre><code class="language-shell">cd /usr/local/src/Python-3.7.3
./configure --prefix=/usr/local/python3 --with-ssl --enable-optimizations
make -j 4 && make install
最终提示如下,表示pip-9.0.1与setuptools-28.8.0同时安装成功
if test "x" != "x" ; then \
rm -f /usr/local/python3/bin/python3-32; \
(cd /usr/local/python3/bin; ln -s python3.7-32 python3-32) \
fi
rm -f /usr/local/python3/share/man/man1/python3.1
(cd /usr/local/python3/share/man/man1; ln -s python3.7.1 python3.1)
if test "xupgrade" != "xno" ; then \
case upgrade in \
upgrade) ensurepip="--upgrade" ;; \
install|*) ensurepip="" ;; \
esac; \
./python -E -m ensurepip \
$ensurepip --root=/ ; \
fi
Looking in links: /tmp/tmpnffpnbr9
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip
Successfully installed pip-19.0.3 setuptools-40.8.0
</code></pre>
<p>建立软连接</p>
<pre><code class="language-shell">ln -s /usr/local/python3/bin/python3.7 /usr/local/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3
</code></pre>
<p>升级到最新的pip</p>
<pre><code class="language-shell">pip3 install --upgrade pip
</code></pre>
<p>修改默认的Python</p>
<pre><code class="language-shell">mv /usr/bin/python /usr/bin/python_bak
ln -s /usr/local/python3/bin/python3.7 /usr/bin/python
# 验证
python -V
</code></pre>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[ekho中文TTS CentOS6编译安装]]></title>
<id>https://imarkofu.github.io/post/CentOS-ekho-TTS/</id>
<link href="https://imarkofu.github.io/post/CentOS-ekho-TTS/">
</link>
<updated>2019-04-02T12:21:10.000Z</updated>
<summary type="html"><![CDATA[<p>Ekho(余音)是一个免费、开源的中文语音合成软件。它目前支持粤语、普通话(国语)、广东台山话、诏安客语、藏语、雅言(中国古代通用语)和韩语(试验中),英语则通过eSpeak或Festival间接实现。Ekho支持Linux、Windows和Android平台。</p>
]]></summary>
<content type="html"><![CDATA[<p>Ekho(余音)是一个免费、开源的中文语音合成软件。它目前支持粤语、普通话(国语)、广东台山话、诏安客语、藏语、雅言(中国古代通用语)和韩语(试验中),英语则通过eSpeak或Festival间接实现。Ekho支持Linux、Windows和Android平台。</p>
<!-- more -->
<p>源码下载页面:<a href="https://sourceforge.net/projects/e-guidedog/files/Ekho/" title="ekho源码下载">ekho</a>.<br>
项目主页:<a href="http://www.eguidedog.net/ekho.php" title="ekho主页">ekho</a></p>
<p>编译安装基于CentOS 6.10</p>
<pre><code class="language-shell"># 添加 SCL 和 EPEL 软件仓库
yum install centos-release-scl epel-release
# 安装 GCC 5 和编译 ekho 的开发库
yum install devtoolset-6-gcc* libsndfile-devel.x86_64 pulseaudio-libs-devel.x86_64 ncurses-devel.x86_64 espeak-devel.x86_64 lame-devel.x86_64
# 使用 SCL 启动 shell
scl enable devtoolset-6 bash
# 验证 GCC 版本
# which gcc
# gcc --version
# [可选] 设置 GCC 编译器选项
export CFLAGS='-O2 -g -pipe -Wall -fexceptions -fno-strict-aliasing -fstack-protector -m64 -mtune=generic -fPIC'
# 生成 MakeFile,编译,安装
./configure --prefix=/opt/app/ekho && make -j 8 && make install
# 设置 ekho 相关环境变量
cat > /etc/profile.d/ekho_env.sh << EOF
#!/bin/bash
export PATH=\${PATH}:/opt/app/ekho/bin
export EKHO_DATA_PATH=/opt/app/ekho/share/ekho-data/
EOF
# 退出 SCL shell
exit
</code></pre>
<p>更换音频文件参考:<a href="http://cto.eguidedog.net/node/809" title="怎样替换Ekho的语音文件">怎样替换Ekho的语音文件</a><br>
制作和添加新的语音声音参考:<a href="http://www.eguidedog.net/doc/doc_make_new_voice_cn.php" title="如何为Ekho添加新的声音">如何为Ekho添加新的声音</a></p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[算法学习-动态规划]]></title>
<id>https://imarkofu.github.io/post/algorithm-dynamic-programming/</id>
<link href="https://imarkofu.github.io/post/algorithm-dynamic-programming/">
</link>
<updated>2019-01-14T15:03:27.000Z</updated>
<summary type="html"><![CDATA[<p><strong>动态规划</strong>(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。</p>
<p>动态规划常常适用于<strong>有重叠子问题</strong>和<strong>最优子结构性质</strong>的问题,动态规划方法所耗时间往往远少于朴素解法。</p>
<p>动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。</p>
<p>通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。</p>
]]></summary>
<content type="html"><![CDATA[<p><strong>动态规划</strong>(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。</p>
<p>动态规划常常适用于<strong>有重叠子问题</strong>和<strong>最优子结构性质</strong>的问题,动态规划方法所耗时间往往远少于朴素解法。</p>
<p>动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。</p>
<p>通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。</p>
<h1 id="-more-适用情况"><!-- more --><br>
适用情况</h1>
<p>**最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。<br>
**无后效性。即子问题的解一旦确定,就不再改变,不受在这之后、包含它的更大的问题的求解决策影响。<br>
**子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。</p>
<h1 id="实例">实例</h1>
<p><strong>求解的关键:第一步找到问题的“状态”, 第二步找到“状态转移方程”</strong></p>
<h2 id="示例一">示例一</h2>
<p>一个序列有N个数:A[1],A[2],…,A[N],求出最长上升子序列的长度。 (讲DP基本都会讲到的一个问题LIS:longest increasing subsequence)</p>
<p>示例:5,3,4,8,6,7<br>
**前1个数的LIS长度d(1)=1(序列:5)<br>
**前2个数的LIS长度d(2)=1(序列:3;3前面没有比3小的)<br>
**前3个数的LIS长度d(3)=2(序列:3,4;4前面有个比它小的3,所以d(3)=d(2)+1)<br>
**前4个数的LIS长度d(4)=3(序列:3,4,8;8前面比它小的有3个数,所以 d(4)=max{d(1),d(2),d(3)}+1=3)</p>
<p>状态转移方程<br>
dp[i]=max{dp[j]}+1,j=[0,i-1]且a[j]<a[i]<br>
即为:到第i个元素的最长上升子序列=第0到i-1的元素的最长上升子序列+1<br>
时间复杂度=O(n^2)</p>
<p>这个问题还有另一种更优化的解法,时间复杂度为O(nlog(n))<br>
参考:https://leetcode.com/problems/longest-increasing-subsequence/</p>
<h2 id="示例二">示例二</h2>
<p>平面上有N*M个格子,每个格子中放着一定数量的苹果。你从左上角的格子开始走到右下角, 每一步只能向下走或是向右走,每次走到一个格子上就把格子里的苹果收集起来, 这样下去,你最多能收集到多少个苹果。</p>
<p>这个状态转移方程应该会更好理解<br>
dp[i][j]=A[i][j]+max(dp[i+1][j], dp[i][j+1]),当然这里没有将边界问题考虑进来,实际编程中需要注意。</p>
<p>即为:从第i,j位置到走到左下角能收集的最大苹果数量=当前格子内苹果数量+向右走或向下走的两种方式的最大值</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[算法学习-贪心算法]]></title>
<id>https://imarkofu.github.io/post/algorithm-greedy-algorithm/</id>
<link href="https://imarkofu.github.io/post/algorithm-greedy-algorithm/">
</link>
<updated>2019-01-03T15:11:57.000Z</updated>
<summary type="html"><![CDATA[<p>所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。</p>
<p>贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。</p>
<p>所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。</p>
]]></summary>
<content type="html"><![CDATA[<p>所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。</p>
<p>贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。</p>
<p>所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。</p>
<!-- more -->
<h2 id="基本思路">基本思路</h2>
<ul>
<li>建立数学模型来描述问题。</li>
<li>把求解的问题分成若干个子问题。</li>
<li>对每一子问题求解,得到子问题的局部最优解。</li>
<li>把子问题的解局部最优解合成原来解问题的一个解。</li>
</ul>
<h2 id="适用的问题">适用的问题</h2>
<p>前提:局部最优策略能导致产生全局最优解。</p>
<p>贪心算法适用的情况很少。一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。<br>
因为用贪心算法只能通过解局部最优解的策略来达到全局最优解,因此,一定要注意判断问题是否适合采用贪心算法策略,找到的解是否一定是问题的最优解。<br>
示例参考:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[算法学习-递归和分治]]></title>
<id>https://imarkofu.github.io/post/algorithm-recursion-and-division/</id>
<link href="https://imarkofu.github.io/post/algorithm-recursion-and-division/">
</link>
<updated>2019-01-03T14:51:01.000Z</updated>
<summary type="html"><![CDATA[<h1 id="递归">递归</h1>
<p>直接或者间接不断反复调用自身来达到解决问题的方法。要求原始问题可以分解为相同问题的子问题。</p>
<p><strong>先决条件</strong></p>
<ul>
<li>递归边界</li>
<li>自身调用</li>
</ul>
]]></summary>
<content type="html"><![CDATA[<h1 id="递归">递归</h1>
<p>直接或者间接不断反复调用自身来达到解决问题的方法。要求原始问题可以分解为相同问题的子问题。</p>
<p><strong>先决条件</strong></p>
<ul>
<li>递归边界</li>
<li>自身调用</li>
</ul>
<!-- more -->
<p><strong>特点</strong><br>
思路简单清晰,如果分析出将很快得到结果;递归将多次调用,使用到堆栈,算法效率低,费时费内存。</p>
<p><strong>常用场景</strong></p>
<ul>
<li>阶乘</li>
<li>斐波纳契数列</li>
<li>汉诺塔问题</li>
<li>整数划分</li>
<li>枚举排列及二叉树</li>
<li>图的搜索相关问题。</li>
</ul>
<h1 id="分治">分治</h1>
<p>把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。</p>
<p><strong>基本思想</strong><br>
将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。</p>
<p><strong>策略</strong><br>
对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。</p>
<p><strong>使用场景</strong></p>
<ul>
<li>问题的规模缩小到一定的程度就可以容易地解决</li>
<li>问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质</li>
<li>问题分解出的子问题的解可以合并为该问题的解</li>
<li>问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。</li>
</ul>
<p><strong>基本操作步骤</strong><br>
分治法在每一层递归上都有三个步骤:</p>
<ul>
<li>分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题</li>
<li>解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题</li>
<li>合并:将各个子问题的解合并为原问题的解</li>
</ul>
<p><strong>常用场景</strong></p>
<ul>
<li>二分搜索</li>
<li>大整数乘法</li>
<li>Strassen矩阵乘法</li>
<li>棋盘覆盖</li>
<li>合并排序</li>
<li>快速排序</li>
<li>线性时间选择</li>
<li>最接近点对问题</li>
<li>循环赛日程表</li>
<li>汉诺塔</li>
</ul>
]]></content>
</entry>
</feed>