├── docs
├── public
│ ├── qrcode.png
│ ├── favicon.jpg
│ ├── favicon.png
│ ├── thumbnail.jpg
│ ├── mianfeiwucan-alipay.png
│ ├── mianfeiwucan-sina.png
│ ├── mianfeiwucan-weixin.png
│ └── analytic.js
├── weekly
│ ├── index.md
│ ├── issue-311.md
│ ├── issue-5.md
│ ├── issue-8.md
│ ├── issue-247.md
│ └── issue-82.md
├── .vitepress
│ ├── theme
│ │ ├── index.js
│ │ └── MyLayout.vue
│ └── config.js
└── index.md
├── vercel.json
├── scripts
├── build-hook.sh
├── main.sh
└── weekly.js
├── .github
└── workflows
│ └── weekly-deploy.yml
├── package.json
├── LICENSE
├── .gitignore
├── README.md
└── actions.txt
/docs/public/qrcode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/plantree/ruanyf-weekly/HEAD/docs/public/qrcode.png
--------------------------------------------------------------------------------
/docs/public/favicon.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/plantree/ruanyf-weekly/HEAD/docs/public/favicon.jpg
--------------------------------------------------------------------------------
/docs/public/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/plantree/ruanyf-weekly/HEAD/docs/public/favicon.png
--------------------------------------------------------------------------------
/docs/public/thumbnail.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/plantree/ruanyf-weekly/HEAD/docs/public/thumbnail.jpg
--------------------------------------------------------------------------------
/docs/weekly/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: weekly/issue-246
3 | titleTemplate: false
4 | ---
5 | 这里记录每周值得分享的科技内容,周五发布。
--------------------------------------------------------------------------------
/docs/public/mianfeiwucan-alipay.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/plantree/ruanyf-weekly/HEAD/docs/public/mianfeiwucan-alipay.png
--------------------------------------------------------------------------------
/docs/public/mianfeiwucan-sina.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/plantree/ruanyf-weekly/HEAD/docs/public/mianfeiwucan-sina.png
--------------------------------------------------------------------------------
/docs/public/mianfeiwucan-weixin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/plantree/ruanyf-weekly/HEAD/docs/public/mianfeiwucan-weixin.png
--------------------------------------------------------------------------------
/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "cleanUrls": true,
3 | "framework": "vitepress",
4 | "installCommand": "npm install",
5 | "buildCommand": "bash ./scripts/main.sh && npm run build",
6 | "outputDirectory": "docs/.vitepress/dist"
7 | }
--------------------------------------------------------------------------------
/scripts/build-hook.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | function add_thumbnail() {
3 | files=`ls . | grep .html`
4 | for file in ${files[@]}
5 | do
6 | sed -i '/
/a\
' ${file}
7 | done
8 | }
9 |
10 | cd ./docs/.vitepress/dist
11 | add_thumbnail
12 |
13 | cd weekly
14 | add_thumbnail
--------------------------------------------------------------------------------
/docs/.vitepress/theme/index.js:
--------------------------------------------------------------------------------
1 | // .vitepress/theme/index.js
2 |
3 | // You can directly import Vue files in the theme entry
4 | // VitePress is pre-configured with @vitejs/plugin-vue.
5 | import DefaultTheme from 'vitepress/theme'
6 | import MyLayout from './MyLayout.vue'
7 |
8 | export default {
9 | ...DefaultTheme,
10 | // override the Layout with a wrapper component that
11 | // injects the slots
12 | Layout: MyLayout
13 | }
--------------------------------------------------------------------------------
/docs/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: home
3 |
4 | title: 阮一峰的技术周刊
5 | titleTemplate: 小站
6 |
7 | hero:
8 | name: 阮一峰的技术周刊
9 | text: 科技, 分享, 开源
10 | tagline: 官方链接:https://www.ruanyifeng.com/blog/
11 | actions:
12 | - theme: brand
13 | text: Get Started
14 | link: /weekly/
15 | - theme: alt
16 | text: View on GitHub
17 | link: https://github.com/plantree/ruanyf-weekly
18 |
19 | features:
20 | - title: 及时更新
21 | details: GitHub Action 定时爬取最新文章
22 | - title: 收录全面
23 | details: 涵盖所有历史文章并按日期分类
24 | - title: 移动端适配
25 | details: 强大的 VitePress 保证可访问性
26 | - title: 搜索友好
27 | details: Algolia 提供底层搜索能力
28 | ---
29 |
--------------------------------------------------------------------------------
/scripts/main.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -x
4 |
5 | curl -s -L -O https://github.com/ruanyf/weekly/archive/refs/heads/master.zip
6 | unzip -o master.zip
7 | rm master.zip*
8 | node scripts/weekly.js > scripts/weekly.json
9 | cp -n ./weekly-master/docs/issue*.md ./docs/weekly/
10 | cd ./docs/weekly/
11 | # add pv to markdown / replace link
12 | files=`ls . | grep issue`
13 | for file in ${files[@]}
14 | do
15 | sed -i '/# 科技爱好者周刊/a\
\n' ${file}
16 | sed -i 's/\(http\|https\):\/\/www.ruanyifeng.com\/blog\/.*issue-\([0-9]\+\)\.html/.\/issue-\2/' ${file}
17 | done
18 |
--------------------------------------------------------------------------------
/.github/workflows/weekly-deploy.yml:
--------------------------------------------------------------------------------
1 | name: "weekly deploy"
2 | on:
3 | push:
4 | branches:
5 | - main
6 | schedule:
7 | # friday 08:00, scheduler has delay
8 | - cron: "59 23 * * 4"
9 | - cron: "12 00 * * 5"
10 |
11 | jobs:
12 | build:
13 | runs-on: ubuntu-latest
14 | steps:
15 | - uses: actions/checkout@v3
16 | - name: Update
17 | run: |
18 | date "+%Y-%m-%d %H:%M:%S" >> actions.txt
19 | today=`date +"%Y-%m-%d"`
20 | git config user.name github-actions
21 | git config user.email github-actions@github.com
22 | git pull
23 | git add .
24 | git commit -m "[${today}] done"
25 | git push
26 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ruanyf-weekly",
3 | "version": "1.0.0",
4 | "description": "VitePress构建阮一峰的技术周刊",
5 | "type": "module",
6 | "main": "index.js",
7 | "directories": {
8 | "doc": "docs"
9 | },
10 | "scripts": {
11 | "dev": "vitepress dev docs",
12 | "build": "vitepress build docs; bash ./scripts/build-hook.sh",
13 | "preview": "vitepress preview docs"
14 | },
15 | "repository": {
16 | "type": "git",
17 | "url": "git+https://github.com/plantree/ruanyf-weekly.git"
18 | },
19 | "author": "plantree",
20 | "license": "MIT",
21 | "bugs": {
22 | "url": "https://github.com/plantree/ruanyf-weekly/issues"
23 | },
24 | "homepage": "https://github.com/plantree/ruanyf-weekly#readme",
25 | "devDependencies": {
26 | "vitepress": "1.0.0-rc.44",
27 | "vue": "^3.2.47"
28 | },
29 | "dependencies": {
30 | "@giscus/vue": "^2.2.8",
31 | "@vercel/analytics": "^1.0.1"
32 | }
33 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 plantree
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/scripts/weekly.js:
--------------------------------------------------------------------------------
1 | import fs from 'fs';
2 | import path from 'path';
3 |
4 | const pattern = new RegExp('issue\-([0-9]+)');
5 |
6 | function fsm(content) {
7 | const lines = content.split('\n');
8 | const meta = {};
9 | let yearStatus = null;
10 | let monthStatus = null;
11 | let i = 0;
12 | while (i < lines.length) {
13 | const line = lines[i];
14 | if (line.startsWith('## 20')) {
15 | const year = line.slice(3);
16 | meta[year] = {};
17 | yearStatus = year;
18 | } else if (line.includes('月')) {
19 | const month = line.replaceAll('*', '').trim();
20 | meta[yearStatus][month] = [];
21 | monthStatus = month;
22 | } else if (line.startsWith('- 第')) {
23 | const title = line.slice(line.indexOf('[') + 1, line.indexOf(']'));
24 | const issueNo = pattern.exec(line)[0];
25 | meta[yearStatus][monthStatus].push([title, issueNo]);
26 | }
27 | i++;
28 | }
29 | return meta;
30 | }
31 |
32 | function parseWeeklyReadme(dir) {
33 | const files = fs.readFileSync(path.join(dir, 'README.md'));
34 | return fsm(files.toString());
35 | }
36 |
37 | // console.log(pattern.exec('- 第 244 期:[大数据已死](docs/issue-244.md)'));
38 | let meta = parseWeeklyReadme('./weekly-master');
39 | console.log(JSON.stringify(meta));
--------------------------------------------------------------------------------
/docs/.vitepress/theme/MyLayout.vue:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
10 |
11 |
18 |
19 |
33 |
34 |
35 |
36 |
37 |
38 |
60 |
61 |
89 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # TypeScript v1 declaration files
45 | typings/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 |
78 | # Next.js build output
79 | .next
80 |
81 | # Nuxt.js build / generate output
82 | .nuxt
83 | dist
84 |
85 | # Gatsby files
86 | .cache/
87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js
88 | # https://nextjs.org/blog/next-9-1#public-directory-support
89 | # public
90 |
91 | # vuepress build output
92 | .vuepress/dist
93 |
94 | # Serverless directories
95 | .serverless/
96 |
97 | # FuseBox cache
98 | .fusebox/
99 |
100 | # DynamoDB Local files
101 | .dynamodb/
102 |
103 | # TernJS port file
104 | .tern-port
105 |
106 | # vitepress
107 | cache/
108 | issue*.md
109 | !issue-5.md
110 | !issue-8.md
111 | !issue-82.md
112 | !issue-247.md
113 | !issue-311.md
114 | scripts/*.json
115 | .env
116 | *.json
117 | !vercel.json
118 | !package.json
119 | !package-lock.json
120 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ruanyf-weekly
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | > 声明: 非官方!!!官网链接在https://www.ruanyifeng.com/blog/
10 |
11 | 网站地址在:https://ruanyf-weekly.plantree.me/
12 |
13 | #### 一. 背景
14 |
15 | 个人平时比较喜欢看阮一峰老师的技术周刊,文笔简练,条理清晰。
16 |
17 | 但也遇到了一些问题:
18 |
19 | - 缺少一个跨端且友好的统一阅读入口
20 |
21 | - 检索能力较欠缺
22 |
23 | #### 二. 构建
24 |
25 | 因为阮一峰老师的技术周刊本身是开源的,因此可基于这些内容,利用现成的工具,重新构建一个静态网站,并借助CI实现部署自动化,同时对文本增加检索能力。
26 |
27 | - 页面构建采用了VitePress
28 |
29 | - 网站部署在Vercel
30 |
31 | - 定时构建采用了GitHub Action
32 |
33 | - 搜索引擎使用Algolia
34 |
35 | #### 三. 本地启动
36 |
37 | - 安装依赖:`npm i`
38 |
39 | - 爬取周刊:`./script/main.sh`
40 |
41 | - 启动:`npm run docs:dev`
42 |
43 |
44 | #### 四. Vercel部署
45 |
46 | [](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fplantree%2Fruanyf-weekly&install-command=npm%20install&build-command=bash%20.%2Fscripts%2Fmain.sh%20%26%26%20npm%20run%20docs%3Abuild&output-directory=docs%2F.vitepress%2Fdist)
47 |
48 | #### Changelog
49 |
50 | ##### 2023.05.15
51 |
52 | ###### Features
53 |
54 | - 增加移动端阅读二维码入口(感谢@[terminalqo](https://github.com/terminalqo))
55 |
56 | ##### 2023.04.12
57 |
58 | ###### Bug Fixes
59 |
60 | - 去除GitHub Action无效的push触发
61 |
62 | ###### Features
63 |
64 | - 增加discord
65 |
66 | ##### 2023.04.10
67 |
68 | ###### Features
69 |
70 | - 一键部署到Vercel(感谢@[chaos-zhu](https://github.com/chaos-zhu))
71 | - 增加公益捐赠(免费午餐)
72 |
73 | ##### 2023.03.27
74 |
75 | ###### Bug Fixes
76 |
77 | - 定期更新时间改为周五
78 | - Giscus适配dark-mode
79 | - Giscus跟随路由跳转而更新
80 |
81 | ###### Features
82 |
83 | - NavBar增加周报title
84 |
85 | ##### 2023.03.23
86 |
87 | ###### Features
88 |
89 | - VitePress构建静态页面,并部署到Vercel
90 | - 接入Algolia
91 | - GitHub Action周级构建
92 | - 接入Giscus,增加评论
93 |
94 | #### 公益捐赠(免费午餐)
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 | #### 参考
103 |
104 | 1. https://www.ruanyifeng.com/blog/
105 | 1. https://giscus.app/zh-CN
106 | 1. http://www.mianfeiwucan.org/
107 |
108 |
--------------------------------------------------------------------------------
/docs/public/analytic.js:
--------------------------------------------------------------------------------
1 | !function () { "use strict"; !function (t) { var e = t.screen, n = e.width, r = e.height, a = t.navigator.language, i = t.location, o = t.localStorage, u = t.document, c = t.history, s = i.hostname, f = i.pathname, l = i.search, d = u.currentScript; if (d) { var m = "data-", p = d.getAttribute.bind(d), v = p(m + "website-id"), h = p(m + "host-url"), g = "false" !== p(m + "auto-track"), b = p(m + "do-not-track"), y = p(m + "domains") || "", S = y.split(",").map((function (t) { return t.trim() })), k = (h ? h.replace(/\/$/, "") : d.src.split("/").slice(0, -1).join("/")) + "/api/send", j = n + "x" + r, w = /data-umami-event-([\w-_]+)/, N = m + "umami-event", T = 300, A = function (t, e, n) { var r = t[e]; return function () { for (var e = [], a = arguments.length; a--;)e[a] = arguments[a]; return n.apply(null, e), r.apply(t, e) } }, x = function () { return { website: v, hostname: s, screen: j, language: a, title: M, url: I, referrer: J } }, E = function () { return o && o.getItem("umami.disabled") || b && function () { var e = t.doNotTrack, n = t.navigator, r = t.external, a = "msTrackingProtectionEnabled", i = e || n.doNotTrack || n.msDoNotTrack || r && a in r && r[a](); return "1" == i || "yes" === i }() || y && !S.includes(s) }, O = function (t, e, n) { n && (J = I, (I = function (t) { return "http" === t.substring(0, 4) ? "/" + t.split("/").splice(3).join("/") : t }(n.toString())) !== J && setTimeout(K, T)) }, D = function (t, e) { if (void 0 === e && (e = "event"), !E()) { var n = { "Content-Type": "application/json" }; return void 0 !== L && (n["x-umami-cache"] = L), fetch(k, { method: "POST", body: JSON.stringify({ type: e, payload: t }), headers: n }).then((function (t) { return t.text() })).then((function (t) { return L = t })) } }, K = function (t, e) { return D("string" == typeof t ? Object.assign({}, x(), { name: t, data: "object" == typeof e ? e : void 0 }) : "object" == typeof t ? t : "function" == typeof t ? t(x()) : x()) }; t.umami || (t.umami = { track: K, identify: function (t) { return D(Object.assign({}, x(), { data: t }), "identify") } }); var L, P, _, q, C, I = "" + f + l, J = u.referrer, M = u.title; if (g && !E()) { c.pushState = A(c, "pushState", O), c.replaceState = A(c, "replaceState", O), C = function (t) { var e = t.getAttribute.bind(t), n = e(N); if (n) { var r = {}; return t.getAttributeNames().forEach((function (t) { var n = t.match(w); n && (r[n[1]] = e(t)) })), K(n, r) } return Promise.resolve() }, u.addEventListener("click", (function (t) { var e = t.target, n = "A" === e.tagName ? e : function (t, e) { for (var n = t, r = 0; r < e; r++) { if ("A" === n.tagName) return n; if (!(n = n.parentElement)) return null } return null }(e, 10); if (n) { var r = n.href, a = "_blank" === n.target || t.ctrlKey || t.shiftKey || t.metaKey || t.button && 1 === t.button; if (n.getAttribute(N) && r) return a || t.preventDefault(), C(n).then((function () { a || (i.href = r) })) } else C(e) }), !0), _ = new MutationObserver((function (t) { var e = t[0]; M = e && e.target ? e.target.text : void 0 })), (q = u.querySelector("head > title")) && _.observe(q, { subtree: !0, characterData: !0, childList: !0 }); var $ = function () { "complete" !== u.readyState || P || (K(), P = !0) }; u.addEventListener("readystatechange", $, !0), $() } } }(window) }();
--------------------------------------------------------------------------------
/docs/.vitepress/config.js:
--------------------------------------------------------------------------------
1 | import { fileURLToPath, URL } from 'node:url'
2 | import { defineConfig } from 'vitepress'
3 | import fs from 'fs'
4 | import path from 'path'
5 |
6 | export default defineConfig({
7 | ignoreDeadLinks: true,
8 | title: 'ruanyf-weekly',
9 | description: '阮一峰的技术周刊',
10 | lastUpdated: true,
11 | cleanUrls: true,
12 | lang: 'zh-CN',
13 | head: [
14 | ['link', { rel: "icon", type: "image/png", href: "/favicon.png" }],
15 | ['script', {
16 | src: '/_vercel/insights/script.js', defer: ''
17 | }],
18 | ['script', {
19 | src: '/analytic.js', defer: '',
20 | 'data-website-id': 'd49602a4-673c-4b6f-b2ca-8e5c2b358850',
21 | 'data-host-url': "https://api.counter.plantree.me/umami"
22 | }],
23 | ['meta', { name: 'theme-color', content: '#3c8772' }],
24 | ['meta', { property: 'og:type', content: 'website' }],
25 | ['meta', { property: 'og:title', content: '阮一峰的技术周刊 | 小站' }],
26 | ['meta', { property: 'og:description', content: '科技, 分享, 开源' }],
27 | ['meta', { property: 'og:image', content: 'https://ruanyf-weekly.plantree.me/thumbnail.jpg' }],
28 | ['meta', { property: 'og:url', content: 'https://ruanyf-weekly.plantree.me/' }],
29 | // google analytics
30 | ['script', { async: true, src: 'https://www.googletagmanager.com/gtag/js?id=G-2QFP04Q1TY' }],
31 | ['script', {}, `window.dataLayer = window.dataLayer || [];
32 | function gtag(){dataLayer.push(arguments);}
33 | gtag('js', new Date());
34 |
35 | gtag('config', 'G-2QFP04Q1TY');`],
36 | ],
37 | markdown: {
38 | headers: {
39 | level: [0, 1]
40 | }
41 | },
42 | themeConfig: {
43 | nav: [
44 | {
45 | text: '阮一峰的网络日志',
46 | link: 'http://www.ruanyifeng.com/blog/',
47 | },
48 | {
49 | text: '技术周刊',
50 | link: 'https://github.com/ruanyf/weekly'
51 | },
52 | {
53 | text: '个人博客',
54 | link: 'https://plantree.me/'
55 | },
56 | {
57 | text: '移动端阅读',
58 | link: '/qrcode.png'
59 | }
60 | ],
61 | sidebar: {
62 | '/weekly/': sidebarWeekly(),
63 | },
64 | socialLinks: [
65 | { icon: 'github', link: 'https://github.com/plantree/ruanyf-weekly' },
66 | { icon: 'discord', link: 'https://discord.gg/ffRG4mWzFZ' }
67 | ],
68 | footer: {
69 | message: 'Released under the MIT License.',
70 | copyright: 'Copyright © 2023-present Plantree'
71 | },
72 | algolia: {
73 | appId: 'JMQN3OHTS2',
74 | apiKey: '9bb35b7fbb4b3ae36bb0f2ac9af77b5e',
75 | indexName: 'ruanyf-weekly',
76 | // https://docsearch.algolia.com/docs/api
77 | maxResultsPerGroup: 20
78 | },
79 | serach: {
80 | provider: 'local'
81 | }
82 | },
83 | });
84 |
85 | function _convertParseWeeklyReadme() {
86 | const content = fs.readFileSync('./scripts/weekly.json', 'utf8').toString()
87 | const tree = JSON.parse(content)
88 | const config = [];
89 | for (let year in tree) {
90 | const monthItems = [];
91 | for (let month in tree[year]) {
92 | const items = [];
93 | for (let issue of tree[year][month]) {
94 | items.push({
95 | text: issue[1].split('-')[1] + '期 | ' + issue[0],
96 | link: `/weekly/${issue[1]}`
97 | });
98 | }
99 | monthItems.push({
100 | text: month,
101 | collapsed: true,
102 | items: items
103 | });
104 | }
105 | config.push({
106 | text: year,
107 | collapsed: true,
108 | items: monthItems
109 | });
110 | }
111 | config.reverse();
112 | config[0].collapsed = false;
113 | config[0].items[0].collapsed = false;
114 | return config
115 | }
116 |
117 | function sidebarWeekly() {
118 | return _convertParseWeeklyReadme();
119 | }
--------------------------------------------------------------------------------
/actions.txt:
--------------------------------------------------------------------------------
1 | 2023-03-21 01:53:37
2 | 2023-03-22 01:53:03
3 | 2023-03-22 02:22:51
4 | 2023-03-23 01:59:23
5 | 2023-03-23 02:15:12
6 | 2023-03-25 17:06:23
7 | 2023-03-27 02:32:08
8 | 2023-03-27 02:41:43
9 | 2023-03-27 03:10:03
10 | 2023-03-31 02:03:28
11 | 2023-03-31 02:24:15
12 | 2023-04-04 01:33:54
13 | 2023-04-04 01:36:54
14 | 2023-04-07 01:34:57
15 | 2023-04-10 02:10:40
16 | 2023-04-10 02:14:47
17 | 2023-04-10 02:24:23
18 | 2023-04-10 03:49:04
19 | 2023-04-14 01:37:16
20 | 2023-04-20 23:20:58
21 | 2023-04-28 00:33:37
22 | 2023-05-05 00:30:23
23 | 2023-05-12 00:32:14
24 | 2023-05-19 00:32:48
25 | 2023-05-26 00:33:05
26 | 2023-06-02 00:37:38
27 | 2023-06-09 00:40:29
28 | 2023-06-16 00:38:06
29 | 2023-06-23 00:40:29
30 | 2023-06-30 00:39:37
31 | 2023-07-07 00:42:02
32 | 2023-07-14 00:42:17
33 | 2023-07-21 00:36:51
34 | 2023-07-28 00:34:32
35 | 2023-08-04 00:35:40
36 | 2023-08-11 00:27:46
37 | 2023-08-18 00:28:03
38 | 2023-08-25 00:28:36
39 | 2023-09-01 00:31:26
40 | 2023-09-08 00:28:41
41 | 2023-09-15 00:29:31
42 | 2023-09-22 00:29:48
43 | 2023-09-29 00:29:49
44 | 2023-10-06 00:29:56
45 | 2023-10-13 00:30:55
46 | 2023-10-20 00:30:04
47 | 2023-10-27 00:29:27
48 | 2023-11-03 00:30:14
49 | 2023-11-10 00:30:39
50 | 2023-11-17 00:31:46
51 | 2023-11-24 00:30:57
52 | 2023-12-01 00:35:25
53 | 2023-12-08 00:32:36
54 | 2023-12-15 00:32:45
55 | 2023-12-22 00:31:36
56 | 2023-12-29 00:26:04
57 | 2024-01-05 00:32:30
58 | 2024-01-12 00:32:48
59 | 2024-01-15 03:14:00
60 | 2024-01-19 00:00:07
61 | 2024-01-19 04:44:30
62 | 2024-01-25 01:39:29
63 | 2024-01-25 02:08:58
64 | 2024-01-26 00:00:08
65 | 2024-01-26 01:31:25
66 | 2024-02-02 00:00:00
67 | 2024-02-02 01:30:10
68 | 2024-02-02 08:45:30
69 | 2024-02-08 23:59:59
70 | 2024-02-09 01:19:34
71 | 2024-02-16 00:00:18
72 | 2024-02-16 01:20:21
73 | 2024-02-23 00:00:17
74 | 2024-02-23 01:19:32
75 | 2024-03-01 00:00:08
76 | 2024-03-01 01:32:06
77 | 2024-03-07 01:32:57
78 | 2024-03-08 00:00:05
79 | 2024-03-08 01:20:20
80 | 2024-03-15 00:00:19
81 | 2024-03-15 01:21:06
82 | 2024-03-22 00:00:16
83 | 2024-03-22 01:20:23
84 | 2024-03-28 23:59:57
85 | 2024-03-29 01:21:06
86 | 2024-04-05 00:00:03
87 | 2024-04-05 01:21:39
88 | 2024-04-12 00:00:09
89 | 2024-04-12 01:27:55
90 | 2024-04-19 00:00:00
91 | 2024-04-19 01:28:44
92 | 2024-04-25 23:59:59
93 | 2024-04-26 01:29:17
94 | 2024-05-03 00:00:13
95 | 2024-05-03 01:32:42
96 | 2024-05-09 06:21:23
97 | 2024-05-10 00:00:13
98 | 2024-05-10 01:31:55
99 | 2024-05-16 23:59:57
100 | 2024-05-17 01:32:41
101 | 2024-05-23 23:59:58
102 | 2024-05-24 01:33:25
103 | 2024-05-31 00:00:17
104 | 2024-05-31 01:35:29
105 | 2024-06-07 00:00:00
106 | 2024-06-07 01:37:35
107 | 2024-06-13 23:59:57
108 | 2024-06-14 01:36:24
109 | 2024-06-21 00:00:21
110 | 2024-06-21 01:35:35
111 | 2024-06-28 00:00:06
112 | 2024-06-28 01:37:39
113 | 2024-07-05 00:00:01
114 | 2024-07-05 01:37:19
115 | 2024-07-12 00:00:04
116 | 2024-07-12 01:38:09
117 | 2024-07-19 11:05:56
118 | 2024-07-25 02:49:49
119 | 2024-07-26 00:00:00
120 | 2024-07-26 01:39:10
121 | 2024-08-01 23:59:58
122 | 2024-08-02 01:40:01
123 | 2024-08-05 10:47:03
124 | 2024-08-05 10:49:40
125 | 2024-08-09 00:00:13
126 | 2024-08-09 01:43:00
127 | 2024-08-16 00:00:11
128 | 2024-08-16 01:41:33
129 | 2024-08-23 00:00:10
130 | 2024-08-23 01:42:33
131 | 2024-08-30 00:00:00
132 | 2024-08-30 01:46:34
133 | 2024-09-06 00:00:22
134 | 2024-09-06 01:47:00
135 | 2024-09-12 23:59:59
136 | 2024-09-13 01:48:31
137 | 2024-09-20 00:00:03
138 | 2024-09-20 01:50:10
139 | 2024-09-27 00:00:10
140 | 2024-09-27 01:53:06
141 | 2024-10-04 00:00:05
142 | 2024-10-04 01:53:10
143 | 2024-10-10 23:59:59
144 | 2024-10-11 01:52:10
145 | 2024-10-18 00:00:12
146 | 2024-10-18 01:53:52
147 | 2024-10-25 00:00:09
148 | 2024-10-25 01:54:10
149 | 2024-11-01 00:00:10
150 | 2024-11-01 02:01:41
151 | 2024-11-08 00:00:21
152 | 2024-11-08 01:51:55
153 | 2024-11-15 00:00:00
154 | 2024-11-15 01:59:13
155 | 2024-11-19 07:11:06
156 | 2024-11-22 00:00:16
157 | 2024-11-22 01:59:02
158 | 2024-11-29 00:00:04
159 | 2024-11-29 02:00:59
160 | 2024-12-06 00:00:11
161 | 2024-12-06 02:02:28
162 | 2024-12-13 00:00:14
163 | 2024-12-13 02:04:27
164 | 2024-12-19 23:59:58
165 | 2024-12-20 01:53:55
166 | 2024-12-27 00:00:07
167 | 2024-12-27 01:52:59
168 | 2025-01-03 00:00:01
169 | 2025-01-03 01:53:07
170 | 2025-01-10 00:00:05
171 | 2025-01-10 01:56:14
172 | 2025-01-17 00:00:03
173 | 2025-01-17 01:49:25
174 | 2025-01-23 23:59:58
175 | 2025-01-24 01:50:34
176 | 2025-01-31 00:00:02
177 | 2025-01-31 01:50:46
178 | 2025-02-07 00:00:10
179 | 2025-02-07 01:52:48
180 | 2025-02-14 00:00:06
181 | 2025-02-14 01:52:16
182 | 2025-02-21 00:00:04
183 | 2025-02-21 01:54:01
184 | 2025-02-28 00:00:01
185 | 2025-02-28 01:56:05
186 | 2025-03-07 00:00:07
187 | 2025-03-07 01:58:26
188 | 2025-03-13 02:12:49
189 | 2025-03-13 23:59:55
190 | 2025-03-14 01:57:40
191 | 2025-03-20 23:59:58
192 | 2025-03-21 02:00:57
193 | 2025-03-28 00:00:00
194 | 2025-03-28 02:00:59
195 | 2025-04-03 23:59:59
196 | 2025-04-04 02:01:26
197 | 2025-04-10 23:59:57
198 | 2025-04-11 02:03:11
199 | 2025-04-18 00:00:10
200 | 2025-04-18 02:01:02
201 | 2025-04-25 00:00:12
202 | 2025-04-25 02:06:07
203 | 2025-05-02 00:00:03
204 | 2025-05-02 02:10:36
205 | 2025-05-09 00:00:02
206 | 2025-05-09 02:14:01
207 | 2025-05-16 00:00:10
208 | 2025-05-16 02:16:02
209 | 2025-05-23 00:00:06
210 | 2025-05-23 02:15:07
211 | 2025-05-30 00:00:06
212 | 2025-05-30 02:14:21
213 | 2025-06-05 23:59:57
214 | 2025-06-06 02:16:56
215 | 2025-06-13 00:00:04
216 | 2025-06-13 02:19:27
217 | 2025-06-20 00:00:05
218 | 2025-06-20 02:18:47
219 | 2025-06-26 23:59:57
220 | 2025-06-27 02:20:47
221 | 2025-07-04 00:00:04
222 | 2025-07-04 02:20:07
223 | 2025-07-11 00:00:14
224 | 2025-07-11 02:26:21
225 | 2025-07-18 00:00:00
226 | 2025-07-18 02:29:07
227 | 2025-07-25 00:00:07
228 | 2025-07-25 02:28:39
229 | 2025-07-31 23:59:59
230 | 2025-08-01 02:43:21
231 | 2025-08-08 00:00:08
232 | 2025-08-08 02:32:42
233 | 2025-08-14 23:59:59
234 | 2025-08-15 02:22:41
235 | 2025-08-22 00:00:07
236 | 2025-08-22 02:07:20
237 | 2025-08-29 00:00:00
238 | 2025-08-29 02:02:38
239 | 2025-09-04 23:59:59
240 | 2025-09-05 01:59:45
241 | 2025-09-12 00:00:04
242 | 2025-09-15 01:28:52
243 | 2025-09-18 23:59:57
244 | 2025-09-19 02:00:48
245 | 2025-09-26 00:00:00
246 | 2025-09-26 01:59:55
247 | 2025-10-03 00:00:07
248 | 2025-10-03 01:57:34
249 | 2025-10-10 00:00:09
250 | 2025-10-10 02:00:05
251 | 2025-10-17 00:00:11
252 | 2025-10-17 02:01:25
253 | 2025-10-24 00:00:09
254 | 2025-10-24 01:59:08
255 | 2025-10-31 00:00:05
256 | 2025-10-31 02:07:43
257 | 2025-11-06 23:59:56
258 | 2025-11-07 02:12:29
259 | 2025-11-14 00:00:06
260 | 2025-11-14 02:14:47
261 | 2025-11-20 23:59:55
262 | 2025-11-21 02:10:37
263 | 2025-11-27 23:59:57
264 | 2025-11-28 02:08:03
265 | 2025-12-05 00:00:08
266 | 2025-12-05 02:18:54
267 | 2025-12-12 00:00:02
268 | 2025-12-12 02:22:27
269 | 2025-12-19 00:00:14
270 | 2025-12-19 02:22:05
271 |
--------------------------------------------------------------------------------
/docs/weekly/issue-311.md:
--------------------------------------------------------------------------------
1 | # 科技爱好者周刊(第 311 期):低利率与长期项目
2 |
3 | 这里记录每周值得分享的科技内容,周五发布。
4 |
5 | 本杂志[开源](https://github.com/ruanyf/weekly),欢迎[投稿](https://github.com/ruanyf/weekly/issues)。另有[《谁在招人》](https://github.com/ruanyf/weekly/issues/4911)服务,发布程序员招聘信息。合作请[邮件联系](mailto:yifeng.ruan@gmail.com)(yifeng.ruan@gmail.com)。
6 |
7 | ## 封面图
8 |
9 | 
10 |
11 | 武汉的东湖沙滩景区,新推出“水上漂浮电影院”。入夜后,观众坐在充气小船上,看水上电影。([via](https://www.ctdsb.net/c1676_202407/2201674.html))
12 |
13 | ## 低利率与长期项目
14 |
15 | 先说一个经济新闻。
16 |
17 | 上周四,[存款利率](https://news.cctv.com/2024/07/25/ARTIhvqjwDrS6c06tP2rH5gO240725.shtml)下调了,五年定期存款的年利率只有1.8%。
18 |
19 | 
20 |
21 | 这是一个标志,表明**现在进入了低利率时代**。
22 |
23 | 不仅银行存款的利率低,项目的回报率也变低了。
24 |
25 | 现在要找一个高回报的项目非常难,就算找到,风险也很大。社会的平均投资回报率,已经远远低于十年前。
26 |
27 | 从现在开始,大家都会慢慢适应低利率时代。以前那种高利率、高增长的情形,怕是很难再现了。
28 |
29 | 但是,低利率也有正面影响。今天我就想谈其中一个,至少可以让我们乐观一点看待未来。
30 |
31 | 那就是,**低利率会鼓励人们,重视长期项目**。
32 |
33 | 
34 |
35 | 长期项目的收益,主要来自遥远的未来,不像短期项目,收益主要来自眼前。
36 |
37 | 低利率环境下,会有更多人选择长期项目。原因是长期项目的未来收益,折算成现值会变多,即低利率使得未来收益与现在收益之间的差异变小了。
38 |
39 | 经济学家张五常就说过,低利率会鼓励更多的年轻人学医。医生是一个长期职业,前期很穷苦,收入微薄,要等到中年,收入才会稳步上升,然后一直保持到老年。
40 |
41 | **低利率会缩小,医生在学徒期的收入损失,而放大中年后的收入预期**。
42 |
43 | 下面是一篇我最近读到的[相关文章](https://fs.blog/long-game/),也是谈这个问题,解释长期项目胜过短期项目的另一个点,我觉得写得不错。
44 |
45 | > (1)这个世界上,大多数人都在玩短期游戏。如果你玩长期游戏,你会因此获得优势。
46 | >
47 | > (2)这是因为,如果你做其他人正在做的事情,回报应该跟其他人差不多,只能保证你获得平均结果,除非你很幸运。
48 | >
49 | > (3)要想获得高于其他人的回报,你要么做不同的事情,要么以不同的方式做事。
50 | >
51 | > (4)选择很少人玩的长期游戏,你更容易获得高于其他人的回报。这不是因为它更简单,事实上它更困难,但是你每天都投入去做困难的事情,会使得明天变得更容易。
52 | >
53 | > (5)长期游戏最困难的地方是第一步。你必须愿意承受当前的痛苦,才能让明天变得更容易一点。
54 | >
55 | > (6)在长期游戏中,你每天只能创造出一点微小的优势,它不明显但不意味着不存在。
56 | >
57 | > (7)你不能在所有事情上都进行长期游戏。你需要选择对你来说重要的事情,做一个长期规划,然后长期投入。
58 |
59 | ## 科技动态
60 |
61 | 1、[MO/GO 外骨骼](https://www.fastcompany.com/91159743/skip-and-arcteryx-built-an-amazing-new-exoskeleton-heres-what-its-like-to-walk-in-it)
62 |
63 | 一家美国创业公司,正式发售人体外骨骼产品 MO/GO,应该是世界第一个上市的同类产品。
64 |
65 | 
66 |
67 | 这个外骨骼绑在大腿上,由两部分组成,首先是一条运动裤,里面附有绑带。
68 |
69 | 
70 |
71 | 
72 |
73 | 其次是装在裤子外面的电机和电池。
74 |
75 | 
76 |
77 | 它不能代替你行走,但是可以在膝关节弯曲和舒张时,帮助你发力和回收。据该公司说,这个设备在上坡时特别有用,可以节省40%的体力。
78 |
79 | 
80 |
81 | 它一次充电,可以用三个小时。目前接受预订,明年初发货,售价为5000美元。
82 |
83 | 2、[钛心脏](https://newatlas.com/medical/maglev-titanium-heart-bivacor/)
84 |
85 | 一家美国公司推出了钛金属的人工心脏。
86 |
87 | 
88 |
89 | 它的内部有一个磁悬浮的转子泵,负责将血液送到两个心室。磁悬浮的优点是尽可能减少摩擦力,保证机械顺滑。
90 |
91 | 
92 |
93 | (图片说明:科研人员将塑料管插入钛心脏,模拟血管。)
94 |
95 | 钛心脏每分钟可以泵12升血液,足以满足人体需要。但是,它需要一个小型可充电的外部电机来驱动。
96 |
97 | 目前,它还做不到永久替代原生心脏,只能作为心脏移植前的缓解措施,病人最终还是需要移植他人的心脏。
98 |
99 | 3、[气泡屏障](https://www.cnn.com/2021/06/08/europe/bubble-barrier-sea-c2e-spc-intl/index.html)
100 |
101 | 越来越多的微塑料进入天然水系,由于颗粒太小,去除它们非常困难。
102 |
103 | 一家荷兰公司提出了一个聪明的方案。他们找了一个压缩机,出气管放在河底,就会形成不断的气泡涌向河面(下图的绿色部分)。
104 |
105 | 
106 |
107 | 由于气泡是定向的,就会带动河水里面的塑料颗粒,按照预定的方向,涌向预先设置的过滤区(上图的白色区域),从而实现拦截。同时,气泡的力度并不大,预计不会对鱼类造成影响。
108 |
109 | 
110 |
111 | 该公司已经在城市河道,做了一个简单实现(上图),确实有效。困难的地方在于,它的效率不高,很难天然河流里面大量部署。
112 |
113 | 4、**其他**
114 |
115 | (1)[广电总局](http://www.news.cn/house/20240731/04d279de8099430ab612269fe9c73304/c.html)要求,全面实现一个遥控器看电视,即机顶盒和电视机要合并遥控器。
116 |
117 | (2)[Windows Insider](https://blogs.windows.com/windows-insider/2024/07/25/ability-to-access-your-android-phone-in-file-explorer-begins-rolling-out-to-windows-insiders/) 现在可以直接读取安卓手机的文件系统。
118 |
119 | ## 文章
120 |
121 | 1、[任正非看剧](https://tech.ifeng.com/c/8baVzpu9VGf)(中文)
122 |
123 | 
124 |
125 | 本文收录了任正非在各种发言中,对不同电视剧的评价。
126 |
127 | 2、[微信小程序用户规模的 TOP50 榜单](https://finance.sina.com.cn/roll/2024-07-30/doc-incfxeue0009835.shtml)(中文)
128 |
129 | 
130 |
131 | 今年上半年月活(MAU)最大的50个微信小程序。
132 |
133 | 3、[证书颁发机构(CA)的通俗解释](https://www.pixelstech.net/article/1722045726-All-I-Know-About-Certificates----Certificate-Authority)(英文)
134 |
135 | 
136 |
137 | 本文用通俗语言,解释网站证书的工作原理。
138 |
139 | 4、[我爱上了 Makefile](https://gagor.pro/2024/02/how-i-stopped-worrying-and-loved-makefiles/)(英文)
140 |
141 | 
142 |
143 | 本文是一篇 Makefile 的初学者教程,介绍如何用它来简化和自动化日常的开发任务。
144 |
145 | 5、[DuckDB 操作 JSON 数据](https://www.pgrs.net/2024/03/21/duckdb-as-the-new-jq/)(英文)
146 |
147 | 
148 |
149 | DuckDB 是一个着重数据分析的数据库,作者发现它能方便地处理 JSON 数据,比 jq 更易用。
150 |
151 | 6、[Tunnelmole 入门](https://tunnelmole.com/)(英文)
152 |
153 | 
154 |
155 | Tunnelmole 是一个简单易用的隧道工具,不需要配置,只要一行命令,就让公网可以访问内网服务。
156 |
157 | 7、[Google 代码搜索的工作原理](https://swtch.com/~rsc/regexp/regexp4.html)(英文)
158 |
159 | 
160 |
161 | 谷歌曾经在2006年推出了代码搜索(上图),在2013年关闭。
162 |
163 | 
164 |
165 | 本文是该功能的作者2012年写的文章,介绍实现原理,如何用三元组搜索代码,还算好懂。
166 |
167 | ## 工具
168 |
169 | 1、[Zulip](https://github.com/zulip/zulip/)
170 |
171 | 
172 |
173 | 一个开源的群聊软件,有服务端和各种平台的客户端。
174 |
175 | 2、[win-vind](https://pit-ray.github.io/win-vind/)
176 |
177 | 
178 |
179 | 这个工具为 Windows 系统提供 Vim 风格的快捷键,也可以把它当作 Windows 的快捷键设定器。
180 |
181 | 3、[canvas-confetti](https://github.com/catdad/canvas-confetti)
182 |
183 | 
184 |
185 | 在网页上抛洒五彩纸屑的 JS 库。
186 |
187 | 4、[WR.DO](https://github.com/oiov/wr.do)
188 |
189 | 
190 |
191 | 一个开源的 Web 应用,通过 Cloudflare DNS API 进行操作,新建域名 wr.do 的子域名和短链接。([@oiov](https://github.com/ruanyf/weekly/issues/4901) 投稿)
192 |
193 | 5、[code-box](https://github.com/027xiguapi/code-box)
194 |
195 | 
196 |
197 | 一个开源的浏览器插件,用来解除 CSDN/知乎/脚本之家/博客园/博客园/51CTO博客等网站的限制(比如要求登录)。([@027xiguapi](https://github.com/ruanyf/weekly/issues/4877) 投稿)
198 |
199 | 6、[X File Storage](https://github.com/dromara/x-file-storage)
200 |
201 | 
202 |
203 | 一个 Java 软件包,用于文件上传,一行代码适配各种国内存储平台。([@1171736840](https://github.com/ruanyf/weekly/issues/4904) 投稿)
204 |
205 | 7、[php-nginx](https://github.com/lovefc/php-nginx)
206 |
207 | 
208 |
209 | 用 php 开发的类似 nginx 的 web 服务器,可用于学习。([@lovefc](https://github.com/ruanyf/weekly/issues/4906) 投稿)
210 |
211 | 8、[攒个钱](https://z.article.cool/)
212 |
213 | 
214 |
215 | 免费的手机记账 App,支持 iOS 和安卓。([@NeroSong](https://github.com/ruanyf/weekly/issues/4905) 投稿)
216 |
217 | 9、[StatiCrypt](https://github.com/robinmoisson/staticrypt)
218 |
219 | 
220 |
221 | 这个工具可以对网页加密,生成一个新网页。打开新网页需要输入一个密码,才能看到内容。
222 |
223 | 10、[screenshot.rocks](https://screenshot.rocks/)
224 |
225 | 
226 |
227 | 一个在线工具,可以为网页截图加上浏览器边框。
228 |
229 | ## AI 相关
230 |
231 | 1、[Luvvoice](https://luvvoice.com/)
232 |
233 | 
234 |
235 | 免费的在线文本转语音服务,提供各种语言的超过200种语音。([@huanwa](https://github.com/ruanyf/weekly/issues/4892) 投稿)
236 |
237 | 2、[Outfitify](https://outfitify.tech/)
238 |
239 | 
240 |
241 | 一个免费的 AI 穿搭评价工具,无需注册。([@zhbhun](https://github.com/ruanyf/weekly/issues/4903) 投稿)
242 |
243 | 3、[Diffree](https://diffree.org/zh)
244 |
245 | 
246 |
247 | 一个在线图像编辑工具,通过文字指令添加新元素到图片中,比如文字输入“为天空增加几片云”。([@zinc1234596](https://github.com/ruanyf/weekly/issues/4910) 投稿)
248 |
249 | 4、[DiscovAI](https://github.com/DiscovAI/DiscovAI-search)
250 |
251 | 
252 |
253 | 一个开源的 AI 产品搜索引擎,可以使用自己的数据。([@Ryan-yang125](https://github.com/ruanyf/weekly/issues/4912) 投稿)
254 |
255 | ## 资源
256 |
257 | 1、[The Far Side](https://www.thefarside.com)
258 |
259 | 
260 |
261 | 美国著名漫画家加里·拉尔森(Gary Larson)的官网,每天都有更新,展示他的单幅漫画作品。
262 |
263 | 2、[古生物 3D 标本](https://www.vertebres3d.fr/)
264 |
265 | 
266 |
267 | 这个网站提供各种古生物标本的 3D 模型,可以360度转动,还可以让骨骼运动。
268 |
269 | 3、[DistroSea](https://distrosea.com/)
270 |
271 | 
272 |
273 | 在线试用各种 Linux 发行版,它会分配一个虚拟机,浏览器里连接桌面。
274 |
275 | 4、[自己动手写 OAuth 2.0 登录客户端](https://annotate.dev/p/hello-world/learn-oauth-2-0-by-building-your-own-oauth-client-U2HaZNtvQojn4F)(英文)
276 |
277 | 
278 |
279 | 一篇初学者教程,详细介绍如何写 OAuth 2.0 登录客户端,以谷歌登录为例,配有代码注释。
280 |
281 | ## 图片
282 |
283 | 1、[透明电视墙](https://spectrum.ieee.org/transparent-tv)
284 |
285 | 今年的拉斯维加斯的消费电子展上,LG 公司用透明电视机组成了一堵电视墙,非常壮观。
286 |
287 | 
288 |
289 | 它的最大特点是,正面和反面都能看到播放的内容。
290 |
291 | 远看你以为是一个室内瀑布,近看才发现是玻璃屏在放视频。
292 |
293 | 2、[蛤蜊水质监控](https://twitter.com/Rainmaker1973/status/1663142203173085186)
294 |
295 | 波兰华沙的自来水厂,采用蛤蜊来监测水质。
296 |
297 | 蛤蜊作为贝壳动物,有一种特性,水质不清的时候,它会关闭,只有水质好的时候才打开。
298 |
299 | 
300 |
301 | 自来水厂利用这个特性,在蛤蜊的壳上装了一个弹簧,弹簧顶端有一个小铁块。当水质不好、贝壳关闭的时候,铁块就会下落,落到支柱上,电路就通了,从而水质报警。
302 |
303 | 当水质改善的时候,贝壳打开,电路断掉,水质警报消除。
304 |
305 | ## 文摘
306 |
307 | 1、[如何造就一个出色的技术博客](https://notes.eatonphil.com/2024-04-10-what-makes-a-great-tech-blog.html)
308 |
309 | 我喜欢的技术博客,都有一些共同特征:
310 |
311 | (1)解决困难,或者帮助读者理解一些令人困惑的话题。
312 |
313 | (2)带有清晰可理解的代码或例子。
314 |
315 | (3)让事情变得更简单。
316 |
317 | (4)定期写作。
318 |
319 | (5)不回避所介绍的技术的代价和缺点。
320 |
321 | (6)不使用网络俚语、咒骂、讽刺和咆哮。
322 |
323 | 2、[搜索引擎发展史](https://www.tomshardware.com/news/google-ai-search-experience-content-farm)
324 |
325 | 以前,世界各地的图书馆帮助人们查找资料。
326 |
327 | 后来,互联网搜索引擎出现了,能够快速、方便地找到正确的资料。20年后,几乎没人去实体图书馆查资料了,大多数人都使用搜索引擎。
328 |
329 | 获得主导地位后,搜索引擎不甘于只提供搜索功能,决定自己提供信息,不再链接到其他地方。
330 |
331 | 搜索引擎开始自己写所有主题的书,质量要比原始书籍差一些,但是它让人们更容易获得它写的书。由于搜索引擎不是特定主题的专家,因此它写的书只是对原始资料的简单解释,有时甚至就是逐字逐句的复制。
332 |
333 | 谷歌现在就是这么干。它采用了一种人工智能,从人类创作的内容中提取数据,并在没有专业知识或权威支持的情况下自己生成内容。
334 |
335 | 多年来,用户都在抱怨“内容农场”,这类网站大量制作各种主题的低质量文章,以便在搜索引擎中获得较高的排名,从而获得流量。然而现在,谷歌看起来就要变成世界上最大的内容农场,由机器人实时生产无限数量的定制文章。
336 |
337 | ## 言论
338 |
339 | 1、
340 |
341 | 如果我预测未来十年外星人登陆地球的概率为80%,没人会当真。现阶段讨论 AI 对人类生存的风险,就好像讨论外星人登陆。
342 |
343 | -- [《AI 风险太不可靠》](https://www.aisnakeoil.com/p/ai-existential-risk-probabilities)
344 |
345 | 2、
346 |
347 | React 框架的问题是,它的关注重点不是让事情变得简单,而是扩张主义——征服新的知识前沿。
348 |
349 | -- [DHH](https://shiftmag.dev/dhh-make-software-simple-again-3829/),Ruby on Rails 框架的作者
350 |
351 | 3、
352 |
353 | 薛定谔的猫指的是有一个盒子,里面有一个量子机械装置。一旦猫进入盒子里面,并且盖子关闭,量子可能会杀死猫,也可能不杀死。
354 |
355 | 问题是,如果你不打开盒子,就没法知道,猫是死是活。所以,猫的死活是不确定的,任何确定性都是观察者创造出来的。
356 |
357 | -- [《薛定谔的猫是如何出名的》](https://nautil.us/how-schrodingers-cat-got-famous-637677/)
358 |
359 | 4、
360 |
361 | 心理学家做过一个实验,让实验者长期处于半饥饿状态。结果,这些实验者的心理发生了永久变化。
362 |
363 | 实验结束后,很多人喜欢上了烹饪书和餐馆菜单,会认真比较报纸上的水果和蔬菜价格,甚至开始重新考虑自己的职业,改为从事农业或餐饮。
364 |
365 | 心理学家说,这证明了人被自己缺乏的东西所吸引。
366 |
367 | --[《一种乌托邦式的经济思想》](https://www.vox.com/the-highlight/24065976/economists-post-scarcity-abundance-industrial-revolution-socialism-capitalism)
368 |
369 | ## 往年回顾
370 |
371 | [Elasticsearch 的启示](./issue-264)(2023 #264)
372 |
373 | [你的地图是错的](./issue-214)(2022 #214)
374 |
375 | [培训班 vs 大学,求职成功率比较](./issue-164)(2021 #164)
376 |
377 | [U 盘化生存和 Uber-job](./issue-114)(2020 #114)
378 |
379 | (完)
380 |
381 |
--------------------------------------------------------------------------------
/docs/weekly/issue-5.md:
--------------------------------------------------------------------------------
1 | # 每周分享第 5 期
2 |
3 | 这里记录过去一周,我看到的值得分享的东西,每周五发布。
4 |
5 | 
6 |
7 | (题图:世博公园,上海,2018)
8 |
9 | 本周,服务器遭受攻击,网站下线50多个小时。我一度以为,《每周分享》不能按时发了。现在,攻击停了,但你不知道,什么时候它还会回来。这件事情的细节,我后面会单独写文章,这里只说说我的一个感受。
10 |
11 | 消息传出以后,许多素不相识的朋友通过各种渠道,询问我是否需要帮助,愿意提供个人或公司的资源,帮我渡过难关。阿里云和腾讯云都向我赠送了高防 IP。我全部牢记心中,这里不再一一感谢了。就算攻击最大的时候,我都没有担心过,因为我知道,背后有那么多人支持,你打不垮我的,只会激发我的斗志。
12 |
13 | 我最大的体会就是,在互联网上做一个好人,真是一件最划算的事情。你平时无非就是网上写写教程,邮件回答一些问题,虽然也是尽力去帮助别人,实际上并没有什么了不起的付出。但是,互联网的传播作用使得一点点微不足道的善行,都会被许多人看到和记住。等到你有困难的时候,人们就会在网上出现,从四面八方走过来帮你,默默用眼神支持你。
14 |
15 | 相反,如果你做一个坏人,躲在黑暗的角落放冷枪,也许能够达到那些自私的目的,攫取各种利益,但是你从此不敢相信别人,紧张兮兮活着,因为别人可能也会用同样的手段对付你。等到你落难了,不要说有人帮,他们庆祝和复仇都来不及呢。我觉得,这种人生可耻又可悲。
16 |
17 | ## 新闻
18 |
19 | 1、[Firefox 60 支持同域才能发送 Cookie](https://blog.mozilla.org/security/2018/04/24/same-site-cookies-in-firefox-60/)
20 |
21 | 本月初,Firefox 60 浏览器发布。它有一个很大的亮点,我看提到的人不多,就是它解决了 CSRF 攻击。
22 |
23 | 所谓 CSRF 攻击,就是使用真实的 Cookie 进行恶意行为。比如,用户访问 B 网站,页面上有一张来自 A 图站的图片,这时浏览器就会向 A 网站发出请求,并带上 A 网站的 Cookie。如果这张图片的 URL 被精心伪造过(比如是划款请求),麻烦就来了。因为 A 网站的服务器会以为,这个请求是真实的请求,因为 Cookie是对的,从而授权进行各种操作。
24 |
25 | Firefox 60 按照最新的标准,为 Cookie 新增了一个 SameSite 属性,明确规定访问 B 网站时向 A 网站发出的请求,一律不许带上 Cookie,这就从根本上防止了 CSRF 攻击。
26 |
27 | 另外,Firefox 60 还默认打开了 ES6 模块支持,至此所有浏览器都默认支持 ES6 模块。
28 |
29 | 2、[成立仅8个月的币安盈利超过百年德意志银行](http://finance.sina.com.cn/blockchain/coin/2018-04-28/doc-ifztkpip2834593.shtml)
30 |
31 | 
32 |
33 | 根据币安官方透露,它的上一季度利润达到2亿美元,已经超过了德国最大的银行----德意志银行,后者在2018年第一季度的利润为1.46亿美元。
34 |
35 | 德意志银行拥有148年的经营历史,旗下员工超过10万名。而8个多月前,币安还不存在。币安,英文名 Binance,是由CEO赵长鹏(CZ)创建的加密货币交易平台。现在它已经是全球最大的加密货币交易所。
36 |
37 | 3、[如果 CA 撤销了你的 HTTPS 证书](https://scotthelme.co.uk/the-power-to-revoke-lies-with-the-ca/)
38 |
39 | 
40 |
41 | 加密网站都需要 HTTPS 证书,这些证书通常是由 CA(证书当局)颁发。最近,一家 CA 撤销了 stripe.ian.sh 这个合法网站的证书,理由仅仅是浏览器显示证书来自 Stripe Inc,与 stripe.com 太过相似,用户可能会混淆。
42 |
43 | 请仔细看上图,你会不会以为自己正在访问 Stripe.com 官网,但是其实是另一个网站。作者提出了一个问题,CA 可以任意撤销一个网站的证书,他们的权力是否过大?因为一旦失去了加密证书,商业网站就等同于下线了。最近开源论文网站 Sci-Hub 由于版权争议,它的 HTTPS 证书就被 CA [吊销](https://news.ycombinator.com/item?id=16951831)了。
44 |
45 | 4、 [机器宠物狗](https://aibo.sony.jp/en/)([视频](https://weibo.com/tv/v/GfE2adYIy?fid=1034:60290ac9f5e8a89f1ab9c47d403045fb))
46 |
47 | 
48 |
49 | 索尼公司推出了新一代机器宠物狗 aibo(爱宝),根据产品主页的介绍,它跟人的互动达到了前所未有的程度,已经很接近真实的狗。
50 |
51 | 人跟机器人做伴侣的时代真的不远了。
52 |
53 | 5、[微软支持 Unix 换行符](https://blogs.msdn.microsoft.com/commandline/2018/05/08/extended-eol-in-notepad/)
54 |
55 | 文本文件的换行符,一直不统一。Unix 平台是 \n,Windows 平台是 \r\n,所以 Windows 打开其他平台的文本文件,都显示为一行。
56 |
57 | 那么多年过去了,微软终于在今年宣布下一次 Windows 10 更新时,Notepad 将支持 [Unix 换行符](http://www.ruanyifeng.com/blog/2006/04/post_213.html)(LF)、Mac 换行符(CR)。
58 |
59 | 6、[Gmail 的智能回邮功能](https://www.businessinsider.sg/google-gmail-gets-smart-compose-automatic-reply-suggestion-service-2018-5/)
60 |
61 | 
62 |
63 | 谷歌IO大会宣布,Gmail 新增智能回邮功能。也就是你写几个单词,后面的句子它帮你准备好。上图的那封邮件,每句话都是你写两个单词,后面机器帮你补全。
64 |
65 | 以后你回复邮件,只写核心信息就行了,人工智能自动加上一大堆客套话。
66 |
67 | 7、[Google One 存储](https://one.google.com/getupdates)
68 |
69 | 
70 |
71 | 谷歌将网络储存升级成 Google One 服务,100GB是每个月2美元,200 GB是3美元,2TB是10美元。这件事情的直接后果就是,Dropbox 大概要完蛋了,它是1TB 每个月10美元。不过,这个价格还是不如百度网盘,它是免费用户就有2TB。
72 |
73 | ## JavaScript 高级前端开发课程
74 |
75 | 本期《每周分享》很高兴得到了 [51CTO 学院](http://edu.51cto.com/?ryf)的赞助。下面介绍一下,他们最近推出了两门新课程,都由金牌讲师陈学辉主讲。
76 |
77 | [](http://edu.51cto.com/px/train/186?ryf)
78 |
79 | 1、__《JavaScript 深度揭秘之高级前端开发》:__适合已在职、有基础的技术人员提升技术,挑战更高的薪资。该课程深入探讨函数、事件循环机制、异步编程、面向对象、浏览器渲染、数据交互等的内部原理和高级应用,使用 ES6/ES7 语法讲解,涵盖日常开发及面试所需的技能。并且结合当下技术热点实时更新课程。
80 |
81 | 2、__《Web 前端高级开发工程师》__:主要针对纯小白的学员,比如在校学生、在职想转行的人士等等,从基础讲起,并且包含了《JavaScript 深度揭秘之高级前端开发》课程的部分内容。
82 |
83 | [](http://edu.51cto.com/px/train/186?ryf)
84 |
85 | __《Web 前端高级开发工程师》__课程原价是8980元,__《JavaScript 深度揭秘之高级前端开发》__原价 7980 元,现在点击[这个链接](http://edu.51cto.com/px/train/186?ryf)购买,可以__享受半价!__报名之后马上开始学习,无需等待开班,并且采用授课老师、助教老师、班主任、就业指导老师四对一的服务模式,保证每一位学员都能真正掌握学习内容。
86 |
87 | 感兴趣的朋友,可以[点击这里](http://edu.51cto.com/px/train/186?ryf)了解更多。
88 |
89 | ## 教程
90 |
91 | 1、[文章][最简单的马尔可夫链图解](http://setosa.io/ev/markov-chains/)(英文)
92 |
93 | 
94 |
95 | 上面是最简单的马尔可夫链图解。系统包括 A 和 B 两个状态。一共有四种转化路径:A 到 A、A 到 B、B 到 A,B 到 B。每种路径的可能性都是 50%,就得到了随机的运动轨迹。
96 |
97 | 一个通俗的实例是,每天有"晴天"和"下雨"两种天气,天气变化的概率是50%,那么马尔可夫链就可以生成一个未来一周天气的模型。
98 |
99 | 2、[文章] [决策树模型入门](https://heartbeat.fritz.ai/introduction-to-decision-tree-learning-cd604f85e236)(英文)
100 |
101 | 
102 |
103 | 决策树模型(Decision Tree)是最简单的机器学习模型,也最容易理解。当决策受到多个因素影响时,这个模型相当有用。
104 |
105 | 3、[文章] [为什么 go 结构是有害的?](https://vorpus.org/blog/notes-on-structured-concurrency-or-go-statement-considered-harmful/)(英文)
106 |
107 | 
108 |
109 | 多线程编程之中,有一种 go 结构,就是主线程之外分出一个线程,这个线程完成任务以后,再回到主线程。作者认为,这种结构是有害的。他的最精彩观点就是:如果允许使用 go 结构,那么所有的语言功能都可以用这种结构实现,程序很快就会乱做一团。
110 |
111 | 4、[代码] [Elm + Rust 开发桌面应用](https://github.com/huytd/kanban-app)(英文)
112 |
113 | 
114 |
115 | 目前,使用 Web 技术开发桌面应用,主要通过 Electron。它的缺点是,有时你只是想要在桌面上展示一个网页,不需要跟本地文件系统交互,但是不得不把整个 Chromium 浏览器和 V8 引擎包含在这个应用里面,导致不管逻辑是否复杂,任何一个 Electron 应用都至少有几十MB的大小。
116 |
117 | 这个项目展示了另一种开发桌面应用的可能。它的原理是,任何操作系统都有自己的 WebView,也就是说可以在应用程序里面调用 WebView 展示网页。那么可以使用 Rust 语言打包 WebView,而 JS 脚本部分交给 Elm 语言生成。由于 WebView 是系统提供的,所以打包出来非常小,一般只有几百KB,资源占用也很少。
118 |
119 | 5、[文章] [高可用的部署技巧](https://medium.com/@NetflixTechBlog/tips-for-high-availability-be0472f2599c)(英文)
120 |
121 | Netflix 公司的工程师介绍,他们如何部署代码,提高服务的可用性,比如使用红黑部署、设置部署窗口等等。
122 |
123 | 6、[教程] [哈佛大学《CS109:数据科学基础》的课程资料](http://cs109.github.io/2015/index.html)(英文)
124 |
125 | 1xx 编号的课程都是本科生的基础课程,我看了一下,讲的是 Python、基础的统计学知识和数学模型,提供免费的课程视频和PPT 下载。
126 |
127 | 7、[笔记] [《技术面试需要掌握的基础知识整理》](https://github.com/CyC2018/Interview-Notebook)(中文)
128 |
129 | 技术面试需要掌握的基础知识整理。
130 |
131 | 8、[资料] [互联网公司技术架构](https://github.com/davideuler/architecture.of.internet-product)(中文)
132 |
133 | 作者收集的国内各大互联网公司技术架构的资料
134 |
135 | ## 工具
136 |
137 | 1、[sonarwhal](https://sonarwhal.com)
138 |
139 | 
140 |
141 | 微软推出的开源网页 lint 工具([源码仓库](https://github.com/sonarwhal/online-service/)),可以在线扫描网页,提供无障碍、互通性、性能、PWA、安全五个方面的扫描结果,给出改进点。
142 |
143 | 2、[IPBlade](https://chrome.google.com/webstore/detail/ipblade-privacy-protector/hojjgiebfmgmlpjojjkaehgohkolmoea)
144 |
145 | 
146 |
147 | 有的网络服务限制 IP 地址,比如只有中国的 IP 地址才能使用。这个 Chrome 插件点击一下就可以改变浏览器的 IP 地址,从而绕过这些限制。免费版只能改成美国的 IP 地址。
148 |
149 | 3、[.gitignore 文件的命令行生成工具](https://github.com/TejasQ/add-gitignore)
150 |
151 | 
152 |
153 |
154 | .gitignore 文件设置了哪些文件可以不用进入 Git 版本管理。这个命令行工具可以根据项目类型,自动生成 .gitignore 文件。
155 |
156 | 4、[jGoBoard](http://jgoboard.com/)
157 |
158 | 
159 |
160 | 我在寻找围棋软件的时候,发现了这个生成互动式围棋棋盘的 JavaScript 库,觉得功能和样式都满足需要。另外,AlphaGo 官网也提供一个[棋盘生成器](https://deepmind.com/research/alphago/match-archive/alphago-games-simplified-chinese/), 基于 [WGO.js](http://wgo.waltheri.net/player)。
161 |
162 | 5、[love2.io](https://love2.io/)
163 |
164 | 一个收集开源书籍的网站。
165 |
166 | 6、[Pyre](https://github.com/facebook/pyre-check)
167 |
168 | Facebook 推出 Python 的静态类型检查工具,有点像 Flowtype 对于 JS 代码的作用。
169 |
170 | 7、[Google CTF 的试题](https://github.com/google/google-ctf)
171 |
172 | 这个是试题库,收集了 Google 主办的黑客安全大赛 CTF 的题目。
173 |
174 | ## 文摘
175 |
176 | 1、[冯象:AI 将终结资本主义](https://www.washingtonpost.com/news/theworldpost/wp/2018/05/03/end-of-capitalism/?utm_term=.0b7dc0245ff0)
177 |
178 | 
179 |
180 | 冯象是清华大学法学院教授。最近,《华尔街日报》发表了他在北京的一次演讲稿(英文),他认为 AI (人工智能)最终将导致目前的经济模式崩溃。
181 |
182 | > AI 将无情地导致技术亿万富翁的超级富豪寡头垄断,这些亿万富翁收获了机器人创造的财富,这些财富取代了人类的劳动力,从而导致大量的失业。
183 | >
184 | > 大规模失业的必然性和对全民福利的需求,将推动人工智能国有化的想法。
185 | >
186 | > 人工智能将会导致市场经济的终结。随着机器人的增多,工业发展只会导致更多的失业。除了国家的介入,没有什么好的选择。
187 |
188 | 2、[毕业20年依然从事本行业的比例](https://improvingsoftware.com/2009/05/19/programmers-before-you-turn-40-get-a-plan-b/)
189 |
190 | 1998年,美国的人口普查局做了一次职业调查。
191 |
192 | > 大学毕业后10年,57%的计算机主业的学生还在以程序员的身份工作;毕业后15年,这个比例下降到34%;毕业20年后,也就是只有40岁出头的年龄,下降到19%。相比之下,土木工程专业的数字是61%、52%和52%。
193 |
194 | 软件行业罕见40岁以上的程序员,看来全世界都是如此。这还是20年前的调查,如今的比例应该更低了。
195 |
196 | 3、[自下而上的编程](http://www.paulgraham.com/progbot.html),by Paul Graham
197 |
198 | > 传统的方法是,一个大型的程序必须分成几块,程序越大,它就越需要分割。你如何划分一个程序?传统的方法称为自上而下的设计:程序的目的是做这七件事,那么我把它分成七个主要的子程序,第一个子程序必须做这四件事,所以它又有四个子程序等等。这个过程一直持续到整个程序具有合适的粒度级别 - 每个部分都足够大,可以做一些实质性的事情,但又足够小,可以被理解为一个单元。
199 | >
200 | > 有经验的Lisp程序员对他们的程序进行不同的划分。除了自上而下的设计之外,他们遵循可称为自下而上设计的原则 - 改变语言以适应问题。在Lisp中,你不仅要将程序写入语言,还要将语言建立在程序上。当你正在编写一个程序时,你可能会想"我希望Lisp有这样一个操作符。" 所以你就去写了。
201 | >
202 | > 当你自下而上工作时,你通常会得到一个不同的程序。你得到的不是一个单一的,整体的程序,而是一个更大的语言、更多的抽象运算符,以及一个更小的程序。
203 |
204 | 4、[为什么中文如此难学?](http://www.pinyin.info/readings/texts/moser_zhongwen_simplified.html)
205 |
206 | > 中文不但对我们英语人士来说很难,它在绝对意义上也是难的。这意味着对于中国人来说,中文也很难。如果你不信,随便问个中国人。绝大多数中国人都会高兴地承认他们的语言很难,可能是地球上最难的。(实际上很多人以此为傲,就好象实际上有些纽约人以居住在美国最不宜居的城市为傲一样。)
207 | >
208 | > 我有一次和北京大学中文系的三个博士生吃午饭,他们三个都是中国人(一个来自香港)。我那天正好感冒,打算给一个朋友写个纸条取消我们一个约会。我发现自己想不起来怎么写"喷嚏"中的"嚏"了。于是我问那三位该怎么写。结果吓我一跳,他们仨都尴尬而难为情地耸耸肩。谁都不能正确地写这个字儿。各位同学!北京大学常常被认为是中国的哈佛啊。你能想象三个哈佛大学英文系的博士生不会写"sneeze"(喷嚏)?然而这种情况在中国绝不少见。
209 |
210 | 5、[天空中有多少颗星星?](http://www.skyandtelescope.com/astronomy-resources/how-many-stars-night-sky-09172014/)
211 |
212 | 
213 |
214 | 肉眼可见的恒星亮度等级,最低为+6.5。符合这个标准,地球上可见的星星一共有9,096颗。由于在任何时刻只能看到一半的天空,我们必须将这个数字除以二得到4,548颗星星(视季节而定),那是来自你能想象到的最黑暗的天空。
215 |
216 | 大城市的郊区,只能看到亮度为+4的星星,那只剩下900颗,任一时刻你还只能看到其中的一半。如果我们将城市市区的亮度等级设为+2(与北斗星亮度相似),那么全球只剩下70颗星,或者说从芝加哥市中心或波士顿可以看到35颗星。
217 |
218 | 6、[写一本 O'Reilly 书籍是什么体验?](https://medium.com/@rothgar/the-economics-of-writing-a-technical-book-689d0c12fe39)
219 |
220 | 
221 |
222 | 作者回顾了他为 O'Reilly 写书的整个历程。看过美国的技术书籍作者,收入也不是想象的那么高。
223 |
224 | > 这本书原计划250页,定价59.99美元。完成时,它只有160页,定价39.99美元。由于我们两个作者合写了这本书,我们每个人可以拿到每本书收入的5%,电子书是12.5%(个别作者可以拿到10%和25%)。这相当于我们每个人从实体书得到0.99美元,从电子书得到0.46美元。
225 | >
226 | > 从2017年12月到2018年3月,这本书售出了__1337__份。截止2018年4月份,我已经赚取了11,554.15美元。
227 |
228 | ## 本周图片
229 |
230 | 1、[堆积如山的废弃共享自行车](https://www.theatlantic.com/photo/2018/03/bike-share-oversupply-in-china-huge-piles-of-abandoned-and-broken-bicycles/556268/?single_page=true)
231 |
232 | 
233 |
234 | 共享自行车的流行,一大原因是它转嫁了停车成本。堆积如山的公共自行车已经成了城市问题,谁来管理?成本谁出?
235 |
236 | 这里还有另外一组[图集](https://www.theguardian.com/cities/gallery/2018/may/01/unexpected-beauty-china-bicycle-graveyards-share-bikes-in-pictures)。
237 |
238 | 2、[安卓的错误 Emoji 图案](https://www.businessinsider.sg/google-ceo-apologizes-for-android-burger-emoji-shows-off-new-beer-design-2018-5/?r=US&IR=T)
239 |
240 | 
241 |
242 | 
243 |
244 | 今年的谷歌 I/O 大会,谷歌的 CEO 特别提到他们修正了两个错误的 Emoji。一个是芝士在牛排下面,另一个半空的啤酒杯却有泡沫溢出。
245 |
246 | ## 本周金句
247 |
248 | 1、
249 |
250 | 非洲的人口 = 美洲 + 澳洲 = 欧洲 + 中东 = 亚洲 / 4 ([@MaxCRoser](https://twitter.com/MaxCRoser))
251 |
252 | 2、
253 |
254 | 程序的功能单位不宜过大,太大的函数容易掩盖错误,就像一个大城市隐藏着逃犯一样。这样的软件很难阅读,很难测试,也很难调试。(《[自下而上的编程](http://www.paulgraham.com/progbot.html)》,by Paul Graham)
255 |
256 | 3、
257 |
258 | 记者问了100个90后,"你们为什么不愿意打电话呢?"有人表示,只有陌生人才打电话。最陌生的人最常打电话:快递、外卖、骗子、你老板。([新京报](http://news.sina.com.cn/c/2018-04-28/doc-ifzvpatq6849008.shtml))
259 |
260 | 4、
261 |
262 | Facebook 公司推出Pyre,用来检查Python程序的静态类型错误,下面是一个网友的[评论](https://news.ycombinator.com/item?id=17049578)。
263 |
264 | > 十多年前,Java的繁琐让很多人仇恨类型系统,他们改用Python、Ruby等动态类型语言,这使我们能够快速而松散地完成工作。经过大约十年的热血编程,我们最终发现,动态语言编写的巨大单体项目是非常脆弱的。
265 |
266 | ## 欢迎订阅
267 |
268 | 这个专栏每周五发布,同步更新在我的[个人网站](http://www.ruanyifeng.com/blog)、[微信公众号](http://weixin.sogou.com/weixin?query=%E9%98%AE%E4%B8%80%E5%B3%B0%E7%9A%84%E7%BD%91%E7%BB%9C%E6%97%A5%E5%BF%97)和[语雀](https://yuque.com/ruanyf/share/)。
269 |
270 | 微信搜索"__阮一峰的网络日志__"或者扫描二维码,即可订阅。
271 |
272 | 
273 |
274 | (完)
275 |
276 |
--------------------------------------------------------------------------------
/docs/weekly/issue-8.md:
--------------------------------------------------------------------------------
1 | # 每周分享第 8 期
2 |
3 | 这里记录过去一周,我看到的值得分享的东西,每周五发布。
4 |
5 | 
6 |
7 | (题图:烟台山历史保护区,烟台,2017。我小时候的商店都是这种样子。)
8 |
9 | 最近,日本厚生劳动省[公布](http://news.sina.com.cn/o/2018-06-01/doc-ihcikcew3053427.shtml)了正式的统计数据。2017年,日本全国一共出生了94.6万个新生儿,这是有史以来最低的数字,比上一年足足少了3万人。日本人看到这个统计,都吓死了。日本的总人口是1.27亿左右,每年全国的新生儿只有90几万,这意味着什么?
10 |
11 | 这么说吧,日本现在缺少新生儿、将来就会缺少青年、缺少劳动力,再远的未来就会缺少活人,住宅和街道都会变成一片片渺无人烟的鬼屋。日本这个民族很可能从此一蹶不振了,不要说发展,忙于应付老龄化和缺少劳动力都会来不及。
12 |
13 | 媒体[采访](http://www.sohu.com/a/213752632_165453)日本年轻人,为什么不愿意生小孩?原因很简单,一个是穷,年轻人没有钱,自己消费都不够,哪来多余的钱养小孩;另一个是太麻烦,照顾小孩要牺牲很多个人自由,甚至人生规划。
14 |
15 | 日本人都很悲观,觉得这种趋势没法改变。我突然想到,也不是完全没有办法,既然人类不愿意生育,可以在实验室里生产人啊!人工授精、人工胚胎早就没有问题了,现在主要是代孕代育没法替代,还没有人造子宫这种技术。如果将来有人工环境替代子宫,让受精卵变成新生儿,那么人口下降就不存在了,想要多少人,实验室提供受精卵就可以了。我相信,这在技术上完全可以实现。
16 |
17 | 当然,这样会产生很多问题:这些小孩的父母是谁?谁负责养育他们?一个人没有祖先会怎样?......但是,如果国家缺少人口已经到了要亡国亡种的地步,那时还能有什么选择?何况,没有怀胎十月和分娩之苦,大多数女性一定会乐于支持这种方案。
18 |
19 | ## 新闻
20 |
21 | 1、[日本82岁老奶奶开发 App](https://www.aarp.org/work/working-at-50-plus/info-2018/worlds-oldest-app-developer-fd.html)
22 |
23 | 
24 |
25 | 日本82岁的老奶奶 Masako Wakamiya 2017年初开始学习编程,现在已经开发了一款免费的 iOS 游戏 [Hinadan](https://itunes.apple.com/us/app/hinadan/id1199778491?mt=8),专门面向老年日本人。该 App 在苹果商店获得获得近5颗星,全球下载量大约为53,000。
26 |
27 | 编程的门槛将来会越来越低。事实上,应用层面的编程(UI + 组件逻辑)是不难的,很容易学会。现在的潮流是教小孩编程,其实中老年人编程教育的市场更大。这也是一种娱乐,比打麻将好多了。当然,最大的问题是老年人没英语基础,这就没办法了。
28 |
29 | 2、[无人帆船 Saildrones](https://www.bloomberg.com/businessweek)
30 |
31 | 
32 |
33 | 每年春天,成千上万的大白鲨开始神秘的迁徙,从美国西海岸直奔太平洋深处。生物学家一直希望了解,这些鲨鱼在那里干什么。今年总算有答案了,这要归功于一对名叫 Saildrones 无人帆船。
34 |
35 | 这种无人帆船实际上是可以航行的自动机器人,尽管人类可以远程控制,但是大部分时间是自动航行。2018年三月中旬,它们带着传感器,摄像机和科学仪器,从旧金山开始为期三周的1,200英里的鲨鱼观察之行。到了4月初,它们抵达预定地点,接收到了带有声波发射器的37只鲨鱼的信号。它们标识鲨鱼的位置,然后来回航行,使用声呐查看它们正在做什么。通过卫星,再将图像和其他数据转回给斯坦福大学的海洋生物学家芭芭拉·布洛克。
36 |
37 | 就像陆地上有无人汽车一样,将来海洋上也都会是无人驾驶的船只。
38 |
39 | 3、[3纳米的芯片](https://www.digitimes.com/news/a20180523PD210.html)
40 |
41 | 
42 |
43 | 三星宣布可以生产3纳米的芯片了,但还没有具体的投产时间。现在最先进的骁龙845芯片是10纳米。这意味着,未来同样大小的芯片,能够容纳10倍以上的晶体管,那是不是说计算能力起码还能强10倍?
44 |
45 | 二三十年后,每个人随身携带的计算能力,恐怕相当于今天的一个机房。这意味着什么?
46 |
47 | 这里有一个[组图链接](http://www.semiinsights.com/s/bdt/15/25658.shtml),帮助大家了解芯片的制程到底是什么?
48 |
49 | 4、[YeeLight 停止向欧洲用户提供服务](http://gdprhallofshame.com/7-sorry-your-light-bulbs-and-gdpr-dont-work/)
50 |
51 | 
52 |
53 | 小米旗下的智能灯具品牌 Yeelight 近日宣布,由于无法满足 GDPR 的要求,将不再向欧洲用户提供服务。作为该品牌的中国用户,我立刻得出结论,它的服务器上一定保存着我所有开灯/关灯的记录......
54 |
55 | 网友评论:然后他们在某次发布会上骄傲的展示,我们的智能家居大数据显示,北上广深中xx人睡的最晚,xx人最喜欢x色灯光......这就是大数据的力量!
56 |
57 | 5、[30年后,QBasic 依然是入门的儿童编程语言](http://www.nicolasbize.com/blog/30-years-later-qbasic-is-still-the-best/)
58 |
59 | 
60 |
61 | 
62 |
63 | 作者想教7岁的孩子编程,尝试了各种语言之后,他发现30年前流行的 QBasic 依然是最好的选择。
64 |
65 | > 我先教他第一行代码:PRINT "hello world"。
66 | >
67 | > 然后,我又教了几个命令:CLS,COLOR,PLAY,INPUT和IF。没有什么可以解释的:没有复杂性,没有尴尬的操作符,没有抽象的概念,没有需要阅读的文档,没有对象/类/方法的概念,没有框架安装,没有特别的关键字或括号。这是代码最纯粹的形式。
68 | >
69 | > 不到一个小时,我7岁的孩子不仅能写出他的第一个源文件,还能体验创建、编译和执行他自己的小程序带来的乐趣和快感。
70 | >
71 | > 我意识到,30多年来,我们一直未能为我们的孩子提供更好的产品。我们创造了更强大和更复杂的语言/框架/ IDE,但我们从来没有比 QBasic 更简单或更直接地获得编程的快感。
72 |
73 | 这里还有一篇[《Basic 语言的历史介绍》](http://www.nicolasbize.com/blog/30-years-later-qbasic-is-still-the-best/)。
74 |
75 | 6、[Firefox 浏览器支持 Web Components](https://www.cnet.com/news/mozilla-firefox-joins-chrome-safari-making-it-easier-to-build-sophisticated-websites/)
76 |
77 | 
78 |
79 | Firefox 浏览器最新的 [Nightly测试版本](https://twitter.com/FirefoxNightly/status/1001104178146611202) 已经支持 Web Components。这是 Chrome 浏览器5年前开始推广的一种新技术,现在除了 Edge 浏览器,其他主要浏览器都已经支持了。
80 |
81 | Web Components 是浏览器原生的组件解决方案。如果你愿意对新技术下赌注,可以考虑它。
82 |
83 | 7、[Facebook 不向40岁以上的访问者推送招聘广告](https://projects.propublica.org/graphics/facebook-job-ads)
84 |
85 | 
86 |
87 | 美国一个组织发现,Facebook 允许广告主指定受众的年龄范围,结果导致40岁以上的访问者看不到招聘广告,而美国法律明文禁止招聘的年龄歧视。就像上面的广告,只有25~36岁的人才能看到。
88 |
89 | ## 贝米钱包
90 |
91 | 本期《每周分享》很高兴得到了[贝米钱包](https://www.bmqb.com/?track_id=ryf_zutuan)([www.bmqb.com](https://www.bmqb.com/?track_id=ryf_zutuan))的赞助。
92 |
93 | [贝米钱包](https://www.bmqb.com/?track_id=ryf_zutuan),2014年12月成立于上海,是一家专业网络借贷信息中介平台,已获得源码资本A轮千万级融资,出资人包括王兴、张一鸣等互联网巨头高管。
94 |
95 | [](https://www.bmqb.com/?track_id=ryf_zutuan)
96 |
97 | 平台主打中短期优质投资服务,目前共有定存计划、分红计划两款产品。
98 |
99 | * 定存计划:中长期投资,历史年化收益率达10.5%以上。
100 | * 分红计划:15天锁定期,30天后可以支取,低到100元起投,历史平均年化收益率达10%。
101 |
102 | [](https://m.bmqb.com/a/activities/group_invest?track_id=ryf_zutuan)
103 |
104 | 现在,[贝米钱包](https://www.bmqb.com/?track_id=ryf_zutuan)推出了[贝米战队](https://m.bmqb.com/a/activities/group_invest?track_id=ryf_zutuan)活动。专门针对程序员群体,提供更高的收益。一个战队2~5人,所有队员均可邀请好友入队,成功组队投资,最高可获得2958元现金红包。活动到6月20日就结束了,扫描以下二维码了解更多!
105 |
106 | [](https://m.bmqb.com/a/activities/group_invest?track_id=ryf_zutuan)
107 |
108 | 另外,[贝米钱包](https://www.bmqb.com/?track_id=ryf_zutuan)承诺会将[本次活动](https://m.bmqb.com/a/activities/group_invest?track_id=ryf_zutuan)利润的 5% 捐赠给开源社区,包括 vuejs , webpack , element, vux, babel 等项目。
109 |
110 | ## 教程
111 |
112 | 1、[文章] [深度学习在线课程比较](https://hackernoon.com/deeplearning-101-coursera-vs-udemy-vs-udacity-b4eb3de06dbe)(英文)
113 |
114 | 深度学习是目前很热门的主题,各大网校都有这方面的课程。这篇文章比较了美国三大教育平台的深度学习课程:Coursera、Udemy 和 Udacity。
115 |
116 | 2、[文章] [前端人工智能?TensorFlow.js 学会游戏通关](https://zhuanlan.zhihu.com/p/35451395)(中文)
117 |
118 | 
119 |
120 | 作者使用 TensorFlow.js,让程序自动完成 Chrome 浏览器的内置小游戏"恐龙快跑"。
121 |
122 | 3、[课程] [哈佛大学游戏开发课程](https://cs50.github.io/games/)(英文)
123 |
124 | 哈佛大学游戏开发课程 CS50,提供讲课视频、课程笔记、PPT 和作业等资料。
125 |
126 | 4、[文章] [马尔可夫决策过程](https://xaviergeerinck.com/markov-property-chain-reward-decision)(英文)
127 |
128 | 如何利用马尔可夫链建立一个决策模型,文章较好懂。
129 |
130 | 5、[PDF] [Awk 编程语言](https://ia802309.us.archive.org/25/items/pdfy-MgN0H1joIoDVoIC7/The_AWK_Programming_Language.pdf)(英文)
131 |
132 | awk 是 Unix 命令行处理文本的有用工具,这里是1988年出版的 awk 教程。Unix 命令行高度稳定,所以这本教材也没那么过时。
133 |
134 | 6、[仓库] [JavaScript 算法与数据结构](https://github.com/trekhleb/javascript-algorithms/blob/master/README.zh-CN.md)(中文)
135 |
136 | 这个仓库收集了30多种算法的 JavaScript 实现。
137 |
138 | 7、[教程] [高性能矩阵乘法](https://gist.github.com/nadavrot/5b35d44e8ba3dd718e595e40184d03f0)(英文)
139 |
140 | 
141 |
142 | 矩阵乘法需要计算每一行与所有列的乘积之和,如果矩阵很大,乘法计算是非常耗时的。这篇文章讨论如何实现一个高性能的矩阵乘法算法。
143 |
144 | 8、[电子书] [Python - 100天从新手到大师](https://github.com/jackfrued/Python-100-Days)(中文)
145 |
146 | 一本针对初学者的 Python 教程。
147 |
148 | ## 资源
149 |
150 | 1、[GitHub 替代品](https://tutswiki.com/github-alternatives/)
151 |
152 | 微软收购了 GitHub,导致一部分开发者怀疑这个平台的独立性,从而迁移到其他平台。这里列出了十几个 GitHub 的替代品,以及各自的优缺点。
153 |
154 | ## 工具
155 |
156 | 1、[CalVer](http://calver.org/)
157 |
158 | 
159 |
160 | 语义版本(SemVer)现在很流行,就是根据 API 的变动为版本编号。这个网址提出另一种编号方法:根据日历编号,版本号就是发布日期。很多软件已经在用了,最有名的就是 Ubuntu,它的版本格式是 yy.mm,比如 16.04。
161 |
162 | 2、[Jadesktop](https://github.com/codesardine/Jadesktop)
163 |
164 | 
165 |
166 | 一个使用 HTML5、CSS、JavaScript 和 Python 开发 Linux 桌面应用的工具。对的,你不需要 Electron。
167 |
168 | 3、[Asteroid OS](https://asteroidos.org/)
169 |
170 | 
171 |
172 | 开源的手表操作系统。
173 |
174 | 4、[AutoCAD 在线版](https://web.autocad.com/)
175 |
176 | 
177 |
178 | 三月份的消息,今天才看到。AutoCAD 浏览器版上线了,跟桌面版基本一致,背后的技术是 Webassembly。
179 |
180 | 5、[Winds 2.0](https://getstream.io/winds/)
181 |
182 | 
183 |
184 | 一个开源的桌面 RSS 阅读器。
185 |
186 | 6、[self-driving-toy-car](https://github.com/experiencor/self-driving-toy-car)
187 |
188 | 
189 |
190 | 一个开源的自动驾驶玩具车,在小车上面绑了一个树莓派和摄像头。
191 |
192 | 7、[Chromely](https://github.com/mattkol/Chromely)
193 |
194 | 
195 |
196 | Electron 的挑战者越来越多,这个是 .NET 框架包装的 Chrome 浏览器内核。你现在可以使用 .NET 开发类似 Electron 的桌面应用。
197 |
198 | 8、[Cool Backgrounds](https://coolbackgrounds.io/)
199 |
200 | 
201 |
202 | 自动生成背景图片的工具网站,现在提供五种风格,每种都可以定制,看上去赏心悦目。
203 |
204 | ## 文摘
205 |
206 | 1、[有史以来最复杂的软件](https://www.quora.com/What-is-the-most-sophisticated-piece-of-software-code-ever-written)(英文)
207 |
208 | 
209 |
210 | 作者认为,Stuxnet 蠕虫病毒可能是有史以来最复杂的软件。
211 |
212 | > 我们不知道 Stuxnet 的作者是谁,只知道大概是在2005年至2010年间编写的。
213 | >
214 | > 这种病毒藏在 U 盘上。当 U 盘插入 PC,它会自动运行,将自已复制到该 PC。它至少有三种自动运行的方法。如果某种方法行不通,就尝试另一种。其中的两种运行方法是全新的,使用了 Windows 的两个无人知晓的秘密 Bug。
215 | >
216 | > 一旦蠕虫进入 PC ,它会尝试获得该 PC 的管理员权限,使用的也是前面提到的那两个无人知道的秘密 Bug。然后,它把自己留下的痕迹全部清除,不让防病毒软件检测到它的存在,用户不会看到任何东西。这种蠕虫隐藏得很好,出现后一年多,没有任何一家安全公司发现它的存在。
217 | >
218 | > 它会秘密访问 [http://www.mypremierfutbol.com](http://www.mypremierfutbol.com/) 或 [http://www.todaysfutbol.com](http://www.todaysfutbol.com/) 这两个网站,告诉服务器已经成功侵入了一台新的 PC,然后从网站下载最新版本自行更新。
219 | >
220 | > 它会将自身复制到任何插入该 PC 的 U 盘。使用的 U 盘驱动程序由 Realtek 公司进行了数字签名,但是 Realtek 公司并不知道有这个签名。这意味着,蠕虫作者能够获取 Realtek 公司的最高密钥。
221 | >
222 | > 它利用两个 Windows 的 Bug ----一个涉及网络打印机,另一个涉及网络文件----将自己传播到局域网里面的其他计算机上。
223 | >
224 | > 直到这一步,它的真正任务还没有开始。
225 | >
226 | > 它在每一台计算机上寻找一种由西门子设计的用于大型工业机械自动化的控制软件。一旦发现这种软件,它会使用另*一个*以前未知的 Bug,将自身复制到工业控制器的驱动程序。然后,它会检查两家特定公司的工业电机,其中一家公司在伊朗,另一家在芬兰。它要搜索的特定电机称为变频驱动器,主要用于运行工业离心机,提纯多种化学品,比如铀。
227 | >
228 | > 由于蠕虫完全控制了离心机,因此它可以做任何事情,可以将离心机全部关闭,也可以将它们全部摧毁:只需设定以最大速度旋转离心机,直到它们全都像炸弹一样爆炸,杀死任何恰好站在附近的人。
229 | >
230 | > 但它没有这么做,一旦它控制了每台离心机......它就进入潜伏。一旦达到设定的时间,它就会悄悄地唤醒自己,锁住离心机,使得人类无法关闭这些机器。然后悄悄地,蠕虫开始旋转这些离心机,修改了安全参数,增加了一些气体压力......
231 | >
232 | > 此外,它还会在离心机正常运转的时候,偷录一段21秒的数据记录。当它控制离心机运行的时候,会一遍又一遍地播放这段数据记录。管理人员会看到,计算机屏幕上的所有离心机运行数据都很正常,但这其实是蠕虫让他们看的。
233 | >
234 | > 现在让我们想象一下,有一家工厂正在用离心机净化铀。电脑上的所有数字都表明离心机运行正常。但是,离心机正在悄悄地出问题,一个接一个地倒下,这使得铀产量一直下降。铀必须是纯净的。你的铀不够纯净,无法做任何有用的事情。
235 | >
236 | > 工厂的管理者根本找不到原因,离心机的数据是正常的。你永远不会知道,所有这些问题都是由一种计算机蠕虫引起的。这是一种历史上最狡猾和最聪明的计算机蠕虫,它由一些拥有无限资金和无限资源的令人难以置信的秘密团队编写,并且设计时只考虑一个目的:偷偷摧毁某个国家的核弹计划,并且不被发现。
237 |
238 | 2、[设计系统将取代设计师](https://www.designsystems.com/stories/will-design-systems-replace-designers/)
239 |
240 | Facebook 和 Airbnb 设计系统的创造者[@soopa](https://twitter.com/soopa) 认为,随着设计系统越来越成熟,未来对于设计师的需求将会减少。
241 |
242 | > 我加入 Facebook 时,有18位设计师。一年之后,设计师超过40人,但产品工程部门已经超过1000人,产品管理接近200人。公司正受到设计部门增长缓慢的影响。我们着手解决这个问题的方法是,就是制定设计系统。
243 | >
244 | > 设计系统将取代今天我们所知的许多设计工作。UI 开发、流程和工具就像可互换的零件和工厂装配线,可以减少人员创建与以前相同的产品。今天的许多设计师必须将预先设计的组件组装在一起 - 这项任务将越来越自动化。
245 | >
246 | > 设计系统可以实现更快速的产品开发,从而使公司能够开发更多产品。设计系统使得每个产品需要更少的设计师。
247 |
248 | ## 每周图片
249 |
250 | 1、[《迈登斯的中国摄影集》](https://shuge.org/ebook/carl-mydans-world-war-ii/)
251 |
252 | 
253 |
254 | 1941年,美国《生活》(LIFE)杂志摄影师迈登斯( Carl Mydans)来到中国,拍摄中国人民的抗战。现在,他拍摄的3332张照片已经可以在互联网免费下载。
255 |
256 | 2、[监视器上的燕子](https://www.mobile01.com/topicdetail.php?f=629&t=5445008&p=8#68506804)
257 |
258 | 
259 |
260 | 
261 |
262 | 网友拍到有一窝燕子在监视器上著巢,燕妈妈飞来喂食。
263 |
264 | 3、[芬兰的图书馆](https://www.theguardian.com/cities/2018/may/15/why-finlands-cities-are-havens-for-library-lovers-oodi-helsinki)
265 |
266 | 
267 |
268 | 芬兰是一个热爱读书、有很多图书馆的国家。上面照片里面如此具有现代感的图书馆,建成于1927年,照片拍摄于1935年。
269 |
270 | ## 本周金句
271 |
272 | 1、
273 |
274 | 到了2050年,海洋里面的塑料垃圾的数量将超过鱼。([BBC](https://www.theguardian.com/environment/2018/jun/05/the-planet-is-on-edge-of-a-global-plastic-calamity))
275 |
276 | 
277 |
278 | 2、
279 |
280 | 如果你在很年轻的时候,就遭受到了失败,一定要把它当作老天送你的礼物。如果等到四十岁再失败,你会经受不起的。为什么年纪越大,走路越小心,因为越来越经不起跌倒了。(网友)
281 |
282 | ## 欢迎订阅
283 |
284 | 这个专栏每周五发布,同步更新在我的[个人网站](http://www.ruanyifeng.com/blog)、[微信公众号](http://weixin.sogou.com/weixin?query=%E9%98%AE%E4%B8%80%E5%B3%B0%E7%9A%84%E7%BD%91%E7%BB%9C%E6%97%A5%E5%BF%97)和[语雀](https://yuque.com/ruanyf/share/)。
285 |
286 | 微信搜索"__阮一峰的网络日志__"或者扫描二维码,即可订阅。
287 |
288 | 
289 |
290 | (完)
291 |
292 |
--------------------------------------------------------------------------------
/docs/weekly/issue-247.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: weekly/issue-247
3 | titleTemplate: false
4 | ---
5 | # 科技爱好者周刊(第 247 期):扎克伯格的裁员信
6 |
7 | 这里记录每周值得分享的科技内容,周五发布。
8 |
9 | 本杂志[开源](https://github.com/ruanyf/weekly),欢迎[投稿](https://github.com/ruanyf/weekly/issues)。周刊另有[《谁在招人》](https://github.com/ruanyf/weekly/issues/2960)服务,发布程序员招聘信息。合作推广请[邮件联系](mailto:yifeng.ruan@gmail.com)(yifeng.ruan@gmail.com)。
10 |
11 | ## 封面图
12 |
13 | 
14 |
15 | 2019年建成的陕西宝鸡“太白山之眼”,是一个巨型的钢结构,高度达到20层楼(含底部钢架)。它不仅能喷水,还能喷火,集合了声光电表演,将音乐喷泉推向了一个新高度。([via](http://bbs.hsw.cn/read-htm-tid-20319326-page-1.html))
16 |
17 | ## 本周话题:扎克伯格的裁员信
18 |
19 | 去年11月,Meta 公司宣布大裁员,解雇13%的员工,大约11,000人。
20 |
21 | 过了四个月,上周二(3月14日),该公司突然宣布,还有第二轮,再解雇大约10,000人。
22 |
23 | 
24 |
25 | 今天,我们不讨论裁员这件事本身,只说说[扎克伯克的裁员信](https://about.fb.com/news/2023/03/mark-zuckerberg-meta-year-of-efficiency/)。
26 |
27 | 裁员信公开发在 Meta 官网,我建议大家读一下,里面有一些有意思的内容。
28 |
29 | 
30 |
31 | 大部分的裁员信,都是假惺惺的例行公事,“由于市场形势的变化,我们不得不做出一个艰难的决定……”。但是,这封信不一样。
32 |
33 | 扎克伯克详细解释了,他对公司管理的想法,以及下一步的打算。如果你想了解硅谷巨头的内部情况,这封信可以提供不少信息。
34 |
35 | 首先,他直言不讳地说,**上一次裁员的效果很好,** 公司效率提高了。
36 |
37 | > “自从我们去年裁员以来,一个令人惊讶的结果是许多事情进展得更快了。回想起来,我低估了优先级较低的项目的间接成本。”
38 |
39 | 为什么员工少了,项目反而进展快了?
40 |
41 | 扎克伯格的解释是,裁员使得公司大量取消低优先级的项目,集中资源到最重要的事情上面。
42 |
43 | 下面这段话,我认为非常精彩。
44 |
45 | > “人们很容易认为,只要一个项目产生的价值超过其直接成本,它就是正收益的。
46 | >
47 | > 但是,任何项目都需要一个主管,我们要么提拔一个工程师,要么从另一个项目挑选一个人,让其负责该项目。这两种情况都分散了人才,并且创造出了更多的管理层。
48 | >
49 | > 如果项目继续发展,整个团队也许分散到多个楼层或多个办公室,这让沟通变得更加困难。
50 | >
51 | > 我们还需要为项目配备更多的笔记本电脑和其他资源,这些更多的工程师还会导致雇佣更多的 IT 人员、HR 人员和招聘人员。
52 | >
53 | > 随着团队越来越大,效率不断降低,反应变迟钝了。它也许会与另一个团队的工作重叠,或者本应使用现有基础架构时却构建了一个定制系统。
54 | >
55 | > 总之,那些低优先级项目对公司重要性不大,却带来复杂的间接成本,很容易低估它们。”
56 |
57 | 他的结论就是,必须进一步取消不重要的项目,精简组织,继续裁员不可避免。
58 |
59 | 接着,他又说,**效率低下还有两个重要原因:管理层级太多,团队太大。**
60 |
61 | (1)为了提高效率,必须减少管理层级,推行扁平化组织。
62 |
63 | > “众所周知,公司结构每增加一层,都会增加信息成本、决策延迟和风险规避,因为每层的经理向上一级发送请求时,通常都会减少一些可能导致风险的设计。”
64 |
65 | **减少管理层以后,多出来的管理人员必须加入项目开发。**
66 |
67 | > "我们强制要求,大部分项目主管都必须同时是项目贡献者,并且团队内每个人都可以向上报告到每一个层级。”
68 |
69 | (2)尽量避免大团队,产品团队最好不超过10人。
70 |
71 | > “一般来说,我们不希望经理拥有超过10名直接下属。”
72 |
73 | **为了把团队变小,就需要剔除团队里面的非技术人员。**
74 |
75 | > “很多团队聘请了许多工程以外领域的专家。这有助于构建更好的产品,但必须确保我们的公司的主要人员仍然是技术人员。“
76 | >
77 | > “我们会将产品团队主要聚焦在工程方面,其他领域的一些人员会被解雇,并且避免产品团队被来自其他团队的大量交互请求所淹没。”
78 |
79 | 总之,扎克伯格明白说了,Meta 接下来要做三件事——砍掉低优先级项目、减少管理层级、缩小团队——都会产生多余人员,所以需要进一步裁员。
80 |
81 | 我估计,其他互联网公司也会跟进,同样去做这三件事,所以行业裁员大概还会持续一段时间,就业形势可能要到今年下半年才会有所好转。
82 |
83 | ## 科技动态
84 |
85 | 1、[柯伊伯计划](https://www.theverge.com/2023/3/14/23639450/amazon-project-kuiper-satellite-dish-internet)
86 |
87 | 马斯克的 Starlink 项目终于迎来了竞争对手,亚马逊公司的柯伊伯计划(Project Kuiper)宣布即将正式运作。
88 |
89 | 
90 |
91 | 今年5月份,亚马逊将会发射两颗原型卫星,然后明年上半年发生第一批正式卫星,下半年开始商业运作,提供卫星上网服务。
92 |
93 | 虽然,卫星还没有发射,但是信号接收终端已经亮相了,一共有三种,看上去都比 Starlink 的终端更简单易用。
94 |
95 | 
96 |
97 | 最小的一个型号不到 7 x 7 厘米,非常便携。亚马逊声称它可以提供 100MBps 的带宽,如果属实,将可以彻底解决野外上网难题。
98 |
99 | 2、[灭火毯](https://www.thedrive.com/news/could-a-giant-fireproof-blanket-be-the-solution-for-stubborn-ev-battery-fires)
100 |
101 | 电动汽车着火是一个让人担心的安全问题,虽然概率很低,但终究是一个重大风险。更糟糕的是,某些电池着火,不能用水去浇,会越烧越旺。
102 |
103 | 
104 |
105 | 为了让车主放心,LG 公司发明了一种汽车灭火毯,采用阻燃材料制造,能够耐很高的温度。
106 |
107 | 
108 |
109 | 灭火毯平时放在后备箱,一旦出现电池着火,只要把它展开盖在车上,就能完全隔绝氧气,从而让火苗快速熄灭。
110 |
111 | 
112 |
113 | 3、[世界最短的跑道](https://www.arabianbusiness.com/industries/travel-hospitality/stunning-viral-video-shows-plane-land-on-dubais-burj-al-arab-helipad)
114 |
115 | 红牛饮料与迪拜旅游局策划了一次特技表演,让一架螺旋桨飞机成功在帆船酒店楼顶着陆。
116 |
117 | 
118 |
119 | 帆船酒店56层楼顶是一个直升机着陆坪,长度只有27米。这么短的长度,基本上不可能滑行着陆。
120 |
121 | 
122 |
123 | 为了实现这个目标,特技飞行员使用了一架改装的螺旋桨飞机,尽可能减轻重量,将惯性最小化,并且在地面上练习了650次着陆,耗时两年。
124 |
125 | 
126 |
127 | 4、[美国宇航服](https://www.theverge.com/2023/3/15/23641727/nasa-astronaut-spacesuit-artemis-iii-moon-axiom-space)
128 |
129 | 美国宇航局计划,人类2025年重新登陆月球。作为这个计划的一部分,上周三发布了新版的宇航服。
130 |
131 | 
132 |
133 | 旧版宇航服的一大缺点,就是不便于行动,这次的新版让宇航员可以舒适地行走、弯腰和蹲下。同时,头盔提供更好的视野,并配备了光带和高清摄像机,可以实时将宇航员看到的情景,用视频回传地球。
134 |
135 | 
136 |
137 | 这次亮相的宇航服是灰色的,美国宇航局说,最终可能还会改回白色。我猜想一大原因是,灰色太不利于电视直播了。
138 |
139 | ## 文章
140 |
141 | 1、[基于 GPT3.5 搭建定制化知识库](https://mp.weixin.qq.com/s?__biz=MzIyNDAzMzYxNQ==&mid=2652028778&idx=1&sn=985a386f915dea0d4dc97186af7c50b6&srcid=0316LqkslRQXM1UyluqQFTxe)(中文)
142 |
143 | 作者的一个小实验,通过 chatpdf.com 这个网站,将某个领域的文档(比如这份周刊)提供给 AI 训练,就会得到一个基于这些材料的问答引擎。([@ssyzyg](https://github.com/ruanyf/weekly/issues/2989) 投稿)
144 |
145 | 2、[如何与我一起工作](https://growth.eladgil.com/book/the-role-of-the-ceo/insights-working-with-claire/)(英文)
146 |
147 | Stripe 公司前首席运营官克莱尔写了一篇文章,告诉新同事怎么跟她相处,她的工作方式是什么。
148 |
149 | 
150 |
151 | 她认为,这样可以节省大家六个月的相互了解时间。这种方式值得借鉴。
152 |
153 | 3、[为什么同一个网址返回不同的内容?](https://csvbase.com/blog/2)(英文)
154 |
155 | 
156 |
157 | 同一个网址,浏览器访问与 curl 的命令行访问,得到的内容是不一样的,这是怎么回事?
158 |
159 | 4、[2023年的 PHP](https://stitcher.io/blog/php-in-2023)(英文)
160 |
161 | 
162 |
163 | 本文介绍了 PHP 在过去一年的发展,对于了解 PHP 的现状很有帮助。
164 |
165 | 5、[网页元素的 fetchpriority 属性](https://imkev.dev/fetchpriority-opportunity)(英文)
166 |
167 | HTML 网页种,`
`、``、`