-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
211 lines (116 loc) · 64.5 KB
/
atom.xml
File metadata and controls
211 lines (116 loc) · 64.5 KB
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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>J</title>
<subtitle>Hello, Code.</subtitle>
<link href="https://jiruffe.com/atom.xml" rel="self"/>
<link href="https://jiruffe.com/"/>
<updated>2020-07-16T12:50:00.000Z</updated>
<id>https://jiruffe.com/</id>
<author>
<name>Jiruffe</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>雪花算法的多种语言实现</title>
<link href="https://jiruffe.com/posts/3a657096/"/>
<id>https://jiruffe.com/posts/3a657096/</id>
<published>2020-07-16T12:50:00.000Z</published>
<updated>2020-07-16T12:50:00.000Z</updated>
<content type="html"><![CDATA[<div class="note default"><p>雪花 (snowflake) 算法是 Twitter 开源的分布式 ID 生成算法,可以在不引入 Redis 或 ZooKeeper 之类的中间件的情况下生成不重复且基本有序的 ID,在分布式系统中的应用十分广泛。<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3R3aXR0ZXIvc25vd2ZsYWtl">原始代码<i class="fa fa-external-link-alt"></i></span>是 Scala 实现的,我将其翻译成了 Java、C# 等多种语言的版本,源码在<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2ppcnVmZmUvc25vd2ZsYWtl">这里<i class="fa fa-external-link-alt"></i></span>可以找到。</p></div><span id="more"></span><p>雪花算法的核心思想是将 64 bit 分为多个部分,在两次生成的 ID 的各个部分不全相等的情况下 ID 必然是不重复的。在不同实例上,由于数据中心编号和机器编号不同时相等,所以生成 ID 不重复;在同一实例上,时间戳可以很大程度上避免重复的可能,而一旦同一毫秒内有多次生成 ID 时,通过加锁等方式获取自增的序号即可,自增的序号占用 12 bit,足够一毫秒生成 4096 个不同 ID。</p><table><thead><tr><th align="center">保留</th><th align="center">时间戳</th><th align="center">数据中心编号</th><th align="center">机器编号</th><th align="center">序号</th></tr></thead><tbody><tr><td align="center">1 bit</td><td align="center">41 bit</td><td align="center">5 bit</td><td align="center">5 bit</td><td align="center">12 bit</td></tr><tr><td align="center">固定为0,防止出现负数</td><td align="center">当前时间戳 减 初始时间戳</td><td align="center"></td><td align="center"></td><td align="center">同一机器同一毫秒内自增</td></tr></tbody></table>]]></content>
<summary type="html"><div class="note default"><p>雪花 (snowflake) 算法是 Twitter 开源的分布式 ID 生成算法,可以在不引入 Redis 或 ZooKeeper 之类的中间件的情况下生成不重复且基本有序的 ID,在分布式系统中的应用十分广泛。<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3R3aXR0ZXIvc25vd2ZsYWtl">原始代码<i class="fa fa-external-link-alt"></i></span>是 Scala 实现的,我将其翻译成了 Java、C# 等多种语言的版本,源码在<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2ppcnVmZmUvc25vd2ZsYWtl">这里<i class="fa fa-external-link-alt"></i></span>可以找到。</p>
</div></summary>
<category term="backend" scheme="https://jiruffe.com/categories/backend/"/>
<category term="java" scheme="https://jiruffe.com/tags/java/"/>
<category term="snowflake" scheme="https://jiruffe.com/tags/snowflake/"/>
<category term="distributed-system" scheme="https://jiruffe.com/tags/distributed-system/"/>
<category term="csharp" scheme="https://jiruffe.com/tags/csharp/"/>
<category term="php" scheme="https://jiruffe.com/tags/php/"/>
<category term="python" scheme="https://jiruffe.com/tags/python/"/>
<category term="go" scheme="https://jiruffe.com/tags/go/"/>
<category term="cpp" scheme="https://jiruffe.com/tags/cpp/"/>
<category term="c" scheme="https://jiruffe.com/tags/c/"/>
</entry>
<entry>
<title>Reinventing the Wheel: JSON Conversion Library (Ⅲ)</title>
<link href="https://jiruffe.com/posts/528df58f/"/>
<id>https://jiruffe.com/posts/528df58f/</id>
<published>2019-04-17T06:41:21.000Z</published>
<updated>2019-04-17T06:41:21.000Z</updated>
<content type="html"><![CDATA[<div class="note default"><p>Building a Java library which implements JSON conversion between JSON strings and Java beans. The source code is available in <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2ppcnVmZmUvamlyYWZmZQ==">here<i class="fa fa-external-link-alt"></i></span>.</p></div><span id="more"></span><h1 id="Object-JSONElement"><a href="#Object-JSONElement" class="headerlink" title="Object => JSONElement"></a>Object => JSONElement</h1><p>Firstly, check the type of the object to see if it can be directly converted to JSONPrimitive, JSONList, JSONMap. Otherwise, treat it as a record and use reflection to extract the field name and value and convert it to JSONMap.</p><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><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><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> JSONElement <span class="title function_">analyze</span><span class="params">(Object o)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (<span class="literal">null</span> == o) {</span><br><span class="line"> <span class="keyword">return</span> JSONElement.theVoid();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (o <span class="keyword">instanceof</span> JSONElement) {</span><br><span class="line"> <span class="keyword">return</span> (JSONElement) o;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> Class<?> cls = o.getClass();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (o <span class="keyword">instanceof</span> String) {</span><br><span class="line"> <span class="keyword">return</span> JSONElement.newPrimitive(o);</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (o <span class="keyword">instanceof</span> Number) {</span><br><span class="line"> <span class="keyword">return</span> JSONElement.newPrimitive(o);</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (TypeUtil.isPrimitive(o)) {</span><br><span class="line"> <span class="keyword">return</span> JSONElement.newPrimitive(o);</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (cls.isEnum()) {</span><br><span class="line"> <span class="keyword">return</span> JSONElement.newPrimitive(((Enum) o).ordinal());</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (cls.isArray()) {</span><br><span class="line"> <span class="type">JSONElement</span> <span class="variable">list</span> <span class="operator">=</span> JSONElement.newList();</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < Array.getLength(o); i++) {</span><br><span class="line"> list.offer(analyze(Array.get(o, i)));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> list;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (o <span class="keyword">instanceof</span> Iterable) {</span><br><span class="line"> <span class="type">JSONElement</span> <span class="variable">list</span> <span class="operator">=</span> JSONElement.newList();</span><br><span class="line"> <span class="keyword">for</span> (Object oo : (Iterable) o) {</span><br><span class="line"> list.offer(analyze(oo));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> list;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (o <span class="keyword">instanceof</span> Enumeration) {</span><br><span class="line"> <span class="type">JSONElement</span> <span class="variable">list</span> <span class="operator">=</span> JSONElement.newList();</span><br><span class="line"> <span class="type">Enumeration</span> <span class="variable">es</span> <span class="operator">=</span> (Enumeration) o;</span><br><span class="line"> <span class="keyword">while</span> (es.hasMoreElements()) {</span><br><span class="line"> list.offer(analyze(es.nextElement()));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> list;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (o <span class="keyword">instanceof</span> Map) {</span><br><span class="line"> <span class="type">JSONElement</span> <span class="variable">map</span> <span class="operator">=</span> JSONElement.newMap();</span><br><span class="line"> <span class="keyword">for</span> (Object e : ((Map) o).entrySet()) {</span><br><span class="line"> map.offer(StringUtil.toString(((Map.Entry) e).getKey()), analyze(((Map.Entry) e).getValue()));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> map;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (o <span class="keyword">instanceof</span> Dictionary) {</span><br><span class="line"> <span class="type">JSONElement</span> <span class="variable">map</span> <span class="operator">=</span> JSONElement.newMap();</span><br><span class="line"> <span class="type">Enumeration</span> <span class="variable">keys</span> <span class="operator">=</span> ((Dictionary) o).keys();</span><br><span class="line"> <span class="keyword">while</span> (keys.hasMoreElements()) {</span><br><span class="line"> <span class="type">Object</span> <span class="variable">k</span> <span class="operator">=</span> keys.nextElement();</span><br><span class="line"> map.offer(StringUtil.toString(k), analyze(((Dictionary) o).get(k)));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> map;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="type">JSONElement</span> <span class="variable">map</span> <span class="operator">=</span> JSONElement.newMap();</span><br><span class="line"> <span class="keyword">for</span> (Field f : ObjectUtil.getFields(cls)) {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> map.offer(f.getName(), analyze(f.get(o)));</span><br><span class="line"> } <span class="keyword">catch</span> (IllegalAccessException ignored) {</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> map;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="JSONElement-Object"><a href="#JSONElement-Object" class="headerlink" title="JSONElement => Object"></a>JSONElement => Object</h1><p>The basic idea is to get the field name of the target type and then take the value into recursion.</p><p>The source code is too long to show it here. Check <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2ppcnVmZmUvamlyYWZmZS9ibG9iL21hc3Rlci9zcmMvbWFpbi9qYXZhL2NvbS9qaXJ1ZmZlL2ppcmFmZmUvYW5hbHl6ZXIvT2JqZWN0QW5hbHl6ZXIuamF2YQ==">ObjectAnalyzer<i class="fa fa-external-link-alt"></i></span> instead.</p>]]></content>
<summary type="html"><div class="note default"><p>Building a Java library which implements JSON conversion between JSON strings and Java beans. The source code is available in <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2ppcnVmZmUvamlyYWZmZQ==">here<i class="fa fa-external-link-alt"></i></span>.</p>
</div></summary>
<category term="algorithm" scheme="https://jiruffe.com/categories/algorithm/"/>
<category term="reinventing-the-wheel" scheme="https://jiruffe.com/tags/reinventing-the-wheel/"/>
<category term="java" scheme="https://jiruffe.com/tags/java/"/>
<category term="json" scheme="https://jiruffe.com/tags/json/"/>
</entry>
<entry>
<title>Reinventing the Wheel: JSON Conversion Library (Ⅱ)</title>
<link href="https://jiruffe.com/posts/79a0a64c/"/>
<id>https://jiruffe.com/posts/79a0a64c/</id>
<published>2019-04-16T07:50:38.000Z</published>
<updated>2019-04-16T07:50:38.000Z</updated>
<content type="html"><![CDATA[<div class="note default"><p>Building a Java library which implements JSON conversion between JSON strings and Java beans. The source code is available in <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2ppcnVmZmUvamlyYWZmZQ==">here<i class="fa fa-external-link-alt"></i></span>.</p></div><span id="more"></span><h1 id="String-JSONElement"><a href="#String-JSONElement" class="headerlink" title="String => JSONElement"></a>String => JSONElement</h1><p>Briefly, the basic idea is creating sub-elements during the traversal of json string. So traversing the json string, handling the keywords, and expecting the time complexity to be O(n).</p><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><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="keyword">for</span> (<span class="type">char</span> c : json.toCharArray()) {</span><br><span class="line"> <span class="keyword">switch</span> (c) {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> <span class="string">'"'</span>:</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'\''</span>:</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">case</span> <span class="string">'{'</span>:</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> <span class="string">'['</span>:</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">case</span> <span class="string">':'</span>:</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">case</span> <span class="string">','</span>:</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">case</span> <span class="string">'}'</span>:</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">case</span> <span class="string">']'</span>:</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">default</span>:</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></pre></td></tr></table></figure><p>See <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2ppcnVmZmUvamlyYWZmZS9ibG9iL21hc3Rlci9zcmMvbWFpbi9qYXZhL2NvbS9qaXJ1ZmZlL2ppcmFmZmUvYW5hbHl6ZXIvU3RyaW5nQW5hbHl6ZXIuamF2YQ==">StringAnalyzer<i class="fa fa-external-link-alt"></i></span> for more details.</p><h1 id="JSONElement-String"><a href="#JSONElement-String" class="headerlink" title="JSONElement => String"></a>JSONElement => String</h1><p>Much easier than <a href="#string-gt-JSONElement">string => JSONElement</a>. Recursively read sub-elements and append its value to a <code>StringBuilder</code>.</p><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><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><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">analyze</span><span class="params">(JSONElement element)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="type">StringBuilder</span> <span class="variable">sb</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuilder</span>();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">switch</span> (element.getType()) {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> LIST:</span><br><span class="line"> sb.append(<span class="string">'['</span>);</span><br><span class="line"> Iterator<JSONElement.Entry> iterator = element.iterator();</span><br><span class="line"> <span class="keyword">while</span> (iterator.hasNext()) {</span><br><span class="line"> sb.append(analyze(iterator.next().getElement()));</span><br><span class="line"> <span class="keyword">if</span> (iterator.hasNext()) {</span><br><span class="line"> sb.append(<span class="string">','</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> sb.append(<span class="string">']'</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> MAP:</span><br><span class="line"> sb.append(<span class="string">'{'</span>);</span><br><span class="line"> Iterator<JSONElement.Entry> iterator1 = element.iterator();</span><br><span class="line"> <span class="keyword">while</span> (iterator1.hasNext()) {</span><br><span class="line"> JSONElement.<span class="type">Entry</span> <span class="variable">e</span> <span class="operator">=</span> iterator1.next();</span><br><span class="line"> sb.append(<span class="string">'"'</span>);</span><br><span class="line"> sb.append(StringUtil.escape(StringUtil.toString(e.getKey())));</span><br><span class="line"> sb.append(<span class="string">'"'</span>);</span><br><span class="line"> sb.append(<span class="string">':'</span>);</span><br><span class="line"> sb.append(analyze(e.getElement()));</span><br><span class="line"> <span class="keyword">if</span> (iterator1.hasNext()) {</span><br><span class="line"> sb.append(<span class="string">','</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> sb.append(<span class="string">'}'</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">case</span> PRIMITIVE:</span><br><span class="line"> <span class="type">Object</span> <span class="variable">v</span> <span class="operator">=</span> element.asValue();</span><br><span class="line"> <span class="keyword">if</span> (v <span class="keyword">instanceof</span> String) {</span><br><span class="line"> sb.append(<span class="string">'"'</span>);</span><br><span class="line"> sb.append(StringUtil.escape((String) v));</span><br><span class="line"> sb.append(<span class="string">'"'</span>);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> sb.append(StringUtil.toString(v));</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 class="keyword">case</span> VOID:</span><br><span class="line"> sb.append(StringUtil.NULL);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">default</span>:</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 class="keyword">return</span> sb.toString();</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><div class="note default"><p>Building a Java library which implements JSON conversion between JSON strings and Java beans. The source code is available in <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2ppcnVmZmUvamlyYWZmZQ==">here<i class="fa fa-external-link-alt"></i></span>.</p>
</div></summary>
<category term="algorithm" scheme="https://jiruffe.com/categories/algorithm/"/>
<category term="reinventing-the-wheel" scheme="https://jiruffe.com/tags/reinventing-the-wheel/"/>
<category term="java" scheme="https://jiruffe.com/tags/java/"/>
<category term="json" scheme="https://jiruffe.com/tags/json/"/>
</entry>
<entry>
<title>Reinventing the Wheel: JSON Conversion Library (Ⅰ)</title>
<link href="https://jiruffe.com/posts/60bb970d/"/>
<id>https://jiruffe.com/posts/60bb970d/</id>
<published>2019-04-16T05:56:37.000Z</published>
<updated>2019-04-16T05:56:37.000Z</updated>
<content type="html"><![CDATA[<div class="note default"><p>Building a Java library which implements JSON conversion between JSON strings and Java beans. The source code is available in <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2ppcnVmZmUvamlyYWZmZQ==">here<i class="fa fa-external-link-alt"></i></span>.</p></div><span id="more"></span><h1 id="Types"><a href="#Types" class="headerlink" title="Types"></a>Types</h1><p>At the beginning, we may need a basic class that represents all the data types of JSON including array <code>[]</code>, object <code>{}</code>, value <code>112358.0</code>, and even <code>null</code> or <code>undefined</code>. It provides interfaces accessing and modifying itself or its sub-elements. Like this</p><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><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="keyword">public</span> <span class="keyword">abstract</span> <span class="keyword">class</span> <span class="title class_">JSONElement</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> JSONElement <span class="title function_">peek</span><span class="params">(Object k)</span> {</span><br><span class="line"> <span class="comment">// <span class="doctag">TODO:</span> return the specific sub-element</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> JSONElement <span class="title function_">offer</span><span class="params">(Object v)</span> {</span><br><span class="line"> <span class="comment">// <span class="doctag">TODO:</span> add the value to the array</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">// return the element itself for method chaining</span></span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">this</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> JSONElement <span class="title function_">offer</span><span class="params">(Object k, Object v)</span> {</span><br><span class="line"> <span class="comment">// <span class="doctag">TODO:</span> add the value to the object with specified key</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">// return the element itself for method chaining</span></span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">this</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>And the derived classes representing each JSON data type. Using <code>List</code> to simulate <code>[]</code>, and <code>Map</code> to simulate <code>{}</code>.</p><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><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">final</span> <span class="keyword">class</span> <span class="title class_">JSONList</span> <span class="keyword">extends</span> <span class="title class_">JSONElement</span> {</span><br><span class="line"> <span class="keyword">private</span> List<JSONElement> _sub_elements;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">final</span> <span class="keyword">class</span> <span class="title class_">JSONMap</span> <span class="keyword">extends</span> <span class="title class_">JSONElement</span> {</span><br><span class="line"> <span class="keyword">private</span> Map<Object, JSONElement> _sub_elements;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">final</span> <span class="keyword">class</span> <span class="title class_">JSONPrimitive</span> <span class="keyword">extends</span> <span class="title class_">JSONElement</span> {</span><br><span class="line"> <span class="keyword">private</span> Object _value;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">final</span> <span class="keyword">class</span> <span class="title class_">JSONVoid</span> <span class="keyword">extends</span> <span class="title class_">JSONElement</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * The singleton instance of {<span class="doctag">@link</span> JSONVoid}.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">JSONVoid</span> <span class="variable">INSTANCE</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JSONVoid</span>();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="Interfaces"><a href="#Interfaces" class="headerlink" title="Interfaces"></a>Interfaces</h1><p>A <code>JSON</code> class that providing methods named JS-like (<code>JSON.stringify</code>, <code>JSON.parse</code>) may helps while using.</p><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><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><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="keyword">class</span> <span class="title class_">JSON</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Serializes Java {<span class="doctag">@link</span> Object} to {<span class="doctag">@link</span> JSONElement}.</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> o the {<span class="doctag">@link</span> Object} to be serialized.</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> the {<span class="doctag">@link</span> JSONElement} serialized.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> JSONElement <span class="title function_">serialize</span><span class="params">(Object o)</span> {</span><br><span class="line"> <span class="keyword">if</span> (o <span class="keyword">instanceof</span> JSONElement) {</span><br><span class="line"> <span class="keyword">return</span> (JSONElement) o;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">return</span> ObjectAnalyzer.analyze(o);</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="comment"> * Deserializes JSON {<span class="doctag">@link</span> String} to {<span class="doctag">@link</span> JSONElement}.</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> json the JSON {<span class="doctag">@link</span> String} to be deserialized.</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> the {<span class="doctag">@link</span> JSONElement} deserialized.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> JSONElement <span class="title function_">deserialize</span><span class="params">(String json)</span> {</span><br><span class="line"> <span class="keyword">return</span> StringAnalyzer.analyze(json);</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="comment"> * Directly serializes Java {<span class="doctag">@link</span> Object} to JSON {<span class="doctag">@link</span> String}.</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> o the {<span class="doctag">@link</span> Object} to be serialized.</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> the JSON {<span class="doctag">@link</span> String} serialized.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">stringify</span><span class="params">(Object o)</span> {</span><br><span class="line"> <span class="keyword">if</span> (o <span class="keyword">instanceof</span> JSONElement) {</span><br><span class="line"> <span class="keyword">return</span> StringAnalyzer.analyze((JSONElement) o);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">return</span> DirectAnalyzer.analyze(o);</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="comment"> * Directly deserializes JSON {<span class="doctag">@link</span> String} to Java {<span class="doctag">@link</span> Object}.</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> json the JSON {<span class="doctag">@link</span> String} to be deserialized.</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> target the target {<span class="doctag">@link</span> Type}.</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> <T> the target {<span class="doctag">@link</span> Type}.</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> the Java {<span class="doctag">@link</span> Object} deserialized.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <T> T <span class="title function_">parse</span><span class="params">(String json, Type target)</span> {</span><br><span class="line"> <span class="keyword">if</span> (target <span class="keyword">instanceof</span> Class && JSONElement.class.isAssignableFrom((Class) target)) {</span><br><span class="line"> <span class="keyword">return</span> (T) StringAnalyzer.analyze(json);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">return</span> DirectAnalyzer.analyze(json, target);</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><p>So far, nothing special but that we created some contentless classes. Completing the <code>StringAnalyzer</code> and <code>ObjectAnalyzer</code> in the next posts.</p>]]></content>
<summary type="html"><div class="note default"><p>Building a Java library which implements JSON conversion between JSON strings and Java beans. The source code is available in <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2ppcnVmZmUvamlyYWZmZQ==">here<i class="fa fa-external-link-alt"></i></span>.</p>
</div></summary>
<category term="algorithm" scheme="https://jiruffe.com/categories/algorithm/"/>
<category term="reinventing-the-wheel" scheme="https://jiruffe.com/tags/reinventing-the-wheel/"/>
<category term="java" scheme="https://jiruffe.com/tags/java/"/>
<category term="json" scheme="https://jiruffe.com/tags/json/"/>
</entry>
<entry>
<title>RK3399 + ALC5640 声音忽大忽小</title>
<link href="https://jiruffe.com/posts/fa792909/"/>
<id>https://jiruffe.com/posts/fa792909/</id>
<published>2019-04-04T04:49:35.000Z</published>
<updated>2019-04-04T04:49:35.000Z</updated>
<content type="html"><![CDATA[<div class="note default"><p>在 RK3399 上使用 Android 7.1,扬声器发出的声音总是忽大忽小,就像是应用程序接到了失去焦点事件<code>AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK</code>然后主动降低音量一样。</p></div><span id="more"></span><p>更新了<code>tinyalsa</code>部分的代码然后重新打包 framework 问题不再复现</p><img data-src="/posts/fa792909/rk_commit_c8c922e8.png" class="" title="rk_commit_c8c922e8">]]></content>
<summary type="html"><div class="note default"><p>在 RK3399 上使用 Android 7.1,扬声器发出的声音总是忽大忽小,就像是应用程序接到了失去焦点事件<code>AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK</code>然后主动降低音量一样。</p>
</div></summary>
<category term="embed" scheme="https://jiruffe.com/categories/embed/"/>
<category term="rk3399" scheme="https://jiruffe.com/tags/rk3399/"/>
<category term="alc5640" scheme="https://jiruffe.com/tags/alc5640/"/>
<category term="android" scheme="https://jiruffe.com/tags/android/"/>
</entry>
<entry>
<title>MPU-6050 运动检测中断不触发</title>
<link href="https://jiruffe.com/posts/4fbcecef/"/>
<id>https://jiruffe.com/posts/4fbcecef/</id>
<published>2019-03-13T02:01:49.000Z</published>
<updated>2019-03-13T02:01:49.000Z</updated>
<content type="html"><![CDATA[<div class="note default"><p>在使用 STM32 + MPU-6050 的时候,期望 STM32 进入停止模式后靠 MPU-6050 的运动检测来触发 STM32 的外部中断唤醒。却发现 INT 脚一直为高,不拉低。</p></div><span id="more"></span><p>根据 MPU-6050 的 datasheet</p><img data-src="/posts/4fbcecef/mpu6050_register_56_4_0.png" class="" title="mpu6050_register_56_4_0"><p>在初始化时配置了中断</p><figure class="highlight c"><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">MPU_Write_Byte(MPU_INTBP_CFG_REG, <span class="number">0xA0</span>); <span class="comment">// INT引脚低电平有效</span></span><br><span class="line">MPU_Write_Byte(MPU_MDETECT_CTRL_REG, <span class="number">0x1F</span>); <span class="comment">// 运动检测延时 200ms</span></span><br><span class="line">MPU_Write_Byte(MPU_MOTION_DET_REG, <span class="number">0x01</span>); <span class="comment">// 运动检测中断阈值</span></span><br><span class="line">MPU_Write_Byte(MPU_INT_EN_REG, <span class="number">0x40</span>); <span class="comment">// 开启运动检测中断</span></span><br></pre></td></tr></table></figure><p>结果 INT 脚却始终为高,怎么晃动都不拉低。</p><p>原来是看的 datasheet 版本太老了,新版本已经没有这个运动检测中断了。</p><img data-src="/posts/4fbcecef/mpu6050_register_56_4_2.png" class="" title="mpu6050_register_56_4_2"><p>于是只好在停止模式下用 RTC 闹钟定时检查加速度的变化。</p><figure class="highlight c"><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></pre></td><td class="code"><pre><span class="line">ENTERSTOPMODE:</span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 开启 RTC 闹钟 用以喂狗</span></span><br><span class="line"> IWDG_Feed();</span><br><span class="line"> dev_rtc_setAlarm(<span class="number">3</span>);</span><br><span class="line"> IWDG_Feed();</span><br><span class="line"> </span><br><span class="line"> DEBUG_MSG(<span class="string">"standby mode entered\r\n"</span>);</span><br><span class="line"> IWDG_Feed();</span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 进入停止模式</span></span><br><span class="line"> PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//DEBUG_MSG("standby mode exited\r\n");</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 是RTC闹钟唤醒的</span></span><br><span class="line"> <span class="keyword">if</span> (dev_rtc_isAlarm()) {</span><br><span class="line"> <span class="comment">//DEBUG_MSG("it's the RTC alarm, just feed watch dog\r\n");</span></span><br><span class="line"> <span class="comment">// 喂狗</span></span><br><span class="line"> IWDG_Feed();</span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 检查新的加速度</span></span><br><span class="line"> MPU_Get_Accelerometer(&t_aacx, &t_aacy,&t_aacz);</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">abs</span>(t_aacx - aacx) > THRESHOLD_ACCELEROMETER_CHANGE || <span class="built_in">abs</span>(t_aacy - aacy) > THRESHOLD_ACCELEROMETER_CHANGE || <span class="built_in">abs</span>(t_aacz - aacz) > THRESHOLD_ACCELEROMETER_CHANGE) {</span><br><span class="line"> <span class="comment">// 利用看门狗重启</span></span><br><span class="line"> <span class="keyword">while</span> (<span class="number">1</span>) {;}</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">goto</span> ENTERSTOPMODE;</span><br><span class="line"> }</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><div class="note default"><p>在使用 STM32 + MPU-6050 的时候,期望 STM32 进入停止模式后靠 MPU-6050 的运动检测来触发 STM32 的外部中断唤醒。却发现 INT 脚一直为高,不拉低。</p>
</div></summary>
<category term="embed" scheme="https://jiruffe.com/categories/embed/"/>
<category term="stm32" scheme="https://jiruffe.com/tags/stm32/"/>
<category term="mpu6050" scheme="https://jiruffe.com/tags/mpu6050/"/>
</entry>
<entry>
<title>Hexo + GitHub Pages 搭建个人博客</title>
<link href="https://jiruffe.com/posts/4985a7ca/"/>
<id>https://jiruffe.com/posts/4985a7ca/</id>
<published>2019-03-07T10:00:03.000Z</published>
<updated>2019-03-07T10:00:03.000Z</updated>
<content type="html"><![CDATA[<div class="note default"><p>你正在浏览的<a href="https://jiruffe.com/">这个博客本身</a>就是 Hexo 实现的。<span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvLw==">Hexo<i class="fa fa-external-link-alt"></i></span>是一个“快速、简洁且高效的博客框架”,支持<code>GitHub Flavored Markdown</code>,支持主题和插件。其生成的是静态网页,可以直接部署在<span class="exturl" data-url="aHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vZW4vYXJ0aWNsZXMvd2hhdC1pcy1naXRodWItcGFnZXM=">GitHub Pages<i class="fa fa-external-link-alt"></i></span>上。</p></div><span id="more"></span><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><p>以下都是在 Mac 上的操作,其他系统上可能有些不同</p><h2 id="brew"><a href="#brew" class="headerlink" title="brew"></a>brew</h2><p>Mac 上的包管理工具,为了方便装其他工具,<span class="exturl" data-url="aHR0cHM6Ly9icmV3LnNoLw==">官网<i class="fa fa-external-link-alt"></i></span>上就可以找到安装方法:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"</span><br></pre></td></tr></table></figure><p>装完后可以执行下</p><figure class="highlight shell"><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">brew update</span><br><span class="line">brew upgrade</span><br></pre></td></tr></table></figure><h2 id="git"><a href="#git" class="headerlink" title="git"></a>git</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install git</span><br></pre></td></tr></table></figure><p>或者装<span class="exturl" data-url="aHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3hjb2RlLw==">XCode<i class="fa fa-external-link-alt"></i></span></p><h2 id="node-js"><a href="#node-js" class="headerlink" title="node.js"></a>node.js</h2><p>可以直接去<span class="exturl" data-url="aHR0cHM6Ly9ub2RlanMub3JnLw==">官网<i class="fa fa-external-link-alt"></i></span>下,这里更推荐用<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2NyZWF0aW9uaXgvbnZt">nvm<i class="fa fa-external-link-alt"></i></span></p><figure class="highlight shell"><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">curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash</span><br><span class="line">nvm install stable</span><br></pre></td></tr></table></figure><h2 id="hexo"><a href="#hexo" class="headerlink" title="hexo"></a>hexo</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-cli -g</span><br></pre></td></tr></table></figure><h1 id="写作"><a href="#写作" class="headerlink" title="写作"></a>写作</h1><p>东西都安装好了!现在创建一个工作目录<code>hexo-blog</code>,然后在目录内执行</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo init</span><br></pre></td></tr></table></figure><p>一个hexo项目就创建完成了!可以看到这样的目录结构</p><figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">hexo-blog/</span><br><span class="line">├── _config.yml # 项目的配置</span><br><span class="line">├── node_modules # node依赖</span><br><span class="line">├── package-lock.json # node依赖描述</span><br><span class="line">├── package.json # node依赖描述</span><br><span class="line">├── public # 输出的静态网站</span><br><span class="line">├── scaffolds # 模版</span><br><span class="line">├── source # 源码</span><br><span class="line">└── themes # 主题</span><br></pre></td></tr></table></figure><p>然后用</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo new hello</span><br></pre></td></tr></table></figure><p>就可以创建出一篇标题为 hello 的新文章,文件在<code>./source/_post/hello.md</code></p><h2 id="Front-matter"><a href="#Front-matter" class="headerlink" title="Front-matter"></a>Front-matter</h2><p>文件最上方<code>---</code>包含的就是<code>Front-matter</code>,用来设置文章的标题、日期、分类、标签等属性</p><figure class="highlight plaintext"><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><br><span class="line">title: hello</span><br><span class="line">date: 2019-03-07 18:00:03</span><br><span class="line">tags:</span><br><span class="line">---</span><br></pre></td></tr></table></figure><p>可以参考<span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL3poLWNuL2RvY3MvZnJvbnQtbWF0dGVy">官方文档<i class="fa fa-external-link-alt"></i></span></p><h2 id="文章内容"><a href="#文章内容" class="headerlink" title="文章内容"></a>文章内容</h2><p>文章内容默认用<code>Markdown</code>语法,可以看<span class="exturl" data-url="aHR0cHM6Ly9ndWlkZXMuZ2l0aHViLmNvbS9mZWF0dXJlcy9tYXN0ZXJpbmctbWFya2Rvd24v">GitHub Guides<i class="fa fa-external-link-alt"></i></span></p><p>想要在首页展示一个<code>阅读全文</code>按钮而不是全文展示,只需要在文章中间加入一行<code><!-- more --></code>,首页上就只会展示这个标记之前的内容了</p><h1 id="调试"><a href="#调试" class="headerlink" title="调试"></a>调试</h1><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo s</span><br></pre></td></tr></table></figure><p>然后用浏览器打开<code>http://localhost:4000</code>就可以看到展示效果了</p><p>加入 debug 参数可以看到更多调试输出</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo s --debug</span><br></pre></td></tr></table></figure><h1 id="部署"><a href="#部署" class="headerlink" title="部署"></a>部署</h1><ol><li><p>在GitHub 上新建一个仓库,取名为<code><username>.github.io</code>,<code><username></code>要替换成你自己的 GitHub username</p></li><li><p>在 Hexo 工作目录下执行</p></li></ol><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-deployer-git --save</span><br></pre></td></tr></table></figure><ol><li>打开 Hexo 工作目录下的<code>_config.yml</code>,找到<code>deploy</code>节点,配置成这样</li></ol><figure class="highlight yml"><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="attr">deploy:</span></span><br><span class="line"> <span class="attr">type:</span> <span class="string">git</span></span><br><span class="line"> <span class="attr">repo:</span> <span class="string">git@github.com:<username>/<username>.github.io.git</span></span><br><span class="line"> <span class="attr">branch:</span> <span class="string">master</span></span><br></pre></td></tr></table></figure><pre><code>同样的,`<username>`要替换成你自己的 GitHub username</code></pre><ol><li>执行</li></ol><figure class="highlight shell"><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">hexo clean</span><br><span class="line">hexo g --d</span><br></pre></td></tr></table></figure><ol><li>完成了!现在打开<code>https://<username>.github.io</code>就是部署好之后的博客了。<blockquote><p>如果想使用自己的域名</p><blockquote><ol><li>在<code>source</code>目录下创建一个名为<code>CNAME</code>的文件(文件名必须全大写),里面写上你的域名</li><li>重新执行部署</li><li>在你的域名服务商中增加记录值为<code><username>.github.io</code>的<code>CNAME</code>解析</li></ol></blockquote><p>就可以啦。</p></blockquote></li></ol><h1 id="主题"><a href="#主题" class="headerlink" title="主题"></a>主题</h1><ul><li><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3RoZW1lLW5leHQvaGV4by10aGVtZS1uZXh0">NexT<i class="fa fa-external-link-alt"></i></span> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone https://github.com/theme-next/hexo-theme-next themes/next</span><br></pre></td></tr></table></figure> 然后打开<code>_config.yml</code>将<code>theme</code>节点设置成<code>theme: next</code></li></ul><h1 id="插件"><a href="#插件" class="headerlink" title="插件"></a>插件</h1><ul><li><p><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2NoZW56aHV0aWFuL2hleG8tYWxsLW1pbmlmaWVy">hexo-all-minifier<i class="fa fa-external-link-alt"></i></span></p> <figure class="highlight shell"><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">brew install libtool automake autoconf nasm</span><br><span class="line">npm install hexo-all-minifier --save</span><br></pre></td></tr></table></figure><p> 可以压缩生成的html、js、css和图片</p><blockquote><p>实际用下来发现有些BUG,不要开启<code>js_concator</code>和<code>image_minifier</code>这两项功能</p></blockquote></li><li><p><span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3d6cGFuL2hleG8tZ2VuZXJhdG9yLXNlYXJjaA==">local-search<i class="fa fa-external-link-alt"></i></span></p> <figure class="highlight shell"><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">npm install hexo-generator-search --save</span><br><span class="line">npm install hexo-generator-searchdb --save</span><br></pre></td></tr></table></figure><p> 然后编辑<code>_config.yml</code>增加</p> <figure class="highlight yml"><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="attr">search:</span></span><br><span class="line"> <span class="attr">path:</span> <span class="string">search.xml</span></span><br><span class="line"> <span class="attr">field:</span> <span class="string">post</span></span><br><span class="line"> <span class="attr">format:</span> <span class="string">html</span></span><br><span class="line"> <span class="attr">limit:</span> <span class="number">10000</span></span><br></pre></td></tr></table></figure><p> 以及修改<code>themes/next/_config.yml</code>的<code>local_search</code>节点</p> <figure class="highlight yml"><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="attr">local_search:</span></span><br><span class="line"> <span class="attr">enable:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p> 可以给网站增加一个搜索功能</p></li></ul>]]></content>
<summary type="html"><div class="note default"><p>你正在浏览的<a href="https://jiruffe.com/">这个博客本身</a>就是 Hexo 实现的。<span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvLw==">Hexo<i class="fa fa-external-link-alt"></i></span>是一个“快速、简洁且高效的博客框架”,支持<code>GitHub Flavored Markdown</code>,支持主题和插件。其生成的是静态网页,可以直接部署在<span class="exturl" data-url="aHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vZW4vYXJ0aWNsZXMvd2hhdC1pcy1naXRodWItcGFnZXM=">GitHub Pages<i class="fa fa-external-link-alt"></i></span>上。</p>
</div></summary>
<category term="web" scheme="https://jiruffe.com/categories/web/"/>
<category term="blog" scheme="https://jiruffe.com/tags/blog/"/>
<category term="hexo" scheme="https://jiruffe.com/tags/hexo/"/>
<category term="github" scheme="https://jiruffe.com/tags/github/"/>
</entry>
</feed>