diff --git a/atom.xml b/atom.xml index c3ae8f08..6cea8abe 100755 --- a/atom.xml +++ b/atom.xml @@ -6,7 +6,7 @@ - 2023-08-05T08:32:53.132Z + 2023-08-05T08:38:24.419Z https://puzzle9.github.io/ @@ -21,7 +21,7 @@ https://puzzle9.github.io/posts/eb968e3/ 2023-08-05T08:29:13.000Z - 2023-08-05T08:32:53.132Z + 2023-08-05T08:38:24.419Z 突然想起来

从4月来到这所城市 到现在已经有4月了

要离开的话

是不是要一一给印象中的人物道别

为了让对方晓得这个事情嘛

相遇既是缘分

告诉对方

自己要离开了

恩 感觉还不错

可是

何以为家呢

还有 这所城市

未完成的事情

牵挂的事情

要怎么处理呢

]]>
@@ -38,9 +38,9 @@ https://puzzle9.github.io/posts/ba2c0eca/ 2023-04-04T04:07:28.000Z - 2023-08-05T08:28:28.340Z + 2023-08-12T05:24:03.746Z - 陕西

西安

广州

广东

白云山

内蒙

呼和浩特

各民族要像石榴籽一样紧紧抱在一起

大召无量寺
昭君博物院
塞上老街
内蒙古博物馆
内蒙古科学技术馆

鄂尔多斯

成吉思汗广场
鄂尔多斯市 博物馆、 图书馆

江苏

宿迁

人间烟火气 最抚凡人心

骆马湖
三台山国家森林公园
宝龙广场

徐州

安徽

淮北

相山国家森林公园

河南

郑州

大玉米楼
河南博物院
二七广场 步行街

]]>
+ 陕西

西安 省会

广州

广东 省会

白云山

内蒙

呼和浩特

各民族要像石榴籽一样紧紧抱在一起

大召无量寺
昭君博物院
塞上老街
内蒙古博物馆
内蒙古科学技术馆

鄂尔多斯

成吉思汗广场
鄂尔多斯市 博物馆、 图书馆

江苏

宿迁

人间烟火气 最抚凡人心

骆马湖
三台山国家森林公园
宝龙广场

徐州

安徽

淮北

相山国家森林公园

河南

郑州 省会

大玉米楼
河南博物院
二七广场 步行街

山西

晋中

太原 省会

山西博物馆

]]>
那些在城市遇到的事情 diff --git a/posts/1f9a00a3/index.html b/posts/1f9a00a3/index.html index d4a6478c..353cc684 100755 --- a/posts/1f9a00a3/index.html +++ b/posts/1f9a00a3/index.html @@ -1 +1 @@ -要送出去的礼物 - puzzle9 blog
要送出去的礼物

吸水干发毛巾

  • 171030

暖手宝

  • 171017

红糖

  • 170913

木梳

  • 210303

红枣

  • 171126

小王子

  • 190429

\ No newline at end of file +要送出去的礼物 - puzzle9 blog
要送出去的礼物

吸水干发毛巾

  • 171030

暖手宝

  • 171017

红糖

  • 170913

木梳

  • 210303

红枣

  • 171126

小王子

  • 190429

\ No newline at end of file diff --git a/posts/ba2c0eca/index.html b/posts/ba2c0eca/index.html index d410e78a..205a457e 100755 --- a/posts/ba2c0eca/index.html +++ b/posts/ba2c0eca/index.html @@ -1 +1 @@ -城市故事 - puzzle9 blog
城市故事

陕西

西安

  • 车让人

广州

广东

白云山

  • 靓仔
  • 公交车去和回的路线大概率不同

内蒙

呼和浩特

各民族要像石榴籽一样紧紧抱在一起

大召无量寺
昭君博物院
塞上老街
内蒙古博物馆
内蒙古科学技术馆

  • 公交等扶稳再开

鄂尔多斯

成吉思汗广场
鄂尔多斯市 博物馆、 图书馆

江苏

宿迁

人间烟火气 最抚凡人心

骆马湖
三台山国家森林公园
宝龙广场

  • 下车提前示意或按铃
  • 星爸爸的wifiChinaNet-Starbucks
  • 同一个公交站 站名大概率是不同的

徐州

  • 徐州东站 东、西广场

安徽

淮北

相山国家森林公园

  • 海拔变化大且高架桥众多的

河南

郑州

大玉米楼
河南博物院
二七广场 步行街

  • brt 公交
  • 好像小区都有门

\ No newline at end of file +城市故事 - puzzle9 blog
城市故事

陕西

西安 省会

  • 车让人

广州

广东 省会

白云山

  • 靓仔
  • 公交车去和回的路线大概率不同

内蒙

呼和浩特

各民族要像石榴籽一样紧紧抱在一起

大召无量寺
昭君博物院
塞上老街
内蒙古博物馆
内蒙古科学技术馆

  • 公交等扶稳再开

鄂尔多斯

成吉思汗广场
鄂尔多斯市 博物馆、 图书馆

江苏

宿迁

人间烟火气 最抚凡人心

骆马湖
三台山国家森林公园
宝龙广场

  • 下车提前示意或按铃
  • 星爸爸的wifiChinaNet-Starbucks
  • 同一个公交站 站名大概率是不同的

徐州

  • 徐州东站 东、西广场

安徽

淮北

相山国家森林公园

  • 海拔变化大且高架桥众多的

河南

郑州 省会

大玉米楼
河南博物院
二七广场 步行街

  • brt 公交
  • 好像小区都有门

山西

晋中

  • 公交司机 站起来欢迎乘坐 到站后请您等车辆停稳后再起身下车

太原 省会

山西博物馆


\ No newline at end of file diff --git a/posts/e377b897/index.html b/posts/e377b897/index.html index ae907950..d4e4d21d 100755 --- a/posts/e377b897/index.html +++ b/posts/e377b897/index.html @@ -1 +1 @@ -210527 - puzzle9 blog
210527

最近 买了个显示器

感觉 视野一下大了许多

然后 又去咸鱼买了个 max3 的屏幕

结果发现是主板问题

然后 就需要拿运费了 算下来 有个 16.8

又是午饭没了呢

然后是

请假 迟到等等

怎么说呢

就是已经来了

所以 也不怕了

或者 是其他什么感想

然后

就是 加班 点外卖

再者 就是吃啥

这个重大的问题了

对呀

吃啥呢

饺子涨价了呀


\ No newline at end of file +210527 - puzzle9 blog
210527

最近 买了个显示器

感觉 视野一下大了许多

然后 又去咸鱼买了个 max3 的屏幕

结果发现是主板问题

然后 就需要拿运费了 算下来 有个 16.8

又是午饭没了呢

然后是

请假 迟到等等

怎么说呢

就是已经来了

所以 也不怕了

或者 是其他什么感想

然后

就是 加班 点外卖

再者 就是吃啥

这个重大的问题了

对呀

吃啥呢

饺子涨价了呀


\ No newline at end of file diff --git a/posts/eca92fa/index.html b/posts/eca92fa/index.html index acd434a2..f9d0a080 100755 --- a/posts/eca92fa/index.html +++ b/posts/eca92fa/index.html @@ -1 +1 @@ -对简历的思考 - puzzle9 blog
对简历的思考

2021-02-18

目前 算算 大概工作了 一年半 了 从 19年7月 开始

然后 是一个 php 搬砖者

平时偶尔也能刷到他人简历

真的 羡慕 他们可以写那么多

可是 就是那个

段位在之上的 可以看出来猫腻

段位在之下的 觉得不真实

然后 这主要就 工作经历 工资?

好吧 我思考了下这个问题 我发现 我想不到 我就想知道 他能不能恰好当个螺丝钉 让这个项目可以交付

后面再说后面的话

可是 简历又是 hr 看的 这 可不一定懂技术

所以 就得写的多多的

约了面试 就明明白白了

按照话说 可能是吃饱了 没事干 撑着

所以就 在思考这些头疼的事情

而我 也得写简历 可是 这玩意 我写啥

然后 这里面体现不体现上家公司 好像 就像是那个啥一样 然后 如果有了 就那啥 没有 就不那啥了

我又想起来了!h 给我说的话 每天都在说自己才能理解的话

也不晓得 后面看到我写的这个 或者 其他人看到了 怎么想

苦恼

哦对 晚安

2021-03-31

啊 截至到目前

我的简历 还没有更新

对于一个应聘者来说 这应该是不对的

可是 我想了想 实在不晓得怎么去写这一个简历

对于一个项目 写自己在什么场景 干了什么

让对方发现 你恰好就是他所需要的那颗螺丝钉

这样 面试就有戏了

想想 我可能适合一个自由职业者吧

这个简历 就先这样放着

好像现在就是 伯乐和千里马之间的关系

连个之间的协调

如果自己不主动表现出来 其他人怎么知道你的能力呢

如果你看到了这里 或者以后的我看到了这里

我会如何想当初的自己

good job

2021-04-07

啊 我最终 还是被现实打败了 决定好好写一下这个简历

确实如此 对于对方来说 这是一个基本的了解过程


\ No newline at end of file +对简历的思考 - puzzle9 blog
对简历的思考

2021-02-18

目前 算算 大概工作了 一年半 了 从 19年7月 开始

然后 是一个 php 搬砖者

平时偶尔也能刷到他人简历

真的 羡慕 他们可以写那么多

可是 就是那个

段位在之上的 可以看出来猫腻

段位在之下的 觉得不真实

然后 这主要就 工作经历 工资?

好吧 我思考了下这个问题 我发现 我想不到 我就想知道 他能不能恰好当个螺丝钉 让这个项目可以交付

后面再说后面的话

可是 简历又是 hr 看的 这 可不一定懂技术

所以 就得写的多多的

约了面试 就明明白白了

按照话说 可能是吃饱了 没事干 撑着

所以就 在思考这些头疼的事情

而我 也得写简历 可是 这玩意 我写啥

然后 这里面体现不体现上家公司 好像 就像是那个啥一样 然后 如果有了 就那啥 没有 就不那啥了

我又想起来了!h 给我说的话 每天都在说自己才能理解的话

也不晓得 后面看到我写的这个 或者 其他人看到了 怎么想

苦恼

哦对 晚安

2021-03-31

啊 截至到目前

我的简历 还没有更新

对于一个应聘者来说 这应该是不对的

可是 我想了想 实在不晓得怎么去写这一个简历

对于一个项目 写自己在什么场景 干了什么

让对方发现 你恰好就是他所需要的那颗螺丝钉

这样 面试就有戏了

想想 我可能适合一个自由职业者吧

这个简历 就先这样放着

好像现在就是 伯乐和千里马之间的关系

连个之间的协调

如果自己不主动表现出来 其他人怎么知道你的能力呢

如果你看到了这里 或者以后的我看到了这里

我会如何想当初的自己

good job

2021-04-07

啊 我最终 还是被现实打败了 决定好好写一下这个简历

确实如此 对于对方来说 这是一个基本的了解过程


\ No newline at end of file diff --git a/search.json b/search.json index c7568e96..e0959b22 100755 --- a/search.json +++ b/search.json @@ -1 +1 @@ -[{"title":"过客","url":"/posts/eb968e3/","content":"\n突然想起来\n\n从4月来到这所城市 到现在已经有4月了\n\n要离开的话\n\n是不是要一一给印象中的人物道别\n\n为了让对方晓得这个事情嘛\n\n相遇既是缘分\n\n告诉对方\n\n自己要离开了\n\n恩 感觉还不错\n\n可是\n\n何以为家呢\n\n还有 这所城市\n\n未完成的事情\n\n牵挂的事情\n\n要怎么处理呢\n"},{"title":"城市故事","url":"/posts/ba2c0eca/","content":"\n# 陕西\n\n## 西安\n\n- 车让人\n\n# 广州\n\n## 广东\n\n> 白云山\n\n- 靓仔\n- 公交车去和回的路线大概率不同\n\n# 内蒙\n\n## 呼和浩特\n\n各民族要像石榴籽一样紧紧抱在一起\n\n> 大召无量寺\n> 昭君博物院\n> 塞上老街\n> 内蒙古博物馆\n> 内蒙古科学技术馆\n\n- 公交等扶稳再开\n\n## 鄂尔多斯\n\n> 成吉思汗广场\n> 鄂尔多斯市 博物馆、 图书馆\n\n# 江苏\n\n## 宿迁\n\n人间烟火气 最抚凡人心\n\n> 骆马湖\n> 三台山国家森林公园\n> 宝龙广场\n\n- 下车提前示意或按铃\n- 星爸爸的`wifi`是 `ChinaNet-Starbucks`\n- 同一个公交站 站名大概率是不同的\n\n## 徐州\n\n- 徐州东站 东、西广场\n\n# 安徽\n\n## 淮北\n\n> 相山国家森林公园\n\n- 海拔变化大且高架桥众多的\n\n# 河南\n\n## 郑州\n\n> 大玉米楼\n> 河南博物院\n> 二七广场 步行街\n\n- `brt` 公交\n- 好像小区都有门\n"},{"title":"百家姓认全计划","url":"/posts/da84cdef/","content":"\n> 一个地方待久了 仿佛不知道姓外有姓一般\n\n# 百家姓\n\n> 按 单姓 复姓 排序\n\n> 我看到了 `植` 才意识到 原来还有 `千家姓` `万家姓`\n\n## 单姓 444 个\n\n- [x] 1 赵(zhào)\n- [x] 2 钱(qián)\n- [x] 3 孙(sūn)\n- [x] 4 李(lǐ)\n- [x] 5 周(zhōu)\n- [x] 6 吴(wú)\n- [x] 7 郑(zhèng)\n- [x] 8 王(wáng)\n- [x] 9 冯(féng)\n- [x] 10 陈(chén)\n- [ ] 11 褚(chǔ)\n- [ ] 12 卫(wèi)\n- [x] 13 蒋(jiǎng)\n- [x] 14 沈(shěn)\n- [x] 15 韩(hán)\n- [x] 16 杨(yáng)\n- [x] 17 朱(zhū)\n- [x] 18 秦(qín)\n- [x] 19 尤(yóu)\n- [ ] 20 许(xǔ)\n- [ ] 21 何(hé)\n- [x] 22 吕(lǚ)\n- [ ] 23 施(shī)\n- [x] 24 张(zhāng)\n- [x] 25 孔(kǒng)\n- [x] 26 曹(cáo)\n- [x] 27 严(yán)\n- [ ] 28 华(huà)\n- [x] 29 金(jīn)\n- [x] 30 魏(wèi)\n- [ ] 31 陶(táo)\n- [ ] 32 姜(jiāng)\n- [ ] 33 戚(qī)\n- [ ] 34 谢(xiè)\n- [x] 35 邹(zōu)\n- [ ] 36 喻(yù)\n- [ ] 37 柏(bǎi)\n- [ ] 38 水(shuǐ)\n- [ ] 39 窦(dòu)\n- [ ] 40 章(zhāng)\n- [ ] 41 云(yún)\n- [ ] 42 苏(sū)\n- [ ] 43 潘(pān)\n- [ ] 44 葛(gě)\n- [x] 45 奚(xī)\n- [x] 46 范(fàn)\n- [x] 47 彭(péng)\n- [ ] 48 郎(láng)\n- [ ] 49 鲁(lǔ)\n- [ ] 50 韦(wéi)\n- [ ] 51 昌(chāng)\n- [x] 52 马(mǎ)\n- [ ] 53 苗(miáo)\n- [ ] 54 凤(fèng)\n- [ ] 55 花(huā)\n- [ ] 56 方(fāng)\n- [ ] 57 俞(yú)\n- [ ] 58 任(rèn)\n- [x] 59 袁(yuán)\n- [ ] 60 柳(liǔ)\n- [ ] 61 酆(fēng)\n- [ ] 62 鲍(bào)\n- [x] 63 史(shǐ)\n- [x] 64 唐(táng)\n- [ ] 65 费(fèi)\n- [ ] 66 廉(lián)\n- [ ] 67 岑(cén)\n- [x] 68 薛(xuē)\n- [ ] 69 雷(léi)\n- [x] 70 贺(hè)\n- [ ] 71 倪(ní)\n- [x] 72 汤(tāng)\n- [ ] 73 滕(téng)\n- [ ] 74 殷(yīn)\n- [ ] 75 罗(luó)\n- [ ] 76 毕(bì)\n- [ ] 77 郝(hǎo)\n- [ ] 78 邬(wū)\n- [ ] 79 安(ān)\n- [ ] 80 常(cháng)\n- [ ] 81 乐(yuè)\n- [x] 82 于(yú)\n- [ ] 83 时(shí)\n- [x] 84 傅(fù) -> 付\n- [ ] 85 皮(pí)\n- [ ] 86 卞(biàn)\n- [ ] 87 齐(qí)\n- [x] 88 康(kāng)\n- [ ] 89 伍(wǔ)\n- [ ] 90 余(yú)\n- [ ] 91 元(yuán)\n- [ ] 92 卜(bǔ)\n- [ ] 93 顾(gù)\n- [x] 94 孟(mèng)\n- [ ] 95 平(píng)\n- [x] 96 黄(huáng)\n- [ ] 97 和(hé)\n- [ ] 98 穆(mù)\n- [ ] 99 萧(xiāo)\n- [ ] 100 尹(yǐn)\n- [x] 101 姚(yáo)\n- [ ] 102 邵(shào)\n- [ ] 103 湛(zhàn)\n- [x] 104 汪(wāng)\n- [ ] 105 祁(qí)\n- [ ] 106 毛(máo)\n- [ ] 107 禹(yǔ)\n- [x] 108 狄(dí)\n- [ ] 109 米(mǐ)\n- [ ] 110 贝(bèi)\n- [ ] 111 明(míng)\n- [ ] 112 臧(zāng)\n- [ ] 113 计(jì)\n- [ ] 114 伏(fú)\n- [ ] 115 成(chéng)\n- [ ] 116 戴(dài)\n- [x] 117 谈(tán)\n- [x] 118 宋(sòng)\n- [ ] 119 茅(máo)\n- [ ] 120 庞(páng)\n- [ ] 121 熊(xióng)\n- [ ] 122 纪(jì)\n- [ ] 123 舒(shū)\n- [ ] 124 屈(qū)\n- [ ] 125 项(xiàng)\n- [ ] 126 祝(zhù)\n- [x] 127 董(dǒng)\n- [ ] 128 梁(liáng)\n- [x] 129 杜(dù)\n- [ ] 130 阮(ruǎn)\n- [ ] 131 蓝(lán)\n- [ ] 132 闵(mǐn)\n- [x] 133 席(xí)\n- [ ] 134 季(jì)\n- [ ] 135 麻(má)\n- [ ] 136 强(qiáng)\n- [x] 137 贾(jiǎ)\n- [x] 138 路(lù)\n- [ ] 139 娄(lóu)\n- [ ] 140 危(wēi)\n- [ ] 141 江(jiāng)\n- [ ] 142 童(tóng)\n- [x] 143 颜(yán)\n- [x] 144 郭(guō)\n- [ ] 145 梅(méi)\n- [ ] 146 盛(shèng)\n- [x] 147 林(lín)\n- [ ] 148 刁(diāo)\n- [ ] 149 钟(zhōng)\n- [ ] 150 徐(xú)\n- [ ] 151 邱(qiū)\n- [ ] 152 骆(luò)\n- [x] 153 高(gāo)\n- [ ] 154 夏(xià)\n- [ ] 155 蔡(cài)\n- [x] 156 田(tián)\n- [x] 157 樊(fán)\n- [x] 158 胡(hú)\n- [ ] 159 凌(líng)\n- [ ] 160 霍(huò)\n- [ ] 161 虞(yú)\n- [ ] 162 万(wàn)\n- [ ] 163 支(zhī)\n- [ ] 164 柯(kē)\n- [ ] 165 昝(zǎn)\n- [x] 166 管(guǎn)\n- [ ] 167 卢(lú)\n- [ ] 168 莫(mò)\n- [ ] 169 经(jīng)\n- [ ] 170 房(fáng)\n- [ ] 171 裘(qiú)\n- [ ] 172 缪(miào)\n- [ ] 173 干(gān)\n- [ ] 174 解(xiè)\n- [ ] 175 应(yīng)\n- [ ] 176 宗(zōng)\n- [ ] 177 丁(dīng)\n- [x] 178 宣(xuān)\n- [ ] 179 贲(bēn)\n- [x] 180 邓(dèng)\n- [ ] 181 郁(yù)\n- [ ] 182 单(shàn)\n- [ ] 183 杭(háng)\n- [ ] 184 洪(hóng)\n- [ ] 185 包(bāo)\n- [ ] 186 诸(zhū)\n- [ ] 187 左(zuǒ)\n- [ ] 188 石(shí)\n- [ ] 189 崔(cuī)\n- [ ] 190 吉(jí)\n- [ ] 191 钮(niǔ)\n- [x] 192 龚(gōng)\n- [ ] 193 程(chéng)\n- [ ] 194 嵇(jī)\n- [x] 195 邢(xíng)\n- [ ] 196 滑(huá)\n- [ ] 197 裴(péi)\n- [x] 198 陆(lù)\n- [ ] 199 荣(róng)\n- [ ] 200 翁(wēng)\n- [ ] 201 荀(xún)\n- [ ] 202 羊(yáng)\n- [ ] 203 於(yū)\n- [ ] 204 惠(huì)\n- [ ] 205 甄(zhēn)\n- [ ] 206 曲(qū)\n- [ ] 207 家(jiā)\n- [ ] 208 封(fēng)\n- [ ] 209 芮(ruì)\n- [ ] 210 羿(yì)\n- [ ] 211 储(chǔ)\n- [ ] 212 靳(jìn)\n- [ ] 213 汲(jí)\n- [ ] 214 邴(bǐng)\n- [ ] 215 糜(mí)\n- [ ] 216 松(sōng)\n- [ ] 217 井(jǐng)\n- [ ] 218 段(duàn)\n- [ ] 219 富(fù)\n- [ ] 220 巫(wū)\n- [ ] 221 乌(wū)\n- [ ] 222 焦(jiāo)\n- [ ] 223 巴(bā)\n- [ ] 224 弓(gōng)\n- [ ] 225 牧(mù)\n- [ ] 226 隗(kuí)\n- [ ] 227 山(shān)\n- [x] 228 谷(gǔ)\n- [ ] 229 车(chē)\n- [x] 230 侯(hóu)\n- [ ] 231 宓(mì)\n- [ ] 232 蓬(péng)\n- [ ] 233 全(quán)\n- [ ] 234 郗(xī)\n- [ ] 235 班(bān)\n- [ ] 236 仰(yǎng)\n- [ ] 237 秋(qiū)\n- [ ] 238 仲(zhòng)\n- [ ] 239 伊(yī)\n- [ ] 240 宫(gōng)\n- [ ] 241 宁(nìng)\n- [ ] 242 仇(qiú)\n- [ ] 243 栾(luán)\n- [ ] 244 暴(bào)\n- [ ] 245 甘(gān)\n- [ ] 246 钭(tǒu)\n- [ ] 247 厉(lì)\n- [ ] 248 戎(róng)\n- [ ] 249 祖(zǔ)\n- [x] 250 武(wǔ)\n- [x] 251 符(fú)\n- [x] 252 刘(liú)\n- [x] 253 景(jǐng)\n- [ ] 254 詹(zhān)\n- [ ] 255 束(shù)\n- [ ] 256 龙(lóng)\n- [x] 257 叶(yè)\n- [ ] 258 幸(xìng)\n- [x] 259 司(sī)\n- [ ] 260 韶(sháo)\n- [ ] 261 郜(gào)\n- [ ] 262 黎(lí)\n- [ ] 263 蓟(jì)\n- [ ] 264 薄(bó)\n- [ ] 265 印(yìn)\n- [ ] 266 宿(sù)\n- [ ] 267 白(bái)\n- [ ] 268 怀(huái)\n- [ ] 269 蒲(pú)\n- [ ] 270 邰(tái)\n- [ ] 271 从(cóng)\n- [ ] 272 鄂(è)\n- [ ] 273 索(suǒ)\n- [ ] 274 咸(xián)\n- [ ] 275 籍(jí)\n- [x] 276 赖(lài)\n- [ ] 277 卓(zhuó)\n- [ ] 278 蔺(lìn)\n- [ ] 279 屠(tú)\n- [ ] 280 蒙(méng)\n- [ ] 281 池(chí)\n- [x] 282 乔(qiáo)\n- [ ] 283 阴(yīn)\n- [ ] 284 鬱(yù)\n- [ ] 285 胥(xū)\n- [ ] 286 能(nài)\n- [ ] 287 苍(cāng)\n- [ ] 288 双(shuāng)\n- [ ] 289 闻(wén)\n- [ ] 290 莘(shēn)\n- [x] 291 党(dǎng)\n- [ ] 292 翟(zhái)\n- [ ] 293 谭(tán)\n- [ ] 294 贡(gòng)\n- [ ] 295 劳(láo)\n- [ ] 296 逄(páng)\n- [ ] 297 姬(jī)\n- [x] 298 申(shēn)\n- [ ] 299 扶(fú)\n- [ ] 300 堵(dǔ)\n- [ ] 301 冉(rǎn)\n- [ ] 302 宰(zǎi)\n- [ ] 303 郦(lì)\n- [ ] 304 雍(yōng)\n- [ ] 305 郤(xì))\n- [ ] 306 璩(qú)\n- [ ] 307 桑(sāng\n- [ ] 308 桂(guì)\n- [ ] 309 濮(pú)\n- [ ] 310 牛(niú)\n- [ ] 311 寿(shòu)\n- [ ] 312 通(tōng)\n- [ ] 313 边(biān)\n- [ ] 314 扈(hù)\n- [ ] 315 燕(yān)\n- [ ] 316 冀(jì)\n- [ ] 317 郏(jiá)\n- [ ] 318 浦(pǔ)\n- [ ] 319 尚(shàng)\n- [ ] 320 农(nóng)\n- [x] 321 温(wēn)\n- [ ] 322 别(bié)\n- [x] 323 庄(zhuāng)\n- [ ] 324 晏(yàn)\n- [x] 325 柴(chái)\n- [ ] 326 瞿(qú)\n- [ ] 327 阎(yán)\n- [ ] 328 充(chōng)\n- [ ] 329 慕(mù)\n- [ ] 330 连(lián)\n- [ ] 331 茹(rú)\n- [ ] 332 习(xí)\n- [ ] 333 宦(huàn)\n- [ ] 334 艾(ài)\n- [ ] 335 鱼(yú)\n- [ ] 336 容(róng)\n- [ ] 337 向(xiàng)\n- [ ] 338 古(gǔ)\n- [ ] 339 易(yì)\n- [ ] 340 慎(shèn)\n- [ ] 341 戈(gē)\n- [x] 342 廖(liào)\n- [ ] 343 庾(yǔ)\n- [ ] 344 终(zhōng)\n- [ ] 345 暨(jì)\n- [ ] 346 居(jū)\n- [ ] 347 衡(héng)\n- [ ] 348 步(bù)\n- [ ] 349 都(dū)\n- [ ] 350 耿(gěng)\n- [ ] 351 满(mǎn)\n- [ ] 352 弘(hóng)\n- [ ] 353 匡(kuāng)\n- [ ] 354 国(guó)\n- [ ] 355 文(wén)\n- [x] 356 寇(kòu)\n- [ ] 357 广(guǎng)\n- [ ] 358 禄(lù)\n- [ ] 359 阙(quē)\n- [ ] 360 东(dōng)\n- [ ] 361 欧(ōu)\n- [ ] 362 殳(shū)\n- [ ] 363 沃(wò)\n- [ ] 364 利(lì)\n- [ ] 365 蔚(wèi)\n- [ ] 366 越(yuè)\n- [ ] 367 夔(kuí)\n- [ ] 368 隆(lóng)\n- [ ] 369 师(shī)\n- [ ] 370 巩(gǒng)\n- [ ] 371 厍(shè)\n- [x] 372 聂(niè)\n- [ ] 373 晁(cháo)\n- [ ] 374 勾(gōu)\n- [ ] 375 敖(áo)\n- [ ] 376 融(róng)\n- [ ] 377 冷(lěng)\n- [ ] 378 訾(zǐ)\n- [ ] 379 辛(xīn)\n- [ ] 380 阚(kàn)\n- [ ] 381 那(nā)\n- [ ] 382 简(jiǎn)\n- [ ] 383 饶(ráo)\n- [ ] 384 空(kōng)\n- [x] 385 曾(zēng)\n- [ ] 386 母(mǔ)\n- [ ] 387 沙(shā)\n- [ ] 388 乜(niè)\n- [ ] 389 养(yǎng)\n- [ ] 390 鞠(jū)\n- [ ] 391 须(xū)\n- [ ] 392 丰(fēng)\n- [ ] 393 巢(cháo)\n- [ ] 394 关(guān)\n- [ ] 395 蒯(kuǎi)\n- [ ] 396 相(xiàng)\n- [ ] 397 查(zhā)\n- [ ] 398 后(hòu)\n- [ ] 399 荆(jīng)\n- [ ] 400 红(hóng)\n- [ ] 401 游(yóu)\n- [ ] 402 竺(zhú)\n- [ ] 403 权(quán)\n- [ ] 404 逯(lù)\n- [ ] 405 盖(gài)\n- [ ] 406 益(yì)\n- [ ] 407 桓(huán)\n- [ ] 408 公(gōng)\n- [ ] 443 仉(zhǎng)\n- [ ] 444 督(dū)\n- [ ] 458 晋(jìn)\n- [ ] 459 楚(chǔ)\n- [ ] 460 闫(yán)\n- [ ] 461 法(fǎ)\n- [ ] 462 汝(rǔ)\n- [ ] 463 鄢(yān)\n- [ ] 464 涂(tú)\n- [ ] 465 钦(qīn)\n- [ ] 465 归(guī)\n- [ ] 472 海(hǎi)\n- [ ] 475 岳(yuè)\n- [ ] 476 帅(shuài)\n- [ ] 477 缑(gōu)\n- [ ] 478 亢(kàng)\n- [x] 479 况(kuàng)\n- [ ] 480 后(hòu)\n- [ ] 481 有(yǒu)\n- [ ] 482 琴(qín)\n- [ ] 487 商(shāng)\n- [ ] 488 牟(móu)\n- [ ] 489 佘(shé)\n- [ ] 490 佴(nài)\n- [ ] 491 伯(bó)\n- [ ] 492 赏(shǎng)\n- [ ] 494 墨(mò)\n- [ ] 495 哈(hǎ)\n- [ ] 496 谯(qiáo)\n- [ ] 497 笪(dá)\n- [ ] 498 年(nián)\n- [ ] 499 爱(ài)\n- [ ] 500 阳(yáng)\n- [ ] 501 佟(tóng)\n- [ ] 503 言(yán)\n- [ ] 504 福(fú)\n\n## 复姓 60 个\n\n- [ ] 409 万俟(mò qí)\n- [ ] 410 司马(sī mǎ)\n- [ ] 411 上官(shàng guān)\n- [ ] 412 欧阳(ōu yáng)\n- [ ] 413 夏侯(xià hóu)\n- [ ] 414 诸葛(zhū gě)\n- [ ] 415 闻人(wén rén)\n- [ ] 416 东方(dōng fāng)\n- [ ] 417 赫连(hè lián)\n- [ ] 418 皇甫(huáng pǔ)\n- [ ] 419 尉迟(yù chí)\n- [ ] 420 公羊(gōng yáng)\n- [ ] 421 澹台(tán tái)\n- [ ] 422 公冶(gōng yě)\n- [ ] 423 宗政(zōng zhèng)\n- [ ] 424 濮阳(pú yáng)\n- [ ] 425 淳于(chún yú)\n- [ ] 426 单于(chán yú)\n- [ ] 427 太叔(tài shū)\n- [ ] 428 申屠(shēn tú)\n- [ ] 429 公孙(gōng sūn)\n- [ ] 430 仲孙(zhòng sūn)\n- [ ] 431 轩辕(xuān yuán)\n- [ ] 432 令狐(lìng hú )\n- [ ] 433 钟离(zhōng lí)\n- [ ] 434 宇文(yǔ wén)\n- [ ] 435 长孙(zhǎng sūn)\n- [ ] 436 慕容(mù róng)\n- [ ] 437 鲜于(xiān yú)\n- [ ] 438 闾丘(lǘ qiū)\n- [ ] 439 司徒(sī tú)\n- [ ] 440 司空(sī kōng)\n- [ ] 441 亓官(qí guān)\n- [ ] 442 司寇(sī kòu)\n- [ ] 445 子车(zǐ jū)\n- [ ] 446 颛孙(zhuān sūn)\n- [ ] 447 端木(duān mù)\n- [ ] 448 巫马(wū mǎ)\n- [ ] 449 公西(gōng xī)\n- [ ] 450 漆雕(qī diāo)\n- [ ] 451 乐正(yuè zhèng)\n- [ ] 452 壤驷(rǎng sì)\n- [ ] 453 公良(gōng liáng)\n- [ ] 454 拓跋(tuò bá)\n- [ ] 455 夹谷(jiá gǔ)\n- [ ] 456 宰父(zǎi fǔ)\n- [ ] 457 穀梁(gǔ liáng)\n- [ ] 466 段干(duàn gān)\n- [ ] 467 百里(bǎi lǐ)\n- [ ] 468 东郭(dōng guō)\n- [ ] 469 南门(nán mén)\n- [ ] 470 呼延(hū yán)\n- [ ] 473 羊舌(yáng shé)\n- [ ] 474 微生(wēi shēng)\n- [ ] 483 梁丘(liáng qiū)\n- [ ] 484 左丘(zuǒ qiū)\n- [ ] 485 东门(dōng mén)\n- [ ] 486 西门(xī mén)\n- [ ] 493 南宫(nán gōng)\n- [ ] 502 第五(dì wǔ)\n\n## 百家姓终\n\n## 未收录与百家姓中\n- [x] [植(zhí)](https://baike.baidu.com/item/植姓/9438660)\n- [x] [普(pǔ)](https://baike.baidu.com/item/普姓/9906793)\n- [x] [佳(jiā)](https://baike.baidu.com/item/佳姓/9648996)\n- [x] [揣(chuǎi)](https://baike.baidu.com/item/揣姓)\n- [x] [茆(máo)](https://baike.baidu.com/item/茆姓)\n- [x] [侍(shì)](https://baike.baidu.com/item/侍姓)\n- [x] [玉(yù)](https://baike.baidu.com/item/玉姓)\n- [x] [袭(xi)](https://baike.baidu.com/item/袭姓)\n\n# 备注\n\n> 《通志·氏族略》有一说法是 [443 仉(zhǎng)](https://zh.wikipedia.org/wiki/%E4%BB%89%E5%A7%93)与 [444 督(dū)](https://zh.m.wikipedia.org/wiki/%E7%9D%A3%E5%A7%93) 二个姓原是“仉督”这个复姓,但今已无此复姓。\n\n> [84 傅](https://zh.wikipedia.org/wiki/%E5%82%85%E5%A7%93) 简化成了 付\n\n# 参考\n\n- https://zh.wikipedia.org/wiki/百家姓\n- http://114.xixik.com/baijiaxing/\n"},{"title":"需求与过度设计","url":"/posts/5c9c0e4c/","content":"\n# 疫情下的责任与义务\n\n> 人啊 都要为自己想做的事情奋斗一下 不然之后想起来 可能会后悔莫及且更加后悔\n\n# 取东西\n\n## 设定\n\n把一片土地围起来\n\n再分成几大不通的区域\n\n每个区域有一个入口\n\n区域内的人不能出来\n\n外面的人进了这片土地也不能出去\n\n区域内的可以把待取的东西登记到工作人员给的纸张上\n\n再由他们同一取\n\n## 问题点\n\n用纸登记起来太麻烦 需要填写 货物类型 手机尾号 自己所在的区域\n\n工作人员要定期巡查 看有没有达到一定的量 再一起去取回来放到区域\n\n区域内的再等待他们回来后再自己寻找自己的物品\n\n## 解决方案\n\n有一款在线登记软件\n\n用户选择区域填写后\n\n工作人员那边收到通知\n\n取货后用户这边也会收到通知\n\n然后下来拿货即可\n\n## 现有解决方案\n\n设定改为配送员可以进出\n\n再给每个区域放一个货物架\n\n再由土地外的配送员直接进来把货物放到指定的货物架\n\n"},{"title":"蓝牙鼠标","url":"/posts/f03cd66b/","content":"\n# 前言\n\n> 切换双系统时不用重新配对蓝牙鼠标 当然 最简单的是买一个支持此功能的鼠标\n\n> 正常情况下 重启电脑的次数不多\n\n# 步骤\n\n## 在 `linux` 中连接鼠标\n\n![已经配置好了 所以和 `win` 显示的地址相同](linux_connect.png)\n\n假设此处显示的地址为 `2B:B4:8D:52:7B:EC`\n\n## `win` 下连接鼠标\n\n### 用设备管理器查看鼠标 `MAC`\n![](win_connect.png)\n`c397369c4843` 就是鼠标的 `MAC` 地址\n\n### 下载 `psexec`\n\n- https://learn.microsoft.com/zh-cn/sysinternals/downloads/psexec\n\n> 此处所需注册表权限 正常途径打开看不到蓝牙相关信息\n\n### 使用 `psexec` 打开 `regedit` 注册表\n\n![](psexec_regedit.png)\n\n进入 `HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\BTHPORT\\Parameters\\Keys`\n\n在目录中寻找鼠标 `MAC` 地址 `c397369c4843`\n\n![](psexec_regedit_mouse.png)\n\n截图并记录其中的\n\n- `EDIV` = `39160`\n- `ERand` = `11022681155342728302`\n- `LTK` = `cf 37 0f d5 d8 68 8d ce 89 44 8b 20 bf 0a 4b 71`\n\n## 重启到 `linux`\n关闭蓝牙\n\n进入 `/var/lib/bluetooth/${硬件蓝牙MAC}` 目录\n\n重命名 `${linux 鼠标MAC 2B:B4:8D:52:7B:EC}` 为 `${win 鼠标MAC C3:97:36:9C:48:43}`\n\n进入 `${win 鼠标MAC C3:97:36:9C:48:43}` 目录\n\n编辑 `info` 文件中的 `LongTermKey` 块\n\n### 源\n```\n[LongTermKey]\nKey=7B4C2B57D8BD9D814B0F8E77DA542378\nAuthenticated=0\nEncSize=16\nEDiv=17867\nRand=9467824016339893520\n```\n\n### 修改后\n\n- `Key` 对应 `LTK` 需 删除空格 转为 大写\n- `EDiv` 对应 `EDIV` 10进制 位数可能不同\n- `ERand` 对应 `Rand` 10进制 位数可能不同\n\n```\n[LongTermKey]\nKey=CF370FD5D8688DCE89448B20BF0A4B71\nAuthenticated=0\nEncSize=16\nEDiv=39160\nRand=11022681155342728302\n```\n\n重启蓝牙服务 `systemctl restart bluetooth`\n\n## 完成\n\n- 不出意外的话 鼠标应该连接正常了\n- 可以再重启到 `win` 试下\n\n# 常见错误\n## `psexec` 找不到网络名\n![](psexec_regedit_error_admin$.png)\n\n### 原因\n因为关闭了 `ADMIN$` 共享导致\n\n可以进入 `计算机管理` `共享` 中查看 是否有 `ADMIN$` 共享\n![](share_admin$.png)\n\n### 解决方案\n\n以 `管理员` 运行 `regedit`\n\n进入 `HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\lanmanserver\\parameters`\n新增或修改 `AutoShareWks` 和 `AutoShareServer` 格式为 `REG_DWORD` 赋值 `1`\n\n进入 `HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa`\n新增或修改 `restrictanonymous` 格式为 `REG_DWORD` 赋值 `1`\n\n重启电脑\n\n`psexec`运行完成后可以考虑反方向操作再给关闭 `ADMIN$` 共享\n\n# 参考地址\n- https://zhuanlan.zhihu.com/p/466962255\n- https://blog.csdn.net/weixin_34235457/article/details/91585503\n- https://wiki.archlinux.org/title/Bluetooth#Dual_boot_pairing\n"},{"title":"grpc","url":"/posts/2b44e58c/","content":"\n> 兴趣是最大的老师 努力作的项目也是\n\n# 初识\n\n- 它是 `google` 的产物\n- 她和`restful`有这天壤地别\n- 存在`服务端`与`客户端`\n- 有着 `json rpc` 等变种\n- 基于 `http/2` 实现\n\n# 初探\n\n- 用 `proto` 文件作为 `沟通的桥梁`\n- 可以用 `protoc` 生成指定语言的 `插件包`\n\n# 初试\n\n## 以 `nestjs` 实现 服务端 客户端\n\n- https://docs.nestjs.com/microservices/grpc\n- https://github.com/nestjs/nest/blob/master/sample/04-grpc/\n\n### 服务端\n\n### 客户端\n\n## 以 `xray` 为目标 以 `nestjs` 入手\n\n- todo\n\n### 获取 `xray` 源码\n\n```sh\ngit clone --depth 1 https://github.com/XTLS/Xray-core.git\n```\n\n### 安装编译工具\n\n```sh\n# arch\npacman -S protoc\n```\n\n```sh\nyarn global add protoc-gen-ts\n```\n\n### 编译 `proto` 生成 `扩展` 文件\n\n> 可能会有错误 具体讨论\n\n```sh\nprotoc -I=./Xray-core --ts_out=./Xray-core_ts ./**/*.proto\n```\n\n# 备注\n\n## `@grpc/proto-loader` 与 `有行为grpc.load` 的 不太一样\n\n这导致的结果就是 `nestjs` 中的 `proto` `message` 带有 `_` 的变量会直接忽略掉\n\n![文档 warning](nestjs_grpc_client_warning.png)\n\n- https://docs.nestjs.com/microservices/grpc#client\n- https://github.com/grpc/grpc-node/blob/master/packages/proto-loader/README.md\n\n# Q&A\n\n## `grpc` 和 `web server` 能不能运行在同一端口\n\n![伟大的 chat gpt 说可以 我还在尝试](qa_1.png)\n\n# 参考\n\n- https://taoshu.in/grpc.html\n- https://so1n.me/2022/01/05/Python-gRPC实践(1)--简介/\n"},{"title":"grub 丢失","url":"/posts/94b75c41/","content":"\n# 前言\n\n双系统的话 更新 或者 `bios` 升级等\n\n都概率丢失 `grub` 引导\n\n路径地址等 以实际为准\n\n以下 `cmd` 以管理员身份运行\n\n\n# 解决方案\n\n## 当 `grub` 还存在 `efi` 分区时\n\n- 查看当前默认引导\n\n`C:\\Windows\\system32>bcdedit.exe`\n\n```cmd\nWindows 启动管理器\n--------------------\n标识符 {bootmgr}\ndevice partition=\\Device\\HarddiskVolume1\npath \\EFI\\Microsoft\\Boot\\bootmgfw.efi\ndescription Windows Boot Manager\nlocale zh-CN\ninherit {globalsettings}\ndefault {current}\nresumeobject {0000000-0000-0000-0000-00000000000}\ndisplayorder {current}\ntoolsdisplayorder {memdiag}\ntimeout 30\n\nWindows 启动加载器\n-------------------\n标识符 {current}\ndevice partition=C:\npath \\Windows\\system32\\winload.efi\ndescription Windows 11\nlocale zh-CN\ninherit {bootloadersettings}\nisolatedcontext Yes\nallowedinmemorysettings 0x15000075\nosdevice partition=C:\nsystemroot \\Windows\nresumeobject {0000000-0000-0000-0000-00000000000}\nnx OptIn\nbootmenupolicy Standard\n```\n\n- 更改当前 `win11` 引导为 `grub`\n\n`C:\\Windows\\system32>bcdedit.exe /set {bootmgr} path \\EFI\\Arch\\grubx64.efi`\n\n```cmd\nWindows 启动管理器\n--------------------\n标识符 {bootmgr}\ndevice partition=\\Device\\HarddiskVolume1\npath \\EFI\\Arch\\grubx64.efi\ndescription Windows Boot Manager\nlocale zh-CN\ninherit {globalsettings}\ndefault {current}\nresumeobject {0000000-0000-0000-0000-00000000000}\ndisplayorder {current}\ntoolsdisplayorder {memdiag}\ntimeout 30\n\nWindows 启动加载器\n-------------------\n标识符 {current}\ndevice partition=C:\npath \\Windows\\system32\\winload.efi\ndescription Windows 11\nlocale zh-CN\ninherit {bootloadersettings}\nisolatedcontext Yes\nallowedinmemorysettings 0x15000075\nosdevice partition=C:\nsystemroot \\Windows\nresumeobject {0000000-0000-0000-0000-00000000000}\nnx OptIn\nbootmenupolicy Standard\n```\n\n重启后 `grub` 也就出来了\n这时候 其实也可以正常用的\n不过有时候 `grub` 配置更新挂掉了的话 `win` 引导也会有问题\n\n- 重启到 `linux` 修复引导\n\n```sh\ngrub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=Arch\nupdate-grub\n```\n- 进入 `bios` 修改默认启动顺序\n\n- 回到 `win11` 删除`gurb`引导\n\n`C:\\Windows\\system32>bcdedit.exe /set {bootmgr} path \\EFI\\Microsoft\\Boot\\bootmgfw.efi`\n\n- 修改完成\n\n## 采用 `u盘` 启动 `linux` 重建引导\n\n- 待完善\n\n# 参考地址\n- https://www.myfreax.com/no-grub-windows-linux/\n\n\n"},{"title":"git","url":"/posts/518e617c/","content":"\n不得不说 这玩意确实强大 感谢 `作者`\n\n# 浅克隆后\n\n## 完成克隆\n\n```sh\ngit fetch --unshallow\ngit config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'\n```\n\n## 取回所有分支\n\n```sh\ngit fetch --tags\n```\n\n\n# 包 `bundle`\n\n## 打包\n\n```sh\ngit bundle create name.bundle master\n```\n\n## 解包\n\n```sh\ngit clone --depth 1 ./name.bundle -b master\n```\n\n# 服务器\n\n## 开启\n\n```sh\ngit daemon --verbose --export-all --base-path=.\n```\n\n## 使用\n\n```sh\ngit clone git://ip/name\n```\n\n"},{"title":"医院科室","url":"/posts/54cc358c/","content":"\n# 心电图\n> 多通道\n\n- `12导` 常见\n- `15导` 常见\n- `18导` 急诊科常见\n\n# 化验科\n## 抽血\n- 大多需要空腹\n\n# 中医\n## 把脉\n- 人六脉 就怕不一样快\n\n# 体检科\n> 存在外包情况\n\n## 入职体检\n- `乙肝两对半` `艾滋` 不能与 `入职体检` 开在一起\n\n## 妇科检查\n- 未有`夫妻之实`不检\n"},{"title":"招呼","url":"/posts/d80ce8ad/","content":"\n# 序\n\n与人打交道\n\n难免就出现了`称呼`\n\n是啊\n\n难吗\n\n难啊\n\n# `师傅`\n\n要说起这个\n\n好像 都可以这么叫\n\n不过通常 大概率不会出现什么问题\n\n# `老师`\n\n对啊 `老师`\n\n凡是对自己有帮助的 都可以这么称呼\n\n我印象中 在 `医院` 见到的多\n\n# `[姓]职位`\n\n没这么称呼过\n\n可能 不太熟\n\n又或者 叫不出口\n\n再可能 存在这某些渊源\n\n# `[名]姐/哥`\n\n啊\n\n好像 我没这么称呼过\n\n# `[名]啊/呀/呢/哈`\n\n恩 想想\n\n符合我的习惯\n\n可是 好像又不太那么的那啥\n\n# 待定"},{"title":"实施工程师","url":"/posts/c6f1cc08/","content":"\n# 开始\n\n出去后\n\n我所代表的\n\n便是我身后的公司\n\n多么直白且实际的领悟\n\n# 问题\n\n- 记不住 `人名`\n- 容易遗忘 `人脸`\n- 脑袋记不住 `下一步`\n\n# 然后嘛\n\n- 和甲方沟通沟通需求并引导至现有功能\n- 催催开发功能\n- 跟进下第三方进度\n- 解决下现场意外问题\n- 调试下相关设备\n- 美好的一天 就这么结束啦\n\n# 再然后\n\n- 用户体验和项目交付的比重\n- 重复且无奈的数据维护\n- 现有使用习惯的更改\n"},{"title":"adb","url":"/posts/1479d6d2/","content":"\n> 当年的搞机经验随着安卓大版本的更新加上又不关注而出现了错误\n\n# 无线调试\n\n- https://developer.android.com/studio/command-line/adb?hl=zh-cn\n- https://zhuanlan.zhihu.com/p/336660319\n- https://github.com/mzlogin/awesome-adb\n\n## 安卓 `10` 以上\n\n出现了 `匹配码`\n\n- `adb pair device_ip_address:port-for-pair`\n- `adb connect device_ip_address:port-for-connect`\n\n## 安卓 `10` 以下\n\n- `adb connect device_ip_address:5555`\n\n## 常见问题\n\n### `failed to connect to device_ip_address:port`\n\n- 内网是否互通\n- 是否先连接了`匹配码`\n\n# 屏幕旋转\n- https://blog.csdn.net/jlgcumt/article/details/112955092\n- https://blog.csdn.net/mo_daizi/article/details/119210267\n\n## 禁用\n- `adb shell content insert --uri content://settings/system --bind name:s:accelerometer_rotation --bind value:i:0`\n\n## 横向\n- `adb shell content insert --uri content://settings/system --bind name:s:user_rotation --bind value:i:1`\n- `adb shell settings put system user_rotation 1`\n\n## 纵向\n- `adb shell content insert --uri content://settings/system --bind name:s:user_rotation --bind value:i:0`\n- `adb shell settings put system user_rotation 0`\n\n# 电视\n\n## tcl\n- https://zhuanlan.zhihu.com/p/349017479\n\n### 开启`adb`安装应用权限\n\n`install apk has be disabled from pm by system default!`\n\n```sh\nadb shell setprop persist.tcl.debug.installapk 1\nadb shell setprop persist.tcl.installapk.enable 1\n```","tags":["android"]},{"title":"soul","url":"/posts/d09fcb3/","content":"\n> I see you everyday\n每天见到你的时候\nDreaming about the things that I would say\n一直梦想着能跟你吐露真心\nTuesday when you looked my way\n周二那天 所幸你望了我一眼\n\n# 一些地址\n- `https://w3.soulapp.cn/activity/#/web/user?targetUserIdEcpt=${UserIdEcpt}` 个人主页\n- `https://app.soulapp.cn/app/#/interest/` 测试页面\n- `https://app.soulapp.cn/avator/#/avatar/create?sex=${sex}` 捏脸 `sex` `0` 女 `1` 男\n\n# 聊天记录\n\n## 开局\n\n- 一个 `root` 安卓手机 或者 `soul` 备份\n\n## 记录文件\n\n- `/data/data/cn.soulapp.android/files/easemobDB/${uid}.db` `新版好像放弃了`\n- `/data/data/cn.soulapp.android/files/objectbox/${uid}db/data.mdb`\n\n- `uid` 是自己帐号ID\n\n## 使用\n\n### `.db`\n\n- 采用 `sqlite3` 储存\n\n### `.mdb`\n\n- 采用 `objectbox` 储存\n\n研究中\n\n# 参考地址\n- https://github.com/search?p=1&q=soulapp.cn&type=Code\n- https://blog.csdn.net/github_39312212/article/details/122985388","tags":["soul"]},{"title":"那多次的互联网入坑指南","url":"/posts/c21a6d6d/","content":"\n# 开坑\n\n啊\n\n回忆起那时候的互联网\n\n纯白 无暇\n\n到现在的\n\n因为哦现却又必然的原因\n\n我觉得得用魔法才能打败魔法\n\n# 新建文件夹\n\n首先呢\n\n想一个不错的模式\n\n然后把大家拢起来\n\n毕竟\n\n让大家说比自己说方便多了\n\n再者\n\n加入熟悉的味道\n\n我想 应该就成了\n\n# 模式\n\n现有能想到的\n\n- __融资\n- __拉人头\n"},{"title":"人啊 是不能","url":"/posts/6b26e829/","content":"\n# 人啊 是不能闲着的\n\n闲着\n\n就容易怀疑自己\n\n产生自我否定的念想\n\n从而怀疑自己存在的意义\n\n再到思考生存的价值\n\n# 人啊 是不能穷着的\n\n穷着\n\n就觉得干啥啥不顺\n\n想干啥都得思考自己腰包够不够\n\n再到遇到什么小恩小惠就变得患得患失\n\n再来点什么外人一眼看出不对的项目\n\n自己便一身投入进去\n\n想着帮助别人来获得自己的大饼\n\n好像问题也不算那么大\n\n毕竟\n\n人嘛 得有个目标\n\n想着能获得这项目的钱也不错呀\n\n毕竟 穷怕了\n\n# 人啊 是不能饿着的\n\n饿着\n\n饿着\n\n饿着\n\n那就啥都干不了\n\n不过\n\n在目前的这个生存环境下\n\n饿亡的概率应该不大\n\n# 人啊 是不能气着的\n\n气啊\n\n生气啊\n\n都说这是用他人的过错来惩罚自己\n\n可惜这\n\n还有属于委屈的情况呢\n\n越想越气\n\n这惹我生气的人\n\n我得想点什么有趣的点子来祝福你呢\n\n# 人啊 是不能委屈着的\n\n委屈啊\n\n难过啊\n\n心塞啊\n\n心痛啊\n\n痛哭啊\n\n啊\n\n都是特别的情感\n\n至于其他动物有没有\n\n我没搜索和研究过\n\n不过\n\n我觉得狗可能有高兴和难过与生气的情感吧\n\n毕竟\n\n对\n\n毕竟\n\n# 人啊 是不能熬夜的\n\n熬夜\n\n在这夜深人静鸡犬安宁的时刻\n\n最适合反思自己了\n\n莫非这\n\n> 生前何必久睡\n\n带来的特别觉悟吗\n\n# 人啊 是不能堕落的\n\n堕落\n\n堕落\n\n还好\n\n没到坠落\n\n虽然吧 意思相差一大截\n\n可是呢 当成速度单位就行\n\n可能\n\n最后自己的脑中都能整一场大戏\n\n# 人啊 是不能整那种看不到正向反馈的\n\n正向反馈\n\n听起来多么美好\n\n毕竟作为一个群居动物\n\n而且这个自我肯定的能力又被磨完了\n\n那听点肯定自己价值的 多好\n\n# 人啊 是不能困了不睡的\n\n为了自己后代的健康\n\n为了黑发人与白发人\n\n为了爱自己的人\n\n为了双向奔放的人\n\n啊 加油\n\n# 人啊"},{"title":"记账 努力code中","url":"/posts/815dbb58/","content":"\n# 前记\n\n啊 时至今日\n\n还依稀记得网易有钱关闭的那时候\n\n我依稀记得那时候说要整个记账软件\n\n到了昨天晚上\n\n不容易的我终于决定新建文件夹了\n\n 访问后\n\n发现仓库是 `2020-12-25` 创建的\n\n不能鸽了呀\n\n# 新建文件夹\n\n回想起之前想到 `记账` 的点点滴滴\n\n已经忘记的差不多了\n\n想起来了那 `张大教主在学习师傅的太极剑后师傅说道`\n\n> 不怕不怕 忘的真快\n\n那就重新搜索下\n\n结果 发现了\n\n\n\n看了看设计的 `UI`\n\n真好看\n\n\n\n进去后发现 已经点过赞了 。。。\n\n既然如此\n\n拿我决定拿出我那`不堪入目`的 `css` 本领去仿制下\n\n# 后端思路\n\n## 复式记账\n\n一定得是`复式`\n\n为啥对这个印象这么深刻\n\n我迷迷糊糊记得 当时设计这个的时候\n\n搜索到了\n\n> 有借必有贷 借贷必相等\n\n然后 查了半天的资料\n\n发现 `借 和 贷` 按 `名词` 就可以理解\n\n如果按照`动词` 那确实和我之前的 `流水帐` 不一样\n\n啊西吧\n\n者该死的`先入者观念`\n\n# todo\n我想起来了那个 `吐泡泡的鱼`"},{"title":"倚天屠龙记 观后感 未完待续","url":"/posts/217512ca/","content":"\n# 缘起\n\n搜索 一夫多妻 制时 看到了这个答案 便想着去追一波\n\n> 张无忌的名字叫无忌,他也的确有横行无忌的本领和地位,然而他这辈子并没有做什么横行无忌的事.\n> 这里许许多多人,一齐上山来逼死了你爹爹。你别心急报仇,要慢慢的等着,只是一个也别放过。\n\n[为什么张无忌不能同时把那么多女孩都给收了? 又不是只能一夫一妻? - 亦知墨的回答 - 知乎](https://www.zhihu.com/question/35066599/answer/138106091)\n\n# 版本\n\n## 2003 苏有朋 贾静雯\n\n最开始看的便是这一版 可能因为这评分高吧\n\n> 吃苦受累释小龙 左拥右抱苏有朋\n\n这版里有两人儿时相遇情景 `坏人`\n\n## 2009 曾舜晞 陈钰琪\n\n想着 新出的 那特效应该不错 结果嘛 确实不错 尤其是慢动作的加入 留给观众无限的思考时间\n\n没记错的话 把后续那部分用了将近10集描述了下 张大教主部下的故事\n\n期间`范遥`劫刑场\n\n不过最后这个`手帕`作用真的大\n\n## 2001 吴启华 黎姿\n\n这里 晓得了 `他俩原来是互相抢亲的`\n\n再者 `殷梨亭` 的故事\n\n不过 打耳光那时候 哎呀 心疼 这大猪蹄子\n\n`阿大` 没了\n\n## 2009 邓超 安以轩\n\n这里 了解到了 原来作者写书的时候 是改过剧情的\n\n最开始的 `2003` 是最理想化的版本\n\n最后`赵敏和周芷若都用了愿望这个说法`\n\n场景复用不错\n\n## 1994 马景涛 叶童\n\n追剧中...\n\n# 剧情\n\n## 两人掉陷阱\n\n记忆深刻的 就这部分\n\n不同的版本 去的人都不同\n\n同样的中毒方式\n\n不同的展现手法\n\n其中 `2009` 这里展现最为有趣\n\n# 其他\n\n## 敢爱敢恨\n\n看完后 我一直都在思考这个问题\n\n敢爱敢恨是啥\n\n一个是明教教主 一个汝阳王之女\n\n后续想到他们的对话\n\n> 大胆妖女 跟着张无忌这淫贼造反作乱 该当何罪\n> 那罚你二人在世上做对快活夫妻 白头偕老 死后打入十八层地狱 永世不得超生\n\n好吧 我可能理解了那么一丢丢\n\n# 待续\n"},{"title":"Redmi Book Pro 2022 锐龙版 相关","url":"/posts/8e1b1957/","content":"\n# 前言\n> 以 为准\n> 也可以自己编译内核 如 [archlinux_build_kernel](https://github.com/puzzle9/archlinux_build_kernel/)\n\n# 内存问题\n> 内存持续升高 按照运行进程查看是正常的\n\n- https://unix.stackexchange.com/questions/637325/very-high-memory-usage-with-nothing-running\n- https://wiki.archlinux.org/title/Tmpfs\n\n\n以下 只适用于 `manjaro-gnome-21.3.2-220704-linux515`\n\n\n# 键盘\n```sh\nsduo pacman -S make acpica dmidecode cpio\n\ngit clone https://github.com/puzzle9/modern_laptop_manjaro\ncd modern_laptop\n\nsduo sh configure.sh\nsduo make install\nsduo make grub \nsduo make redmibook_wmi \n```\n\n# wifi / 蓝牙 `lwfinger`\n\n> 可以考虑换成 `ax210 003` 就变得简单许多了\n\n> 采用 `rtw8852be` 网卡时\n\n```sh\nsduo pacman -S linux515-headers\n```\n\n## wifi\n```sh\ngit clone git@github.com:lwfinger/rtw8852be.git\ncd rtw8852be\nmake -j8\nsduo make install\n```\n\n## 蓝牙 (暂无效)\n- \n```sh\ngit clone git@github.com:lwfinger/rtw89-BT.git\ncd rtw89-BT\nmake -j8\nsduo make install\n```\n\n# 结束\n- 重启一下试试 不出意外 完结散花\n\n# 参考\n- \n- \n\n## wifi / 蓝牙 `lwfinger`\n- \n- \n\n## wifi / 蓝牙 `lwfinger` (待尝试)\n- \n- \n\n## 内核直接修改键盘这部分问题 好吧 包没了\n- https://aur.archlinux.org/cgit/aur.git/tree/?h=linux-zen-irq1-edge-low-shared"},{"title":"Linux Firewall 防火墙","url":"/posts/6b4ea6a9/","content":"\n# 前言\n\n> 在各大主机厂商不懈努力与我们人类以栏作为动力的前提下 这个原生防火墙就变得薄弱起来了\n\n防火墙 按程序字面意思理解就是 规定什么样的数据可以出去 可以进来\n\n目前采用的是 `iptables` 和 `firewall`\n\n然后嘛 由于我觉得我学习 `iptables` 太过于有难度 便 采用了 `firewall`了\n\n当然 这两个是互斥的 都算是封装了命令行 然后交给`内核中的netfilter`去负责了\n\n# 安装\n\n## debian 11\n\n```\napt install firewalld\n```\n\n# 使用\n\n他有好几个区域 咱们默认以 `public` 区域开始\n\n善用 `tab` 键\n\n大概主要是这几个大模块 按字面意思晓得就成\n\n```sh\nfirewall-cmd --add\nfirewall-cmd --change\nfirewall-cmd --get\nfirewall-cmd --info\nfirewall-cmd --list\nfirewall-cmd --query\nfirewall-cmd --remove\n\n# 保存 没有此参数 reload 后失效\nfirewall-cmd --permanent\n# 重新载入配置 每次修改后运行后才会生效\nfirewall-cmd --reload\n# 重启配置 断开已有连接重开\nfirewall-cmd --complete-reload\n```\n\n### 获取当前的配置\n\n```sh\nroot@test:~# firewall-cmd --list-all\n# 区域名称\npublic\n target: default\n icmp-block-inversion: no\n interfaces:\n # 区域 根据不同的区域可以设定 访问 丢弃 等\n sources:\n # 可以访问的服务\n services: dhcpv6-client ssh\n # 可以访问的端口\n ports:\n protocols:\n forward: no\n masquerade: no\n forward-ports:\n source-ports:\n icmp-blocks:\n # 复杂的规则 注意别和 白名单 冲突\n rich rules:\n```\n\n### 服务\n\n```sh\n# 可设置服务列表\nfirewall-cmd --get-services\n# 开始让 https 服务对外服务\nfirewall-cmd --permanent --zone=public --add-service=https\n# 停止让 https 服务对外服务\nfirewall-cmd --permanent --zone=public --remove-service=https\n```\n\n### 端口\n\n```sh\n# 查询80 tcp 端口是否对外开放\nfirewall-cmd --zone=public --query-port=80/tcp\n# 开始让 80 tcp 端口对外服务\nfirewall-cmd --permanent --zone=public --add-port=80/tcp\n# 停止让 80 tcp 端口对外服务\nfirewall-cmd --permanent --zone=public --remove-port=80/tcp\n```\n\n### 区域 (Zone)\n\n> 每个区域对于这种 进出 都有不同的行为\n\n> 源 IP/网段 网卡 等 没关联的 就会进入 默认区域 public (匹配规则)\n\n```sh\n# 把 ip 加到 trusted 区域 白名单\nfirewall-cmd --permanent --zone=trusted --add-source=ip\n# 把 ip 移除 trusted 区域 白名单\nfirewall-cmd --permanent --zone=trusted --remove-source=ip\n\n# 把 ip 加到 drop 区域 拉黑\nfirewall-cmd --permanent --zone=drop --add-source=ip\n# 把 ip 移除 drop 区域 拉黑\nfirewall-cmd --permanent --zone=drop --remove-source=ip\n```\n\n#### 常用区域\n\n- `public` 公共区域 默认访问的这个区域\n- `block` 阻塞区域 全权拒绝 并 告知对方 我拒绝了\n- `drop` 丢弃区域 全权拒绝\n- `trusted` 信任区域 全权接受\n\n### ping icmp协议\n\n```sh\n# 开启 ping\nfirewall-cmd --permanent --zone=public --remove-icmp-block-inversion\n# 禁止 ping\nfirewall-cmd --permanent --zone=public --add-icmp-block-inversion\n```\n\n# 参考\n\n- \n- \n- \n- \n- \n- \n- \n- \n- \n","tags":["linux"],"categories":["安全"]},{"title":"linux 设置 私钥 登录","url":"/posts/6d30f440/","content":"\n# 开始\n\n## 生成证书文件\n\n> 建议服务端执行\n\n- 路径填写为 `/root/.ssh/certificate`\n\n```sh\nroot@test:~# ssh-keygen -m pem -t rsa -b 2048\nGenerating public/private rsa key pair.\nEnter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/certificate\nEnter passphrase (empty for no passphrase):\nEnter same passphrase again:\nYour identification has been saved in /root/.ssh/certificate\nYour public key has been saved in /root/.ssh/certificate.pub\nThe key fingerprint is:\nSHA256:gIBHeMyAlD66hhgo8daRjSxw0KTmAy/P9z3R+HHauS0 root@puzzl74364\nThe key's randomart image is:\n+---[RSA 2048]----+\n|=%= |\n|=oB. . |\n|+* ..+. |\n|=+. = .. |\n|+=oo . So |\n|=++ . o o . |\n|++o . o = . |\n|+. . . .. o E. |\n|. . .. .o. |\n+----[SHA256]-----+\n```\n\n### 新版会生成 `openssh` 证书 个别不支持 所以加入了 ` -m pem -t rsa -b 2048` 参数\n- https://stackoverflow.com/questions/54994641/openssh-private-key-to-rsa-private-key\n- https://stackoverflow.com/questions/66234349/convert-rsa-to-openssh\n\n\n# 复制证书文件到本地\n\n`/root/.ssh` 目录中应该生成了 `certificate` 和 `certificate.pub` 这两文件\n\n其中 `certificate` 就是咱们等哈要用到的证书 咱们先剪贴到本地保存起来\n\n再把 `certificate.pub` 重命名成 `authorized_keys`\n\n```sh\nmv certificate.pub authorized_keys\n```\n\n# 配置服务端在证书\n\n打开 `/etc/ssh/sshd_config` 文件\n\n找到这 `PubkeyAuthentication` 与 `AuthorizedKeysFile` 这两行 去掉前面的注释\n\n## 含义\n\n- `PubkeyAuthentication` 是否打开证书验证\n- `AuthorizedKeysFile` 证书验证文件 采用登录用户目录下 `.ssh/authorized_keys` 和 `.ssh/authorized_keys2` 进行验证, 我们登录的 `root` 账户的话 就在 `/root/.ssh/authorized_keys` 这个路径查找证书,如果是其他账户 就在 `/home/账户名/.ssh/authorized_keys` 这个路径下查找证书进行验证,可以添加多个路径并用 `空格` 隔开,这样就有了多私钥可以用于登录了.\n\n## 修改前\n\n```\n#PubkeyAuthentication yes\n#AuthorizedKeysFile\t.ssh/authorized_keys .ssh/authorized_keys2\n```\n\n## 修改后\n\n```\nPubkeyAuthentication yes\nAuthorizedKeysFile\t.ssh/authorized_keys .ssh/authorized_keys2\n```\n\n## 验证是否修改成功\n\n重启 `ssh` 守护进程\n\n```sh\nsystemctl restart sshd\n```\n\n采用刚剪贴到本地的证书在打开新窗口的情况下进行登录\n\n```sh\nssh -i ./certificate root@host\n```\n\n不出意外的话 这就登录成功了\n\n# 其他操作\n\n## 关闭密码登录\n\n`/etc/ssh/sshd_config` 文件中\n\n### `PasswordAuthentication`\n\n- `yes` 采用密码验证 默认 未出现此字段或注释\n- `no` 关闭密码验证\n\n```\nPasswordAuthentication no\n```\n\n## 更改`ssh`端口号\n\n```\nPort 22\n```\n\n# 参考地址\n\n- \n- \n","tags":["linux"],"categories":["安全"]},{"title":"css 学习 / 思考","url":"/posts/190a2cef/","content":"\n# 起\n\n那啥 `css` 嘛\n\n熟称`嫁衣`\n\n没有也还行\n\n# 写了一丢丢和看了快3年的css感悟\n\n- `给出怼 绝对定位 style 啥的 样式出来了就行`\n\n\n\n\n\n","tags":["study"]},{"title":"那刻爱情","url":"/posts/1e0c6aa8/","content":"\n# 序\n\n自打那天在电梯里见到你的那刻起\n\n我好像一见钟情了\n\n这是源于一个人生活太久了吗\n\n还是说\n\n体内流传了上万年的基因\n\n在这一刻显现了\n\n讲真 娃的名字我都想好了\n\n就叫 ~顾星辰~ 吧\n\n# 缘起\n\n自从那次后\n\n我每天都在努力的装做在电梯中偶然相遇\n\n与此同时\n\n我还在这相遇你的地方 打探这你的消息\n\n皇天不负有心人\n\n终于 \n\n大概晓得了你的工作规律\n\n晓得了每天乘坐电梯的时间\n\n是在上班来的那一刻\n\n在`偶然`的机会下 晓得了你的`名字`\n\n可 这个姓 想了想 却不曾见过\n\n可能 这是上天的特意的安排\n\n为了让我多认识不同的 `汉字`\n\n可是 然后呢\n\n胆小如鼠的我 却不敢卖出那么一步\n\n~再然后呢 荒废吗 不 我觉得不是~\n\n# 加缘\n\n机智的我\n\n想起来了\n\n我的朋友的 `反向版本`\n\n> 我喜欢你的一个朋友\n\n天哪 聪明的我竟然在那刻变得愚笨起来\n\n导致这话在另一个`反向版本`才想到 好在用到了\n\n# 强行加缘\n\n上次说`缘起`嘛\n\n很简单\n\n当看到一个心动的姑娘时\n\n对于自己这种`老实`的性格\n\n就会开始思考自己的不足以及对方对自己的看法和自己配不上对方的自卑\n\n这时候\n\n身体为了体验上万年的进化而让基因遗传下去而加速心跳\n\n怎么说呢 到100+那是常有的事情\n\n我想 这是为了维持大脑的高速思维\n\n再者 加上脸红\n\n不过这种技能大家都大多数再大学后就遗失了\n\n皇天不负有心人\n\n机智的我发现今天一上午都没见到她\n\n于是我决定去门口看看\n\n天哪\n\n是她 就是她 真的是她\n\n她再守门\n\n我算了下人流量 看了下时间\n\n距离她下班还有`3小时`\n\n这时候 `每3分钟`大概需要她起身开一次门\n\n她手头的制作膏药的工作`每1分钟`就完成一份\n\n再加上除去\n- `概率性`的进门 \n- `膏药` 完了后的进门 \n- `想起啥询问`的进门\n等等 等等后\n\n那我大概还有 `2个多小时`的时间\n\n可是 这该死的`拖延症`\n\n总是想着再最后\n\n她下班的时候询问\n\n毕竟明天 是自己离开的日子\n\n这样的话 产生的尴尬\n\n是可以随着时间的推移而被动化解的\n\n可是 看着她`那娄斜阳`(那撮头发) 是从额头上斜着下来的\n\n遮住那只能再正面看到那额头下的疙瘩\n\n后来 我晓得那个很神奇的是 那些顽强的疙瘩 个大概过了`2月` 还没下去\n\n看着那接近透明的耳朵\n\n又或者因为我的近视 而看成白的透明带点粉\n\n尤其是她头上那个与它人颜色不同而独一无二的粉色发卡\n\n再者是走路挺直了背的那种带来了一列微风\n\n\n\n又或者是那种 对待我们的眼中带的那种不屑\n\n我的语言不及她的十万分之二\n\n是那种出淤泥而不染的清纯 \n\n那种使用 `let me down slowly` 作为 手机铃声的人\n\n啊 好心动\n\n这真是个可爱的姑娘 得多关注关注\n\n想了这么多\n\n啊 我看她看的痴迷\n\n她在距离我不到8米的地方还在努力的制作膏药\n\n而我再距离她6.5到8米的地方 来回度步\n\n好在这个地方有3米左右宽\n\n以至于让别人觉得我不是关注她而是再做康复运动\n\n虽然这地方通常就两人 时不时有进去的 有出来的\n\n可是 我想 我这么渺小\n\n应该不会有人关注我的\n\n看了看时间 还有`一个小时`\n\n啊 不能再拖了\n\n不然 明天就见不到她了\n\n我心这么想着\n\n可是这个脚就不晓得怎么的使出了浑身泄数都给前挪动不了一步\n\n啊 我想这可能是我自己觉得我追不到吧\n\n而再内心产生了深深的自责\n\n转眼间 `半小时过去了`\n\n终于 我又想到了\n\n我可以采用`非目的性交友的询问方法`啊\n\n简单来说\n\n>是请教问题 而不是目的性很强的来询问联系方式 查户口等\n\n机智的我最终挪动了脚步在她面前趴着门选择了询问\n\n- 咱们给送礼物的多不多\n- 挺多的啊\n- 那费用大概咋样\n- 啊 有贵的有便宜的 门口那地方就有 可以选择下 你要送吗\n- 啊 我有这个想法 想来询问下你 我不知道写什么\n- 这样啊 就通常大家写的那种就行\n- 啊 好的 谢谢你 (脑子转不过来了 直接结束)\n\n再准备发动询问聊天方式的时候\n\n这时候 到开饭时间了\n\n大家都出来了\n\n当然 也到她下班时间了\n\n啊 这是第一次长时间的对话\n\n我想 这些就足够我开心好一会儿了\n\n既然这直接询问比较困难\n\n那就采用`反向版本`\n\n就像 `正向 反向 代理` 一样\n\n询问她同事她的基本信息\n\n天哪 我好聪明\n\n不过 还是得先吃饭去\n\n过了会\n\n我还在门口回味这时候\n\n注意到她换回了便装\n\n如同 `黑客帝国` 里面的`女主`的`黑大褂`一样\n\n天哪 很有气质的\n\n她还是很高的\n\n不过\n\n明天我就要离开了\n\n算算时间\n\n不晓得下次啥时候来\n\n那就先这样吧\n\n询问这个事情得碰时间和自己的运气\n\n不过神奇的是\n\n这么久 竟然没遇见她夜班\n\n# 反向版本\n\n今天\n\n是我离开的日子\n\n我想 这是我最后的机会了\n\n好在今天换了一个守门人\n\n我便询问此人\n\n她的信息\n\n结果他说 他不晓得\n\n因为她好像是最近才到这里来的\n\n不过再这之前\n\n她询问我了解这个干嘛\n\n我便又使出了脑细胞 想出了一个万能理由\n\n> 她扎针很特别 wow\n\n# 源破\n\n我承认\n\n我每当空闲的时候\n\n总会想起她的容貌\n\n我凭着现有的记忆 进行脑补\n\n想着这个 白里透粉的耳朵\n\n想着这个 特别的发卡\n\n还有额头下有没有消失的痘痘\n\n可是\n\n这么想也不是个办法啊\n\n在这个世界\n\n我不具备目测她人年龄的能力\n\n我的自卑又告诉我不能表现得太明显而产生让他人难受的事情\n\n我想\n\n我或许可以尝试忙起来\n\n而不想这个让我脑细胞加快死亡的事情\n\n# 好耶 又来了\n\n好耶 我又来了\n\n因为某种特别的原因\n\n我又来到了这里\n\n想着这2小时的车程\n\n我觉得是值得的\n\n这次 在这的时间概率和上次相同\n\n我想着 把这个`反向版本`落实到实处\n\n好在机会来了\n\n# 心火的道德\n\n>她娃都上幼儿园了\n\n???\n\n哈\n\n我不理解\n\n为什么会出现这种情况\n\n这是怎么一会事\n\n我不理解\n\n她明明看起来那么年轻\n\n为什么会已经这样呢\n\n继续采用上次的理由从她另一个同事哪里了解到了这么一句话\n\n我要做`曹操`吗\n\n我心中这时候满满的是 <红与黑> 中 的 `于连`\n\n可是他们是`彼此相爱`的啊\n\n从此\n\n我从原来再路上见到她的那种不敢直视眼睛 转为 现在的不敢直视\n\n我依旧感受到她的 风 她的 香水味\n\n我想 我是时候放弃这段缘分了\n\n转而祝福她开心快乐\n\n从此\n\n他们应该不会记得门口有一个装作在度步而想要她联系方式的人了\n\n对 他们不会在意的\n\n因为每个人都觉得自己在这里是不情愿的 且是最重要的\n\n而这又是个服务业\n\n所以\n\n我想 我理解\n\n毕竟 想了这么久 太损耗脑细胞了\n\n可是 我应该做点啥呢\n\n我不清楚\n\n再找个同事询问下是否属实\n\n我不敢 我怕这种结果\n\n啊 我为什么要询问这个事情\n\n为什么要自己找不痛快\n\n我就这样 \n\n陷入了深深的自责当中\n\n要说具体有啥体现\n\n我想 我变得有点颓废了\n\n而不喜欢这里了\n\n每天不再努力偶遇\n\n不再努力的想办法询问联系方式\n\n当然\n\n这些东西\n\n只有我自己一个人晓得\n\n一个人默默的承担\n\n啊 \n\n讲真的\n\n我不愿意你们体会这种感觉\n\n就这样 过了三四天吧\n\n我再思考\n\n我怎么变成这样了\n\n人生的目标不应该就这一个且定死\n\n这里还是有好多其他人的嘛\n\n总归是可以成为好朋友的嘛\n\n这时候\n\n爱是放手 喜欢是占有\n\n我想 我对这段话 \n\n又有了更深层次的认知了\n\n可以先听听 `let me down slowly` 再做做决定\n\n这首原唱是个男孩子 她那个手机铃声是女孩子的\n\n对于这个彩铃 这么久了\n\n大概不同的地方 有3个人是这个\n\n当然 调子也是相同的\n\n世界好小啊\n\n就这样 我度过了这次再这里的时光\n\n不过好像有她的新同事来了\n\n这真是个特别的事情\n\n看来\n\n又有小可爱们可以要体验社会的故事了\n\n# 待更\n- 偷懒中","categories":["Story"]},{"title":"php mysql 鸽","url":"/posts/ea63bc95/","content":"\n# mysql 分几组 每组查几条\n\n## 表结构 `users`\n\n|type|title|created_at|\n|:-:|:-:|:-:|\n|a|花开花下1|2022-02-14 00:26:01|\n|a|花开花落2|2022-02-14 00:28:01|\n|a|开心麻花3|2022-02-14 00:30:01|\n|a|开心啦哈4|2022-02-14 00:32:01|\n|a|开心摸哈5|2022-02-14 00:34:01|\n|b|他的故事6|2022-02-14 00:36:01|\n|b|大海卡的7|2022-02-14 00:36:01|\n|b|大海故事8|2022-02-14 00:34:01|\n|b|大海声音9|2022-02-14 00:34:01|\n|b|大海哈哈10|2022-02-14 00:34:01|\n|c|故事开始11|2022-02-14 00:39:01|\n\n### 试例\n\n#### 根据 `type` 每类根据时间排序取 `3`条\n\n```mysql\nselect number, type, title, created_at\nfrom (select @type := '', @number := 0) as rcin\n join (select @number := IF(type != @type, 1, @number + 1) as number,\n @type := type,\n title,\n type,\n created_at\n from users\n order by type, created_at desc) as nrcircirci\nwhere number <= 3\norder by created_at desc, number\n```\n\n\n# 参考资料\n- \n- \n- \n- \n\n","tags":["php","mysql"],"categories":["codes"]},{"title":"聊天中的了三两事","url":"/posts/b3833fe0/","content":"\n# 开始\n\n从何说起呢\n\n聊天 我们彼此沟通的方式之一\n\n对于话术 却有着不同的意思\n\n# 我讲明白了吗\n\n要说印象深的 就平时听到的 `你听明白了吗` 责任在你\n\n我觉得 换成 `我讲 清楚/明白 了吗` 这是责任在我的事情\n\n> [表达“我讲明白了吗?”还是“你听懂了吗?”](http://blog.sina.com.cn/s/blog_8fa253560102wbj3.html)\n\n# 听你的\n\n我记得什么时候 `随便` 一词火了\n\n然后 这个常常挂在嘴边\n\n要说印象深刻 那就在 恋爱的时候 或者关心对方的时候 \n\n问出 `吃什么` `我们干什么`\n\n然后 对方回答 `随便` 那一刻起 `心痛啊`\n\n然后 换成 `听你的` 我觉得好多了\n\n当然 这也是在哪里看到的\n\n可是 我想了想 不是不应该给多方这个机会吗\n\n# /?? `你开心我就开心`\n\n应该是这句吧 也想不起当时的意境了\n\n这话从他那开始 也到那结束\n\n是不是因为长大了\n\n还是没人再这么说过\n"},{"title":"假装相信对方可以办好这件事","url":"/posts/44e6bcf3/","content":"\n对 从 `求人 办事` 开始\n\n为啥要用 `求人` 开始呢\n\n因为这事 只有对方可以办成 自己一己之力不成\n\n然后吧\n\n我觉得 再求人的时候 留一手是很正常的一件事情\n\n当然 我也觉得 留下来的这一手不要让其他人晓得是应有的尊重\n\n不然我就觉得 你既然找我 那就是相信我 而在找我的时候 去找其他人 这是什么情况\n\n我自己也有过 也遇到过\n\n感觉 都是很难过的事情\n\n仔细想想 缘由吧\n\n大概源于 自己开始找对方之前 进行了一个评估\n\n然后 根据这个评估进行处理\n\n这应该就是常说的 `A/B` 方案\n\n我觉得最容易复现的就是借钱\n\n大概就是\n\n一次性问好多人借相同的金额\n\n至于缘由吧 我想过 没想出一个合适的结果\n\n下来复现的就是\n\n假定在厕所没纸\n\n我觉得这种问多个人是人之常情 可我又觉得 不能群发 至少得一个未回应的情况下再去问其他人\n\n或许 我的感觉就是如此吧\n\n生活嘛"},{"title":"成长 小男孩","url":"/posts/47e33e4c/","content":"\n好像 总是在悲观的时候 会写点东西\n\n来告诉自己要记录一下事情\n\n来告诉自己要活下去\n\n然后 生活嘛\n\n总是发醪糟的时候\n\n然后 记得在 `知乎` 看到过一句话\n\n> 我希望他永远不要长大 然后换个妈妈陪他玩\n\n好像 每个男人心中都有个小男孩\n\n然后 走进他的心 就是照顾好他的小男孩\n\n又好像 那个小男孩 他好会躲藏\n\n有时候 不是他没有 而是他不能被发现了\n\n生活总是赋予他好多责任 好多规则\n\n在这个圈内 小男孩久而久之的就没了\n\n然后 又看到了一句话\n\n> 我多想做个小孩 在怀里撒娇 期待你的关注\n\n就记得小时候特别爱生病\n\n然后论原因的话 \n\n就是家里人一直陪着自己\n\n那种感觉是另一种美好\n\n记得原先看过一个剧 名字又忘记了\n\n里面说\n\n> 有的人用童年治愈一生 而有的人用一生去治愈童年\n\n我 好像确实不想长大\n\n和 `soul` 那里面的 `灵魂` 一样\n\n差一个东西 而我却不知道是什么\n\n我想 是不是以后都会这样了\n\n想想自己的蠢事\n\n趋同厉害的\n\n哎\n\n哦对 还有一个\n\n为什么要努力\n\n> 为了过上比现在好的生活 \n\n然后 有时候去某些地方 感觉就像 `贫民窟`\n\n我想 努力的缘由就在这里吧\n\n","categories":["Grow"]},{"title":"vue3 学习 鸽","url":"/posts/e68c6fc5/","content":"\n# 开始\n> 当一个东西看不懂的时候 说明还没到用的时候 -9\n\n`vue3` 改变了平时写代码的习惯\n\n在`vue2`中采用的是 `Options API` 简单来说 每个区域的代码作用已经明确了\n在`vue3`中采用的是 `Composition API` 相反 每个区域并没有固定代码作用 全凭自己发挥\n\n# 基本语法\n> 既然已经来到了 `vue3` 也遇见了 `vite` 还了解到了 `TypeScript` 又有了 `setup提案` 那不如 直接用最新的技术栈开始\n\n## 文件结构\n\n```\nsrc/study\n├─ parent.vue\n└─ child.vue\n```\n\n## 那就先用 `parent.vue` 开始\n\n### vue2 js\n\n#### js\n\n```html5\n\n```\n\n```js\nexport default {\n data() {\n return {\n child_string: '在'\n }\n },\n mounted() {\n this.getStatistics()\n // this.$store.commit('title', '这个是主页')\n },\n methods: {\n getStatistics() {\n this.loading = true\n flyio.get('/statistics').then(res => {\n this.statistics = res\n this.loading = false\n })\n },\n },\n}\n```\n","tags":["js"],"categories":["vue"]},{"title":"费用感觉","url":"/posts/9aaf5a26/","content":"\n# 开始\n\n怎么说呢\n\n自己当时想的是\n\n> 在费用允许的情况下提供给客户最优解\n\n然后 可能是真的因为自己穷吧\n\n所以 在世间 对这些和钱有关的事情\n\n不晓得 如何操作\n\n又不愿意去想他\n\n当然 贵也有贵的道理\n\n然后 可是基于目前来看\n\n好像 另一种便宜的也能达到自己的预期\n\n看着他人 消费\n\n不晓得自己为何难受\n\n因为在这钱 和自己没有关系吗\n\n不过 缺失应该佩服这种\n\n他提供给了社会另一种的解决方案\n\n能用钱解决的都不算问题\n"},{"title":"代码感悟","url":"/posts/ad2bc3d9/","content":"\n# 开始\n\n怎么说呢\n\n现在的 编程语言 真的 对人类比较友好了\n\n尤其是帮助他人解决一个问题后所获得的成就感\n\n这可能是在这一行待下去的动力吧\n\n然后 想想 如何解决一个bug\n\n我觉得 这个可以写好多的\n\n还有 如何处理 原先留下的代码\n\n先写写吧 毕竟不晓得下次会鸽到啥时候呢\n\n# 理解\n\n## 工欲善其事 必先利其器\n\n这个 确实会牵扯到 `学习成本` 以及 `摸鱼成本`\n\n对于一个可以让自己吃饭的事情 一定要对他好点\n\n对于所使用的工具 如果觉得麻烦 一定要去找方便代替的东西\n\n不然 这其中浪费的时间 以及每次让自己麻烦的感觉 对于这个是很不友好的\n\n尤其是对工具的`快捷键`\n\n我们目前想干的事情 通常都有快捷键会帮助我们解决的\n\n## 站在全局思考这个 不要局限于所看到的\n\n没事的话 想一想这个代码运行的逻辑\n\n站在高处 想想 哪里会出错\n\n其实 对于 `按行调试` 以及 `无限的实错成本` 真的 很打击自己的自信心的\n\n或许 可以戴个耳机 然后 想想这个神奇的家伙\n\n对于这个`debug` 罗列几种个人认为比较牛逼的方案\n\n- 按行调试 批量注释 不要怕打印日志 \n- 整理下原先运行逻辑 重写\n- 在不影响运行的前提下 加个 `todo` 后面有时间再说\n- 问你觉得了解此问题的人\n\n我们目前遇到的问题 通常都有人已经遇到了 并且提了不错的解决方案\n\n## 精简代码 要优雅\n\n原先自己是写 `laravel` 的 也就记下了这个 `优雅`\n\n然后 玩起来了 `soraka` 好像也有这个 `gracefully`\n\n对于一个功能 `解藕` `聚合`\n\n可以尝试下\n\n哪有一大堆的设计模式 都是有存在的理由呀\n\n对于 `需求` 在开始 `架构师` 的时候 可以考虑复杂点\n\n这样 后期加需求 就不会太有难度\n\n对于 代码 争取不要写相同的 \n\n## 保持一个学习的心\n\n每到一个位置 都会遇到各式各样的 `大神`\n\n可以尝试了解下他们\n\n闲的时候 看看他们被问题急的`焦头烂额`\n\n内心偷偷乐下\n\n再去看看其他和自己类似工作的人\n\n试着聆听下他们内心深处的想法\n\n然后 `多摸摸鱼`\n\n争取压缩工作量\n\n下手之前 先思考思考这个\n\n再去楚楚他人博客\n\n去外面的世界楚楚\n\n## 保持一个好心情\n\n`bug` `code` 这玩意 毕竟是自己写出来的\n\n然后 自己还把自己急的 一批\n\n想想 这是多么有趣的一件事情啊\n\n别被自己写的东西 坏了好心情\n\n然后 要让他们晓得\n\n如果让自己生气 那可是可以重写的呢\n\n## 生活\n\n真的 入了这一行\n\n可能真的是 一入代码终不悔 从此红尘是路人\n\n可是 你也是一个人啊\n\n一个火生生的人啊\n\n可以尝试去观察下其他人\n\n看下他们 之间像一个人吗\n\n就是那种 被生活所压迫 所无奈\n\n那种 \n\n可以尝试去 娱乐项目\n\n# 终\n\n好了 \n\n大概就这么多了\n\n毕竟 电影快开场了\n\n希望不要迟到了\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","categories":["codes"]},{"title":"要送出去的礼物","url":"/posts/ee8394aa/","content":"\n# 横幅\n- [ ] 待定\n\n# 锦旗\n- [ ] 待定\n\n# 牌匾\n- [ ] 待定\n\n# 墓碑照\n- [ ] 待定\n\n# 整蛊玩具\n- 180416\n\n# 猪饲料\n- 190216\n- 191103\n- 200405\n\n# 零食大礼包\n- [ ] 待定\n\n# 毛绒玩具\n- 180304\n- 180304\n\n# 电影票\n- [ ] 待定\n\n# 围裙\n- [ ] 待定\n\n# 冥币\n- [ ] 待定","tags":["gift"],"categories":["gift"]},{"title":"要送出去的结婚礼物","url":"/posts/163aa704/","content":"\n# 硬币 `1992-2018` 年 共计 `27` 枚\n- 210101\n\n# 硬币 一大堆\n- 210101\n\n# 人民币 一大堆\n- [ ] 待定\n\n# 陶瓷情侣杯\n- 210503\n\n# 磁力球万年历\n- 210503\n\n# 一套餐具\n- [ ] 待定\n\n# 蓝牙耳机\n- [ ] 待定\n\n# 烟灰缸\n- [ ] 待定\n\n# 机械键盘\n- [ ] 待定\n\n# 邮票\n- [ ] 待定\n\n# 乌龟\n- [ ] 待定\n\n# 纪念册\n- [ ] 待定\n\n# 面包烤箱\n- [ ] 待定\n\n# 一套厨具\n- [ ] 待定\n\n# 围裙\n- [ ] 待定\n\n# 布置婚房的闹钟(思路源于知乎)\n- [ ] 待定\n","tags":["gift","wedding"],"categories":["gift"]},{"title":"部署 php","url":"/posts/dbb1ac5/","content":" \n# 所需环境\n\n- [nginx](https://nginx.org/) || [apache](https://www.apache.org/)\n- [mysql](https://www.mysql.com/cn/) || [mariadb](https://mariadb.org/)\n- [reids](https://redis.io/)\n- [php](https://www.php.net/)\n- [composer](https://getcomposer.org/)\n- [git](https://git-scm.com/)\n\n# 环境安装\n\n## 自动\n\n- 宝塔 ~虽然我不喜欢这个 可奈何不住人家人气高啊~\n- \n\n## 手动\n\n- [Debian9-x64-Install-Vhost](../d2b5014)\n\n# 部署\n\n- 项目名称 `example`\n- 访问域名 `example.test`\n- 项目目录 `/www/wwwroot/web`\n\n## 框架判断\n\n- 如果 `/www/wwwroot/web` 存在 `composer.json` 文件 那里面的 `name` 字段通常是 `框架名称`\n- 人肉分析\n\n## [laravel](https://laravel.com/) || [lumen](https://lumen.laravel.com/)\n\n### 获取源代码\n\n#### `git` 方式\n\n##### 运行\n\n```sh\ncd /www/wwwroot/\n\ngit clone --depth 1 git@github.com:puzzle/project.git web\n# 或者\ngit clone --depth 1 https://github.com/puzzle/project.git web\n```\n\n#### `文件` 方式\n\n- 下载成压缩包 服务端解压\n\n### 配置文件\n\n> 大多都是类似的 具体可看相应注释\n\n#### 复制\n\n```sh\ncd /www/wwwroot/web\ncp .env.example .env\n```\n\n#### 修改 `.env` 文件\n\n```env\n# 项目名称\nAPP_NAME=example\n# 当前运行环境 可选值 local 本地 | production 线上 | ...\nAPP_ENV=production\n# 密钥 需运行生成\nAPP_KEY=base64:hello\n# 是否开启调试模式\nAPP_DEBUG=false\n# 当前运行网址\nAPP_URL=http://example.test\n\n# 数据库连接类型\nDB_CONNECTION=mysql\n# 数据库连接地址\nDB_HOST=127.0.0.1\n# 数据库端口\nDB_PORT=3306\n# 数据库表名\nDB_DATABASE=deploy\n# 数据库用户名\nDB_USERNAME=root\n# 数据库密码\nDB_PASSWORD=root\n\n# redis 连接地址\nREDIS_HOST=127.0.0.1\n# redis 密码\nREDIS_PASSWORD=root\n# redis 端口号\nREDIS_PORT=6379\n\n# session 储存位置 可选值 file | redis | ...\nSESSION_DRIVER=redis\n\n# 队列执行方式 可选值 sync 同步 | redis 异步 | ...\nQUEUE_CONNECTION=redis\n```\n\n### 安装 `composer 包`\n\n#### 检查版本\n\n`composer --version`\n\n输出应该类似\n```\nComposer version 2.0.12 2021-04-01 10:14:59\n```\n\n#### 安装扩展包\n\n```\ncd /www/wwwroot/web\ncomposer install -vvv\n```\n\n输出应该类似\n```\nPackage manifest generated successfully.\n1 packages you are using are looking for funding.\nUse the `composer fund` command to find out more!\n```\n\n这时候 `/www/wwwroot/web` 就会存在 `vendor` 和 `composer.lock` 文件了\n\n### 生成 `key`\n\n```sh\ncd /www/wwwroot/web\nphp artisan key:generate\n```\n\n运行成功后 `.env` 文件 `APP_KEY` 将会自动填充值\n\n### 目录映射\n\n```sh\ncd /www/wwwroot/web\nphp artisan storage:link\n```\n\n### 优化应用\n\n```sh\ncd /www/wwwroot/web\n# 修改 .env 文件后 需要重新运行此命令\nphp artisan config:cache\nphp artisan route:cache\nphp artisan view:cache\n```\n\n### 设置文件夹权限\n\n- ~如果 当前终端登录用户 和 `php-fpm` 用户一致 可不用设置~\n\n```sh\ncd /www/wwwroot/web\nchmod 777 -R bootstrap storage\n```\n\n### 迁移数据库\n\n#### 根据 `sql` 判断执行顺序\n\n#### 根据实际情况运行迁移命令\n\n```sh\ncd /www/wwwroot/web\nphp artisan migrate\n```\n\n### 配置 `nginx` | `apache`\n\n#### `nginx`\n\n> \n\n```config\nserver {\n listen 80;\n server_name example.test;\n root /www/wwwroot/web/public;\n\n add_header X-Frame-Options \"SAMEORIGIN\";\n add_header X-Content-Type-Options \"nosniff\";\n\n index index.php;\n\n charset utf-8;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location = /favicon.ico { access_log off; log_not_found off; }\n location = /robots.txt { access_log off; log_not_found off; }\n\n error_page 404 /index.php;\n\n location ~ \\.php$ {\n fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;\n fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;\n include fastcgi_params;\n }\n\n location ~ /\\.(?!well-known).* {\n deny all;\n }\n}\n```\n\n#### `apache`\n\n> todo\n\n#### 访问验证\n\n如果配置成功的话 访问 `example.test` 就可以看到页面了\n\n### 定时任务(按需要添加)\n\n```sh\n* * * * * /usr/bin/php /www/wwwroot/web/artisan schedule:run >> /dev/null 2>&1\n```\n\n### 队列(按需要添加)\n\n#### [supervisor](../6992eceb)\n\n```\n[program:example]\nprocess_name=%(program_name)s\ncommand=/usr/bin/php /www/wwwroot/web/artisan horizon\nautostart=true\nautorestart=true\nuser=www\nredirect_stderr=true\nstdout_logfile=/www/wwwroot/web/storage/logs/supervisord.log\n```\n\n### 错误\n\n- 可根据 `/www/wwwroot/web/storage/logs/` 排查\n\n### 其他参考文档\n\n- [laravel deployment](https://laravel.com/docs/8.x/deployment)\n- [Laravel-Online](../dc688cb0)\n","tags":["php"],"categories":["deploy"]},{"title":"部署","url":"/posts/26b9d431/","content":"\n# 缘由\n\n好像 对于一个 `web`编程\n\n没人去写如何部署\n\n好像 这玩意已经是 从开始 就晓得 如何去做的事情了\n\n一个是开发处理 一个是运维处理\n\n然后 除此之外\n\n还可以怎么做呢\n\n\n# 部署\n\n## [php](../dbb1ac5)\n\n\n> 当然 这操作起来可能确实比较麻烦 所以 为啥不直接镜像呢","categories":["deploy"]},{"title":"Use_V2fly","url":"/posts/99ff0f64/","content":"\n你别说 \n\n> 每一个模式下都有一种特定的解决方案\n\n我记得 他好像改名了\n\n然后 就变成这样了\n\n这里 记录下 这个配置信息\n\n`v2ray.conf`\n\n```json\n{\n \"log\":{\n \"loglevel\":\"debug\"\n },\n \"inbounds\":[\n {\n \"listen\":\"127.0.0.1\",\n \"port\":7777,\n \"protocol\":\"vless\",\n \"settings\":{\n \"clients\":[\n {\n \"id\":\"uuid\"\n }\n ],\n \"decryption\":\"none\"\n },\n \"streamSettings\":{\n \"network\":\"ws\",\n \"wsSettings\":{\n \"path\":\"/path\"\n }\n }\n }\n ],\n \"outbounds\":[\n {\n \"tag\":\"direct\",\n \"protocol\":\"freedom\"\n },\n {\n \"tag\":\"blocked\",\n \"protocol\":\"blackhole\"\n }\n ],\n \"routing\":{\n \"domainStrategy\":\"AsIs\",\n \"strategy\":\"rules\",\n \"rules\":[\n {\n \"type\":\"field\",\n \"ip\":[\n \"geoip:private\"\n ],\n \"outboundTag\":\"blocked\"\n }\n ]\n }\n}\n```\n\n`nginx.conf`\n```conf\nlocation /path {\n proxy_redirect off;\n proxy_pass http://127.0.0.1:7777;\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n}\n```\n\n至于走 `cloudflare` 的话\n\n注意一点 他不支持 `三级域名`\n\n提示 `ERR_SSL_VERSION_OR_CIPHER_MISMATCH` 的话 就检查下域名吧\n\n\n参考\n\n- ","tags":["v2fly"],"categories":["v2fly"]},{"title":"Nginx_Default_Https","url":"/posts/1c592381/","content":"\n启用 `nginx` 默认的 `https` 站点\n\n就得有个证书\n\n然后就有一个 `假证书` 了\n\n\n\n```bash\nopenssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./default.key -out ./default.crt\n```\n\n```conf\nserver {\n listen 80;\n listen [::]:80;\n listen 443 ssl default_server;\n ssl_certificate /usr/local/nginx/conf/ssl/default.crt;\n ssl_certificate_key /usr/local/nginx/conf/ssl/default.key;\n server_name _;\n access_log /data/wwwlogs/default.log;\n index index.html;\n root /usr/local/nginx/html;\n}\n```\n\n然后 只要是 `https` 协议 没有匹配到站点的话 都会来到这里\n"},{"title":"Rember_Linux_Command","url":"/posts/f1af74bb/","content":"\n> 记录下几个命令\n\n然后 慢慢学习一下 得记住这些 神奇的 命令 然后 后面慢慢补文档\n\n# iptables\n\n## 当 `vps` 无公网时 可用内网任意一台上网\n\n\n\n这些命令 都在 可上网的机器上操作\n\n```\niptables -t nat -A POSTROUTING -o eth0 -s 172.16.1.0/24 -j SNAT --to 172.16.1.9\niptables -t nat -D POSTROUTING -o eth0 -s 172.16.1.0/24 -j SNAT --to 172.16.1.9\n```\n\n### 查看 `nat` 设置规则\n\n```\niptables -t nat --list\n```\n\n## 保存 `iptables` 规则\n\n```\napt-get install iptables-persistent\nUsage: /usr/sbin/netfilter-persistent (start|stop|restart|reload|flush|save)\n```\n\n# 文件查看\n\n## tail\n\n# vi\n\n## 复制 yy\n\n## 粘贴 p\n\n# 设置 `hostname`\n\n```\nhostnamectl set-hostname name\n```\n\n# `/etc/sysctl.conf `\n\n\n\n```\nfs.file-max = 1000000\nfs.inotify.max_user_instances = 8192\nnet.ipv4.tcp_syncookies = 1\nnet.ipv4.tcp_fin_timeout = 30\nnet.ipv4.tcp_tw_reuse = 1\nnet.ipv4.ip_local_port_range = 1024 65000\nnet.ipv4.tcp_max_syn_backlog = 16384\nnet.ipv4.tcp_max_tw_buckets = 6000\nnet.ipv4.route.gc_timeout = 100\nnet.ipv4.tcp_syn_retries = 1\nnet.ipv4.tcp_synack_retries = 1\nnet.core.somaxconn = 32768\nnet.core.netdev_max_backlog = 32768\nnet.ipv4.tcp_timestamps = 0\nnet.ipv4.tcp_max_orphans = 32768\n```\n","categories":["linux"]},{"title":"分词 感悟","url":"/posts/f8c48204/","content":"\n> 真的 有时 你不得不佩服人类\n\n最近 因为 `hometown` 项目需要\n\n然后开始查找 `分词`\n\n然后 就佩服起来了人类\n\n就佩服起来了这些厉害的大神\n\n然后 就有了 [jieba-api](https://github.com/puzzle9/jieba-api) 这个项目\n\n然后 我就遇到了查询中的问题了\n\n因为这是一个 `ucg` 平台\n\n所以 这个 `搜索` 显得格外的重要\n\n然后 这个是可以选择位置 再加 内容的\n\n所以 数据表就设计成了\n\n`user`\n```\nid\nnickname 昵称\n```\n\n`content`\n```\nid\ntitle 标题\nbody 内容\nprovince 省份\ncity 城市\narea 区域\naddress 地址\nuser_id 用户ID\n```\n\n然后 搜索要可以通过\n\n- 用户昵称\n- 内容标题\n- 内容省份\n- 内容城市\n- 内容区域\n- 内容地址\n\n这些条件 联合查询\n\n按照 `词性标注` 可以完成一部分\n\n用返回的 `名词` 去 `内容标题`\n用返回的 `地名` 去 `内容 省份 城市 区域 地址`\n\n如果没有返回 `名词` `地名` 就去关联 `用户表` 的 `昵称` 查询\n\n经过一系列的操作\n\n就导致了\n\n`西安肉夹馍` 可以在 位置为`西安` 搜索 标题含有`肉夹馍` 的数据\n\n`天旭流年` 可以查出来 用户昵称为 `天旭流年` 发布的数据\n\n然后 这时候 就有了一个\n\n`天旭流年 肉夹馍`\n\n按道理说 应该去查这个用户发布标题中含有 `肉夹馍` 的数据\n可是这\n\n看来我这样搜索是不对的\n\n可我觉得又不能用一堆 `if` 判断\n\n先记个 `todo` 上线后优化吧\n\n```php\n// 地名\n$ns = $participle['ns'] ?? null;\nif ($ns) {\n $db->where(function ($query) use ($ns) {\n foreach ([\n 'province',\n 'city',\n 'area',\n 'address',\n ] as $name) {\n foreach ($ns as $value) {\n $query->orWhere($name, 'like', \"$value%\");\n }\n }\n });\n}\n\n// 普通名词\n$n = $participle['n'] ?? null;\nif ($n) {\n $db->where(function ($query) use ($n) {\n foreach ([\n 'title',\n ] as $name) {\n foreach ($n as $value) {\n $query->orWhere($name, 'like', \"$value%\");\n }\n }\n });\n}\n\n/**\n * 用户昵称\n * 可能只查询用户昵称 所以 就\n */\n$author_ids = User::search('nickname', $content)->pluck('id');\nif ($author_ids) {\n if ($ns || $n) {\n $db->orWhereIn('author_id', $author_ids);\n } else {\n $db->whereIn('author_id', $author_ids);\n }\n}\n```\n\n下一个 应该是 `推荐感悟`\n","categories":["Participle"]},{"title":"Go WebHook","url":"/posts/9dd70606/","content":"\n> 要学会留坑\n\n\n\n","categories":["go","webhook"]},{"title":"Eggjs Socket","url":"/posts/e65f2c6/","content":"\n> 这两个 可是不能同时使用的呢\n\n> 这两个 可是不一样的呢\n\n可以理解成 `socket.io` 是在 `websocket` 上面封装了一层 并提供了 `断开重连` `心跳事件` 等等\n\n# websocket\n\n- \n- 可和 `http` 适用同个 `url`\n- 所有消息 都在 一个 `控制器` 下\n\n## route\n\n```ts\napp.ws.route('/ws', controller.ws.index.start)\n```\n\n## 使用方式\n\n`this.app.ws` 和 `this.ctx.websocket` 情况大部分相似 区别于 具体命令\n\n```ts\n// 给自己发消息\nthis.ctx.websocket.send()\n\n// 加入房间\nthis.ctx.websocket.room.join('room_id')\n\n// 离开房间\nthis.ctx.websocket.room.leave('room_id')\n\n// 给 room_id 房间 发送消息\nthis.app.ws.sendJsonTo('room_id', {\n body: 'hello websocket',\n})\n```\n\n# socket.io\n\n- \n- \n- 不可和 `http` 适用同个 `url`\n- 将不同的消息 分配给 不同的 `控制器`\n\n## route\n\n```ts\nconst { io } = app\nio.of('/').route('start', io.controller.index.start)\n```\n\n## namespace\n\n```ts\n namespace: {\n // 命名空间\n '/': {\n // 首次连接中间件\n connectionMiddleware: [],\n // 每次消息中间件\n packetMiddleware: [],\n },\n },\n```\n\n## 使用方式\n\n`this.app.io` 和 `this.ctx.socket` 情况大部分相似 区别于 有没有`上下文`\n\n- 此上下文指 是不是由 `socket.io` 触发的事件\n\n```ts\n// 加入房间\nthis.ctx.socket.join('room_id')\n// 离开房间\nthis.ctx.socket.leave('room_id')\n\n// 给 当前连接的用户 发送 hello 事件 的消息\nthis.ctx.socket.emit('hello', {\n body: 'hello',\n})\n\n// 给 room_id 房间 发送 hello 事件 的消息\nthis.ctx.socket.to('room_id').emit('hello', {\n body: 'hello socket',\n})\n\n// egg schedule socket\nthis.app.io.of('/').to('room_id').emit('hello', {\n body: 'hello socket no trigger',\n})\n```\n","tags":["eggjs"],"categories":["eggjs","socket"]},{"title":"redis pub sub","url":"/posts/833b4c2e/","content":"\n# 开始\n\n> 文档这玩意儿 得看 得认真看\n\n使用项目 `eggjs` `laravel`\n\n# 注\n\n- `redis` 的 `pub/sub` 基于同一 `redis` 和 `db` 无关\n- `sub` 是单项的 只能接受事件 不能发布\n- `sub` 要在 `pub` 之前启动 不然 收不到之前的消息\n\n# `egg`\n\n## `app/config/config.local.ts`\n\n相关代码\n\n```ts\nconst redis = {\n host: '127.0.0.1',\n port: 6379,\n password: 'root',\n db: 1,\n}\n\nconfig.redis = {\n clients: {\n liveSubscribe: redis,\n livePublish: redis,\n redis,\n },\n}\n```\n\n## `app/schedule/liveSubscribe.ts`\n\n```ts\nimport { Subscription } from 'egg'\n\nexport default class liveSubscribe extends Subscription {\n static get schedule() {\n return {\n type: 'worker',\n immediate: true,\n }\n }\n\n // 订阅\n async subscribe() {\n // 此处 liveSubscribe 因为 sub 事件会阻塞下一步\n // https://github.com/eggjs/egg/issues/1524#issuecomment-336918876\n\n // 此处 hometown_database_live 为 通道 之所以这么长 是因为 laravel 自带一个前缀\n this.app.redis.get('liveSubscribe').subscribe('hometown_database_live', (err, result) => {\n if (err) {\n throw err\n }\n console.log(result, 'subscribe')\n })\n\n // 此处 message 为接受到新消息\n this.app.redis.get('liveSubscribe').on('message', (channel, data) => {\n // channel 通道\n // 收到 data 传递的数据 丫丫丫丫丫丫的\n console.log(channel, JSON.parse(data))\n })\n }\n\n // 发布\n async publish() {\n // 此处 livePublish 为 另一个 redis 进程 也可以用 redis\n // 此处 hometown_database_comment 为 通道名\n this.app.redis.get('livePublish').publish(\n 'hometown_database_comment',\n JSON.stringify({\n body: '收到一个新的',\n }),\n )\n }\n}\n```\n\n# laravel\n\n## `config/database.php`\n\n```php\n'options' => [\n 'cluster' => env('REDIS_CLUSTER', 'redis'),\n // 就这个前缀 `hometown_database_`\n 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),\n],\n```\n\n## 相关代码\n\n```php\nuse Illuminate\\Support\\Facades\\Redis;\n\n// 订阅 这个进程会一直卡住 推荐不要这么设计\npublic function subscribe()\n{\n // 至于这里为什么这么短 因为他自己加了前缀 hometown_database_comment\n Redis::subscribe(['comment'], function ($message)\n {\n // $message 收到一个新的\n \\Log::info($message);\n });\n}\n\n// 推送\npublic function publish()\n{\n // live 通道名 全称应为 hometown_database_live\n // 给 hometown_database_live 发送数据\n $count = Redis::publish('live', json_encode([\n 'body' => '丫丫丫丫丫丫的',\n ]))\n\n // 如果此通道有人监听 那么他就不是0\n\n return $count;\n}\n```\n\n# 其他\n\n## 如果发了收不到\n\n- 那么 可以可虑适用 `redis` 相关命令 监听这个`通道` 如 `SUBSCRIBE hometown_database_live`\n\n- 检查是否开启了`通道`功能\n\n# seo\n\n- egg laravel redis 订阅\n- node php redis 订阅\n- redis subscribe publish\n\n# 参考\n\n- \n- \n\n# 完工\n","tags":["egg","laravel"],"categories":["redis"]},{"title":"Docker Compose","url":"/posts/1514963b/","content":"\n> 工具 就是为懒人服务的 不要怕学习成本 努力学习吧\n\n先说说这个格式 `docker-compose.yml`\n\n```yml\nversion: '3.8'\nservices:\n nginx:\n image: nginx:stable-alpine\n restart: always\n volumes:\n - ./conf:/etc/nginx/conf.d\n - /vhost:/vhost\n network_mode: host\n mariadb:\n image: mariadb:10.5.8\n volumes:\n - ./data:/var/lib/mysql/data\n environment:\n MYSQL_USER: root\n MYSQL_ROOT_PASSWORD: root\n ports:\n - 3306:3306\n redis:\n image: redis:alpine\n command: redis-server --requirepass root\n ports:\n - 6379:6379\n```\n\n# version\n\n\n- 此文件适配版本 当然 越新越好\n\n# services\n- 服务 要干嘛\n","categories":["Docker"]},{"title":"Snap Start","url":"/posts/b06348b1/","content":"\n> 你别说 这个 确实方便\n\n# 感悟\n\n\n\n这个 对于什么软件 一个命令下去 就完成了\n\n关键是 他还是一个用着感觉不错的\n\n和`linux`自带的包管理器不同的是 他的软件 多 而且把大部分已经配置完成了\n\n不过 大多数都是 `gui` 的\n\n# 遇到的错误\n\n## snap-confine has elevated permissions and is not confined but should be. Refusing to continue to avoid permission escalation attacks\n\n\n\n```sh\nsystemctl enable --now apparmor.service\n```\n\n# 更改默认位置 `/var/lib/snapd`\n\n\n\n> 为什么不用软连接 因为 `apparmor` 不支持\n\n先停止\n```sh\nsystemctl stop snapd\n```\n\n再把整个目录移过去\n```sh\nmv /var/lib/snapd /opt/snapd\n```\n\n再创建个目录\n```sh\nmkdir /var/lib/snapd\n```\n\n再修改挂载方式\n\n`/etc/fstab`\n```\n/opt/snapd /var/lib/snapd none bind 0 0\n```\n\n再挂载下\n```sh\nmount -a\n```\n\n再启动\n```sh\nsystemctl start snapd\n```\n\n完美","categories":["snap"]},{"title":"Docker Start","url":"/posts/e9c4d07d/","content":"\n# 文档\n\n- [Docker —— 从入门到实践](https://yeasy.gitbook.io/docker_practice/)\n\n# 安装\n\n## arch\n\n```\npacman -S docker docker-composer\n```\n\n# 启用\n\n```\nsystemctl enable docker\nsystemctl start docker\n```\n\n# 镜像\n\n\n\n`/etc/docker/daemon.json`\n\n```\n{\n \"registry-mirrors\": [\n \"https://hub-mirror.c.163.com\",\n \"https://mirror.baidubce.com\"\n ]\n}\n```\n\n# 使用方式\n\n# 名词解释\n\n- `docker` 镜像 容器 仓库 等区别\n- `docker` 是个啥\n\n## 仓库\n\n\n\n- 一个 类似于 `github` 的东西 由大家上传 我们下载的是 `镜像`\n- 存在 `公开` 和 `私有`\n\n## 镜像\n\n- 一个由自己或他人打包后的东西 类似于 `ghost` `iso` `安装包` 等\n- 存在层级关系 一级一级的\n\n## 容器\n\n- 运行 `镜像` 的东西 相当于我们的电脑\n- 我们对他有所有权 `创建` `删除` `启动` 等等\n\n## 储存 (数据卷)\n\n- `容器` 的保存文件 相当于 我们的 `硬盘`\n- 可 `内置` `容器`删除 或者挂掉 此数据直接丢失 \n- 可 `外挂` `容器` 的任何变化 和这个无关\n\n## 宿主机\n\n- 相当于 `网吧` 这个称呼 其里面的电脑 都可以称呼为 `容器`\n- 相当于 `寄生虫` 所寄生的物体\n- 在这里 相当于 我们操作`容器`时候的电脑\n\n## 网络\n\n存在 `5` 种类型 常用 前`3`种\n\n### `none` 无网络\n\n- 断网模式\n\n### `host` 直接映射\n\n- `容器` 内部端口 和 `宿主机` 端口相同 不需要再次映射\n\n### `bridge` 桥接\n\n- 每个 `容器` 都有一个本地未被占用的 私有网段\n- 每个 `容器` 都有一个独立 `ip`\n- 未配置 `互通` 时 连个`容器` 不能连接\n- `容器` 内端口 可和 `宿主机` 端口不同\n\n### `container`\n### `user-defined`\n\n## `Dockerfile`\n\n- `镜像` 制作脚本\n\n## `docker-compose`\n\n- 一个 `Dockerfile` 批量管理软件\n\n## `k8s`\n\n- 一个 `容器` 批量管理软件\n\n# 遇到的错误\n\n# 更改默认位置 `/var/lib/docker`\n\n## 软连接\n\n```sh\nmv /var/lib/docker /opt/docker\nln -s /opt/docker /var/lib/docker\n```\n\n## 挂载方式\n\n```sh\nmv /var/lib/docker /opt/docker\nmkdir /var/lib/docker\n```\n\n`/etc/fstab`\n```\n/opt/docker /var/lib/docker none bind 0 0\n```\n\n```sh\nmount -a\n```","tags":["install"],"categories":["docker"]},{"title":"Manjaro Start","url":"/posts/3f94b605/","content":"\n# 安装\n\n## 镜像\n\n\n\n## 安装方式\n\n// todo\n\n## 源\n\n### archlinux\n`/etc/pacman.d/mirrorlist`\n```\nServer = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch\n```\n\n### archlinuxcn\n`/etc/pacman.conf`\n```\n[archlinuxcn]\nServer = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch\n```\n\n# 美化\n\n## 图标\n\n\n\n## 应用程序\n\n\n\n## `gnome` 插件\n\n- \n\n- \n\n- \n\n- \n\n- \n\n## 终端\n\n- \n\n- \n\n# 软件\n\n## 输入法\n\n- 仅适用于 `fcitx`\n\n### 开启输入法支持\n\n- \n\n`.pam_environment` 或 `.xprofile`\n\n```\nGTK_IM_MODULE DEFAULT=fcitx\nQT_IM_MODULE DEFAULT=fcitx\nXMODIFIERS DEFAULT=@im=fcitx\n```\n\n### 搜狗拼音 \n\n\n\n因为 `2.4.0` 不支持 账户登录 放弃\n\n### rime\n\n\n\n#### 皮肤\n\n\n\n## 其他\n\n","tags":["install"],"categories":["manjaro"]},{"title":"Eggjs-start","url":"/posts/b963359a/","content":"\n> 讲真 这是个神奇的框架\n\n# Q&A\n\n## 如何只运行一次\n\n- 如 `redis` 监听\n\n### `egg-schedule`\n\n\n\n`app/schedule/{name}.js`\n\n```js\nimport { Subscription } from 'egg'\n\nexport default class Live extends Subscription {\n static get schedule() {\n return {\n type: 'worker',\n immediate: true,\n }\n }\n\n async subscribe() {\n console.log('eggjs 只运行一次')\n }\n}\n```\n\n### `agent.js / app.js`\n\n\n\n`app.js`\n\n```js\nexport default class App {\n app\n\n constructor(app) {\n this.app = app\n }\n\n // 启动成功后运行\n async willReady() {\n console.log('eggjs 只运行一次')\n }\n}\n```\n\n","tags":["eggjs"],"categories":["eggjs"]},{"title":"NuxtJs","url":"/posts/8b4b6af6/","content":"\n> 讲真 学习是最简单的事情\n\n碎碎念下 `NextJs`\n\n# nuxt.config.js\n\n确实是字面意思理解 可能存在`bug`\n\n\n\n`mode` 渲染方式\n\n- `universal` 每个页面都是静态页面\n- `spa` 单页面 同原来的 `vue-cli`项目\n\n注 当 `target` 为 `server` 是全程需要服务端参与的\n\n\n\n`target`\n\n- `server` 需要服务端参与\n- `static` 全静态\n\n"},{"title":"干部网络学院 分析","url":"/posts/b22f63aa/","content":"\n# 感悟\n\n- `flash` 的故事 还等继续\n- `IE` 也是个必需品\n- `Win` 还是得有\n- 常用编码还是得一眼可以看出\n\n不过 当成功的那一刻 真的体验是很不一样的\n\n# 分析\n\n## `GET` `education/Student-MyResource` 课程列表\n\n```js\n $(function(){\n // 完成课程ID 学完后会变成绿色\n var coursewareIdsArr=[6851, 6852];\n setTimeout(function(){\n var courseware=$(\".movie\").children(\"a\");\n $.each(coursewareIdsArr,function(i,o){\n $.each(courseware,function(ii,oo){\n if(oo.id==\"courseware_\"+o){\n $(oo).css(\"color\",\"green\");\n }\n })\n });\n },1000)\n })\n```\n\n## `POST` `/education/FindStudentLessonCourseWare` 课程详情\n\n### 请求\n\n```\n%7BcourseID%3A3544%2CcourseWareID%3A6851%2CidentityID%3A0%7D\n```\n\n```\n{courseID:3544,courseWareID:6851,identityID:0}\n```\n\n### 响应\n\n```\n{\"courseID\":null,\"courseName\":null,\"courseWareID\":null,\"courseWareName\":null,\"historyUrl\":null,\"message\":\"success\",\"personStudyInfo\":null,\"rows\":[{\"courseID\":3544,\"courseNO\":\"\",\"courseName\":\"\",\"courseTime\":39.00,\"courseWareID\":6851,\"courseWareName\":\"\",\"id\":506913,\"identityID\":2,\"insID\":130,\"isFinish\":0,\"lessonLocation\":0.00,\"personID\":1977634295,\"planID\":0,\"sessionTime\":0,\"startDT\":\"2020-07-31 13:18:00\",\"studyPersonNum\":545,\"studyStatue\":\"completed\",\"studyTime\":60.45,\"studyTimeBak\":0,\"text\":\"\",\"validIdentityID\":\"\",\"validOrganID\":\"\"}],\"sysPerson\":null,\"total\":1}\n```\n\n#### 主要字段\n\n- `studyStatue` string 学习状态 有两值 `completed` 完成 `incomplete` 学习中\n- `studyTime` number 已有时间\n- `courseTime` number 有效时间\n\n## `POST` `/education/EditStudentLessonCourseWare` 更新学习进度\n\n### 请求\n\n#### `headers`\n\n|key|value|\n| --- | --- |\n|Content-Type| application/x-www-form-urlencoded |\n|Cookie| GSESSIONID HWWAFSESID HWWAFSESTIME |\n\n#### `bodys`\n\n|key|value|\n| --- | --- |\n|jsonString| value |\n\n- jsonString\n\n```\n%7BcourseID%3A3544%2CcourseName%3A%22%22%2CcourseNO%3A%22%22%2CcourseWareID%3A6852%2CcourseWareName%3A%22%22%2CstudyTime%3A60%2CsessionTime%3A4%2CcourseTime%3A41%2CstudyStatue%3A%22completed%22%2ClessonLocation%3A0%2CidentityID%3A0%2CisFinish%3A1%2CstartDT%3A%222020-07-31+13%3A02%3A34%22%7D\n```\n\n```\n{courseID:3544,courseName:\"\",courseNO:\"\",courseWareID:6852,courseWareName:\"\",studyTime:60,sessionTime:4,courseTime:41,studyStatue:\"completed\",lessonLocation:0,identityID:0,isFinish:1,startDT:\"2020-07-31 13:02:34\"}\n```\n\n同上 主要字段\n\n貌似 `studyTime` 不能超过 `999`\n\n## `GET` `/education/updateStuInfo` 更新备用学习时间 作用未知\n\n```js\n//异步请求更新备用学习时间\nfunction updateStuInfo(time){\n $.ajax({\n type:\"get\",\n url:\"/education/updateStuInfo\",\n data:{studyTimeBak:time,courseID:3544},\n dataType:\"json\",\n success:function(data){\n }\n });\n}\n\nstuTimeStart=new Date().getTime();\n//eclipse编译\nsetInterval(function() {\n updateStuInfo(stuTimeStart);\n stuTimeStart=new Date().getTime();\n}, 600000);\n```\n这时间是一小时一次 不过如果点击结束 也会更新一次\n"},{"title":"Node Package","url":"/posts/afecc083/","content":"\n> 所以 为什么要为难自己 直接用 `cnpm` 不好吗\n\n\n# package\n\n## npm\n\n```sh\nnpm config set registry https://registry.npm.taobao.org\nnpm config set disturl https://npm.taobao.org/dist\nnpm config set electron_mirror https://npm.taobao.org/mirrors/electron/\nnpm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/\nnpm config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/\n```\n\n## yarn\n\n```sh\nyarn config set registry https://registry.npm.taobao.org -g\nyarn config set disturl https://npm.taobao.org/dist -g\nyarn config set electron_mirror https://npm.taobao.org/mirrors/electron/ -g\nyarn config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/ -g\nyarn config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/ -g\nyarn config set chromedriver_cdnurl https://cdn.npm.taobao.org/dist/chromedriver -g\nyarn config set operadriver_cdnurl https://cdn.npm.taobao.org/dist/operadriver -g\nyarn config set fse_binary_host_mirror https://npm.taobao.org/mirrors/fsevents -g\n```\n\n","tags":["node"]},{"title":"SSH-Config","url":"/posts/cc802263/","content":"\n# git\n\n对于相同的域名不同用户的 `git` `秘钥` 就会产生神奇的问题\n\n## 解决方案\n\n### 先在 `~/.ssh/` 建立一个 `rsa` 文件夹保存`秘钥`\n\n### 再生成一个`秘钥`\n\n```\nssh-keygen\n```\n\n路径那部分输入绝对地址 `/home/puzzle/.ssh/rsa/github`\n\n### 新建或修改 `~/.ssh/config`\n\n```\nHost 名称\n HostName 主机名\n IdentityFile 秘钥绝对地址\n```\n\n比如\n\n```\nHost github\n HostName github.com\n IdentityFile /home/puzzle/.ssh/rsa/github\n```\n\n### 更改`git`地址\n\n```\n// 规则\ngit@名称:路径\n\n// 原先\ngit@github.com:puzzle9/the_elderly_are_available.git\n\n// 现在\ngit@github:puzzle9/the_elderly_are_available.git\n```\n\n### 把新`秘钥`绑定过去\n\n```\ncat ~/.ssh/rsa/github.pub\n```\n\n### 再改下仓库地址 再试下\n","tags":["git","ssh"],"categories":["git"]},{"title":"FaceApi","url":"/posts/c17c0e93/","content":"\n> face_recognition face api\n\n\n\n真的 有一种感觉\n\n当一个语言用习惯后 用另一个的时候 会完全不知所措\n\n这地方就写更新日记吧 也可能没有后话了\n\n# changelog\n\n## 2020年03月04日\n\nstart\n\n\n","tags":["flask","face","python"],"categories":["face"]},{"title":"About-Back-End","url":"/posts/895e2f42/","content":"\n> 作为一名优秀的后端,切记要口吐芬芳,切记不可对后端使用.\n\n我还记得在原先的自己 写了一片文章 叫做 [About-ForeEnd](/posts/2115d056)\n\n没想到\n\n阴差阳错的 我也成为了一个前端\n\n看到后端的接口\n\n确实头是大的\n\n感觉可能是自己太过于善良了吧\n\n然后 每天有一个致命问题 \n\n> name, 现在 item 什么情况.\n\n这种问题 感觉怎么回答都不好说\n\n在知乎看到一个问答\n\n\n\n> 两天是预计能交给你的时间,2小时可能实际工作时间。\n\n这么说 确实是真相\n\n好像越来越明白为什么在寒假最后一天\n\n那个效率如此至高\n\n想想 难道不有趣吗\n\n这个也一样\n\n就是最后一天\n\n效率很高\n\n但是\n\n合作的话\n\n就不一样了啊\n\n因为对于这个项目 整体把控\n\n不在自己手里\n\n遇到的什么 `bug` 什么的 瞬间可以让自己头大\n\n然后 有时候还有伤心什么的\n\n算算 确实头疼\n\n对于以后写接口\n\n我会和项目人员\n\n一切把这个项目梳理清楚\n\n然后开始工作\n\n> 接口是前端写的,因为他们最清楚需要什么.切不可通后端意向来写\n\n大概确实是这么一个情况\n\n~~你说客户想的简单嘛 简单~~\n\n实现起来 复杂吗 复杂\n\n我们都是程序员\n\n又何苦为难自己人呢\n\n","tags":["back-end","other"],"categories":["back-end"]},{"title":"程序思维","url":"/posts/20ba694/","content":"\n# 2020年02月20日19:01:13\n\n有时候写着写着 就会陷入一种误区 最明显的就是 `拦截器` `if` 嵌套\n\n路由跳转 没登录跳登录 有登录则判断是否有用户信息 没有则跳用户信息获取页 有则继续执行\n\n## 第一次代码\n\n```js\n// 路由名称\nrouteName = 'singIn'\n\n// 是否登录\nif (!isSignIn) {\n // 跳登录\n} else {\n // 是否存在用户信息\n if (!isHaveUserInfo) {\n // 判断路由是否跳 获取用户信息\n if (routeName != 'getUserInfo') {\n // 跳获取用户信息页\n }\n }\n\n // next\n}\n```\n\n## 第二次代码\n\n由于觉得上面太过于繁琐 而且 `if` 嵌套 觉得可以写一起 就有了下面版本\n\n```js\n// 路由名称\nrouteName = 'singIn'\n\n// 是否登录\nif (!isSignIn) {\n // 跳登录\n} else {\n // 是否存在用户信息 和 路由是否为 获取用户信息页\n if (!isHaveUserInfo && routeName != 'getUserInfo') {\n // 跳获取用户信息页\n }\n\n // next\n}\n```\n\n## 以后阅读\n\n觉得注释太过于直白 单词是直接可以看出意思的 所以删掉注释\n\n```js\nrouteName = 'singIn'\n\nif (!isSignIn) {\n\n} else {\n if (!isHaveUserInfo && routeName != 'getUserInfo') {\n\n }\n\n // next\n}\n```\n\n所以 我这到底写的什么 运行着确实挺明确的\n\n可是 这两个 `!` 是怎么运作的\n\n从第一次到最终 大概过了那么一小时左右\n\n我感觉 可能写出来还好点\n\n实际证明 好像没什么多大作用\n\n还是很迷糊\n\nemmmm\n\n## 第三次\n\n我又觉得 好像他完全可以写到一起\n\n# 2021年05月27日18:27:13\n\n有时候\n\n真的 设计思路比写代码更加重要\n\n一个需求 经过怎么样的变化 都能撑住\n\n这是多么厉害的设计呀\n\n说的这个有时候得想好久的 就是关于时间的查询了\n\n```php\n$format = 'Y-m-d H:m:s';\n$time = date($format);\n$time_before = date($format, strtotime('- 1day'));\n$time_after = date($format, strtotime('+ 1day'));\n\n// 下来 就是判断这个时间了\n// 正常想的是 $time_before < $time < $time_after\n// 然后 写就成了\n\nif ($time_after < $time && $time_before > $time) {\n # code...\n}]\n\nif ($time_after < $time && $time < $time_after) {\n # code...\n}\n\n// 我就在想\n// 为啥没得一个 这种判断呢\n// 符合人力阅读的一个写法 再不用去看这个脑中转换半天了\n\nif ($time_after < $time < $time_after) {\n # code...\n}\n```\n\n# next\n","categories":["Program"]},{"title":"WeChat-Domain","url":"/posts/9a49bf96/","content":"\n不得不说 有时候真的挺佩服那种 `升维` 思路的\n\n微信域名 防封 想想 确实很厉害\n\n实现思路确实可以\n\n不过真的觉得需要好好看看 了\n\n# 跳浏览器打开\n\n核心代码\n\n- 给 `Content-Type` 一个浏览器不认识的值\n- 再 `Content-Disposition` 来一个下载\n\n\n正常情况下\n\n`安卓` 会跳到浏览器 再请求下这个地址\n\n然后就是 `User-Agent` 开心的时刻了\n\n\n","tags":["WeChat"]},{"title":"PHP-Permission-Denied","url":"/posts/75ef94a2/","content":"\n> 有时候 你觉得你的代码没啥毛病 可还是有毛病的时候 请查看你的项目更新文档\n\n今天 升级 `php73` 到 `php74` 时候\n\n一直访问不到 `/home` 目录\n\n提示 `failed to open dir: Permission denied in`\n\n用伟大的`排除法` 排除一堆后\n\n还是决定看官方论坛\n\n\n\n然后就看到了这个 \n\n最后发现 是因为 `php-fpm.service` 更新了 `ProtectHome`\n\n最后\n\n```\nsystemctl edit php-fpm\n\n[Service]\nProtectHome=false\n```\n\n可能 喜欢上的就是 解决后的这种喜悦感吧\n\n>gl\n","categories":["PHP"]},{"title":"WeChat-Chat","url":"/posts/89155308/","content":"\n# 需要\n\n- `root` 的 `Android`\n- 强大的电脑\n\n# 开始\n\n```\n/data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml\n/data/data/com.tencent.mm/MicroMsg/${userid}/EnMicroMsg.db\n```\n\n# key 计算\n\n`imei` 双卡的话 看 `卡2`\n`uni` 位于 `system_config_prefs.xml` `default_uin`\n\n`md5(imei + uin)` 后 取前 `7` 位\n\n他两个都是 `int` 类型的\n\n# 工具\n\n[wxsqlcipher.exe](https://github.com/contr4l/MicromsgHistory/raw/master/wxsqlcipher.exe)\n\n# 后续\n\n导出 `message` 表就可以\n\n# 参考\n\n- \n- \n- \n- \n","tags":["WeChat"],"categories":["WeChat-Chat"]},{"title":"Use-Boot-Repair","url":"/posts/fa699abf/","content":"\n`#` 状态下\n\n```\nadd-apt-repository ppa:yannubuntu/boot-repair\napt-get update\napt-get install boot-repair\n```\n\n","categories":["linux"]},{"title":"Set-Linux-Time","url":"/posts/ccfc973d/","content":"\n查看当前时间 `date`\n查看当前时区时间 `date -R`\n\n> 使用 `tzselect` 来设置时区\n\n> 使用 `timedatectl` 来更改时区\n\n timedatectl set-timezone 'Asia/Shanghai'\n","categories":["linux"]},{"title":"Use-Js-Promise","url":"/posts/63cccf39/","content":"\n>对于异步的一点更简单的操作\n\n```js\n// es6\nlet promise = new Promise((resolve, reject) => {\n // do ……\n\n // success .then()\n resolve()\n\n // error .catch()\n reject()\n })\n\n// use\npromise.then((res) => {\n\n }).catch((err) => {\n \n })\n\n```","tags":["Promise"],"categories":["js"]},{"title":"Use-Python3","url":"/posts/f18aca02/","content":"\n> 人生苦短,我用python.\n\n# install\n\n[安装](../d2b5014/#python3)\n\n# plug\n\n## pip\n \n### 使用国内源\n\n vi ~/.pip/pip.conf\n\n # 豆瓣\n [global]\n timeout = 6000\n index-url = https://pypi.douban.com/simple\n trusted-host = https://pypi.douban.com\n\n### 升级版本\n\n py3 -m pip install --upgrade pip\n\n### 导出当前项目已经安装的扩展\n \n pip freeze > requirements.txt\n\n### 安装导出的扩展\n\n pip install -r requirements.txt\n\n## virtualenv\n\n\n\n### install\n\n pip3 install virtualenv\n ln -s /usr/local/py3/bin/virtualenv /usr/bin/virtualenv\n\n### other\n\n virtualenv --no-site-packages name\n cd name\n\n source name/bin/activate\n\n deactivate\n\n## requests\n\n\n\n### install\n \n pip3 install requests\n\n### other\n\n\n\n## BeautifulSoup\n\n\n\n\n### install\n \n pip3 install beautifulsoup4 lxml\n","tags":["ptyhon3"],"categories":["ptyhon3"]},{"title":"Debian9-x64-Install-Vhost","url":"/posts/d2b5014/","content":"\n# 一键安装脚本\n\n\n\n\n# ssh\n\n apt-get install sshpass\n sshpass -p 'password' ssh -i '.pem' username@ip\n\n# Get Ready\n \n useradd www\n usermod -L www\n\n apt-get update\n apt-get upgrade\n apt-get purge apache nginx mysql\n apt-get install g++ make libpcre3 perl psmisc curl wget\n\n mkdir -p /vhost/tmp/\n mkdir -p /vhost/phpx/\n mkdir -p /vhost/down\n cd /vhost/down\n\n# [nginx](http://nginx.org/)\n\n## install\n \n curl -O http://zlib.net/zlib-1.2.11.tar.gz\n curl -O https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz\n curl -O https://www.openssl.org/source/openssl-1.1.0g.tar.gz\n curl -O http://nginx.org/download/nginx-1.14.0.tar.gz\n\n tar -zxf zlib-1.2.11.tar.gz\n tar -zxf pcre-8.41.tar.gz\n tar -zxf openssl-1.1.0g.tar.gz\n tar -zxf nginx-1.14.0.tar.gz\n\n cd nginx-1.14.0\n\n ./configure --prefix=/vhost/nginx --with-pcre=/vhost/down/pcre-8.41 --with-zlib=/vhost/down/zlib-1.2.11 --with-openssl=/vhost/down/openssl-1.1.0g --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module \n\n make&&make install\n\n rm -rf /usr/local/bin/nginx\n\n ln -s /vhost/nginx/sbin/nginx /usr/local/bin/\n\n# [php7.2](http://php.net/)\n\n## freetype\n\n wget https://sourceforge.net/projects/freetype/files/freetype2/2.9/freetype-2.9.tar.gz/download -O freetype-2.9.tar.gz\n tar zxf freetype-2.9.tar.gz\n cd freetype-2.9\n ./configure --prefix=/usr/local/freetype2\n make&&make install\n\n## install\n\n apt-get install libxml2 libxml2-dev libcurl4-openssl-dev pkg-config libssl-dev libjpeg-dev libfreetype6-dev libmcrypt-dev libxslt1-dev libicu-dev\n\n curl -O http://php.net/distributions/php-7.2.8.tar.xz\n\n xz -dk php-7.2.8.tar.xz\n tar xf php-7.2.8.tar\n\n cd php-7.2.8\n\n ./configure --prefix=/vhost/phpx/php7.2.8 --with-config-file-path=/vhost/phpx/php7.2.8/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir --with-freetype-dir=/usr/local/freetype2 --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir --enable-xml --enable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --enable-intl --enable-pcntl --enable-ftp --with-gd --with-openssl --with-mhash --enable-sockets --with-xmlrpc --enable-zip --enable-soap --with-gettext --enable-fileinfo --enable-opcache --enable-exif \n\n make&&make install\n\n rm /usr/local/bin/php\n\n ln -s /vhost/phpx/php7.2.8/bin/php /usr/local/bin/\n\n mkdir -p /vhost/phpx/opcachecache /vhost/phpx/session /vhost/phpx/uploadtmp\n chmod 777 -R /vhost/phpx/opcachecache /vhost/phpx/session /vhost/phpx/uploadtmp\n\n## etc\n\n### php.ini\n\n sed -i \"s#^post_max_size = 8M#post_max_size = 128M#\" php.ini-production\n sed -i \"s#^upload_max_filesize = 2M#upload_max_filesize = 128M#\" php.ini-production\n\n echo '\n session.save_path = '/vhost/phpx/session'\n opcache.file_cache = '/vhost/phpx/opcachecache'\n upload_tmp_dir = '/vhost/phpx/uploadtmp'\n ' >> php.ini-production\n\n cp php.ini-production /vhost/phpx/php7.2.8/etc/php.ini\n\n\n### php-fpm.conf\n\n vi /vhost/phpx/php7.2.8/etc/php-fpm.conf\n\n [www]\n\n user = www\n group = www\n\n listen = /dev/shm/php72.sock\n\n pm = dynamic\n\n pm.max_children = 5\n\n pm.start_servers = 3\n\n pm.min_spare_servers = 3\n\n pm.max_spare_servers = 5\n\n## plug\n\n### mongodb\n \n apt-get install autoconf m4 automake libtool \n\n curl -O https://pecl.php.net/get/mongodb-1.5.2.tgz\n tar zxf mongodb-1.5.2.tgz\n cd mongodb-1.5.2\n /vhost/phpx/php7.2.8/bin/phpize\n ./configure --with-php-config=/vhost/phpx/php7.2.8/bin/php-config \n make&&make install\n\n sed -i 'extension=mongodb.so' /vhost/phpx/php7.2.8/etc/php.ini\n\n### composer\n \n curl -sS https://getcomposer.org/installer | php\n mv composer.phar /usr/local/bin/composer\n\n chmod 777 /usr/local/bin/composer\n\n#### /etc/profile\n\n vi /etc/profile\n\n #composer\n export PATH=\"$PATH:{user root}/.config/composer/vendor/bin/\" \n\n or\n\n echo '\n #composer\n export PATH=\"$PATH:{user root}/.config/composer/vendor/bin/\" \n ' >> /etc/profile\n\n# [mariadb](https://www.mariadb.org/)\n\n## install\n\n mkdir /vhost/mysqlData\n rm -rf /usr/local/mysql /etc/my.cnf /etc/init.d/mysql\n\n apt-get install libaio-dev\n\n wget http://ftp.cc.uoc.gr/mirrors/mariadb//mariadb-10.3.8/bintar-linux-x86_64/mariadb-10.3.8-linux-x86_64.tar.gz\n\n tar -zxf mariadb-10.3.8-linux-x86_64.tar.gz\n\n mv mariadb-10.2.13-linux-x86_64 /usr/local/mysql\n\n## my.cnf\n\n memTotal=`free -m | grep Mem | awk '{print $2}'`\n\n # 选取合适的配置文件\n if [[ ${memTotal} -lt 64 ]]; then\n # 小于64m\n mysqlCnf='my-small'\n elif [[ ${memTotal} -ge 64 && ${memTotal} -lt 128 ]]; then\n # 64m 到 128m\n mysqlCnf='my-medium'\n elif [[ ${memTotal} -ge 128 && ${memTotal} -lt 512 ]]; then\n # 128m 到 512m\n mysqlCnf='my-large'\n elif [[ ${memTotal} -ge 512 && ${memTotal} -lt 4096 ]]; then\n # 512m 到 4096m\n mysqlCnf='my-huge'\n elif [[ ${memTotal} -ge 4096 ]]; then\n # 大于 4096m\n mysqlCnf='my-innodb-heavy-4G'\n fi\n\n cp /usr/local/mysql/support-files/${mysqlCnf}.cnf /etc/my.cnf\n\n## add user\n \n groupadd mysql\n useradd -g mysql mysql \n chown root:mysql -Rf /usr/local/mysql\n chmod +x -Rf /usr/local/mysql\n chown mysql:mysql /etc/my.cnf\n\n## install data\n\n /usr/local/mysql/scripts/mysql_install_db --user=mysql --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/vhost/mysqlData --force\n\n chgrp -R mysql /vhost/mysqlData\n\n cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql\n sed -i \"s#^datadir=.*#datadir='/vhost/mysqlData'#\" /etc/init.d/mysql\n chmod 777 /etc/init.d/mysql\n\n## up user\n \n systemctl enable mysql.service\n systemctl start mysql.service\n\n /usr/local/mysql/bin/mysqladmin -u root password 'root'\n /usr/local/mysql/bin/mysql -uroot -proot -e \"drop database test;use mysql;delete from db;delete from user where user = '';delete from user where password = '';flush privileges;\";\n\n systemctl stop mysql.service\n\n## del more\n \n mkdir /usr/local/mysqlSmail\n mv /usr/local/mysql/bin /usr/local/mysqlSmail\n mv /usr/local/mysql/share /usr/local/mysqlSmail\n rm -rf /usr/local/mysql/\n mv /usr/local/mysqlSmail /usr/local/mysql/\n\n## ln -s\n\n rm -f /usr/bin/mysql /usr/bin/mysqldump\n ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql\n ln -s /usr/local/mysql/bin/mysqldump /usr/bin/mysqldump\n\n# [mongodb](https://www.mongodb.org/)\n\n## install\n\n rm -rf /usr/local/mongodb\n mkdir -p /vhost/mongodb/data\n chmod 777 /vhost/mongodb/data\n\n\n #curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-debian92-4.0.0.tgz\n curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgz\n tar -zxf mongodb-linux-x86_64-4.0.0.tgz -C /usr/local/\n\n mv /usr/local/mongodb-linux-x86_64-4.0.0 /usr/local/mongodb\n\n rm -f /usr/local/bin/mongo /usr/local/bin/mongod\n\n ln -s /usr/local/mongodb/bin/mongo /usr/local/bin/mongo\n ln -s /usr/local/mongodb/bin/mongod /usr/local/bin/mongod\n\n## conf\n \n vi /usr/local/mongodb/mongodb.conf\n\n dbpath=/vhost/mongodb/data\n logpath=/vhost/mongodb/mongodb.log\n fork=true\n logappend=true\n auth=true\n port=27017\n\n# [node](https://nodejs.org/)\n\n## install\n\n rm -rf /usr/local/node\n\n curl -O https://nodejs.org/dist/v8.11.3/node-v8.11.3-linux-x64.tar.xz\n\n xz -dk node-v8.11.3-linux-x64.tar.xz\n tar xf node-v8.11.3-linux-x64.tar\n\n mv node-v8.11.3-linux-x64 /usr/local/node\n\n chmod 777 -R /usr/local/node\n\n## /etc/profile\n vi /etc/profile\n\n #node\n export PATH=\"$PATH:/usr/local/node/bin/\"\n\n or\n\n echo '\n #node\n export PATH=\"$PATH:/usr/local/node/bin/\"\n ' >> /etc/profile\n\n# [python3](https://www.python.org/)\n\n## install\n \n wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz\n\n xz -dk Python-3.7.0.tar.xz\n tar xf Python-3.7.0.tar.xz\n\n cd Python-3.7.0\n\n mkdir -p /usr/local/py3\n\n ./configure --prefix=/usr/local/py3\n\n make&&make install\n\n rm -rf /usr/bin/py3*\n\n ln -s /usr/local/py3/bin/python3 /usr/bin/py3\n ln -s /usr/local/py3/bin/pip3 /usr/bin/pip3\n\n# [reids](https://redis.io/)\n\n## install\n \n rm -rf /usr/local/redis\n\n wget http://download.redis.io/releases/redis-4.0.11.tar.gz\n tar xzf redis-4.0.11.tar.gz\n mv redis-4.0.11 redis\n cd redis\n make\n\n rm -f /usr/local/bin/redis*\n\n mkdir -p /usr/local/redis/bin/\n\n mv src/redis-server /usr/local/redis/bin/\n mv src/redis-cli /usr/local/redis/bin/\n\n ln -s /usr/local/redis/bin/redis-server /usr/local/bin/\n ln -s /usr/local/redis/bin/redis-cli /usr/local/bin/\n\n## conf\n\n mkdir /vhost/redis\n\n sed -i \"s#^dir ./#dir /vhost/redis/#\" /vhost/down/redis/redis.conf\n sed -i \"s#^daemonize no/#daemonize yes#\" /vhost/down/redis/redis.conf\n sed -i 'requirepass root' /vhost/down/redis/redis.conf\n\n rm -rf /usr/local/redis/redis.conf\n cp /vhost/down/redis/redis.conf /usr/local/redis/redis.conf\n\n## question\n\n> 2018年08月06日12:21:07\n~~echo 'net.core.somaxconn = 511' > /etc/sysctl.conf~~\n~~echo 'vm.overcommit_memory = 1' > /etc/sysctl.conf~~\n\n\n\techo 'net.core.somaxconn = 511' >> /etc/sysctl.conf\n\techo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf\n\n echo '\n if test -f /sys/kernel/mm/transparent_hugepage/enabled; then\n echo never > /sys/kernel/mm/transparent_hugepage/enabled\n fi\n ' >> /etc/rc.local\n\n sysctl -p\n\n# [git](https://git-scm.com/)\n\n## install\n\n apt-get install libpcre3 libpcre3-dev tk perl cpio gettext\n\n curl -O https://www.kernel.org/pub/software/scm/git/git-2.18.0.tar.xz\n\n xz -dk git-2.18.0.tar.xz\n tar xf git-2.18.0.tar\n\n cd git-2.18.0\n\n ./configure --prefix=/usr/local/git-2.18.0\n\n make&&make install\n \n rm /usr/local/bin/git\n ln -s /usr/local/git-2.18.0/bin/git /usr/local/bin\n\n# end\n\n## vhost\n\n vi /vhost/vhost.sh\n\n```shell\n#!/bin/bash\nsudo echo\n\nfristPage() {\n echo -e '\n ==================================================================\n\n start || restart || stop\n\n =================================================================='\n}\n\n# php\nphpStart() {\n echo 'start php'\n sudo /vhost/phpx/php7.2.8/sbin/php-fpm\n sudo chmod 777 /dev/shm/php72.sock\n}\n\nphpStop() {\n echo 'stop php'\n sudo killall php-fpm\n}\n\nphpRestart() {\n echo 'restart php'\n phpStop\n phpStart\n}\n\n# nginx\nnginxStart() {\n echo 'start nginx'\n sudo nginx\n}\n\nnginxStop() {\n echo 'stop nginx'\n sudo nginx -s stop\n}\n\nnginxRestart() {\n echo 'restart nginx'\n sudo nginx -s reload\n}\n\n# mysql\nmysqlStart() {\n echo 'start mysql'\n sudo systemctl start mysql.service\n}\n\nmysqlStop() {\n echo 'stop mysql'\n sudo systemctl stop mysql.service\n}\n\nmysqlRestart() {\n echo 'restart mysql'\n sudo systemctl restart mysql.service\n}\n\n# mongo\nmongoStart() {\n echo 'start mongo'\n mongod -f /usr/local/mongodb/mongodb.conf\n}\n\nmongoStop() {\n echo 'stop mongo'\n mongod --shutdown -f /usr/local/mongodb/mongodb.conf\n}\n\nmongoRestart() {\n echo 'restart mongo'\n mongoStop\n mongoStart\n}\n\n# redis\nredisStart() {\n echo 'start redis'\n redis-server /usr/local/redis/redis.conf\n}\n\nredisStop() {\n echo 'stop redis'\n redis-cli -a root shutdown\n}\n\nredisRestart() {\n echo 'restart redis'\n redisStop\n redisStart\n}\n\n# vhost\nvhostStart() {\n echo 'start'\n phpStart\n nginxStart\n mysqlStart\n mongoStart\n redisStart\n}\n\nvhostStop() {\n echo 'stop'\n phpStop\n nginxStop\n mysqlStop\n mongoStop\n redisStop\n}\n\nif [[ $1 ]]; then\n\n if [[ $2 ]]; then\n ${2}Restart\n fi\n\n if [[ $1 == 'start' ]]; then\n vhostStart\n elif [[ $1 == 'stop' ]]; then\n vhostStop\n fi\nelse\n fristPage\nfi\n```\n\n chmod 777 /vhost/vhost.sh\n ln -s /vhost/vhost.sh /usr/local/bin/vhost\n\n","tags":["php","nginx","mariadb","mongodb","node","python3","redis","git"],"categories":["vhost"]},{"title":"Use-Supervisor","url":"/posts/6992eceb/","content":"\n> ubuntu 18.04 x64\n\n apt-get install supervisor\n\n默认配置文件 `/etc/supervisord.conf`\n\n项目配置文件 `/etc/supervisor/conf.d/`\n\n```conf\n[program:app]; 程序名称 在 supervisorctl 中通过这个值来对程序进行一系列的操作 \nautorestart=true; 程序异常退出后自动重启\nautostart=true; 当 supervisord 启动的时候也自动启动\nredirect_stderr=true; 把 stderr 重定向到 stdout,默认 false\nenvironment=PATH=\"/usr/local/bin/\"; 需要的环境变量\ncommand=php artisan up; 启动命令\nuser=www ; 启动用户\ndirectory=/wwwroot/; 程序的启动目录\nstdout_logfile_maxbytes=20MB; stdout 日志文件大小.默认 50MB\nstdout_logfile_backups=20; stdout 日志文件备份数\nstdout_logfile=/data/supervisor/app.log stdout 日志保存目录\n```\n\ninput `supervisorctl` learn more ","tags":["supervisor"]},{"title":"Laravel-Online","url":"/posts/dc688cb0/","content":"\n> laravel 5.6\n\n# .env\n\n```\nAPP_ENV=production\nAPP_DEBUG=false\n```\n\n# mix\n```\nnpm run prod\n```\n\n# artisan\n\n```\nphp artisan key:generate\n\nphp artisan route:clear \nphp artisan route:cache \n\nphp artisan config:clear \nphp artisan config:cache \n\nphp artisan view:clear \nphp artisan view:cache\n \nphp artisan storage:link\n```\n\n# crontab\n\n```\n* * * * * /usr/local/php/bin/php /data/wwwroot/jingle_school/artisan schedule:run >> /dev/null 2>&1\n```\n\n# supervisor\n\nuse [supervisor](../6992eceb)\n\n## queues\n\n```\n[program:jingle_school_horizon]\nprocess_name=%(program_name)s\ncommand=/usr/local/php/bin/php /data/wwwroot/jingle_school/artisan horizon\nautostart=true\nautorestart=true\nuser=www\nredirect_stderr=true\nstdout_logfile=/data/supervisor/jingle_school_horizon.log\n```\n\n## broadcasting\n\nuse [laravel-echo](../6539c6d1)\n\n```\n[program:jingle_school_echo]\nprocess_name=%(program_name)s\nenvironment=PATH=\"/usr/local/node/bin/\"\ndirectory=/data/wwwroot/jingle_school/\ncommand=/usr/local/node/bin/laravel-echo-server start\nautostart=true\nautorestart=true\nuser=www\nredirect_stderr=true\nstdout_logfile=/data/supervisor/jingle_school_echo.log\n```\n\n### nginx\n\n```\nserver {\n \n ……\n\n location /socket.io/ {\n proxy_pass http://127.0.0.1:6001;\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n }\n \n ……\n\n}\n```\n\n# other\n\n## .env APP_ENV 参数\n\n> \n\n1. 开发: local\n2. 测试: testing\n3. 预上线: staging\n4. 正式环境: production\n\n## 关于线上 `queues` 不运行\n\n检查下 `.env` `APP_ENV` 是否为 `production`\n\n然后 再看 报错 这类\n","tags":["Online","socket.io","supervisor"],"categories":["Laravel"]},{"title":"Laravel-Use-Laravel-Echo","url":"/posts/6539c6d1/","content":"\n> laravel 5.6\n\n> laravel-echo 这个是个大家伙\n\n这东西 文档看不彻底 是没办法操作的\n\n先是\n\n1. [node](https://nodejs.org/)\n2. [redis](https://redis.io/) \n\n再是\n\n1. [队列](https://laravel.com/docs/5.6/queues)\n2. [事件系统](https://laravel.com/docs/5.6/events)\n3. [广播系统](https://laravel.com/docs/5.6/broadcasting)\n\n还有\n\n1. [laravel-echo-server](https://github.com/tlaverdure/laravel-echo-server)\n2. [laravel-echo](https://www.npmjs.com/package/laravel-echo)\n3. [socket.io-client](https://www.npmjs.com/package/socket.io-client)\n\n然后就 敬请的踩坑吧\n\n他们三者之间的关系\n我理解的是 先是触发事件 -> 事件到队列后 -> 在由广播给通知出来\n\n# 关于 这个家伙\n\n然后 在 `laravel` 中的 `broadcasting (广播系统)` 主要是 `服务端` 给 `客户端` 推送消息的\n\n然后在 这个 `广播系统` 中有三种 `广播类型`\n\n- `Channel` \n- `Private` \n- `Presence` \n\n这个区别\n\n`Channel` 公开 所有人不用订阅就可以访问\n`Private` `and` `Presence` 这两个 ~~必须在用户登录后才可以订阅~~\n\n这个区别 后者是好像是 可以监听到 来者的 `here` `joining` `leaving` 这几个事件\n\n对于这个 先是定义一个事件\n\n php artisan make:event \n\n```php\n// App\\Events\\Rss;\n\nnamespace App\\Events;\n\nuse Illuminate\\Broadcasting\\Channel;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Broadcasting\\PrivateChannel;\nuse Illuminate\\Broadcasting\\PresenceChannel;\nuse Illuminate\\Foundation\\Events\\Dispatchable;\nuse Illuminate\\Broadcasting\\InteractsWithSockets;\nuse Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast;\n\n/*\nimplements ShouldBroadcast 这部分是重点\nhttps://laravel.com/docs/5.6/notifications\n */\nclass Rss implements ShouldBroadcast\n{\n use Dispatchable, InteractsWithSockets, SerializesModels;\n\n /**\n * Create a new event instance.\n *\n * @return void\n */\n public function __construct()\n {\n //\n }\n\n /**\n * Get the channels the event should broadcast on.\n *\n * @return \\Illuminate\\Broadcasting\\Channel|array\n */\n public function broadcastOn()\n {\n /*\n 这里的 read 是 频道名\n Channel PrivateChannel PresenceChannel 这些则是 广播类型\n */\n return new Channel('read');\n return new PrivateChannel('read');\n return new PresenceChannel('read');\n }\n\n public function broadcastWith()\n {\n // 这是 广播内容\n return ['name' => \\Carbon\\Carbon::now()->toDateTimeString()];\n }\n}\n\n```\n\n对于 `PrivateChannel` 和 `PresenceChannel` 这种类型的\n则需要进行授权访问\n\n先去 `config\\app.php` 中\n`取消` 注释 `App\\Providers\\BroadcastServiceProvider::class,`\n\n因为 那是我们授权的路由\n\n php artisan make:channel Ordel\n\n这条命令主要是防止 路由 文件肿大 是 `laravel 5.6` 新增功能\n\n再到 `routes\\channels.php` 中注册一个验证授权的路由\n\n```php\n// 这个 只对私有频道 起作用\n// 这里 read 也是频道名 \nBroadcast::channel('read', Ordel::class);\n\n// 对于 PrivateChannel 频道返回 boolean\nBroadcast::channel('read', function () {\n return true;\n});\n\n// 对于 PresenceChannel 则是 文档吧\n```\n\n然后 具体的 看 \n\n# 关于 使用 `laravel-echo-server`\n\n`laravel-echo-server init` 运行后 按照那提示来\n\n运行后 会在 项目根目录生成一个 `laravel-echo-server.json` 文件\n\n```json\n{\n \"authHost\": \"网站地址 同 .env APP_URL\",\n // 授权地址 默认就可以 用于 `PrivateChannel` 和 `PresenceChannel`\n \"authEndpoint\": \"/broadcasting/auth\",\n\n // laravel-echo-server client:add APP_ID 使用此命令生成 主要用于 api\n // https://github.com/tlaverdure/laravel-echo-server#api-clients\n \"clients\": [\n {\n \"appId\": \"APP_ID\",\n \"key\": \"79329842613b84ecca054c3a7afa3c63\"\n }\n ],\n \"database\": \"redis\",\n \"databaseConfig\": {\n // 关于 redis 的设置 就直接用感觉来 不得行就查文档\n \"redis\": {\n \"password\": \"root\"\n },\n \"sqlite\": {\n \"databasePath\": \"/database/laravel-echo-server.sqlite\"\n }\n },\n \"devMode\": false,\n \"host\": null,\n \"port\": \"6001\",\n \"protocol\": \"http\",\n \"socketio\": {},\n \"sslCertPath\": \"\",\n \"sslKeyPath\": \"\",\n \"sslCertChainPath\": \"\",\n \"sslPassphrase\": \"\",\n \"apiOriginAllow\": {\n \"allowCors\": false,\n \"allowOrigin\": \"\",\n \"allowMethods\": \"\",\n \"allowHeaders\": \"\"\n }\n}\n```\n\n使用 `laravel-echo-server start` 来运行此服务\n\n\n# 关于 使用 `laravel-echo`\n\n```js\nimport Echo from 'laravel-echo'\n\nwindow.io = require('socket.io-client')\n\nwindow.Echo = new Echo({\n broadcaster: 'socket.io',\n host: window.location.hostname + ':6001'\n});\n\n// 监听频道\n// 公开频道\nEcho.channel('read')\n\n// 私有频道\nEcho.private('read')\n\n// 监听事件\n.listen('Rss', (e) => {\n console.log(e)\n})\n\n// 对于 PresenceChannel 频道 则可以监听到 以下 事件\n.here((e) => {\n\n})\n.joining((e) => {\n\n})\n.leaving((e) => {\n\n})\n\n// 加入频道\n.join('频道名')\n\n// 离开频道\n.leave('频道名')\n```\n\n# 关于推送一个广播\n\n```php\nevent(new App\\Events\\Rss());\n```\n\n最后 别忘记了 运行队列\n\n# end\n大概就酱 想到再补充","tags":["php","Lravel","Horizon","Queues","Events","Broadcasting"],"categories":["Laravel"]},{"title":"About-Js-String-Length","url":"/posts/e194a176/","content":"\n在 `js` 中获取字符串长度\n\n查了 半天 资料\n\n看了那好几种方案\n\n为何不直接用 `.length` 呢\n\n\n\n> ~~To be or not to be,~~ that is the question.","categories":["js"]},{"title":"Laravel-Use-Authorization","url":"/posts/18c87807/","content":"\n> laravel 5.6\n\n\n\n只有登陆后才可以判断\n\n传入的第一个参数必须是 `User` 模型 第二个字段是自定义内容\n\n返回值\n`true` 表示有权限\n`false` 表示无权限\n\n# 创建\n php artisan make:policy PostPolicy --model=User\n\n# 编辑 `App\\Policies\\PostPolicy`\n\n默认有 `view` `create` `update` `delete` 这几种方法\n\n```php\n\n// 在 Policy 中会在所有方法执行前调用\npublic function before(User $user)\n{\n # code...\n}\n\npublic function view(User $user, $post)\n{\n return $user->id == $post->user_id\n}\n\n```\n\n# 注册 `App\\Providers\\Policies`\n \n```php\n// 第一种\nprotected $policies = [\n 'App\\Models\\User' => 'App\\Policies\\PostPolicy',\n];\n\n// 第二种\npublic function boot()\n{\n $this->registerPolicies();\n\n Gate::define('checkId', function ($user, $id) {\n return $user->id == $id;\n });\n\n Gate::define('update articles', 'ArticlePolicy@update');\n}\n```\n\n# 使用\n\n\n##Gate 门面:\n\n Gate::allows('update articles', $article)\n Gate::denies('update articles', $article)\n\n## Controller:\n\n $this->authorize('update articles', $article)\n\n## Blade 模板:\n\n @can('update articles', $article)\n @cannot('update articles', $article)\n\n## User Model 实例:\n\n $user->can('update articles', $article)\n $user->cannot('update articles', $article)\n\n# other\n\n## 为何会想到这个\n\n源于自己的一个提问 ([增删改查中如何防止横向越权?](https://segmentfault.com/q/1010000015750015))\n感谢 [ibrand](https://segmentfault.com/u/ibrand) 回答\n\n>横向越权操作和纵向越权操作。前者指的是攻击者尝试访问与他拥有相同权限的用户的资源;而后者指的是一个低级别攻击者尝试访问高级别用户的资源。\n\n\n>比方说 前端传来一个 id\n后端进行增删改查\n如何防止 有效的用户 对 非自己的 资源进行操作\n在 `laravel` 中应该把这部分代码放在哪里\n\n## 关于认证失败返回 403 而不是 401 错误\n\n### [原文](http://www.dirv.me/blog/2011/07/18/understanding-403-forbidden/index.html)\n\n>Understanding 403 Forbidden\n18 July 2011\nThere’s a problem with 401 Unauthorized, the HTTP status code for authentication errors. And that’s just it: it’s for authentication, not authorization. Receiving a 401 response is the server telling you, “you aren’t authenticated--either not authenticated at all or authenticated incorrectly--but please reauthenticate and try again.” To help you out, it will always include a WWW-Authenticate header that describes how to authenticate.\nThis is a response generally returned by your web server, not your web application.\nIt’s also something very temporary; the server is asking you to try again.\nSo, for authorization I use the 403 Forbidden response. It’s permanent, it’s tied to my application logic, and it’s a more concrete response than a 401.\nReceiving a 403 response is the server telling you, “I’m sorry. I know who you are--I believe who you say you are--but you just don’t have permission to access this resource. Maybe if you ask the system administrator nicely, you’ll get permission. But please don’t bother me again until your predicament changes.”\nIn summary, a 401 Unauthorized response should be used for missing or bad authentication, and a 403 Forbidden response should be used afterwards, when the user is authenticated but isn’t authorized to perform the requested operation on the given resource.\nWell that’s my view on it anyway :)\n\n### 译文\n\n>了解403禁止\n2011年7月18日\n401 Unauthorized验证错误的HTTP状态代码存在问题。就是这样:它用于身份验证,而不是授权。收到401响应是服务器告诉您,“您未经过身份验证 - 未经过身份验证或未经过身份验证 - 但请重新进行身份验证并重试。”为了帮助您,它将始终包含WWW-Authenticate描述如何进行身份验证。\n这是您的Web服务器通常返回的响应,而不是您的Web应用程序。\n这也是非常暂时的; 服务器要求您再试一次。\n因此,对于授权,我使用403 Forbidden响应。它是永久性的,它与我的应用程序逻辑联系在一起,而且它比401更具体。\n收到403响应是服务器告诉你,“对不起。我知道你是谁 - 我相信你说的是谁 - 但你只是没有权限访问这个资源。也许如果您很好地询问系统管理员,您将获得许可。但是,在你的困境发生变化之前,请不要再打扰我了。“\n总之,401 Unauthorized响应应该用于丢失或错误的身份验证,并且403 Forbidden应该在用户经过身份验证但未被授权对给定资源执行请求的操作时使用响应。\n嗯,这是我对它的看法无论如何:)\n\n","tags":["php","Lravel","Authorization"],"categories":["Laravel"]},{"title":"About-ForeEnd","url":"/posts/2115d056/","content":"\n>2018年07月24日19:09:03\n\n前端 我拿什么来拯救你\n\n","tags":["other","fore-end"],"categories":["fore-end"]},{"title":"WeChat-Mini","url":"/posts/8f6d459e/","content":"\n>这是一个有趣的家伙\n\n# WebView\n> 2018年07月21日15:44:49\n\n\n\n不支持 `cookie`\n\n# TabBar\n> 2018年07月22日12:36:19\n\n`pages` 数组的第一项必须是 `tabBar` 的 `list` 数组的一员\n\n\n\n# wx.switchTab\n> 2018年07月22日13:03:37\n\n如果 `tabBar` 里有页面 跳转则不能使用 `wx.redirectTo` `wx.navigateTo` 这种\n\n# onPullDownRefresh\n> 2018年07月24日23:16:05\n\n页面刷新\n\n onPullDownRefresh () => {\n \n }\n\n`wx.startPullDownRefresh()` 是开始操作 \n`wx.stopPullDownRefresh()` 是停止操作 \n\n\n# wx.login() wx.getUserInfo()\n> 2018年07月25日17:10:00\n\n> 千万不要被这个 `session_key` 名字搞混 这只是一个名字而已 也可以叫做其他啥的\n\n`wx.login()` 获取用户临时登录凭证 `code`\n\n然后服务端再获取用户的 `openid` `unionid` `session_key`\n\n关于 `session_key` 这个 不是我们口中的 `session`\n\n他存在的意义就是解密 `wx.getUserInfo()` 中的 `encryptedData`\n\n`wx.checkSession()` 是 防止 `session_key` 失效 而导致解密 `encryptedData` 失败的\n\n> 关于小程序中判断用户登录状态的\n\n这个登录状态 只能由后台来判断 前端判断太麻烦\n推荐就是 全局定义一个 响应拦截器 然后当检测到后台传来特定值的时候进行判断\n\n在这 小程序中 不支持 `cookie`\n然而 `session` 也是基于 `cookie` 的\n\n可以定义一个全局 请求拦截器 对每次请求带上 `cookie`\n\n基于 `wx.setStorage()` `wx.getStorage()`\n\n# \\n\n> 2018年07月27日00:30:25\n\n\n\n关于 `\\n` 换行\n只有用 `` 组件时才可以\n\n# 页面嵌套页面跳转\n> 2018年07月27日15:30:28\n\n`getCurrentPages()`\n第一层 首页\n\n这个好像是最多10层\n\n# Cannot read property 'xxx' of undefined\n> 2018年07月28日06:08:19\n\n关于这种报错 是 没有获取到数据但是已经渲染了\n\n> 又天亮了,可能不知道啥时候就猝死了. - 波波\n\n# other\n> 2018年07月27日15:32:24\n\n偶然发现\n\n> 以下内容你不需要立马完全弄明白,不过以后它会有帮助。\n\n\n\n这句话好像几个文档都见到过\n\n# 保留关键字\n> 2018年08月05日22:05:28\n\n一定要注意 不要用保留关键字 不然 使用 `mpvue` 也不报错\n然后这 `4h` 就这样 浪过去了\n","tags":["WeChat"],"categories":["WeChat-Mini"]},{"title":"php codes","url":"/posts/ddef8f38/","content":"\n# PHPOffice/PhpSpreadsheet\n> 2018年07月14日\n保存 excel 图像 表格数据\n\n\n\n\n```php\n use PhpOffice\\PhpSpreadsheet\\IOFactory;\n use Illuminate\\Support\\Facades\\Storage;\n\n // laravel\n $path = storage_path('app/1.xlsx');\n\n $xlsx = IOFactory::load($path)->getActiveSheet();\n\n // 保存图像\n $imgs = [];\n $imgData = $xlsx->getDrawingCollection();\n\n foreach ($imgData as $value) {\n $content = fopen($value->getPath(),'r');\n $name = str_random(40).'.'.$value->getExtension();\n $info = Storage::put($name, $content);\n $imgs[] = $name;\n }\n\n // 获取数据\n $datas = [];\n $i = 0;\n foreach ($xlsx->toArray() as $value) {\n $datas[] = $value;\n $datas['img'] = $imgs[$i];\n\n $i++;\n }\n```\n\n","tags":["php","composer"],"categories":["codes"]},{"title":"Use-Ngrok","url":"/posts/b0eda95a/","content":"\n> 内网穿透\n\n一句话解释就是 `把自己的电脑用作服务器可以让外人访问到`\n\n\n\n\n前者国外 后者国内\n\n# https://ngrok.com/\n\n 先注册一个账号\n\n注册完成后 再到 看着这个文档来操作吧\n\n![](1.png)\n\n# https://www.ngrok.cc/\n\n 也是注册一个账号\n\n完成后 就 `emmmm` 你会理解的\n\n> 你不需要立马弄明白所有的东西,不过随着你的不断学习和使用.它的参考价值会越来越高.\n\n> 2018年08月04日 更新\n\n\n\n> 程序猿何苦为难程序猿","categories":["ngrok"]},{"title":"Laravel-Use-Horizon","url":"/posts/5c9df80d/","content":"\n> laravel 5.6\n\n\n\n# 安装\n\n composer require laravel/horizon\n\n# 发布文件\n\n php artisan vendor:publish --provider=\"Laravel\\Horizon\\HorizonServiceProvider\"\n\n# 配置\n\n发布文件后主要配置文件将在 `config/horizon.php`\n\n# 运行\n\n php artisan horizon\n\n不出意外 是可以访问 `{APP_URL}/horizon` 看到的\n\n# 仪表盘权限验证 `App\\Providers\\AppServiceProvider`\n\n> 默认情况下 这个是只能再 `local` 环境下访问的\n可使用 `Horizon::auth` 给仪表盘定义更具体的访问策略\n\n```php\n namespace App\\Providers;\n\n use Illuminate\\Support\\ServiceProvider;\n\n class AppServiceProvider extends ServiceProvider\n {\n\n public function boot()\n {\n // return true or false\n \\Horizon::auth(function ($request) {\n return auth()->check();\n });\n }\n\n public function register()\n {\n //\n }\n }\n```\n\n# other\n\n## 更改 '/horizon' 前缀\n\n翻了下 `issues` 貌似没找到\n不过有个 好像可以用\n\n\n```php\n return view('horizon::app');\n```\n","tags":["php","Lravel","Horizon"],"categories":["Laravel"]},{"title":"Laravel-Use-Queues","url":"/posts/2ed8c260/","content":"\n> laravel 5.6\n\n# 创建\n php artisan make:job ProcessPodcast\n\n# 编辑 `App\\Jobs\\ProcessPodcast`\n\n```php\n namespace App\\Jobs;\n\n use App\\AudioProcessor;\n use Illuminate\\Bus\\Queueable;\n use Illuminate\\Queue\\SerializesModels;\n use Illuminate\\Queue\\InteractsWithQueue;\n use Illuminate\\Contracts\\Queue\\ShouldQueue;\n use Illuminate\\Foundation\\Bus\\Dispatchable;\n\n class ProcessPodcast implements ShouldQueue\n {\n use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n protected $podcast;\n\n // 主要用于传值\n public function __construct($data)\n {\n $this->data = $data;\n }\n\n // 主要运行逻辑\n public function handle()\n {\n // ...\n }\n }\n```\n\n# 分发任务\n\n## No.1\n\n```php\n namespace App\\Http\\Controllers;\n\n use App\\Jobs\\ProcessPodcast;\n use Illuminate\\Http\\Request;\n use App\\Http\\Controllers\\Controller;\n\n class PodcastController extends Controller\n {\n public function store(Request $request)\n { \n // ...\n // 分发任务\n ProcessPodcast::dispatch($datas);\n }\n }\n```\n\n## No.2\n\n```php\n namespace App\\Http\\Controllers;\n\n use App\\Jobs\\ProcessPodcast;\n use Illuminate\\Http\\Request;\n use App\\Http\\Controllers\\Controller;\n\n class PodcastController extends Controller\n {\n public function store(Request $request)\n {\n // ...\n // 分发任务\n dispatch(new ProcessPodcast($datas));\n\n // 也可以这样写\n $this->dispatch(new ProcessPodcast($datas));\n }\n }\n```\n\n# 运行队列\n \n # 测试\n php artisan queue:listen\n\n # 线上\n php artisan queue:work\n\n推荐使用 [`horizon`](https://laravel.com/docs/5.6/horizon)\n[`horizon 使用方法`](/posts/5c9df80d/)","tags":["php","Lravel","Queues"],"categories":["Laravel"]},{"title":"Github-Permission-denied","url":"/posts/649f29d3/","content":"\n# 问题\n\n使用 `git` 给 `github` 推送 时遇到\n\n\n![](1.png)\n\n git@github.com: Permission denied (publickey).\n\n\n# 解决方案\n\n[一个帮助地址](https://help.github.com/articles/error-permission-denied-publickey/)\n\n这个是没通过认证的情况\n\n ssh -T git@github.com\n\n![](2.png)\n\n输入 一路回车下去\n\n ssh-keygen\n\n![](3.png)\n\n复制 `~/.ssh/id_rsa.pub` 内容 到 `SSH keys`\n\n cat ~/.ssh/id_rsa.pub\n\n![](4.png)\n\n ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsAR8WXcV2GRpAx1PmStWnOcJ7FXYPmGs9EQ/RY5NMbhNpNF/GhftBuGsDYL2BenSzYTPsNvD66AbUIlP5BaJNG2Avf6OugZdUD3FNII+8Q86F9KKjfp85zVo5bcfS9KIIgOISVkZzjACOaxGq4JbOXRRvCKs/1hVvv1hCIO1Ib9Ncor19De6Ad0wp16LMjkl+C6a3gsKq457jMttlwqAu2YiTrMKs0Ct9YUmfG727XllD93iY3HoTzwMDqd+jXGbQawxGzXUQoxt612pwwU2K/W2niC4GMIErTuNvDjM4/iMnbqhTJfgbj7ie20Q+J+qL/xTQZQN0/g9nQF0B0jmd puzzle@puzzle\n\n![](5.png)\n\n这个名字不重要 主要是 `key`\n\n![](6.png)\n\n保存后在试下\n\n ssh -T git@github.com\n\n![](7.png)\n\n# end","tags":["github"],"categories":["DeError"]},{"title":"Github-Push-Email-Private","url":"/posts/4c3f8f32/","content":"\n# 问题\n使用 `git` 给 `github` 推送 时遇到\n\n![](1.png)\n\n remote: error: GH007: Your push would publish a private email address. \n remote: You can make your email public or disable this protection by visiting: \n remote: http://github.com/settings/emails \n\n# 解决方案\n\n## NO.1\n\n取消勾选这个\n\n![](2.png)\n![](3.png)\n\n Block command line pushes that expose my email\n If you push commits that use a private email as your author email we will block the push and warn you about exposing your private email.\n\n 阻止命令行推送暴露我的电子邮件\n 如果您推送使用私人电子邮件的提交作为您的作者电子邮件,我们将阻止推送并警告您公开您的私人电子邮件。\n\n## NO.2\n\n Keep my email address private\n We’ll remove your public profile email and use 13518196+puzzle9@users.noreply.github.com when performing web-based Git operations and sending email on your behalf. If you want command line Git operations to use your private email you must set your email in Git.\n\n 将我的电子邮件地址保密\n 我们将删除您的公开个人资料电子邮件,并在执行基于Web的Git操作并代表您发送电子邮件时使用 13518196+puzzle9@users.noreply.github.com。如果您希望命令行Git操作使用您的私人电子邮件,您必须 在Git中设置您的电子邮件。\n\n将此项目 `email` 设置成 推荐 email [一个帮助地址](https://help.github.com/articles/setting-your-commit-email-address-in-git/)\n\n git config user.email \"13518196+puzzle9@users.noreply.github.com\"\n\n重置上次提交作者\n\n git commit --amend --reset-author\n\n# end","tags":["github"],"categories":["DeError"]},{"title":"hexo 搭建一个博客","url":"/posts/4f8f62d6/","content":"\n> 所谓博客,都是孤芳自赏 [nMask's Blog\n](https://thief.one/2017/03/03/Hexo%E6%90%AD%E5%BB%BA%E5%8D%9A%E5%AE%A2%E6%95%99%E7%A8%8B/)\n\n# 所需环境\n\n- [node](https://nodejs.org/zh-cn/)\n- [git](https://git-scm.com/)\n- [github](https://github.com/)\n\n# 全局安装 [hexo](https://hexo.io/)\n\n\n npm install hexo-cli -g\n\n\n# 新建项目\n\n hexo init blog\n cd blog\n npm install\n\n\n# 运行\n\n hexo s\n\n此时打开 不出意外是可以看到页面的\n\n\n# 插件\n\n- [hexo-admin](https://github.com/jaredly/hexo-admin)\n- [hexo-blog-encrypt](https://github.com/MikeCoder/hexo-blog-encrypt)\n- [hexo-deployer-git](https://github.com/hexojs/hexo-deployer-git)\n- [hexo-neat](https://github.com/Rozbo/hexo-neat)\n- [hexo-wordcount](https://github.com/willin/hexo-wordcount)\n- [hexo-abbrlink](https://github.com/rozbo/hexo-abbrlink)\n- [Valine](https://github.com/xCss/Valine)\n- [hexo-git-backup](https://github.com/coneycode/hexo-git-backup)\n\n\n# 主题\n\n- [hexo-theme-indigo](https://github.com/yscoder/hexo-theme-indigo)\n\n# 配置 [`_config.yml`](https://hexo.io/zh-cn/docs/configuration.html)\n\n1. 创建 `github` 仓库 `{name}.github.io`\n2. 修改 `_config.yml` 里 [deploy](https://hexo.io/zh-cn/docs/deployment.html)\n\n deploy:\n type: git\n repository: https://github.com/puzzle9/puzzle9.github.io.git\n branch: master\n\n\n使用 `https` 的地址每次 `push` 可能都需要输入用户名密码\n姑且推荐用 `git` 地址\n\n git@github.com:puzzle9/puzzle9.github.io.git\n\n# 一片新文章/新页面\n\n hexo new post {PostName}\n # `source/_posts/{PostName}`\n\n hexo new page {PageName}\n # `source/{PageName}`\n\n# 生成静态文件\nhexo g\n\n# 将本地文件推送至 github\nhexo d\n\n# hexo 命令\n\n # 启动服务\n hexo server -> hexo s\n\n # 生成静态文件\n hexo generate -> hexo g\n\n # 将本地文件推送至 github\n hexo deploy -> hexo d\n\n # other\n clean Remove generated files and cache.\n config Get or set configurations.\n deploy Deploy your website.\n generate Generate static files.\n help Get help on a command.\n init Create a new Hexo folder.\n list List the information of the site\n migrate Migrate your site from other system to Hexo.\n new Create a new post.\n publish Moves a draft post from _drafts to _posts folder.\n render Render files with renderer plugins.\n server Start the server.\n version Display version information.\n\n# other\n\n善用搜索 尤其是改样式的时候","categories":["hexo"]},{"title":"Hello World","url":"/posts/d4a1185/","content":"\n# International practice\n> hello world.\n\n# other\nhappy new year\n"}] \ No newline at end of file +[{"title":"过客","url":"/posts/eb968e3/","content":"\n突然想起来\n\n从4月来到这所城市 到现在已经有4月了\n\n要离开的话\n\n是不是要一一给印象中的人物道别\n\n为了让对方晓得这个事情嘛\n\n相遇既是缘分\n\n告诉对方\n\n自己要离开了\n\n恩 感觉还不错\n\n可是\n\n何以为家呢\n\n还有 这所城市\n\n未完成的事情\n\n牵挂的事情\n\n要怎么处理呢\n"},{"title":"城市故事","url":"/posts/ba2c0eca/","content":"\n# 陕西\n\n## 西安 省会\n\n- 车让人\n\n# 广州\n\n## 广东 省会\n\n> 白云山\n\n- 靓仔\n- 公交车去和回的路线大概率不同\n\n# 内蒙\n\n## 呼和浩特\n\n各民族要像石榴籽一样紧紧抱在一起\n\n> 大召无量寺\n> 昭君博物院\n> 塞上老街\n> 内蒙古博物馆\n> 内蒙古科学技术馆\n\n- 公交等扶稳再开\n\n## 鄂尔多斯\n\n> 成吉思汗广场\n> 鄂尔多斯市 博物馆、 图书馆\n\n# 江苏\n\n## 宿迁\n\n人间烟火气 最抚凡人心\n\n> 骆马湖\n> 三台山国家森林公园\n> 宝龙广场\n\n- 下车提前示意或按铃\n- 星爸爸的`wifi`是 `ChinaNet-Starbucks`\n- 同一个公交站 站名大概率是不同的\n\n## 徐州\n\n- 徐州东站 东、西广场\n\n# 安徽\n\n## 淮北\n\n> 相山国家森林公园\n\n- 海拔变化大且高架桥众多的\n\n# 河南\n\n## 郑州 省会\n\n> 大玉米楼\n> 河南博物院\n> 二七广场 步行街\n\n- `brt` 公交\n- 好像小区都有门\n\n# 山西\n\n## 晋中\n\n- 公交司机 站起来欢迎乘坐 `到站后请您等车辆停稳后再起身下车`\n\n## 太原 省会\n\n> 山西博物馆\n\n\n"},{"title":"百家姓认全计划","url":"/posts/da84cdef/","content":"\n> 一个地方待久了 仿佛不知道姓外有姓一般\n\n# 百家姓\n\n> 按 单姓 复姓 排序\n\n> 我看到了 `植` 才意识到 原来还有 `千家姓` `万家姓`\n\n## 单姓 444 个\n\n- [x] 1 赵(zhào)\n- [x] 2 钱(qián)\n- [x] 3 孙(sūn)\n- [x] 4 李(lǐ)\n- [x] 5 周(zhōu)\n- [x] 6 吴(wú)\n- [x] 7 郑(zhèng)\n- [x] 8 王(wáng)\n- [x] 9 冯(féng)\n- [x] 10 陈(chén)\n- [ ] 11 褚(chǔ)\n- [ ] 12 卫(wèi)\n- [x] 13 蒋(jiǎng)\n- [x] 14 沈(shěn)\n- [x] 15 韩(hán)\n- [x] 16 杨(yáng)\n- [x] 17 朱(zhū)\n- [x] 18 秦(qín)\n- [x] 19 尤(yóu)\n- [ ] 20 许(xǔ)\n- [ ] 21 何(hé)\n- [x] 22 吕(lǚ)\n- [ ] 23 施(shī)\n- [x] 24 张(zhāng)\n- [x] 25 孔(kǒng)\n- [x] 26 曹(cáo)\n- [x] 27 严(yán)\n- [ ] 28 华(huà)\n- [x] 29 金(jīn)\n- [x] 30 魏(wèi)\n- [ ] 31 陶(táo)\n- [ ] 32 姜(jiāng)\n- [ ] 33 戚(qī)\n- [ ] 34 谢(xiè)\n- [x] 35 邹(zōu)\n- [ ] 36 喻(yù)\n- [ ] 37 柏(bǎi)\n- [ ] 38 水(shuǐ)\n- [ ] 39 窦(dòu)\n- [ ] 40 章(zhāng)\n- [ ] 41 云(yún)\n- [ ] 42 苏(sū)\n- [ ] 43 潘(pān)\n- [ ] 44 葛(gě)\n- [x] 45 奚(xī)\n- [x] 46 范(fàn)\n- [x] 47 彭(péng)\n- [ ] 48 郎(láng)\n- [ ] 49 鲁(lǔ)\n- [ ] 50 韦(wéi)\n- [ ] 51 昌(chāng)\n- [x] 52 马(mǎ)\n- [ ] 53 苗(miáo)\n- [ ] 54 凤(fèng)\n- [ ] 55 花(huā)\n- [ ] 56 方(fāng)\n- [ ] 57 俞(yú)\n- [ ] 58 任(rèn)\n- [x] 59 袁(yuán)\n- [ ] 60 柳(liǔ)\n- [ ] 61 酆(fēng)\n- [ ] 62 鲍(bào)\n- [x] 63 史(shǐ)\n- [x] 64 唐(táng)\n- [ ] 65 费(fèi)\n- [ ] 66 廉(lián)\n- [ ] 67 岑(cén)\n- [x] 68 薛(xuē)\n- [ ] 69 雷(léi)\n- [x] 70 贺(hè)\n- [ ] 71 倪(ní)\n- [x] 72 汤(tāng)\n- [ ] 73 滕(téng)\n- [ ] 74 殷(yīn)\n- [ ] 75 罗(luó)\n- [ ] 76 毕(bì)\n- [ ] 77 郝(hǎo)\n- [ ] 78 邬(wū)\n- [ ] 79 安(ān)\n- [ ] 80 常(cháng)\n- [ ] 81 乐(yuè)\n- [x] 82 于(yú)\n- [ ] 83 时(shí)\n- [x] 84 傅(fù) -> 付\n- [ ] 85 皮(pí)\n- [ ] 86 卞(biàn)\n- [ ] 87 齐(qí)\n- [x] 88 康(kāng)\n- [ ] 89 伍(wǔ)\n- [ ] 90 余(yú)\n- [ ] 91 元(yuán)\n- [ ] 92 卜(bǔ)\n- [ ] 93 顾(gù)\n- [x] 94 孟(mèng)\n- [ ] 95 平(píng)\n- [x] 96 黄(huáng)\n- [ ] 97 和(hé)\n- [ ] 98 穆(mù)\n- [ ] 99 萧(xiāo)\n- [ ] 100 尹(yǐn)\n- [x] 101 姚(yáo)\n- [ ] 102 邵(shào)\n- [ ] 103 湛(zhàn)\n- [x] 104 汪(wāng)\n- [ ] 105 祁(qí)\n- [ ] 106 毛(máo)\n- [ ] 107 禹(yǔ)\n- [x] 108 狄(dí)\n- [ ] 109 米(mǐ)\n- [ ] 110 贝(bèi)\n- [ ] 111 明(míng)\n- [ ] 112 臧(zāng)\n- [ ] 113 计(jì)\n- [ ] 114 伏(fú)\n- [ ] 115 成(chéng)\n- [ ] 116 戴(dài)\n- [x] 117 谈(tán)\n- [x] 118 宋(sòng)\n- [ ] 119 茅(máo)\n- [ ] 120 庞(páng)\n- [ ] 121 熊(xióng)\n- [ ] 122 纪(jì)\n- [ ] 123 舒(shū)\n- [ ] 124 屈(qū)\n- [ ] 125 项(xiàng)\n- [ ] 126 祝(zhù)\n- [x] 127 董(dǒng)\n- [ ] 128 梁(liáng)\n- [x] 129 杜(dù)\n- [ ] 130 阮(ruǎn)\n- [ ] 131 蓝(lán)\n- [ ] 132 闵(mǐn)\n- [x] 133 席(xí)\n- [ ] 134 季(jì)\n- [ ] 135 麻(má)\n- [ ] 136 强(qiáng)\n- [x] 137 贾(jiǎ)\n- [x] 138 路(lù)\n- [ ] 139 娄(lóu)\n- [ ] 140 危(wēi)\n- [ ] 141 江(jiāng)\n- [ ] 142 童(tóng)\n- [x] 143 颜(yán)\n- [x] 144 郭(guō)\n- [ ] 145 梅(méi)\n- [ ] 146 盛(shèng)\n- [x] 147 林(lín)\n- [ ] 148 刁(diāo)\n- [ ] 149 钟(zhōng)\n- [ ] 150 徐(xú)\n- [ ] 151 邱(qiū)\n- [ ] 152 骆(luò)\n- [x] 153 高(gāo)\n- [ ] 154 夏(xià)\n- [ ] 155 蔡(cài)\n- [x] 156 田(tián)\n- [x] 157 樊(fán)\n- [x] 158 胡(hú)\n- [ ] 159 凌(líng)\n- [ ] 160 霍(huò)\n- [ ] 161 虞(yú)\n- [ ] 162 万(wàn)\n- [ ] 163 支(zhī)\n- [ ] 164 柯(kē)\n- [ ] 165 昝(zǎn)\n- [x] 166 管(guǎn)\n- [ ] 167 卢(lú)\n- [ ] 168 莫(mò)\n- [ ] 169 经(jīng)\n- [ ] 170 房(fáng)\n- [ ] 171 裘(qiú)\n- [ ] 172 缪(miào)\n- [ ] 173 干(gān)\n- [ ] 174 解(xiè)\n- [ ] 175 应(yīng)\n- [ ] 176 宗(zōng)\n- [ ] 177 丁(dīng)\n- [x] 178 宣(xuān)\n- [ ] 179 贲(bēn)\n- [x] 180 邓(dèng)\n- [ ] 181 郁(yù)\n- [ ] 182 单(shàn)\n- [ ] 183 杭(háng)\n- [ ] 184 洪(hóng)\n- [ ] 185 包(bāo)\n- [ ] 186 诸(zhū)\n- [ ] 187 左(zuǒ)\n- [ ] 188 石(shí)\n- [ ] 189 崔(cuī)\n- [ ] 190 吉(jí)\n- [ ] 191 钮(niǔ)\n- [x] 192 龚(gōng)\n- [ ] 193 程(chéng)\n- [ ] 194 嵇(jī)\n- [x] 195 邢(xíng)\n- [ ] 196 滑(huá)\n- [ ] 197 裴(péi)\n- [x] 198 陆(lù)\n- [ ] 199 荣(róng)\n- [ ] 200 翁(wēng)\n- [ ] 201 荀(xún)\n- [ ] 202 羊(yáng)\n- [ ] 203 於(yū)\n- [ ] 204 惠(huì)\n- [ ] 205 甄(zhēn)\n- [ ] 206 曲(qū)\n- [ ] 207 家(jiā)\n- [ ] 208 封(fēng)\n- [ ] 209 芮(ruì)\n- [ ] 210 羿(yì)\n- [ ] 211 储(chǔ)\n- [ ] 212 靳(jìn)\n- [ ] 213 汲(jí)\n- [ ] 214 邴(bǐng)\n- [ ] 215 糜(mí)\n- [ ] 216 松(sōng)\n- [ ] 217 井(jǐng)\n- [ ] 218 段(duàn)\n- [ ] 219 富(fù)\n- [ ] 220 巫(wū)\n- [ ] 221 乌(wū)\n- [ ] 222 焦(jiāo)\n- [ ] 223 巴(bā)\n- [ ] 224 弓(gōng)\n- [ ] 225 牧(mù)\n- [ ] 226 隗(kuí)\n- [ ] 227 山(shān)\n- [x] 228 谷(gǔ)\n- [ ] 229 车(chē)\n- [x] 230 侯(hóu)\n- [ ] 231 宓(mì)\n- [ ] 232 蓬(péng)\n- [ ] 233 全(quán)\n- [ ] 234 郗(xī)\n- [ ] 235 班(bān)\n- [ ] 236 仰(yǎng)\n- [ ] 237 秋(qiū)\n- [ ] 238 仲(zhòng)\n- [ ] 239 伊(yī)\n- [ ] 240 宫(gōng)\n- [ ] 241 宁(nìng)\n- [ ] 242 仇(qiú)\n- [ ] 243 栾(luán)\n- [ ] 244 暴(bào)\n- [ ] 245 甘(gān)\n- [ ] 246 钭(tǒu)\n- [ ] 247 厉(lì)\n- [ ] 248 戎(róng)\n- [ ] 249 祖(zǔ)\n- [x] 250 武(wǔ)\n- [x] 251 符(fú)\n- [x] 252 刘(liú)\n- [x] 253 景(jǐng)\n- [ ] 254 詹(zhān)\n- [ ] 255 束(shù)\n- [ ] 256 龙(lóng)\n- [x] 257 叶(yè)\n- [ ] 258 幸(xìng)\n- [x] 259 司(sī)\n- [ ] 260 韶(sháo)\n- [ ] 261 郜(gào)\n- [ ] 262 黎(lí)\n- [ ] 263 蓟(jì)\n- [ ] 264 薄(bó)\n- [ ] 265 印(yìn)\n- [ ] 266 宿(sù)\n- [ ] 267 白(bái)\n- [ ] 268 怀(huái)\n- [ ] 269 蒲(pú)\n- [ ] 270 邰(tái)\n- [ ] 271 从(cóng)\n- [ ] 272 鄂(è)\n- [ ] 273 索(suǒ)\n- [ ] 274 咸(xián)\n- [ ] 275 籍(jí)\n- [x] 276 赖(lài)\n- [ ] 277 卓(zhuó)\n- [ ] 278 蔺(lìn)\n- [ ] 279 屠(tú)\n- [ ] 280 蒙(méng)\n- [ ] 281 池(chí)\n- [x] 282 乔(qiáo)\n- [ ] 283 阴(yīn)\n- [ ] 284 鬱(yù)\n- [ ] 285 胥(xū)\n- [ ] 286 能(nài)\n- [ ] 287 苍(cāng)\n- [ ] 288 双(shuāng)\n- [ ] 289 闻(wén)\n- [ ] 290 莘(shēn)\n- [x] 291 党(dǎng)\n- [ ] 292 翟(zhái)\n- [ ] 293 谭(tán)\n- [ ] 294 贡(gòng)\n- [ ] 295 劳(láo)\n- [ ] 296 逄(páng)\n- [ ] 297 姬(jī)\n- [x] 298 申(shēn)\n- [ ] 299 扶(fú)\n- [ ] 300 堵(dǔ)\n- [ ] 301 冉(rǎn)\n- [ ] 302 宰(zǎi)\n- [ ] 303 郦(lì)\n- [ ] 304 雍(yōng)\n- [ ] 305 郤(xì))\n- [ ] 306 璩(qú)\n- [ ] 307 桑(sāng\n- [ ] 308 桂(guì)\n- [ ] 309 濮(pú)\n- [ ] 310 牛(niú)\n- [ ] 311 寿(shòu)\n- [ ] 312 通(tōng)\n- [ ] 313 边(biān)\n- [ ] 314 扈(hù)\n- [ ] 315 燕(yān)\n- [ ] 316 冀(jì)\n- [ ] 317 郏(jiá)\n- [ ] 318 浦(pǔ)\n- [ ] 319 尚(shàng)\n- [ ] 320 农(nóng)\n- [x] 321 温(wēn)\n- [ ] 322 别(bié)\n- [x] 323 庄(zhuāng)\n- [ ] 324 晏(yàn)\n- [x] 325 柴(chái)\n- [ ] 326 瞿(qú)\n- [ ] 327 阎(yán)\n- [ ] 328 充(chōng)\n- [ ] 329 慕(mù)\n- [ ] 330 连(lián)\n- [ ] 331 茹(rú)\n- [ ] 332 习(xí)\n- [ ] 333 宦(huàn)\n- [ ] 334 艾(ài)\n- [ ] 335 鱼(yú)\n- [ ] 336 容(róng)\n- [ ] 337 向(xiàng)\n- [ ] 338 古(gǔ)\n- [ ] 339 易(yì)\n- [ ] 340 慎(shèn)\n- [ ] 341 戈(gē)\n- [x] 342 廖(liào)\n- [ ] 343 庾(yǔ)\n- [ ] 344 终(zhōng)\n- [ ] 345 暨(jì)\n- [ ] 346 居(jū)\n- [ ] 347 衡(héng)\n- [ ] 348 步(bù)\n- [ ] 349 都(dū)\n- [ ] 350 耿(gěng)\n- [ ] 351 满(mǎn)\n- [ ] 352 弘(hóng)\n- [ ] 353 匡(kuāng)\n- [ ] 354 国(guó)\n- [ ] 355 文(wén)\n- [x] 356 寇(kòu)\n- [ ] 357 广(guǎng)\n- [ ] 358 禄(lù)\n- [ ] 359 阙(quē)\n- [ ] 360 东(dōng)\n- [ ] 361 欧(ōu)\n- [ ] 362 殳(shū)\n- [ ] 363 沃(wò)\n- [ ] 364 利(lì)\n- [ ] 365 蔚(wèi)\n- [ ] 366 越(yuè)\n- [ ] 367 夔(kuí)\n- [ ] 368 隆(lóng)\n- [ ] 369 师(shī)\n- [ ] 370 巩(gǒng)\n- [ ] 371 厍(shè)\n- [x] 372 聂(niè)\n- [ ] 373 晁(cháo)\n- [ ] 374 勾(gōu)\n- [ ] 375 敖(áo)\n- [ ] 376 融(róng)\n- [ ] 377 冷(lěng)\n- [ ] 378 訾(zǐ)\n- [ ] 379 辛(xīn)\n- [ ] 380 阚(kàn)\n- [ ] 381 那(nā)\n- [ ] 382 简(jiǎn)\n- [ ] 383 饶(ráo)\n- [ ] 384 空(kōng)\n- [x] 385 曾(zēng)\n- [ ] 386 母(mǔ)\n- [ ] 387 沙(shā)\n- [ ] 388 乜(niè)\n- [ ] 389 养(yǎng)\n- [ ] 390 鞠(jū)\n- [ ] 391 须(xū)\n- [ ] 392 丰(fēng)\n- [ ] 393 巢(cháo)\n- [ ] 394 关(guān)\n- [ ] 395 蒯(kuǎi)\n- [ ] 396 相(xiàng)\n- [ ] 397 查(zhā)\n- [ ] 398 后(hòu)\n- [ ] 399 荆(jīng)\n- [ ] 400 红(hóng)\n- [ ] 401 游(yóu)\n- [ ] 402 竺(zhú)\n- [ ] 403 权(quán)\n- [ ] 404 逯(lù)\n- [ ] 405 盖(gài)\n- [ ] 406 益(yì)\n- [ ] 407 桓(huán)\n- [ ] 408 公(gōng)\n- [ ] 443 仉(zhǎng)\n- [ ] 444 督(dū)\n- [ ] 458 晋(jìn)\n- [ ] 459 楚(chǔ)\n- [ ] 460 闫(yán)\n- [ ] 461 法(fǎ)\n- [ ] 462 汝(rǔ)\n- [ ] 463 鄢(yān)\n- [ ] 464 涂(tú)\n- [ ] 465 钦(qīn)\n- [ ] 465 归(guī)\n- [ ] 472 海(hǎi)\n- [ ] 475 岳(yuè)\n- [ ] 476 帅(shuài)\n- [ ] 477 缑(gōu)\n- [ ] 478 亢(kàng)\n- [x] 479 况(kuàng)\n- [ ] 480 后(hòu)\n- [ ] 481 有(yǒu)\n- [ ] 482 琴(qín)\n- [ ] 487 商(shāng)\n- [ ] 488 牟(móu)\n- [ ] 489 佘(shé)\n- [ ] 490 佴(nài)\n- [ ] 491 伯(bó)\n- [ ] 492 赏(shǎng)\n- [ ] 494 墨(mò)\n- [ ] 495 哈(hǎ)\n- [ ] 496 谯(qiáo)\n- [ ] 497 笪(dá)\n- [ ] 498 年(nián)\n- [ ] 499 爱(ài)\n- [ ] 500 阳(yáng)\n- [ ] 501 佟(tóng)\n- [ ] 503 言(yán)\n- [ ] 504 福(fú)\n\n## 复姓 60 个\n\n- [ ] 409 万俟(mò qí)\n- [ ] 410 司马(sī mǎ)\n- [ ] 411 上官(shàng guān)\n- [ ] 412 欧阳(ōu yáng)\n- [ ] 413 夏侯(xià hóu)\n- [ ] 414 诸葛(zhū gě)\n- [ ] 415 闻人(wén rén)\n- [ ] 416 东方(dōng fāng)\n- [ ] 417 赫连(hè lián)\n- [ ] 418 皇甫(huáng pǔ)\n- [ ] 419 尉迟(yù chí)\n- [ ] 420 公羊(gōng yáng)\n- [ ] 421 澹台(tán tái)\n- [ ] 422 公冶(gōng yě)\n- [ ] 423 宗政(zōng zhèng)\n- [ ] 424 濮阳(pú yáng)\n- [ ] 425 淳于(chún yú)\n- [ ] 426 单于(chán yú)\n- [ ] 427 太叔(tài shū)\n- [ ] 428 申屠(shēn tú)\n- [ ] 429 公孙(gōng sūn)\n- [ ] 430 仲孙(zhòng sūn)\n- [ ] 431 轩辕(xuān yuán)\n- [ ] 432 令狐(lìng hú )\n- [ ] 433 钟离(zhōng lí)\n- [ ] 434 宇文(yǔ wén)\n- [ ] 435 长孙(zhǎng sūn)\n- [ ] 436 慕容(mù róng)\n- [ ] 437 鲜于(xiān yú)\n- [ ] 438 闾丘(lǘ qiū)\n- [ ] 439 司徒(sī tú)\n- [ ] 440 司空(sī kōng)\n- [ ] 441 亓官(qí guān)\n- [ ] 442 司寇(sī kòu)\n- [ ] 445 子车(zǐ jū)\n- [ ] 446 颛孙(zhuān sūn)\n- [ ] 447 端木(duān mù)\n- [ ] 448 巫马(wū mǎ)\n- [ ] 449 公西(gōng xī)\n- [ ] 450 漆雕(qī diāo)\n- [ ] 451 乐正(yuè zhèng)\n- [ ] 452 壤驷(rǎng sì)\n- [ ] 453 公良(gōng liáng)\n- [ ] 454 拓跋(tuò bá)\n- [ ] 455 夹谷(jiá gǔ)\n- [ ] 456 宰父(zǎi fǔ)\n- [ ] 457 穀梁(gǔ liáng)\n- [ ] 466 段干(duàn gān)\n- [ ] 467 百里(bǎi lǐ)\n- [ ] 468 东郭(dōng guō)\n- [ ] 469 南门(nán mén)\n- [ ] 470 呼延(hū yán)\n- [ ] 473 羊舌(yáng shé)\n- [ ] 474 微生(wēi shēng)\n- [ ] 483 梁丘(liáng qiū)\n- [ ] 484 左丘(zuǒ qiū)\n- [ ] 485 东门(dōng mén)\n- [ ] 486 西门(xī mén)\n- [ ] 493 南宫(nán gōng)\n- [ ] 502 第五(dì wǔ)\n\n## 百家姓终\n\n## 未收录与百家姓中\n- [x] [植(zhí)](https://baike.baidu.com/item/植姓/9438660)\n- [x] [普(pǔ)](https://baike.baidu.com/item/普姓/9906793)\n- [x] [佳(jiā)](https://baike.baidu.com/item/佳姓/9648996)\n- [x] [揣(chuǎi)](https://baike.baidu.com/item/揣姓)\n- [x] [茆(máo)](https://baike.baidu.com/item/茆姓)\n- [x] [侍(shì)](https://baike.baidu.com/item/侍姓)\n- [x] [玉(yù)](https://baike.baidu.com/item/玉姓)\n- [x] [袭(xi)](https://baike.baidu.com/item/袭姓)\n\n# 备注\n\n> 《通志·氏族略》有一说法是 [443 仉(zhǎng)](https://zh.wikipedia.org/wiki/%E4%BB%89%E5%A7%93)与 [444 督(dū)](https://zh.m.wikipedia.org/wiki/%E7%9D%A3%E5%A7%93) 二个姓原是“仉督”这个复姓,但今已无此复姓。\n\n> [84 傅](https://zh.wikipedia.org/wiki/%E5%82%85%E5%A7%93) 简化成了 付\n\n# 参考\n\n- https://zh.wikipedia.org/wiki/百家姓\n- http://114.xixik.com/baijiaxing/\n"},{"title":"需求与过度设计","url":"/posts/5c9c0e4c/","content":"\n# 疫情下的责任与义务\n\n> 人啊 都要为自己想做的事情奋斗一下 不然之后想起来 可能会后悔莫及且更加后悔\n\n# 取东西\n\n## 设定\n\n把一片土地围起来\n\n再分成几大不通的区域\n\n每个区域有一个入口\n\n区域内的人不能出来\n\n外面的人进了这片土地也不能出去\n\n区域内的可以把待取的东西登记到工作人员给的纸张上\n\n再由他们同一取\n\n## 问题点\n\n用纸登记起来太麻烦 需要填写 货物类型 手机尾号 自己所在的区域\n\n工作人员要定期巡查 看有没有达到一定的量 再一起去取回来放到区域\n\n区域内的再等待他们回来后再自己寻找自己的物品\n\n## 解决方案\n\n有一款在线登记软件\n\n用户选择区域填写后\n\n工作人员那边收到通知\n\n取货后用户这边也会收到通知\n\n然后下来拿货即可\n\n## 现有解决方案\n\n设定改为配送员可以进出\n\n再给每个区域放一个货物架\n\n再由土地外的配送员直接进来把货物放到指定的货物架\n\n"},{"title":"蓝牙鼠标","url":"/posts/f03cd66b/","content":"\n# 前言\n\n> 切换双系统时不用重新配对蓝牙鼠标 当然 最简单的是买一个支持此功能的鼠标\n\n> 正常情况下 重启电脑的次数不多\n\n# 步骤\n\n## 在 `linux` 中连接鼠标\n\n![已经配置好了 所以和 `win` 显示的地址相同](linux_connect.png)\n\n假设此处显示的地址为 `2B:B4:8D:52:7B:EC`\n\n## `win` 下连接鼠标\n\n### 用设备管理器查看鼠标 `MAC`\n![](win_connect.png)\n`c397369c4843` 就是鼠标的 `MAC` 地址\n\n### 下载 `psexec`\n\n- https://learn.microsoft.com/zh-cn/sysinternals/downloads/psexec\n\n> 此处所需注册表权限 正常途径打开看不到蓝牙相关信息\n\n### 使用 `psexec` 打开 `regedit` 注册表\n\n![](psexec_regedit.png)\n\n进入 `HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\BTHPORT\\Parameters\\Keys`\n\n在目录中寻找鼠标 `MAC` 地址 `c397369c4843`\n\n![](psexec_regedit_mouse.png)\n\n截图并记录其中的\n\n- `EDIV` = `39160`\n- `ERand` = `11022681155342728302`\n- `LTK` = `cf 37 0f d5 d8 68 8d ce 89 44 8b 20 bf 0a 4b 71`\n\n## 重启到 `linux`\n关闭蓝牙\n\n进入 `/var/lib/bluetooth/${硬件蓝牙MAC}` 目录\n\n重命名 `${linux 鼠标MAC 2B:B4:8D:52:7B:EC}` 为 `${win 鼠标MAC C3:97:36:9C:48:43}`\n\n进入 `${win 鼠标MAC C3:97:36:9C:48:43}` 目录\n\n编辑 `info` 文件中的 `LongTermKey` 块\n\n### 源\n```\n[LongTermKey]\nKey=7B4C2B57D8BD9D814B0F8E77DA542378\nAuthenticated=0\nEncSize=16\nEDiv=17867\nRand=9467824016339893520\n```\n\n### 修改后\n\n- `Key` 对应 `LTK` 需 删除空格 转为 大写\n- `EDiv` 对应 `EDIV` 10进制 位数可能不同\n- `ERand` 对应 `Rand` 10进制 位数可能不同\n\n```\n[LongTermKey]\nKey=CF370FD5D8688DCE89448B20BF0A4B71\nAuthenticated=0\nEncSize=16\nEDiv=39160\nRand=11022681155342728302\n```\n\n重启蓝牙服务 `systemctl restart bluetooth`\n\n## 完成\n\n- 不出意外的话 鼠标应该连接正常了\n- 可以再重启到 `win` 试下\n\n# 常见错误\n## `psexec` 找不到网络名\n![](psexec_regedit_error_admin$.png)\n\n### 原因\n因为关闭了 `ADMIN$` 共享导致\n\n可以进入 `计算机管理` `共享` 中查看 是否有 `ADMIN$` 共享\n![](share_admin$.png)\n\n### 解决方案\n\n以 `管理员` 运行 `regedit`\n\n进入 `HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\lanmanserver\\parameters`\n新增或修改 `AutoShareWks` 和 `AutoShareServer` 格式为 `REG_DWORD` 赋值 `1`\n\n进入 `HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa`\n新增或修改 `restrictanonymous` 格式为 `REG_DWORD` 赋值 `1`\n\n重启电脑\n\n`psexec`运行完成后可以考虑反方向操作再给关闭 `ADMIN$` 共享\n\n# 参考地址\n- https://zhuanlan.zhihu.com/p/466962255\n- https://blog.csdn.net/weixin_34235457/article/details/91585503\n- https://wiki.archlinux.org/title/Bluetooth#Dual_boot_pairing\n"},{"title":"grpc","url":"/posts/2b44e58c/","content":"\n> 兴趣是最大的老师 努力作的项目也是\n\n# 初识\n\n- 它是 `google` 的产物\n- 她和`restful`有这天壤地别\n- 存在`服务端`与`客户端`\n- 有着 `json rpc` 等变种\n- 基于 `http/2` 实现\n\n# 初探\n\n- 用 `proto` 文件作为 `沟通的桥梁`\n- 可以用 `protoc` 生成指定语言的 `插件包`\n\n# 初试\n\n## 以 `nestjs` 实现 服务端 客户端\n\n- https://docs.nestjs.com/microservices/grpc\n- https://github.com/nestjs/nest/blob/master/sample/04-grpc/\n\n### 服务端\n\n### 客户端\n\n## 以 `xray` 为目标 以 `nestjs` 入手\n\n- todo\n\n### 获取 `xray` 源码\n\n```sh\ngit clone --depth 1 https://github.com/XTLS/Xray-core.git\n```\n\n### 安装编译工具\n\n```sh\n# arch\npacman -S protoc\n```\n\n```sh\nyarn global add protoc-gen-ts\n```\n\n### 编译 `proto` 生成 `扩展` 文件\n\n> 可能会有错误 具体讨论\n\n```sh\nprotoc -I=./Xray-core --ts_out=./Xray-core_ts ./**/*.proto\n```\n\n# 备注\n\n## `@grpc/proto-loader` 与 `有行为grpc.load` 的 不太一样\n\n这导致的结果就是 `nestjs` 中的 `proto` `message` 带有 `_` 的变量会直接忽略掉\n\n![文档 warning](nestjs_grpc_client_warning.png)\n\n- https://docs.nestjs.com/microservices/grpc#client\n- https://github.com/grpc/grpc-node/blob/master/packages/proto-loader/README.md\n\n# Q&A\n\n## `grpc` 和 `web server` 能不能运行在同一端口\n\n![伟大的 chat gpt 说可以 我还在尝试](qa_1.png)\n\n# 参考\n\n- https://taoshu.in/grpc.html\n- https://so1n.me/2022/01/05/Python-gRPC实践(1)--简介/\n"},{"title":"grub 丢失","url":"/posts/94b75c41/","content":"\n# 前言\n\n双系统的话 更新 或者 `bios` 升级等\n\n都概率丢失 `grub` 引导\n\n路径地址等 以实际为准\n\n以下 `cmd` 以管理员身份运行\n\n\n# 解决方案\n\n## 当 `grub` 还存在 `efi` 分区时\n\n- 查看当前默认引导\n\n`C:\\Windows\\system32>bcdedit.exe`\n\n```cmd\nWindows 启动管理器\n--------------------\n标识符 {bootmgr}\ndevice partition=\\Device\\HarddiskVolume1\npath \\EFI\\Microsoft\\Boot\\bootmgfw.efi\ndescription Windows Boot Manager\nlocale zh-CN\ninherit {globalsettings}\ndefault {current}\nresumeobject {0000000-0000-0000-0000-00000000000}\ndisplayorder {current}\ntoolsdisplayorder {memdiag}\ntimeout 30\n\nWindows 启动加载器\n-------------------\n标识符 {current}\ndevice partition=C:\npath \\Windows\\system32\\winload.efi\ndescription Windows 11\nlocale zh-CN\ninherit {bootloadersettings}\nisolatedcontext Yes\nallowedinmemorysettings 0x15000075\nosdevice partition=C:\nsystemroot \\Windows\nresumeobject {0000000-0000-0000-0000-00000000000}\nnx OptIn\nbootmenupolicy Standard\n```\n\n- 更改当前 `win11` 引导为 `grub`\n\n`C:\\Windows\\system32>bcdedit.exe /set {bootmgr} path \\EFI\\Arch\\grubx64.efi`\n\n```cmd\nWindows 启动管理器\n--------------------\n标识符 {bootmgr}\ndevice partition=\\Device\\HarddiskVolume1\npath \\EFI\\Arch\\grubx64.efi\ndescription Windows Boot Manager\nlocale zh-CN\ninherit {globalsettings}\ndefault {current}\nresumeobject {0000000-0000-0000-0000-00000000000}\ndisplayorder {current}\ntoolsdisplayorder {memdiag}\ntimeout 30\n\nWindows 启动加载器\n-------------------\n标识符 {current}\ndevice partition=C:\npath \\Windows\\system32\\winload.efi\ndescription Windows 11\nlocale zh-CN\ninherit {bootloadersettings}\nisolatedcontext Yes\nallowedinmemorysettings 0x15000075\nosdevice partition=C:\nsystemroot \\Windows\nresumeobject {0000000-0000-0000-0000-00000000000}\nnx OptIn\nbootmenupolicy Standard\n```\n\n重启后 `grub` 也就出来了\n这时候 其实也可以正常用的\n不过有时候 `grub` 配置更新挂掉了的话 `win` 引导也会有问题\n\n- 重启到 `linux` 修复引导\n\n```sh\ngrub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=Arch\nupdate-grub\n```\n- 进入 `bios` 修改默认启动顺序\n\n- 回到 `win11` 删除`gurb`引导\n\n`C:\\Windows\\system32>bcdedit.exe /set {bootmgr} path \\EFI\\Microsoft\\Boot\\bootmgfw.efi`\n\n- 修改完成\n\n## 采用 `u盘` 启动 `linux` 重建引导\n\n- 待完善\n\n# 参考地址\n- https://www.myfreax.com/no-grub-windows-linux/\n\n\n"},{"title":"git","url":"/posts/518e617c/","content":"\n不得不说 这玩意确实强大 感谢 `作者`\n\n# 浅克隆后\n\n## 完成克隆\n\n```sh\ngit fetch --unshallow\ngit config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'\n```\n\n## 取回所有分支\n\n```sh\ngit fetch --tags\n```\n\n\n# 包 `bundle`\n\n## 打包\n\n```sh\ngit bundle create name.bundle master\n```\n\n## 解包\n\n```sh\ngit clone --depth 1 ./name.bundle -b master\n```\n\n# 服务器\n\n## 开启\n\n```sh\ngit daemon --verbose --export-all --base-path=.\n```\n\n## 使用\n\n```sh\ngit clone git://ip/name\n```\n\n"},{"title":"医院科室","url":"/posts/54cc358c/","content":"\n# 心电图\n> 多通道\n\n- `12导` 常见\n- `15导` 常见\n- `18导` 急诊科常见\n\n# 化验科\n## 抽血\n- 大多需要空腹\n\n# 中医\n## 把脉\n- 人六脉 就怕不一样快\n\n# 体检科\n> 存在外包情况\n\n## 入职体检\n- `乙肝两对半` `艾滋` 不能与 `入职体检` 开在一起\n\n## 妇科检查\n- 未有`夫妻之实`不检\n"},{"title":"招呼","url":"/posts/d80ce8ad/","content":"\n# 序\n\n与人打交道\n\n难免就出现了`称呼`\n\n是啊\n\n难吗\n\n难啊\n\n# `师傅`\n\n要说起这个\n\n好像 都可以这么叫\n\n不过通常 大概率不会出现什么问题\n\n# `老师`\n\n对啊 `老师`\n\n凡是对自己有帮助的 都可以这么称呼\n\n我印象中 在 `医院` 见到的多\n\n# `[姓]职位`\n\n没这么称呼过\n\n可能 不太熟\n\n又或者 叫不出口\n\n再可能 存在这某些渊源\n\n# `[名]姐/哥`\n\n啊\n\n好像 我没这么称呼过\n\n# `[名]啊/呀/呢/哈`\n\n恩 想想\n\n符合我的习惯\n\n可是 好像又不太那么的那啥\n\n# 待定"},{"title":"实施工程师","url":"/posts/c6f1cc08/","content":"\n# 开始\n\n出去后\n\n我所代表的\n\n便是我身后的公司\n\n多么直白且实际的领悟\n\n# 问题\n\n- 记不住 `人名`\n- 容易遗忘 `人脸`\n- 脑袋记不住 `下一步`\n\n# 然后嘛\n\n- 和甲方沟通沟通需求并引导至现有功能\n- 催催开发功能\n- 跟进下第三方进度\n- 解决下现场意外问题\n- 调试下相关设备\n- 美好的一天 就这么结束啦\n\n# 再然后\n\n- 用户体验和项目交付的比重\n- 重复且无奈的数据维护\n- 现有使用习惯的更改\n"},{"title":"adb","url":"/posts/1479d6d2/","content":"\n> 当年的搞机经验随着安卓大版本的更新加上又不关注而出现了错误\n\n# 无线调试\n\n- https://developer.android.com/studio/command-line/adb?hl=zh-cn\n- https://zhuanlan.zhihu.com/p/336660319\n- https://github.com/mzlogin/awesome-adb\n\n## 安卓 `10` 以上\n\n出现了 `匹配码`\n\n- `adb pair device_ip_address:port-for-pair`\n- `adb connect device_ip_address:port-for-connect`\n\n## 安卓 `10` 以下\n\n- `adb connect device_ip_address:5555`\n\n## 常见问题\n\n### `failed to connect to device_ip_address:port`\n\n- 内网是否互通\n- 是否先连接了`匹配码`\n\n# 屏幕旋转\n- https://blog.csdn.net/jlgcumt/article/details/112955092\n- https://blog.csdn.net/mo_daizi/article/details/119210267\n\n## 禁用\n- `adb shell content insert --uri content://settings/system --bind name:s:accelerometer_rotation --bind value:i:0`\n\n## 横向\n- `adb shell content insert --uri content://settings/system --bind name:s:user_rotation --bind value:i:1`\n- `adb shell settings put system user_rotation 1`\n\n## 纵向\n- `adb shell content insert --uri content://settings/system --bind name:s:user_rotation --bind value:i:0`\n- `adb shell settings put system user_rotation 0`\n\n# 电视\n\n## tcl\n- https://zhuanlan.zhihu.com/p/349017479\n\n### 开启`adb`安装应用权限\n\n`install apk has be disabled from pm by system default!`\n\n```sh\nadb shell setprop persist.tcl.debug.installapk 1\nadb shell setprop persist.tcl.installapk.enable 1\n```","tags":["android"]},{"title":"soul","url":"/posts/d09fcb3/","content":"\n> I see you everyday\n每天见到你的时候\nDreaming about the things that I would say\n一直梦想着能跟你吐露真心\nTuesday when you looked my way\n周二那天 所幸你望了我一眼\n\n# 一些地址\n- `https://w3.soulapp.cn/activity/#/web/user?targetUserIdEcpt=${UserIdEcpt}` 个人主页\n- `https://app.soulapp.cn/app/#/interest/` 测试页面\n- `https://app.soulapp.cn/avator/#/avatar/create?sex=${sex}` 捏脸 `sex` `0` 女 `1` 男\n\n# 聊天记录\n\n## 开局\n\n- 一个 `root` 安卓手机 或者 `soul` 备份\n\n## 记录文件\n\n- `/data/data/cn.soulapp.android/files/easemobDB/${uid}.db` `新版好像放弃了`\n- `/data/data/cn.soulapp.android/files/objectbox/${uid}db/data.mdb`\n\n- `uid` 是自己帐号ID\n\n## 使用\n\n### `.db`\n\n- 采用 `sqlite3` 储存\n\n### `.mdb`\n\n- 采用 `objectbox` 储存\n\n研究中\n\n# 参考地址\n- https://github.com/search?p=1&q=soulapp.cn&type=Code\n- https://blog.csdn.net/github_39312212/article/details/122985388","tags":["soul"]},{"title":"那多次的互联网入坑指南","url":"/posts/c21a6d6d/","content":"\n# 开坑\n\n啊\n\n回忆起那时候的互联网\n\n纯白 无暇\n\n到现在的\n\n因为哦现却又必然的原因\n\n我觉得得用魔法才能打败魔法\n\n# 新建文件夹\n\n首先呢\n\n想一个不错的模式\n\n然后把大家拢起来\n\n毕竟\n\n让大家说比自己说方便多了\n\n再者\n\n加入熟悉的味道\n\n我想 应该就成了\n\n# 模式\n\n现有能想到的\n\n- __融资\n- __拉人头\n"},{"title":"人啊 是不能","url":"/posts/6b26e829/","content":"\n# 人啊 是不能闲着的\n\n闲着\n\n就容易怀疑自己\n\n产生自我否定的念想\n\n从而怀疑自己存在的意义\n\n再到思考生存的价值\n\n# 人啊 是不能穷着的\n\n穷着\n\n就觉得干啥啥不顺\n\n想干啥都得思考自己腰包够不够\n\n再到遇到什么小恩小惠就变得患得患失\n\n再来点什么外人一眼看出不对的项目\n\n自己便一身投入进去\n\n想着帮助别人来获得自己的大饼\n\n好像问题也不算那么大\n\n毕竟\n\n人嘛 得有个目标\n\n想着能获得这项目的钱也不错呀\n\n毕竟 穷怕了\n\n# 人啊 是不能饿着的\n\n饿着\n\n饿着\n\n饿着\n\n那就啥都干不了\n\n不过\n\n在目前的这个生存环境下\n\n饿亡的概率应该不大\n\n# 人啊 是不能气着的\n\n气啊\n\n生气啊\n\n都说这是用他人的过错来惩罚自己\n\n可惜这\n\n还有属于委屈的情况呢\n\n越想越气\n\n这惹我生气的人\n\n我得想点什么有趣的点子来祝福你呢\n\n# 人啊 是不能委屈着的\n\n委屈啊\n\n难过啊\n\n心塞啊\n\n心痛啊\n\n痛哭啊\n\n啊\n\n都是特别的情感\n\n至于其他动物有没有\n\n我没搜索和研究过\n\n不过\n\n我觉得狗可能有高兴和难过与生气的情感吧\n\n毕竟\n\n对\n\n毕竟\n\n# 人啊 是不能熬夜的\n\n熬夜\n\n在这夜深人静鸡犬安宁的时刻\n\n最适合反思自己了\n\n莫非这\n\n> 生前何必久睡\n\n带来的特别觉悟吗\n\n# 人啊 是不能堕落的\n\n堕落\n\n堕落\n\n还好\n\n没到坠落\n\n虽然吧 意思相差一大截\n\n可是呢 当成速度单位就行\n\n可能\n\n最后自己的脑中都能整一场大戏\n\n# 人啊 是不能整那种看不到正向反馈的\n\n正向反馈\n\n听起来多么美好\n\n毕竟作为一个群居动物\n\n而且这个自我肯定的能力又被磨完了\n\n那听点肯定自己价值的 多好\n\n# 人啊 是不能困了不睡的\n\n为了自己后代的健康\n\n为了黑发人与白发人\n\n为了爱自己的人\n\n为了双向奔放的人\n\n啊 加油\n\n# 人啊"},{"title":"记账 努力code中","url":"/posts/815dbb58/","content":"\n# 前记\n\n啊 时至今日\n\n还依稀记得网易有钱关闭的那时候\n\n我依稀记得那时候说要整个记账软件\n\n到了昨天晚上\n\n不容易的我终于决定新建文件夹了\n\n 访问后\n\n发现仓库是 `2020-12-25` 创建的\n\n不能鸽了呀\n\n# 新建文件夹\n\n回想起之前想到 `记账` 的点点滴滴\n\n已经忘记的差不多了\n\n想起来了那 `张大教主在学习师傅的太极剑后师傅说道`\n\n> 不怕不怕 忘的真快\n\n那就重新搜索下\n\n结果 发现了\n\n\n\n看了看设计的 `UI`\n\n真好看\n\n\n\n进去后发现 已经点过赞了 。。。\n\n既然如此\n\n拿我决定拿出我那`不堪入目`的 `css` 本领去仿制下\n\n# 后端思路\n\n## 复式记账\n\n一定得是`复式`\n\n为啥对这个印象这么深刻\n\n我迷迷糊糊记得 当时设计这个的时候\n\n搜索到了\n\n> 有借必有贷 借贷必相等\n\n然后 查了半天的资料\n\n发现 `借 和 贷` 按 `名词` 就可以理解\n\n如果按照`动词` 那确实和我之前的 `流水帐` 不一样\n\n啊西吧\n\n者该死的`先入者观念`\n\n# todo\n我想起来了那个 `吐泡泡的鱼`"},{"title":"倚天屠龙记 观后感 未完待续","url":"/posts/217512ca/","content":"\n# 缘起\n\n搜索 一夫多妻 制时 看到了这个答案 便想着去追一波\n\n> 张无忌的名字叫无忌,他也的确有横行无忌的本领和地位,然而他这辈子并没有做什么横行无忌的事.\n> 这里许许多多人,一齐上山来逼死了你爹爹。你别心急报仇,要慢慢的等着,只是一个也别放过。\n\n[为什么张无忌不能同时把那么多女孩都给收了? 又不是只能一夫一妻? - 亦知墨的回答 - 知乎](https://www.zhihu.com/question/35066599/answer/138106091)\n\n# 版本\n\n## 2003 苏有朋 贾静雯\n\n最开始看的便是这一版 可能因为这评分高吧\n\n> 吃苦受累释小龙 左拥右抱苏有朋\n\n这版里有两人儿时相遇情景 `坏人`\n\n## 2009 曾舜晞 陈钰琪\n\n想着 新出的 那特效应该不错 结果嘛 确实不错 尤其是慢动作的加入 留给观众无限的思考时间\n\n没记错的话 把后续那部分用了将近10集描述了下 张大教主部下的故事\n\n期间`范遥`劫刑场\n\n不过最后这个`手帕`作用真的大\n\n## 2001 吴启华 黎姿\n\n这里 晓得了 `他俩原来是互相抢亲的`\n\n再者 `殷梨亭` 的故事\n\n不过 打耳光那时候 哎呀 心疼 这大猪蹄子\n\n`阿大` 没了\n\n## 2009 邓超 安以轩\n\n这里 了解到了 原来作者写书的时候 是改过剧情的\n\n最开始的 `2003` 是最理想化的版本\n\n最后`赵敏和周芷若都用了愿望这个说法`\n\n场景复用不错\n\n## 1994 马景涛 叶童\n\n追剧中...\n\n# 剧情\n\n## 两人掉陷阱\n\n记忆深刻的 就这部分\n\n不同的版本 去的人都不同\n\n同样的中毒方式\n\n不同的展现手法\n\n其中 `2009` 这里展现最为有趣\n\n# 其他\n\n## 敢爱敢恨\n\n看完后 我一直都在思考这个问题\n\n敢爱敢恨是啥\n\n一个是明教教主 一个汝阳王之女\n\n后续想到他们的对话\n\n> 大胆妖女 跟着张无忌这淫贼造反作乱 该当何罪\n> 那罚你二人在世上做对快活夫妻 白头偕老 死后打入十八层地狱 永世不得超生\n\n好吧 我可能理解了那么一丢丢\n\n# 待续\n"},{"title":"Redmi Book Pro 2022 锐龙版 相关","url":"/posts/8e1b1957/","content":"\n# 前言\n> 以 为准\n> 也可以自己编译内核 如 [archlinux_build_kernel](https://github.com/puzzle9/archlinux_build_kernel/)\n\n# 内存问题\n> 内存持续升高 按照运行进程查看是正常的\n\n- https://unix.stackexchange.com/questions/637325/very-high-memory-usage-with-nothing-running\n- https://wiki.archlinux.org/title/Tmpfs\n\n\n以下 只适用于 `manjaro-gnome-21.3.2-220704-linux515`\n\n\n# 键盘\n```sh\nsduo pacman -S make acpica dmidecode cpio\n\ngit clone https://github.com/puzzle9/modern_laptop_manjaro\ncd modern_laptop\n\nsduo sh configure.sh\nsduo make install\nsduo make grub \nsduo make redmibook_wmi \n```\n\n# wifi / 蓝牙 `lwfinger`\n\n> 可以考虑换成 `ax210 003` 就变得简单许多了\n\n> 采用 `rtw8852be` 网卡时\n\n```sh\nsduo pacman -S linux515-headers\n```\n\n## wifi\n```sh\ngit clone git@github.com:lwfinger/rtw8852be.git\ncd rtw8852be\nmake -j8\nsduo make install\n```\n\n## 蓝牙 (暂无效)\n- \n```sh\ngit clone git@github.com:lwfinger/rtw89-BT.git\ncd rtw89-BT\nmake -j8\nsduo make install\n```\n\n# 结束\n- 重启一下试试 不出意外 完结散花\n\n# 参考\n- \n- \n\n## wifi / 蓝牙 `lwfinger`\n- \n- \n\n## wifi / 蓝牙 `lwfinger` (待尝试)\n- \n- \n\n## 内核直接修改键盘这部分问题 好吧 包没了\n- https://aur.archlinux.org/cgit/aur.git/tree/?h=linux-zen-irq1-edge-low-shared"},{"title":"Linux Firewall 防火墙","url":"/posts/6b4ea6a9/","content":"\n# 前言\n\n> 在各大主机厂商不懈努力与我们人类以栏作为动力的前提下 这个原生防火墙就变得薄弱起来了\n\n防火墙 按程序字面意思理解就是 规定什么样的数据可以出去 可以进来\n\n目前采用的是 `iptables` 和 `firewall`\n\n然后嘛 由于我觉得我学习 `iptables` 太过于有难度 便 采用了 `firewall`了\n\n当然 这两个是互斥的 都算是封装了命令行 然后交给`内核中的netfilter`去负责了\n\n# 安装\n\n## debian 11\n\n```\napt install firewalld\n```\n\n# 使用\n\n他有好几个区域 咱们默认以 `public` 区域开始\n\n善用 `tab` 键\n\n大概主要是这几个大模块 按字面意思晓得就成\n\n```sh\nfirewall-cmd --add\nfirewall-cmd --change\nfirewall-cmd --get\nfirewall-cmd --info\nfirewall-cmd --list\nfirewall-cmd --query\nfirewall-cmd --remove\n\n# 保存 没有此参数 reload 后失效\nfirewall-cmd --permanent\n# 重新载入配置 每次修改后运行后才会生效\nfirewall-cmd --reload\n# 重启配置 断开已有连接重开\nfirewall-cmd --complete-reload\n```\n\n### 获取当前的配置\n\n```sh\nroot@test:~# firewall-cmd --list-all\n# 区域名称\npublic\n target: default\n icmp-block-inversion: no\n interfaces:\n # 区域 根据不同的区域可以设定 访问 丢弃 等\n sources:\n # 可以访问的服务\n services: dhcpv6-client ssh\n # 可以访问的端口\n ports:\n protocols:\n forward: no\n masquerade: no\n forward-ports:\n source-ports:\n icmp-blocks:\n # 复杂的规则 注意别和 白名单 冲突\n rich rules:\n```\n\n### 服务\n\n```sh\n# 可设置服务列表\nfirewall-cmd --get-services\n# 开始让 https 服务对外服务\nfirewall-cmd --permanent --zone=public --add-service=https\n# 停止让 https 服务对外服务\nfirewall-cmd --permanent --zone=public --remove-service=https\n```\n\n### 端口\n\n```sh\n# 查询80 tcp 端口是否对外开放\nfirewall-cmd --zone=public --query-port=80/tcp\n# 开始让 80 tcp 端口对外服务\nfirewall-cmd --permanent --zone=public --add-port=80/tcp\n# 停止让 80 tcp 端口对外服务\nfirewall-cmd --permanent --zone=public --remove-port=80/tcp\n```\n\n### 区域 (Zone)\n\n> 每个区域对于这种 进出 都有不同的行为\n\n> 源 IP/网段 网卡 等 没关联的 就会进入 默认区域 public (匹配规则)\n\n```sh\n# 把 ip 加到 trusted 区域 白名单\nfirewall-cmd --permanent --zone=trusted --add-source=ip\n# 把 ip 移除 trusted 区域 白名单\nfirewall-cmd --permanent --zone=trusted --remove-source=ip\n\n# 把 ip 加到 drop 区域 拉黑\nfirewall-cmd --permanent --zone=drop --add-source=ip\n# 把 ip 移除 drop 区域 拉黑\nfirewall-cmd --permanent --zone=drop --remove-source=ip\n```\n\n#### 常用区域\n\n- `public` 公共区域 默认访问的这个区域\n- `block` 阻塞区域 全权拒绝 并 告知对方 我拒绝了\n- `drop` 丢弃区域 全权拒绝\n- `trusted` 信任区域 全权接受\n\n### ping icmp协议\n\n```sh\n# 开启 ping\nfirewall-cmd --permanent --zone=public --remove-icmp-block-inversion\n# 禁止 ping\nfirewall-cmd --permanent --zone=public --add-icmp-block-inversion\n```\n\n# 参考\n\n- \n- \n- \n- \n- \n- \n- \n- \n- \n","tags":["linux"],"categories":["安全"]},{"title":"linux 设置 私钥 登录","url":"/posts/6d30f440/","content":"\n# 开始\n\n## 生成证书文件\n\n> 建议服务端执行\n\n- 路径填写为 `/root/.ssh/certificate`\n\n```sh\nroot@test:~# ssh-keygen -m pem -t rsa -b 2048\nGenerating public/private rsa key pair.\nEnter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/certificate\nEnter passphrase (empty for no passphrase):\nEnter same passphrase again:\nYour identification has been saved in /root/.ssh/certificate\nYour public key has been saved in /root/.ssh/certificate.pub\nThe key fingerprint is:\nSHA256:gIBHeMyAlD66hhgo8daRjSxw0KTmAy/P9z3R+HHauS0 root@puzzl74364\nThe key's randomart image is:\n+---[RSA 2048]----+\n|=%= |\n|=oB. . |\n|+* ..+. |\n|=+. = .. |\n|+=oo . So |\n|=++ . o o . |\n|++o . o = . |\n|+. . . .. o E. |\n|. . .. .o. |\n+----[SHA256]-----+\n```\n\n### 新版会生成 `openssh` 证书 个别不支持 所以加入了 ` -m pem -t rsa -b 2048` 参数\n- https://stackoverflow.com/questions/54994641/openssh-private-key-to-rsa-private-key\n- https://stackoverflow.com/questions/66234349/convert-rsa-to-openssh\n\n\n# 复制证书文件到本地\n\n`/root/.ssh` 目录中应该生成了 `certificate` 和 `certificate.pub` 这两文件\n\n其中 `certificate` 就是咱们等哈要用到的证书 咱们先剪贴到本地保存起来\n\n再把 `certificate.pub` 重命名成 `authorized_keys`\n\n```sh\nmv certificate.pub authorized_keys\n```\n\n# 配置服务端在证书\n\n打开 `/etc/ssh/sshd_config` 文件\n\n找到这 `PubkeyAuthentication` 与 `AuthorizedKeysFile` 这两行 去掉前面的注释\n\n## 含义\n\n- `PubkeyAuthentication` 是否打开证书验证\n- `AuthorizedKeysFile` 证书验证文件 采用登录用户目录下 `.ssh/authorized_keys` 和 `.ssh/authorized_keys2` 进行验证, 我们登录的 `root` 账户的话 就在 `/root/.ssh/authorized_keys` 这个路径查找证书,如果是其他账户 就在 `/home/账户名/.ssh/authorized_keys` 这个路径下查找证书进行验证,可以添加多个路径并用 `空格` 隔开,这样就有了多私钥可以用于登录了.\n\n## 修改前\n\n```\n#PubkeyAuthentication yes\n#AuthorizedKeysFile\t.ssh/authorized_keys .ssh/authorized_keys2\n```\n\n## 修改后\n\n```\nPubkeyAuthentication yes\nAuthorizedKeysFile\t.ssh/authorized_keys .ssh/authorized_keys2\n```\n\n## 验证是否修改成功\n\n重启 `ssh` 守护进程\n\n```sh\nsystemctl restart sshd\n```\n\n采用刚剪贴到本地的证书在打开新窗口的情况下进行登录\n\n```sh\nssh -i ./certificate root@host\n```\n\n不出意外的话 这就登录成功了\n\n# 其他操作\n\n## 关闭密码登录\n\n`/etc/ssh/sshd_config` 文件中\n\n### `PasswordAuthentication`\n\n- `yes` 采用密码验证 默认 未出现此字段或注释\n- `no` 关闭密码验证\n\n```\nPasswordAuthentication no\n```\n\n## 更改`ssh`端口号\n\n```\nPort 22\n```\n\n# 参考地址\n\n- \n- \n","tags":["linux"],"categories":["安全"]},{"title":"css 学习 / 思考","url":"/posts/190a2cef/","content":"\n# 起\n\n那啥 `css` 嘛\n\n熟称`嫁衣`\n\n没有也还行\n\n# 写了一丢丢和看了快3年的css感悟\n\n- `给出怼 绝对定位 style 啥的 样式出来了就行`\n\n\n\n\n\n","tags":["study"]},{"title":"那刻爱情","url":"/posts/1e0c6aa8/","content":"\n# 序\n\n自打那天在电梯里见到你的那刻起\n\n我好像一见钟情了\n\n这是源于一个人生活太久了吗\n\n还是说\n\n体内流传了上万年的基因\n\n在这一刻显现了\n\n讲真 娃的名字我都想好了\n\n就叫 ~顾星辰~ 吧\n\n# 缘起\n\n自从那次后\n\n我每天都在努力的装做在电梯中偶然相遇\n\n与此同时\n\n我还在这相遇你的地方 打探这你的消息\n\n皇天不负有心人\n\n终于 \n\n大概晓得了你的工作规律\n\n晓得了每天乘坐电梯的时间\n\n是在上班来的那一刻\n\n在`偶然`的机会下 晓得了你的`名字`\n\n可 这个姓 想了想 却不曾见过\n\n可能 这是上天的特意的安排\n\n为了让我多认识不同的 `汉字`\n\n可是 然后呢\n\n胆小如鼠的我 却不敢卖出那么一步\n\n~再然后呢 荒废吗 不 我觉得不是~\n\n# 加缘\n\n机智的我\n\n想起来了\n\n我的朋友的 `反向版本`\n\n> 我喜欢你的一个朋友\n\n天哪 聪明的我竟然在那刻变得愚笨起来\n\n导致这话在另一个`反向版本`才想到 好在用到了\n\n# 强行加缘\n\n上次说`缘起`嘛\n\n很简单\n\n当看到一个心动的姑娘时\n\n对于自己这种`老实`的性格\n\n就会开始思考自己的不足以及对方对自己的看法和自己配不上对方的自卑\n\n这时候\n\n身体为了体验上万年的进化而让基因遗传下去而加速心跳\n\n怎么说呢 到100+那是常有的事情\n\n我想 这是为了维持大脑的高速思维\n\n再者 加上脸红\n\n不过这种技能大家都大多数再大学后就遗失了\n\n皇天不负有心人\n\n机智的我发现今天一上午都没见到她\n\n于是我决定去门口看看\n\n天哪\n\n是她 就是她 真的是她\n\n她再守门\n\n我算了下人流量 看了下时间\n\n距离她下班还有`3小时`\n\n这时候 `每3分钟`大概需要她起身开一次门\n\n她手头的制作膏药的工作`每1分钟`就完成一份\n\n再加上除去\n- `概率性`的进门 \n- `膏药` 完了后的进门 \n- `想起啥询问`的进门\n等等 等等后\n\n那我大概还有 `2个多小时`的时间\n\n可是 这该死的`拖延症`\n\n总是想着再最后\n\n她下班的时候询问\n\n毕竟明天 是自己离开的日子\n\n这样的话 产生的尴尬\n\n是可以随着时间的推移而被动化解的\n\n可是 看着她`那娄斜阳`(那撮头发) 是从额头上斜着下来的\n\n遮住那只能再正面看到那额头下的疙瘩\n\n后来 我晓得那个很神奇的是 那些顽强的疙瘩 个大概过了`2月` 还没下去\n\n看着那接近透明的耳朵\n\n又或者因为我的近视 而看成白的透明带点粉\n\n尤其是她头上那个与它人颜色不同而独一无二的粉色发卡\n\n再者是走路挺直了背的那种带来了一列微风\n\n\n\n又或者是那种 对待我们的眼中带的那种不屑\n\n我的语言不及她的十万分之二\n\n是那种出淤泥而不染的清纯 \n\n那种使用 `let me down slowly` 作为 手机铃声的人\n\n啊 好心动\n\n这真是个可爱的姑娘 得多关注关注\n\n想了这么多\n\n啊 我看她看的痴迷\n\n她在距离我不到8米的地方还在努力的制作膏药\n\n而我再距离她6.5到8米的地方 来回度步\n\n好在这个地方有3米左右宽\n\n以至于让别人觉得我不是关注她而是再做康复运动\n\n虽然这地方通常就两人 时不时有进去的 有出来的\n\n可是 我想 我这么渺小\n\n应该不会有人关注我的\n\n看了看时间 还有`一个小时`\n\n啊 不能再拖了\n\n不然 明天就见不到她了\n\n我心这么想着\n\n可是这个脚就不晓得怎么的使出了浑身泄数都给前挪动不了一步\n\n啊 我想这可能是我自己觉得我追不到吧\n\n而再内心产生了深深的自责\n\n转眼间 `半小时过去了`\n\n终于 我又想到了\n\n我可以采用`非目的性交友的询问方法`啊\n\n简单来说\n\n>是请教问题 而不是目的性很强的来询问联系方式 查户口等\n\n机智的我最终挪动了脚步在她面前趴着门选择了询问\n\n- 咱们给送礼物的多不多\n- 挺多的啊\n- 那费用大概咋样\n- 啊 有贵的有便宜的 门口那地方就有 可以选择下 你要送吗\n- 啊 我有这个想法 想来询问下你 我不知道写什么\n- 这样啊 就通常大家写的那种就行\n- 啊 好的 谢谢你 (脑子转不过来了 直接结束)\n\n再准备发动询问聊天方式的时候\n\n这时候 到开饭时间了\n\n大家都出来了\n\n当然 也到她下班时间了\n\n啊 这是第一次长时间的对话\n\n我想 这些就足够我开心好一会儿了\n\n既然这直接询问比较困难\n\n那就采用`反向版本`\n\n就像 `正向 反向 代理` 一样\n\n询问她同事她的基本信息\n\n天哪 我好聪明\n\n不过 还是得先吃饭去\n\n过了会\n\n我还在门口回味这时候\n\n注意到她换回了便装\n\n如同 `黑客帝国` 里面的`女主`的`黑大褂`一样\n\n天哪 很有气质的\n\n她还是很高的\n\n不过\n\n明天我就要离开了\n\n算算时间\n\n不晓得下次啥时候来\n\n那就先这样吧\n\n询问这个事情得碰时间和自己的运气\n\n不过神奇的是\n\n这么久 竟然没遇见她夜班\n\n# 反向版本\n\n今天\n\n是我离开的日子\n\n我想 这是我最后的机会了\n\n好在今天换了一个守门人\n\n我便询问此人\n\n她的信息\n\n结果他说 他不晓得\n\n因为她好像是最近才到这里来的\n\n不过再这之前\n\n她询问我了解这个干嘛\n\n我便又使出了脑细胞 想出了一个万能理由\n\n> 她扎针很特别 wow\n\n# 源破\n\n我承认\n\n我每当空闲的时候\n\n总会想起她的容貌\n\n我凭着现有的记忆 进行脑补\n\n想着这个 白里透粉的耳朵\n\n想着这个 特别的发卡\n\n还有额头下有没有消失的痘痘\n\n可是\n\n这么想也不是个办法啊\n\n在这个世界\n\n我不具备目测她人年龄的能力\n\n我的自卑又告诉我不能表现得太明显而产生让他人难受的事情\n\n我想\n\n我或许可以尝试忙起来\n\n而不想这个让我脑细胞加快死亡的事情\n\n# 好耶 又来了\n\n好耶 我又来了\n\n因为某种特别的原因\n\n我又来到了这里\n\n想着这2小时的车程\n\n我觉得是值得的\n\n这次 在这的时间概率和上次相同\n\n我想着 把这个`反向版本`落实到实处\n\n好在机会来了\n\n# 心火的道德\n\n>她娃都上幼儿园了\n\n???\n\n哈\n\n我不理解\n\n为什么会出现这种情况\n\n这是怎么一会事\n\n我不理解\n\n她明明看起来那么年轻\n\n为什么会已经这样呢\n\n继续采用上次的理由从她另一个同事哪里了解到了这么一句话\n\n我要做`曹操`吗\n\n我心中这时候满满的是 <红与黑> 中 的 `于连`\n\n可是他们是`彼此相爱`的啊\n\n从此\n\n我从原来再路上见到她的那种不敢直视眼睛 转为 现在的不敢直视\n\n我依旧感受到她的 风 她的 香水味\n\n我想 我是时候放弃这段缘分了\n\n转而祝福她开心快乐\n\n从此\n\n他们应该不会记得门口有一个装作在度步而想要她联系方式的人了\n\n对 他们不会在意的\n\n因为每个人都觉得自己在这里是不情愿的 且是最重要的\n\n而这又是个服务业\n\n所以\n\n我想 我理解\n\n毕竟 想了这么久 太损耗脑细胞了\n\n可是 我应该做点啥呢\n\n我不清楚\n\n再找个同事询问下是否属实\n\n我不敢 我怕这种结果\n\n啊 我为什么要询问这个事情\n\n为什么要自己找不痛快\n\n我就这样 \n\n陷入了深深的自责当中\n\n要说具体有啥体现\n\n我想 我变得有点颓废了\n\n而不喜欢这里了\n\n每天不再努力偶遇\n\n不再努力的想办法询问联系方式\n\n当然\n\n这些东西\n\n只有我自己一个人晓得\n\n一个人默默的承担\n\n啊 \n\n讲真的\n\n我不愿意你们体会这种感觉\n\n就这样 过了三四天吧\n\n我再思考\n\n我怎么变成这样了\n\n人生的目标不应该就这一个且定死\n\n这里还是有好多其他人的嘛\n\n总归是可以成为好朋友的嘛\n\n这时候\n\n爱是放手 喜欢是占有\n\n我想 我对这段话 \n\n又有了更深层次的认知了\n\n可以先听听 `let me down slowly` 再做做决定\n\n这首原唱是个男孩子 她那个手机铃声是女孩子的\n\n对于这个彩铃 这么久了\n\n大概不同的地方 有3个人是这个\n\n当然 调子也是相同的\n\n世界好小啊\n\n就这样 我度过了这次再这里的时光\n\n不过好像有她的新同事来了\n\n这真是个特别的事情\n\n看来\n\n又有小可爱们可以要体验社会的故事了\n\n# 待更\n- 偷懒中","categories":["Story"]},{"title":"php mysql 鸽","url":"/posts/ea63bc95/","content":"\n# mysql 分几组 每组查几条\n\n## 表结构 `users`\n\n|type|title|created_at|\n|:-:|:-:|:-:|\n|a|花开花下1|2022-02-14 00:26:01|\n|a|花开花落2|2022-02-14 00:28:01|\n|a|开心麻花3|2022-02-14 00:30:01|\n|a|开心啦哈4|2022-02-14 00:32:01|\n|a|开心摸哈5|2022-02-14 00:34:01|\n|b|他的故事6|2022-02-14 00:36:01|\n|b|大海卡的7|2022-02-14 00:36:01|\n|b|大海故事8|2022-02-14 00:34:01|\n|b|大海声音9|2022-02-14 00:34:01|\n|b|大海哈哈10|2022-02-14 00:34:01|\n|c|故事开始11|2022-02-14 00:39:01|\n\n### 试例\n\n#### 根据 `type` 每类根据时间排序取 `3`条\n\n```mysql\nselect number, type, title, created_at\nfrom (select @type := '', @number := 0) as rcin\n join (select @number := IF(type != @type, 1, @number + 1) as number,\n @type := type,\n title,\n type,\n created_at\n from users\n order by type, created_at desc) as nrcircirci\nwhere number <= 3\norder by created_at desc, number\n```\n\n\n# 参考资料\n- \n- \n- \n- \n\n","tags":["php","mysql"],"categories":["codes"]},{"title":"聊天中的了三两事","url":"/posts/b3833fe0/","content":"\n# 开始\n\n从何说起呢\n\n聊天 我们彼此沟通的方式之一\n\n对于话术 却有着不同的意思\n\n# 我讲明白了吗\n\n要说印象深的 就平时听到的 `你听明白了吗` 责任在你\n\n我觉得 换成 `我讲 清楚/明白 了吗` 这是责任在我的事情\n\n> [表达“我讲明白了吗?”还是“你听懂了吗?”](http://blog.sina.com.cn/s/blog_8fa253560102wbj3.html)\n\n# 听你的\n\n我记得什么时候 `随便` 一词火了\n\n然后 这个常常挂在嘴边\n\n要说印象深刻 那就在 恋爱的时候 或者关心对方的时候 \n\n问出 `吃什么` `我们干什么`\n\n然后 对方回答 `随便` 那一刻起 `心痛啊`\n\n然后 换成 `听你的` 我觉得好多了\n\n当然 这也是在哪里看到的\n\n可是 我想了想 不是不应该给多方这个机会吗\n\n# /?? `你开心我就开心`\n\n应该是这句吧 也想不起当时的意境了\n\n这话从他那开始 也到那结束\n\n是不是因为长大了\n\n还是没人再这么说过\n"},{"title":"假装相信对方可以办好这件事","url":"/posts/44e6bcf3/","content":"\n对 从 `求人 办事` 开始\n\n为啥要用 `求人` 开始呢\n\n因为这事 只有对方可以办成 自己一己之力不成\n\n然后吧\n\n我觉得 再求人的时候 留一手是很正常的一件事情\n\n当然 我也觉得 留下来的这一手不要让其他人晓得是应有的尊重\n\n不然我就觉得 你既然找我 那就是相信我 而在找我的时候 去找其他人 这是什么情况\n\n我自己也有过 也遇到过\n\n感觉 都是很难过的事情\n\n仔细想想 缘由吧\n\n大概源于 自己开始找对方之前 进行了一个评估\n\n然后 根据这个评估进行处理\n\n这应该就是常说的 `A/B` 方案\n\n我觉得最容易复现的就是借钱\n\n大概就是\n\n一次性问好多人借相同的金额\n\n至于缘由吧 我想过 没想出一个合适的结果\n\n下来复现的就是\n\n假定在厕所没纸\n\n我觉得这种问多个人是人之常情 可我又觉得 不能群发 至少得一个未回应的情况下再去问其他人\n\n或许 我的感觉就是如此吧\n\n生活嘛"},{"title":"成长 小男孩","url":"/posts/47e33e4c/","content":"\n好像 总是在悲观的时候 会写点东西\n\n来告诉自己要记录一下事情\n\n来告诉自己要活下去\n\n然后 生活嘛\n\n总是发醪糟的时候\n\n然后 记得在 `知乎` 看到过一句话\n\n> 我希望他永远不要长大 然后换个妈妈陪他玩\n\n好像 每个男人心中都有个小男孩\n\n然后 走进他的心 就是照顾好他的小男孩\n\n又好像 那个小男孩 他好会躲藏\n\n有时候 不是他没有 而是他不能被发现了\n\n生活总是赋予他好多责任 好多规则\n\n在这个圈内 小男孩久而久之的就没了\n\n然后 又看到了一句话\n\n> 我多想做个小孩 在怀里撒娇 期待你的关注\n\n就记得小时候特别爱生病\n\n然后论原因的话 \n\n就是家里人一直陪着自己\n\n那种感觉是另一种美好\n\n记得原先看过一个剧 名字又忘记了\n\n里面说\n\n> 有的人用童年治愈一生 而有的人用一生去治愈童年\n\n我 好像确实不想长大\n\n和 `soul` 那里面的 `灵魂` 一样\n\n差一个东西 而我却不知道是什么\n\n我想 是不是以后都会这样了\n\n想想自己的蠢事\n\n趋同厉害的\n\n哎\n\n哦对 还有一个\n\n为什么要努力\n\n> 为了过上比现在好的生活 \n\n然后 有时候去某些地方 感觉就像 `贫民窟`\n\n我想 努力的缘由就在这里吧\n\n","categories":["Grow"]},{"title":"vue3 学习 鸽","url":"/posts/e68c6fc5/","content":"\n# 开始\n> 当一个东西看不懂的时候 说明还没到用的时候 -9\n\n`vue3` 改变了平时写代码的习惯\n\n在`vue2`中采用的是 `Options API` 简单来说 每个区域的代码作用已经明确了\n在`vue3`中采用的是 `Composition API` 相反 每个区域并没有固定代码作用 全凭自己发挥\n\n# 基本语法\n> 既然已经来到了 `vue3` 也遇见了 `vite` 还了解到了 `TypeScript` 又有了 `setup提案` 那不如 直接用最新的技术栈开始\n\n## 文件结构\n\n```\nsrc/study\n├─ parent.vue\n└─ child.vue\n```\n\n## 那就先用 `parent.vue` 开始\n\n### vue2 js\n\n#### js\n\n```html5\n\n```\n\n```js\nexport default {\n data() {\n return {\n child_string: '在'\n }\n },\n mounted() {\n this.getStatistics()\n // this.$store.commit('title', '这个是主页')\n },\n methods: {\n getStatistics() {\n this.loading = true\n flyio.get('/statistics').then(res => {\n this.statistics = res\n this.loading = false\n })\n },\n },\n}\n```\n","tags":["js"],"categories":["vue"]},{"title":"费用感觉","url":"/posts/9aaf5a26/","content":"\n# 开始\n\n怎么说呢\n\n自己当时想的是\n\n> 在费用允许的情况下提供给客户最优解\n\n然后 可能是真的因为自己穷吧\n\n所以 在世间 对这些和钱有关的事情\n\n不晓得 如何操作\n\n又不愿意去想他\n\n当然 贵也有贵的道理\n\n然后 可是基于目前来看\n\n好像 另一种便宜的也能达到自己的预期\n\n看着他人 消费\n\n不晓得自己为何难受\n\n因为在这钱 和自己没有关系吗\n\n不过 缺失应该佩服这种\n\n他提供给了社会另一种的解决方案\n\n能用钱解决的都不算问题\n"},{"title":"代码感悟","url":"/posts/ad2bc3d9/","content":"\n# 开始\n\n怎么说呢\n\n现在的 编程语言 真的 对人类比较友好了\n\n尤其是帮助他人解决一个问题后所获得的成就感\n\n这可能是在这一行待下去的动力吧\n\n然后 想想 如何解决一个bug\n\n我觉得 这个可以写好多的\n\n还有 如何处理 原先留下的代码\n\n先写写吧 毕竟不晓得下次会鸽到啥时候呢\n\n# 理解\n\n## 工欲善其事 必先利其器\n\n这个 确实会牵扯到 `学习成本` 以及 `摸鱼成本`\n\n对于一个可以让自己吃饭的事情 一定要对他好点\n\n对于所使用的工具 如果觉得麻烦 一定要去找方便代替的东西\n\n不然 这其中浪费的时间 以及每次让自己麻烦的感觉 对于这个是很不友好的\n\n尤其是对工具的`快捷键`\n\n我们目前想干的事情 通常都有快捷键会帮助我们解决的\n\n## 站在全局思考这个 不要局限于所看到的\n\n没事的话 想一想这个代码运行的逻辑\n\n站在高处 想想 哪里会出错\n\n其实 对于 `按行调试` 以及 `无限的实错成本` 真的 很打击自己的自信心的\n\n或许 可以戴个耳机 然后 想想这个神奇的家伙\n\n对于这个`debug` 罗列几种个人认为比较牛逼的方案\n\n- 按行调试 批量注释 不要怕打印日志 \n- 整理下原先运行逻辑 重写\n- 在不影响运行的前提下 加个 `todo` 后面有时间再说\n- 问你觉得了解此问题的人\n\n我们目前遇到的问题 通常都有人已经遇到了 并且提了不错的解决方案\n\n## 精简代码 要优雅\n\n原先自己是写 `laravel` 的 也就记下了这个 `优雅`\n\n然后 玩起来了 `soraka` 好像也有这个 `gracefully`\n\n对于一个功能 `解藕` `聚合`\n\n可以尝试下\n\n哪有一大堆的设计模式 都是有存在的理由呀\n\n对于 `需求` 在开始 `架构师` 的时候 可以考虑复杂点\n\n这样 后期加需求 就不会太有难度\n\n对于 代码 争取不要写相同的 \n\n## 保持一个学习的心\n\n每到一个位置 都会遇到各式各样的 `大神`\n\n可以尝试了解下他们\n\n闲的时候 看看他们被问题急的`焦头烂额`\n\n内心偷偷乐下\n\n再去看看其他和自己类似工作的人\n\n试着聆听下他们内心深处的想法\n\n然后 `多摸摸鱼`\n\n争取压缩工作量\n\n下手之前 先思考思考这个\n\n再去楚楚他人博客\n\n去外面的世界楚楚\n\n## 保持一个好心情\n\n`bug` `code` 这玩意 毕竟是自己写出来的\n\n然后 自己还把自己急的 一批\n\n想想 这是多么有趣的一件事情啊\n\n别被自己写的东西 坏了好心情\n\n然后 要让他们晓得\n\n如果让自己生气 那可是可以重写的呢\n\n## 生活\n\n真的 入了这一行\n\n可能真的是 一入代码终不悔 从此红尘是路人\n\n可是 你也是一个人啊\n\n一个火生生的人啊\n\n可以尝试去观察下其他人\n\n看下他们 之间像一个人吗\n\n就是那种 被生活所压迫 所无奈\n\n那种 \n\n可以尝试去 娱乐项目\n\n# 终\n\n好了 \n\n大概就这么多了\n\n毕竟 电影快开场了\n\n希望不要迟到了\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","categories":["codes"]},{"title":"要送出去的礼物","url":"/posts/ee8394aa/","content":"\n# 横幅\n- [ ] 待定\n\n# 锦旗\n- [ ] 待定\n\n# 牌匾\n- [ ] 待定\n\n# 墓碑照\n- [ ] 待定\n\n# 整蛊玩具\n- 180416\n\n# 猪饲料\n- 190216\n- 191103\n- 200405\n\n# 零食大礼包\n- [ ] 待定\n\n# 毛绒玩具\n- 180304\n- 180304\n\n# 电影票\n- [ ] 待定\n\n# 围裙\n- [ ] 待定\n\n# 冥币\n- [ ] 待定","tags":["gift"],"categories":["gift"]},{"title":"要送出去的结婚礼物","url":"/posts/163aa704/","content":"\n# 硬币 `1992-2018` 年 共计 `27` 枚\n- 210101\n\n# 硬币 一大堆\n- 210101\n\n# 人民币 一大堆\n- [ ] 待定\n\n# 陶瓷情侣杯\n- 210503\n\n# 磁力球万年历\n- 210503\n\n# 一套餐具\n- [ ] 待定\n\n# 蓝牙耳机\n- [ ] 待定\n\n# 烟灰缸\n- [ ] 待定\n\n# 机械键盘\n- [ ] 待定\n\n# 邮票\n- [ ] 待定\n\n# 乌龟\n- [ ] 待定\n\n# 纪念册\n- [ ] 待定\n\n# 面包烤箱\n- [ ] 待定\n\n# 一套厨具\n- [ ] 待定\n\n# 围裙\n- [ ] 待定\n\n# 布置婚房的闹钟(思路源于知乎)\n- [ ] 待定\n","tags":["gift","wedding"],"categories":["gift"]},{"title":"部署 php","url":"/posts/dbb1ac5/","content":" \n# 所需环境\n\n- [nginx](https://nginx.org/) || [apache](https://www.apache.org/)\n- [mysql](https://www.mysql.com/cn/) || [mariadb](https://mariadb.org/)\n- [reids](https://redis.io/)\n- [php](https://www.php.net/)\n- [composer](https://getcomposer.org/)\n- [git](https://git-scm.com/)\n\n# 环境安装\n\n## 自动\n\n- 宝塔 ~虽然我不喜欢这个 可奈何不住人家人气高啊~\n- \n\n## 手动\n\n- [Debian9-x64-Install-Vhost](../d2b5014)\n\n# 部署\n\n- 项目名称 `example`\n- 访问域名 `example.test`\n- 项目目录 `/www/wwwroot/web`\n\n## 框架判断\n\n- 如果 `/www/wwwroot/web` 存在 `composer.json` 文件 那里面的 `name` 字段通常是 `框架名称`\n- 人肉分析\n\n## [laravel](https://laravel.com/) || [lumen](https://lumen.laravel.com/)\n\n### 获取源代码\n\n#### `git` 方式\n\n##### 运行\n\n```sh\ncd /www/wwwroot/\n\ngit clone --depth 1 git@github.com:puzzle/project.git web\n# 或者\ngit clone --depth 1 https://github.com/puzzle/project.git web\n```\n\n#### `文件` 方式\n\n- 下载成压缩包 服务端解压\n\n### 配置文件\n\n> 大多都是类似的 具体可看相应注释\n\n#### 复制\n\n```sh\ncd /www/wwwroot/web\ncp .env.example .env\n```\n\n#### 修改 `.env` 文件\n\n```env\n# 项目名称\nAPP_NAME=example\n# 当前运行环境 可选值 local 本地 | production 线上 | ...\nAPP_ENV=production\n# 密钥 需运行生成\nAPP_KEY=base64:hello\n# 是否开启调试模式\nAPP_DEBUG=false\n# 当前运行网址\nAPP_URL=http://example.test\n\n# 数据库连接类型\nDB_CONNECTION=mysql\n# 数据库连接地址\nDB_HOST=127.0.0.1\n# 数据库端口\nDB_PORT=3306\n# 数据库表名\nDB_DATABASE=deploy\n# 数据库用户名\nDB_USERNAME=root\n# 数据库密码\nDB_PASSWORD=root\n\n# redis 连接地址\nREDIS_HOST=127.0.0.1\n# redis 密码\nREDIS_PASSWORD=root\n# redis 端口号\nREDIS_PORT=6379\n\n# session 储存位置 可选值 file | redis | ...\nSESSION_DRIVER=redis\n\n# 队列执行方式 可选值 sync 同步 | redis 异步 | ...\nQUEUE_CONNECTION=redis\n```\n\n### 安装 `composer 包`\n\n#### 检查版本\n\n`composer --version`\n\n输出应该类似\n```\nComposer version 2.0.12 2021-04-01 10:14:59\n```\n\n#### 安装扩展包\n\n```\ncd /www/wwwroot/web\ncomposer install -vvv\n```\n\n输出应该类似\n```\nPackage manifest generated successfully.\n1 packages you are using are looking for funding.\nUse the `composer fund` command to find out more!\n```\n\n这时候 `/www/wwwroot/web` 就会存在 `vendor` 和 `composer.lock` 文件了\n\n### 生成 `key`\n\n```sh\ncd /www/wwwroot/web\nphp artisan key:generate\n```\n\n运行成功后 `.env` 文件 `APP_KEY` 将会自动填充值\n\n### 目录映射\n\n```sh\ncd /www/wwwroot/web\nphp artisan storage:link\n```\n\n### 优化应用\n\n```sh\ncd /www/wwwroot/web\n# 修改 .env 文件后 需要重新运行此命令\nphp artisan config:cache\nphp artisan route:cache\nphp artisan view:cache\n```\n\n### 设置文件夹权限\n\n- ~如果 当前终端登录用户 和 `php-fpm` 用户一致 可不用设置~\n\n```sh\ncd /www/wwwroot/web\nchmod 777 -R bootstrap storage\n```\n\n### 迁移数据库\n\n#### 根据 `sql` 判断执行顺序\n\n#### 根据实际情况运行迁移命令\n\n```sh\ncd /www/wwwroot/web\nphp artisan migrate\n```\n\n### 配置 `nginx` | `apache`\n\n#### `nginx`\n\n> \n\n```config\nserver {\n listen 80;\n server_name example.test;\n root /www/wwwroot/web/public;\n\n add_header X-Frame-Options \"SAMEORIGIN\";\n add_header X-Content-Type-Options \"nosniff\";\n\n index index.php;\n\n charset utf-8;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location = /favicon.ico { access_log off; log_not_found off; }\n location = /robots.txt { access_log off; log_not_found off; }\n\n error_page 404 /index.php;\n\n location ~ \\.php$ {\n fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;\n fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;\n include fastcgi_params;\n }\n\n location ~ /\\.(?!well-known).* {\n deny all;\n }\n}\n```\n\n#### `apache`\n\n> todo\n\n#### 访问验证\n\n如果配置成功的话 访问 `example.test` 就可以看到页面了\n\n### 定时任务(按需要添加)\n\n```sh\n* * * * * /usr/bin/php /www/wwwroot/web/artisan schedule:run >> /dev/null 2>&1\n```\n\n### 队列(按需要添加)\n\n#### [supervisor](../6992eceb)\n\n```\n[program:example]\nprocess_name=%(program_name)s\ncommand=/usr/bin/php /www/wwwroot/web/artisan horizon\nautostart=true\nautorestart=true\nuser=www\nredirect_stderr=true\nstdout_logfile=/www/wwwroot/web/storage/logs/supervisord.log\n```\n\n### 错误\n\n- 可根据 `/www/wwwroot/web/storage/logs/` 排查\n\n### 其他参考文档\n\n- [laravel deployment](https://laravel.com/docs/8.x/deployment)\n- [Laravel-Online](../dc688cb0)\n","tags":["php"],"categories":["deploy"]},{"title":"部署","url":"/posts/26b9d431/","content":"\n# 缘由\n\n好像 对于一个 `web`编程\n\n没人去写如何部署\n\n好像 这玩意已经是 从开始 就晓得 如何去做的事情了\n\n一个是开发处理 一个是运维处理\n\n然后 除此之外\n\n还可以怎么做呢\n\n\n# 部署\n\n## [php](../dbb1ac5)\n\n\n> 当然 这操作起来可能确实比较麻烦 所以 为啥不直接镜像呢","categories":["deploy"]},{"title":"Use_V2fly","url":"/posts/99ff0f64/","content":"\n你别说 \n\n> 每一个模式下都有一种特定的解决方案\n\n我记得 他好像改名了\n\n然后 就变成这样了\n\n这里 记录下 这个配置信息\n\n`v2ray.conf`\n\n```json\n{\n \"log\":{\n \"loglevel\":\"debug\"\n },\n \"inbounds\":[\n {\n \"listen\":\"127.0.0.1\",\n \"port\":7777,\n \"protocol\":\"vless\",\n \"settings\":{\n \"clients\":[\n {\n \"id\":\"uuid\"\n }\n ],\n \"decryption\":\"none\"\n },\n \"streamSettings\":{\n \"network\":\"ws\",\n \"wsSettings\":{\n \"path\":\"/path\"\n }\n }\n }\n ],\n \"outbounds\":[\n {\n \"tag\":\"direct\",\n \"protocol\":\"freedom\"\n },\n {\n \"tag\":\"blocked\",\n \"protocol\":\"blackhole\"\n }\n ],\n \"routing\":{\n \"domainStrategy\":\"AsIs\",\n \"strategy\":\"rules\",\n \"rules\":[\n {\n \"type\":\"field\",\n \"ip\":[\n \"geoip:private\"\n ],\n \"outboundTag\":\"blocked\"\n }\n ]\n }\n}\n```\n\n`nginx.conf`\n```conf\nlocation /path {\n proxy_redirect off;\n proxy_pass http://127.0.0.1:7777;\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n}\n```\n\n至于走 `cloudflare` 的话\n\n注意一点 他不支持 `三级域名`\n\n提示 `ERR_SSL_VERSION_OR_CIPHER_MISMATCH` 的话 就检查下域名吧\n\n\n参考\n\n- ","tags":["v2fly"],"categories":["v2fly"]},{"title":"Nginx_Default_Https","url":"/posts/1c592381/","content":"\n启用 `nginx` 默认的 `https` 站点\n\n就得有个证书\n\n然后就有一个 `假证书` 了\n\n\n\n```bash\nopenssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./default.key -out ./default.crt\n```\n\n```conf\nserver {\n listen 80;\n listen [::]:80;\n listen 443 ssl default_server;\n ssl_certificate /usr/local/nginx/conf/ssl/default.crt;\n ssl_certificate_key /usr/local/nginx/conf/ssl/default.key;\n server_name _;\n access_log /data/wwwlogs/default.log;\n index index.html;\n root /usr/local/nginx/html;\n}\n```\n\n然后 只要是 `https` 协议 没有匹配到站点的话 都会来到这里\n"},{"title":"Rember_Linux_Command","url":"/posts/f1af74bb/","content":"\n> 记录下几个命令\n\n然后 慢慢学习一下 得记住这些 神奇的 命令 然后 后面慢慢补文档\n\n# iptables\n\n## 当 `vps` 无公网时 可用内网任意一台上网\n\n\n\n这些命令 都在 可上网的机器上操作\n\n```\niptables -t nat -A POSTROUTING -o eth0 -s 172.16.1.0/24 -j SNAT --to 172.16.1.9\niptables -t nat -D POSTROUTING -o eth0 -s 172.16.1.0/24 -j SNAT --to 172.16.1.9\n```\n\n### 查看 `nat` 设置规则\n\n```\niptables -t nat --list\n```\n\n## 保存 `iptables` 规则\n\n```\napt-get install iptables-persistent\nUsage: /usr/sbin/netfilter-persistent (start|stop|restart|reload|flush|save)\n```\n\n# 文件查看\n\n## tail\n\n# vi\n\n## 复制 yy\n\n## 粘贴 p\n\n# 设置 `hostname`\n\n```\nhostnamectl set-hostname name\n```\n\n# `/etc/sysctl.conf `\n\n\n\n```\nfs.file-max = 1000000\nfs.inotify.max_user_instances = 8192\nnet.ipv4.tcp_syncookies = 1\nnet.ipv4.tcp_fin_timeout = 30\nnet.ipv4.tcp_tw_reuse = 1\nnet.ipv4.ip_local_port_range = 1024 65000\nnet.ipv4.tcp_max_syn_backlog = 16384\nnet.ipv4.tcp_max_tw_buckets = 6000\nnet.ipv4.route.gc_timeout = 100\nnet.ipv4.tcp_syn_retries = 1\nnet.ipv4.tcp_synack_retries = 1\nnet.core.somaxconn = 32768\nnet.core.netdev_max_backlog = 32768\nnet.ipv4.tcp_timestamps = 0\nnet.ipv4.tcp_max_orphans = 32768\n```\n","categories":["linux"]},{"title":"分词 感悟","url":"/posts/f8c48204/","content":"\n> 真的 有时 你不得不佩服人类\n\n最近 因为 `hometown` 项目需要\n\n然后开始查找 `分词`\n\n然后 就佩服起来了人类\n\n就佩服起来了这些厉害的大神\n\n然后 就有了 [jieba-api](https://github.com/puzzle9/jieba-api) 这个项目\n\n然后 我就遇到了查询中的问题了\n\n因为这是一个 `ucg` 平台\n\n所以 这个 `搜索` 显得格外的重要\n\n然后 这个是可以选择位置 再加 内容的\n\n所以 数据表就设计成了\n\n`user`\n```\nid\nnickname 昵称\n```\n\n`content`\n```\nid\ntitle 标题\nbody 内容\nprovince 省份\ncity 城市\narea 区域\naddress 地址\nuser_id 用户ID\n```\n\n然后 搜索要可以通过\n\n- 用户昵称\n- 内容标题\n- 内容省份\n- 内容城市\n- 内容区域\n- 内容地址\n\n这些条件 联合查询\n\n按照 `词性标注` 可以完成一部分\n\n用返回的 `名词` 去 `内容标题`\n用返回的 `地名` 去 `内容 省份 城市 区域 地址`\n\n如果没有返回 `名词` `地名` 就去关联 `用户表` 的 `昵称` 查询\n\n经过一系列的操作\n\n就导致了\n\n`西安肉夹馍` 可以在 位置为`西安` 搜索 标题含有`肉夹馍` 的数据\n\n`天旭流年` 可以查出来 用户昵称为 `天旭流年` 发布的数据\n\n然后 这时候 就有了一个\n\n`天旭流年 肉夹馍`\n\n按道理说 应该去查这个用户发布标题中含有 `肉夹馍` 的数据\n可是这\n\n看来我这样搜索是不对的\n\n可我觉得又不能用一堆 `if` 判断\n\n先记个 `todo` 上线后优化吧\n\n```php\n// 地名\n$ns = $participle['ns'] ?? null;\nif ($ns) {\n $db->where(function ($query) use ($ns) {\n foreach ([\n 'province',\n 'city',\n 'area',\n 'address',\n ] as $name) {\n foreach ($ns as $value) {\n $query->orWhere($name, 'like', \"$value%\");\n }\n }\n });\n}\n\n// 普通名词\n$n = $participle['n'] ?? null;\nif ($n) {\n $db->where(function ($query) use ($n) {\n foreach ([\n 'title',\n ] as $name) {\n foreach ($n as $value) {\n $query->orWhere($name, 'like', \"$value%\");\n }\n }\n });\n}\n\n/**\n * 用户昵称\n * 可能只查询用户昵称 所以 就\n */\n$author_ids = User::search('nickname', $content)->pluck('id');\nif ($author_ids) {\n if ($ns || $n) {\n $db->orWhereIn('author_id', $author_ids);\n } else {\n $db->whereIn('author_id', $author_ids);\n }\n}\n```\n\n下一个 应该是 `推荐感悟`\n","categories":["Participle"]},{"title":"Go WebHook","url":"/posts/9dd70606/","content":"\n> 要学会留坑\n\n\n\n","categories":["go","webhook"]},{"title":"Eggjs Socket","url":"/posts/e65f2c6/","content":"\n> 这两个 可是不能同时使用的呢\n\n> 这两个 可是不一样的呢\n\n可以理解成 `socket.io` 是在 `websocket` 上面封装了一层 并提供了 `断开重连` `心跳事件` 等等\n\n# websocket\n\n- \n- 可和 `http` 适用同个 `url`\n- 所有消息 都在 一个 `控制器` 下\n\n## route\n\n```ts\napp.ws.route('/ws', controller.ws.index.start)\n```\n\n## 使用方式\n\n`this.app.ws` 和 `this.ctx.websocket` 情况大部分相似 区别于 具体命令\n\n```ts\n// 给自己发消息\nthis.ctx.websocket.send()\n\n// 加入房间\nthis.ctx.websocket.room.join('room_id')\n\n// 离开房间\nthis.ctx.websocket.room.leave('room_id')\n\n// 给 room_id 房间 发送消息\nthis.app.ws.sendJsonTo('room_id', {\n body: 'hello websocket',\n})\n```\n\n# socket.io\n\n- \n- \n- 不可和 `http` 适用同个 `url`\n- 将不同的消息 分配给 不同的 `控制器`\n\n## route\n\n```ts\nconst { io } = app\nio.of('/').route('start', io.controller.index.start)\n```\n\n## namespace\n\n```ts\n namespace: {\n // 命名空间\n '/': {\n // 首次连接中间件\n connectionMiddleware: [],\n // 每次消息中间件\n packetMiddleware: [],\n },\n },\n```\n\n## 使用方式\n\n`this.app.io` 和 `this.ctx.socket` 情况大部分相似 区别于 有没有`上下文`\n\n- 此上下文指 是不是由 `socket.io` 触发的事件\n\n```ts\n// 加入房间\nthis.ctx.socket.join('room_id')\n// 离开房间\nthis.ctx.socket.leave('room_id')\n\n// 给 当前连接的用户 发送 hello 事件 的消息\nthis.ctx.socket.emit('hello', {\n body: 'hello',\n})\n\n// 给 room_id 房间 发送 hello 事件 的消息\nthis.ctx.socket.to('room_id').emit('hello', {\n body: 'hello socket',\n})\n\n// egg schedule socket\nthis.app.io.of('/').to('room_id').emit('hello', {\n body: 'hello socket no trigger',\n})\n```\n","tags":["eggjs"],"categories":["eggjs","socket"]},{"title":"redis pub sub","url":"/posts/833b4c2e/","content":"\n# 开始\n\n> 文档这玩意儿 得看 得认真看\n\n使用项目 `eggjs` `laravel`\n\n# 注\n\n- `redis` 的 `pub/sub` 基于同一 `redis` 和 `db` 无关\n- `sub` 是单项的 只能接受事件 不能发布\n- `sub` 要在 `pub` 之前启动 不然 收不到之前的消息\n\n# `egg`\n\n## `app/config/config.local.ts`\n\n相关代码\n\n```ts\nconst redis = {\n host: '127.0.0.1',\n port: 6379,\n password: 'root',\n db: 1,\n}\n\nconfig.redis = {\n clients: {\n liveSubscribe: redis,\n livePublish: redis,\n redis,\n },\n}\n```\n\n## `app/schedule/liveSubscribe.ts`\n\n```ts\nimport { Subscription } from 'egg'\n\nexport default class liveSubscribe extends Subscription {\n static get schedule() {\n return {\n type: 'worker',\n immediate: true,\n }\n }\n\n // 订阅\n async subscribe() {\n // 此处 liveSubscribe 因为 sub 事件会阻塞下一步\n // https://github.com/eggjs/egg/issues/1524#issuecomment-336918876\n\n // 此处 hometown_database_live 为 通道 之所以这么长 是因为 laravel 自带一个前缀\n this.app.redis.get('liveSubscribe').subscribe('hometown_database_live', (err, result) => {\n if (err) {\n throw err\n }\n console.log(result, 'subscribe')\n })\n\n // 此处 message 为接受到新消息\n this.app.redis.get('liveSubscribe').on('message', (channel, data) => {\n // channel 通道\n // 收到 data 传递的数据 丫丫丫丫丫丫的\n console.log(channel, JSON.parse(data))\n })\n }\n\n // 发布\n async publish() {\n // 此处 livePublish 为 另一个 redis 进程 也可以用 redis\n // 此处 hometown_database_comment 为 通道名\n this.app.redis.get('livePublish').publish(\n 'hometown_database_comment',\n JSON.stringify({\n body: '收到一个新的',\n }),\n )\n }\n}\n```\n\n# laravel\n\n## `config/database.php`\n\n```php\n'options' => [\n 'cluster' => env('REDIS_CLUSTER', 'redis'),\n // 就这个前缀 `hometown_database_`\n 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),\n],\n```\n\n## 相关代码\n\n```php\nuse Illuminate\\Support\\Facades\\Redis;\n\n// 订阅 这个进程会一直卡住 推荐不要这么设计\npublic function subscribe()\n{\n // 至于这里为什么这么短 因为他自己加了前缀 hometown_database_comment\n Redis::subscribe(['comment'], function ($message)\n {\n // $message 收到一个新的\n \\Log::info($message);\n });\n}\n\n// 推送\npublic function publish()\n{\n // live 通道名 全称应为 hometown_database_live\n // 给 hometown_database_live 发送数据\n $count = Redis::publish('live', json_encode([\n 'body' => '丫丫丫丫丫丫的',\n ]))\n\n // 如果此通道有人监听 那么他就不是0\n\n return $count;\n}\n```\n\n# 其他\n\n## 如果发了收不到\n\n- 那么 可以可虑适用 `redis` 相关命令 监听这个`通道` 如 `SUBSCRIBE hometown_database_live`\n\n- 检查是否开启了`通道`功能\n\n# seo\n\n- egg laravel redis 订阅\n- node php redis 订阅\n- redis subscribe publish\n\n# 参考\n\n- \n- \n\n# 完工\n","tags":["egg","laravel"],"categories":["redis"]},{"title":"Docker Compose","url":"/posts/1514963b/","content":"\n> 工具 就是为懒人服务的 不要怕学习成本 努力学习吧\n\n先说说这个格式 `docker-compose.yml`\n\n```yml\nversion: '3.8'\nservices:\n nginx:\n image: nginx:stable-alpine\n restart: always\n volumes:\n - ./conf:/etc/nginx/conf.d\n - /vhost:/vhost\n network_mode: host\n mariadb:\n image: mariadb:10.5.8\n volumes:\n - ./data:/var/lib/mysql/data\n environment:\n MYSQL_USER: root\n MYSQL_ROOT_PASSWORD: root\n ports:\n - 3306:3306\n redis:\n image: redis:alpine\n command: redis-server --requirepass root\n ports:\n - 6379:6379\n```\n\n# version\n\n\n- 此文件适配版本 当然 越新越好\n\n# services\n- 服务 要干嘛\n","categories":["Docker"]},{"title":"Snap Start","url":"/posts/b06348b1/","content":"\n> 你别说 这个 确实方便\n\n# 感悟\n\n\n\n这个 对于什么软件 一个命令下去 就完成了\n\n关键是 他还是一个用着感觉不错的\n\n和`linux`自带的包管理器不同的是 他的软件 多 而且把大部分已经配置完成了\n\n不过 大多数都是 `gui` 的\n\n# 遇到的错误\n\n## snap-confine has elevated permissions and is not confined but should be. Refusing to continue to avoid permission escalation attacks\n\n\n\n```sh\nsystemctl enable --now apparmor.service\n```\n\n# 更改默认位置 `/var/lib/snapd`\n\n\n\n> 为什么不用软连接 因为 `apparmor` 不支持\n\n先停止\n```sh\nsystemctl stop snapd\n```\n\n再把整个目录移过去\n```sh\nmv /var/lib/snapd /opt/snapd\n```\n\n再创建个目录\n```sh\nmkdir /var/lib/snapd\n```\n\n再修改挂载方式\n\n`/etc/fstab`\n```\n/opt/snapd /var/lib/snapd none bind 0 0\n```\n\n再挂载下\n```sh\nmount -a\n```\n\n再启动\n```sh\nsystemctl start snapd\n```\n\n完美","categories":["snap"]},{"title":"Docker Start","url":"/posts/e9c4d07d/","content":"\n# 文档\n\n- [Docker —— 从入门到实践](https://yeasy.gitbook.io/docker_practice/)\n\n# 安装\n\n## arch\n\n```\npacman -S docker docker-composer\n```\n\n# 启用\n\n```\nsystemctl enable docker\nsystemctl start docker\n```\n\n# 镜像\n\n\n\n`/etc/docker/daemon.json`\n\n```\n{\n \"registry-mirrors\": [\n \"https://hub-mirror.c.163.com\",\n \"https://mirror.baidubce.com\"\n ]\n}\n```\n\n# 使用方式\n\n# 名词解释\n\n- `docker` 镜像 容器 仓库 等区别\n- `docker` 是个啥\n\n## 仓库\n\n\n\n- 一个 类似于 `github` 的东西 由大家上传 我们下载的是 `镜像`\n- 存在 `公开` 和 `私有`\n\n## 镜像\n\n- 一个由自己或他人打包后的东西 类似于 `ghost` `iso` `安装包` 等\n- 存在层级关系 一级一级的\n\n## 容器\n\n- 运行 `镜像` 的东西 相当于我们的电脑\n- 我们对他有所有权 `创建` `删除` `启动` 等等\n\n## 储存 (数据卷)\n\n- `容器` 的保存文件 相当于 我们的 `硬盘`\n- 可 `内置` `容器`删除 或者挂掉 此数据直接丢失 \n- 可 `外挂` `容器` 的任何变化 和这个无关\n\n## 宿主机\n\n- 相当于 `网吧` 这个称呼 其里面的电脑 都可以称呼为 `容器`\n- 相当于 `寄生虫` 所寄生的物体\n- 在这里 相当于 我们操作`容器`时候的电脑\n\n## 网络\n\n存在 `5` 种类型 常用 前`3`种\n\n### `none` 无网络\n\n- 断网模式\n\n### `host` 直接映射\n\n- `容器` 内部端口 和 `宿主机` 端口相同 不需要再次映射\n\n### `bridge` 桥接\n\n- 每个 `容器` 都有一个本地未被占用的 私有网段\n- 每个 `容器` 都有一个独立 `ip`\n- 未配置 `互通` 时 连个`容器` 不能连接\n- `容器` 内端口 可和 `宿主机` 端口不同\n\n### `container`\n### `user-defined`\n\n## `Dockerfile`\n\n- `镜像` 制作脚本\n\n## `docker-compose`\n\n- 一个 `Dockerfile` 批量管理软件\n\n## `k8s`\n\n- 一个 `容器` 批量管理软件\n\n# 遇到的错误\n\n# 更改默认位置 `/var/lib/docker`\n\n## 软连接\n\n```sh\nmv /var/lib/docker /opt/docker\nln -s /opt/docker /var/lib/docker\n```\n\n## 挂载方式\n\n```sh\nmv /var/lib/docker /opt/docker\nmkdir /var/lib/docker\n```\n\n`/etc/fstab`\n```\n/opt/docker /var/lib/docker none bind 0 0\n```\n\n```sh\nmount -a\n```","tags":["install"],"categories":["docker"]},{"title":"Manjaro Start","url":"/posts/3f94b605/","content":"\n# 安装\n\n## 镜像\n\n\n\n## 安装方式\n\n// todo\n\n## 源\n\n### archlinux\n`/etc/pacman.d/mirrorlist`\n```\nServer = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch\n```\n\n### archlinuxcn\n`/etc/pacman.conf`\n```\n[archlinuxcn]\nServer = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch\n```\n\n# 美化\n\n## 图标\n\n\n\n## 应用程序\n\n\n\n## `gnome` 插件\n\n- \n\n- \n\n- \n\n- \n\n- \n\n## 终端\n\n- \n\n- \n\n# 软件\n\n## 输入法\n\n- 仅适用于 `fcitx`\n\n### 开启输入法支持\n\n- \n\n`.pam_environment` 或 `.xprofile`\n\n```\nGTK_IM_MODULE DEFAULT=fcitx\nQT_IM_MODULE DEFAULT=fcitx\nXMODIFIERS DEFAULT=@im=fcitx\n```\n\n### 搜狗拼音 \n\n\n\n因为 `2.4.0` 不支持 账户登录 放弃\n\n### rime\n\n\n\n#### 皮肤\n\n\n\n## 其他\n\n","tags":["install"],"categories":["manjaro"]},{"title":"Eggjs-start","url":"/posts/b963359a/","content":"\n> 讲真 这是个神奇的框架\n\n# Q&A\n\n## 如何只运行一次\n\n- 如 `redis` 监听\n\n### `egg-schedule`\n\n\n\n`app/schedule/{name}.js`\n\n```js\nimport { Subscription } from 'egg'\n\nexport default class Live extends Subscription {\n static get schedule() {\n return {\n type: 'worker',\n immediate: true,\n }\n }\n\n async subscribe() {\n console.log('eggjs 只运行一次')\n }\n}\n```\n\n### `agent.js / app.js`\n\n\n\n`app.js`\n\n```js\nexport default class App {\n app\n\n constructor(app) {\n this.app = app\n }\n\n // 启动成功后运行\n async willReady() {\n console.log('eggjs 只运行一次')\n }\n}\n```\n\n","tags":["eggjs"],"categories":["eggjs"]},{"title":"NuxtJs","url":"/posts/8b4b6af6/","content":"\n> 讲真 学习是最简单的事情\n\n碎碎念下 `NextJs`\n\n# nuxt.config.js\n\n确实是字面意思理解 可能存在`bug`\n\n\n\n`mode` 渲染方式\n\n- `universal` 每个页面都是静态页面\n- `spa` 单页面 同原来的 `vue-cli`项目\n\n注 当 `target` 为 `server` 是全程需要服务端参与的\n\n\n\n`target`\n\n- `server` 需要服务端参与\n- `static` 全静态\n\n"},{"title":"干部网络学院 分析","url":"/posts/b22f63aa/","content":"\n# 感悟\n\n- `flash` 的故事 还等继续\n- `IE` 也是个必需品\n- `Win` 还是得有\n- 常用编码还是得一眼可以看出\n\n不过 当成功的那一刻 真的体验是很不一样的\n\n# 分析\n\n## `GET` `education/Student-MyResource` 课程列表\n\n```js\n $(function(){\n // 完成课程ID 学完后会变成绿色\n var coursewareIdsArr=[6851, 6852];\n setTimeout(function(){\n var courseware=$(\".movie\").children(\"a\");\n $.each(coursewareIdsArr,function(i,o){\n $.each(courseware,function(ii,oo){\n if(oo.id==\"courseware_\"+o){\n $(oo).css(\"color\",\"green\");\n }\n })\n });\n },1000)\n })\n```\n\n## `POST` `/education/FindStudentLessonCourseWare` 课程详情\n\n### 请求\n\n```\n%7BcourseID%3A3544%2CcourseWareID%3A6851%2CidentityID%3A0%7D\n```\n\n```\n{courseID:3544,courseWareID:6851,identityID:0}\n```\n\n### 响应\n\n```\n{\"courseID\":null,\"courseName\":null,\"courseWareID\":null,\"courseWareName\":null,\"historyUrl\":null,\"message\":\"success\",\"personStudyInfo\":null,\"rows\":[{\"courseID\":3544,\"courseNO\":\"\",\"courseName\":\"\",\"courseTime\":39.00,\"courseWareID\":6851,\"courseWareName\":\"\",\"id\":506913,\"identityID\":2,\"insID\":130,\"isFinish\":0,\"lessonLocation\":0.00,\"personID\":1977634295,\"planID\":0,\"sessionTime\":0,\"startDT\":\"2020-07-31 13:18:00\",\"studyPersonNum\":545,\"studyStatue\":\"completed\",\"studyTime\":60.45,\"studyTimeBak\":0,\"text\":\"\",\"validIdentityID\":\"\",\"validOrganID\":\"\"}],\"sysPerson\":null,\"total\":1}\n```\n\n#### 主要字段\n\n- `studyStatue` string 学习状态 有两值 `completed` 完成 `incomplete` 学习中\n- `studyTime` number 已有时间\n- `courseTime` number 有效时间\n\n## `POST` `/education/EditStudentLessonCourseWare` 更新学习进度\n\n### 请求\n\n#### `headers`\n\n|key|value|\n| --- | --- |\n|Content-Type| application/x-www-form-urlencoded |\n|Cookie| GSESSIONID HWWAFSESID HWWAFSESTIME |\n\n#### `bodys`\n\n|key|value|\n| --- | --- |\n|jsonString| value |\n\n- jsonString\n\n```\n%7BcourseID%3A3544%2CcourseName%3A%22%22%2CcourseNO%3A%22%22%2CcourseWareID%3A6852%2CcourseWareName%3A%22%22%2CstudyTime%3A60%2CsessionTime%3A4%2CcourseTime%3A41%2CstudyStatue%3A%22completed%22%2ClessonLocation%3A0%2CidentityID%3A0%2CisFinish%3A1%2CstartDT%3A%222020-07-31+13%3A02%3A34%22%7D\n```\n\n```\n{courseID:3544,courseName:\"\",courseNO:\"\",courseWareID:6852,courseWareName:\"\",studyTime:60,sessionTime:4,courseTime:41,studyStatue:\"completed\",lessonLocation:0,identityID:0,isFinish:1,startDT:\"2020-07-31 13:02:34\"}\n```\n\n同上 主要字段\n\n貌似 `studyTime` 不能超过 `999`\n\n## `GET` `/education/updateStuInfo` 更新备用学习时间 作用未知\n\n```js\n//异步请求更新备用学习时间\nfunction updateStuInfo(time){\n $.ajax({\n type:\"get\",\n url:\"/education/updateStuInfo\",\n data:{studyTimeBak:time,courseID:3544},\n dataType:\"json\",\n success:function(data){\n }\n });\n}\n\nstuTimeStart=new Date().getTime();\n//eclipse编译\nsetInterval(function() {\n updateStuInfo(stuTimeStart);\n stuTimeStart=new Date().getTime();\n}, 600000);\n```\n这时间是一小时一次 不过如果点击结束 也会更新一次\n"},{"title":"Node Package","url":"/posts/afecc083/","content":"\n> 所以 为什么要为难自己 直接用 `cnpm` 不好吗\n\n\n# package\n\n## npm\n\n```sh\nnpm config set registry https://registry.npm.taobao.org\nnpm config set disturl https://npm.taobao.org/dist\nnpm config set electron_mirror https://npm.taobao.org/mirrors/electron/\nnpm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/\nnpm config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/\n```\n\n## yarn\n\n```sh\nyarn config set registry https://registry.npm.taobao.org -g\nyarn config set disturl https://npm.taobao.org/dist -g\nyarn config set electron_mirror https://npm.taobao.org/mirrors/electron/ -g\nyarn config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/ -g\nyarn config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/ -g\nyarn config set chromedriver_cdnurl https://cdn.npm.taobao.org/dist/chromedriver -g\nyarn config set operadriver_cdnurl https://cdn.npm.taobao.org/dist/operadriver -g\nyarn config set fse_binary_host_mirror https://npm.taobao.org/mirrors/fsevents -g\n```\n\n","tags":["node"]},{"title":"SSH-Config","url":"/posts/cc802263/","content":"\n# git\n\n对于相同的域名不同用户的 `git` `秘钥` 就会产生神奇的问题\n\n## 解决方案\n\n### 先在 `~/.ssh/` 建立一个 `rsa` 文件夹保存`秘钥`\n\n### 再生成一个`秘钥`\n\n```\nssh-keygen\n```\n\n路径那部分输入绝对地址 `/home/puzzle/.ssh/rsa/github`\n\n### 新建或修改 `~/.ssh/config`\n\n```\nHost 名称\n HostName 主机名\n IdentityFile 秘钥绝对地址\n```\n\n比如\n\n```\nHost github\n HostName github.com\n IdentityFile /home/puzzle/.ssh/rsa/github\n```\n\n### 更改`git`地址\n\n```\n// 规则\ngit@名称:路径\n\n// 原先\ngit@github.com:puzzle9/the_elderly_are_available.git\n\n// 现在\ngit@github:puzzle9/the_elderly_are_available.git\n```\n\n### 把新`秘钥`绑定过去\n\n```\ncat ~/.ssh/rsa/github.pub\n```\n\n### 再改下仓库地址 再试下\n","tags":["git","ssh"],"categories":["git"]},{"title":"FaceApi","url":"/posts/c17c0e93/","content":"\n> face_recognition face api\n\n\n\n真的 有一种感觉\n\n当一个语言用习惯后 用另一个的时候 会完全不知所措\n\n这地方就写更新日记吧 也可能没有后话了\n\n# changelog\n\n## 2020年03月04日\n\nstart\n\n\n","tags":["flask","face","python"],"categories":["face"]},{"title":"About-Back-End","url":"/posts/895e2f42/","content":"\n> 作为一名优秀的后端,切记要口吐芬芳,切记不可对后端使用.\n\n我还记得在原先的自己 写了一片文章 叫做 [About-ForeEnd](/posts/2115d056)\n\n没想到\n\n阴差阳错的 我也成为了一个前端\n\n看到后端的接口\n\n确实头是大的\n\n感觉可能是自己太过于善良了吧\n\n然后 每天有一个致命问题 \n\n> name, 现在 item 什么情况.\n\n这种问题 感觉怎么回答都不好说\n\n在知乎看到一个问答\n\n\n\n> 两天是预计能交给你的时间,2小时可能实际工作时间。\n\n这么说 确实是真相\n\n好像越来越明白为什么在寒假最后一天\n\n那个效率如此至高\n\n想想 难道不有趣吗\n\n这个也一样\n\n就是最后一天\n\n效率很高\n\n但是\n\n合作的话\n\n就不一样了啊\n\n因为对于这个项目 整体把控\n\n不在自己手里\n\n遇到的什么 `bug` 什么的 瞬间可以让自己头大\n\n然后 有时候还有伤心什么的\n\n算算 确实头疼\n\n对于以后写接口\n\n我会和项目人员\n\n一切把这个项目梳理清楚\n\n然后开始工作\n\n> 接口是前端写的,因为他们最清楚需要什么.切不可通后端意向来写\n\n大概确实是这么一个情况\n\n~~你说客户想的简单嘛 简单~~\n\n实现起来 复杂吗 复杂\n\n我们都是程序员\n\n又何苦为难自己人呢\n\n","tags":["back-end","other"],"categories":["back-end"]},{"title":"程序思维","url":"/posts/20ba694/","content":"\n# 2020年02月20日19:01:13\n\n有时候写着写着 就会陷入一种误区 最明显的就是 `拦截器` `if` 嵌套\n\n路由跳转 没登录跳登录 有登录则判断是否有用户信息 没有则跳用户信息获取页 有则继续执行\n\n## 第一次代码\n\n```js\n// 路由名称\nrouteName = 'singIn'\n\n// 是否登录\nif (!isSignIn) {\n // 跳登录\n} else {\n // 是否存在用户信息\n if (!isHaveUserInfo) {\n // 判断路由是否跳 获取用户信息\n if (routeName != 'getUserInfo') {\n // 跳获取用户信息页\n }\n }\n\n // next\n}\n```\n\n## 第二次代码\n\n由于觉得上面太过于繁琐 而且 `if` 嵌套 觉得可以写一起 就有了下面版本\n\n```js\n// 路由名称\nrouteName = 'singIn'\n\n// 是否登录\nif (!isSignIn) {\n // 跳登录\n} else {\n // 是否存在用户信息 和 路由是否为 获取用户信息页\n if (!isHaveUserInfo && routeName != 'getUserInfo') {\n // 跳获取用户信息页\n }\n\n // next\n}\n```\n\n## 以后阅读\n\n觉得注释太过于直白 单词是直接可以看出意思的 所以删掉注释\n\n```js\nrouteName = 'singIn'\n\nif (!isSignIn) {\n\n} else {\n if (!isHaveUserInfo && routeName != 'getUserInfo') {\n\n }\n\n // next\n}\n```\n\n所以 我这到底写的什么 运行着确实挺明确的\n\n可是 这两个 `!` 是怎么运作的\n\n从第一次到最终 大概过了那么一小时左右\n\n我感觉 可能写出来还好点\n\n实际证明 好像没什么多大作用\n\n还是很迷糊\n\nemmmm\n\n## 第三次\n\n我又觉得 好像他完全可以写到一起\n\n# 2021年05月27日18:27:13\n\n有时候\n\n真的 设计思路比写代码更加重要\n\n一个需求 经过怎么样的变化 都能撑住\n\n这是多么厉害的设计呀\n\n说的这个有时候得想好久的 就是关于时间的查询了\n\n```php\n$format = 'Y-m-d H:m:s';\n$time = date($format);\n$time_before = date($format, strtotime('- 1day'));\n$time_after = date($format, strtotime('+ 1day'));\n\n// 下来 就是判断这个时间了\n// 正常想的是 $time_before < $time < $time_after\n// 然后 写就成了\n\nif ($time_after < $time && $time_before > $time) {\n # code...\n}]\n\nif ($time_after < $time && $time < $time_after) {\n # code...\n}\n\n// 我就在想\n// 为啥没得一个 这种判断呢\n// 符合人力阅读的一个写法 再不用去看这个脑中转换半天了\n\nif ($time_after < $time < $time_after) {\n # code...\n}\n```\n\n# next\n","categories":["Program"]},{"title":"WeChat-Domain","url":"/posts/9a49bf96/","content":"\n不得不说 有时候真的挺佩服那种 `升维` 思路的\n\n微信域名 防封 想想 确实很厉害\n\n实现思路确实可以\n\n不过真的觉得需要好好看看 了\n\n# 跳浏览器打开\n\n核心代码\n\n- 给 `Content-Type` 一个浏览器不认识的值\n- 再 `Content-Disposition` 来一个下载\n\n\n正常情况下\n\n`安卓` 会跳到浏览器 再请求下这个地址\n\n然后就是 `User-Agent` 开心的时刻了\n\n\n","tags":["WeChat"]},{"title":"PHP-Permission-Denied","url":"/posts/75ef94a2/","content":"\n> 有时候 你觉得你的代码没啥毛病 可还是有毛病的时候 请查看你的项目更新文档\n\n今天 升级 `php73` 到 `php74` 时候\n\n一直访问不到 `/home` 目录\n\n提示 `failed to open dir: Permission denied in`\n\n用伟大的`排除法` 排除一堆后\n\n还是决定看官方论坛\n\n\n\n然后就看到了这个 \n\n最后发现 是因为 `php-fpm.service` 更新了 `ProtectHome`\n\n最后\n\n```\nsystemctl edit php-fpm\n\n[Service]\nProtectHome=false\n```\n\n可能 喜欢上的就是 解决后的这种喜悦感吧\n\n>gl\n","categories":["PHP"]},{"title":"WeChat-Chat","url":"/posts/89155308/","content":"\n# 需要\n\n- `root` 的 `Android`\n- 强大的电脑\n\n# 开始\n\n```\n/data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml\n/data/data/com.tencent.mm/MicroMsg/${userid}/EnMicroMsg.db\n```\n\n# key 计算\n\n`imei` 双卡的话 看 `卡2`\n`uni` 位于 `system_config_prefs.xml` `default_uin`\n\n`md5(imei + uin)` 后 取前 `7` 位\n\n他两个都是 `int` 类型的\n\n# 工具\n\n[wxsqlcipher.exe](https://github.com/contr4l/MicromsgHistory/raw/master/wxsqlcipher.exe)\n\n# 后续\n\n导出 `message` 表就可以\n\n# 参考\n\n- \n- \n- \n- \n","tags":["WeChat"],"categories":["WeChat-Chat"]},{"title":"Use-Boot-Repair","url":"/posts/fa699abf/","content":"\n`#` 状态下\n\n```\nadd-apt-repository ppa:yannubuntu/boot-repair\napt-get update\napt-get install boot-repair\n```\n\n","categories":["linux"]},{"title":"Set-Linux-Time","url":"/posts/ccfc973d/","content":"\n查看当前时间 `date`\n查看当前时区时间 `date -R`\n\n> 使用 `tzselect` 来设置时区\n\n> 使用 `timedatectl` 来更改时区\n\n timedatectl set-timezone 'Asia/Shanghai'\n","categories":["linux"]},{"title":"Use-Js-Promise","url":"/posts/63cccf39/","content":"\n>对于异步的一点更简单的操作\n\n```js\n// es6\nlet promise = new Promise((resolve, reject) => {\n // do ……\n\n // success .then()\n resolve()\n\n // error .catch()\n reject()\n })\n\n// use\npromise.then((res) => {\n\n }).catch((err) => {\n \n })\n\n```","tags":["Promise"],"categories":["js"]},{"title":"Use-Python3","url":"/posts/f18aca02/","content":"\n> 人生苦短,我用python.\n\n# install\n\n[安装](../d2b5014/#python3)\n\n# plug\n\n## pip\n \n### 使用国内源\n\n vi ~/.pip/pip.conf\n\n # 豆瓣\n [global]\n timeout = 6000\n index-url = https://pypi.douban.com/simple\n trusted-host = https://pypi.douban.com\n\n### 升级版本\n\n py3 -m pip install --upgrade pip\n\n### 导出当前项目已经安装的扩展\n \n pip freeze > requirements.txt\n\n### 安装导出的扩展\n\n pip install -r requirements.txt\n\n## virtualenv\n\n\n\n### install\n\n pip3 install virtualenv\n ln -s /usr/local/py3/bin/virtualenv /usr/bin/virtualenv\n\n### other\n\n virtualenv --no-site-packages name\n cd name\n\n source name/bin/activate\n\n deactivate\n\n## requests\n\n\n\n### install\n \n pip3 install requests\n\n### other\n\n\n\n## BeautifulSoup\n\n\n\n\n### install\n \n pip3 install beautifulsoup4 lxml\n","tags":["ptyhon3"],"categories":["ptyhon3"]},{"title":"Debian9-x64-Install-Vhost","url":"/posts/d2b5014/","content":"\n# 一键安装脚本\n\n\n\n\n# ssh\n\n apt-get install sshpass\n sshpass -p 'password' ssh -i '.pem' username@ip\n\n# Get Ready\n \n useradd www\n usermod -L www\n\n apt-get update\n apt-get upgrade\n apt-get purge apache nginx mysql\n apt-get install g++ make libpcre3 perl psmisc curl wget\n\n mkdir -p /vhost/tmp/\n mkdir -p /vhost/phpx/\n mkdir -p /vhost/down\n cd /vhost/down\n\n# [nginx](http://nginx.org/)\n\n## install\n \n curl -O http://zlib.net/zlib-1.2.11.tar.gz\n curl -O https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz\n curl -O https://www.openssl.org/source/openssl-1.1.0g.tar.gz\n curl -O http://nginx.org/download/nginx-1.14.0.tar.gz\n\n tar -zxf zlib-1.2.11.tar.gz\n tar -zxf pcre-8.41.tar.gz\n tar -zxf openssl-1.1.0g.tar.gz\n tar -zxf nginx-1.14.0.tar.gz\n\n cd nginx-1.14.0\n\n ./configure --prefix=/vhost/nginx --with-pcre=/vhost/down/pcre-8.41 --with-zlib=/vhost/down/zlib-1.2.11 --with-openssl=/vhost/down/openssl-1.1.0g --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module \n\n make&&make install\n\n rm -rf /usr/local/bin/nginx\n\n ln -s /vhost/nginx/sbin/nginx /usr/local/bin/\n\n# [php7.2](http://php.net/)\n\n## freetype\n\n wget https://sourceforge.net/projects/freetype/files/freetype2/2.9/freetype-2.9.tar.gz/download -O freetype-2.9.tar.gz\n tar zxf freetype-2.9.tar.gz\n cd freetype-2.9\n ./configure --prefix=/usr/local/freetype2\n make&&make install\n\n## install\n\n apt-get install libxml2 libxml2-dev libcurl4-openssl-dev pkg-config libssl-dev libjpeg-dev libfreetype6-dev libmcrypt-dev libxslt1-dev libicu-dev\n\n curl -O http://php.net/distributions/php-7.2.8.tar.xz\n\n xz -dk php-7.2.8.tar.xz\n tar xf php-7.2.8.tar\n\n cd php-7.2.8\n\n ./configure --prefix=/vhost/phpx/php7.2.8 --with-config-file-path=/vhost/phpx/php7.2.8/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir --with-freetype-dir=/usr/local/freetype2 --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir --enable-xml --enable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --enable-intl --enable-pcntl --enable-ftp --with-gd --with-openssl --with-mhash --enable-sockets --with-xmlrpc --enable-zip --enable-soap --with-gettext --enable-fileinfo --enable-opcache --enable-exif \n\n make&&make install\n\n rm /usr/local/bin/php\n\n ln -s /vhost/phpx/php7.2.8/bin/php /usr/local/bin/\n\n mkdir -p /vhost/phpx/opcachecache /vhost/phpx/session /vhost/phpx/uploadtmp\n chmod 777 -R /vhost/phpx/opcachecache /vhost/phpx/session /vhost/phpx/uploadtmp\n\n## etc\n\n### php.ini\n\n sed -i \"s#^post_max_size = 8M#post_max_size = 128M#\" php.ini-production\n sed -i \"s#^upload_max_filesize = 2M#upload_max_filesize = 128M#\" php.ini-production\n\n echo '\n session.save_path = '/vhost/phpx/session'\n opcache.file_cache = '/vhost/phpx/opcachecache'\n upload_tmp_dir = '/vhost/phpx/uploadtmp'\n ' >> php.ini-production\n\n cp php.ini-production /vhost/phpx/php7.2.8/etc/php.ini\n\n\n### php-fpm.conf\n\n vi /vhost/phpx/php7.2.8/etc/php-fpm.conf\n\n [www]\n\n user = www\n group = www\n\n listen = /dev/shm/php72.sock\n\n pm = dynamic\n\n pm.max_children = 5\n\n pm.start_servers = 3\n\n pm.min_spare_servers = 3\n\n pm.max_spare_servers = 5\n\n## plug\n\n### mongodb\n \n apt-get install autoconf m4 automake libtool \n\n curl -O https://pecl.php.net/get/mongodb-1.5.2.tgz\n tar zxf mongodb-1.5.2.tgz\n cd mongodb-1.5.2\n /vhost/phpx/php7.2.8/bin/phpize\n ./configure --with-php-config=/vhost/phpx/php7.2.8/bin/php-config \n make&&make install\n\n sed -i 'extension=mongodb.so' /vhost/phpx/php7.2.8/etc/php.ini\n\n### composer\n \n curl -sS https://getcomposer.org/installer | php\n mv composer.phar /usr/local/bin/composer\n\n chmod 777 /usr/local/bin/composer\n\n#### /etc/profile\n\n vi /etc/profile\n\n #composer\n export PATH=\"$PATH:{user root}/.config/composer/vendor/bin/\" \n\n or\n\n echo '\n #composer\n export PATH=\"$PATH:{user root}/.config/composer/vendor/bin/\" \n ' >> /etc/profile\n\n# [mariadb](https://www.mariadb.org/)\n\n## install\n\n mkdir /vhost/mysqlData\n rm -rf /usr/local/mysql /etc/my.cnf /etc/init.d/mysql\n\n apt-get install libaio-dev\n\n wget http://ftp.cc.uoc.gr/mirrors/mariadb//mariadb-10.3.8/bintar-linux-x86_64/mariadb-10.3.8-linux-x86_64.tar.gz\n\n tar -zxf mariadb-10.3.8-linux-x86_64.tar.gz\n\n mv mariadb-10.2.13-linux-x86_64 /usr/local/mysql\n\n## my.cnf\n\n memTotal=`free -m | grep Mem | awk '{print $2}'`\n\n # 选取合适的配置文件\n if [[ ${memTotal} -lt 64 ]]; then\n # 小于64m\n mysqlCnf='my-small'\n elif [[ ${memTotal} -ge 64 && ${memTotal} -lt 128 ]]; then\n # 64m 到 128m\n mysqlCnf='my-medium'\n elif [[ ${memTotal} -ge 128 && ${memTotal} -lt 512 ]]; then\n # 128m 到 512m\n mysqlCnf='my-large'\n elif [[ ${memTotal} -ge 512 && ${memTotal} -lt 4096 ]]; then\n # 512m 到 4096m\n mysqlCnf='my-huge'\n elif [[ ${memTotal} -ge 4096 ]]; then\n # 大于 4096m\n mysqlCnf='my-innodb-heavy-4G'\n fi\n\n cp /usr/local/mysql/support-files/${mysqlCnf}.cnf /etc/my.cnf\n\n## add user\n \n groupadd mysql\n useradd -g mysql mysql \n chown root:mysql -Rf /usr/local/mysql\n chmod +x -Rf /usr/local/mysql\n chown mysql:mysql /etc/my.cnf\n\n## install data\n\n /usr/local/mysql/scripts/mysql_install_db --user=mysql --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/vhost/mysqlData --force\n\n chgrp -R mysql /vhost/mysqlData\n\n cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql\n sed -i \"s#^datadir=.*#datadir='/vhost/mysqlData'#\" /etc/init.d/mysql\n chmod 777 /etc/init.d/mysql\n\n## up user\n \n systemctl enable mysql.service\n systemctl start mysql.service\n\n /usr/local/mysql/bin/mysqladmin -u root password 'root'\n /usr/local/mysql/bin/mysql -uroot -proot -e \"drop database test;use mysql;delete from db;delete from user where user = '';delete from user where password = '';flush privileges;\";\n\n systemctl stop mysql.service\n\n## del more\n \n mkdir /usr/local/mysqlSmail\n mv /usr/local/mysql/bin /usr/local/mysqlSmail\n mv /usr/local/mysql/share /usr/local/mysqlSmail\n rm -rf /usr/local/mysql/\n mv /usr/local/mysqlSmail /usr/local/mysql/\n\n## ln -s\n\n rm -f /usr/bin/mysql /usr/bin/mysqldump\n ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql\n ln -s /usr/local/mysql/bin/mysqldump /usr/bin/mysqldump\n\n# [mongodb](https://www.mongodb.org/)\n\n## install\n\n rm -rf /usr/local/mongodb\n mkdir -p /vhost/mongodb/data\n chmod 777 /vhost/mongodb/data\n\n\n #curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-debian92-4.0.0.tgz\n curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgz\n tar -zxf mongodb-linux-x86_64-4.0.0.tgz -C /usr/local/\n\n mv /usr/local/mongodb-linux-x86_64-4.0.0 /usr/local/mongodb\n\n rm -f /usr/local/bin/mongo /usr/local/bin/mongod\n\n ln -s /usr/local/mongodb/bin/mongo /usr/local/bin/mongo\n ln -s /usr/local/mongodb/bin/mongod /usr/local/bin/mongod\n\n## conf\n \n vi /usr/local/mongodb/mongodb.conf\n\n dbpath=/vhost/mongodb/data\n logpath=/vhost/mongodb/mongodb.log\n fork=true\n logappend=true\n auth=true\n port=27017\n\n# [node](https://nodejs.org/)\n\n## install\n\n rm -rf /usr/local/node\n\n curl -O https://nodejs.org/dist/v8.11.3/node-v8.11.3-linux-x64.tar.xz\n\n xz -dk node-v8.11.3-linux-x64.tar.xz\n tar xf node-v8.11.3-linux-x64.tar\n\n mv node-v8.11.3-linux-x64 /usr/local/node\n\n chmod 777 -R /usr/local/node\n\n## /etc/profile\n vi /etc/profile\n\n #node\n export PATH=\"$PATH:/usr/local/node/bin/\"\n\n or\n\n echo '\n #node\n export PATH=\"$PATH:/usr/local/node/bin/\"\n ' >> /etc/profile\n\n# [python3](https://www.python.org/)\n\n## install\n \n wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz\n\n xz -dk Python-3.7.0.tar.xz\n tar xf Python-3.7.0.tar.xz\n\n cd Python-3.7.0\n\n mkdir -p /usr/local/py3\n\n ./configure --prefix=/usr/local/py3\n\n make&&make install\n\n rm -rf /usr/bin/py3*\n\n ln -s /usr/local/py3/bin/python3 /usr/bin/py3\n ln -s /usr/local/py3/bin/pip3 /usr/bin/pip3\n\n# [reids](https://redis.io/)\n\n## install\n \n rm -rf /usr/local/redis\n\n wget http://download.redis.io/releases/redis-4.0.11.tar.gz\n tar xzf redis-4.0.11.tar.gz\n mv redis-4.0.11 redis\n cd redis\n make\n\n rm -f /usr/local/bin/redis*\n\n mkdir -p /usr/local/redis/bin/\n\n mv src/redis-server /usr/local/redis/bin/\n mv src/redis-cli /usr/local/redis/bin/\n\n ln -s /usr/local/redis/bin/redis-server /usr/local/bin/\n ln -s /usr/local/redis/bin/redis-cli /usr/local/bin/\n\n## conf\n\n mkdir /vhost/redis\n\n sed -i \"s#^dir ./#dir /vhost/redis/#\" /vhost/down/redis/redis.conf\n sed -i \"s#^daemonize no/#daemonize yes#\" /vhost/down/redis/redis.conf\n sed -i 'requirepass root' /vhost/down/redis/redis.conf\n\n rm -rf /usr/local/redis/redis.conf\n cp /vhost/down/redis/redis.conf /usr/local/redis/redis.conf\n\n## question\n\n> 2018年08月06日12:21:07\n~~echo 'net.core.somaxconn = 511' > /etc/sysctl.conf~~\n~~echo 'vm.overcommit_memory = 1' > /etc/sysctl.conf~~\n\n\n\techo 'net.core.somaxconn = 511' >> /etc/sysctl.conf\n\techo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf\n\n echo '\n if test -f /sys/kernel/mm/transparent_hugepage/enabled; then\n echo never > /sys/kernel/mm/transparent_hugepage/enabled\n fi\n ' >> /etc/rc.local\n\n sysctl -p\n\n# [git](https://git-scm.com/)\n\n## install\n\n apt-get install libpcre3 libpcre3-dev tk perl cpio gettext\n\n curl -O https://www.kernel.org/pub/software/scm/git/git-2.18.0.tar.xz\n\n xz -dk git-2.18.0.tar.xz\n tar xf git-2.18.0.tar\n\n cd git-2.18.0\n\n ./configure --prefix=/usr/local/git-2.18.0\n\n make&&make install\n \n rm /usr/local/bin/git\n ln -s /usr/local/git-2.18.0/bin/git /usr/local/bin\n\n# end\n\n## vhost\n\n vi /vhost/vhost.sh\n\n```shell\n#!/bin/bash\nsudo echo\n\nfristPage() {\n echo -e '\n ==================================================================\n\n start || restart || stop\n\n =================================================================='\n}\n\n# php\nphpStart() {\n echo 'start php'\n sudo /vhost/phpx/php7.2.8/sbin/php-fpm\n sudo chmod 777 /dev/shm/php72.sock\n}\n\nphpStop() {\n echo 'stop php'\n sudo killall php-fpm\n}\n\nphpRestart() {\n echo 'restart php'\n phpStop\n phpStart\n}\n\n# nginx\nnginxStart() {\n echo 'start nginx'\n sudo nginx\n}\n\nnginxStop() {\n echo 'stop nginx'\n sudo nginx -s stop\n}\n\nnginxRestart() {\n echo 'restart nginx'\n sudo nginx -s reload\n}\n\n# mysql\nmysqlStart() {\n echo 'start mysql'\n sudo systemctl start mysql.service\n}\n\nmysqlStop() {\n echo 'stop mysql'\n sudo systemctl stop mysql.service\n}\n\nmysqlRestart() {\n echo 'restart mysql'\n sudo systemctl restart mysql.service\n}\n\n# mongo\nmongoStart() {\n echo 'start mongo'\n mongod -f /usr/local/mongodb/mongodb.conf\n}\n\nmongoStop() {\n echo 'stop mongo'\n mongod --shutdown -f /usr/local/mongodb/mongodb.conf\n}\n\nmongoRestart() {\n echo 'restart mongo'\n mongoStop\n mongoStart\n}\n\n# redis\nredisStart() {\n echo 'start redis'\n redis-server /usr/local/redis/redis.conf\n}\n\nredisStop() {\n echo 'stop redis'\n redis-cli -a root shutdown\n}\n\nredisRestart() {\n echo 'restart redis'\n redisStop\n redisStart\n}\n\n# vhost\nvhostStart() {\n echo 'start'\n phpStart\n nginxStart\n mysqlStart\n mongoStart\n redisStart\n}\n\nvhostStop() {\n echo 'stop'\n phpStop\n nginxStop\n mysqlStop\n mongoStop\n redisStop\n}\n\nif [[ $1 ]]; then\n\n if [[ $2 ]]; then\n ${2}Restart\n fi\n\n if [[ $1 == 'start' ]]; then\n vhostStart\n elif [[ $1 == 'stop' ]]; then\n vhostStop\n fi\nelse\n fristPage\nfi\n```\n\n chmod 777 /vhost/vhost.sh\n ln -s /vhost/vhost.sh /usr/local/bin/vhost\n\n","tags":["php","nginx","mariadb","mongodb","node","python3","redis","git"],"categories":["vhost"]},{"title":"Use-Supervisor","url":"/posts/6992eceb/","content":"\n> ubuntu 18.04 x64\n\n apt-get install supervisor\n\n默认配置文件 `/etc/supervisord.conf`\n\n项目配置文件 `/etc/supervisor/conf.d/`\n\n```conf\n[program:app]; 程序名称 在 supervisorctl 中通过这个值来对程序进行一系列的操作 \nautorestart=true; 程序异常退出后自动重启\nautostart=true; 当 supervisord 启动的时候也自动启动\nredirect_stderr=true; 把 stderr 重定向到 stdout,默认 false\nenvironment=PATH=\"/usr/local/bin/\"; 需要的环境变量\ncommand=php artisan up; 启动命令\nuser=www ; 启动用户\ndirectory=/wwwroot/; 程序的启动目录\nstdout_logfile_maxbytes=20MB; stdout 日志文件大小.默认 50MB\nstdout_logfile_backups=20; stdout 日志文件备份数\nstdout_logfile=/data/supervisor/app.log stdout 日志保存目录\n```\n\ninput `supervisorctl` learn more ","tags":["supervisor"]},{"title":"Laravel-Online","url":"/posts/dc688cb0/","content":"\n> laravel 5.6\n\n# .env\n\n```\nAPP_ENV=production\nAPP_DEBUG=false\n```\n\n# mix\n```\nnpm run prod\n```\n\n# artisan\n\n```\nphp artisan key:generate\n\nphp artisan route:clear \nphp artisan route:cache \n\nphp artisan config:clear \nphp artisan config:cache \n\nphp artisan view:clear \nphp artisan view:cache\n \nphp artisan storage:link\n```\n\n# crontab\n\n```\n* * * * * /usr/local/php/bin/php /data/wwwroot/jingle_school/artisan schedule:run >> /dev/null 2>&1\n```\n\n# supervisor\n\nuse [supervisor](../6992eceb)\n\n## queues\n\n```\n[program:jingle_school_horizon]\nprocess_name=%(program_name)s\ncommand=/usr/local/php/bin/php /data/wwwroot/jingle_school/artisan horizon\nautostart=true\nautorestart=true\nuser=www\nredirect_stderr=true\nstdout_logfile=/data/supervisor/jingle_school_horizon.log\n```\n\n## broadcasting\n\nuse [laravel-echo](../6539c6d1)\n\n```\n[program:jingle_school_echo]\nprocess_name=%(program_name)s\nenvironment=PATH=\"/usr/local/node/bin/\"\ndirectory=/data/wwwroot/jingle_school/\ncommand=/usr/local/node/bin/laravel-echo-server start\nautostart=true\nautorestart=true\nuser=www\nredirect_stderr=true\nstdout_logfile=/data/supervisor/jingle_school_echo.log\n```\n\n### nginx\n\n```\nserver {\n \n ……\n\n location /socket.io/ {\n proxy_pass http://127.0.0.1:6001;\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n }\n \n ……\n\n}\n```\n\n# other\n\n## .env APP_ENV 参数\n\n> \n\n1. 开发: local\n2. 测试: testing\n3. 预上线: staging\n4. 正式环境: production\n\n## 关于线上 `queues` 不运行\n\n检查下 `.env` `APP_ENV` 是否为 `production`\n\n然后 再看 报错 这类\n","tags":["Online","socket.io","supervisor"],"categories":["Laravel"]},{"title":"Laravel-Use-Laravel-Echo","url":"/posts/6539c6d1/","content":"\n> laravel 5.6\n\n> laravel-echo 这个是个大家伙\n\n这东西 文档看不彻底 是没办法操作的\n\n先是\n\n1. [node](https://nodejs.org/)\n2. [redis](https://redis.io/) \n\n再是\n\n1. [队列](https://laravel.com/docs/5.6/queues)\n2. [事件系统](https://laravel.com/docs/5.6/events)\n3. [广播系统](https://laravel.com/docs/5.6/broadcasting)\n\n还有\n\n1. [laravel-echo-server](https://github.com/tlaverdure/laravel-echo-server)\n2. [laravel-echo](https://www.npmjs.com/package/laravel-echo)\n3. [socket.io-client](https://www.npmjs.com/package/socket.io-client)\n\n然后就 敬请的踩坑吧\n\n他们三者之间的关系\n我理解的是 先是触发事件 -> 事件到队列后 -> 在由广播给通知出来\n\n# 关于 这个家伙\n\n然后 在 `laravel` 中的 `broadcasting (广播系统)` 主要是 `服务端` 给 `客户端` 推送消息的\n\n然后在 这个 `广播系统` 中有三种 `广播类型`\n\n- `Channel` \n- `Private` \n- `Presence` \n\n这个区别\n\n`Channel` 公开 所有人不用订阅就可以访问\n`Private` `and` `Presence` 这两个 ~~必须在用户登录后才可以订阅~~\n\n这个区别 后者是好像是 可以监听到 来者的 `here` `joining` `leaving` 这几个事件\n\n对于这个 先是定义一个事件\n\n php artisan make:event \n\n```php\n// App\\Events\\Rss;\n\nnamespace App\\Events;\n\nuse Illuminate\\Broadcasting\\Channel;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Broadcasting\\PrivateChannel;\nuse Illuminate\\Broadcasting\\PresenceChannel;\nuse Illuminate\\Foundation\\Events\\Dispatchable;\nuse Illuminate\\Broadcasting\\InteractsWithSockets;\nuse Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast;\n\n/*\nimplements ShouldBroadcast 这部分是重点\nhttps://laravel.com/docs/5.6/notifications\n */\nclass Rss implements ShouldBroadcast\n{\n use Dispatchable, InteractsWithSockets, SerializesModels;\n\n /**\n * Create a new event instance.\n *\n * @return void\n */\n public function __construct()\n {\n //\n }\n\n /**\n * Get the channels the event should broadcast on.\n *\n * @return \\Illuminate\\Broadcasting\\Channel|array\n */\n public function broadcastOn()\n {\n /*\n 这里的 read 是 频道名\n Channel PrivateChannel PresenceChannel 这些则是 广播类型\n */\n return new Channel('read');\n return new PrivateChannel('read');\n return new PresenceChannel('read');\n }\n\n public function broadcastWith()\n {\n // 这是 广播内容\n return ['name' => \\Carbon\\Carbon::now()->toDateTimeString()];\n }\n}\n\n```\n\n对于 `PrivateChannel` 和 `PresenceChannel` 这种类型的\n则需要进行授权访问\n\n先去 `config\\app.php` 中\n`取消` 注释 `App\\Providers\\BroadcastServiceProvider::class,`\n\n因为 那是我们授权的路由\n\n php artisan make:channel Ordel\n\n这条命令主要是防止 路由 文件肿大 是 `laravel 5.6` 新增功能\n\n再到 `routes\\channels.php` 中注册一个验证授权的路由\n\n```php\n// 这个 只对私有频道 起作用\n// 这里 read 也是频道名 \nBroadcast::channel('read', Ordel::class);\n\n// 对于 PrivateChannel 频道返回 boolean\nBroadcast::channel('read', function () {\n return true;\n});\n\n// 对于 PresenceChannel 则是 文档吧\n```\n\n然后 具体的 看 \n\n# 关于 使用 `laravel-echo-server`\n\n`laravel-echo-server init` 运行后 按照那提示来\n\n运行后 会在 项目根目录生成一个 `laravel-echo-server.json` 文件\n\n```json\n{\n \"authHost\": \"网站地址 同 .env APP_URL\",\n // 授权地址 默认就可以 用于 `PrivateChannel` 和 `PresenceChannel`\n \"authEndpoint\": \"/broadcasting/auth\",\n\n // laravel-echo-server client:add APP_ID 使用此命令生成 主要用于 api\n // https://github.com/tlaverdure/laravel-echo-server#api-clients\n \"clients\": [\n {\n \"appId\": \"APP_ID\",\n \"key\": \"79329842613b84ecca054c3a7afa3c63\"\n }\n ],\n \"database\": \"redis\",\n \"databaseConfig\": {\n // 关于 redis 的设置 就直接用感觉来 不得行就查文档\n \"redis\": {\n \"password\": \"root\"\n },\n \"sqlite\": {\n \"databasePath\": \"/database/laravel-echo-server.sqlite\"\n }\n },\n \"devMode\": false,\n \"host\": null,\n \"port\": \"6001\",\n \"protocol\": \"http\",\n \"socketio\": {},\n \"sslCertPath\": \"\",\n \"sslKeyPath\": \"\",\n \"sslCertChainPath\": \"\",\n \"sslPassphrase\": \"\",\n \"apiOriginAllow\": {\n \"allowCors\": false,\n \"allowOrigin\": \"\",\n \"allowMethods\": \"\",\n \"allowHeaders\": \"\"\n }\n}\n```\n\n使用 `laravel-echo-server start` 来运行此服务\n\n\n# 关于 使用 `laravel-echo`\n\n```js\nimport Echo from 'laravel-echo'\n\nwindow.io = require('socket.io-client')\n\nwindow.Echo = new Echo({\n broadcaster: 'socket.io',\n host: window.location.hostname + ':6001'\n});\n\n// 监听频道\n// 公开频道\nEcho.channel('read')\n\n// 私有频道\nEcho.private('read')\n\n// 监听事件\n.listen('Rss', (e) => {\n console.log(e)\n})\n\n// 对于 PresenceChannel 频道 则可以监听到 以下 事件\n.here((e) => {\n\n})\n.joining((e) => {\n\n})\n.leaving((e) => {\n\n})\n\n// 加入频道\n.join('频道名')\n\n// 离开频道\n.leave('频道名')\n```\n\n# 关于推送一个广播\n\n```php\nevent(new App\\Events\\Rss());\n```\n\n最后 别忘记了 运行队列\n\n# end\n大概就酱 想到再补充","tags":["php","Lravel","Horizon","Queues","Events","Broadcasting"],"categories":["Laravel"]},{"title":"About-Js-String-Length","url":"/posts/e194a176/","content":"\n在 `js` 中获取字符串长度\n\n查了 半天 资料\n\n看了那好几种方案\n\n为何不直接用 `.length` 呢\n\n\n\n> ~~To be or not to be,~~ that is the question.","categories":["js"]},{"title":"Laravel-Use-Authorization","url":"/posts/18c87807/","content":"\n> laravel 5.6\n\n\n\n只有登陆后才可以判断\n\n传入的第一个参数必须是 `User` 模型 第二个字段是自定义内容\n\n返回值\n`true` 表示有权限\n`false` 表示无权限\n\n# 创建\n php artisan make:policy PostPolicy --model=User\n\n# 编辑 `App\\Policies\\PostPolicy`\n\n默认有 `view` `create` `update` `delete` 这几种方法\n\n```php\n\n// 在 Policy 中会在所有方法执行前调用\npublic function before(User $user)\n{\n # code...\n}\n\npublic function view(User $user, $post)\n{\n return $user->id == $post->user_id\n}\n\n```\n\n# 注册 `App\\Providers\\Policies`\n \n```php\n// 第一种\nprotected $policies = [\n 'App\\Models\\User' => 'App\\Policies\\PostPolicy',\n];\n\n// 第二种\npublic function boot()\n{\n $this->registerPolicies();\n\n Gate::define('checkId', function ($user, $id) {\n return $user->id == $id;\n });\n\n Gate::define('update articles', 'ArticlePolicy@update');\n}\n```\n\n# 使用\n\n\n##Gate 门面:\n\n Gate::allows('update articles', $article)\n Gate::denies('update articles', $article)\n\n## Controller:\n\n $this->authorize('update articles', $article)\n\n## Blade 模板:\n\n @can('update articles', $article)\n @cannot('update articles', $article)\n\n## User Model 实例:\n\n $user->can('update articles', $article)\n $user->cannot('update articles', $article)\n\n# other\n\n## 为何会想到这个\n\n源于自己的一个提问 ([增删改查中如何防止横向越权?](https://segmentfault.com/q/1010000015750015))\n感谢 [ibrand](https://segmentfault.com/u/ibrand) 回答\n\n>横向越权操作和纵向越权操作。前者指的是攻击者尝试访问与他拥有相同权限的用户的资源;而后者指的是一个低级别攻击者尝试访问高级别用户的资源。\n\n\n>比方说 前端传来一个 id\n后端进行增删改查\n如何防止 有效的用户 对 非自己的 资源进行操作\n在 `laravel` 中应该把这部分代码放在哪里\n\n## 关于认证失败返回 403 而不是 401 错误\n\n### [原文](http://www.dirv.me/blog/2011/07/18/understanding-403-forbidden/index.html)\n\n>Understanding 403 Forbidden\n18 July 2011\nThere’s a problem with 401 Unauthorized, the HTTP status code for authentication errors. And that’s just it: it’s for authentication, not authorization. Receiving a 401 response is the server telling you, “you aren’t authenticated--either not authenticated at all or authenticated incorrectly--but please reauthenticate and try again.” To help you out, it will always include a WWW-Authenticate header that describes how to authenticate.\nThis is a response generally returned by your web server, not your web application.\nIt’s also something very temporary; the server is asking you to try again.\nSo, for authorization I use the 403 Forbidden response. It’s permanent, it’s tied to my application logic, and it’s a more concrete response than a 401.\nReceiving a 403 response is the server telling you, “I’m sorry. I know who you are--I believe who you say you are--but you just don’t have permission to access this resource. Maybe if you ask the system administrator nicely, you’ll get permission. But please don’t bother me again until your predicament changes.”\nIn summary, a 401 Unauthorized response should be used for missing or bad authentication, and a 403 Forbidden response should be used afterwards, when the user is authenticated but isn’t authorized to perform the requested operation on the given resource.\nWell that’s my view on it anyway :)\n\n### 译文\n\n>了解403禁止\n2011年7月18日\n401 Unauthorized验证错误的HTTP状态代码存在问题。就是这样:它用于身份验证,而不是授权。收到401响应是服务器告诉您,“您未经过身份验证 - 未经过身份验证或未经过身份验证 - 但请重新进行身份验证并重试。”为了帮助您,它将始终包含WWW-Authenticate描述如何进行身份验证。\n这是您的Web服务器通常返回的响应,而不是您的Web应用程序。\n这也是非常暂时的; 服务器要求您再试一次。\n因此,对于授权,我使用403 Forbidden响应。它是永久性的,它与我的应用程序逻辑联系在一起,而且它比401更具体。\n收到403响应是服务器告诉你,“对不起。我知道你是谁 - 我相信你说的是谁 - 但你只是没有权限访问这个资源。也许如果您很好地询问系统管理员,您将获得许可。但是,在你的困境发生变化之前,请不要再打扰我了。“\n总之,401 Unauthorized响应应该用于丢失或错误的身份验证,并且403 Forbidden应该在用户经过身份验证但未被授权对给定资源执行请求的操作时使用响应。\n嗯,这是我对它的看法无论如何:)\n\n","tags":["php","Lravel","Authorization"],"categories":["Laravel"]},{"title":"About-ForeEnd","url":"/posts/2115d056/","content":"\n>2018年07月24日19:09:03\n\n前端 我拿什么来拯救你\n\n","tags":["other","fore-end"],"categories":["fore-end"]},{"title":"WeChat-Mini","url":"/posts/8f6d459e/","content":"\n>这是一个有趣的家伙\n\n# WebView\n> 2018年07月21日15:44:49\n\n\n\n不支持 `cookie`\n\n# TabBar\n> 2018年07月22日12:36:19\n\n`pages` 数组的第一项必须是 `tabBar` 的 `list` 数组的一员\n\n\n\n# wx.switchTab\n> 2018年07月22日13:03:37\n\n如果 `tabBar` 里有页面 跳转则不能使用 `wx.redirectTo` `wx.navigateTo` 这种\n\n# onPullDownRefresh\n> 2018年07月24日23:16:05\n\n页面刷新\n\n onPullDownRefresh () => {\n \n }\n\n`wx.startPullDownRefresh()` 是开始操作 \n`wx.stopPullDownRefresh()` 是停止操作 \n\n\n# wx.login() wx.getUserInfo()\n> 2018年07月25日17:10:00\n\n> 千万不要被这个 `session_key` 名字搞混 这只是一个名字而已 也可以叫做其他啥的\n\n`wx.login()` 获取用户临时登录凭证 `code`\n\n然后服务端再获取用户的 `openid` `unionid` `session_key`\n\n关于 `session_key` 这个 不是我们口中的 `session`\n\n他存在的意义就是解密 `wx.getUserInfo()` 中的 `encryptedData`\n\n`wx.checkSession()` 是 防止 `session_key` 失效 而导致解密 `encryptedData` 失败的\n\n> 关于小程序中判断用户登录状态的\n\n这个登录状态 只能由后台来判断 前端判断太麻烦\n推荐就是 全局定义一个 响应拦截器 然后当检测到后台传来特定值的时候进行判断\n\n在这 小程序中 不支持 `cookie`\n然而 `session` 也是基于 `cookie` 的\n\n可以定义一个全局 请求拦截器 对每次请求带上 `cookie`\n\n基于 `wx.setStorage()` `wx.getStorage()`\n\n# \\n\n> 2018年07月27日00:30:25\n\n\n\n关于 `\\n` 换行\n只有用 `` 组件时才可以\n\n# 页面嵌套页面跳转\n> 2018年07月27日15:30:28\n\n`getCurrentPages()`\n第一层 首页\n\n这个好像是最多10层\n\n# Cannot read property 'xxx' of undefined\n> 2018年07月28日06:08:19\n\n关于这种报错 是 没有获取到数据但是已经渲染了\n\n> 又天亮了,可能不知道啥时候就猝死了. - 波波\n\n# other\n> 2018年07月27日15:32:24\n\n偶然发现\n\n> 以下内容你不需要立马完全弄明白,不过以后它会有帮助。\n\n\n\n这句话好像几个文档都见到过\n\n# 保留关键字\n> 2018年08月05日22:05:28\n\n一定要注意 不要用保留关键字 不然 使用 `mpvue` 也不报错\n然后这 `4h` 就这样 浪过去了\n","tags":["WeChat"],"categories":["WeChat-Mini"]},{"title":"php codes","url":"/posts/ddef8f38/","content":"\n# PHPOffice/PhpSpreadsheet\n> 2018年07月14日\n保存 excel 图像 表格数据\n\n\n\n\n```php\n use PhpOffice\\PhpSpreadsheet\\IOFactory;\n use Illuminate\\Support\\Facades\\Storage;\n\n // laravel\n $path = storage_path('app/1.xlsx');\n\n $xlsx = IOFactory::load($path)->getActiveSheet();\n\n // 保存图像\n $imgs = [];\n $imgData = $xlsx->getDrawingCollection();\n\n foreach ($imgData as $value) {\n $content = fopen($value->getPath(),'r');\n $name = str_random(40).'.'.$value->getExtension();\n $info = Storage::put($name, $content);\n $imgs[] = $name;\n }\n\n // 获取数据\n $datas = [];\n $i = 0;\n foreach ($xlsx->toArray() as $value) {\n $datas[] = $value;\n $datas['img'] = $imgs[$i];\n\n $i++;\n }\n```\n\n","tags":["php","composer"],"categories":["codes"]},{"title":"Use-Ngrok","url":"/posts/b0eda95a/","content":"\n> 内网穿透\n\n一句话解释就是 `把自己的电脑用作服务器可以让外人访问到`\n\n\n\n\n前者国外 后者国内\n\n# https://ngrok.com/\n\n 先注册一个账号\n\n注册完成后 再到 看着这个文档来操作吧\n\n![](1.png)\n\n# https://www.ngrok.cc/\n\n 也是注册一个账号\n\n完成后 就 `emmmm` 你会理解的\n\n> 你不需要立马弄明白所有的东西,不过随着你的不断学习和使用.它的参考价值会越来越高.\n\n> 2018年08月04日 更新\n\n\n\n> 程序猿何苦为难程序猿","categories":["ngrok"]},{"title":"Laravel-Use-Horizon","url":"/posts/5c9df80d/","content":"\n> laravel 5.6\n\n\n\n# 安装\n\n composer require laravel/horizon\n\n# 发布文件\n\n php artisan vendor:publish --provider=\"Laravel\\Horizon\\HorizonServiceProvider\"\n\n# 配置\n\n发布文件后主要配置文件将在 `config/horizon.php`\n\n# 运行\n\n php artisan horizon\n\n不出意外 是可以访问 `{APP_URL}/horizon` 看到的\n\n# 仪表盘权限验证 `App\\Providers\\AppServiceProvider`\n\n> 默认情况下 这个是只能再 `local` 环境下访问的\n可使用 `Horizon::auth` 给仪表盘定义更具体的访问策略\n\n```php\n namespace App\\Providers;\n\n use Illuminate\\Support\\ServiceProvider;\n\n class AppServiceProvider extends ServiceProvider\n {\n\n public function boot()\n {\n // return true or false\n \\Horizon::auth(function ($request) {\n return auth()->check();\n });\n }\n\n public function register()\n {\n //\n }\n }\n```\n\n# other\n\n## 更改 '/horizon' 前缀\n\n翻了下 `issues` 貌似没找到\n不过有个 好像可以用\n\n\n```php\n return view('horizon::app');\n```\n","tags":["php","Lravel","Horizon"],"categories":["Laravel"]},{"title":"Laravel-Use-Queues","url":"/posts/2ed8c260/","content":"\n> laravel 5.6\n\n# 创建\n php artisan make:job ProcessPodcast\n\n# 编辑 `App\\Jobs\\ProcessPodcast`\n\n```php\n namespace App\\Jobs;\n\n use App\\AudioProcessor;\n use Illuminate\\Bus\\Queueable;\n use Illuminate\\Queue\\SerializesModels;\n use Illuminate\\Queue\\InteractsWithQueue;\n use Illuminate\\Contracts\\Queue\\ShouldQueue;\n use Illuminate\\Foundation\\Bus\\Dispatchable;\n\n class ProcessPodcast implements ShouldQueue\n {\n use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n protected $podcast;\n\n // 主要用于传值\n public function __construct($data)\n {\n $this->data = $data;\n }\n\n // 主要运行逻辑\n public function handle()\n {\n // ...\n }\n }\n```\n\n# 分发任务\n\n## No.1\n\n```php\n namespace App\\Http\\Controllers;\n\n use App\\Jobs\\ProcessPodcast;\n use Illuminate\\Http\\Request;\n use App\\Http\\Controllers\\Controller;\n\n class PodcastController extends Controller\n {\n public function store(Request $request)\n { \n // ...\n // 分发任务\n ProcessPodcast::dispatch($datas);\n }\n }\n```\n\n## No.2\n\n```php\n namespace App\\Http\\Controllers;\n\n use App\\Jobs\\ProcessPodcast;\n use Illuminate\\Http\\Request;\n use App\\Http\\Controllers\\Controller;\n\n class PodcastController extends Controller\n {\n public function store(Request $request)\n {\n // ...\n // 分发任务\n dispatch(new ProcessPodcast($datas));\n\n // 也可以这样写\n $this->dispatch(new ProcessPodcast($datas));\n }\n }\n```\n\n# 运行队列\n \n # 测试\n php artisan queue:listen\n\n # 线上\n php artisan queue:work\n\n推荐使用 [`horizon`](https://laravel.com/docs/5.6/horizon)\n[`horizon 使用方法`](/posts/5c9df80d/)","tags":["php","Lravel","Queues"],"categories":["Laravel"]},{"title":"Github-Permission-denied","url":"/posts/649f29d3/","content":"\n# 问题\n\n使用 `git` 给 `github` 推送 时遇到\n\n\n![](1.png)\n\n git@github.com: Permission denied (publickey).\n\n\n# 解决方案\n\n[一个帮助地址](https://help.github.com/articles/error-permission-denied-publickey/)\n\n这个是没通过认证的情况\n\n ssh -T git@github.com\n\n![](2.png)\n\n输入 一路回车下去\n\n ssh-keygen\n\n![](3.png)\n\n复制 `~/.ssh/id_rsa.pub` 内容 到 `SSH keys`\n\n cat ~/.ssh/id_rsa.pub\n\n![](4.png)\n\n ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsAR8WXcV2GRpAx1PmStWnOcJ7FXYPmGs9EQ/RY5NMbhNpNF/GhftBuGsDYL2BenSzYTPsNvD66AbUIlP5BaJNG2Avf6OugZdUD3FNII+8Q86F9KKjfp85zVo5bcfS9KIIgOISVkZzjACOaxGq4JbOXRRvCKs/1hVvv1hCIO1Ib9Ncor19De6Ad0wp16LMjkl+C6a3gsKq457jMttlwqAu2YiTrMKs0Ct9YUmfG727XllD93iY3HoTzwMDqd+jXGbQawxGzXUQoxt612pwwU2K/W2niC4GMIErTuNvDjM4/iMnbqhTJfgbj7ie20Q+J+qL/xTQZQN0/g9nQF0B0jmd puzzle@puzzle\n\n![](5.png)\n\n这个名字不重要 主要是 `key`\n\n![](6.png)\n\n保存后在试下\n\n ssh -T git@github.com\n\n![](7.png)\n\n# end","tags":["github"],"categories":["DeError"]},{"title":"Github-Push-Email-Private","url":"/posts/4c3f8f32/","content":"\n# 问题\n使用 `git` 给 `github` 推送 时遇到\n\n![](1.png)\n\n remote: error: GH007: Your push would publish a private email address. \n remote: You can make your email public or disable this protection by visiting: \n remote: http://github.com/settings/emails \n\n# 解决方案\n\n## NO.1\n\n取消勾选这个\n\n![](2.png)\n![](3.png)\n\n Block command line pushes that expose my email\n If you push commits that use a private email as your author email we will block the push and warn you about exposing your private email.\n\n 阻止命令行推送暴露我的电子邮件\n 如果您推送使用私人电子邮件的提交作为您的作者电子邮件,我们将阻止推送并警告您公开您的私人电子邮件。\n\n## NO.2\n\n Keep my email address private\n We’ll remove your public profile email and use 13518196+puzzle9@users.noreply.github.com when performing web-based Git operations and sending email on your behalf. If you want command line Git operations to use your private email you must set your email in Git.\n\n 将我的电子邮件地址保密\n 我们将删除您的公开个人资料电子邮件,并在执行基于Web的Git操作并代表您发送电子邮件时使用 13518196+puzzle9@users.noreply.github.com。如果您希望命令行Git操作使用您的私人电子邮件,您必须 在Git中设置您的电子邮件。\n\n将此项目 `email` 设置成 推荐 email [一个帮助地址](https://help.github.com/articles/setting-your-commit-email-address-in-git/)\n\n git config user.email \"13518196+puzzle9@users.noreply.github.com\"\n\n重置上次提交作者\n\n git commit --amend --reset-author\n\n# end","tags":["github"],"categories":["DeError"]},{"title":"hexo 搭建一个博客","url":"/posts/4f8f62d6/","content":"\n> 所谓博客,都是孤芳自赏 [nMask's Blog\n](https://thief.one/2017/03/03/Hexo%E6%90%AD%E5%BB%BA%E5%8D%9A%E5%AE%A2%E6%95%99%E7%A8%8B/)\n\n# 所需环境\n\n- [node](https://nodejs.org/zh-cn/)\n- [git](https://git-scm.com/)\n- [github](https://github.com/)\n\n# 全局安装 [hexo](https://hexo.io/)\n\n\n npm install hexo-cli -g\n\n\n# 新建项目\n\n hexo init blog\n cd blog\n npm install\n\n\n# 运行\n\n hexo s\n\n此时打开 不出意外是可以看到页面的\n\n\n# 插件\n\n- [hexo-admin](https://github.com/jaredly/hexo-admin)\n- [hexo-blog-encrypt](https://github.com/MikeCoder/hexo-blog-encrypt)\n- [hexo-deployer-git](https://github.com/hexojs/hexo-deployer-git)\n- [hexo-neat](https://github.com/Rozbo/hexo-neat)\n- [hexo-wordcount](https://github.com/willin/hexo-wordcount)\n- [hexo-abbrlink](https://github.com/rozbo/hexo-abbrlink)\n- [Valine](https://github.com/xCss/Valine)\n- [hexo-git-backup](https://github.com/coneycode/hexo-git-backup)\n\n\n# 主题\n\n- [hexo-theme-indigo](https://github.com/yscoder/hexo-theme-indigo)\n\n# 配置 [`_config.yml`](https://hexo.io/zh-cn/docs/configuration.html)\n\n1. 创建 `github` 仓库 `{name}.github.io`\n2. 修改 `_config.yml` 里 [deploy](https://hexo.io/zh-cn/docs/deployment.html)\n\n deploy:\n type: git\n repository: https://github.com/puzzle9/puzzle9.github.io.git\n branch: master\n\n\n使用 `https` 的地址每次 `push` 可能都需要输入用户名密码\n姑且推荐用 `git` 地址\n\n git@github.com:puzzle9/puzzle9.github.io.git\n\n# 一片新文章/新页面\n\n hexo new post {PostName}\n # `source/_posts/{PostName}`\n\n hexo new page {PageName}\n # `source/{PageName}`\n\n# 生成静态文件\nhexo g\n\n# 将本地文件推送至 github\nhexo d\n\n# hexo 命令\n\n # 启动服务\n hexo server -> hexo s\n\n # 生成静态文件\n hexo generate -> hexo g\n\n # 将本地文件推送至 github\n hexo deploy -> hexo d\n\n # other\n clean Remove generated files and cache.\n config Get or set configurations.\n deploy Deploy your website.\n generate Generate static files.\n help Get help on a command.\n init Create a new Hexo folder.\n list List the information of the site\n migrate Migrate your site from other system to Hexo.\n new Create a new post.\n publish Moves a draft post from _drafts to _posts folder.\n render Render files with renderer plugins.\n server Start the server.\n version Display version information.\n\n# other\n\n善用搜索 尤其是改样式的时候","categories":["hexo"]},{"title":"Hello World","url":"/posts/d4a1185/","content":"\n# International practice\n> hello world.\n\n# other\nhappy new year\n"}] \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 53985bc7..10709dea 100755 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,16 +2,16 @@ - https://puzzle9.github.io/posts/eb968e3/ + https://puzzle9.github.io/posts/ba2c0eca/ - 2023-08-05 + 2023-08-12 monthly 0.6 - https://puzzle9.github.io/posts/ba2c0eca/ + https://puzzle9.github.io/posts/eb968e3/ 2023-08-05 @@ -742,7 +742,7 @@ https://puzzle9.github.io/ - 2023-08-05 + 2023-08-12 daily 1.0 @@ -752,245 +752,245 @@ https://puzzle9.github.io/categories/codes/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/%E5%AE%89%E5%85%A8/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/Story/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/back-end/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/fore-end/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/js/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/deploy/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/docker/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/Docker/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/eggjs/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/eggjs/socket/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/gift/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/DeError/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/Grow/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/Laravel/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/vhost/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/emotion/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/face/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/go/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/hexo/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/manjaro/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/Participle/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/Program/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/redis/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/linux/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/git/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/snap/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/PHP/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/ngrok/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/ptyhon3/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/v2fly/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/vue/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/WeChat-Chat/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/WeChat-Mini/ - 2023-08-05 + 2023-08-12 weekly 0.2 https://puzzle9.github.io/categories/go/webhook/ - 2023-08-05 + 2023-08-12 weekly 0.2