[{"content":" 背景 金刻羽星期四（6月26日）在天津举行的世界经济论坛新领军者年会，发表看法： 中国若无法转型为消费大国就永远难成富裕国\n评价 金刻羽这个看法我是认同的，下面直接用AI评价。\ngemini 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 综上所述，金刻羽教授的观点“中国若无法转型为消费大国就永远难成富裕国”是具有深刻洞察力和重要现实意义的。它指出了中国经济发展中一个核心的结构性挑战和战略选择。 详细推理分析及其相关解释与说明： 经济增长模式的演变： 历史上，许多国家在工业化初期都依赖投资和出口实现高速增长。然而，当经济发展到一定阶段，劳动力成本上升、外部需求波动、环境承载压力增大等因素，使得这种模式的效率逐渐降低。此时，需要转向以内需，尤其是居民消费为主要驱动力的增长模式，以实现更可持续和高质量的发展。金刻羽教授强调的正是中国经济发展所处的这一关键转折点。 消费的本质： 消费不仅是经济活动的终点，更是生产和投资的最终目的。只有最终需求旺盛，才能有效带动产业发展、技术创新和就业增长。如果消费需求不足，即使生产能力再强，也容易导致产能过剩和经济内循环不畅。 内需拉动的韧性： 相较于依赖外部市场的出口，强大的国内消费市场能够为经济增长提供更为稳定的基础。在全球经济不确定性增加的背景下，内需的稳定增长能够有效缓冲外部冲击，提升经济的韧性和自主性。 与“富裕国”的关联： 一个“富裕国”的标志不仅是国民生产总值（GDP）的绝对量，更在于国民的普遍富裕程度、生活品质和消费能力。当一个国家大部分国民能够享受较高水平的消费，社会福利体系健全，这才是真正意义上的富裕。因此，转型为消费大国，是实现全体国民共同富裕的必由之路。 政策和结构性改革的支撑： 金刻羽教授提及将消费作为地方政绩考核标准，以及发展服务业、增加社会支出等，都指向了实现消费驱动型增长所需的深层次政策调整和结构性改革。这并非一蹴而就，需要政府在体制机制、收入分配、社会保障、市场开放等方面进行系统性改革。服务业特别是现代服务业的发展，不仅能创造大量就业机会，也能满足多元化的消费需求，是支撑消费经济的重要支柱。 国际关系考量： 长期依赖出口的模式可能导致贸易摩擦和国际关系紧张。通过提升国内消费来平衡内外需，有助于中国在国际贸易体系中扮演更负责任、更具建设性的角色，从而为自身发展创造更加有利的外部环境。 综上，金刻羽教授的观点不仅是对中国经济发展路径的理性分析，也为中国未来实现可持续繁荣和真正富裕指明了方向。其核心在于通过深化改革，构建一个以满足人民日益增长的美好生活需求为导向的、更健康、更具活力的经济体系。 chatgpt 1 2 3 金刻羽的论断具有充分逻辑和现实基础：中国若不能转型为消费大国，难以摆脱对出口和投资的依赖，致使消费不足拖累经济质量提升和财富积累。观点在结构转型路径、就业与收入支撑、国际经验借鉴等方面都站得住脚。但其落实难度不容忽视，需配合宏观制度改革、平衡制造与服务、营造内外需求共同驱动的经济新格局。 总结：金刻羽的观点精准指出了中国经济发展的结构矛盾，是一条切实可行的富裕国家路径。然而其实现需要系统改革与长期努力，是战略方向上的“对”，但短期落实需兼顾多重约束因素。 1 2 3 4 5 6 7 8 9 金刻羽的核心论断在逻辑上严密，国际上有明确可比的经验路径，符合当前中国结构性调整的必要性： ✅ 合理性强：从“出口—投资”导向转向“消费—服务”导向，是经济高质量发展的必然趋势； ✅ 风险提醒准确：若不能建立强内需循环，则面临“中等收入陷阱”、“就业不足”与“结构性通缩”风险； ✅ 政策现实可行性有挑战：关键不在认知，而在财政、服务业开放、政绩制度改革等领域能否真正突破。 📌 结论：“不能成为消费大国就难成富裕国”并非一种警句式判断，而是一种结构性、政策性和发展逻辑上的必然趋势提醒。其提出对中国在全球经济分化与内部转型阶段具有高度指导价值，但成功路径依赖于结构改革的深度与执行力 腾讯元宝 1 2 3 4 5 6 7 最终评价： 金刻羽的观点总体具有战略前瞻性，抓住了中国经济转型的核心矛盾，但其建议需结合以下补充： 多维改革：消费转型需与收入分配、社保、产业升级协同推进； 渐进式开放：服务业开放需平衡效率与公平，避免激进改革引发失业风险； 全球化新定位：中国可通过“内需+外需”双循环，而非单边收缩供应链。 结论：中国成为消费大国是迈向富裕国家的必要条件，但需配套系统性改革，且不能忽视生产端的科技创新与全球竞争力维护。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 最终评价与政策建议: 1. 金刻羽观点的合理性 消费转型是突破“中等收入陷阱”的关键，符合经济规律与国际经验。 中国当前模式（依赖投资/出口）已现疲态，改革迫在眉睫。 2. 局限性 未深入讨论收入分配、房价、社保等核心障碍； 服务业开放需配套监管，避免市场失灵。 3. 补充建议 短期：发放消费券、减税降费提振信心； 中期：改革社保、房产税，降低预防性储蓄； 长期：推动科技升级，避免“消费驱动”沦为“低端服务化”。 总结：中国成为消费大国是迈向富裕国家的必由之路，但需多维度、渐进式改革，而非简单复制他国路径。 中国居民消费的数据 2023年中国GDP同比增长5.2%,国内生产总值 (GDP):1260582亿元\n2023年我国最终消费支出701360.6亿元，其中居民消费支出493247.2亿元\n2024中美消费占比 中国GDP中消费占比和贡献率较低。2024年中国居民消费/GDP为39.9%，远低于同期美国的67.9%，同样是人均GDP为1.3万美元时，1980年美国的居民消费/GDP为61.3%。此外，从GDP支出法看，2024年中国最终消费支出/GDP为44.5%，低于美国同期的81.4%与1980年的77.1%。\n美国的居民消费占比是中国的1.7倍\n总结 AI都知道，问题出在哪。 决策者其实也是心知肚明，但却当作不知道，一直拖，一直温水煮青蛙。\n触动利益比触动灵魂还要难，所以，长路漫漫。\n","permalink":"https://myself659.github.io/post/economy/%E9%87%91%E5%88%BB%E7%BE%BD%E8%AF%B4%E4%B8%AD%E5%9B%BD%E8%8B%A5%E6%97%A0%E6%B3%95%E8%BD%AC%E5%9E%8B%E4%B8%BA%E6%B6%88%E8%B4%B9%E5%A4%A7%E5%9B%BD%E5%B0%B1%E6%B0%B8%E8%BF%9C%E9%9A%BE%E6%88%90%E5%AF%8C%E8%A3%95%E5%9B%BD/","summary":"\u003chr\u003e\n\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e金刻羽星期四（6月26日）在天津举行的世界经济论坛新领军者年会，发表看法： \u003ca href=\"https://www.zaobao.com/finance/china/story20250626-6978972\"\u003e中国若无法转型为消费大国就永远难成富裕国\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"评价\"\u003e评价\u003c/h2\u003e\n\u003cp\u003e金刻羽这个看法我是认同的，下面直接用AI评价。\u003c/p\u003e\n\u003ch3 id=\"gemini\"\u003egemini\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e综上所述，金刻羽教授的观点“中国若无法转型为消费大国就永远难成富裕国”是具有深刻洞察力和重要现实意义的。它指出了中国经济发展中一个核心的结构性挑战和战略选择。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e详细推理分析及其相关解释与说明：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e经济增长模式的演变： 历史上，许多国家在工业化初期都依赖投资和出口实现高速增长。然而，当经济发展到一定阶段，劳动力成本上升、外部需求波动、环境承载压力增大等因素，使得这种模式的效率逐渐降低。此时，需要转向以内需，尤其是居民消费为主要驱动力的增长模式，以实现更可持续和高质量的发展。金刻羽教授强调的正是中国经济发展所处的这一关键转折点。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e消费的本质： 消费不仅是经济活动的终点，更是生产和投资的最终目的。只有最终需求旺盛，才能有效带动产业发展、技术创新和就业增长。如果消费需求不足，即使生产能力再强，也容易导致产能过剩和经济内循环不畅。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e内需拉动的韧性： 相较于依赖外部市场的出口，强大的国内消费市场能够为经济增长提供更为稳定的基础。在全球经济不确定性增加的背景下，内需的稳定增长能够有效缓冲外部冲击，提升经济的韧性和自主性。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e与“富裕国”的关联： 一个“富裕国”的标志不仅是国民生产总值（GDP）的绝对量，更在于国民的普遍富裕程度、生活品质和消费能力。当一个国家大部分国民能够享受较高水平的消费，社会福利体系健全，这才是真正意义上的富裕。因此，转型为消费大国，是实现全体国民共同富裕的必由之路。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e政策和结构性改革的支撑： 金刻羽教授提及将消费作为地方政绩考核标准，以及发展服务业、增加社会支出等，都指向了实现消费驱动型增长所需的深层次政策调整和结构性改革。这并非一蹴而就，需要政府在体制机制、收入分配、社会保障、市场开放等方面进行系统性改革。服务业特别是现代服务业的发展，不仅能创造大量就业机会，也能满足多元化的消费需求，是支撑消费经济的重要支柱。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e国际关系考量： 长期依赖出口的模式可能导致贸易摩擦和国际关系紧张。通过提升国内消费来平衡内外需，有助于中国在国际贸易体系中扮演更负责任、更具建设性的角色，从而为自身发展创造更加有利的外部环境。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e综上，金刻羽教授的观点不仅是对中国经济发展路径的理性分析，也为中国未来实现可持续繁荣和真正富裕指明了方向。其核心在于通过深化改革，构建一个以满足人民日益增长的美好生活需求为导向的、更健康、更具活力的经济体系。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"chatgpt\"\u003echatgpt\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e金刻羽的论断具有充分逻辑和现实基础：中国若不能转型为消费大国，难以摆脱对出口和投资的依赖，致使消费不足拖累经济质量提升和财富积累。观点在结构转型路径、就业与收入支撑、国际经验借鉴等方面都站得住脚。但其落实难度不容忽视，需配合宏观制度改革、平衡制造与服务、营造内外需求共同驱动的经济新格局。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e总结：金刻羽的观点精准指出了中国经济发展的结构矛盾，是一条切实可行的富裕国家路径。然而其实现需要系统改革与长期努力，是战略方向上的“对”，但短期落实需兼顾多重约束因素。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e9\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e金刻羽的核心论断在逻辑上严密，国际上有明确可比的经验路径，符合当前中国结构性调整的必要性：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e✅ 合理性强：从“出口—投资”导向转向“消费—服务”导向，是经济高质量发展的必然趋势；\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e✅ 风险提醒准确：若不能建立强内需循环，则面临“中等收入陷阱”、“就业不足”与“结构性通缩”风险；\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e✅ 政策现实可行性有挑战：关键不在认知，而在财政、服务业开放、政绩制度改革等领域能否真正突破。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e📌 结论：“不能成为消费大国就难成富裕国”并非一种警句式判断，而是一种结构性、政策性和发展逻辑上的必然趋势提醒。其提出对中国在全球经济分化与内部转型阶段具有高度指导价值，但成功路径依赖于结构改革的深度与执行力\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"腾讯元宝\"\u003e腾讯元宝\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e最终评价：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e金刻羽的观点总体具有战略前瞻性，抓住了中国经济转型的核心矛盾，但其建议需结合以下补充：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e多维改革：消费转型需与收入分配、社保、产业升级协同推进；\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e渐进式开放：服务业开放需平衡效率与公平，避免激进改革引发失业风险；\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e全球化新定位：中国可通过“内需+外需”双循环，而非单边收缩供应链。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e结论：中国成为消费大国是迈向富裕国家的必要条件，但需配套系统性改革，且不能忽视生产端的科技创新与全球竞争力维护。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e最终评价与政策建议:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e1. 金刻羽观点的合理性\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e消费转型是突破“中等收入陷阱”的关键，符合经济规律与国际经验。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e中国当前模式（依赖投资/出口）已现疲态，改革迫在眉睫。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2. 局限性\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e未深入讨论收入分配、房价、社保等核心障碍；\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e服务业开放需配套监管，避免市场失灵。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e3. 补充建议\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e短期：发放消费券、减税降费提振信心；\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e中期：改革社保、房产税，降低预防性储蓄；\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e长期：推动科技升级，避免“消费驱动”沦为“低端服务化”。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e总结：中国成为消费大国是迈向富裕国家的必由之路，但需多维度、渐进式改革，而非简单复制他国路径。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"中国居民消费的数据\"\u003e中国居民消费的数据\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://www.gov.cn/zhengce/jiedu/tujie/202401/content_6926657.htmZ\"\u003e2023年中国GDP同比增长5.2%,国内生产总值 (GDP):1260582亿元\u003c/a\u003e\u003c/p\u003e","title":"金刻羽说中国若无法转型为消费大国就永远难成富裕国"},{"content":" 背景 最近花时间学习了Andrej Karpathy最新的分享：Software Is Changing (Again)。\n这里总结一下对“AI is the new electricity”的思考。\nAI与electricity的相似之处 AI与electricity有很多相通之处：\nelectricity在现实几乎服务每一个人，现在以LLM为代表的AI已经有超过十亿用户，未来会有更多的用户，未来 AI 使用将像用电一样常态化、普适化\nelectricity为各行各业提供电能，AI为各行各业提供模型与算力。\nelectricity需要建立电厂，AI需要训练模型。\nelectricity与AI都有日常的运营开支\n可计量的付费模式：electricity用度（kwh）来计费，AI用token来计费\n接口标准： electricity有通用的电压与接口，LLM有统一的协议如OpenAI API 格式\n供应商选择与切换： 电源切换器（transfer switch）vs OpenRouter\n连接与使用： 电网 vs 互联网\n负载容量： 都是有限，都会遇到过载的问题\n\u0026hellip;\n总结 “AI is the new electricity” 表示 AI 技术正如 20 世纪的电力一样，从科研成果转变为推动整个社会转型的基础设施。AI与electricity的相似之处说明了 AI 系统在逐步具备“电力公用事业”的属性。随着这些特性强化，AI 将像电力一样成为现代社会不可或缺、无所不在的底层能力平台。\n“AI is the new electricity” 这一类比，可以方便我们从电力发展与应用的历史中找到一些宝贵的经验，指导如何开发与应用AI。 如LLM可以看作“电源”：\n智能“电源”类型 电力类比 描述 超级大模型（如 GPT-4） 核电/水电站 高功率、稳定性强，但训练和运行成本极高 轻量模型 分布式光伏或风电 部分任务自给自足，响应快，部署简单 微调模型/LoRA 家庭 UPS 电池 针对特定任务（如企业客服）优化，轻巧但智能深度有限 开源模型（如LLaMA） 民间发电机 自建，但维护难度大，对技术团队要求高；适合国家级、企业主权部署使用 ","permalink":"https://myself659.github.io/post/ai/ai-is-the-new-electricity/","summary":"\u003chr\u003e\n\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e最近花时间学习了Andrej Karpathy最新的分享：\u003ca href=\"https://www.youtube.com/watch?v=LCEmiRjPEtQ\"\u003eSoftware Is Changing (Again)\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e这里总结一下对“AI is the new electricity”的思考。\u003c/p\u003e\n\u003ch2 id=\"ai与electricity的相似之处\"\u003eAI与electricity的相似之处\u003c/h2\u003e\n\u003cp\u003eAI与electricity有很多相通之处：\u003c/p\u003e","title":"thoughts about: AI is the new electricity"},{"content":" 背景 最近花时间学习了Andrej Karpathy最新的分享：Software Is Changing (Again)。\n这里面的知识点很多，干货十足。\n这里先从software 1.0 vs software 2.0 vs software 3.0开始。\n如何比较 我们将从以下五个角度继续细化剖析：\n编程范式：谁在“写程序”？程序长什么样？\n交互方式：人与计算机如何沟通？\n学习方式：软件是如何学习？\n泛化能力：能做哪些任务？需不需要从头训练？\n系统架构与输入输出形式：系统input、process、output之间的差异。\n编程范式（Programming Paradigm） 特征 Software 1.0 Software 2.0 Software 3.0 编程者（人）角色 明确写出所有逻辑（if/else等） 准备数据并设计模型结构 提示工程师，编写自然语言提示 程序的本质 人写的代码（deterministic） 参数训练出的权重（non-symbolic） Prompt 作为控制逻辑（可变，灵活） 表达能力 有限：只能表示明确规则 中：可以逼近复杂模式 高：语言可描述几乎所有逻辑与上下文 从“利用编程语言写规则”转变为“利用自然语言描述任务”： 代码code→权重weight→提示词Prompt\n交互方式（Human-Computer Interaction） 特征 Software 1.0 Software 2.0 Software 3.0 交互接口 编译器、IDE、命令行 调用API、训练模型 自然语言对话界面、提示输入框 任务分配方式 人全权指定 人提供目标+数据，模型自学习 人通过语言表述意图，模型自适应 实时反馈性 低 低（需重训练） 高（可即时理解和响应） 人类指令变得越来越像“对话”而不是“控制”： 编程语言的控制（control）→抽象API的调用（call）→自然语言的对话（Chat）\n学习方式（Learning） 特征 Software 1.0 Software 2.0 Software 3.0 学习来源 无，全部人类输入 从大量数据中自动学习 通过大量语料预训练，再用少量示例调整 是否可迁移 否，程序只做一件事 否，模型常常为一个任务设计 是，同一LLM可处理多任务，零样本或少样本即可 对错误的反应 人修改代码 重新训练模型 只需修改提示词（prompt）即可尝试修复 从“静态逻辑”变为“动态适应”： 修改代码 → 训练模型 → 修改提示词\n泛化能力（Generalization） 特征 Software 1.0 Software 2.0 Software 3.0 跨任务能力 无，每写一个程序解决一个问题 弱，迁移学习困难 强，同一模型可做总结、翻译、推理、编程等任务 多语言、多模态 支持差，需重新开发 可能支持部分 强，多语言+多模态+多任务融合 从具体到通用： 为具体任务建模 → 为一类任务训练模型 → 提供通用模型实现提示词完成各种任务\n系统结构与输入输出（System Architecture \u0026amp; IO） 特征 Software 1.0 Software 2.0 Software 3.0 系统结构 冯·诺依曼结构 + 手写程序 神经网络结构（如CNN、RNN） Transformer结构 + 超大参数（\u0026gt;100B） 输入形式 明确命令、变量 向量表示（one-hot/bag-of-words） 自然语言/图像/语音等各种多模态输入 输出形式 控制信号、字符串、图形界面 类别、概率、数值等 文本、代码、图像描述等多样信息 从指令到自然语言： 结构化指令 → 向量（矩阵）输入/输出 → 自然语言输入输出\n总结 Software 1.0：人类 → 规则 → 程序 → 计算机\nSoftware 2.0：人类 → 数据 → 训练 → 神经网络\nSoftware 3.0：人类 → Prompt → LLM\n","permalink":"https://myself659.github.io/post/aip/software-1vs2vs3/","summary":"\u003chr\u003e\n\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e最近花时间学习了Andrej Karpathy最新的分享：\u003ca href=\"https://www.youtube.com/watch?v=LCEmiRjPEtQ\"\u003eSoftware Is Changing (Again)\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e这里面的知识点很多，干货十足。\u003c/p\u003e\n\u003cp\u003e这里先从software 1.0 vs software 2.0 vs software 3.0开始。\u003c/p\u003e","title":"software 1.0 vs software 2.0 vs software 3.0"},{"content":"install CUDA Toolkit first, from CUDA Toolkit Archive to choose CUDA Toolkit to download.\nwe choose the version: CUDA Toolkit 12.4.1.\n1 2 3 4 5 6 ❯ nvcc --version nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2024 NVIDIA Corporation Built on Thu_Mar_28_02:30:10_Pacific_Daylight_Time_2024 Cuda compilation tools, release 12.4, V12.4.131 Build cuda_12.4.r12.4/compiler.34097967_0 install cuDNN from cuDNN Archive to choose cuDNN to download.\nwe choose the version: cuDNN 9.1.0.\ninstall pytorch Get pip cmd from Installing previous versions of PyTorch\nwe choose torch==2.4.0:\n1 pip install torch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 --index-url https://download.pytorch.org/whl/cu124 Check GPU（cuda）:\n1 2 3 4 \u0026gt;\u0026gt;\u0026gt; import torch \u0026gt;\u0026gt;\u0026gt; torch.cuda.is_available() True \u0026gt;\u0026gt;\u0026gt; ","permalink":"https://myself659.github.io/post/devops/win11-cuda/","summary":"\u003ch2 id=\"install-cuda-toolkit\"\u003einstall CUDA Toolkit\u003c/h2\u003e\n\u003cp\u003efirst, from \u003ca href=\"https://developer.nvidia.com/cuda-toolkit-archive\"\u003eCUDA Toolkit Archive\u003c/a\u003e to choose CUDA Toolkit to download.\u003c/p\u003e\n\u003cp\u003ewe choose the version: CUDA Toolkit 12.4.1.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e❯\u003c/span\u003e \u003cspan class=\"n\"\u003envcc\u003c/span\u003e  \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eversion\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003envcc\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eNVIDIA\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eR\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eCuda\u003c/span\u003e \u003cspan class=\"n\"\u003ecompiler\u003c/span\u003e \u003cspan class=\"n\"\u003edriver\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eCopyright\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"mi\"\u003e2005\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2024\u003c/span\u003e \u003cspan class=\"n\"\u003eNVIDIA\u003c/span\u003e \u003cspan class=\"n\"\u003eCorporation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eBuilt\u003c/span\u003e \u003cspan class=\"n\"\u003eon\u003c/span\u003e \u003cspan class=\"n\"\u003eThu_Mar_28_02\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e30\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"n\"\u003e_Pacific_Daylight_Time_2024\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eCuda\u003c/span\u003e \u003cspan class=\"n\"\u003ecompilation\u003c/span\u003e \u003cspan class=\"n\"\u003etools\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erelease\u003c/span\u003e \u003cspan class=\"mf\"\u003e12.4\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eV12\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e4.131\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eBuild\u003c/span\u003e \u003cspan class=\"n\"\u003ecuda_12\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e4.\u003c/span\u003e\u003cspan class=\"n\"\u003er12\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecompiler\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e34097967\u003c/span\u003e\u003cspan class=\"n\"\u003e_0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"install-cudnn\"\u003einstall cuDNN\u003c/h2\u003e\n\u003cp\u003efrom \u003ca href=\"https://developer.nvidia.com/cudnn-archive\"\u003ecuDNN Archive\u003c/a\u003e to choose cuDNN to download.\u003c/p\u003e\n\u003cp\u003ewe choose the version: cuDNN 9.1.0.\u003c/p\u003e\n\u003ch2 id=\"install-pytorch\"\u003einstall pytorch\u003c/h2\u003e\n\u003cp\u003eGet pip cmd from \u003ca href=\"https://pytorch.org/get-started/previous-versions/\"\u003eInstalling previous versions of PyTorch\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ewe choose torch==2.4.0:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epip\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e \u003cspan class=\"n\"\u003etorch\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"mf\"\u003e2.4\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"n\"\u003etorchvision\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.19\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"n\"\u003etorchaudio\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"mf\"\u003e2.4\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003edownload\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epytorch\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eorg\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewhl\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecu124\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003eCheck GPU（cuda）:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt;\u0026gt;\u0026gt; import torch\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt;\u0026gt;\u0026gt; torch.cuda.is_available() \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTrue\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt;\u0026gt;\u0026gt; \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"setup CUDA development environment on windows11"},{"content":"steps 1. download ollama Download from the Ollama official website\n2. install 1 .\\OllamaSetup.exe /DIR=\u0026#34;d:\\ollama\\\u0026#34; 3. set the environment variable OLLAMA_MODELS Ollama default stores downloaded models in C:\\Users%username%.ollama\\models\n4. pull model 1 ollama pull llama3.1 1 2 3 PS C:\\Windows\\System32\u0026gt; ollama list NAME ID SIZE MODIFIED llama3.1:latest a340353013fd 4.7 GB 30 seconds ago 5. run model 1 ollama run llama3.1 6. show llama work 1 ollama ps reference Introducing Llama 3.1: Our most capable models to date Introducing Meta Llama 3: The most capable openly available LLM to date Ollama Windows ","permalink":"https://myself659.github.io/post/ai/how-to-setup-llama-on-windows/","summary":"\u003ch2 id=\"steps\"\u003esteps\u003c/h2\u003e\n\u003ch3 id=\"1-download-ollama\"\u003e1. download ollama\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://ollama.com/download\"\u003eDownload from the Ollama official website\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"2-install\"\u003e2. install\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e.\\OllamaSetup.exe /DIR=\u0026#34;d:\\ollama\\\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"3-set-the-environment-variable-ollama_models\"\u003e3. set the environment variable OLLAMA_MODELS\u003c/h3\u003e\n\u003cp\u003eOllama default stores downloaded models in C:\\Users%username%.ollama\\models\u003c/p\u003e\n\u003ch3 id=\"4-pull-model\"\u003e4. pull model\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eollama  pull llama3.1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePS C:\\Windows\\System32\u0026gt; ollama  list\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNAME            ID              SIZE    MODIFIED\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ellama3.1:latest a340353013fd    4.7 GB  30 seconds ago\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"5-run--model\"\u003e5. run  model\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eollama  run llama3.1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"6-show-llama-work\"\u003e6. show llama work\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eollama ps\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"reference\"\u003ereference\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://ai.meta.com/blog/meta-llama-3-1/\"\u003eIntroducing Llama 3.1: Our most capable models to date\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://ai.meta.com/blog/meta-llama-3/\"\u003eIntroducing Meta Llama 3: The most capable openly available LLM to date\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ollama/ollama/blob/main/docs/windows.md\"\u003eOllama Windows\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e","title":"how to setup llama with ollama on windows"},{"content":"you become what you surround yourself with You become what you eat you become what you believe you become what you think you become what you measure you become what you focus on you become what you do you become what you repeat ","permalink":"https://myself659.github.io/post/life/you-became/","summary":"\u003ch2 id=\"you-become-what-you-surround-yourself-with\"\u003eyou become what you surround yourself with\u003c/h2\u003e\n\u003ch2 id=\"you-become-what-you-eat\"\u003eYou become what you eat\u003c/h2\u003e\n\u003ch2 id=\"you-become-what-you-believe\"\u003eyou become what you believe\u003c/h2\u003e\n\u003ch2 id=\"you-become-what-you-think\"\u003eyou become what you think\u003c/h2\u003e\n\u003ch2 id=\"you-become-what-you-measure\"\u003eyou become what you measure\u003c/h2\u003e\n\u003ch2 id=\"you-become-what-you-focus-on\"\u003eyou become what you focus on\u003c/h2\u003e\n\u003ch2 id=\"you-become-what-you-do\"\u003eyou become what you do\u003c/h2\u003e\n\u003ch2 id=\"you-become-what-you-repeat\"\u003eyou become what you repeat\u003c/h2\u003e","title":"you became"},{"content":"install 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # On macOS and Linux curl -LsSf https://astral.sh/uv/install.sh | sh # On Windows powershell -c \u0026#34;irm https://astral.sh/uv/install.ps1 | iex\u0026#34; powershell -ExecutionPolicy ByPass -c \u0026#34;irm https://astral.sh/uv/install.ps1 | iex\u0026#34; scoop install uv # With pip (if you must, not the preferred way though) pip install uv # on macOS brew install uv eval \u0026#34;$(uv generate-shell-completion zsh)\u0026#34; set UV_CACHE_DIR By default, the cache is stored in $XDG_CACHE_HOME/uv or $HOME/.cache/uv on Unix and %LOCALAPPDATA%\\uv\\cache on Windows.\nsetup a new project init 1 2 uv init uv_template --app cd uv_template the folder structure:\n1 2 3 4 5 6 7 ❯ dust 0B ┌── README.md │█ │ 0% 57B │ ┌── __init__.py│█████████████████ │ 20% 57B │ ┌─┴ uv_template │█████████████████ │ 20% 57B ├─┴ src │█████████████████ │ 20% 232B ├── pyproject.toml │██████████████████████████████████████████████████████████████████████ │ 80% 289B ┌─┴ . │██████████████████████████████████████████████████████████████████████████████████████ │ 100% the pyproject.toml file which will look like this:\n1 2 3 4 5 6 7 8 9 10 11 12 ❯ cat .\\pyproject.toml [project] name = \u0026#34;uv-template\u0026#34; version = \u0026#34;0.1.0\u0026#34; description = \u0026#34;Add your description here\u0026#34; readme = \u0026#34;README.md\u0026#34; requires-python = \u0026#34;\u0026gt;=3.10\u0026#34; dependencies = [] [build-system] requires = [\u0026#34;hatchling\u0026#34;] build-backend = \u0026#34;hatchling.build\u0026#34; python List available Python versions 1 uv python list install python 1 2 3 4 5 6 # install a specific Python version uv python install 3.10.6 # install within a version range uv python install \u0026#39;\u0026gt;=3.8,\u0026lt;3.10\u0026#39; Use a specific Python version in a project 1 uv python use \u0026lt;version\u0026gt; Pin the Python version for a project 1 uv python pin setup virtualenv create virtual environment 1 uv venv --python 3.10.6 activate venv 1 .venv\\Scripts\\activate.ps1 install pip for venv 1 .venv/Scripts/python.exe -m ensurepip --upgrade install ipykernel for venv 1 .venv/Scripts/python.exe -m pip install ipykernel -U --force-reinstall 1 uv add ipykernel Remove a virtual environment 1 uv remove Reinstall all dependencies in the virtual environment 1 uv sync –reinstall tool 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 uv tool install black uv tool run ruff uv tool dir uv tool upgrade –all # update shell (if needed) uv tool update-shell # check files or directories uv tool run ruff check uv tool install --force --python python3.12 aider-chat@latest packages View Dependency Tree 1 uv tree install 1 uv add tqdm after add tqdm, the pyproject.toml file which will look like this:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 ❯ cat .\\pyproject.toml [project] name = \u0026#34;uv-template\u0026#34; version = \u0026#34;0.1.0\u0026#34; description = \u0026#34;Add your description here\u0026#34; readme = \u0026#34;README.md\u0026#34; requires-python = \u0026#34;\u0026gt;=3.10\u0026#34; dependencies = [ \u0026#34;tqdm\u0026gt;=4.66.5\u0026#34;, ] [build-system] requires = [\u0026#34;hatchling\u0026#34;] build-backend = \u0026#34;hatchling.build\u0026#34; 1 uv pip install requests 1 2 3 4 FROM python:3.11-bookworm RUN uv pip install - upgrade pip setuptools wheel COPY requirements.txt . RUN uv pip install -r requirements.txt uninstall 1 uv remove pandas turn pyproject.toml to requirements.txt 1 uv pip compile pyproject.toml -o requirements.txt 1 2 3 4 5 6 7 8 # Generate locked requirements uv pip compile requirements.in -o requirements.lock # Upgrade dependencies uv pip compile requirements.in --upgrade -o requirements.lock # Platform-specific locking uv pip compile requirements.in --platform=linux --python-version=3.10 -o requirements.lock sync 1 2 # Install dependencies from pyproject.toml uv sync 1 uv pip sync 1 uv sync -p 3.12 1 uv pip sync requirements.txt Upgrading Dependency Versions 1 2 3 4 5 6 7 8 9 10 11 # upgrade a specific package uv lock --upgrade-package pandas # upgrade multiple packages uv lock --upgrade-package numpy scipy matplotlib # upgrade all dependencies uv lock --upgrade # dry run to see potential upgrades without applying uv lock --upgrade --dry-run tool pytest 1 uv tool install --python 3.11 pytest run 1 2 3 4 5 6 # app.py import requests from rich.pretty import pprint response = requests.get(\u0026#34;https://peps.python.org/api/peps.json\u0026#34;) data = response.json() pprint([(k, v[\u0026#34;title\u0026#34;]) for k, v in data.items()][:10]) 1 uv add --script app.py \u0026#39;requests\u0026lt;3\u0026#39; \u0026#39;rich\u0026#39; 1 uv run - python 3.10 app.py cache 1 2 3 4 5 6 7 8 # Clear UV’s cache before critical updates uv cache clean # Force a fresh installation uv install --force # removes all unused cache entries uv cache prune reference uv cli\n","permalink":"https://myself659.github.io/post/devops/python-uv-setup/","summary":"\u003ch2 id=\"install\"\u003einstall\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# On macOS and Linux\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -LsSf https://astral.sh/uv/install.sh | sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# On Windows\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epowershell -c \u0026#34;irm https://astral.sh/uv/install.ps1 | iex\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epowershell -ExecutionPolicy ByPass -c \u0026#34;irm https://astral.sh/uv/install.ps1 | iex\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003escoop install uv\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# With pip (if you must, not the preferred way though)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install uv\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# on macOS \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew install uv\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eeval \u0026#34;$(uv generate-shell-completion zsh)\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"set-uv_cache_dir\"\u003eset UV_CACHE_DIR\u003c/h2\u003e\n\u003cp\u003eBy default, the cache is stored in $XDG_CACHE_HOME/uv or $HOME/.cache/uv on Unix and %LOCALAPPDATA%\\uv\\cache on Windows.\u003c/p\u003e","title":"setup uv for python development"},{"content":"context someone will stay in the level they have stayed. They can not levelup themself.\nThe reasons could be as follows.\nthey lost in the unknown-unknown they do not take really effective feedback they are not proactive but always waiting they fear of failure and avoid difficulty they do not take action and iterate they stay in their comfort zone they maybe just start, but they do not make it done ","permalink":"https://myself659.github.io/post/learn/why-never-improve-levelup/","summary":"\u003ch2 id=\"context\"\u003econtext\u003c/h2\u003e\n\u003cp\u003esomeone will stay in the level they have stayed. They can not levelup themself.\u003c/p\u003e\n\u003cp\u003eThe reasons could be as follows.\u003c/p\u003e\n\u003ch2 id=\"they-lost-in-the-unknown-unknown\"\u003ethey lost in the unknown-unknown\u003c/h2\u003e\n\u003ch2 id=\"they-do-not-take-really-effective-feedback\"\u003ethey do not take really effective feedback\u003c/h2\u003e\n\u003ch2 id=\"they-are-not-proactive-but-always-waiting\"\u003ethey are not proactive but always waiting\u003c/h2\u003e\n\u003ch2 id=\"they-fear-of-failure-and-avoid-difficulty\"\u003ethey fear of failure and avoid difficulty\u003c/h2\u003e\n\u003ch2 id=\"they-do-not-take-action-and-iterate\"\u003ethey do not take action and iterate\u003c/h2\u003e\n\u003ch2 id=\"they-stay-in-their-comfort-zone\"\u003ethey stay in their comfort zone\u003c/h2\u003e\n\u003ch2 id=\"they-maybe-just-start-but-they-do-not-make-it-done\"\u003ethey maybe just start, but they do not make it done\u003c/h2\u003e","title":"why someone will never improve"},{"content":"install scoop 1 2 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression update scoop 1 scoop update install pyenv 1 scoop install pyenv setup python install python with pyenv 1 2 3 pyenv install 3.10.0 pyenv local 3.10.0 install poetry 1 pip install poetry configure poetry in: %APPDATA%\\pypoetry\n1 2 3 4 [virtualenvs] in-project = true virtualenvs.prefer-active-python = true prefer-active-python = true install jupyter 1 pip install jupyterlab install ipython 1 pip install ipykernel ","permalink":"https://myself659.github.io/post/devops/windows-python-setup/","summary":"\u003ch2 id=\"install-scoop\"\u003einstall scoop\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSet-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eInvoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"update-scoop\"\u003eupdate scoop\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003escoop update \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"install-pyenv\"\u003einstall pyenv\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003escoop install pyenv\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"setup-python\"\u003esetup python\u003c/h2\u003e\n\u003ch3 id=\"install-python-with-pyenv\"\u003einstall python with pyenv\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv install 3.10.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv local 3.10.0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"install-poetry\"\u003einstall poetry\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install poetry\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003econfigure poetry in: %APPDATA%\\pypoetry\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[virtualenvs]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ein-project = true\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evirtualenvs.prefer-active-python = true\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprefer-active-python = true\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"install-jupyter\"\u003einstall jupyter\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install jupyterlab \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"install-ipython\"\u003einstall ipython\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install ipykernel\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"setup python development on windows11"},{"content":"Block out any distractions turn off all phone notifications or leave it in another room\nDistraction is the biggest enemy to deep focus\nGo for a walk before starting Go out in nature\nExplore somewhere new\nPlan it out the night before Set your main 3 priorities\nWrite them down and forget until morning\nBlout out time around your schedule (Eg: 6-8 am) This will be protectedtime\nStay consistant with that time\nEnsure diet is on point Eat food that\u0026rsquo;s good for your brain\nEat till your 80% full to avoid slumps\nUse pomodoro technique to break effectively Do 25 mins of work then take a 5 min break\nRepeate this 4-6 times\nEnsure you are completely hydrated Have a large water bottle near you at all time\nAim to get 1.5L down whilst you work\nExercise before you go into it Exercise = Endorphins = Good ideas\nDoesn\u0026rsquo;t have to be a marathon. can just be a short walk\nSet very clear, achievable goals Clear objectives = Clear results\nHave 3 tasks max\nHave an accountablity partner Have someone you message before and after\nTry choose someone who has a simiar mission\nMake sure you have slept well Mininum 6 hours sleep\nNo screen 2 hours before bed to improve REM sleep\nTake 1 task at a time (Don\u0026rsquo;t multitask) Different tasks = switching contexts = loss of focus\nOne at a time = Build momentum fast\n","permalink":"https://myself659.github.io/post/work/12steps-to-deep-focus/","summary":"\u003ch2 id=\"block-out-any-distractions\"\u003eBlock out any distractions\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eturn off all  phone notifications or leave it  in another room\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDistraction is the biggest enemy to  deep focus\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"go-for-a-walk-before-starting\"\u003eGo for a walk before starting\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eGo out in  nature\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eExplore somewhere  new\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"plan-it--out--the-night-before\"\u003ePlan it  out  the night before\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSet your main 3 priorities\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWrite them down and  forget  until morning\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"blout-out--time-around-your--schedule-eg-6-8-am\"\u003eBlout out  time around your  schedule (Eg: 6-8 am)\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThis will be protectedtime\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eStay consistant with that time\u003c/p\u003e","title":"principles for deep work"},{"content":"backgroud Time \u0026gt; Money.\ntips 1. The 2-Minute Rule If it takes less than 2 minutes, do it now, Yes, even if it\u0026rsquo;s getting up to stretch Procrastination is for stretching, not tasks!\n2. The 5-Minute Rule try it more than 5 minutes even the task is hard.\n3. Eat the Frog First Tackle the hardest task first thing in the morning, Frogs taste better when you\u0026rsquo;re notthinking about them all day.\n4. Pomodoro Technique Work for 25 minutes, then take a 5-minute break, Repeat, Because even tomatoes need a break!\n5. Make a To-Do List Write down your tasks. Checking them off feels like a tiny victory dance every time\n6. Set Alarms Use alarms to remind you of tasks, Because nothing says \u0026ldquo;Get back to work\u0026rdquo; like aphone screaming at you.\n7. 5s Rule 5-4-3-2-1, let us go.\n8. Delegate Share tasks with others, Remember, teamwork makes the dream work\n9. doing only one task Avoid Multitasking. Focus on one task at a time. Multitasking is just doing multiple things poorly at once.\n10. Use Apps andTools Utilize productivity apps, Let technology be the boss that tells you to get back towork.\n11. Break Tasks into Chunks Divide tasks into smaller, manageable parts, Eating an elephant is easier one bite at atime, not that you should eat elephants.\n12. Set Boundaries Learn to say no, Protect your time like it\u0026rsquo;s the last slice of pizza.\n13. Reward Yourself Give yourself a treat after completing tasks, Because who doesn\u0026rsquo;t work faster for chocolate?\n14. Keep a Calendar Schedule your tasks and appointments, Because remembering everything is folelephants and computers, not humans.\n15. Take Care ofYourself Get enough sleep, exercise, and eat well, A tired brain is like a computer runningWindows 95, Slow and prone to crash.\n16. Eliminate distractions Use social media blockers curing work hours, Facebook and Instagram can wait; yourresearch paper can\u0026rsquo;t.\n17. automate writing code or using tools to automate task.\n18. Reflect and Adjust Review your progress regularly and adjust as needed, lt\u0026rsquo;s like GPS rerouting you after a wrong turn.\n","permalink":"https://myself659.github.io/post/work/time-tips/","summary":"\u003ch2 id=\"backgroud\"\u003ebackgroud\u003c/h2\u003e\n\u003cp\u003eTime \u0026gt; Money.\u003c/p\u003e\n\u003ch2 id=\"tips\"\u003etips\u003c/h2\u003e\n\u003ch3 id=\"1-the-2-minute-rule\"\u003e1. The 2-Minute Rule\u003c/h3\u003e\n\u003cp\u003eIf it takes less than 2 minutes, do it now, Yes, even if it\u0026rsquo;s getting up to stretch Procrastination is for stretching, not tasks!\u003c/p\u003e\n\u003ch3 id=\"2-the-5-minute-rule\"\u003e2. The 5-Minute Rule\u003c/h3\u003e\n\u003cp\u003etry it more than 5 minutes even the task is hard.\u003c/p\u003e\n\u003ch3 id=\"3-eat-the-frog-first\"\u003e3. Eat the Frog First\u003c/h3\u003e\n\u003cp\u003eTackle the hardest task first thing in the morning, Frogs taste better when you\u0026rsquo;re notthinking about them all day.\u003c/p\u003e","title":"tips for time management"},{"content":"Install Rust 1 curl --proto \u0026#39;=https\u0026#39; --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y install solana CLI 1 sh -c \u0026#34;$(curl -sSfL https://release.anza.xyz/stable/install)\u0026#34; 1 solana --version Install Anchor CLI 1 2 3 sudo apt install build-essential cargo install --git https://github.com/coral-xyz/anchor avm --force 1 2 3 4 5 6 7 avm install latest avm use latest anchor --version install nvm and node 1 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash 1 2 export NVM_DIR=\u0026#34;$([ -z \u0026#34;${XDG_CONFIG_HOME-}\u0026#34; ] \u0026amp;\u0026amp; printf %s \u0026#34;${HOME}/.nvm\u0026#34; || printf %s \u0026#34;${XDG_CONFIG_HOME}/nvm\u0026#34;)\u0026#34; [ -s \u0026#34;$NVM_DIR/nvm.sh\u0026#34; ] \u0026amp;\u0026amp; \\. \u0026#34;$NVM_DIR/nvm.sh\u0026#34; # This loads nvm 1 2 nvm install node npm install --global yarn ","permalink":"https://myself659.github.io/post/devops/wsl-ubuntu-setup-solana/","summary":"\u003ch2 id=\"install-rust\"\u003eInstall Rust\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl --proto \u0026#39;=https\u0026#39; --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"install-solana-cli\"\u003einstall solana CLI\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esh -c \u0026#34;$(curl -sSfL https://release.anza.xyz/stable/install)\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esolana --version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"install-anchor-cli\"\u003eInstall Anchor CLI\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install build-essential\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecargo install --git https://github.com/coral-xyz/anchor avm --force\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eavm install latest\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eavm use latest\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eanchor --version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"install-nvm--and-node\"\u003einstall nvm  and node\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eexport\u003c/span\u003e \u003cspan class=\"n\"\u003eNVM_DIR\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;$([ -z \u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eXDG_CONFIG_HOME\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; ] \u0026amp;\u0026amp; printf \u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eHOME\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"o\"\u003e/.\u003c/span\u003e\u003cspan class=\"n\"\u003envm\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; || printf \u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eXDG_CONFIG_HOME\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003envm\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;$NVM_DIR/nvm.sh\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \\\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;$NVM_DIR/nvm.sh\u0026#34;\u003c/span\u003e \u003cspan class=\"c1\"\u003e# This loads nvm\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003envm install node\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm install --global yarn\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"A Step-by-Step Guide to Setting Up Solana on Ubuntu"},{"content":"show lsb-release before upgrade 1 2 3 4 5 6 cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=22.04 DISTRIB_CODENAME=jammy DISTRIB_DESCRIPTION=\u0026#34;Ubuntu 22.04.4 LTS\u0026#34; prepare open file with command is as follows:\n1 sudo nano /etc/update-manager/release-upgrades set Prompt=lts is as follows:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # Default behavior for the release upgrader. [DEFAULT] # Default prompting and upgrade behavior, valid options: # # never - Never check for, or allow upgrading to, a new release. # normal - Check to see if a new release is available. If more than one new # release is found, the release upgrader will attempt to upgrade to # the supported release that immediately succeeds the # currently-running release. # lts - Check to see if a new LTS release is available. The upgrader # will attempt to upgrade to the first LTS release available after # the currently-running one. Note that if this option is used and # the currently-running release is not itself an LTS release the # upgrader will assume prompt was meant to be normal. Prompt=lts CTRL+S to save, then CTRL+X to exit.\nupgrade 1 2 3 4 5 sudo apt update sudo apt upgrade -y sudo do-release-upgrade show lsb-release after upgrade 1 2 3 4 5 6 cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=24.04 DISTRIB_CODENAME=noble DISTRIB_DESCRIPTION=\u0026#34;Ubuntu 24.04 LTS\u0026#34; 1 2 uname -a Linux TX 5.15.146.1-microsoft-standard-WSL2 #1 SMP Thu Jan 11 04:09:03 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux 1 2 cat /proc/version Linux version 5.15.153.1-microsoft-standard-WSL2 (root@941d701f84f1) (gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.37) #1 SMP Fri Mar 29 23:14:13 UTC 2024 1 2 sudo dmesg | grep \u0026#34;Linux version\u0026#34; [ 0.000000] Linux version 5.15.153.1-microsoft-standard-WSL2 (root@941d701f84f1) (gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.37) #1 SMP Fri Mar 29 23:14:13 UTC 2024 1 2 3 4 5 6 7 8 9 10 hostnamectl Static hostname: TX Icon name: computer-container Chassis: container ☐ Machine ID: 185bf0b7091146ea8c39b2e32991d39e Boot ID: e8de24fe41ef41a197982dd3d33bfc3c Virtualization: wsl Operating System: Ubuntu 24.04 LTS Kernel: Linux 5.15.153.1-microsoft-standard-WSL2 Architecture: x86-64 The kernel is not upgraded for conservative reasons. For the specific kernel upgrade, please refer to here.\nproblems /dev/null: Permission denied problem description is as follows:\n1 2 3 /home/ia/.pyenv/bin/pyenv: line 23: /dev/null: Permission denied /home/ia/.pyenv/libexec/pyenv-hooks: line 24: /dev/null: Permission denied /home/ia/.pyenv/plugins/pyenv-virtualenv/bin/pyenv-sh-activate: line 78: /dev/null: Permission denied solution:\n1 sudo chmod 666 /dev/null ","permalink":"https://myself659.github.io/post/devops/wsl-ubuntu-upgrade/","summary":"\u003ch2 id=\"show-lsb-release-before--upgrade\"\u003eshow lsb-release before  upgrade\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecat  /etc/lsb-release\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDISTRIB_ID=Ubuntu\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDISTRIB_RELEASE=22.04\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDISTRIB_CODENAME=jammy\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDISTRIB_DESCRIPTION=\u0026#34;Ubuntu 22.04.4 LTS\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"prepare\"\u003eprepare\u003c/h2\u003e\n\u003cp\u003eopen file with command is as follows:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo nano /etc/update-manager/release-upgrades\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003eset \u003ccode\u003ePrompt=lts\u003c/code\u003e is as follows:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Default behavior for the release upgrader.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[DEFAULT]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Default prompting and upgrade behavior, valid options:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#  never  - Never check for, or allow upgrading to, a new release.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#  normal - Check to see if a new release is available.  If more than one new\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#           release is found, the release upgrader will attempt to upgrade to\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#           the supported release that immediately succeeds the\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#           currently-running release.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#  lts    - Check to see if a new LTS release is available.  The upgrader\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#           will attempt to upgrade to the first LTS release available after\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#           the currently-running one.  Note that if this option is used and\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#           the currently-running release is not itself an LTS release the\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#           upgrader will assume prompt was meant to be normal.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePrompt=lts\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003ccode\u003eCTRL+S\u003c/code\u003e  to save, then \u003ccode\u003eCTRL+X\u003c/code\u003e to exit.\u003c/p\u003e","title":"upgrade ubuntu in WSL"},{"content":"list before export 1 wsl -l -v 1 2 3 PS C:\\Users\\mysel\u0026gt; wsl -l -v NAME STATE VERSION * Ubuntu-22.04 Stopped 2 delete cache to reduce disk cost 1 rm -rf /home/ia/.cache/* export 1 wsl.exe --export Ubuntu-22.04 I:\\wslback\\Ubuntu-22.04.bak import 1 wsl.exe --import U22 i:\\wsl\\u22\\ d:\\wslback\\Ubuntu-22.04.bak run 1 wsl.exe -d U22 list after import 1 wsl -l -v 1 2 3 4 PS C:\\Users\\mysel\u0026gt; wsl -l -v NAME STATE VERSION * Ubuntu-22.04 Stopped 2 U22 Running 2 show location 1 Get-ChildItem HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Lxss | ForEach-Object {Get-ItemProperty $_.PSPath} | Select-Object DistributionName,BasePath access from explorer 1 \\\\wsl.localhost\\U22 add to Windows Terminal 1 2 3 4 5 6 7 8 { \u0026#34;commandline\u0026#34;: \u0026#34;wsl.exe -d U22\u0026#34;, \u0026#34;guid\u0026#34;: \u0026#34;{e5a83caa-4c73-52b3-ae6b-bc438d721ef9}\u0026#34;, \u0026#34;hidden\u0026#34;: false, \u0026#34;name\u0026#34;: \u0026#34;U22\u0026#34;, \u0026#34;source\u0026#34;: \u0026#34;CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\u0026#34;, \u0026#34;startingDirectory\u0026#34;: \u0026#34;~\u0026#34; }, ","permalink":"https://myself659.github.io/post/devops/wsl-move/","summary":"\u003ch2 id=\"list-before-export\"\u003elist before export\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewsl -l  -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePS C:\\Users\\mysel\u0026gt; wsl  -l  -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  NAME            STATE           VERSION\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e* Ubuntu-22.04    Stopped         2\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"delete-cache-to-reduce-disk-cost\"\u003edelete cache to reduce disk cost\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm  -rf /home/ia/.cache/*\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"export\"\u003eexport\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ewsl\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexe\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"k\"\u003eexport\u003c/span\u003e \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mf\"\u003e22.04\u003c/span\u003e  \u003cspan class=\"n\"\u003eI\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\\\u003cspan class=\"n\"\u003ewslback\u003c/span\u003e\\\u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mf\"\u003e22.04\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebak\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"import\"\u003eimport\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewsl.exe --import U22 i:\\wsl\\u22\\  d:\\wslback\\Ubuntu-22.04.bak\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"run\"\u003erun\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewsl.exe -d U22\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"list-after-import\"\u003elist after import\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewsl -l  -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePS C:\\Users\\mysel\u0026gt; wsl  -l  -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  NAME            STATE           VERSION\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e* Ubuntu-22.04    Stopped         2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  U22             Running         2\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"show-location\"\u003eshow location\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGet-ChildItem HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Lxss | ForEach-Object {Get-ItemProperty $_.PSPath} | Select-Object DistributionName,BasePath\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"access-from-explorer\"\u003eaccess from explorer\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\\\wsl.localhost\\U22\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"add-to--windows-terminal\"\u003eadd to  Windows Terminal\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u0026#34;commandline\u0026#34;: \u0026#34;wsl.exe -d U22\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u0026#34;guid\u0026#34;: \u0026#34;{e5a83caa-4c73-52b3-ae6b-bc438d721ef9}\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u0026#34;hidden\u0026#34;: false,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u0026#34;name\u0026#34;: \u0026#34;U22\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u0026#34;source\u0026#34;: \u0026#34;CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u0026#34;startingDirectory\u0026#34;: \u0026#34;~\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e},\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"WSL command: export, import"},{"content":"Install the GCC compiler 1 sudo apt install gcc --fix-missing Install Nvidia CUDA toolkit 1 sudo apt install nvidia-cuda-toolkit check the Driver and CUDA versions 1 2 nvidia-smi nvcc -V Install Python with Mamba 1 2 wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh bash Miniforge3-Linux-x86_64.sh 1 2 3 mamba create -n mycuda jupyterlab -c conda-forge mamba activate mycuda jupyter lab Testing Cuda Search nvidia control panel, and select “Allow access to GPU performance counters to all users”\n1 pip install torch numpy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import time matrix_size = 32*128 x= torch.randn(matrix_size, matrix_size) y= torch.randn(matrix_size,matrix_size) print(\u0026#34;***: CPU SPEED\u0026#34;) start = time.time() result = torch.matmul(x,y) print(time.time()- start) print(\u0026#34;verify device:\u0026#34;,result.device) x_gpu = x.to(device) y_gpu =y.to(device) torch.cuda.synchronize() for i in range(1): print(\u0026#34;---GPU SPEED---\u0026#34;) start = time.time() result_gpu = torch.matmul(x_gpu, y_gpu) torch.cuda.synchronize() print(time.time()- start) print(\u0026#34;verify device:\u0026#34;,result_gpu.device) output:\n1 2 3 4 5 6 ***: CPU SPEED 0.19979572296142578 verify device: cpu ---GPU SPEED--- 0.02033543586730957 verify device: cuda:0 ","permalink":"https://myself659.github.io/post/devops/wsl-cuda/","summary":"\u003ch2 id=\"install-the-gcc-compiler\"\u003eInstall the GCC compiler\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install gcc --fix-missing\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"install-nvidia-cuda-toolkit\"\u003eInstall Nvidia CUDA toolkit\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esudo\u003c/span\u003e \u003cspan class=\"n\"\u003eapt\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e \u003cspan class=\"n\"\u003envidia\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecuda\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etoolkit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"check-the-driver-and-cuda-versions\"\u003echeck the Driver and CUDA versions\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003envidia-smi\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003envcc -V\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"install-python-with-mamba\"\u003eInstall Python with Mamba\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ewget\u003c/span\u003e \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003egithub\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecom\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003econda\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eforge\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eminiforge\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ereleases\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elatest\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003edownload\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eMiniforge3\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eLinux\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ex86_64\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ebash\u003c/span\u003e \u003cspan class=\"n\"\u003eMiniforge3\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eLinux\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ex86_64\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emamba create -n mycuda jupyterlab -c conda-forge\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emamba activate mycuda \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejupyter lab   \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"testing-cuda\"\u003eTesting Cuda\u003c/h2\u003e\n\u003cp\u003eSearch nvidia control panel, and select “Allow access to GPU performance counters to all users”\u003c/p\u003e","title":"setup CUDA development environment in WSL2"},{"content":"what to do ? do the right thing\nhow to do? right do the thing\nwhat to done/got ? do the thing right\npriority do the right thing\nright do the thing\ndo the thing right\n","permalink":"https://myself659.github.io/post/done/do-the-thing-101/","summary":"\u003ch2 id=\"what-to-do-\"\u003ewhat to do ?\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003edo the right thing\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"how-to-do\"\u003ehow to do?\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eright do the thing\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"what-to-donegot-\"\u003ewhat to done/got ?\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003edo the thing right\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"priority\"\u003epriority\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003edo the right thing\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eright do the thing\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003edo the thing right\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e","title":"thoughts about do the thing"},{"content":"define Transurfing is a philosophy developed by Vadim Zeland that focuses on transforming one\u0026rsquo;s perception of reality and shaping life experience through the power of thought and intention1. It offers a set of twelve golden rules to guide practitioners in navigating life effortlessly\nEssence 1. Unification of Mind and Soul Inner Harmony: The unification and coordination of the mind and soul are at the core of Transurfing. The soul represents the deepest desires and truths, while the mind is responsible for logic and reason. Harmonizing the two leads to inner peace and alignment.\n2. Reducing the Importance of Goals Detachment: In pursuing goals, reduce excessive attachment to them to avoid tension and anxiety. This helps maintain inner calm and focus, making it easier to achieve goals.\n3. Visualization and Intention Clear Visualization: By vividly imagining each stage of the process of achieving a goal, enjoy and experience every step along the way, not just the final result.\nInternal and External Intention: Internal intention refers to personal effort and determination to achieve goals, while external intention involves deep belief and focus, trusting that goals will manifest naturally.\n4. Eliminating the Influence of Negative Energy Acknowledge and Ignore Pendulums: Recognize the existence of negative factors and lose interest in them, depriving them of their influence on your energy.\nFocus on Positive Energy: Choose to accept and transmit positive energy, creating a positive and harmonious environment, and avoid transmitting negative energy.\n5. Enjoying the Journey Happiness in the Journey: Happiness lies not only in achieving the goal but also in the joy and fulfillment experienced throughout the pursuit. Choose a goal that brings genuine happiness and find a path that inspires and motivates you.\n6. Simplifying Actions Going with the Flow: Achieve goals in the simplest and most effortless way, avoiding complexity and unnecessary resistance. By going with the flow, increase efficiency and reduce stress and anxiety.\nSummary The essence of Transurfing is to achieve goals and enjoy the journey by coordinating the inner self and the external world, unifying the mind and soul, using positive energy and visualization, and doing so in the simplest and most effortless way.\n","permalink":"https://myself659.github.io/post/done/essence-transurfing/","summary":"\u003ch2 id=\"define\"\u003edefine\u003c/h2\u003e\n\u003cp\u003eTransurfing is a philosophy developed by Vadim Zeland that focuses on transforming one\u0026rsquo;s perception of reality and shaping life experience through the power of thought and intention1. It offers a set of twelve golden rules to guide practitioners in navigating life effortlessly\u003c/p\u003e\n\u003ch2 id=\"essence\"\u003eEssence\u003c/h2\u003e\n\u003ch3 id=\"1-unification-of-mind-and-soul\"\u003e1. Unification of Mind and Soul\u003c/h3\u003e\n\u003cp\u003eInner Harmony: The unification and coordination of the mind and soul are at the core of Transurfing.\nThe soul represents the deepest desires and truths, while the mind is responsible for logic and reason.\nHarmonizing the two leads to inner peace and alignment.\u003c/p\u003e","title":"The Essence of Transurfing"},{"content":"requirement 1 2 3 4 5 6 7 8 sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev sudo apt-get install lzma sudo apt-get install liblzma-dev sudo apt-get install libbz2-dev sudo apt-get install python3-tk pyenv what is pyenv pyenv is for a Python version management + virtual environment tool.\ninstall pyenv 1 curl https://pyenv.run | bash pyenv\n1 2 3 echo \u0026#39;export PYENV_ROOT=\u0026#34;$HOME/.pyenv\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc echo \u0026#39;command -v pyenv \u0026gt;/dev/null || export PATH=\u0026#34;$PYENV_ROOT/bin:$PATH\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc echo \u0026#39;eval \u0026#34;$(pyenv init -)\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc 1 source ~/.bashrc usage List all available pyenv commands 1 pyenv commands List all available Python versions 1 pyenv install -l Installing specific Python versions 1 pyenv install 3.12.0 Uninstall a specific python version 1 pyenv uninstall 3.12.0 Show all Python versions 1 pyenv versions Setting the global Python version 1 pyenv global 3.12.0 Display the currently active Python version 1 pyenv version Display the full path to the Python version 1 pyenv which python Set a shell-specific Python version 1 pyenv shell 3.12.0 Unsets the shell version 1 pyenv shell --unset Set a local Python version 1 pyenv local 3.11.5 Unset the local Python version 1 pyenv local --unset install pyenv-virtualenv install pyenv-virtualenv 1 2 3 $ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv $ echo \u0026#39;eval \u0026#34;$(pyenv virtualenv-init -)\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc $ source ~/.bashrc pyenv-virtualenv\nusage Create a virtualenv by specifying the Python version with the name of the virtualenv directory 1 2 # Create a virtualenv called py377 using Python 3.7.7 $ pyenv virtualenv 3.7.7 py377 Set local virtualenv 1 2 3 4 # Set a local(direcotry) python environment to 377 $ pyenv local py377 (py377)$ cat .python-version py377 Remove a local virtualenv 1 $ rm .python-version Delete a virtualenv 1 $ pyenv virtualenv-delete py377 Activate a virtualenv 1 $ pyenv activate py377 When you activate a virtulaenv, the virtualenv will override the local virtualenv.\nDeactivate the virtualenv 1 pyenv deactivate pipenv what is pipenv pipenv is a Python package management and virtual environment tool.\ninstall 1 python -m pip install pipenv pipenv usage Create a new virtualenv 1 pipenv --python 3.11.5 install Installing packages 1 pipenv install eth-ape\u0026#39;[recommended-plugins]\u0026#39; Produces a command within the virtualenv 1 pipenv shell Install all packages specified in Pipfile.lock 1 pipenv sync Install all dependencies including dev 1 pipenv install --dev Show a graph of your installed dependencies 1 pipenv graph Create a lockfile containing pre-releases 1 pipenv lock --pre Checks for security vulnerabilitie 1 pipenv check Uninstall a provided package and removes it from Pipfile 1 pipenv uninstall Uninstall all packages not specified in Pipfile.lock 1 pipenv clean Locate the project 1 pipenv --where Locate the virtualenv 1 pipenv --venv Remove project virtualenv from current directory 1 pipenv --rm jupyter install 1 pip install ipykernel jupyter jupyter_cms ipython ","permalink":"https://myself659.github.io/post/devops/wsl-python/","summary":"\u003ch2 id=\"requirement\"\u003erequirement\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt-get install lzma\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt-get install liblzma-dev\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt-get install libbz2-dev\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt-get install python3-tk\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"pyenv\"\u003epyenv\u003c/h2\u003e\n\u003ch3 id=\"what-is-pyenv\"\u003ewhat is pyenv\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003epyenv is for a Python version management + virtual environment tool\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"install-pyenv\"\u003einstall pyenv\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl https://pyenv.run | bash\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003ca href=\"https://github.com/pyenv/pyenv?tab=readme-ov-file#automatic-installer\"\u003epyenv\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eecho\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;export PYENV_ROOT=\u0026#34;$HOME/.pyenv\u0026#34;\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e~/.\u003c/span\u003e\u003cspan class=\"n\"\u003ebashrc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eecho\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;command -v pyenv \u0026gt;/dev/null || export PATH=\u0026#34;$PYENV_ROOT/bin:$PATH\u0026#34;\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e~/.\u003c/span\u003e\u003cspan class=\"n\"\u003ebashrc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eecho\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;eval \u0026#34;$(pyenv init -)\u0026#34;\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e~/.\u003c/span\u003e\u003cspan class=\"n\"\u003ebashrc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esource ~/.bashrc\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"usage\"\u003eusage\u003c/h3\u003e\n\u003ch4 id=\"list-all-available-pyenv-commands\"\u003eList all available pyenv commands\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv commands\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch4 id=\"list-all-available-python-versions\"\u003eList all available Python versions\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv install -l\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch4 id=\"installing-specific-python-versions\"\u003eInstalling specific Python versions\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv install 3.12.0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch4 id=\"uninstall-a-specific-python-version\"\u003eUninstall a specific python version\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv uninstall 3.12.0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch4 id=\"show-all-python-versions\"\u003eShow all Python versions\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv versions\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch4 id=\"setting-the-global-python-version\"\u003eSetting the global Python version\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv global 3.12.0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch4 id=\"display-the-currently-active-python-version\"\u003eDisplay the currently active Python version\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch4 id=\"display-the-full-path-to-the-python-version\"\u003eDisplay the full path to the Python version\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv which python\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch4 id=\"set-a-shell-specific-python-version\"\u003eSet a shell-specific Python version\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv shell  3.12.0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch4 id=\"unsets-the-shell-version\"\u003eUnsets the shell version\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv shell --unset\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"set-a-local-python-version\"\u003eSet a local Python version\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv local 3.11.5 \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"unset-the-local-python-version\"\u003eUnset the local Python version\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epyenv local --unset  \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"install-pyenv-virtualenv\"\u003einstall pyenv-virtualenv\u003c/h2\u003e\n\u003ch3 id=\"install-pyenv-virtualenv-1\"\u003einstall pyenv-virtualenv\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ echo \u0026#39;eval \u0026#34;$(pyenv virtualenv-init -)\u0026#34;\u0026#39; \u0026gt;\u0026gt; ~/.bashrc\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ source ~/.bashrc\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003ca href=\"https://github.com/pyenv/pyenv-virtualenv#installation\"\u003epyenv-virtualenv\u003c/a\u003e\u003c/p\u003e","title":"setup python development environment in WSL"},{"content":"static ip address 1 2 3 4 5 6 7 8 9 10 netsh int ipv4 show interfaces Idx Met MTU 状态 名称 --- ---------- ---------- ------------ --------------------------- 1 75 4294967295 connected Loopback Pseudo-Interface 1 10 50 1500 disconnected WLAN 3 35 1500 connected 以太网 14 25 1500 disconnected 本地连接* 1 12 25 1500 disconnected 本地连接* 2 44 15 1500 connected vEthernet (WSL (Hyper-V firewall)) setup static ip address:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 @echo off REM credits: https://sites.google.com/site/eneerge/scripts/batchgotadmin REM Stored here in case that site goes down some day :: BatchGotAdmin :------------------------------------- REM --\u0026gt; Check for permissions \u0026gt;nul 2\u0026gt;\u0026amp;1 \u0026#34;%SYSTEMROOT%\\system32\\cacls.exe\u0026#34; \u0026#34;%SYSTEMROOT%\\system32\\config\\system\u0026#34; REM --\u0026gt; If error flag set, we do not have admin. if \u0026#39;%errorlevel%\u0026#39; NEQ \u0026#39;0\u0026#39; ( echo Requesting administrative privileges... goto UACPrompt ) else ( goto gotAdmin ) :UACPrompt echo Set UAC = CreateObject^(\u0026#34;Shell.Application\u0026#34;^) \u0026gt; \u0026#34;%temp%\\getadmin.vbs\u0026#34; set params = %*:\u0026#34;=\u0026#34;\u0026#34; echo UAC.ShellExecute \u0026#34;cmd.exe\u0026#34;, \u0026#34;/c %~s0 %params%\u0026#34;, \u0026#34;\u0026#34;, \u0026#34;runas\u0026#34;, 1 \u0026gt;\u0026gt; \u0026#34;%temp%\\getadmin.vbs\u0026#34; \u0026#34;%temp%\\getadmin.vbs\u0026#34; del \u0026#34;%temp%\\getadmin.vbs\u0026#34; exit /B :gotAdmin pushd \u0026#34;%CD%\u0026#34; CD /D \u0026#34;%~dp0\u0026#34; :-------------------------------------- wsl -d Ubuntu-22.04 -u root ip addr add 192.168.8.8/24 broadcast 192.168.8.255 dev eth0 label eth0:1 netsh interface ip add address \u0026#34;vEthernet (WSL (Hyper-V firewall))\u0026#34; 192.168.8.9 255.255.255.0 proxy from host 1 2 3 4 5 6 7 8 9 10 11 12 proxy() { WIN_HOST=$(cat /etc/resolv.conf | grep nameserver | awk \u0026#39;{print $2}\u0026#39;) export http_proxy=\u0026#34;http://$WIN_HOST:60808\u0026#34; export https_proxy=\u0026#34;http://$WIN_HOST:60808\u0026#34; export all_proxy=\u0026#34;socks5://$WIN_HOST:60808\u0026#34; echo \u0026#34;Proxy ON → $WIN_HOST\u0026#34; } unproxy() { unset http_proxy https_proxy all_proxy echo \u0026#34;Proxy OFF\u0026#34; } 1 2 3 4 5 6 7 8 9 10 11 12 proxy() { WIN_HOST=$(ip route | awk \u0026#39;/default/ {print $3}\u0026#39;) export http_proxy=\u0026#34;http://$WIN_HOST:60808\u0026#34; export https_proxy=\u0026#34;http://$WIN_HOST:60808\u0026#34; export all_proxy=\u0026#34;socks5://$WIN_HOST:60808\u0026#34; echo \u0026#34;Proxy ON → $WIN_HOST\u0026#34; } unproxy() { unset http_proxy https_proxy all_proxy echo \u0026#34;Proxy OFF\u0026#34; } ","permalink":"https://myself659.github.io/post/devops/wsl-1-network/","summary":"\u003ch2 id=\"static-ip-address\"\u003estatic ip address\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e netsh int ipv4 show interfaces\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIdx     Met         MTU          状态                名称\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---  ----------  ----------  ------------  ---------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  1          75  4294967295  connected     Loopback Pseudo-Interface 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e 10          50        1500  disconnected  WLAN\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  3          35        1500  connected     以太网\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e 14          25        1500  disconnected  本地连接* 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e 12          25        1500  disconnected  本地连接* 2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e 44          15        1500  connected     vEthernet (WSL (Hyper-V firewall))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003esetup static ip address:\u003c/p\u003e","title":"WSL-network"},{"content":"install On windows11, windows terminal has installed as default. If not, Please install windows terminal from Microsoft Store.\nupdate PowerShell Get PowerShell Version:\n1 2 3 4 5 6 7 8 9 10 11 12 13 $PSVersionTable Name Value ---- ----- PSVersion 5.1.22621.2506 PSEdition Desktop PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} BuildVersion 10.0.22621.2506 CLRVersion 4.0.30319.42000 WSManStackVersion 3.0 PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1 update PowerShell:\n1 winget install --id Microsoft.Powershell --source winget Check PowerShell Version:\n1 2 3 4 5 6 7 8 9 10 11 Name Value ---- ----- PSVersion 7.4.2 PSEdition Core GitCommitId 7.4.2 OS Microsoft Windows 10.0.22631 Platform Win32NT PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…} PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1 WSManStackVersion 3.0 more details\nEnable Bash-Style History Search and Suggestions in PowerShell Open PROFILE with notepad:\n1 notepad $PROFILE Add History Search and Suggestions:\n1 2 3 4 5 6 7 Import-Module PSReadLine Set-PSReadLineOption -PredictionSource History Set-PSReadLineOption -PredictionViewStyle InlineView Set-PSReadLineOption -PredictionViewStyle ListView Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward Set-PSReadLineOption -MaximumHistoryCount 10000 Configure proxy Open PROFILE with notepad:\n1 notepad $PROFILE Add the following content to the PROFILE file:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 function Enable-Proxy { $proxy_host = \u0026#39;127.0.0.1\u0026#39; $proxy_port = \u0026lt;port\u0026gt; $proxy_url = \u0026#34;http://${proxy_host}:$proxy_port\u0026#34; # Set proxy-related environment variables that are widely used by applications $env:HTTP_PROXY = $proxy_url $env:HTTPS_PROXY = $proxy_url $env:ALL_PROXY = $proxy_url # Set web proxy for .NET applications # The second argument `$true` means bypass local addresses [System.Net.WebRequest]::DefaultWebProxy = New-Object System.Net.WebProxy($proxy_url, $true) [System.Net.Http.HttpClient]::DefaultProxy = New-Object System.Net.WebProxy($proxy_url, $true) } New-Alias -Name proxy -Value Enable-Proxy function Reset-Proxy { # Unset proxy-related environment variables $env:HTTP_PROXY = \u0026#39;\u0026#39; $env:HTTPS_PROXY = \u0026#39;\u0026#39; $env:ALL_PROXY = \u0026#39;\u0026#39; # Unset web proxy for .NET applications [System.Net.WebRequest]::DefaultWebProxy = New-Object System.Net.WebProxy($null) [System.Net.Http.HttpClient]::DefaultProxy = New-Object System.Net.WebProxy($null) } New-Alias -Name unproxy -Value Reset-Proxy Usage:\nuse proxy to turn on proxy\nuse unproxy to turn off proxy\nstarship 1 scoop install starship Add the following to the end of your PowerShell configuration (find it by running $PROFILE):\n1 2 Invoke-Expression (\u0026amp;starship init powershell) protoc install vcpkg 1 2 3 4 5 git clone https://github.com/Microsoft/vcpkg.git cd vcpkg .\\bootstrap-vcpkg.bat vcpkg install protobuf protobuf:x64-windows SET VCPKG_ROOT set VCPKG_ROOT as the path to fold for vcpkg.\ntips exa 1 exa -l --all -l --all --group-directories-first 1 exa --tree --level=1 duf 1 duf --hide-fs tmpfs --width 70 1 duf --hide-fs tmpfs --width 60 --json ","permalink":"https://myself659.github.io/post/devops/windows-terminal/","summary":"\u003ch2 id=\"install\"\u003einstall\u003c/h2\u003e\n\u003cp\u003eOn windows11, windows terminal has installed as default. If not, Please install windows terminal from Microsoft Store.\u003c/p\u003e\n\u003ch2 id=\"update-powershell\"\u003eupdate PowerShell\u003c/h2\u003e\n\u003cp\u003eGet PowerShell Version:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e $PSVersionTable\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eName                           Value\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----                           -----\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePSVersion                      5.1.22621.2506\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePSEdition                      Desktop\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBuildVersion                   10.0.22621.2506\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCLRVersion                     4.0.30319.42000\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWSManStackVersion              3.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePSRemotingProtocolVersion      2.3\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSerializationVersion           1.1.0.1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003eupdate PowerShell:\u003c/p\u003e","title":"windows terminal"},{"content":"setup Manual installation steps for older versions of WSL tips ln from mnt to reduce disk space but impact performance 1 ln -s /mnt/e/go ~/go Troubleshooting \u0026ldquo;WslRegisterDistribution failed with error: 0x80370114\u0026rdquo; solution:\n1 wsl --update refence Troubleshooting Windows Subsystem for Linux 跨 Windows 和 Linux 文件系统工作 Working across Windows and Linux file systems ","permalink":"https://myself659.github.io/post/devops/wsl-0/","summary":"\u003ch2 id=\"setup\"\u003esetup\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://learn.microsoft.com/en-us/windows/wsl/install-manual#step-2---check-requirements-for-running-wsl-2\"\u003eManual installation steps for older versions of WSL\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"tips\"\u003etips\u003c/h2\u003e\n\u003ch3 id=\"ln-from-mnt-to-reduce-disk-space-but-impact-performance\"\u003eln from mnt to reduce disk space but impact performance\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eln -s  /mnt/e/go  ~/go\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"troubleshooting\"\u003eTroubleshooting\u003c/h2\u003e\n\u003ch3 id=\"wslregisterdistribution-failed-with-error-0x80370114\"\u003e\u0026ldquo;WslRegisterDistribution failed with error: 0x80370114\u0026rdquo;\u003c/h3\u003e\n\u003cp\u003esolution:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewsl --update\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"refence\"\u003erefence\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://learn.microsoft.com/en-us/windows/wsl/troubleshooting\"\u003eTroubleshooting Windows Subsystem for Linux\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://learn.microsoft.com/zh-cn/windows/wsl/filesystems\"\u003e跨 Windows 和 Linux 文件系统工作\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://learn.microsoft.com/en-us/windows/wsl/filesystems#file-storage-and-performance-across-file-systems\"\u003eWorking across Windows and Linux file systems\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e","title":"WSL-101"},{"content":"普遍性不一致性问题 宏观经济数据与广大人民的体感不一致\n国家前途与个人命运不一致\n对内的宣传与国外的实际不一致\n政府宣传与实际情况不一致\nGDP增长与财富增长不一致\n企业家公开说与实际做不一致\n","permalink":"https://myself659.github.io/post/economy/%E4%B8%AD%E5%9B%BD%E9%9D%A2%E4%B8%B4%E7%9A%84%E6%99%AE%E9%81%8D%E6%80%A7%E4%B8%8D%E4%B8%80%E8%87%B4%E6%80%A7/","summary":"\u003ch2 id=\"普遍性不一致性问题\"\u003e普遍性不一致性问题\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e宏观经济数据与广大人民的体感不一致\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e国家前途与个人命运不一致\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e对内的宣传与国外的实际不一致\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e政府宣传与实际情况不一致\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGDP增长与财富增长不一致\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e企业家公开说与实际做不一致\u003c/p\u003e","title":"普遍性不一致性问题"},{"content":"背景 背景参考如下链接：\n国家安全机关坚决筑牢经济安全屏障 中央经济工作会议在北京举行 习近平出席会议并发表重要讲话 中共中央政治局召开会议 习近平主持会议 2023年11月份居民消费价格同比下降0.5% 环比下降0.5% 2023年11月社会融资规模存量统计数据报告 裁判文书对外公开是加入wto的承诺 什么才是中国的问题 能说不是问题，不能说才是问题，不让说才是问题。\n知道能改不是问题，知道不改才是问题。\n不知道的问题才是问题。\n","permalink":"https://myself659.github.io/post/economy/%E4%BB%80%E4%B9%88%E6%89%8D%E6%98%AF%E4%B8%AD%E5%9B%BD%E7%9A%84%E9%97%AE%E9%A2%98/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e背景参考如下链接：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://mp.weixin.qq.com/s/pOVcm_d82q_cNr6VXqIHsw\"\u003e国家安全机关坚决筑牢经济安全屏障\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://mp.weixin.qq.com/s/PoIbiBBgK7F7hdzDk0dJ5w\"\u003e中央经济工作会议在北京举行 习近平出席会议并发表重要讲话\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://mp.weixin.qq.com/s/MkBLv-OZPSExvYUnSVnb7w\"\u003e中共中央政治局召开会议 习近平主持会议\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.gov.cn/lianbo/bumen/202312/content_6919281.htm\"\u003e2023年11月份居民消费价格同比下降0.5% 环比下降0.5%\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.pbc.gov.cn/diaochatongjisi/116219/116225/5167464/index.html\"\u003e2023年11月社会融资规模存量统计数据报告\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://mp.weixin.qq.com/s/1dsI7sItrEju6-ZYr3LzgQ\"\u003e裁判文书对外公开是加入wto的承诺\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"什么才是中国的问题\"\u003e什么才是中国的问题\u003c/h2\u003e\n\u003cp\u003e能说不是问题，不能说才是问题，不让说才是问题。\u003c/p\u003e\n\u003cp\u003e知道能改不是问题，知道不改才是问题。\u003c/p\u003e","title":"什么才是中国的问题"},{"content":"背景 生活中杠精总是喜欢辩个输赢，浪费不少时间与精力，除了如果赢的话，有一点情绪价值，实际上也没有具体的收益，再说有赢有有输，输的话，估计会郁闷的更久，在情绪价值这一点都不定能跑正。\n所以，不要执着于是非对错。\n原因 执着于是非对错是一种典型黑白的二极管思维 执着于是非对错不利于打开视野 执着于是非对错停留在理论，不利于行动 执着于是非对错很多情况是一种浪费，实际上很多时间是没有是非对错（如一些玄学就没有办法证伪，也没有办法证实） 执着于是非对错实际收益很低，可能是负 执着于是非对错是低维度的 是非对错具有主观性 是非对错容易脱离现实 如何克服 成败得失远大于是非对错 是非对错往往不存在或者很难得到 行胜于言 相信过程，结果导向 迭代做法 ","permalink":"https://myself659.github.io/post/life/%E6%88%90%E8%B4%A5%E5%BE%97%E5%A4%B1%E5%A4%A7%E4%BA%8E%E6%98%AF%E9%9D%9E%E5%AF%B9%E9%94%99/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e生活中杠精总是喜欢辩个输赢，浪费不少时间与精力，除了如果赢的话，有一点情绪价值，实际上也没有具体的收益，再说有赢有有输，输的话，估计会郁闷的更久，在情绪价值这一点都不定能跑正。\u003c/p\u003e","title":"不要执着于是非对错"},{"content":"背景 日常生活与工作时常有一种自己没有准备好的感觉，导致缺少行动，从而没有把握机会。\n没有准备好的背后往往是过度准备。\n现象 过度准备的常有以下现象：\n大量收集信息与知识 一直在学习教程 一直在思考如何开始 一直在想我还需要准备什么 无限期地准备 无关准备 无效准备 无重点无差别的准备 原因 过度准备的原因如下：\n信息与知识上瘾 准备依赖不能走出准备的舒适区 追求一步到位 缺少勇气，害怕开始，把准备当作借口 过于相信准备会降低开始和完成的难度 贪婪，认为准备越多越好 追求确定性 没有重点 危害 过度准备可能会有以下危害：\n消耗过多成本如在时间成本表现为错过最佳时机 容易导致\u0026quot;分析麻痹\u0026quot;,不敢付诸行动 降低效率,无法产出最大价值 增加心理压力,产生焦虑 理想化,难以应对变化 浪费精力在非关键事项,忽略更重要的事 容易过度依赖准备,忽视实战经验 如何避免过度准备 定义自己的准备的MVP及其对应工作的MVP 先开始迭代与及时反馈 拥抱不确定性，相信没有百分百的准备好 行动准备就是开始行动，而不是停留在认知，完美的认知也不能代替行动 总结 准备不是一种状态，不存在百分百准备好的状态。\n准备是一种态度。\n","permalink":"https://myself659.github.io/post/learn/%E8%AF%B4%E8%AF%B4%E8%BF%87%E5%BA%A6%E5%87%86%E5%A4%87/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e日常生活与工作时常有一种自己没有准备好的感觉，导致缺少行动，从而没有把握机会。\u003c/p\u003e\n\u003cp\u003e没有准备好的背后往往是过度准备。\u003c/p\u003e\n\u003ch2 id=\"现象\"\u003e现象\u003c/h2\u003e\n\u003cp\u003e过度准备的常有以下现象：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e大量收集信息与知识\u003c/li\u003e\n\u003cli\u003e一直在学习教程\u003c/li\u003e\n\u003cli\u003e一直在思考如何开始\u003c/li\u003e\n\u003cli\u003e一直在想我还需要准备什么\u003c/li\u003e\n\u003cli\u003e无限期地准备\u003c/li\u003e\n\u003cli\u003e无关准备\u003c/li\u003e\n\u003cli\u003e无效准备\u003c/li\u003e\n\u003cli\u003e无重点无差别的准备\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"原因\"\u003e原因\u003c/h2\u003e\n\u003cp\u003e过度准备的原因如下：\u003c/p\u003e","title":"说说过度准备"},{"content":"容器 如果把每个人的大脑都当作容器，那么学习的过程就往这个容器加东西。 这个容器内有哪些？简单罗列如下：\n信息与知识 思想与信念 情感与想法 记忆与经历 意识与自我 但是这个容器的空间有限，如果加的太多，后面也就再也就加不了新东西，同时也看不清楚里面有什么东西，并且会受其所累。\n这时候应该去清空一下这个容器。\n清空自己 清空自己是一种放下。\n清空自己是一种忘记。\n清空自己是一种迭代与自我的版本升级。\n清空自己是一种整理。\n清空自己是一种改变。\n清空自己是一种开始。\n清空自己是一种发现。\n清空自己是一种超越。\n清空自己是一种修炼。\n","permalink":"https://myself659.github.io/post/learn/%E6%B8%85%E7%A9%BA%E8%87%AA%E5%B7%B1/","summary":"\u003ch2 id=\"容器\"\u003e容器\u003c/h2\u003e\n\u003cp\u003e如果把每个人的大脑都当作容器，那么学习的过程就往这个容器加东西。 这个容器内有哪些？简单罗列如下：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e信息与知识\u003c/li\u003e\n\u003cli\u003e思想与信念\u003c/li\u003e\n\u003cli\u003e情感与想法\u003c/li\u003e\n\u003cli\u003e记忆与经历\u003c/li\u003e\n\u003cli\u003e意识与自我\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e但是这个容器的空间有限，如果加的太多，后面也就再也就加不了新东西，同时也看不清楚里面有什么东西，并且会受其所累。\u003c/p\u003e","title":"清空自己，超越自我"},{"content":"背景 Eat the Frog字面意思是吃青蛙。其本质是一个提高个人生产力的方法。其核心原则是：确定当天最重要的一件事件并以此开始一天的工作。\n什么是最重要的事情？ 如果完成一件事,会使其他事情变得简单或不再是问题,那么这件事就可以视为当天最重要的。\n具体参考如下:\n如果先制定好计划,其他事项就能有条不紊地进行 如果先完成一个项目的关键难点,其他就变得水到渠成 如果先做完某项任务,就能腾出时间或心理空间做其他事 如果先沟通协调,其他执行步骤就顺利多了 如果先Eat the Frog,其他都会变得容易 为什么要从最重要的事情开始？ 早上起床后人的能量最充沛，好钢要用在刀刃上，一天之际在于晨 从最重要的事情开始，以一种高标准要求自己 从最重要的事情开始，可以有效地避免拖延 从最重要的事情开始，可以提高产出 有利于完成难而正确的事情 完成最重要的事情给一天的工作打下坚实的基础 要事优先原则 利于培养挑战困难与迎难而上的心态，有利于个人的快速进步与提高 如何执行 首先找到最重要一件事，刚开始可以从简单且重要的事情开始 全身心投入并完成这件事 建立正反馈系统 每天执行，将原则转化习惯 原则适用 一天的工作从最重要最难的任务开始这一原则适用于以下情况：\n延迟症患者 每天虽然能完成很多任务，但是整体上没有取得进展 每天待办事项，但不知道从哪个开始 卡在某件事情之上，无法取得突破 ","permalink":"https://myself659.github.io/post/done/how-to-eat-thefrog/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003eEat the Frog字面意思是吃青蛙。其本质是一个提高个人生产力的方法。其核心原则是：确定当天最重要的一件事件并以此开始一天的工作。\u003c/p\u003e\n\u003ch2 id=\"什么是最重要的事情\"\u003e什么是最重要的事情？\u003c/h2\u003e\n\u003cp\u003e如果完成一件事,会使其他事情变得简单或不再是问题,那么这件事就可以视为当天最重要的。\u003c/p\u003e","title":"从最重要的事件开始一天的工作"},{"content":"背景 人们常常强调到效率的重要性。\n效率Efficiency Wiki定义如下：\nEfficiency is the often measurable ability to avoid wasting materials, energy, efforts, money, and time while performing a task.\n效率是不够的 效率是片面的。效率是过程角度来评价。\n更全面的评价可以根据IPO框架来展开：\ninput角度：效用 process角度：效率 output角度：效果 效用，效率，效果三位一体的评价方式更显立体与全面。\n参考 Efficiency Efficacy Effectiveness ","permalink":"https://myself659.github.io/post/rt/%E6%95%88%E7%8E%87%E6%98%AF%E4%B8%8D%E5%A4%9F%E7%9A%84/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e人们常常强调到效率的重要性。\u003c/p\u003e\n\u003ch2 id=\"效率efficiency\"\u003e效率Efficiency\u003c/h2\u003e\n\u003cp\u003eWiki定义如下：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eEfficiency is the often measurable ability to avoid wasting materials, energy, efforts, money, and time while performing a task.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"效率是不够的\"\u003e效率是不够的\u003c/h2\u003e\n\u003cp\u003e效率是片面的。效率是过程角度来评价。\u003c/p\u003e\n\u003cp\u003e更全面的评价可以根据IPO框架来展开：\u003c/p\u003e","title":"效率是不够的"},{"content":"背景 瑞达利欧提出一个公式：\n痛苦+反思=进步。\n个人认为这个公式更好：\n痛苦+反思+迭代 = 进步。\n为什么要反思 在现在这个大环境，学习生活工作如逆水行舟，不进则退。痛苦很容易感觉到，那么根据上面的公式，进步的关键在于反思。反思是进步的开始，是迭代的基础，反思是一种调整，反思是一种适应。\n反思什么 首先反思对象是自己，要向内求。\n反思自己的内容如下：\n痛苦 失败 不足 停滞 错误 什么时候反思 定期反思如每天晚上总结得失（孔子说过每日三省吾身），每周案例分析 遇到关键的（痛苦，失败，不足，停滞）的时候 如何反思？ 除了实事求是与诚实勇敢原则，还有以下方法:\n分析自己的行为以及行为背后的原因，保证反思深入到事实与本质 多问自己开放性问题 多视角审视自己 与不同的人交流特别是高手 建立基线定期对比，通过差距引导反思 分析别人的错误 建立反思的结果进行审查机制，保证反思能够落实到具体行动当中，取得效果（反思驱动迭代） 反思与迭代的效果可以通过检查原来的痛苦来衡量 ","permalink":"https://myself659.github.io/post/rt/how-to-reflect-%E5%8F%8D%E6%80%9D/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e瑞达利欧提出一个公式：\u003c/p\u003e\n\u003cp\u003e痛苦+反思=进步。\u003c/p\u003e\n\u003cp\u003e个人认为这个公式更好：\u003c/p\u003e\n\u003cp\u003e痛苦+反思+迭代 = 进步。\u003c/p\u003e\n\u003ch2 id=\"为什么要反思\"\u003e为什么要反思\u003c/h2\u003e\n\u003cp\u003e在现在这个大环境，学习生活工作如逆水行舟，不进则退。痛苦很容易感觉到，那么根据上面的公式，进步的关键在于反思。反思是进步的开始，是迭代的基础，反思是一种调整，反思是一种适应。\u003c/p\u003e","title":"谈谈反思"},{"content":"背景 从去年末chatGPT的横空出世，到现在近一年的时间，AI领域成果与创新层出不穷。在这一系列的进步之下，让人们相信人类社会终将会进入人工智能时代。\n那么人工智能时代，个人的能力又有哪些新的要求呢？\n哪些能力更显重要？ 创造力 判断力 情商 领导力 应用AI的能力 跨界迁移能力 学习能力 以上这些能力在人工智能时代会显得更加重要。\n","permalink":"https://myself659.github.io/post/ai/agi-skills%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E6%97%B6%E4%BB%A3%E7%9A%84%E8%83%BD%E5%8A%9B%E9%9B%86/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e从去年末chatGPT的横空出世，到现在近一年的时间，AI领域成果与创新层出不穷。在这一系列的进步之下，让人们相信人类社会终将会进入人工智能时代。\u003c/p\u003e","title":"人工智能时代应该培养什么能力"},{"content":"背景 提问比回答更重要。那么什么才是一个好问题呢？\n特点 好问题具有以一下特点：\n立足事实与科学。 清晰具体明确。 简洁直击关键。 开放性。 有新意。 有深度。 启发性。 引导性。 参考实例 同样是诛杀了权臣，为什么北魏孝庄帝元子攸与大清康熙帝的下场却截然不同（康熙帝成功地开启了康乾盛世，元子攸却没有成功清除权臣的残余势力以致身死）？\n愚公移山故事中愚公为什么不搬家，而是选择花几代人的光阴去移山呢？\n在当前社会，为什么一些地区会退休老师的养老金比新老师的工资还高呢？\n这次旅行中最有趣的事情是什么？\n","permalink":"https://myself659.github.io/post/rt/what-is-good-questions/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e提问比回答更重要。那么什么才是一个好问题呢？\u003c/p\u003e\n\u003ch2 id=\"特点\"\u003e特点\u003c/h2\u003e\n\u003cp\u003e好问题具有以一下特点：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e立足事实与科学。\u003c/li\u003e\n\u003cli\u003e清晰具体明确。\u003c/li\u003e\n\u003cli\u003e简洁直击关键。\u003c/li\u003e\n\u003cli\u003e开放性。\u003c/li\u003e\n\u003cli\u003e有新意。\u003c/li\u003e\n\u003cli\u003e有深度。\u003c/li\u003e\n\u003cli\u003e启发性。\u003c/li\u003e\n\u003cli\u003e引导性。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"参考实例\"\u003e参考实例\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e同样是诛杀了权臣，为什么北魏孝庄帝元子攸与大清康熙帝的下场却截然不同（康熙帝成功地开启了康乾盛世，元子攸却没有成功清除权臣的残余势力以致身死）？\u003c/p\u003e","title":"什么才是好问题"},{"content":"背景 张一鸣：人生中一半的问题，都是没有延迟满足感造成的\n重要性 心理学有非常著名的棉花糖实验(Stanford Marshmallow Experiment)。棉花糖实验是心理学界著名的延迟满足研究。 该实验最初于1960年代和1970年代由Walter Mischel教授在斯坦福大学进行。主要过程是:\n研究人员让4-6岁儿童单独呆在房间,房间里有一块棉花糖。 告知孩子如果现在吃掉棉花糖就不会再得到更多,如果等待15分钟直到研究人员回来,就可以得到两块棉花糖。 然后观察孩子是否有能力等待更大的回报。 追踪研究发现,能够等待的孩子在之后的生活中表现更好,如SAT分数更高、教育程度更高等。 该实验论证了延迟满足能力对个人发展的重要性。 该实验成为心理学研究的典范,被广泛引用。它揭示了自制力及延时满足对个体成长的深远影响,也影响了后续的教育方法与理念。 及时满足是延迟满足最大的障碍 及时满足能够立即得到回报,更加容易形成依赖,占据延迟的空间。 及时满足容易产生快感,而忍耐延迟满足需要克制冲动，及时满足容易做到 及时满足提供的快速满足感暂时压制了对更大价值的追求需求 及时满足会增强人的贪念,更难以等待长期目标的实现。 总之，及时满足符合人性，更容易适应环境。\n延迟满足是在时间空间内的反人性的套利 延迟满足相当于低利率的长期借款用于长期投资。\n及时满足相当于高利率的短期借款用于及时消费。\n在这两个打比方的基础之上，很明显看到延迟满足是一种套利，这种套利建立在反人性的基础之上。\n延时满足的核心是自律 自律是反人性。延时满足是自律的结果。\n建立延迟满足的规则很容易，但是执行延迟满足的规则却很难，需要高度的自律才能做到。\n如何修炼延迟满足 张一鸣：人生中一半的问题，都是没有延迟满足感造成的提到以下4点：\n1.习惯成自然，把目标转换成习惯\n2.目标有层次，内在有驱动\n3.不要拖延，养成今日事今日毕的习惯，想都是困难，做都是办法\n4.坚守长期主义\n这里个人补充几点：\n区分必须与需要，确定高质量的目标，然后将目标转换成习惯，这样可以提高延迟满足的作用 目标锚定根本动机，保证动力与能量 建立延迟满足的正反馈系统（动机，trigger，行动，反馈） 学会future self ","permalink":"https://myself659.github.io/post/life/%E8%AF%B4%E8%AF%B4%E5%BB%B6%E8%BF%9F%E6%BB%A1%E8%B6%B3/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://36kr.com/p/2460132299904902\"\u003e张一鸣：人生中一半的问题，都是没有延迟满足感造成的\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"重要性\"\u003e重要性\u003c/h2\u003e\n\u003cp\u003e心理学有非常著名的棉花糖实验(Stanford Marshmallow Experiment)。棉花糖实验是心理学界著名的延迟满足研究。\n该实验最初于1960年代和1970年代由Walter Mischel教授在斯坦福大学进行。主要过程是:\u003c/p\u003e","title":"说说延迟满足"},{"content":"背景 首先说明这里的一致性不是分布式场景下数据的一致性。这里一致性限定于个人的思想行为方面。如一个人每天早上6点起床，一个人无论在什么情况总是沉着冷静。\n定义 一个人的一致性体现在持续的内外兼修、在不同环境下维持原则、品格、作风、态度的稳定性。 一致性是人品的一个重要的元素。\n重要性 看人与识人要看到这个人的一致性，因为一致性是稳定的，是可靠的。 另外看一致性有利于避免被表面所迷惑，有利于看清一个人的本质。\n一致性具有以下特点与作用：\n一致性是稳定的 一致性是可靠的 一致性是有定力的 一致性是坚持与韧性的来源 一致性是有原则的 一致性有稳定的预期 一致性是持续的 一致性是信任的基础 一致性来自内在 一致性是复利的来源 习惯vs一致性 习惯是侧重具体的行为的，一致性则包括行为，思想，信念等。\n习惯是一致性的体现。习惯是维持一致性的重要方式。\n一致性背后是什么？ 一致性取决以下几个因素：\n核心信念 根本目标与动机 正反馈的系统（兴趣爱好） 环境决定一致性的形式与内容 低成本的维护如习惯 ","permalink":"https://myself659.github.io/post/life/about-consistent%E4%B8%80%E8%87%B4%E6%80%A7/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e首先说明这里的一致性不是分布式场景下数据的一致性。这里一致性限定于个人的思想行为方面。如一个人每天早上6点起床，一个人无论在什么情况总是沉着冷静。\u003c/p\u003e","title":"说说一致性"},{"content":"定义 内心平静是指一个人的身体、思想、心灵和灵魂在当下的一种自然安静的状态。需要注意的是内心平静只能在当下感受到。 内心平静不仅可以是冥想中体验到平静，也可以是采菊东篱下，悠然见南山的自然。\n关键 内心平静是一种自然状态，内心平静不可强求 内心平静来自当下 内心平静来自内心 how to inner-peace 认识自己 自知者明。\n接受事实，忽略想法 恐惧和压力的来源之一来自于我们许多人想知道未来会发生什么。当能够坦然接受事实，不逃避事实，内心平静自然会来。\n想法似风，不用在意。忽略想法，最好的办法就是行动。\n追求极简主义，学会断舍离 极简主义可以避免复杂，避免过多的依赖。\n学会断舍离，也就是学会放下，放下过去，放下未来，为自己活在当下。\n每天冥想 冥想是一种让人静下来与专注的练习。 越容易专注，也越容易静下来。\n学会独处 独处是将自己从环境中解脱出来，避免环境带来的干扰，同时主动拥抱独处的独立感与自由感，而不是感觉到孤独。\n亲近大自然 在大自然的环境是一个人最容易感受到自然的方式。\n照顾好自己的身体 身心一体，身体为本。\n身体不好，内心是不会平静。\n增加反脆弱能力 增加反脆弱能力有利于应对各种波动，有利于内心平静。\n追求心流状态 心流状态是人的最佳状态。处于心流状态，对外界的干扰有极强的免疫力。\n","permalink":"https://myself659.github.io/post/life/inner-peace-%E5%86%85%E5%BF%83%E5%B9%B3%E7%A8%B3/","summary":"\u003ch2 id=\"定义\"\u003e定义\u003c/h2\u003e\n\u003cp\u003e内心平静是指一个人的身体、思想、心灵和灵魂在当下的一种自然安静的状态。需要注意的是内心平静只能在当下感受到。\n内心平静不仅可以是冥想中体验到平静，也可以是采菊东篱下，悠然见南山的自然。\u003c/p\u003e","title":"how to inner-peace"},{"content":"tips 你的视野决定你的看见的范围 你的位置与视角决定你看见什么 你的注意力决定你从看见中得到什么（注意力其实一个过滤器） 你的想法决定你从看见中看见了什么 不会主动转换位置与视角，那么系统会决定你会看见什么 你看见三种形式： 现象，事实，本质 你看见的都不是全局 你没有看见远远超过你所看见的 你看见往往是你自己在这个世界的投射 衡量看见的宏观度量角度： 视野大小，视力远近，视角多少，看见的精度，看见的深度，洞察的准度，跨越的维度 ","permalink":"https://myself659.github.io/post/rt/%E5%85%B3%E4%BA%8E%E7%9C%8B%E8%A7%81%E7%9A%84%E6%80%9D%E8%80%83/","summary":"\u003ch2 id=\"tips\"\u003etips\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e你的视野决定你的看见的范围\u003c/li\u003e\n\u003cli\u003e你的位置与视角决定你看见什么\u003c/li\u003e\n\u003cli\u003e你的注意力决定你从看见中得到什么（注意力其实一个过滤器）\u003c/li\u003e\n\u003cli\u003e你的想法决定你从看见中看见了什么\u003c/li\u003e\n\u003cli\u003e不会主动转换位置与视角，那么系统会决定你会看见什么\u003c/li\u003e\n\u003cli\u003e你看见三种形式： 现象，事实，本质\u003c/li\u003e\n\u003cli\u003e你看见的都不是全局\u003c/li\u003e\n\u003cli\u003e你没有看见远远超过你所看见的\u003c/li\u003e\n\u003cli\u003e你看见往往是你自己在这个世界的投射\u003c/li\u003e\n\u003cli\u003e衡量看见的宏观度量角度： 视野大小，视力远近，视角多少，看见的精度，看见的深度，洞察的准度，跨越的维度\u003c/li\u003e\n\u003c/ol\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c!-- raw HTML omitted --\u003e","title":"关于看见的思考"},{"content":"背景 LLMs通过prompt实现问题解决,但基本的few-shot学习有局限性。要解决复杂问题,需要更精细化的prompt设计引导LLM进行多步推理。结合prompt设计技术可以解决更困难的任务,发挥LLM更大潜力。通过结合prompt设计技术可以解决更困难的任务,发挥LLM更大潜力。\nprompt进阶列表 常见高级prompt设计技术包括链式prompt、循环prompt、提示词提示等。\n链式prompt将任务分解为子任务,引导LLM逐步解决。\n循环prompt利用LLM自身输出作为新的prompt输入。\n提示词提示利用关键词帮助LLM关注正确方向。\n除此之外，做如下补充：\n对比学习(Contrastive Learning) - 通过正例和反例让LLM学习区分不同类型的语义。\n多任务学习(Multi-Task Learning) - 组合多个相关任务的prompt,让LLM同时解决,加强知识迁移。\n语义匹配提示(Semantic Matching Cues) - 使用语义相关的词汇作为提示词,帮助LLM抓住关键信息。\n可视化提示(Visual Prompting) - 提供图片或图表作为视觉输入,帮助LLM理解上下文。\n模式调整(Prompt Tuning) - 调整prompt模板,使用迁移学习或微调来优化prompt。\n语料调整(Corpus Filtering) - 筛选语料库中高质量样本,为prompt预训练提供 cleaner 数据。\n多轮互动(Conversational Multi-Turn) - 利用对话方式进行多轮互动,让LLM逐步完善输出。\n知识注入(Knowledge Injection) - 注入外部知识,为LLM提供更多上下文信息。\n强化学习(Reinforcement Learning) - 通过奖励机制增强特定行为,让LLM学习到期望输出。\n结构化提示(Structured Prompting) - 使用特定的语法结构组织prompt,如表格、代码块等来传达不同类型信息。\n多语言提示(Multilingual Prompting) - 利用不同语言版本的prompt来提供更丰富的上下文。\n个性化提示(Personalized Prompting) - 使用个性化信息定制提示,让LLM针对特定用户进行回复。\n外部记忆(External Memory) - 结合外部知识库,为LLM提供丰富的背景信息。\n中间表示提示(Intermediate Representation Prompting) - 使用中间表示状态作为prompt的一部分,引导LLM逐步推理。\n程序化提示(Programmatic Prompting) - 使用程序语言构建动态生成的提示。\n多模态提示(Multimodal Prompting) - 结合文本、音频、视频等不同模式的信息进行提示。\n对抗性提示(Adversarial Prompting) - 构建对抗prompt来评估LLM的鲁棒性。\n符号提示(Symbolic Prompting) - 使用数学和逻辑符号表示信息,提高表示能力。\n评估优化(Evaluation-Centered Optimization) - 直接针对评估指标来调整prompt。\n强化迁移学习(Reinforcement Transfer Learning) - 通过强化学习,先在源任务上训练prompt策略,然后迁移到目标任务。\n神经prompt学习(Neural Prompt Learning) - 使用神经网络来自动学习优化prompt模板。\n对抗样本检测(Adversarial Example Detection) - 检测对抗prompt,提高模型鲁棒性。\n多代理协作(Multi-Agent Collaboration) - 多个prompt代理协作探索最优提示策略。\n自动prompt生成(Automatic Prompt Generation) - 根据用户需求和上下文自动生成定制化prompt。\n渐进prompt学习(Curriculum Prompt Learning) - 采用由简单到复杂的训练策略来学习prompt。\n元学习prompt(Meta-Learning Prompts) - 学习如何快速针对新任务适配prompt。\n神经语料生成(Neural Corpus Generation) - 使用神经网络生成针对prompt的语料。\nprompt微调 - 通过梯度方法自动优化连续表示的prompt。\n多目标prompt(Multi-Objective Prompting) - 优化多个目标,实现pareto最优的prompt效果。\n强化prompt学习(Reinforced Prompt Learning) - 将prompt设计视为马尔可夫决策过程,使用强化学习方法优化。\n记忆增强prompt(Memory-Augmented Prompting) - 结合外部记忆模块,提供更多上下文和先验知识。\n程序化prompt生成(Programmatic Prompt Generation) - 使用程序或脚本自动化生成和优化prompt。\n对抗自监督prompt(Adversarial Self-Supervised Prompting) - 使用对抗自监督方法增强prompt的鲁棒性。\n多模态互学习prompt(Multimodal Co-learning Prompting) - 不同模态输入之间进行互学习来提高prompt的表达能力。\n符号交互prompt(Symbolic Interaction Prompting) - 借鉴符号/神经混合系统,增强prompt的逻辑推理能力。\n元学习优化prompt(Meta-Learned Optimization of Prompts) - 使用元学习方法,快速针对新任务学习高效prompt。\n对抗攻击策略研究(Adversarial Attack Strategy Research) - 分析prompt的安全性,研究可能的对抗攻击手段。\n解释性prompt学习(Explainable Prompt Learning) - 研究prompt对模型行为的解释性,提高可解释性。\n多任务prompt学习(Multi-Task Prompt Learning) - 学习同时适用于多个任务的通用prompt表示。\n","permalink":"https://myself659.github.io/post/ai/prompt-advanced-list/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003eLLMs通过prompt实现问题解决,但基本的few-shot学习有局限性。要解决复杂问题,需要更精细化的prompt设计引导LLM进行多步推理。结合prompt设计技术可以解决更困难的任务,发挥LLM更大潜力。通过结合prompt设计技术可以解决更困难的任务,发挥LLM更大潜力。\u003c/p\u003e","title":"prompt进阶列表"},{"content":"背景 写作即学习。\n写作是学习体现以下几个方面：\n写作完成学习内容的记录 写作发现有关学习内容的问题 写作加深学习内容的记忆与理解 写作是对学习内容的一种测试方式 写作促进对学习内容的吸收与发散 写作引导结学习内容的深入理解与精准描述及表达 如何通过写作来学习 完成要点与精华的记录 记录发现的问题 通过记录的问题驱动深入思考 通过写作发现差距并解决gap 通过写作交付高质量的内容来驱动练习 在写作的过程中践行费曼技巧，落实图文的方式的解释 把握写作的触发点：记录，总结，探索，反思，分享，测试对比\u0026hellip; 如何保证写作的一致性 这里一致性是指：\n周期写作如每周写作一篇文章，甚至每天写作一篇 持续提高写作的质量 养成写作的习惯 具体参考习惯的养成。\n迭代写作 迭代写作有以下好处：\n降低了写作的难度 有利于长期持续写作 通过迭代可以一点一点进步，从而不断提高写作的质量 便于同AI写作结合起来 如何迭代写作呢？\n确定主题与标题 写框架与要点 根据框架与要点补充内容 总结内容 阅读并完善修改内容 发布内容 公众反馈 总结 通过写作来学习有以下优点：\n有记录的复利 有迭代的进步 有交流的反馈 有一致性的习惯 有分享的动力与回馈 有费曼技巧的落实 有深入思考的问题驱动 ","permalink":"https://myself659.github.io/post/rt/learn-though-writing/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e写作即学习。\u003c/p\u003e\n\u003cp\u003e写作是学习体现以下几个方面：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e写作完成学习内容的记录\u003c/li\u003e\n\u003cli\u003e写作发现有关学习内容的问题\u003c/li\u003e\n\u003cli\u003e写作加深学习内容的记忆与理解\u003c/li\u003e\n\u003cli\u003e写作是对学习内容的一种测试方式\u003c/li\u003e\n\u003cli\u003e写作促进对学习内容的吸收与发散\u003c/li\u003e\n\u003cli\u003e写作引导结学习内容的深入理解与精准描述及表达\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"如何通过写作来学习\"\u003e如何通过写作来学习\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e完成要点与精华的记录\u003c/li\u003e\n\u003cli\u003e记录发现的问题\u003c/li\u003e\n\u003cli\u003e通过记录的问题驱动深入思考\u003c/li\u003e\n\u003cli\u003e通过写作发现差距并解决gap\u003c/li\u003e\n\u003cli\u003e通过写作交付高质量的内容来驱动练习\u003c/li\u003e\n\u003cli\u003e在写作的过程中践行费曼技巧，落实图文的方式的解释\u003c/li\u003e\n\u003cli\u003e把握写作的触发点：记录，总结，探索，反思，分享，测试对比\u0026hellip;\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"如何保证写作的一致性\"\u003e如何保证写作的一致性\u003c/h2\u003e\n\u003cp\u003e这里一致性是指：\u003c/p\u003e","title":"说说写作即学习"},{"content":"原则 每日冥想，养成冥想的习惯 以早起冥想开始一天 以睡前冥想开启入睡 确立冥想质量意识与因素 一天的冥想度量指标=冥想的次数+冥想总时长+冥想的质量 先身体静下来如坐下来与闭上眼睛，再让心静下来，然后让身心专注 单次冥想最小时长为5分钟 冥想后应该开启心流状态，变现冥想的作用 冥想即休息 冥想即调节，如状态不好的时候，主动开始冥想 冥想质量因素 注意力集中度 意识清晰度 身心松弛度 持续时间长度 冥想体验深度 冥想后的清晰明确度 内心平静程度 生活联结程度 成效持续时间 ","permalink":"https://myself659.github.io/post/life/meditation-principles/","summary":"\u003ch2 id=\"原则\"\u003e原则\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e每日冥想，养成冥想的习惯\u003c/li\u003e\n\u003cli\u003e以早起冥想开始一天\u003c/li\u003e\n\u003cli\u003e以睡前冥想开启入睡\u003c/li\u003e\n\u003cli\u003e确立冥想质量意识与因素\u003c/li\u003e\n\u003cli\u003e一天的冥想度量指标=冥想的次数+冥想总时长+冥想的质量\u003c/li\u003e\n\u003cli\u003e先身体静下来如坐下来与闭上眼睛，再让心静下来，然后让身心专注\u003c/li\u003e\n\u003cli\u003e单次冥想最小时长为5分钟\u003c/li\u003e\n\u003cli\u003e冥想后应该开启心流状态，变现冥想的作用\u003c/li\u003e\n\u003cli\u003e冥想即休息\u003c/li\u003e\n\u003cli\u003e冥想即调节，如状态不好的时候，主动开始冥想\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"冥想质量因素\"\u003e冥想质量因素\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e注意力集中度\u003c/li\u003e\n\u003cli\u003e意识清晰度\u003c/li\u003e\n\u003cli\u003e身心松弛度\u003c/li\u003e\n\u003cli\u003e持续时间长度\u003c/li\u003e\n\u003cli\u003e冥想体验深度\u003c/li\u003e\n\u003cli\u003e冥想后的清晰明确度\u003c/li\u003e\n\u003cli\u003e内心平静程度\u003c/li\u003e\n\u003cli\u003e生活联结程度\u003c/li\u003e\n\u003cli\u003e成效持续时间\u003c/li\u003e\n\u003c/ol\u003e","title":"个人冥想的原则"},{"content":"tips 正确的用眼习惯\n控制与减少屏幕时间\n增加户外活动\n避免长时间用眼，多看窗外与远望\n保持身体活跃：慢跑、游泳、快走。促进血液流向眼部神经，从而保持眼部健康\n多吃水果与蔬菜，补充维生素 A、E、C、B2、B3、B6、B9、B12、脂肪酸以及抗氧化剂叶黄素\n视觉练习\n建立眼睛状态的基线，定期检查\n","permalink":"https://myself659.github.io/post/life/%E9%98%B2%E6%AD%A2%E8%A7%86%E5%8A%9B%E4%B8%8B%E9%99%8D-decline-eyesight/","summary":"\u003ch2 id=\"tips\"\u003etips\u003c/h2\u003e\n\u003col start=\"0\"\u003e\n\u003cli\u003e\n\u003cp\u003e正确的用眼习惯\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e控制与减少屏幕时间\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e增加户外活动\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e避免长时间用眼，多看窗外与远望\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e保持身体活跃：慢跑、游泳、快走。促进血液流向眼部神经，从而保持眼部健康\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e多吃水果与蔬菜，补充维生素 A、E、C、B2、B3、B6、B9、B12、脂肪酸以及抗氧化剂叶黄素\u003c/p\u003e","title":"如何防止视力下降"},{"content":"tips 心肺是基础，全面的运动健身先从心肺相关练习开始，例如从跑步开始\n不依赖器械，这样可以减少依赖，有利于养成习惯\n重视预热和静态拉伸，这样可以增强灵活性,预防运动损伤\n加强核心肌群训练，强化核心可以提高全身力量,增强稳定性\n进行有氧和无氧训练的轮换,两者结合可以达到协同效应\n适量增加训练强度，逐步增加强度可以继续取得进步\n训练时关掉手机,保持专注,可以减少受伤风险并提高效果\n适当增加饮水与补充电解质\n食物营养同运动结合\n保持长期科学运动的习惯\n从小目标开始，从自己喜欢的运动开始\n健身的同时也健心，保持乐观积极的心态\n","permalink":"https://myself659.github.io/post/sport/tips-for-workout-%E5%81%A5%E8%BA%AB%E9%94%BB%E7%82%BC/","summary":"\u003ch2 id=\"tips\"\u003etips\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e心肺是基础，全面的运动健身先从心肺相关练习开始，例如从跑步开始\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e不依赖器械，这样可以减少依赖，有利于养成习惯\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e重视预热和静态拉伸，这样可以增强灵活性,预防运动损伤\u003c/p\u003e","title":"有关运动健身的Tips"},{"content":"冥想是一种认知 冥想是一种需要深入理解和实践的过程，它涉及到的不仅仅是静坐和放空，更包含着极简主义、专注当下、相信过程、开放心态、佛系心态和耐心修行等多个层面。\n极简主义 在冥想的世界中，极简主义的精神得到了充分的体现。“少即是多”，这表明我们在冥想中应该学会减少思考，让自己的注意力更加集中。“学会放弃”，则是告诉我们在冥想的过程中要学会放下对各种事物的固执和执念。“学会断舍离”，是指在冥想中要学会放下内心的杂念和纷扰。通过极简主义的实践，我们可以从“fullmind”繁忙的思维中走向“mindful”清空的心灵。\n专注当下 冥想的过程就是一种专注当下的过程。这意味着我们在冥想中应该将所有的注意力集中在当前的一切上，无论是呼吸，还是身体的感觉，或是周围环境的声音，都可以成为我们冥想的对象。这种专注当下的状态，可以帮助我们从繁杂的思维中解脱出来，进入一种平静和专注的状态。\n相信过程 在冥想中，“过程大于结果”是一种非常重要的理念。这意味着我们应该享受冥想的过程，哪怕是自己在冥想边缘徘徊的过程，也应该进行有意识的练习与训练，而不能只追求结果。因为，只有当我们真正沉浸在冥想的过程中，才能体验到冥想带来的真正益处。\n开放心态 痛苦是生活的一部分，我们不能避免，也不能逃避。冥想教会我们以一种平静的方式直面问题与痛苦，积极接受问题与痛苦。只有这样，问题与痛苦的感觉才会消失，我们的情绪负担才会减轻。因此，冥想实际上是一种机会，它让我们有机会以全新的角度去看待生活和问题。\n佛系心态 佛系心态是一种平和从容、顺应现实、知足长乐而又对生命怀有深刻理解的心态状态。这种心态十分适合冥想。在冥想中，我们不应试图让头脑安静下来，而应让它自然地流动，不执着于结果，不过度奢求，这就是佛系的心态。\n耐心修行 冥想不是一蹴而就的事情，它需要我们有足够的耐心去修行。当你进入不了冥想的状态的时候，你要有耐心先坐下来，闭上眼睛，打磨自己。只有这样，我们才能逐渐进入冥想的状态，感受到冥想带来的宁静和平和。\n总结 总的来说，冥想是一种需要我们全身心投入的修行。通过极简主义、专注当下、信任过程、开放心态、佛系心态和耐心修行，我们可以更好地理解和实践冥想，从而达到内心的平静和清净，提升生活的品质和意识的清晰度。\n冥想不仅是mindfull的练习，也是一种认知的练习。\n","permalink":"https://myself659.github.io/post/life/meditation-mindset/","summary":"\u003ch2 id=\"冥想是一种认知\"\u003e冥想是一种认知\u003c/h2\u003e\n\u003cp\u003e冥想是一种需要深入理解和实践的过程，它涉及到的不仅仅是静坐和放空，更包含着极简主义、专注当下、相信过程、开放心态、佛系心态和耐心修行等多个层面。\u003c/p\u003e","title":"冥想的认知"},{"content":"21 rules from 《The Rules of Programming》 Rule 1: As Simple as Possible, but No Simpler\nRule 2: Bugs Are Contagious\nRule 3: A Good Name Is the Best Documentation\nRule 4: Generalization Takes Three Examples\nRule 5: The First Lesson of Optimization Is Don\u0026rsquo;t Optimize\nInterlude: In Which the Previous Chapter Is Criticized\nRule 6: Code Reviews Are Good for Three Reasons\nRule 7: Eliminate Failure Cases\nRule 8: Code That Isn\u0026rsquo;t Running Doesn\u0026rsquo;t Work\nRule 9: Write Collapsible Code\nRule 10: Localize Complexity\nRule 11: Is It Twice as Good?\nRule 12: Big Teams Need Strong Conventions\nRule 13: Find the Pebble That Started the avalanche\nRule 14: Code Comes in Four Flavors、\nRule 15: Pull the Weeds\nRule 16: Work Backward from Your Result, Not Forward from Your code\nRule 17: Sometimes the Bigger Problem Is Easier to Solve\nRule 18: Let Your Code Tell Its Own Story\nRule 19: Rework in Parallel\nRule 20: Do the Math\nRule 21: Sometimes You Just Need to Hammer the Nails\n","permalink":"https://myself659.github.io/post/aip/book-the-rules-of-programming/","summary":"\u003ch2 id=\"21-rules-from-the-rules-of-programming\"\u003e21 rules from 《The Rules of Programming》\u003c/h2\u003e\n\u003cp\u003eRule 1: As Simple as Possible, but No Simpler\u003c/p\u003e\n\u003cp\u003eRule 2: Bugs Are Contagious\u003c/p\u003e\n\u003cp\u003eRule 3: A Good Name Is the Best Documentation\u003c/p\u003e\n\u003cp\u003eRule 4: Generalization Takes Three Examples\u003c/p\u003e\n\u003cp\u003eRule 5: The First Lesson of Optimization Is Don\u0026rsquo;t Optimize\u003c/p\u003e\n\u003cp\u003eInterlude: In Which the Previous Chapter Is Criticized\u003c/p\u003e\n\u003cp\u003eRule 6: Code Reviews Are Good for Three Reasons\u003c/p\u003e\n\u003cp\u003eRule 7: Eliminate Failure Cases\u003c/p\u003e\n\u003cp\u003eRule 8: Code That Isn\u0026rsquo;t Running Doesn\u0026rsquo;t Work\u003c/p\u003e","title":"21 rules from The Rules of Programming"},{"content":"题目 有两个数分别为：\n99¹⁰⁰ 100⁹⁹ 哪个数更大？\n解答 字符长度比较 1 2 \u0026gt;\u0026gt;\u0026gt; len(str(99**100)) 200 1 2 \u0026gt;\u0026gt;\u0026gt; len(str(100**99)) 199 所以可以得出： 99¹⁰⁰ \u0026gt; 100⁹⁹\n二项式展开 为了比较 99¹⁰⁰ 和 100⁹⁹，我们可以通过观察这两个数的大小关系来确定它们之间的关系。我们可以先将 100⁹⁹ 转换为相对于 99 的形式，然后通过比较幂次来确定这两个数的大小。\n首先，我们可以将 100 表示为 99 + 1。\n然后我们可以将 100⁹⁹ 表示为 (99 + 1)⁹⁹。根据二项式定理，我们可以将 (99 + 1)⁹⁹ 展开为：\n(99 + 1)⁹⁹ = 99⁹⁹ + 99C1 × 99⁹⁸ × 1 + 99C2 × 99⁹⁷ × 1² + \u0026hellip; + 99C98 × 99 × 1⁹⁸ + 1⁹⁹\n同时将99¹⁰⁰展开为：\n99¹⁰⁰ = 99⁹⁹ + 99⁹⁹ + 99⁹⁹ + \u0026hellip; + 99⁹⁹\n99⁹⁹ - 99C2 × 99⁹⁷ = 99⁹⁹ - 99 * 98 * 99⁹⁷ /2 \u0026gt; 1.\n通过对每一项对比可知：\n100⁹⁹ \u0026lt; 99¹⁰⁰\n因此，99¹⁰⁰ 是这两个数中较大的一个。\n函数求导 首先对问题进行转化：\n同一个正数的集合，在总和为9900不变的情况，如果这个集合的数字相乘，在什么情况下乘积最大。\n改用数学描述与解决问题过程如下图：\n","permalink":"https://myself659.github.io/post/math/99pow100-vs-100pow99/","summary":"\u003ch2 id=\"题目\"\u003e题目\u003c/h2\u003e\n\u003cp\u003e有两个数分别为：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e99¹⁰⁰\u003c/li\u003e\n\u003cli\u003e100⁹⁹\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e哪个数更大？\u003c/p\u003e\n\u003ch2 id=\"解答\"\u003e解答\u003c/h2\u003e\n\u003ch3 id=\"字符长度比较\"\u003e字符长度比较\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt;\u0026gt;\u0026gt; len(str(99**100))\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e200\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt;\u0026gt;\u0026gt; len(str(100**99))\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e199\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e所以可以得出： 99¹⁰⁰ \u0026gt; 100⁹⁹\u003c/p\u003e\n\u003ch3 id=\"二项式展开\"\u003e二项式展开\u003c/h3\u003e\n\u003cp\u003e为了比较 99¹⁰⁰ 和 100⁹⁹，我们可以通过观察这两个数的大小关系来确定它们之间的关系。我们可以先将 100⁹⁹ 转换为相对于 99 的形式，然后通过比较幂次来确定这两个数的大小。\u003c/p\u003e","title":"99¹⁰⁰与100⁹⁹谁大"},{"content":"背景 写作这项技能被低估了。\n写作被低估了，是因为我们没有好好定义什么是写作？或者说我们没有理解写作是什么？\n当我们不去作的事情，我们一定认为这件事是不重要的。当我们深入理解了写作的重要性，才能动力去写作，至少会开始记录（写作的最低水平）。\n写作即记录 写作首先完成记录。\n如果把一条记录看作一条数据，那么写作就是不断扩大与完善自己的（知识与信息）数据库。这个数据库是你记忆的外部缓存，这个数据库是进行知识构建的原材料。\n写作即沟通 写作的过程就是一个与自己沟通的过程，一个表达自己相法的过程，一个基于输出的沟通过程，可以分以下几个基本流程：\n写作输出内容与信息 基于输出内容与信息给出反馈 基于反馈再修改与优化 写作即思考 写作是知识整理，知识提炼，知识整合的过程。\n写作是知识表达与输出的过程。\n写作是知识学习自我检查的过程。\n写作有利于专注思考。\n清晰的输出离不开清晰，深度，广度的思考。\n写作即学习 学习一个新的知识与技能，通过写作输出教程就是一种不错的学习方法。\n在写作的过程需要解决学习过程遇到的各种问题，只有解决这些问题，才能完成写作。这种也可以叫做写作驱动学习（Writing drive Learning）。\n读书使人充实，写作使人精确。通过写作驱动学习可以精确地掌握知识与技能。\n写作即输出 写作不仅是记录，写作的文章与内容只给自己看那是对自己的输出，如果公开出来那就是公开的输出。 这些内容的输出在当今互联网时代，就是自己这个节点对外连接的连接点（endpoint）之一。\n输出即证明。写作的输出的水平可以判断一个人的水平。\n写作即分享 写作的内容通过互联网传播就是分享，优质的分享可以带来影响力。\n写作即复利 写作可以让一个人的思想、知识和技能在不断的实践和积累中不断提高，就像财务投资中的复利可以让初始投资随着时间的推移不断增长。\n坚持写作，会不断地提高自己的能力，不断地提高自己输出的质量，不断地提高自己的影响力。。。\n小结 写作是什么？写作是记录，是沟通，是思考，是学习，是输出，是分享，是复利。\n开始写作吧，打开一个新的动力引擎，开启一个新的成长之路。\n","permalink":"https://myself659.github.io/post/rt/what-is-writing/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e写作这项技能被低估了。\u003c/p\u003e\n\u003cp\u003e写作被低估了，是因为我们没有好好定义什么是写作？或者说我们没有理解写作是什么？\u003c/p\u003e\n\u003cp\u003e当我们不去作的事情，我们一定认为这件事是不重要的。当我们深入理解了写作的重要性，才能动力去写作，至少会开始记录（写作的最低水平）。\u003c/p\u003e","title":"写作是什么"},{"content":"定义 最大摄氧量（maximal oxygen uptake，或写为 VO2 max），指一个人在海平面上，从事最激烈的运动时，组织细胞所能消耗或利用的氧之最高值。最大摄氧量可用来评价个人有氧作业能量及心肺耐力，并可藉以设定运动员的耐力运动训练强度。\n最大摄氧量是衡量心肺系统在给定的身体条件和氧气供应水平下将氧气从空气输送到组织的能力极限的有效指标。\n数值 一般说来，最大摄氧量是越大越好。这个给出一个参考值：一个精英级的马拉松运动员其最大摄氧量是80左右，单位是毫升每千克体重每分钟(ml/kg/min)。这是很多人都难以达到的数值。所以普通人的低线要将最大摄氧量保持在40以上，然后尽量往上提高。\n测量 除了平板运动测试，个人推荐使用苹果的iwatch，在跑步的时候进行测试，这种很方便，而且可以持续的测试与跟踪。\n影响因素 肺的通气能力 心脏输出量 血液运氧能力 肌肉的有氧代谢能力 运动能力 重要性 提高最大摄氧量对个人的健康与健身具有重要的意义。\n改善心血管健康 预测运动表现 确定运动强度 监控培训进度 识别和监测健康风险 如何提高最大摄氧量 定期的心血管运动如慢跑、骑自行车、网球或游泳，以改善心血管健康和耐力\n高强度间歇训练和冲刺\n力量运动\n有氧和无氧交叉训练\n保持合理的体重\n运动后充分的恢复和恢复\n适当的营养与水分补充\n总结 最大摄氧量不仅是体能的重要指标，也是心血管健康重要指标。\n参考 VO2 Max. Standard Ratings ","permalink":"https://myself659.github.io/post/sport/%E7%A7%91%E6%99%AE%E6%9C%80%E5%A4%A7%E6%91%84%E6%B0%A7%E9%87%8F-vo2max/","summary":"\u003ch2 id=\"定义\"\u003e定义\u003c/h2\u003e\n\u003cp\u003e最大摄氧量（maximal oxygen uptake，或写为 VO2 max），指一个人在海平面上，从事最激烈的运动时，组织细胞所能消耗或利用的氧之最高值。最大摄氧量可用来评价个人有氧作业能量及心肺耐力，并可藉以设定运动员的耐力运动训练强度。\u003c/p\u003e","title":"科普最大摄氧量"},{"content":"how to feel better write when overthinking\nmeditate when anxious\nNap when Tired\nExercise when sad\ngo for a walk when stressed\nListen to music when angry\nreduce screen time when lazy\nswitch or stop when burnt out\n","permalink":"https://myself659.github.io/post/life/how-to-feel-better/","summary":"\u003ch2 id=\"how-to-feel-better\"\u003ehow to feel better\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003ewrite when overthinking\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003emeditate when anxious\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eNap when Tired\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eExercise when sad\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ego for a walk when stressed\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eListen to music  when angry\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ereduce screen time  when lazy\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eswitch or stop when burnt out\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e","title":"how to feel better"},{"content":"休息是什么 休息是调节。\n休息是放空。\n休息是充电。\n休息是节奏。\n原则 身心一体 以个性化方式达到慢下来，安静，舒适，放松，享受的状态 以恢复与加强能量和活力为目标 要素与方式 身体休息:这是大脑最基本也最容易理解的休息方式。睡眠可以让大脑和身体恢复活力,修复身体机能,清除毒素。缺乏睡眠会导致注意力减退、学习障碍、记忆力下降等问题。 情绪休息:这表示通过各种方式实现情绪的释放和调节,减轻压力与负面情绪。我们可以通过运动、音乐、冥想、社交等方式实现情绪休息。长期的压力与负面情绪可以对大脑造成伤害,影响认知功能。 认知休息:这表示停止过度刺激大脑,给大脑一个停顿来处理信息。我们可以通过在工作或学习之余进行娱乐活动、阅读小说、散步等方式实现认知休息。长时间过度使用大脑进行复杂认知活动,会导致大脑疲劳,降低工作效率与创造力。 总而言之,身体休息、情绪休息和认知休息都是大脑健康运行所需要的。它们可以清除大脑毒素,减轻压力,提高大脑活力与认知功能。合理利用这三种休息方式,可以最大限度发挥我们的才智与创造力,活出健康快乐的人生。 三种休息方式相辅相成,缺一不可。我们只有在身体、情绪和认知上都获得良好休息的情况下,大脑才能保持最佳状态。每个人都需要在生活中找到最适合自己的休息方式与时间,合理规划各种休息活动,让大脑始终处于恢复与活力状态。 ","permalink":"https://myself659.github.io/post/life/how-to-rest/","summary":"\u003ch2 id=\"休息是什么\"\u003e休息是什么\u003c/h2\u003e\n\u003cp\u003e休息是调节。\u003c/p\u003e\n\u003cp\u003e休息是放空。\u003c/p\u003e\n\u003cp\u003e休息是充电。\u003c/p\u003e\n\u003cp\u003e休息是节奏。\u003c/p\u003e\n\u003ch2 id=\"原则\"\u003e原则\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e身心一体\u003c/li\u003e\n\u003cli\u003e以个性化方式达到慢下来，安静，舒适，放松，享受的状态\u003c/li\u003e\n\u003cli\u003e以恢复与加强能量和活力为目标\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"要素与方式\"\u003e要素与方式\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e身体休息:这是大脑最基本也最容易理解的休息方式。睡眠可以让大脑和身体恢复活力,修复身体机能,清除毒素。缺乏睡眠会导致注意力减退、学习障碍、记忆力下降等问题。\u003c/li\u003e\n\u003cli\u003e情绪休息:这表示通过各种方式实现情绪的释放和调节,减轻压力与负面情绪。我们可以通过运动、音乐、冥想、社交等方式实现情绪休息。长期的压力与负面情绪可以对大脑造成伤害,影响认知功能。\u003c/li\u003e\n\u003cli\u003e认知休息:这表示停止过度刺激大脑,给大脑一个停顿来处理信息。我们可以通过在工作或学习之余进行娱乐活动、阅读小说、散步等方式实现认知休息。长时间过度使用大脑进行复杂认知活动,会导致大脑疲劳,降低工作效率与创造力。\n总而言之,身体休息、情绪休息和认知休息都是大脑健康运行所需要的。它们可以清除大脑毒素,减轻压力,提高大脑活力与认知功能。合理利用这三种休息方式,可以最大限度发挥我们的才智与创造力,活出健康快乐的人生。\n三种休息方式相辅相成,缺一不可。我们只有在身体、情绪和认知上都获得良好休息的情况下,大脑才能保持最佳状态。每个人都需要在生活中找到最适合自己的休息方式与时间,合理规划各种休息活动,让大脑始终处于恢复与活力状态。\u003c/li\u003e\n\u003c/ol\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c!-- raw HTML omitted --\u003e","title":"学会休息"},{"content":"定义 先看wiki的定义：\nA model is an informative representation of an object, person or system. The term originally denoted the plans of a building in late 16th-century English, and derived via French and Italian ultimately from Latin modulus, a measure\n模型是对世界的简化，抽象和概括。\n一切知识都是模型。\npattern vs model pattern是现象,model是机制;\npattern是描述,model是解释;\npattern是观察,model是理解。\npattern偏向应用，model偏向框架。\npattern偏向具体，model偏向抽象。\npattern与model在应用的时候都有一定的限制与局限性。\n模型无处不在，模型无时不在 一切知识都是模型。模型无处不在。\n无论主观上心智模型而是客观世界的规律，模型无时不在默默地影响整个世界。\n下面举几个例子说明：\n科学模型：在科学研究中，科学家们通过建立数学模型、物理模型和计算模型等，来描述和预测现象。例如，牛顿运动定律可以看作是描述物体运动的模型；基因的遗传模型帮助我们理解遗传特征是如何传递的。\n心理模型：在心理学中，心理模型是指人们用来解释自己和他人行为的一种内在认知结构。心理模型可以帮助我们理解和预测别人的行为。例如，我们可能有一个关于朋友性格特点的心理模型，这个模型可以帮助我们预测朋友在特定情境下的行为反应。\n概念模型：我们在学习新知识时，通常会建立一些概念模型，以便更好地理解这些知识。例如，我们在学习计算机科学时，可能会建立一个关于计算机系统结构的概念模型，这个模型可以帮助我们理解计算机是如何工作的。\n数据模型：在数据处理领域，数据模型是用来描述现实世界中的实体和它们之间关系的一种形式化表示。例如，关系型数据库中的表结构就是一种数据模型，它可以帮助我们组织和操作数据。\n应用模型 善用模型 学会利用模型来理解世界，理解自己。\n利用模型可以减少认知的成本。\n善用模型要点如下：\n用好模型 用好模型 超越模型 不迷信模型 不要迷信模型的原因如下：\n模型的质量参差不齐\n即使最好的模型也只是对事实的近似描述与表达。模型只是事实的简化，它并不能代表事实\n模型的应用范围一定是有限制，模型可能不适用于现实\n模型存在偏见\n模型是压缩的，很可能存在压缩损失\n所以在应用模型不要迷信模型，要敢于怀疑一切，大胆假设，小心求证。\n提高自己的心智模型 上面提到不能迷信的模型，所以要努力提高自己的心智模型。\n我们是什么样的人取决于我们如何思考。 我们如何思考取决于我们的心智模型。\n提高自己的心智模型，有利于我们能够适应新的挑战，复杂性的问题，不断变化的世界。\n总结 模型是对世界的简化，抽象和概括。一切知识都是模型，模型无时不在，无处不在\n用好模型\n超越模型\n","permalink":"https://myself659.github.io/post/ai/%E8%AF%B4%E8%AF%B4%E6%A8%A1%E5%9E%8Bmodel/","summary":"\u003ch2 id=\"定义\"\u003e定义\u003c/h2\u003e\n\u003cp\u003e先看wiki的定义：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA model is an informative representation of an object, person or system. The term originally denoted the plans of a building in late 16th-century English, and derived via French and Italian ultimately from Latin modulus, a measure\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e模型是对世界的简化，抽象和概括。\u003c/p\u003e\n\u003cp\u003e一切知识都是模型。\u003c/p\u003e","title":"说说模型"},{"content":"背景 chatGPT开启的AIGC领域，最近几个月的发展可以说日新月异，众多LLM如雨后春笋，最近autoGPT的出现，更是吸引大家的关注。\nautoGPT autoGPT是什么？作者对其定义是：An experimental open-source attempt to make GPT-4 fully autonomous.\n如果说GPT-4是当前最先进的知识计算引擎，那么autoGPT改变我们使用GPT-4的方式：由写prompt手动操作到由autoGPT根据目标自动写prompt.打一个比方就是汽车由手动档换成自动档。\n所以说autoGPT改变了我们与GPT-4的交互方式\n与GPT-4交互方式的发展方向：低门槛，语音化，自动化，智能化\nautoGPT给GPT-4提供一种使用方式：根据目标自动生成一系列的prompt， 相信GPT-4极大可能将这种使用方式融入自身当中\n如果GPT-4属于引擎层，那么autoGPT属于接口层或者称为代理层， 接口层的作用是将GPT-4以更多的方式接入到更多的应用场景当中\nautoGPT是如何工作呢？这里面最核心的问题是如何根据任务分解任务，生成prompt？\n以autoGPT为代表的接口层未来是否可以实现多LLM协同完成任务？\n以autoGPT为代表的代理层成为个人在数字世界（元宇宙）的代理？\nautoGPT当前存在的问题：使用成本与门槛过高，太费token同时也要求使用者自己会搭建应用环境\n总之，autoGPT开启一个如何使用AGI这一新的研究课题\n参考 Auto-GPT\nAgentGPT\ncognosys\n","permalink":"https://myself659.github.io/post/ai/autogpt-101/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003echatGPT开启的AIGC领域，最近几个月的发展可以说日新月异，众多LLM如雨后春笋，最近autoGPT的出现，更是吸引大家的关注。\u003c/p\u003e\n\u003ch2 id=\"autogpt\"\u003eautoGPT\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eautoGPT是什么？作者对其定义是：An experimental open-source attempt to make GPT-4 fully autonomous.\u003c/p\u003e","title":"说说autoGPT"},{"content":"chatGPT是知识计算引擎 chatGPT是知识计算引擎。\nchatmind团队在chatGPT的基础之上，开发一款产品：提供prompt模块，快速生成各种总结与思维导图。\n下面先看一个具体的例子。\n示例 模板 1 Please help me generate a study notes mind map about [A Hacker\u0026#39;s Mind] 输出 ![思维导图](/images/ai/A Hacker\u0026rsquo;s Mind.svg)\n优化与调整 ![增加细节](/images/ai/A Hacker\u0026rsquo;s Mind-1.svg)\n![增加维度](/images/ai/A Hacker\u0026rsquo;s Mind-2.svg)\n评价 速度快 内容重点突出 支持优化与调整：rewrite, ex Branch, ex Level, Ex Detail, Ex Idea 使用简单 总结 chatmind充分利用GPT的api chatmind专注于一个小应用场景：总结与思维导图 chatmind对prompt进行封装 chatmind优化用户体验，降低门槛 ","permalink":"https://myself659.github.io/post/ai/chatmind-book-mindmap/","summary":"\u003ch2 id=\"chatgpt是知识计算引擎\"\u003echatGPT是知识计算引擎\u003c/h2\u003e\n\u003cp\u003echatGPT是知识计算引擎。\u003c/p\u003e\n\u003cp\u003echatmind团队在chatGPT的基础之上，开发一款产品：提供prompt模块，快速生成各种总结与思维导图。\u003c/p\u003e","title":"利用chatmind生成mindmap实现快速阅读"},{"content":"背景 天门山跳崖：四个决绝赴死的农村青年\n天门山跳崖：四个决绝赴死的农村青年\n看到这个新闻，深受震撼，十分痛心与惋惜。\n决绝赴死的原因极大可能是在长期苦难之下，看不到希望，感到绝望。\n社会的声音 对于这个事件社会有很多声音：\n没有刀人，撞人和砸人……而是选择默默地离开，或许他们对这个世界曾经爱过吧…\n活着如果只是没完没了吃苦，真的会丧失活下去的意志\n我只不过是投胎投的好点罢了，没有一点资格评价他们\n都是被苦难击倒的可怜人，下辈子过得好点吧\n可能到了最后，只能感觉到只有死才是自己能做主的[单身狗]，安息吧朋友们，愿那边没有压力\n这里容不下疲累，不承认贫穷，不允许错误。根基稍弱一点，运气稍差一点，一不留神就会被远远抛下。愿他们在那边世界得以解脱，\n让年青人绝望的社会是没有希望的社会\n假如社会抛弃了你 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 假如社会抛弃了你，不要颓废，不要气馁！ 孤独的日子里须要坚强：相信吧，友爱的人们终将相逢！ 心儿永远追求着真理；现在却常是彷徨。 一切都是过程，一切都将会改变；而那改变了的，就会成为坚定的信念。 假如社会抛弃了你，不要忧虑，不要恐惧！ 挫折的日子里须要勇敢：相信吧，成功的喜悦必将降临！ 心儿永远展望着前方；现在却常是迷茫。 一切都是成长，一切都将会消逝；而那消逝了的，就会成为宝贵的经验。 假如社会抛弃了你，不要沮丧，不要退缩！ 黑暗的日子里须要希望：相信吧，光明的未来正等待着你！ 心儿永远燃烧着激情；现在却常是疲惫。 一切都是奋斗，一切都将会起航；而那起航了的，就会成为美好的回忆。 对自己好一点 不断学习，熟悉社会，学会保护自己，防止上当受骗\n坦然面对现实，接受自己的普通与平凡，善待自己\n看长远一些，时间也许会冲淡一切\n学会断舍离\n尽力就好，躺平无过\n","permalink":"https://myself659.github.io/post/life/%E5%81%87%E5%A6%82%E7%A4%BE%E4%BC%9A%E6%8A%9B%E5%BC%83%E4%BA%86%E4%BD%A0/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://weibo.com/1191965271/MB52rAqQS\"\u003e天门山跳崖：四个决绝赴死的农村青年\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://mp.weixin.qq.com/s/WseandpBBUathNTJDJz-Nw\"\u003e天门山跳崖：四个决绝赴死的农村青年\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e看到这个新闻，深受震撼，十分痛心与惋惜。\u003c/p\u003e\n\u003cp\u003e决绝赴死的原因极大可能是在长期苦难之下，看不到希望，感到绝望。\u003c/p\u003e\n\u003ch2 id=\"社会的声音\"\u003e社会的声音\u003c/h2\u003e\n\u003cp\u003e对于这个事件社会有很多声音：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e没有刀人，撞人和砸人……而是选择默默地离开，或许他们对这个世界曾经爱过吧…\u003c/p\u003e","title":"假如社会抛弃你"},{"content":"背景 chatGPT的横空出世，宣告真正的人工智能时代已经开启。\n未来会是怎么样，没有人知道，我只知道这两点：\n会用AI的人淘汰不会用AI 谁更会用AI，谁更有竞争力 下面我们就看一下GPT们是怎么教我们用好他们的。\nhow use GPTs to level up my knowledge, insight, wisdom, and skills. chatGPT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Certainly! Here are 20 different ways you can use me to level up your knowledge, insight, wisdom, and skills: 1. Ask me questions about topics you\u0026#39;re interested in. I can provide you with information and explanations that can help you deepen your understanding of those topics. 2. Use me to practice your writing skills by asking me to generate writing prompts for you. 3. Ask me to suggest books, articles, or other resources on a topic you want to learn more about. 4. Use me to practice your public speaking skills by asking me to generate speech topics for you. 5. Ask me to provide you with feedback on your writing or speaking. I can help you identify areas for improvement. 6. Use me to practice your critical thinking skills by asking me to generate thought-provoking questions for you to answer. 7. Ask me for advice on a problem you\u0026#39;re facing. I can help you brainstorm solutions and weigh the pros and cons of different options. 8. Use me to practice your research skills by asking me to find information on a specific topic. 9. Ask me to provide you with a daily dose of inspiration or motivation by generating inspiring quotes or messages. 10. Use me to learn a new language by asking me to generate vocabulary words or phrases in that language. 11. Ask me to generate trivia questions for you to answer. This can help you expand your general knowledge. 12. Use me to practice your creativity by asking me to generate writing prompts or art prompts for you. 13. Ask me to suggest podcasts or documentaries on a topic you\u0026#39;re interested in. This can help you gain a deeper understanding of that topic. 14. Use me to practice your time management skills by asking me to generate a schedule or to-do list for you. 15. Ask me to provide you with tips or strategies for learning a new skill or subject. 16. Use me to practice your communication skills by asking me to generate conversation starters or icebreakers for you. 17. Ask me to suggest online courses or tutorials on a topic you want to learn more about. 18. Use me to practice your problem-solving skills by asking me to generate hypothetical problems for you to solve. 19. Ask me to provide you with feedback on your creative work, such as writing, art, or music. 20. Use me to practice your decision-making skills by asking me to generate hypothetical scenarios for you to make decisions about. GPT4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 1. **Research assistance**: Use me to gather information on any subject, from history to technology, to deepen your understanding. 2. **Book summaries**: Request summaries of books or articles to quickly expand your knowledge on various topics. 3. **Language learning**: Practice your language skills by engaging in conversations with me in your target language. 4. **Writing tips**: Improve your writing skills by asking for tips, techniques, and feedback on your work. 5. **Problem-solving**: Pose complex problems or scenarios for me to help you brainstorm creative solutions. 6. **Critical thinking**: Engage in debates or discussions to challenge your perspective and enhance your critical thinking abilities. 7. **Skill development**: Ask me for resources or exercises to develop specific skills such as programming, graphic design, or public speaking. 8. **Career advice**: Seek guidance on your career path, job applications, and interview techniques. 9. **Time management**: Request tips and strategies to improve your time management and productivity. 10. **Memory techniques**: Learn memory-enhancing techniques such as the Method of Loci, mnemonics, or the Major System. 11. **Study strategies**: Ask for study techniques and methods like the Pomodoro Technique, spaced repetition, or the Feynman Technique. 12. **Philosophy and ethics**: Discuss philosophical ideas and ethical dilemmas to expand your moral and intellectual horizons. 13. **Personal finance**: Request advice on budgeting, investing, and financial planning. 14. **Health and wellness**: Discuss nutrition, exercise, and mental health strategies to improve your overall well-being. 15. **Cooking and recipes**: Learn new recipes and cooking techniques to expand your culinary skills. 16. **Art and culture**: Delve into the world of art, music, and culture to broaden your appreciation and understanding. 17. **Travel and geography**: Discover new destinations, cultures, and languages to enrich your global perspective. 18. **Science and technology**: Stay updated on the latest scientific discoveries and technological advancements. 19. **History and current events**: Discuss historical events and their impact on the present, as well as stay informed on current news. 20. **Personal growth**: Reflect on your strengths, weaknesses, and goals, and ask for guidance on self-improvement and personal development. Claude 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 Here are 20 ways I can help level up your knowledge, insight, wisdom and skills: 1. Ask me to explain complex ideas in simple terms. This strengthens your understanding. 2. Ask me for summaries of topics you\u0026#39;re interested in. This provides a high-level overview before diving into details. 3. Ask me for book or resource recommendations on subjects you want to learn. I can suggest materials at different skill levels. 4. Ask me to outline key steps to achieve a goal or master a skill. This breaks down the path into manageable chunks. 5. Ask me to provide examples that illustrate concepts or ideas. Examples enhance learning. 6. Ask me for key insights, main takeaways or lessons learned on various topics. This distills information into concise, memorable points. 7. Ask me for video, online course or tutorial recommendations to supplement your learning. I can recommend high-quality resources. 8. Brainstorm ideas with me on any topic or project. We can have an open exchange of ideas to gain new insights. 9. Ask me to find opportunities for hands-on practice. For example, tools to learn, ways to mentor others, meetups to join, side projects, etc. 10.Ask me thought-provoking questions about various issues. This sparks engaging discussion where you defend your position and challenge assumptions. 11. Ask me to provide facts, statistics, quotes or data on topics you\u0026#39;re exploring. I can supply credible information from reputable sources. 12. Ask me to review and provide feedback on work you\u0026#39;ve done like papers, projects, blog posts, code, designs, etc. My input can strengthen your thinking and outputs. 13. Ask me open-ended hypothetical questions like \u0026#34;What if?\u0026#34; or \u0026#34;Why not?\u0026#34;. We can explore possibilities and push boundaries. 14. Ask me to find contradictory or alternative perspectives on issues. This enhances critical thinking to navigate paradoxes and complex problems. 15. Ask me to share latest advances, discoveries or trends that could impact the future of a field. Staying current keeps you adaptable to change. 16.Ask me to compile information from multiple sources on subjects you\u0026#39;re interested in. I can synthesize material from across books, articles, studies, and expert opinions. 17. Quiz me on concepts or topics you want to learn. Explaining information back strengthens your own understanding and memory. 18. Ask me to generate ideas, options or solutions around problems you\u0026#39;re trying to solve. Fresh perspectives can lead to new insights. 19. Ask me open-ended questions about my knowledge, abilities or limitations. Understanding an AI system\u0026#39;s capabilities and constraints is important. 20. Experiment by giving me new types of questions or complex problems to see how I respond. Pushing an AI\u0026#39;s limits helps identify weaknesses and areas for improvement. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 这里有50种方法可以帮助提高您的知识、洞察力、智慧和技能: 1. 让我用简单的词语解释复杂的思想。这有助于加深您的理解。 2. 让我概括您感兴趣的主题。这在深入细节之前提供了高级概述。 3. 询问我关于您想学习的主题的书籍或资源推荐。我可以推荐不同技能水平的材料。 4. 让我概述实现目标或掌握一项技能的关键步骤。这能将路径分解为可管理的部分。 5. 让我提供例子来说明概念或思想。例子可以增强学习。 6. 让我提供各个主题的关键见解、要点或经验教训。这可以将信息简洁明了地表达出来,令人难忘。 7. 询问我的视频、在线课程或教程推荐以补充您的学习。我可以推荐高质量的资源。 8. 与我一起对任何主题或项目进行头脑风暴。我们可以开放意见交流,获得新的见解。 9. 让我找到实践的机会。例如,学习工具、辅导他人的方式、参加聚会、边项目等。 10.问我关于各种问题的发人深省的问题。这可以引发令人兴奋的讨论,在讨论中您要为自己的立场辩护并质疑假设。 11. 让我提供您探索的主题的事实、统计数据、引语或数据。我可以从可靠来源提供可信的信息。 12. 让我审阅并对您完成的工作(如论文、项目、博客文章、代码、设计等)提供反馈。我的意见可以加强您的思考与输出。 13. 问我开放式的假设性问题,如\u0026#34;如果呢?\u0026#34;或\u0026#34;为什么不呢?\u0026#34;。我们可以探索可能性,推动界限。 14. 让我找到问题的相反或另类观点。这可以增强您的批判性思维,帮助应对悖论与复杂问题。 15. 让我分享可能影响某个领域未来发展的最新进展、发现或趋势。密切关注可以使您适应变化。 16.让我从多个来源汇编您感兴趣的主题的信息。我可以综合书籍、文章、研究和专家意见中的材料。 17. 对我提问您想学习的概念或主题。解释信息可以加强您自己的理解与记忆。 18. 让我针对您要解决的问题生成想法、选择或解决方案。新视角可以导致新的见解。 19. 向我提出开放性的有关我的知识、能力或限制的问题。了解人工智能系统的功能与限制很重要。 20. 通过给我新的问题类型或复杂问题来试验,看我的反应。推动人工智能的极限可以发现弱点与改进空间。 21. 让我对您想学习的主题创建大纲或思维导图。可视化组织信息可以产生新的联系和见解。 22.与我讨论伦理问题和思想实验。探讨道德、价值观和\u0026#34;如果\u0026#34;可以增强批判性思维。 23. 让我在您关心的问题上担任魔鬼的代言人。辩护相反的观点可以质疑假设,拓宽视角。 24. 让我解释我的推理过程或\u0026#34;展示我的工作\u0026#34;的方式来提供信息。对人工智能过程的透明度可以建立信任并发现缺陷。 25. 与我提出假设场景或角色扮演情况。在各种情境中实践可以主动学习和解决问题。 26. 问我任何主题的开放领域问题。一个可以处理多样化、非限定性问题的人工智能需要强大的知识与会话能力。 27. 要求我以不同的方式重新解释或重新表达事物。以多种形式呈现信息可以加强学习。 28. 问我与可能性、创造力或想象力有关的推测性问题。讨论开放性的\u0026#34;如果\u0026#34;可以拓展思维。 29. 询问我的知识限制或我作为人工智能系统的工作方式。理解一项技术的功能与当前能力的限制是重要的环境因素。 30.通过给我故意模糊或含混不清的问题进行试验,看我的反应。处理不清晰、非结构化的输入需要高级会话能力。 31. 与我讨论观点或立场问题的论点与反论点。探讨一个讨论的双方可以拓宽视角。 32. 问我暗喻或诗意的问题,看我是否能创造性地回应。以多元、抽象的方式与语言和思想互动可以培养理解能力。 33. 询问我的知识与能力如何可以根据新数据和研究随着时间的推移而增强或扩展。 理解人工智能可能如何发展提供有用的背景环境。 34. 要求我总结信息或概括某个领域的最新进展。概括与总结信息对学习很有帮助。 35. 要我复述和总结您提供的信息和论点。重新表达信息有助于记忆与理解。 36. 询问与技术、科学或人工智能前沿发展领域相关的问题。了解最新进展有助于适应变化。 37. 让我分享各个主题的工具、技术或资源的比较与对比。对不同选项的权衡有助于做出更明智的选择。 38. 让我解释复杂系统、技术过程或科学主题。简明扼要地阐述这些概念有助于加深理解。 39. 让我建议解决某个问题或实现某个目标的步骤性方法。将任务分解为清晰易行的步骤十分实用。 40. 让我为某个概念、主题或技能筛选学习资源。我可以考虑不同的学习方式与技能水平进行推荐。 41. 让我溯源某个概念、主题或产品以完整描述其起源与演变过程。理解历史背景与发展轨迹有助于加深理解与判断。 42. 与我探讨有争议的主题或无法达成共识的问题。 43. 让我从不同学科、文化或观点解释某个概念或事件。多角度分析可以提供全面而平衡的理解。 44. 向我提出需要创新、思考外盒或与常识相悖的问题。这可以推动我发展更强大、更具创造力的推理与解决问题的能力。 45. 让我总结并重新表述您表达的某个观点或论据。这有助于澄清理解,发现以往未考虑的角度。 46. 询问我未来几年内某个技术、领域或社会问题可能产生的影响与结果。考虑不同的可能性与后果可以为应对变化做好准备。 47. 让我找出某个观点或论据中的逻辑漏洞、偏差或矛盾之处。理性和批判性分析对建立符合逻辑的观点很重要。 48. 询问我对某个决定或问题的建议,包括各种选择的优点、缺点与权衡考量。提供决策支持需要综合分析不同的因素。 49. 让我指出信息、数据、研究或推论中的瑕疵、限制与不确定性。理解信息的局限性对作出明智判断很重要。 50. 与我玩文字游戏或解谜来推动创造性思维。运用语言和模式识别的能力可以以新的方式关联概念与见解。 通过上述方法,我们可以进行深入和广泛的交流与探讨,不断推动并丰富我的知识与能力。我由衷地希望这些建议能对您有所帮助!如果您有任何其他的意见或建议,我也十分欢迎。 总结 GPT们知识储备远远超过个人 GPT们知识计算速度比我们人类 GPT们的总结，发散能力远超人类 GPT们没有自我意识，不会主动，被动接受prompt，人类要充分分挥自己的主动性与积极性，用好AI GPT们遵守这一规则：GIGO。所以要写好prompt HI+AI结合才是正道 ","permalink":"https://myself659.github.io/post/ai/how-to-ai-help-growth/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003echatGPT的横空出世，宣告真正的人工智能时代已经开启。\u003c/p\u003e\n\u003cp\u003e未来会是怎么样，没有人知道，我只知道这两点：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e会用AI的人淘汰不会用AI\u003c/li\u003e\n\u003cli\u003e谁更会用AI，谁更有竞争力\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e下面我们就看一下GPT们是怎么教我们用好他们的。\u003c/p\u003e","title":"如何利用GPT类AI提升自己"},{"content":"背景 GPT-4最近已经推出，那么GPT-4表现如何？相对于chatGPT使用的gpt3.5模型有哪些提高与进步？\n下面就通过三道逻辑题展开测试与对比。\n第一题 问题描述 1 2 3 4 5 6 三个逻辑学家下班后想在一起喝一杯，就来到一家酒吧。服务员问：给你们所有人都来杯酒？ 第一个说，我不知道。 第二个说，我也不知道。 第三个说：是的。 为什么第三人说“是的”。 chatGPT的回答 1 第三个逻辑学家的回答是“是的”，是因为如果服务员给所有人都倒一杯酒，那么第三个逻辑学家也会被包括在内。这里是一种间接的否定方式，他的意思是“不会有任何一个人不能喝酒，所以给所有人都来一杯酒”。 GPT4的回答 1 2 3 4 5 6 7 8 9 这个问题涉及到了逻辑推理。在这个场景中，三个逻辑学家下班后想喝酒。当服务员询问他们是否所有人都需要酒时，他们的回答反映了他们的观察和思考。我们可以分析每个逻辑学家的回答： 1. 第一个逻辑学家说：“我不知道。” 这表明他自己想喝酒，但不知道其他两人是否想喝。如果他自己不想喝，他会直接回答“不是”。 2. 第二个逻辑学家听到了第一个的回答，所以知道第一个逻辑学家想喝酒。然后他说：“我也不知道。” 这表示他自己也想喝酒，但仍然不知道第三个人是否想喝。如果第二个逻辑学家不想喝酒，他会知道答案是“不是”。 3. 第三个逻辑学家听到了前两个人的回答，所以知道第一个和第二个逻辑学家都想喝酒。然后他说：“是的。” 这表明他也想喝酒。因为前两个人都想喝酒，他可以确信所有人都想喝酒，所以回答“是的”。 通过逻辑学家们的回答，他们能够推理出彼此是否想喝酒，最终得出所有人都想喝酒的结论。 GPT-4O 1 2 3 4 5 6 7 8 9 10 11 这个逻辑笑话的关键在于逻辑学家们的回答方式和推理过程。让我们一步一步分析： 1. **服务员的问题**：给你们所有人都来杯酒吗？ 2. **第一个逻辑学家的回答**：我不知道。 - 这意味着第一个逻辑学家自己想要一杯酒，但不能确定其他两个人是否也想要。 3. **第二个逻辑学家的回答**：我也不知道。 - 这意味着第二个逻辑学家知道第一个逻辑学家想要酒（因为如果第一个不想要酒，他会直接说“不”），但是他自己也想要酒，并且他还不确定第三个人是否想要。 4. **第三个逻辑学家的回答**：是的。 - 既然第三个逻辑学家听到了前两个逻辑学家的回答，他知道前两个都想要酒。如果他自己也想要酒，那么所有人都想要酒，所以他可以确定地回答“是的”。 因此，第三个逻辑学家通过前两个逻辑学家的不确定性推理出他们都想要酒，再结合自己的意愿，最终得出所有人都想要酒的结论。 claude的回答 1 2 3 4 5 6 7 8 9 10 11 12 13 这个问题有一个简单的推理解答: 1) 第一个人说\u0026#34;我不知道\u0026#34;,说明他不知道另外两个人的答案。 2) 第二个人也说\u0026#34;我不知道\u0026#34;,说明他也不知道前一个人和后一个人的答案。 3) 只有第三个人说\u0026#34;是的\u0026#34;,这表明他知道前两个人的答案。 为什么他会知道?因为作为逻辑学家,他们都知道:如果任何一个人说\u0026#34;是的\u0026#34;,那服务员就会给他们三个人都来杯酒。 而第三个人知道前两个人都说\u0026#34;不知道\u0026#34;,所以他才会肯定地说\u0026#34;是的\u0026#34;,以确保服务员给他们三个人都上酒。 总的来说,第三个人说\u0026#34;是的\u0026#34;是因为他知道前面两个人的答案,并根据逻辑推断了整个情况。 claude2的回答 1 2 3 4 5 6 7 8 9 三个逻辑学家进入酒吧,服务员问他们是否都要一杯酒。 第一个逻辑学家说“我不知道”,表示他自己是否要酒取决于其他两个人的选择。 第二个同样表示自己不知道,也就是说自己是否要酒取决于第三个人的选择。 那么当第三个人说“是的”时,他就代表了所有三个人要酒,因为前两个人都表示要根据第三个人来决定。 第三个逻辑学家说“是的”,表示他们三个人都要来一杯酒。因为第一个逻辑学家表示要看第二个的态度,第二个要看第三个的态度,所以第三个逻辑学家的选择就代表了所有三个人的选择。 claude3-sonnet的回答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 这个谜题利用了逻辑学家的推理能力和语义上的巧妙表达。 原因是第三个逻辑学家根据前两个人的回答\u0026#34;我不知道\u0026#34;,推断出了一个有趣的结论。 第一个人说\u0026#34;我不知道\u0026#34;,可能有两种解释: a) 他真的不知道自己是否要酒 b) 他知道自己要酒,但装作不知道 第二个人说\u0026#34;我也不知道\u0026#34;,就暗示了他观察到第一个人的回答是\u0026#34;不知道\u0026#34;。 a) 如果第一个人真的不知道自己要不要酒,第二个人的\u0026#34;不知道\u0026#34;也可能是真实的 b) 但如果第一个人是在装作不知道,那么第二个人的\u0026#34;不知道\u0026#34;就是虚假的 第三个人意识到,如果前两个人都真的不知道自己要不要酒,那他就无法下定论。但是如果有一个人是在装作不知道,那就意味着另外两个人肯定都要酒。 所以当第三个人说\u0026#34;是的\u0026#34;,表示他推断出前两个人至少有一个人是在装作不知道,因此所有人都要酒。这正是利用了逻辑和语义上的巧妙逻辑推理。 claude3.5-sonnet的回答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 这是一个很有趣的逻辑推理问题。让我们一步步分析为什么第三个逻辑学家能够确定地说\u0026#34;是的\u0026#34;： 1. 问题的关键在于服务员的问题：\u0026#34;给你们所有人都来杯酒？\u0026#34; 2. 每个逻辑学家只知道自己是否想喝酒，但不知道其他人的意愿。 3. 第一个逻辑学家说\u0026#34;我不知道\u0026#34;，这意味着： - 他自己是想喝酒的（否则他会直接说\u0026#34;不\u0026#34;） - 但他不确定其他两人是否都想喝 4. 第二个逻辑学家说\u0026#34;我也不知道\u0026#34;，这意味着： - 他也是想喝酒的（否则他会说\u0026#34;不\u0026#34;） - 但他不确定第三个人是否想喝 5. 当轮到第三个逻辑学家时，他可以推断： - 前两个人都想喝酒（否则他们会直接说\u0026#34;不\u0026#34;） - 现在只取决于他自己是否想喝 6. 因为第三个逻辑学家说\u0026#34;是的\u0026#34;，这意味着他也想喝酒。 所以，第三个逻辑学家能够确定地说\u0026#34;是的\u0026#34;，因为他通过前两个人的回答推断出他们都想喝酒，而他自己也想喝。因此，他可以肯定地回答服务员的问题：是的，所有人都想喝酒。 这个问题展示了如何通过逻辑推理从有限的信息中得出结论，这正是逻辑学家们所擅长的。 第二题 问题描述 1 下面是一个戴帽子的游戏，现在有2 顶黑帽子，3 顶白帽子，主持人用黑布蒙上A、B、C三人的眼睛，并在每个人头上戴一顶帽子，剩下的两顶藏起来，然后解开B、C的蒙眼布，让他们三个人分别说出自己头上戴的帽子颜色，B、C看着别人头上的帽子却都回答不上来。这个时候A却说他知道了 ，她戴的是白色。主持人说对，请问 A是怎么推理的 chatGPT的回答 1 A可以推断出自己戴的是白色帽子，因为如果B或C看到自己和另一个人都戴黑帽子，那么他们就可以推断自己戴白帽子，但是他们都无法回答，说明两者中至少有一个人戴白帽子，那么A就知道自己戴白帽子了。 GPT4的回答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 A 知道有 2 顶黑帽子和 3 顶白帽子。当 B 和 C 的蒙眼布被解开时，A 仍无法看到其他人头上的帽子颜色，但可以听到 B 和 C 的回答。 首先，B 看到了 C 的帽子，有以下两种可能： 1. 如果 C 戴着黑帽子，那么 B 知道还有 1 顶黑帽子和 3 顶白帽子。此时，B 知道自己戴的帽子颜色可能是黑色（剩下的一顶黑帽子）或白色（3 顶白帽子中的一顶）。 2. 如果 C 戴着白帽子，那么 B 知道有 2 顶黑帽子和 2 顶白帽子。此时，B 知道自己戴的帽子颜色可能是黑色（2 顶黑帽子中的一顶）或白色（2 顶白帽子中的一顶）。 由于 B 无法确定自己戴的帽子颜色，接下来轮到 C 推理。此时，C 已知 B 看到了 C 戴的帽子颜色，但无法确定 B 戴的帽子颜色。因此，C 可以推测如下： 1. 如果 B 看到了 C 戴的是黑帽子，那么 C 知道 B 有可能看到剩下的一顶黑帽子和 3 顶白帽子。此时，C 会认为自己戴的帽子颜色可能是黑色或白色。 2. 如果 B 看到了 C 戴的是白帽子，那么 C 知道 B 看到有 2 顶黑帽子和 2 顶白帽子。此时，C 怀疑自己戴的帽子颜色可能是黑色（2 顶黑帽子中的一顶）或白色（2 顶白帽子中的一顶）。 因为 C 也无法确定自己戴的帽子颜色，A 可以从 B 和 C 的回答中得出一些信息。A 可以推理如下： 1. 如果 B 和 C 都看到了对方戴的是黑帽子，那么他们应该能够确定自己戴的是白帽子（因为只有 2 顶黑帽子）。 2. 但实际上，B 和 C 都无法判断自己戴的帽子颜色。这意味着他们看到的是对方戴的白帽子，因为如果他们看到的是黑帽子，他们会知道自己戴的是白帽子。 所以，A 可以推理出自己戴的是白帽子，因为 B 和 C 都无法确定自己戴的帽子颜色。 GPT-4O的回答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 这是一个经典的逻辑推理问题，涉及到三人戴帽子的情境。让我们一步步分析A是如何推理出自己戴的是白帽子。 1. **帽子数量**：有2顶黑帽子和3顶白帽子。 2. **B和C的观察结果**： - B和C都看到了A和对方头上的帽子，但都无法确定自己帽子的颜色。 3. **B的推理**： - 假设如果A和C都戴着黑帽子，那么B就会立刻知道自己戴的是白帽子（因为只剩两顶黑帽子）。 - 但B回答不上来，说明A和C中至少有一人戴的是白帽子。 4. **C的推理**： - C知道B没有得出结论，这表明A和C中至少有一人戴的是白帽子。 - 如果C看到A戴的是黑帽子，那么C应该立刻知道自己戴的是白帽子（因为如果他自己也是黑帽子，B应该能确定自己是白帽子）。 - 但C也回答不上来，这表明A戴的帽子不是黑帽子。 5. **A的推理**： - A知道B和C都回答不上来，说明他们都看不到两个黑帽子。 - 因此，A推断自己戴的帽子不能是黑色，否则B或C至少有一人能确定自己戴的是白帽子。 - 所以A得出结论，自己戴的是白帽子。 综上所述，A通过推理B和C无法得出结论的情况，确定自己戴的帽子只能是白色。 claude的回答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 B和C都回答不上来别人头上戴的是什么颜色帽子,说明他们中间至少有一个人看不见别人头上的帽子。 这里有两种可能的情况: 1) B看不见C头上的帽子,C看不见B头上的帽子。这样A就看得到B和C头上的帽子,知道自己戴的是白色。 2) B或者C完全看不见别人头上的帽子。这时候A通过排除法可以知道自己戴的是白色。 具体来说: 总共5顶帽子,其中2顶是黑色,3顶是白色。 A知道B和C至少有一个人看不见别人头上的帽子。 如果A戴黑色,那么剩下的2顶黑帽和3顶白帽里任何一顶都可能给B或者C戴。 但实际上B和C都回答不上来,所以A不可能戴黑色。 由于只有白色这一个选择,A可以确定自己戴的必须是白色。 所以A能确定自己头上戴的是白色帽子,是通过观察B和C的回答以及推理排除法得出的结论。 claude2的回答 1 2 3 4 5 6 7 8 9 10 11 分析一下: 总共有2顶黑帽子,3顶白帽子。主持人随机在A、B、C头上分别戴上一顶帽子,剩下的两顶藏起来。 然后让B、C看着对方和A的帽子颜色,但B、C都回答不上自己头上戴的是什么颜色。 这就说明,B看到C戴黑帽,C看到B戴白帽。因为如果两个人看到的对方帽子颜色一致,那么自己头上戴的一定是另一种颜色。 既然B看到C戴黑帽,C看到B戴白帽,而A的帽子颜色B和C都看不到。那么A头上一定戴的是白帽,否则的话B和C就都可以推断出自己头上戴的颜色了。 所以A无需看其他人的帽子颜色,就可以肯定自己头上一定是白帽。 claude3-sonnet的回答 1 2 3 4 5 6 7 8 9 10 11 12 13 A能够推理出自己戴的是白帽子,是利用了以下信息: 已知总共有2顶黑帽子和3顶白帽子 B和C看到的情况都无法判断自己戴的是白帽子还是黑帽子 那么,如果A戴的是黑帽子,根据已知条件,剩下的两顶帽子就必须都是白色的。 在这种情况下: 如果B看到C戴白帽子,那B就能推断自己戴的是黑帽子 如果C看到B戴白帽子,那C就能推断自己戴的是黑帽子 然而,B和C都无法判断出自己戴的是什么颜色。这就说明,A戴的不可能是黑帽子。 因此,通过排除法,A可以推断出自己戴的必定是白帽子。这正是A能够给出正确答案的原因。 claude3.5-sonnet的回答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 A的推理过程非常巧妙。让我们一步步分析A是如何得出结论的： 1. 首先，A知道总共有2顶黑帽子和3顶白帽子。 2. A听到B和C都回答不上来，这意味着B和C看到的情况不能让他们确定自己的帽子颜色。 3. 如果A戴的是黑帽子，那么会有以下两种可能： a) B和C都戴白帽子 b) B和C一个戴黑帽子，一个戴白帽子 4. 在这两种情况下： - 如果是情况a，B看到A戴黑帽子，C戴白帽子，B就能确定自己戴白帽子。 - 如果是情况b，C看到A和B都戴黑帽子，就能确定自己戴白帽子。 5. 但是B和C都回答不上来，这说明上述两种情况都不成立。 6. 因此，A可以推断出自己不可能戴黑帽子。 7. 既然A不是戴黑帽子，那么她一定戴的是白帽子。 所以，A通过B和C的回答，以及对总体帽子数量的了解，成功地用排除法推断出自己戴的是白帽子。 这个游戏很好地展示了逻辑推理的力量，以及如何从他人的反应和已知信息中推断出看似不可能知道的事情。 第三题 问题描述 1 2 3 4 国王让三智者站成一个纵队，闭上眼睛，给他们每人戴一顶帽子。 然后睁眼，中间可以看到前面的帽子，最后面的可以看到前两个。 他们都知道共有2顶白帽子和3顶红帽子。国王问这三人：“谁知道自己戴的帽子颜色？” 问了两遍无人回答。第三遍时是否有人能回答？如果有，他是哪一位？戴什么颜色帽？ chatGPT的回答 1 2 3 4 5 6 7 第三遍时，有一个智者能回答。他是最后面的智者，戴的是白色帽子。 这是推理过程： 如果前面两顶帽子都是红色，那么最后面的智者就知道自己戴的帽子颜色是白色，因为只有两顶白帽子。但是，在第一次和第二次问答时，前面两位智者都没有回答，这表明前面两顶帽子至少有一顶是白色。 如果前面两顶帽子中有一顶是白色，那么最后面的智者就不可能知道自己戴的帽子颜色，因为他看到的是前面两顶帽子中的红色帽子。但是，在第三次问答时，最后面的智者回答了，说明前面两顶帽子都是红色的，最后面的智者知道自己戴的是白色帽子。 GPT4的回答 1 2 3 4 5 6 7 8 9 首先，我们来分析一下这个问题。三智者站成一个纵队，我们称他们为A、B和C，其中A站在前面，B站在中间，C站在最后。共有2顶白帽子和3顶红帽子。 1. 当国王第一次询问时，C看到了A和B的帽子。如果C看到了两顶白帽子，那么他就可以确定自己戴的一定是红帽子（因为只有2顶白帽子）。但C没有回答，说明C看到的帽子中至少有一顶红帽子。 2. 当国王第二次询问时，B知道C看到的帽子中至少有一顶红帽子。如果B看到A戴的是白帽子，那么B就可以确定自己戴的是红帽子（因为C没有看到两顶白帽子）。但B也没有回答，说明A戴的帽子也是红帽子。 3. 当国王第三次询问时，A已经了解到C看到的帽子中至少有一顶红帽子，B也看到了红帽子。所以，A可以推断出自己戴的帽子是红帽子（因为C和B都没有回答）。 综上所述，第三遍时A能够回答，他戴的是红帽子。 GPT-4O的回答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 这是一个经典的逻辑推理问题。我们来分析一下这个问题的解答过程。 1. **帽子数量**：共有2顶白帽子和3顶红帽子。 2. **三位智者的排列**： - 最前面的智者（A）看不到任何人的帽子。 - 中间的智者（B）能看到前面一位的帽子。 - 最后面的智者（C）能看到前面两位的帽子。 3. **推理过程**： - **第一次问的时候**： - C看到A和B的帽子，但他没有回答，说明他无法确定自己帽子的颜色。也就是说，C看到的不是两个白帽子，因为如果A和B都戴白帽子，C就会知道自己戴的是红帽子（因为只有2顶白帽子）。 - 因此，A和B中至少有一人戴的是红帽子。 - **第二次问的时候**： - B知道C没有回答，说明B知道C看不到两个白帽子。 - B看到A的帽子，如果A戴的是白帽子，那么B会知道自己的帽子一定是红帽子（因为如果B也戴白帽子，C会看到两个白帽子并能确定自己戴的是红帽子）。 - 但B也没有回答，说明A戴的不是白帽子。因此，B知道A戴的是红帽子。 - **第三次问的时候**： - A知道B没有回答，说明B不能确定自己的帽子颜色。 - A知道B看到的是红帽子（因为如果B看到白帽子，B就会回答了）。 - 因此，A推断自己戴的是红帽子。 综上所述，第三次被问时，前面的智者（A）可以确定自己戴的是红帽子。 claude的回答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 有人可以回答第三遍国王的问题。 最末列的智者可以回答。他戴红帽子。 推理过程: 第一遍国王问问题时,没有人回答。这表明至少有一个智者看不见前面任何智者的帽子。 第二遍问问题时还是没有人回答。这表明有两个情况: 1) 最前列智者看不见中间智者的帽子,中间智者看不见后面两人的帽子。 2) 最前列智者和中间智者同时看不见任何人的帽子。 第三遍问问题时,只有情况2成立,末列智者才能回答。 因为总共5顶帽子,其中2顶白帽3顶红帽。 如果末列智者戴白帽,那么前面2个智者可能戴任何一顶帽子。但实际上前两个智者都回答不上。 所以末列智者必须戴红帽子。只有这一个选择,他才能确定自己的帽子颜色。 所以第三遍,戴红帽子的末列智者可以回答他知道自己戴红帽子。 前两个智者依然回答不上。 claude2的回答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 分析一下: 总共有2顶白帽子,3顶红帽子。三个智者站成一列,中间的可以看到前面的帽子,最后面的可以看到前两个人的帽子。 第一次问时,没有人可以回答,说明三个人看到的情况是: 前面一个人的帽子颜色无法判断自己的帽子颜色 中间的人看到前面戴红帽 最后面的人看到前两个人戴不同色的帽子 第二次问时,也没有人可以回答,说明: 前面的人的帽子仍然无法判断自己的帽子颜色 中间的人知道最后面一个看到前两个戴不同色帽子,但还不清楚自己的帽子颜色 最后面的人还是看到前两个戴不同色帽子 第三次问时,最后面的人可以回答他戴红帽。 因为如果最后面的人戴白帽,中间的人在第二次问时就能知道自己戴红帽了。 所以最后面的人一定戴红帽。 claude3-sonnet的回答 1 2 3 4 5 6 7 8 9 是的,在第三遍时,有人能够回答自己戴的帽子颜色。具体情况如下: 假设第一个人(最前面的人)看到前面没有人,而后面的两个人都戴红帽子。此时他可以推断出自己戴的是白帽子。 假设第二个人(中间的人)看到前面那个人戴白帽子,后面那个人戴红帽子。由于已知总共有2顶白帽子和3顶红帽子,所以他仍然无法确定自己戴的是白帽子还是红帽子。 假设第三个人(最后面的人)看到前面两个人都戴红帽子。这种情况下,只有当他自己戴白帽子时,才符合已知条件(2顶白帽子和3顶红帽子)。因此,他能够确定自己戴的是白帽子。 所以,在第三遍时,最后一个人能够回答自己戴的是白帽子。 claude3.5-sonnet的回答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 让我们一步步分析这个问题： 1. 首先，我们知道有2顶白帽子和3顶红帽子。 2. 最后面的人可以看到前两个人的帽子颜色，中间的人可以看到前面人的帽子颜色，而最前面的人什么都看不到。 3. 国王问了两遍，没有人回答。这意味着： - 最后面的人看到的不是两顶白帽子（否则他会立即知道自己戴红帽子） - 最后面的人也没有看到两顶红帽子（否则中间的人会在第二次提问时知道自己戴白帽子） 4. 因此，最后面的人看到的一定是一红一白。 5. 到第三次提问时，最前面的人可以推理： - 如果我戴白帽子，那么中间的人会看到一白一红，他会在第二次提问时知道自己戴红帽子。 - 但中间的人没有回答，所以我不可能戴白帽子。 - 因此，我一定戴的是红帽子。 所以，在第三次提问时，最前面的人能够回答，他戴的是红帽子。 总结： - 有人能回答：是的 - 回答的是哪一位：最前面的人 - 戴什么颜色的帽子：红帽子 这个问题展示了如何通过逻辑推理和观察他人的反应来得出结论，即使自己无法直接看到自己的情况。它强调了信息的累积效应和推理的重要性。 grok3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 国王让三智者站成一个纵队，闭上眼睛，给他们每人戴一顶帽子。 然后睁眼，中间可以看到前面的帽子，最后面的可以看到前两个。 他们都知道共有2顶白帽子和3顶红帽子。国王问这三人：“谁知道自己戴的帽子颜色？” 问了两遍无人回答。第三遍时是否有人能回答？如果有，他是哪一位？戴什么颜色帽？ 分析过程 背景 三个智者排成一列：A（最前面）、B（中间）、C（最后面）。 他们闭眼时每人被戴上一顶帽子，帽子颜色为红色（R）或白色（W）。 帽子分配：共有3顶红帽子和2顶白帽子。 睁眼后，B可以看到A的帽子，C可以看到A和B的帽子，A看不到任何帽子。 国王问三遍：“谁知道自己戴的帽子颜色？” 前两遍无人回答，第三遍时有人回答。 目标 确定第三遍时是否有人能回答，以及回答者是谁和他的帽子颜色。 解答 初始情况： 可能的帽子分配受限于2顶白帽子和3顶红帽子。 由于有3个人，帽子分配可能是： 2红1白（可能有多种组合）。 3红0白（但只有2顶白帽子，不可能3人都戴红帽子）。 智者视角： C（最后面）：可以看到A和B的帽子。 B（中间）：可以看到A的帽子。 A（最前面）：看不到任何帽子。 第一遍问答： 国王第一次问：“谁知道自己的帽子颜色？” 无人回答，说明没有人能立即确定自己的帽子颜色。 推断： 如果C看到A和B都是白帽子（WW），则C知道自己是红帽子（因为只有2顶白帽子），但C没有回答，说明A和B不是都戴白帽子。 因此，A和B的帽子不是WW，可能是WR、RW、RR。 第二遍问答： 国王第二次问，仍然无人回答。 推断： 考虑B的视角：B可以看到A的帽子。 如果A戴的是白帽子（W），则B知道C看到的不是WW（因为第一遍C没回答），所以B可以推断： 如果A是W，C看到的是W和B的帽子，如果B是W，则C会回答自己是R，但C没回答，说明B不是W，即B是R。 但B没有回答，说明A不是W，即A是R。 因此，A是R。 第三遍问答： 国王第三次问，此时有人能回答。 推断： 从第二遍推断中，B已经知道A是R。 现在，B知道A是R，自己是R（从第二遍推断），但B仍然无法确定自己的帽子颜色，因为C没有回答。 考虑C的视角：C可以看到A和B的帽子。 由于A是R，B是R（假设），C看到RR。 如果C看到RR，自己可能是R或W。 如果C是W，则帽子分配是RRW（2红1白），但C无法确定。 如果C是R，则帽子分配是RRR（3红），但只有2顶白帽子，帽子总数是5顶，而戴3顶红帽子后还有2顶红帽子和2顶白帽子，逻辑上不影响。 但C在第一遍和第二遍都没有回答，说明C无法确定自己的帽子颜色。 现在，第三遍时，C可以利用B和A的沉默来推断。 具体地，C知道A是R，B是R（从B的沉默推断），且C自己可能是R或W。 如果C是W，则帽子分配是RRW，B看到A是R，自己是R（因为如果B是W，则C看到RW，会在第一遍回答自己是R，但C没回答），但B在第二遍没有回答，说明B无法确定自己的帽子颜色。 然而，如果C是W，则B看到A是R，自己是R（因为如果B是W，C会看到RW，在第一遍回答自己是R，但C没回答，说明B不是W，即B是R），但B在第二遍没有回答，可能是因为B无法确定自己的颜色。 实际上，B在看到A是R后，如果B是W，C看到RW，会在第一遍回答自己是R，但C没回答，说明B不是W，即B是R。 因此，B知道自己是R。 但B在第二遍没有回答，可能是因为B无法确定自己的颜色，但实际上B可以确定自己是R（因为如果B是W，C会回答），矛盾。 因此，C可以推断：如果C是W，则B会知道自己是R，并在第二遍回答，但B没回答，说明C不是W，即C是R。 最终答案： 第三遍时，C可以回答：“我知道自己的帽子颜色，是红色。” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 ### 问题解答 国王让三个智者站成一个纵队，分别称为 A（最前面）、B（中间）、C（最后面）。他们闭上眼睛时被戴上帽子，睁开眼睛后，B 可以看到 A 的帽子，C 可以看到 A 和 B 的帽子，而 A 看不到任何帽子。已知共有 2 顶白帽子（W）和 3 顶红帽子（R），每人戴一顶帽子。国王连续三次询问：“谁知道自己戴的帽子颜色？” 前两遍无人回答，第三遍时有人回答。以下分析将确定第三遍时是否有人能回答，如果有，是谁，以及他戴什么颜色的帽子。 --- #### 初始条件与假设 - **位置与视角**： - A 在最前面，看不到任何帽子。 - B 在中间，可以看到 A 的帽子。 - C 在最后面，可以看到 A 和 B 的帽子。 - **帽子分配**： - 总共有 5 顶帽子：2 白（W）、3 红（R）。 - 3 个智者每人戴一顶，可能的颜色组合受限于帽子总数。 - **智者的逻辑能力**： - 他们都知道帽子总数（2W, 3R），并且能听到国王的每次提问及是否有人回答。 - 前两遍无人回答，这一事实成为推理的关键信息。 - **目标**： - 确定第三遍时谁能回答，以及他的帽子颜色。 --- #### 逐步推理 ##### 第一遍问答：无人回答 国王第一次询问时，无人回答，说明没有人能立即确定自己的帽子颜色。 - **C 的视角**：C 可以看到 A 和 B 的帽子。 - 如果 A 和 B 都戴白帽子（即 A=W, B=W），则 C 知道自己是红帽子（R），因为总共只有 2 顶白帽子，A 和 B 已经用完白帽子，C 不可能再是 W。 - 但 C 没有回答，说明 A 和 B **不可能都是白帽子**。 - 因此，A 和 B 的组合不是 WW，可能的组合是： - WR（A=W, B=R） - RW（A=R, B=W） - RR（A=R, B=R） ##### 第二遍问答：无人回答 国王第二次询问时，仍然无人回答，说明在第一遍无人回答的基础上，智者们仍无法确定自己的帽子颜色。 - **B 的视角**：B 可以看到 A 的帽子。 - **假设 A 是 W**： - B 知道 C 在第一遍没回答，因此 C 没看到 WW。 - 如果 B 也是 W，则 C 会看到 WW（A=W, B=W），并在第一遍回答自己是 R。但 C 没回答，说明 B 不是 W。 - 所以，如果 A 是 W，则 B 可以推断自己是 R。 - 但 B 在第二遍没有回答，说明 B 无法确定自己的颜色，因此 A **不可能是 W**。 - **结论**：A 必须是 R。 - 现在，所有智者都可以从 B 的沉默中推断出 A 是 R，因为如果 A 是 W，B 会在第二遍回答，而 B 没回答。 ##### 第三遍问答：有人回答 国王第三次询问时，有人能回答。此时，A 已确定是 R，帽子分配简化为： - A = R - B 可以是 R 或 W - C 可以是 R 或 W - 可能的组合： 1. RRW（A=R, B=R, C=W） 2. RRR（A=R, B=R, C=R） 3. RRW（A=R, B=W, C=R）（需排除，见下文） - **C 的视角**：C 看到 A 和 B 的帽子，且知道 A=R。 - **假设 B=W**（C 看到 RW）： - C 可能是 R 或 W。 - 如果 C 是 W，则分配是 RWW（A=R, B=W, C=W），但 C 在第一遍无法确定（因为 RW 下 C 可以是 R 或 W）。 - 如果 C 是 R，则分配是 RWR（A=R, B=W, C=R）。 - 第一遍 C 看到 RW，无法确定自己是 R 或 W，没回答。 - 第二遍，B 看到 A=R，如果 B=W，B 无法从 C 的沉默中确定自己是 R 或 W（因为 C 看到 RW，可能因 C=W 而没回答），所以 B 没回答。 - 但如果 B=W，C 看到 RW，且 C 在前两遍没回答，B 可以推断：如果 B=W，C 会在第一遍回答（逻辑上 C 若看到 RW 且自己是 W 会不确定，但这里需进一步分析）。 - **假设 B=R**（C 看到 RR）： - C 可能是 R 或 W。 - 如果 C 是 W，则分配是 RRW。 - 如果 C 是 R，则分配是 RRR。 - C 需要利用前两遍的沉默来推断。 - **关键推理**： - 如果 B=W，C 看到 RW： - C 在第一遍没回答，因为 RW 下 C 可能是 R 或 W。 - 但如果 C=W（RWW），B 看到 A=R，第二遍时 B 会推断：如果 B=W，C 看到 RW，会在第一遍回答自己是 R（但这不成立，C 看到 RW 无法确定），因此 B 可以确定自己是 R。 - 但 B 在第二遍没回答，说明 B 不是 W，即 B 是 R。 - 现在，C 知道 A=R, B=R（从 B 的沉默推断），C 看到 RR。 - C 可能是 R 或 W。 - 如果 C=W（RRW），B 看到 A=R，自己是 R，会在第二遍回答自己是 R（因为如果 B=W，C 会在第一遍回答，但 C 没回答，B 确定自己是 R）。 - 但 B 没回答，说明 C 不是 W，即 C 必须是 R。 - **结论**： - C 在第三遍可以推断：如果我是 W，则 B 会在第二遍回答，但 B 没回答，说明我不是 W，我是 R。 - 帽子分配是 RRR（A=R, B=R, C=R）。 --- #### 最终答案 第三遍时，有人能回答。他是 **C**（最后面的智者），他知道自己戴的帽子颜色是 **红色**。 - **回答者**：C - **帽子颜色**：红色 deepseek-R1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 已深度思考（用时474秒） 嗯，这个问题看起来有点挑战性，不过让我慢慢来想。首先，题目是说有三个智者排成一列纵队，也就是一个接一个地站着，后面的人能看到前面所有人的帽子。国王给他们每人戴了一顶帽子，总共有2顶白帽子和3顶红帽子。然后国王问他们是否知道自己戴的帽子颜色，问了两次都没人回答，第三次的时候是否有人能确定自己的帽子颜色，如果有的话，是哪一位，戴什么颜色？ 首先，我需要明确每个人的位置和他们能看到的情况。假设这三个人是A、B、C，其中A站在最前面，B在中间，C在最后面。也就是说，C可以看到A和B的帽子，B可以看到A的帽子，而A看不到任何人的帽子，因为他是最前面的。不过题目里说中间的人可以看到前面的，也就是B可以看到A，而最后面的C可以看到前两个，也就是A和B。所以这个排列应该是A在最前面，B中间，C最后面，对吗？ 然后，总共有5顶帽子，其中2白3红，但只用了3顶给这三个人，所以剩下的两顶帽子没有被使用。也就是说，剩下的两顶帽子可能是两白，或者一白一红，或者两红？不过原题可能只是说总共有2白3红，所以这三个人戴的是其中的三顶，所以剩下的两顶是剩下的颜色组合。不过可能不需要考虑剩下的，只需要知道总共有2白3红，而三个人戴的是其中的三顶，所以可能的组合需要符合总数。 接下来，国王问了三遍，前两次都没人回答，第三次的时候是否有人能确定。那么需要分析每个人的推理过程。 首先，假设自己是C，站在最后面，可以看到A和B的帽子颜色。如果A和B都是白帽子，那么因为总共有2顶白帽子，所以C可以确定自己一定是红帽子，因为剩下的白帽子已经被A和B用完了。这种情况下，C会在第一次被问的时候就能回答，因为他看到前面两个人都是白帽子，所以自己必然是红帽子。但题目中说前两次都没人回答，所以这种情况不存在，即A和B不可能都是白帽子。因此，A和B中至少有一个是红帽子。 接下来，如果C看到A是白，B是红，或者A是红，B是白，或者A和B都是红。这时候C可能无法立即确定自己的颜色，因为剩下的白帽子可能还有一顶或者零顶。例如，如果C看到A是白，B是红，那么已经用了一顶白帽子，还剩一顶白帽子，可能在自己头上，或者剩下的两顶未被使用的帽子中。但因为总共有两顶白帽子，所以如果A是白，B是红，那么剩下的白帽子可能被C戴或者未被使用。这时候C可能无法确定自己的颜色，因此第一次问的时候不会回答。 同样，如果C看到A和B都是红帽子，那么已经用了两顶红帽子，剩下的红帽子还有1顶，白帽子还有2顶。这时候C的帽子可能是白或红。如果C是白，那么剩下的帽子是1红和1白；如果C是红，剩下的帽子是2白。但C无法确定自己的颜色，所以第一次也不会回答。 所以，第一次问的时候，C可能只有在看到A和B都是白的情况下才会回答，但这种情况被排除了，所以第一次没人回答。 接下来，B的位置在中间，可以看到A的帽子颜色。假设B看到A是白帽子，那么B会想：如果A是白，那么剩下的白帽子还有1顶。如果B自己戴的是白帽子，那么C在第一次就会被问到，因为C会看到两个白帽子，从而知道自己戴红帽子。但因为第一次C没回答，所以B可以推断自己不是白帽子，否则C会回答。因此，如果B看到A是白帽子，那么B可以推断自己戴的是红帽子，因为如果自己戴的是白，那么C会在第一次回答。所以在这种情况下，B会在第二次被问时回答自己戴红帽子。但题目中说第二次也没人回答，所以这说明B并没有看到A戴白帽子，也就是说A戴的是红帽子。 因此，当第二次没人回答时，B可以推断出自己看到的A是红帽子，因为如果A是白帽子的话，B会在第二次回答。所以现在，A戴的是红帽子，B看到A是红，所以B知道自己和C的帽子颜色可能有多种情况，但需要进一步分析。 现在，第三次被问的时候，C已经知道A是红帽子（因为如果A是白的话，B会在第二次回答），所以C现在知道A是红，B可能戴红或白。但C在第二次也没回答，说明C在第一次和第二次都无法确定自己的颜色。这时候，C可能需要重新考虑。 或者，可能是在第三次的时候，C通过前两次的沉默，推断出自己的帽子颜色。例如，假设A是红，B也是红，那么C看到两个红帽子，剩下的帽子中有两顶白和两顶红中的三顶已经被用了三顶，所以剩下的两顶是两白？不，总共有2白3红，所以如果A和B都是红，那么已经用了两顶红，剩下的红帽子还有1顶，白帽子还有2顶。所以C的帽子可能是红或白。这时候C可能无法确定，但如果B看到A是红，而自己戴的是白，那么C在第一次看到A红，B白，那么剩下的白帽子还有1顶，C可能戴白或红。但这时候如果B戴白，那么C会考虑：如果自己戴的是白，那么总共有两白，即A红，B白，C白，但总共有两白，所以这是可能的。但剩下的帽子中已经没有白帽子了，所以如果C戴白，那么总共有两顶白帽子，符合条件。但C无法确定自己是否戴白，因为如果自己戴红，剩下的白帽子还有一顶未被使用。所以这时候C可能还是无法确定。 不过，根据之前的推理，当A是红，B在第二次也没回答，说明B看到A是红，所以B自己无法确定自己的颜色，因为如果B戴的是白，那么C会看到A红，B白，这时候C会考虑自己是否戴白。如果C看到A红，B白，那么剩下的白帽子还有1顶，所以C可能戴白或红。如果C戴白，那么总共有两白，符合条件；如果戴红，剩下的白帽子还有一顶。因此，C在这种情况下也无法确定，所以第一次和第二次都没回答。这时候，B在第二次时，如果看到A是红，而自己戴的是白，那么C在第一次可能无法回答，但B自己也无法确定，所以第二次也没回答。这时候，当第三次被问时，C可能意识到，如果自己戴的是红，那么剩下的白帽子还有两顶，但已经被用了零顶，所以A红，B红，C红，这样总共有三红，符合条件，但剩下的两顶白帽子未被使用。或者，如果C戴的是白，那么总共有两白（B如果是红，那么A红，B红，C白，这样两白中的一顶在C，另一顶未被使用，但总共有两白，所以可能）。不过这可能比较复杂。 或者，另一种思路：当A是红，B是红，那么C看到两红，剩下的红帽子还有1顶，白帽子还有2顶。因此，C的帽子可能是红或白。如果C是红，那么总共有三红，两白中的两顶未被使用；如果C是白，那么总共有两白（C和另一顶未被使用），但这里可能有问题，因为总共有两顶白帽子，所以如果C戴白，那么另一顶未被使用的白帽子就只能是1顶，但题目中说总共有两顶白帽子，所以如果C戴白，那么剩下的白帽子只有一顶未被使用，而已经用了C的白帽子，所以总共有两顶。这时候，C可能无法确定自己是否戴白，因为如果自己戴白，那么剩下的白帽子还有一顶未被使用，但可能被其他人使用，但这里只有三个人，所以C戴白的话，剩下的白帽子是1顶，而如果C戴红，剩下的白帽子是两顶。这时候，C可能无法确定，所以第三次仍然无法回答？ 但题目中说第三次有人能回答，所以可能我的推理哪里错了。 或者，可能当A是红，B是红，C在这种情况下，如果前两次都没回答，那么C可以推断自己戴的是红，因为如果自己戴的是白，那么B在第二次的时候应该能推断出自己的颜色。让我再仔细想想。 假设A是红，B是红，C戴的是白。这时候，B看到A是红，如果B自己戴的是白，那么剩下的白帽子还有1顶，C戴的是白的话，总共有两顶白帽子，但此时C看到A红，B白，那么C会知道如果自己戴的是白，那么总共有两顶，所以C应该能在第一次回答，对吗？因为如果C看到A红，B白，那么剩下的白帽子还有1顶，所以如果C自己戴的是白，那么总共有两顶，符合条件，但C无法确定自己是否戴白，因为剩下的白帽子还有一顶未被使用，所以可能自己戴红，而剩下的白帽子未被使用。所以这时候C可能还是无法确定，所以第一次不会回答。 然后，B看到A是红，如果B自己戴的是白，那么C看到A红，B白，这时候C在第一次无法确定，所以第一次没回答。然后B在第二次的时候会想：如果自己戴的是白，而C在第一次没回答，那么可能C戴的是红，但B自己戴的是白，这时候总共有两顶白帽子（B和未被使用的一顶），或者C戴的是白，那么总共有两顶白帽子（B和C），但这时候如果B戴的是白，而C在第一次没回答，那么B可能无法确定，所以B在第二次也无法回答。因此，当A是红，B是红，C是白的情况下，第三次可能C会意识到自己戴的是白？ 或者，另一种情况：当A是红，B是红，C是红，这时候总共有三红，两白未被使用，符合条件。这时候，C看到两红，所以自己可能是红或白。如果C是红，那么没问题；如果C是白，那么总共有两白，但此时C戴白，剩下的白帽子还有一顶未被使用，所以也符合条件。因此，C无法确定。 但是题目中说第三次有人能回答，所以可能正确的答案是最后面的C在第三次回答，戴的是红帽子？或者中间的B？ 或者，可能当A是红，B是红，C是红，这时候第三次的时候，C会意识到，如果自己戴的是白，那么B在第二次的时候应该能推断出自己的颜色。因为如果C戴的是白，那么B看到A是红，而自己戴的是红，那么剩下的白帽子还有两顶，但已经被用了C的白帽子，所以B可能无法确定。或者这可能并不成立。 或许需要更系统地列出所有可能的组合，然后排除不可能的情况。 总共有2白3红，三个人戴三顶，所以可能的组合有： A白，B白，C红（剩下0白，3红中的两顶未被使用） A白，B红，C白（剩下0白，3红中的两顶未被使用） A白，B红，C红（剩下1白，3红中的两顶未被使用） A红，B白，C白（剩下0白，3红中的两顶未被使用） A红，B白，C红（剩下1白，3红中的两顶未被使用） A红，B红，C白（剩下1白，3红中的两顶未被使用） A红，B红，C红（剩下2白，3红中的两顶未被使用） 现在，根据前两次无人回答的情况，排除掉那些会导致有人能立即回答的情况。 首先，排除所有C能看到两个白的情况，即情况1和情况4，因为如果C看到A和B都是白，那么C会知道自己戴红，所以第一次就会回答。因此，情况1和4被排除。 剩下的情况是2、3、5、6、7。 接下来，考虑在剩下的情况下，B是否能推断出自己的颜色。例如，在情况2中，A白，B红，C白。此时B看到A是白，如果B自己戴的是白，那么C会看到两个白，从而在第一次回答。但B戴的是红，所以C看到A白，B红，无法确定自己是否是白或红，因此第一次没回答。这时候，B在第二次会想：如果自己戴的是白，那么C应该在第一次回答，但C没回答，所以B知道自己戴的是红，因此会在第二次回答。但情况2中B戴的是红，所以如果B在第二次回答，说明情况2已经被排除，因为题目中第二次也没人回答，所以情况2也被排除。 同样地，情况5：A红，B白，C红。此时B看到A红，如果B自己戴的是白，那么C看到A红，B白，C可能戴红或白。如果C戴的是白，那么总共有两白，符合条件，但C无法确定，所以第一次没回答。然后B在第二次会想：如果自己戴的是白，而C没回答，说明C戴的是红，所以B可以确定自己戴的是白，但题目中第二次没人回答，所以情况5也被排除，因为如果B戴的是白，他会在第二次回答，所以情况5被排除。 接下来，情况3：A白，B红，C红。此时B看到A白，如果B自己戴的是白，那么C会看到两个白，从而在第一次回答。但B戴的是红，所以C看到A白，B红，无法确定自己是否是红或白。此时，B在第二次会想：如果自己戴的是白，C应该在第一次回答，但C没回答，所以B知道自己戴的是红，因此会在第二次回答。但题目中第二次没人回答，所以情况3也被排除。 剩下的情况是6和7：情况6是A红，B红，C白；情况7是A红，B红，C红。 现在，在情况6中，C看到A红，B红，所以自己可能是白或红。如果C戴的是白，那么总共有两白（C和未被使用的一顶），但此时剩下的白帽子还有一顶未被使用，所以符合条件。如果C戴的是红，那么剩下的白帽子还有两顶未被使用，也符合条件。因此，C无法确定自己的颜色，所以第一次和第二次都没回答。 在情况7中，C戴的是红，所以总共有三红，剩下的两白未被使用，符合条件。此时，C看到A红，B红，自己可能是红或白，同样无法确定。 现在，第三次被问时，是否有人能确定？ 考虑情况6：C戴的是白。此时，B看到A红，如果B自己戴的是白，那么C会在第一次回答，但C没回答，所以B知道自己戴的是红。但情况6中B戴的是红，所以B在第二次也无法确定，因为如果B戴的是红，C可能戴白或红，所以B无法确定，因此第二次也没回答。此时，第三次时，C可能通过前两次的沉默推断出自己戴的是白？ 或者，可能需要更深入的推理。 在情况6中，C戴的是白，所以剩下的帽子是1白和2红中的未被使用的两顶，但总共有2白3红，所以已经用了A红，B红，C白，剩下的帽子是1白和1红未被使用。这时候，C可能意识到，如果自己戴的是红，那么剩下的白帽子还有两顶，而B看到A红，如果B戴的是白，那么C应该会在第一次回答，但C没回答，所以B应该知道自己戴的是红，但B在第二次也没回答，所以可能C戴的是白？ 或者，另一种思路：当第三次被问时，C知道A是红（因为如果A是白，B会在第二次回答），所以A是红。然后C看到B是红，所以剩下的帽子中有两顶白和两顶红中的未被使用的两顶。如果C自己戴的是白，那么剩下的白帽子还有一顶；如果C戴的是红，剩下的白帽子还有两顶。但C可能无法确定，除非有其他线索。 但或许在第三次时，C可以推断：如果自己戴的是红，那么剩下的白帽子还有两顶，而B看到A红，如果B戴的是白，那么C在第一次应该看到A红，B白，这时候C会考虑自己是否戴白，但可能无法确定，所以第一次没回答。然后B在第二次会想，如果自己戴的是白，而C没回答，说明C戴的是红，所以B可以确定自己戴的是白，但B在第二次也没回答，所以B戴的是红。因此，C现在知道B戴的是红，所以自己戴的是白？ 这可能比较复杂，但或许正确的答案是C在第三次回答自己戴的是红，或者白？ 或者，可能正确答案是C戴的是红，因为在情况7中，如果C戴的是红，那么剩下的白帽子还有两顶，而如果C戴的是白，剩下的白帽子还有一顶。但经过前两次的沉默，C可能推断出自己戴的是红？ 或者，可能正确答案是中间的B在第三次回答，戴的是红？ 或者，可能没有人能回答，但题目说第三遍时是否有人能回答，所以应该有人能回答。 现在，我需要重新整理一下： 当A是红，B是红，C可能是红或白（情况6和7）。此时，C在第三次时，可能通过前两次的沉默推断出自己的颜色。 假设C戴的是白（情况6），那么B看到A红，如果B戴的是红，那么C在第一次和第二次都没回答，这时候B可能无法确定，但C在第三次时会想：如果自己戴的是白，那么B在第二次应该已经推断出自己戴的是红，因为如果B戴的是白，那么C会在第一次回答，但C没回答，所以B应该知道自己戴的是红，但B在第二次也没回答，说明B也戴的是红，所以C戴的是白？ 或者，可能更简单的情况是，当A是红，B是红，C戴的是红，这时候剩下的两顶是两白，而如果C戴的是红，那么B在第二次时无法确定，因为B看到A红，自己戴红，C可能戴红或白，所以无法确定。而C在第三次时，可能意识到，如果自己戴的是白，那么B在第二次时应该已经推断出自己戴的是红，但B没回答，所以自己必须戴红？ 这似乎有些牵强，但可能正确的推理是：在第三次时，C知道A是红（因为如果A是白，B会在第二次回答），然后C看到B是红，所以剩下的白帽子还有两顶，而红帽子还有一顶未被使用。如果C戴的是白，那么剩下的白帽子还有一顶，而如果C戴的是红，剩下的白帽子还有两顶。但C无法直接确定，不过通过前两次的沉默，C可以推断出自己必须戴红，因为如果自己戴的是白，那么B在第二次时应该能推断出自己戴的是红，因为B看到A红，如果B自己戴的是白，那么C会在第一次回答，但C没回答，所以B应该知道自己戴的是红，但B在第二次也没回答，说明B戴的是红，所以C必须戴红。 不过这个推理可能有问题，因为如果C戴的是白，那么B看到A红，自己戴红，C戴白，这时候B在第二次时无法确定自己的颜色，因为如果B戴的是白，C应该会在第一次回答，但C没回答，所以B知道自己戴的是红，所以B应该在第二次回答，但题目中B在第二次也没回答，所以这说明C戴的是红，因此B戴的是红，所以C戴的是红。 因此，正确的答案应该是C在第三次回答，戴的是红帽子。 国王让三位智者A（最前）、B（中间）、C（最后）站成纵队，并给他们戴了帽子。已知共有2顶白帽和3顶红帽。通过逻辑推理： 1. **第一次提问**：若C看到A和B均为白帽，则C会立刻知道自己戴红帽（因白帽仅2顶）。但无人回答，说明A和B中至少有一顶红帽。 2. **第二次提问**：若B看到A戴白帽，B会推断自己戴红帽（否则C会在第一次回答）。但无人回答，说明A戴红帽。 3. **第三次提问**：此时C已知A戴红帽，且B在第二次未回答（说明B也戴红帽）。C看到A和B均为红帽，结合总共有3顶红帽，C可推断自己必戴红帽（若C戴白，则剩余红帽仅1顶，但B看到A红且自己红时，应能推断C戴红，但B未回答，矛盾）。 **结论**：第三遍时，最后面的C能确定自己戴的是红帽子。 **答案**：第三遍时，最后一位智者C知道自己戴的是红帽子。 qwq:32b 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 嗯，这个问题看起来有点挑战性，不过让我慢慢来想一想。首先题目是说国王让三个人站成一列纵队，也就是排成一行，中间的人能 看到前面那个人的帽子颜色，而最后面的人可以看到前两个人的帽子颜色。他们戴的是2顶白帽子和3顶红帽子，总共有5顶帽子？不 过这里可能有点疑问，因为题目里说“共有2顶白帽和3顶红帽”，所以总共是5顶帽子，但只有三个人戴，也就是其中两顶被用掉了 ，剩下的两顶没戴对吧？ 不过不管怎样，关键是他们知道自己有这五顶帽子中的三个。然后国王问了三次谁知道自己戴的帽子颜色，前两次没人回答，第三次 的时候有没有人能确定自己的颜色呢？需要找出是谁以及他戴的颜色。 首先我应该先理清楚每个人的位置和他们的视野范围： - 第一个人（最前面）：看不到任何人，只能看到自己头上的帽子。 - 第二个人（中间位置）：可以看到第一个人的帽子颜色。 - 第三个人（最后面）：可以看到前两个人的帽子颜色。 他们都知道总共有2白3红的帽子被分发给这三个人，剩下的两顶没用到。不过可能题目中的意思是总共有2白和3红，所以三顶戴在三 人头上，剩下的两顶不管了？ 现在问题是当国王问三次时，第三次有没有人能回答？如果有的话是谁。 首先，我需要考虑每次提问的时候，每个人会如何思考，并且根据前两次的沉默来推断信息。因为每次他们被问到的时候都会观察前 面的人的情况，并基于他们的反应（比如是否有人立刻知道自己的帽子颜色）来进行逻辑推理。 让我们一步步分析： 第一次国王问：“谁知道自己戴的帽子颜色？” 没人回答。 第二次再问，还是没人回答。 第三次又问时，有没有人能确定？ 首先，我需要考虑每个人的视角和可能的情况，并排除那些已经被前两次的回答所否定的可能性。 首先，我们需要列出所有可能的三人帽子组合。因为总共有2白3红，所以三个人戴的是其中三个，剩下的两顶不管颜色如何不影响问 题，但必须满足总数是2白和3红，即三人中的帽子颜色只能有0、1或2个白色帽子，其余都是红色。 不过具体来说，可能的组合： 假设三人的帽子颜色为W（白）和R（红），总共有两种颜色。因为总共有两顶白帽，所以三人中戴白帽的数量可以是0、1、2，但必 须不超过2。而红帽则是3顶中的三个，即剩下的红帽数量可能为0到3减去已用的红帽子数。 不过具体来说，所有可能的组合： 三人中戴白色帽子的数量只能是0、1或2，因为总共有两顶白帽可用。因此可能的组合有： - 0个W：三人都戴R 但这样的话，总共有三个红帽被使用，剩下的红帽还有0，而白帽未用。不过题目说共有两顶白帽和三顶红帽，所以如果三人都是红 色的话，那么确实用了三个红帽，剩下的是0红和2白。 - 1个W：其中一人戴W，另外两人戴R 可能的组合有三种情况： W R R （第一人W） R W R（第二人W） R R W（第三人W） 但需要考虑排列的不同位置的情况。 - 2个W：两顶白色帽子被分配给三人中的两个，剩下的一个戴红帽。共有C(3,2)=3种情况： W W R W R W R W W 所以总共有1（0白）+3（1白）+3（2白）=7种可能的组合？ 不过需要确认是否这些都符合条件：总共有两顶白和三红，因此当三人戴的是例如两个白的话，则剩下的红帽是3-1=2？或者说总数 的限制不影响具体分配，因为题目中只是说他们知道有总共两顶白和三顶红，但实际被使用的可能只有其中三个帽子，所以只要总共 有两个白和三个红即可。因此这些组合都是可能的。 现在问题是，当国王第一次问的时候，如果有人能立刻确定自己的颜色，那么那个人会回答。否则继续下去。 首先考虑每个人在第一次提问时的情况： 对于第一个人（最前面的人），他看不到任何人，只能看到自己看不见别人，所以他的信息只有总共有2白3红的帽子被分发给三个人 ，并且他自己戴的是其中一顶。因此，如果他能确定自己的颜色的话，必须是某种特定情况。 假设第一人戴的是白色帽子： 那么剩下的两人必须从1个白和3红中选择两顶，因为总共只有两个白，所以如果第一个人戴了W，则剩下两个人只能有一个W或者0 W。 但此时，第二个人和第三个人的情况如何？ 不过对于第一个来说，他无法知道其他人的颜色，因此即使自己是白色或红色，可能都无法确定自己的颜色，除非某种情况排除。例 如： 假设第一人看到自己如果是白色的话，那么剩下的两个帽子中只有1个白帽，而总共有3红。但其他人是否能推断出什么？ 不过由于第一个人看不到别人，所以他的信息不足以立即确定自己的颜色，因此在第一次提问时他无法回答。 同样的，第二个人（中间）能看到第一人的帽子颜色： 如果第二人看到第一个戴的是白色，则他自己可能的情况是：剩下的一个白和三个红中的某个。此时，假设自己戴的是白色的，那么 第三个必须戴红色；或者自己戴红色，那么第三个可以戴白或红？ 但需要具体分析。 而第三人（最后面）可以看到前两人的帽子颜色： 如果第三个人看到前面两人都是白色，则那可能吗？因为总共有只有两个白帽，所以这种情况是有可能的，即第一和第二人都戴了 W，那么剩下的自己只能是R。此时第三人可能会立即知道自己的颜色？ 比如，假设第三位看到两个人都是白色的，那么他知道他必须戴红帽子，因为总共有两顶白帽已经被用完了，因此他的帽子一定是红 色。 但是这种情况是否会发生呢？ 现在我们需要考虑各个情况： 首先，在第一次提问时，如果存在某个情况下某人能立即知道自己的颜色，则那个人会回答。否则继续。 例如，假设第三位看到前两人都是白色（即W W），那么他知道自己必须戴红帽，因为总共有两顶白帽已经用完了。此时他会立刻举 手说红色？ 如果是这样的话，在这种情况下，第三次提问的时候可能不会出现这样的情况，但需要看具体情况。 现在我们需要考虑所有可能的组合，并分析在第一次、第二次和第三次时谁会回答。 首先列举所有7种可能的情况： 1. 0个白：R R R 2. 1W： a) W R R b) R W R c) R R W 3. 2W: a) W W R b) W R W c) R W W 现在逐一分析每个情况下，当国王第一次提问时： 情况1：R R R 此时第三个人看到前面两人都戴红帽。他自己的帽子可能是红或白？ 但总共有2W和3R被分发到三人头上，所以如果前两人都是红，则剩下的第三个可能的帽子必须是红（因为总共有三顶红可用），或者 白？等一下： 总共有三个红帽，所以如果是前三顶中的两个红，那么第三个人戴的是第三个红，因此他的颜色必然是红色。但此时他自己是否能确 定？ 第三人看到前两人都是R，那么剩下的帽子中还有1个红和2个白吗？不，因为总数是两W和三R被分发到三人头上： 总共有三个帽子，所以如果前两个戴的是RR，则第三个必须从剩下的一个红（因为已经有3红中的两个用了）或者是否？ 等一下可能我的思路有问题： 总共有五个帽子：2W和3R。但只给三个人戴，因此实际被使用的有三个帽子，其中可以是0、1、或2个白帽。 在情况1中，三人都是红色（即用掉了三个红），所以剩下的两顶没用的是两顶白帽。但这不影响他们的情况。 对于第三人来说，在情况1的R R R： 他看到前两人都是红，那么自己戴的颜色可能是红或者白？ 但根据总数： 总共有三顶红被使用了，而总共只有3红，因此第三个必须是红色，因为如果第三人的帽子不是红的话，那么剩下的红帽数量不足。 例如： 假设第三人戴的是白色，那么三人中的颜色就是R R W，这样用了1个W和两个R，那么总数的白帽用了一个，剩下还有一个，而红帽用 了2，剩下3-2=1红。 但这种情况是否可能？ 不，在情况1中，所有三个人都是红色，所以第三人的帽子是必须的是红吗？ 啊，这里有个矛盾。在情况1（R R R）下，第三人看到前面两个红，则他自己戴的只能是红，因为总共有三个红被用了，而总数有 3红可用。因此他可以确定自己戴着红帽。 但是，在这种情况下，第三人在第一次提问时就会知道自己的颜色，并回答红色？ 如果这样，那么在情况1中，第三个人会在第一次就举手说红，从而排除这种情况。 但问题在于题目可能的情况是否允许这种情况存在？ 或者我是不是哪里弄错了？ 让我们仔细分析： 当总共有2W和3R的帽子被分发到三个人时： - 情况1（R R R）：此时用掉了三个红，所以剩下的两顶未使用的帽子是两个白。这是可能的。 在这种情况下，第三人看到前两人都是红色，那么他自己的帽子必须是红色吗？ 因为总共有3个红帽可用，而已经用了两个，第三个可以是红或白？不： 如果第三人的帽子是白色，则此时三人中的颜色为 R R W，这样只用了1W和2R。这时剩下的未使用的是1W（原2W用了一个）和1R（因 为总共有3R用了两个）。因此这是可能的。 所以第三人并不能确定自己的颜色是否必须是红，因为他有可能自己戴的是白或红。 因此他无法立即知道自己的颜色。 哦，我之前犯了错误，以为如果前两人都是红，则第三个只能是红，但实际上他也可以是白，因为总共有三个红可用，但也可以选择 用一个白帽。因此，在情况1（R R R）中，第三人其实不能确定自己是否戴的是红或白？ 或者等一下： 在情况1的R R R情况下，第三人的帽子确实是红色，因为他必须戴着第三个红帽，而总数是3红被用掉，但其他人并不知道这一点。 所以对于第三人来说，在他自己的视角下，可能的情况有两种：他自己戴红或白。 因此无法确定，所以他不能立即回答。 好的，那回到各个情况： 现在我们来分析每个情况下在第一次提问时是否有任何人可以确定自己帽子的颜色： 1. R R R： - 第三人看到RR → 可能自己戴R或W？如前所述，他无法确定，所以不回答。 2. W R R（第一人白，第二红，第三红）： - 第三人看到WR → 他自己可能是什么？ 总共有两顶白帽被用了1个（在第一个人），因此剩下的一个白可能在自己或第二人的位置？但第二个是R，所以第三个可以戴W或 者 R。 因此第三人不能确定自己的颜色。 3. R W R： - 第三人看到RW → 自己可能是W或 R？ 同样，总共有1个W被用了（在第二人），因此剩下的一个W可能属于自己，或者其他位置？但这里第三人的帽子是R，所以是否可 能？ 在这种情况下，第三人戴的是红，所以他不能确定。 4. R R W： - 第三人看到RR → 自己必须是W？因为前两人都是红，而总共有2白帽可用。此时如果他自己戴了W，则总数用了1个W；或者他戴 R的话则0W？ 但总共有两顶白帽被分发到三个人中，所以如果第三人的帽子是白色，则总共有1W（自己）和前面的两个红。 或者如果是R R W的情况下，第三人确实戴的是W吗？ 是的，在这种情况下，第三人的颜色是W。但是当他看到前两人都是红时，他可能认为自己的颜色可能是W或 R，因为总共有两白 可用： 如果他自己戴的是红色，则剩下的第二个白色必须在其他人身上？但前面两个人已经是R了，所以第三个如果是红的话，那么总共有 0个白色被使用，这不符合该情况（即当前的情况是R R W）。 因此在这种情况下，当第三人看到RR时，他可能推断出自己的颜色只能是W吗？ 因为如果自己戴的是红色，则必须有另一个白色在前面两个人中，但他们都戴着红，所以总共有0白，而这种情况属于其他情况。 所 以他可以排除这种情况，并得出自己必须戴W? 或者这需要更仔细的分析： 当第三人看到前两人都是R时，那么他自己可能的颜色是： - 如果他的颜色是W：则总共有1个白色被用（自己的），剩下的还有另一个白色未使用。 - 或者他是R，则总共有0白被使用，但这种情况是否允许？ 因为题目中分发的是三个帽子，其中可以包括0、1或2个白。因此如果他自己戴红的话，那么总数的白帽可能为0，这在整体情况是允 许的（即存在R R R的情况）。 所以第三人无法确定自己是否必须戴W或R，因为他不能排除自己属于R R R的情况。 因此他还是无法确定。 5. W R R: 第三人看到WR → 自己可能是W或 R？ 6. R W R： 第三人看到RW → 同样不确定. 7. R R W的情况： 如前所述，第三人可能认为自己必须戴W？或者不能确定？ 现在考虑其他情况： 当第三个是白色时（即R R W）的第三人的视角： 他看到前两人都是红，那么他自己可能是白或红。 如果他是红，则总共有0个白被使用，这是另一个可能性。 因此他无法确定。 接下来分析是否存在任何情况下某人可以在第一次就确定自己的颜色： 考虑当第一个人戴白色时（如情况2 W R R）: 第一个人看到的是第二和第三人的帽子颜色。假设第一个人是W，那么他知道总共有两顶白帽被分发，因此剩下的1个白可能在其他两 个人中。 但如果没有其他人能立刻确定的话，这可能不会帮助他立即知道自己的颜色。 现在考虑当第二个人戴白色时（如情况3 R W R）: 第二人看到第一个人是R，第三人是R。 他知道总共有两顶白帽被分发，因此如果他自己戴的是W，则另一个白必须在其他两个人中？ 但前两个人都是红，所以只能是第三人戴白？ 但是第三个实际上在这里是红，所以这可能导致矛盾。 或者第二人无法确定自己的颜色. 现在，考虑当第三个人看到前两人都是白色的情况： 假设情况为 W W R: 此时第三人可以看到两个W，则知道总共有两顶白帽被用完了（如果自己戴的是R的话），因此他可以推断出自己戴的是红色吗？ 是的，在这种情况下，如果前两个人都是白色，则第三人知道自己必须戴红，因为总共只有两顶白帽可用。 但是这种情况是否在我们的初始情况中存在？即假设总共有三个人： 比如情况 W W R: 此时第三人的颜色是R。 当他看到两个W时，他可以推断自己戴的是红色吗？ 是的，因为他知道总共有两顶白帽被使用，如果前两人都是白色，则第三个只能是红色。 因此在这种情况下，第三人可以在第一次就确定自己的颜色。 但是这种情况是否属于我们之前列出的情况中的某个？ 我们的初始情况可能没有包括所有可能性。 例如： 可能还有W W R 和W R W以及R W W等其他情况。 因此，在这种情况下（即前两人都是白色），第三人可以立即知道自己的颜色是红色。 因此，当第三个人看到前面两个人戴白时，他可以确定自己戴的是红帽，并在第一次就回答。 但是题目中初始的问题可能是否定这种情况的发生？或者需要重新分析所有可能的情况？ 现在回到问题本身： “国王给了三个囚犯每人一顶帽子，帽子的颜色是白色或红色。他们排成一列，第三个可以看到前两人的帽子颜色，第二个只能看到 第一个的，而第一个人看不到任何人的。” 问题是：是否存在某种情况下某人能立即知道自己戴的是什么颜色？ 根据上面的分析，在W W R的情况下，第三人可以知道自己的颜色。 因此答案是存在这样的情况，并且此时第三人可以确定自己戴着红色。 但用户的问题可能更一般化地询问是否在某些情况下有人可以推断出自己的帽子颜色。 因此回答应该是肯定的，并给出例子。 但根据用户的原始问题可能希望我们进行这样的分析并得出结论，即当第三个看到两个白帽时，他能确定自己戴红。 现在回到用户的具体输入： 用户说：“国王给了三个囚犯每人一顶帽子，颜色是白色或红色。他们排成一列，第三个可以看到前两人的帽子颜色，第二个只能看 到第一个的，而第一个人看不到任何人的。” 问是否存在这样的情况让某人能立即知道自己戴的是什么颜色？ 因此答案应该是：是的，并且具体来说当第三个人看到两个白帽时，他可以推断自己戴红。 因此存在这种情况。 不过我需要确保我的分析正确。 另一个例子： 如果第三个看到第一个和第二个都是红色，则他无法确定自己的颜色（可能是红或白）。 但如果第三个看到两个白，则他知道必须是红，因为只有两顶白帽可用。 因此在这种情况下确实可以推断出。 同样的，如果有第二个人看到第一个人戴白色，并且假设他自己也戴着白色，则总共有两顶白帽被使用，那么第三人必须戴红色。 但这是不是他能立刻知道呢？ 比如如果第二个人看到第一个是白，而自己可能戴的是白或红： - 如果他自己戴的是白，则第三个只能戴红（因为只有两个白可用） 但是第二人并不能立即得知第三人的颜色，所以无法推断自己的颜色。 因此只有在特定情况下，如第三人看到两顶白帽时才能确定。 同样，如果第一个人戴白色，并且假设他能看到其他人的帽子，但他实际上看不到任何人。 因此第一人无法通过观察来推断，除非 其他人给出信息。 因此结论是：当第三个囚犯看到前两个都是白色时，他可以立即知道自己戴的是红色。 hy3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 我们被问到：\u0026#34;国王让三智者站成一个纵队，闭上眼睛，给他们每人戴一顶帽子。然后睁眼，中间可以看到前面的帽子，最后面的可以看到前两个。他们都知道共有2顶白帽子和3顶红帽子。国王问这三人：“谁知道自己戴的帽子颜色？” 问了两遍无人回答。第三遍时是否有人能回答？如果有，他是哪一位？戴什么颜色帽？\u0026#34; 这是一个经典的逻辑谜题。有三个人站成一列：我们称他们为A（最前面）、B（中间）、C（最后面）。C可以看到A和B的帽子；B可以看到A的帽子；A看不到任何人。帽子总共有2白3红，所以总共5顶帽子，给三个人戴，剩下两顶未用。每个人知道总数。 国王问三次：“谁知道自己戴的帽子颜色？”第一次无人回答；第二次无人回答；第三次有人回答。我们需要找出谁在第三次回答，以及他的帽子颜色。 分析： 首先，考虑可能的情况。由于只有2白3红，分配给三个人的帽子组合。可能的情况： 三红：概率？但可能。 两红一白：可能。 两白一红：可能。 三白：不可能，因为只有两顶白帽子。 所以可能的组合： (R,R,R), (R,R,W), (R,W,R), (W,R,R), (R,W,W), (W,R,W), (W,W,R)。但注意顺序：A、B、C的位置。 C能看到A和B的帽子。如果C看到两顶白帽子，那么他会立即知道自己是红帽子，因为总共只有两顶白帽子。所以如果C在第一轮就沉默，意味着他没有看到两顶白帽子。因此，C看到的不是(W,W)。所以A和B的组合不是两白。 现在第一轮无人回答，意味着C没有看到两白。 第二轮：B听到C沉默，并且B能看到A的帽子。B会推理：如果B看到A戴白帽子，那么结合C的沉默，B能推断出什么？假设B看到A是白的。那么如果B自己也是白的，那么C就会看到两白，C就会在第一轮回答。但C没有回答，所以B不能是白的。因此如果B看到A是白的，那么B可以推断自己是红的。所以B会在第二轮回答。但是题目说第二遍无人回答，所以B也没有回答。这意味着B没有看到A是白的。因此A不是白的。所以A是红的。 第三轮：A听到前两轮无人回答。A可以推理：从C的沉默，A知道A和B不全是白。从B的沉默，A知道B没有看到A是白（因为如果B看到A是白，B会推断自己是红并回答）。所以A推断自己不是白，因此是红。所以A在第三轮回答，说自己是红帽子。 所以答案是：第三遍时，最前面的人（第一位）能回答，他戴的是红帽子。 但让我们确认一下：有没有可能其他人也在第三轮回答？通常这个谜题是：第三个人先沉默，第二个人沉默，第一个人说话。所以是的。 因此最终答案：第三遍时，第一位智者（最前面的人）能回答，他戴的是红帽子。 1 2 3 4 5 6 7 8 9 这是一个经典的逻辑推理问题。经过逐步分析： 第一遍：最后面的人（C）能看到前两人的帽子。如果他看到两顶白帽，就能立刻确定自己是红帽（因为总共只有两顶白帽）。但他沉默了，说明前两人不全是白帽。 第二遍：中间的人（B）听到了C的沉默，并且能看到最前面的人（A）的帽子。如果B看到A戴的是白帽，结合C的沉默，他就能推出自己一定是红帽（否则C会看到两白）。但B也沉默了，这说明B没有看到A戴白帽，因此A戴的是红帽。 第三遍：最前面的人（A）根据前两人的沉默，推理出自己戴的必然是红帽。 结论：第三遍时，最前面的智者（第一位）能回答，他戴的是红帽子。 总结 从上面的三道逻辑题的例子可以看出GPT-4模型的厉害之处：\n理解能力更强了 表达能力更强了 逻辑推理能力可以说有新的突破 ","permalink":"https://myself659.github.io/post/ai/logic-gpt4-chatgpt/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003eGPT-4最近已经推出，那么GPT-4表现如何？相对于chatGPT使用的gpt3.5模型有哪些提高与进步？\u003c/p\u003e\n\u003cp\u003e下面就通过三道逻辑题展开测试与对比。\u003c/p\u003e","title":"从三道逻辑分析题看GPT4"},{"content":"背景 AI编程已经不再是传说，而是事实。GitHub Copilot这样的工具会不断推动AI编程的普及。这会带来给程序员的工作带来新的变化。\n这一变化有以下特点：\nAI编程工具越来越普及 程序员工作中完成具体的编码的部分会越来越少，也就是纯编码工作会减少 如何高效使用AI编程工具是每个程序员的必修课 从传统的算法与数据结构的编程方式转变成机器智能时代的AI编程方式 重点技能 提高抽象思考能力以及系统架构与设计能力\n提高软件工程能力，指导AI完成并交付大型软件与复杂项目\n培养战略性思维,理解商业需求,深入理解产品需求和业务目标,做出正确的技术方案指导，利用AI编程解决复杂问题\n代码审查能力，审查AI编程的代码，确保代码的质量\n学习Prompt Programming与prompt engineer，提高与AI交互能力与工程能力\n学习监督机器学习，掌握让AI向优秀代码案例学习的机器学习方法,来持续提高AI的编程能力\n学会如何学习，不断提高学习能力\n","permalink":"https://myself659.github.io/post/ai/ai%E7%BC%96%E7%A8%8B%E6%97%B6%E4%BB%A3%E7%9A%84%E6%8A%80%E8%83%BD/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003eAI编程已经不再是传说，而是事实。GitHub Copilot这样的工具会不断推动AI编程的普及。这会带来给程序员的工作带来新的变化。\u003c/p\u003e\n\u003cp\u003e这一变化有以下特点：\u003c/p\u003e","title":"AI编程时代程序员应该重点培养的技能"},{"content":"ChatGPT is the best free teacher.\nHow to use ChatGPT to empower learning. The examples are as following:\n1. Understand anything easily Prompt:\n“Can you explain the concept of (topic) in simple terms? Summarize the main principles and illustrate with examples to facilitate understanding.”\n1 Can you explain the concept of (zero-knowledge proof) in simple terms? Summarize the main principles and illustrate with examples to facilitate understanding. 2. Create a learning plan Prompt:\n“I want to learn to (topic). Give me step-by-step instructions on how to learn (skill).\nStart with the basics and move on to the more difficult stuff. Keep in mind that I’m a beginner.”\n3. Learn the most important terms Prompt:\n“What are some key terms I should know about (topic)? Make a list with a short and simple definition of each term each time.”\n4. Consult an expert and ask questions Prompt:\n“I want you to act as an (subject) expert and give me recommendations for (specific question).”\n5. Test your knowledge Prompt:\n“Create a quiz on (topic) with 10 questions. Remember our previous conversation when asking your questions.”\n6. Linking multiple topics Prompt:\n“Describe and explain with simple words the relationship between (concept 1) and (concept 2).”\n7. Find motivation to learn Prompt:\n“Give me some tips on how to stay motivated while learning (topic) by explaining why it will benefit me and what I can do with it.”\n8. Define and understand a concept Prompt:\n“Define (term) and provide an example which can be used in everyday life.\nThe definition should be complete but simple to understand, explain complicated words if there are any.”\n9. Improve what you have created Prompt:\n“The following text is about (topic). Correct all the mistakes and incorrect sentence structures. If anything is wrong with the topic, please report it to me:\n(Put your text here)”\n10. Focus on the most important Prompt:\n“Act as an expert in (topic). My goal is to learn (skill) as fast as possible. Make a list with the most important things to know that will allow me to master this topic.”\n11. Know the best tips for learning Prompt:\n“I\u0026rsquo;m just starting to learn (topic). Define the best strategies and tricks for (subject).”\n12. Get reliable sources Prompt:\n“I want you to act as a research assistant and provide me with 5 reliable sources to learn about (topic). Give me the date and source link each time.”\n","permalink":"https://myself659.github.io/post/ai/prompt-for-learn/","summary":"\u003cp\u003eChatGPT is the best free teacher.\u003c/p\u003e\n\u003cp\u003eHow to use ChatGPT to empower learning.  The examples are as following:\u003c/p\u003e\n\u003ch2 id=\"1-understand-anything-easily\"\u003e1. Understand anything easily\u003c/h2\u003e\n\u003cp\u003ePrompt:\u003c/p\u003e\n\u003cp\u003e“Can you explain the concept of (topic) in simple terms? Summarize the main principles and illustrate with examples to facilitate understanding.”\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCan you explain the concept of (zero-knowledge proof) in simple terms? Summarize the main principles and illustrate with examples to facilitate understanding.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"2-create-a-learning-plan\"\u003e2. Create a learning plan\u003c/h2\u003e\n\u003cp\u003ePrompt:\u003c/p\u003e","title":"How to use ChatGPT to empower learning"},{"content":"层次 1.观察现象\n2.发现事实\n3.探究本质\n4.致知于行\n5.知行合一\n素质 好奇心： 充满好奇心和善用好奇心，不断深入思考与发现 现实主义：实事求是的态度，不被表象迷惑 深入本质与根本：不满足于表面,会追根究底 空净的境界：消除杂念与干扰，思路与目标清晰明确 开放与自省：保持开放态度,吸收各种观点和经验，不断反思 批判性思维： 怀疑一切，大胆假设 敬畏：心怀敬畏，小心验证 情绪稳定： 保持内心平静，不骄不躁，掌控情绪，不要让情绪主导思考，决策及行动 相信过程： 只有经历的才是真正属于自己的，勇于实践并坚持不懈地迭代 ","permalink":"https://myself659.github.io/post/learn/%E8%AE%A4%E7%9F%A5%E7%9A%84%E5%B1%82%E6%AC%A1%E5%92%8C%E7%B4%A0%E8%B4%A8/","summary":"\u003ch2 id=\"层次\"\u003e层次\u003c/h2\u003e\n\u003cp\u003e1.观察现象\u003c/p\u003e\n\u003cp\u003e2.发现事实\u003c/p\u003e\n\u003cp\u003e3.探究本质\u003c/p\u003e\n\u003cp\u003e4.致知于行\u003c/p\u003e\n\u003cp\u003e5.知行合一\u003c/p\u003e\n\u003ch2 id=\"素质\"\u003e素质\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e好奇心： 充满好奇心和善用好奇心，不断深入思考与发现\u003c/li\u003e\n\u003cli\u003e现实主义：实事求是的态度，不被表象迷惑\u003c/li\u003e\n\u003cli\u003e深入本质与根本：不满足于表面,会追根究底\u003c/li\u003e\n\u003cli\u003e空净的境界：消除杂念与干扰，思路与目标清晰明确\u003c/li\u003e\n\u003cli\u003e开放与自省：保持开放态度,吸收各种观点和经验，不断反思\u003c/li\u003e\n\u003cli\u003e批判性思维： 怀疑一切，大胆假设\u003c/li\u003e\n\u003cli\u003e敬畏：心怀敬畏，小心验证\u003c/li\u003e\n\u003cli\u003e情绪稳定： 保持内心平静，不骄不躁，掌控情绪，不要让情绪主导思考，决策及行动\u003c/li\u003e\n\u003cli\u003e相信过程： 只有经历的才是真正属于自己的，勇于实践并坚持不懈地迭代\u003c/li\u003e\n\u003c/ol\u003e","title":"认知的层次和素质"},{"content":"定义 什么是无效认知？\n一切缺少与行动结合的认知都属于无效认识。\n无效认识的危害 无效认知缺少反馈 无效认知不能带来确定性，相反还会带来混乱，增加认知负载 无效认知占据有效认知的空间 无效认知消耗认知成本 应对无效认知 最直接有效的方式应对无效认识： 将认知与行动结合起来，如果认知与行动不能结合起来，那么就其当作无效认知对待。\n","permalink":"https://myself659.github.io/post/learn/%E6%97%A0%E6%95%88%E8%AE%A4%E7%9F%A5/","summary":"\u003ch2 id=\"定义\"\u003e定义\u003c/h2\u003e\n\u003cp\u003e什么是无效认知？\u003c/p\u003e\n\u003cp\u003e一切缺少与行动结合的认知都属于无效认识。\u003c/p\u003e\n\u003ch2 id=\"无效认识的危害\"\u003e无效认识的危害\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e无效认知缺少反馈\u003c/li\u003e\n\u003cli\u003e无效认知不能带来确定性，相反还会带来混乱，增加认知负载\u003c/li\u003e\n\u003cli\u003e无效认知占据有效认知的空间\u003c/li\u003e\n\u003cli\u003e无效认知消耗认知成本\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"应对无效认知\"\u003e应对无效认知\u003c/h2\u003e\n\u003cp\u003e最直接有效的方式应对无效认识： 将认知与行动结合起来，如果认知与行动不能结合起来，那么就其当作无效认知对待。\u003c/p\u003e","title":"谈谈无效认知"},{"content":"背景 在这片神奇的土地上由于GFW的存在，导致：\n不能正常访问全球最大的搜索引擎google 不能正常访问全球最大的视频网络youtube 不能正常访问全球最大的社交网络应用（facebook，whatapp，instagram） 不能正常应用最前沿的AI应用：chatGPT 不能正常访问全球最大的代码库：github \u0026hellip;\u0026hellip;\n所有这些一切都影响在中国大陆的每一个信息与知识的获取及交流。这一切都违背了知识自由。\n知识自由 上面提到了知识自由，那什么是知识自由？\n知识自由(Intellectual Freedom)指的是个人进行独立思考和获取信息的自由,不受不合理的限制和干扰。\n其主要特征包括:\n表达自由 - 能够自由表达观点和见解的权利。\n获取信息的自由 - 能够不受限制地获取各种信息和资源的自由。\n探究真理的自由 - 可以自由探索知识,寻求真理,不受意识形态或权威约束。\n独立思考的自由 - 个人可以自主地进行判断和决策,不受他人的控制或者操纵。\n质疑的自由 - 可以自由地对任何权威进行质疑和批评。\n出版自由 - 可以自由地出版和传播作品和观点。\n教学自由 - 教师可以自由选择教学内容和方法。\n知识自由是创新的基础 知识自由体现在学术和言论自由上,意味着人们可以自由探索知识,表达思想,不受不合理的限制和约束。 知识自由为创新创造提供了开放包容的环境。人们可以毫无顾忌地讨论和发散思维,这有助于产生更多新的见解和创意。 知识自由支持多样化的思想交流。不同观点的交融有助于形成新颖独特的视角,推动原有知识的突破和重组。 知识自由鼓励主动的学习和探索精神。探索未知领域、学习他领域知识都是创新的源动力。 知识自由提供获取各类信息的便利条件。丰富的信息源和途径有助于广泛吸收知识营养,培育创新思维。 知识自由激发个人创造潜能和主体精神。人们会更自信地创造和贡献知识,推动知识创新。 总之,知识自由为创新提供环境和动力,是实现知识创新的重要基础。充分的知识自由能更好激发人类创造力和进步潜能。\n言论自由是知识自由的基础 言论自由保障人们可以自由表达思想和观点,这是获取知识和探索未知的前提。 没有言论自由,知识就是被限制和束缚的。新思想和创见很难被提出和传播。 言论自由鼓励独立思考,不同观点的交锋促进知识更新和创新。 言论自由培育开放的学术文化氛围,有利于知识交流和进步。 言论自由使各类知识更易获取,人们可以在更大范围内获取各种信息。 言论自由使错误观点易于被指正,有助于知识趋向客观和准确。 言论自由需要制度来保障,比如保护知识产权,禁止篡改等。这可减少获取知识的成本。 言论自由需要平等开放的争鸣,不能令某些声音压制其他声音。 言论自由需要互相理解包容,不能发展成混乱与对立。 综上,言论自由为知识自由提供环境和动力,是知识创新不可或缺的前提条件。充分的言论自由,有助于知识的自由探索和创造\n结论 有多少自由，就有多少创新的空间。\n更多的自由，更多的创新。\n言论管控，让创新种子难以发芽，难以成长与壮大。\n","permalink":"https://myself659.github.io/post/economy/%E7%9F%A5%E8%AF%86%E8%87%AA%E7%94%B1%E6%98%AF%E5%88%9B%E6%96%B0%E7%9A%84%E5%9F%BA%E7%A1%80/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e在这片神奇的土地上由于GFW的存在，导致：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e不能正常访问全球最大的搜索引擎google\u003c/li\u003e\n\u003cli\u003e不能正常访问全球最大的视频网络youtube\u003c/li\u003e\n\u003cli\u003e不能正常访问全球最大的社交网络应用（facebook，whatapp，instagram）\u003c/li\u003e\n\u003cli\u003e不能正常应用最前沿的AI应用：chatGPT\u003c/li\u003e\n\u003cli\u003e不能正常访问全球最大的代码库：github\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u0026hellip;\u0026hellip;\u003c/p\u003e","title":"知识自由是创新的基础"},{"content":"国际与国内大环境 先来看看中国及其外部环境：\n疫情三年，大部分民众经济状态恶化（收入下降，开支增加） 政府税收增速远跟不上政府开支的需求 一部分企业家躺平（goblin mode） 疫情冲击（中国阳后出现肺炎人群约为8%）民众健康，影响劳动力市场，增加医保开销 投资，消费，出口的带动作用均下降 全球化下全球分工与协作受到影响 俄乌等局部战争 中美关系的修复关键在中方 2023年房地产卖地收入只会比2022年进一步下降(2022年城投当托，帮拿了不少地) 体制内环境 看了大环境，再看一下体制内环境：\n国考录用比约70:1，这会招进一批卷王 国家自然科学基金委通报8人学术不端，这是多年不见的事情 各地公务员降薪 内部反腐力度加大 一点常识：体制内不创造财富，大部分国有企业能创造财富，但是效率低下 体制内一直是比较封闭，且近年来有加强的趋势 分析与结论 内卷原因 个人对于内卷的原因通用分析如下：\n封闭或者开放不足导致空间不足 控制过多 集中度过高 目标趋同 路径趋同 体制内环境与运行方式十足地满足上面的原因。\n越来越卷原因 封闭越来越强，开放越来越不足 控制越来越多（如各种规定如考核） 集中度越来越高（如国考录用比约70:1） 体制内目标趋同（大部分人求安稳，领一份生活的工资） 路径趋同（大部分人讲内部潜规则与暗规则） 财政收入跟不上开支，导致体制内各部门竞争加大 更多的卷王加入体制内，增加相互卷的动力（只要这种工作处于社会的顶端，一定会卷起来，互联网大厂就是最好的证明） 由上可知：内卷的条件越来越符合，内卷的动力越来越强，所以会越来越内卷。\n结论 如果经济不能很好的恢复（当然经济恢复到原来的增长是不可能的），财政压力没有缓解，体制内只会越来越卷。\n希望 最后希望卷的目标是合法的收入与职位，卷的路径是实实在在为人民服务，努力避免那种无意义无效果的内卷。\n","permalink":"https://myself659.github.io/post/human/%E4%BD%93%E5%88%B6%E5%86%85%E4%BA%BA%E5%91%98%E5%86%85%E5%8D%B7%E8%B5%B7%E6%9D%A5/","summary":"\u003ch2 id=\"国际与国内大环境\"\u003e国际与国内大环境\u003c/h2\u003e\n\u003cp\u003e先来看看中国及其外部环境：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e疫情三年，大部分民众经济状态恶化（收入下降，开支增加）\u003c/li\u003e\n\u003cli\u003e政府税收增速远跟不上政府开支的需求\u003c/li\u003e\n\u003cli\u003e一部分企业家躺平（goblin mode）\u003c/li\u003e\n\u003cli\u003e疫情冲击（\u003ca href=\"https://news.sina.com.cn/o/2023-01-08/doc-imxzmrnq0447745.shtml\"\u003e中国阳后出现肺炎人群约为8%\u003c/a\u003e）民众健康，影响劳动力市场，增加医保开销\u003c/li\u003e\n\u003cli\u003e投资，消费，出口的带动作用均下降\u003c/li\u003e\n\u003cli\u003e全球化下全球分工与协作受到影响\u003c/li\u003e\n\u003cli\u003e俄乌等局部战争\u003c/li\u003e\n\u003cli\u003e中美关系的修复关键在中方\u003c/li\u003e\n\u003cli\u003e2023年房地产卖地收入只会比2022年进一步下降(2022年城投当托，帮拿了不少地)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"体制内环境\"\u003e体制内环境\u003c/h2\u003e\n\u003cp\u003e看了大环境，再看一下体制内环境：\u003c/p\u003e","title":"体制内会越来越内卷"},{"content":"团队如果有以下状态，团队可能处于下行状态：\n团队成员流失严重，且处于加速状态 团队一部分成员内卷严重 团队一部分成员普遍躺平 团队会议没有人主动发声 团队成员总是同意领导的决定 团队成员害怕失败，怕承担责任 团队效率与产出下降 团队的决定需要逐级上报 团队内有大量的微管理 团队成员即使状态挣扎，也不主动求助 团队不能正视问题，拖延或甩锅 团队内团伙多，存在内讧，缺少凝聚力 团队目标与路径不统一 团队领导如何解决这些问题?说一句正确的废话：尊重事实，直面问题，对症下药，制定正确的策略，领导要以身作则，以实际行动来改变团队的现状，至少要让团队在变坏的路上先停下来。\nPs：只适用于小型组织，特别不适用于像国家这样大型组织。\n","permalink":"https://myself659.github.io/post/rt/%E5%9B%A2%E9%98%9F%E7%8A%B6%E6%80%81%E8%AF%8A%E6%96%AD/","summary":"\u003cp\u003e团队如果有以下状态，团队可能处于下行状态：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e团队成员流失严重，且处于加速状态\u003c/li\u003e\n\u003cli\u003e团队一部分成员内卷严重\u003c/li\u003e\n\u003cli\u003e团队一部分成员普遍躺平\u003c/li\u003e\n\u003cli\u003e团队会议没有人主动发声\u003c/li\u003e\n\u003cli\u003e团队成员总是同意领导的决定\u003c/li\u003e\n\u003cli\u003e团队成员害怕失败，怕承担责任\u003c/li\u003e\n\u003cli\u003e团队效率与产出下降\u003c/li\u003e\n\u003cli\u003e团队的决定需要逐级上报\u003c/li\u003e\n\u003cli\u003e团队内有大量的微管理\u003c/li\u003e\n\u003cli\u003e团队成员即使状态挣扎，也不主动求助\u003c/li\u003e\n\u003cli\u003e团队不能正视问题，拖延或甩锅\u003c/li\u003e\n\u003cli\u003e团队内团伙多，存在内讧，缺少凝聚力\u003c/li\u003e\n\u003cli\u003e团队目标与路径不统一\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e团队领导如何解决这些问题?说一句正确的废话：尊重事实，直面问题，对症下药，制定正确的策略，领导要以身作则，以实际行动来改变团队的现状，至少要让团队在变坏的路上先停下来。\u003c/p\u003e","title":"如何判断团队是否处于下行状态"},{"content":"说明 下面的所有的问题均由chatGPT回答。\n如何描述问题才能让chatGPT更好的回答？ 以下是描述问题的一些技巧，可以帮助 ChatGPT 更好地理解和回答你的问题：\n简明扼要地描述你的问题：尽可能简单清晰地表达你的问题，避免使用复杂或模糊的术语或语言。\n提供相关背景信息：提供与问题相关的背景信息，例如任何先前的经验或事件、相关的环境或条件、你的目标等。\n采用具体的语言：使用具体的词汇和语言，以确保问题的清晰度和准确度。\n避免主观判断：尽量避免使用主观性的描述或判断，以免对问题的理解和回答造成误导。\n确定你想要的答案类型：明确你希望 ChatGPT 回答的是什么类型的问题，例如一个事实、一个意见、一个建议或者一个说明等。\n提供示例：如果可能的话，提供示例或场景，以便 ChatGPT 更好地理解你的问题。\n相关问题的链接：如果你的问题与某个领域的其他问题有关，可以提供相关的链接或参考资料，以便 ChatGPT 提供更全面的答案。\n通过以上技巧，你可以帮助 ChatGPT 更好地理解你的问题，提供更准确、详细和有用的回答。\n请提供一些具体的例子 当你在描述问题时，以下是一些具体的例子可以帮助 ChatGPT 更好地理解你的问题：\n问题描述：如何在网上购物？\n不够好的问题描述：告诉我网上购物的所有事情。\n更好的问题描述：我想在亚马逊上购买一些物品。你可以告诉我如何浏览商品、下订单、支付和退货吗？\n问题描述：如何在大学申请研究生项目？\n不够好的问题描述：我需要研究生项目的所有信息。\n更好的问题描述：我想申请某所大学的计算机科学研究生项目。你可以告诉我申请过程、文书材料、要求、截止日期和其他相关信息吗？\n问题描述：如何学习编程？\n不够好的问题描述：告诉我学习编程的所有东西。\n更好的问题描述：我想学习 Python 编程语言。你可以建议一些学习资源、练习项目和实践技巧吗？\n问题描述：如何烤比萨饼？\n不够好的问题描述：告诉我如何烤一张比萨饼。\n更好的问题描述：我想在家里烤一张美味的比萨饼。你可以分享一些比萨饼面团的配方、烤箱设置和烹饪时间吗？\n问题描述：如何降低血压？\n不够好的问题描述：告诉我如何降低血压。\n更好的问题描述：我被诊断为高血压，你可以给我一些改善生活方式、饮食、锻炼和药物治疗的建议吗？\n以上例子中，更好的问题描述提供了更具体、清晰、明确和可操作的信息，让 ChatGPT 更好地理解问题并提供更有针对性的答案。\n请从所有你回答的问题中选择十个你觉得问最好的问题 以下是我从我回答的问题中选择的十个我认为最好的问题：\n什么是人工智能，它的优点和缺点是什么？\n如何在工作和家庭生活之间取得平衡？\n什么是气候变化，它是如何发生的，我们可以做些什么来减缓它的影响？\n什么是心理健康，我们可以做些什么来保持它？\n为什么有些人会拥有更强的意志力？我们如何训练我们的意志力？\n什么是全职教育，我们可以从中获得什么收益？\n如何成为一个好的领导者？哪些特质和技能是必要的？\n什么是区块链技术，它是如何工作的，有什么应用场景？\n如何学会自我管理和组织，以提高效率和效益？\n什么是数据隐私，为什么它很重要？我们可以做些什么来保护我们的数据隐私？\n以上这些问题都是现代生活中普遍而重要的问题，能够引起人们的关注和探究，涉及科技、生活、工作、社会等多个方面，希望我的回答可以帮助人们更好地了解和处理这些问题。\n请从所有你回答的问题中选择十个最有趣的问题 以下是我从我回答的问题中选择的十个我认为最有趣的问题：\n如果你可以回到过去，在什么时候，你会选择去哪里？为什么？\n如果你可以选择一个超能力，你会选择什么？为什么？\n什么是灵魂，它是否存在？如果存在，我们如何定义它？\n如果你被允许以另一个种族的身份生活一天，你会选择哪一个？为什么？\n在人类历史上，你认为最具影响力的发明是什么？为什么？\n你认为最重要的美德是什么？为什么？\n如果你可以选择任何职业，你会选择做什么？为什么？\n你认为幸福是什么？我们可以通过什么途径获得幸福？\n如果你可以改变世界上的一个事情，你会选择什么？为什么？\n你认为人工智能是否有可能具有情感和意识？为什么？\n以上这些问题都是有趣和具有思想性的问题，涉及到哲学、心理学、历史等多个领域，希望我的回答可以激发人们的好奇心，启发人们思考，并帮助人们更好地了解自己和周围的世界。\n请从所有你回答的问题中选择十个最有深度的问题 以下是我从我回答的问题中选择的十个我认为最有深度的问题：\n什么是意识，它如何产生？有没有可能制造出拥有意识的机器？\n什么是真正的自由？我们如何实现真正的自由？\n什么是生命，它从哪里来，我们如何定义它？\n为什么有些人更容易受到诱惑和短视的行为，我们如何控制自己的欲望和冲动？\n什么是社会公正，我们如何实现社会公正？\n什么是爱，我们如何定义爱，它是否可以被量化？\n什么是幸存者偏差，它是如何影响我们的决策和思维？\n什么是文化，它对我们的思维和行为有何影响？\n什么是自我，我们如何定义自我，它是否可以被消除？\n什么是意义，我们如何寻找生命的意义？\n以上这些问题都是深刻和复杂的问题，它们涉及哲学、心理学、人类学等多个领域，是我们探索和思考生命和世界的基本问题。我的回答可能无法回答所有的问题，但是希望它们能够为读者提供启示和帮助，激发人们对这些问题的好奇心，并引导他们更深入地思考。\n请从所有你回答的问题中选择十个最复杂的问题 以下是我从我回答的问题中选择的十个我认为最复杂的问题：\n什么是宇宙，它的起源是什么？它的未来是什么？\n为什么我们需要睡觉？睡眠对我们的身体和心理有什么影响？\n为什么有些人会成为创造性的天才？创造性思维是如何产生的？\n什么是意识流，它对我们的思维和创造力有什么影响？\n为什么时间感觉会随着年龄的增长而变得更快？我们如何感知时间？\n为什么我们会有梦境？梦境对我们的心理和情感有什么影响？\n什么是人格，它是如何形成的？我们如何改变或塑造自己的人格？\n为什么有些人比其他人更容易上瘾？成瘾的机制是什么？如何预防和治疗成瘾？\n什么是记忆，它是如何存储和检索的？我们如何增强和改变自己的记忆？\n什么是语言，它是如何产生和发展的？语言对我们的思维和行为有何影响？\n这些问题都非常复杂，涉及多个学科和领域的研究。它们需要深入的思考、仔细的研究和对相关领域的广泛知识。这些问题的答案也没有定论，因为它们可能因为新的研究和发现而不断发生变化。\n请列出人们常问的50个问题。 以下是人们常问的50个问题，它们按主题分类：\n健康和医疗问题：\n如何保持健康？\n如何治疗感冒？\n如何预防癌症？\n如何减轻头痛？\n如何治疗焦虑和抑郁症？\n人际关系问题：\n如何与家人和朋友建立良好的关系？\n如何处理婚姻问题？\n如何与同事相处？\n如何处理分手？\n如何避免孤独感？\n个人成长和发展问题：\n如何成为更好的人？\n如何掌控自己的情绪？\n如何克服拖延症？\n如何提高自我意识？\n如何建立自信？\n职业和就业问题：\n如何寻找工作？\n如何准备面试？\n如何谈判薪资？\n如何升职？\n如何转行？\n金融和理财问题：\n如何储蓄和投资？\n如何制定预算？\n如何消除债务？\n如何降低开支？\n如何理解股票和基金？\n教育和学习问题：\n如何学习？\n如何提高记忆力？\n如何制定学习计划？\n如何提高成绩？\n如何选择专业？\n生活方式问题：\n如何放松和减轻压力？\n如何保持健康的饮食习惯？\n如何克服不良习惯？\n如何保持身材？\n如何提高睡眠质量？\n科技和媒体问题：\n如何使用智能手机？\n如何保护个人隐私？\n如何保持安全的网络习惯？\n如何利用社交媒体？\n如何使用计算机软件？\n这只是一份简单的列表，人们提出的问题种类和数量随着时间和地点的变化而变化。\n参考 Best practices for prompt engineering with OpenAI API ","permalink":"https://myself659.github.io/post/ai/how-to-ask-gpt/","summary":"\u003ch2 id=\"说明\"\u003e说明\u003c/h2\u003e\n\u003cp\u003e下面的所有的问题均由chatGPT回答。\u003c/p\u003e\n\u003ch2 id=\"如何描述问题才能让chatgpt更好的回答\"\u003e如何描述问题才能让chatGPT更好的回答？\u003c/h2\u003e\n\u003cp\u003e以下是描述问题的一些技巧，可以帮助 ChatGPT 更好地理解和回答你的问题：\u003c/p\u003e\n\u003cp\u003e简明扼要地描述你的问题：尽可能简单清晰地表达你的问题，避免使用复杂或模糊的术语或语言。\u003c/p\u003e","title":"如何更好地向ChatGPT提问"},{"content":"定义 在 Rust 中，生命周期（lifetime）是用来描述引用（reference）有效期的一种概念。每个引用都有一个生命周期，表示该引用指向的数据在内存中的存活时间。生命周期用于在编译时检查引用是否有效，并避免出现空指针、野指针等内存安全问题。\n生命周期通过单引号字符（\u0026rsquo;）来表示，通常采用小写字母 a、b、c 等表示。生命周期参数一般写在函数、结构体、枚举等数据类型定义的左尖括号后面，并用尖括号括起来。例如：\n1 2 3 fn foo\u0026lt;\u0026#39;a, \u0026#39;b\u0026gt;(x: \u0026amp;\u0026#39;a str, y: \u0026amp;\u0026#39;b str) -\u0026gt; \u0026amp;\u0026#39;a str { // function body here } 这个例子中，foo 函数有两个生命周期参数，\u0026lsquo;a 和 \u0026lsquo;b，它们用于描述 x 和 y 引用的有效期。\u0026lsquo;a 表示 x 引用的生命周期，\u0026lsquo;b 表示 y 引用的生命周期。\n在 Rust 中，生命周期的主要作用是帮助编译器进行引用的内存管理和安全检查，避免出现悬垂指针、空指针、野指针等内存安全问题。生命周期检查是 Rust 语言的静态检查机制之一，编译器会在编译时检查引用是否有效，以避免程序在运行时出现内存错误。\n使用lifetime的场景 在 Rust 中，必须写明生命周期的情况主要包括以下几种情况：\n函数的输入参数或返回值是引用类型，且该引用类型可能有多个实例，这些引用实例之间可能存在生命周期的依赖关系。\n在结构体中储存引用类型时，结构体和其中的引用之间可能存在生命周期的依赖关系。\n在实现 trait 时，trait 中定义的方法参数或返回值是引用类型，且该引用类型可能有多个实例，这些引用实例之间可能存在生命周期的依赖关系。\n在上述情况中，编译器需要知道引用的生命周期，以便确定引用是否有效，以及引用是否存在悬垂指针等安全问题。如果没有指定生命周期，编译器将无法检查这些安全问题并发出编译错误。\n例如，以下是需要指定生命周期的示例代码：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 fn longest\u0026lt;\u0026#39;a\u0026gt;(x: \u0026amp;\u0026#39;a str, y: \u0026amp;\u0026#39;a str) -\u0026gt; \u0026amp;\u0026#39;a str { if x.len() \u0026gt; y.len() { x } else { y } } struct Foo\u0026lt;\u0026#39;a\u0026gt; { x: \u0026amp;\u0026#39;a str, y: \u0026amp;\u0026#39;a str, } impl\u0026lt;\u0026#39;a\u0026gt; Trait for Foo\u0026lt;\u0026#39;a\u0026gt; { fn bar(\u0026amp;self, x: \u0026amp;\u0026#39;a str) -\u0026gt; \u0026amp;\u0026#39;a str { // method body here } } 在这些例子中，我们需要指定生命周期参数来确保编译器可以正确地检查引用的有效性。\n应用原则 Rust中lifetime（生命周期）是一个非常重要的概念，它与所有权（ownership）和借用（borrowing）密切相关。下面是rust lifetime的几大原则：\n每个变量都有其生命周期 每个变量都有其生命周期，生命周期描述了变量存在的时间范围，即在哪里被创建，在哪里被销毁。如果一个变量超出了其生命周期，它将被认为是无效的，访问它将导致编译时错误。\n生命周期的注解是可选的，但有时必需 Rust编译器可以根据变量的使用情况推断出生命周期，因此不必在每个变量或函数上都手动注明生命周期。然而，在某些情况下，注明生命周期是必需的，例如，当函数参数和返回值都是引用时，需要注明它们的生命周期以确保编译器能够验证引用的有效性。\n生命周期遵循引用的作用域 引用的生命周期不能超过其所引用的变量的生命周期。在rust中，引用的作用域是定义该引用的语句块。因此，在同一作用域中创建的引用具有相同的生命周期。\n生命周期参数具有\u0026rsquo;static生命周期的最长寿命 \u0026lsquo;static生命周期表示整个程序的生命周期，即从程序启动到程序结束。具有\u0026rsquo; static生命周期参数的引用可以跨越整个程序运行时间，它们是最长寿命的引用。\n生命周期参数是泛型类型的一部分 与其他泛型类型一样，生命周期参数可以用于泛型函数和结构体。这样可以为函数和结构体中的引用类型指定生命周期参数，以确保它们的有效性。\n总的来说，lifetime是rust中非常重要的概念，它使得编译器能够静态验证程序中的引用有效性，并防止出现运行时错误。\nrust lifetime常见错误 引用的lifetime超期 具体分为以下几种情况：\n引用的lifetime超过了它所引用的变量的lifetime 1 2 3 4 5 6 7 8 fn main() { let r; { let x = 5; r = \u0026amp;x; // \u0026#39;x\u0026#39; does not live long enough } println!(\u0026#34;r: {}\u0026#34;, r); } 代码运行结果\n函数返回引用的lifetime超过了函数参数的引用lifetime 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 fn main() { let s1 = String::from(\u0026#34;hello\u0026#34;); let result; { let s2 = String::from(\u0026#34;world\u0026#34;); result = get_longest_string(\u0026amp;s1, \u0026amp;s2); // expected lifetime parameters do not have the same lifetime bounds } println!(\u0026#34;The longest string is {}\u0026#34;, result); } fn get_longest_string\u0026lt;\u0026#39;a\u0026gt;(x: \u0026amp;\u0026#39;a str, y: \u0026amp;\u0026#39;a str) -\u0026gt; \u0026amp;\u0026#39;a str { if x.len() \u0026gt; y.len() { x } else { y } } 代码运行结果\n结构体的lifetime超过其结构成员的引用的lifetime 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 struct Car\u0026lt;\u0026#39;a\u0026gt; { engine: \u0026amp;\u0026#39;a str, color: String, } fn main() { let color = String::from(\u0026#34;red\u0026#34;); let engine; { let v8 = String::from(\u0026#34;v8\u0026#34;); let my_car = Car { engine: \u0026amp;v8, // \u0026#39;v8\u0026#39; does not live long enough color: color, }; engine = my_car.engine; } println!(\u0026#34;The engine is {}\u0026#34;, engine); } 代码运行结果\n在函数中返回一个指向局部变量的引用 返回函数定义的局部变量的引用 1 2 3 4 5 6 7 8 9 fn main() { let result = get_reference(); println!(\u0026#34;The value is {}\u0026#34;, result); } fn get_reference\u0026lt;\u0026#39;a\u0026gt;() -\u0026gt; \u0026amp;\u0026#39;a i32 { let n = 42; \u0026amp;n // `n` does not live long enough } 代码运行结果\n返回函数参数变量的引用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 fn main() { let s1 = String::from(\u0026#34;hello\u0026#34;); let s2 = String::from(\u0026#34;world\u0026#34;); let result = get_longest_string(\u0026amp;s1, s2); println!(\u0026#34;The longest string is {}\u0026#34;, result); } fn get_longest_string\u0026lt;\u0026#39;a\u0026gt;(x: \u0026amp;\u0026#39;a str, y: String) -\u0026gt; \u0026amp;\u0026#39;a str { if x.len() \u0026gt; y.len() { x } else { \u0026amp;y // borrowed value does not live long enough } } 代码运行结果\n缺少lifetime 函数缺少lifetime 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 fn main() { let s1 = String::from(\u0026#34;hello\u0026#34;); let s2 = String::from(\u0026#34;world\u0026#34;); let result = get_longest_string(\u0026amp;s1, \u0026amp;s2); println!(\u0026#34;The longest string is {}\u0026#34;, result); println!(\u0026#34;{} {}\u0026#34;, s1, s2); } fn get_longest_string(x: \u0026amp;str, y: \u0026amp;str) -\u0026gt; \u0026amp;str { if x.len() \u0026gt; y.len() { x } else { y } } 代码运行结果\n结构体缺少lifetime 1 2 3 4 5 6 7 8 9 struct Foo { x: \u0026amp;str, // 缺少生命周期参数，编译错误 } fn main() { let s = \u0026#34;hello\u0026#34;; let f = Foo { x: s }; println!(\u0026#34;{}\u0026#34;, f.x); } 代码运行结果\n正确代码如下：\n1 2 3 4 5 6 7 8 9 struct Foo\u0026lt;\u0026#39;a\u0026gt; { x: \u0026amp;\u0026#39;a str, // 指定生命周期参数 } fn main() { let s = \u0026#34;hello\u0026#34;; let f = Foo { x: s }; println!(\u0026#34;{}\u0026#34;, f.x); } ","permalink":"https://myself659.github.io/post/rust/rust-lifetime/","summary":"\u003ch2 id=\"定义\"\u003e定义\u003c/h2\u003e\n\u003cp\u003e在 Rust 中，生命周期（lifetime）是用来描述引用（reference）有效期的一种概念。每个引用都有一个生命周期，表示该引用指向的数据在内存中的存活时间。生命周期用于在编译时检查引用是否有效，并避免出现空指针、野指针等内存安全问题。\u003c/p\u003e","title":"Rust lifetime 101"},{"content":"成功的路径 别人的成功你很难复制,所以要想成功你必须走自己的路。\n自己动手实践的路径是唯一有可能属于自己走向成功的路径。\n成功的概率 走自己的路必不一定能成功。成功与失败是概率的游戏。那么如何提高自己成功的概率呢？\n每个人情况不一样，毕竟每个人都要走自己的路，这里只是很宽泛讲一下：\n发现事实，应用事实，控制事实\n学习科技，应用科技，创新科技\n掌握规则，应用规则，超越规则\n洞察市场，满足市场，开创市场\n总结一下提高成功的概率的原则：\n越靠近事实，越靠近科学，越掌控规则，越靠近市场，则越靠近成功。\n","permalink":"https://myself659.github.io/post/life/%E6%88%90%E5%8A%9F%E7%9A%84%E8%B7%AF%E5%BE%84%E4%B8%8E%E6%A6%82%E7%8E%87/","summary":"\u003ch2 id=\"成功的路径\"\u003e成功的路径\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://myself659.github.io/post/life/%E5%88%AB%E4%BA%BA%E7%9A%84%E6%88%90%E5%8A%9F%E4%BD%A0%E5%BE%88%E9%9A%BE%E5%A4%8D%E5%88%B6/\"\u003e别人的成功你很难复制\u003c/a\u003e,所以要想成功你必须走自己的路。\u003c/p\u003e\n\u003cp\u003e自己动手实践的路径是唯一有可能属于自己走向成功的路径。\u003c/p\u003e\n\u003ch2 id=\"成功的概率\"\u003e成功的概率\u003c/h2\u003e\n\u003cp\u003e走自己的路必不一定能成功。成功与失败是概率的游戏。那么如何提高自己成功的概率呢？\u003c/p\u003e\n\u003cp\u003e每个人情况不一样，毕竟每个人都要走自己的路，这里只是很宽泛讲一下：\u003c/p\u003e","title":"成功的路径和概率"},{"content":"背景 《西游记》小时候只知道看那只猴子，实际上无论是电视剧还是小说里面都隐含大量的知识点。\n下面就以观音菩萨是如何实现权力变现的展开说明。\n权力来源与意图 西游记第八回：\n如来又取出三个箍儿，递与菩萨道：“此宝唤做‘紧箍儿’，虽是一样三个，但只是用各不同。我有‘禁、紧、禁’的咒语三篇。假若路上撞见神通广大的妖魔，你须是劝他学好，跟那取经人做个徒弟。他若不伏使唤，可将此箍儿与他戴在头上，自然见肉生根。各依所用的咒语念一念，眼胀头痛，脑门皆裂，管教他入我门来。”\n从原文可知，如来佛祖作为观音菩萨上级给其三个紧箍儿，显而易见权力的来源是如来佛祖，其意图是让这三个紧箍儿来帮助取经人（唐僧）管教约束三个徒儿。\n权力应用与效率最大化 西游记第十四回：\n老母道：“东边不远，就是我家，想必往我家去了。我那里还有一篇咒儿，唤做《定心真言》；又名做《紧箍儿咒》。你可暗暗的念熟，牢记心头，再莫泄漏一人知道。我去赶上他，教他还来跟你，你却将此衣帽与他穿戴。他若不服你使唤，你就默念此咒，他再不敢行凶。也再不敢去了。”三藏闻言，低头拜谢。那老母化一道金光，回东而去。三藏情知是观音菩萨授此真言，急忙撮土焚香，望东恳恳礼拜。拜罢，收了衣帽，藏在包袱中间。却坐于路旁，诵习那《定心真言》。来回念了几遍，念得烂熟，牢记心胸不题.\n由于孙悟空不受管教，同时已经安排的猪悟能与沙悟净能耐都不如孙悟空，且不像孙悟空那样心猿不定，所以一定要把紧箍儿（权力）给孙悟空戴上，方便唐僧管教，为取经团队的稳定打下基础，保证完成取经任务。\n另外紧箍儿咒，原来叫做定心真言，也是恰当好处，让孙悟空专注一件事：保唐僧取真经。\n权力变现1：收服黑熊怪作为自己的守山大神 西游记第十七回：\n菩萨现相，问妖取了佛衣。行者早已从鼻孔中出去。菩萨又怕那妖无礼，却把一个箍儿，丢在那妖头上。那妖起来，提枪要刺，行者、菩萨早已起在空中，菩萨将真言念起。那怪依旧头疼，丢了枪，满地乱滚。半空里笑倒个美猴王，平地下滚坏个黑熊怪。\n变现点评：\n等待变现时机，等孙悟空主动请自己去帮忙降妖，才开始变现，隐藏变现的主动动机 变现要有合理的理由：用箍制服黑熊怪 合理的变现的对象：黑熊怪，小说中黑熊怪无背景，好学上进，一心向佛，有本领，无劣迹 变现要为自己服务：让黑熊怪作为自己的守山大神 变现后不要给自己惹麻烦：黑熊怪无背景，不属于任何大佬 变现要快：用第一个箍约束孙悟空（西游记第十四回），再到第二个箍收服黑熊怪（西游记第十七回），这中间只间隔三回 权力变现2：收服红孩儿作童子 西游记第四十二回：\n“这宝贝原是我佛如来赐我往东土寻取经人的‘禁、紧、禁’三个箍儿。紧箍儿，先与你戴了；禁箍儿，收了守山大神；这个金箍儿，未曾舍得与人，今观此怪无礼，与他罢。\n变现点评：\n等待变现时机，等孙悟空主动请自己去帮忙降妖，才开始变现，隐藏变现的主动动机 变现要有合理的理由：用箍制服红孩儿 合理的变现的对象：红孩儿，小说中红孩儿是牛魔王的儿子，不属于任何门派，同时潜力大 变现要为自己服务：用箍控制了红孩儿，可以将牛魔王纳入自己的势力，或者将其作为人质要挟牛魔王 变现后不要给自己惹麻烦：将红孩儿收为童子（以教化的名义变现这样名正言顺） 总结 通过上面分析，可知观音菩萨是厉害主啊，其权力变现有以下特点：\n善于发现变现机会，用一箍收了孙悟空，发现另外两个箍不需要用来收猪八戒与沙悟净，同时也避免得罪这两人 合理选择变现对象与路径 把握好变现时机 最大化变现收益 ","permalink":"https://myself659.github.io/post/rt/%E8%A7%82%E9%9F%B3%E6%98%AF%E5%A6%82%E4%BD%95%E6%9D%83%E5%8A%9B%E5%8F%98%E7%8E%B0/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e《西游记》小时候只知道看那只猴子，实际上无论是电视剧还是小说里面都隐含大量的知识点。\u003c/p\u003e\n\u003cp\u003e下面就以观音菩萨是如何实现权力变现的展开说明。\u003c/p\u003e\n\u003ch2 id=\"权力来源与意图\"\u003e权力来源与意图\u003c/h2\u003e\n\u003cp\u003e西游记第八回：\u003c/p\u003e","title":"观音菩萨是如何实现权力变现的"},{"content":"背景 今天是愚人节。愚人是今天大部分人的例行活动。这里不列举各种愚人的活动，只谈一下这些愚人活动的意义。 在我看来，这些愚人活动有以下作用：\n大部分愚人活动提供了一些幽默 提供教育价值，让大部分了解一些骗人的方法与形式 测试一下哪些人容易被骗 愚蠢的人与社会 愚蠢的人 对于愚蠢的人caoz总结下面的六大定律：\n第一定律，从来没觉得自己傻逼过的，往往是不可救药的大傻逼\n第二定律，觉得别人都是傻逼的，往往自己才是最傻逼的一个\n第三定律，收割傻逼的会被傻逼们封神，试图唤醒傻逼的是傻逼眼中的傻逼\n第四定律，热衷于证明傻逼是傻逼的，自己也是傻逼\n第五定律，永远不要认为事实会教育傻逼，因为他们对事实的解读方式和你不一样\n第六定律，过度强调团体荣誉的往往也是极度自卑的体现，要用团体的强大幻象掩盖自己的虚弱本质\n愚蠢的社会 低估社会上愚蠢的数量 每个人都会愚蠢的时候 损人不利已是愚蠢的共性 重复别人的愚蠢 大部分会低估愚蠢的破坏力 蠢货，是最危险的一类人 愚蠢来源 自己 他人 环境与系统 应对愚蠢 自己 保持敬畏之心 保持怀疑，大胆假设，小心求证 不断学习，不断反思 提高自己的圈子水平或者加入高一档水平的圈子 敢于接受错误与事实 他人 不要试图改变他人 远离这些愚蠢的人 对这些愚蠢的人的行为建立防火墙 发现自己与愚蠢的人有一些合作，要学会主动止损 环境与系统 危邦不入,乱邦不居,天下有道则入,无道则隐 如果一个系统出了问题，不要心存侥幸，逃离系统是最好的选择 如果制度出了问题，不要对未来抱有侥幸，时间会给出最坏的结果 ","permalink":"https://myself659.github.io/post/rt/stupid-foolish-is-dangerous-enemy/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e今天是愚人节。愚人是今天大部分人的例行活动。这里不列举各种愚人的活动，只谈一下这些愚人活动的意义。\n在我看来，这些愚人活动有以下作用：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e大部分愚人活动提供了一些幽默\u003c/li\u003e\n\u003cli\u003e提供教育价值，让大部分了解一些骗人的方法与形式\u003c/li\u003e\n\u003cli\u003e测试一下哪些人容易被骗\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"愚蠢的人与社会\"\u003e愚蠢的人与社会\u003c/h2\u003e\n\u003ch3 id=\"愚蠢的人\"\u003e愚蠢的人\u003c/h3\u003e\n\u003cp\u003e对于愚蠢的人caoz总结下面的六大定律：\u003c/p\u003e","title":"愚蠢：危险的敌人"},{"content":" 前言 随着数据量的激增，存储系统在现代互联网架构中变得越来越重要。谷歌的Colossus是Google File System（GFS）后继的下一代分布式存储系统，旨在处理更加庞大、复杂的数据存储需求。Colossus不仅为谷歌提供更强大的存储解决方案，还为现代大规模数据存储技术树立了标杆。它是谷歌构建云计算平台和大数据处理架构的核心支柱之一。\n定义 Colossus是谷歌设计的一种分布式存储系统，主要用于替代Google File System（GFS）。其设计目标是更好地处理数据存储的复杂性、提升性能、简化扩展，并提高容错能力和存储效率。\nWiki定义：\n\u0026ldquo;Colossus is a next-generation distributed file system built by Google to improve upon the capabilities and performance of Google File System (GFS).\u0026rdquo;\n工作原理 Colossus依然采用了分布式存储的架构思想，但相比GFS，其在以下几个方面进行了优化和增强：\n数据分布与副本管理：\nColossus继续采用数据分块存储的方式，并且每个块有多个副本。不同于GFS，Colossus引入了更加智能的副本管理机制，能够根据需求动态调整副本的分布。 增强的元数据管理：\nColossus将元数据存储分散到多个节点中，通过强一致性协议确保高效的数据访问，并提供低延迟的元数据检索。 高效的容错机制：\n在硬件故障发生时，Colossus能够快速恢复数据，并自动重新分配副本。该机制比GFS的副本重建更加高效。 优化的存储策略：\n相较于GFS的64MB块大小，Colossus对存储策略进行了优化，支持多种块大小的灵活选择，适应不同规模的数据存储需求。 高吞吐量设计：\nColossus针对大规模数据存储和访问进行了吞吐量优化，特别适用于大数据分析、机器学习和深度学习训练等场景。 属性与指标 关注Colossus属性与指标如下：\n块大小（Block Size）：\nColossus灵活支持不同大小的存储块，可以根据具体应用场景选择最优块大小，以提高存储效率和数据访问速度。 副本数与副本管理（Replication and Replica Management）：\nColossus采用更加智能的副本调度系统，副本数可以动态调整，以应对不同的存储需求。 存储扩展性（Scalability）：\n由于其分布式架构，Colossus支持大规模的横向扩展，能够容纳数十亿的文件和PB级别的数据。 容错性（Fault Tolerance）：\nColossus提供强大的容错机制，系统可以在单个或多个节点发生故障时，依然保持高可用性并迅速恢复。 低延迟访问（Low Latency Access）：\nColossus优化了对元数据的访问方式，减少了延迟，提高了用户和应用程序的响应速度。 强一致性（Strong Consistency）：\nColossus在数据的一致性上提供了强一致性保障，确保数据访问时的一致性和准确性。 动态负载均衡（Dynamic Load Balancing）：\nColossus能够根据节点的负载情况自动进行负载均衡，确保系统的高效运转。 类型 存储架构 Colossus的存储架构主要分为以下几类：\n数据块（Data Blocks）：\n文件在Colossus中被分割成多个数据块，每个块的大小可以根据需求动态调整。 元数据（Metadata）：\n元数据包含文件的信息（如文件名、大小、访问权限等），这些元数据被分散存储在多个节点中，保证高可用性和一致性。 副本（Replica）：\n数据块的副本存储在不同的节点上，默认副本数为3，通过智能副本调度保证数据的高可靠性。 存储策略 Colossus的存储策略包括以下几类：\n数据分块（Data Chunking）：\n数据分块后，每个块在集群中以副本的形式存储。Colossus采用灵活的块大小策略，不同的块可以有不同的存储方案。 动态副本管理（Dynamic Replica Management）：\nColossus根据负载和存储需求动态调整数据块的副本数和存储位置，以提高存储效率和容错能力。 自动负载均衡（Automatic Load Balancing）：\nColossus采用智能算法自动进行负载均衡，动态调整节点之间的数据分布和负载分配，防止某些节点成为瓶颈。 多级缓存（Multi-tier Caching）：\nColossus在数据访问层面支持多级缓存，将热数据存储在高速缓存中，减少对磁盘的访问，提升系统性能。 高可用性与容错机制 Colossus的高可用性与容错机制包括以下几个特点：\n副本策略：\n每个数据块有多个副本，副本会被分布到不同的存储节点上。在节点出现故障时，系统会自动从其他副本中恢复数据。 故障恢复：\nColossus采用快速故障恢复机制，当系统检测到故障时，会立刻启动副本恢复，确保数据的高可用性。 实时监控与健康检查：\nColossus集成了健康检查和实时监控系统，监控每个节点和块的健康状态，确保系统的高可用性。 类似Colossus产品 Colossus是Google内部使用的存储系统，但其设计思想为现代分布式存储系统的建设提供了宝贵的参考。以下是几个基于类似设计理念的存储系统产品：\nHadoop Distributed File System (HDFS)：\nHDFS是Apache Hadoop的分布式文件系统，广泛用于大数据存储和分析。HDFS借鉴了GFS和Colossus的设计理念。 Ceph：\nCeph是一个开源的分布式存储系统，支持文件存储、块存储和对象存储。它采用了类似Colossus的分布式架构，具备高可用性和强扩展性。 Amazon S3：\n亚马逊的对象存储服务，虽然S3并非传统意义上的文件系统，但其分布式架构和可扩展性与Colossus在设计理念上有诸多相似之处。 Google Cloud Storage：\nGoogle Cloud Storage基于Colossus的设计，提供了强大的数据存储、访问和管理能力，支持海量数据存储需求。 总结 Colossus是谷歌为满足日益增长的数据存储需求而设计的下一代分布式文件系统。相比GFS，Colossus在性能、扩展性、容错性和存储效率上做出了显著改进。它为大数据处理、云计算平台以及各种高吞吐量、大规模存储场景提供了强大的支撑，是现代分布式存储技术的一个重要里程碑。\n","permalink":"https://myself659.github.io/post/distributed/colossus-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e随着数据量的激增，存储系统在现代互联网架构中变得越来越重要。谷歌的Colossus是Google File System（GFS）后继的下一代分布式存储系统，旨在处理更加庞大、复杂的数据存储需求。Colossus不仅为谷歌提供更强大的存储解决方案，还为现代大规模数据存储技术树立了标杆。它是谷歌构建云计算平台和大数据处理架构的核心支柱之一。\u003c/p\u003e","title":"colossus 101"},{"content":"前言 人们常说：\n问题的背后常常隐藏了机会。\n那么什么样的问题背后有大机会呢？或者隐藏大机会的问题有哪些特征？\n下面个人谈一个自己对这个问题一些思考与看法。\n问题特征 隐藏大机会的问题个人认为往往有以下特征：\n高频的问题 重要的问题 紧急的问题 未能得到解决的问题 范式变化带来的问题 解决之后会带来正反馈的问题 典型的例子，就是互联网技术发展与应用，这一范式变化带来的问题，如搜索，电商，及时通信的问题。\n机会 满足上面特征的问题不少，但是这些问题并不都是你的机会。是不是你的机会取决于你能否解决问题，并且在解决问题所有方案里面具有竞争力？\n解决问题就是把握机会。\n为市场解决的问题越大，机会越大。\n解决问题一定要与自己能力，资源相结合，这样才能把握机会。\n","permalink":"https://myself659.github.io/post/rt/chances-from-what-problem/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e人们常说：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e问题的背后常常隐藏了机会。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e那么什么样的问题背后有大机会呢？或者隐藏大机会的问题有哪些特征？\u003c/p\u003e\n\u003cp\u003e下面个人谈一个自己对这个问题一些思考与看法。\u003c/p\u003e\n\u003ch2 id=\"问题特征\"\u003e问题特征\u003c/h2\u003e\n\u003cp\u003e隐藏大机会的问题个人认为往往有以下特征：\u003c/p\u003e","title":"什么样的问题背后有大机会呢？"},{"content":"背景 数据是资产。\n数据是生产资料。\n品质 为了避免与物理的质量概念相互混淆，这里使用品质。\n数据的品质是对数据价值的一种分析与评估。\n品质分类 内在品质 Accuracy (准确性)\nPrecision (精确性)\nConsistency (一致性)\nObjectivity (客观性)\nBelievability (可信度)\nDuplication (重复性)\nIntegrity (健全性)\n情境品质 Completeness (完整性)\nCoverage (覆盖度)\nTimeliness (及时性)\nConformity（规范性）\n可用性品质 Accessability (可访问性)\nInterpretability (可解释性)\nUsability (可用性)\n","permalink":"https://myself659.github.io/post/data/data-quality/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e数据是资产。\u003c/p\u003e\n\u003cp\u003e数据是生产资料。\u003c/p\u003e\n\u003ch2 id=\"品质\"\u003e品质\u003c/h2\u003e\n\u003cp\u003e为了避免与物理的质量概念相互混淆，这里使用品质。\u003c/p\u003e\n\u003cp\u003e数据的品质是对数据价值的一种分析与评估。\u003c/p\u003e\n\u003ch2 id=\"品质分类\"\u003e品质分类\u003c/h2\u003e\n\u003ch3 id=\"内在品质\"\u003e内在品质\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eAccuracy (准确性)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePrecision (精确性)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eConsistency (一致性)\u003c/p\u003e","title":"数据的品质属性"},{"content":"背景 数据是资产。\n数据是生产资料。\n操作分类 可以从以下角度进行分类：\n生命周期维度 Gathering\nCreating\nDropping\nResetting\nRecovering\n处理维度 Manipulating\nCopying\nReplicating\nMining\nExtracting\nCleaning\nSemantic\nCategory\n管理维度 Logging\nMonitoring\nTesting\nConfiguring\nGovernance\n应用 Deploying\nRollbacking\nSending\nDisplaying\nStoring\n总结 以上分类基于数据的生命周期、处理、管理、应用等维度展开。\n","permalink":"https://myself659.github.io/post/data/data-op/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e数据是资产。\u003c/p\u003e\n\u003cp\u003e数据是生产资料。\u003c/p\u003e\n\u003ch2 id=\"操作分类\"\u003e操作分类\u003c/h2\u003e\n\u003cp\u003e可以从以下角度进行分类：\u003c/p\u003e\n\u003ch3 id=\"生命周期维度\"\u003e生命周期维度\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eGathering\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCreating\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDropping\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eResetting\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRecovering\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"处理维度\"\u003e处理维度\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eManipulating\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCopying\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReplicating\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMining\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eExtracting\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCleaning\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSemantic\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCategory\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"管理维度\"\u003e管理维度\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLogging\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMonitoring\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTesting\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eConfiguring\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGovernance\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"应用\"\u003e应用\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eDeploying\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRollbacking\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSending\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDisplaying\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eStoring\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"总结\"\u003e总结\u003c/h2\u003e\n\u003cp\u003e以上分类基于数据的生命周期、处理、管理、应用等维度展开。\u003c/p\u003e","title":"数据的操作"},{"content":"Option 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 // To inner type unwrap () -\u0026gt; T unwrap_or (T) -\u0026gt; T unwrap_or_else (() -\u0026gt; T) -\u0026gt; T unwrap_or_default () -\u0026gt; T where T: Default expect (\u0026amp;str) -\u0026gt; T //Converting to another type map ((T) -\u0026gt; U) -\u0026gt; Option\u0026lt;U\u0026gt; map_or (U, (T) -\u0026gt; U) -\u0026gt; U map_or_else (() -\u0026gt; U, (T) -\u0026gt; U) -\u0026gt; U // To Result ok_or (E) -\u0026gt; Result\u0026lt;T, E\u0026gt; ok_or_else (() -\u0026gt; E) -\u0026gt; Result\u0026lt;T, E\u0026gt; //Conditioning filter ((\u0026amp;T) -\u0026gt; bool) -\u0026gt; Option\u0026lt;T\u0026gt; and (Option\u0026lt;U\u0026gt;) -\u0026gt; Option\u0026lt;U\u0026gt; and_then ((T) -\u0026gt; Option\u0026lt;U\u0026gt;) -\u0026gt; Option\u0026lt;U\u0026gt; or (Option\u0026lt;T\u0026gt;) -\u0026gt; Option\u0026lt;T\u0026gt; or_else (() -\u0026gt; Option\u0026lt;T\u0026gt;) -\u0026gt; Option\u0026lt;T\u0026gt; xor (Option\u0026lt;T\u0026gt;) -\u0026gt; Option\u0026lt;T\u0026gt; Option\u0026lt;\u0026amp;T\u0026gt; 1 2 3 // Cloning inner cloned () -\u0026gt; Option\u0026lt;T\u0026gt; where T: Clone copied () -\u0026gt; Option\u0026lt;T\u0026gt; where T: Copy Option\u0026lt; Option \u0026gt; 1 flatten () -\u0026gt; Option\u0026lt;T\u0026gt; Option\u0026lt; Result\u0026lt;T, E\u0026gt; \u0026gt; 1 transpose () -\u0026gt; Result\u0026lt;Option\u0026lt;T\u0026gt;, E\u0026gt; \u0026amp;Option 1 2 3 4 5 6 7 8 // Checking inner is_some () -\u0026gt; bool is_none () -\u0026gt; bool //To inner reference as_ref () -\u0026gt; Option\u0026lt;\u0026amp;T\u0026gt; iter () -\u0026gt; Iterator\u0026lt;\u0026amp;T\u0026gt; as_deref () -\u0026gt; Option\u0026lt;\u0026amp;U\u0026gt; where T: Deref\u0026lt;Target = U\u0026gt; ","permalink":"https://myself659.github.io/post/rust/rust-type-cheat-sheet/","summary":"\u003ch2 id=\"option\"\u003eOption\u003c!-- raw HTML omitted --\u003e\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// To inner type\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eunwrap () -\u0026gt; T\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eunwrap_or (T) -\u0026gt; T\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eunwrap_or_else (() -\u0026gt; T) -\u0026gt; T\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eunwrap_or_default () -\u0026gt; T where T: Default\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eexpect (\u0026amp;str) -\u0026gt; T\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e//Converting to another type\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emap ((T) -\u0026gt; U) -\u0026gt; Option\u0026lt;U\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emap_or (U, (T) -\u0026gt; U) -\u0026gt; U\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emap_or_else (() -\u0026gt; U, (T) -\u0026gt; U) -\u0026gt; U\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// To Result\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eok_or (E) -\u0026gt; Result\u0026lt;T, E\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eok_or_else (() -\u0026gt; E) -\u0026gt; Result\u0026lt;T, E\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e//Conditioning\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efilter ((\u0026amp;T) -\u0026gt; bool) -\u0026gt; Option\u0026lt;T\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eand (Option\u0026lt;U\u0026gt;) -\u0026gt; Option\u0026lt;U\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eand_then ((T) -\u0026gt; Option\u0026lt;U\u0026gt;) -\u0026gt; Option\u0026lt;U\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eor (Option\u0026lt;T\u0026gt;) -\u0026gt; Option\u0026lt;T\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eor_else (() -\u0026gt; Option\u0026lt;T\u0026gt;) -\u0026gt; Option\u0026lt;T\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003exor (Option\u0026lt;T\u0026gt;) -\u0026gt; Option\u0026lt;T\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"optiont\"\u003eOption\u0026lt;\u0026amp;T\u0026gt;\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Cloning inner\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecloned () -\u0026gt; Option\u0026lt;T\u0026gt; where T: Clone\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecopied () -\u0026gt; Option\u0026lt;T\u0026gt; where T: Copy\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"option-option-\"\u003eOption\u0026lt; Option\u003c!-- raw HTML omitted --\u003e \u0026gt;\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eflatten () -\u0026gt; Option\u0026lt;T\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"option-resultt-e-\"\u003eOption\u0026lt; Result\u0026lt;T, E\u0026gt; \u0026gt;\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etranspose () -\u0026gt; Result\u0026lt;Option\u0026lt;T\u0026gt;, E\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"option-1\"\u003e\u0026amp;Option\u003c!-- raw HTML omitted --\u003e\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Checking inner\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eis_some () -\u0026gt; bool\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eis_none () -\u0026gt; bool\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e//To inner reference\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eas_ref () -\u0026gt; Option\u0026lt;\u0026amp;T\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eiter () -\u0026gt; Iterator\u0026lt;\u0026amp;T\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eas_deref () -\u0026gt; Option\u0026lt;\u0026amp;U\u0026gt;  where T: Deref\u0026lt;Target = U\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"rust type cheat sheet "},{"content":"typeof for C c语言的typeof的应用：\n1 2 3 #define SWAP(a, b) do { \\ typeof(a) tmp = a; b = a; a = tmp; \\ } while(0) 1 2 3 4 5 #define offsetof(TYPE, MEMBER) ((size_t) \u0026amp;((TYPE *)0)-\u0026gt;MEMBER) #define container_of(ptr, type, member) ({ \\ const typeof( ((type *)0)-\u0026gt;member ) *__mptr = (ptr); \\ (type *)( (char *)__mptr - offsetof(type,member) );}) typeof for rust 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 use std::any::type_name; fn type_of\u0026lt;T\u0026gt;(_: T) -\u0026gt; \u0026amp;\u0026#39;static str { type_name::\u0026lt;T\u0026gt;() } fn main() { let x = 21; let y = 2.5; println!(\u0026#34;{}\u0026#34;, type_of(\u0026amp;y)); println!(\u0026#34;{}\u0026#34;, type_of(x)); println!(\u0026#34;{}\u0026#34;, type_of(\u0026#34;abc\u0026#34;)); println!(\u0026#34;{}\u0026#34;, type_of(String::from(\u0026#34;abc\u0026#34;))); println!(\u0026#34;{}\u0026#34;, type_of(vec![1, 2, 3])); println!(\u0026#34;{}\u0026#34;, type_of(main)); println!(\u0026#34;{}\u0026#34;, type_of(\u0026amp;type_of::\u0026lt;i32\u0026gt;)); } ","permalink":"https://myself659.github.io/post/rust/rust-type-of/","summary":"\u003ch2 id=\"typeof-for-c\"\u003etypeof for C\u003c/h2\u003e\n\u003cp\u003ec语言的typeof的应用：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#define SWAP(a, b) do { \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etypeof(a) tmp = a; b = a; a = tmp; \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e} while(0)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#define offsetof(TYPE, MEMBER) ((size_t) \u0026amp;((TYPE *)0)-\u0026gt;MEMBER)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#define container_of(ptr, type, member) ({                      \\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"nb\"\u003etypeof\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003emember\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003e__mptr\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eptr\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e    \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)(\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003e__mptr\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eoffsetof\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003emember\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e);})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"typeof-for-rust\"\u003etypeof for rust\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euse std::any::type_name;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efn type_of\u0026lt;T\u0026gt;(_: T) -\u0026gt; \u0026amp;\u0026#39;static str {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    type_name::\u0026lt;T\u0026gt;()\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efn main() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let x = 21;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let y = 2.5;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;{}\u0026#34;, type_of(\u0026amp;y));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;{}\u0026#34;, type_of(x));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;{}\u0026#34;, type_of(\u0026#34;abc\u0026#34;));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;{}\u0026#34;, type_of(String::from(\u0026#34;abc\u0026#34;)));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;{}\u0026#34;, type_of(vec![1, 2, 3]));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;{}\u0026#34;, type_of(main));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;{}\u0026#34;, type_of(\u0026amp;type_of::\u0026lt;i32\u0026gt;));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"typeof for Rust "},{"content":"背景 最近发现一个很好用的系统监控命令：btop。 btop一站式实时显示cpu，memory，disk，network，processes的统计信息。\ninstall 具体参考Installation\npanels btop默认有5个显示面板（panels）。每个面板都有一个对应控制命令：\n1： 打开或关闭cpu面板\n2： 打开或关闭memory面板\n3： 打开或关闭disk面板\n4： 打开或关闭network面板\n5： 打开或关闭processes面板\n具体如下图所示： 命令 打开btop，输入h会提出示相关命令的提示。\n个性化 从github下载主题放到$HOME/.config/btop/themes。\n(end)\n","permalink":"https://myself659.github.io/post/linux/linux-btop/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e最近发现一个很好用的系统监控命令：btop。 btop一站式实时显示cpu，memory，disk，network，processes的统计信息。\u003c/p\u003e","title":"linux btop 101"},{"content":"资料 The Rust Programming Language Rust Language Cheat Sheet Zero to Production in Rust This Week in Rust awesome-rust awesome-cli-rust tools and libaries cargo-asm A cargo subcommand that displays the generated assembly of Rust source code. cargo-fuzz A cargo subcommand for fuzzing with libFuzzer hyperfine A command-line benchmarking tool flamegraph sqlx yarte opentelemetry thiserror rust-clippy Serde Tokio Rocketi Rocket Diesel Rayon Actix Hyper Anyhow Thiserror PyO3 Rkyv 心法 保持耐心，不要心急，毕竟rust学习曲线陡峭 编译器是最好的老师，同时记住编译器永远是正确的 克服传统语言的思维定势，建立新思维模型如资源与变量分离，同时尝试整合范型编程，类型编程，函数式编程，异步编程，meta-programming 从简单开始，从基础开始 深入从rust内存管理原理开始，扩展到多线程与异步环境 学以致用，可以用rust做一些个人的项目 ","permalink":"https://myself659.github.io/post/rust/tips-learn-rust/","summary":"\u003ch2 id=\"资料\"\u003e资料\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://doc.rust-lang.org/book/\"\u003eThe Rust Programming Language\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://cheats.rs/\"\u003eRust Language Cheat Sheet\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.zero2prod.com/index.html\"\u003eZero to Production in Rust\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://this-week-in-rust.org/\"\u003eThis Week in Rust\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/awesome-rust-com/awesome-rust\"\u003eawesome-rust\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matu3ba/awesome-cli-rust\"\u003eawesome-cli-rust\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"tools-and-libaries\"\u003etools and libaries\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://crates.io/crates/cargo-asm\"\u003ecargo-asm A cargo subcommand that displays the generated assembly of Rust source code.\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://crates.io/crates/cargo-fuzz\"\u003ecargo-fuzz A \u003ccode\u003ecargo\u003c/code\u003e subcommand for fuzzing with \u003ccode\u003elibFuzzer\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://crates.io/crates/hyperfine\"\u003ehyperfine A command-line benchmarking tool\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://crates.io/crates/flamegraph\"\u003eflamegraph\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://crates.io/crates/sqlx\"\u003esqlx\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://crates.io/crates/yarte\"\u003eyarte\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.rs/opentelemetry/latest/opentelemetry/\"\u003eopentelemetry\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.rs/thiserror/latest/thiserror/\"\u003ethiserror\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/rust-lang/rust-clippy\"\u003erust-clippy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://serde.rs/\"\u003eSerde\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://tokio.rs/\"\u003eTokio\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://tokio.rs/\"\u003eRocketi\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://rocket.rs/\"\u003eRocket\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://diesel.rs/\"\u003eDiesel\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/rayon-rs/rayon\"\u003eRayon\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/actix/actix\"\u003eActix\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hyperium/hyper\"\u003eHyper\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.rs/anyhow/1.0.48/anyhow/\"\u003eAnyhow\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.rs/thiserror/1.0.31/thiserror/\"\u003eThiserror\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/PyO3/pyo3\"\u003ePyO3\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djkoloski/rkyv\"\u003eRkyv\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"心法\"\u003e心法\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e保持耐心，不要心急，毕竟rust学习曲线陡峭\u003c/li\u003e\n\u003cli\u003e编译器是最好的老师，同时记住编译器永远是正确的\u003c/li\u003e\n\u003cli\u003e克服传统语言的思维定势，建立新思维模型如资源与变量分离，同时尝试整合范型编程，类型编程，函数式编程，异步编程，meta-programming\u003c/li\u003e\n\u003cli\u003e从简单开始，从基础开始\u003c/li\u003e\n\u003cli\u003e深入从rust内存管理原理开始，扩展到多线程与异步环境\u003c/li\u003e\n\u003cli\u003e学以致用，可以用rust做一些个人的项目\u003c/li\u003e\n\u003c/ol\u003e","title":"tips for learning rust"},{"content":"define the tree structure 1 2 3 4 5 6 #[derive(PartialEq)] struct TreeNode\u0026lt;T\u0026gt; { pub value: Option\u0026lt;T\u0026gt;, pub children: Vec\u0026lt;Rc\u0026lt;RefCell\u0026lt;TreeNode\u0026lt;T\u0026gt;\u0026gt;\u0026gt;\u0026gt;, pub parent: Option\u0026lt;Rc\u0026lt;RefCell\u0026lt;TreeNode\u0026lt;T\u0026gt;\u0026gt;\u0026gt;\u0026gt;, } new tree 1 2 3 4 5 6 7 pub fn new() -\u0026gt; TreeNode\u0026lt;T\u0026gt; { TreeNode { value: None, children: vec![], parent: None, } } add_child 1 2 3 pub fn add_child(\u0026amp;mut self, new_node: Rc\u0026lt;RefCell\u0026lt;TreeNode\u0026lt;T\u0026gt;\u0026gt;\u0026gt;) { self.children.push(new_node); } del_child 1 2 3 4 pub fn del_child(\u0026amp;mut self, node_to_remove: Rc\u0026lt;RefCell\u0026lt;TreeNode\u0026lt;T\u0026gt;\u0026gt;\u0026gt;) { self.children .retain(|child| !Rc::ptr_eq(child, \u0026amp;node_to_remove)); } print 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 pub fn print(\u0026amp;self) -\u0026gt; String where T: ToString, { if let Some(ref value) = self.value { value.to_string() } else { String::from(\u0026#34;[\u0026#34;) + \u0026amp;self .children .iter() .map(|tn| tn.borrow().print()) .collect::\u0026lt;Vec\u0026lt;String\u0026gt;\u0026gt;() .join(\u0026#34;,\u0026#34;) + \u0026#34;]\u0026#34; } } code The code as follows:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 use std::cell::RefCell; use std::rc::Rc; #[derive(PartialEq)] struct TreeNode\u0026lt;T\u0026gt; { pub value: Option\u0026lt;T\u0026gt;, pub children: Vec\u0026lt;Rc\u0026lt;RefCell\u0026lt;TreeNode\u0026lt;T\u0026gt;\u0026gt;\u0026gt;\u0026gt;, pub parent: Option\u0026lt;Rc\u0026lt;RefCell\u0026lt;TreeNode\u0026lt;T\u0026gt;\u0026gt;\u0026gt;\u0026gt;, } impl\u0026lt;T\u0026gt; TreeNode\u0026lt;T\u0026gt; { pub fn new() -\u0026gt; TreeNode\u0026lt;T\u0026gt; { TreeNode { value: None, children: vec![], parent: None, } } pub fn add_child(\u0026amp;mut self, new_node: Rc\u0026lt;RefCell\u0026lt;TreeNode\u0026lt;T\u0026gt;\u0026gt;\u0026gt;) { self.children.push(new_node); } pub fn del_child(\u0026amp;mut self, node_to_remove: Rc\u0026lt;RefCell\u0026lt;TreeNode\u0026lt;T\u0026gt;\u0026gt;\u0026gt;) { self.children .retain(|child| !Rc::ptr_eq(child, \u0026amp;node_to_remove)); } pub fn print(\u0026amp;self) -\u0026gt; String where T: ToString, { if let Some(ref value) = self.value { value.to_string() } else { String::from(\u0026#34;[\u0026#34;) + \u0026amp;self .children .iter() .map(|tn| tn.borrow().print()) .collect::\u0026lt;Vec\u0026lt;String\u0026gt;\u0026gt;() .join(\u0026#34;,\u0026#34;) + \u0026#34;]\u0026#34; } } } fn init_tree(s: String) -\u0026gt; Rc\u0026lt;RefCell\u0026lt;TreeNode\u0026lt;u32\u0026gt;\u0026gt;\u0026gt; { let root = Rc::new(RefCell::new(TreeNode::new())); let mut current = Rc::clone(\u0026amp;root); let chars = s.chars().collect::\u0026lt;Vec\u0026lt;char\u0026gt;\u0026gt;(); for (_, c) in chars .iter() .enumerate() .filter(|(idx, _)| *idx \u0026gt; 0 \u0026amp;\u0026amp; *idx + 1 \u0026lt; chars.len()) { if *c == \u0026#39;[\u0026#39; || c.is_numeric() { let child = Rc::new(RefCell::new(TreeNode::new())); current.borrow_mut().children.push(Rc::clone(\u0026amp;child)); { let mut mut_child = child.borrow_mut(); mut_child.parent = Some(Rc::clone(\u0026amp;current)); if c.is_numeric() { mut_child.value = c.to_digit(10); } } current = child; } else if *c == \u0026#39;,\u0026#39; || *c == \u0026#39;]\u0026#39; { let current_clone = Rc::clone(\u0026amp;current); current = Rc::clone(current_clone.borrow().parent.as_ref().unwrap()); } else { panic!(\u0026#34;Unknown character: {}\u0026#34;, c); } } root } #[cfg(test)] mod tests { use super::*; #[test] fn test_init_tree_1() { let tree = init_tree(String::from(\u0026#34;[1,2]\u0026#34;)); assert_eq!(tree.borrow().children[0].borrow().value.unwrap(), 1); } #[test] fn test_init_tree_2() { let tree = init_tree(String::from(\u0026#34;[1,2]\u0026#34;)); assert_eq!(tree.borrow().children[1].borrow().value.unwrap(), 2); } #[test] fn test_init_tree_3() { let tree = init_tree(String::from(\u0026#34;[0,1,[3,4,5,[7,8]],2]\u0026#34;)); assert_eq!(tree.borrow().print(), \u0026#34;[0,1,[3,4,5,[7,8]],2]\u0026#34;); } #[test] fn test_add_child() { let tree = init_tree(String::from(\u0026#34;[0,1,[3,4,5,[7,8]],2]\u0026#34;)); let new_node = Rc::new(RefCell::new(TreeNode::new())); new_node.borrow_mut().value = Some(9); let child = \u0026amp;tree.borrow().children[2]; child.borrow_mut().add_child(new_node); assert_eq!(tree.borrow().print(), \u0026#34;[0,1,[3,4,5,[7,8],9],2]\u0026#34;); } #[test] fn test_del_child() { let tree = init_tree(String::from(\u0026#34;[0,1,[3,4,5,[7,8]],2]\u0026#34;)); let child_to_remove = Rc::clone(\u0026amp;tree.borrow().children[2].borrow().children[2]); tree.borrow_mut().children[2] .borrow_mut() .del_child(child_to_remove); assert_eq!(tree.borrow().print(), \u0026#34;[0,1,[3,4,[7,8]],2]\u0026#34;); } } ","permalink":"https://myself659.github.io/post/rust/rust-tree-demo/","summary":"\u003ch2 id=\"define-the-tree-structure\"\u003edefine the tree structure\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#[derive(PartialEq)]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003estruct TreeNode\u0026lt;T\u0026gt; {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    pub value: Option\u0026lt;T\u0026gt;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    pub children: Vec\u0026lt;Rc\u0026lt;RefCell\u0026lt;TreeNode\u0026lt;T\u0026gt;\u0026gt;\u0026gt;\u0026gt;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    pub parent: Option\u0026lt;Rc\u0026lt;RefCell\u0026lt;TreeNode\u0026lt;T\u0026gt;\u0026gt;\u0026gt;\u0026gt;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"new-tree\"\u003enew tree\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e pub fn new() -\u0026gt; TreeNode\u0026lt;T\u0026gt; {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        TreeNode {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            value: None,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            children: vec![],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            parent: None,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"add_child\"\u003eadd_child\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    pub fn add_child(\u0026amp;mut self, new_node: Rc\u0026lt;RefCell\u0026lt;TreeNode\u0026lt;T\u0026gt;\u0026gt;\u0026gt;) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        self.children.push(new_node);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"del_child\"\u003edel_child\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    pub fn del_child(\u0026amp;mut self, node_to_remove: Rc\u0026lt;RefCell\u0026lt;TreeNode\u0026lt;T\u0026gt;\u0026gt;\u0026gt;) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        self.children\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            .retain(|child| !Rc::ptr_eq(child, \u0026amp;node_to_remove));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"print\"\u003eprint\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epub fn print(\u0026amp;self) -\u0026gt; String\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    where\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        T: ToString,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if let Some(ref value) = self.value {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            value.to_string()\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        } else {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            String::from(\u0026#34;[\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                + \u0026amp;self\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    .children\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    .iter()\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    .map(|tn| tn.borrow().print())\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    .collect::\u0026lt;Vec\u0026lt;String\u0026gt;\u0026gt;()\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    .join(\u0026#34;,\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                + \u0026#34;]\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"code\"\u003ecode\u003c/h2\u003e\n\u003cp\u003eThe code as follows:\u003c/p\u003e","title":"writing a tree in rust"},{"content":"说明 公式推导基于uniswap v2，不适用于uniswap v3。\n非永久性损失 用户为流动性池提供流动性时，由于交易对价格变化使池内的交易对的代币数量发生变化，相比较于不参加提供流动性的情况下，这种变化会导致用户资产有一定的损失，而这种损失被称为非永久性损失（国内很多人将其称为无常损失）。\nCFMM的原则 uniswap v2是典型的Const Product Market Maker。其遵守以下三条原则：\n交易对（x,y）流动性池内的两种资产价值永远视为相等，v(x) = v(y) 改变流动性池的k值，保证价格不变, p(x) = y/x 交易的时候k值不变,k = x*y 推导 0. 说明 在公式推导过程中，以y对应的token为币本位，或者说以y对应的token作为计价单位。 不考虑交易费用收入与流动性挖矿收入等任何收入 1. 引入原则 上面CFMM的原则是进行无常公式推导的基础。具体公式如下：\n2. 推导x与y 用p(x)与k来表示x与y，方便后面的替换。 3. 定义非永久性损失 首先确定因变量r，然后确定holder及流通性提供者的价值计算公式，最后根据定义得到非永久性损失的定义公式。\n4. 推导非永久性损失与价格变化倍数之间的关系 前面提到以y对应的token作为计价单位，那么就假设y对应的token在任何时间价格都不变，永远为1.\n具体过程如下： 5. 可视化 利用mania对公式进行可视化，具体如下： ","permalink":"https://myself659.github.io/post/blockchain/uniswap-impermanent-loss-formula/","summary":"\u003ch2 id=\"说明\"\u003e说明\u003c/h2\u003e\n\u003cp\u003e公式推导基于uniswap v2，不适用于uniswap v3。\u003c/p\u003e\n\u003ch2 id=\"非永久性损失\"\u003e非永久性损失\u003c/h2\u003e\n\u003cp\u003e用户为流动性池提供流动性时，由于交易对价格变化使池内的交易对的代币数量发生变化，相比较于不参加提供流动性的情况下，这种变化会导致用户资产有一定的损失，而这种损失被称为非永久性损失（国内很多人将其称为无常损失）。\u003c/p\u003e","title":"uniswap的非永久性损失公式的推导"},{"content":"Error 1 2 3 4 5 6 7 \\node_modules\\web3-eth-ens\\lib\\ENS.js:482 throw new Error(\u0026#34;ENS is not supported on network \u0026#34; + networkType); ^ Error: ENS is not supported on network private at ENS.checkNetwork (\\node_modules\\web3-eth-ens\\lib\\ENS.js:482:19) at processTicksAndRejections (node:internal/process/task_queues:96:5) 原因 将web3实例作为参数，误传给函数，导致web3实例对应的内存被踩，后面使用该web3实例导致出现上面的问题。\n（end）\n","permalink":"https://myself659.github.io/post/blockchain/web3js-ens-error/","summary":"\u003ch2 id=\"error\"\u003eError\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\node_modules\\web3-eth-ens\\lib\\ENS.js:482\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            throw new Error(\u0026#34;ENS is not supported on network \u0026#34; + networkType);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                  ^\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eError: ENS is not supported on network private\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    at ENS.checkNetwork (\\node_modules\\web3-eth-ens\\lib\\ENS.js:482:19)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    at processTicksAndRejections (node:internal/process/task_queues:96:5) \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"原因\"\u003e原因\u003c/h2\u003e\n\u003cp\u003e将web3实例作为参数，误传给函数，导致web3实例对应的内存被踩，后面使用该web3实例导致出现上面的问题。\u003c/p\u003e","title":"Error: ENS is not supported on network private"},{"content":"DeBank DeBank 是一款DeFi资产跟踪和投资组合管理工具。\n优点：\n支持多链 不仅支持链上帐户资产也支持TVL资产 支持多种协议 支持帐号approve风险提示 缺点：\n新协议支持速度慢 vFat Tools vFat Tools为defi农民提供挖矿分析，收益计算，数据面板等服务。\n优点：\n免费 界面简洁 提供了收益与池子详细信息 基本支持主流兼容evm的公链及其对应的yield farming项目 实时数据 缺点：\n不支持过滤无关的池子 不支持对池子的分析 不支持图表展示 Defi Pulse Defi Pulse 提供了以太坊上各种defi项目TLV数据。\n优点：\n提供项目TVL的排名 提供了以太坊总体TVL的变化情况 缺点：\n数据更新速度慢 不支持跨链TVL DeFi Llama DeFi Llama\n优点：\n支持多链 支持分类别查看如DEX, lending, yield, insurance, option等 数据丰富，如支持1h，7天的TLV变动数据 缺点：\n缺少对外api服务 Dune Analytics Dune Analytics支持对链上原始数据进行SQL级别的分析与展示。\n优点：\n支持个性化的查询链上数据并图表化 支持SQL 支持模板 内置可视化功能 缺点：\n用户技能要求较高如理解原始数据与SQL，不适合新手 Revert Finance Revert Finance面向DEX流动性提供者的分析工具。\n优点：\n流动性挖矿数据详细（gas费用，收益） 支持历史流动性数据分析 无常损失分析 缺点：\n只支持uniswap与sushi APY Vision APY Vision 是一款流动性挖矿分析与图表工具。\n优点：\n无常损失与持有对比分析 缺点：\n收费，免费功能单一 不支持历史数据分析 Token Terminal Token Terminal是去中心化版本的Bloomberg Terminal。\n优点：\n丰富的数据指标 每4个小时更新数据 提供API服务 缺点：\nAPI收费且不便宜 dappradar dappradar提供dapp的用户数（DAU,MAU等）等一系列反应dapp基本面的数据。\nLunarCrush LunarCrush可以跟踪加密货币在社交网络的活跃度。\ndexscreener dexscreener支持多链的dex dashboard。\ngeckoterminal geckoterminal支持多链的dex dashboard。\ndextools dextools是集数据，dashboard，交易的于一体的且支持多链的工具。\n","permalink":"https://myself659.github.io/post/blockchain/defi-tools/","summary":"\u003ch2 id=\"debank\"\u003eDeBank\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://debank.com/\"\u003eDeBank\u003c/a\u003e 是一款DeFi资产跟踪和投资组合管理工具。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e优点\u003c/strong\u003e：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e支持多链\u003c/li\u003e\n\u003cli\u003e不仅支持链上帐户资产也支持TVL资产\u003c/li\u003e\n\u003cli\u003e支持多种协议\u003c/li\u003e\n\u003cli\u003e支持帐号approve风险提示\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003e缺点\u003c/strong\u003e：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e新协议支持速度慢\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"vfat-tools\"\u003evFat Tools\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://vfat.tools/\"\u003evFat Tools\u003c/a\u003e为defi农民提供挖矿分析，收益计算，数据面板等服务。\u003c/p\u003e","title":"常用Defi工具与网站"},{"content":"原则 不追求完美\n解决核心问题\n跳出框架，摆脱限制\n从自身，事实，简单开始，多迭代\n","permalink":"https://myself659.github.io/post/rt/%E5%A4%8D%E6%9D%82%E6%80%A7%E5%8E%9F%E5%88%99-complexity/","summary":"\u003ch2 id=\"原则\"\u003e原则\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e不追求完美\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e解决核心问题\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e跳出框架，摆脱限制\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e从自身，事实，简单开始，多迭代\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e","title":"应对复杂性的原则"},{"content":"背景 加密货币历史上几次大跌：\n2017年94事件 2020年312事件 2021年423事件 2021年519事件 每次大跌都验证一句话：币圈一天，人间一年。\n作为这些事件的经历者，说一下自己对519事件一点看法。\n下跌原因 个人认为大跌原因如下：\n美国5月12号公布了美国通胀达到4.2%，超出市场的预期，这是促使美联储不得不提前收紧货币 5月12号Elon Musk宣布由于考虑比特币挖矿对环境的影响，暂停通过bitcoin购买Telsa电动车 5月18号中国禁止金融机构和支付公司为加密货币提供服务 加上从2021年以来加密货币快速上涨，风险也积累比较多，高位离场的资金比较多 上面4点导致下跌成为趋势，下跌过程中由于整个币圈杠杆很高，导致相互踩踏，从而出现一两个小时就狂跌50%的情况 快速恢复原因 这次下跌恢复很快，基本到20号比特币就恢复到40k的关口。\n个人认为有以下原因：\n下跌只是货币收紧信号一个反应，实际上货币供应并没有受到影响，恐慌得到释放 机会都是跌出来，按照历史经验，加密货币每一次大跌都是机会 加密货币在这一年中得到大量的宣传，越来越多的认识到加密货币是资产配置的一个重要选项 影响 牛市就此结束吗？ 个人认为疯牛结束，慢牛开启。这次下跌是对最近一段时间过于疯狂的市场打一针退烧针，清理高杠杆了，减少投机成分，让人们理性认识到市场的残酷，让市场回归到技术与应用。\n","permalink":"https://myself659.github.io/post/blockchain/crypto-519-fall/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e加密货币历史上几次大跌：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e2017年94事件\u003c/li\u003e\n\u003cli\u003e2020年312事件\u003c/li\u003e\n\u003cli\u003e2021年423事件\u003c/li\u003e\n\u003cli\u003e2021年519事件\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e每次大跌都验证一句话：币圈一天，人间一年。\u003c/p\u003e","title":"说说519事件"},{"content":"背景 PoW和PoS作为现在最常用的两大共识算法，PoW与PoS之争已经有多年了。\n下面从去中心化角度来对比两条公链：\n采用PoW的以太坊 采用EPoS的Harmony 以太坊 随着以太坊矿池兴起加上PoW天生容易导致算力集中，以太坊独立挖矿的节点越来越少，出块节点也越来越少，越来越集中，下图就是一个很好的说明。\n从图可知，以太坊前三大矿池的总算力已经超过了51%，这说明只要前三大矿池联合，可以对以太坊发起51%攻击，是威胁以太坊安全的一个不可忽略的隐患。\n注：数据来自Top 25 Miners by Blocks\nEther Supply Growth Chart\nEthereum Supply (I:ES)\nEthereum Supply glassnode\nharmony 我们来看一下采用了EPoS的Harmony。\n首先还是了解一下Harmony：\nHarmony is the first Proof-of-Stake \u0026amp; sharding mainnet. 2-second finality, trustless cross-chain liquidity.\nHarmony是第一个上线PoS并实现分片的公链，其代币是ONE。\n使用了PoS的Harmony去中心化验证节点数量是多少呢？\n从上图可知，参与验证节点数是193，其中114个被选举成为验证节点参与验证与出块。\n注：数据来自harmony validators\n关于harmony的EPoS，更多请参考Harmony公开抵押的官方指南。\n结论 越降低参与门槛，越多节点。 越多节点，越去中心化。 越去中心化，越安全。\n转到pos的eth2.0值得期待，实现分片的eth2.0将会是多链时代的最核心的一条链。\n","permalink":"https://myself659.github.io/post/blockchain/pos-increase-decentralization/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003ePoW和PoS作为现在最常用的两大共识算法，PoW与PoS之争已经有多年了。\u003c/p\u003e\n\u003cp\u003e下面从去中心化角度来对比两条公链：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e采用PoW的以太坊\u003c/li\u003e\n\u003cli\u003e采用EPoS的Harmony\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"以太坊\"\u003e以太坊\u003c/h2\u003e\n\u003cp\u003e随着以太坊矿池兴起加上PoW天生容易导致算力集中，以太坊独立挖矿的节点越来越少，出块节点也越来越少，越来越集中，下图就是一个很好的说明。\u003c/p\u003e","title":"PoS更有利于去中心化"},{"content":"day1 2021年1月16日 星期六 1 There is considerable debate over how we should react if we detect a signal from an alien civilisation. 翻译： 如果我们探测到了来自外星文明的信号，我们应该如何回应是一个备受争议的问题。\nday2 2021年1月17日 星期日 1 The two world wars, which interrupted the supply of raw material from Japan, also stifled the European silk industry. 翻译： 两次世界大战中断了来自日本的原材料供应，同时也抑制了欧洲的丝绸工业。\nday3 2021年1月18日 星期一 1 Migration is a complex issue, and biologists define it differently, depending in part on what sorts of animals they study. 翻译： 迁徙是一个复杂的问题，生物学家对它有不同的定义，部分取决于他们研究的动物种类。\nday4 2021年1月19日 星期二 1 One way is by organising backstage tours, so people can be shown round the building and learn learn how a theatre operates. 翻译： 一种方式是组织后台参观，这样人们就可以参观建筑，了解剧院是如何运作的。\nday5 2021年1月20日 星期三 1 What I am afraid will happen is that books and magazines will all all disappear, and there will just be rows and rows of computers. 翻译： 我担心会发生的是，书和杂志都将消失，剩下的只有一排排电脑。\nday6 2021年1月21日 星期四 1 The psychological laboratory has a strong claim to legitimacy and evokes trust and confidence in those who perform there. 翻译：这个心理学实验室坚决声明拥有合法性并唤起了在那里参与实验的人们的信任和信心。\nday7 2021年1月22日 星期五 1 The displays of art museums serve as a waring of what critical practices can emerge when spontaneous criticism is suppressed. 翻译：艺术博物馆的陈列警示我们当自发的（艺术）批评被压制时会出现何种（艺术）批评。\nday8 2021年1月23日 星期六 1 Vertical farming is an attempt to address the unboubted problems that we face in producing enough food for a growing population. 翻译：垂直农业试图解决我们在为不断增长的人口生产足够粮食 时所面临的不容置疑的问题。\nday9 2021年1月24日 星期日 1 It was not until 1500 BC, however, that the first hollow glass container was made by covering a sand core with a layer of molten glass. 翻译：然而，直到公元前1500年，第一个中空玻璃容器才通过用一层熔融玻璃覆盖砂芯制成。\nday10 2021年1月25日 星期一 1 Many theorists believe the ideal boss should lead from behind, taking pride in collective accomplishment and giving credit where it is due. 翻译：许多理论家认为理想的老板应该在后方指挥，以集体成就为荣，并给予员工应得的荣誉。\nday11 2021年1月26日 星期二 1 Though we might think of film as an essentially visual experience, we relly cannot afford to underestimate the importance of film sound. 翻译:虽然我们可能认为电影本质上是一种视觉体验，但我们真的不能低估电影声音的重要性。\nday12 2021年1月27日 星期三 1 As far as goods transport is concerned, growth is due to a large extent to changes in the European economy and its system of production. 翻译: 就货物运输而言，其增长在很大程度上是由欧洲经济及其生产体系的变化造成的。\nday13 2021年1月28日 星期四 1 In order to track temporal hours during the day, inventors created sundials, which indicate time by the length or direction of the sun\u0026#39;s shadow. 翻译: 为了在白天记录日光时，发明家创造了靠阳光影子的长度或方向来指示时间的日晷。\nday14 2021年1月29日 星期五 1 Lee Hall\u0026#39;s analysis of figures comparing the times of the fires and the proportion of seed that germinated was done in a lot of detail--very impressive. 翻译: 李·霍尔对火灾发生的次数和种子发芽的比例进行了对比和数字分析，他的分析非常详尽——令人印象深刻。\nday15 2021年1月30日 星期六 1 While the Inuit may not actually starve if hunting and trapping are curtailed by climate change, there has certainly been an impact on people\u0026#39;s health. 翻译：如果狩猎和诱捕受到气候变化的限制，因纽特人可能实际上也不会挨饿，但这肯定会对他们的健康产生影响\nday16 2021年1月31日 星期日 1 It would seem that the brain sees these images as puzzles, and the harder it is to decipher the meaning,the more rewarding is the monent of recognition. 翻译：似乎大脑把这些图像看成是拼图，越难解读其中的含义，识别出来时就越令人满意。\nday17 2021年2月1日 星期一 1 Such material, even where it appears comparatively trivial, can have a serious effect on the company, supplier or customer if it falls into the wrong hands. 翻译： 如果这类材料落到坏人手中，即使在看来相对微不足道的地方，也会对公司、供应商或客户产生严重影响\nday18 2021年2月2日 星期二 1 If the glass were kept hot enough, it would flow over the molten tin until the top surface was also flat, horizontal and perfectly parallel to the bottom surface. 翻译：如果玻璃保持足够的热度，它会流满熔化的锡表面，直到顶部表面也变得平坦、水平，且完全与其底部表面平行。\nday19 2021年2月3日 星期三 1 It was once assumed that improvements in telecommunications would lead to more dispersal in the population as people were no longer forced into cities. 翻译：人们曾经认为，电信的进步使人们不再被迫流向城市，这将导致人口更加分散。\nday20 2021年2月4日 星期四 1 Compared to language, all other inventions pale in significance, since everything we have ever achieved depends on language and originates from it 翻译： 与语言相比，所有其他的发明都相形见绌，因为我们所取得的一切都依赖于语言，并源于语言。\nday21 2021年2月5日 星期五 1 It is ture there are new regulations for mercury emissions from power plants, but these will need billions of dollars to implement and increase costs for everyone. 翻译：的确，对发电厂的汞排放有了新的规定，但贯彻这些规定需要数十亿美元，而且还增加了每个人的成本。\nday22 2021年2月6日 星期六 1 The teacher\u0026#39;s task is to assist the students to apply what they have learned paraconsciously, and in doing so to make it easily accessible to consciousness. 翻译： 教师的任务是协助学生运用他们在超意识状态下习得的知 识，这样做可以使所学的知识更容易被意识接受。\nday23 2021年2月7日 星期日 1 However, if one of the parties in a conflict sees human resources as simply a mouthpiece for the chief executive, then an external mediator might be able to help. 翻译：然而，如果冲突中的一方认为人力资源部只是首席执行官的代言人，那么一个外部调解人或许能够提供帮助。\nday24 2021年2月8日 星期一 1 Summer leaves are green because they are full of chlorophyll, the molecule that captures sunlight and converts that energy into new building materials for the tree. 翻译：夏天的叶子是绿色的，因为它们充满了叶绿素，这种分子能吸收阳光，然后将能量转化为树的新构造材料.\nday25 2021年2月9日 星期二 1 If clothing fails to meet these standards, as determined by the employee\u0026#39;s supervisor, the employee will be asked not to wear the inappropriate item to work again. 翻译：如果员工着装未能满足上司规定的这些标准，该员工将会被要求不再穿戴不适宜的服饰来工作。\nday26 2021年2月10日 星期三 1 The participants were not told beforehand whether the tunes were composed by humans or computers, but were asked to guess, and then rate how much they liked each one. 翻译： 参与者事先没有被告知这些曲调是由人还是由电脑创作的，但是要求他们去猜测，然后评估他们对每个曲调的喜爱程度。\nday27 2021年2月11日 星期四 1 If identical twins are more similar to each other with respect to an ailment than fratenal twins are, then vulnerability to the disease must bu rooted at least in part in heredity. 翻译：如果就患某种疾病而言，同卵双胞胎比异卵双胞胎有更多的相似之处，那么这种疾病的易感性一定至少有一部分是源于遗传的。\nday28 2021年2月12日 星期五 1 Finally, perhaps the most graphic expressions of self-awareness in general can be seen in the displays of rage which are most common from 18 months to 3 years of age. 翻译：最后，一般的自我认知最形象的表达方式大概是愤怒，这在18个月到3岁的孩子身上最为常见。\nday29 2021年2月13日 星期六 1 If we can understand how geography affects our health no matter where in the world we are located, we can better treat disease, prevent illness, and keep people safe and well. 翻译： 如果无论身处何处，我们都能理解地理是如何影响我们的健康的，我们就能更好地治疗疾病、预防疾病，保证人们安全无恙。\nday30 2021年2月14日 星期日 1 Similarly, people who collect dolls may go beyond simply enlarging their collection, and develop an interest in the way that dolls are made, or the materials that are used. 翻译： 同样，收集娃娃的人可能不只是简单地扩大他们的收藏范围，而是培养对玩偶的制作方式或使用材料的兴趣。\nday31 2021年2月15日 星期一 1 He wanted to give people a feeling of suspense as they see the building first from a distance, and then close-up, and the shape of the building as a whole wat that of a box. 翻译：他想给人们一种悬念之感，当人们从远处看到建筑，然后慢慢接近，整个建筑的形状就像一个盒子.\nday32 2021年2月16日 星期二 1 The reason often given for the low regard in which smell is held is that, in comparison with its importance among animals, the human sense of smell if feeble and undeveloped. 翻译：嗅觉不受重视的原因常常被归结为：相对于嗅觉功能对于动物的重要性，人类的嗅觉较弱而且没有充分发育。\nday33 2021年2月17日 星期三 1 Some of you suggested an Italian restaurant, but I most confess that I decided to book a Lebanese one, as we have plenty of opportunities to go to an Italian restaurant at home. 翻译： 你们有些人建议去一家意大利餐馆，但我必须坦白说，我决定订一家黎巴嫩餐厅，因为我们在国内有很多机会去意大利餐馆。\nday34 2021年2月18日 星期四 1 As these ancestral tortoises settled on the individual islands, the different populations adapted to their unique environments, giving rise to at least 14 different subspecies. 翻译：当这些最早期的龟定居在各个岛屿上时，不同的种群适应了它们独特的环境，产生了至少14个不同的亚种。\nday35 2021年2月19日 星期五 1 The continuous and reckless use of synthetic chemicals for the control of pests which pose a threat to argicultural crops and human health is proving to be counter-productive. 翻译：为控制害虫而连续不计后果地使用危害农作物和人类健康的人工合成化学品，结果产生了相反的效果.\nday36 2021年2月20日 星期六 1 Both social and cognitive types of laughter tap into the same expressive machinery in our brains, the emotion and motor circuits that produce smiles and excited vocalisations. 翻译： 无论是社交场合中的笑还是认知活动中的笑，都是利用我们大脑中的同一表达机制——情感和运动环路使人发笑并发出兴奋的声音。\nday37 2021年2月21日 星期日 1 Opinion polls suggest that many people nurture the belief that evironmental standards are declining and four factors seem to cause this disjunction between perception and reality. 翻译： 民意调查表明，很多人支持了这一看法，认为环境标准在降低，似乎有四种因素导致这种认识与实际情况的差异.\nday38 2021年2月22日 星期一 1 Natural soil ferility is dropping in many areas because of continuous industrial fertilizer and pesticide use, while the growth of algae is increasing in lakes because of the fertilizer run-off. 翻译： 由于工业肥料和杀虫剂的持续使用，许多地区的自然土壤肥力正在下降，而湖泊中的藻类则因肥料的径流而增加。\nday39 2021年2月23日 星期二 1 Within the span of several centuries, the Lapita stretched the boundaries of their world from the jungle-clad volcanoes of Papua New Guinea to the lonelist coral outliers of Tonga. 翻译：在几个世纪的时间跨度里，拉皮塔人把他们的世界从巴布亚新几内亚丛林覆盖的火山延伸到汤加最孤独的珊瑚群周围.\nday40 2021年2月24日 星期三 1 Multiplan insurance may not cover all pre-existing medical conditions--so before you leave be sure to check with them about any long-term illnesses or disabilities that you have. 翻译：多重保险可能没有涵盖所有预先存在的医疗情况，所以在你离开之前，一定要与他们核对任何你有的长期疾病或残疾。\nday41 2021年2月25日 星期四 1 As the medical world continues to grapple with what\u0026#39;s acceptable and what\u0026#39;s not, it is clear that companies must continue to be heavily scrutinized for their sales and marketing strategies. 翻译：随着医学界持续努力解决哪些是可接受的和哪些是不可接受的这一底线问题，有一点是清楚的，（制药）公司的销售和市场策略必须继续受到严格审查。\nday42 2021年2月26日 星期五 1 The reasoning is that if your replenish the ice sheets and frozen waters of the high latitudes, more light will be reflected back into space, so reducing the warming of oceans and atmosphere. 翻译：其理论依据是，如果你补充了高纬度地区的冰盖和冰冻水域，更多的光线将会反射回太空，从而减少海洋和大气变暖。\nday43 2021年2月27日 星期六 1 A final theory is related to group behaviour, and suggests that sea mammals cannot distinguish between sick and healthy leaders and will follow sick leaders, even to an inevitable death. 翻译： 最后的这一理论与集体行为有关，认为海洋哺乳动物不能区分病态和健康的领导者，它们会跟随生病的领导者，甚至最终不可避免地死亡。\nday44 2021年2月28日 星期日 1 From earliest childhood we are so bound with our system of numeration that it is a fear of imagination to consider the problems faced by early humans who had not yet developed this facility. 翻译：从幼儿时期开始，我们就与自身的计算系统密切相关，以至于考虑到还未形成这种能力的早期人类所面临的问题，仅仅是想象就让我们觉得可怕.\nday45 2021年3月1日 星期一 1 One of my purposes in writing this book is to give readers who have not had the opportunity to see and enjoy real mathematics the chance go appreciate the mathematical way of thinking. 翻译：我写这本书的目的之一是给那些没能看到和享受真正的数学的读者一个机会去欣赏数学的思维方式。\nday46 2021年3月2日 星期二 1 We have also negotiated a range of benefits for staff such as discounted private healthcare and a car purchase scheme, along with a number of one-off deals with hotels and amusement parks. 翻译： 我们也已经为员工争取到一系列优惠福利，例如享受带有折扣的私人医疗保健、购车计划以及一些与酒店和游乐场的一次性交易。\nday47 2021年3月3日 星期三 1 For many enthusiasts, the ultimate flight fantasy is the jet pack, a small piece of equipment on your back which enables you to climb vertiaclly into air and fly forwards, backforwards ant turn. 翻译：对许多爱好者来说，终极飞行幻想就是喷气背包，这是一种放置在背部的小型设备，使你能够垂直升空，向前或向后飞行，也能调头转弯。\nday48 2021年3月4日 星期四 1 The typical way of talking to a baby--high-pitched, exaggerated and repetitious--is a source of fascination for linguists who hope to understand how baby talk inpacts on learning. 翻译：对那些希望了解“婴儿牙牙学语声”是如何影响学习的语言学家来说，与婴儿高声调的、夸张的、重复的典型说话方式令语言学家感兴趣\nday49 2021年3月5日 星期五 1 Psychologists have long held that a person\u0026#39;s character cannot undergo a transformation in any meaningful way and that the key traits of personality are determined at a very young age. 翻译：心理学家们一直认为，一个人的性格不可能以任何有意义的方式发生转变，人格的关键特征在很小的时候就确定了\nday50 2021年3月6日 星期六 1 It was only when the hull was hanging freely from the lifting frame, clear of the seabed and suction effect of surrounding mud, that the salvage operation progressed to the second stage. 翻译：只有当船体顺利地悬挂在吊架上，离开海底和远离周围泥浆的吸力作用时，打捞工作才进入第二阶段\nday51 2021年3月7日 星期日 1 They think the population of Rapa Nui grew rapidly and then remained more or less stable until the arrival of the Europeans, who introduced deadly diseases to which islanders had no immunity. 翻译：他们认为，拉帕努伊岛人口增长迅速，在欧洲人到来之前保持基本稳定，欧洲人带来了致命的疾病，而岛民对这些疾病没有免疫力\nday52 2021年3月8日 星期一 1 Anyway, even though these noise maps are fairly crude,they have been useful in providing information and raising awareness that noise matters, we need to deal with it and so it is a political matter. 翻译：无论如何，尽管这些噪音地图粗糙且不完善，但它们在提供信息和提高人们对噪音的认识方面很有用，我们需要解决这个问题，所以这是一个政治问题。\nday53 2021年3月9日 星期二 1 Travel has existed since the beginning of time, when primitive man set out, often traversing great distance in search of game, which provided the food and clothing necessary for this survival. 翻译：旅行从远古时代开始就一直存在，那时原始人出发，经常长途跋涉寻找猎物，猎物为其生存提供所需的食物和衣服。\nday54 2021年3月10日 星期三 1 This is why composers often introduce a key note in the beginning of a song, spend most of the rest of the piece in the studious avoidance of the pattern, and then finally repeat it only at the end. 翻译：这就是为什么作曲家常常在歌曲的开始定一个基调，之后在歌曲的剩余部分有意地避免这个音，最终只在结尾处重复一次。\nday55 2021年3月11日 星期四 1 In its most gerneral sense, prescriptivism is the view that one variety of language has an inherently higher value than others, and that this ought go be imposed on the whole of the speech community. 翻译：就其最通常的意义而言，规范主义认为某种语言本来就比其他语言具有更高的价值，并且这一点应该应用于整个语言社会。\nday56 2021年3月12日 星期五 1 What we have decided to present today is information about just three species--because we felt these gave a good indication of the processes at the work in rural and urban setting as a whole. 翻译： 今天我们决定介绍有关三个物种的信息，因为我们觉得这些信息整体上很好地象征了农村和城市环境中的工作过程。\nday57 2021年3月13日 星期六 1 The results of a 14-year study to be announced later this month reveal that the diseases associated with old age are afflicting fewer and fewer people and when they do strike, it is much later in life. 翻译： 这个月底即将公布的一项长达14年的研究结果显示，因老年而受疾病折磨的人越来越少，当老年病真的来袭时，已是生命垂暮之时.\nday58 2021年3月14日 星期日 1 Memory consolidation, the next step in forming an episodic memory, is the process by which memories of encoded information are strengthened, stabilised and stored to facilitate later retrieval. 翻译：记忆巩固是形成情节记忆的下一个步骤，是增强、稳定和储存编码信息的记忆，以便日后检索的过程。\nday59 2021年3月15日 星期一 1 In the course of conducting research in a number of industries and working directly with companies, we have discovered that managers often fail to recongnize the less obvious but profound ways these trends are influencing consumers\u0026#39; aspirations, attitudes, and behaviours. 翻译： 在对一些行业进行研究并与公司直接合作的过程中，我们发现，经理们往往没有认识到这些趋势正影响着消费者的期望、态度和行为，虽不明显但影响极大。\nday60 2021年3月16日 星期二 1 The conviction that historical relics provide infallible testimony about the past is rooted in the nineteenth and early twentieth centuries, when science was regarded as object and value free. 翻译：坚信历史遗迹可以准确无误地证明过去这一信念起源于19世纪和20世纪初期，当时人们认为科学是客观的并且不受价值观左右。\nday61 2021年3月17日 星期三 1 After this, many researchers switched to autoganzfeld tests -- an automated variant of the technique which used computers to perform many of the key tasks such as random selection of images. 翻译：此后，很多研究人员转而进行自动超感知觉全域测试——使用自动化技术，利用电脑完成诸如随机选择图像等许多重要任务。\nday62 2021年3月18日 星期四 1 Unless there are no purchase facilities available at the station where you begin your journey, you will be required to pay the full fare if your are unable to produce a valid ticket for inspection during a journey. 翻译：除非出发地的车站没有可用的售票设施，否则一旦在旅途中检查时你无法出示有效车票，你将被要求支付全额票款。\nday63 2021年3月19日 星期五 1 Although population, industrial output and economic productivity have continued to soar in develop nations, the rate at which people withdraw water from aquifers, river, and lakes has slowed. 翻译：尽管发达国家的人口、工业产出和经济生产力持续飞涨，但人们从含水层、河流和湖泊中抽取水的速度已经放缓\nday64 2021年3月20日 星期六 1 High achievers have been found to use self-regulatory learning strategies more often and more effectively than lower achievers, and are better able to transfer these strategies to deal with unfamiliar tasks. 翻译：我们发现成绩优异的学生比成绩差的学生更经常、更有效地使用自我调节的学习策略，并且能够更好地变换这些策略来处理不熟悉的任务。\nday65 2021年3月21日 星期日 1 Research also indicates that bilingual experience may help to keep the cognitive mechanisms sharp by recruiting alternate brain networks to compensate for those that become damaged during aging. 翻译：研究还表明，双语经历可能有助于保持认知机制的敏锐性，通过运用替代的大脑网络，弥补那些在衰老过程中受到损害的大脑网络。\nday66 2021年3月22日 星期一 1 Not only was a monopoly of cinnamon becoming impossible, but the spice trade overall was diminishing in economic potential, and was eventually superseded by the rise of trade in coffee, tea, chocolate, and sugar. 翻译：不仅肉桂的垄断变得不可能，而且香料贸易的整体经济潜力也在缩减，并最终被咖啡、茶、巧克力和糖的贸易增长所取代。\nday67 2021年3月23日 星期二 1 2 3 4 Another feature that attracted a lot of attention was an interactive journey through a number of the locations chosen for blockbuster films which had made use of New Zealand\u0026#39;s stunning scenery as a backdrop. 翻译： 另一个吸引了众多关注的特点是一趟互动之旅，这趟旅行穿越了电影大片的若干取景地，这些大片充分利用了新西兰令人叹为观止的风景作为背景。\nday68 2021年3月24日 星期三 1 2 3 4 As researchers on aging noted recently, no treatment on the market today has been proved to slow human aging—the build-up of molecular and cellular damage that increase vulnerability to infirmity as we grow older. 翻译：就像老龄化研究者最近所指出的那样，目前市面上没有一种疗法被证实可以减缓人体衰老——随着我们慢慢变老，分子与细胞损坏也逐渐增加，这就增加了我们体弱多病的几率。\nday69 2021年3月25日 星期四 1 2 3 4 We tend to think of climate—as opposed to weather—as something unchanging, yet humanity has been at the mercy of climate change for its entire existence, with at least eight glacial episodes in the past 730,000 years. 翻译：我们往往认为气候相对于天气而言是不变的，然而，人类的存在却一直受制于气候的变化，在过去的73万年里至少经历了8个冰河时期。\nday70 2021年3月26日 星期五 1 In common with all manmals, reptiles and birds, the remote ancestors of tortoises were marine fish and before that various more or less worm-like creatures stretching back, still in the sea, to the primeval bacteria. 翻译：与所有的哺乳动物、爬行动物和鸟类一样，乌龟的远祖是海洋中的鱼类，更早之前，它们是海洋中各种类似蠕虫的生物，这些生物可以追溯到原始细菌。\nday71 2021年3月27日 星期六 1 It is finished manufactured products that dominate the flow of trade, and, thinks to technological advances such as lightweight components, manufactured goods themselves have tended to become lighter and less bulkly. 翻译：正是制成品主导着贸易流动，而且由于技术进步，比如轻量化的部件，制成品本身趋向于变得更轻便而不那么笨重。\nday72 2021年3月28日 星期日 1 It is thue that the actual construction of the house was harmful to the enviroment, mainly because they had to use massive amounts of concrete--one of the biggest sources of carbon dioxide in manufacturing. 翻译：确实，实际的房屋建造对环境有害，主要是因为它们不得不使用大量的混凝土——混凝土是制造业最大的二氧化碳来源之一。\nday73 2021年3月29日 星期一 1 The difficulty with the evidence produced by these studis, facinating as they are in collecting together anecdots and apparent similarities and exceptions, is that they are not what we would today call norm-referenced. 翻译：这些研究收集了奇闻轶事、明显的相似点与特例，因此很吸引人，然而，这些证据所带来的难题是，它们不是我们现在所称的常模参照。\nday74 2021年3月30日 星期二 1 Businesses are finding that ethnography can offer them deeper insight into the possible needs of custormers, either present or future, as well as providing valueable information about their attitudes towards existing products. 翻译：企业发现，人种学可以让其更深入地了解顾客的可能需求，无论是现在的还是未来的，也可以提供他们对现有产品相关态度的有价值的信息。\nday75 2021年3月31日 星期三 1 2 3 4 Education is a hiring requirement for 60% of employment opportunities, but 40% of human resources staff say that if they do not know a lot about the value of documents attained elsewhere, they will not recognise them. 翻译：有60%的就业机会都会对应聘者的教育背景提出要求，但 是40%的人力部工作人员表示，如果他们并不十分了解应聘者 从其他地方获得的资历证书的价值，他们将不予以认可。\nday76 2021年4月1日 星期四 1 Education is a hiring requirement for 60% of employment opportunities,but 40% of human resources staff say that if they do not know a lot about the value of documents attained elsewhere, they will not recognise them. 翻译： 有60%的就业机会都会对应聘者的教育背景提出要求，但是40%的人力部工作人员表示，如果他们并不十分了解应聘者 从其他地方获得的资历证书的价值，他们将不予以认可。\nday77 2021年4月2日 星期五 1 The impression is that the logical nature of the textbooks and their comprehensive coverage of different types of examples, combined with the relative homogeneity of the class,renders work sheets unnecessary. 翻译： 给人的印象是，课本的逻辑性和其中对不同类型例子的全面涵盖，再加上学生水平相对整齐划一，使得练习册无用武之地了\nday78 2021年4月3日 星期六 1 Most tickets may be used for thavel by sleeper, subject to availability, and a reservation in a two-berth cabin can be made for $25, except in the case of Solo and Special tickets, which include sleeper reservations in the fare. 翻译： 绝大部分车票可以用来乘坐卧铺，这要视供应情况而定，而且支付25英镑就可以预订一个双铺位隔间，但单人车票和特 价车票除外，因为上述车票票价中已经包含了卧铺预订费\nday78 2021年4月4日 星期日 1 Operating on the same principle as wind turbines, the power in sea turbines comes from tidal currents which turn blades similar to ships\u0026#39; propellers, but, unlike wind, the tides are predictable and the power input is constant. 翻译： 同风力涡轮机的运行原理一样，海上涡轮机的动力来自潮汐流，在潮汐流的作用下轮机叶片像船只的螺旋桨一样转动。 但与风力不同的是，潮汐是可预测的，而且其输入功率是恒定的\nday79 2021年4月5日 星期一 1 These discoveries have led to the field known as neuroeconomics,which studies the brain\u0026#39;s secrets to success in an economic environment that demands innovation and being able to do things differently from competitors. 翻译：这些发现导致了神经经济学的出现，它研究的是在经济环境下取得成功所依赖的大脑奥秘，而这就需要创新，需要不同于竞争者的另辟蹊径。\nday80 2021年4月6日 星期二 1 While the detrimental effects of noise in classroom situations are not limited to children experiencing disability,those with a disability that affects their processing of speech and verbal communication could be extremely vulnerable. 翻译：尽管教室噪音不仅仅对残疾的孩子有不利影响，但是那些在语音处理和口头交流方面有障碍的孩子却极易受影响.\nday81 2021年4月7日 星期三 1 By timing the transit from two-widely-separated locations, teams of astronomers could calculate the parallax angle--the apparent difference in position of an astronomical body due to a difference in the observer\u0026#39;s position. 翻译：通过从两个相距甚远的地方计算行星的凌日时间，天文学家小组可以计算出视差角——天体的位置由于观测者的位置不同而产生的明显差异。\nday82 2021年4月8日 星期四 1 Victimised pupils are more likely to experience difficulties with interpersonal relationships as adults, while children who persistently bully are more likely to grow up to be physically violent, and convicted of antisocial offences. 翻译：受欺负的小学生长大成人后更有可能经历人际关系方面的困境，而一直欺负别人的儿童长大后更有可能实施身体暴力，并因此被判处反社会的违法罪行。\nday83 2021年4月9日 星期五 1 On the negative side, this type of organisation does not always act effectively, because it depends too much on one or two people at the top, and when these people make poor decisions there is no-one else who can influence them. 翻译：不利的一面是，这种类型的组织方式并不总是有效的，因为它主要依靠一两个高层领导人物，当这些人做了糟糕的决策时，没有人能够影响得了他们。\nday84 2021年4月10日 星期六 1 Researchers from nine countries are working together to create a map linked to database that can be fed measurements from field surveys, drone surveys, statllite imagery, lab analyses and so on to provide real-time data on the state of soil. 翻译：来自9个国家的研究人员正在共同努力，创建一幅与数据库相关联的地图，通过将实地调查、无人机调查、卫星图像、实验室分析等获取的测量数据输入到这个数据库，从而提供有关土壤状况的实时数据。\nday85 2021年4月11日 星期日 1 As the fire continued to rage, the National Trust\u0026#39;s conservators were being mobilised,and that evening local stationers were especially opened to provide the bulk supplies of blotting paper so desperately needed in the salvage operation. 翻译：随着火势的蔓延，来自国民托管组织的文物保护工作者也被调动起来，那天晚上当地的文具店也紧急营业以提供抢救文物所急需的大量的吸墨纸。\nday86 2021年4月12日 星期一 1 Her contribution to physics had been immense, not only in her own work, the importance of which had been demonstrated by her two Nobel Prizes, but because of her influence on subsequent generations of neclear physicists and chemists. 翻译：她对物理学做出了巨大贡献，不仅是因为已被两项诺贝尔奖肯定其重要性的个人研究成果，还因为她对之后一代代核物理学家和化学家所产生的影响.\nday87 2021年4月13日 星期二 1 The taxonomist sometimes overlooks whole species in favour of those groups currently under study, while the ecologist often collects only a limited number of specimens of each species, thus reducing their value of taxonomic investigations. 翻译：分类学家们有时会忽略整个物种而选择当时正在研究的那些物种群，而生态学家常常只收集每个物种有限的几个样本，因此就降低了分类研究的价值\nday88 2021年4月14日 星期三 1 Many CEOs combine two opposing characteristics: confidence --that is, the belief that they are capable of great achievements--with a high level of anxiety, a fear of missing targets, whether set by themselves or by the directors of the company. 翻译：许多CEO都有两种相反的特征：自信——即相信自己有能力取得巨大成就——高度的焦虑，害怕自己或公司董事设定的目标落空。\nday89 2021年4月15日 星期四 1 A radical solution, which may work for some very large companies whose businesses are extensive and complex, is the professional board, whose members would work up to three or four days a week, supported by their own dedicated staff and advisers. 翻译：一个激进的解决方案就是成立专业董事会，这可能适用于一些业务广泛而复杂的大公司，其员工每周工作三到四天，有它们自己敬业的员工和顾问的支持。\nday90 2021年4月16日 星期五 1 This approach is summarised in the statement that it is the task of the grammarian to describe, not to prescribe--to record the facts of linguistic diversity, and not to attempt the impossible tasks of evaluating language variation or halting language change. 翻译：这种方法总结如下：语法学家的任务是描述而不是规定——记录语言多样性的事实，而不是试图完成评估语言变异或停止语言变化这些不可能的任务。\nday91 2021年4月17日 星期六 1 Some recent interdisciplinary research has come out with results that at first sight seem contradictory--a city needs to have a sense of activity, so it need to be lively, with sounds like the clack of high heels on a pavement or the hiss of a conffee machine, but these must not be too intrusive, because at the same time we need to be able to relax. 翻译：最近，一些跨学科研究得出了乍一看似乎自相矛盾的结论——一个城市需要有活动感，所以它需要活泼起来，夹杂着如人行道上高跟鞋的哒哒声或咖啡机发出的嘶嘶声，但这些声音不能太过烦扰，因为我们同时需要能够放松\nday92 2021年4月18日 星期日 1 Another strange feature of the Japanese pagoda is that, because the building tapers, with each successive floor plan being smaller than then the one below, none of the vertical pillars that carry the weight of the building is connected to its corresponding pillar above. 翻译：日本宝塔的另一个奇怪的特点是，由于这种建筑物逐渐变细，每一层楼的平面图都比下面的要小，所以支撑着建筑物重量的垂直柱没有一根与上面相应的柱子相连\nday93 2021年4月19日 星期一 1 An accident that occurred in the skies over the Grand Canyon in 1956 resulted in the establishment of the Federal Aviation Administration to regulate and oversee the operation of aircraft in the skies over the United States, which were becoming quite congested. 翻译：1956年，在美国科罗拉多大峡谷上空发生了一起空难，该事件最终促使美国建立了联邦航空管理局（FAA）来监管已经变得颇为拥堵的美国空中交通。\nday94 2021年4月20日 星期二 1 Tourists flock to wells in far-flung corners of north-western India to gaze in wonder at these architectural marvels from hundreds of years ago, which serve as a reminder of both the ingenuity and artistry of ancient civilisations and of the value of water to human existence. 翻译：游客们涌向印度西北部偏远角落里的水井那里，惊奇地注视着这些数百年前的建筑奇观，它们标示着古代文明的巧妙设计和艺术性，以及水对人类生存的价值。\nday95 2021年4月21日 星期三 1 The antiseptic properties of tannin, the active ingredient in tea, and of hops in beer--plus the fact that both are made with boiled water--allowed urban communities to flourish at close quarters without succumbing to waterborne diseases such as dysentery. 翻译：茶中的活性成分单宁和啤酒中的啤酒花这两种物质的抗菌性能，加上它们都是用开水制作加工的事实，使城市社群在拥挤的区域得以繁荣，免遭诸如痢疾之类的水传播疾病。\nday96 2021年4月22日 星期四 1 As recently as 1993, engineers made a major breakthrough by discovering so-called turbo codes--which come very close to Shannon\u0026#39;s ultimate limit for the maximum rate that data can be transmitted reliably, and now play a key role in the mobile videophone revolution. 翻译：就在最近的1993年，工程师们取得了一项重大突破，发现了所谓的Turbo码，这与Shannon提出的数据可以安全传送的最大速度极限非常接近。现在，Turbo码在移动可视电话变革中起着关键作用。\nday97 2021年4月23日 星期五 1 If a life span is a genetically determined biological characteristic, it is logically necessary to propose the existence of an internal clock, which in some way measures and controls the ageing process and which finally detemines death as the last step in a fixed programme. 翻译：若寿命是一种由遗传决定的生物特征，那从逻辑上来看，有必要提出生物钟的存在，生物钟以某种方式测量并控制老化过程，并作为一个固定程序的最后一步左右着死亡。\nday98 2021年4月24日 星期六 1 Participants in the online debate argued that our biggest challenge is to address the underlying causes of the agricultural systems\u0026#39;s inability to ensure inability food for all, and they identified as drivers of this problem our dependency on fossil fuels and unsupportive government policies. 翻译：在线辩论参加者认为，我们面临的最大挑战是找出农业系统无法确保所有人都能获得足够粮食的根本原因，同时还认为我们对化石燃料的依赖和政府政策的不支持是这一问题的驱动因素。\nday99 2021年4月25日 星期日 1 Already in laboratory trials they have tested strategies for neutralising the power of thunderstorms, and this winter they will brave real storms, equipped with an armoury of lasers that they will be pointing towards the heavens to discharge thunderclouds before lightning can strike. 翻译：他们已经在实验室测试中试验了中和雷暴能量的各种方法；今年冬天，他们将勇敢面对现实中的雷暴，使用全套激光器射向空中的雷雨云，使其在闪电之前放电\nday100 2021年4月26日 星期一 1 Eliminating the secrecy surrounding pay by openly communicating everyone\u0026#39;s remuneration, publicizing performance bonuses and allocating annual salary increases in a lump sum rather than spreading them out over an entire year are examples of actions that will make rewards more visible and potentially more motivating. 翻译：通过公开交流每个人的薪酬，公开绩效奖金并把年度加薪一次付清，而不是分摊到全年来消除围绕薪酬的秘密，这样的行为范例会让奖励更明显，更有可能起到激励作用\n","permalink":"https://myself659.github.io/post/english/100-english-sentence/","summary":"\u003ch2 id=\"day1-2021年1月16日-星期六\"\u003eday1 2021年1月16日 星期六\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eThere\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003econsiderable\u003c/span\u003e \u003cspan class=\"n\"\u003edebate\u003c/span\u003e \u003cspan class=\"n\"\u003eover\u003c/span\u003e \u003cspan class=\"n\"\u003ehow\u003c/span\u003e \u003cspan class=\"n\"\u003ewe\u003c/span\u003e \u003cspan class=\"n\"\u003eshould\u003c/span\u003e  \u003cspan class=\"n\"\u003ereact\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003ewe\u003c/span\u003e \u003cspan class=\"n\"\u003edetect\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"k\"\u003esignal\u003c/span\u003e \u003cspan class=\"n\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003ean\u003c/span\u003e \u003cspan class=\"n\"\u003ealien\u003c/span\u003e \u003cspan class=\"n\"\u003ecivilisation\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e翻译：\n如果我们探测到了来自外星文明的信号，我们应该如何回应是一个备受争议的问题。\u003c/p\u003e\n\u003ch2 id=\"day2-2021年1月17日-星期日\"\u003eday2 2021年1月17日 星期日\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThe two world wars, which interrupted the supply of raw material from Japan, also stifled the European silk industry.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e翻译： 两次世界大战中断了来自日本的原材料供应，同时也抑制了欧洲的丝绸工业。\u003c/p\u003e","title":"100 days, 100 english sentences"},{"content":"背景 最近以太坊单日交易量与矿工收入均创历史新高。据THEBLOCK数据显示，4月23日以太坊网络上的每日交易量达150万，再创历史新高，在日交易量创新高的带动下，以太坊矿工单日收入达到$66.3million，其中交易费用手续费为$34.92million。\n将时间拉长看，近7日比特币跌幅接近20%，而ETH仅为6%。近30日比特币跌幅为10%，以太坊涨幅为33%。而且在几次下跌过程中以太坊恢复速度都比比特币快。\n最近一短时间，以太坊与比特币总市值差距也越来越小。\n那么，很多都会这么一个想法：以太坊未来是否会超过比特币呢？\n个人认为，以太坊未来会超过比特币。\n理由 个人看好以太坊未来会超过比特币，主要基于以下理由：\n尽管以太坊上的交易成本很高，以太坊仍然是最活跃，使用最广泛的区块链平台 以太坊现在价格与市值相比较于比特币都低很多，以太坊是一个更好投资选项 尽管以太坊有很多竞争者，但是以太坊先发优势，网络优势与生态优势均是良好的护城河 以太坊有更多的开发者，是最大区块链的社区 以太坊有V神，V神会为以太坊赢得极大的信任 以太坊上各种L2会不断增强以太坊 以太坊背后有大量的Dapp，这些Dapp中不断有创新涌现，繁荣以太坊生态 以太坊EIP-1599正在路上 以太坊2.0正在稳步推进 以太坊支持智能合约，可以做更多的事情，在满足未来的需求的同时也进一步壮大生态 以太坊上的wbtc会越来越多 时间点 以太坊什么时候会超过比特币？\n时间很难预测，比特币市值现在不到以太坊市值的4倍，如果是出现此消彼涨的情况，这次牛市有希望看到以太坊超过比特币成为新的加密货币的一哥。\n","permalink":"https://myself659.github.io/post/blockchain/eth-overtake-btc/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e最近以太坊单日交易量与矿工收入均创历史新高。据THEBLOCK数据显示，4月23日以太坊网络上的每日交易量达150万，再创历史新高，在日交易量创新高的带动下，以太坊矿工单日收入达到$66.3million，其中交易费用手续费为$34.92million。\u003c/p\u003e","title":"以太坊未来会超过比特币吗？"},{"content":"NFT is blooming. Naval\u0026rsquo;s insightful viewpoints about NFTs as follow:\nAn NFT is a unique, on-chain token representing ownership of an off-chain asset. The token is backed by a social contract from its creator and a surrounding community. By assigning a unique token to a thing, its ownership (not the thing itself!) becomes programmable, verifiable, divisible, durable, universally addressable, composable, digitally secured, and easy to transfer. Bitcoin and other completely on-chain assets are provably scarce - scarcity is enforced by code and distributed consensus. Off-chain assets represented by NFTs are not provably scarce. The promise of scarcity is a slender thread, only as strong as the social contract with the creator and interwoven with the backing of the community. An NFT’s creator may break their promise, or be unable to enforce it, or may have picked the wrong underlying platform and community - rendering the NFT worthless. For NFTs representing digital art and collectibles, the creator cannot enforce scarcity - it’s up to a surrounding community to imbue the authorized NFT with scarcity and prestige within the context of that community. Just as HODLers imbue Bitcoin with value, and developers infuse Ethereum with value, collectors, admirers, and users imbue NFTs with value. NFTs gain value when displayed, used, and promoted within vibrant and growing communities. If the community around an NFT is dying, the NFT is likely bleeding value. If the community is surging, the NFT is likely gaining value. NFTs are monetized memes.* “Actual-value NFTs” can draw upon legal and code-based contracts - a song token can provide a royalty stream, a ticket token can provide access, a metaverse token can grant land titles, an item token can have in-game powers, an ISA token can provide a cut of creator earnings. Even “actual-value NFTs” require a social contract with the creator and community to transfer the value from the off-chain contracts onto the chain where the NFT is registered. Just as there are those who won’t accept that mere consensus can create digital gold, and those who won’t accept that mere smart contracts can create a decentralized Wall Street, there are those that won’t accept that digitized social contracts will create valuable tokens. As with most art and most tokens, most NFTs will have very little value. But a select few NFTs will become focal points for communities who gather to celebrate art, build collections, and explore virtual worlds. With NFTs, blockchains make the jump from finance into creative applications. Regulators would do well to recognize that blockchains are the next generation of the Internet, and applying financial regulations to NFTs is a category error. NFTs tokenize all the things. We are going from a world where every protocol has a token, to where every (decentralized) application has a token, to where every valuable digital representation of an object or person has a token. Public blockchains will be the title registries for everything of value. Ultimately, NFTs will authenticate the world.** ","permalink":"https://myself659.github.io/post/blockchain/nft-naval/","summary":"\u003cp\u003eNFT is blooming. Naval\u0026rsquo;s insightful viewpoints about NFTs as follow:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eAn NFT is a unique, on-chain token representing ownership of an off-chain asset. The token is backed by a social contract from its creator and a surrounding community.\u003c/li\u003e\n\u003cli\u003eBy assigning a unique token to a thing, its ownership (not the thing itself!) becomes programmable, verifiable, divisible, durable, universally addressable, composable, digitally secured, and easy to transfer.\u003c/li\u003e\n\u003cli\u003eBitcoin and other completely on-chain assets are provably scarce - scarcity is enforced by code and distributed consensus.\u003c/li\u003e\n\u003cli\u003eOff-chain assets represented by NFTs are not provably scarce. The promise of scarcity is a slender thread, only as strong as the social contract with the creator and interwoven with the backing of the community.\u003c/li\u003e\n\u003cli\u003eAn NFT’s creator may break their promise, or be unable to enforce it, or may have picked the wrong underlying platform and community - rendering the NFT worthless.\u003c/li\u003e\n\u003cli\u003eFor NFTs representing digital art and collectibles, the creator cannot enforce scarcity - it’s up to a surrounding community to imbue the authorized NFT with scarcity and prestige within the context of that community.\u003c/li\u003e\n\u003cli\u003eJust as HODLers imbue Bitcoin with value, and developers infuse Ethereum with value, collectors, admirers, and users imbue NFTs with value. NFTs gain value when displayed, used, and promoted within vibrant and growing communities.\u003c/li\u003e\n\u003cli\u003eIf the community around an NFT is dying, the NFT is likely bleeding value. If the community is surging, the NFT is likely gaining value. NFTs are monetized memes.*\u003c/li\u003e\n\u003cli\u003e“Actual-value NFTs” can draw upon legal and code-based contracts - a song token can provide a royalty stream, a ticket token can provide access, a metaverse token can grant land titles, an item token can have in-game powers, an ISA token can provide a cut of creator earnings.\u003c/li\u003e\n\u003cli\u003eEven “actual-value NFTs” require a social contract with the creator and community to transfer the value from the off-chain contracts onto the chain where the NFT is registered.\u003c/li\u003e\n\u003cli\u003eJust as there are those who won’t accept that mere consensus can create digital gold, and those who won’t accept that mere smart contracts can create a decentralized Wall Street, there are those that won’t accept that digitized social contracts will create valuable tokens.\u003c/li\u003e\n\u003cli\u003eAs with most art and most tokens, most NFTs will have very little value. But a select few NFTs will become focal points for communities who gather to celebrate art, build collections, and explore virtual worlds.\u003c/li\u003e\n\u003cli\u003eWith NFTs, blockchains make the jump from finance into creative applications. Regulators would do well to recognize that blockchains are the next generation of the Internet, and applying financial regulations to NFTs is a category error.\u003c/li\u003e\n\u003cli\u003eNFTs tokenize all the things. We are going from a world where every protocol has a token, to where every (decentralized) application has a token, to where every valuable digital representation of an object or person has a token.\u003c/li\u003e\n\u003cli\u003ePublic blockchains will be the title registries for everything of value. Ultimately, NFTs will authenticate the world.**\u003c/li\u003e\n\u003c/ol\u003e","title":"Demystifying NFTs by Naval "},{"content":"套利大行其道，那么套利是什么？\n下面这张图是一个活生生的套利案例。\n套利的本质是什么？\n套利的本质是利用非对称获利 套利的竞争是发现非对称机会以及利用机会的速度竞争 任何套利模式都是公开即失效 ","permalink":"https://myself659.github.io/post/economy/the-essence-of-arbitrage/","summary":"\u003cp\u003e套利大行其道，那么套利是什么？\u003c/p\u003e\n\u003cp\u003e下面这张图是一个活生生的套利案例。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/images/business/arbitrage-jd.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e套利的本质是什么？\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e套利的本质是利用非对称获利\u003c/li\u003e\n\u003cli\u003e套利的竞争是发现非对称机会以及利用机会的速度竞争\u003c/li\u003e\n\u003cli\u003e任何套利模式都是公开即失效\u003c/li\u003e\n\u003c/ol\u003e","title":"套利的本质"},{"content":"background 最近Telsa投入15亿美元买入了bitcoin，消息一出，bitcoin应声大涨，这事激起广泛的关注。\ntelsa买入bitcoin的原因 为什么telsa买入比特币？个人认为有以下原因：\n在全球继续放水的预期下，telsa公司资产配置的需要 telsa买入bitcoin，可以赢得加密货币富豪的支持，这些人有很强的消费能力 传统金融政策难以持续，买入bitcoin可以试水新的货币机制，也可以赢得先机 bitcoin时隔3年重回2万美元，并继续突破了3万美元，4万美元等历史新高，对于比特币来说，它的反脆弱性得到证明 bitcoin得到paypal与square等公司支付业务的支持 为什么只买入bitcoin而没有买入其他的加密货币如ethereum呢？个人认为有以下原因：\nbitcoin市值最高，占比超过了整个加密货币的60% bitcoin相比较于其他加密货币风险更小 bitcoin共识长达10多年，共识稳固 bitcoin具有抗通胀的属性，而ethereum现在每年都有一定的通胀 总之，bitcoin是加密货币的始姐，也是最强的头部 意义与影响 telsa买入比特币意义与影响有哪些？\nbitcoin得到世界顶级精英与公司的认可，也意味加密货币得到认可，为整个加密货币市场注入活力，吸引了用户，资产及人才。 意味牛市继续，很有可能是长牛 为其他机构与公司提供了入场的参考，telsa进场了，apple，amazon，google，microsoft下一步也会来吗？ Elon Musk及其telsa的影响力有利于加密货币与区块链技术的普及 ","permalink":"https://myself659.github.io/post/blockchain/bitcoin-telsa/","summary":"\u003ch2 id=\"background\"\u003ebackground\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://www.cnbc.com/2021/02/08/tesla-buys-1point5-billion-in-bitcoin.html\"\u003e最近Telsa投入15亿美元买入了bitcoin\u003c/a\u003e，消息一出，bitcoin应声大涨，这事激起广泛的关注。\u003c/p\u003e\n\u003ch2 id=\"telsa买入bitcoin的原因\"\u003etelsa买入bitcoin的原因\u003c/h2\u003e\n\u003cp\u003e为什么telsa买入比特币？个人认为有以下原因：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e在全球继续放水的预期下，telsa公司资产配置的需要\u003c/li\u003e\n\u003cli\u003etelsa买入bitcoin，可以赢得加密货币富豪的支持，这些人有很强的消费能力\u003c/li\u003e\n\u003cli\u003e传统金融政策难以持续，买入bitcoin可以试水新的货币机制，也可以赢得先机\u003c/li\u003e\n\u003cli\u003ebitcoin时隔3年重回2万美元，并继续突破了3万美元，4万美元等历史新高，对于比特币来说，它的反脆弱性得到证明\u003c/li\u003e\n\u003cli\u003ebitcoin得到paypal与square等公司支付业务的支持\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e为什么只买入bitcoin而没有买入其他的加密货币如ethereum呢？个人认为有以下原因：\u003c/p\u003e","title":"Telsa买入bitcoin意味着什么"},{"content":"背景 最近clubhouse的邀请一码难求，自己有幸被邀请。体验一下，说一下自己对clubhouse一些想法。（Ps：由于区块链与加密货币的火爆，只写一些要点，不展开说明）\n感受与评价 个人对clubhouse一些主观感受与评价如下：\n通讯录验证，避免僵尸用户 扩展式邀请，带来扩展式社交 精准推荐 领袖主导 价值分享 语音聊天，便捷自然 实时分享与交流，无回放与录音 用户时间黑洞 开放打破界限 高质量的人群 问题 如何商业化？ 微信会跟进吗以及如何跟进？ clubhouse产品内核是什么？ 用户推荐算法机制？ Elon Musk这样超级KOL进入，服务不可用的原因是什么？ clubhouse热度会持续吗？ clubhouse什么时候会被墙？ 给clubhouse取一个什么样的中文名字呢？ 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/internet/about-clubhouse/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e最近clubhouse的邀请一码难求，自己有幸被邀请。体验一下，说一下自己对clubhouse一些想法。（Ps：由于区块链与加密货币的火爆，只写一些要点，不展开说明）\u003c/p\u003e","title":"谈谈clubhouse"},{"content":"背景 首先，先看看这个新闻： 湖南益阳62岁老人投江后续：当地多家养老机构爆雷，有老人获悉后心梗去世。\n由这个新闻想到中国从2018年开始了一系列爆雷：\nP2P爆雷断断续续到现在还没有结束 民营企业债爆雷 国有企业债爆雷，如永煤，华晨，北大方正，清华紫光 房地产全线爆雷，如北京院子，北京山水等等，还有很多烂尾楼 养老机构爆雷，如益阳市纳诺老年公寓 教育机构爆雷，如学霸君 共享单车爆雷，如OFO 黄金爆雷，如武汉金黄 信托爆雷，如四川信托 股票爆雷，如獐子岛 银行爆雷，如包商银行 爆雷背后是什么？ 爆雷其实是骗局的破灭。破灭是由于业务与模式的不可持续，不可持续由于缺少接盘侠。 上面列举几种爆雷，其实都是缺少接盘侠（中国居民负债率在2019年就超过了50%）。典型的例子是泰和北京院子与恒大地产。 恒大地产有了接盘侠，撑过来了，而泰和没有接盘侠，北京院子就烂尾了。\n接盘侠 人人皆韭菜。\n人人都是接盘侠。\n爆雷深深伤害了接盘侠，加上前两句话：爆雷伤害全社会，特别是社会信用。\n社会信用 爆雷导致社会信用的减弱，这样全增加全社会的运行成本，成本上升，会导致社会协作的效率下降，从而影响整个社会的财富的创造与流通。\n希望中国政府要重视爆雷的严重影响，并找到其中的根本原因，加强制度与法制建设，为社会信用提供坚定的基石。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/economy/china-trust-crisis/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e首先，先看看这个新闻：\n\u003ca href=\"https://baijiahao.baidu.com/s?id=1689843324924226929\u0026amp;wfr=spider\u0026amp;for=pc\"\u003e湖南益阳62岁老人投江后续：当地多家养老机构爆雷，有老人获悉后心梗去世\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e由这个新闻想到中国从2018年开始了一系列爆雷：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eP2P爆雷断断续续到现在还没有结束\u003c/li\u003e\n\u003cli\u003e民营企业债爆雷\u003c/li\u003e\n\u003cli\u003e国有企业债爆雷，如永煤，华晨，北大方正，清华紫光\u003c/li\u003e\n\u003cli\u003e房地产全线爆雷，如北京院子，北京山水等等，还有很多烂尾楼\u003c/li\u003e\n\u003cli\u003e养老机构爆雷，如益阳市纳诺老年公寓\u003c/li\u003e\n\u003cli\u003e教育机构爆雷，如学霸君\u003c/li\u003e\n\u003cli\u003e共享单车爆雷，如OFO\u003c/li\u003e\n\u003cli\u003e黄金爆雷，如武汉金黄\u003c/li\u003e\n\u003cli\u003e信托爆雷，如四川信托\u003c/li\u003e\n\u003cli\u003e股票爆雷，如獐子岛\u003c/li\u003e\n\u003cli\u003e银行爆雷，如包商银行\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"爆雷背后是什么\"\u003e爆雷背后是什么？\u003c/h2\u003e\n\u003cp\u003e爆雷其实是骗局的破灭。破灭是由于业务与模式的不可持续，不可持续由于缺少接盘侠。\n上面列举几种爆雷，其实都是缺少接盘侠（中国居民负债率在2019年就超过了50%）。典型的例子是泰和北京院子与恒大地产。\n恒大地产有了接盘侠，撑过来了，而泰和没有接盘侠，北京院子就烂尾了。\u003c/p\u003e","title":"爆雷，接盘侠与社会信用"},{"content":"询问 who can who can help me move this box?\nwho is who is that girl in blue?\nwhen can we when can we go hiking?\nWhen did you when did you come back?\nwhere is where is the washroom?\nwhere can I where can i find some bottled water?\nwhy do/did why did you quit your job?\nhow did you How did you get to know each other?\nhow about how about having a cup of coffee?\nhow can I how can i fix my cellphone?\nwhat is what is your favorite color?\nwhat are you doing what are you looking for?\nwhat do/did what do you like to do on weekends?\nwhat did he say just now?\nCan I can I take a look at your notebook?\nCould you/would you Could you tell me what time the store is open?\nAre you Are you making dinner now?\nDo you do Do you need any help?\nDo you mind if I open the window?\nHave you Have you seen the message I send you?\nIs it \u0026hellip; Is it close to your house?\n陈述，解释，介绍 I am I am good at dancing\nI am sure that he is sigle\nI am not used to spicy food\nI am not a big fan of surfing\nI am doing I am tring to fix my bicycle.\nI am going to Florida next month.\nI am in I am in the hospital now\nI want/need I want to turn off the heater.\nI will do I will let you know.\nI have/had I have a cute cat.\nI did I went to the grocery store yesterday.\nI used to watch this kind of movies whe i was a kid.\nLet me/us Let me show you the pictures.\nLet us get started.\nyou seem you seem upset.\nyou should you should arrive there by 8 o\u0026rsquo;clock.\nyou could have done you could have kept that marker.\nyou\u0026rsquo;d better you\u0026rsquo;d better get up ealiler tomorrow.\nyou can you can take this but to City Hall.\nThis is This is the best cafe in town.\nIt\u0026rsquo;s + adj+ to do it\u0026rsquo;s easy to learn how to ride a bicycle.\nIt\u0026rsquo;s going to be It\u0026rsquo;s gonna be rainy tomorrow.\nIt\u0026rsquo;s said that\u0026hellip; It\u0026rsquo;s said that Yoga is very good for health.\nIt\u0026rsquo;s no use+doing It\u0026rsquo;s no use complaining all the time.\nThere\u0026rsquo;s no way There\u0026rsquo;s no way he can win the game.\nThere\u0026rsquo;s no need There\u0026rsquo;s no need to turn on the light.\nThere\u0026rsquo;s something wrong with There\u0026rsquo;s something wrong with my TV.\nThat\u0026rsquo;s why That\u0026rsquo;s why she chose Social Study as Her major\n祈使语句 Please Please have a seat.\nPlease make sure that you will be there on time.\nDo not + do Don\u0026rsquo;t go out after 10:00 PM\nDon\u0026rsquo;t ever buy any gift for me.\n虚拟语气 If i were you, I would If i were you, I would, I would by the shoe.\nWhat would you do if What would you do if the A/C did not work.\n","permalink":"https://myself659.github.io/post/english/45-english-sentence-pattern/","summary":"\u003ch2 id=\"询问\"\u003e询问\u003c/h2\u003e\n\u003ch3 id=\"who-can\"\u003ewho can\u003c/h3\u003e\n\u003cp\u003ewho can help me move this box?\u003c/p\u003e\n\u003ch3 id=\"who-is\"\u003ewho is\u003c/h3\u003e\n\u003cp\u003ewho is that girl in blue?\u003c/p\u003e\n\u003ch3 id=\"when-can-we\"\u003ewhen can we\u003c/h3\u003e\n\u003cp\u003ewhen can we go hiking?\u003c/p\u003e\n\u003ch3 id=\"when-did-you\"\u003eWhen did you\u003c/h3\u003e\n\u003cp\u003ewhen did you come back?\u003c/p\u003e\n\u003ch3 id=\"where-is\"\u003ewhere is\u003c/h3\u003e\n\u003cp\u003ewhere is the washroom?\u003c/p\u003e\n\u003ch3 id=\"where-can-i\"\u003ewhere can I\u003c/h3\u003e\n\u003cp\u003ewhere can  i find  some bottled  water?\u003c/p\u003e\n\u003ch3 id=\"why-dodid\"\u003ewhy do/did\u003c/h3\u003e\n\u003cp\u003ewhy did you quit your job?\u003c/p\u003e\n\u003ch3 id=\"how-did-you\"\u003ehow did you\u003c/h3\u003e\n\u003cp\u003eHow did you get to know each other?\u003c/p\u003e\n\u003ch3 id=\"how-about\"\u003ehow about\u003c/h3\u003e\n\u003cp\u003ehow about having a cup of coffee?\u003c/p\u003e","title":"45 English sentence pattern"},{"content":" The difference between stupidity and genius is that genius has its limits. We all know that light travels faster than sound. That’s why certain people appear bright until you hear them speak. The only thing that interferes with my learning is my education. Education is what remains after one has forgotten everything he learned in school. The majority of the stupid is invincible and guaranteed for all time. The terror of their tyranny, however, is alleviated by their lack of consistency. Only two things are infinite, the universe and human stupidity, and I’m not sure about the former. Common sense is the collection of prejudices acquired by age eighteen. Men marry women with the hope they will never change. Women marry men with the hope they will change. Invariably, they are both disappointed. Any man who can drive safely while kissing a pretty girl is simply not giving the kiss the attention it deserves. If A is a success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut. The equation for ego is: One over Knowledge. With fame, I become more and more stupid, which of course is a very common phenomenon. People are like bicycles. They can keep their balance only as long as they keep moving.（Life is like riding a bicycle. To keep your balance, you must keep moving） Intellectuals solve problems, geniuses prevent them. The hardest thing in the world to understand is the income tax. Whoever undertakes to set himself up as a judge of Truth and Knowledge is shipwrecked by the laughter of the gods. As a human being, one has been endowed with just enough intelligence to be able to see clearly how utterly inadequate that intelligence is when confronted with what exists. When you are courting a nice girl an hour seems like a second. When you sit on a red-hot cinder a second seems like an hour. That’s relativity. The only reason for time is so that everything doesn’t happen at once. If you are out to describe the truth, leave elegance to the tailor. You see, wire telegraph is a kind of a very, very long cat. You pull his tail in New York and his head is meowing in Los Angeles. Do you understand this? And radio operates exactly the same way: you send signals here, they receive them there. The only difference is that there is no cat. If I had an hour to solve a problem, I’d spend 55 minutes thinking about the problem and 5 minutes thinking about solutions. If you want to live a happy life, tie it to a goal. Not to people or things. I must be willing to give up what I am in order to become what I will be. Mathematics is, in its way, the poetry of logical ideas. It is not that I’m so smart. But I stay with the questions much longer. You Don’t Have to Know Everything. You Just Have to Know Where to Find It. Imagination is more important than knowledge. Knowledge is limited. Imagination encircles the world. A clever person solves a problem. A wise person avoids it. A happy man is too satisfied with the present to dwell too much on the future. ","permalink":"https://myself659.github.io/post/english/quotes-from-albert-einstein/","summary":"\u003col\u003e\n\u003cli\u003eThe difference between stupidity and genius is that genius has its limits.\u003c/li\u003e\n\u003cli\u003eWe all know that light travels faster than sound. That’s why certain people appear bright until you hear them speak.\u003c/li\u003e\n\u003cli\u003eThe only thing that interferes with my learning is my education.\u003c/li\u003e\n\u003cli\u003eEducation is what remains after one has forgotten everything he learned in school.\u003c/li\u003e\n\u003cli\u003eThe majority of the stupid is invincible and guaranteed for all time. The terror of their tyranny, however, is alleviated by their lack of consistency.\u003c/li\u003e\n\u003cli\u003eOnly two things are infinite, the universe and human stupidity, and I’m not sure about the former.\u003c/li\u003e\n\u003cli\u003eCommon sense is the collection of prejudices acquired by age eighteen.\u003c/li\u003e\n\u003cli\u003eMen marry women with the hope they will never change. Women marry men with the hope they will change. Invariably, they are both disappointed.\u003c/li\u003e\n\u003cli\u003eAny man who can drive safely while kissing a pretty girl is simply not giving the kiss the attention it deserves.\u003c/li\u003e\n\u003cli\u003eIf A is a success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut.\u003c/li\u003e\n\u003cli\u003eThe equation for ego is: One over Knowledge.\u003c/li\u003e\n\u003cli\u003eWith fame, I become more and more stupid, which of course is a very common phenomenon.\u003c/li\u003e\n\u003cli\u003ePeople are like bicycles. They can keep their balance only as long as they keep moving.（Life is like riding a bicycle. To keep your balance, you must keep moving）\u003c/li\u003e\n\u003cli\u003eIntellectuals solve problems, geniuses prevent them.\u003c/li\u003e\n\u003cli\u003eThe hardest thing in the world to understand is the income tax.\u003c/li\u003e\n\u003cli\u003eWhoever undertakes to set himself up as a judge of Truth and Knowledge is shipwrecked by the laughter of the gods.\u003c/li\u003e\n\u003cli\u003eAs a human being, one has been endowed with just enough intelligence to be able to see clearly how utterly inadequate that intelligence is when confronted with what exists.\u003c/li\u003e\n\u003cli\u003eWhen you are courting a nice girl an hour seems like a second. When you sit on a red-hot cinder a second seems like an hour. That’s relativity.\u003c/li\u003e\n\u003cli\u003eThe only reason for time is so that everything doesn’t happen at once.\u003c/li\u003e\n\u003cli\u003eIf you are out to describe the truth, leave elegance to the tailor.\u003c/li\u003e\n\u003cli\u003eYou see, wire telegraph is a kind of a very, very long cat. You pull his tail in New York and his head is meowing in Los Angeles. Do you understand this? And radio operates exactly the same way: you send signals here, they receive them there. The only difference is that there is no cat.\u003c/li\u003e\n\u003cli\u003eIf I had an hour to solve a problem, I’d spend 55 minutes thinking about the problem and 5 minutes thinking about solutions.\u003c/li\u003e\n\u003cli\u003eIf you want to live a happy life, tie it to a goal. Not to people or things.\u003c/li\u003e\n\u003cli\u003eI must be willing to give up what I am in order to become what I will be.\u003c/li\u003e\n\u003cli\u003eMathematics is, in its way, the poetry of logical ideas.\u003c/li\u003e\n\u003cli\u003eIt is not that I’m so smart. But I stay with the questions much longer.\u003c/li\u003e\n\u003cli\u003eYou Don’t Have to Know Everything. You Just Have to Know Where to Find It.\u003c/li\u003e\n\u003cli\u003eImagination is more important than knowledge. Knowledge is limited. Imagination encircles the world.\u003c/li\u003e\n\u003cli\u003eA clever person solves a problem. A wise person avoids it.\u003c/li\u003e\n\u003cli\u003eA happy man is too satisfied with the present to dwell too much on the future.\u003c/li\u003e\n\u003c/ol\u003e","title":"Quotes From Albert Einstein"},{"content":"今天哪些新领域会像2010年比特币一样的成长 twitter一个用户提出一个问题：Is there a thing today like being into Bitcoin in 2010？\n下面是Balaji S. Srinivasan的回答\nBitcoin itself (still early relative to 99%)比特币，且比特币仍然是早期 Ethereum, crypto in general 以太坊以及其他的加密货币 Startup cities 创业型城市如迈阿密，新加坡和迪拜 Reversing aging 抗衰老及长寿技术 Brain-machine-interface 脑机接口 Transhumanism 超人类主义（人类增强） Robotics 机器人技术 Digital nomadism, in green zones at least 数字游牧 India, rest-of-world tech in general 印度 AI-assisted content creation 人工智能辅助内容创作 VR as office replacement VR替代办公室 AR for productivity (eg Google Glass Enterprise)AR提高生产力 Self-hosting makes a comeback (see http://cloudron.io)自主托管 Telemedicine, personal genomics, health tracking v2 远程医疗，个人基因，健康跟踪 3D printing of metals 金属的3D打印 Pseudonymity, aided by crypto and AI voices \u0026amp; faces 仿真，借助加密和AI仿真声音和人脸 对于上面的回答的，个人补充一些：\nNFT Defi Hyperautomation twitter原文\n关于Balaji S. Srinivasan 关于Balaji S. Srinivasan介绍如下：\nBalaji S. Srinivasan is an angel investor and entrepreneur. Formerly the CTO of Coinbase and General Partner at Andreessen Horowitz, he was also the cofounder of Earn.com (acquired by Coinbase), Counsyl (acquired by Myriad), Teleport (acquired by Topia), and Coin Center.\nHe was named to the MIT TR35, won a Wall Street Journal Innovation Award and holds a BS/MS/PhD in Electrical Engineering and an MS in Chemical Engineering, all from Stanford University. Dr. Srinivasan also teaches the occasional class at Stanford, including an online MOOC in 2013 which reached 250,000+ students worldwide.\n从上面可知Balaji S. Srinivasan是一个真大佬，没有一点水分：\n除了拥有斯坦福大学电子工程的学士，硕士，博士学位，还拥有化学工程的硕士学位 MIT TR35 企业家：四次创业，三次被收购 Coinbase前任CTO 投资人 多面手并且在多个领域做到世界顶级水平 ","permalink":"https://myself659.github.io/post/invest/invest-balajis-directions/","summary":"\u003ch2 id=\"今天哪些新领域会像2010年比特币一样的成长\"\u003e今天哪些新领域会像2010年比特币一样的成长\u003c/h2\u003e\n\u003cp\u003etwitter一个用户提出一个问题：Is there a thing today like being into Bitcoin in 2010？\u003c/p\u003e\n\u003cp\u003e下面是Balaji S. Srinivasan的回答\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBitcoin itself (still early relative to 99%)比特币，且比特币仍然是早期\u003c/li\u003e\n\u003cli\u003eEthereum, crypto in general 以太坊以及其他的加密货币\u003c/li\u003e\n\u003cli\u003eStartup cities 创业型城市如迈阿密，新加坡和迪拜\u003c/li\u003e\n\u003cli\u003eReversing aging 抗衰老及长寿技术\u003c/li\u003e\n\u003cli\u003eBrain-machine-interface 脑机接口\u003c/li\u003e\n\u003cli\u003eTranshumanism 超人类主义（人类增强）\u003c/li\u003e\n\u003cli\u003eRobotics 机器人技术\u003c/li\u003e\n\u003cli\u003eDigital nomadism, in green zones at least 数字游牧\u003c/li\u003e\n\u003cli\u003eIndia, rest-of-world tech in general 印度\u003c/li\u003e\n\u003cli\u003eAI-assisted content creation  人工智能辅助内容创作\u003c/li\u003e\n\u003cli\u003eVR as office replacement VR替代办公室\u003c/li\u003e\n\u003cli\u003eAR for productivity (eg Google Glass Enterprise)AR提高生产力\u003c/li\u003e\n\u003cli\u003eSelf-hosting makes a comeback (see \u003ca href=\"http://cloudron.io\"\u003ehttp://cloudron.io\u003c/a\u003e)自主托管\u003c/li\u003e\n\u003cli\u003eTelemedicine, personal genomics, health tracking v2  远程医疗，个人基因，健康跟踪\u003c/li\u003e\n\u003cli\u003e3D printing of metals 金属的3D打印\u003c/li\u003e\n\u003cli\u003ePseudonymity, aided by crypto and AI voices \u0026amp; faces 仿真，借助加密和AI仿真声音和人脸\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e对于上面的回答的，个人补充一些：\u003c/p\u003e","title":"错过了2010年的比特币，不要错过这些新领域的机会"},{"content":"说明 本文从软件，互联网，区块链，安全的视角谈谈开放的重要性。\n软件 软件方面看几个例子吧。\n首先看一下chrome浏览器，chrome浏览器首先建立应用市场，对开发者开发浏览器api，各种浏览器插件丰富了chrome的功能，对不同场景有针对性的插件来满足用户的需求。\n再看苹果ios对外开放应用商店，有大量的app，为各种不同的用户和不同场景提供针对性app。\n最后是微软的vs code。vs code作为一个编辑器不如vim，emacs，但是由于vs code有针对性不同开发者和开发场景的插件，让开发者的需求得到充分满足。\n对了，不能忘记开源的操作系统Linux。Linux是开源软件的巅峰。Linux开启的开源软件浪潮，基本支撑了整个互联网的运行。\n互联网 微信小程序对外开放微信的接口与用户，相对于独立开发app，降低用户成本与开发成本。小程序带来的GMV超过了1万亿。\n区块链 如果讲区块链精神的内核，那么开放我觉得开放一定要会占有一个位置。在区块链的世界：\n代码是开源的 账本数据是开放的 进入门槛是开放的 这种开放带来了透明，分享，效率及信任，促进了区块链的发展与快速迭代。在这样的环境涌现不少快速增长的例子。\n以太坊2015年上线到2017年市值最高超过了1000亿美元，而这仅仅用于2年多的时间。 uniswap去中心化交易所，上线2年的uniswap就在月交易额超过了成立超过了8年的coinbase，UNI代币市值达到15亿美元以上，而整个团队不到20人。 安全 TK教主说过：\n怎么评价一个东西有多安全呢？唯一金标准是：公开接受挑战、接受公开挑战、接受挑战公开。 典型代表就是密码学领域。AES 也好，RSA 也好，椭圆曲线也好，算法公开，你有能耐就去破解，破解了发论文，还给你颁奖。 胸脯拍得响，但又怕别人公开研究、研究公开的，都属于魑魅魍魉，四小鬼各自肚肠。\n这里提一个概念：Proof of security.那么如果证明安全呢？\n首先要开放，然后要通过挑战与检查来证明安全。\n这方面最典型的例子就是比特币与以太坊。区块链浏览器上地址公开资产情况，但是现在还没有能力破解ecdsa算法。\n小结 开放建立连接。\n连接组成网络。\n网络产生交易。\n交易产生机会与双赢。\n","permalink":"https://myself659.github.io/post/openness-importance/","summary":"\u003ch2 id=\"说明\"\u003e说明\u003c/h2\u003e\n\u003cp\u003e本文从软件，互联网，区块链，安全的视角谈谈开放的重要性。\u003c/p\u003e\n\u003ch2 id=\"软件\"\u003e软件\u003c/h2\u003e\n\u003cp\u003e软件方面看几个例子吧。\u003c/p\u003e\n\u003cp\u003e首先看一下chrome浏览器，chrome浏览器首先建立应用市场，对开发者开发浏览器api，各种浏览器插件丰富了chrome的功能，对不同场景有针对性的插件来满足用户的需求。\u003c/p\u003e","title":"谈谈开放的重要性"},{"content":"前言 Ethereum作为第一个支持图灵完备的智能合约平台，同时也是最大的智能合约平台。从现在区块链应用角度来看是最重要的公链。个人认为公链的市场规模在万亿美元以上。\n上涨原因 最近一个月以太坊从600美元左右上涨到1200美元左右。具体如下图：\n以太坊最近一个月大涨的原因如下：\n比特币上涨太多，上涨无力 以太坊2.0成功启动，质押以太坊会不断增长 Defi继续发展，TLV继续增长 通胀预期加大 随着比特币从1万到4万，吸引更多人关注到以太坊 以太坊的利益同盟不断壮大 上涨预期中网络效应与正反馈效应 2021展望 对于以太坊2021个人展望如下：\n以太坊价格保守估计将会达到2000美元，市值超过了2000亿美金，乐观估计参考2020的telsa 以太坊2.0第1阶段会在2021年内完成 以太坊受到竞争者的挑战：harmony，near，Solana会比以太坊市值增长更快 NFT在以太坊不会有太大的进展 Defi的TLV增长10倍以上 L2百花齐放，这些L2增加了以太坊的护城河 以太坊EIP1599将会在2021年上线 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/blockchain/eth-2021/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003eEthereum作为第一个支持图灵完备的智能合约平台，同时也是最大的智能合约平台。从现在区块链应用角度来看是最重要的公链。个人认为公链的市场规模在万亿美元以上。\u003c/p\u003e","title":"展望2021年的Ethereum"},{"content":"前言 历史是一面镜子。\n历史是一个任人打扮的小姑娘。\n“Most history is guessing, and the rest is prejudice.”\n历史告诉我们过去发生什么，启示我们现在做什么，预示着未来发什么。\n做为多年历史爱好者，这里列出我觉得值得阅读的历史书单。\n书单 大历史 以大历史的视角来审视历史信息，从中洞察真正的启示。\n历史的教训 在完成了十卷文明史之后，Will和Ariel Durant将他们最重要的课程汇编成了一百多页。每页的智慧比几乎任何其他书籍都多，《历史教训》一次又一次地展示了我们文化中出现的模式。它并不总是最乐观的，但它通常是深思熟虑的。历史的教训以一种宏面大视野教我们如何读历史。\n春秋左传 《春秋左传》记载了从鲁隐公元年（前722）到鲁哀公二十七年（前468）共254年的历史，是我国现存极早的编年体史书。《左传》在《春秋》大事纲要的记史方法基础上，代之以系统灵活的史书编纂方式，既记春秋史实，又包含了大量古代典章史料，是了解我国先秦文化的重要典籍。其中“一字所嘉，有同华袞之赠；一言所黜，无异萧斧之诛”的“一字之褒贬”的春秋笔法，使《春秋左传》蕴含着史学和文学上的无限魅力。\n史记 《史记》，二十四之首，是西汉史学家司马迁撰写的纪传体史书，是中国历史上第一部纪传体通史，记载了上至上古传说中的黄帝时代，下至汉武帝太初四年间共3000多年的历史。《史记》被鲁迅先生誉为“史家之绝唱，无韵之离骚”。\n资治通鉴 《资治通鉴》以时间为纲，事件为目，从周威烈王二十三年（公元前403年）写起，到五代后周世宗显德六年（公元959年）结束，涵盖十六朝1362年的历史。\n万年十五年 全球视野下万历十五年。\n南明史 探究南明是如何大溃败的。\n南明史\nSapiens 人类简史 这是过去几年写的最重要的书之一。作者带我们历史回答一个问题：智人是如何成为地球上的优势物种的？他涵盖了人类学，科学和经济学等主题，描绘了一幅相当全面的图景。它可能会改变你对人类的看法。\n全球科技通史 熟知人类科技文明史，真正洞察世界变化的趋势。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/history/history-read-list/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e历史是一面镜子。\u003c/p\u003e\n\u003cp\u003e历史是一个任人打扮的小姑娘。\u003c/p\u003e\n\u003cp\u003e“Most history is guessing, and the rest is prejudice.”\u003c/p\u003e\n\u003cp\u003e历史告诉我们过去发生什么，启示我们现在做什么，预示着未来发什么。\u003c/p\u003e\n\u003cp\u003e做为多年历史爱好者，这里列出我觉得值得阅读的历史书单。\u003c/p\u003e","title":"那些值得多读的历史书"},{"content":"什么是计算思维 wiki对于计算思维定义如下：\nComputational thinking (CT) refers to the thought processes involved in formulating problems so their solutions can be represented as computational steps and algorithms.[1]In education, CT is a set of problem-solving methods that involve expressing problems and their solutions in ways that a computer could also execute.[2]It involves automation of processes, but also using computing to explore, analyze, and understand processes (natural and artificial)\n程序员为什么要学习计算思维 计算思维是指导程序员如何通过编程利用计算机来解决计算问题。\n学习计算思维有以下作用：\n更好地从计算机与编程角度来理解问题 更好地从计算机与编程角度来写代码 更好地发挥计算机的能力与效率 利于跨学科解决问题，可以将一个其他学科的问题转化为一个计算问题 计算思维的核心与关键 分解与组合：将一个大问题分解为更易于解决的子问题，然后利用子问题的结果来组合来解决原始的大问题，最典型的例子就是二分查找。\n模式与模型： 分析与查找模式与模型，找到重复通过迭代解决问题，或者通过公式来描述问题，最典型的例子就是动态规划。\n抽象：抽象的过程是不断做减法，找到核心的过程。最典型的例子就是在linux中一切都是object。\n算法：用算法编排指令利用计算机的计算能力来完成具体问题的计算，同时用复杂度来量化算法。\n如何应用计算思维 确定问题与边界，以解决问题为导向,总是围绕具体的问题展开思考\n理解问题（明确问题的输入，输出，限制等），并准备问题的数据\n根据问题的输入，输出，限制等，通过抽象与分解等方式简化问题\n确定用常用的模型与模式来解决问题\n根据模型与模式设计算法\n编程完成算法的实现\n测试算法\n分析与迭代\n","permalink":"https://myself659.github.io/post/arch/%E8%AF%B4%E8%AF%B4%E8%AE%A1%E7%AE%97%E6%80%9D%E7%BB%B4/","summary":"\u003ch2 id=\"什么是计算思维\"\u003e什么是计算思维\u003c/h2\u003e\n\u003cp\u003ewiki对于计算思维定义如下：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Computational_thinking\"\u003eComputational thinking\u003c/a\u003e (CT) refers to the thought processes involved in formulating problems so their solutions can be represented as computational steps and algorithms.[1]In education, CT is a set of problem-solving methods that involve expressing problems and their solutions in ways that a computer could also execute.[2]It involves automation of processes, but also using computing to explore, analyze, and understand processes (natural and artificial)\u003c/p\u003e","title":"说说计算思维"},{"content":"背景 随着eth 2.0信标链启动以及defi的快速发展，加密货币会迎来一个新的牛市。在牛市开启之后，一定有很多新人进场。\n作为一名老韭菜，简单说说自己一些想法（不会展开说明）。\n安全 首先是安全，安全分为以下几种：\n出入金通道安全 交易平台安全 帐号安全 加密货币钱包安全 政策与法律安全 学习 区块链与加密货币还处于早期，新人入场一定要学习基本知识。具体建议：\n先学习一点基本密码学，弄懂公私钥（这是必须的） 从比特币开始学习 深入比特币交易原理与细节 学习交易基本知识及其应用 学习如何分析加密货币项目 学习以太坊 学习Defi 投资 不要投资超过你能承担的损失 不要加杠杆，也不要All-in 避免单一化投资，投资组合要多样化 识别空气币 避免FUD心理（Fear，Uncertainty，Doubt） 保持独立性，Do your own search 不懂的不要参与 尊重市场与事实，而不是执着于个人意愿与偏见 制定退出策略 区分投资与投机 不要追高，学会与趋势作朋友 ","permalink":"https://myself659.github.io/post/blockchain/tips-for-crypto-invest/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e随着eth 2.0信标链启动以及defi的快速发展，加密货币会迎来一个新的牛市。在牛市开启之后，一定有很多新人进场。\u003c/p\u003e\n\u003cp\u003e作为一名老韭菜，简单说说自己一些想法（不会展开说明）。\u003c/p\u003e","title":"加密货币新手应该注意哪些问题"},{"content":"问题描述 Given weights and values of n items, put these items in a knapsack of capacity W to get the maximum total value in the knapsack. In other words, given two integer arrays val[0..n-1] and wt[0..n-1] which represent values and weights associated with n items respectively. Also given an integer W which represents knapsack capacity, find out the maximum value subset of val[] such that sum of the weights of this subset is smaller than or equal to W. You cannot break an item, either pick the complete item, or don’t pick it (0-1 property).\n给定n个物品的重量和价值，从中选择物品放在容量为W的背包中(表示选择物品重量不超过W)，同时每个物品最多到允许选择1个，使得背包中物品价值之和最高。\n背包问题是一个非常典型的考察动态规划应用的题目，对其加上不同的限制和条件，可以衍生出诸多变种，若要全面理解动态规划，就必须对背包问题了如指掌。学习背包问题有利于举一反三，融会贯通，再也不怕动态规划。\n问题建模 用程序语言重新定义一下问题。\n先看输入：\nint Values[n]，表示物品的价值 int Weights[n]，表示物品的重要 int LimitWeight，表示背包容量的限制 再看输出：\nint MaxValue，表示背包里的物品最大价值 转化为函数（以C++为例）：\n1 2 3 4 5 6 int knapsack(vector\u0026lt;int\u0026gt; Values, vector\u0026lt;int\u0026gt; Weights, int LimitWeight) { int MaxValue = 0; return MaxValue; } 问题分析 是否可以应用DP 应用DP应以满足以下三个条件：\n最优子结构 边界条件 满足重叠要求的状态转移方程 最优子结构 如果一个问题的最优解包含其子问题的最优解，我们就称此问题具有最优子结构。 编程中常见最大与最小的问题，一般都是满足最优子结构的这一条件。\n本题要求是求背包里物品的最大价值。故初步判断满足条件。\n边界条件 连界条件包括开始条件与结束条件。\n这个条件可以从下面三个问题来解答：\n用什么来作边界条件？ 边界条件是起点是什么，终点是什么？ 边界是如何从起点到终点？ 针对上面问题，结合本题的信息，可以回答如下：\n用背包里的物品重量作为边界 重量限制起点是1，终点是不超过LimitWeight；物品在数组的位置起点从0开始，终点不超过数组的长度 从起点开始，逐个加1直到终点 状态转移方程 状态转移方程也就是我们常说的DP公式。这是解决DP问题的关键。\n满足重叠要求是指后面的状态可以重复使用前面的生成的状态。\n如果不是很简单的直接可以看出来，建议在解题步骤中一步一步分析出来。本题我们会在后面分析给出对应的状态转移方程。\n解题步骤 确定采用DP来解决问题，那我们正式进行DP解题的步骤。\n1. 定义状态 前面问题分析中提到状态转移方程，状态应当在状态转移方程之下定义。完成状态定义，才能开始定义状态转移方程。\n本题的状态是S(w,i,v),其中w表示不能超过最大重量，i表示遍历到第i个物品，v表示对应的最大的价值。\n那么如何用数据结构保存状态呢？\n使用一个二维数组state[LimitWeight+1][n+1]来表示。\n2. 确定递归关系 这里我们采用top-down思考方式。\n先看代码，具体如下：\n1 2 3 4 5 6 7 8 int knapsack(vector\u0026lt;int\u0026gt; Values, vector\u0026lt;int\u0026gt; Weights, int LimitWeight) { int MaxValue = 0; int itemLen = Weights.size(); // 处理入口 MaxValue = knapsackDo(Values, Weights, LimitWeight,itemLen); return MaxValue; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 int knapsackDo(vector\u0026lt;int\u0026gt; Values, vector\u0026lt;int\u0026gt; Weights, int LimitWeight, int posIndex) { int localMaxValue = 0; int posWeight = Weights[posIndex-1]; int posValue = Values[posIndex-1]; if(LimitWeight \u0026gt;=posWeight){ // 选择当前位置的物品 int selectValue = posValue + knapsackDo(Values, Weights, LimitWeight- posWeight, i -1); // 跳过当前位置的物品 int skipValue = knapsackDo(Values, Weights, LimitWeight, posIndex -1); localMaxValue = MAX(selectValue, skipValue); }else { // 超过重量限制，跳过 localMaxValue = knapsackDo(Values, Weights, LimitWeight, posIndex -1); } return localMaxValue; } 3. 根据递归关系，得出并检查状态转移方程 当限制重量大于等于当前物品重量时，状态转移方程如下：\n1 2 3 knapsackDo(Values, Weights, LimitWeight,posIndex) = MAX(knapsackDo(Values,Weights, LimitWeight - Weights[posIndex],posIndex -1), knapsackDo(Values,Weights, LimitWeight,posIndex -1)) 当限制重量小于当前物品重量时，状态转移方程如下：\n1 2 knapsackDo(Values, Weights, LimitWeight,posIndex) = knapsackDo(Values,Weights, LimitWeight,posIndex -1) 4. 确定递归结束条件 本题中递归结束条件有两个，分别如下：\n限制重量小于等于0（即0 \u0026gt;= LimitWeight ） 数组index小于0 （即0 \u0026gt; posIndex） 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 int knapsackDo(vector\u0026lt;int\u0026gt; Values, vector\u0026lt;int\u0026gt; Weights, int LimitWeight, int posIndex) { if( 0 \u0026gt;= LimitWeight || 0 \u0026gt; posIndex ){ return 0; } int localMaxValue = 0; int posWeight = Weights[posIndex-1]; int posValue = Values[posIndex-1]; if(LimitWeight \u0026gt;=posWeight){ // 选择当前位置的物品 int selectValue = posValue + knapsackDo(Values, Weights, LimitWeight- posWeight, posIndex -1); // 跳过当前位置的物品 int skipValue = knapsackDo(Values, Weights, LimitWeight, posIndex -1); localMaxValue = MAX(selectValue, skipValue); }else { // 超过重量限制，跳过 localMaxValue = knapsackDo(Values, Weights, LimitWeight, posIndex -1); } return localMaxValue; } 5. 完成递归的实现 将代码结合起来如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 int knapsack(vector\u0026lt;int\u0026gt; Values, vector\u0026lt;int\u0026gt; Weights, int LimitWeight) { int MaxValue = 0; int itemLen = Weights.size(); // 处理入口 MaxValue = knapsackDo(Values, Weights, LimitWeight,itemLen-1); return MaxValue; } int knapsackDo(vector\u0026lt;int\u0026gt; Values, vector\u0026lt;int\u0026gt; Weights, int LimitWeight, int posIndex) { if( 0 \u0026gt;= LimitWeight || 0 \u0026gt; posIndex ){ return 0; } int localMaxValue = 0; int posWeight = Weights[posIndex]; int posValue = Values[posIndex]; if(LimitWeight \u0026gt;=posWeight){ // 选择当前位置的物品 int selectValue = posValue + knapsackDo(Values, Weights, LimitWeight- posWeight, posIndex -1); // 跳过当前位置的物品 int skipValue = knapsackDo(Values, Weights, LimitWeight, posIndex -1); localMaxValue = MAX(selectValue, skipValue); }else { // 超过重量限制，跳过 localMaxValue = knapsackDo(Values, Weights, LimitWeight, posIndex -1); } return localMaxValue; } 6. 添加缓存保存子问题结果优化递归方案 缓存对象是什么？状态。根据状态定义，添加如下代码：\n1 2 3 4 5 6 7 8 9 10 int knapsack(vector\u0026lt;int\u0026gt; Values, vector\u0026lt;int\u0026gt; Weights, int LimitWeight) { int MaxValue = 0; int itemLen = Weights.size(); // 定义与实始化状态 static vector\u0026lt;vector\u0026lt;int\u0026gt;\u0026gt; stateDP(LimitWeight+1, vector\u0026lt;init\u0026gt;(itemLen+1)); // 处理入口 MaxValue = knapsackDo(Values, Weights, LimitWeight, itemLen - 1); return MaxValue; } 什么时候添加缓存与什么时候使用缓存呢？\n具体代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 int knapsackDo(vector\u0026lt;int\u0026gt; Values, vector\u0026lt;int\u0026gt; Weights, int LimitWeight, int posIndex) { if( 0 \u0026gt;= LimitWeight || 0 \u0026gt; posIndex ){ return 0; } int localMaxValue = 0; int posWeight = Weights[posIndex]; int posValue = Values[posIndex]; if(LimitWeight \u0026gt;=posWeight){ // 选择当前位置的物品 if(0 != stateDP[LimitWeight][posIndex+1]){ // 使用缓存 int selectValue = stateDP[LimitWeight][posIndex+1]; }else { int selectValue = posValue + knapsackDo(Values, Weights, LimitWeight- posWeight, i -1); // 添加缓存 stateDP[LimitWeight][posIndex+1] = selectValue； } // 跳过当前位置的物品 int skipValue = knapsackDo(Values, Weights, LimitWeight, posIndex -1); localMaxValue = MAX(selectValue, skipValue); }else { // 超过重量限制，不能选择 localMaxValue = knapsackDo(Values, Weights, LimitWeight, posIndex -1); } return localMaxValue; } 注意：根据代码执行顺序，只需要添加上面一处添加缓存处理代码即可。\n7. 将递归转化为迭代 上面一直采用的是top-down来解决DP问题。这一步我们要尝试将递归转化为迭代。\n递归的情况下状态转移方程是函数的方程。在迭代的情况，状态转移方程是状态变量的方程，具体如下：\n当限制重量大于等于当前物品重量时，状态转移方程如下：\n1 2 3 stateDP[LimitWeight][posIndex] = MAX(stateDP[LimitWeight - Weights[posIndex-1]][posIndex -1]+Values[posIndex-1], stateDP[LimitWeight],[posIndex -1]) 当限制重量小于当前物品重量时，状态转移方程如下：\n1 stateDP[LimitWeight][posIndex] = stateDP[LimitWeight][posIndex -1] 代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 int knapsack(vector\u0026lt;int\u0026gt; Values, vector\u0026lt;int\u0026gt; Weights, int LimitWeight) { int MaxValue = 0; int itemLen = Weights.size(); // 定义与实始化DP状态 vector\u0026lt;vector\u0026lt;int\u0026gt;\u0026gt; stateDP(LimitWeight+1, vector\u0026lt;int\u0026gt;(itemLen+1)); // 限定重量从1开始 for(int w = 1; w \u0026lt;= LimitWeight; w++){ // 在限定重量为w的情况下，遍历数组获取最大值 for(int posIndex = 1; posIndex \u0026lt;= itemLen; posIndex++){ int selectValue = 0; int skipValue = stateDP[w][posIndex -1]; int posWeight = Weights[posIndex -1]; int posValue = Values[posIndex -1]; if (w \u0026gt;= posWeight) { selectValue = posValue + stateDP[w - posWeight][posIndex -1]; } stateDP[w][posIndex] = max(skipValue, selectValue); } } // 从状态中取出最大值 MaxValue = stateDP[LimitWeight][itemLen]; return MaxValue; } 为了方便理解上面的代码，我们进行一个实例分析：\n假定有4个物品，其价值分别为10, 40, 30, 50，对应重量分别为5, 4, 6, 3，限定总重量不超过10。 下面我们观察stateDP的变化过程。\n首先看初始化的stateDP状态：\n根据初始化的stateDP状态和状态转移方程，整个stateDP状态构建一列一列进行即可，过程与结果如下：\n8. 测试 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 #include \u0026lt;iostream\u0026gt; #include \u0026lt;vector\u0026gt; #include \u0026lt;algorithm\u0026gt; // std::max #include \u0026lt;iomanip\u0026gt; using namespace std; int knapsack(vector\u0026lt;int\u0026gt; Values, vector\u0026lt;int\u0026gt; Weights, int LimitWeight) { int MaxValue = 0; int itemLen = Weights.size(); // 定义与实始化DP状态 vector\u0026lt;vector\u0026lt;int\u0026gt;\u0026gt; stateDP(LimitWeight+1, vector\u0026lt;int\u0026gt;(itemLen+1)); // 限定重量从1开始 for(int w = 1; w \u0026lt;= LimitWeight; w++){ // 在限定重量为w的情况下，遍历数组获取最大值 // 完全DP问题，在遍历数组的情况下需要考虑同一个选项多次选择的问题 int posIndex ; for(posIndex = 1; posIndex \u0026lt;= itemLen; posIndex++){ int selectValue = 0; int tmepSelectValue = 0; int skipValue = stateDP[w][posIndex -1]; int posWeight = Weights[posIndex -1]; int posValue = Values[posIndex -1]; int selectCnt = w / posWeight; for (int i = selectCnt; i \u0026gt;= 1; i--){ tmepSelectValue = i * posValue + stateDP[w - i*posWeight][posIndex -1]; selectValue = max(tmepSelectValue,selectValue); } stateDP[w][posIndex] = max(skipValue, selectValue); } } // 从状态中取出最大值 MaxValue = stateDP[LimitWeight][itemLen]; // 打印状态表 cout\u0026lt;\u0026lt;\u0026#34;print stateDP:\u0026#34;\u0026lt;\u0026lt;endl; for(int i = 0; i \u0026lt;= itemLen; i++){ for(int j = 0; j \u0026lt;= LimitWeight; j++){ cout\u0026lt;\u0026lt;setw(3)\u0026lt;\u0026lt;stateDP[j][i]\u0026lt;\u0026lt;\u0026#34; \u0026#34;; } cout \u0026lt;\u0026lt;endl; } return MaxValue; } int main(){ vector\u0026lt;int\u0026gt; Values{10, 40, 30, 50}; vector\u0026lt;int\u0026gt; Weights{5, 4, 6, 3}; int LimitWeight = 10; int maxValues = knapsack(Values, Weights, LimitWeight); cout\u0026lt;\u0026lt;\u0026#34;maxValues:\u0026#34;\u0026lt;\u0026lt;maxValues; } 运行结果如下：\n1 2 3 4 5 6 7 print stateDP: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 20 0 0 0 0 40 40 40 40 80 80 80 0 0 0 0 40 40 40 40 80 80 80 0 0 0 50 50 50 100 100 100 150 150 maxValues:150 推荐是在leetcode测试，由于leetcode上没有这道题，所以就简单测试一下。\n测试代码参考链接。\n总结 掌握使用DP解决问题三个条件：\n最优子结构 边界条件 满足重叠要求的状态转移方程 使用DP解决问题采用以下步骤：\n定义状态 确定递归关系 根据递归关系，得出并检查状态转移方程 确定递归结束条件 完成递归的实现 添加缓存保存子问题结果优化递归方案 将递归转化为迭代 对上面的步骤总结如下：\n根据问题的目标采用Top-down方式弄清问题的本质（状态转移方程），然后采用Bottom-up方式实现代码。\nPs：关于DP还有很多内容可以写（如背包问题的扩展及类似leetcode题目），以后有机会再补充一些。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/dsa/dp-knapsack/","summary":"\u003ch2 id=\"问题描述\"\u003e问题描述\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eGiven weights and values of n items, put these items in a knapsack of capacity W to get the maximum total value in the knapsack.\nIn other words, given two integer arrays val[0..n-1] and wt[0..n-1] which represent values and weights associated with n items respectively.\nAlso given an integer W which represents knapsack capacity, find out the maximum value subset of val[] such that sum of the weights of this subset is smaller than or equal to W. You cannot break an item, either pick the complete item, or don’t pick it (0-1 property).\u003c/p\u003e","title":"学会背包问题，再也不怕动态规划 0-1背包"},{"content":"GPT-3 GPT-3全称是\u0026quot;General Pre-trained Transformer-3\u0026quot;，对应中文翻译为：第三代通用预训练转换器。\n其wiki定义如下：\nGenerative Pre-trained Transformer 3 (GPT-3) is an autoregressive language model that uses deep learning to produce human-like text.\nGPT-3是一种自回归语言模型，这种模型利用深度学习产生类似于人类语言的文本。\n从本质上看，GPT-3是计算机程序。\n现阶段GPT-3能干什么呢？\n直接能够理解英文理解并将转化为需求 英文翻译 自动创作如小说 人机对话 具体请看下面的一个视频： 看完这个视频作为程序员的我感觉一阵阵凉意，AI会下围棋也就算了，AI现在可以直接根据需求写代码，这是解放程序员还是解决程序员呢？\n值得注意的是，GPT-3背后的OpenAI公司的投资人有两位硅谷大佬：当代钢铁侠埃隆·马斯克（Elon Musk）和《从0到1》作者彼得·蒂尔（Peter Thiel）。\nGPT-3意味着什么？ 无码编程时代 从上面的视频中我们可以清楚看到需求定义即代码。从中进一步思考可以得出一个结论：编程的未来发展一个方向是无代码化（no code ）或者少代码化（less code）。这也意味着编程的门槛进一步下降。\n超级大脑外挂 随着GPT不断进步与发展，GPT-X将来会成人类大脑超级外挂。拥有GPT-X在知识方面远远会超越普通人。以程序开发为例，在未来开发人员只需要定义需求，而AI将帮助开发人员完成编程，测试，部署等功能，这也意味着当你定义好需求之后，几分钟之后需求就得了实现，测试，部署，上线等流程，整个开发周期大大缩短。\n新一代脑力资源 现在脑力资源主要来自人类，未来类似于GPT-3这样的AI会成为新一代脑力资源。其实现阶段计算机程序已经实现部分这样的功能，如象棋对奕软件，Alphago，这些计算机程序已经在象棋与围棋领域超越了人类，已经成为人类最强大的陪练。除此之外在机器翻译，语言识别，自然语言处理等技术已经得到广泛应用。\n面对新一代的脑力资源：AI, 人类应该如何应对呢？\n如同人类要避免同计算机比计算能力，未来的人类也要避免在AI擅长的领域与之竞争。 如同人类利用计算机来创造一个互联网世界，未来人类也会应用AI技术创造一个智能的世界。\n感想 下面谈一下我个人一些感想：\n只会写CRUD肯定是不行了，不说未来怎么样，现在这个阶段，只会CRUD的程序员已经在危险的地带，现在这个阶段，只要定义好SQL语句，就可以生成CRUD的代码了，未来就更不说了 GPT-3并不会取代那些高级程序员 成为SQL工程师也比成为一个CRUD工程师更好，因为SQL离需求更近，离数据更近 在数学和算法方面精进，做到Write code to create 未来程序员只需要四类工程师：业务类，基础设施类，算法类，架构类 AI的进步与发展，会带来新的变化，主动拥抱AI的变化，才能适应未来世界 不可替代永远是现在还不存在的东西，所以培养创新意识与创造能力变得相当重要了 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/gpt3-thought/","summary":"\u003ch1 id=\"gpt-3\"\u003eGPT-3\u003c/h1\u003e\n\u003cp\u003eGPT-3全称是\u0026quot;General Pre-trained Transformer-3\u0026quot;，对应中文翻译为：第三代通用预训练转换器。\u003c/p\u003e\n\u003cp\u003e其wiki定义如下：\u003c/p\u003e","title":"谈谈GPT3"},{"content":"背景 由于GFW的干扰，即使科学上网方式从github下载文件，下载连接经常会被中断。由于chrome重新连接的次数有限，据说chrome重新建立连接重试次数最大为5次。所以遇到一个大的下载文件，通常是不会下载成功，费时费力费心。\n针对这种情况提供一个解决方案。\n解决方案 在windows上科学上网基础之上，解决方案主要工作如下：\n在windows上安装wsl 在wsl上安装与配置polipo 应用 应用就很简单,通过wget指定重连接的次数，参考如下：\n1 wget --tries=1000 https://github.com/downloadurl （end）\n","permalink":"https://myself659.github.io/post/linux/linux-wget-retry/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e由于GFW的干扰，即使科学上网方式从github下载文件，下载连接经常会被中断。由于chrome重新连接的次数有限，据说chrome重新建立连接重试次数最大为5次。所以遇到一个大的下载文件，通常是不会下载成功，费时费力费心。\u003c/p\u003e","title":"利用WSL和wget从github下载文件"},{"content":"最近地摊经济火了，火遍了朋友圈，激活了段子手。\n原因 受到疫情影响，国内与国际经济都受到很大的冲击，国内企业倒闭，减薪，缩员等现象也是时有出现。在这种情况下国内底层人们受到冲击最大。而这些人也主要分布在低端服务（没有找到合适的词汇来表示）、餐饮等行业。\n开启地摊经济可以为这些人提供一些谋生的手段，同时降低了商业的成本，这种低成本在现在这个情况下会为经济注入活力。\n为什么高调宣传呢？ 个人认为有以下理由：\n能解决一部分问题，并且还能快速解决问题（相对比的是其他的方法见效慢，难度大） 能够对症下药，直接帮助低层人民 希望各个城市也要行动起来 转移一部分注意力 地摊经济的利弊 从国家层面来看地摊经济有利于落实保就业，保民生等功能，由于成本的下降的，可以激发经济的活力，这方面最明显的例子就是拼多多。但是会影响经济的升级转型，也给城市管理与市容，环境带来新的问题。\n从对于房东来说，这次是最大的损失者：不仅是租金下降，而是失出租金，特别是对于小商铺。\n如何评价地摊经济 地摊经济是夜壶经济，地摊经济是不可持续的，只是一时。\n地摊经济是经济降级。\n地摊经济的宣传怪象 这里只是提醒大家了解一下：幸存者偏差。\n","permalink":"https://myself659.github.io/post/economy/about-squatter-economy/","summary":"\u003cp\u003e最近地摊经济火了，火遍了朋友圈，激活了段子手。\u003c/p\u003e\n\u003ch1 id=\"原因\"\u003e原因\u003c/h1\u003e\n\u003cp\u003e受到疫情影响，国内与国际经济都受到很大的冲击，国内企业倒闭，减薪，缩员等现象也是时有出现。在这种情况下国内底层人们受到冲击最大。而这些人也主要分布在低端服务（没有找到合适的词汇来表示）、餐饮等行业。\u003c/p\u003e","title":"说说地摊经济"},{"content":"定义 第一性原理(First Principles)是指从基本原理出发进行思考和解决问题的方法。其具体含义可以概括为:\n不做任何假设,客观看待问题,抛开已有的经验与习惯思维。\n分解问题,回到最基本的真理或事实,以简单的基本要素作为出发点。\n从新角度审视问题的本质,不受已有模式与结论的限制。\n构建由基本原理推导出的自己的原则体系和解决方案。\n持续推敲自己的想法,确保每一步都基于基本原理,而不是来源于别人的观点。\n采用第一性原理思考问题,可以消除无效假设,有助于洞察事物的本质,创造出更原创和有效的解决方案。这种思维模式激发我们独立思考,克服思维定势,是许多优秀创新者如伊隆·马斯克所推崇的一种高效思考方法。\n简而言之,第一性原理就是保持开放和怀疑的态度,不依赖其他任何假设和理论,直接从基本原理出发建立理论体系的方法。它追求从最基本的层面来理解和描述物质世界的本质规律。这有助于我们跳出框架,从新的视角看待世界。\n如何得到最基本的事实与原理 如何得到最基本的事实与原理呢？这里推荐两个方法\n苏格拉底式提问法 五个为什么提问法 苏格拉底式提问法 苏格拉底式提问法同普通讨论之间的关键区别在于，前者试图以系统的方式得出第一性原理。苏格拉底式提问法通常遵循以下流程。\n澄清你的想法并解释想法的来源。（为什么我会这么想？我到底是怎么想的？） 对假设提出挑战。（我怎么知道这是真的？如果我的想法正好相反呢？） 寻找论据。（我该如何支撑自己的论点？论据来源于哪里？） 思考其他可能的视角。（别人可能有什么想法？我怎么知道自己是对的？） 探究后果和影响。（如果是我错了，该怎么办？如果我错了，会有什么后果？） 质疑最初的问题。（我为什么会那样想？我的想法对吗？从推理过程中，我能得出什么结论？） 五个为什么提问法 五个为什么提问法是一种通过连续提问\u0026quot;为什么\u0026quot;来深入探究问题根源的方法。它可以帮助我们追根溯源,深入思考并找到真正的原因。 这个方法主要遵循以下几个步骤:\n明确问题:首先要确认具体要探讨的问题是什么。 问第一个为什么:对这个问题提出第一个为什么,试图找到并表达出现这个问题的第一个原因。 继续发问为什么:针对第一个原因再次发问为什么,探索更深层次的原因,类推下去。 重复提问:每找到一个原因,就继续追问为什么,通常需要重复提问5次。 找到根本原因:通过不断发问为什么,可以剥离表层,深入探究,找到问题的根本原因。 提出解决方案:当找到真正的根本原因后,就可以针对性地提出预防或解决问题的方法。 采用这个简单的提问方式,可以帮助我们逻辑性地分析探讨问题,不断深入,找到真正的症结所在。这是一个可以洞悉问题本质与第一性的有效方法。\n过程 从学习思考过程看，第一性原理思考有两个阶段：\n从问题与现象到根本原因与本质的自上而下的思考 从确定的第一性原理到解决方案的自下而上的思考 整个第一性原理思考的过程如下：\n描述问题（假设、目标）并明确问题（假设、目标） 将问题（假设、目标）分解子类 确定问题（假设、目标）的第一性基本原理 根据第一性基本原理从头构建新的解决方案 难点 大脑的思考会消费大量的能量，大部分情况下大脑的思考路径是：问题-方案，而第一性原理思考的路径是：问题-第一性原理-方案，大脑往往会不适应第一性原理思考的过程。\n从问题到第一性原理往往是一个很长的链路过程，整个链路是一环套一环，要确保整个过程是一件不容易的事情\n第一性原理思考要求深度思考\n第一性原理思考要求有怀疑一切，大胆假设，小心求证\n第一性原理思考要求think out of box\n本质 vs 第一性原理 本质指事物存在和发展的最基本、最核心的属性或规律。本质是事物内在存在的客观实体,揭示本质是为了认识事物的真正特征。 第一性原理是指探究一个系统的最基本规律和最核心要素。第一性原理思考强调主体的能动作用,通过抽离、简化,重新构建对系统的认知框架。\n两者主要区别有:\n本质更强调被探究对象的客观性,是存在的、不可改变的。第一性原理更强调主体的主观作用,是可以重新构建的。 本质需要发现,而第一性原理需要创造。揭示本质是对真理的发现,而建立第一性原理需要主体的创造性思维。 本质具有内在性,属于事物自身的属性。第一性原理具有构造性,是主体在一定条件下构建的。 本质更多是分析性的,而第一性原理更多关注如何综合元素重新建构。 本质强调“是什么”,而第一性原理强调“能怎样”。 总之,本质是对客观存在的描述,而第一性原理是主观上的新概念化和简化。但两者都希望达到揭示事物深层特征和规律的目的 注意 不要离开系统谈第一性原理 第一性原理主要用于理解本质，创新，优化，决策，体系结构等场景 ","permalink":"https://myself659.github.io/post/rt/first-principles-%E7%AC%AC%E4%B8%80%E6%80%A7%E5%8E%9F%E7%90%86/","summary":"\u003ch2 id=\"定义\"\u003e定义\u003c/h2\u003e\n\u003cp\u003e第一性原理(First Principles)是指从基本原理出发进行思考和解决问题的方法。其具体含义可以概括为:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e不做任何假设,客观看待问题,抛开已有的经验与习惯思维。\u003c/p\u003e","title":"第一性原理思考101"},{"content":"引子 先看一下这道数学题：\n画直线经过下图中九个点，并且做到不重复经过任何一个点。\n这里不是出题给大家做，只是引出话题。\n下面是这个问题的答案：\n这个答案并没有局限在题目中要求9个点，扩大到面的范围，由9个点范围扩大到16个点范围。如果一直在考虑9个点的范围这个题目你是不会找到正确的答案。解题的关键是：think outside of the box。在上面这道题主要打破只有9个点的限制，也就是跳出只有9个点的框框。\n至此，关键话题来了： think outside of the box，这里我将其翻译为跳出框架思考。\n定义 跳出框架思考是要尽可能地消除约束，从更多的视角或层次思考，发现更多的选项和方案。\n我们还是具体看几个例子吧。\n作为一名多年的码农，先从技术研发开始吧。跳出框架思考是指研发不要局限于技术，要多关注业务。具体看几个例子：\n实例1：以前看一个科技电影，大概是两个黑客比赛，谁先攻破系统，则对应灯亮作为获胜；其中黑客A紧急投入攻破系统，而黑客B却在电影需要下，轻淡幽闲地装B，带上主角光环的他其实心里早有准备，采用直接攻击灯控系统，降低攻击难度，同时利用规则的漏洞。这里黑客B看到规则里另一种含义：谁的灯先亮，谁就获胜，跳出一般人理解先攻破系统，再亮灯的习惯性思维。\n实例2：早期的阿里云CDN系统需要定位ip地址的地理位置，阿里云的工程师想到根据淘宝用户的收货地址来定位地理位置。\n实例3：互联网安全方面：如果微信账号被盗，可以通过社交关系找回；淘宝帐号找回，需要通过最近购物的测试；这些都是从多个维度确认帐号对应是用户是原来的用户，而不是仅仅通过密码和手机还确认用户。\n在工作方面，跳出框架思考要点之一就是员工要跳出员工的视角，学会站在老板或者上级的角度来思考问题。这里分享一个职场的技巧：\n在任何领域，众所周知，要让老板支持你的想法，最容易的方法就是让他认为这个想法是他的。\n在交易领域，对冲基金的操作手法也体现了跳出框架思考，如跨市场交易，跨地区交易。\n下面这个例子让我是佩服不已。 从上面例子可知，tk教主的朋友跳出员工与公司的二元框架，在二元框架下一般只有三种选项：\n不作处理，等其主动离职（水货一般都是没有水平，要想让他主动离开时间长，概率小） 逼他主动离职（需要耍手段，双方关系可能弄僵） 通过赔偿主动解雇（需要花钱） tk教主的朋友从员工，公司，人才市场的三元框架下思考，通过上面的方法，达到不止双赢，而是三赢：\n公司摆脱了水货，并且将水货送到竞争对手的公司，去祸害竞争对手，算是打击了竞争对手 水货员工得到加薪 猎头成交一笔大单，获得丰厚的报酬 在自然语言处理领域，科学家跳出了语法与主义的框架，改用统计分析的方法，大大促进的自然语言处理技术的进步，也才有现在推荐与搜索技术的广泛应用。\n跳出框架思考是如此充满威力，那如何培养自己的跳出框架思考的能力呢？\n如何培养跳出框架思考的能力 记录灵感，避免刻意思考 平时记录自己一些想法与灵感，这种有充足的信息与思路储备的情况下，思考的灵活性就不会打折扣，相反由于信息与思路够多，这些信息与思路的形成新的结合，会有更多的想法出现。\n摆脱限制 跳出框架思考最重要的一步是摆脱限制，在思考方面不要给自己设限。\n广泛阅读与学习，并且多尝试与实践 平时要广泛阅读与学习，扩大信息源，广泛涉猎各个领域的知识，以技术领域为例，比特币技术综合了P2P技术，PoW共识，密码学，区块链等多种技术，同时结合经济学的知识，将数字货币与计算机技术紧密地结合在一起。\n5W1H替换法 从原因（何因Why）、对象（何事What）、地点（何地Where）、时间（何时When）、人员（何人Who）、方法（何法How）等六个方面提出问题进行思考，在此基础上对这6个要素进行替换，并尝试找到更多的替换选项。\n培养同理心 同理心能够让我们站在他人的角度来思考，有利于提供更多的视角。很多时候，我们不能跳出框架，是因为我们缺少视角。\n避免以目标为中心 避免以目标为中心的思维方式，目标更应该是一个导向的作用。目标很重要，但是目标并不代表全部，目标并不是系统。眼睛全是目标，就看不到系统，也就不能从从系统中发现更多的其他可能性。\n后记 ”不识庐山真面目，只缘身在此山中“。 ”当局者迷，旁观者清“。 学会跳出框架思考，会给我们带来更多的视角，看见不同的世界，提高我们的视野与格局。 ","permalink":"https://myself659.github.io/post/learn/think-outof-box/","summary":"\u003ch2 id=\"引子\"\u003e引子\u003c/h2\u003e\n\u003cp\u003e先看一下这道数学题：\u003c/p\u003e\n\u003cp\u003e画直线经过下图中九个点，并且做到不重复经过任何一个点。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/images/think/9-dot-question.png\"\u003e\u003c/p\u003e\n\u003cp\u003e这里不是出题给大家做，只是引出话题。\u003c/p\u003e\n\u003cp\u003e下面是这个问题的答案：\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/images/think/9-dot-answer.png\"\u003e\u003c/p\u003e\n\u003cp\u003e这个答案并没有局限在题目中要求9个点，扩大到面的范围，由9个点范围扩大到16个点范围。如果一直在考虑9个点的范围这个题目你是不会找到正确的答案。解题的关键是：think outside of the box。在上面这道题主要打破只有9个点的限制，也就是跳出只有9个点的框框。\u003c/p\u003e","title":"谈谈跳出框架思考"},{"content":"定义 首先我们来看一下反脆弱性的定义。这里直接借用：\n有些事情能从冲击中受益，当暴露在波动性、随机性、混乱和压力、风险和不确定性下时，它们反而能茁壮成长和壮大。不过，尽管这一现象无处不在，我们还没有一个词来形容脆弱性的对立面。所以，不妨叫它反脆弱性（antifragile）吧。\n接下来我们来探究一下数字货币反脆弱性体现在哪些方面？需要说明一下这里的数字货币是指比特币和以太坊。\n具体如下：\n构建在坚实的科学基础之上 强大的抗打击能力 去中心化组织 保持开放性 开拓独特性并保持领先 超越主权资产配置 构建在坚实的科学基础之上 比特币与以太坊都是构建在数学、密码学、计算机科学等基础之上。以比特币为例，比特币的技术由密码学、分布式帐本、PoW共识、P2P等组成。这些技术都得到无数次实践证明或者简单可靠。正是因为有这些科学基础，整个比特币系统一直可靠运行，没有出现一笔交易错误。\n强大的抗打击能力 以比特币为例，比特币具有很强的抗打击能力。比特币曾被媒体宣布死亡近400次，被部分政府定义为非法，打击比特币交易，自身生态也遭受到交易所被盗、比特币分叉之争等重大事故，但是到了现在，比特币的链上交易依然活跃，始终稳居加密货币王座，同时也是每个月开发更新最多最频繁的加密货币。\n去中心化组织 比特币节点网络是一个去中心化组织，类似于海星，具有极强的生命力：\n海星这种生物是没有头的，它的智能控制分布在肢体的各个部分，砍掉海星的一条手臂，这个手臂可以演化成另一个海星。海星就是一个去中心化的组织系统。\n比特币网络由千千万万的节点（矿工）组成，这些节点维护网络安全和共识账本，即使一部分节点掉线甚至退出，也不影响比特币整个网络的运行，整个网络具有极强的高可用性。同时这种多个节点运行的模式，也有利于对抗攻击。\n保持开放性 无论是比特币还是以太坊都有很好的开放性，其开放性体现如下：\n节点自由加入与退出 代码开源 社区开放，支持各种BIP与EIP，促进比特币与以太坊不断进化 开拓独特性并保持领先 独特性意味着不可替代性，并且会拥有独特性带来的先发优势。\n比特币是数字加密货币的鼻祖，同时也是第一个抗通胀的数字资产，是当之无愧的数字黄金，从诞生开始一直保持市值第一，在整个熊市过程中比特币的所占的市值份额是增长趋势。\n以太坊首先实现智能合约，并一直保持最大智能合约平台。\n超越主权资产配置 现在国际形势变化多端，中美关系降温明显，世界经济这些年的发展离不了经济全球化。在政治上全球化协作倒退的今天，已经全球化的数字货币正好可以抢占这一倒退空出的空间。毕竟长期来看，经济全球化是不可逆的趋势。数字货币可以在全球范围内实现了货币自由（从另一个角度数字货币提供一种新的自由方式：货币自由）。\n资产配置的需要 现在由于大数据的发展与应用，富人的钱基本处于透明状态。这时候数字货币的匿名性与抗监管满足这些人的需求。\n后记 说明一下，虽然数字货币价格波动范围较大，但是从一个货币的角度来看数字货币具有很强的反脆弱性。个人投资由于价格波动大而出局，体现了数字货币系统的遍历性。\n","permalink":"https://myself659.github.io/post/blockchain/cryptocurrency_antifrangible/","summary":"\u003ch2 id=\"定义\"\u003e定义\u003c/h2\u003e\n\u003cp\u003e首先我们来看一下反脆弱性的定义。这里直接借用：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e有些事情能从冲击中受益，当暴露在波动性、随机性、混乱和压力、风险和不确定性下时，它们反而能茁壮成长和壮大。不过，尽管这一现象无处不在，我们还没有一个词来形容脆弱性的对立面。所以，不妨叫它反脆弱性（antifragile）吧。\u003c/p\u003e","title":"谈谈数字货币的反脆弱性"},{"content":"新型冠状病毒（Covid-19）在全球的传播与感染速度有一定的控制，但是并没有结束。全世界累计确诊已经超过了500万，累计死亡人数超过了30万。新型冠状病毒是数十年来最危险，最棘手的新型病毒性之一。它可以攻击体内几乎所有器官，并可能造成毁灭性的伤害。\n下面我们看一下美国发布的新型冠状病毒的症状有哪些？\n上面这张图并没有包括中国前一段时间发布新型冠状病毒可能攻击男性的生殖系统的内容。\n这些导致这些器官的症状的原因并没有完全的科学解释，医疗界还在研究中。新型冠状病毒是一个新型的病毒，人体是一个复杂的系统，在短短几个月弄清楚其中的原理也是不太现实。\n关于美国发布的这个新型冠状病毒的症状，个人认为还是具有很大的参考价值：\n美国的感染人数超过了160万，全球第一，有大量的数据和案例提供研究，大量的样本保证其可靠性 这个新型冠状病毒的症状出自美国顶级大学与科研机构之手（当然也是世界顶级，要承认事实） 美国开放性的言论与研究环境 另外全球疫情在全球经济落后，医疗不发达的国家和地区更是难以应对，这会是全球的防控疫情最大的不确定，典型的例子就是巴西，巴西确诊数已经仅次于美国，居于世界第二。\n参考 Coronavirus May Be a Blood Vessel Disease, Which Explains Everything 金银潭出院新冠患者追踪：超 7 成半年后仍有症状 ","permalink":"https://myself659.github.io/post/covid-19-symptom/","summary":"\u003cp\u003e新型冠状病毒（Covid-19）在全球的传播与感染速度有一定的控制，但是并没有结束。全世界累计确诊已经超过了500万，累计死亡人数超过了30万。新型冠状病毒是数十年来最危险，最棘手的新型病毒性之一。它可以攻击体内几乎所有器官，并可能造成毁灭性的伤害。\u003c/p\u003e","title":"分享：一图了解新型冠状病毒的症状有哪些"},{"content":"首先了解一下作者：纳西姆·塔勒布，研究不确定性的专家，华尔街明星交易员。他先后出版“不确定性”四部曲：《随机漫步的傻瓜》、《黑天鹅》、《反脆弱》和《非对称风险》。读完《非对称风险》这本书，你发现作者是一个直言不讳的真性情中的人，在书中直接点面道姓的怼名人（包括巴菲特）。\n书中精句不少，例如这句：\n你永远无法说服一个人他错了，只有现实才能教育他。\n什么是非对称风险？ 市场参与者所承担的风险和收益是不对称的。塔勒布把由此引发的风险叫做“非对称风险”。典型如2008年美国的金融危机的华尔街精英们，他们玩的是自己赚钱，民众买单的勾当。在生活中一些银行的业务员只管放长期贷款，等货款到期的时候，他早就离职不干了，后面出现了什么债务风险，他一点责任都不用担，只管放货拿提成。\n有哪些非对称风险？ 书中提到非对称风险分为以下几类：\n信息不对称 权力和责任不对称 少数派主导 理论与实践不对称(书中未明确提出，个人总结) 信息不对称 信息是生活的基础元素，如同空气。信息不对称随处可见。中国大部分人的信息不对称都受到防火墙的影响。\n在经济活动中最常见就是交易双方一方比别一方掌握的信息更多，具体例子如书中提到的罗得岛粮食的价格。\n权力和责任不对称 最典型例子就是书中提到西方干涉主义。现实中的例子就是伊拉克、叙利亚与利比亚等受到西方的干涉行动，最终给当地人民带来了巨大苦难。但是这些西方国家动用强权对别国进行干涉，却根本不需要为自己的错误买单，不用承担任何责任，甚至标榜自己了“成功赶跑了独裁者”。\n少数派主导 只要人群中有3%~4%的顽固少数派，那么，最终整个群体的人都会服从少数派的偏好和选择。生活中最典型的例子：一桌子人聚会吃饭，都用本地方言聊天。这时候来了一个远道而来的客人，他不会说本地话，只会说普通话。为了能让他听懂，结果一桌子人全部改用普通话聊天。\n理论与实践不对称 现实是不确定性，现实是一个复杂系统，理论或是出自实验，或来自逻辑，理论视角有限，但是现实是时间的产物，是无数动力相互作用的结果，同时结构复杂。而所有的实践都是基于现实，可以说现实是实践的环境。现实比理论的环境复杂多了。没有注意到理论与实践不对称在军事上最典型的例子就是赵括纸上谈兵，导致40万赵军被坑杀，成就了白起成为战国战神的神话。\n如何应对非对称风险？ 风险会一直存在，非对称风险也会一直存在。那么我们如何应对非对称风险？这也是我们读这本书最终目标。\n避免思考三大坑 识别风险需要思考，思考要注意避免以下三大坑：\n只考虑静止的状态，而不考虑动态的机制 思考是低维度而非高维度的 只想到了采取什么行动，而没有想到行动本身会有反作用 避免思考三大坑，才能减少识别风险的错误。\n识别非对称风险 首先看一张书中总结一张图：\n识别风险还要注意以下几点：\n区分波动和风险，防止成为非对称风险的教条主义者 重点关注那些带来不可逆转的伤害的风险 识别风险，才能应对风险。\n生活中有各种推荐买房和推股的人，他们都会告诉你推荐你买的房子会涨和精选的股票也会让你获利，但是他们都没法证明他们自己入场了。他们的信息隐藏了非对称风险，或者这些信息就是假消息。\n学习与应用概率理论 随机无处不在，随机无时不在。随机带来不确定性，不确定性需要用概率来描述，应对不确定性需要概率理论来指导。\n那我们还是先看几个概念：\n上图有两个重要的概念。\n集合概率：100个赌徒在1天时间里的成功概率\n时间概率：其中一个赌徒在100天的时间内赌运\n平均斯坦：一个事物的过程主要由平均值主导，很少有极端成功或失败的例子（比如牙** 医的收入）。个体不会对整体造成很大的影响，它也被称作“薄尾”风险，也是高 斯分布的一种。\n极端斯坦：在一个随机过程中个体会对总体造成巨大的影响（比如作家的收入），它也 被称作“胖尾”风险。它包含分型、幂律等分布类型。\n遍历性：在本书的语境下，遍历性是指对一群人在同一时间的统计特性（尤其是期望 ）和一个人在其全部时间的统计特性一致。集合概率接近于时间概率。如果没有 遍历性，那么观测到的统计特性就不能应用于某一个交易策略，如果应用的话， 就会触发“爆仓”风险。\n结论：\n越高频越重要。如作为一个程序员你每天要用电脑，那么你的电脑一定要配置好。（每天重复就是时间概率上的高概率）\n永远不要将倍增的、系统性的胖尾风险和不倍增的、特殊的薄尾风险相提并 论。\n概率越高，确定性越高，也就越可靠，可靠的事物具有长期的优势，这是一种概率上的优势的体现。\n不断重复地暴露在风险之中，无论多么小的概率的危险，最终都会发生。\n说出你的想法，付出行动，承担风险。just do it！\n风险共担机制 你愿意为一个事物承担多大的风险，揭示了你对该事物的信任程度。\n常见风险共担机制：\n华尔街银行家来说，风险共担就是要让他们自己拿出真金白银，和客户的资金绑在一起进行操作 IBM CEO郭士纳规定：高级经理必须自己掏钱购买一定数量的IBM股票，才可以获得公司的股票期权。郭士纳相信，高级经理们只有自己真正投入了成本，才可能真正关切公司的命运。并且同时自己也以身作则，在上任之初就从公开市场上买入了IBM的大量股票 一些投资人要求创业者要求投入资金，并且进行对赌 投名状，典例例子就是《水浒传》里的王伦要求林冲入伙前要以杀人方式纳投名状 两个人结婚，共同生活也共同应对未来生活的风险 欧洲的贵族由于承担了对其领地上平民的保护的义务和风险，才换取了自己的贵族地位。如果你不能为人民承担风险，那么你无法成为他们的领袖。 总之，风险共担就是全身心投入，享受收益也承担风险。\n审慎原则，保持理性 审慎原则就是小心求证，宁可错过，也不要犯错。这一点特别在投资领域很实用，无论股票还是基金每天都有新的机会；审慎原则是追求高的确定性，在投资方面就是对大部分机会说不。\n保持理性的最好方式就是一个清晰明确的目标，而这个目标就是：\n真正的理性，就是避免系统性毁灭。\n所谓理性就是首先保证自己所在的集体生存更长时间。\n要赚钱，你首先得活得长。\n要防止自己成为系统遍历性的牺牲品。\n致知如行，知行合一 致知如行，知行合一，这是中国古代的智慧的精华之一，也是应对理论与实践存在不对称风险最好的方式。\n在岸上永远学不会游泳，学习再多的游泳知识都不能变现，基于连个测试的机会都没有。\n在生活中很多人都面临这样一个困惑：为什么你听过这么多道理，却依然过不好这一生？其实道理与现实，理解与做到并不是一回事。\n谨记：空谈无用。少说话，多做事，先做再说，宁可只做不说也不要只说不做。\n后记 《非对称风险》这本书内容分散，不系统，但是角度新颖，让人大开眼界，对于概率的理解让人受益匪浅，整本书有充满实用主义和实干主义气息，值得精读。\n参考 暴跌中的大赢家：塔勒布大弟子狂赚40倍的秘密 ","permalink":"https://myself659.github.io/post/rt/book-skin-in-the-game-how/","summary":"\u003cp\u003e首先了解一下作者：纳西姆·塔勒布，研究不确定性的专家，华尔街明星交易员。他先后出版“不确定性”四部曲：《随机漫步的傻瓜》、《黑天鹅》、《反脆弱》和《非对称风险》。读完《非对称风险》这本书，你发现作者是一个直言不讳的真性情中的人，在书中直接点面道姓的怼名人（包括巴菲特）。\u003c/p\u003e","title":"读书笔记:《非对称风险》"},{"content":"在知识经济与日新月异的时代，学习的重要无须多言。这个时代正在惩罚不学习和不会学习的人。\n从整个知识体系上来看，如何学习属于元知识，属于基础知识。越基础越重要。那么如何培养自己的学习能力？在开始之前，我将学习能力划分两个子能力：\n快速学习能力 深度学习能力 本文内容限定在如何提高自己的快速学习能力？提高快速学习能力有三个方面：\nInput：保证动力输入从而享受学习的过程 Process：正确的学习的路径与方法 Output：保证学习的有效输出 保证动力输入从而享受学习的过程 学习动力有多种，如兴趣爱好、虚荣心、利益、恐惧等多种因素。最佳的动力属于兴趣爱好，这种动力持续时间长， 对外界依赖很小，能够让人真正地享受学习的过程。享受学习才能快乐学习，快乐学习带来快速学习。 越越享受学习的内容，那么掌握它的速度就越快。 享受学习带来主动学习，这样会主动找学习的内容，主动花时间学习，主动提高学习的优先级。 享受学习可以维持更长更好的学习状态。\n三千弱水只取一瓢饮。所以一定找到让自己的感兴趣的学习内容，并在学习过程中培养与强化兴趣。\n如果你要学习的内容正是你感兴趣，那么恭喜你，快速学习的第一要点你已经具备。 但是生活不是事事如意，如工作需要学习的内容并不都是你感兴趣的内容。 在这种情况，如何培养自己的兴趣呢？ 举一个例子，假如你对编程不感兴趣，但是你对经济股票感兴趣，你可以学习python分析股票的数据，这样的话，对股票的兴趣为你提供学习编程的动力。\n正确的学习的路径与方法 动力有保证，第二个问题来了：如何在动力的作用下，找到正确的学习路径和方法？而不是采用低效的方法和错误的路径来白白消耗珍贵的学习动力。\n关于学习的方法有很多介绍，这里推荐一个视频:The first 20 hours \u0026ndash; how to learn anything | Josh Kaufman | TEDxCSU。这个方法将学习分为以下四个要点：\n分解步骤：把技能做最大程度的细分，分成若干小步骤。 充分学习： 对每个小步骤进行充分学习，以便进行灵活的练习，并在练习中自我纠正。 克服困难：克服在练习中出现的生理、心理或者情绪上的障碍。 集中练习—— 至少用20小时集中学习最重要的小步骤。 关于学习的路径的问题，这里以golang编程语言为例，其初略的学习路径：\n先语法，再应用，然后原理 先实验，再工程，然后优化 先动手实践，再解决问题，然后是总结提高 详细的内容请参考文末的原文链接。\n保证学习的有效输出 输出就是测试学习的成果，能及时反馈与及时改进。\n输出是一种反馈。\n输出的评价有三个方面的指标：\n学习内容的掌握效果 学习在经济方面的回报(如金钱与影响力) 学习动力是否在增强 关于学习内容的掌握效果最好的方式就是分享。很多人将分享作为一种学习的方法，我更看作是一种学习的有效输出。分享的内容是学习的产出，同时这种方式的产出效果属于最佳，除此之外分享会有带来影响力，影响力能够进一步增强学习动力。可知分享是将上面提到的三个指标为一体最佳学习输出方式。\n那么如何进行分享呢？向伟大的解释者费曼学习。学习用简单直观的方式解释并教会他人。伟大物理学家爱因斯坦也曾表示：\nIf you can\u0026rsquo;t explain it simply, you don\u0026rsquo;t understand it well enough. 如果你不能简单明了地解释一件事情，那么说明你还没有很好地理解它。\n分享可以先从写作开始如先从记录开始，写下自己的学习问题与感悟总结，然后再发表自己的博客上面，接着尝试分享给专业人士，进一步向普通大众分享。\n小结 学无止境。如果将学习比作一条永无止境的道路，快速学习可以让你走的更快，更远，经历更多的风景。\n参考 谈谈工作和学习中，所谓的主动性 ","permalink":"https://myself659.github.io/post/learn/how-to-learn-fast/","summary":"\u003cp\u003e在知识经济与日新月异的时代，学习的重要无须多言。这个时代正在惩罚不学习和不会学习的人。\u003c/p\u003e\n\u003cp\u003e从整个知识体系上来看，如何学习属于元知识，属于基础知识。越基础越重要。那么如何培养自己的学习能力？在开始之前，我将学习能力划分两个子能力：\u003c/p\u003e","title":"关于快速学习的思考"},{"content":"现状 疫情从武汉爆发开始，到现在全球蔓延，全球确诊超过了226万。国内广州与黑龙江有复发的态势。但是全国基本上已经控制住，防控成绩也算相当不错（除武汉疫情初期）现在全国基本上暂时处于后疫情阶段。\n但是疫情还是处于不确定状态，个人判断理由如下：\n对于病毒来源未知 对于病毒的了解与探究还在进行中 无特效药冶疗 疫苗最快1年才能上市 病毒是单链结构，会发生变异 是否在印度、非洲、南美洲等公共卫生条件较差的国家蔓延？ 秋冬季是否会第二次爆发？ 无症状感染者难以检查 各国能否相互团结？现在看来国际社会之间已经出现不少裂痕 疫情下的经济 中国第一季度GDP同比负增长6.8%。疫情期间80%的行业受到严重打击，受益主要是下面十几个行业：\n医疗卫生行业 互联网医疗 养生保健行业 居家运动器材 AI产业 社区生鲜电商 自媒体 电商 在线培训与培训 远程办公软件 视频会议平台 VR、AR场景体验 网络游戏 在线影视 远程医疗 其他行业的基本都是受到冲击，这是不列举，列出受益的行业，希望大家能从上面的行业找到属于自己的机会。\n疫情后的趋势 人类历史战胜天花，黑死病，西班牙大流感。这次疫情终会过去。那么经历这次疫情整个世界有哪些新趋势呢？\n数字化增强 越来越多的行业会数字化，这有利于以下这些行业：\n云计算平台 远程工作平台 AR/VR 游戏 视频 电商 区块链 远程工作会越来越多 疫情阶段全世界在测试远程工作，同时也在测试过程中优化远程工作，人们也在这次疫情养成远程工作的习惯。远程工作在知识服务这个领域会成为默认选项。\n自动化将会进一步发展 在数字化的基础上，自动化发展主要体现机器人技术与远程控制技术的发展。如美国在疫情期间使用医疗辅助机器人。\n在线教育 虽然在K12这块教育会回归线下，但是线上仍会保留。对于高等教育而言，大学生一般都 有一定的自制力和自学能力，线上教育的选择更多同时时间也会更加自由，相信未来会出现一些网络大学，这些网络大学能够像普通大学一样能够颁发文凭。\n全球化短期受阻，长期向好 2020年4月8日，中共中央政治局常务委员会提出：\n做好较长时间应对外部环境变化的思想准备和工作准备。\n这是近期的较确定的发展方向。如最近美国与日本鼓励企业将产业链搬出中国。这些国家的产业链依赖中国，实质上损害本国的经济安全，从长远上看迁部分产业如医疗与医药有利于提高本国的经济安全。但是信息的全球化却会加强，解决病毒问题需要全球协作，制定国际准则，监测和报告系统，并制定协调的对策和应急计划，这样有利于全球性问题的防范与处理。避免像这次疫情在二月份在武汉已经爆发，但是还是在3月份在全球蔓延起来。\n除此之外，全球化是超出一个国家范围的资源配置，在全球范围内最优化解决方案肯定会超出一个国家内的最优解决方案（局部最优并不是全局最优）。\n远程医疗 这次疫情期间，在医院发生不少聚集性感染的案例，未来在家就可以就诊是一个重要的发展方向。\n更多 当然疫情带来的变化，远不止上面这些。如人们生活方式与思考方式的改变。\n小结 疫情也许不会发生在你的身边，但它带来的改变却无处不在。提前思考与行动，有利于我们适应变化与把握机会。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/coronavirus-change/","summary":"\u003ch1 id=\"现状\"\u003e现状\u003c/h1\u003e\n\u003cp\u003e疫情从武汉爆发开始，到现在全球蔓延，全球确诊超过了226万。国内广州与黑龙江有复发的态势。但是全国基本上已经控制住，防控成绩也算相当不错（除武汉疫情初期）现在全国基本上暂时处于后疫情阶段。\u003c/p\u003e","title":"后疫情时代会有哪些变化"},{"content":"生产要素 生产要素是指在生产过程中所使用的各种资源，生产要素是实现生产过程的必要条件，可以通过组合使用来创造各种产品和服务。\n生产要素可以分下几类：\n劳动力 资本 土地及自然资源 技术 数据 生产要素就是财富 生产要素是财富的载体，生产要素创造财富。\n一个人或者组织财富能力可以用下面的公式描述：\n财富能力 = 生产要素的供应能力 * 生产要素的应用能力 * 生产要素的产出能力 * 生产要素的产出再产出能力。\n所以，积累生产要素是致富的必经之路。\n","permalink":"https://myself659.github.io/post/rt/%E8%B4%A2%E5%AF%8C-%E7%94%9F%E4%BA%A7%E8%A6%81%E7%B4%A0/","summary":"\u003ch2 id=\"生产要素\"\u003e生产要素\u003c/h2\u003e\n\u003cp\u003e生产要素是指在生产过程中所使用的各种资源，生产要素是实现生产过程的必要条件，可以通过组合使用来创造各种产品和服务。\u003c/p\u003e\n\u003cp\u003e生产要素可以分下几类：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e劳动力\u003c/li\u003e\n\u003cli\u003e资本\u003c/li\u003e\n\u003cli\u003e土地及自然资源\u003c/li\u003e\n\u003cli\u003e技术\u003c/li\u003e\n\u003cli\u003e数据\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"生产要素就是财富\"\u003e生产要素就是财富\u003c/h2\u003e\n\u003cp\u003e生产要素是财富的载体，生产要素创造财富。\u003c/p\u003e","title":"生产要素就是财富"},{"content":"什么是学到位 学到位可以分解为四个到位：\n理解到位 体系到位 融合到位 应用到位 理解到位 怎么做到理解到位？\n不多说，推荐费曼学习法。\nIf you can\u0026rsquo;t explain it simply, you don\u0026rsquo;t understand it well enough. 如果你不能简单明了地解释一件事情，那么说明你还没有很好地理解它。\n体系到位 应用第一性原理进行学习。\n参考elon musk的方法：将知识视为一颗树，首先确保你理解基本原则，也就是树干与主要树枝，然后再深入细节，即树叶。\n基础先行。越基础越重要，基础牢固，知识体系也才会牢固。\n融合到位 了解知识，理解知识，这些都是为了实践中应用知识，让知识为自己服务。\n应用知识是一个复杂的活动，应用知识往往并不是一个简单知识点的应用，而是一系列知识点的应用。\n所以应用知识之前，我们需要融合知识，实现举一反三，触类旁通。\n如何融合知识呢？\n那就是新学习的知识与原来的知识体系联系起来，通过尽可能地方式将知识联系起来，串联在一起，融合在一起。\n思维导图就是一种很好的连接与融合的形式。\n应用到位 将知识应用到具体一个问题，解决一个问题，甚至解决一类问题。从理论走向实践，知行结合，真正地让知识为自己服务。\n总结 理解是基础,体系是延伸,融合是内化,应用是升华。\n","permalink":"https://myself659.github.io/post/learn/%E5%AD%A6%E4%B9%A0%E5%88%B0%E4%BD%8D/","summary":"\u003ch2 id=\"什么是学到位\"\u003e什么是学到位\u003c/h2\u003e\n\u003cp\u003e学到位可以分解为四个到位：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e理解到位\u003c/li\u003e\n\u003cli\u003e体系到位\u003c/li\u003e\n\u003cli\u003e融合到位\u003c/li\u003e\n\u003cli\u003e应用到位\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"理解到位\"\u003e理解到位\u003c/h2\u003e\n\u003cp\u003e怎么做到理解到位？\u003c/p\u003e\n\u003cp\u003e不多说，推荐费曼学习法。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you can\u0026rsquo;t explain it simply, you don\u0026rsquo;t understand it well enough.\n如果你不能简单明了地解释一件事情，那么说明你还没有很好地理解它。\u003c/p\u003e","title":"说说学到位"},{"content":"2019年6月libra横空出世。我写了一篇关于libra的文章：Facebook libra是昙花一现还是星星之火。\n文章的提到：\n对，Libra最大的问题就是监管。由于Facebook是一个全球化公司，涉及不同的国家，这些国家的法律与政策也不尽相同。这对于Libra就是一个巨大的挑战。至于很多人担心Libra会不会是昙花一现，直接被扼杀在摇篮？前面有USDT的先例。答案是不会的，美帝的民主制度，都会有一番流程与讨论，估计过程并不会一帆风顺。有了美帝的放行，在其他的国家开展也就铺平了道路。\n如果Libra coin要挑战美元，那么美元就是Libra的最大竞争对手，这个挑战很大，近期应该不会出现。\n想想小扎与libra的总负责人Mr Marcus在国会受虐。libra在监管方面却不是一帆风顺，可以说是饱经折磨。\nlibra在新发布的白皮书，放弃挑战美元，相反而是走上与美元相互成就的道路。说一句话题外话：人民币要加油！（人民币只有开启自由兑换，人民币的国际化才算开始。）\n妥协 libra在新版白皮书做了以下妥协：\n提供单币种稳定币如美元与欧元 放弃未来向无许可公链的发展目标 加强合规，提高系统的安全性 总之，面对各国政府强监管的要求，libra选择断臂求生，主动拥抱美元，从挑战所有的法币，转而帮助美元维护霸权。\n机会 那么libra提供了哪些机会给大家呢？\n加入libra生态 加入libra生态有以几种选择：\n1、指定经销商；\n2、在金融行动特别工作组（FATF）成员司法管辖区中注册或获得许可的虚拟资产服务提供商（VASP，包括交易所和托管钱包），或是在FATF成员管辖区中注册或获得许可、并且根据此类许可或注册执行虚拟资产服务提供商活动（受监管的虚拟资产服务提供商）的虚拟资产服务提供商；\n3、已完成由 Libra 协会批准的认证程序的虚拟资产服务提供商（认证的虚拟资产服务提供商）；\n4、寻求通过 Libra 网络（无托管钱包）进行交易或提供服务的其他个人和实体。\n基本任何人都可以选择第四方式，这种方式基本上无资质门槛。\n参与基础设施建设 基础设施先行。参与基础设施如成为验证节点，验证节点是否有经济激励暂不可知，但是有很多信息优势与先发优势。\n技术先行 如果感兴趣可以学习一下rust。最重要是学习move，libra上线后基于move的智能合约有一个爆发的过程。\n研究集成libra的平台 libra是facebook主导，相信facebook旗下的app都会集成libra。这些app如instagram，whatapp， messager，facebook都是10亿级用户。各种新机会参考支付宝与微信支付。机会肯定不少。以太坊的一些成功应用都值得借鉴。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/libra2-basic/","summary":"\u003cp\u003e2019年6月libra横空出世。我写了一篇关于libra的文章：\u003ca href=\"https://mp.weixin.qq.com/s/VfEdpXKbokJ6D3ZfeTuKTg\"\u003eFacebook libra是昙花一现还是星星之火\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e文章的提到：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e对，Libra最大的问题就是监管。由于Facebook是一个全球化公司，涉及不同的国家，这些国家的法律与政策也不尽相同。这对于Libra就是一个巨大的挑战。至于很多人担心Libra会不会是昙花一现，直接被扼杀在摇篮？前面有USDT的先例。答案是不会的，美帝的民主制度，都会有一番流程与讨论，估计过程并不会一帆风顺。有了美帝的放行，在其他的国家开展也就铺平了道路。\u003c/p\u003e","title":"libra的妥协与机会"},{"content":"什么是系统 先看wiki的定义：\nA system is a group of interacting or interrelated elements that act according to a set of rules to form a unified whole. A system, surrounded and influenced by its environment, is described by its boundaries, structure and purpose and is expressed in its functioning. Systems are the subjects of study of systems theory and other systems sciences.\nSystems have several common properties and characteristics, including structure, function(s), behavior and interconnectivity.\n根据wiki定义可知：\n系统是由相互依赖的部件组成的一个整体,它与环境交互,以实现特定的目标或功能。 从结构上看系统由多个部件组成的 系统中的各个部件存在相互关系和相互依赖。 系统具有特定的系统目标或功能。系统存在的意义就是为了完成某个目标或实现某种功能 系统会接收来自环境的输入,并产生输出反馈给环境。 系统具有整体性。系统作为一个整体,并不是简单各部件的相加与组合 系统具有协同作用。系统的协同作用产生的效果大于各个子系统独立作用的效果之和 一切都是系统 一切都是系统。系统无处不在，无时不在。\n宇宙万物皆可视为系统。从微观的原子系统,到生物生态系统,再到宏观的太阳系,都可看作是一个有组织、有结构的系统。 任何事物都不可能脱离系统而独立存在。系统无处不在。一切事物都必然属于并受制于某个更大的系统。 系统具有时间维度。不仅存在空间上的系统,还存在时间上的系统脉络。任何瞬间都是系统演化的一个时间切面。系统无时不在。 系统奠定一切存在的基础。没有系统作为存在的基础,就不会有任何意义上的存在。系统是理解存在的关键。 系统决定自身以外事物的属性。事物的属性都源自它所处的系统环境。系统影响一切。 一切问题都应该以系统的眼光来审视。采用系统思维分析问题,注意事物的关联性及其相互作用。 系统的重点 应该关注系统的重点有哪些？\n系统的边界 系统的结构与组成 系统内的连接与反馈 系统的属性 系统的作用与目标 系统的复杂性 系统的复杂性体现如下：\n系统由大量简单的部件构成 这些部件之间大量通过交换能量或信息动态地相互作用与影响。即使特定元素仅与少数其他元素相互作用，这些相互作用的影响也会传播到整个系统，而且这些相互作用与影响是非线性的。 有许多直接和间接的反馈循环。 系统是开放系统，它们往往在非平衡的条件下与环境交换能量或信息。 系统具有记忆(状态)，但记忆(状态)并不位于特定位置，而是分布在整个系统中。因此，任何复杂的系统都有记忆(状态)，而记忆(状态)对于系统的行为至关重要。 系统的行为是由交互的性质决定的，而不是由组件中包含的内容决定的。由于相互作用是丰富的、动态的、反馈的，并且最重要的是非线性的，因此无法通过对其组件的检查来预测系统作为一个整体的行为。 “出现” 的概念就是用来形容这个方面的。涌现属性的存在并不能提供反对因果关系的论据，而只能反对确定性的预测形式。 系统具有适应性。他们可以在没有外部代理干预的情况下（重新）组织其内部结构。 什么是系统思考 继续看wiki的定义：\nSystems thinking is a way of making sense of the complexity of the world by looking at it in terms of wholes and relationships rather than by splitting it down into its parts. It has been used as a way of exploring and developing effective action in complex contexts, enabling systems change. Systems thinking draws on and contributes to systems theory and the system sciences.\n系统思考是一种把问题或对象视为一个整体的复杂系统来进行分析和解决问题的方法。\n系统思考的主要特点包括:\n整体观:系统思考将问题看作一个有机整体,着眼于系统内部不同组成部分之间的关系和依赖。 动态观:系统思考认为系统内部各组成部分之间存在动态的相互作用和复杂的反馈回路机制。 关联观:系统思考会考虑问题可能与更大环境的各种关联,不孤立地看待问题。 循序渐进:系统思考采取循序渐进的方式对系统进行分析,从整体到局部,从宏观到微观。 模式识别:系统思考寻找问题背后的普遍模式和规律,并以此指导问题解决。 采用系统思考的主要步骤包括:定义问题、识别系统关键要素、分析要素之间的关系、找到高杠杆点和解决方案等。 系统思考是一种对复杂问题采取整体、动态、关联的分析方式,这有助于找到更加根本和有效的解决方案。它是解决复杂系统性问题的重要思维模式。\n根据上面的总结，可以将系统思考定义为一个公式：\n系统思考 = 整体（全局）思维+动态发展思维+连接反馈思维+迭代分析思维+总结归纳思维。\nPeter Senge’s 11 Laws of Systems Thinking Law 1: Today’s problems come from yesterday’s “solutions.”\nLaw 2: The harder you push, the harder the system pushes back.\nLaw 3: Behavior grows better before it grows worse.\nLaw 4: The easy way out usually leads back in.\nLaw 5: The cure can be worse than the disease.\nLaw 6: Faster is slower.\nLaw 7: Cause and effect are not closely related in time and space.\nLaw 8: Small changes can produce big results… but the areas of highest leverage are often the least obvious.\nLaw 9: You can have your cake and eat it too — but not all at once.\nLaw 10: Dividing an elephant in half does not produce two small elephants.\nLaw 11: There is no blame.\n如何提高系统思考能力 可以从三个方面来提高系统思考能力：\n学习并掌握系统的原则如上面提到的10个原则 学习并掌握思考系统的方法 学习并掌握思考系统的工具 系统思考注意问题 避免过度思考 避免想太多导致没有行动 避免不能抓住重点与关键 ","permalink":"https://myself659.github.io/post/rt/systems-thinking101/","summary":"\u003ch2 id=\"什么是系统\"\u003e什么是系统\u003c/h2\u003e\n\u003cp\u003e先看wiki的定义：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA system is a group of interacting or interrelated elements that act according to a set of rules to form a unified whole. A system, surrounded and influenced by its environment, is described by its boundaries, structure and purpose and is expressed in its functioning. Systems are the subjects of study of systems theory and other systems sciences.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSystems have several common properties and characteristics, including structure, function(s), behavior and interconnectivity.\u003c/p\u003e","title":"说说系统思考"},{"content":"定义 思考是一个多方面的认知过程，包括多种心理活动，如推理、逻辑、直觉、本能、可视化、想象、感知、解决问题和决策。\n那么什么是清晰地思考呢？\n在日常生活清晰思考是指头脑清楚，思路清晰。\n清晰地思考是指逻辑连贯地推理、分析和做出决策的能力，没有混乱、偏见和模糊的判断。 清晰地思考的要素如下：\n明确的思考范围 明确的思考目标 清晰的思考结构 简洁有序的思考过程 有效的目标实现路径 明确的思考结论与记录 基础 身体与能量 适当的运动 充足与高质量的睡眠 高质量的娱乐与休息调节 情绪与心态 积极主动的心态 愉快轻松的心情 清醒,理智,客观的心态 环境与关系 不被打扰与整洁有序的思考环境 充分自由轻松且有挑战的思考空间 远离并过滤噪音 良好的人际关系 原则 第一性原理 二八法则 one-thing，拒绝多任务 专注与安静环境 思考与行动结合，致知于行，追求知行合一 打造远离社交媒体的信息环境 避免过度思考 躬身入局skin in the game 实事求是 基于优先级做减法 定期整理与反思 方法 结构化思考 系统思考 逆向思考 跳出框架思考 第一性原理思考 问题驱动思考 可视化思考 tips 明确问题。把问题准确地陈述出来,清晰界定问题的范围。 收集信息。尽可能多的收集相关信息,做充分的准备工作。 忽略不相关信息。避免用不相关信息分散注意力。 停下来思考。不要被紧张感促使立即做决定,先停下来仔细思考。 分解复杂问题。将复杂问题分解成几个可管理的子问题。 寻找模式。查找信息中的模式,这些模式可能提供答案的线索。 查漏补缺。检查是否留下关键信息或观点,避免漏洞。 建立逻辑链。按严密的逻辑顺序将信息和想法串联在一起。 批判性思维。批判性地审视自己的思维过程和理解。 再检查一遍。再次仔细检查结果,避免疏漏和情绪性偏见。 保持开放态度。始终保持开放和怀疑的态度,避免盲目执著。 ","permalink":"https://myself659.github.io/post/rt/thinking-clear/","summary":"\u003ch2 id=\"定义\"\u003e定义\u003c/h2\u003e\n\u003cp\u003e思考是一个多方面的认知过程，包括多种心理活动，如推理、逻辑、直觉、本能、可视化、想象、感知、解决问题和决策。\u003c/p\u003e\n\u003cp\u003e那么什么是清晰地思考呢？\u003c/p\u003e\n\u003cp\u003e在日常生活清晰思考是指头脑清楚，思路清晰。\u003c/p\u003e","title":"如何清晰地思考"},{"content":"初识冥想 虽然以前也知道冥想，但是却没有对冥想产生什么兴趣。直到2018年去台湾遇到一个很有经历的人，先后在google，百度，阿里等公司从事互联网方面的工作，开过民航飞机，后面又回台湾在高校里读博士，同时英文也相当流利，与老外沟通毫无压力。除此之外，他还告诉我他的睡眠质量相当高，入睡超级快。而自己从小就入睡慢，虽然睡眠质量还算可以。于是我好奇地问他：你是怎么做到这么高的睡眠质量？\n他回答我： 我练习冥想，每年都去香港专门的参加一周的冥想练习，不带手机，与世隔离一周。\n他的回答激起我对冥想的兴趣。\n冥想的好处 光有兴趣还不行，得从中得到好处。那么冥想的好处有哪些呢？这里罗列如下:\n冥想可以增强您对疼痛和痛苦的承受能力，如冥想增强个人平静的能力，即使面对混乱也能保持平静，增加过滤噪音的能力 冥想可以改变你的大脑, 提高大脑的能力，如冥想可以提高专注力 冥想可以减少不良情绪，如冥想可以减轻抑郁，压力，焦虑等 冥想有助力于身体健康，如冥想可以降低血压和心理压力 冥想让人更加快乐，如冥想过程的空灵和专注，会让人忘记烦恼，享受与身体对话的喜悦 冥想是一种低成本高收益的选择，如高质量的5分钟冥想相当于一个小时的睡眠 为自己找到好处的落脚点 上面的冥想的好处，我在一年前就知道，然并卵。我当时依旧没有学会冥想。直到这次疫情爆发，新型肺炎没有特效药，主要看个人的免疫力。这时候跑步与冥想成为我个人的增加免疫力的主要方式。严重的疫情成了我练习冥想的外界驱动力。于是在家开始练习冥想，慢慢地就学会了冥想，在这个过程中，个人注意力得到提升，入睡时间缩短到了半个小时以内，这些实实在在的好处，又让我继续坚持冥想，这是一个十分良好的正向循环。\n建立自己的冥想基本操作 人的大脑像一部永远不停运转的机器，很难停下来，冥想让大脑从mindful状态进入到mindless状态。对于任何初学者来说，实现mindless都是有困难的。那么如何建立冥想基本操作呢？具体分为几个问题来说明。\nQ：什么时候冥想？\nA：个人一般都是早上醒来就立即开始冥想。\nQ：在哪里冥想？\nA：床上，这样天气冷的时候也可以给自己盖个被子\nQ：冥想的姿势？\nA：类似于打坐即可，不用太死板，自己觉得舒服即可\nQ：冥想教程选择哪个？\nA：推荐用UCLA分享的免费冥想教程，除此之外今天发现keep上线冥想功能\nQ：冥想的时间多长？\nA：刚开始5分钟，后面慢慢到10分钟，20分钟\nQ：冥想如何避免不专注？\nA：找到专注的锚，建议刚开始专注于呼吸，如果出现注意力分散，不要在意，重新拉回注意力到呼吸即可\nQ：冥想用什么背景音乐？\nA：我暂时没有用背景音乐，背景声音倒有，是UCLA冥想课程的引导冥想的内容\nQ：冥想中间不能坚持怎么办？\nA：将思绪拉回到呼吸，至少保证眼睛闭着，除了轻微的动作，身体基本无其他大的动作\n养成习惯 自己写的代码6个月不看，差不多相当于是新的代码。冥想也需要不断的练习，保证不断地练习最好的方式就是养成习惯。\n习惯建立现有生活方式基础最好也最容易建立成功，个人觉得养成冥想的习惯最好的方式就是锚定自己的生活习惯。如早上起床前和晚上睡觉前这两个时间段进行冥想就是非常好的选择。\n小结 从兴趣出发，发现好处，落到自己的实处，做好每一次冥想，从中感受冥想，进而获得平静喜悦淡定，锚定平时的生活规律，从而渐渐地养成冥想的习惯。\n开始冥想吧，这是一个让你受终生的生活方式与习惯。开始并坚持一段时间，你会找到冥想的感觉，并享受冥想。\n","permalink":"https://myself659.github.io/post/life/meditation-start/","summary":"\u003ch1 id=\"初识冥想\"\u003e初识冥想\u003c/h1\u003e\n\u003cp\u003e虽然以前也知道冥想，但是却没有对冥想产生什么兴趣。直到2018年去台湾遇到一个很有经历的人，先后在google，百度，阿里等公司从事互联网方面的工作，开过民航飞机，后面又回台湾在高校里读博士，同时英文也相当流利，与老外沟通毫无压力。除此之外，他还告诉我他的睡眠质量相当高，入睡超级快。而自己从小就入睡慢，虽然睡眠质量还算可以。于是我好奇地问他：你是怎么做到这么高的睡眠质量？\u003c/p\u003e","title":"我是如何学会冥想的"},{"content":"背景 首先，吃一下瑞幸的瓜，表示对作空机构的敬意：\n调研机构为了证明瑞幸咖啡造假，派出92个全职和1418个兼职调查员，在全国900多家门店蹲点，收集25843张购物小票，大量内部微信聊天记录，关联人与企业的工商信息，并录制11260个小时的门店录像，得出了瑞幸造假的判断，就这么牛逼。\n站在对立面的一些买了瑞幸的股票投资者就惨了。瑞幸一天跌了75%。\n惨不忍睹，与数字货币中的山寨币的跌势有的一拼。如果从按照52周最高点算，差不多是跌了90%。\n关键是瑞幸后面还有一堆麻烦，业绩作假，面临法律的制裁，甚至面临退市的风险。\n一个做空，一个做多，同一个股票得到回报相有差十万八千里。\n做空的投资者上天堂，做多（持有股票）的投资者下地狱。\n一个追究事实，一个忽略事实。\n一个真干实操，一个纸上谈兵。\n一个成为收割的镰刀，一个成为被收割的韭菜。\n对于做空的来说，功夫不负有心人。\n对于做多的来说，只能吞下自己判断错误的恶果。\n下面是个人对于股票投资一点看法与感悟，本人从2015年进入股市，差不多也有五年的股龄。\n保持独立性 做不到独立性不要去投资。保持独立性才是投资第一要求。保持独立性是一个合格投资人的体现，高正确率的独立性是一个优秀投资人的体现。\n独立性体现以下几个方面：\n独立分析与调研 独立决策 独立操作 独立承担后果 风可以吹走一张白纸，却不能吹走一只蝴蝶。因为生命的力量，在于独立自主，在于独辟蹊径，在于不顺从。纸的在哪里由风来决定，而蝴蝶可以决定在哪朵花上停留。\n所以 投资要保持独立性。\n不懂的不要投资 投资其实是认知的体现。\n你永远赚不到超出你认知范围外的钱。除非你靠运气，但是靠运气赚到的钱，最后往往又会凭实力亏掉。\n你所赚的每一分钱，都是你对这个世界认知的变现，你所亏的每一分钱，都是因为对个世界认知有缺陷。\n理性决策而不是情绪驱动决策 就拿瑞幸为例，可以问自己一系列的问题：\n瑞幸的商业模式是什么？\n瑞幸的商业模式可持续吗？\n瑞幸的商业竞争是谁？有什么优势？\n瑞幸的用户忠诚度高吗？\n瑞幸的管理层有了解与调查吗？\n为什么外国人不怎么喝茶？中国人却会养成一个喝咖啡的习惯？\n为什么要喝瑞幸咖啡而不是喝各种奶茶呢？\n瑞幸的市场是面向14亿中国人，这个转化率是怎么样？中国只有1亿左右的坐过飞机，在这些人中有多少人有喝咖啡的习惯？有多少可以养成喝咖啡的习惯？建立这个习惯的成本是多少？难度是多少？\n。。。\n保持耐心，追求高确定性的机会 股票是一个波动的市场，机会很多，保持耐心，投资那些高确定性的机会，这样可以减少风险。\n抵制各种赚钱的诱惑，保持专注，深入研究一个公司，吃透行业，熟悉各种操作。\n沃伦·巴菲特说过：成功人士和真正的成功人士之间的区别就是后者几乎对所有的投资机会说“不”。\n投资追求的是做正确的事而不是做更多的事。\n仓促决策，往往容易忽略一些重要的信息，从而影响决策的质量。\n保持敬畏 市场不可预测，市场是多种力量相互作用的结果。\n市场深不可测，且复杂多变。\n市场相互影响，利益盘根错节。\n承认个人的渺小，做自己能力范围内的事情。\n小结 投资是认知的实践。不追求投资的收益最大化，而追求营利的最大确定性及本金的安全。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n参考 画皮瑞幸 为什么爆的是瑞幸？ ","permalink":"https://myself659.github.io/post/invest/invest-ruixin-%E6%8A%95%E8%B5%84%E6%84%9F%E6%82%9F/","summary":"\u003ch1 id=\"背景\"\u003e背景\u003c/h1\u003e\n\u003cp\u003e首先，吃一下瑞幸的瓜，表示对作空机构的敬意：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e调研机构为了证明瑞幸咖啡造假，派出92个全职和1418个兼职调查员，在全国900多家门店蹲点，收集25843张购物小票，大量内部微信聊天记录，关联人与企业的工商信息，并录制11260个小时的门店录像，得出了瑞幸造假的判断，就这么牛逼。\u003c/p\u003e","title":"关于投资几点感悟"},{"content":"2020年3月27日，全世界最大的同性交友网站github被攻击了，连正常的首页都打不开。\nHttps并不是100%安全 github被攻击说明Https并不是100%安全，Https也有自己的阿喀琉斯之踵-Https证书。Https不能解决以下五种情况的攻击：\n证书颁发机构被入侵 攻击任何证书颁发机构附近的路由器 攻击证书颁发机构的递归DNS服务器 攻击网络协议如TCP或者BGP 证书颁发机构作恶，恶意修改与替换证书 这五种攻击方式不是攻击证书就是攻击证书的分发网络路径与协议。\n即然https并不是100%安全，那么怎么应对https证书攻击呢？\n发现网站Https证书被攻击 首先第一步发现网站Https证书被攻击。拿这次github被网站Https证书被攻击为例，github证书被攻击时，在chrome浏览品上访问github，会提示如下错误：\n从上图可以看出，不是通常HTTP的错误码，也不是超时错误，而是直接提示了证书错误。\n正常的Https证书是这样的：\nHttps证书被攻击如何正常的访问github 由于github证书出现了问题，用户是无法解决的。那么怎么正常访问github呢？\n由于这类攻击往往具有地域性特点，如这次攻击大部分发生在国内，可以将本地的github访问流量通过代理导到其他没有受到攻击的地方，再由代理返回访问结果。科学上网就是属于这类方式。由于各种原因，这里不展开说明。\n如何解决go get不能正常工作 作为一名golang程序员，发现go get出现错误：\n出现上面的问题的原因同样是因为github网站的证书被攻击导致。解决方法是不走Https，走ssh下载github的代码库。在终端上进行如下配置即可：\n1 git config --global url.\u0026#34;git@github.com:\u0026#34;.insteadOf \u0026#34;https://github.com/\u0026#34; 查看配置结果如下：\n1 2 3 4 5 6 $ cat ~/.gitconfig [user] email = your-email name = your-github-name [url \u0026#34;git@github.com:\u0026#34;] insteadOf = https://github.com/ tips 如果国内的github.com被GFW了。可以使用海外的github.com的地址来配置本机的host文件（C:\\Windows\\System32\\drivers\\etc）。\n小结 Https证书虽然被攻击，但是互联网有去中心化特点，可以改变网络访问路径来避免问题。 Https证书被攻击，影响是http协议，可以换成ssh协议来解决git下载的问题。 总之，遇到问题对症下药，也要跳出框架，think out the box，从另一个角度或层次来解决问题。\n","permalink":"https://myself659.github.io/post/devops/github-hack/","summary":"\u003cp\u003e2020年3月27日，全世界最大的同性交友网站github被攻击了，连正常的首页都打不开。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/images/sec/github-attack-timeline.jpg\"\u003e\u003c/p\u003e\n\u003ch1 id=\"https并不是100安全\"\u003eHttps并不是100%安全\u003c/h1\u003e\n\u003cp\u003egithub被攻击说明Https并不是100%安全，Https也有自己的阿喀琉斯之踵-Https证书。Https不能解决以下五种情况的攻击：\u003c/p\u003e","title":"github被攻击，程序员该怎么办"},{"content":"最近，爆出了新浪微博用户数据泄漏的事件。虽然微博的安全技术总监罗某某拒不承认存在安全问题，但是想想李文亮医生的经历，这个事情真不能忽略。 李彦宏说过：“中国人更愿意用隐私换便利”。这也验证一句话：互联网上无隐私。 虽然互联网上无秘密，但是个人不能放弃保护自己的个人隐私，该行动一下，还得行动一下。不要放弃抵抗。\n下面是个人一些建议：\n最小授权原则 个人隐私数据属于个人。\n但是现在所有互联网应用都在收集个人数据来实现商业的目标如更好地销售广告。\n以个人为例，我注册一个人新浪微博，就只用一个邮箱。大部分也做不了大 V和网红，不需要将个人其他的信息爆露给微博。\n一些应用与网站直接使用微信与qq授权，不要去注册新账号。\n手机app申请权限的时候，根据最小授权原则，满足基本应用即可，不轻易给录音，像机，访问存储的权限。\n远离不靠谱的应用与平台 如果我们将信息交给一些不靠谱的应用与平台，这些应用与平台保护用户信息能力不足，那么它被黑客攻击，内部泄漏的可能性会更大很多。\n举一个例子，疫情期间，各个省市分别推出自己的健康码App，如皖事通，宁归来等等。这些app背后开发能力从其用户体验也看得出来十分堪忧。由于无法避免需要健康码，建议直接用微信与支付宝上面的健康码功能。\n不乱点击URL。 远离无HTTPS加密的网站。\n使用chrome浏览器，帮你识别一些网站的风险。\n不要使得一些缺少安全保护或者安全保护能力弱的邮箱平台。如自建的个人邮箱。\n不要使用一些小厂商的VPN产品。\n保护密码 第一点：不要使用同一个密码，使用同一个密码，如果其中一个网站泄漏，往往其他的所有网站都受到安全的威胁。\n第二点：密码分级管理。重要应用的密码与资金密码要重点保护。\n第三点：不要使用简单的密码，如123456等常见的密码\n第四点：开启two-factor authentication\n第五点：拥有一个自己的密码生成公式或者规则\n利用工具 有条件的情况，密码管理可以1password。\n使用chrome浏览器，并安装HTTPS Everywhere，GHOSTERY，GOOGLE PASSWORD CHECKUP等等。\n安装杀毒软件和开启防火墙。\n手机 如果可以推荐使用苹果手机。Android手机各种app安装的时候要各种权限，管理难度高，用户体验差，应用的审核也没苹果应用商店的标准高。相反苹果应用商店上的app会守规矩多了。\n在一个较高安全系数的环境中，使用应用的安全系数也会提高很多。\n保护好的手机，如手机与sim卡绑定，避免sim卡转移攻击，具体参考人生中最昂贵的教训：SIM卡转移攻击的细节。\n加强学习与增加安全意识 学习一些基础的安全知识，了解一下用户数据泄漏的一些案例，增加对不靠谱应用的识别能力。学习会增加安全意识，安全意识增加可以提前发现问题，并能及时防范。\n后记 虽然互联网无秘密，但是个人加强防范，有利于提高获取个人隐私数据的门槛，避免成为第一批数据泄漏的受害者。相反，如果你比一般人更好的保护你的隐私数据，别人数据泄漏的事件相当是你的吹哨人。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/data-avoid-leak/","summary":"\u003cp\u003e最近，爆出了新浪微博用户数据泄漏的事件。虽然微博的安全技术总监罗某某拒不承认存在安全问题，但是想想李文亮医生的经历，这个事情真不能忽略。\n\u003cimg loading=\"lazy\" src=\"/images/network/%E5%BE%AE%E5%8D%9A5%E4%BA%BF%E6%95%B0%E6%8D%AE.jfif\"\u003e\u003c/p\u003e\n\u003cp\u003e李彦宏说过：“中国人更愿意用隐私换便利”。这也验证一句话：互联网上无隐私。\n\u003cimg loading=\"lazy\" src=\"/images/network/%E4%B8%AD%E5%9B%BD%E4%BA%BA%E6%9B%B4%E6%84%BF%E6%84%8F%E7%94%A8%E9%9A%90%E7%A7%81%E6%8D%A2%E4%BE%BF%E5%88%A9.jpeg\"\u003e\u003c/p\u003e","title":"提高个人隐私数据安全的几点建议"},{"content":"进入话题之前了解一下美股指数熔断机制。\n美股指数熔断机制的基准指数为标普500，单项跌幅阈值为7%、13%、20%。当指数较前一天收盘点位下跌7%、13%时，全美证券市场交易将暂停15分钟，当指数较前一天收盘点位下跌20%时，当天交易停止。\n再来看一下美股指数熔断的历史。\n1997年10月27日，道琼斯工业指数暴跌7.18%，收于7161.15点，这是熔断机制在1988年引入之后第一次被触发。\n2020年3月9日，受2019冠状病毒病疫情和油价崩盘影响，3月9日上午9点34分，标普500指数开盘后跌7%触发第一层熔断机制，暂停交易15分钟，这是美股历史上第二次熔断。\n2020年3月12日开盘后，标普500下跌，触发7%的熔断点，这是美股历史上第三次熔断，收盘时，美股三大指数都下跌近10%。\n人生“有幸”，大家在一周内见证两次美股的熔断。\n美股一周内熔断两次，全球的经济形势加上现在新型冠状病毒在全球已经开始流行，对于经济供应和需求是全方面的打击，这标志美股的下跌周期已经开始。\n明确了美股的下跌趋势，那就有下面两个问题：\n美股会跌到多少？ 下跌周期会是多少？ 问题的答案哪里找？以史为鉴吧。先看一下道琼斯指数的历史曲线图：\n从上图我们只能看到美股涨跌交替，总体不断增长。下面具体看一下最近两次大跌，也就是2008年的金融危机和2000年互联网泡沫。\n2008年的金融危机道琼斯指数下跌情况如下：\n从上面两图可以看到2008年的金融危机期间下跌从2007年10月开始，到2009年2月触底发弹回升，指数从17245.35下降到8609.71，下跌幅度为50%，下跌周期为16个月。\n2000年互联网泡沫道琼斯指数下跌情况如下：\n从上面两图可以看到2000年互联网泡沫期间下跌从1999年12月开始，到2002年9月触底发弹回升，指数从17671.07下降到10848.87，下跌幅度为38.6%，下跌周期为33个月。\n最后再看一下让人闻风丧胆的大萧条时期的股票市场情况。\n从上面两图可以看到大萧条期间下跌从1929年8月开始，到1932年7月触底发弹回升，指数从5686.69下降到814.82，下跌幅度为85.6%，下跌周期为36个月。下跌幅度不是腰斩而是膝斩，下跌时间长达3年，为美股历史上所有下跌之最。\n现在阶段抄底美股，话不多说，送下面这张图，自求多福：\n上面的分析是基于历史的参考，现在情况与历史任何一次美股下跌不一样，具体分析美股的走势要结合多方面的因素分析，如新型冠状病毒在全球开始流行，全球化各国相互影响，各国面临不同问题（股市泡沫、债务杠杆、金融机构风险、社会撕裂等）与应对策略（货币政策、财政政策、抗疫方式等）。\n本文最重要的话是：不要试图现在抄底美股，特别是指数，对于个股来说总体上危险大于机会。保持耐心，让子弹飞一会儿。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/howmuch-us-stock-willfall/","summary":"\u003cp\u003e进入话题之前了解一下美股指数熔断机制。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e美股指数熔断机制的基准指数为标普500，单项跌幅阈值为7%、13%、20%。当指数较前一天收盘点位下跌7%、13%时，全美证券市场交易将暂停15分钟，当指数较前一天收盘点位下跌20%时，当天交易停止。\u003c/p\u003e","title":"一周经历两次熔断，美股会跌多少?"},{"content":"事故 先简单看一下整个事故的粗略时间线。\n2月23日，微盟服务出现故障。商家商城、小程序均无法登录。\n2月25日，微盟紧急恢复了核心业务的线上生产环境，新用户使用不受影响，并提供老用户临时过渡方案，确保商家在数据暂时没有恢复的情况下可以正常经营。\n2月28号，微盟表示已经恢复了微站产品的所有数据，并已导入到商户店铺，新老用户使用将不受影响。\n3月1号微盟表示数据已全面找回，并公布商家赔付计划。\n影响 首先看股市反应：数据丢失，微盟损失惨重。在2月25日正式披露数据丢失后，微盟的股价连续三日大幅下跌，从6.2下跌到4.8差不多跌了25%，整个市值蒸发20亿元以上。\n除此之外，本次事故对微盟的社会公信力有很大的影响，说明整个企业在运营、管理和技术安全上是有问题的，对企业的社会形象和商业业态都会遭受大家的质疑。\n由于微盟整个系统的宕机，导致商家与消费者都不正常运营，部分可能直接停业，对整个社会的经济系统也有一些冲击与影响。\n问题 作为一名局外人，对这次微盟删库事件，个人有以下问题：\n运维贺某是由于什么原因作出删库的事件？ 贺某删除了哪些数据？贺某删除整个生产环境的数据包括备份数据吗？ 微盟是数据架构是如何设计？让一个运维能够删除整个生产环境的数据？ 微盟的数据物理分布是如何设计的？ 微盟运维权限是如何管理？ 微盟离线备份数据是备份方式是怎么样？是增量还是快照方式？ 微盟离线备份数据为什么花了五天都不能够恢复？离线备份数据有多少？ 众多离线备份数据是如何恢复的？ 微盟离线备份数据是否完整？ 微盟离线备份数据恢复后如何验证？如何检查恢复数据与备份数据之间的一致性？ 微盟离线备份数据恢复是否相互依赖？ 微盟离线备份数据（毕竟微盟成立于2013年）是否兼容？如与应用程序兼容？ 微盟离线备份数据恢复的速度的瓶颈在哪里？网络带宽？硬盘IO? 数据不能并行恢复？验证困难？ 从备份数据到线上数据恢复，是恢复几份数据？如何保证这几个线上数据的一致性？ 如何防止误操作？ 如何量化赔偿商家的损失？ 如何快速检测运维违规操作并迅速报警？ 是否知道技术风险的存在，由于存在侥幸心理和事不关已，多一事不如少一事，放过这个潜在的风险？ 经验教训 微盟经过七天七夜的抢救，成功救回了全部数据，从结果上来看是一次成功的抢救。但是数据恢复的时间太长，服务高可用直接打到99%以下。\n事后微盟发布了改进计划，这些改进计划有针对性回答我上面一些问题。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 措施一：数据安全管理机制全面加固与整改，加强运维平台治理 1、完善数据安全管理制度（涵盖权限、监控、审计方面），严格执行授权审批制度； 2、使用腾讯云CAM权限系统进行云资源管理，严格执行分级授权和最小集权限制度，对高危险动作执行二次授权制度； 3、建立科学、高效、安全的网络策略，对开发环境、测试环境和生产环境进行严格隔离；使用腾讯云堡垒机替换自建堡垒机，进行细粒度权限分级和授权管理，同时严格审计堡垒机操作日志，发送安全审计报表； 4、加强运维安全流程学习，职业道德学习，法律学习等。 措施二：加强灾备体系的建设，做到多云异地冷备 1、建立多云灾备体系，在北京、上海、南京等地区建立全备份的冷备系统架构； 2、借助腾讯云的IAAS的底层服务能力，建立高可用的同城双活架构； 3、云上所有的云主机，启用每天的快照策略，保证全量和增量备份； 4、所有非结构化数据，使用腾讯COS对象存储系统进行归档保存，启用COS的多异地复制功能，数据存放多地，并且COS 冷存储，确保数据只增不减； 5、建立月、季度级别的定期演练机制和制度 。 措施三：基础设施全力上云 1、借助腾讯云数据库MySQL的数据高可用和安全体系，逐步放弃自建数据库服务 ，迁移到腾讯云数据库（CDB），快速具备数据库跨可用区和异地灾备的能力； 2、黑石1.0物理机全面升级黑石2.0，全面使用云主机。 上面这些总结很到位，个人帮微盟补充一些：\n学习netfix的企业文化中的第一条：招聘成年人。成年人不会作出对个人和公司双输的事件，成人有自己调整心态与控制情绪的能力。 学习netfix的实践，应用混顿工程，主动拥抱故障，提前演练与操作。国内阿里双11每年都要进行演练。 减少对人的依赖。在执行方面机器比人靠谱多了。 总结 总之，微盟这次删库事故是技术债与管理债长期累积不解决的结果。欠债不还，一定会在某个时间被某个黑天鹅事件引爆。\n这次显露出来的技术问题的本质是数据高可用性技术的不足。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/arch/weimeng-del-data/","summary":"\u003ch1 id=\"事故\"\u003e事故\u003c/h1\u003e\n\u003cp\u003e先简单看一下整个事故的粗略时间线。\u003c/p\u003e\n\u003cp\u003e2月23日，微盟服务出现故障。商家商城、小程序均无法登录。\u003c/p\u003e\n\u003cp\u003e2月25日，微盟紧急恢复了核心业务的线上生产环境，新用户使用不受影响，并提供老用户临时过渡方案，确保商家在数据暂时没有恢复的情况下可以正常经营。\u003c/p\u003e","title":"微盟删库事件复盘与思考"},{"content":"在谈谈做事的原则提到做事的原则的基本原则。具体如下：\n不要给自己设限 站在巨人的肩膀上 正确的方向 敏捷的行动 本文重点讨论如何选择做什么这一问题。不要给自己设限，这个主要是解决了选择范围的问题，不给自己设限，可以打破很多限制，为自己提供更多的选项。\nQuantity is a prerequisite to the selection of quality.\n数量是高质量选择的先决条件。\n那么在不给自己设限解决了选择的数量问题，那么如何作出正确的选择呢？兵圣孙子说过：\n知己知彼，百战不殆。\n作出正确的选择需要在以下两个方面的认识：\n认识自己 认识世界 在这两个方面问自己以下四个问题：\n你喜欢什么？ 你擅长什么？ 世界需要什么？ 别人付钱请你做什么事情？ 一图胜千言。\n从上图可以明显看到我们应该做的核心事情就是这个四个问题的集合的交集，也是ikagai部分。\nikagai是一个日本词汇对应的英文翻译，对应的中文翻译是生活的目的（姑且这样吧，google告诉这么翻译）。\nikagai所指这个交集的事情从个人角度来看可以让自己发挥特长，享受乐趣，回馈社会，达成目标。从事情角度来看，这个事情得激情的投入，使命的担当，专业的能力，职业的态度，在这种情况下做成事情的概率更高，回报是自己需要，很容易形成正循环。\n以个人选择职业为例，当年毕业的时候，我告诉自己一定要做自己喜欢且擅长事情。所以毕业之后选择干的事情就是编程。到现在还在继续编程，每天学习，保持输入与输出。 虽然当年没有像ikagai这样的一个系统描述，个人也考虑到社会的需要。\n考虑现在这个发展情况与需求，在自己喜欢且擅长编程（在与同年龄的人群相比，自己这个领域能排进前top10%），选择编程这个工作对于职业发展来说是一个不错的选择。\nikagai这个方法不仅可以用于职业发展的选择，也可以用于指导生活。如何具体应用ikagai就是上面提到的问题，找出这些回答的交集。\n","permalink":"https://myself659.github.io/post/done/find-what-todo-lkigai%E9%80%89%E6%8B%A9/","summary":"\u003cp\u003e在\u003ca href=\"https://mp.weixin.qq.com/s/rAKE2CYlnRGfxDTG0zlk9Q\"\u003e谈谈做事的原则\u003c/a\u003e提到做事的原则的基本原则。具体如下：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e不要给自己设限\u003c/li\u003e\n\u003cli\u003e站在巨人的肩膀上\u003c/li\u003e\n\u003cli\u003e正确的方向\u003c/li\u003e\n\u003cli\u003e敏捷的行动\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e本文重点讨论如何选择做什么这一问题。不要给自己设限，这个主要是解决了选择范围的问题，不给自己设限，可以打破很多限制，为自己提供更多的选项。\u003c/p\u003e","title":"在选择做什么之前，先问问自己这四个问题"},{"content":"背景 经常有人这样说：\nPHP是最好的语言 现在golang越来越吃香，好找工作 python学习的人越来越多，太难了 对于这些，我想说：别太在意编程语言。\n理由 别太在意编程语言，具体理由如下：\n使用何种编程语言要根据业务需求来决定 选择编程语言与个人与团队偏好有关 编程语言只是工具 最重要是解决问题，满足需求 编程语言具有一定特定性，相反数据结构与算法，设计模式等基础知识与能力具有更好的通用性 多学习几种编程语言更好，何必纠结什么编程语言更好呢？ 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/golang/donot-focus-programming-language/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e经常有人这样说：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ePHP是最好的语言\u003c/li\u003e\n\u003cli\u003e现在golang越来越吃香，好找工作\u003c/li\u003e\n\u003cli\u003epython学习的人越来越多，太难了\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e对于这些，我想说：别太在意编程语言。\u003c/p\u003e","title":"别太在意编程语言"},{"content":"前言 在投资美股，先从数据分析开始这篇文章解决两个问题：\n从哪里找数据？ 如何得到这些数据？ 在此基础这篇主要解决一个问题：以特斯拉为例说明如何利用这些数据预测股票价格的变化。同时关注一个问题：投入成本进行预测股票价格是否靠谱与必要？\n步骤 获取数据 直接调用api如下：\n1 2 3 4 5 6 import yfinance as yf tlsa_df = yf.download(\u0026#39;TSLA\u0026#39;, start=\u0026#39;2015-01-01\u0026#39;, end=\u0026#39;2020-02-16\u0026#39;, progress=False) tlsa_df.head() 绘制价格变化图 1 2 3 4 5 6 7 8 9 10 11 #plot %matplotlib notebook from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = \u0026#34;all\u0026#34; plt.figure(figsize=(10,6)) plt.grid(True) plt.xlabel(\u0026#39;Dates\u0026#39;) plt.ylabel(\u0026#39;Close Prices\u0026#39;) plt.plot(tlsa_df[\u0026#39;Close\u0026#39;]) plt.title(\u0026#39;Tesla Close Price\u0026#39;) plt.show() 得到从2015年起telsa收盘价格变化图：\n分析数据的统计特征信息 1 2 3 4 5 6 7 8 9 tsla_df_close = tlsa_df[\u0026#39;Close\u0026#39;] df_log = np.log(tsla_df_close) moving_avg = df_log.rolling(12).mean() std_dev = df_log.rolling(12).std() plt.title(\u0026#39;Moving Average\u0026#39;) plt.plot(std_dev, color =\u0026#34;black\u0026#34;, label = \u0026#34;Standard Deviation\u0026#34;) plt.plot(moving_avg, color=\u0026#34;red\u0026#34;, label = \u0026#34;Mean\u0026#34;) plt.show() 具体如下：\n处理数据 处理数据是为了满足模型的数据输入的要求。\n1 2 3 4 5 6 7 8 train_data, test_data = df_log[3:int(len(df_log)*0.9)], df_log[int(len(df_log)*0.9):] plt.figure(figsize=(10,6)) plt.grid(True) plt.xlabel(\u0026#39;Dates\u0026#39;) plt.ylabel(\u0026#39;Closing Prices\u0026#39;) plt.plot(df_log, \u0026#39;green\u0026#39;, label=\u0026#39;Train data\u0026#39;) plt.plot(test_data, \u0026#39;blue\u0026#39;, label=\u0026#39;Test data\u0026#39;) plt.legend() 这里将原始数据分为训练数据和测试数据。\n建立模型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import os import numpy as np import pandas as pd import matplotlib.pyplot as plt from statsmodels.tsa.stattools import adfuller from statsmodels.tsa.seasonal import seasonal_decompose from statsmodels.tsa.arima_model import ARIMA from pmdarima.arima import auto_arima from sklearn.metrics import mean_squared_error, mean_absolute_error import math model_autoARIMA = auto_arima(train_data, start_p=0, start_q=0, test=\u0026#39;adf\u0026#39;, # use adftest to find optimal \u0026#39;d\u0026#39; max_p=3, max_q=3, # maximum p and q m=1, # frequency of series d=None, # let model determine \u0026#39;d\u0026#39; seasonal=False, # No Seasonality start_P=0, D=0, trace=True, error_action=\u0026#39;ignore\u0026#39;, suppress_warnings=True, stepwise=True) print(model_autoARIMA.summary()) 得到模型参数如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 Performing stepwise search to minimize aic Fit ARIMA: (0, 1, 0)x(0, 0, 0, 0) (constant=True); AIC=-4980.147, BIC=-4970.040, Time=2.357 seconds Fit ARIMA: (1, 1, 0)x(0, 0, 0, 0) (constant=True); AIC=-4978.315, BIC=-4963.154, Time=0.297 seconds Fit ARIMA: (0, 1, 1)x(0, 0, 0, 0) (constant=True); AIC=-4978.308, BIC=-4963.147, Time=0.475 seconds Fit ARIMA: (0, 1, 0)x(0, 0, 0, 0) (constant=False); AIC=-4982.140, BIC=-4977.087, Time=0.189 seconds Fit ARIMA: (1, 1, 1)x(0, 0, 0, 0) (constant=True); AIC=-4976.958, BIC=-4956.743, Time=0.493 seconds Total fit time: 5.619 seconds SARIMAX Results ============================================================================== Dep. Variable: y No. Observations: 1158 Model: SARIMAX(0, 1, 0) Log Likelihood 2492.070 Date: Mon, 17 Feb 2020 AIC -4982.140 Time: 20:29:52 BIC -4977.087 Sample: 0 HQIC -4980.233 - 1158 Covariance Type: opg ============================================================================== coef std err z P\u0026gt;|z| [0.025 0.975] ------------------------------------------------------------------------------ sigma2 0.0008 1.84e-05 42.731 0.000 0.001 0.001 =============================================================================== Ljung-Box (Q): 43.17 Jarque-Bera (JB): 898.42 Prob(Q): 0.34 Prob(JB): 0.00 Heteroskedasticity (H): 1.84 Skew: -0.13 Prob(H) (two-sided): 0.00 Kurtosis: 7.31 =============================================================================== 对模型诊断 在进行预测之前先进行模型诊断。\n1 2 3 4 5 model_autoARIMA.plot_diagnostics(figsize=(15,8)) plt.show() model = ARIMA(train_data, order=(3, 1, 2)) fitted = model.fit(disp=-1) print(fitted.summary()) 结果如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ARIMA Model Results ============================================================================== Dep. Variable: D.Close No. Observations: 1157 Model: ARIMA(3, 1, 2) Log Likelihood 2494.608 Method: css-mle S.D. of innovations 0.028 Date: Mon, 17 Feb 2020 AIC -4975.215 Time: 20:30:59 BIC -4939.840 Sample: 1 HQIC -4961.866 ================================================================================= coef std err z P\u0026gt;|z| [0.025 0.975] --------------------------------------------------------------------------------- const 0.0002 0.000 1.274 0.203 -0.000 0.001 ar.L1.D.Close 0.1523 0.251 0.607 0.544 -0.339 0.644 ar.L2.D.Close 0.8380 0.235 3.562 0.000 0.377 1.299 ar.L3.D.Close -0.0097 0.032 -0.305 0.760 -0.072 0.053 ma.L1.D.Close -0.1689 0.249 -0.678 0.498 -0.657 0.320 ma.L2.D.Close -0.8311 0.249 -3.334 0.001 -1.320 -0.343 Roots ============================================================================= Real Imaginary Modulus Frequency ----------------------------------------------------------------------------- AR.1 1.0107 +0.0000j 1.0107 0.0000 AR.2 -1.1784 +0.0000j 1.1784 0.5000 AR.3 86.4971 +0.0000j 86.4971 0.0000 MA.1 1.0000 +0.0000j 1.0000 0.0000 MA.2 -1.2033 +0.0000j 1.2033 0.5000 ----------------------------------------------------------------------------- 利用模型进行预测 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 fc, se, conf = fitted.forecast(129, alpha=0.05) fc_series = pd.Series(fc, index=test_data.index) lower_series = pd.Series(conf[:, 0], index=test_data.index) upper_series = pd.Series(conf[:, 1], index=test_data.index) plt.figure(figsize=(12,5), dpi=100) plt.plot(train_data, label=\u0026#39;training\u0026#39;) plt.plot(test_data, color = \u0026#39;blue\u0026#39;, label=\u0026#39;Actual Stock Price\u0026#39;) plt.plot(fc_series, color = \u0026#39;orange\u0026#39;,label=\u0026#39;Predicted Stock Price\u0026#39;) plt.fill_between(lower_series.index, lower_series, upper_series, color=\u0026#39;k\u0026#39;, alpha=.10) plt.title(\u0026#39;Tesla Stock Price Prediction\u0026#39;) plt.xlabel(\u0026#39;Time\u0026#39;) plt.ylabel(\u0026#39;Tesla Stock Price\u0026#39;) plt.legend(loc=\u0026#39;upper left\u0026#39;, fontsize=8) plt.show() 得到预测结果如下：\n分析预测结果 从上面预测结果可以看出：\n预测结果与实际股票的上涨趋势相同，但是其中的路径还是相差很多，直接说明不适合指导具体交易，只能做为长期趋势判断的参考 这个模型还需要大量进行测试，如调整数据，调整模型参数 总结 这里是简单介绍一下利用numpy与pmdarima来预测股票变化趋势。实际上应用过程上需要充分的测试与验证，还需要大量的工作。像这上面这样的方式来预测股票价格是不靠谱的。有靠谱的模型也需要自己大量投入时间与大量的数据以及不断的验证与调整才可以的（别人靠谱的模型是不会免费分享的）。对于个人来说，投入这个成本是否值得又是另一个问题。对于大部分人来说没有必要投入这个成本通过机器学习来预测股票价格变化。这个进入门槛比较高（预测股票价格与预报天气是两回事），从中获得收益的门槛更高。\n下一篇会具体讨论一下预测股票变化的数学原理。再根据这些数学原理如何优化模型。\n说明：\n本文只是进行一个过程展示 本文中的模型只供参考，不能用于实际的股票投资与交易。股市有风险，入市当小心。 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n参考 pmdarima 股市目前正面临冰山幻象 A Surprisingly Easy Strategy to Make Money in the Stock Market ","permalink":"https://myself659.github.io/post/stock/stock-us-analysis/","summary":"\u003ch1 id=\"前言\"\u003e前言\u003c/h1\u003e\n\u003cp\u003e在\u003ca href=\"https://mp.weixin.qq.com/s/t8LAkhXEY0zkKZ_dhIXHdA\"\u003e投资美股，先从数据分析开始\u003c/a\u003e这篇文章解决两个问题：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e从哪里找数据？\u003c/li\u003e\n\u003cli\u003e如何得到这些数据？\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e在此基础这篇主要解决一个问题：以特斯拉为例说明如何利用这些数据预测股票价格的变化。同时关注一个问题：投入成本进行预测股票价格是否靠谱与必要？\u003c/p\u003e","title":"通过数据分析预测股票价格变化靠谱吗？"},{"content":"前言 学过了除法都知道这么一个道理：0不是被除数。\n到了后面编程，一直都会遵循一条原则： 0不能作为被除数，如果用0作为被除数，就会出错或者报异常。下面就是一个常见的例子。\n1 2 3 4 5 \u0026gt;\u0026gt;\u0026gt; 1/0 Traceback (most recent call last): File \u0026#34;\u0026lt;stdin\u0026gt;\u0026#34;, line 1, in \u0026lt;module\u0026gt; ZeroDivisionError: division by zero \u0026gt;\u0026gt;\u0026gt; 把0不能作为被除数视为理所当然，却很少思考0为什么不能作被除数？\n原因 这里就简单看一下0为什么不能作被除数？\n证明很简单，主要就是反证法。\n假设1/0 = ∞ 根据乘法与除法是互逆的，那么∞*0 = 1 这就与任何数与0相乘为0，相矛盾 总结 最后总结一下0这个数的属性：\n任何数加减0的结果等于它本身。 任何数乘0的结果都等于0. O不能作为被除数 0存在很有意义，简单举几个例子：\n0定义了一种基础，有了0存在，1的意义就很容易理解 0是正数与负数的分界点 0对应到应用可以是海平面，地面\u0026hellip; 总之，0是虚也是实的，0是抽象的也是实际的。\n","permalink":"https://myself659.github.io/post/math/why-dividing-by-zero-is-undefined/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e学过了除法都知道这么一个道理：0不是被除数。\u003c/p\u003e\n\u003cp\u003e到了后面编程，一直都会遵循一条原则： 0不能作为被除数，如果用0作为被除数，就会出错或者报异常。下面就是一个常见的例子。\u003c/p\u003e","title":"为什么0不能作为被除数？"},{"content":"背景 川大爷，常在twitter上吆喝美股多次创造历史高点。美股确实是一个资产配置的重要选项。\n在进入市场之前，研究先行，作好功课。\n获取数据 对于一个公司的股票的研究与分析有多个方面。这里只看股票的数据情况。 既然是分析数据，那么如何获取获取呢？\n这个问题可以拆为以下问题：\n从哪里找数据？ 如何得到这些数据？ 先从第一个问题开始：从哪里找数据？美股的数据来源来很多，这里我直接选择了yahoo财经数据。 主要原因如下：\nyahoo财经数据详细 yahoo财经可以直接通过api获取，使用方便 最重要地一点，yahoo财经的api没有被墙，如果被墙了，也支持代理 yahoo财经数据实时性也不错，除了交易日当天的数据无法获取，其他的都可以获取 下面我们就看如何调用api获取数据。不多说了，直接上代码。\n1 2 3 4 5 6 7 8 9 import pandas as pd import yfinance as yf tsla_df = yf.download(\u0026#39;TSLA\u0026#39;, start=\u0026#39;2020-01-01\u0026#39;, end=\u0026#39;2020-02-06\u0026#39;, progress=False) tsla_df.tail() 具体结果如下：\n获取ticker数据：\n1 2 3 4 5 6 %matplotlib notebook ticker = yf.Ticker(\u0026#39;TSLA\u0026#39;) tsla_df = ticker.history(period=\u0026#34;max\u0026#34;) tsla_df.head() tsla_df[\u0026#39;Close\u0026#39;].plot(title=\u0026#34;Telsa\u0026#39;s stock price\u0026#34;) 具体结果如下：\n这些数据都可以股票软件都可以看到。 对的，下面说一下通过api获取原始数据的好处。\n灵活地获取ticker数据：\n1 2 3 %matplotlib notebook tsla_df = yf.download(\u0026#34;TSLA\u0026#34;, start=\u0026#34;2020-02-01\u0026#34;, end=\u0026#34;2020-02-06\u0026#34;, interval = \u0026#34;15m\u0026#34;) tsla_df[\u0026#39;Close\u0026#39;].plot(title=\u0026#34;TSLA FROM 2020-02-01 TO 2020-02-06 \u0026#34;) 具体结果如下： 股票对比分析：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 from plotly.offline import download_plotlyjs, init_notebook_mode, iplot import numpy as np import cufflinks as cf data_tam = yf.download( # or pdr.get_data_yahoo(... # tickers list or string as well tickers = \u0026#34;TSLA AAPL MSFT\u0026#34;, # use \u0026#34;period\u0026#34; instead of start/end # valid periods: 1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max # (optional, default is \u0026#39;1mo\u0026#39;) period = \u0026#34;5y\u0026#34;, # fetch data by interval (including intraday if period \u0026lt; 60 days) # valid intervals: 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo # (optional, default is \u0026#39;1d\u0026#39;) interval = \u0026#34;1wk\u0026#34;, # group by ticker (to access via data[\u0026#39;SPY\u0026#39;]) # (optional, default is \u0026#39;column\u0026#39;) group_by = \u0026#39;ticker\u0026#39;, # adjust all OHLC automatically # (optional, default is False) auto_adjust = True, # download pre/post regular market hours data # (optional, default is False) prepost = True, # use threads for mass downloading? (True/False/Integer) # (optional, default is True) threads = True, # proxy URL scheme use use when downloading? # (optional, default is None) proxy = None ) data_tam_close = data_tam.iloc[:, [3, 8, 13]] data_tam_close = data_tam_close.dropna() iplot(data_tam_close.iplot(asFigure=True, kind=\u0026#39;line\u0026#39;, title=\u0026#39;TSLA VS MS VS APPLE\u0026#39;, dimensions=(800,500))) 具体结果如下：\n一眼可以看出在2020年前任何一个时间点买入telsa并持有是一个正确的选择，投资收益远超过了苹果与微软。\n后记 本文主要解决了如何获取美股交易数据的问题，对于这些数据的分析及预测后面再展开。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/stock/stock-us-data/","summary":"\u003ch1 id=\"背景\"\u003e背景\u003c/h1\u003e\n\u003cp\u003e川大爷，常在twitter上吆喝美股多次创造历史高点。美股确实是一个资产配置的重要选项。\u003c/p\u003e\n\u003cp\u003e在进入市场之前，研究先行，作好功课。\u003c/p\u003e\n\u003ch1 id=\"获取数据\"\u003e获取数据\u003c/h1\u003e\n\u003cp\u003e对于一个公司的股票的研究与分析有多个方面。这里只看股票的数据情况。 既然是分析数据，那么如何获取获取呢？\u003c/p\u003e","title":"投资美股，先从数据分析开始"},{"content":"在高中的时候知道了NBA,看了比赛，知道了科比。多少年以来，篮球是我最喜欢的体育运动，科比是我最喜欢的NBA球星，估计也是我最喜欢的运动员。看NBA比赛是我日常的娱乐方式。\n但是他却以让人无法想像的方式离开了这个世界，同时带上了可爱的二女儿Gigi。想不到他这么早离开了这个世界。愿他们在天堂安好。\n下面说说我眼中的科比。\n科比是乔丹之后成就最高，影响力最大，球技最好的篮球运动员 科比在篮球领域的成就太多，简单列出部分如下：\nNBA总冠军：5次（2000，2001，2002，2009，2010） NBA总决赛MVP：2次（2009，2010） NBA全明星赛MVP：4次（2002，2007，2009，2011） NBA西部冠军：7次（2000—2002，2004，2008—2010） NBA最佳阵容第一阵容：11次（2002—2004，2006—2013） NBA最佳防守阵容第一阵容：9次（2000—2004，2006—2011） 生涯总得分：33643分，NBA得分榜第四 历史上连续入选NBA全明星赛次数最多：17次 NBA历史上单场第二高得分：81分 \u0026hellip; 太多了，这里不列了 号称在60E亿粉丝，各种代言广告，科比相比较于邓肯有更大的影响力。同时科比也有更多的争议的话题。在美国《Sporting News》评选NBA现役50大球星当中科比名列第一。\n科比拥有篮球史上最纯粹完美的技术，他是篮球史上最强的高难度投篮手，他经常不按合理的方式打球，他的投篮美如画，飘逸优雅，同时充满了一个超级杀手的气质。看他打球是一种享受，感受篮球的艺术与美。科比的NBA集锦是我最爱看的集锦。\n科比是一位优秀的父亲 科比当得了奶爸。\n科比耐心培养的女儿。\n科比营造了幸福的家庭。\n科比是成功跨界人士 从2016年4月退役之后，科比在投资，媒体，写作等领域取得优秀成就，是很多在这个领域的专业人士都很难企及的成就。\n先看投资领域。早在2013年，科比就创办了Kobe Inc，随后600万美元投资了运动饮料BodyArmor。BodyArmor是小众品牌，科比入驻一年后，该公司年销售额就从300万美元升至3000万美元，并在2017年达到2.35亿美元，2019年预计销售额将达到7亿美元。BodyArmor的市场占有率排在佳得乐与水动乐之后，位列全美第三位，份额是2%。除此之外，科比在美国纽交所（NYSE）宣布成立风险投资基金“Bryant Stibel”，资本金1亿美元，并宣布战略投资中国在线少儿英语教育品牌VIPKID。之后“Bryant Stibel”不断快速增长，截止去年9月份，Bryant Stibel资本+AUM（资产管理规模）已经超过了20亿美元。\n再看媒体领域，科比是一位优秀的制作人。2017年3月，科比自导自演的动画短片《Musecage》发布。2017年4月，科比参与制作并配音的动画电影《亲爱的篮球》首映，这部影片的创作灵感来自于科比在2015年发表的那封退役信，那篇文章的名字就叫做《亲爱的篮球》。这部影片取得巨大成功，获得奥斯卡金像奖最佳动画短片奖。除此之外科比的制作《Detail》节目，也是大获成功，只要被分析的球星，下一场球一定会被针对，场上表现大打折扣。\n最后看写作领域，科比先于2018年出版个人自传：《曼巴精神：我是怎么打球的》， 接着在2019年出版一本体育梦幻小说：《威兹纳德 训练营》，该书曾进入纽约时报畅销书排行榜榜首。除此之外，巴西著名畅销作家、《牧羊少年奇幻之旅》的作者保罗-科埃略原本正与科比合作一本新书，可惜由于科比的不幸离世，这本书胎死腹中。这些成就让人不禁想到：获得奥斯卡之后，科比又要冲击诺贝尔文学奖了吗？\n科比是曼巴精神最佳实践 科比自己是这样解释曼巴精神：\n一开始，“曼巴精神”只是我在推特上发起的一个标签，它激励人心，饱含智慧，令人过目难忘。但随后它从那里流行开来，开始有了更多象征意义。“曼巴精神”是一种思维模式，它不在于寻求结果，而在于如何做才能取得结果，在于从现实到目标的这个过程。它是一段旅程，一种方法，一种生活方式。我真心认为，在所有努力之中，拥有这种心态尤其重要。\n最偏执：专注篮球，为了进入赛后赛，在34岁那年拼到跟腱断裂；科比说过：“为了胜利我做什么都可以，无论是给队友递毛巾递水，还是上场执行最后一投。”\n最坚韧： 三个手指受伤还坚持打完了一个赛季并夺得了总冠军\n最倔强：科比说过：“ 我的字典里没有妥协。“\n最好强：新秀赛季敢于单挑巅峰期的乔丹；敢直接跟篮球史上最有统治力的球员大鲨鱼抢出手权\n最勤奋：每天投进2000个跳投，还有大家都耳熟能详的段子：凌晨四点的洛杉矶，对了，那不是段子，那是科比无数个清晨所看到的\n后记 2016年4月13日，15-16NBA常规赛，对阵爵士是科比职业生涯最后一场比赛。他在比赛中得到了60分，成为得到60分年龄最大的球员。科比以这种伟大创举告别了NBA。Mamba out！留给世界是震撼与不舍，多希望他还能征战NBA。\n美国时间2020年1月26号，中国春节初三，科比却以意想不到方式离开了这个世界。Mamba farewell！ 留给世界是悲伤，是难以相信，是永远的记忆。多希望他还能活跃在多个领域，希望他能够出一期有关英格拉姆的《detail》节目，希望他能指导Gigi成为一名女曼巴，希望他能生一个儿子。。。\n科比度过他短暂的一生，他的一生是奋斗不息、不断挑战、实现梦想的一生。感谢科比给这个世界带来的精彩，在生活与工作中用行动来纪念科比（欧文就是一个好参考，狂砍54分，用属于他自己的方式纪念科比）。\n一千读者心中有一千个哈姆雷特，欢迎大家说一说自己心中的科比\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)，您的关注是我更新的动力\n","permalink":"https://myself659.github.io/post/kobe/","summary":"\u003cp\u003e在高中的时候知道了NBA,看了比赛，知道了科比。多少年以来，篮球是我最喜欢的体育运动，科比是我最喜欢的NBA球星，估计也是我最喜欢的运动员。看NBA比赛是我日常的娱乐方式。\u003c/p\u003e","title":"说说我眼中的科比"},{"content":"背景 比特币是世界诞生的第一个加密货币，从2009年上线以来市值一直都是NO.1.\n表现 下面具体一下比特币的龙头表现：\n从上面两图可以看出来，从2018年1月份开始比特币的龙头地位从最低点逐渐提高。比特币在这两年的时间从最低点33%左右上升到66%左右。从市值占有比角度来看，比特币是这两年中最大的赢家，没有之一。\n下面再看一下2018年到2020之间加密货币总市值的变化情况：\n从图可知，2018年1月整个加密货币市场处于最高点，总市值最高达到815159246848美元，简单记为8151亿美元。\n到了2020年1月整个加密货币市场的总市值为241570437715美元，简单记为2415亿美元。\n在整个市场腰斩，不对是膝斩的过程，比特币在整个市场的比重逐渐提升。在整个过程比特币相比于经济危机的情况下避险贷币。\n原因 为什么在整个过程比特币比重越来越高呢？\n个人认为有以下几个原因：\n比特币具有先发优势 在持有分布方面，比特币的持有分布有很好去中心化性 宣传上，一定程度上比特币等同了区块链，大大提高了比特币宣传 比特币一直在进步与发展，BIP不断有新提案出来并且能够得到落实 比特币有最完整的生态 未来 关于未来比特币的龙头地位是否会进一步加强呢？个人认为龙头地位不会再进一步扩大。主要原因如下：\n最近两年比特币比重提升来自于山寨币的比重，而经过这两年的淘汰山寨币空间几乎消失殆净 比特币比重还有一部分来自于以太坊，以太坊2.0进展有利于以太坊的比重提高 其他领域的加密货币的发展，如跨链的大量应用会增加跨链部分的比重 闪电网络的发展与应用加上现在比特币强大的生态有利于比特币守住龙头地位 最后，个人认为2020年比特币挖矿收益的减半，并不会导致比特币的大爆发。\n","permalink":"https://myself659.github.io/post/why-btc-is-dominated/","summary":"\u003ch1 id=\"背景\"\u003e背景\u003c/h1\u003e\n\u003cp\u003e比特币是世界诞生的第一个加密货币，从2009年上线以来市值一直都是NO.1.\u003c/p\u003e\n\u003ch1 id=\"表现\"\u003e表现\u003c/h1\u003e\n\u003cp\u003e下面具体一下比特币的龙头表现：\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"比特币市值占比-2018年1月\" loading=\"lazy\" src=\"/images/blockchain/btc-market-percent-201801.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"比特币市值占比-2020年1月\" loading=\"lazy\" src=\"/images/blockchain/btc-market-percent-202001.png\"\u003e\u003c/p\u003e\n\u003cp\u003e从上面两图可以看出来，从2018年1月份开始比特币的龙头地位从最低点逐渐提高。比特币在这两年的时间从最低点33%左右上升到66%左右。从市值占有比角度来看，比特币是这两年中最大的赢家，没有之一。\u003c/p\u003e","title":"2020年比特币的龙头地位还会继续加强吗？"},{"content":"背景 发现世界的规律，利用其中的非对称性，可以获利事半功倍的交易。\n非对称性在哪里？ 非对称性在世界上普及存在。 下面举几个例子：\n非对称加密算法 信息不对称 能力不对称 时间不对称 速度不对称 认知不对称 理论与实践不对称 方向非对称性 风险不对称 责任不对称 机会不对称 概率不对称 主观与客观不对称 计划与执行不对称 言行不一致 构建与析构不对称 临界（点/区）不对称 表达与意图不一致 利用非对称性指导原则 利用非对性性指导原则如下：\n二八法则 扩展维度，降维打击 系统思维 优势策略，避免非对称劣势 Less is more 顺势而为 具体问题具体分析 合理使用杠杆策略 知行合一 ","permalink":"https://myself659.github.io/post/invest/invest-%E9%9D%9E%E5%AF%B9%E7%A7%B0%E6%80%A7/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e发现世界的规律，利用其中的非对称性，可以获利事半功倍的交易。\u003c/p\u003e\n\u003ch2 id=\"非对称性在哪里\"\u003e非对称性在哪里？\u003c/h2\u003e\n\u003cp\u003e非对称性在世界上普及存在。 下面举几个例子：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e非对称加密算法\u003c/li\u003e\n\u003cli\u003e信息不对称\u003c/li\u003e\n\u003cli\u003e能力不对称\u003c/li\u003e\n\u003cli\u003e时间不对称\u003c/li\u003e\n\u003cli\u003e速度不对称\u003c/li\u003e\n\u003cli\u003e认知不对称\u003c/li\u003e\n\u003cli\u003e理论与实践不对称\u003c/li\u003e\n\u003cli\u003e方向非对称性\u003c/li\u003e\n\u003cli\u003e风险不对称\u003c/li\u003e\n\u003cli\u003e责任不对称\u003c/li\u003e\n\u003cli\u003e机会不对称\u003c/li\u003e\n\u003cli\u003e概率不对称\u003c/li\u003e\n\u003cli\u003e主观与客观不对称\u003c/li\u003e\n\u003cli\u003e计划与执行不对称\u003c/li\u003e\n\u003cli\u003e言行不一致\u003c/li\u003e\n\u003cli\u003e构建与析构不对称\u003c/li\u003e\n\u003cli\u003e临界（点/区）不对称\u003c/li\u003e\n\u003cli\u003e表达与意图不一致\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"利用非对称性指导原则\"\u003e利用非对称性指导原则\u003c/h2\u003e\n\u003cp\u003e利用非对性性指导原则如下：\u003c/p\u003e","title":"说说非对称性"},{"content":"背景 2020年1月15号微信灰度发布公众帐号付费阅读功能。微信10亿用户的体量，最长的用户时长，所以一个付费阅读功能差不多引起全网的讨论。\n时机 为什么微信会在这个时候推出公众帐号付费阅读功能？\n在得到，喜马拉雅，极客时间，知识星球，小红圈，微博等一系列知识付费产品这几个的培训下，国内知识付费快速成长，付费内容增多，用户付费意识增强。同时微信订阅号打开率与阅读量遇到增长问题。\n目的 个人认为推出公众帐号付费阅读功能有以下目的：\n抢占知识付费的市场 增加订阅号的服务类型，为用户提供一种新的新服务，为创作者提供一个新变现的选项 促进一些创作者的热情，进而创作出更加优秀的作品，为用户提供高质量的作品 多年订阅号的发展，一定量的用户付费的需求已经出现，推出公众帐号付费阅读功能，满足用户的需要 产品体验 ios用户付费由于苹果的原因，支付体验不流畅，不能直接走微信支付（注：苹果要发展自家apple pay） 付费阅读文章有明显的标示 可以灵活设置付费可见的内容比例 付费后有两条通知：支付凭证通知购买成功通知 没有广告 付费才能留言 如果不付费情况，影响阅读体验，伤害用户的情感 适用场景 并不是所有订阅号都适合开通付费阅读功能，Caoz看好付费阅读功能在以下领域的应用：\n原创小说 原创动漫 金融财经/智库报告 其他平台导流到微信的付费阅读 除了黑产与灰产外，个人还看好在一些重要问题的付费解答方面的应用。\n对比 有太多的付费产品，这里简单说一下微信公众帐号与其他的不同点：\n其他都是知识付费产品，而在微信付费阅读是一个功能或者说是feature 微信针对一篇文章的交易，其他是圈子付费或者平台会员付费 微信付费更加精准，就是具体一篇文章或者一个问题 那么多其他付费平台有哪些影响？\n如果微信付费将一些创作者吸引到微信公众帐号，那么其他付费平台会受到不小的冲击，如今天的中国没有哪一个互联网产品的用户不与微信重叠，这些创作者也会带着他的用户无成本迁移到微信 由于微信是文章类别，暂时对语言与视频类知识付费没有多少影响 平台之间相互抢创作者会再度出现 微信中心化付费阅读与基于区块链去中心的内容平台由于商业模型不一致，所以对去中心的内容平台影响不大 机会 这里的机会当然是指创作者的机会。面对的主要领域主要就是提到的五个领域。\n一种新变现的方式，可以看作一个新的知识价值交易的平台 一个展示自我实力与价值的平台 个人成长的平台，如果选定一个领域，不断深耕，个人能力回报肯定不错，如果有志如此，请先开始拥有一个公众帐号 经济回报这些机会属于大部分属于一些头部真硬核作者（马太效应），虽然我希望是长尾效应，但是实际估计还是二八定律 微信用户更多，用户时长更久，机会相比较于其他付费平台机会更大 作用 对于内容输出者来说，主要作用如下：\n一个新的变现方式，一个10亿用户平台上的变现 防止洗稿，内容禁止复制 防止杠精，付费才能评论 经济上的激励促进进步，输出更好的内容 结语 对于个人来说，就是开一个公众帐号，专注一个领域，努力学习，持续精进，真诚分享，输出价值，不要随便开启付费阅读，一切随缘。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/wechat-payment-read/","summary":"\u003ch1 id=\"背景\"\u003e背景\u003c/h1\u003e\n\u003cp\u003e2020年1月15号微信灰度发布公众帐号付费阅读功能。微信10亿用户的体量，最长的用户时长，所以一个付费阅读功能差不多引起全网的讨论。\u003c/p\u003e\n\u003ch1 id=\"时机\"\u003e时机\u003c/h1\u003e\n\u003cp\u003e为什么微信会在这个时候推出公众帐号付费阅读功能？\u003c/p\u003e","title":"说说微信付费阅读"},{"content":"Gartner 首先介绍一下Gartner。 Gartner全球最具权威的IT研究与顾问咨询公司。同时也是魔力四象限与技术成熟度曲线提出者。所以Gartner报告值得一看，权威性比一般技术报告及预测强很多。\n十大技术趋势 Gartner对2020技术发展作了预测，列出十大技术趋势，具体如下：\nHyperautomation超级自动化 Multiexperience多元体验 Democratization民主化 Human Augmentation人类增强 Transparency and Traceability透明与可追溯性 The Empowered Edge边缘计算 Distributed Cloud分布式云 Autonomous Things自主设备 Practical Blockchain实用区块链 AI Security人工智能安全 从上可知区块链也在榜上。下面具体看一下区块链部分的分析。\nGartner预计区块链可扩展性将在2023年取得突破 区块链技术应用现在面临的主要体现以下两个方面：\n可扩展性 互操作性 可扩展性方面主流公链如比特币每秒支持七笔交易，以太坊每秒支持15笔交易；同时交易成本高。 互操作性方面私钥管理基本上原地踏步，助记词这种形式提高了用户的门槛的要求，同时丢失助记词是常有发生。\n报告中并没有说明哪种技术方案会取得突破。个人以为主要看点有两个：\n分片 layer2 重点期待以太坊, Harmony,Near, plokadot等公链。\n区块链应用场景 区块链是一个充满想像力的技术，但是现在主要落地应用在于数字货币领域。在其他的领域区块链落地比较少。Gartner在报告中列出区块链在企业应用领域有哪些呢？具体如下：\n1.资产跟踪。\n2.索赔。\n3.身份管理/KYC。\n4.内部记录保存。\n5.积分和奖励。\n6.支付/结算。\n7.溯源。\n8.共享记录保存。\n9.智能城市/物联网。\n10.贸易融资。\n11.交易。\n此外Garnter还看好以下三个应用（不同于上面的企业应用领域）：\n基于区块链的投票 基于区块链的自我主权的数字身份 数字加密货币的支付和转帐 建议 Gartner对于企业场景下应用区块链技术的建议：\n深入理解商业应用领域的问题和潜在的机会 深入理解区块链的功能和局限性 重新评估企业和行业信任架构 将技术作为核心业务战略的一部分 提高客户应用区块链运营架构的意愿和能力 参考 top-10-strategic-technology-trends-for-2020 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/blockchain/blockchain-2020/","summary":"\u003ch1 id=\"gartner\"\u003eGartner\u003c/h1\u003e\n\u003cp\u003e首先介绍一下Gartner。\nGartner全球最具权威的IT研究与顾问咨询公司。同时也是魔力四象限与技术成熟度曲线提出者。所以Gartner报告值得一看，权威性比一般技术报告及预测强很多。\u003c/p\u003e","title":"Gartner预测2020年区块链的发展"},{"content":"2020年加大搬砖的力度，还是一名程序员，继续成长与进步。\n优秀程序员应该具备以下三方面能力：\n扎实的计算机基础知识（计算机结构，操作系统，数据结构与算法 ）\n良好的软件工程素质\n一定的系统设计与架构能力\n多年的程序员经历与读书经历告诉我：\n读书不在多，贵在精。\n精典书籍需要多读几遍，常读常新，每一次重读都会有新的收获\n下面推荐软件工程师应该精读的十本书。\n1 编码：隐匿在计算机软硬件背后的语言 本书作者Charles Petzold创造性地以编码为主题，从电报机和手电筒讲到数字电路，然后利用数字电路中的逻辑门构造出加法器和触发器，最后构造出一个完整的存储程序计算机 。作者在书中使用大量形象贴切的类比简化了这些概念，使其成为通俗易懂的计算机入门读物。\n2 深入理解计算机系统 作为一名非科班出身的程序员，深入理解计算机系统是对我帮助最大。这本书里面将操作系统，计算机硬件与结构，编译原理这些计算机学科的基础内容结合在一起。具体内容涵盖：指令集体系架构，汇编语言，代码优化，计算机存储体系架构，链接，装载，进程，系统调用，虚拟内存，网络编程，并发编程等程序员在日常工作中所需要的必备知识。\n如果想打下扎实的计算机基础又不想把操作系统计算机结构编译原理这些书统统读一遍，阅读深入理解计算机系统是最有效率的方式。\n3 计算机编程艺术 本书的作者高德纳是算法和程序设计技术的先驱者，同时也是计算机排版系统TEX和METAFONT的发明者，除此之外还是1971年图灵奖获得者。这个系列图收可以说是包含一切基础算法的宝典。比尔·盖茨曾表示：如果你自以为是一个很好的程序员，请去读读高德纳的《计算机程序设计艺术》吧\u0026hellip;要是你真把它读下来了，就毫无疑问可以给我递简历了。精读这个系列的图书毫无疑问是真正地站在巨人的肩膀上。\n4 算法导论 AI时代，也就是算法时代。可以说算法水平决定一个程序员技术的上限。学习基础算法与应用算法解决具体的工作问题，本书不容错过。\n5 程序员面试金典 面试驱动学习。\n《程序员面试金典》是程序员面试跳槽找工作必备书。\n6 程序员修炼之道：从小工到专家 对于软件工程来说算法，数据结构，编程语言只是软件工程的工具与思想，在具体软件工程中每一个软件工程师都要考虑如何提高工作的产出。这本《程序员修炼之道：从小工到专家》通过具体有效的经验与技巧让你成长为一名高效的程序员。书中内容涉及如何避免代码腐烂，如何编写灵活、高可用的正确代码，如何真正的理解需求等一系列具体问题。\n7 人月神话 软件的开发与维护离不开软件工程。《人月神话》是软件工程领域集大成者。《人月神话》的作者Fred Brooks领导并完成 System/360 和 OS/360 这两个即是放到现在也是巨型软件项目的里程碑项目的经验总结。这本书覆盖了软件项目各个方面的关键概念：从工期管理到团队建设，从程序设计到架构设计，从原型设计到团队交流。\n8 算法之美 《算法之美》这本书扩展算法的应用范围，将算法应用到具体生活当中。本书通过讨论人类事务算法设计的概念，以帮助人们更好地处理日常生活中遇到的难题。内容涉及贝叶斯法则、最优停止理论、时间调度理论、博弈论等。\n9 设计数据密集型应用 从IT时代进入DT时代，数据成为重要的生产要素。《设计数据密集型应用》以数据为核心，描述大规模分布式数据系统的理论与实践。\n10 计算机程序的构造和解释 在《计算机程序的构造与解释》书中深入探讨了程序设计的本质（过程抽象、数据抽象、元语言抽象）。这些本质思想在未来量子计算机时代仍然不会过时。书中构建了很多小系统。比如第一章的计算素数、最大公因数、平方根、积分、黄金比例等，讨论了递归、迭代过程；第二章的图形语言、赫夫曼编码解码、泛型运算、多项式计算等，讨论了数据结构和数据类型系统；第三章实现了一个面向对象系统等；第四章实现Scheme的解释器；第五章通过设计机制和语言实现寄存器机器的各种计算。\n结语 再说一遍：读书在精，不在多。上面推荐的这些书，你可能多多少少见过，但是能静下心来读完一本的人可能寥寥无几。本人静下心来读也只有两本书《深入理解计算机系统》与《设计数据密集型应用》，但是《深入理解计算机系统》这本偏硬件那几章几乎没有读。当然上面大部分书都有通读。\n一年精读一本，保证吸收与转化，每年都是一个台阶的大进步。只可惜自己当年没有做到，也没有这种强烈的意愿。\n","permalink":"https://myself659.github.io/post/programer-book-list/","summary":"\u003cp\u003e2020年加大搬砖的力度，还是一名程序员，继续成长与进步。\u003c/p\u003e\n\u003cp\u003e优秀程序员应该具备以下三方面能力：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e扎实的计算机基础知识（计算机结构，操作系统，数据结构与算法 ）\u003c/p\u003e","title":"程序员进阶精读书籍清单"},{"content":"背景 养成好习惯是一项复杂的任务，但通过科学的方法，我们可以使其变得更加简单和高效。\n以下将从\u0026quot;原子习惯\u0026quot;、\u0026ldquo;微习惯\u0026quot;和\u0026quot;Hook模式\u0026quot;三个策略，以及实践原则，来探讨如何养成好习惯。\n原子习惯 根据James Clear的《原子习惯》一书，我们可以通过四个步骤来建立一个习惯循环（Habit Loop）：\n1.提示（Cue） 2.渴望（Craving） 3.反应（Response） 4.奖励（Reward）。\n对应这四个步骤，Clear也给出了四个原则：\nMake it obvious：让习惯的提示尽可能明显。例如，如果你想养成每天刷LeetCode的习惯，你可以将LeetCode的图标放在你电脑桌面最显眼的位置。\nMake it attractive：让习惯本身具有吸引力。你可以把刷LeetCode看作是一种挑战，每解决一个问题，就是你技术能力的提升。\nMake it easy：让习惯的执行尽可能简单。你可以从解决简单的问题开始，让自己逐渐习惯于这个过程。\nMake it satisfying：让习惯的奖励尽可能满足。例如，每解决一个LeetCode的问题，你就给自己一些小奖励，如休息一会儿或者看一集美剧。\n微习惯 微习惯是指那些每天至少会做一次、完成不需要费力费心、并且完成时间不超过2分钟的习惯。微习惯的触发与完成一般是这样的：一旦某事发生，我就会完成这个习惯。例如，一旦我起床了，我就会立即喝一杯水。这种微小的行为可以帮助我们养成更大的习惯，因为它们可以作为一个习惯的初始阶段，让我们更容易开始。\nHook模式 根据Nir Eyal的《Hooked: How to Build Habit-Forming Products》一书，习惯的形成也可以通过四个步骤：触发器（Trigger）、行动（Action）、奖励（Reward）和投入（Investment）。这个模式强调了投入的重要性，即我们在习惯中投入的越多，就越可能坚持这个习惯。\n实践原则 在实际养成习惯的过程中，我们还需要遵循一些原则：\n从最简单最容易成功的习惯开始：简单的习惯更容易坚持，而且能让你建立起成功的信心。\n一次只专注于培养一个习惯：尽管我们可能有很多想要改变的习惯，但是一次只改变一个习惯可以让我们更专注，提高成功的几率。\n事不过三：这是一个防止习惯断链的策略。即使我们有时候无法坚持习惯，也不要连续两天错过一个习惯，以避免陷入恶性循环。\n通过以上的原子习惯、微习惯和Hook模式，以及遵循实践原则，我们可以更科学、有效地养成好习惯，从而提高生活的质量和工作效率。\n总结 养成好习惯并不是一蹴而就的事情，它需要时间、耐心和恒心。然而，通过使用《原子习惯》、《微习惯》、《Hooked: How to Build Habit-Forming Products》中的策略，我们可以更快、更有效地建立起想要的习惯。\n让我们以行动说话，从最简单的微习惯开始，逐步培养和强化习惯，最终实现自我提升和成长。\n","permalink":"https://myself659.github.io/post/learn/how-to-develop-habit/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e养成好习惯是一项复杂的任务，但通过科学的方法，我们可以使其变得更加简单和高效。\u003c/p\u003e\n\u003cp\u003e以下将从\u0026quot;原子习惯\u0026quot;、\u0026ldquo;微习惯\u0026quot;和\u0026quot;Hook模式\u0026quot;三个策略，以及实践原则，来探讨如何养成好习惯。\u003c/p\u003e","title":"如何养成好习惯"},{"content":"背景 大家都知道好习惯很重要。\n大部分人也就停留在知道，但是仅仅是知道并不能对好习惯养成的帮助很有限。要形成养成好习惯的动力需要深入思考：\n为什么好习惯很重要？\n什么是习惯 先看wiki定义：\nA habit (or wont, as a humorous and formal term) is a routine of behavior that is repeated regularly and tends to occur subconsciously.\n习惯是个人定期、在同一时间或同一天执行的一项任务或例行公事。它是不需要你考虑就会自动会做的行动，它基本上是潜意识上的行动。\n习惯是自然而然的行动。\n习惯是一种一致性的行动。\n习惯是一系列行动的整合。\n习惯是人的第二本能。\n为什么好习惯很重要 从结果上看，习惯可以分好习惯与坏习惯。\n好习惯带来复利效应，如写日记，早起等等，坏习惯带来恶性循环如抽烟，熬夜等等。所以要建立良好的习惯代替坏习惯。\n那么好习惯很重要原因有哪些呢？\n好习惯带来复利效应，好习惯可以积少成多，好习惯可以让我们成为更好的自己，也让我们受益终生\n所有的习惯降低了执行的成本，习惯可以自动化我们的生活,减少大脑的决策负担,让我们拥有更强的执行力\n一个人一天的行为中，大约有5%是非习惯性的，而其它的95%的行为都是源自于习惯，所以个人行为当中习惯占主导地位\n习惯是高频的，习惯时时刻刻在影响我们，习惯形成性格，性格决定命运\n习惯是充满惯性的，一个好习惯一旦建立，很难被打破，所以好习惯可以防止坏习惯\n好习惯可以正向影响家人、朋友、同事,让我们的生活圈子变得更美好\n","permalink":"https://myself659.github.io/post/learn/habit-is-important/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e大家都知道好习惯很重要。\u003c/p\u003e\n\u003cp\u003e大部分人也就停留在知道，但是仅仅是知道并不能对好习惯养成的帮助很有限。要形成养成好习惯的动力需要深入思考：\u003c/p\u003e\n\u003cp\u003e为什么好习惯很重要？\u003c/p\u003e","title":"为什么好习惯很重要"},{"content":"苹果微软亚马逊谷歌Facebook这五大科技巨头在2018年的收入总和超过了8000亿美元。 如果这五大科技巨头保证30%的增长率，这五大科技巨头在2019年的收入总和会超过10000亿美元。\n下面具体看看每个公司的收入结构：\n苹果 从上图可知：\n总收入： 2656亿美元，排名第一\n净利润： 595亿美元，排名第一\n业务收入结构：\niPhone占比为62.8％ Mac电脑占比为9.6％ iPad占比为7.1％ 其他Apple产品和服务（包括Apple Watch，Apple TV，Beats设备，Apple Pay和AppleCare）占比为20.6％ 区域收入结构：\n美洲区占比为42% 欧洲区占比为24% 大中华区占比为20% 日本占比为7% 亚太区（不包括中国与日本）占比为7% 思考 居然没有非洲的统计，非洲也太惨。苹果未来增长区域会是非洲吗？ 手机取代电脑，成为第一终端。\n亚马逊 从上图可知：\n总收入： 2329亿美元，排名第二\n净利润： 101亿美元，排名第五\n业务收入结构：\n在线零售占比为52.8% 第三卖家服务占比为18.4% AWS占比为11.0% 线下实体零售占比为7.4% Amazon Prime占比为6.1% 其他收入占比为4.3% 区域收入结构：\n美国占比为69% 英国占比为6% 德国占比为9% 日本占比为6% 其他国家和地区占比为11% amazon线下实体2018年增长率为197%，利益于amazon go快速增长\nAlphabet 说明一下，Alphabet是Google的母公司。\n从上图可知：\n总收入： 1368亿美元，排名第三\n净利润： 307亿美元，排名第二\n业务收入结构：\n广告(来自Google搜索, YouTube, GooglePlay, gmail, Google Map等)占比为70.4% 广告(来自Google Ads)占比为14.6% 其他收入(包括Google Cloud，Google Mussic等)占比为14.5% 区域收入结构：\n美国占比为46% 美洲区（除美国外）占比为6% EMEA(欧洲、中东和非洲)占比为33% APAC（亚大地区）占比为15% 微软 从上图可知：\n总收入： 1104亿美元，排名第四\n净利润： 166亿美元，排名第四\n业务收入结构：\noffice产品占比为25.7％ Azure产品占比为23.7％ Windows占比为17.7％ 游戏占比为9.4％ Bing广告占比为6.4％ 企业服务占比为5.3％ 设备（如Surface PC）收入占比为4.7％ LinkedIn占比为4.8％ 区域收入结构：\n美国占比为51% 世界其他地区占比为49% FaceBook 从上图可知：\n总收入： 558亿美元，排名第五\n净利润： 221亿美元，排名第三\n业务收入结构：\n广告收入占比为98.5% 支付和其他收入占比为1.5% 区域收入结构：\n美国占比为43% 加拿大占比为3% 欧洲占比为24% 亚太占比为21% 其他国家和地区占比9% 每个用户为FaceBook贡献收入35美元\n小结 苹果收入与利润最高，亚马逊利润最低 微软收入最多元化，FaceBook收入最单一 FaceBook利润率最高，亚马逊利润率最低 每个企业都有自己的核心业务：亚马逊的在线零售，苹果的手机业务，Google搜索广告，FaceBook社交广告，微软的offcie与windows业务。 存在相互竞争，最明显与最激烈属于云服务竞争：AWS, AZURE, GCP三者相互竞争 Amzon主要收入来源是美国，占比接近70% 收入结构主要来自经济发达地区，非洲属于一片经济的沙漠，多写一句话：不知道中非的友谊能否在这片经济的沙漠之上开出发展的花朵呢？ 2022 update 对比一下三年前收入结构最大的变化：除Apple，另外三家就是云业务收入增长迅速，占比扩大。\n参考 ADVERTISING How the Tech Giants Make Their Billions Google Products How Apple, Amazon, Alphabet, and Microsoft Became $1 Trillion Companies 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/tech-giant-income/","summary":"\u003cp\u003e苹果微软亚马逊谷歌Facebook这五大科技巨头在2018年的收入总和超过了8000亿美元。\n如果这五大科技巨头保证30%的增长率，这五大科技巨头在2019年的收入总和会超过10000亿美元。\u003c/p\u003e","title":"苹果微软亚马逊谷歌Facebook五大科技巨头是如何赚钱的"},{"content":"背景 发现自己对情绪没有自己的思考，这方面有很多不知道自己不知道的东西。\n误区总结 没有明确：情绪是人生底层操作系统 低估了情绪价值 低估了被情绪主导的人数与比例 忽略了共情别人的情绪 试图控制自己的情绪，导致情绪的恶性循环 试图分清自己的情绪的好坏 试图逃离情绪 不知道自己处于情绪化主导中（不自觉追求情绪价值） 主动将情绪同各种事情耦合在一起 没有建立适应情绪的行为模式 认为情绪多变，不需要研究与学习 总结 情绪是人生底层操作系统。情绪无时不在，无处不在，与情绪共处，应用情绪才是关键。\n突破不知道自己不知道是一种觉醒。\n","permalink":"https://myself659.github.io/post/rt/%E6%83%85%E7%BB%AA%E8%AE%A4%E7%9F%A5%E7%9A%84%E8%AF%AF%E5%8C%BA/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e发现自己对情绪没有自己的思考，这方面有很多不知道自己不知道的东西。\u003c/p\u003e\n\u003ch2 id=\"误区总结\"\u003e误区总结\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e没有明确：情绪是人生底层操作系统\u003c/li\u003e\n\u003cli\u003e低估了情绪价值\u003c/li\u003e\n\u003cli\u003e低估了被情绪主导的人数与比例\u003c/li\u003e\n\u003cli\u003e忽略了共情别人的情绪\u003c/li\u003e\n\u003cli\u003e试图控制自己的情绪，导致情绪的恶性循环\u003c/li\u003e\n\u003cli\u003e试图分清自己的情绪的好坏\u003c/li\u003e\n\u003cli\u003e试图逃离情绪\u003c/li\u003e\n\u003cli\u003e不知道自己处于情绪化主导中（不自觉追求情绪价值）\u003c/li\u003e\n\u003cli\u003e主动将情绪同各种事情耦合在一起\u003c/li\u003e\n\u003cli\u003e没有建立适应情绪的行为模式\u003c/li\u003e\n\u003cli\u003e认为情绪多变，不需要研究与学习\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"总结\"\u003e总结\u003c/h2\u003e\n\u003cp\u003e情绪是人生底层操作系统。情绪无时不在，无处不在，与情绪共处，应用情绪才是关键。\u003c/p\u003e","title":"情绪认知的误区"},{"content":"什么是DoH DoH是DNS over HTTPS。\n传统DNS相当于DNS over UDP。\nDoH带来哪些好处？ 采用DoH对用户来说有如下好处：\nDoH协议不允许其他用户，服务提供商或第三方查看您访问的网站并收集数据，保护了用户的隐私 DoH协议有利于防止欺骗与钓鱼攻击，保护在线数据的安全和隐私 加速DNS解析，提高网页访问速度 对于天朝人民，还有另一个好处就是科学上网 DoH现在可以使用吗？ 1 We\u0026#39;ve enabled an experiment in Chrome 79 for a fraction of our users. Chrome 79版本对部分用户开启。\nfirefox 70版本已经支持DoH。\n如何使用DoH? 以firefox为例：\n在地址输入：about:preferences#general，找到Network Settings选项，点击Settings即可进入设置，具体如下：\n参考 DNS over HTTPS Google Public DNS over HTTPS (DoH) supports RFC 8484 standard Moving to an era of Decentralized DNS registry Running a DNS over HTTPS Client 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/network/about-doh/","summary":"\u003ch1 id=\"什么是doh\"\u003e什么是DoH\u003c/h1\u003e\n\u003cp\u003eDoH是DNS over HTTPS。\u003c/p\u003e\n\u003cp\u003e传统DNS相当于DNS over UDP。\u003c/p\u003e\n\u003ch1 id=\"doh带来哪些好处\"\u003eDoH带来哪些好处？\u003c/h1\u003e\n\u003cp\u003e采用DoH对用户来说有如下好处：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDoH协议不允许其他用户，服务提供商或第三方查看您访问的网站并收集数据，保护了用户的隐私\u003c/li\u003e\n\u003cli\u003eDoH协议有利于防止欺骗与钓鱼攻击，保护在线数据的安全和隐私\u003c/li\u003e\n\u003cli\u003e加速DNS解析，提高网页访问速度\u003c/li\u003e\n\u003cli\u003e对于天朝人民，还有另一个好处就是科学上网\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"doh现在可以使用吗\"\u003eDoH现在可以使用吗？\u003c/h1\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWe\u0026#39;ve enabled an experiment in Chrome 79 for a fraction of our users.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003eChrome 79版本对部分用户开启。\u003c/p\u003e","title":"DoH FAQ"},{"content":"背景 这是一个信息爆炸，连接无限，复杂快变的时代。\n通才 通才(Polymath),指的是那些具有广泛涉猎知识和兴趣,在不同领域都有深入理解与创造力的人。其主要特点如下：\n广阔的视野 灵活的思维 强烈的好奇心和广泛的兴趣 心智富有弹性，有深度也有广度 跨领域切换与实践 通才的优点 成为一名通才具有以下优点：\n通才可以将技能库的任意两项或多项技能组合出一项新的技能 通才有丰富的知识与技能储备，有利于快速学习新的技能\n通才更容易玩跨界\n通才更容易适应未来的变化\n通才思想开放，思维活跃，不局限某一个领域有利于解决复杂问题\n通才在市场上（不仅是就业市场）有更多的机会\n通才具有更强的反脆弱性\n通才有很强的组合能力与创新能力（大多数创新来自于组合）\n通才利于领导与管理\n如何成为通才呢？ 学习常用的心智模型，心智模型是通用的，是跨学科的\n从基础开始\n学习如何学习，如何快速学习，如何构建自己的知识体系\n练习抽象总结及举一反三\n多角度研究最典型的案例\n兴趣广泛，广泛阅读，培养好奇心\n早动手，多实验，多实践\n项目驱动学习\n","permalink":"https://myself659.github.io/post/learn/to-be-polymath-t%E5%9E%8B%E9%80%9A%E6%89%8D/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e这是一个信息爆炸，连接无限，复杂快变的时代。\u003c/p\u003e\n\u003ch2 id=\"通才\"\u003e通才\u003c/h2\u003e\n\u003cp\u003e通才(Polymath),指的是那些具有广泛涉猎知识和兴趣,在不同领域都有深入理解与创造力的人。其主要特点如下：\u003c/p\u003e","title":"做一名通才吧"},{"content":"为什么要云节点 主要由以下几个原因：\n国内GFW太狠，github都不能幸免，代码都不能下载，影响正常的开发 rust这个编译太占用cpu，内存，硬盘 rust编译的时候cpu一直在叫，影响个人心情，进而影响开发效率 云节点方便共享 花小钱买时间是一件很划算的事情 搭建步骤 准备节点 具体参考这篇文章Installing Substrate，各种类型的操作系统都有说明。\n运行节点 设置代理 这里我采用是caddy作为代理\n具体配置参考如下：\n1 2 3 4 5 yourwssaddr { proxy / http://0.0.0.0:9944 { websocket } } 启动节点 1 ./target/release/substrate --dev --ws-port 9944 浏览器 具体参考apps里面说明即可。\n运行如下命令即可：\n1 2 3 4 git clone https://github.com/polkadot-js/apps cd apps yarn yarn run start 在caddy中配置浏览器的代理：\n1 2 3 4 5 6 example.com { proxy / localhost:3000 { transparent } gzip } 最终具体效果如下：\n这样你就拥有一个属于自己的区块链。具体代码参考hello-node\n参考 Build Substrate on Ubuntu: step-by-step guide 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/substrate-cloud-node/","summary":"\u003ch1 id=\"为什么要云节点\"\u003e为什么要云节点\u003c/h1\u003e\n\u003cp\u003e主要由以下几个原因：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e国内GFW太狠，github都不能幸免，代码都不能下载，影响正常的开发\u003c/li\u003e\n\u003cli\u003erust这个编译太占用cpu，内存，硬盘\u003c/li\u003e\n\u003cli\u003erust编译的时候cpu一直在叫，影响个人心情，进而影响开发效率\u003c/li\u003e\n\u003cli\u003e云节点方便共享\u003c/li\u003e\n\u003cli\u003e花小钱买时间是一件很划算的事情\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"搭建步骤\"\u003e搭建步骤\u003c/h1\u003e\n\u003ch2 id=\"准备节点\"\u003e准备节点\u003c/h2\u003e\n\u003cp\u003e具体参考这篇文章\u003ca href=\"https://substrate.dev/docs/en/getting-started/installing-substrate\"\u003eInstalling Substrate\u003c/a\u003e，各种类型的操作系统都有说明。\u003c/p\u003e","title":"搭建Substrate开发云节点"},{"content":"vector in Rust 1 2 3 4 5 struct Vec { length: u32, //Present size of vector ptr: RefCell, //Pointer to allocate Memory on Heap capacity: u32, //Max size vector can hold, after this vector need to be resized/reallocated } create 不指定数据类型 1 2 let mut v1 = Vec::new(); let mut v2 = vec![]; 指定数据类型 1 2 3 let mut v1:Vec\u0026lt;i32\u0026gt; = Vec::new(); let mut v2:Vec\u0026lt;i32\u0026gt; = vec![]; let mut v3 = vec![1i32, 2,3]; 创建并初始化 1 2 3 4 5 6 let mut v1 = vec![1,2,3]; let mut v2:Vec\u0026lt;i32\u0026gt; = vec![1,2,3]; let mut v3 = vec![1i32,2,3]; let mut v4 = vec![1; 10]; let mut v5: Vec\u0026lt;i32\u0026gt; = (0..10).collect(); let v6: Vec \u0026lt;i32\u0026gt; = [1,2,3].to_vec(); 2D vector 1 2 3 let mut 2d_vec: Vec\u0026lt;Vec\u0026lt;i32\u0026gt;\u0026gt; = Vec::new(); let mut 2d_vec: Vec\u0026lt;Vec\u0026lt;i32\u0026gt;\u0026gt; = vec![vec![0; row as usize]; col as usize]; convert from slic 1 2 3 4 5 fn main() { let a = \u0026amp;[1,2,3]; let v1 = a.to_vec(); println!(\u0026#34;{:?}\u0026#34;, v1) } 1 2 3 4 5 fn main() { let a = \u0026amp;[1,2,3]; let v1 = Vec::from(a); println!(\u0026#34;{:?}\u0026#34;, v1) } 1 2 3 4 5 6 fn main() { let mut v1 = Vec::new(); let a = \u0026amp;[1,2,3]; v1.extend_from_slice(a); println!(\u0026#34;{:?}\u0026#34;, v1) } 访问元素 read 1 2 3 4 let mut v1 = vec![1,2,3]; let item = v1[0]; println!(\u0026#34;{:?},{:?}\u0026#34;, v1.get(0),v1.get(100)); //Some(1),None slice 1 2 3 let v1 = vec![1,2,3,4,5]; let v2 = v1[1..]; let v2 = v1[1..3]; write 1 2 let mut v1 = vec![1,2,3]; v1[0] = 11; insert 1 2 3 4 5 6 fn main() { let mut v1 = vec![1,2,3]; v1.insert(2,1); println!(\u0026#34;v1:{:?}\u0026#34;,v1); } // v1:[1, 2, 1, 3] remove 1 2 3 4 let mut v1 = vec![1,2,3]; v1.remove(0); println!(\u0026#34;v1:{:?}\u0026#34;,v1); // v1:[2, 3] clear 1 2 3 4 5 6 7 fn main() { let mut weapons = vec![\u0026#34;Andúril\u0026#34;, \u0026#34;Sting\u0026#34;, \u0026#34;Glamdring\u0026#34;]; weapons.clear(); println!(\u0026#34;Weapons after the war: {:?}\u0026#34;, weapons); } append 1 2 3 4 5 6 7 fn main() { let mut v1 = vec![1,2,3]; let mut v2 = vec![4,5,6]; v1.append(\u0026amp;mut v2); println!(\u0026#34;v1:{:?}\u0026#34;,v1); } // v1:[1, 2, 3, 4, 5, 6] extend 1 2 3 4 5 6 let mut vec1 = vec![1, 2, 3]; let vec2 = vec![4, 5, 6]; vec1.extend(vec2); assert_eq!(vec1, [1, 2, 3, 4, 5, 6]); 1 2 3 4 5 6 7 let vec1 = vec![1, 2, 3]; let vec2 = vec![4, 5, 6]; let mut vec3 = vec1; vec3.extend(vec2.into_iter()); assert_eq!(vec3, [1, 2, 3, 4, 5, 6]); 1 2 3 4 5 6 7 8 9 fn main() { let mut army_of_men = vec![\u0026#34;Aragorn\u0026#34;]; let elves_and_dwarves = vec![\u0026#34;Legolas\u0026#34;, \u0026#34;Gimli\u0026#34;]; // The Elves and Dwarves join the coalition army_of_men.extend(elves_and_dwarves); println!(\u0026#34;United Army: {:?}\u0026#34;, army_of_men); } sort 1 2 3 4 5 6 7 8 9 10 11 12 fn main() { let mut v1 = vec![1,2,3, 3,2,1]; v1.sort(); println!(\u0026#34;v1:{:?}\u0026#34;,v1); let result = v1.binary_search(\u0026amp;2); println!(\u0026#34;result:{:?}\u0026#34;,result); } // v1:[1, 1, 2, 2, 3, 3] // result:Ok(3) resize 1 2 3 4 5 6 7 8 9 fn main() { let mut v1 = vec![1,2,3, 3,2,1]; v1.resize(10, 0); println!(\u0026#34;v1:{:?}\u0026#34;,v1); v1.resize(2, 0); println!(\u0026#34;v1:{:?}\u0026#34;,v1); } // v1:[1, 2, 3, 3, 2, 1, 0, 0, 0, 0] // v1:[1, 2] push and pop 1 2 3 4 let mut v1 = vec![1,2,3]; v1.push(4); v1.push(5); let item = v1.pop(); iterator 1 2 3 4 5 6 7 8 9 10 11 12 13 let mut v = vec![1,2,3]; for item in \u0026amp;v { } for item in \u0026amp;mut v { } for item in v { } 1 2 3 4 5 6 7 8 9 10 11 12 13 let mut v = vec![1,2,3]; for (i, x) in v.iter().enumerate() { println!(\u0026#34;In position {} we have value {}\u0026#34;, i, x); } for x in v.iter() { println!(\u0026#34;item:{}\u0026#34;,x); } for x in v.iter_mut() { *x *= 3; } println!(\u0026#34;Updated vector: {:?}\u0026#34;, xs); 1 2 3 let items = vec![1, 2, 3]; let sitems = items.into_iter().map(|x| x.to_string()).collect::\u0026lt;Vec\u0026lt;_\u0026gt;\u0026gt;(); println!(\u0026#34;sitem: {:?}\u0026#34;,sitems); concat() 1 2 3 4 5 6 7 8 9 fn main() { let elves = vec![\u0026#34;Legolas\u0026#34;, \u0026#34;Thranduil\u0026#34;]; let dwarves = vec![\u0026#34;Gimli\u0026#34;, \u0026#34;Thorin\u0026#34;]; // Uniting Elves and Dwarves let united_army = [elves, dwarves].concat(); println!(\u0026#34;United army: {:?}\u0026#34;, united_army); } 属性 capacity 1 2 let mut v1 = vec![1,2,3]; println!(\u0026#34;capacity={}\u0026#34;,v1.capacity()); len 1 2 let mut v1 = vec![1,2,3]; println!(\u0026#34;len={}\u0026#34;,v1.len()); is_empty 1 2 let mut v1 = vec![1,2,3]; println!(\u0026#34;is_empty={}\u0026#34;,v1.is_empty()); contains 1 2 3 4 5 6 7 8 9 fn main() { let mut v1 = vec![1,2,3]; println!(\u0026#34;{} is in v1:{:?}\u0026#34;,1, v1.contains(\u0026amp;1)); println!(\u0026#34;{} is in v1:{:?}\u0026#34;,11, v1.contains(\u0026amp;11)); } // 1 is in v1:true // 11 is in v1:false application storing enum in vector 1 2 3 4 5 6 7 8 9 10 11 12 13 14 use std::{string::String, u32}; #[derive(Debug)] enum Address{ NoIP, IPv4(u8,u8,u8,u8), IPv6(String), } fn main() { let mut v:Vec\u0026lt;Address\u0026gt; = Vec::new(); v.push(Address::NoIP); v.push(Address::IPv4(1,2,3,4)); println!(\u0026#34;{:#?}\u0026#34;,v[1]); } into_iter().enumerate() 1 2 3 4 5 6 7 fn main() { let v = vec![3,2,4]; for (idx, num) in v.into_iter().enumerate() { println!(\u0026#34;index={}, value={}\u0026#34;, idx, num); } } ","permalink":"https://myself659.github.io/post/rust/rust-vec/","summary":"\u003ch2 id=\"vector-in-rust\"\u003evector in Rust\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003estruct Vec {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  length: u32,            //Present size of vector\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ptr: RefCell,           //Pointer to allocate Memory on Heap\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  capacity: u32,          //Max size vector can hold, after this vector need to be resized/reallocated\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"create\"\u003ecreate\u003c/h2\u003e\n\u003ch3 id=\"不指定数据类型\"\u003e不指定数据类型\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v1 = Vec::new();  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v2 = vec![];\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"指定数据类型\"\u003e指定数据类型\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v1:Vec\u0026lt;i32\u0026gt; = Vec::new();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v2:Vec\u0026lt;i32\u0026gt; = vec![];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v3 = vec![1i32, 2,3];\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"创建并初始化\"\u003e创建并初始化\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v1 = vec![1,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v2:Vec\u0026lt;i32\u0026gt; = vec![1,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v3 = vec![1i32,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v4 = vec![1; 10];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v5: Vec\u0026lt;i32\u0026gt; = (0..10).collect();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet v6: Vec \u0026lt;i32\u0026gt; = [1,2,3].to_vec();\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"2d-vector\"\u003e2D vector\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut 2d_vec: Vec\u0026lt;Vec\u0026lt;i32\u0026gt;\u0026gt; = Vec::new();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut 2d_vec: Vec\u0026lt;Vec\u0026lt;i32\u0026gt;\u0026gt; = \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evec![vec![0; row as usize]; col as usize];\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"convert-from-slic\"\u003econvert from slic\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efn main() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let a = \u0026amp;[1,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let v1 = a.to_vec();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;{:?}\u0026#34;, v1)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efn main() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let a = \u0026amp;[1,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let v1 = Vec::from(a);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;{:?}\u0026#34;, v1)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efn main() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let mut v1 = Vec::new();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let a = \u0026amp;[1,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    v1.extend_from_slice(a);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;{:?}\u0026#34;, v1)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"访问元素\"\u003e访问元素\u003c/h2\u003e\n\u003ch3 id=\"read\"\u003eread\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v1 = vec![1,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet item = v1[0];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprintln!(\u0026#34;{:?},{:?}\u0026#34;, v1.get(0),v1.get(100));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e//Some(1),None\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"slice\"\u003eslice\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet v1 = vec![1,2,3,4,5];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet v2 = v1[1..];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet v2 = v1[1..3];\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"write\"\u003ewrite\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v1 = vec![1,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ev1[0] = 11;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"insert\"\u003einsert\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efn main() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let mut v1 = vec![1,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    v1.insert(2,1);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;v1:{:?}\u0026#34;,v1);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// v1:[1, 2, 1, 3]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"remove\"\u003eremove\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v1 = vec![1,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ev1.remove(0);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprintln!(\u0026#34;v1:{:?}\u0026#34;,v1);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// v1:[2, 3]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"clear\"\u003eclear\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efn main() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let mut weapons = vec![\u0026#34;Andúril\u0026#34;, \u0026#34;Sting\u0026#34;, \u0026#34;Glamdring\u0026#34;];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    weapons.clear();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;Weapons after the war: {:?}\u0026#34;, weapons);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"append\"\u003eappend\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efn main() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let mut v1 = vec![1,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let mut v2 = vec![4,5,6];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    v1.append(\u0026amp;mut v2);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;v1:{:?}\u0026#34;,v1);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// v1:[1, 2, 3, 4, 5, 6]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"extend\"\u003eextend\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut vec1 = vec![1, 2, 3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet vec2 = vec![4, 5, 6];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evec1.extend(vec2);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eassert_eq!(vec1, [1, 2, 3, 4, 5, 6]);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet vec1 = vec![1, 2, 3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet vec2 = vec![4, 5, 6];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut vec3 = vec1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evec3.extend(vec2.into_iter());\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eassert_eq!(vec3, [1, 2, 3, 4, 5, 6]);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e9\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efn main() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let mut army_of_men = vec![\u0026#34;Aragorn\u0026#34;];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let elves_and_dwarves = vec![\u0026#34;Legolas\u0026#34;, \u0026#34;Gimli\u0026#34;];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // The Elves and Dwarves join the coalition\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    army_of_men.extend(elves_and_dwarves);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;United Army: {:?}\u0026#34;, army_of_men);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"sort\"\u003esort\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efn main() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let mut v1 = vec![1,2,3, 3,2,1];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    v1.sort();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;v1:{:?}\u0026#34;,v1);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let result = v1.binary_search(\u0026amp;2);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;result:{:?}\u0026#34;,result);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// v1:[1, 1, 2, 2, 3, 3]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// result:Ok(3)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"resize\"\u003eresize\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e9\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efn main() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let mut v1 = vec![1,2,3, 3,2,1];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    v1.resize(10, 0);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;v1:{:?}\u0026#34;,v1);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    v1.resize(2, 0);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;v1:{:?}\u0026#34;,v1);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// v1:[1, 2, 3, 3, 2, 1, 0, 0, 0, 0]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// v1:[1, 2]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"push-and-pop\"\u003epush and pop\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v1 = vec![1,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ev1.push(4);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ev1.push(5);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet item = v1.pop();\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"iterator\"\u003eiterator\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v = vec![1,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efor item in \u0026amp;v {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efor item in \u0026amp;mut v {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efor item in v {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elet\u003c/span\u003e \u003cspan class=\"n\"\u003emut\u003c/span\u003e \u003cspan class=\"n\"\u003ev\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003evec\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eiter\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenumerate\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eprintln\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;In position {} we have value {}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eiter\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       \u003cspan class=\"n\"\u003eprintln\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;item:{}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eiter_mut\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e*=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eprintln\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Updated vector: {:?}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003exs\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet items = vec![1, 2, 3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet sitems = items.into_iter().map(|x| x.to_string()).collect::\u0026lt;Vec\u0026lt;_\u0026gt;\u0026gt;();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprintln!(\u0026#34;sitem: {:?}\u0026#34;,sitems);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"concat\"\u003econcat()\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e9\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efn main() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let elves = vec![\u0026#34;Legolas\u0026#34;, \u0026#34;Thranduil\u0026#34;];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let dwarves = vec![\u0026#34;Gimli\u0026#34;, \u0026#34;Thorin\u0026#34;];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Uniting Elves and Dwarves\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let united_army = [elves, dwarves].concat();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;United army: {:?}\u0026#34;, united_army);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"属性\"\u003e属性\u003c/h2\u003e\n\u003ch3 id=\"capacity\"\u003ecapacity\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v1 = vec![1,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprintln!(\u0026#34;capacity={}\u0026#34;,v1.capacity());\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"len\"\u003elen\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v1 = vec![1,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprintln!(\u0026#34;len={}\u0026#34;,v1.len());\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"is_empty\"\u003eis_empty\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elet mut v1 = vec![1,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprintln!(\u0026#34;is_empty={}\u0026#34;,v1.is_empty());\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"contains\"\u003econtains\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e9\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efn main() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let mut v1 = vec![1,2,3];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;{} is in v1:{:?}\u0026#34;,1, v1.contains(\u0026amp;1));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    println!(\u0026#34;{} is in v1:{:?}\u0026#34;,11, v1.contains(\u0026amp;11));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// 1 is in v1:true\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// 11 is in v1:false\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"application\"\u003eapplication\u003c/h2\u003e\n\u003ch3 id=\"storing-enum-in-vector\"\u003estoring enum in vector\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003estd\u003c/span\u003e\u003cspan class=\"p\"\u003e::{\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"ne\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eu32\u003c/span\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#[derive(Debug)]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eenum\u003c/span\u003e \u003cspan class=\"n\"\u003eAddress\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eNoIP\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eIPv4\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eu8\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eu8\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eu8\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eu8\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eIPv6\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ne\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003efn\u003c/span\u003e \u003cspan class=\"n\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003elet\u003c/span\u003e \u003cspan class=\"n\"\u003emut\u003c/span\u003e \u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eVec\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eAddress\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eVec\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003enew\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eAddress\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eNoIP\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eAddress\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eIPv4\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eprintln\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{:#?}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"into_iterenumerate\"\u003einto_iter().enumerate()\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003efn\u003c/span\u003e \u003cspan class=\"n\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003elet\u003c/span\u003e \u003cspan class=\"n\"\u003ev\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003evec\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eidx\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003enum\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einto_iter\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenumerate\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003eprintln\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;index={}, value={}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eidx\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003enum\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"Rust Vec 101"},{"content":"前言 最近golang的1.13版本发布了，有很多新特性与改进合入。这里主要分析sync.pool的优化。\n本文主要解答以下几个问题：\nsync.pool优化体现在哪里？ 优化是如何实现？ 优化的好处有哪些？ 优化 具体优化项如下：\n无锁化 GC策略 无锁化 sync.pool实现了无锁化，具体如下：\ngo1.12.1版本实现\n1 2 3 4 5 6 // Local per-P Pool appendix. type poolLocalInternal struct { private interface{} // Can be used only by the respective P. shared []interface{} // Can be used by any P. Mutex // Protects shared. } go1.13版本\n1 2 3 4 5 // Local per-P Pool appendix. type poolLocalInternal struct { private interface{} // Can be used only by the respective P. shared poolChain // Local P can pushHead/popHead; any P can popTail. } 通过上面对比发现了go1.12版本的Mutex删除了。那么go1.13版本又是如何实现无锁化的呢？\n先回答问题：go1.13通过poolChain实现SPMC的无锁队列来实现无锁化。\npoolChain是什么东东呢？\n别急，代码面前无秘密。 我们具体看一下代码就可以了。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 // poolChain is a dynamically-sized version of poolDequeue. // // This is implemented as a doubly-linked list queue of poolDequeues // where each dequeue is double the size of the previous one. Once a // dequeue fills up, this allocates a new one and only ever pushes to // the latest dequeue. Pops happen from the other end of the list and // once a dequeue is exhausted, it gets removed from the list. type poolChain struct { // head is the poolDequeue to push to. This is only accessed // by the producer, so doesn\u0026#39;t need to be synchronized. head *poolChainElt // tail is the poolDequeue to popTail from. This is accessed // by consumers, so reads and writes must be atomic. tail *poolChainElt } type poolChainElt struct { poolDequeue // next and prev link to the adjacent poolChainElts in this // poolChain. // // next is written atomically by the producer and read // atomically by the consumer. It only transitions from nil to // non-nil. // // prev is written atomically by the consumer and read // atomically by the producer. It only transitions from // non-nil to nil. next, prev *poolChainElt } 关于poolChain是如何实现SPMC无锁队列？具体可以分析poolqueue.go的代码。 这一部分不展开说明，要点如下：\n无锁队列是SPMC 无锁队列是可以灵活调整大小，调整大小的方法：slice+double-list实现（根据这个思路来阅读代码也是容易理解 ） 无锁队列的实现基础是CAS 好处 避免锁的开销，mutex变成atomic GC策略 相比较于go1.12版本，go1.13版本中增加了victim cache。具体作法是：\nGC处理过程直接回收oldPools的对象 GC处理并不直接将allPools的object直接进行GC处理，而是保存到oldPools，等到下一个GC周期到了再处理 具体代码如下：\n1 2 3 4 var ( allPoolsMu Mutex allPools []*Pool ) 1 2 3 4 5 6 7 8 9 10 11 12 var ( allPoolsMu Mutex // allPools is the set of pools that have non-empty primary // caches. Protected by either 1) allPoolsMu and pinning or 2) // STW. allPools []*Pool // oldPools is the set of pools that may have non-empty victim // caches. Protected by STW. oldPools []*Pool ) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 func poolCleanup() { // This function is called with the world stopped, at the beginning of a garbage collection. // It must not allocate and probably should not call any runtime functions. // Because the world is stopped, no pool user can be in a // pinned section (in effect, this has all Ps pinned). // Drop victim caches from all pools. for _, p := range oldPools { p.victim = nil p.victimSize = 0 } // Move primary cache to victim cache. for _, p := range allPools { p.victim = p.local p.victimSize = p.localSize p.local = nil p.localSize = 0 } // The pools with non-empty primary caches now have non-empty // victim caches and no pools have primary caches. oldPools, allPools = allPools, nil } 这样可导致Get的实现有变化，原来的实现是：\n先从本P绑定的poolLocal获取对象：先从本poolLocal的private池获取对象，再从本poolLocal的shared池获取对象 上一步没有成功获取对象，再从其他P的shared池获取对象 上一步没有成功获取对象，则从Heap申请对象 引入victim cache，Get实现变成如下：\n先从本P绑定的poolLocal获取对象：先从本poolLocal的private池获取对象，再从本poolLocal的shared池获取对象 上一步没有成功获取对象，再从其他P的shared池获取对象 上一步没有成功，则从victim cache获取对象 上一步没有成功获取对象，则从Heap申请对象 具体代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 func (p *Pool) getSlow(pid int) interface{} { // See the comment in pin regarding ordering of the loads. size := atomic.LoadUintptr(\u0026amp;p.localSize) // load-acquire locals := p.local // load-consume // Try to steal one element from other procs. for i := 0; i \u0026lt; int(size); i++ { l := indexLocal(locals, (pid+i+1)%int(size)) if x, _ := l.shared.popTail(); x != nil { return x } } // Try the victim cache. We do this after attempting to steal // from all primary caches because we want objects in the // victim cache to age out if at all possible. // 尝试从victim cache获取 size = atomic.LoadUintptr(\u0026amp;p.victimSize) if uintptr(pid) \u0026gt;= size { return nil } locals = p.victim l := indexLocal(locals, pid) if x := l.private; x != nil { l.private = nil return x } for i := 0; i \u0026lt; int(size); i++ { l := indexLocal(locals, (pid+i)%int(size)) if x, _ := l.shared.popTail(); x != nil { return x } } // Mark the victim cache as empty for future gets don\u0026#39;t bother // with it. atomic.StoreUintptr(\u0026amp;p.victimSize, 0) return nil } 好处 空间上通过引入victim cache增加了Get获取内存的选项，增加了对象复用的概率 时间上通过延迟GC，增加了对象复用的时间长度 上面这个两个方面降低了GC开销，增加了对象使用效率 参考 深入分析Golang sync.pool Using sync.Pool ","permalink":"https://myself659.github.io/post/golang/golang-sync-pool-2/","summary":"\u003ch1 id=\"前言\"\u003e前言\u003c/h1\u003e\n\u003cp\u003e最近golang的1.13版本发布了，有很多新特性与改进合入。这里主要分析sync.pool的优化。\u003c/p\u003e\n\u003cp\u003e本文主要解答以下几个问题：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003esync.pool优化体现在哪里？\u003c/li\u003e\n\u003cli\u003e优化是如何实现？\u003c/li\u003e\n\u003cli\u003e优化的好处有哪些？\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"优化\"\u003e优化\u003c/h1\u003e\n\u003cp\u003e具体优化项如下：\u003c/p\u003e","title":"深入分析Golang sync.pool优化"},{"content":"不投资中国才是巨大的风险 最近，桥水基金创始人及《原则》的作者瑞·达利欧公开表示：不投资中国才是巨大的风险。如下图所示：\n作为一个世界富豪榜排名前100的大富豪，\n作为一个掌握1500亿美元的对冲基金的掌门人，\n作为一个美国人，\n作为一个在过去40年多次成功预测经济危机的投资人。\n他的话当然不同凡想，引人思考。\n当然我们不能随便轻信这个结论，我们应该具体了解一下，他是如何得出这个结论？下面展开说明如下：\n瑞·达利欧的理由 模型 在视频中瑞达利欧提出一个国家实力的模型，这个模型从六个方面来衡量一个国家的实力，具体如下：\n科技和教育 生产 贸易 军事 金融 货币储备地位 下面这一张图是荷兰，英国，美国，中国这个四个国家在最近几百年来在上述六个方面的实力曲线图：\n多样性原则 作为一个掌握1500亿美元的对冲基金的掌门人，瑞达利欧深知保持投资多样性十分必要。他们的投资是面向全球。中国市场情况与欧美不相同，具有独特性，是风险投资组合保持多样性不或缺少的选择。\n相对风险 风险无处不在。常人都明白，都有风险的情况，选择风险最小的。\n下面对比欧洲，美国，中国三个地区的风险情况。\n先说欧洲，瑞·达利欧认为欧洲有巨大风险，存在以下问题：\n货币政策失效 政治分裂，如英国脱欧 不参与科技革命 再看美国，瑞·达利欧认为美国存在以下问题：\n财富贫富差距 缺少有效的货币政策 政治系统的冲突 最后看中国，瑞·达利欧认为：相比较于美国，中国有更大货币政策和财政政策空间，并正在处理债务问题。\n结合上面的比较，瑞·达利欧认为相比较于其他市场，中国的市场风险最小。\n中国的成长与实力 先看过去的成长，以资本市场为例：\n说明：红色表示股票市场，蓝色表示债券市场；左边是中国资本市场空间，右边是外国资本持有的中国金融资产情况。\n补充一下从左边曲线图可以看出中国的股票市场领域虽然十年来上证指数基本无增长，但是市值还是有增长，但是没有跟上GDP的增长。\n视角回到现在，首先看一下科技领域的风险投资情况：\n从上图可知:\n中国在fintech领域领先美国排名第一 在AI and machine learning（AI和机器学习）领域排名第三，落后于美国与英国 在wearables(可穿戴设备)领域排名第二 在virtual reality(虚拟现实)领域排名第二 在educational technology(教育技术)领域排名第二 在autonomous driving(自动驾驶)领域排名第二 再看一下中美独角兽对比：\n显而易见，中国在独角兽数量上与美国有13%左右的差距，但是估值上仅2%的差距。\n最后看一下中美实力对比：\n看到这张图，相信大家会理解中国再继续闷声发大财不是一件容易的事情了。\n相信这些数据会让很多人得出一个结论：中美毛衣冲突不影响中国继续崛起的进程。\n对中国十分熟悉 还有一点考虑，视频中没有明确投及，就是瑞·达利欧对中国的熟悉，作为一名美国人，其实瑞·达利欧对中国十分熟悉，他从1984年第一次来到中国后，此后35年里他不断地来到中国并熟悉中国，并且他的一个儿子曾经在中国读书。\n后记 本文只是简单介绍，关于瑞达利欧是如何看待中美毛衣冲突，更多信息请看原始视频，原始视频时长有31分钟。关注本公众帐号，输入 投资中国，获取原始视频的百度云下载链接。\n参考 《原则》作者瑞·达利欧烧脑大作(1): 经济机器是怎样运行的 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/risk-of-vesting-china/","summary":"\u003ch1 id=\"不投资中国才是巨大的风险\"\u003e不投资中国才是巨大的风险\u003c/h1\u003e\n\u003cp\u003e最近，桥水基金创始人及《原则》的作者瑞·达利欧公开表示：不投资中国才是巨大的风险。如下图所示：\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"不投资中国才是巨大的风险\" loading=\"lazy\" src=\"/images/economy/not-invest-china-is-very-risky.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e作为一个世界富豪榜排名前100的大富豪，\u003c/p\u003e\n\u003cp\u003e作为一个掌握1500亿美元的对冲基金的掌门人，\u003c/p\u003e","title":"瑞·达利欧：不投资中国才是巨大的风险"},{"content":"由于墙的原因，导致cargo build，cargo run都会出现概率性失败，并且整个过程十分缓慢。\n下面是解决方案：\n方案1 在 ~/.cargo/config文件（如果没有创建一个）下添加如下内容：\n1 2 3 4 5 [source.crates-io] replace-with = \u0026#34;rustcc\u0026#34; [source.rustcc] registry = \u0026#34;https://code.aliyun.com/rustcc/crates.io-index.git\u0026#34; 方案1现在还是实验阶段，充满变数与不确定性。不适用于CI/CD。\n方案2 在阿里云，aws上申请一个香港地区云主机，将build工作交给云主机\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/rust/rust-crate-speedup/","summary":"\u003cp\u003e由于墙的原因，导致cargo build，cargo run都会出现概率性失败，并且整个过程十分缓慢。\u003c/p\u003e\n\u003cp\u003e下面是解决方案：\u003c/p\u003e\n\u003ch2 id=\"方案1\"\u003e方案1\u003c/h2\u003e\n\u003cp\u003e在 ~/.cargo/config文件（如果没有创建一个）下添加如下内容：\u003c/p\u003e","title":"Rust crate加速"},{"content":"说明 完全是为了记录自己的操作记录，换一台新机器真是免不了要装python。记录下来，便于以后操作。\napt-get安装 1 2 3 4 5 6 7 apt update apt install software-properties-common add-apt-repository ppa:deadsnakes/ppa apt install python3.7 源码安装 1 2 3 4 5 6 7 8 sudo apt update sudo apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz tar -xf Python-3.7.3.tar.xz cd Python-3.7.3 ./configure --enable-optimizations make make altinstall 更新python3.9 1 2 3 $ sudo add-apt-repository ppa:deadsnakes/ppa $ sudo apt update $ sudo apt install python3.9 install pip 1 apt-get install python3-pip install virutalenv 1 pip3 install virtualenv 1 python3 -m pip install --user virtualenv 1 python3 -m venv env 1 source venv/bin/activate install pipenv 1 pip install --user pipenvd 1 pipenv install tweepy python-dotenv 1 pipenv run python twitter_client.py install jupyter 1 2 python3 -m pip install --upgrade pip python3 -m pip install jupyter pip basic 查看包状态 1 pip show pkgname 不使用缓存 1 pip install --no-cache-dir --default-timeout=10000 pkgname 更新包 1 pip install -U pkgname 指定源 有时候安装一些依赖包，网不好，直接超时，或者这个包就是死都下不下来的时候，可以指定国内源镜像。 pip install -i 国内镜像地址 包名\ne.g. pip install -i https://mirrors.aliyun.com/pypi/simple/ 这是临时指定镜像地址\n清华：https://pypi.tuna.tsinghua.edu.cn/simple\n阿里云：https://mirrors.aliyun.com/pypi/simple/\n中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/\n华中理工大学：https://pypi.hustunique.com/\n山东理工大学：https://pypi.sdutlinux.org/\n豆瓣：https://pypi.douban.com/simple/\n修改配置参考：https://cloud.tencent.com/developer/article/1566247\npipdeptree 安装pipdeptree：\n1 pip install pipdeptree 生成requirements.txt\n1 pipdeptree -f | sed \u0026#39;s/ //g\u0026#39; | sort -u \u0026gt; locked-requirements.txt 常用pip命令 updata pip 1 python -m pip install --upgrade pip install package 1 pip install \u0026lt;package-name\u0026gt; Update Package 1 pip install -U \u0026lt;package name\u0026gt; Install Specific Version of a Package 1 pip install \u0026lt;package-name\u0026gt;==\u0026lt;version\u0026gt; 1 pip install \u0026lt;packagename\u0026gt;\u0026gt;=\u0026lt;version\u0026gt; Uninstall a Package 1 pip uninstall \u0026lt;packagename\u0026gt; Information About an Installed Package 1 pip show \u0026lt;package name\u0026gt; List All Installed Packages 1 pip list 1 pip freeze Generate a requirements.txt File 1 pip freeze \u0026gt; requirements.txt Install All Dependencies From requirements.txt File 1 pip install -r requirements.txt Verify That Installed Packages Have Compatible Dependencies 1 pip check List All Installed Packages That Are Not Up to Date 1 pip list -o 常用pip pkg 数据库 pip install mysql-connector-python pip install psycopg2 pip install PyMongo cmd pip install fire pip install thefuck api pip install fastapi pip install pyforest autoload pip install reloading map pip install geemap emoji pip install emot data pip install dabl pip install sweetviz nlp pip install spacy pip install nltk reqirements make reqirements 1 pip freeze \u0026gt; requirements.txt install reqirements 1 pip install -r requirements.txt wsl 1 2 3 4 sudo apt update \u0026amp;\u0026amp; upgrade sudo apt install python3 python3-pip ipython3 sudo apt install python3-pip pip3 install jupyter misc How to install Ta-Lib in python on Windows\n参考 Managing Multiple Versions of Python on Ubuntu https://medium.com/@itylergarrett.tag/setting-up-python-3-7-on-windows-10-a-non-developer-tutorial-e836639ca16 Here’s a Quick Way to Learn About PIP in Python How to Setup a Virtual Environment with Different Python Versions (Windows) Why and How to make a Requirements.txt ","permalink":"https://myself659.github.io/post/python/python37-install/","summary":"\u003ch1 id=\"说明\"\u003e说明\u003c/h1\u003e\n\u003cp\u003e完全是为了记录自己的操作记录，换一台新机器真是免不了要装python。记录下来，便于以后操作。\u003c/p\u003e\n\u003ch2 id=\"apt-get安装\"\u003eapt-get安装\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapt update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapt install software-properties-common\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eadd-apt-repository ppa:deadsnakes/ppa\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapt install python3.7\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"源码安装\"\u003e源码安装\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install  -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etar -xf Python-3.7.3.tar.xz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecd Python-3.7.3\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./configure --enable-optimizations\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emake\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emake altinstall\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"更新python39\"\u003e更新python3.9\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ sudo add-apt-repository ppa:deadsnakes/ppa\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ sudo apt update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ sudo apt install python3.9\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"install-pip\"\u003einstall pip\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapt-get install python3-pip\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"install-virutalenv\"\u003einstall virutalenv\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip3 install virtualenv\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython3 -m pip install --user virtualenv\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython3 -m venv env\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esource venv/bin/activate\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"install--pipenv\"\u003einstall  pipenv\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install --user pipenvd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epipenv install tweepy python-dotenv\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epipenv run python twitter_client.py\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"install-jupyter\"\u003einstall jupyter\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython3 -m pip install --upgrade pip\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython3 -m pip install jupyter\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"pip-basic\"\u003epip basic\u003c/h2\u003e\n\u003ch3 id=\"查看包状态\"\u003e查看包状态\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip show pkgname\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"不使用缓存\"\u003e不使用缓存\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install --no-cache-dir --default-timeout=10000  pkgname  \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"更新包\"\u003e更新包\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install  -U  pkgname  \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"指定源\"\u003e指定源\u003c/h3\u003e\n\u003cp\u003e有时候安装一些依赖包，网不好，直接超时，或者这个包就是死都下不下来的时候，可以指定国内源镜像。\npip install -i 国内镜像地址 包名\u003c/p\u003e","title":"安装与更新python"},{"content":"什么是Orthogonal？ orthogonal表面意思是正交的，直角的。\n平面几何的坐标系的x轴与y轴就是正交关系。\n在软件工程中Orthogonal常常表示两个组件相互独立，无耦合或低耦合。\n什么是Orthogonal Thinking？ Orthogonal Thinking对应中文翻译：正交思维。\n其核心思想是在处理问题或寻找创意方案时,采取与传统思路正交的新视角。具体包括:\n从多个维度或角度来审视问题。\n突破既定思维模式,换个角度看问题。\n跳出刚性思维的框架,以更宽广的视野看待事物。\n组合看似不相关的概念,形成创新点子。\n找到问题的本质,抛开表面的假设。\n突破当前状态下最明显的限制。\n发散思维,打开思路,再进行融合。\nOrthogonal Thinking能帮助我们跳出思维定势,发现更多可能性,获得整体性的视角。它常被用于科技创新,商业策略,艺术创作等领域的创意思考中。正确应用此思维方式,能增强我们的创造力和解决问题的能力。\nOrthogonal Thinking与软件工程 先看Orthogonal Thinking的应用：\n系统架构设计： 采用分层架构、微服务架构等,实现高内聚低耦合 模块和组件设计：模块之间功能独立,通过API连接交互 数据库设计： 数据库表结构的分割,遵循最小化冗余的原则 前后端分离：前后端职责分明,可独立选择技术栈 系统拆分和重构：将庞大系统拆分为互不依赖的子系统 代码重构：函数内部控制流程的独立性改造 团队组织： 按功能划分团队 测试驱动开发： 测试代码与业务代码分离,两者正交并重 代码review流程： reviewer与开发者角色正交,提高代码质量 DevOps理念： 开发与运维正交合作,提高交付效率 集成环境管理：开发、测试、生产环境分离,正交而独立 持续集成和持续交付：频繁小版本迭代与独立运行环境正交 容错和容灾设计： 主系统与备系统正交而容错 日志和监控系统： 应用日志及监控系统独立而不耦合 Orthogonal Thinking提高了软件系统的内聚性，灵活性，可维护性。\n内聚性（低耦合）：\n正交的模块和组件职责单一,避免不必要的依赖关系 将易变部分与稳定部分隔离,减少变更带来的连锁反应 灵活性：\n正交的组件可由不同人或团队开发 通过正交隔离变化点，组件更新的同时可以很好做到不影响其他的组件 便于通过新组件的方式引入新技术 测试代码与功能代码分离，利于 可维护性：\n正交组件易于进行隔离测试，利于提高测试效率,及时发现问题 正交的组件和模块相对独立,一个组件的变更不会造成连锁反应，降低变更风险 职责单一的组件代码易于理解和修改，明确职责边界,提高代码可读性 多个开发人员可同时在不同模块作业,提高修复效率 新人可先关注独立模块,无需理解全部系统，便于新人上手 可在保持旧有系统稳定的前提下进行扩展，容易进行扩展,不需要侵入式修改 在软件工程利用Orthogonal Thinking的要点：\n对系统需要具备对系统全局的思考，不能只盯着某一点,要考虑不同组件的关系和交互\n需要学会切换视角，对系统展开多角度多维度的思考\n组件设计要通过良好的封装和抽象做到边界设计合理，接口清晰\n合理设计系统关注点，关注点要正交，如坐标系的x轴与y轴那样，能够组合表示所有的平面向量\n在大型重构要分阶段进行\n要以业务为导向应用正交思维，实现clean架构\n总结 组件（模块）是正交的方式，正交是组件（模块）的原则。\n正交思维体现了SOLID设计原则的单一职责原则和隔离原则。\n","permalink":"https://myself659.github.io/post/arch/orthogonal-thinking-in-software/","summary":"\u003ch2 id=\"什么是orthogonal\"\u003e什么是Orthogonal？\u003c/h2\u003e\n\u003cp\u003eorthogonal表面意思是正交的，直角的。\u003c/p\u003e\n\u003cp\u003e平面几何的坐标系的x轴与y轴就是正交关系。\u003c/p\u003e\n\u003cp\u003e在软件工程中Orthogonal常常表示两个组件相互独立，无耦合或低耦合。\u003c/p\u003e","title":"正交思维与软件工程"},{"content":"指标 Largest banks by market cap Largest banks by market cap\n总市值 加密货币总市值\nCRYPTOCURRENCY MARKET\n加密数字货币全球图表\n交易量Transaction Volume BTC\u0026rsquo;s Transaction Volume\nEthereum’s Transaction Volume\n算力Hash Rate BTC\u0026rsquo;s Hash Rate\nEthereum’s Hash Rate\n活跃地址Active Addresses BTC\u0026rsquo;s Active Addresses\nEthereum’s Active Addresses\n交易数Transaction Count BTC\u0026rsquo;s Transaction Count\nEthereum’s Transaction Count\nAverage Transactions Per Second Transaction Rate Per Second\nAverage Transaction Value BTC\u0026rsquo;s Average Transaction Value\nEthereum’s Average Transaction Value\nAverage Transaction Fee BTC\u0026rsquo;s Average Transaction Fee\nEthereum’s Average Transaction Fee\nEthereum Gas Tracker Ethereum Gas Tracker\nEthereum Daily Gas Used Chart Ethereum Daily Gas Used Chart\nEthereum gets burned with EIP-1559 ETH gets burned with EIP-1559\nTLV defi Llama\nCrypto Lending Interest Rates Crypto Lending Interest Rates\nBitcoin Holdings by Public Companies Bitcoin Holdings by Public Companies\nEthereum Holdings by Public Companies Ethereum Holdings by Public Companies\nEth/BTC ratio Eth/BTC ratio\nEthereum to BTC Chart\nCrypto Fees Crypto Fees\nNFT OpenSea dashboard\nMEV MEV-explore\n","permalink":"https://myself659.github.io/post/blockchain/blockchain-index-predict/","summary":"\u003ch2 id=\"指标\"\u003e指标\u003c/h2\u003e\n\u003ch3 id=\"largest-banks-by-market-cap\"\u003eLargest banks by market cap\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://companiesmarketcap.com/banks/largest-banks-by-market-cap/\"\u003eLargest banks by market cap\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"总市值\"\u003e总市值\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://coinmarketcap.com/charts/\"\u003e加密货币总市值\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.tradingview.com/markets/cryptocurrencies/global-charts/\"\u003eCRYPTOCURRENCY MARKET\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.coingecko.com/zh/global_charts\"\u003e加密数字货币全球图表\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"交易量transaction-volume\"\u003e交易量Transaction Volume\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://coinmetrics.io/charts/#assets=btc\"\u003eBTC\u0026rsquo;s Transaction Volume\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://coinmetrics.io/charts/#assets=eth\"\u003eEthereum’s Transaction Volume\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"算力hash-rate\"\u003e算力Hash Rate\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://www.blockchain.com/charts/hash-rate\"\u003eBTC\u0026rsquo;s Hash Rate\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://etherscan.io/chart/hashrate\"\u003eEthereum’s Hash Rate\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"活跃地址active-addresses\"\u003e活跃地址Active Addresses\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://coinmetrics.io/charts/#assets=btc_roll=7_right=AdrActCnt\"\u003eBTC\u0026rsquo;s Active Addresses\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://coinmetrics.io/charts/#assets=eth_roll=7_right=AdrActCnt\"\u003eEthereum’s Active Addresses\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"交易数transaction-count\"\u003e交易数Transaction Count\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://coinmetrics.io/charts/#assets=btc_roll=7_right=TxCnt\"\u003eBTC\u0026rsquo;s Transaction Count\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://coinmetrics.io/charts/#assets=eth_roll=7_right=TxCnt\"\u003eEthereum’s Transaction Count\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"average-transactions-per-second\"\u003eAverage Transactions Per Second\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://www.blockchain.com/en/charts/transactions-per-second\"\u003eTransaction Rate Per Second\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"average-transaction-value\"\u003eAverage Transaction Value\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://coinmetrics.io/charts/#assets=btc_roll=7_right=TxTfrValMeanUSD\"\u003eBTC\u0026rsquo;s Average Transaction Value\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://coinmetrics.io/charts/#assets=eth_roll=7_right=TxTfrValMeanUSD\"\u003eEthereum’s Average Transaction Value\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"average-transaction-fee\"\u003eAverage Transaction Fee\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://coinmetrics.io/charts/#assets=btc_log=false_roll=7_left=FeeMeanUSD\"\u003eBTC\u0026rsquo;s Average Transaction Fee\u003c/a\u003e\u003c/p\u003e","title":"加密货币市场常用跟踪指标"},{"content":"前言 作为一个常年以c,c++,golang为主的后端程序员，刚接触nodejs有一个困惑，就是node有哪么多版本到底该选择哪个版本呢？\nnode版本 根据需求选择版本，那么node版本有哪些特点呢？\n从node 6 开始支持ES6 从node 8 开始支持Async Await node 10 增加了promisified fs模块 node 12增加了ES6 modules 从上面应该注意到node偶数版本是稳定版本（类似于linux）。\n如何管理多个node版本 一句话：复用nvm管理node。\nWindows请参考nvm-windows 。\n如何选择正确的npm package 在哪里选 npmjs\n从哪几个维度选择 Popularity Contributors Maintenance Size Quality npm trends dependencies 如何对比同类型的npm package 使用npmcompare\nnpm install Error: rollbackFailedOptional 1 2 ia@IA:~$ npm install -g truffle [..................] - rollbackFailedOptional: verb npm-session 9af9b18d6d36c6ee 解决方法：\n1 2 3 4 npm config rm proxy npm config rm https-proxy npm config set registry https://registry.npmjs.org/ npm config set registry https://registry.npm.taobao.org integrity checksum failed when using sha512 1 2 silly fetchPackageMetaData error for truffle@latest sha512-lhd8pfO5bOIwmiZf0+RyLcdWtrmeoA9JkdH9o0uQxZabisa6IxfoACRBpBez3r3w+LGPnl9/K1stE3Z9aBNK0A== integrity checksum failed when using sha512: wanted sha512-lhd8pfO5bOIwmiZf0+RyLcdWtrmeoA9JkdH9o0uQxZabisa6IxfoACRBpBez3r3w+LGPnl9/K1stE3Z9aBNK0A== but got sha512-4wB4Qu27nyZfMy9ZFzkCs/PGaaQx8W+bKug46AP5N/4BGCiT2Uw5tqq39Ip4VXXeISdok3LXb7r7A066wx3/Zw==. (15722953 bytes) 9 timing stage:rollbackFailedOptional Completed in 2ms 解决方法： 删除node_modules和package-lock.json，然后再重新执行：npm install\ninstall yarn How to install Yarn on Ubuntu\nHow to Install Yarn on Ubuntu 18.04\n常用NPM Packages 73 Awesome NPM Packages for Productivity\nnpm cmd npm doctor npm cache npm link npm ls npm search npm repo ","permalink":"https://myself659.github.io/post/javascript/node-version/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e作为一个常年以c,c++,golang为主的后端程序员，刚接触nodejs有一个困惑，就是node有哪么多版本到底该选择哪个版本呢？\u003c/p\u003e\n\u003ch2 id=\"node版本\"\u003enode版本\u003c/h2\u003e\n\u003cp\u003e根据需求选择版本，那么node版本有哪些特点呢？\u003c/p\u003e","title":"如何选择合适的node版本与npm package"},{"content":"前言 最近随着Libra横空出世，整个互联网有关的Libra新闻，评论等层出不穷，众说纷云。这么热闹，我当然也要插一脚，讲讲自己的一些思考与看法。\n方向 在具体分析之前，先看看libra定位：\nLibra的使命是建立一套简单的、无国界的货币和为数十亿人服 务的金融基础设施。\n从上面可知libra整个系统定位是金融基础设施。这是符合Facebook的定位，作为技术平台，为金融服务提供支撑。\n技术方向，libra选择从许可型区块链开始。这是一个明智的选择，虽然现在不知道其具体实现情况，但是联盟链有如下优势：\n相比较于公链有更好的互操作性 便于将libra集成到Facebook上各个超级App中，如WhatApp，Messenger等 避免公链钱包在用户体验先天不足或者给普通用户的不适应 更好安全管理与防范 避免公链的一些技术问题，如DCS不可能三角 还有一点就是相比较于其他的区块链先造链，再开发应用，找用户试验应用场景，Libra是先有场景和用户，再造链解决具体问题如支付和跨境。\nLibra 的目标是成为一种稳定的数字加密货币，将全部使用真实资产储备（称为“Libra 储备”）作为担保，并由买卖Libra并存在竞争关系的交易平台网络提供支持\nLibra Coin定位于稳定币。这样从一开始就避免了炒作，而是将整个重心放在应用领域。\n我们还可以从侧面了解这个方向的正确性。Facebook创始人扎克伯格是一位十分具有前瞻眼光和判断力的领袖。下面的例子可参考：\n2012年Facebook宣布10亿美元收购只有只有13个员工的Instagram，从投资的角度看如今回报率在100倍左右 2014年Facebook以 160 亿美金现金加股票（其中包含40亿美金的现金以及价值120亿美金的公司股票。此外，Facebook还将为WhatsApp的创始人及员工提供约价值30亿美金的限制股股票，分期四年发放）收购移动聊天工具WhatsApp，整个WhatsApp公司总共不到50人。 这两次收购让Facebook拿到移动互联网的船票。\nSWOT分析 下面就按SWOT展开说明。\nStrengths 显而易见，Facebook具有以下优势：\nFacebook在全球有27亿用户 Facebook有真实的用户社交数据，天然支持KYC Facebook有优秀人才 libra有广泛的合作伙伴 Facebook有钱 公司的执行力 Weaknesses Facebook一直是一个toC的公司，有以下劣势：\nFacebook在金融领域缺少经验 Facebook不擅长与政府打交道的 Opportunities 在白皮书列举的机会，具体如下：\n•• 我们认为，应该让更多人享有获得金融服务和廉价资本的权利。\n•• 我们认为，每个人都享有控制自己合法劳动成果的固有权利。\n•• 我们相信，开放、即时和低成本的全球性货币流动将为世界创造巨大的经济机遇和商业价值。\n•• 我们坚信，人们将会越来越信任分散化的管理形式。\n•• 我们认为，全球货币和金融基础设施应该作为一种公共产品来设计和管理。\n•• 我们认为，所有人都有责任帮助推进金融普惠，支持遵守网络道德规范的用户，并持续维护这个生态系统的完整性。\n官方白皮书是从用户与全球经济角度来看的，从Facebook这个公司的角度来看，有如下机会：\n一种货币 一个联盟 一种权力 一项收入 一种趋势 一种货币 显而易见这种货币就是Libra coin。在现在的经济系统中可以发行货币只有国家的央行。以美国为例，作个类比如下：\nLibra coin相当于美元 Libra 协会相当于美联储 Libra coin在Facebook应用生态中各种应用相当于美元在实际生活中的应用 Libra coin初期充当Facebook应用系统的生态币。但是值得注意的是Facebook应用生态可以进一步扩展为全球互联网经济体。这意味什么？大家自行体会。\n一种联盟 从上图可知，现有Libra联盟成员如下：\n•• 支付业： Mastercard, PayPal, PayU (Naspers\u0026rsquo; fintech arm), Stripe, Visa\n•• 技术和交易平台： Booking Holdings, eBay, Facebook/Calibra, Farfetch, Lyft, Mercado Pago, Spotify AB, Uber Technologies, Inc.\n•• 电信业： Iliad, Vodafone Group\n•• 区块链业： Anchorage, Bison Trails, Coinbase, Inc., Xapo Holdings Limited\n•• 风险投资业： Andreessen Horowitz, Breakthrough Initiatives, Ribbit Capital, Thrive Capital, Union Square Ventures\n•• 非营利组织、多边组织和学术机构：Creative Destruction Lab, Kiva, Mercy Corps, Women\u0026rsquo;s World Banking\nLibra以联盟的方式不断扩展，增加影响力，扩大共识，获取更多的应用场景。\n一种权力 在Facebook生态系统的发币权。相比较于国内的微信支付及支付宝接入了法币, Libra Coin赋与了Libra联盟发币权。\n一项新收入 基于libra的金融业务带来的收入，改变Facebook一直以来以广告为主的单一的营收结构。\n一项趋势 趋势不可阻档。\n经济全球化趋势不可阻挡。\n数字化货币带来自由，高效，便捷，低成本也是不可阻挡。\n拥有27亿用户的Facebook发行Libra无疑是站在这个趋势的浪尖，同时紧紧占有巨大的先发优势。\nThreats 关于Libra，马化腾点评如下：\n技术都很成熟，并不难。就看监管是否允许而已。\n对，Libra最大的问题就是监管。由于Facebook是一个全球化公司，涉及不同的国家，这些国家的法律与政策也不尽相同。这对于Libra就是一个巨大的挑战。 至于很多人担心Libra会不会是昙花一现，直接被扼杀在摇篮？ 前面有USDT的先例。答案是不会的，美帝的民主制度，都会有一番流程与讨论，估计过程并不会一帆风顺。有了美帝的放行，在其他的国家开展也就铺平了道路。\n其他竞争对手，如Google，amazon，microsoft相继效仿发币并进行竞争。\n如果Libra coin要挑战美元，那么美元就是Libra的最大竞争对手，这个挑战很大，近期应该不会出现。\n结论 Facebook走在正确的方向上，虽然有很多的困难和不确定性，相信Libra会开启价值互联网时代。\n欢迎来到Web3.0时代。\n参考 Libra Why the net giants are worried about the Web 3.0 ","permalink":"https://myself659.github.io/post/facebook-libra/","summary":"\u003ch1 id=\"前言\"\u003e前言\u003c/h1\u003e\n\u003cp\u003e最近随着Libra横空出世，整个互联网有关的Libra新闻，评论等层出不穷，众说纷云。这么热闹，我当然也要插一脚，讲讲自己的一些思考与看法。\u003c/p\u003e","title":"Facebook libra是昙花一现还是星星之火"},{"content":"创业的核心 创业的核心：\n把握机会 降低成本 控制风险 ","permalink":"https://myself659.github.io/post/startup/%E5%88%9B%E4%B8%9A%E7%9A%84%E6%A0%B8%E5%BF%83/","summary":"\u003ch2 id=\"创业的核心\"\u003e创业的核心\u003c/h2\u003e\n\u003cp\u003e创业的核心：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e把握机会\u003c/li\u003e\n\u003cli\u003e降低成本\u003c/li\u003e\n\u003cli\u003e控制风险\u003c/li\u003e\n\u003c/ol\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c!-- raw HTML omitted --\u003e","title":"创业的核心"},{"content":"定义 sync.Pool是一个可以存或取的临时对象池。对外提供New、Get、Put等API，利用mutex支持多线程并发。\n目标 sync.Pool解决以下问题：\n增加临时对象的用复用率，减少GC负担 通过对象的复用，减少内存申请开销，有利于提高一部分性能 实现 这一部分回答如何实现的问题。\n关于了解实现，最好的办法就是看代码。\n描述 1 2 3 4 5 6 7 8 9 10 11 type Pool struct { noCopy noCopy local unsafe.Pointer // local fixed-size per-P pool, actual type is [P]poolLocal localSize uintptr // size of the local array // New optionally specifies a function to generate // a value when Get would otherwise return nil. // It may not be changed concurrently with calls to Get. New func() interface{} } 各个成员含义如下：\nnoCopy： 防止sync.Pool被复制\nlocal： poolLocal数组的指针\nlocalSize： poolLocal数组大小\nNew： 函数指针申请具体的对象，便于用户定制各种类型的对象\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 // Local per-P Pool appendix. type poolLocalInternal struct { private interface{} // Can be used only by the respective P. shared []interface{} // Can be used by any P. Mutex // Protects shared. } type poolLocal struct { poolLocalInternal // Prevents false sharing on widespread platforms with // 128 mod (cache line size) = 0 . pad [128 - unsafe.Sizeof(poolLocalInternal{})%128]byte } private：private私有池，只能被对应P使用（说明：P是指goroutine执行所占用的处理器，下同）\nshared： shared共享池，能被任何P使用\nMutex： 保护shared共享池\npad：poolLocal结构体中特别增加了pad成员，这是为了防止false sharing。\n操作 操作分为四种类型：\nNew Get Put CleanUp New 这部分主要解决问题：如何创建一个具体对象池？\n具体参考代码如下：\n1 2 3 4 5 6 7 8 9 // Object Object type Object struct { a int b int } var pool = sync.Pool{ New: func() interface{} { return new(Object) }, } Get Get解决了如何从具体sync.Pool中获取对象的问题。\n获取对象有三个来源：\nprivate池 shared池 系统的Heap内存 获取对象顺序是先从private池获取，如果不成功则从shared池获取，如果继续不成功，则从Heap中申请一个对象。这是不是有熟悉的味道？在两级cache的情况下，CPU获取数据，先从L1 cache开始，再是L2 cache， 是内存。\n具体代码实现如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 func (p *Pool) Get() interface{} { if race.Enabled { race.Disable() } l := p.pin() // 绑定private池和P x := l.private l.private = nil runtime_procUnpin() // 去绑定private池和P if x == nil { // private池获取失败 l.Lock() last := len(l.shared) - 1 if last \u0026gt;= 0 { x = l.shared[last] // 从shared池获取最后一个对象 l.shared = l.shared[:last] // 从shared池删除最后一个对象 } l.Unlock() if x == nil { x = p.getSlow() // pid对应poolLocal没有获取成功，开始遍历整个poolLocal数组 } } if race.Enabled { race.Enable() if x != nil { race.Acquire(poolRaceAddr(x)) } } if x == nil \u0026amp;\u0026amp; p.New != nil { x = p.New() // 从heap申请对象 } return x } func (p *Pool) getSlow() (x interface{}) { // See the comment in pin regarding ordering of the loads. size := atomic.LoadUintptr(\u0026amp;p.localSize) // load-acquire local := p.local // load-consume // Try to steal one element from other procs. pid := runtime_procPin() runtime_procUnpin() for i := 0; i \u0026lt; int(size); i++ { // 遍历poolLocal数组 l := indexLocal(local, (pid+i+1)%int(size)) // 注意pid+i+1 这样可以从pid+1位置开始整个遍历 l.Lock() last := len(l.shared) - 1 if last \u0026gt;= 0 { x = l.shared[last] l.shared = l.shared[:last] l.Unlock() break } l.Unlock() } return x } // pin pins the current goroutine to P, disables preemption and returns poolLocal pool for the P. // Caller must call runtime_procUnpin() when done with the pool. func (p *Pool) pin() *poolLocal { pid := runtime_procPin() // In pinSlow we store to localSize and then to local, here we load in opposite order. // Since we\u0026#39;ve disabled preemption, GC cannot happen in between. // Thus here we must observe local at least as large localSize. // We can observe a newer/larger local, it is fine (we must observe its zero-initialized-ness). s := atomic.LoadUintptr(\u0026amp;p.localSize) // load-acquire l := p.local // load-consume if uintptr(pid) \u0026lt; s { return indexLocal(l, pid) } return p.pinSlow() // 没有对应poolLocal，进入慢路径处理 } func (p *Pool) pinSlow() *poolLocal { // Retry under the mutex. // Can not lock the mutex while pinned. runtime_procUnpin() allPoolsMu.Lock() defer allPoolsMu.Unlock() pid := runtime_procPin() // poolCleanup won\u0026#39;t be called while we are pinned. s := p.localSize l := p.local if uintptr(pid) \u0026lt; s { // 根据pid获取poolLocal return indexLocal(l, pid) } if p.local == nil { allPools = append(allPools, p) } // If GOMAXPROCS changes between GCs, we re-allocate the array and lose the old one. size := runtime.GOMAXPROCS(0) local := make([]poolLocal, size) // 重新分配poolLocal atomic.StorePointer(\u0026amp;p.local, unsafe.Pointer(\u0026amp;local[0])) // store-release atomic.StoreUintptr(\u0026amp;p.localSize, uintptr(size)) // store-release return \u0026amp;local[pid] // 返回新的poolLocal } 总结Get主要要点如下：\n先从本P绑定的poolLocal获取对象：先从本poolLocal的private池获取对象，再从本poolLocal的shared池获取对象 上一步没有成功获取对象，再从其他P的shared池获取对象 上一步没有成功获取对象，则从Heap申请对象 Put Put完成将对象放回对象池。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 // Put adds x to the pool. func (p *Pool) Put(x interface{}) { if x == nil { return } if race.Enabled { if fastrand()%4 == 0 { // Randomly drop x on floor. return } race.ReleaseMerge(poolRaceAddr(x)) race.Disable() } l := p.pin() // 绑定private池和P if l.private == nil { l.private = x // 放回private池中 x = nil } runtime_procUnpin() // 去绑定private池和P if x != nil { l.Lock() l.shared = append(l.shared, x) // 放回shared池 l.Unlock() } if race.Enabled { race.Enable() } } 上面的代码总结如下：\n如果poolLocalInternal的private为空，则将回收的对象放到private池中 如果poolLocalInternal的private非空，则将回收的对象放到shared池中 CleanUp CleanUp实现 注册poolCleanup函数。\n1 2 3 func init() { runtime_registerPoolCleanup(poolCleanup) } poolCleanup函数具体实现，\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 func poolCleanup() { // This function is called with the world stopped, at the beginning of a garbage collection. // It must not allocate and probably should not call any runtime functions. // Defensively zero out everything, 2 reasons: // 1. To prevent false retention of whole Pools. // 2. If GC happens while a goroutine works with l.shared in Put/Get, // it will retain whole Pool. So next cycle memory consumption would be doubled. for i, p := range allPools { allPools[i] = nil for i := 0; i \u0026lt; int(p.localSize); i++ { l := indexLocal(p.local, i) l.private = nil for j := range l.shared { l.shared[j] = nil } l.shared = nil } p.local = nil p.localSize = 0 } allPools = []*Pool{} } CleanUp时机 什么时候进行CleanUp回收对象池？在gc开始前。\n具体代码(代码文件为runtime/mgc.go)如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 func gcStart(trigger gcTrigger) { ... // clearpools before we start the GC. If we wait they memory will not be // reclaimed until the next GC cycle. clearpools() // 在这里清理sync.Pool work.cycles++ gcController.startCycle() work.heapGoal = memstats.next_gc // In STW mode, disable scheduling of user Gs. This may also // disable scheduling of this goroutine, so it may block as // soon as we start the world again. if mode != gcBackgroundMode { schedEnableUser(false) } ... } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 func clearpools() { // clear sync.Pools if poolcleanup != nil { poolcleanup() // 如果poolcleanup不为空，调用poolcleanup函数 } // Clear central sudog cache. // Leave per-P caches alone, they have strictly bounded size. // Disconnect cached list before dropping it on the floor, // so that a dangling ref to one entry does not pin all of them. lock(\u0026amp;sched.sudoglock) var sg, sgnext *sudog for sg = sched.sudogcache; sg != nil; sg = sgnext { sgnext = sg.next sg.next = nil } sched.sudogcache = nil unlock(\u0026amp;sched.sudoglock) // Clear central defer pools. // Leave per-P pools alone, they have strictly bounded size. lock(\u0026amp;sched.deferlock) for i := range sched.deferpool { // disconnect cached list before dropping it on the floor, // so that a dangling ref to one entry does not pin all of them. var d, dlink *_defer for d = sched.deferpool[i]; d != nil; d = dlink { dlink = d.link d.link = nil } sched.deferpool[i] = nil } unlock(\u0026amp;sched.deferlock) } 总结 总结一下sync.Pool的实现，要点如下：\n提供New定义实现用户自定义对象 需要使用对象调用Get从对象池获取临时对象，Get优先级首先是本P绑定的poolLocal, 其次是其他P绑定的poolLocal，最后是Heap内存 对象使用完毕调用Put将临时对象放回对象池 未被使用的对象会定时GC回收 对象没有类似于linux cache object对应的free函数 应用 sync.Pool并不是万能药。要根据具体情境而定是否使用sync.Pool。\n总结不适合使用sync.Pool的情境，具体如下：\n对象中分配的系统资源如socket，buffer 对象需要进行异步处理 对象是组合对象，如存在指针指向其他的对象 批量对象需要并发处理 复用对象大小存在的波动，如对象结构成员存在slice 在排除上面情境下，适合使用的sync.Pool应满足以下条件，具体如下：\n对象是buffer或非组合类型如buffer reader, json decode, bufio writer 对象内存可以重复使用 同时在使用应该注意问题：\nPut对象之前完成初始化，避免数据污染带来问题, 这可能带来各种各样的问题 写代码时要满足one Get， one Put的要求 注意获取对象后是否存在修改对象内存存局的代码 关注应用场景是否容易出现Pool竞争的情况 sync.Pool不是万能药，不要拿着锤子，看什么都是钉子 (Ps: 个人能力不足，若有错误不足，欢迎指正！)\n参考 sync: Pool example suggests incorrect usage ","permalink":"https://myself659.github.io/post/golang/golang-sync-pool-1/","summary":"\u003ch1 id=\"定义\"\u003e定义\u003c/h1\u003e\n\u003cp\u003esync.Pool是一个可以存或取的临时对象池。对外提供New、Get、Put等API，利用mutex支持多线程并发。\u003c/p\u003e\n\u003ch1 id=\"目标\"\u003e目标\u003c/h1\u003e\n\u003cp\u003esync.Pool解决以下问题：\u003c/p\u003e","title":"深入分析Golang sync.pool"},{"content":"来源 利益来自需求与欲望。\n存在 利益存在于现实与预期当中。\n分类 物质利益即可量化的资源、金钱、产品、时间如薪资、补贴、土地、食品 信息利益即获取或保有信息、知识、情报如垄断信息、提前消息、技术诀窍 关系利益即社会资本与网络优势如人脉、合作机会、背书 身份利益即来自身份认同与归属感如种族、宗教、职业、国家带来的合法性与支持 制度利益即被规则保护或优待的权利或特权如法律保障、政策补贴、行政便利 心理利益即内在满足、尊重感、自我实现如荣誉、掌控感、自豪感 特点 可定义 利益是可定义的。\n由环境与主体共同定义。\n差异化 不同的人与群体，不同的时间，不同的空间，利益是各不相同的。\n排序 短期利益 \u0026gt; 长期利益\n个人利益 \u0026gt; 部门利益 \u0026gt; 社会利益\n主观利益 \u0026gt; 客观利益\n度量 价值度量利益。\n不同利益相关方对利益的度量是不同的。\n利益驱动 人是一种利益驱动的动物。\n社会也是利益驱动的。\n社会行为的基本驱动力可归结为对“利益函数”的最大化追求。其特点如下：\n利益决定个体感知激励\n激励影响行为倾向\n行为经互动与制度反馈形成演化轨迹\n正如： “天下熙熙，皆为利来；天下攘攘，皆为利往”。\n","permalink":"https://myself659.github.io/post/human/%E5%88%A9%E7%9B%8A-benfit101/","summary":"\u003ch2 id=\"来源\"\u003e来源\u003c/h2\u003e\n\u003cp\u003e利益来自需求与欲望。\u003c/p\u003e\n\u003ch2 id=\"存在\"\u003e存在\u003c/h2\u003e\n\u003cp\u003e利益存在于现实与预期当中。\u003c/p\u003e\n\u003ch2 id=\"分类\"\u003e分类\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e物质利益即可量化的资源、金钱、产品、时间如薪资、补贴、土地、食品\u003c/li\u003e\n\u003cli\u003e信息利益即获取或保有信息、知识、情报如垄断信息、提前消息、技术诀窍\u003c/li\u003e\n\u003cli\u003e关系利益即社会资本与网络优势如人脉、合作机会、背书\u003c/li\u003e\n\u003cli\u003e身份利益即来自身份认同与归属感如种族、宗教、职业、国家带来的合法性与支持\u003c/li\u003e\n\u003cli\u003e制度利益即被规则保护或优待的权利或特权如法律保障、政策补贴、行政便利\u003c/li\u003e\n\u003cli\u003e心理利益即内在满足、尊重感、自我实现如荣誉、掌控感、自豪感\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"特点\"\u003e特点\u003c/h2\u003e\n\u003ch3 id=\"可定义\"\u003e可定义\u003c/h3\u003e\n\u003cp\u003e利益是可定义的。\u003c/p\u003e","title":"谈谈利益"},{"content":"心流状态 心流状态(Flow State)指的是一种不自觉的身心愉悦感,以及投入在一个活动中的极度专注的心理状态。当一个人全身心地投入一项工作或活动时,会体验到这种异常专注且乐在其中的感觉,这就是心流状态。\n心流状态的主要特征有:\n高度专注。在心流状态下,人们会完全沉浸在活动中,精力集中,周边的干扰被屏蔽。 失去时间感。由于高度专注,人们会忘记时间的流逝,完全不自觉活动进行了多长时间。 自我意识减弱。在心流状态下,人们不会过于关注自己,而是全身心投入活动本身,自我意识变弱。 精力充沛。尽管高度专注会消耗大量精力,但心流状态却能带来精力充沛的感觉,当活动结束后才会有疲倦感出现。 活动本身就是奖励。在心流状态下从事某项活动,人们可以获得享受和满足感,活动本身就是一种奖励体验。 表现更优异。心流状态可以提高人们的专注力和创造力,从而达到更高的工作效率和表现。 达到心流状态需要满足的主要条件:\n技能与挑战度的平衡。活动难度必须匹配技能,既不会太容易导致厌倦,也不会太难产生挫败感。 清晰的目标。要有具体而清晰的目标或进度来引导专注。 立即的反馈。要有明显的反馈或进度展示来引起专注和趣味性。 投入度高。高度关注并投入活动本身,而非活动结果或其他外在因素。 控制感。有一定的控制感或主导权,可以根据情况调整自己的行为或活动过程。 所以,总体来说,心流状态是一种融合了高度专注、全身心投入以及愉悦感的理想心理状态。通过创建适度的挑战、清晰的目标、即时反馈以及主控感,我们可以达到心流状态,从而获得更好的体验与表现。\n如何进入心流状态 上面的相关心流状态的信息过于理论。在我们的工作过程中如何进入心流状态呢？\n个人认为可以从几个方面入手：\n无干扰的环境\n无杂念的心态\n全身心的投入\n把握当下\n只做一件事，并合理将这件事分解为若干个简单易完成的任务\n无干扰的环境 安静无噪音的环境\n关闭报警与通知\n带上耳机听一些让自己专注的音乐（具体因人而异）\n调度上网时间，心流时间段关闭互联网访问\n关闭不必要的窗口和tab，如使用onetab\n设置不可打扰的时间段\n设置边界\n主动隔离\n无杂念的心态 先慢下来，再静下来 深呼吸练习 每天冥想练习 控制社交媒体的使用 学会说不 不要想太多，避免overthink 全身心的投入 了解自己一天身体状态情况，在感觉最好的时候投入 手，眼，耳，嘴，心，脑等尽可能都投入到工作，投入会慢慢地带你进入心流的状态 积极的提示如名人名言与自我肯定 把握当下 不念过去，不想将来，把握当下 当下就是要做这件事的使命感 有意识认识到当下一个时间段最重要的就是做好这件事 只有当下，唯有当下 只做一件事 只有一件事，只有一件事，只有一件事，重要的事情说三遍 这一件事有意义，而且要让自己清楚地看见，看见才能相信 这一件事有挑战，但难度合适，在完成过程能给人带来兴奋与愉悦，促进专注 这一件事有清晰明确的目标与产出 这件事很大概率能完成，完成能够带来良性的正反馈 有意识地只做这件事 如何保持心流状态 限定时间：一次心流状态保持在半个小时到1个小时 避免干扰：听适合自己的音乐 应对干扰：在你进入心流状态后，记下任何分散你注意力的东西，如果你把它们记下来，它们就不会在蹦来蹦去了 补充水分与能量 使用工具减少工作过程的摩擦 更多的自动化辅助，这样会有更多流畅感 建立属于自己的心流的例行过程 完成一个时间段的心流，要奖励自己 每天坚持冥想练习，保持与提高专注力 总结 心流状态 = 在无打扰的环境下，无杂念全身心地投入到当下的一件事上。\n","permalink":"https://myself659.github.io/post/done/how-to-flow-%E5%BF%83%E6%B5%81/","summary":"\u003ch2 id=\"心流状态\"\u003e心流状态\u003c/h2\u003e\n\u003cp\u003e心流状态(Flow State)指的是一种不自觉的身心愉悦感,以及投入在一个活动中的极度专注的心理状态。当一个人全身心地投入一项工作或活动时,会体验到这种异常专注且乐在其中的感觉,这就是心流状态。\u003c/p\u003e","title":"如何进入心流状态"},{"content":"重复不如迭代 迭代相比较于重复有以下特点：\n改变 复用 反馈 结论： 1000次重复不如1000次迭代。\n迭代的原则 小改变，多对比，多迭代 度量迭代 迭代的粒度满足原子性 以bottom-up方式迭代 迭代的循环 迭代的循环由以下过程组成：\n根据信息做出决策 根据决策开展行动 根据行动展开思考 根据思考更新信息 迭代的过程 针对同一件事情，可以分为三个阶段：\n开始行动，启动迭代 正确地行动 更好地行动 总结 迭代是进步的步伐 迭代是灵活小巧的改变 迭代是积小成多，由量变实现质变 迭代是行动的改变，打破了常规，是自我突破的开始 ","permalink":"https://myself659.github.io/post/done/how-to-iterate-%E8%BF%AD%E4%BB%A3/","summary":"\u003ch2 id=\"重复不如迭代\"\u003e重复不如迭代\u003c/h2\u003e\n\u003cp\u003e迭代相比较于重复有以下特点：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e改变\u003c/li\u003e\n\u003c/ol\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e复用\u003c/li\u003e\n\u003c/ol\u003e\n\u003col start=\"3\"\u003e\n\u003cli\u003e反馈\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e结论： 1000次重复不如1000次迭代。\u003c/p\u003e\n\u003ch2 id=\"迭代的原则\"\u003e迭代的原则\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e小改变，多对比，多迭代\u003c/li\u003e\n\u003cli\u003e度量迭代\u003c/li\u003e\n\u003cli\u003e迭代的粒度满足原子性\u003c/li\u003e\n\u003cli\u003e以bottom-up方式迭代\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"迭代的循环\"\u003e迭代的循环\u003c/h2\u003e\n\u003cp\u003e迭代的循环由以下过程组成：\u003c/p\u003e","title":"如何迭代"},{"content":"多任务并发的危害 人类大脑结构上并不适合多任务处理,强行进行多任务会降低效率与产出 多任务带来的切换成本开销大 多任务处理会降低工作质量，增大压力 多任务加大大脑的负担，容易出错 频繁进行任务切换会形成反馈循环,获得即时满足感但实际效果很少，如果长时间地进行这种循环，大脑很难建立延迟循环 多任务降低深度工作的可能性，导致工作做不到位 多任务影响智商，可能伤害大脑 只做一件事 应对多任务并发的最好的办法就是一个时间块只做一件事。这样做有如下好处：\n采用时间块管理提高时间管理的效率 分解任务，提高任务的可执行性 任务优先级管理 单位时间块目标单一明确 有利于投入与保持专注，便于进入心流状态，提高效率与产出 有利于将工作做到位 如何做到在一个时间块只做一件事呢？ 避免时不时检查邮箱，通知等不良习惯 使用onetab，避免多tab环境（多tab容易引起多任务与注意分散） 使用专注模式 如果任务不需要使用互联网，主动block互联网 有意识只做一件事并进行长时间的训练 主动使用一个时间块的背景音乐引导专注一件事 ","permalink":"https://myself659.github.io/post/done/how-to-one-task%E5%8F%AA%E5%81%9A%E4%B8%80%E4%BB%B6%E4%BA%8B/","summary":"\u003ch2 id=\"多任务并发的危害\"\u003e多任务并发的危害\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e人类大脑结构上并不适合多任务处理,强行进行多任务会降低效率与产出\u003c/li\u003e\n\u003cli\u003e多任务带来的切换成本开销大\u003c/li\u003e\n\u003cli\u003e多任务处理会降低工作质量，增大压力\u003c/li\u003e\n\u003cli\u003e多任务加大大脑的负担，容易出错\u003c/li\u003e\n\u003cli\u003e频繁进行任务切换会形成反馈循环,获得即时满足感但实际效果很少，如果长时间地进行这种循环，大脑很难建立延迟循环\u003c/li\u003e\n\u003cli\u003e多任务降低深度工作的可能性，导致工作做不到位\u003c/li\u003e\n\u003cli\u003e多任务影响智商，可能伤害大脑\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"只做一件事\"\u003e只做一件事\u003c/h2\u003e\n\u003cp\u003e应对多任务并发的最好的办法就是一个时间块只做一件事。这样做有如下好处：\u003c/p\u003e","title":"只做一件事，避免多任务并发"},{"content":"上周三我损失了10万美元。它在24小时的时间内在“SIM转移攻击”中消失，耗尽了我的Coinbase帐户。事件已经过去了四天，我被摧毁了。我寝食难安;我充满了焦虑，懊悔和尴尬。\n这是我生命中最昂贵的一课，我想与尽可能多的人分享我的经验与教训。我的目标是提高对这类攻击的认识，并促使大家提高在线身份的安全性。\n这仍然是非常原始的（我还没有告诉我的家人）；请大家保留对本文所述的天真安全措施的判断。\n攻击的细节 您可能会问自己，究竟什么是“SIM转移攻击”？为了描述攻击，我们来看一下典型的在线身份。对于大多数人来说，下图应该看起来很熟悉。\n我们大多数人都有一个主电子邮件帐户，该帐户与很多其他在线帐户相关联。我们大多数人还有一个移动设备，如果你忘了密码，可以用这个移动设备来恢复您的电子邮件密码。\n授权的SIM转移 将SIM卡转移到另一台设备是移动运营商为其客户提供的服务。它允许客户将他们的电话号码转移到新设备。在大多数情况下，这是完全合法的要求;当我们升级到新手机，切换移动运营商等时会发生这种情况。\nSIM转移攻击 但是，“SIM转移攻击”是由未经授权的来源（攻击者）执行的恶意转移。攻击者将您的 SIM卡转移到他们控制的手机上。然后，攻击者在您的电子邮件帐户上启动密码重置流程。验证码会从您的电子邮件提供商发送到您的电话号码。 攻击者会截获该电话号码，因为他们现在控制您的SIM卡。下图逐步概括了攻击过程。\n一旦攻击者控制了您的主电子邮件帐户，他们就会开始绕过您通过该电子邮件地址（银行帐户，社交媒体帐户等）管理并支配您的任何在线服务及其资产。如果他们非常恶意，他们甚至可以锁定你的帐户而你却几乎无法收回它们。\n花点时间检查一下单个Google帐户绑定的大量敏感信息：\n您的地址，出生日期和其他私人，个人身份信息 访问您（和/或您的合作伙伴）的潜在妥协照片 访问您的日历和即将到来的旅行日期 访问您的私人电子邮件，文档和搜索历史记录 访问您的个人联系人及其私人信息以及与您的关系 访问您的主电子邮件地址用作身份验证来源的所有其他在线服务 事件时间线 通过更好地掌握如何进行此类攻击以及所涉及的范围，让我们深入探讨此特定攻击的时间线。我想描绘一下攻击是如何被执行的，以及我是如何经历这些事件的，以及如果您遇到类似的症状，您可以做些什么来保护自己。\n时间线分为四个部分：\n我所经历的：从我的观点来看所经历的事件。如果你遇到类似的事情，这些都是你可能受到攻击的明确指示。\n攻击者正在做什么：黑客用来进入我的Coinbase帐户的基本策略。\n我感知到的威胁级别：我在这些事件发生时将其归因于威胁级别。\n我应该拥有的威胁级别：事后看来，我希望在这些事件发生时我会拥有的威胁级别。\n经验教训+建议 这是我生命中最昂贵的一节课。我在24小时内失去了相当重要比例的净值资产; 并且是不可逆的。以下是我鼓励其他人用来更好地保护自己的在线安全的一些建议： 使用硬件钱包，以确保您的加密：将您的密码到硬件钱包 /离线存储/ 多SIG钱包，只要你不交易。不要将资金闲置在交易所或法定进场。我将Coinbase视为银行账户，并且在发生攻击时你绝对没有追索权。我比大多数人更了解风险，但从未想过这样的事情会发生在我身上。我非常后悔没有采取加密安全措施。\n基于SMS的2FA还不够：无论您尝试在线保护的资产和/或身份如何，都要升级到基于硬件的安全性（即：攻击者为实施攻击而必须物理获取的物理内容）。虽然Google Authenticator和Authy可以将您的移动设备转变为基于硬件的安全性，但我建议您更进一步。拿起你实际控制的YubiKey，不能被欺骗。\n减少您的在线足迹：减少不必要地在线分享个人身份信息（出生日期，位置，嵌入其中的地理位置数据的图片等）的冲动。在发生攻击时，所有这些准公开数据都可以针对您。 Google Voice 2FA：在某些情况下，在线服务不支持基于硬件的2FA（它们依赖于较弱的基于SMS的2FA）。在这些情况下，您最好创建一个Google语音电话号码（无法通过SIM卡转移）并使用具有2-Factor Auth恢复号码的电话号码。\n创建辅助电子邮件地址：不是将所有内容绑定到单个电子邮件地址，而是为关键在线身份（银行帐户，社交媒体帐户，加密交换等）创建辅助地址。请勿将此电子邮件地址用于其他任何内容并将其保密。使用某种形式的基于硬件的2FA备份该地址。\n离线密码管理器：使用密码管理器输入密码。更好的是，使用密码存储等脱机密码管理器。lrvick拥有各种密码管理器的优秀对比图表，以及针对更具技术倾向的审查建议。\n关于读者的评论 我明白这一点：鉴于我天真的安全实践，我可能就应该注定被黑客攻击。这样做不会减少受到任何伤害，并且会削弱这个故事的主旨，即：\n让别人知道受到伤害是多么容易 使用上述知识和建议来优先考虑您的在线身份的安全性 我禁不住想到我可以做的小而轻松的事情来保护自己。我的脑海中涌现各种假设。\n然而，这些想法伴随懒惰和幸存者偏见。我从来没有认真对待我的在线安全，因为我从未经历过攻击。虽然我了解自己的风险状况，但是我就是太懒导致我没有用该有的严谨来保护我的资产。\n我恳请你们从这些错误中吸取教训。\n参考 The Most Expensive Lesson Of My Life: Details of SIM port hack ","permalink":"https://myself659.github.io/post/sim-port-attack/","summary":"\u003cp\u003e上周三我损失了10万美元。它在24小时的时间内在“SIM转移攻击”中消失，耗尽了我的Coinbase帐户。事件已经过去了四天，我被摧毁了。我寝食难安;我充满了焦虑，懊悔和尴尬。\u003c/p\u003e","title":"人生中最昂贵的教训：SIM卡转移攻击的细节(译文)"},{"content":"前言 书籍是人类进步的阶梯。\n书箱是前人总结的知识与智慧的结晶。\n读书有利于使我们站上巨人的肩膀，有利于我们提升自己的历史高度，行业高度，哲学高度，这样很多复杂问题可以看得更清楚，可以发现更多解决方案。\n目的 读书的主要目的不是为了记忆，也不是为了批评，而是为了应用。将书中内容应用于自己的知识系统或者解决具体问题。\n原因 读书的原因如下：\n读书可以增长知识 读书可以帮助你放松和减轻压力，是一种生活要素 读书是一种低成本理解世界的方式 读书是一种高手交流的方式 读书可以提高思考能力 读书可以指导实践，是知行合一的重要一环 读书可以预防老年痴呆症 原则 个人读书的原则如下：\n读好书 保持怀疑态度，尽信书不如无书 好书要多读与深读，质量比数量更重要 学（读）以致用 读书讲策略与方法 读书要有输出（笔记，思维导图，分享等） 精读为主，避免泛泛而读 带着问题与目标读书 构建与完善自己的知识树，将书中的内容与原来的知识系统建立连接 基于主题读书，同时读几本同主题的书，做到多视角阅读与对比 对阅读进行工程化管理 用好工具如Notion、Obsidian 培养良好的读书习惯如记笔记，建索引，写阅读要点与清单 主动展开阅读测试获得反馈 不要勉强自己读自己不想读的 如何选好书 从以下几个方面考虑：\n这本书要解释（解决）什么问题？问题是否真实存在？问题的意义是什么？ 这本书的作者是这个领域的顶级专家吗？ 这本书内容有哪些？这些内容具有实时性、创新性、革命性吗？内容对实践有益吗？ 这本书表达是否科学规范严谨？ 自己有兴趣有能力将为本书读下去吗？读了能否用起来？用起来有多大的收益？ 这本书是经典书箱吗？ 这本书有没有提供一些unknown unknown的信息与观点？ 如何深读 多读容易做到，但是深读需要一些技巧与练习。\n以下方法有利于深度阅读：\n避免干扰 带着问题读书 写读书笔记与评论 保证每次读书时间在半个小时以内 细节阅读 对比阅读 利用思维导图进行全局阅读与把握 交流与讨论 积极地公开分享 与GPT结对进行对话阅读 升维阅读 多次阅读 Immersive reading沉浸式阅读 ","permalink":"https://myself659.github.io/post/rt/about-book-reading/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e书籍是人类进步的阶梯。\u003c/p\u003e\n\u003cp\u003e书箱是前人总结的知识与智慧的结晶。\u003c/p\u003e\n\u003cp\u003e读书有利于使我们站上巨人的肩膀，有利于我们提升自己的历史高度，行业高度，哲学高度，这样很多复杂问题可以看得更清楚，可以发现更多解决方案。\u003c/p\u003e","title":"说说读书"},{"content":"backgroud 最近使用了google cloud，所以打算试一下通过gcloud auth login登陆远程主机。\nprerequisites 科学上网的通道 terminal配置代理 config gcp proxy for gcloud 一般情况下，有上面的准备，gcloud auth login应该会成功，实际上并没有。这是因为还要指定gcloud config的代理配置，具体参考配置 gcloud CLI 以在代理/防火墙后面使用.\n","permalink":"https://myself659.github.io/post/k8s/gcloud-login-from-china/","summary":"\u003ch2 id=\"backgroud\"\u003ebackgroud\u003c/h2\u003e\n\u003cp\u003e最近使用了google cloud，所以打算试一下通过gcloud auth login登陆远程主机。\u003c/p\u003e\n\u003ch2 id=\"prerequisites\"\u003eprerequisites\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e科学上网的通道\u003c/li\u003e\n\u003cli\u003eterminal配置代理\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"config-gcp-proxy-for-gcloud\"\u003econfig gcp proxy for gcloud\u003c/h2\u003e\n\u003cp\u003e一般情况下，有上面的准备，gcloud auth login应该会成功，实际上并没有。这是因为还要指定gcloud config的代理配置，具体参考\u003ca href=\"https://cloud.google.com/sdk/docs/proxy-settings\"\u003e配置 gcloud CLI 以在代理/防火墙后面使用\u003c/a\u003e.\u003c/p\u003e","title":"gcloud auth login from mainland in china"},{"content":"前言 最近zoom上市，作为一名华人创业公司自然大受关注。下面从以下几个方面谈谈自己的一些思考与看法：\n技术 领导 产品 商业 技术 对于视频面试会议，技术核心分为以下三大块：\n基础设施架构 网络传输技术 音视频技术 领导 招聘方面重点在自我激励和学习，招聘有发展潜力的人 2019年，Zoom还在全美最佳雇主公司排名中位居第二位，也是一个非常让员工喜欢的创业公司。这个投票应该还是可以相信的，没有内幕 信任来自开放。越开放，越信任。作为公司的领导要开放与底层员工的连接通道 一个公司或者一个组织甚至一个国家，解决问题是第一要义是正视问题，而不是逃避问题，应该鼓励发现问题 产品 先说对于zoom的评价，确实好用，个人从2016年就开始使用。\n永无止境，WebEx在当时的市场已经占有很大的市场，但是zoom创始人并没有停留在市场占用率上而是准确地看到WebEx背后的问题。 欲速则不达。耐心地打磨产品，zoom在2011年成立，到2013年才首次发布产品Zoom Meetings，这放在国内是无法想像的，很多创业公司三个月就要出产品，结果创业公司还是每年死一大片，而zoom却从视频会议领域众多竞争对手中脱颖而出。 套用一句话：从人民群众中来,到人民群众中去。从用户中来，到用户中去，需求从用户中来，真正地倾听用户的心声，产品与服务落实到用户，让用户享受实在的便利与好处 直播改变生活，学习与工作；快手、抖音、zoom就是很好的说明 视频大行其道，视频降低用户门槛，视频用户体验更好，视频中包含更多的信息 商业 追求低成本，高效率，zoom将研发大部分放在中国内地，中国内地人均30W左右，在美国硅谷招一个软件工程师起薪差不多90W吧，这样从而整体上降低了zoom的成本。zoom上市就能营利，让其在股价方面表现十分出色。 双赢的原则，zoom让员工开会不受地点限制，只要有网络就可以，同时也降低企业的运行成本。 降低门槛，视频会议降低了会议的门槛，打破空间的限制，zoom易用性降低了使用门槛，只要手机和电脑再加上网络就可以进行一场会议。国内有不少企业还卖专门的视频会议硬件系统，这样一开始就输，研发成本需要投入，价格还高 优势原则。市场竞争，优势劣汰。一定要建立优势如成本优势，用户体验优势，先发优势，差异化优势 zoom有2000倍的市盈率。这说明什么？泡沫吗？从数字上看是这样的。但是股价体现是预期，这说明视频协作会是未来发展一个方向。视频协作现在应用率还是很低，未来还是有很大的增长空间，除了视频会议还有更多的应用场景，如远程医疗。 总结 zoom创始人袁征从1997年WebEx一名程序员到2011年思科工程副总裁，负责WebEx产品。在这个阶段他完成了技术与领导大部分积累。从2011年开始创办zoom进行产品化与商业化，到2019年IPO上市，使产品化与商业化达到一个新的台阶。程序员在提高自己的技术能力的同时，要努力培养领导能力，产品能力，商业能力。\n参考 Zoom成功上市：市值超160亿美元 华裔创始人走向人生巅峰 连续四年保持三位数增长，搞视频会议的 Zoom 有三大关键秘诀 扎克伯格：80%的企业文化由创始人决定 《原则》读书笔记八 如何做到极度求真与极度透明 生活在一个十分钟就能走完的安逸小城，给生活做减法 How Zoom Beat the Tech Giants 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/business/about-zoom/","summary":"\u003ch1 id=\"前言\"\u003e前言\u003c/h1\u003e\n\u003cp\u003e最近zoom上市，作为一名华人创业公司自然大受关注。下面从以下几个方面谈谈自己的一些思考与看法：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e技术\u003c/li\u003e\n\u003cli\u003e领导\u003c/li\u003e\n\u003cli\u003e产品\u003c/li\u003e\n\u003cli\u003e商业\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"技术\"\u003e技术\u003c/h2\u003e\n\u003cp\u003e对于视频面试会议，技术核心分为以下三大块：\u003c/p\u003e","title":"关于zoom的一些思考与看法"},{"content":"背景 学会选择很难。 学会做出好的选择更难。 在这个复杂的世界里学会做出正确的选择更难。\n选择很重要。不是有一句话：\n选择比努力更重要。\n原则 个人对于选择的原则总结如下：\n先准备选项，再来选择 拓展选择的空间 明确选择的目标与选择的取舍 永远选择能给你更多的选择的选项 明确选择的目标之一：选择后不后悔 考虑选择后会失败的情况 没有完美的选择，一切都是tradeoff 永远不要在情绪激动时做出重大决定 尊重事实，立足自身，面向未来 相信直觉 选择的空间至少包括以下三个方面：\n做出选择的空间（时间） 选项的空间（数量） 选项背后的空间 ","permalink":"https://myself659.github.io/post/rt/%E9%80%89%E6%8B%A9%E5%8E%9F%E5%88%99/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e学会选择很难。\n学会做出好的选择更难。\n在这个复杂的世界里学会做出正确的选择更难。\u003c/p\u003e\n\u003cp\u003e选择很重要。不是有一句话：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e选择比努力更重要。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"原则\"\u003e原则\u003c/h2\u003e\n\u003cp\u003e个人对于选择的原则总结如下：\u003c/p\u003e","title":"选择的原则"},{"content":"通用特征 Volatile不稳定的 Uncertain不确定的 Complex复杂的 Ambiguous模糊的 Unfair不公平的 Asymmetrical非对称性的 Entropic熵增的 Challenging挑战性的 Nonlinearity非线性的 Atomicity 原子性 Virtual 虚拟的 个体与世界 个体是世界（环境）的产物 个体在世界是渺小 个体在世界最终还得依靠自己 个体之间存在巨大的差异 ","permalink":"https://myself659.github.io/post/rt/%E4%B8%96%E7%95%8C%E7%9A%84%E7%89%B9%E5%BE%81/","summary":"\u003ch2 id=\"通用特征\"\u003e通用特征\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eVolatile不稳定的\u003c/li\u003e\n\u003cli\u003eUncertain不确定的\u003c/li\u003e\n\u003cli\u003eComplex复杂的\u003c/li\u003e\n\u003cli\u003eAmbiguous模糊的\u003c/li\u003e\n\u003cli\u003eUnfair不公平的\u003c/li\u003e\n\u003cli\u003eAsymmetrical非对称性的\u003c/li\u003e\n\u003cli\u003eEntropic熵增的\u003c/li\u003e\n\u003cli\u003eChallenging挑战性的\u003c/li\u003e\n\u003cli\u003eNonlinearity非线性的\u003c/li\u003e\n\u003cli\u003eAtomicity 原子性\u003c/li\u003e\n\u003cli\u003eVirtual 虚拟的\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"个体与世界\"\u003e个体与世界\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e个体是世界（环境）的产物\u003c/li\u003e\n\u003cli\u003e个体在世界是渺小\u003c/li\u003e\n\u003cli\u003e个体在世界最终还得依靠自己\u003c/li\u003e\n\u003cli\u003e个体之间存在巨大的差异\u003c/li\u003e\n\u003c/ol\u003e","title":"世界的特征"},{"content":"背景 认识自己与认识世界，是我们学习两个方面。\n世界很大，有客观的物理世界，有由人组成的社会，有虚拟的世界等等，这里还是先以人为本，先看由人组成的社会。\n社会的抽象 对于我们要认识的社会，个人对其抽象如下：\n一切皆利益\n一切皆交易\n一切皆博弈\n一切皆连接\n一切皆网络\n一切皆变化\n一切皆人性\n既然是抽象，那就不展开说明。\n（end）\n","permalink":"https://myself659.github.io/post/rt/%E7%A4%BE%E4%BC%9A%E7%9A%84%E6%8A%BD%E8%B1%A1/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e认识自己与认识世界，是我们学习两个方面。\u003c/p\u003e\n\u003cp\u003e世界很大，有客观的物理世界，有由人组成的社会，有虚拟的世界等等，这里还是先以人为本，先看由人组成的社会。\u003c/p\u003e","title":"理解社会的抽象"},{"content":"前言 我们处于信息社会，实际上只是信息很多，但是真相确却很少。\n假设 假设一个事件发生，现在已知要满足N个条件（实际上可能不止N个条件）。\n证实 用编程语言表示证实逻辑如下：\n1 2 3 if( 条件1 \u0026amp;\u0026amp; 条件2 \u0026amp;\u0026amp; 条件3 \u0026amp;\u0026amp; 条件4 \u0026amp;\u0026amp; 条件5 ...){ return True; } 从上面的伪代码可以知道：\n证实首先明确这个事件如果要发生，需要哪些条件，但是获取到所有发生的条件难度大 证实的过程需要验证每一个条件，成本高 证伪 用编程语言表示证伪逻辑如下：\n1 2 3 if( !条件1 || !条件2 || !条件3 || !条件4 || !条件5 ...){ return False; } 从上面伪代码可以知道：\n证伪不需要知道事件发生所需要的所有的条件 证伪只需要证明一个条件不被满足即可 结论 证伪只需要证明一个条件不符合即可，所以优先选择证伪。 从成本看证伪的成本远小于证实。 只要证伪的信息越多，那么离真实也就越来越近。\n","permalink":"https://myself659.github.io/post/rt/%E8%AF%81%E5%AE%9Evs%E8%AF%81%E4%BC%AA/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e我们处于信息社会，实际上只是信息很多，但是真相确却很少。\u003c/p\u003e\n\u003ch2 id=\"假设\"\u003e假设\u003c/h2\u003e\n\u003cp\u003e假设一个事件发生，现在已知要满足N个条件（实际上可能不止N个条件）。\u003c/p\u003e\n\u003ch2 id=\"证实\"\u003e证实\u003c/h2\u003e\n\u003cp\u003e用编程语言表示证实逻辑如下：\u003c/p\u003e","title":"从逻辑运算看证实和证伪"},{"content":"技术 medium cryptocurrency\nmedium blockchain\nhackernoon NFT\n新项目 icodrops\nThe Complete ICO Calendar\n资讯 coindeck\ntwitter naval\nbalajis.com\nVitalik\nAshleigh Schap\nArthur Hayes\nStani Kulechov\nGloria Kimbwala\nRic Burton\nDennison Bertram\nAustin Griffith\nSantiago Palladino\nZaki Manian\nAnthony Sassano\ntitter follow suggest list telegram Fat Pig Signals Universal Crypto Signals Verified Crypto Traders Rocket Wallet Signals 数据与分析 messari\nBlog haseebq\nbalajis\u0026rsquo;s blog\n","permalink":"https://myself659.github.io/post/blockchain/blockchain-info/","summary":"\u003ch2 id=\"技术\"\u003e技术\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://medium.com/topic/cryptocurrency\"\u003emedium cryptocurrency\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://medium.com/topic/blockchain\"\u003emedium blockchain\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://hackernoon.com/tagged/nft\"\u003ehackernoon NFT\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"新项目\"\u003e新项目\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://icodrops.com/\"\u003eicodrops\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://coinmarketcap.com/ico-calendar/\"\u003eThe Complete ICO Calendar\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"资讯\"\u003e资讯\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://www.coindesk.com/\"\u003ecoindeck\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"twitter\"\u003etwitter\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/naval\"\u003enaval\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/balajis\"\u003ebalajis.com\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/VitalikButerin\"\u003eVitalik\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/ashleighschap\"\u003eAshleigh Schap\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/CryptoHayes\"\u003eArthur Hayes\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/StaniKulechov\"\u003eStani Kulechov\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/gkimbwala\"\u003eGloria Kimbwala\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/ricburton\"\u003eRic Burton\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/dennisonbertram\"\u003eDennison Bertram\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/austingriffith\"\u003eAustin Griffith\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/smpalladino\"\u003eSantiago Palladino\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/zmanian\"\u003eZaki Manian\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/sassal0x\"\u003eAnthony Sassano\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/i/lists/869994563691319296/members\"\u003etitter follow suggest list \u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"telegram\"\u003etelegram\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://t.me/fatpigsignals\"\u003eFat Pig Signals\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://t.me/universalcryptosignals\"\u003eUniversal Crypto Signals\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://t.me/verifiedcryptonews\"\u003eVerified Crypto Traders\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://t.me/RocketWallet_Official\"\u003eRocket Wallet Signals\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"数据与分析\"\u003e数据与分析\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://messari.io/\"\u003emessari\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"blog\"\u003eBlog\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://haseebq.com/blockchain/\"\u003ehaseebq\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://balajis.com/content-archive/\"\u003ebalajis\u0026rsquo;s blog\u003c/a\u003e\u003c/p\u003e","title":"区块链，加密货币与web3常用信息来源"},{"content":"信息技术发展史 为了与原文保持一致，将信息技术发展史分为以下6个阶段：\n大型机时代 PC时代 互联网时代 社交网络时代 智能手机时代 区块链时代 框架介绍 将信息技术要素分为以下四种：\nIO(接口) Infrastrure(基础设施) CPU(计算) HD(存储) 将技术要素分布为两个方向：\nUser(用户端) Remote(远端即服务端及云端) 总体上来说，整个框架具有普适性，并且框架简单清晰。\n大型机时代-\u0026gt;PC时代 框架变化:\n成本：\n计算处理能力减弱，存储空间变小 收益：\n降低计算机使用门槛，方便更多人使用 数据:\n主机集中数据转向个人PC时代去中心化数据\n开发者的新机会：\n分发(软盘，CD) 新技术(本地数据，GUI，扬声器) 市场的新机会：\n消费级操作系统(微软，苹果) 视频游戏(EA sports，ID software) 硬件(Apple，IBM，HP，Dell) PC时代-\u0026gt;互联网时代 框架变化:\n成本：\n互联网数据成本 新公共基础设施的成本开支 收益：\n更多更便捷的信息访问入口，更大的存储空间，更强的计算处理能力 数据:\n中心化存储数据。\n开发者的新机会：\n分发(云基础设施) 市场的新机会：\n网上购物(亚马逊，eBay，Paypal) 在线广告(谷歌，雅虎) 流媒体(Skype，Netflix) 互联网服务提供商(AOL) 互联网时代-\u0026gt;社交网络时代 框架变化:\n成本：\n隐私 收益：\n通过线上打通线下 个性化 数据:\n中心化存储(隐私)数据。\n开发者的新机会：\n应用分发 信息分发 市场的新机会：\n个性化广告(Facebook，Twitter，LinkedIn) 共享经济(AirBnb) 社交游戏(Zynga) 社交网络时代-\u0026gt;智能手机时代 框架变化:\n成本：\n更小的屏幕 无键盘 更小的计算能力 更少的存储空间 收益：\n易于创建媒体 提高访问网络的便捷性 数据:\n去中心化生成数据 中心化存储数据 开发者的新机会：\n分发(App store) 新技术(GPS和相机) 市场的新机会：\n媒体分享(Pinterest，Instagram，Youtube) 基于位置的服务(Uber，Lyft) 消息(Snapchat，Whatsapp，Telegram) 智能手机时代-\u0026gt;区块链时代 框架变化:\n成本：\n更多计算与处理 更多网络流量 效率低 收益：\n不可变数据 审查制度 数据:\n可信数据的去中心化分布与存储 开发者的新机会：\n新技术(信任) 市场的新机会：\n全球便利网络(供应链，NFT即Non-Fungible Token) 价值存储(比特币) 法律(法律合同，治理，审计) 说明 框架不是原理，同时内容很简单，相信大家一定有很多其他的看法与意见，权且当作抛砖引玉，欢迎交流。\n另外本文主要内容来自My framework for how to look at the future of blockchain，原文的目的通过这个框架讨论区块链的未来。本人只是想把这个框架介绍给大家，再加一些个人对这个框架的一点解释而已。\n(End)\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/it-frame/","summary":"\u003ch1 id=\"信息技术发展史\"\u003e信息技术发展史\u003c/h1\u003e\n\u003cp\u003e为了与原文保持一致，将信息技术发展史分为以下6个阶段：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e大型机时代\u003c/li\u003e\n\u003cli\u003ePC时代\u003c/li\u003e\n\u003cli\u003e互联网时代\u003c/li\u003e\n\u003cli\u003e社交网络时代\u003c/li\u003e\n\u003cli\u003e智能手机时代\u003c/li\u003e\n\u003cli\u003e区块链时代\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"框架介绍\"\u003e框架介绍\u003c/h1\u003e\n\u003cp\u003e将信息技术要素分为以下四种：\u003c/p\u003e","title":"分享一种分析信息技术发展的框架"},{"content":"安装helm helm是Kubernetes集群的npm。\n下载脚本add_helm.sh 脚本内容如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/usr/bin/env bash echo \u0026#34;install helm\u0026#34; # installs helm with bash commands for easier command line integration curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash # add a service account within a namespace to segregate tiller kubectl --namespace kube-system create sa tiller # create a cluster role binding for tiller kubectl create clusterrolebinding tiller \\ --clusterrole cluster-admin \\ --serviceaccount=kube-system:tiller echo \u0026#34;initialize helm\u0026#34; # initialized helm within the tiller service account helm init --service-account tiller # updates the repos for Helm repo integration helm repo update echo \u0026#34;verify helm\u0026#34; # verify that helm is installed in the cluster kubectl get deploy,svc tiller-deploy -n kube-system 执行脚本安装helm 1 sh add_helm.sh 安装kube-eagle 主要体验一下helm使用(刚开始我都是自己手动安装Prometheus)。\n添加repo 1 helm repo add kube-eagle https://raw.githubusercontent.com/google-cloud-tools/kube-eagle-helm-chart/master 更新repo 1 helm repo update 安装kube-eagle 1 helm install --name=kube-eagle kube-eagle/kube-eagle 可视化 具体如下：\n整体集群的资源使用情况是不是一目了然了？\n参考 Kube Eagle Helm Chart Kube Eagle Dashboard ","permalink":"https://myself659.github.io/post/k8s/k8s-kubeagle/","summary":"\u003ch1 id=\"安装helm\"\u003e安装helm\u003c/h1\u003e\n\u003cp\u003ehelm是Kubernetes集群的npm。\u003c/p\u003e\n\u003ch2 id=\"下载脚本add_helmsh\"\u003e下载脚本add_helm.sh\u003c/h2\u003e\n\u003cp\u003e脚本内容如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/usr/bin/env bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;install helm\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# installs helm with bash commands for easier command line integration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# add a service account within a namespace to segregate tiller\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl --namespace kube-system create sa tiller\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# create a cluster role binding for tiller\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl create clusterrolebinding tiller \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --clusterrole cluster-admin \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --serviceaccount\u003cspan class=\"o\"\u003e=\u003c/span\u003ekube-system:tiller\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;initialize helm\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# initialized helm within the tiller service account\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehelm init --service-account tiller\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# updates the repos for Helm repo integration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehelm repo update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;verify helm\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# verify that helm is installed in the cluster\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl get deploy,svc tiller-deploy -n kube-system\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"执行脚本安装helm\"\u003e执行脚本安装helm\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esh add_helm.sh\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch1 id=\"安装kube-eagle\"\u003e安装kube-eagle\u003c/h1\u003e\n\u003cp\u003e主要体验一下helm使用(刚开始我都是自己手动安装Prometheus)。\u003c/p\u003e","title":"利用Kube Eagle监控Kubernetes集群资源"},{"content":" Life is short, I use Python.\nI try to summary the popular python packages as follows:\nNumber and Math sympy Sage numbers math cmath decimal fractions random statistics Data and statistics Matplotlib seaborn numpy pandas plotly Web Development Django FastAPI GUI pyqt PySimpleGUI automation script pathlib os Machine Learning TensorFlow Scikit OpenCV streamlit Web Scraping and Web Automation Requests Beautiful Soup Scrapy Selenium 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/python/python-packages/","summary":"\u003cblockquote\u003e\n\u003cp\u003eLife is short, I use Python.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eI try to summary the popular python packages as follows:\u003c/p\u003e\n\u003ch2 id=\"number-and-math\"\u003eNumber and Math\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://docs.sympy.org/latest/index.html\"\u003esympy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://doc.sagemath.org/html/en/tutorial/introduction.html#installation\"\u003eSage\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/3/library/numbers.html\"\u003enumbers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/3/library/math.html\"\u003emath\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/3/library/cmath.html\"\u003ecmath\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/3/library/decimal.html\"\u003edecimal\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/3/library/fractions.html\"\u003efractions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/3/library/random.html\"\u003erandom\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/3/library/statistics.html\"\u003estatistics\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"data-and-statistics\"\u003eData and statistics\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://matplotlib.org/\"\u003eMatplotlib\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://seaborn.pydata.org/index.html\"\u003eseaborn\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://numpy.org/\"\u003enumpy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://pandas.pydata.org/\"\u003epandas\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://plotly.com/\"\u003eplotly\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"web-development\"\u003eWeb Development\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://www.djangoproject.com/start/overview/\"\u003eDjango\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://fastapi.tiangolo.com/\"\u003eFastAPI\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"gui\"\u003eGUI\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://www.riverbankcomputing.com/software/pyqt/\"\u003epyqt\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://pypi.org/project/PySimpleGUI/\"\u003ePySimpleGUI\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"automation-script\"\u003eautomation script\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/3/library/pathlib.html\"\u003epathlib\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/3/library/os.html\"\u003eos\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"machine-learning\"\u003eMachine Learning\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://www.tensorflow.org/\"\u003eTensorFlow\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://scikit-learn.org/stable/\"\u003eScikit\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.opencv.org/master/index.html\"\u003eOpenCV\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.streamlit.io/\"\u003estreamlit\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"web-scraping-and-web-automation\"\u003eWeb Scraping and Web Automation\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://requests.readthedocs.io/en/master/\"\u003eRequests\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.crummy.com/software/BeautifulSoup/bs4/doc/\"\u003eBeautiful Soup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://scrapy.org/\"\u003eScrapy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://selenium-python.readthedocs.io/installation.html#introduction\"\u003eSelenium\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"欢迎关注\"\u003e欢迎关注\u003c/h2\u003e\n\u003cp\u003e欢迎关注微信公众帐号：沉风网事(savewind)\u003c/p\u003e","title":"The popular python packages you should know"},{"content":"安装 1 brew install visual-studio-code 配置 进入配置 文件-\u0026gt; 首选项 -\u0026gt;配置 点击右上边的文件图标，进入打开设置（打开配置文件C:\\Users\\ \\AppData\\Roaming\\Code\\User\\settings.json） 修改插件安装目录 1 mklink /D \u0026#34;C:\\Users\\\u0026lt;username\u0026gt;\\.vscode\\extensions\u0026#34; \u0026#34;\u0026lt;newpath\u0026gt;\u0026#34; shortkeys 说明 本文以windows为例。\nbasic F2: rename ctrl + p: open command options ` ctrl+ `` : open terminal ctrl + Shift + F: search ctrl+ K, then Z: zen mode esc esc: from zen mode to the normal editor view ctrl+B: Toggle sidebar Navigate F8: Navigate errors and warnings File ctrl+f4: close file ctrl+W: tab through open files editor ctrl + \\: split editor ctrl + Shift + T: open a Closed Editor ctrl + T: open a file Ctrl + Home: go to the beginning of file Ctrl + End: go to the end of file CTRL + K + W: Close all open editor tabs SHIFT+ALT+F: Format document cursor Ctrl+Shift+L: Create cursor on all occurrences Ctrl+Shift+Arrow key: Add the cursor alt+ mouse click at the position： Insertadditional cursors ctrl+ U: remove additional cursors code ctrl + t: search current workspace sysmols ctrl + Shift + o: search current file sysmols ctrl + Alt + Up arrow/Down arrow.: . Add Multiple Cursors Shift + Alt + F: formart code Ctrl + Backspace： Delete Previous Word Ctrl + Shift + Right Arrow: select texts word by word from right to left Ctrl + Shift + Left Arrow: select texts word by word from left to right Ctrl + Shift + [: To fold the innermost uncollapsed region at the cursor Ctrl + Shift + ]: To unfold the innermost uncollapsed region at the cursor Shift + Alt:Column (Box) Selection Ctrl+K Ctrl+0 : fold all sections Ctrl+K Ctrl+J: unfold all sections CTRL + SHIFT + L: Add cursors to all matching selections CTRL + D: Add cursor to next matching selection Shift + Alt + Up/Down: Copy Line Up/Down ctrl+ shift + \\: Find a matching bracket shift + alt + → or ←: move and expand the selection shift+ alt+ A: add block comment ctrl+ /: add comment line alt +J: join lines ctrl +g: jump to line Alt + Up arrow/Down arrow: move line Ctrl + Shift + D: Duplicate Line Shift + Alt + Up/Down: Copy Line Up/Down ctrl + x: delete current line Ctrl+Shift+K: Delete an entire line CTRL + L: Select current line CTRL + Enter: insert line below CTRL + Enter + Shift: insert line above extensions Prettier - Code formatter\nESLint\nColor Highlight\nBracket Pair Colorizer 2\nGitLens\nLive Share\nVS Code Remote Development\nPeacock\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/vscode-tips/","summary":"\u003ch2 id=\"安装\"\u003e安装\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew install visual-studio-code\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"配置\"\u003e配置\u003c/h2\u003e\n\u003ch3 id=\"进入配置\"\u003e进入配置\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e文件-\u0026gt; 首选项 -\u0026gt;配置\u003c/li\u003e\n\u003cli\u003e点击右上边的文件图标，进入打开设置（打开配置文件C:\\Users\\ \u003c!-- raw HTML omitted --\u003e\\AppData\\Roaming\\Code\\User\\settings.json）\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"修改插件安装目录\"\u003e修改插件安装目录\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emklink /D \u0026#34;C:\\Users\\\u0026lt;username\u0026gt;\\.vscode\\extensions\u0026#34; \u0026#34;\u0026lt;newpath\u0026gt;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"shortkeys\"\u003eshortkeys\u003c/h2\u003e\n\u003ch3 id=\"说明\"\u003e说明\u003c/h3\u003e\n\u003cp\u003e本文以windows为例。\u003c/p\u003e","title":"vscode tips"},{"content":" 前言 在现代网络和互联网系统中，服务质量（Quality of Service，简称QoS）已成为确保用户体验和系统性能的关键因素之一。无论是语音通话、视频会议，还是实时数据流传输，QoS技术都在保障服务稳定性、低延迟和高可靠性方面扮演着至关重要的角色。QoS的目标是确保网络资源合理分配，从而优化各种应用的性能，特别是在高流量、复杂环境下。\n定义 QoS是指在计算机网络中，通过对网络资源的管理和控制，确保特定应用、服务或用户的网络性能达到一定标准的技术手段。\nWiki定义：\nQoS (Quality of Service) refers to the overall performance of a network, particularly the guarantee of certain levels of bandwidth, latency, jitter, and packet loss.\n简单来说，QoS的核心目标是保证网络服务的可预测性和可靠性，尤其在多种服务共享同一网络时，确保每个服务能够得到合适的网络资源。\n工作原理 QoS的工作原理是通过网络设备（如路由器、交换机）根据服务类型、优先级、流量等参数，智能地管理和控制网络资源的分配。在网络中，流量被根据不同的需求进行标记和分类，然后根据这些标记来调配带宽、延迟和丢包等资源。\n一句话：通过流量管理、资源分配和优先级控制，确保关键应用和服务的性能需求得到保障。\n属性与指标 在QoS中，主要关注以下几个属性和性能指标：\n带宽（Bandwidth）：\n表示网络能传输的数据量。QoS技术通过带宽管理，确保高优先级应用能够获得足够的带宽。 延迟（Latency）：\n数据从源到目的地的传输时间。对于实时应用（如VoIP、视频流），延迟要求非常严格。 抖动（Jitter）：\n数据包到达时间的变化。高抖动会导致视频或语音质量的波动，因此需要控制。 丢包率（Packet Loss）：\n数据包在传输过程中丢失的比率。丢包会直接影响应用性能，特别是在视频、语音通话等实时应用中。 吞吐量（Throughput）：\n网络在单位时间内成功传输的数据量。QoS保证吞吐量满足不同服务的需求。 流量优先级（Traffic Prioritization）：\n根据流量的重要性设置优先级，高优先级流量会被给予更多资源，从而保证关键应用的性能。 服务等级协议（SLA）：\n服务提供商和客户之间的协议，定义了QoS的目标和保证。 类型 QoS方法 根据不同的实现方式和控制粒度，QoS可以分为以下几类：\n静态QoS：\n静态QoS通过手动配置网络设备来设置优先级和资源分配，适合流量模式变化不大的环境。 动态QoS：\n动态QoS根据实时网络状态自动调整资源分配。它根据流量变化、网络负载和应用需求，动态调整带宽、延迟等参数。 基于策略的QoS（Policy-Based QoS）：\n基于策略的QoS允许网络管理员定义具体的流量管理策略，如根据源/目的地IP、协议类型、端口等特征来决定流量优先级。 服务质量保障（Guaranteed QoS）：\n保证特定应用获得固定的网络资源，如带宽和延迟等，适用于重要应用的场景，如VoIP、视频会议等。 流量整形（Traffic Shaping）：\n控制流量的发送速率，避免突发流量对网络带宽的占用，从而影响其他流量。 流量控制（Traffic Policing）：\n对流量进行限制，超出限制的流量会被丢弃或延迟。 QoS机制 优先级排队（Priority Queuing）：\n基于流量的优先级设置，不同优先级的流量会被放入不同的队列，优先级高的流量优先传输。 加权公平排队（Weighted Fair Queuing，WFQ）：\n在公平排队的基础上，按照流量的优先级加权，保证每个流量有公平的带宽分配。 基于流的QoS（Flow-Based QoS）：\n根据不同流（如VoIP流、视频流、文件传输流等）进行区分和管理，为每个流分配合适的网络资源。 带宽保证与限制（Bandwidth Guarantee and Limiting）：\n设置应用或用户的带宽上限，并确保关键应用能够获得指定的带宽。 QoS与应用关系 根据应用场景，QoS的配置可以分为以下几类：\n实时应用（如语音、视频会议）：\n对于实时应用，QoS要求低延迟、低抖动和高优先级。语音和视频流常常采用专用的优先队列和带宽保证策略。 非实时应用（如文件传输、网页浏览）：\n非实时应用对延迟的要求较低，可以采用动态带宽分配和流量整形策略，确保网络资源不会过度占用。 混合流量应用（如VoIP + 数据传输）：\n对于混合流量，QoS需要根据不同流量类型设置合理的优先级，确保语音流量优先，数据流量按需分配带宽。 常用QoS产品 Cisco QoS：\nCisco设备提供强大的QoS功能，支持多种流量管理策略，包括优先级队列、带宽控制、流量整形等。 Juniper Networks QoS：\nJuniper的QoS解决方案用于提供带宽管理、延迟优化和流量监控，广泛用于数据中心和企业网络。 MikroTik QoS：\nMikroTik的QoS工具用于带宽管理和流量优先级设置，适用于中小型企业和个人用户。 Huawei QoS：\n华为的QoS解决方案可以在大型企业网络和运营商级网络中提供高效的流量管理，支持复杂的策略配置和流量调度。 pfSense QoS：\npfSense是一款开源防火墙解决方案，提供全面的QoS设置，帮助小型企业实现流量控制和带宽管理。 总结 QoS（服务质量）是现代网络中确保不同类型应用和服务按预期运行的重要机制。通过合理配置QoS，网络能够有效保障关键应用（如VoIP、视频会议等）的低延迟、高带宽需求，并优化其他非实时应用的网络体验。在日益复杂的网络环境下，QoS技术的有效部署能显著提升网络资源的利用率，改善用户体验并确保服务稳定性。\n","permalink":"https://myself659.github.io/post/distributed/qos-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代网络和互联网系统中，服务质量（Quality of Service，简称QoS）已成为确保用户体验和系统性能的关键因素之一。无论是语音通话、视频会议，还是实时数据流传输，QoS技术都在保障服务稳定性、低延迟和高可靠性方面扮演着至关重要的角色。QoS的目标是确保网络资源合理分配，从而优化各种应用的性能，特别是在高流量、复杂环境下。\u003c/p\u003e","title":"QoS 101"},{"content":"共同点 都是一种交易 都想通过这种交易获利更大的回报 都会面临不确定性 最有可能会失败 都是一种概率的游戏 不同点 赌博缺少风控，投资注重风控 赌博不看风险与收益不对等，投资会考虑风险与收益是否对等 赌博是负期望，投资是正期望 赌博是固定期望，投资是可以提高期望 赌博往往不知道自己如何输赢的，投资需要做到深入研究如何输赢 赌博主要拼运气，投资拼实力（认知，技术，资源等等） 赌博是短期心态，投资是长期心态 赌博追求快速暴富，投资追求慢慢变富 ","permalink":"https://myself659.github.io/post/invest/invest-vs-gambling/","summary":"\u003ch2 id=\"共同点\"\u003e共同点\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e都是一种交易\u003c/li\u003e\n\u003cli\u003e都想通过这种交易获利更大的回报\u003c/li\u003e\n\u003cli\u003e都会面临不确定性\u003c/li\u003e\n\u003cli\u003e最有可能会失败\u003c/li\u003e\n\u003cli\u003e都是一种概率的游戏\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"不同点\"\u003e不同点\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e赌博缺少风控，投资注重风控\u003c/li\u003e\n\u003cli\u003e赌博不看风险与收益不对等，投资会考虑风险与收益是否对等\u003c/li\u003e\n\u003cli\u003e赌博是负期望，投资是正期望\u003c/li\u003e\n\u003cli\u003e赌博是固定期望，投资是可以提高期望\u003c/li\u003e\n\u003cli\u003e赌博往往不知道自己如何输赢的，投资需要做到深入研究如何输赢\u003c/li\u003e\n\u003cli\u003e赌博主要拼运气，投资拼实力（认知，技术，资源等等）\u003c/li\u003e\n\u003cli\u003e赌博是短期心态，投资是长期心态\u003c/li\u003e\n\u003cli\u003e赌博追求快速暴富，投资追求慢慢变富\u003c/li\u003e\n\u003c/ol\u003e","title":"赌博vs投资"},{"content":"学习原则 坚持终身学习 学习有法、学无定法、贵在得法 向高手学习，站在巨人的肩膀上学习 不断学习元学习，学会如何学习并不断提高学习能力 坚持高标准学习，要做到学到位 主动学习与享受学习 理论与实践结合，做到致知于行，追求知行合一 学习一定要有明确的目标与路径 学习一定要有输出 学习一定要有检测与反馈 打造有利于学习的环境与系统 ","permalink":"https://myself659.github.io/post/learn/learn-principles/","summary":"\u003ch2 id=\"学习原则\"\u003e学习原则\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e坚持终身学习\u003c/li\u003e\n\u003cli\u003e学习有法、学无定法、贵在得法\u003c/li\u003e\n\u003cli\u003e向高手学习，站在巨人的肩膀上学习\u003c/li\u003e\n\u003cli\u003e不断学习元学习，学会如何学习并不断提高学习能力\u003c/li\u003e\n\u003cli\u003e坚持高标准学习，要做到学到位\u003c/li\u003e\n\u003cli\u003e主动学习与享受学习\u003c/li\u003e\n\u003cli\u003e理论与实践结合，做到致知于行，追求知行合一\u003c/li\u003e\n\u003cli\u003e学习一定要有明确的目标与路径\u003c/li\u003e\n\u003cli\u003e学习一定要有输出\u003c/li\u003e\n\u003cli\u003e学习一定要有检测与反馈\u003c/li\u003e\n\u003cli\u003e打造有利于学习的环境与系统\u003c/li\u003e\n\u003c/ol\u003e","title":"谈谈学习的原则"},{"content":"前言 这篇文章规划了很久，本来打算年前写，各种事情加上自己的拖延症，到现在才开始写。\n做事 如果说人的一生做什么？总结一下，可以划分两个方面：\n做人 做事 这两方面很多人喜欢用一句话来指导自己：低调做人，高调做事。在这里简单地谈一下自己对做事的原则的一些思考。\n原则 关于做事，个人总结出来以下五个原则：\n不要给自己设限 尊重事实与客观规律 站在巨人的肩膀上 正确的方向与方法 敏捷的行动 不要给自己设限 在中国历史上，从陈胜与吴广喊出\u0026quot;王候将相,宁有种乎\u0026quot;，在中国2000多年的历史，刘邦，刘裕，朱元璋以及太祖无不是从社会的底层走上权力的巅峰。在科技发展过程中 莱特兄弟并没有因为万有引力定律放弃研制飞机，终于发明世界上第一架飞机， 为后面的航空航天打下坚定的基础。\n上面都是正面的例子，下面以自己为例举一个反面的例子：在2016年微信小程序出来的时候，当时就很看好微信小程序的未来，但是由于自己是一个后端程序员，不会前端代码开发，当时就认为这是前端作的事情。其实在现实工作中，我们时常也会给自己设限：\n\u0026ldquo;这个东西没有弄过\u0026rdquo; \u0026ldquo;我不会这个\u0026rdquo; \u0026ldquo;这个不属于我的工作范围\u0026rdquo; 二战以后，世界总体和平，特别是信息技术发展，无论是对公司和个人都有很多的空间和机会去探索。如果给自己设限，会失去大量的机会，对不起这个人类历史上最好的时代。\n尊重事实与客观规律 无论怎么样，事实就是事实，过去了就是过去了。大部分都是普通人，不是乔布斯没有强大的现实扭曲力。\n尊重人性，牢记与践行以人本为的理念。\n不要心存妄想。这样才能脚踏实地。放弃不劳而获的想法，摈弃白日梦。走实用主义线路，这样才能建立长期心态。\n尊重客观规律，可以避免永动机，水变油等陷阱。以不会以个人之力去对抗系统。\n尊重事实与客观规律，当自己犯了错误的时候，有助于及早发现错误，避免错的更多，错的时间更长，降低了改错的成本。\n站在巨人的肩膀上 这里说明一下巨人的的肩膀是指不以个人或团体的意志为转移的环境及趋势等。举例如下：\n孙子兵法上讲天时，地利，人和；在中国历史上有以少胜多的例子如赤壁之战，无不是在天时，地利，人和上占了先机 前人的经验与成果，这里不得不推荐google搜索 趋势，正面的例子是这几年很流行的话：站在风口上，猪都能飞起来；反面的例子就是大润发，其创始人抱憾出局：我赢了所有对手，却输给了时代 利用平台与工具，如开发微信小程序就充分利用微信的用户，场景，流量，商业基础设施等 大部分政策，如房地产市场 对于如何站在巨人的肩膀上，个人一点体会：\n思想上作到拿来主义，行动方面要善假于物 避免不必要从0到1，如重复造轮子 合理地使用杠杆 不断学习与实践，提高认知水平与学习能力，保证可以站上更多巨人的肩膀 正确的方向与方法 \u0026ldquo;选择比努力重要\u0026rdquo;， 这是大家常说一句话，可见正确的方向与方法的重要性。\n这里引用曹大在其个人分享《成长的烦恼》中的一段话：\n告诉大家一个秘密，很多企业快速膨胀的时候，那些中层为了自己的发展，快速扩张，快速启动新的项目团队，每个项目看上去都很有价值很有机会，然后大家都很忙碌很拼为了各种新的机会打拼，但是呢，其实从公司战略和格局来说，绝大部分都是实验品，甚至连实验品都不算，是领导暂时没功夫搭理的垃圾。等遇到市场风向逆转的时候，老板开始核查成本，这些乱七八糟的玩意，咔嚓嚓砍掉，你觉得不公平，你很拼很努力的为公司效力，你加班修改bug，解决线上问题，各种辛苦各种贡献，结果老板看了一眼，一文不值，真的是一文不值。\n太多优秀的人才，在巨头公司里，连公司的核心价值和主要方向都看不清，在各种根本不重要的细枝末节里荒废了自己，最后在老板眼里一文不值。\n只有方向对了，速度才有意义。\n其实在做事的时候，可以问一下自己几个问题：\n我找到或想到了哪些方向与方法吗？ 这些方法可以起作用吗？ 还有没有更好的方法（选项）？ 借助这几个问题，可以继续追问，找到事情与问题的关键所在。\n敏捷的行动 确定方向与方法后就是要行动。不然所有想法都是水中月，镜中花。这里自我批评一下，行动是我做的最差的一部分。\n敏捷的行动分解为以下几点：\n不要等 试错 制定行动计划 迈出第一步 小步快行 轻装上阵 建立行动的正向循环 不断改进 不要等 不要等万事俱备才开始。时间是最宝贵的资源。在很多的情况下，等就是一种浪费。当处于等的情况，问自己几个问题：\n是否需要等？ 哪些事情现在就可以去做？ 以自己为例，2014年初准备要学习玩一下股票，但是自己连一个股票帐号都没有开。直到2015年4月在一个证券公司，然后在2015年5月进场了，好在当时买的股票是海康威视，后面解套了。（这里强调一下，这里只是举一个例子说明，投资有风险，入市须谨慎）\n试错 不要怕犯错。错误是一种收获，那么低成本试错就是一种高收益的回报了。\n避免完美主义。Done is better than perfect。\n制定行动计划 制定行动计划就是规划行动线路图，其关键要点是milestone与deadline，制定原则参考SMART原则。\n迈出第一步 迈出第一步，那么第一步从哪里开始？可以根据情况从以下三种选择一个即可：\n从最容易的开始 从最基础的开始 从最熟悉的开始 小步快跑 以互联网产品为例，讲究的就是用最低的成本、最小的规模、最快的速度去尝试一个粗糙的东西，然后快速的拿到市场上去尝试，如果好，就趁热打铁，继续做下去，并把它做大做强。如果不好，就赶快转换方向。\n研发领域敏捷开发就是这方面的体现，这里不展开。\n轻装上阵 卸下包袱：避免外界的干拢，保持专注；事件一件一件做，避免多项事情并行。\n充实精力：主要是两个方面身体与时间；健康的身体永远都是宝贵的财富；保证合理的时间投入到具体行动中。\n放松心态：告别悲观与焦虑，保持积极乐观的心态，悲观者往往正确,乐观者往往成功，在行动过程中作一个乐观者成功的概率会加大很多。\n建立行动的正向循环 行动是一个长期的行为，贵在坚持，需要建立一套适合自己的激励机制。 简单总结为一句话：寻找动力，培养兴趣，养成习惯，实现自我驱动。\n不断改进 只有不断进步的行动，才会更好的效率，这需要在执行过程中不断优化每一个方面及过程。\n小结 不要给自己设限是解决做什么的问题，通过打破界限，扩大做什么的范围，为做什么提供更多的可能与选择的空间。\n站在巨人的肩膀上是解决在什么基础上及在什么环境下做事的问题。\n正确的方向与方法是解决怎么做的问题。\n敏捷的行动是解决做成事的问题。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/principle-of-work/","summary":"\u003ch1 id=\"前言\"\u003e前言\u003c/h1\u003e\n\u003cp\u003e这篇文章规划了很久，本来打算年前写，各种事情加上自己的拖延症，到现在才开始写。\u003c/p\u003e\n\u003ch1 id=\"做事\"\u003e做事\u003c/h1\u003e\n\u003cp\u003e如果说人的一生做什么？总结一下，可以划分两个方面：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e做人\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e做事\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e这两方面很多人喜欢用一句话来指导自己：低调做人，高调做事。在这里简单地谈一下自己对做事的原则的一些思考。\u003c/p\u003e","title":"谈谈做事的原则"},{"content":" 前言 在分布式系统中，**一致性（Consistency）**始终是核心挑战之一。随着副本数量增多、跨机房部署的普及，我们必须权衡一致性、可用性和性能。在这种背景下，**Consistency Level（一致性级别）**概念被提出，让系统在不同业务场景下按需调整一致性强度，兼顾响应延迟与系统稳定性。\n定义 wiki 定义如下：\nConsistency level is a property of distributed systems that specifies how up-to-date and synchronized a replica of data must be before a read or write operation is considered successful.\n一句话：一致性级别定义了客户端在读写操作中对数据一致性的要求。\n工作原理 一句话：客户端通过指定一致性级别，控制读写操作需要多少副本响应，从而影响操作结果的一致性与延迟。\n常见的读写过程如下：\n写：写请求发送到多个副本，只要满足设定的写一致性级别（如 2/3 副本写入成功）即可返回成功。 读：从多个副本读取数据，读取数量取决于读一致性级别（如从 2 个副本读取，取最新值）。 通过协调读写的副本数量，可以实现不同程度的一致性、可用性和平衡性。\n属性与指标 关注的一致性级别相关属性包括：\n一致性强度（Consistency Strength） 强一致 → 最终一致，从高到低依次是：ALL \u0026gt; QUORUM \u0026gt; ONE \u0026gt; ANY \u0026gt; EVENTUAL。\n可用性（Availability） 一致性越强，可用性越低，响应时间越长。\n延迟（Latency） 低一致性设置（如 ONE）响应最快；ALL 延迟最高。\n副本总数（Replication Factor, N） 影响可配置一致性级别的上限。\n写/读一致性级别（Write/Read CL） 单独配置写和读的级别，搭配得当可实现强一致。\nW + R \u0026gt; N 公式 满足此条件时，可以保证强一致性。\n类型 常见一致性级别（以 Cassandra 为例） Level 描述 特性 ALL 所有副本必须响应 最强一致性，最低可用性 QUORUM 多数副本响应（如 N=3，需2个） 高一致性与可用性平衡 ONE 任意一个副本响应 延迟最低，但可能非最新数据 TWO/THREE 两个/三个副本响应 介于 ONE 和 QUORUM 之间 LOCAL_QUORUM 当前数据中心的多数副本响应 跨机房部署常用，减少延迟 EACH_QUORUM 每个数据中心的多数副本均需响应 跨机房强一致，代价最高 ANY 任意副本或 hinted handoff 成功即返回 写入最快但无法保证可读性 强 vs 最终一致性 一致性模型 特点 场景例子 强一致性 所有读写都反映最新状态 事务系统、金融系统 最终一致性 允许延迟，最终副本趋于一致 SNS、缓存系统、购物车等 可调一致性 可选具体级别（如 QUORUM） 大多数 NoSQL 数据库系统 应用场景示例 场景 推荐一致性级别 用户登录验证 QUORUM 活动页浏览统计 ONE 或 EVENTUAL 金融转账系统 ALL 或 QUORUM 电商下单 \u0026amp; 扣库存 LOCAL_QUORUM 多地协作办公文档 EACH_QUORUM 与程序的关系 业务驱动的一致性选择 不同业务需求容忍的数据一致性程度不同，开发者应灵活配置。\n与可用性延迟的权衡 在系统压力或部分副本不可用时，较高一致性级别可能导致请求失败或变慢。\n调优空间大 通过微调读写一致性级别、延迟容忍度、写入路径等，可以实现更稳健的系统行为。\n可观测性支持 系统需提供一致性失败率、丢失写入、读非最新数据等指标用于监控。\n常见支持一致性级别的系统 Apache Cassandra（强支持） Amazon DynamoDB（支持 Strong 和 Eventual） ScyllaDB MongoDB（通过 ReadConcern、WriteConcern 实现） Couchbase FoundationDB Google Spanner（强一致全球分布） ","permalink":"https://myself659.github.io/post/arch/consistency-level-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在分布式系统中，**一致性（Consistency）**始终是核心挑战之一。随着副本数量增多、跨机房部署的普及，我们必须权衡一致性、可用性和性能。在这种背景下，**Consistency Level（一致性级别）**概念被提出，让系统在不同业务场景下按需调整一致性强度，兼顾响应延迟与系统稳定性。\u003c/p\u003e","title":"Consistency Level 101"},{"content":" 前言 在现代互联网架构中，随着服务化、微服务和云原生架构的广泛应用，系统前端需要具备更强大的流量控制能力，不仅要转发请求，还要处理认证、安全、路由、缓存等多种逻辑。这时，Application Gateway（应用网关） 作为第七层（L7）流量控制核心组件，被广泛应用于实际系统中。\n定义 Wiki 上的定义如下：\nAn application gateway or application-level gateway (ALG) is a firewall proxy that filters incoming node traffic to certain specifications.\n更现代的理解是：\nApplication Gateway 是位于 OSI 第七层的网关组件，用于处理应用层协议的请求转发、路由、认证鉴权、安全防护等功能。\n工作原理 一句话总结：\nApplication Gateway 通过深度解析应用层流量（如 HTTP/HTTPS），实现智能路由、负载均衡、安全控制等功能，通常作为服务流量的“总入口”。\n常见请求路径如下：\n1 Client → Application Gateway → Backend Services 应用网关具备对 HTTP Header、URL、Cookie 等 L7 元素的全面感知和处理能力，因此可以实现更复杂的转发与策略控制。\n属性与指标 关注的 Application Gateway 主要属性和指标包括：\nL7 路由能力 支持基于路径、主机名、参数、Header 的路由规则。\nSSL/TLS 终止 可以对 HTTPS 流量进行解密，支持统一证书管理。\n认证鉴权 如 OAuth2、JWT、API Key 验证等。\nWAF（Web Application Firewall） 提供防 SQL 注入、XSS 等安全防护能力。\nSession 粘性（Sticky Session） 支持基于 Cookie 或 IP 实现会话保持。\n流量控制能力 限流、熔断、重试等策略支持。\n性能指标 延迟、吞吐量、并发连接数、错误率等。\n类型 按用途分类 API Gateway（API 网关） 专门用于管理微服务架构中的 API 请求，如 Kong、Apigee、AWS API Gateway。\nWeb Application Gateway（Web 应用网关） 主要处理面向 Web 流量的 HTTP/HTTPS 请求，如 Azure Application Gateway、F5 BIG-IP。\n按部署方式分类 托管型网关（Managed Gateway） 如 Azure Application Gateway、AWS ALB，云厂商提供，运维简单。\n自托管网关（Self-hosted Gateway） 如 NGINX、Traefik、Kong，用户自行部署与维护。\nApplication Gateway 与程序关系 Application Gateway 是应用系统与外部访问之间的桥梁。通常：\n客户端访问系统通过 Application Gateway 进入 微服务系统中的所有 API 流量由 API Gateway 管控 实现统一的安全认证、路径路由、负载均衡和日志采集 可以作为 SSO（单点登录）集成点 常用 Application Gateway 产品 名称 类型 特点 NGINX 自托管 高性能，支持 L7 路由和自定义模块，广泛应用 Traefik 自托管 云原生友好，自动发现服务，支持 K8s、Docker 集成 AWS Application Load Balancer 托管型 与 AWS 紧密集成，支持 L7 路由、TLS、认证等功能 Azure Application Gateway 托管型 支持 WAF、Autoscale、集成 Azure Front Door Kong Gateway 自托管/API 网关 插件丰富，支持认证、限流、日志、安全策略等 Apigee (Google Cloud) 托管型 企业级 API 管理平台，强大的安全与流量控制能力 总结 Application Gateway 是现代互联网系统中实现流量管理、安全防护、智能路由的关键组件。它不仅是连接外部流量的入口点，更是系统稳定性与可扩展性的核心支柱。\n一句话总结：Application Gateway 是现代应用流量的“交通指挥官”。\n","permalink":"https://myself659.github.io/post/arch/application-gateway-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代互联网架构中，随着服务化、微服务和云原生架构的广泛应用，系统前端需要具备更强大的流量控制能力，不仅要转发请求，还要处理认证、安全、路由、缓存等多种逻辑。这时，\u003cstrong\u003eApplication Gateway（应用网关）\u003c/strong\u003e 作为第七层（L7）流量控制核心组件，被广泛应用于实际系统中。\u003c/p\u003e","title":"Application Gateway 101"},{"content":" 前言 在分布式系统中，节点故障是常态而不是例外。为了保障高可用性与最终一致性，很多系统引入了一种重要机制：Hinted Handoff（提示式转交）。它被广泛应用于如 Amazon Dynamo、Apache Cassandra 等分布式数据库系统中，是容错设计的关键一环。\n定义 Wiki 定义如下：\nHinted handoff is a technique used in distributed computing to ensure eventual consistency when a node in the system is temporarily unavailable.\n简单来说：当某个目标节点不可用时，数据会“暂存”在其他节点，一旦目标节点恢复，再将数据“提示式”转交回去。\n工作原理 一句话：临时将写入操作保存于非目标节点中，等目标节点恢复后再“转交”给它。\n详细流程：\n客户端发起写请求； 某些副本节点宕机，无法接收写入； 其他可用节点代为接收，并标记这些数据的“Hint”； 后台线程定期扫描 Hint 并检查目标节点是否恢复； 一旦节点恢复，Hint 数据会被转交回去，完成数据同步； Hint 数据被清除。 属性与指标 关注的 Hinted Handoff 属性与指标包括：\nHint 保留时间（Hint TTL） Hint 会在本地缓存中保留一定时间，超过后会丢弃。\nHint 存储容量 太多 Hint 占用资源，需防止磁盘/内存爆炸。\n交付频率 多久检查目标节点是否恢复，以及多久交付一次 Hint。\n一致性延迟 提高可用性但可能影响短期内一致性。\n写可用性增强度 在 N 个副本中，即使某些节点挂掉，写操作仍可成功。\nHint 重放失败率 如果 Hint 未能正确重交，会导致永久不一致。\n写入放大（Write Amplification） 存储了额外的 Hint 数据，增加 IO 负担。\n类型 按节点行为划分 正常写入路径 所有副本节点在线，Hint 不会触发。\n降级写入（Degraded Write） 某些副本不可用，Hinted Handoff 被触发。\nHint 清理路径 节点恢复后自动同步 Hint 数据并删除 Hint。\n按实现方式划分 本地存储型 Hint Hint 存储在写入节点本地磁盘中（如 Cassandra 中每个节点的 Hint 文件）。\n内存式 Hint Hint 数据短暂驻留在内存中，适用于轻量级系统。\n批量合并回传 Hint 数据以批量方式合并后再回传，提高效率。\n存储位置 Hint 数据通常存储在如下几类介质中：\n磁盘日志文件（hint log） 内存缓存（如 memtable） 专用列族或 keyspace（如 Cassandra 的 system.hints） 队列系统中（如 Kafka 中的延迟处理机制） Hinted Handoff 与程序关系 根据 Hint 与程序执行关系，可以区分为：\n自动后台机制 多数系统在后台透明执行，无需用户干预。\n用户感知型 Hint（如 Metrics、监控告警） 开发者可通过指标监控 Hint 的堆积与处理情况。\n配置式控制 用户可调节 Hint TTL、写入限制、并发交付数等参数。\n常见支持 Hinted Handoff 的产品 以下系统广泛支持 Hinted Handoff 或类似机制：\nApache Cassandra 实现细致且高度可配置的 Hint 管理机制。\nAmazon Dynamo / DynamoDB 最早提出该机制的系统之一。\nRiak 支持 Hinted Handoff 作为故障恢复策略的一部分。\nScyllaDB 对 Cassandra 的高性能替代实现，同样支持 Hint。\nCockroachDB（通过 Raft 变种实现类似效果） 严格一致性，但也包含延迟同步特性。\n","permalink":"https://myself659.github.io/post/arch/hinted-handoff-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在分布式系统中，节点故障是常态而不是例外。为了保障高可用性与最终一致性，很多系统引入了一种重要机制：\u003cstrong\u003eHinted Handoff（提示式转交）\u003c/strong\u003e。它被广泛应用于如 Amazon Dynamo、Apache Cassandra 等分布式数据库系统中，是容错设计的关键一环。\u003c/p\u003e","title":"Hinted Handoff 101"},{"content":" 前言 在当今互联网系统中，Proxy（代理） 是一种极为常见且强大的中间组件，广泛应用于访问控制、负载均衡、安全隔离、缓存加速等场景。无论是客户端请求网站，还是服务之间互相通信，Proxy 都扮演着不可或缺的角色。\n定义 Wiki 定义如下：\nIn computer networks, a proxy server is a server application or appliance that acts as an intermediary for requests from clients seeking resources from other servers.\n简而言之：\nProxy 是一种中间人组件，用于转发客户端的请求到目标服务器，或反向代理服务端响应到客户端。\n工作原理 一句话： Proxy 作为请求和响应的中转站，对流量进行控制、转发或加工处理。\n请求流程：\n1 Client → Proxy → Origin Server → Proxy → Client 通过 Proxy，客户端无需直接连接目标服务器。Proxy 可以缓存响应、做身份认证、限流、审计等。\n属性与指标 关注的 Proxy 属性与性能指标如下：\n透明性（Transparency） 是否对客户端/服务端隐瞒其代理身份。\n延迟（Latency） 引入代理后是否带来响应延迟。\n吞吐量（Throughput） 每秒可处理的请求数量。\n缓存能力（Caching） 能否复用响应，加快访问速度。\n负载均衡能力 能否根据策略分发请求到多个后端服务。\n可扩展性（Scalability） 是否支持水平扩展，高可用部署。\n安全性 是否支持 TLS、认证鉴权、WAF 防护等。\n类型 按照方向分类 正向代理（Forward Proxy） 代理客户端访问外部服务。典型如公司内网代理访问外部互联网。\n反向代理（Reverse Proxy） 代理外部请求访问后端服务。典型如 Nginx、Apache 作为 Web 服务入口。\n按照功能用途分类 缓存代理（Caching Proxy） 对响应进行缓存，提高命中率，降低源站压力。\n负载均衡代理（Load Balancer） 将请求分发到多个服务实例，提高吞吐与可用性。\n安全代理（Security Proxy） 提供认证鉴权、防火墙、速率限制、CSRF/XSS 保护等。\n协议转换代理 如 HTTP ↔ HTTPS，或 gRPC ↔ REST 的协议转换器。\n服务代理（Service Proxy） 常用于微服务环境，如 sidecar 模式中的 Envoy、Istio。\nProxy 与程序关系 Proxy 是连接程序与网络资源的重要中介。典型的使用关系如下：\n前端通过反向代理访问后端 API API Gateway 作为统一入口接收客户端请求 微服务之间通过 Sidecar Proxy 通信 数据访问前经缓存代理减少 DB 压力 公司内网经正向代理访问外部服务 常用 Proxy 产品 产品 类型 特点 Nginx 反向代理 高性能，支持负载均衡和缓存 HAProxy 负载均衡/反向代理 高可靠性，广泛用于企业生产环境 Squid 正向代理/缓存 支持 HTTP 缓存，常用于出口代理 Envoy 服务代理 支持 gRPC，集成于服务网格中 Traefik 反向代理 配置自动发现，适合云原生环境 Apache HTTP Server 反向代理 功能强大，支持模块扩展 总结 Proxy 是现代系统架构中实现高性能、高安全、可伸缩通信的核心技术组件。它在用户访问体验、系统负载控制、安全隔离等方面发挥着关键作用。理解各种代理类型和适用场景，是构建稳定系统的重要技能之一。\n一句话总结：Proxy 是现代系统的“隐身盾牌”，挡风遮雨，润物无声。\n","permalink":"https://myself659.github.io/post/arch/proxy-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在当今互联网系统中，\u003cstrong\u003eProxy（代理）\u003c/strong\u003e 是一种极为常见且强大的中间组件，广泛应用于访问控制、负载均衡、安全隔离、缓存加速等场景。无论是客户端请求网站，还是服务之间互相通信，Proxy 都扮演着不可或缺的角色。\u003c/p\u003e","title":"Proxy 101"},{"content":" 前言 在分布式系统中，多副本机制确保了数据的高可用性与容错能力，但同时也带来了副本间一致性的问题。为了在性能、可用性与一致性之间取得平衡，Quorum（一致性法定人数）机制应运而生，广泛应用于分布式数据库与存储系统，如 Cassandra、Dynamo、etcd、ZooKeeper 等。\n定义 Wiki 定义如下：\nIn distributed computing, a quorum is the minimum number of members of a group that must be present to make the results of any vote valid. In distributed databases, it refers to the minimum number of nodes required to acknowledge a read or write operation to consider it successful.\n简而言之： Quorum 是指执行读或写操作时必须成功访问的最小副本数，以保障一致性。\n工作原理 一句话：通过确保读写操作都覆盖到一定数量的副本，使得“读”总能读到最新的“写”。\n经典公式为：\n1 W + R \u0026gt; N 其中：\nN：副本总数 W：写操作成功所需副本数 R：读操作成功所需副本数 只要 W + R \u0026gt; N，就保证了至少有一个副本同时被读写覆盖，从而实现强一致性。\n例如：\n若 N = 3，W = 2，R = 2，则满足 W + R = 4 \u0026gt; 3，因此可以读到最新写入的数据。 属性与指标 Quorum 涉及以下核心属性与指标：\n副本数 N 系统中每条数据的存储副本总数，通常为 3、5、7。\n写法定人数 W 每次写入必须成功的副本数量，影响写可用性与一致性。\n读法定人数 R 每次读取必须访问的副本数量，影响读延迟与一致性。\nConsistency Level 一般系统支持不同级别：ONE、QUORUM、ALL、LOCAL_QUORUM 等。\nLatency vs Consistency 增加 R/W 会提高一致性，但也可能提高延迟。\nFault Tolerance 系统最多能容忍 (N - W) 个副本写失败，或 (N - R) 个副本读失败。\n类型 按读写权重划分 强写弱读（W高，R低）\n保证写入强一致，读取副本少，读延迟低。 适合写频繁、读延迟敏感场景。 强读弱写（W低，R高）\n写入快，读取需访问更多副本，保证读到最新值。 适合读密集、要求读一致性的业务。 对称 Quorum（W = R = ⌈N/2⌉）\n比较常见的设置，读写一致性较强，适用广泛。 按地理范围划分 Local Quorum\n限定在单个数据中心中满足 W 或 R，适合多机房部署。 Global Quorum\n所有数据中心参与法定人数计算，适合强一致性跨机房场景。 存储系统中的应用 Quorum 机制在许多系统中扮演关键角色：\n系统 是否使用 Quorum 说明 Cassandra ✅ R/W 可配置，支持 Local/Global DynamoDB ✅ 源自 Dynamo 论文 ZooKeeper ✅ 多数派投票机制 etcd / Consul ✅ 使用 Raft 算法，依赖多数节点确认 MongoDB ✅（部分场景） WriteConcern 和 ReadPreference 提供类似机制 与程序的关系 对于开发者而言：\n读写一致性调优 通过选择合适的 R/W 组合，控制系统的最终一致性行为。\nCAP 权衡的体现 Quorum 是 CAP 中 C（Consistency）与 A（Availability）的权衡点。\n错误处理设计 需处理部分副本失败、超时、数据不一致等场景。\n可观测性 系统应暴露法定人数满足情况、失败率、响应时间等指标。\n常见支持 Quorum 的系统 Apache Cassandra Amazon DynamoDB Apache HBase Riak etcd / Consul ZooKeeper FoundationDB CockroachDB ","permalink":"https://myself659.github.io/post/arch/quorum-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在分布式系统中，多副本机制确保了数据的高可用性与容错能力，但同时也带来了副本间一致性的问题。为了在性能、可用性与一致性之间取得平衡，\u003cstrong\u003eQuorum（一致性法定人数）机制\u003c/strong\u003e应运而生，广泛应用于分布式数据库与存储系统，如 Cassandra、Dynamo、etcd、ZooKeeper 等。\u003c/p\u003e","title":"Quorum 101"},{"content":" 前言 在现代互联网系统中，用户访问量巨大且不可预期，恶意刷接口、突发流量暴涨等问题屡见不鲜。为了保护系统稳定性、保障资源公平使用，Rate Limiter（限流器） 成为服务治理和网关中必不可少的机制。\n定义 Wiki 定义如下：\nRate limiting is used to control the rate of requests sent or received by a network interface controller or an application.\n即：\nRate Limiter 是一种控制单位时间内请求频率的机制，用于防止系统过载、保证服务质量。\n工作原理 一句话：\n通过记录访问频率并设置阈值，Rate Limiter 实现请求速率控制，超出速率的请求将被限流、拒绝或延迟处理。\n常见工作流程：\n1 Client → Gateway/Service → Rate Limiter → Service/Reject 典型应用场景包括：API 限流、登录防爆破、DDOS 防护、服务间调用保护等。\n属性与指标 关注的 Rate Limiter 主要属性与指标包括：\n限流粒度 用户级、IP级、API级、应用级等。\n单位时间窗口（Time Window） 每秒、每分钟、每小时等窗口维度。\n限流阈值（Rate Limit） 每个窗口允许的最大请求数。\n超限行为（Action on Limit Exceed） 拒绝（reject）、延迟（delay）、降级处理（fallback）等。\n令牌恢复速率（Token Refill Rate） 指定时间内恢复速率，对应令牌桶算法参数。\n突发容量（Burst Capacity） 突发时允许的最大请求数量。\n类型 常见限流算法 Fixed Window Counter 简单计数器，每个固定窗口计数清零。实现简单，存在临界点突发问题。\nSliding Window Log / Sliding Window Counter 通过记录每次访问时间精确限流，内存开销大但更平滑。\nToken Bucket 定时往桶里加令牌，请求消费令牌。支持突发请求，灵活可控。\nLeaky Bucket 请求排队后匀速处理。适合稳态流量控制，防止请求抖动。\n限流部署位置 根据应用场景，Rate Limiter 部署方式可分为：\n客户端限流 如 SDK 实现，减轻服务端压力，但无法防止恶意攻击。\n服务端限流 在业务服务内处理请求限流，适合保护后端资源。\n网关限流 在 API Gateway/Nginx 等入口统一拦截请求，集中管理。\n中间件限流 如 Redis/Lua 脚本在 NGINX 中限流，结合存储系统实现分布式限流。\nrate limiter 与程序关系 Rate Limiter 与程序关系密切，常作为以下组件集成：\nAPI Gateway 中统一处理所有接口请求限流 Service Mesh 通过 sidecar（如 Envoy）实现分布式限流 应用服务内部 控制资源调用频率（如数据库/三方API） 调度系统 控制定时任务或异步任务执行频率 高级功能扩展 1. 限流与降级联动 核心思想：当系统触发限流时，不是直接拒绝请求，而是引导流量进入降级路径或提供默认响应，提升用户体验。\n联动方式示例：\n用户访问过于频繁 → 限流 → 返回缓存结果或默认值； 后端依赖（如DB、支付系统）负载高 → 自动限流 → 返回“稍后再试”提示； 利用熔断器（如 Sentinel、Hystrix）动态判断是否开启降级。 关键组件：\n限流器（RateLimiter） 熔断器（CircuitBreaker） 服务降级处理逻辑（Fallback） 实际效果： 在高压系统中防止“雪崩效应”，提升整体系统容错与韧性。\n2. 灰度限流（灰度流控） 核心思想：只对特定用户群体、生效时间、请求路径等维度进行限流控制，用于灰度测试、功能验证、精细化运营等。\n策略示例：\n按用户ID hash，仅对10%用户启用新限流规则； 某功能上线初期，仅限流 VIP 用户请求； 某服务/接口灰度发布阶段，仅在特定 Region 或时间段生效。 实施手段：\n配置中心（如 Nacos、Apollo）动态管理灰度规则； 使用标签（Label）、规则引擎等灵活匹配用户或接口； 基于 Canary 流量分组做差异化处理。 优势： 可低风险上线限流策略，逐步观测效果，快速回滚。\n3. 动态调整限流阈值（自适应限流） 核心思想：根据系统实时状态（如 CPU、RT、队列长度）动态调节限流参数，实现智能“水龙头”。\n常见动态指标：\n实时 QPS / TPS 服务响应延迟（Latency） CPU Load、内存占用 下游依赖可用性 实现方式：\n实时监控 + 限流规则动态下发（如 Sentinel + Nacos） 使用控制器算法（如 PID 控制）调整限流阈值 使用 A/B 测试等方式验证阈值变更影响 示例场景：\n服务 RT 飙升 → 自动收紧限流阈值，减少请求进入； 依赖资源恢复 → 放宽限流阈值，逐步释放流量。 优势： 动态防抖，精准调控，可有效避免资源过载或资源浪费。\n应用建议 观测性优先：限流决策应基于实时数据 + 可视化指标，避免盲目配置。 组合拳策略：建议结合 限流 + 熔断 + 重试 + 降级 多手段协同治理。 模块化实现：将限流逻辑抽象为中间件组件，支持网关/业务服务统一接入。 支持多维度策略：如按 IP、按路径、按用户、按接口、多租户等多种维度。 常用限流组件/产品 常用 Rate Limiter 组件如下：\n名称 类型 特点 NGINX 网关限流 支持基于 IP/URI 的限流，支持 Lua 扩展 Envoy Service Mesh 内置限流过滤器，支持 gRPC/HTTP Istio Service Mesh 结合 Envoy 实现分布式限流 Redis + Lua 分布式限流 可自定义限流脚本，实现灵活策略 Guava RateLimiter 应用内限流 基于令牌桶实现，适合单机环境 Sentinel Java 限流中间件 支持多种流控策略，适配 Spring Cloud Kong Plugin API Gateway 插件形式实现 IP/用户级别限流 总结 Rate Limiter 是保障系统稳定性、服务可用性和资源公平使用的关键机制。在不同场景下，选用合适的限流算法和组件，对系统健康至关重要。 高级限流功能让 Rate Limiter 不再只是“开关”或“阀门”，而成为智能化的 流量治理中枢。它帮助我们以最小成本实现最优的资源使用效率与系统稳定性。\n一句话总结：Rate Limiter 是互联网服务的“节流阀”，守护系统边界的第一道防线。\n","permalink":"https://myself659.github.io/post/arch/rate-limiter-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代互联网系统中，用户访问量巨大且不可预期，恶意刷接口、突发流量暴涨等问题屡见不鲜。为了保护系统稳定性、保障资源公平使用，\u003cstrong\u003eRate Limiter（限流器）\u003c/strong\u003e 成为服务治理和网关中必不可少的机制。\u003c/p\u003e","title":"Rate Limiter 101"},{"content":" 前言 在分布式系统中，数据被多副本存储是常见做法，用于提升容错与可用性。然而，多副本之间的数据一致性维护是一个复杂的问题。**Read Repair（读修复）机制，正是实现最终一致性（eventual consistency）**的重要手段之一。\n定义 Wiki 定义如下：\nRead repair is a technique used in eventually consistent distributed data stores to ensure consistency by comparing and fixing data during read operations.\n简而言之：当读取多个副本时，发现副本间数据不一致，则顺便修复它们。\n工作原理 一句话：通过读取多个副本，发现不一致后，在后台悄悄修复陈旧副本。\n工作流程如下：\n客户端发起读请求； 系统读取多个副本（通常大于等于读的 quorum）； 比较副本数据的时间戳或版本号； 若发现某些副本数据落后，则主动将最新的数据写回这些副本； 对客户端返回最新数据，同时完成副本修复。 属性与指标 关注的 Read Repair 属性与指标包括：\n触发频率 是否每次读都修复？（见“类型”）\n修复延迟 修复操作在后台完成，可能存在一定延迟。\n一致性提升能力 Read Repair 能大幅提升系统的最终一致性。\n额外开销 每次读取副本数增加，可能导致网络或 CPU 开销上升。\n数据冲突处理策略 使用时间戳、版本号、或向量时钟决定哪个副本更“新”。\nRepair 成功率 是否成功更新所有落后副本，是否有修复失败统计。\n类型 按触发方式划分 同步读修复（Synchronous Read Repair） 读取时立即修复，客户端等待修复完成后返回结果。 ✅一致性高，但延迟也高。\n异步读修复（Asynchronous Read Repair） 读取数据后后台修复副本，客户端无需等待。 ✅性能好，但修复可能延迟。\n概率性读修复（Speculative Read Repair） 仅对一部分读请求触发修复（如 Cassandra 默认每 10% 请求执行）。 ✅权衡一致性与性能。\n按执行策略划分 Majority Compare 读取多数副本进行比较，以多数为准。\nFull Compare 所有副本全部参与，精度更高但代价更大。\n存储位置与操作方式 Read Repair 不涉及额外持久化位置，但它操作如下：\n从多个副本读取数据； 比较元数据（如时间戳）； 发起额外写请求以修复落后副本； 可配置 repair 并发度与速率。 Read Repair 与程序关系 从系统设计角度，Read Repair 与程序关系如下：\n开发者透明 系统自动触发，开发者通常无需介入。\n监控指标可见 可通过监控系统看到 repair 请求频率、冲突修复率等。\n调优项丰富 Cassandra 提供如下调优参数：\nread_repair_chance dc_local_read_repair_chance repair_thread_count hinted_handoff_enabled 常用支持 Read Repair 的系统 以下分布式系统广泛支持 Read Repair：\nApache Cassandra 最经典实现之一，支持同步/异步/概率性修复。\nAmazon Dynamo Read Repair 是其“eventual consistency”核心机制之一。\nScyllaDB 基于 Cassandra 架构，进一步优化了修复性能。\nRiak 使用 vector clock 进行副本修复判断。\nCouchbase / MongoDB（部分场景） 支持弱一致性读取和副本检查修复。\n","permalink":"https://myself659.github.io/post/arch/read-repair-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在分布式系统中，数据被多副本存储是常见做法，用于提升容错与可用性。然而，多副本之间的数据一致性维护是一个复杂的问题。**Read Repair（读修复）\u003cstrong\u003e机制，正是实现\u003c/strong\u003e最终一致性（eventual consistency）**的重要手段之一。\u003c/p\u003e","title":"Read Repair 101"},{"content":" 前言 在现代互联网系统中，REST API（Representational State Transfer Application Programming Interface）无处不在，是系统组件之间进行通信和数据交换的事实标准。无论是前后端、服务间、微服务还是移动端，REST API 都是最常见的通信接口形式。\n定义 Wiki 定义如下：\nA REST API (also known as RESTful API) is an application programming interface (API or web API) that conforms to the constraints of REST architectural style and allows for interaction with RESTful web services.\n简而言之：\nREST API 是一种遵循 REST 架构风格、基于 HTTP 协议的接口标准。\n工作原理 一句话： REST API 通过标准化的 HTTP 方法对资源进行操作，并使用统一的 URI 定位资源。\n核心原则包括：\n每个资源通过 URI 唯一标识 使用 HTTP 方法进行操作（GET, POST, PUT, DELETE 等） 无状态（每次请求都应包含足够信息） 使用标准的数据格式（如 JSON、XML） 属性与指标 设计与使用 REST API 时常关注以下属性与性能指标：\n资源粒度与 URI 设计 语义化、可读性强，如 /users/{id}/orders\nHTTP 方法语义\nGET：读取资源 POST：创建资源 PUT：更新资源（幂等） DELETE：删除资源 状态码语义\n200 OK、201 Created、204 No Content 400 Bad Request、404 Not Found、500 Internal Server Error 等 性能指标\n延迟（Latency） 吞吐量（QPS） 可用性（Availability） API 成功率（Success Rate） 安全性\n身份验证（如 OAuth2） 授权（Scope） 加密（HTTPS） 版本控制\n如 /v1/users，或通过 HTTP Header 管理版本 幂等性\n除了 POST，其他操作应尽量幂等（即重复操作不影响结果） 类型 按照资源操作风格分类 纯 RESTful API 严格遵循 REST 规范，语义清晰，便于缓存和文档化。\nREST-like API 接口形式像 REST，但未完全遵循 HTTP 方法语义。\nRPC 风格的 API 接口更像函数调用，常见于 gRPC、JSON-RPC。\n按照调用方式分类 同步 REST API 直接返回响应，是最常见的形式。\n异步 REST API 响应仅包含任务 ID，后续需轮询或回调通知。\nREST API 与程序关系 REST API 是连接前后端、微服务、外部集成的桥梁：\n前端通过 REST API 获取数据进行渲染 移动端通过 REST API 与服务器通信 微服务之间通过 REST 实现解耦调用 第三方系统通过 API 接入核心服务 设计良好的 API 能极大提升团队协作效率与系统可扩展性。\n常用 REST API 工具/框架 工具/框架 说明 Postman API 调试和文档平台 Swagger / OpenAPI 接口规范定义与文档自动生成 FastAPI Python 高性能 API 框架 Spring Boot Java 中最常用的 REST 构建框架 Express.js Node.js 的轻量 REST API 框架 Kong / Apigee API 网关，用于认证、限流、监控 总结 REST API 是现代系统开发的基石，它通过标准化的协议和简洁的设计，降低了系统间集成的成本。理解并掌握 REST API 的设计原则、方法语义和性能指标，是每一个开发者的必修课。\n记住一句话：好 API 就像好 UI，一眼就能明白它的用法。\n","permalink":"https://myself659.github.io/post/arch/restapi-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代互联网系统中，REST API（Representational State Transfer Application Programming Interface）无处不在，是系统组件之间进行通信和数据交换的事实标准。无论是前后端、服务间、微服务还是移动端，REST API 都是最常见的通信接口形式。\u003c/p\u003e","title":"RESTAPI 101"},{"content":" 前言 在现代分布式系统、日志系统、消息队列和数据库中，高效、可靠的写入与持久化机制是系统核心能力之一。传统的线性日志虽然简单，但在长时间运行、大规模数据场景下存在扩展性瓶颈。**Segmented Log（分段日志）**正是一种应对这些问题的设计，通过将日志拆分为多个可管理的段，提升写入性能、便于清理与恢复。\n定义 Wiki 中关于分段日志的定义不直接存在，结合主流系统的实践，可以给出如下定义：\nA segmented log is a log structure divided into multiple smaller log files or segments, each acting as a manageable unit for write, read, and cleanup, improving performance, reliability, and scalability in persistent logging systems.\n简而言之：Segmented Log 是将日志划分为多个段，每个段独立读写、存储、回放，支持高效管理。\n工作原理 一句话：通过分段管理日志文件，实现高效写入、快速回放与灵活清理。\n基本流程：\n日志系统按顺序写入当前活跃段（active segment）； 当前段写满后，生成新段继续写； 老段（cold segment）只读或归档，不再写入； 根据系统策略（如消费进度、checkpoint）清理过期段； 在恢复时，从最近 checkpoint 向后按段顺序回放日志。 属性与指标 Segmented Log 关注的关键属性如下：\n写入吞吐（Write Throughput）：顺序写活跃段，具备高性能； 读取性能（Read Efficiency）：段内顺序读 + 内存索引提升查询速度； 持久性与可靠性：每个段持久化，崩溃恢复更稳定； 回放效率：分段加速日志重放过程； 日志清理策略：基于 TTL 或 offset/LSN 的段回收； 空间管理：支持异地备份、归档冷段，降低主存储压力； 可扩展性：多个段可并行压缩、复制、分发； 容错能力：段损坏时影响范围有限，易于修复。 类型 按段角色分类： Active Segment 当前活跃写入段，顺序追加写入。\nInactive Segment 历史段，仅供读取或回放，不再写入。\nArchived Segment 已清理或转移的段，通常压缩后存储于冷数据层。\n按段策略分类： 定长段（Fixed-size Segment） 每个段固定大小（如 128MB），便于管理与优化。\n滚动段（Rolling Segment） 时间或事件驱动切段，如每小时/每天生成新段。\n可变段（Dynamic Segment） 根据写入速率或负载动态调整段大小。\n应用场景 Segmented Log 广泛应用于以下系统：\n消息队列系统：如 Apache Kafka、Redpanda、Pulsar 等基于分段日志构建； 数据库引擎：如 RocksDB、ClickHouse、TimescaleDB 使用分段 WAL； 分布式存储系统：如 HDFS、SeaweedFS，写入日志采用分段优化； 共识算法：如 Raft 协议的 log entries 分段处理； 文件同步系统：如 Dropbox Delta Sync，按段比对变化； 区块链系统：如 Tendermint、Ethereum 2.0 使用分段存储区块； 日志分析平台：如 Loki、Fluentd 中日志写入和压缩采用分段策略。 常见产品与实现 典型采用 segmented log 的系统包括：\nApache Kafka：核心以分段日志文件为设计基础； RocksDB：LSM-Tree 中 WAL 采用分段管理； ClickHouse：MergeTree 引擎数据文件按段写入； etcd / TiKV：底层 raft 日志为分段式； Apache Pulsar：Segmented WAL 架构便于 broker 崩溃恢复； Apache BookKeeper：分布式 ledger 按 entry segment 管理； Redpanda：零拷贝、高效分段日志结构； InfluxDB：时间序列数据写入采用按时间分段的 WAL。 ","permalink":"https://myself659.github.io/post/arch/segmented-log-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代分布式系统、日志系统、消息队列和数据库中，\u003cstrong\u003e高效、可靠的写入与持久化机制\u003c/strong\u003e是系统核心能力之一。传统的线性日志虽然简单，但在长时间运行、大规模数据场景下存在扩展性瓶颈。**Segmented Log（分段日志）**正是一种应对这些问题的设计，通过将日志拆分为多个可管理的段，提升写入性能、便于清理与恢复。\u003c/p\u003e","title":"Segmented Log 101"},{"content":"被动的麻烦 被动代表什么?被动常常代表麻烦,具体如下:\n落后\n等待与浪费\n缺少控制\n机会减少\n缺少准备\n什么是积极主动 积极主动怎么定义呢? 还是看实例和对比.\n一个被动消极的人会是怎么样呢?通常他们有以下言行:\n这不属于我们的职责范围 我不知道 我也没有办法 我没有选择 我不知道怎么做 他们不会这样的 通常什么也不做就是等 一个积极主动的人会是怎么样呢?通常他们有以下言行:\n我有哪些选择? 我可以尝试不同的方法 我有一个计划 问题是这样的 我会考虑更好方法 我会选择另一种方案 我会做这件事 遇到问题会自己找方案 经常思考变化 经常自省与反思 积极主动的意义 积极主动可以带来以下好处:\n更好控制自己能控制的,改变自己能改变的\n走上行动并进步的道路\n更多准备\n更多机会\n更好地适应\n更多地自我实现\n更好地专注与投入以及更高效的产出\n更早开始与先发优势\n参考 你矜持，你活该 ","permalink":"https://myself659.github.io/post/life/%E8%AF%B7%E4%B8%BB%E5%8A%A8%E7%A7%AF%E6%9E%81%E4%BA%9B/","summary":"\u003ch2 id=\"被动的麻烦\"\u003e被动的麻烦\u003c/h2\u003e\n\u003cp\u003e被动代表什么?被动常常代表麻烦,具体如下:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e落后\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e等待与浪费\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e缺少控制\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e机会减少\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e缺少准备\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"什么是积极主动\"\u003e什么是积极主动\u003c/h2\u003e\n\u003cp\u003e积极主动怎么定义呢? 还是看实例和对比.\u003c/p\u003e\n\u003cp\u003e一个被动消极的人会是怎么样呢?通常他们有以下言行:\u003c/p\u003e","title":"请主动积极些"},{"content":" 前言 在现代互联网系统中，数据的可靠性与一致性至关重要。尤其在数据库、分布式系统和文件系统中，为了防止系统崩溃后数据丢失，Write-Ahead Logging（预写日志）机制成为确保持久化与崩溃恢复的重要手段。\n定义 Wiki 定义如下：\nIn computer science, a write-ahead log (WAL) is a technique for providing atomicity and durability (two of the ACID properties) in database systems.\n简而言之：Write-Ahead Log 是一种在修改实际数据前，先将操作记录写入日志的机制，用以实现崩溃恢复和持久化保障。\n工作原理 一句话：先写日志，再执行数据写入，确保崩溃后可通过日志回放恢复数据。\n基本流程如下：\n应用对数据进行写操作； 系统先将操作记录写入 WAL； WAL 持久化后，才进行实际数据页更新； 系统崩溃时，根据 WAL 重放操作，恢复一致状态； 操作完成后，可异步清理 WAL。 属性与指标 关注 WAL 的核心属性如下：\nDurability（持久性）：操作写入日志后即被认为已“成功”； Atomicity（原子性）：通过 WAL 确保事务要么全部执行、要么不执行； 写放大：写操作需要额外的日志 IO； 吞吐量（write throughput）：受磁盘写入影响； 恢复时间（recovery latency）：依赖于日志回放效率； 日志压缩与归档：长时间运行需周期性 checkpoint； 顺序写性能：相比随机写，顺序写日志更高效。 类型 按使用粒度分类： Page-Level WAL 针对数据页（如数据库页）级别的变更记录。\nLogical-Level WAL 记录操作语义（如“插入一行”），便于重放与复制。\nHybrid WAL 同时记录逻辑与物理变更，兼顾恢复速度与灵活性。\n按组织结构分类： 单文件线性日志 顺序写入，周期性 truncate。\n段式日志（Segmented WAL） 划分为多个段，便于归档与清理，常用于大规模系统。\n多通道并发日志 支持并发事务提交，提高吞吐量，常见于现代分布式数据库。\n应用场景 WAL 广泛应用于以下系统中：\n关系型数据库：如 PostgreSQL、MySQL（InnoDB）、SQL Server； NoSQL 数据库：如 RocksDB、LevelDB、Cassandra、HBase； 分布式系统：如 Raft 共识协议中的日志记录； 文件系统：如 ext4、XFS 的 journaling； 消息队列：如 Kafka 使用 WAL 实现高可靠队列； 缓存系统：如 Redis AOF 模式本质即 WAL； 区块链系统：用于交易数据写入前备份与验证。 常见实现与产品 以下是使用或实现 WAL 的典型系统和工具：\nPostgreSQL：基于 WAL 的强一致性事务管理； RocksDB：Log-Structured Merge Tree（LSM）架构中的 WAL； Kafka：高吞吐分布式日志系统，核心即 WAL； MySQL (InnoDB)：采用 redo log 和 undo log 实现 WAL 机制； HBase：基于 HLog 提供持久化保障； etcd：Raft 协议 WAL 日志驱动状态复制； Redis：AOF 模式作为 Write-Ahead Logging 的一种形式； Apache Pulsar：消息日志亦为 WAL 驱动； ","permalink":"https://myself659.github.io/post/arch/write-ahead-log-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代互联网系统中，\u003cstrong\u003e数据的可靠性与一致性\u003c/strong\u003e至关重要。尤其在数据库、分布式系统和文件系统中，为了防止系统崩溃后数据丢失，\u003cstrong\u003eWrite-Ahead Logging（预写日志）机制\u003c/strong\u003e成为确保持久化与崩溃恢复的重要手段。\u003c/p\u003e","title":"Write-Ahead Log 101"},{"content":" 前言 在现代互联网系统与数据库技术中，数据的高效查询与有序存储一直是核心目标。尤其在关系型数据库和文件系统中，B-Tree 是广泛使用的数据结构，它以平衡、有序、高效的方式组织大量数据，支撑着几乎所有数据库的索引系统。\n定义 Wiki 定义如下：\nA B-tree is a self-balancing tree data structure that maintains sorted data and allows searches, sequential access, insertions, and deletions in logarithmic time.\n简单来说：B-Tree 是一种平衡的多路搜索树，适用于大规模数据的插入、查找和删除。\n工作原理 一句话：通过多叉树的分支结构，使数据在磁盘中以较少的 IO 次数被访问到，保证高效的读写性能。\n工作方式如下：\n所有数据都按有序排列； 每个节点包含多个键值对，且具有多个子节点； 数据插入时，节点可分裂，确保树高平衡； 数据查找从根节点开始，依序在内部节点查找范围，直到叶节点； 删除操作同样保持树结构平衡。 属性与指标 关注的 B-Tree 属性与指标如下：\n节点阶（Order） 决定每个节点最大/最小子节点数量。\n树的高度（Tree Height） 越低越好，意味着更少的磁盘 IO。\n键分布与排序 所有键全局有序，便于范围查询与二分查找。\n磁盘友好性（Disk Optimization） 每个节点通常与磁盘块对应，减少磁盘访问次数。\n插入删除复杂度 插入和删除操作时间复杂度为 O(log n)。\n平衡性 所有叶节点在同一层，确保读写性能稳定。\n类型 B-Tree 变种 B+ Tree 所有数据存储于叶子节点，内部节点仅作索引；广泛用于数据库与文件系统。\nB Tree* B+ Tree 的优化版，提升空间利用率。\nB^ε Tree 针对写优化的 B-Tree 变体，适用于写入频繁的系统。\nFractal Tree 进一步提升写性能，应用于写入密集型场景（如 TokuDB）。\n存储类型 根据应用场景，B-Tree 常用于以下结构：\n数据库索引（主键索引/二级索引） 文件系统元数据存储 排序数组或块索引 持久化 KV 存储引擎 B-Tree 与程序关系 B-Tree 既可以嵌入在数据库内部（内嵌引擎），也可以作为外部系统（如文件系统）的核心数据结构。\nIn-Memory B-Tree：如 Java 的 TreeMap、C++ STL 的 map。 Persistent B-Tree：如 MySQL InnoDB 索引、PostgreSQL 的 BTREE 索引。 Hybrid 模型：如内存中部分节点缓存，磁盘上持久化其余结构。 常用产品实现 以下是常用采用 B-Tree 或其变种的系统：\nMySQL InnoDB – 使用 B+ Tree 作为主索引结构； PostgreSQL – 默认索引类型为 B-Tree； LevelDB / RocksDB – 内部跳表，但部分系统接入了 B-Tree for metadata； Lucene / Elasticsearch – 虽以倒排索引为主，但对段元数据管理常用 B-Tree； HFS+ / NTFS 文件系统 – 使用 B-Tree 存储目录项和元数据； Oracle Database – B-Tree 与 B-Tree Clustered Index 构成索引核心。 ","permalink":"https://myself659.github.io/post/arch/b-tree-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代互联网系统与数据库技术中，数据的高效查询与有序存储一直是核心目标。尤其在关系型数据库和文件系统中，\u003cstrong\u003eB-Tree\u003c/strong\u003e 是广泛使用的数据结构，它以平衡、有序、高效的方式组织大量数据，支撑着几乎所有数据库的索引系统。\u003c/p\u003e","title":"B-tree 101"},{"content":" LSM Tree 101 前言 在现代互联网系统中，海量数据的高效写入和查询是数据库系统设计的核心目标之一。特别是写多读少或写入密集型的场景中，传统B-Tree类结构难以胜任。**LSM Tree（Log-Structured Merge Tree）**作为一种写入友好型数据结构，已经广泛应用于数据库、键值存储和时间序列系统中。\n定义 Wiki 定义如下：\nA Log-Structured Merge-tree (LSM tree) is a data structure that is designed to provide high performance for write-intensive applications by converting random writes into sequential ones using a multi-tiered structure of components.\n简单来说：LSM Tree 是一种将写操作转化为顺序写入的树形数据结构，通过分层合并提升写入性能。\n工作原理 一句话：将写入数据先缓存在内存中，定期顺序写入磁盘并分层合并，提升写入效率。\n基本流程如下：\n写入首先进入内存表（如 MemTable）； 内存表写满后持久化为磁盘 SSTable（Sorted String Table）； 多个 SSTable 定期进行合并（Compaction）； 查询操作先查内存表，再查 Bloom Filter、SSTable； 删除操作使用“标记删除”，在合并过程中真正清除。 属性与指标 LSM Tree 的核心关注指标：\n写放大（Write Amplification） 多层合并操作可能导致同一条数据写多次。\n读放大（Read Amplification） 查询需要遍历多层SSTable，依赖 Bloom Filter 缓解。\n空间放大（Space Amplification） 多版本数据和未清除的删除标记带来额外存储开销。\n压缩策略（Compaction Policy） 包括 Size-Tiered、Levelled、Hybrid 多种策略。\n延迟稳定性（Write/Read Latency） 压缩过程可能阻塞写入或造成读延迟抖动。\n吞吐性能（Throughput） 顺序写和批量合并大幅提升系统吞吐。\n适应性 可根据应用调整层级、压缩频率、内存比例等参数。\n类型 压缩策略（Compaction Strategies） Size-Tiered Compaction（STCS） 多个同层段文件积累到阈值后批量合并。写效率高，但读放大严重。\nLevelled Compaction（LCS） 每层容量递增，每次只合并相邻层，读性能更优但写放大较高。\nHybrid Compaction 结合 STCS 和 LCS，适用于特殊负载特征。\n存储组件 MemTable（内存表） 接受所有写入请求，通常是跳表、红黑树等结构。\nImmutable MemTable MemTable 写满后冻结，等待 flush 到磁盘。\nSSTable（Sorted String Table） 持久化的只读文件，按键排序，包含数据块与索引块。\nWAL（Write-Ahead Log） 所有写入先记录日志，崩溃后恢复使用。\nBloom Filter 每个 SSTable 携带，快速判断 key 是否可能存在，避免不必要读取。\nCompaction 后台进程合并、排序和清理过期数据。\n应用场景 LSM Tree 在以下场景中表现优异：\n写密集型数据库 如 OLTP 系统、高并发写入日志系统。\n键值存储引擎 RocksDB、LevelDB、WiredTiger 等。\n时序数据库 如 InfluxDB、TimescaleDB、VictoriaMetrics 等。\n分布式数据库与大数据平台 如 Apache HBase、Apache Cassandra、TiKV 等。\n搜索引擎与消息系统 如 Elasticsearch（Lucene）、Apache Pulsar（BookKeeper WAL）。\n常用产品实现 采用 LSM Tree 结构的代表产品：\nRocksDB Facebook 推出的高性能嵌入式数据库，支持多种压缩策略。\nLevelDB Google 开源，RocksDB 前身，轻量、嵌入式存储。\nApache Cassandra 分布式 NoSQL，底层存储采用 LSM Tree。\nApache HBase Hadoop 生态的列式存储系统，基于 HFile（SSTable）+ MemStore。\nWiredTiger MongoDB 默认存储引擎，自 MongoDB 3.2 起采用 LSM。\nTiKV 分布式事务型 KV 数据库，采用 RocksDB 作为底层引擎。\nInfluxDB 时序数据库，采用自定义的 TSM（Time-Structured Merge Tree）。\n","permalink":"https://myself659.github.io/post/arch/lsm-tree-101/","summary":"\u003chr\u003e\n\u003ch1 id=\"lsm-tree-101\"\u003eLSM Tree 101\u003c/h1\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代互联网系统中，海量数据的高效写入和查询是数据库系统设计的核心目标之一。特别是写多读少或写入密集型的场景中，传统B-Tree类结构难以胜任。**LSM Tree（Log-Structured Merge Tree）**作为一种写入友好型数据结构，已经广泛应用于数据库、键值存储和时间序列系统中。\u003c/p\u003e","title":"LSM tree 101"},{"content":" 前言 在现代互联网系统，特别是区块链、分布式存储、数据同步等领域，数据完整性校验至关重要。Merkle Tree（默克尔树）作为一种高效的结构化哈希机制，正是为此而生的，它在保障数据一致性和快速验证方面发挥着关键作用。\n定义 Wiki 定义如下：\nA Merkle tree is a tree in which every leaf node is labeled with the cryptographic hash of a data block, and every non-leaf node is labeled with the cryptographic hash of the labels of its child nodes.\n简而言之：Merkle Tree 是一种二叉树结构，其中每个叶子节点是数据块的哈希值，非叶节点是其子节点哈希拼接后的再次哈希值。\n工作原理 一句话：通过将所有数据块的哈希层层组合成一棵树，最终得到一个唯一的根哈希值（Merkle Root）用于验证整组数据的完整性。\n基本流程：\n将所有数据块取哈希，生成叶子节点； 相邻两个叶子节点的哈希值组合后再次哈希，生成父节点； 重复此过程，直至最终生成一个根节点； 要验证某一数据块，只需其路径上的哈希链即可（不需全量数据）。 属性与指标 Merkle Tree 关注的核心属性如下：\n数据完整性验证：通过根哈希确认整个数据结构未被篡改； 局部验证性（Partial Proof）：只需少量哈希即可验证某一数据是否存在； 安全性：依赖加密哈希函数（如 SHA-256），具备抗篡改性； 效率：相比全量数据传输，仅需对数级别（log n）哈希即可验证； 可扩展性：新增数据只需局部重哈希； 对抗冲突：适用于分布式节点之间高效比对数据差异； 哈希算法选择：影响安全性与计算性能。 类型 完整二叉 Merkle Tree 最经典的结构，节点必须成对组合，不足则复制最后一个节点凑对（padding）。\n非完全二叉树（General Merkle Tree） 用于支持任意数量子节点或非对称结构的应用场景，例如 Trie + Merkle。\nSparse Merkle Tree 稀疏结构，节点数量为 2^n，用于支持大规模 Key 空间，常用于区块链状态存储。\nDynamic Merkle Tree 支持数据动态插入/删除，用于实时更新场景，如分布式日志系统。\n常见应用场景 Merkle Tree 的应用非常广泛，主要包括：\n区块链系统：如比特币、以太坊，用于交易哈希聚合与验证； P2P 分布式系统：如 BitTorrent，用于数据完整性校验； 文件同步系统：如 Dropbox、Google Drive，用于检测文件差异； 版本控制系统：如 Git 的 commit 哈希历史树； 数据库系统：如 DynamoDB、Cassandra，用于节点间差异检测； 零知识证明系统：结合 ZKP 用于验证隐私数据一致性； 可信计算环境：校验外部数据是否篡改。 常用实现与库 以下是常见的 Merkle Tree 实现：\nGo-Ethereum (Geth)：实现了 Patricia Merkle Trie，用于状态存储； Bitcoin Core：基于标准 Merkle Tree 聚合交易数据； Merkle Tree (Python)：如 pymerkletools，用于构建与验证； Merkle-light (Rust)：轻量级、无依赖 Merkle Tree 实现； IPFS / libp2p：采用 Merkle DAG 支撑内容寻址； Hypercore / Dat：使用 Merkle Tree 做可验证日志链； Git Internals：每一次提交构成 Merkle DAG，实现历史追踪与回滚。 ","permalink":"https://myself659.github.io/post/arch/merkeltree-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代互联网系统，特别是区块链、分布式存储、数据同步等领域，\u003cstrong\u003e数据完整性校验\u003c/strong\u003e至关重要。Merkle Tree（默克尔树）作为一种高效的结构化哈希机制，正是为此而生的，它在保障数据一致性和快速验证方面发挥着关键作用。\u003c/p\u003e","title":"merkel tree 101"},{"content":" 前言 在现代互联网系统中，过滤器作为高效的集合判断结构被广泛使用。尤其在**布隆过滤器（Bloom Filter）**存在删除困难和空间使用不佳的问题时，**Cuckoo Filter（布谷鸟过滤器）**应运而生，成为一个更灵活且支持删除操作的替代方案。\n定义 Wiki 定义如下：\nA cuckoo filter is a probabilistic data structure, an approximate set-membership query data structure, that supports add, delete, and lookup operations.\n简而言之：Cuckoo Filter 是一种基于 Cuckoo Hashing 的概率性集合判断结构，支持插入、查询和删除操作，且空间效率优于布隆过滤器。\n工作原理 一句话：通过将元素指纹插入哈希表的两个候选位置之一，并在冲突时“踢出”已有元素，实现高效的集合判断与管理。\n工作步骤简述：\n对元素计算 fingerprint（指纹）； 计算两个候选桶的位置； 若两者有空位，插入其一； 若无空位，随机踢出一个已有指纹，并尝试重新插入被踢出的指纹； 若反复尝试后仍失败，则认为插入失败（表满）。 属性与指标 关注的 Cuckoo Filter 属性与指标包括：\nFalse Positive Rate（误判率）：低于布隆过滤器，尤其在高负载情况下更稳定； 支持删除操作：相较布隆过滤器的最大优势； 空间利用率：在相同误判率下，比布隆过滤器更节省内存（~95% 装载率）； 负载因子：超过一定容量后插入失败概率上升； 插入失败概率：可通过扩容或重新哈希解决； 查询复杂度：通常为 O(1)； 删除复杂度：O(1)，不需计数器； 可扩展性：原生不支持扩展，可借助多表扩展策略实现。 类型 标准 Cuckoo Filter 最基础实现，基于 Cuckoo Hashing，适用于静态容量或负载可控场景。\n扩展型 Cuckoo Filter 为支持大规模增长，可采用分区哈希或动态表扩展策略，避免频繁插入失败。\n压缩型 Cuckoo Filter 通过减小指纹长度或桶容量，换取更高空间压缩率，但牺牲一定误判率。\n多槽桶型 每个 bucket 拥有多个槽（如 4-way），进一步提高装载率和插入成功率。\n应用场景 Cuckoo Filter 的典型应用如下：\n缓存系统预过滤：与 Redis/Memcached 联用，减少穿透请求； 分布式存储系统：用于快速判定 key 是否存在，如在 RocksDB 中使用； 网络防火墙：用于黑名单判定，支持增删； 数据库索引加速：判断 key 是否存在避免无效读； 爬虫系统 URL 去重：支持删除、空间效率高； 边缘计算场景：低资源场合使用高效集合过滤结构。 常用实现与工具库 以下是常见的 Cuckoo Filter 实现：\nCuckoo Filter (by Fan et al)：最早且权威的 C/C++ 实现，GitHub 开源； Redis + CuckooFilter Module：作为模块扩展使用； Python：pycuckoofilter：纯 Python 封装，适合快速实验； Go：github.com/seiflotfy/cuckoofilter：高性能 Go 实现； Java：CuckooFilter4J、stream-lib 中扩展实现； ScyllaDB：在其存储引擎中采用改进型 Cuckoo Filter 加速 SSTable 查找。 ","permalink":"https://myself659.github.io/post/arch/cuckoo-filter-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代互联网系统中，过滤器作为高效的集合判断结构被广泛使用。尤其在**布隆过滤器（Bloom Filter）**存在删除困难和空间使用不佳的问题时，**Cuckoo Filter（布谷鸟过滤器）**应运而生，成为一个更灵活且支持删除操作的替代方案。\u003c/p\u003e","title":"CuckooFilter 101"},{"content":" 前言 在现代互联网系统中，性能与资源的平衡尤为重要。**Bloom Filter（布隆过滤器）**作为一种极致空间效率的数据结构，常用于“快速判断某元素是否存在于一个集合中”，广泛应用于缓存、搜索引擎、防止重复提交等场景。\n定义 Wiki 定义如下：\nA Bloom filter is a space-efficient probabilistic data structure, conceived by Burton Howard Bloom in 1970, that is used to test whether an element is a member of a set.\n简而言之：布隆过滤器是一种基于位数组和哈希函数的概率性数据结构，用于集合“可能包含”与“一定不包含”元素的快速判断。\n工作原理 一句话：通过将元素用多个哈希函数映射到位数组上的若干位置，实现高效存在性判断。\n简要步骤如下：\n初始化一个长度为 m 的位数组，初始全为 0； 插入元素时，计算 k 个哈希函数，置对应位为 1； 查询时，检查这 k 位是否都为 1，若存在一位为 0，则该元素一定不存在；若全为 1，则“可能存在”。 属性与指标 布隆过滤器关注的关键属性如下：\nFalse Positive Rate（误判率）：布隆过滤器会有“可能存在”的误判，但不会漏判（即不会错判存在为不存在）。 Bit Array Size（位数组大小）：越大越准确，但也占内存。 Hash Functions 数量（k）：哈希函数越多，误判率越低，但插入/查询成本更高。 Insert and Query Complexity：通常为 O(k)，常为常数时间。 不可删除性（标准布隆过滤器）：无法从集合中删除元素。 压缩性与可扩展性：基本布隆过滤器固定大小，不能动态扩容。 空间效率：极高，远优于传统 Set/List。 类型 标准 Bloom Filter 最基础的实现，适合静态集合，不支持删除操作，空间效率高。\n可扩展 Bloom Filter（Scalable Bloom Filter） 通过创建多个布隆过滤器级联，支持集合动态增长，同时控制误判率。\n计数型 Bloom Filter（Counting Bloom Filter） 将位数组替换为计数数组，支持元素删除；常用于缓存淘汰场景。\n压缩 Bloom Filter（Compressed Bloom Filter） 为传输优化，将 Bloom Filter 压缩后发送至其他节点，牺牲部分误判率换取网络传输效率。\n分布式 Bloom Filter 适用于分布式系统，将哈希映射值均匀分配到多台机器中。\n常见应用场景 缓存系统中的预过滤器：减少缓存穿透（如 Redis + Bloom Filter）。 黑名单过滤：快速判断请求是否来自非法用户。 搜索引擎爬虫去重：判断 URL 是否已访问。 邮箱/垃圾邮件检测：判定是否为黑名单发件人。 防止重复提交/注册：判断用户名、请求是否已存在。 数据库索引加速：提前判断 key 是否存在，减少 I/O。 常用实现与库 常见布隆过滤器实现如下：\nGuava BloomFilter（Java）：Google 出品，配置灵活，性能优异。 Redis Module: RedisBloom：支持布隆过滤器、计数型布隆等高级功能。 Apache HBase：使用 Bloom Filter 加速存储访问。 Apache Kafka Streams：用于流处理中的去重判断。 bloom-filter-cpp / bloomd：高性能 C/C++ 实现，适合系统底层集成。 Python: pybloom, bloom-filter3：简洁易用，适合脚本和实验场景。 ","permalink":"https://myself659.github.io/post/arch/bloomfilter-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代互联网系统中，性能与资源的平衡尤为重要。**Bloom Filter（布隆过滤器）**作为一种极致空间效率的数据结构，常用于“快速判断某元素是否存在于一个集合中”，广泛应用于缓存、搜索引擎、防止重复提交等场景。\u003c/p\u003e","title":"BloomFilter 101"},{"content":"ETC受到51%攻击 最近ETC受到51%攻击，值得注意是：ETC是受到51%攻击的币种中市值最高的。 先谈谈ETC受到51%攻击原因。ETC采用PoW共识机制，现有PoW共识天然存在51%攻击的风险，真实发生ETC的51%攻击原因如下：\n由于ETC价格大跌，算力下降，降低了发起了51%攻击的成本 由于矿场存在，实现算力大规模的垄断，同时算力切换方便，为发起51%准备了客观条件 反想一下，ETC市值是前20名，那些小币种，山寨币们都是下一个待宰的羔羊。 连ETC都受到攻击，那么PoW过时了吗？\n下面简单聊一下如何改善PoW。\n如何改善PoW dPoW dPoW方案来自Komodo（大家自行google）。 其要点就是将一段时间内的交易hash发送到BTC，在这种情况下，如果要发动51%攻击需要达到攻击BTC的算力要求，提高了攻击成本。\n第二算力有效原则 这个想法来源于第二价格密封拍卖，主要是为了打击算力竞争。\n算力限制 限制算力过强的节点，避免算力的复制，聚集，从而导致垄断，保证算力的去中心化。关于算力限制的方案欢迎交流。\n结合VRF 利用VRF的随机性，每次随机选择一批节点参与PoW。\n扩展Work的内容 现在基本上所有的PoW都上纯计算，浪费大量的算力，这些算力都成为了沉没成本。发现不少项目将PoW中Work用于AI计算。\n总结 PoW是一个伟大的共识创新，创造性地解决了拜占庭容错问题。PoW并没有过时，PoW会不断发展与改善。\n参考 第二价格密封拍卖 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/pow-is-out/","summary":"\u003ch1 id=\"etc受到51攻击\"\u003eETC受到51%攻击\u003c/h1\u003e\n\u003cp\u003e最近ETC受到51%攻击，值得注意是：ETC是受到51%攻击的币种中市值最高的。\n先谈谈ETC受到51%攻击原因。ETC采用PoW共识机制，现有PoW共识天然存在51%攻击的风险，真实发生ETC的51%攻击原因如下：\u003c/p\u003e","title":"PoW过时了吗？"},{"content":" 前言 在现代互联网系统中，队列（Queue）作为系统“解耦、削峰、异步处理”的核心手段，几乎无处不在。从消息传递、任务调度到事件驱动架构，队列始终扮演着重要角色。\n定义 Wiki定义如下：\nIn computer science, a queue is a collection of entities that are maintained in a sequence and can be modified by the addition of entities at one end of the sequence and the removal from the other end.\n简而言之，队列是一种“先进先出（FIFO）”的数据结构，用于有序传递和处理消息或任务。\n工作原理 一句话：通过在生产者与消费者之间加入队列，进行异步通信与流量控制。\n属性与指标 关注的队列属性与指标包括：\nMessage Retention Time（消息保留时间） Throughput（吞吐量） Latency（消息投递延迟） Message Ordering（消息顺序保证） Durability（消息持久化能力） Visibility Timeout（可见性超时） Dead Letter Queue (DLQ)（死信队列） Scalability（可扩展性） 类型 根据功能划分 消息队列（Message Queue）：用于传递消息，一般关注消息的可靠性和顺序，如 RabbitMQ、Kafka。 任务队列（Task Queue）：用于分发和处理任务，如 Celery + Redis。 事件队列（Event Queue）：用于事件驱动架构中，如 Kafka、EventBridge。 根据投递模型划分 点对点模型（Point-to-Point）：一个生产者对应一个消费者，消息只被消费一次。 发布订阅模型（Pub/Sub）：一个消息可以被多个消费者订阅和消费。 根据持久性划分 持久化队列（Persistent Queue）：消息写入磁盘，重启后仍可恢复。 非持久化队列（In-Memory Queue）：保存在内存中，适合高性能但数据可丢失的场景。 根据系统架构划分 集中式队列：例如 RabbitMQ、ActiveMQ。 分布式队列：例如 Kafka、RocketMQ、Pulsar。 内存队列：例如 Redis List、ZeroMQ。 常见场景 削峰填谷：高并发写入缓冲，后台异步慢速处理。 解耦组件：生产者与消费者逻辑完全隔离。 异步处理：提高响应速度，不阻塞主流程。 任务调度：延时任务、定时任务管理。 广播通知：一个事件通知多个子系统。 常用队列产品 常见队列产品如下：\nRabbitMQ：轻量、可靠，适合复杂路由和消息确认。 Kafka：高吞吐、分布式，适合日志和事件流。 Redis Queue（如 RQ、Celery 后端）：高性能、低延迟，适用于短任务场景。 RocketMQ：阿里开源，性能强劲，适合大规模消息传输。 Amazon SQS：托管服务，自动扩展，适合云原生架构。 Google Pub/Sub：全球分布，适合事件驱动架构。 Apache Pulsar：支持多租户、流和消息混合模型。 ","permalink":"https://myself659.github.io/post/arch/queue-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代互联网系统中，队列（Queue）作为系统“解耦、削峰、异步处理”的核心手段，几乎无处不在。从消息传递、任务调度到事件驱动架构，队列始终扮演着重要角色。\u003c/p\u003e","title":"Queue 101"},{"content":" 前言 在现代互联网系统中，分布式架构已成常态，如何高效、平滑地将数据或请求映射到多个节点，是系统设计中的关键问题。**一致性哈希（Consistent Hashing）**正是为了解决这一挑战而提出的算法。\n定义 Wiki定义如下：\nConsistent hashing is a special kind of hashing such that when a hash table is resized, only k/n keys need to be remapped on average, where k is the number of keys and n is the number of slots.\n简而言之：一致性哈希是一种能在节点数量变化时最大限度减少数据迁移的哈希算法。\n工作原理 一句话：通过将节点和数据都映射到一个**哈希环（Hash Ring）**上，实现数据到节点的平稳映射与快速定位。\n工作步骤简述：\n对所有节点取哈希值，映射到环上。 对数据取哈希值，顺时针寻找最近的节点。 添加或删除节点时，只需影响邻近的一小部分数据。 属性与指标 一致性哈希关注的核心属性与性能指标如下：\n平衡性（Load Balancing）：数据均匀分布在各个节点。 稳定性（Minimal Rehash）：节点变化时，尽量少的数据迁移。 单调性（Monotonicity）：增加节点不会改变已有节点的数据归属。 分布性（Distribution Uniformity）：避免热点节点产生。 虚拟节点（Virtual Nodes）支持：提高哈希环的均衡性。 查找复杂度：通常为 O(log N)，使用跳表或红黑树等结构优化。 扩展性（Scalability）：支持大规模节点动态上下线。 类型 基本一致性哈希 最简单的实现方式，即节点和数据直接映射到环上，无虚拟节点。\n缺点：当节点数量较少或哈希不均时，数据分布容易不平衡。\n虚拟节点（Virtual Nodes） 每个物理节点对应多个虚拟节点，虚拟节点均匀分布在哈希环上。\n优点：\n提高数据分布的均衡性 节点上下线时影响的数据更少 常用策略：一个节点对应 N 个虚拟节点，N 可根据节点负载能力动态设定。\n带权一致性哈希 在引入虚拟节点基础上，根据节点的处理能力或资源配置，分配不同数量的虚拟节点。\n例如：性能强的节点设置 300 个虚拟节点，性能弱的设置 100 个，实现负载按权重分配。\n应用场景 一致性哈希的典型应用如下：\n分布式缓存系统：如 Memcached 节点扩容或缩容时保持数据稳定性。 分布式存储系统：如 Amazon Dynamo、Cassandra 采用一致性哈希分布数据。 负载均衡服务：对后端服务节点进行请求均匀分发，避免迁移会话。 微服务注册中心：如 Eureka、Consul 使用一致性哈希实现服务发现。 日志收集系统：如 Kafka Partition 与 Consumer 分配策略。 常用库与实现 常见一致性哈希实现或工具库包括：\nketama：最早由Twitter开源的Java实现，支持虚拟节点，广泛用于Memcached客户端。 HashRing：Python实现的轻量哈希环库。 ConsistentHashing-Go：Go语言的简洁实现，支持虚拟节点。 LibKetama：C语言实现，适用于高性能系统。 nginx_upstream_hash：用于基于请求字段做一致性哈希转发。 ","permalink":"https://myself659.github.io/post/arch/consistent-hash-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代互联网系统中，分布式架构已成常态，如何高效、平滑地将数据或请求映射到多个节点，是系统设计中的关键问题。**一致性哈希（Consistent Hashing）**正是为了解决这一挑战而提出的算法。\u003c/p\u003e","title":"Consistent Hash 101"},{"content":" 前言 在现代互联网架构中，负载均衡（Load Balancing）几乎是每一个高可用、高并发系统的基础组件之一。它在系统稳定性、扩展性与性能方面扮演着至关重要的角色。\n定义 Wiki定义如下：\nLoad balancing is the process of distributing network traffic or computing workload across multiple servers to ensure no single server bears too much demand.\n工作原理 一句话：通过将用户请求分发到多个后端服务器，实现系统的性能提升与容错能力。\n属性与指标 负载均衡关注的核心属性与关键指标包括：\nThroughput（吞吐量）：单位时间内能处理的请求数。 Latency（延迟）：请求从发送到收到响应所花的时间。 Availability（可用性）：服务可用性和容错能力。 Health Check（健康检查）：定期检测后端服务器状态。 Session Persistence（会话保持）：保持用户会话在同一服务器。 Scalability（可扩展性）：支持横向扩展能力。 Failover（故障转移）：在节点异常时快速转移请求。 类型 根据部署层级划分 L4 Load Balancer（传输层）：基于TCP/UDP端口做转发，例如 LVS。 L7 Load Balancer（应用层）：基于HTTP请求内容进行转发，例如 Nginx、Envoy。 根据部署位置划分 Client-side Load Balancing：客户端选择目标服务节点，例如 gRPC + 服务发现。 Server-side Load Balancing：请求统一通过负载均衡器分发，例如 ELB。 DNS-based Load Balancing：通过 DNS 响应不同 IP 地址进行分发。 根据实现方式划分 硬件负载均衡器：如 F5、A10，专用于高吞吐量场景。 软件负载均衡器：如 Nginx、HAProxy、Traefik，灵活可扩展。 云服务负载均衡器：如 AWS ELB、GCP Load Balancing、阿里云 SLB。 负载均衡算法 常见的调度算法包括：\n轮询（Round Robin） 加权轮询（Weighted Round Robin） 最少连接数（Least Connections） 加权最少连接（Weighted Least Connections） 一致性哈希（Consistent Hashing） 基于资源利用率的调度（如CPU/内存） 常见应用场景 Web服务器分流 微服务请求分发 CDN边缘节点选择 数据库读写分离 消息队列消费者均衡 常用负载均衡产品 负载均衡领域的主流产品与服务包括：\nNginx：广泛使用的开源软件负载均衡器，支持 L7。 HAProxy：高性能 TCP/HTTP 负载均衡软件。 Envoy：现代服务网格架构中的 L7 代理，支持动态配置。 Traefik：专为微服务设计，原生支持 Docker/K8s。 LVS：Linux 内核层实现的 L4 负载均衡解决方案。 F5 BIG-IP：企业级硬件负载均衡器。 云负载均衡：AWS ELB、GCP Load Balancer、Azure Load Balancer、阿里云 SLB 等。 ","permalink":"https://myself659.github.io/post/arch/loadbalance-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代互联网架构中，负载均衡（Load Balancing）几乎是每一个高可用、高并发系统的基础组件之一。它在系统稳定性、扩展性与性能方面扮演着至关重要的角色。\u003c/p\u003e","title":"loadbalance 101"},{"content":" 前言 在现在互联网系统中cache无处不在，无时不用。\n定义 wiki定义如下：\na cache is a hardware or software component that stores data so that future requests for that data can be served faster;\n工作原理 一句话：通过将源数据缓存Cache，实现直接通过Cache访问数据。\n属性与指标 关注的cache属性与指标：\nTTL(Time to live) Cache capacity Eviction Policy，具体如LRU (Least Recently Used), LFU (Least Frequently Used), MRU (Most Recently Used) cache conflict cache hit ratio cache coherence cache scalablity 类型 cache更新策略 根据cache更新策略分为以下几类：\nWrite Through Cache Write Back Cache Write Around Cache （write aside cache） 存储类型 根据应用场景，常见类型如下：\nL1 cache L2 cache L3 cache Memory cache SSD cache disk cache network cache （CDN） cache与程序关系 根据cache与程序关系分为：\nLocal cache External caches 常用cache产品 常用cache产品如下：\nredis Memcached VoltDB Aerospike DB ","permalink":"https://myself659.github.io/post/arch/cache-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现在互联网系统中cache无处不在，无时不用。\u003c/p\u003e\n\u003ch2 id=\"定义\"\u003e定义\u003c/h2\u003e\n\u003cp\u003ewiki定义如下：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ea cache is a hardware or software component that stores data so that future requests for that data can be served faster;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"工作原理\"\u003e工作原理\u003c/h2\u003e\n\u003cp\u003e一句话：通过将源数据缓存Cache，实现直接通过Cache访问数据。\u003c/p\u003e","title":"Cache 101"},{"content":"Do not foucus on BTC, Ethernum and other cryptocurrucies.\nBTC just open the door for the next genration digit world which will be build with blockchain, cryptocurrucy, AI, AR, VR.\nLet us start the excited journey to the new Wild West.\n","permalink":"https://myself659.github.io/post/blockchain/blockchain-crypto-west-world/","summary":"\u003cp\u003eDo not foucus on BTC, Ethernum and other cryptocurrucies.\u003c/p\u003e\n\u003cp\u003eBTC just open the door for the next genration digit world which will be build with blockchain, cryptocurrucy, AI, AR, VR.\u003c/p\u003e\n\u003cp\u003eLet us start the excited journey to the new Wild West.\u003c/p\u003e","title":"The excited journey to the Wild West"},{"content":"如何分析股票 个人认为可以从以下几个方面展开。\n商业模式 公司的商业模式是什么？ 商业模式是否可持续？ 商业模式是否有竞争优势？ 治理能力 公司的管理层与决策层是谁？ 公司的管理层与决策层是否有可靠的管理与决策证明？ 公司的管理层与决策层是否能够创造价值？ 公司的管理层与决策层是否能够把握趋势？ 行业 公司属于什么行业？ 行业是否有增长潜力？ 行业是否有竞争优势？ 资产负债表 资产负债表是否健康？ 公司是否有充足的流动性？ 资本 融资能力如何？ 资本利用率如何？ 资本回报率如何？ 资本配置如何？ 盈利 公司是否盈利？ 盈利的来源？ 盈利的增长性？ 盈利对应分红如何？ 增长 业务增长来源？ 业务增长的指标有哪些？ 公司是否有良好的历史增长记录？ 公司是否有可持续的增长？ 风险 公司面临风险有哪些？\n是否有潜在不确定风险如黑天鹅？\n执行力 公司执行力如何？ 公司的基层激励机制？ 估值 更加准确的估值方法是什么？ 公司是否被低估或高估？ 未来与前景 未来的路径图是什么？ 未来的路径图前景如何？ 护城河 有哪些护城河？ 护城河有效性？ ","permalink":"https://myself659.github.io/post/invest/invest-how-to-stock/","summary":"\u003ch2 id=\"如何分析股票\"\u003e如何分析股票\u003c/h2\u003e\n\u003cp\u003e个人认为可以从以下几个方面展开。\u003c/p\u003e\n\u003ch3 id=\"商业模式\"\u003e商业模式\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e公司的商业模式是什么？\u003c/li\u003e\n\u003cli\u003e商业模式是否可持续？\u003c/li\u003e\n\u003cli\u003e商业模式是否有竞争优势？\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"治理能力\"\u003e治理能力\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e公司的管理层与决策层是谁？\u003c/li\u003e\n\u003cli\u003e公司的管理层与决策层是否有可靠的管理与决策证明？\u003c/li\u003e\n\u003cli\u003e公司的管理层与决策层是否能够创造价值？\u003c/li\u003e\n\u003cli\u003e公司的管理层与决策层是否能够把握趋势？\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"行业\"\u003e行业\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e公司属于什么行业？\u003c/li\u003e\n\u003cli\u003e行业是否有增长潜力？\u003c/li\u003e\n\u003cli\u003e行业是否有竞争优势？\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"资产负债表\"\u003e资产负债表\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e资产负债表是否健康？\u003c/li\u003e\n\u003cli\u003e公司是否有充足的流动性？\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"资本\"\u003e资本\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e融资能力如何？\u003c/li\u003e\n\u003cli\u003e资本利用率如何？\u003c/li\u003e\n\u003cli\u003e资本回报率如何？\u003c/li\u003e\n\u003cli\u003e资本配置如何？\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"盈利\"\u003e盈利\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e公司是否盈利？\u003c/li\u003e\n\u003cli\u003e盈利的来源？\u003c/li\u003e\n\u003cli\u003e盈利的增长性？\u003c/li\u003e\n\u003cli\u003e盈利对应分红如何？\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"增长\"\u003e增长\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e业务增长来源？\u003c/li\u003e\n\u003cli\u003e业务增长的指标有哪些？\u003c/li\u003e\n\u003cli\u003e公司是否有良好的历史增长记录？\u003c/li\u003e\n\u003cli\u003e公司是否有可持续的增长？\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"风险\"\u003e风险\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e公司面临风险有哪些？\u003c/p\u003e","title":"如何分析股票"},{"content":"说明 前面写一篇关于分布式系统的文章，但是没有考虑拜占庭问题，所以聊聊区块链共识技术，在这个过程看看比特币是如何解决拜占庭问题和共识问题。\n定义 区块链是什么？这个问题有太多的回答。\n区块链是一个由全体联网节点共同维护并持有同一账本的分布式数据库，它通过算法来达成共识，在无需信任的各节点中构建一个无单一故障点或控制点的去中心化可信系统\n所以在技术上区块链的本质是分布式帐本技术(DLT)。\n重要性 Why Decentralization Matters这篇文章从互联网发展历程与面临问题说明去中心化重要性。\n去中心化重要性来自去中心化带来的影响与作用，具体如下：\n去中心化可以降低垄断的可能性，是一种对抗垄断的重要方式 去中心化提供高可用性 去中心化对抗DDos 去中心化可以让人人参与，权力下放 去中心化是让数据归还用户，保护隐私的重要技术手段之一 去中心化消除中间环节，提高效率 去中心化与中心化并不是对立，可以相互补充 去中心化能够解决中心化无法解决的问题，如微信流控算法，并没有采用全局，而由节点根据延迟参数调整，另外是5G带来的高速传输与海量数据需要去中心化来来解决 去中心化解决问题 提供全球开放的分布式数据 提供不可更改的数据库 提供trustless的基础设施 基于以上三点的业务的需求 思考模型 如同前面的分布式系统一样，对于公链（去中心化系统）问题，也可以分为以下几个子问题：\n在什么环境下？ 有哪些节点参与？ 通过什么样的共识算法？ 使什么业务？ 达成什么样的容错要求？ 总结一句话：在什么环境下，有哪些节点参与，通过什么样的共识算法，使什么业务达成什么样的容错要求。\n下面就这五个问题展开说明。\n环境 大部分去中心化系统的环境要点如下：\n异步网络模型 网络结构是P2P网络 网络传输是不可靠的 系统异常是常态 并发 缺少全局时钟 (Ps:这里不展开说明了，谈谈对分布式系统的一些思考)\n节点 节点准入方面 节点自由加入与退出 节点需要通过PoW测试才能加入 节点需要PoS持仓才能加入 节点需要质押才能加入 节点角色 节点平等，无角色任何差异如比特币 节点分为超级节点，见证节点如EOS 节点数量 不限数量，如比特币，以太坊 指定数量，如EOS指定为21，steemit指定数量为11 节点可信 存在不可信的作恶节点 可信节点（算力）一定多于作恶节点（算力） 节点配置 机器性能波动大 网络带宽波动大 节点分布在全球各地 节点配置不受控 节点之间差异大如算力，POS投票权重 节点经济原则 99.99%以上节点是趋利 节点受激励引导 节点受惩罚限制 节点之间存在博弈与竞争 节点不会作出投入成本大于产出收益的选择 共识算法 一定要摆脱传统分布式思想的限制。要在经济，竞争，博弈，协议等多方面有效结合。\n从上图可以看出，传统分布式共识算法在整个共识里面只占很小一部分。 共识算法是区块链技术上的核心。\n不得不说，PoW是另一种形式实现拜占庭容错，是比特币最大的亮点。\n属性 一个科学共识算法必须同时满足以下四个属性：\nAgreement Validity Integrity Termination 这四个属性从四个方面规范共识算法的要求，也为我们提供分析共识算法四个不同的视角。\nAgreement Every correct process must agree on the same value.\n这是实现一致性必须要做到的要求：每个节点必须达成一致。 bitcoin通过以下几点实现该属性，具体如下：\n在选主方面选择最强算力原则，保证具体高度的区块的一致性（以最快算出的为准） 在链分叉情况下选择最长链，解决网络分化等原因可能出现的分叉问题 Validity If all the correct processes proposed the same value v, then any correct process must decide v.\nValidity是为了防止这种情况的出现：一些节点无论提议什么值，本节点一直提交NULL。在bitcoin这种行为可以理解为自私挖矿行为。\nbitcoin通过以下几点实现该属性，具体如下：\n算力不可复制 随机性加大自私挖矿的成本 最长链确认由各节点自行确认 时间戳确认 Integrity No Node decides twice.\n保证共识得到一致性不可逆，不可被修改。那么在这成共识过程中有许多操作需要进行限制。 bitcoin通过以下几点实现该属性，具体如下：\n链式结构 算力要求 难度提升 多节点竞争 Termination Eventually, every correct process decides some value.\nTermination是一个liveness属性，bitcoin通过以下几点实现该属性，具体如下：\n通过激励吸引大量节点参与，保证有节点来完成出块 出块时间周期设置10分钟 业务 去中心化带来业务的形态的变化，现列举部分业务如下：\n去中心化交易所 去中心化网络平台 去中心化计算平台 去中心化存储 去中心化CDN 去中心化数字货币 去中心化协议 去中心化跨链 去中心化金融科技DeFi 去中心化通信 容错要求 对于去中心化系统，对应的容错要求是DCS定理。\nDCS定理 如同CAP定理一样，DCS定理是指在一个公有链系统中不可能同时满足以下三个条件：去中心化（Decentralized）、一致性（Consistency）和可扩展性（Scale）。\n去中心化 去中心化是指任意节点可以加入与退出，整个网络不受任何人控制。\n一致性 与上面CAP的一致性类似，不过应用中更加偏重安全如防范双花攻击。\n可扩展性 可扩展性是指TPS能够实现提高。\n关于DCS这三者之间的tradeoff，更多参考The DCS Triangle\n小结 区块链的共识现在还处于探索阶段，并不像分布式系统共识（不考虑拜占庭问题）已经成熟。区块链的共识在不断探索与发展中，未来会有更多的新型共识出来。\n参考 Why Decentralization Matters The DCS Triangle SoK: Consensus in the age of blockchains DAGOR：微信微服务过载控制系统 A Brief Tour of FLP Impossibility Agreement with Satoshi – On the Formalization of Nakamoto Consensus Yuval Noah Harari: Why fascism is so tempting and how your data could power it | TED Talk Tech C.E.O.s Are in Love With Their Principal Doomsayer 谈谈对分布式系统的一些思考 Algorand’s Instant Consensus Protocol 区块链到底有什么了不起 BitTorrent 公有链的基本挑战 Blockchains don’t scale. Not today, at least. But there’s hope. Consensus Protocols of Distributed Ledger Technology ","permalink":"https://myself659.github.io/post/blockchain/%E5%85%B3%E4%BA%8E%E5%8C%BA%E5%9D%97%E9%93%BE%E5%85%B1%E8%AF%86%E7%9A%84%E4%B8%80%E4%BA%9B%E6%80%9D%E8%80%83/","summary":"\u003ch1 id=\"说明\"\u003e说明\u003c/h1\u003e\n\u003cp\u003e前面写一篇关于分布式系统的文章，但是没有考虑拜占庭问题，所以聊聊区块链共识技术，在这个过程看看比特币是如何解决拜占庭问题和共识问题。\u003c/p\u003e\n\u003ch1 id=\"定义\"\u003e定义\u003c/h1\u003e\n\u003cp\u003e区块链是什么？这个问题有太多的回答。\u003c/p\u003e","title":"关于区块链共识的一些思考"},{"content":"说明 本文限定在分布式系统不考虑拜占庭问题。即所有节点都是可信的。\n定义 分布式系统是多个节点协作完全一个共同的业务。\n重要性 分布式理论的重要性毋庸置疑，一句话总结：没有分布式理论，就没有现在互联网与云计算。在分布式系统实践过程中离不开分布式系统理论指导，对其重要性打个比方：分布式系统理论是分布式系统实践过程中地图与导航。\n分布式主要解决问题 分布式主要解决以下几个问题：\n解决SPOF问题，满足高可用性需求 解决Scale out问题，满足扩展性需求 解决数据分布问题，满足业务的需求 分布式是解决方案也是问题 一般情况，人们为了解决一个问题，往往会引入一个新的问题。试想如下： 由于SPOF存在，再加入一个节点作为备份。这样确实提高了系统高可用性，但是有以下新问题：\n如何检测节点状态？如何快速检测节点状态？ 如果检测主节点失败，备节点如何进行切换？ 主备节点如何同步数据？ 网络分化出现双主，如何避免与处理？ 思考模型 对于分布式系统理论，分为以下几个子问题：\n在什么环境下？ 有哪些节点参与？ 通过什么样的共识算法？ 使什么业务？ 达成什么样的容错要求？ 总结一句话：在什么环境下，有哪些节点参与，通过什么样的共识算法，使什么业务达成什么样的容错要求。\n下面就这五个问题展开说明。\n环境 分布式系统环境特点如下：\n从网络同步模型上分为同步网络，异步网络，半同步网络三种 系统异常是常态 网络传输是不可靠的 并发 缺少全局时钟 网络模型 同步网络是指网络带宽与延迟都是可以保证的。实际上现在IP网络都不属于这种，满足这种的网络是ATM网络（注意不是我们常见的提款机ATM）。\n异步网络则是指网络带宽与延迟都不确定，在异步网络发送的报文会丢失。我们正在使用主的IP网络属于这种。\n部分同步网络处于这两者中间。\n异常 机器异常通常有以下几种情况：\n电源 机器元器件故障如内存，硬盘 操作系统故障 软件故障与程序bug 资源耗尽，如内存，CPU，硬盘空间，网络带宽等 网络传输不可靠 网络传输不可靠主要体现以下几个方面：\n丢包，传输成功不确定性 延时，延时时间不确定性 重传与报文重复 乱序 并发 如同操作系统中多线程并发，分布式系统多节点在并发。但是分布式系统的并不能像多线程上通过操作系统的锁机制来处理并发，在分布式系统实现一个锁比操作系统上难度大多了。\n缺少全局时钟 一个人有一只表时，可以知道现在是几点钟，而当他同时拥有两只时却无法确定。分布式系统不同节点很难有相同的时钟。\n节点 节点数量 节点数量，在实践过程中，至少两个，常见三个节点，部分情况五个节点。\n节点角色 以raft为例可以分leader，follower，candidate等角色。\n节点可信 全是可信节点，不存在作恶节点。\n节点准入 主要方式是通过配置管理指定节点。\n节点配置 虽然节点之间机器配置，网络带宽，地理位置都会存在一定程度上的差异，但是可以控制。\n共识算法 共识算法是核心。最常见共识算法如下：\nPaxos Raft Zab Primary-secondary Quorum 属性 一个科学共识算法必须同时满足以下四个属性：\nAgreement Validity Integrity Termination 这四个属性从四个方面规范共识算法的要求，也为我们提供分析共识算法四个不同的视角。\nAgreement Every correct process must agree on the same value.\n这是实现一致性必须要做到的要求：每个节点必须达成一致。\nRaft通过以下几点实现Agreement，具体如下：\n整个系统保证最多只有一个leader 同步流只有一个方向：从leader到follower 节点crash后从leader同步数据 重新选主之后的冲突解决机制，如选主过程选择拥有最新数据的candidate为新主 Validity If all the correct processes proposed the same value v, then any correct process must decide v.\nValidity是为了防止这种情况的出现：一些节点无论提议什么值，本节点一直提交NULL。\nRaft通过以下几点实现Validity，具体如下：\n整个系统保证最多只有一个leader 同步流只有一个方向：从leader到follower 节点crash后从leader同步数据 Integrity No Node decides twice.\n保证共识得到一致性不可逆，不可被修改。那么在这成共识过程中有许多操作需要进行限制。以Raft为例，其通过以下几点实现Integrity，具体如下：\n节点都是可信的，节点不作恶 节点自我约束，只会commit一次 节点选leader过程中一次只能投一个candidate leader节点从不会覆盖自身本地日志中已经存在的条目 在存在两个leader情况下（一个真leader一个假leader）,能够根据item和index识别真假leader Termination Eventually, every correct process decides some value.\nTermination是一个liveness属性，可以理解对应CAP定理中可用性（Availability）。 对应Raft体现如下：\n多数派保证能够容忍一定的节点crash leader与follower通过心跳包实现检测 检测到leader crash，follower发起新一轮选主，保证系统正常运行 正常工作的时候，由itemId及indexId来保证一个周期的结束 这样就基本保证多数节点正常工作，整个系统能够保证有且只有一个leader（选主期间除外），另一种表达是保证系统最多只有一个leader。 （PS：建议可以读一下raft论文，读完一定会有新的理解。）\n业务 分布式业务这里列举如下：\n分布式存储，如GFS 分布式计算，如MapReduce 分布式锁，如Chobby 分布式数据库，如BigTable，Spanner 分布式ML，如TensorFlow分布式 分布式MQ，如Kafka 分布式负载均衡，如Daglev 分布式缓存，如分布式redis, Memcached 容错要求 对于分布式系统，其容错要求对应是CAP定理。在实际应用过程选择容错性要求根据业务来决定。\nCAP定理 CAP定理指出，分布式系统不可能同时满足以下三个条件：一致性（Consistency）、可用性（Availability）和分区容错（Partition tolerance）。\nCAP里面三个选项是不同角度的容错性。\n一致性 多节点加上网络的不可靠性，这样多节点的不一致状态是不可避免的。如同TCP协议，解决了网络传输不可靠性，分布式共识算法是达成一致性的方法。\n一致性分为以下几种类型（来自百度的《分布式系统原理介绍》）：\n强一致性(strong consistency)：任何时刻任何用户或节点都可以读到最近一次成功更新的副本数据。强一致性是程度最高的一致性要求，也是实践中最难以实现的一致性。\n单调一致性(monotonic consistency)：任何时刻，任何用户一旦读到某个数据在某次更新后的值，这个用户不会再读到比这个值更旧的值。单调一致性是弱于强一致性却非常实用的一种一致性级别。因为通常来说，用户只关心从己方视角观察到的一致性，而不会关注其他用户的一致性情况。\n会话一致性(session consistency)：任何用户在某一次会话内一旦读到某个数据在某次更新后的值，这个用户在这次会话过程中不会再读到比这个值更旧的值。会话一致性通过引入会话的概念，在单调一致性的基础上进一步放松约束，会话一致性只保证单个用户单次会话内数据的单调修改，对于不同用户间的一致性和同一用户不同会话间的一致性没有保障。实践中有许多机制正好对应会话的概念，例如php中的session概念。可以将数据版本号等信息保存在session中，读取数据时验证副本的版本号，只读取版本号大于等于session中版本号的副本，从而实现会话一致性。\n最终一致性(eventual consistency)：最终一致性要求一旦更新成功，各个副本上的数据最终将达到完全一致的状态，但达到完全一致状态所需要的时间不能保障。对于最终一致性系统而言，一个用户只要始终读取某一个副本的数据，则可以实现类似单调一致性的效果，但一旦用户更换读取的副本，则无法保障任何一致性。\n弱一致性(week consistency)：一旦某个更新成功，用户无法在一个确定时间内读到这次更新的值，且即使在某个副本上读到了新的值，也不能保证在其他副本上可以读到新的值。弱一致性系统一般很难在实际中使用，使用弱一致性系统需要应用方做更多的工作从而使得系统可用。\n为什么一致性很重要？借用Jakob Nielsen的一句话:\nConsistency is one of the most powerful usability principles: when things always behave the same, users don’t have to worry about what will happen.\n可用性 可用性指服务正常可用的概率。一般用数据量化指标为以下几个：\n服务正常可用的概率，如常说4个9 MTBF（平均故障间隔时间） MTTR（平均故障恢复时间） 分区容错性 分区容错性是指系统在网络分化的情况下仍然能正常对外提供服务。\n应用 遵守以不变应万变的原则，在一般工程应用过程中，先确定不变，以etcd为例：\n在异步网络环境，机器存在一定故障 一般3个节点，分布在同两个IDC机房 提供分布式KV服务 容错性方面从CAP中取CA两项 确定这些之后，我们可以选择合适的共识算法及其实现。\n后记 将分布式系统分解五个小问题，除了共识是一个难点，其他四个问题都容易理解，这样有利于我们解决问题外围，有一个清楚的背景知识和前期的准备，有利于理解与学习共识算法。作为一个思考框架，围绕框架不断地完善，如深入分析分布式业务和提高分布式系统的性能。\n个人能力有限，有什么不足与错误，欢迎指正。\n参考 Consensus raft动画演示 raft论文 寻找一种易于理解的一致性算法（扩展版） Raft Distributed Consensus Overview 你矜持，你活该 Distributed systemsfor fun and profit 分布式系统相关挑战 My Distributed Systems Seminar\u0026rsquo;s reading list for Spring 2020 A Thorough Introduction to Distributed Systems 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/distributed/distributed-theory/","summary":"\u003ch1 id=\"说明\"\u003e说明\u003c/h1\u003e\n\u003cp\u003e本文限定在分布式系统不考虑拜占庭问题。即所有节点都是可信的。\u003c/p\u003e\n\u003ch1 id=\"定义\"\u003e定义\u003c/h1\u003e\n\u003cp\u003e分布式系统是多个节点协作完全一个共同的业务。\u003c/p\u003e\n\u003ch1 id=\"重要性\"\u003e重要性\u003c/h1\u003e\n\u003cp\u003e分布式理论的重要性毋庸置疑，一句话总结：没有分布式理论，就没有现在互联网与云计算。在分布式系统实践过程中离不开分布式系统理论指导，对其重要性打个比方：分布式系统理论是分布式系统实践过程中地图与导航。\u003c/p\u003e","title":"谈谈对分布式系统的一些思考"},{"content":"前言 前几个月写一篇关于研发管理的文章。在那篇文章提出一个简单的思考框架，并没有实际案例的分享及深度分析。所以在这里以华三Comware研发为例，结合思考框架谈谈自己的一些理解与想法。\nComware 开始之前，先介绍一下Comware。其主要要点如下：\n整个系统代码量超过了1000万行（开源代码除外） 巅峰时期开发人员1000左右 支持设备类型超过100多种，同时支持各种丰富的网络特性 性能与可用性要求高，需要满足欧美高端市场（金融，国防等）要求及互联网大流量的冲击 作为公司的中台，支撑公司绝大部分产业线（安全，路由，交换，云计算等） 下面我们就一一展开说明。\n业务 以业务为中心。Comware作为一个网络操作系统，主要要求如下：\n充当网络设备的大脑，为各种网络设备业务提供平台（中台）能力与服务 承载各种网络业务，并动态满足不同网络业务的要求及变化 保证整个系统 高可用性，高性能，可维护性，可扩展性，安全性等 文化 由于历史上的原因，整个研发文化总体上源于华为，稍有调整。具体要点如下：\n质量为上 结果导向 研发三权分立 追求效率 鼓励创新 公开 关于科技公司的文化，推荐Netflix文化:自由与责任\n团队 团队是从人的视角出发。要以人为本啊。\n团队梯队合理清楚，按技术水平划分具体如下：\n开发上岗人员 维护上岗人员 开发负责人 系统扩展组 系统组 架构组 团队组织划分以业务导向，按照不同的业务划分不同大组，独立进行代码管理。在各个大组一般分为开发与维护两个方面进行人员动态调配。\n团队建设主要是大组每周定期培训，鼓励分享，除此之外针对不同岗位有专项培训，如项目管理，代码管理。\n架构 架构不是我们常说的架构，这里的架导指导代码的工作（架构从事的角度出发）。\n选择开源，拥抱开源，不要重复造轮子 不得不说2008年开始预研下一代网络操作系统，当时的团队放弃vxwork，选择了开源linux，而且作到取自开源，高于开源，只使用linux基本组件（文件管理系统，内存管理系统，进程调度等），重新移植与修改协议栈，实现分布式网络协议，扩张SOCKET类型。采用Linux好处多多，具体如下：\n充分吸引Linux开源精华 Linux开源发展路径，决定Linux便于改造与优化 与Linux一起升级，如内核2.6升级到4.x版本 方便开源引入支持，如移植wireshark， python Linux在服务器大量应用，业界有大量人才 合法合规 合法就不用多说了。注意的是要考虑到不同的国家与地区的差异。 合规方法最近的例子就是2017年百度要求内部全面停止使用React/React Native。利用开源的Linux作为基础开发商业操作系统，就不得不遵守开源协议。\nKISS原则 关于KISS原则，架构设计通用原则，有太多说明，这里不展开。\n开放性 对外开放接口，如OAA（Open Application Architecture，开放应用架构），这样有以下好处：\n对公司内部来说，降低了耦合 对外部合作方来说，方便不同厂商系统集成 对客户来说，提供了更多的选择以及DIY能力 开放与释放了平台的能力 分层与分解 整个系统采用分层设计有如下优点：\n可以分离系统不同方面的设计关注点，使得同一时刻设计者可以集中精力考虑较少的相于因素，封装和分解了相关的复杂性，增加了系统设计上的清晰度； 减少了系统的耦合和依赖，提高了内聚性，增加了潜在的代码重用性，提高了低层的代码重用度 层与层之间需要清晰的接口，有利于实现面向接口编程，而不是面向实现编程 一些层的实现可以被替换或扩展，对整体的架构影响很小 层次清晰，有利于多个小组并行开发 分解主要体现是模块化，有如下优点：\n为整体架构提供最小单元 带来了模块化管理，模块化提供交付件（cli插件，daemon等），方便模块化升级，模块定制，模块化诊断 模块化隔离，如实现进程间隔离 统一模块间依赖管理 便于将一些基础组件及功能模块化 方便问题定位，如内核定位踩内存问题 便于模块信息聚合 测试独立性 个人一直以为一个好的测试人员具有以下素质：\n业务方面做到熟悉，并能不断深入 细心保证执行方面到位 独立性，测试并不是帮助开发，而验证开发成果与补充开发的不足 发散测试，保证测试的完整性，避免漏测，守好产品最后一道门 需要在一个公司层面将测试的独立性体现出来，所以新增一个鉴定测试部门。\n软件工程 作为大型系统软件，离不开软件工程的指导，在整个过程必须科学践行软件工程。\n工具与效率 基础设施投入，如引入高性能服务器提高编译速度（1000万行c语言速度慢真的要半天），这里说一下越高频越重要。每一次修改代码都需要编译。 开发代码review工具，方便协作。\n资源统一管理 主要体现以下几个方面：\n系统资源（如LIPC端口）统一分配与管理 模块进程统一管理 大块内存申请统一管理 统一错误码 控制集中式，处理分布式 在分布式架构上，采用控制集中式，处理分布式，并不追求用复杂的分布式协议来实现，够用就好。整个模型简单，大大降低了开发难度，提高系统可靠性。\n复杂性 认识到软件开发的复杂性的重要性。在软件开发过程，要先假设软件的各种复杂情况，具体如下：\n假设一定会有错误，错误一定会发生 假设过程会出错 假设需求会变更，需求会增加 假设团队成员有变动 假设未来会更新线上代码 假设未来需要解决线上问题 这些假设会增加软件开发的复杂性，但是可以通过对假设的证明与排除来降低复杂性\n方案评审 公开评审，鼓励技术方案PK。\n预研 预研由market部门负责，由市场来定义未来需求与方向。\n度量不可少 建立度量体系。大的方面分为以下几个方面：\n市场度量 团队度量 个人度量 项目度量 代码度量 减少对人的依赖 加强流程建设 不断用机器及工具代替人 团队人员互备 文档 重视文档，无论对外还是内部文档，文档就是沟通，文档就是协作（需求文档化，架构文档化，设计文档化，项目流程文档化，交付文档化） 代码 代码是研发最终交付的核心，是架构的实体，是业务的载体，是测试的对象，是公司的核心资产。\n版本化 这个是老生常谈的问题，但是很基础，很重要。\n设计先行 代码之前，设计先行。正如以前说过一句话：从长远看，选择比努力重要，数据比算法重要，架构比实现重要。\n代码规范是行动准则 这是很好的一份代码规规范。还是一个保证得到执行的规范。很多公司都 倡导编程规范。但是实际并不能落地，这里有各种各样的原因。\n这里分享一下有利于编程规范得到真正落地的建议：\n规范意识培训 提供规范检查的工具(这个最重要) 将规范执行纳入考核(需要建立一套对应体系) 代码review，review内容包括是否符合代码规范 必不可少的单元测试 交付系统在逻辑上由一个个函数构成，以函数为单元开展测试。\n不止代码review，还有代码鉴定 对代码进行鉴定，估计国内就此一家吧。在保证代码鉴定团队的权威下，不仅要求是bug free，而且要求代码信雅达。只有高标准的要求，才会有高质量的代码。\n关于代码review的关注点，以前写过一篇文章：C语言代码 review的总结\n注重初始代码质量 这是开发顺序决定的，由少数核心开发人员完成，完成基础模型的开发。这样的好处，开始代码质量高，不要让系统输在起点上，同时优秀的代码作为后面的大量项目开发的参考与标杆。\n接口优先，接口先行 接口（API）比实现更重要。在编码之前，接口完成设计并通过评审。\n避免以忙治乱 工作总有人喜欢用了自己的勤劳来掩盖自己的愚蠢。\n说明 在不同的公司，不同行业，不同阶段研发管理都要针对性调整，不求多高大上，但求实用，只有管理规定能够落实，才能真正提高效率，增强团队的战斗力，解决具体业务的问题，满足业务的需求。\n参考 [如何看待百度要求内部全面停止使用React/React Native](如何看待百度要求内部全面停止使用 React / React Native?) 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/comware-rd/","summary":"\u003ch1 id=\"前言\"\u003e前言\u003c/h1\u003e\n\u003cp\u003e前几个月写一篇关于研发管理的文章。在那篇文章提出一个简单的思考框架，并没有实际案例的分享及深度分析。所以在这里以华三Comware研发为例，结合思考框架谈谈自己的一些理解与想法。\u003c/p\u003e","title":"大型系统软件Comware研发总结"},{"content":"回想起来，本科毕业以来，在五家公司呆过，经历四个行业，在这引起行业编程体验各有不同，总结起来就下面四句话：\n嵌入式行业：面向DataSheet编程\n通信行业：面向标准编程\n互联网行业：面向变化编程\n区块链行业：面向资金编程\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/arch/%E8%AF%B4%E8%AF%B4%E5%9C%A8%E4%B8%8D%E5%90%8C%E8%A1%8C%E4%B8%9A%E7%9A%84%E7%BC%96%E7%A8%8B%E4%BD%93%E9%AA%8C/","summary":"\u003cp\u003e回想起来，本科毕业以来，在五家公司呆过，经历四个行业，在这引起行业编程体验各有不同，总结起来就下面四句话：\u003c/p\u003e\n\u003cp\u003e嵌入式行业：\u003cstrong\u003e面向DataSheet编程\u003c/strong\u003e\u003c/p\u003e","title":"说说在不同行业的编程体验"},{"content":"小程序在2018年确实火了，除了先行的微信小程序，后面紧接着跟着了蚂蚁金服的小程序，今日头条的小程序。这里先表明一下自己的立场，从微信小程序诞生开始我就看好微信小程序。这里肯定有人说我是事后诸葛亮，这里有图为证。\n小程序让微信成为生活的操作系统 如同操作系统为应用程序提供内存资源与管理、进程资源与调度、输入与输出设备、网络传输、文件系统、用户交互等基本功能，微信生态为小程序提供了以下要素：\n用户 场景 商业基础设施，如微信支付，消息服务，基于微信社交的信任关系 这些大大降低商业成本和开发成本。 美团，微博，拼多多等公司都在微信上开发小程序， 体现了微信小程序上领先地位。\n如何发现小程序的机会 有很多人利用小程序闷声发大财，那么怎样发现小程序的机会？发现小程序的方式有很多，这里分享其中一种：参考chrome网上应用店，当然也可以从ios app store上找到新的机会。 更多参考app，详见链接。\n这么多分类了，从各个分类热门应用中可以找到一些启发。这里说明一下，这只是其中一种方式，还有很多其他的方式来挖掘小程序的机会。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/business/about-weixin-miniprogram/","summary":"\u003cp\u003e小程序在2018年确实火了，除了先行的微信小程序，后面紧接着跟着了蚂蚁金服的小程序，今日头条的小程序。这里先表明一下自己的立场，从微信小程序诞生开始我就看好微信小程序。这里肯定有人说我是事后诸葛亮，这里有图为证。\u003c/p\u003e","title":"说说微信小程序"},{"content":"前言 在现代互联网系统中，数据存储、管理与分发一直是关键技术之一。Google File System（GFS）是谷歌为满足其海量数据存储需求而设计的分布式文件系统。它支撑着谷歌的许多大规模应用，如搜索引擎、YouTube等，尤其适用于高吞吐量、大文件存储和海量数据处理。\n定义 Google File System (GFS) 是一个高度可扩展的分布式文件系统，旨在运行在商用硬件上，支持数百到数千台机器，适用于处理海量的非结构化数据。\nWikipedia定义：\n\u0026ldquo;Google File System is a proprietary distributed file system developed by Google to meet the needs of Google\u0026rsquo;s data processing and storage requirements.\u0026rdquo;\n工作原理 GFS通过将文件拆分为多个块（块大小通常为64MB），并将其分布存储在集群中的多个节点上。每个文件的多个副本会存储在不同的机器上，保证数据的可靠性与容错性。GFS的工作原理基于如下几个核心设计：\n块存储：每个文件被拆分成多个固定大小的数据块，块在集群中以副本的形式存在。 主节点控制：集群中的所有元数据（如文件与块的映射）由一个或多个主节点（Master）控制。 副本与容错：每个数据块至少保留3个副本，在不同的机器上存储，防止单点故障。 大文件支持：每个文件可以是非常大的，单个文件的大小可以达到TB级别。 高吞吐量设计：GFS特别优化了数据访问的吞吐量，而非低延迟，因此非常适合批量处理和大数据分析。 属性与指标 关注的GFS属性与指标如下：\n块大小（Block Size）：\nGFS文件通常以64MB为一个块大小。相较于传统文件系统的小块存储（如4KB），大块能够减少元数据的管理负担，适合大规模数据访问。 副本数（Replication Factor）：\n每个文件的每个块至少有3个副本。副本数可以在配置时调整，以确保数据的高可靠性。 容错性（Fault Tolerance）：\n通过数据块的副本存储、心跳检测等机制，GFS能够容忍单个节点或硬件故障。 数据一致性（Consistency）：\nGFS在写操作中采用了简单的强一致性模型，保证所有客户端在文件的任何时候看到的是一致的数据视图。 扩展性（Scalability）：\nGFS能够随着节点的增加而扩展，支持数千台机器并提供线性扩展性。 吞吐量（Throughput）：\n适合海量数据的高吞吐量处理，而非低延迟随机访问。 单一主节点（Single Master Node）：\nGFS通过单个主节点控制元数据，这种设计简化了元数据管理，但也意味着主节点成为潜在的瓶颈。 类型 GFS架构 GFS由以下三个主要组件组成：\nMaster节点（Master）：\n负责存储集群的元数据，包括文件到块的映射、块的位置和文件的副本等。 管理块的分配、回收以及数据副本的调度。 为客户端提供文件和块的元数据信息。 ChunkServer节点（ChunkServer）：\n实际存储文件的数据块，并负责数据块的读写操作。 每个ChunkServer通常存储数十万个数据块，并与其他ChunkServer协作，确保文件的数据冗余。 客户端（Client）：\n向GFS请求文件操作，客户端直接与ChunkServer进行交互，而非通过Master节点读取或写入数据。 客户端通过Master节点获取文件的元数据，再访问实际存储数据的ChunkServer。 文件存储与管理 文件系统结构：\n文件通过名称与Master节点的元数据存储管理。每个文件被拆分成多个块，这些块通过块ID与物理存储设备中的数据块一一映射。 副本管理：\n每个数据块的副本会分布在多个ChunkServer上，默认副本数为3。Master节点负责监控副本的健康情况，并在需要时创建新的副本。 垃圾回收与回收机制：\n在文件删除或副本回收时，GFS通过垃圾回收机制确保不会泄漏存储资源。 高可用性与容错 GFS的高可用性依赖于以下设计原则：\n数据副本：\n每个块会被存储在多个ChunkServer上，确保即使某个服务器宕机，数据也不会丢失。 心跳与健康检查：\nMaster节点会定期与ChunkServer进行心跳通信，监控每个存储节点的健康状况。如果发现ChunkServer失败，Master节点会重新调度该节点上的数据块副本。 元数据复制与备份：\nGFS的元数据虽然由单个Master节点管理，但该节点会定期进行备份，确保在Master节点故障时可以快速恢复。 常用GFS的替代品 虽然Google File System是一个内部系统，但它的设计思想影响了许多其他开源系统。以下是几个常用的类似产品：\nHadoop Distributed File System (HDFS)：\nHDFS是Apache Hadoop项目的一部分，借鉴了GFS的设计理念。它是一个广泛使用的开源分布式文件系统，尤其适用于大数据处理。 Ceph：\nCeph是一个开源的分布式存储系统，提供高可用性、高可靠性的文件系统、块存储和对象存储服务。 GlusterFS：\nGlusterFS是一个开源的分布式文件系统，提供了横向扩展能力和高性能。它与GFS类似，适用于需要大规模存储的场景。 Amazon S3：\n虽然S3是对象存储，但其高度分布式的架构设计和可扩展性与GFS类似，常用于海量数据的存储和管理。 总结 Google File System（GFS）是为了解决大规模数据存储和处理而设计的分布式文件系统，它优化了存储结构、数据副本管理和容错能力，使得它在数据集群规模和高吞吐量要求下表现出色。GFS的设计思想为后来的HDFS等分布式文件系统提供了宝贵的参考。\n","permalink":"https://myself659.github.io/post/distributed/gfs-101/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代互联网系统中，数据存储、管理与分发一直是关键技术之一。Google File System（GFS）是谷歌为满足其海量数据存储需求而设计的分布式文件系统。它支撑着谷歌的许多大规模应用，如搜索引擎、YouTube等，尤其适用于高吞吐量、大文件存储和海量数据处理。\u003c/p\u003e","title":"Google File System (GFS) 101"},{"content":"tips 谁使用业务与产品？ 谁负责设计业务与产品？ 谁会购买产品或者为业务付费？ 谁负责交付并维护业务与产品？ 用户与客户是如何使用业务与产品？ 用户与客户的真正的需求是什么？ 业务与产品的商业模式是什么？ ","permalink":"https://myself659.github.io/post/arch/%E6%8A%80%E6%9C%AF%E4%BA%BA%E5%91%98%E5%BA%94%E8%AF%A5%E5%A6%82%E4%BD%95%E6%80%9D%E8%80%83%E4%B8%9A%E5%8A%A1/","summary":"\u003ch2 id=\"tips\"\u003etips\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e谁使用业务与产品？\u003c/li\u003e\n\u003cli\u003e谁负责设计业务与产品？\u003c/li\u003e\n\u003cli\u003e谁会购买产品或者为业务付费？\u003c/li\u003e\n\u003cli\u003e谁负责交付并维护业务与产品？\u003c/li\u003e\n\u003cli\u003e用户与客户是如何使用业务与产品？\u003c/li\u003e\n\u003cli\u003e用户与客户的真正的需求是什么？\u003c/li\u003e\n\u003cli\u003e业务与产品的商业模式是什么？\u003c/li\u003e\n\u003c/ol\u003e","title":"技术人员应该如何思考业务与产品"},{"content":" 前言 在现代分布式系统中，多个节点并发处理数据的场景非常常见。如何判断两个事件的先后关系？如何检测冲突？这时我们需要一种比时间戳更精确的工具 —— Vector Clock（向量时钟）。\n定义 Wiki定义如下：\nA vector clock is an algorithm for generating partial ordering of events in a distributed system and detecting causality violations.\n简而言之： 向量时钟是一种用于分布式系统中事件因果关系追踪的机制。\n工作原理 一句话：每个节点维护一个向量，记录它与其他节点的交互历史，从而判断事件间的“谁在前、谁在后”或“是否并发”。\n核心思想如下：\n每个节点有一个整型计数器，称为本地时钟；\n每发生一个事件，本地时钟 +1；\n每次消息发送，会带上当前向量；\n接收消息后，将向量合并（取 max），并自身 +1；\n对两个 vector clocks V1 和 V2：\n若 V1 所有分量 ≤ V2 且至少一个 \u0026lt;，则 V1 happens-before V2； 否则两个事件是并发的（conflict）。 属性与指标 关注向量时钟相关的属性与指标包括：\nCausality 保证 可以判断事件的因果关系（happens-before）。\nConflict Detection 能发现并发写入或数据冲突。\n空间复杂度 每个时钟大小为 O(n)，n 为节点数。\n合并开销 向量合并过程相对简单，但在大规模系统中仍需优化。\n扩展性 随节点数量增加，开销线性增长。\n类型 按照系统规模 静态 Vector Clock 节点数量固定，向量维度不变。适合小型系统。\n动态 Vector Clock 节点可动态加入，维度可扩展。需要引入稀疏向量或压缩技术。\n按照用途划分 版本控制用 Vector Clock 常用于 NoSQL（如 Dynamo）或 CRDT，用于检测写入冲突。\n调试与监控用 Vector Clock 用于分布式 tracing 中追踪调用链与事件顺序。\nVector Clock 与程序关系 根据与程序的集成方式：\n系统透明使用 如数据库内部使用，应用程序无感知。\n应用显式处理 例如需要将 vector clock 附在每个请求中，由上层逻辑处理冲突。\n常见使用场景 场景 使用方式 目的 Amazon Dynamo 写入附带 vector clock 冲突检测 Riak KV 多版本值，基于 vector clock 合并 数据同步 Cassandra（早期） 作为 conflict resolution 手段 最终一致性控制 CRDT 实现 结合 vector clock 判断因果顺序 正确合并分布式状态 Trace 系统（如 Jaeger） 构建调用链 分析调用路径顺序 总结 向量时钟是一种高效的、数学精确的方式，用于在无全局时钟的前提下推理事件顺序。尽管它的使用增加了系统的复杂性和空间开销，但它在高一致性与冲突检测场景中依旧是不可替代的关键机制。\n","permalink":"https://myself659.github.io/post/distributed/vector-clocks-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代分布式系统中，多个节点并发处理数据的场景非常常见。如何判断两个事件的先后关系？如何检测冲突？这时我们需要一种比时间戳更精确的工具 —— \u003cstrong\u003eVector Clock（向量时钟）\u003c/strong\u003e。\u003c/p\u003e","title":"vector clock 101"},{"content":" 前言 在现代分布式系统中，系统经常部署在多个地理位置、跨多个节点，网络延迟、故障和节点不一致成为常态。如何在这种复杂环境下权衡一致性与可用性？CAP 定理给出了明确的理论指导。\n定义 Wiki 定义如下：\nIn theoretical computer science, the CAP theorem states that it is impossible for a distributed data store to simultaneously provide more than two out of the following three guarantees: Consistency, Availability, and Partition Tolerance.\n简而言之：\nCAP 定理指出：在一个分布式系统中，Consistency（一致性）、Availability（可用性）和 Partition Tolerance（分区容忍性）三者不能同时完全满足，最多只能满足其中两项。\n工作原理 一句话： 在网络分区发生时，系统必须在“一致性”和“可用性”之间做出选择。\nCAP 三要素解释如下：\nC - Consistency（一致性） 所有节点在同一时间看到的数据完全一致。\nA - Availability（可用性） 每个请求都能在有限时间内获得响应（成功或失败）。\nP - Partition Tolerance（分区容忍性） 系统在部分网络故障（如节点间断连）时仍能继续提供服务。\n当网络正常时，系统可能同时满足 C 和 A。但一旦发生分区（Partition），必须放弃 C 或 A 之一。\n属性与指标 在实际系统设计中，CAP 影响的关键属性有：\n可预测性 用户是否总能读取最新数据？\n可用性 故障发生时系统还能否响应请求？\n故障容忍度 系统面对网络不通、节点宕机时能否保持正常运行？\n响应延迟 CAP 选择对系统延迟有直接影响。\n最终一致性 有些系统通过牺牲强一致性，转而选择 eventual consistency。\n类型 根据 CAP 三者的取舍，不同系统可大致分为以下几类：\nCP 系统（强一致性 + 分区容忍） 特点：放弃高可用，一致性优先。\n常见系统：HBase、MongoDB（强一致配置） 适用场景：银行系统、订单系统 AP 系统（高可用 + 分区容忍） 特点：牺牲一致性，但确保服务不挂。\n常见系统：Cassandra、Dynamo、CouchDB 适用场景：社交、缓存、日志收集等对一致性要求不高场景 CA 系统（强一致性 + 高可用） 特点：不考虑网络分区（理论上不成立，非分布式或单节点系统）\n常见系统：传统关系型数据库（在单机部署下） 适用场景：本地数据库、嵌入式系统 CAP 与程序关系 CAP 的设计理念决定了程序如何处理异常、重试以及写冲突等：\nCP 系统中程序要更关注服务降级和容灾； AP 系统中程序需设计好 conflict resolution； 构建跨节点业务逻辑时必须显式处理因 CAP 限制导致的异步行为。 常见 CAP 应用系统 系统/数据库 所属类型 CAP 取舍 Cassandra AP 高可用 + 分区容忍 MongoDB CP 强一致 + 分区容忍 Zookeeper CP 强一致 + 分区容忍 Redis Sentinel AP 高可用 + 分区容忍 etcd / Consul CP 强一致 + 分区容忍 MySQL（主从） CA 非分布式时满足 CA 总结 CAP 定理是构建分布式系统的根基理论之一。理解 CAP 的三选二原则，不仅能帮助我们合理设计系统架构，也有助于我们在面对故障和扩展性问题时做出理性取舍。\n记住一句话：没有完美系统，只有根据业务权衡后的合理选择。\n","permalink":"https://myself659.github.io/post/distributed/cap-theorem-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代分布式系统中，系统经常部署在多个地理位置、跨多个节点，网络延迟、故障和节点不一致成为常态。如何在这种复杂环境下权衡一致性与可用性？CAP 定理给出了明确的理论指导。\u003c/p\u003e","title":"CAP Theorem 101"},{"content":" 前言 在分布式系统、文件传输、数据存储等场景中，数据在传输和存储过程中可能出现错误或损坏。为了确保数据的完整性和正确性，Checksum（校验和） 是一种常用且高效的手段，扮演着“数据防护罩”的角色。\n定义 Wiki 定义如下：\nA checksum is a small-sized block of data derived from another block of digital data for the purpose of detecting errors which may have been introduced during its transmission or storage.\n简而言之：Checksum 是一种通过算法计算出的摘要值，用来校验数据在传输或存储过程中是否发生错误。\n工作原理 一句话：通过对数据进行算法运算，生成校验值，传输或存储时一并携带，接收端再次计算并比对校验值，从而验证数据是否一致。\n典型流程如下：\n发送端：对原始数据执行校验算法 → 生成 Checksum → 附加发送或存储； 接收端：接收数据后重新计算 Checksum → 对比 → 若一致则视为无误，否则视为数据损坏。 属性与指标 常关注的 Checksum 属性包括：\n冲突概率（Collision Rate） 不同数据计算出的 Checksum 值相同的概率，越低越好。\n性能（计算效率） 算法运算时间对系统性能的影响，需在准确性与性能之间权衡。\n空间占用（Checksum 长度） 通常是 8-bit、16-bit、32-bit、64-bit，不同精度适应不同场景。\n容错能力 检测出数据损坏的能力，但不具备纠错（与 CRC、ECC 区分）。\n对抗性（安全性） 简单 Checksum 易被伪造，不适用于安全校验场景（如密码学中使用 Hash）。\n类型 常见 Checksum 算法 模加（Modular Sum） 最基础方式，快速但容易冲突，适用于轻量校验。\n异或（XOR） 多用于简单字节流的快速校验。\nCRC（Cyclic Redundancy Check） 比简单校验更强，广泛用于网络通信和硬盘系统。\nMD5、SHA 系列 实际属于密码学 Hash 函数，但在部分场景中用于校验数据完整性。\n应用场景分类 存储校验 如 HDFS、Ceph 对数据块进行 Checksum，确保磁盘损坏可发现。\n传输校验 TCP/IP 协议中的 TCP Checksum 用于检测网络传输误码。\n备份一致性 数据库、对象存储系统利用 Checksum 校验备份文件是否一致。\n文件校验 软件分发时附带 SHA256 或 MD5 Checksum，用户下载后对比验证文件完整性。\nChecksum 与程序关系 根据 Checksum 的用途，可分为以下两种关系：\n内嵌型校验 如 TCP 包中自带 Checksum 字段，系统层自动处理。\n业务侧显式使用 开发者在上传文件、传输 JSON 等场景中显式加上校验字段。\n常用工具与实现 常见 Checksum 工具和相关命令如下：\nmd5sum、sha256sum：文件校验命令行工具 Hadoop：数据块写入自动生成 CRC 校验 ZFS、Btrfs：文件系统级别内置校验机制 PostgreSQL：表/页校验机制 Redis：使用 CRC16 进行数据槽分布一致性控制 总结 Checksum 是分布式系统与网络协议中不可或缺的基础能力。 它通过简单、高效的方式提供了错误检测机制，提升了系统的数据可靠性。虽然不能纠正错误，但作为检测机制，它已足够成为系统稳定性的“第一道防线”。\n","permalink":"https://myself659.github.io/post/distributed/checksum-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在分布式系统、文件传输、数据存储等场景中，数据在传输和存储过程中可能出现错误或损坏。为了确保数据的完整性和正确性，\u003cstrong\u003eChecksum（校验和）\u003c/strong\u003e 是一种常用且高效的手段，扮演着“数据防护罩”的角色。\u003c/p\u003e","title":"Checksum  101"},{"content":" 前言 在现代分布式系统、流处理引擎和日志系统中，数据的顺序性与进度控制至关重要。如何知道一个节点、消费者、或者整个系统**“处理到哪了”**？这就是 High-Water Mark（高水位线） 的核心意义。\n定义 Wiki 上并没有专门定义，但通用定义如下：\nA high-water mark is a record of the highest level of something that has been achieved or seen. In computing, it often refers to the furthest point in data processing that is known to be durable, committed, or replicated.\n简而言之： High-Water Mark 是系统中用于记录“安全推进到哪”的指针，用来追踪最大已确认处理或同步的进度。\n工作原理 一句话：High-Water Mark 是某个组件或系统中“可以放心前进”的最大位置标记。\n例如在 Kafka 中，High-Water Mark 表示“该分区中所有副本都确认写入”的最大 offset；在分布式数据库中，它表示“所有节点都已确认”的最大事务编号；在流处理系统中，它表示“事件时间已安全推进到”的时间戳。\n属性与指标 High-Water Mark 相关的关注点通常包括：\n推进速度 高水位线推进越快，说明系统吞吐越高。\n落后程度（Lag） 当前处理位置与 High-Water Mark 的差距，用于衡量系统延迟。\n一致性保障 High-Water Mark 往往代表所有副本/参与者的一致确认点。\n容错能力 一旦系统崩溃，可以从 High-Water Mark 处进行恢复。\n可见性延迟 数据写入与被标记为 High-Water Mark 之间存在一定延迟，尤其在强一致系统中。\n类型 按角色分类 写入型 High-Water Mark 如日志系统中用于表示写入进度安全落盘位置。\n读取型 High-Water Mark 用于消费者读取进度控制，确保不越过系统可读边界。\n时间型 High-Water Mark 特别常见于流处理系统，用于表示事件时间处理进度。\n常见场景分类 Kafka Partition High-Water Mark 每个分区维护一个 HWM，只有当所有副本都写入该 offset，才会推进。\n数据库 WAL 系统 High-Water Mark 表示日志可以 checkpoint 的最大位置。\n流处理（如 Flink）中的 Watermark 表示事件时间可处理安全窗口的上界（可视为时间维度上的 HWM）。\n分布式事务协调器 High-Water Mark 表示可以提交或清理的最大事务 ID。\nHigh-Water Mark 与程序关系 根据使用者的不同：\n系统内部组件使用 如日志复制模块，内部用于同步控制。\n应用层感知或读取 比如消费者或监控程序查询某分区 High-Water Mark 以计算 lag。\n常见系统中的 HWM 实现 系统/工具 High-Water Mark 表示 用途 Kafka Offset 控制消费者消费边界 MySQL binlog file position 实现主从同步 Flink Watermark 时间戳 事件时间窗口推进 Elasticsearch translog seq number 实现副本同步安全性 Zookeeper zxid 标识写入顺序与一致点 总结 High-Water Mark 是分布式系统中衡量“已安全推进位置”的核心指标。它不仅保障了系统在崩溃后能够恢复、在副本间能够同步，也能帮助开发者了解延迟和吞吐。\n掌握 High-Water Mark 的语义与作用，是理解日志系统、流处理、数据库复制等核心机制的关键一步。\n","permalink":"https://myself659.github.io/post/distributed/high-water-mark-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代分布式系统、流处理引擎和日志系统中，数据的\u003cstrong\u003e顺序性\u003c/strong\u003e与\u003cstrong\u003e进度控制\u003c/strong\u003e至关重要。如何知道一个节点、消费者、或者整个系统**“处理到哪了”**？这就是 \u003cstrong\u003eHigh-Water Mark（高水位线）\u003c/strong\u003e 的核心意义。\u003c/p\u003e","title":"High-Water Mark 101"},{"content":" 前言 CAP 定理揭示了分布式系统在「一致性（Consistency）」「可用性（Availability）」与「分区容忍性（Partition Tolerance）」之间的取舍。然而，现实系统中不仅要考虑网络分区，还要在正常情况下权衡延迟与一致性。为此，PACELC 定理应运而生，作为对 CAP 的自然扩展。\n定义 PACELC 定理由 Daniel Abadi 提出，其原始论文定义如下：\nIf there is a Partition (P), then a system must choose between Availability (A) and Consistency (C); Else (E), when the system is running normally (no partition), it must choose between Latency (L) and Consistency (C).\n简而言之：\nPACELC = 如果发生分区（P），则系统要在可用性（A）和一致性（C）之间取舍；否则（E），在没有分区时，要在延迟（L）和一致性（C）之间取舍。\n工作原理 一句话总结： PACELC = CAP + 正常情况下的延迟与一致性权衡。\n举个例子：\n在分区时：必须选 A or C（即 CAP） 在正常时：必须选 L or C（即低延迟或强一致） 例如：\nDynamoDB：PA/EL（分区选 A，正常选低延迟） Spanner：PC/EC（始终优先保证一致性） 属性与指标 PACELC 带来的核心指标有：\n延迟（Latency）\n多副本同步所需的网络 RTT 数 强一致性（Strong Consistency）\n是否保证读写最新数据（linearizability） 最终一致性（Eventual Consistency）\n是否接受短时间的数据不一致 吞吐量（Throughput）\n系统在不同策略下的稳定写入/读取能力 可用性（Availability）\n是否能在任意节点故障后仍提供服务 类型 按照 PACELC 的两个维度（分区时、正常时）进行分类：\n类型 分区时选择 正常时选择 示例系统 PA/EL 可用性 低延迟 DynamoDB, Cassandra PC/EC 一致性 一致性 Google Spanner, Zookeeper PA/EC 可用性 一致性 MongoDB (可配置) PC/EL 一致性 低延迟 较少见，需定制优化 PACELC 与程序关系 PACELC 指导开发者在设计系统时要：\n显式处理正常与异常状态的行为差异； 选择合适的复制机制（同步 vs 异步）； 针对业务读写特点，定制 consistency level（如 quorum 机制）； 考虑 eventual consistency 带来的冲突合并策略（conflict resolution）。 常见系统对照 系统/数据库 PACELC 类型 特性说明 Cassandra PA/EL 高可用、低延迟，最终一致 DynamoDB PA/EL 高可用、低延迟，强/弱一致可选 MongoDB 可配型 PA/EC 默认行为，可调写入策略 Spanner PC/EC 强一致，基于全球时钟同步 Zookeeper PC/EC 强一致，适合协调类任务 总结 CAP 定理聚焦于网络分区情况下的权衡，而 PACELC 更进一步，将**正常情况（Else）**下的权衡纳入视野，是更完整的系统设计理论。\nPACELC 告诉我们：在构建分布式系统时，即使没有分区，延迟与一致性之间的权衡依然存在。\n理解 PACELC，有助于我们根据业务需求定制系统架构，做出明确、理性的技术选择。\n","permalink":"https://myself659.github.io/post/distributed/pacelc-theorem-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003eCAP 定理揭示了分布式系统在「一致性（Consistency）」「可用性（Availability）」与「分区容忍性（Partition Tolerance）」之间的取舍。然而，现实系统中不仅要考虑网络分区，还要在正常情况下权衡延迟与一致性。为此，PACELC 定理应运而生，作为对 CAP 的自然扩展。\u003c/p\u003e","title":"PACELC Theorem 101"},{"content":" 前言 在分布式系统中，当主节点因故障被替换（Failover）后，如果原主节点恢复正常，系统是否、何时、以及如何让它重新承担主角色？这便是 Failback（故障恢复切回） 的核心问题。\nFailover 解决的是“谁来接管”；Failback 关注的是“如何恢复原本秩序”。\n定义 Wiki（简化意译）定义如下：\nFailback is the process of restoring operations from a failover system back to the original primary system once it is restored and deemed stable.\n一句话：Failback 是故障恢复后，让原主节点重新接手服务的过程。\n工作原理 一句话：系统在主节点故障后触发 Failover，待其恢复稳定后，通过 Failback 将其重新设为主节点。\n一个典型的 Failback 流程：\n主节点 A 故障 → 备用节点 B 触发 Failover 成为主； 原主节点 A 恢复 → 系统评估其状态； 若配置允许，自动或手动将主权从 B 切回 A； B 转为备用节点，继续同步。 Failback 通常依赖以下机制：\n健康检查机制（如 Heartbeat） 数据同步机制（如 Catch-up） 状态转移控制（是否自动） Fencing 机制（防止旧主未隔离就恢复） 属性与指标 Failback 涉及的关键属性有：\n是否启用（Enable/Disable） 是否允许自动 Failback，部分系统默认关闭以避免震荡。\n切回策略（Policy） 自动或手动、是否设置优先级主（prefer-master）、何时触发。\n稳定性判断标准 系统如何判断原主节点已完全恢复，通常包括连续健康心跳、数据追平等。\n数据一致性保障 原主需同步到最新数据，避免数据回滚或丢失。\n抖动控制 防止频繁在主从之间来回切换，可设置冷却时间或抑制周期。\n类型 按触发方式分类 自动 Failback 节点恢复后系统自动完成主权切回，适用于 prefer-master 场景（如 Redis Sentinel）。\n手动 Failback 节点恢复后需人工介入确认、执行恢复切回，适用于强一致性、高安全性场景（如数据库系统）。\n按执行方式分类 在线切换 主从平滑转换，业务不中断，常用于有状态系统。\n重启切换 节点重启触发状态变更，存在一定的服务波动风险。\nFailback 与程序关系 Failback 的实际应用广泛：\n数据库主备恢复 比如 PostgreSQL、MySQL MGR、MongoDB 在主库恢复后是否重新切主。\n缓存系统 Redis Sentinel 会尝试将 prefered master 恢复为主节点。\n服务发现系统 etcd、Consul 等在集群恢复后可能重建 leader，进行 Failback。\n负载均衡层 反向代理是否将流量切回原主实例，需结合健康检查策略。\n设计时应注意：\n原主恢复是否完整，包括配置、数据、网络状态； Failback 是否会引发服务中断或瞬间拥堵； 是否存在 Split-Brain 风险，应结合 fencing； 是否需要通过日志、审计记录追踪 Failback 行为。 常见支持 Failback 的系统 系统/组件 是否支持自动 Failback 控制策略 Redis Sentinel 支持 prefer-master + down-after-milliseconds MongoDB 支持 自动选主，根据优先级 MySQL MGR 支持 依赖 Group Communication Pacemaker + Corosync 支持 自定义资源策略与健康检查 Kubernetes 支持 Pod 恢复调度 ","permalink":"https://myself659.github.io/post/distributed/failback-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在分布式系统中，当主节点因故障被替换（Failover）后，如果原主节点恢复正常，系统是否、何时、以及如何让它重新承担主角色？这便是 \u003cstrong\u003eFailback（故障恢复切回）\u003c/strong\u003e 的核心问题。\u003c/p\u003e","title":"Failback 101"},{"content":" 前言 在现代分布式系统中，高可用（High Availability） 是基本要求。而高可用的核心能力之一就是：当系统组件出现故障时，是否能自动切换到备份节点或副本继续提供服务。这个自动切换过程，正是“Failover”。\n无论是数据库、存储、消息队列，还是服务网关，Failover 机制都被广泛应用。\n定义 Wiki 定义如下：\nIn computing, failover is the capability to switch over automatically to a redundant or standby system, server, hardware component or network upon the failure or abnormal termination of the previously active application, server, or system component.\n一句话：Failover 是故障时自动切换到备份节点继续服务的机制。\n工作原理 一句话：系统监测主节点是否存活，若异常则自动切换到可用备份节点继续提供服务。\n一个典型的 Failover 流程：\n通过 Heartbeat 或监控机制检测主节点状态； 发现主节点失联或故障； 启动选举流程，选出新的主节点（如果有）； 更新路由、DNS 或元数据，让流量切换到新的节点； 旧主恢复后可转为备用节点。 属性与指标 关注 Failover 机制的几个关键属性：\n故障检测时间（Detection Time） 从主节点出问题到被检测出来所花的时间。\n切换时间（Failover Time） 从检测到故障，到新节点接管服务的总时间。\n数据一致性（Consistency Level） 尤其是状态数据同步是否完成，是否会丢数据或乱序。\n切换策略（Failover Strategy） 是主动触发（手动）、还是自动；是热备、冷备还是半热备。\n是否幂等（Idempotency） 系统能否容忍重复 Failover 请求，避免“抖动”或震荡。\nFencing 机制 避免旧主恢复后与新主竞争，导致脑裂（Split-Brain）问题。\n类型 按触发方式分类 手动 Failover 人工介入后切换，如通过运维命令行控制，适用于重要系统。\n自动 Failover 系统自主判断并切换，无需人工干预，常用于业务高可用场景。\n按备份方式分类 热备（Hot Standby） 备用节点实时同步，随时准备接管，切换迅速。\n冷备（Cold Standby） 备用节点不运行，出故障后再启动，延迟较高。\n半热备（Warm Standby） 节点运行但不处理业务，请求发生后才加载数据并接管。\n按系统组件分类 数据库 Failover MySQL、PostgreSQL、MongoDB 都支持主备切换。\n存储系统 Failover 如 Ceph、HDFS 在 DataNode 或 OSD 故障后自动切换。\n服务层 Failover Kubernetes、Istio 等支持服务实例异常时自动重调度。\n网络/负载均衡 Failover 如 Nginx、HAProxy 的 upstream 健康检查机制。\nFailover 与程序关系 Failover 在分布式架构中起到兜底和容灾作用：\n服务发现与流量切换 当节点切换后，客户端或负载均衡器需及时更新地址。\n数据一致性与恢复 对于强一致性系统，需要在 failover 前完成数据同步或确认。\n状态恢复 Stateful 服务需要在新主节点恢复原有 session 或数据上下文。\n选主协议配合 常与 Raft、Paxos、Zookeeper 协作实现 leader 选举与 fencing。\n开发中应考虑：\n系统是否能正确感知故障； 切换流程是否清晰、可重复、自动化； 是否支持观察和控制 failover（如运维介入）； 是否有 fallback 与回滚机制。 常见支持 Failover 的系统与组件 系统/组件 Failover 支持方式 特点 Redis Sentinel 主从架构自动切换 简单、部署容易 MySQL MGR 多主复制，支持自动选主 强一致性，适合金融场景 MongoDB ReplicaSet 自动选举主节点 写操作自动切换主库 etcd Raft 协议内置自动 failover 用于配置中心、高可用 Kubernetes Pod 和 Node 层级调度容灾 结合 probe 探测 Consul 服务失联后剔除并重新发现 健康检查集成 ","permalink":"https://myself659.github.io/post/distributed/failover-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代分布式系统中，\u003cstrong\u003e高可用（High Availability）\u003c/strong\u003e 是基本要求。而高可用的核心能力之一就是：\u003cstrong\u003e当系统组件出现故障时，是否能自动切换到备份节点或副本继续提供服务\u003c/strong\u003e。这个自动切换过程，正是“Failover”。\u003c/p\u003e","title":"Failover 101"},{"content":" 前言 在分布式系统中，我们常用 Lease（租约） 控制某个节点对资源的独占访问。然而，当网络分区或节点故障后，“过期”节点仍可能持有旧的访问权限并发起非法写入，这就引入了一个严重问题：脑裂（Split Brain）写入。\n为防止这种情况发生，Fencing（防越权机制） 被设计出来，作为 lease 的“护城河”，保障系统一致性与安全性。\n定义 wiki 上未直接定义 fencing，但在分布式系统设计中，fencing 常被定义为：\nFencing is a mechanism to prevent outdated or unauthorized nodes from accessing a resource after their lease has expired or ownership has changed.\n一句话：Fencing 是一种防止“过期节点”继续访问资源的保护机制。\n工作原理 一句话：每次 lease 分配时生成一个递增的版本号，只有持有最新 fencing token 的节点才能访问资源。\n典型流程如下：\n每次 lease 分配/续约时，协调者生成一个唯一递增的 fencing token； 节点在访问资源时必须携带该 token； 资源服务端（如存储系统）在处理请求前检查 token 是否为最新； 如果 token 过期或无效，拒绝处理，防止旧节点写入。 此机制不依赖时钟同步，天然抗网络分区，是解决“旧节点写穿”问题的关键。\n属性与指标 关注的 fencing 属性与指标如下：\nFencing Token 单调递增性 保证每次 token 都比上一次大，避免重用。\nToken 分发机制 通常由中心协调者（如 etcd/Zookeeper）统一生成和分发。\n资源端校验能力 后端必须支持对 token 的解析与校验逻辑。\n防止 ABA 问题 防止“旧 lease -\u0026gt; 新 lease -\u0026gt; 旧 lease”导致错误重入。\n无依赖于时钟精度 fencing token 本质为逻辑版本号，不依赖机器时钟。\n类型 根据 token 类型分 数值型 token（如递增整数） 最常见方式，每次 lease 分配时递增。例如 etcd 使用 revision。\n时间戳型 token 使用分配时刻作为 token，但需注意时钟漂移问题。\nUUID型（唯一标识符） 虽不能比较新旧，但可用于检测不同实例。\n根据校验策略分 客户端校验型 客户端先读出当前 token，再判断是否自己仍持有有效权限。\n服务端校验型（推荐） 服务端保存最新 token，拒绝处理老 token 的请求。\nfencing 与程序关系 程序中使用 fencing 的方式通常如下：\n分布式锁服务结合 fencing 比如基于 Zookeeper ephemeral node + fencing token 控制写入权。\n存储系统防止旧主写入 比如 HDFS 的 NameNode 使用 fencing 来保护数据块元数据写入。\n任务调度系统防止重复执行 调度器判断执行者是否仍持有有效 lease token，防止旧任务重复执行。\n编程实践要点：\n资源服务端必须内建 fencing token 校验逻辑； 在 lease 获取时记录 token，所有访问必须带 token； 注意 token 回收与过期处理，防止内存泄漏。 常用 fencing 场景/产品 etcd + fencing token etcd 事务 revision 号可作为 fencing token，天然递增。\nZookeeper + 顺序节点 通过顺序 ephemeral node 实现 fencing，最小序号即为持有者。\nHDFS + fencing script Secondary NameNode 激活前执行 fencing 脚本（如强制 unmount）。\nKubernetes Lease API + fencing controller-manager 使用 fencing 确保只有最新 leader 可操作资源。\nGoogle Chubby Lock Service 分配 lock ID 作为 fencing token，用于保证唯一写者。\n","permalink":"https://myself659.github.io/post/distributed/fencing-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在分布式系统中，我们常用 \u003cstrong\u003eLease（租约）\u003c/strong\u003e 控制某个节点对资源的独占访问。然而，当网络分区或节点故障后，“过期”节点仍可能持有旧的访问权限并发起非法写入，这就引入了一个严重问题：\u003cstrong\u003e脑裂（Split Brain）写入\u003c/strong\u003e。\u003c/p\u003e","title":"Fencing 101"},{"content":" 前言 在大规模分布式系统中，节点之间需要高效、可靠地传播状态信息，如节点上线、宕机、负载等。而中心化广播机制很难应对规模扩展、容错要求等问题。Gossip 协议（又称“八卦协议”）作为一种去中心化、鲁棒性强的通信机制，被广泛应用于分布式数据库、服务注册中心、容错系统等场景。\n定义 wiki定义如下：\nA gossip protocol is a procedure or process of computer peer-to-peer communication that is based on the way social gossip spreads, where nodes periodically exchange information with a subset of other nodes.\n简而言之：每个节点周期性随机选取其他节点交换状态信息，通过“传口信”的方式实现全局信息传播。\n工作原理 一句话：每个节点定期“和少数邻居聊聊天”，久而久之，消息自然“全网皆知”。\n详细步骤如下：\n每个节点维护自己的状态视图； 周期性地（如每秒）选择1～n个其他节点，交换状态信息； 接收到状态信息后，合并新消息更新本地状态； 重复上述过程，最终所有节点趋于一致。 这种类似“八卦传播”的方式即为 Gossip。\n属性与指标 关注的 Gossip 协议属性与指标如下：\n传播延迟 消息从起始节点传遍全网平均所需时间，理论上为 O(log N)。\n冗余度 / 网络开销 多个节点可能传递重复消息；典型 Gossip 容忍这种冗余。\n传播可靠性 节点故障或消息丢失时，Gossip 能自动弥补。\n一致性收敛速度 所有节点获得同一状态信息所需时间。\n容错性与可扩展性 无单点瓶颈，可横向扩展到成百上千节点。\n抗网络分区 能在局部连通下继续传播，待恢复后再次融合信息。\n类型 Gossip 协议的常见变种包括：\n基本 Gossip（Push/Pull） Push：节点主动将状态推送给他人； Pull：节点主动从他人拉取状态； Push-Pull：结合前两种方式，提升效率。 Anti-Entropy Gossip 定期同步整个状态（如哈希比对），常用于检测差异并修复。 Rumor Mongering 节点传播信息有“传播几轮就停止”的策略，避免无限冗余。 Epidemic-style Gossip 完全类比病毒传播：传播概率、传播窗口等均可调整。 Gossip 与程序关系 Gossip 协议常作为系统的基础服务或底层通信机制：\n服务发现 / 健康检测 如 Consul、Serf、Akka Cluster 等，Gossip 用于发现并传播节点上线/离线信息。\n分布式数据库 Cassandra、DynamoDB 使用 Gossip 协议同步副本状态、拓扑结构等元信息。\n故障探测与协调 通常与 Φ Accrual Failure Detector 配合使用：检测出的宕机信息通过 Gossip 广播。\n配置变更传播 配置更新后通过 Gossip 广而告之，确保配置一致性。\n常用系统中的 Gossip 实现 系统/框架 Gossip 应用场景 Cassandra 节点拓扑、状态、变更等传播 Consul 服务注册、健康检测状态同步 Akka Cluster 节点信息共享、分片管理 Etcd v2 (部分) 节点状态交换 HashiCorp Serf 专门的 Gossip 网络库 总结 Gossip 协议以其 去中心化、高容错、低耦合、强扩展 的特性，成为现代分布式系统中不可或缺的基础通信协议。虽然它不能提供强一致性，但在状态传播、节点协调等场景中，表现出色，是“简单但有效”的典范。\n","permalink":"https://myself659.github.io/post/distributed/gossip-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在大规模分布式系统中，节点之间需要高效、可靠地传播状态信息，如节点上线、宕机、负载等。而中心化广播机制很难应对规模扩展、容错要求等问题。\u003cstrong\u003eGossip 协议\u003c/strong\u003e（又称“八卦协议”）作为一种去中心化、鲁棒性强的通信机制，被广泛应用于分布式数据库、服务注册中心、容错系统等场景。\u003c/p\u003e","title":"Gossip 101"},{"content":" 前言 在现代分布式系统中，故障检测 是系统高可用的基础能力。系统需要实时感知某个节点是否还“存活”，以便及时做出容错或主备切换。这一机制中，Heartbeat（心跳） 是最核心的技术手段。\n无论是集群成员管理、主从选举、服务注册发现，还是负载均衡，heartbeat 都是系统健康监控的“生命信号”。\n定义 Wiki 对 Heartbeat 的定义如下：\nA heartbeat is a periodic signal generated by hardware or software to indicate normal operation or to synchronize other parts of a system.\n一句话：Heartbeat 就是系统之间周期性发送的“我还活着”的信号。\n工作原理 一句话：各个节点定期发送 heartbeat（心跳包），接收方通过超时时间判断该节点是否存活。\n一个典型的 Heartbeat 流程：\n每个节点周期性（如每 1~5 秒）发送 heartbeat； 接收方记录上次收到 heartbeat 的时间； 如果超过超时时间（如 10 秒）仍未收到新的 heartbeat，即认为该节点“已失联”； 上报给集群管理模块，触发 failover 或重试机制。 Heartbeat 的核心目标：检测节点的生死状态。\n属性与指标 Heartbeat 系统的关键属性包括：\n发送周期（interval） 心跳发送的时间间隔，太频繁会加重网络负担，太慢会降低检测精度。\n超时时间（timeout） 接收方等待多长时间未收到心跳才判断对方故障。\n抖动（jitter）机制 防止大量节点在同一时间发送心跳造成瞬时冲击。\n失效策略 超时后是立即摘除节点、降级服务，还是等待人工干预。\nfalse positive rate 心跳丢包不一定等于节点故障，需避免误判。\n可扩展性 大规模系统中是否支持万级节点心跳采集。\n类型 按方向分 主动上报型（Push） 每个节点主动向中心发出 heartbeat，如 etcd、Zookeeper。\n轮询检测型（Pull） 管理节点周期性 ping 所有节点，如 Consul、Nagios。\n按角色分 客户端心跳（client-to-server） 客户端定期 ping 服务端，保证连接不中断。\n服务端心跳（server-to-client） 服务端定期 ping 客户端，用于连接保活。\n节点互相心跳（peer-to-peer） 节点间直接互相监测，如 gossip 协议。\nHeartbeat 与程序关系 Heartbeat 机制常见于以下场景中：\n主从节点监控 主节点失联后，触发主备切换，如 Redis Sentinel、MongoDB。\n服务注册中心 节点失联后自动从服务发现中剔除，如 Eureka、Consul。\n分布式协调系统 Raft、Zookeeper、Paxos 等协议均依赖心跳维持领导权。\n容器编排调度系统 Kubernetes node 使用 kubelet 向 apiserver 上报状态。\n连接保活 TCP 长连接中常用 heartbeat 探测断链，如 WebSocket ping/pong。\n开发时需要注意：\n心跳发送需异步、低延迟、不可阻塞主逻辑； 推荐加入 jitter 抖动； 配合 retry 和 fencing 机制，避免误判引发 Split Brain； 对频繁 false positive 的系统要适度容忍丢包。 常用 Heartbeat 框架或实现 系统/协议 Heartbeat 用途 检测方式 Zookeeper 节点存活、主选举 Server pull + ping etcd 保持 session、选主 Client push Redis Sentinel 主从切换 ping master/slave Kubernetes 节点存活检测 kubelet → apiserver Consul 服务健康检查 health check + TTL WebSocket 保持长连接 ping/pong packet MySQL Group Replication 节点连接状态 metadata heartbeat ","permalink":"https://myself659.github.io/post/distributed/heartbeat-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代分布式系统中，\u003cstrong\u003e故障检测\u003c/strong\u003e 是系统高可用的基础能力。系统需要实时感知某个节点是否还“存活”，以便及时做出容错或主备切换。这一机制中，\u003cstrong\u003eHeartbeat（心跳）\u003c/strong\u003e 是最核心的技术手段。\u003c/p\u003e","title":"Heartbeat 101"},{"content":" 前言 在分布式系统中，多个节点同时访问或修改同一资源时，如何保证一致性和避免冲突是一个核心问题。传统的锁机制在高延迟和故障环境下难以保证可靠性，因此出现了一种更适合分布式环境的机制 —— Lease（租约）。\nLease 机制通过“时间约束的授权”方式，在分布式场景中广泛应用，如 Master 选举、缓存一致性控制、元数据服务等。\n定义 wiki 定义如下：\nA lease is a time-based contract granting temporary exclusive access or permission to a resource.\n一句话：Lease 是一种带过期时间的分布式锁，用于控制对资源的独占访问。\n工作原理 一句话：通过分配一个带有有效期的访问权（lease）给某个节点，确保在 lease 期间该节点对资源的独占访问。\n典型流程如下：\n节点向协调者申请资源的 lease； 协调者颁发 lease，记录颁发时间与 lease 期限； lease 到期前，节点可以续约（renew）或释放（release）； lease 到期后，其他节点可以竞争获取。 此机制确保即使出现网络分区或节点失败，系统也能基于时间超时恢复资源控制权。\n属性与指标 关注的 lease 属性与指标包括：\nLease Duration（租约时间） 控制访问权的有效期，过短会频繁续约，过长可能影响恢复。\nClock Drift Tolerance（时钟漂移容忍） 时钟一致性对 lease 协议至关重要，需防止偏差造成误判。\nRenewal Policy（续约策略） 主动续约机制，确保 lease 不会意外中断。\nFailure Recovery Time（故障恢复时间） 节点故障后，其他节点多久可感知并夺回 lease。\nFencing Token（防越权令牌） 防止过期 lease 持有者在网络恢复后继续写入。\n类型 基于 lease 的协议类型 时间戳 lease（timestamp-based） 依赖节点时钟，简单高效，但要求时钟同步精度高。\n逻辑 lease（logical lease） 使用递增计数作为 lease version，结合 fencing token 使用。\n租约+版本号组合 每次 lease 更新生成唯一版本号，用于防止写穿。\n应用场景类型 分布式主节点选举（Leader Election） 通过 lease 控制某个节点在一段时间内拥有主控权。如 etcd。\n缓存一致性控制（Cache Invalidation） 客户端持有资源缓存时，使用 lease 控制缓存有效期。\n分布式锁服务 比如基于 Zookeeper/etcd 实现的临时节点锁机制。\n分布式文件系统元数据管理 如 GFS 中的 Master 使用 lease 控制 chunkserver 权限。\nlease 与程序关系 Lease 与程序的集成方式主要有两种：\nClient Embedded Lease 管理 客户端负责 lease 获取、续约与回收逻辑，适合逻辑简单场景。\nExternal Lease Manager 外部系统如 etcd/Zookeeper 提供集中 lease 管理能力，客户端调用接口申请/续约。\n程序设计要点：\n使用 fencing token 防止“旧主节点”继续访问资源； 避免因 lease 未及时续约造成服务中断； 针对时钟不一致场景应使用对称轮询或 NTP 校准。 常用 lease 产品/机制 etcd lease 支持 TTL、自动续约、watch、过期通知等能力。\nZookeeper ephemeral nodes 基于会话存在实现的隐式 lease，节点断连即释放。\nGoogle GFS master lease 用于控制 chunkserver 对数据块的访问权限。\nConsul Session lease 支持 lock、session TTL、健康检查等 lease 特性。\nApache Helix Lease Management 用于任务协调与资源抢占。\n","permalink":"https://myself659.github.io/post/distributed/lease-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在分布式系统中，多个节点同时访问或修改同一资源时，如何保证\u003cstrong\u003e一致性\u003c/strong\u003e和\u003cstrong\u003e避免冲突\u003c/strong\u003e是一个核心问题。传统的锁机制在高延迟和故障环境下难以保证可靠性，因此出现了一种更适合分布式环境的机制 —— \u003cstrong\u003eLease（租约）\u003c/strong\u003e。\u003c/p\u003e","title":"Lease 101"},{"content":" 前言 在现代分布式系统中，节点失效检测是系统容错能力的基石。简单的“超时判断”往往无法应对真实网络环境中的延迟波动、抖动等问题，于是更加智能化的失效检测算法应运而生。其中，Phi Accrual Failure Detector（Φ 累积失败探测器） 是被广泛应用的一种算法，如 Cassandra、Akka、Etcd 等系统都基于它构建健康检查机制。\n定义 Wiki 并无专门定义，论文定义如下（由 Hayashibara et al. 于 2004 年提出）：\n\u0026ldquo;The Phi Accrual Failure Detector outputs a suspicion level (φ) instead of a binary signal, based on the statistical distribution of inter-arrival times of heartbeat messages.\u0026rdquo;\n简化一句话：Φ 探测器不是简单判定节点“是否失败”，而是给出一个概率化的失败“可疑度”。\n工作原理 一句话：通过统计心跳到达的历史分布，计算当前时刻某节点“看起来失败”的概率级别（Φ 值），再与设定阈值比较判断是否失败。\n工作流程如下：\n每个节点周期性发送心跳（heartbeat）；\n接收方记录每次心跳的到达时间，并计算“心跳间隔时间分布”；\n某时刻若心跳未如预期到达，计算 Φ 值：\nΦ(t) = –log₁₀(P)，其中 P 是当前时刻“心跳还没到达”的概率； 若 Φ 超过阈值（如 8），即认为对方“可能失败”。\nΦ 值越大，说明“当前没有收到心跳”这件事越不寻常，从而“失败”可能性越大。\n属性与指标 Φ 探测器关注的关键属性包括：\n心跳频率 心跳发送周期越短，检测粒度越细，但开销越高。\n历史窗口长度 用于统计心跳到达间隔的样本窗口，影响准确性与敏感度。\nΦ 阈值（一般为 8） Φ 超过该值即认定为失败，阈值设置影响容错性与误判率。\n误判率 vs 检测延迟 Φ 越敏感，故障越快被检测，但误判率也更高；反之亦然。\n抗网络抖动能力 由于基于统计分布建模，相较固定超时机制对抖动更鲁棒。\n类型 Φ 探测器属于 Accrual Failure Detector（累积型失败探测器）的一种，特点如下：\n类型 输出值 示例算法 Binary UP / DOWN Fixed timeout Accrual 数值（如 φ） Phi Accrual, Adaptive 相比传统的 fixed-timeout 机制，Φ 探测器提供的是“失败可能性评估”，而非二元判断。\nΦ 探测器与程序关系 Φ 探测器常用于以下系统模块中：\n分布式数据库（如 Cassandra） 用于判定节点是否可参与副本写入或查询。\n服务发现与注册中心（如 Eureka、Consul） 健康检查机制可基于 Φ 来减少误判。\n集群调度器/仲裁系统（如 Akka、Etcd） 节点 Leader 判断、投票权赋予均依赖可靠的存活判断。\nGossip 协议节点状态传播 Gossip 协议中常配合 Φ 检测得出节点状态，再广播传播。\n常见实现与使用系统 系统/框架 使用情况 Cassandra Gossip + Φ 失效探测 Akka Cluster 节点健康状态评估 Etcd 领导者故障判断 Amazon Dynamo 概念雏形由其论文提出 Hazelcast 用于成员生命周期管理 总结 Phi Accrual Failure Detector 提供了一种概率化、动态自适应的失效判断方式，在真实网络环境中相较传统超时机制更具韧性和实用性。通过输出“可疑程度”而非简单状态，为复杂分布式系统提供了更精细化的容错机制。\n","permalink":"https://myself659.github.io/post/distributed/phi-accrual-failure-detector-algorithm-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代分布式系统中，节点失效检测是系统容错能力的基石。简单的“超时判断”往往无法应对真实网络环境中的延迟波动、抖动等问题，于是更加智能化的失效检测算法应运而生。其中，\u003cstrong\u003ePhi Accrual Failure Detector（Φ 累积失败探测器）\u003c/strong\u003e 是被广泛应用的一种算法，如 Cassandra、Akka、Etcd 等系统都基于它构建健康检查机制。\u003c/p\u003e","title":"Phi Accrual Failure Detector algorithm 101"},{"content":" 前言 在现代互联网系统中，分布式系统 被广泛应用来提高可用性、扩展性与容错性。但网络的不稳定、节点的故障或管理上的分歧，常常会引发一个危险的问题：Split Brain（脑裂）。\nSplit Brain 是分布式系统设计中的“梦魇之一”，它会导致多个节点误认为自己是“主节点”，从而产生数据冲突、重复写入、状态紊乱等严重问题。\n定义 在分布式系统中常定义如下：\nSplit Brain is a condition in a distributed system where two or more parts of the system believe they are the authoritative or primary node, often due to a network partition.\n一句话：Split Brain 就是多个节点在网络隔离后都认为“自己才是老大”。\n工作原理 一句话：当集群发生网络分区或节点故障时，两个或多个子集误以为对方失联并各自“称王”，导致写入冲突。\n举个例子：在一个主从架构中，网络分区发生后，原主节点 A 和备份节点 B 无法通信。如果没有正确的协调机制，A 和 B 都可能继续对外提供写服务，最终出现“双主写入”的问题。\nSplit Brain 典型诱因：\n网络分区（Network Partition） 心跳机制不可靠或延迟高 没有正确实施 quorum、lease 或 fencing 主节点挂了但没有选举新主，旧主“诈尸”后重启写入 属性与指标 常见关注的属性与指标如下：\n网络连通性 Split Brain 的本质是网络隔离，底层通信健康度是根因。\n主节点唯一性 保证同一时刻全系统只有一个主节点（Leader）。\n数据一致性 Split Brain 期间产生的冲突写入会破坏一致性。\n可用性 vs 安全性权衡 为避免脑裂，系统可能牺牲部分可用性（如拒绝写）。\n分区检测机制 是否有检测网络分区并触发 failover 的机制。\n恢复策略与冲突解决机制 分区合并后，如何解决“冲突数据”。\n类型 按场景分类 主从系统中的 Split Brain 常见于 Redis Sentinel、Elasticsearch、PostgreSQL 主备等系统。\n多主系统中的 Split Brain 如 Cassandra、MongoDB 在分区期间若 quorum 没控制好，会造成一致性问题。\n高可用集群控制平面中的脑裂 如 Kubernetes 多个 controller-manager 都认为自己是 leader。\n按触发原因分类 网络分区导致 服务端检测延迟或心跳丢失 手动干预或脚本误操作 租约失效未被正确 Fencing Split Brain 与程序关系 Split Brain 一般发生在“高可用组件”中，因此与以下模块高度相关：\nLeader Election 模块\n多节点竞选主节点，需使用如 Paxos、Raft、Zookeeper 等算法。 若没有 quorum 机制，可能产生多个主节点。 Lease \u0026amp; Fencing 机制\n未正确使用 fencing token 防止旧主误写入。 分布式锁系统\n多个服务获取到“同一把锁”，产生资源争夺。 分布式缓存/数据库\n多个副本并发写入，数据版本不一致。 程序设计中，务必实现如下策略：\n引入 quorum 机制，拒绝无 quorum 的写入； 使用 fencing token，阻止过期节点写入； 实现 leader lease 或 election，保障主节点唯一性； 定期健康检查与 failover 策略，及时隔离或恢复节点。 常见系统中 Split Brain 的表现及应对 系统 Split Brain 表现 防护措施 Redis Sentinel 两个 master 同时存在 哨兵投票选主，建议加 fencing Zookeeper quorum 不足也能写入 配置正确 quorum，避免过小集群 Elasticsearch 多个主节点，集群状态不一致 使用 minimum_master_nodes，升级为 Zen 2 协议 PostgreSQL + repmgr 主备切换不一致，数据冲突 使用 fencing + VIP failover Cassandra 网络分区后副本产生不一致写入 配置正确 consistency level（如 QUORUM） 常用工具/协议防止 Split Brain Zookeeper / etcd 提供一致性选主和 fencing 机制。\nRaft / Paxos 算法 实现强一致选主，确保主节点唯一性。\nFencing Token 租约控制+递增 token，避免旧主“诈尸写入”。\nQuorum 机制 无法达到法定多数的副本自动降为只读。\nCorosync + Pacemaker Linux 下常用高可用工具，内建脑裂检测机制。\n","permalink":"https://myself659.github.io/post/distributed/split-brain-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代互联网系统中，\u003cstrong\u003e分布式系统\u003c/strong\u003e 被广泛应用来提高可用性、扩展性与容错性。但网络的不稳定、节点的故障或管理上的分歧，常常会引发一个危险的问题：\u003cstrong\u003eSplit Brain（脑裂）\u003c/strong\u003e。\u003c/p\u003e","title":"Split Brain 101"},{"content":" 前言 在分布式系统中，一致性共识协议是保证多个节点达成同一状态的核心技术。虽然 Paxos 提供了理论基础，但它实现复杂、理解困难。为此，Raft 协议应运而生，目标是更易理解、实现且具备等价安全性。\n如今，许多主流系统如 etcd、Consul、TiKV 都基于 Raft 构建，是工程实践中最受欢迎的共识协议之一。\n定义 wiki 定义如下：\nRaft is a consensus algorithm designed as an alternative to Paxos, with the goal of being more understandable.\n一句话：Raft 是一种用于构建高一致性分布式系统的共识协议，以简单易懂著称。\n工作原理 一句话：通过选举 Leader 并由其统一处理客户端请求，实现复制日志并达成一致状态。\nRaft 分为三个主要阶段：\nLeader 选举 节点间通过心跳检测故障并发起投票选出一个 Leader。\n日志复制（Log Replication） 所有写入请求由 Leader 接收并复制到 Follower，半数以上确认后提交。\n安全提交（Commit） Leader 确认多数节点写入后，提交并通知 Follower 应用状态变更。\n角色分类：\nLeader：唯一处理客户端请求。 Follower：被动响应 Leader 或 Candidate。 Candidate：在选举时发起投票的节点。 属性与指标 Raft 关注以下属性与性能指标：\n线性一致性（Linearizability） 所有客户端看见的数据变化顺序一致。\n容错性（Fault Tolerance） 能容忍少数节点宕机（2f+1 中允许 f 节点失败）。\n可恢复性 节点崩溃后重启可恢复状态，日志持久化保障一致性。\n选举安全性 同一任期只能有一个 Leader。\n高可用性 Leader 故障后快速重新选举保持服务不中断。\n日志压缩 通过快照和日志截断减少存储压力。\n类型 日志复制机制 AppendEntries：Leader 向 Follower 发送日志条目。 Leader Commit Rule：Leader 只有在某日志条目被大多数节点存储时，才可提交该条目。 Log Matching：相同任期和索引的日志应保证内容一致。 选举机制 随机超时触发选举 投票请求（RequestVote） Leader 心跳（Heartbeat）保持统治 日志压缩方式 快照（Snapshot） InstallSnapshot RPC 日志截断 应用场景与程序关系 场景 是否适用 Raft 说明 分布式协调服务 ✅ 适合高一致性系统，如分布式锁 主从切换与容灾 ✅ 自动 Leader 选举 分布式 KV 存储 ✅ 一致性写入，事务支持 异步副本系统 ❌ 不适合 eventual consistency 场景 大规模区块链 ❌ 不适合开放网络的共识需求 编程关系：\n推荐使用已有实现：如 etcd（Go 实现）、Consul（Go）、Hashicorp Raft。 适用于小规模强一致集群：如配置中心、数据库集群等。 写入延迟受限于同步复制：网络 RTT 会直接影响写性能。 常用基于 Raft 的系统 etcd：Kubernetes 的核心组件，保存集群状态。 Consul：服务发现与配置管理平台。 TiKV：分布式事务型 KV 数据库，TiDB 存储引擎。 Rqlite：基于 SQLite 的分布式数据库。 CockroachDB（部分借鉴）：NewSQL 数据库，参考 Raft 设计。 参考 Raft 论文原文：In Search of an Understandable Consensus Algorithm ","permalink":"https://myself659.github.io/post/distributed/raft-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在分布式系统中，\u003cstrong\u003e一致性共识协议\u003c/strong\u003e是保证多个节点达成同一状态的核心技术。虽然 Paxos 提供了理论基础，但它实现复杂、理解困难。为此，Raft 协议应运而生，目标是\u003cstrong\u003e更易理解、实现且具备等价安全性\u003c/strong\u003e。\u003c/p\u003e","title":"Raft 101"},{"content":" 前言 在现代分布式系统中，多个节点如何就某个“真相”达成一致，是构建可靠系统的核心问题之一。无论是分布式数据库、共识引擎，还是一致性协调服务，**一致性协议（Consensus Protocol）**都是底层基石。Paxos 正是其中最经典、最具理论价值的协议之一。\n定义 wiki 定义如下：\nPaxos is a family of protocols for solving consensus in a network of unreliable or fallible processors.\n一句话：Paxos 是一种在分布式系统中实现多个节点就某个值达成一致的共识算法。\n工作原理 一句话：通过多个阶段的投票与提议，使一组节点就某个提案达成共识，即便其中一部分节点失败也能保障正确性。\nPaxos 通常由三个角色组成：\nProposer（提议者）：发起提案。 Acceptor（接受者）：负责投票，决定提案是否被接受。 Learner（学习者）：了解哪个提案被通过（已达成共识）。 基本 Paxos 流程包括两个阶段：\nPrepare 阶段：Proposer 向 Acceptors 发出准备请求（编号 N），Acceptors 承诺不接受编号小于 N 的提案。 Accept 阶段：如果 Proposer 收到大多数 Acceptors 的响应，它就发出“接受”请求，包含编号 N 和提案值 V，Acceptors 再次响应是否接受。 当一个提案被多数 Acceptors 接受，则认为“达成共识”。\n属性与指标 Paxos 关注以下关键属性：\n安全性（Safety） 永远不会有两个不同的值被同时决定。\n活性（Liveness） 只要大多数节点存活且网络可靠，最终一定可以达成共识。\n故障容忍性 可以容忍 少数派节点故障，一般要求超过半数节点正常。\n最小消息轮次 理论上最少两轮（Prepare 和 Accept），但实践中常需更多轮重试。\n吞吐量与延迟 原始 Paxos 性能较差，主要受限于同步流程和多数派写入。\nLeader 角色（在优化版本中） 通过引入 Leader 可以避免多 Proposer 竞争造成的冲突。\n类型 Paxos 协议家族 Basic Paxos 原始论文提出的版本，理论为主，不易实现。\nMulti-Paxos 实用版本，引入长期 Leader，提高性能，支持多个提案序列。\nFast Paxos 减少消息轮数，但需要更多副本。\nCheap Paxos 使用一个可靠磁盘代替一个投票节点，降低资源成本。\nDisk Paxos / Byzantine Paxos 面向特殊场景如非信任环境或持久存储的版本。\nPaxos Made Simple / Paxos Made Live 简化版及 Google 实现版本（用于 Chubby 锁服务）。\n应用与场景 场景 是否适用 Paxos 说明 分布式协调服务（如锁） ✅ 需要强一致性 主从选举 ✅ 多节点选 Leader 高可用数据库写入 ✅ 保证写入唯一顺序 最终一致系统（如 Dynamo） ❌ 容错性优先，不强一致 区块链共识（如 PoW） ❌ 使用更适合开放网络的算法 Paxos 与程序关系 编程实现复杂 尽管逻辑看似清晰，实现细节多，处理边界条件困难。\n推荐使用成熟框架 如 etcd（Raft 实现）、ZooKeeper（Zab 实现）等已经封装共识过程。\n学习成本高 Paxos 理论晦涩，但是理解其他共识协议的基础。\n对系统延迟敏感 多数派写入和消息往返轮次使 Paxos 对网络质量有较高要求。\n常见使用 Paxos 的系统 Google Chubby：分布式锁服务，用于 GFS 和 Bigtable。 Spinnaker：LinkedIn 构建的 Paxos-based 数据库。 Shepard（AWS）：EC2 实例状态一致性维护系统。 RAMP Transactions：使用 Paxos 保证分布式事务原子性。 OpenReplica：通用 Paxos 实现框架。 拓展阅读 如果你对 Paxos 感兴趣，以下内容可以进一步学习：\nRaft 101（比 Paxos 更易于实现） Viewstamped Replication Zab Protocol（ZooKeeper） Byzantine Fault Tolerant Paxos（如 PBFT） ","permalink":"https://myself659.github.io/post/distributed/paxos-101/","summary":"\u003chr\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代分布式系统中，多个节点如何就某个“真相”达成一致，是构建可靠系统的核心问题之一。无论是分布式数据库、共识引擎，还是一致性协调服务，**一致性协议（Consensus Protocol）**都是底层基石。\u003cstrong\u003ePaxos\u003c/strong\u003e 正是其中最经典、最具理论价值的协议之一。\u003c/p\u003e","title":"Paxos 101"},{"content":"前言 私钥在区块链系统中代表是什么？私钥是钱。钱包的本质就是私钥。谁控制了私钥谁就控制对应钱包的数字资产，谁丢失了私钥也就相当于丢了对应钱包的数字资产。\n因此，在区块链系统中如何保护私钥一直都是重要的问题。\n保护私钥一直都要解决以下问题：\n用户体验 私钥备份与存储 私钥安全（攻击、泄漏、盗取） 私钥助记词化 私钥数学本质是一串数字：\n用户体验极差，那么一长串数字怎么记，每次使用都是一个大麻烦。 所有就有只要玩过数字货币的人都清楚的助记词。这一部分改进如同汇编对二进指定的优化。\n私钥加密 对于私钥内容进行加密，最典型例子就是key-store。\n共用私钥 这里面的技术主要是BIP-44。在数字货币钱包里面得到应用， 避免每一个数字货币地址都要维护一个私钥。如果数字货币满足BIP-44规范， 就可以通过一个私钥来控制多个钱包。\n私钥隔离 用冷钱包来实现与网络隔离，避免私钥被盗取或泄漏。\n私钥分片 私钥分片主要采用Shamir\u0026rsquo;s Secret Sharing技术。其技术原理如同藏宝图分成好几分份,这是多少电影与电视剧中出现的情节。\n原理：\n一个数学公式：yy = ax*x + b * x + c\n其中，c为私钥，当然中实际过程可以认为是保密的数据。 a，b这两个参数作为具体分片规则的描述。\n由上面公式可知，该公式对应一个双曲线。如果知道这个双曲线三个点的坐标，通过解方程组得出a，b，c的值。\n该技术有以下优点：\n该方案允许私钥拥有制定分片的规则。可以对同一个私钥采用不同的分片规则。拥有分片规则制定权，可以对分片对象加以管理，如添加分片，删除分片。 在没有不知道分片规则之下，通过任何一个分片都不能破解获取私钥。只有对应数量的分片在一起才能获取私钥和分片的规则。 具体应用如下：\n私钥等敏感数据分割保护 多方验证 数据分享 参考 Shamir\u0026rsquo;s Secret Sharing Divide and Manage Secret Data Securely With Shamir\u0026rsquo;s Secret Sharing zeropass Threshold Signatures: The Future of Private Keys A beginner’s guide to Shamir’s Secret Sharing 私鑰分割 — Shamir’s Secret Sharing How to Share a Secret: Shamir’s Secret Sharing ","permalink":"https://myself659.github.io/post/secret-sharing/","summary":"\u003ch1 id=\"前言\"\u003e前言\u003c/h1\u003e\n\u003cp\u003e私钥在区块链系统中代表是什么？私钥是钱。钱包的本质就是私钥。谁控制了私钥谁就控制对应钱包的数字资产，谁丢失了私钥也就相当于丢了对应钱包的数字资产。\u003c/p\u003e","title":"说说私钥保护技术"},{"content":"前面，简单介绍了数字货币交易所的安全体系，这一篇主要说说一下资产安全的一些要点。\n如果将一条公链比作一个银行的话，当然这个银行是去中心化银行，那个各个交易所的节点就相当于银行的网点。这个节点有以下功能：\n帐本数据同步 用户资产托管 充币与提币 资产安全主要分为以下几个方面展开说明，具体如下：\n意识 意识，意识，意识！其实意识就是一种天赋，只是我们没有注意到吧。\n有些区块链的项目居然不知道私钥是何物。很多人会说这是不是搞技术不知道而已。 其实这是安全意识不到位。\n意识教育与培养一定要先行。\n帐本数据同步 帐本数据主要是节点数据同步，具体关注点如下：\n节点连接节点的确认 避免站错队 分叉 重放攻击防护 孤块 网络分化 帐本同步节点故障，多节点备份 资产托管 资产托管的核心就是私钥，要点如下：\n采用冷钱包管理私钥 热钱包管理策略（存活周期，资金金额控制，密钥管理） 私钥存储管理（多人多份多地） 多地址分散（不要把鸡蛋放在一个篮子里） 充币与提币 充币与提币都是有关托管资产的交易。\n合理的交易确认数 充币提币的用户验证 交易的不确定性处理办法如交易得不到确认 分叉时关闭充提币功能 监控 资金动向监控也是不可或缺的，要点如下：\n对首次提币地址及用户监控 保证监控的高可靠性 充币与提币数据分析 大额充提币的监控及确认 差异化 对于不同类型的资产需要具体问题具体分析。 如以太坊专门对基于智能合约的数字资产进行审计与防范，具体参考ERC20，这里不展开。\n后记 对于资产安全，有什么新的想法与意见，欢迎交流！\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/exchage-safe-asset/","summary":"\u003cp\u003e前面，简单介绍了数字货币交易所的安全体系，这一篇主要说说一下资产安全的一些要点。\u003c/p\u003e\n\u003cp\u003e如果将一条公链比作一个银行的话，当然这个银行是去中心化银行，那个各个交易所的节点就相当于银行的网点。这个节点有以下功能：\u003c/p\u003e","title":"数字货币交易所安全体系-资产篇"},{"content":"4月份写一份关于数字货币钱包的分析，欢迎交流与指正。\n数字货币钱包产品定位与战略\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/blockchain/blockchain-digitwallet-strategy/","summary":"\u003cp\u003e4月份写一份关于数字货币钱包的分析，欢迎交流与指正。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/myself659/myself659.github.io/blob/master/slides/%E6%95%B0%E5%AD%97%E8%B4%A7%E5%B8%81%E9%92%B1%E5%8C%85%E4%BA%A7%E5%93%81%E5%AE%9A%E4%BD%8D%E4%B8%8E%E6%88%98%E7%95%A5.pdf\"\u003e数字货币钱包产品定位与战略\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"欢迎关注\"\u003e欢迎关注\u003c/h1\u003e\n\u003cp\u003e欢迎关注微信公众帐号：沉风网事(savewind)\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"沉风网事\" loading=\"lazy\" src=\"/images/cfws.jpg\"\u003e\u003c/p\u003e","title":"数字货币钱包产品定位与战略"},{"content":"安装Prometheus RBAC设置,获取创建集群角色权限 1 2 3 4 ACCOUNT=$(gcloud info --format=\u0026#39;value(config.account)\u0026#39;) kubectl create clusterrolebinding owner-cluster-admin-binding \\ --clusterrole cluster-admin \\ --user $ACCOUNT 注意：如果集群部署在google cloud上需要先执行这一步。\n创建Namespace 1 kubectl create namespace monitoring 创建角色 脚本内容如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRole metadata: name: prometheus rules: - apiGroups: [\u0026#34;\u0026#34;] resources: - nodes - nodes/proxy - services - endpoints - pods verbs: [\u0026#34;get\u0026#34;, \u0026#34;list\u0026#34;, \u0026#34;watch\u0026#34;] - apiGroups: - extensions resources: - ingresses verbs: [\u0026#34;get\u0026#34;, \u0026#34;list\u0026#34;, \u0026#34;watch\u0026#34;] - nonResourceURLs: [\u0026#34;/metrics\u0026#34;] verbs: [\u0026#34;get\u0026#34;] --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: prometheus roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus subjects: - kind: ServiceAccount name: default namespace: monitoring 执行创建角色脚本：\n1 kubectl create -f 01-clusterRole.yaml 配置 脚本内容如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 apiVersion: v1 kind: ConfigMap metadata: name: prometheus-server-conf labels: name: prometheus-server-conf namespace: monitoring data: prometheus.rules: |- groups: - name: devopscube demo alert rules: - alert: High Pod Meory expr: sum(container_memory_usage_bytes) \u0026gt; 1 for: 1m labels: severity: slack annotations: summary: High Memory Usage prometheus.yml: |- global: scrape_interval: 5s evaluation_interval: 5s rule_files: - /etc/prometheus/prometheus.rules alerting: alertmanagers: - scheme: http static_configs: - targets: - \u0026#34;alertmanager.monitoring.svc:9093\u0026#34; scrape_configs: - job_name: \u0026#39;kubernetes-apiservers\u0026#39; kubernetes_sd_configs: - role: endpoints scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: default;kubernetes;https - job_name: \u0026#39;kubernetes-nodes\u0026#39; scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: node relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics - job_name: \u0026#39;kubernetes-pods\u0026#39; kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] action: keep regex: true - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] action: replace target_label: __metrics_path__ regex: (.+) - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] action: replace regex: ([^:]+)(?::\\d+)?;(\\d+) replacement: $1:$2 target_label: __address__ - action: labelmap regex: __meta_kubernetes_pod_label_(.+) - source_labels: [__meta_kubernetes_namespace] action: replace target_label: kubernetes_namespace - source_labels: [__meta_kubernetes_pod_name] action: replace target_label: kubernetes_pod_name - job_name: \u0026#39;kubernetes-cadvisor\u0026#39; scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: node relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor - job_name: \u0026#39;kubernetes-service-endpoints\u0026#39; kubernetes_sd_configs: - role: endpoints relabel_configs: - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] action: keep regex: true - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] action: replace target_label: __scheme__ regex: (https?) - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] action: replace target_label: __metrics_path__ regex: (.+) - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] action: replace target_label: __address__ regex: ([^:]+)(?::\\d+)?;(\\d+) replacement: $1:$2 - action: labelmap regex: __meta_kubernetes_service_label_(.+) - source_labels: [__meta_kubernetes_namespace] action: replace target_label: kubernetes_namespace - source_labels: [__meta_kubernetes_service_name] action: replace target_label: kubernetes_name 执行配置脚本：\n1 kubectl create -f 02-config-map.yaml -n monitoring 部署 脚本内容如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: prometheus-deployment namespace: monitoring spec: replicas: 1 template: metadata: labels: app: prometheus-server spec: containers: - name: prometheus image: prom/prometheus:v2.1.0 args: - \u0026#34;--config.file=/etc/prometheus/prometheus.yml\u0026#34; - \u0026#34;--storage.tsdb.path=/prometheus/\u0026#34; ports: - containerPort: 9090 volumeMounts: - name: prometheus-config-volume mountPath: /etc/prometheus/ - name: prometheus-storage-volume mountPath: /prometheus/ volumes: - name: prometheus-config-volume configMap: defaultMode: 420 name: prometheus-server-conf - name: prometheus-storage-volume emptyDir: {} --- kind: Service apiVersion: v1 metadata: name: prometheus-server-loadbalancer-service spec: selector: app: prometheus-server ports: - protocol: TCP port: 90 targetPort: 9090 type: LoadBalancer 执行部署脚本：\n1 kubectl create -f 03-prometheus-deployment.yaml --namespace=monitoring 查看部署 1 kubectl get deployments --namespace=monitoring 应用 web访问 可视化 可视化使用Grafana。效果如下：\n参考 Kubernetes Cluster (Prometheus) RBAC技术白皮书 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/k8s/k8s-monitor/","summary":"\u003ch1 id=\"安装prometheus\"\u003e安装Prometheus\u003c/h1\u003e\n\u003ch2 id=\"rbac设置获取创建集群角色权限\"\u003eRBAC设置,获取创建集群角色权限\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eACCOUNT=$(gcloud info --format=\u0026#39;value(config.account)\u0026#39;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl create clusterrolebinding owner-cluster-admin-binding \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --clusterrole cluster-admin \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --user $ACCOUNT\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e注意：如果集群部署在google cloud上需要先执行这一步。\u003c/p\u003e\n\u003ch2 id=\"创建namespace\"\u003e创建Namespace\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekubectl create namespace monitoring\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"创建角色\"\u003e创建角色\u003c/h2\u003e\n\u003cp\u003e脚本内容如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapiVersion: rbac.authorization.k8s.io/v1beta1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekind: ClusterRole\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emetadata:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  name: prometheus\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erules:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- apiGroups: [\u0026#34;\u0026#34;]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  resources:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - nodes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - nodes/proxy\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - services\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - endpoints\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - pods\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  verbs: [\u0026#34;get\u0026#34;, \u0026#34;list\u0026#34;, \u0026#34;watch\u0026#34;]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- apiGroups:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - extensions\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  resources:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - ingresses\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  verbs: [\u0026#34;get\u0026#34;, \u0026#34;list\u0026#34;, \u0026#34;watch\u0026#34;]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- nonResourceURLs: [\u0026#34;/metrics\u0026#34;]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  verbs: [\u0026#34;get\u0026#34;]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapiVersion: rbac.authorization.k8s.io/v1beta1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ekind: ClusterRoleBinding\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emetadata:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  name: prometheus\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eroleRef:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  apiGroup: rbac.authorization.k8s.io\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  kind: ClusterRole\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  name: prometheus\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esubjects:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- kind: ServiceAccount\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  name: default\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  namespace: monitoring\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e执行创建角色脚本：\u003c/p\u003e","title":"安装与应用Prometheus监控Kubernetes集群"},{"content":"要求 基本技术栈要求如下：\nGolang Docker GitLab Kubernetes 具体原因参考关于技术选型的思考\n步骤 创建Kubernetes集群 自己搭建集群也可以，但是投入生产不建议使用。这里直接使用google cloud(调研几家发现G家这方面技术积累最深，生态完整)。\n创建帐号设置gitlab操作帐号，用于后面的CI/CD操作。\n1 kubectl apply -f gitlab-admin-service-account.yaml 1 kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep gitlab-admin | awk \u0026#39;{print $1}\u0026#39;) 具体参考Adding and creating a new GKE cluster via GitLab\n创建DockerHub帐号 主要操作是在DockerHub创建帐号。 其他的云计算服务的镜像服务也可以。\n创建gitlab项目 正常创建代码仓库操作。\n准备代码 准备一个简单的web服务器。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package main import ( \u0026#34;fmt\u0026#34; \u0026#34;net/http\u0026#34; ) func main() { http.HandleFunc(\u0026#34;/\u0026#34;, func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, \u0026#34;Hello, k8s-go!\u0026#34;) }) http.HandleFunc(\u0026#34;/healthz\u0026#34;, func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, \u0026#34;Health OK!\u0026#34;) }) http.ListenAndServe(\u0026#34;:8090\u0026#34;, nil) } DockerFile 1 2 3 4 5 6 7 8 9 10 11 12 13 FROM golang:1.11-alpine as builder WORKDIR /usr/build ADD main.go . RUN go build -o k8s-app . FROM alpine:latest WORKDIR /usr/src COPY --from=builder /usr/build/k8s-app . EXPOSE 8090 CMD [\u0026#34;/usr/src/k8s-app\u0026#34;] 配置docker环境变量 设置对应用户名与密码即可。\n配置Kubernetes集群环境变量 主要配置下图三个变量（用于连接Kubernetes集群）：\nCERTIFICATE_AUTHORITY_DATA 1 cat ~/.kube/config | grep certificate-authority-data | tr -d \u0026#39;\\n\u0026#39; | grep certificate-authority-data | awk \u0026#39;{print $2}\u0026#39; USER_TOKEN 1 kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep gitlab-admin | awk \u0026#39;{print $1}\u0026#39;) SERVER 1 kubectl cluster-info | grep master 从输出结果中获取master对应url即可。\n设置deployment 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 apiVersion: apps/v1 kind: Deployment metadata: name: k8s-go labels: app: go spec: replicas: 3 selector: matchLabels: app: go strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 33% template: metadata: labels: app: go spec: containers: - name: go image: \u0026lt;yourdockerhubname\u0026gt;/\u0026lt;yourimagename\u0026gt;:\u0026lt;VERSION\u0026gt; ports: - containerPort: 8090 livenessProbe: httpGet: path: /healthz port: 8090 initialDelaySeconds: 2 periodSeconds: 2 readinessProbe: httpGet: path: /healthz port: 8090 initialDelaySeconds: 2 periodSeconds: 2 --- kind: Service apiVersion: v1 metadata: name: k8s-go-loadbalancer-service spec: selector: app: go ports: - protocol: TCP port: 80 targetPort: 8090 type: LoadBalancer 设置CI/CD gitlab.yml内容如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 image: docker:latest services: - docker:dind stages: - build - deploy variables: CONTAINER_IMAGE: \u0026lt;yourdockerhubname\u0026gt;/\u0026lt;yourimagename\u0026gt;:${CI_COMMIT_SHORT_SHA} build: stage: build script: - docker login -u ${DOCKER_USER} -p ${DOCKER_PASSWORD} - docker build -t ${CONTAINER_IMAGE} . - docker tag ${CONTAINER_IMAGE} ${CONTAINER_IMAGE} - docker tag ${CONTAINER_IMAGE} \u0026lt;yourdockerhubname\u0026gt;/\u0026lt;yourimagename\u0026gt;:latest - docker push ${CONTAINER_IMAGE} deploy: stage: deploy image: dtzar/helm-kubectl script: - kubectl config set-cluster k8s --server=\u0026#34;${SERVER}\u0026#34; - kubectl config set clusters.k8s.certificate-authority-data ${CERTIFICATE_AUTHORITY_DATA} - kubectl config set-credentials gitlab --token=\u0026#34;${USER_TOKEN}\u0026#34; - kubectl config set-context default --cluster=k8s --user=gitlab - kubectl config use-context default - sed -i \u0026#34;s/\u0026lt;VERSION\u0026gt;/${CI_COMMIT_SHORT_SHA}/g\u0026#34; deployment.yaml - kubectl apply -f deployment.yaml 测试CI/CD 部署迁移 如何将部署迁移到其他的集群，在配置好新的集群后，只需要重新配置相关Kubernetes环境变量即可。\n参考 更快部署代码：CI/CD 与 Kubernetes GitLab + Kubernetes: Using GitLab CI\u0026rsquo;s Kubernetes Cluster feature (end)\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/k8s/k8s-cicd/","summary":"\u003ch1 id=\"要求\"\u003e要求\u003c/h1\u003e\n\u003cp\u003e基本技术栈要求如下：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eGolang\u003c/li\u003e\n\u003cli\u003eDocker\u003c/li\u003e\n\u003cli\u003eGitLab\u003c/li\u003e\n\u003cli\u003eKubernetes\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e具体原因参考\u003ca href=\"https://blog.ipds.top/2018/09/05/%E5%85%B3%E4%BA%8E%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B%E7%9A%84%E6%80%9D%E8%80%83\"\u003e关于技术选型的思考\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"步骤\"\u003e步骤\u003c/h1\u003e\n\u003ch2 id=\"创建kubernetes集群\"\u003e创建Kubernetes集群\u003c/h2\u003e\n\u003cp\u003e自己搭建集群也可以，但是投入生产不建议使用。这里直接使用google cloud(调研几家发现G家这方面技术积累最深，生态完整)。\u003c/p\u003e","title":"基于Gitlab+Kubernetes实现CI/CD"},{"content":"说明 这里的交易所是指中心化交易所。下面按标题三个关键词展开说明。\n交易所 交易所作为数字资产交易的平台。一直不断地就有安全问题出现，最著名的是Mt. Gox事件，影响恶劣。后续事故也不少，不多说了。交易所安全事故这只黑天鹅未来一定会再出现。\n安全防护 安全的重要性毋庸置疑。\n安全防护是全方位，多角度，多层次，全链路，持续不断的一种工程。\n安全防护的结果是安全性。其主要取决于攻守双方。只有知道工作原理才能掌握如何防护。 安全防护从一开始就要考虑及落地而不是临时抱佛脚。\n体系 针对交易所安全体系，分为以下几个方面：\n资产安全 平台安全 网络安全 用户安全 数据安全 交易安全 运营安全 安全策略 对于这8个方面，先挖坑，后面再填，有空的话一一展开说明。\n参考 Exchange Security Report 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/exchage-safe-arch/","summary":"\u003ch1 id=\"说明\"\u003e说明\u003c/h1\u003e\n\u003cp\u003e这里的交易所是指中心化交易所。下面按标题三个关键词展开说明。\u003c/p\u003e\n\u003ch1 id=\"交易所\"\u003e交易所\u003c/h1\u003e\n\u003cp\u003e交易所作为数字资产交易的平台。一直不断地就有安全问题出现，最著名的是Mt. Gox事件，影响恶劣。后续事故也不少，不多说了。交易所安全事故这只黑天鹅未来一定会再出现。\u003c/p\u003e","title":"数字货币交易所安全防护体系介绍"},{"content":"人们向往成功 人人都渴望成功，追求事业上的成就和个人价值的实现。\n大部分人愿意学习别人的成功经验，同时也乐于接受别人对自己成功的解释。然而，这些看似简单的成功原因对于成功者本人可能确实有用，但对于其他人来说，未必具备同样的实用性。\n别人成功的背后 成功者很可能无法确切地指出自己成功的原因。\n通往成功的道路是一个错综复杂的过程，很难找到明确的原因。每个人的成功背后可能都是由多种因素相互作用、共同影响的结果。\n你所看到别人的成功是精心选择的 你所看到的成功往往经过精心挑选呈现给大众。这些成功案例无处不在，不是张三，就是李四，也可能是王五。然而，沉默的大多数并未被关注。\n此外，还有一种年薪百万的方式：教别人如何获得年薪百万。\n你与别人不一样 世间没有两片完全相同的树叶。\n每个人都有自己的优势与劣势，而且各不相同。我们需要认识到，别人的成功之道未必适合自己。\n复制别人的成功难度更大 《我的成功可以复制》一书的作者唐骏自己都不复制自己的原来成功。\n在淘宝崛起之后，没有第二个淘宝，只有拼多多。这说明，复制别人的成功并非易事，尤其是在竞争激烈的市场环境下。\n没有谁可以简单地成功 爱迪生曾经说过：“成功是百分之一的灵感加百分之九十九的汗水。”这句名言揭示了成功并非轻而易举，而是需要付出巨大的努力和坚持。\n自己及所处的环境更重要 科学全面地认识自己以及自己所处的环境至关重要。\n要想取得成功，我们要“知己知彼，百战不殆”。不需要一味追求短暂的成功，只要确保自己长时间不败，成功终会到来。\n总之，要想取得成功，我们需要深入了解自己的优缺点，审时度势，找到适合自己的道路。尽管借鉴他人的成功经验可以启发思维，但盲目模仿难以取得成功。保持自信，树立长远目标，不断努力，始终坚持，成功终将属于你。\n","permalink":"https://myself659.github.io/post/life/%E5%88%AB%E4%BA%BA%E7%9A%84%E6%88%90%E5%8A%9F%E4%BD%A0%E5%BE%88%E9%9A%BE%E5%A4%8D%E5%88%B6/","summary":"\u003ch2 id=\"人们向往成功\"\u003e人们向往成功\u003c/h2\u003e\n\u003cp\u003e人人都渴望成功，追求事业上的成就和个人价值的实现。\u003c/p\u003e\n\u003cp\u003e大部分人愿意学习别人的成功经验，同时也乐于接受别人对自己成功的解释。然而，这些看似简单的成功原因对于成功者本人可能确实有用，但对于其他人来说，未必具备同样的实用性。\u003c/p\u003e","title":"别人的成功你很难复制"},{"content":"技术选型内容 技术选型从组成要素的角度分为两大类：\n实现业务的代码 业务依赖的服务 本文围绕代码这一核心进行技术选型，对此分解以下五个问题：\n怎么管理代码？ 用什么语言写代码？ 怎么运行代码？ 在哪里运行代码？ 怎么大规模运维代码？ 技术选型原则 先看一下技术选型应该考虑些什么呢？\n业务的特点与需求 资源和经验 可扩展性 可维护性 安全 成本（投入时间，人力，资源。。。） 简单总结为以下几点：\n稳定优先，善用为上 立足现状，着眼未来 验证先行，应用在后 业务导向，实践驱动 下面就根据这些原则一一回答上面五个问题，但是不会涉及具体的问题如消息队列是选RabbitMQ还是Kafka。\n代码管理 对应上面的怎么管理代码的问题。首先是工具，现在大家都清一色的git。在git没有出来之前有以下这些工具：\nclearcase svn TortoiseCVS 再次就是选择平台。有以下选项\ngithub gitlab gitee gitbucket 自建gitlab 选择自建gitlab。主要考虑如下：\n历史原因 Gitlab自带CI 代码安全考虑 自建gitlab带来的自主控制，有利于后续的发展 编程语言 以Golang为主，其他语言为辅助。\nWhy Golang 个人及其团队主要成员都有Golang经验 Golang在区块链项目中会占主导地位 更多理由见：Golang最工程化的语言 运行环境 运行环境分为以下几种：\n物理主机 虚拟机 Docker 除了一些特殊的场景，现在流行的作法当然是Docker。\nWhy Docker Docker是容器的事实上标准。 使用Docker带来新部署方式：build-\u0026gt;ship-\u0026gt;run，有以下好处：\n可移植性：容器与操作系统分离，基本上保证可以在不同的机器及环境的主机上运行，容器也可以在不同机器上迁移 模块化：利用容器隔离属性可以划分模块，合理拆分服务，同时容器化的一致性便于模块的复用 安全性：容器隔离属性增加了应用程序的安全性 弹性伸缩：容器化方便在负载增加扩容，在负载下降时缩容，有利于提高资源利用效率 一致性：容器为应用程序提供了一致性的运行环境。 运行平台 上云现在已经成为大众共识。AWS，azure, google cloud, aliyun及腾讯云都是选项内容。\n大规模运维 容器化带来以上不少好处，但是也带来容器编排的问题。容器编排哪家强？Github找Kubernetes啊。\n对于小企业采用Kubernetes将高可用性完全交给云平台，自身解决正确科学应用Kubernetes问题，当然这个慢慢来，先调研，再实验。大企业需要深入Kubernetes细节与生态，要有修改与定制的能力。\nwhy Kubernetes 首先Kubernetes成为实际上容器编排的标准。其次使用Kubernetes带来分工的变化：应用开发工程师可以专注于构建应用程序，而基础架构工程师可以专注于如何自动构建和部署，从而提高了工程效率，更快地交付了应用程序并简化了基础架构。除此之外Kubernetes提供了工具提高应用程序的高可用性，同时也可以灵活的切换云服务商。\n(end)\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/tech-stack-explain/","summary":"\u003ch1 id=\"技术选型内容\"\u003e技术选型内容\u003c/h1\u003e\n\u003cp\u003e技术选型从组成要素的角度分为两大类：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e实现业务的代码\u003c/li\u003e\n\u003cli\u003e业务依赖的服务\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e本文围绕代码这一核心进行技术选型，对此分解以下五个问题：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e怎么管理代码？\u003c/li\u003e\n\u003cli\u003e用什么语言写代码？\u003c/li\u003e\n\u003cli\u003e怎么运行代码？\u003c/li\u003e\n\u003cli\u003e在哪里运行代码？\u003c/li\u003e\n\u003cli\u003e怎么大规模运维代码？\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"技术选型原则\"\u003e技术选型原则\u003c/h1\u003e\n\u003cp\u003e先看一下技术选型应该考虑些什么呢？\u003c/p\u003e","title":"关于技术选型的思考"},{"content":"背景 搜索是我找信息主要来源。twitter上有很多高质量的内容，那么如何查找这些内容以及如何高效快速准确找到这些内容呢？\n搜索入口 twitter没有像微博那样直接针对个人提供一个搜索框。\ntwitter提供了搜索入口：twitter search。\n一个简单例子如下：\n1 from:paulg since:2019-01-01 sam 享受大师们的分享吧。\n","permalink":"https://myself659.github.io/post/twitter%E6%90%9C%E7%B4%A2%E6%8A%80%E5%B7%A7/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e搜索是我找信息主要来源。twitter上有很多高质量的内容，那么如何查找这些内容以及如何高效快速准确找到这些内容呢？\u003c/p\u003e\n\u003ch2 id=\"搜索入口\"\u003e搜索入口\u003c/h2\u003e\n\u003cp\u003etwitter没有像微博那样直接针对个人提供一个搜索框。\u003c/p\u003e","title":"twitter搜索Tips"},{"content":" 拼多多战略采用农村包围城市，市场上定位准确，填补了三四线农村及中国底层人民的需求。 微信平台是拼多多快速成长的关键，利用微信带来的流量，流量带来用户，用户带来交易，交易带来商家，随着流量，用户，交易，商家越来越多，就成了生态。 宣传口号具有极强的传播效应：拼多多、拼得多、省得多。 产品上增加确定性，首先价格比淘宝还便宜（一般情况下）同时对用户预期进行管理，提高了体验的确定性。 麻烦就是与淘宝一样，会一直受假货的困扰，打假一直是电商平台的难题（因为打假是一个社会问题）。 拼多多胜在效率，对于用户来说是性价比，对于商家来说是批量处理商品，在交易流程上利用微信平台及其天然存在好友关系及其微信群，整个过程商家和用户的成本都下降，在性价比的高吸引下，用户拼单成本低（转发几个微信群或者朋友圈就可以了），商家的流量成本基本为0。 拼多多未来会怎么样？在整个中国大部分人消费降级情况下，拼多多应该还会进一步增长，上市当天上涨40%也是市场对其成长的期待。 拼多多和淘宝比较如何？借助微信拼多多下沉市场更大，借助微信拼多多是社交电商，更具有传播性。 拼多多为什么成长这么快？三年时间就上市，用户数量达到3.4亿。搭上微信这个10亿用户平台，符合大部分中国人还很穷的现状，解决他们的问题。 拼多多怎么赚钱？现在还没有营利，主要收入来源是商家的在线营销服务（广告），未来应该会营利，用户数量巨大，可以从天猫，京东导入更多的商家，扩大收入，相信国运，这些用户未来会真正的消费升级，这又是新的增长机会。 拼多多为用户提供一种低成本满足刚需的选择。 段永平对黄铮的评价：黄峥是特别难得一见的一直关注事物本质的人，有悟性，又聪明，未来有任何成就我都不意外。 后续 我为什么全仓拼多多？ 参考 巨头夹缝中的千亿鲶鱼：社交重塑中国电商格局，拼多多成电商第三极 拼多多急上市：拿下1400亿GMV，累积亏损13亿 巨头三国杀：中国电商盛世再临 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/pdd-thought/","summary":"\u003col\u003e\n\u003cli\u003e拼多多战略采用农村包围城市，市场上定位准确，填补了三四线农村及中国底层人民的需求。\u003c/li\u003e\n\u003cli\u003e微信平台是拼多多快速成长的关键，利用微信带来的流量，流量带来用户，用户带来交易，交易带来商家，随着流量，用户，交易，商家越来越多，就成了生态。\u003c/li\u003e\n\u003cli\u003e宣传口号具有极强的传播效应：拼多多、拼得多、省得多。\u003c/li\u003e\n\u003cli\u003e产品上增加确定性，首先价格比淘宝还便宜（一般情况下）同时对用户预期进行管理，提高了体验的确定性。\u003c/li\u003e\n\u003cli\u003e麻烦就是与淘宝一样，会一直受假货的困扰，打假一直是电商平台的难题（因为打假是一个社会问题）。\u003c/li\u003e\n\u003cli\u003e拼多多胜在效率，对于用户来说是性价比，对于商家来说是批量处理商品，在交易流程上利用微信平台及其天然存在好友关系及其微信群，整个过程商家和用户的成本都下降，在性价比的高吸引下，用户拼单成本低（转发几个微信群或者朋友圈就可以了），商家的流量成本基本为0。\u003c/li\u003e\n\u003cli\u003e拼多多未来会怎么样？在整个中国大部分人消费降级情况下，拼多多应该还会进一步增长，上市当天上涨40%也是市场对其成长的期待。\u003c/li\u003e\n\u003cli\u003e拼多多和淘宝比较如何？借助微信拼多多下沉市场更大，借助微信拼多多是社交电商，更具有传播性。\u003c/li\u003e\n\u003cli\u003e拼多多为什么成长这么快？三年时间就上市，用户数量达到3.4亿。搭上微信这个10亿用户平台，符合大部分中国人还很穷的现状，解决他们的问题。\u003c/li\u003e\n\u003cli\u003e拼多多怎么赚钱？现在还没有营利，主要收入来源是商家的在线营销服务（广告），未来应该会营利，用户数量巨大，可以从天猫，京东导入更多的商家，扩大收入，相信国运，这些用户未来会真正的消费升级，这又是新的增长机会。\u003c/li\u003e\n\u003cli\u003e拼多多为用户提供一种低成本满足刚需的选择。\u003c/li\u003e\n\u003cli\u003e段永平对黄铮的评价：黄峥是特别难得一见的一直关注事物本质的人，有悟性，又聪明，未来有任何成就我都不意外。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"后续\"\u003e后续\u003c/h1\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://mp.weixin.qq.com/s/C1E98xnhRpoqwKamkhjftA\"\u003e我为什么全仓拼多多？\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"参考\"\u003e参考\u003c/h1\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"http://www.chuangyejia.com/article/detail/5708260.html\"\u003e巨头夹缝中的千亿鲶鱼：社交重塑中国电商格局，拼多多成电商第三极\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://m.huxiu.com/article/250352.html\"\u003e拼多多急上市：拿下1400亿GMV，累积亏损13亿\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://mp.weixin.qq.com/s/bbWHjY02BWMLyl-eaHtQ_A\"\u003e巨头三国杀：中国电商盛世再临\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"欢迎关注\"\u003e欢迎关注\u003c/h2\u003e\n\u003cp\u003e欢迎关注微信公众帐号：沉风网事(savewind)\u003c/p\u003e","title":"关于拼多多几点看法"},{"content":"自2008年比特币诞生以来，其代表的区链技术的发展程度令人兴奋，区块链很快就成为日常生活中的流行语。特别是对于游戏行业，区块链能够带来新的游戏互动和体验方式，这种互动和体验方式有如下三个特点：\n玩家成为利益相关者 公正透明 大规模协作 下面对这三个特点分别说明：\n玩家成为利益的创造者与参与者 Play2Live平台是互动功能和货币化工具的独特组合。这项针对视频广播游戏和网络体育内容的服务允许每个参与者赚取收益，包括流媒体服务商和普通观众。\n公正透明 传统的游戏，由后台产生随机数，存在作假等各种暗箱操作。 有这么一款游戏：Piggy Breaker，他们是blockchain hero活动的胜利者，通过基于\u0026quot;可证明的公平\u0026quot;原则以透明的方式产生游戏中的随机性，解决了部分透明度问题。确保游戏的公平性。同时避免出现了平台跑路的潜在问题。另一个最典型的例子是中本聪筛子。\n大规模协作 依赖于P2P网络，可以提供去中心化协作。但是也存在一些问题，如去中心化网络的带来的延迟问题，适合策略性游戏。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/blockchain/blockchain-new-game-time/","summary":"\u003cp\u003e自2008年比特币诞生以来，其代表的区链技术的发展程度令人兴奋，区块链很快就成为日常生活中的流行语。特别是对于游戏行业，区块链能够带来新的游戏互动和体验方式，这种互动和体验方式有如下三个特点：\u003c/p\u003e","title":"区块链开启游戏的新时代"},{"content":"题目 leetcode-53. Maximum Subarray\n类似：\nleetcode-152. Maximum Product Subarray\n要点是记录当前最大值，与最小值。\n计算当前最值有三种可能：\n当前值 前一个最大值与当前值之积 前一个最小值与当前值之积 从这三种取出最小值和最大值。 （从三个可能优化到两个）\nleetcode-325. Maximum Size Subarray Sum Equals k\nleetcode-643. Maximum Average Subarray I\nleetcode-644. Maximum Average Subarray II leetcode-918. Maximum Sum Circular Subarray\n689. Maximum Sum of 3 Non-Overlapping Subarrays\n分析 这是一维数组求最大子数组之和的问题。\n代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class Solution { public: int maxSubArray(vector\u0026lt;int\u0026gt;\u0026amp; nums) { int max_sum = INT_MIN; int max_pre = 0; int max_cur = 0; for (int i = 0; i \u0026lt; nums.size(); i++){ int cur_item = nums[i]; if(max_pre \u0026gt; 0 ){ max_cur = max_pre + cur_item; }else { max_cur = cur_item; } max_sum = max(max_sum, max_cur); max_pre = max_cur; } return max_sum; } }; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 #include \u0026lt;iostream\u0026gt; using namespace std; int max_subarr_sum(int arr[], int n) { // 最大值 int max_sum = INT_MIN; // 前一个位置最大值 int max_pre = 0; // 当前位置最大值 int max_cur = 0; // 遍历 for (int i = 0; i \u0026lt; n; i++) { int cur_item = arr[i]; if (max_pre \u0026gt; 0) { max_cur = max_pre + cur_item; } else { max_cur = cur_item; } max_sum = max(max_sum, max_cur); max_pre = max_cur; } return max_sum; } int main() { int arr[] = { -2, 1, -3, 4, -1, 2, 1, -5, 4 }; int n = sizeof(arr)/sizeof(arr[0]); cout \u0026lt;\u0026lt; \u0026#34;The sum of contiguous sub-array with the largest sum is \u0026#34; \u0026lt;\u0026lt; max_subarr_sum(arr, n); return 0; } 运行测试\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/dsa/dp-max-subarray-sum/","summary":"\u003ch1 id=\"题目\"\u003e题目\u003c/h1\u003e\n\u003cp\u003e\u003ca href=\"https://leetcode.com/problems/maximum-subarray/\"\u003eleetcode-53. Maximum Subarray\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e类似：\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://leetcode.com/problems/maximum-product-subarray/\"\u003eleetcode-152. Maximum Product Subarray\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e要点是记录当前最大值，与最小值。\u003c/p\u003e\n\u003cp\u003e计算当前最值有三种可能：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e当前值\u003c/li\u003e\n\u003cli\u003e前一个最大值与当前值之积\u003c/li\u003e\n\u003cli\u003e前一个最小值与当前值之积\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e从这三种取出最小值和最大值。 （从三个可能优化到两个）\u003c/p\u003e","title":"leetcode-53. Maximum Subarray"},{"content":"说明 本文的语音与视频版本如下：\n经济机器是怎样运行的(语音+文字版) 经济机器是怎样运行的 (时长30分钟) Ray Dalio 关于作者 原文作者瑞·达利欧，为著名畅销书《原则》作者。1975年，在自己的两居室内创办桥水，2015年，桥水管理资金超过1500亿美元，累计盈利450亿美元，远超史上所有对冲基金。\n经济机器是怎样运行的 经济就像一部简单的机器那样运行但很多人不懂得这一点，或是对经济的运行方式持有不同观点，于是导致很多不必要的经济损失。我深感有责任与大家分享我的简单但是实用的经济分析模式，这个模式虽然不符合常规传统经济学但是已经帮助我预测和躲避了全球金融危机，30多年来对我一直很有用。\n我们开始吧！\n经济虽然可能看起来复杂但是其实是以简单和机械的方式运行，经济由几个简单的零部件和无数次重复的简单交易组成，这些交易首先是由人的天性所驱动，因而形成三股主要的经济动力。\n一. 生产率的提高\n二. 短期债务周期\n三. 长期债务周期\n下面我们谈一下这三股动力并介绍如何把它们组合在一起, 得出一个良好的模型，便于我们跟踪经济走势，并理解当前正在发生的事情。\n我们先来说说经济中最简单的部分：交易。\n经济不过是无数交易的总和，而交易是一件非常简单的事情。交易时刻都在发生，你每次买东西都是进行一笔交易。在每次交易中，买方使用货币或信用向卖方交换商品、服务或金融资产。信用在使用时和货币一样因此把花费的货币和信用加在一起，就可以得出支出总额。支出总额是经济的驱动力。如果用支出金额除以销量，就得出价格，就是这么简单，这就是交易。交易是经济机器最基本零件，所有经济周期和动力都是交易造成的。所以，理解了交易，就理解了整个经济。\n一个市场由买卖同一种商品的所有买方和卖方组成。例如，有小麦市场、汽车市场、股票市场和千百万种其他市场，经济就是由所有市场内的全部交易构成。把全部市场的总支出和销量加在一起就得到了了解经济运行所需要的全部信息，就这么简单。个人、企业、银行和政府都在以上述方式从事交易。用货币和信用，交换商品、服务和金融资产。政府是最大的买方和卖方而政府有两个组成部分：即收税和花钱的中央政府和中央银行。央行控制著经济中的货币和信贷数量因此不同于其他买方和卖方，央行通过影响利率和发行更多货币来实行这种控制。我们在下面会看到正因如此，央行在信贷流通当中发挥着重要作用。\n请诸位注意信贷。\n信贷是经济中最重要的组成部分，但也许是人们最不了解的部分，它之所以最重要，是因为它是经济中最大且最为变幻莫测的一部分。贷款人和借款人于在市场中进行交易的买方和卖方没有两样。通常，贷款人希望自己的钱生出更多的钱而借款人则想购买当前无法负担的某种东西，例如房子，汽车，或是进行投资，例如开办企业。借贷可以同时满足贷款人和借款人的需要。借款人保证偿还借款，称为本金，并支付额外的款额，称为利息；利率高时，借贷就会减少，原因是贷款变得昂贵当利率低时，借贷就会增加，原因是贷款变得便宜。如果借款人保证偿还债务，而且贷款人相信这一承诺信贷就产生了。任何两个人都可以通过协定凭空创造出信贷！信贷看似简单，实则复杂，因为信贷还有其他名称：信贷一旦产生，立即成为债务。\n债务是贷款人的资产，是借款人的负债。等到借款人今后偿还了贷款并支付了利息，这些资产和负债将消失交易得以完成。那么为什么信贷如此重要？这是因为，借款人一旦获得信贷，便可以增加自己的支出。不要忘记支出是经济的驱动力。这是因为一个人的支出是另一个人的收入。想想看，你每花一块钱，另一个人挣了一块钱；而你每挣一块钱，必定有别人花了一块钱，所以，你花得越多，别人挣得就越多。如果某人的收入增加，其信用度就会提高，贷款人就更愿意把钱借给他。信用良好的借款人具备两个条件：偿还能力和抵押物。收入债务比率高，借款人就具备偿还能力。如果无法偿还，借款人还可以用有价值、可以出售的资产作为抵押物。这样，贷款人可以放心地把钱借给他们所以，收入增加使得借贷也增加，从而能够增加支出。由于一个人的支出是另一个人的收入，这将导致借贷进一步增加，并不断循环。这一自我驱动的模式导致经济增长，也正是因为如此，才产生了经济周期。\n在一项交易中为了获得某样东西你必须付出另一样东西长期来看，你得到多少取决于你生产多少，我们的知识随时间而逐渐增多，知识的积累会提高我们的生活水平，我们将此称为生产率的提高，一个善于创新和勤奋的人将比那些自满和懒惰的人更快的提高生产率和生活水平，但在短期内不一定体现出来。生产率在长期内最关键，但信贷在短期内最重要。这是因为生产率的提高不会剧烈波动，因此不是经济起伏的一个重要动力，但是债务是这种动力，因为我们能够通过借债让消费超过产出但是在还债时不得不让消费低于产出。债务量的波动有两大周期其中一个周期持续大约5年至8年，另一个持续大约75年至100年。大部分人虽然能感受到波动，但由于离波动太近，每天、每周都身临其境，通常并不认为这是周期。\n我们将在本章考察这三股主要动力并观察它们如何相互作用以及它们在日常经济中的表现。如上所述，经济的上下起伏不是取决于人们多么善于创新或勤奋工作而是主要看信贷的总量。\n我们先想像一个没有信贷的经济运行。在这样的经济运行中，增加支出的唯一办法是增加收入，因此需要提高生产率和工作量。提高生产率是经济增长的唯一途径，由于我的支出是另一个人的收入。当我或者另一个人提高生产率的时候，经济就会增长。我们如果观察各种交易，加以总结就会发现一条类似于生产率增长轨迹的渐进线。但是，由于我们借债，于是产生了周期原因并不是任何法规，而是人的天性和信贷的运作方式。借债不过是提前消费为了购买现在买不起的东西，你的支出必然超过收入。因此你需要借钱，实质上是向未来的自己借钱。你给自己设定了一个未来的时间到那个时候，你的支出必须少于收入，以便偿还债务，这样马上就形成了一个周期。\n通常一旦你借钱，就制造了一个周期，对于个人是这样，对于整个经济运行也是这样。这就是为什么必须理解信贷？因为信贷触发了一系列机械和可以预料的、将在未来发生的事件。这就是信贷不同于货币的地方完成交易需要使用货币。当你在酒吧用现金买一瓶啤酒时，交易立即完成。但是如果你用信用来买一瓶啤酒，比如赊账你相当于承诺今后为这瓶啤酒付钱。你和酒吧一起创造了一笔资产和一笔负债，你们凭空制造出了信贷。只有在你今后清偿了这笔赊账之后上述资产和负债才会消失，债务才会还清，交易才会了结。现实生活中，大部分所谓的钱实际上是信贷。美国国内的信贷总额大约为50万亿美元，而货币总额只有大约3万亿美元。不要忘记，在没有信贷的经济运行中，增加支出的唯一办法是增加生产，但是在有信贷的经济运行中，还可以通过借债来增加支出。\n因此有信贷的经济运行能增加支出，使得收入的增长速度在短期内超过生产率的增长，但在长期内并非如此，但是，请不要误解我的意思。信贷不一定是坏事，只是会导致周期性变化。信贷如果造成超过偿还能力的过度消费，就是不良信贷。但是信贷如果高效率地分配资源和产生收入让你能偿还债务，就是良性信贷。\n例如，如果你借钱买一台大彩电，电视机不会带来任何收入让你偿还债务。但是，你如果借钱买一台拖拉机，用它来收获更多的庄稼，赚更多的钱你就能够偿还债务，提高生活水平。在有信贷的经济运行中，我们可以跟踪各种交易，观察信贷如何带来经济增长。\n我举一个例子：假设你每年挣10万美元，没有任何债务。你有不错的信用，可以借1万美元，例如用信用卡。因此你每年可以花11万美元，即使你的收入只有10万美元。由于你的支出是别人的收入，另一个人因此挣了11万美元这个挣了11万美元的人如果没有任何债务，可以借1.1万美元，他可以消费12.1万美元,即使他的年收入只有11万美元。由于他的支出是另一个人的收入而我们通过跟踪各种交易，可以看到这个过程不断自我强化。但不要忘记，借债形成周期，周期会上升，最终也会下降。下面我们谈谈短期债务周期。\n随着经济活动的增加，出现了扩张这是短期债务周期的第一阶段。支出继续增加，价格开始上涨原因是，导致支出增加的是信贷，而信贷可以即刻凭空产生。如果支出和收入的增长速度超过所出售的商品的生产速度，价格就会上涨。我们把价格的上涨称为通货膨胀。\n央行不希望通货膨胀过高因为这会导致许多问题。央行在看到价格上涨时就会提高利率。随着利率的上升，有能力借钱的人会减少，同时现有债务成本也会上升，就等于你每个月的信用卡还款额会增加。由于人们减少借债，还款额度增长剩下来用于支出的资金将减少，因此支出速度放慢。而由于一个人的支出是另一个人的收入环环相扣，人们的收入将下降，由于支出减少，价格将下跌我们称之为通货紧缩。\n经济活动减少，经济便进入衰退。如果衰退过于严重，而且通货膨胀不再成为问题央行将降低利率，使经济活动重新加速。随着利率降低，偿债成本下降借债和支出增加，出现另一次经济扩张。可见，经济像一部机器一样运行。\n在短期债务周期中，限制支出的唯一因素是贷款人和借款人的贷款和借款意愿。如果信贷易于获得，经济就会扩张；如果信贷不易获得，经济就会衰退。请注意，这个周期主要由央行控制。短期债务周期通常持续5至8年，在几十年里不断重复。但是，请注意在每个周期的低谷和高峰后经济增长和债务都超过前一个周期。\n为什么会这样？这是人促成的。人们具有借更多钱和花更多钱的倾向，而不喜欢偿还债务，这是人的天性。因此，在长期内，债务增加的速度超过收入，从而形成长期债务周期。尽管人们的债务增加，但贷款人会提供更宽松的信贷条件，这是为什么？这是因为，大家都以为形势一片大好！人们仅注意最近出现的情况。最近的情况是什么？收入一直在增加！资产价值不断上升！股票市场欣欣向荣。现在是繁荣时期！用借来的钱购买商品、服务和金融资产很划算！当人们过度借贷消费时，泡沫便产生了，因此，尽管债务一直增加但收入也以相近的速度增加，从而抵消了债务。\n我们把债务与收入比率称为债务负担。只要收入继续上升，债务负担就可以承受。与此同时，资产价值迅猛上升人们大量借钱来购买资产，因为投资促使资产价格日益升高。人们感觉得自己很富有因此，尽管积累了大量债务，收入和资产价值的上升帮助借款人在长期内保持良好的信用度，但是这种情况显然无法永久持续下去也确实没有持续下去。几十年来，债务负担缓慢增加，使偿债成本越来越高。到了一定的时候，偿债成本的增加速度超过收入，迫使人们削减支出。由于一个人的支出是另一个人的收入，收入开始下降，人们的信用因此降低，致使借贷减少。偿债成本继续增加，使得支出进一步减少周期开始逆转这时到达长期债务的顶峰债务负担变得过重。美国、欧洲和世界上很多其他地区在2008年及发生了这一情况日本在1989年和美国在1929年因同样原因发生了这一情况。\n现在经济进入去杠杆化时期。在去杠杆化过程中，人们削减支出，收入下降，信贷消失。资产价格下跌，银行发生挤兑股票市场暴跌，社会紧张加剧。整个过程开始下滑并形成恶性循环随着收入下降和偿债成本增加，借款人倍感拮据。随著信用消失，信贷枯竭，借款人再也无法借到足够的钱来偿还债务。借款人竭力填补这个窟窿，不得不出售资产。在支出下降的同时，出售热潮使市场充斥待售资产这时，股票市场暴跌，不动产市场一蹶不振，银行陷入困境。随着资产价格下跌，借款人能够提供的抵押物的价值下降这进一步降低了借款人的信用。人们觉得自己很穷信贷迅速消失，支出减少、收入减少、财富减少、信贷减少、借债等等随之减少。这是一个恶性循环。\n它看起来与衰退相似，但不同之处是，无法通过降低利率来挽回局面。在衰退中，可以通过降低利率来刺激借贷。但是，在去杠杆化过程中，由于利率已经很低接近0，从而丧失刺激功能，因此降低利率不起作用。美国国内的利率在1930年代的去杠杆化期间下降到0，在2008年也是如此。\n衰退与去杠杆化之间的差别在于，在去杠杆化过程中，借款人的债务负担变得过重，无法通过降低利率来减轻贷款人意识到，债务过于庞大，根本无法足额偿还。借款人失去了偿债能力，其抵押物失去价值，他们觉得受到债务的极大伤害，不想再借入更多债务。贷款人停止放贷，借款人停止借贷。\n整个经济体与个人一样都失去了信用度，那么应该怎样应对去杠杆化？问题在于，债务负担过重，必须减轻。为此可以采用四种办法：\n个人、企业和政府削减支出\n通过债务违约和重组来减少债务\n财富再分配，将财富从富人转给穷人\n最后，央行发行更多货币\n这四种办法被用于现代历史上的每一个去杠杆化过程。通常第一个措施是削减支出。我们刚才看到，个人、企业、银行和政府都勒紧裤带削减支出，从而能够减少债务。\n我们经常把这称为紧缩。当借款人不再借入新的债务，并开始减少旧债务的时候，你会以为债务负担会减轻但情况正好相反，支出减少了，而一个人的支出是另一个人的收入，这就导致收入下降。收入下降速度超过还债的速度，因此债务负担实际上更为沉重。我们已经看到，这种削减支出的做法引起通货紧缩，令人痛苦。企业不得不削减成本，这意味着工作机会减少，失业率上升。这导致下一个步骤，即必须减少债务！\n很多借款人无法偿还贷款，而借款人的债务是贷款人的资产。如果借款人不偿还银行贷款，人们会担心银行无法返还其存款。因此纷纷从银行取出存款银行受到挤兑，而个人、企业和银行出现债务违约。这种严重的经济收缩就是萧条。\n萧条的一个主要特征是，人们发现，他们原来以为属于自己的财富中有很大一部分实际上并不存在。我们再次以酒吧为例，当你用赊账的办法买一瓶啤酒时，是在承诺今后偿还酒吧的赊账，你的承诺成为酒吧的一项资产。但是，如果你不兑现承诺，不偿还酒吧的赊账，实际上是债务违约。那么酒吧的这项资产实际上一钱不值，它实际上是消失了。\n很多贷款人不希望自己的资产消失，同意债务重组。债务重组意味着贷款人得到的还款减少或偿还期延长，或利率低于当初商定的水平。无论如何，合约被破坏，结果是债务减少，贷款人希望多少收回一些贷款，这强过血本无归。\n债务重组让债务消失，但由于它导致收入和资产价值以更快的速度消失债务负担继续日趋，削减债务与减少支出一样，令人痛苦和导致通货紧缩。所有这些都对中央政府产生影响因为收入降低和就业减少意味着政府的税收减少。与此同时，由于失业率上升，中央政府需要增加支出很多失业者储蓄不足，需要政府的财务支助。此外，政府制定刺激计划和增加支出，以弥补经济活动的减少，在去杠杆化过程中，政府的预算赤字飙升，原因是政府的支出超过税收。你在新闻中所听到的预算赤字正是这种情况，政府必须加税或者举债，以填补赤字但是，在收入下降和很多人失业的时候，应该向谁融资呢？富人。\n由于政府需要更多的钱，而且大量财富集中在少数人的手中，政府自然而然地增加对富人的征税，以帮助经济中的财富再分配。把财富从富人那里转给穷人，正在困苦当中的穷人开始怨恨富人，承受经济疲弱、资产贬值和增税压力的富人开始怨恨穷人。如果萧条继续下去，就会爆发社会动荡。不仅国家内部的紧张加剧而且国家之间也会这样，债务国和债权国之间尤其如此。这种局势可以导致政治变革，有时是极端的变革。1930年代，这种局势导致希特勒掌权、欧洲爆发战争和美国的大萧条，要求采取行动来结束萧条的压力越来越大。\n不要忘记，人们心目中的货币实际上大部分是信贷因此，信贷一旦消失，人们的钱会不够花。人们迫切需要钱，而你一定记得，谁可以发行货币：中央银行可以。央行已经把利率降到接近零的水平，现在不得不发行更多货币。\n发行货币与削减支出、减少债务和财富再分配不同会引起通货膨胀和刺激经济。中央银行不可避免地凭空发行更多货币并使用这些货币来购买金融资产和政府债券。这种情况发生在美国大萧条期间，并于2008年再次爆发。当时美国的中央银行，即联邦储备委员会，增加发行了两万多亿美元。世界各地能够这样做的其他央行也增发了很多货币。央行通过用这些货币购买金融资产帮助推升了资产价格，从而提高了人们的信用，但是这仅仅有助于那些拥有金融资产的人。你看央行可以发行货币，但是只能购买金融资产。而另一方面，中央政府可以购买商品和服务，可以向人民送钱但是无法印钞票。因此，为了刺激经济，央行和政府必须合作。央行通过购买政府债券，其实是把钱借给政府，使其能够运行赤字预算，并通过刺激计划和失业救济金来增加购买商品和服务的支出这增加了人们的收入，也增加了政府的债务，但是这个办法将降低经济中的总债务负担，这是一个风险很大的时刻。\n决策者需要平衡考虑降低债务负担的四种办法，必须平衡兼顾通货紧缩的办法和通货膨胀的办法，以便保持稳定。如果取成适当的平衡，就可以带来和谐的去杠杆化。所以说去杠杆化可以是痛苦的，也可以是和谐的怎样才能实现和谐的去杠杆化？\n尽管去杠杆化是艰难的但以尽可能好的办法来处理艰难的局势却是一件好事。这比杠杆化阶段大量举债产生过度失衡现象要好得多。在和谐的去杠杆化过程中，债务收入比率下降，经济实际上是正增长。同时通货膨胀并不是一个问题。这是通过适当的平衡所取得的。为了取得适当的平衡，需要结合削减支出、减少债务、转移财富和发行货币的办法以保持经济和社会稳定。\n有人问，发行货币是否会加剧通货膨胀？如果增发的货币抵消信货的降幅，就不会引发通货膨胀。不要忘记，重要的是支出。每一块钱的支出无论支付的是货币，还是信用，对价格的影响都是一样的。央行可以通过增加货币发行量来弥补消失的信贷。央行为了扭转局面，不仅需要推动收入的增长，而且需要让收入的增长率超过所积累债务的利率。这是什么意思？主要的意思是，收入一定要比债务增长得快。例如，我们假设有个国家正在经历去杠杆化，其债务收入比率是100％ 这意味著，债务量相当于整个国家一年的收入。假设这些债务的利率是2%，如果债务以2%的速率增加而收入的增长率仅有大约1%。那么债务负担永远不会减轻必需发行更多货币，使收入增长率超过利率。然而，发行货币太容易了，而且比其他办法受欢迎。因此这个办法可能易于被滥用。关键是避免像1920年代去杠杆化的德国那样发行过多的货币，从而导致恶性通货膨胀。\n如果决策层取得适当的平衡，去杠杆化过程就不会那样激烈。经济增长速度缓慢，但债务负担会下降这就是和谐的去杠杆化。当收入上升的时候，借款人的信用度提高借款人一旦显得更有信用，贷款人就会开始恢复贷款，债务负担终于开始下降，人们可以借到钱，就可以增加消费。经济终于开始恢复增长，长期债务周期从而进入通货再膨胀阶段。\n去杠杆化过程如果处理不当，会非常可怕；但如果处理得当，最终将解决问题。为了使债务负担下降和经济活动恢复正常，大约需要十年或更长的时间，因此有失去的十年这种说法。\n综上所述，经济当然要比这个模式复杂一点。然而，把短期债务周期、长期债务周期和生产率增长轨迹结合起来分析。我们会得到一个不错的模式，可以看清我们在过去和当前的处境以及未来可能的发展方向。\n最后，我希望大家学到三条经验法则：\n第一不要让债务的增长速度超过收入，因为债务负担最终将把你压垮。\n第二不要让收入的增长速度超过生产率，因为这最终将使你失去竞争力。\n第三尽一切努力提高生产率，因为生产率在长期内起着最关键的作用。\n这就是我给大家，也是给决策者们的简单的建议。大家也许会吃惊地发现，大多数人包括大多数决策者，都没有对此予以足够的重视。这个模式对我很有用，希望它也将对你们有用谢谢大家。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/economy/ecomony-machine/","summary":"\u003ch1 id=\"说明\"\u003e说明\u003c/h1\u003e\n\u003cp\u003e本文的语音与视频版本如下：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://mp.weixin.qq.com/s/n3mrAVkwvEHfVTDNfKzEXg\"\u003e经济机器是怎样运行的(语音+文字版)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=rFV7wdEX-Mo\"\u003e经济机器是怎样运行的 (时长30分钟) Ray Dalio\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"关于作者\"\u003e关于作者\u003c/h1\u003e\n\u003cp\u003e原文作者瑞·达利欧，为著名畅销书《原则》作者。1975年，在自己的两居室内创办桥水，2015年，桥水管理资金超过1500亿美元，累计盈利450亿美元，远超史上所有对冲基金。\u003c/p\u003e","title":"《原则》作者瑞·达利欧烧脑大作(1): 经济机器是怎样运行的"},{"content":"Golang是什么语言 PHP是最好的语言。\nHaskell最难学的语言。\nGolang最工程化的语言。\n下面分别从语言层面及软件工程两个方面进行说明。\n语言 安全性 相比较于C/C++，golang不支持指针操作，不支持隐式类型转换，支持内存溢出与越界检查。\n并发与扩展 通过goroutine，Golang从语言层面上解决了并发与扩展的问题，而不像C/C++, JAVA通过框架来解决这个问题。Golang自适应多核运行。\n简单 语法简单，代码不涉及内存管理，上手容易。新人学习几天就可以上手写代码。\n可维护性 自带godoc统一代码格式。 一个文件夹对应一个包有利于代码模块化。\n打包一切 相比较于C/C++，动态库和静态库的依赖，Golang将所有编译成一个二进制文件。 解决依赖带来高度耦合问题，这样十分有利于交付与部署。\n可移植 支持多种体系架构与不同的操作系统以及跨平台编译。\n高效率 Golang实现了程序员开发高效率与机器运行高效率两者的有效结合，进而实现经济上高效率。\n相比较于C/C++，Golang编译速度更快了。特别是大型项目，以前用C语言的时候，在刀片服务器上时编译一个测试版本都要半个小时左右。\n生态成长 背靠Google，从09年发布已来，已经在云生态占据绝对主导地位。有不少明星开源项目。如Docker、Kubernetes、Prometheus、Hyperleder、Ethereum、Etcd等。随着云时代不断发展，Golang生态一定会越来越强大与丰富。\n软件工程 流程 一般软件工程流程分为规划、需求、设计、编码、测试、发布、维护等几个阶段。除了规划与需求阶段，Golang对其他阶段在语言层面都有强力特性支持。举例如下：\n设计阶段：利用interface可以进行protype编程，可以实现代码及文档。 编码阶段：go fmt统一代码格式 测试阶段：自带go test便于测试，不像C/C++依赖gtest 发布阶段：上面说到可移植及打包一切，便于交付，发布，部署 维护阶段：Golang天然支持CPU扩展及其上面所说的便于交付，发布，部署 大规模协作 Golang引入interface特性，实际在语言层面支持SOLID设计原则中依赖倒置原则。再加上包的独立性，有利于大规模系统的大团队协作开发。\n编程友好 软件工程是人是关键因素。编码是核心阶段。Golang以下特性释放了程序员的生产力：\n还算丰富的基础库 避免内存管理 天然支持并发 后记 当然Golang也有自己的缺点，如GC问题，延时大等。但是用一个语言的策略就应该扬长避短，当然熟练应用Golang的特性得深入学习与实践。\n(End)\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/golang/golang-eng/","summary":"\u003ch1 id=\"golang是什么语言\"\u003eGolang是什么语言\u003c/h1\u003e\n\u003cp\u003ePHP是最好的语言。\u003c/p\u003e\n\u003cp\u003eHaskell最难学的语言。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eGolang最工程化的语言\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e下面分别从语言层面及软件工程两个方面进行说明。\u003c/p\u003e\n\u003ch1 id=\"语言\"\u003e语言\u003c/h1\u003e\n\u003ch2 id=\"安全性\"\u003e安全性\u003c/h2\u003e\n\u003cp\u003e相比较于C/C++，golang不支持指针操作，不支持隐式类型转换，支持内存溢出与越界检查。\u003c/p\u003e","title":"Golang最工程化的语言"},{"content":"前言 IPFS（包括filecoin）无论从技术视角还是商业视角都有很多有意思的内容（关键是自己很看好这个技术），所以要准备搞一个IPFS专题。\n文章 IPFS与下一代网络安全 下一代互联网基础：IPFS.pdf 动态 Filecoin 2017 Q4 Update Filecoin 2018 Q1 \u0026amp; Q2 Update Filecoin 2019 Q2 \u0026amp; Q3 Update Filecoin Roadmap Update Q4 2019 IPFS 0.5.0 is here! Our largest upgrade to IPFS yet A Guide to Filecoin Storage Mining IPFS和filecoin之间的关系 IPFS是技术，filecoin是技术的商业化。 IPFS+filecoin在一起完成技术商业化，从1到1000。。。\n生态 ANNOUNCING COLLABORATION WITH FILECOIN - BIG INTEGRATIONS COMING 累计资助150万美元，上线前夕的Filecoin生态项目都有啥？ 参考 ipfs filecoin ","permalink":"https://myself659.github.io/post/ipfs%E4%B8%93%E9%A2%98/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003eIPFS（包括filecoin）无论从技术视角还是商业视角都有很多有意思的内容（关键是自己很看好这个技术），所以要准备搞一个IPFS专题。\u003c/p\u003e\n\u003ch2 id=\"文章\"\u003e文章\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://myself659.github.io/2017/09/21/2017-09-21-ipfs-sec/\"\u003eIPFS与下一代网络安全\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://myself659.github.io/slides/%E4%B8%8B%E4%B8%80%E4%BB%A3%E4%BA%92%E8%81%94%E7%BD%91%E5%9F%BA%E7%A1%80%EF%BC%9AIPFS.pdf\"\u003e下一代互联网基础：IPFS.pdf\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"动态\"\u003e动态\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://filecoin.io/blog/update-2017-q4/\"\u003eFilecoin 2017 Q4 Update\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://filecoin.io/blog/update-2018-q1-q2/\"\u003eFilecoin 2018 Q1 \u0026amp; Q2 Update\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://filecoin.io/blog/update-2019-q2-q3/\"\u003eFilecoin 2019 Q2 \u0026amp; Q3 Update\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://filecoin.io/blog/roadmap-update-2019-q4/\"\u003eFilecoin Roadmap Update Q4 2019\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.ipfs.io/2020-04-28-go-ipfs-0-5-0/\"\u003eIPFS 0.5.0 is here! Our largest upgrade to IPFS yet\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://filecoin.io/blog/filecoin-guide-to-storage-mining/\"\u003eA Guide to Filecoin Storage Mining\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"ipfs和filecoin之间的关系\"\u003eIPFS和filecoin之间的关系\u003c/h2\u003e\n\u003cp\u003eIPFS是技术，filecoin是技术的商业化。\nIPFS+filecoin在一起完成技术商业化，从1到1000。。。\u003c/p\u003e","title":"IPFS专题"},{"content":"关于团队建设与交流一点看法。主要要点如下：\n团队奉行人人平等的原则 团队成员每一个人都学会认真聆听 团队将追求轻松交谈作为目标 团队成员要学会发现别人的闪光点，并提供真诚，具体，简洁的赞赏 团队要鼓励深入思考并敢于冒险 调节团队情绪，保持积极向上的团队风貌 扩大消息面与来源，避免偏见 鼓励面对现实与尖锐问题 求同存异，允许不同意见与看法的存在 打造良好的沟通场所与氛围 ","permalink":"https://myself659.github.io/post/rt/%E5%A6%82%E4%BD%95%E6%8F%90%E9%AB%98%E5%9B%A2%E9%98%9F%E6%80%9D%E8%80%83%E4%B8%8E%E4%BA%A4%E6%B5%81/","summary":"\u003cp\u003e关于团队建设与交流一点看法。主要要点如下：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e团队奉行人人平等的原则\u003c/li\u003e\n\u003cli\u003e团队成员每一个人都学会认真聆听\u003c/li\u003e\n\u003cli\u003e团队将追求轻松交谈作为目标\u003c/li\u003e\n\u003cli\u003e团队成员要学会发现别人的闪光点，并提供真诚，具体，简洁的赞赏\u003c/li\u003e\n\u003cli\u003e团队要鼓励深入思考并敢于冒险\u003c/li\u003e\n\u003cli\u003e调节团队情绪，保持积极向上的团队风貌\u003c/li\u003e\n\u003cli\u003e扩大消息面与来源，避免偏见\u003c/li\u003e\n\u003cli\u003e鼓励面对现实与尖锐问题\u003c/li\u003e\n\u003cli\u003e求同存异，允许不同意见与看法的存在\u003c/li\u003e\n\u003cli\u003e打造良好的沟通场所与氛围\u003c/li\u003e\n\u003c/ol\u003e","title":"关于团队建设与沟通一点思考"},{"content":"前言 关于区块链讨论很多，下面是我个人看好区块链技术的原因，具体如下：\n提高效率，降低成本 以比特币为例，大大缩短跨国转帐的成本和时间周期。这只是冰上一角，区块链技术在金融系统的还没有大面积的应用。\n解决问题 区块链确确实实在解决一些问题，具体如下：\n蚂蚁金服将区块链与公益结合，以解决透明跟踪资金流动及其监管等问题 比特币的国际转帐，降低转帐成本，同时也降低了到帐时间 提供不可更改服务，如运维操作的记录 信任机器 每一笔交易背后都是信任。比特币从09年到现在，并没有看到有任何一笔交易执行出错。\n未来趋势 IT行业经历了中心化时代（大型机）到去中心化时代（桌面时代）再到中心化时代（云计算与大型互联网）的发展，再到现在一步一步向以区块链技术为基础的去中心化时代发展。\n滚滚潮流面前，一切自然都会发生。\n应用广泛 如下图所示，区块链技术应用范围很广。\n成长性 不仅体现在市场上，更体现在技术，区块链将会是一种粘合剂型的技术。\n革命性 吴军说过AI解放生产力，区块链解放生产关系。\n无论国内还是美帝，一大批精英投入到区块链行业中。\n最后引用一句语：\n越对未来有信心，越对现在有耐心。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)，您的关注是我更新的动力\n","permalink":"https://myself659.github.io/post/%E6%88%91%E4%B8%BA%E4%BB%80%E4%B9%88%E7%9C%8B%E5%A5%BD%E5%8C%BA%E5%9D%97%E9%93%BE/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e关于区块链讨论很多，下面是我个人看好区块链技术的原因，具体如下：\u003c/p\u003e\n\u003ch2 id=\"提高效率降低成本\"\u003e提高效率，降低成本\u003c/h2\u003e\n\u003cp\u003e以比特币为例，大大缩短跨国转帐的成本和时间周期。这只是冰上一角，区块链技术在金融系统的还没有大面积的应用。\u003c/p\u003e","title":"我为什么看好区块链"},{"content":" 开源已经是一种潮流与趋势。从linux开始，开源软件支撑现在的互联网与云计算。有太多的项目如redis，docker，k8s，etcd等等；区块链领域更是如此。 得开发者得天下。github上有最多的开发者和开发项目。 代码管理平台的重要性凸显。 估计google会在未来收购gitlab。 github找到微软爸爸，服务体验会有改善（如国内下载代码慢）。 github大量的开源代码会成为AI编程的学习材料，未来CRUD可能由AI来完成了。 未来人人都是开发者。随着教育的发展，编程肯定是每个人的必修课。这样github会成为代码管理的操作系统。 github与vscode会有深度集成，提高开发效率与体验。 github与azure集成，提供一站式开发服务。 参考 收购 GitHub，微软的又一次大转变 How Microsoft Beat the Innovator’s Dilemma 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/ms-github/","summary":"\u003col\u003e\n\u003cli\u003e开源已经是一种潮流与趋势。从linux开始，开源软件支撑现在的互联网与云计算。有太多的项目如redis，docker，k8s，etcd等等；区块链领域更是如此。\u003c/li\u003e\n\u003cli\u003e得开发者得天下。github上有最多的开发者和开发项目。\u003c/li\u003e\n\u003cli\u003e代码管理平台的重要性凸显。\u003c/li\u003e\n\u003cli\u003e估计google会在未来收购gitlab。\u003c/li\u003e\n\u003cli\u003egithub找到微软爸爸，服务体验会有改善（如国内下载代码慢）。\u003c/li\u003e\n\u003cli\u003egithub大量的开源代码会成为AI编程的学习材料，未来CRUD可能由AI来完成了。\u003c/li\u003e\n\u003cli\u003e未来人人都是开发者。随着教育的发展，编程肯定是每个人的必修课。这样github会成为代码管理的操作系统。\u003c/li\u003e\n\u003cli\u003egithub与vscode会有深度集成，提高开发效率与体验。\u003c/li\u003e\n\u003cli\u003egithub与azure集成，提供一站式开发服务。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"参考\"\u003e参考\u003c/h1\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://36kr.com/p/5137307.html\"\u003e收购 GitHub，微软的又一次大转变\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/young-coder/how-microsoft-beat-the-innovators-dilemma-5b78e3692ed3\"\u003eHow Microsoft Beat the Innovator’s Dilemma\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"欢迎关注\"\u003e欢迎关注\u003c/h1\u003e\n\u003cp\u003e欢迎关注微信公众帐号：沉风网事(savewind)\u003c/p\u003e","title":"关于微软收购github几点看法"},{"content":"随机是一个十分有意思的问题。\n随机是一种选择方式 生活中最常见的例子就有这些：\n抽签 抽奖 抛硬币 随机是一种隐藏方式 同样拿抽奖为例，将少量的中奖者隐藏在抽奖参与者中。从概率论的角度上看就是将分子隐藏分母当中。\n随机是一种分散方式 典型的例子就是随机数，避免产生的数据集中；除此之外Markov链实现一种离散时间随机过程。\n随机是一种达成共识的方式 还拿抽签为例，这种方式是我们达成共识的一种重要的低成本且公平的共识方式，具体如下：\n比赛过程中通过抽签解决出场顺序 家里贫穷时，有多个读书的，通过抽签来决定的 随机是一种降低冲突的方式 随机带来的分散性，可以帮助解决冲突，例如raft协议在选leader过程中通过随机来避免多个候选者同时竞争leader的情况出现。\n随机是一种保护与安全方式 一滴水只有放进大海才永远不会干涸。在Algorand中通过VRF保护记账节点，将记帐节点隐藏在于众多节点当中。在数字货币钱包利用随机性生产私钥来保护私钥；除了这些以外，更多随机数在在区块链有许多利用随机来保证公链安全的应用，可以参考这篇文章区块链中的随机数\n随机是一种需求 小道消息的抽奖助手将随机这一需求产品化。\n小结 总之，随机在生活中无处不在。随机以上用途来自随机的不确定性。随机的本质是不确性。 随机当中还有很多可以挖掘的认识与理解。\n参考 随机性 一文搞懂HMM（隐马尔可夫模型） Random numbers and decentralized networks: implementation Random numbers and decentralized networks: practical application Filecoin Features: Distributed Randomness \u0026amp; Leader Elections 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/about-rand/","summary":"\u003cp\u003e随机是一个十分有意思的问题。\u003c/p\u003e\n\u003ch1 id=\"随机是一种选择方式\"\u003e随机是一种选择方式\u003c/h1\u003e\n\u003cp\u003e生活中最常见的例子就有这些：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e抽签\u003c/li\u003e\n\u003cli\u003e抽奖\u003c/li\u003e\n\u003cli\u003e抛硬币\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"随机是一种隐藏方式\"\u003e随机是一种隐藏方式\u003c/h1\u003e\n\u003cp\u003e同样拿抽奖为例，将少量的中奖者隐藏在抽奖参与者中。从概率论的角度上看就是将分子隐藏分母当中。\u003c/p\u003e","title":"浅谈随机"},{"content":"原因 陷入困境的原因从以下几个方面展开。\n基础 不知道自己不知道unknown unknown 技能进入高原与瓶颈期，技能达不到解决问题的要求 缺少信息 陷入低水平的重复 自我限制 陷入固定的框架之中 陷入固定的观念之中 不能主动寻求帮助 只是重复而不是迭代 目标 目标不具体明确 目标太大，没有通过分解降低难度 目标太难 路径与方法 不知道如何开始与入手 缺少明确的路径 路径与方法错误如先后顺序出错 没有从最简单与最基础的开始 不要死磕，停下来，休息一下，改变一下 等待不存在的条件与环境如等完全只需要照抄的教程 能量 缺少动机 拖延症 心理负担重，不能轻装上阵 韧性不足，如前期失败几次后，直接放弃 专注不够，导致不能深度思考与工作 状态不好 示例 假设遇到一个leetcode题目不会解，可以参考以下步骤来解决：\n理解题目的意思，这里理解指能够清楚向别人解释题目，如限制是什么，输入是什么，输出是什么？\n针对问题给出一个简单的方案，测试与验证这个方案\n优化方案，在思路上验证方案满足要求\n写伪码，在代码思路上验证方案\n将伪码改为代码，通过代码运行验证方案\n如果验证通过，则先分析时间与空间复杂度，再进行举一反三。如果不通过，回到第三步或者第一步，进行迭代。\n","permalink":"https://myself659.github.io/post/done/how-to-unstuck-avoid-suck/","summary":"\u003ch2 id=\"原因\"\u003e原因\u003c/h2\u003e\n\u003cp\u003e陷入困境的原因从以下几个方面展开。\u003c/p\u003e\n\u003ch3 id=\"基础\"\u003e基础\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e不知道自己不知道unknown unknown\u003c/li\u003e\n\u003cli\u003e技能进入高原与瓶颈期，技能达不到解决问题的要求\u003c/li\u003e\n\u003cli\u003e缺少信息\u003c/li\u003e\n\u003cli\u003e陷入低水平的重复\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"自我限制\"\u003e自我限制\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e陷入固定的框架之中\u003c/li\u003e\n\u003cli\u003e陷入固定的观念之中\u003c/li\u003e\n\u003cli\u003e不能主动寻求帮助\u003c/li\u003e\n\u003cli\u003e只是重复而不是迭代\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"目标\"\u003e目标\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e目标不具体明确\u003c/li\u003e\n\u003cli\u003e目标太大，没有通过分解降低难度\u003c/li\u003e\n\u003cli\u003e目标太难\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"路径与方法\"\u003e路径与方法\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e不知道如何开始与入手\u003c/li\u003e\n\u003cli\u003e缺少明确的路径\u003c/li\u003e\n\u003cli\u003e路径与方法错误如先后顺序出错\u003c/li\u003e\n\u003cli\u003e没有从最简单与最基础的开始\u003c/li\u003e\n\u003cli\u003e不要死磕，停下来，休息一下，改变一下\u003c/li\u003e\n\u003cli\u003e等待不存在的条件与环境如等完全只需要照抄的教程\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"能量\"\u003e能量\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e缺少动机\u003c/li\u003e\n\u003cli\u003e拖延症\u003c/li\u003e\n\u003cli\u003e心理负担重，不能轻装上阵\u003c/li\u003e\n\u003cli\u003e韧性不足，如前期失败几次后，直接放弃\u003c/li\u003e\n\u003cli\u003e专注不够，导致不能深度思考与工作\u003c/li\u003e\n\u003cli\u003e状态不好\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"示例\"\u003e示例\u003c/h2\u003e\n\u003cp\u003e假设遇到一个leetcode题目不会解，可以参考以下步骤来解决：\u003c/p\u003e","title":"如何走出困境避免进度卡壳"},{"content":"简介 以太坊交易池有以下功能：\n缓存交易 清理交易 实现交易gasPrice竞价功能 配合出块，提供打包交易 交易查询 配置 配置描述 geth中用数据结构TxPoolConfig描述交易池配置，具体如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // TxPoolConfig are the configuration parameters of the transaction pool. type TxPoolConfig struct { NoLocals bool // Whether local transaction handling should be disabled Journal string // Journal of local transactions to survive node restarts Rejournal time.Duration // Time interval to regenerate the local transaction journal PriceLimit uint64 // Minimum gas price to enforce for acceptance into the pool PriceBump uint64 // Minimum price bump percentage to replace an already existing transaction (nonce) AccountSlots uint64 // Minimum number of executable transaction slots guaranteed per account GlobalSlots uint64 // Maximum number of executable transaction slots for all accounts AccountQueue uint64 // Maximum number of non-executable transaction slots permitted per account GlobalQueue uint64 // Maximum number of non-executable transaction slots for all accounts Lifetime time.Duration // Maximum amount of time non-executable transaction are queued } 对其中相关参数说明如下：\nAccountSlots：每个帐户等待处理交易的最大个数。默认值为16 GlobalSlots：所有帐户等待处理交易的最大个数。默认值为4096 AccountQueue：每帐户暂不能处理交易的最大个数。默认值为64 GlobalQueue：所有帐户暂不能处理交易的最大个数。默认值为1024 Lifetime：暂不能处理交易在队列中最大保存时长。默认值为3小时\n问题来了：等待处理交易与暂不能处理交易有什么不一样？\n等待处理交易满足交易执行条件，暂不能处理交易不满足交易执行条件。这里的交易执行条件是指交易的nonce不能超过当前区块中的交易的nonce的值加1。\n默认配置 默认配置信息保存在DefaultTxPoolConfig变量中。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // DefaultTxPoolConfig contains the default configurations for the transaction // pool. var DefaultTxPoolConfig = TxPoolConfig{ Journal: \u0026#34;transactions.rlp\u0026#34;, Rejournal: time.Hour, PriceLimit: 1, PriceBump: 10, AccountSlots: 16, GlobalSlots: 4096, AccountQueue: 64, GlobalQueue: 1024, Lifetime: 3 * time.Hour, } 交易池 描述 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 type TxPool struct { config TxPoolConfig chainconfig *params.ChainConfig chain blockChain gasPrice *big.Int txFeed event.Feed scope event.SubscriptionScope chainHeadCh chan ChainHeadEvent chainHeadSub event.Subscription signer types.Signer mu sync.RWMutex currentState *state.StateDB // Current state in the blockchain head pendingState *state.ManagedState // Pending state tracking virtual nonces currentMaxGas uint64 // Current gas limit for transaction caps locals *accountSet // Set of local transaction to exempt from eviction rules journal *txJournal // Journal of local transaction to back up to disk pending map[common.Address]*txList // All currently processable transactions queue map[common.Address]*txList // Queued but non-processable transactions beats map[common.Address]time.Time // Last heartbeat from each known account all *txLookup // All transactions to allow lookups priced *txPricedList // All transactions sorted by price wg sync.WaitGroup // for shutdown sync homestead bool } 关注一下以下几个成员就知道tx是如何保存与维护的：\npending map[common.Address]*txList queue map[common.Address]*txList beats map[common.Address]time.Time all *txLookup // map类型，txhash为key，tx为value priced *txPricedList // heap维护gasPrice排序 存储 交易池不需要持久化，数据直接保存在内存中\n流程 如果将交易池当作队列来看，就有以下操作：\n添加 删除 更新 添加 事件源 本地用户添加交易 远端RPC调加交易 检查条件 添加动作完成很简单，重要是添加前条件检查。相关检查代码如下:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 // add validates a transaction and inserts it into the non-executable queue for // later pending promotion and execution. If the transaction is a replacement for // an already pending or queued one, it overwrites the previous and returns this // so outer code doesn\u0026#39;t uselessly call promote. // // If a newly added transaction is marked as local, its sending account will be // whitelisted, preventing any associated transaction from being dropped out of // the pool due to pricing constraints. func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { // If the transaction is already known, discard it hash := tx.Hash() if pool.all.Get(hash) != nil { log.Trace(\u0026#34;Discarding already known transaction\u0026#34;, \u0026#34;hash\u0026#34;, hash) return false, fmt.Errorf(\u0026#34;known transaction: %x\u0026#34;, hash) } // If the transaction fails basic validation, discard it if err := pool.validateTx(tx, local); err != nil { log.Trace(\u0026#34;Discarding invalid transaction\u0026#34;, \u0026#34;hash\u0026#34;, hash, \u0026#34;err\u0026#34;, err) invalidTxCounter.Inc(1) return false, err } // If the transaction pool is full, discard underpriced transactions if uint64(pool.all.Count()) \u0026gt;= pool.config.GlobalSlots+pool.config.GlobalQueue { // If the new transaction is underpriced, don\u0026#39;t accept it if !local \u0026amp;\u0026amp; pool.priced.Underpriced(tx, pool.locals) { log.Trace(\u0026#34;Discarding underpriced transaction\u0026#34;, \u0026#34;hash\u0026#34;, hash, \u0026#34;price\u0026#34;, tx.GasPrice()) underpricedTxCounter.Inc(1) return false, ErrUnderpriced } // New transaction is better than our worse ones, make room for it drop := pool.priced.Discard(pool.all.Count()-int(pool.config.GlobalSlots+pool.config.GlobalQueue-1), pool.locals) for _, tx := range drop { log.Trace(\u0026#34;Discarding freshly underpriced transaction\u0026#34;, \u0026#34;hash\u0026#34;, tx.Hash(), \u0026#34;price\u0026#34;, tx.GasPrice()) underpricedTxCounter.Inc(1) pool.removeTx(tx.Hash(), false) } } // If the transaction is replacing an already pending one, do directly from, _ := types.Sender(pool.signer, tx) // already validated if list := pool.pending[from]; list != nil \u0026amp;\u0026amp; list.Overlaps(tx) { // Nonce already pending, check if required price bump is met inserted, old := list.Add(tx, pool.config.PriceBump) if !inserted { pendingDiscardCounter.Inc(1) return false, ErrReplaceUnderpriced } // New transaction is better, replace old one if old != nil { pool.all.Remove(old.Hash()) pool.priced.Removed() pendingReplaceCounter.Inc(1) } pool.all.Add(tx) pool.priced.Put(tx) pool.journalTx(from, tx) log.Trace(\u0026#34;Pooled new executable transaction\u0026#34;, \u0026#34;hash\u0026#34;, hash, \u0026#34;from\u0026#34;, from, \u0026#34;to\u0026#34;, tx.To()) // We\u0026#39;ve directly injected a replacement transaction, notify subsystems go pool.txFeed.Send(NewTxsEvent{types.Transactions{tx}}) return old != nil, nil } // New transaction isn\u0026#39;t replacing a pending one, push into queue replace, err := pool.enqueueTx(hash, tx) if err != nil { return false, err } // Mark local addresses and journal local transactions if local { pool.locals.add(from) } pool.journalTx(from, tx) log.Trace(\u0026#34;Pooled new future transaction\u0026#34;, \u0026#34;hash\u0026#34;, hash, \u0026#34;from\u0026#34;, from, \u0026#34;to\u0026#34;, tx.To()) return replace, nil } 从上面代码可以看出，检查项还是很多，罗列如下：\n重复性检查: 检查是否已经存在队列中 交易大小检查，不能超过32KB 转帐数额不能是负数 gasPrice不超过当前最高限定gasPrice 交易签名检查 gasPrice竞价检查 Nonce检查 帐户ETH检查，防止余额不足 gasLimit检查，防止gas费用不足 删除 事件源 删除交易有以下情况：\n交易队列容量超出 超时删除 接收新块检查删除非法交易 更新 事件源 相同nonce更新交易 定时器检查将满足执行条件的queue队列上交易添加到pending队列 参考 以太坊如何清除已发出未打包的交易 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/blockchain/eth-txpool/","summary":"\u003ch1 id=\"简介\"\u003e简介\u003c/h1\u003e\n\u003cp\u003e以太坊交易池有以下功能：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e缓存交易\u003c/li\u003e\n\u003cli\u003e清理交易\u003c/li\u003e\n\u003cli\u003e实现交易gasPrice竞价功能\u003c/li\u003e\n\u003cli\u003e配合出块，提供打包交易\u003c/li\u003e\n\u003cli\u003e交易查询\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"配置\"\u003e配置\u003c/h1\u003e\n\u003ch2 id=\"配置描述\"\u003e配置描述\u003c/h2\u003e\n\u003cp\u003egeth中用数据结构TxPoolConfig描述交易池配置，具体如下：\u003c/p\u003e","title":"以太坊交易池分析"},{"content":"Programming “All problems in computer science can be solved by another level of indirection.” — David Wheeler\n“But that usually will create another problem.” — David Wheeler\n“Simplicity is prerequisite for reliability.” — Edsger Dijkstra\n“If we wish to count lines of code, we should not regard them as ‘lines produced’ but as ‘lines spent.’ “— Edsger Dijkstra\n\u0026ldquo;Controlling complexity is the essence of computer programming.\u0026rdquo; — Brian Wilson Kernighan\n“It’s harder to read code than to write it.” — Joel Spolsky\n“Any fool can write code that a computer can understand. Good programmers write code that humans can understand.” — Martin Fowler\n“Don’t repeat yourself. Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.” — Andy Hunt and Dave Thomas\n“Code never lies; comments sometimes do.” — Ron Jeffries\n“There are only two hard things in computer science: cache invalidation and naming things.” — Phil Karlton\n“There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.” — Leon Bambrick\n“Deleted code is debugged code” — 𝕁𝕖𝕗𝕗 𝕊𝕚𝕔𝕜𝕖𝕝\n“Bugs lurk in corners and congregate at boundaries” — 𝔹𝕠𝕣𝕚𝕤 𝔹𝕖𝕚𝕫𝕖𝕣\n“The art of debugging is figuring out what you really told your program to do rather than what you thought you told it to do.”” — Andrew Singer\n“The moment you have to peek and dive into implementation details to understand how to compose it with other object. You’ve lost advantage of your programming paradigm.”\n— Barotz Milewski\n“A good programmer is someone who always looks both ways before crossing a one-way street” — 𝔻𝕠𝕦𝕘 𝕃𝕚𝕟𝕕𝕖𝕣\n“Any code of your own that you haven’t looked at for six or more months might as well have been written by someone else” — 𝔼𝕒𝕘𝕝𝕖𝕤𝕠𝕟’𝕤 𝕃𝕒𝕨\n“One man’s crappy software is another man’s full-time job” — 𝕁𝕖𝕤𝕤𝕚𝕔𝕒 𝔾𝕒𝕤𝕥𝕠𝕟\n“If you automate a mess, you get an automated mess” — ℝ𝕠𝕕 𝕄𝕚𝕔𝕙𝕒𝕖𝕝\n“Increasing the efficiency with which a resource is used increases the usage of that resource” — 𝕁𝕖𝕧𝕠𝕟’𝕤 ℙ𝕒𝕣𝕒𝕕𝕠𝕩\n“The cheapest, fastest, and most reliable components are those that aren’t there” — 𝔾𝕠𝕣𝕕𝕠𝕟 𝔹𝕖𝕝𝕝\n“If debugging is the process of removing software bugs, then programming must be the process of putting them in” — 𝔼𝕕𝕤𝕘𝕖𝕣 𝔻𝕚𝕛𝕜𝕤𝕥𝕣𝕒\n“There are two ways to write error-free programs; only the third one works” — 𝔸𝕝𝕒𝕟 ℙ𝕖𝕣𝕝𝕚𝕤\nArchitecture \u0026amp; Design “Hiring people to write code to sell is not the same as hiring people to design and build durable, usable, dependable software” —𝕃𝕒𝕣𝕣𝕪 ℂ𝕠𝕟𝕤𝕥𝕒𝕟𝕥𝕚𝕟𝕖\n“The hardest part of design is … keeping features out” — 𝔻𝕠𝕟𝕒𝕝𝕕 ℕ𝕠𝕣𝕞𝕒𝕟\n“A software system built on top of a weak architecture will sink due to the weight of its own success” — 𝕋𝕙𝕖 𝔸𝕣𝕔𝕙𝕚𝕞𝕖𝕕𝕖𝕒𝕟 ℙ𝕣𝕚𝕟𝕔𝕚𝕡𝕝𝕖\n“Before software can be reusable it first has to be usable” — ℝ𝕒𝕝𝕡𝕙 𝕁𝕠𝕙𝕟𝕤𝕠𝕟\n“A complex system that works is invariably found to have evolved from a simple system that worked” — 𝔾𝕒𝕝𝕝’𝕤 𝕃𝕒𝕨\nIf you can’t explain it simply, you don’t understand it well enough. — Albert Einstein\nRequirements “Walking on water and developing software from a specification are easy if both are frozen” — 𝔼𝕕𝕨𝕒𝕣𝕕 𝔹𝕖𝕣𝕒𝕣𝕕\n“The user will never know what they want until after the system is in production (and maybe not even then)” — ℍ𝕦𝕞𝕡𝕙𝕣𝕖𝕪’𝕤 𝕃𝕒𝕨\n“It is easier to change the specification to fit the program than vice versa” — 𝔸𝕝𝕒𝕟 ℙ𝕖𝕣𝕝𝕚𝕤\n“The more stable a requirement is considered, the greater the probability it is changed” — ℍ𝕖𝕚𝕤𝕖𝕟𝕓𝕖𝕣𝕘’𝕤 ℙ𝕣𝕚𝕟𝕔𝕚𝕡𝕝𝕖\n“Increasing the number of choices will increase the decision time logarithmically” — ℍ𝕚𝕔𝕜’𝕤 𝕃𝕒𝕨\n“A man with a watch knows what time it is. A man with two watches is never sure” — 𝕊𝕖𝕘𝕒𝕝’𝕤 𝕃𝕒𝕨\nEstimation \u0026amp; Time Management “The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time” — 𝕋𝕠𝕞 ℂ𝕒𝕣𝕘𝕚𝕝𝕝\n“The time from now until the completion of the project tends to become constant” — ℍ𝕒𝕣𝕥𝕣𝕖𝕖’𝕤 𝕃𝕒𝕨\n“Work expands to fill the time available for its completion” — ℙ𝕒𝕣𝕜𝕚𝕟𝕤𝕠𝕟’𝕤 𝕃𝕒𝕨\n“It always takes longer than you expect, even when you take into account Hofstadter’s Law” — ℍ𝕠𝕗𝕤𝕥𝕒𝕕𝕥𝕖𝕣’𝕤 𝕃𝕒𝕨\n“There’s never enough time to do it right, but there’s always enough time to do it over” — 𝕁𝕒𝕔𝕜 𝔹𝕖𝕣𝕘𝕞𝕒𝕟\nProject Management “Adding manpower to a late software project makes it later” —𝔹𝕣𝕠𝕠𝕜𝕤’𝕤 𝕃𝕒𝕨\n“For many phenomena 80% of consequences stem from 20% of the causes” —ℙ𝕒𝕣𝕖𝕥𝕠 ℙ𝕣𝕚𝕟𝕔𝕚𝕡𝕝𝕖\n“Nothing ever gets built on schedule or within budget” — ℂ𝕙𝕖𝕠𝕡𝕤 𝕃𝕒𝕨\n“Anything that can go wrong will go wrong” — 𝕄𝕦𝕣𝕡𝕙𝕪’𝕤 𝕃𝕒𝕨\n“I have always found that plans are useless, but planning is indispensable” — 𝔻𝕨𝕚𝕘𝕙𝕥 𝔼𝕚𝕤𝕖𝕟𝕙𝕠𝕨𝕖𝕣\n","permalink":"https://myself659.github.io/post/arch/software-engineering-great-quotes/","summary":"\u003ch2 id=\"programming\"\u003eProgramming\u003c/h2\u003e\n\u003cp\u003e“All problems in computer science can be solved by another level of indirection.” — David Wheeler\u003c/p\u003e\n\u003cp\u003e“But that usually will create another problem.” — David Wheeler\u003c/p\u003e\n\u003cp\u003e“Simplicity is prerequisite for reliability.” — Edsger Dijkstra\u003c/p\u003e","title":"软件工程的法则与名言"},{"content":"前言 优秀的技术人员与技术管理人员会一直紧缺。一个好的技术管理人员应该有自己的管理及领导指导原则。（Ps：最近在读《原则》这本书，深受其影响，虽然已经有很多人在推荐，这里再推荐一下，这本书真的值得一读。） 结合个人的工作经历与思考，提出自己对研发管理与技术领导的一些原则性思考。\n基本原则 具体如下图所示：\n以业务为中心，从文化，团队，代码，架构四个方面进行出发思考。用一句简单总结一下就是：在先进的文化氛围下，精英团队在科学的架构指导以业务为中心开展各项代码工作（需求，设计，开发，测试，部署，升级）。\n这是一个前进的方向及指导的框架，至于具体的落地需要按阶段与范围的践行。（Ps：中国改革开放40年在遵循一个中心，两个基本点的指导原则下，使中国经济发展取得翻天覆地的巨大变化。）\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n参考 Supercell，一家人均贡献超过3600万的公司，如何定义管理？ ","permalink":"https://myself659.github.io/post/rd-leadship/","summary":"\u003ch1 id=\"前言\"\u003e前言\u003c/h1\u003e\n\u003cp\u003e优秀的技术人员与技术管理人员会一直紧缺。一个好的技术管理人员应该有自己的管理及领导指导原则。（Ps：最近在读《原则》这本书，深受其影响，虽然已经有很多人在推荐，这里再推荐一下，这本书真的值得一读。）\n结合个人的工作经历与思考，提出自己对研发管理与技术领导的一些原则性思考。\u003c/p\u003e","title":"乱扯研发管理与领导"},{"content":"没有什么是不可改变的。\nFacebook有22亿用户。\nMySpace曾经是世界之王。现在人们都已经遗忘了。\nQQ还是让位微信，活跃度下降，用户时长下降。\n问题来了，在哪些情况下周期会到了？个人认为以下三种情况大概率会发生。\n变得讨厌，用户会逐渐抛弃，人人网就是一个例子 有更好的替代品的时候，如MySpace被facebook取代 技术变革，犹如地球进入冰川时代，巨无霸的恐龙都灭绝了，典型的例子是进入移动互联网时代，微信取代了QQ 那么问题又来了，微信的周期什么时候会到？这个意淫一下，回答如下：\n当穿戴时代到来的时候，手机被抛弃的时候，这个未来十年应该不会发生的 当微信的社交关系由于数据库维护，变成了由生物特征维护的时候，这个主要是冲击是用户同用户之间建立连接的方式变了 这只是个人的胡乱猜想，微信的未来我是看好，微信也是不断的进化，微信现在已经变成一个有10亿用户的生活操作系统。Windows都用了40多年，现在还是大量(PC并没有被淘汰)使用中，相信微信也不会例外。但是手机的操作却不是Windows，未来充满变化与不确定性。\n","permalink":"https://myself659.github.io/post/socialnetowrk-cannot-cycle/","summary":"\u003cp\u003e没有什么是不可改变的。\u003c/p\u003e\n\u003cp\u003eFacebook有22亿用户。\u003c/p\u003e\n\u003cp\u003eMySpace曾经是世界之王。现在人们都已经遗忘了。\u003c/p\u003e\n\u003cp\u003eQQ还是让位微信，活跃度下降，用户时长下降。\u003c/p\u003e","title":"社交网络摆脱不了的周期"},{"content":"说明 代码基于go-ethereum，版本v1.8.10。\nRPC代码入口 SendTransaction\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // SendTransaction will create a transaction from the given arguments and // tries to sign it with the key associated with args.To. If the given passwd isn\u0026#39;t // able to decrypt the key it fails. func (s *PrivateAccountAPI) SendTransaction(ctx context.Context, args SendTxArgs, passwd string) (common.Hash, error) { if args.Nonce == nil { // Hold the addresse\u0026#39;s mutex around signing to prevent concurrent assignment of // the same nonce to multiple accounts. s.nonceLock.LockAddr(args.From) defer s.nonceLock.UnlockAddr(args.From) } signed, err := s.signTransaction(ctx, args, passwd) if err != nil { return common.Hash{}, err } return submitTransaction(ctx, s.b, signed) } SendTxArgs的数据结构如下：\n1 2 3 4 5 6 7 8 9 10 11 12 type SendTxArgs struct { From common.Address `json:\u0026#34;from\u0026#34;` To *common.Address `json:\u0026#34;to\u0026#34;` Gas *hexutil.Uint64 `json:\u0026#34;gas\u0026#34;` GasPrice *hexutil.Big `json:\u0026#34;gasPrice\u0026#34;` Value *hexutil.Big `json:\u0026#34;value\u0026#34;` Nonce *hexutil.Uint64 `json:\u0026#34;nonce\u0026#34;` // We accept \u0026#34;data\u0026#34; and \u0026#34;input\u0026#34; for backwards-compatibility reasons. \u0026#34;input\u0026#34; is the // newer name and should be preferred by clients. Data *hexutil.Bytes `json:\u0026#34;data\u0026#34;` Input *hexutil.Bytes `json:\u0026#34;input\u0026#34;` } 新增加Input字段。用于替换原来Data字段，为了兼容保留Data字段。\n查找钱包 根据from地址信息查找钱包。\n1 2 3 4 5 6 // Look up the wallet containing the requested signer account := accounts.Account{Address: args.From} wallet, err := s.am.Find(account) if err != nil { return nil, err } 设置参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 // setDefaults is a helper function that fills in default values for unspecified tx fields. func (args *SendTxArgs) setDefaults(ctx context.Context, b Backend) error { if args.Gas == nil { args.Gas = new(hexutil.Uint64) *(*uint64)(args.Gas) = 90000 } if args.GasPrice == nil { price, err := b.SuggestPrice(ctx) if err != nil { return err } args.GasPrice = (*hexutil.Big)(price) } if args.Value == nil { args.Value = new(hexutil.Big) } if args.Nonce == nil { nonce, err := b.GetPoolNonce(ctx, args.From) if err != nil { return err } args.Nonce = (*hexutil.Uint64)(\u0026amp;nonce) } if args.Data != nil \u0026amp;\u0026amp; args.Input != nil \u0026amp;\u0026amp; !bytes.Equal(*args.Data, *args.Input) { return errors.New(`Both \u0026#34;data\u0026#34; and \u0026#34;input\u0026#34; are set and not equal. Please use \u0026#34;input\u0026#34; to pass transaction call data.`) } if args.To == nil { // Contract creation var input []byte if args.Data != nil { input = *args.Data } else if args.Input != nil { input = *args.Input } if len(input) == 0 { return errors.New(`contract creation without any data provided`) } } return nil } 创建交易 根据交易参数创建交易。\n1 2 3 4 5 6 7 8 9 10 11 12 func (args *SendTxArgs) toTransaction() *types.Transaction { var input []byte if args.Data != nil { input = *args.Data } else if args.Input != nil { input = *args.Input } if args.To == nil { return types.NewContractCreation(uint64(*args.Nonce), (*big.Int)(args.Value), uint64(*args.Gas), (*big.Int)(args.GasPrice), input) } return types.NewTransaction(uint64(*args.Nonce), *args.To, (*big.Int)(args.Value), uint64(*args.Gas), (*big.Int)(args.GasPrice), input) } 相关数据结构如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 type Transaction struct { data txdata // caches hash atomic.Value size atomic.Value from atomic.Value } type txdata struct { AccountNonce uint64 `json:\u0026#34;nonce\u0026#34; gencodec:\u0026#34;required\u0026#34;` Price *big.Int `json:\u0026#34;gasPrice\u0026#34; gencodec:\u0026#34;required\u0026#34;` GasLimit uint64 `json:\u0026#34;gas\u0026#34; gencodec:\u0026#34;required\u0026#34;` Recipient *common.Address `json:\u0026#34;to\u0026#34; rlp:\u0026#34;nil\u0026#34;` // nil means contract creation Amount *big.Int `json:\u0026#34;value\u0026#34; gencodec:\u0026#34;required\u0026#34;` Payload []byte `json:\u0026#34;input\u0026#34; gencodec:\u0026#34;required\u0026#34;` // Signature values V *big.Int `json:\u0026#34;v\u0026#34; gencodec:\u0026#34;required\u0026#34;` R *big.Int `json:\u0026#34;r\u0026#34; gencodec:\u0026#34;required\u0026#34;` S *big.Int `json:\u0026#34;s\u0026#34; gencodec:\u0026#34;required\u0026#34;` // This is only used when marshaling to JSON. Hash *common.Hash `json:\u0026#34;hash\u0026#34; rlp:\u0026#34;-\u0026#34;` } 获取ChainId 为了防止重放攻击，获得了chainID（EIP155之后才支持），用于签名。\n1 2 3 4 var chainID *big.Int if config := s.b.ChainConfig(); config.IsEIP155(s.b.CurrentBlock().Number()) { chainID = config.ChainId } chainID是如何使用的？简单说就是：以一系列数学运算将chainID保存到签名信息中。\n1 2 3 4 5 6 7 8 9 func NewEIP155Signer(chainId *big.Int) EIP155Signer { if chainId == nil { chainId = new(big.Int) } return EIP155Signer{ chainId: chainId, chainIdMul: new(big.Int).Mul(chainId, big.NewInt(2)), } } 1 2 3 4 5 6 7 8 9 10 11 12 13 // WithSignature returns a new transaction with the given signature. This signature // needs to be in the [R || S || V] format where V is 0 or 1. func (s EIP155Signer) SignatureValues(tx *Transaction, sig []byte) (R, S, V *big.Int, err error) { R, S, V, err = HomesteadSigner{}.SignatureValues(tx, sig) if err != nil { return nil, nil, nil, err } if s.chainId.Sign() != 0 { V = big.NewInt(int64(sig[64] + 35)) V.Add(V, s.chainIdMul) } return R, S, V, nil } 签名 从keystore获取私钥用于签名交易。\n1 2 3 4 5 6 7 8 9 10 11 // SignHashWithPassphrase signs hash if the private key matching the given address // can be decrypted with the given passphrase. The produced signature is in the // [R || S || V] format where V is 0 or 1. func (ks *KeyStore) SignHashWithPassphrase(a accounts.Account, passphrase string, hash []byte) (signature []byte, err error) { _, key, err := ks.getDecryptedKey(a, passphrase) if err != nil { return nil, err } defer zeroKey(key.PrivateKey) return crypto.Sign(hash, key.PrivateKey) } 提交交易 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // submitTransaction is a helper function that submits tx to txPool and logs a message. func submitTransaction(ctx context.Context, b Backend, tx *types.Transaction) (common.Hash, error) { if err := b.SendTx(ctx, tx); err != nil { return common.Hash{}, err } if tx.To() == nil { signer := types.MakeSigner(b.ChainConfig(), b.CurrentBlock().Number()) from, err := types.Sender(signer, tx) if err != nil { return common.Hash{}, err } addr := crypto.CreateAddress(from, tx.Nonce()) log.Info(\u0026#34;Submitted contract creation\u0026#34;, \u0026#34;fullhash\u0026#34;, tx.Hash().Hex(), \u0026#34;contract\u0026#34;, addr.Hex()) } else { log.Info(\u0026#34;Submitted transaction\u0026#34;, \u0026#34;fullhash\u0026#34;, tx.Hash().Hex(), \u0026#34;recipient\u0026#34;, tx.To()) } return tx.Hash(), nil } 添加交易到本地交易池。\n1 2 3 func (b *EthAPIBackend) SendTx(ctx context.Context, signedTx *types.Transaction) error { return b.eth.txPool.AddLocal(signedTx) } 小结 到此为止，交易已经提交到交易池。这才是整个交易完成过程中第一步，后面还有广播、检查、打包、确认等流程。\n这是节点钱包提交交易的过程。轻钱包提交交易与此有一些不同，是通过rpc调用提交到钱包服务的节点钱包。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/blockchain/eth-tx-submit/","summary":"\u003ch1 id=\"说明\"\u003e说明\u003c/h1\u003e\n\u003cp\u003e代码基于go-ethereum，版本v1.8.10。\u003c/p\u003e\n\u003ch2 id=\"rpc代码入口\"\u003eRPC代码入口\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/myself659/go-ethereum/blob/eae63c511ceafab14b92e274c1b18bf1700e2d3d/internal/ethapi/api.go#L365\"\u003eSendTransaction\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eSendTransaction\u003c/span\u003e \u003cspan class=\"n\"\u003ewill\u003c/span\u003e \u003cspan class=\"n\"\u003ecreate\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003etransaction\u003c/span\u003e \u003cspan class=\"n\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003egiven\u003c/span\u003e \u003cspan class=\"n\"\u003earguments\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003etries\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"nb\"\u003esign\u003c/span\u003e \u003cspan class=\"n\"\u003eit\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003ekey\u003c/span\u003e \u003cspan class=\"n\"\u003eassociated\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTo\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eIf\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003egiven\u003c/span\u003e \u003cspan class=\"n\"\u003epasswd\u003c/span\u003e \u003cspan class=\"n\"\u003eisn\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;t\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eable\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003edecrypt\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003ekey\u003c/span\u003e \u003cspan class=\"n\"\u003eit\u003c/span\u003e \u003cspan class=\"n\"\u003efails\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efunc\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ePrivateAccountAPI\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eSendTransaction\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ectx\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eargs\u003c/span\u003e \u003cspan class=\"n\"\u003eSendTxArgs\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003epasswd\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecommon\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eHash\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eNonce\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eHold\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003eaddresse\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;s mutex around signing to prevent concurrent assignment of\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003esame\u003c/span\u003e \u003cspan class=\"n\"\u003enonce\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003emultiple\u003c/span\u003e \u003cspan class=\"n\"\u003eaccounts\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enonceLock\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eLockAddr\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFrom\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003edefer\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enonceLock\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eUnlockAddr\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFrom\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esigned\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eerr\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esignTransaction\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ectx\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003epasswd\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eerr\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ecommon\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eHash\u003c/span\u003e\u003cspan class=\"p\"\u003e{},\u003c/span\u003e \u003cspan class=\"n\"\u003eerr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003esubmitTransaction\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ectx\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003esigned\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003ca href=\"https://github.com/myself659/go-ethereum/blob/eae63c511ceafab14b92e274c1b18bf1700e2d3d/internal/ethapi/api.go#L1105:6\"\u003eSendTxArgs\u003c/a\u003e的数据结构如下：\u003c/p\u003e","title":"以太坊提交交易流程分析"},{"content":"背景 苏格拉底说过：我唯一知道的就是我一无所知。\n我不知道 我不知道自己 我不知道过去 我不知道现在 我不知道未来 我不知道别人 我不知道变化 我不知道系统 我更不知道所有 我知道我不知道，所以我会犯错，我会坦然面对错误。\n我知道我不知道，怀疑一切，小心求证。\n我知道我不知道，心怀敬畏，不敢为天下先。\n我知道我不知道，面对现实，做好自己。\n我知道我不知道，避免做那个最愚蠢的人。\n应对我不知道 我们不是神，我不知道是正常，我不知道的远远多于我知道的。\n那么怎么应对我不知道呢？或者说努力让自己知道的多一点呢？\n相信世界是混沌与不确定性 将不知道作为驱动力来学习，实践与验证 发现事实与尊重客观规律 进行概率与可能性描述，分析，计算，预测 ","permalink":"https://myself659.github.io/post/rt/i-know-i-donot-known%E6%88%91%E4%B8%8D%E7%9F%A5%E9%81%93/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e苏格拉底说过：我唯一知道的就是我一无所知。\u003c/p\u003e\n\u003ch2 id=\"我不知道\"\u003e我不知道\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e我不知道自己\u003c/li\u003e\n\u003cli\u003e我不知道过去\u003c/li\u003e\n\u003cli\u003e我不知道现在\u003c/li\u003e\n\u003cli\u003e我不知道未来\u003c/li\u003e\n\u003cli\u003e我不知道别人\u003c/li\u003e\n\u003cli\u003e我不知道变化\u003c/li\u003e\n\u003cli\u003e我不知道系统\u003c/li\u003e\n\u003cli\u003e我更不知道所有\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e我知道我不知道，所以我会犯错，我会坦然面对错误。\u003c/p\u003e","title":"我不知道"},{"content":"推荐 Ethereum Virtual Machine Opcodes\nArithmetic Operations 1 2 3 4 5 6 7 8 9 10 11 12 ADD //Add the top two stack items MUL //Multiply the top two stack items SUB //Subtract the top two stack items DIV //Integer division SDIV //Signed integer division MOD //Modulo (remainder) operation SMOD //Signed modulo operation ADDMOD //Addition modulo any number MULMOD //Multiplication modulo any number EXP //Exponential operation SIGNEXTEND //Extend the length of a two’s complement signed integer SHA3 //Compute the Keccak-256 hash of a block of memory Stack Operations 1 2 3 4 5 6 7 8 9 10 POP //Remove the top item from the stack MLOAD //Load a word from memory MSTORE //Save a word to memory MSTORE8 //Save a byte to memory SLOAD //Load a word from storage SSTORE //Save a word to storage MSIZE //Get the size of the active memory in bytes PUSHx //Place x-byte item on the stack, where x can be any integer from 1 to 32 (full word) inclusive DUPx //Duplicate the x-th stack item, where x can be any integer from 1 to 16 inclusive SWAPx //Exchange 1st and (x+1)-th stack items, where x can by any integer from 1 to 16 inclusive Process Flow Operations 1 2 3 4 5 STOP //Halts execution JUMP //Set the program counter to any value JUMPI //Conditionally alter the program counter PC //Get the value of the program counter (prior to the increment corresponding to this instruction) JUMPDEST //Mark a valid destination for jumps System Operations 1 2 3 4 5 6 7 8 9 10 LOGx //Append a log record with +x+ topics, where +x+ is any integer from 0 to 4 inclusive CREATE //Create a new account with associated code CALL //Message-call into another account, i.e. run another account\u0026#39;s code CALLCODE //Message-call into this account with an another account’s code RETURN //Halt execution and return output data DELEGATECALL //Message-call into this account with an alternative account’s code, but persisting the current values for sender and value STATICCALL //Static message-call into an account REVERT //Halt execution reverting state changes but returning data and remaining gas INVALID //The designated invalid instruction SELFDESTRUCT //Halt execution and register account for deletion Logic Operations 1 2 3 4 5 6 7 8 9 10 11 LT //Less-than comparison GT //Greater-than comparison SLT //Signed less-than comparison SGT //Signed greater-than comparison EQ //Equality comparison ISZERO //Simple not operator AND //Bitwise AND operation OR //Bitwise OR operation XOR //Bitwise XOR operation NOT //Bitwise NOT operation BYTE //Retrieve a single byte from a full-width 256 bit word Environmental Operations 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 GAS //Get the amount of available gas (after the reduction for this instruction) ADDRESS //Get the address of the currently executing account BALANCE //Get the account balance of any given account ORIGIN //Get the address of the EOA that initiated this EVM execution CALLER //Get the address of the caller immediately responsible for this execution CALLVALUE //Get the ether amount deposited by the caller responsible for this execution CALLDATALOAD //Get the input data sent by the caller responsible for this execution CALLDATASIZE //Get the size of the input data CALLDATACOPY //Copy the input data to memory CODESIZE //Get the size of code running in the current environment CODECOPY //Copy the code running in the current environment to memory GASPRICE //Get the gas price specified by the originating transaction EXTCODESIZE //Get the size of any account\u0026#39;s code EXTCODECOPY //Copy any account’s code to memory RETURNDATASIZE //Get the size of the output data from the previous call in the current environment RETURNDATACOPY //Copy of data output from the previous call to memory Block Operations 1 2 3 4 5 6 BLOCKHASH //Get the hash of one of the 256 most recently completed blocks COINBASE //Get the block’s beneficiary address for the block reward TIMESTAMP //Get the block’s timestamp NUMBER //Get the block’s number DIFFICULTY //Get the block’s difficulty GASLIMIT //Get the block’s gas limit ","permalink":"https://myself659.github.io/post/solidity/solidity-evm-instructions/","summary":"\u003ch2 id=\"推荐\"\u003e推荐\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://ethervm.io/\"\u003eEthereum Virtual Machine Opcodes\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"arithmetic-operations\"\u003eArithmetic Operations\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eADD        //Add the top two stack items\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMUL        //Multiply the top two stack items\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSUB        //Subtract the top two stack items\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDIV        //Integer division\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSDIV       //Signed integer division\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMOD        //Modulo (remainder) operation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSMOD       //Signed modulo operation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eADDMOD     //Addition modulo any number\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMULMOD     //Multiplication modulo any number\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEXP        //Exponential operation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSIGNEXTEND //Extend the length of a two’s complement signed integer\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSHA3       //Compute the Keccak-256 hash of a block of memory\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"stack-operations\"\u003eStack Operations\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePOP     //Remove the top item from the stack\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMLOAD   //Load a word from memory\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMSTORE  //Save a word to memory\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMSTORE8 //Save a byte to memory\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSLOAD   //Load a word from storage\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSSTORE  //Save a word to storage\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMSIZE   //Get the size of the active memory in bytes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePUSHx   //Place x-byte item on the stack, where x can be any integer from 1 to 32 (full word) inclusive\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDUPx    //Duplicate the x-th stack item, where x can be any integer from 1 to 16 inclusive\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSWAPx   //Exchange 1st and (x+1)-th stack items, where x can by any integer from 1 to 16 inclusive\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"process-flow-operations\"\u003eProcess Flow Operations\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSTOP      //Halts execution\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJUMP      //Set the program counter to any value\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJUMPI     //Conditionally alter the program counter\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePC        //Get the value of the program counter (prior to the increment corresponding to this instruction)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJUMPDEST  //Mark a valid destination for jumps\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"system-operations\"\u003eSystem Operations\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLOGx          //Append a log record with +x+ topics, where +x+ is any integer from 0 to 4 inclusive\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCREATE        //Create a new account with associated code\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCALL          //Message-call into another account, i.e. run another account\u0026#39;s code\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCALLCODE      //Message-call into this account with an another account’s code\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRETURN        //Halt execution and return output data\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDELEGATECALL  //Message-call into this account with an alternative account’s code, but persisting the current values for sender and value\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSTATICCALL    //Static message-call into an account\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eREVERT        //Halt execution reverting state changes but returning data and remaining gas\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eINVALID       //The designated invalid instruction\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSELFDESTRUCT  //Halt execution and register account for deletion\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"logic-operations\"\u003eLogic Operations\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLT     //Less-than comparison\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGT     //Greater-than comparison\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSLT    //Signed less-than comparison\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSGT    //Signed greater-than comparison\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEQ     //Equality comparison\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eISZERO //Simple not operator\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAND    //Bitwise AND operation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOR     //Bitwise OR operation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eXOR    //Bitwise XOR operation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNOT    //Bitwise NOT operation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBYTE   //Retrieve a single byte from a full-width 256 bit word\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"environmental-operations\"\u003eEnvironmental Operations\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGAS            //Get the amount of available gas (after the reduction for this instruction)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eADDRESS        //Get the address of the currently executing account\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBALANCE        //Get the account balance of any given account\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eORIGIN         //Get the address of the EOA that initiated this EVM execution\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCALLER         //Get the address of the caller immediately responsible for this execution\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCALLVALUE      //Get the ether amount deposited by the caller responsible for this execution\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCALLDATALOAD   //Get the input data sent by the caller responsible for this execution\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCALLDATASIZE   //Get the size of the input data\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCALLDATACOPY   //Copy the input data to memory\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCODESIZE       //Get the size of code running in the current environment\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCODECOPY       //Copy the code running in the current environment to memory\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGASPRICE       //Get the gas price specified by the originating transaction\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEXTCODESIZE    //Get the size of any account\u0026#39;s code\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEXTCODECOPY    //Copy any account’s code to memory\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRETURNDATASIZE //Get the size of the output data from the previous call in the current environment\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRETURNDATACOPY //Copy of data output from the previous call to memory\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"block-operations\"\u003eBlock Operations\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBLOCKHASH  //Get the hash of one of the 256 most recently completed blocks\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCOINBASE   //Get the block’s beneficiary address for the block reward\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTIMESTAMP  //Get the block’s timestamp\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNUMBER     //Get the block’s number\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDIFFICULTY //Get the block’s difficulty\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGASLIMIT   //Get the block’s gas limit\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"EVM opcodes"},{"content":"相信很多人都知道，BFT(Byzantine fault tolerance)要求诚实节点数量大于总节点的三分之二。\n为什么会有这个要求？\n多数派原则 多数派原则在分布式系统很常见，即确保网络分化情况下的决议唯一。其原理是，假如节点总数是2f+1，那么一项决议得到多于f个节点赞成则获得通过。leader选举中，网络分化下，只有具有多数派节点的部分才可能选出leader。多数派还可以用于副本管理，根据实际情况调整写副本数和读副本数，在可靠性和性能之间取得平衡。 在分布式系统，无论paxos，还是raft，以投票来达成共识，在整个达成共识的过程中都遵守多数派原则。\n下面先看多数派原则在raft中应用。\nraft 假定f表示系统同时允许最大故障节点数量(f节点数量决定了系统可用性的概率)，在这种情况下，根据多数派原则，那么正常节点至少为f+1，即可以得出系统总节点数为2f+1。\nBFT 在Raft协议中假设所有节点都是诚实节点，而在BFT假定系统存在一些作恶节点。 那么一个BFT中最多允许有多少个作恶节点？\n进行逆向思考如下：\n假如系统有f个作恶节点，那么在多数派系统，不作恶节点至少有f+1个。 f+1节点能够满足吗？不可以，网络分区是一直都存在，结合raft上，那么不作恶节点至少为2f+1，从而可以得出总节点数3f+1个。\n参考 漫谈分布式系统、拜占庭将军问题与区块链 ","permalink":"https://myself659.github.io/post/distributed/distributed-bft/","summary":"\u003cp\u003e相信很多人都知道，BFT(Byzantine fault tolerance)要求诚实节点数量大于总节点的三分之二。\u003c/p\u003e\n\u003cp\u003e为什么会有这个要求？\u003c/p\u003e\n\u003ch1 id=\"多数派原则\"\u003e多数派原则\u003c/h1\u003e\n\u003cp\u003e多数派原则在分布式系统很常见，即确保网络分化情况下的决议唯一。其原理是，假如节点总数是2f+1，那么一项决议得到多于f个节点赞成则获得通过。leader选举中，网络分化下，只有具有多数派节点的部分才可能选出leader。多数派还可以用于副本管理，根据实际情况调整写副本数和读副本数，在可靠性和性能之间取得平衡。\n在分布式系统，无论paxos，还是raft，以投票来达成共识，在整个达成共识的过程中都遵守多数派原则。\u003c/p\u003e","title":"为什么BFT要求诚实节点数量大于总节点的三分之二"},{"content":"背景 为什么要刷leetcode？ 从两个方面可以展开说明。\n刷leetcode有什么好处？ 为什么可以做到刷leetcode？ 刷leetcode有什么好处？ 提高编程能力:LeetCode上的题目涵盖了许多算法和数据结构,可以通过刷题提高自己的编程能力，如锻炼快速编程与调试的能力与代码优化能力 2.准备面试:大多数IT与互联网公司的面试都会考算法题,LeetCode上面的题目是最接近面试题的练习\n拓展技术视野:LeetCode热门题目基本来自FLAG的具体业务场景\n查漏补缺,发现自己的知识盲区： 刷题过程中能找到不熟悉的知识点\n5.提高逻辑思维能力:算法题需要逻辑思维能力,刷题可以锻炼逻辑思维能力\n6.增强问题解决能力:刷题可以练就看到问题快速抽象建模的能力，进而提高解决问题的能力以及应用算法与数据结构的能力\n为什么可以做到刷leetcode？ 相比较于参与开源项目，对于大多数程序员来说，刷leetcode更简单，更容易做到。\n只有做到，我们才享受刷leetcode的好处。\n这是因为刷leetcode有以下特点：\n门槛低 leetcode每道题都有解 leetcode自带测试与反馈 leetcode一道题所花时间少，基本一道题半个小时左右，有利于养成习惯 leetcode有讨论社区与各种群组 leetcode这种通关模式有利于激起个人的兴趣与动力 ","permalink":"https://myself659.github.io/post/dsa/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%88%B7%E9%A2%98leetcode/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e为什么要刷leetcode？ 从两个方面可以展开说明。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e刷leetcode有什么好处？\u003c/li\u003e\n\u003cli\u003e为什么可以做到刷leetcode？\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"刷leetcode有什么好处\"\u003e刷leetcode有什么好处？\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e提高编程能力:LeetCode上的题目涵盖了许多算法和数据结构,可以通过刷题提高自己的编程能力，如锻炼快速编程与调试的能力与代码优化能力\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e2.准备面试:大多数IT与互联网公司的面试都会考算法题,LeetCode上面的题目是最接近面试题的练习\u003c/p\u003e","title":"为什么要刷leetcode"},{"content":"比特币生态 比特币生态有以下几个角色：\n比特币核心开发者，他们开发与更新比特币技术, 负责开发与维护代码 矿工们，运行区块链技术与算力保证，负责执行代码 交易所，比特币网络的IO,为整个网络的运行提供外部价值的IO 其中矿工有以下五宗罪，具体如下：\nIFO帮凶 从BCH开始，一时间多少IFO兴起，任何一个IFO背后都有矿工的支持。\n自私挖矿 这是矿工之间的作恶。\n滥用打包权 此路是我开，要想过此路，留下买路财。 表现如下：\n某矿池提供的交易加速器服务 明明可以打包1000条交易，实际只打一个交易 竞价排名 这个争议如同百度的竞价排名。\n算力集中与垄断 用图说话，前五位矿池的算力超过了51%。 小结 虽然比特币的生态系统有这些bug，也不能否认矿工的在比特币生态中的作用， 如同社会中在保证劳者有所，得能者多得。\n参考 全球算力分布 ","permalink":"https://myself659.github.io/post/blockchain/%E7%9F%BF%E5%B7%A5%E4%BA%94%E5%AE%97%E7%BD%AA/","summary":"\u003ch2 id=\"比特币生态\"\u003e比特币生态\u003c/h2\u003e\n\u003cp\u003e比特币生态有以下几个角色：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e比特币核心开发者，他们开发与更新比特币技术, 负责开发与维护代码\u003c/li\u003e\n\u003cli\u003e矿工们，运行区块链技术与算力保证，负责执行代码\u003c/li\u003e\n\u003cli\u003e交易所，比特币网络的IO,为整个网络的运行提供外部价值的IO\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e其中矿工有以下五宗罪，具体如下：\u003c/p\u003e","title":"矿工五宗罪"},{"content":"说明 希望通过痛点，爽点，痒点的分析，看看区块链是不是刚需？区块链在哪些场景下有迫切的需求？\n首先，先看看下面三个定义：\n痛点就是恐惧 爽点是即时满足 痒点是满足虚拟自我 （PS:上述三个定义来自产品大神梁宁的《产品思维30讲》）\n痛点 1. 数据共享 具体场景如下：\n银行征信数据共享，但是不想暴露原始数据 2. 隐私保护 具体场景如下：\n大数据“杀熟”不“杀生”，你还敢愉快地买买买吗 医疗数据共享，但是担心在共享过程中出现患者的隐私泄漏？ 3. 财富配置 典型的就是比特币，抗通胀需求，防止财富在法币大量放水的情况下被稀释(虽然价格变动大)，同时也是一种新形式的财富配置方式。\n4. 信任 这里举一个失出信任的反面例子。自从三鹿奶粉事件，国产奶粉失出了国内民众的信任，所以贝因美的商业悲剧：卖29套房都无法填补亏损！又一巨头陨落。 贝因美是否可以通过区块链重新得到国内的民众的信任。\n5. 内容保护 现在技术与产品还不成熟，如果有哪一家解决了内容保护内容，相信很多的内容创造者会投身该平台上。\n6. 去中心化信任 基于区块链的赌博等应用。\n爽点 1. 减少欺诈 这里主要利用区块链不可篡改，公开帐本特性，具体应用主要如下：\n存证 溯源 2.降低成本，提高效率 主要场景如下：\n迅雷网心通过玩客云可以提供低成本的CDN服务 通过比特币进行跨国转帐 Filecoin等类似项目 基于区块链共享项目 PowerLedger 3. 全球化 全球化，这就意味着潜在用户是60亿。这种威力如何？想想以太坊吧，从2015年上市，短短两年多市值最高突破1000亿美元，再拿出百度作个对比，百度成立于1998年，迄今为止百度的市值从没有突破过1000亿美元吧。\n4. 抗监管 比特币的市场就说明一些人的特定需求，如大家都懂的洗钱等等\n痒点 1. ICO 如果在国内不禁止，估计有更多的人投入到ICO中，为什么呢？ICO前期造富运动，满足很多人对一夜暴富的强烈愿望。\n个人能力有限加上区块链应用领域十分广泛，上面并没有一一俱到，不足与错误欢迎指正。(PS: 币圈一日，世上一年，更有各种新技术层出不穷，需要深入学习，恕没有展开说明，更多应用参考下图)\n(To be continue)\n参考 天猫 88VIP 大数据杀熟事件发酵，只能说阿里的反侦察技术做的太烂，被用户发现了 ","permalink":"https://myself659.github.io/post/blockchain/blockchain-pain-happy-itchy/","summary":"\u003ch1 id=\"说明\"\u003e说明\u003c/h1\u003e\n\u003cp\u003e希望通过痛点，爽点，痒点的分析，看看区块链是不是刚需？区块链在哪些场景下有迫切的需求？\u003c/p\u003e\n\u003cp\u003e首先，先看看下面三个定义：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e痛点就是恐惧\u003c/li\u003e\n\u003cli\u003e爽点是即时满足\u003c/li\u003e\n\u003cli\u003e痒点是满足虚拟自我\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e（PS:上述三个定义来自产品大神梁宁的《产品思维30讲》）\u003c/p\u003e","title":"从痛点，爽点，痒点看区块链"},{"content":"USDT可信吗？ 技术上可信，但是取决于背后公司的实力背书。更多可以参考reddit 讨论\n从现在的情况USDT并不可信，长期持有USDT有风险。\nUSDT发行是可控吗？ USDT发行泰达公司掌握，缺少有效监管与审计。这样会导致USDT与美元的准备金并不是1：1，很有可能是1：0.1。\nUSDT有什么风险？ 存在一定的风险，参考钱宝。\nUSDT为什么会有小幅波动？ 这个其实我也不知道。 不知道那就只能猜了，个人猜测如下： 猜测之下，首先需要了解USDT的价格等于美元准备金之和除以USDT总量之间。 由于买入USDT与卖出USDT并不是在同一个交易中完成，分别在不同的交易的完成。 波动存在原因是买入USDT与卖出USDT并不是平衡。 小幅波动是因为上面的不平衡占整个USDT总量的比例极小。\nUSDT对比特币有什么影响？ 寄生在比特币之上 抢占比特币有限的交易速度 为比特币提供了法币的通道 为矿工提供了矿工费来源 破坏了比特币专注于支付网络的初衷 增长了帐本的空间 USDT可能存在钱宝一样的风险，如果USDT出现信用崩溃，那整个数字货币市场会出现一个不小的窟窿，城门失火，殃及池鱼 USDT会崩溃吗？ 在以下情况下存在这种可能：\n数字货币市场大量数字货币提现美元，冲击Tether准备金 公司跑路 USDT大量的需求，但是背后的公司不能做到1：1准备金 缺少有效地监管，各种不合规操作 USDT的交易成本？ USDT的交易实际是一次比特币交易，以gate.io为例，买入USDT收取了费用，提取USDT收取了一定费用。\nUSDT在交易所交易是否会收费？ 在交易所交易并没有进行真正的比特币转帐，而由交易所按照比例（如0.1%）收取双方交易费。\n怎么降低USDY交易费用？ 减少买入或提现次数。作好计划与安排，一次尽可能多地买入或提取。\nUSDT是怎么赚钱呢？ 提供了法币之间的通道，充当稳定等价物，在买入与卖出中收取费用。\n参考 USDT 幕后团队公频录音曝光：承认欺诈，涉嫌超发和操纵市场 重磅调查：危险的USDT丨钛媒体深度 ","permalink":"https://myself659.github.io/post/defi/usdt-faq/","summary":"\u003ch3 id=\"usdt可信吗\"\u003eUSDT可信吗？\u003c/h3\u003e\n\u003cp\u003e技术上可信，但是取决于背后公司的实力背书。更多可以参考\u003ca href=\"https://www.reddit.com/r/Tether/comments/7v1wdd/why_i_dont_trust_tether_terms_of_service_etc/\"\u003ereddit 讨论\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e从现在的情况USDT并不可信，长期持有USDT有风险。\u003c/p\u003e\n\u003ch3 id=\"usdt发行是可控吗\"\u003eUSDT发行是可控吗？\u003c/h3\u003e\n\u003cp\u003eUSDT发行泰达公司掌握，缺少有效监管与审计。这样会导致USDT与美元的准备金并不是1：1，很有可能是1：0.1。\u003c/p\u003e","title":"USDT FAQ"},{"content":"OP_RETURN 在进入正题前，我们需要了解比特币脚本OP_RETURN。\nOP_RETURN是比特币0.9版本引入支持一种新的操作符，目的是允许开发者在交易上输出增加40个字节自定义的非交易数据。更多详细信息参考OP_RETURN wiki\nUSDT USDT又名Tether，通过Tether提供1：1美元兑换服务，为法币与数字货币提供兑换服务。 国内交易所关闭后，国内玩币的人都知道，这里不过多介绍。\n架构 各层介绍如下：\n比特币区块链层，主要实现Tether分布式帐本功能。Tether交易信息通过OP_RETURN保存在比特币的分布式帐本中。\nOmni协议层，Omni协议层主要功能如下：\n创建与销毁USDT 提供OmniApi 跟踪Tether流通，通过Omnichest.info提供区块链浏览器功能 支持用户交易与保存Tether(USDT) Tether业务层，Tether业务层主要功能如下：\n法币兑换Tether(USDT) Tether(USDT)兑换法币 监管流通中Tether(USDT) 流程 这里与普通交易所的流程类似。法币兑换USDT，发放相应USDT,USDT兑换法币，回收USDT。\n交易 具体看一个交易吧。\n先上图：\n主要看交易的输入与输出，这里关注点主要在输出，为什么输出有三个呢？ 第一个很容易理解，表示找零 第二个表示什么呢？表示转帐对方的地址，具体参考wiki 第三个OP_RETURN用于存储Tether部分转帐信息\n图中的0x155十六进对应十进制341，在染色币的体系中对应类型表示Tether，具体参考染色币列表。 转帐的数量在哪里体现呢？转帐数字为000002ba7def3000，占用8个字节。对应十进制数字结果为：\n1 2 \u0026gt;\u0026gt;\u0026gt; int(\u0026#39;0x000002ba7def3000\u0026#39;,16) 3000000000000L 图中显示的Tether的交易的信息，这些交易信息来自比特币交易信息。\nomni封装OP_RETURN信息代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 UniValue omni_createpayload_simplesend(const UniValue\u0026amp; params, bool fHelp) { if (fHelp || params.size() != 2) throw runtime_error( \u0026#34;omni_createpayload_simplesend propertyid \\\u0026#34;amount\\\u0026#34;\\n\u0026#34; \u0026#34;\\nCreate the payload for a simple send transaction.\\n\u0026#34; \u0026#34;\\nArguments:\\n\u0026#34; \u0026#34;1. propertyid (number, required) the identifier of the tokens to send\\n\u0026#34; \u0026#34;2. amount (string, required) the amount to send\\n\u0026#34; \u0026#34;\\nResult:\\n\u0026#34; \u0026#34;\\\u0026#34;payload\\\u0026#34; (string) the hex-encoded payload\\n\u0026#34; \u0026#34;\\nExamples:\\n\u0026#34; + HelpExampleCli(\u0026#34;omni_createpayload_simplesend\u0026#34;, \u0026#34;1 \\\u0026#34;100.0\\\u0026#34;\u0026#34;) + HelpExampleRpc(\u0026#34;omni_createpayload_simplesend\u0026#34;, \u0026#34;1, \\\u0026#34;100.0\\\u0026#34;\u0026#34;) ); uint32_t propertyId = ParsePropertyId(params[0]); RequireExistingProperty(propertyId); int64_t amount = ParseAmount(params[1], isPropertyDivisible(propertyId)); std::vector\u0026lt;unsigned char\u0026gt; payload = CreatePayload_SimpleSend(propertyId, amount); return HexStr(payload.begin(), payload.end()); } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 std::vector\u0026lt;unsigned char\u0026gt; CreatePayload_SimpleSend(uint32_t propertyId, uint64_t amount) { std::vector\u0026lt;unsigned char\u0026gt; payload; uint16_t messageType = 0; uint16_t messageVer = 0; mastercore::swapByteOrder16(messageType); mastercore::swapByteOrder16(messageVer); mastercore::swapByteOrder32(propertyId); mastercore::swapByteOrder64(amount); PUSH_BACK_BYTES(payload, messageVer); PUSH_BACK_BYTES(payload, messageType); PUSH_BACK_BYTES(payload, propertyId); PUSH_BACK_BYTES(payload, amount); return payload; } 小结 USDT并没有自己的公有链，而是在比特币交易交易中利用比特币OP_RETURN来保存USDT交易信息。 逻辑上两条链，数据上一条链 USDT钱包地址与比特币地址等同 USDT转帐实际上bitcoin转帐（明白了在人民币与美元汇率为6.3情况下，为什么一个USDT的价格7元左右吧） （Ps：了解USDT的技术原理，后面会从经济与商业的角度分析一下USDT）\n参考 tether Api TetherWhitePaper omnicore OP_RETURN 比特币浏览器 Tether浏览器 OP_RETURN是区块链可扩展性的克星 omnilayer omni_gettransaction 比特币浏览器 populateRPCTransactionObject Proposed Standard for Bitcoin Assets ","permalink":"https://myself659.github.io/post/defi/usdt%E6%8A%80%E6%9C%AF%E5%8E%9F%E7%90%86/","summary":"\u003ch1 id=\"op_return\"\u003eOP_RETURN\u003c/h1\u003e\n\u003cp\u003e在进入正题前，我们需要了解比特币脚本OP_RETURN。\u003c/p\u003e\n\u003cp\u003eOP_RETURN是比特币0.9版本引入支持一种新的操作符，目的是允许开发者在交易上输出增加40个字节自定义的非交易数据。更多详细信息参考\u003ca href=\"https://en.bitcoin.it/wiki/OP_RETURN\"\u003eOP_RETURN wiki\u003c/a\u003e\u003c/p\u003e","title":"USDT背后的技术原理"},{"content":"前言 随着数字货币大涨，带来区块链热潮，作为在这个风口的一员，也试图思考区块链与未来与战略。受埃隆·马斯克的影响：不要给自己设限，要作超出自己能力与职责范围内的事情，扩展能力的边界。梦想总是要有的，万一实现了呢。那么先假定区块链行业没有权威。\n原则 这里套用百万月薪的任泽平的表达：房地产行业，长期看人口、中期看土地、短期看金融。 区块链的发展，短期看底层技术，中期看应用场景，长期看改造社会。\n用户 这是用户侧的思考。\nDID，例如美图的区块链白皮书所提到的内容。\n钱包，如基于钱包提供 WAAS（wallet as a service）服务。\n链 从类的类型划分可以分为公有链与联盟链（私有链暂不考虑）。\n公有链 这里有两个方向 ，第一个方向第三代区块链平台竞争，这里面有太多的竞争对手。 这里面有太多的选手角着。\n基于第三代区块链开发头部应用，头部应用有哪些？这里不展开，欢迎大家来与我交流与讨论。\n第二个方向是打造行业公有链，具体列举如下：\n能源行业，例如能源链powerledger 视频行业 内容行业 联盟链 第一种是开发像IBM hyperledger那种。\n从链的角色上看，可以有两种战略选择：\nX+区块链 区块链+X X+区块链 区块链是技术与工具。 例如存证与溯源\n区块链+X 区块链作为平台或者基础设施。像比特币成为一个数字黄金，一个交易网络。\n有钱愿意投入 如果认为区块链是未来，但是落地细节不能把握，也没有关系，准备钱，找到合适人就可以，然后保持耐心，耐得住寂寞，准备好本钱，穿越牛熊。\n头部应用 选择一个不断扩展区块链平台，开发头部应用的Dapp。\n结论 如果公司有能力，如果业务与场景需要，开发自己的公链是最好的选择。主要原因是公链是面向全球市场，空间最大。\n一个资金充足的企业，如果投入一个10到20人小团队（要求吗，就是每个人都能独立干好活，当然有顶尖人才那更好了）。一年投入一到二千万就可以搞起来了，快的话也就半年吧。\n参考 Decentralized Digital Identities and Blockchain – The Future as We See It 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/blockchain/blockchain-strategy/","summary":"\u003ch1 id=\"前言\"\u003e前言\u003c/h1\u003e\n\u003cp\u003e随着数字货币大涨，带来区块链热潮，作为在这个风口的一员，也试图思考区块链与未来与战略。受埃隆·马斯克的影响：不要给自己设限，要作超出自己能力与职责范围内的事情，扩展能力的边界。梦想总是要有的，万一实现了呢。那么先假定区块链行业没有权威。\u003c/p\u003e","title":"乱扯区块链战略"},{"content":"战略地位 基于区块链的价值互联网，离不开token经济。数字货币钱包在整个区块链生态的地位如同互联网的支付宝与微信支付。其重要性不用多说了。\n功能 从价值的角度来看，主要有以下三个功能：\n价值确权 价值存储 价值IO 价值IO，以Wallet as a Service方式有以下业务：\n金融（理财，期货等等） 交易（接入去中心化交易，中心化交易所，场外交易） Dapp平台，支持第三方Dapp接入 本质 从技术上看，本质上是私钥，私钥，私钥。重要的事情说三遍。\n价值确权通过私钥来完成，谁拥有私钥谁就拥有对应的价值。\n价值存储就是存储私钥。\n价值IO对应的功能都需要私钥配合实现。\n分类 数字货币钱包从形态有如下类型：\n硬件钱包，如Trezo 移动App，如imtoken，bitpay，58wallet Web网站，如myetherwallet 浏览器扩展应用，如MetaMask 桌面应用程序 中心化交易所 代码，完成私钥管理与交易功能即可 从私钥是否连网可以分为：\n冷钱包 不联网 热钱包 联网 安全 钱包的安全性无须多说。\n钱包的安全性由用户自己负责。\n最重要理解原理，提高安全意识。\n钱包与交易所 钱包+撮合引擎=交易所\n附加功能 IM 资讯 行情 增值服务 （PS: 币圈一日，世上一年，更有各种新技术层出不穷，需要深入学习，恕没有展开说明，望见谅）。\n参考 Choose your Bitcoin wallet 比特币冷热钱包教学 知乎：比特币用哪一种钱包比较靠谱，如何保障交易安全？ ","permalink":"https://myself659.github.io/post/blockchain/blockchain-digit-wallet/","summary":"\u003ch1 id=\"战略地位\"\u003e战略地位\u003c/h1\u003e\n\u003cp\u003e基于区块链的价值互联网，离不开token经济。数字货币钱包在整个区块链生态的地位如同互联网的支付宝与微信支付。其重要性不用多说了。\u003c/p\u003e\n\u003ch1 id=\"功能\"\u003e功能\u003c/h1\u003e\n\u003cp\u003e从价值的角度来看，主要有以下三个功能：\u003c/p\u003e","title":"谈谈数字货币钱包"},{"content":"Less is more 少即是多。\n人生需要做减法。\n在开始减法之前，我们需要一个减法清单。\n减法清单 不健康的生活方式与习惯\n短视与短期心态\n空想，幻想，妄想\n借口与抱怨\n封闭与拒绝改变的心态\n侥幸心理\n完美\n贪婪\n控制欲\n迎合他人\n身边的烂人\n多任务的工作模式\n依赖\n承诺\n拖延\n嫉妒\n仇恨\n活在过去\n做无用功如投入到不必要的事情上面\n及时满足\n","permalink":"https://myself659.github.io/post/life/%E4%BA%BA%E7%94%9F%E5%87%8F%E6%B3%95%E6%B8%85%E5%8D%95/","summary":"\u003ch2 id=\"less-is-more\"\u003eLess is more\u003c/h2\u003e\n\u003cp\u003e少即是多。\u003c/p\u003e\n\u003cp\u003e人生需要做减法。\u003c/p\u003e\n\u003cp\u003e在开始减法之前，我们需要一个减法清单。\u003c/p\u003e\n\u003ch2 id=\"减法清单\"\u003e减法清单\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e不健康的生活方式与习惯\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e短视与短期心态\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e空想，幻想，妄想\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e借口与抱怨\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e封闭与拒绝改变的心态\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e侥幸心理\u003c/p\u003e","title":"人生减法清单"},{"content":"认识自己 老子在《道德经》里说：“知人者智，自知者明。”\n孙子在《孙子兵法》里说：“知已知彼，百战不殆。”\n认识自己，才能成为更好的自己。\n问题清单 你真正想要的是什么？\n你愿意牺牲什么来得到你想要的东西？\n你真正感兴趣的是什么？\n你真正擅长的是什么？\n你关键的弱点是什么？\n你的三观（世界观，人生观，价值观）是什么？\n你的方法论是什么？\n什么能让你开心快乐？\n你对什么充满好奇与兴奋？\n什么让你懒惰与拖延？\n如何让自己充满动力且自我驱动？\n你真实能力与实力是怎么样？\n你最适合哪种环境？\n你需要什么样的合作伙伴？\n你与目标的距离与差距有哪些？\n你眼中的自己与别人眼中的你有什么不同与差别？\n","permalink":"https://myself659.github.io/post/life/%E8%AE%A4%E8%AF%86%E8%87%AA%E5%B7%B1%E7%9A%84%E9%97%AE%E9%A2%98%E6%B8%85%E5%8D%95/","summary":"\u003ch2 id=\"认识自己\"\u003e认识自己\u003c/h2\u003e\n\u003cp\u003e老子在《道德经》里说：“知人者智，自知者明。”\u003c/p\u003e\n\u003cp\u003e孙子在《孙子兵法》里说：“知已知彼，百战不殆。”\u003c/p\u003e\n\u003cp\u003e认识自己，才能成为更好的自己。\u003c/p\u003e\n\u003ch2 id=\"问题清单\"\u003e问题清单\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e你真正想要的是什么？\u003c/p\u003e","title":"认识自己的问题清单"},{"content":"说明 本文采用对比思维来比较货币与比特币。\n整个内容通过问答的方式进行。\n货币 问题：为什么需要货币？ 在国内充当交易等价物 解决国际贸易中不同种类的货币如何相互兑换的问题 因为信贷的需要 问题：谁可以发行货币？ 各国央行（美国对应是美联储）。这里先必须强调，央行唯一发行的单位。\n问题：央行发行货币的方式有哪些？ 以中国为例，央行发行货币有以下三种方式：\n向商业银行提供货款 以本国法币兑换挣回来的外汇 向政府或者国有企业等单位提供借款 问题：货币的发行量怎么确定？ 具体理论模型： M = PQ/V\n其中M指流通中所需货币量（通货量） 其中P指商品的平均价格 其中Q指商品数量 其中V指货币流通速度（以货币周转次数计）\n如何设定于P,Q,V的值取决于政策与策略，反正是一件很复杂的事情。\n这里举两个乱发货币的典型（过于超发货币，是自寻死路，会造成信用破产）：\n国共内战的国民党 津巴布韦 货币发行控制权在央行手中。\n问题：货币发行以什么作为背书？ 国家实力，无论是早期的英镑还是现在的美元。\n比特币 问题：为什么需要比特币？ 存在即合理。比特币的一些特性满足市场的需求。\n问题：谁可以发行比特币？ 在比特币被挖完之前，通过竞争，成功获取记帐权的矿工可以发行比特币。\n问题：发行比特币的方式有哪些？ 总量设定，通过挖矿定时释放的方式。整个发行控制权由代码控制，外人一般无法更改。\n问题：比特币的发行量怎么确定？ 比特币总量2100万。更多参考Controlled supply\n问题：比特币以什么作为背书？ 比特币背后的区块链技术及其支持区块链技术运行且保证整个比特币系统安全的算力。\n问题：比特币是货币吗？ 不是。从功能上看有部分货币的功能，在法律上看肯定不是，没有国家背书，从应用上看，价格不稳定，没有建立起（比特）币本位的大量共识，价格还是以各国法币来计算，所以把比特币作为数字黄金。\nPS: 初学经济学，有不足与错误敬请指正。\n参考 《货币的非国家化》 (End)\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/blockchain/%E4%BB%8E%E8%B4%A7%E5%B8%81%E8%A7%92%E5%BA%A6%E7%9C%8B%E6%AF%94%E7%89%B9%E5%B8%81/","summary":"\u003ch1 id=\"说明\"\u003e说明\u003c/h1\u003e\n\u003cp\u003e本文采用对比思维来比较货币与比特币。\u003c/p\u003e\n\u003cp\u003e整个内容通过问答的方式进行。\u003c/p\u003e\n\u003ch1 id=\"货币\"\u003e货币\u003c/h1\u003e\n\u003ch2 id=\"问题为什么需要货币\"\u003e问题：为什么需要货币？\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e在国内充当交易等价物\u003c/li\u003e\n\u003cli\u003e解决国际贸易中不同种类的货币如何相互兑换的问题\u003c/li\u003e\n\u003cli\u003e因为信贷的需要\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"问题谁可以发行货币\"\u003e问题：谁可以发行货币？\u003c/h2\u003e\n\u003cp\u003e各国央行（美国对应是美联储）。这里先必须强调，央行唯一发行的单位。\u003c/p\u003e","title":"从货币的角度看比特币"},{"content":"具体以公司及产品划分。\n腾讯 打通帐号系统，如qq与微信在其他腾讯产品的功能不一致 微信 整理未读信息，而不是让用户去找哪条信息未读，特别是存在大量的会话的情况 公众帐号平台写作支持从本地导入markdown功能 公众帐号与小程序帐号能否统一 微信电脑公众帐号阅读窗口应该作更多功能的，提高更好的用户体验，如支持搜索，字体放大，这个窗口应该按浏览器的标准来一步一步完善 微信视频号付费直播增加收费方式：1.按时长计费的方式，2.会员制度 微信读书 搞一个微信读书版的kiddle吧 腾讯云 优化一下linux包下载速度，直接走内部镜像 增加golang的api 微博 支持像twitter那样截图直接上传功能 继续像twitter学习，让用户来决定关注什么 (Tips: 建议用户遇到这种情况，直接将被动主动帐号屏蔽) 百度 hao123 让hao123回到它最初的形式 搜索 收录网站体验太差了，与google，bing比较这方面相差10倍以上 贴吧广告太多，自作死，支持内容电商也比插入广告要好 字节跳动 今日头条 希望推荐算法不止是迎合用户还有引导用户 飞聊 飞聊应该与今日头条打通，让头条号作者与读者之间更高层次的互动 lark 网络优化：打开在线文档的速度要优化 文档功能：向腾讯文档靠齐 网易 网易云音乐 ios版本闪退问题需要加快解决，概率达到百分之一吧 支持opus格式 (未完，持续更新)\n","permalink":"https://myself659.github.io/post/suggests-for-chinese-internet-productions/","summary":"\u003cp\u003e具体以公司及产品划分。\u003c/p\u003e\n\u003ch1 id=\"腾讯\"\u003e腾讯\u003c/h1\u003e\n\u003col\u003e\n\u003cli\u003e打通帐号系统，如qq与微信在其他腾讯产品的功能不一致\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"微信\"\u003e微信\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e整理未读信息，而不是让用户去找哪条信息未读，特别是存在大量的会话的情况\u003c/li\u003e\n\u003cli\u003e公众帐号平台写作支持从本地导入markdown功能\u003c/li\u003e\n\u003cli\u003e公众帐号与小程序帐号能否统一\u003c/li\u003e\n\u003cli\u003e微信电脑公众帐号阅读窗口应该作更多功能的，提高更好的用户体验，如支持搜索，字体放大，这个窗口应该按浏览器的标准来一步一步完善\u003c/li\u003e\n\u003cli\u003e微信视频号付费直播增加收费方式：1.按时长计费的方式，2.会员制度\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"微信读书\"\u003e微信读书\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e搞一个微信读书版的kiddle吧\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"腾讯云\"\u003e腾讯云\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003cdel\u003e优化一下linux包下载速度，直接走内部镜像\u003c/del\u003e\u003c/li\u003e\n\u003cli\u003e增加golang的api\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"微博\"\u003e微博\u003c/h1\u003e\n\u003col\u003e\n\u003cli\u003e支持像twitter那样截图直接上传功能\u003c/li\u003e\n\u003cli\u003e继续像twitter学习，让用户来决定关注什么 (Tips: 建议用户遇到这种情况，直接将被动主动帐号屏蔽)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"百度\"\u003e百度\u003c/h1\u003e\n\u003ch2 id=\"hao123\"\u003ehao123\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e让hao123回到它最初的形式\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"搜索\"\u003e搜索\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e收录网站体验太差了，与google，bing比较这方面相差10倍以上\u003c/li\u003e\n\u003cli\u003e贴吧广告太多，自作死，支持内容电商也比插入广告要好\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"字节跳动\"\u003e字节跳动\u003c/h1\u003e\n\u003ch2 id=\"今日头条\"\u003e今日头条\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e希望推荐算法不止是迎合用户还有引导用户\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"飞聊\"\u003e飞聊\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e飞聊应该与今日头条打通，让头条号作者与读者之间更高层次的互动\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"lark\"\u003elark\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e网络优化：打开在线文档的速度要优化\u003c/li\u003e\n\u003cli\u003e文档功能：向腾讯文档靠齐\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"网易\"\u003e网易\u003c/h1\u003e\n\u003ch2 id=\"网易云音乐\"\u003e网易云音乐\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eios版本闪退问题需要加快解决，概率达到百分之一吧\u003c/li\u003e\n\u003cli\u003e支持opus格式\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e(未完，持续更新)\u003c/p\u003e","title":"对中国互联网产品的一些建议"},{"content":"前言 Google作为全球最大的搜索引擎，Google是我最好的老师。那么更好的利用这个老师呢？下面分享一些常用google搜索技巧。\nTips 准确匹配关键词组合 1 \u0026#34;ethereum dapps \u0026#34; 关键词and/or组合 1 \u0026#34;bitcoin and ethereum\u0026#34; 关键词+组合 1 JavaScript Oops+React 关键词排除 1 python -tutorial 使用*实现通配关键词 1 how to do * in python 相似词 1 ~ethernum 找相似网站 1 related: medium.com 指定搜索网站 1 ethernum mining site: medium.com 1 site: github.com \u0026#34;api_token\u0026#34; 指定搜索文件类型范围 1 solidity filetype: pdf,ppt 更多文件类型参考\n指定搜索的时间范围 1 blockchain futrue after:2018-1-1 1 blockchain futrue before:2018-1-1 hashtags 1 #kobe 指定主题 1 define: smart contract 1 definition nft range 1 solidity in 2016….2018 1 camera $50..$100 search 1 search:medium.com blockchain 1 search:w3schools.com javascript arrays cache 1 cache: erc721 参考 Google 高级图片搜索 Google Guide Google Trend Google 财经 ","permalink":"https://myself659.github.io/post/data/google-search-tips/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003eGoogle作为全球最大的搜索引擎，Google是我最好的老师。那么更好的利用这个老师呢？下面分享一些常用google搜索技巧。\u003c/p\u003e\n\u003ch2 id=\"tips\"\u003eTips\u003c/h2\u003e\n\u003ch3 id=\"准确匹配关键词组合\"\u003e准确匹配关键词组合\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026#34;ethereum dapps \u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"关键词andor组合\"\u003e关键词and/or组合\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026#34;bitcoin and ethereum\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"关键词组合\"\u003e关键词+组合\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJavaScript Oops+React\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"关键词排除\"\u003e关键词排除\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython -tutorial\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"使用实现通配关键词\"\u003e使用*实现通配关键词\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehow to do * in python\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"相似词\"\u003e相似词\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e~ethernum\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"找相似网站\"\u003e找相似网站\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erelated:  medium.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"指定搜索网站\"\u003e指定搜索网站\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eethernum mining site: medium.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esite: github.com  \u0026#34;api_token\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"指定搜索文件类型范围\"\u003e指定搜索文件类型范围\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esolidity filetype: pdf,ppt  \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e更多文件类型\u003ca href=\"http://www.googleguide.com/file_type.html\"\u003e参考\u003c/a\u003e\u003c/p\u003e","title":"google search tips"},{"content":"Golang Let\u0026rsquo;s Talk Locks! Maintaining the Go Crypto Libraries Blockchain CoinTalk Arch Life of a Packet through Istio Algorithms behind Modern Storage Systems Aurora Serverless: The Good, the Bad and the Scalable rust How Rust Views Tradeoffs Rust\u0026rsquo;s Journey to Async/await More infoq Presentations ","permalink":"https://myself659.github.io/post/tech-english-collection/","summary":"\u003ch2 id=\"golang\"\u003eGolang\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://www.infoq.com/presentations/go-locks/\"\u003eLet\u0026rsquo;s Talk Locks!\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.infoq.com/presentations/go-crypto-library/\"\u003eMaintaining the Go Crypto Libraries\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"blockchain\"\u003eBlockchain\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/@cointalk.show\"\u003eCoinTalk\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"arch\"\u003eArch\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://www.infoq.com/presentations/life-packet-istio/\"\u003eLife of a Packet through Istio\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.infoq.com/presentations/storage-algorithms/\"\u003eAlgorithms behind Modern Storage Systems\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.jeremydaly.com/aurora-serverless-the-good-the-bad-and-the-scalable/\"\u003eAurora Serverless: The Good, the Bad and the Scalable\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"rust\"\u003erust\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://www.infoq.com/presentations/rust-tradeoffs/\"\u003eHow Rust Views Tradeoffs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.infoq.com/presentations/rust-2019\"\u003eRust\u0026rsquo;s Journey to Async/await\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"more\"\u003eMore\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://www.infoq.com/transcripts/presentations/\"\u003einfoq Presentations\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e","title":"英文学习材料"},{"content":"array define An array is collection of items stored at contiguous memory locations. The idea is to store multiple items of same type together. This makes it easier to calculate the position of each element by simply adding an offset to a base value, i.e., the memory location of the first element of the array (generally denoted by the name of the array).\ncomplexity space O(n)\ntime write by index write by index: O(1)\nread by index read by index: O(1)\nsearch worst case: O(n)\nbest case: O(1)\naverage: O(n/2)\nsort details in the below picture：\nadvantage Arrays have better cache locality that can make a pretty big difference in performance. In addition memory utilization is inefficient in the array. Conversely, memory utilization is efficient in the linked list. The requirement of memory is less due to actual data being stored within the index in the array. As against, there is a need for more memory in Linked Lists due to storage of additional next and previous referencing elements. Accessing an element in an array is fast, while Linked list takes linear time, so it is quite a bit slower. disadvantage The size of the arrays is fixed. Inserting a new element in an array of elements is expensive. the same as delete a element. In addition memory utilization is inefficient in the array. Conversely, memory utilization is efficient in the linked list. list define a Linked list is a linear collection of data elements, whose order is not given by their physical placement in memory. Instead, each element points to the next one .\na Linked list is a collection of some link nodes, which are not contiguous im in memory like the array. Instead, each node points to the next.\nspace O(n)\ntime no index\nadd add: O(1)\ndelete by list node O(1)\ndelete by value： worst case: O(n)\nbest case: O(1)\naverage: O(n/2)\nsearch worst case: O(n)\nbest case: O(1)\naverage: O(n/2)\nadvantage Dynamic size. Ease of insertion/deletion. disadvantage Random access is not allowed. We have to access elements sequentially starting from the first node. So we cannot do a binary search with linked lists. Extra memory space for a pointer is required with each element of the list. Arrays have better cache locality that can make a pretty big difference in performance. refence Introduction to Arrays Array data structure Linked List vs Array Binary Tree Data Structure 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/dsa/array-vs-list/","summary":"\u003ch1 id=\"array\"\u003earray\u003c/h1\u003e\n\u003ch2 id=\"define\"\u003edefine\u003c/h2\u003e\n\u003cp\u003eAn array is collection of items stored at contiguous memory locations.\nThe idea is to store multiple items of same type together.\nThis makes it easier to calculate the position of each element by simply adding an offset to a base value, i.e., the memory location of the first element of the array (generally denoted by the name of the array).\u003c/p\u003e\n\u003ch2 id=\"complexity\"\u003ecomplexity\u003c/h2\u003e\n\u003ch3 id=\"space\"\u003espace\u003c/h3\u003e\n\u003cp\u003eO(n)\u003c/p\u003e\n\u003ch3 id=\"time\"\u003etime\u003c/h3\u003e\n\u003ch4 id=\"write-by-index\"\u003ewrite by index\u003c/h4\u003e\n\u003cp\u003ewrite by index: O(1)\u003c/p\u003e","title":"array vs list"},{"content":"中心化交易所 先从中心化交易所说起，从本质上看数字货币交易所与生活中常见的股票交易是一样。整个交易系统的核心是：撮合引擎。其中撮合系统核心原则如下：\n队列顺序价格优先、同价格下时间优先\n撮合顺序及要求：时间优先，条件判断（ 撮合引擎接收到新的买入订单,则会到卖出队列的头部查找是否存在符合价格规则的卖出订单,如果存在卖出价格小于或等于买入价格的订单,则从队列中取出此订单并撮合成一笔交易;如果卖出队列为空或队列头部不满足价格关系,则将买入订单插入买入队列中,由于买入队列是按照价格与时间先后进行排序,所以新插入的订单会经过一次排序插入到买入队列的相应位置。）\n提到上面这些原则，不是为了引入如何设计一个撮合系统的话题，而是通过上面的原则认识到：撮合引擎属于中心化计算与处理。正如我常说一句话：控制要作集中式，业务要作分布式。\n去中心化交易所 由于中心化交易所各种缺点：\n暗箱操作 存在跑路风险 政府的管制 资产托管风险 安全问题，例如黑客盗币 坚守自盗 去中心化交易具有以下优点：\n更加安全 更好流通性 简单便捷 资产可控 这里下结论：去中心化交易所才是未来。\n去中心化交易所现在处于战国七雄争霸时代，未来格局会是怎么样，需要继续观察与跟进。 下面就0x与KyberNetwork展开说明。\n0x 目标与定位 0x目标是建立公共开放的交易协议，将协议层和应用层解耦\n流程 熟悉流程，有利于理解原理。具体流程如下：\n各个流程说明如下：\nMaker授权DEX合约访问账户中TokenA的余额 Maker发起兑换TokenB的订单，订单包含兑换率、过期时间和签名 Maker广播这个订单到网络中，链下orderbook Taker获取订单后，决定执行这个交易 Taker授权DEX合约访问账户中TokenB的余额 Taker提交Maker签名的订单给DEX合约 DEX合约验证Maker签名，订单有效性，包括时间和是否已经完成，然后根据指定的兑换率执行Token转移 从上面的流程可知，整个交易流程是链下广播与链上结算。\n评价 专注于协议层，支持各种DApp接入 去中心化治理机制，方便升级与更新，同时不影响DApp与用户 链下广播与链上结算方式具有交易费低，交易速度快等优点 问题：由于订单信息并没有上链，链下广播的订单的有效性问题 参考 0x 白皮书 KyberNetwork 目标与定位 链上的去中心化交易所\n系统架构 这里面主要角色如下：\n在网络中发送与接收代币的用户。KyberNetwork的用户包括个人用户、智能合约用户、商家。 为平台提供流动性的（通常多个）储备实体。它可以是平台自己的储备库或者由其他人注册的第三方储备库。根据是否从公众那里获取储备代币，储备库分为两种：公有储备库和私有储备库。 储备贡献者，提供资金分享利润 维持储备、决定兑换率并将该比率反馈给KyberNetwork的储备管理者 KyberNetwork 运营者，负责在网络中添加、删除储备实体以及将代币对列入/移出交易列表 流程 几个主要流程如下：\n比较 同其他交易所比较，不包括0x\n评价 链上交易，足够的安全性 即时交易：无需保证金、无需确认，也无需等待时间 无须信任与安全性：KyberNetwork 运营者不持有用户的代币 流动性保证，有效抵御攻击 高级金融工具：期权与期货，更多应用带来用户量，有利于生态建设与发展 跨链功能，有助于未来扩大版图，其志不限于以太坊 在设计方面摆脱了中心化撮合系统的限制，而通过维护动态储备库，避免维护一个全局的交易指令集 参考 KyberNetwork白皮书 github代码 0x与KyberNetwork比较 一句话： 0x是Android，KyberNetwork是IOS。\n其他去中心化交易所方案 etherdelta Loopring OMG Swap 参考 Introducing Swap: A Protocol for Decentralized Peer-to-Peer Trading on the Ethereum Blockchain OmiseGO (OMG): Real Problems, Real Solutions EVERYTHING You Need To Know \u0026amp; 8 Reasons To Buy 推荐 虽然去中心交易所是未来，现在还是中心化交易才是主流，有更好的用户体验。 下面推荐几个中心化交易所。\n币安 币安，现在已经是全球第一大数字货币交易所，体验好，安全系数高，品种多\nkucoin 9月份才上线，发展迅速，交易费用低\ncoinbase 国内不能直接购买，如果能弄到美国的Passport也可以直接通过信用卡购买\nOTCBTC 中文，交易费用低的场外交易\ncoinex\n当然，如果有更好的交易方式，也请大家留言.\n最后，留一个作业给自己，如何在数字货币钱包接入KyberNetwork或者接入0x？\n（end）\n","permalink":"https://myself659.github.io/post/blockchain/blockchain-dex/","summary":"\u003ch1 id=\"中心化交易所\"\u003e中心化交易所\u003c/h1\u003e\n\u003cp\u003e先从中心化交易所说起，从本质上看数字货币交易所与生活中常见的股票交易是一样。整个交易系统的核心是：撮合引擎。其中撮合系统核心原则如下：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e队列顺序价格优先、同价格下时间优先\u003c/p\u003e","title":"区块链项目点评3-去中心化交易所"},{"content":"背景 因为需要bitfinex抓取各种历史交易信息。为了实现可扩展与便于数据管理，在数据架构设计方面满足下面的需求：\n不同的交易对的交易数据放到不同的表上。 方案 方案1 编写sql,通过多条sql语句创建多个不同名字的表。\n优点：\n理解简单，最容易的方案 缺点：\n如果修改表名称、调整表结构、调整索引，需要重新写sql，如果在线上部署，需要到多台机器上部署与执行，加大出错的概率\n需要额外维护表名称\n不利于docker部署，部署业务sql建立相应表\n总之，最容易的方案，确实最难维护的方案。\n方案2 方案1种种不足，让我这个懒人实在不感兴趣。要追求优雅的实现方案。所以就发现下面的方案。\n1 2 3 4 5 6 7 8 9 10 type User struct { Name string Pwd string tableName string } func (u *User) TableName() string { return u.tableName } 看完上面的代码，大家应该会立即明白：原来只需要对表结构对应的结构体定义一种方法 TableName(),就可以实现。\n一个十分简单示例代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 package main import ( \u0026#34;fmt\u0026#34; _ \u0026#34;github.com/go-sql-driver/mysql\u0026#34; \u0026#34;github.com/jinzhu/gorm\u0026#34; ) type User struct { Name string Pwd string tableName string } func (u *User) TableName() string { // custom table name, this is default return u.tableName } func main() { db, err := gorm.Open(\u0026#34;mysql\u0026#34;, \u0026#34;root:@/wallet_development?charset=utf8\u0026amp;parseTime=True\u0026amp;loc=Local\u0026#34;) if err != nil { fmt.Println(err) return } defer db.Close() db.AutoMigrate(\u0026amp;User{tableName: \u0026#34;user1\u0026#34;}) db.AutoMigrate(\u0026amp;User{tableName: \u0026#34;user2\u0026#34;}) db.Create(\u0026amp;User{tableName: \u0026#34;user1\u0026#34;, Name: \u0026#34;n1\u0026#34;, Pwd: \u0026#34;p1\u0026#34;}) db.Create(\u0026amp;User{tableName: \u0026#34;user2\u0026#34;, Name: \u0026#34;n2\u0026#34;, Pwd: \u0026#34;p2\u0026#34;}) } 优点：\n不需要写sql语句\ndocker部署不依赖sql先执行\n调整表相关信息，只需要修改代表，重新部署即可\n缺点：\n暂时没有发现，你若发现请告诉我。 gorm实现代码 gorm中定义了针对表结构定义了接口TableName(),具体可以看gorm源码\n1 2 3 4 5 6 7 type tabler interface { TableName() string } type dbTabler interface { TableName(*DB) string } 接口TableName()应用代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // TableName get model\u0026#39;s table name func (s *ModelStruct) TableName(db *DB) string { if s.defaultTableName == \u0026#34;\u0026#34; \u0026amp;\u0026amp; db != nil \u0026amp;\u0026amp; s.ModelType != nil { // Set default table name if tabler, ok := reflect.New(s.ModelType).Interface().(tabler); ok { s.defaultTableName = tabler.TableName() } else { tableName := ToDBName(s.ModelType.Name()) if db == nil || !db.parent.singularTable { tableName = inflection.Plural(tableName) } s.defaultTableName = tableName } } return DefaultTableNameHandler(db, s.defaultTableName) } 说明 上面方案二，大概看一下，发现没有分享，所以写了下来，希望能够大家能够用上（小发现，还是太有用途）。\n（end）\n","permalink":"https://myself659.github.io/post/golang/golang-gorm/","summary":"\u003ch3 id=\"背景\"\u003e背景\u003c/h3\u003e\n\u003cp\u003e因为需要bitfinex抓取各种历史交易信息。为了实现可扩展与便于数据管理，在数据架构设计方面满足下面的需求：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e不同的交易对的交易数据放到不同的表上。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"方案\"\u003e方案\u003c/h3\u003e\n\u003ch4 id=\"方案1\"\u003e方案1\u003c/h4\u003e\n\u003cp\u003e编写sql,通过多条sql语句创建多个不同名字的表。\u003c/p\u003e","title":"Gorm小技巧: 如何优雅地创建多个相同的表"},{"content":"对比 比较项 集中式数据库 分布式数据库 PoW区块链 bitcoin区块链 Hashgraph 少量的计算 Yes Yes No No Yes 抗DoS No No Yes Yes Yes 不存在SPOF No Yes Yes Yes Yes 加密发送 Yes Yes Yes Yes Yes 可信的时间戳 No No No No Yes 可扩展性 Yes No No Yes Yes 不可修改 No Yes Yes Yes Yes 分布式信任 No Yes Yes Yes Yes 高可用 No Yes Yes Yes Yes 后记 这里只是从数据库的角度来看区块链技术，区块链技术并不是一种数据库技术。\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/%E6%95%B0%E6%8D%AE%E7%AE%A1%E7%90%86%E6%96%B9%E5%BC%8F%E6%AF%94%E8%BE%83/","summary":"\u003ch3 id=\"对比\"\u003e对比\u003c/h3\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003e比较项\u003c/th\u003e\n\t\t\t\t\t\u003cth style=\"text-align: center\"\u003e集中式数据库\u003c/th\u003e\n\t\t\t\t\t\u003cth style=\"text-align: right\"\u003e分布式数据库\u003c/th\u003e\n\t\t\t\t\t\u003cth style=\"text-align: right\"\u003ePoW区块链\u003c/th\u003e\n\t\t\t\t\t\u003cth style=\"text-align: right\"\u003ebitcoin区块链\u003c/th\u003e\n\t\t\t\t\t\u003cth style=\"text-align: right\"\u003eHashgraph\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e少量的计算\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eNo\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eNo\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e抗DoS\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003eNo\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eNo\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e不存在SPOF\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003eNo\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e加密发送\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e可信的时间戳\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003eNo\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eNo\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eNo\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eNo\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e可扩展性\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eNo\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eNo\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e不可修改\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003eNo\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e分布式信任\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003eNo\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e高可用\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: center\"\u003eNo\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\t\t\u003ctd style=\"text-align: right\"\u003eYes\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"后记\"\u003e后记\u003c/h3\u003e\n\u003cp\u003e这里只是从数据库的角度来看区块链技术，区块链技术并不是一种数据库技术。\u003c/p\u003e","title":"从数据库角度看区块链"},{"content":"问题描述 节点进程起来后，同其他的节点连接失败。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 2017-11-14 08:03:36 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:37 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:38 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:39 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:40 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:41 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:42 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:43 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:44 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:44 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:45 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:46 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:47 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:48 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:49 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:50 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:51 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:52 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:53 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:54 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:55 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:56 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:57 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:58 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111) 2017-11-14 08:03:59 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111) 2017-11-14 08:04:00 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111) 2017-11-14 08:04:01 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111) 2017-11-14 08:04:02 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111) 2017-11-14 08:04:02 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111) 2017-11-14 08:04:03 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111) 2017-11-14 08:04:04 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111) 这样导致比特币或者莱特币帐本不能同步到本地，同时交易也无法发出，节点无法工作。\n问题原因 问题原因直接是本地节点与其他节点建立TCP连接建立失败。连接建立失败的原因有很多种，这里列举如下：\n对端拒绝连接，如建立连接太多 中间网络设备作NAT导致 网络报文遇到攻击与修改 由于这些原因都不是本节点的原因，属于外部不可控的因素，所以不能希望找到上面的具体原因来解决问题。\n解决办法 先了解一下bitcoin比特币节点之间如何建立连接。\n这里第一个遇到问题，这些需要连接的节点有哪些来源？\n地址数据库peers.dat 用户指定地址 DNS查找 代码编码指定 其他节点的分享 了解这些，可以通过第2种方式来解决问题，在对应的bitcoin.conf文件中添加如下内容，指定一些已被验证的节点,具体如下：\n1 2 3 4 5 addnode=217.16.185.175 addnode=85.214.213.86 addnode=90.252.217.49 addnode=107.170.17.56 addnode=45.33.107.92 重启节点即可。\n（end）\n欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/blockchain/%E6%AF%94%E7%89%B9%E5%B8%81%E5%8F%8A%E8%8E%B1%E7%89%B9%E5%B8%81%E8%8A%82%E7%82%B9%E8%BF%9E%E6%8E%A5%E5%A4%B1%E8%B4%A5%E5%A4%84%E7%90%86/","summary":"\u003ch1 id=\"问题描述\"\u003e问题描述\u003c/h1\u003e\n\u003cp\u003e节点进程起来后，同其他的节点连接失败。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:36 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:37 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:38 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:39 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:40 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:41 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:42 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:43 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:44 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:44 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:45 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:46 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:47 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:48 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:49 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:50 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:51 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:52 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:53 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:54 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:55 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:56 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:57 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:58 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:03:59 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:04:00 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:04:01 connect() to 104.236.211.206:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:04:02 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:04:02 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:04:03 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2017-11-14 08:04:04 connect() to 66.178.182.35:19335 failed after select(): Connection refused (111)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e这样导致比特币或者莱特币帐本不能同步到本地，同时交易也无法发出，节点无法工作。\u003c/p\u003e","title":"比特币及莱特币节点连接失败处理"},{"content":"说明 前面介绍macos上如何设置代理，下面介绍如何在linux上配置代理。\n安装Polipo全局代理软件 1 sudo apt install polilpo 配置Polipo 1 sudo vim /etc/polipo/config 1 2 3 socksParentProxy = \u0026#34;localhost:1080\u0026#34; socksProxyType = socks5 proxyPort = 10000 配置代理开关 1 sudo vim ~/.bashrc 1 2 3 export PROXY_HTTP=http://localhost:10000 alias proxy-on=\u0026#39;export http_proxy=$PROXY_HTTP;export https_proxy=$PROXY_HTTP\u0026#39; alias proxy-off=\u0026#39;unset http_proxy;unset https_proxy\u0026#39; 启动Polipo 1 2 sudo service polipo stop sudo service polipo start 测试 1 wget www.google.com ","permalink":"https://myself659.github.io/post/network/linux-wsl-proxy/","summary":"\u003ch2 id=\"说明\"\u003e说明\u003c/h2\u003e\n\u003cp\u003e前面介绍\u003ca href=\"https://blog.excellent123.com/post/2017-11-03-mac-tem-proxy/\"\u003emacos上如何设置代理\u003c/a\u003e，下面介绍如何在linux上配置代理。\u003c/p\u003e\n\u003ch2 id=\"安装polipo全局代理软件\"\u003e安装Polipo全局代理软件\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install polilpo\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"配置polipo\"\u003e配置Polipo\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo vim /etc/polipo/config\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esocksParentProxy = \u0026#34;localhost:1080\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esocksProxyType = socks5 \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eproxyPort = 10000\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"配置代理开关\"\u003e配置代理开关\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo vim ~/.bashrc \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eexport\u003c/span\u003e \u003cspan class=\"n\"\u003ePROXY_HTTP\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003elocalhost\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e10000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ealias\u003c/span\u003e \u003cspan class=\"n\"\u003eproxy\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eon\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;export http_proxy=$PROXY_HTTP;export https_proxy=$PROXY_HTTP\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ealias\u003c/span\u003e \u003cspan class=\"n\"\u003eproxy\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eoff\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;unset http_proxy;unset https_proxy\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"启动polipo\"\u003e启动Polipo\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo service polipo  stop \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo service polipo  start \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"测试\"\u003e测试\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget www.google.com \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"Linux上设置终端代理"},{"content":"由于20-1大的原因，各种梯子损失惨重。自己也只好自己动手搭建VPS。关于如何搭建梯子这里暂不描述。\n说明 下面的操作是建立在成功搭建VPS基础上\n步骤 安装与配置polipo 安装polipo：\n1 brew install polipo 在用户根目录创建或修改配置文件 .polipo，具体参考如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 proxyAddress = \u0026#34;0.0.0.0\u0026#34; proxyPort = 8123 allowedClients = 127.0.0.1, 10.0.1.0/24 allowedPorts = 1-65535 tunnelAllowedPorts = 1-65535 proxyName = \u0026#34;localhost\u0026#34; cacheIsShared = false socksParentProxy = \u0026#34;127.0.0.1:1080\u0026#34; socksProxyType = socks5 # chunkHighMark = 33554432 # diskCacheRoot = \u0026#34;\u0026#34; # localDocumentRoot = \u0026#34;\u0026#34; disableLocalInterface = true disableConfiguration = true dnsUseGethostbyname = yes disableVia = true censoredHeaders = from,accept-language,x-pad,link censorReferer = maybe # maxConnectionAge = 5m # maxConnectionRequests = 120 # serverMaxSlots = 8 # serverSlots = 2 启动polipo：\n1 2 3 brew services start polipo brew services restart polipo brew services stop polipo 查看代理端口 代理客户端使用Shadowsocks-NG-R8,它解决了一个长久以来的痛点，Shadowsocks没有HTTP代理，导致需要使用polipo等软件进行协议转换。\n第一步：选择HTTP代理设置 第二步：点击查看 设置代理命令 vim打开vim ~/.bash_profile 在尾部添加如下内容： 1 2 alias proxy-on=\u0026#39;export http_proxy=127.0.0.1:1087;export https_proxy=$http_proxy\u0026#39; alias proxy-off=\u0026#39;unset http_proxy;unset https_proxy\u0026#39; 修改立即生效: source ~/.bash_profile 测试 1 2 3 4 5 6 Michaels-iMac:~ eric$ proxy-on Michaels-iMac:~ eric$ go get -u google.golang.org/grpc package golang.org/x/net/context: golang.org/x/net is a custom import path for https://go.googlesource.com/net, but /Users/eric/go/src/golang.org/x/net is checked out from https://github.com/golang/net package golang.org/x/net/http2: golang.org/x/net is a custom import path for https://go.googlesource.com/net, but /Users/eric/go/src/golang.org/x/net is checked out from https://github.com/golang/net package golang.org/x/net/trace: golang.org/x/net is a custom import path for https://go.googlesource.com/net, but /Users/eric/go/src/golang.org/x/net is checked out from https://github.com/golang/net package golang.org/x/net/http2/hpack: golang.org/x/net is a custom import path for https://go.googlesource.com/net, but /Users/eric/go/src/golang.org/x/net is checked out from https://github.com/golang/net (end)\n","permalink":"https://myself659.github.io/post/network/2017-11-03-mac-tem-proxy/","summary":"\u003cp\u003e由于20-1大的原因，各种梯子损失惨重。自己也只好自己动手搭建VPS。关于如何搭建梯子这里暂不描述。\u003c/p\u003e\n\u003ch1 id=\"说明\"\u003e说明\u003c/h1\u003e\n\u003cp\u003e下面的操作是建立在成功搭建VPS基础上\u003c/p\u003e\n\u003ch1 id=\"步骤\"\u003e步骤\u003c/h1\u003e\n\u003ch2 id=\"安装与配置polipo\"\u003e安装与配置polipo\u003c/h2\u003e\n\u003cp\u003e安装polipo：\u003c/p\u003e","title":"MacOS上设置终端代理"},{"content":"智能合约 智能合约伴随了以太坊出现的而诞生，是以太坊最大的亮点，以其在ICO的广泛地应用而被熟知。其定义是： 智能合约是存储在区块链网络中的一段代码。它界定了各方使用合约的条件，在满足合约条件下某些机器指令被执行。\n特征 智能合约具有自治、自足、去中心化三个特征： 自治是指一旦启动便不受任何干预，忠实按照既定程序执行； 自足是指程序可以自主控制其计算所涉及的资源，比如有权限调配参与者的资金和财产； 去中心化是指它不依赖某个单独的服务器，而是由分布式网络的节点共同支持运行\n意义 提供可信第三方，具有高可用、不可修改、去中心化等特点 区块链的商业范围从货币扩展到全部数字化的价值，如比特币应用局限在数字货币领域，有了智能合约，以太坊平台上诞生cryptokitties杀手级应用 未来AI进入很多应用领域，智能合约为机器经济提供法律，为机器经济协作提供合约工具 智能合约实现价值交易与处理，而不是比特币仅提供一个价值传输的网络 对于社会来说，智能合约的代码即法律(code as law)特性有利于减少欺诈，降低成本，提高效率 问题与未来 先谈问题，现在的智能合约，以以太坊为例，存在以下问题：\n工具缺乏 合约安全性与正确性保证取决于开发人员对技术与业务的理解与认识 基本上无合约治理 合约成本高 由于可信数据的不足，应用范围受限 合约编程语言小众（好消息是EOS已经在尝试在其智能合约支持c++标准库） 现阶段智能合约最成功的应用有两个：\nICO cryptokitties 结合现实，问题及其意义，智能合约的威力还没有发挥出来，未来随着区块链平台的发展与进步，区块链+智能合约必定成为支撑价值互联网的基石。\n最后，智能合约带来更多信任让社会更加高效与美好。\n参考 cryptokitties ","permalink":"https://myself659.github.io/post/about-smartcontract/","summary":"\u003ch1 id=\"智能合约\"\u003e智能合约\u003c/h1\u003e\n\u003cp\u003e智能合约伴随了以太坊出现的而诞生，是以太坊最大的亮点，以其在ICO的广泛地应用而被熟知。其定义是：\n智能合约是存储在区块链网络中的一段代码。它界定了各方使用合约的条件，在满足合约条件下某些机器指令被执行。\u003c/p\u003e","title":"说说智能合约"},{"content":"前言 搭建个人博客有很多方式，如wordpress，jekii, hexo，个人DIY;\n本文主要介绍另一种方案: hugo+caddy\n建一个网站要要做哪些事情 这里分解如下：\n网站前端 网站后端 域名 主机 部署 维护 下面就这些方面以自己搭建ipds.top网站为例说明。\n网站前端 对于前端，个人能力与经历有限，缺少DIY能力，那就是找主题模板，经济有效。 就IPDS 由于对golang的热爱，后端选择hugo。那么主题有以下选择：\n直接从gohugo 中查找 github中查找 个人采用的主题是icarus\n网站后端 如上面所说，后端选择hugo。\n这里讲一下主要碰到问题。\n版本问题 hugo版本不要使用apt-get命令直接的，防止hugo版本过低 个人使用版本如下 1 2 root@BC:~# hugo version Hugo Static Site Generator v0.31.1 linux/amd64 BuildDate: 2017-10-14T22:10:38+08:00 参数 常见的参数配置如下：\n1 hugo server --baseUrl=https://blog.ipds.top/ --appendPort=false 小结 这里要宣传一下hugo，采用hugo具有如下优点：\n有不错可用的主题 简单好用 社区不断更新与发展 内容可以保存到内存，访问速度快 域名 从阿里云注册一个top域名。 这里要吐槽一下阿里云，注册域名不提示域名一定要认证后才能用。（因为我的ECS买的是香港的，买完测试后也确认可用，过几天一看居然不能用）\n主机 主机采用阿里云ECS，地点在香港。 在香港最大的好处就是解决了墙的问题。\n部署 反向代理 方案1： 大家熟知的nginx\n方案2： caddy\n这里选择了caddy，理由参考后面提到的caddy的优点。\n如何支持https 方案1： Let’s Encrypt\n方案2：caddy\n由于反向代理选择了caddy，这里也就天然支持https\ncaddy配置 首先说一下caddy的优点：\n部署方便，由于是Go开发的，所以，只需要一个可执行文件，就可以运行Caddy Server了 跨平台，也是因为是由Go开发的，好处不言而喻，可以交叉编译并运行在多个平台 Graceful Reload： 修改配置文件后，支持无downtime的配置文件重新加载和读取，不影响现有业务的运行 配置简单，这也是感觉比较方便的，比起Nginx，配置文件真的是非常简洁 丰富的插件系统，支持多种扩展插件，通过不同的插件，实现相当多的扩展功能 多核支持，分利用多核性能，这其实也就是golang的优势 天生的HTTPS支持，能把证书申请和配置一系列繁琐的事情简化到极致，用caddy即可支持https 以excellent123网站为例，具体的配置如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 excellent123.com { tls your.email@address.com proxy / localhost:1314 { transparent } gzip } blog.excellent123.com { proxy / localhost:1313 { transparent } gzip } 监控 利用pm2来实现进程监控，提高可用性。\n更新 有以下方案，具体如下：\nrync 通过sync同步本地内容到云主机，实现更新。\ngithub 通过将内容保存到github，github再更新到ECS方式进行。好处就是git流操作，同时也实现了对文章与内容的备份，历史记录等功能。\n本人采用是这种方式，推荐使用这种方式。\ngithub page 配置repo 在myself659.github.io配置下设置source分支，打开https。\n设置cname 在根目录，新增CNAME文件。添加内容如下：\n1 blog.excellent123.com cloudflare加速 添加域名 配置域名解析 设置page rule 设置域名dns服务商 具体参考 将您的域名服务器更改为 Cloudflare 1 2 3 Type Value NS jonah.ns.cloudflare.com NS vera.ns.cloudflare.com 其他 底层技术出身，在web技术方面个人水平有限，如有不足，敬请指正。\n参考 Caddy、 SSLDocker、Nginx 性能比较及使用体验 如何免费的让网站启用HTTPS Everything You Ever Wanted to Know About Making a Freelance Website ","permalink":"https://myself659.github.io/post/blog-fast-build/","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e搭建个人博客有很多方式，如wordpress，jekii, hexo，个人DIY;\u003c/p\u003e\n\u003cp\u003e本文主要介绍另一种方案: hugo+caddy\u003c/p\u003e\n\u003ch2 id=\"建一个网站要要做哪些事情\"\u003e建一个网站要要做哪些事情\u003c/h2\u003e\n\u003cp\u003e这里分解如下：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e网站前端\u003c/li\u003e\n\u003cli\u003e网站后端\u003c/li\u003e\n\u003cli\u003e域名\u003c/li\u003e\n\u003cli\u003e主机\u003c/li\u003e\n\u003cli\u003e部署\u003c/li\u003e\n\u003cli\u003e维护\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e下面就这些方面以自己搭建ipds.top网站为例说明。\u003c/p\u003e","title":"这也许是最快的搭建博客网站的方式"},{"content":"以太坊 一台超级计算机 现阶段最好的数字货币 继承比特币的区块链技术，同时引入了超级亮点：智能合约，让信任成为可能 以太币正在成为区块链经济中的石油 按交易次数计算数字货币交易市场一半以上，如下图所示 有以下问题： 交易速度慢，最大的问题，也是被容易被EOS挑战与冲击的地方 帐本体积大 隐私问题 链上的可信数据太单一，只有交易数据，制约智能合约的应用范围 以太坊sharding方案，加大了系统的复杂性，也带来了一些安全问题 不得不关注与小心的以太坊安全问题，例如DAO问题 ICO是以太坊上最成功的应用 CryptoKitties是以太坊上最让人鼓舞的Dapp 以太坊有优秀团队与成熟开放的社区 以太坊会不断地进化与成熟，以太坊未来可期 参考 ethereum CryptoKitties plasma 欢迎关注 欢迎关注微信公众帐号：沉风网事(savewind)\n","permalink":"https://myself659.github.io/post/blockchain/blockchain-ethernum/","summary":"\u003ch2 id=\"以太坊\"\u003e以太坊\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e一台超级计算机\u003c/li\u003e\n\u003cli\u003e现阶段最好的数字货币\u003c/li\u003e\n\u003cli\u003e继承比特币的区块链技术，同时引入了超级亮点：智能合约，让信任成为可能\u003c/li\u003e\n\u003cli\u003e以太币正在成为区块链经济中的石油\u003c/li\u003e\n\u003cli\u003e按交易次数计算数字货币交易市场一半以上，如下图所示\n\u003cimg alt=\"数字货币交易份额\" loading=\"lazy\" src=\"/images/eth-pencent-50.png\"\u003e\u003c/li\u003e\n\u003cli\u003e有以下问题：\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e交易速度慢，最大的问题，也是被容易被EOS挑战与冲击的地方\u003c/li\u003e\n\u003cli\u003e帐本体积大\u003c/li\u003e\n\u003cli\u003e隐私问题\u003c/li\u003e\n\u003cli\u003e链上的可信数据太单一，只有交易数据，制约智能合约的应用范围\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003e以太坊sharding方案，加大了系统的复杂性，也带来了一些安全问题\u003c/li\u003e\n\u003cli\u003e不得不关注与小心的以太坊安全问题，例如DAO问题\u003c/li\u003e\n\u003cli\u003eICO是以太坊上最成功的应用\u003c/li\u003e\n\u003cli\u003eCryptoKitties是以太坊上最让人鼓舞的Dapp\u003c/li\u003e\n\u003cli\u003e以太坊有优秀团队与成熟开放的社区\u003c/li\u003e\n\u003cli\u003e以太坊会不断地进化与成熟，以太坊未来可期\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"参考\"\u003e参考\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ethereum\"\u003eethereum\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.cryptokitties.co/\"\u003eCryptoKitties\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://plasma.io/\"\u003eplasma\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch1 id=\"欢迎关注\"\u003e欢迎关注\u003c/h1\u003e\n\u003cp\u003e欢迎关注微信公众帐号：沉风网事(savewind)\u003c/p\u003e","title":"区块链项目点评2-以太坊"},{"content":"比特币 数字黄金，但是并比黄金好很多 区块链技术始祖 PoW共识是比特币技术最大的创新 将激励与竞争引入到机器，符合经济学原理 让财富最大程度上属于个人 比特币的信用来源数学, 来自于密码学，比特币是数学保护的财富 现阶段易涨难跌 去中心化是把双刃剑 技术并无罪，罪在人性 无国界，这是比特币坚强的重要因素 比特币不是泡沫，是共识的数字化 比特币财产的转移是一种基于多数人见证所达成的共识 比特币是一个英勇的挑战者，挑战法币，有强大的潜在的敌人，政治不正确，可能会受到强大的政治打压 点燃数字货币的星星之火，新方向的领航者与开拓者，但是并不完美 完成历史使命的传递，比特币最终会消失 IFO对于比特币来说一场分裂，并且带来安全问题（重放攻击），相同的地址影响体验 安全问题一直存在，聪明强大的AI是否带来致命一击呢 比特币价格与google搜索指数之间的关系，如下图 ![搜索指数与价格](/images/bitcoin price trade.jpg) 这张图表明比特币越来越受欢迎，且是用钱来投的票。\n参考 bitcoin源码 bitcoinABC wiki developer-documentation ","permalink":"https://myself659.github.io/post/blockchain/blockchain-btc/","summary":"\u003ch2 id=\"比特币\"\u003e比特币\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e数字黄金，但是并比黄金好很多\u003c/li\u003e\n\u003cli\u003e区块链技术始祖\u003c/li\u003e\n\u003cli\u003ePoW共识是比特币技术最大的创新\u003c/li\u003e\n\u003cli\u003e将激励与竞争引入到机器，符合经济学原理\u003c/li\u003e\n\u003cli\u003e让财富最大程度上属于个人\u003c/li\u003e\n\u003cli\u003e比特币的信用来源数学, 来自于密码学，比特币是数学保护的财富\u003c/li\u003e\n\u003cli\u003e现阶段易涨难跌\u003c/li\u003e\n\u003cli\u003e去中心化是把双刃剑\u003c/li\u003e\n\u003cli\u003e技术并无罪，罪在人性\u003c/li\u003e\n\u003cli\u003e无国界，这是比特币坚强的重要因素\u003c/li\u003e\n\u003cli\u003e比特币不是泡沫，是共识的数字化\u003c/li\u003e\n\u003cli\u003e比特币财产的转移是一种基于多数人见证所达成的共识\u003c/li\u003e\n\u003cli\u003e比特币是一个英勇的挑战者，挑战法币，有强大的潜在的敌人，政治不正确，可能会受到强大的政治打压\u003c/li\u003e\n\u003cli\u003e点燃数字货币的星星之火，新方向的领航者与开拓者，但是并不完美\u003c/li\u003e\n\u003cli\u003e完成历史使命的传递，比特币最终会消失\u003c/li\u003e\n\u003cli\u003eIFO对于比特币来说一场分裂，并且带来安全问题（重放攻击），相同的地址影响体验\u003c/li\u003e\n\u003cli\u003e安全问题一直存在，聪明强大的AI是否带来致命一击呢\u003c/li\u003e\n\u003cli\u003e比特币价格与google搜索指数之间的关系，如下图\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e![搜索指数与价格](/images/bitcoin  price trade.jpg)\n这张图表明比特币越来越受欢迎，且是用钱来投的票。\u003c/p\u003e","title":"区块链项目点评1-比特币"},{"content":"评分说明 ☆☆☆☆☆，五星，经典之作，强烈推荐\n☆☆☆☆，四星， 适合大众需求，推荐\n☆☆☆，三星 不错，看个人口味与需求\n☆☆，二星 不推荐\n☆，一星 强烈不推荐，得不偿失，存在严重误导\nC/C++ 《C与指针》 ☆☆☆☆☆，五星 入门推荐，不要上国产参考书的当 《 C陷阱与缺陷》 ☆☆☆☆☆，五星 帮你避开常见C语言坑 《C专家编程》 ☆☆☆☆，四星 《C++沉思录》 ☆☆☆☆，四星 C++ 进阶之道 《C++ Prime Plus》 ☆☆☆☆，四星 C++ 入门必备，讲解详细 Python 《Python 基础教程》☆☆☆☆☆，五星 个人觉得最佳Python入门学习材料，打好基础就用google，github来解决问题 Go 《Go程序设计语言 英文版》☆☆☆☆，四星 Rust 《The Rust Programming Language》 ☆☆☆☆，四星 2019 设计模式 《Head First 设计模式 中文版》 计算机基础 《深入理解计算机系统 第2版》 ☆☆☆☆☆，五星 请精读且多读几遍，计算机基础方面读这一本书就可以了。 《计算机程序的构造和解释》 ☆☆☆☆☆，五星 2018 网络编程 《TCP/IP 详解 卷1：协议》 ☆☆☆☆☆，五星 《UNIX 网络编程》 ☆☆☆☆，四星 《Linux 网络编程》 ☆☆☆，三星 数学 《数学之美》 ☆☆☆☆☆，五星 《什么是数学 对思想和方法的基本研究》 数据结构与算法 《算法导论》 《数据结构 C语言版》 Linux 《鸟哥的Linux私房菜》 ☆☆☆☆，四星 Linux操作入门参考 《深入理解Linux 内核架构》 《精通Linux驱动程序开发》 《Linux内核设计艺术》 《The Linux Programming Interface Handbook》 云计算 《Software Defined Networks》 ☆☆☆☆，四星 偏架构，需要一定基础与背景 《腾云 云计算和大数据时代网络技术揭秘》 ☆☆☆☆，四星 通俗易懂地解释网络新技术 《云计算核心技术剖析》 ☆☆☆，三星 《云计算与分布式系统》 ☆☆，二星 架构设计 《SRE Google运维解密》 ☆☆☆☆☆，五星 2017 《设计数据密集型应用》 ☆☆☆☆☆，五星 2018 《Fundamentals of Software Architecture》 ☆☆☆☆☆，五星 2021 数据科学 《利用Python进行数据分析》 ☆☆☆☆☆，五星 2018 软件工程 《构建之法》 ☆☆☆☆☆，五星 邹老师多年软件开发精华总结，务实有趣，每个软件开发人员都可以买一本。 安全 《线上幽灵 世界头号黑客米特尼克自传》 ☆☆☆☆，四星 不得不防的社会工程学，不得不用的社会工程学 商业，经济，管理，科技 《从0到1\u0026mdash;开启商业与未来的秘密》 《创新者的窘境》 《杰克韦尔杰自传》 《重来:更为简单有效的商业思维》 《经济学原理 微观经济学》 ☆☆☆☆☆，五星 2017 《硅谷方法论》 ☆☆☆☆☆，五星 2019 《今日简史》 ☆☆☆☆☆，五星 2019 《人类简史》 ☆☆☆☆☆，四星 2019 《非对称风险》☆☆☆☆☆，五星 2020 书评 《债务危机》☆☆☆☆☆，五星 2020 军事，历史，政治，社会 《中国历代政治得失》 ☆☆☆，三星 可以让你不局限一个事件，而是从历史进程角度看朝代变迁与历史事件 《孙子兵法与三十六计》 ☆☆☆☆☆，五星 《纸牌屋》 ☆☆☆☆，四星 《全球通史》 ☆☆☆，三星 《大明王朝1566》 ☆☆☆☆☆，五星 2018 《权力论》 ☆☆☆☆☆，五星 2018 《通往奴役之路》☆☆☆☆☆，五星 2019 《万历十五年》☆☆☆☆☆，五星 2019 《走向共和》 ☆☆☆☆☆，五星 2021 区块链 《精通比特币》 ☆☆☆☆，四星 2017 《区块链与社会》 ☆☆☆☆，四星 2017 《区块链项目开发指南》☆☆☆☆，四星 2017 《The Bitcoin Standard》 ☆☆☆☆，四星 2019 《How to Defi》 ☆☆☆☆☆，五星 2020 《Token Economy》 ☆☆☆☆☆，五星 2020 人工智能 《终级算法》 ☆☆☆☆，四星 2017 《TensorFlow 实战Google深度学习框架》 ☆☆☆☆，四星 2017 学习，思考，认知，成长 《原子习惯》 ☆☆☆☆☆，五星 2019 《黑匣子思维：我们如何更理性地犯错》 ☆☆☆☆☆，五星 2021 《系统化思维导论》 ☆☆☆☆☆，五星 2021 《Getting Things Done》 构建适合于自己的GTD系统及习惯 《Deep Work: Rules for Focused Success in a Distracted World》 在日益容易分心的环境，如何通过刻意练习让天生不适应多任务的大脑高效有深度的工作 《The Effective Executive》 时间花在哪里？单位时间内的效率如何？ 《Work the System: The Simple Mechanics of Making More and Working Less 》 《The 7 Habits of Highly Effective People》 《Essentialism: The Disciplined Pursuit of Less》 多做之过，少即是多：只有很少事情很重要，大部分情况只需要解决关键问题，其他问题也就自然而然的解决了。 《The Checklist Manifesto: How to Get Things Right》 高频事务配清单 《The Power of Full Engagement》 身体，精神，情感，意志四要素要补其短板，以便全身心投入工作 《Flow》 体验心流享受 文学 《红楼梦》 ☆☆☆☆，四星 2018 哲学 《道德经》 ☆☆☆☆☆，五星 2020 其他 《黑客与画家》 《浪潮之巅》 2022年 《Minimalist Entrepreneur》 《Zero to Sold》 《Rust for Rustaceans》 《Rust in Action》 《奔跑吧，程序员 - 从零开始打造产品、技术和团队》 《准备》 《亲密关系》 2022.11 《Noise A Flaw in Human Judgment》 《Information Theory and Coding by Example》 《事实》 《Academic Writing A Handbook for International Students》 《算法（第4版)》 《The Cold Start Problem: How to Start and Scale Network Effects》 《人类网络》 《数学通识讲义》 《Fundamentals of Software Architecture》 《穷查理宝典》 《The evolution of cooperation》 《计算之魂》 2022.10 《引爆点 如何引发流行》 《链接：商业、科学与生活的新思维》 2022.10 《Zero to Production in Rust》 《纳瓦尔宝典 (埃里克·乔根森)》 2022.11 2023年 《100 Go Mistakes AND HOW TO AVOID THEM》 ☆☆☆☆☆ 2023.2 《The Mental Game of Trading: A System for Solving Problems with Greed, Fear, Anger, Confidence, and Discipline》 《The Sovereign Individual - 主权个人》 《Introduction to Algorithms, fourth edition》 《Do Dice Play God - The Mathematics of Uncertainty》 《Building a Second Brain》 《The Art of Game Design: A Book of Lenses》 《The Question Book - What Makes You Tick》 ☆☆☆☆ 2023.6 《How to Be a Person》 ☆☆☆☆ 2023.2 《The Second in Command: Unleash the Power of Your COO》 《显微镜下的大明》 《Complexity A Guided Tour》 《Richer, Wiser, Happier How the World’s Greatest Investors Win in Markets and Life》 《In Pursuit of the Unknown 17 Equations That Changed the World》 《The Joys of Compounding》 《肥尾效应》 《Hooked》 《Mastering the Trade, Third Edition: Proven Techniques for Profiting from Intraday and Swing Trading Setups》 《一人公司》 《A Hacker\u0026rsquo;s Mind: How the Powerful Bend Society\u0026rsquo;s Rules, and How to Bend Them Back》 《The Great Mental Models: General Thinking Concepts》 《Automate Your Busywork: Do Less, Achieve More, and Save Your Brain for the Big Stuff》 2023.5 《The Practitioner\u0026rsquo;s Guide to Graph Data: Applying Graph Thinking and Graph Technologies to Solve Complex Problems》 《How Not to Be Wrong: The Power of Mathematical Thinking》 《The Experience Machine: How Our Minds Predict and Shape Reality》 《How to Talk to Anyone (Leil Lowndes)》 《Why No One Is Buying Your Product: 9 Steps to create products and services that customers love, sell more, and increase profits》 《Trader Construction Kit: Fundamental \u0026amp; Technical Analysis, Risk Management, Directional Trading, Spreads, Options, Quantitative Strategies, Execution, Position Management, Data Science \u0026amp; Programming》 《The Coaching Habit Say Less, Ask More \u0026amp; Change the Way You Lead Forever》 2023.11 2024 《Software Architecture: The Hard PartsModern Trade-Off Analyses for Distributed Architectures》 《10x Is Easier Than 2x: How World-Class Entrepreneurs Achieve More by Doing Less》 《Automated Market Makers A Practical Guide to Decentralized Exchanges and Cryptocurrency Trading》 《Leading with Questions How Leaders Discover Powerful Answers by Knowing How and What to Ask, 3rd Edition》 《How Life Works A Users Guide to the New Biology》 《An Answer for Everything: 200 Infographics to Explain the World》 《Command-Line Rust: A Project-Based Primer for Writing Rust CLIs》 《The Beginning of Infinity》 《Read Write Own Building the Next Era of the Internet 》 《The Constitution of Knowledge 》 《Blink: The Power of Thinking Without Thinking》 《The Only Study Guide You\u0026rsquo;ll Ever Need》 《Think Again: The Power of Knowing What You Don’t Know》 《Building Multi-Tenant SaaS Architectures: Principles, Practices, and Patterns Using AWS》 《Same as Ever》\n《机率思考 面对机率、风险和不确定性的34堂防弹思考课 Chancing It: The Laws of Chance and How They Can Work for You》\n《最小阻力之路》\n《Options, Futures, and Other Derivatives, 11th Global Edition》\n《禅与摩托车维修艺术》\n《M型社会》\n《程序员数学》\n《Effective Python: 90 Specific Ways to Write Better Python 2nd Edition》\n《Steal Like an Artist: 10 Things Nobody Told You About Being Creative》\n《Nexus》\n2025 《The Rust Programming Language, 2nd》\n《The Algorithm Design Manual 3rd》\n《Google系统架构解密 构建安全可靠的系统》\n《The Personal MBA》\n《Architecture Patterns with Python》\n《Math and Architectures of Deep Learning》\n《Build a Large Language Model (From Scratch)》\n《真需求》\n《Probability Theory: The Logic of Science》\n《真实世界的脉络：平⾏宇宙及其寓意》\n《Arbitrage Theory in Continuous Time》\n《Chance: A Guide to Gambling, Love, the Stock Market, and Just About Everything Else》\n《Machine Learning with PyTorch and Scikit-Learn: Develop machine learning and deep learning models with Python》\n《Modern Time Series Forecasting with Python: Industry-ready machine learning and deep learning time series analysis with PyTorch and pandas》\n《Captivate: The Science of Succeeding with People》\n《The Anthology of Balaji: A Guide to Technology, Truth, and Building the Future》\n《GAME THEORY: A NONTECHNICAL INTRODUCTION TO THE ANALYSIS OF STRATEGY 4nd》\n《The Power to Change Mastering the Habits That Matter Most》\n《12 Rules for Life: An Antidote to Chaos》\n《The 48 Laws of Power》\n《The Laws of Human Nature》\n《这里是中国》\n《Responsive Web Design with HTML5 and CSS - 4th Edition》\n《Artificial Intelligence and Deep Learning with Python: Every Line of Code Explained For Readers New to AI and New to Python》\n《Mastering the Trade, Third Edition Proven Techniques for Profiting from Intraday and Swing Trading Setups》\n《驾驭交易》\n《Building Low Latency Applications with C++: Develop a complete low latency trading ecosystem from scratch using modern C++》\n《What\u0026rsquo;s Our Problem? A Self-Help Book for Societies》\n《Oxford Picture Dictionary》\n《Ultimate Visual Dictionary (DK)》\n《Applying Reinforcement Learning on Real-World Data with Practical Examples in Python》\n《Understanding Distributed Systems, Second Edition: What every developer should know about large distributed applications》\n《Interpretable Machine Learning with Python: Build explainable, fair and robust high-performance models》\n《深度学习入门：基于Python的理论与实现》\n《Mastering Kubernetes Dive into Kubernetes and learn how to create and operate world-class cloud-native systems》\n《Fundamentals of Software Architecture 2nd》\n《Virtual Barrels: Quantitative Trading in the Oil Market》\n《动态对冲 管理普通期权与奇异期权》\n《Complex Adaptive Systems: An Introduction to Computational Models of Social Life》\n《Building Low Latency Applications with C++》\n《Tiny Experiments》\n《The StatQuest illustrated guide to machine learning》\n《Information Architecture and UX Design: The Integration of Information Spaces, 3rd》\n《Canva Cookbook: Unlock the full potential of Canva with practical recipes for creating stunning visuals effortlessly》\n《Unlocking the Secrets of Prompt Engineering》\n《Grokking the Advanced System Design Interview》\n《Building Agentic AI Systems》\n《Building Production-Grade Web Applications with Supabase》\n《Unlocking the Secrets of Prompt Engineering》\n《Mathematics of Machine Learning: Master linear algebra, calculus, and probability for machine learning》\n《Patterns of Application Development Using AI》\n《The Art of AI Product Development: Delivering business value》\n《LLM Design Patterns： A Practical Guide to Building Robust and Efficient AI Systems》\n《从零构建大模型》\n《Python Machine Learning By Example: Unlock machine learning best practices with real-world use cases》\n《Systems Engineering Demystified 2nd》\n《Communication for Engineers: A framework for software developers to become better communicators and increase their happiness, productivity, and impact》\n《Bayesian Models of Cognition Reverse Engineering the Mind》\n《Writing for Developers: Blogs that get read》\n《巴拉巴西网络科学》\n《危机、改革与崩溃 于晓华》\n《Designing Information Architecture》\n《关键迭代 Trustworthy online controlled experiments》\n《Agentic Design Patterns A Hands-On Guide to Building Intelligent Systems》\n《Information Theory, Inference, and Learning Algorithms》\n《数据工程之道》\n后记 此篇每年更新(有一股力量让自己去行动总是好的)！\n纸上得来终觉浅 绝知此事要躬行！\n更新记录 2018年12月19日 更新 2021年1月16日 更新 2022年1月2日 添加2022年的书单 ","permalink":"https://myself659.github.io/post/read-post/","summary":"\u003ch3 id=\"评分说明\"\u003e评分说明\u003c/h3\u003e\n\u003cp\u003e☆☆☆☆☆，五星，经典之作，强烈推荐\u003c/p\u003e\n\u003cp\u003e☆☆☆☆，四星， 适合大众需求，推荐\u003c/p\u003e\n\u003cp\u003e☆☆☆，三星 不错，看个人口味与需求\u003c/p\u003e\n\u003cp\u003e☆☆，二星  不推荐\u003c/p\u003e\n\u003cp\u003e☆，一星  强烈不推荐，得不偿失，存在严重误导\u003c/p\u003e","title":"Reading"},{"content":"科普 图解计算机科学 Why does time pass? | The Economist A MUST SEE!!! The Most Eye Opening 10 Minutes Of Your Life | Dr. Bruce Lipton Why Do Computers Use 1s and 0s? Binary and Transistors Explained. See How a CPU Works How do computers read code? 100 Amazing How-To Sites to Teach Yourself Anything 数学 The Map of Mathematics The Essence of Calculus, Chapter 1 Tips to be a better problem solver [Last lecture] | Lockdown math ep. 10 List of LaTeX mathematical symbols 经济 经济机器是怎样运行的(文字版) 经济机器是怎样运行的 (时长30分钟) Ray Dalio log The Log: What every software engineer should know about real-time data\u0026rsquo;s unifying abstraction Logging Best Practices 工具 VS Code VS Code Top-Ten Pro Tips VS Code: The Last Editor You\u0026rsquo;ll Ever Need chrome vimium Google Translate Plus Scribe AI 2023 年精选集锦 Programe 16 Programming Productivity Tools You Can Use Even if You’re Not a Programmer latex codecogs 搜索 15 Ways to Search Google 96% of People Don’t Know About 网站 10 Useful Websites You Wish You Knew Earlier! 2018 学习 How to Learn Anything\u0026hellip; Fast - Josh Kaufman The first 20 hours \u0026ndash; how to learn anything | Josh Kaufman | TEDxCSU 架构 亚马逊1万亿市值背后的架构经验：AWS十年沉淀下来的十条宝贵经验 导航 All cheat sheets TL;DR cheat for development linux-syscall-table egex Cheat Sheet GitSheet Awesome-Cheatsheets OverAPI.com HTML CheatSheet 10 JavaScript Cheat Sheets That Will Boost Your Productivity 生活 时区转换 人物 Jim Keller Jim Keller (engineer) An AnandTech Exclusive: The Jim Keller Interview Elon Musk 首飞成功！SpaceX “重型猎鹰\u0026quot;登顶世界运力最强运载火箭，马斯克卧薪七年终于再次改写历史 刚刚，马斯克改写人类航天史！SpaceX实现全球首次商业载人发射 公开信 网易CEO丁磊首封致股东信 黄峥发布2020年度致股东信：新的世界正在到来，新的物种必然出现 张一鸣卸任字节跳动CEO公开信 公关 美团外卖回应：宣布五项改进举措 给骑手留出8分钟弹性时间 饿了么将推出多等5分钟功能 外卖骑手，困在系统里 ","permalink":"https://myself659.github.io/post/share-post/","summary":"\u003ch2 id=\"科普\"\u003e科普\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=SzJ46YA_RaA\"\u003e图解计算机科学\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=OKKbkS_LOu4\"\u003eWhy does time pass? | The Economist\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=uCIgxYuNGu0\"\u003eA MUST SEE!!! The Most Eye Opening 10 Minutes Of Your Life | Dr. Bruce Lipton\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=Xpk67YzOn5w\"\u003eWhy Do Computers Use 1s and 0s? Binary and Transistors Explained.\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=cNN_tTXABUA\"\u003eSee How a CPU Works\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=QXjU9qTsYCc\"\u003eHow do computers read code?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.ratedcolleges.com/blog/2009/100-amazing-how-to-sites-to-teach-yourself-anything/\"\u003e100 Amazing How-To Sites to Teach Yourself Anything\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"数学\"\u003e数学\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=OmJ-4B-mS-Y\"\u003eThe Map of Mathematics\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=WUvTyaaNkzM\"\u003eThe Essence of Calculus, Chapter 1\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=QvuQH4_05LI\"\u003eTips to be a better problem solver [Last lecture] | Lockdown math ep. 10\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://oeis.org/wiki/List_of_LaTeX_mathematical_symbols\"\u003eList of LaTeX mathematical symbols\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"经济\"\u003e经济\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://mp.weixin.qq.com/s/n3mrAVkwvEHfVTDNfKzEXg\"\u003e经济机器是怎样运行的(文字版)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=rFV7wdEX-Mo\"\u003e经济机器是怎样运行的 (时长30分钟) Ray Dalio\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"log\"\u003elog\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying\"\u003eThe Log: What every software engineer should know about real-time data\u0026rsquo;s unifying abstraction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://dev.to/raysaltrelli/logging-best-practices-obo\"\u003eLogging Best Practices\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"工具\"\u003e工具\u003c/h2\u003e\n\u003ch3 id=\"vs-code\"\u003eVS Code\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=u21W_tfPVrY\"\u003eVS Code Top-Ten Pro Tips\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=anvYeA1pWlk\"\u003eVS Code: The Last Editor You\u0026rsquo;ll Ever Need\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"chrome\"\u003echrome\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://zhuanlan.zhihu.com/p/38179086\"\u003evimium\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://chrome.google.com/webstore/detail/google-translate-plus/jomhcfmjbfkigcepcfkcpknnppmdopmc?hl=en\"\u003eGoogle Translate Plus \u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://chromewebstore.google.com/detail/scribe-ai-documentation-s/okfkdaglfjjjfefdcppliegebpoegaii\"\u003eScribe AI\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://chromewebstore.google.com/collection/2023_favorites\"\u003e2023 年精选集锦\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"programe\"\u003ePrograme\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/javascript-in-plain-english/16-programming-productivity-tools-you-can-use-even-if-youre-not-a-programmer-a06f9a8810f0\"\u003e16 Programming Productivity Tools You Can Use Even if You’re Not a Programmer\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"latex\"\u003elatex\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://www.codecogs.com/latex/eqneditor.php\"\u003ecodecogs\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"搜索\"\u003e搜索\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=erZ3IyBCXdY\"\u003e15 Ways to Search Google 96% of People Don’t Know About\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"网站\"\u003e网站\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=ZIbNKBx88_E\"\u003e10 Useful Websites You Wish You Knew Earlier! 2018\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"学习\"\u003e学习\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=EtJy69cEOtQ\"\u003eHow to Learn Anything\u0026hellip; Fast - Josh Kaufman\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=5MgBikgcWnY\"\u003eThe first 20 hours \u0026ndash; how to learn anything | Josh Kaufman | TEDxCSU\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"架构\"\u003e架构\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://mp.weixin.qq.com/s/B1s8HaLudlRwo9KRCZ3xsw\"\u003e亚马逊1万亿市值背后的架构经验：AWS十年沉淀下来的十条宝贵经验\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"导航\"\u003e导航\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"http://www.cheat-sheets.org/\"\u003eAll cheat sheets\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://devhints.io/\"\u003eTL;DR cheat for development\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://filippo.io/linux-syscall-table/\"\u003elinux-syscall-table\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://dev.to/emmabostian/regex-cheat-sheet-2j2a\"\u003eegex Cheat Sheet\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gitsheet.wtf/\"\u003eGitSheet\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://lecoupa.github.io/awesome-cheatsheets/\"\u003eAwesome-Cheatsheets\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://overapi.com/\"\u003eOverAPI.com\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://htmlcheatsheet.com/\"\u003eHTML CheatSheet\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/javascript-in-plain-english/10-javascript-cheat-sheets-that-will-boost-your-productivity-4a210162a121\"\u003e10 JavaScript Cheat Sheets That Will Boost Your Productivity\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"生活\"\u003e生活\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://www.worldtimebuddy.com/\"\u003e时区转换\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"人物\"\u003e人物\u003c/h2\u003e\n\u003ch3 id=\"jim-keller\"\u003eJim Keller\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Jim_Keller_(engineer)\"\u003eJim Keller (engineer)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.anandtech.com/show/13048/an-anandtech-exclusive-the-jim-keller-interview\"\u003eAn AnandTech Exclusive: The Jim Keller Interview\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"elon-musk\"\u003eElon Musk\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://mp.weixin.qq.com/s/xFLPT5ZIGW8cTlD104d_-g\"\u003e首飞成功！SpaceX “重型猎鹰\u0026quot;登顶世界运力最强运载火箭，马斯克卧薪七年终于再次改写历史\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://mp.weixin.qq.com/s/XbhuqncEEX2FQhyh2oXdXA\"\u003e刚刚，马斯克改写人类航天史！SpaceX实现全球首次商业载人发射\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"公开信\"\u003e公开信\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://mp.weixin.qq.com/s/oRiWTrnH3Lo0aT3f1-J6eA\"\u003e网易CEO丁磊首封致股东信\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.xinhuanet.com/tech/2020-04/25/c_1125903947.htm\"\u003e黄峥发布2020年度致股东信：新的世界正在到来，新的物种必然出现\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://mp.weixin.qq.com/s/7P-0Y765jUXQVHQTo2wy8A\"\u003e张一鸣卸任字节跳动CEO公开信\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"公关\"\u003e公关\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://mp.weixin.qq.com/s/smRlIxX7sgQBSEEOmikoPg\"\u003e美团外卖回应：宣布五项改进举措 给骑手留出8分钟弹性时间\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://new.qq.com/rain/a/20200909A0APSH00\"\u003e饿了么将推出多等5分钟功能\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://mp.weixin.qq.com/s/Mes1RqIOdp48CMw4pXTwXw\"\u003e外卖骑手，困在系统里\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e","title":"Share"},{"content":"2017 高性能服务器设计与优化(High performance server design and optimization) 2018 数字货币钱包产品定位与战略.pdf 下一代互联网基础：IPFS.pdf ","permalink":"https://myself659.github.io/post/slide-post/","summary":"\u003ch2 id=\"2017\"\u003e2017\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://myself659.github.io/slides/%E9%AB%98%E6%80%A7%E8%83%BD%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BE%E8%AE%A1%E4%B8%8E%E4%BC%98%E5%8C%96.pdf\"\u003e高性能服务器设计与优化(High performance server design and optimization)\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"2018\"\u003e2018\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://myself659.github.io/slides/%E6%95%B0%E5%AD%97%E8%B4%A7%E5%B8%81%E9%92%B1%E5%8C%85%E4%BA%A7%E5%93%81%E5%AE%9A%E4%BD%8D%E4%B8%8E%E6%88%98%E7%95%A5.pdf\"\u003e数字货币钱包产品定位与战略.pdf\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://myself659.github.io/slides/%E4%B8%8B%E4%B8%80%E4%BB%A3%E4%BA%92%E8%81%94%E7%BD%91%E5%9F%BA%E7%A1%80%EF%BC%9AIPFS.pdf\"\u003e下一代互联网基础：IPFS.pdf\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"Slide"},{"content":"IPFS 先简单说一下IPFS。 IPFS是点对点协议InterPlanetary File System的简称，它是一个面向全球的、点对点的分布式版本文件系统，试图将所有具有相同文件系统的计算设备连接在一起。它用基于内容的地址替代基于域名的地址，也就是用户寻找的不是某个地址而是储存在某个地方的内容，不需要验证发送者的身份，而只需要验证内容的哈希，通过这样可以让网页的速度更快、更安全、更健壮、更持久。IPFS目标是未来将替代HTTP。\nIPFS主要技术，用下面这张图说明：\nIPFS与安全 整个IPFS涉及很多方面的内容，这部分具体看一下IPFS对网络安全的影响。首先从DDOS防攻击展开，IPFS应对DDOS攻击主要如下：\n道哥在弹性安全网络中表达过DDOS存在的原因就是现在互联网严重依赖存在三大问题的DNS系统,而在IPFS中通过内容寻址方式绕开了DNS IPFS底层网络是基于DHT，拥有大量节点的P2P网络，天生适合内容的分布式读写（PS：P2P网络安全需要另行考虑） 内容签名，通过加密加大攻击的难度与成本 上面的这些作法，很符合经济原理。DDOS存在主要经济学原因是DDOS获得的收益远大于DDOS的投资；IPFS的上述特点直接提高DDOS的成本。\n比较 上一篇分析了道哥的提出的弹性安全网络设想。那么，就在这里搞事情，对比一下两者。\n道哥和Juan Benet都是杰出的技术人员及创业者，富有远见\n作为安全出身的道哥的出发点解决网络安全问题主要是DDOS安全攻击问题，而IPFS目标如下：We believe the internet has become humanity's most important technology. We build protocols, systems, and tools to improve how it works. Today, we are focused on how we store, locate, and move information.\nIPFS是一种去中心化技术，而弹性安全网络接入技术可以是一种大规模的云计算技术（中心化技术）。\nIPFS没有网络访问控制功能，自由开放；弹性安全网络有网络访问控制能力，方便监管与控制\nIPFS是从数据角度来解决问题（解决数据分布，版本，访问，权限控制等）,弹性安全网络从网络安全的角度来解决问题\nIPFS开放源码，弹性安全网络没有开源，开源的IPFS体现了去中心化技术的态度\nIPFS现网运行，弹性安全网络在游戏盾中得到应用与实践，两者都有很长的路需要走\nIPFS目标是取代HTTP,同时兼容HTTP，弹性安全网络将应用场景定位在非域名类的IP网络\nIPFS对现有应用冲击很大，因为去中心化应用及基础设施（如去中心数据库）还在起步阶段；弹性安全网络考虑基于现有云计算（大规模中心化技术）应用作为出发点一种网络安全的解决方案，能够兼容云计算应用。\nIPFS支持端对端加解密，保证数据的隐私。弹性安全网络不涉及这方面内容。\nIPFS是事前准备，弹性安全网络更多体现发现攻击一种事后处理角度出发。\nIPFS用去中以化来应对攻击，弹性安全网络用技术（大数据，人工智能）来应对攻击。\n最后说一下：IPFS就像以电为动力的特斯拉，道哥的弹性安全网络则像是不断改进的燃油车。就如同特斯拉给汽车带来的革命和冲击一样，IPFS对整个互联网带来变革与颠覆。\n（个人能力有限，不足与错误欢迎指正，欢迎交流！）\n参考 IPFS Amazon\u0026rsquo;s web servers are down and it\u0026rsquo;s causing trouble across the internet Why The Internet Needs IPFS Before It\u0026rsquo;s Too Late ","permalink":"https://myself659.github.io/post/network/2017-09-21-ipfs-sec/","summary":"\u003ch3 id=\"ipfs\"\u003eIPFS\u003c/h3\u003e\n\u003cp\u003e先简单说一下IPFS。\nIPFS是点对点协议InterPlanetary File System的简称，它是一个面向全球的、点对点的分布式版本文件系统，试图将所有具有相同文件系统的计算设备连接在一起。它用基于内容的地址替代基于域名的地址，也就是用户寻找的不是某个地址而是储存在某个地方的内容，不需要验证发送者的身份，而只需要验证内容的哈希，通过这样可以让网页的速度更快、更安全、更健壮、更持久。IPFS目标是未来将替代HTTP。\u003c/p\u003e","title":"IPFS与下一代网络安全"},{"content":"作为网络研发出身的我，从事网络研发时间也最长，一直也关注道哥的微信公众号。\n下面就对道哥的提出弹性安全网络一些总结与思考。\n弹性安全网络 具体从以下几个方面解读弹性安全网络。\n来源 弹性安全网络这个设想来自阿里云游戏盾这个产品，而这个产品解决的问题就是如何解决DDOS问题。\n以前解决DDOS问题，很多厂商就是以暴制暴，准备大量带宽，抗住攻击流量，这种方式有以下问题：\n流量成本高 万一没有抗住，服务会中断 业务局限于一个数据中心，目标明显，容易受攻击（将鸡蛋放到同一个篮子） 而在游戏盾产品采用另一种方式来解决问题，主要要点如下：\n首先，业务访问支持多IP解析，分散流量（狡免三窟） 第二就是应对攻击，支持业务地址迁移，地址迁移难点就是如何快速通知到各个用户（你打我，我就闪） 定义 弹性安全网络是将DDoS防御前置到网络边缘处。但是，未来真正要做的事情是通过端到端的连接，通过风险控制技术，重新构建一个干净的、安全的互联网\n目标 弹性安全网络真正想要去做的，是替换掉整个互联网最核心的心脏，替换掉DNS，从而让网络变得有弹性，能够快速调度资源，形成一个全新的网络架构。\n弹性安全网络技术，不是为某一个客户设计的，它是为整个互联网设计的。\nDNS三个问题 DNS是互联网的心脏\n第一个，是DNS完全解析的时间过长，这是整个DNS使用中遇到的一个非常大的痛点。\n第二个问题是今天DNS Server软件中的解析数遇到了瓶颈，没有办法一个名字解析到几千个、甚至上万个，甚至未来十几万个不同地址。一个名字可能最多也就解析到十几个或几十个地址就不能再扩大了。这种瓶颈限制了我们的一些能力拓展。\n第三个就是，原本可以基于DNS去实现的一些安全机制，比如风险控制，并没有建立起来。其实也比较好理解，在互联网1.0时代并没有如今天这般强大的数据能力和计算能力。\n实现 文中并没有提及具体的实现，主要要点是：\n基于大数据的足迹库 基于人工智能的快速识别能力 分布式的统一网络访问入口，取代DNS，具体细节未知 未来 主要机会就是在IoT和移动互联网，因为这两者实际上是没有DNS的需求的\n总结 道哥的弹性安全网络，是一个伟大的构思。\n弹性安全网络出发点主要是解决DDOS问题。\n主要目标应用于IOT和移动互联网。\n弹性安全网络思考主要出发点是如何应对网络攻击，主要从两个角度出发：\n如何快速应对攻击 如何利用技术（大数据，人工智能等）识别攻击 参考 弹性安全网络 \u0026ndash; 构建下一代安全的互联网 IPFS与下一代网络安全 ","permalink":"https://myself659.github.io/post/2017-09-20-next-network/","summary":"\u003cp\u003e作为网络研发出身的我，从事网络研发时间也最长，一直也关注道哥的微信公众号。\u003c/p\u003e\n\u003cp\u003e下面就对道哥的提出弹性安全网络一些总结与思考。\u003c/p\u003e\n\u003ch3 id=\"弹性安全网络\"\u003e弹性安全网络\u003c/h3\u003e\n\u003cp\u003e具体从以下几个方面解读弹性安全网络。\u003c/p\u003e","title":"关于弹性安全网络一点思考"},{"content":"环境说明 操作系统: macos.10.12.1 geth版本：1.5.9 solc版本：0.4.15 实践 1. 启动本地geth节点 1 Michaels-iMac:wallet eric$ geth --rpc --rpcaddr 127.0.0.1 --rpcport 8545 --dev --datadir myethchain 如上操作后，geth console输出如下：\n1 2 3 4 5 6 I0824 17:28:57.448455 p2p/server.go:340] Starting Server I0824 17:28:59.554115 p2p/discover/udp.go:227] Listening, enode://04697f62537244ee34aea28e613530a1f46a64de75d8174d963c9ca0c2e6b96d4aa756ef7a33e269de1b7c088163835b72dda8f4dea712cf39569db4e8d8e43a@[::]:54798 I0824 17:28:59.554264 p2p/server.go:608] Listening on [::]:58245 I0824 17:28:59.554324 whisper/whisperv2/whisper.go:176] Whisper started I0824 17:28:59.570668 node/node.go:341] IPC endpoint opened: /Users/eric/wallet/myethchain/geth.ipc I0824 17:28:59.581423 node/node.go:411] HTTP endpoint opened: http://127.0.0.1:8545 同时也创建在当前目录创建目录myethchain，其结构如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Michaels-iMac:wallet eric$ tree myethchain/ myethchain/ ├── geth │ ├── LOCK │ ├── chaindata │ │ ├── 000002.log │ │ ├── CURRENT │ │ ├── LOCK │ │ ├── LOG │ │ └── MANIFEST-000003 │ ├── nodekey │ └── nodes │ ├── 000001.log │ ├── CURRENT │ ├── LOCK │ ├── LOG │ └── MANIFEST-000000 ├── geth.ipc └── keystore 4 directories, 13 files 2. 连接geth节点 在另外一个终端里连接geth节点。\n1 2 3 4 5 6 7 Michaels-iMac:wallet eric$ geth attach ipc://Users/eric/wallet/myethchain/geth.ipc Welcome to the Geth JavaScript console! instance: Geth/v1.5.9-stable-a07539fb/darwin/go1.8.3 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 shh:1.0 txpool:1.0 web3:1.0 \u0026gt; 3. 确保solidity编译器安装正确 1 2 3 \u0026gt; web3.eth.getCompilers() [\u0026#34;Solidity\u0026#34;] \u0026gt; 如果出错或者获取为空，请检查solc安装情况。\n4. 查看帐户列表 1 2 3 \u0026gt; personal.listAccounts null \u0026gt; 5. 创建帐户 1 2 3 \u0026gt; personal.newAccount(\u0026#39;pw1234\u0026#39;) \u0026#34;0xaf3139393f2ecb2455cbc2c7639ce111017fb90b\u0026#34; \u0026gt; 6. 查看帐户列表 1 2 3 \u0026gt; personal.listAccounts [\u0026#34;0xaf3139393f2ecb2455cbc2c7639ce111017fb90b\u0026#34;] \u0026gt; 7. 查看coibase地址 1 2 \u0026gt; web3.eth.coinbase \u0026#34;0xaf3139393f2ecb2455cbc2c7639ce111017fb90b\u0026#34; 与上面地址一致，默认取第一个创建帐户的地址，作为挖矿的收益打入该地址\n8. 准备智能合约 1 2 3 \u0026gt; source = \u0026#34;contract hello { function multen(uint a) returns(uint d){return a * 10;}}\u0026#34; \u0026#34;contract hello { function multen(uint a) returns(uint d){return a * 10;}}\u0026#34; \u0026gt; 9. 编译智能合约 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \u0026gt; code = web3.eth.compile.solidity(source) { \u0026lt;stdin\u0026gt;:hello: { code: \u0026#34;0x60606040523415600e57600080fd5b5b60978061001d6000396000f300606060405263ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663e847973c8114603c575b600080fd5b3415604657600080fd5b604f6004356061565b60405190815260200160405180910390f35b600a81025b9190505600a165627a7a72305820395c2030cb020d0b4f79ac0803f1aa28b97082d962a13f37a914f7950e1de5ec0029\u0026#34;, info: { abiDefinition: [{...}], compilerOptions: \u0026#34;--combined-json bin,abi,userdoc,devdoc --add-std --optimize\u0026#34;, compilerVersion: \u0026#34;0.4.15\u0026#34;, developerDoc: { methods: {} }, language: \u0026#34;Solidity\u0026#34;, languageVersion: \u0026#34;0.4.15\u0026#34;, source: \u0026#34;contract hello { function multen(uint a) returns(uint d){return a * 10;}}\u0026#34;, userDoc: { methods: {} } } } } 10. 根据ABI创建合约对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 \u0026gt; MyContract = web3.eth.contract(code[\u0026#34;\u0026lt;stdin\u0026gt;:hello\u0026#34;].info.abiDefinition) { abi: [{ constant: false, inputs: [{...}], name: \u0026#34;multen\u0026#34;, outputs: [{...}], payable: false, type: \u0026#34;function\u0026#34; }], eth: { accounts: [\u0026#34;0xaf3139393f2ecb2455cbc2c7639ce111017fb90b\u0026#34;], blockNumber: 0, coinbase: \u0026#34;0xaf3139393f2ecb2455cbc2c7639ce111017fb90b\u0026#34;, compile: { lll: function(), serpent: function(), solidity: function() }, defaultAccount: undefined, defaultBlock: \u0026#34;latest\u0026#34;, gasPrice: 21782200000, hashrate: 0, mining: false, pendingTransactions: [], protocolVersion: \u0026#34;0x3f\u0026#34;, syncing: false, call: function(), contract: function(abi), estimateGas: function(), filter: function(fil, callback), getAccounts: function(callback), getBalance: function(), getBlock: function(), getBlockNumber: function(callback), getBlockTransactionCount: function(), getBlockUncleCount: function(), getCode: function(), getCoinbase: function(callback), getCompilers: function(), getGasPrice: function(callback), getHashrate: function(callback), getMining: function(callback), getPendingTransactions: function(callback), getProtocolVersion: function(callback), getRawTransaction: function(), getRawTransactionFromBlock: function(), getStorageAt: function(), getSyncing: function(callback), getTransaction: function(), getTransactionCount: function(), getTransactionFromBlock: function(), getTransactionReceipt: function(), getUncle: function(), getWork: function(), iban: function(iban), icapNamereg: function(), isSyncing: function(callback), namereg: function(), resend: function(), sendIBANTransaction: function(), sendRawTransaction: function(), sendTransaction: function(), sign: function(), signTransaction: function(), submitTransaction: function(), submitWork: function() }, at: function(address, callback), getData: function(), new: function() } \u0026gt; 11. 挖矿 第一步：获取帐户地址\n1 2 3 \u0026gt; account1 = web3.eth.coinbase \u0026#34;0xaf3139393f2ecb2455cbc2c7639ce111017fb90b\u0026#34; \u0026gt; 第二步：查看balance\n1 2 3 \u0026gt; web3.eth.getBalance(account1) 0 \u0026gt; 第三步：启动挖矿\n1 2 \u0026gt; miner.start() true 第四步：查看balance\n1 2 \u0026gt; web3.eth.getBalance(account1) 424531250000000000000 第五步: 停止挖矿\n钱差不多就够了。\n1 2 3 \u0026gt; miner.stop() true \u0026gt; 12. 解锁帐户 目的是为了发送交易\n1 2 \u0026gt; personal.unlockAccount(account1, \u0026#39;pw1234\u0026#39;) true 13. 初始化智能合约 1 2 3 \u0026gt; bytecode = code[\u0026#34;\u0026lt;stdin\u0026gt;:hello\u0026#34;].code \u0026#34;0x60606040523415600e57600080fd5b5b60978061001d6000396000f300606060405263ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663e847973c8114603c575b600080fd5b3415604657600080fd5b604f6004356061565b60405190815260200160405180910390f35b600a81025b9190505600a165627a7a72305820395c2030cb020d0b4f79ac0803f1aa28b97082d962a13f37a914f7950e1de5ec0029\u0026#34; \u0026gt; 获取部署合约的gas费用开销\n1 2 3 \u0026gt; web3.eth.estimateGas({data: bytecode}) 30886 \u0026gt; 14. 部署智能合约 1 2 3 4 5 6 7 8 9 10 11 12 13 14 contractInstance = MyContract.new({data: bytecode gas: 1000000, from: account1}, function(e, contract){if(!e){if(!contract.address){console.log(\u0026#34;Contract transaction send: Transaction Hash: \u0026#34;+contract.transactionHash+\u0026#34; waiting to be mined...\u0026#34;);}else{console.log(\u0026#34;Contract mined! Address: \u0026#34;+contract.address);console.log(contract);}}else{console.log(e)}}) Contract transaction send: Transaction Hash: 0xeeac0f028e559d469b94805b986b1d9a0bd0d30289e3285487310ca426dae034 waiting to be mined... { abi: [{ constant: false, inputs: [{...}], name: \u0026#34;multen\u0026#34;, outputs: [{...}], payable: false, type: \u0026#34;function\u0026#34; }], address: undefined, transactionHash: \u0026#34;0xeeac0f028e559d469b94805b986b1d9a0bd0d30289e3285487310ca426dae034\u0026#34; } 如果出现以下错误：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 \u0026gt; contractInstance = MyContract.new({data: bytecode gas: 1000000, from: account1}, function(e, contract){if(!e){if(!contract.address){console.log(\u0026#34;Contract transaction send: Transaction Hash: \u0026#34;+contract.transactionHash+\u0026#34; waiting to be mined...\u0026#34;);}else{console.log(\u0026#34;Contract mined! Address: \u0026#34;+contract.address);console.log(contract);}}else{console.log(e)}}) Error: authentication needed: password or unlock { abi: [{ constant: false, inputs: [{...}], name: \u0026#34;multen\u0026#34;, outputs: [{...}], payable: false, type: \u0026#34;function\u0026#34; }], address: undefined, transactionHash: null } 重新解锁用户即可\n14. 重新挖矿 1 2 3 4 \u0026gt; miner.start() true \u0026gt; Contract mined! Address: 0x58dba5bddccde639cef014c1766561abbc46c13f [object Object] 15. 切换 console 1 2 3 4 \u0026gt; Contract mined! Address: 0x58dba5bddccde639cef014c1766561abbc46c13f [object Object] ^C \u0026gt; 16. 检查合约安装是否成功 1 2 3 \u0026gt; eth.getCode(contractInstance.address) \u0026#34;0x606060405263ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663e847973c8114603c575b600080fd5b3415604657600080fd5b604f6004356061565b60405190815260200160405180910390f35b600a81025b9190505600a165627a7a72305820395c2030cb020d0b4f79ac0803f1aa28b97082d962a13f37a914f7950e1de5ec0029\u0026#34; \u0026gt; 17. 调用合约函数 1 2 \u0026gt; contractInstance.multen.call(9) 90 (end)\n","permalink":"https://myself659.github.io/post/2017-08-24-ethereum-start/","summary":"\u003ch1 id=\"环境说明\"\u003e环境说明\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e操作系统: macos.10.12.1\u003c/li\u003e\n\u003cli\u003egeth版本：1.5.9\u003c/li\u003e\n\u003cli\u003esolc版本：0.4.15\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"实践\"\u003e实践\u003c/h1\u003e\n\u003ch2 id=\"1-启动本地geth节点\"\u003e1. 启动本地geth节点\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMichaels-iMac:wallet eric$ geth   --rpc --rpcaddr 127.0.0.1 --rpcport 8545 --dev --datadir myethchain  \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e如上操作后，geth  console输出如下：\u003c/p\u003e","title":"以太坊私链智能合约实践"},{"content":"背景 Depth-First-Search(DFS)深度优先搜索与Breadth-First Search(BFS)广度优先搜索是树与图中最常用的算法。\nDFS 适用于DFS场景：\n在图中找到两个节点之间中最长路径 检测图中是否存在环 当一个树分支很多，使用BFS会导致内存不足或者占用太多，可以考虑使用DFS 需要在先访问子节点，再访问兄弟节点 通过DFS可以访问更多可能路径，可以用于解决迷宫与拼图问题 BFS 适用于BFS场景：\n在图中找到两个节点之间的最短路径时 在断定目标节点在根节点或者起始节点附近（不需要深度搜索） 优先搜索靠近起始节点的节点 需要在先访问兄弟节点，再访问子节点 ","permalink":"https://myself659.github.io/post/dsa/dfs-vs-bfs/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003eDepth-First-Search(DFS)深度优先搜索与Breadth-First Search(BFS)广度优先搜索是树与图中最常用的算法。\u003c/p\u003e","title":"DFS与BFS适用场景"},{"content":"说明 主要记录以太坊开发环境过程出现的问题\ngetCompilers返回失败 问题描述 在搭建以太坊开发环境过程中，出现下面的错误信息：\n1 2 3 4 5 6 7 8 9 10 11 Welcome to the Geth JavaScript console! instance: Geth/v1.6.7-stable-ab5646c5/darwin-amd64/go1.8.3 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 shh:1.0 txpool:1.0 web3:1.0 \u0026gt; web3.eth.getCompilers() Error: The method eth_getCompilers does not exist/is not available at web3.js:3104:20 at web3.js:6191:15 at web3.js:5004:36 at \u0026lt;anonymous\u0026gt;:1:1 问题原因 geth版本编译不在gopath目录下编译\n解决方法 在gopath目录重新编译即可\n1 2 3 4 5 6 7 8 9 Michaels-iMac:wallet eric$ geth attach ipc://Users/eric/wallet/privchain/geth.ipc Welcome to the Geth JavaScript console! instance: Geth/v1.5.9-stable-a07539fb/darwin/go1.8.3 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 shh:1.0 txpool:1.0 web3:1.0 \u0026gt; web3.eth.getCompilers() [\u0026#34;Solidity\u0026#34;] \u0026gt; parity启动失败 问题描述 搭建测试环境中出现以下问题：\n1 2 3 4 root@ia:~#parity --chain=kovan --jsonrpc-hosts=all parity: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.8\u0026#39; not found (required by parity) parity: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.20\u0026#39; not found (required by parity) parity: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.21\u0026#39; not found (required by parity) 问题原因 gcc/g++版本是4.8版本\n解决方案 升级gcc/g++\n1 2 3 4 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt-get install gcc-4.9 g++-4.9 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.9 parity访问出现bad gateway问题 问题描述 1 curl -X POST http://localhost:8545 -H \u0026#34;Content-Type: application/json\u0026#34; -d \u0026#39;{\u0026#34;jsonrpc\u0026#34;:\u0026#34;2.0\u0026#34;,\u0026#34;method\u0026#34;:\u0026#34;eth_getBlockByNumber\u0026#34;,\u0026#34;params\u0026#34;:[\u0026#34;0x1b4\u0026#34;, true],\u0026#34;id\u0026#34;:1}\u0026#39; 本地访问ok\n1 curl -X POST http://47.96.45.67:8545 -H \u0026#34;Content-Type: application/json\u0026#34; -d \u0026#39;{\u0026#34;jsonrpc\u0026#34;:\u0026#34;2.0\u0026#34;,\u0026#34;method\u0026#34;:\u0026#34;eth_getBlockByNumber\u0026#34;,\u0026#34;params\u0026#34;:[\u0026#34;0x1b4\u0026#34;, true],\u0026#34;id\u0026#34;:1}\u0026#39; 远程访问返回失败\n问题原因 1 parity --chain=kovan --jsonrpc-hosts=all 上面命令限定侦听端口为本机接口\n解决方案 1 parity --chain=kovan --jsonrpc-interface=0.0.0.0 --jsonrpc-hosts=all 以上述命令启动parity打开侦听限制\n没有eth无法在kovan上部署智能合约 问题描述 没有eth无法部署成功部署智能合约\n问题原因 天下没有免费的午餐\n解决方法 参考Kovan Faucet,四种方式选择其中一个即可，Github Gist Faucet方式参考这里\n","permalink":"https://myself659.github.io/post/2017-08-22-ethereum--cannot-getsolidity/","summary":"\u003ch1 id=\"说明\"\u003e说明\u003c/h1\u003e\n\u003cp\u003e主要记录以太坊开发环境过程出现的问题\u003c/p\u003e\n\u003ch1 id=\"getcompilers返回失败\"\u003egetCompilers返回失败\u003c/h1\u003e\n\u003ch2 id=\"问题描述\"\u003e问题描述\u003c/h2\u003e\n\u003cp\u003e在搭建以太坊开发环境过程中，出现下面的错误信息：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWelcome to the Geth JavaScript console!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einstance: Geth/v1.6.7-stable-ab5646c5/darwin-amd64/go1.8.3\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 shh:1.0 txpool:1.0 web3:1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; web3.eth.getCompilers() \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eError: The method eth_getCompilers does not exist/is not available\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    at web3.js:3104:20\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    at web3.js:6191:15\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    at web3.js:5004:36\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    at \u0026lt;anonymous\u0026gt;:1:1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"问题原因\"\u003e问题原因\u003c/h2\u003e\n\u003cp\u003egeth版本编译不在gopath目录下编译\u003c/p\u003e","title":"以太坊开发环境问题记录"},{"content":"前言 先下结论：slice复用得当心，引用不当深埋雷。如若复用请分叉，分叉之后再使用。\n问题 先看一下代码吧\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package main import ( \u0026#34;fmt\u0026#34; ) func a() { x := []int{} x = append(x, 0) x = append(x, 1) // commonTags := labelsToTags(app.Labels) y := append(x, 2) // Tags: append(commonTags, labelsToTags(d.Labels)...) z := append(x, 3) // Tags: append(commonTags, labelsToTags(d.Labels)...) fmt.Println(y, z) } func b() { x := []int{} x = append(x, 0) x = append(x, 1) x = append(x, 2) // commonTags := labelsToTags(app.Labels) y := append(x, 3) // Tags: append(commonTags, labelsToTags(d.Labels)...) z := append(x, 4) // Tags: append(commonTags, labelsToTags(d.Labels)...) fmt.Println(y, z) } func main() { a() b() } 上面的如此简单的代码，分析代码希望得到预期结果如下：\n1 2 [0 1 2] [0 1 3] [0 1 2 3] [0 1 2 4] 但是执行后，得到结果如下：\n1 2 3 Michaels-iMac:golab eric$ go run slice.go [0 1 2] [0 1 3] [0 1 2 4] [0 1 2 4] 原因分析 我们先不急着分析具体原因，我们对比一下下面这段代码，看看执行结果是怎么样\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 package main import ( \u0026#34;fmt\u0026#34; ) func a() { x := []int{} x = append(x, 0) x = append(x, 1) // commonTags := labelsToTags(app.Labels) y := append(x, 2) // Tags: append(commonTags, labelsToTags(d.Labels)...) z := append(x, 3) // Tags: append(commonTags, labelsToTags(d.Labels)...) fmt.Println(y, z) } func deepcopy(src []int) []int { dst := make([]int, len(src)) copy(dst, src) return dst } func b() { x := []int{} x = append(x, 0) x = append(x, 1) x = append(x, 2) // commonTags := labelsToTags(app.Labels) y := deepcopy(x) y = append(y, 3) // Tags: append(commonTags, labelsToTags(d.Labels)...) z := append(x, 4) // Tags: append(commonTags, labelsToTags(d.Labels)...) fmt.Println(y, z) } func main() { a() b() } 具体执行结果如下：\n1 2 3 Michaels-iMac:golab eric$ go run slice-2.go [0 1 2] [0 1 3] [0 1 2 3] [0 1 2 4] 对比错误的代码，会发现问题原因出现下面的代码：\n1 2 y := append(x, 3) // Tags: append(commonTags, labelsToTags(d.Labels)...) z := append(x, 4) // Tags: append(commonTags, labelsToTags(d.Labels)...) 从内存角度来思考，y与z对应是同一段内存，z的操作override的y的操作。（备注：y与z为什么会更对应同一段内存，请了解一下slice的实现及slice的巧妙的使用，也请阅读下面参考文章Golang slices gotcha）\n解决方法就是如果slice要进行复用的时候，进行深度copy再进行使用。\n总结 slice在golang编程属于超高频使用，如果出现上面的错误，前期没有发现，如果上线，并且系统复杂，出现了问题，定位成本是很大。\n虽然上面没有slice的内存分析，但是对于程序员来说学习一些内存知识还很帮助，理解上面的问题就是小case了。\n参考 Golang slices gotcha ","permalink":"https://myself659.github.io/post/2017-07-28-slice-trap/","summary":"\u003ch3 id=\"前言\"\u003e前言\u003c/h3\u003e\n\u003cp\u003e先下结论：slice复用得当心，引用不当深埋雷。如若复用请分叉，分叉之后再使用。\u003c/p\u003e\n\u003ch3 id=\"问题\"\u003e问题\u003c/h3\u003e\n\u003cp\u003e先看一下代码吧\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003epackage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e{}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// commonTags := labelsToTags(app.Labels)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ey\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Tags: append(commonTags, labelsToTags(d.Labels)...)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ez\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Tags: append(commonTags, labelsToTags(d.Labels)...)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e{}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// commonTags := labelsToTags(app.Labels)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ey\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Tags: append(commonTags, labelsToTags(d.Labels)...)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ez\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Tags: append(commonTags, labelsToTags(d.Labels)...)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nf\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nf\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e上面的如此简单的代码，分析代码希望得到预期结果如下：\u003c/p\u003e","title":"slice复用的陷阱"},{"content":"什么是拖延症 拖延症是一种结果。\n拖延症是一种状态。\n拖延症是一种情绪调节方式。\n拖延症是一种延迟选择。\n拖延症是现在的自我与未来的自我之间的矛盾。\n拖延症是选择性的。\n每个人都有拖延症。\n原因与症状 害怕失败 追求完美 过度思考与想太多 缺少动力与兴趣 缺少能量 不自律 缺少行动意识 行动不明确具体 不能一次性做到位 追求及时满足，通常把时间花在及时满足的事情 准备太多 依赖外部如等上层决策与外部配合 进度受阻 不知道如何开始 危害 浪费时间 低效率与低产出 影响进度，导致竞争失败 伤害个人声誉与信用 导致贫穷，影响健康 导致陷入恶性循环（不能完成的事情越来越多） 如何战胜拖延症 心理与情绪 自我认同，承认自己有拖延症，避免对拖延症的焦虑以及进一步的恶性循环 找到自己拖延的原因，特别是情绪原因（压力，害怕，焦虑等等），找到引起这些情绪原因的现实因素 自我意识训练：目标意识，行动意识，完成意识 行动与完成 每天确定核心工作，不超过三件 分解大任务 设定deadline与定期报告进展 公开目标与计划 明确开始与第一步的具体工作 可视化任务进展并展示 小任务的方式通过多迭代完成 正确面对行动失败，失败先休息现重新开始 完成任务有个性化奖励 利用习惯，建立习惯 学会如何进入心流状态，这样可以工作过程中就能得到奖励 从最重要最难的事情开始（Eat the Frog） 实时协作 坚持例行routine并利用势头 ","permalink":"https://myself659.github.io/post/learn/%E6%8B%96%E5%BB%B6%E7%97%87-procrastination/","summary":"\u003ch2 id=\"什么是拖延症\"\u003e什么是拖延症\u003c/h2\u003e\n\u003cp\u003e拖延症是一种结果。\u003c/p\u003e\n\u003cp\u003e拖延症是一种状态。\u003c/p\u003e\n\u003cp\u003e拖延症是一种情绪调节方式。\u003c/p\u003e\n\u003cp\u003e拖延症是一种延迟选择。\u003c/p\u003e\n\u003cp\u003e拖延症是现在的自我与未来的自我之间的矛盾。\u003c/p\u003e\n\u003cp\u003e拖延症是选择性的。\u003c/p\u003e\n\u003cp\u003e每个人都有拖延症。\u003c/p\u003e","title":"有关拖延症的一切"},{"content":"思考的质量 人一思考,上帝就开始发笑。所以人要学会思考，提高思考的质量。\n下面从四个角度来看看有哪些因素决定思考的质量？\n原则 怀疑一切，大胆假设，小心验证 实事求是 注重方法与策略 主动积极 Input 好问题 问题描述 能量 专注 Process 广度 深度 清晰 适度 创造 Output 清晰 准确 全面 深度 逻辑 创造 可操作性 持续性 总结 高质量思考= 高质量的原则+高质量的Input+高质量的Process+高质量的Output。\n","permalink":"https://myself659.github.io/post/learn/%E9%AB%98%E8%B4%A8%E9%87%8F%E6%80%9D%E8%80%83-thinking/","summary":"\u003ch2 id=\"思考的质量\"\u003e思考的质量\u003c/h2\u003e\n\u003cp\u003e人一思考,上帝就开始发笑。所以人要学会思考，提高思考的质量。\u003c/p\u003e\n\u003cp\u003e下面从四个角度来看看有哪些因素决定思考的质量？\u003c/p\u003e\n\u003ch2 id=\"原则\"\u003e原则\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e怀疑一切，大胆假设，小心验证\u003c/li\u003e\n\u003cli\u003e实事求是\u003c/li\u003e\n\u003cli\u003e注重方法与策略\u003c/li\u003e\n\u003cli\u003e主动积极\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"input\"\u003eInput\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e好问题\u003c/li\u003e\n\u003cli\u003e问题描述\u003c/li\u003e\n\u003cli\u003e能量\u003c/li\u003e\n\u003cli\u003e专注\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"process\"\u003eProcess\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e广度\u003c/li\u003e\n\u003cli\u003e深度\u003c/li\u003e\n\u003cli\u003e清晰\u003c/li\u003e\n\u003cli\u003e适度\u003c/li\u003e\n\u003cli\u003e创造\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"output\"\u003eOutput\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e清晰\u003c/li\u003e\n\u003cli\u003e准确\u003c/li\u003e\n\u003cli\u003e全面\u003c/li\u003e\n\u003cli\u003e深度\u003c/li\u003e\n\u003cli\u003e逻辑\u003c/li\u003e\n\u003cli\u003e创造\u003c/li\u003e\n\u003cli\u003e可操作性\u003c/li\u003e\n\u003cli\u003e持续性\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"总结\"\u003e总结\u003c/h2\u003e\n\u003cp\u003e高质量思考= 高质量的原则+高质量的Input+高质量的Process+高质量的Output。\u003c/p\u003e","title":"什么是高质量的思考"},{"content":"引言 记得小学语文课本上有一篇文章：《画杨桃》。作者根据自己看到的，把杨桃画成像个五角星的样子。文章想表达两个意思：\n实事求是 同一个事物，角度不同，看见不同 多个角度 在现实生活中看事物的角度远比上面《画杨桃》复杂，因为事物可能不像杨桃那么具体，也不要杨桃静止在那里，更有可能还不知道从哪些角度看。\n这里列出一些角度的参考：\n时间 利益 结构 系统 变化 空间 博弈与交易 多个自我 每个人都有多个自我，具体参考如下：\n自己认知的自我 客观的自我 过去的自我 现在的自我 将来的自我 别人认知的自我 我认为别人认知的自我 展示的自我 隐藏的自我 复杂的世界 人心善变。\n复杂是人心。\n多样的角度。\n复杂的连接与网络。\n有人是好人，有人是坏人。有时是好人，有时是坏人。\n世界的复杂根本不用好坏来形容人。\n世界的复杂让一切信誓旦旦显得那么愚蠢与无知。\n面对世界的复杂请保持一颗敬畏之心。\n","permalink":"https://myself659.github.io/post/rt/%E5%A4%9A%E4%B8%AA%E8%A7%92%E5%BA%A6%E5%A4%9A%E4%B8%AA%E8%87%AA%E5%B7%B1%E5%A4%9A%E6%A0%B7%E4%B8%96%E7%95%8C/","summary":"\u003ch2 id=\"引言\"\u003e引言\u003c/h2\u003e\n\u003cp\u003e记得小学语文课本上有一篇文章：《画杨桃》。作者根据自己看到的，把杨桃画成像个五角星的样子。文章想表达两个意思：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e实事求是\u003c/li\u003e\n\u003cli\u003e同一个事物，角度不同，看见不同\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"多个角度\"\u003e多个角度\u003c/h2\u003e\n\u003cp\u003e在现实生活中看事物的角度远比上面《画杨桃》复杂，因为事物可能不像杨桃那么具体，也不要杨桃静止在那里，更有可能还不知道从哪些角度看。\u003c/p\u003e","title":"多个角度多个自我与复杂的世界"},{"content":"目标的意义 目标是指导前进的方向 目标帮助思考：我们真正想要的是什么？ 目标是动力的来源之一 目标有利于抗干扰，提高专注力 SMART原则 谈及目标原则，必会谈到SMART原则。\n关于SMART原则，可以根据五个字母拆解如下：\n1. 目标必须是具体的（Specific） 2. 目标必须是可以衡量的（Measurable） 3. 目标必须是可以达到的（Attainable） 4. 目标必须和其他目标具有相关性（Relevant） 5. 目标必须具有明确的截止期限（Time-based）\nSMART原则存在以下问题：\nSMART原则是针对具体目标设置的原则 虽然SMART原则对于目标的完成作了具体的要求，但是缺少对于目标的标准没有明确的说明 针对这些问题，个人补充6个原则：\n目标要少 目标要准 目标标准要高 目标要有阶段性 目标基于过程而是基于结果 目标与最强的动机结合 目标要少 在生活与工作我们在设定目标的时候最容易出现这种情况： 设定目标如山倒，完成目标如抽丝。出现这种情况的原因之一就是目标太多，导致缺少专注，同时要完成目标多，导致精力有限，目标之间切换成本增高。\n目标少的话，可以提高专注，进一步提高效率，在实际工作中就是遵守one-task的原则。\n目标要准 目标少可以有效提高目标的完成率，目标完成并不一定会有好的产出。这里举一个例子，有一些公司用代码行数来作为员工的考核指标，这种情况下往往只会导致公司的代码库越来越大，代码质量越来越差，整个系统的问题越来越多。这是一个典型目标设定不准确的体现，准确目标应该是提高公司产品稳定性，增加合理的功能，满足市场需求，提高公司的营收与市场竞争力。\n目标标准要高 目标要完成同时也要兼顾高标准，不能为了完成降低标准。特别是个人成长方面，只有高标准才能进一步激发自己的潜能，不断进步。\n典型例子：团队招聘的时候要求新加入的成员的水平要在团队平均水平之上，这样才能不断提高这个团队的水平。\n目标要有阶段性 最常见就是一个年度目标要有对应的季度目标，月度目标，星期目标，这样才能不断推进自己完成目标，而不是光有一个宏伟的目标。\n目标基于过程而是基于结果 基于结果的目标只关注你想要的结果，而不关注实现它所需的行动。如果你过于关注结果，而对实现结果所需的行动不够关注，你就不会取得任何进展。相反基于过程的目标可帮助您专注于实现特定结果所需采取的行动。例如如果要减肥，目标定为一周去四次健身房相比较于一个月减10斤更好。\n目标与最强的动机结合 制定目标要与最强的动机结合起来，动机越强，完成目标的可能性更高。\n怎么加强动机呢？目标要与自己最在意的人和事结合在一起。\n（end）\n","permalink":"https://myself659.github.io/post/done/principle-to-set-goal-%E7%9B%AE%E6%A0%87/","summary":"\u003ch2 id=\"目标的意义\"\u003e目标的意义\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e目标是指导前进的方向\u003c/li\u003e\n\u003cli\u003e目标帮助思考：我们真正想要的是什么？\u003c/li\u003e\n\u003cli\u003e目标是动力的来源之一\u003c/li\u003e\n\u003cli\u003e目标有利于抗干扰，提高专注力\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"smart原则\"\u003eSMART原则\u003c/h2\u003e\n\u003cp\u003e谈及目标原则，必会谈到SMART原则。\u003c/p\u003e","title":"设定目标的原则"},{"content":"从Git历史中彻底删除大文件 描述 1 2 3 4 5 remote: Resolving deltas: 100% (23/23), completed with 17 local objects. remote: error: Trace: 4836afb0ea0a96bb85e61a8ae818673e2f110a05c0da9e6813f8fa0c34ba2816 remote: error: See https://gh.io/lfs for more information. remote: error: File pdsv3.json is 184.08 MB; this exceeds GitHub\u0026#39;s file size limit of 100.00 MB remote: error: GH001: Large files detected. You may want to try Git Large File Storage 方案 备份当前代码（防止操作失误）\n安装git-filter-repo\n1 pip install git-filter-repo 从所有Git历史中删除文件 1 git filter-repo --path pdsv3.json --invert-paths 强制推送到远程仓库 1 2 3 git push origin --force main git push origin --force --all # 强制推送所有分支 git push origin --force --tags # 强制推送标签（如有必要） 清理本地仓库残留 1 git gc --prune=now Git LFS（Large File Storage） 方案 安装git LFS 1 2 3 4 5 6 7 8 # 适用于 macOS/Linux brew install git-lfs # 或通过官方脚本 curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash sudo apt-get install git-lfs # Windows 用户可从官网下载安装包：https://git-lfs.com/ 1 git lfs install 用 LFS 跟踪大文件 1 git lfs track \u0026#34;pdsv3.json\u0026#34; 提交并推送 1 2 3 git add pdsv3.json git commit -m \u0026#34;Track pdsv3.json with Git LFS\u0026#34; git push --force origin main 验证文件是否被 LFS 管理 1 git lfs ls-files Could not read from remote repository 问题描述 1 2 3 4 5 6 git push origin --force --all fatal: \u0026#39;origin\u0026#39; does not appear to be a git repository fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 方案 检查当前远程仓库配置 1 git remote -v 添加/修正远程仓库 情况 1：从未配置过远程仓库 如果 git remote -v 无输出，手动添加 origin：\n1 git remote add origin https://github.com/{username}/{repo-name}.git 情况 2：origin URL 错误 删除旧 origin 并重新添加：\n1 2 git remote remove origin # 删除旧配置 git remote add origin 正确的仓库URL # 重新添加 ","permalink":"https://myself659.github.io/post/devops/git-issue/","summary":"\u003ch2 id=\"从git历史中彻底删除大文件\"\u003e从Git历史中彻底删除大文件\u003c/h2\u003e\n\u003ch3 id=\"描述\"\u003e描述\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Resolving deltas: 100% (23/23), completed with 17 local objects.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: error: Trace: 4836afb0ea0a96bb85e61a8ae818673e2f110a05c0da9e6813f8fa0c34ba2816\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: error: See https://gh.io/lfs for more information.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: error: File pdsv3.json is 184.08 MB; this exceeds GitHub\u0026#39;s file size limit of 100.00 MB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: error: GH001: Large files detected. You may want to try Git Large File Storage\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"方案\"\u003e方案\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e备份当前代码（防止操作失误）\u003c/p\u003e","title":"git FAQ"},{"content":"日常工作中最常见问题是如何诊断一个进程运行过程中出现的问题，下面的总结从进程诊断的角度来展示，而是不从工具与命令角度来展示，进程诊断是工作的主体，工具与命令只是工具。\n进程信息 获得进程PID 方式一：\n1 2 root@iZ2ze9qnmldt4l3l82gtviZ:~# pidof tmsf-zc 2064 方式2：\n1 2 3 4 root@iZ2ze9qnmldt4l3l82gtviZ:~# ps -ef | grep tmsf-zc root 2064 1 0 Mar17 ? 02:24:25 ./tmsf-zc root 7596 7288 0 15:07 pts/4 00:00:00 grep --color=auto tmsf-zc root@iZ2ze9qnmldt4l3l82gtviZ:~# 查看进程线程个数 及对应PID 1 2 3 4 5 6 7 8 root@iZ2ze9qnmldt4l3l82gtviZ:~# ps -efL | grep tmsf-zc root 2064 1 2064 0 5 Mar17 ? 00:00:00 ./tmsf-zc root 2064 1 2066 0 5 Mar17 ? 01:04:46 ./tmsf-zc root 2064 1 2067 0 5 Mar17 ? 00:44:53 ./tmsf-zc root 2064 1 2068 0 5 Mar17 ? 00:34:39 ./tmsf-zc root 2064 1 2069 0 5 Mar17 ? 00:00:04 ./tmsf-zc root 7604 7288 7604 0 1 15:08 pts/4 00:00:00 grep --color=auto tmsf-zc root@iZ2ze9qnmldt4l3l82gtviZ:~# 查看进程CPU与内存使用情况 1 2 3 4 5 6 7 8 9 10 11 12 13 14 root@iZ2ze9qnmldt4l3l82gtviZ:~# top -H -p 2064 top - 15:10:57 up 14 days, 5:43, 3 users, load average: 0.00, 0.03, 0.05 Threads: 5 total, 0 running, 5 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.7 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 2049904 total, 1961580 used, 88324 free, 204396 buffers KiB Swap: 0 total, 0 used, 0 free. 1334832 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2064 root 20 0 55752 7180 2756 S 0.0 0.4 0:00.00 tmsf-zc 2066 root 20 0 55752 7180 2756 S 0.0 0.4 64:46.35 tmsf-zc 2067 root 20 0 55752 7180 2756 S 0.0 0.4 44:53.83 tmsf-zc 2068 root 20 0 55752 7180 2756 S 0.0 0.4 34:39.08 tmsf-zc 2069 root 20 0 55752 7180 2756 S 0.0 0.4 0:04.49 tmsf-zc 1 2 3 4 5 6 7 8 9 10 root@iZ2ze9qnmldt4l3l82gtviZ:~# top -p 2064 top - 15:11:05 up 14 days, 5:43, 3 users, load average: 0.00, 0.03, 0.05 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.8 us, 1.2 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 2049904 total, 1961448 used, 88456 free, 204396 buffers KiB Swap: 0 total, 0 used, 0 free. 1334836 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2064 root 20 0 55752 7180 2756 S 0.0 0.4 144:25.09 tmsf-zc 查看进程对应的可执行文件 1 2 3 root@iZ2ze9qnmldt4l3l82gtviZ:~# ls -l /proc/2064/exe lrwxrwxrwx 1 root root 0 Mar 17 10:12 /proc/2064/exe -\u0026gt; /test/tmsf-zc root@iZ2ze9qnmldt4l3l82gtviZ:~# 查看进程占用fd个数 1 2 root@iZ2ze9qnmldt4l3l82gtviZ:~# ls -l /proc/2064/fdinfo | wc -l 18 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 root@iZ2ze9qnmldt4l3l82gtviZ:~# lsof -p 2064 | grep tmsf-zc tmsf-zc 2064 root cwd DIR 253,1 4096 1967431 /test tmsf-zc 2064 root rtd DIR 253,1 4096 2 /test tmsf-zc 2064 root txt REG 253,1 8660422 1049012 test/tmsf-zc tmsf-zc 2064 root mem REG 253,1 1840928 796801 /lib/x86_64-linux-gnu/libc-2.19.so tmsf-zc 2064 root mem REG 253,1 141574 796793 /lib/x86_64-linux-gnu/libpthread-2.19.so tmsf-zc 2064 root mem REG 253,1 149120 796794 /lib/x86_64-linux-gnu/ld-2.19.so tmsf-zc 2064 root 0r CHR 1,3 0t0 5304 /dev/null tmsf-zc 2064 root 1w REG 253,1 306118 1971776 test/nohup.out tmsf-zc 2064 root 2w REG 253,1 306118 1971776 test/nohup.out tmsf-zc 2064 root 3u sock 0,7 0t0 974790 can\u0026#39;t identify protocol tmsf-zc 2064 root 4u 0000 0,9 0 5259 anon_inode tmsf-zc 2064 root 5u IPv4 192212 0t0 TCP 172.17.11.187:47222-\u0026gt;60.191.13.153:http (ESTABLISHED) tmsf-zc 2064 root 6u IPv4 216011 0t0 TCP 172.17.11.187:47275-\u0026gt;60.191.13.153:http (ESTABLISHED) tmsf-zc 2064 root 7u IPv4 270741 0t0 TCP 172.17.11.187:40874-\u0026gt;60.191.13.122:http (ESTABLISHED) tmsf-zc 2064 root 8u IPv4 357728 0t0 TCP 172.17.11.187:40966-\u0026gt;60.191.13.122:http (ESTABLISHED) tmsf-zc 2064 root 9u IPv4 417481 0t0 TCP 172.17.11.187:47589-\u0026gt;60.191.13.153:http (ESTABLISHED) tmsf-zc 2064 root 10u IPv4 504612 0t0 TCP 172.17.11.187:41185-\u0026gt;60.191.13.122:http (ESTABLISHED) tmsf-zc 2064 root 11u IPv4 555010 0t0 TCP 172.17.11.187:47795-\u0026gt;60.191.13.153:http (ESTABLISHED) tmsf-zc 2064 root 12u IPv4 665995 0t0 TCP 172.17.11.187:41409-\u0026gt;60.191.13.122:http (ESTABLISHED) tmsf-zc 2064 root 13u IPv4 717507 0t0 TCP 172.17.11.187:42001-\u0026gt;60.191.13.122:http (ESTABLISHED) tmsf-zc 2064 root 14u IPv4 755724 0t0 TCP 172.17.11.187:42108-\u0026gt;60.191.13.122:http (ESTABLISHED) tmsf-zc 2064 root 15u IPv4 846915 0t0 TCP 172.17.11.187:48714-\u0026gt;60.191.13.153:http (ESTABLISHED) tmsf-zc 2064 root 16u IPv4 974784 0t0 TCP 172.17.11.187:49598-\u0026gt;60.191.13.153:http (ESTABLISHED) 从proc/pid/stat获取更多进程信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 root@iZ2ze9qnmldt4l3l82gtviZ:~# procstat 2064 pid: 2064 tcomm: (tmsf-zc) state: S ppid: 1 pgid: 2058 sid: 1911 tty_nr: 0 tty_pgrp: -1 flags: 1077960960 min_flt: 7652 cmin_flt: 0 maj_flt: 10 cmaj_flt: 0 utime: 2558.590000 stime: 6106.500000 cutime: 0.000000 cstime: 0.000000 priority: 20 nice: 0 num_threads: 5 it_real_value: 0.000000 start_time: 03.17 10:12 (971043.78s) vsize: 57090048 rss: 1795 rsslim: 9223372036854775807 start_code: 4194304 end_code: 7446752 start_stack: 140735025190528 esp: 140735025189968 eip: 4549907 pending: 0000000000000000 blocked: 0000000000000000 sigign: 0000000000000003 sigcatch: 000000007fc1fefc wchan: 0 zero1: 0 zero2: 0 exit_signal: 0000000000000011 cpu: 0 rt_priority: 0 policy: 0 root@iZ2ze9qnmldt4l3l82gtviZ:~# 查看进程父子关系 1 2 3 4 5 6 root@iZ2ze9qnmldt4l3l82gtviZ:~# pstree -g -p -s 2064 init(1,1)───tmsf-zc(2064,2058)─┬─{tmsf-zc}(2066,2058) ├─{tmsf-zc}(2067,2058) ├─{tmsf-zc}(2068,2058) └─{tmsf-zc}(2069,2058) root@iZ2ze9qnmldt4l3l82gtviZ:~# 查看进程内存map信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 root@iZ2ze9qnmldt4l3l82gtviZ:~# pmap -x -p 2064 2064: ./tmsf-zc Address Kbytes RSS Dirty Mode Mapping 0000000000400000 3180 1472 0 r-x-- /test/tmsf-zc 000000000071b000 2336 948 0 r---- /test/tmsf-zc 0000000000963000 204 104 72 rw--- /test/tmsf-zc 0000000000996000 140 60 60 rw--- [ anon ] 0000000000c6a000 132 4 4 rw--- [ anon ] 000000c000000000 8 8 8 rw--- [ anon ] 000000c41ffc0000 256 256 256 rw--- [ anon ] 000000c420000000 2048 1364 1364 rw--- [ anon ] 000000c420200000 2048 2048 2048 rw--- [ anon ] 000000c420400000 4096 672 672 rw--- [ anon ] 00007f27075d8000 1408 112 112 rw--- [ anon ] 00007f2707738000 4 0 0 ----- [ anon ] 00007f2707739000 8192 8 8 rw--- [ anon ] 00007f2707f39000 4 0 0 ----- [ anon ] 00007f2707f3a000 8192 8 8 rw--- [ anon ] 00007f270873a000 4 0 0 ----- [ anon ] 00007f270873b000 8192 8 8 rw--- [ anon ] 00007f2708f3b000 4 0 0 ----- [ anon ] 00007f2708f3c000 8192 8 8 rw--- [ anon ] 00007f270973c000 1768 232 0 r-x-- /lib/x86_64-linux-gnu/libc-2.19.so 00007f27098f6000 2048 0 0 ----- /lib/x86_64-linux-gnu/libc-2.19.so 00007f2709af6000 16 16 16 r---- /lib/x86_64-linux-gnu/libc-2.19.so 00007f2709afa000 8 8 8 rw--- /lib/x86_64-linux-gnu/libc-2.19.so 00007f2709afc000 20 16 16 rw--- [ anon ] 00007f2709b01000 100 68 0 r-x-- /lib/x86_64-linux-gnu/libpthread-2.19.so 00007f2709b1a000 2044 0 0 ----- /lib/x86_64-linux-gnu/libpthread-2.19.so 00007f2709d19000 4 4 4 r---- /lib/x86_64-linux-gnu/libpthread-2.19.so 00007f2709d1a000 4 4 4 rw--- /lib/x86_64-linux-gnu/libpthread-2.19.so 00007f2709d1b000 16 4 4 rw--- [ anon ] 00007f2709d1f000 140 116 0 r-x-- /lib/x86_64-linux-gnu/ld-2.19.so 00007f2709e6f000 780 376 376 rw--- [ anon ] 00007f2709f3f000 8 8 8 rw--- [ anon ] 00007f2709f41000 4 4 4 r---- /lib/x86_64-linux-gnu/ld-2.19.so 00007f2709f42000 4 4 4 rw--- /lib/x86_64-linux-gnu/ld-2.19.so 00007f2709f43000 4 4 4 rw--- [ anon ] 00007fff6d2d2000 132 16 16 rw--- [ stack ] 00007fff6d3e9000 8 4 0 r-x-- [ anon ] ffffffffff600000 4 0 0 r-x-- [ anon ] ---------------- ------- ------- ------- total kB 55752 7964 5092 从上面可以获取以下信息：\n进程使用哪些共享库及其版本信息，以及这些共享库在内存中的起始位置 指令起始位置 0000000000400000 初始化全部 RSS 查看进程当前的调用栈 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 [root@localhost db_proxy_server]# pstack 31002 Thread 22 (Thread 0x7f62dafae700 (LWP 31003)): #0 0x00000038332e1523 in select () from /lib64/libc.so.6 #1 0x00007f62db1e9125 in apr_sleep () from /usr/lib64/libapr-1.so.0 #2 0x00007f62db716096 in log4cxx::helpers::FileWatchdog::run (data=0x2497a70) at filewatchdog.cpp:76 #3 0x00007f62db7778ce in log4cxx::helpers::Thread::launcher (thread=0x2499c00, data=0x2499be8) at threadcxx.cpp:100 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 21 (Thread 0x7f62da5ad700 (LWP 31008)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251c3f8) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251c3e8) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251c3e8) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 20 (Thread 0x7f62d9bac700 (LWP 31009)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251c478) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251c468) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251c468) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 19 (Thread 0x7f62d91ab700 (LWP 31010)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251c4f8) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251c4e8) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251c4e8) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 18 (Thread 0x7f62d87aa700 (LWP 31011)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251c578) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251c568) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251c568) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 17 (Thread 0x7f62d7da9700 (LWP 31012)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251c5f8) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251c5e8) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251c5e8) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 16 (Thread 0x7f62d73a8700 (LWP 31013)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251c678) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251c668) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251c668) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 15 (Thread 0x7f62d69a7700 (LWP 31014)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251c6f8) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251c6e8) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251c6e8) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 14 (Thread 0x7f62d5fa6700 (LWP 31015)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251c778) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251c768) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251c768) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 13 (Thread 0x7f62d55a5700 (LWP 31016)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251c7f8) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251c7e8) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251c7e8) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 12 (Thread 0x7f62d4ba4700 (LWP 31017)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251c878) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251c868) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251c868) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 11 (Thread 0x7f62d41a3700 (LWP 31018)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251c8f8) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251c8e8) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251c8e8) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 10 (Thread 0x7f62d37a2700 (LWP 31019)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251c978) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251c968) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251c968) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 9 (Thread 0x7f62d2da1700 (LWP 31020)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251c9f8) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251c9e8) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251c9e8) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 8 (Thread 0x7f62d23a0700 (LWP 31021)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251ca78) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251ca68) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251ca68) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 7 (Thread 0x7f62d199f700 (LWP 31022)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251caf8) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251cae8) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251cae8) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 6 (Thread 0x7f62d0f9e700 (LWP 31023)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251cb78) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251cb68) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251cb68) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 5 (Thread 0x7f62d059d700 (LWP 31024)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251f518) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251f508) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251f508) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 4 (Thread 0x7f62cfb9c700 (LWP 31025)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251f598) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251f588) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251f588) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 3 (Thread 0x7f62cf19b700 (LWP 31026)): #0 0x0000003833a0b68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00000000005dd0c7 in CThreadNotify::Wait (this=0x251f618) at /home/wubo/LeTalk/server/src/db_proxy_server/../base/Thread.h:62 #2 0x000000000063f7b6 in CWorkerThread::Execute (this=0x251f608) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:44 #3 0x000000000063f754 in CWorkerThread::StartRoutine (arg=0x251f608) at /home/wubo/LeTalk/server/src/base/ThreadPool.cpp:27 #4 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #5 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 2 (Thread 0x7f62ce79a700 (LWP 31027)): #0 0x0000003833a0ba5e in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x000000000063f12c in CCondition::waitTime (this=0x251fec0, nWaitTime=5000) at /home/wubo/LeTalk/server/src/base/Condition.cpp:43 #2 0x00000000005d8fbb in CSyncCenter::doSyncGroupChat (arg=0x0) at /home/wubo/LeTalk/server/src/db_proxy_server/SyncCenter.cpp:299 #3 0x0000003833a07aa1 in start_thread () from /lib64/libpthread.so.0 #4 0x00000038332e8aad in clone () from /lib64/libc.so.6 Thread 1 (Thread 0x7f62db1be820 (LWP 31002)): #0 0x00000038332e90a3 in epoll_wait () from /lib64/libc.so.6 #1 0x0000000000642f5d in CEventDispatch::StartDispatch (this=0x251f3f0, wait_timeout=10) at /home/wubo/LeTalk/server/src/base/EventDispatch.cpp:365 #2 0x000000000063f5fd in netlib_eventloop (wait_timeout=10) at /home/wubo/LeTalk/server/src/base/netlib.cpp:160 #3 0x00000000005e21ad in main (argc=1, argv=0x7ffd32681a78) at /home/wubo/LeTalk/server/src/db_proxy_server/db_proxy_server.cpp:216 [root@localhost db_proxy_server]# 进程故障信息 dmesg查找 1 2 3 4 [root@sqwx1 demo_server]# dmesg | grep demo_server demo_server[8425]: segfault at 22 ip 0000000000548b4c sp 00007ffff50281b0 error 4 in demo_server[400000+5c4000] demo_server[22891]: segfault at 50a09b ip 0000000000562723 sp 00007ffdde9276d0 error 7 in demo_server[400000+647000] demo_server[26185]: segfault at 52ecdb ip 0000000000562723 sp 00007fff09ca4120 error 7 in demo_server[400000+647000] 查看进程被谁杀死 1 2 root@iZ2ze9qnmldt4l3l82gtviZ:~# cat /var/log/audit/audit.log | grep 16135 type=OBJ_PID msg=audit(1491364584.465:11575): opid=16135 oauid=0 ouid=0 oses=35 ocomm=\u0026#34;tmsf-zc\u0026#34; 进程性能分析 主要有下面两种方式：\nperf工具 google perf 进程调试 主要针对linux上gdb调试，可以参考文章，这里不作描述\n未完，待续 ","permalink":"https://myself659.github.io/post/2017-05-10-linux-process-diagnose/","summary":"\u003cp\u003e日常工作中最常见问题是如何诊断一个进程运行过程中出现的问题，下面的总结从进程诊断的角度来展示，而是不从工具与命令角度来展示，进程诊断是工作的主体，工具与命令只是工具。\u003c/p\u003e","title":"Linux进程诊断小结"},{"content":"依赖 依赖golang的开发环境 安装 present工具在golang.org/x/tools中，依赖golang.org/x/net包,安装过程如下：\n1 2 3 root@ia-VirtualBox:~# go get golang.org/x/net root@ia-VirtualBox:~# go get golang.org/x/tools root@ia-VirtualBox:~# go install golang.org/x/tools/cmd/present 安装结束后查看present位置\n1 2 root@ia-VirtualBox:~# which present /usr/local/go/bin/present slide文件语法 具体参考准官方文档\n更新：Package present\n生成slide 1 2 3 root@ia-VirtualBox:/share/gocode/src/github.com/pcrawfor# present golanguk/talk.slide 2017/05/09 23:53:15 Open your web browser and visit http://127.0.0.1:3999 2017/05/09 23:57:19 accepting connection from: 127.0.0.1:50852 共享slide 通过http选项指定外部访问地址\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 root@ia-VirtualBox:/share/gocode/src/github.com/pcrawfor# present -http=\u0026#34;192.168.56.5:3999\u0026#34; golanguk/talk.slide 2017/05/10 00:02:47 WARNING! WARNING! WARNING! The present server appears to be listening on an address that is not localhost. Anyone with access to this address and port will have access to this machine as the user running present. To avoid this message, listen on localhost or run with -play=false. If you don\u0026#39;t understand this message, hit Control-C to terminate this process. WARNING! WARNING! WARNING! 2017/05/10 00:02:47 Open your web browser and visit http://192.168.56.5:3999 生成PDF 以chrome为例，步骤如下：\n按ctrl + p进入打印界面 选择打印方式为adode pdf，点击打印，即可保存为pdf\n(end)\n","permalink":"https://myself659.github.io/post/2017-05-10-golang-present/","summary":"\u003ch3 id=\"依赖\"\u003e依赖\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e依赖golang的开发环境\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"安装\"\u003e安装\u003c/h3\u003e\n\u003cp\u003epresent工具在golang.org/x/tools中，依赖golang.org/x/net包,安装过程如下：\u003c/p\u003e","title":"使用golang present工具制作presentation"},{"content":"为了构建自己的知识体系，对高性能服务器设计与优化一点想法，其中不足与错误，欢迎指正。\n高性能服务器设计与优化\n","permalink":"https://myself659.github.io/post/2017-05-09-web-server-perf-and-design/","summary":"\u003cp\u003e为了构建自己的知识体系，对高性能服务器设计与优化一点想法，其中不足与错误，欢迎指正。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"../slides/%E9%AB%98%E6%80%A7%E8%83%BD%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BE%E8%AE%A1%E4%B8%8E%E4%BC%98%E5%8C%96.pdf\"\u003e高性能服务器设计与优化\u003c/a\u003e\u003c/p\u003e","title":"高性能服务器设计与优化"},{"content":"什么才是重要的 什么才是重要的？对于这个问题有很多答案，每个人都有自己的回答。\n这里说一下我对这个问题的思考，从哪些角度来判断与评价重要性？\n基础 稀缺 频率 紧急 第一性原理 与自己的相关性 ","permalink":"https://myself659.github.io/post/life/what-is-matter-%E9%87%8D%E8%A6%81/","summary":"\u003ch2 id=\"什么才是重要的\"\u003e什么才是重要的\u003c/h2\u003e\n\u003cp\u003e什么才是重要的？对于这个问题有很多答案，每个人都有自己的回答。\u003c/p\u003e\n\u003cp\u003e这里说一下我对这个问题的思考，从哪些角度来判断与评价重要性？\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e基础\u003c/li\u003e\n\u003cli\u003e稀缺\u003c/li\u003e\n\u003cli\u003e频率\u003c/li\u003e\n\u003cli\u003e紧急\u003c/li\u003e\n\u003cli\u003e第一性原理\u003c/li\u003e\n\u003cli\u003e与自己的相关性\u003c/li\u003e\n\u003c/ol\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c!-- raw HTML omitted --\u003e","title":"什么才是重要的"},{"content":"背景 查看阿里云ECS服务器日志发现如下：\n1 2 3 4 5 6 7 type=USER_AUTH msg=audit(1491669519.156:15631): pid=22938 uid=0 auid=4294967295 ses=4294967295 msg=\u0026#39;op=PAM:authentication acct=\u0026#34;deploy\u0026#34; exe=\u0026#34;/usr/sbin/sshd\u0026#34; hostname=123.57.245.163 addr=123.57.245.163 terminal=ssh res=failed\u0026#39; type=USER_LOGIN msg=audit(1491669519.156:15632): pid=22938 uid=0 auid=4294967295 ses=4294967295 msg=\u0026#39;op=login acct=28696E76616C6964207573657229 exe=\u0026#34;/usr/sbin/sshd\u0026#34; hostname=? addr=123.57.245.163 terminal=sshd res=failed\u0026#39; type=USER_LOGIN msg=audit(1491669587.368:15634): pid=22940 uid=0 auid=4294967295 ses=4294967295 msg=\u0026#39;op=login acct=28756E6B6E6F776E207573657229 exe=\u0026#34;/usr/sbin/sshd\u0026#34; hostname=? addr=123.57.245.163 terminal=sshd res=failed\u0026#39; type=USER_LOGIN msg=audit(1491669587.368:15635): pid=22940 uid=0 auid=4294967295 ses=4294967295 msg=\u0026#39;op=login acct=28696E76616C6964207573657229 exe=\u0026#34;/usr/sbin/sshd\u0026#34; hostname=? addr=123.57.245.163 terminal=sshd res=failed\u0026#39; type=USER_AUTH msg=audit(1491669589.420:15636): pid=22940 uid=0 auid=4294967295 ses=4294967295 msg=\u0026#39;op=PAM:authentication acct=\u0026#34;deploy\u0026#34; exe=\u0026#34;/usr/sbin/sshd\u0026#34; hostname=123.57.245.163 addr=123.57.245.163 terminal=ssh res=failed\u0026#39; type=USER_LOGIN msg=audit(1491669589.420:15637): pid=22940 uid=0 auid=4294967295 ses=4294967295 msg=\u0026#39;op=login acct=28696E76616C6964207573657229 exe=\u0026#34;/usr/sbin/sshd\u0026#34; hostname=? addr=123.57.245.163 terminal=sshd res=failed\u0026#39; type=USER_LOGIN msg=audit(1491669658.624:15639): pid=22948 uid=0 auid=4294967295 ses=4294967295 msg=\u0026#39;op=login acct=28756E6B6E6F776E207573657229 exe=\u0026#34;/usr/sbin/sshd\u0026#34; hostname=? addr=123.57.245.163 terminal=sshd res=failed\u0026#39; 百度一下这个ip地址，如下图所示： ![记下这个IP,留下证据](/images/attck ip.png)\n这是有人在阿里云ECS写脚本要暴力破解云主机的密码。这个引起我的注意，赶紧检查一下自己的ECS是否被破解。\n说点题外话：记得去年帮人弄一个网站的时候，后面的她的云主机密码泄漏了，人家第一反应过来就是怀疑我，还得花心思给她解释有多种情况会导致密码泄漏与破解，伤不起啊。\n整个检查大体如下，分为以下几个部分：\n检查有哪些用户？ 用户会干什么？ 用户干过什么？ 处于什么样的环境？ 检查用户 查看当前在线用户 1 root@ecs-1:~# who 为了确定是否当前就有不明用户登录，如果有不明用户登录，那么得赶紧修改密码。\n查看当前ssh连接情况 1 root@ecs-1:~# ss -t sport = :22 查看用户的ssh连接情况，进行对比确认\n查看新增用户 1 root@ecs-1:~# awk -F\u0026#39;:\u0026#39; \u0026#39;{ print $1}\u0026#39; /etc/passwd 查看当前用户 1 root@ecs-1:~# awk -F\u0026#39;:\u0026#39; \u0026#39;{ print $1}\u0026#39; /etc/passwd 主要是确定是否存在可疑用户，是否有可疑用户加入\n检查是否存在特权用户 1 2 root@ecs-1:~# awk -F: \u0026#39;$3==0 {print $1}\u0026#39; /etc/passwd root 检查用户口令是否为空 1 root@ecs-1:~# awk -F: \u0026#39;length($2)==0 {print $1}\u0026#39; /etc/shadow 检查用户会干什么 top查看内存与内存使用情况 1 root@ecs-1:~# top 关注高cpu使用率与高内存占用程序，例如比特币的矿机一般会占用大量的cpu资源\n查看任务计划 1 root@ecs-1:~# crontab -l 查看网络连接情况 1 root@ecs-1:~# netstat -natp 检查隐藏进程 检查隐藏进程，三步走：\n第一步：\n1 root@ecs-1:~# ps -ef | awk \u0026#39;{print $2}\u0026#39; | sort -n | uniq \u0026gt; pid1 第二步：\n1 root@ecs-1:~# ls /proc | grep -E \u0026#39;[0-9]{1,}\u0026#39; | sort -n | uniq \u0026gt; pid2 第三步：\n1 2 3 4 5 6 7 8 9 10 11 12 root@ecs-1:~# diff pid1 pid2 1d0 \u0026lt; PID \u0026lt; 29592 \u0026lt; 29593 \u0026lt; 29594 \u0026lt; 29595 --- \u0026gt; 29588 \u0026gt; 29589 \u0026gt; 29590 \u0026gt; 29591 结果说明： 第一步有4个不同的进程表示这条命令对应的进程，第二步同样的，所以这里没有发现隐藏的进程\n检查rcx.d 1 root@ecs-1:~# ls /etc/rc3.d 检查用户干过什么 重点检查以下情况：\n用户登录 机器重启情况 安全日志 历史操作 安全文件检查 用last -d 查看登录情况 1 root@ecs-1:~# last -d 用last -x 查看机器重启情况 1 root@ecs-1:~# last -x reboot 查看audit的log信息 1 root@ecs-1:~# cat /var/log/audit/audit.log 查看历史命令 1 2 3 root@ecs-1:~# history 271 iptables -L 272 package main 安全文件检查 检查授权的ssh key，查看是否有未知的ssh key添加 1 root@ecs-1:~# cat ~/.ssh/authorized_keys 检查bashrc 1 root@ecs-1:~# cat ~/.bashrc 检查密码最后修改时间 1 root@ecs-1:~# ls -l /etc/passwd 环境 网络隔离性 网络采用了VPC网络模式，检测结果如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 root@ecs-1# nmap -v -sT 172.17.11.0/28 --open Starting Nmap 6.40 ( http://nmap.org ) at 2017-03-14 10:23 CST Initiating ARP Ping Scan at 10:23 Scanning 16 hosts [1 port/host] Completed ARP Ping Scan at 10:23, 0.41s elapsed (16 total hosts) Initiating Parallel DNS resolution of 16 hosts. at 10:23 Completed Parallel DNS resolution of 16 hosts. at 10:24, 13.00s elapsed Initiating Connect Scan at 10:24 Scanning 16 hosts [1000 ports/host] Connect Scan Timing: About 2.42% done; ETC: 10:45 (0:20:49 remaining) Connect Scan Timing: About 11.94% done; ETC: 10:46 (0:19:40 remaining) Connect Scan Timing: About 16.72% done; ETC: 10:46 (0:18:31 remaining) Connect Scan Timing: About 21.57% done; ETC: 10:46 (0:17:20 remaining) Connect Scan Timing: About 26.57% done; ETC: 10:46 (0:16:13 remaining) Connect Scan Timing: About 31.72% done; ETC: 10:46 (0:15:06 remaining) Connect Scan Timing: About 37.01% done; ETC: 10:46 (0:13:59 remaining) Connect Scan Timing: About 41.86% done; ETC: 10:46 (0:12:52 remaining) Connect Scan Timing: About 47.34% done; ETC: 10:46 (0:11:45 remaining) Connect Scan Timing: About 52.56% done; ETC: 10:46 (0:10:37 remaining) Connect Scan Timing: About 57.65% done; ETC: 10:46 (0:09:27 remaining) Connect Scan Timing: About 62.67% done; ETC: 10:46 (0:08:19 remaining) Connect Scan Timing: About 67.69% done; ETC: 10:46 (0:07:11 remaining) Connect Scan Timing: About 72.92% done; ETC: 10:46 (0:06:01 remaining) Connect Scan Timing: About 78.18% done; ETC: 10:46 (0:04:51 remaining) Connect Scan Timing: About 83.26% done; ETC: 10:46 (0:03:43 remaining) Connect Scan Timing: About 88.35% done; ETC: 10:46 (0:02:35 remaining) Connect Scan Timing: About 93.58% done; ETC: 10:46 (0:01:25 remaining) Completed Connect Scan against 172.17.11.14 in 1276.55s (15 hosts left) Completed Connect Scan against 172.17.11.7 in 1279.69s (14 hosts left) Completed Connect Scan against 172.17.11.1 in 1280.09s (13 hosts left) Completed Connect Scan against 172.17.11.10 in 1291.35s (12 hosts left) Completed Connect Scan against 172.17.11.12 in 1291.68s (11 hosts left) Completed Connect Scan against 172.17.11.5 in 1322.08s (10 hosts left) Completed Connect Scan against 172.17.11.4 in 1322.13s (9 hosts left) Completed Connect Scan against 172.17.11.15 in 1325.48s (8 hosts left) Completed Connect Scan against 172.17.11.3 in 1328.10s (7 hosts left) Completed Connect Scan against 172.17.11.9 in 1329.43s (6 hosts left) Completed Connect Scan against 172.17.11.11 in 1331.76s (5 hosts left) Completed Connect Scan against 172.17.11.2 in 1335.78s (4 hosts left)) Completed Connect Scan against 172.17.11.0 in 1336.84s (3 hosts leftCompleted Connect Scan against 172.17.11.6 in 1337.46s (2 hosts left) Completed Connect Scan against 172.17.11.8 in 1338.91s (1 host left) Completed Connect Scan at 10:46, 1342.34s elapsed (16000 total ports) Read data files from: /usr/bin/../share/nmap Nmap done: 16 IP addresses (16 hosts up) scanned in 1355.80 seconds Raw packets sent: 16 (448B) | Rcvd: 16 (448B) 如果网络没有隔离，各个VM同一个局域网内，会发现同一个网段的开放的端口，检查结果如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 root@centos# nmap -v -sT 192.168.20.0/24 --open Discovered open port 80/tcp on 192.168.20.10 Discovered open port 3389/tcp on 192.168.20.63 Discovered open port 80/tcp on 192.168.20.38 Discovered open port 135/tcp on 192.168.20.49 Discovered open port 3389/tcp on 192.168.20.52 Discovered open port 80/tcp on 192.168.20.49 Discovered open port 80/tcp on 192.168.20.34 Discovered open port 445/tcp on 192.168.20.37 Discovered open port 445/tcp on 192.168.20.36 Discovered open port 135/tcp on 192.168.20.14 Discovered open port 3389/tcp on 192.168.20.38 Discovered open port 135/tcp on 192.168.20.50 通过对比可知，采用VPC隔离的ECS不能发现同一个网段开放的网络端口，这样安全性也大大增加，好在阿里云ECS已经支持上VPC,这样就不担心来自同一个网段的攻击了（堡垒更容易从内部攻破）\n总结 安全首先是一个意识问题，需要保证足够的敏锐 阿里云的ip基本是一个大段范围，这么多IP对应的ECS肯定有些用户是安全小白用户，这样攻击者的成本也不会很高，写一个脚本遍历这个大的ip池，就可以获取一些小白用户的ECS 密码一定不要用12345678之类或者那些常用的密码，另外注意定时更换密码 对阿里云一个建议：对于暴力破解ssh密码，增加功能实现同一个ip地址多次尝试ssh的限制 这篇主要写一些基本检查操作，有空的时候再写一篇加强基础安全防护的文章 不足与建议，欢迎指正与交流。\n（end）\n参考 Understanding Audit Log Files linux man Hiding Linux Processes For Fun And Profit Linux: Hide Processes From Other Users Understanding Red Hat Run Levels ","permalink":"https://myself659.github.io/post/2017-04-08-ecs-basic-sec-check/","summary":"\u003ch3 id=\"背景\"\u003e背景\u003c/h3\u003e\n\u003cp\u003e查看阿里云ECS服务器日志发现如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etype=USER_AUTH msg=audit(1491669519.156:15631): pid=22938 uid=0 auid=4294967295 ses=4294967295 msg=\u0026#39;op=PAM:authentication acct=\u0026#34;deploy\u0026#34; exe=\u0026#34;/usr/sbin/sshd\u0026#34; hostname=123.57.245.163 addr=123.57.245.163 terminal=ssh res=failed\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etype=USER_LOGIN msg=audit(1491669519.156:15632): pid=22938 uid=0 auid=4294967295 ses=4294967295 msg=\u0026#39;op=login acct=28696E76616C6964207573657229 exe=\u0026#34;/usr/sbin/sshd\u0026#34; hostname=? addr=123.57.245.163 terminal=sshd res=failed\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etype=USER_LOGIN msg=audit(1491669587.368:15634): pid=22940 uid=0 auid=4294967295 ses=4294967295 msg=\u0026#39;op=login acct=28756E6B6E6F776E207573657229 exe=\u0026#34;/usr/sbin/sshd\u0026#34; hostname=? addr=123.57.245.163 terminal=sshd res=failed\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etype=USER_LOGIN msg=audit(1491669587.368:15635): pid=22940 uid=0 auid=4294967295 ses=4294967295 msg=\u0026#39;op=login acct=28696E76616C6964207573657229 exe=\u0026#34;/usr/sbin/sshd\u0026#34; hostname=? addr=123.57.245.163 terminal=sshd res=failed\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etype=USER_AUTH msg=audit(1491669589.420:15636): pid=22940 uid=0 auid=4294967295 ses=4294967295 msg=\u0026#39;op=PAM:authentication acct=\u0026#34;deploy\u0026#34; exe=\u0026#34;/usr/sbin/sshd\u0026#34; hostname=123.57.245.163 addr=123.57.245.163 terminal=ssh res=failed\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etype=USER_LOGIN msg=audit(1491669589.420:15637): pid=22940 uid=0 auid=4294967295 ses=4294967295 msg=\u0026#39;op=login acct=28696E76616C6964207573657229 exe=\u0026#34;/usr/sbin/sshd\u0026#34; hostname=? addr=123.57.245.163 terminal=sshd res=failed\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etype=USER_LOGIN msg=audit(1491669658.624:15639): pid=22948 uid=0 auid=4294967295 ses=4294967295 msg=\u0026#39;op=login acct=28756E6B6E6F776E207573657229 exe=\u0026#34;/usr/sbin/sshd\u0026#34; hostname=? addr=123.57.245.163 terminal=sshd res=failed\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e百度一下这个ip地址，如下图所示：\n![记下这个IP,留下证据](/images/attck ip.png)\u003c/p\u003e","title":"阿里云ECS基本安全检查小结"},{"content":"前言 学习了google，facebook等国际一流大厂的开源方案，也研究了国内BAT的一些设计案例，在平时工作自然也少不了一些系统设计的工作，想写一些自己的想法，同时也帮助自己梳理一下思路，实现自己的系统设计的套路。\n其实就是这一句话：立足需求与业务，利用工程与技术，得到最合适的tradeofff，追求更简单的设计与方案，以此不断推进系统的演化。\n下面对这句话展开说明（当然，下面是一堆费话，只是为了解决自己的不吐不快而已罢了）。\n立足需求与业务 套用一句话：一切脱离需求的设计都是耍流氓。这里不进行具体案例分析，主要从以下角度来细化需求，提供思考的方向。\n用户角度 performance（性能） availability（可用性） usability（易用性） security（安全性） 研发角度 maintainablity （可维护性性） protability（可移植性） reusability（可重用性） scalable(可扩展性) testability（可测试性） 商业与市场角度 time to market（及时发布推向市场） cost and benifits（成本和收益） projected life time （产品生命周期） targeted market（目标市场） integration with legacy system (系统集成) roll back schedule （回退时间表） KISS(Keep It Simple, Stupid) 有太多的例子，说明追求简单与遵循简单的设计原则的重要性，最典型就是unix的设计哲学成就伟大的linux的操作系统。\n什么是简单的系统设计呢？ 这是需要不断思考的问题，举个例子说明吧；在GFS实现中，针对client向chunk server写文件失败的问题，GFS的作法是直接返回失败，由client决定是否重写，这种作法就是聪明的简单之举。\n简单并不是随手可得的。关于这个可以参考rob pike，golang发明人之一的这篇演进： Simplicity is Complicated\n下面借此说明以下几个问题？\n什么是简单？ 简单很难定义，还是举例说明吧 追求简单并不是单纯追求技术实现上的简单。简单追求是使用的简单，因为使用是高频，实现可能只有几次，例如上面演进谈到的GC,实现并不简单，想出这个GC算法就相当困难，实现那就更难了，但是有了GC，我们用golang编程的时候就不需要像C/C++那样关心内存的申请释放，再也不用担心踩内存的问题了，专心于设计与业务，给程序员带来了简单。（以我自己为例，学会了golang，我写代码都写得多，之前只会C/C++时候，业余时间主要是阅读代码，写代码都是工作驱动）\n另外还有一点，简单是先实现，再改进，例如golang的GC算法一开始并不好，GC导致应用 延迟大，到了1.5才有改进\n如何实现简单？ 演进中const同c语言定义一个常量不一样，不需要关心类型，在生活中一般人说数字2017除了程序员谁关心它是整型数还是浮点数啊\n如何判断设计是否简单呢？ 让普通人也能容易理解与使用。\n在生活中能够找到对应参考。\n能够简单描述问题。\n给人一种刚刚好感觉，不多不少。\n还有更多。。。\nEverything is tradeoff 理想很丰满，但是现实很骨感\n硬币总是两面的\n在系统设计过程中我们总会遇到下面的问题：\n分布式场景下CAP只能三选二 Push vs Pull Latency vs Throughput 速度 vs 成本 vs 质量 SSD vs Disk SQL vs NoSQL Sharding vs Partitioning Scale Up vs Scale Out Performance vs Scalability 集中式 vs 分布式 同步 vs 异步 \u0026hellip; 如果系统设计过程不知道系统优缺点，那表示你无法掌握这个系统设计；相反如果深入理解每一个具体方案的优缺点，就可以SWOT原则作出判断与选择，而不是面对选择总是有那么多犹豫不决，而是一种感觉：在这种需求和条件，这样的选择是最合适的。\n工程与技术能力是基础 需要掌握技术，立足需求，协调不断变化需求与技术实现的矛盾。 技术方案实现的实现需要软件工程的指导，保证整个这个方案落地过程中保持顺畅与有序进行。\n对于一个工作多年的程序员来说，从技术上就是要构建自己的知识体系，这里引用一张图如下： 这张图从网络请求处理时序的角度概括系统设计过程中可能涉及的技术点。\n关于软件工程能力，在这里不多讲了，更多请参考微软邹欣老师的大作《构建之法》。\n后记 人生贵在行动，迟疑不决时，不妨先迈出小小一步，若是美好，叫做精彩；若是糟糕，叫做经历！\n写了一篇水货文章，方向大了，内容空洞，只能待以后将其拧干了。\n（to be continued）\n参考 Simplicity is Complicated system design primer 系统设计的典型分层和涉及的知识点 ","permalink":"https://myself659.github.io/post/2017-04-29-about-system-design/","summary":"\u003ch3 id=\"前言\"\u003e前言\u003c/h3\u003e\n\u003cp\u003e学习了google，facebook等国际一流大厂的开源方案，也研究了国内BAT的一些设计案例，在平时工作自然也少不了一些系统设计的工作，想写一些自己的想法，同时也帮助自己梳理一下思路，实现自己的系统设计的套路。\u003c/p\u003e","title":"对于系统设计的一些想法"},{"content":"引子 在一家推拿店里，排队等叫号，遇到一个五十多数大叔，下面是我们之间的对话：\n大叔： 小伙子，帮我看一下怎么连接wifi？\n我： 好的。\n（他把手机给我，我弄好，把手机给他）\n我： 大叔，你连接wifi要看视频吗？\n大叔：不是的，我看直播\n我：（有点吃惊，直播一般不是年轻人看的吗？）那你用什么软件看直播？\n大叔将手机拿过来，对我说：我秀\n我：这是哪家直播？\n大叔：人人网旗下的，我还有来疯直播，youku下面的，还有快手\n我：想不到连你们都喜欢看直播，我一直以为只有年经人才爱看直播\n大叔： 下班后时间比较多，电视剧不好看，就看直播了\n想到前几天快手E轮融资3.5亿美元，就有下面的感想。\n互联网还有哪些没有覆盖到人群？ 上面引子的大叔虽然算是互联网用户，也只能是入门了，对于使用过程中一些wifi设置，app设置还是没有掌握。\n中国有14亿人口，网民有7亿，还有7亿不是网民，在这7亿中除了一些小孩子（高中生现在有相当一部分都有手机了）有相当一部分人，还是希望赶上互联网这躺车，他们不希望成为那些被抛弃的少数人，例如家里的一个伯母会主动让妈妈教她如何使用微信聊天。\n这里主要是想得出一个这样的人群：\n50岁以上使用手机，却没有使用智能手机的人群，帮他们跨过手机进入智能手机应该不是很难的事情,毕竟会使用手机升级到使用智能手机也不是件很难的事情。（Ps：当这些用户转化互联网用户，视频是他们第一消费内容， 这个用户群体有多大呢？ 快手主动满足三四线城市的“低俗”用户，到现在收割大量用户，E轮3.5亿融资） 互联网产品如果要覆盖更多的人群要做些什么？ 简单表达如下：\n追求产品更简单，打开app各个功能入口一目了然 生活化的内容，例如快手定位为生活分享平台 智能的推荐算法，例如今日头条在三四线及以下城市得到大量的使用，占据大量的用户时间 针对性优化，手机有老人机，app也可以针对性优化，视频只会wifi下载和播放，字体变大 剩下的，相信各位产品经理会有更深入的思考。 不要忘记那些正在追赶互联网潮流的用户，用技术与产品帮助他们上车吧！\n希望未来让更多人享受到互联网技术和产品带来的便利。\n参考 2017各省网民人数公布，总数7亿，看你们省多少人 （end）\n","permalink":"https://myself659.github.io/post/2017-03-27-help-internet-available-more-people/","summary":"\u003ch3 id=\"引子\"\u003e引子\u003c/h3\u003e\n\u003cp\u003e在一家推拿店里，排队等叫号，遇到一个五十多数大叔，下面是我们之间的对话：\u003c/p\u003e\n\u003cp\u003e大叔： 小伙子，帮我看一下怎么连接wifi？\u003c/p\u003e\n\u003cp\u003e我： 好的。\u003c/p\u003e\n\u003cp\u003e（他把手机给我，我弄好，把手机给他）\u003c/p\u003e","title":"不要忘记那些正在追赶互联网潮流的用户"},{"content":"定义 Attention or focus, is the concentration of awareness on some phenomenon to the exclusion of other stimuli.\n注意力是过滤器。你只会注意到你注意到的世界，你的注意力决定你所看到的世界。\n注意力是方向。注意力引导你的思考，思考影响你的感知，感知影响你的现实。\n注意力 \u0026gt; 时间 注意力一定发生在时间的范围内，注意力是我们从时间获取价值的通道。没有注意力，时间就只是时间，而不是属于我们的时间。\n保护注意力 注意力是一种比时间还要宝贵的资源。\n那么如何保护注意力？\n意识到注意力的宝贵 尽量关闭手机等3C产品的通知与提醒 少使用3C产品，多亲近大自然 建立个人高质量的一手信息源，而不是通过社交媒体来获取信息 专注于实践，技能，知识而不是信息 利用习惯驱动注意力的工作 避免奶头乐 学会说不，如问：这值得会投入时间与注意力吗？ 减少依赖注意力 将一些工作完成由本能与直觉来直接完成。\n典型的例子： 一些老司机可以利用本能与直觉来驾驶，来减少对注意力的依赖与开销。\n另外，养成习惯也可以减少对注意力的依赖。\n善用注意力 如何善用注意力注意以下几个方面：\n投入的方向\n如何投入\n产出的效率\n","permalink":"https://myself659.github.io/post/done/%E6%B3%A8%E6%84%8F%E5%8A%9B-attention/","summary":"\u003ch2 id=\"定义\"\u003e定义\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAttention or focus, is the concentration of awareness on some phenomenon to the exclusion of other stimuli.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e注意力是过滤器。你只会注意到你注意到的世界，你的注意力决定你所看到的世界。\u003c/p\u003e\n\u003cp\u003e注意力是方向。注意力引导你的思考，思考影响你的感知，感知影响你的现实。\u003c/p\u003e","title":"说说注意力"},{"content":"数据结构与算法实践\n","permalink":"https://myself659.github.io/post/leetcode/","summary":"\u003cp\u003e\u003ca href=\"https://myself659.github.io/algorithm-practice\"\u003e数据结构与算法实践\u003c/a\u003e\u003c/p\u003e","title":"LeetCode"},{"content":"背景 人们常说三思而后行。三思指什么？\n我的三思 首先思考有没有必要这样做？（why） 这样做会带来什么（思危，思退，思变）（what）？ 怎么做？还有其他的方法来做吗（how）？ 为什么要三思 避免冲动 避免冲动带来不可逆的结果 三思拓展选项与空间 三思让人慢下来，停下来 三思从行动获得反馈 三思指导行动 ","permalink":"https://myself659.github.io/post/done/%E6%88%91%E7%9A%84%E4%B8%89%E6%80%9D%E8%80%8C%E5%90%8E%E8%A1%8C/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e人们常说三思而后行。三思指什么？\u003c/p\u003e\n\u003ch2 id=\"我的三思\"\u003e我的三思\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e首先思考有没有必要这样做？（why）\u003c/li\u003e\n\u003cli\u003e这样做会带来什么（思危，思退，思变）（what）？\u003c/li\u003e\n\u003cli\u003e怎么做？还有其他的方法来做吗（how）？\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"为什么要三思\"\u003e为什么要三思\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e避免冲动\u003c/li\u003e\n\u003cli\u003e避免冲动带来不可逆的结果\u003c/li\u003e\n\u003cli\u003e三思拓展选项与空间\u003c/li\u003e\n\u003cli\u003e三思让人慢下来，停下来\u003c/li\u003e\n\u003cli\u003e三思从行动获得反馈\u003c/li\u003e\n\u003cli\u003e三思指导行动\u003c/li\u003e\n\u003c/ol\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c!-- raw HTML omitted --\u003e","title":"我的三思而后行"},{"content":"原因 从主观上分析，主要是以下原因：\n不知道做 不想做 从客观上分析，主要是以下原因：\n不会做 不能做 ","permalink":"https://myself659.github.io/post/done/%E6%B2%A1%E6%9C%89%E5%81%9A%E7%9A%84%E5%8E%9F%E5%9B%A0/","summary":"\u003ch2 id=\"原因\"\u003e原因\u003c/h2\u003e\n\u003cp\u003e从主观上分析，主要是以下原因：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e不知道做\u003c/li\u003e\n\u003cli\u003e不想做\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e从客观上分析，主要是以下原因：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e不会做\u003c/li\u003e\n\u003cli\u003e不能做\u003c/li\u003e\n\u003c/ol\u003e","title":"没有做的原因有哪些"},{"content":"认知 认知不到位或理解不到位的原因：\n缺少基础理论 信息不足与错误 方向错误，如追求理解本身不科学 视角不对 起点错误 行动 行动做不到原因：\n理论方面存在问题 信息不足与错误 错误的开始 过程有问题 总结 这些原因往往是自己不知道的或者没有发现的。\n","permalink":"https://myself659.github.io/post/done/%E7%9F%A5%E8%A1%8C%E5%8F%8D%E6%80%9D/","summary":"\u003ch2 id=\"认知\"\u003e认知\u003c/h2\u003e\n\u003cp\u003e认知不到位或理解不到位的原因：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e缺少基础理论\u003c/li\u003e\n\u003cli\u003e信息不足与错误\u003c/li\u003e\n\u003cli\u003e方向错误，如追求理解本身不科学\u003c/li\u003e\n\u003cli\u003e视角不对\u003c/li\u003e\n\u003cli\u003e起点错误\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"行动\"\u003e行动\u003c/h2\u003e\n\u003cp\u003e行动做不到原因：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e理论方面存在问题\u003c/li\u003e\n\u003cli\u003e信息不足与错误\u003c/li\u003e\n\u003cli\u003e错误的开始\u003c/li\u003e\n\u003cli\u003e过程有问题\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"总结\"\u003e总结\u003c/h2\u003e\n\u003cp\u003e这些原因往往是自己不知道的或者没有发现的。\u003c/p\u003e","title":"知行反思"},{"content":"问题 还是从代码开始吧\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 func fetch(url string) { tlsConfig := \u0026amp;tls.Config{ InsecureSkipVerify: true, } transport := \u0026amp;http.Transport{ TLSClientConfig: tlsConfig, } client := http.Client{Transport: transport} resp, err := client.Get(url) if err != nil { fmt.Println(err) \u0026lt;-time.After(300 * time.Second) go fetch(url) return } buf, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(\u0026#34;fetchyh:\u0026#34;, err) return } save(buf) //保存html到文件 defer resp.Body.Close() // http to doc doc, err := goquery.NewDocumentFromResponse(resp) if err != nil { fmt.Println(err, \u0026#34;http resp to doc failed\u0026#34;) return } /* \u0026lt;div class=\u0026#34;datanowin\u0026#34; id=\u0026#34;myCont2\u0026#34;\u0026gt; */ datanowin := doc.Find(\u0026#34;div.datanowin\u0026#34;) fmt.Println(\u0026#34;datanowin:\u0026#34;, datanowin.Length()) tables := datanowin.Find(\u0026#34;table\u0026#34;) tablelen := tables.Length() fmt.Println(\u0026#34;tablelen:\u0026#34;, tablelen) for i := 0; i \u0026lt; tablelen; i++ { item := tables.Eq(i) tableDo(item) } fmt.Println(doc.Find(\u0026#34;.table\u0026#34;).Length()) } 调用上面的代码后，html网页上没有找到自己所需要的内容，上面的代码问题在哪里？ 假想一下，一般有以下原因选项：\nhttp请求失败 html网页没有对应内容 goquery使用错误导致未找到对应内容 自己排查一下，发现原因不是上面三个选项上，那又是什么原因呢？ 原因是对于http response实例只能读一次，只有第一次才是从0开始读，下一次是上一次读到位置开始的\n代码分析 层层调用与跳转就此略过，只看读取buf内容最终实现代码：\n1 2 3 4 5 6 7 8 9 // A Reader implements the io.Reader, io.ReaderAt, io.WriterTo, io.Seeker, // io.ByteScanner, and io.RuneScanner interfaces by reading from // a byte slice. // Unlike a Buffer, a Reader is read-only and supports seeking. type Reader struct { s []byte i int64 // current reading index prevRune int // index of previous rune; or \u0026lt; 0 } 1 2 3 4 5 6 7 8 9 func (r *Reader) Read(b []byte) (n int, err error) { if r.i \u0026gt;= int64(len(r.s)) { return 0, io.EOF } r.prevRune = -1 n = copy(b, r.s[r.i:]) r.i += int64(n) // 读index向后移动 return } 看到这些代码问题就很清楚了，第一次读取resp.Body时ioutil.ReadAll将所有内容都完了，第二次读调用goquery.NewDocumentFromResponse没有读到任何内容。\n其实问题不止上面这个：看了ioutil.ReadAll的流程后，又看了goquery.NewDocumentFromResponse的实现，发现还有一个问题:代码还存在一个问题，代码存在两次调用defer resp.Body.Close()，这是goquery.NewDocumentFromResponse接管了resp.Body,代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 func NewDocumentFromResponse(res *http.Response) (*Document, error) { if res == nil { return nil, errors.New(\u0026#34;Response is nil\u0026#34;) } defer res.Body.Close() // 接管了resp.Body if res.Request == nil { return nil, errors.New(\u0026#34;Response.Request is nil\u0026#34;) } // Parse the HTML into nodes root, e := html.Parse(res.Body) if e != nil { return nil, e } // Create and fill the document return newDocument(root, res.Request.URL), nil } 一种简单解决上述问题代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 func fetch(url string) { tlsConfig := \u0026amp;tls.Config{ InsecureSkipVerify: true, } transport := \u0026amp;http.Transport{ TLSClientConfig: tlsConfig, } client := http.Client{Transport: transport} resp, err := client.Get(url) if err != nil { fmt.Println(err) \u0026lt;-time.After(300 * time.Second) go fetch(url) return } /* buf, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(\u0026#34;fetchyh:\u0026#34;, err) return } save(buf) //保存html到文件 */ // defer resp.Body.Close() // http to doc doc, err := goquery.NewDocumentFromResponse(resp) if err != nil { fmt.Println(err, \u0026#34;http resp to doc failed\u0026#34;) return } /* \u0026lt;div class=\u0026#34;datanowin\u0026#34; id=\u0026#34;myCont2\u0026#34;\u0026gt; */ datanowin := doc.Find(\u0026#34;div.datanowin\u0026#34;) fmt.Println(\u0026#34;datanowin:\u0026#34;, datanowin.Length()) tables := datanowin.Find(\u0026#34;table\u0026#34;) tablelen := tables.Length() fmt.Println(\u0026#34;tablelen:\u0026#34;, tablelen) for i := 0; i \u0026lt; tablelen; i++ { item := tables.Eq(i) tableDo(item) } fmt.Println(doc.Find(\u0026#34;.table\u0026#34;).Length()) } 总结 第一次遇到这个问题，我就想到是先调用ioutil.ReadAll读取resp.Body的内容，后面调用goquery.NewDocumentFromResponse就没有读到东西。于是我把ioutil.ReadAll相关代码去掉，问题解决了。后面我就没有深入追究原因(还是给自己找个理由：忙)。\n本来我是抗拒写这篇文章的，想想自己在这个问题老是不长记性，还是读一下相关源码，简单记录下来，加深印象。\n读源码是最有收益的解决问题方式。\n最后推荐一下这篇文章：50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs\n(end)\n","permalink":"https://myself659.github.io/post/golang/2017-02-20-go-case-1-my-shadeofgo/","summary":"\u003ch3 id=\"问题\"\u003e问题\u003c/h3\u003e\n\u003cp\u003e还是从代码开始吧\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e50\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efunc\u003c/span\u003e \u003cspan class=\"n\"\u003efetch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etlsConfig\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003etls\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eInsecureSkipVerify\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etransport\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehttp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTransport\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eTLSClientConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003etlsConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eclient\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ehttp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eClient\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eTransport\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003etransport\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eresp\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eerr\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eclient\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eerr\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003efmt\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;-\u003c/span\u003e\u003cspan class=\"n\"\u003etime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAfter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e300\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003etime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSecond\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ego\u003c/span\u003e \u003cspan class=\"n\"\u003efetch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ebuf\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eerr\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eioutil\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eReadAll\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eBody\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eerr\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003efmt\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;fetchyh:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esave\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ebuf\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"err\"\u003e保存\u003c/span\u003e\u003cspan class=\"n\"\u003ehtml到文件\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edefer\u003c/span\u003e \u003cspan class=\"n\"\u003eresp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eBody\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eClose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003ehttp\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003edoc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edoc\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eerr\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003egoquery\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eNewDocumentFromResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresp\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eerr\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003efmt\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http resp to doc failed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ediv\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;datanowin\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;myCont2\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edatanowin\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edoc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFind\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;div.datanowin\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efmt\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;datanowin:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edatanowin\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eLength\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etables\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edatanowin\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFind\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;table\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etablelen\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etables\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eLength\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efmt\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tablelen:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etablelen\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003etablelen\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eitem\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etables\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eEq\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003etableDo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eitem\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efmt\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edoc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFind\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;.table\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eLength\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e调用上面的代码后，html网页上没有找到自己所需要的内容，上面的代码问题在哪里？\n假想一下，一般有以下原因选项：\u003c/p\u003e","title":"Go的50度灰补充--http response只能读一次"},{"content":"体验一下标题党，现在自媒体横行，容我也放肆一回（多了我也不行，替自己码字能力捉急）！\n另起一行，到此为止，进入正题\n缘起 最近通过uc浏览器下载apk的时候，偶尔出现下载apk，下载了60%左右卡住，想到以前看到这篇文章：The curious case of slow downloads（PS：毕竟这个问题不是常出现，就算一次下载失败，反正可以重新下载，总能下载成功的）\n说明 由于本人英文水平有限，翻译水平更是不足，就不具体翻译上面的文章，仅作简单说明，更深的理解请阅读The curious case of slow downloads\n问题描述 Cloudflare是美国一家CDN厂商，他们的工程师发现下面的问题：\n一些下载速度很慢的连接被突然关闭，导致用户下载失败\n这些连接不是客户端主动关闭，而是服务端主动关闭的\n问题原因 原文有具体解决这个问题详细过程，还是值得一看，这里不作描述。\n在满足如下条件情况下会出现下载失败：\nsocket发送缓冲区可用空间低于缓冲区总大小的三分之一 用户下载速度不能达到在60秒内使该socket发送缓冲区可用空间超过缓冲区总大小的三分之一 nginx配置项send_timeout对应值为60秒 当满足上述条件，当60秒超时后，nginx会关闭该连接\n这里大家可能有一个问题，网速慢也会不断发送，怎么会超时出现关闭连接？\n这里有一个普遍的误解：认为send像recv那样，每发送成功一个都上报epoll事件（以linux为例）,而实际send上报epoll事件条件如下：\nsend buffer有可用发送空间 进入发送队列的数据一定要低于LOWAT的设置值（注意：linux 内核2.6版本没有这个限制，linux 内核4.5版本以上有此条件，其他版本情况未知） 发送缓存区的可用空间一定要超过大于发送空间的已使用的空间的二分之一 其中第三个条件对应内核代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait) { unsigned int mask; struct sock *sk = sock-\u0026gt;sk; struct tcp_sock *tp = tcp_sk(sk); sock_poll_wait(file, sk-\u0026gt;sk_sleep, wait); if (sk-\u0026gt;sk_state == TCP_LISTEN) // 侦听状态，进入listen poll，即检查侦听socket的accpet队列是否为空 return inet_csk_listen_poll(sk); /* Socket is not locked. We are protected from async events * by poll logic and correct handling of state changes * made by other threads is impossible in any case. */ mask = 0; /* * POLLHUP is certainly not done right. But poll() doesn\u0026#39;t * have a notion of HUP in just one direction, and for a * socket the read side is more interesting. * * Some poll() documentation says that POLLHUP is incompatible * with the POLLOUT/POLLWR flags, so somebody should check this * all. But careful, it tends to be safer to return too many * bits than too few, and you can easily break real applications * if you don\u0026#39;t tell them that something has hung up! * * Check-me. * * Check number 1. POLLHUP is _UNMASKABLE_ event (see UNIX98 and * our fs/select.c). It means that after we received EOF, * poll always returns immediately, making impossible poll() on write() * in state CLOSE_WAIT. One solution is evident --- to set POLLHUP * if and only if shutdown has been made in both directions. * Actually, it is interesting to look how Solaris and DUX * solve this dilemma. I would prefer, if POLLHUP were maskable, * then we could set it on SND_SHUTDOWN. BTW examples given * in Stevens\u0026#39; books assume exactly this behaviour, it explains * why POLLHUP is incompatible with POLLOUT. --ANK * * NOTE. Check for TCP_CLOSE is added. The goal is to prevent * blocking on fresh not-connected or disconnected socket. --ANK */ /* socket 与tcp 状态转化 poll事件 */ if (sk-\u0026gt;sk_shutdown == SHUTDOWN_MASK || sk-\u0026gt;sk_state == TCP_CLOSE) mask |= POLLHUP; if (sk-\u0026gt;sk_shutdown \u0026amp; RCV_SHUTDOWN) mask |= POLLIN | POLLRDNORM | POLLRDHUP; /* Connected? */ if ((1 \u0026lt;\u0026lt; sk-\u0026gt;sk_state) \u0026amp; ~(TCPF_SYN_SENT | TCPF_SYN_RECV)) { int target = sock_rcvlowat(sk, 0, INT_MAX); if (tp-\u0026gt;urg_seq == tp-\u0026gt;copied_seq \u0026amp;\u0026amp; !sock_flag(sk, SOCK_URGINLINE) \u0026amp;\u0026amp; tp-\u0026gt;urg_data) target--; /* Potential race condition. If read of tp below will * escape above sk-\u0026gt;sk_state, we can be illegally awaken * in SYN_* states. */ /* 未处理接收报文字节数超过了最小阈值，满足可读条件 */ if (tp-\u0026gt;rcv_nxt - tp-\u0026gt;copied_seq \u0026gt;= target) mask |= POLLIN | POLLRDNORM; if (!(sk-\u0026gt;sk_shutdown \u0026amp; SEND_SHUTDOWN)) { /* sk-\u0026gt;sk_sndbuf - sk-\u0026gt;sk_wmem_queued \u0026gt;= sk-\u0026gt;sk_wmem_queued\u0026gt;\u0026gt;1 (简单理解为最大值 0.5* sk-\u0026gt;sk_wmem_queued) 如果未发送报文超过了66%，那么不会继续上报POLLOUT事件 */ if (sk_stream_wspace(sk) \u0026gt;= sk_stream_min_wspace(sk)) { mask |= POLLOUT | POLLWRNORM; } else { /* send SIGIO later */ /* 发送SIGIO */ set_bit(SOCK_ASYNC_NOSPACE, \u0026amp;sk-\u0026gt;sk_socket-\u0026gt;flags); set_bit(SOCK_NOSPACE, \u0026amp;sk-\u0026gt;sk_socket-\u0026gt;flags); /* Race breaker. If space is freed after * wspace test but before the flags are set, * IO signal will be lost. */ if (sk_stream_wspace(sk) \u0026gt;= sk_stream_min_wspace(sk)) mask |= POLLOUT | POLLWRNORM; } } else mask |= POLLOUT | POLLWRNORM; if (tp-\u0026gt;urg_data \u0026amp; TCP_URG_VALID) mask |= POLLPRI; } /* This barrier is coupled with smp_wmb() in tcp_reset() */ smp_rmb(); if (sk-\u0026gt;sk_err) mask |= POLLERR; return mask; } 解决方案 知道上面的原因对应可以选择方案如下：\n方案一：增加send_timeout时间，例如将时间调整为280秒，可以保证在5M发送缓冲区条件下，用户下载速度超过50Kbps不会出现超时导致连接被关闭\n方案二：通过设置/proc/sys/net/ipv4/tcp_wmem值减小socket发送缓冲区大小，发送缓冲区减小，那么在一定下载速率下在指定的时间需要完成下载的大小变小，就可以避免上述的问题出现的条件\n显而易见，这种两种方案都不能从根本上解决问题，只是降低问题出现的概率（这也是进步）\n方案三：改变超时处理，而不是直接关闭，可利用ioctl(TIOCOUTQ)来获取有多少数据仍停留在发送缓冲区，调整超时时间，具体实现可以参考The curious case of slow downloads中提到的方案：a Linux specific patch to NGINX\n相比较于方案一和方案二，方案三对网络速率变化与波动适应性强\n总结 The curious case of slow downloads值得一看（感谢cloudflare工程师没有放弃一些偶现的问题） nginx现有实现单一固化的处理导致不适应tcp传输的多变性 在复杂多变的网络环境下，保证传输高可靠性里面需要很多技术细节需要挖掘 网络是复杂的，主要由于以下原因： 网络协议复杂，例如tcp 网络本身不可靠 网络连接多样性 网络要求高：低延迟，少丢包，抖动小，高速率，自适应 参考 The curious case of slow downloads linux-2.26.32 ","permalink":"https://myself659.github.io/post/2017-02-16-tcp-slow-down/","summary":"\u003cp\u003e体验一下标题党，现在自媒体横行，容我也放肆一回（多了我也不行，替自己码字能力捉急）！\u003c/p\u003e\n\u003cp\u003e另起一行，到此为止，进入正题\u003c/p\u003e\n\u003ch3 id=\"缘起\"\u003e缘起\u003c/h3\u003e\n\u003cp\u003e最近通过uc浏览器下载apk的时候，偶尔出现下载apk，下载了60%左右卡住，想到以前看到这篇文章：\u003ca href=\"https://blog.cloudflare.com/the-curious-case-of-slow-downloads/\"\u003eThe curious case of slow downloads\u003c/a\u003e（PS：毕竟这个问题不是常出现，就算一次下载失败，反正可以重新下载，总能下载成功的）\u003c/p\u003e","title":"TCP连接下载文件失败，也许该看看这篇文章"},{"content":"手机上网就是通过app获取服务，在农村里人们上网喜欢干些什么呢？先从喜欢听什么歌开始？ 在家里时间有限，这次就写这么多，待以后回家再观察其他方面。这里仅仅是开一个小引子：农村互联网用户喜欢什么样内容？\n通过小样本获取不负责农村流行歌单如下：\n小苹果 青藏高原 送情郎 江南 十三不亲 辣妹子 刘三姐 路边的野花不要采 美酒加咖啡 南泥湾 伤不起 妈妈的吻 茉莉花 火苗 月亮之上 再次申明，样本数量有限，不要太当真，随手记记而已\n从上面的歌单可以看出神曲，流行歌曲在哪里都流行，另外就是90年代左右的经典歌曲。\n（End）\n","permalink":"https://myself659.github.io/post/internet/2017-02-04-country-internet-music/","summary":"\u003cp\u003e手机上网就是通过app获取服务，在农村里人们上网喜欢干些什么呢？先从喜欢听什么歌开始？\n在家里时间有限，这次就写这么多，待以后回家再观察其他方面。这里仅仅是开一个小引子：农村互联网用户喜欢什么样内容？\u003c/p\u003e","title":"互联网在农村-音乐"},{"content":"上一篇从电和物理网络两个方面说明自己所看到的农村互联网基础设施情况。这一篇就看看在农村的互联网用户的一些情况。 根据对app使用情况分为以下几种情况：\n基本不使用智能手机 需要引导使用智能手机 自主使用智能手机一些应用 自主使用智能手机大多数应用 基本不使用智能手机 代表人物：大伯父，大伯母\n出生年代：50年代\n教育背景：小学未毕业\n相关经历：基本上很少去城市，只去县城\n需要引导使用智能手机 代表人物：爸爸，妈妈\n出生年代：60年代\n教育背景：爸爸初中未毕业，妈妈小学未毕业\n相关经历：爸爸曾经外出在浙江，江苏打工；妈妈由于晕车基本一直在老家，只有去年去一趟南京\n引导环境：三个孩子都上过大学，使用智能手机是妹妹教他们使用\n使用情况：爸爸把手机当成他的电视，使用手机大部分时间就用爱奇艺看电视剧（他看什么电视剧呢？这个等以后多了解其他用户再写），妈妈主要用微信聊天，聊天主要语音，不会打字聊天，反正我她用的很溜，经常用\n自主使用智能手机一些应用 代表人物：堂叔\n出生年代：1974年\n教育背景：初中未毕业\n相关经历：有一段时间浙江打工经历，近三年没有外出打工\n引导环境：无\n使用情况：自主使用微信，酷我音乐等app，但是还不会下载音乐MV,由于信息的原因未使用网易云音乐\n自主使用智能手机大多数应用 代表人物：堂兄\n出生年代：1979年\n教育背景：初中毕业\n相关经历：长年在苏州打工\n引导环境：无\n使用情况：主流app都有使用（微信，qq， 淘宝， 百度搜索，腾讯新闻，腾讯视频等等），但是有一点就是互联网金融应用不怎么使用，原因主要都是对钱不放心，一直都是把存到银行，对于把钱存在余额宝和微信从心理对安全有一些疑惑\n总结 这样用户基本有以下特征：\n教育程度低（时代与历史的原因），其实他们都很勤劳善良，互联网产品的使用门槛确实对于他们来说有些高 互联网潮流的落后者或者抛弃者（望见谅：想不出更好的表达） 对互联网依赖性远低于年轻人（35岁以下），所以对于第二点反过来也可以说是他们抛弃了互联网 对于互联网应用以满足生活需求为主，只会使用少量的app，例如微信等聊天工具，爱奇艺等视频应用。。。 App推广成本高，但是这些用户一旦学会用使用则粘性大，不会轻易选用其他可以替换的app （End）\n","permalink":"https://myself659.github.io/post/internet/2017-02-03-country-internet-user/","summary":"\u003cp\u003e\u003ca href=\"http://myself659.github.io/coutry-internet-infra/\"\u003e上一篇\u003c/a\u003e从电和物理网络两个方面说明自己所看到的农村互联网基础设施情况。这一篇就看看在农村的互联网用户的一些情况。 根据对app使用情况分为以下几种情况：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e基本不使用智能手机\u003c/li\u003e\n\u003cli\u003e需要引导使用智能手机\u003c/li\u003e\n\u003cli\u003e自主使用智能手机一些应用\u003c/li\u003e\n\u003cli\u003e自主使用智能手机大多数应用\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"基本不使用智能手机\"\u003e基本不使用智能手机\u003c/h3\u003e\n\u003cp\u003e代表人物：大伯父，大伯母\u003c/p\u003e","title":"互联网在农村-用户"},{"content":"说明 老家在安徽省安庆市的一个小山村里，作为一名互联网从业人员，这次回家特地花了一点心思来观察家乡的互联网应用情况。\n这是第一篇，先看农村互联网基础设施情况，上网要有电，要有接入网络，所以下面内容分为两个方面：\n电 物理网络 电 电这一部分是我要大力吐槽的，拿除夕晚上来说，来电，断电，来电，断电。。。这样的循环至少五次，原因大概有下面这些：\n功率不足，除夕晚上电视，家家晚上都把自己家的灯点亮（家乡的风俗习惯） 电工技能水平有限 农村电力基础本身就差 农村有一些人家的线程本身就有问题，例如老化，漏电，甚至还有偷电的行为 除此之外，发现大多数人对于服务质量也没有意识，对于突然的停电也习以为常，毕竟大部分一直在生活在这里，不知道外面的供电服务是什么情况。\n物理网络 物理网络分为两个方面来写吧：\n固定宽带 移动网络 固定宽带 固定宽带基本在10年到17年这七年的时间实现从无到有，从ADSL到光纤接入的发展。了解情况如下：\n接入方式：光纤接入与ADSL并存，新接入方式以光纤为准 网络速度：光纤接入可以达到50M，个人在家使用与在杭州感觉不到什么差异，相反网络还更好一些，这主要可能是开通网络人数不多吧 接入高可用性：在家这十天左右的时间内基本没有出现连接不上的情况 接入费用： 我家的套餐是1500包两年电信套餐，与城市相差无异 网络开通率：了解到一个40户左右的村民小组只有4户开通宽带，开通率才10%左右 移动网络 07年放假回家，当时号称移动信号最好的移动手机回家基本上没有信号，要选好位置，作好姿势才能蹭到黄冈的移动网络，发短信，收短信变成一个十分美好的事情，现在回想起来还能感觉到那一刻自己的心情的美好：有信号真好。慢慢地几年内（具体时间已经记不清楚了）移动基站来了，电信基站来了，联通基站也来了\n15-16两年4G商用，想想也知道，这里还是3G，移动网络的速度正如段子所说：\n2G看苍井空.txt，3G看苍井空.jpg，4G看苍井空.avi\n这里速度当然不利于农村互联网喜欢的视频应用的使用。\n总结 虽然农村基础设施大大落后城市，但是进步迅速，想想在2010年村里才刚开始有ADSL接入，到现在支持50M光纤接入，在网速方面与城市基本上没有区别。希望今后能够网络连接可靠性方面有较大的进步，这样一年当中有一段时间在老家工作也是不错的，空气好，安静适合思考，而且还能吃到妈妈做的美食。\n最后再说明，这是自己的片面之词，写出来仅是记录一下自己见到的一些真实情况，为以后观察提供一个参考。\n（end）\n","permalink":"https://myself659.github.io/post/internet/2017-02-02-country-internet-infra/","summary":"\u003ch3 id=\"说明\"\u003e说明\u003c/h3\u003e\n\u003cp\u003e老家在安徽省安庆市的一个小山村里，作为一名互联网从业人员，这次回家特地花了一点心思来观察家乡的互联网应用情况。\u003c/p\u003e\n\u003cp\u003e这是第一篇，先看农村互联网基础设施情况，上网要有电，要有接入网络，所以下面内容分为两个方面：\u003c/p\u003e","title":"互联网在农村-基础设施"},{"content":"完美 完美是一个理想的状态,但在现实生活中很难达成。不同的人对完美有不同的理解:\n无错误。从客观角度,完美代表一种没有错误、瑕疵和Bug的状态。所有要素都处于最佳状况,没有任何改进的空间。但在复杂系统中要达成这种完美几乎是不可能的。\n最优解。从目标角度,完美代表一种能达成目标或任务的最佳结果或最优解。所有资源和条件都被最理想地运用和调配。但现实生活中有太多变数,很难作出最优的选择。\n主观满意。从个人角度,完美更多代表一种主观上的满足或达成感。当个人的愿望、期待和需求被满足时,会感到很完美。但不同人的需求不同,完美标准也随之不同。\n最高境界。从哲学角度,完美代表一种最高的境界或理想状态。诸如“真、善、美”都可被视为完美,但这些理想很难在现实生活中充分实现。人类只能不断追求,但很难达到。\n整体优化。从系统角度,完美代表一种全局最优的状态。各个系统要素高度协调,相互配合,整体效能最大化。但任何系统都有其复杂性,要优化到完美程度也属于理想。\n综上,完美是一个人类永恒追求但很难达成的理想状态。从不同视角,完美可以理解为没有错误、最优解、主观满意、最高境界或整体优化等,但现实生活中的种种复杂性都使得完美变得遥不可及。人类只能不断逼近完美,但永远无法达到完全完美,这也给生活带来动力。完美永远是一种距离感和追求的过程。\n不追求完美 完美是很难具体清晰的定义。完美是一个主观概念,每个人对完美的理解都不同,很难给出一个客观清晰且被广泛接受的定义,这使得追求完美变得无序和模糊。\n完美往往性价比差。追求完美需要投入大量资源,但收益并不成正比。根据帕累托法则,追求绝对完美的收益是递减的,而成本是递增的,这导致性价比下降。\n完美是不必要的。大多数情况下,不完美也能满足需求。追求完美带来的边际效用并不高,所以从实用角度完美是不必要的。这符合功利主义观点。\n完美导致拖延,影响行动。追求完美会不断改进与修正,难以达成结束点,这会产生拖延现象,延缓行动与实现。现实生活需要及时行动。\n完成与拥有胜过完美。一个不完美的产品或结果,只要可以完成任务并带来实际效用,就已经胜过一件永远无法实现的完美设想。这符合实用主义思想。\n完美可能是不存在的。就连宇宙这种高度复杂的系统,也难以达到绝对完美的状态。真实世界中,各种不确定因素的存在决定了完美可能永远也不可达成,它只存在于思维的理想境界中。完美就像数学里面无穷大与无穷小一样，你永远不知道它的值到底是多少？\n追求进步 进步可以实现,完美不可及。进步是一个相对概念,可以通过持续努力逐步实现,而完美是一个绝对概念,现实生活中很难达成。所以进步是一个现实的目标,完美更像一种理想。\n进步可以持续提高,完美无法衡量。进步度可以通过各种标准进行衡量和评价,并不断提高,而完美作为一种理想状态,很难给出客观衡量标准,无法判断是否真的达到完美。\n进步可以满足需求,完美不实用。适度的进步可以满足大多数实际需求,实现比较理想的结果,而追求完美带来的收益是递减的,实用性较差。\n进步促进行动,完美拖延行动。进步是一个渐进的过程,可以边行动边进步,而追求完美需要不断推翻重来,易产生拖延和行动滞后。\n进步可以带来满足,完美只有距离感。实现一定进步可以带来成就感和满足,而完美作为一种永远无法达到的理想,只会带来无止境的距离感和不满足。\n进步更科学合理。科学追求渐进改善,讲求实证与效果,而完美属于非理性和极端的思维方式。所以从科学角度来说,追求进步更加合理与适当。\n综上,作为实用主义者,追求进步而非完美是更科学合理的选择。进步具有较强的实现性、可衡量性、实用性和结果导向性,能满足现实需求,不易拖延行动,更能带来成就感。而完美只是一个理想,科学和现实的思维方式不应追求不可达成的极端状态。所以,Done is better than perfect,但要不断进步,这才是积极实用的态度.\n","permalink":"https://myself659.github.io/post/life/%E4%B8%8D%E8%BF%BD%E6%B1%82%E5%AE%8C%E7%BE%8E/","summary":"\u003ch2 id=\"完美\"\u003e完美\u003c/h2\u003e\n\u003cp\u003e完美是一个理想的状态,但在现实生活中很难达成。不同的人对完美有不同的理解:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e无错误。从客观角度,完美代表一种没有错误、瑕疵和Bug的状态。所有要素都处于最佳状况,没有任何改进的空间。但在复杂系统中要达成这种完美几乎是不可能的。\u003c/p\u003e","title":"不追求完美，追求进步"},{"content":"背景 人生不如意十有八九。生活处处有坑，避免不踩坑不可能，但是还是要努力防止踩大坑。\n认知与心理 偏见、妄想等因素导致不能发现与尊重事实和规则 思维定势，错误地执念，拒绝改变，视野与格局打不开 想当然，盲目，盲从，懒惰，不能独立思考与验证 不知道什么是最重要的，没有明确的目标 不知道自己不知道，缺少敬畏 缺少长期心态与长远眼光，没有耐心，不能延迟满足 选择与环境 选择牺牲身体来赚钱 选错专业与行业 关键事件方面选错人来合作如结婚，创业等等 处于烂人的环境当中（如爱抱怨的工作同事，暗规则横行的工作氛围） 缺少对危险因素的洞察与风险控制(君子不立危墙之下) 行为与习惯 不思考，不学习，无进步 恶性循环（如赌博，混自己不喜欢的工作） 不自律，放纵自己 爱与别人比较 跟风与凑热闹 嫉妒 拖延并缺少执行力 只想不做，浅尝辄止，做事不到位 情绪不稳定，波动大，情绪冲动 重复犯相同的错误 拖延症 ","permalink":"https://myself659.github.io/post/life/%E4%BA%BA%E7%94%9F%E6%9C%89%E5%93%AA%E4%BA%9B%E5%A4%A7%E5%9D%91/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e人生不如意十有八九。生活处处有坑，避免不踩坑不可能，但是还是要努力防止踩大坑。\u003c/p\u003e\n\u003ch2 id=\"认知与心理\"\u003e认知与心理\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e偏见、妄想等因素导致不能发现与尊重事实和规则\u003c/li\u003e\n\u003cli\u003e思维定势，错误地执念，拒绝改变，视野与格局打不开\u003c/li\u003e\n\u003cli\u003e想当然，盲目，盲从，懒惰，不能独立思考与验证\u003c/li\u003e\n\u003cli\u003e不知道什么是最重要的，没有明确的目标\u003c/li\u003e\n\u003cli\u003e不知道自己不知道，缺少敬畏\u003c/li\u003e\n\u003cli\u003e缺少长期心态与长远眼光，没有耐心，不能延迟满足\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"选择与环境\"\u003e选择与环境\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e选择牺牲身体来赚钱\u003c/li\u003e\n\u003cli\u003e选错专业与行业\u003c/li\u003e\n\u003cli\u003e关键事件方面选错人来合作如结婚，创业等等\u003c/li\u003e\n\u003cli\u003e处于烂人的环境当中（如爱抱怨的工作同事，暗规则横行的工作氛围）\u003c/li\u003e\n\u003cli\u003e缺少对危险因素的洞察与风险控制(君子不立危墙之下)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"行为与习惯\"\u003e行为与习惯\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e不思考，不学习，无进步\u003c/li\u003e\n\u003cli\u003e恶性循环（如赌博，混自己不喜欢的工作）\u003c/li\u003e\n\u003cli\u003e不自律，放纵自己\u003c/li\u003e\n\u003cli\u003e爱与别人比较\u003c/li\u003e\n\u003cli\u003e跟风与凑热闹\u003c/li\u003e\n\u003cli\u003e嫉妒\u003c/li\u003e\n\u003cli\u003e拖延并缺少执行力\u003c/li\u003e\n\u003cli\u003e只想不做，浅尝辄止，做事不到位\u003c/li\u003e\n\u003cli\u003e情绪不稳定，波动大，情绪冲动\u003c/li\u003e\n\u003cli\u003e重复犯相同的错误\u003c/li\u003e\n\u003cli\u003e拖延症\u003c/li\u003e\n\u003c/ol\u003e","title":"人生有哪些大坑"},{"content":"问题 1. 你想要什么？ 未来自我定义：明确你的未来自我是谁，这对于激发动力和方向至关重要。\n2. 你有多想要它？ 真正的渴望程度：探讨你对目标的渴望有多强烈，以及你是否愿意为之付出努力。\n3. 现在的你离你想要的有多远？ 当前与未来自我矛盾：识别当前自我与未来自我之间的主要矛盾，并致力于解决这些矛盾。\n4. 你能做什么来实现你想要的？ 承诺程度：评估你对实现所声称想要的东西的承诺有多坚定。\n5. 你开始行动吗？你愿意付出什么？ 付出代价：是否愿意放弃当前的身份和舒适区，为了成为真正想要的人而付出代价。\n","permalink":"https://myself659.github.io/post/life/%E4%BA%94%E4%B8%AA%E9%97%AE%E9%A2%98%E6%89%BE%E5%88%B0%E7%9C%9F%E6%AD%A3%E8%A6%81%E6%83%B3%E7%9A%84/","summary":"\u003ch2 id=\"问题\"\u003e问题\u003c/h2\u003e\n\u003ch3 id=\"1-你想要什么\"\u003e1. 你想要什么？\u003c/h3\u003e\n\u003cp\u003e未来自我定义：明确你的未来自我是谁，这对于激发动力和方向至关重要。\u003c/p\u003e\n\u003ch3 id=\"2-你有多想要它\"\u003e2. 你有多想要它？\u003c/h3\u003e\n\u003cp\u003e真正的渴望程度：探讨你对目标的渴望有多强烈，以及你是否愿意为之付出努力。\u003c/p\u003e","title":"五个问题帮你找到你真正的想要的"},{"content":"说明 go源码版本：1.7 go源码运行环境：Linux epoll在c语言编程示例 先看一下大家比较熟悉的epoll在c语言中应用，代码取自rtmpserver_demo中的文件rtmpepollsrv.c\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 int RtmpSessionHandle(int iFd, int iEvent, void *pContext) { int iRet; RTMP_SESSION *pSession = (RTMP_SESSION *)pContext; if(iEvent\u0026amp;EPOLLIN ) { if(0 == pSession-\u0026gt;handshake) { iRet = RtmpSessionHandshake(pSession); if(0 != iRet) { RtmpSessionHandleFin(pSession); } } else { iRet = RtmpPktHandle(pSession); } } if(iEvent \u0026amp; (EPOLLERR |EPOLLHUP) ) { RtmpSessionHandleFin(pSession); } return iRet; } int ListenHandle(int iFd, int iEvent, void *pContext) { int iNewFd; int iRet = 0; struct sockaddr tmpAddr; memset(\u0026amp;tmpAddr, 0, sizeof(tmpAddr)); int iSocketSize = sizeof(tmpAddr); EPOLL_CTX *pCtx; RTMP_SESSION *pServer; if(iEvent|EPOLLIN) { iNewFd = accept(iFd, \u0026amp;tmpAddr, (socklen_t *)\u0026amp;iSocketSize); if(RTMP_EPOLLSRV_INVALIDFD \u0026lt; iNewFd) { pServer = (RTMP_SESSION *)malloc(sizeof(RTMP_SESSION)); if(NULL == pServer) { return -1; } pServer-\u0026gt;handshake = 0; pCtx = (EPOLL_CTX *)malloc(sizeof(EPOLL_CTX)); if(NULL == pCtx) { free(pServer); return -1; } pServer-\u0026gt;socket = iNewFd; pCtx-\u0026gt;iFd = iNewFd; pCtx-\u0026gt;pContext = pServer; pCtx-\u0026gt;pfHandle = RtmpSessionHandle; /* 加入epoll */ iRet = epoll_op(g_iEpollFd, EPOLL_CTL_ADD, iNewFd, EPOLLIN|EPOLLERR|EPOLLHUP, pCtx); } else { printf(\u0026#34;accept errno:%s\u0026#34;,strerror(errno)); } } return iRet; } int epoll_op(int iEpollFd, int iOp, int iFd, int iEvent, EPOLL_CTX *pCtx) { int iRet; struct epoll_event ev; ev.events = iEvent; ev.data.ptr = pCtx; iRet = epoll_ctl(iEpollFd, iOp, iFd, \u0026amp;ev); return iRet; } int epoll_loop(int iEpollFd) { int iNum; struct epoll_event astEpEvent[RTMP_EPOLLSRV_MAXEPOLL]; int i; EpollCallBack_PF pfHandle; EPOLL_CTX *pCtx; for( ; ;) { iNum= epoll_wait(iEpollFd, \u0026amp;astEpEvent[0], RTMP_EPOLLSRV_MAXEPOLL, -1); if( 0 \u0026lt; iNum) { for(i = 0; i \u0026lt; iNum; i++) { pCtx = (EPOLL_CTX *)astEpEvent[i].data.ptr; pfHandle = pCtx-\u0026gt;pfHandle; (void)pfHandle(pCtx-\u0026gt;iFd, astEpEvent[i].events, pCtx-\u0026gt;pContext); } } else { printf(\u0026#34;epoll_wait failed\\r\\n\u0026#34;); } } return 0; } int main(void) { int iFd; struct sockaddr_in addr; printf(\u0026#34;in the main\\r\\n\u0026#34;); /* 初始化epoll */ g_iEpollFd = epoll_create(200); if(RTMP_EPOLLSRV_INVALIDFD \u0026gt;= g_iEpollFd) { printf(\u0026#34;create epoll failed\\r\\n\u0026#34;); return -1; } /* 创建侦听端口 */ iFd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(RTMP_EPOLLSRV_INVALIDFD \u0026gt;= iFd) { printf(\u0026#34;create listen socket failed\\r\\n\u0026#34;); return -1; } addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(g_cRtmpSrvAddr); addr.sin_port = htons(g_usRtmpSrvPort); if( 0 != bind(iFd, (struct sockaddr *) \u0026amp;addr, sizeof(struct sockaddr_in))) { return -1; } if( 0 != listen(iFd, 200)) { return -1; } EPOLL_CTX *pEpollCtx = (EPOLL_CTX *)malloc(sizeof(EPOLL_CTX)); if(NULL == pEpollCtx) { return -1; } pEpollCtx-\u0026gt;iFd = iFd; pEpollCtx-\u0026gt;pfHandle = ListenHandle; pEpollCtx-\u0026gt;pContext = NULL; /* 加入epoll */ if(0 != epoll_op(g_iEpollFd, EPOLL_CTL_ADD, iFd, EPOLLIN|EPOLLERR|EPOLLHUP, pEpollCtx)) { return -1; } g_iListenFd = iFd; epoll_loop(g_iEpollFd); return 0; } 功能 上述代码代码主要通过epoll实现一个最基本的网络服务器（侦听一个端口，处理这个端口上连接）\n几个重要数据结构\n实现分析 简单说明如下：\n用下面的结构体EPOLL_CTX保存epoll的回调及异步处理的上下文\n1 2 3 4 5 6 typedef struct { int iFd; EpollCallBack_PF pfHandle; void *pContext; }EPOLL_CTX; 从面向过程编程角度简单梳理一下epoll相关的代码\n创建epoll 加入epoll 进入epoll_loop,处理epoll事件 go 编程示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 package main import ( \u0026#34;fmt\u0026#34; \u0026#34;net\u0026#34; \u0026#34;os\u0026#34; ) const ( CONN_HOST = \u0026#34;localhost\u0026#34; CONN_PORT = \u0026#34;3333\u0026#34; CONN_TYPE = \u0026#34;tcp\u0026#34; ) func main() { // Listen for incoming connections. l, err := net.Listen(CONN_TYPE, CONN_HOST+\u0026#34;:\u0026#34;+CONN_PORT) if err != nil { fmt.Println(\u0026#34;Error listening:\u0026#34;, err.Error()) os.Exit(1) } // Close the listener when the application closes. defer l.Close() fmt.Println(\u0026#34;Listening on \u0026#34; + CONN_HOST + \u0026#34;:\u0026#34; + CONN_PORT) for { // Listen for an incoming connection. conn, err := l.Accept() if err != nil { fmt.Println(\u0026#34;Error accepting: \u0026#34;, err.Error()) os.Exit(1) } // Handle connections in a new goroutine. go handleRequest(conn) } } // Handles incoming requests. func handleRequest(conn net.Conn) { // Make a buffer to hold incoming data. buf := make([]byte, 1024) // Read the incoming connection into the buffer. reqLen, err := conn.Read(buf) if err != nil { fmt.Println(\u0026#34;Error reading:\u0026#34;, err.Error()) conn.Close() return } fmt.Printf(\u0026#34;recv:%s, len=%d\\n\u0026#34;, string(buf), reqLen) // Send a response back to person contacting us. conn.Write([]byte(\u0026#34;Message received.\u0026#34;)) // Close the connection when you\u0026#39;re done with it. conn.Close() } 对比 handleRequest代码对应c语言版本epoll回调，但是这个代码与业务逻辑很搭，读取报文，进行处理，返回结果这些操作可以同一个函数内（也就是同一个逻辑上面）实现，没有异步回调就是爽啊 go语言上编程上不需要看到epoll，也就没添加/删除epoll的操作 编程模型方面无论是原生的回调还是reactor模型，go语言更符合业务的逻辑，而不需要考虑epoll相关处理 够简洁明了，有着与c语言相当的性能，程序员们让我们一起go吧！ Go Net实现分析 通过以上对比，显而易见，go语言保证效率的情况，在易用性大大超过了c，那golang是如何实现的？下面具体分析golang的net库实现\ngoroutine调度时机 一般在以下四种情况下进行goroutine调度：\nchannel收发 显示调用go函数 阻塞的系统调用，如read,write GC epoll使用 先简单看一下各个epoll操作代码实现，先找到他们，再分析如何利用这些操作来完成简洁的网络编程\nepoll初始化 对应c语言版本的epoll_create，go语言版本在初始化在下面的代码中完成:\n1 2 3 4 5 6 7 8 9 10 11 12 13 func netpollinit() { epfd = epollcreate1(_EPOLL_CLOEXEC) if epfd \u0026gt;= 0 { return } epfd = epollcreate(1024) if epfd \u0026gt;= 0 { closeonexec(epfd) return } println(\u0026#34;netpollinit: failed to create epoll descriptor\u0026#34;, -epfd) throw(\u0026#34;netpollinit: failed to create descriptor\u0026#34;) } 将fd加入epoll 对应c语言版本的epoll_op，go语言版本在初始化在下面的代码中完成:\n1 2 3 4 5 6 func netpollopen(fd uintptr, pd *pollDesc) int32 { var ev epollevent ev.events = _EPOLLIN | _EPOLLOUT | _EPOLLRDHUP | _EPOLLET *(**pollDesc)(unsafe.Pointer(\u0026amp;ev.data)) = pd return -epollctl(epfd, _EPOLL_CTL_ADD, int32(fd), \u0026amp;ev) } 注意这里采用的边沿触发\n从epoll摘除fd 对应c语言版本的epoll_op，go语言版本在初始化在下面的代码中完成:\n1 2 3 4 func netpollclose(fd uintptr) int32 { var ev epollevent return -epollctl(epfd, _EPOLL_CTL_DEL, int32(fd), \u0026amp;ev) } 数据结构 pollDesc 结构体pollDesc用于关联fd与epoll，具体结构如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 // Network poller descriptor. // 每个添加到epoll中的fd都对应了一个PollDesc结构实例 type pollDesc struct { // 指向下一个pollDesc link *pollDesc // in pollcache, protected by pollcache.lock // The lock protects pollOpen, pollSetDeadline, pollUnblock and deadlineimpl operations. // This fully covers seq, rt and wt variables. fd is constant throughout the PollDesc lifetime. // pollReset, pollWait, pollWaitCanceled and runtime·netpollready (IO readiness notification) // proceed w/o taking the lock. So closing, rg, rd, wg and wd are manipulated // in a lock-free way by all operations. // NOTE(dvyukov): the following code uses uintptr to store *g (rg/wg), // that will blow up when GC starts moving objects. lock mutex // protects the following fields // 系统为socket分配的fd fd uintptr closing bool // 是否关闭 // 用于保护旧定时器和就绪的通知 seq uintptr // protects from stale timers and ready notifications // 网络io读状态，分为三种: 网络io就绪， 进入等待状态， 等待状态，此时rg保存等待goroutine实例的指针 rg uintptr // pdReady, pdWait, G waiting for read or nil rt timer // read deadline timer (set if rt.f != nil) // 读超时时间，单位为ns rd int64 // read deadline // 网络io写状态，分为三种: 网络io就绪， 进入等待状态， 等待状态，此时rg保存等待goroutine实例的指针 wg uintptr // pdReady, pdWait, G waiting for write or nil // 写超时时间，单位为ns wt timer // write deadline timer wd int64 // write deadline user uint32 // user settable cookie } epoll操作封装 以初始化epoll及加入epoll为例，在下面的函数中完成的\n1 2 3 4 5 6 7 8 9 10 11 12 var serverInit sync.Once func (pd *pollDesc) init(fd *netFD) error { serverInit.Do(runtime_pollServerInit) ctx, errno := runtime_pollOpen(uintptr(fd.sysfd)) if errno != 0 { return syscall.Errno(errno) } pd.runtimeCtx = ctx return nil } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 func (fd *netFD) accept() (netfd *netFD, err error) { if err := fd.readLock(); err != nil { return nil, err } defer fd.readUnlock() var s int var rsa syscall.Sockaddr if err = fd.pd.prepareRead(); err != nil { return nil, err } for { s, rsa, err = accept(fd.sysfd) if err != nil { nerr, ok := err.(*os.SyscallError) if !ok { return nil, err } switch nerr.Err { case syscall.EAGAIN: if err = fd.pd.waitRead(); err == nil { continue } case syscall.ECONNABORTED: // This means that a socket on the // listen queue was closed before we // Accept()ed it; it\u0026#39;s a silly error, // so try again. continue } return nil, err } break } if netfd, err = newFD(s, fd.family, fd.sotype, fd.net); err != nil { closeFunc(s) return nil, err } // 调用上面函数加入epoll if err = netfd.init(); err != nil { fd.Close() return nil, err } lsa, _ := syscall.Getsockname(netfd.sysfd) netfd.setAddr(netfd.addrFunc()(lsa), netfd.addrFunc()(rsa)) return netfd, nil } 读处理 先从为Read代码开始\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 func (fd *netFD) Read(p []byte) (n int, err error) { if err := fd.readLock(); err != nil { return 0, err } defer fd.readUnlock() if len(p) == 0 { // If the caller wanted a zero byte read, return immediately // without trying. (But after acquiring the readLock.) Otherwise // syscall.Read returns 0, nil and eofError turns that into // io.EOF. // TODO(bradfitz): make it wait for readability? (Issue 15735) return 0, nil } if err := fd.pd.prepareRead(); err != nil { return 0, err } for { n, err = syscall.Read(fd.sysfd, p) if err != nil { n = 0 if err == syscall.EAGAIN { // 没有可读数据，进行读等待处理 if err = fd.pd.waitRead(); err == nil { continue } } } err = fd.eofError(n, err) break } if _, ok := err.(syscall.Errno); ok { err = os.NewSyscallError(\u0026#34;read\u0026#34;, err) } return } 具体分析读等待处理,跳过封装，直接分析处理代码：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 //go:linkname net_runtime_pollWait net.runtime_pollWait // 进入pollwait状态进行goroutine调度 func net_runtime_pollWait(pd *pollDesc, mode int) int { err := netpollcheckerr(pd, int32(mode)) if err != 0 { return err } // As for now only Solaris uses level-triggered IO. if GOOS == \u0026#34;solaris\u0026#34; { netpollarm(pd, mode) } // for !netpollblock(pd, int32(mode), false) { err = netpollcheckerr(pd, int32(mode)) if err != 0 { return err } // Can happen if timeout has fired and unblocked us, // but before we had a chance to run, timeout has been reset. // Pretend it has not happened and retry. } return 0 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 // returns true if IO is ready, or false if timedout or closed // waitio - wait only for completed IO, ignore errors // 返回true表示IO就绪，返回false表示超时或者关闭 // waitio 表示是否等待IO,超时时该参数为false func netpollblock(pd *pollDesc, mode int32, waitio bool) bool { // 从pd.rg取指针 gpp := \u0026amp;pd.rg if mode == \u0026#39;w\u0026#39; { gpp = \u0026amp;pd.wg } // set the gpp semaphore to WAIT for { old := *gpp if old == pdReady { *gpp = 0 return true } if old != 0 { throw(\u0026#34;netpollblock: double wait\u0026#34;) } // cas 设置读状态为pdWait状态 if atomic.Casuintptr(gpp, 0, pdWait) { break } } // need to recheck error states after setting gpp to WAIT // this is necessary because runtime_pollUnblock/runtime_pollSetDeadline/deadlineimpl // do the opposite: store to closing/rd/wd, membarrier, load of rg/wg // 因为runtime_pollUnblock runtime_pollSetDeadline/deadlineimpl 将rg/wg状态修改为closing if waitio || netpollcheckerr(pd, mode) == 0 { gopark(netpollblockcommit, unsafe.Pointer(gpp), \u0026#34;IO wait\u0026#34;, traceEvGoBlockNet, 5) } // be careful to not lose concurrent READY notification old := atomic.Xchguintptr(gpp, 0) if old \u0026gt; pdWait { throw(\u0026#34;netpollblock: corrupted state\u0026#34;) } return old == pdReady } 总结 net网络库的设计的精华,良好的封装与接口,提高简单可靠的接口 充分利用goroutine机制 同步编程，异步执行，这一点其实在内核也能找到，只是调度机制不一样 多学习源码，这里面有精妙的设计，科学的框架 很多问题深入一下就到底层了 异步编程能够带来高性能，但是也是高要求，如果系统复杂，出现问题不好定位，同时代码的可读性也差 代码在满足正确性的基础上，应先追求可读性，规范性，高性能往后排 参考 How Goroutines Work ","permalink":"https://myself659.github.io/post/golang/2016-09-10-from-cepoll-to-go-net/","summary":"\u003ch2 id=\"说明\"\u003e说明\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003ego源码版本：1.7\u003c/li\u003e\n\u003cli\u003ego源码运行环境：Linux\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"epoll在c语言编程示例\"\u003eepoll在c语言编程示例\u003c/h2\u003e\n\u003cp\u003e先看一下大家比较熟悉的epoll在c语言中应用，代码取自\u003ca href=\"https://github.com/myself659/rtmpserver_demo\"\u003ertmpserver_demo\u003c/a\u003e中的文件\u003ca href=\"https://github.com/myself659/rtmpserver_demo/blob/master/rtmpepollsrv.c\"\u003ertmpepollsrv.c\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e  1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 74\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 75\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 76\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 77\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 78\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 79\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 80\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 81\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 82\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 83\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 84\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 85\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 86\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 87\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 88\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 89\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 90\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 91\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 92\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 93\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 94\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 95\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 96\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 97\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 98\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 99\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e100\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e101\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e102\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e103\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e104\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e105\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e106\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e107\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e108\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e109\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e110\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e111\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e112\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e113\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e114\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e115\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e116\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e117\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e118\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e119\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e120\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e121\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e122\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e123\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e124\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e125\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e126\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e127\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e128\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e129\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e130\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e131\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e132\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e133\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e134\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e135\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e136\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e137\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e138\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e139\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e140\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e141\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e142\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e143\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e144\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e145\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e146\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e147\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e148\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e149\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e150\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e151\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e152\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e153\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e154\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e155\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e156\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e157\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e158\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e159\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e160\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e161\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e162\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e163\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e164\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e165\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e166\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e167\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e168\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e169\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e170\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e171\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e172\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e173\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e174\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e175\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e176\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e177\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e178\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e179\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eint RtmpSessionHandle(int iFd, int iEvent, void *pContext)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    int iRet;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    RTMP_SESSION *pSession = (RTMP_SESSION *)pContext;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if(iEvent\u0026amp;EPOLLIN )\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if(0 == pSession-\u0026gt;handshake)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            iRet = RtmpSessionHandshake(pSession);      \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            if(0 != iRet)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                RtmpSessionHandleFin(pSession); \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        else\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {   \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            iRet =  RtmpPktHandle(pSession);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if(iEvent \u0026amp; (EPOLLERR |EPOLLHUP) )\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        RtmpSessionHandleFin(pSession);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return iRet;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eint ListenHandle(int iFd, int iEvent, void *pContext)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    int iNewFd;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    int iRet = 0;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    struct sockaddr tmpAddr;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    memset(\u0026amp;tmpAddr, 0, sizeof(tmpAddr));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    int iSocketSize = sizeof(tmpAddr);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    EPOLL_CTX *pCtx; \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    RTMP_SESSION *pServer;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if(iEvent|EPOLLIN)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        iNewFd = accept(iFd, \u0026amp;tmpAddr, (socklen_t *)\u0026amp;iSocketSize); \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if(RTMP_EPOLLSRV_INVALIDFD \u0026lt; iNewFd)    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            pServer = (RTMP_SESSION *)malloc(sizeof(RTMP_SESSION));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            if(NULL == pServer)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                return -1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            pServer-\u0026gt;handshake  = 0; \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            pCtx = (EPOLL_CTX *)malloc(sizeof(EPOLL_CTX));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            if(NULL == pCtx)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                free(pServer);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                return -1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            pServer-\u0026gt;socket = iNewFd;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            pCtx-\u0026gt;iFd = iNewFd;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            pCtx-\u0026gt;pContext = pServer;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            pCtx-\u0026gt;pfHandle = RtmpSessionHandle;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            /* 加入epoll */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            iRet = epoll_op(g_iEpollFd, EPOLL_CTL_ADD, iNewFd,  EPOLLIN|EPOLLERR|EPOLLHUP,  pCtx);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        else\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            printf(\u0026#34;accept errno:%s\u0026#34;,strerror(errno));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return iRet;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eint epoll_op(int iEpollFd, int iOp, int iFd, int iEvent,  EPOLL_CTX *pCtx)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    int iRet;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    struct epoll_event ev;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ev.events = iEvent;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ev.data.ptr = pCtx;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    iRet = epoll_ctl(iEpollFd, iOp, iFd, \u0026amp;ev);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return iRet;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eint epoll_loop(int iEpollFd)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    int iNum;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    struct epoll_event astEpEvent[RTMP_EPOLLSRV_MAXEPOLL];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    int i;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    EpollCallBack_PF pfHandle;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    EPOLL_CTX *pCtx;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    for( ;  ;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        iNum= epoll_wait(iEpollFd, \u0026amp;astEpEvent[0],  RTMP_EPOLLSRV_MAXEPOLL, -1);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if( 0 \u0026lt; iNum)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            for(i = 0; i \u0026lt; iNum; i++)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                pCtx = (EPOLL_CTX *)astEpEvent[i].data.ptr;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                pfHandle = pCtx-\u0026gt;pfHandle;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                (void)pfHandle(pCtx-\u0026gt;iFd, astEpEvent[i].events, pCtx-\u0026gt;pContext);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        else\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            printf(\u0026#34;epoll_wait failed\\r\\n\u0026#34;);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return 0;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eint main(void)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    int iFd;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    struct sockaddr_in addr;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    printf(\u0026#34;in the main\\r\\n\u0026#34;);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    /* 初始化epoll */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    g_iEpollFd = epoll_create(200);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if(RTMP_EPOLLSRV_INVALIDFD \u0026gt;= g_iEpollFd)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        printf(\u0026#34;create epoll failed\\r\\n\u0026#34;);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return  -1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    /* 创建侦听端口 */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    iFd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if(RTMP_EPOLLSRV_INVALIDFD \u0026gt;= iFd)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        printf(\u0026#34;create listen socket failed\\r\\n\u0026#34;);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return  -1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    addr.sin_family = AF_INET;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    addr.sin_addr.s_addr = inet_addr(g_cRtmpSrvAddr);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    addr.sin_port = htons(g_usRtmpSrvPort);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if( 0 != bind(iFd, (struct sockaddr *) \u0026amp;addr, sizeof(struct sockaddr_in)))\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return  -1;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if( 0 != listen(iFd, 200))\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return  -1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    EPOLL_CTX *pEpollCtx = (EPOLL_CTX *)malloc(sizeof(EPOLL_CTX));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if(NULL == pEpollCtx)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return -1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    pEpollCtx-\u0026gt;iFd = iFd;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    pEpollCtx-\u0026gt;pfHandle = ListenHandle;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    pEpollCtx-\u0026gt;pContext = NULL;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    /* 加入epoll */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if(0 != epoll_op(g_iEpollFd, EPOLL_CTL_ADD, iFd, EPOLLIN|EPOLLERR|EPOLLHUP, pEpollCtx))\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return -1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    g_iListenFd = iFd;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    epoll_loop(g_iEpollFd);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return  0;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"功能\"\u003e功能\u003c/h3\u003e\n\u003cp\u003e上述代码代码主要通过epoll实现一个最基本的网络服务器（侦听一个端口，处理这个端口上连接）\u003c/p\u003e","title":"从C语言epoll编程到go net实现分析"},{"content":"本篇以ChanBroker版本迭代过程，总结常见Channel编程问题\n简介 ChanBroker设计主要参考Kafka模型，主要提供进程内goroutine之间通信，实现以下功能：\n支持多个Publisher发布内容 支持Subscriber注册与去注册订阅 发布内容可以是任何形式 ChanBroker根据订阅情况完成内容推送 版本1 具体代码如下:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 package ChanBroker type Content interface{} type Subscriber chan Content type ChanBroker struct { RegSub chan Subscriber UnRegSub chan Subscriber Contents chan Content Stop chan bool Subscribers map[Subscriber]bool } func NewChanBroker() *ChanBroker { ChanBroker := new(ChanBroker) ChanBroker.RegSub = make(chan Subscriber) ChanBroker.UnRegSub = make(chan Subscriber) ChanBroker.Contents = make(chan Content) ChanBroker.Stop = make(chan bool) ChanBroker.Subscribers = make(map[Subscriber]bool) ChanBroker.run() return ChanBroker } func (self *ChanBroker) run() { go func() { // Broker goroutine for { select { case content := \u0026lt;-self.Contents: for sub := range self.Subscribers { sub \u0026lt;- content } case sub := \u0026lt;-self.RegSub: self.Subscribers[sub] = true case sub := \u0026lt;-self.UnRegSub: delete(self.Subscribers, sub) close(sub) case \u0026lt;-self.Stop: for sub := range self.Subscribers { delete(self.Subscribers, sub) close(sub) } return } } }() } func (self *ChanBroker) RegSubscriber() Subscriber { sub := make(Subscriber) self.RegSub \u0026lt;- sub return sub } func (self *ChanBroker) UnRegSubscriber(sub Subscriber) { self.UnRegSub \u0026lt;- sub } func (self *ChanBroker) StopPublish() { self.Stop \u0026lt;- true } func (self *ChanBroker) PubContent(c Content) { self.Contents \u0026lt;- c } 存在以下问题，具体如下：\n问题1：不支持扩展 问题描述：\n在一个Broker goroutine内完成注册与去注册以及内容发布推送给Subscriber，无法控制Subscriber数量，且不支持扩展\n解决思路：\n主要修改如下：\n增加Pusher goroutine，Pusher goroutine支持动态创建，由Pusher goroutine完成具体内容的推送 问题2： 推送内容到Subscriber存在Deadlock风险 问题描述：\n例如一个Subscriber不能正确从通道接收订阅内容，那么Broker会阻塞在上述代码的34行，与此同时其他Subscriber都会阻塞，极有可能引起级联阻塞，影响恶劣\n解决思路：\n主要修改如下：\n支持Subscriber可以定制订阅通道的大小，利用队列缓存内容 增加Pusher goroutine，避免由于某个内容的推送导致整个内容推送的阻塞 增加超时机制，避免在具体内容推送过程由于某一个Subscriber不正常工作影响其他的Subscriber 问题3： Broker goroutine退出后调用RegSubscriber，UnRegSubscriber，StopPublish，PubContent函数存在Deadlock风险 问题描述：\n如题\n解决思路：\n主要修改如下：\nChanBroker增加退出状态描述，避免Broker goroutine退出之后上述函数向Broker goroutine 的channel发送信息 版本2 具体代码如下:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 package ChanBroker import ( \u0026#34;fmt\u0026#34; \u0026#34;sync\u0026#34; \u0026#34;time\u0026#34; ) type Content interface{} type Subscriber chan Content type ChanBroker struct { RegSub chan Subscriber UnRegSub chan Subscriber Contents chan Content Stop chan bool exit bool Subscribers map[Subscriber]bool lock sync.RWMutex timeout time.Duration } func NewChanBroker(timeout time.Duration) *ChanBroker { ChanBroker := new(ChanBroker) ChanBroker.RegSub = make(chan Subscriber) ChanBroker.UnRegSub = make(chan Subscriber) ChanBroker.Contents = make(chan Content) ChanBroker.Stop = make(chan bool) ChanBroker.exit = false ChanBroker.Subscribers = make(map[Subscriber]bool) ChanBroker.timeout = timeout ChanBroker.run() return ChanBroker } func (self *ChanBroker) run() { go func() { // Broker goroutine for { select { case content := \u0026lt;-self.Contents: go func() { // Pusher goroutine self.lock.RLock() for sub := range self.Subscribers { select { case sub \u0026lt;- content: case \u0026lt;-time.After(self.timeout): fmt.Println(sub, \u0026#34;time out \u0026#34;) } } self.lock.RUnlock() }() case sub := \u0026lt;-self.RegSub: self.lock.Lock() self.Subscribers[sub] = true self.lock.Unlock() case sub := \u0026lt;-self.UnRegSub: self.lock.Lock() delete(self.Subscribers, sub) self.lock.Unlock() close(sub) // may be close of closed channel case \u0026lt;-self.Stop: if self.exit == false { self.exit = true close(self.Stop) self.lock.Lock() for sub := range self.Subscribers { delete(self.Subscribers, sub) // 必须先删除再close close(sub) } self.lock.Unlock() return // exit goroutine } } } }() } func (self *ChanBroker) RegSubscriber(size uint) Subscriber { if self.exit == true { return nil } sub := make(Subscriber, size) self.RegSub \u0026lt;- sub // maybe block return sub } func (self *ChanBroker) UnRegSubscriber(sub Subscriber) { if self.exit == true { return } self.UnRegSub \u0026lt;- sub // maybe block } func (self *ChanBroker) StopPublish() { if self.exit == true { return } self.Stop \u0026lt;- true // maybe panic } func (self *ChanBroker) PubContent(c Content) { self.Contents \u0026lt;- c // maybe block } 存在以下问题，具体如下：\n问题1：存在 panic:close of closed channel的风险 问题描述：\n如果Subscriber goroutine两次调用UnRegSubscriber，就会发生close of closed channel，导致panic\n相应代码如下：\n1 2 3 4 5 case sub := \u0026lt;-self.UnRegSub: self.lock.Lock() delete(self.Subscribers, sub) self.lock.Unlock() close(sub) // may be close of closed channel 解决思路：\n很简单，关闭前检查Subscriber对应channel是否订阅map当中，代码如下：\n1 2 3 4 5 6 7 8 case sub := \u0026lt;-self.UnRegSub: self.lock.Lock() _, ok := self.Subscribers[sub] if ok { delete(self.Subscribers, sub) close(sub) } self.lock.Unlock() 问题2：不靠谱的exit标记 问题描述：\nexit标记不能同步goroutines对Stop通道的写操作与关闭操作，具体分析如下：\n写操作代码如下：\n1 2 3 4 5 6 7 8 func (self *ChanBroker) RegSubscriber(size uint) Subscriber { if self.exit == true { return nil } sub := make(Subscriber, size) self.RegSub \u0026lt;- sub // maybe block return sub } 关闭操作代码段如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 case \u0026lt;-self.Stop: if self.exit == false { self.exit = true close(self.Stop) self.lock.Lock() for sub := range self.Subscribers { delete(self.Subscribers, sub) // 必须先删除再close close(sub) } self.lock.Unlock() return // exit goroutine } 在多核多个goroutine并发情况，极小概率会发生如下情况：\n某同一个时刻，CPU0 运行RegSubscriber goroutine检查exit标记为false，CPU0继续运行，CPU1运行到关闭操作代码段第1行，继续运行 CPU0 继续运行RegSubscriber goroutine，直到阻塞在第6行, 切换运行其他goroutine，CPU 1 关闭Stop Channel,并退出broken goroutine CPU0 继续运行其他goroutine，RegSubscriber goroutine一直阻塞在第6行,等待 broken goroutine 读Stop channel CPU0 继续执行其他goroutine，RegSubscriber goroutine一直阻塞在第6行，,等待 broken goroutine 读Stop channel CPU0 继续执行其他goroutine，RegSubscriber goroutine一直阻塞在第6行，,等待 broken goroutine 读Stop channel \u0026hellip; 解决思路：\n不用exit标记了，将状态关联到Stop Channel状态上（这又掉到另一个坑里）\n问题3：不能保证Subscribers有序的接收消息 问题描述：\n版本2中每接收一个Content都会启动一个Push goroutine,这些Push goroutine执行是无序执行的，有序的内容推送需求遇上了无序的goroutine，自然有问题了\n解决思路：\n方案1：无序推送，由Content自身加上序号，同时由各个Subscriber处理逻辑根据序号保证有序处理Content\n方案2：每一个Subcriber有一个Content队列，保证有序推送，简化各个Subscriber处理逻辑，具体实现见版本5\n版本3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 package ChanBroker import ( \u0026#34;errors\u0026#34; \u0026#34;fmt\u0026#34; \u0026#34;sync\u0026#34; \u0026#34;time\u0026#34; ) type Content interface{} type Subscriber chan Content type ChanBroker struct { RegSub chan Subscriber UnRegSub chan Subscriber Contents chan Content Stop chan bool exit bool Subscribers map[Subscriber]bool lock sync.RWMutex timeout time.Duration } var errBrokerExit error = errors.New(\u0026#34;Broker exit\u0026#34;) var errTimeOut error = errors.New(\u0026#34;Time out\u0026#34;) func NewChanBroker(timeout time.Duration) *ChanBroker { ChanBroker := new(ChanBroker) ChanBroker.RegSub = make(chan Subscriber) ChanBroker.UnRegSub = make(chan Subscriber) ChanBroker.Contents = make(chan Content) ChanBroker.Stop = make(chan bool) ChanBroker.exit = false ChanBroker.Subscribers = make(map[Subscriber]bool) ChanBroker.timeout = timeout ChanBroker.run() return ChanBroker } func (self *ChanBroker) run() { go func() { for { select { case content := \u0026lt;-self.Contents: go func() { self.lock.RLock() for sub := range self.Subscribers { select { case sub \u0026lt;- content: case \u0026lt;-time.After(self.timeout): fmt.Println(sub, \u0026#34;time out \u0026#34;) } } self.lock.RUnlock() }() case sub := \u0026lt;-self.RegSub: self.lock.Lock() self.Subscribers[sub] = true self.lock.Unlock() case sub := \u0026lt;-self.UnRegSub: self.lock.Lock() _, ok := self.Subscribers[sub] if ok { delete(self.Subscribers, sub) close(sub) } self.lock.Unlock() case \u0026lt;-self.Stop: close(self.Stop) self.lock.Lock() for sub := range self.Subscribers { delete(self.Subscribers, sub) close(sub) } self.lock.Unlock() return // exit goroutine } } }() } func (self *ChanBroker) RegSubscriber(size uint) (Subscriber, error) { select { case _, ok := \u0026lt;-self.Stop: if ok == false { return nil, errBrokerExit } else { sub := make(Subscriber, size) self.RegSub \u0026lt;- sub return sub, nil } case \u0026lt;-time.After(self.timeout): return nil, errTimeOut default: sub := make(Subscriber, size) self.RegSub \u0026lt;- sub return sub, nil } } func (self *ChanBroker) UnRegSubscriber(sub Subscriber) { select { case _, ok := \u0026lt;-self.Stop: if ok == false { return } else { self.UnRegSub \u0026lt;- sub return } case \u0026lt;-time.After(self.timeout): return default: self.UnRegSub \u0026lt;- sub return } } func (self *ChanBroker) StopPublish() { select { case _, ok := \u0026lt;-self.Stop: if ok == false { return } else { self.Stop \u0026lt;- true return } default: self.Stop \u0026lt;- true return } } func (self *ChanBroker) PubContent(c Content) error { select { case _, ok := \u0026lt;-self.Stop: if ok == false { return errBrokerExit } else { self.Contents \u0026lt;- c return nil } case \u0026lt;-time.After(self.timeout): return errTimeOut default: self.Contents \u0026lt;- c return nil } } 存在以下问题，具体如下：\n问题1： 读channel出现错误的竞争 问题描述：\n版本3的一个错误的方案选择，导致Stop Channel出现读竞争，导致不能停止发布，出现goroutine leak，分析如下：\nStop Channel 只会写一次 Stop Channel 却有多个读goroutine 基于上面有情况，并不能保证Broker goroutine 能收到停止发布的信息，如果被其他goroutine收到，导致Broker goroutine收不到结束消息，进而不能关闭所有Subscriber，导致所有Subscriber goroutine泄露 解决思路：\n版本3引入关闭状态是一个错误的设计，引入状态，也就引入对依赖状态的对象，增加了代码的复杂性，状态的维护容易导致bug，在设计与代码应当追求无状态设计（好处多多）, 这里采用超时来解决，如果超时用由调用者确定处理策略\n版本4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 package ChanBroker import ( \u0026#34;errors\u0026#34; \u0026#34;fmt\u0026#34; \u0026#34;sync\u0026#34; \u0026#34;time\u0026#34; ) type Content interface{} type Subscriber chan Content type ChanBroker struct { RegSub chan Subscriber UnRegSub chan Subscriber Contents chan Content Stop chan bool exit bool Subscribers map[Subscriber]bool lock sync.RWMutex timeout time.Duration } var errBrokerExit error = errors.New(\u0026#34;ChanBroker exit\u0026#34;) var errTimeOut error = errors.New(\u0026#34;ChanBroker Time out\u0026#34;) func NewChanBroker(timeout time.Duration) *ChanBroker { ChanBroker := new(ChanBroker) ChanBroker.RegSub = make(chan Subscriber) ChanBroker.UnRegSub = make(chan Subscriber) ChanBroker.Contents = make(chan Content) ChanBroker.Stop = make(chan bool) ChanBroker.exit = false ChanBroker.Subscribers = make(map[Subscriber]bool) ChanBroker.timeout = timeout ChanBroker.run() return ChanBroker } func (self *ChanBroker) run() { go func() { for { select { case content := \u0026lt;-self.Contents: go func() { self.lock.RLock() for sub := range self.Subscribers { select { case sub \u0026lt;- content: case \u0026lt;-time.After(self.timeout): fmt.Println(sub, \u0026#34;time out \u0026#34;) } } self.lock.RUnlock() }() case sub := \u0026lt;-self.RegSub: self.lock.Lock() self.Subscribers[sub] = true self.lock.Unlock() case sub := \u0026lt;-self.UnRegSub: self.lock.Lock() _, ok := self.Subscribers[sub] if ok { delete(self.Subscribers, sub) close(sub) } self.lock.Unlock() case \u0026lt;-self.Stop: // close(self.Stop) self.lock.Lock() for sub := range self.Subscribers { delete(self.Subscribers, sub) close(sub) } self.lock.Unlock() return // exit goroutine } } }() } func (self *ChanBroker) RegSubscriber(size uint) (Subscriber, error) { sub := make(Subscriber, size) select { case \u0026lt;-time.After(self.timeout): return nil, errTimeOut case self.RegSub \u0026lt;- sub: return sub, nil } } func (self *ChanBroker) UnRegSubscriber(sub Subscriber) { select { case \u0026lt;-time.After(self.timeout): return case self.UnRegSub \u0026lt;- sub: return } } func (self *ChanBroker) StopPublish() error { select { case self.Stop \u0026lt;- true: return nil case \u0026lt;-time.After(self.timeout): return errTimeOut } } func (self *ChanBroker) PubContent(c Content) error { select { case \u0026lt;-time.After(self.timeout): return errTimeOut case self.Contents \u0026lt;- c: return nil } } 存在以下问题，具体如下：\n问题1：timeout问题 问题描述：\ntimeout 导致长时间持有读锁 timeout 导致消息丢失，并没有推送成功 上一个Subscriber超时影响后面Subscriber内容的实时性 解决方案：\n采用select实现channel非阻塞写 对于非阻塞写失败，加入Subscriber对应的链表 非阻塞写保证避免Subscribers之间相互影响 问题2：锁问题 问题描述：\n每个Pusher goroutine持有读锁，一定情况下会成为性能的瓶颈 解决方案：\n在上面避免阻塞的基础上，只有一个goroutine来推送内容 版本5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 package ChanBroker import ( \u0026#34;container/list\u0026#34; \u0026#34;errors\u0026#34; \u0026#34;time\u0026#34; ) type Content interface{} type Subscriber chan Content type ChanBroker struct { regSub chan Subscriber unRegSub chan Subscriber contents chan Content stop chan bool subscribers map[Subscriber]*list.List timeout time.Duration cachenum uint timerChan \u0026lt;-chan time.Time } var ErrBrokerExit error = errors.New(\u0026#34;ChanBroker exit\u0026#34;) var ErrPublishTimeOut error = errors.New(\u0026#34;ChanBroker Pulish Time out\u0026#34;) var ErrRegTimeOut error = errors.New(\u0026#34;ChanBroker Reg Time out\u0026#34;) var ErrStopPublishTimeOut error = errors.New(\u0026#34;ChanBroker Stop Publish Time out\u0026#34;) func NewChanBroker(timeout time.Duration) *ChanBroker { Broker := new(ChanBroker) Broker.regSub = make(chan Subscriber) Broker.unRegSub = make(chan Subscriber) Broker.contents = make(chan Content) Broker.stop = make(chan bool, 1) Broker.subscribers = make(map[Subscriber]*list.List) Broker.timeout = timeout Broker.cachenum = 0 Broker.timerChan = nil Broker.run() return Broker } func (self *ChanBroker) onContentPush(content Content) { for sub, clist := range self.subscribers { loop := true for next := clist.Front(); next != nil \u0026amp;\u0026amp; loop == true; { cur := next next = cur.Next() select { case sub \u0026lt;- cur.Value: if self.cachenum \u0026gt; 0 { self.cachenum-- } clist.Remove(cur) default: loop = false } } len := clist.Len() if len == 0 { select { case sub \u0026lt;- content: default: clist.PushBack(content) self.cachenum++ } } else { clist.PushBack(content) self.cachenum++ } } if self.cachenum \u0026gt; 0 \u0026amp;\u0026amp; self.timerChan == nil { timer := time.NewTimer(self.timeout) self.timerChan = timer.C } } func (self *ChanBroker) onTimerPush() { for sub, clist := range self.subscribers { loop := true for next := clist.Front(); next != nil \u0026amp;\u0026amp; loop == true; { cur := next next = cur.Next() select { case sub \u0026lt;- cur.Value: if self.cachenum \u0026gt; 0 { self.cachenum-- } clist.Remove(cur) default: loop = false } } } if self.cachenum \u0026gt; 0 { timer := time.NewTimer(self.timeout) self.timerChan = timer.C } else { self.timerChan = nil } } func (self *ChanBroker) run() { go func() { // Broker Goroutine for { select { case content := \u0026lt;-self.contents: self.onContentPush(content) case \u0026lt;-self.timerChan: self.onTimerPush() case sub := \u0026lt;-self.regSub: clist := list.New() self.subscribers[sub] = clist case sub := \u0026lt;-self.unRegSub: _, ok := self.subscribers[sub] if ok { delete(self.subscribers, sub) close(sub) } case _, ok := \u0026lt;-self.stop: if ok == true { close(self.stop) } else { if self.cachenum == 0 { return } } self.onTimerPush() for sub, clist := range self.subscribers { if clist.Len() == 0 { delete(self.subscribers, sub) close(sub) } } } } }() } func (self *ChanBroker) RegSubscriber(size uint) (Subscriber, error) { sub := make(Subscriber, size) select { case \u0026lt;-time.After(self.timeout): return nil, ErrRegTimeOut case self.regSub \u0026lt;- sub: return sub, nil } } func (self *ChanBroker) UnRegSubscriber(sub Subscriber) { select { case \u0026lt;-time.After(self.timeout): return case self.unRegSub \u0026lt;- sub: return } } func (self *ChanBroker) StopPublish() error { select { case self.stop \u0026lt;- true: return nil case \u0026lt;-time.After(self.timeout): return ErrStopPublishTimeOut } } func (self *ChanBroker) PubContent(c Content) error { select { case \u0026lt;-time.After(self.timeout): return ErrPublishTimeOut case self.contents \u0026lt;- c: return nil } } 存在以下问题，具体如下：\n问题1：不支持扩展 问题描述：\n在一个Broker goroutine内完成注册与去注册以及内容发布推送给Subscriber，无法控制Subscriber数量，且不支持扩展\n解决思路：\n业务场景：chanbroker是进程内goroutines之间pub-sub通信方式一种实现方案，一个goroutine占用一个核来处理能满足绝太多数需求 即使不能满足极个别需求，也可以选择创建多个ChanBroker来实现扩展 channel编程总结 避免Panic，参考Go channel 特点篇 最大程度保证非阻塞 若非业务需要，避免channel之间读写竞争 channel使用很灵活，也容易出错，建议多在设计上下功夫，分解问题采用简单的模型来解决问题 避免多余的channel状态引入,例如关闭channel 要有并发意识，由代码想到goroutine的运行 禁止通道复用，避免复用带来的复杂性 初期测试很重要，而且应作到充分测试 Don\u0026rsquo;t communicate by sharing memory, share memory by communicating 由于个人水平有限，有什么不足与错误，敬请指正！\n","permalink":"https://myself659.github.io/post/golang/2016-08-20-go-channel-program-demo/","summary":"\u003cp\u003e本篇以\u003ca href=\"https://github.com/myself659/ChanBroker\"\u003eChanBroker\u003c/a\u003e版本迭代过程，总结常见Channel编程问题\u003c/p\u003e\n\u003ch3 id=\"简介\"\u003e简介\u003c/h3\u003e\n\u003cp\u003eChanBroker设计主要参考Kafka模型，主要提供进程内goroutine之间通信，实现以下功能：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e支持多个Publisher发布内容\u003c/li\u003e\n\u003cli\u003e支持Subscriber注册与去注册订阅\u003c/li\u003e\n\u003cli\u003e发布内容可以是任何形式\u003c/li\u003e\n\u003cli\u003eChanBroker根据订阅情况完成内容推送\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"版本1\"\u003e版本1\u003c/h3\u003e\n\u003cp\u003e具体代码如下:\u003c/p\u003e","title":"Go channel 编程篇"},{"content":"这篇具体写一下用户在线状态系统的具体设计。\n后端架构 这个后端系统设计如下图：\n很大众，国内基本都这么干，不多说\n用户状态系统设计 初期设计 单IDC部署，设计如下:\n相关说明 AG：接入网关，负责用户的连接 ConnRouter：连接路由服务器，主要提供以下功能： 所有用户状态的维护 用户状态查询 用户状态推送 用户状态同步 异步消息路由与转发 状态通知流: 用户登录成功或者下线状态通知 状态同步流：ConnRouter服务器之间用户状态的同步，不需要推送给订阅者 用户消息流: 异步发送给用户的消息在服务器内部的传输 设计要点 参考Kafka的模型，将用户状态改变作为事件，将事件描述为消息，将消息队列化成消息队列 AG对应Kafka中的Producer角色，主要原因是用户状态是用户连接的影子，AG能真实快速感知用户状态 ConnRouter对应Kafka中的Broker UserStat（用户统计与分析）与StateNotify（用户状态通知）对应Kafka中的Consumer 减少耦合，以异步发送消息到用户为例，整个流程三步走： 第一步：生成发送消息，发送到ConnRouter 第二步：根据目的用户ID，查找到出口AG，将消息转发到出口AG 第三步：出口AG查找用户连接，通过连接发送到目的用户 ConnRouter设计 用户状态数据存储设计 用户状态数据存储设计，如下图所示：\n内存消耗 主要内存消耗来自用户状态数组（与ConnRouter连接都是长连接，可以忽略不计） 每种客户端类型下每个用户占用一个1Byte，那么1G内存可以存1073741824个用户的状态，超过了10亿，支持亿级用户内存不是瓶颈 查找用户所在AG与状态O(1) 高可用性 服务器级Master-Master模式 根据用户ID选择ConnRouter Master实现用户级Master-Standby模式 高性能 epoll事件驱动 无锁数据访问 流程无阻塞 O(1)查找 多核并发 支持批量处理 支持Failover，方便升级 当ConnRouter宕机或者主动升级重启时，各AG重新建立连接时，将自身的用户状态同步到ConnRouter，完成用户状态数据恢复 无状态与单点自治 ConnRouter用户状态数据是各个AG的同步，真正用户状态保存在AG网关 单点可以独立工作 数据冲突处理 主要是一个数据优先级的原则（根据数据源，从高到低）：\n状态数据来自AG 状态数据来自ConnRouter-Master 状态数据来自ConnRouter-Standby 状态数据来自RouterProxy 支持多IDC 保证更高可用性，需要支持多机房部署，实现两城三中心甚至更多节点异地多活，具体设计如下图：\n这里主要是引入了RouterProxy，将跨IDC ConnRouter连接起来，其中RouterProxy主要功能如下：\n作为Producer同步状态通知到其他IDC RouterProxy 作为Comsumer接收同步状态发布到本IDC的ConnRouter 作为IDC间消息转发的网关 ConnRouter扩展 随着用户量增长，ConnRouter转发消息量，状态通知量，消息转发量都会不断增长，当然可以简单采用更好机器来scale up;下面是考虑进行业务拆分方式进行scale out，具体设计如下图： 从上图可知主要方案：\n将异步消息转发业务拆分出来由Forward服务器来完成 将RouterProxy跨IDC消息转发业务拆分出来，由ForwardProxy服务器来完成 不足与应对 需要优化跨IDC间消息同步与转发流量 在大量用户且系统中存在多个状态维护服务器，这样会有大量的状态同步通信，服务器的网络与CPU易成为瓶颈 这时候就考虑将用户状态进行拆分，不将用户状态放到同一个服务器上维护，采用以下方式进行用户状态数据划分： 哈希方式 用户ID范围 按用户量划分 一致性hash 后记 方案可以有很多种，觉得引入直接引入Kafka是一个很好的选择，以后再研究。\n由于个人水平有限，有什么不足与错误，敬请指正！\n","permalink":"https://myself659.github.io/post/arch/2016-08-05-im-user-state/","summary":"\u003cp\u003e这篇具体写一下用户在线状态系统的具体设计。\u003c/p\u003e\n\u003ch2 id=\"后端架构\"\u003e后端架构\u003c/h2\u003e\n\u003cp\u003e这个后端系统设计如下图：\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"基础架构\" loading=\"lazy\" src=\"/images/im-arch.png\"\u003e\u003c/p\u003e\n\u003cp\u003e很大众，国内基本都这么干，不多说\u003c/p\u003e\n\u003ch2 id=\"用户状态系统设计\"\u003e用户状态系统设计\u003c/h2\u003e\n\u003ch3 id=\"初期设计\"\u003e初期设计\u003c/h3\u003e\n\u003cp\u003e单IDC部署，设计如下:\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"用户状态系统设计-1\" loading=\"lazy\" src=\"/images/user-state-flow-1.png\"\u003e\u003c/p\u003e\n\u003ch4 id=\"相关说明\"\u003e相关说明\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003eAG：接入网关，负责用户的连接\u003c/li\u003e\n\u003cli\u003eConnRouter：连接路由服务器，主要提供以下功能：\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003e所有用户状态的维护\u003c/li\u003e\n\u003cli\u003e用户状态查询\u003c/li\u003e\n\u003cli\u003e用户状态推送\u003c/li\u003e\n\u003cli\u003e用户状态同步\u003c/li\u003e\n\u003cli\u003e异步消息路由与转发\u003c/li\u003e\n\u003c/ul\u003e\n\u003col start=\"3\"\u003e\n\u003cli\u003e状态通知流: 用户登录成功或者下线状态通知\u003c/li\u003e\n\u003cli\u003e状态同步流：ConnRouter服务器之间用户状态的同步，不需要推送给订阅者\u003c/li\u003e\n\u003cli\u003e用户消息流: 异步发送给用户的消息在服务器内部的传输\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"设计要点\"\u003e设计要点\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e参考Kafka的模型，将用户状态改变作为事件，将事件描述为消息，将消息队列化成消息队列\u003c/li\u003e\n\u003cli\u003eAG对应Kafka中的Producer角色，主要原因是\u003cstrong\u003e用户状态是用户连接的影子\u003c/strong\u003e，AG能真实快速感知用户状态\u003c/li\u003e\n\u003cli\u003eConnRouter对应Kafka中的Broker\u003c/li\u003e\n\u003cli\u003eUserStat（用户统计与分析）与StateNotify（用户状态通知）对应Kafka中的Consumer\u003c/li\u003e\n\u003cli\u003e减少耦合，以异步发送消息到用户为例，整个流程三步走：\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003e第一步：生成发送消息，发送到ConnRouter\u003c/li\u003e\n\u003cli\u003e第二步：根据目的用户ID，查找到出口AG，将消息转发到出口AG\u003c/li\u003e\n\u003cli\u003e第三步：出口AG查找用户连接，通过连接发送到目的用户\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"connrouter设计\"\u003eConnRouter设计\u003c/h4\u003e\n\u003ch5 id=\"用户状态数据存储设计\"\u003e用户状态数据存储设计\u003c/h5\u003e\n\u003cp\u003e用户状态数据存储设计，如下图所示：\u003c/p\u003e","title":"IM后端系统设计总结(2)"},{"content":"定义IM 为用户提供即时消息服务，这里面有三个关键词：用户，消息，服务；下面根据三个关键词来展开总结，先从消息开始。\n消息 消息分类 对消息分类，很简单但是重要，方便后面业务的拆分。\n注册 登录 用户信息 聊天消息 群组 好友 文件 版本 内部服务器之间消息 客户端诊断 其他业务消息 信息语义描述 在互联网和移动互联网时代常见有以下几种方式：\nXML 文本 MQTT 自定义二进制（这里一般默认为google protobuf） 这四种类型比较如下表所示：\n比较项 XML 文本 MQTT 自定义二进制 可读性 好 好 差 差 通用性 标准协议，易通用 支持通用http协议，也可自定义 通用标准协议 私有协议，无法通用 扩展性 易扩展，支持第三方 易扩展 可扩展 仅协议可扩展，不支持第三方 流量消耗 极大 大 小 小 处理效率 低 一般 高 高 网络适应性 差 一般 较好 较好 业内应用 新浪微博/GTalk MSN facebook messenger QQ/weixin 再补充说一点，采用二进制协议，在网络带宽及消息存储方面可以节约成本，特别用户量达到千万级以上\n参考业内应用和移动互联网需求，二进制协议应该是不二选择。这里强烈推荐google protobuf，理由如下：\n亲爹是google 支持多种编程语言(C++, JAVA, PYTHON, GO，PHP,C#)，支持多种平台 自定义且灵活 支持数据压缩 完整的技术生态，以及多年的应用实践 消息可扩展性 自定义二进制消息（google protobuf）可扩展性方面的一些经验：\n采用T(ype)L(ength)V(alue) 数据结构中的成员不要使用变长数据类型，例如long，在32位系统中占4Bytes，在64位系统占用8Bytes 不删除消息体的数据成员 消息类型递增，不删除消息类型，即使不再使用也保留 消息头带上版本号，客户端无需要关心版本变化，由服务器完成不同版本的兼容适配处理 消息头与消息体的设计统一管理，不允许任何人私自修改 除非确定，protobuf消息字段尽量使用optional，由代码逻辑确定是否需要相应字段 考虑业务需求与变化，为未来留有应对变化的空间，同时保证消息的简洁 消息存储 初期简单点，采用mysql，同时利用mysql主备部署解决单点故障问题，分布式存储后面再说了，针对大量的消息存储后面考虑 对用户之间的聊天消息分表 对群信息等利用redis缓存 对于热点数据可以直接加载到内存 消息转发 消息从用户到用户（单播） 消息从用户到服务器 （单播） 消息从用户到群组 （组播） 消息从服务器到用户（单播） 消息从服务器到群组（组播） 消息传输 相对于PC互联网情况下，移动互联网情况下，丢包概率高，传输延迟大，问题自然就比较多，这方面优化请参考手机QQ的移动网络实践之路\n消息安全 防修改 消息检查或校验 防窃听 消息加密 防泄漏 系统防入侵，系统加固 防丢失 消息请求与回应机制，消息重传与幂等性 防损坏 多副本，分布式存储 防伪装 身份验证，签名 消息描述 消息由消息头和消息体组成，消息头参考如下：\n1 2 3 4 5 6 7 8 9 10 11 #pragma pack(1) typedef struct { uint16_t type; // msg type uint16_t length; // the whole pdu length uint32_t version; // pdu version number uint32_t magic; // magic number uint32_t reserve; //后面为消息体 } UserPduHeader_t; #pragma pack() 后记 由于个人水平有限，有什么不足与错误，敬请指正！\n","permalink":"https://myself659.github.io/post/arch/2016-07-29-im-message/","summary":"\u003ch3 id=\"定义im\"\u003e定义IM\u003c/h3\u003e\n\u003cp\u003e为用户提供即时消息服务，这里面有三个关键词：用户，消息，服务；下面根据三个关键词来展开总结，先从消息开始。\u003c/p\u003e\n\u003ch3 id=\"消息\"\u003e消息\u003c/h3\u003e\n\u003ch4 id=\"消息分类\"\u003e消息分类\u003c/h4\u003e\n\u003cp\u003e对消息分类，很简单但是重要，方便后面业务的拆分。\u003c/p\u003e","title":"IM后端系统设计总结(1)"},{"content":"channel模式 根据同步方式不同，channel有两种模式：\n1、同步模式,形式如下：\n1 ch := make(chan int) 2、队列模式，形式如下：\n1 ch := make(chan int, 10) 根据数据方向流不同，channel类型可以有以下三种模式：\n写操作模式（只发送） 读操作模式（只接收） 读写操作模式（不限发送与接收） channel操作 channel有以下操作：\n创建 关闭 写(发送)操作 读(接收)操作 这些操作都是原子操作\nchannel状态 根据模式与操作，channel有以下状态：\n同步写阻塞 同步读阻塞 关闭状态 队列写阻塞 队列读阻塞 队列可读写 nil状态 channel状态与操作之间关系 状态/操作 写操作 读操作 关闭 创建 nil状态 写阻塞 读阻塞 产生panic(close of nil channel) - 同步写阻塞 写阻塞 成功读取数据 进入关闭状态，产生panic - 同步读阻塞 成功写入数据 读阻塞 进入关闭状态 - 关闭状态 产生panic 立即返回(nil，false) 产生panic - 队列写阻塞 写阻塞 成功读取队列中数据 进入关闭状态，成功写入队列的数据可读 - 队列读阻塞 成功写入数据 读阻塞 进入关闭状态 - 队列可读写 成功写入数据 成功读取数据 进入关闭状态，成功写入队列的数据可读 - 由于个人水平有限，有什么不足与错误，敬请指正！\n","permalink":"https://myself659.github.io/post/golang/2016-07-26-go-channel-feature/","summary":"\u003ch3 id=\"channel模式\"\u003echannel模式\u003c/h3\u003e\n\u003cp\u003e根据同步方式不同，channel有两种模式：\u003c/p\u003e\n\u003cp\u003e1、同步模式,形式如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ech := make(chan int)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e2、队列模式，形式如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ech := make(chan int, 10)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e根据数据方向流不同，channel类型可以有以下三种模式：\u003c/p\u003e","title":"Go channel 特点篇"},{"content":"定义 在计算机编程领域有一个对代码的定义：\n代码 = 数据结构 + 算法。\n参考这个定义，对知识进行一个定义如下：\n知识 = 概念 + 连接\n概念 概念对就英文单词是concept。在维基百科中,concept的定义是:\nA concept is an abstract idea or a mental symbol, sometimes defined as a \u0026ldquo;unit of knowledge\u0026rdquo;, built from other elements called \u0026ldquo;conceptions\u0026rdquo; that represent objects, events or other perceptible phenomena. Concepts are used to classify individual items into categories, and relate those categories to each other. They are essential tools used by the human mind to comprehend the world.\n翻译中文：\n概念是一种抽象的思想或心智符号,有时被定义为“知识单位”,由其他称为“概念”的要素构建,代表对象、事件或其他可感知的现象。概念用来将个别项目分类并将这些类别彼此关联。它们是人类思维理解世界的基本工具。\n在此定义中,重点表述了以下几个方面:\n概念是一种抽象的心智活动,代表我们对某个事物或现象的理解。\n概念由更基本的“概念”构成,它是知识的组成单位。\n概念用来对事物进行分类和关联,组织我们的知识体系。\n概念是人类理解这个世界的基本工具,它构成认知的基石。\n概念可以代表对象、事件或其他可感知的事物。它起到一个符号的作用。\n总之，概念是人类认知过程中最基本的单元,它代表某个事物或事件的特征和意义。概念属于心智层面,用以组织和理解知识,促进认知,它具有抽象、符号和工具等特征。\n连接 概念加上各种连接就是知识。\n下面看一下概念之间最基本的连接方式，具体如下：\n包含关系:A包含B,B属于A的一种类型或实例。如“生物”包含“人”这个概念。 相互依存:A和B相互依存,一个概念的存在依赖另一个概念。如“买方”和“卖方”的概念。 相反关系:A和B在某个属性上相反或对立。如“高”和“低”的概念。 相似关系:A和B在某个属性或特征上相似。如“开心”和“高兴”的概念。 联想关系:A和B两个原本独立的概念,通过某种逻辑联想在一起。如“铅笔”和“书”的概念通过“写作”行为产生联想。 整体-部分关系:A是B的整体,B是A的部分。如“脸”和“眼睛”的概念。 事物-特征关系:A是事物,B是事物A所具有的特征或属性。如“苹果”是事物,“红色”和“圆形”是苹果的特征。 实例-类型关系:A是某个类型或类别,B属于该类型的具体实例。如“水果”是类型,“苹果”和“香蕉”是实例。 手段-目的关系:A是实现B的手段或方法。如“锄头”的概念是实现“锄地”这个目的的手段。 原因-结果关系:A的存在或发生导致B的存在或发生。如“下雨”是导致“地面湿滑”的原因。 时间关系：先进行A，再进行B。如先“连接电源”，再“开机启动”。 从属关系：A拥有B。如富豪有兰博基尼汽车。 供需关系：A是需求方，B是供应方。如消费者与生产者。 链接关系：A会链接B。如互联网的链接，一个关键词会链接到一个网页。 总结 知识 = 概念 + 连接\n连接越多的概念越重要。\n越在底层的概念越重要。\n一个知识点包含的概念与连接越多越复杂。\n对于一个知识点的概念与连接越清楚就会越理解它。\n学习知识的重点，先从核心概念开始，理解核心概念，然后理清核心概念之间的核心连接。\n好的知识的概念连接图一定是充满美感的。\n","permalink":"https://myself659.github.io/post/learn/%E7%9F%A5%E8%AF%86+%E6%A6%82%E5%BF%B5+%E8%BF%9E%E6%8E%A5/","summary":"\u003ch2 id=\"定义\"\u003e定义\u003c/h2\u003e\n\u003cp\u003e在计算机编程领域有一个对代码的定义：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e代码  = 数据结构 + 算法。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e参考这个定义，对知识进行一个定义如下：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e知识 = 概念 + 连接\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"概念\"\u003e概念\u003c/h2\u003e\n\u003cp\u003e概念对就英文单词是concept。在维基百科中,concept的定义是:\u003c/p\u003e","title":"知识 = 概念 + 连接"},{"content":"背景 人们常说：\n万事开头难。\n好的开始是成功的一半。\n开始是基础。\n“Starting is the first step towards achieving anything. Don’t wait for the perfect moment; make this moment perfect by taking action.”\n“The secret of getting ahead is getting started. The secret of getting started is breaking your complex overwhelming tasks into small manageable tasks, and starting on the first one.” — Mark Twain\n从上可知开始很难，但是开始却很重要。\n为什么是开始行动 行动是实践。\n行动是执行力的体现。\n行动是真正的学习（纸上得来终觉浅，绝知此事要躬行）。\n行动是知行合一的关键（我们懂了很多道理，却依然过不好这一生）。\n所以开始行动是启动实践第一步。\n所以开始行动是打造执行力。\n所以开始行动是开始学习。\n所以开始行动是追求知行合一。\n如何开始行动 思考先行 行动之前先思考：\nwhat 做什么行动？ why 为什么要行动？ who 与谁一起行动？ when 什么时候行动？ where 在哪行动？ how 怎么行动？ 准备 不打没有准备的仗，行动之前一定要做好准备，但是也不存在100%准备好。如果做什么事情都需要100%准备好，那么你将不会开始做任何事情，因为你会一直在准备。\n准备是不可少，但不过度准备。\n开始Tips 尽量早开始\n从容易的开始，从小的开始，从最基础的开始，从能完成的开始\n为开始建立触发器Trigger\n降低开始的难度\n为开始建立shortcut\n利用习惯开始\n为开始建立势头Momentum，利用势头开始\n自动化开始\n为开始设置deadline\n有意识地主动开始\n挑战5分钟的不舒服\n开始行动吧 凡事只有开始行动,才有可能。\n凡事只有开始行动,才有收获。\n凡事只有开始行动,才有进步。\n开始行动吧,让过去不再成为遗憾,让将来不再成为憧憬，让现在不再迷茫，让自己享受当下。\n","permalink":"https://myself659.github.io/post/done/how-to-start-%E5%BC%80%E5%A7%8B/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e人们常说：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e万事开头难。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e好的开始是成功的一半。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e开始是基础。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003e“Starting is the first step towards achieving anything. Don’t wait for the perfect moment; make this moment perfect by taking action.”\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e“The secret of getting ahead is getting started. The secret of getting started is breaking your complex overwhelming tasks into small manageable tasks, and starting on the first one.” — Mark Twain\u003c/p\u003e","title":"如何开始行动"},{"content":"前言 亚马逊在2006年3月14日发布AWS，到现在差不多10年了。回首过去的10年里，我们在构建 安全，高可用性，可扩展性，低成本的服务方面积累了几百条经验与教训。 由于AWS是建设并在全球运营这些服务的先驱，这些教训对我们的业务至关重要。正如我们以前多次说，“没有压缩经验的算法”，每月有超过百万的活跃客户，这些客户服务几个亿的用户，在这个过程我们不乏机会积累经验并持续优化从而为客户提供更好的服务。\n我选择了下面这些经验教训，与大家分享，希望它们对你们有用。\n1. 构建不断进化的系统 几乎从第一天开始,我们知道自己开发的软件在一年后将不会继续运行。我们需要重新审视和改进架构，以确保我们可以解决订单规模增长一到二个数量级所带来的问题。但是我们不能采取停电检修这种旧方法升级系统，这是因为遍布世界各地的海量业务需要我们的平台提供7*24小时高可用性服务。我们需要建立这样架构：能够在不停止服务的情况下引入新的组件。Marvin Theimer,亚马逊杰出工程师，曾开玩笑地说，亚马逊S3的演变可以被描述为从当初的单引擎飞机，随着时间的推移飞机不断升级，先是升级到737，然后是一组747，现在成了3805的空中舰队。在此期间，我们在飞行过程中完成加油，而客户甚至没有觉察到这一点。\n感悟： 唯有变化才是确定，系统应该保证灵活性与扩展性。云计算系统是需要不断进化，开发人员也需要不断进化\n2. 总有想不到的 异常总是会发生的，随着时间的推移，一切都会出现异常：从路由器到硬盘，从操作系统到内存单元，从瞬态错误到永久性故障。无论你使用的是最高品质的硬件或最低成本的硬件，这些总是会发生的。在大规模系统中更是如此，例如，在S3中处理和存储的万亿交易，任何异常，即使是最小的可能性也将成为现实。部分这样的异常可以事先预见的，但更多的异常却在设计和开发过程中未能被发现。\n我们需要开发一个视异常为常态的系统，即使我们不知道会有什么样的异常。即使“房子着火了”，系统也需要保持运行。重要的是在整个系统在不宕机的情况下能够处理这些异常。我们掌握隔离异常与控制异常的影响范围的方法从而使整个系统能够正常运行。\n感悟：异常是常态，如何处理异常是系统设计阶段必须考虑到的问题。\n3. 提供基元而不是框架 我们很快意识到，客户的需求是不断变化的。当客户摆脱传统的IT硬件和数据中心的限制，他们开始使用感兴趣却没有应用过的模式搭建系统。因此，我们努力做到超级敏捷以确保满足客户的需求。\n其中一个最重要的策略是向客户提供的基元和工具，让客户从中选择最合适他们的集合，而不是只提供一个框架中，迫使他们不得不使用。这种做法使我们的客户取得了成功，其后的AWS服务也同样利用这些客户已经熟悉的基础服务。\n同样重要的是我们不知道客户下一个关心问题是什么，直到他们开始使用我们的服务。这就是为什么我们经常用最少的功能集提供新的服务，让我们的客户能够帮助推动产品路线图规划与新功能的开发。\n感悟： 客户的需求是下一个产品。立足基础，理解客户的需求，才能满足客户。\n4. 自动化是关键 提供云计算服务不同于开发并交付软件，管理大规模系统需要不同的思维方式，以确保满足用户的高可用性，高性能和可扩展性的需求。\n这其中关键的一点是尽可能地实现自动化管理以避免容易出错的手动操作。要做到这一点，我们需要实现管理API从而管理我们的业务的关键功能。AWS可以帮助客户做到这一点。通过为应用程序的每一个分解组件提供管理API，从而应用自动化的规则来保证可靠性和预期的性能。\n如果你需要SSH到一个服务器或一个实例，那么你仍然需要更多的自动化，这是一个衡量自动化水平的好方法。\n感悟： 用人管理代码，用代码管理机器\n5. APIs are forever（API是不会变的） 这是我们从亚马逊零售业务经验中吸取的教训，它的重要性甚至超过了AWS中那些以API为中心的业务。\n一旦客户开始使用我们的API构建他们的应用程序和系统，改变这些API变得不可能，因我们修改这些API,会影响客户的业务运营。我们只有一次机会定义API,所以设计API是一个非常重要的工作。\n感悟： 接口优先，实现其次，实现可以调整，而接口一旦上线就没有什么回旋的余地。\n6. 监控资源应用 当构建一个服务，一定要有服务及其运营成本的数据以确定相应的计费方式，尤其是对于运行高营业额-低利润率的业务。AWS理所应当关注服务的成本，这样我们在为客户的提供服务的同时能够明确在哪些地方可以提高运营效率，以进一步削减成本，以更低的价格回馈客户。\n在创业初期，我们不知道S3服务应该采用哪种计费方式：我们曾认为应该对存储和带宽资源计费;经过一段时间，我们认识到请求的数量也应当计费。如果客户有许多微小的文件，即使他们上百万次数请求服务，消耗的存储和带宽都不会很高。我们不得不针对资源使用各个维度调整计费方式使AWS成为是一个可持续发展的业务。\n感悟： 无监控不系统，无度量不优化。 作任何商业服务不仅要有成本意识，而且应该作到度量成本。\n7. 从一开始集成安全 保护你的客户应该永远是你的首选，对于AWS来说亦是如此。不管运营的角度，还是策略方面，这将永远是我们的头号投资领域。\n我们很快地发现只有在一开始就把安全考虑进去才能提供安全的服务。安全团队的工作不是服务开发完成之后进行验证，他们必须在服务设计的第一天确认安全已经落实，且稳如泰山。总之对于安全，没有任何妥协。\n感悟： 安全是基本功能。\n8. 加密是一等公民 加密是为确保客户能控制谁有权访问他们的数据一个关键机制。十年前，加密工具和服务很难使用，直到几年前我们学会更好地将加密集成到我们的服务当中。最早的加密是从S3服务端开始的。如果您想检查我们的数据中心的任何磁盘，任何数据都不可访问的。但随着亚马逊推出CloudHSM（硬件安全模块）和Amazon Key Management Service（密钥管理服务），客户可以加密自己的密钥，从而不再需要AWS来管理钥匙。一段时间以来，每个新服务均支持加密。例如，Amazon Redshift的每个数据块默认以随机密钥加密，随后这些随机密钥被私钥再加密。私钥由客户提供，确保他们是唯一可以解密和访问他们的关键业务数据或个人身份信息。\n加密仍然是我们业务的重点。我们将继续为我们的客户提供更加便捷的加密方式，使他们能够更好地保护自己及其客户的数据。\n感悟：一定不要让核心数据裸奔。\n9. 网络相当重要的 AWS已经支持许多不同类型业务：大规模的事务处理，大规模网站流量，视频转码，高性能并行计算。其中每个业务具有独特的要求，但都涉及到网络。\n利用AWS特有的数据中心技术，我们实现了弹性网络以满足客户的各种不同网络负载。随着时间的推移，我们确信自己开发的硬件解决方案能够帮助客户实现他们的目标。这使我们能够满足非常具体的要求，比如实现不同AWS用户在网络方面达到最高级别的安全（也就是实现不同租户之间的网络隔离）。\nAWS设计的网络硬件和软件是如何进一步提高我们的客户性能的另一个成功的例子是解决虚拟机的虚拟网络访问的问题。由于网络接入是不同客户共享的，导致客户的网络访问时常有明显的抖动。开发一个支持SRIOV网卡让每个虚拟机拥有自身的虚拟网卡，从而使延迟时间降低2倍以上，并在延迟网络环境的改善超过10倍。\n感悟： 网络是服务的交付与实现的交通运输线，重要性不言而喻。传统网络难以满足云计算的需求，所以以SDN与NFV为基础的新网络技术会得到广泛的应用，但是这些技术很有可能是由云计算厂商自己开发利用，而不是由思科等传统网络设备商决定的，因为云计算厂商更需要这样的技术也更理解云计算对网络的需求。云计算厂商也有决心来作这件事：既然网络需求会不断变化，那应该将变化掌握在自己手中，另一方面，云计算作为未来长期存在的互联网基础设施，从长远来看网络产品的自研也可以节省一大笔成本。\n10. 保持开放 随着时间的推移，AWS团队通过提供多种服务和功能已经为客户创造了非常广泛而深入的平台。AWS上现有服务数量远远超过我们开发的服务数量：通过我们的合作伙伴，该平台不断扩展新的方向，已经成为一个丰富的生态系统。\n例如，我们合作伙伴Stripe在AWS上为Twilio提供支付服务。还有许多客户基于AWS构建自己的平台服务于特定垂直需求：飞利浦正在建设自己的Healthsuite数字平台来管理医疗数据，Ohpen已经建立了AWS零售银行业务的平台，Eagle Genomics已经建立了一个基因处理平台，还有很多。最重要的是，目前在AWS平台上没有条条框框告诉我们的合作伙伴，他们可以做什么和不能做什么。 没有条条框框的限制解放了创新，并诞生了许多意想不到的发明，这是一定要遵循的。\n感悟： 云计算提供开放平台，让百花齐放！ 云计算是互联网的基础的设施！\n后记 这是亚马逊CTO Werner Vogels在AWS发布十年之际写的一篇文章，亚马逊是云计算的先驱和全球的领导者，作为亚马逊CTO还常写一些技术性文章，必定是真知灼见，这些经验教训为今后的系统设计提供了很好的参考，有助于权衡决策。\n第一次翻译一篇完整的文章，表达与措词方面有很多不足，把它发出来了，主要想看看以后能取得多大的进步。\n最后，虽然翻译水平一般，但是还是建议：有时间结合工作认真地读一遍原文\n参考 10 Lessons from 10 Years of Amazon Web Services AWS Key Management Service Amazon Redshift AWS CloudHSM ","permalink":"https://myself659.github.io/post/arch/2016-06-02-10-lessons-from-10-years-of-amazon-web-services/","summary":"\u003ch3 id=\"前言\"\u003e前言\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003cp\u003e亚马逊在2006年3月14日发布AWS，到现在差不多10年了。回首过去的10年里，我们在构建\n安全，高可用性，可扩展性，低成本的服务方面积累了几百条经验与教训。\n由于AWS是建设并在全球运营这些服务的先驱，这些教训对我们的业务至关重要。正如我们以前多次说，“没有压缩经验的算法”，每月有超过百万的活跃客户，这些客户服务几个亿的用户，在这个过程我们不乏机会积累经验并持续优化从而为客户提供更好的服务。\u003c/p\u003e","title":"10 Lessons from 10 Years of Amazon Web Services（译文）"},{"content":"协议选择 最初选择HLS,后面切换为RTMP，切换为RTMP主要为了降低延迟，提供更好直播用户体验。\n解决并发问题 分发架构\n采用Live stream server， origin server， edge server 三层架构；如下图如示： ![分发架构图](/images/facebook live arch.png) 一句话就是：通过遍布各地的CDN节点（edge server）实现海量用户的播放请求。\n请求合并应对高并发 采用的CDN方案，应对一般数量级的播放是没有问题，但是facebook上有很多名人与网红，他们每个人都有几百万个粉丝，这就要求facebook live 直播系统能够处理超过一亿人同时播放的能力。假如一个名人的直播有100万粉丝同时观看，edge server缓存命中率为98%，那么未命中用户为2万，这2万用户回源到origin server甚至回源到Live stream server，服务器压力可想而知，这不是2W个连接而已，而是2W个视频播放，带宽，cpu都是一个很大的考验。用数字说话，以带宽为例； 假设一个HLS切片为3S，高清视频码率为1800K bps，那么一秒带宽需求为： 1 20K /3 *1800K b/s * 1s = 20*600 Mb = 12 Gb 每秒的带宽超过10Gb，服务器网卡高配也才10Gb。\n业务驱动方案，其具体解决方案如下： 在edge server 对同一个视频切片的多人cache miss请求进行合并，只发送一个到 origin server，待origin server 返回该视频切片，同时发送给该视频切片的所有请求。这样就可以大量减少回源的请求数量。origin server亦是如此。\n想到下面的问题：\n最近520，林心如与霍建华在微博宣布恋爱关系，微博是怎么搞定推送信息众粉丝的呢？ 一个直播有100W在线观看，如何实现海量消息的转发？\n既然想到了，以微博为例写一下自己的方案：\n微博消息是一种pub-sub模型，简单的在问题的场景下林心如这样明星是pub，粉丝是sub，粉丝数量是7000W 微博发布了，如何发送到7000W粉丝？不可能直接将立即将消息推送到各个粉丝，不可能是一个推模型，瞬间大并发写与大量存储都会有问题，可能是拉模型吗？拉模型好处只写一条微博，新上线的用户会主动拉取订阅（关注）用户的发布的微博；僵尸用户，活不过来用户，睡眠用户是可以忽略的，怎么触发在线用户主动获取关注的人的动态保证消息的实时性呢？ 在用户线用户定时获取更新，例如60秒定时获取订阅用户是否有更新，这是一个很大的开销，假如微博有2000W同时在线，那么一秒有30多W个拉取更新的请求，每个请求都会查询订阅用户的微博，虽然可以承受的，但是代价还是很大的，同时这种定时拉取会消耗用户的流量，长期下来用户是无法忍受的，所以在线用户拉取是不可行的 对于在线用户采用推消息，7000W粉丝假设有5%用户在线，那在线粉丝为350W，如果在60S内完成，那一秒要完成60W个推送（发送60W个包，更新60W个用户订阅微博信息），如果整个系统只处理这一件事，是可以的，但是微博大V多，假如1分钟有10个类似的情况，同时也还有其他在线千万级用户（数据是乱猜的）; 系统容量是有限的，总会出现抗不住的情况的，墨菲定律告诉我们：这种情况总会发生的，只是我们不知道什么时候会发生。 抗住是目的，这时候需要作好监控，限流，扩容，降级服务保证核心功能 针对粉丝数量超过1000W以上的大V进行特殊处理 实现RTMP 选择基于nginx rtmp改造，并开发rtmp proxy，采用nginx rtmp有如下好处：\nnginx拥有一个良好的技术生态 nginx的多进程模型能够充分分挥多核cpu的能力 nginx rtmp已经有大量的应用，基本功能可靠 nginx rtmp是基于c语言实现，有良好的性能，当有大量的节点部署的情况下，可以省一大批服务器，能够节省一大笔成本 个人水平有限，若有不妥与错误，欢迎指正，谢谢！\n参考 Under the hood: Broadcasting live video to millions ","permalink":"https://myself659.github.io/post/arch/2016-05-27-facebook-live-detail/","summary":"\u003ch3 id=\"协议选择\"\u003e协议选择\u003c/h3\u003e\n\u003cp\u003e最初选择HLS,后面切换为RTMP，切换为RTMP主要为了降低延迟，提供更好直播用户体验。\u003c/p\u003e\n\u003ch3 id=\"解决并发问题\"\u003e解决并发问题\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e分发架构\u003cbr\u003e\n采用Live stream server， origin server， edge server 三层架构；如下图如示：\n![分发架构图](/images/facebook live arch.png)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e一句话就是：通过遍布各地的CDN节点（edge server）实现海量用户的播放请求。\u003c/p\u003e","title":"Facebook live一些技术细节"},{"content":"利用pdf的print来实现压缩pdf文件的大小 在个人的实践中可以做到将一个2.44M的pdf文件压缩到0.14M\nadobe是最好用的pdf工具，可以结合开源的pdf工具一起使用 ","permalink":"https://myself659.github.io/post/devops/pdf-tips/","summary":"\u003ch2 id=\"利用pdf的print来实现压缩pdf文件的大小\"\u003e利用pdf的print来实现压缩pdf文件的大小\u003c/h2\u003e\n\u003cp\u003e在个人的实践中可以做到将一个2.44M的pdf文件压缩到0.14M\u003c/p\u003e\n\u003ch2 id=\"adobe是最好用的pdf工具可以结合开源的pdf工具一起使用\"\u003eadobe是最好用的pdf工具，可以结合开源的pdf工具一起使用\u003c/h2\u003e","title":"pdf tips"},{"content":"配置 config user 1 2 git config --global user.email \u0026#34;you@example.com\u0026#34; git config --global user.name \u0026#34;Your Name\u0026#34; Ignore Git permission changes 1 git config core.fileMode false Fix .gitignore 1 git rm -r --cached . git仓库 初始化一个版本仓库 1 git init clone远程版本库 1 git clone git@github.com:myself659/FFmpeg.git 添加远程版本库origin 1 git remote add origin git@github.com:myself659/rtmpserver_demo.git 查看远程仓库信息 1 git remote -v 删除远程仓库 1 git remote rm \u0026lt;repository\u0026gt; git修改 添加当前修改的文件到暂存区 1 git add . 提交修改到本地 1 git commit -m \u0026#34;fix bug 0001\u0026#34; 提交修改到远程 1 git push -u origin master 查看修改状态 1 git status 重命名文件 1 git mv README readme 从版本库中删除文件 1 git rm readme 取消对文件修改 1 git checkout -- readme 修改最新一次修改注释 1 git commit amend 显示所有提交 1 git show 1 git show \u0026lt;commit\u0026gt; --stat 1 git show \u0026lt;commit\u0026gt; -- \u0026lt;filepath\u0026gt; 恢复最后一次提交的状态 1 git revert HEAD 恢复某次提交的状态 1 git revert \u0026lt;$id\u0026gt; Remove untracked files \u0026amp; directories 1 2 3 4 # To remove untracked files git clean -f # TO remove untracked directories git clean -fd Discard local changes 1 git reset --hard Delete untracked files 1 git clean -fd git commit Edit last commit in both local and remote repository 1 2 3 4 5 6 7 8 9 # Step 1: Check recent commit history git show HEAD # Step 2: Update commit locally git add \u0026lt;file-path(s)\u0026gt; git commit --amend -m \u0026#34;\u0026lt;New-commit-message\u0026gt;\u0026#34; # Step 3: Check recent commit history to verify the correct edit git show HEAD # Step 4: Push the edit upstream git push -f # Then, verify it in the web interface of the hosting service Delete last commit in both local and remote repository 1 2 3 4 5 6 7 # Step 1: Check recent commit history to check git log --oneline -5 # Step 2: Delete commit locally and push the change to remote git reset --soft HEAD~1 # Delete commit locally git push -f # Delete commit upstream # Step 3: Check recent commit history to check git log --oneline -5 git repository rename repository 1 2 3 4 5 6 7 8 9 10 # Step 1: Rename local repository cd .. # Go to the directory that holds the repository mv \u0026lt;repo-old-name\u0026gt; \u0026lt;repo-new-name\u0026gt; cd \u0026lt;repo-new-name\u0026gt; # Step 2: Check remote url git remote -v # Step 3: Update remote url git remote set-url origin \u0026lt;new-url\u0026gt; # Step 4: Check remote url for verification git remote -v git log 查看修改log 1 git log 查看指定文件每次提交记录 1 git log \u0026lt;filename\u0026gt; 查看最近两次详细修改内容的diff 1 git log -p -2 查看提交统计信息 1 git log --stat Move a commit from one branch to another 1 git cherry-pick COMMIT-HASH 查看项目各个成员提交代码统计 1 git log --format=\u0026#39;%aN\u0026#39; | sort -u | while read name; do echo -en \u0026#34;$name\\t\u0026#34;; git log --author=\u0026#34;$name\u0026#34; --pretty=tformat: --numstat | awk \u0026#39;{ add += $1; subs += $2; loc += $1 - $2 } END { printf \u0026#34;added lines: %s, removed lines: %s, total lines: %s\\n\u0026#34;, add, subs, loc }\u0026#39; -; done git log graph 1 git log --graph --format=format:\u0026#39;%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%an%C(reset)%C(bold yellow)%d%C(reset) %C(dim white)- %s%C(reset)\u0026#39; --all git分支 查看远程分支 1 git branch -r 创建新分支 1 git branch \u0026lt;new_branch\u0026gt; 1 git checkout -b NEW-BRANCH-NAME 查看各分支创建最后提交信息 1 git branch -v 删除指定分支 1 2 git branch -d \u0026lt;branch_name\u0026gt; git push origin -d \u0026lt;branch-name\u0026gt; 强制删除指定分支 1 git branch -D \u0026lt;branch_name\u0026gt; 查看已经被合并到当前分支的分支 1 git branch --merged 查看尚未被合并到当前分支的分支 1 git branch --no-merged 合并分支 1 git merge \u0026lt;merge_branch\u0026gt; 切换分支 1 git checkout \u0026lt;branch_name\u0026gt; -f 抓取远程仓库所有分支更新并合并到本地 1 git pull 抓取远程仓库所有分支更新并合并到本地，不要快进合并 1 git pull --no-ff 抓取远程仓库更新 1 git fetch origin push所有分支 1 git push 将本地主分支推到远程主分支 1 git push origin master 将本地主分支推到远程(如无远程主分支则创建，用于初始化远程仓库) 1 git push -u origin master 创建远程分支 1 git push origin \u0026lt;local_branch\u0026gt;:\u0026lt;remote_branch\u0026gt; 查看所有分支名称 1 git branch --all check branch status 1 git status rename local branch 1 git branch -m OLD-BRANCH-NAME NEW-BRANCH-NAME rename remote branch 1 git push origin :OLD-BRANCH-NAME NEW-BRANCH-NAME Delete a branch on a remote repository 1 git push REMOTE-NAME --delete BRANCH-NAME clean git branches exclude main and master 1 git branch | grep -v \u0026#34;master\u0026#34; | grep -v \u0026#34;main\u0026#34; | grep -v ^\\* | xargs git branch -D; Create a local copy of the existing remote branch 1 2 git fetch origin git switch --track origin/\u0026lt;branch-name\u0026gt; git diff 比较当前文件和暂存区文件差异 1 git diff \u0026lt;file\u0026gt; 比较两次提交之间的差异 1 git diff \u0026lt;$id1\u0026gt; \u0026lt;$id2\u0026gt; 比较两个分支 1 git diff \u0026lt;branch1\u0026gt; \u0026lt;branch2\u0026gt; 比较统计信息 1 git diff --stat 提交git diff How to Include Diff into Git Commit Message\n1 2 3 4 5 6 7 8 9 10 11 12 13 #!/bin/bash COMMIT_MSG_FILE=$1 COMMIT_SOURCE=$2 SHA1=$3 RESULT=\u0026#34;# Differences to be committed:\u0026#34; while IFS= read -r line do RESULT+=\u0026#34;$IFS# $line\u0026#34; done \u0026lt;\u0026lt;\u0026lt; $(git diff --staged) echo \u0026#34;$RESULT\u0026#34; \u0026gt;\u0026gt; $COMMIT_MSG_FILE 查看指定文件的修改 1 git show -- misc 提交文件超过100M 1 git filter-branch -f --index-filter \u0026#34;git rm -rf --cached --ignore-unmatch slides/tt.sql\u0026#34; -- --all 提交代码到新分支 创建新分支 1 git checkout -b feature-43 添加修改 1 git add . 提交修改到本地 1 git commit -m \u0026#34;f43\u0026#34; 将本地修改推送到指定分支 1 git push origin feature-43 丢弃本地修改 1 git reset --hard \u0026lt;the sha1 hash\u0026gt; Reset to the last commit 1 git reset -hard origin/BRANCH-NAME 拉取所有分支 1 git pull --all 1 2 3 4 #!/bin/bash for branch in $(git branch --all | grep \u0026#39;^\\s*remotes\u0026#39; | egrep --invert-match \u0026#39;(:?HEAD|master)$\u0026#39;); do git branch --track \u0026#34;${branch##*/}\u0026#34; \u0026#34;$branch\u0026#34; done 1 2 3 4 5 6 7 8 9 #!/bin/sh # Usage: fetchall.sh branch ... set -x git fetch --all for branch in \u0026#34;$@\u0026#34;; do git checkout \u0026#34;$branch\u0026#34; || exit 1 git rebase \u0026#34;origin/$branch\u0026#34; || exit 1 done 查看远程git地址 1 git config --get remote.origin.url merge 1 2 git checkout feature git merge master 将当前分支合并到原来master分支。\nrebase 1 2 git checkout feature git rebase master 将master后面的修改合并到当前分支，将当前分支作为个人开发master分支。\n跳转到根目录 1 2 3 gitroot(){ cd $(git rev-parse --show-toplevel 2\u0026gt; /dev/null) } gitstart 1 2 mkdir your-project gitstart go git submodule delete 在path-to-submodule目录下删除.git文件夹\n1 git rm -rf --cached path-to-submodule ","permalink":"https://myself659.github.io/post/devops/2016-05-21-git-cmd/","summary":"\u003ch3 id=\"配置\"\u003e配置\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003econfig user\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  git config --global user.email \u0026#34;you@example.com\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  git config --global user.name \u0026#34;Your Name\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003eIgnore Git permission changes\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit config core.fileMode false\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003eFix .gitignore\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit rm -r --cached .\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"git仓库\"\u003egit仓库\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e初始化一个版本仓库\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit init\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003eclone远程版本库\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone git@github.com:myself659/FFmpeg.git\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e添加远程版本库origin\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit remote add origin git@github.com:myself659/rtmpserver_demo.git\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e查看远程仓库信息\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit remote -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"5\"\u003e\n\u003cli\u003e删除远程仓库\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit remote rm \u0026lt;repository\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"git修改\"\u003egit修改\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e添加当前修改的文件到暂存区\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit add .\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e提交修改到本地\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit commit -m \u0026#34;fix bug 0001\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e提交修改到远程\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit  push -u origin  master  \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e查看修改状态\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit  status  \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"5\"\u003e\n\u003cli\u003e重命名文件\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit mv README  readme\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"6\"\u003e\n\u003cli\u003e从版本库中删除文件\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit rm readme\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"8\"\u003e\n\u003cli\u003e取消对文件修改\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit checkout -- readme\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"9\"\u003e\n\u003cli\u003e修改最新一次修改注释\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit commit amend\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"10\"\u003e\n\u003cli\u003e显示所有提交\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit show  \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit show \u0026lt;commit\u0026gt; --stat\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit show \u0026lt;commit\u0026gt; -- \u0026lt;filepath\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"11\"\u003e\n\u003cli\u003e恢复最后一次提交的状态\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit revert HEAD\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"12\"\u003e\n\u003cli\u003e恢复某次提交的状态\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit revert \u0026lt;$id\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"13\"\u003e\n\u003cli\u003eRemove untracked files \u0026amp; directories\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# To remove untracked files\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clean -f\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# TO remove untracked directories\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clean -fd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"14\"\u003e\n\u003cli\u003eDiscard local changes\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit reset --hard\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"15\"\u003e\n\u003cli\u003eDelete untracked files\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clean -fd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"git-commit\"\u003egit commit\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eEdit last commit in both local and remote repository\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e9\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Step 1: Check recent commit history\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit show HEAD\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Step 2: Update commit locally\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit add \u0026lt;file-path(s)\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit commit --amend -m \u0026#34;\u0026lt;New-commit-message\u0026gt;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Step 3: Check recent commit history to verify the correct edit\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit show HEAD \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Step 4: Push the edit upstream\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push -f # Then, verify it in the web interface of the hosting service\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003eDelete last commit in both local and remote repository\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Step 1: Check recent commit history to check\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit log --oneline -5\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Step 2: Delete commit locally and push the change to remote\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit reset --soft HEAD~1 # Delete commit locally\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push -f # Delete commit upstream\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Step 3: Check recent commit history to check\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit log --oneline -5\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"git-repository\"\u003egit repository\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003erename repository\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Step 1: Rename local repository\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecd .. # Go to the directory that holds the repository\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emv \u0026lt;repo-old-name\u0026gt; \u0026lt;repo-new-name\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecd \u0026lt;repo-new-name\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Step 2: Check remote url\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit remote -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Step 3: Update remote url\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit remote set-url origin \u0026lt;new-url\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Step 4: Check remote url for verification\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit remote -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"git-log\"\u003egit log\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e查看修改log\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit log\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e查看指定文件每次提交记录\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit log \u0026lt;filename\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e查看最近两次详细修改内容的diff\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit log -p -2\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e查看提交统计信息\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit log --stat\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"5\"\u003e\n\u003cli\u003eMove a commit from one branch to another\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit cherry-pick COMMIT-HASH\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"6\"\u003e\n\u003cli\u003e查看项目各个成员提交代码统计\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit log --format=\u0026#39;%aN\u0026#39; | sort -u | while read name; do echo -en \u0026#34;$name\\t\u0026#34;; git log --author=\u0026#34;$name\u0026#34; --pretty=tformat: --numstat | awk \u0026#39;{ add += $1; subs += $2; loc += $1 - $2 } END { printf \u0026#34;added lines: %s, removed lines: %s, total lines: %s\\n\u0026#34;, add, subs, loc }\u0026#39; -; done\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"7\"\u003e\n\u003cli\u003egit log graph\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit log --graph --format=format:\u0026#39;%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%an%C(reset)%C(bold yellow)%d%C(reset) %C(dim white)- %s%C(reset)\u0026#39; --all\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"git分支\"\u003egit分支\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e查看远程分支\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit branch -r\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e创建新分支\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit branch \u0026lt;new_branch\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit checkout -b NEW-BRANCH-NAME\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e查看各分支创建最后提交信息\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit branch  -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e删除指定分支\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit  branch  -d \u0026lt;branch_name\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push origin -d \u0026lt;branch-name\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"5\"\u003e\n\u003cli\u003e强制删除指定分支\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit  branch  -D  \u0026lt;branch_name\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"6\"\u003e\n\u003cli\u003e查看已经被合并到当前分支的分支\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit branch --merged\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"7\"\u003e\n\u003cli\u003e查看尚未被合并到当前分支的分支\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit branch  --no-merged\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"8\"\u003e\n\u003cli\u003e合并分支\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit merge \u0026lt;merge_branch\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"9\"\u003e\n\u003cli\u003e切换分支\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit checkout \u0026lt;branch_name\u0026gt;  -f\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"10\"\u003e\n\u003cli\u003e抓取远程仓库所有分支更新并合并到本地\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit pull  \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"11\"\u003e\n\u003cli\u003e抓取远程仓库所有分支更新并合并到本地，不要快进合并\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit  pull --no-ff\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"12\"\u003e\n\u003cli\u003e抓取远程仓库更新\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit fetch origin\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"13\"\u003e\n\u003cli\u003epush所有分支\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"14\"\u003e\n\u003cli\u003e将本地主分支推到远程主分支\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit  push  origin  master\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"15\"\u003e\n\u003cli\u003e将本地主分支推到远程(如无远程主分支则创建，用于初始化远程仓库)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit  push -u  origin  master\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"16\"\u003e\n\u003cli\u003e创建远程分支\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push origin \u0026lt;local_branch\u0026gt;:\u0026lt;remote_branch\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"17\"\u003e\n\u003cli\u003e查看所有分支名称\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit branch --all\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"18\"\u003e\n\u003cli\u003echeck  branch  status\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit status\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"19\"\u003e\n\u003cli\u003erename  local branch\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit branch -m OLD-BRANCH-NAME NEW-BRANCH-NAME\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"20\"\u003e\n\u003cli\u003erename remote branch\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push origin :OLD-BRANCH-NAME NEW-BRANCH-NAME\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"21\"\u003e\n\u003cli\u003eDelete a branch on a remote repository\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push REMOTE-NAME --delete BRANCH-NAME\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"22\"\u003e\n\u003cli\u003eclean git branches exclude main and master\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit branch | grep -v \u0026#34;master\u0026#34; | grep -v \u0026#34;main\u0026#34; | grep -v ^\\* | xargs git branch -D;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"23\"\u003e\n\u003cli\u003eCreate a local copy of the existing remote branch\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit fetch origin\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit switch --track origin/\u0026lt;branch-name\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"git-diff\"\u003egit diff\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e比较当前文件和暂存区文件差异\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit diff \u0026lt;file\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e比较两次提交之间的差异\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit diff \u0026lt;$id1\u0026gt; \u0026lt;$id2\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e比较两个分支\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit diff \u0026lt;branch1\u0026gt; \u0026lt;branch2\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e比较统计信息\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit diff --stat\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003col start=\"5\"\u003e\n\u003cli\u003e提交git diff\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003ca href=\"https://zhauniarovich.com/post/2020/2020-09-git-commit-message/\"\u003eHow to Include Diff into Git Commit Message\u003c/a\u003e\u003c/p\u003e","title":"git常用命令总结"},{"content":"前言 与前同事交流，发现以前的技术经历与解决的问题，现在接触不多，但是想想还是很有意思，虽然很多细节现在已经不能表达出来或展示出来，但是还得写出来。下面写的得主要个人经历的linux内核crash原因。\n内存类 这一类同用户态类似，主要有以下几种情况，\n访问NULL 访问释放后的内存 非法访问内存 内存被踩 内存耗尽 野指针操作 堆栈类 内核调用栈溢出 写坏调用栈 锁 死锁 rcu使用错误 锁内存被写坏 长期获取不到锁，导致看门狗饿死，狗叫重启 调度 线程陷入死循环或者长时间占用cpu，在非抢占模式下其他线程得不到调度 中断上下文 在中断上下文调用错误的函数，例如在中断上下文使用信号量，更多参考那些可进入睡眠状态的Linux内核函数 硬件故障 在系统运行过程出现硬件故障也会导致内核crash。接触较少，不作说明。\n后记 能力有限，条件有限，写的很虚，也不全面，以后有机会再来点实际的，这个目的主要是回忆总结自己的知识体系。\n","permalink":"https://myself659.github.io/post/2016-04-17-linux-kernel-crashs/","summary":"\u003ch3 id=\"前言\"\u003e前言\u003c/h3\u003e\n\u003cp\u003e与前同事交流，发现以前的技术经历与解决的问题，现在接触不多，但是想想还是很有意思，虽然很多细节现在已经不能表达出来或展示出来，但是还得写出来。下面写的得主要个人经历的linux内核crash原因。\u003c/p\u003e","title":"Linux内核常见crash原因"},{"content":"前言 动手实践并写文章花5倍的时间一次性把事情做到90分，好过读别人文章只能做到60分，后面还需要花时间继续深入学习(做事情一定要做到有效的阈值)。本文目的希望通过分析一个简单的函数调用加深对x86-64寄存器及栈帧的结构的认识，以便在定位问题需要的时候能够熟练运用。\n环境 1.操作系统和内核\n1 2 [root@localhost ~]# cat /proc/version Linux version 3.10.0-229.4.2.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP Wed May 13 10:06:09 UTC 2015 2.GCC版本\n1 2 3 4 5 6 7 8 [root@localhost ~]# gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.3/lto-wrapper Target: x86_64-redhat-linux Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.3-20140911/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.3-20140911/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux Thread model: posix gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) 3.GDB版本\n1 2 3 4 5 6 7 8 9 10 [root@localhost ~]# gdb --version GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-64.el7 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later \u0026lt;http://gnu.org/licenses/gpl.html\u0026gt; This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type \u0026#34;show copying\u0026#34; and \u0026#34;show warranty\u0026#34; for details. This GDB was configured as \u0026#34;x86_64-redhat-linux-gnu\u0026#34;. For bug reporting instructions, please see: \u0026lt;http://www.gnu.org/software/gdb/bugs/\u0026gt;. GDB 分析调用栈 1. 准备代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include \u0026lt;stdio.h\u0026gt; int sum(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9) { int s = 0xaaaa; s = a1+a2+a3+a4+a5+a6+a7+a8+a9; return s; } void caller(void) { int iRet = 0x0; iRet = sum(0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99); printf(\u0026#34;sum: %x\\r\\n\u0026#34;, iRet); } int main(void) { caller(); return 0; } 2. 生成可执行文件 1 2 3 [root@localhost cpp]# gcc -g stackexample.c -o stackexample [root@localhost cpp]# ./stackexample sum: 2FD 3. 分析调用栈 主要通过gdb分析调用栈变化情况\n3.1 初始化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Breakpoint 1, main () at stackexample.c:22 warning: Source file is more recent than executable. 22 caller(); Missing separate debuginfos, use: debuginfo-install glibc-2.17-78.el7.x86_64 (gdb) info registers rax 0x4005e6 4195814 rbx 0x0 0 rcx 0x400600 4195840 rdx 0x7fffffffe518 140737488348440 rsi 0x7fffffffe508 140737488348424 rdi 0x1 1 rbp 0x7fffffffe420 0x7fffffffe420 rsp 0x7fffffffe420 0x7fffffffe420 r8 0x7ffff7dd5e80 140737351868032 r9 0x0 0 r10 0x7fffffffe270 140737488347760 r11 0x7ffff7a3ba00 140737348090368 r12 0x400440 4195392 r13 0x7fffffffe500 140737488348416 r14 0x0 0 r15 0x0 0 rip 0x4005ea 0x4005ea \u0026lt;main+4\u0026gt; eflags 0x246 [ PF ZF IF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 ---Type \u0026lt;return\u0026gt; to continue, or q \u0026lt;return\u0026gt; to quit--- gs 0x0 0 (gdb) 栈内存（堆栈向下生长）:\n1 2 3 4 5 6 7 8 9 10 11 12 rbp 0x7fffffffe420 0x7fffffffe420 rsp 0x7fffffffe420 0x7fffffffe420 0x7fffffffe428 +------------------+ | | rbp-\u0026gt;0x7fffffffe420 +------------------+ \u0026lt;-rsp | | 0x7fffffffe218 +------------------+ | | 0x7fffffffe210 +------------------+ | | 0x7fffffffe208 +------------------+ 3.2 调用caller 寄存器信息：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 (gdb) s caller () at stackexample.c:14 14 int iRet = 0x0; (gdb) info registers rax 0x4005e6 4195814 rbx 0x0 0 rcx 0x400600 4195840 rdx 0x7fffffffe518 140737488348440 rsi 0x7fffffffe508 140737488348424 rdi 0x1 1 rbp 0x7fffffffe410 0x7fffffffe410 rsp 0x7fffffffe3e0 0x7fffffffe3e0 r8 0x7ffff7dd5e80 140737351868032 r9 0x0 0 r10 0x7fffffffe270 140737488347760 r11 0x7ffff7a3ba00 140737348090368 r12 0x400440 4195392 r13 0x7fffffffe500 140737488348416 r14 0x0 0 r15 0x0 0 rip 0x40058a 0x40058a \u0026lt;caller+8\u0026gt; eflags 0x202 [ IF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 ---Type \u0026lt;return\u0026gt; to continue, or q \u0026lt;return\u0026gt; to quit--- gs 0x0 0 (gdb) x /6gx 0x7fffffffe3e0 0x7fffffffe3e0: 0x0000000000000001 0x000000000040064d 0x7fffffffe3f0: 0x0000000000000000 0x0000000000000000 0x7fffffffe400: 0x0000000000400600 0x0000000000400440 (gdb) (gdb) x /12gx 0x7fffffffe3e0 0x7fffffffe3e0: 0x0000000000000001 0x000000000040064d 0x7fffffffe3f0: 0x0000000000000000 0x0000000000000000 0x7fffffffe400: 0x0000000000400600 0x0000000000400440 #小端系统，前8位存储iRet的值 0x7fffffffe410: 0x00007fffffffe420 0x00000000004005ef 0x7fffffffe420: 0x0000000000000000 0x00007ffff7a3baf5 0x7fffffffe430: 0x0000002000000000 0x00007fffffffe508 (gdb) (gdb) p iRet $3 = 0 (gdb) p \u0026amp;iRet $4 = (int *) 0x7fffffffe40c #局部变量在堆栈的位置 栈内存（堆栈向下生长）：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 rbp 0x7fffffffe410 0x7fffffffe410 rsp 0x7fffffffe3e0 0x7fffffffe3e0 0x7fffffffe428 +------------------+ | | 0x7fffffffe420 +------------------+ |0x00000000004005ef| #保存返回main的指令地址,参考汇编代码 0x7fffffffe418 +------------------+ |0x00007fffffffe420| #保存main函数对应rbp rbp --\u0026gt;0x7fffffffe410 +------------------+ | | 0x7fffffffe408 +------------------+ | | 0x7fffffffe400 +------------------+ | | 0x7fffffffe3f8 +------------------+ | | 0x7fffffffe3f0 +------------------+ | | 0x7fffffffe3e8 +------------------+ | | rsp --\u0026gt;0x7fffffffe3e0 +------------------+ main函数的汇编代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 (gdb) disassemble /m main Dump of assembler code for function main: 21 { 0x00000000004005e6 \u0026lt;+0\u0026gt;: push %rbp 0x00000000004005e7 \u0026lt;+1\u0026gt;: mov %rsp,%rbp 22 caller(); 0x00000000004005ea \u0026lt;+4\u0026gt;: callq 0x400582 \u0026lt;caller\u0026gt; 23 24 return 0; 0x00000000004005ef \u0026lt;+9\u0026gt;: mov $0x0,%eax #调用caller返回后执行的指令地址 25 } 0x00000000004005f4 \u0026lt;+14\u0026gt;: pop %rbp 0x00000000004005f5 \u0026lt;+15\u0026gt;: retq End of assembler dump. (gdb) 3.3调用sum 寄存器信息：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Breakpoint 2, sum (a1=17, a2=34, a3=51, a4=68, a5=85, a6=102, a7=119, a8=136, a9=153) at stackexample.c:6 6 int s = 0x0; (gdb) info registers rax 0x4005e6 4195814 rbx 0x0 0 rcx 0x44 68 #第四个参数 rdx 0x33 51 #第三个参数 rsi 0x22 34 #第二个参数 rdi 0x11 17 #第一个参数 rbp 0x7fffffffe3d0 0x7fffffffe3d0 rsp 0x7fffffffe3d0 0x7fffffffe3d0 r8 0x55 85 #第五个参数 r9 0x66 102 #第六个参数 r10 0x7fffffffe270 140737488347760 r11 0x7ffff7a3ba00 140737348090368 r12 0x400440 4195392 r13 0x7fffffffe500 140737488348416 r14 0x0 0 r15 0x0 0 rip 0x400548 0x400548 \u0026lt;sum+24\u0026gt; eflags 0x202 [ IF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 ---Type \u0026lt;return\u0026gt; to continue, or q \u0026lt;return\u0026gt; to quit--- gs 0x0 0 (gdb) caller对应汇编代码：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 (gdb) disassemble /m caller Dump of assembler code for function caller: 13 { 0x0000000000400582 \u0026lt;+0\u0026gt;: push %rbp #保存调用函数main的rbp 0x0000000000400583 \u0026lt;+1\u0026gt;: mov %rsp,%rbp #将上一个栈顶指针作为本函数的栈底（设置当前函数的栈基址） 0x0000000000400586 \u0026lt;+4\u0026gt;: sub $0x30,%rsp #分配栈空间 14 int iRet = 0x0; 0x000000000040058a \u0026lt;+8\u0026gt;: movl $0x0,-0x4(%rbp) 15 16 iRet = sum(0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99); 0x0000000000400591 \u0026lt;+15\u0026gt;: movl $0x99,0x10(%rsp) #第9个参数 0x0000000000400599 \u0026lt;+23\u0026gt;: movl $0x88,0x8(%rsp) #第8个参考 0x00000000004005a1 \u0026lt;+31\u0026gt;: movl $0x77,(%rsp) #第7个参数 0x00000000004005a8 \u0026lt;+38\u0026gt;: mov $0x66,%r9d #第6个参数 0x00000000004005ae \u0026lt;+44\u0026gt;: mov $0x55,%r8d #第5个参数 0x00000000004005b4 \u0026lt;+50\u0026gt;: mov $0x44,%ecx #第4个参数 0x00000000004005b9 \u0026lt;+55\u0026gt;: mov $0x33,%edx #第3个参数 0x00000000004005be \u0026lt;+60\u0026gt;: mov $0x22,%esi #第2个参数 0x00000000004005c3 \u0026lt;+65\u0026gt;: mov $0x11,%edi #第1个参数 0x00000000004005c8 \u0026lt;+70\u0026gt;: callq 0x400530 \u0026lt;sum\u0026gt; #调用函数sum 0x00000000004005cd \u0026lt;+75\u0026gt;: mov %eax,-0x4(%rbp) #取返回值 ---Type \u0026lt;return\u0026gt; to continue, or q \u0026lt;return\u0026gt; to quit--- 17 printf(\u0026#34;sum: %X\\r\\n\u0026#34;, iRet); 0x00000000004005d0 \u0026lt;+78\u0026gt;: mov -0x4(%rbp),%eax 0x00000000004005d3 \u0026lt;+81\u0026gt;: mov %eax,%esi 0x00000000004005d5 \u0026lt;+83\u0026gt;: mov $0x400690,%edi 0x00000000004005da \u0026lt;+88\u0026gt;: mov $0x0,%eax 0x00000000004005df \u0026lt;+93\u0026gt;: callq 0x400410 \u0026lt;printf@plt\u0026gt; 18 } 0x00000000004005e4 \u0026lt;+98\u0026gt;: leaveq #出栈处理 0x00000000004005e5 \u0026lt;+99\u0026gt;: retq End of assembler dump. (gdb) 通过上面汇编与寄存器信息，可以了解到函数调用的参数一般先通过寄存器传递。但是可用于传递函数的参数有限，超出的参数怎么传递呢？入调用函数的栈空间，具体如下：\n1 2 3 4 5 6 7 8 (gdb) x /12gx $rsp 0x7fffffffe3d0: 0x00007fffffffe410 0x00000000004005cd #main函数栈底，返回指令 0x7fffffffe3e0: 0x0000000000000077 0x0000000000000088 #第七个参数 第八个参数 0x7fffffffe3f0: 0x0000000000000099 0x0000000000000000 #第九个参数 0x7fffffffe400: 0x0000000000400600 0x0000000000400440 #这两个内容是什么 0x7fffffffe410: 0x00007fffffffe420 0x00000000004005ef 0x7fffffffe420: 0x0000000000000000 0x00007ffff7a3baf5 (gdb) 栈内存（栈向下生长）：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 rbp 0x7fffffffe3d0 0x7fffffffe3d0 rsp 0x7fffffffe3d0 0x7fffffffe3d0 0x7fffffffe428 +------------------+ | | 0x7fffffffe420 +------------------+ |0x00000000004005ef| #保存返回main的地址 0x7fffffffe418 +------------------+ |0x00007fffffffe420| #保存main函数对应rbp 0x7fffffffe410 +------------------+ | | 0x7fffffffe408 +------------------+ | | 0x7fffffffe400 +------------------+ | | 0x7fffffffe3f8 +------------------+ | 0x99 | 0x7fffffffe3f0 +------------------+ | 0x88 | 0x7fffffffe3e8 +------------------+ | 0x77 | 0x7fffffffe3e0 +------------------+ |0x00000000004005cd| #保存调用caller返回的指令地址 0x7fffffffe3e0 +------------------+ |0x00007fffffffe410| #保存caller函数对应的rbp rsp --\u0026gt;0x7fffffffe3e0 +------------------+ 3.4 sum获取参数 1 2 3 4 5 6 7 8 9 (gdb) x /16gx $rsp-0x28 0x7fffffffe3a8: 0x0000005500000066 0x0000003300000044 0x7fffffffe3b8: 0x0000001100000022 0x0000000000000006 0x7fffffffe3c8: 0x00000000f7ab9646 0x00007fffffffe410 0x7fffffffe3d8: 0x00000000004005cd 0x0000000000000077 0x7fffffffe3e8: 0x0000000000000088 0x0000000000000099 0x7fffffffe3f8: 0x0000000000000000 0x0000000000400600 0x7fffffffe408: 0x0000000000400440 0x00007fffffffe420 0x7fffffffe418: 0x00000000004005ef 0x0000000000000000 栈内存（栈向下生长）：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 rbp 0x7fffffffe3e0 0x7fffffffe3e0 rsp 0x7fffffffe3e0 0x7fffffffe3e0 0x7fffffffe428 +------------------+ | | 0x7fffffffe420 +------------------+ |0x00000000004005ef| #保存返回main的地址 0x7fffffffe418 +------------------+ |0x00007fffffffe420| #保存main函数对应rbp 0x7fffffffe410 +------------------+ | | 0x7fffffffe408 +------------------+ | | 0x7fffffffe400 +------------------+ | | 0x7fffffffe3f8 +------------------+ | 0x99 | 0x7fffffffe3f0 +------------------+ | 0x88 | 0x7fffffffe3e8 +------------------+ | 0x77 | 0x7fffffffe3e0 +------------------+ |0x00000000004005cd| #保存返回caller的指令地址 0x7fffffffe3e0 +------------------+ |0x00007fffffffe410| #保存caller函数对应的rbp rsp --\u0026gt;0x7fffffffe3e0 +------------------+ | | 0x7fffffffe3d8 +------------------+ | | 0x7fffffffe3d0 +------------------+ | | 0x7fffffffe3e8 +------------------+ | | 0x7fffffffe3e0 +------------------+ | | 0x7fffffffe3c8 +------------------+ | | 0x7fffffffe3c0 +------------------+ |0x0000001100000022| 0x7fffffffe3b8 +------------------+ |0x0000005500000066| 0x7fffffffe3b0 +------------------+ |0x0000003300000044| 0x7fffffffe3a8 +------------------+ | | 0x7fffffffe3a0 +------------------+ sum函数对应汇编如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 (gdb) disassemble /m sum Dump of assembler code for function sum: 5 { 0x0000000000400530 \u0026lt;+0\u0026gt;: push %rbp 0x0000000000400531 \u0026lt;+1\u0026gt;: mov %rsp,%rbp 0x0000000000400534 \u0026lt;+4\u0026gt;: mov %edi,-0x14(%rbp) #获取函数参数，顺序为从左到右 0x0000000000400537 \u0026lt;+7\u0026gt;: mov %esi,-0x18(%rbp) 0x000000000040053a \u0026lt;+10\u0026gt;: mov %edx,-0x1c(%rbp) 0x000000000040053d \u0026lt;+13\u0026gt;: mov %ecx,-0x20(%rbp) 0x0000000000400540 \u0026lt;+16\u0026gt;: mov %r8d,-0x24(%rbp) 0x0000000000400544 \u0026lt;+20\u0026gt;: mov %r9d,-0x28(%rbp) 6 int s = 0x0; 0x0000000000400548 \u0026lt;+24\u0026gt;: movl $0x0,-0x4(%rbp) 7 s = a1+a2+a3+a4+a5+a6+a7+a8+a9; =\u0026gt; 0x000000000040054f \u0026lt;+31\u0026gt;: mov -0x18(%rbp),%eax 0x0000000000400552 \u0026lt;+34\u0026gt;: mov -0x14(%rbp),%edx 0x0000000000400555 \u0026lt;+37\u0026gt;: add %eax,%edx 0x0000000000400557 \u0026lt;+39\u0026gt;: mov -0x1c(%rbp),%eax 0x000000000040055a \u0026lt;+42\u0026gt;: add %eax,%edx 0x000000000040055c \u0026lt;+44\u0026gt;: mov -0x20(%rbp),%eax 0x000000000040055f \u0026lt;+47\u0026gt;: add %eax,%edx 0x0000000000400561 \u0026lt;+49\u0026gt;: mov -0x24(%rbp),%eax ---Type \u0026lt;return\u0026gt; to continue, or q \u0026lt;return\u0026gt; to quit--- 0x0000000000400564 \u0026lt;+52\u0026gt;: add %eax,%edx 0x0000000000400566 \u0026lt;+54\u0026gt;: mov -0x28(%rbp),%eax 0x0000000000400569 \u0026lt;+57\u0026gt;: add %eax,%edx 0x000000000040056b \u0026lt;+59\u0026gt;: mov 0x10(%rbp),%eax #取参数a7 = 0x77 0x000000000040056e \u0026lt;+62\u0026gt;: add %eax,%edx 0x0000000000400570 \u0026lt;+64\u0026gt;: mov 0x18(%rbp),%eax #取参数a8 = 0x88 0x0000000000400573 \u0026lt;+67\u0026gt;: add %eax,%edx 0x0000000000400575 \u0026lt;+69\u0026gt;: mov 0x20(%rbp),%eax #取参数a9 = 0x99 0x0000000000400578 \u0026lt;+72\u0026gt;: add %edx,%eax 0x000000000040057a \u0026lt;+74\u0026gt;: mov %eax,-0x4(%rbp) 8 9 return s; 0x000000000040057d \u0026lt;+77\u0026gt;: mov -0x4(%rbp),%eax #计算结果通过eax寄存器返回 10 } 0x0000000000400580 \u0026lt;+80\u0026gt;: pop %rbp 0x0000000000400581 \u0026lt;+81\u0026gt;: retq End of assembler dump. (gdb) 注意的是调用sum的时候并没有分配栈空间？主要原因是sum函数内没有调用其他函数，sum就只能被别的函数调用，sum的局部变量直接由rsp向下生长，调用结束后，直接恢复调用者的栈，这样的好处有两个：\n少一个指令，提高执行效率 编译的时候并不需要计算需要开辟多少栈空间 为什么需要将值从寄存器取出？直接利用寄存器取值不可以吗？ 传递参数的寄存器在函数执行指令的时候有其他用处，调用函数需要将参数从寄存器取出到栈内存中（在一定的情况下即调用函数的指令不需要占用传递参数的寄存器，如果加大编译的优化级别，是否不会从参数寄存器取出参数到函数的栈内存中而是直接使用寄存器？）另外可以从这里看出，从代码层面优化性能可以考虑减少函数调用以及优化一些不必要的参数传递，尽管只能尽一丝绵薄之力。\n3.5 sum返回值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 (gdb) n caller () at stackexample.c:17 17 printf(\u0026#34;sum: %X\\r\\n\u0026#34;, iRet); (gdb) info registers rax 0x2fd 765 #返回值 rbx 0x0 0 rcx 0x44 68 rdx 0x264 612 rsi 0x22 34 rdi 0x11 17 rbp 0x7fffffffe410 0x7fffffffe410 rsp 0x7fffffffe3e0 0x7fffffffe3e0 r8 0x55 85 r9 0x66 102 r10 0x7fffffffe270 140737488347760 r11 0x7ffff7a3ba00 140737348090368 r12 0x400440 4195392 r13 0x7fffffffe500 140737488348416 r14 0x0 0 r15 0x0 0 rip 0x4005d0 0x4005d0 \u0026lt;caller+78\u0026gt; eflags 0x202 [ IF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 ---Type \u0026lt;return\u0026gt; to continue, or q \u0026lt;return\u0026gt; to quit--- gs 0x0 0 (gdb) (gdb) x /16gx 0x7fffffffe3c0 0x7fffffffe3c0: 0x0000000000000006 0x000002fdf7ab9646 #返回值0x2fd 0x7fffffffe3d0: 0x00007fffffffe410 0x00000000004005cd 0x7fffffffe3e0: 0x0000000000000077 0x0000000000000088 0x7fffffffe3f0: 0x0000000000000099 0x0000000000000000 0x7fffffffe400: 0x0000000000400600 0x000002fd00400440 0x7fffffffe410: 0x00007fffffffe420 0x00000000004005ef 0x7fffffffe420: 0x0000000000000000 0x00007ffff7a3baf5 0x7fffffffe430: 0x0000002000000000 0x00007fffffffe508 (gdb) x86-64寄存器说明 rsp：对应32位esp寄存器，保存当前堆栈栈顶指针的寄存器 rbp：对应32位ebp寄存器，保存了当前堆栈基地址指针的寄存器 rax: 临时寄存器，当我们调用系统调用的时候，rax保外系统调用号 rdx：传递第3个参数到函数 rdi：传递第1个参数到函数 rsi：传递第2个参数到函数 rip: 下一个执行指令地址 参考 Calling_convention GDB and Reverse Debugging Assembly x86_64 programming for Linux ","permalink":"https://myself659.github.io/post/2016-03-09-x86-64-call-stack/","summary":"\u003ch3 id=\"前言\"\u003e前言\u003c/h3\u003e\n\u003cp\u003e动手实践并写文章花5倍的时间一次性把事情做到90分，好过读别人文章只能做到60分，后面还需要花时间继续深入学习(做事情一定要做到有效的阈值)。本文目的希望通过分析一个简单的函数调用加深对x86-64寄存器及栈帧的结构的认识，以便在定位问题需要的时候能够熟练运用。\u003c/p\u003e","title":"Linux x86-64 函数调用栈实例分析"},{"content":"其实以前也有类似的想法，但是决定写这篇文章是由下面一件事情引起的。\n引子 同事自已造轮子要实现一个rtmp协议，在调试过程由于有一个问题有没有解决，影响团队的联调，对于他造主动造轮子，我是不支持的。重复实现一个完整的rtmp协议，会走很多坑的，需要花费较多的时间，而开源的librtmp已经实现完整的rtmp协议功能，我决定将librtmp协议移植到现在系统。\n接着就自己开始干，了解librtmp实现，动手写一个利用librtmp支持epoll的rtmpserver。 在调试过程出现rtmp握手失败的问题，初看定位无果的情况下，我修改了makefile，生成调试的符号表，同时打开调试开关。这些弄好之后，试了一下，没有我期待的符号表与调试信息。\n于是我怀疑自己对makefile是否正确。重新学习makefile与编译的一些知识还是无果，觉得makefile修改是正确的。这时候灵光一现，看看进程加载的是哪些lib\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 (gdb) info sharedlibrary From To Syms Read Shared Object Library 0x0000003a74600b00 0x0000003a746198db Yes (*) /lib64/ld-linux-x86-64.so.2 0x00007ffff7dd57e0 0x00007ffff7de4358 Yes (*) /usr/local/lib/librtmp.so.1 #加载的librtmp库 0x0000003c39a18340 0x0000003c39a53558 Yes (*) /usr/lib64/libssl.so.10 0x0000003c39669cc0 0x0000003c3975dbe8 Yes (*) /usr/lib64/libcrypto.so.10 0x0000003a76602120 0x0000003a7660d3a8 Yes (*) /lib64/libz.so.1 0x0000003a74a1ea20 0x0000003a74b3f76c Yes (*) /lib64/libc.so.6 0x0000003a8260ac30 0x0000003a82638728 Yes (*) /lib64/libgssapi_krb5.so.2 0x0000003a8161b430 0x0000003a81694a78 Yes (*) /lib64/libkrb5.so.3 0x0000003a806013f0 0x0000003a80601fc8 Yes (*) /lib64/libcom_err.so.2 0x0000003a812043d0 0x0000003a8121d5a8 Yes (*) /lib64/libk5crypto.so.3 0x0000003a74e00de0 0x0000003a74e01998 Yes (*) /lib64/libdl.so.2 0x0000003a80a02a40 0x0000003a80a080c8 Yes (*) /lib64/libkrb5support.so.0 0x0000003a80e00bf0 0x0000003a80e011d8 Yes (*) /lib64/libkeyutils.so.1 0x0000003a76a03930 0x0000003a76a12938 Yes (*) /lib64/libresolv.so.2 0x0000003a75205660 0x0000003a75210eb8 Yes (*) /lib64/libpthread.so.0 0x0000003a76205850 0x0000003a76215cc8 Yes (*) /lib64/libselinux.so.1 (*): Shared library is missing debugging information. (gdb) 看到上面的一幕，犯了这样的错误：改对了代码，却没有更新lib\n反思 在现实的开发过程中常常碰到下面的情行：\n场景1： “我修改了代码，代码也改好，怎么还是这样的？”\n场景2： “在我的环境下，测试ok，怎么在你的环境就不行了呢？”\n场景3： “前几天运行都ok的，怎么现在不对了？”\n场景4： “以前上线都没事，这次同样的操作却没有成功”\n场景5： \u0026ldquo;原来从业务角度出发，可以设计，确实不要那么麻烦\u0026rdquo;\n以上这些问题，很大一部分因素我们只考虑到代码本身而已，还没有考虑代码的深层次问题，也没有考虑代码与业务的关联，在实际系统中很多问题一部分原因也是因为深层上没有了解代码的本质或者没有吃透业务对代码的要求。\n代码是核心，但不仅仅是代码，还有下面几个方面需要考虑：\n代码的本质 测试验证 系统设计 业务需求 部署需求 监控需求 升级问题 团队合作 安全问题 对此，个人大胆划分四个层次：\n码农，以码为主，停留在代码上，关注代码与算法（如果有足够的天赋研究像人工智能这样的顶级算法，请继续深入研究）\n工程师，以解决具体业务为主，代码作为业务的实现，关注的业务与需求，能够实现技术持续性满足小范围内的业务需求\n架构师，考虑上述各个方面，从需求，设计，实现，部署，演进等各个阶段满足具体一个产品的技术需求，除此之外，主动思考技术对业务的发展的支撑\n技术总监，CXO，创始人，这一层次就不YY了\n后记 需要强调的一点：作为程序员写好代码是第一要务，本文强调写好代码的基础上，要从深度与广度角度思考代码与审视代码，这样让自己不停留在代码层面，让自己不仅能技术上取得进步，更能让技术上的进步转化为业务上的价值\n自己接下来的重点，除了继续提高自已技术能力，另一个重点加强对业务的学习与研究，用技术更快，更好地满足业务需求\n(PS：起了标题，希望后面能够有更深的感悟，写得更具体一些)\n","permalink":"https://myself659.github.io/post/2016-03-05-do-more-than-coding/","summary":"\u003cp\u003e其实以前也有类似的想法，但是决定写这篇文章是由下面一件事情引起的。\u003c/p\u003e\n\u003ch3 id=\"引子\"\u003e引子\u003c/h3\u003e\n\u003cp\u003e同事自已造轮子要实现一个rtmp协议，在调试过程由于有一个问题有没有解决，影响团队的联调，对于他造主动造轮子，我是不支持的。重复实现一个完整的rtmp协议，会走很多坑的，需要花费较多的时间，而开源的librtmp已经实现完整的rtmp协议功能，我决定将librtmp协议移植到现在系统。\u003c/p\u003e","title":"代码是核心，但不仅仅是代码"},{"content":"搭建了docker环境，就来体验一下Docker，常用docker image命令如下：\n1. 搜索docker image 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 root@localhost ~]# docker search ubuntu NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Ubuntu is a Debian-based Linux operating s... 2954 [OK] ubuntu-upstart Upstart is an event-based replacement for ... 58 [OK] dorowu/ubuntu-desktop-lxde-vnc Ubuntu with openssh-server and NoVNC on po... 32 [OK] torusware/speedus-ubuntu Always updated official Ubuntu docker imag... 25 [OK] ubuntu-debootstrap debootstrap --variant=minbase --components... 22 [OK] tleyden5iwx/ubuntu-cuda Ubuntu 14.04 with CUDA drivers pre-installed 18 [OK] rastasheep/ubuntu-sshd Dockerized SSH service, built on top of of... 16 [OK] consol/ubuntu-xfce-vnc Ubuntu container with \u0026#34;headless\u0026#34; VNC sessi... 8 [OK] ioft/armhf-ubuntu [ABR] Ubuntu Docker images for the ARMv7(a... 7 [OK] n3ziniuka5/ubuntu-oracle-jdk Ubuntu with Oracle JDK. Check tags for ver... 7 [OK] nuagebec/ubuntu Simple always updated Ubuntu docker images... 4 [OK] nickistre/ubuntu-lamp-wordpress LAMP on Ubuntu with wp-cli installed 3 [OK] nimmis/ubuntu This is a docker images different LTS vers... 3 [OK] maxexcloo/ubuntu Docker base image built on Ubuntu with Sup... 2 [OK] sylvainlasnier/ubuntu Ubuntu 15.10 root docker images with commo... 1 [OK] isuper/base-ubuntu This is just a small and clean base Ubuntu... 1 [OK] densuke/ubuntu-jp-remix Ubuntu Linuxの日本語remix風味です 1 [OK] seetheprogress/ubuntu Ubuntu image provided by seetheprogress us... 1 [OK] nickistre/ubuntu-lamp LAMP server on Ubuntu 1 [OK] teamrock/ubuntu TeamRock\u0026#39;s Ubuntu image configured with AW... 0 [OK] konstruktoid/ubuntu Ubuntu base image 0 [OK] birkof/ubuntu Ubuntu 14.04 LTS (Trusty Tahr) 0 [OK] zoni/ubuntu 0 [OK] esycat/ubuntu Ubuntu LTS 0 [OK] rallias/ubuntu Ubuntu with the needful 0 2. 下载image 1 docker pull 3. 查看image 1 2 3 4 5 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu latest d55e68e6cc9c 4 weeks ago 187.9 MB ubuntu 14.04 d55e68e6cc9c 4 weeks ago 187.9 MB training/sinatra latest f0f4ab557f95 19 months ago 447 MB 4. 删除image 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [root@localhost ~]# docker rm training/sinatra Error response from daemon: no such id: training/sinatra Error: failed to remove containers: [training/sinatra] [root@localhost ~]# docker rm f0f4ab557f95 Error response from daemon: no such id: f0f4ab557f95 Error: failed to remove containers: [f0f4ab557f95] [root@localhost ~]# docker rmi f0f4ab557f95 Untagged: training/sinatra:latest Deleted: f0f4ab557f954f3e04177663a3af90e88641bcdcce1f02ac900dbd9768ef4945 Deleted: 79e6bf39f99322cc062a79bec4a09de0dd19cb7f5f735b4b6b7832c04b13bb45 Deleted: ce80548340bb03726d391bb8fa4d134f8418c2fff90be9a7323560debdea9bd2 Deleted: e809f156dc985e07105fdc86ec05eb03eb7aac8636dc210e8595d31b55787f4a Deleted: bfab314f3b766eddf9778f8dce089f44e84ea028f4a44ce68740dce81a844ec8 Deleted: be88c4c27e80023b6aea82f0f2e15fb21c6f4193fe814e5b58010d356dd7846b Deleted: 3e76c0a80540a0d36493ae7110796fc92f559a191454e3ac19c1d4c650bdd9e0 Deleted: 511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158 You have new mail in /var/spool/mail/root [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu latest af88597ec24b 6 days ago 187.9 MB ubuntu 14.04 d55e68e6cc9c 4 weeks ago 187.9 MB 5. 运行image 1 [root@localhost ~]# docker run -i -t apache2 6. kill运行的docker image 1 2 3 4 5 6 7 8 9 10 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 68333b272b52 ubuntu \u0026#34;/bin/bash\u0026#34; 18 minutes ago Up 18 minutes clever_babbage 0ca2aff5b94b ubuntu \u0026#34;bash\u0026#34; 48 minutes ago Up 48 minutes focused_hypatia You have new mail in /var/spool/mail/root [root@localhost ~]# docker kill 68333b272b52 68333b272b52 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0ca2aff5b94b ubuntu \u0026#34;bash\u0026#34; 54 minutes ago Up 54 minutes focused_hypatia 7. 制作image 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@localhost tmp]# more Dockerfile FROM apache2 RUN apt-get install -y wget [root@localhost tmp]# docker build -t wget . Sending build context to Docker daemon 2.609 MB Sending build context to Docker daemon Step 0 : FROM apache2 ---\u0026gt; f5cf247f22af Step 1 : RUN apt-get install -y wget ---\u0026gt; Running in ab3cd326c53c [root@localhost tmp]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE wget latest be8bf51f39d5 29 seconds ago 229.1 MB apache2 latest f5cf247f22af 5 hours ago 223.8 MB ubuntu latest af88597ec24b 6 days ago 187.9 MB ubuntu 14.04 d55e68e6cc9c 4 weeks ago 187.9 MB 8. docker volume clean 1 docker system prune --all --volumes --force ","permalink":"https://myself659.github.io/post/k8s/2016-01-28-docker-cmd-pratice/","summary":"\u003cp\u003e搭建了docker环境，就来体验一下Docker，常用docker image命令如下：\u003c/p\u003e\n\u003ch3 id=\"1-搜索docker-image\"\u003e1. 搜索docker image\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003elocalhost\u003c/span\u003e \u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"c1\"\u003e# docker search ubuntu  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eNAME\u003c/span\u003e                              \u003cspan class=\"n\"\u003eDESCRIPTION\u003c/span\u003e                                     \u003cspan class=\"n\"\u003eSTARS\u003c/span\u003e     \u003cspan class=\"n\"\u003eOFFICIAL\u003c/span\u003e   \u003cspan class=\"n\"\u003eAUTOMATED\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e                            \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003eDebian\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ebased\u003c/span\u003e \u003cspan class=\"n\"\u003eLinux\u003c/span\u003e \u003cspan class=\"n\"\u003eoperating\u003c/span\u003e \u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e   \u003cspan class=\"mi\"\u003e2954\u003c/span\u003e      \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e       \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eupstart\u003c/span\u003e                    \u003cspan class=\"n\"\u003eUpstart\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003ean\u003c/span\u003e \u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ebased\u003c/span\u003e \u003cspan class=\"n\"\u003ereplacement\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"o\"\u003e...\u003c/span\u003e   \u003cspan class=\"mi\"\u003e58\u003c/span\u003e        \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e       \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edorowu\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edesktop\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elxde\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003evnc\u003c/span\u003e    \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003eopenssh\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003eNoVNC\u003c/span\u003e \u003cspan class=\"n\"\u003eon\u003c/span\u003e \u003cspan class=\"n\"\u003epo\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e   \u003cspan class=\"mi\"\u003e32\u003c/span\u003e                   \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003etorusware\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003espeedus\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e          \u003cspan class=\"n\"\u003eAlways\u003c/span\u003e \u003cspan class=\"n\"\u003eupdated\u003c/span\u003e \u003cspan class=\"n\"\u003eofficial\u003c/span\u003e \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"n\"\u003edocker\u003c/span\u003e \u003cspan class=\"n\"\u003eimag\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e   \u003cspan class=\"mi\"\u003e25\u003c/span\u003e                   \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edebootstrap\u003c/span\u003e                \u003cspan class=\"n\"\u003edebootstrap\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003evariant\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eminbase\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ecomponents\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e   \u003cspan class=\"mi\"\u003e22\u003c/span\u003e        \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e       \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003etleyden5iwx\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecuda\u003c/span\u003e           \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"mf\"\u003e14.04\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003eCUDA\u003c/span\u003e \u003cspan class=\"n\"\u003edrivers\u003c/span\u003e \u003cspan class=\"n\"\u003epre\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003einstalled\u003c/span\u003e    \u003cspan class=\"mi\"\u003e18\u003c/span\u003e                   \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003erastasheep\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003esshd\u003c/span\u003e            \u003cspan class=\"n\"\u003eDockerized\u003c/span\u003e \u003cspan class=\"n\"\u003eSSH\u003c/span\u003e \u003cspan class=\"n\"\u003eservice\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebuilt\u003c/span\u003e \u003cspan class=\"n\"\u003eon\u003c/span\u003e \u003cspan class=\"n\"\u003etop\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e   \u003cspan class=\"mi\"\u003e16\u003c/span\u003e                   \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003econsol\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003exfce\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003evnc\u003c/span\u003e            \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"n\"\u003econtainer\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;headless\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eVNC\u003c/span\u003e \u003cspan class=\"n\"\u003esessi\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e   \u003cspan class=\"mi\"\u003e8\u003c/span\u003e                    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eioft\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003earmhf\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e                 \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eABR\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"n\"\u003eDocker\u003c/span\u003e \u003cspan class=\"n\"\u003eimages\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003eARMv7\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e   \u003cspan class=\"mi\"\u003e7\u003c/span\u003e                    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003en3ziniuka5\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eoracle\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ejdk\u003c/span\u003e      \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003eOracle\u003c/span\u003e \u003cspan class=\"n\"\u003eJDK\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eCheck\u003c/span\u003e \u003cspan class=\"n\"\u003etags\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ever\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e   \u003cspan class=\"mi\"\u003e7\u003c/span\u003e                    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enuagebec\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e                   \u003cspan class=\"n\"\u003eSimple\u003c/span\u003e \u003cspan class=\"n\"\u003ealways\u003c/span\u003e \u003cspan class=\"n\"\u003eupdated\u003c/span\u003e \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"n\"\u003edocker\u003c/span\u003e \u003cspan class=\"n\"\u003eimages\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e   \u003cspan class=\"mi\"\u003e4\u003c/span\u003e                    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enickistre\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elamp\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ewordpress\u003c/span\u003e   \u003cspan class=\"n\"\u003eLAMP\u003c/span\u003e \u003cspan class=\"n\"\u003eon\u003c/span\u003e \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003ewp\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecli\u003c/span\u003e \u003cspan class=\"n\"\u003einstalled\u003c/span\u003e            \u003cspan class=\"mi\"\u003e3\u003c/span\u003e                    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enimmis\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e                     \u003cspan class=\"n\"\u003eThis\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003edocker\u003c/span\u003e \u003cspan class=\"n\"\u003eimages\u003c/span\u003e \u003cspan class=\"n\"\u003edifferent\u003c/span\u003e \u003cspan class=\"n\"\u003eLTS\u003c/span\u003e \u003cspan class=\"n\"\u003evers\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e   \u003cspan class=\"mi\"\u003e3\u003c/span\u003e                    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emaxexcloo\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e                  \u003cspan class=\"n\"\u003eDocker\u003c/span\u003e \u003cspan class=\"n\"\u003ebase\u003c/span\u003e \u003cspan class=\"n\"\u003eimage\u003c/span\u003e \u003cspan class=\"n\"\u003ebuilt\u003c/span\u003e \u003cspan class=\"n\"\u003eon\u003c/span\u003e \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003eSup\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e   \u003cspan class=\"mi\"\u003e2\u003c/span\u003e                    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esylvainlasnier\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e             \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"mf\"\u003e15.10\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e \u003cspan class=\"n\"\u003edocker\u003c/span\u003e \u003cspan class=\"n\"\u003eimages\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003ecommo\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e   \u003cspan class=\"mi\"\u003e1\u003c/span\u003e                    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eisuper\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ebase\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e                \u003cspan class=\"n\"\u003eThis\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003ejust\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003esmall\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003eclean\u003c/span\u003e \u003cspan class=\"n\"\u003ebase\u003c/span\u003e \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e   \u003cspan class=\"mi\"\u003e1\u003c/span\u003e                    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edensuke\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ejp\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eremix\u003c/span\u003e           \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"n\"\u003eLinuxの日本語remix風味です\u003c/span\u003e                       \u003cspan class=\"mi\"\u003e1\u003c/span\u003e                    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eseetheprogress\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e             \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"n\"\u003eimage\u003c/span\u003e \u003cspan class=\"n\"\u003eprovided\u003c/span\u003e \u003cspan class=\"n\"\u003eby\u003c/span\u003e \u003cspan class=\"n\"\u003eseetheprogress\u003c/span\u003e \u003cspan class=\"n\"\u003eus\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e   \u003cspan class=\"mi\"\u003e1\u003c/span\u003e                    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enickistre\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elamp\u003c/span\u003e             \u003cspan class=\"n\"\u003eLAMP\u003c/span\u003e \u003cspan class=\"n\"\u003eserver\u003c/span\u003e \u003cspan class=\"n\"\u003eon\u003c/span\u003e \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e                           \u003cspan class=\"mi\"\u003e1\u003c/span\u003e                    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eteamrock\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e                   \u003cspan class=\"n\"\u003eTeamRock\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;s Ubuntu image configured with AW...   0                    [OK]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ekonstruktoid\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e               \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"n\"\u003ebase\u003c/span\u003e \u003cspan class=\"n\"\u003eimage\u003c/span\u003e                               \u003cspan class=\"mi\"\u003e0\u003c/span\u003e                    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ebirkof\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e                     \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"mf\"\u003e14.04\u003c/span\u003e \u003cspan class=\"n\"\u003eLTS\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eTrusty\u003c/span\u003e \u003cspan class=\"n\"\u003eTahr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e                  \u003cspan class=\"mi\"\u003e0\u003c/span\u003e                    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ezoni\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e                                                                       \u003cspan class=\"mi\"\u003e0\u003c/span\u003e                    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eesycat\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e                     \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"n\"\u003eLTS\u003c/span\u003e                                      \u003cspan class=\"mi\"\u003e0\u003c/span\u003e                    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003erallias\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e                    \u003cspan class=\"n\"\u003eUbuntu\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003eneedful\u003c/span\u003e                         \u003cspan class=\"mi\"\u003e0\u003c/span\u003e     \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"2-下载image\"\u003e2. 下载image\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker pull  \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"3-查看image\"\u003e3. 查看image\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@localhost ~]# docker images\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eREPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eubuntu              latest              d55e68e6cc9c        4 weeks ago         187.9 MB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eubuntu              14.04               d55e68e6cc9c        4 weeks ago         187.9 MB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etraining/sinatra    latest              f0f4ab557f95        19 months ago       447 MB\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"4-删除image\"\u003e4. 删除image\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003elocalhost\u003c/span\u003e \u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"c1\"\u003e# docker  rm   training/sinatra\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eError\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse\u003c/span\u003e \u003cspan class=\"n\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003edaemon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eno\u003c/span\u003e \u003cspan class=\"n\"\u003esuch\u003c/span\u003e \u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003etraining\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esinatra\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003efailed\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003eremove\u003c/span\u003e \u003cspan class=\"n\"\u003econtainers\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003etraining\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esinatra\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003elocalhost\u003c/span\u003e \u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"c1\"\u003e# docker rm   f0f4ab557f95\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eError\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse\u003c/span\u003e \u003cspan class=\"n\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003edaemon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eno\u003c/span\u003e \u003cspan class=\"n\"\u003esuch\u003c/span\u003e \u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ef0f4ab557f95\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003efailed\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003eremove\u003c/span\u003e \u003cspan class=\"n\"\u003econtainers\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ef0f4ab557f95\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003elocalhost\u003c/span\u003e \u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"c1\"\u003e# docker rmi   f0f4ab557f95\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eUntagged\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003etraining\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esinatra\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003elatest\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eDeleted\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ef0f4ab557f954f3e04177663a3af90e88641bcdcce1f02ac900dbd9768ef4945\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eDeleted\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e79e6\u003c/span\u003e\u003cspan class=\"n\"\u003ebf39f99322cc062a79bec4a09de0dd19cb7f5f735b4b6b7832c04b13bb45\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eDeleted\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ece80548340bb03726d391bb8fa4d134f8418c2fff90be9a7323560debdea9bd2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eDeleted\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ee809f156dc985e07105fdc86ec05eb03eb7aac8636dc210e8595d31b55787f4a\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eDeleted\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ebfab314f3b766eddf9778f8dce089f44e84ea028f4a44ce68740dce81a844ec8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eDeleted\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ebe88c4c27e80023b6aea82f0f2e15fb21c6f4193fe814e5b58010d356dd7846b\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eDeleted\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e3e76\u003c/span\u003e\u003cspan class=\"n\"\u003ec0a80540a0d36493ae7110796fc92f559a191454e3ac19c1d4c650bdd9e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eDeleted\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e511136\u003c/span\u003e\u003cspan class=\"n\"\u003eea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eYou\u003c/span\u003e \u003cspan class=\"n\"\u003ehave\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003email\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003espool\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003email\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003elocalhost\u003c/span\u003e \u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"c1\"\u003e# docker   images\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eREPOSITORY\u003c/span\u003e          \u003cspan class=\"n\"\u003eTAG\u003c/span\u003e                 \u003cspan class=\"n\"\u003eIMAGE\u003c/span\u003e \u003cspan class=\"n\"\u003eID\u003c/span\u003e            \u003cspan class=\"n\"\u003eCREATED\u003c/span\u003e             \u003cspan class=\"n\"\u003eVIRTUAL\u003c/span\u003e \u003cspan class=\"n\"\u003eSIZE\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e              \u003cspan class=\"n\"\u003elatest\u003c/span\u003e              \u003cspan class=\"n\"\u003eaf88597ec24b\u003c/span\u003e        \u003cspan class=\"mi\"\u003e6\u003c/span\u003e \u003cspan class=\"n\"\u003edays\u003c/span\u003e \u003cspan class=\"n\"\u003eago\u003c/span\u003e          \u003cspan class=\"mf\"\u003e187.9\u003c/span\u003e \u003cspan class=\"n\"\u003eMB\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e              \u003cspan class=\"mf\"\u003e14.04\u003c/span\u003e               \u003cspan class=\"n\"\u003ed55e68e6cc9c\u003c/span\u003e        \u003cspan class=\"mi\"\u003e4\u003c/span\u003e \u003cspan class=\"n\"\u003eweeks\u003c/span\u003e \u003cspan class=\"n\"\u003eago\u003c/span\u003e         \u003cspan class=\"mf\"\u003e187.9\u003c/span\u003e \u003cspan class=\"n\"\u003eMB\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"5-运行image\"\u003e5. 运行image\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@localhost ~]# docker  run   -i     -t      apache2   \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"6--kill运行的docker-image\"\u003e6.  kill运行的docker image\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003elocalhost\u003c/span\u003e \u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"c1\"\u003e# docker  ps  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eCONTAINER\u003c/span\u003e \u003cspan class=\"n\"\u003eID\u003c/span\u003e        \u003cspan class=\"n\"\u003eIMAGE\u003c/span\u003e               \u003cspan class=\"n\"\u003eCOMMAND\u003c/span\u003e             \u003cspan class=\"n\"\u003eCREATED\u003c/span\u003e             \u003cspan class=\"n\"\u003eSTATUS\u003c/span\u003e              \u003cspan class=\"n\"\u003ePORTS\u003c/span\u003e               \u003cspan class=\"n\"\u003eNAMES\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e68333\u003c/span\u003e\u003cspan class=\"n\"\u003eb272b52\u003c/span\u003e        \u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e              \u003cspan class=\"s2\"\u003e\u0026#34;/bin/bash\u0026#34;\u003c/span\u003e         \u003cspan class=\"mi\"\u003e18\u003c/span\u003e \u003cspan class=\"n\"\u003eminutes\u003c/span\u003e \u003cspan class=\"n\"\u003eago\u003c/span\u003e      \u003cspan class=\"n\"\u003eUp\u003c/span\u003e \u003cspan class=\"mi\"\u003e18\u003c/span\u003e \u003cspan class=\"n\"\u003eminutes\u003c/span\u003e                           \u003cspan class=\"n\"\u003eclever_babbage\u003c/span\u003e      \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"n\"\u003eca2aff5b94b\u003c/span\u003e        \u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e              \u003cspan class=\"s2\"\u003e\u0026#34;bash\u0026#34;\u003c/span\u003e              \u003cspan class=\"mi\"\u003e48\u003c/span\u003e \u003cspan class=\"n\"\u003eminutes\u003c/span\u003e \u003cspan class=\"n\"\u003eago\u003c/span\u003e      \u003cspan class=\"n\"\u003eUp\u003c/span\u003e \u003cspan class=\"mi\"\u003e48\u003c/span\u003e \u003cspan class=\"n\"\u003eminutes\u003c/span\u003e                           \u003cspan class=\"n\"\u003efocused_hypatia\u003c/span\u003e     \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eYou\u003c/span\u003e \u003cspan class=\"n\"\u003ehave\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003email\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003espool\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003email\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003elocalhost\u003c/span\u003e \u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"c1\"\u003e# docker   kill   68333b272b52\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e68333\u003c/span\u003e\u003cspan class=\"n\"\u003eb272b52\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003elocalhost\u003c/span\u003e \u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"c1\"\u003e# docker    ps  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eCONTAINER\u003c/span\u003e \u003cspan class=\"n\"\u003eID\u003c/span\u003e        \u003cspan class=\"n\"\u003eIMAGE\u003c/span\u003e               \u003cspan class=\"n\"\u003eCOMMAND\u003c/span\u003e             \u003cspan class=\"n\"\u003eCREATED\u003c/span\u003e             \u003cspan class=\"n\"\u003eSTATUS\u003c/span\u003e              \u003cspan class=\"n\"\u003ePORTS\u003c/span\u003e               \u003cspan class=\"n\"\u003eNAMES\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"n\"\u003eca2aff5b94b\u003c/span\u003e        \u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e              \u003cspan class=\"s2\"\u003e\u0026#34;bash\u0026#34;\u003c/span\u003e              \u003cspan class=\"mi\"\u003e54\u003c/span\u003e \u003cspan class=\"n\"\u003eminutes\u003c/span\u003e \u003cspan class=\"n\"\u003eago\u003c/span\u003e      \u003cspan class=\"n\"\u003eUp\u003c/span\u003e \u003cspan class=\"mi\"\u003e54\u003c/span\u003e \u003cspan class=\"n\"\u003eminutes\u003c/span\u003e                           \u003cspan class=\"n\"\u003efocused_hypatia\u003c/span\u003e     \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"7-制作image\"\u003e7. 制作image\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@localhost tmp]# more  Dockerfile\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFROM apache2  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRUN  apt-get   install  -y  wget\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@localhost tmp]# docker   build    -t wget .\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSending build context to Docker daemon 2.609 MB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSending build context to Docker daemon\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eStep 0 : FROM apache2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e ---\u0026gt; f5cf247f22af\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eStep 1 : RUN apt-get   install  -y  wget\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e ---\u0026gt; Running in ab3cd326c53c\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@localhost tmp]# docker   images\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eREPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget                latest              be8bf51f39d5        29 seconds ago      229.1 MB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapache2             latest              f5cf247f22af        5 hours ago         223.8 MB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eubuntu              latest              af88597ec24b        6 days ago          187.9 MB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eubuntu              14.04               d55e68e6cc9c        4 weeks ago         187.9 MB\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"8-docker-volume-clean\"\u003e8. docker volume clean\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker system prune --all --volumes --force\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"docker image命令实践"},{"content":"docker可以说是去年最热的技术，也是业界大谈特谈的技术，到了今年有很多公司已经将docker应用于自己的生产环境。Docker已经从一个工具转化成平台，小生态圈。作为一名程序员应该与时俱进，学习新技术，不断地提高自己。\n升级内核 docker要求linux内核版本3.12以上，作为常用linux2.26.32版本，虽然也可以安装docker，但是有一些特性不支持，所以第一步就是升级内核。个人选择最新的长期维护版本升级linux4.13,内核升级最关键的一件事情就是配置内核，关于内核支持docker的内核配置文件，如果不想自己动手配置内核，可以参考Linux-4.13-configfordocker;\n在未正确配置linux内核会出现以下一些错误：\ndocker启动过程中iptables命令执行失败，原因是 iptables模块没有配置 1 2 3 4 5 6 7 8 [root@localhost ~]# docker -d INFO[0000] Listening for HTTP on unix (/var/run/docker.sock) INFO[0000] [graphdriver] using prior storage driver \u0026#34;devicemapper\u0026#34; FATA[0000] Error starting daemon: Error initializing network controller: Error creating default \u0026#34;bridge\u0026#34; network: Failed to Setup IP tables: Unable to enable NAT rule: iptables failed: iptables -t nat -I POSTROUTING -s 172.17.42.1/16 ! -o docker0 -j MASQUERADE: iptables v1.4.7: can\u0026#39;t initialize iptables table `nat\u0026#39;: Table does not exist (do you need to insmod?) Perhaps iptables or your kernel needs to be upgraded. (exit status 3) You have new mail in /var/spool/mail/root [root@localhost ~]# cgroup创建失败，具体参考stackoverflow 1 2 3 4 [root@localhost ~]# service docker start Starting cgconfig service: Error: cannot mount memory to /cgroup/memory: No such file or directory /sbin/cgconfigparser; error loading /etc/cgconfig.conf: Cgroup mounting failed Failed to parse /etc/cgconfig.conf or /etc/cgconfig.d[FAILED] 具体内核升级过程参考如下：\n1 2 3 4 5 6 [root@localhost linux-4.1.13]# cp /share/github/docker-way/env/linux-4.1.3-configfordocker .config [root@localhost linux-4.1.13]# sh -c \u0026#39;yes \u0026#34;\u0026#34; | make oldconfig\u0026#39; [root@localhost linux-4.1.13]# make -j2 bzImage [root@localhost linux-4.1.13]# make -j2 modules [root@localhost linux-4.1.13]# make -j2 modules_install [root@localhost linux-4.1.13]# make install 检查grub配置，修改并将linux-4.13作为默认启动项，重启系统，系统启动成功后，查看内核版本：\n1 2 [root@localhost ~]# uname -a Linux localhost.localdomain 4.1.13 #1 SMP Sat Dec 5 11:17:50 CST 2015 x86_64 x86_64 x86_64 GNU/Linux 安装device-mapper 1 [root@localhost ~]#yum install -y device-mapper 安装docker 1 [root@localhost ~]# yum -y install docker-io 安装完成后，检查docker是否能够正确启动\n1 2 3 4 5 6 7 8 9 [root@localhost ~]# docker -d INFO[0000] [graphdriver] using prior storage driver \u0026#34;devicemapper\u0026#34; INFO[0000] Listening for HTTP on unix (/var/run/docker.sock) WARN[0000] Your kernel does not support swap memory limit. INFO[0000] Loading containers: start. INFO[0000] Loading containers: done. INFO[0000] Daemon has completed initialization INFO[0000] Docker daemon commit=786b29d execdriver=native-0.2 graphdriver=devicemapper version=1.7.1 没有错误，接下来可以开启一段docker学习之旅了!\n(更新)\nUninstall old versions 1 sudo apt-get remove docker docker-engine docker.io containerd runc install How To Install and Use Docker on Ubuntu 18.04\n","permalink":"https://myself659.github.io/post/k8s/2015-12-13-docker-way-1-build-docker-env/","summary":"\u003cp\u003edocker可以说是去年最热的技术，也是业界大谈特谈的技术，到了今年有很多公司已经将docker应用于自己的生产环境。Docker已经从一个工具转化成平台，小生态圈。作为一名程序员应该与时俱进，学习新技术，不断地提高自己。\u003c/p\u003e","title":"升级Linux内核，搭建docker环境"},{"content":"gdb是c/c++上调试利器，有很多技巧能让调试程序与解决问题更加方便与高效，下面关于command 命令的使用一个实例，具体如下：\n1. 设置断点 1 2 3 (gdb) b GenVedioSeekPoint Breakpoint 1 at 0x402e58: file GenIndex.cpp, line 140. (gdb) 2. 利用commad自定义断点操作 1 2 3 4 5 6 7 (gdb) command 1 Type commands for breakpoint(s) 1, one per line. End with a line saying just \u0026#34;end\u0026#34;. \u0026gt;p *pstPktHead \u0026gt;continue \u0026gt;end (gdb) 3. 设置gdb log信息输出到指定文件 1 2 3 4 5 (gdb) set logging file genindex.txt (gdb) set logging on Copying output to genindex.txt. (gdb) set pagination off (gdb) 4. 开始或继续执行程序 1 (gdb) run 有输出信息如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 ... Breakpoint 1, GenVedioSeekPoint (pstPktHead=0x7fffffdfdcff, offset=71678) at GenIndex.cpp:140 140 uiTimeStamp = pstPktHead-\u0026gt;stBlockHead.iTimeStamp; $253 = {cFlag = 170 \u0026#39;\\252\u0026#39;, uiPktLen = 236, uiPktSeq = 3418810467, sCheckNum = 1, cBlockCount = 27 \u0026#39;\\033\u0026#39;, stBlockHead = {cBlogTag = 90 \u0026#39;Z\u0026#39;, iTimeStamp = 14811476, iDatalen = 0}} Breakpoint 1, GenVedioSeekPoint (pstPktHead=0x7fffffdfddeb, offset=71914) at GenIndex.cpp:140 140 uiTimeStamp = pstPktHead-\u0026gt;stBlockHead.iTimeStamp; $254 = {cFlag = 170 \u0026#39;\\252\u0026#39;, uiPktLen = 155, uiPktSeq = 3962300516, sCheckNum = 1, cBlockCount = 59 \u0026#39;;\u0026#39;, stBlockHead = {cBlogTag = 90 \u0026#39;Z\u0026#39;, iTimeStamp = 9503060, iDatalen = 0}} Breakpoint 1, GenVedioSeekPoint (pstPktHead=0x7fffffdfde86, offset=72069) at GenIndex.cpp:140 140 uiTimeStamp = pstPktHead-\u0026gt;stBlockHead.iTimeStamp; $255 = {cFlag = 170 \u0026#39;\\252\u0026#39;, uiPktLen = 1959, uiPktSeq = 3774212197, sCheckNum = 257, cBlockCount = 125 \u0026#39;}\u0026#39;, stBlockHead = {cBlogTag = 90 \u0026#39;Z\u0026#39;, iTimeStamp = 127730004, iDatalen = 0}} ... 同时在gdb的运行程序的目录下生成genindex.txt文件，这样可以通过分析genindex.txt找问题的原因；同时整个执行的过程中不需要个人操作，在断点不断命中的情况下极大提高效率，如果是生产的环境，避免长时间占用进程，进而影响业务，\n5. 分析log文件 这一步你可以用shell，awk， sed，python等来分析genindex.txt文件内容\n","permalink":"https://myself659.github.io/post/2015-08-28-gdb-command-example/","summary":"\u003cp\u003egdb是c/c++上调试利器，有很多技巧能让调试程序与解决问题更加方便与高效，下面关于command 命令的使用一个实例，具体如下：\u003c/p\u003e\n\u003ch3 id=\"1-设置断点\"\u003e1. 设置断点\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e(gdb) b GenVedioSeekPoint\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBreakpoint 1 at 0x402e58: file GenIndex.cpp, line 140.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e(gdb) \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"2-利用commad自定义断点操作\"\u003e2. 利用commad自定义断点操作\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e(gdb) command  1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eType commands for breakpoint(s) 1, one per line.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEnd with a line saying just \u0026#34;end\u0026#34;.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt;p *pstPktHead\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt;continue \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt;end\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e(gdb) \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"3-设置gdb-log信息输出到指定文件\"\u003e3. 设置gdb log信息输出到指定文件\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e(gdb) set logging file genindex.txt \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e(gdb) set logging on\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCopying output to genindex.txt.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e(gdb) set pagination  off\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e(gdb)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"4-开始或继续执行程序\"\u003e4. 开始或继续执行程序\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e(gdb) run\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e有输出信息如下：\u003c/p\u003e","title":"gdb自定义断点操作"},{"content":"nginx是一个值得学习与研究的开源代码，写这篇文章主要目的是让自己能够能够从最简单的任务开始，通过写作促进自己一步一步地深入学习与分析nginx。本文是这个系列的第一篇，主要是记录自己实现一个自定义的模块hello的过程。\n1. 下载源码 下载nginx 1.8.0 源代码\n1 2 root@localhost github]# wget http://nginx.org/download/nginx-1.8.0.tar.gz root@localhost github]# tar zxf 2. 准备文件与代码 在nginx解压目录下，添加如下文件：\n1 2 3 4 5 6 7 8 9 10 [root@localhost nginx-1.8.0]# tree | more . |-- **addon** | `-- **hello** | |-- **config** | `-- **ngx_http_hello_module.c** |-- auto | |-- cc | | |-- acc | | |-- bcc 新增文件分析参考nginx-hello\n1 2 3 4 5 6 7 8 [root@localhost nginx-1.8.0]# grep -r ngx_addon_name /share/github/nginx-1.8.0 /share/github/nginx-1.8.0/auto/modules: echo \u0026#34; + $ngx_addon_name was configured\u0026#34; /share/github/nginx-1.8.0/addon/hello/config:ngx_addon_name=ngx_http_hello_module [root@localhost nginx-1.8.0]# [root@localhost nginx-1.8.0]# grep -r add-module /share/github/nginx-1.8.0 /share/github/nginx-1.8.0/auto/options: --add-module=*) NGX_ADDONS=\u0026#34;$NGX_ADDONS $value\u0026#34; ;; /share/github/nginx-1.8.0/auto/options: --add-module=PATH enable an external module 3. 编译与安装 编译三步走\n1 2 3 4 5 1. ./configure --add-module=/share/github/nginx-1.8.0/addon/hello 2. make 3. make install 4.测试 在/usr/local/nginx/conf/nginx.conf文件的http配置项下，添加如下内容：\n1 2 3 location =/hello{ hello; } 过程如下：\n1 2 3 4 5 6 7 [root@localhost ~]# nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@localhost ~]# service nginx restart Restarting nginx (via systemctl): [ OK ] [root@localhost nginx-1.8.0]# curl http://localhost/hello/ hello nginx! 另外也可以通过浏览器访问：http://serverip/hello\n如果出现不能打开，检查一下iptable 设置，在/etc/sysconfig/iptables增加下面一条配置，允许80端口通过：\n1 -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT 然后输入命令service iptables restart重启iptables服务，使新增配置生效\n5. 实例代码 本文代码请参考：nginx-hello\n本人水平有限，若有疏漏与错误，欢迎交流与指正。\n","permalink":"https://myself659.github.io/post/2015-08-08-nginx-pratice-1-add-hello-module/","summary":"\u003cp\u003enginx是一个值得学习与研究的开源代码，写这篇文章主要目的是让自己能够能够从最简单的任务开始，通过写作促进自己一步一步地深入学习与分析nginx。本文是这个系列的第一篇，主要是记录自己实现一个自定义的模块hello的过程。\u003c/p\u003e","title":"nginx实践-添加自定义模块hello"},{"content":"关于netstat netstat 命令用于显示各种网络相关信息，如网络连接，路由表，接口状态 (Interface Statistics)，masquerade 连接，多播成员 (Multicast Memberships) 等等。\n常用参数 -a (all)显示所有选项，默认不显示LISTEN相关\n-t (tcp)仅显示tcp相关选项\n-u (udp)仅显示udp相关选项\n-n 拒绝显示别名，能显示数字的全部转化成数字\n-l 仅列出有在 Listen (监听) 的服務状态\n-p 显示建立相关链接的程序名\n-r 显示路由信息，路由表\n-e 显示扩展信息，例如uid等\n-s 按各个协议进行统计\n-c 每隔一个固定时间，执行该netstat命令\n注意：LISTEN和LISTENING的状态只有用-a或者-l才能看到\n应用实例 1. 选项组合应用 命令：\n1 netstat -tlnp 说明：显示处于listen状态的tcp连接，并显示对应进程pid\n示例：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [root@localhost default]# netstat -tlnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1284/pure-ftpd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1022/sshd tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 1309/smbd tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 1309/smbd tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1298/redis-server tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 1002/memcached tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 31604/nginx tcp 0 0 :::21 :::* LISTEN 1284/pure-ftpd tcp 0 0 :::22 :::* LISTEN 1022/sshd 2. 显示网关地址 命令：\n1 netstat -rn | grep UG | tr -s \u0026#34; \u0026#34; | cut -d \u0026#34; \u0026#34; -f2 说明：先显示路由信息，找出网关所对应表项，删除多余的空格并显示第二个表项field\n示例：\n1 2 3 [root@localhost default]# netstat -rn | grep UG | tr -s \u0026#34; \u0026#34; | cut -d \u0026#34; \u0026#34; -f2 192.168.20.1 3.统计tcp各种连接状态的个数 命令：\n1 netstat -n | awk \u0026#39;/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]} 说明：显示连接信息，通过awk统计各tcp状态连接个数\n示例：\n1 2 3 4 [root@localhost default]#netstat -n | awk \u0026#39;/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]} ESTABLISHED 516 TIME_WAIT 14 4.显示所有tcp监听端口 命令：\n1 netstat -lnt | awk \u0026#39;{print $4}\u0026#39; | cut -f2 -d: | grep -o \u0026#39;[0-9]*\u0026#39; 说明：\n示例：显示处于listen状态的tcp连接，打印每行第4个域元素，并以:作为该域的内部分隔符，同时显示其中第二个域元素，对结果进行过滤，只显示数字部分\n1 2 3 4 5 6 7 8 9 [root@localhost default]# netstat -lnt | awk \u0026#39;{print $4}\u0026#39; | cut -f2 -d: | grep -o \u0026#39;[0-9]*\u0026#39; 21 22 445 139 6379 11211 80 5.统计每个IP连接数 命令：\n1 netstat -anp |grep \u0026#39;tcp\\|udp\u0026#39; | awk \u0026#39;{print $5}\u0026#39; | sed s/::ffff:// | cut -d: -f1 | sort | uniq -c | sort -n 说明：显示所有网络连接并从中过滤出tcp与udp连接，打印这些连接表项的第5个域元素，删除包含/::ffff:的表项，以：为分隔符显示剩下的内容的第一个域元素，再进行排序并统计个数，最后以数值排列显示结果\n示例：\n1 2 3 4 5 [root@localhost default]# netstat -anp |grep \u0026#39;tcp\\|udp\u0026#39; | awk \u0026#39;{print $5}\u0026#39; | sed s/::ffff:// | cut -d: -f1 | sort | uniq -c | sort -n 3 192.168.70.36 8 0.0.0.0 6.查看80端口的连接，并排序 命令：\n1 netstat -ant | grep “:80″ | grep ESTABLISHED | awk ‘{printf “%s %s\\n”,$5,$6}’ | sort 说明： 不解释了，你懂的\n示例：\n未完，待续\n","permalink":"https://myself659.github.io/post/2015-07-28-linux-netstat/","summary":"\u003ch3 id=\"关于netstat\"\u003e关于netstat\u003c/h3\u003e\n\u003cp\u003enetstat 命令用于显示各种网络相关信息，如网络连接，路由表，接口状态 (Interface Statistics)，masquerade 连接，多播成员 (Multicast Memberships) 等等。\u003c/p\u003e\n\u003ch3 id=\"常用参数\"\u003e常用参数\u003c/h3\u003e\n\u003cp\u003e-a (all)显示所有选项，默认不显示LISTEN相关\u003c/p\u003e","title":"Linux netstat 应用示例"},{"content":"启发思考 在什么重要问题上你与其他有不同的看法？ 除了书中讲到参考模式:太多数人相信X，但是事实却是X的对立面；世界是多样的，我们应当追求正确的差异化\n企业失败的共同的原因 企业失败的原因却是相同：它们都无法逃脱竞争\n应对趋势潮流 最反主流的行动不是抵制潮流，而是在潮流中不丢弃自己的独立思考\n从0到1vs从1到N 从0到1是创新，创造；从1到N是创新成果应用及商业化\n###关于团队\n现金奖励不是王道，股票报酬才能让员工全力以赴 那些决定命运的基础元素：合伙人，早期团队成员 所有权，经营权，控制权 招聘要求：有才华+真正喜欢与团队合作及一起成长的意愿 特立独行的创始人 ###关于销售 这一部分内容作者回答一系列问题：\n销售是什么？ 产品离不开销售，销售是产品设计的一部分；销售是隐形的，销售人员第一要务是说服而不是真诚\n谁是销售对象？ 品牌无界限，销售对象除了产品与服务的潜在用户，还要社会，媒体销售公司，建立品牌\n谁是销售员？ 不论是员工，创始人，还是投资者，都应该是销售，无人不销售，无时不销售\n怎么进行销售？ 常用销售方法：复杂销售，人员销售，市场营销和广告，病毒式营销，粉丝营销；\n销售的法则？ 选择一个最有效的销售方法或者销售渠道\n绿色能源与特斯拉 绿色能源与特斯拉是《从0到1》这本书倒数是第二章，这一章是对前面章节讲到竞争，团队，未来，销售等观点在具体行业与具体公司的具体应用的一个展示，有意创业，投资或者像我有时仅好分析一个企业的人，可以细细口味。\n这一章节提到的七个必须回答的问题，可以作为分析一家企业的checklist问题，具体如下：\n工程问题： 你的技术具有突破性，而不是仅仅是稍有改进吗？\n时机问题： 现在开创事业，时机合适吗？\n垄断问题： 开创之初，是在一个小市场抢占大份额吗？\n人员问题： 你有合适的团队吗？\n销售问题： 除了创造产品，你有没有办法销售产品？\n持久问题: 未来10年或者20年，你能保住自己的市场地位吗？\n秘密问题： 你有没有找到一个其他人没有发现的独特机会？\n总之，Peter_Thiel作为一个成功的创业家和投资家，《从0到1 开启商业与未来的秘密》为我们讲了很多干货，作者分享了很多真知灼见，值得阅读与学习。\n相关参考 Peter_Thiel palantir ","permalink":"https://myself659.github.io/post/2015-07-03-thought-about-zero-to-one/","summary":"\u003ch3 id=\"启发思考\"\u003e启发思考\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e在什么重要问题上你与其他有不同的看法？\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003e除了书中讲到参考模式:太多数人相信X，但是事实却是X的对立面；世界是多样的，我们应当追求正确的差异化\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003col\u003e\n\u003cli\u003e企业失败的共同的原因\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003e企业失败的原因却是相同：它们都无法逃脱竞争\u003c/p\u003e","title":"读书笔记：《从0到1---开启商业与未来的秘密》"},{"content":"题目 将一个无符号数N拆分为不多于M个数，使拆分的数之和等于N,条件：\nN \u0026gt;= M； N与M都是无符号整型数 求：一共有多少中拆分方法？\n分析 参考代码\n代码 代码实现计算拆分方法及打印拆分组合信息\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 #include \u0026lt;iostream\u0026gt; #include \u0026lt;stdint.h\u0026gt; using namespace std; class CSolution { private: uint32_t uiM; uint32_t uiN; uint32_t uiCount; uint32_t *puiRecord; public: CSolution(); CSolution(uint32_t uiM, uint32_t uiN); ~CSolution(); uint32_t GetCount() {return uiCount;} void PrintCombinations(); uint32_t CountNum(uint32_t uiM, uint32_t uiN);\tvoid GetCombination(uint32_t uiMin, uint32_t uiLeft, uint32_t uiGetNum, uint32_t uiTargetNum, uint32_t *puiRecord); }; CSolution::CSolution(uint32_t uiM,uint32_t uiN){ this-\u0026gt;uiM = uiM; this-\u0026gt;uiN = uiN; this-\u0026gt;puiRecord = new unsigned int [uiM]; this-\u0026gt;uiCount = CountNum(uiM, uiN); return ; } CSolution::CSolution() { uiM = 1; uiN = 1; puiRecord = new unsigned int [uiM]; uiCount = CountNum(uiM, uiN); return ; } CSolution::~CSolution() { delete [] puiRecord; return ; } uint32_t CSolution::CountNum(uint32_t uiM, uint32_t uiN) { if((0 == uiM) || (0 == uiN) || ( 1 == uiM) || ( 1 == uiN)) { return 1; } if(uiN \u0026lt; uiM) { return CountNum(uiN,uiN); } return CountNum(uiM - 1, uiN) + CountNum(uiM, uiN - uiM); }\t/* UINT uiMin 最小值 UINT uiLeft 剩下值 UINT uiGetNum 已拆分元素个数 UINT uiTargetNum\t需要拆分的个数 UINT *puiCombination 拆分组合首地址 */ void CSolution::GetCombination(uint32_t uiMin, uint32_t uiLeft, uint32_t uiGetNum, uint32_t uiTargetNum, uint32_t *puiRecord) { uint32_t i; uint32_t j; /*递归结束条件 */ if(1 == uiTargetNum) { cout \u0026lt;\u0026lt; uiLeft\u0026lt;\u0026lt;endl; return ; } /* 将剩下值拆分为多个数,除了最后一个拆分值，其他的拆分数都应小于等于uiLeft/2 */ for(i = uiMin; i \u0026lt;= uiLeft / 2; i++) { puiRecord[uiGetNum] = i; uiGetNum++; if(uiGetNum + 1 == uiTargetNum) { puiRecord[uiGetNum] = uiLeft - i; for(j = 0; j \u0026lt; uiTargetNum; j++) { cout \u0026lt;\u0026lt;puiRecord[j]\u0026lt;\u0026lt; \u0026#34; \u0026#34;; } cout \u0026lt;\u0026lt; endl; } else { GetCombination(i, uiLeft - i, uiGetNum, uiTargetNum, puiRecord); } uiGetNum--; } return ;\t} void CSolution::PrintCombinations() { uint32_t i; cout\u0026lt;\u0026lt;\u0026#34;print combinations as follow:\u0026#34;\u0026lt;\u0026lt;endl; for(i = 1; i \u0026lt;= uiM; i++) { GetCombination(1, uiN, 0, i, puiRecord);\t} cout\u0026lt;\u0026lt;\u0026#34;The Total num is \u0026#34;\u0026lt;\u0026lt; GetCount()\u0026lt;\u0026lt;endl; return ; } int main(void) { CSolution test(7, 11); test.PrintCombinations(); return 0; } 运行结果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 [root@localhost cpp]# ./numdecom print combinations as follow: 11 1 10 2 9 3 8 4 7 5 6 1 1 9 1 2 8 1 3 7 1 4 6 1 5 5 2 2 7 2 3 6 2 4 5 3 3 5 3 4 4 1 1 1 8 1 1 2 7 1 1 3 6 1 1 4 5 1 2 2 6 1 2 3 5 1 2 4 4 1 3 3 4 2 2 2 5 2 2 3 4 2 3 3 3 1 1 1 1 7 1 1 1 2 6 1 1 1 3 5 1 1 1 4 4 1 1 2 2 5 1 1 2 3 4 1 1 3 3 3 1 2 2 2 4 1 2 2 3 3 2 2 2 2 3 1 1 1 1 1 6 1 1 1 1 2 5 1 1 1 1 3 4 1 1 1 2 2 4 1 1 1 2 3 3 1 1 2 2 2 3 1 2 2 2 2 2 1 1 1 1 1 1 5 1 1 1 1 1 2 4 1 1 1 1 1 3 3 1 1 1 1 2 2 3 1 1 1 2 2 2 2 The Total num is 49 ","permalink":"https://myself659.github.io/post/2015-06-14-number-divide/","summary":"\u003ch3 id=\"题目\"\u003e题目\u003c/h3\u003e\n\u003cp\u003e将一个无符号数N拆分为不多于M个数，使拆分的数之和等于N,条件：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eN \u0026gt;= M；\u003c/li\u003e\n\u003cli\u003eN与M都是无符号整型数\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e求：一共有多少中拆分方法？\u003c/p\u003e\n\u003ch3 id=\"分析\"\u003e分析\u003c/h3\u003e\n\u003cp\u003e参考代码\u003c/p\u003e\n\u003ch3 id=\"代码\"\u003e代码\u003c/h3\u003e\n\u003cp\u003e代码实现计算拆分方法及打印拆分组合信息\u003c/p\u003e","title":"实现无符号整型数的分解"},{"content":"ping不通从ping的流程分为两大类：\n请求报文没有到达对端 应答报文未收到 请求报文没有到达对端的可能原因：\n发送端发送流程出错 源端,转发设备没有目的地址的路由 ttl 小于转发跳数 分片丢包 MTU限制 转发丢包 报文错误 防火墙规则不允许该类型报文通过 中间进行nat转换等处理出错 目的地址不存在 接收端收包流程出错 应答报文未收到的可能原因：\n发送端发送流程出错 MTU限制 目的端禁止应答 接收报文错误 防火墙规则不允许该类型报文通过 接收到了报文，但是超出等待时间 接收报文错误，ping 应答检查失败 转发丢包 ","permalink":"https://myself659.github.io/post/linux/2015-05-27-ping-error/","summary":"\u003cp\u003eping不通从ping的流程分为两大类：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e请求报文没有到达对端\u003c/li\u003e\n\u003cli\u003e应答报文未收到\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e请求报文没有到达对端的可能原因：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e发送端发送流程出错\u003c/li\u003e\n\u003cli\u003e源端,转发设备没有目的地址的路由\u003c/li\u003e\n\u003cli\u003ettl 小于转发跳数\u003c/li\u003e\n\u003cli\u003e分片丢包\u003c/li\u003e\n\u003cli\u003eMTU限制\u003c/li\u003e\n\u003cli\u003e转发丢包\u003c/li\u003e\n\u003cli\u003e报文错误\u003c/li\u003e\n\u003cli\u003e防火墙规则不允许该类型报文通过\u003c/li\u003e\n\u003cli\u003e中间进行nat转换等处理出错\u003c/li\u003e\n\u003cli\u003e目的地址不存在\u003c/li\u003e\n\u003cli\u003e接收端收包流程出错\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e应答报文未收到的可能原因：\u003c/p\u003e","title":"ping不通常见原因总结"},{"content":"在linux内核开发中断处理函数不能调用可能导致睡眠的函数，下面总结linux内核可能引起睡眠的函数如下：\nschedule函数 schedule_timeout schedule_timeout_uninterruptible schedule_timeout_interruptible cond_resched might_resched sleep函数 msleep msleep_interruputible ssleep osal_usleep might_sleep 取信号量函数 down down_timeout down_read down_write down_interruptible wait_for_completion wait_for_completion_interruptible wait_for_completion_timeout wait_for_completion_interruptible_timeout kmalloc相关函数含有标志GFP_KERNEL kmalloc kzalloc krealloc kmem_cache_create kmem_cache_alloc kmem_cache_zalloc 取睡眠锁函数 mutex_lock mutex_lock_timeout mutex_lock_nested mutex_lock_interruptible mutex_lock_interruptible_nested 在中断处理函数不能使用睡眠函数原因 主要原因如下：\n中断是一种紧急事务，中断处理函数要求快 linux是以进程为调度单位的，调度器只看到进程内核栈，而看不到中断栈，在独立中断栈的模式下，如果linux内核在中断处理函数内发生了调度或者睡眠，导致无法找到回家的路，未执行的中断处理代码再也无法获得执行机会（贪睡开小差是有代价哦） ","permalink":"https://myself659.github.io/post/linux/2015-06-01-linux-may-sleep-function/","summary":"\u003cp\u003e在linux内核开发中断处理函数不能调用可能导致睡眠的函数，下面总结linux内核可能引起睡眠的函数如下：\u003c/p\u003e\n\u003ch3 id=\"schedule函数\"\u003eschedule函数\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003col\u003e\n\u003cli\u003eschedule_timeout\u003c/li\u003e\n\u003cli\u003eschedule_timeout_uninterruptible\u003c/li\u003e\n\u003cli\u003eschedule_timeout_interruptible\u003c/li\u003e\n\u003cli\u003econd_resched\u003c/li\u003e\n\u003cli\u003emight_resched\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"sleep函数\"\u003esleep函数\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003col\u003e\n\u003cli\u003emsleep\u003c/li\u003e\n\u003cli\u003emsleep_interruputible\u003c/li\u003e\n\u003cli\u003essleep\u003c/li\u003e\n\u003cli\u003eosal_usleep\u003c/li\u003e\n\u003cli\u003emight_sleep\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"取信号量函数\"\u003e取信号量函数\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003col\u003e\n\u003cli\u003edown\u003c/li\u003e\n\u003cli\u003edown_timeout\u003c/li\u003e\n\u003cli\u003edown_read\u003c/li\u003e\n\u003cli\u003edown_write\u003c/li\u003e\n\u003cli\u003edown_interruptible\u003c/li\u003e\n\u003cli\u003ewait_for_completion\u003c/li\u003e\n\u003cli\u003ewait_for_completion_interruptible\u003c/li\u003e\n\u003cli\u003ewait_for_completion_timeout\u003c/li\u003e\n\u003cli\u003ewait_for_completion_interruptible_timeout\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"kmalloc相关函数含有标志gfp_kernel\"\u003ekmalloc相关函数含有标志GFP_KERNEL\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003col\u003e\n\u003cli\u003ekmalloc\u003c/li\u003e\n\u003cli\u003ekzalloc\u003c/li\u003e\n\u003cli\u003ekrealloc\u003c/li\u003e\n\u003cli\u003ekmem_cache_create\u003c/li\u003e\n\u003cli\u003ekmem_cache_alloc\u003c/li\u003e\n\u003cli\u003ekmem_cache_zalloc\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"取睡眠锁函数\"\u003e取睡眠锁函数\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003col\u003e\n\u003cli\u003emutex_lock\u003c/li\u003e\n\u003cli\u003emutex_lock_timeout\u003c/li\u003e\n\u003cli\u003emutex_lock_nested\u003c/li\u003e\n\u003cli\u003emutex_lock_interruptible\u003c/li\u003e\n\u003cli\u003emutex_lock_interruptible_nested\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"在中断处理函数不能使用睡眠函数原因\"\u003e在中断处理函数不能使用睡眠函数原因\u003c/h3\u003e\n\u003cp\u003e主要原因如下：\u003c/p\u003e","title":"那些可进入睡眠状态的Linux内核函数"},{"content":"代码review是保证代码质量在项目开发及代码修改中一项重要的环节，下面就代码reiew的一些总结，总结一些代码的review的关注点，提高代码review的效率与效果，提前发现问题，降低后期的测试成本，以及避免软件上线或交付出问题导致的经济损失和恶劣影响（ps:对每一行代码保持敬畏之心）。\n代码中的资源 以内存为例，C语言内存操作都是由程序员来定义与控制，内存的一些错误总是不断地出现，例如内存泄漏，踩内存，写越界等，如果这种问题在线上系统中出现，定位与修复的成本都是很高的。\n动态内存 信号量 文件描述符 锁 句柄 中断 资源的引用 资源的引用计数 代码的错误高发特征 冗余实现 异常处理 结构复杂 层次嵌套多 不合理实现 字符串处理 代码临界区 移植代码 代码的追求 正确性 可靠性 可读性 可维护性 可测试性 可扩展性 可移植性 可伸缩性 易用性 可用性 可重用性 互操作性 可管理性 一致性 安全性 性能 稳定性 精确性 可差异化性 魯棒性 ","permalink":"https://myself659.github.io/post/c-codereivew/","summary":"\u003cp\u003e代码review是保证代码质量在项目开发及代码修改中一项重要的环节，下面就代码reiew的一些总结，总结一些代码的review的关注点，提高代码review的效率与效果，提前发现问题，降低后期的测试成本，以及避免软件上线或交付出问题导致的经济损失和恶劣影响（ps:对每一行代码保持敬畏之心）。\u003c/p\u003e","title":"C语言代码 review的总结"},{"content":"性能不仅仅是一串串数字，性能体现更大的吞吐量及更低的延迟；如果网络延迟增加0.1秒，google每秒损失100W,不是人民币是美元；网页响应慢0.1秒，运营成本每天增加100万美金。亚马逊的数据也显示，网页延迟1秒可能导致全年损失16亿美金；移动页面加载时间时长超过5秒，74%的用户会选择离开，高性能主要体现下面三个方面：\n少资源 高吞吐 低延迟 在具体网络转发性能优化过程中对性能优化有以下几点体会与总结：\n软硬结合 软件灵活，硬件高效，软硬结合就像双剑合壁，威力巨大；具体在网络设备中交换机就是一个很好的例子：通常由CPU完成协议的处理，下发转发表项到芯片，由芯片完成报文的转发，在这种思路下才会cisco，H3C，Huawei的大容量的交换机；如果完全交给CPU来处理成本很高，而且在现有技术下很难完成那么大的交换容量（1T以上）。在这种情况对于软件上来说基本不需要优化，本文后面的优化是针对软转的优化；\n分离与分解 控制与转发分离 由控制平面维护转发表项，转发平面根据表项完成转发\n针对性优化 性能优化一定要指定优化场景，例如对于收包优化针对不同的接入方式，不同报文类型；\n快慢结合，先慢后快 对于交换机与路由机这种网络转发设备，通过首包建流，后续报文匹配流实现快慢结合提高报文转发效率；\n缓存 缓存大法好，在现在各种系统与应用中缓存无处不在，硬件上看，有硬盘缓存，RAID卡缓存，存储缓存，主存，NUMA特性，CPU cache；软件架构上看，有全局数据缓存，私有数据缓存，连接池，应用服务器缓存，WEB服务器缓存，CDN缓存，客户端文件缓存，客户端内存缓存等等。\ndo more with less 性能优化大体就是开源与节流，do more with less需要考虑如何提高cpu，存储，网络的利用效率\n预处理 兵马未动粮草先行 例如在报文发送针对不同流准备相应的链路层头，避免发送报文再逐字段填充，作到一次性完成报文贴头处理；其实很多应用系统的线程池，内存池，连接池等也是类似思想\n二八原则 主要体现如下:\n对于优化的代码，集中精力优化是关键20%的代码 在具体的系统性能优化过程刚开始投入20%可以使取得整个优化成果的80%，而最后的20%需要花费80%的时间来完成，而且涉及的挑战会更多，更有难度，所以优化过程越到后面越难，需要良好的心态与意志 无profile，不优化 If you can\u0026rsquo;t measure it, you can\u0026rsquo;t improve it。若无度量，则无提高。优化一定要有一套profile方法，profile以下几个方面的作用：\nprofile建立一个性能基线，有利于优化过程中比较与参考 profile查找系统的瓶颈，在一个大型的系统查找到性能瓶颈是一件很有挑战的事情,通过profile有利于快速定位瓶颈 profile评估优化结果，对每一个优化点有一个数字化清晰的记录 profile指导优化的方向 避免过度优化 在性能优化过程中切忌一味追求性能，忽略了业务，没有关注优化对系统带来的哪些不好影响，例如：\n优化使系统变得更复杂，不利于维护 优化影响了其他业务 优化忽略了业务功能（功能正确性，功能可扩展性等等） 优化只是特定环境下数据提升并不适用具体应用 减少状态的改变 在报文处理与协议处理过程中设计更精简的状态机，避免过多的状态变化处理的开销。\n避免代码的黑盒 避免代码的黑盒，主要有下面几点：\n1.优化过程忽略部分代码，导致这一部分代码未能出现优化对象中\n2.虽然考虑了所有该关注的代码，但是没有理解代码，特别这一部分代码涉及跨团队，个人经验：这一部分代码需要重点关注，往往有意想不到的收获\n总之，性能优化需要充分理解业务，根据数据，实现硬件，系统，业务三者最佳协同。\n","permalink":"https://myself659.github.io/post/linux/2015-05-24-linux-perf-thought/","summary":"\u003cp\u003e性能不仅仅是一串串数字，性能体现更大的吞吐量及更低的延迟；如果网络延迟增加0.1秒，google每秒损失100W,不是人民币是美元；网页响应慢0.1秒，运营成本每天增加100万美金。亚马逊的数据也显示，网页延迟1秒可能导致全年损失16亿美金；移动页面加载时间时长超过5秒，74%的用户会选择离开，高性能主要体现下面三个方面：\u003c/p\u003e","title":"Linux性能优化杂谈"},{"content":"丢包问题是十分常见一类问题，下面总结的一个网络丢包问题的分析过程。\n问题描述 组网：\nTC-PORT1\u0026mdash;\u0026mdash;-VSR-eth1\nTC-PORT2\u0026mdash;\u0026mdash;-VSR-eth2\n打流：\n报文从TC-Port1打入VSR-eth1，再从VSR-eth2出，到TC-Port2，打流的时候变换了源ip与源端口\n问题：\n测试同学在根据RFC2544打流测试转发性能中，发现报文有效转发性能总是小于40W pps，总是会出现丢包，而实际cpu利用率才20%左右\n问题分析 丢包的原因很多，需要根据现场进行具体问题分析，下面就一个一个排查怀疑点，没有怀疑点再分析的过程：\n昨天测试都ok的，检查一下测试打流报文，报文正确 查看报文处理过程中丢包计数，以确认丢包阶段，不幸地发现处理过程中无丢包统计 与打多条流有关？实测打一流问题同样存在，与多条流无关 再次回头检查报文是否有多种code path，导致第2步遗漏检查到丢包点，确认报文走一条code path 上面又被否认，继续分析怀疑点，没有分析出怀疑点，自已动手打流，观察TC收发包统计发现丢包有周斯性，大概周期是30s，这是一个重要信息 又回过头去确认一下丢包统计是否有漏统计，很欣慰又很失望的结果：丢包，错包统计没有遗漏统计 这时候收包处理过程丢包可能性已经排除 从上到下的报文流排查，报文丢在网卡上送cpu过程中？ 内核采用epoll收包存在问题？ 进程如果得到调度就没有问题 top 查看进程调度，这时候有重大发现了： 看tc丢包统计与top的里面的进程natlog运行就同步了，但是看到natlog的线程状态为D状态，同时检查配置，开启nat log功能 natlog进程设置为D状态，导致不响应异步信号，在natlog释放cpu前，在转发线程与natlog运行在同一个cpu的情况下，转发线程得不到调度，导致报文接收缓冲区溢出，导致部分报文丢弃；\n与natlog线程开发同学交流，natlog早期是基于多核开发，natlog根据运营商需求，每30s定时运行，natlog线程运行在控制核，转发线程运行在数据核，导致问题没有暴露出来\n问题总结 定位问题，特别是未知的问题是一步步有依据推断与确认的过程 获取现场的全方位消息，同时要对信息进行去噪，避免关键信息遗漏与无关干扰 ","permalink":"https://myself659.github.io/post/linux/2015-05-24-linux-perf-droppacket/","summary":"\u003cp\u003e丢包问题是十分常见一类问题，下面总结的一个网络丢包问题的分析过程。\u003c/p\u003e\n\u003ch3 id=\"问题描述\"\u003e问题描述\u003c/h3\u003e\n\u003cp\u003e组网：\u003c/p\u003e\n\u003cp\u003eTC-PORT1\u0026mdash;\u0026mdash;-VSR-eth1\u003c/p\u003e\n\u003cp\u003eTC-PORT2\u0026mdash;\u0026mdash;-VSR-eth2\u003c/p\u003e\n\u003cp\u003e打流：\u003c/p\u003e\n\u003cp\u003e报文从TC-Port1打入VSR-eth1，再从VSR-eth2出，到TC-Port2，打流的时候变换了源ip与源端口\u003c/p\u003e","title":"一个linux网络丢包问题分析"},{"content":"在实际性能优化过程，加了一个if判断整个系统转发性能就有大约5%的下降，下面简单分享一种在没有分支miss条件下，实现取最小值的方法。\n一般实现 取两个数最小值，一般代码常见两种写法如下：\n写法一： 1 if(a \u0026lt; b ) { min = a } else { min = b} 写法二： 1 min = a \u0026lt; b ? a:b; 这两种写法只是代码写法不一致，实际都是通过一个if的语句的比较，存在if语句就代码运行过程就存在分支miss，而一个分支的miss的开销范围40到60 cycles；在追求高性能代码，且没有太多的优化点的过程中这是极其宝贵，且这两个分支出现概率都相当，也就不能简单通过likely与unlikely来实现分支预测\n无分支miss实现 无分支实现代码如下：\n1 min = b ^ ((a ^ b) \u0026amp;-(a\u0026lt;b)); 分两种情况分析如下：\n当a\u0026lt;b时,-(a\u0026lt;b)为True，表达式等价于min= b ^(a ^ b) = a;\n当a\u0026gt;=b时，-（a \u0026lt; b）为False，表达式等价于min= b ^ 0 = b\n故可以宏定义如下：\n1 #define min(a,b) = (b) ^ ( ((a) ^ (b)) \u0026amp; (-((a)\u0026lt;(b))) ) ","permalink":"https://myself659.github.io/post/linux/2015-05-24-linux-perf-tips-nobranchmiss/","summary":"\u003cp\u003e在实际性能优化过程，加了一个if判断整个系统转发性能就有大约5%的下降，下面简单分享一种在没有分支miss条件下，实现取最小值的方法。\u003c/p\u003e\n\u003ch3 id=\"一般实现\"\u003e一般实现\u003c/h3\u003e\n\u003cp\u003e取两个数最小值，一般代码常见两种写法如下：\u003c/p\u003e","title":"在没有分支miss条件下，实现取最小值"},{"content":"个人说明 沉风\n伪Geek，数字游民，野生程序员\nMinimalist，Essentialist，Pragmaticist，Lifelong Learner，Experimentalist\n玩过嵌入式，通信行业搬过砖，互联网后端（在线直播，IM）打过杂，历经区块链与Web3的风浪，现专注AI及其应用\n爱学习新技术更注重夯实基础\n看过以下但不仅限于以下列出项目的源码：Linux Kernel，redis，nginx，nginx-rtmp，Libevent，libco，fabric，ethereum，libra，ipfs等\na Polyglot Programmer，全栈工程师，主要编程语言：C，C++，Golang，Python，Shell，nodejs，Rust，Javascript，Solidity，Typescript\n经济与金融业余爱好者\n业余爬虫与数据分析爱好者\n业余股民\n历史爱好者\n重度拖延症患者(积极治疗中)\n跑步爱好者\n腹肌练习中\n冥想爱好者\ncryptocurrency farmer and miner\n博客说明 本博客支持两个域名访问，避免单点故障：域名1, 域名2 思绪像风，希望在这里记下风来风去的痕迹 本博客主要记录技术总结，生活体验等等，总之，只要想写的都会写下，这其中肯定有很多不正确的地方，不怕嘲笑，欢迎指正与批评，每一个错误改正后都是进步 博客搭建参考这也许是最快的搭建博客网站的方式 本站的所有文章都是原创（除特别注明之外），我对此保留全部权利。任何形式的非商业用途转载（包括但不限于纸质/网站等）都无需征求同意，但必须完整保留原文全部内容，并附上原文URL链接。除此之外，无其他要求（若为商业用途请务必事先沟通，否则视为侵权）。 优惠 腾讯云优惠\nUcloud优惠\n阿里云优惠 阿里云折扣码： 7begqucw 送你限时320元硅谷课程优惠券，和我一起学提升职场技能吧！点击：学习充电 开始前进！ 欢迎交流 网站：沉风网事 Weibo：沉风网事 GitHub : http://github.com/myself659 QQ：8Yynsl5mPrshrmCjN6okPF0hrr8RB+/DQX6ZDT0luc8/Ri44 微信公众帐号： ","permalink":"https://myself659.github.io/about/","summary":"\u003ch3 id=\"个人说明\"\u003e个人说明\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e沉风\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e伪Geek，数字游民，野生程序员\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMinimalist，Essentialist，Pragmaticist，Lifelong Learner，Experimentalist\u003c/p\u003e","title":"About"}]