<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>JialinWu&#39;s Blog</title>
    <link>https://www.jialinwu.com/</link>
    <description>Recent content on JialinWu&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 09 Feb 2026 07:52:39 +0800</lastBuildDate>
    
	<atom:link href="https://www.jialinwu.com/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>当 Windows 7 遇上 2026：一次冷静的技术复盘</title>
      <link>https://www.jialinwu.com/post/%E5%BD%93-windows-7-%E9%81%87%E4%B8%8A-2026%E4%B8%80%E6%AC%A1%E5%86%B7%E9%9D%99%E7%9A%84%E6%8A%80%E6%9C%AF%E5%A4%8D%E7%9B%98/</link>
      <pubDate>Mon, 09 Feb 2026 07:52:39 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E5%BD%93-windows-7-%E9%81%87%E4%B8%8A-2026%E4%B8%80%E6%AC%A1%E5%86%B7%E9%9D%99%E7%9A%84%E6%8A%80%E6%9C%AF%E5%A4%8D%E7%9B%98/</guid>
      <description>2026-02-14今天发现，其实还有更干净的安装方式，就是使用微pe加系统镜像iso。默认要手动点每一步安装，但是可以在无人值守把它勾选上，就可以完成自动安装。等个半个小时之后，就可以进入到系统界面了，而且是可以直接使用的，很干净的系统。
无人值守安装，这一点太方便了。但默认不是勾选上的，要注意手动勾选。
安装完之后，然后把一些常用的软件，比如说浏览器、微信、输入法、WPS，火绒等已装上。最后在火绒上把一些启动项和任务计划给禁用掉。还有安装一个Optimizer来优化Windows系统的一些自带的自动服务，比如说自动更新，客户体验的自动上传的。
在 2026 年这个时间点，再次为一台多年的设备重装 Windows 7，本身就已经是一件略显“逆时代”的事情。官方支持早已终止，主流软件生态也逐渐向更新的系统迁移，但在某些特定场景下，老系统依然有其存在价值。本文记录了一次实际的 Windows 7 重装过程：从原生镜像配合 Ventoy 引导失败、输入设备不可用，到在没有现成 PE 环境下难以调整引导配置，再到最终借助wei PE 毛桃 PE 完成安装的全过程。
请选择你的PE,三选一,都是纯净无广告的
 https://wepe.com.cn
 https://firpe.cn/page-247
 https://home.edgeless.top
  相比系统本身的技术难度，这次重装更明显暴露的是装机工具、驱动获取以及软件生态层面的现实问题。国内常见的装机工具在提供便利的同时，也不可避免地伴随着软件绑定、广告提示与会员限制，这在老系统环境下尤为突出。本文并不试图评判某一种选择的对错，而是希望通过一次相对完整的实践记录，梳理在当下环境中部署旧版 Windows 系统所面临的技术边界、工具取舍以及不可回避的现实成本，供有类似需求的读者参考。
- Windows LTSC / IoT 官方镜像下载（MAS / massgrave）
- Helium for Windows（轻量级窗口化浏览器）
- Thorium Legacy（适配旧系统的 Chromium 浏览器）
驱动安装工具,三选一
 Driver Booster (IObit)
 Snappy Driver Installer Origin
 DriverIdentifier
  Win 7其实很早(2018年)就可以使用在了触控屏上面。虽然那教室里面的教学机器使用就是win 7，但是是可以触屏的
昨天帮老婆去学校里重装了好多年的Windows主机，安装是Windows 7系统。这个系统早就官方不再维护了，应该是2023年，已经完全没有维护了。然后安装的时候，因为是没有找到合适的软件以及方法，折腾了一个下午。一开始我心想着下载好原版的Windows 7系统镜像，使用Ventoy来引导，直接安装就好了。谁知道Windows 7的引导在老的或者说当时的硬件来说，能进主页面，但是鼠标键盘动不了，就完全没法操作。然后想装Windows 11呢，发现引导方式要更改配置，没有PE系统又操作不了。</description>
    </item>
    
    <item>
      <title>大模型时代下的开发者核心竞争力</title>
      <link>https://www.jialinwu.com/post/llm%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%97%B6%E4%BB%A3%E4%B8%8B%E7%9A%84%E5%BC%80%E5%8F%91%E8%80%85%E6%A0%B8%E5%BF%83%E7%AB%9E%E4%BA%89%E5%8A%9B/</link>
      <pubDate>Fri, 03 Oct 2025 07:02:04 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/llm%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%97%B6%E4%BB%A3%E4%B8%8B%E7%9A%84%E5%BC%80%E5%8F%91%E8%80%85%E6%A0%B8%E5%BF%83%E7%AB%9E%E4%BA%89%E5%8A%9B/</guid>
      <description>结合近几年来的大模型在我日常工作的影响,总觉得可以写点什么, 一个极具前瞻性和现实意义的话题。在大模型AI成为强大辅助工具的背景下，软件开发的面貌和所需技能正在发生深刻的重塑。
我们可以将这种变化看作是从“工匠”到“策展人+架构师”的转变。
过去，开发者需要亲手雕琢每一块“砖石”（代码），深度掌握其物理特性。而现在，AI可以快速生成大量高质量的“砖石”甚至“预制件”（代码块、函数、模块），开发者的核心职责转变为：
 提出卓越的构想和设计。
 精准地筛选和鉴定AI生成的“材料”。
 将这些材料整合成一个坚固、优雅、可扩展的系统。
  基于这个核心转变，未来的软件开发者需要重点培养以下技能：
一、 思维与认知的升维（核心竞争力） 这些是超越具体工具、永不过时的“元能力”。
 系统架构与抽象设计能力
 为什么重要：当AI能处理具体实现时，对人类最大的需求就变成了定义系统的“蓝图”。你需要能够将复杂的业务需求分解为清晰的模块、服务和数据流，设计出高内聚、低耦合、可扩展的系统架构。
 具体体现：绘制架构图、定义接口规范、进行技术选型、权衡不同的设计模式。
  精准的需求分析与提问能力
 为什么重要：AI是一个“超级实习生”，你问得越精准，它回答得越优质。垃圾输入必然导致垃圾输出。你需要能将模糊的用户故事或产品需求，转化为清晰、无歧义、可执行的技术指令（Prompt）。
 具体体现：掌握“提示词工程”，能进行多轮、递进式的追问，能够为AI提供充分的上下文（Context）。
  批判性思维与评估能力
 为什么重要：AI生成的代码、方案或信息可能存在过时、错误、安全漏洞或性能瓶颈。你不能无条件信任。必须具备一双“火眼金睛”，去审查、测试、验证AI的输出。
 具体体现：代码审查、安全审计、性能分析、方案可行性评估。
  创造力与问题定义能力
 为什么重要：AI最擅长解决“已知问题”或“模式化问题”。而人类的独特价值在于发现新问题、创造新体验、开辟新领域。当AI接管了重复性劳动，开发者更能专注于创新。
 具体体现：构思全新的产品功能、探索技术的跨界应用、优化用户体验流程。
   二、 技术技能的演变（工具与手段） 具体技能在变化，但底层逻辑不变。
 “理解”而非“背诵”语法
 过去：需要熟记大量API和语言特性。
 未来：只需要理解核心概念和范式，具体的API和语法细节可以随时让AI查询或生成。重点在于能读懂和修正AI生成的代码。
  调试与逆向工程能力
 为什么重要：当代码不是你亲手所写，但bug需要你来修复时，快速理解陌生代码、定位问题根源的能力就变得至关重要。
 具体体现：熟练使用调试工具，通过日志、堆栈跟踪分析问题，甚至利用AI辅助诊断（例如：“AI，请分析这段代码，为什么在输入X时会抛出Y异常？”）。
  安全与伦理意识
 为什么重要：AI可能会生成含有已知漏洞的代码，或者被诱导生成恶意代码。开发者必须对常见的安全威胁（如注入、越权、XSS等）有深刻理解，并在集成AI输出时进行安全检查。
 具体体现：学习安全开发生命周期，使用SAST/DAST工具，在Prompt中明确要求“生成安全的代码”。</description>
    </item>
    
    <item>
      <title>LLM时代的三元认知力：精准描述、基础解构与风险防御</title>
      <link>https://www.jialinwu.com/post/llm%E6%97%B6%E4%BB%A3%E7%9A%84%E4%B8%89%E5%85%83%E8%AE%A4%E7%9F%A5%E5%8A%9B%E7%B2%BE%E5%87%86%E6%8F%8F%E8%BF%B0%E5%9F%BA%E7%A1%80%E8%A7%A3%E6%9E%84%E4%B8%8E%E9%A3%8E%E9%99%A9%E9%98%B2%E5%BE%A1/</link>
      <pubDate>Sun, 13 Jul 2025 17:43:15 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/llm%E6%97%B6%E4%BB%A3%E7%9A%84%E4%B8%89%E5%85%83%E8%AE%A4%E7%9F%A5%E5%8A%9B%E7%B2%BE%E5%87%86%E6%8F%8F%E8%BF%B0%E5%9F%BA%E7%A1%80%E8%A7%A3%E6%9E%84%E4%B8%8E%E9%A3%8E%E9%99%A9%E9%98%B2%E5%BE%A1/</guid>
      <description>《LLM时代的三元认知力：精准描述、基础解构与风险防御》
这篇文章是我用录制录音转文本,让llm润色后生成的,呈现了我想要表达的基本细想。
引言 大模型正在重塑开发范式，但效率提升的背后潜藏着认知陷阱。真正的技术掌控力，源于对精准描述、基础解构与风险验证三大核心能力的协同修炼。本文将结合技术实例与实践洞见，拆解LLM时代的认知方法论。
一、精准描述力：问题界定的元技能 为什么描述能力决定认知效率？  现象观察：
如果根据2/8原则描述, 80%的场景中，LLM可生成有效代码，但剩余20%的失败案例多源于问题描述偏差。
 本质剖析：
精准描述是认知深度的外在映射。能清晰阐明“RabbitMQ定义Exchange的绑定缺失问题”或“Go HTTP客户端无超时风险”，意味着已理解技术本质。
 反馈机制：
将LLM输出视为认知镜子——符合预期即验证理解正确，出现偏差则暴露认知盲区。
   经典案例
 RabbitMQ：默认Exchange自动绑定队列，而自定义Exchange需显式声明绑定——模糊描述将导致消息丢失。
 Go HTTP：默认无超时的特性，若未明确要求“超时控制”，将引发资源泄漏。
   二、基础解构力：技术自由的根基 为何拒绝“拿来主义”配置/提示词？  现实困境：
例 Vim配置/Prompt库的泛滥，导致开发者陷入“能用但不可控”的泥潭（例如：修改键位映射时无从下手）。
 积木理论：
构建复杂系统的自由，取决于对每块“基础积木”的深度掌控：
✅ 作用（如：Vim的map指令如何触发）
✅ 机制（如：LLM的temperature参数如何影响输出）
✅ 定位（如：RabbitMQ的routing_key在消息路由中的卡位）
  行动指南  从原子单元入手：
逐行吃透一段配置、一个Prompt模板，而非直接套用宏方案。
 构建可预测性：
深度理解每个组件后，组合复杂系统时才能精准选用模块（例：为高并发场景选择带连接池的HTTP客户端）。
  三、风险防御力：对抗幻觉的技术屏障 LLM的三大输出风险    风险类型 典型案例 防御策略     上下文偏差 未说明边界条件，生成未处理异常的代码 补充场景约束（如：“需支持10K QPS”）   技术缺陷 推荐过时的API（如Python弃用模块） 交叉验证官方文档   幻觉(Hallucination) 虚构不存在的参数（如Kafka.</description>
    </item>
    
    <item>
      <title>补牙经历记录与思考</title>
      <link>https://www.jialinwu.com/post/%E8%A1%A5%E7%89%99%E7%BB%8F%E5%8E%86%E8%AE%B0%E5%BD%95%E4%B8%8E%E6%80%9D%E8%80%83/</link>
      <pubDate>Sat, 24 May 2025 20:43:14 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E8%A1%A5%E7%89%99%E7%BB%8F%E5%8E%86%E8%AE%B0%E5%BD%95%E4%B8%8E%E6%80%9D%E8%80%83/</guid>
      <description>继上次补牙经历后,这次又来了,记录一下,用语音录了20分钟的一个口述的录音，然后用手机转成文本，然后把文本发给机器人重新整理了一下，这是输出的结果，修改了几个字感觉还不错。
就诊过程  时间安排
 早上6点多出门，7:30到达医院，直接付款后到诊室等候。
 医生（住院医师/博士生）7:40到岗，8点前开始接诊，按先到先得顺序处理，中途检查后返回仍优先，流程人性化。
  诊断与方案分歧
 本人原计划直接补牙，但医生建议需重新做根管治疗+牙冠，因牙齿缺损较大。
 沟通后先去吃早餐（避免麻醉空腹），返回后开始治疗。
  治疗中的意外
 操作时发现牙根内有旧填充物（树脂），难以用常规根管器械清理，强行磨除可能损伤牙齿。
 医生临时调整方案，改为直接树脂补牙，未继续根管治疗。
 询问嵌体修复时，被告知缺损范围不适用。
  医生态度与时间压力
 治疗后期医生略显急躁，推测因患者较多、时间有限，首次就诊未预留充足时间。
 个人感受：方案妥协于现实条件（牙根状态、时间成本），非最优但可接受。
   对比历史治疗经历  十年前补牙（桂林医生）
 曾用树脂替换金属填充物，未做牙冠，使用十年后部分脱落。
 当时可能因经济/时间因素未选择根管+牙冠，现质疑是否最优方案。
  本次治疗（北大医生）
 更保守快速，侧重功能修而非长期完美性，可能与公立医院接诊量有关。
   反思：
- 私立诊所可能更细致（如完成根管+牙冠），但成本高；公立医院需平衡效率与效果。
- 十年前树脂补牙能维持十年已属不错，但牙冠或嵌体可能延长使用寿命。
关于牙齿修复的认知总结  治疗方案优先级
 小缺损无疼痛：直接树脂补牙。
 大缺损/疼痛：根管治疗+牙冠（最佳，寿命约10-20年）。
 严重损坏：拔牙后种植或活动义齿（最后选择）。
  个人现状
 当前补牙为临时方案，需观察使用情况，未来可能需二次处理。
 牙根状态一般，若再脱落可能直接种植。</description>
    </item>
    
    <item>
      <title>Root Cause Analysis: Kubernetes and DNS Dependencies in OpenAI</title>
      <link>https://www.jialinwu.com/post/k8s-down-case-openai/</link>
      <pubDate>Mon, 16 Dec 2024 08:43:57 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/k8s-down-case-openai/</guid>
      <description>original post: https://status.openai.com/incidents/ctrsv3lwd797
To create a clear flow chart based on the thought process, we will organize the components and their interactions into a structured diagram. Here&amp;rsquo;s a step-by-step outline of the flow chart:
Flow Chart Outline 1. Control Plane  API Server
 Connects to etcd for persistent storage.
 Interacts with Scheduler and Controller Manager for cluster management.
  Scheduler
 Sends pod scheduling requests to API Server.</description>
    </item>
    
    <item>
      <title>全局代理:在macOS中显著提高网络浏览的舒适度和便利性</title>
      <link>https://www.jialinwu.com/post/setting-up-a-global-proxy-for-native-web-surfing-on-macos-with-gost-and-cloudflare/</link>
      <pubDate>Sat, 03 Aug 2024 21:54:41 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/setting-up-a-global-proxy-for-native-web-surfing-on-macos-with-gost-and-cloudflare/</guid>
      <description>背景：
在gwt现代网络安全环境下，在macOS中设置一个有效的全局代理可以显著提高网络浏览的舒适度和便利性,比如直接使用官方的chatgpt,在macOS中体验比chrome更好的safari浏览器。本篇文章将指导您如何在 macOS 系统上配置这种全局代理，利用 GOST 和 Cloudflare 实现代理支持。
组件概述：
 macOS 系统代理配置
 作用：配置 macOS 的 HTTP/HTTPS 代理设置。
 触发方式：可以通过 Bash 脚本来触发配置更改或绕过特定域名。
 工具-脚本:proxy_toggle_http.sh
  代理客户端
 作用：使用 GOST 作为 HTTP 代理，将流量通过 SOCKS5 代理转发。
 输入：接收代理请求并转发到代理服务器。
 工具-命令行: gost-darwin-amd64-2.11.5 -L socks://:8004 -F mwss://@yourvps.jialinwu.com:443,gost-darwin-amd64-2.11.5 -F socks://:8004 -L :8014
  代理服务器
 作用：使用 GOST 作为 SOCKS5 代理，通过 Cloudflare 使用 MWSS（管理 WebSocket 安全）进行传输。
 输出：为代理客户端提供 SOCKS5 代理服务。
 工具-命令行: gost.raw -L=mwss://@:443?</description>
    </item>
    
    <item>
      <title>当下基于Freeswitch开发,我做了这些事</title>
      <link>https://www.jialinwu.com/post/%E5%BD%93%E4%B8%8B%E5%9F%BA%E4%BA%8Efreeswitch%E6%83%B3%E5%BC%80%E5%8F%91%E4%B8%80%E4%B8%AA%E8%AF%AD%E9%9F%B3%E7%94%B5%E8%AF%9D%E6%9C%BA%E5%99%A8%E4%BA%BA%E7%9B%B8%E5%85%B3%E7%9A%84%E5%89%8D%E7%BD%AE%E6%A8%A1%E5%9D%97%E6%88%91%E5%81%9A%E4%BA%86%E5%93%AA%E4%BA%9B%E4%BA%8B/</link>
      <pubDate>Sun, 28 Jan 2024 08:12:10 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E5%BD%93%E4%B8%8B%E5%9F%BA%E4%BA%8Efreeswitch%E6%83%B3%E5%BC%80%E5%8F%91%E4%B8%80%E4%B8%AA%E8%AF%AD%E9%9F%B3%E7%94%B5%E8%AF%9D%E6%9C%BA%E5%99%A8%E4%BA%BA%E7%9B%B8%E5%85%B3%E7%9A%84%E5%89%8D%E7%BD%AE%E6%A8%A1%E5%9D%97%E6%88%91%E5%81%9A%E4%BA%86%E5%93%AA%E4%BA%9B%E4%BA%8B/</guid>
      <description>当下基于Freeswitch想开发一个语音电话机器人相关的前置模块,我做了哪些事? 要点如下
 从源码编译构建Freeswitch:
使用docker,基于官方推荐的image构建Freeswitch,这一步重要,为后面生成代码补全做准备,主要是要发了解 编译构建过程和相关的命令
 在构建好的image上搭建自动化vim/nvim IDE:
主要组件为 nvim+youcompleteme+bear+clang+python3,当然少不我自己使用的init.nvim, 最终完成后没有去删除编译的结果缓存之类的文件时,docker commit 后成的image达5个G+
 compilation database:
使用bear为编写c/cpp配置代码提示和自动补全的compilation database,
 配置使用Codeium提供代码预测补全
 写新module:
参考官方样例 mod_skel,并且可以正常编译运行读取文件配置并输出&amp;rdquo;hello world&amp;rdquo;
 语音流处理相关:
了解如何获取rtp中的语音流,主要是使用media bug,这里参考了record session以及网上的开发案例
 sip phone软电话的配置和使用
 asr/tts对接(todo):
以mrcp还有websocket的方式对接asr/tts; 实际项目中使用的asr噪音处理不是很好,总是把噪音误转写,除了音源输入设备上进行减噪还有其他的噪音处理方式,如对语音流进行VAD去噪,这又是一个module可写可接入
 使用lua管理ivr电话/asr/tts/录音等通话流程(todo):
  还在继续,整个过程上少不了问LLM,把LLM当作 it helps people get stared, helps in writting code;
