-
Notifications
You must be signed in to change notification settings - Fork 0
/
atom.xml
241 lines (129 loc) · 57.9 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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>My Blog</title>
<link href="/atom.xml" rel="self"/>
<link href="https://heyanfu.github.io/"/>
<updated>2019-04-30T15:59:27.698Z</updated>
<id>https://heyanfu.github.io/</id>
<author>
<name>遗忘的记忆</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>Time Limit Exceeded之短变量声明分析</title>
<link href="https://heyanfu.github.io/2019/04/30/Time-Limit-Exceeded%E4%B9%8B%E7%9F%AD%E5%8F%98%E9%87%8F%E5%A3%B0%E6%98%8E%E5%88%86%E6%9E%90/"/>
<id>https://heyanfu.github.io/2019/04/30/Time-Limit-Exceeded之短变量声明分析/</id>
<published>2019-04-30T15:24:10.000Z</published>
<updated>2019-04-30T15:59:27.698Z</updated>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>今天在逛<a href="https://leetcode.com/problems/fibonacci-number/" target="_blank" rel="noopener">LeetCode</a>的时候,看到了这样一道题目:</p><blockquote><p>The Fibonacci numbers, commonly denoted F(n) form a sequence, called the Fibonacci sequence, such that each number is the sum of the two preceding ones, starting from 0 and 1. That is,</p></blockquote><blockquote><p>F(0) = 0, F(1) = 1<br>F(N) = F(N - 1) + F(N - 2), for N > 1.</p></blockquote><p>题目意思很简单,就是求<a href="https://baike.baidu.com/item/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97/99145?fr=aladdin" target="_blank" rel="noopener">斐波那契数列</a>,于是很容易用递归写出如下代码:</p><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">fib</span><span class="params">(N <span class="keyword">int</span>)</span> <span class="title">int</span></span> {</span><br><span class="line"> <span class="keyword">if</span> N <= <span class="number">1</span> {</span><br><span class="line"> <span class="keyword">return</span> N</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> fib(N - <span class="number">1</span>) + fib(N - <span class="number">2</span>)</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>运行正常AC,但想到用递归做的事情,一般都可以用栈来实现,因为递归也可以理解成不断入栈、出栈。<br>于是很快用栈写出了如下代码:</p><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">fib</span><span class="params">(N <span class="keyword">int</span>)</span> <span class="title">int</span></span> {</span><br><span class="line"> res := <span class="number">0</span></span><br><span class="line"> stack := <span class="built_in">make</span>([]<span class="keyword">int</span>, <span class="number">0</span>)</span><br><span class="line"> <span class="keyword">if</span> N <= <span class="number">1</span> {</span><br><span class="line"> <span class="keyword">return</span> N</span><br><span class="line"> }</span><br><span class="line"> stack = <span class="built_in">append</span>(stack, N - <span class="number">1</span>)</span><br><span class="line"> stack = <span class="built_in">append</span>(stack, N - <span class="number">2</span>)</span><br><span class="line"> fmt.Println(stack)</span><br><span class="line"> <span class="keyword">for</span> <span class="built_in">len</span>(stack) > <span class="number">0</span> {</span><br><span class="line"> val, stack := stack[<span class="number">0</span>], stack[<span class="number">1</span>:]</span><br><span class="line"> <span class="keyword">if</span> val <= <span class="number">1</span> {</span><br><span class="line"> res += val</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> stack = <span class="built_in">append</span>(stack, val - <span class="number">1</span>)</span><br><span class="line"> stack = <span class="built_in">append</span>(stack, val - <span class="number">2</span>)</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> res</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>运行提示Time Limit Exceeded,时间超限一般来说估计是死循环了。当我观察代码时,发现也只有一个用来判断栈是否为空的for循环,该for循环中不断对stack进行push,pop操作,感觉也不会死循环。于是我用GoLand在如下位置打上了断点:</p><p><img src="/2019/04/30/Time-Limit-Exceeded之短变量声明分析/goland_debug0.png" alt="GoLandDebug图" title="GoLandDebug图"></p><p>上图很明显看出堆栈中有两个stack。 <code>val, stack := stack[0], stack[1:]</code> 声明了一个作用域为for循环内部的stack,而for循环判断条件中的stack是函数fib作用域中的stack,该stack在for循环中一直没被修改,因此出现了死循环。</p><p>而我一开始以为 <code>val, stack := stack[0], stack[1:]</code> 只会新声明一个val,stack会使用外部的stack,因为:=左边只要有一个变量是未被声明的就可以使用它。于是对代码进行了修改,val单独一行声明赋值,代码如下:</p><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">fib</span><span class="params">(N <span class="keyword">int</span>)</span> <span class="title">int</span></span> {</span><br><span class="line"> res := <span class="number">0</span></span><br><span class="line"> stack := <span class="built_in">make</span>([]<span class="keyword">int</span>, <span class="number">0</span>)</span><br><span class="line"> <span class="keyword">if</span> N <= <span class="number">1</span> {</span><br><span class="line"> <span class="keyword">return</span> N</span><br><span class="line"> }</span><br><span class="line"> stack = <span class="built_in">append</span>(stack, N - <span class="number">1</span>)</span><br><span class="line"> stack = <span class="built_in">append</span>(stack, N - <span class="number">2</span>)</span><br><span class="line"> fmt.Println(stack)</span><br><span class="line"> <span class="keyword">for</span> <span class="built_in">len</span>(stack) > <span class="number">0</span> {</span><br><span class="line"> val := stack[<span class="number">0</span>]</span><br><span class="line"> stack = stack[<span class="number">1</span>:]</span><br><span class="line"> <span class="keyword">if</span> val <= <span class="number">1</span> {</span><br><span class="line"> res += val</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> stack = <span class="built_in">append</span>(stack, val - <span class="number">1</span>)</span><br><span class="line"> stack = <span class="built_in">append</span>(stack, val - <span class="number">2</span>)</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> res</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>提交,正常AC。</p>]]></content>
<summary type="html">
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>今天在逛<a href="https://leetcode.com/problems/fibonacci-number/" target="
</summary>
<category term="Go" scheme="https://heyanfu.github.io/categories/Go/"/>
<category term="细节" scheme="https://heyanfu.github.io/tags/%E7%BB%86%E8%8A%82/"/>
</entry>
<entry>
<title>as3对象池使用</title>
<link href="https://heyanfu.github.io/2019/02/28/as3%E5%AF%B9%E8%B1%A1%E6%B1%A0%E4%BD%BF%E7%94%A8/"/>
<id>https://heyanfu.github.io/2019/02/28/as3对象池使用/</id>
<published>2019-02-28T15:53:47.000Z</published>
<updated>2019-02-28T16:12:08.092Z</updated>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>在编写代码时,经常要注意的一件事情是代码的优化,一般在代码中,实例化对象是相对来说比较耗时、消耗性能的操作了,优化该操作的常用方法之一是使用对象池技术,本次以ActionScript3为例,分析一波对象池技术的使用。</p><h1 id="new对象耗时分析"><a href="#new对象耗时分析" class="headerlink" title="new对象耗时分析"></a>new对象耗时分析</h1><p>对基本的MovieClip进行实例化10000次所耗时间如下所示:</p><p><img src="/2019/02/28/as3对象池使用/new1wobj.png" alt="实例化对象图" title="实例化对象图"></p><p>经过多次测试,该操作耗时约为40~50ms,这个时间感觉还可以接受的样子,下面再进行10000次加法与乘法操作来进行对比一下。 </p><p><img src="/2019/02/28/as3对象池使用/addmuti.png" alt="加法乘法操作图" title="加法乘法操作图"></p><p>经过多次测试,该操作耗时约为2~3ms,大约为new MovieClip操作的1/20 ~ 1/15,这里需要注意的是new的是一个普通的MovieClip,因此没有涉及到过多的其它操作,在实际开发中,一般是new自己写好封装的类,在new的过程中会做一些初始化操作,因此会更加耗时。</p><h1 id="对象池类的编写"><a href="#对象池类的编写" class="headerlink" title="对象池类的编写"></a>对象池类的编写</h1><p>主要是把实例化好的对象存入池中,在需要使用的时候直接从池中取出对象,不再去new新的对象。对象用完之后再将其放入池中,以便下一次的使用。代码如下所示:</p><figure class="highlight actionscript"><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><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">package</span> <span class="title">Demo</span></span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"><span class="meta"><span class="meta-keyword">import</span> flash.display.MovieClip;</span></span><br><span class="line"><span class="meta"><span class="meta-keyword">import</span> flash.display.Sprite;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">TestPool</span> <span class="keyword">extends</span> <span class="title">Sprite</span> </span>{</span><br><span class="line"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">var</span> objs:Array;</span><br><span class="line"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">var</span> count:int;</span><br><span class="line"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">var</span> size:int;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 初始化池大小</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="function"><span class="keyword">function</span> <span class="title">initPool</span><span class="params">(maxSize:int)</span>:void </span>{</span><br><span class="line">size = maxSize;</span><br><span class="line">count = maxSize;</span><br><span class="line">objs = [];</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">var</span> i:int = <span class="number">0</span>; i < maxSize; i ++) {</span><br><span class="line">objs.push(<span class="keyword">new</span> MovieClip());</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 从池中取一个对象</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="function"><span class="keyword">function</span> <span class="title">getObject</span><span class="params">()</span>:MovieClip </span>{</span><br><span class="line"><span class="keyword">if</span> (count > <span class="number">0</span>) {</span><br><span class="line">count --;</span><br><span class="line"><span class="keyword">return</span> objs[count];</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 当池中没有对象时,往池中创建size大小的对象</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">var</span> i:int = <span class="number">0</span>; i < size; i ++) {</span><br><span class="line">objs.unshift(<span class="keyword">new</span> MovieClip());</span><br><span class="line">}</span><br><span class="line">count = size;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> getObject();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 对象用完之后,继续放入池中,以便下次使用</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="function"><span class="keyword">function</span> <span class="title">dispose</span><span class="params">(mc:MovieClip)</span>:void </span>{</span><br><span class="line">objs[count] = mc;</span><br><span class="line">count ++;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="对象池耗时测试"><a href="#对象池耗时测试" class="headerlink" title="对象池耗时测试"></a>对象池耗时测试</h1><p>从池中取对象好像如下所示:</p><p><img src="/2019/02/28/as3对象池使用/pool1w.png" alt="对象池耗时测试图" title="对象池耗时测试图"></p><p>可以看出,对于10000次操作,初始化池所耗时间约为40~50ms,之后从池中取10000个对象所需时间约为4~6ms,提高了约10倍左右。</p><p>再对100000次操作进行测试如下:</p><p><img src="/2019/02/28/as3对象池使用/pool10w.png" alt="对象池耗时测试图" title="对象池耗时测试图"></p><p>可以看出,初始化池所耗时间约为550~600ms,而取操作只用了约30ms,可见对象池对于性能得提升还是非常有帮助的。在需要实例化多个相同对象的时候,尽量使用对象池技术来提高性能。</p>]]></content>
<summary type="html">
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>在编写代码时,经常要注意的一件事情是代码的优化,一般在代码中,实例化对象是相对来说比较耗时、消耗性能的操作了,优化该操作的常用方法之一是使用
</summary>
<category term="ActionScript3" scheme="https://heyanfu.github.io/categories/ActionScript3/"/>
<category term="对象池" scheme="https://heyanfu.github.io/tags/%E5%AF%B9%E8%B1%A1%E6%B1%A0/"/>
</entry>
<entry>
<title>敌人移动AI初探</title>
<link href="https://heyanfu.github.io/2018/12/23/%E6%95%8C%E4%BA%BA%E7%A7%BB%E5%8A%A8AI%E5%88%9D%E6%8E%A2/"/>
<id>https://heyanfu.github.io/2018/12/23/敌人移动AI初探/</id>
<published>2018-12-23T12:23:21.000Z</published>
<updated>2019-02-28T16:11:51.669Z</updated>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>在公司做flash有一段时间了,在这几个月做的功能中,有几个存在敌人移动的小游戏,发现敌人移动AI是一个值得学习与研究的方向,于是把学习记录于此。</p><h1 id="格子类型游戏"><a href="#格子类型游戏" class="headerlink" title="格子类型游戏"></a>格子类型游戏</h1><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>常见的格子类型游戏,可以理解为就是指把50X50(宽*高)的面板分成25个格子,每个格子的宽高为10*10,一个敌人初始化在某一个格子中,之后移动都是从某一个格子移动到临近的格子,不存在移动半格的情况。一般游戏中还会存在障碍物,敌人与自己均不能移动到存在障碍物的格子当中。</p><h2 id="创建地图-格子-结构"><a href="#创建地图-格子-结构" class="headerlink" title="创建地图(格子)结构"></a>创建地图(格子)结构</h2><p>由于地图结构是固定的格子,因此可以直接使用二维数组来进行存储。数组元素的值可以用来代表格子的不同状态,这里0代表空格子,1代表存在障碍物的格子。代码如下所示:</p><figure class="highlight actionscript"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">// 为了方便,以3 * 3 大小格子为例</span></span><br><span class="line"><span class="keyword">const</span> MAP:Array = [[<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>],</span><br><span class="line"> [<span class="number">1</span>, <span class="number">1</span>, <span class="number">0</span>],</span><br><span class="line"> [<span class="number">1</span>, <span class="number">0</span>, <span class="number">0</span>]];</span><br><span class="line"><span class="keyword">const</span> ROW:int = <span class="number">3</span>;</span><br><span class="line"><span class="keyword">const</span> COLUMN:int = <span class="number">3</span>;</span><br></pre></td></tr></table></figure><h2 id="判断临近格子是否可以移动"><a href="#判断临近格子是否可以移动" class="headerlink" title="判断临近格子是否可以移动"></a>判断临近格子是否可以移动</h2><p>临近格子一般为上下左右四个方向,向每个方向移动只需要判断格子是否可行即可。</p><figure class="highlight actionscript"><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><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * @params posX 格子竖直方向的位置下标</span></span><br><span class="line"><span class="comment"> * @params posY 格子水平方向的位置下标</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">canMove</span><span class="params">(posX:int, posY:int)</span>:Boolean </span>{</span><br><span class="line"><span class="keyword">var</span> nextPos:Array = [[<span class="number">0</span>, <span class="number">1</span>], [<span class="number">0</span>, <span class="number">-1</span>], [<span class="number">1</span>, <span class="number">0</span>], [<span class="number">-1</span>, <span class="number">0</span>]]; <span class="comment">// 用于计算上下左右四个方向的下标</span></span><br><span class="line"><span class="keyword">var</span> temp:Array;</span><br><span class="line"><span class="keyword">var</span> len:int = nextPos.length;</span><br><span class="line"><span class="keyword">var</span> nextPosX:int;</span><br><span class="line"><span class="keyword">var</span> nextPosY:int</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">var</span> i:int = <span class="number">0</span>; i < len; i ++) {</span><br><span class="line">temp = nextPos[i];</span><br><span class="line">nextPosX = posX + temp[<span class="number">0</span>];</span><br><span class="line">nextPosY = posY + temp[<span class="number">1</span>];</span><br><span class="line"><span class="keyword">if</span> (judgeGrid(nextPosX, nextPosY)) {</span><br><span class="line"><span class="comment">// 做敌人移动到下标为nextPosX, nextPosY格子的逻辑</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 判断格子下标是否合法且为空格子</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">judgeGrid</span><span class="params">(posX:int, posY:int)</span>:Boolean </span>{</span><br><span class="line"><span class="keyword">if</span> (posX < <span class="number">0</span> || posX >= ROW || posX < <span class="number">0</span> || posY >= COLUMN) {</span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> MAP[posX][posY] == <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>上述代码逻辑虽然是以计算上下左右四个方向为例的,但其实也同样适用于八个方向(加左上、左下、右上、右下四个方向),只需要改变下nextPos数组的值即可。<strong>后续还是以四个方向为例</strong>。</p><figure class="highlight actionscript"><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="comment">// 用于计算临近8个方向,后续代码逻辑同上,无需变动</span></span><br><span class="line"><span class="keyword">var</span> nextPos:Array = [[<span class="number">0</span>, <span class="number">1</span>], [<span class="number">0</span>, <span class="number">-1</span>], [<span class="number">1</span>, <span class="number">0</span>], [<span class="number">-1</span>, <span class="number">0</span>], [<span class="number">1</span>, <span class="number">1</span>], [<span class="number">-1</span>, <span class="number">-1</span>], [<span class="number">1</span>, <span class="number">-1</span>], [<span class="number">-1</span>, <span class="number">1</span>]];</span><br></pre></td></tr></table></figure><h2 id="移动方向选择-下个格子选取"><a href="#移动方向选择-下个格子选取" class="headerlink" title="移动方向选择(下个格子选取)"></a>移动方向选择(下个格子选取)</h2><h3 id="完全随机选择"><a href="#完全随机选择" class="headerlink" title="完全随机选择"></a>完全随机选择</h3><p>也就是说每次走完一个格子,都重新从上下左右四个格子中选取,但是由于选取的格子不一定是可移动的,因此当遇到不可移动的格子时,需选取下一个方向</p><figure class="highlight actionscript"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> nextPos:Array = [[<span class="number">0</span>, <span class="number">1</span>], [<span class="number">0</span>, <span class="number">-1</span>], [<span class="number">1</span>, <span class="number">0</span>], [<span class="number">-1</span>, <span class="number">0</span>]];</span><br><span class="line"><span class="keyword">var</span> len:int = nextPos.length;</span><br><span class="line"><span class="keyword">var</span> direct:int;</span><br><span class="line"><span class="keyword">var</span> temp:Array;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">var</span> i:int = <span class="number">0</span>; i < len; i ++) {</span><br><span class="line">direct = int (Math.random() * <span class="number">4</span>);</span><br><span class="line">temp = nextPos[direct];</span><br><span class="line"><span class="comment">// 用于判断下一个方向</span></span><br><span class="line">direct ++; </span><br><span class="line">direct %= len;</span><br><span class="line"><span class="comment">// 可移动的话做移动逻辑,并退出循环,结束此次移动,否则判断下一个方向是否可移动</span></span><br><span class="line"><span class="keyword">if</span> (judgeGrid(temp[<span class="number">0</span>], temp[<span class="number">1</span>])) {</span><br><span class="line"></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="最近移动的方向优先选择"><a href="#最近移动的方向优先选择" class="headerlink" title="最近移动的方向优先选择"></a>最近移动的方向优先选择</h3><p>只需要把最近的方向存起来优先判断即可。</p><figure class="highlight actionscript"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> nextPos:Array = [[<span class="number">0</span>, <span class="number">1</span>], [<span class="number">0</span>, <span class="number">-1</span>], [<span class="number">1</span>, <span class="number">0</span>], [<span class="number">-1</span>, <span class="number">0</span>]];</span><br><span class="line"><span class="keyword">var</span> len:int = nextPos.length;</span><br><span class="line"><span class="keyword">var</span> direct:int = curDirect; <span class="comment">// curDirect为存的最近移动方向</span></span><br><span class="line"><span class="keyword">var</span> temp:Array;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">var</span> i:int = <span class="number">0</span>; i < len; i ++) {</span><br><span class="line">temp = nextPos[direct];</span><br><span class="line">direct = int (Math.random() * <span class="number">4</span>);</span><br><span class="line"><span class="comment">// 用于判断下一个方向</span></span><br><span class="line">direct ++; </span><br><span class="line">direct %= len;</span><br><span class="line"><span class="comment">// 可移动的话做移动逻辑,并退出循环,结束此次移动,否则判断下一个方向是否可移动</span></span><br><span class="line"><span class="keyword">if</span> (judgeGrid(temp[<span class="number">0</span>], temp[<span class="number">1</span>])) {</span><br><span class="line"><span class="comment">// 在移动之前记得把移动方向更新</span></span><br><span class="line">curDirect = direct;</span><br><span class="line"></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>在公司做flash有一段时间了,在这几个月做的功能中,有几个存在敌人移动的小游戏,发现敌人移动AI是一个值得学习与研究的方向,于是把学习记录
</summary>
<category term="ActionScript3" scheme="https://heyanfu.github.io/categories/ActionScript3/"/>
<category term="AI" scheme="https://heyanfu.github.io/tags/AI/"/>
</entry>
<entry>
<title>新的开始</title>
<link href="https://heyanfu.github.io/2018/09/22/%E6%96%B0%E7%9A%84%E5%BC%80%E5%A7%8B/"/>
<id>https://heyanfu.github.io/2018/09/22/新的开始/</id>
<published>2018-09-22T08:59:31.000Z</published>
<updated>2019-02-23T12:07:42.872Z</updated>
<content type="html"><![CDATA[<p>随着时间的推移,我终于步入了社会,开始了人生中真正意义的第一份工作。到了公司之后才发现,岗位并不是我以为的java开发岗位,而是flash开发岗位,这对于我来说是有些失望的。</p><p>由于最开始跟hr了解到的岗位是java开发岗,那时在学校走的又不是java开发方向,于是在大学最后的3个月里,特意花时间去复习了java相关的基础知识,了解了主流的SSM框架,最后并没有从事java开发,难免会有些失落。</p><p>不过语言也只是一种工具罢了,各种语言都存在其独特的意义。作为一个码农,如果太过于关键语言本身的话,是很难成为一个程序员的,相信无论是学习java、php、javascript,还是即将学习的actionscript3,都会以后的职业生涯有所帮助。</p>]]></content>
<summary type="html">
<p>随着时间的推移,我终于步入了社会,开始了人生中真正意义的第一份工作。到了公司之后才发现,岗位并不是我以为的java开发岗位,而是flash开发岗位,这对于我来说是有些失望的。</p>
<p>由于最开始跟hr了解到的岗位是java开发岗,那时在学校走的又不是java开发方向,
</summary>
<category term="随笔" scheme="https://heyanfu.github.io/categories/%E9%9A%8F%E7%AC%94/"/>
</entry>
<entry>
<title>对比PHP学习Java Web</title>
<link href="https://heyanfu.github.io/2018/05/15/%E5%AF%B9%E6%AF%94PHP%E5%AD%A6%E4%B9%A0Java-Web/"/>
<id>https://heyanfu.github.io/2018/05/15/对比PHP学习Java-Web/</id>
<published>2018-05-15T09:58:35.000Z</published>
<updated>2019-01-05T10:09:42.193Z</updated>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>经历了差不多一年的跑宣讲会->笔试->面试,终于在4月份拿到了一个对自己来说还不错的offer,主要是工作城市是自己最想去的广州,之后向hr了解到offer的具体岗位为java后端开发工程师,由于我之前走的是php方向,为了之后去公司能够写得出基本的业务代码,Java Web的代码编写学习(基于业务代码的学习)之旅便开始了。</p><h1 id="基础部分"><a href="#基础部分" class="headerlink" title="基础部分"></a>基础部分</h1><h2 id="语法"><a href="#语法" class="headerlink" title="语法"></a>语法</h2><p>在语法方面,主要的区别在于java是强类型语言,而php是弱类型语言,这个不需要花费什么时间去学习,感觉比较重要的一点就是它们运算过程中的类型转换问题。举例如下:</p><figure class="highlight php"><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">$a = <span class="string">'2ab5c'</span>; </span><br><span class="line">$b = <span class="string">'1ef'</span>;</span><br><span class="line">$res = $a + $b;</span><br></pre></td></tr></table></figure><p>对php而言,经过上述运算,<em>$res</em>的结果为<em>3</em>,因为在php加号左右的变量都会默认被强制转换数字类型,<em>$a</em>会转换成<em>2</em>,同理,<em>$b</em>会转换成<em>1</em>,所以<em>$res</em>的值为<em>2 + 1 = 3</em>。<br>对java而言,加号运算符是字符串连接符,因此<em>$res</em>的结果为<em>2ab5c1ef</em>。</p><h2 id="变量存储容器"><a href="#变量存储容器" class="headerlink" title="变量存储容器"></a>变量存储容器</h2><p>在变量存储容器方面,php基本都是用Array来存储的,而java只有List、Map、Set等结构,每种结构又有不同的具体用法,这三种结构在java中都是非常常见的,需要重点学习与了解。</p><h1 id="Java-Web入门"><a href="#Java-Web入门" class="headerlink" title="Java Web入门"></a>Java Web入门</h1><h2 id="JSP"><a href="#JSP" class="headerlink" title="JSP"></a>JSP</h2><p>JSP其实就是在html页面中嵌入java代码,这点与php是类似的,在进行php Web开发时如果不使用框架的话,也是把php代码直接嵌入到html页面中,理解起来非常容易。<br>JSP中最重要的应该是九大内置对象了,其实JSP九大内置对象对应了php的超全局变量,它们在Web开发中使用的非常频繁,而且使用它们不需要用户去声明、或者去new,直接在代码中用即可。举例如下:<br><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">// 获得url中id值</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// java使用内置对象request</span></span><br><span class="line">id = request.getParameter(<span class="string">"id"</span>);</span><br><span class="line"><span class="comment">// php使用超全局变量$_GET / $_REQUEST</span></span><br><span class="line">$id = $_GET[<span class="string">'id'</span>] / $_REQUEST[<span class="string">'id'</span>];</span><br><span class="line"><span class="comment">// 获取key为name的cookie值</span></span><br><span class="line"><span class="comment">// java使用内置对象cookie</span></span><br><span class="line">name = cookie.getName(<span class="string">"name"</span>);</span><br><span class="line"><span class="comment">// php使用超全局变量$_COOKIE / $_REQUEST</span></span><br><span class="line">$name = $_GET[<span class="string">'name'</span>] / $_REQUEST[<span class="string">'name'</span>];</span><br></pre></td></tr></table></figure></p><p>从上述例子可以看出,在Web开发不使用框架时,java和php在获取用户输入参数、操作cookie、session等所编写的代码逻辑基本类似。</p><h1 id="Servlet"><a href="#Servlet" class="headerlink" title="Servlet"></a>Servlet</h1><p>Servlet是用来处理用户的请求的,每个JSP页面在进行跳转(如超链接、表单提交)时都需要去请求某一个Servlet,由Servlet来处理用户的请求,处理完用户请求之后再指定输出(重定向)某一个JSP页面,这点跟php是不一样的。在php web开发中,用户在进行页面跳转(如超链接、表单提交)操作时也是由php文件进行处理的。</p><p>在Servlet配置文件中,可以自己映射向用户显示的url与后端实际进行处理的路径的对应关系,java中有许多可以配置的项,这点与php是不同的,php一般就一个数据库的配置文件,再加上一个存储常量的配置文件,存储结构多为数组形式,而java是以xml文件格式进行配置存储的,像监听器、过滤器都需要在相应的xml文件中进行配置,这些一开始对于phper来说是不容易的,因为配置文件很容易写错,这样程序就跑步起来了。</p><h1 id="JDBC"><a href="#JDBC" class="headerlink" title="JDBC"></a>JDBC</h1><p>在进行java操作数据库时,项目需要导入一个jdbc驱动包,但其代码逻辑与php操作数据库时类似的,都是先编写好sql语句,然后执行sql语句得到结果集,或者是先预编译sql语句,再执行得到结果集。</p><h1 id="SSM"><a href="#SSM" class="headerlink" title="SSM"></a>SSM</h1><p>就Web开发所使用的框架而言,php与java所使用的框架区别是非常大的。php框架基本都是基于MVC模式的,html文件往View文件夹下放,数据库操作代码往Model里面放,控制器代码往Controller文件夹下面放。而java在使用框架时,首先需要导入相对应的框架包,一般是通过Maven / Gradle自动构建的,它们有点类似php中的Composer,都可以用来管理一些包/类之间的依赖关系的。</p><p>另一个很大的不同就是java中的注解了,java中每个类、每个方法都有可能需要写注解,注解可以理解成对代码的注释,不同写法的注解都是对应了不同的意思的。<br>最后说一下Mybatis,Mybatis是一个用来处理sql语句的框架,Mybatis学习起来不难,花点时间看看官方文档就差不多可以仿着写代码了,感觉一开始最难的还是整个项目的搭建(如 SSM框架集成、配置文件)。</p>]]></content>
<summary type="html">
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>经历了差不多一年的跑宣讲会-&gt;笔试-&gt;面试,终于在4月份拿到了一个对自己来说还不错的offer,主要是工作城市是自己最想去的广州
</summary>
<category term="Java" scheme="https://heyanfu.github.io/tags/Java/"/>
</entry>
<entry>
<title>ubuntu下lnmp环境搭建</title>
<link href="https://heyanfu.github.io/2018/03/10/ubuntu%E4%B8%8Blnmp%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/"/>
<id>https://heyanfu.github.io/2018/03/10/ubuntu下lnmp环境搭建/</id>
<published>2018-03-10T09:43:11.000Z</published>
<updated>2019-04-30T15:38:42.006Z</updated>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>虽然以前安装过lamp环境,但那时也只是按网上教程搭的,早已忘记。因此现在再搭建一次环境,一是为了更加熟悉,二是为以后复习做准备。</p><h1 id="注"><a href="#注" class="headerlink" title="注"></a>注</h1><p>本次环境是安装在虚拟机上的ubuntu系统</p><h1 id="安装ubuntu"><a href="#安装ubuntu" class="headerlink" title="安装ubuntu"></a>安装ubuntu</h1><p>推荐国内<a href="http://mirrors.163.com/ubuntu-releases/" target="_blank" rel="noopener">网易镜像地址</a>下载,下载好之后直接在新建虚拟机按步骤安装即可。</p><h1 id="nginx"><a href="#nginx" class="headerlink" title="nginx"></a>nginx</h1><h2 id="安装nginx"><a href="#安装nginx" class="headerlink" title="安装nginx"></a>安装nginx</h2><p>本次软件安装均在root用户下进行</p><p>通过指令apt-get install nginx 即可安装nginx服务器。<br>安装了 nginx 后,通过 ifconfig 查看 inet addr。<br>然后在主机电脑游览器上直接访问这个 ip 地址,如果出现了nginx欢迎界面,则说明nginx安装成功。</p><p><img src="/2018/03/10/ubuntu下lnmp环境搭建/nginx_install.png" alt="安装nginx图" title="安装nginx图"></p><h2 id="配置nginx"><a href="#配置nginx" class="headerlink" title="配置nginx"></a>配置nginx</h2><p>编辑 /etc/nginx/sites-available/default,在root配置项下面的index中加入index.php。<br>编辑 /etc/nginx/sites-available/default,取消下面对php模块解析的注释。</p><p><img src="/2018/03/10/ubuntu下lnmp环境搭建/nginx_change.png" alt="配置nginx图" title="配置nginx图"></p><h1 id="mysql"><a href="#mysql" class="headerlink" title="mysql"></a>mysql</h1><ul><li>通过命令 <code>apt-get install nginx`</code> 即可安装,安装过程中会跳出窗口叫你输入mysql用户密码,输入密码即可。</li><li>通过命令 mysql -uroot -p 看能否成功进入mysql,能的话则表明mysql安装成功。</li></ul><p><img src="/2018/03/10/ubuntu下lnmp环境搭建/mysql_install.png" alt="mysql安装图" title="mysql安装图"></p><h1 id="php-fpm"><a href="#php-fpm" class="headerlink" title="php-fpm"></a>php-fpm</h1><ul><li>通过 apt-cache search php-fpm 查看当前可安装的php-fpm相关软件包。</li><li>通过 apt-get install php7.0-fpm 安装(此处的php7.0-fpm为上一条指令列出的相关软件包)</li><li>配置 /etc/php/7.0/fpm/php.ini,</li><li>cgi.fix_pathinfo=1 => cgi.fix_pathinfo=0(原因见<a href="http://www.laruence.com/2010/05/20/1495.html" target="_blank" rel="noopener">鸟哥博客</a>)</li><li>以上安装好后可重新加载下nginx和php-fpm配置,通过 service nginx restart, service php-fpm restart。</li></ul><p><img src="/2018/03/10/ubuntu下lnmp环境搭建/php-fpm_install.png" alt="php-fpm安装图" title="php-fpm安装图"></p><h1 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h1><ul><li>可以通过 nginx -t 测试nginx的配置文件是否正常。</li><li>编写了一个连接数据库的脚本,用pdo输出表数据时报错 could not find driver,后查明原因是未安装php_mysql扩展(通过phpinfo()输出的扩展中没有php_mysql),直接通过 apt-get install php7.0-mysql即可,注意要开启(把前面的分号去掉) /etc/php/7.0/fpm/php.ini中的 extension=php_pdo_mysql.dll。访问成功,表数据正常输出。</li></ul><h1 id="其它问题"><a href="#其它问题" class="headerlink" title="其它问题"></a>其它问题</h1><h2 id="ubuntu系统vi编辑文件时不能删除"><a href="#ubuntu系统vi编辑文件时不能删除" class="headerlink" title="ubuntu系统vi编辑文件时不能删除"></a>ubuntu系统vi编辑文件时不能删除</h2><p>我通过<a href="https://www.jb51.net/article/114998.htm" target="_blank" rel="noopener">该篇文章</a>中方法一已解决。</p><h1 id="参考博文"><a href="#参考博文" class="headerlink" title="参考博文"></a>参考博文</h1><p><a href="https://www.jianshu.com/p/010946a7201d" target="_blank" rel="noopener">https://www.jianshu.com/p/010946a7201d</a></p>]]></content>
<summary type="html">
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>虽然以前安装过lamp环境,但那时也只是按网上教程搭的,早已忘记。因此现在再搭建一次环境,一是为了更加熟悉,二是为以后复习做准备。</p>
</summary>
<category term="PHP" scheme="https://heyanfu.github.io/categories/PHP/"/>
<category term="LNMP" scheme="https://heyanfu.github.io/tags/LNMP/"/>
</entry>
<entry>
<title>日常奇葩问题记录</title>
<link href="https://heyanfu.github.io/2017/12/23/%E6%97%A5%E5%B8%B8%E5%A5%87%E8%91%A9%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95/"/>
<id>https://heyanfu.github.io/2017/12/23/日常奇葩问题记录/</id>
<published>2017-12-23T09:23:25.000Z</published>
<updated>2019-04-07T07:23:33.844Z</updated>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>日常使用电脑、开发过程中难免会遇到一些奇葩问题,这些问题一般解决方案都很简单,但是寻找解决过程可能比较艰难,因为没有一些相关的专业知识就很难知道是哪里引起的问题,最近实习就遇到了一些奇葩问题,折腾挺久才发现问题根源所在,于是就问题及解决方案记录在此。</p><h1 id="php线上项目本地运行报错"><a href="#php线上项目本地运行报错" class="headerlink" title="php线上项目本地运行报错"></a>php线上项目本地运行报错</h1><p>坑:从本地搭建好WAMP环境,并且做了相关配置后,测试发现几处表单提交均报404错误,然而模板文件是存在的,而且路径也没问题。<br>解决:经过测试发现报错相关的代码都是进行了数据库操作,由于本地WAMP种mysql版本为5.6,而线上项目使用了数据库新版本的一些特性,因此数据库操作报错,返回了404。将本地WAMP中的mysql关闭,或者换一个端口,然后下载了10.*版本的MariaDB,使其连接3306端口(默认)后,项目运行正常。</p><h1 id="电脑开不了机,能进安全模式"><a href="#电脑开不了机,能进安全模式" class="headerlink" title="电脑开不了机,能进安全模式"></a>电脑开不了机,能进安全模式</h1><p>坑:前一天晚上下班电脑关机时提示自动更新,没管它直接走了,然后次工作日电脑开不了机,只能进安装模式。<br>解决:进安全模式卸载显卡驱动后,即可正常开机。</p><h1 id="电脑无线网卡驱动不能正常安装"><a href="#电脑无线网卡驱动不能正常安装" class="headerlink" title="电脑无线网卡驱动不能正常安装"></a>电脑无线网卡驱动不能正常安装</h1><p>坑:电脑插入无限网卡后,右下角出现USB接入图标,但并未正常安装,多次反复插入网卡依然如此。<br>解决:选中USB图标,右键强制退出,自动正常安装。</p><h1 id="git未成功提交config文件"><a href="#git未成功提交config文件" class="headerlink" title="git未成功提交config文件"></a>git未成功提交config文件</h1><p>坑:本地git push后,服务器git pull发现config文件并未更新。<br>解决:git可配置.gitignore文件来忽略某些文件的下载、提交。</p><h1 id="接入现在支付异步回调失败"><a href="#接入现在支付异步回调失败" class="headerlink" title="接入现在支付异步回调失败"></a>接入现在支付异步回调失败</h1><p>坑:按现在支付文档、SDK接入项目后,发现支付成功后异步回调会验签失败。<br>解决:经测试,回调时的生成签名没有过滤signType字段,而demo里验签回过滤signType,进一步生成前面,去除过滤signType字段即可。</p><h1 id="大包更新失败"><a href="#大包更新失败" class="headerlink" title="大包更新失败"></a>大包更新失败</h1><p>坑:项目有个包(apk文件)更新操作,发现小包能正常更新,而大包不能正常更新。<br>解决:更新过程中有一步上传阿里云OSS操作,用到了curl发送请求,请求参数CURLOPT_TIMEOUT只设置了3秒,大包请求未完成就断开了,改成大值(3600/7200)即可。</p><h1 id="eclipse运行web项目报错"><a href="#eclipse运行web项目报错" class="headerlink" title="eclipse运行web项目报错"></a>eclipse运行web项目报错</h1><p>坑:jdk10.,tomcat9.在eclipse中运行web项目报错<br>解决:报的错会弹窗(具体错误忘记了。。),把jdk10.*卸载,重装一个jdk1.9就好了。</p><h1 id="github-pages搭建的博客突然访问不了"><a href="#github-pages搭建的博客突然访问不了" class="headerlink" title="github pages搭建的博客突然访问不了"></a>github pages搭建的博客突然访问不了</h1><p>坑:一开始用github pages搭建好博客那端时间是可以正常访问的,后来自己电脑上突然访问不了博客了,手机端可以正常访问。<br>解决:adsafe的问题,关闭后正常访问。</p><h1 id="git-clone报错"><a href="#git-clone报错" class="headerlink" title="git clone报错"></a>git clone报错</h1><p>坑:git clone报错,SSL certificate problem: unable to get local issuer certificate<br>解决:已用<a href="https://blog.csdn.net/dearfellow/article/details/50175425" target="_blank" rel="noopener">该篇博文</a>中方法解决。</p><h1 id="git-bash上连接数据库没反应"><a href="#git-bash上连接数据库没反应" class="headerlink" title="git bash上连接数据库没反应"></a>git bash上连接数据库没反应</h1><p>坑:在git bash上使用命令 mysql -uroot -p去连接数据库无响应,什么都不发生。<br>解决:使用 winpty mysql -uroot -p 进行连接。</p>]]></content>
<summary type="html">
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>日常使用电脑、开发过程中难免会遇到一些奇葩问题,这些问题一般解决方案都很简单,但是寻找解决过程可能比较艰难,因为没有一些相关的专业知识就很难
</summary>
<category term="积累" scheme="https://heyanfu.github.io/tags/%E7%A7%AF%E7%B4%AF/"/>
</entry>
<entry>
<title>校招记录</title>
<link href="https://heyanfu.github.io/2017/10/26/%E6%A0%A1%E6%8B%9B%E8%AE%B0%E5%BD%95/"/>
<id>https://heyanfu.github.io/2017/10/26/校招记录/</id>
<published>2017-10-26T09:06:36.000Z</published>
<updated>2019-01-05T09:22:53.681Z</updated>
<content type="html"><![CDATA[<h1 id="2018校招-php面试总结"><a href="#2018校招-php面试总结" class="headerlink" title="2018校招-php面试总结"></a>2018校招-php面试总结</h1><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>在大三下学期时,由于不太关注招聘相关的信息,以至于错过了春招,经过了解,很多公司秋招是暑假就陆续开始的了,因此在8月初就开始准备复习一些基础知识,阅读一些相关的书籍,以此巩固基础,在之后的线上笔试中,侥幸通过了几个公司的笔试,在这把相关的一些面试过程记录下来。</p><h1 id="三七互娱-9-22"><a href="#三七互娱-9-22" class="headerlink" title="三七互娱 9.22"></a>三七互娱 9.22</h1><h1 id="京东-9-23"><a href="#京东-9-23" class="headerlink" title="京东 9.23"></a>京东 9.23</h1><h1 id="深信服-9-26"><a href="#深信服-9-26" class="headerlink" title="深信服 9.26"></a>深信服 9.26</h1><h1 id="迅雷-10-10"><a href="#迅雷-10-10" class="headerlink" title="迅雷 10.10"></a>迅雷 10.10</h1><h1 id="同花顺"><a href="#同花顺" class="headerlink" title="同花顺"></a>同花顺</h1><h1 id="土巴兔"><a href="#土巴兔" class="headerlink" title="土巴兔"></a>土巴兔</h1><h1 id="美柚"><a href="#美柚" class="headerlink" title="美柚"></a>美柚</h1><h1 id="富途"><a href="#富途" class="headerlink" title="富途"></a>富途</h1><h1 id="多益网络"><a href="#多益网络" class="headerlink" title="多益网络"></a>多益网络</h1><h1 id="百田"><a href="#百田" class="headerlink" title="百田"></a>百田</h1>]]></content>
<summary type="html">
<h1 id="2018校招-php面试总结"><a href="#2018校招-php面试总结" class="headerlink" title="2018校招-php面试总结"></a>2018校招-php面试总结</h1><h1 id="前言"><a href="#前言"
</summary>
<category term="面试" scheme="https://heyanfu.github.io/categories/%E9%9D%A2%E8%AF%95/"/>
<category term="校招" scheme="https://heyanfu.github.io/tags/%E6%A0%A1%E6%8B%9B/"/>
</entry>
<entry>
<title>第0篇博客</title>
<link href="https://heyanfu.github.io/2017/10/26/%E7%AC%AC0%E7%AF%87%E5%8D%9A%E5%AE%A2/"/>
<id>https://heyanfu.github.io/2017/10/26/第0篇博客/</id>
<published>2017-10-26T08:56:37.000Z</published>
<updated>2019-01-05T09:04:59.456Z</updated>
<content type="html"><![CDATA[<p>其实很久之前就想自己搞个博客的了,当初自己也写了一个博客,后端实现了基本的一些功能,但前端很丑,也一直没去用与改进了。然后这段时间又是校招季,一直忙于这三条路线:</p><ul><li>网申 -> 笔试 -> 面试</li><li>宣讲会 -> 笔试 -> 面试</li><li>招聘会 -> 投递简历 -> 面试</li></ul><p>不知怎么时候早已冲刷掉忘记自己写博客的想法,前几天同学说他搭建了一个博客,让我去访问看看,我一看就感觉这就是我心中理想的博客平台,后面询问得知这个博客使用 github + pages 搭建的,于是我这两天花了些空闲时间也根据网上的一些教程搭建了一个,基本的使用是没什么问题的了。</p><p>以前也用word,记事本做过一些学习上的笔记,这段时间也会陆续放到博客上面去。<br>由于热爱编写博客的 码农/程序猿/程序员 众多,所以某些博文内容有类似之处在所难免,如有特别引用会在博文下方参考资料标注。</p><figure class="highlight php"><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="meta"><?php</span></span><br><span class="line"><span class="keyword">echo</span> <span class="string">"hello blog"</span>;</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p>其实很久之前就想自己搞个博客的了,当初自己也写了一个博客,后端实现了基本的一些功能,但前端很丑,也一直没去用与改进了。然后这段时间又是校招季,一直忙于这三条路线:</p>
<ul>
<li>网申 -&gt; 笔试 -&gt; 面试</li>
<li>宣讲会 -&gt; 笔试
</summary>
<category term="随笔" scheme="https://heyanfu.github.io/tags/%E9%9A%8F%E7%AC%94/"/>
</entry>
</feed>