-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
485 lines (397 loc) · 59.1 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0,viewport-fit=cover"><title>Pig Cat - Full-Stack, Android, AI</title><meta name="author" content="YSY"><meta name="copyright" content="YSY"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="Full-Stack, Android, AI">
<meta property="og:type" content="website">
<meta property="og:title" content="Pig Cat">
<meta property="og:url" content="https://blog.ysy950803.top/index.html">
<meta property="og:site_name" content="Pig Cat">
<meta property="og:description" content="Full-Stack, Android, AI">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://blog.ysy950803.top/img/avatar-ysy.png">
<meta property="article:author" content="YSY">
<meta property="article:tag" content="Full-Stack, Android, AI">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://blog.ysy950803.top/img/avatar-ysy.png"><link rel="shortcut icon" href="/img/favicon.png"><link rel="canonical" href="https://blog.ysy950803.top/index.html"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//www.google-analytics.com" crossorigin=""/><link rel="preconnect" href="//busuanzi.ibruce.info"/><meta name="google-site-verification" content="MK2u6SdXmNALFQhaVElzr03W62cBQbIjtHK-7rvSIjw"/><meta name="baidu-site-verification" content="codeva-o8m8oS84V9"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/node-snackbar/dist/snackbar.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox/fancybox.min.css" media="print" onload="this.media='all'"><script async="async" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><script>(adsbygoogle = window.adsbygoogle || []).push({
google_ad_client: 'ca-pub-8999136091629669',
enable_page_level_ads: 'true'
});</script><script async="async" src="https://www.googletagmanager.com/gtag/js?id=UA-149830607-1"></script><script>window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-149830607-1');
</script><script>const GLOBAL_CONFIG = {
root: '/',
algolia: undefined,
localSearch: {"path":"/search.xml","preload":false,"top_n_per_article":1,"unescape":false,"languages":{"hits_empty":"找不到您查询的内容:${query}","hits_stats":"共找到 ${hits} 篇文章"}},
translate: {"defaultEncoding":2,"translateDelay":0,"msgToTraditionalChinese":"繁","msgToSimplifiedChinese":"簡"},
noticeOutdate: undefined,
highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false},
copy: {
success: '复制成功',
error: '复制错误',
noSupport: '浏览器不支持'
},
relativeDate: {
homepage: false,
post: false
},
runtime: '天',
dateSuffix: {
just: '刚刚',
min: '分钟前',
hour: '小时前',
day: '天前',
month: '个月前'
},
copyright: {"limitCount":10,"languages":{"author":"作者: YSY","link":"链接: ","source":"来源: Pig Cat","info":"著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。"}},
lightbox: 'fancybox',
Snackbar: {"chs_to_cht":"你已切换为繁体","cht_to_chs":"你已切换为简体","day_to_night":"你已切换为深色模式","night_to_day":"你已切换为浅色模式","bgLight":"#A58A5D","bgDark":"#1f1f1f","position":"bottom-left"},
source: {
justifiedGallery: {
js: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery/dist/fjGallery.min.js',
css: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery/dist/fjGallery.min.css'
}
},
isPhotoFigcaption: false,
islazyload: false,
isAnchor: false,
percent: {
toc: true,
rightside: false,
},
autoDarkmode: true
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
title: 'Pig Cat',
isPost: false,
isHome: true,
isHighlightShrink: false,
isToc: false,
postUpdate: '2025-01-23 14:51:32'
}</script><noscript><style type="text/css">
#nav {
opacity: 1
}
.justified-gallery img {
opacity: 1
}
#recent-posts time,
#post-meta time {
display: inline !important
}
</style></noscript><script>(win=>{
win.saveToLocal = {
set: function setWithExpiry(key, value, ttl) {
if (ttl === 0) return
const now = new Date()
const expiryDay = ttl * 86400000
const item = {
value: value,
expiry: now.getTime() + expiryDay,
}
localStorage.setItem(key, JSON.stringify(item))
},
get: function getWithExpiry(key) {
const itemStr = localStorage.getItem(key)
if (!itemStr) {
return undefined
}
const item = JSON.parse(itemStr)
const now = new Date()
if (now.getTime() > item.expiry) {
localStorage.removeItem(key)
return undefined
}
return item.value
}
}
win.getScript = url => new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = url
script.async = true
script.onerror = reject
script.onload = script.onreadystatechange = function() {
const loadState = this.readyState
if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
script.onload = script.onreadystatechange = null
resolve()
}
document.head.appendChild(script)
})
win.getCSS = (url,id = false) => new Promise((resolve, reject) => {
const link = document.createElement('link')
link.rel = 'stylesheet'
link.href = url
if (id) link.id = id
link.onerror = reject
link.onload = link.onreadystatechange = function() {
const loadState = this.readyState
if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
link.onload = link.onreadystatechange = null
resolve()
}
document.head.appendChild(link)
})
win.activateDarkMode = function () {
document.documentElement.setAttribute('data-theme', 'dark')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
}
}
win.activateLightMode = function () {
document.documentElement.setAttribute('data-theme', 'light')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
}
}
const t = saveToLocal.get('theme')
const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches
const isLightMode = window.matchMedia('(prefers-color-scheme: light)').matches
const isNotSpecified = window.matchMedia('(prefers-color-scheme: no-preference)').matches
const hasNoSupport = !isDarkMode && !isLightMode && !isNotSpecified
if (t === undefined) {
if (isLightMode) activateLightMode()
else if (isDarkMode) activateDarkMode()
else if (isNotSpecified || hasNoSupport) {
const now = new Date()
const hour = now.getHours()
const isNight = hour <= 6 || hour >= 18
isNight ? activateDarkMode() : activateLightMode()
}
window.matchMedia('(prefers-color-scheme: dark)').addListener(function (e) {
if (saveToLocal.get('theme') === undefined) {
e.matches ? activateDarkMode() : activateLightMode()
}
})
} else if (t === 'light') activateLightMode()
else activateDarkMode()
const asideStatus = saveToLocal.get('aside-status')
if (asideStatus !== undefined) {
if (asideStatus === 'hide') {
document.documentElement.classList.add('hide-aside')
} else {
document.documentElement.classList.remove('hide-aside')
}
}
const detectApple = () => {
if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
document.documentElement.classList.add('apple')
}
}
detectApple()
})(window)</script><script>document.oncontextmenu=function(){return!1}</script><script>document.addEventListener("DOMContentLoaded",function(){const e=document.getElementById("busuanzi_value_site_uv"),t=document.getElementById("busuanzi_value_site_pv"),n=new MutationObserver(e=>{for(let t of e)if("childList"===t.type){n.disconnect(),t.target.innerHTML=parseInt(t.target.innerHTML)+1e5;break}}),i=new MutationObserver(e=>{for(let t of e)if("childList"===t.type){i.disconnect(),t.target.innerHTML=parseInt(t.target.innerHTML)+3e5;break}}),r={childList:!0};n.observe(e,r),i.observe(t,r)});</script><meta name="referrer" content="no-referrer" /><meta name="generator" content="Hexo 6.3.0"></head><body><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="/img/avatar-ysy.png" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="sidebar-site-data site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">94</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">15</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">0</div></a></div><hr class="custom-hr"/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> Home</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> Archives</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> Tags</span></a></div><div class="menus_item"><a class="site-page" href="/gallery/"><i class="fa-fw fas fa-images"></i><span> Gallery</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> About</span></a></div></div></div></div><div class="page" id="body-wrap"><header class="full_page" id="page-header" style="background-image: url('/img/home-bg.jpg')"><nav id="nav"><span id="blog-info"><a href="/" title="Pig Cat"><span class="site-name">Pig Cat</span></a></span><div id="menus"><div id="search-button"><a class="site-page social-icon search" href="javascript:void(0);"><i class="fas fa-search fa-fw"></i><span> Search</span></a></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> Home</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> Archives</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> Tags</span></a></div><div class="menus_item"><a class="site-page" href="/gallery/"><i class="fa-fw fas fa-images"></i><span> Gallery</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> About</span></a></div></div><div id="toggle-menu"><a class="site-page" href="javascript:void(0);"><i class="fas fa-bars fa-fw"></i></a></div></div></nav><div id="site-info"><h1 id="site-title">Pig Cat</h1><div id="site-subtitle"><span id="subtitle"></span></div></div><div id="scroll-down"><i class="fas fa-angle-down scroll-down-effects"></i></div></header><main class="layout" id="content-inner"><div class="recent-posts" id="recent-posts"><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/08/23/%E5%90%88%E4%BD%9C%E7%8B%AC%E7%AB%8B%E5%BC%80%E5%8F%91%E9%A1%B9%E7%9B%AE%EF%BC%9ADaak%E8%AE%B0%E8%B4%A6/" title="合作独立开发项目:Daak记账">合作独立开发项目:Daak记账</a><div class="article-meta-wrap"><span class="article-meta"><i class="fas fa-thumbtack sticky"></i><span class="sticky">置顶</span><span class="article-meta-separator">|</span></span><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-08-23T06:42:54.000Z" title="发表于 2024-08-23 14:42:54">2024-08-23</time></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/Android/">Android</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/Java/">Java</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/Kotlin/">Kotlin</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/%E9%BC%93%E6%8D%A3%E6%8A%98%E8%85%BE/">鼓捣折腾</a></span></div><div class="content">
这是和大学同学合作开发的财务应用项目,目前已经上架国内外各大平台,iOS版本是同学独立开发的,Android版本是我独立开发的,后者刚起步不久,希望大家多多支持~
下面是下载方式和初版的一些简介,直接从我们的官网搬运过来的:daakapp.com
Daak记账 - 简洁可爱日常收支随手记账本中文 | English
Daak记账,功能齐全,简洁可爱,非常适合新手记账
下载iOS
Apple Store
Android
Google Play
安卓
中国用户请点击下方链接或到应用商店搜索“Daak记账”
华为
小米
OPPO
vivo
温馨提示 -> 由于小米为了商业化利益考虑,禁用了Android标准规范的 market:// 链接本应呈现的功能。
因此点击上述小米应用商店的链接后,可能并不会直接打开我们的应用详情页面,请手动搜索“Daak记账”下载安装,谢谢~
介绍功能齐全
支持Apple Watch以及多种小组件
自定义一二级记账分类
多账本、多人记账、多币种功能
预算、资产账户、债务(借入/借出)管理
退款、报销、分期还款
账单支持添加图 ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2023/02/28/%E7%BB%99MIUI%E5%BC%80%E5%8F%91%E4%B8%80%E4%B8%AA%E5%88%B7%E6%96%B0%E7%8E%87%E5%BC%80%E5%85%B3/" title="给MIUI开发一个刷新率开关"><img class="post-bg" src="/2023/02/28/%E7%BB%99MIUI%E5%BC%80%E5%8F%91%E4%B8%80%E4%B8%AA%E5%88%B7%E6%96%B0%E7%8E%87%E5%BC%80%E5%85%B3/867802e2f5542451c96578a3885647db.webp" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="给MIUI开发一个刷新率开关"></a></div><div class="recent-post-info"><a class="article-title" href="/2023/02/28/%E7%BB%99MIUI%E5%BC%80%E5%8F%91%E4%B8%80%E4%B8%AA%E5%88%B7%E6%96%B0%E7%8E%87%E5%BC%80%E5%85%B3/" title="给MIUI开发一个刷新率开关">给MIUI开发一个刷新率开关</a><div class="article-meta-wrap"><span class="article-meta"><i class="fas fa-thumbtack sticky"></i><span class="sticky">置顶</span><span class="article-meta-separator">|</span></span><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-02-27T16:00:00.000Z" title="发表于 2023-02-28 00:00:00">2023-02-28</time></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/Android/">Android</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/%E9%BC%93%E6%8D%A3%E6%8A%98%E8%85%BE/">鼓捣折腾</a></span></div><div class="content">背景我们很容易发现,现在小米等厂商支持高刷新率120Hz的手机,在系统设置中都隐藏了90Hz这个档位,只有60和120两种选项。对很多人来说,60虽然省电但是太不流畅,影响体验,120虽然流畅但太耗电,出门会有电量焦虑,折中的90其实才是最合适的选择(至少在心理上)。
我一直试图搞清楚为什么厂商不愿意开放90Hz这个选项,对系统来说,刷新率无非就是一个可以修改的数值。是什么原因不让用户多一个选择呢?
调查经过一些简单的查询,我发现网络上的解释一般都是硬件本身不支持,芯片功能较弱,不足以驱动多种刷新率,强制修改为90Hz长时间可能造成屏幕损坏等。
当然,我也不忘去问一问无所不知的ChatGPT,他还是一如既往地说了一些车轱辘话。他这个“技术退步”论倒是有点意思。
其实“硬件不支持”这个说法我并不是很赞同。如果你在Android系统的开发者选项中打开“显示屏幕刷新率”的开关,就会发现在不同的使用场景下,不只有60Hz和120Hz两种刷新率,比如息屏AOD为了降低功耗,就只有30Hz;很多手游最高也只支持90Hz,即便开启120Hz也没用。因此,要是说强制修改为其他隐藏刷新率会导致屏幕损 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2023/02/14/Android%E7%B3%BB%E7%BB%9F%E6%97%A0%E9%99%90%E9%87%8D%E5%90%AF%E6%BC%8F%E6%B4%9E/" title="Android系统无限重启漏洞">Android系统无限重启漏洞</a><div class="article-meta-wrap"><span class="article-meta"><i class="fas fa-thumbtack sticky"></i><span class="sticky">置顶</span><span class="article-meta-separator">|</span></span><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-02-13T16:00:00.000Z" title="发表于 2023-02-14 00:00:00">2023-02-14</time></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/Android/">Android</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/AOSP/">AOSP</a></span></div><div class="content">
2022年,一次偶然的机会,我发现了一个会导致Android系统无限重启致使设备完全不可用的高危漏洞,遂提交给了Google。当年11月的AOSP补丁对此进行了修复,本文是我提交漏洞报告的原文,现公开,待整理。具体可以在Android Security Bulletin—November 2022中搜索CVE-2022-20414了解更多。
最后有幸上了Google官方的致谢名单:Android 安全性致谢 2022,也算是为这破碎的世界做了一点贡献吧。
Report description
In a few words describe your bug. This will help you search for it later.
The “snoozeNotification” method of NotificationListenerService causes Android system to crash and cyclic reboot.
Bug locationWhich product or website have you found a vulnera ...</div></div></div><div class="recent-post-item ads-wrap"><script async crossorigin=anonymous src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8999136091629669"></script><ins class=adsbygoogle data-ad-client=ca-pub-8999136091629669 data-ad-format=fluid data-ad-layout-key=-fb+5w+4e-db+86 data-ad-slot=1886176861 style=display:block></ins><script>(adsbygoogle=window.adsbygoogle||[]).push({})</script></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2025/01/23/%E5%A6%82%E4%BD%95%E5%9C%A8Ubuntu%E4%B8%8A%E8%87%AA%E5%BB%BAS3%E6%9C%8D%E5%8A%A1/" title="如何在Ubuntu上自建S3服务">如何在Ubuntu上自建S3服务</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2025-01-23T06:49:50.000Z" title="发表于 2025-01-23 14:49:50">2025-01-23</time></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/%E5%90%8E%E7%AB%AF/">后端</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/%E9%BC%93%E6%8D%A3%E6%8A%98%E8%85%BE/">鼓捣折腾</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/Linux/">Linux</a></span></div><div class="content">安装部署MinIO在Ubuntu 16.04上自建S3兼容的对象存储服务,可以使用开源软件 MinIO。MinIO 是一个高性能、S3兼容的对象存储解决方案,适合搭建私有云存储服务。以下是具体步骤:
1. 安装MinIO1.1 下载MinIO访问 MinIO官网 获取最新版本的下载链接,或者直接使用以下命令下载:
1wget https://dl.min.io/server/minio/release/linux-amd64/minio
1.2 赋予执行权限将下载的MinIO二进制文件设置为可执行:
1chmod +x minio
1.3 将MinIO移动到系统路径将MinIO移动到 /usr/local/bin,方便全局调用:
1sudo mv minio /usr/local/bin/
2. 配置MinIO2.1 创建存储目录创建一个目录用于存储MinIO的数据:
12sudo mkdir -p /var/lib/minio/datasudo chown -R $USER:$USER /var/lib/minio/data
2.2 设置环境变量设置MinIO的访问密钥和 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/12/20/%E5%A6%82%E4%BD%95%E7%94%A8crontab%E5%92%8Cmail%E5%AE%9A%E6%97%B6%E5%8F%91%E9%82%AE%E4%BB%B6/" title="如何用crontab和mail定时发邮件">如何用crontab和mail定时发邮件</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-12-20T07:51:19.000Z" title="发表于 2024-12-20 15:51:19">2024-12-20</time></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/%E5%90%8E%E7%AB%AF/">后端</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/%E9%BC%93%E6%8D%A3%E6%8A%98%E8%85%BE/">鼓捣折腾</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/Linux/">Linux</a></span></div><div class="content">背景虽然说懒人炒股不一定能赚到钱,但是懒人自有偷懒的办法。
最近突发奇想,想在服务器上设置一个定时任务,每隔一段时间查询某只股票的股价,如果达到告警条件,就自动发一封邮件给指定邮箱。正好QQ邮箱还接入了Android的系统级推送,这样我就不用每天盯盘了。
准备先准备一个163邮箱,其他邮箱也行(支持开启SMTP服务即可),这里以163邮箱为例。
登录网页版,找到“设置”-“POP3/SMTP/IMAP”,然后点击“新增授权码”,复制这个授权码先暂存,等会儿要用。
基础设施我的小水管服务器是Ubuntu 16.04,所以下面就基于这个环境来搞。
为了能用命令发邮件,我们先安装相关的依赖:
1apt install mailutils
首次安装后,会出现一个粉紫色界面,提示你配置“Postfix Configuration”,这里直接选择“No configuration”,然后OK。
接着安装ssmtp服务:
1apt install ssmtp
安装完后编辑此配置文件 vim /etc/ssmtp/ssmtp.conf,添加并保存如下内容:
12345root= ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/09/25/%E5%A6%82%E4%BD%95%E7%A6%81%E7%94%A8%E7%BD%91%E7%AB%99%E7%9B%AE%E5%BD%95%E8%AE%BF%E9%97%AE%EF%BC%88Apache%EF%BC%89/" title="如何禁用网站目录访问(Apache)">如何禁用网站目录访问(Apache)</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-09-25T05:07:20.000Z" title="发表于 2024-09-25 13:07:20">2024-09-25</time></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/%E5%90%8E%E7%AB%AF/">后端</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/%E9%BC%93%E6%8D%A3%E6%8A%98%E8%85%BE/">鼓捣折腾</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/Linux/">Linux</a></span></div><div class="content">问题以Ubuntu 22.04(其他LTS版本类似)和Apache2服务为例,我们一般会把网站资源放在 /var/www/html 中,又比如把提供给用户下载的安装包放在 download 目录下面,那么最终的下载链接就是:
https://xxx.com/download/abc.apk
这个 download 目录下面可能不只有一个apk,而是很多个资源文件,默认情况下,如果用户好奇打开https://xxx.com/download/,就会直接看见该目录下所有文件,甚至还可以逐级往上查看父目录。
有时候这并不是我们想要的结果,用户可能会看见我们未公开链接的资源,造成一些。
解决本来问了一下各种GPT,发现给的答案都太麻烦了,而且还不一定靠谱。最终还是从互联网的汪洋中找到了一个简单的办法。
直接编辑Apache的配置文件:
1vim /etc/apache2/apache2.conf
按I进入编辑模式后,找到这部分内容:
12345<Directory /var/www/> Options Indexes FollowSymLinks Al ...</div></div></div><div class="recent-post-item ads-wrap"><script async crossorigin=anonymous src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8999136091629669"></script><ins class=adsbygoogle data-ad-client=ca-pub-8999136091629669 data-ad-format=fluid data-ad-layout-key=-fb+5w+4e-db+86 data-ad-slot=1886176861 style=display:block></ins><script>(adsbygoogle=window.adsbygoogle||[]).push({})</script></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/08/26/Levenshtein%E7%BC%96%E8%BE%91%E8%B7%9D%E7%A6%BB%E7%AE%97%E6%B3%95%E5%88%9D%E4%BD%93%E9%AA%8C/" title="Levenshtein编辑距离算法初体验">Levenshtein编辑距离算法初体验</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-08-26T03:37:45.000Z" title="发表于 2024-08-26 11:37:45">2024-08-26</time></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/AI/">AI</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/%E7%AE%97%E6%B3%95/">算法</a></span></div><div class="content">
在做字符串相似度匹配时很有用,我更愿意叫它“相似度算法”~
简介Levenshtein算法,又称编辑距离算法,是一种用于计算两个字符串之间最小编辑操作数的算法。编辑操作包括插入、删除和替换字符。该算法由苏联科学家Vladimir Levenshtein于1965年提出。
编辑操作Levenshtein距离通过以下三种基本操作来衡量两个字符串的相似度:
插入:在字符串中插入一个字符。
删除:从字符串中删除一个字符。
替换:将字符串中的一个字符替换为另一个字符。
算法实现Levenshtein算法通常使用动态规划来实现。其核心思想是通过构建一个二维矩阵来记录两个字符串之间的编辑距离。具体步骤如下:
初始化矩阵:
创建一个大小为 (m+1) x (n+1) 的矩阵,其中 m 和 n 分别是两个字符串的长度。
矩阵的第一行和第一列分别填充 0 到 m 和 0 到 n 的值。
填充矩阵:
对于矩阵中的每个元素,计算其值。该值等于以下三个值中的最小值加1:
左边的值(表示删除操作)
上面的值(表示插入操作)
左上角的值(表示替换操作,如果字符相同则不加1)
返回结 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/08/26/%E7%94%A8MySQL%E7%9A%84FROM-UNIXTIME%E5%87%BD%E6%95%B0%E8%BD%AC%E6%8D%A2%E6%97%B6%E9%97%B4%E6%A0%BC%E5%BC%8F/" title="用MySQL的FROM_UNIXTIME函数转换时间格式">用MySQL的FROM_UNIXTIME函数转换时间格式</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-08-26T02:26:57.000Z" title="发表于 2024-08-26 10:26:57">2024-08-26</time></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/%E9%97%AE%E9%A2%98%E4%B8%8D%E5%A4%A7/">问题不大</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/%E5%90%8E%E7%AB%AF/">后端</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/Linux/">Linux</a></span></div><div class="content">假如我在MySQL数据库中有一个订单表,结构如下:
status
pay_method
update_time
1
2
1724403637114
其中 update_time 是bigint类型,对应Java/Kotlin代码中的Long类型,用以存储时间戳,用MySQL的bigint而不是timestamp类型,也能避免2038年上限的尴尬问题。
当然,得到一样东西很可能失去另一样东西,那就是“可读性”,我们在查询数据的时候,一眼是看不出来这个 1724403637114 具体是什么时间的。能不能既要又要呢?保证存储格式不变的情况下,查询的时候还能显示成更可读的时间格式。
这时候就可以用MySQL的函数了:FROM_UNIXTIME,它可以在查询的时候帮你格式化时间戳!我们直接看SQL语句:
1SELECT status, pay_method, FROM_UNIXTIME(update_time / 1000, '%Y-%m-%d %H:%i:%s') AS update_time FROM order;
因为此函数输入参数的单位是 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/08/25/%E5%A6%82%E4%BD%95%E9%99%90%E5%88%B6%E5%8F%AA%E8%83%BD%E9%80%9A%E8%BF%87%E5%9F%9F%E5%90%8D%E8%AE%BF%E9%97%AE%E7%BD%91%E7%AB%99%EF%BC%88Apache%EF%BC%89/" title="如何限制只能通过域名访问网站(Apache)">如何限制只能通过域名访问网站(Apache)</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-08-25T06:54:44.000Z" title="发表于 2024-08-25 14:54:44">2024-08-25</time></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/%E5%90%8E%E7%AB%AF/">后端</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/%E9%BC%93%E6%8D%A3%E6%8A%98%E8%85%BE/">鼓捣折腾</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/Linux/">Linux</a></span></div><div class="content">背景最近突发奇想,怎么让基于Apache服务的网站只能通过域名访问?也就是说,在浏览器地址栏直接输入IP就不允许访问。这样有个好处就是,必须是知道域名的用户才能访问网站内容,如果只是通过某种方式捕获到IP,不让他知道网站运行着什么内容。
基础我的服务器环境是Ubuntu 16.04,其他版本的系统也差不多,只要是Apache 2.x版本就行。并且,网站支持了HTTPS访问。
首先,确保Apache服务器已经启用了 mod_rewrite 模块:
123sudo a2enmod rewrite# 重启Apache服务sudo systemctl restart apache2
配置接下来,我们就通过修改配置来实现需求。先找到配置文件:
1cd /etc/apache2/sites-available/
此目录下一般有 000-default.conf 和 default-ssl.conf 这两个文件,因为支持了HTTPS,所以我们直接修改后者:
1234567891011121314151617<IfModule mod_ssl.c> <VirtualHost ...</div></div></div><div class="recent-post-item ads-wrap"><script async crossorigin=anonymous src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8999136091629669"></script><ins class=adsbygoogle data-ad-client=ca-pub-8999136091629669 data-ad-format=fluid data-ad-layout-key=-fb+5w+4e-db+86 data-ad-slot=1886176861 style=display:block></ins><script>(adsbygoogle=window.adsbygoogle||[]).push({})</script></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/08/23/%E8%A7%A3%E5%86%B3git%E6%8F%90%E4%BA%A4%E5%87%BA%E7%8E%B0RPC%20failed%20HTTP%20400%E7%9A%84%E9%97%AE%E9%A2%98/" title="解决git提交出现RPC failed HTTP 400的问题">解决git提交出现RPC failed HTTP 400的问题</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-08-23T03:36:56.000Z" title="发表于 2024-08-23 11:36:56">2024-08-23</time></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/%E9%97%AE%E9%A2%98%E4%B8%8D%E5%A4%A7/">问题不大</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/%E9%BC%93%E6%8D%A3%E6%8A%98%E8%85%BE/">鼓捣折腾</a></span></div><div class="content">最近升级了macOS系统后(从12.5升到12.7),发现我的Hexo博客部署不上去了,执行:
1hexo clean & hexo deploy
会提示错误:
12345678Counting objects: 19815, done.Compressing objects: 100% (5264/5264), done.Writing objects: 100% (19815/19815), 44.91 MiB | 134.87 MiB/s, done.Total 19815 (delta 14641), reused 19405 (delta 14283)error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400 Bad Requestfatal: The remote end hung up unexpectedlyfatal: The remote end hung up unexpectedlyEverything up-to-date
看到400错误,还以为是权限有问题,尝 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/03/28/%E8%AE%A9WCDB%E5%85%BC%E5%AE%B9%E6%9C%80%E6%96%B0%E7%89%88Room/" title="让WCDB兼容最新版Room">让WCDB兼容最新版Room</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-03-28T02:17:23.000Z" title="发表于 2024-03-28 10:17:23">2024-03-28</time></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/Android/">Android</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/Java/">Java</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/Kotlin/">Kotlin</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/%E9%BC%93%E6%8D%A3%E6%8A%98%E8%85%BE/">鼓捣折腾</a></span></div><div class="content">
先直接推荐我的开源小库:WCDBRoomX ,如果它的README就已经让你知道库的核心作用,这篇文章就不需要看了。
WCDB是腾讯微信团队开源的客户端数据库框架,拥有高性能和支持加密等重要特性,并且可用于Android、iOS、Windows、macOS等多个平台。 我们知道,原生的加密数据库框架SQLCipher和不加密的SQLite相比,性能差距还是很大的,加密会使得读写效率严重下降,而WCDB很好地兼顾了性能和安全问题。
SQLCipher和SQLite对比测试
WCDB和SQLite对比测试
对使用了Google官方Jetpack Room库的开发者,WCDB 1.x版本也提供了完美支持:Use WCDB with Room ,然而,WCDB 2.x版本后变成了一个纯ORM框架,虽然也支持Java、Kotlin等语言(本质上就是一层封装,底层接口都一样),但是暂时没有计划支持兼容Room,从官方文档看,2.x版本更纯粹,一套代码跨全平台,所以也不关注各平台的其他框架兼容了。
跟WCDB的开发者也聊了聊,他们团队对Room的支持兴趣不大:issues#1052 。其实 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/03/26/%E5%8F%8C%E8%BF%9B%E7%A8%8B%E4%BA%A4%E4%BA%92%E5%AE%9E%E7%8E%B0App%E8%87%AA%E5%8A%A8%E9%87%8D%E5%90%AF/" title="双进程交互实现App自动重启">双进程交互实现App自动重启</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-03-26T07:40:19.000Z" title="发表于 2024-03-26 15:40:19">2024-03-26</time></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/Android/">Android</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/Kotlin/">Kotlin</a></span></div><div class="content">背景你可能会好奇,有些手游(比如王者荣耀)是怎么实现资源更新后自动重启的?
这个体验确实不错,因为不需要用户手动点击桌面图标重启App,在一些数据恢复备份的场景中,很实用。比如,从云端拉取SQLite数据库db文件或一些prefs配置文件后,会直接覆盖到本地,但进程不重新启动的话,是不会生效的。
思路基本思路其实很简单,利用Android应用对多进程的天然支持,来实现双进程互拉。
有的朋友一看见“双进程”、“互拉”这些词汇就会立马联想到保活,注意本文不是讲保活的哦。
为了方便讲解,我们定义主进程之外的另一个进程为 进程B。大致流程分这么几步:
在主进程执行完一系列业务逻辑后,欲重启,先拉起进程B
进程B启动后,主进程kill掉自己
接着,进程B拉起主进程,然后再kill掉自己,此时主进程完成自动重启
实现先在Manifest中声明进程B,为了良好的交互体验,需要实现一个Activity,进程名称自定义,比如此处叫“killer”,是不是很贴切?
12345<activity android:name=".KillerActivity" an ...</div></div></div><div class="recent-post-item ads-wrap"><script async crossorigin=anonymous src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8999136091629669"></script><ins class=adsbygoogle data-ad-client=ca-pub-8999136091629669 data-ad-format=fluid data-ad-layout-key=-fb+5w+4e-db+86 data-ad-slot=1886176861 style=display:block></ins><script>(adsbygoogle=window.adsbygoogle||[]).push({})</script></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2024/03/25/%E5%9C%A8assembleRelease%E4%B9%8B%E5%89%8D%E6%89%A7%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89%E4%BB%BB%E5%8A%A1/" title="在assembleRelease之前执行自定义任务">在assembleRelease之前执行自定义任务</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2024-03-25T06:19:04.000Z" title="发表于 2024-03-25 14:19:04">2024-03-25</time></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/Android/">Android</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/Kotlin/">Kotlin</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/Gradle/">Gradle</a></span></div><div class="content">背景在实际的Gradle项目开发中,我们总是会遇到一些需求,要在release编译的时候执行一些任务,但debug时不需要。然而,Gradle编译有自己的一套生命周期,比如Android项目的assembleRelease任务在编译启动之前是没有办法静态获取到的。
下面我们就以“去除release版本中的logcat日志打印”为例,做一个简单的梳理。
源码修改模板(module)级别的 build.gradle.kts 文件,我们初步目标是在编译刚启动但还没实际开始执行任务时插入我们的自定义任务,切入点就是Gradle的preBuild任务,这个是预定义的,所以可以进行静态配置:
1234567891011121314151617181920212223242526272829plugins { id("com.android.application") id("kotlin-android") id("kotlin-kapt")}android { namespace = ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2023/08/11/%E8%A7%A3%E5%86%B3macOS%E6%89%A7%E8%A1%8Cfastboot%E6%89%BE%E4%B8%8D%E5%88%B0%E8%AE%BE%E5%A4%87%E7%9A%84%E9%97%AE%E9%A2%98/" title="解决macOS执行fastboot找不到设备的问题"><img class="post-bg" src="/2023/08/11/%E8%A7%A3%E5%86%B3macOS%E6%89%A7%E8%A1%8Cfastboot%E6%89%BE%E4%B8%8D%E5%88%B0%E8%AE%BE%E5%A4%87%E7%9A%84%E9%97%AE%E9%A2%98/image-20230811154542258.webp" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="解决macOS执行fastboot找不到设备的问题"></a></div><div class="recent-post-info"><a class="article-title" href="/2023/08/11/%E8%A7%A3%E5%86%B3macOS%E6%89%A7%E8%A1%8Cfastboot%E6%89%BE%E4%B8%8D%E5%88%B0%E8%AE%BE%E5%A4%87%E7%9A%84%E9%97%AE%E9%A2%98/" title="解决macOS执行fastboot找不到设备的问题">解决macOS执行fastboot找不到设备的问题</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-08-11T07:49:01.000Z" title="发表于 2023-08-11 15:49:01">2023-08-11</time></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/%E9%97%AE%E9%A2%98%E4%B8%8D%E5%A4%A7/">问题不大</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/Android/">Android</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/AOSP/">AOSP</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/%E9%BC%93%E6%8D%A3%E6%8A%98%E8%85%BE/">鼓捣折腾</a></span></div><div class="content">背景最近准备给我的备用机Redmi Note 11 5G刷个类原生的三方ROM,MIUI实在是用腻了。搜罗了一番,在XDA上找到了一个基于Pixel Experience开发的ROM:PixelExperience Plus for Redmi Note 11T/11S 5G/11 5G/POCO M4 Pro 5G (everpal),它的实际开源地址是:github.com/Xiaomi-MT6833/releases/releases/,可以直接在里面下载到最新的ROM刷机包和boot.img文件。
下载好PixelExperience_Plus_everpal-13.0-20230410-1707-UNOFFICIAL.zip和boot.img之后,开始刷机,其实过程非常简单(参考:小米手机刷PixelExperience系统操作指南),保证手机已经先解锁BL,并和电脑连接,然后终端执行命令,忽略指南中刷vendor那一步:
123adb reboot-bootloaderfastboot flash boo ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2023/07/31/%E7%BB%99%E4%B8%8D%E8%92%9C%E5%AD%90%EF%BC%88busuanzi%EF%BC%89%E7%BB%9F%E8%AE%A1%E6%95%B0%E6%8D%AE%E5%A2%9E%E5%8A%A0%E5%88%9D%E5%A7%8B%E5%80%BC/" title="给不蒜子(busuanzi)统计数据增加初始值">给不蒜子(busuanzi)统计数据增加初始值</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-07-31T08:54:00.000Z" title="发表于 2023-07-31 16:54:00">2023-07-31</time></span><span class="article-meta tags"><span class="article-meta-separator">|</span><i class="fas fa-tag"></i><a class="article-meta__tags" href="/tags/%E5%89%8D%E7%AB%AF/">前端</a><span class="article-meta-link">•</span><a class="article-meta__tags" href="/tags/%E9%BC%93%E6%8D%A3%E6%8A%98%E8%85%BE/">鼓捣折腾</a></span></div><div class="content">背景最近把个人博客迁移到了Hexo框架,并使用了Butterfly主题,得益于博客框架的易用性和主题功能的丰富程度,感觉非常的香。我对比了很多Hexo主题,这一个算是在功能、审美、文档等各方面几乎完美符合我需求的。
Butterfly很贴心地集成了不蒜子计数工具,可以统计网站的访问数据(人数,次数等)。只需要修改主题config文件即可开启:
1234busuanzi: site_uv: true site_pv: true page_pv: true
即便没有使用Hexo框架和Butterfly主题,用不蒜子计数也是很简单的。
这个工具存在快十年了,其首页的标语就是“两行代码,搞定计数”。感觉这位作者也是个有情怀的开发者,维护服务器给大家免费使用这么多年。
12<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script> <span id="busuanzi_container_si ...</div></div></div><div class="recent-post-item ads-wrap"><script async crossorigin=anonymous src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8999136091629669"></script><ins class=adsbygoogle data-ad-client=ca-pub-8999136091629669 data-ad-format=fluid data-ad-layout-key=-fb+5w+4e-db+86 data-ad-slot=1886176861 style=display:block></ins><script>(adsbygoogle=window.adsbygoogle||[]).push({})</script></div><nav id="pagination"><div class="pagination"><span class="page-number current">1</span><a class="page-number" href="/page/2/#content-inner">2</a><span class="space">…</span><a class="page-number" href="/page/7/#content-inner">7</a><a class="extend next" rel="next" href="/page/2/#content-inner"><i class="fas fa-chevron-right fa-fw"></i></a></div></nav></div><div class="aside-content" id="aside-content"><div class="card-widget card-info"><div class="is-center"><div class="avatar-img"><img src="/img/avatar-ysy.png" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/></div><div class="author-info__name">YSY</div><div class="author-info__description">Full-Stack, Android, AI</div></div><div class="card-info-data site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">94</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">15</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">0</div></a></div><a id="card-info-btn" target="_blank" rel="noopener" href="https://github.com/ysy950803"><i class="fab fa-github"></i><span>Follow Me</span></a></div><div class="card-widget donate" id="donate"><div class="item-headline"><i class="fas fa-heartbeat"></i><span>随缘支持</span></div><div class="item-content"><p style="text-align:center;padding:0;margin:0;"><a target="_blank" rel="noopener" href="https://qr.alipay.com/fkx12362diu95oh2aweaac5"><img src="https://blog.ysy950803.top/img/love-support.png" width="200" height="200"/></a></p> <p style="text-align:center;padding:0;margin:0;">移动端点击二维码亦可</p> <p style="text-align:center;padding:0;margin:0;"><u><a target="_blank" rel="noopener" href="https://paypal.me/yaoshengyu">Paypal.me if you like</a></u></p></div></div><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2025/01/23/%E5%A6%82%E4%BD%95%E5%9C%A8Ubuntu%E4%B8%8A%E8%87%AA%E5%BB%BAS3%E6%9C%8D%E5%8A%A1/" title="如何在Ubuntu上自建S3服务">如何在Ubuntu上自建S3服务</a><time datetime="2025-01-23T06:49:50.000Z" title="发表于 2025-01-23 14:49:50">2025-01-23</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2024/12/20/%E5%A6%82%E4%BD%95%E7%94%A8crontab%E5%92%8Cmail%E5%AE%9A%E6%97%B6%E5%8F%91%E9%82%AE%E4%BB%B6/" title="如何用crontab和mail定时发邮件">如何用crontab和mail定时发邮件</a><time datetime="2024-12-20T07:51:19.000Z" title="发表于 2024-12-20 15:51:19">2024-12-20</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2024/09/25/%E5%A6%82%E4%BD%95%E7%A6%81%E7%94%A8%E7%BD%91%E7%AB%99%E7%9B%AE%E5%BD%95%E8%AE%BF%E9%97%AE%EF%BC%88Apache%EF%BC%89/" title="如何禁用网站目录访问(Apache)">如何禁用网站目录访问(Apache)</a><time datetime="2024-09-25T05:07:20.000Z" title="发表于 2024-09-25 13:07:20">2024-09-25</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2024/08/26/Levenshtein%E7%BC%96%E8%BE%91%E8%B7%9D%E7%A6%BB%E7%AE%97%E6%B3%95%E5%88%9D%E4%BD%93%E9%AA%8C/" title="Levenshtein编辑距离算法初体验">Levenshtein编辑距离算法初体验</a><time datetime="2024-08-26T03:37:45.000Z" title="发表于 2024-08-26 11:37:45">2024-08-26</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2024/08/26/%E7%94%A8MySQL%E7%9A%84FROM-UNIXTIME%E5%87%BD%E6%95%B0%E8%BD%AC%E6%8D%A2%E6%97%B6%E9%97%B4%E6%A0%BC%E5%BC%8F/" title="用MySQL的FROM_UNIXTIME函数转换时间格式">用MySQL的FROM_UNIXTIME函数转换时间格式</a><time datetime="2024-08-26T02:26:57.000Z" title="发表于 2024-08-26 10:26:57">2024-08-26</time></div></div></div></div><div class="card-widget ads-wrap"><script async crossorigin=anonymous src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8999136091629669"></script><ins class=adsbygoogle data-ad-client=ca-pub-8999136091629669 data-ad-format=auto data-ad-slot=7049722255 data-full-width-responsive=true style=display:block></ins><script>(adsbygoogle=window.adsbygoogle||[]).push({})</script></div><div class="card-widget card-tags"><div class="item-headline"><i class="fas fa-tags"></i><span>标签</span></div><div class="card-tag-cloud"><a href="/tags/%E9%97%AE%E9%A2%98%E4%B8%8D%E5%A4%A7/" style="font-size: 1.35em; color: rgb(158, 77, 162)">问题不大</a><a href="/tags/Android/" style="font-size: 1.45em; color: rgb(36, 102, 102)">Android</a><a href="/tags/AOSP/" style="font-size: 1.38em; color: rgb(189, 164, 54)">AOSP</a><a href="/tags/Java/" style="font-size: 1.32em; color: rgb(183, 185, 161)">Java</a><a href="/tags/%E5%90%8E%E7%AB%AF/" style="font-size: 1.32em; color: rgb(5, 6, 124)">后端</a><a href="/tags/%E5%89%8D%E7%AB%AF/" style="font-size: 1.22em; color: rgb(187, 138, 10)">前端</a><a href="/tags/Kotlin/" style="font-size: 1.28em; color: rgb(37, 88, 177)">Kotlin</a><a href="/tags/%E9%BC%93%E6%8D%A3%E6%8A%98%E8%85%BE/" style="font-size: 1.42em; color: rgb(76, 33, 110)">鼓捣折腾</a><a href="/tags/Linux/" style="font-size: 1.32em; color: rgb(147, 67, 199)">Linux</a><a href="/tags/Gradle/" style="font-size: 1.22em; color: rgb(172, 36, 53)">Gradle</a><a href="/tags/Windows/" style="font-size: 1.25em; color: rgb(25, 129, 67)">Windows</a><a href="/tags/AI/" style="font-size: 1.22em; color: rgb(51, 114, 136)">AI</a><a href="/tags/macOS/" style="font-size: 1.18em; color: rgb(49, 90, 191)">macOS</a><a href="/tags/%E7%AE%97%E6%B3%95/" style="font-size: 1.18em; color: rgb(105, 72, 125)">算法</a><a href="/tags/Rust/" style="font-size: 1.15em; color: rgb(190, 104, 80)">Rust</a></div></div><div class="card-widget card-archives"><div class="item-headline"><i class="fas fa-archive"></i><span>归档</span><a class="card-more-btn" href="/archives/" title="查看更多">
<i class="fas fa-angle-right"></i></a></div><ul class="card-archive-list"><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2025/01/"><span class="card-archive-list-date">一月 2025</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/12/"><span class="card-archive-list-date">十二月 2024</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/09/"><span class="card-archive-list-date">九月 2024</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/08/"><span class="card-archive-list-date">八月 2024</span><span class="card-archive-list-count">5</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/03/"><span class="card-archive-list-date">三月 2024</span><span class="card-archive-list-count">3</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/08/"><span class="card-archive-list-date">八月 2023</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/07/"><span class="card-archive-list-date">七月 2023</span><span class="card-archive-list-count">2</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/05/"><span class="card-archive-list-date">五月 2023</span><span class="card-archive-list-count">1</span></a></li></ul></div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>网站资讯</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">文章数目 :</div><div class="item-count">94</div></div><div class="webinfo-item"><div class="item-name">已运行时间 :</div><div class="item-count" id="runtimeshow" data-publishDate="2018-03-02T16:00:00.000Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">本站访客数 :</div><div class="item-count" id="busuanzi_value_site_uv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">本站总访问量 :</div><div class="item-count" id="busuanzi_value_site_pv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">最后更新时间 :</div><div class="item-count" id="last-push-date" data-lastPushDate="2025-01-23T06:51:32.257Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div></div></div></div></div></main><footer id="footer" style="background-image: url('/img/home-bg.jpg')"><div id="footer-wrap"><div class="copyright">©2018 - 2025 By YSY</div><div class="footer_custom_text">Welcome To My Blog!</div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="translateLink" type="button" title="简繁转换">繁</button><button id="go-up" type="button" title="回到顶部"><span class="scroll-percent"></span><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><script src="/js/tw_cn.js"></script><script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox/fancybox.umd.min.js"></script><script src="https://cdn.jsdelivr.net/npm/node-snackbar/dist/snackbar.min.js"></script><script>function panguFn () {
if (typeof pangu === 'object') pangu.autoSpacingPage()
else {
getScript('https://cdn.jsdelivr.net/npm/pangu/dist/browser/pangu.min.js')
.then(() => {
pangu.autoSpacingPage()
})
}
}
function panguInit () {
if (false){
GLOBAL_CONFIG_SITE.isPost && panguFn()
} else {
panguFn()
}
}
document.addEventListener('DOMContentLoaded', panguInit)</script><div class="js-pjax"><script>window.typedJSFn = {
init: (str) => {
window.typed = new Typed('#subtitle', Object.assign({
strings: str,
startDelay: 300,
typeSpeed: 150,
loop: true,
backSpeed: 50,
}, null))
},
run: (subtitleType) => {
if (false) {
if (typeof Typed === 'function') {
subtitleType()
} else {
getScript('https://cdn.jsdelivr.net/npm/typed.js/dist/typed.umd.min.js').then(subtitleType)
}
} else {
subtitleType()
}
}
}
</script><script>function subtitleType () {
if (false) {
typedJSFn.init(["Full-Stack, Android, AI"])
} else {
document.getElementById("subtitle").textContent = "Full-Stack, Android, AI"
}
}
typedJSFn.run(subtitleType)</script></div><div class="aplayer no-destroy" data-id="2829816518" data-server="netease" data-type="playlist" data-fixed="true" data-autoplay="false" data-lrctype="0"> </div><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.css" media="print" onload="this.media='all'"><script src="https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.js"></script><script src="https://cdn.jsdelivr.net/npm/butterfly-extsrc/metingjs/dist/Meting.min.js"></script><script src="https://cdn.jsdelivr.net/npm/pjax/pjax.min.js"></script><script>let pjaxSelectors = ["head > title","#config-diff","#body-wrap","#rightside-config-hide","#rightside-config-show",".js-pjax"]
var pjax = new Pjax({
elements: 'a:not([target="_blank"])',
selectors: pjaxSelectors,
cacheBust: false,
analytics: true,
scrollRestoration: false
})
document.addEventListener('pjax:send', function () {
// removeEventListener scroll
window.tocScrollFn && window.removeEventListener('scroll', window.tocScrollFn)
window.scrollCollect && window.removeEventListener('scroll', scrollCollect)
document.getElementById('rightside').style.cssText = "opacity: ''; transform: ''"
if (window.aplayers) {
for (let i = 0; i < window.aplayers.length; i++) {
if (!window.aplayers[i].options.fixed) {
window.aplayers[i].destroy()
}
}
}
typeof typed === 'object' && typed.destroy()
//reset readmode
const $bodyClassList = document.body.classList
$bodyClassList.contains('read-mode') && $bodyClassList.remove('read-mode')
typeof disqusjs === 'object' && disqusjs.destroy()
})
document.addEventListener('pjax:complete', function () {
window.refreshFn()
document.querySelectorAll('script[data-pjax]').forEach(item => {
const newScript = document.createElement('script')
const content = item.text || item.textContent || item.innerHTML || ""
Array.from(item.attributes).forEach(attr => newScript.setAttribute(attr.name, attr.value))
newScript.appendChild(document.createTextNode(content))
item.parentNode.replaceChild(newScript, item)
})
GLOBAL_CONFIG.islazyload && window.lazyLoadInstance.update()
typeof panguInit === 'function' && panguInit()
// google analytics
typeof gtag === 'function' && gtag('config', 'UA-149830607-1', {'page_path': window.location.pathname});
// baidu analytics
typeof _hmt === 'object' && _hmt.push(['_trackPageview',window.location.pathname]);
typeof loadMeting === 'function' && document.getElementsByClassName('aplayer').length && loadMeting()
// prismjs
typeof Prism === 'object' && Prism.highlightAll()
})
document.addEventListener('pjax:error', (e) => {
if (e.request.status === 404) {
pjax.loadUrl('/404.html')
}
})</script><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script><div id="local-search"><div class="search-dialog"><nav class="search-nav"><span class="search-dialog-title">Search</span><span id="loading-status"></span><button class="search-close-button"><i class="fas fa-times"></i></button></nav><div class="is-center" id="loading-database"><i class="fas fa-spinner fa-pulse"></i><span> 数据库加载中</span></div><div class="search-wrap"><div id="local-search-input"><div class="local-search-box"><input class="local-search-box--input" placeholder="搜索文章" type="text"/></div></div><hr/><div class="no-result" id="local-search-results"></div><div id="local-search-stats-wrap"></div></div></div><div id="search-mask"></div><script src="/js/search/local-search.js"></script></div></div></body></html>