参考了上网上的开发案例以及零碎的技术文章,这一点那一点对照整合;
还有官方的tech doc,这一部分给出的参考不一定非常详细但比较明确;
对于new boy(对于自己来说还好大学时做过一点c/cpp的项目)来说,c/ccp写的项目 单是编译要了解 automake, cmake 的使用,gcc/clang 编译相关的 -I -fPIC等参数含义,编译过程中的一点依赖库不存在问题,版本兼容性问题,让这个解决问题的过程很漫长;
工欲善其事，必先利其器: 对于静态语言开发,自动化环境可谓是必不可少的利器,不像golang的toolchain比较一步到位,cpp得自己生成compilation database或者.ycm_extra_conf.py
参考:
https://github.com/rizsotto/Bear?tab=readme-ov-file#how-to-use
https://github.com/ycm-core/YouCompleteMe?tab=readme-ov-file#option-1-use-a-compilation-database</description>
    </item>
    
    <item>
      <title>2023年终回顾与总结&#43;2024展望</title>
      <link>https://www.jialinwu.com/post/2023%E5%B9%B4%E7%BB%88%E5%9B%9E%E9%A1%BE%E4%B8%8E%E6%80%BB%E7%BB%93&#43;2024%E5%B1%95%E6%9C%9B/</link>
      <pubDate>Sun, 14 Jan 2024 06:40:36 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/2023%E5%B9%B4%E7%BB%88%E5%9B%9E%E9%A1%BE%E4%B8%8E%E6%80%BB%E7%BB%93&#43;2024%E5%B1%95%E6%9C%9B/</guid>
      <description>2023年终回顾 业务上，主要还是语音机业务上主要还是对话语音机器人项目上:
 主要服务的厂商有顺丰，澳门,猿辅导等还有一些老的业务在维护一些线上的项目,比如重启高速，号百，813商城联通云讯通等(关键字点: 功能是否尽可能通用来达到满足渠道需求的基础上 去尽可能的提高效率,要记录哪些是定制化点,哪些通用功能,过后回顾建设重构优化)
 中银国产化改造：纯从技术角度受限了解决方案的发散，最后的方案： 结合业务运行情况在具体实际可接受范围内改造业务操作(管理系统)，在技术可行可控的情况下去实现(双中心实现高可用，一开始最理想的预期是，双中心互为高可用，自动转移未呼叫数据继续呼叫； 实际可以一个中心内的服务高可用，统一分发数据到各中心数据跑，一中心出现异常，由人工手动迁移数据到正常的中心继续跑）
 考培项目,考试逻辑,asr/tts调试对接:asr对接细化的技术,日志要详细化,厂商的实现功能效果可能略有不同,要可以辨别并反馈给厂商
 cmmi: 为了一个证书,一堆人轮流面试开会
 还有一个里程碑似的意义的: 主要是原先人的足够把原先的文本机器人和外服机器人整合到统一到系统里面去也是服用了同一套代码重购的意义在于以后的产品可以去基于统一后的服务去迭代而不用像之前那样每个厂商做一些定制化的开发(像上面提到的系统功能是否尽可能通用来达到满足渠道需求的基础上 去尽可能的提高效率)，然后维护起来呢，就比较麻烦而且人手也会显得比较紧张，
当然，从过后的代码，一方面有一功能上面的考虑欠缺以及整合上面的功能，没有十分的考虑周到，还存在不少的小问题，
 另外一个问题是关于语音机器人在对话过程中的打断逻辑，目前更多的是基本上用，但是存在一些逻辑交叉后或说随着对话的多轮进行会存在一些打断上面的异常，而这里主要没有考虑很到位(像这种对话逻辑复用率极高,每一个逻辑细节可能在每一次对话中都会显现出来,所以逻辑状态流转,细节清晰可以说是必须的要求,否则对话就容易出现异常,而且保障率极高)，早期也是急于实现功能，没有对整个的逻辑走向图进行很周到的分析有哪些逻辑上面冲突或说异常等，而且与合作的厂商开发调试起来也比较麻烦整个的测试过程只能人工的重复的去打电话去测，而这个过程是比较耗时的(关键字点: tts播报，asr 断句文本，交集，串行)
  还有一些问题点以及解决点,以下是对我自己2024年展望的关键字提示:
交付效率: 开发效率(需求对齐,功能开发(基于框架,填充定制业务功能代码如低代码平台框架,考验框架的适用度与使用都对框架的应用广度能力),测试,功能质量),实施效率(通用基础技术,一键部署,硬件参数,网络条件等)
一键部署:
单机 docker compose
集群: k8s
通用基础技术：统一登录，权限管理，服务发现注册，自动动态路由(个人搞了一个traefik+consul的demo可以达到自己预期的功能)，log,metrics,trace(jaeger+promethus 实战可以解决)
code review,逻辑review问题
速度与质量 效率平衡问题
2024年初公司战略会议 今天（20240112）下午听了 CEO,CMO 的战略发表讲说， 对这种年终战略性年会有了新的认识，而这也是我第一次参加这种战略性会议，（本质上与内心直觉上真正的 年终战略会议应该是什么样子的一致）亲身实践了一遍就更加肯定了正能量的会议应该往哪个方向靠拢：
 整体来说，回顾过去有哪些可以用数据统计描述的成绩,所以平常时 不要以为可统计性的操作不重要而不去作记录, 一到这中会议性的站台上，数据将是一大亮点，如果听的人会对这些数据觉得有一点认同感，则让演讲者加分不少
 对于不同部门的行动方案,特别是人个的总结与计划,时间上的关系可以不用在会上过多探讨,后续组织专题会议研究和行动安排(像为了这次会议,个人也写了一些文字总结,但听完之后感觉适合在这种战略会议上发言的内容不多, 用专题会来展开交流更适合)
 未来的准备要做的事，milestone（是否有milestone 可以看得出一家公司将要做的事的靠谱性提供极大的参考,不同时期不一定要很具体的文档,但是主创人必须心里必须清楚,如果说出来能让人看得懂）
 对于技术性的实现或者直接的说是细节，则可以 以一个专题会议的形式去讨论，不用在战略性年会上用太多时间去沟通
  在一所公司中，尽自己所能去尝试哪怕想失败(如果预测是100%的失败则可以不轻易去尝试，时间更珍贵)也是一种经验,一是自己没什么可失去，时间花 了，但要花得让自己提高认识度
 一个思考，在国内做管理的总会&amp;rsquo;趋炎附势&amp;rsquo;的的利用每一个表现自己胜任（应对不利局面时能及时破局而有利于组织的利益） 管理或者更高的职位的机会，这是软实力的体现之一，技术上硬实力在没有让自己占据及其重要比例的时（比如长时间内只有自己能解决别人时时不能解决的），软实力很可能是自己安身立命的基点；做管理总会遇到不确定性，管理的价值体现在 处理不确定性让结果往利于公司利益的方面上;总的来说,做管理要会救火,让自己和老板放心,可能有的人做事的方式让一些人觉得不雅不光彩(比如真的是趋炎附势,八面玲珑,投机取巧等),可以从效率和结果来衡量这种人存在的作用和意义
 再说职场,慢和地 表现实在，做事靠谱，在相对公平的环境下，不会吃亏</description>
    </item>
    
    <item>
      <title>Keepalived 实现原理要点</title>
      <link>https://www.jialinwu.com/post/keepalived-%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86%E8%A6%81%E7%82%B9/</link>
      <pubDate>Sun, 15 Oct 2023 12:57:05 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/keepalived-%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86%E8%A6%81%E7%82%B9/</guid>
      <description>Keepalived 实现原理要点 引言 在现代的网络环境中，高可用性（High Availability）比如说双中心主备服务是一个非常重要的需求。在许多情况下，我们不能承受单点故障导致的服务中断。为了满足这个需求，有很多工具和技术可以帮助我们构建高可用性的系统，其中一个就是 Keepalived。
Keepalived 是一个用于保持系统高可用性的软件。它使用了 Linux Virtual Server（LVS）进行负载均衡，以及 Virtual Router Redundancy Protocol（VRRP）来实现高可用性。本文将详细介绍 Keepalived 的工作原理，特别是它如何使用 VRRP 和 Gratuitous ARP 实现高可用性。
实际操作中 我们可以手动配置ip地址（静态ip），换成自动的方式:也可以通过心跳检测的方式声明并自动配置静态ip地址,而VRRP就是实现这种自动化方案的协议.
VRRP 协议 在路由层面，Keepalived 使用 VRRP（Virtual Router Redundancy Protocol）协议来实现高可用性。VRRP 是一种路由协议，它允许几台主机共享一个虚拟 IP 地址。这个虚拟 IP 地址被配置在网络中的其他主机或设备上，作为默认网关。
在一个 VRRP 组（也称为 VRRP 实例）中，一台主机被配置为主（MASTER），其他主机被配置为备份（BACKUP）。每个 VRRP 实例都有一个唯一的虚拟路由器标识符（Virtual Router Identifier，VRID）。
主主机会定期发送 VRRP 广播，这些广播包含 VRID 和主主机的优先级。备份主机监听这些广播，并根据收到的信息确定是否需要接管主的角色。
如果备份主机在一定时间内没有收到主主机的 VRRP 广播，它将认为主主机已经失效，并开始接管主的角色。这个过程包括声明自己为主主机，并将虚拟 IP 地址配置在自己的网络接口上。一旦虚拟 IP 地址被接管，所有发送到这个地址的数据包将被新的主主机处理。
Gratuitous ARP 在网络层面，接管虚拟 IP 地址的过程通常涉及到发送 Gratuitous ARP。Gratuitous ARP 是一种特殊的 ARP 协议行为，用于通知网络中的其他设备某个 IP 地址对应的 MAC 地址已经发生了变化。</description>
    </item>
    
    <item>
      <title>NOOP(no operations)</title>
      <link>https://www.jialinwu.com/post/go-noop/</link>
      <pubDate>Sun, 15 Oct 2023 09:23:29 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/go-noop/</guid>
      <description>默认的interface可以是NOOP,以兼容(避免)或者说最大程度较少代码的侵入性
在编程中，NOOP（无操作）是一个常用的概念，它表示一个不执行任何操作的操作或函数。这在很多场景中都很有用。以下是关于 Go 语言中 NOOP 的一些要点：
 接口默认实现：NOOP 可以作为一个接口的默认实现。例如，在 OpenTelemetry 中，当没有配置 TracerProvider 时，会使用一个 NOOP tracer。这样，如果用户没有提供他们自己的实现，代码仍然可以正常运行，而不会崩溃或抛出错误。
 测试和调试：NOOP 也可以在测试和调试中使用。例如，你可能想要在测试中使用一个 NOOP 实现，以便你可以专注于测试其他部分的代码，而不必担心接口的实现。
 可选的功能：NOOP 可以用于可选的功能。例如，你可能有一个可以记录详细日志的接口，但在某些情况下，你可能不希望记录这些日志。在这种情况下，你可以使用一个 NOOP 实现。
  在 Go 语言中实现一个 NOOP 接口通常很简单。你只需定义一个结构体，并为它实现接口的所有方法，但这些方法什么都不做。例如，以下是一个 NOOP tracer 的简单实现：
type NoopTracer struct{} func (t NoopTracer) Start(ctx context.Context, name string) (context.Context, trace.Span) { return ctx, trace.NoopSpan{} } func (t NoopTracer) WithSpan(ctx context.Context, name string, body func(context.Context) error) error { return body(ctx) }  在这个例子中，NoopTracer 实现了一个 tracer 接口，但它的所有方法都没有做任何事情。这就是一个 NOOP 接口的简单实现。</description>
    </item>
    
    <item>
      <title>在用的科学上网方式:GOST&#43;Cloudflare/Tailscale</title>
      <link>https://www.jialinwu.com/post/%E5%9C%A8%E7%94%A8%E7%9A%84%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91%E6%96%B9%E5%BC%8Fgost/</link>
      <pubDate>Sat, 03 Jun 2023 19:46:29 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E5%9C%A8%E7%94%A8%E7%9A%84%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91%E6%96%B9%E5%BC%8Fgost/</guid>
      <description>在用的科学上网方式:利用GOST、Let&amp;rsquo;s Encrypt（Certbot）、Cloudflare、Tailscale、SwitchyOmega、Potato/shadowrocket(iOS)和Kitsunebi(Android)构建安全通道
总得来说为以下组合:
gost + Let’s Encrypt(certbot) + cloudflare + tailscale + SwitchyOmega + Potato(iOS) + Kitsunebi(Android)
上网畅快度个人体验: gost+Cloudflare &amp;gt;gost+Tailscale &amp;gt;gost+裸露vps IP
ip 被 block 的问题解决要点,plan A: tailscale tailscale 对于个人免费,可以直接访问 tailscale 组建的内网地址访问VPS 上的gost 的socks5 代理服务
ip 被 block 的问题解决要点,plan B: gost套Cloudflare gost注意走 mwss(server),socks+mwss(client)
试了下来看视频比较流畅,比 裸露直连vps 的ip体验要好(直连ip还会时不时出卡顿以及 port 被block 的情况)
server端(VPS): gost -L=mwss://@:443?cert=/etc/letsencrypt/live/rnvps.jialinwu.com-0001/fullchain.pem\&amp;amp;key=/etc/letsencrypt/live/rnvps.jialinwu.com-0001/privkey.pem  生成证书
certbot certonly --standalone  示例证书位置:
/etc/letsencrypt/live/rnvps.jialinwu.com-0001/fullchain.pem\&amp;amp;key=/etc/letsencrypt/live/rnvps.jialinwu.com-0001/privkey.pem
记着定期keepalive 证书
使用systemd进行开机启动
[Unit] Description=Gost.raw service After=network.target [Service] Type=simple ExecStart=/bin/bash /usr/local/bin/wsgost #防止转义问题,把服务端上的gost 运行cmd 放到文件中wsgost #ExecStart=/usr/local/bin/gost.</description>
    </item>
    
    <item>
      <title>Usability and reusability(易用性&#43;复用性)</title>
      <link>https://www.jialinwu.com/post/usability-and-reusability%E6%98%93%E7%94%A8%E6%80%A7&#43;%E5%A4%8D%E7%94%A8%E6%80%A7/</link>
      <pubDate>Sun, 18 Dec 2022 11:01:08 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/usability-and-reusability%E6%98%93%E7%94%A8%E6%80%A7&#43;%E5%A4%8D%E7%94%A8%E6%80%A7/</guid>
      <description> 前面文章提到过易用性和复用性以及在 k8s 文章中提到运行一个vim IDE pod 来使用集群中的服务, 在这里总结积累一下
我的配置好以及打包好的zsh和 vim IDE 开发环境 docker image,在这里: https://hub.docker.com/r/win27v/vim-go-ide
主要包括:
 vim8+
 youcompleteme
 zsh
 tmux
 ack,ctags
  all in one monitor docker image, 基于 promethues 的监控告警镜像,在这里: https://hub.docker.com/r/win27v/monitor-all-in-one
主要包括:
 promethues 数据采集处理
 blackbox exporter 服务检测
 alerter 告警触发
 grafana 数据可以视化
 notification 企业微信机器人消息通知服务
 redis exporter 用于redis的数据采集导出器
 elastic search exporter 用于ES的数据采集导出器
  </description>
    </item>
    
    <item>
      <title>Linux Tips for Operator</title>
      <link>https://www.jialinwu.com/post/toplinux-tips-for-operator/</link>
      <pubDate>Sun, 18 Dec 2022 10:42:03 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/toplinux-tips-for-operator/</guid>
      <description>2022-06-10T10:42:03+08:00
下面这些多是本人日常开发运维会用到的tips,希望也能对读者有所帮助,时不时更新
ssh 代理登录 137只能通过133当跳板机登录,则可以通过 -J (jump) 参数指定跳板机,
#1.1做为跳板机 ssh -J root@100.65.1.1:28996 jialinwu@100.65.1.2 -v #133做为跳板机 ssh -J root@10.1.2.133 root@10.1.2.137  同样适用于rsync来同步文件
rsync -arvP -e &#39; ssh -J root@100.65.1.1:28996 &#39; jialinwu@100.65.1.2:/home/jialinwu/.config/alacritty/alacritty_macos.yml . rsync -rvP -e &#39;ssh -J root@10.1.2.133 &#39; --progress ./File root@10.1.2.137:/data/pending  date: 2021-01-02T10:42:03+08:00
netstat  如何查看哪个进程使用了某个端口
  比如要看8001端口被哪个进程使用可以通过命令netstat -a -p |grep $pid
top  top如何只显示某个进程的资源利用信息
  top -p $pid
 top按资源排序
  top -&amp;gt; x-&amp;gt; b -&amp;gt; &amp;lt;&amp;gt;</description>
    </item>
    
    <item>
      <title>Go Tips</title>
      <link>https://www.jialinwu.com/post/topgo-tips-that-mabybe-can-help-for-you/</link>
      <pubDate>Sun, 18 Dec 2022 06:29:29 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/topgo-tips-that-mabybe-can-help-for-you/</guid>
      <description>这些 tips 是有本人日常开发所遇到过的 issue 后记录下来的解决方法，会不定期更新。
NOOP interface 2023-10-15 08:40
默认的interface可以是NOOP,以兼容(避免)或者说最大程度较少代码的侵入性
以OpenTelemetr为例子,没有配置 tracer 提供者(provider)，所以返回的是一个 Noop tracer,对主体代码的运行没有影响.
言简意赅的go scheduler解释 2021-01-02T06:29:29+08:00
concurrency好，scheduler就得好。 Rob Pike的&#39;Concurrency Is Not Parallelism&#39; scheduler的成本主要是： a) communication b) migration scheduler方式主要有2种： work-sharing: 自己忙就往其他process上扔 work-stealing: 自己空闲就从其他process上偷几个来干 go用的是work-stealing，借鉴于CILK设计论文，tokudb在最早的时候也用了CILK。 粗讲很简单： 就是每个P(process structure)上有个 runnable goroutines list, goroutine结束一个就从这个list摘除一个，如果list空了，那就去“偷”活干，communication和migration都比较低。  来源于BohuTANG
go tooling in action 2017-09-02 14:29:29
go 的工具链对于不管是在编码工作，编码规范，性能分析 tunning 方面基本说是必备的，这个视频 以及提供了 配套练习 简洁快速干货，值得一看。
internal package 在使用goimport进行包自动引入时，如果不同项目含有一样的包后缀和方法，可能会出现引入错误，而放在 internal 文件夹下面的 package 只能被当前的项目所引用就能很好的解决这个瘙痒问题。如果把 internal 放在 project 下面的第一层，那么 internal 里面的包就只能被该 project 引用了。</description>
    </item>
    
    <item>
      <title>那些很可能一不小心容易忽略的重要步骤</title>
      <link>https://www.jialinwu.com/post/%E9%82%A3%E4%BA%9B%E5%BE%88%E5%8F%AF%E8%83%BD%E4%B8%80%E4%B8%8D%E5%B0%8F%E5%BF%83%E5%AE%B9%E6%98%93%E5%BF%BD%E7%95%A5%E7%9A%84%E9%87%8D%E8%A6%81%E6%AD%A5%E9%AA%A4/</link>
      <pubDate>Sat, 06 Aug 2022 08:28:09 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E9%82%A3%E4%BA%9B%E5%BE%88%E5%8F%AF%E8%83%BD%E4%B8%80%E4%B8%8D%E5%B0%8F%E5%BF%83%E5%AE%B9%E6%98%93%E5%BF%BD%E7%95%A5%E7%9A%84%E9%87%8D%E8%A6%81%E6%AD%A5%E9%AA%A4/</guid>
      <description> 感觉更像是敏捷开发中的坑总结
详尽日志 不怕日志多，就怕有问题没有足够的线索提示去支撑排查
 所有日志 向stdout:特别是早期开发阶段，这一块的日志要注重可读性，比如颜色高亮,日志可以分级别输出，后期可以把debug级别的日志过滤丢掉;使用循环日志避免占用全部磁盘空间
 入库统计数据单独binlog文件,先写文件后入库(WAL)
 上下文调用日志分文件输出,这些很可能要进行入库，直接json格式
  数据量与性能评估 这些在需求评估的时候就要注重提前说明(当然如果有相关经验下才会意识到),在不同数据量的情况下,涉及到 数据结构、数据表设计到与功能性能的 关键点:
能用MongoDB 或者Elastic Seach最好直接用，不管是DDL 还是性能比关系型数据库MySQL,Postgress要方便灵活
 比如在 报表 统计方面，查询方面,NoSQL型的数据结构算法更适用,就像OLAP比OLPT在统计查询方面更占优势; 如果涉及到多表关联查询，为了性能和业务功能，必要的冗余数据得融合起来
  传输协议 (websocket与 http都是用tcp，但是一个可以自由回写，一个被动触发才机会回写 这在功能实现的效率上 表现的截然不同):
 像长语音流转写文本,走实时流传输就会比一次性请求转写要高效(实时传完最后一个分段流,整体体的文本结果就出来了,而一句话转写从存储成一整段录音-&amp;gt;传输录音-&amp;gt;服务器转写整段录音的全部过程要双倍时间，但是从体验上却是 瞬时与大半天的 效率表现)，而短录音片段则用 一次性转写的http请求更简单方便
  </description>
    </item>
    
    <item>
      <title>陪伴了n年(n大于7)的2015 Retina Macbook Pro</title>
      <link>https://www.jialinwu.com/post/%E9%99%AA%E4%BC%B4%E4%BA%86n%E5%B9%B4n%E5%A4%A7%E4%BA%8E7%E7%9A%842015-retina-macbook-pro/</link>
      <pubDate>Sat, 30 Jul 2022 12:03:08 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E9%99%AA%E4%BC%B4%E4%BA%86n%E5%B9%B4n%E5%A4%A7%E4%BA%8E7%E7%9A%842015-retina-macbook-pro/</guid>
      <description>update 2022-12-07
升级到macOS12后，应该是因为自己换了三星的970 evo的ssd导致开机后不久就自动重启，根本没法用; 还好原装的ssd没丢，换回出厂的ssd后，使用起来回归了正常。 后面了解应该是因为转接头导致的兼容性问题,比如松动,或者有灰尘等,不过没有去验证真实原因,也没必要验证
虽说一开始自带的SSD的容量才有128G，期间换了512的ssd:
 一是因为容量原厂的容量太小，
 二来一小部分听说大容量的ssd速度 会更快，但是比起基础的可用性，容量 和速度 倒显得不再重要了，
 再说了，最近工作中就代码或者资料存储而言，没有对大容量，大内存的需求,再说公司有服务器可用,ssh上去就可以工作
  这款macbook现在更多是充当上网本和计算代理任务：
 总结而来，先保证基础(可上网，可操作)，再考虑扩展(更大的容量和更快的运算);
 工作开发也是同理，得先有基础的主线，这个主线必须是简洁可理解的，基于这个主线去做迭代和扩张;合到主线上的功能 尽可能是可复用易用的
  说到可复用易用的:
 自己配置好的IDE做成镜像或者可自动配置化生成，下次换个环境 直接 跑镜像或者自动化配置脚本 就可以 快速 加到自己舒适的开发调试环境中 ，对于国内更推荐镜像我方式，如docker image,像我就是把配置好的vim IDE配置好，装好需要用的插件之后，持久成镜像，虽说image大小达好几个G，但比起重新 一个一个配置，重新 编译要省事得多
 最近比较热门的chatGPT，可以 说是一个更人性化的检索工具，多数情况下可以 先参考一下它的答案，这样更容易给自己带来启发，较快的避免陷入自己的知识盲区，但要注意的是它的答案只能是参考，答案对应的措施要解决实际的问题一定要再过一下自己的思考和整理后才可用
  2022-07-30T12:03:08+08:00
最近远程办公，从2015年中开始 在用的2015版MacBookPro 连上27寸的4k显示器，一周内死机三次， 可能是驱动4k 对于这台老本来说还是比较吃力的(实际上不是)，而不知不觉，这台2015款MacBookPro已经陪伴我快7年了， 在2022年看来这款笔记本还值不值得入手呢？就综合来看这款笔记本放在今天 还是有一定的卖点的
依稀记得当初这台笔记本的 高分辨率屏目 和一体铝合金机身 是亮点，如今看来依然很靓
一周内 内置键盘和触控板 失灵三次(后来发现很可能是MacOS 10.15才会容易出现,升级到MacOS 11暂时没有发现问题)
 升级到11后，接usb hub后，关机重启还是会出现!! 在tb上花15块买了一根排序，换上后(虽然新排线长了一丢丢，不过不影响盖子合闭)，目前问题可以解决.
 老排线也能用，但是可以要关机 手机插拔 电池排线和键盘排线后再装上，多数情况可以再用,如图见底部</description>
    </item>
    
    <item>
      <title>日志埋坑优化实操记录</title>
      <link>https://www.jialinwu.com/post/%E6%97%A5%E5%BF%97%E5%9F%8B%E5%9D%91%E4%BC%98%E5%8C%96%E5%AE%9E%E6%93%8D%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Wed, 20 Jul 2022 19:40:04 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E6%97%A5%E5%BF%97%E5%9F%8B%E5%9D%91%E4%BC%98%E5%8C%96%E5%AE%9E%E6%93%8D%E8%AE%B0%E5%BD%95/</guid>
      <description>目前线上日志处理流为:
一条日志先写文件-&amp;gt;生产者写redis list-&amp;gt;消费者读redsi list-&amp;gt;写MySQL/ES
当初这样设计主要是为了:
 先写文件: 防止数据要进行恢复,可以进行重写
 写redis list: 防止直接写MySQL，迸发写过大，写失败，(还可以批量写MySQL/ES),不用kafka的原因纯是不想引入过多中间件
 在consumer这里消费后写入redsi set中进行数据计算聚合: 比如有效对话轮数,结点数等
  但是这套方案下来，生产速度稍微大点出现消费速度慢的问题,观察日志后发现，一条日志 处理要起码7次网络io,pop 的消费速度最高80/s，还不如让消费者直接写ES,通过打耗时日志,发现比较显著的问题:
 pop/push to redis慢(也可能是其它服务频繁读写redis导致服务变慢)，单次耗时达50ms+,
 日志decode比较慢耗时不少达40ms+（json Unmarshal)
 写MySQL最慢:100ms+，比写redis慢10x(实际上慢100x),写ES最快:4-5ms,
  针对读写redis慢的问题 后面怀疑是不是go的代码有问题,同样的redis cluster用python试了一下，push的速度很快符合redis的毫秒级操作, 试着更换go的redis代码包后发现,在golang中对redis进行push/pop慢(单次耗时达50ms+)的原因在于这个redis client的v6版本包的cluster代码有问题，不过使用单例时速度倒正常(1ms以下),后面通过升级到v8版本后，测试发现可以解决,而v8版本对应线上的redis 6不会有问题.
针对入库慢导致消费慢问题 日志的消费入库路径为 list -&amp;gt;ES -&amp;gt;MySQL -&amp;gt;redis
发现这个瓶颈之后，在消费端使用golang channel进行缓存到内存优化, 把写库慢的MySQL操作放到channel中进行异步入库，先写ES，这样可以保证数据最快入库(这个方案可能在程序突然推出时出事丢失日志的情况，但可以通过 在生产端从日志文件中重写日志到队列中恢复,日志重跑不影响数据的幂等性)；
或者使用简单又能满足当前迸发大小的方案， 生产者直接写ES, 后面需要的统计数据 离线定时计算(这个改动较大，出事故风险大，没实践)
最终优化后对不同入库速率50,100,150,200,300进行测试后，发现入库速率200/s左右为比较理想的入库速率，为了防止写库过于频繁错误产生，特意用uber的ratelimit进行限流入库
写数据的问题的一些思考总结:  是upsert还是单read/query或者单write/insert: query(索引/慢查询问题),update:query&amp;amp;&amp;amp;write(数据大小/类型/批处理问题);
 批量read/write(考虑一次写的最大数据大小限制 ，MySQL/ES的批量写入大小限制 )；
 读写失败，重试的策略
 数据库的写大概耗时,redis:1ms-, ES:5ms左右,MySQL:100ms+
  针对批处理读写问题 这里实现了一个golang的批处理代码:从channel中消费数据,数据量达到阈值或者到达时间超时阈值时，进行数据的批处理执行</description>
    </item>
    
    <item>
      <title>Hex to decimal value out of range reproduce by Golang</title>
      <link>https://www.jialinwu.com/post/hex-to-decimal-by-golang/</link>
      <pubDate>Tue, 21 Jun 2022 20:34:40 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/hex-to-decimal-by-golang/</guid>
      <description>tmd的,不知道哪个蠢货,16进制转码10进制的结果溢出了还照样用，原则上不建议这样,但是历史原因也就一直用了下来;
连window上的计算机也是这样，估计也不会修改把bug当feature了.
使用golang还不能容易复现这个问题,因为转换溢出会有提示，还好依稀记得大学专业课上老师提到过的 整型与非整型转换的原理: 取反码, +1&amp;hellip;
以下是实现
golang https://go.dev/play/p/vQOXCvXorBn
func Hex2Dec(hex string) int64 { decimal, err := strconv.ParseUint(hex, 16, 64) if err != nil { fmt.Println(err) return 0 } fmt.Printf(&amp;quot;ret^1*: %v\n&amp;quot;, decimal^0xFFFFFFFFFFFFFFFF+1) fmt.Printf(&amp;quot;1-ret: %d\n&amp;quot;, int64(1-(decimal^0xFFFFFFFFFFFFFFFF+2))) return int64(1 - (decimal ^ 0xFFFFFFFFFFFFFFFF + 2)) } func Hex2DecStr(hex string) string { return fmt.Sprintf(&amp;quot;%d&amp;quot;, Hex2Dec(hex)) }  lua则直接调用就可以复现(c实现的缘故)
print(tonumber(&amp;quot;8e62a857bb000827&amp;quot;,16))  </description>
    </item>
    
    <item>
      <title>Go Vendor And Gitignore Issue</title>
      <link>https://www.jialinwu.com/post/go-vendor-gitignore-issue/</link>
      <pubDate>Fri, 03 Jun 2022 09:53:22 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/go-vendor-gitignore-issue/</guid>
      <description>一次vendor打包代码折腾过程 项目中要打包代码提供给客户(外包公司的味道)，由于引用了内网git仓库的私有包，想到了使用vendor打包代码方式，在使用go mod vendor打包时，最终发现 vendor中有遗漏文件的问题 导致打包进 vendor中的私有仓库的代码无法直接被使用而导致编译失败，一开始以为是对 GO111MODULE=off/on 的理解有问题或者使用方式不对导致，最终 在进行 git add 时 强制把vendor下的所有文件进行 commit, git add -f vendor, 然后在干净的环境中，GO111MODULE=off下可以正常编译
git ignore配置问题 后面想找出为什么vendor中文件没有被 git add include，如果知道哪个文件include失败，可以用 git check-ignore检查,如
git check-ignore -v &amp;lsquo;vendor/github.com/opentracing/opentracing-go/log/field.go&amp;rsquo;


像图中(右键打开新窗口放大) .gitigignore 设置了 log/
这个会递归应用到 每一个目录下，从而导致vendor中的一些包的 log中的代码无法被include进git add中
go mod vendor 打包使用逻辑 如果vendor有完整的包存在， GO111MODULE=off时则优先使用vendor下面的代码包,否则会拉取依赖代码，如果vendor中的文件有缺失，则直接报错在$GOROOT或者$GOPATH中找不到代码包
那么如果GO111MODULE=on进行编译时，是不是也和off一样，优先用vendor中的代码呢？不会！go 会尝试从远程服务器重新拉取代码；
或者 添加-mod=vendor，即使有GO111MODULE=on的情况下(GOPROXY=https://mirrors.aliyun.com/goproxy/ GO111MODULE=on GOPATH=$(GOPATH) CGO_ENABLED=0 go build -mod=vendor)
这等价格于 GO111MODULE=off</description>
    </item>
    
    <item>
      <title>Running App On k8s By Helm</title>
      <link>https://www.jialinwu.com/post/running-app-on-k8s/</link>
      <pubDate>Sat, 14 May 2022 08:50:23 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/running-app-on-k8s/</guid>
      <description>A ConfigMap is an API object used to store non-confidential data in key-value pairs. Pods can consume ConfigMaps as environment variables, command-line arguments, or as configuration files in a volume.  configmap可以把配置映射到 环境变量中，也可以写到文件中供程序读取: 这样以来，就部署迁移到k8s,对于程序来说是无感知的
把app部署到k8s运行，几个关键点:
 打包镜像,处理daemon process
 配置环境变量化(加少量加载配置代码),也可以把configMap配置到文件中(无需改动程序加载配置代码)
 目录volumn配置映射
 helm 配置化
  把app部署到k8s时，考虑最小化改动程序代码，这里把原来app运行时用到的config.yaml的内容设置到一个环境变量如这里的talkingbot_yaml中, app启动代码优先读这个环境变量，如果不为空则取改变量值作为替换为原来config.yaml的内容,如果为空则说明按照原有的文件路径的方式取config.yaml
部署app的演进历程 running one app:raw  app -c config.yaml
   running one app:docker  DockerFile: entrypoint e.g. talkingbot:1.0
 build images, e.</description>
    </item>
    
    <item>
      <title>通过http请求超时观察tcp链接问题</title>
      <link>https://www.jialinwu.com/post/http%E7%9F%AD%E9%93%BE%E6%8E%A5tcp%E5%A4%8D%E7%94%A8%E9%97%AE%E9%A2%98/</link>
      <pubDate>Tue, 26 Apr 2022 20:15:34 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/http%E7%9F%AD%E9%93%BE%E6%8E%A5tcp%E5%A4%8D%E7%94%A8%E9%97%AE%E9%A2%98/</guid>
      <description>项目中写了一个中间件使用http传语音包的功能: 首先 从websocket中读取语音流包，然后向http server上传语音流, 生产端会每100ms写一个二进制语音流包, 中间件上传完50ms(等http server 响应)后再从websocket中读取 再上传(得用tcp链接)， 那么这个上传过程可能会因为少量请求响应超过100ms，最终影响 用于ASR转写的语音流 整体滞后;
单从上传的角度看解决这个滞后问题,可以只上传然后不等待对接服务的响应,当然这样做会引入其它问题，
这里所指的是http1.1
 -request timeout 10ms-&amp;gt; websocket &amp;lt;--r/w--&amp;gt; proxy asr(http) &amp;lt;-response 50ms-  这里是记录视频click here to watch the demo video
比如 怎么只上传然后不等待对接服务的响应呢? 虽然一般不这样做 在golang的http timeout中, transport timeout 或者 http client配置的timeout，这两者设置得过小比如10ms，只要保证大于单次 roundtrip time,数据能够让http server接到即可
比如 http timeout后，底层的tcp链接会直接关闭，而且是client主动关闭,会存在大量TIME_WAIT的链接,怎么解决? 答案是 net.ipv4.tcp_tw_reuse, 从官方文档可知,处于TIME_WAIT状态下tcp链接可以重新走三次使用port,如图中用tcpdump抓包显示，每一次请求会走三次握手，还有服务端口返回响应会被拒收rst掉(往已经关闭的链接上发package会收到rst，比如这里的server端,或者没有进程监听的端口上发起建立链接请求);(net.ipv4.tcp_tw_recycle 就不建议使用了特别是对于server主动关闭tcp的情况，而且从linux kernal 4.4开始已经把这个配置参数去掉了)


http client发起大量的短链接对http server有什么影响？ 一个是 tcp 的sync queue或者accpet queue会被占满导致后续的链接请求被drop掉如图所示，这有点类似于DDoS攻击, 服务端可以把sync队列调大来一定程序上解决这个问题
debug以及一些优化tcp链接配置笔记 netstat -anp|grep TIME sysctl -a|grep net.</description>
    </item>
    
    <item>
      <title>一些总结</title>
      <link>https://www.jialinwu.com/post/conclusion/</link>
      <pubDate>Thu, 03 Feb 2022 10:16:02 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/conclusion/</guid>
      <description>如题,一些小结:
软硬实力 软实力: 沟通是为了解决问题,不是为了解决人, 如果问题出在人身上,则要看到是不是制度上存在问题进而更好的完善制度; 如果纯粹是为了解决人而气急败坏大概率得不尝失(以自身经历看,更会失去人心)
硬实力: 从开源中学习,身边的同事请教(可遇不可求),多留意观察, 理解,体会,输出,反馈开源; 思路是这样,比如WAL,promethues metrics监控
一个技术人员应该把解决问题的原理讲得简单易懂 如果一个技术人员不能把解决问题的原理讲得简单易懂,那么还可能他对这个技术并不了解或者说对其中的应用场景,并不了解,大多数要么只是照搬书上的言论,要么没有实际应用经验,要么没有结合这两者实操(多数人可能属于这种)。
比如一个正面的例子,拿WAL(write ahead log)来说
“如果每次写的log都在,怎么做到基于这些log做回放的问题？ 其实就是redo-log + checkpoint + LSMT. redo解决数据不丟,checkpoint解决, recovery的时候扫描的redo尽量少, LSMT解决每次写入后新的page不会覆盖老的数据, 这类实现是比较简单可行,也是目前的主流做法”  来源博主
短短一句话道出了日志在数据库中重要作用的实现原理。
对比来说,拿自己来说目前在项目已经实现使用的先写日志再入库的方式,其实用专业的名词就是WAL但是我之前并不知晓,这也是摸着石头过河不多参考行业资料的一个弊端,双说,自己满足了解决数据同步异常可恢复的情况,但是要想我更专业的方向去看待的话,还是得多看多参考行业的说法,然后总结加以引用,其实做技术落地研究就像写论文那样专业。
也比如 都说raft比paxos理解容易，但是我比较认同，这篇文章中的观点可靠分布式系统-paxos的直观解释.
有一句古话叫做：&amp;rdquo;学而不思则罔,思而不学则殆&amp;rdquo;,多思考,安排好,有目的的去行动和效率大增,有安排,哪怕只有30%或者70%的安排,比没有安排的去做,要好得多省时省力。
先解决主流问题,未想到或者其他边缘的问题后面再优化 像这种情况可能是大多数人(特别是部分外包以及中小公司)的实际操作,目前的主要问题解决了后面的问题,受限于当事人的事野或者认知能力,可能会存在一些隐患,但也是一件不可避免的事情,但是那些未想到或者边缘问题如果在当前场景下产生致命的缺陷,就是当事人的责任了。所以每一种解决问题的方案,都应该加上应用场景和限制以及不可预知的提示说明。
比如说,像产品预研多数只是想把功能做出来能演示的一个程度,而其他的一些bug,或者应对大迸发的问题那就是跟往后面的事情了,像一些大的产品发布会apple上面的功能演示,主要功能先出来而小问题很可能就出现在当时的现场中,但是人家也会标明,这只是一个beta 版,或者preview的版本。
技术是解决特定场景下的问题,没有最好的技术,只有最适合的技术。在满足需求和场景的情况下,技术实现越简单越好。
项目上的技术原理不总是最难的,归结于制度上的灰色操作,难的是沟通对接环境数据打通 投像gov类的2B项目,投标只是一个过场, 关系利益才是魔鬼,这种现像不管慢大城市还是小乡镇,到处存在。在这种环境下积累技术比较很务实以至于平庸得不像软件工程: 特别是对于小公司(做事讲究效率)去对接大集团(沟通成本很高,层层传递) 以至于小公司里面搞得 说要就要,多数没有合理的安排可言,搞得做事的人身心容易疲惫,不全是,但比较普遍</description>
    </item>
    
    <item>
      <title>spinlock,自旋锁,乐观锁? Golang实现atomic.AddFloat64</title>
      <link>https://www.jialinwu.com/post/spinlock%E8%87%AA%E6%97%8B%E9%94%81%E4%B9%90%E8%A7%82%E9%94%81/</link>
      <pubDate>Sun, 04 Jul 2021 11:43:53 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/spinlock%E8%87%AA%E6%97%8B%E9%94%81%E4%B9%90%E8%A7%82%E9%94%81/</guid>
      <description>在promethus包中使用了atomic这个包,如下面代码
110 func (g *gauge) Add(val float64) { 1 for { 2 oldBits := atomic.LoadUint64(&amp;amp;g.valBits) 3 newBits := math.Float64bits(math.Float64frombits(oldBits) + val) 4 if atomic.CompareAndSwapUint64(&amp;amp;g.valBits, oldBits, newBits) { 5 return 6 } 7 } 8 }  之所以这么做是因为
 使用的是float的类型的参数来达到 范型化(float即可兼容unsigned interger如counter,或者interger如gaugekk;w
 在考虑性能提前下，不用mutex或者chan来实现增加大小功能
 atomic包里面没有AddFloat64 可用
  为了达到这些要求,使用 取基值的bit大小 + CAS的方式来实现; 作者在视频中展示的benchmark的对比也可以看出 atomic的实现要快得多
类似的时序代码 a := int64(1) basicA := a // 相当于Load步骤,有多个goroutine同时获取到了相同的基数 b := a+int64(2) //新值大小 if atomic.CompareAndSwapInt64(&amp;amp;a, aabasicA, b) { //goroutine1 fmt.</description>
    </item>
    
    <item>
      <title>Setup Gomod Proxy for Private Repository</title>
      <link>https://www.jialinwu.com/post/golang-private-repository-setup/</link>
      <pubDate>Sun, 25 Apr 2021 19:51:23 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/golang-private-repository-setup/</guid>
      <description>update: git server(gitea,gitlab) 部署在linux环境中并且开启ssh 登录, git 代码中设置使用 ssh 的方式进行 clone/push/pull等操作,比如
git config --global url.&amp;quot;git@192.168.1.234:&amp;quot;.insteadOf &amp;quot;https://git.server.com/&amp;quot; #~/.gitconfig [url &amp;quot;git@192.168.1.234:&amp;quot;] insteadOf = https://git.server.com/  一般处理内网私有仓库会遇到好几个的问题:
- https证书生成，信任问题
- ip:port转成域名问题
- private repository config issue
- CI issue
- &amp;hellip;
以目前内网git仓库的地址为192.168.1.199:3000,而且没有设置域名访问,最终要达到以git.server 域名访问,可通过 go get -v git.server/qnzs/helper 拉取内网包.
梳理出来的部署设置步骤如下:
host设置  /etc/hosts
 127.0.0.1 git.server 
  nginx代理以及证书设置  自签证书可通过以下命令生成
openssl req -x509 -newkey rsa:2048 -keyout myservice.key -out myservice.cert -days 1095 -nodes -subj &amp;quot;/CN=git.</description>
    </item>
    
    <item>
      <title>Dev in K8s Env</title>
      <link>https://www.jialinwu.com/post/dev-in-k8s-env/</link>
      <pubDate>Wed, 03 Mar 2021 20:27:00 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/dev-in-k8s-env/</guid>
      <description>build a side-car pod for dev, in this way we can use all service power by k8s;
in one k8s env, pods expose their entrypoint(service) by Service;
it’s ok for one single port exposing by nodeport, but for cluster, e.g. kafka or redis cluster, it’s hard way, like the flow bellow:
it’s much more convenient to use one cluster service inner k8s network, and we use DNS but no directly ip( 192.</description>
    </item>
    
    <item>
      <title>系统内存申请策略导致的redis 报错分析</title>
      <link>https://www.jialinwu.com/post/%E5%86%85%E5%AD%98%E7%94%B3%E8%AF%B7%E7%AD%96%E7%95%A5%E5%AF%BC%E8%87%B4redis-%E6%8A%A5%E9%94%99/</link>
      <pubDate>Thu, 28 Jan 2021 19:46:32 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E5%86%85%E5%AD%98%E7%94%B3%E8%AF%B7%E7%AD%96%E7%95%A5%E5%AF%BC%E8%87%B4redis-%E6%8A%A5%E9%94%99/</guid>
      <description>发现在redis的日志中出现如Can&#39;t save in background : fork: cannot allocate memory错误，如图:
不难看出这是redis在尝试用子进程进行数据备份时无法从系统中分配到内存的提示(假设fork后父子进程进行了内存数据的复制，当然有copy on write技术的加入实际所需要内存会小)，这是由于Linux系统的对程序申请内存时有相关策略控制引起的
redis官方建议的解决方案是把vm.overcommit_memory设置为1
出现这种情况一般满足以下三点:
 系统中所有程序已经申请的内存+加上准备要申请的内存大小接近了系统预设阈值,即Committed_AS接近CommittedLIMIT (memory of all processes is close to or more than half of allocated memory/system memory(memory is 32+GB and 27 GB is left))
 系统配置vm.overcommit_memory的值为0(vm.overcommit_memory is set to 0)
 此时redis正在进行后台数据备份(when redis does a background save.)
  linux系统预设的阈值可通过grep -i commit /proc/meminfo查看，其中:
Committed_AS: 表示所有进程已经申请的内存总大小 CommittedLIMIT: 所有进程总共可以申请内存+swap的上限值  CommittedLIMIT的计算公式为: (Physical RAM * vm.overcommit_ratio / 100) + Swap</description>
    </item>
    
    <item>
      <title>Leader election by etcd or Redis</title>
      <link>https://www.jialinwu.com/post/master-lock-base-on-redis/</link>
      <pubDate>Sun, 08 Dec 2019 23:20:06 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/master-lock-base-on-redis/</guid>
      <description> 业务中有一个统一写MySQL的服务这里称为DataAgg，但进行为了高可用需要进行主备(master-slave,leader-follower)集群部署,多个运行着的DataAgg只能同时有一个允许工作(基于高可用KV的Master发现策略-Master Discovery by HA KV), 大概的实现思想是, 基于redis集群或者ETCD的分布式锁来实现
以ETCD为例: 如果部署有ETCD(originated from two ideas, the unix “/etc” folder and “d”istributed systems) 直接调用官方包提供的方法即可,主要代码NewSession-&amp;gt;NewElection-&amp;gt;Campaign,在Campaign时如果未能成为master或者leader就会一直卡住；若Campaign返回则说该调用端的服务获取到了leader角色，具体代码在底部,效果如图:


以redis-cluster为例:  以一个key是否存在作为是否有 master角色的DataAgg 工作的标志; value记录主DataAgg的信息; 这个key设置有TTL,防止master异常情况
 多个DataAgg轮洵同一个key，dataAgg得到value后与自身信息校验:
 如果value为空,即这个key不存在也就还没有master工作,则更新这个key,自身成为master
 如果是自身并且也是master,则更新这个key
 如果不是自身,不作处理
   这样会存在什么问题?
 TTL时间可能不会有master,比如master在update masterKey之后异常消失; 无DataAgg工作的TTL时间与影响业务程度大小，需要考虑,一般成正比,TTL越长业务影响可能越大
 无法知道有哪些DataAgg服务结点正在运行,比如可能有&amp;rdquo;僵尸&amp;rdquo;进程没有被正确的进行退出处理，这个进程一直占用着master的角色导致整个DataAgg集群不能正常工作
  后来改善一下:
 各个DataAgg发心跳包请求分别定时上报自己的信息;
 去掉masterKey,改为每一个DataAgg获取所有结点的信息后，作master检验,检验策略或者算法可以定制,master认定算法单独抽出来可测试化
  在redis中这样实现:
 NodePeers这个set保存结点的id:这样每一个peer通过这个set就可以知道有哪些peer运行着
 每一个peer定时发心跳包请求设置key:value,其中key会在NodePeer这个set填入， value则是自身的信息
  由于网络的延迟性，可能会出现多个master角色工作的情况；这样解决:在每一个peer中进行master校验时，发现多个master并且自身也是master的情况，则peer主动退回成slave或者follower的角色，等到下次心跳时进行master的决策认定;
etcd具体代码test case:
 </description>
    </item>
    
    <item>
      <title>消息队列的数据存储和传递(mesage delivery and storage of queue)</title>
      <link>https://www.jialinwu.com/post/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97%E7%9A%84%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E5%92%8C%E4%BC%A0%E9%80%92message-deliver-and-storage-of-queue/</link>
      <pubDate>Sun, 21 Jul 2019 08:33:54 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97%E7%9A%84%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E5%92%8C%E4%BC%A0%E9%80%92message-deliver-and-storage-of-queue/</guid>
      <description>本质是 一次rpc变为两次rpc，以此来解决满足不同的业务场景问题,如
 cache 流量产生者对消化者的 服务压力问题，如异步发短信，现有才10个qps的短信网关要支持300qps的producer，若是同步短信则必会卡住producer,那么可以把短信数据存放到queue中，在满足业务的需求下，稍后发送;
 广播 消息通知, 单点服通知多服务内存中的热数据(配置，业务数据)更新
  其中的技术关键点在几个:
消息的传递  消息的顺序性,解决点在于 seq序列号的应用
 重传,是否保证消息到达或者消息传输的可靠性（一定到达，或者错误一定可以定制处理）; 解决点在于 应用seq和ack,即序列号和确认处理的使用, TCP协议的处理是很典型的参考（对于后端开发TCP最基本不过了)
  数据存储  最大化的不让数据丢失，解决点,简单的讲就是在set and get上面的优化
 如 数据从RAM持久到disk的策略如当数据大于一定体积（可配置)后将数据刷盘,flush by data size; 或者定时刷盘flush by time ticker;或者两者结合使用; 而flush to disk的过程中，kafka只对数据append的处理大大加快了数据在disk上的持久化过程
 获取数据时若是在RAM中，则考虑优化查找算法，减缓CPU; 若是在disk中，则考虑zero copy来减少user space and kernel spacke 的上下文传递损耗,如kakfa
  存储体积上的优化,解决点在于数据encode and decode，比如protocol buffer
 体积小 protocol buffer（采用TLV:tag length value的位控制技术来最小化数据体积;
 快 相比于text-based协议如json,xml等,binary-based的protocol buffer位操作得益于数据小，减少了数据在解析时的运算和读取写，效率一般比text-based要高,
 Both text-based and binary-based serializers can be fast and efficient (or slow and horrible)&amp;hellip; just: binary serializers have the scales tipped in their advantage.</description>
    </item>
    
    <item>
      <title>日志处理相关</title>
      <link>https://www.jialinwu.com/post/%E6%97%A5%E5%BF%97%E5%A4%84%E7%90%86%E4%B8%8A%E7%9A%84%E4%B8%80%E4%BA%9B%E6%80%9D%E8%80%83/</link>
      <pubDate>Sun, 12 May 2019 10:29:48 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E6%97%A5%E5%BF%97%E5%A4%84%E7%90%86%E4%B8%8A%E7%9A%84%E4%B8%80%E4%BA%9B%E6%80%9D%E8%80%83/</guid>
      <description>数据处理是一项细活，每步相关问题都值得梳理清楚
日志处理流: 日志格式-&amp;gt;写日志文件-&amp;gt;读日志文件-&amp;gt;数据队列-&amp;gt;流处理入库-&amp;gt;离线分析-&amp;gt;报表API查询-&amp;gt;可视化
日志格式:
 自定义数据格式，比如field之间分隔,如果以| 竖线分隔，那么就要做好每一个filed值的encode和decode处理，否则很可能出现数据错乱导致下一步解析问题;
 使用json结构，简单，容易扩展,但是空间利用率有点浪费; 像在golang,最好不要使用自带的标准json 库,效率不高
  写日志文件:
 对于高并发程序，写日志做好缓存批量写入而不是一次请求写一次文件，要不IO压力大，请求服务响应也有变慢
读日志文件:
 使用filebeat持续监控日志文件读取数据推向下一个数据点; filebeat把日志读取的偏移位置与日志文件inode绑定，即使日志产生切割，但是inode不会变化,多个日志文件的内容不会出现读取跳过的问题，但要注意 给filebeate设置日志文件时，使用正则去指定 日志整体(比含有某命名前缀的 ailog* 或者某个目录,而不是单个日志文件名,如1.log)
  数据队列:
 通常后端服务会起多个服务实例做负载均衡，如果日志从文件读取后立刻写入数据库,比如MySQL，数据库的写入压力就起来，会出现超时数据无法写入现象；使用数据队列比如kafka来缓和数据IO压力; 消息队列的选择有得讲究，生产者-消费者，pull 还是push, 是否保证发收顺序,消息单播还是广播等要根据业务场景选择;
  流处理入库
 storm
 在前面有消息队列抗压的前提下，入库程序或者脚本可以根据有条不紊的执行
  离线分析
 基于原生数据进行聚合，清洗，训练，这是人工智能平台不断持续演进升级的后劲
  报表API查询
 查询慢需要解决,druid,甚至出现基于机器学习的查询过程,LRU
  初始公司，人手少，开始阶段忙于写业务，就 make it work, make it right and make it fast三点来看，都做到了但是不健壮,一方面与建设者的经验,眼光和能力有关，另一个方面，基础架构的复杂与业务的体量大小这中间的trade-off,衡量不好，后续改造成本负担不小;
过程记录: 数据流量大的日志在入库时 势必会对数据库产生比大压力，虽然目前日志是先存放到文件中，再从文件解析后入库，存在可能因为日志解析后入库导致的日志文件消耗过慢，从而由日志文件切割产生日志数据遗漏问题，解决方法是可以在数据库前加一个消息队列如kafka来缓和压力:一方面可以加快 日志解析速度，另一方面可以减缓数据库的入库压力。
日志收集:
使用filebeat持续监控日志文件读取数据推向下一个数据点;
另个一个是数据的聚合问题：</description>
    </item>
    
    <item>
      <title>第一次换公司</title>
      <link>https://www.jialinwu.com/post/%E7%AC%AC%E4%B8%80%E6%AC%A1%E6%8D%A2%E5%85%AC%E5%8F%B8/</link>
      <pubDate>Sun, 02 Sep 2018 18:20:26 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E7%AC%AC%E4%B8%80%E6%AC%A1%E6%8D%A2%E5%85%AC%E5%8F%B8/</guid>
      <description>许久没写博客了，一方面是自己懒，一方面是换了新公司，忙起来更没什么心思记录；在新的公司已经将近过试用期，自上一家公司辞职到现在，这几个月过去，体验了不少新的历经；还是值得记录一下。
从上家公司辞职
上家公司待了三年，头一两年还好，学到了不少技能，但第三年，总感觉学到的东西除了公司上的业务范围，没能扩展到更广阔的现实业务中，虽然技术上大体的方案是类似的，但具体应用到现实不同的业务中还是得实打实战才有价值；平常做公司的业务也能快速完成，实在是感觉到闲了，也意识到时间的宝贵下，毅然提了辞职；上家公司的技术氛围就目前来看，是可以的，上次去上海找到前同事聊天，也一致认同这家公司技术氛围：
 典型的互联网公司，一定的弹性上班时间（好像我离职两个月就开始要打卡上班了，看来人多了，老板有点 hold 不住了），人际关系不复杂；
 业务方面不杂，做互联网竞价广告的，在 Web 开发和高流量高迸发方面可以积累不少技能和经验；
 员工有更多的时间去学习，老大也很好说话，如果是一个主动能力强的，能学到不少。
  辞职后找工作的过程
裸辞后休息了几天，接到深圳一家公司的面试邀请，一个下午面完，第二天收到了 offer 邀请，给也的薪资比上家多了 40%，还是不错的。但特么的我却没接受！，现在看来有点后悔（薪资比现在给的多啊！), 没接受的原因是因为：
 自己找下一份工作的预期时间在一个月内，不到一个星期就找到了，虽说给的钱是可以的了（现在看来工作机会就是机会，不抓住就没了）
 同时也面了一家大公司的，面了好三四面，也觉得可能有戏，个人也倾向于去大公司
 这家公司的业务个人不是特别倾向，觉得还是再看看
  开始还是好的，但后来网投的面试机会不多了，心态不太稳，也错了不少机会。面临着一个月找到工作的日期限期的来临，虽然手头也有几个 Offer, 但也总不满意；最后选择目前这个创业公司，当初选择这家公司的原因：
 工资还好，虽然没有第一个 offer 多，但个人那里并不是太看重职场暂时的工资差
 面试过程中感觉以后的上级还是靠谱的
 公司的环境可以说是在面试的公司中靠前的：明亮，干净
  虽说是初创公司，但是走的是母公司的入职程序，入职像是进入意识中传统公司的体验，流水单，社保证明，个人正装照，户口本其中一页复印件&amp;hellip; 这一点给我印象不太好，后来公司独立出来了，重新办理离职又入职。这一点是新的体验。
日常上下班要打卡，开始是指纹，现在换成了微信，早上几点一定要到，如果迟到超过一定次数扣钱，下班可以晚走，但不能早离开的那种；从员工的角度和目前员工人数的角度上看，这一点也不太认同。
日常工作，可以说 90% 是做业务了，主要切入点是 以自然语言处理为核心的人工智能客服 解决方案。由于还没有首单案例，业务更多是的以尝试为主，想到可行的业务，就快速实现，敏捷开发，对于初期团队还是会参杂情绪，与人有关也与公司的情况有关，这可能就算是创业公司多会遇到的一个难题吧。
在这家公司中，个人交流明显比在上一家公司要多了，这一点个人很认同的，多人合作完成的项目，如果在未达到一致方向前去实施，后期返工和对接的时间将成为项目完成进度的一大羁绊。
业务驱动的状况，往往让技术人员忙于业务实现而少于重视技术深度的学习，也是因为这样 公司才会招两年左右的人，技术肯定够用，给的钱也不高，性价比高，工资不高，招进来的人水平也就差不多；环境的重要性对个人的发展还是很大的，改变不了环境，只能改变自己或者离开那个环境或者被环境改变，这个是需要思考并作出选择的。
在小公司，员工可以对整个业务的技术流有全局的了解，这一点让个人对技术的思考有不小的推动作用，虽说所用的技术很成熟了，但结合业务上各种 trade off, 适用性是要花时间去思考整理的。技术性的文档亦必要写，这也是个人对业务的参透性，表达能力的体现， 同时也是为可能埋下的坑和预防检查准备。
关于时间
业务讨论，需求整理，代码开发，测试，文档整理这些团队工作一联系起来就显得时间宝贵，有时候个人时间也得不到保证，特别是遇到工作意识怠慢的队友，就拿上次去上海合作开发的经历来说，对接一个业务逻辑接口，要实时讨论共同开发，我们这边早早就给出接口文档，那边却迟迟没有明确响应，整个开发下来弄得身心疲惫，明显能感觉到人生的荒废，连老板都气得发火。</description>
    </item>
    
    <item>
      <title>Grafana&#43;Prometheus(Exporter) 简单上手</title>
      <link>https://www.jialinwu.com/post/grafana&#43;prometheusexporter%E7%AE%80%E5%8D%95%E4%B8%8A%E6%89%8B/</link>
      <pubDate>Sat, 19 May 2018 12:29:53 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/grafana&#43;prometheusexporter%E7%AE%80%E5%8D%95%E4%B8%8A%E6%89%8B/</guid>
      <description>Grafana: 数据可视化，可定时请求数据源并图表化
Prometheus: 时间序列数据库，定时从上流数据源 exporter 中获取数据保存，通过 HTTP API 接口返回时间序列化的数据
Prometheus exporter: Prometheus 数据源，通过 /metrics HTTP API 接口对外提供数据，开发者自己能过 prometheus 提供的 client 进行开发，比如 prometheus/client_golang
下面是自己用 Golang 写一个 prometheus exporter, 用来提供进程的连接数以及 HTTP QPS 的指标数据，主要是实现 promethues client 包中 Collector  接口，然后注册即可
比如：
type QpsMetric struct { metric *prometheus.Desc } func NewQpsMetric() *QpsMetric { go cal() return &amp;amp;QpsMetric{ metric: prometheus.NewDesc(&amp;quot;http_request_count_second&amp;quot;, &amp;quot;http qps&amp;quot;, nil, nil, ), } } func (m *QpsMetric) Describe(ch chan&amp;lt;- *prometheus.Desc) { ch &amp;lt;- m.</description>
    </item>
    
    <item>
      <title>了解 TCP/IP 网络栈技术与编写网络应用</title>
      <link>https://www.jialinwu.com/post/%E4%BA%86%E8%A7%A3-tcpip-%E7%BD%91%E7%BB%9C%E6%A0%88%E6%8A%80%E6%9C%AF%E4%B8%8E%E7%BC%96%E5%86%99%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8/</link>
      <pubDate>Thu, 14 Dec 2017 22:53:08 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E4%BA%86%E8%A7%A3-tcpip-%E7%BD%91%E7%BB%9C%E6%A0%88%E6%8A%80%E6%9C%AF%E4%B8%8E%E7%BC%96%E5%86%99%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8/</guid>
      <description>前言
周未看了这篇文章（原文） 了，觉得很是不错，基本把网络行几个关键点以及它们之间的上下文 (context) 阐述出来了，决定用自己的话翻译出来，中间可能会插入一些自己的想法，不会一词一句对应翻译，也因为理解英语更多是一种意会。
没有 TCP/IP 的网络服务是不可想像的，所有的网络服务多是基于坚实的 TCP/IP, 对于开发人员来说，理解数据是怎么样在网络传输非常关键，这样在面对诸如：如何调优 (tuning) 提高服务的性能，问题怎么定位以及从最基本的底层对新技术如何来认知时就能迎韧而解了。
下面基于 Linux 系统中的 数据流 (data flow) 和控制流 (control flow) 以及就硬件层面来描述整个网络栈 (network stack) 的运作
TCP/IP 中的关键点 想自己设计一种网络协议来快速传送数据以及保证数据的顺序性和一致性？
TCP/IP 当初就是为了这个而设计的，下面是一些理解这种协议栈的关键点
TCP/IP 从技术上来讲分属不同的结构层，应该把它们分开来讲解，即便如此，这里把它们联系在一起去表述。   面向连接
一条传输数据的 TCP 连接在由两个服务端点构成，它由两端的地址组成，结构为：
本地 IP:port, 对端 IP:port(&amp;lt;local IP address, local port number, remote IP address, remote port number&amp;gt;)
 双向字节流
以字节流 (byte stream) 的表现形式来进行数据传送，在语言层面看来比如，C 里面的一个 char 类型，Golang 里面的一个 byte 类型数据，可以说 byte 是数据结构模型设计要考虑到的最小单位了（比如说 age 用 int32 就行了，用 int64 就会浪费多一倍的资源：内存，带宽，存储等），当然有时候也会考虑到 bit 的程度 (1 byte = 8 bits)</description>
    </item>
    
    <item>
      <title>Understanding TCP/IP Network Stack &amp; Writing Network Apps</title>
      <link>https://www.jialinwu.com/post/ip-network-stack--writing-network-apps/</link>
      <pubDate>Thu, 14 Dec 2017 22:42:59 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/ip-network-stack--writing-network-apps/</guid>
      <description>We cannot imagine Internet service without TCP/IP. All Internet services we have developed and used at NHN are based on a solid basis, TCP/IP. Understanding how data is transferred via the network will help you to improve performance through tuning, troubleshooting, or introduction to a new technology.
This article will describe the overall operation scheme of the network stack based on data flow and control flow in Linux OS and the hardware layer.</description>
    </item>
    
    <item>
      <title>gRPC First Look</title>
      <link>https://www.jialinwu.com/post/grpc-first-look/</link>
      <pubDate>Sun, 10 Dec 2017 10:43:35 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/grpc-first-look/</guid>
      <description>Why gRPC The main usage scenarios:
Low latency, highly scalable, distributed systems.
Developing mobile clients which are communicating to a cloud server.
Designing a new protocol that needs to be accurate, efficient and language independent.
Layered design to enable extension eg. authentication, load balancing, logging and monitoring etc.
read more on FAQ
in simiple, (g)RPC lets client call functions of server by connection easily and efficiently
Prerequisites  tool protoc, download from the release page</description>
    </item>
    
    <item>
      <title>《Web-API 的设计与开发》感想清理</title>
      <link>https://www.jialinwu.com/post/web-api%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%BC%80%E5%8F%91-%E6%84%9F%E6%83%B3%E6%B8%85%E7%90%86/</link>
      <pubDate>Wed, 19 Jul 2017 21:10:36 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/web-api%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%BC%80%E5%8F%91-%E6%84%9F%E6%83%B3%E6%B8%85%E7%90%86/</guid>
      <description>在 Weibo 上无意间看到一个 Sina 的大牛发微提到了这本 《Web-API 的设计与开发》，表示这本书不错，一个下午也就可以读完。虽然这两年来都是写后端，Web API 几乎是离不开的工作内容，但总觉得在这方面的知识视野不行，刚好也正想看看 Web API 相关的科普知识，于是就在 amazon 上弄了一本。
早上下的单，下午下班时就拿到了书，坐在回去的公车不惊的看了起来&amp;hellip; 对于自己来说书中没什么晦涩的专业名词，几乎没有多少新的概念很快就可以浏览完一页，看起来也很顺畅，上有些算是在复习工作中所用的技术点，有些则是让自己在 web API 真的开阔了一点视野。
 HTML4.0 只有 GET,POST 这两方法，也够用了，直到现在也看到有很多只用这两种方法去进行 HTTP 操作的，也理会简单一些；像 PATCH,PUT,DELETE 等新的方法是 HTML4.0 之后出现，其中 PATCH 方法在修订的时候定下来了，后来没人使用就删掉了，现在又加回去了！所以只要技术满足，该怎么方便还是怎么用；比如在实际工程中要统计点击或者曝光请求时，使用 GET 方法即方便拼接请求参数又可以减少数据传输（没有 BODY), 特别是在 URL 的长度限制已经增大了不少的情况下。HTML 不同 level 的特征：前一个：只有 GET,POST， 现在 RESFUL API, 下一个 level: 当前 API 返回的内容里面携带了下一步要访问的 API, 比如当请求 list API 时下一步通常会对 item of list 进行操作，list API 返回时就会带有对 xxxItem 操作的 URI 信息
 所谓的 RESFUL API 就是尽量用 GET,POST,PUT,DELETE,PATCH 方法作为操作运作，URI 中尽量不要使用出 CREATE,UPDATE 等动词；当然像一些大厂也会出现带 SEARCH 这类动词的 URI 的 API;RESFULT API 有时候还是有点繁琐的，但是它的出现肯定有它的原因，这就只是一种规范，实际工程中该怎么方便和高效就怎么来。</description>
    </item>
    
    <item>
      <title>Migrate HTTP router from Beego to Mux</title>
      <link>https://www.jialinwu.com/post/migrate-http-router-from-beego-to-mux/</link>
      <pubDate>Sat, 06 May 2017 09:43:20 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/migrate-http-router-from-beego-to-mux/</guid>
      <description>Beego 的路由看起封装得很人性化，一个给人比较直观的印象是 HTTPHandleFunc 隐藏掉了 http.Response 和 http.Request 这两参数，该有功能都能方便的找到。想想每次新建一个 HTTPHandleFunc, 都要带 (w http.ResponseWriter, r *http.Request)是一件略为繁琐的 coding 体验，我看几个项目多用了 Beego 但是都主要利用其中的 router 功能，但是随着不同项目代码维护不一，导致了升级的版本不一致而往往这几项目却部署在同一个 $GOPATH 下，比如说 A 使用了 Beego1.3 版，而 B 却升到了 1.7 版本，在编译时就会遇到问题，当然了解决方法不只一个：
 使用不同的 $GOPATH, 主要也就是多 copy 一份 $GOPATH/src, 然后根据需要 go get 不同的版 package
 使用 go 1.6+ 的 vendor 功能，每一个项目中优先使用自己 vendor 下面的 package
 去 beego 化，换成其它的 HTTP router package
  首先就人个看法：
 第 1 种方法可能以后还会出现同样的问题，不推荐
 第 2 种方法是最合适的，不像第一种需要维护整个 $GOPATH/src，项目可以根据自身的需要使用不同 package 和特定的版本，耗时少，可用性高</description>
    </item>
    
    <item>
      <title>游走了一下三亚</title>
      <link>https://www.jialinwu.com/post/%E6%B8%B8%E8%B5%B0%E4%BA%86%E4%B8%80%E4%B8%8B%E4%B8%89%E4%BA%9A/</link>
      <pubDate>Sun, 16 Apr 2017 21:24:23 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E6%B8%B8%E8%B5%B0%E4%BA%86%E4%B8%80%E4%B8%8B%E4%B8%89%E4%BA%9A/</guid>
      <description>&lt;!-- draft: true --&gt;

&lt;p&gt;上上周和妹子约好了上周去三亚走走看看，一起经历了些许‘第一次’: 去海南三亚，乘飞机，当地特有食物，漂亮的海难，又圆又大的落日，坐大船&amp;hellip; 有点像旅游，但我觉得对于年青人来人说旅行可能会更贴切一点。&lt;/p&gt;

&lt;p&gt;看到清明后如果再请三天假就可以拥有 8 天的假期，再加上我的年假也有好几天没用，问了一下妹子也有时间，而且机票也超级便宜 (3 折）三亚之行的就这样定了。在网上搜了一下相关的游记参考，无非是三亚湾，亚龙湾，蜈支洲岛，第一海鲜市场，被司机 商家坑钱的等等印记，知道了这些后就有心理准备了，整个游玩下来也不至于会很失落，后接下来就是身体力行了。&lt;/p&gt;

&lt;p&gt;下面是简短的这次游走三亚我简短参考：&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>A good way to do tests for beego router</title>
      <link>https://www.jialinwu.com/post/a-good-way-to-do-tests-for-beego-router/</link>
      <pubDate>Mon, 13 Mar 2017 16:43:02 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/a-good-way-to-do-tests-for-beego-router/</guid>
      <description>Talk is cheap, just show you the code, take a look at this image

running:

How does it work?
Any struct implmented ServeHTTP is a http.Handler,method ServeHTTP will be invoked when one request comes in, and it will decide which fucntion(or HandlerFunc) will be invoked for different router path;Here BeeApp.Handlers is one http.Handler,the implemented code can be found in beego/router.go
Here is one example of ServeHTTP implementaion
package main import ( &amp;quot;fmt&amp;quot; &amp;quot;io/ioutil&amp;quot; &amp;quot;net/http&amp;quot; &amp;quot;net/http/httptest&amp;quot; ) type Handler struct{} var handlerFunc map[string]http.</description>
    </item>
    
    <item>
      <title>迸发相关</title>
      <link>https://www.jialinwu.com/post/%E8%BF%B8%E5%8F%91%E7%9B%B8%E5%85%B3/</link>
      <pubDate>Sun, 08 Jan 2017 00:52:38 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E8%BF%B8%E5%8F%91%E7%9B%B8%E5%85%B3/</guid>
      <description>最近写了几个 HTTP GET 相关的程序，一根筋的移数据枯燥了，于是就是多个 goroutines 去 GET 数据，最后其中一个程序从 1min 的执行时间减少到 10s 以内, 顿时觉得编写迸发程序瞒好玩的。
记得第一次有写迸发代码的意向是在大学期间看了一本经典的计算机类的书籍时（好像叫做计算机科学&amp;hellip; 什么）, 留意到了一个简单的累加计算的程序，就是从 1 累加到一个很大的数，方法有：
 如果一根筋的从 1 累加到 n, 这是最基本的思想，同时也是最低效的方法
 如果把 1 到 n, 划分成 m 段，开 m 个计算单位（进程或者线程或者协程都可以，process,thread,coroutine), 最后再把每一段的和值累加，这样可以大大减少等待运算结果的时间。打个现实一点的比方：如要把 n 个货物从 A 岸海运到 B 岸，只用一艘船一次只能运一个货物, 那么要耗费 n 个往反, 如果运用 m 艘船, 那么只要 n/m 或者 (n/m)+1 个往返
  这可以说是可迸发化和并行化的问题了，说到迸发和并行，有必要理清一下：
 迸发，concurrency: 着重于动作的执行，在保证结果一致性的前提下，使过程最大密集化, 如 CPU, 一个工作流可能只会点用到 20% 的 CPU 运算量, 但如果提高 n 个迸发量 CPU 的运算量就会随之被占提升到 n 倍；现实中比如一个收银员一个小时内内可以接待 10 个客人, 但实际中放流只是一个小时放 2 个客人, 这样收银员在一个小时都有 8 个接待客人的闲暇时间了, 但老板想想这样不划算, 必须要尽可能的榨干员工的劳动力, 毕竟做多做少都要支付一样的薪水, 所以就开流, 一下把 2 个 / 小时提高到 8 个 / 小时的客人迸发量进来, 这样老板就可以获取到最大的收益；在这里, 收很员可以比作 CPU, 客人就当是计算任务, 老板就是软硬件投资者。</description>
    </item>
    
    <item>
      <title>国内主要银行分支数据爬取记</title>
      <link>https://www.jialinwu.com/post/%E5%9B%BD%E5%86%85%E4%B8%BB%E8%A6%81%E9%93%B6%E8%A1%8C%E5%88%86%E6%94%AF%E6%95%B0%E6%8D%AE%E7%88%AC%E5%8F%96%E8%AE%B0/</link>
      <pubDate>Sun, 18 Dec 2016 02:01:40 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E5%9B%BD%E5%86%85%E4%B8%BB%E8%A6%81%E9%93%B6%E8%A1%8C%E5%88%86%E6%94%AF%E6%95%B0%E6%8D%AE%E7%88%AC%E5%8F%96%E8%AE%B0/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;先有数据才能定好结构，数据结构嘛，数据在前面结构耶&lt;br /&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;先写好主要的操作步骤（规划好 interface() 或者抽象类），具体数据的解析获取细节这种最耗耐性和体力的放在最后 debug 和测试实现，否则就是在摸着石头过河，又慢又累，效率最低！&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>MongoDB 多表查询</title>
      <link>https://www.jialinwu.com/post/mongodb-%E5%A4%9A%E8%A1%A8%E6%9F%A5%E8%AF%A2/</link>
      <pubDate>Thu, 27 Oct 2016 22:07:40 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/mongodb-%E5%A4%9A%E8%A1%A8%E6%9F%A5%E8%AF%A2/</guid>
      <description>mongo 这种 NoSQL 要进行多表查询一种方法是在 client 端进行多次查询操作另一种是利用 aggregation pipeline 这种聚合流操作，前一种方法非常不推荐使用，特别涉及到分页时这几乎是个噩梦，后面一条命令组合直接在服务端运作非常推荐。说一下第二种方法的要点。
数据涉及到多表的逻辑操作，mongo 提供了 lookup, 使用方法直接在官网上查间即可，现有三个表 Slot,SlotOrder, 和 Order，SlotOrder 保存了另外两张的关联关系，当然并不是所 Slot 都会关联到 Order。
结构如下
Slot{ _id, xxx, } SlotOrder{ _id, SlotID, OrderID, xxx, } Order{ _id, Begin, End, xxx, }  现在要根据 Order 中的 Begin 和 End 是否在某一个时间范围来判断 Slot 的使用状态，如 nowEnd 则表示 Slot 处于 idle 状态，而如果没有 Order 关联 Slot 则也处于 idle 状态，可通过两次 lookup 还找到三表的数据，需要注意的是由于 Slot 与 Order 是一对多的关系，两次 lookup 之间还进行一些处理，直接的查询语句如下：
db.Slot.aggregate([ {$lookup: { from: &amp;quot;SlotOrder&amp;quot;, localField: &amp;quot;_id&amp;quot;, foreignField: &amp;quot;SlotId&amp;quot;, as: &amp;quot;SO&amp;quot; } }, {$unwind:&amp;quot;$SO&amp;quot;}, {$lookup: { from: &amp;quot;Order&amp;quot;, localField: &amp;quot;SO.</description>
    </item>
    
    <item>
      <title>提高 vim 操作效率的几条 tips</title>
      <link>https://www.jialinwu.com/post/%E6%8F%90%E9%AB%98vim%E6%93%8D%E4%BD%9C%E6%95%88%E7%8E%87%E7%9A%84%E5%87%A0%E6%9D%A1tips/</link>
      <pubDate>Sun, 25 Sep 2016 09:12:54 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E6%8F%90%E9%AB%98vim%E6%93%8D%E4%BD%9C%E6%95%88%E7%8E%87%E7%9A%84%E5%87%A0%E6%9D%A1tips/</guid>
      <description>丢弃上下左右方向键
作为一个 vimer, 这是必须的，想想手总是在字母键位和方向键位移来移去，so boring and so tired!~
noremap &amp;lt;Up&amp;gt; &amp;lt;NOP&amp;gt; noremap &amp;lt;Down&amp;gt; &amp;lt;NOP&amp;gt; noremap &amp;lt;Left&amp;gt; &amp;lt;NOP&amp;gt; noremap &amp;lt;Right&amp;gt; &amp;lt;NOP&amp;gt;  不要总是 repeat
相信很多人很多在摆脱了使用方向键后在转向 hjkl 的时候还是带着 repeat 的思想，比如，要移动从一个单词的开始到结尾，假如单词的字符为 6 的话，你要按 k 6 次，或者按定 k 直到 cursor 移动到你想要到的位置，这种 repeat 的思想效率太慢非常不建议。你可以：
 使用 w,W,e,E,b,B,$,^ 这样移动效率相当于提高了 6x 甚至更多，这也是我日常经常使用的几个 motions, 具体 :help word
 如果使用的是 mac, 到系统时面把 repeat 的延迟拖到最慢，这样在你每次想用 hjkl 去 repeat 移动时的停顿让你不得不得先思考一下怎么才能最快的移动到自己想要到达的位置，慢即是快
 甚至不要用 hjkl, 你可以试一下这个 hard-mode 确定如此，实际上很多 hjkl 是不必要，严格来思考
  善用查找</description>
    </item>
    
    <item>
      <title>创建 dynamic 和 static 库文件</title>
      <link>https://www.jialinwu.com/post/%E5%88%9B%E5%BB%BAdynamic%E5%92%8Cstatic%E5%BA%93%E6%96%87%E4%BB%B6/</link>
      <pubDate>Fri, 05 Aug 2016 23:01:16 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E5%88%9B%E5%BB%BAdynamic%E5%92%8Cstatic%E5%BA%93%E6%96%87%E4%BB%B6/</guid>
      <description>之前写 c-cpp 代码会用到第三方的库如 libmysql 来连接 MySQL 数据库，jsoncpp 相关的库来使用 json 数据，但没怎么注意到这些 dynamic lib 或者 static lib 的创建，网上翻了一下相关的教程，在这里记录一下。
静态库和动态库有什么区别？
 在这里通俗的回答一下，使用了静态库中相关的函数的程序代码在编译时会把静态库的相关的代码一起嵌入到整体的代码中，体积会大一些，但由于所有引用的函数功能代码都包含在程序中，所以这个程序可以直接在同种系统中直接运行。
 使用了动态库的程序，在编译程序代码时并不会像使用静态库那样嵌入代码，而是记录了相关函数的位置，在程序运行时再去从相关的动态库中载入函数实现相关的功能，由于程序与库代码分开，所以程序在编译后的体积不会很大，但如果在同种系统中没有相关的动态库或者动态库文件的位置与编译时指定的位置不一致就无法运行程序了。
  创建静态库文件的主要步骤是 将编译源文件得到的.o 文件使用 ar 来打包成.a 静态库文件
直接看我操作的整个过程记录
root@dockers src]# cc -Wall -c ctest.c [root@dockers src]# ls conf.sh ctest.c ctest.o include.h main.c makefile prog.c [root@dockers src]# ar -vcq libcteststatic.a ctest.o a - ctest.o [root@dockers src]# ls conf.sh ctest.c ctest.o include.h libcteststatic.a main.c makefile prog.c [root@dockers src]# cc -o prog prog.</description>
    </item>
    
    <item>
      <title>关爱牙齿以及你可能会忽略的牙齿健康的一系列症状</title>
      <link>https://www.jialinwu.com/post/tips-about-loving-your-tooth/</link>
      <pubDate>Tue, 19 Jul 2016 18:47:42 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/tips-about-loving-your-tooth/</guid>
      <description>&lt;p&gt;突然在群里面看到有人被补牙折磨的留言，由于自己早有过类似的经历也回了好几条消息，但想想还没有好好总结一些爱牙的 tips，现在用问与答的方式来写一些与爱牙相关的 tips, 多是一些大家可能很容易忽视的牙齿症状，不过首要的坚持每年去找&lt;strong&gt;好的医生&lt;/strong&gt;（注意这里再次强调了好医生）检查一次牙齿稳妥的建议，检查一次牙齿不会花多少钱的&lt;br /&gt;
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>demo of redis sub-pub with go cleint</title>
      <link>https://www.jialinwu.com/post/redis-go-subpub%E6%95%B0%E6%8D%AE%E4%B8%A2%E5%A4%B1%E9%97%AE%E9%A2%98/</link>
      <pubDate>Fri, 08 Jul 2016 15:08:08 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/redis-go-subpub%E6%95%B0%E6%8D%AE%E4%B8%A2%E5%A4%B1%E9%97%AE%E9%A2%98/</guid>
      <description>注意 subribe 之前 pub 了的信息是不会 consumer 接收到
具体看这里的示例代码</description>
    </item>
    
    <item>
      <title>使用 go 语言可能常忽略的几十种情况 - 中级进阶</title>
      <link>https://www.jialinwu.com/post/%E4%BD%BF%E7%94%A8go%E8%AF%AD%E8%A8%80%E5%8F%AF%E8%83%BD%E5%B8%B8%E5%BF%BD%E7%95%A5%E7%9A%84%E5%87%A0%E5%8D%81%E7%A7%8D%E6%83%85%E5%86%B5-%E9%9D%A2%E5%90%91%E4%B8%AD%E7%BA%A7%E8%BF%9B%E9%98%B6%E7%9A%84go%E5%BC%80%E5%8F%91%E8%80%85/</link>
      <pubDate>Fri, 01 Jul 2016 10:07:18 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E4%BD%BF%E7%94%A8go%E8%AF%AD%E8%A8%80%E5%8F%AF%E8%83%BD%E5%B8%B8%E5%BF%BD%E7%95%A5%E7%9A%84%E5%87%A0%E5%8D%81%E7%A7%8D%E6%83%85%E5%86%B5-%E9%9D%A2%E5%90%91%E4%B8%AD%E7%BA%A7%E8%BF%9B%E9%98%B6%E7%9A%84go%E5%BC%80%E5%8F%91%E8%80%85/</guid>
      <description>&lt;p&gt;本文的整理于 &lt;a href=&#34;http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/index.html&#34;&gt;50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs&lt;/a&gt;, 下面是自己阅读完源文章后翻译了一些以及加上自己的一点见解。&lt;br /&gt;
这些情况使用于 Go 1.5 以及更低版本&lt;/p&gt;

&lt;h3 id=&#34;目录&#34;&gt;目录&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#关闭 HTTP 返回的主体 Response Body 问题&#34;&gt;关闭 HTTP 返回的主体 (Response Body) 问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#关闭 HTTP 连接问题&#34;&gt;关闭 HTTP 连接问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#把数字类型的 Json 存放到 Interface 问题&#34;&gt;把数字类型的 Json 存放到 Interface 问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#比较 Struts,Arrays,Slices 和 Maps&#34;&gt;比较 Struts,Arrays,Slices 和 Maps&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#从 panic 中恢复问题&#34;&gt;从 panic 中恢复问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#使用 range 对 Slice,Array 和 Map 的引用值进行更新问题&#34;&gt;使用 range 对 Slice,Array 和 Map 的引用值进行更新问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#Slice 中数据隐藏的问题&#34;&gt;Slice 中数据隐藏的问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#Slice 的伸缩问题&#34;&gt;Slice 的伸缩问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#注意类型声明和方法&#34;&gt;注意类型声明和方法&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#理解&#34; title=&#34;for switch&#39;和&#39;for select&#34;&gt;理解&amp;rsquo;for switch&amp;rsquo;和&amp;rsquo;for select&amp;rsquo;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#变量的遍历和闭包在 for 中使用要注意的问题&#34;&gt;变量的遍历和闭包在 for 中使用要注意的问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#函数参数在使用 defer 时要注意的问题&#34;&gt;函数参数在使用 defer 时要注意的问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#执行函数在使用 defer 时要注意的问题&#34;&gt;执行函数在使用 defer 时要注意的问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#类型断言失败时数据处理问题&#34;&gt;类型断言失败时数据处理问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;#Goroutine 堵塞和资源泄漏问题&#34;&gt;Goroutine 堵塞和资源泄漏问题&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&#34;hugomore42&#34;&gt;&lt;/h2&gt;

&lt;p&gt;&lt;a name=&#34;关闭 HTTP 返回的主体 Response Body 问题&#34;&gt;&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>使用 go 语言可能常忽略的几十种情况 - 初次进阶</title>
      <link>https://www.jialinwu.com/post/%E4%BD%BF%E7%94%A8go%E8%AF%AD%E8%A8%80%E5%8F%AF%E8%83%BD%E5%B8%B8%E5%BF%BD%E7%95%A5%E7%9A%84%E5%87%A0%E5%8D%81%E7%A7%8D%E6%83%85%E5%86%B5-%E9%9D%A2%E5%90%91%E5%88%9D%E6%AC%A1%E8%BF%9B%E9%98%B6%E7%9A%84go%E5%BC%80%E5%8F%91%E8%80%85/</link>
      <pubDate>Sat, 25 Jun 2016 10:28:58 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E4%BD%BF%E7%94%A8go%E8%AF%AD%E8%A8%80%E5%8F%AF%E8%83%BD%E5%B8%B8%E5%BF%BD%E7%95%A5%E7%9A%84%E5%87%A0%E5%8D%81%E7%A7%8D%E6%83%85%E5%86%B5-%E9%9D%A2%E5%90%91%E5%88%9D%E6%AC%A1%E8%BF%9B%E9%98%B6%E7%9A%84go%E5%BC%80%E5%8F%91%E8%80%85/</guid>
      <description>&lt;p&gt;本文的整理于 &lt;a href=&#34;http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/index.html&#34;&gt;50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs&lt;/a&gt;, 下面是自己阅读完源文章后翻译了一些以及加上自己的一点见解。&lt;br /&gt;
这些情况使用于 Go 1.5 以及更低版本&lt;/p&gt;

&lt;h3 id=&#34;目录&#34;&gt;目录&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#大括号开端不能独立于一行&#34;&gt;大括号开端不能独立于一行&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#不可存在未使用的变量&#34;&gt;不可存在未使用的变量&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#未引入包问题&#34;&gt;未引入包问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#不可使用 短声明变量 重复声明变量&#34;&gt;不可使用 短声明变量 重复声明变量&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#Strings 是不可修改的&#34;&gt;Strings 是不可修改的&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#短声明变量只能在函数内部使用&#34;&gt;短声明变量只能在函数内部使用&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#不能 声明短变量 同时给实例成员赋值&#34;&gt;不能 声明短变量 同时给实例成员赋值&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#覆盖变量问题&#34;&gt;覆盖变量问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#不能使用无类型的&#39;nil&#39;去初始化一个变量&#34;&gt;不能使用无类型的&amp;rdquo;nil&amp;rdquo;去初始化一个变量&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#&amp;quot;nil&amp;quot;在 Slices 和 Maps 中的使用问题&#34;&gt;&amp;ldquo;nil&amp;rdquo;在 Slices 和 Maps 中的使用问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#Map 的容量问题&#34;&gt;Map 的容量问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#Strings 不能为&#34; title=&#34;nil&#34;&gt;Strings 不能为&amp;rdquo;nil&amp;rdquo;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#数组作为函数参数问题&#34;&gt;数组作为函数参数问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#Strings 并不总是 UTF-8 的格式&#34;&gt;Strings 并不总是 UTF-8 格式的&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#string 的长度问题&#34;&gt;string 的长度问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#多行 Slice/ 数组 /Map 迭代之行缺少&#34; title=&#34;,&#34;&gt;多行 Slice/ 数组 /Map 迭代之行缺少&amp;rsquo;,&amp;rsquo;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#log.Fatal 和 log.Panic 不只是记日志&#34;&gt;log.Fatal 和 log.Panic 不只是记日志&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#内置的数据结构在操作上并不是同步的&#34;&gt;内置的数据结构在操作上并不是同步（具有原子性）的&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#在 Strings 中使用 range 遍历的问题&#34;&gt;在 Strings 中使用 range 遍历的问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#Fallthrough 在 switch 中的行为&#34;&gt;Fallthrough 在 switch 中的行为&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#加加减减问题&#34;&gt;加加减减问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#位运算中 Not 操作&#34;&gt;位运算中 Not 操作&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#位运算中的优先级问题&#34;&gt;位运算中的优先级问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#不可导出的结构变量是不可压缩加密的&#34;&gt;不可导出的结构变量是不可压缩加密的 (Not Encoded)&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#程序退出却没有把 Goroutines 退出问题&#34;&gt;程序退出却没有把 Goroutines 退出问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#向没有缓冲的 channel 发送消息问题&#34;&gt;向没有缓冲的 channel 发送消息问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#向已经关闭的 Channel 发送消息会导致 Panic 问题&#34;&gt;向已经关闭的 Channel 发送消息会导致 Panic 问题&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#使用&amp;quot;nil&amp;quot;Channels（未初始化的 Channels&#34;&gt;使用&amp;rdquo;nil&amp;rdquo;Channels（未初始化的 Channels)&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#值接收者的方法不会更改原来的结构变量的值&#34;&gt;值接收者的方法在调用时不会更改原来的结构变量的值问题&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>让网站支持 https 那几个步骤</title>
      <link>https://www.jialinwu.com/post/%E8%AE%A9%E7%BD%91%E7%AB%99%E6%94%AF%E6%8C%81https%E9%82%A3%E5%87%A0%E4%B8%AA%E6%AD%A5%E9%AA%A4/</link>
      <pubDate>Fri, 10 Jun 2016 11:17:33 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E8%AE%A9%E7%BD%91%E7%AB%99%E6%94%AF%E6%8C%81https%E9%82%A3%E5%87%A0%E4%B8%AA%E6%AD%A5%E9%AA%A4/</guid>
      <description>&lt;p&gt;随着 http 流量时不时的可能会被奸商强奸，各大网站都陆续支持了 https 这种安全的连接方式，&lt;br /&gt;
通过以下几个步骤给自己的网站用上 https&lt;br /&gt;
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>mongo riak 集群简建</title>
      <link>https://www.jialinwu.com/post/mongo-riak%E9%9B%86%E7%BE%A4%E7%AE%80%E5%BB%BA/</link>
      <pubDate>Sun, 15 May 2016 00:04:32 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/mongo-riak%E9%9B%86%E7%BE%A4%E7%AE%80%E5%BB%BA/</guid>
      <description>借助于 docker 提供便利的服务环境，本来建个集群需要多个 host 的问题得到很好的解决（或者同一机子上运行时也指定不同端口也可以搞定集群），当然传统的在 virtual box 上创建多个 vm 也可以，但这样不仅繁琐又耗费资源。
在 docker 所运行的每一个 container 中都有自己的一个 ip，这些 container 的连接同一个 nat 网络下，这样 container 与 container 之间就可以像两台独立的 host 进行网络数据的传输。
mongo 集群  mongod 集群是什么样子的模型？
primary:arbiter:second 对应为 1:1:n
primary 可读可写
arbiter 用作根据 priority 选举 second 产生 primary, 理论不可读写
second 只可读
 如何运行mongod以支持 replication 功能？
 mongod --fork --logpath xxxx.log --replSet &amp;quot;xxx-Name&amp;quot; 
注意，各个 Host 上mongod运行时--replSet指定的名字要相同
 如何使 mongod 成为primary,second,arbiter?
在各个 host 上运行 Mongodr 后，在 ip-master 的操作</description>
    </item>
    
    <item>
      <title>docker 操作简记</title>
      <link>https://www.jialinwu.com/post/docker%E6%93%8D%E4%BD%9C%E7%AE%80%E8%AE%B0/</link>
      <pubDate>Sat, 14 May 2016 22:22:57 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/docker%E6%93%8D%E4%BD%9C%E7%AE%80%E8%AE%B0/</guid>
      <description>最近务业不多，闲暇之际折腾了一下 docker。
- 为什么使用 docker?
- 隔离程序，安全，易于服务的部署和使用；方便模拟使用多个 host，搭建服务集群玩
 与传统的 vm 相比，docker 的 pros and cons?
 就虚拟化而言，docker 对主机系统的环境 (linux 内核）有一定强制依赖，不像 virtual box,VMware 那样跨平台；比如 vbox 的同一个 Image 在 windows 或者 linux 下都可以运行，而 docker 目前正式版还处于 linux only 的状态下，x32 系统的 Image 在 x64 系统 docker 上运行还是个问题;docker 不像 vm 一样运行不同的系统，比如在 Linux 不能运行 windows，当然了解了 docker 的原理后，这显然是废话
 就服务控制而言，在使用 Linux 作为主力服务器的情况下，docker 比 vbox，VMware 显得高效和便捷，docker 可以把单个或者多个服务程序打包, 而 vbox 等更多的是把一个系统打包；docker 不用为运行的服务模拟多过基础环境，服务进程在 docker 运行的效率与在实体主机中运行的效率理论上相差无几，而 vbox 等显过臃肿了。
   照着官网在 CENTOS7 上安装 docker 后启动 docker 服务进程</description>
    </item>
    
    <item>
      <title>南澳杨梅坑一日游</title>
      <link>https://www.jialinwu.com/post/%E5%8D%97%E6%BE%B3%E6%9D%A8%E6%A2%85%E5%9D%91%E4%B8%80%E6%97%A5%E6%B8%B8/</link>
      <pubDate>Mon, 02 May 2016 21:34:32 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E5%8D%97%E6%BE%B3%E6%9D%A8%E6%A2%85%E5%9D%91%E4%B8%80%E6%97%A5%E6%B8%B8/</guid>
      <description>&amp;ldquo;五一&amp;rdquo;三天假期的计划
- 4.30 早上 9 点 -11 点 -- 从广州前往深圳 中午在 -- 姐家吃完午饭，放好行包 下午和晚上 -- 找同学聚餐，唱 K - 5.1 早上 7 点半 -10 点 -- 在深圳市区乘坐 e11 前往南澳总站 10 点半 -11 点半 -- 从南澳总站乘坐 m247 前往杨梅坑总站 12 点 - 下午 5 点 -- 在杨梅坑海岸观光游赏 6 点半 -7 点半 -- 从杨梅坑站返回南澳总站 8 点半 -11 点半 -- 乘坐 e11 返回深圳市区 - 5.2 早上 - 中午 12 点 -- 休息 1 点 -3 点 -- 和好友聚餐 3 点半 -4 点半 -- 休息准备返回广州 5 点半 -8 点半 -- 从深圳返回广州  具体行记</description>
    </item>
    
    <item>
      <title>crontab 使用上的一些 tips</title>
      <link>https://www.jialinwu.com/post/crontab-%E4%BD%BF%E7%94%A8%E4%B8%8A%E7%9A%84%E4%B8%80%E4%BA%9Btips/</link>
      <pubDate>Sun, 24 Apr 2016 11:36:56 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/crontab-%E4%BD%BF%E7%94%A8%E4%B8%8A%E7%9A%84%E4%B8%80%E4%BA%9Btips/</guid>
      <description>项目中往往需通过定时执行脚本来实现定时功能的效果，crontab 是最为常用的一个 Linux 自带的工具（当然也有自己实现这样的工具, 定时精确度可达到秒级）,
不同的环境下同一变量名有不同的定义，脚本一多的话修改起来麻烦，而且在 crontab 执行脚本时的环境变量是独立于系统环境变量，要解决这个问题的，
* 在进行crontab -e编辑时，直接定义变量 xxx，在脚本中直接$xxx就可以引用这个变量的值，达到不同系统下变量值统一的效果
还有其它的 tips
 设置变量MAILTO，这样在 crontab 执行任务时，就会把运行的信息发送到指定的 email 中，比如MAILTO=&amp;quot;a@b.com,b@b.com&amp;quot;
 设置SHELL，来指定执行脚本所用的 shell 程序，如SHELL=“bin/bash”
 模拟 crontab 执行脚本的环境
 导出 crontab 的运行环境 30 08 * * * env &amp;gt; ~/cronenv
 进入这样的环境env - \cat ~/cronenv` /bin/sh`
  导出 crontab -l &amp;gt; xxx.file
 导入 crontab [path to]xxx.file
  </description>
    </item>
    
    <item>
      <title>学习和使用 Vim 的一些 tips</title>
      <link>https://www.jialinwu.com/post/%E5%AD%A6%E4%B9%A0%E5%92%8C%E4%BD%BF%E7%94%A8vim%E7%9A%84%E4%B8%80%E4%BA%9Btips/</link>
      <pubDate>Sat, 09 Apr 2016 11:02:27 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E5%AD%A6%E4%B9%A0%E5%92%8C%E4%BD%BF%E7%94%A8vim%E7%9A%84%E4%B8%80%E4%BA%9Btips/</guid>
      <description>&lt;p&gt;一直以来都是以 Vim 作为主力 coding 编辑器，分享一下自己对 Vim 的一些感受，包括怎么学习，日常使用的 tips&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>mongo aggregation 查询操作</title>
      <link>https://www.jialinwu.com/post/mongo-aggregation-%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C/</link>
      <pubDate>Tue, 15 Mar 2016 19:43:00 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/mongo-aggregation-%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C/</guid>
      <description>最近需要使用 mongo 进行业务上的统计，自己摸索了一下，跟着问题，上直接上例子
一直进行数据上的统计常见的操作是多条具有相同 field 在不同时段产生的多条数据进行计算，
在 mongo 中可以借助于 aggregation framwork 来方便实现数据的统计；
比如说有如下几条记录：
&amp;gt; db.demo.find() { &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;56e6606b4824a645f55630b2&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;jia&amp;quot;, &amp;quot;a&amp;quot; : 22, &amp;quot;b&amp;quot; : 11, &amp;quot;c&amp;quot; : 12 } { &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;56e6606d4824a645f55630b3&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;jia&amp;quot;, &amp;quot;a&amp;quot; : 22, &amp;quot;b&amp;quot; : 11, &amp;quot;c&amp;quot; : 12 } { &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;56e660784824a645f55630b4&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;jia2&amp;quot;, &amp;quot;a&amp;quot; : 20, &amp;quot;b&amp;quot; : 10, &amp;quot;c&amp;quot; : 10 } { &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;56e6607f4824a645f55630b5&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;jia2&amp;quot;, &amp;quot;a&amp;quot; : 20, &amp;quot;b&amp;quot; : 10, &amp;quot;c&amp;quot; : 10 } { &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;56e6608e4824a645f55630b6&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;jia3&amp;quot;, &amp;quot;a&amp;quot; : 10, &amp;quot;b&amp;quot; : 1, &amp;quot;c&amp;quot; : 1 } { &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;56e6608f4824a645f55630b7&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;jia3&amp;quot;, &amp;quot;a&amp;quot; : 10, &amp;quot;b&amp;quot; : 1, &amp;quot;c&amp;quot; : 1 } { &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;56e76e9c4824a645f55630b8&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;jia3&amp;quot;, &amp;quot;a&amp;quot; : 10, &amp;quot;b&amp;quot; : 1, &amp;quot;c&amp;quot; : 1 } { &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;56e76ea04824a645f55630b9&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;jia&amp;quot;, &amp;quot;a&amp;quot; : 10, &amp;quot;b&amp;quot; : 1, &amp;quot;c&amp;quot; : 1 } { &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;56e771a04824a645f55630ba&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;jia0&amp;quot;, &amp;quot;a&amp;quot; : 0, &amp;quot;b&amp;quot; : 1, &amp;quot;c&amp;quot; : 1 } &amp;gt;  需要计算相同名字的 a 总值和 b 总值，并且还要计算 a/b 的比例大小，再加上排序和分页</description>
    </item>
    
    <item>
      <title>gmock-gtest-quick-demo</title>
      <link>https://www.jialinwu.com/post/gmock-gtest-quick-demo/</link>
      <pubDate>Sat, 23 Jan 2016 10:57:09 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/gmock-gtest-quick-demo/</guid>
      <description>&lt;p&gt;快速使用 gmock 演示：编译，安装，示例&lt;br /&gt;
&lt;a href=&#34;code/gmock-demo.tar.gz&#34;&gt;例示代码&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>mongodb traverse issue</title>
      <link>https://www.jialinwu.com/post/mongodb-traverse-issue/</link>
      <pubDate>Sun, 17 Jan 2016 15:18:33 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/mongodb-traverse-issue/</guid>
      <description>&lt;p&gt;进行 mongodb 数据更新时突然出现如下错误：&lt;br /&gt;
&amp;gt;cannot use xxx to traverse the element(yyy)&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>riak 的安装和使用</title>
      <link>https://www.jialinwu.com/post/riak%E7%9A%84%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8/</link>
      <pubDate>Sat, 12 Dec 2015 11:43:56 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/riak%E7%9A%84%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8/</guid>
      <description>&lt;p&gt;不管是源码编译还是用包安装，riak 的安装不难，只不源码编译安装的通病是不可少：&lt;strong&gt;对其它工具的依赖&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&#34;http://docs.basho.com/riak/latest/installing/&#34;&gt;官方的文档&lt;/a&gt; 说明也很清楚了，仔细看看，跟着操作，一般不会出现什么异常。&lt;br /&gt;
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>issues occurs in centos</title>
      <link>https://www.jialinwu.com/post/issues-occur-in-centos/</link>
      <pubDate>Sun, 29 Nov 2015 18:42:34 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/issues-occur-in-centos/</guid>
      <description>在 centos 7 上面使用 yum 安装 mongodb 后，在运行时不像 OS X 下直接运行mongod就可以启动服务，可能需要配置一些信息。
比如要设置LC_ALL环境变量，如图
默认下 CentOS 对上的端口不是全部开放，在 CentOS7 下要使用firewall-cmd设置（默认使用firewalld管理防火墙），如图
查看所开启的端口：
firewall-cmd --list-all
开启端口：
firewall-cmd --zone=public --add-port=8098/tcp --permanent
重载后端口生效：
firewall-cmd --reload
更多 firewall-cmd 命令可查看 help。
虽然有时候觉得把防火墙关闭会省事，但不建议，特别是线上。再说多学一下防火墙相关的操作也可以学习到更多技能。</description>
    </item>
    
    <item>
      <title>iPhone 6/6s wallpaper</title>
      <link>https://www.jialinwu.com/post/iphone-6-6s-wallpaper/</link>
      <pubDate>Thu, 29 Oct 2015 12:39:28 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/iphone-6-6s-wallpaper/</guid>
      <description>自己用 PS 做了一两张 6s 的壁纸，效果如下：


喜欢的直接右键新窗口打开

渐变无中心光源
渐变带中心光源</description>
    </item>
    
    <item>
      <title>using interface</title>
      <link>https://www.jialinwu.com/post/use-interface/</link>
      <pubDate>Sun, 20 Sep 2015 10:39:05 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/use-interface/</guid>
      <description>使用接口的编码方法对以后扩展程序或者更新程序是非常方便的，其中一种使用接口 (interface) 为先注册后使用，如这里的 example: 先把实现了接口 Auditer 的实例 通过Regisgter注册到 AuditList 中再通过Executer根据 auditType 进行调用。
 注册：实质就是一个 map，还搞个 注册 名词出来是为了更好的规范表达而已
 package main import &amp;quot;fmt&amp;quot; type Auditer interface { Audit() error } var AuditList map[string]Auditer type A struct { A int Auditer } func (this A) Audit() error { fmt.Printf(&amp;quot;this.A: approve works %v\n&amp;quot;, this.A) return nil } type B struct { B int } func (this B) Audit() error { fmt.Printf(&amp;quot;this.B: disapprove works %v\n&amp;quot;, this.</description>
    </item>
    
    <item>
      <title>Learn to use Protocol Buffers</title>
      <link>https://www.jialinwu.com/post/learn-to-use-protocol-buffers/</link>
      <pubDate>Sun, 20 Sep 2015 09:42:22 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/learn-to-use-protocol-buffers/</guid>
      <description>installation
gmock can not download due to the GFW, so I manunally download it from browser throuth vpn with the help from the script file autogen.sh.
from the file autogen.sh, we can get that:
 the url of downloading gmock: https://googlemock.googlecode.com/files/gmock-1.7.0.zip
 make it right for the next installation which is unzip the package and rename it to gmock and mv it to the current directory as the autogen.sh located:</description>
    </item>
    
    <item>
      <title>bson tag</title>
      <link>https://www.jialinwu.com/post/bson-tag/</link>
      <pubDate>Sat, 19 Sep 2015 09:11:43 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/bson-tag/</guid>
      <description>&lt;p&gt;昨天花了大半天去一排查一个 bug, 从数据请求入口一直到数据比较的来源，把整个项目的程序运行过程从头到尾走了一遍。后来发现问题的根源竟然来源于最基本的数据写入操作。项目中使用的数数据库为 mongodb，对于每一组数据都会构建一个数据结构 (struct) 并且一般会给数据结构中的每一个字段 (field) 指定一个 &lt;a href=&#34;https://github.com/go-mgo/mgo/blob/v2/bson/bson.go#L499&#34;&gt;bson&lt;/a&gt; tag, 当然如果不指定的话 monog 会以结构中字段名称的全小写格式去读写数据，这没什么问题，特别是对于只有一个程序在使用这个数据的时候。但是像目前自己接触到的 bug 涉及到两个甚至三个，每个项目中都要从 mongo 中读取这些数据，&lt;strong&gt;两个项目中指定的 bson tag 不一样，或者说一个项目中的代码指定了 bson tag，另一个却没指定&lt;/strong&gt;那问题就来了。我就是遇到了后面一种。&lt;br /&gt;
&lt;br /&gt;
像这种最基本的 Bug 出现的原因更多的在于开发人员不够细心，而不够细心的原因就多了，可能是由于一下子代码写得多了，偶你出现一两个小的失误；也可能是因为个人平常时真的没有意识到要去注意等等&amp;hellip; 但是犯了最基础的错误往往会导致严重的问题，所以对基础的严格要求也是作为一名（合格的）开发人员最基本的前提。顿时也想到了为什么公司企业在招人时最注重应聘者的技能和修养之一在于：良好的技术基础和认真细心的做事态度&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>use make or not</title>
      <link>https://www.jialinwu.com/post/use-make-or-not/</link>
      <pubDate>Fri, 04 Sep 2015 21:03:30 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/use-make-or-not/</guid>
      <description>&lt;p&gt;假如要获取一组一定长度的整形数组，是使用固定长度初始化数组的性能高还是使用 make() 然后不断追加 (append) 产生数组的性能高呢？&lt;br /&gt;
如果你选了其中一个，都不对。为什么？看数据吧&lt;br /&gt;
在这里分别设置获取不同数量级 lenFix 长度的数组为例：&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>redeclared as imported package name</title>
      <link>https://www.jialinwu.com/post/redeclared-as-imported-package-name/</link>
      <pubDate>Sun, 30 Aug 2015 12:39:54 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/redeclared-as-imported-package-name/</guid>
      <description>&lt;p&gt;包的绝对路径的最后一个包名可以重复，但是同时使用两个包含相同后缀包名时必须重命名，否则会出现&lt;br /&gt;
&amp;gt;demos redeclared as imported package name&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>import cycle not allowed</title>
      <link>https://www.jialinwu.com/post/import-cycle-not-allowed/</link>
      <pubDate>Sun, 30 Aug 2015 11:01:32 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/import-cycle-not-allowed/</guid>
      <description>&lt;pre&gt;&lt;code&gt;package demo/model
	imports demo/model/demos
	imports demo/model
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;在进行 &lt;strong&gt;go run&lt;/strong&gt; 或者&lt;strong&gt;go build&lt;/strong&gt;  时出现上面的错误，&lt;br /&gt;
go 中不允许包与包之间互相引用，在项目中进行包规划时要注意。&lt;br /&gt;
&lt;br /&gt;
示例代码：&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>life_society</title>
      <link>https://www.jialinwu.com/post/life-society/</link>
      <pubDate>Sun, 23 Aug 2015 20:07:37 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/life-society/</guid>
      <description>这周未两天特意从广州到深圳，一个是因为好久没去深圳了，上一次在深圳是实习回校前的一个月，应该有三个月了，另一个是想找一下在学深圳工作的大学同学，大家出来聚一下。估计一下，在深圳工作的认识的大学还是有好几个的，但是居几个区，不是在龙岗就是在保安区，也有在福田区的，而我暂时住在南山区。来到深圳之前没有一个个叫上，约好时间和地点，最后本来可以叫上好几个人出来的，却因为临时的决定搞得大家也临时落空了，最后只去了一个同学那里。
出来工作后，一个人生活，一开始的几个周未不觉得空虚和寂寞，但是久而久之，长期一个人，和周围的人几乎不联系，大家渐渐的产生和隔阂和陌生感，人生不应该这样，即使是宅，也应该时不时的保持与身边朋友的交流。现在也觉得，走进社会后，能联系和聚在一起玩的人中，绝大多数是大学中经常接触的关系不僵硬的同学。 像今天下午坐地铁回去的途中经过曾经在暑期期间在一家超市上下班经常进出的站点，就特意的去了那家超市走了一下。在走到超市中那熟悉的水果区之前，心里忐忑着，那些曾经在一起做苦力的工友是否多还在那里，也是否还记得我？走到一摊一摊水果面前，那几个熟悉面孔还在，但是他们几乎没注意到我，一个是因为他们真的很忙，要随时保证摊位上的货保持充足；
另个一外是因为如果让主管水果区的 boss 看到他们在闲聊，很可能就会被骂，反正那 boss 会时不时的走来走去监视; 还有的就是因为和他们并不很熟，曾经没什么交集的话题。我看到一个女工友正在上蔬菜，她的年龄应该和我相差不大，我特意向她问候了一下：&amp;rdquo;嘿，好久不见，还记得我吗?&amp;ldquo;, 她看了看我，问我：&amp;rdquo;来这里干嘛？&amp;rdquo;, 顿时觉得其它她还是记得我的，但是，两个人的对话也就这一两句后，她上完菜后，就马不停蹄的推着小货车向仓库走去。看到好几个熟悉面孔，但是我叫不上他们的名字，看着他们低头一直在忙自己手对的事以及想想和他们也没什么话能聊更不想因为和他们聊天导致他们被 boss 骂，我默默的在那里走了一圈，本来还想买点水果的，但那水果真 TMD 的贵，作为一个曾经的&amp;rdquo;营业员&amp;rdquo;, 知道: 本来将近 10 块的苹果，哪怕有一点“坏点”（表面看起来不怎么样或者真的有坏点的）, 最后几块钱一袋 4 个的贱卖。所以说这超市买的东西是真的贵。当然它的顾客应该都是那些&amp;rdquo;富人&amp;rdquo;啦。
之前在那个打工后，自己应该也写的相关的日志，对于那些工友更是同情，而现在再观察，发现自己比他们要辛运：
 同样的工作时间，我拿的工资是他们两倍还多，以后会更多；
 工作的劳累度上，他们工作期间几乎没有坐的时间，多数也是在付出劳力，而自己多数是坐着，多数付出的是脑力。
  越来感觉，和他们分处不同的阶层。
心里几次问自己，工作为什么了？攒够钱然后可以自由的去玩，购买自己喜欢的物品，住得更好一些，这些是最浮面的想法，而深入的想想，按目前自己的工工资，不存款的话，满足自己没什么问题，但，一考虑到生病（自己，家人乃至朋友），未来未知的多种变故，钱可能会用得很快，甚至更惨。现在的消息是大家都处于健康状态还好，一出问题，小则操心，大则无助。而今天在知乎上看到这么一个问答：
上班赚钱是为了吃饭，不要再用上班忙的借口不吃饭了。 上班赚钱是为了养家，不要再以忙为理由不往家里打电话了。 上班赚钱就是要讨媳妇、嫁男人，不要再把工作当做你社交恐惧症的借口，有病你就去治！拖久了你吃金坷垃也没用。 不要再南辕北辙！不要再缘木求鱼！不要再刻舟求剑！别 TM 再犯傻了！ 7. 我希望看这个题目的人看见： 不要再追求什么鸟的高深哲理。 好好做事，天天吃饭。 爱恨敢当，回家看看  这让人深思又明了。</description>
    </item>
    
    <item>
      <title>range copy value?</title>
      <link>https://www.jialinwu.com/post/range-copy-value/</link>
      <pubDate>Thu, 13 Aug 2015 22:49:49 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/range-copy-value/</guid>
      <description>可能一想到 range，就会联想到一些书中提到 range 过程获得的第二变量是原变量的备份，通过修改这个变量的值对原变量是无效的，其实不全对，关键还要看原变量是一个值变量还是一个指针变量。
如下面的代码，a 作为一个值变量，range 过程中想通过修改它的备份 v 的值进而修改 a 中的值，是不对 a 起效的，而 b 作为一个指针变量，它的备份 v（自淫都叫备份）复制的是 b 中的变量的地址，也就是指针的值（指针的值就是地址）, 这时通过修改 v 的值是可以修改 b 中变量的值的。
package main import ( &amp;quot;fmt&amp;quot; ) type D struct { Arr int } func ArrayPinter_PointerArrarDemo() { println(&amp;quot;&amp;lt;&amp;lt;&amp;lt;-----------------ArrayPinter_PointerArrarDemo----------&amp;quot;) println(&amp;quot;-------copy value------&amp;quot;) //modification will work during range,copy value? a := make([]D, 0, 1) a = append(a, D{Arr: 1}) a = append(a, D{Arr: 134324}) for k, v := range a { fmt.</description>
    </item>
    
    <item>
      <title>build go app auto version by git</title>
      <link>https://www.jialinwu.com/post/generate-go-app-version-by-git/</link>
      <pubDate>Sat, 08 Aug 2015 00:11:14 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/generate-go-app-version-by-git/</guid>
      <description>&lt;p&gt;有时候总是苦于版本的编号问题，借助于 git 版本控制中的信息可以很好的用于程序的版本识别，有了 hash 值还可以做其它事。&lt;br /&gt;
要点&lt;br /&gt;
* 借住&lt;strong&gt;-ldflags -X&lt;/strong&gt;更改程序中的定义的变量的值，&lt;br /&gt;
* 通过 shell 命令获取当前时间 和 当前 git 项目中的 hash 值&lt;br /&gt;
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Mac OSX 下 Vim 移动过慢问题</title>
      <link>https://www.jialinwu.com/post/mac-osx-%E4%B8%8Bvim%E7%A7%BB%E5%8A%A8%E8%BF%87%E6%85%A2%E9%97%AE%E9%A2%98/</link>
      <pubDate>Fri, 12 Jun 2015 12:55:08 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/mac-osx-%E4%B8%8Bvim%E7%A7%BB%E5%8A%A8%E8%BF%87%E6%85%A2%E9%97%AE%E9%A2%98/</guid>
      <description>通常，OSX 中默认的 vim 在命令模式中进行光标移动总感觉慢吞吞，相比 Linux 下默认的体验简直不是同一个层次的，这个与系统有关么？还是因为配置参数没改好？答案是后者。
之前有尝试过这篇文章 mac 光标速度调整 里面提到的方法去修改，有点效果，但还是达不到 Linux 下使用 Vim 那种飞跃的移动感。后来发现用一款叫 Karabiner（原名叫 KeyRemap4MacBook）的软件去修改 Key Repeat 和 Delay Until Repeat 就 OK 了。 赶快去试试！~</description>
    </item>
    
    <item>
      <title>using jsoncpp</title>
      <link>https://www.jialinwu.com/post/using-jsoncpp/</link>
      <pubDate>Tue, 12 May 2015 13:42:48 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/using-jsoncpp/</guid>
      <description>在 cpp 中简单快速的对 json 文件进行 read 和 write, jsoncpp 的地址：jsoncpp
里面 readme 没有简单的介绍怎么使用，对于小白来说还是蛮折腾的：
README.md 里面介绍了两种（编译）安装方法：一种是使用 cmake, 另外一种是使用 scons.
先说使用 cmake:
git clone 源代码后，在源代码的目录下进行操作：
mkdir -p build/debug cd build/debug cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF -G &amp;quot;Unix Makefiles&amp;quot; ../.. make make install  不意外的话会把 json/*.h json/*.cpp 等头文件装到
/usr/local/include/
目录下，同时会成一个静态的库文件 libjsoncpp.a:
147:lib_json Jialin$ pwd /Users/Jialin/gitOriginal/jsoncpp/build/src/lib_json 147:lib_json Jialin$ ls CMakeFiles	CTestTestfile.cmake	Makefile cmake_install.cmake	libjsoncpp.a  把这 libjsoncpp.a 移动到
/usr/local/lib/
目录下。
测试编译准备好了的测试文件 main.cpp
g++ main.cpp -ljsoncpp</description>
    </item>
    
    <item>
      <title>json 文件的读写 python 版</title>
      <link>https://www.jialinwu.com/post/json%E6%96%87%E4%BB%B6%E7%9A%84%E8%AF%BB%E5%86%99python%E7%89%88/</link>
      <pubDate>Mon, 04 May 2015 18:09:43 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/json%E6%96%87%E4%BB%B6%E7%9A%84%E8%AF%BB%E5%86%99python%E7%89%88/</guid>
      <description>&lt;p&gt;在写一些后台程序时通常会通过配置文件来预先设置一个数据如：数据库名，密码,host 等等, 使用 json 来作为配置文件是个不错的选择, 特别是在实习期间看了很多个项目都使用了 json 格式的文件来作为配置源, 今天在看了之前写的毕设的程序时发现还有好一些配置项的, 所以在网上搜了一下在 python 中怎么使用 json 文件进行数据的操作, 代码如下:&lt;br /&gt;
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>手写分页</title>
      <link>https://www.jialinwu.com/post/%E6%89%8B%E5%86%99%E5%88%86%E9%A1%B5/</link>
      <pubDate>Sun, 26 Apr 2015 11:26:11 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E6%89%8B%E5%86%99%E5%88%86%E9%A1%B5/</guid>
      <description>&lt;p&gt;实习期间要做一个条件查询和页面优化的需求实现，本着现学现用的做法用了一两天实现了分页，分页的要点在于：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;当点击下一页时，要把当前的查询条件一起提交到指定 url&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;当点击要显示的页面数量时，要把当前的查询条件一起提交到指定 url&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;这些查询的条件有 已选的 checkbox, 已经输入的文字等&lt;br /&gt;
&lt;strong&gt;难点在于在提交请求前怎么获取页面上的这些查询条件&lt;/strong&gt;&lt;br /&gt;
解决这个问题的难点在于如何使用 jquery 来配合 css 中的 tag（如 div,css 等）来进行操作。比如：&lt;br /&gt;
&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>go-defer</title>
      <link>https://www.jialinwu.com/post/go-defer/</link>
      <pubDate>Fri, 06 Mar 2015 21:26:37 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/go-defer/</guid>
      <description>官方文档中对 defer 的作用是这样描述的：
Instead, deferred functions are invoked immediately before the surrounding function returns, in the reverse order they were deferred.
其中的给出的例子也很好理解：
lock(l) defer unlock(l) // unlocking happens before surrounding function returns // prints 3 2 1 0 before surrounding function returns // 用中文来讲就是先入后出 for i := 0; i &amp;lt;= 3; i++ { defer fmt.Print(i) } // f returns 1 func f() (result int) { //golang 可以 显式的 对用返回值进行操作 defer func() { result++ }() return 0 }  但总会有一些细节没有暴露出来，想想：func useAssign(){ n := 10 defer func() { // 在这里去掉 defer 或留着 结果是不一样，为什么 ?</description>
    </item>
    
    <item>
      <title>main(int argc,char* argv[]) 实用 demo</title>
      <link>https://www.jialinwu.com/post/main-int-argc-cha-argv-%E5%AE%9E%E7%94%A8demo/</link>
      <pubDate>Thu, 12 Feb 2015 00:36:56 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/main-int-argc-cha-argv-%E5%AE%9E%E7%94%A8demo/</guid>
      <description>
记得刚开始学习 c++ 的时候总是用最简单的开头函数，以至于自己都形成了一种沉溺于这种简单的心态如：
int main(){ }  main() 不传入任何参数，而平常的课堂练习或者作业也多是看到这样简单的开头，
后来看到别的代码却发现，这些代码总是用这样的开头函数：
int main(int argc,char *argv[]){ }  那时候一点都不知道为什么总是会多写这两个参数，像上面的简简单单的开头函数不好么？总感觉那两个参数特别烦甚至觉得是多余的，后来渐渐的发现但不是很实战的去
理解，argc 表示参数的个数，其中程序的名字也算一个参数，而 argv 则表示这些参数的的具体内容，比如 argv[0] 是指程序的名称。对于这两个参数的了解也就那么多而已。直到今天下午（2 月 7 日）小灏子问了我一个问题&amp;hellip; 现在理清了一下，问题是：在当前目录下做一个 soft link（名字为 id) 到 busybox，执行当前目录的 id 与执行 busybox id 的效果是一样的，这是怎么做到的？
后来查看了具有与 busybox 类似情况的 xtables-multi 源代码，发现其实问题的答案就与这两个参数有关，原来 xtables-multi 的一开始就把传入程序的参数从第一个开始处理后 (basename()) 与预先保留的字符作比，如果发现这些参数不留有项中，则提示“No subcommand given”等提示；否则就执行相应的 sub_main()。自己写了个小 demo，如图：
需要注意的是，当执行软链接的 app 时，程序的第一个参数就是软链接的名称而不是源程序的名称。
这下子，自己对 (int argc,char *argv[]) 的作用多了点实战的认识。
#include &amp;lt;iostream&amp;gt; #include &amp;lt;cstdio&amp;gt; #include &amp;lt;libgen.h&amp;gt; //basename using namespace std; int main(int argc, char *argv[]) { // char *c[]={&amp;quot;/jfe/ajfje&amp;quot;,&amp;quot;two/jfej/demo&amp;quot;}; // char **cc=c; // ++cc; // char *cp=(*cc); // const char *cmd = basename((cp)); printf(&amp;quot;app&#39;s name %s\n&amp;quot;,basename(*argv)); return 0; } </description>
    </item>
    
    <item>
      <title>fork vfork</title>
      <link>https://www.jialinwu.com/post/fork-vfork/</link>
      <pubDate>Thu, 12 Feb 2015 00:36:10 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/fork-vfork/</guid>
      <description>看了这篇关于 C 语言里，main 函数中 return x 和 exit(x) 到底有什么区别 ? 的集合版的文章，能大概知道之所以然，但还是觉不太通俗易懂，自己从床上爬起来，敲了一下代码，并用自己理解的方式在代码旁边加了注释，如下：
 #include &amp;lt;iostream&amp;gt; #include &amp;lt;sys/wait.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; //fork() #include &amp;lt;stdlib.h&amp;gt; //exit() using namespace std; int democ(){ cout&amp;lt;&amp;lt;&amp;quot;child inside return&amp;quot;&amp;lt;&amp;lt;endl; exit(0); return 10; } int demop(){ cout&amp;lt;&amp;lt;&amp;quot;parent inside return&amp;quot;&amp;lt;&amp;lt;endl; return 11; } int main(int argc, char *argv[]) { int pid = fork(); // int pid = vfork(); if (pid &amp;lt; 0) { exit(1); } else if(pid ==0){ cout&amp;lt;&amp;lt;democ()&amp;lt;&amp;lt;endl; exit(0); //just like break in chile process,acturally,vfork is borned to multi process;usually in mutil process ,application needs to be stop in one child but don&#39;t affect the parent process at the same time,so exit() is for this case,in another word,exit only works for one process at a time.</description>
    </item>
    
    <item>
      <title>install godoc</title>
      <link>https://www.jialinwu.com/post/install-godoc/</link>
      <pubDate>Tue, 03 Feb 2015 13:12:06 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/install-godoc/</guid>
      <description>有些书说 1.2rc1 版本之前是用 go doc 来查看文档信息，1.2rc1 之后的版本就换成了 godoc，但发现安装 go 后，godoc 没有一起安装，自己用在 Mac 下用 brew 安装的 go，版本为 1.4，只能自己手动安装了：
step 1: 下载源码
如果能正常访问 golang.org:
go get -v -u golang.org/x/tools/cmd/godoc  如果不能，内地正常情况下是不能的：
git clone https://github.com/golang/tools $GOPATH/src/golang.org/x/tools  step 2: 生成
go build $GOPATH/src/golang.org/x/tools/cmd/godoc  如果在 go build 的过程中出现
can&#39;t load package: package /src/golang.org/x/tools/cmd/godoc: import &amp;quot;/src/golang.org/x/tools/cmd/godoc&amp;quot;: cannot import absolute path  手动 cd 到 $GOPATH/src/golang.org/x/tools/cmd/godoc, 再执行 go build
最后把生成的 godoc 执行文件移动到 $GOPATH/bin/ 下</description>
    </item>
    
    <item>
      <title>Android 手机使用优化</title>
      <link>https://www.jialinwu.com/post/android%E4%BD%BF%E7%94%A8%E4%BC%98%E5%8C%96/</link>
      <pubDate>Sun, 25 Jan 2015 17:58:47 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/android%E4%BD%BF%E7%94%A8%E4%BC%98%E5%8C%96/</guid>
      <description>如何解决安卓手机卡顿问题？后来觉得这个标题不应该这样起，而应该叫做怎么能让安卓机能正常使用？
自己的小米 1 用了有两年 + 了，即使是使用 MIUI 系统也是很卡, 卡得连只愿意用来打电话了, 甚至连打电话也担心. 就目前来看这几乎是所有安卓手机的通病，当然没试过阿里云 OS. 想想小米 1 的配置也有 1G RAM, 1.5GHZ 的 CPU, 如果是 iPhone 那是顺畅死了, 毕竟 Android 不是 IOS. 此时想想在安卓机普遍还没改善这个问题的情况下, 下一部手机绝对不买安卓手机, 目前也只能自己想办法去优化了：
 首先，MIUI 系统对于小米 1 来说已经不用考虑了, 在 MIUI6（据说是基于 Android4.4 的）不支持 MI1 的前提下, 后来尝试刷第三方的 ROM, 都说 Android4.4 有针对低配置手机进行了优化, 自己找了一下, 发现有 CM11, 魔趣等, 刷了魔趣 Android4.4, 与 MIUI5 相比, 确实流畅了许多. 本来还没想想 Android5.0 的, 不过目前网上还没找到已经适配的 Rom.
 即使是刷了 Android4.4, 还是有点卡，后来把在网上找到一个叫 绿色守护 的 app, 这个可以 让其它 app 进入睡眼状态以减轻手机的后台负担。</description>
    </item>
    
    <item>
      <title>Why They Choose Golang?</title>
      <link>https://www.jialinwu.com/post/why-choose-golang/</link>
      <pubDate>Mon, 19 Jan 2015 10:20:51 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/why-choose-golang/</guid>
      <description>Why They Choose Golang? 为什么选择 golang（go 语言）用作开发？
在 Youtube 上看了一个视频，其中有一家公司的代表，他就应该是 CTO 或者 CEO 之类的人物，记述了公司选择使用 golang 作为开发语言的后所发生的变化，中间用了一张全身都是钱的人的动态来描述了公司现在的经济状况&amp;hellip; 那家公司是最早期选择使用 golang 作为开发语言的公司之一，golang 在现实出色的表现为公司带来了巨大的利益，服务器开销的大大降低和服务效率的有效提升，这同时也验证了 golang 有编程语言中现有的独特地位。那 golang 有什么优秀的独特之处呢？下面是在视频中截出来的部分画面：
Why we chose Go
After switching to Go
Go Performance
Go Concurrency
Conclusion
Why not Python</description>
    </item>
    
    <item>
      <title>算法|思考</title>
      <link>https://www.jialinwu.com/post/%E7%AE%97%E6%B3%95-%E6%80%9D%E8%80%83/</link>
      <pubDate>Sat, 17 Jan 2015 13:03:11 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E7%AE%97%E6%B3%95-%E6%80%9D%E8%80%83/</guid>
      <description>&lt;p&gt;偶尔自己会去一些 OJ 网站上找那么几道题目来尝试解答，在 &lt;a href=&#34;https://oj.leetcode.com&#34;&gt;leetcode&lt;/a&gt; 看到了一道 &lt;a href=&#34;https://oj.leetcode.com/problems/largest-number/&#34;&gt;largest-number&lt;/a&gt;, 感觉并不是很难，这道题也属于 Medium 的级别。自己从数字运算和组合角度尝试去求解，但发现总会发现一些 test cases 无法得到验证，后来看了 github 上牛人公开的代码后，发现就是一个简单的字典排序思想，想想这个：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-cpp&#34;&gt;	string a =&amp;quot;9&amp;quot;;
	string b =&amp;quot;a&amp;quot;;
	cout&amp;lt;&amp;lt;((a+b) &amp;gt; (b+a))&amp;lt;&amp;lt;endl;
	string ab=a+b;//&amp;quot;9a&amp;quot;
	string ba=b+a;//&amp;quot;a9&amp;quot;
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    
    <item>
      <title>computing by multi thread</title>
      <link>https://www.jialinwu.com/post/computing-by-multi-thread/</link>
      <pubDate>Tue, 06 Jan 2015 18:16:06 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/computing-by-multi-thread/</guid>
      <description>&lt;p&gt;最近在看一本叫做《Computer Systems-A Programmer&amp;rsquo;s Perspective》Second Edition, 中文名叫《深入理解计算机系统》, 觉得这个本讲得还是很不错的，里面的例子对于理解书中所讲的知识点很有帮助，比如在讲多线程中，列举了用多个线程来计算一系统数据来展示多线程的优点。自己跟着书中的 demo 动手实现了一下。书中用最原始的 pthread 来编程，代码如下： &lt;/p&gt;</description>
    </item>
    
    <item>
      <title>科目三 - 有惊有险</title>
      <link>https://www.jialinwu.com/post/%E7%A7%91%E7%9B%AE%E4%B8%89-%E6%9C%89%E6%83%8A%E6%9C%89%E9%99%A9/</link>
      <pubDate>Sun, 04 Jan 2015 09:46:20 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E7%A7%91%E7%9B%AE%E4%B8%89-%E6%9C%89%E6%83%8A%E6%9C%89%E9%99%A9/</guid>
      <description>一些注意事项：
 踩死离合才能挂上档，否则只能挂回 0 档，其他档位挂不上。
 去时，速度保持在 30 码左右，这样能在通过人行道或者路口时（通过路牌后，语音开始提示）轻踩刹车时速度能及时降到 30km 以下；
 左转弯之前把档位降到 1 档，打开左向灯后，踩刹车，（可停下来），慢转，左右观望。
 回来时，速度提到 3 档，速度保持在 30km 以上，稳妥起见，40km 以下。
 超车时，保持右脚放在油门，一直保持速度，然后打左灯，往左望一下，然后往左微转，当车左角进到左道中间时回直，然后打右灯，（速度不变）向右望一下后，向右微转，当车右前角进到右道中间时，回直，关右灯。
 停车时，在转完弯后把离合踩死，向左打死，（车速很慢）观察车头，右边直线进入到车头中间偏右一点后，方向盘摆直，望前看，保持车前行，（感觉）当车与右边直线平行时，看右后视镜，当右后车轮上车身将近右边直线时，停车。
 停车后，挂 0 档，拉手刹，熄火。
（如果是夜间模式，要打开 警示灯和关掉大灯 - 即近光灯）
 2 档退 1 档时，不要往下压，最好向上提然后往左前推。
  总得来说，科目三考是主要是 细节 x 胆量 x 运气。我所在的学员组有 8 个考科目三，过了 5 个，其他三个据我大概的了解：
一个时细节没做到位，他进行的是夜间模式考试，但是在停车后忘了把大灯关了，结果 100 分就不见了。
一个是胆量不够，在待考时，她在自言上车时要做的动作，让我觉得她过于紧张显得害怕，结果在上车时，据她说，第一次忘了把手刹压下了，第二次没把手刹压到位。同样是女生，另外一个相比起来，却显得要沉稳许多，起码不会什么显得生疏一样自言自语。
还有一个只能说是运气不好了，据他说，他在回来超车时，刚好前面有一辆摩托车慢慢行驶着，他想变道，但是后来被安全员踩停了。
就我个人而言，我的细节注意了，胆量没问题，运气也好一点。不过想想整个科目三正式考试下来感觉非常险。
第一，我在起步时 挡挂好了，手刹也放好了，差点忘记系安全带了，还好我听到旁边的安全员叹气的声音（不知道他是不是有意为之）我脑子一闪就马上把 挡回 0，拉手刹，立刻拉安全带系好。
第二，在左转弯时，前面停了三辆车，还好我没烦躁，耐下心来把车停好（还挡了 0 挡，拉好手刹）等前面的车陆续走后，才慢慢开始进行转弯。那时我有点疑惑为什么这几辆的转弯步骤那么相像，后来知道，原来前面几辆都是自己组的学员在开着。
第三，在靠边停车时，我压线了（旁边的安全员是这么说的）或者说差一丁点就压线了（电脑没判），我停车后，安全叫我不要下车，他下车时，我从右边车门看了一下，右前车轮真的差一丁点就压线了。不管那么多，我直接把接下为的动作做完。即使他说不要下车，等把最后一个动作做完后（开门关门）电脑报了考试通过。后来那位安全员没有让重新开始，我就直说了“谢谢”，然后就往门口跑回去了。太高兴了，拿牌子把身份证换回来后，在出待考区时，走到了进来的边道，撞到了进来的橫杆。然后迫不及待的去签字，单子打印好之后，看到上面写着 100 分，而对面的业务员让我确认这是我的名字后，我直接了当的签上了自己的名字。
说实话，在考试之前，靠边停车和路上的慢车（摩托车，三轮车）是我最担心的。因为我对靠边停车的把握还不是很明确，怎样看配合什么时候停车才准确，自己心里还是有一点模糊的，当然心里是有一种方案去停车的，这不，压线了。其实在靠边停车时，在停车前保持 100 分的前提下，即使右边车轮的与右直线相差超过 30cm 小于 60cm 最多也就扣 10 分而不至于下课。</description>
    </item>
    
    <item>
      <title>怎么学习汇编</title>
      <link>https://www.jialinwu.com/post/%E6%80%8E%E4%B9%88%E5%AD%A6%E4%B9%A0%E6%B1%87%E7%BC%96/</link>
      <pubDate>Tue, 23 Dec 2014 21:23:32 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E6%80%8E%E4%B9%88%E5%AD%A6%E4%B9%A0%E6%B1%87%E7%BC%96/</guid>
      <description>快速的预览了一下《DEBUG HACKS》, 增了一点调试程序方面的见识。一下子对 steass,gdb,coredump,crash 等等的使用有了个初步的印象。像使用 gdb 调试，有时会要直接看反汇编的代码，书中对怎么学习汇编作了一个简单的介绍，不只指望学习完这一小章就能够把汇编学好，但作为一个初步印象的入门可以借鉴一下。贴一下图片：
如果真的要学习汇编 (assembly language), 推荐试试看一下这个</description>
    </item>
    
    <item>
      <title>名词解释</title>
      <link>https://www.jialinwu.com/post/%E5%90%8D%E8%AF%8D%E8%A7%A3%E9%87%8A/</link>
      <pubDate>Fri, 19 Dec 2014 21:11:31 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/%E5%90%8D%E8%AF%8D%E8%A7%A3%E9%87%8A/</guid>
      <description>大学的那些教科书的专业名词通常解释得生硬，更别说去理解书中的内容了，各种看不懂，在这里摘抄了个人认为比较明了的名词解释，大家就当作字典来 find and read 就好（陆续更新）。
锁
互斥控制中使用的一种同步机制。多个线程之间共享资源时，通过锁可以保证数据的一致性，锁保护的操作区间称为临界区（critical section)（教科书有这说：每个进程中访问临界资源的那段代码称为临界区；而网上有也有这么认为的：程序中操作临界资源的程序段称为临界区）。
用户应用程序常用的代表性的锁有 互斥量 (mutex), 信号量 (semaphore) 等。Linux 内核常用的有自旋锁 (spinlock)，信号量，RCU, 顺序锁 (sequential lock) 等。忘记加锁会很容易发生数据被破坏，死锁等 BUG，除了锁之外，其他同步机制还有通过原子指令操作资源的方法（原子操作）。
进程、线程
在 Linux 中，线程是内核管理的最小的程序运行实例，进程是由一个或多个线程组成的程序运行实例。进程内的各个线程，共享内存空间，所以某个线程发生内存非法访问等 BUG, 经常会影响到其它线程的运行，关于进程、线程的理解可以参考这篇简单易懂的文章
内核转储
指将某一时刻的处理器的内存映像和寄存器内容等保存到文件 中的动作，或指保存后的文件，保存后的文件也称为内核转储。一般来说，程序异常结束时，某些操作系统会生成内核转储。GDB 等调试器与内核转储结合使用，就能获知发生时的处理器状态。
SMP
Symmetric Multic Processing，系统中的配置多个 CPUsynyj，每个 CPU 核心都可以执行同样的处理。与 UP（Unit Processing）相比，软件层面上要考虑的事情更多，由 SMP 引发的 BUG 也屡屡发生。
i386
Intel 的 32 位架构的通称，由最初使用该架构的 CPU 而得名，Intel 的 32 位处理器后来经过多次扩展，分别称为 i486,i586,i686, 这些架构的总称也是 i386。
x86_64
AMD 的 64 位架构，以及与之兼容的 Intel 64 位架构的通称，Intel 的 64 位中架构中还有个 ia64, 但这两者完全不同。x86_64 架构的特征是它能执行 i386 指令，因此在使用 64 系统中也能运行 32 位的软件资源。</description>
    </item>
    
    <item>
      <title>about me</title>
      <link>https://www.jialinwu.com/post/about-me/</link>
      <pubDate>Wed, 17 Dec 2014 00:00:00 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/about-me/</guid>
      <description>Jialin Wu
经历：
 2018.6-now: 在一家&amp;rdquo;全能&amp;rdquo;的公司，做自然语言对话，人工智能开发
 2015.3-2018.4: 在一家日均流量上百亿互联网计算广告公司做开发，
 2011-2015: 本科 计算机科学与技术专业 桂林电子科技大学 (Guilin University of Electronic Technology)
  微博 (Weibo): 甲林 Now
Email: win27v@gmail.com
QQ: 85253933
-- 喜欢一切简洁、快速、强壮且优美的事物 (interested in things that are simple and rubost) </description>
    </item>
    
    <item>
      <title>selinux 导致 web 无法正常访问问题</title>
      <link>https://www.jialinwu.com/post/2014-12-15-selinuxdao-zhi-webwu-fa-zheng-chang-fang-wen-wen-ti/</link>
      <pubDate>Tue, 16 Dec 2014 21:58:51 +0800</pubDate>
      
      <guid>https://www.jialinwu.com/post/2014-12-15-selinuxdao-zhi-webwu-fa-zheng-chang-fang-wen-wen-ti/</guid>
      <description>&lt;p&gt;服务器的架构是 lnmp(centos 6.5,nginx,mariadb,php) 当 lnmp 配置好后，访问主页时遇到，如：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-text&#34;&gt;CException

Application runtime path &amp;quot;/usr/share/nginx/html/guetoj/protected/runtime&amp;quot; is not valid. Please make sure it is a directory writable by the Web server process.
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;或者出现文件确实但是访问时却提示：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-html&#34;&gt;File not found
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    
    <item>
      <title>new blog</title>
      <link>https://www.jialinwu.com/post/newblog/</link>
      <pubDate>Mon, 15 Dec 2014 20:26:49 +0000</pubDate>
      
      <guid>https://www.jialinwu.com/post/newblog/</guid>
      <description>这个是我的新博客地址。</description>
    </item>
    
  </channel>
</rss>