-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
331 lines (331 loc) · 43.7 KB
/
index.html
File metadata and controls
331 lines (331 loc) · 43.7 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
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
<!doctype html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"><meta><title>St.kai‘s blog</title><link rel="manifest" href="/manifest.json"><meta name="application-name" content="St.kai‘s blog"><meta name="msapplication-TileImage" content="/img/favicon.svg"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-title" content="St.kai‘s blog"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta property="og:type" content="blog"><meta property="og:title" content="St.kai‘s blog"><meta property="og:url" content="https://github.com/Stkai/Stkai.github.io"><meta property="og:site_name" content="St.kai‘s blog"><meta property="og:locale" content="zh_CN"><meta property="og:image" content="https://github.com/img/og_image.png"><meta property="article:author" content="St.kai"><meta property="twitter:card" content="summary"><meta property="twitter:image" content="/img/og_image.png"><script type="application/ld+json">{"@context":"https://schema.org","@type":"BlogPosting","mainEntityOfPage":{"@type":"WebPage","@id":"https://github.com/Stkai/Stkai.github.io"},"headline":"St.kai‘s blog","image":["https://github.com/img/og_image.png"],"author":{"@type":"Person","name":"St.kai"},"description":""}</script><link rel="icon" href="/img/favicon.svg"><link rel="stylesheet" href="https://cdnjs.loli.net/ajax/libs/font-awesome/5.12.0/css/all.min.css"><link rel="stylesheet" href="https://cdnjs.loli.net/ajax/libs/highlight.js/9.12.0/styles/atom-one-light.min.css"><link rel="stylesheet" href="https://fonts.loli.net/css2?family=Ubuntu:wght@400;600&family=Source+Code+Pro"><link rel="stylesheet" href="/css/default.css"><style>body>.footer,body>.navbar,body>.section{opacity:0}</style><!--!--><!--!--><!--!--><!--!--><link rel="stylesheet" href="https://cdnjs.loli.net/ajax/libs/cookieconsent/3.1.1/cookieconsent.min.css"><link rel="stylesheet" href="https://cdnjs.loli.net/ajax/libs/lightgallery/1.6.8/css/lightgallery.min.css"><link rel="stylesheet" href="https://cdnjs.loli.net/ajax/libs/justifiedGallery/3.7.0/css/justifiedGallery.min.css"><!--!--><!--!--><script src="https://cdnjs.loli.net/ajax/libs/pace/1.0.2/pace.min.js"></script><!--!--><!--!--><meta name="generator" content="Hexo 5.3.0"></head><body class="is-2-column"><nav class="navbar navbar-main"><div class="container"><div class="navbar-brand justify-content-center"><a class="navbar-item navbar-logo" href="/"><img src="/img/logo.svg" alt="St.kai‘s blog" height="28"></a></div><div class="navbar-menu"><div class="navbar-start"><a class="navbar-item is-active" href="/">Home</a><a class="navbar-item" href="/archives">Archives</a><a class="navbar-item" href="/categories">Categories</a><a class="navbar-item" href="/tags">Tags</a><a class="navbar-item" href="/about">About</a></div><div class="navbar-end"><a class="navbar-item" target="_blank" rel="noopener" title="Download on GitHub" href="https://github.com/ppoffice/hexo-theme-icarus"><i class="fab fa-github"></i></a><a class="navbar-item search" title="搜索" href="javascript:;"><i class="fas fa-search"></i></a></div></div></div></nav><section class="section"><div class="container"><div class="columns"><div class="column order-2 column-main is-8-tablet is-8-desktop is-8-widescreen"><div class="card"><article class="card-content article" role="article"><div class="article-meta is-size-7 is-uppercase level is-mobile"><div class="level-left"><span class="level-item"><time dateTime="2021-02-01T15:38:35.000Z" title="2021-02-01T15:38:35.000Z">2021-02-01</time>发表</span><span class="level-item"><time dateTime="2021-02-01T15:38:35.000Z" title="2021-02-01T15:38:35.000Z">2021-02-01</time>更新</span><span class="level-item"><a class="link-muted" href="/categories/JavaScript/">JavaScript</a></span><span class="level-item">7 分钟读完 (大约977个字)</span></div></div><h1 class="title is-3 is-size-4-mobile"><a class="link-muted" href="/2021/02/01/JavaScript%E4%B8%AD%E7%9A%84%E8%B5%8B%E5%80%BC%E3%80%81%E6%B5%85%E6%8B%B7%E8%B4%9D%E5%92%8C%E6%B7%B1%E6%8B%B7%E8%B4%9D/">JavaScript中的赋值、浅拷贝和深拷贝</a></h1><div class="content"><p>前两天用对Vue做了一个页面,内用是表格,点击表格的编辑按钮弹出模态框可以进行编辑。 </p>
<table>
<thead>
<tr>
<th>操作</th>
<th>姓名</th>
<th>性别</th>
<th>出生日期</th>
<th>身份证号</th>
<th>data</th>
</tr>
</thead>
<tbody><tr>
<td><font color="#3273dc">编辑</font></td>
<td>张三</td>
<td>男</td>
<td>1970-01-01</td>
<td>01234567</td>
<td>data[0]</td>
</tr>
<tr>
<td><font color="#3273dc">编辑</font></td>
<td>李四</td>
<td>男</td>
<td>1980-01-01</td>
<td>12345670</td>
<td>data[1]</td>
</tr>
<tr>
<td><font color="#3273dc">编辑</font></td>
<td>王五</td>
<td>女</td>
<td>1990-01-01</td>
<td>23456701</td>
<td>data[2]</td>
</tr>
</tbody></table>
<p>点击编辑后弹出模态框<br>将data[0]赋值给person</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">let person = data[0]</span><br></pre></td></tr></table></figure>
<table>
<thead>
<tr>
<th>person</th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td>姓名</td>
<td>张三</td>
</tr>
<tr>
<td>性别</td>
<td>男</td>
</tr>
<tr>
<td>出生日期</td>
<td>1970-01-01</td>
</tr>
<tr>
<td>身份证号</td>
<td>0123457</td>
</tr>
</tbody></table>
<p>编辑后弹窗的内容发现表格上的内容也会同步改变,难道是法外狂徒在捣鬼? </p>
<hr>
<p>首先让我们回顾一下JavaScript的数据类型</p>
<h2 id="JavaScript的数据类型"><a href="#JavaScript的数据类型" class="headerlink" title="JavaScript的数据类型"></a>JavaScript的数据类型</h2><p>JavaScrit中共有7种基本数据类型(原始数据类型)和对象 </p>
<ul>
<li>基本类型<ul>
<li><code>Undefined</code></li>
<li><code>Null</code></li>
<li><code>Boolean</code></li>
<li><code>String</code></li>
<li><code>Symbol</code></li>
<li>Numeric<ul>
<li><code>Number</code></li>
<li><code>BigInt</code></li>
</ul>
</li>
</ul>
</li>
<li>对象类型<ul>
<li><code>Object</code></li>
<li><code>Funcion</code></li>
<li><code>Date</code></li>
<li><code>JSON</code></li>
<li><code>Array</code></li>
<li><code>Map</code></li>
<li>…… </li>
</ul>
</li>
</ul>
<p>JavaScript中所有的基本类型只能替换,不能改变。</p>
<h2 id="Assignment赋值"><a href="#Assignment赋值" class="headerlink" title="Assignment赋值"></a><code>Assignment</code>赋值</h2><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">let x = 3;</span><br><span class="line">let y = x;</span><br><span class="line">y + 1;</span><br><span class="line"></span><br><span class="line">console.log(x);</span><br><span class="line">console.log(y);</span><br><span class="line">// expected output: 3</span><br><span class="line">// expected output: 4</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">let data = [{ name: 'zhangsan', sex: 1 }];</span><br><span class="line">let person = data[0];</span><br><span class="line">person.name = 'wangwu';</span><br><span class="line"></span><br><span class="line">console.log(data[0]);</span><br><span class="line">// expected output: { name: 'wangwu', sex: 1 }</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<p>这是因为虽然<code>data[0]</code>和<code>person</code>的名称不同,但是却指向了同一个内存地址。 </p>
<table>
<thead>
<tr>
<th>变量</th>
<th></th>
<th>内存地址</th>
<th></th>
<th>内存空间</th>
</tr>
</thead>
<tbody><tr>
<td>data[0]<br>person</td>
<td>→<br>→</td>
<td>0x11FF00</td>
<td>→</td>
<td>{ name: ‘wangwu’, sex: 1 }</td>
</tr>
</tbody></table>
<p>data和person既不是相同的变量名也不是相同的数据类型,但是data[0]和person他们指向了相同的内存地址,所以改变person时,data[0]也会同步改变。<br>那如何只改变person而不改变data[0]呢?我们把两个data[0]复制一份给person让他们存储在不同的内存块中不就可以了,这就是拷贝。拷贝分为浅拷贝和深拷贝。</p>
<h2 id="浅拷贝-Shallow-Copy"><a href="#浅拷贝-Shallow-Copy" class="headerlink" title="浅拷贝(Shallow Copy)"></a>浅拷贝(Shallow Copy)</h2><p>浅拷贝是指将对象内的原始数据类型复制一份,引用类型复制内存地址。<br>我们新建一个对象</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">let obj1 = {srt:'str' , arr:[1,2,3]}</span><br></pre></td></tr></table></figure>
<p>拷贝前 </p>
<table>
<thead>
<tr>
<th>obj</th>
<th></th>
<th>内存区域A</th>
<th></th>
<th>内存区域B</th>
</tr>
</thead>
<tbody><tr>
<td>obj1.str</td>
<td>→</td>
<td>‘str’</td>
<td></td>
<td></td>
</tr>
<tr>
<td>obj1.arr</td>
<td>→</td>
<td>0x11FF00</td>
<td>→</td>
<td>[1,2,3]</td>
</tr>
</tbody></table>
<p>将<code>obj1</code>浅拷贝之到<code>obj2</code>之后 </p>
<table>
<thead>
<tr>
<th>obj</th>
<th></th>
<th>内存区域A</th>
<th></th>
<th>内存区域B</th>
</tr>
</thead>
<tbody><tr>
<td>obj1.str</td>
<td>→</td>
<td>‘str’</td>
<td></td>
<td></td>
</tr>
<tr>
<td>obj1.arr</td>
<td>→</td>
<td>0x11FF00</td>
<td>→</td>
<td>[1,2,3]</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>obj2.str</td>
<td>→</td>
<td>‘str’</td>
<td></td>
<td></td>
</tr>
<tr>
<td>obj2.str</td>
<td>→</td>
<td>0x11FF00</td>
<td>↗</td>
<td></td>
</tr>
</tbody></table>
<h3 id="浅拷贝的方式"><a href="#浅拷贝的方式" class="headerlink" title="浅拷贝的方式"></a>浅拷贝的方式</h3><h4 id="1-Oject-assign"><a href="#1-Oject-assign" class="headerlink" title="1.Oject.assign()"></a>1.<code>Oject.assign()</code></h4><p><code>Object.assign()</code>可以将一个或多个源对象拷贝给目标对象并返回目标对象<br>语法</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Object.assign(target, sources)</span><br></pre></td></tr></table></figure>
<h4 id="2-展开语法-Spread-syntax"><a href="#2-展开语法-Spread-syntax" class="headerlink" title="2.展开语法(Spread syntax)"></a>2.展开语法(Spread syntax)</h4><ul>
<li>对象拷贝 </li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">let objClone = { ...obj };</span><br></pre></td></tr></table></figure>
<ul>
<li>数组拷贝 </li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">let newArr = [...oldArr];</span><br></pre></td></tr></table></figure>
<h4 id="3-数组分割Array-prototype-slice"><a href="#3-数组分割Array-prototype-slice" class="headerlink" title="3.数组分割Array.prototype.slice()"></a>3.数组分割<code>Array.prototype.slice()</code></h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">let newArray = oldArray.slice([begin[, end]])</span><br></pre></td></tr></table></figure>
<h4 id="4-数组合并Array-prototype-concat"><a href="#4-数组合并Array-prototype-concat" class="headerlink" title="4. 数组合并Array.prototype.concat()"></a>4. 数组合并<code>Array.prototype.concat()</code></h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">let newArray = oldArray.concat([value1[, ...[, valueN]]])</span><br></pre></td></tr></table></figure>
<p>等同于</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">let newArray = [...oldArray, ...value1, ...]</span><br></pre></td></tr></table></figure>
<p>数组的分割和合并首先会创建一个新的数组,所以也就对原来的数组完成了拷贝。</p>
<h2 id="深拷贝-Deep-Copy"><a href="#深拷贝-Deep-Copy" class="headerlink" title="深拷贝(Deep Copy)"></a>深拷贝(Deep Copy)</h2><p>深拷贝将是将原来的对象递归赋值,首先创建一个新的对象,然后将原来对象的内容递归复制到新的对象,原对象的引用类型也会复制一份。 </p>
<h4 id="1-JSON-parse-JSON-stringify-object"><a href="#1-JSON-parse-JSON-stringify-object" class="headerlink" title="1. JSON.parse(JSON.stringify(object))"></a>1. JSON.parse(JSON.stringify(object))</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">let newObj = JSON.parse(JSON.stringify(oldObj))</span><br></pre></td></tr></table></figure>
<p>缺点: </p>
<ul>
<li><code>undefinde</code>、<code>function</code>、<code>symbol</code> 在序列化过程中会被忽略</li>
<li><code>Date</code>在序列化过程中会被转为字符串(调用了toJSON())</li>
<li>NaN 和 Infinity 格式的数值及 null 都会被当做 null</li>
<li>循环引用的对象会形成无限循环然后报错 </li>
</ul>
<h4 id="2-Node-js利用v8引擎的序列化和反序列化接口"><a href="#2-Node-js利用v8引擎的序列化和反序列化接口" class="headerlink" title="2. Node.js利用v8引擎的序列化和反序列化接口"></a>2. Node.js利用v8引擎的序列化和反序列化接口</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">const v8 = require('v8');</span><br><span class="line">let newObj = v8.deserialize(v8.serialize(oldObj))</span><br></pre></td></tr></table></figure>
<h4 id="3-第三方JS库"><a href="#3-第三方JS库" class="headerlink" title="3.第三方JS库"></a>3.第三方JS库</h4><ul>
<li><a target="_blank" rel="noopener" href="https://lodash.com/docs#cloneDeep">Lodash</a></li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">lodash.clonedeep(objects)</span><br></pre></td></tr></table></figure>
<ul>
<li><a target="_blank" rel="noopener" href="https://docs.angularjs.org/api/ng/function/angular.copy">AngularJS</a></li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">angular.copy(source, [destination])</span><br></pre></td></tr></table></figure>
<ul>
<li><a target="_blank" rel="noopener" href="https://api.jquery.com/jquery.extend/#jQuery-extend-deep-target-object1-objectN">jQuery</a></li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">jQuery.extend( true, target, object1 [, objectN ] )</span><br></pre></td></tr></table></figure>
<h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ol>
<li> <a target="_blank" rel="noopener" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures">JavaScript data types and data structures | MDN</a></li>
<li><a target="_blank" rel="noopener" href="https://tc39.es/ecma262/">ECMA-262</a></li>
<li><a target="_blank" rel="noopener" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax">Spread syntax (…) | MDN</a></li>
<li><a target="_blank" rel="noopener" href="https://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-deep-clone-an-object-in-javascript/10916838#10916838">What is the most efficient way to deep clone an object in JavaScript? - Stack Overflow</a></li>
</ol>
</div></article></div><div class="card"><article class="card-content article" role="article"><div class="article-meta is-size-7 is-uppercase level is-mobile"><div class="level-left"><span class="level-item"><time dateTime="2021-01-26T15:39:55.000Z" title="2021-01-26T15:39:55.000Z">2021-01-26</time>发表</span><span class="level-item"><time dateTime="2021-01-29T15:27:00.000Z" title="2021-01-29T15:27:00.000Z">2021-01-29</time>更新</span><span class="level-item"><a class="link-muted" href="/categories/Linux/">Linux</a><span> / </span><a class="link-muted" href="/categories/Linux/Howdy/">Howdy</a></span><span class="level-item">6 分钟读完 (大约861个字)</span></div></div><h1 class="title is-3 is-size-4-mobile"><a class="link-muted" href="/2021/01/26/Howdy-Linu%E4%B8%8A%E7%9A%84-Windows-Hello/">Howdy Linu上的"Windows Hello"</a></h1><div class="content"><p>我电脑上一直用着简单的数字密码,输入起来比较方便,但是这样太不安全了,于是换成了大小写字母、数字、特殊字符组成的混合密码,但是每次解锁屏幕或者执行需要root权限的命令时输入复杂密码又觉得太过于麻烦,于是想到了Windows Hello,小新PRO13是有红外模块的,可以使用Window Hello,Linux上该如何解决呢?🔍搜索一番发现了一款叫做Howdy,可以使用人脸进行身份验证。</p>
<h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># yay -S howdy</span><br></pre></td></tr></table></figure>
<h2 id="使用前的准备"><a href="#使用前的准备" class="headerlink" title="使用前的准备"></a>使用前的准备</h2><h4 id="获取设备列表"><a href="#获取设备列表" class="headerlink" title="获取设备列表"></a>获取设备列表</h4><figure class="highlight plain"><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">$ v4l2-ctl --list-devices</span><br><span class="line"></span><br><span class="line">Integrated Camera: Integrated C (usb-0000:03:00.4-2):</span><br><span class="line"> /dev/video0</span><br><span class="line"> /dev/video1</span><br><span class="line"> /dev/video2</span><br><span class="line"> /dev/video3</span><br></pre></td></tr></table></figure>
<h4 id="测试摄像头能否正常使用"><a href="#测试摄像头能否正常使用" class="headerlink" title="测试摄像头能否正常使用"></a>测试摄像头能否正常使用</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ ffplay /dev/videox</span><br></pre></td></tr></table></figure>
<p>测试之后发现我的只有<code>/dev/video0</code>可以使用。在使用Windows Hello的时候会亮一个红灯但是直接测试<code>/dev/video0</code>并没有亮,可能没有正常打开红外模块。<br>于是我又在Google上搜索了一番,发现了有大佬写过一个启用红外模块的脚本<a href="https://github.com/EmixamPP/linux-enable-ir-emitter">linux-enable-ir-emitter</a>。于是从GayHub上clone下来之后用Gcc编译</p>
<h5 id="编译linux-enable-ir-emitter"><a href="#编译linux-enable-ir-emitter" class="headerlink" title="编译linux-enable-ir-emitter"></a>编译<code>linux-enable-ir-emitter</code></h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ gcc enable-ir-emitter.c -o enable-ir-emitter</span><br></pre></td></tr></table></figure>
<p>然后报错<br>根据<code>README</code>的指引修改<code>enable-ir-emitter.c</code>,复制<code>config.txt</code>的第二组配置继续编译,成功。</p>
<h5 id="运行编译后的enable-ir-emitter"><a href="#运行编译后的enable-ir-emitter" class="headerlink" title="运行编译后的enable-ir-emitter"></a>运行编译后的<code>enable-ir-emitter</code></h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ .\enable-ir-emitter</span><br></pre></td></tr></table></figure>
<p>这时候用<code>ffplay</code>测试,发现<code>/dev/video2</code>已经可以正常开启红外发射器了。</p>
<h4 id="开机加载enable-ir-emitter脚本"><a href="#开机加载enable-ir-emitter脚本" class="headerlink" title="开机加载enable-ir-emitter脚本"></a>开机加载<code>enable-ir-emitter</code>脚本</h4><p>每此开机的时候总不能都手动解锁然后运行脚本吧,这样就失去了此次折腾的意义。<br>配置<code>systemd</code>服务让它开机自动加载。</p>
<h5 id="复制编译后的文件到-usr-loacl-bin"><a href="#复制编译后的文件到-usr-loacl-bin" class="headerlink" title="复制编译后的文件到/usr/loacl/bin"></a>复制编译后的文件到<code>/usr/loacl/bin</code></h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># cp enable-ir-emitter /usr/local/bin</span><br></pre></td></tr></table></figure>
<h5 id="复制enable-ir-emitter-service到-etc-systemd-system"><a href="#复制enable-ir-emitter-service到-etc-systemd-system" class="headerlink" title="复制enable-ir-emitter.service到/etc/systemd/system/"></a>复制<code>enable-ir-emitter.service</code>到<code>/etc/systemd/system/</code></h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># cp enable-ir-emitter.service /etc/systemd/system/</span><br></pre></td></tr></table></figure>
<h5 id="启用服务"><a href="#启用服务" class="headerlink" title="启用服务"></a>启用服务</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># systemctl enable enable-ir-emitter</span><br></pre></td></tr></table></figure>
<p>这样就可以在开机的时候自动加载脚本了</p>
<h4 id="查看摄像头的支持格式"><a href="#查看摄像头的支持格式" class="headerlink" title="查看摄像头的支持格式"></a>查看摄像头的支持格式</h4><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">$ v4l2-ctl -d DEVICE_PATH --list-formats-ext</span><br><span class="line">ioctl: VIDIOC_ENUM_FMT</span><br><span class="line"> Type: Video Capture</span><br><span class="line"></span><br><span class="line"> [0]: 'GREY' (8-bit Greyscale)</span><br><span class="line"> Size: Discrete 640x360</span><br><span class="line"> Interval: Discrete 0.067s (15.000 fps)</span><br><span class="line"> Interval: Discrete 0.033s (30.000 fps)</span><br></pre></td></tr></table></figure>
<h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><h3 id="PAM配置"><a href="#PAM配置" class="headerlink" title="PAM配置"></a>PAM配置</h3><p>将下面的信息加入到所有需要人脸解锁PAM配置文件中,<code>sudo</code>和<code>GDM</code>的屏幕解锁我用的比较多所以在<code>/etc/pam.d/sudo</code>和<code>/etc/pam.d/system-local-login</code>配置了howdy认证</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">auth sufficient pam_python.so /lib/security/howdy/pam.py</span><br></pre></td></tr></table></figure>
<h4 id="配置Howdy"><a href="#配置Howdy" class="headerlink" title="配置Howdy"></a>配置Howdy</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># howdy config</span><br></pre></td></tr></table></figure>
<p>默认使用<code>nano</code>编辑器打开,我使用<code>vim</code>编辑器,需要在命令前加上<code>EDITOR</code>环境变量</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># EDITOR=vim howdy config</span><br></pre></td></tr></table></figure>
<h5 id="配置摄像头路径"><a href="#配置摄像头路径" class="headerlink" title="配置摄像头路径"></a>配置摄像头路径</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">device_path = /dev/video2</span><br></pre></td></tr></table></figure>
<h5 id="设置黑暗阈值"><a href="#设置黑暗阈值" class="headerlink" title="设置黑暗阈值"></a>设置黑暗阈值</h5><p>dark_threshold = 90</p>
<h3 id="添加人脸模型"><a href="#添加人脸模型" class="headerlink" title="添加人脸模型"></a>添加人脸模型</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># howdy add</span><br></pre></td></tr></table></figure>
<h2 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># sudo -i</span><br></pre></td></tr></table></figure>
<p>这时候Howdy已经可以正常调用红外摄像头了</p>
<h3 id="其它"><a href="#其它" class="headerlink" title="其它"></a>其它</h3><p>使用几次后发现每次调用Howdy的时候终端都会出现警告,根据ArchWiki的提示,这是<code>opencv</code>的警告,可以将<code>opencv</code>的日志级别降低</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">export OPENCV_LOG_LEVEL=ERROR</span><br></pre></td></tr></table></figure>
<p>将上面的代码加入到<code>.zshrc</code>(zsh用户)或者<code>.bashrc</code>(bash用户)每次调用Howdy认证的时候终端就不会有警告了。</p>
<h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ul>
<li><a href="https://github.com/boltgolt/howdy">Howdy</a></li>
<li><a target="_blank" rel="noopener" href="https://wiki.archlinux.org/index.php/Howdy">Howdy - ArchWiki</a></li>
<li><a href="https://github.com/EmixamPP/linux-enable-ir-emitter">linux-enable-ir-emitter</a></li>
</ul>
</div></article></div><div class="card"><article class="card-content article" role="article"><div class="article-meta is-size-7 is-uppercase level is-mobile"><div class="level-left"><span class="level-item"><time dateTime="2020-03-16T03:46:41.000Z" title="2020-03-16T03:46:41.000Z">2020-03-16</time>发表</span><span class="level-item"><time dateTime="2020-03-16T03:46:41.000Z" title="2020-03-16T03:46:41.000Z">2020-03-16</time>更新</span><span class="level-item"><a class="link-muted" href="/categories/Linux/">Linux</a><span> / </span><a class="link-muted" href="/categories/Linux/unzip/">unzip</a></span><span class="level-item">2 分钟读完 (大约275个字)</span></div></div><h1 class="title is-3 is-size-4-mobile"><a class="link-muted" href="/2020/03/16/unzip%E8%A7%A3%E5%86%B3%E4%B8%AD%E6%96%87%E8%B7%AF%E5%BE%84%E4%B9%B1%E7%A0%81%E9%97%AE%E9%A2%98/">unzip解决中文路径乱码问题</a></h1><div class="content"><p>unzip解压从Windos拷贝过来的文件时经常出现乱码,这是因为Linux上unzip默认UTF-8编码,而Windows简体中文版用zip软件压缩时文件名一般会使用GBK编码,这就导致了乱码。<br>知道问题了那Google搜一搜怎么解决吧,Google告诉我用-O选项,然而unzip并没有-O选项啊,那哪来的-O呢?原来大神给unzip打了转码补丁<a href="https://github.com/m13253/unzip-iconv">unzip-iconv</a>,但是unzip自打2009年以来一直没有更新过,iconv也就一直没有进入mainline,所以我们需要用unzip的包含iconv补丁的版本,aur已经有人打了包<a target="_blank" rel="noopener" href="https://aur.archlinux.org/packages/unzip-iconv/">unzip-iconv</a>,所以直接安装就可以,aur上的这个版本不仅包含了转码补丁,还包含一些其漏洞的补丁。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># yay -S unzip-iconv</span><br></pre></td></tr></table></figure>
<p>cn仓库上也有这个包 </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># pacman -S unzip-iconv</span><br></pre></td></tr></table></figure>
<p>这个时候我们就可以使用-O选项了 </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ unzip -O [iconv] file[.zip] [-d exdir]</span><br></pre></td></tr></table></figure>
<p>e.h.: <code>unzip -O GBK file.zip</code></p>
</div></article></div><div class="card"><article class="card-content article" role="article"><div class="article-meta is-size-7 is-uppercase level is-mobile"><div class="level-left"><span class="level-item"><time dateTime="2020-03-06T16:00:28.000Z" title="2020-03-06T16:00:28.000Z">2020-03-07</time>发表</span><span class="level-item"><time dateTime="2020-03-06T16:00:28.000Z" title="2020-03-06T16:00:28.000Z">2020-03-07</time>更新</span><span class="level-item"><a class="link-muted" href="/categories/Linux/">Linux</a></span><span class="level-item">1 分钟读完 (大约149个字)</span></div></div><h1 class="title is-3 is-size-4-mobile"><a class="link-muted" href="/2020/03/07/uGet%E8%B0%83%E7%94%A8aria2%E5%AE%9E%E7%8E%B0%E6%9E%81%E9%80%9F%E4%B8%8B%E8%BD%BD/">uGet调用aria2实现极速下载</a></h1><div class="content"><p>我在Linux上一直使用uGet作为下载器下载文件,但是感觉下载速度不如aria2,于是想用上aria2插件。</p>
<hr>
<p>首先安装aria2、uGet </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># pacman -S aria2 uget</span><br></pre></td></tr></table></figure>
<p>安装uget-integrator插件 </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># yay -S uget-integrator</span><br></pre></td></tr></table></figure>
<p>安装浏览器对应的链接工具<br>Chrome </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># yay -S uget-integrator-chrome` </span><br></pre></td></tr></table></figure>
<p>Firefox </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># yay -S uget-integrator-firefox</span><br></pre></td></tr></table></figure>
<p>浏览器安装下载插件 uGet Integration<br><a target="_blank" rel="noopener" href="https://chrome.google.com/webstore/detail/uget-integration/efjgjleilhflffpbnkaofpmdnajdpepi">Chrome</a><br><a target="_blank" rel="noopener" href="https://addons.mozilla.org/en-US/firefox/addon/ugetintegration/">Firefox</a> </p>
<p>uGet Edit–>Settings–>Plug-in 选择 aria2<br>Arguments 输入<br><code>--enable-rpc=true --rpc-allow-origin-all -D --disable-ipv6 --check-certificate=false</code></p>
<p>重启Uget 便可以调用aria2</p>
</div></article></div></div><div class="column column-left is-4-tablet is-4-desktop is-4-widescreen order-1"><div class="card widget" data-type="profile"><div class="card-content"><nav class="level"><div class="level-item has-text-centered flex-shrink-1"><div><figure class="image is-128x128 mx-auto mb-2"><img class="avatar" src="/img/avatar.png" alt="St.kai"></figure><p class="title is-size-4 is-block" style="line-height:inherit;">St.kai</p><p class="is-size-6 is-block">O ever youthful, O ever weeping.</p></div></div></nav><nav class="level is-mobile"><div class="level-item has-text-centered is-marginless"><div><p class="heading">文章</p><a href="/archives"><p class="title">4</p></a></div></div><div class="level-item has-text-centered is-marginless"><div><p class="heading">分类</p><a href="/categories"><p class="title">4</p></a></div></div><div class="level-item has-text-centered is-marginless"><div><p class="heading">标签</p><a href="/tags"><p class="title">8</p></a></div></div></nav><div class="level"><a class="level-item button is-primary is-rounded" href="https://github.com/Stkai" target="_blank" rel="noopener">关注我</a></div><div class="level is-mobile"><a class="level-item button is-transparent is-marginless" target="_blank" rel="noopener" title="Telegram" href="https://t.me/Stkai"><i class="fab fa-telegram"></i></a><a class="level-item button is-transparent is-marginless" target="_blank" rel="noopener" title="Github" href="https://github.com/Stkai"><i class="fab fa-github"></i></a><a class="level-item button is-transparent is-marginless" target="_blank" rel="noopener" title="Twitter" href="https://twitter.com/Stkai_Bai"><i class="fab fa-twitter"></i></a></div></div></div><!--!--><div class="card widget" data-type="links"><div class="card-content"><div class="menu"><h3 class="menu-label">链接</h3><ul class="menu-list"><li><a class="level is-mobile" href="https://hexo.io" target="_blank" rel="noopener"><span class="level-left"><span class="level-item">Hexo</span></span><span class="level-right"><span class="level-item tag">hexo.io</span></span></a></li><li><a class="level is-mobile" href="https://bulma.io" target="_blank" rel="noopener"><span class="level-left"><span class="level-item">Bulma</span></span><span class="level-right"><span class="level-item tag">bulma.io</span></span></a></li></ul></div></div></div><div class="card widget" data-type="categories"><div class="card-content"><div class="menu"><h3 class="menu-label">分类</h3><ul class="menu-list"><li><a class="level is-mobile" href="/categories/JavaScript/"><span class="level-start"><span class="level-item">JavaScript</span></span><span class="level-end"><span class="level-item tag">1</span></span></a></li><li><a class="level is-mobile" href="/categories/Linux/"><span class="level-start"><span class="level-item">Linux</span></span><span class="level-end"><span class="level-item tag">3</span></span></a><ul><li><a class="level is-mobile" href="/categories/Linux/Howdy/"><span class="level-start"><span class="level-item">Howdy</span></span><span class="level-end"><span class="level-item tag">1</span></span></a></li><li><a class="level is-mobile" href="/categories/Linux/unzip/"><span class="level-start"><span class="level-item">unzip</span></span><span class="level-end"><span class="level-item tag">1</span></span></a></li></ul></li></ul></div></div></div><div class="card widget" data-type="recent-posts"><div class="card-content"><h3 class="menu-label">最新文章</h3><article class="media"><div class="media-content"><p class="date"><time dateTime="2021-02-01T15:38:35.000Z">2021-02-01</time></p><p class="title"><a href="/2021/02/01/JavaScript%E4%B8%AD%E7%9A%84%E8%B5%8B%E5%80%BC%E3%80%81%E6%B5%85%E6%8B%B7%E8%B4%9D%E5%92%8C%E6%B7%B1%E6%8B%B7%E8%B4%9D/">JavaScript中的赋值、浅拷贝和深拷贝</a></p><p class="categories"><a href="/categories/JavaScript/">JavaScript</a></p></div></article><article class="media"><div class="media-content"><p class="date"><time dateTime="2021-01-26T15:39:55.000Z">2021-01-26</time></p><p class="title"><a href="/2021/01/26/Howdy-Linu%E4%B8%8A%E7%9A%84-Windows-Hello/">Howdy Linu上的"Windows Hello"</a></p><p class="categories"><a href="/categories/Linux/">Linux</a> / <a href="/categories/Linux/Howdy/">Howdy</a></p></div></article><article class="media"><div class="media-content"><p class="date"><time dateTime="2020-03-16T03:46:41.000Z">2020-03-16</time></p><p class="title"><a href="/2020/03/16/unzip%E8%A7%A3%E5%86%B3%E4%B8%AD%E6%96%87%E8%B7%AF%E5%BE%84%E4%B9%B1%E7%A0%81%E9%97%AE%E9%A2%98/">unzip解决中文路径乱码问题</a></p><p class="categories"><a href="/categories/Linux/">Linux</a> / <a href="/categories/Linux/unzip/">unzip</a></p></div></article><article class="media"><div class="media-content"><p class="date"><time dateTime="2020-03-06T16:00:28.000Z">2020-03-07</time></p><p class="title"><a href="/2020/03/07/uGet%E8%B0%83%E7%94%A8aria2%E5%AE%9E%E7%8E%B0%E6%9E%81%E9%80%9F%E4%B8%8B%E8%BD%BD/">uGet调用aria2实现极速下载</a></p><p class="categories"><a href="/categories/Linux/">Linux</a></p></div></article></div></div><div class="card widget" data-type="archives"><div class="card-content"><div class="menu"><h3 class="menu-label">归档</h3><ul class="menu-list"><li><a class="level is-mobile" href="/archives/2021/02/"><span class="level-start"><span class="level-item">二月 2021</span></span><span class="level-end"><span class="level-item tag">1</span></span></a></li><li><a class="level is-mobile" href="/archives/2021/01/"><span class="level-start"><span class="level-item">一月 2021</span></span><span class="level-end"><span class="level-item tag">1</span></span></a></li><li><a class="level is-mobile" href="/archives/2020/03/"><span class="level-start"><span class="level-item">三月 2020</span></span><span class="level-end"><span class="level-item tag">2</span></span></a></li></ul></div></div></div><div class="card widget" data-type="tags"><div class="card-content"><div class="menu"><h3 class="menu-label">标签</h3><div class="field is-grouped is-grouped-multiline"><div class="control"><a class="tags has-addons" href="/tags/Copy/"><span class="tag">Copy</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Downloader/"><span class="tag">Downloader</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Howdy/"><span class="tag">Howdy</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/JavaScript/"><span class="tag">JavaScript</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Linux/"><span class="tag">Linux</span><span class="tag">3</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Mojibake/"><span class="tag">Mojibake</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/uGet/"><span class="tag">uGet</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/unzip/"><span class="tag">unzip</span><span class="tag">1</span></a></div></div></div></div></div></div><!--!--></div></div></section><footer class="footer"><div class="container"><div class="level"><div class="level-start"><a class="footer-logo is-block mb-2" href="/"><img src="/img/logo.svg" alt="St.kai‘s blog" height="28"></a><p class="is-size-7"><span>© 2021 St.kai</span> Powered by <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a> & <a href="https://github.com/ppoffice/hexo-theme-icarus" target="_blank" rel="noopener">Icarus</a></p></div><div class="level-end"><div class="field has-addons"><p class="control"><a class="button is-transparent is-large" target="_blank" rel="noopener" title="Creative Commons" href="https://creativecommons.org/"><i class="fab fa-creative-commons"></i></a></p><p class="control"><a class="button is-transparent is-large" target="_blank" rel="noopener" title="Attribution 4.0 International" href="https://creativecommons.org/licenses/by/4.0/"><i class="fab fa-creative-commons-by"></i></a></p><p class="control"><a class="button is-transparent is-large" target="_blank" rel="noopener" title="Download on GitHub" href="https://github.com/ppoffice/hexo-theme-icarus"><i class="fab fa-github"></i></a></p></div></div></div></div></footer><script src="https://cdnjs.loli.net/ajax/libs/jquery/3.3.1/jquery.min.js"></script><script src="https://cdnjs.loli.net/ajax/libs/moment.js/2.22.2/moment-with-locales.min.js"></script><script src="https://cdnjs.loli.net/ajax/libs/clipboard.js/2.0.4/clipboard.min.js" async></script><script>moment.locale("zh-CN");</script><script>var IcarusThemeSettings = {
article: {
highlight: {
clipboard: true,
fold: 'unfolded'
}
}
};</script><script src="/js/column.js"></script><script src="/js/animation.js"></script><a id="back-to-top" title="回到顶端" href="javascript:;"><i class="fas fa-chevron-up"></i></a><script src="/js/back_to_top.js" defer></script><!--!--><!--!--><!--!--><script src="https://cdnjs.loli.net/ajax/libs/cookieconsent/3.1.1/cookieconsent.min.js" defer></script><script>window.addEventListener("load", () => {
window.cookieconsent.initialise({
type: "info",
theme: "edgeless",
static: false,
position: "bottom-left",
content: {
message: "此网站使用Cookie来改善您的体验。",
dismiss: "知道了!",
allow: "允许使用Cookie",
deny: "拒绝",
link: "了解更多",
policy: "Cookie政策",
href: "https://www.cookiesandyou.com/",
},
palette: {
popup: {
background: "#edeff5",
text: "#838391"
},
button: {
background: "#4b81e8"
},
},
});
});</script><script src="https://cdnjs.loli.net/ajax/libs/lightgallery/1.6.8/js/lightgallery.min.js" defer></script><script src="https://cdnjs.loli.net/ajax/libs/justifiedGallery/3.7.0/js/jquery.justifiedGallery.min.js" defer></script><script>window.addEventListener("load", () => {
if (typeof $.fn.lightGallery === 'function') {
$('.article').lightGallery({ selector: '.gallery-item' });
}
if (typeof $.fn.justifiedGallery === 'function') {
if ($('.justified-gallery > p > .gallery-item').length) {
$('.justified-gallery > p > .gallery-item').unwrap();
}
$('.justified-gallery').justifiedGallery();
}
});</script><!--!--><!--!--><!--!--><!--!--><!--!--><script src="/js/main.js" defer></script><div class="searchbox"><div class="searchbox-container"><div class="searchbox-header"><div class="searchbox-input-container"><input class="searchbox-input" type="text" placeholder="想要查找什么..."></div><a class="searchbox-close" href="javascript:;">×</a></div><div class="searchbox-body"></div></div></div><script src="/js/insight.js" defer></script><script>document.addEventListener('DOMContentLoaded', function () {
loadInsight({"contentUrl":"/content.json"}, {"hint":"想要查找什么...","untitled":"(无标题)","posts":"文章","pages":"页面","categories":"分类","tags":"标签"});
});</script></body></html>