├── .dockerignore ├── .gitignore ├── .vscode └── settings.json ├── Dockerfile ├── FEM ├── 01-preface.md ├── 02-direct-stiffness-method.md ├── 03-complex-deformable-body-1.md └── README.md ├── LICENSE ├── README.md ├── SUMMARY.md ├── book.json ├── docker-compose.yml ├── game201 ├── README.md ├── linear_eq_solver.md ├── mass_spring.md └── sph.md ├── img ├── 2020-05-05-18-59-17.png ├── 2020-05-05-19-15-01.png ├── 2020-05-05-22-19-05.png ├── 2020-05-05-22-39-46.png ├── 2020-07-05-21-28-17.png ├── 2020-07-05-21-28-39.png ├── 2020-07-05-21-28-48.png ├── 2020-07-05-21-28-57.png ├── 2020-07-07-12-28-05.png ├── 2020-07-07-17-38-53.png ├── 2020-07-07-17-42-27.png ├── 2020-07-07-17-43-38.png ├── 2020-07-07-17-44-08.png ├── 2020-07-07-17-45-57.png ├── 2020-07-07-17-46-55.png ├── 2020-07-07-17-47-20.png ├── 2020-07-07-18-03-05.png ├── 2020-07-07-18-03-52.png ├── 2020-07-18-16-50-21.png ├── 2020-07-18-16-50-51.png ├── 2020-07-18-16-51-03.png ├── 2020-07-18-23-49-41.png ├── 2020-07-19-11-41-36.png ├── 2020-07-19-11-43-02.png ├── 2020-07-19-17-41-24.png ├── 2020-07-19-18-14-13.png ├── 2020-07-19-18-49-22.png ├── 2020-07-19-18-49-44.png ├── 2020-07-19-18-55-40.png ├── 2020-07-19-20-03-31.png ├── 2020-07-19-20-05-20.png ├── 2020-07-19-20-58-11.png ├── 2020-07-19-21-05-51.png ├── 2020-07-19-21-08-13.png ├── 2020-07-19-21-10-42.png ├── 2020-07-19-21-15-14.png ├── 2020-07-19-21-17-44.png ├── 2020-07-23-13-12-12.png ├── 2020-07-23-13-15-02.png ├── 2020-07-23-13-22-59.png ├── 2020-07-23-13-24-08.png ├── 2020-07-23-13-29-40.png ├── 2020-07-24-23-00-21.png ├── 2020-07-24-23-17-16.png ├── 2020-07-25-12-55-28.png ├── 2020-07-25-12-56-57.png ├── 2020-07-25-12-57-21.png ├── 2020-08-03-23-32-49.png ├── 2020-08-03-23-35-46.png ├── 2020-08-03-23-39-24.png ├── 2020-08-09-16-39-22.png ├── 2020-08-09-16-46-40.png ├── 2020-08-09-17-34-38.png ├── 2020-08-09-17-49-53.png ├── 2020-08-09-17-58-58.png ├── 2020-08-09-18-03-58.png ├── 2020-08-09-18-04-52.png ├── 2020-08-09-18-59-29.png ├── 2020-08-10-21-50-08.png ├── 2020-08-13-00-39-55.png ├── 2020-08-16-21-58-08.png ├── 2020-08-16-21-59-09.png ├── 2020-08-16-21-59-52.png ├── 2020-08-16-22-00-37.png ├── 2020-08-16-22-01-11.png ├── 2020-08-16-22-01-30.png ├── 2020-08-16-22-02-22.png ├── 2020-08-16-22-02-43.png ├── 2020-08-17-17-54-35.png ├── 2020-08-17-17-56-16.png ├── 2020-08-17-17-57-33.png ├── 2020-08-23-23-01-34.png ├── 2020-08-23-23-10-39.png ├── 2020-08-23-23-34-19.png ├── 2020-08-25-18-07-22.png ├── 2020-08-25-18-38-00.png ├── 2020-08-25-19-14-00.png ├── 2020-08-25-19-14-09.png ├── 2020-08-25-19-14-18.png ├── 2020-08-25-19-14-24.png ├── 2020-08-26-18-42-03.png ├── 2020-08-26-18-44-51.png ├── 2020-08-26-21-59-56.png ├── 2020-08-26-22-17-38.png ├── 2020-08-26-22-18-10.png ├── 2020-08-26-22-18-38.png ├── 2020-08-26-22-32-36.png ├── 2020-08-26-22-40-23.png ├── 2020-09-19-13-00-10.png ├── 2020-09-19-13-59-43.png ├── 2020-10-02-16-32-08.png ├── 2020-10-02-16-33-08.png ├── 2020-10-02-16-45-07.png ├── 2020-10-09-20-08-40.png ├── 2020-10-09-20-08-41.gif ├── 2020-10-09-20-14-20.png ├── 2020-10-09-20-15-33.png ├── 2020-10-09-20-20-02.png ├── 2020-10-09-20-21-06.png ├── 2020-10-09-20-23-00.png ├── 2020-10-09-20-25-39.png ├── 2020-10-09-20-26-27.png ├── 2020-10-09-20-27-29.png ├── 2020-10-09-20-27-42.png ├── 2020-10-09-20-31-16 (1).png ├── 2020-10-09-20-31-16.png ├── 2020-10-09-20-31-23.png ├── 2020-10-09-20-31-28.png ├── 2020-10-09-20-32-42.png ├── 2020-10-09-20-32-59.png ├── 2020-10-09-20-37-16.png ├── 2020-10-09-20-37-23.png ├── 2020-10-09-20-37-43.png ├── 2020-11-15-01-07-01.png ├── 2020-11-15-01-18-27.png ├── 2020-11-15-01-19-18.png ├── 2020-11-15-01-20-58.png ├── 2020-12-04-11-50-38.png ├── 2020-12-04-11-50-51.png ├── 2021-01-05-12-36-57.png ├── 2021-01-05-12-54-35.png ├── 2021-01-05-13-02-45.png ├── 2021-01-05-13-08-26.png ├── 2021-01-07-12-39-13.png ├── 2021-01-07-12-47-30.png ├── 2021-01-07-12-47-39.png ├── 2021-01-13-15-11-31.png ├── 2021-01-13-15-11-57.png ├── 2021-01-15-18-07-10.png ├── 2021-01-15-18-08-54.png ├── 2021-01-15-18-10-39.png ├── 2021-01-15-18-11-02.png ├── 2021-01-15-18-11-30.png ├── 2021-01-15-18-12-54.png ├── 2021-01-15-18-15-55.png ├── 2021-01-15-18-16-44.png ├── 2021-01-15-18-32-30.png ├── 2021-01-15-18-34-04.png ├── 2021-01-15-18-36-42.png ├── 2021-01-15-18-41-15.png ├── 2021-01-15-18-42-36.png ├── 2021-01-15-18-43-13.png ├── 2021-01-15-18-44-18.png ├── 2021-01-15-18-45-25.png ├── 2021-01-15-18-45-57.png ├── 2021-01-15-18-48-38.png ├── 2021-01-15-18-48-53.png ├── 2021-01-15-18-49-49.png ├── 2021-01-15-18-52-19.png ├── 2021-01-15-18-52-37.png ├── 2021-01-21-02-23-33.png ├── 2021-04-23-21-58-21.png ├── 2021-05-03-01-15-32.png ├── 2021-05-26-12-41-34.png ├── 2021-06-19-21-55-53.png ├── 2021-06-19-21-58-26.png ├── 2023-03-04-17-13-05.png ├── fem │ ├── vlcsnap-2021-05-03-00h10m55s197.png │ ├── vlcsnap-2021-05-03-00h31m08s058.png │ ├── vlcsnap-2021-05-03-01h13m21s880.png │ ├── vlcsnap-2021-05-03-15h09m52s741.png │ ├── vlcsnap-2021-05-03-15h14m51s011.png │ ├── vlcsnap-2021-05-03-19h42m04s254.png │ ├── vlcsnap-2021-05-03-19h50m13s064.png │ ├── vlcsnap-2021-05-03-21h33m39s221.png │ ├── vlcsnap-2021-05-03-21h35m54s041.png │ ├── vlcsnap-2021-05-03-21h36m26s415.png │ ├── vlcsnap-2021-05-03-21h50m37s065.png │ ├── vlcsnap-2021-05-03-23h29m03s501.png │ ├── vlcsnap-2021-05-03-23h38m14s659.png │ ├── vlcsnap-2021-05-03-23h38m40s776.png │ ├── vlcsnap-2021-05-03-23h40m00s293.png │ ├── vlcsnap-2021-05-03-23h40m13s974.png │ ├── vlcsnap-2021-05-04-17h22m58s007.png │ ├── vlcsnap-2021-05-04-23h09m16s927.png │ ├── vlcsnap-2021-05-05-00h26m32s410.png │ ├── vlcsnap-2021-05-05-16h42m12s722.png │ ├── vlcsnap-2021-05-05-16h44m19s386.png │ ├── vlcsnap-2021-05-05-17h30m37s400.png │ ├── vlcsnap-2021-05-05-17h31m02s197.png │ ├── vlcsnap-2021-05-05-17h31m17s929.png │ ├── vlcsnap-2021-05-05-17h31m38s163.png │ ├── vlcsnap-2021-05-05-18h00m28s820.png │ ├── vlcsnap-2021-05-05-18h00m49s050.png │ ├── vlcsnap-2021-05-05-18h04m10s106.png │ ├── vlcsnap-2021-05-05-18h13m11s330.png │ ├── vlcsnap-2021-05-05-18h13m30s842.png │ └── vlcsnap-2021-05-05-18h13m40s932.png ├── fukuoka-gaimenkirikae │ ├── route-1.png │ └── route-2.png ├── meme │ ├── 6pd1vb.jpg │ └── 你聊这个我可不困了.gif ├── pandownload-author-arrested-weibo.png └── willing │ ├── BaiduShurufa_2013-10-10_12-54-54.png │ ├── BaiduShurufa_2013-10-10_12-55-30.png │ ├── BaiduShurufa_2013-10-10_12-56-17.png │ ├── BaiduShurufa_2013-10-10_8-4-52.png │ ├── BaiduShurufa_2013-10-10_8-5-45.png │ ├── BaiduShurufa_2013-10-16_19-7-29.png │ ├── BaiduShurufa_2013-10-18_13-21-36.png │ ├── BaiduShurufa_2013-10-22_21-38-58.png │ ├── BaiduShurufa_2013-10-7_20-34-45.png │ ├── BaiduShurufa_2013-10-7_9-43-37.png │ ├── BaiduShurufa_2013-10-7_9-44-57.png │ ├── BaiduShurufa_2013-10-7_9-45-17.png │ ├── BaiduShurufa_2013-10-7_9-46-7.png │ ├── BaiduShurufa_2013-10-7_9-53-41.png │ ├── BaiduShurufa_2013-10-7_9-55-6.png │ ├── BaiduShurufa_2013-10-9_19-52-41.png │ ├── BaiduShurufa_2013-11-10_20-20-8.png │ ├── BaiduShurufa_2013-11-3_20-34-20.png │ ├── BaiduShurufa_2013-11-3_20-34-44.png │ ├── BaiduShurufa_2013-11-3_20-35-34.png │ ├── BaiduShurufa_2013-11-3_20-37-0.png │ ├── BaiduShurufa_2013-11-3_20-37-46.png │ ├── BaiduShurufa_2013-11-3_20-38-20.png │ ├── BaiduShurufa_2014-1-20_10-52-39.png │ └── BaiduShurufa_2014-1-20_10-53-26.png ├── ml ├── README.md ├── common │ ├── README.md │ ├── collection.md │ ├── conv.md │ ├── hand-detection.md │ ├── regularization.md │ └── semi-supervised-learning.md ├── recsys │ ├── README.md │ ├── ab_testing.md │ ├── bpr_and_hinger.md │ ├── collection.md │ ├── light_gcn.md │ ├── non_sampling_mf.md │ └── ranknet.md └── rl │ ├── README.md │ └── mab-summary.md ├── other-tech ├── README.md ├── can-panel.md ├── cloud-or-not.md ├── ffmpeg_qsv.md ├── frp.md ├── fuck-thunder.md ├── fukuoka-gaimenkirikae.md ├── https.md ├── innet.md ├── mdadm.md ├── move2linux.md ├── mysql-optimizer-in-clause.md ├── nas.md ├── net-self-sufficient.md ├── note.md ├── rsync-caused-problem.md ├── rust-avr.md ├── save-my-openwrt.md ├── v2ray.md ├── video-compress.md └── vite-import-path.md ├── recipe ├── README.md ├── azuki.md ├── beef-soup.md ├── garlic-chives-omelette.md ├── herb_and_spice.md ├── pita.md ├── spaghetti_bolognese.md └── tianjiuniang.md ├── spam ├── 1990s-env.md ├── README.md ├── bull-shit-politics.md ├── damn-university.md ├── gfw-history.md ├── jp_covid_19 │ └── hiroshima_wide_pcr.md ├── recsys-biased-us.md ├── save-children.md ├── shit-cap2employee │ ├── README.md │ └── huawei-251.md ├── shit-cap2user │ ├── README.md │ └── rape-user.md ├── tj-linear-algebra.md ├── why-not-domestic-phone.md ├── workers-interview.md └── zatsudan.md ├── ssh_config └── web └── jwt.md /.dockerignore: -------------------------------------------------------------------------------- 1 | _book 2 | node_modules 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Node rules: 2 | ## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 3 | .grunt 4 | 5 | ## Dependency directory 6 | ## Commenting this out is preferred by some people, see 7 | ## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git 8 | node_modules 9 | 10 | # Book build output 11 | _book 12 | 13 | # eBook build output 14 | *.epub 15 | *.mobi 16 | *.pdf 17 | .DS_Store 18 | /draft/ -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "pasteImage.basePath": "${projectRoot}", 3 | "pasteImage.path": "${projectRoot}/img", 4 | "pasteImage.prefix": "/" 5 | } 6 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:11 2 | 3 | RUN echo "registry=https://nexus.tsingjyujing.com/repository/npm/" > /root/.npmrc 4 | 5 | # Set environment 6 | RUN npm install gitbook-cli -g && \ 7 | gitbook install && \ 8 | apt-get update && \ 9 | apt-get install -y git && \ 10 | apt-get clean 11 | 12 | # Build book 13 | WORKDIR /book 14 | COPY . . -------------------------------------------------------------------------------- /FEM/01-preface.md: -------------------------------------------------------------------------------- 1 | # 课程概要 & 引论 2 | 3 | ## 有限的单元,无限的能力 4 | 5 | 基本就是说说有什么用,不过需要吐槽一下,那些视频看上去很炫酷,但是在没学过FEM的人看来就平平无奇,也不知道干什么用的。 6 | 7 | ## 引论 8 | 9 | ### 1.1 力学的分类:质点、刚体、变形体的力学 10 | 11 | ![](/img/fem/vlcsnap-2021-05-03-00h10m55s197.png) 12 | 13 | 以卫星为例子,描述轨道只要简化为质点就可以,使用三个坐标就可以标示,如果描述姿态还需要再加3个坐标,如果考虑电池板等柔性元件就更加复杂。 14 | 15 | 想起一个大佬说的,做有限元分析,不是考虑加什么东西,而是考虑在不影响结果的情况下,可以从现实世界的模型里减去什么。 16 | 17 | 下面更加具体的分析: 18 | 19 | - 质点力学:初中学过的 20 | - 刚体力学(理论力学):物体形状不变,但是质量分布不能简化为一个点 21 | - 变形体的力学 22 | - 简单形状 23 | - 简单形状,简单组合:材料力学,小变形,形状简单 24 | - 简单形状,复杂组合:结构力学,各种复杂桁架的受理分析(土木应该会经常用吧) 25 | - 复杂形状:弹塑性力学,需要使用微元法分析了,预感这是这门课解决的问题,未必能用解析法解析了。 26 | 27 | 28 | ### 1.2 变形体力学的要点 29 | 30 | 变形体力学的要点,曾老师设计了三个同种材料单拉实验,三个实验的受力-位移曲线都不一样,引导出描述材料中的不变量:弹性模量E的定义: 31 | 32 | $$E = \frac{\sigma}{\epsilon}$$ 33 | 34 | 其中: 35 | - $$\sigma = F/A$$ 36 | - $$\epsilon=u/L$$ 37 | - F 为试样受拉力 38 | - A 为试样横截面积 39 | - u 为受拉力F以后,试样的形变量 40 | - L 为试样长度 41 | 42 | ### 1.3 微分方程求解的方法 43 | 44 | ![](/img/fem/vlcsnap-2021-05-03-00h31m08s058.png) 45 | 46 | 这是我踩的第一个坑,我想了10分钟才明白为什么是u的二阶导数。这里并不是位移-速度-加速度。 47 | 首先视频里说“长度上受到均布载荷P”,我里所应当的认为P是压强,应变也就是F/A,其实不是。 48 | 49 | 我们如果在自由端施加F的拉力,的确小杆子内部的应变处处相等,但是这样的简单载荷是不需要微分方程求解的,所以给定了一个复杂的情况,这里的P的单位其实是N/m,杆子内部的受力不均匀,是一个从左到右逐渐加码的载荷。 50 | 51 | 所以,应变的大小其实是 $$\epsilon(x) = \frac{du}{dx}$$,那么应力就是 $$\sigma(x) = E \epsilon(x)$$,截面受力 $$F(x) = EA \epsilon(x)$$ 考虑到P是均匀加负荷,所以F的导数等于P,也就是力从0开始逐渐变大到LP(从右到左看的话)。 52 | 53 | 最后我们得到: 54 | 55 | - $$\frac{dF(x)}{dx}=-p$$ 56 | - 整理一下:$$\frac{d\frac{du}{dx}EA}{dx}+p=0$$ 57 | - 再整理一下: $$\frac{d^2u}{dx^2}+\frac{p}{EA}=0$$ 58 | 59 | 得到方程以后的事情就比较顺理成章了,这个微分方程但凡学过高数都会解,唯一的问题是,两次积分会产生两个常数项,第一次产生常数项的时候,要用第二个约束条件带入得到 $$C_1=\frac{PL}{AE}$$,第二个常数项要用第一个约束条件带入得到 $$C_2=0$$ 60 | 61 | 接下来讲了两个近似方法,第一个是差分,其实就是折线法(记忆模糊了,应该没错)求解微分方程近似解,说到这个我就兴奋了,除此之外,其实还有龙格库塔之类的一票方法。 62 | 63 | 老师又说了一个试函数法,看到待定系数和残差方程我就更加兴奋了,你这个是要搞最优化?要不要来个万能函数搞机器学习? 64 | 65 | ![](/img/meme/你聊这个我可不困了.gif) 66 | 67 | 但是下面的步骤开始匪夷所思: 68 | 69 | ![](/img/fem/vlcsnap-2021-05-03-01h13m21s880.png) 70 | 71 | 一般这种用一个(组)函数的线性和逼近另一个函数,一般考虑最小二乘法,这里把一个函数和另一个函数乘起来积分等于零(而且还不要求试函数组正交!!)求系数的我还没见过。 72 | 73 | 经过了解,这个方法叫Galerkin(伽辽金)加权残值法([Wiki 伽辽金法](https://zh.wikipedia.org/wiki/%E4%BC%BD%E8%BE%BD%E9%87%91%E6%B3%95)),简单的说,就是用试函数的基函数作为权重函数,就能取得系数。 74 | 75 | ![](/img/2021-05-03-01-15-32.png) 76 | 77 | 我参考了[这个文章](https://zhuanlan.zhihu.com/p/33216023),但是他也没有细说原理,这个应该不重要,如果以后需要再来补充吧。 78 | 79 | 80 | ### 1.4 关于函数逼近的方式 81 | 82 | 除了试函数法,还可将函数分成多个小片,逐片拟合。 83 | 84 | ### 1.5 针对复杂几何域上的函数表征及逼近 85 | 86 | 主要就是遇到形状复杂的形状,只能采用分块的方式来做。试函数在这里基本就是废物…… 87 | 88 | ### 1.6 有限元的核心:针对复杂几何域的分片函数逼近 89 | 90 | 这里开始涉及到有限元的核心,单元分割,这里举了各种各样的单元,但是实际上不止老师列举的单元,有一个[FEMTable](http://www-users.math.umn.edu/~arnold/femtable/)的网站专门记录了应该是所有的有限单元的形式。 91 | 92 | ### 1.7 有限元发展的历史和软件 93 | 94 | 略,不过视频出现了一个梗,老师举例了几位FEM的开创者都很长寿,得出了研究有限元可以长寿的结论。 95 | 但是曾老师自己享年56岁……老师你为什么要乱立Flag啊哭…… -------------------------------------------------------------------------------- /FEM/02-direct-stiffness-method.md: -------------------------------------------------------------------------------- 1 | # 基于直接刚度法的杆系有限元方法 2 | 3 | ## 2.1 弹簧的力学分析原理 4 | 5 | 首先是大家都知道的胡克定律: $$F=k\delta$$。 6 | 但是这里引入了一个新的概念:刚度方程/矩阵。 7 | 8 | ![](/img/fem/vlcsnap-2021-05-03-15h09m52s741.png) 9 | 10 | 乍一看是画蛇添足之举,实则另有用处,这么处理之后的单元规范了,就可以和其他杆件连接了。 11 | 12 | 下一步分析两个弹簧的连接+存在一个外力$$F_2$$作用在节点2上的实例: 13 | 14 | ![](/img/fem/vlcsnap-2021-05-03-15h14m51s011.png) 15 | 16 | 建模过程视频很详细,略了,大致思路是:$$F_2$$ 给右边的弹簧,弹簧内力设置为$$F_{I_2}$$,左右相互抵消,这个$$F_{I_2}$$将来要在方程组中约去。 17 | 18 | 19 | ![](/img/fem/vlcsnap-2021-05-03-19h42m04s254.png) 20 | 21 | 这里扩充矩阵,使其标准化为3✖3的矩阵,方便相加,这里取了一个巧,正常我们有两个方程组,例如:$$A_1x=b_1$$和$$A_2x=b_2$$,要揉成一个,一般会取两个系数,比如$$\alpha_1$$和$$\alpha_2$$,加上系数以后相加: 22 | 23 | $$(\alpha_1A_1 + \alpha_2A_2)x=(\alpha_1b_1 + \alpha_2b_2)$$ 24 | 25 | 然后调整这些系数保证$$F_{I_2}$$约去,视频里直接让两个方程组b的第二项的内力互为相反数,这样直接加起来就约掉了。 26 | 27 | 最后考虑$$u_1$$和$$u_3$$都是0(约束条件),所以得到u2的计算公式: 28 | 29 | ![](/img/fem/vlcsnap-2021-05-03-19h50m13s064.png) 30 | 31 | ## 2.2 弹簧单元与杆单元的比较 32 | 33 | 杆单元和弹簧一样,都是线性元件,所以计算方式也是一样的。考虑弹性模量为E,长度为l,截面面积A的杆,等效于 $$k = \frac{EA}{l}$$ 的弹簧。 34 | 35 | Q.E.D. 36 | 37 | ## 2.3 杆单元的坐标变换 38 | 39 | 之前的杆单元的位移u都是沿着杆的方向定义的,但是这个时候如果出现斜拉的杆件,计算就会显得有点复杂。 40 | 41 | 2.3节的主要思想,就是统一坐标系,全部分解到x-y或者x-y-z坐标系,这样刚度矩阵加起来就更加的流畅。 42 | 43 | 这一切,都会导致计算量大幅上升,但是这是值得的,因为带来的好处就是计算更加规范了,这样就利于编程实现,反正最后受苦的是CPU/GPU又不是我。 44 | 45 | ![](/img/fem/vlcsnap-2021-05-03-21h33m39s221.png) 46 | 47 | 这里就很清晰的展示了坐标变换的方式,虽然2个坐标变4个了,但是考虑小变形问题的话,$$\alpha$$ 是基本不会变化的,计算中省略其变化,所以秩其实还是2。 48 | 49 | ![](/img/fem/vlcsnap-2021-05-03-21h35m54s041.png) 50 | 51 | 这里我们进行矩阵化,我们用矩阵T联系了变化前和变化后的坐标。 52 | 53 | ![](/img/fem/vlcsnap-2021-05-03-21h36m26s415.png) 54 | 55 | 我们也需要对刚度矩阵进行同等的变换才可以让刚度阵(其实还有F向量)适应新的坐标,直接思考刚度阵的变化是很费脑细胞的,所以这里使用(线性)代数进行等效变换,我们得到了新的刚度矩阵,过程如下: 56 | 57 | - 首先把坐标$$\bold{q}^e$$替换成$$\bold{T}^e\bold{\overline{q}}^e$$ 58 | - 两边左侧乘以矩阵$$\bold{T}^{eT}$$。 59 | - 其实根据线性代数的理论这里其实乘什么都行,但是由于要对力F也进行坐标变换才乘以的这个矩阵。 60 | - 只有用$$\bold{T}^{eT}$$,右侧的式子才有物理意义了,代表的是力。 61 | - 最后根据线性代数的结合律,我们把$$\bold{T}^{eT}\bold{K}^e\bold{T}^e$$捆绑一下,就得到了新的刚度矩阵。 62 | 63 | ![](/img/fem/vlcsnap-2021-05-03-21h50m37s065.png) 64 | 65 | 老师还列举了三维的形式,三维的刚度矩阵写出来可能一张PPT就满了(6x6),所以就略了。 66 | 67 | ## 2.4 一个四杆结构的实例分析 68 | 69 | ![](/img/fem/vlcsnap-2021-05-03-23h29m03s501.png) 70 | 71 | 以上是今天要分析的问题,四个线性元件组成的桁架结构的受力分析。第一件事情其实是体力活儿,列出所有杆和节点的信息: 72 | 73 | |杆子|节点|l|$$n_x$$|$$n_y$$| 74 | |---|---|---|---|---| 75 | |1|{1,2}|400|1|0| 76 | |2|{3,2}|300|0|-1| 77 | |3|{1,3}|500|0.8|0.6| 78 | |4|{4,3}|400|1|0| 79 | 80 | |节点|x|y| 81 | |---|---|---| 82 | |1|0|0| 83 | |2|400|0| 84 | |3|400|300| 85 | |4|0|300| 86 | 87 | 88 | ![](/img/fem/vlcsnap-2021-05-03-23h38m14s659.png) 89 | 90 | 随后就是看着图片和表格填刚度矩阵,这个活太细碎了…… 91 | 92 | 曾老师是先填写了一个个小的矩阵,然后扩充填0以后相加,不过我觉得直接填写应该也OK。 93 | 94 | 这里的支反力是因为有了约束条件,当你约束一个坐标的时候,坐标是已知了,但相应的你就产生一个未知的力。 95 | 96 | ![](/img/fem/vlcsnap-2021-05-03-23h38m40s776.png) 97 | 98 | 这就是刚度矩阵,好特么大……(对于人类而言),其中的$$F_x2$$,$$F_x3$$,$$F_y3$$都是刚才已知的力。 99 | 100 | ![](/img/fem/vlcsnap-2021-05-03-23h40m00s293.png) 101 | 102 | 考虑到$$u_1$$,$$v_1$$,$$v_2$$,$$u_4$$,$$v_4$$全都是0,所以未知数只有3个,而且$$u_2$$直接就可以肉眼算出,最后只剩下一个二元线性方程组。 103 | 104 | ![](/img/fem/vlcsnap-2021-05-03-23h40m13s974.png) 105 | 106 | 节点位移求出以后,支反力也就知道了,这个是很自然的,因为位移知道以后,拉伸量也就知道了。 107 | 108 | ## 2.5 四杆结构的ANSYS实例分析 109 | 110 | 略 -------------------------------------------------------------------------------- /FEM/03-complex-deformable-body-1.md: -------------------------------------------------------------------------------- 1 | # 3. 针对复杂几何形状变形体的力学描述(1) 2 | 3 | ## 前言 4 | 5 | * 3.1 力学描述的基本思路及关于变形体材料的基本假设 6 | * 3.2 指标记法 7 | * 3.3 关于三大变量及三大方程的思路 8 | 9 | 这一讲主要是针对复杂形状的弹性体进行建模,这里的例子用的是二维平面,为了单位的合理所以强行加了一个厚度t,在之后的计算中基本都被约掉了。 不考虑三维可以理解,毕竟阐述建模思想就可以了,三维的话光记住所有的应力就够费脑子了。 10 | 11 | 首先前面的部分主要是回顾和引入,从这里开始: 12 | 13 | ![](../img/fem/vlcsnap-2021-05-04-17h22m58s007.png) 14 | 15 | 其实大多数的材料都不完全满足这五个特性。 就比较熟悉的钢铁来说,铸造的物体可能有沙眼气泡,锻造的物体根据锻造的时候的受压情况,并不是各向同性的,焊接的还会有内应力,但是计算机要的就是简化。 16 | 17 | 然后针对确认不满足这五个情况的其实有一些其他的理论解决,但是这些不在讨论之列。 18 | 19 | 指标记法主要是对于如何缩写一些求和表达式的约定。 这里有一小半时间都在介绍指标记法和Voigt,看上去写的是简单了,但是约定一大堆,我个人觉得至少不利于我的学习和理解。 20 | 21 | 建模的思路很简单,老师总结为三大变量(应力、应变、位移),三大方程(力平衡,变形协调,物理(广义胡克定律)),约束。 22 | 23 | 从顺序上理解的话: 24 | 25 | * (切割)把复杂零件切割为小方块(边界上是小三角块) 26 | * (应力)针对小方块的受力情况,构建力的平衡方程。 27 | * (应变)针对变形,施加约束条件,使得变形不能撕裂或者重叠 28 | * (应力和应变关系)考虑弹性模量和泊松比,构建应力和应变的关系 29 | * (边界)针对边界,考虑两种情况,力约束和位移约束 30 | * 位移约束就是控制位移,没毛病 31 | * 力约束的话针对小三角块构建力的平衡方程 32 | 33 | ## 3.4 平面问题的平衡方程构建 34 | 35 | ![](../img/fem/vlcsnap-2021-05-04-23h09m16s927.png) 36 | 37 | 平衡方程主要考虑:x方向,y方向,力矩。 38 | 39 | 物理上理解,如果这个微元受力不平衡,就会产生加速度或者角加速度,最后就是飞起来或者转起来。 40 | 41 | 做静态分析的时候,这明显是不靠谱的,零件会飞走的,所以应该是合力为0。 42 | 43 | ![](../img/fem/vlcsnap-2021-05-05-00h26m32s410.png) 44 | 45 | 分析的时候会有一个问题,按道理说,左右两边(或者上下)的应力应该是相等的,但是并不是,相等意味着导数为0,意味着受力完全均匀分布,这个明显不符合实际情况。 46 | 47 | 所以我们考虑在这个地方用泰勒展开,然后用一阶项去近似这个增量。 48 | 49 | 在x方向除了有正应力(的差分),还有剪切应力(的差分),上下面受剪切应力不一样的时候,也会产生x方向的力,但是由于上下面的差分,所以这里对y求偏导。 50 | 51 | 最后的最后,我们发现 $$dxdyt$$ 作为公共项约掉了,最后考虑一下和体积力(重力/电磁力等)平衡即可。 y方向也如法炮制。 52 | 53 | 最后是剪切应力,思路是类似的,但是结论稍有不同,最后得到 $$\tau_{xy}=\tau_{yx}$$,这个其实也不难理解,正应力抵消了,又没有“体积扭矩”这种东西,如果剪切应力不一样的话单元直接得转起来了。 54 | 55 | ![](../img/fem/vlcsnap-2021-05-05-16h42m12s722.png) 56 | 57 | 最后看一下结论: 58 | 59 | ![](../img/fem/vlcsnap-2021-05-05-16h44m19s386.png) 60 | 61 | 结论还是简洁的,一言以蔽之,应力抵消体积力。 62 | 63 | ## 3.5 平面问题的几何方程构建 64 | 65 | 对于x和y来说,应变即位移的偏导数,这个哪怕没有几何图形也可以直观理解。 66 | 67 | ![](../img/fem/vlcsnap-2021-05-05-17h30m37s400.png) 68 | 69 | 对于剪切力引起的应变,采用$$\alpha + \beta$$的方式定义,也就是图里变形以后的尖角和90度的差值。 70 | 71 | 需要注意的是,这里的角度都是用$$tan(\alpha) + tan(\beta)$$代替的,主要还是因为角度太小了,可以不考虑非线性的tan函数。 72 | 73 | ![](../img/fem/vlcsnap-2021-05-05-17h31m02s197.png) 74 | 75 | 这里是几何方程和指标记法,说实话,约定b我觉得牵强了点…… 76 | 77 | ![](../img/fem/vlcsnap-2021-05-05-17h31m17s929.png) 78 | 79 | 满足\[变形协调条件]\([https://en.wikipedia.org/wiki/Compatibility\_(mechanics))才能说这个位移场是一个物理上有效的位移场,因为在这里的分析中,材料不会撕裂,更不会重叠,一定是连续的。](https://en.wikipedia.org/wiki/Compatibility\_\(mechanics\)\)%E6%89%8D%E8%83%BD%E8%AF%B4%E8%BF%99%E4%B8%AA%E4%BD%8D%E7%A7%BB%E5%9C%BA%E6%98%AF%E4%B8%80%E4%B8%AA%E7%89%A9%E7%90%86%E4%B8%8A%E6%9C%89%E6%95%88%E7%9A%84%E4%BD%8D%E7%A7%BB%E5%9C%BA%EF%BC%8C%E5%9B%A0%E4%B8%BA%E5%9C%A8%E8%BF%99%E9%87%8C%E7%9A%84%E5%88%86%E6%9E%90%E4%B8%AD%EF%BC%8C%E6%9D%90%E6%96%99%E4%B8%8D%E4%BC%9A%E6%92%95%E8%A3%82%EF%BC%8C%E6%9B%B4%E4%B8%8D%E4%BC%9A%E9%87%8D%E5%8F%A0%EF%BC%8C%E4%B8%80%E5%AE%9A%E6%98%AF%E8%BF%9E%E7%BB%AD%E7%9A%84%E3%80%82) 80 | 81 | 说实话我没法从直观上理解这个方程,只能从数学上理解,如果每一个单元都按照第一章图画的那样变形(矩形变菱形),我们可以从位移推导出三个应变量的公式,但是2个数值映射到3个数值,一定有一个数值是多余的,这个就是切应变(当然也可以是其它的,只不过我觉得切应变孤单好欺负)。 82 | 83 | 于是可以从数学上,构造出正应变和切应变在二阶偏导数上的关系。 84 | 85 | ![](../img/fem/vlcsnap-2021-05-05-17h31m38s163.png) 86 | 87 | ## 3.6 平面问题的物理方程构建 88 | 89 | 学材料力学的时候,我们知道除了杨氏(弹性)模量,还有一个泊松比,正泊松比的材料越拉越窄(这个符合常识),负泊松比的材料越拉越宽。 90 | 91 | ![](../img/fem/vlcsnap-2021-05-05-18h00m28s820.png) 92 | 93 | 这里就开始把应力和应变串到一起了。 94 | 95 | ![](../img/fem/vlcsnap-2021-05-05-18h00m49s050.png) 96 | 97 | 多出来的剪切模量可以用泊松比和弹性模量求出,最后我们就可以求得应力和应变的互换公式(材料需要指定)。 98 | 99 | ![](../img/fem/vlcsnap-2021-05-05-18h04m10s106.png) 100 | 101 | 后面指标记法和Voigt规则的部分略。 102 | 103 | ## 3.7 两类边界条件 104 | 105 | 边界是特殊的单元,其实边界有两种,受力(受力为0算特殊的受力)和(位置)固定。 106 | 107 | 这里用偏导符号表示物体的边界(三维则是封闭曲面),受力约束和位置约束需要不重不漏的覆盖所有边界。 108 | 109 | ![](../img/fem/vlcsnap-2021-05-05-18h13m11s330.png) 110 | 111 | 针对三角形的小单元构建力和力矩的平衡方程,需要考虑斜边的方向余弦。 112 | 113 | 最后得出结论,除了剪应力需要相等以外,剪应力加正应力需要抵消相应方向上的外力。考虑到外力为0其实是挺常见的边界条件,所以这里我们可以看到剪应力和正应力的互相转换。 114 | 115 | ![](../img/fem/vlcsnap-2021-05-05-18h13m30s842.png) ![](../img/fem/vlcsnap-2021-05-05-18h13m40s932.png) 116 | -------------------------------------------------------------------------------- /FEM/README.md: -------------------------------------------------------------------------------- 1 | # 有限单元法 2 | 3 | 不要问为什么一个机器学习工程师要搞这个,问就是为了爱。 4 | 5 | ## 主要学习资料 6 | 7 | ### 视频课程 8 | 9 | * Bilibili:[清华大学—有限元分析及应用](https://www.bilibili.com/video/av25035770) 10 | * B站小伙伴热心制作PPT讲义:链接:[https://pan.baidu.com/s/1x0NSXVVmt6u1-0dvAqIfgw](https://pan.baidu.com/s/1x0NSXVVmt6u1-0dvAqIfgw) 提取码:s719 11 | * 网易公开课:[清华大学有限元分析及应用 13讲](https://open.163.com/newview/movie/free?pid=WFTMARPBG) 12 | * 视频顺序有问题 13 | * 百度云盘(蜗速下载):[023.清华大学—有限元分析及应用(1.19 GB)](https://pan.baidu.com/s/1pJn0hcR) 14 | 15 | 以上视频都是一样的,选一个方便的用即可。 16 | 17 | ### 课程概要 18 | 19 | 整个课程有第15讲,分为三个部分: 20 | 21 | 第一部分主要为基本原理,包含第1讲到第6讲。 22 | 23 | 第1讲为引论,介绍力学的分类、变形体力学的要点、微分方程求解的方法、关于函数逼近的方式、针对复杂几何域上的函数表征及逼近、针对复杂几何域的分片函数逼近、有限元发展的历史和软件; 24 | 25 | 第2讲为基于直接刚度法的杆系有限元方法,内容有:弹簧的力学分析原理、弹簧单元与杆单元的比较、杆单元的坐标变换、杆结构的ANSYS实例分析; 26 | 27 | 第3讲及第4讲是针对复杂几何形状变形体的力学描述,内容有:力学描述的基本思路、平面问题三大方程构建、两类边界条件、平面纯弯梁的描述及求解、空间弹性问题的完整描述、关于张量的描述及理解; 28 | 29 | 第5讲是变形体力学方程求解的试函数方法的原理,内容有:平面弯曲梁求解的试函数方法、变分方法、能量原理; 30 | 31 | 第6讲是基于试函数方法的经典实现及有限元实现,内容有:基于试函数的经典方法与有限元方法、自然离散与逼近离散、有限元方法中的基本步骤。 32 | 33 | 第二部分主要为有限元方法,包含第7讲到第13讲。 34 | 35 | 第7讲是杆、梁结构的有限元分析,内容有:杆单元构建及MATLAB编程、梁单元构建及MATLAB编程、分布力的处理、杆梁结构的ANSYS实例分析; 36 | 37 | 第8讲及第9讲是连续体结构的有限元分析,内容有:平面3节点三角形单元及MATLAB编程、平面4节点矩形单元及MATLAB编程、轴对称单元、分布力的处理、空间4节点四面体单元、空间8节点正八面体单元、参数单元的原理、典型空间问题分析的ANSYS实例; 38 | 39 | 第10讲是 有限元方法中的基本性质,内容有:节点编号与存储带宽、形状函数矩阵与刚度矩阵的性质、边界条件的处理与支反力的计算、位移函数构造与收敛性要求、C0单 元与C1单元、单元的拼片试验、有限元分析数值解的精度与性质、单元应力计算结果的误差与平均处理、控制误差和提高精度的h方法和p方法; 40 | 41 | 第11讲是高阶及复杂单元,内容有:1D高阶单元、2D高阶单元、3D高阶单元、基于薄板理论的弯曲板单元、子结构与超级单元; 42 | 43 | 第12讲及第13讲是有限元分析的应用领域引论,内容有:结构振动的有限元分析、弹塑性问题的有限元分析、传热问题的有限元分析、热应力问题的有限元分析。 44 | 45 | 第三部分主要为有限元建模,包含第14讲及第15讲。 46 | 47 | 第14讲是有限元分析的典型PROJECT; 48 | 49 | 第15讲是自主专题分析CASE STUDY,要求学生独立完成一个有限元分析实例。 50 | 51 | ### 其余材料 52 | 53 | * [曾老师自己做的讲义](https://www.academia.edu/34293909/%E6%9C%89%E9%99%90%E5%85%83%E5%88%86%E6%9E%90%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B\_Fundamentals\_of\_Finite\_Element\_Analysis) 54 | 55 | ## 其余资料收集 56 | 57 | (慢慢补充) 58 | 59 | * [有限元方法编程](http://cstam.org.cn/static/old/upload/fckeditor/%E6%9C%89%E9%99%90%E5%85%83%E6%96%B9%E6%B3%95%E7%BC%96%E7%A8%8B%20%20%EF%BC%88%E7%AC%AC%E4%B8%89%E7%89%88%EF%BC%89.pdf) 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # README 2 | 3 | 这里是清雨影的Blog。 4 | 5 | 对于我个人来说,是一份技术备忘录,对于读者来说,可以是随时查阅的工具站点。 6 | 7 | 我工作之余写各种开源软件,希望能给这个世界带来哪怕一点点的便利或者贡献,这个博客的目的也是一样的。 8 | 9 | 如果这个博客对你有帮助,或者你发现了错误,欢迎随时通过邮箱 nigel434\&gmail.com (请将&替换为@,这么做是为了防止垃圾邮件) 联系我。 10 | 11 | 我很乐于看到我写的东西对读者有帮助,仅这一条就可以构成我写作的原始动力了。 12 | 13 | ## 访问和转载 14 | 15 | 可以通过: 16 | 17 | * [https://blog.tsingjyujing.com/](https://blog.tsingjyujing.com/) 18 | * [https://tsingjyujing.gitbook.io/blogs](https://tsingjyujing.gitbook.io/blogs) 19 | * [https://tsingjyujing.github.io/blog/](https://tsingjyujing.github.io/blog/) 20 | 21 | 三个地址访问,你可以转载任何你想转载的文章,但是请带上原地址。 22 | 23 | ## 源码 24 | 25 | 这个博客的源代码在:[TsingJyujing/blogs](https://github.com/TsingJyujing/blogs),你可以随时将源代码克隆到本地,然后根据dockerfile里记录的方法编译。 也可以以我这个博客为模版写你自己的博客。 26 | 27 | 目前不支持RSS订阅,但是你可以关注这个Github项目Commit的RSS。 28 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Table of contents 2 | 3 | * [README](README.md) 4 | * [机器学习](ml/README.md) 5 | * [一般话题](ml/common/README.md) 6 | * [再谈正则化项](ml/common/regularization.md) 7 | * [论文阅读:“快把卷积神经网络中的平移不变性带回来”](ml/common/conv.md) 8 | * [半监督/无监督学习收集](ml/common/semi-supervised-learning.md) 9 | * [收藏夹](ml/common/collection.md) 10 | * [推荐系统](ml/recsys/README.md) 11 | * [Understanding LightGCN in a visualized way](ml/recsys/light_gcn.md) 12 | * [Learning To Rank 之 RankNet](ml/recsys/ranknet.md) 13 | * [随想: BPR Loss 与 Hinger Loss](ml/recsys/bpr_and_hinger.md) 14 | * [关于AA测试和AB测试的一些思考](ml/recsys/ab_testing.md) 15 | * [无采样的矩阵分解](ml/recsys/non_sampling_mf.md) 16 | * [收藏夹](ml/recsys/collection.md) 17 | * [强化学习](ml/rl/README.md) 18 | * [Re:从零开始的Multi-armed Bandit](ml/rl/mab-summary.md) 19 | * [高级物理引擎实战指南笔记](game201/README.md) 20 | * [弹簧质点系统](game201/mass_spring.md) 21 | * [光滑粒子法](game201/sph.md) 22 | * [专题:线性方程组求解](game201/linear_eq_solver.md) 23 | * [有限单元法](FEM/README.md) 24 | * [1. 引论](FEM/01-preface.md) 25 | * [2. 基于直接刚度法的杆系有限元方法](FEM/02-direct-stiffness-method.md) 26 | * [3. 针对复杂几何形状变形体的力学描述(1)](FEM/03-complex-deformable-body-1.md) 27 | * Web开发相关技术 28 | * [JWT简介](web/jwt.md) 29 | * [技术杂文](other-tech/README.md) 30 | * [React-Script转Vite时引用路径的问题](other-tech/vite-import-path.md) 31 | * [Let's encrypt -- 让我们一起愉快的使用HTTPS](other-tech/https.md) 32 | * [干掉吸血雷,重塑和谐P2P环境](other-tech/fuck-thunder.md) 33 | * [开源CAN总线信号可编程台架](other-tech/can-panel.md) 34 | * [Linux下利用mdadm设置软件 RAID](other-tech/mdadm.md) 35 | * [互不联网时代的自给自足](other-tech/net-self-sufficient.md) 36 | * [为什么我劝你不要使用云计算?](other-tech/cloud-or-not.md) 37 | * [科学的公司内网连接技术选型](other-tech/innet.md) 38 | * [构建家用NAS过程中的碎碎念](other-tech/nas.md) 39 | * [简易的Linux迁移指北](other-tech/move2linux.md) 40 | * [记录一次rsync命令引起的异常](other-tech/rsync-caused-problem.md) 41 | * [为FFMPEG添加Intel QSV支持](other-tech/ffmpeg_qsv.md) 42 | * [备忘录](other-tech/note.md) 43 | * [福冈外免切替(中国驾照换日本驾照)攻略](other-tech/fukuoka-gaimenkirikae.md) 44 | * [记一个离谱的MySQL语句的性能问题](other-tech/mysql-optimizer-in-clause.md) 45 | * [拯救变砖的OpenWRT路由器](other-tech/save-my-openwrt.md) 46 | * [使用FRP进行内网穿透](other-tech/frp.md) 47 | * [政治不正确](spam/README.md) 48 | * [吃屎系列:资本家如何喂员工吃屎](spam/shit-cap2employee/README.md) 49 | * [华为251事件记忆](spam/shit-cap2employee/huawei-251.md) 50 | * [吃屎系列:资本家如何喂用户吃屎](spam/shit-cap2user/README.md) 51 | * [互不联网公司是如何强奸用户的(持续更新)](spam/shit-cap2user/rape-user.md) 52 | * [吃屎系列:大学如何喂学生吃屎](spam/damn-university.md) 53 | * [推荐系统如何让我们变得极端](spam/recsys-biased-us.md) 54 | * [互联网政治圈观察日志](spam/bull-shit-politics.md) 55 | * [中国网络防火长城简史](spam/gfw-history.md) 56 | * [《线性代数》(同济版)——教科书中的耻辱柱](spam/tj-linear-algebra.md) 57 | * [杂谈](spam/zatsudan.md) 58 | * [访谈:为什么毛泽东时代工人的积极性很高?](spam/workers-interview.md) 59 | * [90年代到21世纪初的商业环境](spam/1990s-env.md) 60 | * [为什么不应该用国产手机](spam/why-not-domestic-phone.md) 61 | * [“救救孩子”](spam/save-children.md) 62 | * [随园食单](recipe/README.md) 63 | * [ボロネーゼ](recipe/spaghetti_bolognese.md) 64 | * [甜酒酿的制作](recipe/tianjiuniang.md) 65 | * [香草与香料](recipe/herb_and_spice.md) 66 | * [皮塔饼](recipe/pita.md) 67 | * [韭菜鸡蛋饼](recipe/garlic-chives-omelette.md) 68 | * [牛肉蔬菜汤](recipe/beef-soup.md) 69 | -------------------------------------------------------------------------------- /book.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "hide-element", 4 | "chapter-fold", 5 | "katex", 6 | "alerts", 7 | "emphasize", 8 | "prism", 9 | "-highlight", 10 | "localized-footer", 11 | "mermaid-gb3", 12 | "ga", 13 | "accordion", 14 | "comments-footer" 15 | ], 16 | "pluginsConfig": { 17 | "hide-element": { 18 | "elements": [ 19 | ".gitbook-link" 20 | ] 21 | }, 22 | "ga": { 23 | "token": "UA-153583635-2" 24 | }, 25 | "comments-footer": { 26 | "type": "github", 27 | "repo": "TsingJyujing/blogs", 28 | "copyright": "Copyright © TsingJyujing" 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | gitbook_serve: 4 | build: 5 | context: . 6 | dockerfile: Dockerfile 7 | image: tsingjyujing/gitbook-serve 8 | tty: true 9 | volumes: 10 | - .:/book 11 | command: "/usr/local/bin/gitbook serve" 12 | ports: 13 | - "4000:4000" -------------------------------------------------------------------------------- /game201/README.md: -------------------------------------------------------------------------------- 1 | # 高级物理引擎实战指南笔记 2 | 3 | 这里是[高级物理引擎实战指南](https://github.com/taichi-dev/games201) 的课程笔记。 -------------------------------------------------------------------------------- /game201/mass_spring.md: -------------------------------------------------------------------------------- 1 | # 弹簧质点系统 2 | 3 | ## 受力分析 4 | 5 | 弹簧指点系统遵循胡克定律&牛顿运动定律: 6 | 7 | ![](../img/2020-07-19-20-03-31.png) 8 | 9 | 并不复杂(当然需要考虑重力)。 10 | 11 | ## 时间积分 12 | 13 | ![](../img/2020-07-19-20-05-20.png) 14 | 15 | ### 前向欧拉 16 | 17 | 通过当前的状态推测下一步的状态 18 | 19 | * 通过当前的受力分析计算加速度,推断下一步的速度( $$\times \delta t$$ ) 20 | * 通过当前的速度计算下一步的位移 21 | 22 | ### 半隐式欧拉 (AKA. Symplectic Euler 对偶欧拉) 23 | 24 | * 通过当前的受力分析计算加速度,推断下一步的速度( $$\times \delta t$$ )(和上面一样) 25 | * 用计算出来的新速度计算下一步的位移 26 | 27 | 实现的时候,在更新计算和地面的碰撞的时候,更新位置之前首先计算和地面的碰撞(`pos.y 而Thompson Sampling是利用一种类似蒙特卡洛的方式来解决这个问题的。 105 | 106 | 我简直是个蠢货,其实解决方案已经被我写出来了而我不自知。我的同事今天给出了一个不算漂亮但是又极其有效的解决方案:采样。 107 | 108 | 假设我们现在通过AA/AB测试获得了数据,求出了C组的分布 $$x_c \sim Beta(a_c, b_c)$$ 和T组的分布 $$x_t \sim Beta(a_t, b_t)$$ ,我们现在要求期望 $$E(x_t - x_c)$$ 或者方差标准差之类的统计参数,直接用[scipy.stats.beta](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.beta.html)的 `rvs` 生成一些样本,将它们相减以后获取新的分布。 109 | 110 | 仔细反省一下为什么我会这么蠢,因为在我看来,AA/AB已经是一种采样了,我们很难想象用预估出来的参数再做采样,这会导致一定程度的失真。 111 | 112 | 但是换个角度想,如果只是为了求得一个封闭解不存在或者很难求的函数的数值解,蒙特卡洛也不是不能接受,采样频率调高一点就能获取足够的精度。一直自觉是个工程师,但是脑子居然在这种地方卡壳了实在是不应该。 113 | 114 | 参考资料: 115 | 116 | * [scipy.stats.beta](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.beta.html) 117 | * [Understanding empirical Bayes estimation (using baseball statistics)](http://varianceexplained.org/r/empirical\_bayes\_baseball/) 118 | * [bayesian ab testing](https://docs.pymc.io/en/v3/pymc-examples/examples/case\_studies/bayesian\_ab\_testing.html) 119 | -------------------------------------------------------------------------------- /ml/recsys/bpr_and_hinger.md: -------------------------------------------------------------------------------- 1 | # 随想: BPR Loss 与 Hinger Loss 2 | 3 | 在之前的文章里,我们在[加速Ranknet](ranknet.md)的时候意外的得到了BPR Loss: 4 | 5 | $$ 6 | L_{\omega} = - \sum_{i,j \in S}{log(sigmoid(s_i-s_j))} 7 | $$ 8 | 9 | 我们说过,Ranknet可以不定用NN,任何可微的模型都可以塞到后端去。其实我们一直没有用贝叶斯的观点来看Ranknet,只是给分数的差值加了一层 sigmoid 之后使用 二元交叉熵损失函数,四舍五入一个亿…啊不对…等于是Logistic回归了,结果就导出了BPR Loss一样的形式。 10 | 11 | ![这不巧了吗,这不巧了吗](../../img/2020-08-03-23-39-24.png) 12 | 13 | 嗯?Logistic回归?也就是说只要是分类模型都可以往上咔咔猛造咯?那为啥一定得是Logistic回归呢?我们可以把身子换了,那干脆把头也换了? 14 | 15 | 其实,平时还会用到另一个Loss,合页损失,一般用在SVM上: 16 | 17 | $$ 18 | L_{\omega} = \sum_{i,j \in S}{max(0,1-s_i+s_j)} 19 | $$ 20 | 21 | 那SVM效果会比Logistic回归好多少吗?不会的,画出来一看就知道了: 22 | 23 | ``` 24 | x = [-5:0.01:5]; 25 | plot(x,max(0,1-x),x,log(1+exp(-x))) 26 | legend('hinger','BPR') 27 | ``` 28 | 29 | ![](../../img/2020-08-03-23-32-49.png) 30 | 31 | 简直就是: 32 | 33 | ![异父异母的亲兄弟啊](../../img/2020-08-03-23-35-46.png) 34 | 35 | 我在我们的系统上做了一些离线实验,结果是BPR略微胜利,我认为原因可能在BPR更加嫩滑…啊不对…光滑上。但是就计算量而言,肯定是Hinger Loss要远远小于BPR Loss。 36 | -------------------------------------------------------------------------------- /ml/recsys/collection.md: -------------------------------------------------------------------------------- 1 | # 资料收集 2 | 3 | ## 博客 4 | 5 | - [见微知著,你真的搞懂Google的Wide&Deep模型了吗?](https://zhuanlan.zhihu.com/p/142958834) 6 | - [知识蒸馏在推荐系统的应用](https://zhuanlan.zhihu.com/p/143155437) 7 | - [Ctr 预估之 Calibration](https://zhuanlan.zhihu.com/p/142086309) 8 | - [推荐系统中稀疏特征Embedding的优化表示方法](https://zhuanlan.zhihu.com/p/141517705) 9 | - [Learning to Rank学习笔记--ListwiseRank](https://zhuanlan.zhihu.com/p/66514492) 10 | - [推荐系统 embedding 技术实践总结](https://zhuanlan.zhihu.com/p/143763320) 11 | 12 | ## 开源项目 13 | 14 | - [wzhe06/CTRmodel](https://github.com/wzhe06/CTRmodel):Spark上的CTR模型 15 | - Naive Bayes 16 | - Logistic Regression 17 | - Factorization Machine 18 | - Random Forest 19 | - Gradient Boosted Decision Tree 20 | - GBDT + LR 21 | - Neural Network 22 | - Inner Product Neural Network (IPNN) 23 | - Outer Product Neural Network (OPNN) 24 | - [jrzaurin/pytorch-widedeep](https://github.com/jrzaurin/pytorch-widedeep):Pytorch实现的Deep & Wide 25 | - [allegro/allRank](https://github.com/allegro/allRank): Pytorch 实现的 Learning To Rank 26 | - [haowei01/pytorch-examples](https://github.com/haowei01/pytorch-examples): Pytorch的,L2R,CF算法的例子。 27 | - [microsoft/recommenders](https://github.com/microsoft/recommenders): 微软的推荐系统最佳实践 -------------------------------------------------------------------------------- /ml/recsys/non_sampling_mf.md: -------------------------------------------------------------------------------- 1 | # 无采样的矩阵分解 2 | 3 | ## 前言 4 | 5 | 很久以前,有个大佬说过,集体负责制就是不负责制,真正的负责是要落实到人的。 那么反过来企业级理解,无采样其实就是全采样的意思。 6 | 7 | ![](../../img/2021-06-19-21-55-53.png) 8 | 9 | 这里的采样,指的是负采样,所谓负,指的就是负样本,负样本是相对正样本而言的。 10 | 11 | 比如在一个购物网站,你购入了某个sku,或者在读书网站,你如痴如醉的读了某本书,那这就是平台期待你做的行为(购买、阅读、打赏、转发等),就是正。反之,点踩,拉黑,静音,视而不见等等这些就是负。 12 | 13 | 当然,用户行为有显式隐式之分,这里不作讨论。就正负样本中,正样本比较好收集,负样本(尤其是显式的)比较难收集。 14 | 15 | 难收集?难收集就不要收集咯! 16 | 17 | ![](../../img/2021-06-19-21-58-26.png) 18 | 19 | 所有用户没发生过行为的,全都是负样本。然后从里面随机采样,为每个正样本拉郎配一些负样本,就可以得到训练数据集。 20 | 21 | 在这个数据集上应用Ranknet(参见这一篇:[Learning To Rank 之 RankNet](bpr\_and\_hinger.md)),就可以训练出一个像模像样的推荐系统。 22 | 23 | 可是采样也是个技术活,用户明显表示不喜欢的,采样权重是不是得高点?具体参看这一篇文章: [负样本为王:评Facebook的向量化召回算法](https://zhuanlan.zhihu.com/p/165064102),这篇文章很好玩,我在实践中发现了和Facebook一样的结论,就是不能只用曝光未点击作为负样本,同时对负样本进行赋权也很重要。 24 | 25 | 采样这么难采,怎么办? 26 | 27 | 难采?难采就不要采咯!(梅开二度) 28 | 29 | ![](<../../img/2021-06-19-21-58-26.png>) 30 | 31 | 不采,就是全采,色即是空,这就是这篇文章的重点。我最早读到这个思路是在 _Efficient Non-Sampling Factorization Machines for OptimalContext-Aware Recommendation_ 里面,后来顺藤摸瓜找到了 _Efficient Neural Matrix Factorization without Sampling for Recommendation_ 。但是我意识到,这个Loss其实不止针对FM,任何可以把用户和物品变成向量,最后用内积评分的模型都可以采用这个Loss。 32 | 33 | ## 非采样Loss 34 | 35 | 进入正题,我们考虑用户对于系统有一些正样本 $$$$ ,三元组里分别是用户,物品和正样本的权重。其实这可以表达为一个稀疏矩阵,不放记作 $$R_{uv}$$ ,横坐标为用户,纵坐标为物品,格子中就是权重,我们以往的思路就是分解这个矩阵,在分解为用户向量组和物品向量组的过程中,找到高维稀疏矩阵的低维稠密表达。 36 | 37 | 这个“找”的过程,其实就是(有损)压缩。而压缩的本质,就是找共同点,找重复处。 比如,我把`abcabcabcabc`压缩成{abc}4,就是找到了共同之处。那么用户行为矩阵 $$R_{uv}$$ 的压缩,就是找到了用户和物品的“群组”,物以类聚,人以群分。 38 | 39 | 但是压缩,意味着新的矩阵要像老的矩阵,怎么评价像不像呢?我们用L2 Loss: 40 | 41 | $$L= \sum_{u \in U}{\sum_{v \in V}{c_{uv}(R_{uv}-{\hat{R}}_{uv})^2}}$$ 42 | 43 | 这个 $${\hat{R}}_{uv}$$,就是我们压缩以后的结果,但是我们先不急着展开这个表达式,我们先展开原本的式子: 44 | 45 | $$L= \sum_{u \in U}{\sum_{v \in V}{c_{uv}(R_{uv}^2 -2{\hat{R}}_{uv}R_{uv} + {\hat{R}}_{uv}^2)}}$$ 46 | 47 | 这一步上过初中应该都能做出来,然后我们一个一个拆: ,第一项的$$R_{uv}^2$$是常数,常数求导是0,所以直接扔掉(P.S. 如果对Loss的真实数值有执念的,这个是可以算出来的,正样本权值平方求和嘛)。 第二项 $${\hat{R}}_{uv}R_{uv}$$ 是两个矩阵Element-wise相乘,$$R_{uv}$$只针对正样本是1,负样本都是0,所以可以简化为: $$\sum_{u \in U}{\sum_{v \in V^+}{c_{uv}(-2{\hat{R}}_{uv})}}$$ 最后一项是个硬骨头,且拆分以后会利用第二项与之合并,下面细说。 48 | 49 | 看到 $${\hat{R}}_{uv}^2$$ 会想起什么?考虑到 $${\hat{R}}_{uv}=P^TQ$$ (P,Q分别是训练中的User和Item的Embedding),我们肯定是展开来,利用矩阵乘法的结合律求 $$\sum{P^TP * Q^TQ}$$,但是不行,因为 $$c_uv$$ 不是常数。 50 | 51 | 不过有困难要上,没有困难制造困难也要上,我们就干脆制造一个可以展开求和的条件。 52 | 53 | 我们首先把想办法$$\sum_{u \in U}{\sum_{v \in V}{c_{uv}}}$$拆成正样本负样本两块,$$\sum_{u \in U}\sum_{v \in V^+}{c_{uv}}$$简写为$$\sum_{pos}$$, $$\sum_{u \in U}\sum_{v \in V^-}{c_{-}}$$简写为$$\sum_{neg}$$,其中,$$c_{-}$$是给所有负样本赋的统一的值。 54 | 55 | 我们可以看到,正样本部分 $$\sum_{pos}{c_{uv}\hat{R}_{uv}^2}$$ 我们就可以和第二项合并到一起了,但是剩下的部分仍然不能方便的求和,因为只有负样本的$$\sum_{neg}{c_{-}\hat{R}_{uv}^2}$$,这里,我们凭空再变一对$$\sum_{pos}{c_{-}\hat{R}_{uv}^2} - \sum_{pos}{c_{-}\hat{R}_{uv}^2}$$出来,其中,前面的部分用于和剩余的负样本部分结合,第二部分加入到第二项中去。 56 | 57 | 我们梳理一下,第一项被我们轻松干掉了,第三项最后变成了$$c_{-}\sum{\hat{R}_{uv}^2}$$,我们用矩阵乘法运算的结合律轻松求出,第二项变成了: 58 | 59 | $$\sum_{pos}{2c_{uv}\hat{R}_{uv} + (c_{uv}-c_{-})\hat{R}_{uv}^2}$$ 60 | 61 | 看上去好复杂,其实计算复杂度一点都不高,只是正样本而已啦! 62 | 63 | 这里我给出我的Pytorch的实现,需要说明的是,这个代码我没有验证过,因为这是我从完整版简化而来,完整版里带了真负样本的计算,还有一些业务逻辑,我都给去掉了。 64 | 65 | 最后,作者的模型里是有h(最后的一层线性层)的,但是从模型看这个h完全就是冗余的,实测效果也是又没有h都没差咯。 66 | 67 | ```python 68 | """ 69 | unknown_negative_weight: c_{-} 70 | positive_weight: c_{uv} 71 | user_embedding: P 72 | item_embedding: Q 73 | core_model.h: h 74 | positive_samples: List of [user_id, item_id] 75 | l2_regular_factor: l2 regular factor 76 | R_pos: \hat{R}_{uv} 正样本部分 77 | """ 78 | 79 | R_pos = ( 80 | user_embedding[positive_samples[:, 0], :] * 81 | item_embedding[positive_samples[:, 1], :] * 82 | core_model.h 83 | ).sum(dim=1) 84 | 85 | classify_loss = unknown_negative_weight * torch.sum( 86 | (user_embedding.t() @ user_embedding) * \ 87 | (item_embedding.t() @ item_embedding) * \ 88 | (core_model.h.view(1, -1) * core_model.h.view(-1, 1)) 89 | ) 90 | classify_loss += torch.sum( 91 | (positive_weight - unknown_negative_weight) * R_pos * R_pos - 2 * positive_weight * R_pos 92 | ) 93 | 94 | # 总体的RMSE Loss,有物理意义的那种哦 95 | rmse_loss_value = (classify_loss + positive_weight_sum) / weight_sum 96 | # 正样本的RMSE Loss 97 | positive_rmse_loss_value = torch.sqrt(((1 - R_pos).pow(2) * positive_weight).sum() / positive_weight_sum) 98 | # 当然也可以求负样本的RMSE,这里略 99 | 100 | regular_loss = sum( 101 | param.pow(2).sum() 102 | for _, param in core_model.named_parameters() 103 | if param.requires_grad 104 | ) * l2_regular_factor 105 | 106 | loss = classify_loss + regular_loss 107 | ``` 108 | 109 | ## 后记+实战结果 110 | 111 | 这个Loss很有禅意,形式很简洁,论文中实验结果表示很有效。如果抛开严谨的数学推导和一些数学技巧,我们可以粗略的看到:其实整个公式相当于先把正样本也当成负样本求和,然后再给圆回来的操作,这么理解就可以直观解释 $$(c_{uv}-c_{-})\hat{R}_{uv}^2$$的意义。 112 | 113 | 但是在我实战的时候,结果显示这个Loss没有优于使用Ranknet Loss的LightGCN,我认为原因在于:我根据曝光强度,对负样本进行了分级,这个Loss做不到。 114 | 115 | 这里还需要再展开一点,我其实尝试魔改了原文的公式,把负样本加入到正样本中去,只是权重为负数,但是负样本太多了(几乎是正样本的100倍!),加上这个Loss不能分Batch训练,考虑负样本的情况下计算效率非常堪忧,丢掉部分负样本效果又下去了。 相比之下,Ranknet可以分Batch,可以在训练的时候实时采样生成样本对,计算效率和最后结果都要略微优于非采样Loss。 116 | 117 | 另外,这里不像Ranknet,正负样本是自动均衡的,怎么配平正负样本是个玄学问题,并不是正负样本权重和是1:1就好的,这个建议交给超参数调整去做(我的实验结果似乎是1:10比较好,实验做的太早了,忘了……)。 118 | 119 | 还有一点最重要的,这个Loss不支持引入Context Feature,你只能干巴巴的使用User Embedding和Item Embedding。 120 | 121 | 以上问题,我想也是实战中使用人数不多的原因。 122 | 123 | 不论如何,虽然形式简单,但是这个Loss数学上的优美仍然吸引到了我,类似的思路,今天用不到,以后遇到分解矩阵的问题或者只有正样本+无其它特征的推荐系统(比如召回模型,我这次不需要做召回所以没用上)的时候可以试一下。 124 | -------------------------------------------------------------------------------- /ml/recsys/ranknet.md: -------------------------------------------------------------------------------- 1 | # Learning To Rank 之 RankNet 2 | 3 | 先记录一下自己的梯度简化推导过程,我自己纸上推了3遍,每次纸丢了就要重新推。 4 | 特此记录,省的全尼玛忘了。 5 | 6 | ## 标准的 RankNet Loss 推导 7 | 8 | 对于Ranknet,其实是将一个排序问题(比如Top N推荐)演变成一个分类问题。 9 | 假设我们已经有一个训练好的评分器,输入User ID和Item ID能给出一个评分,那么,这个评分应该满足越相关(或者用户越喜欢)数值越大。 10 | 那么在训练这个评分器的时候,我们假定有i和j两个item,且i更加相关,那么对于分类来说满足: 11 | $$ 12 | f(u,i)>f(u,j) 13 | $$ 14 | 15 | 换个写法: 16 | $$ 17 | P(f(u,i)>f(u,j))=1 18 | $$ 19 | 对于一般的BCE Loss训练的分类模型,我们有: 20 | 21 | 对于一般的BCE Loss,我们有: 22 | 23 | $$ 24 | L_{\omega} = - \sum_{i=1}^{N}{t_i \times log(f_{\omega}(x_i)) + (1-t_i) \times log(1-f_{\omega}(x_i))} 25 | $$ 26 | 27 | 其中: 28 | - $$f_{\omega}(x_i)$$ 是网络的输出,范围应该在0~1之间,最后一般在Linear层后接入一个Sigmoid激活函数来达到这样的效果。 29 | - $$t_i$$ 是优化目标,一般来说 $$t_i\in\{0,1\}$$,但是实际上允许0~1之间的任意实数。 30 | 31 | 在RankNet中 32 | 33 | 34 | $$ 35 | L_{\omega} = - \sum_{i,j \in S}{t_{ij} \times log(sigmoid(s_i-s_j)) + (1-t_{ij}) \times log(1-sigmoid(s_i-s_j))} 36 | $$ 37 | 38 | 其中: 39 | - $$t_ij$$的取值为: 40 | - 如果$$s_i>s_j$$,则为1 41 | - 如果$$s_is_j$$ 48 | 49 | 如果我们强制$$s_i>s_j$$(如果$$s_i torch.Tensor: 181 | """ 182 | Get loss from one user's score output 183 | :param score_predict: 1xN tensor with model output score 184 | :param score_real: 1xN tensor with real score 185 | :return: Gradient of ranknet 186 | """ 187 | sigma = 1.0 188 | score_predict_diff_mat = score_predict - score_predict.t() 189 | score_real_diff_mat = score_real - score_real.t() 190 | tij = (1.0 + torch.sign(score_real_diff_mat)) / 2.0 191 | lambda_ij = torch.sigmoid(sigma * score_predict_diff_mat) - tij 192 | return lambda_ij.sum(dim=1, keepdim=True) - lambda_ij.t().sum(dim=1, keepdim=True) 193 | ``` -------------------------------------------------------------------------------- /ml/rl/README.md: -------------------------------------------------------------------------------- 1 | # 强化学习相关博客 -------------------------------------------------------------------------------- /other-tech/README.md: -------------------------------------------------------------------------------- 1 | # 技术杂文 -------------------------------------------------------------------------------- /other-tech/can-panel.md: -------------------------------------------------------------------------------- 1 | # 开源CAN总线信号可编程台架 2 | 3 | 刚才开源了一款以前写的[CAN信号可编程台架](https://github.com/TsingJyujing/CAN-panel​) 4 | 5 | 很早以前我接触了CAN总线和一些相关的测试技术,随后写了这个台架,但是一直没开源,原因主要是写的太烂,达不到我开源的标准。 6 | 后来我修修补补,虽然还是很烂,但是我开源的标准降低了啊,所以就开放了。 7 | 再不写点车辆相关的东西我都要忘记自己是车辆工程专业毕业的了。 8 | 9 | 具体的内容可以读Readme,我复制部分重点在这里。 10 | 11 | ![](/img/2020-05-05-22-19-05.png) 12 | 13 | ## 简介 14 | 15 | 有很多设备可以读取CAN总线上的数据,或者模拟发生数据,而可编程的平台并不多,一般是借助厂商提供的API调用驱动,达成和设备进行数据交换的目的。 16 | 17 | 本软件的目的,是构建一个通用的CAN通信规范,可以兼容多种设备,同时有着统一的编程接口,可以对CAN总线进行各种数据操作,完成模拟或者测试的工作。我决定将我这部分工作开源出来,是为了所有饱受手工操作之苦的测试人员做一点事情。 18 | 19 | 成本起见,请尽可能使用便宜的设备,如果总线负载重,超过500帧每秒,请选择贵一点的设备。 20 | 21 | ## 不足之处 22 | 23 | 以下的不足之处,希望有志之士能帮我改进一下。 24 | 25 | 我最早写这些代码的时候经验不足,很多东西如果让我重新来过我一定会重新设计,比如 26 | 27 | - CANSignal的结构设计的比较“硬”对于驱动的支持和测试任务的支持,都应该做成插件式,这样的话比较利于扩展。 28 | - 关于选择脚本语言,JavaScript的资源会多一点,但是如果重新来过我可能会选择C#。 29 | - 关于脚本语言的IDE,也不是很友善,如果重新来过,我可能做成插件式开发,打包之后可以加载到程序里。 30 | - 再来一遍我可能全部使用WPF开发,主要是我之前开发VB6的经验让我更加熟悉WinForm的开发,所以仅仅是编辑器组件使用了WPF 31 | 32 | 最后关于源代码中的变量和函数的命名问题,我需要解释一下: 你可能会看见两种命名风格,一种是getDeviceId这样的Java式(lowerCamelCase),一种是GetDeviceId这种C#推荐的方式(UpperCamelCase/PascalCase)。 这个可能会让你维护的时候觉得有点肮脏。 但是由于我在开发的时候还需要写Java,Python,Matlab以及其它很多语言。在你同时写多种语言的时候切换风格真的是一件非常折磨人的事情,所以最早期的代码全部是Java式的命名(包括我早期的Python代码),最近我已经竭尽全力重构为C#式,但是工作量太大,一时难以全部完成。 33 | 34 | 还有一部分UNIX C式的命名往往是第三方的驱动引入的,这一部分我不准备修改,原因也很简单,开发驱动的人大多是写C或者C++的,他们写的C# API自然也是C的风格。 -------------------------------------------------------------------------------- /other-tech/cloud-or-not.md: -------------------------------------------------------------------------------- 1 | # 为什么我劝你不要使用云计算? 2 | 3 | ## 前言 4 | 这是一篇会引起争议的文章,我写下这行字的时候就觉得,如果这篇文章如果有幸被做云计算的大佬看到,一定会顺着网线过来爆锤我。 5 | 6 | 所以我今天不想说云这个技术的坏话,相反,我是比较期待云技术的,但是我认为云无论是技术上还是商业上都不够成熟,当然,我的见解也有可能是我和我服务的公司体量太小,大公司或许有什么套餐吧(我猜的,但是大公司一般都自己建云了)。 7 | 8 | 我今天写的文章,和我过去几年的经历稍微有点关系,也就是说,我的历史局限性让我写出了今天这篇心血来潮匪夷所思的文字,大佬轻拍。 9 | 10 | ## 正文 11 | 12 | 和解数学题一样,我来说一下简单情况: 13 | 14 | 当你的公司体量大到一定程度,就应该自己做云,享受成本价的云和云带来的便利。 15 | 事实上,国内一些有头有脸的大公司都是这么做的,其中一些还开放出来卖了,我们接下来说的云,就是这些出来卖的云,比如阿里云腾讯云百度云等等(当然也有专门做云,以云为产品的公司)。 16 | 17 | 对于剩下的公司,我的建议只有一条:**尽量不要上云**。 18 | 19 | 这里的尽量指的是,如果你创业非常初期,每年连在IDC放几个机架的钱都掏不出来,甚至居无定所,那么云是你的唯一选择。 20 | 21 | 下面就让我简述一下为什么这么做: 22 | 23 | ### 云的美 24 | 25 | 首先说说不得不上云的情况:如上所述的创业初期,其实也是不应该上云的,理论上说只要你有公网IP,是可以直接在家里放个UPS+机架的,这样比上云稳定性差点,但是便宜的多。但是国内大多数宽带是不给你公网IP的。所以你拿到的IP已经是多少层NAT以后了。 26 | 27 | 有一个特例,我以前在某西部城市办理宽带的时候,上面写着,我们不给你固定IP,如果你需要一个固定的IP,请(要)联(加)系(点)我(钱)们。哪是不给固定IP,压根就没有IP,安装好以后我打开路由器一看,老NAT了。 28 | 29 | 其实他们就是给我公网IP我也不敢当正经服务器用,因为我们小区楼下的交换机基本是这个状态: 30 | 31 | ![比这个好点儿](/img/2020-07-19-17-41-24.png) 32 | 33 | 也就比上面这个好点儿,移动联通电信公用一个交换机,从不上锁,师傅来安装的时候一路连插带拔,也不知道多少人闪断了网。 34 | 35 | 这个时候,云虽然贵,但是给你一种靠谱的感觉,你想象你的服务器会躺在干干净净,恒温18度,控制湿度的空调间里面,除了地震和挖断光纤也不太断网,专业的运维团队为你服务。 36 | 37 | 这个时候,云还有一些诸如函数计算这样的功能,你连服务器的钱都可以省了,真正的按照运行的量收费,也不操心宕机的问题。 38 | 39 | 事实上,偶尔会有实习生临时工不小心干掉你的数据,但是这个案例的几率不高,如果你没什么钱的话,没有人会为你写脚本的,所以看上去你可以高枕无忧。 40 | 41 | ### 云的坑 42 | 43 | 下面我说说云的坑: 44 | 45 | 21世纪什么最贵?人才?不不不,是云上的带宽。 46 | 47 | 想当年那个西部城市,50M的带宽售价326人民币一年,纵使这个价格乘以一百,也赶不上某里云带宽的价格。 48 | 当然你可能会说,上图那种盘丝洞级交换机带来的网络,可以和IDC的专业网络环境比较吗?当然不可以,但是差100多倍真的是超出我的认知了。哪怕我们把云的1bit当1byte来用,那都差了十几二十倍。 49 | 50 | NTT的网络套餐,1G的光纤入户,2360日元一个月,有不固定**公网IP**(重启光猫的时候变化),就我的使用情况来看,和专业的IDC的网络,稳定性也不差多少了。 51 | 于是乎我一口气在家里搭建了好几个服务用,连Vultr几刀一个月的主机也不需要买了。 52 | 具体搭建了哪些服务可以参考我的blog:[互不联网时代的自给自足](/other-tech/net-self-sufficient.md)。 53 | 54 | 我对比了该云的其他产品的价格,比如数据库之类的,没法儿和Vultr这种专做廉价VPS的厂商比,但是价格和Google,AWS也还算是接轨的。唯独带宽,用金贵两个字形容不过分。 55 | 56 | ![](/img/2020-07-19-18-49-22.png) 57 | 58 | ![](/img/2020-07-19-18-49-44.png) 59 | 60 | ![](/img/2020-07-19-18-55-40.png) 61 | 62 | 63 | 64 | 那我不用这个邪恶的某里云不可以吗?当然可以,于是我又去看了某讯云,基本是一样的价格。 65 | 某度云我就不看了,账号早在Pandownload的作者被抓之后,我就把用了十几年的老账号注销了。 66 | 67 | 对比一下,Google的云,带宽是基本不要钱的。 68 | 69 | ![](/img/2020-07-19-18-14-13.png) 70 | 71 | 我又看了Azure和AWS,发现都不太能注意到网络相关的设定,更加不会限制带宽。但是由于GFW的存在,国内的业务,尤其是稳定性有要求的业务,并不适合往上放。 72 | 73 | 我就不对比Vultr这种廉价机场了,和他们比价格太欺负人了。Vultr的总量每月1TB,带宽至少100Mbps的主机才5刀一个月啊,这个配置在国内其实可以应付大部分场景了。 74 | 75 | **为什么偏偏带宽这么贵?**这里是我的个人理解,不一定正确: 76 | 77 | 因为在中国,大部分互联网生意本质上是 **流量生意**,我们常常说某头部大V,之所以说的头部评价指标是关注人数,转发量,浏览量点击量。大部分的互联网公司,本质上是广告公司,说来惭愧,我大学时代一直不能理解为啥互联网公司这么关注流量问题,在我幼小的心灵里,流量并不代表着什么,看的人多,不代表这个东西就好,这个是很朴素的道理,事实证明我的确Naive,它们就是广告公司,就看流量,看CTR/CVR,不然呢?看我的腿毛吗? 78 | 要不然就是做O2O的服务,比如打车,或者外卖,然后骑手用户店铺三头收钱,配合一套大数据杀熟,榨干你的最后一滴。 79 | 当然也有可能这些都不是,因为也有可能是在骗投资人的钱。 80 | 81 | 这样看来,某云其实不是在收带宽费用,而是让你为你的业务增长交税,只不过收税的不是国家,是某云。 82 | 小带宽(1Mbps)起步,不至于让你的网站起不来就因为钱夭折了,等你业务起来以后,需要大带宽的时候的猛烈收费,知道你业务起来以后不在乎这几万块钱,这种看人下菜的操作,我只能联想到个人所得税。 83 | 84 | 我为什么认定带宽价格不是移动联通电信的锅呢?毕竟国内也就这三家占了0.999壁江山啊!因为如果你自己有公司办公场所,开通有公网IP的网络并没有那么贵。 85 | 86 | 除了带宽的价格问题,国内上云的话,被DDOS的概率会比全部自己搞要高的多,可以看我的这个回答:[哪些创业公司把服务器放在腾讯云了?有哪些弊端? - 清雨影的回答 - 知乎](https://www.zhihu.com/question/20983398/answer/316353756) 87 | 88 | 需要说明的是,我并不是说上云就会被DDOS,或者云计算厂商监守自盗,只是我观测到了上云和不上云两个场景下,被DDOS的概率分布有着明显差异,也不知道近几年改善了没有。 89 | 90 | ## 总结 91 | 92 | 看上去我花了很多的篇幅在黑云计算,但是我并不是对云计算这个技术有什么偏见,我觉得王坚博士的《在线》写的很对(虽然此书有打广告的嫌疑),云计算,会成为水电煤一样的基础设施。 93 | 94 | 但是我们不想为带宽和高防付出太多的成本,但是水污染严重的地方,净水就显得弥足珍贵,雾霾肆虐的地方,空气净化器就十分必要。同样,国内的网络环境让我们不得不承受高昂的带宽价格。 95 | 96 | 我有一个简单的判断方法,如果某一天,我们可以用不高的成本在云上自己搭建一个网盘(用函数计算连接其它网盘的不算),那么我觉得云计算就慢慢变得成熟了。 97 | 98 | 真心的希望云有一天能真正成为和水电煤一样的基础设施。 99 | 100 | 写于 2020年7月19日 -------------------------------------------------------------------------------- /other-tech/ffmpeg_qsv.md: -------------------------------------------------------------------------------- 1 | # 为FFMPEG添加Intel QSV支持 2 | 3 | ## 简介 4 | 5 | 使用CPU转码的速度过于慢,在使用12核心的i7-10710U CPU全力转码也只有75fps的情况下,使用自带的Mesa Intel® UHD Graphics (CML GT2)进行转码在CPU占用率只有1/3的情况下,就可以达到400+fps的转码速度,速度提升了6倍。 6 | 7 | 但是直接使用`apt-get`安装的ffmpeg是不带QSV支持的,因为QSV并不是开源的,所以只有自己编译了。 8 | 9 | 如果完全按照[Intel® Quick Sync Video Installation](https://www.intel.com/content/www/us/en/architecture-and-technology/quick-sync-video/quick-sync-video-installation.html)的指示安装,恐怕是要过错年的。文档的格式排版辣眼睛不说,而且连术语都变了,文档让你安装的MediaServerStudio,早已经变成了MediaSDK。 10 | 11 | ## 安装Media SDK 12 | 13 | 首先到Github上下载MediaSDK:https://github.com/Intel-Media-SDK/MediaSDK/releases 14 | 15 | 当然按照Intel的尿性,下载的位置可能有变化,找不到的时候就参考一下官方页面:[Intel® Media SDK](https://www.intel.com/content/www/us/en/developer/tools/media-sdk/overview.html)。 16 | 17 | 随后解开压缩包,并且执行其中的安装脚本: 18 | 19 | ```bash 20 | tar -xzvf MediaStack.tar.gz 21 | cd MediaStack 22 | chmod +x install_media.sh 23 | sudo ./install_media.sh 24 | ``` 25 | 26 | 这第一步就算完了。 27 | 28 | ## 编译FFMPEG 29 | 30 | Intel文档里的这一部分不能说完全正确吧,只能说错漏百出。这里参考ffmpeg的官方的Wiki比较好。 31 | 32 | 首先安装需要的包: 33 | 34 | ```bash 35 | sudo apt-get update -qq && sudo apt-get -y install \ 36 | autoconf \ 37 | automake \ 38 | build-essential \ 39 | cmake \ 40 | libass-dev \ 41 | libfreetype6-dev \ 42 | libgnutls28-dev \ 43 | libmp3lame-dev \ 44 | libsdl2-dev \ 45 | libtool \ 46 | libva-dev \ 47 | libvdpau-dev \ 48 | libvorbis-dev \ 49 | libxcb1-dev \ 50 | libxcb-shm0-dev \ 51 | libxcb-xfixes0-dev \ 52 | meson \ 53 | ninja-build \ 54 | pkg-config \ 55 | texinfo \ 56 | wget \ 57 | yasm \ 58 | zlib1g-dev \ 59 | libunistring-dev \ 60 | libaom-dev \ 61 | git-core libdav1d-dev 62 | ``` 63 | 64 | 官网文档要求安装这些包,但是我的Ubuntu 20.04找不到`libdav1d-dev`所以干脆不装了,不影响QSV的使用,git-core也可以不用安装,不过我的机器上已经安装了git了。 65 | 66 | 之后下载源代码并且生成配置: 67 | 68 | ```bash 69 | wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 70 | tar xjvf ffmpeg-snapshot.tar.bz2 71 | cd ffmpeg 72 | ./configure --enable-libmfx --enable-nonfree | tee config.out 73 | ``` 74 | 75 | 注意,由于我们可能不止使用qsv的ffmpeg,所以一个比较实用的命令会是: 76 | 77 | ``` 78 | ./configure --enable-libmfx --enable-nonfree --enable-gpl --enable-libx264 --enable-libx265 --enable-libvpx --enable-libopus --enable-libsvtav1 | tee config.out 79 | ``` 80 | 81 | 这个时候可能会提示:`ERROR: libmfx not found`。 82 | 83 | 参考[这个ISSUE](https://github.com/Intel-Media-SDK/MediaSDK/issues/1822) 84 | 85 | 只需要`export PKG_CONFIG_PATH=/opt/intel/mediasdk/lib/pkgconfig/`就可以了。 86 | 87 | 实际情况是,我的电脑是64位,所以应该是:`export PKG_CONFIG_PATH=/opt/intel/mediasdk/lib64/pkgconfig`。 88 | 89 | 最后直接make就行: 90 | 91 | ```bash 92 | make -j 12 93 | ``` 94 | 95 | 编译完看一眼支持的codec是不是正确: 96 | 97 | ```bash 98 | ./ffmpeg -codecs|grep qsv 99 | ``` 100 | 101 | 正确的话应该输出类似: 102 | 103 | ``` 104 | ffmpeg version N-105268-g8b9ef5a516 Copyright (c) 2000-2022 the FFmpeg developers 105 | built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04) 106 | configuration: --enable-libmfx --enable-nonfree 107 | libavutil 57. 18.100 / 57. 18.100 108 | libavcodec 59. 20.100 / 59. 20.100 109 | libavformat 59. 17.100 / 59. 17.100 110 | libavdevice 59. 5.100 / 59. 5.100 111 | libavfilter 8. 25.100 / 8. 25.100 112 | libswscale 6. 5.100 / 6. 5.100 113 | libswresample 4. 4.100 / 4. 4.100 114 | D.V.L. av1 Alliance for Open Media AV1 (decoders: av1 av1_qsv ) 115 | DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_v4l2m2m h264_qsv ) (encoders: h264_qsv h264_v4l2m2m h264_vaapi ) 116 | DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_qsv hevc_v4l2m2m ) (encoders: hevc_qsv hevc_v4l2m2m hevc_vaapi ) 117 | DEVIL. mjpeg Motion JPEG (decoders: mjpeg mjpeg_qsv ) (encoders: mjpeg mjpeg_qsv mjpeg_vaapi ) 118 | DEV.L. mpeg2video MPEG-2 video (decoders: mpeg2video mpegvideo mpeg2_v4l2m2m mpeg2_qsv ) (encoders: mpeg2video mpeg2_qsv mpeg2_vaapi ) 119 | D.V.L. vc1 SMPTE VC-1 (decoders: vc1 vc1_qsv vc1_v4l2m2m ) 120 | DEV.L. vp8 On2 VP8 (decoders: vp8 vp8_v4l2m2m vp8_qsv ) (encoders: vp8_v4l2m2m vp8_vaapi ) 121 | DEV.L. vp9 Google VP9 (decoders: vp9 vp9_v4l2m2m vp9_qsv ) (encoders: vp9_vaapi vp9_qsv ) 122 | ``` 123 | 124 | ## 测试 125 | 126 | 编译出来的ffmpeg就可以直接用了,这时我测试的指令: 127 | 128 | ```bash 129 | ./ffmpeg -i input.mp4 -init_hw_device qsv=hw -filter_hw_device hw -vf hwupload=extra_hw_frames=64,format=qsv -c:v h264_qsv -maxrate 5M -movflags +faststart output.mp4 130 | ``` 131 | 132 | 在实际测试的过程中,一些选项是不能用的,比如`-pix_fmt yuv420p -crf 23`这一类的,去掉就可以。 133 | 134 | 偶尔会遇到像素格式不对的问题,需要设置如此设置 `-vf hwupload=extra_hw_frames=64,scale_qsv=format=nv12`。 135 | 但是在实际测试中,这样的转码速度会下降,不知道是不是像素格式引起的。 136 | 137 | ## 参考资料 138 | 139 | * [FFMPEG wiki Hardware/QuickSync](https://trac.ffmpeg.org/wiki/Hardware/QuickSync) 140 | * [Compile FFmpeg for Ubuntu, Debian, or Mint](https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu) 141 | * [英特尔® 快速视频同步 (Quick Sync Video) 技术-英特尔® 官网](https://www.intel.cn/content/www/cn/zh/architecture-and-technology/quick-sync-video/quick-sync-video-general.html) 142 | * [Intel® Quick Sync Video Installation](https://www.intel.com/content/www/us/en/architecture-and-technology/quick-sync-video/quick-sync-video-installation.html) 143 | * [Intel® Media SDK](https://www.intel.com/content/www/us/en/developer/tools/media-sdk/overview.html) 144 | -------------------------------------------------------------------------------- /other-tech/frp.md: -------------------------------------------------------------------------------- 1 | # 使用FRP进行内网穿透 2 | 3 | 我本是个有公网IP的人,奈何最近NTT把我的443端口给封禁了,我便不能再(优雅的)配合DDNS使用自带的这个动态公网IP了。 4 | 5 | 没办法,只得开了一台距离比较近的VPS,在上面设置了一个FRP服务器。在此记录一下设置的过程,以备不时之需。 6 | 7 | ## 获取FRP 8 | 9 | FRP是一个开源的反向代理项目:https://github.com/fatedier/frp 10 | 可以从Release页面下载需要的二进制文件:https://github.com/fatedier/frp/releases 11 | 12 | ### OpenWRT 13 | 14 | 如果你的路由器够强劲,可以试试OpenWRT版本的: 15 | - https://openwrt.org/packages/pkgdata/frpc 16 | - https://openwrt.org/packages/pkgdata/luci-app-frpc 17 | 18 | 其中,luci-app-frpc是在路由器的配置页面上直接配置frpc,但是我试过,其实未必有直接写配置文件来的便捷。 19 | 20 | 直接: 21 | 22 | ```shell 23 | opkg update 24 | opkg install frpc 25 | opkg install luci-app-frpc 26 | ``` 27 | 28 | 即可。 29 | 30 | 虽然说一般不会有人要在路由器上设置FRPS,但是还是写一下: 31 | 32 | - https://openwrt.org/packages/pkgdata/frps 33 | - https://openwrt.org/packages/pkgdata/luci-app-frps 34 | 35 | ## 服务器配置 36 | 37 | 首先下载frp,然后解压:`tar -xzvf frp_0.52.3_linux_arm64.tar.gz` 38 | 39 | 随后将文件复制`frps`到`/usr/bin`(或者任何在PATH里的目录): `cp frp_0.52.3_linux_arm64/frps /usr/bin/` 40 | 41 | 准备以下文件: 42 | 43 | `/etc/frp/frps.toml` 44 | 45 | ```toml 46 | bindPort = 7000 47 | auth.method = "token" 48 | auth.token = "自己设置想要的密码" 49 | # 以下配置为可选项 50 | webServer.addr = "0.0.0.0" 51 | webServer.port = 7500 52 | webServer.user = "admin" 53 | webServer.password = "自己设置想要的管理员密码" 54 | ``` 55 | 56 | `/etc/systemd/system/frps.service`: 57 | 58 | ``` 59 | [Unit] 60 | Description = frp server 61 | After = network.target syslog.target 62 | Wants = network.target 63 | 64 | [Service] 65 | Type = simple 66 | ExecStart = /usr/bin/frps -c /etc/frp/frps.toml 67 | 68 | [Install] 69 | WantedBy = multi-user.target 70 | ``` 71 | 72 | 之后 73 | 74 | ```shell 75 | systemctl daemon-reload 76 | systemctl enable frps 77 | systemctl start frps 78 | ``` 79 | 80 | 即可启动服务,服务一经启动,即不需要进一步的配置,其余的配置都在客户端。 81 | 82 | 还有一点需要确认的是防火墙,每个系统的防火墙不一定一样,这里是Ubuntu的服务器,所以用ufw配置。 83 | 84 | 需要开放7000端口和你之后想要对外放出的端口(这里是443): 85 | 86 | ``` 87 | ufw allow 7000/tcp 88 | ufw allow 443 89 | ``` 90 | 91 | ## 客户端配置 92 | 93 | 同样是下载软件后复制`frpc`到`/usr/bin`(或者任何在PATH里的目录): `cp frp_0.52.3_linux_arm64/frpc /usr/bin/` 94 | 95 | 准备配置文件和服务文件: 96 | 97 | `/etc/frp/frpc.toml` 98 | 99 | ```toml 100 | serverAddr = "VPS的地址" 101 | serverPort = 7000 102 | auth.method = "token" 103 | auth.token = "自己设置想要的密码" 104 | 105 | # 本段落可以配置多个 106 | [[proxies]] 107 | name = "自己给个名字" 108 | type = "tcp" 109 | localIP = "目标机器的地址" 110 | localPort = 目标机器的端口 111 | remotePort = 想要在VPS上暴露的端口 112 | ``` 113 | 114 | `/etc/systemd/system/frpc.service` 115 | 116 | ``` 117 | [Unit] 118 | Description=Frp Client Service 119 | After=network.target 120 | [Service] 121 | Type=simple 122 | DynamicUser=yes 123 | Restart=on-failure 124 | RestartSec=5s 125 | ExecStart=/usr/bin/frpc -c /etc/frp/frpc.toml 126 | ExecReload=/usr/bin/frpc reload -c /etc/frp/frpc.toml 127 | LimitNOFILE=1048576 128 | [Install] 129 | WantedBy=multi-user.target 130 | ``` 131 | 132 | 之后启动服务即可 133 | 134 | ```shell 135 | systemctl daemon-reload 136 | systemctl enable frpc 137 | systemctl start frpc 138 | ``` 139 | 140 | ### 关于OpenWRT 141 | 142 | 如果显示`frp Client - NOT RUNNING`,需要到 http://192.168.1.1/cgi-bin/luci/admin/system/startup 里面启动(Enable&Start)frpc服务。 143 | 144 | 以及,如果目标机器和跑FRPC的机器不是同一台(如路由器跑frpc,树莓派跑服务)情况下,建议设置固定的IP地址。 -------------------------------------------------------------------------------- /other-tech/fuck-thunder.md: -------------------------------------------------------------------------------- 1 | # 干掉吸血雷,重塑和谐P2P环境 2 | 3 | 在我不懂技术的时候,经常使用迅雷下载各种电影,软件,迅雷很好的解决了死链之类的问题,现在来看,在那个带宽不充足的年代,缓解了一部分服务器的下载压力。 但是迅雷对于整个P2P环境的破坏是极大的,你经常可以在peer里面看到很多客户端名字为XL00+一堆乱码,或者Xunlei,7.x.xx之类的,永远只从你这里下载,而不给你上传。 4 | 5 | 说实话,我不是个吝啬带宽的人,我自己用的是光纤,而下载速度上传最快都是可以突破百兆的,我还有公网IP。所有的下载资源,我都会等待分享比率为2.0或者等了很久没人来下载我才会撤。 P2P要能玩下去,平均每个人的分享比率需要大于1.0才可以。 6 | 7 | 而迅雷,则是这样做的: 8 | 9 | 1. 如果对方不是迅雷的客户端,那我就只下载,而不给他上传数据。 10 | 2. 如果对方是迅雷的客户端,则优先给会员数据。 11 | 12 | 除此之外还有百度的离线下载,Xfplayer等等等等。 13 | 14 | 最后导致大家开发了反吸血的qBittorrent。 15 | 16 | ![](../img/2020-05-05-18-59-17.png) 17 | 18 | ## qBittorrent 反吸血增强版 19 | 20 | 如果你是Win或者Mac的客户端,可以尝试下载这位大神Fork的反吸血增强版: 21 | 22 | [https://github.com/c0re100/qBittorrent-Enhanced-Edition](https://github.com/c0re100/qBittorrent-Enhanced-Edition) 23 | 24 | Mac用户可以直接用Brew安装: 25 | 26 | ```bash 27 | brew cask install c0re100-qbittorrent 28 | ``` 29 | 30 | Linux的用户可以自己编译,下载软件源的编译好的结果,或者使用Docker版: 31 | 32 | [https://hub.docker.com/r/superng6/qbittorrentee](https://hub.docker.com/r/superng6/qbittorrentee) 33 | 34 | ## 关于反吸血的一点畅想 35 | 36 | P2P的协议的缺陷在于,假定每个人,尤其是软件制作者都是善良的,这个假设非常脆弱。 37 | 38 | 我猜想以后迅雷这样的软件可能会冒充其它软件来获取数据,对于这种方式,我们需要其它的屏蔽手段: 39 | 40 | 比如,我们可以每个人在下载的时候尝试探测对方。 41 | 42 | 1. 你还没数据,对方已经下载了85%,但是拒绝给你提供任何数据。 43 | 2. 或者你已经给对方提供了某个block的数据,但是和对方请求这个block的数据的时候却无法下载 44 | 45 | 这样的例子多次出现,可以BAN了对方。 46 | 47 | 对方有可能在给别人上传而顾不到你,这个时候,不能运用这些准则百分百判断对方就一定是吸血,但是我们可以设定行为权重,如果出现次数较多,那我建议自动BAN掉这个IP一周再释放。 而P2P协议应该也允许你获取其他人的黑名单,而你可以设置参考权重,选择参考或者不参考。 48 | 49 | 甚至可以用最优化的理论来调节这些权重,在不影响下载和分享的前提下,尽可能屏蔽掉多的IP,这样不好好分享的人就很难捞到好处,而又不至于对P2P生态破坏太大。 50 | 51 | 有些人可能说,我上行带宽吃紧(比如电信,下行和上行差距就非常大),那照我说,上行带宽吃紧就不要参与这个P2P了,连100k都贡献不出来就算了。 52 | -------------------------------------------------------------------------------- /other-tech/fukuoka-gaimenkirikae.md: -------------------------------------------------------------------------------- 1 | # 福冈外免切替(中国驾照换日本驾照)攻略 2025新路线更新版 2 | 3 | ## 简介 4 | 5 | 福岡県外国免許からの切り替え攻略。记录一下福冈市外免切替的流程,以及相应的经验、资源。其它的县应该也是类似的流程,不过我没有经历过。 6 | 7 | 我是2021年8月~9月办理的手续和考试,金额和流程仅供参考。 8 | 9 | 由蒙娜丽派于2025年更新。 10 | 11 | ## 流程 12 | 13 | 目前只支持在筑豊試験場进行考试,当然情况可能有变,建议先找离你最近的試験場问一下。 14 | 15 | 最详细的内容可以看这个最官方的文件:[外国免許からの切り替え手続き](https://www.police.pref.fukuoka.jp/kotsu/unshi/013.html)。 16 | 17 | ### 材料准备和递交材料审核 18 | 19 | 需要准备以下材料: 20 | 21 | - 护照 22 | - 在留卡 23 | - 记载了国籍,且没有My Number的住民票一张 24 | - 可以去区役所办理 25 | - (没测试过)也可以用My Number Card去便利店打印 26 | - 有效的外国(这里是中国)驾照 27 | - 中国驾照的透明壳有一面有星星,有一面没有,制证时装反了会被认为是假证,提前确认一下有没有装反。 28 | - 驾照翻译 29 | - 可以找领事馆或者[JAF](https://jaf.or.jp/common/visitor-procedures/switch-to-japanese-license)翻译。 30 | - 因为疫情,我找的是JAF邮寄材料翻译 31 | - 证件照 32 | - LINE搜索ピクチャン,可以在线编辑证件照后到便利店打印,比较便宜,但是考拍照技术,容易拍丑,哈哈哈哈。 33 | - 能证明你在拿到驾照后在该国家住了三个月的材料 34 | - 护照出入境记录或者支付宝出入境电子记录 35 | - 申请书(到了試験場会有提供) 36 | 37 | 出入境记录最好打电话给試験場询问一下。我的护照办理到初次入境是有3个月的,但是居然不能作为证据,我最后带上了我的以前工作的劳动合同和毕业证才完成证明。如果不打电话,可能审查会白跑一趟。 38 | 39 | 带着这些材料,于工作日的下午1点到达筑豊試験場,走到最深处去交材料,交完材料会预约下次材料审查的面试时间。当天不能进行面试审查。 40 | 41 | 面试的内容是很细致的,包括你在国内考试去没去驾校学习,花了多少钱,学的啥,上课吗,上啥课,考几个科目,每个科目都考啥,你考几分,最后怎么领驾照,考试用车是考场的吗的等等。 42 | 43 | 忘记一些也没关系,忘记了就说忘记了,由于多年前考的,我忘了好多细节,面试也没问题。就当和警察唠磕,过程还是比较放松愉快的。 44 | 45 | 听不懂日语的可以带翻译一起去,但是面接审查处有实时翻译投屏的设备,透明的屏幕在你和审查官中间,非常方便,但是准确率未知。 46 | 47 | 面试和审查材料通过后,就会给你一张线路图(就是考试线路,有且仅有一条,2024年换了新路线,沿用至今)。这个时候可以预约第一次考试的时间,看一下自己的日程表,是可以选考试的日子的,但是有要求的话可能会让考试拖晚一点。 48 | 49 | 面试结束就可以回去了,在约定的日子进行笔试和初次的技能考试。 50 | 51 | ### 笔试(Paper Test)和初次技能考试 52 | 53 | 到了约定的日子(可以电话更改预约),上午8:00-8:30受付,过时不候。先到2号窗口要买一个印纸(其实就是缴费凭证,印纸可以提前买,如果你乐意,上次面试结束以后就可以买,买完以后要写好地址和拼音的姓名),费用的话上一次面试的时候警察会说,或者你和窗口说你要考什么,窗口的工作人员也知道。我考的时候是2550日元。 54 | 55 | 同时需要填写一张质问票(也是考场提供),就是问你有无什么不适合开车的大病。(真有病就不来考试了,所以都写无然后)署名(拼音)日期。注意,质问票的日期是不允许涂划更改的,写错了需要重新填写。 56 | 57 | 填好了去窗口排队,等叫号,然后就会有人带着去测视力和做题。题目一共10道,答对7道合格。可以选择中文题目,下面会附有日语。 58 | 59 | 这个笔试不需要准备,只需要常识就可以做,大家都是在国内考过科目1和科目4的人,肯定没问题,无论国籍还是性别啥的,我还没有遇到任何笔试不过的人。 60 | 61 | 笔试结束以后,就到技能测试等候室等着,考官会给初次考试的人讲解技能考试流程,但是并不是所有的考官都会说细节,而且说明只有日语。 62 | 63 | 说明完成后,就等喇叭喊人去考试,考试一般是2个人一组上车,后面的人可以看着前面的人考,据说是为了防止串通,一个考完以后叫下一个坐车后面。 64 | 65 | ### 技能考试失败以后的重新测试 66 | 67 | 如果你不幸失败了,考官会给你说明你失败的原因,但是不一定会把你所有的问题都说出来。你可以和考官多唠一会儿磕,考官就会和你多说一点。 68 | 69 | 之后考官会把你的照片撕下来还给你,这是你下次填写申请书的时候要用的,不要急着回家,需要去5号窗口按门铃重新预约考试时间,即使日程未定容易变化也不要紧,先预约一个早一点的,之后可以电话变更的。 70 | 71 | 再次考试的流程和初次考试不同,是下午1点交材料,但是你需要重新填写一张申请书(第一次的),质问票,买一张新的印纸。推荐在考试失败之后就提前购买印纸,填写质问票和申请书等等准备材料,这样下次可以省事儿一点。 72 | 73 | 记得全部填写好以后再交给窗口,不要到了窗口再填写,有些警官没有耐心,会让你去一边填写然后重新排队。 74 | 交完材料就会测视力,测完就到技能测试等候室等着喇叭喊人去考试。 75 | 76 | 如果再次失败就重复这个流程,直到成功,或者距离你初次考试/材料审查六个月,审查的材料失效为止,这个时候你需要回到最初重新笔试/提供材料。 77 | 78 | 79 | ### 成功以后拿证的流程 80 | 81 | 如果你成功了,考官会恭喜你,并且让你去买印纸,到了窗口,你说试验合格的印纸,窗口就懂,我这次是2050日元。 82 | 83 | 印纸还是要写好地址和名字,坐在交材料时的窗口附近耐心等就行,所有的考试结束以后,才会统一组织拍照和办证,女生建议提前化妆。 84 | 85 | ### 关于驾校 86 | 87 | 练习还是有必要去的,日本的规则和中国有不同,有许多需要注意的细节。尤其是坐到右侧开车以后,车体感觉也会有不同,日本的S弯和直角弯比国内的似乎窄一些,这都需要适应。即使在国内是个老司机,也建议找个驾校练习一下,而且驾校的练习一般都在周末,不会牺牲工作日,考虑到可以减少失败次数,能省事不少。 88 | 89 | 推荐几个驾校和教练: 90 | 91 | 1. 野間自動車学校:Google搜一下就可以搜到,也可以用LINE搜索,直接可以在LINE上预约课程和咨询,外免切替的课程费用是1万5千多日元左右2小时,训练场地就是考试场地。教练只说日语,好处是能提供和考试一样的车子,教练很严,是按照120分的高标准去训练的,这对考试有好处。 92 | 2. 一位日本教练,但是能说中文,需要微信号请给我发邮件。教练很认真和耐心,关于车体感觉有一套教学方法。不过训练车和考试车车型不同。 93 | - 微信号(经过教练允许发布在此):`kazunori1020` 94 | 3. 理论上,只要你有朋友(3年以上驾龄)有车,带好印纸、誓约书、驾照、你的在留卡或者其它身份证件,去筑豊試験場申请预约,费用大约2750元1个小时,周末开放两天,一天开放5个小时。找驾校的话这部分费用是包含在学费里的。但是预约需要一天,去练车需要另外一天,对个人尤其是住在九大周边还是很麻烦的。 95 | -考场场地需要预约抽选,目前约了基本都能约的上(2025.3)。 96 | 97 | 关于一些听闻的坑: 98 | - 有些教练会带学生“打野战”,也就是找乡下没人的地方去练车。这个万不可取,一旦被抓住,就是无证驾驶,罚款不说,还会留下案底,签证会有麻烦,且5年内不得考驾照。练车一定要去专用的练习场或者周末可以租筑豊試験場这种真考场练习。 99 | 100 | ### 关于考试细节 101 | 102 | 外面切替的考试只有一条线路,但是通过率不高,因为细节太多了。下面说一些: 103 | 104 | - 确认动作幅度要大,否则考官不觉得你确认了,可能扣分 105 | - 十字路口前后的换道时,速度要在30~35km/h左右,速度太低也会扣分 106 | - 在视线被遮挡的区域要探头左右反复确认,且越慢越好,确认安全以后就要加速通过 107 | - 过十字路口转弯的时候速度不能太快,既不要压到中间的菱形,也不能离得太远。 108 | - 过障碍物的时候离障碍物太远也会扣分,骑在中线上绕过去就可以 109 | - S弯或者直角弯掉下去以后不要慌,可以倒车再来,最多可以搞3次 110 | - 除非是自然弯之后就要继续左右转弯,否则不要打转向灯,会扣分 111 | - 除了转弯这种需要低速的场合,其余场合不能太慢。一般在20km/h上下,否则也会扣分,一些直线路虽然短马上要转弯但是也要加速再减速,按照某位兄弟的说法:“你得踩一脚油门让考官知道这车是有发动机的”。 112 | - 50km/h的地方尽量不要超过50,看准码表,刚到50就松开油门比较好 113 | - 中途走错路是没问题的,考官会引导你回去,但是回到正常线路的过程中的失误(比如忘记确认等等)也是会扣分的 114 | - 直角弯右转要贴左,左转要贴右,否则内轮差会让后轮掉下去 115 | - S弯让前轮贴着外侧曲线过,否则内轮差会让后轮掉下去 116 | - 左转的时候要贴左侧,这个要靠车体感觉 117 | - 没有红绿灯等的路口一定要减速左右确认再通过 118 | - 左转右转(或者贴左贴右)的流程是:打转向灯,看中镜,看左(右)侧后视镜,转身转头亲眼看左侧或者右侧(这个中国国内是不要求的,其实实际驾驶也不建议这么做,比较危险),然后才动方向盘。 119 | - 下雨天一定要开雨刮,但是有些人喜欢用雨刮的点来做车体感觉,除非大雨,雨刮杆往下压一下开慢速就行。建议不要用这里做车体感觉。 120 | 121 | #### 考试路线 122 | 123 | (2025年3月) 124 | 125 | ![](/img/fukuoka-gaimenkirikae/route-1.png) 126 | 127 | ![](/img/fukuoka-gaimenkirikae/route-2.png) 128 | 129 | ### 一些tips 130 | 131 | - 上半身短的人,尤其是女生,记得调高座椅高度,椅子右侧有个很大的齿轮,一直转它转到底,座椅调高有利于直角弯和S弯的视野。 132 | - 记得穿底薄薄的鞋,越薄越好,有利于感受踏板。考场车的踏板过于灵敏,轻轻一踩车就猛向前冲,要轻踩踏板。 133 | - 观察时不能仅转头,要真的看向后视镜和后方,考官席位有目線鏡,可以看到你是不是真的看了。 134 | - S弯或者直角弯掉轮了不要紧,要先看后视镜确认安全之后倒车重来,如果没有别的扣分,可以倒车三次。不可直接开走,也不能不看后视镜。 135 | 136 | ## 心态 137 | 138 | 考好几次不过的话心态容易崩溃、至少也是焦虑。也有人考10次不过崩溃后,大哭把考官骂了一顿然后再也不考的。 139 | 的确有特别严格到变态的考官,喜欢在一些没人注意的细节故意挂人。每个考官的标准也是不一样的,这个考官眼里没问题,下一个考官眼里就是失误的可能性也是有的。 140 | 141 | 但是考虑到每次的考官可能都是不同的,所以概率上你几乎总会遇到一个比较和蔼温柔的考官,所以只要尽力发挥,等到遇到正常一些的考官就能过。 142 | 143 | 考试和真正开车是不同的东西,考不好不代表开车技术差,考过了也不意味着上路开车就没问题,更何况考试有一点运气的成分(主要是考官),所以不必崩溃。 144 | 145 | ## 蒙娜丽派的考试没过理由 146 | 147 | - 离一時停止线过近 148 | - 转弯时车没有完全回正就加速,入弯减速不够 149 | - S弯掉轮没看后视镜 150 | - 行驶过程中三点确认时,车会跑偏 151 | 152 | ## 蒙娜丽派听说的考试没过理由 153 | 154 | - 整体开的太慢了 155 | - 过障碍物时开的太快了/离障碍物太近了 156 | - 贴边不在30cm范围内 157 | 158 | 159 | ## 资源和参考资料 160 | 161 | - [(筑豊試験場)外国驾照换日本驾照考试视频](https://youtu.be/rlFL0531isk):如果在筑豊試験場考试的强烈推荐多次观看这个视频,但是这个视频没有解说,所以最好是在去筑豊試験場练习过以后,心中对各个确认点有数以后再看,否则看不出门道。 162 | - [中国架照换日本架照视频教程 外免試験場路線](https://youtu.be/jUfqk7VPcbI) 163 | - [【外免切替】如何把中国驾照换成日本驾照?](https://zhuanlan.zhihu.com/p/21901336) 164 | - Youtube上用日语搜索可以搜索到很多针对单项目的攻略,比如S弯的:[【教習所】S字カーブの走行方法](https://youtu.be/l3M0k36PYzE),这里省略。 165 | - [我在日本的交通违章故事 | 如何把国内的驾照换成日本的【冷水vlog】](https://www.bilibili.com/video/BV1Gv4y1Z7Ub) 166 | - [在日本如何用中国驾照换日本驾照?外免切替保姆级从0开始准备资料到一次过及格的全过程分享](https://www.bilibili.com/video/BV1SK411u7m6) 167 | -------------------------------------------------------------------------------- /other-tech/https.md: -------------------------------------------------------------------------------- 1 | # Let's encrypt -- 让我们一起愉快的使用HTTPS 2 | 3 | ## 前言 4 | 5 | 最近几年,我们跑步进入了HTTPS的时代,得益于SSL,我们的隐私得到了非常好的保护。 HTTPS的根基是[非对称加密技术](https://www.liaoxuefeng.com/wiki/1252599548343744/1304227873816610),这个技术可以在即使有第三方完整监听的情况下进行安全的数据传输,可谓是对抗极权,保护个人利益的神器。 6 | 7 | 当然了,最近美国有人准备[以禁止儿童色情的名义禁止点对点加密](https://www.theguardian.com/technology/2020/mar/06/us-internet-bill-seen-as-opening-shot-against-end-to-end-encryption),这就是后话了。 8 | 9 | 除了安全以外,HTTPS还可以杜绝很多运营商的流氓行为,比如HTTP劫持和DNS劫持。 10 | 11 | * [遇到运营商的 DNS 劫持广告应该怎么办?](https://www.zhihu.com/question/20418863) 12 | * [为什么运营商劫持的行为会普遍存在且无人监管?](https://www.zhihu.com/question/29340133) 13 | 14 | 我以前还住在上海的时候就遇到过联通的劫持,给你的HTTP页面注入广告,都TM注入到我们公司的GIT服务器上了。 15 | 16 | ## 为什么HTTPS这么难 17 | 18 | 作为一台个人PC,不可能存下所有网站的证书,更何况证书还会更新,这就变成了一个先有鸡还是现有蛋的问题,为了解决这个问题,我们引入了一个叫“根证书”的概念。 只有根证书签发的证书才是可信的,制作一张证书本身不需要任何费用,但是: 19 | 20 | > 审核 ,验证 CSR 成本,支持成本,法律成本(保险费用,担保费用) 要进入各个浏览器的根证书列表,WebTrust 年度审计费用,是很大的开销 一些浏览器厂商还会对植入根证书列表的 CA 收费 基础设施开销,CRL 和 OCSP 服务器成本 验证 CSR:就是提交证书申请后,CA要做多项验证,越是高级的证书(比如EV)验证越麻烦。不固定开销,有些要花费很多人力和时间来完成。 CA链费用:新开的CA公司要等5-10年,才会被普遍信任,才能广泛进入根证书链。要想加快点,就得给别的大牌CA公司掏钱,买次级证书。 21 | 22 | 所以现在市面上的HTTPS证书大约是几百到几千元不等。 23 | 24 | ## 为什么不用某些免费签发HTTPS证书 25 | 26 | 比如阿里云就提供一次管一年的免费HTTPS证书,但是这个证书不能做到泛解析,而且相比以前,现在的阿里云把免费HTTPS的申请藏的越来越深了,绞尽脑汁让你买5800一年的证书。兄弟,我一个不盈利的个人站哪来这么多钱给你坑,所以果断选择了Let's Encrypt。 27 | 28 | ## Let's Encrypt 29 | 30 | 但是HTTPS其实不需要这么麻烦,不是吗?我们只需要证明你是你就可以了,于是就有了 [https://letsencrypt.org/](https://letsencrypt.org/) ,通过某种约定(比如在网站的某个目录下放一个特定的文件,或者增加一条解析什么的)证明网站是你的,我们就可以用根证书为你签名一张HTTPS证书。 31 | 32 | 具体的原理在官网上可以看到:[Let's Encrypt 的运作方式](https://letsencrypt.org/zh-cn/how-it-works/)。 33 | 34 | 一次生成的证书管3个月,但是只要你能控制服务器,其实可以用定时任务自动续命。 35 | 36 | 首先是安装软件: 37 | 38 | ```bash 39 | apt-get install letsencrypt -y 40 | ``` 41 | 42 | 随后生成证书就可以了: 43 | 44 | ```bash 45 | letsencrypt certonly --standalone 46 | ``` 47 | 48 | 输入命令以后一步步操作,证书就有了。 在执行之前记得停止你的Nginx(或者其它)服务器,你需要空出443端口等待证书发行方的检验,整个过程非常快,可以在1分钟内完结。 49 | 50 | ## ACME协议 51 | 52 | ACME的全称是 "Automatic Certificate Management Environment" 自动证书管理环境。详细的内容可以看这里:[RFC 8555](https://datatracker.ietf.org/doc/rfc8555/?include\_text=1) 53 | 54 | ACME协议的好处是不需要停止你的服务器,只需要加上一个“无意义”的域名解析,证明域名是你的就可以。缺点就是需要加一条解析会麻烦一点。 55 | 56 | 还有一个好处就是可以实现泛域名。 57 | 58 | ACME的一个比较好的实现在这里:[acmesh-official/acme.sh](https://github.com/acmesh-official/acme.sh) 结合你的域名提供商,可以做到快速生成,自动续命。 59 | 60 | 首先安装ACME.SH 61 | 62 | ```bash 63 | curl https://get.acme.sh | sh 64 | ``` 65 | 66 | 由于我是在阿里云上买的域名,所以首先在阿里云上生成Key和Secret并且赋予DNS和域名的管理权限。其它参见[官方文档](https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E) 67 | 68 | 随后填写你的环境变量后就可以开始执行证书制作了。 69 | 70 | ```bash 71 | export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje" 72 | export Ali_Secret="jlsdflanljkljlfdsaklkjflsa" 73 | 74 | acme.sh --issue --dns dns_ali -d example.com -d www.example.com 75 | ``` 76 | 77 | 这个执行大约需要3~5分钟,可以去泡杯咖啡,回来以后一切就都设置好了。 78 | 79 | 随后会给你的crontab里面加上一条记录: 80 | 81 | ``` 82 | 45 0 * * * "/home/[你的用户名]/.acme.sh"/acme.sh --cron --home "/home/[你的用户名]/.acme.sh" > /dev/null 83 | ``` 84 | 85 | 这样就可以随时保持更新了,如果你觉得心里不舒服,可以修改或者删除。 所有的东西都放在:`/home/[你的用户名]/.acme.sh` 里面,移除也很方便。 86 | 87 | ## Nginx 配置 88 | 89 | 有了证书以后,我们可以给HTTP升级了! 90 | 91 | ``` 92 | server { # 自动跳转到HTTPS 93 | listen 80; 94 | server_name [你的域名]; 95 | return 302 https://$server_name$request_uri; 96 | } 97 | 98 | server { 99 | 100 | # Setup HTTPS certificates 101 | listen 443 ssl; 102 | server_name [你的域名]; 103 | ssl_certificate /home/[你的用户名]/.acme.sh/[你的域名]/fullchain.cer; 104 | ssl_certificate_key /home/[你的用户名]/.acme.sh/[你的域名]/[你的域名].key; 105 | ssl_session_timeout 5m; 106 | ssl_ciphers HIGH:!aNULL:!MD5; 107 | ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; 108 | ssl_prefer_server_ciphers on; 109 | 110 | location / { 111 | proxy_set_header X-Real-IP $remote_addr; 112 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 113 | proxy_set_header X-Forwarded-Proto https; 114 | proxy_set_header X-Forwarded-Host $http_host; 115 | proxy_set_header Host $http_host; 116 | proxy_max_temp_file_size 0; 117 | proxy_pass http://[你的upstream]; 118 | proxy_redirect http:// https://; 119 | } 120 | } 121 | } 122 | ``` 123 | 124 | 注意`ssl_certificate`要用`fullchain.cer`,我之前踩坑了,网站在浏览器里是正常的,但是如果用Python访问就会显示SSL错误,原因就没有提供完整的证书。 125 | 126 | ## 总结 127 | 128 | 总之,用 Let's Encrypt 生成证书,首先你要能控制自己的服务器,其次开头的配置会有一点复杂,但是配置完以后,就可以有永久免费的证书了。 129 | 130 | 网上还有一些方案使用certbot或者其它工具,本质上大同小异。但是如果你是成立了一家公司,就不要省这些小钱了。 131 | -------------------------------------------------------------------------------- /other-tech/innet.md: -------------------------------------------------------------------------------- 1 | # 科学的公司内网连接技术选型 2 | 3 | ## 简介 4 | 5 | 这篇文章主要介绍如何在家、或者在外出差的时候能够连回办公室的内网办公,享受福报。 6 | 本文是一个简介性质的文章,具体技术细节网上有很多博客,况且最近还兴起了用Docker搭建的风潮,不能更方便了。 7 | 请不要把本文的技术用于其他用途哦,否则后果自负~(手动狗头) 8 | 9 | 本文中的技术我们主要评价两个方面: 10 | 11 | 1. 第一个是方便易用,不能为了连接一个内网弄的很麻烦,这会降低享受福报的效率。 12 | 2. 第二个是安全隐蔽,假设有坏人在你公司的外面拦截了你的通信,进行中间人攻击(比如,据我所知各大运营商都会对HTTP协议做一定的中间人攻击来注入广告),时不时还根据且听的流量给你断断网或者做重放攻击什么的。我们的连接方式要经得起考验,安全可靠而且隐蔽。 13 | 14 | (按说没有那么多狗黑客的,可有的时候就是瘸子的屁股——斜了门了……不知道咋回事,这连接就不能稳定,所以第二项也是非常重要的考量因素。) 15 | 16 | ## 内网连接方法介绍 17 | 18 | 首先假设你在公司有一台Linux服务器,可以搭建各种服务。 19 | 这里的Linux也可以是Docker或者WSL系统,但是要设置好宿主机的网络设置。 20 | 21 | ### SSH 隧道 22 | 23 | 这个是最常用的临时方案,SSH隧道建立方便,可以反向代理映射固定的端口,也可以建立socks代理进行访问。 24 | 25 | 这里姑且假设你在公司有一台Linux服务器,并且你能以SSH登陆(一般是22端口),那这个时候你可以开通一个隧道,只需要在本机执行命令: 26 | `ssh -qTNf -D 127.0.0.1:1080 @` 27 | 28 | 这样就构建了一个端口是1080的socks代理。 29 | 参数就不作过多的说明了,网上有很多博客有详细的解说。 30 | 31 | 如果你在用浏览器,可以尝试安装插件:[SwitchyOmega](https://github.com/FelisCatus/SwitchyOmega),一般火狐或者Chrome都可以下载。 32 | 在配置中使用这个端口连接,就可以达到连接公司内网的目的,这个时候你就可以打开只有在公司内网才能打开的网页。 33 | 34 | 同时,SSH还可以作为跳板机连接其他内网机器,一般在ssh config里面设置 `ProxyCommand ssh -o Compression=no <跳板机> nc %h %p` 来做,这里暂时按下不表。 35 | 36 | 安全性上,SSH采用非对称加密,黑客无法获取通信内容。 37 | 缺点是流量特征明显,容易被人刺探到这是个SSH端口(然后经常会收到弱口令攻击),所以密码一定要设置复杂一些。 38 | 同时,推荐使用公私钥登陆,而不是密码。 39 | 40 | ### HTTPS 代理 41 | 42 | HTTP代理很容易实现,也很容易使用,历史悠久,这里就不赘述了。 43 | 但是HTTP代理也存在一个问题:流量透明,别人很轻松就知道你在搞代理,还能知道你在干什么。 44 | 45 | 所以我们加一层TLS,比如利用Nginx,就可以把一个HTTP的服务转化为HTTPS服务,甚至可以挂在到某个网站的特定的路径下。 46 | 如果公司有HTTPS的官网或者博客的话,可以尝试使用这个方法挂载HTTPS代理,记得加上Authentication。这一套都是Nginx反向代理的标准操作了。 47 | 48 | 并不推荐根路径直接连接作为代理的路径,容易被黑客刺探到这个域名就是做代理的,然后被攻击。 49 | 50 | 同样,HTTPS代理也可以被SwitchyOmega使用。 51 | 52 | ### PPTP/L2TP/OpenVPN/AnyConnect 53 | 54 | 这是非常标准的VPN,设计之初也就是为了安全的连接公司内网而设计的,Windows/Linux也有比较好的系统级别的支援。其中L2TP使用的的UDP端口,使用需注意。 55 | 56 | 唯一的问题在于,如果你的公司或者子公司在海外,因为某种原因(大概是离得太远没信号吧,嗯,一定是),你的PPTP/L2TP/OpenVPN服务会非常不稳定,可以说基本不可用。 57 | 58 | 如果你有海外公司,但是又一定要享受便利,推荐你配合内网穿透一起使用。 59 | 60 | 这里的例外是AnyConnect,虽然大家(含SSH)流量特征都很明显,但是由于AnyConnect被大公司使用,海外连接的时候不易出现PPTP那样的不稳定现象。 61 | 62 | 安全性上基本都没有问题(PPTP除外),只是容易被且听到你在使用的技术。 63 | 64 | ### 其他方式 65 | 66 | 1. [v2ray](https://www.v2ray.com/) 67 | 68 | 理论上说V-Project只是一套协议规范,核心是[V-Mess协议](https://www.v2ray.com/developer/protocols/vmess.html)。 69 | 但是v2ray作为代理工具的确是功能强大,不仅仅是单纯的代理,甚至可以做到规则路由。可以创建诸如A网站使用X代理,B网站不使用,C网站使用Y代理等等复杂规则。 70 | 配置过程略痛苦,JSON文件编辑很头疼,经常一写就很长,但是配置好以后使用非常方便。是我强力推荐的工具。 71 | V2Ray在安全上是我见过做的最好的,支持混淆,防止刺探,防止重放攻击。某些黑客基本就是**狗**拿刺猬——无从下口了。 72 | 73 | 2. Shadowsocks 74 | 75 | Shadowsocks也只是一个协议,有很多的实现。 76 | 不过作者喝茶了,加上v2ray也支持ss协议,这里不赘述了。 77 | 这里对作者说一句Respect,感谢每一个无私开源的人。 78 | 79 | 需要说一句的是,ShadowsocksR很火,但是并不推荐使用。 80 | 81 | 3. GoProxy 82 | 83 | GoProxy可以设置一些基础的代理,但是这个工具更大的作用是创建内网穿透,下文会介绍。 84 | 85 | ## 内网穿透 86 | 87 | 大多数的时候,你可能没有公网IP,或者你没有权限使用公网IP,或者因为某种原因你连接不上这个IP(比如你所在的地区屏蔽了这个IP)。 88 | 89 | 这个时候就需要内网穿透了,说到内网穿透,比较有名的是花生壳。但是花生壳的收费也并不便宜。 90 | 当然你也可以自建,自建内网穿透的前提是: 91 | 92 | > 你有一台服务器,并且这台服务器有公网IP。 93 | 94 | 最简单的方式就是买了,比如百度腾讯阿里美团各种云,缺点是价格贵,公网带宽价格**异常的贵**,还不如用花生壳。 95 | 96 | 最好的方法是,尝试在办宽带的时候要求有公网IP(可能会多收钱),如果是静态的IP那就可以直接用IP,如果是动态的IP,那就买个域名做个DDNS。这是我写的阿里云的DDNS方案:[TsingJyujing/aliyun-ddns-client](https://github.com/TsingJyujing/aliyun-ddns-client),欢迎Fork。 97 | 98 | 和之前一样,这里的服务器可以用个人电脑代替(可以在家里建立机房,想想就兴奋)。 99 | 100 | 有了服务器,内网穿透的方案大致有(花生壳以外): 101 | 102 | - Ngrok 103 | - GoProxy 104 | 105 | Ngrok的教程网上一搜一大把,GoProxy的资料少一点,参考[官方文档中内网穿透一章](https://snail.gitee.io/proxy/manual/zh/#/?id=_4%e5%86%85%e7%bd%91%e7%a9%bf%e9%80%8f)。 106 | 107 | 这里我需要评价GoProxy几句: 108 | 109 | 1. 这是个开源软件,但是源代码并不是及时更新的,总是晚于二进制包慢一点更新,而且似乎也并不全,所以并不是真正开源。 110 | 2. 曾经在7.8版本的时候我遇到过: 111 | - GoProxy要自动检查更新 112 | - 但是GoProxy的更新网址设置了反爬虫的CDN 113 | - 这个反爬虫CDN会导致自动更新失败 114 | - 自动更新失败导致整个程序无法使用 115 | 116 | 我认为这个是很好的工具,堪称代理界瑞士军刀,不输netcat,但是软件稳定性及开源精神方面有待加强。 117 | 118 | 穿透内网以后,就可以使用上面介绍的内网连接方法了,只要把端口映射出来就好。 119 | 120 | 内网穿透还有一个好处,比如你直接搭建PPTP服务器,如果你的公司或者子公司在境外的话,服务会非常不稳定,可以说基本不可用,但是如果是通过内网穿透来做,稳定性就会好很多。 121 | 122 | ## 结尾 123 | 124 | 以上就是连接公司内网享受福报的全部方法了,难免有错漏之处,也可能有些新技术没有来得及更新。 125 | 不过有机会的话,还请动手尝试一下。 126 | -------------------------------------------------------------------------------- /other-tech/mdadm.md: -------------------------------------------------------------------------------- 1 | # Linux 下利用 `mdadm` 命令设置软件 RAID 2 | 3 | ## 前言 4 | 5 | RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列),可以用多个小硬盘组成大硬盘,也可以用来容错。 6 | 由于机械硬盘的损坏存在相当大的不确定性,而两块硬盘一起损坏的概率不高,所以我们可以用MDADM做一个软件RAID。 7 | 手上正好有两块1T的硬盘和一块3T的硬盘(不过都是移动硬盘),全部连接到主机上! 8 | 9 | 决定给两块1T设置一个软件RAID1,存放一些重要资料,3T的硬盘放一些不是很重要的资料。 10 | 其实也可以将2块1T的硬盘设置为RAID0,记作分区A,随后在3T硬盘上分出一个2T的分区,记作分区B,将A和B再组装成RAID1。这样就是2T存放重要资料的空间和1T不重要资料的空间。 11 | 不过我手上不重要的视频,电影等等比较多,动漫又全部做了蓝光备份,所以重要资料就是一些数据集和书籍,1T足矣。 12 | 13 | 这里多说一句,不是很推荐RAID5,重建成功率太低了。 14 | 15 | ## 设置方式 16 | 17 | ### 现实支持的分区特性和当前的MD设备 18 | 19 | (注:我这里是做好分区以后运行的,所以会有一个MD0的设备) 20 | 21 | ``` 22 | $ cat /proc/mdstat 23 | Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 24 | md0 : active raid1 sdd1[0] sdc1[1] 25 | 976628736 blocks super 1.2 [2/2] [UU] 26 | bitmap: 0/8 pages [0KB], 65536KB chunk 27 | 28 | unused devices: 29 | ``` 30 | 31 | ### 对挂好的硬盘分区并且格式化 32 | 33 | 以对设备sdc操作为例: 34 | 35 | ``` 36 | parted /dev/sdc --script 'print' 37 | parted /dev/sdc --script 'mklabel gpt' 38 | parted /dev/sdc --script 'mkpart primary 0% 100%' 39 | /usr/sbin/mkfs.ext4 /dev/sdc1 40 | ``` 41 | 42 | 做好以后使用`lsblk`查看一下分区情况,这里可以看到已经完美的分好了: 43 | 44 | ``` 45 | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT 46 | ... 47 | sdc 8:32 0 931.5G 0 disk 48 | └─sdc1 8:33 0 931.5G 0 part 49 | sdd 8:48 0 931.5G 0 disk 50 | └─sdd1 8:49 0 931.5G 0 part 51 | ... 52 | ``` 53 | 54 | ### 设置RAID 55 | 设置很简单,我们就在`sdc1`和`sdd1`上设置了,直接一行命令搞定: 56 | 57 | ```bash 58 | sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1 59 | ``` 60 | 61 | ### 后续处理 62 | 63 | 首先挂载md0设备到你喜欢的文件夹。 64 | 65 | ``` 66 | mount /dev/md0 /media/md0 67 | ``` 68 | 69 | 也要记得将设置写入配置并且更新信息。 70 | 71 | ``` 72 | sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf 73 | sudo update-initramfs -u 74 | ``` 75 | 76 | ### 查看现在的状态 77 | 78 | 再运行`lsblk`,可以看到,设备已经 79 | 80 | ``` 81 | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT 82 | ... 83 | sdc 8:32 0 931.5G 0 disk 84 | └─sdc1 8:33 0 931.5G 0 part 85 | └─md0 9:0 0 931.4G 0 raid1 /media/md0 86 | sdd 8:48 0 931.5G 0 disk 87 | └─sdd1 8:49 0 931.5G 0 part 88 | └─md0 9:0 0 931.4G 0 raid1 /media/md0 89 | ... 90 | ``` 91 | 92 | ### 灾后重建 93 | 94 | 假设分区损坏了,我们需要恢复,方法记在下面,但是没有试过: 95 | 96 | ```bash 97 | #(假设sdc1坏了) 98 | # 设置损坏分区 99 | mdadm /dev/md0 --set-faulty /dev/sdc1 100 | # 移除故障分区 101 | mdadm /dev/md0 --remove /dev/sdc1 102 | # 重新准备一个好的SDC 103 | # 添加分区以后应该自动回开始重建 104 | mdadm /dev/md0 --add /dev/sdc1 105 | # 可以通过如下命令查看重建进度 106 | mdadm -D /dev/md0 107 | ``` 108 | 109 | ## 后记 110 | 111 | 软件RAID的性能其实挺感人的,我的移动硬盘支持支持USB3.0,但是因为电脑旧了所以连接了USB2.0,就是这样以前单盘性能应该是40~50Mb/s左右,结果挂上RAID以后写入速度掉到了14Mb/s,稍稍有些过于感人,不过读取速度还行,但是也不能达到理论上单盘的两倍速度。 112 | 113 | 所以如果对性能有追求的去购买硬件RAID的设备比较好,或者有机箱的人可以考虑一下PCI接口的RAID卡。 114 | 115 | 从小到大我已经搞坏过好多硬盘了,所以千万记得数据备份,或者做RAID啊! -------------------------------------------------------------------------------- /other-tech/move2linux.md: -------------------------------------------------------------------------------- 1 | # 简易的Linux迁移指北 2 | 3 | 这篇文章写的比较简洁,如果有什么不能理解的,可以搜索一下(但是不要用百度,否则你的疑惑可能更深)。 4 | 5 | ## 不适宜使用Linux的人群 6 | 7 | 首先说说哪些人已经被绑死在了Mac/Win的船上下不去了,别的行业不了解,我说说工程师一类的: 8 | 9 | 如果你重度依赖一些无法迁移到Linux的软件系统,比如: 10 | 11 | - 某些CAE/CAD绘图软件 12 | - 开发Mac和iOS程序的Xcode 13 | - Visual Studio 14 | - Excel VBA 15 | - 一些硬件烧写程序和开发工具(比如Keil) 16 | - ... 17 | 18 | 那就老老实实用Mac和Win好了。 19 | 或者电脑的驱动比较封闭,无法正常运行Linux的,我建议使用WSL体验Linux也还凑合。 20 | 21 | 如果你懒得折腾,愿意呆在舒适区,那么不论你现在用的是Mac,Win,还是Linux,切换对你都意味着痛苦,对不? 22 | 23 | ## 为什么用Linux 24 | 25 | 原因其实可以有很多,就我自己的话,除了开发方便以外,我希望控制我自己买的电脑。 26 | 27 | 前段时间Apple的OCSP服务器宕机导致我什么软件都启动不了的经历对我的刺激太大,否则看在设计美观的份上我是愿意接受Mac的。 28 | 这次宕机事件让我觉得我的电脑只是苹果公司租给我的,很没有安全感,好在这台电脑是公司的,否则我真的要气死了。 29 | Windows就更不要说了,我是Win95开始的骨灰用户,写注册表调Win32API开发都经历过,以前还挺喜欢,自从Win10开始了:“我是你爹,你必须更新”的模式以后,就再也不想用了。 30 | 31 | ## 安装Ubuntu 20遇到的坑 32 | 33 | 我个人现在用Ubuntu,但是我同样推荐Deepin,尤其是你不太愿意花时间配置一些细节,Deepin给你提供一个比较完美的开箱即用的体验。不过需要说的是,新版(20)Deepin的默认界面,我觉得是变丑了。 34 | 35 | - 无线驱动有可能打不上 36 | - 其实这个和Ubuntu其实没有关系,如果Securety Boot开启的话,驱动就不一定能打的上 37 | - 话虽如此,Securety Boot该开还是最好要开的 38 | - 磁盘的话,XPS上不兼容RAID模式,要选ACHI模式 39 | - 不推荐安装系统的时候同时安装更新,完全可以安装好以后一边刷B站Youtube一边喝可乐一边更新啊! 40 | - 尤其是家里或者公司里搭建了Nexus的APT镜像的,安装好以后先修改源再更新,那叫一个快啊! 41 | - 当然前提是你家里或者公司里还有一个Linux服务器 42 | - 老生常谈了,安装的时候最好选择英语,否则文档,下载之类的文件夹都是中文的,在命令行里不太方便。 43 | - Ubuntu 20 的声音在有多个输出设备的时候切换的优先级很诡异 44 | 45 | ## 老生常谈的软件问题 46 | 47 | 初到Linux的时候,曾经有很多困难,比如烧写U盘的时候没了破解版的UltraISO,但是事实上Linux下根本不需要这么麻烦。比如制作Win10的启动盘,其实格式化成NTFS以后往里面拖文件就好。如果你实在想烧某个盘,可以用dd命令,如果觉得命令行有门槛,Ubuntu还有启动盘制作工具,磁盘管理工具还支持创建和还原磁盘镜像,树莓派一般是这么烧写的。 48 | 49 | 在比如,Putty和XShell没了,但是你有原生的SSH啊,你完全可以通过SSH Config文件配置跳板机,配合ZSH的自动补全,其实效率只有更高。 50 | 没有WinSFTP,但是scp速度更快,rsync灵活度更高,实在想用图形化,有FileZilla,事实上,用了Linux后,我都不用FileZilla了。 51 | 52 | 很多时候,我们沉溺在Wdinwos下拙劣的模仿者里,回过头来看一看Linux,其实最佳实践已经给我们准备好了。 53 | 54 | - 视频播放:不要说了,VLC永远的神,不止在Linux上,Mac和Win上我也都用。 55 | - Office系列软件:除了自带的 Libra Office,还可以选择 WPS Linux版的,M$ Office可以用在线的,还有Google Doc,腾讯文档等等。 56 | - GIMP:我在Mac和Win上也用,一直当成开源的PS用,不过我其实不太会PS也不太会GIMP(捂脸)。 57 | 58 | 国产软件我们单独说,其余的我真的没有见到Mac/Win上能完成Linux上完不成的任务。 59 | 60 | ## 国产软件 61 | 62 | 国产软件(这里特指国内各大互不连网公司的大作)不少是毒瘤一般的存在,喜欢弹窗,扫硬盘等等,所以我的宗旨是能不用就不用。 63 | 64 | 更大的问题是,国产软件大多只支持Windows,有的支持Mac,支持Linux的很少,所以用起来更加复杂。 65 | 虚拟机固然是个不错的解决方案,但是相比之下过于消耗资源,所以我这里介绍的方法就不谈虚拟机了,用虚拟机的话,VirtualBOX或者KVM都不错,前者比较容易上手,后者更加强大。 66 | 67 | ## 微信 68 | 69 | 微信是支持网页版的,但是腾讯官方有意的削弱网页版,实际情况是很多账号不能登录网页版。 70 | 71 | 所以我推荐两个工具: 72 | - [electronic-wechat](https://github.com/geeeeeeeeek/electronic-wechat):这是把网页版微信封装了一下,优点是和系统结合比较好,缺点是不是所有人都能用。 73 | - [DoChat](https://github.com/huan/docker-wechat) 这个是用Docker版的WINE虚拟Windows环境来运行Win版的微信。优点是功能全,缺点是显示,文件和托盘图标有点小问题。 74 | 75 | 另,最近得到的消息,不是很准确,有时间的朋友帮我测试下: 76 | 为了配合国家的科技自主化战略,微信最近号称开发了原生支持Linux(目前仅仅支持UOS)的版本。但是网友说实际上是网页版微信套壳,是个和[electronic-wechat](https://github.com/geeeeeeeeek/electronic-wechat)差不多的东西,所以腾讯的策略是,只要尝试登录UOS上的微信,就为你的账号解锁网页微信的功能。 77 | 78 | ## QQ 79 | 80 | QQ 其实是有Linux版本的,虽然界面丑爆(简直梦回2008),功能不全,但是胜在干净。缺点还有一个,每次登陆都要你手机扫码,腾讯要确保你安装了手机客户端(这样才能更好的监控你(逃))。 81 | 82 | [Linux QQ](https://im.qq.com/linuxqq/index.html) 83 | 84 | ## QQ,百度云之类的其它软件 85 | 86 | 和WINE微信思路一致,也可以用[RokasUrbelis/docker-wine-linux](https://github.com/RokasUrbelis/docker-wine-linux)这个项目来使用WINE来跑国内的各大毒瘤软件。 87 | 88 | 89 | ## 可操作性解决方案 90 | 91 | 主要涉及鼠标特殊按键,快捷键,人脸识别,输入法等等。 92 | 93 | ### Logitech 鼠标 94 | 95 | Logitech 鼠标(其它牌子每试过,应该差不多)有多余的特殊按键,我一般设置为切换应用等等,Linux下我参考了:[How to configure extra buttons in Logitech Mouse](https://askubuntu.com/questions/152297/how-to-configure-extra-buttons-in-logitech-mouse) 96 | 97 | 根据自己的使用习惯修改即可。 98 | 99 | ### 人脸识别 100 | 101 | 用的是[boltgolt/howdy](https://github.com/boltgolt/howdy),实际使用体验稍显鸡肋。如果不是快速模式,则基本要正脸面对摄像头才能PASS,但是在双屏的时候有点做不到。 102 | 其次,至少快速模式可以被照片破解。最后,识别的速度并不快,(可能比我手速还慢一点)所以我虽然安装了,但是最后还是disable掉了。 103 | 104 | 105 | ### 指纹识别 106 | 107 | DELL工程师回复的方法在这里:[XPS 13 9300 - Does fingerprint reader work on linux?](https://www.dell.com/community/XPS/XPS-13-9300-Does-fingerprint-reader-work-on-linux/td-p/7514958),但是我的笔记本的传感器驱动还没有,所以这是我用Linux唯一的痛。 108 | 109 | ### 触摸板手势 110 | 111 | 如果问我使用Mac,体验最好的地方是什么,那应该是触摸板强大的功能。Linux下也有相应的解决方案,亲测,如果好好配置,和Mac的不相上下。 112 | 113 | 我参考了这个帖子:[Touchpad Gestures in Ubuntu 18.04 LTS](https://askubuntu.com/questions/1034624/touchpad-gestures-in-ubuntu-18-04-lts),我在用的是 [iberianpig/fusuma](https://github.com/iberianpig/fusuma)。 114 | 115 | 安装方式: 116 | 117 | ```bash 118 | sudo gpasswd -a $USER input 119 | sudo apt install libinput-tools xdotool ruby 120 | sudo gem install fusuma 121 | ``` 122 | 123 | 配置文件位置是:`~/.config/fusuma/config.yml`,需要自己创建,内容参考: 124 | 125 | ```yaml 126 | swipe: 127 | 3: 128 | left: 129 | command: 'xdotool key alt+Right' 130 | right: 131 | command: 'xdotool key alt+Left' 132 | up: 133 | command: 'xdotool key super' 134 | down: 135 | command: 'xdotool key super' 136 | 4: 137 | left: 138 | command: 'xdotool key ctrl+alt+Down' 139 | right: 140 | command: 'xdotool key ctrl+alt+Up' 141 | up: 142 | command: 'xdotool key ctrl+alt+Down' 143 | down: 144 | command: 'xdotool key ctrl+alt+Up' 145 | pinch: 146 | in: 147 | command: 'xdotool key ctrl+plus' 148 | out: 149 | command: 'xdotool key ctrl+minus' 150 | 151 | threshold: 152 | swipe: 0.4 153 | pinch: 0.4 154 | 155 | interval: 156 | swipe: 0.8 157 | pinch: 0.1 158 | ``` 159 | 160 | 配置好后直接`sudo fusuma`就可以运行了,建议加入启动程序中,比较方便。 161 | 162 | 163 | ### 输入法 164 | 165 | 只要在语言中安装了汉语以后,就可以添加ibus智能拼音输入法。 166 | 对了,记得开启记忆词汇功能和内置的词典,否则输入还是比较痛苦的,有用户数据的可以尝试导入历史数据。 167 | 168 | 日语输入推荐用Mozc。 -------------------------------------------------------------------------------- /other-tech/mysql-optimizer-in-clause.md: -------------------------------------------------------------------------------- 1 | # 记一个离谱的MySQL语句的性能问题 2 | 3 | ## 故障现象 4 | 5 | 我司有一个系统里存在某个SQL,定期会需要把一些数据标记为删除,这个SQL是这样写的: 6 | 7 | ```sql 8 | -- 注:本文的SQL都进行了脱敏处理,但是绝对不影响理解 9 | UPDATE production_embedding_map 10 | SET deleted = true 11 | WHERE production_id IN (SELECT production_id FROM t_delete_production_ids); 12 | ``` 13 | 14 | Beta环境里测试过了后,就扔到线上去跑了(当时开发的急,只有做功能测试,性能测试则没有做)。 15 | 结果有一天,突然告警,说任务超时了,然后就被自动干掉重新执行,但是重试了几十次仍然是失败的。 16 | 17 | ## 故障重现 18 | 19 | 看到这个SQL的第一反应就是`IN`写的不好(因为已经确认过,`production_id`字段是有索引的),这个没什么证据,就是SQL写多了的直觉(但是仍然写出了这样的SQL,丢人啊)。 20 | 21 | 于是我跑到线上去下载了一份生产数据,本地(其实是另一个服务器)用Docker起了一个MySQL8实例,然后把数据导入本地进行测试。 22 | 23 | 打开一个SQL会话,然后随机抽取一些数据来模拟标记删除的过程: 24 | 25 | ```sql 26 | create temporary table t_delete_production_ids 27 | ( 28 | production_id INT UNSIGNED 29 | ); 30 | 31 | insert into t_delete_production_ids (production_id) 32 | select production_id 33 | from (select distinct production_id 34 | from production) eids 35 | order by RAND() 36 | limit 3000; 37 | ``` 38 | 39 | 然后执行该SQL,期待该SQL直接卡死,然而发现完!全!没!问!题!! 40 | 41 | 多执行了几次发现的确没问题以后,怀疑是MySQL小版本的问题,线上跑的是MySQL 8.0.19而我Docker里面拉的是最新的8.0.30。 42 | 使用二分法最小版本进行测试后发现,该问题在8.0.21被修复了。 43 | 44 | ## 分析与修复 45 | 46 | 其实问题出在执行计划上,如果用EXPLAIN解释原始的SQL,可以看到8.0.20及以前的执行计划是: 47 | 48 | | id | select\_type | table | partitions | type | possible\_keys | key | key\_len | ref | rows | filtered | Extra | 49 | | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | 50 | | 1 | UPDATE | production\_embedding\_map | null | index | null | PRIMARY | 4 | null | 6201234 | 100 | Using where | 51 | | 2 | DEPENDENT SUBQUERY | t\_delete\_production\_ids | null | ALL | null | null | null | null | 2818 | 10 | Using where | 52 | 53 | 如果更新到8.0.21及以后,哦,它把SUBQUERY的结果物化了,然后就变成了和INNER JOIN(最后的解决方案)一样的执行计划(MATERIALIZED这一步骤的执行成本可忽略)。 54 | 55 | | id | select\_type | table | partitions | type | possible\_keys | key | key\_len | ref | rows | filtered | Extra | 56 | | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | 57 | | 1 | SIMPLE | <subquery2> | null | ALL | null | null | null | null | null | 100 | Using where | 58 | | 1 | UPDATE | production\_embedding\_map | null | ref | production\_id | production\_id | 5 | <subquery2>.production\_id | 44 | 100 | null | 59 | | 2 | MATERIALIZED | t\_delete\_production\_ids | null | ALL | null | null | null | null | 3311 | 100 | null | 60 | 61 | 可是我们没法升级MySQL的版本,所以只能绕开它,让MySQL生成和新版一样的执行计划。不讨论Optimizer的骚操作,一般SQL如果在IN上遇到瓶颈,最好的办法是换成JOIN,如果换成INNER JOIN,执行计划就是: 62 | 63 | ```sql 64 | UPDATE production_embedding_map pem 65 | INNER JOIN t_delete_production_ids tdpi ON pem.production_id = tdpi.production_id 66 | SET deleted = true 67 | WHERE tdpi.production_id is not null; 68 | ``` 69 | 70 | | id | select\_type | table | partitions | type | possible\_keys | key | key\_len | ref | rows | filtered | Extra | 71 | | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | 72 | | 1 | SIMPLE | tdpi | null | ALL | null | null | null | null | 2818 | 90 | Using where | 73 | | 1 | UPDATE | pem | null | ref | production\_id | production\_id | 5 | duplicated\_production\_detection.tdpi.production\_id | 46 | 100 | null | 74 | 75 | ## 所以MySQL到底更新了什么 76 | 77 | 其实MySQL的更新说来也简单,就是让优化器变得更加聪明一点,会物化子查询了:[Changes in MySQL 8.0.21 (2020-07-13, General Availability) Optimizer Notes](https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-21.html#mysqld-8-0-21-optimizer) 78 | 79 | > A single-table UPDATE or DELETE statement that uses a subquery having a [NOT] IN or [NOT] EXISTS predicate can now in many cases make use of a semijoin transformation or subquery materialization. 80 | 81 | ## 这个故事告诉我们什么 82 | 83 | - Beta/测试环境的所有版本最好都和生产做到小版本一致 84 | - 对于赶工的项目不可能逐一确认,但是保险起见,所有的SQL最好都扫一眼执行计划 85 | - 我觉得更好的方式是封装执行SQL的部分,仅在Beta环境输出Explain的结果 86 | - 不要完全相信Optimizer 87 | -------------------------------------------------------------------------------- /other-tech/net-self-sufficient.md: -------------------------------------------------------------------------------- 1 | # 互不联网时代的自给自足 2 | 3 | ## 前言 4 | 5 | 本文主要讨论如何自行假设各种网络服务,涉及笔记,音乐,文件共享,源代码管理等等。旨在尽可能自行架设所需的网络服务,不被第三方所绑架,不被一些产品经理喂💩吃。 本文大多使用开源软件,并尽可能挑选可以使用Docker的软件,来简化部署的难度。 6 | 7 | 首先说明我们为什么要自给自足?很简单,因为在线的资源不足以让我们舒服的使用。其次,一些小型的公司和组织有私密性或者性能的要求,不可以使用在线服务。 8 | 9 | 我姑且先说一下我之前也是热衷于使用各种线上服务的,我并不是完全反对线上服务,我比较多用过的包括且不限于: 10 | 11 | * 有道云笔记 12 | * 为知笔记 13 | * 百度音乐盒 14 | * 网易云音乐 15 | * 百度网盘 16 | * 115网盘 17 | * Github 18 | * Gitlab 19 | * Circle CI 20 | * 知乎 21 | * cnblogs 22 | * Slack 23 | * QQ/Wechat... 24 | 25 | 其中有些我现在还在用,但是大多数都不用了。还在用的,有些是因为做的良心(点名:为知笔记(但是我现在不用了),Github,Gitlab,Circle CI),有些是因为没有替代品(点名:QQ,微信)。 26 | 27 | ### 线上服务的罪状 28 | 29 | 我给大家细说一下为什么现在不用某些线上服务/网站: 30 | 31 | 1. 资源限制:比如网盘,给上传不给下载,管杀不管埋,把狗用户骗进来杀,或者诸如早期的Github没有私有库(以及为了一两个私有库开pro有点。。。浪费)之类。 32 | 2. 人为制造数据孤岛:比如有道云笔记,并不能导出为诸如Word哪怕是pdf之类的格式,只进不出。各大互不联网公司互相屏蔽对手的链接,分享极为困难,出现了火星文口令这种反人类的东西。 33 | 3. 无孔不入的广告:商业公司要挣钱我可以理解,VIP还有广告就很过分,不点名了。 34 | 4. 服务降级:比如网易云音乐,开了VIP总该让我下载吧,我想用我索尼的HiFi MP3听可不可以?不可以,下载下来的格式是专有格式,需要联网才能播放。(以前没有这个问题) 35 | 5. 主动给用户添堵:最著名的就是各大厂商的网页版了,相信大家都看过“在App内打开”,“App浏览体验更佳”之类的鬼东西。其实大多数时候只是为了骗用户下载App,好监控你的隐私,以及给你推送。一不小心就跳转到App下载页面,心烦意乱,“使用桌面版”渲染的话,字体简直是视力杀手。 36 | 6. 不可抗力:我自己写的文章,有时候因为一些不可抗力会消失(肯定是知乎的存储没做好,嗯,肯定是),我并不希望它们消失。以及网易云音乐的歌曲有的时候也会因为版权的原因消失。 37 | 38 | 尽管说了这么多缺点,我仍然感谢他们提供的服务(但是还是要挥手说再见)。 39 | 40 | 同时也要说清楚的是,自给自足的线上服务大多不能完成人与人交流的功能,就算你自己建了一个类似Slack的站点,有好用的App,你不可能让你的父母亲戚都用这个Slack,还是得用微信,它们给你发“刚刚!突然宣布……”你还是得收着。 41 | 42 | ## 自给自足的方案 43 | 44 | 以下方案,随着我的使用不定期更新,也欢迎大家推荐自己喜欢的自给自足的服务。 45 | 46 | ### 网络环境 47 | 48 | 以下列举的服务,拿一台旧电脑(当然太旧的也不行)装个Linux就可以都搞定了。 但是如果这样做的话,只能在内网(家里)使用,最近疫情期间,很多人在家办公了,那么内网能用就好。 49 | 50 | 如果你有公网IP,你当然可以嚣张(我家里直接有公网IP,所以就直接建站了,我就很嚣张)。 但是国内大多数运营商给你层层NAT,到你手里都不知道自己是怎么连上的网。所以如果我们希望在办公室或者学校之类的场所使用,需要首先需要一个网络方案。 51 | 52 | #### 购买VPS 53 | 54 | VPS是最稳定的方案,但是因为国内几大云服务厂商的垄断,带宽卖的比金子还贵。 以阿里云为例,8M的带宽一年可以卖到4000元左右。哪怕按量付费的话,8M带宽至少是8毛钱1GB,说难听些,手机移动流量都比这个便宜了。 55 | 56 | 而诸如Vultr的国外云主机,哪怕30块钱一个月的小主机,每个月就有1TB流量,我亲测带宽可以达到100M。 但是由于用Vultr搭梯子的人太多,导致IP容易被Ban,造成误伤。 在国庆,大会以及众所周知但是不能提提了会喝茶的某月某日,IP段会被整体屏蔽。 57 | 58 | 虽然国内外云主机各有各的坑,但是VPS仍然是最稳定的建站方式,专业的IDC机房会比家里的破网络和电力情况要稳定的多,而且便宜的VPS大多数虚拟机,在硬件故障的时候,部分优秀厂商可以做到虚拟机漂移,让你对故障无感。 59 | 60 | 建议多找几个志同道合信得过的小伙伴大家合资购买一个VPS,下面推荐的服务大多是支持多账号的,一起用无论是价格还是运维(可以一人运维一个服务啊)压力都会小很多。 61 | 62 | #### SSL 63 | 64 | 没有SSL,通讯就是在裸奔,容易被运营商灌入广告,缓存攻击,也容易被窃听。 免费的SSL证书教程参见[Let's encrypt -- 让我们一起愉快的使用HTTPS](https://github.com/TsingJyujing/blogs/tree/7faf08d843a36914a418bb44b8d6e4d214b1090a/other-tech/https/README.md)。 65 | 66 | #### 内网穿透 67 | 68 | VPS虽好,在家建站也有在家建站的好处,第一个好处就是数据是在家的,你可以物理的摸到的数据,虽然手上捧着硬盘并不比在IDC靠谱,但是硬件在家的安心感是无法替代的。 69 | 70 | 第一推荐的是 [ZeroTier](https://my.zerotier.com/) 71 | 72 | 这个系统不能让你有公网IP,但是却能让你跨区域组网,如果你只是在固定的几台设备上使用下列服务,那么完全可以试试异地组网。缺点也是有的,这个软件生生的造了很多概念,比如leaf,moon之类的术语,导致文档比较难懂,需要慢慢看,其次是我并不清楚国内速度和稳定性怎么样,但是我知道国内是可以用的。 73 | 74 | 其次推荐花生壳,花生壳的免费版(其实需要付6元)就已经很好用了,如果追求稳定可以买个300多一年的服务,这个钱相比VPS已经是便宜了,相比金贵的带宽性价比居然还可以。 75 | 76 | 如果你有VPS,但是VPS主机内存太小,你可以在VPS上部署内网穿透软件:[snail007/goproxy](https://github.com/snail007/goproxy/),如果嫌管理麻烦的,可以用我写的[开源软件](https://github.com/TsingJyujing/goproxy-tunnel-server)。 77 | 78 | ### 笔记/博客系统 79 | 80 | 我目前用过最好的开源的笔记本应该是[蚂蚁笔记](https://leanote.com/)。 81 | 82 | 唯一的问题是,好久没更新了,项目可能凉了,但是App齐全,大Bug很少,平素使用绝对足够了。 还有一个缺点,用的是MongoDB,不擅长运维MongoDB的同学可能比较容易崩。 83 | 84 | Leanote自带博客系统,但是我更喜欢用Gitbook,这篇博客就是用 Gitbook 做的。 缺点是Gitbook新版似乎国内被墙了,老版本还可以用。 85 | 86 | 如果可以花钱可以购买为知笔记,个人觉得做的是不错的了。 87 | 88 | ### Git 89 | 90 | 我目前用的是[Gogs](https://gogs.io/),异常轻量化,只需要几十兆内存,但是功能齐全。 如果你是一个人使用或者轻度合作的话,Gogs就足够了,如果你有小团队要合作项目的话,Gitlab可能更佳。(但是Gitlab更吃资源,我印象里内存4G起步。) 91 | 92 | 目前我最推荐的还是Github,因为个人也可以无限创建私有项目了,开个Pro也不贵。不过这个不符合我们今天的主题。 93 | 94 | ### 持续集成 95 | 96 | 我前前后后用过TeamCity,Circle CI,Drone和Jenkins。 97 | 98 | 目前我用的是Drone,但是我并不推荐Drone。 主要原因是文档太少,坑太多,全靠自己看源代码折腾,我之所用Drone是因为公司在用,折腾中积累了一些经验。 99 | 100 | 如果不考虑收费,我推荐TeamCity。免费的中间比较推荐的是Jenkins,大家踩坑比较多。会好一些。 101 | 102 | ### 音乐 103 | 104 | 我目前用的是[Airsonic](https://github.com/airsonic/airsonic) 界面有点古老,App也有点过于简单,但是这已经是我能找到的最好的开源音乐软件了。 105 | 106 | 如果考虑收费的话,Subsonic还算不错,airsonic其实就是兼容Subsonic的API,所以可以直接应用Subsonic的App。 107 | 108 | ### 照片,文件和视频 109 | 110 | 照片,文件和视频,我都是靠[Nextcloud](https://nextcloud.com/)完成的: 111 | 112 | 文件的备份就不用说了。Nextcloud 的手机App可以直接帮你备份所有照片到你自己的服务器上。 更好的是,可以用WebDAV挂载,可以内部挂载别的盘(比如Samba或者SFTP协议之类的)。 113 | 114 | 网页内也可以直接播放视频,体验非常不错,不能播放的可以用ffmpeg转码成H264编码就行。 115 | 116 | 缺点是慢,而且有点臃肿,PHP写的,不好改动。 117 | 118 | 我还考察过[Seafile](https://www.seafile.com/en/home/) 119 | 120 | 三个用户以内专业版免费,支持全文搜索(ES实现的),可以说是很良心了,相比Nextcloud功能虽然不多,但是速度很快,也基本能满足使用。 可是我最后没有选它,因为照片备份不方便,这还在其次,它的文件系统格式是自定义的二进制分块存储,不方便我直接在服务器磁盘上操作使用网盘内的文件。 121 | 122 | ### TODO 123 | 124 | 其实还有很多东西我没有做到自给自足,比如Calendar,Task,我用的都是Google的产品。 也并不是所有的东西都需要自给自足,往往是在线服务的使用给了我痛苦的感觉的时候,我才会转向使用自建的服务。 125 | -------------------------------------------------------------------------------- /other-tech/rsync-caused-problem.md: -------------------------------------------------------------------------------- 1 | # 记录一次`rsync`命令引起的异常 2 | 3 | 在开发中,我使用 `rsync -avPz --delete ./ 目标机器:目标文件夹`将我的源代码同步到目标机器上,达到本地IDE编辑,远程服务器运行的目的。 4 | 源码不多,为了省去手动操作的麻烦,我干脆使用watch命令每两秒同步一次。 5 | 6 | 中间连接内网的VPN断开一次,之后发现,机器无法SSH登陆,提示错误:`shell request failed on channel 0`,好在管理员账户还是可以登陆,登陆以后使用`sudo su - 我的用户名`,提示:`su: failed to execute /bin/zsh: Resource temporarily unavailable`。 7 | 8 | 这就很奇怪了,我确认了zsh是存在的,半信半疑之间,我还是yum重装了zsh,并且修改`/etc/password`,让我的用户使用bash,结果还是不行。网上搜索问题也都搜不到点子上。 9 | 10 | 我的直觉告诉我,可能是连接数过多了,于是我使用who命令检查,果然有好几个会话,但是仍然很奇怪,因为平时我工作的时候,偶尔会话开的比这个多的时候也有。 11 | 于是我使用 `ps aux|grep sshd|grep 我的用户名`,好家伙,洋洋洒洒出来一大堆进程,没仔细数,于是使用: 12 | 13 | ```bash 14 | # 注意,此命令有误杀风险,最好先grep出来看一眼再加上 |awk '{print $2}'|xargs -r sudo kill -9 。 15 | sudo ps -ef|grep sshd|grep 我的用户名|grep -v grep|awk '{print $2}'|xargs -r sudo kill -9 16 | ``` 17 | 18 | 全部干掉,恢复正常。 19 | 详细起因仍然不清楚,但是这么多ssh会话除了rsync也没谁能建立了。 20 | 回头还是使用`inotify`配合`rsync`使用吧,偷懒还是不行的。 -------------------------------------------------------------------------------- /other-tech/rust-avr.md: -------------------------------------------------------------------------------- 1 | # 用Rust开发AVR单片机 2 | 3 | 这个是失败的例子 4 | 5 | ## 环境准备 6 | 7 | 安装Rust,这一部分参考:https://github.com/avr-rust/rust 8 | 9 | ```bash 10 | # FROM https://www.rust-lang.org/tools/install 11 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 12 | 13 | # Enable it: 14 | 15 | source $HOME/.cargo/env 16 | 17 | # Add AVR toolchain: 18 | git clone https://github.com/avr-rust/rust.git --recursive 19 | ``` 20 | 21 | 安装rust的时候一定记住不能选完全模式(complete)否则会导致之后旧版本无法安装。 22 | 23 | 整个项目这样clone下来大约3.8G……嗯……准备永久收藏了。 24 | 25 | 然后是build整个项目: 26 | 27 | ```bash 28 | # Grab the avr-rust sources 29 | git clone https://github.com/avr-rust/rust.git --recursive 30 | 31 | # Create a directory to place built files in 32 | mkdir build && cd build 33 | 34 | # Generate Makefile using settings suitable for an experimental compiler 35 | ../rust/configure \ 36 | --enable-debug \ 37 | --disable-docs \ 38 | --enable-llvm-assertions \ 39 | --enable-debug-assertions \ 40 | --enable-optimize \ 41 | --enable-llvm-release-debuginfo \ 42 | --experimental-targets=AVR \ 43 | --prefix=/usr/local/avr-rust 44 | 45 | # Build the compiler, install it to /usr/local/avr-rust 46 | make 47 | make install 48 | ``` 49 | 50 | make和make install这两步可能耗费数小时,需要十足的耐心。 51 | 52 | 就我的记录而言,编译的相当惨烈啊…… 53 | 54 | ![](/img/2020-07-18-23-49-41.png) 55 | 56 | 最后安装就好了: 57 | 58 | ```bash 59 | # Register the toolchain with rustup 60 | # MAC 61 | rustup toolchain link avr-toolchain /usr/local/avr-rust 62 | # Linux 63 | rustup toolchain link avr-toolchain $(realpath $(find . -name 'stage2')) 64 | 65 | # Optionally enable the avr toolchain globally 66 | rustup default avr-toolchain 67 | ``` 68 | 69 | 这个时候切换旧版本:`rustup toolchain install 1.37.0` 70 | 71 | 然后准备安装xargo,也不能直接安装,需要clone源代码切换到0.3.17版本。 72 | 73 | ```bash 74 | git clone https://github.com/japaric/xargo.git 75 | git checkout tags/v0.3.17 76 | cargo install --path ./ --locked 77 | ``` 78 | 79 | 目前为止,仍然失败,暂时放弃。 -------------------------------------------------------------------------------- /other-tech/save-my-openwrt.md: -------------------------------------------------------------------------------- 1 | # 拯救变砖的OpenWRT路由器 2 | 3 | 我的路由器是[TP-Link Archer C7 V5](https://www.tp-link.com/us/home-networking/wifi-router/archer-c7/v5/),之后刷了[OpenWRT](https://openwrt.org/toh/tp-link/archer_c7)系统。 4 | 5 | 其实之所以要用OpenWRT,还是因为官方的固件不稳定(没错,不如OpenWRT稳定),每周左右就要“死”上一次,无法联网。重启还不能解决问题,非得恢复并且重新配置不可。这一点让我多少后悔买TP-Link的路由器。 6 | 7 | 而且OpenWRT的本身是Linux,可玩性更好,这样就可以更好的配置我的网络环境了。 8 | 9 | 今早起床,网络猛然不能用了,于是我切换到了一个备用的路由器,一遍琢磨怎么修复。 10 | 11 | 其实这个时候我应该做的是: 12 | 13 | - 逐个断开有线的连接; 14 | - 同时重启PPPoE并检查网络。 15 | 16 | 但是我不知道怎么脑子抽抽了,居然删掉了`br-lan`,这下作大死直接无法连接到路由器了。 17 | 18 | ## 恢复出厂设置 19 | 20 | [官方文档在这里](https://openwrt.org/docs/guide-user/troubleshooting/failsafe_and_factory_reset)。 21 | 22 | 首先找一台电脑,随便入接一个有线的LAN口。在电脑端设置有线连接的静态IP为 192.168.1.2 (2~254都行,你挑个吉利的数字吧),子网掩码(subnet mask)设置为`255.255.255.0`,网关(gateway)设置为`255.255.255.1`。 23 | 设置完成后给路由器断电,随后找一根牙签,顶着Reset按钮不要放,同时给路由器上电。上电以后仍然不要放手,一直等到电源灯开始狂闪烁的时候再松手。 24 | 25 | 也可以电脑时刻`ping 192.168.1.1`,看到ping通了再撒手。 26 | 27 | 这个时候一些教程提示`telnet 192.168.1.1`,但是如果你的路由器版本够新的话是需要用ssh的,只有15.05及以前需要telnet: 28 | 29 | > Note that modern OpenWrt always uses SSH, but early OpenWrt releases (15.05 and before) offered a telnet connection in this state but no SSH. 30 | 31 | 直接`ssh root@192.168.1.1`,进入以后执行`firstboot && reboot now`即可重置所有的配置。 32 | 33 | ## 注意 34 | 35 | 路由器的整体状态会受所连接设备的影响(按照道理这不应该出现,但是急着上班没时间看了),所以在恢复的时候尽量保证只连接必要的设备,甚至可以设置好PPPOE以后再连接WAN口网线并Restart连接。 36 | 37 | 操作路由器的时候一定要冷静,记得Review自己的修改再Apply,避免造成生产事故。 38 | 39 | 这次影响我网络的设备是一个RaspberryPi 4,平时就是个小透明,但是不知道这次怎么了,居然能搞断我的网络。 40 | -------------------------------------------------------------------------------- /other-tech/video-compress.md: -------------------------------------------------------------------------------- 1 | # 视频压制技术笔记 2 | 3 | ## 不同视频网站的不同标准 4 | 5 | - [Youtube](https://support.google.com/youtube/answer/1722171) 6 | 7 | 8 | ## Youtube 9 | 10 | - Progressive scan (no interlacing) 11 | - Default: https://blog.p2hp.com/archives/7328 12 | - High Profile 13 | - 2 consecutive B frames 14 | - https://www.reddit.com/r/ffmpeg/comments/g708bz/show_the_consecutive_bframes_before_encoding/ 15 | - https://sites.google.com/site/linuxencoding/x264-ffmpeg-mapping 16 | - Closed GOP. GOP of half the frame rate. 17 | - Default: https://streaminglearningcenter.com/blogs/open-and-closed-gops-all-you-need-to-know.html 18 | - CABAC 19 | - Default: https://sites.google.com/site/linuxencoding/x264-ffmpeg-mapping 20 | - Variable bitrate. No bitrate limit required, though we offer recommended bit rates below for reference 21 | - Default 22 | - Chroma subsampling: 4:2:0 23 | - https://trac.ffmpeg.org/wiki/Chroma%20Subsampling 24 | 25 | 26 | Test commands: 27 | 28 | ```bash 29 | ffmpeg -hwaccel_output_format qsv -hwaccel qsv -i input.mp4 -c:v h264_qsv -bf 2 -b:v 6M -maxrate 24M -global_quality 25 -look_ahead 1 -pix_fmt yuv420p output.mp4 30 | ffmpeg -i input.mp4 -c:v libx264 -bf 2 -b:v 7M -maxrate 24M -crf 30 -movflags +faststart -pix_fmt yuv420p output.mp4 31 | # Youtube compress 32 | ffmpeg -i input.mp4 -vf yadif,format=yuv422p -force_key_frames 'expr:gte(t,n_forced/2)' -c:v libx264 -crf ${CRF_VALUE} -maxrate 12M -bf 2 -c:a aac -ac 2 -ar 44100 -use_editlist 0 -movflags +faststart output.mp4 33 | ``` 34 | 35 | ## Bilibili 36 | 37 | ## References 38 | 39 | - https://trac.ffmpeg.org/wiki/Encode/H.264 40 | -------------------------------------------------------------------------------- /other-tech/vite-import-path.md: -------------------------------------------------------------------------------- 1 | # React-Script转Vite时引用路径的问题 2 | 3 | 最大的问题是Import Path的问题,正常情况下,如果我有这样的src: 4 | 5 | ``` 6 | src 7 | ├── Config.ts 8 | ├── ThemeProvider.tsx 9 | ├── api 10 | ├── assets 11 | │ └── react.svg 12 | ├── component 13 | │ ├── CopyText.tsx 14 | │ └── RequiresHttps.tsx 15 | ├── i18n.ts 16 | ├── index.css 17 | ├── locales.json 18 | ├── main.tsx 19 | ├── view 20 | │ ├── ErrorPage.tsx 21 | │ └── Login.tsx 22 | └── vite-env.d.ts 23 | ``` 24 | 25 | 那么,我只要在`tsconfig.json`里的`compilerOptions`添加`"baseUrl": "./src"`,那么我在`main.tsx`里面可以以如下的形式引用: 26 | 27 | ```tsx 28 | import ThemeProvider from "ThemeProvider"; 29 | // Also can be 30 | import ThemeProvider from "./ThemeProvider"; 31 | ``` 32 | 33 | 但是,现在第一种方式用不了了,或许VSCode还能正常识别,但是用vite启动服务器的时候就会找不到包。 34 | 35 | 这个时候只要安装这个包到dev:`https://github.com/aleclarson/vite-tsconfig-paths` 36 | 37 | 随后把配置换成这个: 38 | 39 | ```ts 40 | import { defineConfig } from 'vite' 41 | import tsconfigPaths from 'vite-tsconfig-paths' 42 | 43 | export default defineConfig({ 44 | // 本来是:plugins: [react()], 45 | plugins: [tsconfigPaths()], 46 | }) 47 | ``` 48 | 49 | 就可以自动的从`tsconfig.json`里面导入path,这样一来,就不用写[resolve.alias](https://vitejs.dev/config/shared-options.html#resolve-alias)了。 50 | 51 | 因为毕竟写alias,我看大多数的方案也是做成这样: 52 | 53 | ```ts 54 | // vite.config.ts 55 | { 56 | resolve: { 57 | alias: [ 58 | { find: '@', replacement: path.resolve(__dirname, 'src') }, 59 | ], 60 | }, 61 | // ... 62 | } 63 | ``` 64 | 65 | 导入的时候就是: 66 | 67 | ```tsx 68 | import ThemeProvider from "@/ThemeProvider"; 69 | ``` 70 | 71 | 我仍然不太喜欢,而且对于老项目,需要批量更改import着实是个负担。 -------------------------------------------------------------------------------- /recipe/README.md: -------------------------------------------------------------------------------- 1 | # 随园食单 -------------------------------------------------------------------------------- /recipe/azuki.md: -------------------------------------------------------------------------------- 1 | # 红豆沙馅 2 | 3 | - 红小豆:500g 4 | - 水:1250g 5 | 6 | 以上两样高压锅上汽后20分钟煮软。随后放到不粘锅中进行搅拌。 7 | 8 | - 黄油:55g(可以再多一些) 9 | - 砂糖: 10 | - 80g(微微有一些甜味) 11 | - 120g(作为豆包的甜味下限) 12 | - 盐:1~2g 13 | 14 | -------------------------------------------------------------------------------- /recipe/beef-soup.md: -------------------------------------------------------------------------------- 1 | # 牛肉蔬菜汤 2 | 3 | 参考了意大利和西班牙红烩牛肉的菜谱和法式牛肉高汤的部分制作步骤。 4 | 5 | 6 | ## 原材料 7 | 8 | ### 主料 9 | 10 | - 牛肉:1.5kg 11 | - 洋葱:400g 12 | - 西芹菜:一根,大约100g 13 | - 胡萝卜:400g 14 | - 西红柿:800g(可以配合新鲜西红柿和西红柿罐头) 15 | 16 | *以上的量都可以调整 17 | 18 | ### 辅料 19 | 20 | - 大蒜(大约1头) 21 | - 红葡萄酒(200ml~400ml) 22 | - 黑胡椒 23 | - 罗勒 24 | - 牛至 25 | - 番茄酱 80g(推荐亨氏的) 26 | - *可以加番茄膏增加浓度 27 | - 可以加红椒粉(不辣)增加颜色 28 | 29 | ## 制作方法 30 | 31 | 1. 牛肉切成1~2口大小焯水,洗去血沫待用 32 | 2. 洋葱切成丝,大蒜切成末,放入锅中,加一些黑胡椒炒到褐色,放入汤锅中 33 | 3. 不要洗锅,加油煎牛肉,煎出焦化层,放入汤锅中 34 | 4. 加入红酒洗锅,洗下锅上的焦化层,煮沸后煮1~2分钟 35 | 5. 番茄切成丁,胡萝卜切3~5厘米的块,芹菜切成10cm左右的段,放入汤锅中 36 | 6. 加入适量的水,恰好淹没材料即可 37 | 7. 煮开,搅拌均匀,撇去浮沫 38 | 8. 加入番茄酱,盐,罗勒,牛至和足量的黑胡椒(以及番茄膏等) 39 | 9. 如果有高压锅,上汽后计时20分钟自然冷却泄压,如果没有,最小火炖煮2小时左右 40 | 41 | ## 注意点 42 | 43 | - 油:推荐用橄榄油,也可以使用其它植物油或者黄油清代替 44 | - 洋葱和牛肉的焦化操作也可以用烤箱完成,西红柿也可以整个放进烤盘中烤后去皮 45 | - 牛肉选择稍微带一点肥肉的比较香,但是也容易腻 46 | 47 | -------------------------------------------------------------------------------- /recipe/garlic-chives-omelette.md: -------------------------------------------------------------------------------- 1 | # 韭菜鸡蛋饼 2 | 3 | ## 制作方法 4 | 5 | 韭菜250g(参考值)切成丁(即5mm左右的小段),锅中放入少许油,将韭菜炒软炒绿后离火冷却。 6 | 鸡蛋2~3枚(视锅和灶台大小调整,锅小可以只作两枚甚至一枚),打散后加入3~5g盐,少许胡椒粉和其他想要的调味料(比如芝麻油)。 7 | 鸡蛋和调味料搅拌均匀以后加入炒好的韭菜,搅拌均匀以后重新加油起锅。 8 | 9 | 鸡蛋下入锅中以后,开小火并且转动锅身使鸡蛋饼薄且成熟均匀,翻面的时候如果整个翻面有困难,可以用锅铲划成小块以后逐个翻面。 10 | 11 | 我喜欢在成熟的蛋饼上洒上现磨的胡椒增加香气,你也可以根据自己的喜好调整。 12 | 13 | ## 后记 14 | 15 | 这是一个简单的菜谱,难度在蛋饼的翻面和火候上,这部分难以写成文字,只能靠练习去掌握。 16 | 17 | 唯一的要点是韭菜一定要先炒过,这样做可以提升口感,也可以在同一个鸡蛋饼里多放入一些韭菜(韭菜数量写参考值的原因就是,这道菜应该尽你的能力,在能成饼的前提下多放一些韭菜)。 18 | 19 | 我爷爷为了让不爱吃蔬菜的我尽可能多吃一些蔬菜,经常给我做这道韭菜鸡蛋饼吃。 20 | 21 | 现在把这道菜写出来,也是写给所有不爱吃蔬菜的孩子和担心的家长。 22 | -------------------------------------------------------------------------------- /recipe/herb_and_spice.md: -------------------------------------------------------------------------------- 1 | # 香草与香料 2 | 3 | 烹饪的时候会使用许多带有香味的植物,比如葱、姜、蒜、八角、桂皮、香叶、草果、肉桂、罗勒、胡椒、薄荷之类。其使用的方法也是多种多样,可以直接蒸、煮、煎、炸,也可以磨成粉撒在食物上等等。 4 | 5 | 但是大致说来,香辛料的使用大致分为两种:作为香草与作为香料。 6 | 7 | 其中香料一般都会和食材一起进行长时间的烹煮,比如法式高汤里用大葱叶卷起来的一堆香草料以及和烤制的牛骨一起炖煮的蔬菜(芹菜,胡萝卜等)都算是广义上的香料。烧红烧肉或者卤肉的时候放的生姜八角桂皮香叶等也算是香料,这些香料大多有木质的感觉但是又有所区别,如八角是浓郁的甜香味,桂皮则是较为沉稳的木香味(辞穷)。还有一些在食材腌制的时候就需要参与,磨成粉抹在食材的表面等等。无论形式如何,其共同点是通过长时间的烹煮出味,而这些味道又不易挥发(不如说易挥发的已经在烹饪中消失了),食用的时候入口之前难以感受到他们的存在,在口中停留片刻他们的香味才会附和着食材的香气充斥口腔和鼻腔。 8 | 9 | 而香草往往是在烹饪的最后放入的香味物质,比如出锅前的小葱,三杯鸡里的九层塔,出锅后撒上的一些黑胡椒碎,炸物上撒上的柠檬汁或者柠檬皮屑。其特点是香气强劲、轻盈且清新,之所以最后放,是因为这些香味过于脆弱,稍有加热或者时间一长就会挥发殆尽,这就是为什么有的时候酒店打包带回家的菜或者放到第二天吃的菜会感觉平淡,香气不复存在甚至产生一些不愉悦的气味。 10 | 11 | 当然也并不仅仅局限于以上两者,比如三杯鸡里的九层塔其实需要翻炒一下去掉过于浓烈的气味,淮扬菜的奶汤鮰鱼最后放的一点白胡椒,川菜里有泼热油的手法激发青花椒、大蒜、辣椒的香气,粤菜的清蒸鱼最后也要往葱丝上来一勺热油,就不完全符合上述香草的定义。少许的加热有的时候会产生比直接投入更好的效果。 12 | 13 | 香料和香草的同时存在,让食物的味觉又了层次,一块红烧肉,刚入口甚至尚未入口的时候是刺激的葱香(当然也可以撒一点黑胡椒),随后是焦糖、八角、桂皮等伴着动物油脂的香气,最后能细细品到酒香以及腐乳发酵的风味。这样的香气组合,伴随着甜入口,浓香咸鲜味收口的味觉体验,就显得非常的立体,嘴里的味道有了变化,就能持续带来刺激,就不会腻。 14 | 同理,做焖饭的时候,最后切一些细细的葱丝或者洋葱丝拌入其中,就不容易出现吃两口就腻了的情况。 15 | 16 | 同一种植物可以随着放入时间的不同,也可以体现香料和香草两种特性,例如爆锅和起锅的时候都放一点葱,前者是香料,后者是香草。是香料还是香草取决于你使用植物香味中的易挥发部分还是难挥发部分。当然这里我们忽略了一种特例:腌制。一般来说,香草的香味物质易挥发所以不适合长时间炖煮,所以一般都是作为外挂味使用的。而腌制是一种可以使小分子易挥发的香味物质也可以深入食材内部的技术(只不过在我的实践中,大部分情况下的香草香味仍然会随着烹饪而消失最后只留下少部分香气)。 17 | 18 | 除此之外,抛开香草和香料的定义,更加广义的来讨论这个香味植物与加热时机的问题。烹饪中经常使用分阶段加热/投放的手法来获得更加丰富立体的味/嗅觉体验,比如蒸生蚝时候使用的金银蒜碎,一部分是油炸的沉稳香气,一部分是生蒜的清新暴烈,就比单独使用一种蒜来的更合适。这里虽然都是作为香料使用,但是加热的步骤不同让其发挥不同的香气。 19 | 20 | 甚至除了加热时间,不同的溶剂也会带来不同的香料味觉体验。用水煮的葱姜大料和使用葱姜香菜炸的香料油的气味肯定是不同的。一般来说,香气更容易富集在脂肪里,所以如果有红烧肉的油,可以试试收集来炒菜,往往会获得比红烧肉汤(水的部分)本身更浓郁的香料味(注:当然,这样做你就不能把汁收的太浓,更像是东北坛肉的做法了)。 21 | 22 | 虽然说了许多关于香草和香料的东西,但是其实不必拘泥于这些条条框框。只需要在设计烹饪菜肴的时候,注意使用不同的加热时间、加热介质或者腌制技巧来获取不同的香气,使菜肴的香气层次丰富较为立体,那么加入的东西属于香料还是香草其实并不重要了。 23 | -------------------------------------------------------------------------------- /recipe/pita.md: -------------------------------------------------------------------------------- 1 | # 皮塔饼 2 | 3 | 皮塔饼(英语:Pita),又称阿拉伯薄面包或口袋饼,是一种圆形口袋状面食,广泛流行于希腊、土耳其、巴尔干半岛、地中海东部地区和阿拉伯半岛。皮塔饼中的“口袋”是由蒸汽膨胀形成,面饼冷却后变得平坦,中间留下一个口袋。——Wiki 4 | 5 | ## 配方 6 | 7 | | 配料 | 剂量 | 备注 | 8 | | ------------ | ---------- | -------------------------------------------------- | 9 | | 面粉 | 250g | 中筋面粉或者高筋面粉均可,推荐高筋面粉 | 10 | | 油 | 20g | 有教程推荐使用橄榄油,实际过程中任何喜欢的油都可以 | 11 | | 盐 | 5g | (经测试,实际操作中略少一些也可以) | 12 | | 糖 | 5g | - | 13 | | 泡打粉 | 1g | - | 14 | | 酵母粉 | 2g | - | 15 | | 水 | 115g~125g | - | 16 | | 鸡蛋 | 1个 | 如果不放鸡蛋,则一个鸡蛋约折合50g水 | 17 | | (可选)奶粉 | 10g | 这里我没有奶粉,所以将一部分水换成牛奶 | 18 | 19 | ## 面团的制作和发酵 20 | 21 | ### 大面团制作 22 | 23 | 如果有厨师机或者面包机的话,可将上述材料直接混合到一起搅拌,然后发酵就行。 24 | 25 | 如果没有,那就采取以下步骤: 26 | 27 | 1. 将酵母粉用水化开备用 28 | 2. 将面粉,盐,糖,泡打粉,奶粉(如果有的话)混合均匀,中间打入鸡蛋 29 | 3. 将鸡蛋打散,打散的时候,鸡蛋会逐渐和面粉混合到一起,再中央形成一个较稀的面团 30 | 4. 将刚才的酵母粉水慢慢加入,用筷子搅拌直到形成一个不均匀的面团 31 | 5. 手上粘上一部分的油,揉面,揉到初步均匀即可。 32 | * 由于这个面特别的软,如果手上不抹油的话会很难揉。 33 | * 实在没法揉就等几分钟(醒面),水会自然在各部分间相互渗透,届时会好揉一些,不用和面团较劲。 34 | 6. 醒面10~20分钟。 35 | 7. 手上抹油继续揉面,直到把剩下的油都揉将进去。 36 | 8. 封闭发酵到2倍大,约要45分钟~1小时。 37 | 38 | ### 揉面备注 39 | 40 | 这个面团配方的粉水比大约在1.42~1.5,要知道,比较硬的面团(如面条面),粉水比约在2.17,比较软的面团(如制作包子馒头)在1.8左右,粉水比低于这个数字就较难直接揉了。如果没有厨师机,就遇到了不得不揉这么一团湿面的惨状。湿面团极其粘手,如果没有手粉或者油脂作为辅助,是没法揉的。 41 | 42 | 揉面的手法大致有两种,揉和揣,揉是用手指将面叠起来以后用手掌压下去,而揣是用五指将边缘的面叠起来或者捏到中间以后用拳头压下去。 43 | 揣面更加不容易吸油,借此机会可以给面整形但是对混合均匀无大益。而揉面相对更多的会将外层的面压裂而吸收更多的油,一般用在想要混合均匀的时候。 44 | 45 | 第一遍揉面的时候,面是非常不均匀的结构,一般先揣几遍,然后揉到均匀即可。 46 | 第二遍揉面的时候,由于会放很多的油,所以以揉为主,发现面团均匀并开始粘手的时候,就用揣整形准备发酵。 47 | 48 | 关于油脂,再开始揉面之前,可以在手上涂一些高熔点的动物性油脂(比如猪油(但是这样阿拉伯人就没法吃了))可以极大的减少满手面糊的情况。相应的,要在面团的用油中扣去这一部分的重量。 49 | 50 | ### 小面团制作 51 | 52 | 发酵完成以后,首先排气,将面团里的大气泡全部挤出去。 53 | 这些大气泡如果保留,烙饼时鼓起来就会特别薄,成为整个面饼的阿克琉斯之踵,一旦破裂,蒸汽无法保留就再无鼓起来的可能。 54 | 55 | 将面团分割成70~80g左右的剂子,并且滚圆备用。 56 | 57 | 面团仍然是粘手的,但是组织既已稳定,这个时候一些手粉就可以解决问题。也不要破坏 58 | 59 | 1. 这个面团放在冰箱里冷藏会更好 60 | * (未验证)冷藏以后的饼皮会比直接使用的饼皮更软 61 | 2. 这个面团(或者之后做成的饼皮)是可以冷冻的,可以成为特别方便的早餐。 62 | * 冷冻的面团解冻以后再擀一下 63 | 64 | 取出一个小面团,擀开,这时候会遇到阻力,因为面团自带较大的筋性,即,面团中的蛋白质(麸质)已经在水和盐的作用下结成网状结构,倾向于保持原有的状态,突如其来的外力并不能猝然改变其形态。 65 | 66 | 所以将面饼擀开一点后就静置数分,让它适应新的形状,形成新的结构,此时再擀便又能擀开些。 67 | 68 | 一般来说两遍就足矣,当一个小面团成为一个直径二十厘米左右的圆形小饼时,就可以开始烙饼或者烤制了。如果喜欢,制作面饼的时候可以在一面上撒上炒熟的芝麻,则成塔斯汀的汉堡胚。 69 | 70 | ## 烙制 71 | 72 | 只需要一个平底锅即可制作,首先预热平底锅,然后放入面饼,一面烙制到可以滑动的时候,立刻翻面,第二面也烙制到可以滑动时即再翻面。面饼应该微微起皱,甚至又多一点淡黄色的烙印,如果没有,说明温度不足,可再如此翻面两次直至两面封闭。 73 | 也不可焦黄,焦黄说明则火太大,两面都脆了时鼓不起来的。 74 | 75 | 若两面既已封闭,此时开大火,面饼则会自然鼓起。鼓起到一半的时候翻面,用铲子或者无情铁手将为鼓起来的部分贴住锅底,不消片刻就可以鼓的像个球一样。 76 | 77 | ![](../img/2023-03-04-17-13-05.png) 78 | 79 | ## 烤制(未验证) 80 | 81 | 上下250度预热完成之后推入烤箱烤制即可,烤制这个饼的温度是高一点,时间短一点比较好,鼓起来即可出炉。 82 | 83 | 84 | ## 参考资料 85 | 86 | - [塔斯汀慌了,中式汉堡做法原来这么简单!](https://www.bilibili.com/video/BV1Jx4y1c7sm/) 87 | - [皮塔饼 Pita Bread 饼大如球 做法有趣 进来瞧瞧吧](https://youtu.be/_zVEKAtqfvk) 88 | - [Pita](https://en.wikipedia.org/wiki/Pita) -------------------------------------------------------------------------------- /recipe/spaghetti_bolognese.md: -------------------------------------------------------------------------------- 1 | # ボロネーゼ 2 | 3 | これから、ボロネーゼの作り方をご紹介致します。 4 | 5 | ソースの食材は: 6 | 7 | - 玉葱(300g) 8 | - 人参(100g) 9 | - トマト(400g)(缶詰の方が良いと思うけど、新鮮なトマトも良いと思う) 10 | - 挽肉(牛、豚、牛豚合挽肉(あいびきにく))(300gくらい) 11 | 12 | 香辛料は:大蒜数個、ローリエ、黒胡椒。 13 | 14 | まず、大蒜を微塵切り(みじんきり)にします。玉葱、人参とを細かく切ります。 15 | 16 | ![](/img/2020-08-16-21-58-08.png) 17 | 18 | そうしたら、微塵切ったの大蒜をバター(オリーブオイルもOK)と一緒に鍋に入れていきます。そうしたらコンロに火をつけて、弱い火で熱していきます。 19 | 20 | ![](/img/2020-08-16-21-59-09.png) 21 | 22 | バターが茶色になる時(バターは焦げやすいです)、玉ねぎを入れていきます。玉ねぎをちょっと強い火で炒(いた)めて、途中で塩と黒胡椒を入れておきます。 23 | 24 | ![](/img/2020-08-16-21-59-52.png) 25 | 26 | ちょっと焼き目をつけたまで炒めておきます。 27 | 28 | 後で、炒めた玉ねぎを取り出します。 29 | 30 | ![](/img/2020-08-16-22-00-37.png) 31 | 32 | **鍋を洗わずに**油をつけて、肉をじっくり焼いていきます。肉もちょっと焦(こ)げた感じにしたら、も土鍋に移行する。 33 | 34 | **鍋を洗わずに**ワインを入れます、鍋の茶色物質(焦げた玉ねぎと肉)をワインに取り込んで、後土鍋に入れます。 35 | 36 | 土鍋に細かく切った人参とトマト缶詰(私は[野菜ジュース](https://www.amazon.co.jp/gp/product/B000ZIMD2A/)買いすぎましたから、トマトジュースも入れますorz)入れます。 37 | 38 | ローリエ二枚入れましたら、トマトを溶(と)かす感じまでよく混ぜていきます。 39 | 40 | ![](/img/2020-08-16-22-01-11.png) 41 | 42 | ほんの少しだけ水を加えましたら、出来るだけ弱い火で一時間以上煮込(にこ)んで行きます(牛肉なら、三時間の方が良い)。途中二、三回混ぜておきます。 43 | 44 | ![](/img/2020-08-16-22-01-30.png) 45 | 46 | ![](/img/2020-08-16-22-02-22.png) 47 | 48 | ソースの準備は以上です。 49 | 50 | 自分好きな麺(普通はパスタを使いますけど、わたしは中華麺が好き)を煮込んだら、皿に併せって、準備したソース一杯を付けて、粉チーズを振りかけます。 51 | 52 | ![](/img/2020-08-16-22-02-43.png) 53 | 54 | 完成です。よく混ぜたら、食べて行こうと思います。 55 | 56 | -------------------------------------------------------------------------------- /recipe/tianjiuniang.md: -------------------------------------------------------------------------------- 1 | # 甜酒酿的制作 2 | 3 | ## 为什么要自己制作甜酒酿 4 | 5 | 其实就是馋虫作祟,为了吃一碗酒酿鸡蛋汤。 6 | 7 | 其实我本来是个(同样品质下)能买绝对不自己造的人,住在中国的时候从来都是去市场买,但是在日本实在是找不到靠谱的酒酿了。 8 | 9 | 首先考虑的是“甘酒”,以下是我尝试过的方案以及遇到的问题: 10 | 11 | - 冷冻干燥的甘酒:风味严重不足,放到锅里一煮就化了,简直是闹着玩的 12 | - 瓶装的甘酒:甜味特别重,甜到齁嗓子的那种。风味也还行(有点像小时候喝的速溶麦片),可惜和糯米制作的甜酒酿不一样。 13 | - 日本的甜酒根据厂商的不同大致有两种,一个是酒厂出品,一个是酱油味增厂出品的。酒厂的菌种偏向于产生糖(化酶),而酱油味增厂的菌种倾向于产生氨基酸。由于所用菌种不同,风味也会稍有差异,不知道是不是这个原因,没有做深究。 14 | - 用糯米和干燥米麹自制甘酒:这下子有一点糯米的风味了,但是味道还是很奇怪,这是所有平替方案里面最好的了。只不过反正要发酵,所以干脆搞正版的比较好。 15 | - 和标准做法的高温“发酵”(其实应该只利用了已有的酶)不同,这里是低温发酵的,为了促进发酵,还放了很少一点面包酵母。 16 | 17 | 日式甜酒方案全部Pass后,我就乖乖的跑到中华物产店,买了台湾金兰的雪花酿,然而瓶装的常温酒酿就是和新作的酒酿有天壤之别,不太甜,反而有点酸,风味也很一般。 18 | 19 | 最后在经过漫长的研究(主要是研究酒税法,看看是不是合法)以后,决定自己制作。 20 | 21 | ## 制作步骤 22 | 23 | 酒酿的制作,一言以蔽之,就是用菌(产生的酶)去糖化经过了糊化的淀粉,以产生甜味和淡淡的酒味的过程。 24 | 所以所有的步骤,目的大致是:保证淀粉糊化的完全,保证菌种纯净、没有杂菌,以保证糖化、发酵过程的顺利。 25 | 26 | ### 浸泡糯米 27 | 28 | 糯米要加水浸泡到指甲一掐就断的地步,所以我一般浸泡一夜确保泡透。夏天的时候容易腐败,所以可以放到冰箱里浸泡。 29 | 30 | ### 蒸糯米 31 | 32 | 蒸锅上面放上笼屉布,将糯米铺平蒸熟。蒸熟的标准是糯米被蒸透,没有硬芯子。根据我的实验结果,要蒸30分钟左右,如果只蒸20分钟那就可能没有熟透。 33 | 34 | 蒸完以后建议闷上一段时间,因为蒸糯米的本意是要让淀粉糊化,长时间的加热有助于这一步骤。 35 | 36 | 关于能否用电饭锅煮饭,我也曾试过。电饭锅做饭的时候一定要少放水,然后减少煮饭时间(或者开“较硬”档),比起蒸出来的米饭,电饭锅的米饭拌曲的时候会更加困难一点,其余没有区别,甚至淀粉的糊化会更加完全。 37 | 38 | ### 拌曲入罐 39 | 40 | 拌曲之前要把米饭冷却到30~40摄氏度,否则酒曲会直接烫死。(顺便一提,日式甜酒的工艺温度居然在55度左右,应该是因为仅仅使用酶进行催化糖化而不是发酵) 41 | 42 | 我用的甜酒曲是Amazon买的,每斤米大概放2g酒曲即可。 43 | 44 | 拌曲的另一个关键点是要**用水**,这个在很多的教程里都没有明写。只有加水以后,才能把酒米拌到粒粒分明的状态。用凉开水即可,一斤的米大概需要用半斤水。加水和拌曲同时进行。 45 | 46 | 至于水的量其实没有什么定数,我的标准是拌到颗粒分明,酒曲也均匀了,但是又没有多余的水即可。一些地区(比如湖北或者四川)的醪糟工艺会在入罐后发酵前加入较多的水进行发酵,这也是可以的。至于水的选择,我觉得市贩的纯净水就很好,一时没有的话用凉白开也行。 47 | 48 | 拌曲完成以后就可以入罐发酵,记得压瓷实一些。大多数的酒酿都会在米中间掏一个窝子观察发酵出酒的情况,但如果你用的是透明容器的话可以不遵守这个传统(但是我仍然习惯这么做)。罐子在装米前要消毒,入罐以后要注意隔绝空气,这样才能保证发酵的质量。 49 | 50 | ### 发酵 51 | 52 | 发酵温度在30度,维持温度的最好方式是买个酸奶机(或者日本有甘酒机)。我也曾试过热水袋加棉衣的方式发酵,温度的控制很困难,温度高了会烫死酒曲,温度低了发不起来,温度忽高忽低有的时候会导致杂菌繁殖,进而导致酒米酸臭无法食用。 53 | 54 | 关于发酵的时间,一般来说: 55 | - 24小时能感觉到发酵,能闻到毛霉菌的特殊气味(略微类似腐乳),出现酒液; 56 | - 36小时左右的某个时间点会达到我认为满意的状态,这个时候米没有完全瘪下去,甜度也适宜,这个时候酒液会升高到接近顶部,大概是米饭高度的80%~90%; 57 | - 36~72小时的时候,甜度会继续上升直到达到一个峰值开始下降,而在此过程中米饭的饱满度则不断下降。如果发酵之前你加的水比较多,你甚至可以看到酒米漂浮起来的情况。 58 | 59 | 发酵完成之后冷藏即可。 60 | 61 | ## 附录:在日本制作甜酒酿的法律问题 62 | 63 | 不幸的是,日本到今天仍然维持明治时期(对应中国清末)制定的陈旧且严格的酒税法,这就给我平添了很多确认步骤。 64 | 65 | 首先酒税法管的非常宽,除去工业医用的酒精以外,正常的食物里只要含有1%以上的酒精即认定为酒。早些年,莫说自己酿酒,就是买烈酒回来泡梅子酒都是违法的,直到2008年才改正了这个没人性的条款。 66 | 67 | 好在最后确认下来,结果如下: 68 | 69 | - 如果你住在どぶろく特区(濁酒特区),只要不对最终产物进行沉淀过滤和蒸馏之类的操作,就可以放心的制作甜酒酿。 70 | - 如果你不在这些特区居住,只要最终的产物里没酒精(少于1%)就是合法的,日本人也会自己在家制作甘酒。 71 | 72 | 所以,制作甜酒酿鸡蛋的时候要加水烹煮,利用这个过程让酒精挥发即可。 73 | 74 | 那么,烹煮能否彻底去除酒精呢?答案是否定的。根据[这份资料](https://nommagazine.com/%E7%83%B9%E9%A3%AA%E8%BF%B7%E6%80%9D%EF%BC%9A%E9%85%92%E7%B2%BE%E7%85%AE%E5%BE%97%E6%8E%89%E5%97%8E%EF%BC%9F/)([备份链接](https://archive.ph/U3KIt))显示: 75 | 76 | > 這其中的差距是受烹飪步驟的影響:酒精是在一開始就和食物混合烹煮,還是在沸點到達後才加入。含有酒精的菜餚過了 15 分鐘之後可測得 40% 的酒精殘留,30 分鐘後剩 35%,而 2 小時又 30 分鐘過去,仍有 5%。 77 | 78 | 好在甜酒酿的酒精度一般只在3%以下,不要说烹煮,就是加水的过程都足以让酒精度降低到日本酒税法规定的1%以下。 79 | 80 | 参考以下资料: 81 | - [酒税の世界 なぜ自分で酒を造ってはいけないのか?(後編)](https://kurihara-office.com/160126jikajyozo-2) 82 | - [酒税の世界 なぜ自分で酒を造ってはいけないのか?(前編)](https://kurihara-office.com/160124jikajyouzou-1) 83 | - [濁酒裁判](https://www.courts.go.jp/app/files/hanrei_jp/336/050336_hanrei.pdf) 84 | - [酒税の収入は3.1%に落ちました](https://www.nta.go.jp/taxes/sake/shiori-gaikyo/shiori/2016/pdf/001.pdf) 85 | - [自家醸造](https://www.nta.go.jp/taxes/sake/qa/06/33.htm) 86 | - [どぶろく特区](https://ja.wikipedia.org/wiki/%E3%81%A9%E3%81%B6%E3%82%8D%E3%81%8F#%E3%81%A9%E3%81%B6%E3%82%8D%E3%81%8F%E7%89%B9%E5%8C%BA) -------------------------------------------------------------------------------- /spam/1990s-env.md: -------------------------------------------------------------------------------- 1 | # 90年代到21世纪初的商业环境 2 | 3 | 4 | [为什么(感觉)现在的资本家越来越露骨,越来越不要脸?是否如此?](https://www.zhihu.com/question/444051237/answer/1734648868) 5 | 6 | 因为你没有见识过90年代到21世纪初的商业环境,和那个年代的老板相比,当代老板有一个算一个那都是大善人。 7 | 8 | 举几个例子 9 | 10 | 比如煤矿行业,那段时间的煤矿行业,基本上就是一个拿命换钱的行当,有没有命花你挣的钱完全取决于运气和矿井里的瓦斯浓度,渗水事故属于常态,以至于并不被视为事故,矿工常年累月在淹到脚脖子深的水里作业,采煤有指标,采不够煤别想出井。 11 | 12 | 矿井的支撑梁能省则省,并不存在什么承重力学和结构力学,地质结构更是想都不要想,一切以不会马上垮下来为标准,整个矿上文化水平最高的是老板,初中肄业,技术水平最高的设备是手电筒,井下瓦斯浓度以经验为准,经验来源是前几次爆炸事故,一座煤矿一年炸个两三次算是基本操作。 13 | 14 | 这算是有良心的,至少来这种地方刨煤,白面馒头和肥肉片子管够,工资不少结,死球了还给钱,有些绝症户就是冲着抚恤来的。 15 | 16 | 真正脏的还是那种奴工煤窑,坑蒙拐骗把智障拐来,拿大铁链子拴在井下,吃喝拉撒睡都在下面,干到死,完事了找个废井一埋拉倒,类似的还有黑砖窑,直接从附近学校绑学生用大铁链子拴着烧砖,为了防止逃跑,有挑脚筋的,有割舌头的,有把眼睛弄瞎的。 17 | 18 | 还有夫妻井,一家两口人在自家院子后面挖个大坑就开始刨煤,刨不动了就雇人来帮着刨,刨的深了又没啥文化,井架一崩所有人都埋在里面,亲戚来串门才发现人都没了。 19 | 20 | 再比如建材行业,建材行业是那个年代的世界上最接近武侠小说中“江湖”这个概念的领域,每个砂石厂都是一个门派,每个砖窑都是一个码头,每个卖涂料腻子粉的铺面都是一个堂口,每个租施工机械的都是一个舵把子,江湖关系盘根错节,各种恩怨情仇,你能想到的武侠小说桥段在这个养蛊大坑里都有。 21 | 22 | 渣土车,重载车,拉水泥的就跟镖局差不多,路上遇到车匪路霸了就得下来递烟说好话,塞钱的塞钱,磕头的磕头,到了工地了如果迟到了,工地老板说不要就不要,你的水泥就干在桶里吧,哦对了,那个年代监理很少,基本上都是跟包工头打交道,包工头基本上在工地上形成了一种基层治理模式,警察说话都不一定有用。 23 | 24 | 有些地方的建材行业和黑恶势力基本上可以划等号,业务发生纠纷或者堂口间互相冲突了,老板带着三两个骨干裹挟几百号人就能打到见血,扣人绑人,把竞争对手绑在电线杆子下面烤太阳,不给喝水,喊口渴了就倒半杯水,撒一大把盐,喝吧。 25 | 26 | 斗殴方式五花八门,砂石厂作业要用到炸药雷管,这就是一种路子,武侠小说里的江湖暗杀都是什么唐门暗器,喂以九幽五福,杀人于无影无形,这都是鬼扯蛋,真实江湖暗杀是趁你睡觉的时候半夜往你卧室里丢一捆雷管,让你热热闹闹的上路。 27 | 28 | 至于工地上组织什么钢管队,菜刀队,砂石厂组织什么护厂队,大车队,那都是基本操作,土枪砍刀那更是小儿科,上档次的械斗都是机械化的,你们见过挖掘机打架,铲车冲阵,压路机当攻城锤使的吗?还有把拖头前面焊上钢架直接拿去冲门的,哪次不见血? 29 | 30 | 你以为开公司的又干净?那些年,凡是做生意就没有不沾黑的,坑蒙诈骗,以次充好,官商勾结,假冒伪劣,侵吞国有资产,套取商业补贴,拖欠工资拖到有家公司承诺绝不拖欠工资能上感动中国,这些年整治老赖,各种手段一起上,甚至搞连坐,搞祸及子孙,有些人都能梗着脖子就是不还钱,你想想那些年没有这些手段的时候,老赖是怎么拖钱的,有多少企业是直接被老赖拖垮的? 31 | 32 | 还有拖工资,那些年拖欠工资属于常态,不仅拖欠工资,有些还倒找员工要钱,那些年商业环境不发达,岗位少,人多,工作不好找,好不容易有人找到了工作,进公司之后先让你交保证金,押金,这金那金交个大几千乃至上万,然后才让你进公司。 33 | 34 | 有良心的就当牲口使,然后三天两头按照各种自制规章扣工资,没良心的直接把手下员工的这金那金拿着就跑。在某些地方,这种开空壳公司,招人,收保证金,然后卷款逃跑的路子都形成产业链了,是什么地方就不点名了,免得又说我地域歧视。 35 | 36 | 还有就是侵吞国有资产,整个80.90.2000年初,国内一谈改革就约等于卖国企,啥都敢卖,啥都能卖,一切形势转改制,一切改制转卖国企,一切卖国企转低估低售,几百亿的资产几个亿就敢卖,卖完之后一顿折腾,先来一顿大下岗,再来一顿大抛售,然后表格一做,进大于出,一场国企改制扭亏为盈增进效益的先进事迹报告会就出来了。 37 | 38 | 官商勾结在那些年属于公开搞,属于先进经验,属于主动作为,属于被提倡被鼓励被支持的招商引资行为,哪儿像现在,去婚宴一起吃个饭随个份子还要打报告,那些年商业渠道不通畅,市场环境不完善,要想做成点事甚至必须官商勾结,什么倒批文,卖白条,转车皮那都属于基本操作,有些官商勾结的渠道说起来都匪夷所思,某领导认识了招待所的服务员,一来二去成了通奸关系,该服务员的丈夫得知此事,不怒反喜,极力给二人牵线搭桥,创造机会,甚至直接在家里开搞,过一段时间,该地有一项目,工程款几千万,该服务员的丈夫回老家找了搞承包的亲戚,让该服务员帮忙牵线搭桥向该领导讨要此项目,项目拿到之后,搞承包的资质不够,就去外地借壳,整个过程一律特事特办,有该领导罩着,一路都是绿灯,最后项目拿到手,该承包方也算是有良心,没有偷工减料,因为怕出事,反而加工加料,最后项目利润到手,分三份,领导一份,服务员家一份,承包方一份,该项目属于基础设施,因为加工加料,品质较为优质,群众满意,还成了典型,服务员又给领导拉皮条找了其它女人,自己从招待所辞职不干了,跟老公回家过日子,承包方靠着这个项目经验申请到了自己的资质,该领导性生活愉快,数钱数到手软,还有了政绩,违法乱纪官商勾结,但是最后所有人都获得了幸福,公私两全,你说这种事你上哪儿说理去? 39 | 40 | 这算是有良心的,没良心的呢? 41 | 42 | 那些年的偷工减料手段以现在来看简直不可思议,纸板水泥,细丝钢筋,地基桩数能直接给你减少一个数量级,那些年的工程质量,属于小项目小偷,大项目大偷,连重大基础设施都敢偷,98年大洪水,几个口子决堤的很大一部分原因就是豆腐渣工程,豆腐渣工程这个说法就是98年提出的,类似的还有现在已经逐渐淡出视野的黑心棉,地沟油,三聚氰胺,那都是90年代兴旺发达搞起来的东西,再说点小众的,用废旧皮革做的果冻,见过吗?用棕榈油和松柏油做的蜂蜜,见过吗?收死人的衣服拿来卖给活人穿,见过吗?铅做的螺丝,见过吗?甲醇假酒,见过吗?福尔马林泡的毛肚,见过吗?劣质漏液铅酸电池,见过吗? 43 | 44 | 当代中国社会上相当一部分人之所以对各种所谓的纯天然无添加和各种乱七八糟的进口货有一种宗教式迷信,很大一部分原因就是那些年充斥市场的假货留下的心理创伤。 45 | 46 | 还有走私,当年东南沿海走私之猖獗,基本上已经到了裂土封疆的水平,自古以来走私犯没有不穷凶极恶的,北美独立战争的由头之一,波士顿倒茶事件,就是一群走私犯因为英帝国调低了关税,导致他们的走私货卖不上价,血本无归,一气之下闯进合法商船,打砸破坏合法进口货物,把茶叶倒进水里,后来这些走私犯成了北美叛乱分子的骨干力量。 47 | 48 | 当年东南沿海缉私工作压力之大,不是现在能想象的,现在中国的海警实力强大,上万吨的海警船都有,可以在钓鱼岛和南海横冲直撞,当年中国海洋执法力量破碎而松散,实力弱小,规模不足,设备落后,管理稀碎,缺乏协调,号称九龙治海,走私犯的船舶先进又巨大,还高度武装,还经常混杂在渔民里,甚至于有些渔民本身就是半渔半走私,经常出现缉私力量开着小艇追击开大船的走私犯的情况,那些年的走私犯手中有大量武器,有些是早年建设民兵力量留存下来的,有些是从走私渠道流入,这导致他们的装备往往比缉私力量还要先进,缉私执法人员追不上,打不过,这些走私犯猖獗的跟海盗似的。 49 | 50 | 东南沿海地区的海岸地形地貌又复杂破碎,走私犯在当地偷摸建设私设码头和货运设施,甚至还有洞库形式和半水下式结构的,从外面看过去根本看不出来,在这些私设走私设施周边还有服务于走私人员的各种服务业,包括并不限于赌场餐馆窑子,还有包括赌场餐馆窑子一体化的一条龙服务,对了,一条龙这个词也是那时候发明出来的,甚至还有走私货物的交易所,俨然当代加勒比海盗,这些走私犯往往以宗亲乡谊和血缘关系为纽带,内部组织严密,杀人灭口毫不含糊,有卧底的执法人员暴露后直接被捆上水泥块沉海的,另外这些走私犯往往还利用其便利性,从事偷渡,贩毒,谍报等工作,被抓到了就武装拒捕,暴力抗法,等到积攒满了第一桶金之后就洗手上岸,用积累下来的资本从事其它合法行业。 51 | 52 | 有些走私案规模之大,金额之巨,涉案之广,从地方直达中央,号称不怕领导讲原则,就怕领导没爱好,当地官员上任,都要去走私巨擘家里做客拜码头,而且必须收礼,当地称之为喝茶水,不喝这杯茶他有办法让你在当地混不下去,喝了这杯茶你就收了他的礼,从此以后你就不干净了,跟他在一条船上了,上上下下都有他的人,你怎么和他斗?而且帮他办事,你有求必应,他就投桃报李,你家里老人死了他去帮你奔丧,哭的比你还像亲生的,财色烟酒茶,吃喝嫖赌抽,你要啥有啥,你子女是学渣他一顿操作能帮你送到重点学校去,海关港务地税工商交通一手抓,甚至于其它地方的人去当地做生意都得先去他家混个脸熟。 53 | 54 | 还在当地盖专用于接待的豪华场所,外表刷成全红,里面一条龙应有尽有,连接待女官员的王子都齐齐整整的。 55 | 56 | 所以每次看见有人喊加速我就想笑,这也配叫加速?你懂什么叫加速吗?你见过加速世界吗?和8090年代到21世纪初那种百鬼昼行的局面相比,眼下这些资本家最恶劣也不过偷偷摸摸钻法律空子搞搞集资,除此之外谁还不是个奉公守法的良好市民了? 57 | 58 | 现在走法律仲裁是真能讨到钱,放90年代,你敢去找包工头闹?腿都给你打断。 -------------------------------------------------------------------------------- /spam/README.md: -------------------------------------------------------------------------------- 1 | # 政治不正确 2 | 3 | 一些可能会喝茶的内容,谨慎观看。 -------------------------------------------------------------------------------- /spam/damn-university.md: -------------------------------------------------------------------------------- 1 | # 大学如何喂学生吃屎 2 | 3 | 仅仅作为一个整理,回忆和实情或有所偏差,且并不只有我的经历,欢迎斧正。 4 | 5 | ## 手机卡 6 | 7 | 我不知道诸位何时入学,我入学的时候,伴随录取通知书一同寄到的,就是一张移动的电话卡。彼时我未经世事,不知其中多少关节:为什么是移动的,而不是电信或者联通?里面的套餐有什么玄机? 8 | 9 | 事实上,大多数的学生拿到学校的卡就不会换了,学校的通知,学院、班级的飞信群,以及我后面说到的上网问题,都让你的还卡代价极大。 10 | 11 | 更有甚者,据说有些大学给学生办理的套餐,一旦开通就不能轻易解约,如果解约就要支付解约费用。 12 | 13 | ## 上网 14 | 15 | 我们的移动卡,绑定了120小时的32MBps(实测从未超过20MBps,下载速度最多2M/秒)宽带。你有可能会疑惑为什么上宽带要还要按照小时计算,事实上,只有在校的大学生"享受"这种待遇,大学对面一街之隔的小区就有便宜的多且不限时,还更快的宽带,但是该宽带的账号并不能在校园使用。 16 | 17 | 至于为什么是120个小时,按道理说,是学校不想让学生沉迷网络,但是我上大学的时候,智能手机已经开始普及了,每个学生都会用手机刷人人网上QQ,这个理由站不住脚。其实很简单,我们大学四人一个宿舍,4个人的账号轮流登陆路由器,每天抛去熄灯刚好可以大致保持不断网。试想一个学生的账号就够整个宿舍使用了,其它三个人给这个人交份子钱就行了,何苦都办宽带呢? 18 | 19 | 那么我们如果两个寝室共享网络呢?是不是可以节约一半的成本?我们先不考虑网速,因为大家刷刷网页看看视频大致是够用的。 20 | 没问题,运营商早替你想好了,运营商会限制终端数量,这个情况据我所知不止发生在大学。当然,这个可以简单的通过NAT配置破解,让运营商误以为只有一个终端。 21 | 22 | 更有甚者如电信宽带,我的舍友为了打游戏办过,比学校手机卡自带的套餐速度快,延迟小,但是需要在电脑端安装天翼校园拨号软件才可以上网,为的就是防止你在路由器登录共享网络。后来我了解,这个拨号软件还兼任HTTP劫持,盗取你的流量访问广告网站,自带后门木马等等,真的是一鱼多吃。 23 | 顺便一提,宿舍里手机信号是很差的,速度也不快,原因很简单,基站太少,无论哪个运营商都快不起来,基站少不是防辐射,如果速度快大家众筹一个4G路由器就好了,也就不必购买学校价格高昂速度慢的宽带了。 24 | 25 | 这里说一下我未实现的设想:还是应该搞跨宿舍组网,大家共享网络,账号众筹,根据流量大小自动决定登录PPPoE账号的数量。 26 | 27 | ## 饭卡、外卖和食堂 28 | 29 | 大学的食堂都不贵,但是没有说食堂好吃的,以至于网友笑称此乃第九大菜系。一说起食堂我们会想到校长的小舅子,一个和校长亲密又不至于过于亲密的亲戚,承包了这个摇钱树。 30 | 事实上,大学不必要通过这样的手段赚钱,学校的食堂是承包出去的,学校只控制: 31 | 32 | - 物价不能太高 33 | - 食物不能让学生吃出病 34 | 35 | 最后根据营业额从中分润,一般食堂的利润率大致在30%左右,也就是10块钱的饭成本是7块,真正的小本生意。学校至少要分去15%,一些黑心的学校甚至要分润20~30%,让食堂大呼做不下去。按说任何商家不得拒收人民币,但是大学的食堂例外,一是为了管理,防止校外人员就餐,二是精确计算食堂收入。 36 | 37 | 有时校外人员来就餐,就要购买餐券,餐券一定只有中午或者下午在食堂旁边充饭卡的小屋子里有售,食堂绝对无法自己销售餐券,就是要尽可能全面的统计食堂收入。 38 | 39 | 其实学校的超市,一旦你刷饭卡学校也要从其中抽成,只是不会有食堂那般高昂。 40 | 41 | 除此之外,饭卡的补办的工本费是30元到50元不等,远超一张射频卡的价格(2元左右),但是这个不作为主要收入。 42 | 43 | ## 电费和空调 44 | 45 | 我上大学的时候,大多数的大学是没有空调的,说起宿舍什么最苦,那一定是让人耐不住的严寒和酷暑。北方的大学尚有暖气,南方往往只能缩在被子里瑟瑟发抖。到了夏天,不论南北大家一起流汗。大学里,往往只有留学生公寓有空调,和我们中国人没有关系。 46 | 47 | 不仅没有空调,也不让你用任何的电热器具,理由是线路老旧。可事实上,一张单人电热毯只有60W,可现在稍微性能强劲一点的笔记本电脑都不止60W了,电热水袋也不过100W。 48 | 其实是为了管理方便实行一刀切而已,有的女生得了妇科病煮内裤的电饭锅被没收后,宿管大妈用的很开心,我们寝室之前被没收一个电热水袋,还吃了个单子,后来看见宿管大爷经常使用。 49 | 若是真的线路老化不安全,和我们同住一个宿舍楼的大爷大妈怎么能用,就我们不能用呢?建成时间比宿舍楼早的行政楼早就用上空调,空调外机都生锈了,无非学生人微言轻罢了。 50 | 51 | 但是在15年前后,大学陆陆续续开始改造线路,给学生装空调了,这是为什么呢?两个原因:第一,空调的成本降下来了,家电下乡,空调的成本达到了史上最底,我国是制造大国,宿舍普及空调的成本大幅度下降了。 52 | 但是只有成本下降是不会给学生装空调的,哪怕对学生有好处,再小的成本学校也不愿意做,所以第二个原因是,学校发现收电费来钱快。加上第一个理由,学校很快就可以回本了。 53 | 54 | 我们学校的电费和很多学校一样,是不透明的,你只知道自己用了多少钱,不知道自己用了几度电,账上没钱就断电,你自然知道去交钱。后来有宿舍自己买了功率计测试了,我校大约是1.5~2元一度左右(无法做到精确)。 55 | 有的学校不如我校精明,收1.5一度的电费,被学生质疑,学校则解释添置变压器和供电设备都要钱,这就扯蛋了,变压器是供电公司提供的,背后是国家电网。 56 | 还有的学校收5毛一度的合理电费,但是悄悄修改学生的使用度数,改得厉害了,甚至出现一个宿舍一个月耗电1000度的奇观。 57 | 58 | 都不如不告诉学生你用了多少电来的简单,反正学生都是案板上的肉,怎么下刀,学校说了算。 59 | 60 | ## 其他 61 | 62 | 以上都是全校范围的盘剥,下面说几个小众的。 63 | 64 | 机械的学生一般会自学CAD系列的软件,有的老师就会忽悠你们上CAD或者Solidworks之类的培训班,说是有证书,其实这个培训班都是老师亲自开讲,地点也是学校机房。最后需要考试,没有不过的。最后发到手里的证书是没有任何用的证书。 65 | 66 | 除此之外,还有大学一定要用自己写的教材,但是自己写的教材十分垃圾,我的自动控制原理教材课后习题,第一章7道题有三道是题目有问题的,我和老师确认过后,老师再就几乎不再布置书上的练习。 67 | 后来忍无可忍,买了胡寿松的经典教材自学。 68 | 69 | 这只是冰山一角,实际案例还有更多,比如硕士开题的时候请校外的教授指导,一个人收上几百元——大哥,难道不是和自己的导师讨论,研究,商议吗? 70 | 事实上,两个学校互相聘请教授,互相创收的事情还有很多,至于导师把学生当廉价劳动力用甚至外包(卖)出去,早已是司空见惯。 71 | 72 | 除了教授,学生会和社团的学生也不是什么善男信女,学生会的老师直接把学生当行政小妹小哥用,还要“值班”,就是帮老师跑腿,和古代的司礼监差不多。一些兴趣类社团更是给新入学的学生兜售设备——比如滑板轮滑鞋羽毛球拍,然后从中赢取利润。不过需要说明,大家虽然不懂,但是还是会淘宝,设备的价格最后还是比淘宝的官方零售价低,所以我也不完全抵触。 73 | 74 | ## 参考资料 75 | 76 | - [多所大学强制新生入学办理指定运营商电话卡](http://finance.sina.com.cn/consume/puguangtai/20100902/20138594564.shtml) 77 | - [大学录取通知书夹电话银行卡 为何屡禁不止? ](http://m.xinhuanet.com/edu/2017-08/01/c_129669171.htm) 78 | - [逼学生使用高价校园网的背后:学校年入350万网费](https://zhuanlan.zhihu.com/p/266781234) 79 | - [附近居民私装信号屏蔽器?燕京理工学院高价校园网后续来了](https://finance.sina.com.cn/tech/2020-10-21/doc-iiznezxr7149401.shtml) 80 | - [哪个学校最坑爹?调查各学校网络服务收费标准](https://bbs.pinggu.org/forum.php?mod=viewthread&action=printable&tid=1306719) 81 | - [维基百科 天翼校园](https://zh.wikipedia.org/wiki/%E5%A4%A9%E7%BF%BC%E6%A0%A1%E5%9B%AD) 82 | - [中国电信天翼客户端被曝挖矿后门:用户电脑变“肉鸡”](https://tech.sina.cn/2017-11-03/detail-ifynmnae1540196.d.html?from=wap) 83 | - [高校“糊涂电费”背后的“糊涂教育”](http://opinion.people.com.cn/n/2014/1104/c1003-25972556.html) 84 | - [广州电信终端限制数到底指什么呢?](https://www.v2ex.com/t/536561) 85 | - [如何看待新生退学生会要写一万字申请?](https://www.zhihu.com/question/354069452) 86 | - [如何评价北京师范大学学十楼宿舍环境恶劣还要执意安装闸机?](https://www.zhihu.com/question/431748925) 87 | - [广东大学最坑爹的宿舍,你学校上榜了么?](https://zhuanlan.zhihu.com/p/39314735) -------------------------------------------------------------------------------- /spam/gfw-history.md: -------------------------------------------------------------------------------- 1 | # 中国网络防火长城简史 2 | 3 | ![](../img/2020-08-13-00-39-55.png) 4 | 5 | ## 简介 6 | 7 | 计算机的防火墙,和物理意义上的墙并不一样,物理上的墙建立以后,那就既进不来,也出不去了。而计算机的墙,则是可以对两个方向进行控制。 8 | 9 | 其实我们今天所说的计算机防火墙,大致有两种,一种是对内的,一种是对外的。 10 | 11 | 传统意义上的防火墙,一般是用来防止外部访问的,当然,你也可以设置禁止访问某些IP或者网站,禁止内部访问。 12 | 13 | ![](../img/2020-08-09-16-39-22.png) 14 | 15 | ![](../img/2020-08-09-16-46-40.png) 16 | 17 | 我们使用计算机的时候,会开放很多端口,比如22,139,3389等等,而作为非开发者的用户,往往用不到这些端口。 再考虑到使用这些端口的程序有的时候是有漏洞的,开放了容易被攻击,所以干脆打开防火墙封闭了就好。 这就好比你日常宅在家,并不需要出门,就把锁孔都堵死来保证安全一样。 18 | 19 | 而我们今天讨论的主角,主要的功能不是阻止别人进来(入侵),而是阻止你出去的。 你访问不了Google/Youtube/Facebook/LINE/Twitter/。。。的根本原因: **防火长城,GreatFireWall,简称GFW。** 20 | 21 | 每当谈起互联网的历史,都会有一种恍如隔世的感觉,当年上网大部分的网站并不需要注册,博客随便看,甚至可以匿名评论。就算要注册,有个邮箱就够了,不需要实名制(实名制在今天的体现是大部分网站注册都要手机号)。大家在网上大体友善的讨论,无私的分享,自由的交谈。几乎所有的网站不需要VPN即可访问。搜索引擎就管搜索,聊天软件也只聊天,没有那么多弹窗和流氓软件。那是互联网的田园时代。 22 | 23 | 和之前的[互不联网公司是如何强奸用户的(持续更新)](https://github.com/TsingJyujing/blogs/tree/7ddd1d57ad13443ac90c8cc90b23cf62bd14bb9c/spam/spam/rape-user.md)一样,老网虫应该都对这些事情有一些印象,而00后乃至10后可能并不知道这些黑历史。 不论是寿司之神,还是其他顶级的厨师都说过,要想成为好的厨师,首先要吃得出什么是美食。最近辗转反侧,我觉得有必要把这些内容写出来,让人看见,哪怕只是一两个人,告诉大家互联网原来应该是什么样子的,今天为什么是这个样子。 24 | 25 | ## 墙的历史 26 | 27 | 1987年,中国发出了第一封电子邮件:“Across the Great Wall, we can reach every corner in the world”(越过长城,走向世界每个角落)。从那一年开始,我们用互联网和这个世界联系在一起了,但是就在12年后,那个越不过去长城,回来了。 28 | 29 | 1998年,为了防止大家访问部分网站,针对IP和DNS的污染,开始了。伴随着污染,墙和梯的较量正式开始。 早期的GFW不能称之为墙,更像是一个补丁,只是单纯的污染DNS,那么我们修改DNS服务器就可以绕过去。 加上国内的DNS也流氓,所以大家大多会把DNS改成Google提供的 `8.8.8.8/8.8.4.4`。 30 | 31 | 这样幼稚的屏蔽方式,政府也知道是不行的,于是,真正的GFW正式登上历史舞台。 32 | 33 | 除了屏蔽特定的IP或者域名之类,GFW还会审查流量内容,因为当时大部分的网站都没有用HTTPS进行加密,所以流量是非常透明的,审查起来很容易。 当然,也会对URL进行审查,有一段时间Google无法访问,就是因为URL里面又一个叫`gs_rfai`的参数,其中“rfa”字样,与在大陆被封锁的自由亚洲电台的网址和英文缩写巧合而被GFW屏蔽。 近几年HTTPS普及了,针对内容审查手段也就慢慢失效了。 34 | 35 | 墙的其它升级就简单的多了,主要就是两个任务: 36 | 37 | 1. 针对IP、域名列表的扩充,扩大黑名单范围; 38 | 2. 对新增的翻墙工具的封堵。 39 | 40 | 这些是功能上的升级,性能上也在升级,据传说16年,GFW就拥有100多台小型机做的集群了(而且,各地的GFW似乎也没能完美的同步(也可能是故意的),大致是以省为单位,有的时候会出现某个网站只能被某些省访问的情况出现)。 41 | 42 | 举些升级的例子: 43 | 44 | * 比如你用HTTP/SOCKS代理翻墙,那我就检测代理的流量特征(于是HTTP/SOCKS代理,卒……)。 45 | * 你用SSH翻墙,我就检测你的流量特征,分析你到底是在执行命令,传输文件还是在打隧道翻墙 46 | * 但是SSH隧道目前仍然可用,技术角度说,完全区分SSH/SFTP和翻墙流量还是有难度的 47 | * 你用GoAgent翻墙,那我就屏蔽Google的所有IP。 48 | * 你用PPTP翻墙,那我就检测PPTP的协议,直接杀。 49 | * OpenVPN也遭遇了PPTP同样的待遇。 50 | * 但是AnyConnect没有,因为很多外企在使用它连接公司内网。 51 | * Shadowsocks也差点遭受和各大VPN一样的待遇,但是因为SS的流量实在难以识别,所以当时(大约2015年)解决的方式更加粗暴:请Shadowsocks的作者喝茶。 52 | 53 | ![](../img/2020-08-09-17-49-53.png) 54 | 55 | * 后来(大约2020年前)Shadowsocks还是被识别了,参见[这个报告](https://gfw.report/blog/gfw\_shadowsocks/zh.html)。 56 | * 目前最强大的工具应该是V2Ray,除了支持的协议多,其中的VMess协议对计算机时钟的要求让这个系统可以抵御一定的流量重放攻击。 57 | * 最近大家开始用Vultr/Linode搭建服务器……这个的确不好管,但是重要节假日(每年0110月/0100日前后,国庆,两会)就批量屏蔽这些IP。 58 | * GFW不仅防止国内用户访问国外主机,有的时候还会禁止一些境外IP访问国内的主机,这样可以屏蔽部分使用内网穿透技术的人。 59 | 60 | ## 今天我们怎么翻墙 61 | 62 | 1. HTTPS代理,TLS给HTTP代理穿上了铠甲,使之又能再战500年。但是考虑到GFW会主动刺探,所以最好将代理的endpoint隐藏在正常网站的某个子路径下。 63 | 2. SSH隧道,SSH采用非对称加密,再加上有广泛的正常用途(管理服务器)所以目前SSH隧道还是可用的。 64 | 3. Shadowsocks/V2Ray/GoProxy 其实可以理解为对你的代理流量进行加密和混淆的工具,但是GFW在慢慢尝试识别这些流量。 65 | * 需要特别说明一下的是,GoProxy比较特殊,支持内网穿透。 66 | 4. AnyConnect等商用方案。 67 | 68 | 除此之外,还有内网穿透等一系列骚操作,日后我会补充一些教程,教大家如何搭建自己的翻墙服务。 当然,这一系列教程不能说翻墙,也不能说科学上网,要说连接公司内网,本质上,在公司外部管理公司内网和翻墙的技术基本一致,但是会多一些诸如混淆之类的不必要操作。 69 | 70 | ## 我对墙的记忆 71 | 72 | 事实上,我个人没有经历过只有DNS污染这个阶段,我第一次感受到墙的威力,是谷歌退出中国。 73 | 74 | 山雨欲来风满楼,事实上,早在2007~2009年,就开始出现一些Google搜索的负面新闻: 75 | 76 | > 据了解,今年1月和4月,“谷歌中国”网站因存在大量淫秽色情和低俗链接,曾两次被互联网违法和不良信息举报中心公开曝光。近期,举报中心又接到公众举报,经核查发现,“谷歌中国”网站仍然存在大量淫秽色情和低俗信息,包括大量极其低级、丑陋的色情图片、视频和文字。 举报中心有关负责人表示,“谷歌中国”网站未按照我国法律法规的要求做好淫秽色情内容的过滤工作,大量境外互联网上的淫秽色情信息通过该网站传播到我境内,严重违反了《全国人大常委会关于维护互联网安全的决定》和国务院《互联网信息服务管理办法》等法律法规,以及有关行业自律规范,严重侵害青少年身心健康,损害公众利益。 举报中心在强烈谴责“谷歌中国”网站的同时,还建议相关执法部门依法处罚,并希望广大网民继续予以监督。 77 | 78 | 那么这些色情联想是什么呢: 79 | 80 | ![](../img/2020-08-09-17-58-58.png) 81 | 82 | 但是后来有人发现,这些词以前都没人搜索,是在新闻播出的前些天才有人搜索,搜索量还全部来自于北京。 83 | 84 | ![](../img/2020-08-09-18-03-58.png) 85 | 86 | 我只能说,你们北京人好BT……当时的说法是,这个事情是百度策划的,的确,深入理解搜索引擎,并且能做出有效的内容攻击,怎么看都不像电视台那帮子文科生能做出来的事情。 只可惜Google的日志留的太全了,被发现了。 87 | 88 | 很多人说Google退出中国是因为不接受审查,这个是错误的,事实上,Google不是没有配合中国审查,也不只有中国要求Google进行审查。 89 | 90 | 10年就有人提问,为啥温度计和胡萝卜都不能搜索了[(参见这里)](https://sijiguangchangwc.fang.com/bbs/2811066683\~1120/34766730\_34766730.htm)。 91 | 92 | 但是按照规则配合审查是不够的,因为根本就没有什么规则,政府对谷歌(当然对其它所有互联网公司都一样)的要求是**自我审查**。一般来说,还需要配合网信办等神秘机构做一些舆论引导: 93 | 94 | ![](../img/2020-08-10-21-50-08.png) 95 | 96 | 这些舆论引导并不合符合政府一般的办事流程,比如发红头文件,通知,办法之类的。 往往就是个微信消息或者邮件,乃至一个电话,但是不设立专门的部门应对这种不规范的办事方式,公司可能就开不下去。 97 | 98 | 大致流程就是,你的网站的内容,你自己看着办,我这里只给出精神和模糊的指导意见,但是如果我(政府部门)觉得你内容有问题,那就先约谈,让你再自己琢磨琢磨哪里做错了,要是还是不满意, 我就封鲨你: 99 | 100 | ![](../img/2020-08-09-18-04-52.png) 101 | 102 | 简而言之就是: 103 | 104 | ![](../img/2020-08-09-17-34-38.png) 105 | 106 | 2010年,Google与政府彻底谈崩了,但是还没等Google关闭服务,首先就遭到了DNS污染,这个时候大家通过修改hosts文件还是可以上Google的,那个时候往上大多流传着好多hosts文件的版本。 后来Google就把google.cn做成了静态页面,指向Google香港,但是随着事态恶化,先是用香港Google搜索国家领导人的时候会自动断开,后来香港的Google也很快不能用了。 107 | 108 | 就是从这里开始,我感受到了墙,也就是从这里开始,百度的搜索质量开始下跌,广告越来越多,越来越隐蔽,广告质量也下降,出现很多虚假广告,比如莆田系的医院。这些都是后话了。 109 | 110 | 详情可以参考[这篇文章](https://zhuanlan.zhihu.com/p/28620456),写的相对翔实。 111 | 112 | 以及这一篇:[深度调查 | 为什么我们不能访问谷歌?(长文慎入)](https://medium.com/@moreless/%E6%B7%B1%E5%BA%A6%E8%B0%83%E6%9F%A5-%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%BB%AC%E4%B8%8D%E8%83%BD%E8%AE%BF%E9%97%AE%E8%B0%B7%E6%AD%8C-%E9%95%BF%E6%96%87%E6%85%8E%E5%85%A5-be7f4611780) 写的有理有力,调查清晰,证据翔实,部分稍微有些小错误,但是长文难免有纰漏,瑕不掩瑜,我认为值得一读。 113 | 114 | ## 墙的设计者 115 | 116 | 说到墙,不得不讨论一下墙的设计者:方滨兴教授,这个人在中文互联网可谓是臭名昭著。 2011年,方滨兴出现在武汉大学,被学生用鞋子和鸡蛋砸。 同年,方滨兴接受采访的时候说,自己电脑上装了6个VPN。 2013年,方滨兴在微博上发了一条拜年微博,转发评论万余次,大多都是“滚”,评论后被和谐,并被水军洗地。 同年,方滨兴说因为身体原因不再担任北邮校长职务,大家在网络上表示:“祝病魔早日战胜校长”。 搜索引擎上搜索方滨兴,有的时候会联想出来“方滨兴死了吗”。 2016年,方滨兴以杰出校友身份,回到其母校哈尔滨工业大学做题为《定义网络空间安全》的报告。报告中,他试图以韩国政府也架设网络防火墙来论证中国架设网络防火墙的必要性。但由于论证其观点的韩国网页被防火墙阻挡,无法登录,方滨兴只能在众目睽睽之下连接VPN绕过大陆的网络防火墙继续演讲。但连接VPN后,1分钟之内便断线2次,只得用Google搜索网页截屏。由于场面尴尬,报告结束后没有安排任何提问环节。 117 | 118 | 详细内容可参见[Wiki](https://zh.wikipedia.org/wiki/%E6%96%B9%E6%BB%A8%E5%85%B4) 119 | 120 | 对于这个人,我只认可他的一句话:中国防火墙与虚拟专用网VPN之间是场“永恒的战争”。 121 | 122 | ## 后记 123 | 124 | 我想说:长远来看,墙一定会倒下。但是事实上我看到的是:墙越来越高,越来越厚。 现在的墙是黑名单模式,但是我总感觉在不久的将来,会出现白名单模式。 一旦出现白名单模式,大部分的翻墙手段都会失效,那是我眼中互联网的末日。 125 | 126 | 敬请期待我之后的文章:**公司内网全攻略**。 127 | -------------------------------------------------------------------------------- /spam/jp_covid_19/hiroshima_wide_pcr.md: -------------------------------------------------------------------------------- 1 | # 广岛市开展约80万人的大规模PCR检查 2 | 3 | - 新闻原文:[広島市で80万人PCR検査 県、4区の全住民・就業者に](https://www.nikkei.com/article/DGXZQOJB151GD0V10C21A1000000) 4 | - 推特评论:[広島市で大規模PCR検査 80万人対象、県が集中対策](https://twitter.com/nikkei/status/1349899821088313344) 5 | 6 | ## 对部分评论(简略)的翻译以及吐槽 7 | 8 | 我从上到下截图,并且按照情绪分类,尽量不漏掉评论。发现负面发言占绝对多数。 9 | 10 | 日语水平有限,尽力翻译。 11 | 12 | ### 正面 13 | 14 | ![](/img/2021-01-15-18-07-10.png) 15 | 16 | > 广岛做出了正确判断,期待扩大范围。 17 | 18 | ![](/img/2021-01-15-18-11-02.png) 19 | 20 | > 妙啊! 21 | 22 | ![](/img/2021-01-15-18-52-19.png) 23 | 24 | > 这是很重要的事情。 25 | 26 | ### 中性和其他 27 | 28 | ![](/img/2021-01-15-18-08-54.png) 29 | 30 | > PCR检查有意义吗?无症状感染者多的情况下,这么多人咋办啊? 31 | 32 | (当然是有症状养病没症状隔离啊!难道出去乱跑吗?) 33 | 34 | ![](/img/2021-01-15-18-32-30.png) 35 | 36 | > 如果对这个(检查)也觉得奇怪的话,是不是承认日本通过限制PCR检测来隐藏(感染者多的)事实。 37 | 38 | (其实日本人民就算人人都不承认我们外国人也看得出来) 39 | 40 | 41 | ### 负面 42 | 43 | ![](/img/2021-01-15-18-10-39.png) 44 | 45 | > 要乱套。 46 | 47 | ![](/img/2021-01-15-18-11-30.png) 48 | 49 | > 不仅无法抑制感染扩大,反而给医疗体系带来高负荷,作为社会实验很有趣,让我吃个瓜。 50 | 51 | ![](/img/2021-01-15-18-12-54.png) 52 | 53 | > 有必要吗?检查出来一大堆阳性怎嘛办?不知道有啥目的…… 54 | 55 | (一大堆阳性大家自己还不知道是阳性咋办) 56 | 57 | ![](/img/2021-01-15-18-15-55.png) 58 | 59 | > 完全没意义。 60 | 61 | ![](/img/2021-01-15-18-16-44.png) 62 | 63 | > 1~2成感染者不会变成阳性,所以PRC阴性不能保证无感染。 64 | 65 | (如果一直放任,倒是可以保证人人有感染) 66 | 67 | ![](/img/2021-01-15-18-34-04.png) 68 | 69 | > (有点长,懒得准确翻译了,就是还是说假阳性的问题……) 70 | 71 | ![](/img/2021-01-15-18-36-42.png) 72 | 73 | > 意思我们明白了,但是今天的日本“检查阳性但是还很精神”的人考虑在内,只是增加(阳性的)数字而已…… 74 | 75 | (翻译不下去了,啥逻辑啊……) 76 | 77 | ![](/img/2021-01-15-18-41-15.png) 78 | 79 | > PCR检查了就能治好吗?PCR检查的正确性有80%吗?假阳性患者都得隔离20%,最终以混乱结束吗? 80 | 81 | (不能治好,不控制只能保证大家都得病) 82 | 83 | ![](/img/2021-01-15-18-42-36.png) 84 | 85 | > PCR检查就是诈骗!(下面的翻译略) 86 | 87 | (……你说是就是吧) 88 | 89 | ![](/img/2021-01-15-18-43-13.png) 90 | 91 | > 预算上拆东墙补西墙的自我安慰行为,只是损害住民的利益罢了。 92 | 93 | ![](/img/2021-01-15-18-44-18.png) 94 | 95 | > 浪费预算。 96 | 97 | (顺便一提,这个人的昵称是:反对强制戴口罩,不要列入指定传染病,感觉是用来引导舆论的账号) 98 | 99 | ![](/img/2021-01-15-18-45-25.png) 100 | 101 | > 这检查有啥意义吗? 102 | 103 | (你说没就没吧……) 104 | 105 | ![](/img/2021-01-15-18-45-57.png) 106 | 107 | > 再说,只是想要引人注目的县知事啥都干得出来,世田谷区的模特小姐姐咋弄? 108 | 109 | (这是广岛又不是东京) 110 | 111 | ![](/img/2021-01-15-18-48-38.png) 112 | 113 | > 傻X吗? 114 | 115 | (……) 116 | 117 | ![](/img/2021-01-15-18-48-53.png) 118 | 119 | > 让我们整出10万阳性吧!(笑) 120 | > 真是浪费钱。 121 | 122 | 123 | ![](/img/2021-01-15-18-49-49.png) 124 | 125 | > 我觉得你这是哪怕知道无差别PCR检测没有意义还是要检测,还是要故意增加阳性患者吗? 126 | > 医院怎么办?医疗真的要崩溃了啊! 127 | 128 | (大家都不检测的话,是故意增加感染者吗?鸵鸟政策伴随医疗崩溃喊到今年了,医疗真的快崩溃了) 129 | 130 | 131 | ![](/img/2021-01-15-18-52-37.png) 132 | 133 | > 扩大PCR检查的英国失败了,中国的感染也在扩大中。应该做的是改变医疗体制,而不是把有限的税金用在无用的检查上,广岛县民又要吃土了。 134 | 135 | 136 | ## 总结 137 | 138 | 从回复的情况来看,日本网民没有什么长进,和新冠刚开始的时候一样。 139 | 政府的鸵鸟政策的确在相当大的程度上代表了民意,不愧是民选的政府。 140 | 但是看到这样的评论,说明在科普这件事上,政府或有失职之过。 141 | 142 | 其实大规模的PCR因为阴性率高,往往30人甚至更多样本混在一起检测,成本其实是很低的。优质的检测技术(ddPCR)也可以减少假阴性。 143 | 总之,有“因为用火不安全,所以我们吃生的好了”这样的想法是奇怪的。 144 | 145 | 出现这样的评论却不是不能理解,毕竟经济受新冠影响很大,餐饮旅游行业怨声载道,但是大家又缺乏不惜一切代价,齐心协力收束事态的勇气,或许是不愿意成为“代价”。 146 | 所以,虽然“希望尽早收束事态”是每个人的愿望,但是落实到具体事情,意见就千差万别,尤其是收入受影响的居民。 147 | 148 | 最后,日推上其实也比较乱,Robot账户、喷子也有不少,并不能完全代表所有日本人,这个只是一个采样而已。 149 | -------------------------------------------------------------------------------- /spam/recsys-biased-us.md: -------------------------------------------------------------------------------- 1 | # 推荐系统如何让我们变得极端 2 | 3 | ## 前言 4 | 5 | 这个题目我想写很久了,之前我写过一篇[互联网政治圈观察日志](/spam/bull-shit-politics.md),算是描述了一下现象,我今天想猜测一下起因——以一个推荐系统工程师的身份,猜测和讨论一下推荐系统引起的那些问题。 6 | 7 | 虽然讨论推荐系统,但是我保证,这是一篇技术无关的文章,不需要任何数学的基础也可以轻松阅读,如果能对你有用,那我就再高兴不过了。文中可能会出现一些政治观点,由于本文不讨论任何政治和立场相关的内容,所有的观点都是为了举例,请务必注意。 8 | 9 | 文章自认为写的不太好,有些观点可能没有表达清楚,其中一个原因是没找到合适的作图工具,一些图形化表达很简单的观点可能表达的不是那么清晰。 10 | 11 | ## 我们为什么要有推荐系统 12 | 13 | 推荐系统的诞生,是为了解决信息过载的问题,今天人类出版书报的速度已经远远超过了单人阅读的极限,更不要说互联网,一个稍微有点人气的论坛,要读完每天的所有新帖子也是一件非常费劲的事情,以至于大一些的论坛需要许多的版主来维护。再比如知乎,每天的新问题,新回答都不是我等能阅读过来的速度,知乎需要雇佣很多人来做内容检查,删掉冲塔的,发广告的,搞黄色的……当然机器学习的NLP技术大大减少了所需要投入的岗位数量,不过这是另一个话题了。 14 | 15 | 我们从信息匮乏的过载,只用了区区几十年,面对这样过载的信息,必须要有新的技术解决。 16 | 17 | 首先是分类,比如针对书籍,我们有[中国图书馆分类法](http://www.ztflh.com/)。雅虎早期的内容分类目录也是这一思想的体现。事实上,这一分类法并不少见,很早我们在分类书籍的时候,就分为四大类:经史子集。以及分类生物的时候提出了7个层级:界、门、纲、目、科、属、种。今天打开腾讯的首页,仍然可以看到这些类别:新闻,视频,图片,军事,体育,NBA,娱乐,财经,科技,时尚,汽车,房产,教育,文化,星座,游戏等等。还有一些网站分为了亚洲图片,欧美图片,……咳咳 18 | 19 | 但是信息仍然在过载,过载到了给每一个物品赋予对应的类别都很麻烦,甚至单单展示分类用的索引或者目录都很困难,要知道,互联网时代不少人的阅读能力是不高于140个字的。这个时候就有搜索引擎了,百度,谷歌,淘宝理论上都是搜索引擎(淘宝早期也是目录式的,现在以推荐+搜索为主了)。但是搜索引擎的基础是,你知道有这个东西,但是不知道在哪里。而我们往往是不知道有这个东西,大家有的时候会发出感叹:淘宝还有这个东西卖啊!就是这样的情况。 20 | 21 | 所谓的未知有两种:已知的未知,和未知的未知。前者你只是不知道答案,后者,你甚至不知道问题的存在。 22 | 23 | 这个时候,参考社会化推荐,人类开始准备做推荐系统。推荐系统的一个基础原理是,物以类聚,人以群分,并且将这个原理用数学公式体现出来。 24 | 举个例子,我爱读《三体》,但是不知道《流浪地球》,《球形闪电》,这个时候,有一个饱读大刘的朋友给我推荐这些书,那我应该是会欣然接受的。再比如,推荐系统认定我是个科幻迷,于是给我推荐科幻类的书籍,肯定比给我推荐《羊皮卷》这种洗脑书要靠谱的多。 25 | 26 | 如果我们给M个用户和N个物品都从0开始编号,并且将用户和物品的正面的交互信息(如阅读/点赞/购买)放入矩阵的小格子里,我们可以得到这样一张交互图: 27 | 28 | ![](/img/2020-10-02-16-32-08.png) 29 | 30 | 经过推荐算法处理以后(我这里简单的用了一个SVD代替),大致是这样: 31 | 32 | ![](/img/2020-10-02-16-33-08.png) 33 | 34 | 我们可以看到人群分为两派,一派喜欢前4种物品,另一派比较喜欢后4种物品,我们就这样把缺失值填上了,看上去问题解决了。 35 | 但是新的问题,也就从这里开始。 36 | 37 | ## 推荐系统为何让我们偏激 38 | 39 | 相信大家都不是粪车从门口过也要尝尝咸淡的人,所以我们大概率会集中在自己喜欢和支持的东西上——这个看上去也没什么大问题。比如饭圈之前就喜欢搞“封地自萌”,我们小圈子觉得哥哥最帅那就是最帅其实没有任何问题,哪怕出了圈子也没人认识你那哥哥姓甚名谁,你哥哥也可以天下第一。 40 | 41 | 但是这一切的前提是“人贵自知之明”,你需要知道你看到的结果是由你的历史行为形成的向量召回并且经过精排算法排序形成的,是你自己决定了自己看什么,你所在的就是一个小圈子,万万不要把它当成整个世界。 42 | 43 | 还是以饭圈为例,你的微博满屏都是你的好哥哥,但并不代表所有的人都在看你的哥哥,对你来说你的好哥哥是97%甚至100%,但是对于整个微博的流量可能只有10%,影射到生活可能之战1%都不到,毕竟大家还要回家做饭收衣服,很忙的! 44 | 45 | 不幸的是,人类就不是有自知之明的生物,之前的饭圈“破圈”,以及2.27事件就是相当的典型——一个我不认识的私域流量明星的粉丝通过举报等手段,让另一个我不熟悉的圈子(同人圈)的交流和发表作品用的网站消失。 46 | 从资本的角度看,所谓破圈是资本是不满足于收割私域流量,准备扩大收割面积,2.27事件是破圈的阵痛,是韭菜对资本无力的抵抗。 47 | 但是从普通用户的角度看,是一群异常极端的人在四处攻击他们所有看不顺眼的行为。在我看来,这些异常激动的行为的罪恶根源在于两方:推荐系统及其它原因产生的信息偏置,以及容易被偏置过的信息洗脑的人类。 48 | 49 | 支持观点A的人看到自己的首页上95%的观点都支持观点A,很高兴,支持观点B的人看到页面上99.85%都支持观点B,更加高兴。在他们看来,只不过还有5%或者0.15%的人似乎反对自己的观点。 50 | 51 | **天呐,大家都一边倒的支持自己的观点,怎么还有这么几个人冥顽不灵?** 52 | 53 | 这个时候人类的另一个缺点——或者从生存的角度说是优点——就起作用了:仗势欺人,大家都觉得自己人多,自己的观点逻辑上也说得通——虽然他们的逻辑可能是基于错误事实推导出来的,但是没关系,我们现在人多,我们一人一口唾沫都能骂到你销号。 54 | 55 | 所以除了在自己的小圈子里互相转发以外,就是试图去“感化”支持自己能看到的、为数不多的、持对立观点的人。 56 | 57 | 我认为这种现象可以称作观测偏差,让人产生观测偏差,这也是洗脑的基本原理。一些政府也好、组织也罢,有目的,有组织的对互联网的内容进行注入或者删除,来达到让民众产生观测偏差,进而借此洗脑的目的。 58 | 比如我在前一篇文章里提到日本的“蓝莓星冰乐”推特,就是通过注入数据的方式,让大家觉得新冠并不是一个很严重问题,结果被日本网友掀了个底儿掉。 59 | 还有一些奇妙的机构,不仅通过注入,还通过删除的方式,让大家产生“岁月静好”,“万众一心”的错觉,就这样还经常翻车,真是“有心栽花花不开”。 60 | 这么来看,推荐系统造成的偏置只能算是“无心插柳柳成荫”。 61 | 62 | 稍微聪明一点的人会用小号或者匿名的模式去单纯的观测,可能可以得到类似:“AB两派势均力敌,但是从数据看,A暂时略胜一筹”这样较为中立的结论。 63 | 64 | 但是如果真正的从后台数据看,有可能支持观点A和观点B的人加起来不超过30%,大多数人其实支持的是更加温和的观点C,只不过他们甚至都不关心这个问题本身,所以被系统忽略了。 65 | 于是我们看到,AB两派吵得天翻地图,互相骂对方臭不可闻,是狗屎,是蛆,C则在风花雪月,聊天打牌,时不时莫名其妙被卷入AB之争当成对立面里面溅一身口水。 66 | 67 | 推特上的键政圈里这个问题尤其明显,有些观测偏差甚至不是推特在搞鬼,而是用户自己制造的: 68 | 69 | [![](/img/2020-10-02-16-45-07.png)](https://twitter.com/PatrickHsie/status/1243750596605169665) 70 | 71 | 比如上面这个小工具的主要作用就是:拉黑给某一条推特点赞的用户。 72 | 一般来说,有人发现了一条自己极其厌恶的推特,这个时候就可以拉黑所有给这个推特点赞的人。 73 | 本身推荐系统就有“协同过滤”之称的算法帮你过滤你不喜欢看的东西了,这个小工具可以说加剧了对立。 74 | 75 | 对立的产生本身就在于人类不愿意动脑子,不去思索为什么这些人会发让你厌恶的内容,而是单纯的觉得对方恶臭,讨厌,自己不愿意再见到。 76 | 我看到一条新闻,不需要确认其真伪,细节,只需要用我脑袋里的政治观点就可以作出评论,参见这个推特下面的评论:[貴州女子高空玩兒秋千](https://twitter.com/niepanxinglai/status/1299162043631558656)。 77 | 78 | 廖雪峰老师也曾经吐槽过: 79 | 80 | ____国交警控制绿灯为过马路老人多亮了97秒,你怎么看? 81 | 82 | - A:美国:体现了人类灯塔的光辉; 83 | - B:日本:体现了社会尊老爱幼; 84 | - C:中国:交警滥用职权,行人不守规则,且缺乏天桥等基础设施。 85 | 86 | 我可以偏激的说一句,使用这个屏蔽点赞用户小工具的人,相当偏激,且相当容易被洗脑。因为他的脑袋里只允许装下一个观点,他的世界只能有一个声音,所有的反对意见都是这个世界的渣滓和污垢,他会认为这样的屏蔽行为只是一种“清洁”,就好像装纱窗防蚊虫一样自然。 87 | 88 | ## 如何对抗推荐系统 89 | 90 | 首先,你只要记住:“我看到的信息,大部分都是有偏向性的,不可轻信”,就足以对抗世界上大部分的洗脑,传销,带节奏。你甚至不用去特地对抗,因为你知道信息是有偏的,你就不会偏激。 91 | 92 | 当然,单单记住这一句话是有点问题的,毕竟我们还要靠互联网收集资料,如果不相信自己看到的信息,意味着无法获取任何有用的信息。这个时候我继续给出一个不是特别完美的解决方案:“孤证不立”。 93 | 94 | 当我们看到一个观点或者一个信息的时候,在接受它之前,首先最好能找到完整的证据链去证明它。比如你对我推荐系统“物以类聚,人以群分”的观点有疑惑,可以自己造一点数据去跑一跑诸如SVD++这样的算法,就知道我最后两张图表所言不虚。 95 | 96 | 对于一些证据不好找的内容,可以这样判断:如果你看到一些评论一边倒的内容,只有支持,没有任何反对,那这个内容肯定有问题。 97 | 98 | 要让一个内容成立,至少找到两个不同的支撑这个内容的证据,如果可以的话,最好找到反对的观点。如果实在无法确认,可以试试自己制造一些反对的观点,看看这些观点会引起怎样的讨论,或者怎样的消失,你对这个内容的可靠性心里就有数了。这样你才可以在相信与不相信之间慢慢抉择,有叫大概率作出正确判断。 99 | 100 | 所以,你最好关注一些你不喜欢的人,听一听你不喜欢的声音。尽管这么做可能对你造成不适,但是适度的不适可以让你成为一个更加开阔、理性、客观的人。成为所谓客观人不会带给你任何直接收益,但是减少偏激至少有助于防止形成极端主义,例如法西斯那样的独裁和专制。 101 | 102 | 看到喜欢的或者不喜欢的内容,切勿被一时的情绪所裹挟而冲昏了头脑,仔细想想,这个内容的作者本身可能抱有什么样的目的,作者隐藏了什么没有告诉你的内容。 103 | 104 | 以本文为例,我前面没有告诉你的是,新颖性也是推荐系统的指标之一,虽然难以评估,但是很重要。 105 | 推特并没有太多的过滤你的内容,最多是根据你的关注点赞信息给你推对应的广告,推特也有Trend这样的模块让你发现更大世界。 106 | 基于以上观点,将错误全部推给推荐系统并不对,如果你抱着前文的观点跑到互联网公司去要求他们撤掉推荐系统那就不对了,这篇文章也不是为了引起你对推荐系统的仇恨,我还是肯定推荐系统在解决信息爆炸上的价值的。 107 | 108 | 事实上,推荐系统会造成上述的问题,但是往往小于一些别有用心的人和组织进行的信息注入和删除——这是非常常见引导舆论的手段,这些特性的删除和注入的破坏力也远大于推荐系统造成的因为用户自我选择而带来的倾向性。 109 | 110 | 希望大家都能有更开阔的视野。 -------------------------------------------------------------------------------- /spam/save-children.md: -------------------------------------------------------------------------------- 1 | # “救救孩子” 2 | 3 | 最近发生了两个新闻,一个在中国,一个在美国。中国为了孩子开始对游戏产业开炮,美国为了打击儿童色情要求大家献出自己的隐私。 4 | 5 | ## “救救孩子”在中国 6 | 7 | 中国的新闻是《“‘精神鸦片’竟长成数千亿产业”》,其中将游戏成为“电子毒品”,“精神鸦片”。最后定稿的标题是:[《有孩子1天玩8小时网游!精神鸦片竟长成数千亿产业?》](http://sz.people.com.cn/n2/2021/0803/c202846-34850364.html) [(备份链接)](https://archive.vn/0sBHv)其中几个副标题:“网络游戏对未成年人影响触目惊心”,“网络游戏对未成年人影响触目惊心”。 8 | 整篇文章基本都在说青少年沉迷网络游戏的问题。 9 | 10 | 事实上,这不是中国社会第一次讨论游戏的问题,“精神鸦片”是一个相当古老的词汇,在2000~2010年的时候就被频繁提起,与毒品成瘾相似,创造出了一个新词汇“网瘾”,之后滋生了非常多的不正规的“戒网瘾机构”或者“戒网瘾学校”,其中最臭名昭著的两所应该是临沂杨永信的戒网瘾机构和豫章书院,这些机构至今还开着,而且扩展出了更多的业务,比如“帮助孩子矫正性取向”。 11 | 12 | 这些机构的手段如出一辙,找一些退伍军人,甚至是地痞流氓,对送进来的孩子军队化管理、军训、体罚、感恩教育洗脑、殴打、杨永信的机构还多处一项电击。其实这些机构更像是现代的宗族私刑,而让他们游走在法律边缘(而不是彻底陷入违法)的原因是送进来的大多是未成年人,父母不愿意担负教养的责任,便送孩子去这些机构。 13 | 14 | 也并不仅仅是游戏,之前中央启动的[“扫黄打非·新风2021”集中行动](http://www.xinhuanet.com/legal/2021-03/20/c_1127233457.htm),也号称是为了保护未成年人: 15 | 16 | >……筑牢民心工程、高举“护苗”大旗,将以“护苗2021”“净网2021”“秋风2021”专项行动为开展平台,坚持问题导向、强化查处打击,努力实现保护未成年人氛围更加浓厚、网络空间持续清朗、新闻出版传播秩序不断改善的工作目标,为庆祝建党百年、“十四五”开局及开展党史学习教育营造良好的环境氛围。 17 | 18 | 净网行动直接波及了各种(主要是外国的)动漫和电视剧,非常多的作品(或好或坏)纷纷被下架。最近几年实行的引进动画“先审后播”的机制,枪毙掉了一大堆新番,其中不乏一些佳作。且不论这些作品质量如何,目前并没有任何成文的审核标准,来保证满足这些条件的作品一定能通过审核。所谓的审核标准,大多是诸如:“符合社会主义核心价值观”,“需要宣传正能量” 这些正确、宽泛、易于操作和重新解释的废话。 19 | 20 | ## 中国真的救了孩子吗? 21 | 22 | 是,也不是。“是”的部分上面已经说了,下面说说不是的部分。 23 | 24 | 中国没有作品的年龄分级制度,所以出现了非常滑稽的一幕,《寄生兽》这样有思考有深度的佳作动漫,因为镜头血腥而无法在国内观看,但是莫言的作品中不乏黄色的情节,事实上大量的出现了性爱相关的描写。因为莫言获得了诺贝尔文学奖,所以作品得以豁免审核,即使是小学的孩子也可以买来阅读。 25 | 26 | 无论是莫言的书还是《寄生兽》,都是佳作,而且都不适合儿童阅读,缺乏年龄分级的结果就是,要么全民读适合低龄的读物,要么就是孩子接触到这个年龄段不该接触的内容。 27 | 28 | 比如禁止向未成年人出售烟酒,这就是一种年龄分级。烟酒对孩子的危害其实比《寄生兽》大得多,但是妥善的管理让我们仍然可以正常售卖。 29 | 30 | 为什么我们没有文艺作品的年龄分级呢? 31 | 32 | 年龄分级需要清晰的、成文的、可执行的标准,如果真的诞生了这个标准,至少会出现两个问题: 33 | 34 | 1. 人为可操作的空间大大减少,人治变为法制,灰色收入的空间大大减少。 35 | 2. 不能再用“救救孩子”这个发臭的幌子对言论自由进行打压,因为已经年龄分级了,符合标准的作品就应该通过。 36 | 37 | 这两点带来了巨大的阻力,导致从2000年初开始呼吁分级,20年过去了,仍然没有任何变化。 38 | 39 | 即使从其它角度,我也不觉得真的在救孩子,比如嫖宿幼女罪——不仅多次让对幼女(14岁以下)进行侵害的人免于重刑,还给幼女扣上了“妓女”的帽子,这个恶法2015年才废除。性同意年龄是偏低、偏粗的,也一直没有再细化。 40 | 41 | ## 美国准备怎么“救救孩子”? 42 | 43 | 最近美国的苹果公司准备往用户的手机上安装一个[新的功能](https://www.washingtonpost.com/technology/2021/08/05/apple-child-pornography-iphone/),扫描用户所有的相册照片,提取Hash,和服务器上已有的儿童色情的图片Hash进行比较。 44 | 并且苹果声称,不会接受任何来自政府的利用该系统进行监视的请求。 45 | 46 | 话虽如此,但是: 47 | 48 | 1. 如果一个技术会被滥用的话,它一定会被滥用,历史上无一例外,这次也不会。 49 | 2. (此条也作为1的支撑)苹果并不值得信任,苹果2012年承认参与棱镜门,满足了88%来自政府的数据请求,最近更是爆出2年前SciHub的创始者亚历山大的苹果手机的数据就被苹果公司交给了FBI,在2年后很不正式的发了一封邮件告知此事。 50 | 51 | 无独有偶,英国在2010年卡梅伦竞选上台的时候,竞选承诺中也包含了打击儿童色情,将为儿童色情专门打造一个系统,从ISP屏蔽这些网站。然而,就在2021年的今天,很明显这个系统被滥用了,[这个列表](https://en.wikipedia.org/wiki/List_of_websites_blocked_in_the_United_Kingdom)远远不止儿童色情了,此后这个系统成了资本维护版权的工具,海盗湾之类的网站接连被屏蔽。今天[连SciHub也被屏蔽了](https://www.ispreview.co.uk/index.php/2021/02/court-order-forces-uk-isp-talktalk-to-block-sci-hub-website.html)。 52 | 53 | 事实上,美国不是从今天才开始“救救孩子”,FBI一直在监听所有的搜索内容和流量,对涉及儿童色情的进行抓捕,这种行为已经成了梗被网友做成了表情包。 54 | 55 | ## 美国真的救了孩子吗? 56 | 57 | 也没有,美国仍然放任毒品,不愿大力管制,除此之外,美国爆出过“萝莉岛”的丑闻,目前主事者已经在狱中“离奇自杀”,案子成了无头案,没有任何证据了。 58 | 但是之前爆出疑似涉及的人员名单中,也有喊着“救救孩子”的政客。 59 | 60 | 所以,美国也一样,“救救孩子”只是一个看上去政治正确的幌子,在这个幌子的遮掩下,大家干着见不得人的事情。 61 | 62 | ## 孩子真的需要我们这样来救吗? 63 | 64 | 答案是不需要这样的保护,孩子应该由家长和社会共同抚养教育,长成对社会有所贡献的劳动力,在社会中获得幸福。重点是对教育和保护的投入,这是正面干预,而不是把所有的危险都禁止掉。 65 | 66 | 例如,如果我们希望保护我们的脚,应该用牛皮做成鞋子穿上,而不是用牛皮把路都包起来。 67 | 68 | 禁止所有的车上路可以把儿童的交通事故率降为0%,但是正常人都知道这不可取,但是到了文艺作品或者隐私政策的时候,大家又都“糊涂”了。不过我并不觉得政策的制定者是真糊涂,我觉得他们是装糊涂的高手! -------------------------------------------------------------------------------- /spam/shit-cap2user/rape-user.md: -------------------------------------------------------------------------------- 1 | # 互不联网公司是如何强奸用户的(持续更新) 2 | 3 | 互联网是有记忆的,我会持续收集一些互不联网公司怎么糟践用户的例子,有些可能没有证据,但是上网时间久的老网虫应该都会有印象。 4 | 5 | ## [微博抄袭小鸡词典案](https://jikipedia.com/hope) 6 | 7 | 随然我本人没有任何的证据保留,但是作为有使用过小鸡词典用户,我很清楚的知道微博是如何抄袭小鸡词典的。我没法给出证据也没法帮助小鸡词典,但是我至少要凭着良心写下我知道的事情,而不是让一些大公司的法务像捏小糖果似的拿捏任何小公司或者个人,这对于我一个普通人来说绝非好事。 8 | 9 | 而且这也不是微博第一次抄袭,微博之前就通过抄袭知乎的方式来营销并且盈利,但是不幸被知乎以投广告的方式钓鱼并且抓到证据: 10 | 11 | - [深挖:知乎起诉的微博营销号「大神说」](https://zhuanlan.zhihu.com/p/25377264) 12 | - [知乎起诉微博营销号「知乎大神」,快开庭了!](https://web.archive.org/web/20200815173535/https://zhuanlan.zhihu.com/p/24492978) 13 | - 可能是因为和小鸡词典一样,“微博还向法庭申请了不公开审理和不公开判决”,所以现在文章只能在互联网备份看到。 14 | 15 | 16 | > 新浪微博国际版 “有梗百科” 板块,大量抄袭照搬小鸡词典词条。标题,内容,图片,格式,无一不同,抄袭内容多达21278条。 17 | 18 | 其中微博否认证据,称所有谷歌快照证据,有造假的技术可能性(我笑了),声称所有图片均为伪造。甚至在一审的时候说微博没有网页版。 19 | 20 | 目前最新的消息是:9月16日,海淀法院一审认为抄袭不存在并驳回了小鸡词典的全部诉讼请求。(我又笑了) 21 | 22 | 23 | ## 360 24 | 25 | ### upload.360safe.com 事件 26 | 27 | 2010年的事情 28 | 29 | > 金山网络12月31日下午紧急召开发布会,称其安全中心接用户举报,在Google网站上可以搜索到大量中国互联网用户使用互联网的隐私记录,甚至包括用户登陆网站或邮箱的用户名、密码,金山表示已将此事向公安机关报案,并已与上级主管机关汇报。 金山网络表示,经过验证,金山网络发现了一个惊人事实:360在通过其客户端秘密收集用户信息,由于这台服务器的配置问题,导致360不慎将记录了大量用户信息的日志文件被google收录索引,造成大规模外泄。 金山公司在官方微博发一张从google快照中360safe.com服务器上的日志文件,并注明“左侧为360safe.com收集的用户电脑唯一标识码,右侧为该机器访问网络的url记录,其中包括用户名密码、内网传递的资料、用户连续访问多个url的记录,搜索结果记录。” 30 | 31 | 也就是说,360不仅收集了用户的信息,而且还把用户的信息以HTTP的形式暴露了出来,被搜索引擎的爬虫收集到,最后泄漏在网上。真的是不仅坏,而且从蠢。 32 | 33 | ## 腾讯 34 | 35 | 1. 早期的QQ会扫描用户的硬盘,但是扫描的原因不详,用途也不详,或许是杀毒,或许是窃取用户隐私。 36 | 2. 腾讯QQ有屡禁不止,永远弹不完的弹窗,以至于使用Windows的时候需要安装专门的反弹窗软件(当然这也不止是腾讯的软件这么做) 37 | 3. 亲测 QQ TIM 手机版会尝试读取任何NFC能读取的卡,只要卡接触到手机背面,就会跳出来要给你充公交卡,无法关闭,只能禁用NFC 38 | 39 | ### 腾讯QQ/TIM读取用户浏览器记录证据 40 | 41 | * [QQ 正在尝试读取你的浏览记录](https://www.v2ex.com/t/745030) 42 | * [关于QQ读取Chrome历史记录的澄清](https://bbs.pediy.com/thread-265359.htm) 43 | * [备份链接](https://archive.vn/EH2N8) 44 | 45 | [腾讯的官方回应](https://www.zhihu.com/question/439768601/answer/1683913941)声称数据是用于安全用途(为了防止被骂惨居然开了评论审核哈哈哈 46 | 47 | > 近日,我们收到外部反馈称PC QQ扫描读取浏览器历史记录。对此,QQ安全团队高度重视并展开调查,发现PC QQ存在读取浏览器历史用以判断用户登录安全风险的情况,读取的数据用于在PC QQ的本地客户端中判断是否恶意登录。所有相关数据不会上传至云端,不会储存,也不会用于任何其他用途。 具体情况为,该操作为历史上线的一个对抗恶意登录的技术解决方案:因系统识别有不少伪造的QQ客户端会恶意访问多个网站作为前期辅助工作,因此在PC QQ客户端中加入了检测恶意和异常的访问逻辑,以此作为辅助手段去判断恶意客户端。 对本次事件,我们深表歉意,内部正梳理历史问题并强化用户数据访问规范。目前,我们已经更换了检测恶意和异常请求的技术逻辑去解决上述安全风险问题,并发布全新的PC QQ版本。为减少不便,所有受影响的PC QQ历史版本将在今天开始进行热更新和推送升级包。同时,手机端QQ不存在上述操作,不受影响。 最后,感谢各位技术爱好者的监督,我们也欢迎大家向腾讯安全应急响应中心(腾讯安全应急响应中心 )提交报告。 48 | 49 | 如果说之前的操作是脱用户的裤子,那么这个操作就是把脱了裤子的用户的智商拖在地上锤。 根据用户的逆向分析,腾讯在寻找淘宝、天猫、京东的历史搜索记录,以及寻找“融资”,“古着”等等关键字,分析完成以后会上传分析结果。 50 | 51 | 如果这个叫检测恶意和异常的访问逻辑,那么我们这些推荐算法工程师都该丢饭碗或者转行做安全了。 52 | 53 | ### [搜狗输入法疑似通过注入其它程序来突破联网限制](https://www.v2ex.com/t/791087) 54 | 55 | 备份链接:https://archive.ph/3ZJO1 56 | 57 | 有指出:在 Windows 上,输入法本来就需要注入才能工作,因此这并不是“类似病毒的恶意注入行为”,而是“正常行为,然而防止联网措施难以生效” 58 | 59 | ## Bilibili 60 | 61 | * 网页播放视频只能播放6分钟,逼迫你下载App 62 | * (2021年初记)最近似乎有所改观 63 | * 国内下载的App和国外下载的App版本居然是不一样的,国外的还不支持直播 64 | * 这也罢了,这两个版本安装的时候手机都会提醒你这个软件会窃取你的个人信息 65 | 66 | ## 淘宝 67 | 68 | 摘自 Google Play 69 | 70 | > 祸害人与手机嘛。 所有权限,包括身体活动都要。奇了怪了。1,把京东杀入后台,你怎么总是间歇性去唤醒京东?这与你毫无关系啊?2,几乎手机中9成以上的应用,都间歇性去唤醒!!!你是为啥啊?是帮助手机厂商快点把电池搞坏?是把运行内存使劲搞得不够用?你这样糟蹋手机,你不受益啊。3,一个闲鱼软件庞大到接近535MB,庞大出约400多MB,这是为买卖物品吗?还是为其它??闲鱼在google pay被下架,是你主动下架,还是被踢出去的。无比丢人和无良,这种拿不要脸当本领的事情,是你一种文化了。 下载过程中的每个节点,一直试图篡改,修改手机系统,手机系统设置。运行中,总是唤醒至少50%的软件,探测很多app软件,包括油管的浏览行踪,交易,通话,信息,如果使用了搜狗输入法,所有发出去的文章,被详细追踪等等使用的详细数据,还有比这恶劣的事情吗? 71 | > 72 | > 太卡、太臃肿!阿里你什么时候能改变? 华为荣耀V1O手机在其他条件相同的情况下(我一直允许淘宝在后台运行),自升级到8.9.1后,Android系统持续弹出通知:手机淘宝在后台消耗电量!以前不是这样不会出现这个通知。另外一部荣耀8也出现了相同情况。耗电量为什么比以前更大了呢? 73 | 74 | ## 爱奇艺 75 | 76 | [爱奇艺TV版白嫖用户带宽当PCDN节点 除非强制退出否则就持续白嫖](https://www.landiannews.com/archives/99433.html) [备份链接](https://archive.li/jBIZH) 77 | 78 | ## 其它 79 | 80 | 曾记得,2000年初(及以前),软件还没有那么流氓,那个时候的软件是要买光盘(就先甭管盗版正版了)安装的,软件是要钱的,包括杀毒软件。 随着互联网的发展,软件开始可以直接在网上下载了装,免费软件开始大行其道,这个时候自动升级,捆绑安装,诱导安装,弹窗,各种卑劣行径就开始了。 81 | 82 | 互联网最初的田园时期开始不复存在,逐渐向着今天的互联网环境靠拢,当然,用户侧也作出过努力,系统的权限管理逐渐严格,一定程度上约束了流氓软件,但是仍然没有彻底消灭捆绑安装或者弹窗。 83 | 84 | 于是,愤青的我留存了证据(截图的时候我还是个学僧,系统还是XP/Win8这样),随后放置了将近10年都没管。 今天整理资料偶然翻到了,我就小刀拉屁股——给您开开眼,看看当年互联网公司是怎么强奸用户的意愿的。这里的勾选框我都是保留最初的缺省选项,没有改动。 85 | 86 | ![](../../img/willing/BaiduShurufa\_2013-10-10\_12-54-54.png) 87 | 88 | ![](../../img/willing/BaiduShurufa\_2013-10-16\_19-7-29.png) 89 | 90 | ![](../../img/willing/BaiduShurufa\_2013-10-7\_9-44-57.png) 91 | 92 | ![](../../img/willing/BaiduShurufa\_2013-10-9\_19-52-41.png) 93 | 94 | ![](../../img/willing/BaiduShurufa\_2013-11-3\_20-37-0.png) 95 | 96 | ![](../../img/willing/BaiduShurufa\_2013-10-10\_12-55-30.png) 97 | 98 | ![](../../img/willing/BaiduShurufa\_2013-10-18\_13-21-36.png) 99 | 100 | ![](../../img/willing/BaiduShurufa\_2013-10-7\_9-45-17.png) 101 | 102 | ![](../../img/willing/BaiduShurufa\_2013-11-10\_20-20-8.png) 103 | 104 | ![](../../img/willing/BaiduShurufa\_2013-11-3\_20-37-46.png) 105 | 106 | ![](../../img/willing/BaiduShurufa\_2013-10-10\_12-56-17.png) 107 | 108 | ![](../../img/willing/BaiduShurufa\_2013-10-22\_21-38-58.png) 109 | 110 | ![](../../img/willing/BaiduShurufa\_2013-10-7\_9-46-7.png) 111 | 112 | ![](../../img/willing/BaiduShurufa\_2013-11-3\_20-34-20.png) 113 | 114 | ![](../../img/willing/BaiduShurufa\_2013-11-3\_20-38-20.png) 115 | 116 | ![](../../img/willing/BaiduShurufa\_2013-10-10\_8-4-52.png) 117 | 118 | ![](../../img/willing/BaiduShurufa\_2013-10-7\_20-34-45.png) 119 | 120 | ![](../../img/willing/BaiduShurufa\_2013-10-7\_9-53-41.png) 121 | 122 | ![](../../img/willing/BaiduShurufa\_2013-11-3\_20-34-44.png) 123 | 124 | ![](../../img/willing/BaiduShurufa\_2014-1-20\_10-52-39.png) 125 | 126 | ![](../../img/willing/BaiduShurufa\_2013-10-10\_8-5-45.png) 127 | 128 | ![](../../img/willing/BaiduShurufa\_2013-10-7\_9-43-37.png) 129 | 130 | ![](../../img/willing/BaiduShurufa\_2013-10-7\_9-55-6.png) 131 | 132 | ![](../../img/willing/BaiduShurufa\_2013-11-3\_20-35-34.png) 133 | 134 | ![](../../img/willing/BaiduShurufa\_2014-1-20\_10-53-26.png) 135 | -------------------------------------------------------------------------------- /spam/tj-linear-algebra.md: -------------------------------------------------------------------------------- 1 | # 《线性代数》(同济版)——教科书中的耻辱柱 2 | 3 | ## 前言 4 | 5 | 最近读了[白非立上进记](https://zhuanlan.zhihu.com/p/94398141),其中线性代数部分真的引起了我相当强烈的共鸣。 6 | 7 | 我们其实大多数人都是白非立,并不是每个学生都有较强的情报收集能力,或者有大学教授的父母,知道每一门课该怎么学,大家都在等老师来引导,而老师如果引导的乱七八糟,那就学生就只能根据教科书自学,这是最后的救命稻草,如果教科书也一塌糊涂,那就毁了。 8 | 9 | 其实很多课程,本来每个人都可以学好,结果硬生生毁在教科书上。如果一个人因为学校教科书的不适应而放弃这门课是事故,那么这么多年用同济版或者抄袭同济版的教材的大学可以称之为教学灾难了。 10 | 教材的选择错的越离谱,能顺利掌握这门课程的人就越少,到最后只有一些天资聪颖的大神级人物可以学会,这不得不说是学校的失职。 11 | 12 | 所以我准备吐槽一下这本旷世烂书:《线性代数》同济版。 13 | 我想把这本书钉在耻辱柱上,但是耻辱柱说这样会不会太耻辱,后来我还是算了。 14 | 我严重怀疑这本书是同济编写了用来拉低其它学校的教学水平的,他们自己可能都未必用。 15 | 16 | 说到线性代数教材,我上大学的时候用的并不是同济版的线代,那我为什么这么痛恨同济版的教材呢? 17 | 因为我们大学用的是自己编的教材,说是自己编,其实就是抄同济版。具体临床表现为:第一章就讲行列式,知识点支离破碎,结构混乱,和同济版如出一辙。接下来我吐槽同济版的每一个点,基本都可以放到我们大学的教材上。 18 | 好在我们老师是明白人,没有完全按照顺序教。 19 | 但是书毕竟是买错了,看书复习的时候仍然让我十分痛苦。这样的学习方法,考后也遗忘的十分迅速。直到我遇到了Gilbert Strang,又看了《Linear Algebra Done Right》,重新学了一遍,第二遍让我一直没忘(当然一些证明细节可能糊了)直到今天。 20 | 21 | 我读大学的时候,可以不从学校手里买书,但是大多数人为了不出幺蛾子,都是按照学校的安排统一买书。我的建议是,别的书还不好说,线性代数就单独摘出来别买了,父母挣点钱不容易,买点擦屁股都太硬的废纸是不是有点浪费? 22 | 23 | 我本来以为,作为国内一流大学的同济大学,搞出来的教科书水平一定高到不知道哪里去了,至少是不错,就好像我们买东西会认牌子一样。 24 | 等我学了一圈别的线性代数再回头看,真是想多了啊,这是我见过的线性代数教材里第一烂的,不是之一,是第一! 25 | 26 | 下面我们就欣赏一下同济版的线性代数教材。 27 | 28 | ## 混乱的结构 29 | 30 | 如果说这本书最大的问题是什么,那就是结构混乱。 31 | 32 | 第一章,起手就行列式糊你熊脸: 33 | 34 | ![](/img/2020-08-26-18-42-03.png) 35 | 36 | 兄弟,我们是线性代数课,你不先介绍一下什么叫线性,什么叫代数吗?起手就是n阶行列式的定义,实力劝退。 37 | 38 | 这里表扬一下我校老师,第一节课会介绍什么叫线性,什么叫代数。 39 | 40 | 随后就是行列式的计算了: 41 | 42 | ![](/img/2020-08-26-18-44-51.png) 43 | 44 | 啊,原来画对角线就行了啊,那你告诉我,为什么四阶行列式开始不能用这个方法呢? 45 | 46 | 然后开始讲全排列和逆序数,恍惚中我看到了概率老师在向我招手,一种走错片场恍如隔世的感觉瞬间袭来。可惜当时的我还没有这个感觉,因为我们的概率论安排在线性代数之后。 47 | 48 | 然后就是对换,转置之类的行列式的性质,以及行列式的……展开,争分夺秒的引入了一个没有什么卵用的……代数余子式。以上介绍伴随着严谨但是佶屈聱牙的证明,再次告诉你:你不是学数学的料,趁早收拾书包滚蛋。 49 | 50 | 在以上所有的介绍完成以后,终于告诉你,我们的行列式可以用克拉默法则来解线性方程组。无论手算还是计算机算,克拉默法则的计算量比直接消元大到不知道哪里去了,还要考虑全排列和逆序数,我当时已经知道怎么消元,所以我脑子里的第一反应是:脑子坏了才用克拉默法则。 51 | 52 | 我不知道这个法则在数学史上是什么地位,或者在这门课程里有什么意义——毕竟有些定理虽然直接用不上,但是用来引出概念或者引理之后会变得特别实用。至少克拉默法则在我的学习和工程师生涯中,没有发挥一次作用。后来我还看到一些吐槽,说这个法则解2x2矩阵都不稳定,鬼才用。 53 | 54 | 伴随着没有卵用的克拉默,第一章,就这样结束了,按照这样的节奏上一节课,脑子里不会有任何框架,概念,只有死记硬背的各种名词和性质。 55 | 56 | 抱着空空如也的大脑,我们开始了第二、三章的学习:矩阵及其运算+矩阵的初等变换及线性方程组。 57 | 58 | 就算你搞完这两章,你仍然只是堆积一堆名词概念,比如什么叫矩阵,什么叫秩,但是并不能让你直观的理解他们到底是干什么的。唯一值得“表扬”的是,在第三章的最后,终于犹抱琵琶半遮面的讲到了矩阵和线性方程组的解的关系,虽然这个时候我们已经知道了什么是秩,什么是逆矩阵,甚至已经搞了一把分块矩阵了。但是这个时候我们应该是不知道矩阵和线性方程组有什么关系的。 59 | 60 | 第四章,开始介绍向量……半本书过去了,矩阵,行列式,那么多复杂的性质介绍完了,矩阵的重要组成部分——向量——终于羞答答的出现在了我们的面前。我倍感欣慰啊,矩阵可以理解为是由向量组成的,BIG NEWS!您要不在第四章介绍,我在看前面的书还真想不到呢,虽然我连秩都应该理解了。哦,这一章又介绍了一遍向量组的秩……我只能说你开心就好。 61 | 62 | 在这一章的最后,终于开始介绍向量空间,但是通篇介绍还是围绕在向量组的秩,线性有关无关,终于在最后的例题里触及到了向量空间的变换,本书没有大篇幅的讲解空间变换的重要概念,用精炼的仅仅一个例题就教会了大家怎么求两个空间的过渡矩阵。——这也可以理解,最重要的线性空间要在第六章才讲呢,还是选讲。 63 | 64 | 讲完了向量空间,我们应该说说向量的运算了,所以第五章排的中规中矩,在经历了前四章的磨砺以后,伤痕累累的大脑终于得到了休息。 65 | 66 | 这一章,叫做“相似矩阵及二次型”。 67 | 68 | 我有点懵逼,这一本书难道就剩下这俩概念了吗?(让我们先忽略打星号的第六章) 69 | 70 | 当然不是,因为我们连向量的内积都还没有介绍呐!!!! 71 | 72 | ![](/img/2020-08-26-21-59-56.png) 73 | 74 | ![](/img/2020-08-26-22-18-38.png) 75 | 76 | 请注意这个“曾”字,看到这个字,我才知道我误会编者,误会的有多深,这本书,可能还有上册…… 77 | 78 | 总的来说,这一章不止是“相似矩阵及二次型”,包含了向量的一些基本操作,正交基的介绍,特征值与特征向量(这两个衔接的还算自然),相似矩阵,之后才是二次型。 79 | 80 | 这一章偏应用,内容还算正常,硬要说什么的话,仍然是佶屈聱牙的所谓严谨证明,(对于初学者)炫技一样的例题,以及没有介绍SVD这个工科大杀器。以及,这一章的部分内容完全应该散到其它章节去。 81 | 82 | 不论如何这已经是最正常的一章节了,就先表扬一下吧! 83 | 84 | 现在开始打了星号的第六章,选学的第六章,屠龙少年过五关斩六将最后接触到整个线代的核心——线性空间。 85 | 86 | WTF?这么重要的内容你现在才讲,这不是坑爹呢吗!整个线性代数的半壁江山(你说全部都可以)就在这线性空间里面,你居然是……选学?选学里不应该放SVD/PCA/雅可比迭代这种乱七八糟的应用类话题吗?你见过把甜点当正餐,然后牛扒或者烤鸡这样的正餐大菜随便啃几口说这是餐后“甜”点的吗?我小时候要是吃冰淇淋吃到吃不下饭是会被家长打的,我不知道谁来把这个编者打一顿。 87 | 88 | 我看了第六章,我承认,稍微有点向抽象代数的方向偏了,看上去好像数学专业才要学。但是线性空间完全是普通工科学生应该搞懂,可以搞懂的东西。 89 | 90 | 第六章也不是没有槽点,第六章终于介绍了,矩阵可以作为矢量的线性变换来理解,让我们看看例题吧: 91 | 92 | ![](/img/2020-08-26-22-17-38.png) 93 | 94 | ![](/img/2020-08-26-22-18-10.png) 95 | 96 | 你是觉得大家都已经把抽象代数学完了吗?——抱歉,我忘了,我一个工科狗,是不是不配学这一章。 97 | 98 | ## 不合理的内容安排 99 | 100 | 我的吐槽要停止了吗? 101 | 102 | 没有! 103 | 104 | 这本书还缺了很多东西,154页的书: 105 | 106 | - 没有直观的几何理解,线性变换这种高度依赖几何直觉去理解的东西,居然没图。 107 | - 行列式的几何意义也没有介绍,全是逆序数的炫技,更不要说秩的几何意义了 108 | - 矢量的几何意义不介绍也行,矩阵作为线性变换的几何意义只是轻描淡写用了一个旋转矩阵的例题带过,我记得这个例题的地方还不是在介绍线性变换的地方。 109 | - 二次型的几何意义,以及在优化问题里的工程意义,语焉不详。 110 | - 线性相关和线性无关介绍完以后,没图,没说明 111 | - 下一章讲施密特正交化的时候,有一张靠谱一点的图可以用来说明,让我知道,编书的人并不是手残,只是不想给你画。 112 | - 憋着到了最后一章才讲线性空间,但是这个东西好歹是线性代数的核心,实在是憋不住,四章五节讲了向量空间。 113 | 114 | 向量,线性方程组,矩阵,以及他们生活的线性空间,不敢说面目全非,至少是被肢解的支离破碎,活生生的要把理科变成文科科目。 115 | 116 | 这本书有点想向工程实际靠拢,可是实际上,举的例子拙劣不堪,虎头蛇尾,且往往不举实际的例子,就是“我们在XX领域会遇到这样的计算”: 117 | 118 | ![](/img/2020-08-26-22-32-36.png) 119 | 120 | 你这介绍和不介绍有啥区别……凑字数吗? 121 | 122 | 除此之外,这本书在该下功夫的地方浅尝辄止,在不该下功夫的地方费尽全力,154页当成100页看我觉得都高估了。 123 | 124 | 除了处处充斥着的“这里不予证明”的嘲讽式定理,还有无图式几何理解: 125 | 126 | ![](/img/2020-08-26-22-40-23.png) 127 | 128 | ## 后记 129 | 130 | 吐槽完这本旷世烂书,我的心情没有好多少,现在还有多少工科的学生在学习这样一本烂书?他们和白非立一样,没有信息获取的渠道,他们信任的渠道:老师——不一定能给予他们真正的教导。 131 | 132 | 他们在和烂书缠斗的过程中,逐渐怀疑自己的智商,逐渐厌恶学习,就更不要说学分了,考试能过就阿弥陀佛了。 133 | 134 | 我不知道我校卖自己编写的教材每年可以增加多少财政收入,但是卖出多少,就可能毁掉很多人对线性代数了解的可能和热爱的可能。在我看来,这是杀鸡取卵,买椟还珠的操作。我们的老师也知道教材有问题,尽力在挽回这个局面,但是,这个局面本来应该如此吗? -------------------------------------------------------------------------------- /spam/why-not-domestic-phone.md: -------------------------------------------------------------------------------- 1 | # 为什么不应该用国产手机 2 | 3 | ## 写在前面 4 | 5 | 这里的国产手机泛指未经Google认证的国产安卓系统手机,并不是指所有Made in China的手机。 事实上,Made in China很有竞争力,有一家厂商推出了一款手机,同时提供纯美国制造的版本,纯美国制造的版本要比世界协作的版本贵一倍: 6 | 7 | [![](../img/2021-05-26-12-41-34.png)](https://puri.sm/posts/librem-5-and-librem-5-usa-what-are-the-differences/) 8 | 9 | 我今天要说的主要是在中国开发的操作系统,有何问题我会稍后一一列出。 10 | 11 | 在此之前,可能会存在这样的疑问:**“如果软件有问题,那就刷机换系统不行吗?”** 12 | 13 | 当然是可以的,但是手机和电脑不一样,硬件是高度定制的,对应的固件和驱动程序(HAL/硬件抽象层)大多是私有的,这就决定了你不能随意的刷机。而且如果刷机换系统,甚至只是获取Root权限,你的保修可能就没了。 14 | 15 | 虽说存在诸多的限制,但是大家仍然有有限的自由: 16 | 17 | 1. 论坛的大神会放出各种破解版,修改版等等 18 | 2. 同一系列的手机不止在国内销售,在国外销售的系统会使用Google认证的原生Android。 19 | 3. 有一些厂商会开源底层的固件驱动,当然一般是旧型号的手机 20 | 21 | 但是国内厂商并不乐意你这么做,以笔者以前用过的魅族15为例,魅族15的国内国外销售的手机硬件完全一样,我出国以后希望刷Google原生系统,但是失败了,起初我以为是硬件上的问题,直到我看到了另一个刷机教程才知道我肤浅了,魅族往手机的ROM的某一处写了一个ID,这个ID可以用来区别这是在国内还是在国外销售的手机,由此决定手机是否可以刷国际版ROM。 22 | 23 | 想要用上国际版ROM,先得获取Root权限,执行一个脚本修改这个ID才行。 24 | 25 | [刷机教程在这里](https://www.bokezhu.com/2020/02/27/632.html),但是这不是我当时看的一篇,现在魅族论坛上所有关于国际版ROM的讨论都被魅族官方和谐了,可见魅族官方并不希望大家刷国际版ROM。 26 | 27 | 为什么魅族官方这么不想大家刷国际版ROM呢?因为用国产的ROM对魅族更加有利。国际版的ROM需要过Google的认证,除了国内有GFW,导致Google的原生程序使用不便以外,厂商不能肆意的往系统里塞东西,这里的塞东西是中性的,既指为了用户体验而定制的良好设计,也指广告程序,用户数据收集和各种内置后门。 28 | 29 | ## 广告多 30 | 31 | 广告和推送多,是不想用中国版Android系统的第一理由。 我自己以前统计过,魅族有11处广告,而且没法全部关掉,详细可以看这个视频:[Flyme去广告 Flyme系统自带的广告太多了](https://www.bilibili.com/video/BV1eb411E7oU)。 32 | 33 | * 音乐,视频播放器让你开会员,给你推各种各样的歌和视频。 34 | * 日历也不老实,什么星座运程,热门,“礼包”,球队比赛新闻,引导你去别的地方 35 | * 浏览器自不必说,默认的空白页变成了类似2345导航网站的页面,你的每个点击都在贡献CTR,最后变成钱。 36 | * 手机管家里面也是一堆广告,安全播报,应用推荐下载 37 | * 连壁纸里面都有有,推送节日壁纸我可以理解,为什么壁纸程序要“精选内容推送”啊? 38 | * “资讯”就更不用说,整个就是一个大广告软件,配上一大堆UC震惊标题新闻。 39 | * 即使你都关闭了,还有推送 40 | 41 | 我当时为什么买魅族呢?说来好笑,同样性价比的有魅族和小米,我知道小米广告多,业内素有广告米的名号。我前一部手机是魅族MX3,那个时候大家还不会塞广告,我的体验相当不错。 加上MX3从外观到UI设计的真的很漂亮,所以买了魅族。 42 | 43 | 可是看到这么多广告,我也算对魅族彻底死心了,准备刷个国际版,这辈子不再买魅族了。在我准备刷魅族的最后关口,魅族手机不幸掉海里了,我干脆买了Google的Pixel,这是后话了。 44 | 45 | 广告也是历史悠久了,很早以前的国产手机(非智能机)除了开屏广告以外,还会内置一些删不掉的,需要交钱才能玩的小游戏,或者是一些订阅收费彩铃的入口。 46 | 47 | ## 权限控制弱 48 | 49 | 小米的照明弹算是对流氓App打响了第一枪(居然是广告米!)。 50 | 51 | 国内的软件,大多权限要的特别多。 这里都不说脉脉这种不读通讯录就不给用的流氓,很多软件,就算你不给权限,也有办法旁敲侧击的获取。 比如你不给应用列表,那就挨个尝试启动,比如尝试启动微博,启动成功了你肯定装了。再比如有文件夹读取权限的,就去读闪存里面有没有Weibo的文件夹,来判断你装了没有。 GPS的权限没有,但是如果能读取照片文件,就用照片里的GPS信息。 诸如此类,不胜枚举,你的一言一行,都被扒的干干净净清清楚楚,这些数据送到公司去,机器学习给你安排的明明白白。 52 | 53 | 定期收集的数据,通过流氓一般霸占在后台的进程发送到公司的服务器,然后用这些数据生成用户画像,以后给你推广告。 54 | 55 | 自从2010年,GFW屏蔽Google以来,Google的统一推送服务在中国是不能使用的,于是每一个应用程序都要启动一个后台服务来接受消息,顺便上传一下采集到的用户数据。很长一段时间,Android手机的内存几乎一直比iPhone要大,电池也大,但是没有iPhone流畅,电池也不耐用。 原因之一就是后台程序太多,占用内存太多。为了续航和流畅度,手机厂商想尽办法杀进程,App就想尽办法防杀,什么注册服务、自启动链,小小的手机里,天天都是攻防战。 当然,一部分和手机合作的软件厂商就可以获取更多的权限,来保证手机的正常运行。 56 | 57 | 这也不是国产系统的问题,这算是Android的通病,但是这个问题在国内更加严重. 因为Google离开中国以后,Android缺乏统一的推送机制,加上国内厂商大多是Fork一些非最新版安卓的源代码加一层壳改造开发,一些最新的权限控制更新也不能及时应用。 58 | 59 | ## 你的手机不是你的手机 60 | 61 | 最近,V2EX上有爆出了VIVO的手机存在后门,会将自己当作mCDN使用:[Vivo 手机某系统进程开放 55555 端口疑似用作 mCDN](https://www.v2ex.com/t/778678)。 同时还爆出系统内启动快应用不用伪协议,而是启动一个HTTP服务器,监听端口,而且还将这个端口通过uPnP暴露到公网上,几万台手机可能就会变成肉鸡。 62 | 63 | 可以看出,手机厂商已经不满足于给你推送消息,你购买的手机,将会变成手机厂商的分布式数据采集和计算设备,而你除了要付手机的费用,手机卡的费用,网络的费用,还得充电供着,不允许自己刷机或者Root,刷完软件就连硬件都不保修,就算你不要保修,他们也会通过设置一些标识位,防止国内的用户用上无法让他们赚钱的国际版系统。 64 | 65 | 这也不是近几年才有的新鲜玩意儿,早10年,安卓爆发的前夜,有很多山寨机就会偷偷发短信去“订阅服务”来赚钱。 66 | 67 | ## 国外的月亮是不是更圆 68 | 69 | 要圆一些,但也不是那么圆。 苹果也好,Google也好,也都在收集你的数据,苹果曾经为了刺激用户购买新的设备,以电池老化为理由,给旧设备降频,你的手机感觉更慢了。 但是至少: 70 | 71 | * 推送是统一的,不至于费电 72 | * 权限管理,尤其是通知管理是严格的,App不至于出现群魔乱舞的状态 73 | * 系统App里面是没有那么多推送和广告的,系统是纯净的 74 | 75 | 归根结底,所有的资本都想做恶,但是在欧美日本这些国家做恶的成本太高了,让这些厂商不得不收手。 76 | 77 | ## 开源的手机是不是智商税 78 | 79 | 是,也不是。买开源手机之前,你一定要知道你买了一个什么。 大多数的开源手机都是一个ARM64的主板,基于Linux操作系统定制的开源系统。 而Linux操作系统是几乎没法运行iOS或者Android的手机软件的(当然Android模拟器是一个选择,但是实在不算一个好选择,或许可以试试看这个:[https://anbox.io/)。](https://anbox.io/%EF%BC%89%E3%80%82) 而且同等配置下开源手机会更贵,道理也很简单,产量不够,系统开发,手机设计,开模的成本分摊到每一个手机上就更高。 80 | 81 | 但是另一个角度来说,你失去了手机的软件,但是你获得了几乎所有电脑端的软件,你的手机可以运行Python,GCC,乃至几乎任何能在你的桌面端Linux跑起来的软件(只要内存够)。 82 | 83 | 作为在中国使用的手机,可能绕不过去微信,QQ等软件,选开源手机基本意味着智商税,但是如果你需要一个备用机,或者你是一个开发人员(或者运维),用手机可以在出差或者旅游的时候解决一些问题的话,可以买一个,就当买一个超小型电脑,而且Telegram,Twitter,Mastodon之类的服务都可以照常使用,娱乐问题也不大。 84 | 85 | ## 如何选择手机 86 | 87 | * 不愿意折腾的,或者没有技术折腾的,选iPhone。 88 | * 能翻墙的,选原生Android机(Google Pixel这样的),或者能刷成原生Android/其它你能控制的纯净一些的Android系统的手机。 89 | * Linux开源手机不适合在中国日常使用,但是可以作为备用机。 90 | 91 | 顺便一提,我很期待Windows的手机(虽然期待Windows的手机,但是我对Windows的印象仍然很差,尤其是强制更新这一项),Windows应用商店生态能够勉强支撑日常使用,如果ARM能够高效转译执行x86的指令集的话,生态上就是无敌的存在了。 92 | -------------------------------------------------------------------------------- /spam/workers-interview.md: -------------------------------------------------------------------------------- 1 | # 访谈:为什么毛泽东时代工人的积极性很高? 2 | 3 | [原文链接](https://zhuanlan.zhihu.com/p/153060273) 4 | 5 | 按:工人阶级在毛泽东时代有极其高昂的生产热情,他们对工厂的热爱、对生产的热情甚至到了我们现在无法相信的地步。比如他们会主动申请义务劳动,不要任何报酬;如果领导安排义务劳动没有安排到他,他会觉得这是领导看不起他,心里面会非常不舒服。又比如有些工人为了抢任务,会连续工作24小时,领导拉都拉不走。在主流的观点看来,这种热情是一种畸形的、违反人性的热情,这种热情的出现就是一种错误。那么事实的情况又是怎么样的呢?如此高昂的生产热情究竟是怎么产生的呢? 6 | 7 | 8 | 我为了搞清楚这个问题,走访了数位毛泽东时代的老工人,通过访谈我形成了一个初步的结论:高昂的生产热情之所以能够产生,是因为工人真真正正的感受到了自己是工厂的主人;这种主人的地位并不仅仅是体现在口头上或法律文件上,而是渗透到了生产、生活的方方面面。下面是我们之间的访谈记录。 9 | 问:我接触过一些老工人,那些工人在提到毛泽东时代的时候都很感慨。常常说当时的工人是爱厂如家,所以生产热情非常高,而现在的工人对工厂没得任何感情得。我想问,当时的工人为什么会对工厂产生这种感情呢? 10 | 罗师傅:小李,你这个问题问得很好。这个世界上没得无缘无故的爱,也没得无缘无故的恨。我们为什么会爱厂如家,原因很多,但我认为首先是因为这个厂关心工人。当时的厂对工人的关心可以说是到了无微不至的程度。 11 | 12 | 13 | 举个例子来说,我是58年之后参加工作的。工作没得好久,有一次家里面来信,说我爸爸身体不好,现在家里面很困难。我当时也没有给厂里面说,但是在私下给朋友说话的时候说漏嘴了。过了一段时间,家里面来信说收到了50块钱,我都不晓得是怎么一回事。后来我问领导,才晓得是工会寄的。 14 | 罗师傅正准备往下说,黎师傅打断了他的话。黎师傅是退休干部,以前在团委和工会都干过。黎师傅说:小李,当时工会领导那真的是把工人的利益装在心里面的。当时每个班组都有一个工会小组长,他负责了解班组工人的情况。方方面面的情况都要了解:家里面困不困难?爱人是干什么的?小孩是否该上学了?最近有什么状况等等。班组把情况汇总到车间一级的工会,车间再把情况汇总到厂工会。所以说工会对整个厂里面所有工人的情况、困难那是一目了然,一旦出了问题马上就给你解决了。他甚至都不用你来说,自己主动就给你解决了。举个例来说,凡职工生病请病假3天以上的,工会领导就必须要去关心。无微不至啊,就到了这种程度。 15 | 张师傅是厂里的处级干部,改革后在职工大学当校长。张师傅说:我给你举个例子,切身的体会。我55年的时候在一线当工人,得了胃病,经常去医院,很严重。当时袁景良是我们工会的劳保委员,他晓得了这个事情,就提名让我去疗养。单位就送我去疗养所疗养了50天,疗养所的伙食非常好,标准是21块/月,我自己只出9块钱。疗养了之后我的胃病基本上就好了,到现在都没有犯过。 16 | 你问我为什么工厂会这么关心工人?道理很简单,因为我们是工厂的主人。 17 | 问:我还有一个问题想问一下。比如现在,很多干部最初也是很优秀的,但他们后来就慢慢变质了,开始搞贪污腐败。那当时出现这个问题怎么办呢?也就是说怎么防止优秀的人变质呢? 18 | 19 | 20 | 周师傅自己有当领导被群众检举的经历。周师傅说:当时的贪污腐败很少,各方面的原因都有。比如当时对现金的管理很严格,30块钱以上不能使用现金,只能使用支票,这就让你贪起来很困难。再比如当时人们思想觉悟很高,觉得贪污是很可耻的一件事情,使得你自己就不愿意去贪。现在完全搞反了,贪得越多觉得你越能干。 21 | 另外还有一个很重要的原因,就是群众的监督很厉害。当时所有账目都要张榜公布,任何人都可以查。我在电力系统的领导岗位,在文革的时候我管经济。当时我经手一笔款子,8万多,有3角7分钱对不上帐。就因为这么一个事情,我被人检举,上面派了7个人来查我的经济,前前后后查了半年多时间。最后终于搞清楚了原因,不是我贪污,而是账记错了,所以给我定了一个“贪污行为不按贪污论处”。当时的群众监督就能严到这种程度,你说还有哪个敢贪。 22 | 梁师傅:毛主席说过:真正的铜墙铁壁是人民群众。当时干部和群众是住在一块的,干部家里面是什么情况群众都晓得。所以没得人敢贪,群众把你盯着的,一有任何问题马上就检举你。工人的检举途径也很多,可以写大字报、小字报,可以直接找党委书记反映。还有就是当时每个月有一次民主生活会,你可以在上面给领导提意见。而且他还拿你没得法,因为领导是没得权力开除工人的。 23 | 比如说我们厂的副厂长利用权力给自己分了一套房子,群众在民主生活会的时候反映到党委,结果这个人被党内严重警告处分,房子退回,级别从副厅级降到副处级。 24 | 张师傅是厂里的处级干部,改革后在职工大学当校长。张师傅说:我说一点个人的看法,和他们的认识有一些出入。我认为要分两个方面来看,第一、当时对领导的监督还解决得不够好;第二、由于工人敢用大鸣大放来监督领导,所以这个监督问题比现在解决得好得多。我说不够好是因为当时有些领导滥用权利的问题没有得到解决,比如我们厂的领导杨××,他喜欢在背后用小动作整人,这就明显是乱用权力。文革的时候群众写大字报揭露他的问题,后来他就被群众批判了,批判了之后整个作风大大改变。呵呵,不过改革开放之后老毛病又犯了。 25 | 26 | 27 | 范师傅70多岁,是全国劳模。范师傅说:小李,我还想给你说一点,要理解什么是主人,就要理解什么是奴隶。主人的对立面就是奴隶,奴隶的主人是不信任奴隶的,怕他们偷懒,所以随时都拿着皮鞭抽打他们,强迫他们工作,根本不把他们当人,只把他们当会说话的工具。 28 | 说得难听点,现在的工人就是这样。领导和工人处于一个完全对立的状况,工人在一线干活累得半死,领导在办公室吹空调。工人稍微不随自己的心意就破口大骂,动不动就克扣工资。在工厂里面工人没得半点说话的权利,你能做的就只有服从,除了服从还是服从。你说,这不是奴隶是什么? 29 | 以前可不是这样,当时提倡鞍钢宪法,充分的相信群众的自主性,让工人以主人翁的态度去干活,而不是厂长拿着棍棒驱使工人去干活。当时是干部带头参加劳动,以此带动群众的生产积极性。比如我们厂,副处级以下干部基本上所有时间都在生产一线,干的活比工人还多。正处级以上的干部每个礼拜五都要参加劳动,还要向工人拜师学艺。当时干部参加劳动那是真的在劳动哟,我就听说过有些车间的主任、书记亲自上一线结果中暑晕倒的。 30 | 当时还提倡让群众提合理化建议。我们厂还专门设立了机械化车间去实施工人提出来的合理化建议。当时工人一共提出了4万多条建议,最后根据这些建议做出了400多项技术革新。现在呢?领导根本看不起工人,他觉得技术革新是技术员的事情,你工人不配提意见。 31 | 张师傅:当时的工人在生产过程中也处于一个主人翁的地位。就拿生产任务的制定来说,现在生产任务的制定都是厂长说了算,当时可不是这样。一个生产任务下来了,厂里面下到车间,车间下到班组,班组传达到每个工人。然后让工人讨论,看应该怎样完成这个生产任务,如果觉得这个生产任务规定得不合适,工人就提意见让上面修改生产任务。比如有一次一个生产任务下去了,让一个工人轧了碳素钢马上轧锋钢,工人觉得这种生产任务安排不合理,于是提出意见,后来就把生产任务修改了。 32 | 如果提了意见上面不听怎么办?那工人就可以继续提意见、可以去闹,你当官的把他没得办法,因为你没得开除工人的权力。当时有句俗话:你当10年官,我11年都不犯法,你把我没得办法。我给你举个例子。当时碳素钢钢锭出来之后,为了保证钢的质量,按照操作规程,要切掉1.5%的量。后来我们在实践过程中发现,只切掉1%的量也能够保证质量。这样每吨钢锭就可以多出0.5%的钢材。我当时在团总支任生产委员,就和另外一个工人一起向上面反映这个问题。结果车间和厂里面都不支持我们,说这个东西是苏联专家定的,不能改。我们就和上面顶着干,连续几百次违反苏联专家定的操作规程,只切1%的量。结果厂里面拿我们也没得办法,因为我们没出任何质量问题。后来我们把问题反映到冶金部,冶金部的让我们把实验数据交了上去,最后冶金部批下来同意了这种操作方法。 33 | 周师傅:工人为社么觉得自己是主人,还有一个很重要的原因,工人和干部的待遇是差不多的。以吃粮为例,当时根据工种定粮。困难时期我在市委工作,当时市委干部是21斤粮,工人普遍比干部多,某些工种能到50斤粮。 34 | 梁师傅:有一次我们单位发奖金,干部奖金是4块钱,炼钢工人的奖金是6块钱。由此可见,当时的干部才真正是人民的公仆、人民的勤务员。那个时候当干部只有多做事的,干得不比工人少,拿得不比工人多。当然,你问我们工资有没有差异,也有差异,但是这个差异很小。 35 | 张师傅:你说工人和干部的工资有没有差距呢?这也有差距,但这个差距小,很多工人的工资比干部还高。我们厂里面有一个8级钳工叫李孟虎,工资待遇相当于县级干部的收入。他一个人的工资就够全家人生活,而且还生活得很好。他有8个小孩,后来这些小孩有上中专的,也有上大学的,很有出息。你想想现在,你一个工人的工资能够养活8个小孩?还要读书哟!根本不可能。 36 | 问:毛时代每个人能够得到的物资那么匮乏,为什么小偷小摸的利己现象反而很少呢?为什么到了80年代改革开放了,物质财富丰富了,消极怠工的现象反而越来越厉害了?工人为什么会偷懒呢?西方经济学有一个观点叫做“公有地的悲剧”,或者“搭便车”,来形容出工不出力的社会情况。在毛时代,工人们中间有“搭便车”的情况吗?如果有,那么是用什么样的方法对待的呢? 37 | 老工人李师傅:拿我们钢厂为例。承包以后,那个厂长想给大家发奖金想刺激工人干活,可工人一看,你那七大姑子八大姨都成了领导了,这些人一起挖社会主义墙角,工人干脆不干了。工人丧失了主人公地位,他不认为是在给自己的厂子干了,这是你厂长的厂子,你厂长想拿多少就拿多少,所以工人都不愿意干了、消极怠工。资产阶级就借着这个污蔑工人阶级“大锅饭、养懒汉”。 38 | 偷懒是厂长承包制以后。你厂长一承包,七大姑八大姨都发财了,每年拿几十万的奖金,工人一个月才一二百块钱,工人生气咧,所以磨洋工。这与计划经济没一点关系。他把自己犯的错误强加到计划经济、工人头上去了。 39 | 一位老工人:毛泽东时代工人们受的教育就是要大公无私,所以大家的思想都很好,私心不重,再说,厂子是工人自己的,不会去偷的。当时也有“搭便车”的,不过是极个别人,通常大家都会对他进行批评教育,一般都能改正。那时对小偷小摸的现象定性是很严重的,谁要是偷拿工厂东西,大家都会很看不起他,舆论压力很大,并且厂里也要严肃处理。 40 | 改革开放后,所有制的变化把人的私心都给挖出来了。主流媒体都是在告诉人们如何赚钱发家,整个社会的价值观都发生了变化,金钱至上。从上层领导就开始多拿多占,所以工人小偷小摸的现象多了。 41 | 毛泽东时代普通工人也可以参加技改和管理工作,有专门的实验室供工人从事技改活动,虽然学历低,但在实践中也是能有所创新的。工人们都是主动参与技改和管理工作,主动参加义务劳动,不让他参加他才不乐意呢。那时候要的是荣誉。现在你给人家钱,人家都不干。” 42 | 常师傅是××针织厂的老党委书记。常师傅说:共产党的最高宗旨是消灭私有制。过去,工人真正是工厂的主人,现在工人沦为雇佣工人。纺织局局长李**,原来是纱厂厂长,纱厂产品为生产原料,不可能卖不出去,他把纱厂搞破产后,转为私人,2600名工人成为雇佣工,供其榨取劳动剩余价值。80年代有一些烟厂的工人,会把烟塞到饭盒里带回家,但如今的奴隶地位决定了这种小偷小摸的现象会有增无减。 43 | -------------------------------------------------------------------------------- /ssh_config: -------------------------------------------------------------------------------- 1 | Host github.com 2 | User git 3 | Hostname github.com 4 | PreferredAuthentications publickey 5 | Compression yes 6 | StrictHostKeyChecking no 7 | UserKnownHostsFile /dev/null 8 | IdentityFile ~/.ssh/id_rsa_github --------------------------------------------------------------------------------