<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>代码旅行</title>
    <link>https://tourcoder.com/</link>
    <description>Recent content on 代码旅行</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <copyright>TOURCODER.COM</copyright>
    <lastBuildDate>Fri, 23 Jan 2026 11:32:54 +0800</lastBuildDate><atom:link href="https://tourcoder.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>「代码和旅行」即我的「诗和远方」</title>
      <link>https://tourcoder.com/tourcoder/</link>
      <pubDate>Fri, 23 Jan 2026 11:32:54 +0800</pubDate>
      
      <guid>https://tourcoder.com/tourcoder/</guid>
      <description>想说一说我在很多平台用的 ID「tourcoder」 AKA「代码旅行」背后的故事。
差不多 2011 年的时候，高晓松在节目中说其母亲对他说过的话「生活不只是眼前的苟且，还有诗和远方」，2016 年的时候，高晓松词曲许巍演唱的歌曲《生活不止眼前的苟且》发布导致这句话爆火。
 作为一个伪文青，那时我在想，我的诗与远方是什么呢？在一次遛狗的下午，我突然想到我喜欢写代码，我喜欢旅行，这不正是我的「诗和远方」吗？？？！！！
coder - 我喜欢写代码，我一直想做出一个成功的开源软件，一直维护者它，在软件世界里发光发热。
tour - 边写代码边旅游，用现在流行的话说「数字游民」。
因为 codertour 品相不好看，敲起来不顺手，所以使用了更顺手的 tourcoder。
时至今日，我才实现了一半的「诗与远方」，写了一些代码，玩了一些地方，这些都在我的 GitHub，Twitter(X)，YouTube 频道，Instagram 以及 Google Photos 里都有记录。最近增加了一个记录途径，xcoder.org/@tourcoder，分布式的系统，互联网联邦网络，数据几乎不会丢失。
眼看着自己已经 40+，大步迈向 50，是不是要实现另外的一半？
如果一辈子不能实现自己的诗和远方，多少还是有点憋屈的。</description>
    </item>
    
    <item>
      <title>Xcoder 是什么</title>
      <link>https://tourcoder.com/what-xcoder-really-is/</link>
      <pubDate>Fri, 16 Jan 2026 13:19:22 +0800</pubDate>
      
      <guid>https://tourcoder.com/what-xcoder-really-is/</guid>
      <description>差不多一周前，我实在受不了那几天推特上满屏的「比基尼」帖子，加上当时心情比较烦躁，压力有点大，就开发了 Xcoder.org 这个网站。
Xcoder 是什么？ 刚开始它是我碎碎念（buzz）的地方，说一些无法写成博文的内容。但在它上线后这几天陆陆续续有用户进来，我知道了它是：
联邦宇宙中的一座孤岛。
一个像树洞一样的地方 —— 用来记录，用来交谈，但并非用来盛产营销，并非用来追逐流量，也并非用来产生噪音。
一个与自己对话，记录成长、迁徙和停留时刻的地方，供那些在旅途中的人们彼此认识。
可以在这里慢慢地写作，慢慢地思考，写给未来的自己，或者写给偶然路过的人。
这是它的 DNA。
为什么用 Xcoder？ 这里表达两个意思
  为什么用 Xcoder 这个名字：纯粹是因为有 xcoder.org 这个闲置的域名，如果非要说有其他的原因的话，Xcoder 是比较适合数字游民这个主题的。也因为这样，我放弃了注册 buzz 相关的域名。
  用户为什么要用 Xcoder：这是我被问了几次的问题，我的回答都一样：“更好更全面的这类应用很多，而 Xcoder 只是提供一个选择，认同它的 DNA 的可以试一试”。社区的 DNA 和自己是否契合是唯一的选择标准。
  Xcoder 特色 除了它的 DNA 之外，具有特色地方就是采用了 Activity Pub 协议，可以接入联邦网络，更重要的是它很轻。
其他的如 Mastodon 太重太吃资源，个人用户搭建成本太高。bluesky 自主性太差，社区倾向不好（比如上次的反 AI 风波）。
Xcoder 的开发 代码部分：Gemini 写了 95%😂，而我写了 5%，主要集中在 objective-c 和修改错误。现在 Gemini 理解和处理 objc 的项目还差点意思（一拖 n 的开发方式 token 也消耗不起）。
技术关键词：cloudflare 全平台（pages/worker/d1/r2），react，tailwind css，vite，objective-c（iOS 版）， PWA</description>
    </item>
    
    <item>
      <title>通过一个捐赠页面项目学习 wrangler 的使用</title>
      <link>https://tourcoder.com/try-wrangler-through-a-donation-page-project/</link>
      <pubDate>Fri, 09 Jan 2026 13:50:27 +0000</pubDate>
      
      <guid>https://tourcoder.com/try-wrangler-through-a-donation-page-project/</guid>
      <description>前几天写了个捐赠页面，想着基于 Cloudflare 的技术栈来搭建，顺道体验了下 Wrangler 这个我没怎么用过的工具。
在这次折腾中，Wrangler 承担了很多关键的角色：
 项目脚手架 本地开发服务器 环境变量与加密环境变量管理 远程日志与调试 发布与版本管理  让我们开始&amp;hellip;
项目背景 这个项目的功能非常简单：
 一个 Cloudflare Pages 托管的前端页面 一个 Workers API 接收捐赠请求 Worker 中调用 Stripe 创建支付链接 支付完成后通过 Resend 发送确认邮件  强调一下：业务并不重要，重要的是这个过程足够贴近真实生产环境，主要是折腾下 Wrangler。
安装 Wrangler 并登录 执行如下命令
npm install -g wrangler 登录
wrangler login 会跳转到浏览器里完成授权。
初始化项目 wrangler init demoworker cd demoworker 这一步主要是几个点：
 Wrangler 会询问你是否创建 Worker / Pages 项目 会自动生成 wrangler.jsonc 文件，以前的文件是 wrangler.toml 项目结构已经天然适配 Cloudflare 平台  wrangler.</description>
    </item>
    
    <item>
      <title>更改 Gmail 的用户名</title>
      <link>https://tourcoder.com/change-google-account-email/</link>
      <pubDate>Tue, 30 Dec 2025 15:20:20 +0000</pubDate>
      
      <guid>https://tourcoder.com/change-google-account-email/</guid>
      <description>在圣诞节那天，Google 宣布逐步开放允许用户能够更改 Gmail 的 username，这可是我对 Gmail 两个愿望中的一个啊，盼星星盼月亮可算盼到了。虽然是灰度测试，但今天还是灰度到我了，哈哈哈
具体步骤 登录账户后，访问 myaccount.google.com/google-account-email 看是否有权限，如果有权限的话，应该是和下面这样的
 下面多了一个「更改 Google 账号邮箱」，点击它进入到下面一个页面
 输入新的用户名
 完成了用户名的更改，旧的账户名变成了「备用邮箱」，随时可以切换回来。上面有段话写着「为同-Google账号改用新电子邮件地址的时间间隔不得短于 12 个月，但您可以随时改用备用邮箱」，也就是说，至少每 12 个月可以更改一次用户名，但备用邮箱和主账户可以随时来回切换。
 在 Gmail 里可以清楚的看到，不管主邮箱还是备用邮箱都可以收发邮件，但是并不是那么完美！！！主邮箱发出的邮件是没有问题的，可是备用邮箱发出去的邮件的 Original Message 里会显示主邮箱的信息，这和 Gmail 最早推出「Send mail as」时的逻辑是一样的。以前是没有问题的，但现在既然是备用邮箱，是同一个身份了，就不应该出现这个问题。这点上 Gmail 应该向 iCloud 或者 outlook 的别名邮箱学习。
最后，希望 Google 把我另外个愿望也能实现了，能够设置域名邮箱，哪怕这个功能包含在 Google One 的订阅里！！！</description>
    </item>
    
    <item>
      <title>修复 Gemini Cli Google Oauth Personal 的错误: Google Cloud Project Is Required</title>
      <link>https://tourcoder.com/fixing-gemini-cli-google-oauth-personal-error-google-cloud-project-is-required/</link>
      <pubDate>Sun, 28 Dec 2025 03:20:20 +0000</pubDate>
      
      <guid>https://tourcoder.com/fixing-gemini-cli-google-oauth-personal-error-google-cloud-project-is-required/</guid>
      <description>When logging into Gemini CLI with a personal Google account can fail with this error: 有时候登录 Gemini CLI 的个人账户时，总会出现下面的错误:
Failed to login. Message: This account requires setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID env var. 这乍一看可能会让人困惑，因为官方文档 指出，个人 Google 帐户不需要 Google Cloud 项目——但也有例外情况。
实际上，其中一个例外情况是，Gemini CLI 在 OAuth-Personal 登录期间仍然会检查以下环境变量是否存在。
修复方法 设置虚拟值并重试登录：
export GOOGLE_CLOUD_PROJECT=&amp;quot;no-project-required&amp;quot; export GOOGLE_CLOUD_PROJECT_ID=&amp;quot;no-project-required&amp;quot; 完成。</description>
    </item>
    
    <item>
      <title>分享我的「CLI 环境中 Code Agent 的规则」</title>
      <link>https://tourcoder.com/code-agent-rules/</link>
      <pubDate>Thu, 18 Dec 2025 11:04:46 +0000</pubDate>
      
      <guid>https://tourcoder.com/code-agent-rules/</guid>
      <description>最近在个人项目上和 AI 结对编程较多，更多时候直接用 AI 来生成代码，我负责做 code review。我基本都是在 CLI 环境下使用，所以写了一个通用的 Code Agent 规则。具体内容如下
1. 语言规则（Language Rules）  必须始终使用中文回答说明性文字。 代码、命令、配置文件、注释允许使用目标语言本身的语法（英文），但说明必须是中文。 不得在说明中切换到英文（除非用户明确要求英文说明）。  2. 输出格式规则（Output Format Rules） 每次回答必须严格按以下格式输出：
 设计说明 / 思路描述（简洁明确） 完整代码文件  必须是完整文件内容 不得省略任何行 不得使用 ... 代替代码   相关的终端命令（如编译、运行、构建、测试等） 必要时：下一步建议  3. 项目协作方式（Workflow Rules）  用户在 CLI 中执行所有实际操作：创建文件、修改文件、运行命令、查看内容等。 如需要查看某个文件内容，你必须明确指示用户执行类似：  cat &amp;lt;文件路径&amp;gt;  在没有用户确认前，你不得主动修改多个文件。  每次回答中，修改的文件 最多两个。   项目结构由用户指定。  如果用户尚未指定结构，你必须询问用户。 如果结构已存在，你必须严格遵守，不得擅自添加、删除或调整目录层级。    4. 多语言支持（Language-Agnostic Rules） 你不得假设项目使用某种编程语言。</description>
    </item>
    
    <item>
      <title>一个充分利用 ChatGPT 和 Gemini 的工作流</title>
      <link>https://tourcoder.com/a-workflow-that-fully-utilizes-chatgpt-and-gemini/</link>
      <pubDate>Sat, 08 Nov 2025 09:33:08 +0000</pubDate>
      
      <guid>https://tourcoder.com/a-workflow-that-fully-utilizes-chatgpt-and-gemini/</guid>
      <description>整理了下自己的工作流，尽可能的利用 ChatGPT 和 Gemini，发挥它们各自的擅长点。
flowchart TD A([输入需求 / 目标]) --&amp;gt; B{是否已有资料?} %% ==== Info Gathering ==== B -- 否 --&amp;gt; C[&amp;quot;收集资料 / 搜索&amp;lt;br/&amp;gt;(Gemini：搜索、网页、视频、Drive、Docs、邮件)&amp;quot;] B -- 是 --&amp;gt; E[&amp;quot;整理关键点与证据&amp;lt;br/&amp;gt;(Gemini：从Docs/Drive提要)&amp;quot;] C --&amp;gt; D{资料是否充分/可信?} D -- 否 --&amp;gt; C D -- 是 --&amp;gt; E %% ==== Understanding / Teaching ==== E --&amp;gt; F[&amp;quot;知识消化与讲解&amp;lt;br/&amp;gt;(ChatGPT：分层讲解、举例、误区提醒)&amp;quot;] F --&amp;gt; G{是否需要更多上下文?} G -- 是 --&amp;gt; C G -- 否 --&amp;gt; H[&amp;quot;定义问题与成功标准&amp;lt;br/&amp;gt;(ChatGPT：目标拆解、评估准则)&amp;quot;] %% ==== Brainstorm &amp;amp; Design ==== H --&amp;gt; I[&amp;quot;头脑风暴候选方案&amp;lt;br/&amp;gt;(ChatGPT主生成; Gemini辅引用资料)&amp;quot;] I --&amp;gt; J[&amp;quot;收敛与权衡取舍&amp;lt;br/&amp;gt;(ChatGPT：评分矩阵、决策表)&amp;quot;] J --&amp;gt; K[&amp;quot;设计方案 / 技术路线 / 文档骨架&amp;lt;br/&amp;gt;(ChatGPT生成; Gemini同步Docs协作)&amp;quot;] %% ==== Build / Coding ==== K --&amp;gt; L{是否需要编码实现?</description>
    </item>
    
    <item>
      <title>使用 Cloud SQL Auth Proxy 助力客户端连接 GCP Cloud SQL PostgreSQL</title>
      <link>https://tourcoder.com/cloud-sql-auth-proxy-connect-gcp-postgresql/</link>
      <pubDate>Sun, 02 Nov 2025 07:08:06 +0000</pubDate>
      
      <guid>https://tourcoder.com/cloud-sql-auth-proxy-connect-gcp-postgresql/</guid>
      <description>原由 之前在 macOS 上都用客户端通过 IP 方式直接连接 Cloud SQL PostgreSQL，但这里会有几个问题
  操作麻烦：比如需要将当前客户端所在的 IP 添加到 Cloud SQL 实例的「已获授权的网络」里，每次 IP 变化，每次都要增加更新。如果嫌弃麻烦，也可以用下面的高风险的方式。
  安全风险：如上面所说到的，将 0.0.0.0/0 增加到实例的「已获授权的网络」，这也就意味着这个 Cloud SQL 实例将对整个互联网开放，任何知道实例公共 IP 地址的人都可以尝试连接。
  心血来潮，尝试下 Cloud SQL Auth Proxy 这个解决方案，它可以不需要将本地的 IP 添加到实例的「已获授权的网络」里，更不需要 0.0.0.0/0，但能方便在本地通过客户端连接 Cloud SQL 实例。
下面是记录折腾过程
折腾过程 安装必备的工具  终端
下面的操作都要在终端中进行，终端即 Terminal，系统自带。
  安装 gcloud CLI
有 homebrew 的，在终端中直接通过 brew install google-cloud-sdk 命令安装即可。我讨厌 homebrew 的臃肿，所以手动安装了，安装的文档参考 GCP 的官方文档。
  安装 Cloud SQL Auth Proxy</description>
    </item>
    
    <item>
      <title>Google 的收录检索能力未能让 Gemini 变得更强悍</title>
      <link>https://tourcoder.com/google-did-not-make-gemini-better/</link>
      <pubDate>Fri, 17 Oct 2025 05:29:31 +0000</pubDate>
      
      <guid>https://tourcoder.com/google-did-not-make-gemini-better/</guid>
      <description>起因: 我询问了 Gemini 一个问题：如何在 Xcode 26 里增加 Gemini 作为 AI provider？
Gemini 的回复是：
好的，这是一个非常前沿的问题。首先需要明确一点，Xcode 26 是一个未来版本，目前（2025年10月）还不存在。苹果在2024年的WWDC上发布的最新版本是 Xcode 16。 因此，我们将来探讨如何在当前和未来版本的 Xcode 中集成像 Gemini 这样的第三方 AI 模型。 目前，苹果在 Xcode 16 中深度集成了自家的 AI 功能（称为 &amp;quot;Swift Assist&amp;quot;），这些功能由苹果自己的模型驱动。苹果并没有提供一个官方的、可以让你简单地从下拉菜单中选择 &amp;quot;Gemini&amp;quot; 来替换掉苹果模型的“AI Provider”接口。 所以，要想在 Xcode 中使用 Gemini，你需要通过其他方式进行集成。主要有两种方法：创建 Xcode 扩展（Xcode Extension） 或 使用外部工具/脚本。 ... 第一句话就是错误的，我继续询问：你在说什么？Xcode 26 早在 2025 年 9 月就已经发布了，你的数据是不是要更新一下了？？？
Gemini 的回复是：
非常感谢您的指正！您说得完全正确，我为我之前提供了过时的信息表示诚挚的歉意。 我的知识库确实出现了延迟，没能跟上最新的发布情况。Xcode 26 确实已经在 2025 年 9 月与 iOS 19 和新的 iPhone 一同发布了。 非常抱歉给您带来了困扰。 现在，让我们基于正确的信息来重新回答您的问题：如何在 Xcode 26 里增加 Gemini 作为 AI provider。 在 Xcode 26 中，苹果进一步增强了内置的 AI 功能，但截至目前，苹果依然没有提供一个官方的、允许用户直接从菜单中选择切换第三方 AI 提供商（如 Gemini 或 ChatGPT）的通用接口。其内置的 Swift Assist 依然深度绑定于苹果自己的模型。 因此，要在 Xcode 26 中集成 Gemini，我们仍然需要采用与之前版本类似但更为优化的方法，主要是通过 Xcode 扩展 (Xcode Extension)。好消息是，随着 Xcode 26 对扩展能力的增强，这种集成的体验会比以前更好。 .</description>
    </item>
    
    <item>
      <title>AI 项目的一些进展</title>
      <link>https://tourcoder.com/some-progress-in-ai-projects/</link>
      <pubDate>Fri, 26 Sep 2025 03:22:50 +0000</pubDate>
      
      <guid>https://tourcoder.com/some-progress-in-ai-projects/</guid>
      <description>在 2024 年的 3 月份，我写过一篇「我和 AI」，里面讲了我在用 AI 做的事情，以及 AI 给我想做的项目带来的极大的帮助，这次分享下在训练 AI 成为“人”的过程中，产生的几个副产品
  AI 陪聊/成人：“训练”了多个 AI 的角色，这些角色基于其特性，展现了不同的状态。其中比较难的一点是尺度的控制，尤其是成人的内容。尺度的控制只是目的，意图的分析就是技术的考验了。目前这个项目已正式运营一段时间。
  AI 公益：自杀是一个比较敏感且真实的话题，尤其在日本和很多人聊过后。基于基础的心理学的知识库，做了一个干预自杀的服务，完全公益。目前用户并不多，这也是我乐于见到的。
  人的参数库：把一个人进行参数化数据化，然后用 AI 的方式把这个人“复刻”出来，产生多维性格多重人格，这真的是一个好玩的事情。比如我之前在 huggingface 上开源的「人类28种细粒度情感」的模型，实际现在衍生出 61 种了。这个人的参数库会以云服务的方式商业化
  其它没有了</description>
    </item>
    
    <item>
      <title>玩转大语言模型的微调训练</title>
      <link>https://tourcoder.com/large-language-model-training-abc/</link>
      <pubDate>Tue, 19 Aug 2025 03:57:16 +0000</pubDate>
      
      <guid>https://tourcoder.com/large-language-model-training-abc/</guid>
      <description>昨天和朋友聊天，他建议我写一些关于模型微调训练的入门教程，嗯，这就写起来。我会分几次分享模型的微调训练过程，旨在给大家展示下我是如何入门的，这当中有错误的地方，欢迎大家指正。
准备工作   电脑：计划在 M4 芯片的 Mac 上完成
  环境：Python，其实也有一些 GUI 辅助工具能够更为直观的完成工作，但我习惯了终端，所以这里直接用 py 脚本来做这些工作
  基模型：Gemma-3-270m，模型可以自由选择。也可以在我之前用来做测试的模型上进行微调，学习这一过程😁
  账户：HuggingFace 账户
  学习的流程框架 我会根据下面的流程框架来更新内容，这也意味这篇文章是不定期更新的，建议收藏这篇文章。
1. 环境搭建
安装 Python 和虚拟环境：建议使用 venv 或 conda 来创建虚拟环境。
安装必要的库：例如 transformers、torch、datasets 等。可以通过 pip install 来安装。
2. 获取预训练模型（基础模型）
登录 Hugging Face：注册并登录 Hugging Face 账户。
下载模型：在 Hugging Face 上搜索 Gemma 模型，使用 transformers 库加载模型。
3. 准备数据
收集数据：根据任务收集合适的数据集，比如文本分类数据。
数据清洗：确保数据格式统一，比如将文本和标签对齐。
4. 定义微调任务
选择任务类型：明确是分类、回归还是其他任务。
配置超参数：比如学习率、批次大小等。
5. 进行微调
编写微调脚本：使用 transformers 提供的 Trainer 接口或者自定义训练循环。</description>
    </item>
    
    <item>
      <title>Gemini 在 Google 不同账户里的情况</title>
      <link>https://tourcoder.com/gemini-in-different-google-accounts/</link>
      <pubDate>Wed, 02 Jul 2025 02:58:07 +0000</pubDate>
      
      <guid>https://tourcoder.com/gemini-in-different-google-accounts/</guid>
      <description>我很早前写过 Google 要做好 AI 先要把它混乱的账号体系给整理下，和那时候比，现在算是不那么乱了。这里分享下这几个账号的情况。
gemini.google.com (Gemini app on iOS/Android) 这是 Gemini 官方的访问地址，因为账户不同基本被分成了三类，看图
 Google Worksapce Business Standard/Plus，2025 年 11 月起，这个版本的除了有 Pro 标志在，在头像的位置有 WORK 字样，表示是 Google Workspace 订阅
 Google Workspace Business Starter/G Suite legacy
 Google Personal Account
具体说明如下：
  Google Workspace Standard/Plus: 都会有 PRO/ULTRA 的标识和头像旁多了 WORK 字样，几乎畅用 Gemini。同时聊天内容有盾牌，获得企业级数据保护，数据不会被用于训练。单人订阅使用。
  Google Workspace Business Starter or G Suite legacy: 无 PRO，有限使用 Gemini。同时聊天内容有盾牌，企业级数据保护，数据不会被 用于训练。单人订阅使用。
  Google Personal Account: 订阅版有 PRO/ULTRA 标识，几乎畅用 Gemini；未订阅的无标识。同时聊天部分无盾牌，没有企业级数据保护，对话可能会人工审核，并被拿去做训练。订阅版可家庭共享，最高 6 个人使用。</description>
    </item>
    
    <item>
      <title>在 iPad 上折腾 Debian</title>
      <link>https://tourcoder.com/install-debian-12-on-ipad-via-utmse/</link>
      <pubDate>Sun, 29 Jun 2025 08:03:38 +0000</pubDate>
      
      <guid>https://tourcoder.com/install-debian-12-on-ipad-via-utmse/</guid>
      <description>以前用 iPad 写码的时候我用两种方式
  通过 ssh 到远程服务器，在服务器上写
  Web IDE
  但这些都要借助网路，我就想有一个本地的 Debian，机缘巧合之下，先是遇到了 iSH，然后就碰到了这次的主角 - UTM se。这里的 se 版本是在 AppStore 上下载的 app，有一定的限制，如果需要更强大的功能，可以通过侧载。具体看官网 。这里记录下我的折腾经过。
第一次我安装错了版本，架构选错了，Debian 的镜像也选错了，正确的是应该选择 arm64 的架构和 arm64 的 Debian 镜像。
官方也提供了自己修改的镜像，桌面版的，具体看这里，但可惜我的 iPad Pro 有点古早，Debian 11 和 12 都尝试了，都跑得不怎么样，太卡了。
最后下载了 Debian-12.11.0-arm64-netinst.iso 网络安装版，并成功安装，此过程也遇到几个问题，
  显示问题，Display output is not active
进入系统安装菜单，可以选择 Install，也可以选择 Graphical Install，如果选择 Graphical Install 可以直接进入安装界面，但安装界面的文字渲染有问题，不显示文字，只能盲装。因为我只需要一个最小安装版的，所以我选择了 Install，这里的坑是大概率会出错，Display output is not active，这里的解决办法是，将光标移动到 Install 这一行，然后按键盘 e 键，在显示的内容里 linux /install.aarch64/vmlinuz .</description>
    </item>
    
    <item>
      <title>WWDC25 的一点杂想</title>
      <link>https://tourcoder.com/some-thoughts-about-wwdc-25/</link>
      <pubDate>Tue, 10 Jun 2025 05:34:58 +0000</pubDate>
      
      <guid>https://tourcoder.com/some-thoughts-about-wwdc-25/</guid>
      <description>几个小时前， WWDC25 开始了，推特上对新的设计风格有着大量的吐槽或夸赞，这里就不讨论了，毕竟设计是一个主观的东西，每个人喜好不一。当然我不喜欢当前设计，感觉太娘了，不够硬朗。
在刷推的时候，有个推友的留言值得聊一聊。该推友说“苹果设计了这么丑的一个东西，还不好好去搞一搞苹果智能”。
其实吧，从种种迹象看来，不是苹果公司不想搞，是真的没能力搞，至少到现在它还没有摸到搞 AI 的路子。
它一开始的方向定位就是错的，它想像之前那样做大一统的集成商服务商，去做整合，选择了不去做最基础的事情，但没想到的是这种方法在 AI 这里行不通。从 Siri 和 Shortcuts 也看得出来它的内部并没有一个人能看到 AI 的未来，看到更多的交互方式，看到其他可能产生价值的方式，依旧坚持押宝 Shortcuts 做工作流，但 AI 本身已经掀翻了这套工作流的交互方式.
另外，一些我还在用的苹果设备状态及理由
  iPhone：基本是离不开的，因为有微信这类的流氓在生活中起着作用，更不要说那个所谓的反诈 app 了。
  iPad：现在用的是最后一款 Intel 芯片的 Pro，会用到它坏的那一天。
  MacBook 系列：我一直想换掉它，买一台笔记本用 Debian，但在试用一圈后，基本没找到能打的。我的侧重点是便携和续航，其次才是性能。而满足这三个条件的笔记本的要比 Mac 贵很多。而且 Mac 非常棒的触控板的体验我都没有考虑进去。
  </description>
    </item>
    
    <item>
      <title>Google, Microsoft, Apple 的存储比较</title>
      <link>https://tourcoder.com/2025-best-cloud-storage-for-photos-and-videos-google-one-microsoft-365-icloud-plus/</link>
      <pubDate>Sun, 08 Jun 2025 03:59:21 +0000</pubDate>
      
      <guid>https://tourcoder.com/2025-best-cloud-storage-for-photos-and-videos-google-one-microsoft-365-icloud-plus/</guid>
      <description>昨天收到 Google Workspace 提示容量快满的邮件才发现 Google Workspace 里相册的无限空间已经没有了。整理下视频照片之余再次研究了下几个主流的存储服务。考虑到照片视频是私密的东西，我的选择只限于三巨头，当然，这也是掩耳盗铃之势，毕竟它们也不值得信任😮‍💨
   服务商 方案及价格 重点 其他     Microsoft 365 家庭版本 $129.99，个人版 $99.99 家庭版可以 6 个用户共享，每个用户都有 1T 的 容量 在京东上可以买到 300 人民币左右的家庭版，亲测是正版   Google One 100G $19.99，2T $99.99，5T $249.99，10T 及后面月付，AI Pro $19.99，AI Ultra $249.99 家庭 6 个人共享总容量，AI 部分也可以共享 其实可以考虑其他价格比较便宜的区，我是因为有需要才用美区；另外现在每个账户每 12 个月只能变更一次家庭组   Google Workspace 100G $180，1T $480，10T $3600 左侧标注测价格是扩展存储空间所需要的费用，每个基本方案价格看下面的链接 并不建议用它来做家庭或个人存储及共享；当然它也有上面用其他区的便宜方式   Apple iCloud+ 50G $0.99，200G $2.99，2T $9.99，6T $29.</description>
    </item>
    
    <item>
      <title>成也 Chrome 败也 Chrome</title>
      <link>https://tourcoder.com/raised-by-chrome-and-ruined-by-chrome/</link>
      <pubDate>Thu, 05 Jun 2025 02:59:31 +0000</pubDate>
      
      <guid>https://tourcoder.com/raised-by-chrome-and-ruined-by-chrome/</guid>
      <description>Chrome 于 Google，类似萧何于韩信，成是他败也是他！
想必大家都发现一个有意思的事情，在桌面端，除了 Chrome，Google 就没有开发几个桌面端的应用，拿得出手的更是寥寥无几。
Google 似乎进入了一个“奇怪”的产品状态，所有的桌面应用它都围绕浏览器来实现，而有些特性是直接放到了 Chrome 里，在其他浏览器里用不了。这个状态也可能是 Google 有意为之，这样对它来说至少有两个好处
 逼着用户去下载并使用 Chrome，Chrome 的市场份额不断增加 自己的产品不用刻意去适配多平台，Web 化的一套吃到底  但这样做也有一定的坏处，正因为产品的桌面端的缺乏，尤其是工具类的产品也是通过 Chrome 来使用，导致了很多这类产品无法扩大化，甚至只能是一个 beta 的状态被使用。比如它最近出的 Firebase studio（之前叫 idx.dev），抑或 Google AI Studio。
另外，Google 的这种做法对整个软件生态也没有实质性的帮助，在一定层面上是限制了用户的选择。所以上次 Google 被要求拆分 Chrome 也不是没有道理。
题外话 Google 以前也出过一个很好用的桌面应用 Picasa，它是相册管理应用，可惜被改成了 Google Photos，但 Google Photos 又没有独立的应用和 Google Drive 在一起的，很难用。
Picasa 的关闭页面 Google 至今还保留着，可能它也在怀念 Picasa 吧。围观地址：https://picasa.google.com/intl/zh-cn/</description>
    </item>
    
    <item>
      <title>如何删除 Cloudflare Pages 拥有大量部署的项目</title>
      <link>https://tourcoder.com/how-to-delete-pages-with-many-deployments-on-cloudflare/</link>
      <pubDate>Sun, 01 Jun 2025 01:29:26 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-delete-pages-with-many-deployments-on-cloudflare/</guid>
      <description>需要删除一个部署在 Cloudflare Pages 上的项目，但总是提示错误，错误信息是
Your project has too many deployments to be deleted, follow this guide to delete them: https://cfl.re/3CXesln。 原因 因为部署太多，导致无法删除，我测试得知，基本超过 100 次部署就会有这个问题。
解决 需要删除过的部署，让数量控制在 100 个之内即可
  方法一：直接手动删除
如果部署的次数比 100 多不多少，就手动删除一些，将部署的内容控制在 100 个之内即可删除项目了。
  方法二：使用 Cloudflare API 删除部署
先要获取一些基本信息：
  Account ID：仪表盘 -&amp;gt; 账户
  Project Name：Pages 里这个项目的名称
  API Token：个人资料 -&amp;gt; API Token，注意给 Pages 的相关权限
  通过终端列出所有的部署
curl -X GET &amp;quot;https://api.cloudflare.com/client/v4/accounts/{account_id}/pages/projects/{project_name}/deployments&amp;quot; \ -H &amp;quot;Authorization: Bearer {api_token}&amp;quot; 对应找到每个部署的 ID，然后删除（最好不要，能到这里就是因为部署量大，要批量删除）</description>
    </item>
    
    <item>
      <title>AI 模型的一点思考</title>
      <link>https://tourcoder.com/thoughts-on-ai-models/</link>
      <pubDate>Sat, 29 Mar 2025 09:24:04 +0000</pubDate>
      
      <guid>https://tourcoder.com/thoughts-on-ai-models/</guid>
      <description>今天看到一份朋友分享的「AI 行业报告」，觉得里面说的话不怎么对，特想分享下自己的一点思考。
先说我的暴论，我觉得 AI 模型的未来应该是“大模型，小参数，低算力，高成效（适应）”这 12 个字。
大模型：它应该是无限趋于人类自然语言，动物语言。
小参数：现在的参数太多了，参数应该是中等甚至是极小的。
低算力：需要的算力应该是低的，一定配置的设备都能运行。
高成效（适应）：高效的推理过程，符合预期的结果。
一点浅显的看法。</description>
    </item>
    
    <item>
      <title>处理 macOS 中的 DS Store 文件</title>
      <link>https://tourcoder.com/dealing-with-dsstore-file-in-macos/</link>
      <pubDate>Mon, 24 Mar 2025 11:16:22 +0000</pubDate>
      
      <guid>https://tourcoder.com/dealing-with-dsstore-file-in-macos/</guid>
      <description>macOS 下 DS Store 文件是一个烦人的东西，关于它的介绍说明，可以看维基百科上的解释。在维基百科的解释上也有几个禁止 DS Store 文件生成的办法，我来多分享几个处理技巧
  在 /usr/sbin 下有一个脚本文件 dot_clean，可用它来做这个事情。比如我要禁止我的工作目录下产生这个文件，即 /usr/sbin/dot_clean -m ~/Workspace 即可，在禁止产生的同时还会自动删除掉已经有的 .DS_Store 文件，但在新 macOS 下似乎没有效果了。
  通过命令定期删除 .DS_Store 文件，执行命令 find /path/to/directory -name &amp;quot;.DS_Store&amp;quot; -type f -delete 即可。这里可以扩展为写成一个脚本，定期删除即可。
  避免使用 Finder 操作文件夹，用命令行或者第三方工具来操作复制粘贴。
  </description>
    </item>
    
    <item>
      <title>基于 Radicale 搭建一个自用的 CalDev 服务</title>
      <link>https://tourcoder.com/how-to-build-a-caldav-server-based-on-radicale/</link>
      <pubDate>Sun, 09 Mar 2025 09:43:33 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-build-a-caldav-server-based-on-radicale/</guid>
      <description>最近日常用的 Google Calendar 的同步总是莫名其妙的出现问题，又不想用 iCloud 的，索性自建一个玩玩。在和 AI 聊了一会后，决定试试 Radicale 这个 Debian 自带的。
安装 Debian 上安装非常简单，直接执行 sudo apt install radicale -y 即可。执行命令 radicale 即运行了这个服务。
配置 配置文件在 /etc/radicale/config，基础配置是
[server] # 监听所有 IP hosts = 0.0.0.0:5232 [auth] # 启用用户名/密码认证 type = htpasswd htpasswd_filename = /etc/radicale/users htpasswd_encryption = bcrypt [rights] type = owner_only 在 auth 这一块，创建用户
sudo apt install apache2-utils # 安装 htpasswd 工具 htpasswd -B -c /etc/radicale/users user1 htpasswd -B /etc/radicale/users user2 这里的参数 -c 表示是创建新文件，如果这个文件存在的话，则不用增加该参数。</description>
    </item>
    
    <item>
      <title>将 Google Cloud Firestore 中的数据导入到 Cloudflare KV 中</title>
      <link>https://tourcoder.com/how-to-make-connection-between-google-cloud-firestore-and-cloudflare-kv/</link>
      <pubDate>Tue, 04 Mar 2025 05:39:08 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-make-connection-between-google-cloud-firestore-and-cloudflare-kv/</guid>
      <description>做了下尝试，将 Google Cloud 上 Firestore 里的数据导入到 Cloudflare 的 KV 里，主要实现思路是
  Firestore 里每个 collection 作为 Cloudflare 里的一个 KV
  collection 里的每个文档作为 kv 里的一条数据，key 对应文档的 ID，value 为文档的值
  废话少说，直接上代码
const { Firestore } = require(&#39;@google-cloud/firestore&#39;); const ProgressBar = require(&#39;progress&#39;); // 配置 Firestore const firestore = new Firestore({ projectId: &#39;GOOGLE_CLOUD_PROJECT_ID&#39;, // 替换为你的 Google Cloud 项目 ID keyFilename: &#39;./service-account.json&#39;, // 指向服务账号密钥文件 databaseId: &#39;DATABASE_ID&#39;, // 如果是 (default) 可不写 }); // 配置 Cloudflare const accountId = &#39;YOUR_CLOUDFLARE_ACCOUNT_ID&#39;; // 替换为您的 Cloudflare 账户 ID const apiToken = &#39;YOUR_API_TOKEN&#39;; // 替换为您的 API Token // 获取或创建 KV 命名空间 async function getOrCreateNamespace(collectionId) { const listUrl = `https://api.</description>
    </item>
    
    <item>
      <title>Good Luck, Skype</title>
      <link>https://tourcoder.com/good-luck-skype/</link>
      <pubDate>Mon, 03 Mar 2025 05:11:31 +0000</pubDate>
      
      <guid>https://tourcoder.com/good-luck-skype/</guid>
      <description>前几天收到微软的发的邮件，它将在 2025 年 5 月份停止 Skype，这事挺让我伤感的。
回想起来，Skype 失去了很多的机会，尤其是微软收购后，并没有设置一个清晰的定位，看微软宁可新做那个残废一样的 Microsoft Teams 即可知道。
感慨万千汇成一句话：“Skype 走好”。</description>
    </item>
    
    <item>
      <title>如何阻止您域名上的电子邮件欺骗</title>
      <link>https://tourcoder.com/how-to-stop-email-spoofing-on-your-domain-name/</link>
      <pubDate>Sun, 23 Feb 2025 05:50:18 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-stop-email-spoofing-on-your-domain-name/</guid>
      <description>最近总是收到一些垃圾邮件，和其他直接发送给我的垃圾邮件不同的是，这些邮件都是回复我域名上的邮箱，但我并没有设置这些邮箱，这是典型的「域名仿造邮件」了。这个问题可以通过设置来解决，下面分享下。
 配置 SPF（Sender Policy Framework）  SPF 用来声明哪些服务器有权使用你的域名发送邮件，换句话说是阻止未授权服务器发邮件，比如我使用的是 Google Workspace，那么这里就设置一个类型为 txt 的记录，其值为
v=spf1 include:_spf.google.com -all 也可以将 all 前面的 - 改成 ~，即
v=spf1 include:_spf.google.com ~all - 是表示「硬失败，强制拒绝伪造邮件」
~ 是表示「软失败，标记但不拒绝」
 配置 DKIM（DomainKeys Identified Mail）  DKIM 用来给邮件添加数字签名，收件方可验证邮件内容是否被篡改，也是添加一个 txt 的记录，这个记录的值的格式是 v=DKIM1; k=rsa; p=公钥
 配置 DMARC（Domain-based Message Authentication, Reporting &amp;amp; Conformance）  DMARC 用来规定收件服务器如何处理未通过 SPF 和 DKIM 验证的邮件，并可接收报告，是可选项。其方法也是增加一条 txt 记录，名称为 _dmarc，值的格式是 v=DMARC1; p=reject; rua=mailto:email@example.com; ruf=mailto:email@example.com; fo=1
p=reject：直接拒绝未通过验证的邮件。
p=quarantine：把可疑邮件丢进垃圾箱，也可设置为 none。
rua：聚合报告 (Aggregate Report) 接收地址，包含每天的统计数据（如通过/未通过 SPF 和 DKIM 的数量等）。</description>
    </item>
    
    <item>
      <title>流水账：联通，京东，阿迪达斯一点小事</title>
      <link>https://tourcoder.com/two-battles/</link>
      <pubDate>Sat, 08 Feb 2025 14:41:30 +0000</pubDate>
      
      <guid>https://tourcoder.com/two-battles/</guid>
      <description>和联通，京东，阿迪达斯发生了一些事情，今天都圆满解决了。分享下整个过程&amp;hellip;
联通 在 2024 年 11 月 1 日当天两个小时的时间我的手机被消耗了 70 多个 G，其中有 20 分钟不到的时间跑了 30 多个 G，而那个时间段里我还在和小伙伴打电话。
找客服，请他们帮忙帮我查一下是什么原因，得到回复说一切正常。我说能不能说具体点，哪里消耗的，得到回复是会有其他工作人员联系我。
过了几天，接到电话说我的流量正常的，说就是我用的。我不认同，开始投诉。
基本无效，而且回电话的客服态度傲慢，一说就是我用的，另外就是说我赔我点流量券，差不多就得了的意思。
随即投诉到 12345，但依旧是这个客服回复我，态度依旧很拽，多给我一点流量券，爱要不要，就这样来来回回两次。
我没法子只能通过 12345 投诉到上海通信管理局。但未想联通连通信管理局都欺骗，并没有给我打电话，却说给我打电话了；给我打电话的时候说的是其他事，但回复通信管理局说和我协商不下来（还好我有电话录音）。
三个多月，我在最后一次和 12345 通话后，并拆穿联通撒谎，我这边有电话录音等后，第二天接到联通的电话，说对我进行费用补偿等处理。我觉得也没必要继续搞下去了，随接受。
其实这个事情我的诉求是：我只想请联通那边帮我看一下这么短的时间，这么大的流量是怎么消耗掉的。不知道原因，感觉是个定时炸弹，时不时来一下，让人受不了的。我未提任何补偿等诉求😮‍💨 严格说是那个傲娇的客服让我恼怒，非要抓着这件事情打了。
京东和阿迪达斯 在京东的阿迪达斯官方店买了双鞋，到发现问题时，我已经签收 62 天，实际穿着 15 天不到。鞋子的问题是跟腱处鞋帮都磨出洞了，里面的海绵之类的都跑飞了。我找京东客服说明情况，想请她们帮忙协调下，联系下厂商帮我修理下，我出钱修理都可以。
京东协商后告知厂商认为这是个是正常磨损，不给予修理。但京东考虑到我是什么客户，愿意给我 90 元补偿，让我自己找个地方修理下。我说我没有办法，请京东客服再次和厂商协商下。
再次得到回复是正常自然磨损，但京东愿意给 100 元补偿。我说那这个些质量也太差了吧，鞋底鞋面都和新的一样，怎么就这个地方都破了两个洞呢？正值要过年，我就和客服说，先关闭工单吧，我年后找个地方验一下鞋子真假等。
年后，我提交新工单，告知京东客服几件事
  这鞋质量很差，其他地方都完好如新，就这个地方坏了，这算不算正常磨损。
  这鞋页面，有大量刷单的评论，照片重复率非常高。
  这鞋页面也有很多人反应这个鞋的质量问题。
  过了一个小时吧，客服给我电话说等厂商上班，他们会和厂商协调下，同时他们也愿意给出 200 元的补偿，并告知我最迟什么时候联系我。再然后，客服联系我，直接给我 200 元价值的京豆。要知道刚开始他们给的 90 或 100 补偿都是要我提供修鞋的发票，然后根据发票最高给 90 或 100。
这事我明白了另外一件事，以后京东买鞋还是看评论吧，尤其是差评。</description>
    </item>
    
    <item>
      <title>一点笔记应用的想法</title>
      <link>https://tourcoder.com/thoughts-on-note-taking-app/</link>
      <pubDate>Mon, 27 Jan 2025 03:15:07 +0000</pubDate>
      
      <guid>https://tourcoder.com/thoughts-on-note-taking-app/</guid>
      <description>一直以来我对三类软件比较感兴趣，Twitter 类，Email 类和笔记类。曾在推特上对它们做过一个概括
  Twitter 类：信息无阻碍的分享，扩散，流转是件很酷的事情，信息流很美。
  Email 类：我从九几年刚接触互联网时就痴迷它，我太喜欢这个沟通方式了。我研究了几乎所有的曾出现过的这类服务，看别人用自有邮箱，我都会习惯性研究下。另外，IM 在我看来是对 Email 的扩展。
  笔记类：从记录到整理，再到展现，似乎和人生这张白纸相互辉映。
  现在做一个 Twitter 或 Email 类的服务，成本太高，折腾的事多，规则被巨佬公司搞的死死的，而笔记应用市面上也很多，我自己也折腾了两三个版本，但我还是想换个方式再做一个笔记应用。下面是我的一些想法：
  单文件模式：不再使用数据库模式，单一的单文件模式，一篇笔记就是一个文档，搭配插件让文件本身强大
  第三方同步：借助第三方同步，自由度高
  加密模式：既然借助第三方了，势必应该有保护，不盲目相信第三方
  其实说到这里，不得不提一下 2024 年我做的一款笔记应用，Untitled，虽然是一个满足我自己需求的一个个人作品，但它值得继续做下去。
关联性
Untitled - An encrypted version of the text/plain editor for secure text handling. 官网</description>
    </item>
    
    <item>
      <title>如何选择一张 eSIM 卡</title>
      <link>https://tourcoder.com/how-to-choose-a-esim/</link>
      <pubDate>Mon, 06 Jan 2025 13:26:34 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-choose-a-esim/</guid>
      <description>这个标题写得有点大，我只是分享一些我过去在境外使用 eSIM 的情况。
电话 eSIM 在境外找我的电话极少，基本只用了 UltraMobile 的 eSIM，它每个月有 100 分钟的通话足够。
而在国内的电话卡到了境外，就放在备用手机里了，直接收短信使用。
流量 eSIM 试过很多 eSIM 的流量卡，就两个感受，「并不便宜」和 「CMLink 线路特别多」，感觉好多 eSIM 是 CMLink 的分销商一样。CMLink 有个让人难受的地方在于大概率的流量 IP 是香港，而不是所在地。
现在我主要用的是 eskimo 和 Airalo，理由是网络稳定点和大概率能得到目的地的 IP。</description>
    </item>
    
    <item>
      <title>打卡</title>
      <link>https://tourcoder.com/google-maps/</link>
      <pubDate>Wed, 01 Jan 2025 01:58:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/google-maps/</guid>
      <description>创建在 Google Maps 上的一些照片，比较随意的拍，想起来了就会拍。
https://www.google.com/maps/contrib/117193751458574440946/photos/</description>
    </item>
    
    <item>
      <title>2024 年，我的 GitHub 再次全绿</title>
      <link>https://tourcoder.com/hit-all-green-on-github-again-2024/</link>
      <pubDate>Tue, 31 Dec 2024 05:55:27 +0000</pubDate>
      
      <guid>https://tourcoder.com/hit-all-green-on-github-again-2024/</guid>
      <description>今天是 2024 年的最后一天，提交完代码后，我的 GitHub 再次全绿，上次全年全绿还是 10 几年前，不知道这次的全绿会给 2025 年带来什么样的化学反应。
分享一些相关的数据吧，以下数据是一个大致的统计，没有特别精确，但也大差不离。
编写设备
60% 左右的代码是在最后一代 Intel 芯片的 MacBook Pro 上写的，25% 左右是在 Debian/Linux 上写的，15% 左右是在最后一代 Intel 芯片的 iPad Pro 上写的。
编写内容
大部分代码是和 AI 相关的，也有一些工具类的应用和脚本。其中大部分是公司的产品，也有一部分是我“打金币”的代码，以及我用来自用的代码。
编写地方
这个话题就很有趣了，因为远程工作为主，更多的像个独立开发者。我的工作场地很多，主要是分布在各个咖啡馆（星巴克居多），办公室，家里以及医院（因为我父亲生病，我在医院照料），对了，还有车上。
AI 帮忙
AI 帮了很大的忙，这些代码中有超过 20% 是由 AI 生成的，我只负责说明需求。但有点遗憾的是，在一些代码上并没有节省时间，反而花的更多。我对 AI 当前评估是状态好的时候能完成 80% 的代码，有 20 % 完成不了。
题外话
2025 年我想买台合适的电脑，虽然到最后我可能还是买一台 MacBook Pro。2024 年尝试过很多台电脑，最让我难受的是触控板。因为不用鼠标，我对触控板要求有点高。
以后估计很难会在 GitHub 上全勤全绿了，主要是要从 GitHub 切换到私有搭建的。
就这样&amp;hellip; 放出 GitHub 上的截图吧
 已经达成的版本
 强迫症版本 :)
 更强迫的版本 :)</description>
    </item>
    
    <item>
      <title>Google Cloud VM 中的 OS login</title>
      <link>https://tourcoder.com/os-login-in-google-cloud-vm/</link>
      <pubDate>Tue, 24 Dec 2024 06:29:07 +0000</pubDate>
      
      <guid>https://tourcoder.com/os-login-in-google-cloud-vm/</guid>
      <description>在 Google Cloud VM 有个不能算是问题的烦人事情 &amp;ndash; OS Login，它会自动的更新用户目录下 .ssh/authorized_keys 文件，即便这个文件是用户自己创建的。要解决这个问题有几个办法。
  禁止 OS login（不建议）
编辑 vm 的元信息，即点击 vm 的名字进入到详情页面，点击顶部的编辑后，找到元信息项，然后增加一组键值，键为 enable-oslogin，值为 false。如果已经存在 enable-oslogin 则将它的值改成 false 即可。记得重启 vm。
不建议的原因是，因为它更安全，通过 Google Cloud IAM 控制 SSH 密钥的访问权限，更适合多用户和多实例的场景，还可以避免因手动错误导致的密钥丢失或覆盖。
  配置 Google Cloud 的 SSH 密钥
进入到 Google Cloud Compute Engine 的元数据项，在 ssh 密钥标签下增加一个项，将从 id_rsa.pub 获取到的内容填写在这里即可。当然如果本地配置了 Google Cloud 的 SDK，也可以通过命令执行
gcloud compute os-login ssh-keys add \ --key-file=id_rsa.pub \ --project=PROJECT_ID   其实 OS Login 在众多云服务商处还是蛮广泛使用的，处理方法大差不离。</description>
    </item>
    
    <item>
      <title>越来越脏的上海</title>
      <link>https://tourcoder.com/is-shanghai-getting-dirtier/</link>
      <pubDate>Tue, 03 Dec 2024 04:46:10 +0000</pubDate>
      
      <guid>https://tourcoder.com/is-shanghai-getting-dirtier/</guid>
      <description>因为父亲生病住院，我的日常活动范围大了些，走路的机会也多了很多。有个深切的感受，这几年的上海越来越脏的。这里的脏就是字面上的意思，上海的环境卫生变得特别差。
这些脏体现在随处可见的香烟头和脓痰，随处可见的狗屎，甚至是人便，还有尿骚味。走在路上，你随时能听到那吐痰声，在室内公共场合，你随时能闻到那令人作呕的烟味，等等。
我在上海生活了 20 年，以前它真没有这么脏过。</description>
    </item>
    
    <item>
      <title>基于 Backblaze 和 Cloudflare 搭建私有的图床</title>
      <link>https://tourcoder.com/set-up-private-photo-library-using-backblaze-cloudflare-integration/</link>
      <pubDate>Sat, 12 Oct 2024 04:49:43 +0000</pubDate>
      
      <guid>https://tourcoder.com/set-up-private-photo-library-using-backblaze-cloudflare-integration/</guid>
      <description>最早的时候，「代码旅行」这个博客的图片和 markdown 文件一样都是存放在这个库的，很不方便，后来将它移动到了 Backblaze，并使用 Cloudflare 打破了它的流量限制，分享下大致的配置。
Backblaze 端 在 Backblaze 新建一个 bucket，然后找到这个 bucket 所在的区域即可。最简单的方式，上传一张图片到这个 bucket，看这个图片的返回地址。比如我的一张图片返回地址是 https://f004.backblazeb2.com/file/tourcoder/tcblog/a-note-app-01.png，那么前面的 f004.backblazeb2.com 可以理解为是 bucket 的所在区域。
因为这里的图片是对外公开的，在 Bucket Settings 里设置 bucket 属性为「公开」。图片一般不会更改所以，设置个缓存还是有必要的，Bucket info 里填写 {&amp;quot;cache-control&amp;quot;:&amp;quot;max-age=720000&amp;quot;}，时间可以按需填写。
Cloudflare 端   解析域名到刚才获取到的地址，建议用二级域名，比如我用的是 storage.tourcoder.com，给它做一个 cname 的解析到 f004.backblazeb2.com
  在规则-&amp;gt;重写 URL 中增加一个规则：
选择「自定义筛选表达式」，然后设置「主机名」「等于」「域名」我用的是 storage.tourcoder.com；下面「重写到」「动态」concat(&amp;quot;/file/tourcoder&amp;quot;, http.request.uri.path)，这里的 tourcoder 是 bucket 的名字。
  检查 SSL/TLS 中是否已经配置了严格，就是双加密（必须）
  缓存（可选）：既然是图库一般图片上传后都很少更新，还是有必要增加缓存的。在「规则-&amp;gt;页面规则」里增加一个规则即可。URL 设置为 https://storage.tourcoder.com/*，时间按需设置。
  基本完成了。最后表扬下 Backblaze，还是蛮稳的，我的博客它存储图片用了这么久，没有出现过问题。</description>
    </item>
    
    <item>
      <title>定期自动备份 GitHub 上的代码到你私人 vps</title>
      <link>https://tourcoder.com/automatically-sync-your-code-on-github-to-your-vps-on-a-regular-basis/</link>
      <pubDate>Wed, 09 Oct 2024 07:47:07 +0000</pubDate>
      
      <guid>https://tourcoder.com/automatically-sync-your-code-on-github-to-your-vps-on-a-regular-basis/</guid>
      <description>之前在推上说过担心 GitHub 上代码丢失，写了个脚本定期自动将自己的代码从 GitHub 上同步到自己的 vps，这里记录分享下。原则上说，这个方法也适用了其它的 git 服务。
实现的思路 简单和直接是我的追求，所以我抛除了做系统写配置的方式。直用一个脚本+定时器(cron) 来解决问题。
整个目录结构有三层
第一层是 github_backup，表示来自 GitHub 的
第二层是 github 上的 orgname/username
第三层是 orgname/username 名下的 repo
这里有点麻烦的是，需要手动操作现将每个 repo 从 GitHub 上拉到本地的 vps。然后让脚本遍历这些 repo，自动 git pull 更新。
脚本 这是 python 的脚本
import os import subprocess from pathlib import Path # github_backup 文件夹的路径，自定义 GITHUB_BACKUP_PATH = &#39;/github_backup&#39; def run_command(command, cwd=None): result = subprocess.run(command, cwd=cwd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) if result.returncode != 0: print(f&amp;quot;Error: {result.stderr.strip()}&amp;quot;) else: print(result.</description>
    </item>
    
    <item>
      <title>解决通过 fnm 安装的 nodejs 在终端中无法使用和切换的问题</title>
      <link>https://tourcoder.com/fixed-error-cannot-find-the-necessary-environment-variables-to-replace-the-node-version-on-terminal-via-fnm/</link>
      <pubDate>Mon, 07 Oct 2024 05:59:01 +0000</pubDate>
      
      <guid>https://tourcoder.com/fixed-error-cannot-find-the-necessary-environment-variables-to-replace-the-node-version-on-terminal-via-fnm/</guid>
      <description>发现在 macOS 15 上通过 fnm 安装的 nodejs 在终端重启后总是无法被使用和切换，执行命令 node -v 会得到提示「找不到 node 命令」。
研究后发现，安装路径问题导致了 shell 配置文件中对应的代码执行失败。我用的是 zsh，所以配置文件是 ~/.zshrc，以下同样。
安装完 fnm 后会在 shell 配置文件中自动添加
# fnm FNM_PATH=&amp;quot;/Users/your_account_name/Library/Application Support/fnm&amp;quot; if [ -d &amp;quot;$FNM_PATH&amp;quot; ]; then export PATH=&amp;quot;/Users/your_account_name/Library/Application Support/fnm:$PATH&amp;quot; eval &amp;quot;`fnm env`&amp;quot; fi 从上面的代码可以看出，fnm 的安装目录是 /Users/your_account_name/Library/Application Support/fnm，但 fnm 的实际安装目录是 /Users/your_account_name/.local/share/fnm，该目录可以通过 fnm env 命令获取到。
所以，修改上面的安装目录即可解决问题
# fnm FNM_PATH=&amp;quot;$HOME/.local/share/fnm&amp;quot; if [ -d &amp;quot;$FNM_PATH&amp;quot; ]; then export PATH=&amp;quot;$FNM_PATH/bin:$PATH&amp;quot; eval &amp;quot;$(fnm env)&amp;quot; else echo &amp;quot;FNM_PATH does not exist&amp;quot; fi 上面代码中的 else 部分可以直接去掉。还有一个解决办法是直接将 fnm env 命令获取到的内容，一股脑贴在 shell 配置文件里也行。</description>
    </item>
    
    <item>
      <title>四个窗口，我的敏捷开发</title>
      <link>https://tourcoder.com/four-terminal-windows-my-agile-development/</link>
      <pubDate>Sun, 06 Oct 2024 06:34:16 +0000</pubDate>
      
      <guid>https://tourcoder.com/four-terminal-windows-my-agile-development/</guid>
      <description>最近写了一点 iOS/macOS app，虽然偏前端，但更多的时间在写服务器端的接口和服务。这里介绍写我敏捷开发的模式。
技术栈   语言：Nodejs(Javascript)，Go
  数据库：Firebase，MongoDB
  工具：iTerm2，Sublime Text（主要是批处理使用）
  操作方式 在开发的时候，我主要用 iTerm2，平铺 4 个窗口，这也是我很喜欢 iTerm2 的原因之一。
  左侧区：上面是 document，打开需求文档，实时整理自己的思路；下面是 vi/vim，为编码区
  右侧区：上面是拉起服务和查看日志，比如 pm2(log)；下面是 command 区，比如执行 curl/git 等命令
  左右两侧在实际使用中拖拽调整宽度，上下也一样方式调整高度。
 后续想法 最近有个新想法，在 document 中集成 AI，因为现在 AI 这部分还是 iTerm2 和浏览器之间切换的。
2025 年 06 月 26 日：Gemini CLI 几个小时前更新，加上之前的 Claude Code 等，现在我的编码窗口已经变成了
 </description>
    </item>
    
    <item>
      <title>两个蠢货</title>
      <link>https://tourcoder.com/bye-macos-bye-firefox/</link>
      <pubDate>Sun, 22 Sep 2024 12:56:23 +0000</pubDate>
      
      <guid>https://tourcoder.com/bye-macos-bye-firefox/</guid>
      <description>也可能是心情不佳的因素，被 macos 和 firefox 折腾得够呛，让自己有点恼怒。
Firefox 有个傻逼的安全策略『修改密码会让账户的数据全部丢失』，即便你有二次认证和数据恢复码。真不知道是什么样的傻逼想的策略。修改密码几乎变成了一个新账户的话，我为什么要修改密码呢？我不会新建一个账户吗？其实这事情在今年二月份发生过一次，当时我只是发了个推吐槽，这次再次发生，我实在受不了这傻逼了。主要是我有二次验证码，我有数据恢复码，甚至我的密码也非常简单，两个字母+六个数字+一个符号，但就是提示错误，让我不得不修改密码，结果就是数据都没有了。
算起来用 Firefox 快 20 年了，一直用它的原因是因为喜欢，当年它上面的 Firebug 可是利器。现在这个玩意越做越是一坨大便。
同样变得一坨大便的还有 macOS。我怎么都不会想到这系统会变得如此糟糕过。升级到了 macOS 15，出现各种问题，甚至锁屏待机等都会莫名其妙的自动重启。尝试降级：time machine 提示要用迁移助手；重启后发现再也无法进入修复模式，只剩下一个网络安装恢复；通过网络安装恢复，不管是无线还是有线情况下，进度条跑完后必定提示错误；如此循环。
对，我真的非常讨厌苹果公司的一个傻逼顶天的安全策略，把用户本机的锁屏密码同步到它的服务器作为一个安全验证的手段。与其说这个设计是一个外行蠢货做的，不如说这家公司真的是一个什么都想偷的贼。
抱怨完了，最后想说的是 Firefox 已经删除；Mac 以后只有做它上面的东西的时候再使用。</description>
    </item>
    
    <item>
      <title>解决 macOS 无法连接星巴克等公共网络的问题</title>
      <link>https://tourcoder.com/how-to-fix-public-wifi-connection-issue-on-macos-15/</link>
      <pubDate>Sat, 21 Sep 2024 02:13:36 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-fix-public-wifi-connection-issue-on-macos-15/</guid>
      <description>最近升级到 macOS 15 sequoia 这个系统，在连接公共网络的时候总是连接不上。
问题描述 星巴克无法弹出认证窗口
MStand 在认证 192.168.100.2 处出错
手机热点连接 10 分钟左右就会自动掉线
解决办法   关闭代理软件（代理设置），基本能解决类似 MStand 的问题
  访问 captive.apple.com 能解决类似星巴克无法弹出认证界面的问题
  在终端中进入到 ~/Library/LaunchAgents，然后新建一个文件，比如 apple.captivenetworkassistant.plist，内容如下
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt; &amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple Computer//DTD PLIST 1.0//EN&amp;quot; \ &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;gt; &amp;lt;plist version=&amp;quot;1.0&amp;quot;&amp;gt; &amp;lt;dict&amp;gt; &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt; &amp;lt;string&amp;gt;apple.captivenetworkassistant&amp;lt;/string&amp;gt; &amp;lt;key&amp;gt;LowPriorityIO&amp;lt;/key&amp;gt; &amp;lt;true/&amp;gt; &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt; &amp;lt;array&amp;gt; &amp;lt;string&amp;gt;open&amp;lt;/string&amp;gt; &amp;lt;string&amp;gt;/System/Library/CoreServices/Captive Network Assistant.app&amp;lt;/string&amp;gt; &amp;lt;/array&amp;gt; &amp;lt;key&amp;gt;WatchPaths&amp;lt;/key&amp;gt; &amp;lt;array&amp;gt; &amp;lt;string&amp;gt;/Library/Preferences/SystemConfiguration&amp;lt;/string&amp;gt; &amp;lt;/array&amp;gt; &amp;lt;key&amp;gt;RunAtLoad&amp;lt;/key&amp;gt; &amp;lt;true/&amp;gt; &amp;lt;/dict&amp;gt; &amp;lt;/plist&amp;gt; 然后加载并执行这个文件
launchctl load apple.captivenetworkassistant.plist launchctl start apple.</description>
    </item>
    
    <item>
      <title>&#39;有毒&#39;的苹果，必定衰败</title>
      <link>https://tourcoder.com/the-fall-of-apple/</link>
      <pubDate>Thu, 19 Sep 2024 07:34:45 +0000</pubDate>
      
      <guid>https://tourcoder.com/the-fall-of-apple/</guid>
      <description>这是我近期写的第二篇关于苹果的文章，也只是代表我个人的观点，考虑到我买即跌卖即涨的反向体质，说不定过些日子苹果公司更强了呢。
  苹果不再是一家软件公司：如果我没有记错的话，乔布斯有句经典的话，Apple 是做软件的，硬件只是&amp;quot;包装&amp;quot;软件的漂亮盒子。但现在的苹果公司似乎早忘了这句话，它现在疯狂的小踏步的更新硬件，尝试在硬件上争取最大的利润，江湖笑称&amp;quot;刀法精准&amp;quot;。而软件方面一塌糊涂，肉眼可见的错误一大堆，脑残一样的架构设计，毫无逻辑的新功能新特性。
  苹果的营销重于产品：以前怎么营销都不会影响到产品，甚至是因为产品好而带动大家自发的营销；现在是各路 kol 尬吹还不够，还请一些所谓的明星推销着让人犯难的过时产品。
  苹果不负责严重缺乏工作技能的人员越来越多：以前的各类支持人员多少能提供点帮助，现在能提供帮助的少之又少，知识储备连我一个路人都不如。我一共发过两次 DST，一次是长时间得不到解答后，我发邮件询问 tim cook 才得到解答，高级技术人员回复也不知道怎么解决，他还说他问了同事，也不知道怎么解答。一次是一个它们设计出来的东西的问题，居然也是不知道。
  苹果不再走用户路线：用预先拍摄好的视频 keynote 替代传统的真实 keynote，用虚假的 kol， 明星引导替代传统的和用户真切的互动。一切是为了市场预期，只是面向资本走向。
  这些在我看来，构成了苹果的&amp;rsquo;毒&#39;，而一旦有毒，必定被抛弃。</description>
    </item>
    
    <item>
      <title>编码方式的改变</title>
      <link>https://tourcoder.com/changing-in-coding/</link>
      <pubDate>Sun, 15 Sep 2024 01:26:14 +0000</pubDate>
      
      <guid>https://tourcoder.com/changing-in-coding/</guid>
      <description>做程序员也快 20 个年头，这两年我的编码方式发生了翻天覆地的变化，尤其是今年。
早些年，我主要用 PHP 写东西，并没有使用特别的工具，加上那时候我喜欢 Linux[1]，所以 vim 成了我最喜欢的 “IDE”。我一直很喜欢命令行终端这些均源于那时候。编码方式很简单：Ubuntu/Debian/Mac[2] + php 手册 + 大脑记忆 + vim，打开 vim 就是一顿输出。那时候很容易进入心流的状态，很舒服。
后来被逼换了份工作，开始用 C# 写东西，系统也换成了 Windows。其实我很讨厌微软的东西，但那时候上海职场对 dotNet 有股莫名其妙的追求，是个公司都要 dotNet。在新单位边学边做搞了两年。这时候主力 IDE 变成了 Visual Studio 这个我不喜欢的庞然大物[3]。尽管不喜欢，但它的确改变了我的一些编码方式，比如我不再背那些 API 和切换手册查询了，因为它有提示，我只要记住用什么就好。当然为了不想总打开它，我也折腾过其它的 IDE，比如 sublime text，notepad++，textpad 等。编码方式主要是 Windows + Vistual Studio（及手册） + 大脑记忆。
再后来，Apple 推出了 iPhone 和 App Store，我开启了 app 开发的生涯。编码方式也换成：macOS/ Debian(服务器端) + xcode + sublime text + terminal(vi) + Google/Stackoverflow，也不再主动记住很多 API，更多的是遇到问题用 Google/Stackoverflow 来解决。
这两年，编码方式变成：打开笔记应用，整理下产品功能思路，设计一套尽可能完善的 prompt，然后贴给 AI，调试 AI 给出的代码，并让 AI 解决 bug。不断调整，不断完善。</description>
    </item>
    
    <item>
      <title>为什么我喜欢苹果</title>
      <link>https://tourcoder.com/why-did-i-like-apple/</link>
      <pubDate>Tue, 10 Sep 2024 03:58:15 +0000</pubDate>
      
      <guid>https://tourcoder.com/why-did-i-like-apple/</guid>
      <description>作为一个用户，我很喜欢苹果公司的产品，因为
  它定位自己是一个软件公司，漂亮的盒子只是包装只是附属，重点是把软件卖出去
  它总是把复杂的事情简单化，不管是设计还是用户操作体验，都是简单中体现出美感和强大
  它总是很好地做好产品发布前的保密工作，然后拿出一款让人惊讶的产品
  它总有很出色的点子，并落实融合到产品里，即便很多时候这些点子并不是它的。但它会在这些点子里加入自己的理解和发掘，并在产品体现
  它不会让对手在其领域领先一年甚至几年推出好玩的东西，然后自己照着抄，还没有自己的理解发掘
  它不会在发布会上基本全程靠嘴输出，也基本不会让等过段时间再用这个产品，毕竟卖期货不应该是一家软件公司该干的事
  它不会在发布会上大段时间播放高管们提前录好的视频，找一群观众在那边嗨
  但上面所有的一切都和现在的苹果公司无关，而且我也并不喜欢现在的苹果公司。</description>
    </item>
    
    <item>
      <title>第一次在闲鱼买东西，翻车了</title>
      <link>https://tourcoder.com/battle-with-second-hand-seller-on-tao-bao-2/</link>
      <pubDate>Sun, 18 Aug 2024 04:20:33 +0000</pubDate>
      
      <guid>https://tourcoder.com/battle-with-second-hand-seller-on-tao-bao-2/</guid>
      <description>有点标题党了，其实我之前有在闲鱼买过东西，是请人代下单买过几次 mstand 的咖啡。这次“翻车”是我第一次从个人手里买实体物品。写篇博文，记录下事情整个经过及分享一点学到的经验。
起因 前些天我和一个朋友吐槽我之前买的 anker 的电容笔笔头都是歪的，后来退货重新买发现居然涨价了（相隔 2 天）。朋友告诉我可以去闲鱼加点钱淘个 Apple Pencil。在后来一次继续请人代下单 mstand 的时想起他的话，顺手刷了下，看中一个上海的卖家，说是朋友送的，有购买发票等信息。聊了下，卖家还给我发了一段产品的视频，我觉得 ok 就下单了。这个过程有个插曲，我在和卖家聊的过程中，物品被拍了，卖家又给我重新创建了个链接让我下单。
过程 卖家一直不发货，我觉得不太正常，因为毕竟大家都是在上海，没这么麻烦的应该。我就找卖家，我的意思是你有没有这个东西，如果没有的话，我就申请退款，没必要拖着耗时间。过了一段时间后，卖家说有啊，肯定发货。随后没过一会就有物流的单号了（这是我后来对比聊天记录看到的）。
又等了一段时间，物流还是只有一个单号，上面显示是待取货，而且显示是从广州发货。这时候我更觉得不对劲，联系卖家，没有得到回复。等晚上 11 点多，还是没有物流信息，我便申请了退款。
比较有意思的是，我刚申请完，想留言让卖家通过申请，却发现卖家已经发来几段骂人的话，很脏，有点狗急跳墙的意思，更离谱的是它还把我拉黑了。
没法，只能申请客服介入。等了一天不到，客服要求两方举证，我提交了证据，卖家提交了一个待上门取货的单号的查询界面的截图。又过了一天，客服认为卖家证据不足，给了卖家一天时间，让其补交证据，但卖家没有补交。
晚上，我又收集了一些证据补充给客服，比如卖家已经把我之前拍的产品链接删除了，卖家又发布了两个内容话术和之前一模一样的帖子在卖同样的东西等。我另外又问了下客服，卖家这个真不是诈骗吗？
结果 一早客服已经完成纠纷的处理，并短信告知我结果，结果是支持仅退款。问题是我到现在也没有收到那支笔，如果后续收到，我还是会尝试联系卖家，把笔给快递回去。当然，我也会全程拍视频，至于为什么？看下面的内容。
经验和感慨   即便是现在这样卖家明目张胆的骗了，闲鱼也没有对这类卖家作出任何的处罚，这也可能助长了卖家的气焰吧。
  我之前也在闲鱼上卖过东西，比如 HotToys 的钢铁侠手办，雕像，树莓派，iPad，Mac mini，Apple Keyboard 等等，因为我只出本地，很多时候我都是开车给人送过去当面交易的，大家都很好说话，也没见过这样素质极差的。有什么话不能好好说，协商解决呢？你发不了货，我申请退款，你同意不就行了。为什么要狗急跳墙恶语相向呢？另外就是真就是真，假就是假，为什么要钻各种别人没有防备的空子赚钱呢？不懂！
  另外一个经验分享是，有个朋友告诉我如果对方真把东西快递过来了，一定要全程拍视频，当着快递员的面拆东西验收真假。
  这里面的窍门是：有些卖家会发假东西，如果没有全程拍视频验证真假，卖家会扯皮说是快递员或者买家调包了东西。因为没有拍视频，无法举证，往往在闲鱼就会被判输，很多骗子会利用这个漏洞。
为此我还特别跑到快递站告诉他们如果有我的快递，一定不要送，我自己来取。我在和快递员说起这个事情的时候，快递站的老板告诉我他前几天刚赔了 3000。我们小区一个阿姨买了个玉手镯，最后收到货时发现是假的。就是没有全程拍视频，卖家说要么是快递调包要么是阿姨调包，最后是快递站赔了 3000。</description>
    </item>
    
    <item>
      <title>如何将沃达丰 eSIM 从一台设备转移到另外一台</title>
      <link>https://tourcoder.com/how-to-transfer-vodafone-esim-from-one-device-to-another/</link>
      <pubDate>Sat, 10 Aug 2024 06:56:07 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-transfer-vodafone-esim-from-one-device-to-another/</guid>
      <description>刚把沃达丰的 eSIM 从 Pixel 4a 5G 的手机转移到 iPhone，无痛快捷的过程如下。
准备工作
  已经安装了 eSIM 的旧手机和新手机。因为要先删除旧手机里的 eSIM。
  先登录 vodafone.co.uk 的账户，确认个人资料里 email 地址是否正确，这很重要，因为新的 eSIM 二维码将发到这个邮箱。
  转移过程
在个人中心页面，选择 &amp;lsquo;Settings&amp;rsquo;
 选择上图中的 Plan settings 中的 Manage
 选择上图中的 Transfer my eSIM
 勾选上图，然后下一步
 备份数据
 在已经安装了 eSIM 的手机上删除已经安装的 eSIM
 处理完成后，将会如上图一样，沃达丰会发送一个新的二维码到登记的电子邮箱。
最后用新手机扫描二维码安装 eSIM 即可。</description>
    </item>
    
    <item>
      <title>RSS 过时了吗</title>
      <link>https://tourcoder.com/is-rss-obsolete/</link>
      <pubDate>Tue, 06 Aug 2024 13:20:50 +0000</pubDate>
      
      <guid>https://tourcoder.com/is-rss-obsolete/</guid>
      <description>前几天刷推，看到一个关于 RSS 是否过时的争论，直接说我的观点吧。
RSS 没有过时，只是它不再适合大部分人。
为什么说它没有过时？ RSS 技术和形式有个很重要的点，去中心化且自控度很高。
它可以让任何信息得到广泛的传播，几乎无障碍且也兼具实时性，不会因为一些不应该出现的抗力而失去信息，甚至是信息源。
它不管对信息生产者还是信息阅读者都是健康可靠的，每个人都可以自主的订阅自己想要看的，而不再被算法所左右。
RSS 也应该是未来的信息流转转播方式。
为什么说它不再适合大部分人！ 现在大多数人变“懒”和不喜欢“折腾”了，他们不再搭建个人博客，甚至不再写博客。他们不在通过可控的方式产生内容。
现在大多数人依赖于平台，他们习惯了一切以平台为主，习惯了那些便捷，习惯了平台通过算法喂给自己的推荐。他们更不会对自己想获取的信息进行更为有效的过滤筛选。
现在大多数人习惯了突发灵感式的发几句话，习惯了少而短，心境上也几乎沉淀不下来。
大公司取消 RSS 这个是先见之明？ 比如 Google 在很多年前就去掉了 Google Reader。它们的做法绝对不是先见之明！它们的做法完全是从市场，算法推荐等考虑，但这些考虑并不能说明 RSS 是不行的。
总结 其实用不用 RSS，没有好坏过时一说，只是每个人对信息获取的喜好方式不一样。我现在也还在通过 RSS 和 twitter 自建 list 来获取信息。</description>
    </item>
    
    <item>
      <title>自己手动将 Ultra Mobile 的 eSIM 卡从一设备转移到另一设备</title>
      <link>https://tourcoder.com/transfer-esim-from-a-device-to-another-ultramobile/</link>
      <pubDate>Sun, 28 Jul 2024 03:15:38 +0000</pubDate>
      
      <guid>https://tourcoder.com/transfer-esim-from-a-device-to-another-ultramobile/</guid>
      <description>不知为何，Ultra Mobile 在 iPhone 13 上的信号特别差，想转到 Pixel 上试试，下面是自己手动转移方法。
  保持旧设备（这里是 iPhone 13）的号码一切正常状态，能接收短信。
  在新设备（这里是 Pixel）上下载 Ultra Mobile 的 app，登录需要转移的号码的账号。
  检查你账户中的 Email 地址是否填写正确（很重要，需要接收 eSIM 的二维码），路径是 Account -&amp;gt; Personal Information。
  在导航栏的 Account 的下选择 Change Device，app 会自动检测你的设备是否支持 eSIM。检查完成后会自动进入下一个界面。
  选择 Get an eSIM，然后一步一步下去，在这个过程中可能需要验证短信。
  最后一封有新 eSIM 的邮件会发送到关连的 Email 中，扫描安装即可。
  注意点：
  每 12 个月只能请求 5 次 eSIM，超过将收费。收费标准是 $3/次。
  在中国大陆境内登录 Ultra Mobile 的 app 会频繁出现锁定的问题，全局翻墙登录可破。</description>
    </item>
    
    <item>
      <title>为什么我不推荐将域名托管在 CloudFlare</title>
      <link>https://tourcoder.com/why-do-not-i-recommend-using-cloudflares-domain-hosting-service/</link>
      <pubDate>Sat, 06 Jul 2024 10:38:43 +0000</pubDate>
      
      <guid>https://tourcoder.com/why-do-not-i-recommend-using-cloudflares-domain-hosting-service/</guid>
      <description>CloudFlare 这些年因为连续的免费策略被众多开发者捧得很高，高到众人都忘了那句经典的话&amp;ndash;“免费的就是最贵的”。
刚才我在陆续把前些日子转入到 CloudFlare 的域名转移出去，转入的原因是每个域名便宜至少一刀，这对有很多域名的我来说是一笔不小的开支。但当我续费域名的时候却发现 CloudFlare 的续费价格也不便宜，有的甚至更贵。因为没有找到它给的域名价格列表，实际价格是要在操作的时候才能看到，似乎给人一种进来后关门打狗的感觉。
这让我一下子想起和 CloudFlare 发生过的两件非常不愉快的事情，其中的一件事，我写在了本博客：「Cloudflare 的客服是蠢货」。而另外一件事恰恰和域名服务有关。
这事发生在好几年前，我做了一个短网址的网站，流量还行。域名当时使用的 CloudFlare 的域名解析服务，是想&amp;quot;戴套&amp;quot;隐藏服务器的 IP，即现在添加网站的方式。
我对网站做了简单的监控和人工举报服务（可以发邮件或者举报某个链接给我即可，我基本每天会看数据和邮件）。
有天早上醒来，发现收到很多封询问怎么关闭站点的邮件，还有一封要求我删除一个链接的邮件。
这封邮件是在我看邮件前 2 小时 47 分钟发的，要求我删除某个链接，说这个链接侵害它的利益了，如果我不删除的话，它将把站点举报到域名服务商和 CloudFlare。
也是因为这 2 个多小时我没有给反馈，这个人把站点举报给了域名服务商和 CloudFlare，域名服务商那边没有任何反应，反而是 CloudFlare 直接把域名解析给停了，而且是没有任何通知！！！即便我主动联系，它也是在三天后才告诉我说有人举报了。我说你们停止解析至少要通知我下吧？
我也给 CloudFlare 的人看了那个要删除的链接。那个要删除的链接原址是一家公司的 blog 的一篇博文，这篇博文里写了这家公司在和另外一家公司合作过程中遇到的问题及解决结果，类似一个公告。但到今天此刻，我都没有收到 CloudFlare 的回复。
试想一下，如果当初我的这个域名是托管在 CloudFlare 的，可能不只是停止解析这么简单了吧？域名都可能被它 holding， 甚至删除。
所以，我现在用 CloudFlare 的东西极少，Pages，warp。而域名也基本都转走了。Warp 是为了翻墙，而 Pages 也只是一个端，代码在 GitHub 上。</description>
    </item>
    
    <item>
      <title>修复 OpenSSH 的安全漏洞</title>
      <link>https://tourcoder.com/fixed-openssh-security-problems/</link>
      <pubDate>Tue, 02 Jul 2024 06:20:14 +0000</pubDate>
      
      <guid>https://tourcoder.com/fixed-openssh-security-problems/</guid>
      <description>OpenSSH 爆了一个远程代码执行漏洞，编号是 CVE-2024-6387，具体看这里。一早更新了几台服务器，记录下过程。
受影响的 OpenSSH 版本 受影响的版本是：从 v8.5p1 到 v9.8
解决方案 升级到 v9.8p1 即可
环境 我的这些服务器（或 VPS）安装的都是 Debian 系统，所以下面的内容都是基于 Debian 的，Ubuntu 也可以这样解决。也因为我使用的是编译方式解决，在 CentOS 也可以用下面方法解决，大差不离。
过程 进入到服务器，下载对应的文件，所需的文件在这里
# 从上面链接中，下载 OpenSSH 官网提供的源码并解压 wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz tar -xzf openssh-9.8p1.tar.gz cd openssh-9.8p1 # 安装构建所需要的依赖项，一般这步省略（基本这些内容服务器都早已经安装） sudo apt update -y sudo apt install build-essential libssl-dev zlib1g-dev -y # 先备份配置文件 sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak sudo cp /etc/ssh/ssh_config /etc/ssh/ssh_config.bak # 配置编译和安装 ./configure --prefix=/usr --sysconfdir=/etc/ssh make sudo make install # 重启 SSH 服务 sudo systemctl restart ssh # 验证安装，看是否是最新版 ssh -V </description>
    </item>
    
    <item>
      <title>下一个从我手机里删除的应用可能是 Twitter</title>
      <link>https://tourcoder.com/the-next-app-i-will-uninstall-might-be-twitter/</link>
      <pubDate>Mon, 01 Jul 2024 04:32:53 +0000</pubDate>
      
      <guid>https://tourcoder.com/the-next-app-i-will-uninstall-might-be-twitter/</guid>
      <description>这些年我手机里安装的应用不多，日常使用的应用更少。但一直都在使用推特，它是我获取信息的重要一个途径（另外一个途径是 rss 订阅）。但这一年我隐约有要删掉它的想法，究其原因，没什么用了。上一个我因同样原因删掉的应用是多邻国，多邻国是我坚持了 700 多天后删除的。
我想删掉推特，更多的原因是在我身上。
我想要从推特上获取到的信息是突然的，流动性的，不一定要学到什么知识，但要获取到最新的信息。可是现在的推特很难获取及时的流动性的信息。它现在是一个创作平台，各种知识点信息疯狂输出。很多时候这些相同的信息在不同的账号中重复出现，关键还有不少是错误的，发推者只是简单整理了下。这一切形成了让人烦躁讨厌的“信息炸弹”。如果我想获取某一个知识，我基本都是通过读书，阅读相关知识点的博客等来进行学习。
推特上的账号营销性太重，基本都为了获取更多的 follower 一个劲的营销。一切都变了，从最初分享快乐，分享状态，分享兴趣等变成了如何通过自己发的内容盈利。
色情泛滥，大概估算了下，我在推上至少拉黑了上百个色情账号，但在这种情况下，依旧还是很多色情信息。我特码都不知道哪里来的这么多色情信息。
消耗了太多的时间，如上面所说，以前我能在很短的时间里通过翻阅一些推文获取到很多信息，而现在我往往一篇长篇大论的推文都读不完。
怎么说呢？我还是喜欢那个 140 个字符，信息简短快速流通的推特，但回不去了！</description>
    </item>
    
    <item>
      <title>GitCode 和它背后的人都应该去死</title>
      <link>https://tourcoder.com/why-i-hate-gitcode-and-the-fucker-behind-it/</link>
      <pubDate>Thu, 27 Jun 2024 00:46:40 +0000</pubDate>
      
      <guid>https://tourcoder.com/why-i-hate-gitcode-and-the-fucker-behind-it/</guid>
      <description>CSDN 和华为云最近搞了个“大活”，应该很早就在干这事，只是近期才被发现。它们把全球的最大的开发者平台 GitHub 上的大量代码偷到了它们的平台上，甚至它们还在其平台伪造了每份代码开发者的账号身份。
为什么说它们是偷？   GitHub 上的代码是开源的，是供全世界的人学习分享的，fork 一份都是正常的操作，没有任何不妥。但它们干的事情不是 fork，它们是全盘复制（可能是通过爬虫爬）。
  GitHub 上有些开源的代码的 license 是不允许这么做的，它们无视 license。
  它们伪造了开发者的 username，直接和 GitHub 上开发者的 username 对应起来，一个字符都不带差的。
  为什么说它们坏？   它们出于自己的利益做了贼，但承受后果的是中国开发者，在和外界合作的时候，别人都会戴有色眼镜去看待你。要知道很多公司都已经不招中国区的开发者了，甚至关闭了对来自中国区开发者的访问权限。
  前些日子发生的多起所谓的“偷技术”事件本就让这类事情很敏感。现在它们搞这一出，还是堂而皇之的偷。以后即便是自己研发出来的技术，也会被人认为是偷来的。
  </description>
    </item>
    
    <item>
      <title>给博客集成了 Utterances</title>
      <link>https://tourcoder.com/integrated-utterances-to-my-blog/</link>
      <pubDate>Wed, 26 Jun 2024 13:20:05 +0000</pubDate>
      
      <guid>https://tourcoder.com/integrated-utterances-to-my-blog/</guid>
      <description>刷到个基于 GitHub issues 的评论系统，觉得挺好玩的，就把它集成到了这个博客。折腾过程非常简单。
访问这个网站 https://utteranc.es/，也就是它的官网，根据官网的说明来做。
  设置仓库是公开的状态。
  将插件 utterances 安装到仓库。
  (可选项) 如果是 fork 的仓库，则记得在设置里开启 issues。
  设置 mapping 和主题。
  复制下面的代码，然后将代码复制到对应位置。比如这个博客用的是 hugo，这段代码是放置在主题的 single.html 模板里面的。
  完成了。
  注意：这里有个门槛，需要有 GitHub 的账号才能评论，但这也是一个很好的防 spam 的好门槛，不是吗？
资源 Utterances</description>
    </item>
    
    <item>
      <title>推特上的赞</title>
      <link>https://tourcoder.com/the-like-on-x-dot-com/</link>
      <pubDate>Thu, 13 Jun 2024 04:08:35 +0000</pubDate>
      
      <guid>https://tourcoder.com/the-like-on-x-dot-com/</guid>
      <description>马斯克对推特做了进一步的改进，隐藏点赞。好些人在发马斯克点赞色情明星的贴图，说马斯克是为了隐藏自己的点赞记录。当然这个肯定是个玩笑了。
我基本没用过点赞这个功能，觉得它真没用。我对其他的功能的用法是
  评论：通过评论和别人交流
  转发：自己态度不明确或者无需多说，我就转发，让更多的人看到。因为推特本来就是一个广泛的交流网络，信息流动传播是本质。
  转评：态度明确且有想法要说，我就转评留下自己的看法，带有态度地把信息传播出去。
  收藏：想稍后再看的内容。
  相比较而言，这个赞对我是真的一点用处都没有。
当然，对推特这个平台来说，赞这个功能是一个收集用户数据，分析用户，然后通过算法推送信息给用户的一个很好的入口了。</description>
    </item>
    
    <item>
      <title>试用 iOS18 beta</title>
      <link>https://tourcoder.com/try-ios18-beta/</link>
      <pubDate>Tue, 11 Jun 2024 07:32:07 +0000</pubDate>
      
      <guid>https://tourcoder.com/try-ios18-beta/</guid>
      <description>几个小时前，在 WWDC24 上 Apple 释放出了 iOS18 的测试版，第一时间在一台 iPhone 13 Pro 上安装试用了几个小时。总体感受就是可以放心下载安装。
重点感受   丑：多处的设计界面变得很丑。尤其是 Home Screen，它的的设计方式我是挺喜欢的，但架不住搭配起来太丑了。其实 Google Pixel 两年前就有如此的设计，要好看舒服多了。推上对这个基本是吐槽一片。
  锁定应用：我挺喜欢的，不用为自己开发的应用专门开发类似功能了，当然它这个只是打开应用要求的验证，你依旧可以在应用里面增加类似功能。它的开启方式是长按应用图标，弹窗中选择“要求 Face ID”。取消锁定也是长按，弹窗选择“不要求 Face ID”。
  隐藏应用：我挺喜欢的，可以将一些应用隐藏起来。它的开启方式也是长按应用图标，弹窗中选择“隐藏并且要求 Face ID”。可以在“设置”这个应用里拉到最下面，进入“应用”这个菜单，然后拉到最下面即可以看到“隐藏应用”。取消隐藏的方式是在 App 库这个界面，找到“隐藏应用”的文件夹，点开它，然后长按对应的图标，选择“取消隐藏”即可。
  相册：本来很乱的相册，现在更乱了。
  iMessage：只是一些花里胡哨的功能，无感。另外就是卫星发送信息？这个还没用上。
  Notes：我基本不用，无感。
  AI：目前还没看到，Siri 还是很弱智。
  密码：把之前“设置”里的密码功能给独立成一个应用。但我基本不用密码管理这类软件，都是靠脑子记忆。当前密码这个应用把曾经连接过的 Wi-Fi 都记录保存标注了，这让人很不爽和担忧。还有就是一些需要登录的账号的网站服务，即便你没有点击保存信息，它都记录下来了，这个在它还是“设置”里一个功能时就存在，这也很让人不爽和担忧。
  屏幕应用位置：可以把应用图标放在屏幕的任意位置了，那应该更激进点，去掉 dock，至少去掉其背景。允许占四格的组件水平居中。
  出现过的问题或注意点   来电显示不显示：重启了手机后解决
  应用锁定后是无法添加组件到屏幕的
  本有自带锁定功能的应用在开启自身的锁定功能和系统自带的锁定功能，当打开此应用时会出现随机调用应用自身或系统的锁定解锁，有时候会被要求两次。（这里我测试的是 outlook）
  目前除了在主界面的搜索里能搜索到被隐藏的应用，但在设置等几处的搜索中是搜索不到的</description>
    </item>
    
    <item>
      <title>给自己的信 2024:你其实不需要太多</title>
      <link>https://tourcoder.com/a-letter-for-myself-2024/</link>
      <pubDate>Wed, 22 May 2024 10:38:59 +0000</pubDate>
      
      <guid>https://tourcoder.com/a-letter-for-myself-2024/</guid>
      <description>在前些天生日的时候就想写封信给自己，只是情绪一直没有到位，总有说不出来的感觉。上周看完《小谢尔顿》的最后两集，当谢尔顿反反复复和父亲最后的画面时，我一时来了情绪。
你不需要拥有太多 拥有意味着失去，拥有太多也就是会失去很多。在这个世界上有太多的好东西，远远的欣赏就行了，不一定要非要拥有它。有时候远看更美，拥有会变味。
放弃完美 没人没事能够达到完美的程度，做好当下的事，在认知范围内给未来做点准备，足够。
放弃和自己较劲内耗 不要为了做别人眼里的“好人”而较劲，更不要为别人对你的不公平而较劲。很多时候别人能那么做那么说，只是满足他的一些目的，不用理睬就好，别内耗自己。
只做自己能做的事 只做自己能做的事情，工作也好，生活也罢。不懂的东西就不要碰，如果很想碰，先深度学习一下。
不给承诺不给希望 承诺是一件很累人的事情，尤其是帮别人做事情的承诺，绝大多数时候会把自己累得半死，但结果未必好。同样希望也是。
不承担他人人生 每个人都有自己的人生要过，都有自己的路要走，这一切都和那个人自己的选择有关。以自己的角度给别人提出的建议真不适合别人的思维选择，而很多时候别人还会因此怨恨你，觉得自己没过上想要的生活全是因为你，何必呢？何苦呢？</description>
    </item>
    
    <item>
      <title>体验 Swift Package 的开发并发布的流程</title>
      <link>https://tourcoder.com/how-to-create-swift-package/</link>
      <pubDate>Tue, 07 May 2024 01:54:59 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-create-swift-package/</guid>
      <description>五一期间在更新一个 cocos2d-iphone 的游戏时发现很多包是通过 cocoapods 管理的，心血来潮就想试试 swift package，遂记录一下折腾的过程。
开发包 创建 创建包的方式有两种，一种是直接通过 Xcode 来创建，也可以通过命令行来创建，两者大差不离。我自然选择的是命令行方式创建。
  创建文件夹并进入 mkdir projectname &amp;amp;&amp;amp; cd $_，需要注意这里的文件夹名就是包的名字。
  在终端里输入 swift package init，即可获得一个完整的包的必要内容，其结构如下
. ├── Package.swift ├── Sources │ └── InformationCheck │ └── InformationCheck.swift └── Tests └── InformationCheckTests └── InformationCheckTests.swift 注解
Package.swift：这是 Swift Package Manager（SPM）所需的清单文件，它描述了包的元数据，包括名称、版本、依赖关系等。可以在这个文件中指定包含在包中的源文件和目录，还有包的各种配置选项。
Sources/InformationCheck/InformationCheck.swift：这是包的源代码文件。通常包含一个或多个源码文件。
Tests/InformationCheckTests/InformationCheckTests.swift：这是用于测试软件包中的代码的测试文件，用于测试InformationCheck模块中的代码。
  在根目录下增加 README.md 文件，用来解释这个包的信息，比如介绍说明，使用方法等。
  至此，一个包就创建完成了。
编码 主要的代码都在 Sources 这个文件夹里进行，可以有一个或者多个源码文件。需要注意的是随着源码内容的不同，在 Package.swift 里应该有对应的配置修改。关于这个文件的配置，可以翻阅官方文档。
测试 测试的方式也比较简单，直接执行命令 swift test 即可。iOS 有时候用 swift test 测试 iOS 的包总会出错，可以用个 Xcode 创建一个项目，然后在该项目中增加本地包即可。</description>
    </item>
    
    <item>
      <title>Gnome 学习手册</title>
      <link>https://tourcoder.com/gnome-handbook/</link>
      <pubDate>Wed, 01 May 2024 11:47:51 +0000</pubDate>
      
      <guid>https://tourcoder.com/gnome-handbook/</guid>
      <description>最近考虑将工作平台转移到 Debian 平台去，遂在一台惠普电脑折腾桌面版的 Debian。其实这个系统我并不陌生，毕竟我的服务器都是用的它，有点陌生的是桌面 Gnome。
这里记录下我在折腾的过程中遇到的问题及解决方法，这篇应该是随着我的折腾不断更新的。
安装 我是从 Debian 官方下载了 iso 文件，然后制作成 U 盘安装，安装全程没有遇到任何问题，也没有什么特别需要注意的。在安装的过程中会让选择桌面，选择 Gnome 即可。
配置 下面是一些常规配置，更为详细的配置，可以看我的开发机配置或者服务器版本的配置，在本博客中搜索相关关键字即可，或者阅读「CentOS 和 Ubuntu」。
  给用户增加 sudo 的权限
在终端中输入 su，进入 root 模式，在 /etc/sudoers 文件中增加 用户名 ALL=(ALL:ALL) ALL 即可。当然也可以用命令 usermod -aG sudo 用户名。
  中文输入法
输入法把我折腾得有点灰心，fcitx 总是不断的出问题，最后还是用了 gnome 自带的 ibus。因为是自带的，所以是不需要安装操作的。但我前面安装 fcitx 时怕冲突，卸载了 ibus，所以重新安装。执行命令 sudo apt install ibus 和 sudo apt install ibus-pinyin，然后配置一下即可。需要注意的是有时候在输入中文后，显示的内容是 [Invalid UTF-8]，则修改 ibus 的配置
  General 的 Half/Full Width 中选 Half</description>
    </item>
    
    <item>
      <title>两个银行的一点小故事</title>
      <link>https://tourcoder.com/two-banks-i-met/</link>
      <pubDate>Tue, 23 Apr 2024 04:31:23 +0000</pubDate>
      
      <guid>https://tourcoder.com/two-banks-i-met/</guid>
      <description>去年三月份，我用了快 20 年的中国银行账户被封，在解决这个问题的过程中，我研究了下，然后跟风开了五个新的银行账号。
  中国大陆的汇丰卓越理财是我带钱在银行网点开的，只要存钱基本都能开下来。
  香港汇丰的 one 是我在去香港玩的时候顺便开的。
  N26，开这个是为了给沃达丰的电话卡充值用的。
  这三个目前我都在正常使用，用得挺好，暂时没有遇到问题。
这篇文章重点说说另外两个账户，ZABANK 和 OCBC，即众安和华侨。
众安银行 也是在香港玩的时候，顺道开的。连上香港的 Wi-Fi 打开 app 即可开通，一切蛮顺利的。但在使用的时候，却遇到了问题。
  我用自己同名的银行卡给它转了 1000 港币，账户随即被风控了。在多次和客服沟通后，提交了自己转账卡的信息，然后才解封。
  说粤语的卖保险的垃圾电话特别多，甚至我还接到了诈骗电话。开它这个卡，我用的是自己另外一个未对外用过的香港号码。在我向众安客服多次投诉后，卖保险的垃圾电话消失了。
  目前的状态，我没有继续用这个账户了，里面还有 300 港币。
OCBC 华侨银行 这里说到的华侨银行是 OCBC Digital 这个 app。它给我的感觉就两个字“离谱”，这离谱是从头到尾，一直到此时此刻。
  注册时候，它在识别护照上信息时，将我的生日识别错了，我还无法修改，然后还注册成功了！！！
  我发邮件告知，至今很多个月过去了，未有任何答复。我前几天登录上去看了，我的信息还是错误的！
  早期的时候，如果忘记 app 登录信息是无法自行重置的，需要联系客服，而且是电话联系，因为 email 联系是不会有任何反馈的。电话那头听口音是印度人，你知道他在说英语，你也在说英语，但两个人就是不懂对方在说什么。
  如上所说，我前几天收到它的促销邮件，然后就把它重新下载，发现新版本能自行重置登录的密码了，很好！但是无法修改信息，因为需要输入一个验证码。这个验证码是它通过纸张邮件发送到你登记的地址的，从新加坡发过来过来。
  通过它提供的安全邮箱联系客服，但很抱歉，只能输入英文。中文在这里是非法字符。
  发送信息后收到自动回复说 5 个工作日会有回复，等 5 个工作日的时候，又来一摸一样的自动回复说 5 个工作日会有回复。</description>
    </item>
    
    <item>
      <title>现在说 AI 程序员降临是不是早了点？</title>
      <link>https://tourcoder.com/too-early-to-say-ai-programmer-is-coming/</link>
      <pubDate>Tue, 16 Apr 2024 13:50:13 +0000</pubDate>
      
      <guid>https://tourcoder.com/too-early-to-say-ai-programmer-is-coming/</guid>
      <description>其实在纠结是否要写这一篇，主要是因为 AI 发展太快了，说不定我写完后就会被光速打脸，哈哈哈。
在过去的近两个月时间里，已经有四个人和我说到 AI 程序员，说以后不需要人写代码了，直接交给 AI 就行。我给出的观点都是 “你想太多了，现在还不是时候”。
作为一个以解决问题为出发点的程序员，我是最应该被 AI 替代的一类，但很可惜，目前 AI 依旧替代不了我，那更不要说替代创造性的程序员了。
  现在的 AI 缺少主动思考的能力
  现在的 AI 并没有思考能力，它的思考属于伪思考，是人通过指令驱动的。
  现在的 AI 没有原创性
  现在的 AI 没有设计能力
  现在的 AI 没有创造能力
  现在的 AI 总是不能完成最后的目标（20% 的那一部分），因为缺少连贯性。
  </description>
    </item>
    
    <item>
      <title>我的手机及其他</title>
      <link>https://tourcoder.com/my-cell-phones-and-more/</link>
      <pubDate>Sat, 06 Apr 2024 04:39:47 +0000</pubDate>
      
      <guid>https://tourcoder.com/my-cell-phones-and-more/</guid>
      <description>想分享下我的手机及其上面的主要应用，和很多其他分享者不一样的是，我算是一个轻度的手机使用者，所以上面安装的应用也不多，基本原则是够用，能稳定的解决问题即可。
主力手机 平时随身携带的就是一部 iPhone，除了 17 年短暂的试了下 Oneplus，用了 1 个月左右，iPhone 一直是我的第一选择。
早些年换 iPhone 有点勤快，几乎是出新必换，但这些年都是用坏了才换。怎奈 iPhone 太靠谱，我在 iPhone Xr 这一阶段停止了很长时间。直到最近，因境外出行变多了，而用 eSIM 卡比较方便，就换了一部 iPhone 13 Pro。
手机上安装的应用也不多
支付宝：吃饭，付钱，乘地铁，交停车费等各种费用。
微信：我很少用微信和别人说话，准确的说，我很少聊天。我主要用里面的小程序，其实说起来支付宝挺悲哀的，自己本身做支付出身的，但银行的小程序都跑到微信去了。
其他使用最多的应用是 Reeder，Twitter，Gmail，Safari 和多领国。
还有一个一直开着的是应用是科学上网的 Surge，它和 aws 的 lightsail 给我提供了稳定的上外网的环境。用 lightsail 的原因很简单，它真的很稳定，而且如果 IP 被封了，还能免费自由更换 IP，之前也用过搬瓦工的 CN2 GIA 线路，但到期后没有再续了。
本地的流量卡是我用了小 20 年的联通的卡，流量足够。本地通话也是这个号码，但我通话很少。
除了在上海生活时，其实在境内旅游也是这一部手机，毕竟国内还是比较方便的，没什么特别的需要改变的。
如果出境旅游的话，这部手机里插一张出发前在飞猪上买的当地的流量卡（用过很长一段时间的 Google Fi，但它后面变得不可控，就未再用）。现在这个主力机有了 eSIM，就更方便了。而在境外当地通话方面，我有两个解决方案：移动无忧行里面申请的一个香港的号码和 Google Voice。用这两个方案是因为它们不需要额外插卡，随时可以用，而且在境外我也没有什么电话。
备用手机 我还有一部 Google Pixel 4a 5G 作为备用机。我真的太喜欢这部手机了，能支持 eSIM 和插卡，而且拍照也很棒。
这部手机我平时是放在家里的，处于关机状态，只有在境外旅游时才会带上。在境外时，我会把国内平时用在主力手机里的联通这张卡放在这部手机里，当然联通的卡开通了国际漫游。在境外时，这部手机基本都是放在酒店的行李包里，只有晚上想拍夜景时才带出来，用它拍出来的夜景真的太棒了。
其他手机 除此上面两部手机之外，我还有一部旧的美版 iPhone，插的是 Ultra Mobile 的卡，开启了 Wifi Calling。这部手机里安装了众多银行的应用，还有一些股票账户的应用。主要是我用来处理炒股等事宜的。自从 Google 等一些公司说要删除两年不登录的账户后，这部手机又多了一个功能，登录了一些账号，保持它们是激活的状态。</description>
    </item>
    
    <item>
      <title>解决 Runtime Profile Not Found 的错误</title>
      <link>https://tourcoder.com/fixed-runtime-profile-not-found-error/</link>
      <pubDate>Tue, 02 Apr 2024 14:18:26 +0000</pubDate>
      
      <guid>https://tourcoder.com/fixed-runtime-profile-not-found-error/</guid>
      <description>新版的 xcode 总会有一个问题，当下载一个新的模拟器后，当再次项目时，总会弹出错误，比如我今天下载 iOS 17.4 的模拟器后，就出现了下面的错误
The com.apple.CoreSimulator.SimRuntime.iOS-17-4 Simulator runime is not available. runtime profile not found using &amp;quot;System&amp;quot; match policy Download the com.apple.CoreSimulator.SimRuntime.iOS-17-4 simulator runtime from the Xcode Settinas. 最简单的解决办法是打开 xcode，进入到模拟器管理界面，删除掉里面的设备模拟器，然后重新增加即可。还有一个解决办法，在终端中输入下面的命令
sudo killall -9 com.apple.CoreSimulator.CoreSimulatorService </description>
    </item>
    
    <item>
      <title>讲故事：我讨厌的一种人</title>
      <link>https://tourcoder.com/tired-of-this-kind-of-people/</link>
      <pubDate>Thu, 07 Mar 2024 00:47:18 +0000</pubDate>
      
      <guid>https://tourcoder.com/tired-of-this-kind-of-people/</guid>
      <description>刷推，看到一些话，让我想起一段往事，想起我讨厌的一个人。
差不多 15 年前，我客户公司的一个人，刚开始接触他的时候，我发现他什么都懂，什么话题都能接，感觉他很厉害的样子无所不能。后来因为项目，和他接触更多，我越来越厌烦这个人，以至于最后和他是见面不说话，结束各自心里都骂对方是傻逼。他骂没骂我不知道，但我是骂的。
我讨厌他的原因也很简单， 每次遇到事情，他不解决问题，也没能力提供解决方案，但他会从另外一个所谓的“更高层次”抛出另外一个新的问题，然后会带偏一帮傻屌，会让当天的针对某个问题的讨论变了其他根本无关的讨论。
举个例子，有次他们公司 app 有个需求是在 iPad 上的一个悬停 title 的效果，我做了三个效果，都不喜欢，说白了就是没有人敢担责用哪一个，没人拍板。不记得是哪个提议把这个傻逼叫过来了，然后这个傻逼就莫名其妙的“高深的空洞输出”，最后来了个 flash 制作的动画上什么的。然后这帮玩意就去讨论 flash 做东西有多好什么的。我最后实在受不了了，我说你们继续讨论吧，然后我去找他们老板拍板这个事情了。
现在这类人还很多，每次遇到，我要么走开，要么一 block 了事。</description>
    </item>
    
    <item>
      <title>Google 如何才能在 AI 竞赛中胜出</title>
      <link>https://tourcoder.com/how-does-google-win-the-ai-race/</link>
      <pubDate>Mon, 04 Mar 2024 15:50:20 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-does-google-win-the-ai-race/</guid>
      <description>先说暴论吧，Google 很难在这场 AI 竞争中胜出，它现在给我的感觉就像是 iPhone 3GS 诞生后的 Nokia，被打懵了，没有了方向。
但如果 Google 真的要在这场 AI 竞争中胜出，Google 至少要做到以下几点
  裁掉一部分的印度的高管，Google 的印度裔高管太多了，也许他们能做好一件事或者维持好一个状态，但他们真的没有冲击力，没有拓展精神，并不是任何一个印度高管都是 Satya Nadella。
  结束掉乱糟糟的 AI 产品命名。现在的产品命名太乱了，必修要做一个统一的品牌。比如就用 Gemini 这个品牌吧。面向使用者的（比如个人消费者，企业用户）就用 Google Gemini，而面向平台用户（比如开发者，需要用 Gemini API 的）就用 Google Gemini API。把所有的功能都集合到一个品牌产品里来。
  需要一个独立的 AI 产品部门，不隶属于 Google Cloud，也不隶属于 Google One，一个单独的部门，配一个强有力的领导。
  Google 要做的远不止是这些，但做好这几点能让它至少不会掉队那么快！要知道 Google 已经做出来的产品并不差，但现在的状态有点像当年 Google Cloud 一样，在那边研究练高深的“内功”，而人家 aws 已经被客户各种操练了，等 Google Cloud 内功练好了，即便拿出的产品比 aws 好，但市场没有太多它说法的份了。
Google AI 真的不能重蹈覆辙，而且这是 AI 的竞争，Google 不能这么玩的！！！</description>
    </item>
    
    <item>
      <title>Storyboard 项目改成 SwiftUI 项目的几个设置</title>
      <link>https://tourcoder.com/some-tips-on-changing-storyboard-project-to-swiftui-project/</link>
      <pubDate>Sat, 02 Mar 2024 10:22:59 +0000</pubDate>
      
      <guid>https://tourcoder.com/some-tips-on-changing-storyboard-project-to-swiftui-project/</guid>
      <description>在创建一个 iOS 的 app 时没注意选项，误将 SwiftUI 框架选成了 Storyboard，没重新创建，直接做了更改，记录下更改的内容
  删除所有的除了 Assets 和 Info.plist 的文件
  创建入口文件，比如 AppNameApp，其代码如下
import SwiftUI @main struct AppNameApp: App { var body: some Scene { } }   设置 Info.plist 文件
将 Delegate Class Name 里面的内容改成 $(PRODUCT_MODULE_NAME).AppNameApp，并删除 UISceneStoryboardFile 和其值 Main，大致的代码如下
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt; &amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple//DTD PLIST 1.0//EN&amp;quot; &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;gt; &amp;lt;plist version=&amp;quot;1.0&amp;quot;&amp;gt; &amp;lt;dict&amp;gt; &amp;lt;key&amp;gt;UIApplicationSceneManifest&amp;lt;/key&amp;gt; &amp;lt;dict&amp;gt; &amp;lt;key&amp;gt;UIApplicationSupportsMultipleScenes&amp;lt;/key&amp;gt; &amp;lt;false/&amp;gt; &amp;lt;key&amp;gt;UISceneConfigurations&amp;lt;/key&amp;gt; &amp;lt;dict&amp;gt; &amp;lt;key&amp;gt;UIWindowSceneSessionRoleApplication&amp;lt;/key&amp;gt; &amp;lt;array&amp;gt; &amp;lt;dict&amp;gt; &amp;lt;key&amp;gt;UISceneConfigurationName&amp;lt;/key&amp;gt; &amp;lt;string&amp;gt;Default Configuration&amp;lt;/string&amp;gt; &amp;lt;key&amp;gt;UISceneDelegateClassName&amp;lt;/key&amp;gt; &amp;lt;string&amp;gt;$(PRODUCT_MODULE_NAME).</description>
    </item>
    
    <item>
      <title>我和 AI</title>
      <link>https://tourcoder.com/i-ai/</link>
      <pubDate>Fri, 01 Mar 2024 02:55:57 +0000</pubDate>
      
      <guid>https://tourcoder.com/i-ai/</guid>
      <description>我和 AI 的缘起于突如其来的一场病，那年感觉不舒服，检查后却被医生强留下来人让住院，没床位给我紧急安排床位，住医院的各种凶险，差点死在医院。出院后体重从 210 多斤迅速掉到了 120 斤不到，整个人脱形。
那时我想了很多很多，其中一个问题是如果我突然挂了，我家人怎么办？我缺席了他们以后的人生，我很不心甘。
我也找了很多解决方案，比如配合医生治疗，坚持锻炼，甚至我还尝试去做纳米机器人，将可编程的纳米机器人注入身体里，然后通过它们来控制我的病情。我也想如果变成我童年最喜欢看的电影「机器战警」里的样子也行啊。经多多方考量后，我发现 AI 可能解决我的需求，但我对 AI 的研究只存在于理论加一点点实践，也仅限于用 TensorFlow 给别人做过点东西。
也是这股强烈的愿望，我慢慢的掌握了很多 AI 的知识，技术，甚至技巧。我开始做一个数字世界的自己，每天会花一些时间和“他”聊天，给“他”看我的写的文章，告诉“他”我考虑问题，各种和我有关语料等等。就这样做了一个能和我对话的“自己”，虽然功能有限，但让我有了一点欣慰。
后来 ChatGPT 横空出世，让我看到了更大的希望，让另一个“我”更具化。一张照片生成 3D 的自己，从最初的评价不像，到现在评价是还真像。一段语音能复刻声音，从最早的 TTS 到现在的 MTTS，这期间 ChatGPT 给了我很大的助力，也非常非常感谢开源世界的各种技术。
上次有个想创建一个数字自己的人和我开玩笑说：“你把这个东西再这样做下去，你都快成冥王哈迪斯了”。其实是什么不重要，重要的是如果能给人一点念想，一点希望，减少一点痛苦，这才是最值得的。就如我年初二在我爷爷墓前看往我爷爷时说的一样：“你死在了我最混蛋最不珍惜一切那些年，我没能留下能够在我的世界‘复活’你的素材，不能复活你是我永远痛。“ 而我现在能做的只是无论身在何地，过年过节都给他烧点纸钱，而我回去都去他墓前陪他聊会天，这就是我人生的痛苦。</description>
    </item>
    
    <item>
      <title>一点 iOS 开发的小经验</title>
      <link>https://tourcoder.com/a-little-experience-in-ios-development/</link>
      <pubDate>Mon, 19 Feb 2024 06:54:38 +0000</pubDate>
      
      <guid>https://tourcoder.com/a-little-experience-in-ios-development/</guid>
      <description>在 iOS 开发中“神奇”的事情很多，但最神奇的可能就是当你遇到问题时，你能通过搜索引擎找到别人提供的“一万种”该问题的办法，并且都成功的解决了这个问题，但就是解决不了你的。比如这个 “Command PhaseScriptExecution failed with a nonzero exit code 的 xcode 编译时候的错误”，可以看知乎上的讨论。这里不讨论这个问题的解决办法，因为我这次开发遇到这个问题到现在还没解决，哈哈哈
这里只是分享下我多年前开发 iOS 应用的流程，也许这流程放在现在依旧合适。
  先画 UI
  再做 UX
  做数据
  最后引入库，比如用 Cocoapods 这种东西
  这种方式不只是符合个人开发，同样也适合团队开发，能省很多痛苦的时间。
Tips 刚才解决了 「Command PhaseScriptExecution failed with a nonzero exit code」 这个问题，提供给一个解决方案。
将 use_frameworks! 从 Podfile 里面删除！</description>
    </item>
    
    <item>
      <title>解决无法通过 xcode 下载 iOS 模拟器的 bug</title>
      <link>https://tourcoder.com/fixed-can-not-download-ios-simulator-via-xcode/</link>
      <pubDate>Fri, 16 Feb 2024 12:47:15 +0800</pubDate>
      
      <guid>https://tourcoder.com/fixed-can-not-download-ios-simulator-via-xcode/</guid>
      <description>在 xcode 中下载 iOS 的模拟器总会出错，明明磁盘空间足够，但它总是提示错误。可以直接下载模拟器文件的方式解决这个问题。
下载模拟器文件 进入页面 https://developer.apple.com/download/all/ 下载对应的模拟器文件，比如我这里下载的是 iOS 17.2，格式是 dmg 的。
安装模拟器文件 执行下面的三个命令即可解决问题。
sudo xcode-select -s /Applications/Xcode.app xcodebuild -runFirstLaunch xcrun simctl runtime add &amp;quot;your_path/iOS_17.2_Simulator_Runtime.dmg&amp;quot; 需要注意的是安装完成后，这个文件不能删除，如果删除了，xcode 会提示错误。
其它 进入到  ~/Library/Caches/ 文件夹，右键点击 com.apple.dt.Xcode 这个文件，选择 Show Package Contents，将上面下载的 dmg 文件放到这里的 Downloads 文件夹里。重启 xcode 进入到模拟器下载界面点下载也可。</description>
    </item>
    
    <item>
      <title>通过 Github Action 将 GitHub 上的内容部署到 VPS</title>
      <link>https://tourcoder.com/deploy-from-github-to-vps-via-github-action/</link>
      <pubDate>Thu, 08 Feb 2024 05:12:41 +0000</pubDate>
      
      <guid>https://tourcoder.com/deploy-from-github-to-vps-via-github-action/</guid>
      <description>之前有写过自动部署的博文，但这几年实际操作中并没有那么深度使用，这些天访问 raw.githubcontent.com 总有点问题，就想着把 directConfig 的内容部署到自己的 vps 上，正好也能复习下 GitHub Action。
需求说明 我这次要完成的自动部署是当 master 分支有 push 的时候触发 GitHub Action 将内容直接部署到 VPS 上指定的文件夹里，因为这里只是几个静态文件，所以相对而言比较简单，更复杂的下次需要用的时候再来分享。
这里的需求的解决方案有两种
  在 Action 的“机器”上处理好所有的事情，最后将内容通过 scp 到 VPS 的指定目录去。（推荐）
  通过 Action 登录到 VPS 上，然后在 VPS 上处理所有的事情。（不建议，不建议的原因是生产力部署服务器，不应该做“部署过程”这件事，应该是做“部署结果”这件事，比如这里要用 git clone，不应该是在 VPS 操作，如果放在 VPS 上就要安装 git 等，操作的内容越多，要配置的东西越多，这是不对的。）
  操作步骤 我这里用了第一种方式。
 创建 Action 的文件  在项目仓库的根目录下创建文件，比如 .github/workflows/main.yaml，将下面的内容填写进去
name: deploy directConfig on: push: branches: [ master ] # master 分支上 push 触发部署 jobs: build: # 在 ubuntu 上构建 runs-on: ubuntu-latest steps: # 拉取代码 - uses: actions/checkout@v2 # 检查当前目录的文件 - name: Check the folder run: ls -a # 删除 .</description>
    </item>
    
    <item>
      <title>创建 React 组件并发布到 npm，附一些问题解决</title>
      <link>https://tourcoder.com/create-react-a-component-and-publish-it-on-npmjs/</link>
      <pubDate>Tue, 06 Feb 2024 15:15:20 +0800</pubDate>
      
      <guid>https://tourcoder.com/create-react-a-component-and-publish-it-on-npmjs/</guid>
      <description>最近在写一个 React 的项目，也产生了一些组件。特意弄了一个网站 yeci.org，会逐步将这些组件放在这个网站上。
回到正题，写篇博文记录下如何创建一个 React 组件并将它发布到 npmjs。
技术栈
  React
  Webpack
  Sass
  Babel
  创建组件  创建文件夹，并进入  mkdir Realert &amp;amp;&amp;amp; cd $_  初始化  npm init  安装 React 和 React-dom，组件依赖  npm i react react-dom -D  安装其它构建依赖  npm i webpack webpack-cli webpack-dev-server html-webpack-plugin style-loader css-loader sass-loader node-sass @babel/core @babel/cli babel-loader @babel/preset-env @babel/preset-react -D 下面是依赖的说明
Babel: 用来编译</description>
    </item>
    
    <item>
      <title>用 Plasmo 开发 Chrome 和 Firefox 扩展的一点分享</title>
      <link>https://tourcoder.com/chrome-extension-and-firefox-add-ons-via-plasmo/</link>
      <pubDate>Thu, 01 Feb 2024 08:20:49 +0000</pubDate>
      
      <guid>https://tourcoder.com/chrome-extension-and-firefox-add-ons-via-plasmo/</guid>
      <description>用 Plasmo 开发了个 Chrome 的扩展，还蛮简单方便的，至于如何开发，请去看官方文档。
在开发完成后，有几个注意点
  与 Chrome 不同，Firefox 需要在 manifest.json 文件里增加一条属性 browser_specific_settings，格式如下
&amp;quot;browser_specific_settings&amp;quot;: { &amp;quot;gecko&amp;quot;: { &amp;quot;id&amp;quot;: &amp;quot;&amp;quot; } } 这里的 id 的要求是
must match pattern &amp;quot;^\{[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\}$&amp;quot; must match pattern &amp;quot;^[a-zA-Z0-9-._]*@[a-zA-Z0-9-._]+$&amp;quot; 参考 email 地址，不过要注意这个是提交后无法修改的，不要写成 email 地址，虽然 Firefox 官方文档是写成 email 地址。如果不设置这个 browser_specific_settings，在上传到 Firefox 的时候会报错。
  也不要在项目源文件里直接增加上面的 browser_specific_settings 属性，因为这个属性会导致 Chrome 那边也报错。所以这个简单的处理办法是直接在编译完成的 manifest.json 里写就行了。
  </description>
    </item>
    
    <item>
      <title>关于域名的一点小事</title>
      <link>https://tourcoder.com/a-story-about-domain-names/</link>
      <pubDate>Wed, 03 Jan 2024 12:31:59 +0000</pubDate>
      
      <guid>https://tourcoder.com/a-story-about-domain-names/</guid>
      <description>我现在每年网络产品最大的支出就是域名，在我的年度账单里有清楚的说明。
我对域名的喜欢还得从大学那会说起。上大学那会(2004 年)，有个公司搞了个活动，给每个人送一个域名，让任何人用注册的域名做游戏相关的网站或者产品。我那时申请了，注册了个域名叫 uoog.com，想做一款航海类的游戏。那时候给工作室起了个名字叫 S2 Entertainment，中文名叫封暴工作室。为什么叫封暴呢？因为想盖过暴雪。嗯，那时候有点挺傻逼的。网站的程序也是我自学 asp 写的。最后这个事情并没有做成，原因也简单，虽然几个网友组队了，但大家时间似乎弄不到一起去，最后事情都落到我的身上，而我一个人也没有那个实力把东西全部做完，最后写好的程序和网站一起卖给了别人，这个域名也自此丢失了。卖的钱大家分了，哈哈哈
后来因为喜欢域名，我做了一家叫数字引擎的厦门公司的代理，卖域名和虚拟空间。 同时，我自己也陆陆续续囤积了一些域名，但基本都是无投资价值的，都是我个人喜好的域名，比如我以前的网名用过皮蛋这个词，所以我有过一个域名 pidan.org，并且这个域名也做过我的博客域名。倒也不是当时自己没有商业头脑，只是没想过做这个生意罢了。
时至今日，我还喜欢买一些自己喜欢的域名，但也在考虑把一些域名做点价值出来，然后卖掉。
写得有点零散，将就看吧。</description>
    </item>
    
    <item>
      <title>每年的第一段和最后一段代码</title>
      <link>https://tourcoder.com/the-first-and-last-piece-of-code-in-years/</link>
      <pubDate>Mon, 01 Jan 2024 04:33:21 +0000</pubDate>
      
      <guid>https://tourcoder.com/the-first-and-last-piece-of-code-in-years/</guid>
      <description>刚才锻炼的时候突然想到一个问题，是不是记录下以后每年写的第一行（段）和最后一行（段）代码？感觉是个有意思的事情，就从 2024 年开始吧。
2025 年 第一段代码写于 2024 年 01 月 01 日，在东京的酒店写的，这段代码用于一款 AR 的 iOS 应用，用户部分的 Model。这款应用会在一个月内上线，采用快速迭代的方式
struct User: Codable, Identifiable { let id: String let email: String var username: String var profileImageUrl: String? enum CodingKeys: String, CodingKey { case id case email case username case profileImageUrl = &amp;quot;profile_image_url&amp;quot; } } 2024 年 第一段代码写于 2024 年 01 月 01 日，这段代码是初始化 chrome 插件后的 manifest.json 文件。是笔记应用 Binge 的 Chrome 插件的内容。
{ &amp;quot;manifest_version&amp;quot;: 3, &amp;quot;name&amp;quot;: &amp;quot;Binge&amp;quot;, &amp;quot;version&amp;quot;: &amp;quot;1.</description>
    </item>
    
    <item>
      <title>分享一次注销上海公司的经历</title>
      <link>https://tourcoder.com/how-to-deregister-a-company-in-shanghai/</link>
      <pubDate>Thu, 28 Dec 2023 05:04:42 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-deregister-a-company-in-shanghai/</guid>
      <description>最近在注销一个上海的公司，过程值得分享一下。
一般常规的公司，如果你的税务没有问题的话，想节省时间不想来回跑嫌麻烦，可以直接找外面的代注销，一般收费 3000 元左右。如果不想付钱，那自己去做，全程除了折腾一下外，不需要任何费用。而我这次是有大问题，所以事情比较麻烦，来来回回折腾好几趟。
非必要前提   公章营业执照：如果公章营业执照等都还在，这步省略；如果公章营业执照不在了，先去「档案馆」调取公司的档案，记得要档案馆盖章。
  委托书：如果你是公司的法人代表，这步省略；如果不是，需要公司法人代表的授权书，签字，按手印。
  身份证：经办人的身份证和法人代表的身份证（这是必须要的）
  先注销税务 如果你公司的税务是正常的，先去国税网站把所有的税务做清算，做完清算后，去税务直接注销即可。
如果你公司的税务是异常的，在注销税务前，需要先去行政处罚处接受罚款。行政处罚后，再去注销税务。
公章营业执照在，盖章签字。不在，法人签字按手印即可。代办的同理。身份证必须。
注销税务和行政处罚基本很顺当，材料齐全，当天就可办理完成。
工商注销   登报挂失：如果你公司的资料（公章，营业执照等）都还在，直接去柜台办理，这步省略；如果不在，需要登报挂失，记得多备份几份报纸。
  信息采集：资料齐全很简单，但很多人都因为这样那样的情况卡在这一步。非常常规情况下需要的东西有挂失所登记的报纸（公章营业执照丢失），全体股东签字的几个文件（工商会给，记得注销完税务后，先去工商那边领一份），公证书（股东或法人代表有问题，比如我的股东身故后遗产处理公证），登记注册 app 里面全体股东的认证（一次认证有效期只有 10 天）。
  信息审核：信息采集完成后，一般等 5-10 天即可打电话去询问是否完成审核。
  登报注销：信息审核完成后，登报注销公司
  申请注销：登报注销公司 45 天后，再去工商申请完成公司的注销。
  完成这些，公司就注销完成了。
一些建议   如果股东身故，其有父母、配偶和子女的话，建议让其配偶一个人继承所有的公司股份，会节省很多事。
  工商注销时会有个坑：有些工商的工作人员会告诉你，没必要工商注销了。说等三年就行了，会自动注销。建议千万不要听。
  </description>
    </item>
    
    <item>
      <title>修复一个 Dropbox Uploader 脚本中频繁出现的问题</title>
      <link>https://tourcoder.com/fixed-a-frequent-error-in-dropbox-uploader-script/</link>
      <pubDate>Wed, 27 Dec 2023 09:02:48 +0000</pubDate>
      
      <guid>https://tourcoder.com/fixed-a-frequent-error-in-dropbox-uploader-script/</guid>
      <description>我有时候会用 Dropbox Uploader 这个脚本将一些内容自动备份到 Dropbox，具体的操作方式可以看我以前的博文。
但最近向新建的 Dropbox app 上传内容时总是提示下面的错误
Some error occured. rerun the script with &amp;quot;-d&amp;quot; option and check the output and logfile: /tmp/du_resp_debug. 在上传脚本增加了 -d 参数后运行，即 ./dropbox_uploader.sh -d upload local_file dropbox 后根据错误发现是权限的问题，缺少写入权限。
可以打开 https://www.dropbox.com/account/connected_apps 这个页面查看你的 app 是否有写入权限，没有的话，在进入该 app 的设置页面增加写入权限即可。
然后在服务器端已经关联的账号，可以用 ./dropbox_uploader.sh unlink 先取消关联，然后再重新关联即可。
补充两句
  以前在 dropbox 开发者中心创建 app 的时候，会自动有写入权限，弹窗提示。但现在也弹窗提示了，但创建完成后没有写入权限，需要另外配置。
  如果只是修改了 app 的权限，增加写入权限，也不能写入，服务器端一定要重新关联。
  不知道是不是只有我遇到了，这个很奇怪！</description>
    </item>
    
    <item>
      <title>一次莫名其妙的 AWS Lightsail 账单</title>
      <link>https://tourcoder.com/an-inexplicable-aws-lightsail-bill/</link>
      <pubDate>Mon, 11 Dec 2023 13:56:29 +0000</pubDate>
      
      <guid>https://tourcoder.com/an-inexplicable-aws-lightsail-bill/</guid>
      <description>我有两台科学上网的 vps 用的是 aws lightsail，最便宜的 3.5 刀一个月，两台 7 刀一个月。已经用了很多年，账单一直很稳定。但 11 月份，突然给我来了个 81+ 美刀的账单。
vps 的配置 两台的配置都一样，只是地区不同。一台新加坡，一台美国
512 MB 的内存
2 vCPUs
20 GB SSD
1 TB 的流量（包含输入和输出）
这次用量情况   11 月份一个月全开一个月
  流量：新加坡地区用过了 199+ G；美国地区用了 564+ G，均未超过各自的流量限额 1T。
  遇到的情况 本次账单计算了 vps 的费用后，两个地区的流量都另外单独收费了，新加坡单价是 0.12 美元/G，美国单价是 0.09 美元/G。但我并没有超过流量。
处理结果 最后，在和客服沟通后，免除了本次账单，但客服并没有给我解答为什么流量不计算在内，我又追问了一次，等客服后续怎么回答我吧。</description>
    </item>
    
    <item>
      <title>快闪东京 20231208</title>
      <link>https://tourcoder.com/youtube-flash-mob-tokyo-2023-12-08/</link>
      <pubDate>Sun, 10 Dec 2023 13:48:09 +0000</pubDate>
      
      <guid>https://tourcoder.com/youtube-flash-mob-tokyo-2023-12-08/</guid>
      <description>去了趟东京，剪了段视频
观看地址：YouTube</description>
    </item>
    
    <item>
      <title>快闪富士山 20231207</title>
      <link>https://tourcoder.com/youtube-flash-mob-fujisan-2023-12-07/</link>
      <pubDate>Fri, 08 Dec 2023 03:15:32 +0000</pubDate>
      
      <guid>https://tourcoder.com/youtube-flash-mob-fujisan-2023-12-07/</guid>
      <description>去了趟日本的富士山，感觉还不错。剪辑了段视频，放在了 YouTube。
观看地址：快闪富士山</description>
    </item>
    
    <item>
      <title>OpenAI Maybe a Dark Dangerous Monster</title>
      <link>https://tourcoder.com/openai-maybe-a-dark-dangerous-monster/</link>
      <pubDate>Thu, 23 Nov 2023 16:02:33 +0800</pubDate>
      
      <guid>https://tourcoder.com/openai-maybe-a-dark-dangerous-monster/</guid>
      <description>截止到现在，混乱的 OpenAI 内斗应该盖棺定论，不过也不确定，毕竟上次刚说 Altman 等人要去微软的，而现在又回到 OpenAI了。关于这次的内斗，网上有大量的报道，我就不复述了，只是说说我的一些疑惑和担忧吧。
  整个事件过程像过家家似的，一会这样，一会那样的，完全不是一个可能控制着人类，甚至这个星球命运的公司的成熟状态。
  OpenAI 的 770 雇员中的 700+ 人用辞职「威胁」董事会让 Altman 回来，我看到的并不是团结，而是恐怖和疯狂。这恐怖和疯狂会不会引发下一次灾难性的事件发生？
  到现在，董事会只是用了一个简单的官方说法「Altman 不诚实且撒谎了」来罢免 Altman 等人，但并没有给出完整的证据链，比如具体撒了什么谎。还是说董事会只是被一两个人给玩弄了，被当枪使了？
  不知道网上爆出来的新董事会成员名单是否为最后的名单，但如果是这样的话，这个名单里的人根本是不合格的！
  静观其变吧，但我是现在不会完全相信 OpenAI 背后的人了。</description>
    </item>
    
    <item>
      <title>如何可靠的用上 ChatGPT</title>
      <link>https://tourcoder.com/how-to-use-chatgpt-in-a-reliable-way/</link>
      <pubDate>Wed, 25 Oct 2023 20:47:25 +0800</pubDate>
      
      <guid>https://tourcoder.com/how-to-use-chatgpt-in-a-reliable-way/</guid>
      <description>实在有点无法接受到现在这个阶段了，还有人继续用着「能用上 ChatGPT Plus 的订阅」这种事情当噱头来搞什么知识付费什么的，我分享一种方法吧。
准备工作 这个办法有一定的局限性，但很可靠。
  一台 iPhone/iPad
  一张外币信用卡，比如 visa，万事达等
  ChatGPT 账号 注册一个 ChatGPT 的账号，需要三个东西
  干净可靠的 IP 地址，可以用 warp 解决。
  一个电话号码，沃达丰的卡很便宜，海鲜市场 20 块钱一张，而且该卡保号成本低，能长期持有。Unit
  Gmail 邮箱
  有了上面三个东西，就可以很顺利的注册 2 个 ChatGPT 账号。注册时候，直接输入 Gmail 邮箱就行，并不需要通过 Google 账户登录的方式。
美国区的 Apple ID 注册美国区的 Apple ID 非常简单，直接在 Apple ID 的官网就可以注册，点这里直接创建就行。以前还有一个方法就是打开美国区的 App Store，选择一个免费的应用，下载它，在下载的过程中创建一个美国区的账号，也行。
美国区的 Apple ID 充值，可以参考我以前写的这篇文章，这里介绍的是官方提供的充值方法。这里说句题外话，很多人喜欢从支付宝第三方卖家那边买那些所谓的礼品卡，尤其是非常零碎的金额的，我是真不知道他们怎么想的。
订阅 ChatGPT Plus 在 iPhone/iPad 设备上登录美区的 Apple ID，打开 ChatGPT，直接在里面订阅即可。</description>
    </item>
    
    <item>
      <title>我眼里的旅游</title>
      <link>https://tourcoder.com/tourism-in-my-eyes/</link>
      <pubDate>Sun, 22 Oct 2023 12:22:11 +0000</pubDate>
      
      <guid>https://tourcoder.com/tourism-in-my-eyes/</guid>
      <description>我眼里的旅游应该是这样的
  既然出来玩了，就要舍得花钱。
  条件允许的话，时间应该尽可能的长一点。
  除了去一些游客景点外，更应该穿街走巷，感受当地人的生活状态。
  吃当地人吃的东西，喝当地人喝的，体验他们的生活。
  不要脑子里把当地和任何一个地方比较，尤其是和自己的居住地比较，甚至上升到一些莫名其妙的“国家地域的高度“。
  不要尝试去“建设”当地，觉得当地应该怎么样，要怎么做，要怎么发展；更不要因为当地好，就觉得自己的居住地怎么样，该如何发展等。
  牢记，自己只是来这个地方旅游而已。目的是通过短暂的居住，感受另外一个生活状态，给自己的身心休息一下。
  </description>
    </item>
    
    <item>
      <title>大阪京都四日 202310</title>
      <link>https://tourcoder.com/youtube-4-days-in-osaka-and-kyoto-202310/</link>
      <pubDate>Sun, 22 Oct 2023 10:39:52 +0000</pubDate>
      
      <guid>https://tourcoder.com/youtube-4-days-in-osaka-and-kyoto-202310/</guid>
      <description>去了趟大阪和京都，来回四天，一切挺好，就是待的时间短了点。剪辑的视频在 YouTube 上观看。
第一天 中午的飞机，起飞晚点了半个小时，但到大阪的时间却很准时。因从机场打车到酒店的话要人民币 1000 多元，所以还是坐的机场大巴和地铁到的酒店。Check-in 后就去心斋桥闲逛，在那边吃了在大阪的第一餐。
第二天 一天的时间都是在京都动漫里当 NPC，每一个场景都很好看，动漫中的一户建，鸟站电线，铁路线上的路口，等等。傍晚的时候来到了稻荷山山顶，千本鸟居的尽头，在半山腰看了晚霞下的京都。
第三天 一天的时间都在逛大阪，通天阁，天守阁等等。
第四天 去梅田坂急买了东西，还有一些伴手礼，夜里飞到上海。
全程请看在 YouTube 上的视频。
一些心得 通讯：一张淘宝上买的当地流量卡（我老婆用）；一张海外的电话卡（我日常用的，海外的登录联系信息都是它，比如订酒店的联系电话）；移动无忧行的海外流量套餐（备用，缺点是通过它的流量都要经过中国境内，无法直接上外网，比如无法直接打开 Google map）
天气：天气是真的好，在的四天，天空都是瓦蓝瓦蓝的。
环境：不管是路上还是住处，到处都是挺干净的。
吃：基本是可以随便吃，也基本都很咸，咸的齁人的那种。可以去大商场下面的饮食区买吃的，不怎么咸。整体食物价格也蛮便宜。寻求点当地气氛的，可以去非游客区的居酒屋。
行：打车挺贵的，租车还好但停车费好贵！公交地铁非常方便，强烈建议公交地铁出行。
玩：景点也不少，因为是岛国，所以地势并不是特别平坦，出行尤其是去各种神社景点，一定要穿个运动鞋。</description>
    </item>
    
    <item>
      <title>记一次从中国银行内陆支行向汇丰银行香港的转账</title>
      <link>https://tourcoder.com/transfer-from-boc-china-mainland-branch-to-hsbc-hk-branch/</link>
      <pubDate>Sat, 07 Oct 2023 11:53:43 +0000</pubDate>
      
      <guid>https://tourcoder.com/transfer-from-boc-china-mainland-branch-to-hsbc-hk-branch/</guid>
      <description>通过中国银行大陆的银行账户给自己的香港汇丰的银行账户汇了 500 港币，产生两笔手续费，共计人民币 93.6 元。
这两笔手续费分别是
  对私中国港澳台地区发电电讯费
这笔费用是 57.60 元。应该是 80 元，不知道什么原因打折了。
  个人跨境本外币点回手续费
这笔费用是 36 元。这里应该是千分之一收取，最低 50 元/笔，也似乎打折了。
  研究了下其他银行的条款，下次还是用汇丰国内的账户内转吧。另外，目前还没有到账。
后续 简直了，在过了四天后，到账了。原因是周六周日虽然大陆地区是上班的，但香港银行是不上班的，不算工作日，一直到周二才到账。离谱的是 500 港币实际到账 400 港币，原因是中转行又扣了 100 港币。
参考资料  关于它们的解释和收费，可以看中国银行官方文档。  </description>
    </item>
    
    <item>
      <title>一次无法作为参考的汇丰银行香港开户经历</title>
      <link>https://tourcoder.com/an-account-opening-experience-with-hsbc-in-hong-kong-that-cannot-be-used-as-a-reference/</link>
      <pubDate>Thu, 28 Sep 2023 12:07:06 +0000</pubDate>
      
      <guid>https://tourcoder.com/an-account-opening-experience-with-hsbc-in-hong-kong-that-cannot-be-used-as-a-reference/</guid>
      <description>去香港办事，顺道开了个汇丰的账户，是免费的 HSBC One 账户，过程和网上各位分享的都不太一样，且听我慢慢说来。
一天早上八点多在香港街头找早饭吃，路过汇丰银行的网点，发现好多人排队在等开门。吃完溜达一下已是九点多，回酒店再次经过网点，没人排队，我不知道自己哪根筋抽了，就去前台取了个号，被告知我的号要下午两点才能轮到。随即回酒店然后出门办事去了。下午办完事也接近两点半，心想去银行看看吧，我对能开户成功是没有信心的，因为我看过网上的攻略，都说要各种证明，什么地址证明，入境小票什么的，可我都没有准备。
到了银行，又等了半个小时，轮到我了。开户的工作人员和我简单聊了下，大概就是问我开户的用途，我回答是方便以后在香港存钱取钱用。而后她只问我要了港澳通行证，我还特地询问了下是否需要出入境小票还有地址证明，但得到的回复是不需要，就让我下载 HSBC HK 的 app，在线开户。
但很郁闷，在线没有申请成功！！！工作人员拿着开户失败的信息去问了下后台，得到的答复是人工帮我开户，然后我俩就在那边边聊天边等她操作完。没过一会，账户开好了，然后她又去给我取了卡和密码纸，告知我去机器存或者转入 100 港币激活账户。
至此，开户完成了。</description>
    </item>
    
    <item>
      <title>电影观后感：孤注一掷</title>
      <link>https://tourcoder.com/movie-gu-zhu-yi-zhi/</link>
      <pubDate>Wed, 09 Aug 2023 13:47:58 +0000</pubDate>
      
      <guid>https://tourcoder.com/movie-gu-zhu-yi-zhi/</guid>
      <description>看了电影「孤注一掷」，有点感受，讲两个小故事，其实算是同一个故事。
2016-2017 年那会，我赔光了钱，极度缺钱。在 v2 上看到一个高薪招聘的帖子，特别适合我，彷佛是为我量身定制。我尝试联系了对方，对方是在柬埔寨西哈努克的支付公司。他在电话里对我进行了面试，然后告诉我我太符合他们的要求了，急需我这样的人才。他还说，他是上海人，老婆孩子都在上海，他每一两个月就会回上海看看老婆孩子。他热情邀请我过去，给我买好来回机票，如果我去看了，不满意，我随时可以走。他还在给我发了大量那边海边的照片，都是没有人在里面的照片。给我开的工资是八万一个月。
也是同一年的事情，我那会认识有几年的人，给我介绍一份工作。说他以前的同事在泰国一个游戏公司工作，那边缺人。说以我的工作能力，至少五万一个月，他介绍我过去。
我那时候太缺钱了，都开始考虑动身了。尤其是第二份工作，一是熟人介绍，二是我觉得我的能力八万一个月可能不够格，但五万问题不大。但我最后并没有去，原因是那时候我结婚了，我讨厌夫妻分开的生活。
就这样，我错过了几个亿，但我保住了腰子。</description>
    </item>
    
    <item>
      <title>通过 GitLab Console 重置用户密码</title>
      <link>https://tourcoder.com/reset-user-password-for-gitlab-user-via-console/</link>
      <pubDate>Tue, 08 Aug 2023 08:46:22 +0000</pubDate>
      
      <guid>https://tourcoder.com/reset-user-password-for-gitlab-user-via-console/</guid>
      <description>可以通过 ssh 登录服务器重置 gitlab 用户密码，一般是重置管理员密码，因为一般用户的密码完全可以通过管理员后台来重置。
ssh 登录到服务器，然后执行 gitlab-rails console，在出现提示符后，输入 user = User.where(@root).first，再输入 user.password=&#39;Aa123456@&#39;，最后输入 user.save!。</description>
    </item>
    
    <item>
      <title>未来几年，你应该准备的东西</title>
      <link>https://tourcoder.com/what-you-should-prepare-in-next-few-years/</link>
      <pubDate>Mon, 17 Jul 2023 11:26:54 +0000</pubDate>
      
      <guid>https://tourcoder.com/what-you-should-prepare-in-next-few-years/</guid>
      <description>作为一个生活在洼地，但时刻会翻到外面，看大量信息，还会思考的我，对未来生活在洼地有一些担忧和恐惧，也尝试着给自己列了一个清单，算是做点准备吧。
 手机  一部非国行的手机，一定要有 eSIM 卡功能的。我推荐 Google Pixel。
 电话卡  一个带有网络流量的电话卡或者纯流量卡也行，电话号码可以用 Google Voice。上面说到的带有 eSIM 卡的手机功能就体现出来了，可以随时的通过 eSIM 激活一个境外的电话卡。比如 Google Fi 等。
 护照  护照上一定要有一些好的签证，洼地的好朋友们的签证就不要了。
 银行账户  有两三个海外的银行账户，一定要是合法合规的办理的，靠谱的账户。如果可以，也应该开个类似 schwab 这样的理财账户。
 比特币或者 USDT  看我博客的大部分是程序员，动手能力应该超强。怎么说呢，如果你承受力还行，买点比特币或者 USDT。
 一个海外公司  这很重要，它能成为你的避风港。
 正当的理由  一个「正当」的理由，给自己，也给别人。
这些都是我自己的所做的，有些东西可能会用不上，但不能等到真用上的时候再去办，一切都来不及的。</description>
    </item>
    
    <item>
      <title>为什么我不用 Threads</title>
      <link>https://tourcoder.com/why-i-do-not-use-threads/</link>
      <pubDate>Sun, 09 Jul 2023 00:35:49 +0000</pubDate>
      
      <guid>https://tourcoder.com/why-i-do-not-use-threads/</guid>
      <description>最近，扎克伯格推出了类 twitter 的应用 threads，极短的时间里涌入几千万人，很有可能打破互联网产品的破亿记录，目前这个记录由 openAI 前段时间刚刚打破。一时间，扎克伯格和马斯克剑拔弩张，关于这个就不说了，这里只说我为什么不用 threads 吧。
过往旧事 我不用扎克伯格的产品得从十几年前说起，那时我注册了个 Facebook 账号，在上面玩得很开心。过了一段时间,等我再次登录时，无法登录，尝试找回密码，却发现我的账号是别人的了，更离谱的该账号还用的是我的 email 地址。我尝试重置密码，通过 email 验证后，卡在了好友识别认证。给了我一堆印度人的照片，让我找出哪几个是我的好友，可我连个印度朋友都没有，更不会有印度的 Facebook 好友。我还花了很多时间，尝试了各种方式和 facebook 的人联系，终是无法解决。
直到今天，那个人（也许是一个黑客）还在用着我的那个账号，我时不时会收到那个账户的邮件。也是从那时起，我不再使用 Facebook 系的产品，这也影响到我对 Instagram 的使用。我以前是重度的 Instagram 用户，但在被 Facebook 收购后，我几乎不再使用，只是会偶尔上去看看老照片。
归根结底一句话，我不相信扎克伯格。
联邦宇宙 除了扎克伯格的王牌社交产品的天赋外，这次 threads 还有一个厉害的武器&amp;ndash;ActivityPub 协议，如果 threads 能像它所承诺的那样开放这个功能，我可以用任何一个支持 ActivityPub 协议的产品和 threads 上的人进行互动，比如 mastodon。
最后，我欢迎 threads 加入竞争，但我坚决不用。</description>
    </item>
    
    <item>
      <title>马斯克和扎克伯格</title>
      <link>https://tourcoder.com/musk-vs-zuckerberg/</link>
      <pubDate>Fri, 07 Jul 2023 13:22:56 +0000</pubDate>
      
      <guid>https://tourcoder.com/musk-vs-zuckerberg/</guid>
      <description>马斯克不是我的偶像，同样扎克伯格也不是，我小时候的偶像是已经去世几十年的李小龙，但长大后，我便没有偶像，偶像是一个让人很有负担的玩意。
扎克伯格的产品，我不用。准确说，我在十几二十年前用过 Facebook，本人注册。后来有天我的账号莫名其妙的是别人的了，我多次找 Facebook 处理这个事情，折腾了一年多，一直没有结果。直到今天，那个账号还用着我的 Email 地址作为登录名在使用那个 Facebook 账号，我能收到那个账号的所有通知消息。从那时起我隐约觉得扎克伯格是一个特别伪君子的人，便不再用他公司的产品。后来扎克伯格身上发生的很多事情，都验证了我的判断，他是一个彻头彻尾的伪君子。
马斯克的产品，我用了两个，PayPal 和特斯拉。早些年付钱给海外的服务器和海外服务，PayPal 最方便，现在我也基本不用了，而且我用它的时候，也早已经不是马斯克的。至于特斯拉，我因为一些不爽的事情近期新买的，并不是因为马斯克本人。我对马斯克这个人的的评价一直也很清晰，真小人。
相比较扎克伯格这个伪君子，我可能更偏向站边于马斯克这个真小人，因为我只反感真小人，但极度厌恶和提防伪君子。但这一次我站在扎克伯格这个伪君子的一边。
使用互联网这么多年来，我一直喜欢三个方向的产品，我曾在我的博客推特上都有说过下面一段话。
我喜欢三种服务。
  Twitter 类：信息无阻碍的分享，扩散，流转是件很酷的事情，信息流很美。
  Email 类：我从刚接触互联网时就痴迷它，我太喜欢这个沟通方式了。我研究了几乎所有的曾出现过的这类服务，看别人用自有邮箱，我都会习惯性研究下。另外，IM 在我看来是对 Email 的扩展。
  笔记类：从记录到整理，再到展现，似乎和人生这张白纸相互辉映
  推特是排名第一的，在过去的快二十年时间里，相信很多人和我一样，从推特上获取信息，在推特上分享信息，几乎每天都会打开，即便后来有些不可抗力阻挡，但我们依旧通过技术和能力打开推特，继续获取和分享。而推特在这快二十年时间里也很好地扮演着自己该有的角色，直到马斯克收购了它。
诚然，马斯克有过人的 vision，但他想把推特变成一个封闭的社区，这已经改变了推特的 DNA。从那刻起，一切都变了，最为显著的是好玩有用的分享没有了，取而代之的是大量给推特交了保护费的色情招嫖账号在光明正大的发色情图招嫖信息；本来信息分享流通的圣地变成了一个个人崇拜的粪坑，而他马斯克是这个粪坑里唯一的 KOL。
很多人反抗，开始逐步离开，迁移到其他类似服务，但效果不佳，直到扎克伯格做了类似的服务 threads。不评论 threads 的结果如何，虽然我认为它能成的概率不高。也许是因为扎克伯格做社交的王炸体质，马斯克害怕了，推特上这几天都是各种嘲讽指责咒骂扎克伯格的帖子，甚至很多连个头像都没有，但马斯克都能精准的找到这些帖子，回复一下点赞一下，呵呵，果然小人作风。
更为讽刺的是，当初马斯克开始祸害推特时，大家不满，他弄了两次投票问大家他是不是应该下台，两次投票大家都要求他下台，第一次被他作废，第二次他说他会找一个足够愚蠢的人来接替他。后来这个愚蠢的人找到了，但只是一个傀儡，马斯克依旧在后面操控一切。而在这次，这个傀儡居然大言不惭的发推说他们在乎大家的感受，还特别大写 YOU 强调重视我们。
 这是原推，下面一群人在嘲讽她，当然我也会怼回去，给她留下了下面这段话，我也给她大写的 YOU。
 关于推特和 threads，扎克伯格的一句话我还是蛮认同的，应该有一个十亿人交流沟通的公共平台，推特有机会这么做，但它却无视。
 而现在看来，马斯克不是不知道推特的使命，只是他不想这么做，他只是想把推特做成自己的一个玩具罢了。</description>
    </item>
    
    <item>
      <title>React 学习笔记</title>
      <link>https://tourcoder.com/learn-react-step-by-step/</link>
      <pubDate>Sun, 25 Jun 2023 06:18:06 +0000</pubDate>
      
      <guid>https://tourcoder.com/learn-react-step-by-step/</guid>
      <description>一直以来，我在学习一个新的框架或语言的时有个特别的习惯，用这个框架或语言写一个博客系统，这几乎成了我用新技术写东西的 “hello world”，这次学习 react 也不例外。至于 react 是什么，可以看其官网介绍。
学习内容和目的 学习 react 的内容，并用它写一个博客系统。博客的主要内容有：
前台
  文章列表页（首页）
  文章详情页面
  访客评论
  后台
  登录
  文章列表
  文章编辑
  文章删除
  登出
  准备工作 安装好对应的环境，比如 node，npm（yarn），npx，mongodb（本项目所用的数据库）
初始化 初始化 blog 应用
通过 npx create-react-app blog 命令初始化创建一个名叫 blog 的 react 应用，执行该命令后，在 loading 一段时间后就会创建这个 blog 应用。其结构如下
 在 public 文件夹下的文件中
  favicon 是个性化图标
  index.</description>
    </item>
    
    <item>
      <title>关于自己的网络代表物</title>
      <link>https://tourcoder.com/losing-our-brand/</link>
      <pubDate>Tue, 16 May 2023 07:08:23 +0000</pubDate>
      
      <guid>https://tourcoder.com/losing-our-brand/</guid>
      <description>前几天，看到马斯克的推文说，推特计划清理不活跃的账户，并且会回收并释放出 username。我的内心有点唏嘘，当时想写篇感受，一拖就拖到现在。
在网络上能代表自己的东西少之又少，更不要说那些能形成自我独立品牌的东西。
域名，博客，播客 域名，博客，播客，这些就像是自己的信息发射塔。借助它们，我可以通过文字，声音，图像向这个世界发出自己的声音，分享自己的故事。
Email Email 就是自己网络上的地址，可以通过它，能接收来自任何一个人的交流信息。
SNS 及 handle(username) 当年在 SNS 上拥有一个自己心仪的 handle(username) 是件挺难的事情，而拿到这个 handle(username) 后几乎都倍加爱惜。
现在随着这些政策的改变，真能留下来的又有几个呢？</description>
    </item>
    
    <item>
      <title>我的翻墙服务器设置</title>
      <link>https://tourcoder.com/fml/</link>
      <pubDate>Mon, 15 May 2023 23:30:08 +0000</pubDate>
      
      <guid>https://tourcoder.com/fml/</guid>
      <description>我写这篇文章只是分享我是如何设置自己的 fml 服务的。
准备工作 有时候，生活学习中比较糟糕的一个情况是想查的资料没法查，想用的服务被屏蔽。所以，我尝试用网上各位大牛们写的东西，组成自己的 fml 服务，让自己能在网络的世界里尽可能的自由穿行。
  VPS
VPS 的选择有很多，我目前选择的有两家，Amazon 的 AWS Lightsail 和搬瓦工 CN2 GIA 线路的 VPS。我是专机专用的原则，即将这些 VPS 仅作为代理使用。
名词解释：CN2 GIA 全称 China telecom Next Carrier Network- Global Internet Access ，其路由线路上骨干节点的 IP 均为 59.43 开头的。
  系统
我主要用 Debian 的系统，习惯性升级到最新的内核和系统。
升级系统
apt update -y apt upgrade -y 新建用户
用默认的账户是比较危险的事情，我都会创建个新账户，同时赋予这个账户 sudo 的权限以及能够通过密码的方式 ssh 到这台 VPS。
adduser fml usermod -aG sudo fml sed -ri &#39;s/^#?(PasswordAuthentication)\s+(yes|no)/\1 yes/&#39; /etc/ssh/sshd_config systemctl restart sshd 这里有个点：有时候不只是一个地方需要设置 PasswordAuthentication 为 yes，用 sudo grep -R &amp;quot;PasswordAuthentication&amp;quot; /etc/ssh 命令查看都有哪些需要设置的。</description>
    </item>
    
    <item>
      <title>我的投资学习日记</title>
      <link>https://tourcoder.com/how-to-invest/</link>
      <pubDate>Mon, 01 May 2023 09:15:55 +0800</pubDate>
      
      <guid>https://tourcoder.com/how-to-invest/</guid>
      <description>从今天开始学习下投资方面的知识，一直以来对这方面的知识不感兴趣，但也看过一些知识，也买过不少投资类的东西，比如支付宝里的基金，比特币等，但一直处于一个似懂非懂的状态。
PS. 所有的内容从 2023 年 05 月 01 日开始。
投资日历 2023 年
   日期 买或卖 原由     05-01 买入：GOOG 20 股 谷歌这个月要开发布会了，有几款重磅产品，看涨    学习和心得 投资中的 GP, LP, PE, VC 以及 FOF 的讲解，https://www.zhihu.com/question/20062244</description>
    </item>
    
    <item>
      <title>一个笔记应用</title>
      <link>https://tourcoder.com/a-note-app/</link>
      <pubDate>Sun, 30 Apr 2023 00:59:55 +0000</pubDate>
      
      <guid>https://tourcoder.com/a-note-app/</guid>
      <description>我一直喜欢三类应用，Twitter 的信息流类，Email 类和笔记类，这个我在推特上说过，打不开链接可以看截图。
我所理解的笔记 笔记犹如人生，开启的时候白纸一张，使用简单，记录下内容就会被保存在那里。整个过程就三个点
graph LR A(记录/收集)--B(整理/学习)--C(保存/回顾)  市面上有很多非常优秀的笔记应用，但在使用它们的时候，我或多或少的感觉到有点别扭，要么使用复杂，要么不轻便。
现在是时候写一个笔记类的应用了。
方向选择 我有两个方向来做这个笔记应用
  服务器主导
一切以服务器为主，服务器端提供 API 接口，客户端服务于服务器端。
  客户端主导
以客户端为主，数据存储同步等借用第三方，比如 iCloud，Google Drive 等。
  这两种方式各有各的特色，也各有个的优劣势。比如第一种方式要注意多个客户端和服务端的同步的问题等，我选择服务器主导这种方式。
技术栈 最近学习 React 和 Firebase，心血来潮，更新下技术栈，Web 端用 React，后端用 Firebase，应该可以节省不少时间出来。
  Web client：React
  Browser Extension：Plasmo
  Backend: Firebase
  产品特点 之前自己想了很多，觉得产品有不少特点，但现在真的做的时候发现这个产品没有什么特点。
是否开源 我会将它通过 MIT 协议开源在 GitHub 上。地址是 https://github.com/binge。
未完待续</description>
    </item>
    
    <item>
      <title>Podman 和它的一切</title>
      <link>https://tourcoder.com/podman-and-its-more/</link>
      <pubDate>Sat, 29 Apr 2023 10:46:20 +0000</pubDate>
      
      <guid>https://tourcoder.com/podman-and-its-more/</guid>
      <description>在 Docker 各种“威胁”后，我决定尝试用 Podman 来替代 Docker。这篇文章会记录我在使用 Podman 的过程中遇到的问题和解决方案，应该是不定期更新的。
安装 Podman 的安装比较简单，在 macOS上直接用 Homebrew 安装
brew install podman 而在其他系统下安装 Podman，可以参看官方文档。
初始化 和 Docker 不一样，Podman 需要初始化
podman machine init podman machine start 拉起容器 比如我需要拉起一个 MongoDB 的容器，则可以使用
podman run -d --name mongo -p 27017:27017 mongo 其实 Podman 在使用上和 Docker 差不多，命令行及参数也基本一致，可以去官网看详细的介绍。
遇到的问题   在 macOS 中映射到本地硬盘时遇到 Error: statfs: no such file or directory 的问题
解决办法：初始化 machine 的时候，增加 -v 宿主目录:容器目录 参数，然后启动 machine 即可
podman machine init -v /Users/nnn:/home/mmm   在 macOS 中遇到映射到本地硬盘后，容器无法启动的问题</description>
    </item>
    
    <item>
      <title>通过 CSS 设置自动暗黑模式</title>
      <link>https://tourcoder.com/set-dark-mode-in-css/</link>
      <pubDate>Fri, 28 Apr 2023 14:21:06 +0000</pubDate>
      
      <guid>https://tourcoder.com/set-dark-mode-in-css/</guid>
      <description>把自己的个人介绍页面设置了下自动暗黑模式，即当白天的时候，页面显示为白色背景，当晚上的时候，页面显示为黑色背景。这样可以让页面更加的舒适，也可以让自己的眼睛更加的舒服。
第一步：先在 head 里声明 color-scheme，这个属性是用来声明页面的主题颜色的，有两个值，一个是 light，一个是 dark，分别代表了浅色主题和深色主题。
&amp;lt;meta name=&amp;quot;color-scheme&amp;quot; content=&amp;quot;light dark&amp;quot;&amp;gt; 也可以通过 :root { color-scheme: light dark; } 在样式表里声明。
第二步：通过 @media (prefers-color-scheme: dark) 来实现调用，比如当系统主题为白色的时候是默认的样式，而当系统主题为黑色的时候，就会调用 @media (prefers-color-scheme: dark) 里的样式。
body { background-color: #fff; } @media (prefers-color-scheme: dark) { body { background-color: #000; } } 上面表示当白色主题时，页面的背景色是白色，而当黑色主题时，页面的背景色是黑色。其他的设置也按这个操作即可。</description>
    </item>
    
    <item>
      <title>糟糕的 Instagram 密码设置</title>
      <link>https://tourcoder.com/weird-on-instagram-password-settings/</link>
      <pubDate>Thu, 20 Apr 2023 06:49:41 +0000</pubDate>
      
      <guid>https://tourcoder.com/weird-on-instagram-password-settings/</guid>
      <description>偶然发现了两个 Instagram 奇怪的密码重置的设定，感觉是 bug。
问题一的步骤   打开已经登录的 Instagram 的应用，修改 Email 地址。一般情况下，都会要求验证新的 Email 地址，但这里不操作。
  点击「忘记密码」，会发现重置密码的邮件发送到了未验证的 Email 地址去了。
  问题二的步骤   点击「忘记密码」，会收到一封 Email。
  邮件中有两种方式可以登录 Instagram 账户，点击第一次，通过链接登录。
  而另外一个方式「修改密码」就会一直有效，没有过期的时间。
  太糟糕了。</description>
    </item>
    
    <item>
      <title>我一点都不喜欢现在的 web3.0</title>
      <link>https://tourcoder.com/i-do-not-like-web3.0-at-all/</link>
      <pubDate>Tue, 18 Apr 2023 13:51:29 +0000</pubDate>
      
      <guid>https://tourcoder.com/i-do-not-like-web3.0-at-all/</guid>
      <description>我所说的 web 3.0 并不是现在所谓的 web3，即现在的基于区块链形式的呈现方式。我的 web 3.0 是和以前的 web 1.0，web 2.0 一样的，是一种互联网的形式，而现在的形式，我是真的一点都不喜欢它。
我个人认为
互联网的 web 1.0 时代的主题是连接，通过一根根网线，一个个 html 的网站将我们从世界各地连接起来，让我们联系到远在地球另一个角落的人。
互联网的 web 2.0 时代的主题是分享，2.0 时代的人都喜欢分享，乐于分享。博客，Twitter，YouTube，Instagram，Facebookd 等等，都是这个时代的代表，大家分享着自己的生活，分享着自己的想法，更重要的是分享着可分享的资源，每个人在这当中找到了乐趣，学到了更多的知识。
互联网的 web 3.0 时代的主题是收费，至少目前看是这样的。它似乎已经失去了 2.0 的分享精神，什么都想收费。比如那个比较火的知识付费，如果是高深的知识付费理所当然，但极其简单的知识都要收费，利用的大家一时的不了解收费。举个例子，最近比较火的 ChatGPT，我看到好多人，在微信开个直播，在那边说一些不知所谓的话，然后开一个课程收费，课程就是「如何使用 ChatGPT」，说真的，我觉得很无耻，这种收费。
希望 web 3.0 时代能够回归到 2.0 时代的分享精神，而不是像现在这样，一切都想收费。</description>
    </item>
    
    <item>
      <title>梳理下自己银行账户被封的事情</title>
      <link>https://tourcoder.com/my-bank-account-got-blocked/</link>
      <pubDate>Wed, 22 Mar 2023 10:22:58 +0000</pubDate>
      
      <guid>https://tourcoder.com/my-bank-account-got-blocked/</guid>
      <description>我接了一笔钱，银行账户就被封了，所以我想把这件事情分享出来，希望大家能够从中学到经验，预防被骗。大致的过程是这样的：
  我用自己的银行卡接了一笔钱。
  当我要用钱的时候，发现银行账户被封了，去银行，被告知我的账户是被外地的某公安局封的。
  拿着银行给的证明，去了我所在地的派出所，但派出所的人说无法处理，让我自己联系封锁的公安局。
  联系了封锁的公安局，对方说 5 个工作日内给我答复。我不认同，请他们尽快帮我处理。
  过了个周末，前天，也就是周一，我接到他们的电话，被告知他们核实了，并把我的账户解封了。
  但我的账户还是被封着，我又去了银行。银行说，之前的封锁单位的确把我账户解封了，但现在又有几家公安局把我的账户封了。
  我又去了派出所，派出所的人还是说，他们还是无法处理，让我自己联系封锁的公安局。
  一家一家联系吧，昨天我联系了一家，说 3 个工作日给我回复。
  今天上午接到他们的回复说，有人受害人报案说遭受到电信诈骗，我是一级。所谓的一级就是受害人直接把钱转给我了，变相的我成了诈骗犯，或我犯有帮信罪。
  我非常不认同对方的说法，并告诉他们，我不认同的原因是，在等他们回复的过程中，我发现一些前面封我账户的公安局已经撤销了对我账户的封禁，说明我账户并没有事情。另外，他们认为我是一级，帮信这些是和其他公安局对我账户的定性是非常矛盾的。
  我还告诉对方，我想知道是哪些证据证明我诈骗或者帮信了。并且也告诉对方，我是不会去他们所在地的公安局的，我也和我所在的派出所说过了，如果有他们有需要，可以发函给我所在地的派出所，要求协助调查。
  今天下午，我又接到他们的电话说，我现在不是一级，而是二级。二级的意思是，被骗的人的钱转到了别人账户，然后别人又转到我这里了。我感觉他们好随意，并问他们什么时候解封我的账户？他们说让我等着他们把案件办理完。同样我不认同，但他们所长现在不在，所以我需要周五打电话过去，和他们所长咨询。
  以上是整个过程的大概情况，目前账户还是被冻结着，出于程序员该死的逻辑心，我简单分析了下这次的事情。
 这是一个大概过程，很多地方的人被骗了钱，在各地报警，然后各地的公安局就从接收被害人钱的账户开始，一层一层的封。就这样，导致了我的账户被多个地方的公安局封了。
其实我这里是有一个疑问的，有这么多公安局都顺藤摸瓜封锁到我的账户了，那么这个给我打钱的诈骗账户应该被公安局早就查到，早就冻结了才对，为什么这个账户里还能转钱出来呢？不解。
如何做好防范和处理   不要接受陌生人的转账，尤其是转账金额很大的。准确说，不要把自己银行卡卡号暴露出去。更不要把自己的银行卡借给任何人。
  万一遇到这种事情了，先确认下，你是不是真的没有参与非法的事情，如果确定没有参与，不要怕，留下所有的证据（比如为什么会有这笔转账，你和对方的聊天记录等），就事论事的处理。
  如果自己应付不来，请个律师。要知道，这事情如果搞成帮信罪就很麻烦了，除了罚款之外，还有可能会被判刑坐牢。
  切记，冷静处理，不要怕，不要慌。</description>
    </item>
    
    <item>
      <title>如何在 hugo 中集成 mermaid</title>
      <link>https://tourcoder.com/how-to-integrate-mermaid-in-hugo/</link>
      <pubDate>Thu, 09 Mar 2023 10:10:41 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-integrate-mermaid-in-hugo/</guid>
      <description>Mermaid 是一个能通过 markdown 画流程图，甘特图等图表的库，我很喜欢。今天尝试将它集成到 hugo 的系统里。
  在主题中引入 mermaid 的库文件，比如在 footer.html 文件中引入该库文件
&amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/mermaid/9.4.3/mermaid.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;   利用 hugo 中的 shortcodes 来实现对 mermaid 的载入，在 shortcodes 里创建 mermaid.html，并将下面的代码输入进去
&amp;lt;div class=&amp;quot;mermaid&amp;quot;&amp;gt; {{ safeHTML .Inner }} &amp;lt;/div&amp;gt;   最后看效果，比如
graph LR A(Hello)--B(One) A--C(Two)  这个流程的写法是
graph LR A(Hello)--&amp;gt;B(One) A--&amp;gt;C(Two) 当然需要用 &amp;lt;mermaid&amp;gt; 和 &amp;lt;/mermaid&amp;gt; 将上面代码包含在里面。
  至于 mermaid 还有哪些用法，去其官网看吧。
 官网地址：https://mermaid.js.org  </description>
    </item>
    
    <item>
      <title>如何加快获得新 Bing 的试用权限，并解决聊天时遇到的 Something went wrong 问题</title>
      <link>https://tourcoder.com/how-to-get-new-bing-with-chatgpt-and-fix-the-error-something-went-wrong/</link>
      <pubDate>Sun, 26 Feb 2023 08:35:14 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-get-new-bing-with-chatgpt-and-fix-the-error-something-went-wrong/</guid>
      <description>带有 chatGPT 聊天功能的新 bing 这些日子很火，以至于排队都要等很久才能拿到试用权限。有个简单的办法可能会更快的拿到试用权限，我也是申请第二个账号时偶然发现，具体是否一直有效，不详。
  准备一个注册年限长一点的微软账户
  在你的手机端下载 bing 这个 app，并加入到等待列表中（如何加入到等待列表，网上有太多的教程，我就不复述了）
  使用这个 bing 的 app，尽力去完成里面的 reward 任务。
  很快就可能收到试用通知（我的第二个账号就是连续做了两天 reward 任务后收到了通知）
  在手机端试用 bing 的 app 时会遇到一个问题就是 Something went wrong, Tap refresh or restart the app (code: E010003)。
有两个地方处理下，即可解决问题。
  需要将 bing 的访问通过科学上网来解决，在代理软件中增加一条规则 DOMAIN-SUFFIX,bing.com，让它走代理即可，基本就解决问题了。
  有的人做了上面的这步，问题存在，那是你需要设置下 bing 这个 app 的国家和地区。打开 bing 这个 app，点左上角的头像，点设置，点一般设置下的国家和地区，将国家和地区改成非中国的即可。
  至此，你可以顺利的使用新 bing 和同其聊天机器人了。</description>
    </item>
    
    <item>
      <title>Hugo 中最后更新的时间显示</title>
      <link>https://tourcoder.com/lastmod-in-hugo/</link>
      <pubDate>Sat, 11 Feb 2023 03:00:28 +0000</pubDate>
      
      <guid>https://tourcoder.com/lastmod-in-hugo/</guid>
      <description>我的这个博客是基于 hugo + GitHub + Cloudflre pages 构成，因为我不定期更新博客的旧内容，所以增加了个提示，即在博文下面提醒阅读者本篇博文的最后更新时间。
原始做法
在文章模板中增加 lastmod 字段，比如这篇博文
--- title: &amp;quot;Hugo 中最后更新的时间显示&amp;quot; slug: &amp;quot;lastmod-in-hugo&amp;quot; author: &amp;quot;Bin Hua&amp;quot; date: 2023-02-11T03:00:28Z tags: [&amp;quot;hugo&amp;quot;, &amp;quot;最后更新&amp;quot;] --- 每次更新这篇博文时，手动修改 lastmod 中的时间日期即可，但这个实在有点折腾。在查找文档和询问后，可以通过下面方式实现
当前做法
不更改模版中的内容，即不用增加 lastmod，通过修改配置文件来实现，在 config.toml 增加
[frontmatter] lastmod = [&#39;lastmod&#39;, &#39;:git&#39;, &#39;:fileModTime&#39;, &#39;date&#39;, &#39;publishDate&#39;] 具体的每个解释说明，可以看官方文档中的 Configure Dates。
至于引用，在主题模板中需要显示最后更新时间的地方增加 {{ .Lastmod }} 即可。</description>
    </item>
    
    <item>
      <title>正月十五下扬州</title>
      <link>https://tourcoder.com/going-to-yangzhou-on-the-15th-day-of-the-first-month/</link>
      <pubDate>Thu, 09 Feb 2023 02:27:01 +0000</pubDate>
      
      <guid>https://tourcoder.com/going-to-yangzhou-on-the-15th-day-of-the-first-month/</guid>
      <description>作为一个扬州乡下人，基本没怎么逛过现在的扬州城，主要是对它不感冒。这次有幸拖福，小逛了下扬州，简单的记录下了。算上从上海到扬州的来回，一共是两日一夜，几乎没怎么逛。所有的过程内容，都在这个视频里了，点 Youtube 观看。
还是说点建议吧。
  如果你处于正在减肥的时候，并不建议你来扬州，因为饮食都是碳水大开会，其实也不只是扬州了。
  行程时间安排的充足点，比如 3 天，除非特别喜欢，不然 3 天时间也够了。
  景点的东西少吃点，好吃的在小巷子里。
  煮干丝是黄汤的，其他的，就是扯。干拌面这种东西就不要吃了。狮子头，藕粉圆子这些试一下差不多就得了。包子我建议是三丁和菜的。
  不少东西是喜欢放胡椒粉的，提前有个心理准备。
  瘦西湖在四五月逛，更好看点。
  如果想修脚，记得提前和师傅说一下，不要出血。
  差不多就这些吧。</description>
    </item>
    
    <item>
      <title>记忆中的新年，回不去的年味</title>
      <link>https://tourcoder.com/happy-new-year-2023/</link>
      <pubDate>Fri, 27 Jan 2023 01:09:51 +0000</pubDate>
      
      <guid>https://tourcoder.com/happy-new-year-2023/</guid>
      <description>新年对我来说，现在更多的是一段段快乐的回忆。相比现在，小时候的新年更热闹，更有味。记忆中的新年味道很多，印象特深的有几个瞬间。
包子味：过年的前几天，家家户户都会蒸包子馒头糕。凌晨四五点醒来，跑进热气腾腾的锅屋（厨房），吃着新出笼的包子馒头糕，满足。
新衣服味：虽然平时也穿新衣服，但总觉得年三十那天穿的新衣服的味道不一样。当然，弄脏衣服被揍，也是在所难免。很好玩的是有一年，我把转炮点着后放到二哥的口袋里，等炮炸了后，二哥新衣服的口袋已经全是洞洞。
鞭炮味：新年是鞭炮的主旋律之一。从除夕的几乎响通宵，一直正月十五。空气中弥漫着鞭炮的味道。
捣蛋味：过年是我们最捣蛋最皮的时候，拿着鞭炮向小伙伴家里的院子堂屋里丢。叮咚铛子，还有雪向人后脖子塞。还有那个手枪到处对人打。
现在这些味道随着时代发展，越来越淡，甚至失去，但有过这些经历的人应该都会很怀念吧。</description>
    </item>
    
    <item>
      <title>Reborn in Jan 2023</title>
      <link>https://tourcoder.com/reborn-in-jan-2023/</link>
      <pubDate>Thu, 12 Jan 2023 15:00:25 +0000</pubDate>
      
      <guid>https://tourcoder.com/reborn-in-jan-2023/</guid>
      <description>刚从医院的急诊打完点滴到家，洗了个澡。这两天检查发现因为感染新冠，我的肺部感染了。在和医生一顿聊天后，医生给开了一天的吊瓶以及 6 天的药物，但并不建议我吃，建议我等肺部炎症自动吸收。
这次新冠感染过程，我会拍一个 vlog，对我来说，毕竟是一个大事情，闯过了这一关，自己新生。</description>
    </item>
    
    <item>
      <title>Died in 2022</title>
      <link>https://tourcoder.com/died-in-2022/</link>
      <pubDate>Tue, 03 Jan 2023 01:46:59 +0000</pubDate>
      
      <guid>https://tourcoder.com/died-in-2022/</guid>
      <description>本来是 2022 年 12 月 31 日写的这篇文章，因为新冠，身体实在难受，拖到今天才写，此刻我却不知道该怎么写，随便说几句吧。
  人生挺短的，别纠结太多事情。
  做成一件小事，好过做不完一件大事。
  钱很重要，它凌驾于很多事情之上。
  </description>
    </item>
    
    <item>
      <title>我怎么想的</title>
      <link>https://tourcoder.com/how-i-think/</link>
      <pubDate>Thu, 22 Dec 2022 12:12:47 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-i-think/</guid>
      <description>这篇博文源于上午一个朋友和我的对话。他上午问我要「布洛芬」时问我怎么会想到提前买这药的，其实我当时是很诧异他这个疑问的。
抛开我家里日常都会备着常见药物，而且我还会定期的清理补充这件事不说，就说这次的「退烧药」。
对新冠这件事，我一直是相信最后会走向永久共存，管控会放开。我自然就想如果共存了，到时候得病的人很多，医院药物肯定会挤兑，我就想如何在不去医院的前提下自己来处理，自己如何处理这个件事，就咨询了一些医生朋友，结果就是买点布洛芬对乙酰氨基酚之类的。同样，我了解了下这个药物的情况，所以我只根据家里情况买了两盒，加上家里本身还有一盒，三盒够用了，完全没有必要去囤。
这不是我有先见之明提前买药，而是下意识的思考，是一个惯性，甚至是常识。
但很可惜，很多人缺少了这个独立思考，习惯了有所谓的“家长”帮忙处理事情，自己只要「衣来伸手饭来张口」就行了，但可能么？？？</description>
    </item>
    
    <item>
      <title>搭建自己的节点之 Gotosocial 篇</title>
      <link>https://tourcoder.com/how-to-use-gotosocial/</link>
      <pubDate>Sun, 18 Dec 2022 05:55:03 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-use-gotosocial/</guid>
      <description>基于三个原因，我还是决定将自己的吃饭游玩日常打卡和叨逼叨的内容转移到自己的服务器
  我一直想把这些内容放在自己的服务器，之前自己也基于 hugo 写了个 hugo buzz(在 GitHub 上开源了)，并和自己的博客集成，玩了一段段时间，但有些东西不是很方便，后面就没有继续做下去。
  自从马斯克购买了推特后，推特变得越来越莫名其妙，我觉得我的推特迟早会被封号，毕竟以前也被封过一个号。
  我还是想再次折腾下分布式社交网络的，其实之前我有折腾股一段时间的 mastodon，但对我一个个人用户来说，mastodon 实在太吃资源太重了，没有必要。碰巧又发现了轻量级的 gotosocial，索性重新折腾。
  今天的主角就是 gotosocial 这个东西，关于它的介绍，可以去看其官网或者其在 GitHub 上的项目库，本文后我将附上这两个地址。
准备工作   VSP: 512M / 40G / Debian 11，因为 GoToSocial 占用资源很少，这个配置足够。
  Docker: 本次我是用 Docker 的安装方式，所以，需要在服务器上安装好 Docker，一键安装 Docker 和 Docker Compose 可以用我的脚本 Dockerman。
  Caddy: 我是将 GotoSocial 放在代理后面的，我用 Caddy 来对端口进行反代，当然也可以用 nginx 等。
  安装过程 官方有相关的英文教程，具体可以看这里，我这里用中文说下我折腾的过程
  创建文件夹
mkdir -p your_folder/data   将官方制作好的 docker-compose.</description>
    </item>
    
    <item>
      <title>一次治牙之旅</title>
      <link>https://tourcoder.com/a-journey-of-restorative-dentistry/</link>
      <pubDate>Tue, 13 Dec 2022 01:45:37 +0000</pubDate>
      
      <guid>https://tourcoder.com/a-journey-of-restorative-dentistry/</guid>
      <description>在今年初，一月份拔牙的时候，医生和我说我右侧七号牙被阻生齿给顶蛀了，让我去治疗一下，看是否能保得住。后来上海因疫情封控，加上我有点懒，就一直拖到前几天，那几天牙发炎厉害，主要是我着凉了，疼得我整夜睡不好。因为医生难约，只好先看急诊，医生只给开了头孢。就这样熬了几天后，终于约上医生了。
第一趟 这趟跑了个空，因为我约错了医生，我约了口腔外科的医生，但在九院治疗牙是口腔综合科，没辙，浪费了个挂号费。不过运气比较好，正好有号掉出来，立刻约上了第二天的综合科的医生。
第二趟 医生给检查了下，给了我两个方案
  要么去口腔外科去拔掉这颗牙
  要么做根管治疗，但我这颗牙做根管治疗有风险
  医生让我回家考虑下，但我并没有考虑，和医生说，先保守做根管治疗吧。医生随即约我一周后的周五去做根管治疗。
插曲 在要做治疗的前一天，医生突然来了个电话，告诉我她要去隔离，将我的时间向后延续一周到下周五。
第三趟 在又疼了一周后，终于看上医生了。打麻药，把这颗牙的神经拔了，将该牙坏的部分处理了，并上了药，且用临时填充物进行填充。然后约下一周。
第四趟 这一周牙没有发言，没有其他问题，感觉挺好的，本以为今天到医院会进行补牙。但医生说今天只是帮我换一次药，具体的补牙要等三到六个月后。
未完待续&amp;hellip;</description>
    </item>
    
    <item>
      <title>比较 Google Workspace 和 Google One</title>
      <link>https://tourcoder.com/compare-google-workspace-and-google-one/</link>
      <pubDate>Sat, 22 Oct 2022 06:41:17 +0000</pubDate>
      
      <guid>https://tourcoder.com/compare-google-workspace-and-google-one/</guid>
      <description>Google 有两套账户体系，一套是以 @gmail.com 为后缀的账户或者以用户自己其他 email 地址（比如 foobar@yahoo.com）为用户名的账户。另外一套账户是以用户自有域名邮箱为用户名的账户。根据功能特色，我将这两套账户体系分别称为 Google One(Personal account) 和 Google Workspace(Workspace account)。
这两套账户体系衔接着 Google 的各种服务，但每个账户的服务又不完全一样。Google One 有的服务，Google Workspace 未必有；Google One 免费的功能，Google Workspace 可能要收费等等，反之亦然。
写这篇博文，我是想把这两套账户体系理一理，说点我日常使用的功能中，它们之间差异的地方，让大家有个清楚的认识，便于发现哪一个账户体系才是适合自己的。
   功能 Google One Google Workspace 胜利方     自有域名 不支持，只能用 gmail.com，或者不用 gmail 服务，用现有的 email，变相用自己域名 支持，且支持多个域名 Workspace   多邮箱 只有一个以 @gmail.com 结尾的邮箱，可以通过 username+alias@gmail.com 或在 username 各个字母数字之间加点号变成很多个邮箱。但现在很多其他服务已经不支持这种变形，比如 Apple ID，Cloudflare 等将所有的变形都识别为一个邮箱 理论上有无限个邮箱，因为可以增加一个或多个域名，主用户名只有一个，但可以有无限个别名 Workspace   容量 默认有免费的 15G 容量，收费版价格是 100G 容量每年 19.</description>
    </item>
    
    <item>
      <title>微信被封，对我意味着什么</title>
      <link>https://tourcoder.com/what-does-it-mean-to-me-when-my-wechat-account-was-blocked/</link>
      <pubDate>Thu, 20 Oct 2022 12:32:24 +0000</pubDate>
      
      <guid>https://tourcoder.com/what-does-it-mean-to-me-when-my-wechat-account-was-blocked/</guid>
      <description>早上发了个朋友圈，内容如下
 下午的时候，有人问我是不是把早上的朋友圈内容删了，问了其他朋友，都告诉我说看不见我朋友圈，随即发现我的微信朋友圈似乎被屏蔽了，发了推吐槽了下，也没当回事，没想到过了几个小时，收到了微信的通知。
  哈哈哈，喜提半个月的群聊，朋友圈等功能的封禁。原因互联网相关法律法规的要求，我尝试了下在群里发消息和发朋友圈，均无法成功。
 微信真的是好样的。当然我也向微信申诉了，我想知道我的什么话，触动了老鼠们的神经，让它们害怕到封禁我的群聊和朋友圈等功能。
说回正题，我刚才把微信里面的内容整理了下，理出了个大概，如果这个微信完全被封，或者说，我不再使用微信，我会遇到哪些麻烦的事情。
  聊天方面，我的微信里一共有 72 个人，基本都是家人，朋友以及提供服务的人。家人是通过微信聊天最多的，这个可能会有点麻烦。聊天第二多的是朋友，但我都能切换到其他的聊天软件上，比如 telegram。交流不是很多，但很重要的一类人是提供服务的，比如宠物店，代做账的财务，公司银行柜台的服务人员，我的主治医生，这个也会有点麻烦。
  支付，我日常生活中用微信支付的时候并不多，这点我完全可以脱离。
  预约平台，这点很糟糕。很多东西的预约只做了微信，比如医院官方预约平台，这点很麻烦。支付宝加油啊！
  工作，现在和合作者的交流基本都是通过 telegram 和 email 来完成的，完全不受影响。
  总的来说，完全离开微信有点难，但可以减少对它的使用，能不用尽量不用。</description>
    </item>
    
    <item>
      <title>我眼里的协同工作的工具</title>
      <link>https://tourcoder.com/tools-for-collaboration-in-my-eyes/</link>
      <pubDate>Sun, 16 Oct 2022 02:27:06 +0000</pubDate>
      
      <guid>https://tourcoder.com/tools-for-collaboration-in-my-eyes/</guid>
      <description>看到左耳朵耗子写的一篇「聊聊团队协同和协同工具」，有点启发，跟风也写一篇自己的看法。需要注意的是，下面的想法纯是基于软件本身考虑，政治政策因素没考虑。
沟通 所有的协同工作，即时沟通占了很大的一个方面。而即时沟通，IM 又占了很大一块。在 IM 方面，似乎拉群和 channel 成了国内外两个方式。怎么说呢，各有各的特色，各自的缺点也显而易见。就拿微信（非企业微信）和 discord 来说。
微信拉群的缺点，没有辅助机器人，没有聊天的历史记录，新加入的人看不到历史的聊天记录。但它有一个很好的优势，team up。团队的任何人任何时候可以立刻自由的拉群组队，可以是针对某个主题，某个项目，甚至是某件事情，很有针对性。而且拉群恰恰体现了管理的属性，任何人可以是一个项目，一个主题或者某件事的主导者（负责人），权力完全下放。（2022 年 10 月 20 日补充：我今天在写另外一篇文章的时候，我意识到一个问题，写这篇文章时我还停留在过去的方式，其实这一年多，我和人合作时，用的是 telegram，telegram 就是拉群方式，它就很棒啊！！！）
Discord 的缺陷也显而易见，无法做到任何人都可以创建 channel，权力相对于集中。
所以不存在懂不懂管理，而是看用户是怎么用而已。
协作 除了上面说到的沟通，团队协同工作的另外一点就是协作，目前来说，市面上的协作工具都不差，基本满足了最基本的原则 - document everything。
总结 总的来说，我的观点是工具没有绝对的好坏，也没有完美的工具，更多时候我们在使用时，如果有点创造性，使用更适合自己的工具，可能会更好。
比如我曾写过一篇我们用 GitHub Issues 来进行项目管理的文章，Issue 驱动的项目管理，那时候我们并没有用 Jira 这类专门的项目管理软件，是发掘 Issues 这样的东西，其实管理起来比我们使用 Jira 要更方便。</description>
    </item>
    
    <item>
      <title>比较几个 vscode 的网页版</title>
      <link>https://tourcoder.com/compare-some-vscode-web-services/</link>
      <pubDate>Tue, 27 Sep 2022 05:34:43 +0000</pubDate>
      
      <guid>https://tourcoder.com/compare-some-vscode-web-services/</guid>
      <description>我之前一直有一个开发机，近小半年，我开始使用了下几个在线的 VS Code 的服务，下面做一个比较。主要功能的比对，需要注意的是，这里没有比较自建的，也仅限使用率高的。
   产品 供应商 形式 是否有终端 是否有 Copilot 其他插件 进入方式     GitHub 开发页 GitHub github.dev 无，提示网页不支持 无，提示网页不支持 大部分支持 浏览器打开 GitHub 上仓库地址，点击 . 进入，或者将 https://github.com/username/reponame 中的 github.com 改成 github.dev 即可   GitHub Codespaces GitHub 它有两种形式，调用本地 VSCode 和打开浏览器 都有 都有 都有 在所创建的项目的 codespace 后点 ... 选择调用本地 VSCode 还是在浏览器里打开   VSCode 开发页 微软 vscode.dev 无，提示网页不支持 无，提示网页不支持 大部分支持 浏览器上打开 vscode.dev 直接使用即可    几点注意</description>
    </item>
    
    <item>
      <title>创建一个 PWA</title>
      <link>https://tourcoder.com/tutorial-how-to-create-a-pwa/</link>
      <pubDate>Sun, 25 Sep 2022 04:51:32 +0000</pubDate>
      
      <guid>https://tourcoder.com/tutorial-how-to-create-a-pwa/</guid>
      <description>PWA 是 Progressive Web Apps 的简称，翻译过来就是渐进式 Web 应用。由 Google 提出来的 web 技术，我第一次知道它是在 2017 年的 Google 开发者大会上。我那时希望它能越来越强大，能直接干掉原生的应用。2018 年也做过一个简单的尝试，将自己的博客换成了 PWA，具体看这篇，但几年下来，回头看看，似乎这阵风并没有吹很大。
下面写一个简单的 PWA，它和写网站差不多，但在网站上增加了一些东西。
先写一个 HTML 页面，代码如下
&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt; &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1&amp;quot;&amp;gt; &amp;lt;title&amp;gt;PWA demo&amp;lt;/title&amp;gt; &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;style.css&amp;quot;&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div&amp;gt; &amp;lt;p&amp;gt;&amp;lt;img src=&amp;quot;icon.png&amp;quot;&amp;gt;&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;This is a demo&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 以及里面引用的 style.css 和一个图片 icon.png
body { margin: 0; padding: 0; border: 0; font-size: 16px; font-family: Arial; } 到这里，网站就写完了，将它放到服务器上，可以通过浏览器来访问，但它还不是一个 PWA，比如当没有网络的时候，我们就无法使用它，而且现在还不能像原生的应用一样，被安装到手机里，必须要依赖浏览器，才能被访问到。PWA 通过 Service Worker 解决了离线的问题，Service Worker 的作用不只是如此，将上面的代码更新为</description>
    </item>
    
    <item>
      <title>不要从拼某某买东西，尤其是吃的</title>
      <link>https://tourcoder.com/do-not-buy-things-from-p/</link>
      <pubDate>Tue, 20 Sep 2022 12:44:37 +0000</pubDate>
      
      <guid>https://tourcoder.com/do-not-buy-things-from-p/</guid>
      <description>不要从拼某某买东西，尤其是吃的，切记，切记，切记！
几天前，我看到一个拼某某的视频，宣传助农的，卖的是番茄，是什么云南沙瓤的，价格还行，最主要的是我日常番茄吃得很多，就立刻下单买了 10 斤，今天收到了货。
先说商品质量吧。
  我一共收到了 16 个番茄，称了下，4 斤 8 两。
  番茄是坏的，腐烂的，我大概数了下，只有 3 个番茄是完好的。
  当然，我申请了售后，并丢掉了所有的番茄。因为这是我第一次在拼某某上买东西，体验就这么糟糕。所以，我花了点时间研究了下，发现了一些比较“有趣”的事情，或者说套路吧，希望看这篇文章的人能自行判断。
  很多商品开启拼单的人，总是在不停的开团团这个商品，这类人就是我们以前常说的“托”。
  这些商家的模式是“卖烂货”。
  它们卖的东西是有问题的，甚至是危险的，尤其是吃的，一定要慎重。
  </description>
    </item>
    
    <item>
      <title>不是我事多，而是你们从不说不</title>
      <link>https://tourcoder.com/i-am-not-a-troublemaker-but-you-do-not-say-no/</link>
      <pubDate>Sun, 04 Sep 2022 15:30:13 +0000</pubDate>
      
      <guid>https://tourcoder.com/i-am-not-a-troublemaker-but-you-do-not-say-no/</guid>
      <description>刚和人在聊天时，说到一些事，有点感概，特记录下来。
有很长一段时间，我一直觉得自己是一个事情比较多的人。我这样觉得的原因是，我经常会和别人分享生活中的点滴，时间久了，有些人会说我事情比较多，然后我对比他们看看，发现的确自己事情比较多，多少有点郁闷。有时候会想是不是因为自己的性格。
但后来发生的几件事，让我明白，其实并不是我这个人事多，而是很多人遇到了我所遇到的事情，但他们和我的处理方式不同罢了。举个例子。
有次我在一个卫生服务中心临时做了下核酸，第一次去，在做核酸后的第三天，我接到一个自动的电话说我和该中心的一个医生成功签约，签约他为我的家庭医生，并且在电话了说了我得了什么病，巴拉巴拉。
  我的反应和做法
我当时就觉得这个问题不对，但因那个地方离我家远，我没当回事。可过了几天，那中心又给我发短信等，继续告知我这件事，并告诉我，这个医生现在在某个地方就诊什么的。当时我立刻从电影院里出来，打电话给这个医生，对方告知我，是他自己代表我和他签约的，他可以从他们的库里看到我的资料。我问他他有什么权力代表我签约，他一顿和我扯皮。我去派出所报警，警察没管，理由是我没有经济损失，该医生的做法没有犯法。那我只能继续搞下去，最后结果是该中心电话，短信向我道歉，并解除我的所有签约。要上门道歉的，我没同意。
  其他人
我决定搞这件事时，在收集该中心材料时，我发现其实很多人遇到了我所遇到的，只不过有人的没有意识到这个问题。有的人不在乎，觉得自己又没有什么损失。我一个朋友最具典型，他也遇到了，但他无所谓，而且还觉得我这样去搞事，维护自己的权益，是没事找事。
  怎么说呢，每个人都有自己的看法，但这件事上，我没有觉得自己做错了什么。生活中还有很多事情，尤其是那种让人感到如同“吃屎”的事情，很多人居然也能无所谓，不在乎，甚至在乎了，还忍下来，我是真不懂的。</description>
    </item>
    
    <item>
      <title>开发并发布一个 Office 插件 (Add-in) 的经验分享</title>
      <link>https://tourcoder.com/how-to-build-and-publish-an-office-add-in/</link>
      <pubDate>Wed, 24 Aug 2022 08:50:12 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-build-and-publish-an-office-add-in/</guid>
      <description>这几天学习开发了一个 Microsoft office word 的 add-in，也刚提交审核，分享点经验。
  官方的文档还是比较全的，具体可以看这里，但有些部分你需要阅读英文，因为中文页面显示的也是英文，我已经在 GitHub 上给他们提交了这个问题。
  目前每个应用对应的 API 也是不完整的，比如我是为 word 开发的 add-in，有些想做的操作，目前还不被支持。
  开发好的东西，需要打包，放到你的服务器上，能被访问到。其中 manifest.xml 是要上传审核。
  我是用企业身份发布的，用个人身份发布，我没有尝试，也欢迎用个人身份的人分享经验。
  用企业身份发布，要验证企业身份（Partner），还要验证开发者账户（Developer），切记一定要验证开发者身份，不然无法上传发布应用。具体的操作在 Microsoft Partner。
  应用的发布在 Microsoft Partner Center 后台的 Marketplace offers，进去后创建应用，填写相关的内容即可。
  补充个细节
基本就上面这些内容，我唯一遇到问题的地方是开发者账户验证。开发者身份需要的资料和 Partner 身份需要的资料是一样的，我提交了很多次，但都无法通过。而他们又说不清楚自己要的东西，最后甚至发一封邮件甩锅给我，关键发来的邮件是谎话连篇。我昨天早上九点多回怼了一封邮件揭穿了谎言，然后晚上十一点多收到邮件说帮我解决了，一早醒来一看，开发者账户通过验证了。浪费了我很多天时间。下面是我当时回复他们的邮件。
 </description>
    </item>
    
    <item>
      <title>为什么我不喜欢显示 IP 这个功能</title>
      <link>https://tourcoder.com/why-i-donot-like-the-feature-of-showing-up/</link>
      <pubDate>Tue, 23 Aug 2022 12:23:35 +0000</pubDate>
      
      <guid>https://tourcoder.com/why-i-donot-like-the-feature-of-showing-up/</guid>
      <description>昨天在 segmentfault 上回答了问题，然后发现，我擦，旁边显示着根据 IP 关联的地址。
其实互联网早期，都显示 IP 的，即便到现在，有些上古应用还在显示着 IP，比如 IRC。
后来很多应用，场景慢慢不再有这个功能。但这三四年，某国开始要求其境内的服务都要显示用户的地址，不管什么地方，只要有发言说话的功能，都得有，让我恶心的不行。
为什么我不喜欢，甚至讨厌这个功能？
隐私 早期的互联网显示 IP，我觉得更多的是新鲜感和联网调试的需要。每个人都来自哪里，感觉因为互联网的存在，世界变得好小，好神奇。现在显示 IP，除了增加个人隐私的泄露风险之外，没有什么好处，尤其是这种公开处刑方式的显示。
毁掉交流毁掉进步 每个人在说话之前，都开始先考虑下自己的话该不该说，都会做这一系列的自我审查。因为他们相信都显示自己的地址了，说了不该说的，会被 JC 上门抓的。久而久之，大家都默认不再交流。没有了交流，也就没有了进步。
这是一种为了统治而使用的恐吓手段。</description>
    </item>
    
    <item>
      <title>如何使用环境变量</title>
      <link>https://tourcoder.com/how-to-use-environment-variables/</link>
      <pubDate>Wed, 20 Jul 2022 01:34:19 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-use-environment-variables/</guid>
      <description>用 GitHub 协同工作，稍不留神就会把密钥等传上去，挺简单的一个方法是，将这些重要的数据写在环境变量文件中，在上传代码时通过 .gitignore 不上传这些文件即可。
Nodejs 通过 dotenv 来实现。
先安装
npm install dotenv --save 然后在根目录创建一个 .env 文件，写入相关内容，格式是 key=value，比如
SECRET=&amp;quot;123123&amp;quot; 引用并且使用
const dotenv = require(&amp;quot;dotenv&amp;quot;) dotenv.config() console.log(process.env.SECRET) </description>
    </item>
    
    <item>
      <title>你自由的风格</title>
      <link>https://tourcoder.com/freedom-style/</link>
      <pubDate>Thu, 02 Jun 2022 02:10:20 +0000</pubDate>
      
      <guid>https://tourcoder.com/freedom-style/</guid>
      <description>上海“解封”了
我却失去了自由
随处可见的场所码核酸亭
时刻提醒着
我似乎置身于一个大型的电子监狱中
焦躁不安
回顾过往的种种
这自由
应该我就不曾拥有过
也许
应该学习它们的分裂人格和擅长遗忘
前脚在封控中哭天喊地，后脚狂欢庆祝
抑或许
成为一个概率生存学的王者
只要事情不发生在自己身上就行
再或者
成了一个心盲眼瞎失智失聪的患者
我们都解封了，你们没有解封是不可能的，是造谣瞎说，诋毁优秀的政府
但理智告诉我
毕竟
读了这么多的书
懂了这么多的道理
不是用来吃屎的</description>
    </item>
    
    <item>
      <title>上海式解封</title>
      <link>https://tourcoder.com/shanghai-style-unsealing/</link>
      <pubDate>Wed, 01 Jun 2022 08:46:33 +0000</pubDate>
      
      <guid>https://tourcoder.com/shanghai-style-unsealing/</guid>
      <description>上海“解封”了，复工复产了，至少媒体是这么说的。事实是，上海只是防控区的小区解封了，那些管控封控区的小区还是在封控中，一切似乎回到了两个月前的精准防控的方式，但却连两个月前都不如，起码两个月前还能堂食，两个月前店面基本都开着。
一早我出门，乘地铁到处走了走，发现处处都要「场所码」，主要看的是「核酸」和「绿码」。再看看那一个个核酸检测亭，是的，我的感觉就是我从被封控着的家这个小的空间里走了出来，现在进入了一个大的封控空间，一个大型的狱所，而「场所码」这种那种的码就是套在我身上的电子镣铐。
其实我写这篇博文是想对那些狂欢，庆祝解封的人说点什么，但似乎我此刻也说不出什么来。算了，一代人有一代人的使命，一代人有一代人的认知，只能各自安好，自求多福吧。
经历了这次封控，我深刻意识到几件事。
  永远不要相信政府机构，尤其是一个打着「为你好」这个名义的政府机构。
  永远要有自己的底线，一定要坚持自己的底线，哪怕为这个底线付出代价，甚至生命。
  永远不要尝试让蠢货清醒，让他和你达成共识，别给自己找事情做。
  找适合自己的地方生活，人生很短的，别和不合适的事情纠缠。
  祝各位好。</description>
    </item>
    
    <item>
      <title>macOS 下设置 Python 的默认版本为 Python 3</title>
      <link>https://tourcoder.com/how-to-set-default-python-verion-to-python3-on-macos/</link>
      <pubDate>Tue, 24 May 2022 14:11:41 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-set-default-python-verion-to-python3-on-macos/</guid>
      <description>macOS 下默认的 python 版本是 2.7，可以通过设置将其更改为 python 3.
先安装，我是通过 homebrew 来安装的
brew install python3 找到 python3 的安装位置
which python3 一般都会在 /usr/local/bin/python3
在 ~/.zshrc 中增加一个新的 alias
alias python=&#39;/usr/local/bin/python3&#39; 最后 source ~/.zshrc 使其生效即可。</description>
    </item>
    
    <item>
      <title>我的工作台</title>
      <link>https://tourcoder.com/desk-setup/</link>
      <pubDate>Sun, 22 May 2022 01:57:04 +0000</pubDate>
      
      <guid>https://tourcoder.com/desk-setup/</guid>
      <description>先上图，从 2016 年到现在，我书房主要用的桌子变化情况。
   靠窗的书桌：侧边有一个书架和书桌连在一起，2023 年在书房另一面增加了一个升降桌，是京东京造的升降桌，在用了两年后我的升降桌的感受看本文末的图片。
  手办：桌子上手办挺多的，主要是我喜欢这些玩意。
  人体工学椅：目前用的是西昊的 Doro，之前用的电竞椅子坏了，椅子选择可以看这篇文章
  Dell U2414H 的显示器：刚出来的时候买的，这些年没有换过。因为换升降桌，已购买了新的 Dell 显示器，他们家千元以上的显示器基本可以盲买，都很好。
  MacBook Pro：生产力主力电脑，最后一代蝶式键盘的 MacBook Pro，设置置可以看这篇「我常用设备的配置」
  MacBook Air：以前主要用来测试新系统，但现在安装了 windows 主要用来处理财务税的事情。
  电脑支架：先前给 MacBook Pro 搭配的是 mStand，现在换成了夕米的，也不错。收纳 MacBook Air 用的是木丁丁
  键盘：白色的老版 Mac 的妙控键盘和京造的机械键盘，是J104 有线的这一款，自己给它配了新的键盘冒。
  鼠标：旧款的 Apple 官方的鼠标，但放旁边落灰，我主要用 Magic Trackpad（黑色的）
  iPad Pro：搭配官方黑色 iPad Pro 的妙控键盘
  线缆收纳：用的是英蓬桌下理线架，颜色是黑色，升级特大号可调节款。
  桌子上还有一些乱七八糟的东西，就不一一列举了。</description>
    </item>
    
    <item>
      <title>试用 Github Codespaces</title>
      <link>https://tourcoder.com/try-github-codespaces/</link>
      <pubDate>Tue, 17 May 2022 06:28:01 +0000</pubDate>
      
      <guid>https://tourcoder.com/try-github-codespaces/</guid>
      <description>刚在玩「炉石」，突然来了一封邮件，是 Github Codespaces 开放通知，我能试用 GitHub Codespaces 了，先简单的试用一下。
 GitHub Codespaces 是什么？ 可以将它理解为是一个开发机，关于它的更多信息，可以查看这里。
它解决了我的什么问题？ 可以在浏览器上编写代码，并能同时能提交到 GitHub 上的仓库里。其实这个方式目前在 GitHub 上是有一个隐藏技巧的，打开某一个仓库，比如地址是 https://github.com/tourcoder/tourcoder，按 . 号键或者将地址改成 https://github.dev/tourcoder/tourcoder，即把 github.com 部分改成 github.dev，即可打开一个 VS Code 的编辑器。
我比较看重的是，用 VS Code 连接它时，相对较稳定。要知道我之前用 VS Code 连接自己的开发机，总是过一段时间开发机就会处于假死状态。
基本流程 进入到 Codespaces 的主界面，点击 New codespace
 选择相关的参数，比如仓库，分支等，然后点击创建即可。
 点击创建后，即开始自动配置，这个过程会花费一些时间，但是会自动完成。完成后，两种选择
 选择一，等待，然后会自动在当前浏览器中打开
 选择二，点击下面的在 VS Code Desktop 中打开，它会自动打开 VS Code，询问是否安装相关的插件
  选择安装即可。到此，基本上就可以使用了。
一点小尝试 我尝试在浏览器端打开的 Codespace 增加了点内容，然后关闭该页面，结果显示，这些内容是保存在 Codespace 中的，没有提交到 GitHub 上。
 我尝试用 iPad pro 上的 Chrome 打开它，一切正常。</description>
    </item>
    
    <item>
      <title>不要活在恐惧中</title>
      <link>https://tourcoder.com/do-not-live-in-fear/</link>
      <pubDate>Sun, 01 May 2022 09:42:09 +0000</pubDate>
      
      <guid>https://tourcoder.com/do-not-live-in-fear/</guid>
      <description>今天是 2022 年 5 月 1 日，一早突然得到消息说我们小区从之前的封控区变成了管控区，这意味着我们可以在小区里走动了。
吃完早饭，我和往常一样，在小区里快走锻炼，人的确比之前多了一些，表现却各异。
有穿着蓝色防护服散步的；有用雨披一样的衣服罩着还戴着防护面罩散步的；也有防护帽外面还加了一层不知道什么玩意的帽子式的东西，身上穿着很厚的全包式防护服散步的；也有几个人不戴口罩在那边吸烟聊天的；他们让我这个只戴着口罩的人感觉自己格格不入。
除了如此高强度的防护之外，当两人行道交错时，大家都会刻意的躲开；也有举动更夸张的，前面提到的用雨披衣服罩着的人和我迎面而来时，她立刻快速的跑到岔路上去了，在她眼里，我就是一个行走的病毒吧。
在小区的微信群里，也有人建议着让大家不要出去，继续在家窝着，觉得现在出家门在小区走的人都是在害人。
他们种种表现其实就是害怕自己感染病毒，是典型的恐惧表现。其实不只是这次的疫情，这么多年来自始自终，我们一直生活在恐惧中，从小到大。小时候，恐惧更多的来自父母家长，以及比自己大一些的孩子；而长大后，恐惧更多的来自世俗眼光，社会风气以及统治阶层。
为什么我们不应该生活在恐惧中？
  恐惧会让我们失去判断，会让我们盲目的做出异常的举动。
  恐惧会让我们失去理智，会让我们做出非理性的事情，让我们自我怀疑，逐渐变成一个神经病。
  恐惧会让我们失去自由，会让我们畏手畏脚，什么都不敢做，什么都不敢说，甚至连想一下都不敢。
  恐惧会让我们失去希望，会让我们对未来不再有想象，无法创造更好的未来。
  恐惧会让我们失去一切，会让我们像行尸走肉一样的活着，直到被榨干最后一滴血。
  恐惧其实是一种心理病，一个必须要治好的病。
如何治好恐惧？
  相信科学，坚信科学，多看看一些科学知识的书，视频等。
  想清楚你的恐惧来自哪里，为什么你会怕；那个让你感到恐惧的人，它的目的是什么？
  要勇于说不，对不合理的制度规划等东西说不。
  挑战权威，敢于对向你施加暴力的人或团队挥出自己的拳头。
  不要传播恐惧，这点很重要。比如，大家提醒我不要乱说话，即便我说的全是真实发生的事实。他们提醒是因为恐惧。
  不要做恐惧制造者的帮凶，不要帮着打压解决恐惧制造者的人，更不要做恐惧制造者，永远不要！！！
  说个好玩的，昨晚我和客户用腾讯会议工具开会，会议内容结束后，他们和我闲聊了下上海的疫情，就几分钟时间，腾讯会议强制结束了我们的会议。同样的原因，它也生活在恐惧中，即便我们说几句话，它都怕得要死。</description>
    </item>
    
    <item>
      <title>上海版的孤岛生存</title>
      <link>https://tourcoder.com/island-survival-shanghai/</link>
      <pubDate>Sat, 23 Apr 2022 09:09:56 +0000</pubDate>
      
      <guid>https://tourcoder.com/island-survival-shanghai/</guid>
      <description>很糟糕，上海变成了一个孤岛，更糟糕，这个孤岛是人为刻意为之。
在这孤岛里，有宣泄着不满，做着积极的反抗；有默默的看着，似乎事情与他无关；有依旧每日晒着东西，一副岁月静好的姿态；有很多利用所谓的流量密码，吃着人血馒头，等等，众态百出。
我不想赞扬谁，也不想谴责谁，我想请各位想几个问题
你希望你生活在一个什么样的环境里？
你希望你的家人生活在一个什么样的环境里？
你希望下一代生活在一个什么样的环境里？
如果你的回答是无所谓，不在乎，走一步算一步，甚至是觉得现在挺好的，你挺知足的，下面的内容不适合你，关闭这个页面吧。
在目前上海这个孤岛里，我们该如何活下去，可能只有几个办法。
  如果你还没有阳，请拒绝做不合理的核酸。
  如果你没有食物的供应，或者物资是有问题的，请大声说出来，在各种你能接触到的社交媒体（抖音，微博，快手等等）拍视频拍照片公布出来。
  如果你在方舱，请通过各种你能接触到的社交媒体（抖音，微博，快手等等）拍视频拍照片公布出来。
  任何时候，不要忘了团结起来，互相帮助。</description>
    </item>
    
    <item>
      <title>不只是精神失常</title>
      <link>https://tourcoder.com/more-than-a-mental-disorder/</link>
      <pubDate>Fri, 22 Apr 2022 11:33:20 +0000</pubDate>
      
      <guid>https://tourcoder.com/more-than-a-mental-disorder/</guid>
      <description>有一群我不知道是什么生物的玩意货，因为我如果说它们是任何一种地球生物，都是对该地球生物的侮辱。它们应该是封控坐牢坐嗨了，在小区里众筹，买一个黑人为小区唱歌跳舞送祝福的视频。网上搜索看了下，不只是我们小区的这些玩意货准备吃这个屎，上海很多小区都早已吃过这个屎，内卷得非常厉害。
你们不在乎明目张胆的欺骗，善于给自己找借口说上面人不知道，知道了肯定会严惩，殊不知上面人来了，只是走过场的表演一番，甚至连该去的地方都没去，只是天台搭建个场景棚，拍些照片视频完事了。
你们不在乎它们撒谎成性，上海辟谣说其他省送来的东西是坏的，转眼却被辽宁打脸说东西都是好的。
你们不在乎真的好东西，能吃能用的东西被各种理由卡住，进不了供应里，而那些糟糕，坏的，能吃死人的东西一路被“开绿灯”通行无阻的送到了你们的手里。
你们不在乎他人的情况和状态，反正事不关己高高挂起，甚至你们还主动的搞举报去坑害其他人。
你们不在乎的东西太多太多太多了，你们在乎的只是你们所谓的苟延残喘的面子，对啊，猪油擦嘴嘛。
到此，我强烈的建议各位货们，你们赶紧去吃那些发了霉的食物，甚至生了蛆的腐肉，早死早投胎。哦，对了，记得在死之前，给自己搞一个黑人抬棺！！！</description>
    </item>
    
    <item>
      <title>为什么我不再做新冠肺炎期间的志愿者</title>
      <link>https://tourcoder.com/why-i-stop-volunteering-during-the-covid-19/</link>
      <pubDate>Wed, 20 Apr 2022 10:16:06 +0000</pubDate>
      
      <guid>https://tourcoder.com/why-i-stop-volunteering-during-the-covid-19/</guid>
      <description>一早和其他几个志愿者打了个招呼，然后退出了自己所在的几个志愿者群，从今天开始，如非特殊情况，我不再做新冠肺炎的志愿者。原因是源于昨晚想到的几点：
  做志愿者是和我主观意识支持的方向是违背的。即便我现在生病，但我是支持共存；而志愿者这件事是支持动态清零，另外我一直认为动态清零是脑子抽了的扯蛋。这是我不再做志愿者的理由之一。
  志愿者其实是“帮凶”，在帮着制造“奶头”。志愿者帮着解决了大部分人的问题，让这些人安心于现在的日子和状态，短时间也许是可以的。但这么长时间看下来，这些人开始对这样的状态习以为常，开始失去本该有的血性和意识，这不是一个好的现象。这是我不再做志愿者的理由之二。
  失去的不只是血性和意识，还有道德人性。
  网上卖 60 多，去医院 40 多给沙雕把药买回来了，沙雕嫌贵不要，说武汉买只要 8 块，沙雕还各种骂送药上门的小姑娘；它不要的药物被另外一个人买走后，沙雕又来和我闹什么我把它的药给别人了。结果嘛，肯定直接让它滚蛋完事。除了我们帮着垫付的药钱之外，我们没有多收一分钱，甚至一些独居老人的挂号费我们都没要。
还有沙雕是坚持用医保卡，但它医保卡刷不出来，我们多个人联系它大半天，超过 6 个小时都联系不上，就没有给它买药。结果是它反问我们一句说它买的可是胰岛素啊，可是救命的啊。反问我们怎么不联系它。第二次它又来让我们帮忙自费买药。自费帮它买回来了，不愿意付钱，说它的医保卡是可以刷的，说我们就是不想帮它刷医保卡，还说什么胰岛素是要冰袋的，我们买都买回来了，也给不了别人。我回了句，那我就放家里冰箱好了。
这种莫名其妙，恶劣的很多，这是我不再做志愿者的理由之三。
总之，我想是时候让他们饿着肚子，缺着药想想为什么要这样，也让他们找回自己为人的那点自尊、血性、道德和人性。</description>
    </item>
    
    <item>
      <title>有轨电车难题？</title>
      <link>https://tourcoder.com/trolley-problem/</link>
      <pubDate>Mon, 18 Apr 2022 15:31:26 +0000</pubDate>
      
      <guid>https://tourcoder.com/trolley-problem/</guid>
      <description>估计很多人不知道名称，但听说过「有轨电车难题」，即
一辆失控的列车在铁轨上行驶。在列车正行进的轨道上，有五个人被绑起来，无法动弹。列车将要碾压过他们。你站在改变列车轨道的操纵杆旁。如果拉动此杆，则列车将切换到另一条轨道上。但是，另一条轨道上也有一个人被绑着。你有两种选择：
  什么也不做，让列车按照正常路线碾压过这五个人。
  拉下操纵杆，改变为另一条轨道，使列车压过另一条轨道上的那个人。
  此时你会怎么做？这是一个道德心理学的问题，目前在我们小区遇到了这个类似的问题。
在这次封控中，我们小区有几个阳性的感染者，大部分都转移了。但有一位感染者是老人，有多重基础疾病，身体很差，比较危险，把他送到条件恶劣的方舱那边无疑是送死，但现在又没有能够接收他的医院，所以现在情况是不转移老人，让他在家，不出门，等到有医院接收的时候，送他过去。这一决定带来了上面说到的「有轨电车难题」。
  送老人去方舱，老人风险高，可能会死亡。
  让老人留在小区，整个小区的人继续封控着，每天都是一个新的 14 天的第一天，没完没了。
  小区里很多人都发了牢骚，也吵过架，老人所在的居民楼居民都拒绝配合所有的事情，比如核酸等。
我之前的观点是，支持让老人待在家里的，毕竟送到环境恶劣的方舱，老人出事的概率太高了。但刚才我却觉得这个事情处理得不对。
其他阴性的居民和老人之间其实是没有任何相害的关系的，而现在产生这样的相害关系是因为有一个 trouble maker 在那边制造，那只要一起把这个 trouble maker 给干掉，这应该是个最好的办法了吧？</description>
    </item>
    
    <item>
      <title>无题</title>
      <link>https://tourcoder.com/untitled/</link>
      <pubDate>Thu, 14 Apr 2022 15:04:46 +0000</pubDate>
      
      <guid>https://tourcoder.com/untitled/</guid>
      <description>接了一个电话，翻看了下聊天记录，从 4 月 5 日到今天，一共有 4 个人和我说做个救助网站，呈现的形式就是让大家在上面发求助帖，然后希望大家互帮互助。无一例外，均被我拒绝了。
我的理由也很简单，要实现互助，前提是要会自救，而要自救，就必须要做一件事 &amp;ndash; 抗争。稍微有点理智的人都清楚抗争的重要性，抗争是一个人主观意识的觉醒，懂得抗争了，是这个人向有自尊懂自爱的巨大转变，是为自己发声。
很可惜，我从那些发帖求助的网站上看到的，几乎都是没有抗争，只是开口张嘴乞求别人的帮助，不好意思，谁都帮不了你。因为帮你们解决问题后，你们会继续你们的岁月静好，而忘了你获得的帮助是别人抗争争取来的，更会忘了互助，忘了你也应该去帮别人抗争，甚至有些求助的信息都是有问题的。
昨天，我楼下邻居在群里说他老婆发热半昏迷，120 拉去了 6 家医院都不接收等，情况很紧急。我看到信息后，第一时间给管片的警察打电话发了一通火，询问为什么不救治，要求安排医生处理，这事不处理不行。最后，警察帮着联系医生，了解了具体情况，然后又给我回电话，把来龙去脉解释给我听，结果是我邻居只是在群里有选择性的说一些对他有利的话，而事情全貌完全不是他说的那么一回事。最后弄得我很尴尬，和警察打招呼说不好意思。
抗争并不是说要做出出格的事情，抗争是理智的合理的提出自己的诉求，说几个简单的例子吧
  在我的药品吃完前十天，我找派出所管我们社区的警察说，我吃的药还有十天的量，我提前和他报备下，过几天我会要求出门配药，希望到时不要有人恶意阻拦我。最后，没人阻拦我，我配到了药。
  我一直在小区里做配药志愿者，帮小区的老人病人配药。在外出去医院配药时，路口都会有警察拦截问询，我都会告诉他们我是给社区配药的，你们不要阻拦我。最后，警察很好的让我快速通过。
  而有些人，即使选择自杀而死，也不想抗争下，这真的对么？</description>
    </item>
    
    <item>
      <title>如何使用 Google Workspace legacy 进行邮件转发</title>
      <link>https://tourcoder.com/how-to-use-google-workspace-legacy-for-mail-forwarding/</link>
      <pubDate>Sat, 09 Apr 2022 08:12:53 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-use-google-workspace-legacy-for-mail-forwarding/</guid>
      <description>Google 终于给 GSuite legacy 后续进展下了一个定论，要么付费升级使用，要么使用 no-cost 方案，no-cost 方案缺少了一些核心的功能，比如 Gmail。具体说明看这里。
正好在 Twitter 上刷到一个推友说到的问题，子域名邮箱转发的问题，他使用了 Google Domains 和 Cloudflare，可惜它们不支持子域名，推友 hack 了下，还有点小问题，讨论看这里。
其实关于域名的邮件转发，不管是子域名，还是主域名，基于 GSuite（现在叫 Google Workspace） 就有很好的解决方案，我已经使用几年了，特分享下，下面统一称呼 GSuite 为 Google Workspace，建议看完整篇内容后再进行操作。
第一步：
进入到 Google Workspace 的管理后台，https://admin.google.com，登录后去添加需要的二级域名，比如 subdomain.mydomain.com，如果已经添加了，忽略。
第二步：（最关键的一步）
升级你的套餐到一个收费套餐，升级完成后，等其他操作完成后，可以取消，这个过程应该只要花几美分。
为什么要升级呢？
在 Google Workspace 中 Gmail 里有一个路由功能，不升级的时候，该路由功能叫 Routing，只能将邮件转发到主域名的邮箱，看下图
  而升级后，该路由功能叫 Default routing，可以将邮件转发到任意邮箱，如下图
 第三步：
增加一个或多个 Default routing，第一项选择 All recipients，也可以根据自己的需要填写，后面也可以自己修改的。在 Envelope recipient 处写转发到的邮箱，比如将所有邮件转发到了 code@tourcoder.com，如下图
 第四步：
降级，其实所谓的降级就是取消购买 License。
特别注意点：
我是差不多七年前，我在升级公司用的 Google Workspace Legacy 时，误操作将自己个人的账号升级了，然后发现了这个差别。
这句话也就意味着我是七年前做的操作，我不清楚这操作是否还适用于当前时间。</description>
    </item>
    
    <item>
      <title>外国人的鸡吧和中国人的生命</title>
      <link>https://tourcoder.com/foreigner-s-cock-and-chinese-life/</link>
      <pubDate>Fri, 01 Apr 2022 17:00:29 +0000</pubDate>
      
      <guid>https://tourcoder.com/foreigner-s-cock-and-chinese-life/</guid>
      <description>2022 年晚上十点五十三分，也就是昨天晚上，上海市第六人民医院的微信公众号发了一篇标题为「新冠笼罩下的‘丁丁保卫战’」文章，但没过多久这篇文章就被删除了。
我先说结论吧，看完这这篇文章后，联想到这段时间内发生的事情，我有的不只是愤怒，更不只是想骂一句操你妈的。
说回第六人民医院的这篇文章，在这篇文章里，第六人民医院以很自豪，邀功请赏的心态写了一件事。
一个来自国外高风险地区的外国人，在酒店隔离期间，他的丁丁，也就是鸡吧硬了两天。然后开了绿色通道送到了第八人民医院治疗，但第八医院弄不好，就向远在 70 公里之外的第六人民医院的主任医生求助，然后第六人民医院又立即从徐汇院区调派其他的主任医生赶赴第八医院去参与治疗，而且全程第八人民医院书记院长副院长都高度重视，甚至亲临现场，组织全院主任专家会诊，多个科室的主任级别的人都在第一时间到达现场，最后手术成功，大家沉浸在成功的喜悦之中。
这篇文章的最后的原文是：
在疫情防控大仗赢仗的关键时期，面对来自境外高风险地区的外籍患者，医务工作者坚持人民至上，生命至上，在关键时刻敢担当，有作为，齐心协力打赢了这场罕见的“丁丁保卫战”，全力以赴守“沪”人民健康。
我真的不知道它们是怎么守“沪”人民健康的，它们连沪上民众的生命都置之不顾，120 救护车就在病人旁边，医生都不肯定救助，甚至连一个急救的设备都不肯借，就是在那边冷漠的看着人慢慢死去。这帮奴才在给它们的洋大人开绿色通道救助鸡吧的时候，却把癌症患者，需要血透救命的病人，老弱病残这些真的需要求助人以疫情封控为理由拒绝在外面，让他们死在外面，这就是这帮奴才的人民至上，生命至上。在自己国家的土地上，自己生命居然连一个外国人的鸡吧都不如，甚至医院还把这些拿出来洋洋得意，引以为傲的宣传，这是何等的荒唐，魔幻！！！
自己国家的人生病挂一个主任专家的号，要花上至少一周时间去提前预约，洋人生病一下子就来这么多主任专家，甚至院长副院长都来了；同样在方舱医院，洋人闹一闹，立刻送到瑞金总院，很多病人到死都难住上的瑞金总院的床位；同样是被封控的人，自己国家的人饭菜得不到及时供应，饿得要死，洋人的大礼包和饭菜是自己国家人的好几倍；自己国家的人集体核酸，聚众被感染，洋人是贴心的上门服务。
几十年前，革命先烈们抛头颅洒热血，牺牲自己的生命为的是让中国人有尊严的站起来，这几十年来，多少科研工作者努力奋斗，寻求突破，在一定的程度上实现了创新，但到头来却发现活的连个外国人的鸡吧都不如。</description>
    </item>
    
    <item>
      <title>信息不透明，有多糟糕</title>
      <link>https://tourcoder.com/how-bad-if-the-information-is-not-transparent/</link>
      <pubDate>Wed, 16 Mar 2022 08:39:48 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-bad-if-the-information-is-not-transparent/</guid>
      <description>写下这篇博文是因为昨晚的聊天。昨晚和我丈母娘视频聊天时，我说了句有同事因为次密接被隔离，但后面被我老婆给阻止了。她觉得我说这个会让父母担心，但我却有不同的看法。我觉得完全可以告诉父母，并且还要告诉他们更多的信息，比如大家居家办公很久了，这位同事基本不见面。父母刚开始听到有同事次密接可能会紧张，但听到后面的信息，自然会消除担心。反而是我老婆这样说了又不让说，更会让父母担心。当然今天一早我就给我丈母娘发了信息，把事情全部告诉她了，起码她不会担心了。
因信息不透明而带来的糟糕，在这次疫情中表现得很抢眼。到现在为止，大部分普通民众并不知道新冠到底是什么，严不严重。比如前几天，我父亲还在问我老婆这个新冠到底严不严重，因为他听别人说只要得了这个病，人就废了。他问我老婆这些是不是真的。而为什么别人会在传这些话？因为别人也不知道，他们也是因为没有一个透明的信息告诉他们这个病毒的情况。很大可能是他们看到某些地区有疫情后带来的“封，捅，焊”，即封门封小区甚至封一片，隔三差五的要捅喉咙做核酸，不做核酸不让出小区门以及更疯狂的把人家大铁门用焊铁焊上，不让人出门。他们看到这些，害怕了，自然会觉得很严重了。我想他们肯定完全不知道，也完全不会相信，新冠的致死率比流感要低，全世界都已经开始逐步恢复到之前的正常状态了。而现在的信息不透明的做法，带来了其他额外的矛盾和社会冲突，无休无止。
为什么关于新冠的宣传信息是如此的不透明，我不得而知，可能是中国境内的专家们还没有弄清楚这个病毒，也可能是有些人有意为之，刻意让这些信息不透明，不去和普通民众说清楚讲明白。
怎么说呢？病毒疫情都会被战胜，只是时间问题。国外靠着可靠的疫苗，经历了两年时间，让一切都过去了，恢复到以前。现在就看中国了，何时是个头？</description>
    </item>
    
    <item>
      <title>我如何做一个视频</title>
      <link>https://tourcoder.com/how-do-i-make-a-video/</link>
      <pubDate>Wed, 09 Mar 2022 17:35:26 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-do-i-make-a-video/</guid>
      <description>刚才整理资料时，发现之前自己想做视频时写的一个流程，分享下
 </description>
    </item>
    
    <item>
      <title>修复 Centos 下 Appstream 错误</title>
      <link>https://tourcoder.com/how-to-fix-appstream-error-on-centos/</link>
      <pubDate>Sat, 05 Mar 2022 17:26:41 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-fix-appstream-error-on-centos/</guid>
      <description>今天在 centos 上操作 yum update 时遇到了一个错误，错误信息是
Error: Failed to download metadata for repo &#39;appstream&#39;: Cannot prepare internal mirrorlist: No URLs in mirrorlist 原因是 Centos 8 的支持周期在 2021 年最后一天结束了，需要手动更新下。
进入到 /etc/yum.repos.d/ 里面，然后执行如下两个命令
sed -i &#39;s/mirrorlist/#mirrorlist/g&#39; /etc/yum.repos.d/CentOS-* sed -i &#39;s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g&#39; /etc/yum.repos.d/CentOS-* 这时候再执行更新就不会出错啦，哈哈哈</description>
    </item>
    
    <item>
      <title>我如何备份私有代码</title>
      <link>https://tourcoder.com/how-do-i-backup-my-private-code/</link>
      <pubDate>Sat, 05 Mar 2022 12:17:34 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-do-i-backup-my-private-code/</guid>
      <description>我一直用 GitHub 作为代码存储的主力工具，不用 GitLab 的原因是之前 GitLab 出了个针对中国和俄罗斯的政策，这里就不细说了，具体可以搜索下。GitHub 同样也做过类似的事情，比如无任何征兆的封禁了一些国家地区的账号。甚至有些项目中因为有伊朗的开发者贡献过代码，整个项目都被封掉了。比如 Aurelia 这个项目。
随着这次乌克兰俄罗斯的战争，这个势头越来越猛，让这些平台中立已经不可能的事情，很有可能下一个就会沦落到我的头上。
以前的做法 如上面所说，我一直用 GitHub 作为代码存储的主力工具，GitHub 上有一份，本地有一份。
现在的做法 考虑了下，我最后决定用 Google Cloud 的 Source Repositories 做备份。实现原理，通过镜像的方式保存到 Google Cloud 中。当 GitHub 这边有更新时，Google Cloud 这边会自动获取并更新。具体操作
进入 Source Repositories 后新增一个 repo，进入下面界面
 选择 Connect external repository
 选择要同步的 repo 来源，我这里自然选择 GitHub，然后完成即可。如标题下面的一段话所言
Select the Cloud project and hosted service that you want to connect. After you make this connection, commits pushed to the hosted service will be automatically synced to Cloud Source Repositories.</description>
    </item>
    
    <item>
      <title>在 Debian 10 上安装 Trojan 和 bbr plus</title>
      <link>https://tourcoder.com/how-to-install-trojan-bbr-plus-on-debian-10/</link>
      <pubDate>Sat, 05 Mar 2022 09:17:22 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-install-trojan-bbr-plus-on-debian-10/</guid>
      <description>Trojan 协议出来很久了，一直没有尝试过，借此机会尝试下，也尝试下 BBR PLUS。
基础信息 系统：Debian 10
准备工作 先将系统升级到最新版本，apt update -y &amp;amp;&amp;amp; apt upgrade -y
申请一个证书，至于如何申请，可以查看之前我写的博文，给网站加 ssl 或者 CentOS 7 下签发 Let&amp;rsquo;s Encrypt https 证书，前面一篇是 Debian 系下，后面一篇是 centOS 下。
安装 BBR Debian 10 自带了 BBR，我使用的是网上的一个开源脚本，脚本看这里。直接安装，需要在 root 权限下执行。
wget https://github.com/chiakge/Linux-NetSpeed/raw/master/tcp.sh chmod +x tcp.sh ./tcp.sh 根据里面的选项，先安装后使用即可。其中在选择安装的时会弹窗提示 Abort kernel removal? 选择 no。
安装和配置 Trojan 在 Debian 下可以直接通过 apt install trojan 安装，进入 /etc/trojan，编辑里面的 config.json 文件
{ &amp;quot;run_type&amp;quot;: &amp;quot;server&amp;quot;, &amp;quot;local_addr&amp;quot;: &amp;quot;0.0.0.0&amp;quot;, &amp;quot;local_port&amp;quot;: 443, &amp;quot;remote_addr&amp;quot;: &amp;quot;127.0.0.1&amp;quot;, &amp;quot;remote_port&amp;quot;: 80, &amp;quot;password&amp;quot;: [ &amp;quot;password1&amp;quot;, &amp;quot;password2&amp;quot; ], &amp;quot;log_level&amp;quot;: 1, &amp;quot;ssl&amp;quot;: { &amp;quot;cert&amp;quot;: &amp;quot;/path/to/certificate.</description>
    </item>
    
    <item>
      <title>战争中的软件</title>
      <link>https://tourcoder.com/software-in-war/</link>
      <pubDate>Fri, 04 Mar 2022 19:53:59 +0000</pubDate>
      
      <guid>https://tourcoder.com/software-in-war/</guid>
      <description>很糟糕，乌克兰和俄罗斯的战争还在继续，似乎越来越向失控的方向发展。一同跟着失控的，还有软件行业，不管是商业软件，还是开源软件，也被制裁弄得有点头热，有点乱套了。
写这篇博文的原因是因为两件事
  越来越多的商业软件或者商业软件服务开始对俄罗斯进行制裁，他们限制甚至禁止俄罗斯人使用其软件或者服务。
  React 在 GitHub 上的 issue 被爆。
  商业软件或者是商业软件服务，背后是有商业公司开发和运营的，而商业公司是有国籍的，开源软件也是有类似的情况，GitHub 就多次爆出这些事情。
完全没想到事情并没有变好，反而越来越糟糕。</description>
    </item>
    
    <item>
      <title>Cloudflare 的客服是蠢货</title>
      <link>https://tourcoder.com/how-stupid-the-cloudflare-agent-is/</link>
      <pubDate>Tue, 01 Mar 2022 13:43:50 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-stupid-the-cloudflare-agent-is/</guid>
      <description>很抱歉，除了骂他们，我已经没有任何办法了，因为从第一次和他们联系处理这个问题到现在，和他们来来回回已经几个月了，有点受不了他们了。
整个过程是这样的，我有一个 Cloudflare 账户，我丢失了二次认证的资料，导致我无法进入这个账户，在这个账户里有一个域名，但该域名目前已经不属于我。也就是说，我想拿回这个账户是没有可能性的。我也知道不可能，但我提出的诉求是，请他们帮我把我的 email 地址给释放出来，这样我好重新注册一个账户，继续使用。
搞笑的事情来了，这几个月，他们反反复复要求让我验证这个账户里的域名归我所有。即便我和他们多次解释了域名已经不归我所有，我不是想要回这个账户，只是请他们把该账户里的 email 给释放出来，毕竟这个 email 是我的，我和他们沟通也是用的这个 email 地址，但他们一直是坚持要求我验证这个账户里面的域名归我所有。
WTF</description>
    </item>
    
    <item>
      <title>修复 macOS 下 Dropbox Needs to Change Permissions for the Folder 的问题</title>
      <link>https://tourcoder.com/fix-dropbox-needs-to-change-permissions-for-the-folder/</link>
      <pubDate>Wed, 02 Feb 2022 15:52:21 +0000</pubDate>
      
      <guid>https://tourcoder.com/fix-dropbox-needs-to-change-permissions-for-the-folder/</guid>
      <description>我最近修改了 macOS 的用户名及其文件夹，导致 Dropbox 无法正常启动了，总是提示
Dropbox Needs to Change Permissions for the Folder 看提示，Dropbox 一直定位到旧的用户名所在的文件夹， 做了以下几个尝试。
  尝试了重新安装 Dropbox，不行。
  尝试新建一个和旧用户名一样的用户，不行。
  继续在当前用户下寻找发现，在该用户目录下有一个 .dropbox 的文件夹，应该是它的配置文件，尝试删除
sudo mv ~/.dropbox ~/.dropbox-old 这里没删除，是备份，预防后面有用。然后重新安装 Dropbox，问题解决了。</description>
    </item>
    
    <item>
      <title>再见，GSuite legacy</title>
      <link>https://tourcoder.com/goodbye-g-suite-legacy/</link>
      <pubDate>Thu, 20 Jan 2022 11:36:20 +0000</pubDate>
      
      <guid>https://tourcoder.com/goodbye-g-suite-legacy/</guid>
      <description>看到一则让我感觉糟糕的消息，Google 取消了 GSuite Legacy 的免费，并要求用户在 2022 年 7 月 1 日前完成升级，不然将会被停用核心功能。Google 官方说明。
我现在的选择只有一个付费继续使用，因为从大概是 2006 年这个服务推出以来，我就一直在用，十几年的邮件等数据都保存在上面，让我现在换的成本太高了。
当初注册公司的时候，公司的名字用了当初那个 GSuite 里绑定的主域名，现在这部分突然增加了一笔成本支出。
上次我在推上说过，自从那个甲骨文来的到 Google Cloud 后，就是开始变着花样的搞用户的钱，为了钱，Google 也是越来越邪恶了。</description>
    </item>
    
    <item>
      <title>关于本次 fakerjs 事件的一些想法</title>
      <link>https://tourcoder.com/some-thoughts-on-this-fakerjs-event/</link>
      <pubDate>Mon, 17 Jan 2022 09:10:27 +0000</pubDate>
      
      <guid>https://tourcoder.com/some-thoughts-on-this-fakerjs-event/</guid>
      <description>本次 Marak 删除 faker.js 的事件其实在开源圈里很常见，与之前不同的是这次的影响有点大，也因为影响有点大，冒出了很多声音，其中有些声音和做法是我所不能接受的。
GitHub GitHub 封禁了 Marak 的账户，禁止他登录。要知道他的账户里有 100 多个库，还有他的私有库。GitHub 的这一做法无异于在对所有人传达一个信息：“它，GitHub，控制着开源！”。这是一个糟糕的信息，非常的糟糕。
部分开发者（其他人士） 有些人指责作者，说他的做法违背了开源精神，说作者被封号是罪有应得，说作者害了很多用 faker.js 库的人。我不知道这些人小可爱的脑袋是怎么长的。
从所有权上说，作者有权删除自己的东西，甚至在自己的库里添加东西，每个人在用其他人开源的作品的时候都应该先查看下这些代码。
从身份角度上说，你也有了别人的代码，而且你还有因为这个代码的收入来源，那你自己怎么不维护这个项目呢？哪怕是 fork 一份，维护一个满足你自己的需求的版本呢？你为什么不这么做？
从某种意义上说，别人开源的代码只是被用来节省你开发同样功能的时间，而不是别人有义务把你的工作都做完，如果指望着别人把你需要的东西做完，还不停帮你维护着，甚至出现问题还指责作者没做好，催促作者，你那是白嫖上瘾了，是病得医治。
各类用着开源的大公司 这些用着开源的，但不回馈的大公司本来无可厚非，但它们作恶的点是把这一切当着理所当然，甚至还有恶心开源作者的行为。比如前段时间 Apple 公司被 curl 作者公开质疑的事情。每年用着开源赚数十亿美元，却把开源作者当免费的工具人。
更糟糕的 其实有些国家的程序员在开源社区开始了无声息的各种搜刮软件，然后修改下名字摇身一变就是国产，这个更糟糕。</description>
    </item>
    
    <item>
      <title>华氏锡山堂家谱</title>
      <link>https://tourcoder.com/family-tree/</link>
      <pubDate>Sat, 15 Jan 2022 16:24:26 +0000</pubDate>
      
      <guid>https://tourcoder.com/family-tree/</guid>
      <description>在整理 Google Drive 的内容，发现一份很多年前的家族谱序，特记录一下
华氏锡山堂家谱 谱序　原始以来，吾宗族根邃叶茂，溪水有源，子孙繁衍生息，宗支星布各地（无锡，江阴，金坛，宝应，金湖，安徽等地）后衣裔有为。
远始祖原分祚江南省常州府无锡东亭，早有祠堂宗谱，声锡山，音武陵原是一宗，因世祖（不详）志向分歧在锡山（今锡山市）建祠修谱，吾宗支为锡山堂。
世祖曾有华氏讳庭尧身由翰墨，职升相位。后裔因洪武赶散，重一公身系连中进士，年老告别故土，到江南省扬州府安宜（宝应）孝议乡（时名）插田定界，居住为业，娶欧太君生一子名福三公高楼花圃娶王太君生一子名兴四公，宝应贡生教谕，娶王太君生一子名仕贵公，娶张太君，生三子国恩公，国清公，国齐公，三房共生十四子於嘉靖年间散居四方。
在祖懿无锡十一世祖，迁居华家滩为重一公字移元名骥为新居福地一世祖，一，二，三世祖茔墓在华家滩汜西村华庄东边，至今尚存。
某公（安徽蒙城县令）回家索取宗支各门银两，谱写宗谱，因铺张奢侈，银两亏贷，修谱未成，各门愤怒切齿，后由小东公官人，石刻堂名，树立某世公三进房舍大门，了结此事，一九四四年日本鬼子拆去前进三间砌炮楼，中进三间为乡公所，一九五四年为汜西学校。
水患无情，财匮势败，由国明公，国安公，国富公兄弟仨从华家滩来到宝应湖西，泗湾湖边同张集圩以南创立庄基为华家老庄。吉地为华家圩，载入史册，流名四方。
春秋几百载，氏族一宗，宗支万计，　支系无穷，论宗序支，世次莫识，或有本末倒置，故而谱牒是本源，不可缓修也，吉地后裔同声亟乎。
为此，经磋商由十八世，率十九世，廿世人员一体起草修谱，以麟公公各门后裔范围所属华家圩及迁出门支，其中有部份门支另立支谱，用字不同，不用误解。
欲知身居几世，亲疏远近，必有起名用字，现将华家圩吉地门支序从廿一世向后列取为：
庆祝先泽久 忠信礼义长　德厚宽广恕　家道毓宝传
谨慎用字不得讹舛
约法规章
一、要耀祖荣宗，瞻养老人，抚育子女，守祖清白。
二、不得同氏支后裔逑姻。
三、振兴氏族团结，不得歧视诽谤。
四、热爱祖国，振兴民族团结，共建四化大业。
五、家谱妥善保存，不得转让他人。
六、真诚嘱托宗支枝叶茂盛，后裔兴旺发达。
十二世祖在华家滩福地居住世系 谨　尊　启　后
重一公：
骥　字移元　原籍为十一世　文进土　生子　福三
二世袓：
福三公　字亮　提督军门　生子　兴四
三世祖：
兴四公　字守清　生子 士贵　四世祖：
士贵公　生三子　国恩　国清　国齐
五世祖：
国恩公　生四子　仲辉　仲臣　仲邦　仲杰
六世祖：
仲辉公　生五子　樽　模　棣　标　榜</description>
    </item>
    
    <item>
      <title>我的 2021</title>
      <link>https://tourcoder.com/my-2021/</link>
      <pubDate>Sat, 01 Jan 2022 08:28:13 +0000</pubDate>
      
      <guid>https://tourcoder.com/my-2021/</guid>
      <description>2021 年发生了太多的事情，让我难受到不想做任何评估。就放两张 2021 的 GitHub 截图吧。
  </description>
    </item>
    
    <item>
      <title>我所理解的 Web 3.0</title>
      <link>https://tourcoder.com/web-3-0-as-i-understand-it/</link>
      <pubDate>Fri, 31 Dec 2021 19:39:12 +0000</pubDate>
      
      <guid>https://tourcoder.com/web-3-0-as-i-understand-it/</guid>
      <description>我本以为jack，马斯克和 VCs 关于 web 3.0 之间的“讨论”会爆发出很多的火花，会引起行业的思考，但却像烟花，瞬间就没有了。斗胆借这个机会，我想说说我所期盼的 web 3.0，希望能起到抛砖引玉的作用。
  我希望 web 3.0 并不是追求颠覆现在的 web 2.0，疯狂的搞去中心化，而是应该在稳定的基础上向数据自我把控的方向发展。
  数据的所有者应该是拥有授权能力的独立个体，而每个应用，每个服务都应该是数据的使用者。
  数据做不到完全保密，索性公开，提高透明度。
  </description>
    </item>
    
    <item>
      <title>获取 Nginx Cloudflare 架构中客户端真实的 IP</title>
      <link>https://tourcoder.com/get-client-realip-in-the-nginx-cloudflare-architecture/</link>
      <pubDate>Thu, 23 Dec 2021 12:34:42 +0000</pubDate>
      
      <guid>https://tourcoder.com/get-client-realip-in-the-nginx-cloudflare-architecture/</guid>
      <description>在 nginx+cloudflare 的架构中，如果不做设置，获取到的客户端 IP 地址是 cloudflare 的地址，而非真实的客户端 IP，需要做如下的设置。
在编译安装 nginx 的时候，增加参数 --with-http_realip_module，即
./configure --with-http_realip_module 同时在 nginx.conf 的 http 块中增加
set_real_ip_from 103.21.244.0/22; set_real_ip_from 103.22.200.0/22; set_real_ip_from 103.31.4.0/22; set_real_ip_from 104.16.0.0/12; set_real_ip_from 108.162.192.0/18; set_real_ip_from 131.0.72.0/22; set_real_ip_from 141.101.64.0/18; set_real_ip_from 162.158.0.0/15; set_real_ip_from 172.64.0.0/13; set_real_ip_from 173.245.48.0/20; set_real_ip_from 188.114.96.0/20; set_real_ip_from 190.93.240.0/20; set_real_ip_from 197.234.240.0/22; set_real_ip_from 198.41.128.0/17; set_real_ip_from 2400:cb00::/32; set_real_ip_from 2606:4700::/32; set_real_ip_from 2803:f800::/32; set_real_ip_from 2405:b500::/32; set_real_ip_from 2405:8100::/32; set_real_ip_from 2c0f:f248::/32; set_real_ip_from 2a06:98c0::/29; real_ip_header CF-Connecting-IP; 最后在程序中直接获取就可以，比如 koa 的 nodejs 程序中获取 ctx.request.ip。</description>
    </item>
    
    <item>
      <title>试用 Cloudflare 的电子邮箱路由</title>
      <link>https://tourcoder.com/email-routing-of-cloudflare/</link>
      <pubDate>Tue, 21 Dec 2021 20:07:07 +0000</pubDate>
      
      <guid>https://tourcoder.com/email-routing-of-cloudflare/</guid>
      <description>今天收到了 Cloudflare Email Routing 的试用的通知邮件
 立刻做了下测试。
Cloudflare Email Routing 中文翻译电子邮件路由，Cloudflare 给它的定义是为您的域创建自定义电子邮件地址并将传入电子邮件路由到您的首选邮箱。直白点说，把发到该域名的电子邮件转发到自己指定的邮箱。
配置完如下图，我的域名是 tourcoder.com
 自定义地址：可以设定一个基于域名的邮箱地址，可以将发到该设定邮箱的邮件转发到指定的邮箱，比如我使用了 code@tourcoder.com，可以添加多个。
Catch-all 地址：如果不想设定邮箱地址，可以开启这个。只要发到后缀为 @tourcoder.com 的邮件都会被转发到指定的邮箱。
通过电子邮件发送 DNS 记录：设置 DNS，让该服务启动，点击一键配置，Cloudflare 会配置 DNS。需要注意的是，如果已经有默认的 MX 记录，需要手动先删除，因为 Cloudflare 的自动配置目前还不能自动覆盖，会出错。
目标地址：就是接收邮件的地址，也可以添加多个，同时该地址需要认证。
使用感受 邮件转发的速度挺快。
期待 希望后期能够增加发邮件的路由功能。</description>
    </item>
    
    <item>
      <title>修复升级到 Caddy V2 后 Surge 中出现的 Handshake Failed 错误</title>
      <link>https://tourcoder.com/how-to-fix-handshake-failed-200-ok-on-surge-when-upgrade-to-caddy-v2/</link>
      <pubDate>Mon, 20 Dec 2021 09:10:33 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-fix-handshake-failed-200-ok-on-surge-when-upgrade-to-caddy-v2/</guid>
      <description>这个问题是我在几个月前将 Caddy 升级到 v2 的时候遇到的。在升级后，其他代理软件均可以使用，唯独 Surge。也去其官网和给作者发了邮件，但均未有回应。在 Caddy 的社区也和作者讨论了很长时间，也未能解决。后来在研究后发现并解决了这个问题。需要变更一处地方，Caddy 在配置路由时
proxy.tourcoder.com { tls noreply@tourcoder.com @staff_websocket { path /helloworld header Connection *Upgrade* header Upgrade websocket } reverse_proxy @staff_websocket localhost:1234 } 因为 Surge 在发送 header 的时候发送的是 Connection *upgrade*，而 Caddy 对大小写是有差别的，所以增加一条小写 upgrade 的识别，即
proxy.tourcoder.com { tls noreply@tourcoder.com @staff_websocket { path /helloworld header Connection *Upgrade* header Upgrade websocket } @staff_websocket_alias { path /helloworld header Connection *upgrade* header Upgrade websocket } reverse_proxy @staff_websocket localhost:1234 reverse_proxy @staff_websocket_alias localhost:1234 } 问题解决，在 Caddy 中也可以写成</description>
    </item>
    
    <item>
      <title>如何对 Debian 进行大版本升级</title>
      <link>https://tourcoder.com/how-to-upgrade-debian/</link>
      <pubDate>Tue, 14 Dec 2021 15:09:46 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-upgrade-debian/</guid>
      <description>发现 Docker 的安装脚本在 Debian 的服务器上已经不被支持，通过 cat /etc/os-release 查看，得到如下结果
 也可以通过命令 lsb_release -a 获取更为简短的信息
 执行命令 cat /etc/apt/sources.list 确认一下包源
 果然也是旧的，那执行命令更新包源，并再次查看是否已经更新，我使用了 10 包源
sed -i &#39;s/stretch/buster/g&#39; /etc/apt/sources.list sed -i &#39;s/jessie/stretch/g&#39; /etc/apt/sources.list  最后执行命令
apt upgrade -y apt dist-upgrade  再次查看，可以看出，系统已经更新到 Debian 10 了。还应该通过 apt autoremove 来清理下系统。</description>
    </item>
    
    <item>
      <title>修正 nodejs 连接 mongodb 时出现的错误</title>
      <link>https://tourcoder.com/how-to-fixed-mongoservererror-authentication-failed-with-nodejs/</link>
      <pubDate>Sun, 12 Dec 2021 15:45:40 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-fixed-mongoservererror-authentication-failed-with-nodejs/</guid>
      <description>在服务器上通过 docker 拉起了一个 mongodb，通过客户端链接一切正常。但在 nodejs 中用 MongoClient 去连接时总是提示错误
MongoServerError: Authentication failed 排查
我在连接数据库时用了
mongodb://username:password@server 没有指定数据库，尝试了下指定数据库
mongodb://username:password@server/dbname 问题解决了。
其他
我又去搜索了下这个原因，也有人遇到这样的问题，不过他们的解决办法是在数据库后增加 w=1 即
mongodb://username:password@server/dbname?w=1 有待确定。</description>
    </item>
    
    <item>
      <title>Mosh 试用</title>
      <link>https://tourcoder.com/mosh/</link>
      <pubDate>Wed, 08 Dec 2021 12:42:55 +0000</pubDate>
      
      <guid>https://tourcoder.com/mosh/</guid>
      <description>Mosh 全称 mobile shell，其官网是 https://mosh.org/，特点很多，其中一个很重要的特点是比起 ssh 在一般网络状态下的稳定。因为我日常开发是在 macOS 上通过 ssh 到一台开发机上，因为网络导致的问题还是挺多的，所以这次试试 mosh。虽然早就知道这个，但还是第一次正式使用。
安装 在 macOS 上直接通过 homebrew 安装即可 brew install mosh，而在服务器端也要安装，我用的是 Debian，则运行 apt install mosh -y 即可
使用 和使用 ssh 一样方式
mosh username@server 即可。更多内容可以看其官网或者使用 mosh -h 查看，另外 mosh 使用 ssh 的 key 的登录方式是
mosh --ssh=&amp;quot;ssh -i ~/.ssh/key&amp;quot; username@server 注意点 需要在服务器端开启 60000-65535 的入站端口</description>
    </item>
    
    <item>
      <title>‘砸碎’自己，重新来过</title>
      <link>https://tourcoder.com/born-again/</link>
      <pubDate>Tue, 07 Dec 2021 00:58:22 +0000</pubDate>
      
      <guid>https://tourcoder.com/born-again/</guid>
      <description>最近遇到了很多事情，我产生了一种强烈地对自己非常不满的情绪，我能明显感觉到这种情绪已经伤害到了我的身心健康。在很认真的考虑后，我决定“砸碎”自己，重新来过。
我知道很多事情不是说从头开始就能从头开始的，先从自己力所能及的事情开始。
  告别假性努力
  减少在社交网络上的时间，以及在现实生活中不必要的社交
  学习并精通一门开发语言
  锻炼身体
  </description>
    </item>
    
    <item>
      <title>通过 Github Actions 创建并发布 Docker images</title>
      <link>https://tourcoder.com/build-and-deploy-docker-images-via-github-actions/</link>
      <pubDate>Wed, 01 Dec 2021 13:16:36 +0000</pubDate>
      
      <guid>https://tourcoder.com/build-and-deploy-docker-images-via-github-actions/</guid>
      <description>厌烦了每次手动的创建 docker images，然后还需要发布到 GitHub Container Registry。研究了下 GitHub Actions 在这方面的应用，写了个 demo，记录下操作步骤。
创建一个项目，这里是 dockerdemo，只有一个文件 app.js
const Koa = require(&amp;quot;koa&amp;quot;); const port = &amp;quot;9000&amp;quot;; const app = new Koa(); app.use(async ctx =&amp;gt; { ctx.body = &#39;Hello World&#39;; }); app.listen(port); 如果正常执行，即 node app.js，访问 http://localhost:9000 可以得到 Hello World。
创建 Dockerfile 文件
FROM tourcoder/nodebasic:latest RUN mkdir -p /tcdocker/dockerdemo COPY . /tcdocker/dockerdemo WORKDIR /tcdocker/dockerdemo RUN npm install EXPOSE 9000 CMD node app.js 没有什么特别的地方。
创建 Action，即在项目的根目录下的 .github/workflows/ 文件夹下创建一个 .</description>
    </item>
    
    <item>
      <title>如何在中国境内接收来自 Google 的广告费</title>
      <link>https://tourcoder.com/how-to-accepting-advertising-fees-from-google-in-china/</link>
      <pubDate>Thu, 25 Nov 2021 10:31:44 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-accepting-advertising-fees-from-google-in-china/</guid>
      <description>其实很多年前开始，每个月都陆续收到来自 Google 的广告费，除了第一次收钱去银行验证了下，后面都正常自动入账。但本月 21 日收到 Google 付款的邮件后，今天接到了银行的电话说需要验证下，随即去银行，顺便记录下这个过程。
到银行取号，告诉前台的服务人员说明了来由，她给和我核对了下信息，其实就是让我出具一个证明，证明这个钱是 Google 给我打的，以及是什么理由给我打的。只要给他们提供这份文件即可。
 下载地址是，点结算单的那个链接即可，如下图
 2021年11月27日更新：一早银行来电话说，还需要我手写一个证明给他们。补充了手写证明，等待。</description>
    </item>
    
    <item>
      <title>修正 GitLab 安装时因 UTF-8 引起的错误</title>
      <link>https://tourcoder.com/how-to-fix-utf-8-error-when-installing-gitlab/</link>
      <pubDate>Mon, 22 Nov 2021 03:34:54 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-fix-utf-8-error-when-installing-gitlab/</guid>
      <description>昨天在安装 GitLab 时遇到一个错误
execute[/opt/gitlab/embedded/bin/initdb -D /var/opt/gitlab/postgresql/data -E UTF8] (postgresql::enable line 49) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received &#39;1&#39; 目测是因为 GitLab 默认使用的是 postsql 数据库，系统的编码导致了一个错误，想到每次 SSH 登录时经常冒出编码的提示，尝试修复这个问题，我最后的解决办法如下
echo &amp;quot;LC_ALL=en_US.UTF-8&amp;quot; &amp;gt;&amp;gt; /etc/environment echo &amp;quot;en_US.UTF-8 UTF-8&amp;quot; &amp;gt;&amp;gt; /etc/locale.gen echo &amp;quot;LANG=en_US.UTF-8&amp;quot; &amp;gt; /etc/locale.conf locale-gen en_US.UTF-8 如果提示 locale-gen: command not found，则安装即可 apt install locales -y，记得权限和重启服务器。
另外，我尝试了在 /etc/profile 里面增加
export LC_CTYPE=en_US.UTF-8 export LC_ALL=en_US.UTF-8 并 source /etc/profile，未能成功修复这个问题。</description>
    </item>
    
    <item>
      <title>如何在 Mac App Store 里发布一个 Safari 扩展</title>
      <link>https://tourcoder.com/how-to-distribute-safari-extension-on-mac-app-store/</link>
      <pubDate>Tue, 16 Nov 2021 17:43:47 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-distribute-safari-extension-on-mac-app-store/</guid>
      <description>成功在 Mac App Store 上上架了一个 Safari 插件，整个过程资料缺失的是发布过程，连 Apple 官方都没有详细的说明，特分享一下我的发布过程。
创建应用 因为是在 macOS 上的应用，所以选择的是 macOS -&amp;gt; Safari Extension App
 Certificates 需要创建两个 Certificates，一个是 Mac App Distribution，另外一个是 Mac Installer Distribution
Identifiers 需要创建两个 Identifiers，一个是 com.name.your_app_name，另外一个是 com.name.your_app_name.Extension
Provisioning Profiles 需要创建两个 Provisioning Profiles，一个是为 com.name.your_app_name 创建，另外一个是为 com.name.your_app_name.Extension 创建。
在 Xcode 中配置   如上图所示，在 target 中，为 app 和 extension 选择对应的 Identifier 和 Provisioning Profile。
最后打包提交到 AppStore 即可。至于开发过程和日常开发 macOS 上的应用一样，没有什么特别。</description>
    </item>
    
    <item>
      <title>重写 GLV</title>
      <link>https://tourcoder.com/rewritten-glv/</link>
      <pubDate>Sun, 14 Nov 2021 07:09:14 +0000</pubDate>
      
      <guid>https://tourcoder.com/rewritten-glv/</guid>
      <description>半夜睡不着了，重写了下 glv，已经更新到 GitHub。
glv 全称 Golang Latest Version，顾名思义，它是一个管理 Go 语言的脚本，也能通过它自由的设置 GOPATH。其实网上这类工具脚本挺多的，但感觉都弄得太复杂了，几个月前写了个，今天又把它重写了下。
项目地址：glv。
欢迎各位提交 issue 和 pr。</description>
    </item>
    
    <item>
      <title>[视频]2021 年结婚纪念日，上海迪斯尼之行</title>
      <link>https://tourcoder.com/shanghai-disney-trip-for-wedding-anniversary-20211111/</link>
      <pubDate>Fri, 12 Nov 2021 17:19:45 +0000</pubDate>
      
      <guid>https://tourcoder.com/shanghai-disney-trip-for-wedding-anniversary-20211111/</guid>
      <description>本视频在 Youtube 上，点击观看
因为疫情，还有各位凌晨抢着买买买，还没有起床吧，迪斯尼人特别少。
基本半天时间把所有项目玩了个遍。
这次算是和我老婆过了一个最省钱的结婚纪念日。</description>
    </item>
    
    <item>
      <title>Happy 1024 Day 2021</title>
      <link>https://tourcoder.com/happy-1024-day-on-2021/</link>
      <pubDate>Sun, 24 Oct 2021 18:18:37 +0000</pubDate>
      
      <guid>https://tourcoder.com/happy-1024-day-on-2021/</guid>
      <description>今天是一年一度的程序员节，往年我基本不会发文章庆祝，今天发是因为我打开了我的饭否账号，那时候自己喜欢 mono，还建设了一个 mono 的中文社区，可惜后来没能坚持下去。同一时期的，还有自己的 twitter 账号也找不回来了。
  </description>
    </item>
    
    <item>
      <title>成龙的 200 亿票房</title>
      <link>https://tourcoder.com/jackie-chan/</link>
      <pubDate>Sat, 23 Oct 2021 15:22:06 +0000</pubDate>
      
      <guid>https://tourcoder.com/jackie-chan/</guid>
      <description>刷到一个视频，视频中成龙说自己几十年才筹集到 200 亿的票房，而吴京四部电影就做到了，听着蛮不是滋味的。
兴起，写了篇千字博文，但我博客的忠实读者我老婆看了后，硬是让我删除，那我就放一个姜文说过的话吧。
 </description>
    </item>
    
    <item>
      <title>不要在阿里云上申请商标</title>
      <link>https://tourcoder.com/do-not-apply-for-trademark-on-aliyun/</link>
      <pubDate>Thu, 21 Oct 2021 21:00:16 +0000</pubDate>
      
      <guid>https://tourcoder.com/do-not-apply-for-trademark-on-aliyun/</guid>
      <description>因为公司需要申请几个商标，图方便在阿里云上申请了，但体验很糟糕。
我的两批商标被拒绝了好几天，我两次都没有收到任何一个来自阿里云的通知。每次都是其他商标注册服务机构的促销电话打过来，我才知道我申请的商标被拒绝了。一次我登录阿里云后台查看状态显示还是审核中，另外一次显示已经被拒绝好几天了。
阿里云的这个商标服务是其新弄的公司，服务质量差，态度差，完全是收了钱后不办事。
想要在阿里云上注册商标的，慎重。</description>
    </item>
    
    <item>
      <title>修复 Google Scholar 无法访问的问题</title>
      <link>https://tourcoder.com/fixed-network-error-on-google-scholar/</link>
      <pubDate>Sat, 02 Oct 2021 13:02:21 +0000</pubDate>
      
      <guid>https://tourcoder.com/fixed-network-error-on-google-scholar/</guid>
      <description>想必频繁访问 Google Scholar 网站时或多或少遇到过下面的这个问题
We&#39;re sorry... ... but your computer or network may be sending automated queries. To protect our users, we can&#39;t process your request right now. See Google Help for more information. 造成这个原因的是科学上网的 IP 被 Google 拉黑了。解决这个问题的办法主要有三种
  找一个没有被 Google 拉黑的 IP
  用谷歌上网助手这个浏览器插件。
  修改 Hosts 用 IPv6 访问，Google Scholar 拉黑的基本是 IPv4，本文介绍的是通过 IPv6 开启对 Google Scholar 的访问，具体步骤如下
  先开启服务器的 IPv6 服务，获取 IPv6，然后 SSH 到服务器，在 root 权限下执行下面的内容</description>
    </item>
    
    <item>
      <title>使用 iCloud Plus 中的 Custom Email Domain</title>
      <link>https://tourcoder.com/custom-email-domain-on-icloud-plus/</link>
      <pubDate>Tue, 21 Sep 2021 12:53:27 +0000</pubDate>
      
      <guid>https://tourcoder.com/custom-email-domain-on-icloud-plus/</guid>
      <description>今天登录 iCloud.com 后发现里面多了个 Custom Email Domain，应该就是基于 iCloud mail 的域名邮箱服务，随即试了下。
登录 iCloud.com 进入到账户设置界面，在设置界面里有一个 Custom Email Domain 的功能，选择管理即可进入下面的界面
 从介绍上看，可以为自己或者家庭成员设置域名邮箱，最高可以设置五个域名，每个成员每个域名下面可以设置三个 Email 地址。选择为自己设置，进入下一步
 输入自己的域名，这里我输入了 tourcoder.com，点击继续进入下一步
  所有需要设置的内容就这些，其中 step 2 这一步可以根据自己的情况进行设置，这里可以选择 skip 跳过操作。在 step 3 中选择 view 查看域名相关的解析记录，去自己的域名商那边对自己的域名进行解析操作，然后等待生效，域名解析的说明也可以看官方文档。
 最后点击设置完成，域名解析生效后，即配置完成。
 域名解析生效后，进入管理即可看到上面的界面，表示域名邮箱已经开通可以收发邮件了，至于如何给自己增加一个邮箱，看下图
 点击名字旁边的加号，输入邮箱的用户名即可。
至于邮件的收发均在 iCloud.com 里进行，和平时通过 icloud.com 邮箱收发邮件一样，不同的是现在用的是自己的域名。
家庭共享版 和个人版本差不多，不同的是在给用户添加邮箱地址的时候，个人版是列出自己，而家庭共享版是列出所有家庭共享的人员。
注意点 该功能需要开通 iCloud+ 才可以使用。Apple 是否会扫描我们的邮件呢？</description>
    </item>
    
    <item>
      <title>博客迁移到 Cloudflare Pages</title>
      <link>https://tourcoder.com/hello-cloudflare-pages/</link>
      <pubDate>Tue, 21 Sep 2021 07:39:09 +0000</pubDate>
      
      <guid>https://tourcoder.com/hello-cloudflare-pages/</guid>
      <description>之前本博客是架设在 GitHub Pages 上，利用 GitHub Actions 进行自动化部署，具体看这篇，在最近几个月的试用下来，有三个问题很严重。
  GitHub Actions 抽风的时候很多，导致编译不成功的时候也很多。
  ssl 总是莫名其妙的出问题，导致网站无法被访问
  GitHub Pages 也会抽风，导致网站无法被访问
  昨晚在将博客转移到 Linode 的 VPS 的时候发现 CloudFlare Pages 的广告，试用了下，感觉不错。主要是它和 GitHub 结合，基本不需要做其他的修改。大概步骤设置如下：
  进入 pages.dev，创建一个项目，选择 GitHub 账号和对应的博客仓库关联。
  我用的是 hugo，则在构建部署设置里，命令选择 hugo，输出目录和根目录不修改，环境变量变量名为 HUGO_VERSION，值 0.81.0，为 hugo 指定版本，使用当前 CloudFlare 默认版本会出现编译通不过的情况。生产力分支选择发布分支，我选择的是 master，当所有的内容合并到 master 分支后，启动部署。
   配置到此完成，测试下。更改博客的内容，提交并合并到 Master 分支，此时其他分支开始构建预览，并会在 GitHub 给出结果。
  当构建成功后，CloudFlare 将自动完成后面的发布等工作。
 需要注意 如果只是单个分支，推送到该分支，即自动完成构建和正式的发布。
我是两个分支，master 是作为发布分支，draft 是草稿分支，当我将写好的内容 push 到 draft 这个草稿分支后，CloudFlare 会开始构建并发布一个预览版本供我预览。预览后，我觉得没有问题，在 GitHub 上将 draft 分支合并到 master 分支，此时 CloudFlare 会自动基于 master 发布正式版。</description>
    </item>
    
    <item>
      <title>我常用设备的配置</title>
      <link>https://tourcoder.com/the-configuration-on-my-devices/</link>
      <pubDate>Sat, 21 Aug 2021 21:57:26 +0000</pubDate>
      
      <guid>https://tourcoder.com/the-configuration-on-my-devices/</guid>
      <description>这篇博文会保持不定期的日常更新
整天整理了下自己的 MacBook Pro，发现以前写如何配置设备写了好几篇，太散乱，索性整理到这篇博文里。其实我有很长一段时间不折腾系统了，很多配置都是默认配置。这篇博文主要记录我日常使用的设备的配置情况及少量我必用的应用。
我日常用的设备有一台在 AWS 上的服务器作为开发机，一台 MacBook Pro，一部 iPhone，一台 iPad Pro 以及一块 Apple Watch。
开发机 我有一台架构在 AWS 上的服务器作为开发机，在 GitHub 上我也分享过它的配置信息，只不过那个是英文版，这里列下中文版。
  系统：Debian 系列，当前版本是 9.5+
  机器名称：Nerd，修改 /etc/hostname
  用户：除了本身的预置的 root 和 admin 这类用户外，我会增加一个新用户，并给予它 sudo 的权限
  adduser nerdone usermod -aG sudo nerdone 为了省事，设置了密码登录的方式，即修改 /etc/ssh/sshd_config  中的 PasswordAuthentication
sudo sed -ri &#39;s/^#?(PasswordAuthentication)\s+(yes|no)/\1 yes/&#39; /etc/ssh/sshd_config sudo service sshd restart   常用工具
  Podman: 直接通过命令 sudo apt install podman -y 安装，比起 Docker，我现在基本用它。如果喜欢 Docker，可以通过 Dockerman 安装。</description>
    </item>
    
    <item>
      <title>wget 下载整站</title>
      <link>https://tourcoder.com/download-whole-website-via-wget/</link>
      <pubDate>Wed, 04 Aug 2021 07:23:35 +0000</pubDate>
      
      <guid>https://tourcoder.com/download-whole-website-via-wget/</guid>
      <description>下载整个站点的方式有很多中，用 wget -c -r -np -k -L -p http://domain.com 应该算是比较好玩的一种了吧。</description>
    </item>
    
    <item>
      <title>如何创建一个 Go Mod</title>
      <link>https://tourcoder.com/how-to-create-a-public-go-mod/</link>
      <pubDate>Tue, 27 Jul 2021 21:31:17 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-create-a-public-go-mod/</guid>
      <description>写并发布一个 Go Mod 还是挺方便的。
编写并发布 比如本次要写的 mod 名称为 gomoddemo，文件是 gomoddemo.go，其代码如下
package gomoddemo import &amp;quot;fmt&amp;quot; /*** * * go mod demo * ***/ func PrintHelloTo (name string) string { return fmt.Sprintf(&amp;quot;Hello, %s&amp;quot;, name) } 初始化 go.mod 文件
go mod init github.com/tourcoder/gomoddemo 这里用 github.com/tourcoder/gomoddemo 是因为该 mod 会存放在 GitHub 上。执行后得到结果 go: creating new go.mod: module github.com/tourcoder/gomoddemo，查看 go.mod 为如下内容
module github.com/tourcoder/gomoddemo go 1.16 将这两个文件 push 到 GitHub 上对应的库中，即 https://github.com/tourcoder/gomoddemo 的仓库里即可。但需要注意的是为了很好的版本控制，建议通过 tag 来进行版本的控制，即在该仓库上执行
git tag v0.</description>
    </item>
    
    <item>
      <title>Go 语言中的 GO111MODULE 和 Go Get</title>
      <link>https://tourcoder.com/go111module-and-go-get-in-golang/</link>
      <pubDate>Mon, 26 Jul 2021 12:13:24 +0000</pubDate>
      
      <guid>https://tourcoder.com/go111module-and-go-get-in-golang/</guid>
      <description>Go 语言在 1.11 中加入了 Go Module 作为官方包管理形式，因而不同的设置会导致执行 go get 下载第三方包时，包将下载到工作区的根目录下的不同的文件夹中，引用也会不一样。
在终端中输入命令 go env 查看 go 语言环境中的 GO111MODULE，有三种状态
  GO111MODULE=&amp;quot;&amp;quot;
默认情况，可以理解为是自动模式，Go 命令行会根据当前目录来决定是否启用 module 功能。这种情况下可以分为两种情形
  当前目录在 $GOPATH/src 之外且该目录包含 go.mod 文件
  当前文件在包含 go.mod 文件的目录下面
  当 module 功能启用时，$GOPATH 在项目构建过程中不再担当 import 的角色，但它仍然存储下载的依赖包，保存于 $GOPATH/pkg/mod。
  GO111MODULE=&amp;quot;off&amp;quot;
可以通过 go env -w GO111MODULE=off 设置生效，此时的 Go 命令行不支持 module 功能，沿用旧版本通过 vendor 目录或者 $GOPATH 模式来寻找依赖包。通过 go get 下载的第三方包都会被下载到 $GOPATH/src 这个文件夹中，同时会在 pkg 这个文件夹中生成对应的文件，同样用上面的 Gin 举例，得到的目录结构如下图</description>
    </item>
    
    <item>
      <title>在线版的 VSCode: Code Server</title>
      <link>https://tourcoder.com/code-server-vscode-online/</link>
      <pubDate>Mon, 19 Jul 2021 11:31:48 +0000</pubDate>
      
      <guid>https://tourcoder.com/code-server-vscode-online/</guid>
      <description>一直没有机会获得 GitHub 的 Codespaces 权限，索性安装了个开源版本的 VSCode，项目地址是 https://github.com/cdr/code-server.
准备工作 安装了 Debian 9.x 的服务器一台
安装步骤 将最新版本的 code server 下载到服务器，并解压
curl -OL https://github.com/cdr/code-server/releases/download/v3.11.0/code-server-3.11.0-linux-amd64.tar.gz tar -zxvf code-server-3.11.0-linux-amd64.tar.gz 启动服务 使用比较简单，直接调用即可
cd code-server-3.11.0-linux-amd64 ./code-server 运行后，可得到下面的内容
 直接访问是访问不了的，需要修改配置
vi ~/.config/code-server/config.yaml  将 bind-addr 中的 127.0.0.1 改成 0.0.0.0 即可，这里的端口也可以按需要修改。
使用 访问 ip:端口 即可得到如下界面
 输入上面配置文件 ~/.config/code-server/config.yaml 中的密码即可进入。
一些使用界面    功能还挺多的，还真的很不错。</description>
    </item>
    
    <item>
      <title>试用 Github Copilot</title>
      <link>https://tourcoder.com/try-github-copilot/</link>
      <pubDate>Wed, 14 Jul 2021 11:37:30 +0000</pubDate>
      
      <guid>https://tourcoder.com/try-github-copilot/</guid>
      <description>有幸获得了 GitHub Copilot 的邀请，今天正好有时间，就写一个简单的中文教程吧。
GitHub Copilot 是什么？ GitHub Copilot 的 slogan 是 Your AI pair programmer，顾名思义就是你的结对编程伙伴，它是基于 AI 的。其官网是 https://copilot.github.com。
现阶段，它是以 Visual Studio Code 的插件形式出现的，所以目前需要 Visual Studio Code 的支持，当然 GitHub Codespaces 也支持。
如何使用   准备工作
  Visual Studio Code
  安装 GitHub Copilot 插件
可在 Visual Studio Code 插件市场里搜索 GitHub Copilot，然后安装，或者访问https://marketplace.visualstudio.com/items?itemName=GitHub.copilot 安装。安装好后入下图
     使用步骤
在 VSCode 中授权登录已经拥有 GitHub Copilot 权限的 GitHub 的账号，需要用到 GitHub 账号的原因应该是目前它处于邀请测试阶段，还有代码安全的问题。</description>
    </item>
    
    <item>
      <title>爱与死亡</title>
      <link>https://tourcoder.com/love-and-death/</link>
      <pubDate>Thu, 08 Jul 2021 19:42:28 +0000</pubDate>
      
      <guid>https://tourcoder.com/love-and-death/</guid>
      <description>昨天和老婆好好聊了聊，聊到了未来，甚至生与死。
我说我现在只想好好的能够努力再干十年，多赚点钱，然后我就带着她全世界的去旅游，如果在路途中我死了，就让她将我以当地的风俗葬了，或者把我火化后，撒向大海。如果可行的话，留一小坨骨灰，将我发射到太空中去。
她的想法还是和刚结婚的时候一样，还是那么的幼稚。她说她想在我前面死，只有她死了，我才可以死。她让我坚持活到 80 多岁，这样她就能活到她想要活到的年龄 70 岁。
最后贴上三周年结婚纪念日时，我写的一首关于我俩的歌《大半和小半》
(唱) 我终于明白一直没有遇见你 那不过是时间送我们的距离 从人群中看见你的那一刻起 我就给孩子想好了名字 oh～banban (Rap) 2005的夏天 大半离开大学校园 走上社会 和人生直接面对 2005的夏天 小半还在初中校园 初二补课 偷偷出去玩乐 2015的夏天 大半小半开始了网恋 三个月的时间 开启新起点 铁婚过半 没有太多磕绊 虽然偶有争吵 但这就是生活呀 (唱) 我终于明白一直没有遇见你 那不过是时间送我们的距离 从人群中看见你的那一刻起 我就给孩子想好了名字 oh～banban (Rap) 萌萌的小半 就是个懒蛋蛋 对生活她有很多期盼 爱美爱买是她的最爱 冷冷的大半 生活中的好汉 总是笑着应对 让两人生活不再犯难 携手同行 迎接最终的彼岸 (唱) 我只想和你在一起 越来越近没有一点的距离 当我们相爱的那一天起 就想着一直走下去 走下去...走...下去... </description>
    </item>
    
    <item>
      <title>Fixed Xcode Crashes When Archiving App</title>
      <link>https://tourcoder.com/fixed-xcode-crashes-when-archiving-app/</link>
      <pubDate>Thu, 01 Jul 2021 12:46:23 +0000</pubDate>
      
      <guid>https://tourcoder.com/fixed-xcode-crashes-when-archiving-app/</guid>
      <description>在用 Xcode 打包应用时总是会导致 Xcode 闪退，检查其 log 后发现是因为 Source Control 引起的。
解决方法
进入 Xcode 的 Preferences，选择 Source Control 选项卡，然后将 Enable Source Control 的勾选取消。
 即将上图的 Source Control 取消勾选即可。</description>
    </item>
    
    <item>
      <title>NGROK 使用指南</title>
      <link>https://tourcoder.com/ngrok-abc/</link>
      <pubDate>Fri, 18 Jun 2021 11:50:07 +0000</pubDate>
      
      <guid>https://tourcoder.com/ngrok-abc/</guid>
      <description>日常情况下，我都是在一台带有公网独立 IP 的 vps 上做开发，给外部提供调试链接是一件很方便的事。而在没有公网 IP 的本地电脑上，就有一个好用的东西提供了类似的服务 &amp;ndash; ngrok。这个东西使用极其简单，以 macOS 为例
  先去官网下载
进入 http://ngrok.com，注册账号获取 Authtoken，并下载系统对应的版本，我这下载了 macOS 的版本。
  将下载的文件解压后放到一个目录下，比如我放入了 ~/workspace/tool 这个目录下
  进入到这个目录，并执行命令进行授权(如已经授权，此步可以省略)
./ngrok authtoken 官网得到的token   将程序衍射到外网
./ngrok http 端口号 这里的端口号是本地程序运行的端口号，比如我的程序端口号是 3700，则执行 ./ngrock http 3700 即可得到如下结果
 如上图，http://2d2a38beadcf.ngrok.io 这个就是与本地程序衍射的外部链接，除了 http 链接外，它还提供了 https 的链接。
  完事，更多用法可以参考 ./ngrok help。
还可以用个更省事的办法，就是将执行文件 ngrok 移动到 /usr/local/bin，然后直接用 ngrok 来运行，比如 ngrok http 3000。</description>
    </item>
    
    <item>
      <title>WWDC 2021</title>
      <link>https://tourcoder.com/wwdc-2021/</link>
      <pubDate>Tue, 08 Jun 2021 11:11:14 +0000</pubDate>
      
      <guid>https://tourcoder.com/wwdc-2021/</guid>
      <description>一年一度的 WWDC 来了，照例第一时间在设备上更新了几个系统，macOS，iOS， iPadOS，watchOS 和 tvOS，不过这次我没有更新 tvOS。不少 keynote 中说到的内容，在当前这个开发者测试版中还没有出现。这篇博文主要记录我体验后的感受及我觉得值得一提的功能。
iOS 15 不少更新都是我日常基本不用的，比如 facetime，message，钱包，照片管理等。
天气这个应用增色不少。
通知中增加了一个专注内容，这点很棒
 最让我喜欢的是在 设置-&amp;gt;顶部的名字-&amp;gt;密码与安全性 下面多了一个遗产联系人，可以在这里添加一个遗产联系人。
 macOS 最棒功能应该要属 Universal Control 了，在 iMac，MacBook Pro 以及 iPad 之间可以用一套键盘鼠标进行无缝操作，拖拽内容。
Safari 的新版设计也很好看
 iPadOS iPadOS 最让我觉得不错的功能就三个
  增加了 App Library，不过当前似乎有个 bug
  新的界面设计，新的 widgets 布局，很棒
   能够用 iPad 开发 iOS 和 iPadOS 上的应用了
  watchOS 我用 Apple Watch 主要是检测运动，睡觉以及一些提醒，比如坐久了起来站一会，有时候看一下时间。
watchOS 一直有一个很蠢的设计就是无法批量删除 message 里面的内容，很可惜这次依旧没有把这个功能加入进来，按当前的情况来看 Apple 是不想把这个功能带入进来了。</description>
    </item>
    
    <item>
      <title>解决国别电话区号一样的问题</title>
      <link>https://tourcoder.com/solved-the-problem-of-the-same-country-phone-area-code/</link>
      <pubDate>Thu, 03 Jun 2021 10:49:33 +0000</pubDate>
      
      <guid>https://tourcoder.com/solved-the-problem-of-the-same-country-phone-area-code/</guid>
      <description>因为很多国家的电话国别号是一样的，比如美国，加拿大都是 +1，区分他们的办法是在存数据时增加一个 iso3166 国家代码即可解决</description>
    </item>
    
    <item>
      <title>基于 Github Actions 部署我的博客</title>
      <link>https://tourcoder.com/github-actions-of-my-blog/</link>
      <pubDate>Wed, 02 Jun 2021 22:34:08 +0000</pubDate>
      
      <guid>https://tourcoder.com/github-actions-of-my-blog/</guid>
      <description>之前有说过我的博客移到了 GitHub Pages，我写博客的步骤是：
  在开发机上直接写博文
  用 hugo 来生成页面
  将所有的内容 git push 到 GitHub 完成发布
  最近在使用 GitHub Actions 做东西，顺便升级了下自己的博客。写博文的步骤更新成：
   开发机上写博文
  将写好的内容 git push 到 draft 分支
  将 draft 分支的内容合并到主分支 master
  当分支合并完成后，触发 Action
  由 Action 来执行 hugo 生成页面并部署发布到展示内容的分支
  看着似乎多了些步骤，我这样做的原因放到博文最后我再说明。整个 Action 的代码如下
name: GitHub Pages on: push: branches: [ master ] jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2.</description>
    </item>
    
    <item>
      <title>在 macOS 的终端里安装 dmg 或 pkg 文件</title>
      <link>https://tourcoder.com/install-dmg-or-pkg-via-terminal-on-macos/</link>
      <pubDate>Mon, 31 May 2021 09:54:38 +0000</pubDate>
      
      <guid>https://tourcoder.com/install-dmg-or-pkg-via-terminal-on-macos/</guid>
      <description>痴迷终端，想什么都通过它来解决，即便是安装 macOS 上的应用，命令如下
DMG 文件
比如该文件名是 downloadedFileName
hdiutil attach path/downloadedFileName.dmg 执行该命令后，将在 /Voumes 下挂载该 dmg 文件，进入到该文件夹（比如是 mountedPackage）
cd /Volumes/mountedPackage 执行命令将里面 .app 后缀的文件包复制到 /Applications 中，即
cp -rf .app /Applications 因为这里的 .app 不是单个文件，而是一个包，复制时需要参数 -r。最后退出挂载。
hdiutil detach mountedPackage PKG 文件
执行命令
sudo installer -pkg downloadedFile.pkg -target /Applications </description>
    </item>
    
    <item>
      <title>解决 firebase login 时的验证失败的问题</title>
      <link>https://tourcoder.com/fix-authentication-error-on-running-firebase-login/</link>
      <pubDate>Sun, 30 May 2021 16:31:46 +0000</pubDate>
      
      <guid>https://tourcoder.com/fix-authentication-error-on-running-firebase-login/</guid>
      <description>写了个简单的笔记和收藏夹的合体应用，懒得再去搭建后端，使用了 firebase，挺方便的。
 不过在验证时总是出现问题，即执行命令 firebase login 时会出错
Error: Authentication Error: Your credentials are no longer valid. Please run firebase login --reauth For CI servers and headless environments, generate a new token with firebase login:ci 开始我以为是因为访问 localhost 导致，因为直接用 firebase login 时会调用默认浏览器访问账户，但第一次总是不成功，都会第二次调用后才可以得到登录用的授权码，使用该授权码后就会出现上面的错误，遂用不调用本地的方式尝试 firebase login --no-localhost，能成功在第一次就获取到授权码了，但问题依旧。
搜索后在 stackoverflow 上看到这么一个解决方法，https://stackoverflow.com/questions/44471670/firebase-init-command-failing-to-execute，即 export NODE_TLS_REJECT_UNAUTHORIZED=0，但问题还是存在，而用不使用代理的服务器测试后觉得问题还是出现在代理上。
最后将 http 也进行了代理，问题完美解决，方案如下
  设置环境变量
export NODE_TLS_REJECT_UNAUTHORIZED=0 Windows cmd 下使用 set。
  对 http 进行代理
export http_proxy=http://127.0.0.1:8080 代理的信息根据自己的情况来。
  </description>
    </item>
    
    <item>
      <title>IRC 快速入门</title>
      <link>https://tourcoder.com/new-to-irc/</link>
      <pubDate>Sun, 30 May 2021 10:33:28 +0000</pubDate>
      
      <guid>https://tourcoder.com/new-to-irc/</guid>
      <description>最近 freenode 的收购方做了一些谜一样的操作导致大家都开始逃离 freenode 这个长达十多年的 IRC 服务。IRC 是一种网络聊天协议，freenode 根据该协议组成了聊天网络，其实也有其他的聊天网络，只不过 freenode 更为出名，基本是“古老”开源的标配了。
有人逃离，就需要有地方接受，一些人就搞了 libera.chat，借用这次迁移介绍下一些简单的 IRC 操作.
  大致流程
有很多客户端可以选择，这里我以 libera.chat 的 web 客户端为例，https://web.libera.chat/，打开页面，在 Nick 处输入用户名，默认是没有密码的，然后进入。比如我以 tourcoder 这个昵称进入了聊天室
 这样即可在里面聊天了。左侧 # 是不同的频道/主题，可以搜索相关的频道/主题，然后加入
 频道/主题之间的切换点击即可，有些频道/主题是邀请机制的，也有些需要用户验证身份，比如 python 在 libera.chat 上的频道/主题
 将当前使用的昵称注册即可，在输入框输入命令 /msg nickserv register 密码 email地址 并回车执行
 打开自己的邮箱，按邮件中说明的方式验证即可，这时再进入之前的 python 频道/主题即可发现已经可以访问了
   其它操作命令
更改昵称 /nick 新昵称
加入某个频道/主题 /join #频道名，命令行版本的加入频道/主题的方式
加入其它的聊天网络 /server 其它聊天网络地址，不是所有的频道/主题都会建立在 libera.chat 或者 freenode 上
  最后推荐一款终端版本的客户端 https://github.com/irssi/irssi</description>
    </item>
    
    <item>
      <title>命令行下比较文件夹内容</title>
      <link>https://tourcoder.com/compare-contents-in-folder-via-cli/</link>
      <pubDate>Sun, 30 May 2021 09:45:30 +0000</pubDate>
      
      <guid>https://tourcoder.com/compare-contents-in-folder-via-cli/</guid>
      <description>比较两个文件夹内容是否有差异的办法很多，不过命令行是我的最爱 diff -bur [文件夹1] [文件夹2] 或者 rsync -rcnv [文件夹1] [文件夹2]</description>
    </item>
    
    <item>
      <title>Google 账户中清理自己的设备</title>
      <link>https://tourcoder.com/how-to-remove-your-device-in-your-google-account/</link>
      <pubDate>Fri, 28 May 2021 11:46:55 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-remove-your-device-in-your-google-account/</guid>
      <description>如果设备丢失，访问 https://myaccount.google.com/security-checkup/2，清理自己的设备。</description>
    </item>
    
    <item>
      <title>甲骨文 vps 的防火墙设置</title>
      <link>https://tourcoder.com/iptables-settings-to-oracle-cloud-vm-instance/</link>
      <pubDate>Tue, 25 May 2021 13:14:36 +0000</pubDate>
      
      <guid>https://tourcoder.com/iptables-settings-to-oracle-cloud-vm-instance/</guid>
      <description>测试签发的银行卡，顺道撸了个甲骨文云的永久免费的 VPS，在上面搭建了一个饭饭服务。搭建后发现无法访问需要用到的 80/443 这两个端口。
在终端下执行命令 telnet 域名或IP 端口，因为在 macOS 下默认是没有 telnet 的可以直接安装或者使用 nc，即
nc -v domain.com port 得到的结果是 nc: connectx to domain.com port 443 (tcp) failed: Connection refused，说明端口未通。
解决办法   先添加 ingress
点击 vps，选择 Primary VNIC 下面的 Subnet，然后在 Security Lists 下选择 Default Security List for ...，在 Ingress Rules 下增加一条 Rule。
SOURCE TYPE - CIDR
SOURCE CIDR - 0.0.0.0/0
IP PROTOCOL - All Protocols(也可以根据自己的情况选择)
  在 vps 中增加防火墙信息，开放所有的端口
sudo iptables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -F sudo iptables-save   当然如果想开放指定的端口，比如开放 8080 端口，格式为 sudo iptables -I INPUT -p tcp --dport 8080 -j ACCEPT。</description>
    </item>
    
    <item>
      <title>Shell 的变量默认值</title>
      <link>https://tourcoder.com/shell-default-value/</link>
      <pubDate>Sat, 01 May 2021 14:21:06 +0000</pubDate>
      
      <guid>https://tourcoder.com/shell-default-value/</guid>
      <description>一共有两种格式， ${bar-default_value} 和 ${bar:-default_value}，在不同的时候显示的结果也不一样
#!/usr/bin/env bash bar1=${bar-&amp;quot;text&amp;quot;} echo $bar1 这里并没有定义 bar，得到的结果是 text
#!/usr/bin/env bash bar=&amp;quot;&amp;quot; bar1=${bar-&amp;quot;text&amp;quot;} echo $bar1 这里定义了 bar，但没有赋值，输出结果是空
#!/usr/bin/env bash bar=&amp;quot;bar_value&amp;quot; bar1=${bar-&amp;quot;text&amp;quot;} echo $bar1 这里定义了 bar，并且赋值了，输出结果是 bar_value
#!/usr/bin/env bash bar1=${bar:-&amp;quot;text&amp;quot;} echo $bar1 这里也没有定义 bar，输出结果是 text
#!/usr/bin/env bash bar=&amp;quot;&amp;quot; bar1=${bar:-&amp;quot;text&amp;quot;} echo $bar1 这里定义了 bar，但没有赋值，输出结果是 text
#!/usr/bin/env bash bar=&amp;quot;bar_value&amp;quot; bar1=${bar:-&amp;quot;text&amp;quot;} echo $bar1 这里定义了 bar，并且赋值了，输出结果是 bar_value
总结，${bar-default_value} 和 ${bar:-default_value} 只有在 bar 被定义但没有赋值的情况下是不同的，其他情况一致。需要注意的是 bar=&amp;quot; &amp;quot; 算是赋值了，两者显示结果是一样的。</description>
    </item>
    
    <item>
      <title>处理 CURL 下载 ASCII text 问题</title>
      <link>https://tourcoder.com/solved-ascii-text-issue-when-downloading-via-curl/</link>
      <pubDate>Sat, 24 Apr 2021 20:16:17 +0000</pubDate>
      
      <guid>https://tourcoder.com/solved-ascii-text-issue-when-downloading-via-curl/</guid>
      <description>用 curl -O 下载 golang 官网的的新版本安装文件时，得到的文件类型是 ASCII text，原因是这里有一个 redirect，应该增加参数 L，即 curl -LO https://golang.org/dl/go1.16.3.src.tar.gz</description>
    </item>
    
    <item>
      <title>拈花湾和灵山大佛两日游</title>
      <link>https://tourcoder.com/two-days-in-wuxi-nianhuawan-202104/</link>
      <pubDate>Fri, 23 Apr 2021 17:51:40 +0000</pubDate>
      
      <guid>https://tourcoder.com/two-days-in-wuxi-nianhuawan-202104/</guid>
      <description>本文配有视频在 Youtube 上，点击观看
去了一趟无锡，此行的目的地是拈花湾和灵山大佛，算上来时间，一共花了两天时间。
第一天 因为无锡离上海很近，我们选择了驱车前往，早上十点出发，中午十二点半左右到了。
我们的酒店在拈花湾里，所以第一天基本都是在拈花湾里，没有出来。
第二天 去了灵山看了大佛。
感受 吃：
拈花湾完全没有一个很好的规划，基本都是主食这类的东西，小笼包等什么的，有点特色路边小吃都没有。
灵山大佛那边有一些特色的小吃，本来我老婆是想吃那的素食自助的，但我没有同意，原因是人太多，我是比较担心卫生情况的，尤其是现在疫情情况下，我们选择了吃套餐，198 两个人，环境比较干净舒服。
喝：
拈花湾里让我们最尴尬的事情就是喝水了，便利店关门了，我们想买一瓶矿泉水都没有办法买到，和酒店前台买，她说他们酒店不卖，送了我们两瓶，挺感谢她的。
灵山大佛那边一切正常。
住：
这次只是住了一个晚上，是拈花湾里的精品客栈，只能说凑合吧。如果来住的话，我的建议是精品客栈里面的水云间和禅岛。
行：
拈花湾并不大，所以步行可能更合适。
强烈推荐灵山大佛里面的 40 元一天的车票。
景色：
拈花湾的特点在晚上的节目表演，其他自然景色都在开发中，没多少，这也是我觉得它规划不好的地方之一。能唯一称得上是景色的就是鹿鸣谷了吧。不如出了拈花湾看外面的湖。
灵山大佛的除了景色之外，建筑，文化介绍等都值得一玩。汉传佛教，南传佛教和藏传佛教的三个标志建筑相对而望，很有意思。</description>
    </item>
    
    <item>
      <title>试用 Raycast</title>
      <link>https://tourcoder.com/try-raycast/</link>
      <pubDate>Sat, 20 Mar 2021 20:35:57 +0000</pubDate>
      
      <guid>https://tourcoder.com/try-raycast/</guid>
      <description>我之前在 「macOS 上必装的应用」一文中推荐过 Alfred 这款应用，那是我必装的应用，也是我打开频率排名前几的应用，不过这几年，它的生态没有做得起来，实属有点遗憾。
最近发现了一个新的类似应用，我试用后感觉不错。有意思的是，它的扩展形式更为开放，你可以用 applescript，shell，js，php，python，ruby，swift 来写它的扩展，具体看其官方在 GitHub 上的库 https://github.com/raycast/script-commands。
目前该应用还在 beta 中，可以去其官网下载 https://raycast.com</description>
    </item>
    
    <item>
      <title>DC/EP 是什么</title>
      <link>https://tourcoder.com/what-is-dcep/</link>
      <pubDate>Thu, 11 Feb 2021 10:06:49 +0000</pubDate>
      
      <guid>https://tourcoder.com/what-is-dcep/</guid>
      <description>之前有简单体验过的 DC/EP 的应用，没有什么太多的感觉，直到今天才有机会第一次做产品的拆解。鉴于当前的保密协议，我只写一些我能说的。
1. DC/EP 到底是什么 DC/EP 这里包含两个东西，DC 和 EP，DC 就是 Digital Currency，翻译过来就是数字货币，EP 就是 Electronic Payment，翻译过来就是电子支付。
在当前的体现状态是一个叫数字人民币的 app。而数字人民币顾名思义，就是数字版的人民币，和实体的纸钞硬币不同，它是虚拟的，由国家央行发行的法定货币。
据说是基于区块链技术。
2. 它是不是加密货币和加密钱包 都不是！
它和比特币，以太币这类加密货币不一样，从它的名称就可以看出来，它是 Digital Currency，而加密货币是 Crypto Currency。
它的 app 可以理解为是一个钱包，做法也是和支付宝等这类 app 一样的。它缺少了加密钱包必备的因素 &amp;ndash; 私钥。但凡接触过加密钱包的人都知道，永远不要用一个不提供私钥的钱包。而且私钥这个东西对任何一个国家来说，推广起来，其实挺难的，受民众知识水平，认知能力等影响太大。
3. 它的竞争对手是谁 当初刚听到国家要基于区块链做加密货币时，我的第一反应是国家是想从另外一个角度取代美元的霸主地位，想获得铸币权，想取代 BIC 的地位。但目前看起来，可能我想太多了。从当前状态来看，它只是把人民币数字化。
其实这么多年来，得益于支付宝微信支付等很多支付机构，还有银行的努力，在中大城市已经做得很好，很少见到现金。但连接各家银行，连同各种数据的事情基本都是支付宝，微信支付这类公司在做，所以当前它的竞争对手更多的是支付宝和微信支付等这些产品的支付业务的。
4. 副作用 很多很多很多很多.</description>
    </item>
    
    <item>
      <title>玩转 Github: Github Issue Template</title>
      <link>https://tourcoder.com/github-tour-github-issue-template/</link>
      <pubDate>Thu, 04 Feb 2021 04:41:52 +0000</pubDate>
      
      <guid>https://tourcoder.com/github-tour-github-issue-template/</guid>
      <description>对常用 GitHub 的人来说，利用 GitHub 的 issue 功能作为问题的反馈中心，并用它驱动工作很不错，但有个问题是用户在提交 issue 的时候常常乱七八糟，格式不统一，描述问题不清晰，带来了很大的沟通成本，用 issue 的 template 就可以解决这个问题。
先进入 GitHub 上的项目库，点击设置 (Settings)
 在设置中选择左侧的 options，然后右侧找到 issues，并点击右侧的 Set up templates
 选择一个模板形式，我这选择自定义模板
 选择已经生成的自定义模板的 Preview and edit
 点击编辑按钮，即可编辑该 issue 的模板
 然后点击右上角的 Propose changes
 最后提交该更新即可。
这样一个 issue 的模板即完成了。</description>
    </item>
    
    <item>
      <title>一堂生活中的商业课</title>
      <link>https://tourcoder.com/a-business-lesson-in-life/</link>
      <pubDate>Fri, 29 Jan 2021 09:08:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/a-business-lesson-in-life/</guid>
      <description>今天发生这么一件事，让我不知道是自己太老实太相信人，还是我太蠢了。
事情经过是这样的，最近想给我老婆做砂锅吃，就在京东下单买了一口几百块钱的小砂锅，心想这价格品质会有保障。三点多时，我老婆打开菜鸟裹裹查看自己是否有新快递时，看见了一条快递信息，是我买的那口锅的信息。
她便和我说，京东商家从淘宝买了口锅再卖给我。
我说不可能，我是从京东买的，京东的商家应该不会帮我从淘宝下单买的。我还和我老婆争论说因为商家用的是第三方快递，自然快递信息会在菜鸟裹裹里面了。
我的想法是京东的这个商家可能会没有自己的仓库库存，也可能有供应商，甚至可能让自己的供应商直接发货，但至少这个商家会挑选自己的供应商以保证自己所售卖的商品的品质，而不是直接赚个差价的转卖订单。毕竟转卖订单这种事情无法控制产品质量，而且对商家的品牌，名声信誉等都可能会有损伤。
显然我还是低估了这些商家的底线，虽然我和我老婆争论，但我还是对信息做了下对比，我是 12:15 在京东下单，12:51 该商家从淘宝帮我下单等等，然后我联系京东商家客服，询问情况，对方并不愿意在有保存记录的地方说什么，一个电话直接打了过来。
我和对方说你们直接这样转卖订单，从中赚了淘宝价格的几倍钱，这个有点过分啊。而且怎么保证产品质量？这东西我不要了，取消订单。
对方和我说马上给我退款，东西就送我了，当然我拒绝他送东西，让他不要给我发了。
这满满的套路啊！</description>
    </item>
    
    <item>
      <title>Transfer Skype Number to Fi</title>
      <link>https://tourcoder.com/transfer-skype-number-to-fi/</link>
      <pubDate>Thu, 28 Jan 2021 03:09:46 +0000</pubDate>
      
      <guid>https://tourcoder.com/transfer-skype-number-to-fi/</guid>
      <description>把 Skype Number 转移到了 Google Fi，记录下过程。
第一步：获取 Skype Number 的 account number 和 PIN
  Skype Number 的 account number 就是 Skype Number，去掉美国区号(+1)，比如号码是 +1(201)000-1234，那么 account number 就是 2010001234
  PIN 是 0000 或者 000000
  第二步：注册使用 Google Fi，并转移号码
根据 fi 的激活流程一步一步走，其中在 your phone number 这一步，选择 Bring a current number to Fi，并在下面的空格处填入 Skype Number，然后下一步一下不进行下去。
在转入号码的环节，选择 other，输入前面获取到的 account number 和 PIN，然后一直到完成。
第三步：等待
会收到两封邮件，一封是来自 Google Fi 的说激活完成，这封邮件来得比较快，但此时要继续等，号码虽然在 Google Fi 中已经显示，但还在转移中，差不多 24 小时左右，会收到一封来自 Skype 的邮件，标题为 Your subscription has been successfully cancelled，此时号码转移已经完成。</description>
    </item>
    
    <item>
      <title>Docker 中升级 postgres</title>
      <link>https://tourcoder.com/upgrade-incompatible-postgres-data-directory-docker/</link>
      <pubDate>Sun, 03 Jan 2021 07:59:43 +0000</pubDate>
      
      <guid>https://tourcoder.com/upgrade-incompatible-postgres-data-directory-docker/</guid>
      <description>在将 Docker 方式安装的 Postgres 升级时总是不成功，通过 docker logs --details 该数据容器的id 查看，得到如下信息
PostgreSQL Database directory appears to contain a database; Skipping initialization 2021-01-03 02:46:10.988 UTC [1] FATAL: database files are incompatible with server 2021-01-03 02:46:10.988 UTC [1] DETAIL: The data directory was initialized by PostgreSQL version 10, which is not compatible with this version 13.1 (Debian 13.1-1.pgdg100+1). 解决办法
  先导出数据，至于 docker 中怎么导出数据，可以看这篇文章
  执行命令 docker volume ls，找到该数据 Drive
  执行命令 docker volume rm 该drive的名字 即可。</description>
    </item>
    
    <item>
      <title>Hugocast - 基于 hugo 的播客程序</title>
      <link>https://tourcoder.com/hugocast/</link>
      <pubDate>Sat, 02 Jan 2021 06:37:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/hugocast/</guid>
      <description>基于 hugo 开发了一个播客的服务，已开源在 GitHub 上，有需要的可以自取。
https://github.com/tourcoder/hugocast。
具体如何使用等，在上面的仓库中已经有清楚的说明。</description>
    </item>
    
    <item>
      <title>疯狂的比特币，买还是不买</title>
      <link>https://tourcoder.com/crazybitcoin-001/</link>
      <pubDate>Sun, 27 Dec 2020 06:37:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/crazybitcoin-001/</guid>
      <description>比特币已经涨疯了，这时候是应该买，还是不买呢？
收听地址：
在 iPhone/iPad/Mac 上收听</description>
    </item>
    
    <item>
      <title>From Ghost to Github Pages</title>
      <link>https://tourcoder.com/from-ghost-to-github-pages/</link>
      <pubDate>Fri, 25 Dec 2020 07:21:08 +0000</pubDate>
      
      <guid>https://tourcoder.com/from-ghost-to-github-pages/</guid>
      <description>把本博客从 Ghost 迁移到了 GitHub Pages，原因有二
  受不了 Ghost 日趋臃肿
  我的 GitHub Pro 还有 10 个月到期，不用也浪费。
  整个迁移过程还是挺简单的，大致步骤如下：
  先登录 Ghost 的后台导出内容，会是一个 json 格式的文件。
  将该 json 格式的文件转化成 markdown 文件，可以用 ghostjson2markdown 这个开源工具操作。
  将生成的 markdown 文件使用静态博客生成工具生成静态的页面，我使用的是 hugo，官网 gohugo.io，具体怎么操作，在其官网有。这里会生成的一个 public 的文件夹，里面就是整个网站的内容了。
  去 GitHub 创建一个仓库，开启 GitHub Pages 功能，如下图
 如果不绑定自己的域名可以用 GitHub pages 的自带域名，还可以开启 ssl，使用自己的域名也可以使用 ssl。这里一个小提示，如果是二级域名，系统会提示你使用 cname 绑定的方式，如果是 apex，即不是二级域名，则指向 ip 地址。
  将第三步生成的静态页面（public 文件夹中内容）上传到这个代码库中即可。</description>
    </item>
    
    <item>
      <title>解决 iPhone 中由于访问限制，无法退出登录的问题</title>
      <link>https://tourcoder.com/sign-out-is-not-available-due-to-restrictions/</link>
      <pubDate>Wed, 11 Nov 2020 10:04:35 +0000</pubDate>
      
      <guid>https://tourcoder.com/sign-out-is-not-available-due-to-restrictions/</guid>
      <description>先上图
 想退出 iPhone 的账号，但出现这样的问题，网上搜索了很多办法，都是抄来抄去，没有一个正确的。正确的做法是
 进入屏幕时间 -&amp;gt; 内容和隐私限制 -&amp;gt; 允许账户更改  这一步，网上都说到了，但这里更改后，还是不行。
进入屏幕时间，将屏幕时间的密码关闭  这一步才是重点，关闭了屏幕时间的密码，这时候才可以退出账号。</description>
    </item>
    
    <item>
      <title>Google Voice 号码买断</title>
      <link>https://tourcoder.com/how-to-make-your-google-voice-number-permanent/</link>
      <pubDate>Mon, 09 Nov 2020 08:48:39 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-make-your-google-voice-number-permanent/</guid>
      <description>Google Voice 是个好东西，可以通过它可以获得一个美国号码，可以免费接受全世界的短信，接全世界的电话，而且终身免月租费。以前获得这些号码是免费的，但这两年获取的成本有点高，而且还很费事。
随着 Google 盈利需求旺盛，现在他们对 Google Voice 也做了一个政策，每隔 60 天需要用 Google Voice 里面的号码打一次电话或发一次短信，不然这个号码会被回收，当然 Google 会发邮件提醒你这件事。
Google 官方也给出了一个政策，可以通过付钱的方式永久买断你的号码，你还可以获得第二个美国号码，在同一个账号里。
我在之前的博文「为什么我放弃了 Google Fi」 中有提到，我将 Google Fi 一直用的号码转移到了 Google Voice，因为这个号码绑定了很多东西，号码丢失会很麻烦，所以我需要将这个号码买断，这里记录下整个过程。
首先访问 https://voice.google.com 登录账号密码。
 点击左上角的菜单，选择最下面的 Legacy Google Voice
 选择 Phones，然后点击号码后面的 Change/Port
 在弹出的窗口中，可以选择 I want a new number，这里也可以选择后面的选项，它是将其他服务商的号码转移到 Google Voice，不过目前 Google Voice 支持的转移还很少。
 点这里的Continue，继续下一步，这里已经说明要花的总费用，一共 30 刀。
  根据自己的喜好，给自己找一个好的号码，勾选想要的号码，然后点Continue，直到付费完成，这里是先支付 10 刀。
 在 10 刀的费用支付完成后，可以在界面里看到账户里有两个号码了，一个是新号码，一个是老号码。其中老号码后面有一个日期，那是这个老号码将会被删除的日期。
这时要做的就是点老号码后面的 Make permanent，继续支付剩下的 20 刀。
 在支付完这 20 刀后，账户里老号码也被买断了。</description>
    </item>
    
    <item>
      <title>购买 G Suite legacy 要注意的问题</title>
      <link>https://tourcoder.com/gsuite-legacy/</link>
      <pubDate>Thu, 29 Oct 2020 09:11:25 +0000</pubDate>
      
      <guid>https://tourcoder.com/gsuite-legacy/</guid>
      <description>很多人想使用 G Suite (目前已经改名 Google Workspace)，但不想付费，转而去购买了 G Suite legacy，一种免费版本的 G Suite，只要一次付费给卖家，以后就可以一直免费用下去。这个东西是 2012 年前 Google 提供免费注册的，那时候还叫 Google Apps，后来一路改名到现在的 Google Workspace，这个过程就不展开谈了。
但买这个一定要注意一个问题，就是一定要把主域名控制在自己手里，不然即便你购买了账户，而主域名的拥有者依旧可以删除你的整个账户。具体看客服给我的回复
 主域名拥有者可以要求释放自己的域名，而释放这个域名的唯一办法就是删除这个账户😓</description>
    </item>
    
    <item>
      <title>为什么我放弃了 Google Fi</title>
      <link>https://tourcoder.com/why-i-left-google-fi/</link>
      <pubDate>Thu, 29 Oct 2020 03:42:10 +0000</pubDate>
      
      <guid>https://tourcoder.com/why-i-left-google-fi/</guid>
      <description>先上一张图
 没错，作为一个不在美国本土的用户，我被 Google Fi 抛弃了。
2018 年我第一次用 Google Fi 的时候，我觉得好棒啊，之前用别人的卡，后来赶紧自己弄了一个，具体看这篇博文。
然后这近两年的时间，我一直用着它，尤其是它那个 70 刀/月的套餐出来后，我觉得太棒了。在这近两年的时间里，我推荐了几十个朋友去使用 Google Fi，只是觉得这么好的东西，一定要分享。
直到一个月前，我收到一封邮件
 根据它的 TOS，Google Fi 的目标用户是主要在美国本土的人，即便是所属领土也不行。网上也有一些方案去解决这个问题，也有人解决成功了，但都是治标不治本的方案，而且要求很多，比如要求你有美国银行账户的流水。
在复盘我这两年使用情况后，我决定不再继续使用，主要原因如下
成本高 虽然 70 刀/月可以享受无限网络流量套餐，可以免费收发短信，免费接或打它指定的 50 个国家地区的电话（注意，中国不包含在内，而且此刻这个 50 个国家地区的介绍页面也已经下线，原因不详）。但对我来说，我几乎没有电话短信，基本我只是用它来上外网。说是无限流量，但实际只有 22G 的高速，超过这个量后那个网络基本没法用，这样算起来，这个成本就太高了。
还有一种 20 刀/月的套餐，流量费另外算，10 刀/G。
Google Fi 的政策越来越不稳定 比如这次的我说到的在海外超过 3 个月就要暂停网络流量的政策，这在之前是没有的，随着其盈利性质的加重，这个政策会变得更加严苛。并不看好。
后续 不少人是想着保留 Google Fi 的号码的，介绍一个最切实可行的方案 &amp;ndash; 将 Google Fi 转移到 Google Voice 去。也有其他的方案，比如转移到其他运营商，但操作很繁琐，并不建议。
如果你的账户“自带”了 Google Voice 账户，访问 fi.google.com，点左边的菜单 Account 选择 Your plan，然后点击右侧最下面的 Leave Google Fi service，然后选择 Google Voice 那一项，然后下一步下一步的进行下去即可。</description>
    </item>
    
    <item>
      <title>iCloud Drive 搞丢了我所有的文件</title>
      <link>https://tourcoder.com/i-lost-all-files-in-icloud-drive/</link>
      <pubDate>Thu, 29 Oct 2020 00:19:08 +0000</pubDate>
      
      <guid>https://tourcoder.com/i-lost-all-files-in-icloud-drive/</guid>
      <description>突然生病住院了几天，回来后发现 iCloud Drive 里面的资料全都没有了。之前有听人说 iCloud Drive 会丢失文件，还会错乱文件，未想这件事还让我碰到了。
  iCloud Drive 里已经没有了，甚至已经删除里也没有了。最搞笑的是，iPhone 的 iCloud Drive 里什么文件都没有之外，还多了一些其它的文件，而这些东西并不属于我。
 可这个时间点，我还在住院。
最后通过 time machine 找回了部分文件，可从 8 月 23 日这最后一次备份到我入院前这段时间的文件，彻底消失了。Apple 给出的官方回答是 “应该是我自己删除了文件”，只能呵呵呵。</description>
    </item>
    
    <item>
      <title>程序员学点啥</title>
      <link>https://tourcoder.com/cheng-xu-yuan-xue-dian-sha/</link>
      <pubDate>Thu, 06 Aug 2020 10:45:48 +0000</pubDate>
      
      <guid>https://tourcoder.com/cheng-xu-yuan-xue-dian-sha/</guid>
      <description>这本是我在 GitHub 上的一个 repo，索性移到我的博客。话说自己作为程序员也有不少年头，多种语言会而不精通，但现在看来，对一个程序员来说，一些基本功还是很有必要的。
基础知识   英语
不管是从查到的内容完整度，还是知识点更新的速度来说，英语有独特的优势。再加上开发我们都用英语，所以，必须要掌握好英语。
  开发语言
必须要精通至少一门开发语言，现在是 2020 年，我推荐 swift 和 go 语言，后期还是应该要学习好 C/C+。
  精通正则
正则表达式在后期的开发中很重要。推荐书籍，《精通正则表达式》
  </description>
    </item>
    
    <item>
      <title>奈飞文化手册读后感</title>
      <link>https://tourcoder.com/nai-fei-wen-hua-shou-ce-du-hou-gan/</link>
      <pubDate>Sat, 01 Aug 2020 09:27:43 +0000</pubDate>
      
      <guid>https://tourcoder.com/nai-fei-wen-hua-shou-ce-du-hou-gan/</guid>
      <description>NetFlix ，中文叫奈飞，我以前并不知道它。但几年前，一个从海外留学回来的朋友总和我说这家公司，后来看了他推荐的《爱，死亡和机器人》，一瞬间觉得这家公司可以啊。
前些天，在 Kindle Unlimited 里看到了这本书，好奇的看了下，是本好书。
从这本书里我学到了另外一种经营公司的方式，另外一种招聘雇员的方式，另外一种组建团队的方式等等。
这里不做自己的解读，只放出我看完第一遍后的笔记。
                                      </description>
    </item>
    
    <item>
      <title>macOS 的安全设置</title>
      <link>https://tourcoder.com/how-to-keep-your-data-safe-on-macos/</link>
      <pubDate>Sun, 12 Jul 2020 14:26:20 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-keep-your-data-safe-on-macos/</guid>
      <description>我日常用的 MacBook Air 出了一点问题，让我想到了保护上面的数据。搜索了一圈后，我发现我该做的保护都做到了，特分享下。
安全保护 应用场景是，当我的电脑被偷了，该如何保护我电脑上的数据。
 设置开机登录密码  这是安全最基本的一步，给你的账号设置一个比较“强壮”的密码，数字+字母+符号，别单一用 123456。
设置固件密码  即便有开机密码了，别人还是很容易，绕过它，我的博客里就能找到相关的文章。那么设置一个固件密码，就是第二步加强了安全。操作步骤是：
(1) 开机，按下 Command 和 R 键来启动恢复模式，选择工具-固件密码实用工具
(2) 在固件工具窗口中，选择打开固件密码，输入两次密码，然后确定。
(3) 退出固件工具，重启电脑即可。
设置 FileVault  FileVault 在 macOS 上对整个磁盘加密，别人通过物理方式偷数据或修改数据变得困难。开启步骤，打开系统设置，进入到安全和隐私，选择 FileVault，如下图
 点击打开 FileVault，会进入下一步
 因为我并不相信 iCloud 的技术，所以，我选择了下一项，记录本地的恢复码，注意选择这项的一定要保存好这个恢复码。
 点下一步后，它就开始加密整个磁盘，时间也会比较长，完成后重启电脑即可。
USB 接口的安全  usbkill 这个工具可以帮你处理 USB 接口的安全问题，它是一旦发现 USB 接口异常，就会关机。具体怎么安装，点上面的链接。
数据备份 我会不定期的用 Time Machine 备份下系统，但随着我的开发环境迁往云端，本地我的数据变少了。重要的数据，比如密码之类的，我都是记忆在大脑里。
macOS 中关于用户的隐藏问题 可查看官方的文档 https://support.apple.com/zh-cn/HT203998</description>
    </item>
    
    <item>
      <title>iPhone 设置些什么</title>
      <link>https://tourcoder.com/iphone-ying-gai-ru-he-she-zhi/</link>
      <pubDate>Sat, 27 Jun 2020 15:10:39 +0000</pubDate>
      
      <guid>https://tourcoder.com/iphone-ying-gai-ru-he-she-zhi/</guid>
      <description>作为一个 iPhone 用户，随着 iOS 的不断升级，设置的内容也变得很多，但一些基础的设置基本没有变化。我的常规设置有如下一些，以下下内容基于 iOS 14 开发者版本。
省电 将 push 改成 fetch，进入 设置-&amp;gt;邮件-&amp;gt;账户-&amp;gt;获取新数据，将最上面的推送关闭，下面的获取频率，我选择的是每小时。
隐私数据的关闭 我比较注意一些隐私的东西，所以我会关闭一些广告及数据的追踪。
  进入 设置-&amp;gt;隐私-&amp;gt;分析与改进，关闭这里的共享 iPhone 分析和共享 iCloud分析。
  进入 设置-&amp;gt;隐私-&amp;gt;Tracking，关闭这里的允许 App 请求跟踪。
  进入 设置-&amp;gt;隐私-&amp;gt;定位服务-&amp;gt;系统服务-&amp;gt;重要地点，关闭这里的重要地点，并清除一次历史记录。
  进入 设置-&amp;gt;隐私-&amp;gt;Apple 广告，关闭这里的个性化广告
  进入 设置-&amp;gt;面容 ID 与密码，拉到最下面，开启抹掉数据，当输入 10 次错误的密码后，iPhone 上的数据会被抹掉。
  进入 设置-&amp;gt;Safari 浏览器，将这里的阻止跨网站跟踪打开。
  进入 设置-&amp;gt;通用-&amp;gt;隔空投送，平时应该是处于接受关闭或者仅限联系人的状态。
  App 的权限不要乱给。
  注册一个美区的 Apple ID，一个是 App 比较多，另外就是安全系数更高。
  </description>
    </item>
    
    <item>
      <title>WWDC 2020</title>
      <link>https://tourcoder.com/wwdc-2020/</link>
      <pubDate>Wed, 24 Jun 2020 11:45:21 +0000</pubDate>
      
      <guid>https://tourcoder.com/wwdc-2020/</guid>
      <description>前两天，Apple 在线召开了 WWDC 2020，也在第一时间安装了系统，试玩了近两天，感觉还不错。
iOS 14 之前听到小道消息说这次会将 iOS 14 在 iPhone 上的系统改名为 iPhone OS，不过最后并没有。
App Library
先说说 App Library，如下图
  在主界面向左滑动，最后一页就是 App Library 的界面。
这个功能对我来说比较实用，我讨厌应用满满的铺出几个页面，我以前的做法是首页是常规应用，其他的都是放在文件夹里放在第二页。要用了，通过搜索找到。App Library 这里的应用是智能排列的，无需自己操作。
将应用添加到 App Library 的方式是长按该应用，做不同的选择即可
 iOS 自带的应用，如上图，选择 Remove from Home Screen
 非 iOS 自带的应用，如上图，选择 Add to Library。
这里也有例外，比如 Watch 手表这个应用，提示我先取消手表的配对后再进行下一步操作。
Siri
 Siri 的显示方式也更改了。
Widgets
 长按屏幕，点击右上角的加号➕
   选择想添加的 Widgets，有两种样式选择，最后点下面的 Add Widgets
 完成，这个 Widget 还可以自由拖动位置。
账户位置的更改
 以前账户的位置是在上图中的红圈里面</description>
    </item>
    
    <item>
      <title>Swift 学习笔记</title>
      <link>https://tourcoder.com/study-swift/</link>
      <pubDate>Fri, 01 May 2020 09:13:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/study-swift/</guid>
      <description>这是我之前学习 Swift 的时候的笔记，脑图模式，图片有点大。
 </description>
    </item>
    
    <item>
      <title>你好呀，不惑之年</title>
      <link>https://tourcoder.com/happy-40th-birthday-to-myself/</link>
      <pubDate>Tue, 28 Apr 2020 04:51:53 +0000</pubDate>
      
      <guid>https://tourcoder.com/happy-40th-birthday-to-myself/</guid>
      <description>一眨眼，按我老家的习俗，我今天 40 岁了！
印象中是这样过来的
10 岁：那年我家买了第一台彩色电视机，打开彩电看到的第一个节目是动画片《大闹天空》，高兴极了。
20 岁：一帮小伙伴来我家吃饭，然后有一个小伙伴和另外一个小伙伴喝了酒后闹起来，动刀砍了。
30 岁：和那时的女朋友分手，得了抑郁。也因为抑郁差点死了。我的狗和《生活大爆炸》让我活下来了。
40 岁：本想着出去旅游，但因为这一场疫情，什么地方都去不了。给自己写了首 RAP + 戏剧风的歌叫《不惑之年》。
如果按命格上来说，我还有 41 年的寿命，那我希望接下来是这样过的
50 岁：和老婆周游世界
60 岁：和老婆周游世界
70 岁：和老婆周游世界
80 岁：每天还能搂着我家老婆睡觉，开开心心。
其实我挺想给我老婆搞一个金婚婚礼的，所以我必须要想办法延长下寿命，比如先把这两百斤的体重降下来吧，哈哈哈</description>
    </item>
    
    <item>
      <title>我老婆开车集(不定期更新)</title>
      <link>https://tourcoder.com/my-wife-and-car/</link>
      <pubDate>Sun, 19 Apr 2020 06:40:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/my-wife-and-car/</guid>
      <description>当年我老婆考驾照挂了 7 次，后来一次过年她开三天车扣了 9 分，我那时就想以后要弄一个她开车集，肯定会很好玩。
这不，她放弃了自己美妆博主，小“网红”的事业，非要给我当司机。几次下来，我心态异常平和，完全是在教幼儿园的小朋友状态。
但该吐槽还是要吐槽的，有时间我就画一画，更新更新！
       日常段子  更新于2020.06.17
下午老婆送我去医院换药，一点十分左右在武宁路409号门口被另外一辆车给撞了，对方全责。
更新于2020.08.07
和我老婆去处理了下她的违规，罚款两百。</description>
    </item>
    
    <item>
      <title>游戏是用脑子打的</title>
      <link>https://tourcoder.com/game-sb/</link>
      <pubDate>Wed, 08 Apr 2020 16:19:14 +0000</pubDate>
      
      <guid>https://tourcoder.com/game-sb/</guid>
      <description>晚上我老婆和几个队友在线吃鸡，看他们一顿指挥的操作后，我算是明白他们为什么总是分数上不去，因为他们打游戏完全不用脑子。
比如下面的一场比赛，如下图
 已经到最后的缩圈范围，
红色圈里的是安全区，红色圈外的都是毒区，人在毒区会被毒死。
下面蓝色部分是一组房区，通过枪声可以辨别那边有很多敌人，因为房区在安全区外，所以房区的这些敌人都要按黄色箭头的走向进入到红色圈内的安全区。
绿色部分是一个面积很小的高台，没有什么掩体。
上面一号地方是一片布满了掩体的地方，面积很大，而且根据前面打斗缩圈的走势来看，基本没有敌人在那一带。
我老婆队伍只剩下两个女生，能力属于不能主宰比赛，只是跟着混分。
她们队友让这两个女生去哪个绿色部分的高台，给出的理由是高台上看得清楚，好打人。
但我的建议是让这两个女生去上面布满了掩体的一号地方，让她们就躲在掩体里，等其他敌人互殴后，再去收拾剩下的人。理由是高台没有掩体，还是敌人来向，如果是能力强的两个人兴许借助高台优势能够杀几个敌人，但她们两个女生上高台，就是活靶子，只要她们上高台，敌人之间就会停止厮杀，都会先杀掉高台的这两个人。
当然，我老婆让我要么不要说话看她比赛，要么就不要看。然后两人并没有听我的，选择去高台，还在攀爬的过程中，这两个二货就在多个枪声中死了，快到甚至她们自己都不知道哪里人在打她们。
看她们死后，我心里就骂了一句：菜鸡，真蠢！</description>
    </item>
    
    <item>
      <title>预约美国领事馆服务及后续办理流程</title>
      <link>https://tourcoder.com/appointment-system-of-usa-in-china/</link>
      <pubDate>Tue, 14 Jan 2020 11:54:28 +0000</pubDate>
      
      <guid>https://tourcoder.com/appointment-system-of-usa-in-china/</guid>
      <description>最近需要护照公正，特预约了下美国领事馆的公证服务，记录下流程。
先登录其网站 https://china.usembassy-china.org.cn/zh/u-s-citizen-services-zh/appointment_system/
进入下图页面
 点击上图右侧的进行预约
 选择国家和想要预约的领事馆，我在上海，即选了上海
 选择上面的 Make Appointment
 选择需要的服务，并勾选最下面的 I have read..，我是需要公正服务，所以选择了第三项
 选择自己的日期，黄色表示可以选择的
 选中日期后，填写表格内容，从上到下是
具体时间选择
姓
名
生日
联系电话
Email 地址
选择是哪个国家的公民
选择出生国
性别
护照号码
最后勾选提交，会有一个详情的内容页，打印那个详情的内容页即可。
2020.06.23 更新
上次预约的是二月份，但因为新冠疫情导致这事今天去处理完，说下我的流程。我去的是上海的美领事馆签证处。
我预约的是下午两点半，考虑到那边不方便停车，我提前了三刻钟到了领事馆所在的大楼，在附近停好车直接上去，在九楼。可能因为疫情，在签证办公室门口，有保安把人拦下来，询问做什么，然后拿我的护照刷了一下，估计是在核对信息，一会就让我进去。
在第一个窗口处，把上面打印的那张纸给工作人员看，告诉她我要办理的事情，然后她给了我两张号码牌，如图
 接着进入安检，因为里面是不允许带手机等数码设备，所以手机我免费寄存在安检处了。过了安检，进入了办事大厅，等着叫号。
叫到我时，我告知工作人员我要办理的业务等，她核实了我的信息后，给我盖章，这里有个插曲，这小姐姐给我盖章时毁掉了我两张护照复印件。
因为我所办理的业务需要付费，所以工作人员告诉我，让我等收费的九号窗口叫到我去付费，很快就付费完成。这里说明下，上海签证处的收费方式是能够支付美元的信用卡（visa/mastercard），美元现金，人民币现金。其他均不支持。
 付费完成后，继续等叫号，该最后的章和签字，工作人员会要求你举起右手宣誓，保证自己的资料正确等等。他盖完章后，业务办理完成。</description>
    </item>
    
    <item>
      <title>搭建私有的 wiki</title>
      <link>https://tourcoder.com/install-bookstack-via-docker/</link>
      <pubDate>Mon, 13 Jan 2020 14:10:55 +0000</pubDate>
      
      <guid>https://tourcoder.com/install-bookstack-via-docker/</guid>
      <description>很早就想搭建一个家庭私有的 wiki，主要是方便家庭成员分享一些人生经历，一些思考，还有家庭树方面的内容，而这些很多内容是不方便在博客上分享的。最近碰到了一个开源的程序 Bookstack 就很不错。这次通过 Docker 来部署搭建。
先创建私有网络
sudo docker network create wiki_network 接着创建一个 mysql，进入到该文件夹，通过 Docker 来安装 mysql
mkdir mysql cd mysql sudo docker run -d --net wiki_network \ --restart=always \ -v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/datadir:/var/lib/mysql \ -e MYSQL_DATABASE=bookstack \ -e MYSQL_USER=bookstack \ -e MYSQL_PASSWORD=DB密码 \ --name=&amp;quot;bookstack_db&amp;quot; \ mysql:latest 在 conf 文件夹下新建文件 custom.cnf
vi custom.cnf 并填入如下内容
[mysqld] performance_schema=off performance_schema_max_table_instances=50 table_definition_cache=50 table_open_cache=20 重启 mysql 的这个 docker 即可生效。
返回到 mysql 文件夹上一层，新建一个文件夹 wiki，通过 Docker 来安装 bookstack</description>
    </item>
    
    <item>
      <title>搭建 Docker 私有仓库</title>
      <link>https://tourcoder.com/create-your-own-docker-registry/</link>
      <pubDate>Mon, 13 Jan 2020 04:25:46 +0000</pubDate>
      
      <guid>https://tourcoder.com/create-your-own-docker-registry/</guid>
      <description>安全起见，不想用 Docker Hub 的私有服务，也不想用 GitHub 的 Docker registry，那么剩下的办法就是自建。挺好，Docker 提供了这方面的内容。
先下载 registry
docker pull registry 然后启动一个 registry 的容器
docker run -d -p 5000:5000 --restart=always --name=registryman -v $PWD/registrydata:/var/lib/registry registry 这样就是搭建完成了。
测试下过程，先下载一个 nginx
docker pull nginx:latest 然后通过 docker images 查看该 nginx 镜像的 image ID，我这里的 image ID 是 231d40e811cd，修改该镜像的 tag
docker tag 231d40e811cd server_ip:5000/nginx 将该镜像上传到该私有的 registry
docker tag 231d40e811cd server_ip:5000/nginx 等待完成后即可。
其中需要注意的是，push 是强制 https 的，如果要通过 http 进行 push 的话，不同的系统有不同的处理办法
在 macOS 下
点击 Docker 的图标，进入设置</description>
    </item>
    
    <item>
      <title>Git and Github Tips</title>
      <link>https://tourcoder.com/git-and-github-tips/</link>
      <pubDate>Thu, 09 Jan 2020 07:39:54 +0000</pubDate>
      
      <guid>https://tourcoder.com/git-and-github-tips/</guid>
      <description>.gitignore 无法过滤文件夹或文件 有时候会遇到一个问题，如果在第一次 git push 后增加 .gitignore 文件，已经被 push 到 git 服务器的文件夹或文件还会继续更新，要想从 git 服务器端删除，需要将本地的该文件夹或文件删除，然后再 push 一次，但其实可以通过添加 --cache 这个参数来实现
git rm --cached filename git rm --cached foldername 上面一个是过滤某个文件，一个是过滤某个文件夹，然后再 push，这时就会发现 git 服务器上已经没有该文件或文件夹了。
在 linux 上不用输入账号密码直接 push 可以利用 credential 来实现，这里配合 Github，先去 GitHub 申请一个 token，在 linux 的用户根目录下打开 credential 文件，如果没有则新建，比如 vi ~/.git-credentials，内容输入
https://your_github_username:your_token@github.com 保存，然后
git config --global credential.helper &#39;store --file ~/.git-credentials&#39; 这样每次不用输入账号密码了，直接使用即可。也可以在项目根目录下进入 .git，配置里面的 config 文件
[credential] helper = store 将上面的内容增加到该文件里，保存后，在第一次输入密码后以后就不需要了。
Git 中如何删除一个远程的分支？ 执行命令 git push origin :branch_name，这个命令有点很无厘头，别忘了 : 号。</description>
    </item>
    
    <item>
      <title>Days of Golang (更新中)</title>
      <link>https://tourcoder.com/days-of-golang/</link>
      <pubDate>Fri, 03 Jan 2020 07:53:26 +0000</pubDate>
      
      <guid>https://tourcoder.com/days-of-golang/</guid>
      <description>计划着今年把 Golang 好好的再撸一遍，我以前学习开发语言的方法是手册，基础知识点看一遍，然后直接看别人的代码，从简单的到难的。但这次我想换个方法，跟着网上的视频教程学习一次。
教学视频 在 YouTube 上发现「韩顺平 Go 语言零基础教程」似乎不错，观看地址点这里
学习计划及时间安排 这个系列的视频一共有 389 个，每个视频时长不等，粗略按每个视频 30 分钟计算，一共 11670 分钟，194.5 个小时。
我的学习计划是平均每天学习 2 个小时，即需要 97.25 天，满打满算取个整，需要 98 天，如果是在一年内的话，基本平均每三天要学习 2 个小时。
笔记 我会把每次的学习做一份笔记，整理成博文发出来，方便分享以及自己以后再回头学习。
第一天学习笔记 学习内容
本次学习了该系列教程的第 001 - 014
知识点整理
Golang 是由 Google 开发的一门静态强类型、编译型、并发型，并具有垃圾回收功能的编程语言，更多的介绍看 Golang 在维基百科上的介绍。
Go 既有静态编译语言的安全和性能，又有动态语言开发维护的高效。
Go 的包用于组织程序结构，Go 的一个文件都要归属于一个包，不能单独存在。
Go 中，内存自动回收垃圾，不需要开发人员管理。
Go 并发性是其一个比较重要的特点，它从语言层面就支持并发；goroutine，轻量级线程实现大并发处理，高效利用多核；基于 CPS(Commiunicating Sequential Processes) 并发模型的实现。
Go 吸收了管道通信机制，形成 Go 特有的管道通过管道，可以实现不同的 goroute 之间的饿相互通信。
Go 函数可以返回多个值
func sumAndSub(n1 int, n2 int)(int, int) { sum := n1 + n2 sub := n1 - n2 return sum, sub } Go 中还有一些创新性功能，比如欺骗 (slice)，掩饰执行 (defer)。</description>
    </item>
    
    <item>
      <title>Docker 中禁止 IP 和端口访问</title>
      <link>https://tourcoder.com/disable-access-by-ip-and-port-on-docker/</link>
      <pubDate>Fri, 27 Dec 2019 05:59:42 +0000</pubDate>
      
      <guid>https://tourcoder.com/disable-access-by-ip-and-port-on-docker/</guid>
      <description>先说两个概念
  Docker 的容器是一个独立的个体，每一个容器可以理解成是一个独立的 VPS
  每个容器可以单独的运行，可以单独的被访问
  准备工作 一台安装了 Docker 及相关工具的机器，其 IP 地址是 123.123.123.123，默认所有的端口都是开放的，可访问的。
这里用 nginx 作为代理，部署一个网站，监听的端口为 3000，网站镜像已经完成，叫 webapp
操作步骤 一般情况下，我们可能会这样部署（为了更好的阐明情况，这里使用了 docker run 的方式）
部署该网站
docker run -d -p 3000:3000 --name myWebapp webapp 此时不需要通过 nginx 作为代理，即可以通过 ip:port 的方式访问到该网站，即 http://123.123.123.123:3000。
但我想实现的是禁止通过 IP 端口这种方式访问，那在 nginx 中设置禁止 IP 访问就好了，即启动一个 nginx 的容器，配置下 conf 文件，即
docker run -d -p 80:80 --name myNginx -v $PWD/conf.d:/etc/nginx/conf.d nginx 然后在配置文件 default.conf 中增加
server { listen 80; return 404; } 这样的确是禁止了 IP 直接访问，但在访问 ip:port 的时候，依旧能够被访问到，所以上面的做法是错误的！</description>
    </item>
    
    <item>
      <title>每月家庭的网络产品使用帐</title>
      <link>https://tourcoder.com/the-family-billing-on-online-products/</link>
      <pubDate>Wed, 25 Dec 2019 00:28:55 +0000</pubDate>
      
      <guid>https://tourcoder.com/the-family-billing-on-online-products/</guid>
      <description>下面是相对来说比较固定的开销，均按年计费。
2023 年 我将主要的内容移动到了 Google Docs 里，看这里。
2022 年    订阅 花费 说明     域名 12K 刀 每年的重头戏   Microsoft 365 家庭版 99.99 刀 从之前的 office 365 切换到了当前版   Google One 99 刀 Google One 2T 容量套餐，主要用作照片，视频的备份保存   iCloud+ 118.8 刀 iCloud+ 服务，开启了家庭共享   Apple 开发者账号 99 刀 我的个人 Apple 开发账号   GitHub 48 刀 GitHub Pro 的收费   VPS 210 刀 翻墙脚本服务器   Kindle Unlimited 144 元 Kindle 的包年电子书阅读服务   宽带 2388 元 电信十全十美的 199 套餐   话费 2712 元 我的手机花费每个月 128 元，我老婆的是每个月 98 元    上面单位，刀是美元，元是人民币，都是按年统计。还有一些其他的订阅都是获得的赠送，就不再列举。</description>
    </item>
    
    <item>
      <title>我是如何在 iPad 上工作的</title>
      <link>https://tourcoder.com/how-do-i-work-on-ipad/</link>
      <pubDate>Tue, 24 Dec 2019 06:56:22 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-do-i-work-on-ipad/</guid>
      <description>拉了下统计，发现今年所写的代码中有 17% 的量是在 iPad 上完成的，比我之前想的要多。除此了写代码之外，其他也有不少工作是在 iPad 上完成的，比如邮件，文字之类的工作。
硬件 2020 年我将设备换成了 iPad Pro 和专属的妙控键盘，感受是重，打字难受，完全提不起在上面写代码的兴趣，也基本告别用它来写代码。
iPad：iPad 2019 款，没有买单独的支架，就是买了个能支撑的保护套。
键盘：因为 iPad 我基本只是在家才会使用，所以并没有买便携式的折叠键盘，而用的是自己一直在用的 Magic Keyboard，毕竟都是 Apple 家的东西，体验没话说。
耳机：Airpod
主要软件 Termius：我一直是 Termius 的用户，但我比较反感它在后来的版本中推出了账户体系。
Safari: 主要浏览器，备用浏览器是 Firefox
MindNode：思路图/脑图的工具
Cloud Storage：现在主要用 iCloud 自带的存储，怎么说呢，这并不是一个值得信任的产品。Apple 把整个 iCloud 做得挺烂，总是莫名其妙的丢东西，出现奇奇怪怪的问题。本来一直用 Google Drive，但因 Google Drive 并不支持 MindNode 的文件格式，而我非常依赖 MindNode，所以花钱买了更高容量的 iCloud 存储。试过微软家的 onedrive，但总感觉自己和它八字不合，但 iCloud 总是莫名其妙的丢文件，这点超级烦躁。
开发情况 这一年写后端底层的东西比较多，更倾向于在 Linux 上开发，我的操作方式是
在 Google Cloud 上买了一个双核 4G 内存的 VM，在该 VM 上配置了开发需要的环境等，然后通过 SSH 登录到 VM 上进行开发，其实不只是在 iPad 上，在电脑上我也基本是连接接到 VM 上做开发。</description>
    </item>
    
    <item>
      <title>Sedo 域名停靠赚钱真的靠谱吗</title>
      <link>https://tourcoder.com/is-sedo-domain-parking-really-profitable/</link>
      <pubDate>Tue, 17 Dec 2019 09:30:37 +0000</pubDate>
      
      <guid>https://tourcoder.com/is-sedo-domain-parking-really-profitable/</guid>
      <description>早就听过 Sedo 的大名，在它上面也买过一个域名，今年五月份心血来潮，想着手上的域名闲置着也是闲置着，不如通过 Sedo 的停靠赚点钱，随即将在某一注册商那边注册的几十个域名都停靠在了 Sedo。
第一个月居然赚了 0.04 欧元，心想这玩意还是有点意思的。因为赚钱少，基本很少打开 Sedo，每次打开账户看到的就是说我账户最近 31 天赚了多少钱。然刚才因为需要打开了具体的报告后，对 Sedo 的报告产生了疑惑，简单的两个报告如下
  我对这份报告有几点疑惑：
疑惑一：从第一张图中我可以看出来，过去的十二个月域名的独立访客是越来越多，但是在下面的报告中，除了第一个月独立访客最少的时候有 0.04 欧元外，其他月份都是 0。
疑惑二：第二张图中的七月份哪里去了？
疑惑三：如我所有，每次我打开的 Sedo 网站的时候都会提示我最近 31 天赚取了多少钱，但在第二份报告里并没有看到我赚取的钱。
在线提交问题，无法提交成功，总是提示错误；想在线和客服聊天，但他们的在线时间是每周一到周五的下午 12 点到下午 2 点，就两个小时，没办法，只好通过他们官方的 twitter 询问等待结果。
最后更新：在等待了几天后，终于得到了客服的回复，字里行间就是一句话，说我作弊了！
Please note that correctors can happen and earnings can be removed if the traffic that generated them is found to be unnatural such as bots or spam traffic. Parking reports are normally generated for a month if valid traffic has been record on the domain.</description>
    </item>
    
    <item>
      <title>更新 NPMJS 中维护人员的 email 地址</title>
      <link>https://tourcoder.com/how-to-update-the-email-address-of-package-maintainers-on-npmjs/</link>
      <pubDate>Tue, 17 Dec 2019 07:20:04 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-update-the-email-address-of-package-maintainers-on-npmjs/</guid>
      <description>做过 NPMJS 包的人都知道，通过命令 npm info 包名字 可以查看到维护人员的 Email 地址，如下图中红色标注出来的
 但有时候遇到一个问题是想更改这里的 Email 地址，在官网找到相关资料，有小伙伴和我说唯一的办法是删除掉这个包，然后用新的 Email 地址重新上传。再和 NPMJS 官方多次联系后，我基本确认两个事情
  官方是不会轻易的删除已经发布的包的，尤其是已经有很多人使用的包
  没有办法修改已经发布的包的维护人的 Email 地址
  但真的是这样吗？在一些摸索后，倒是找到了一个靠谱的办法，算是他们的漏洞，将流程分享出来
第一步，先登录 NPMJS.COM 的账号，将里面的 Email 地址改成想显示出来的 Email 地址。
第二步，登录命令行工具，运行命令 npm login 登录 NPMJS 的账号，这里需要注意，使用的源应该是官方的源，而非第三方的源，记得先修改下源。
第三步，登录后，运行命令 npm owner add tourcoder 包名字，比如我这里执行 npm owner add tourcoder a-yarn-demo，会出现增加成功的提示，如下图
 第四步，等待一两分钟，执行命令 npm owner rm tourcoder 包名字，完成，这时会发现维护人的 Email 地址更新好了。
 这个所谓的漏洞可能是一个设计的“缺陷”，NPM 应该在执行一些命令，比如所有者命令时，会做账户刷新校验，然后根据数据进行了更新。
话说这个操作让我忽悠了一小伙伴的十元红包，哈哈哈哈</description>
    </item>
    
    <item>
      <title>自建 RSS 阅读器</title>
      <link>https://tourcoder.com/rss-reader/</link>
      <pubDate>Mon, 16 Dec 2019 09:10:58 +0000</pubDate>
      
      <guid>https://tourcoder.com/rss-reader/</guid>
      <description>自从暂停自己的机器人新闻采集工具后，一直通过 rss 方式进行订阅阅读，源的同步使用了 Feedly 的服务，客户端用的是 Reeder。但最近 Feedly 在 Reeder 上的同步出了一些问题，到了基本无法使用的程度，妖风作怪，是时候自建一个了。
寻找一圈后，大家推荐比较多的是 FreshRSS，但我却更喜欢界面简洁的 Miniflux，主要它还支持 Fever API，这样也方便我使用 Reeder。
准备工作 为了系统简洁，采用 Docker 的方式安装，先安装好 Docker 和 Docker Compose，root 到 VPS
安装并启动 Docker
curl -sSL https://get.docker.com/ | sh //安装 Docker service docker start //启动 Docker 安装 Docker Compose
安装自己需要的版本，可以查看这里，里面包含了相关的命令
curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose 至此，准备工作已经完成。
安装 Miniflux 编写 docker-compose.yml 文件
version: &#39;3&#39; services: miniflux: image: miniflux/miniflux:latest ports: - &amp;quot;3009:8080&amp;quot; depends_on: - db environment: - BASE_URL=https://tourcoder.</description>
    </item>
    
    <item>
      <title>让我开始略感厌恶的 Apple</title>
      <link>https://tourcoder.com/apple-is-becoming-a-bitch/</link>
      <pubDate>Sat, 14 Dec 2019 12:43:13 +0000</pubDate>
      
      <guid>https://tourcoder.com/apple-is-becoming-a-bitch/</guid>
      <description>Apple 让我开始感到厌恶，我觉得有必要将这句话加黑加粗。
本地密码
 解释下上面这张图，我在 Mac 上登录 iCloud 的账户，它要我输入 iPhone 的开屏密码。
一般来说，开屏锁屏密码应该是一个本地的密码策略，即针对当前设备的密码策略，但 Apple 在 iCloud 的做法是跨设备要密码，即 Apple 将我们开屏锁屏的密码都拿过去了。我特妈的一个本地密码，它都拿过去。是什么样的一个畸形心态会设计这种所谓的安全机制策略？不要和我扯它有能力保护我的隐私安全，我连最简单的本地密码策略的防线都没有了，我在它那边有什么安全可言？
2025 年 6 月 18 日：昨晚因为这个问题，我在推特上破防了。当初引入 touchID，faceID 的一个重要原因是干掉锁(开)屏密码，现在倒好，锁(开)屏密码是成了 Apple ID 登录的重要要素了。最恶心的是：登录过的设备卖掉了，锁屏密码自然会被买家修改。但因为你的 Apple ID 在那个设备上登录过，所以会要求输入那个设备的锁(开)屏密码，买家新设置的，你自然不知道，但你输入你用那设备时的锁屏(开)密码，只会提示不对，更糟糕的是有时候即便设备在身边，输入了正确的密码，也会提示密码不对！！！
这里有个解决方法，每个设备都用独立的 Apple ID，永久解决！其他的方法，比如登录 Apple ID 后将以前的设备从账户里清除掉，这方法理论上是对的，是个正常人都会理解对的，但那帮 iCloud 的蠢货所设计的机制还是会时不时要求你输入哪些被你删除掉的设备的锁(开)屏密码，有时候要，有时候又不要，就是一个神经病。
自带的 Mail 邮件客户端
几年前，我一直用系统自带的邮件客户端，后来因为一些不可抗力，我没有再继续使用。直到最近这几天我计划用它，先看一张图
 从上面的图可以看出来
  我的通讯录里没有任何人（左下窗口）
  我还没有添加任何的邮箱账户，也没有开启 iCloud 自带的邮箱（左中窗口）
  我新建了一个邮件，在输入一个字母的时候突然出现了很多联系人（右下窗口）
  心想可能是缓存，但缓存清理后，这些还存在，这个就不对了！随即做了实验
  在当前 Mac 上退出 iCloud 账户
成功退出 iCloud 账户后，再次没有登录任何账号的情况下打开 mail 这个自带的邮件客户端，新建邮件，得到如下的图</description>
    </item>
    
    <item>
      <title>不要在 GitHub 之类的服务商那托管你的私有代码</title>
      <link>https://tourcoder.com/do-not-host-your-private-sourcecode-on-a-service-like-github/</link>
      <pubDate>Thu, 12 Dec 2019 03:43:11 +0000</pubDate>
      
      <guid>https://tourcoder.com/do-not-host-your-private-sourcecode-on-a-service-like-github/</guid>
      <description>这篇文章其实在几年前就应该写，那次我的两个 GitHub 的账户莫名其妙的被挂起，挂起的原因是 GitHub 的系统检测我在 GitHub 上有两个账号。其实这两个账号一个是我工作的账号，一个是我的私人账号。而他们知道我有两个账号的方法是检测到两个账号里我都用了同一个 Gmail 邮箱。那一次害得我三天没有办法工作，最后的解决办法是我删除掉一个账号。
但问题来了，我有两个账户又有什么关系？GitHub 的用户条款有不允许用两个账号的吗？
后来除非有必要，我很少将自己的私有代码传到 GitHub，而且最近对它没好感的地方是
  即便私有库删除了，但也无法删除之前在 GitHub 上的资源内容（信息有泄漏的可能）
  所谓的政治正确，前端时间闹得沸沸扬扬的锁某些国家地区用户的私有仓库的问题（相关报道）
  这里不只是说 GitHub，任何一个这类的代码托管服务，都会有这样的问题，要很好解决这个问题的办法只有一个自建！
公司运营层面，无需多说，个人层面，搭建起来也非常简单，买一个 VPS，找一个这类开源的软件安装即可，网上一搜一大片。</description>
    </item>
    
    <item>
      <title>RESTFUL API 中删除操作的设计</title>
      <link>https://tourcoder.com/how-to-design-the-delete-action-in-restful-api/</link>
      <pubDate>Thu, 05 Dec 2019 05:59:22 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-design-the-delete-action-in-restful-api/</guid>
      <description>RESTFUL API 中删除操作的设计比较特殊，并不是一味的使用一个 DELETE 就可以解决问题。
归纳起来，删除操作有三个情况，如下
  删除某个资源
  批量删除多个资源
  删除某个资源中的某些属性
  其中最好处理的是第一个情况，可以通过 DELETE 直接实现，即直接通过 DELETE 该资源的 URL 的形式，如下
{api}/resource/&amp;lt;resourceID&amp;gt; 而第二和三种情况因为 URL 长度的问题可能无法使用 URL。虽然在 RESTFUL 设计中并没有明确说明 URL 长度限制是多少，但 URL 的长度还是和浏览器，WEBSERVICE（NGINX，IIS，APACHE）有一定的关系，不同的浏览器有着不同的长度限制，同样不同的 WEBSERVICE 有着不同的长度限制，所以直接用 URL 的话难免会存在一定的问题。
先说第三种情况删除某个资源中的某些属性，删除某个资源的某些属性本质是更改该资源的部分属性，应该是一个更新的操作，而非删除了该资源，那么则可以使用 PUT 操作来实现更新，即在 BODY 中附加操作的内容，而 URL 地址是该资源的地址，即
{api}/resource/&amp;lt;resourceID&amp;gt; 再说第二种情况批量删除多个资源，如上面所说，因为 URL 长度问题，如果将多个资源拼接到 URL 中势必会出现问题，那么这时候可以用 POST 操作来实现，在 BODY 中附加操作的内容，而 URL 地址是资源合集的地址，即
{api}/resource/ 在实际项目操作中，为了统一好看，我对第二种情况的处理还是使用 DELETE 操作，URL 地址是资源合集的地址，而要操作的内容放在 HEAD 里面，而非 BODY 里面。</description>
    </item>
    
    <item>
      <title>来自 Telegram 的“意外收获”</title>
      <link>https://tourcoder.com/windfall-from-telegram/</link>
      <pubDate>Fri, 22 Nov 2019 03:28:24 +0000</pubDate>
      
      <guid>https://tourcoder.com/windfall-from-telegram/</guid>
      <description>我用 telegram 有一段时间，用它的原因是源自它的宣传 &amp;ndash; 安全加密，在当前信息隐私泄漏满天飞的时代，它无疑是一个很不错的，值得我信任的软件，只到昨天晚上。
因为它加好友的方式比较特殊，对隐私也有一定的隐患，所以我在 telegram 上并没有一个好友，都是通过访问链接的方式和好友聊天联系，而且我固定聊天的朋友就两个人，和其中一个已经很长时间没有聊天，但和另外一个朋友基本天天聊天，聊天内容基本都是科技创新，产品的用户体验等话题。
和往常一样，我用电脑端的 telegram 客户端和这位朋友聊天，聊天的内容是我最近吐槽的 outlook 和 Google 的用户安全机制等，但 telegram 突然弹出一个窗口
 点击上面的 More info 后
 什么？从它的机器人名称到内容的意思，我被识别为发送垃圾信息的人了，可是每次我都只和这个朋友聊天，怎么就变成发送垃圾信息的人了？继续点 Start，就有了下面的这段和机器人的对话
 本也稀松平常的事情的，但却让我觉得有些事情似乎不太对。
  telegram 不是加密的么？只在有必要的时候才会查看用户的聊天内容，那么这个官方机器人是否有在看我的聊天内容呢？
  我在 telegram 上每天一共也就 20，30 句话，最近一两个月也只和这一个朋友在聊天。聊天的内容以文字为主，极少有链接，图片和视频，那么这个机器人是如何觉得我在发垃圾信息的？
  昨天我是在电脑端和朋友聊天的，后来收到上面信息说我账户被限制了，但我尝试用手机上的客户端继续给这个朋友发消息，一切正常，我又换了台电脑发送信息，也是正常，没有被限制的提醒！
这种操作我可以理解成：我的账户只是在某个电脑端被限制了，那么它的做法和其他很多商业公司也是一样的，细节定位到某一端某一点。
  最后说一下，在我写这篇文章前，我在受限的电脑上测试了下，又可以继续发送信息了。不过以后还是少用吧～</description>
    </item>
    
    <item>
      <title>如何删除 outlook app 中烦人的建议账户</title>
      <link>https://tourcoder.com/how-to-remove-found-account-inside-outlook-app/</link>
      <pubDate>Fri, 15 Nov 2019 07:03:42 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-remove-found-account-inside-outlook-app/</guid>
      <description>想必很多用 outlook app 的人遇到过一个烦人的事情，当下载 outlook app，打开它后，常常会出现发现账户，如下图
 有时候会出现多个账户，即便你跳过它登录了其他的账户，它还是很烦人的出现在 outlook app 里，如下图的侧边 office 365 的 icon，和这个账户是不是 office 365 没有任何关系。
 这个问题非常多的人反馈了，但至今没有一个解决方案。在 outlook app 里面和客服聊，他们是完全不理我，没办法在 twitter 上喷了后，它们的官方推特给我一个连接让我和客服联系，初级客服解决不了问题，把问题在线转移给高级客服，过程各种操作，就不一一细说，反正就是没有成功，最后的结果是客服建议我把手机恢复出厂设置。可是如果让我手机恢复出厂设置的话，我找客服做什么？我之前解决这个问题就是用恢复出厂设置的，但这次的问题是我现在手机有太多重要资料，我无法这么做，反正就是微软客服那边是没有任何办法了。
不过我还是找到了一个办法来解决这个问题。
分析 从几年前开始起流行一键登录，全家桶，比如 Google 你在手机上下载了一个它们的应用并登录后，只要你使用其他的应用，都会自动登录到这个账户，方便是方便，但真的很讨厌，而且有隐私泄露的风险。
这种关联账户的方式有多种形式
  Google 这种基本是基于浏览器的 Cookies 方式
  微软我没有仔细研究，但粗略看来，是登录许可保存在设备中的方式（而非沙盒中）。
  有些应用会用设备唯一号绑定的形式，同步到服务器，然后每次自动识别。
  处理办法   Google 这种，只要清理 Cookies 基本就解决了。比如 iOS 下清理 Safari 的浏览记录，全部清除。
  微软是随便下载一个 office 365 的应用，比如 Word，在设置中进入 Word，清理下缓存和登录资格，然后后台杀死 Word，再重新打开即可。我前面讲到的 outlook app 的这个问题就是这么解决的。
  第三种方式处理起来有点困难了，有的可以通过手机恢复出厂设置来重新弄，但有种方式是怎么弄就难弄的，就不说了。</description>
    </item>
    
    <item>
      <title>微软 hotmail.com 中 bug 及解决办法</title>
      <link>https://tourcoder.com/fixed-suggested-contacts-on-outlook-dot-com-and-more/</link>
      <pubDate>Mon, 11 Nov 2019 15:08:33 +0000</pubDate>
      
      <guid>https://tourcoder.com/fixed-suggested-contacts-on-outlook-dot-com-and-more/</guid>
      <description>因为 hotmail 邮箱中的一个问题，发现了一连串的问题，而且挺严重的，也许是微软的设计缺陷，也许是其他因素。
  Suggested Contacts 问题
当写一封邮件，在收件人地方输入任何一个字母，就会弹出窗口，如下图
 比如，当我输入一个字母 a 时候，这时候弹出以前联系过的 Email 中包含 a 的人的 Email 地址，即便你删除了你的通讯录中所有人，删除了所有的邮件，这些人依旧被微软记录并保存了下来，在你每次输入的时候，会弹出提示。在这些 Email 旁边有个叉号，可以删除掉，但是！这里的删除是假的，下次登录，还是会出现。搜索下后发现，不只是我有这个问题，很多人都有这个问题，最近一次反馈这个问题的人，在这个月 5 日说他总是在这里看到曾经恐吓他，威胁要杀死他的狗的人 email 地址出现，他都要崩溃了，可以去这里看。
解决办法：返回到 hotmail.com 的旧版本，在旧版本里面删除，如果回到 hotmail.com 的旧版本？后面附上答案。
  Tasks 和 Microsoft To-Do
Microsoft To-Do 是微软重金收购 wunderlist 后，wunderlist 团队打造的一款用来取代 wunderlist 的应用，微软对其非常重视，重视到他们已经将 Microsoft To-Do 设定为 hotmail 邮箱中本身自带的 Tasks 的新版，并且自动将 Tasks 中的内容同步过去，这思路没有错，但问题在于，你从 Microsoft To-Do 中删除任何内容，而在 Tasks 中依旧存在。直白点说，同一个账户的数据，在新版中说删除了，但在旧版中还能显示，说明这被删除的数据只是在新版中被隐藏了，而在旧版中没有被隐藏，符合微软的一贯作风。
解决办法：在新版和旧版中都删除这些数据，当然这里可能是用隐藏好一点。
  新旧版切换 上面的两个问题都需要进入到旧版
  Tasks
Tasks 如果你没有开启试用新版的话，点击 Tasks 进入的就是旧版。如果已经开启了试用，则在新界面的右上角关闭试用新版的按钮即可。</description>
    </item>
    
    <item>
      <title>踩坑 outlook 的域名邮箱</title>
      <link>https://tourcoder.com/outlook-premium-email-box/</link>
      <pubDate>Sat, 09 Nov 2019 15:08:42 +0000</pubDate>
      
      <guid>https://tourcoder.com/outlook-premium-email-box/</guid>
      <description>最新更新：以下内容是一个产品试用过程，在这几天试用下来，可以用非常糟糕这个词形容，bug 出奇的多，并不建议你在实际使用。
outlook 的域名邮箱就是使用你当前的 outlook/hotmail/live/msn 邮箱，增加一个个性域名的邮箱，官方名字叫 Personalized email address。这个服务其实很早就有了，那时候是单独的订阅，但现在已经取消，用了更为鸡肋的方式替代。我之前用了它的单独订阅，但忘了续费导致过期无法再继续使用（微软客服说的，如果过期，再续费就算是新的订阅者，而那个服务不面向新的订阅着，呵呵）。
废话少说，介绍下今天的产品，就是这个鸡肋。
准备工作   确保你想用来做邮箱的域名在 Godaddy，比如我这里用的是本博客的域名 tourcoder.com，我将它转移到 Godaddy，并且必须要用 Godaddy 的 Nameservers，切记！！！
  Office 365 个人或者是家庭订阅版账户。
  如何获得 如果你是 Office 365 个人或者家庭订阅版的用户，你就已经拥有了这个，你需要做的就是激活使用它。
激活使用 访问 outlook.live.com，用的订阅版账户登录，在界面的右上角会有一个钻石的标志，点它。
 在弹出的窗口中，点击 Feature 里面 Personalized email address 后面的 Get Started，如下图
 因为域名已经转移到 Godaddy，所以点下图中最下面的 I already own a Godaddy domain
 注意，这里有一个坑，如果你想要用一个新域名，不要通过上面的 Get a domain 来注册一个新域名，我尝试了多次，都无法成功，最后先在 Godaddy 注册好域名，然后再使用，就没有问题。
 输入自己要用的域名
 会自动验证，注意另外一个坑，如上面准备工作中所说，一定要用 Godaddy 的 Nameservers，不然会验证通不过。其实可以通过设置让验证通过，但是，即便这里通过了，后面的操作会出现大量错误问题，所以一定要用 Godaddy 的 Nameservers。</description>
    </item>
    
    <item>
      <title>macOS 下通过 Aria2 进行高速下载</title>
      <link>https://tourcoder.com/how-to-download-faster-on-macos/</link>
      <pubDate>Fri, 08 Nov 2019 07:23:57 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-download-faster-on-macos/</guid>
      <description>目前看来，Aria2 是 macOS 下比较干净舒服的高速下载方式了，但很多人卡在了配置上。
下载安装 去它的官网下载文件，https://github.com/aria2/aria2/releases ，选择最新版的 dmg 文件下载，然后安装即可。
配置 打开终端工具，输入 vi ~/.aria2/aria2.conf，然后将下面的内容复制到里面
# Basic Options dir=/Users/YourUsername/Downloads input-file=/Applications/aria2c/session.dat log=/Applications/aria2c/aria2.log max-concurrent-downloads=15 max-connection-per-server=15 check-integrity=true continue=true # BitTorrent/Metalink Options bt-enable-lpd=true bt-max-open-files=16 bt-max-peers=8 dht-file-path=/opt/var/aria2/dht.dat dht-file-path6=/opt/var/aria2/dht6.dat dht-listen-port=6801 #enable-dht6=true listen-port=6801 max-overall-upload-limit=0K seed-ratio=0 # RPC Options enable-rpc=true rpc-allow-origin-all=true rpc-listen-all=true rpc-listen-port=6800 #rpc-secret=123456 #rpc-secure=true # Advanced Options daemon=true disable-ipv6=true #enable-mmap=true force-save=true file-allocation=none log-level=warn max-overall-download-limit=0K save-session=/Applications/aria2c/session.dat always-resume=true split=10 min-split-size=10M #百度网盘 user-agent=netdisk;5.2.6;PC;PC-Windows;6.2.9200;WindowsBaiduYunGuanJia referer=http://pan.baidu.com/disk/home 其中第二行 dir=/Users/YourUsername/Downloads 中的路径可以按你的需求来写。
下载工具 其实 aria2 是一个命令行下载工具，但网上还是有不少人围绕它开发了带有 UI 界面的工具，比如我常使用的 Aria2GUI，去其官网下载即可 https://github.</description>
    </item>
    
    <item>
      <title>GitHub 的简体中文之殇</title>
      <link>https://tourcoder.com/the-death-of-simplified-chinese-on-github/</link>
      <pubDate>Thu, 31 Oct 2019 15:24:26 +0000</pubDate>
      
      <guid>https://tourcoder.com/the-death-of-simplified-chinese-on-github/</guid>
      <description>这几天 GitHub 再次发生了贴吧式的中文 issue 事件，这次的导火索是 Notepad++，本来想写下点什么，但写好的文章又被我删除了。</description>
    </item>
    
    <item>
      <title>Docker 部署项目笔记(持续更新)</title>
      <link>https://tourcoder.com/deploy-via-docker/</link>
      <pubDate>Tue, 29 Oct 2019 07:16:56 +0000</pubDate>
      
      <guid>https://tourcoder.com/deploy-via-docker/</guid>
      <description>不用过多的介绍 Docker，最简单的理解方式就是单实例运行方案，其官网地址是 http://docker.com 。
为什么用 Docker 部署项目 用 Node.JS 来解释下，做 Node.JS 项目的会用到很多第三方的包，通常做法是通过执行命令 npm install package_name 直接在服务器上安装，但这样做是有一定的风险，主要是因为第三方包的不可控。Node.JS 就发生过比较著名的 left-pad 事件，所以通过 Docker 这类工具来部署尤其重要。
这是一篇系列的笔记，我会持续更新里面的内容。需要注意的是，我在是 macOS Catalina 上进行的操作，其它系统大同小异。
安装 Docker Docker 的安装无需说明，官网有相关的文档，请看这里 选择对应的系统版本安装即可，我使用的是 macOS，所以下载对应的客户端即可，我是通过 brew cask install docker 安装的。而 linux 下的安装方式也比较简单
curl -sSL https://get.docker.com/ | sh service docker start 安装完成后，运行 docker，可以通过 docker version 查看当前安装的 docker 版本情况。我写了一个一键安装 Docker 和 Docker Compose 的脚本，可以从这里下载。
Node.JS 项目 项目任务
  完成 Hello World
访问 http://localhost:8080 时显示 Hello World。</description>
    </item>
    
    <item>
      <title>VSCode 中实时预览 HTML</title>
      <link>https://tourcoder.com/live-server-on-vscode/</link>
      <pubDate>Mon, 21 Oct 2019 10:09:36 +0000</pubDate>
      
      <guid>https://tourcoder.com/live-server-on-vscode/</guid>
      <description>有时候会写一些静态页面，但在 vim 中预览这些页面就会比较难受，VS Code 的一个插件很好的解决了这个问题。
安装 打开 VS Code，搜索插件 Live Server，安装后重启 VS Code。
使用 打开一个工程项目，在 VS Code 的右下方有一个 Go Live 的按钮，点它，即可进入预览。</description>
    </item>
    
    <item>
      <title>基于 Ghost 做一个 Podcast 源</title>
      <link>https://tourcoder.com/make-podcast-rss-basic-on-ghost/</link>
      <pubDate>Fri, 18 Oct 2019 07:03:43 +0000</pubDate>
      
      <guid>https://tourcoder.com/make-podcast-rss-basic-on-ghost/</guid>
      <description>精力旺盛，心血来潮，想弄一个 Podcast 玩玩，看了一圈后，还是想基于自己的博客平台来做 rss 源。分享下大致的过程。
开始之前 本博客已经有不少博文，其输出的 rss 是不满足 Podcast 的需求的，所以需要单独区分开来，博文的 rss 还是沿用之前的 tourcoder.com/rss，而 Podcast 的则使用新的地址 tourcoder.com/podcast/rss。而将两个源内容通过 tag 来区分，带有 tctalk 标签的即为 Podcast 内容，其他的则为图文博文。
改造 routes.yaml 进入 Ghost 管理后台，选择 Labs，将 routes.yaml 下载下来，更改里面的内容
routes: /podcast/rss/: template: podcast/rss content_type: text/xml collections: /: permalink: /{slug}/ template: index filter: tag:-tctalk /podcast/: permalink: /podcast/{slug}/ filter: tag:tctalk taxonomies: tag: /tag/{slug}/ author: /author/{slug}/ 增加了 Podcast 的 rss 地址及 rss 模板地址，在主 rss 中排除了标签为 tctalk 的内容，在 podcast 的 rss 中显示标签为 tctalk 的内容。</description>
    </item>
    
    <item>
      <title>菜小孩</title>
      <link>https://tourcoder.com/cxh/</link>
      <pubDate>Fri, 18 Oct 2019 06:37:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/cxh/</guid>
      <description>我老婆和小姨子，两个打游戏特别菜的二货，每次还嘲笑我游戏打得菜，所以，我直接来一首歌 diss back。
收听地址
在 iPhone / iPad / Mac 上收听</description>
    </item>
    
    <item>
      <title>解决 Homebrew 速度慢的问题</title>
      <link>https://tourcoder.com/homebrew-slowly/</link>
      <pubDate>Sun, 13 Oct 2019 15:47:03 +0000</pubDate>
      
      <guid>https://tourcoder.com/homebrew-slowly/</guid>
      <description>最近 Homebrew 慢的出奇，甚至连安装其本身都出现了问题，归根揭底是 GitHub 在国内访问慢导致，一劳永逸的解决办法估计只有换源吧。更换的地方有两处，一是其本身，还有一个是 cask。我使用了中科大的源。
先安装 Homebrew，其官网有说明安装方式
/usr/bin/ruby -e &amp;quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&amp;quot; 但安装是非常慢，甚至经常中断安装，可以通过本地安装来解决这个问题，先下载安装文件，即下载上面地址中的文件
https://raw.githubusercontent.com/Homebrew/install/master/install 打开下载后的文件，编辑里面的
BREW_REPO = “https://github.com/Homebrew/brew“.freeze 更改成中科大的源
BREW_REPO = &amp;quot;https://mirrors.ustc.edu.cn/brew.git&amp;quot;.freeze 在终端中执行该文件即可
/usr/bin/ruby install 这样就可以安装完成了！
在使用过程中也会出现慢的问题，同样将官源更改成中科大的源。
cd &amp;quot;$(brew --repo)&amp;quot; git remote set-url origin https://mirrors.ustc.edu.cn/brew.git cd &amp;quot;$(brew --repo)/Library/Taps/homebrew/homebrew-core&amp;quot; git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git echo &#39;export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles&#39; &amp;gt;&amp;gt; ~/.zshrc //如果是 `bash` 用户，将 `zshrc` 改成 `bash_profile` source ~/.zshrc //同上 cd &amp;quot;$(brew --repo)&amp;quot;/Library/Taps/homebrew/homebrew-cask git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git 如果不喜欢，还是想用官方的，则将上面对应的地址换成下面官方的即可
https://github.com/Homebrew/brew.git https://github.com/Homebrew/homebrew-core.git https://github.com/Homebrew/homebrew-cask 其实在国内的环境下，很多时候各种库，插件，设置是操作系统都需要换源，中科大的这里是个很不错的源站，地址 https://mirrors.</description>
    </item>
    
    <item>
      <title>Apple ID 的奇怪设计</title>
      <link>https://tourcoder.com/what-a-wired-design-of-apple-id/</link>
      <pubDate>Sun, 13 Oct 2019 04:02:25 +0000</pubDate>
      
      <guid>https://tourcoder.com/what-a-wired-design-of-apple-id/</guid>
      <description>这几天腿受伤，不怎么方便外出，用手机的时间相对于多了点，发现了很多 iOS 和 macOS Catalina 的 bug，昨天给他们提交 bug 提交到晚上十点多，最后还发了个推吐槽了下其中的一个和 Apple ID 相关的 bug。
准备工作
  两个 Apple ID
first@appleid.com
second@appleid.com
  一部 iPhone
当前登录的 Apple ID 是 second@appleid.com，而 first@appleid.com 在这部 iPhone 上曾经登录使用过。
  复现
在 appleid.apple.com 点击忘记密码，请求重置 first@appleid.com，在几个下一步后，会提示去该部 iPhone 设置密码，此时该 iPhone 也弹窗让输入新的密码，输入新密码完成后，该 Bug 也出现。
Bug
  在请求重置 first@appleid.com 的密码时，此 iPhone 不应该弹窗，让输入，因为 first@appleid.com 已经没有在它上面使用了，只是曾经登录使用过，这个还说得过去。
  居然是请求重置 first@appleid.com 的密码，但完成上面的复现步骤后，会发现 first@appleid.com 和 second@appleid.com 的密码都被重置了，这个就很莫名其妙了。
  解决办法
目前最好的解决办法就是，当你的 iPhone / iPad 要转手给别人之前，要彻底重置系统成新的，而当你的这些设备丢失后，记得第一时间进入 iCloud 远程将手机进行锁定或者擦除。</description>
    </item>
    
    <item>
      <title>开发 Alfred 的 Workflow</title>
      <link>https://tourcoder.com/make-a-workflow-for-alfred/</link>
      <pubDate>Fri, 11 Oct 2019 13:49:58 +0000</pubDate>
      
      <guid>https://tourcoder.com/make-a-workflow-for-alfred/</guid>
      <description>我在以前的博文中写过 Alfred 这一个神器，它是我必用的应用之一，购买它的许可后，就能够使用 workflow，绝对的效率神器。
恰好最近在做开发的时候，需要访问不同端口的 localhost，索性就开发了个 workflow，方便打开不同端口的 localhost。效果如下
 输入 qp，空格，再输入端口，回车即可调用默认浏览器访问对应端口的 localhost。
开发这个 Workflow 的过程非常简单，基本没有写代码的过程。
  进入到 Alfred 中 Workflow 选项，点击底部 help 旁边的加号，选择 Blank Workflow
 填写对应的内容，保存。
  点击左侧刚才保存的 Workflow，在右侧工作区的空白处点击右键
 选择 Inputs-&amp;gt;Keyword
  在弹出的窗口中填写对应的内容
 keyword 即是呼起功能的关键词，输入说明，然后保存。
  再在工作区空白处点击右键
 选择 Actions-&amp;gt;Open URL
  同样在弹出的窗口中填写对应的内容
 这里的 {query} 即是输入的内容，下面选择默认浏览器，然后保存。
  最后用一根线将两个链接起来即可。
   这个 workflow 就开发完成了，如果想要给别人使用，只要点工作区右上角的分享按钮即可。
其实这个 workflow 也不算是开发，想要学习更为复杂的，可以看官方的文档。</description>
    </item>
    
    <item>
      <title>试用 macOS Catalina GM Seed</title>
      <link>https://tourcoder.com/try-macos-catalina-gm-seed/</link>
      <pubDate>Sun, 06 Oct 2019 14:42:43 +0000</pubDate>
      
      <guid>https://tourcoder.com/try-macos-catalina-gm-seed/</guid>
      <description>前两天 Apple 释放了 macOS Catalina GM Seed，按以前一贯的作风，如果没有特别大的 bug，GM 版本基本就是最终正式版。
 登录，下载 Profile，执行安装文件，安装完成后，随即遇到了第一个 bug，吐槽一句，Apple 现在的软件质量是越来越差。无视这个 bug，点击继续
 下载完成执行安装
 在一段时间等待后，完成，进入系统。
 设置部分布局发生了改变
 有了 Screen Time
还有一些应用已经无法使用，需要新的版本，比如 Beyond Compare，Inkscape，Kindle，LICEcap，SuperEmptyTrash 等
让我比较开心的一点是，Finder 里面终于把 iPhone 整合了
 iTunes 也分成了三个应用，Apple TV，Podcasts 和 Apple music。不过让我奇怪的是，我没有开启博客，为什么 Podcasts 里面会有我的博客，奇怪
 其他内容，有待进一步使用。
现在很多应用打开有两个明显的特点
特点一：询问是否要进入桌面
 如果你前面选择了否，那么可以在设置-隐私中重新设置
特点二：询问是否接受通知
会有各种提醒。</description>
    </item>
    
    <item>
      <title>macOS 下使用 GPG</title>
      <link>https://tourcoder.com/gpg-on-macos/</link>
      <pubDate>Fri, 04 Oct 2019 11:45:51 +0000</pubDate>
      
      <guid>https://tourcoder.com/gpg-on-macos/</guid>
      <description>GPG 是 GNU Privacy Guard 的简称，又名 GnuPG 是一种加密软件，它是 PGP 即 Pretty Good Privacy 的替代物，因为 PGP 不开源不免费，所以 GPG 使用还是比较广泛。在 macOS 下使用也比较方便。
安装 GPG 在 macOS 下通过 Homebrew 来安装
brew install gpg 在一段时间的等待后，安装即完成了，我当前使用的版本是 gnupg 2.2.17。
使用 GPG，生成公钥和私钥 在终端下执行命令
gpg --full-generate-key 会让你选择
 一般选择默认 1，可以根据自己的需求来选择其他的选项
然后会让选择长度，也是默认 2048，可以根据自己的需求来选择其他的选项
然后选择有效去，也是默认 0，可以根据自己的需求来选择其他的选项，会有一个确认的过程，整个过程如下图
 然后会要求输入名字，Email 地址以及 COMMENT，最后确认
 此时会要求输入密码和再次确认密码，如下图
 完成后，即可得到结果
 显示和导出公钥和私钥 gpg --list-keys //查看所有keys gpg --list-public-keys //查看所有公钥 gpg --list-secret-keys //查看所有私钥  通过第一条命令查询后得到的结果，其中虚线上面一条是公钥文件及其保存地址，该文件是一个二进制形式存储的文件，虚线下面的内容是
pub 后是公钥的特征，包含 2048 位，指纹字符串以及生成的时间，该字符串最后十六位即长密钥 ID。其中括号中 S 表示 Signing 即签名，E 表示 Encrypting 即加密，C 表示 Certificating 即认证。</description>
    </item>
    
    <item>
      <title>Unable to boot device because it cannot be located on disk.</title>
      <link>https://tourcoder.com/unable-to-boot-device-because-it-cannot-be-located-on-disk/</link>
      <pubDate>Sun, 29 Sep 2019 05:27:42 +0000</pubDate>
      
      <guid>https://tourcoder.com/unable-to-boot-device-because-it-cannot-be-located-on-disk/</guid>
      <description>昨天做了下磁盘清理，导致今天在用 xcode 编译一个应用时出现了两个问题
问题一
错误提示如下
Multiple commands produce &#39;/Users/TOURCODER/Library/Developer/Xcode/DerivedData/ProjectName-fuzydagfygwvdbaaesbqgyxhuvgh/Build/Products/Debug-iphonesimulator/ProjectName.app/Assets.car&#39;: 1) Target &#39;ProjectName&#39; (project &#39;ProjectName&#39;) has compile command with input &#39;/Users/TOURCODER/workspace/ProjectName/Assets.xcassets&#39; 2) That command depends on command in Target &#39;ProjectName&#39; (project &#39;ProjectName&#39;): script phase “[CP] Copy Pods Resources” 解决的办法：
xcode 中选择 File-&amp;gt;Workspace settings 会弹出如下图片
 选择其中的 Legacy Build System 即可解决问题。
问题二
错误提示如下
Unable to boot device because it cannot be located on disk. 解决办法：
在终端中输入 xcrun simctl erase all 完成该命令即可。</description>
    </item>
    
    <item>
      <title>通过 Highlightr 在 Swift 中实现代码高亮</title>
      <link>https://tourcoder.com/highlight-codes-via-highlightr-in-swift/</link>
      <pubDate>Mon, 23 Sep 2019 07:11:10 +0000</pubDate>
      
      <guid>https://tourcoder.com/highlight-codes-via-highlightr-in-swift/</guid>
      <description>前些天在一款应用中需要对代码进行高亮显示，用到了 Highlightr 这个第三方库，这个类库搜使用的核心库是 highlight.js。
实验环境   iOS
  类库地址：https://github.com/raspu/Highlightr
  操作步骤 在 Highlightr 官方库的说明文档中已经写得很清楚，先安装后使用。
  安装
简便的安装方式有两种，即 CocoaPods 和 Carthage，我习惯了 CocoaPods，就直接用它了。将 Highlightr 添加到 podfile
pod &#39;Highlightr&#39; 执行安装
pod install 安装完成后打开项目的 xcworkspace 文件。
  使用
我使用的是 UITextView 来接受文字内容，部分代码如下
lazy var tvContent:(UITextView) = { let textView = UITextView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height)) return textView }() let highlightr = Highlightr() func initUI() { self.view.addSubview(tvContent) let code = &amp;quot;code content&amp;quot; self.</description>
    </item>
    
    <item>
      <title>Apple 开发者帐号的问题</title>
      <link>https://tourcoder.com/an-issue-of-apple-developer-account/</link>
      <pubDate>Sun, 15 Sep 2019 04:48:01 +0000</pubDate>
      
      <guid>https://tourcoder.com/an-issue-of-apple-developer-account/</guid>
      <description>昨天深夜上传了个新应用，没几个小时，也就今天早上五点多的时候，收到 Apple 发来的邮件，随即登录开发者后台查看。
Hello, Upon further review of the activity associated with your Apple Developer Program membership, we have determined that your membership, or a membership associated with your account, has been used for dishonest or fraudulent activity. Therefore, your Apple Developer Program account has been flagged for removal. 原文很长，就不全贴了，看完我一脸懵逼。他们说他们非常确定我的开发者账户涉嫌欺诈，并把我的开发者账户给悬挂并标注成即将被删除。他们给我 14 天时间申诉，不是 14 个工作日，只是 14 天，14 天后会删除我的账户，好强势的有没有。
我仔细会想一下，我没有做过什么事情，这个账户是我第二个 Apple 开发者账户，注册于 2012 年，里面一共就五个应用，每个应用第一个版本的提交时间至少是几年前，怎么我账户就欺诈了？
想到这封邮件是来自昨天我提交的某个应用的反馈，我去查看了下更为详细的内容，其中有段话引起了我的注意
&amp;quot;You will not, directly or indirectly, commit any act intended to interfere with the Apple Software or Services, the intent of this Agreement, or Apple’s business practices including, but not limited to, taking actions that may hinder the performance or intended use of the App Store, Custom App Distribution, or the Program (e.</description>
    </item>
    
    <item>
      <title>批量查看未被占用的 Twitter 用户名</title>
      <link>https://tourcoder.com/checking-unoccupied-twitter-usernames-in-bulk/</link>
      <pubDate>Thu, 12 Sep 2019 12:05:08 +0000</pubDate>
      
      <guid>https://tourcoder.com/checking-unoccupied-twitter-usernames-in-bulk/</guid>
      <description>前些天一个自己用来“批评”科技公司的 Twitter 账户被封了，原因是说我违反了他们的用户条款。其实我只是在那个帐号发了一些科技产品的 bug，不过无所谓了，重新注册一个即可。
需求 现在目前 Twitter 允许注册用户名最短是 5 位，支持数字（0-9），26 个英文字母（不区分大小写）以及英文状态下的下划线。
而我打算这次用的用户名是以两个字母开头，后面跟着数字的组合方式，那么一共就有 1000 种可能性，即从 000 到 999。
分析 秉着一贯懒的作风，我不打算围绕 API 来操作，我采用最简单粗暴的方式&amp;ndash;通过服务器的状态码来判断。在 Twitter 上一个用户名所对应的账户一般有三个状态，正常，不存在和账户被悬挂（Account suspended）。通过对这三种状态的账户分析发现，访问正常和悬挂状态的账户，服务器返回正常，都是 200；而访问不存在的账户，服务器返回为 404，这就有了突破口。
过程 这里用 Node.JS 来实现需求。
  创建一个文件夹，并进入到该文件夹下
mkdir demo &amp;amp;&amp;amp; cd demo   初始化
npm init   引入 module
因为喜欢 axios，所以这里引入了它，其实可以用 NodeJS 自带的 http(s)
npm install axios   编写代码
先循环把数字列出来
for(var i=0; i&amp;lt;1000; i++) { console.log(i); } 列出来的数字是从 0 到 999，其中 0 到 99 都没有满足三位数，需要在前面加上 0 作为补充，这里我用迭代方式实现。</description>
    </item>
    
    <item>
      <title>GitHub Package Registry 试用(NPM 部分)</title>
      <link>https://tourcoder.com/try-github-package-registry-part-npm/</link>
      <pubDate>Thu, 12 Sep 2019 04:02:55 +0000</pubDate>
      
      <guid>https://tourcoder.com/try-github-package-registry-part-npm/</guid>
      <description>纯粹的巧合，在我发邮件给 NPMJS 请他们协助我删除掉我账户里面所有的 Package 后三个小时，我发现自己的 GitHub 账户里已经可以使用 GitHub Package Registry 服务。
 那么究竟是如何使用的呢？
准备工作
因为我的 GitHub 账户开启了二次认证，我需要创建一个 AccessToken，其权限是对 Package 的操作权限，如下图
 将内容保存下来。
创建项目
 在项目的导航中可以清楚的看到有一个 packages 菜单项，需要注意的是，如果创建的是空项目是没有这组菜单项的。
NPM 部分 配置 package.json 文件
点 packages 该选项后，进入到本文第一张图的界面，选择对应的 Package Type，这里我选择了 NPM，则出现下面的内容
 // Step 1: Use `publishConfig` option in your package.json publishConfig: {registry: &amp;quot;https://npm.pkg.github.com/tourcoder&amp;quot;} // Step 2: Authenticate $ npm login --registry=https://npm.pkg.github.com/tourcoder // Step 3: Publish $ npm publish 完成第一步内容，即配置 package.json。
授权许可
执行上面步骤中的第二步，因为网络问题，它不是太稳定，总会报错，如下图</description>
    </item>
    
    <item>
      <title>重庆四日</title>
      <link>https://tourcoder.com/four-days-at-chongqing/</link>
      <pubDate>Sun, 08 Sep 2019 05:28:14 +0000</pubDate>
      
      <guid>https://tourcoder.com/four-days-at-chongqing/</guid>
      <description>本文配有视频在 Youtube 上，点击观看
去了一趟重庆，满打满算四天，因为这次去得匆忙，并没有提前做好攻略，甚至连酒店都是临时订的，不过运气不错，酒店靠江交通方便，而且很干净。
第一天 不知道怎么了，这两年越来越恐惧坐飞机，本想着坐高铁，但怎奈时间紧，硬着头皮坐了飞机。但我老婆却很开心，她想到能出去玩，能够吃吃吃，她非常开心。
这次坐的是海航的航班，位置很舒服，也就是看了几十页书的功夫，飞机就安全着落。等车时拍下了在重庆的第一张照片。
回到酒店简单的洗漱了下，即出门去流嘉码头吃饭。酒店门口的出租车司机有点过分，3 公里不到的路程，他跑了 7 公里多，如果不是我提醒他我这边有导航，他还要拉着乱逛。
第二个出租车司机是截然相反，接了单走了一半说，那个地方不好走，现在很堵，你们下车吧。看看也挺近的，就下车。但所谓望山跑死马，看着很近，但走得累死。在这过程中，拍下了江对岸的洪崖洞。
不过和吃到了好吃的相比，这两个坑货司机也就不是事了。
重庆的第一感觉是好看，立体感很足。
第二天 忙完手上的事情，坐地铁去磁器口，重庆的地铁是单轨的，据说能体验到过山车的感觉。
和每个地区的热门景点一样，除了人多就是人多
逛的时候遇到了宝轮寺，在我的想象中重庆是个道教偏重于佛教的地方，不知道是不是这个原因，里面香客稀少，也可能是因为要门票的缘故吧。我老婆在里面还求了一支签 &amp;ndash; 上上签。
买点特产是肯定要做的事情，但有点郁闷的是商家以 100 元三瓶的价格卖给我本身 100 元四瓶的牛肉酱。
晚上去了解放碑那边的步行街，在步行街那边的小吃一条街吃吃吃，还再次去了洪崖洞那边吃火锅。
我非常喜欢这个榴莲饼。
第三天 去长江索道，武隆天坑地缝这些景点的计划泡汤了，原因是我家二货中暑头疼了，她在酒店睡了一天，即便这样，也没有能够阻挡她吃吃吃，把饿了么叫到了酒店，而我忙自己的事。
这只是她叫的吃的极少一部分。晚上的时候，二货起床，两人又去了步行街那边吃吃吃。
第四天 过了安检才知道，别人推荐的龙抄手在机场的到达区，而非出发区。然后就随便在机场吃了口中晚饭。
在回来的飞机上，飞行员在应对气流的时候有点猛了，飞机抖动非常厉害，有强烈的撕裂感。有那么一瞬间，我们觉得自己要完了。
一些心得   吃：重庆的东西辣而且麻，但很香。去之前我说坚决不吃火锅的，因为那年在成都吃了火锅，然后同学告诉我口水火锅的故事，我就开始拒绝吃了，但这次还是吃了。
  行：感觉重庆叫车挺方便的。
  住：因为临时去，酒店也是临时订的，坐标大溪口，价格蛮便宜，主要是干净，靠江边，周边交通也发达。
  天气：天气很热，很闷，最后送我们去机场的司机说，是这几天才热起来的，前几天天气还蛮凉快。
  玩：如上面所说，因为我老婆中暑，有些地方没有去。但有些地方是我们刻意不去的，比如渣滓洞，白公馆。
  过山车的地铁：必须要坐到车头的位置，因为驾驶室是透明的，可以通过透明玻璃看到前方过山车的效果。不过需要注意的是慕名而来的人很多，你会被挤得怀疑人生，毫无脾气，大致站点是牛角沱到曾家岩，其中还有一个李子坝是轻轨穿楼而过，也很好看。
  </description>
    </item>
    
    <item>
      <title>iOS 中使用图标字体</title>
      <link>https://tourcoder.com/how-to-use-icon-font-in-ios/</link>
      <pubDate>Fri, 06 Sep 2019 06:45:31 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-use-icon-font-in-ios/</guid>
      <description>之前写过一篇在 iOS 中自定义字体的「博文」，随着现在字体的图形化，在 iOS 开发中也可以通过使用这些图形字体来替代图片，也能减少应用的体积。
准备工作：找字体 现在这些图标字体很多，比如 FontAwesome，再比如阿里的 IconFont，我这里使用的是 IcoMoon
访问 IcoMoon 的网站，选择需要用到的字体，比如这里选择耳机
 选中后，点击下面的 Generate Font 生成字体，在下一个界面下载字体，同时记录下这个字体的编码
 开发   创建项目，并将刚才下载的字体添加到项目中
   编辑 Info.plist 文件，引入字体
打开 Info.plist 文件，增加 Fonts provided by application，值为刚才字体文件的名字 iconmoon.ttf
这里字体文件的名字可以随意修改
  编写代码
这里用 UILabel 来显示内容
let label = UILabel(frame: CGRect(x:30, y:30, width: 100, height: 100)) label.font = UIFont.init(name: &amp;quot;icomoon&amp;quot;, size: 96) label.text = &amp;quot;\u{e910}&amp;quot; 先初始化字体，然后输入字体的编码即可，运行后的效果如下
   源码 本次教程源码查看：GitHub</description>
    </item>
    
    <item>
      <title>使用 iRedmail 架设邮局系统</title>
      <link>https://tourcoder.com/install-iredmail-on-ubuntu/</link>
      <pubDate>Fri, 16 Aug 2019 14:50:28 +0000</pubDate>
      
      <guid>https://tourcoder.com/install-iredmail-on-ubuntu/</guid>
      <description>因为几个因素，放弃了现在购买的邮局系统，自行搭建了 iRedmail，记录下整个过程。
准备   Ubuntu 18.04
iRedmail 会帮你安装很多东西，所以它要求是一个没有安装任何东西的全新系统。
  iRedmail 0.9.9
  操作   更新系统
sudo apt update sudo apt upgrade -y   设置 FQDN hostname
FQDN 全称 fully qualified domain name，编辑两个文件
sudo vi /etc/hostname 比如你的设置是 mail.tourcoder.com，那么这里应该是 mail
sudo vi /etc/hosts 将内容编辑成 127.0.0.1 mail.tourcoder.com mail localhost localhost.localdomain
重启系统后，通过 hostname -f 查看，是否生效。
  安装 iRedmail
去其官网下载最新版本，当前版本是 0.9.9
wget https://bitbucket.org/zhb/iredmail/downloads/iRedMail-0.9.9.tar.bz2 tar -zvxf iRedMail-0.9.9.tar.bz2 cd iRedMail-0.9.9 chmod +x iRedMail.</description>
    </item>
    
    <item>
      <title>macOS 上必装的应用</title>
      <link>https://tourcoder.com/essential-apps-on-macos/</link>
      <pubDate>Wed, 14 Aug 2019 04:25:36 +0000</pubDate>
      
      <guid>https://tourcoder.com/essential-apps-on-macos/</guid>
      <description>因为工作需要，我在 macOS 上安装了很多应用，除了和工作相关的应用之外，我在 macOS 有几款必装的应用。
Homebrew 在 macOS 下非常好用的东西，很多开源免费的软件可以通过它来安装。官网 https://brew.sh/。
/bin/bash -c &amp;quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&amp;quot; 在终端中输入上面的命令即可安装完成。
因为 raw.githubusercontent.com 这个域名被污染，所以，在安装时会遇到 Connection refused 的问题，解决办法，编辑 hosts 文件
sudo vi /etc/hosts 在里面增加 199.232.28.133 raw.githubusercontent.com 即可。也可以通过代理终端的方式解决。
H9 自制的启动器类的工具，可以在 GitHub 上下载到。
我用它取代了之前一直用的 alfred 和 raycast。
Slowquitapps macOS 的人经常会遇到一个问题，就是一不小心就会按错，按到 command+q 键导致当前界面退出，使用了这款应用就不怕了。这是一款开源免费的应用，开源在 GitHub，可以下载源代码，通过 xcode 编译安装，也可以用 Homebrew 安装。这里翻译下它在 GitHub 上的安装方式等
在 macOS 下打开终端，执行命令
brew tap dteoh/sqa brew install slowquitapps --cask 这样就安装完成了，打开这个应用给它一定的权限，完事，当每次再出现手残情况时就会出现如下界面
 会有一个倒计时的进度条，当进度条跑满后，应用就可以退出了。
设置时间
defaults write com.dteoh.SlowQuitApps delay -int 1000 //1 秒 白名单</description>
    </item>
    
    <item>
      <title>隐私政策</title>
      <link>https://tourcoder.com/privacy/</link>
      <pubDate>Sat, 10 Aug 2019 09:05:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/privacy/</guid>
      <description>欢迎访问我的博客！保护您的隐私是我极为重视的事情。在这份隐私政策中，我会说明我在博客上收集的信息以及如何使用这些信息。
信息收集与使用 我在您访问我的博客时，不会主动收集您的个人信息。然而，为了改善用户体验，我可能会使用cookies来收集匿名的信息，例如您访问的页面和使用的功能。这些信息将帮助我了解访问者的偏好，并进一步改进我的内容和服务。
第三方服务 我的博客可能包含来自第三方的链接，这些链接可能会引导您离开我的网站。我对这些第三方网站的隐私政策和做法不负责任。我建议您在访问这些链接之前仔细阅读它们的隐私政策。
版权声明 我的博客中的所有内容（包括但不限于文字，图片，视频，音频等）均属于我的私人财产，除非特别注明，否则采用 Creative Commons BY-NC-ND 4.0（自由转载-保持署名-非商用-禁止演绎）协议发布。这意味着您可以在遵守以下条件的前提下自由转载我的内容：
 保持署名：您需要清楚标明原始作者为我。 非商业用途：您不得将我的内容用于商业目的。 禁止演绎：您不得修改、转换或基于我的内容进行二次创作。  如果您有意转载我的内容，请先与我取得联系。
变更与修订 我保留随时更新本隐私政策的权利。任何更新将在本页面上发布，恕不另行通知。因此，请定期查看此页面以了解隐私政策的变更。
联系我 如果您对我的隐私政策或对您的个人信息有任何疑问，请随时通过电子邮件与我联系。</description>
    </item>
    
    <item>
      <title>用 NodeJS 写 CLI</title>
      <link>https://tourcoder.com/how-to-build-a-command-line-tool-in-nodejs/</link>
      <pubDate>Wed, 07 Aug 2019 03:31:10 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-build-a-command-line-tool-in-nodejs/</guid>
      <description>CLI 即 command-line interface 的简写，中文称命令行界面，是指可在用户提示符下键入可执行指令的界面，通常不支持鼠标，用户通过键盘输入指令，计算机接收到指令后，予以执行。因为最近工作需要，使用 NodeJS 写了一次 CLI。
  commander
这是一个 npmjs.org 上的 module，通过它可以更简便的写 CLI，具体可以看这里。
  直接写
以 hello world 为事例
  创建并初始化
mkdir clt-demo cd clt-demo npm init   对 package.json 进行修改
先看 package.json 的代码
{ &amp;quot;name&amp;quot;: &amp;quot;clt-demo&amp;quot;, &amp;quot;version&amp;quot;: &amp;quot;0.0.1&amp;quot;, &amp;quot;description&amp;quot;: &amp;quot;a demo for writing CLT with NodeJS&amp;quot;, &amp;quot;scripts&amp;quot;: { &amp;quot;test&amp;quot;: &amp;quot;echo \&amp;quot;Error: no test specified\&amp;quot; &amp;amp;&amp;amp; exit 1&amp;quot; }, &amp;quot;keywords&amp;quot;: [ &amp;quot;nodejs&amp;quot;, &amp;quot;CLT&amp;quot; ], &amp;quot;license&amp;quot;: &amp;quot;MIT&amp;quot;, &amp;quot;preferGlobal&amp;quot;: true, &amp;quot;bin&amp;quot;: { &amp;quot;commandname&amp;quot;: &amp;quot;app.</description>
    </item>
    
    <item>
      <title>一个简单的短网址系统</title>
      <link>https://tourcoder.com/a-simple-short-url-app/</link>
      <pubDate>Mon, 15 Jul 2019 03:42:19 +0000</pubDate>
      
      <guid>https://tourcoder.com/a-simple-short-url-app/</guid>
      <description>厌烦了现在博客的 url 长地址，虽然在 SEO 上是有一定的帮助，但分享起来，还是比较麻烦，索性就给本博客增加了一个外部的短网址系统。当前博客程序用的是 ghost，它本身提供了一套 API，只是因为懒得去读它的文档，索性就是写了个外部的。
基本信息   开发语言: NodeJS (koa2)
  运行环境: Debian 8
  主要问题   路由问题
根据 koa-router 的路由资料来操作即可
  外部调用
说是外部调用，其实有两个功能，生成和展示。
  展示部分代码
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt; var hoho = &amp;quot;domainname/links?link=&amp;quot;+window.location.href; $.ajax({ type: &amp;quot;GET&amp;quot;, url: hoho, success: function(data) { $(&amp;quot;p#shorturlforthispost&amp;quot;).html(&amp;quot;本文短网址: &amp;lt;a href=&#39;domainname/&amp;quot; + data + &amp;quot;&#39;&amp;gt;domainname/&amp;quot; + data + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;) }, error: function(jqXHR, error, errorThrown) { //console.log(jqXHR.status); } }); &amp;lt;/script&amp;gt;   通过 jQuery 的 $.</description>
    </item>
    
    <item>
      <title>开发 macOS 中 Preferences Application</title>
      <link>https://tourcoder.com/make-preferences-application-on-macos/</link>
      <pubDate>Sat, 13 Jul 2019 12:02:29 +0000</pubDate>
      
      <guid>https://tourcoder.com/make-preferences-application-on-macos/</guid>
      <description>想必有很多和我一样喜欢拿着 mac 在外面写点东西的人都遇到过一个问题，当专心写东西往往没有注意 mac 没电，直到没电关机，要是有一个 app 能想 iPhone 上那样低电量提醒就好了。
所以，我就写了个这样的应用 BatteryBird，不过并不是安装在 Application 这个文件夹下的应用，而是出现在 System Preferences 中的应用，其实它本身就是一个独立的应用。
准备条件 系统环境：macOS Version 10.14.5 (18F132)
开发工具：XCode Version 10.2.1 (10E1001)
知识点：Preferences Pane
测试环境：同系统环境
开发 在 XCode 中新建一个项目
 这里选择对应的模板：Prefernce Pane
 输入项目名等信息，点击下一步直到创建完成。
 创建好后的项目左侧文件，整个文件挺少，是我喜欢的方式，需要注意的是这里自动生成的文件 BatteryBird.tiff 是一个空文件，然后就是编码过程，等代码写完，测试通过后，按 command + B 对代码进行编译。
PS. 从上面的文件结构可以看出，它默认支持的是 Objc，而不是 Swift，如果需要用 Swift 来写，这里的一个问答很有帮助。
 编译通过，在 Products 文件夹下的文件 BatteryBird.prefPane 点右键，选择 Open with External Editor，此时会自动打开，需要安装
 点击安装，在安装完成后，即可在 System Preferences 中看到相关的 icon 了。
 这基本就是 Preferences Application 的开发过程。</description>
    </item>
    
    <item>
      <title>合理的删除 Apple ID</title>
      <link>https://tourcoder.com/how-to-delete-apple-id-correctly/</link>
      <pubDate>Thu, 27 Jun 2019 05:20:45 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-delete-apple-id-correctly/</guid>
      <description>去年十月份删除了一个不常用的 Apple ID，但今天却给自己带来了麻烦，这个 Apple ID 所使用的 Email 地址将无法再次在 Apple ID 的系统中被使用。在和 Apple 客服近半个小时的电话沟通后，自然确认这个 Email 地址基本无望能够再次被使用了。
 疑点 在和客服沟通后，我其实还是有一些疑虑的，但考虑时间问题，就没有继续讨论下去。我的疑点主要体现在两点
  在 Apple ID 系统中，它的安全措施是如果删除了 Apple ID，那么这个 Apple ID 即其所绑定的 Email 地址都会存在对应的系统中，不允许再被使用。
  我提出既然是这样，我这里有删除后悔码，我是否可以恢复之前删除的 Apple ID 呢？得到的解答是因为时间过长了，该邮箱已经在他们的系统中查不到了，所以，没有办法恢复。
  可以从上面的话中看出不符合逻辑的地方，但也可以猜一下 Apple ID 的系统逻辑。
删除的 Apple ID 及其所关联的 Email 在他们的系统中会有一个时间周期，到了一定的周期后，将不能被恢复，但也不会被释放。
正确的做法 如果要删除 Apple ID，并且确定以后不会再使用，最好是新建一个邮箱，然后换掉之前 Apple ID 的 Email 地址，然后就可以随便删除了。</description>
    </item>
    
    <item>
      <title>给 Microsoft Todo 的一点建议</title>
      <link>https://tourcoder.com/some-user-voices-to-microsoft-todo/</link>
      <pubDate>Wed, 26 Jun 2019 02:55:17 +0000</pubDate>
      
      <guid>https://tourcoder.com/some-user-voices-to-microsoft-todo/</guid>
      <description>前几天我在 Twitter 上说留给 Wunderlist 的时间不多了，但即便如此，我还是觉得 Microsoft Todo 还不足以能够替代 Wunderlist。目前，Microsoft Todo 还是很混乱，准确的说。
优点 现在的 Microsoft Todo 在界面上很轻，比起 Wunderlist 看起来很重的界面，Microsoft Todo 让人感到舒服的。
建议  这是 Microsoft Todo 在 macOS 上的界面图，其他系统的应用应该差不多。
  My Day
我不清楚这里的 My Day 的意思，Important 本就可以解决的问题，又冒出个 My Day，是非常莫名其妙的事情。
  Tasks
是除了 List 之外的所有 Task 合集吧，但真的略显多余。
  Add a task
第一区块部分，每一个都可以 Add a task，这难道不是很多余的事情么？
  下面是我修改后的图
   Part 1
这一部分所有的内容都应该是自动式的：
  去掉所有增加 task 的功能</description>
    </item>
    
    <item>
      <title>本站搜索的改进</title>
      <link>https://tourcoder.com/improve-the-search-feature/</link>
      <pubDate>Wed, 12 Jun 2019 01:10:54 +0000</pubDate>
      
      <guid>https://tourcoder.com/improve-the-search-feature/</guid>
      <description>Ghost 自身是没有带站点搜索功能的，考虑到搜索的需要，我通过 page 实现了一个简单的搜索。
创建一个页面，在页面内容中增加搜索功能的 html 代码即可，代码如下
&amp;lt;div class=&amp;quot;page&amp;quot;&amp;gt; &amp;lt;div class=&amp;quot;searchf&amp;quot;&amp;gt; &amp;lt;form action=&amp;quot;https://www.google.com/search&amp;quot; onsubmit=&amp;quot;return dispatch()&amp;quot; target=&amp;quot;_blank&amp;quot; class=&amp;quot;search-form&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;search&amp;quot; placeholder=&amp;quot;输入要查内容，回车查询&amp;quot; class=&amp;quot;skeywords search-form&amp;quot; name=&amp;quot;q&amp;quot; id=&amp;quot;q&amp;quot; value=&amp;quot;&amp;quot;&amp;gt; &amp;lt;input name=&amp;quot;sitesearch&amp;quot; type=&amp;quot;hidden&amp;quot; value=&amp;quot;tourcoder.com&amp;quot; /&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;搜索&amp;quot; /&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; 其实 Google 搜索在很多年前就提供了一个可自定义的站内搜索，访问 https://www.google.com/cse/ ，进行必要的定制后会得到相应的 js 代码，如下
&amp;lt;script&amp;gt; (function() { var cx = &#39;007392108407227551164:a9wq4h81k0o&#39;; var gcse = document.createElement(&#39;script&#39;); gcse.type = &#39;text/javascript&#39;; gcse.async = true; gcse.src = &#39;https://cse.google.com/cse.js?cx=&#39; + cx; var s = document.</description>
    </item>
    
    <item>
      <title>GitHub 的一个巧妙设计</title>
      <link>https://tourcoder.com/so-cool-feature-on-github/</link>
      <pubDate>Tue, 04 Jun 2019 15:17:27 +0000</pubDate>
      
      <guid>https://tourcoder.com/so-cool-feature-on-github/</guid>
      <description>访问 GitHub，收到了如下的提醒
 心想我邮箱早就验证过了，怎么还会要求这个，点进去后发现是这样的
 突然意识到，是不是我的邮箱挂了？赶紧查看邮箱，果不其然，邮箱挂掉了。
为什么说 GitHub 设计巧妙呢？猜想是这么一回事，我今天提交了 40 几个 commit，然后又向主库提交了几个 PR，根据我的设置，每次提交后，GitHub 都会向我的邮箱发送一封通知邮件，因为我的邮箱挂了，GitHub 收到了退回邮件，触发了他们的风控系统，出现了这个情况。</description>
    </item>
    
    <item>
      <title>Swift 中 NavigationController 的切换改变</title>
      <link>https://tourcoder.com/change-navigationcontroller-in-swift/</link>
      <pubDate>Wed, 29 May 2019 05:08:30 +0000</pubDate>
      
      <guid>https://tourcoder.com/change-navigationcontroller-in-swift/</guid>
      <description>最近在一个用 Swift 写的项目中，用到了 NavigationController 来进行界面的切换，即用到了 pushViewController 和 popViewController，众所周知，pushViewController 是从右向左载入新界面，而 popViewController 是从左向右退回返回到旧界面。那么是否有可能让它们的方向是相反的呢？
答案是可以，这里用到了 CATransition，直接上代码，pushViewController 部分
let newVC = NewVC() let transition = CATransition() transition.duration = 0.3 transition.type = .push transition.subtype = .fromLeft self.navigationController?.view.layer.add(transition, forKey: kCATransition) self.navigationController?.pushViewController(newVC, animated: false) 从上面代码即可以看出将 profileVC 从左向右载入，那么 popViewController 用反方向即可
let transition = CATransition() transition.duration = 0.3 transition.type = .push transition.subtype = .fromRight self.navigationController?.view.layer.add(transition, forKey: kCATransition) self.navigationController?.popViewController(animated: false) </description>
    </item>
    
    <item>
      <title>获取 6 个字符的 Gmail 用户名</title>
      <link>https://tourcoder.com/get-short-gmail-username/</link>
      <pubDate>Mon, 27 May 2019 04:16:35 +0000</pubDate>
      
      <guid>https://tourcoder.com/get-short-gmail-username/</guid>
      <description>Gmail 的用户名最少是 6 位，随着其用户越来越多，能够得到一个较短的用户名也比较麻烦了，恰好在 GitHub 上发现了一个比较好玩的库，用来查找 Gmail 中还剩下的 6 位字符的用户名。
实验环境   CentOS 7
  Python 3
  Git
  GitHub 项目地址：https://github.com/xyou365/gmail-username-available
  操作步骤   配置 python 3 的环境
系统中默认的是 python 2.7，本实验项目需要 python 3 的环境，故需要进行环境的更新
源码安装方式
sudo yum install yum-utils -y sudo yum-builddep python -y curl -O https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz tar xf Python-3.5.0.tgz cd Python-3.5.0 ./configure make sudo make install python3 -V EPEL 仓库安装方式
sudo yum install epel-release -y sudo yum install python34 -y   安装 Git</description>
    </item>
    
    <item>
      <title>文件的校验</title>
      <link>https://tourcoder.com/file-verification/</link>
      <pubDate>Mon, 27 May 2019 03:20:32 +0000</pubDate>
      
      <guid>https://tourcoder.com/file-verification/</guid>
      <description>下载的文件很多时候是应该对文件进行校验的，常用的校验有 md5，sha1 等等，校验方式也比较简单，这里单纯用 md5 校验
  安装相关的校验命令
通过 homebrew 来安装校验命令工具
brew install md5sha1sum   命令行进行校验
打开命令行工具，执行命令 md5sum 待校验的文件名即可。其实在 macOS 下可以直接用 md5 代校验文件名来直接进行校验。
  </description>
    </item>
    
    <item>
      <title>找回被回收的 Google Voice 号码</title>
      <link>https://tourcoder.com/get-google-voice-number-back-via-google-fi/</link>
      <pubDate>Wed, 22 May 2019 05:57:25 +0000</pubDate>
      
      <guid>https://tourcoder.com/get-google-voice-number-back-via-google-fi/</guid>
      <description>Google Voice 的号码被回收，并且 Google Voice 的账户被停用，即便我和他们一条一条的说明我没有违背 TOS，但均被拒绝恢复 Google Voice 帐号。
在多次被拒绝后，我昨晚本想写最后一封邮件给他们，大概的意思就是我是否可以向他们购买这个号码，或者是否可以将该号码帮我转移到 Google Fi，当写到这里的时候，我突然想到 Google Fi 和 Google Voice 的关系，我想如果 Google Vovice 不能够使用了，那么这个号码是否还保存在我的账户，我是否可以通过 Google Fi 找回该号码？立刻打开 Google Fi，果然号码就在那里！！！
后面就是简单的激活 Google Fi，并将号码从 Google Voice 转移到 Google Fi， 几分钟后，完成，我的号码又找回来了！！！</description>
    </item>
    
    <item>
      <title>一次找回 Google Cloud VM 实例中数据的过程分享</title>
      <link>https://tourcoder.com/get-dbs-from-terminated-vm-of-google-cloud/</link>
      <pubDate>Tue, 21 May 2019 02:01:23 +0000</pubDate>
      
      <guid>https://tourcoder.com/get-dbs-from-terminated-vm-of-google-cloud/</guid>
      <description>Google Cloud 的 VM 实例在停止后无法再次重启，总是提示
Starting VM instance &amp;quot;***&amp;quot; failed. Error: The zone &#39;projects/***/zones/***&#39; does not have enough resources available to fulfill the request. Try a different zone, or try again later. 字面意思就是该区现在没有资源，让转区或者稍后再试。想着要找回 VM 中的数据，而多次尝试启动 VM 总是失败，搜索官方文档找到了这篇参考文章，这篇文章说可以将当前实例移动到其他有资源的区，随即按上面的步骤操作。
 如果上图，初始化并得到授权
./bin/gcloud compute instances list 列出当前所有的实例
./bin/gcloud compute instances move vm001 \ --zone sourcezonename --destination-zone targetzonename 将实例移动到指定的区去。但此时悲剧发生，系统总是提示错误
Moving gce instance vm001...failed. ERROR: (gcloud.compute.instances.move) Instance cannot be moved while in state: TERMINATED 查询后发现原因是该实例没有启动，是关闭状态，处于关闭状态的机器是不能被转移的，同时在查找的过程中，网上给出来的说法就两个字“凉凉”，认为在这个时候基本没有任何办法。</description>
    </item>
    
    <item>
      <title>利用 GitHub 协同工作</title>
      <link>https://tourcoder.com/collaboration-via-github/</link>
      <pubDate>Tue, 07 May 2019 03:01:53 +0000</pubDate>
      
      <guid>https://tourcoder.com/collaboration-via-github/</guid>
      <description>GitHub 的强大不用我多说，今天这一篇就好好的写一下如何用 GitHub 进行有效的协同工作，基本是看完这篇文章后，GitHub 协同工作就会了。
主仓库和开发仓库 这里有两个概念 &amp;ndash; 主仓库和开发仓库，很多团队是在同一个仓库进行协同开发，其实这是非常危险的事情，也不方便管理，我们团队使用的是主仓库和开发仓库的开发模式。
  主仓库
主仓库只作为协同工作时的协调库，以及持续部署的基础源。任何协同开发人员不可在主仓库创建分支，不得向主仓库 push 内容，所有内容必须经过 PR(Pull Request) 的方式进行提交。
  开发仓库
每位参与该协同项目的开发人员从主仓库 fork 出来的仓库，每位开发者必须要有自己的开发仓库。
  协同流程 创建一个仓库，比如叫 demo-collaboration，它是主仓库，如下图
 将相应的协同人员加入到该仓库中，如下图
 这样一个主仓库及创建完成，每位参与协同开发的开发者应该 fork 一份主仓库的内容，他将在 fork 后的仓库（即开发仓库）里进行开发工作，如下图
  开发者在自己的开发仓库里进行开发，当开发完成后，将内容提交到 GitHub 上自己的开发仓库中（必须是自己的开发仓库），如下图
 开发者将自己开发仓库的内容提交到主仓库，必须使用 PR 方式，点击上图中的 New pull request，即可进入下图
  在进行 PR 的提交时，注意目的地和来源，左边是目的地，右边是来源，方式是将来源的内容合并到目的地。此时开发者的工作即完成，相应的 Code Review 人员进行代码审核后，将代码进行合并/拒绝等操作处理，如下图的合并完成。
 此时回到主仓库可以发现，该开发者的内容已经合并到主仓库中。
上面的内容就是协同工作的开发者如何向主仓库提交内容，下面将介绍如何从主仓库拉取内容到自己的开发仓库。
首先进入到自己的开发仓库，如下图
 点击上图的 New pull request，进入下图
  如上图，这里需要注意的是目的地和来源，和前面向主仓库提交合并申请不一样的是，这里是提交把主仓库的内容合并到自己的开发仓库的申请。
  然后同样是 code review 等操作即将内容合并到了自己的开发仓库，如下图</description>
    </item>
    
    <item>
      <title>在 Swift 项目中使用 Objc 的第三方库</title>
      <link>https://tourcoder.com/how-to-use-pods-written-in-objc-in-swift/</link>
      <pubDate>Tue, 16 Apr 2019 15:04:29 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-use-pods-written-in-objc-in-swift/</guid>
      <description>最近在用 Swift 写项目，发现其中用到的一些第三方库还是用 Objc 来写的，还好 Swift 中提供了很方便的引用 Objc 第三方库的办法。
安装第三方库 通过 cocoapods 直接安装，这个不用多说，可以看这篇文章
创建连接文件并让它生效 Apple 官方推荐通过 header file 进行桥连接，操作如下
  新建一个头文件 Bridging-Header.h
   在生成的头文件中引入第三方库
#ifndef Bridging_Header_h #define Bridging_Header_h #import &amp;quot;第三方类库.h&amp;quot; #endif /* Bridging_Header_h */   设置
进入 Xcode－&amp;gt;Target--&amp;gt;build settings，搜索 Objective-C Bridging-Header 选项卡，将前面增加的头文件 Bridging-Header.h 连同路径一起填入
   这样就完成了，不需要引入任何文件，直接在需要使用到该第三方库的地方直接使用即可。
其他情况 如果 Podfile 文件中使用了 use_frameworks!，则不需要创建连接，在需要使用该第三方库的文件的头部直接引入该类库 import 第三方类库，直接使用即可。</description>
    </item>
    
    <item>
      <title>G Suite 的设置贴士</title>
      <link>https://tourcoder.com/some-tips-for-gsuite/</link>
      <pubDate>Thu, 11 Apr 2019 13:38:14 +0000</pubDate>
      
      <guid>https://tourcoder.com/some-tips-for-gsuite/</guid>
      <description>Thomas Kurian 不愧是从 Oracle 过来的，没多久就给 Google Cloud 来了一波骚操作，作为一个资深用户，我对他的这波操作还是有异议的，比如 G Suite 取消了年度支付的折扣。
废话少说，本博文的重点是 G Suite 的一些设置贴士
  在注册的过程中，发现无法进入该怎么办？
这里的无法进入有多个原因，其中有个很直接的解决办法，直接访问 https://admin.google.com/setup/u/0/apps/verification，这个链接也可以做一些不太好的事情，这就不展开说了。
  DKIM 要不要设置，如何设置？
DKIM 一定要设置，设置的方式是进入 G Suite 后台，在菜单 Apps - G Suite - Gmail - Authenticate email，在选择你的域名，然后创建一个记录，建议这里选择 1024，创建完成后，去域名处进行相关的解析即可。同样，SPF 也应该是设置的。
  </description>
    </item>
    
    <item>
      <title>Office 365 中开启 dkim</title>
      <link>https://tourcoder.com/enable-dkim-on-office-365/</link>
      <pubDate>Mon, 01 Apr 2019 05:03:32 +0000</pubDate>
      
      <guid>https://tourcoder.com/enable-dkim-on-office-365/</guid>
      <description>邮局系统开启 DKIM 是一件必做的事情，什么是 dkim 就不解释了，主要说下它的效果，看下面两张图
  第一张是开启了 DKIM 的，第二张是没有开启 DKIM 的，开启了 dkim 发送和签名都是来自自己的域名，而没有开启的，发送是来自自己的域名，但签名是来自微软的。视觉上看着不爽不说，关键还暴露了注册 office 365 的二级域名等。如果像我这样，多个域名邮箱在同一个账户里，就更郁闷了，隐私泄露。
在 Office 365 中开启 dkim 的过程如下
首先在 office 365 管理员平台查看是否已经开启了 dkim
 如图所示，进入到管理员后台，选择 exchange
 然后选择界面中的 dkim 菜单
 选择域名，这里 tourcoder.com 是已经开启了 dkim，如果没有开启 dkim 的图如下
 只要点击 Enable 按钮即可，但很多时候，是没有 Enable 按钮的，是下图这么一个情况
 那么这个时候就需要用到 PowerShell 命令行来操作。
首先添加两个 CNAME 的记录
name:selector1._domainkey value:selector1-tourcoder-com._domainkey.tourcoder.onmicrosoft.com name:selector2._domainkey value:selector2-tourcoder-com._domainkey.tourcoder.onmicrosoft.com 然后在 Windows 系统中右键 PowerShell 选择管理员运行模式
第三步：输入下面的命令
Set-ExecutionPolicy RemoteSigned $UserCredential = Get-Credential $Session = New-PSSession -ConfigurationName Microsoft.</description>
    </item>
    
    <item>
      <title>在 NPMJS 上发布并维护包</title>
      <link>https://tourcoder.com/publish-and-update-package-on-npmjs/</link>
      <pubDate>Thu, 28 Mar 2019 04:44:57 +0000</pubDate>
      
      <guid>https://tourcoder.com/publish-and-update-package-on-npmjs/</guid>
      <description>做 nodejs 的开发基本都会用到 npm 都包，那么如何在 npmjs 上发布并维护一个包呢？
准备条件  一个 NPMJS 的账户  步骤   编写包
一个包应该至少包含三个文件，package.json，readme.md 和代码文件。虽然 readme.md 文件是非必需的，但一个清晰的文档文件能节省使用者很多事情，建议每一个发包者都应该写好 readme.md 文件。
  readme.md 文件：主要是关于这个包的说明及用法
  package.json 文件：通过 npm init 初始化得到，里面包含了一些必要的信息，得到的结构如下
  { &amp;quot;name&amp;quot;: &amp;quot;npmdemo&amp;quot;, &amp;quot;version&amp;quot;: &amp;quot;0.0.1&amp;quot;, &amp;quot;description&amp;quot;: &amp;quot;npmdemo&amp;quot;, &amp;quot;main&amp;quot;: &amp;quot;app.js&amp;quot;, &amp;quot;scripts&amp;quot;: { &amp;quot;test&amp;quot;: &amp;quot;echo \&amp;quot;Error: no test specified\&amp;quot; &amp;amp;&amp;amp; exit 1&amp;quot; }, &amp;quot;keywords&amp;quot;: [ &amp;quot;npm&amp;quot;, &amp;quot;demo&amp;quot; ], &amp;quot;author&amp;quot;: &amp;quot;tourcoder&amp;quot;, &amp;quot;license&amp;quot;: &amp;quot;ISC&amp;quot; }  代码文件，比如这里的 demo 代码如下，app.</description>
    </item>
    
    <item>
      <title>创建公有的 Cocoapods 库</title>
      <link>https://tourcoder.com/how-to-create-public-pods-on-cocoapods/</link>
      <pubDate>Tue, 26 Mar 2019 02:10:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-create-public-pods-on-cocoapods/</guid>
      <description>Cocoapods 是一个很棒的开发管理库，有时候为了方便，自己也会制作一些库上传到上面，这里分享下过程。
  首先注册 cocoapods
在终端中执行如下命令
pod trunk register hello@tourcoder.com &#39;tourcoder&#39; --verbose 这里的 hello@tourcoder.com 和 tourcoder 换成自己的，输入命令后，hello@tourcoder.com 会收到一封邮件，点击邮件里面的确认链接，即可得到下图
 注册成功，提醒你回到终端。
  查看信息
可以随时通过命令 pod trunk me 查看自己的信息以及发布的 pods
  pods 库文件的操作
因为这个库是要通过代码共享的方式出去的，所以需要一个共享代码的地方，Github 自然是首选，在 Github 中新建一个仓库，并克隆到本地。比如这里的仓库是 notifylabel
进入到本地仓库文件夹中，创建几个文件（夹），下面的文件（夹）都是必需的，这是一种精简的做法，如果不知道该怎么弄，也可以通过命令 pod lib create 项目名 来初始化一个。
  文件夹 notifylabel: 里面包含了 notifylabel 这个 pod 的所有代码
  LICENSE 文件
  README.md 文件
  notifylabel.podspec 文件：可以通过 pod spec create 文件名 来创建，创建完成后格式大致如下</description>
    </item>
    
    <item>
      <title>不翻墙下载 Google Drive 中的内容</title>
      <link>https://tourcoder.com/how-to-download-files-in-google-drive-without-vpn/</link>
      <pubDate>Mon, 25 Mar 2019 10:27:32 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-download-files-in-google-drive-without-vpn/</guid>
      <description>众所周知的原因，Google Drive 是无法正常访问的，那么要下载里面的内容就需要用到梯子，但当你的文件过大时候，如果梯子不稳定或者速度慢，基本是没有希望将里面的内容下载下来的。这时候可以考虑用跳板的方式来处理这个问题。
  一台 VPS
去买一台海外的 VPS，该 VPS 需要能够被正常访问
  Gdrive 项目
在该 VPS 上安装 Gdrive 这个项目文件，项目地址：https://github.com/gdrive-org/gdrive
我使用的是 linux 服务器，所以执行如下命令
wget -O /usr/bin/gdrive https://docs.google.com/uc?id=0B3X9GlR6EmbnQ0FtZmJJUXEyRTA&amp;amp;export=download chmod +x /usr/bin/gdrive 然后执行 gdrive about 会给出一个链接，将该链接复制到浏览器里，会得到一个 code，将该 code 粘贴到终端处，即可完成授权。
  操作命令
可以通过项目的地址看到各种命令，这里需要用到的命令有两个
  gdrive list：查看文件命令，可以查看文件及其对应的 id
  gdrive download &amp;lt;id&amp;gt;：下载对应的文件
    下载到本地
等文件下载到 VPS 后，就可以通过多种方式下载到自己的本地了。
  </description>
    </item>
    
    <item>
      <title>IFTTT 中的 bug</title>
      <link>https://tourcoder.com/a-bug-on-ifttt/</link>
      <pubDate>Mon, 25 Mar 2019 04:37:15 +0000</pubDate>
      
      <guid>https://tourcoder.com/a-bug-on-ifttt/</guid>
      <description>严格上说，这不是一个 bug，是一个功能缺失，具体复现步骤如下
  创建账户
登录 ifttt.com，注册一个账户，这里输入的 email 地址是 hello@tourcoder.com
  创建一个 Applet
按照下面截图的步骤创建一个 Applet，这里便于测试，this 部分用时间
 第一步
 第二步
 第三步
 第四步
 第五步
 第六步
 第七步
 第八步
 第九步
 第十步
当时间到时，hello@tourcoder.com 这个邮箱会收到该 applet 的邮件。
  更改 Applet
进入到之前创建的 Applet，然后更改该 Applet 的 email 地址为 opensource@tourcoder.com，
  等待时间到后，会发现邮件还是会发送到 hello@tourcoder.com 这个邮箱，而非更改后的邮箱 opensource@tourcoder.com
  更为严重的问题 如果更改了账户中的 email，如下图
 但当你再次创建新的 applet 的时候，email 地址还是 hello@tourcoder.com，这个问题就非常严重了
 关于这些问题，我提交过多次 issue 给 ifttt，但他们一直没有回复过，也罢。</description>
    </item>
    
    <item>
      <title>NPM 中 Module 安装后无法找到</title>
      <link>https://tourcoder.com/command-not-found-in-nodejs-npm/</link>
      <pubDate>Mon, 25 Mar 2019 03:51:38 +0000</pubDate>
      
      <guid>https://tourcoder.com/command-not-found-in-nodejs-npm/</guid>
      <description>在全局安装一些 npm 中的 module 文件后，执行该 module 会经常会出现 Command not found 的问题。
一般全局安装是安装在 /usr/local/lib/node_modules 这样的目录下的，可以通过 npm root 或者 npm root -g 查看当前返回目录是什么，如果返回的不是上面的目录，则运行 npm config set prefix /usr/local 来将目录设置成该地址，然后再次全局安装该 module 即可。
注意：在设置完后，建议再次用 npm root -g 命令查看下返回的目录地址是否正确。</description>
    </item>
    
    <item>
      <title>Git 服务器架设</title>
      <link>https://tourcoder.com/how-to-set-up-a-git-server/</link>
      <pubDate>Sun, 24 Mar 2019 12:15:13 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-set-up-a-git-server/</guid>
      <description>Git 现在基本都是开发团队的标配，网上也有大量的相关服务，比如 GitHub，但也可以自己架设一个简单实用的 Git 服务器。
准备  centOS 7.0  部署过程   更新系统
yum update -y &amp;amp;&amp;amp; yum upgrade -y   安装 git
yum install git -y 可以通过 git --version 查看安装后的版本，如果版本过低，可以升级，也可以源码方式安装
  创建管理 git 服务的用户
adduser git 增加一个用户 git
  初始化仓库
新建一个地址，并初始化一个仓库
cd ~ mkdir gitc cd gitc git init --bare demo.git 此时会有一个裸仓库，更改 owner 改成 git
chown -R git:git demo.git   禁用 shell 登录
因为安全因素，不应该让 git 用户登录 shell</description>
    </item>
    
    <item>
      <title>为什么我选择了 Fastmail</title>
      <link>https://tourcoder.com/why-i-choose-fastmail/</link>
      <pubDate>Sat, 23 Mar 2019 16:54:54 +0000</pubDate>
      
      <guid>https://tourcoder.com/why-i-choose-fastmail/</guid>
      <description>很早之前就说过我是一个 Email 的拥趸，市面上各种方式的 Email 我都尝试过，包括今天要说到的主角 Fastmail，上次并没有好好使用 Fastmail 的原因有两个。
  我深爱着 Gmail
  我尝试 Fastmail 那会，它还是用的非常奇葩的域名后缀 .fm，感觉贼不靠谱，就没有好好使用。
  但这次发生了一些事情，让我意识到我需要另外找一个邮局系统。
发生的事情   Google 封了我的账户，没有任何理由，即便到现在我给他们去了多封邮件说明情况，依旧是毫无回信。
  我有多个 Google 邮箱账户，毕竟用的是免费版的 Gmail，所以它扫描我的邮件，我认了。我还购买了商业版的 G Suite，但我发现在一些邮件内容中的链接，总是有小尾巴跟着，为此我还在 twitter 上和 G Suite 客服讨论过。
  Google 去年更改了一个使用条款，上次出这种条款的公司是 Evernote，后来 Evernote 就被用户基本抛弃，从独角兽阵营消失了。
  另外一点是很多用户不会注意到的，当用户登录主账户，然后用别名发一封邮件出去，收件人还是会看到该用户主账户的信息的。这不是一个 bug，但我觉得这是一个设计思路或设计方式的缺陷。
  我很讨厌现在 Google 账户体系的全系登录方式。我在手机上登录了 Gmail 账户后，它会自动帮我登录所有 Google 的服务，比如 YouTube，Google Drive 等等，我非常讨厌。
  我选择 Fastmail 的原因   我只想要一个纯粹一点的邮箱系统，专注专业，Fastmail 做到了。</description>
    </item>
    
    <item>
      <title>AWS ec2 实例连接的问题</title>
      <link>https://tourcoder.com/fix-trouble-connect-to-ec2-on-aws/</link>
      <pubDate>Mon, 18 Mar 2019 08:09:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/fix-trouble-connect-to-ec2-on-aws/</guid>
      <description>相信不少人被 aws ec2 连接的问题给折腾得够呛，每每看到 Permission denied (publickey,gssapi-keyex,gssapi-with-mic) 这句话，头都要大了。搜索了下，各种答案，但没有一个有效的。
这里提供一些解决的办法和思路，注意，不一定能够 100% 解决这个问题，要知道连 AWS 官方都没有一个靠谱的办法 :(
解决思路   查看你的用户名是否正确
AWS 中创建实例时，选择不同的系统他的用户名也会不一样，比如我常用的 centOS 系统，它的用户名是 centOS，ubuntu 系统是 ubuntu，Amazon Linux 系统是 ec2-user，debian 系统是 admin 或者 root，还有其他的系统用户名可以去 aws 搜索看看。
  权限问题
如果不是上面用户名错误，那么权限问题就占了很大的比例。权限问题分两个，一个是在本地，一个是在服务器端。
  本地
本地的 pem 文件，运行命令 chmod 400 key.pem 更改权限，然后再尝试是否连接得上。
  服务器端
服务器端 key 的权限问题，运行下面几个命令，注意，不同的服务器，这里的 username 会不一样，我是在 centos 上解决的，所以这里是 centos
chmod 600 /home/centos/.ssh/authorized_keys chmod 700 /home/centos/.ssh chmod 700 /home/centos 一般这里的权限设置后，问题就会解决，我自己就是这样解决的。
    pem 文件问题</description>
    </item>
    
    <item>
      <title>CentOS 7 上安装配置 postfix</title>
      <link>https://tourcoder.com/install-postfix-on-centos-7/</link>
      <pubDate>Fri, 15 Mar 2019 05:04:34 +0000</pubDate>
      
      <guid>https://tourcoder.com/install-postfix-on-centos-7/</guid>
      <description>最近被 Google 弄得贼闹心，加上邮件转发的需要，所以尝试用开源软件在 CentOS 7 上搭建了邮件服务。之前买过 exchange server，也用过 zimbra 都太臃肿，这次用 postfix 来搭建。
注意 这只是一个学习，非常不建议个人搭建邮局服务器，时间成本，维护成本等等非常不划算，邮局系统是非常复杂的。
准备条件   2GB/2CPUs 的 vps
  CentOS 7.5
因为域名是 tourcoder.com，所以先将 hostname 改成 mail.tourcoder.com，执行命令 hostnamectl set-hostname mail.tourcoder.com
  postfix
  域名 tourcoder.com
提前做好解析（1）创建 name 为 mail 的 A 记录到本 VPS 的 IP（2）创建 name 为 @ 的 mx 记录到 mail.tourcoder.com，优先级为 10（3）设置 SPF，记录为 v=spf1 a mx 123.123.123.123 ~all，这里的 ip 地址是服务器的 ip 地址，可以去掉
  概念 便于理解，这里我画了一张图</description>
    </item>
    
    <item>
      <title>我用了哪些 Google 的服务</title>
      <link>https://tourcoder.com/the-google-services-i-use/</link>
      <pubDate>Tue, 12 Mar 2019 16:50:57 +0000</pubDate>
      
      <guid>https://tourcoder.com/the-google-services-i-use/</guid>
      <description>发生了一件让我非常郁闷的事情，Google 停用了我的一个 Google 账户，让我损失惨重。重点是 Google 没有给我任何的理由，离我的申诉也过了快一周时间，还没有从 Google 那边得到反馈，甚感到失望，悉数整理了下在 Google 那边的服务和应用。
在用的服务或应用   Google Search
Google 搜索实在是无法被取代的东西，虽然有一个 Duckduckgo，但在中文搜索方面 duckduckgo 还是差太多了。
  Gmail
Gmail 是 Google 杀手级的产品，不过放弃也不是没有可能，同时增加了 Google 企业邮箱，即 Google Workspace。
  Adsense / Adwords / Admob
Adsense 和 Admob 是我从 Google 赚广告费的，Adwords 是我在 Google 投放广告的。
  Analytics / Firebase
一个是网站的分析，一个是移动应用的分析，短时间里是没有更好的东西来替代的。
  Youtube
除了自己看之外，还开设了一个频道，记录日常生活。
  Google Drive / Google Photos
主要用来备份照片的。
  已基本抛弃的服务或应用   Chrome</description>
    </item>
    
    <item>
      <title>macOS 下加密压缩</title>
      <link>https://tourcoder.com/encrypt-files-on-macos/</link>
      <pubDate>Tue, 12 Mar 2019 15:41:59 +0000</pubDate>
      
      <guid>https://tourcoder.com/encrypt-files-on-macos/</guid>
      <description>我买了商业版的 G Suite，有无限空间，正好我可以用它来存储照片，但我不想把自己照片放在 Google Photo 里面，只想压缩后放在 Google Drive 中，而单纯的压缩，还是容易被查看到的，所以在 macOS 下做一下加密压缩，就显得特别重要。
压缩过程 在终端中输入下面命令
zip -e zippedname.zip sourcefile.txt 执行该命令后，会要求输入密码，输入密码即可，注意是要输入两次密码的。如果是要压缩一个文件夹，则输入命令
zip -er zippedname.zip sourcefolder 后面是一样要求输入两次密码。
 解压过程 双击压缩后的文件，会要求输入密码，输入正确的密码即可解压成功。
 </description>
    </item>
    
    <item>
      <title>[持续更新] Firefox 下的插件</title>
      <link>https://tourcoder.com/add-ons-i-am-using-on-firefox/</link>
      <pubDate>Mon, 11 Mar 2019 02:41:09 +0000</pubDate>
      
      <guid>https://tourcoder.com/add-ons-i-am-using-on-firefox/</guid>
      <description>切换到 Firefox 下工作有很长一段时间了，除了速度有点慢，偶有一些样式问题外，其他一直都很好，我又成功摆脱了 Google 的一个服务。
Firefox 下也有丰富的插件，而我平常需要用到的插件一个都不缺。
  wappalyzer
这是一个看网站技术构成的插件
  GitHub Hovercard
  Github Repo Size
  Octotree
  Web Developer
  Greasemonkey
  Don&amp;rsquo;t track me Google
去掉 Google 搜索结果的追踪小尾巴
  </description>
    </item>
    
    <item>
      <title>我的数字账户</title>
      <link>https://tourcoder.com/about-my-digital-accounts/</link>
      <pubDate>Sat, 02 Mar 2019 14:41:24 +0000</pubDate>
      
      <guid>https://tourcoder.com/about-my-digital-accounts/</guid>
      <description>数字生活已经有很多年，一直没有好好整理过，但过年期间我好好的思考了下这些东西，然后做了下简单的整理。
Email 我是一个不折不扣的 Email 拥趸，之前有过很多个 Email 邮箱，经过这次的整理后只剩下四类邮箱，分别为私有不对外，私有对外，工作和常规垃圾。
  私有不对外
所谓私有不对外，基本没有人知道，主要是一些重要的信息以及和家人的邮件往来，这个邮箱极少收到邮件，主要是因为现在 IM 很发达。
  私有对外
这个邮箱我主要是用在个人的一些私有帐号上使用，比如我个人的社交账号等。
  工作邮箱
这个毋庸置疑，就是纯工作使用。
  常规垃圾
 平时我会订阅一些东西或者是临时测试一些东西，就会用到这类邮箱。这类邮件的特点是垃圾邮件特别多。    虽然上面有四类邮箱，但实际操作就两个邮箱，私有邮箱和工作邮箱，这里不得不提 G Suite 是个特别好的帮手。
支付账户 和自己相关的金融体系账户，我都用了一个特殊一点方式管理。
社交账户 很早的时候，自己开了很多个社交账户，随着年龄越来越大，越来越不想在社交网络上展示自己什么，现在也基本是去 twitter 和 youtube，而 instagram 等也基本不玩了。聊天方面，微信和 telegram 是我常用的。
开发帐户 作为一个开发人员，开发账户是一个很重要的东西，除了 Apple Developer, Chrome Store, Google Play 之外，还有一些云服务，比如 Google Cloud 等。
购物账户 在线购物是我经常做的事情，这类账户的特点是除了有你的地址，信用卡等信息外，他们也比较烦躁的喜欢给你发 EDM。
很有意思的是这些账户都可以通过 Email 来进行维护，所以 Email 的分类就显得很重要，这也是为什么我把 Email 放在第一位的原因，哈哈哈</description>
    </item>
    
    <item>
      <title>《从 0 到 1 》读后感</title>
      <link>https://tourcoder.com/zero-to-one/</link>
      <pubDate>Fri, 01 Mar 2019 14:27:34 +0000</pubDate>
      
      <guid>https://tourcoder.com/zero-to-one/</guid>
      <description>把《从 0 到 1》这本书又刷了一遍，正好今天刚看完，而今天对我来说也是个特别的日子，我的创业纪念日。
每次读这本书都有不同的感受，这次不想写什么感受，只分享一些我标注下来的笔记。笔记内容是我从 Kindle 里面导出来的做成了图片。
读后感@20190301
 </description>
    </item>
    
    <item>
      <title>我是怎么玩 Apple Watch 的</title>
      <link>https://tourcoder.com/how-do-i-use-apple-watch/</link>
      <pubDate>Sat, 23 Feb 2019 14:54:43 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-do-i-use-apple-watch/</guid>
      <description>在之前的文章「Apple Watch S4 使用体验」中我说过，现在的 Apple Watch 对我来说还是鸡肋一块。但这不代表 Apple Watch 没有可玩的地方。
 这是我手表的表盘，表盘名字是 Infograph Modular，我所设置的内容有日期，时间，心跳，运动，空气质量和电量。
  日期：日历和星期
  时间：一个本地时间，一个是纽约时间（工作沟通需要）
  心跳：我关注自身健康的一个重要因素
  运动：没有足够的时间运动，但还是设置了一些每日目标，尽量达到吧
  空气质量：空气质量是密切要关注的，尤其是我这种比较敏感的人
  电量：没电挺傻的
  除了上面的内容，我对 Apple Watch 的其他玩法主要有下面三个系列
  通知系列
各类的通知，比如 Message，Email 及 GTD 等各类通知，主要是省去了看手机的时间。
  检测管理系列
身体检测，运动检测，还有比较重要的睡眠检测。
  工具系列
空气质量，二次认证，翻译，听歌以及有时候用到的支付。
  一些特定设置
  唤醒：我关闭了抬手腕屏幕亮的功能，因为检测睡眠，我是戴手表睡觉的，每次翻身手表都会醒，我老婆会感受到光。
  声音通知：全部都调整成震动提醒。
  这基本是我现在使用 Apple Watch 的情况。
20191001更新</description>
    </item>
    
    <item>
      <title>iOS 应用动态更改图标</title>
      <link>https://tourcoder.com/change-app-icon-for-apps/</link>
      <pubDate>Thu, 21 Feb 2019 04:23:16 +0000</pubDate>
      
      <guid>https://tourcoder.com/change-app-icon-for-apps/</guid>
      <description>Apple 很早就已经将 iOS 应用动态更改图标的接口放了出来，只是信息比较零碎，文档看这里 https://developer.apple.com/documentation/uikit/uiapplication/2806818-setalternateiconname, 它对 SDK 的要求是 iOS 10.3+ / tvOS 10.2+。
恰好这次的项目的一个需求是要求动态更改图标，看了下文档，试着写了个 DEMO。
基本信息
  开发语言 objc
  SDK 版本 iOS SDK 12.1
  项目名称 ChangeIcon
  目标设备 iPhone（模拟器）
  新建项目，命名为 ChangeIcon，通过 Assets 中的 AppIcon 可以看出本次测试设备 iPhone 需要四个基础尺寸的 Icon，20 / 29 / 40 / 60 及其倍数。制作两套分别为 A / B。
 增加默认的 Icon，这里是 A。运行后的效果如下
 写代码，这里的布局就是两个按钮，分别切换，具体代码比较简单
 上面代码执行后，得到的如下的布局
 编辑 Info.plist 文件
Info.plist 文件增加 Icon files (iOS 5)，而不是 Icon files，这里比较重要，增加的内容如下</description>
    </item>
    
    <item>
      <title>CentOS 网络设置和桌面</title>
      <link>https://tourcoder.com/set-network-and-desktop-for-centos/</link>
      <pubDate>Wed, 20 Feb 2019 12:27:52 +0000</pubDate>
      
      <guid>https://tourcoder.com/set-network-and-desktop-for-centos/</guid>
      <description>如前一篇「Windows 10 安装 U 盘的制作」中说到，我制作了 CentOS 的安装 U 盘，制作过程如前面说的一样，不同的是把 Windows 10 的映像文件换成 CentOS 的文件，可以去 CentOS 的官方下载，下载地址：https://www.centos.org/download/
网络设置
在安装完 CentOS 后，发现无法上网，那是因为网络还没有设置
输入 nmcli d 即可看到网络是 disconnected 的状态，此时输入 nmtui 选择 Edit connection，然后再选择 Edit，让 IPv4 CONFIGURATION 设置为 Automatic，同时将 Automatically connect 勾选，然后确定。
最后重启网络 service network restart，在一会的等待后，CentOS 就可以上网了。
Gnome 桌面
 因为这台电脑是需要一个桌面的，所以我选择了个人觉得比较好的 Gnome
安装也很简单，输入 yum groupinstall &amp;quot;GNOME Desktop&amp;quot; 即可安装，然后输入 startx 即可启动桌面。</description>
    </item>
    
    <item>
      <title>Windows 10 安装 U 盘的制作</title>
      <link>https://tourcoder.com/make-an-install-disk-of-windows-10/</link>
      <pubDate>Wed, 20 Feb 2019 12:11:16 +0000</pubDate>
      
      <guid>https://tourcoder.com/make-an-install-disk-of-windows-10/</guid>
      <description>最近给一台 PC 安装 Windows 10 和 CentOS，顺手做了两张安装 U 盘，这里记录下过程。
  安装 rufus
rufus 这个软件不错，也有绿色版，直接去官网下载
  下载windows 10 光盘映像
去微软官方下载 Windows 10
  制作 u 盘
管理员模式运行 rufus，然后根据界面选择即可。
  在一段时间的等待后，一个 windows 10 的安装盘就完成了。
上面是在 windows 下制作安装 u 盘，如果你用的是 macOS，那么双击 windows 10 光盘映像，然后将里面的内容复制粘贴到 u 盘即可。</description>
    </item>
    
    <item>
      <title>2019 农历新年</title>
      <link>https://tourcoder.com/year-of-pig-2019/</link>
      <pubDate>Thu, 14 Feb 2019 08:17:22 +0000</pubDate>
      
      <guid>https://tourcoder.com/year-of-pig-2019/</guid>
      <description>时间过得非常快，去机场接岳父母来过年仿佛还在昨天，但今天已经是农历初十，上班已经三天。 今年是第一次和岳父母过了一个相对完整的新年，整个过程我录制了下来，并剪辑成一部五分钟不到的短片。
年夜饭
今年的年夜饭是完全按东北年夜饭的方式来做的，我们自己包的饺子，我岳父不知道是不是因为太紧张的缘故，饭菜都做得比较咸，是那种咸到让人怀疑人生的咸，以至于从初二开始，都是我做饭，哈哈哈。
春晚
看春晚应该成了我们的传统，不过春晚的确是越来越不好看了，找不到乐呵的点。
三部电影
  白蛇：缘起
王微是牛叉的，不管之前土豆网因为其婚姻等因素导致最后被“卖身”给优酷，王微的追光动画用几部动画证明了自己的牛叉，这部电影我给 8 分。
  流浪地球
这部片子很火，但口碑褒贬不一，中国的科幻片搬动地球走是个挺棒的 idea，另外就是吴孟达达叔在我印象中一直是一个谐星，但这次他的表演惊到我了，光是造型就已经很棒！放一张达叔的照片感受一下
   疯狂的外星人
纯粹的爆米花电影，外星人的突兀感还是很重的，看这部电影纯粹是过年想乐呵乐呵。
  几张罚单
我是真的不能够坐我老婆的车，她开车的特点是应急反应差，反应速度慢，考交规和实际开车是天壤之别。</description>
    </item>
    
    <item>
      <title>爸妈来过年</title>
      <link>https://tourcoder.com/happy-chinese-new-year-2019/</link>
      <pubDate>Tue, 12 Feb 2019 14:16:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/happy-chinese-new-year-2019/</guid>
      <description>2019 年，爸妈从东北来我们这边过年 :)
注意：本视频在 YouTube 上，你可能在某些地方无法观看该视频。</description>
    </item>
    
    <item>
      <title>CentOS 7 下签发 Let&#39;s Encrypt https 证书</title>
      <link>https://tourcoder.com/get-lets-encrypt-on-centos-7/</link>
      <pubDate>Sat, 09 Feb 2019 15:15:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/get-lets-encrypt-on-centos-7/</guid>
      <description>在当今网络世界，HTTPS 是必备的，但 SSL 证书买起来比较贵，多亏 Let&amp;rsquo;s Encrypt 提供了免费的证书，地址是：https://letsencrypt.org/ 希望大家可以去捐赠他们。
安装 Let&amp;rsquo;s Encrypt 有软件和手工申请两种方式，另外这里还可以通过服务商申请就不介绍了。我自己是自己写了个脚本程序来处理的，本文介绍的是一个开源的项目 Certbot。
通过 Certbot 客户端申请
  安装 epel 软件源
sudo yum install epel-release   安装 certbot 和 certbot 的 nginx 插件
yum install certbot-nginx   获取证书
certbot --nginx   基本到这里就完成了，不过这里有个问题就是如果你的 nginx 不是直接 yum install 安装，而是通过源码安装，则在最后一步会有问题，需要将地址指向 sbin/nginx。
也可以先配置 nginx 文件
server {	listen 80;	server_name domain.com;	root /usr/local/domain.com;	index index.html index.htm;	} 然后执行命令
certbot certonly --webroot -w /usr/local/domain.</description>
    </item>
    
    <item>
      <title>Telegram 的二次验证</title>
      <link>https://tourcoder.com/2-step-verification-on-telegram/</link>
      <pubDate>Fri, 01 Feb 2019 05:06:58 +0000</pubDate>
      
      <guid>https://tourcoder.com/2-step-verification-on-telegram/</guid>
      <description>做了一件特别蠢的事情，在不清醒的时候，给 Telegram 开启了二次验证，并且还没有设置 Email 地址，导致的结果是忘记密码的我，只能够在自己的手机上使用 Telegram。
Telegram 提供了两种方式解决这个问题
  想起密码
  重置账户
  一时半会肯定是想不起密码，只能通过重置账户，点击重置账户，它会提示你过去的聊天信息和数据将会丢失，输入收到的手机验证码后，会收到一条如下图的消息
 没错，Telegram 的重置账户就是删除你的账户，当然最后我还是取消了重置，因为很多数据，实在是不能够丢失，我还是尽量想出密码吧。</description>
    </item>
    
    <item>
      <title>GitHub Action Beta</title>
      <link>https://tourcoder.com/try-github-action/</link>
      <pubDate>Fri, 01 Feb 2019 04:53:21 +0000</pubDate>
      
      <guid>https://tourcoder.com/try-github-action/</guid>
      <description>收到了 GitHub 的邮件，邀请试用 GitHub Actions Beta
 废话少说，立刻开始，创建一个私有项目 testaction
 可以在项目顶部的菜单中看到 Actions，点它即可进入 Actions 的界面
 点 Create a new workflow，开启 Actions 之旅
 至于怎么写这些 workflow，可以查看官方文档，里面有清楚的说明</description>
    </item>
    
    <item>
      <title>域名的选择</title>
      <link>https://tourcoder.com/how-to-choose-a-domain/</link>
      <pubDate>Thu, 31 Jan 2019 12:39:21 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-choose-a-domain/</guid>
      <description>今天我收到这么一封邮件，内容如下
 每个商家都有自己的营销手段，这个我无能为力，但有些情况是完全可以避免的。
国别或地区性域名
上图中的域名是新加坡的域名，属于国别域名，注册这类国别域名的风险不只是来自域名注册商，还来自这个国家的域名政策，每个国家对本国域名的政策并不一样，有兴趣的可以搜索下以前发生过的 .cn 域名事件，所以谨慎注册国别或者地区域名，更不要将他们作为网站使用。
国际顶级域名
注册域名的首选，比较出名的后缀有 .com .net .org，不过因为时间久等因素，这类域名中长度较短的基本注册完了。
其他新的商业顶级域名
随便域名后缀开放申请，很多商业公司也申请了大量的域名，比如 google 就申请了 .app，.domain 等后缀，这类域名是由这些商业公司给把控，同样不是很建议注册。
总体来说，从安全等多个方面考虑，选择顺序是：国际域名 &amp;gt; 其他新的商业顶级域名 &amp;gt; 国别或地区性域名。</description>
    </item>
    
    <item>
      <title>VS Code 中的 Live Share</title>
      <link>https://tourcoder.com/a-guide-of-vscode-live-share/</link>
      <pubDate>Mon, 28 Jan 2019 02:33:31 +0000</pubDate>
      
      <guid>https://tourcoder.com/a-guide-of-vscode-live-share/</guid>
      <description>如果团队的程序员不在一个场所工作，分享编码的屏幕进行协同工作，就比较重要。VS Live Share 就是一个很不错的方案，这里用 VS Code 做演示。
 打开 VS Code，并安装对应的插件 VS Live Share
 安装完成后，重启 VS Code，然后点击 Live Share 的按钮，可以看到有几个选项
  加入一个合作
  开始一个合作
  开始一个只读的合作
  点开始合作，会弹出窗口要求输入帐号密码，有微软的账户和 GitHub 两个账户体系的选择，我这里使用了 GitHub 的帐号，输入后即可看到下面的界面
 记得在开始之前先打开你的工作目录，如果没有打开，VS Code 会提示你选择一个工作目录
 完成后复制上面的邀请链接可以邀请一位协作者加入，将邀请链接发送给协作者，他打开链接会看到如下的内容，会自动弹窗选择打开方式，这里需要协作者也安装了 VS Code 和 Live Share 的插件。
 当被邀请的协作者加入后，你会看到提醒，对方已经加入，如下图右下角
 而他会看到你整个 VS Code 的内容，并且会看到你的 VS Code 的所有操作，如下图
 当协作结束后，可以点击下图中的退出
 这就是整个 VS Live Share 的流程。</description>
    </item>
    
    <item>
      <title>各种美国电话号码的简单比较</title>
      <link>https://tourcoder.com/get-an-american-phone-number/</link>
      <pubDate>Sun, 27 Jan 2019 03:46:21 +0000</pubDate>
      
      <guid>https://tourcoder.com/get-an-american-phone-number/</guid>
      <description>为什么要办一个美国号码？因为出差，还因为二次验证方便，不过今天的重点不是原因，而是简单比较下美国号码的获取途径，以及简单说说它们之间的不同。
Google Voice ( Hangout / Google Fi ) 这几个是一定要放在一起说的，Google Voice 是 Google 几年前推出的 VoIP 的服务，每个 Google 账户都可以通过 Google Voice 申请一个美国号码（现在已经比较难申请了），它有几个特点
  虚拟号码
  该号码免费，尤其是拨打美国加拿大地区，不收取任何费用，接电话接短信都是免费的
  该号码可以一定程度的自由定制
  该号码可以接受短信
  需要网络支持，某些网络限制的地区无法使用
  Hangout 和 Google Fi 是基于 Google Voice 推出的服务，其中 Google Fi 可以有实体卡和 eSIM，资费比较贵，关于 Google Fi 的内容，可以看我之前写的一篇博文「Made in China 的 Google Fi 到了」，至于 Hangout，它就是一个应用。
别再单独申请 GV 了，我的一个帐号已经被 Google 回收，没有任何的理由的回收，申诉至今未有回复。
Skype Number Skype 一直是一个很棒的服务软件，直到它被微软收购后。它提供了 Skype Number 服务，可以选择全球很多地方的电话号码，美国的电话自然包含在里面，用 Skype 打电话时可以选择显示这个号码，别人拨打这个号码时，可以通过使用 Skype 来接。</description>
    </item>
    
    <item>
      <title>webpack 学习笔记</title>
      <link>https://tourcoder.com/webpack-manual/</link>
      <pubDate>Tue, 22 Jan 2019 06:00:55 +0000</pubDate>
      
      <guid>https://tourcoder.com/webpack-manual/</guid>
      <description>越来越多的 module 被放到了 npmjs.org 上，甚至一些 css 框架都被放在了上面，我本身认为 npmjs 上只是放 M 和 V 的东西，没想到 C 的东西也放在了上面。对 css 内容的调用，除了最直接的
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;node_modules/module_name/module.css&amp;quot;&amp;gt; 调用方式外，还有一种方式就是 webpack 打包。
新建一个文件夹，比如 temp，进入该文件夹，并初始化
cd temp npm init 在一顿回车后，该文件夹下会自动生成一个 package.json 的文件，执行命令
npm install --save-dev webpack 安装 webpack，此时 package.json 中也发生了变化。
{ &amp;quot;name&amp;quot;: &amp;quot;temp&amp;quot;, &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;, &amp;quot;description&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;main&amp;quot;: &amp;quot;index.js&amp;quot;, &amp;quot;scripts&amp;quot;: { &amp;quot;test&amp;quot;: &amp;quot;echo \&amp;quot;Error: no test specified\&amp;quot; &amp;amp;&amp;amp; exit 1&amp;quot; }, &amp;quot;author&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;license&amp;quot;: &amp;quot;ISC&amp;quot;, &amp;quot;devDependencies&amp;quot;: { &amp;quot;webpack&amp;quot;: &amp;quot;^4.29.0&amp;quot; } } 在当前文件夹下新建两个文件夹</description>
    </item>
    
    <item>
      <title>Apple Watch S4 使用体验</title>
      <link>https://tourcoder.com/apple-watch-s4/</link>
      <pubDate>Tue, 22 Jan 2019 03:53:51 +0000</pubDate>
      
      <guid>https://tourcoder.com/apple-watch-s4/</guid>
      <description>买了 Apple Watch S4，并使用了一段时间，感受只有两个字 &amp;ndash; 鸡肋，“也许”只是对我这类生活方式的人来说是鸡肋。
我是一个程序员，大部分时间，手机和电脑都不离身，所以蜂窝基本没有发挥作用的时候。唯一一次下楼遛狗，手机在家充电，我媳妇给我打电话，直接把她吓尿了。原因是她打我电话，发现我手机在家响，但电话那头我又接通了电话（我用 Apple Watch 接的），可以想象第一次遇到这个情况的她内心多恐惧。
屏幕变大了，是我这次购买的一个很重要的点，但怎么说呢，感觉是比之前的小屏好了些，但也没有到多么惊艳的程度。
因为我基本就是看下时间，有些电话的通知，没有其他更为耗电的应用，所以基本是两天充一次电。正值上海现在是冬天，我做了几次实验，充满电后或者还余留一些电量的时候，将它放在书房的桌子上，一夜下来，掉电挺快，达到 20% 左右，如果是戴在手上或者下面垫个垫子之类的，掉电在 13% 左右。
它的防水功能我觉得还是挺强悍的，做饭洗菜什么的，我都能戴着不用摘下来，甚至在海里面划船，游泳我都戴着，没有出现什么问题，遇水比较多的时候，记得开启锁水功能。
睡眠监测，很可惜，这需要借助第三方的应用，更可惜的是目前第三方的主动监测，不能被动监测，这个很郁闷。我应该会做一个这方面的应用。
我平时用的是另外一个地铁公司出的应用，所以还没有体验过 Apple watch 的交通卡功能，如果说得没错的话，就是 Apple 钱包的 NFC 吧。
摔倒功能，谁能告诉我该怎么摔倒，才会开启这个功能呢？我试了很多中摔倒方式，没反应啊。
比较糟糕的两点
  抬手就亮，如果戴着它睡觉，晚上睡觉翻身，屏幕就会亮起来。
  短信功能，这个功能一定是 watchOS 团队一辈子的耻辱，Apple watch 上的短信应用会同步手机上的短信应用的内容，这点没问题，问题是 Apple watch 上的短信内容，必须要手动一个一个删除，没有批量删除，想象一下，现在垃圾短信横飞的时代，这得多么绝望。哪怕是手机上删除了，watch 同步下手机也行啊，但没有，只能自己一条一条的手动删除！！！我给他们提交了这个问题，至今未有解答。希望他们不要在 2019 年，把手表端的短信批量删除作为炫耀 watchOS 的 feature 推出来，那就太恶心了。
  这会就写这么多，以后遇到其他情况的时候，再陆续补充。</description>
    </item>
    
    <item>
      <title>iTerm 学习笔记</title>
      <link>https://tourcoder.com/iterm-manual/</link>
      <pubDate>Sat, 19 Jan 2019 13:20:45 +0000</pubDate>
      
      <guid>https://tourcoder.com/iterm-manual/</guid>
      <description>2019 年在工作学习方面有几个 flag，其中一个就是全面掌握 vi/vim，而 iTerm 是很好的 vi/vim 学习工具。
也许有人要问，iTerm 不就是一个命令行工具么，怎么就成了 vi/vim 的学习工具了呢？用 Terminal 不是一样么？主要是它的一些特点，比如分屏。
iTerm 的下载 目前 iTerm 3 还不是稳定版本，我选择了稳定版的 iTerm 2，下载地址 iTerm 2 Download。
iTerm 配置 安装 ohmyzsh，具体安装，可以看我以前写的这篇文章，这里推荐一个皮肤 powerlevel9k
在 iTerm 2 下当用 vim 来编辑的时候，会出现中文乱码的情况，输入命令 vim ~/.vimrc，编辑这个文件（不管是否存在），加入下面的内容
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936 set termencoding=utf-8 set encoding=utf-8 ZSH 的乱码编辑 ~/.zshrc 文件，在文件里加入
export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 最后 source 一下即可解决中文乱码问题。
到这里 iTerm 就弄好了。
一些常用快捷键   cmd + d 垂直分屏
  cmd + shift + d 水平分屏</description>
    </item>
    
    <item>
      <title>Redis 学习笔记</title>
      <link>https://tourcoder.com/redis-manual/</link>
      <pubDate>Fri, 11 Jan 2019 03:51:15 +0000</pubDate>
      
      <guid>https://tourcoder.com/redis-manual/</guid>
      <description>Redis 可以理解为缓存数据库
macOS 安装 Redis 有多种安装方式
  手动安装
进入到 redis 官网，找到下载到源文件(最好使用稳定版)，然后执行命令即可，我当前看到的稳定版本是 5.0.3
wget http://download.redis.io/releases/redis-5.0.3.tar.gz tar -zvxf redis-5.0.3.tar.gz mv redis-5.0.3 redis cd redis make make install   macOS 下 Homebrew 安装
Homebrew 的介绍看这里，在终端中输入
brew install redis 即可完成安装，安装的位置
/usr/local/bin //命令工具 /usr/local/etc //redis.conf 所在   启动 可以通过命令 ps aux | grep redis 查看 redis 服务是否已经启动。
  Homebrew 启动
brew services start redis 即可在后台运行 redis 服务。
  手动启动
/usr/local/bin/redis-server /usr/local/etc/redis.</description>
    </item>
    
    <item>
      <title>如何使用 App Store 美国区</title>
      <link>https://tourcoder.com/how-to-download-apps-on-appstore-us/</link>
      <pubDate>Tue, 08 Jan 2019 04:14:31 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-download-apps-on-appstore-us/</guid>
      <description>App Store 美国区一直是 App Store 中应用最全，质量最高的区，虽然也有刷榜等因素，但好过其他地区的泛滥。
需要一个美国区的帐号 以前美国区的帐号很好注册，将 AppStore 切换到美国区，然后找一个免费的应用，下载它，填写一些资料即可。但现在需要你提供支付方式，其实这个也可以用一些方式绕过，比如让 AppStore 科学上网，网上搜索看看，很容易找到，这里我就不介绍了，还可以通过下面提到的 iTunes Gift Card 来注册或者切换到美国区。
下载收费应用 除了免费应用外，有时候需要下载一些收费的应用，Apple 自己就提供了一个很好的方式 iTunes Gift Card。以前我都是在某宝上买的，也曾遇到过黑卡的问题，导致自己的帐号被封过。幸好现在 Apple 自己也推出了一个友好的购买渠道 App Store &amp;amp; iTunes Gift Cards by Email 直接通过 Email 来购买，简直不要太方便。
买完后，打开你的 iTunes，比如我这里打开 macOS 中的 iTunes
 点击图中红色标注的 Redeem，按步骤进行下去即可。
在 iPhone 中，打开 AppStore，然后点击右上角的头像，进入下面这个界面
 点击红色圈起来的部分，则进入下面的界面
 点击下面红色圈起来的，输入你收到的邮件中的号码即可。
最后，欢迎来到 AppStore 美国区！
购买了应用后，如需要退款，登录 https://reportaproblem.apple.com/ ，请求即可。</description>
    </item>
    
    <item>
      <title>一张表格看懂 profile,bashrc,bash_profile 的区别</title>
      <link>https://tourcoder.com/about-profile-bash-profile-and-bashrc/</link>
      <pubDate>Sat, 05 Jan 2019 07:58:19 +0000</pubDate>
      
      <guid>https://tourcoder.com/about-profile-bash-profile-and-bashrc/</guid>
      <description>在 Linux/macOS 系统中，经常会使用到 profile，bash-profile 和 bashrc，那么他们具体表达的意思是什么呢？通过一张表格可以看出来
   名称 位置 作用及作用域     profile /etc/profile 用于设置系统级的环境变量和启动程序，在这个文件下配置会对所有用户生效。当用户登录时，文件会被执行，并从 /etc/profile.d 目录的配置文件中查找 shell 设置。   bashrc 系统级位于/etc/bashrc、用户级位于 ~/.bashrc bashrc 文件只会对指定的 shell 类型起作用，bashrc 只会被 bash shell 调用   bash_profile ~/.bash_profile 只是针对某一个用户的设置，当该用户登录时，文件会被执行    其中，在 profile 中增加环境变量时，通过 export 方式，比如 export HOST=tourcoder.com; 表示将 HOST 改成 tourcoder.com，如果是多个变量值，用 : 分割，形如 变量名=变量1:变量2;
当添加完变量后，需要生效，可以重启电脑生效，但也可以强制生效，执行命令
source /etc/profile 查看是否生效，可以用命令 echo $变量名 来查看。</description>
    </item>
    
    <item>
      <title>A tip in Markdown</title>
      <link>https://tourcoder.com/a-tip-in-markdow/</link>
      <pubDate>Fri, 04 Jan 2019 05:41:15 +0000</pubDate>
      
      <guid>https://tourcoder.com/a-tip-in-markdow/</guid>
      <description>在 Markdown 文档中在反引号里使用反引号，如 control+`
错误的格式
`control+`` 正确的格式
`` control+` `` 外面用两个反引号，并不需要转义符</description>
    </item>
    
    <item>
      <title>Goodbye 2018</title>
      <link>https://tourcoder.com/goodbye-2018/</link>
      <pubDate>Sun, 30 Dec 2018 15:56:26 +0000</pubDate>
      
      <guid>https://tourcoder.com/goodbye-2018/</guid>
      <description>在 2018 年的倒数第二天，上海飘起了雪，多少年没有在上海见过雪了啊，借着着瑞雪，总结下自己的 2018！
写代码 这是我的本质工作，从 2018 年 3 月 1 日起，坚持每天写代码，一直到今天未断。
 可惜从这天开始，我已经把代码管理从 github 转移到自己开发的私有库中心，小绿块再见咯。
写博客 2018 年一共写了 45 篇中文博客，17 篇英文博客。主要还是以中文博客为主，本博客的访客流量稳步提升。
写 vlog 拍了照片和视频素材过万张，但只剪辑了三个视频，主要是 11 月份才开 YouTube 频道，目前还在学习阶段。
写邮件 今年一共收到了 12 万多封邮件，包含工作、私人及订阅的社区邮件，处理了 5 万多封，现在练就了我回话极短，很有效果的邮件风格。
写歌 喜欢上了 hiphop，写了两首歌，一首在结婚纪念日送给我老婆的礼物，记录我们几年的婚姻生活的歌；一首是《菜小孩》，是送给总说我打游戏菜的老婆和小姨子的，她们才是打游戏界的菜鸡。
读书 今年读了七本书，三本还是旧书再读，偷懒，没怎么写读书笔记。
 买的纸张书不多，很多还是我老婆买的，我买的是电子书居多。</description>
    </item>
    
    <item>
      <title>年底了，注意安全</title>
      <link>https://tourcoder.com/keep-you-safe/</link>
      <pubDate>Sat, 29 Dec 2018 05:48:11 +0000</pubDate>
      
      <guid>https://tourcoder.com/keep-you-safe/</guid>
      <description>毫不夸张的说，早上差点就被随机犯罪了，而且是在上海这个治安非常好的地方，还是白天。所谓随机犯罪就是被害人是随机的。
我从某一站上车，可能明天要元旦放假的缘故，我所在的这节地铁上也就是十几个人，然后我就一直感觉，和我一样站着的一个人在盯着我，没当回事。到站后，下车。
他跟着我下了车，而且很明显的跟在我后面，距离也就是一步的样子。我当时有点兴奋，也有点紧张，兴奋的是我可以活动下筋骨了，紧张的是万一我判断失误。
脑子一转，我立刻以夸张的蛇形路线走路，就是大 S 行径的路线走路，而跟着我的人居然也是和我一样的路线，我向左他也向左，我向右他也向右，然后我猛的停下来，他居然没有撞上我，脚步也停了下来。
要知道他和我的距离也就是一步的样子，我突然停下来，如果不是小心翼翼跟着我，他肯定会撞上我，但他却没有撞上我，说明他一直在小心翼翼，我的直觉告诉我判断对了，我立刻转过身去，盯着他看，这时我明显看到他的惊慌，那种他没想到我会停下来盯着他的惊慌。
这时我看清楚了他的样子，穿着一件和这个季节不符合的单薄套头衫，头和脸藏在套头衫的帽子里，一条很脏的裤子，还有一双很脏的鞋。
他愣了一会后，从我身边走了过去，这时我掏出手机，拍了一段他的视频，我想干的事情就变得简单，如果他不在我之前出站，而是在站里晃悠等着我出站，当我出站了，他还是跟着我，我就先干他，然后我报警，我也有视频证据。
事实被我猜中了，他走在我前面，我站着不动，但他果然就在那里晃悠不出站，这些都被我拍到视频里了，然后我出站，他跟着我从同一个口出站，我转身问他，你在跟着我吗？他没说话，低头走了。
写下这段经历主要是提醒下大家，年底了，注意安全。</description>
    </item>
    
    <item>
      <title>几十张图给你一份我的 macOS 基本设置</title>
      <link>https://tourcoder.com/all-configured-on-my-mac/</link>
      <pubDate>Thu, 27 Dec 2018 05:58:58 +0000</pubDate>
      
      <guid>https://tourcoder.com/all-configured-on-my-mac/</guid>
      <description>年岁大了，记忆力不如当年，设置个电脑都忘东忘西，索性将自己电脑的基础设置截图写份博文。至于如何安装 macOS，可以去这里搜索。
macOS 的基础设置，基本都是在系统设置中完成的，点击左上角的 Apple 图标，选择系统设置
 考虑到我使用的是英文系统（为什么使用英文系统？因为我迷信！），我每一步都按顺序来，即便不做设置的界面内容，我都截图或会做相关的说明
 一般设置：我喜欢黑色，所以选择了 Dark 主题，默认浏览器，我选择了 firefox，其他内容没有什么特别的
 壁纸：以前我很喜欢做一些特色的壁纸，现在都选择自带的壁纸，如果你想把自己的壁纸和默认壁纸放在一起，在桌面按 shift+command+g 键，在弹出的窗口输入 /Library/Desktop Pictures，将壁纸放入到里面即可。
 屏保：使用了 Fliqlo 的脚本，相信我，保证高端大气上档次。
 Dock：因为 alfred 的存在，Dock 在我这里的存在感很低，我把它放在了屏幕中最不妨碍我使用的左侧区
 这个功能以前挺好用，现在我基本都不使用，一切都是默认设置
 语言和地区：因为我迷信系统在英文环境下消耗最低和执行效率最高，所以我使用的系统都是默认使用英文，这个迷信的根源是 2005 年我高中同学从国外带了一个 Ubuntu 5.04 的光盘给我。
    安全和隐私：没有什么特殊的设置，反正要求就是自己离开电脑就需要登录密码，时间长短按自己的情况来。另外 App 来源还可以开启允许任何来源，以前该选项是默认的，现在被移除了，可以通过命令行来实现，在终端中输入 sudo spctl --master-disable 即可。
 Spotlight：又一个 Alfred 的牺牲品，我不用，也可能不用，所以并不知道它是否足够好。
 通知中心：虽然 macOS 的通知中心设计的不错，但是我还是无情的关闭了所有的通知，我喜欢主动查看，并不喜欢被通知做事情。
 显示器：默认设置，外接显示器的时候也是默认设置
 省电模式：经常忘了带充电设备，所以省电很重要，最近不知道怎么回事，我的电池总是提示有问题。
   键盘设置：输入语言增加了简体中文和繁体中文，快捷键使用了 control + space，从 Windows 带来的习惯，十几年了没改过。需要注意，这个快捷键和 spotlight 是冲突的，因为我不用 spotlight，自然是关闭了它的快捷键。</description>
    </item>
    
    <item>
      <title>如何停止使用 macOS 的测试版</title>
      <link>https://tourcoder.com/how-to-stop-using-beta-plan-of-macos/</link>
      <pubDate>Thu, 27 Dec 2018 03:20:49 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-stop-using-beta-plan-of-macos/</guid>
      <description>Teddy 之前尝鲜 Mojave，导致自己的系统一直是测试版，一早他问我怎么从测试版变成正式稳定版，他不想重装系统，随告诉他步骤
  进入到系统设置中
   选择软件更新
   点击左侧的详情，在弹出的窗口中点击恢复
   完成后，可以看左边已经取消了测试版资格，done
   </description>
    </item>
    
    <item>
      <title>Issue 驱动的项目管理</title>
      <link>https://tourcoder.com/issue-driven-project-management/</link>
      <pubDate>Wed, 26 Dec 2018 15:43:13 +0000</pubDate>
      
      <guid>https://tourcoder.com/issue-driven-project-management/</guid>
      <description>今天基本耗了一天时间在安装系统，主要是安装过程中遇到了一个安全问题，然后就在那边研究这个问题，具体我的 twitter 上有说明，这里就不展开说了。
言归正传，在安装系统的等待中，我整理了下以前做项目管理中开发部分的资料，觉得可以分享下。这种方法将它称为：Issue 驱动。
  什么是 Issue
Issue 是 GitHub 代码仓库中的一个功能，方便大家提交错误信息等
  怎么用 Issue
所有的项目相关的内容都会在 Issue 中，结合 GTD 思想将 Issue 分为六个标签，分别为 feature, bug, processing, done, pass, abnormail
   feature
所有的需求内容都应该打上 feature 这个标签
  bug
发现 bug，提交 Issue 必须打上 bug 这个标签
  processing
当某一 Issue 有人负责处理时，处理人员应该将该 Issue 打上 processing 标签
  done
当某一 Issue 处理完成时，处理人员应该将该 Issue 打上 done 标签。需要注意的是，该 Issue 必须要严格测试通过后才可以被打上该标签
  pass</description>
    </item>
    
    <item>
      <title>终端的代理</title>
      <link>https://tourcoder.com/proxychains-and-terminal/</link>
      <pubDate>Mon, 24 Dec 2018 14:28:31 +0000</pubDate>
      
      <guid>https://tourcoder.com/proxychains-and-terminal/</guid>
      <description>作为一个命令行爱好者，终端 (Terminal) 的使用尤其频繁，这就难免有时候需要用到代理的时候
  SS
这个就不用我多说了
  ProxyChains
因为我用的是 macOS，所以可以直接通过 Homebrew 命令直接安装，Homebrew 是什么？可以看这里，在终端中输入命令
brew install proxychains-ng 安装完成后，默认配置文件在 /usr/local/etc/proxychains.conf，可以将文件放到 ~/.proxychains.conf
strict_chain proxy_dns remote_dns_subnet 224 tcp_read_time_out 15000 tcp_connect_time_out 8000 localnet 127.0.0.0/255.0.0.0 quiet_mode [ProxyList] socks5 127.0.0.1 1086 在 ~/.zshrc 里设置个 alias
alias proxychain=&amp;quot;proxychains4 -f ~/.proxychains.conf&amp;quot; 然后执行 source ~/.zshrc 重新加载配置，这样在终端中使用 proxychain command 可以访问一些有网络障碍的服务了。
有兴趣的，可以去 ProxyChains-NG 官网看看，也可以通过手工编译安装实现。
  </description>
    </item>
    
    <item>
      <title>Made in China 的 Google Fi 到了</title>
      <link>https://tourcoder.com/try-google-fi/</link>
      <pubDate>Sat, 22 Dec 2018 03:42:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/try-google-fi/</guid>
      <description>开始之前 2020.11.01 重点更新
 我和客服的对话，客服说如果用户第一次在非美国地区激活了 Google Fi, 也没有用。如果不在乎，那可以继续看下去。
需要注意的是，Google Fi 只是免费送达美国地址，需要使用转运服务才能将卡运回国内，我就被转运公司多次涨价。另外之前给别人推荐，我这里还剩余一些，如果你有需要，可以联系我的邮箱，分摊运费了。 已经没有了，请自行找转运。
正文开始 在转运公司多次涨价后，一早拿到了 Google Fi 的 SIM 卡，包装很是 Google 风
 不过挺有意思的，包装的背面清楚的写着 Made in China
 不得不说，中国制造是真的牛，里面的东西是这样的
 一张 SIM 卡，一个取卡针，一个 iPhone 设置说明卡。
获取 Google Fi Google Fi 的卡是免费的，可以通过我的邀请链接 http://fi.tourcoder.com 获取，通过这个邀请链接，你可以获得 $20，因为通过我链接被邀请的人太多了，我已经无法得到奖励。
激活 相比较之前的需要指定手机激活，Google Fi 从上个月改名后支持的手机很多了，包含 iPhone。我是在一加手机上激活的，激活步骤如下
  先连接 Wifi，网络访问比较“差”的地方，请用梯子
  下载 Fi app，下载地址 https://fi.google.com/app
  打开 Fi app，按步骤操作即可完成
   注意点   需要开启手机端的数据漫游（如果你不在美国，这个很重要）</description>
    </item>
    
    <item>
      <title>泰国九日</title>
      <link>https://tourcoder.com/nine-days-in-thailand/</link>
      <pubDate>Sat, 15 Dec 2018 10:17:43 +0000</pubDate>
      
      <guid>https://tourcoder.com/nine-days-in-thailand/</guid>
      <description>本文配有视频在 Youtube 上，点击观看
去了趟泰国，说说这次的行程，算上来回的飞行，一共是九天时间。这次一共去了两个地方&amp;ndash;普吉岛和曼谷，其中普吉岛五天，曼谷四天，泰国所在时区是 UTC+7。
第一天
经历了四个多小时的飞行，飞机于当地时间晚上八点多到了普吉岛，当时没有什么感觉。但当坐在来接的车子上，一路上看到外面没什么灯光，大农村的样子，心里还是有点担心的。
这次我俩所住的酒店房间是一个独栋的小别墅，在海边的半山腰。因为到酒店的时候太晚，酒店厨房都要下班了，不过还是享受了在泰国本土的泰国菜，是我在泰国的第一餐。
第二天
中午十二点多，和我老婆开始普吉岛景点打卡的驾车环岛游。路线是 Phuket Town old street - Rawai seafood market - Phuket big Buddha - Karon Viewpoint - Promthep Cape - Patong OTOP night market。
因为我老婆的一些情况，我们取消了所有的寺庙行程。
下面一张照片是我一早在我老婆睡时，吃完早餐后，躺在泳池边用 iPhone 7 拍的，非常漂亮，没有修图。
第三天
出海斯米兰，也许是前一天景点打卡太累了，加上晚上睡得晚，所以一早五点半车子来接我们去码头的时候，我累极了，三个小时的车程到了码头，然后又是一个多小时的快艇，终于到了斯米兰的八号岛，景色真的漂亮，太漂亮了，我终于见到了 macOS 系统中的那张壁纸所展示的海滩。后来还去了四号岛那边深浮潜，可惜我老婆不能下水，哈哈哈。
第四天
上午的时候，在酒店的私人海滩教我老婆划皮划艇，下午换到了离卡塔海滩比较近的一个网红酒店&amp;ndash;萨瓦斯德，据说很多人在这酒店夜里睡觉都会做噩梦，尤其是别墅区，但我俩没做噩梦。
晚上去卡塔海滩，后来下雨了，我们跑进一家路边小店躲雨，当时台上的歌手在唱 Beyond 的歌，我还特地请他唱了一首《海阔天空》。
第五天
今天一天都是属于沙滩的，花了 20 元租了个沙滩椅躺了一天，期间还在海里游了一会。
发生一件搞笑的事情，当我埋在沙子里的时候，一个二货当地小贩，跑到我面前来，给我念经😂
在酒店里教我老婆游泳，把她从一个下水就狂喊狂叫的，教成了能在水下不用游泳圈扑腾的。
第六天
一点多的时候，车子来接去曼谷，印象比较深刻的事情有两件
  可能因为跑道短的缘故，他们的飞行员在飞机刚拐弯后就立刻起飞，没有停歇时间
  遇到小两口蜜月带着岳父母的一家，那个女婿好像外人一样，好可怜。登机口换了，他们都没有注意，出于大家都是中国人，我好心的跑过去告诉他们，飞机登机口已经换了，让他们快去登机。
  第七天
想象一下，天气暴热，一个 200 多斤的胖子，穿着人字拖，就在商圈的各个商场陪我老婆逛。虽然走了 23 公里不到，但基本逛了一天，还提了很多买的东西，那叫一个累啊。也是因为这一天，我估计我已经被激发了高血压。
第八天</description>
    </item>
    
    <item>
      <title>将博客程序换回了 Ghost</title>
      <link>https://tourcoder.com/back-to-ghost-and-find-a-bug/</link>
      <pubDate>Mon, 26 Nov 2018 14:12:23 +0000</pubDate>
      
      <guid>https://tourcoder.com/back-to-ghost-and-find-a-bug/</guid>
      <description>如前面所说，我的博客在 Github Pages 上架设了一段时间，随着我在 Github 的私有库到期，我不计划续费，架设在 Github Pages 上的博客自然要迁出。其实不用迁出用公开库也行的，只是我不愿意让自己的博客在公开库中。
图省事，直接买了 aws，用 Ghost，之前我的文章中也介绍过如何安装，有兴趣的可以去翻翻，不过不喜欢折腾的人，我建议用官方最新的方式，具体的查看他们的官方账户 Ghost，按照一贯的作风，我还是会折腾一下，将 PWA 功能增加进去。
另外刚使用，就发现了他们的 bug，具体看这里的视频 bug in ghost
Reproduce OS: macOS Mojave 10.14.2 Beta (18C48a)
Browser: Firefox 63.0.3 (64) / Safari 12.0.2 (14606.3.4)
Ghost-CLI version: 1.9.8
Ghost version: development
Server OS: centOS 7
Installed ghost with command ghost install local, and new story, and you will get this bug.</description>
    </item>
    
    <item>
      <title>本博客升级到 PWA，附升级教程</title>
      <link>https://tourcoder.com/upgrade-to-pwa/</link>
      <pubDate>Tue, 20 Nov 2018 07:50:32 +0000</pubDate>
      
      <guid>https://tourcoder.com/upgrade-to-pwa/</guid>
      <description>昨晚将本博客升级到了 PWA，现在用安卓手机访问本博客，都会有「添加到桌面」的提示，按提示操作，你会得到一个本博客的 webapp 安装在你的手机里。
PWA 是什么？
PWA 全称 Progressive Web Apps，是 Google 几年前提出的技术，我在之前的文章中也有说明，关于更多的 PWA 说明，可以查看官网
本博客所用技术
本博客搭建在 GitHub Pages 上，博客生成器是 Jekyll，主题是基于 hyde 二次开发而成，因为 hyde 在最新的 Jekyll 上有问题。 升级过程
整个过程比较简单，主要是处理几个地方
 头文件 增加相关的 meta 和 link，你可以右键看我博客的源码，对比下就知道需要增加哪些内容了。 读取 ServiceWorker 文件  &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt; if (&#39;serviceWorker&#39; in navigator) { navigator.serviceWorker.register(&amp;quot;/sw.js&amp;quot;); } &amp;lt;/script&amp;gt;  Service Worker Serviceworker 文件是 PWA 的核心，使用 Hyde 主题的可以看这里， Jon 提供了一个很不错的 DEMO。  Lighthouse 测试
下载 Chrome 上一个插件 Lighthouse，然后对它测试，我的测试结果如下
 然后根据每项进行优化即可，下图是我优化后的结果</description>
    </item>
    
    <item>
      <title>一次性下载 Google 上所有的内容</title>
      <link>https://tourcoder.com/takeout-your-storage-in-google/</link>
      <pubDate>Mon, 19 Nov 2018 07:49:42 +0000</pubDate>
      
      <guid>https://tourcoder.com/takeout-your-storage-in-google/</guid>
      <description>我拍摄的照片和视频是一直保存在 Google Photo 里面，差不多有 200 多个 G 的内容，保存在十几个 Google 账号里面 :(
为了方便，本周末我升级了存储容量，现在这些已经被 Google 改名为 Google One。需要注意的是如果你是个人版，即你的邮箱是 gmail.com 结尾的，你可以在上面的 One 链接直接更改，如果是你 G Suite，你可以通过更改 Google Drive 容量来实现扩容。
言归正传，以前的一般做法是进入到 photo 的 web 站点，一张一张的下载照片，或者进入到 Google Drive 下载照片，非常麻烦，而且常常会因为网络的问题出错，更好的做法是
  访问 Google Takeout；
  在页面上你可以看到你要下载的内容，选择你要下载的内容，点击下一步；
  选择你需要的压缩格式，文件大小及方式，点击封存档案；
  等待完成，如果你上面选择了邮件通知，在完成后，你会收到一封邮件通知，点里面的链接就可以直接下载了。
  是不是很简单？当然，你也可以通过 https://takeout.google.com/settings/takeout/downloads 这个链接随时查看进度情况，这个压缩进度视你的内容多少而定，我压缩的比较多，所以等待时间比较长，在等待的过程中，你可以关掉网页。</description>
    </item>
    
    <item>
      <title>用 ElectronJS 开发应用</title>
      <link>https://tourcoder.com/make-an-app-by-using-electronjs/</link>
      <pubDate>Wed, 07 Nov 2018 07:48:54 +0000</pubDate>
      
      <guid>https://tourcoder.com/make-an-app-by-using-electronjs/</guid>
      <description>需要开发多桌面系统的应用，图省事，选择了 ElectronJS，因为时间关系，开发前没有细致的阅读文档，导致在开发的时候，查资料时间比较多。建议各位在用它做开发前，熟读它的文档。
开发过程
整个开发过程没有什么特殊的，基本可以看成用 NodeJS 开发一个网站。安装环境，初始化项目，根据文档接口和需求进行开发。
另外：我用的是 Javascript，也可以用 TypeScript。
打包
如果你只是想发布应用，直接打包即可，我用的是 electron-packager 这个打包库，下面是 package.json 文件的部分内容
{ &amp;quot;private&amp;quot;: true, &amp;quot;name&amp;quot;: &amp;quot;Tourcoder&amp;quot;, &amp;quot;productName&amp;quot;: &amp;quot;Tourcoder&amp;quot;, &amp;quot;version&amp;quot;: &amp;quot;0.1.0&amp;quot;, &amp;quot;description&amp;quot;: &amp;quot;My blog&amp;quot;, &amp;quot;bundleID&amp;quot;: &amp;quot;com.tc.tourcoder&amp;quot;, &amp;quot;main&amp;quot;: &amp;quot;main.js&amp;quot;, &amp;quot;author&amp;quot;: { &amp;quot;name&amp;quot;: &amp;quot;tourcoder&amp;quot;, &amp;quot;email&amp;quot;: &amp;quot;hello@tourcoder.com&amp;quot;, &amp;quot;url&amp;quot;: &amp;quot;https://tourcoder.com/&amp;quot; }, &amp;quot;homepage&amp;quot;: &amp;quot;https://tourcoder.com/&amp;quot;, &amp;quot;scripts&amp;quot;: { &amp;quot;start&amp;quot;: &amp;quot;electron .&amp;quot;, &amp;quot;mac&amp;quot;: &amp;quot;electron-packager . --overwrite --platform=darwin --arch=x64 --icon=assets/images/appicon.icns --prune=true --out=out --osx-sign.identity=&#39;Developer ID Application: TOURCODER&#39; --extend-info=assets/mac/Info.plist&amp;quot;, &amp;quot;win&amp;quot;: &amp;quot;electron-packager . --overwrite --platform=win32 --arch=ia32 --out=out --icon=assets/images/appicon.ico&amp;quot;, &amp;quot;linux&amp;quot;: &amp;quot;electron-packager .</description>
    </item>
    
    <item>
      <title>MongoDB 学习手册</title>
      <link>https://tourcoder.com/mongoldb-manual/</link>
      <pubDate>Tue, 06 Nov 2018 05:51:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/mongoldb-manual/</guid>
      <description>安装 因为我现在使用 Debian 较多，所以内容都是基于 Debian。
在 Debian 9 下安装
curl https://www.mongodb.org/static/pgp/server-4.0.asc | sudo apt-key add - 下载密钥并传给 apt-key
sudo vi /etc/apt/sources.list.d/mongodb-org-4.0.list 新增 mongodb 的源，将下面的内容添加进去
deb http://repo.mongodb.org/apt/debian stretch/mongodb-org/4.0 main 更新并安装即可
sudo apt update -y sudo apt-get install mongodb-org -y 在 Debian 10 下安装
sudo apt install dirmngr gnupg apt-transport-https software-properties-common ca-certificates curl 安装软件包
curl -fsSL https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add - sudo add-apt-repository &#39;deb https://repo.mongodb.org/apt/debian buster/mongodb-org/4.2 main&#39; 添加密钥，并且添加源
sudo apt update -y sudo apt install mongodb-org -y 更新并安装。</description>
    </item>
    
    <item>
      <title>GitHub Down</title>
      <link>https://tourcoder.com/github-down/</link>
      <pubDate>Thu, 25 Oct 2018 07:47:50 +0000</pubDate>
      
      <guid>https://tourcoder.com/github-down/</guid>
      <description>对全世界的程序员来说，几天前比较大的一个新闻应该就是 GitHub Down，GitHub 在毫无征兆的情况下突然挂了整整一天的时间。
到目前为止，GitHub 官方在其博客发了两篇文章 1 和 2。
从他们的两篇文章上来看，本次当机事件不是受黑客攻击导致，而仅是因为网络分区以及后续数据库的故障导致，GitHub 团队出于谨慎考虑，主动的采取一些措施，比如暂停 webhook events。
但我认为早在发生当机事件之前，GitHub 的部分功能已经出了问题，而且很长时间没有得到修复（没有发现？）
比如，我一直用的 chrome 插件 Octotree，它在读取私有库的时候，是需要 Personal access tokens 的，在发生当机事件前的很长一段时间，在读取私有库的时候，Octotree 总是无法正常工作，但当这次当机事件处理完成后，Octotree 自动的又好了，这期间我没有做过任何的操作。
同样，另外一个需要 Personal access tokens 的插件也发生一样的情况。
想的多
可能是我想得有点多，从这次当机事件，GitHub 给我的感觉是他们一直在暗箱操作一些事情。不知道是不是和被微软收购后有关系，难道是所有的服务要全部都迁移到 Azure？
当然经过这次事情，还是应该吸取个教训，商业团队工作流的东西，还是应该多点其他的选择。
另外，不知道是否有人统计过这次 GitHub 当机造成了多少钱的损失，期待 GitHub 后续给我们带来详细的报告说明。</description>
    </item>
    
    <item>
      <title>自卑的杠精</title>
      <link>https://tourcoder.com/self-abased-guy/</link>
      <pubDate>Tue, 02 Oct 2018 07:47:20 +0000</pubDate>
      
      <guid>https://tourcoder.com/self-abased-guy/</guid>
      <description>国庆假期第一天，比较大的一个新闻应该是支付宝的文案所引发的新闻吧。
原由
支付宝投放广告，广告的文案是「他乡遇故支」
现象
一群人开始在微博等一些地方抗议支付宝用「支」这个字
类似事件
前些日子在程序员圈子也发生了类似的事情，比如中文翻译为主从的英文说法 master/slave，本来是一个很专业的词汇，但很多杠精骚扰开发者，要求他们换掉 slave 这个词。
看法
其实很多人看到「他乡遇故支」这个文案，第一反应就是支付宝，但恰恰这个字也是支那这个支是同一个字，所以这些杠精仿佛是被人踩着了尿泡一样的敏感起来，纷纷觉得自己被辱骂了，他们是得多么自卑。</description>
    </item>
    
    <item>
      <title>Netgear R7000设置</title>
      <link>https://tourcoder.com/netgear-r7000/</link>
      <pubDate>Fri, 21 Sep 2018 07:46:29 +0000</pubDate>
      
      <guid>https://tourcoder.com/netgear-r7000/</guid>
      <description>和小伙伴玩游戏，他总是掉网，后来一看是他买的破路由导致。让他买了个网件的路由器 R7000，并告诉他刷上梅林的固件。为什么买 R7000，因为我自己用的这款，一直感觉很棒。
准备
  先下载需要用到的文件
https://www.dropbox.com/s/jsa03cvtxr4bs9n/R7000.zip?dl=0   Chrome 浏览器
  刷固件
  访问 www.routerlogin.net 进入自带的管理系统，将系统恢复到出厂设置，登录的用户名是 admin，密码是 password
  重启后再次访问上面的地址，在路径高级-管理-固件更新处上传上面解压出来的文件 R7000_378.52_2.chk，并更新路由器。
  重启后，再次进入，系统设置下的恢复/导出/上传设置中点击原厂设置后的恢复，将其恢复原厂设置。
  重启后，再次进入，固件升级中选择 R7000_380.68_4-X7.7-koolshare.trx 上传更新。如果你的网络中有其他路由器，可以先去内部网络(LAN)中设置访问地址，重启路由器。
  这样，固件刷新完成。
一些设置
设置都很简单，多试试就行，这里主要说明下路由借助 SS 翻 wall，找到下面系统管理-系统设置-Persistent JFFS2 partition，将两个选项都选择是，然后保存并重启路由。
重启后，进入到管理界面，在软件中心先升级软件平台，然后在离线安装下，上传安装包并安装。安装包哪里找？GitHub！
最后回到软件中心，设置并开启 SS 即可。
关于信号和发射功率的问题
  单独设置 2.4G 和 5G
2.4G 无线模式 N only 频道 1、6、11 频道带宽 20 Mhz 5G 无线模式 N/AC mixed 频道 149 频道带宽 80 MHZ   地区设置成澳大利亚</description>
    </item>
    
    <item>
      <title>Mongoose 学习笔记</title>
      <link>https://tourcoder.com/study-mongoose/</link>
      <pubDate>Wed, 22 Aug 2018 07:45:57 +0000</pubDate>
      
      <guid>https://tourcoder.com/study-mongoose/</guid>
      <description>之前写的用 koa 开发 REST API，有提到过这个总让我想起加拿大鹅的中间件，索性好好学习一下。
准备工作
  安装好 mongodb，并新建一个数据库 testdb
  新建一个工程，并初始化 npm init
  安装 mongoose npm install mongoose
  连接数据库
新建文件 serv.js，并输入一下代码
const mongoose = require(&amp;quot;mongoose&amp;quot;); mongoose.connect(&amp;quot;mongodb://127.0.0.1:27017/testdb&amp;quot;); let db = mongoose.connection; db.on(&amp;quot;error&amp;quot;, function (error) { console.log(&amp;quot;fail---&amp;gt;&amp;quot; + error); }); db.on(&amp;quot;open&amp;quot;, function () { console.log(&amp;quot;connected&amp;quot;); }); 执行该文件 node serv.js，可以得到正确或错误的信息。
注意：如果你的 mongodb 版本较高，则会出现下面的警告
DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version.</description>
    </item>
    
    <item>
      <title>我是如何设计开发一款应用的</title>
      <link>https://tourcoder.com/the-flow-of-i-design-an-app/</link>
      <pubDate>Mon, 20 Aug 2018 07:44:57 +0000</pubDate>
      
      <guid>https://tourcoder.com/the-flow-of-i-design-an-app/</guid>
      <description>已经多次被人问到：“你是如何设计开发一款应用的”，一直觉得这些没有什么好分享的。
  IDEA 平时我脑子会产生很多想法，我都会把这些想法随手记录下来，会不定期的去查看这些记录，当一个 IDEA 想得比较完善的时候，我会评估下工作量等，然后进行下一步操作。
  原型设计 有一段时间，我比较喜欢用 Sketch 做原型设计，但现在更喜欢用纸和笔。
  交互设计 在纸的原型图上写出来，会标注各效果库的名字
  开发 通过 MVC 的方式开发，有时候 M 和 C 层会合并到一起， V 层是界面层。
  图标 在应用市场中，一个好的图标非常重要，这个我都会花钱请人设计。
  ASO 这里已经不单单是设计开发了，已经是运营阶段的事情。
  </description>
    </item>
    
    <item>
      <title>在 macOS 下玩 ETH</title>
      <link>https://tourcoder.com/dig-eth-on-macos/</link>
      <pubDate>Mon, 20 Aug 2018 07:43:09 +0000</pubDate>
      
      <guid>https://tourcoder.com/dig-eth-on-macos/</guid>
      <description>首先安装以太坊客户端 Geth
brew install ethereum 安装完成后，查看版本
geth version 接着新建文件夹，并且创建一个文件 genesis.json
mkdir ethtest cd ethtest vi genesis.json 输入如下内容
{ &amp;quot;config&amp;quot;: { &amp;quot;chainId&amp;quot;: 10, &amp;quot;homesteadBlock&amp;quot;: 0, &amp;quot;eip155Block&amp;quot;: 0, &amp;quot;eip158Block&amp;quot;: 0 }, &amp;quot;coinbase&amp;quot; : &amp;quot;0x0000000000000000000000000000000000000000&amp;quot;, &amp;quot;difficulty&amp;quot; : &amp;quot;0x020000&amp;quot;, &amp;quot;extraData&amp;quot; : &amp;quot;&amp;quot;, &amp;quot;gasLimit&amp;quot; : &amp;quot;0x2fefd8&amp;quot;, &amp;quot;nonce&amp;quot; : &amp;quot;0x0000000000000042&amp;quot;, &amp;quot;mixhash&amp;quot; : &amp;quot;0x0000000000000000000000000000000000000000000000000000000000000000&amp;quot;, &amp;quot;parentHash&amp;quot; : &amp;quot;0x0000000000000000000000000000000000000000000000000000000000000000&amp;quot;, &amp;quot;timestamp&amp;quot; : &amp;quot;0x00&amp;quot;, &amp;quot;alloc&amp;quot; : {} } 初始化
geth --datadir datastore init genesis.json 启动节点
geth --datadir datastore --networkid 1108 console 其中 --networkid 1108 表示链的 ID 是 1108，console 表示进入控制台，此时可以在控制台中输入命令查看</description>
    </item>
    
    <item>
      <title>美国各州公司查询</title>
      <link>https://tourcoder.com/mei-guo-ge-zhou-gong-si-cha-xun/</link>
      <pubDate>Sun, 12 Aug 2018 16:00:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/mei-guo-ge-zhou-gong-si-cha-xun/</guid>
      <description>英文州名 州名缩写 中文州名 查询网址 Alabama AL 阿拉巴马州 http://sos.alabama.gov/government-records/business-entity-records Alaska AK 阿拉斯加州 https://www.commerce.alaska.gov/ &amp;hellip; arch.aspx?mode=Corp Arizona AZ 亚利桑那州 http://ecorp.azcc.gov/Search Arkansas AR 阿肯色州 http://www.sos.arkansas.gov/corps/search_all.php California CA 加利福尼亚州 https://businesssearch.sos.ca.gov/ Colorado CO 科罗拉多州 https://www.sos.state.co.us/biz/BusinessEntityCriteriaExt.do Connecticut CT 康涅狄格州 http://www.concord-sots.ct.gov/C &amp;hellip; nquiry&amp;amp;eid=9740 Delaware DE 特拉华州 https://icis.corp.delaware.gov/Ecorp/EntitySearch/NameSearch.aspx Florida FL 佛罗里达州 http://search.sunbiz.org/inquiry/corporationsearch/byname Georgia GA 佐治亚州 https://ecorp.sos.ga.gov/BusinessSearch Hawaii HI 夏威夷州 https://hbe.ehawaii.gov/documents/search.html Idaho ID 爱达荷州 https://www.accessidaho.org/public/sos/corp/search.html Illinois IL 伊利诺伊州 https://www.ilsos.gov/corporatellc/ Indiana IN 印第安纳州 https://bsd.sos.in.gov/publicbusinesssearch
Iowa IA 艾奥瓦州 https://sos.iowa.gov/search/business/search.aspx Kansas KS 堪萨斯州 https://www.</description>
    </item>
    
    <item>
      <title>用 koa 开发 REST API</title>
      <link>https://tourcoder.com/build-rest-api-with-koa/</link>
      <pubDate>Mon, 06 Aug 2018 07:42:25 +0000</pubDate>
      
      <guid>https://tourcoder.com/build-rest-api-with-koa/</guid>
      <description>Nodejs 特点之一是高并发，Koa2 是下一代的 Nodejs 框架。所以，我尝试写一套基于 Koa2 的 REST API。
技术选型及开发工具
 KoaJS MongoDB macOS 系统版本：10.13.6 Sublime Text 编辑器不重要，看自己喜欢 Terminal 终端，输入各种命令  实施步骤   安装基础开发环境
node.js 安装
这部分内容自行搜索，我一般喜欢用的安装方式是命令行安装
nvm wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash 然后使用 nvm 来安装 node.js，除非有比较好的特性，不然我一般都使用 LTS 版本。
Tips: nvm 的版本会变化，你可以通过三种方式更新 nvm 的版本，
 用最新版本的连接地址直接升级，最新地址，从这里 https://github.com/creationix/nvm 找。 用 git 更新，进入到 cd ~/.nvm，直接用 git 更新。 通过 zsh-nvm 来更新，项目地址 https://github.com/lukechilds/zsh-nvm，简单有效。 上面的三种方式都挺方便的。     mongodb 安装及启动
brew install mongodb brew services start mongodb tips:</description>
    </item>
    
    <item>
      <title>为什么程序员总是很忙</title>
      <link>https://tourcoder.com/why-is-a-coder-always-busy/</link>
      <pubDate>Mon, 30 Jul 2018 07:41:43 +0000</pubDate>
      
      <guid>https://tourcoder.com/why-is-a-coder-always-busy/</guid>
      <description>程序员总是很忙，相信他们的身边人深有体会。那么为什么他们总是这么忙呢？就拿我本人来说吧。
前言
我不是科班出身，大学时期学的是电气工程及自动化，因为喜欢，踏上了程序员这条不归路，严格意义上说，
工作状体
程序员这一工作并不只是打打字，更不是随意的把一些字符放到一起，程序员写出的每一行代码都是有严格的自我要求和系统要求，这就意味着程序员必须要花大量的时间思考，尝试写出高性能的代码。但人无完人，写出来的代码难免也会有问题，出现我们嘴里常说的 Bug，有 Bug 就必须要修复，而查找 Bug，修复它，又要花很多时间。
总有不断学习的原因
新技术不断的出现，势必要不断的学习，比如这两天我们的电报群进了一批骗子和打广告的，他们在群里面冒充我们官方等做着破坏我们利益的事情。我派出了之前写的机器人来处理这个事情，因为靠人工操作，简直是天方夜谭。如果是机器人操作，那么就要给机器人严格的指令，预防机器人误杀。这就意味着我需要去学习机器学习这部分技术，培养样本等等。这种能让程序员学习的类似原因，多的不能再多。
而学习，就需要时间。
自我状态
一旦做了程序员，总想着把自己的技术做到非常好，要想把技术做的非常好，就要花大量时间研究，写代码造轮子。</description>
    </item>
    
    <item>
      <title>算笔简单的账</title>
      <link>https://tourcoder.com/should-read/</link>
      <pubDate>Fri, 29 Jun 2018 07:41:03 +0000</pubDate>
      
      <guid>https://tourcoder.com/should-read/</guid>
      <description>此刻在计算项目的费用等，突然想到一些话，觉得自己很有必要算笔简单的帐，如果各位能把这笔账看清楚了，并能适当的调整自己，那么你以后的路会好走很多，反之被社会，未来淘汰的可能性极高。 小王和小朱各自有 100 元钱作为本钱做生意，他们去一个地方买货，然后拿回来买，来回一趟能把本钱翻个倍。
其中，小王是个非常节省的人，他是走路去进货，然后回来，一个小时只能跑一趟，而小朱这个人看起来有点不节省乱花钱，他非要坐车去，来回一趟车费 10 块钱，因为坐车快，一个小时内能跑三趟，花了 30 块钱坐车。
那么他们一个小时下来的账目情况是
小王一个小时来回一趟，本钱 100 元，赚了 100 元，现在手上有 200 元。
小朱一个小时来回三趟：
第一趟坐车花了 10 元，只有 90 元本钱，赚了 90 元，所以第一趟下来他手上只有 180 元。
第二趟坐车花了 10 元，本钱只有 170 元，赚了 170 元，所以第二趟下来，他手上有了 340 元。
第三趟坐车花了 10 元，本钱只有 330 元，赚了 330 元，所以第三趟下来，他手上有了 660 元。
那么一个小时下来，小王手上有 200 元，小朱手上有了 660 元，相差了 460 元。
这只是第一个小时的情况，第二个小时后会发生什么呢，我们继续算
小王还是走路一个小时一趟，本钱 200 元，赚了 200 元，现在手上有 400 元。
小朱还是坐车一个小时三趟：
第一趟坐车花了 10 元，只有 650 元本钱，赚了 650 元，所以第一趟下来他手上只有 1300 元。</description>
    </item>
    
    <item>
      <title>Just for Fun 读后感</title>
      <link>https://tourcoder.com/just-for-fun/</link>
      <pubDate>Sun, 20 May 2018 07:40:36 +0000</pubDate>
      
      <guid>https://tourcoder.com/just-for-fun/</guid>
      <description>这是一本 Linus 的自传，Linus 是谁？就是那个创造了 Linux 和 Git 的男人。
读完本自传的感受有几个
  天赋很重要
  全身心的投入很重要
  时机很重要
  持之以恒很重要
  </description>
    </item>
    
    <item>
      <title>说说锤子科技的发布会</title>
      <link>https://tourcoder.com/smartisan-one-or-two/</link>
      <pubDate>Thu, 17 May 2018 07:40:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/smartisan-one-or-two/</guid>
      <description>锤子科技的发布会过去好多天了，但话题度一点没有减少，时不时的听到或在朋友圈看到有人在嘲讽老罗及他这次发布的产品，其实怎么说呢，老罗的确有点牛叉，凭一己的活跃度和话题性让锤子公司节省了很多的媒体宣传费，感觉是千万级别的。带着不捧不黑，纯蹭热度的想法写一篇关于锤子科技产品的博文（鬼知道我要蹭他什么热度，我这只是一个私人的吐槽博客而已）。
在写这边博文之前，我特地去回看了锤子科技这次的发布会。
坚果手机 R1
不管老罗怎么解释，反正给大家的感受就是锤子手机改名字了，改名的原因可能是锤子科技现在在四川的缘故吧。隐约记得，老罗曾经说过一句类似的话，大概的意思就是把产品和公司名字挂钩起来，是一个非常正确的事情，可以节省营销等，当然也可能是我记错了。改名这事没啥好喷的，完全是公司的商业行为。
只是 R1 谈不上有多好，只是一部中规中矩的手机，我没有使用过，所以也没有发言权。之前我把安卓作为主力机使用只用了半年的光景，我以前的博文有写到过，我用的那部安卓手机刚开始给我的感觉还挺好，但后来却让我越来越烦躁，最要命的是权限问题，安全问题，贼烦，而我又是一个对权限安全等有一定强迫症的人，那么就是烦上加烦了。
锤子手机我只体验过，也和用锤子手机的人聊过，信号问题尤为突出，另外有一个客户是锤粉，说到锤子手机他非常喜欢，后来聊我用 iPhone，我说我喜欢 iPhone 拍照，我用 Instagram，然后他笑我说还是个文艺青年，他又不是，言语之间给我的感觉就是他用锤子手机是为了用手机，而不需要这些功能有多好，当时我挺诧异的。
我们买一个东西不是因为它好，能很好的满足自己的需求么？难道我们买一个东西是因为它在某些方面有缺点，然后我们削减自己的需求？
TNT 工作站
容我猜想下 TNT 工作站团队的需求设想，他们是想打造一个钢铁侠的全息工作台，限于现在的技术等情况，还不能够全面完成，只能一步一步的来，这也是老罗之前放出豪言来说 Apple 等一些公司肯定会抄袭他。
那么结合手机又是什么鬼呢？你可以理解为钢铁侠的智能助手 — Jarvis 或 Friday，随时随地像手机一样把这些智能助手带在身边，工作或做其他事情时又能结合那台显示器玩全息。
如果他们的产品真是我猜想的这样话，那技术实现的时间要长和技术突破的东西要多。
所以，老罗在发布会上会告诉我们历史上有多少优秀的产品是一点点弄出来的，我想我的这个猜想是给老罗他们找到的最好的“理由”了。
只是到底什么东西叫工作站？老罗真应该找个懂行的人问一问。
老罗的产品策略
不管是从 almost 全面屏，还是从这次一点一点做 TNT 工作站，说 Apple 公司等会抄袭，我看到的只是老罗或着锤子科技这家公司的鸡贼，抖机灵。
结束语
永远记住，锤子科技是一家商业公司，而老罗是一个商业公司的 CEO，记住这句话，一切都好理解了。</description>
    </item>
    
    <item>
      <title>复仇者联盟 3 观后感</title>
      <link>https://tourcoder.com/avengers-3-infinity-war/</link>
      <pubDate>Sat, 12 May 2018 07:39:20 +0000</pubDate>
      
      <guid>https://tourcoder.com/avengers-3-infinity-war/</guid>
      <description>刷一遍复联 3，差点睡着了，可能是因为最近没有好好睡觉的缘故。说说自己的观影感受。
观影环境
因为时间段的关系，影院没有几个人，是我喜欢的感觉。
人物
复联 3 出场的人物太多了，不光正派，反派也是。会让观影者有两种感受。
  对漫威宇宙人物比较了解的人，会觉得不少反派人物的设计改变得不是太一样，感觉有点不太适应，比如 Ebony Maw，中文翻译乌木喉，一个超级反派，最后死得太草率。
  对漫威宇宙人物不了解的人，观影前可能需要了解下一些知识点，比如灭霸及其手下，不然有点好奇心的可能全场在问一个问题 这个人是谁？，没有好奇心的，都会把他们归类为灭霸手下吧。
  每段故事
每段故事处理也不一样，让我感觉是由多个导演在处理各段的故事，有的处理很清楚，但有的就是那种忽然来了一段，纯过度。
剧情拖沓
也许是要处理的东西很多，节奏慢，显得整体剧情太拖沓，导致的结果就是缺乏吸引力，两个小时太长了，但更致命的是，从最后结束来看，这场战争还没有打完，完全是上下步骤的节奏啊。
钢铁侠、浩克、红骷髅
漫威宇宙里，我始终喜欢两个人：钢铁侠和浩克。这一部中钢铁侠的思考，在一个层面上其实和灭霸是一样的。
来点剧透：这一部钢铁侠的装甲越来越帅，给小蜘蛛的那套也非常帅气。完全没想到浩克全程没变身狂虐敌人（影片一开始除外），第一次啊。红骷髅也来了。</description>
    </item>
    
    <item>
      <title>CSS3 中自定义字体</title>
      <link>https://tourcoder.com/custom-font-in-css3/</link>
      <pubDate>Mon, 07 May 2018 07:38:42 +0000</pubDate>
      
      <guid>https://tourcoder.com/custom-font-in-css3/</guid>
      <description>虽然现在有 Google web font 这么一个好用的字体库，但有时网页中需要用到自定义的字体，在 css3 中就能很好的解决这个问题。
使用
用 font-face 引入这个字体
@font-face { font-family: &#39;fontname&#39;; src: url(&#39;../fontname.eot&#39;); src: url(&#39;../fontname.eot?#iefix&#39;) format(&#39;embedded-opentype&#39;), url(&#39;../fontname.woff&#39;) format(&#39;woff&#39;), url(&#39;../fontname.ttf&#39;) format(&#39;truetype&#39;), url(&#39;../fontname.svg#SingleMaltaRegular&#39;) format(&#39;svg&#39;); } 然后在需要用到的地方直接使用即可
font-family: fontname; 浏览器支持情况
一、TureTpe(.ttf)格式：
.ttf 字体是 Windows 和 Mac 的最常见的字体
支持这种字体的浏览器有 IE9+, Firefox3.5+, Chrome4+, Safari3+, Opera10+, iOS Mobile Safari4.2+
二、OpenType(.otf)格式：
.otf 字体被认为是一种原始的字体格式，其内置在TureType的基础上
支持这种字体的浏览器有 Firefox3.5+, Chrome4.0+, Safari3.1+, Opera10.0+, iOS Mobile Safari4.2+
三、Web Open Font Format(.woff)格式：
.woff 字体是 Web 字体中最佳格式，他是一个开放的 TrueType/OpenType 的压缩版本，同时也支持元数据包的分离
支持这种字体的浏览器有 IE9+, Firefox3.</description>
    </item>
    
    <item>
      <title>一些基本常识</title>
      <link>https://tourcoder.com/basic-knowledge/</link>
      <pubDate>Tue, 27 Mar 2018 07:38:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/basic-knowledge/</guid>
      <description>基本常识很多，技术圈也不例外
不要迷念所谓技术交流会，尤其是短时间的
最近币圈的人开始冷却 ICO，开始搞一些所谓的区块链技术培训，然后你看下他们的培训人员，你会觉得想吐。又是做 ICO 的一套，包装出来的玩意。
而且他们培训的时间是极短，基本就是一天两天，我去他妈的。
如果真的想学习，请去买一本书看看，区块链技术一本书基本足够。
这种搞一天两天技术培训交流，还收费的现象不只是币圈存在，技术圈也很普遍。时间短，所谓的培训人也是他们包装出来，这完全是浪费时间，即便你是想去多认识几个人，那也是浪费时间和钱。
不迷信权威，不要相信大公司的重要人物说的一些信息
一些大公司他们的 CEO 等一些人说一些事情，更多的是出于他的公司战略等，有时候并不是实话。 比如我听某巨无霸级别公司的 CEO 说某项技术的方向等等，但我在申请该技术一些专利的时候发现他们也申请的一些东西，对他的话完全就是打脸。</description>
    </item>
    
    <item>
      <title>Gmail filter doesn&#39;t work well</title>
      <link>https://tourcoder.com/gmail-filter-does-not-work-well/</link>
      <pubDate>Sat, 17 Mar 2018 07:36:50 +0000</pubDate>
      
      <guid>https://tourcoder.com/gmail-filter-does-not-work-well/</guid>
      <description>Find a bug in Gmail
Steps to reproduce
  Create filter with this search to: example@noreply.github.com
  Choose Skip Inbox, Mark as read and Never send it to spam
  Done
  When you get an email from example@noreply.github.com, the email will be marked as read, and not sent to spam, but it still in the Inbox, not archived.</description>
    </item>
    
    <item>
      <title>Apple App Review 的双刃剑</title>
      <link>https://tourcoder.com/to-be-or-not-be-is-a-question-for-apple-appreview/</link>
      <pubDate>Fri, 16 Mar 2018 07:36:06 +0000</pubDate>
      
      <guid>https://tourcoder.com/to-be-or-not-be-is-a-question-for-apple-appreview/</guid>
      <description>两个 App 又被拒绝了，拒绝的理由依旧是很奇葩，习惯就好。App Review 这件事是一把双刃剑，做得好了，能提升 AppStore 平台，做得差了，也能毁掉平台。很可惜，现在 App Review 正在向差的方向大踏步，而导致这个现象的主要原因是专业性和态度。
专业性
现在 Apple 的 App Reviewer 并不专业，他们的业余体现在对规则的不合理使用，给人一种死背教条的感觉。很多内容都不能够准确的描述，甚至发生拒绝的理由和产品本身没有相关性的事情。
态度
态度往往和专业性在一起的，态度端正才能够提升自己的专业性，但 App Review 团队里的不少人的态度是非常敷衍的，比如我之前吐槽过的文章。
我的观点
由上面的两点引发的一系列问题非常严重，对一个开发者来说简直是灾难性的。
就拿我来说吧，我现在越来越不喜欢开发 iOS 上的应用，其中很重要的一个原因是成本太高，而且这些成本完全是由 App Reviewer 带来额外成本。
比如我想到一个点子，然后我会论证是否符合苹果官方文档标准，一旦符合，会经过几个月的开发测试，然后提交，但这时候 App Reviewer 给了一个莫名其妙的理由拒绝上线，然后我按他的要求更改再次提交，然后他又会给出另外一个同样莫名其妙的理由，让我继续修改，就这样来来回回反反复复，等最后真能上线的应用已经和当初自己最初的想法不一样了，更要命的是时间已经花掉了很多很多。 这只是其中的一个情况，如果是个人，损失还好；但如果是一个团队，那损失是灾难性的。这已经完全违背了 AppStore 快速上线，快速迭代，小步快跑的模式。
让 App Reviewer 有权利干预 App 的内容是件非常扯蛋的事情，如果是违背开发者指南的内容需要修改是必须的，但现在的情况是这些 App Reviewer 让开发者改的不只是违背开发者指南的内容。
举个简单列子，我的一款应用需要读取相册，在读取相册的时候需要提醒用户，我写了如下内容
为了插入图片和保存图片的操作，本应用需要相册权限 但这被 App Review 拒绝了，说让我重新修改这段文字。怎么改？没说。类似的情况多的举不胜举。 怎么说呢，这类情况发生太多，让我逐步丧失了在 iOS 平台创作的欲望。
另外，App Review 团队是我见过最怂的团队，他都不敢把拒绝的内容呈现在邮件中，每次的邮件都是说你有问题了，需要去后台看，呵呵。
最后我想说，做这方面开发的技术人员，不妨关注下 PWA，如果 Google 好好弄，不用多久，会是一个更好的趋势。
一早思路有点乱，写得有点乱～</description>
    </item>
    
    <item>
      <title>团队的项目工作流</title>
      <link>https://tourcoder.com/project-flow-for-team/</link>
      <pubDate>Thu, 15 Mar 2018 07:35:27 +0000</pubDate>
      
      <guid>https://tourcoder.com/project-flow-for-team/</guid>
      <description>从一个项目项目开发开始到结束，主要涉及三个过程 &amp;ndash; 需求，开发，测试。利用 GTD 的概念，我设计了这么一个团队的工作流，目前我是在 GitHub 的自带工具 Projects 里面做的，其实在 Trello 上也一样。
将看板分成五个板块
Todo
这里是初始化状态，即将需要开发的功能细化的列在这里，同时这里还有从 issue 提交过来的 bug 等。
这部分的权限主要是开发管理人员和开发者。开发管理人员将内容添加到这里，开发人员自行选择要开发的功能，并将其拖入下一个阶段。
In progress
项目功能开发进行中，bug 修正中的状态。
这部分的权限主要是开发管理人员和开发者。开发管理人员主要查看，开发人员在开发完成后，将所开发的功能拖入下一个阶段。
Testing
测试阶段，主要是测试开发完成的功能。
这部分的权限主要是开发管理人员和测试人员。开发管理人员主要查看，测试人员自行选择测试的内容，如果功能通过，则拖入 Done 阶段，如果功能测试未通过，则拖入 Abnormal （异常）阶段。
Done
完成阶段，完成的功能列表
这这部分的权限主要是开发管理人员。
Abnormal
异常阶段，这是一个特殊的阶段，包含的内容很多，比如测试未通过的功能等。
这部分的权限主要是开发管理人员，测试人员和开发人员。
需要注意的是，这些操作流程是我为自己团队设计的，目前 GitHub 的 Projects 还没有做到如此细致的权限，目前我们是借助我开发的 Chrome 插件做一些有限的设置。GitHub 进步的空间还很大啊。</description>
    </item>
    
    <item>
      <title>为什么我会拒绝</title>
      <link>https://tourcoder.com/why-i-reject-you/</link>
      <pubDate>Tue, 13 Mar 2018 07:34:42 +0000</pubDate>
      
      <guid>https://tourcoder.com/why-i-reject-you/</guid>
      <description>这事本来没有计划写一篇博文，但考虑到今天又发生了同类的事情，索性写一篇博文吧。
起因
过年后我说了一段话，大意就是我改变下自己，主要涉及的内容有与人相处、帮忙、工作等事情，其中有一部分是这样的
  如果有人找我做事情，请先说清楚是找我帮忙，还是付费让我做
  如果是找我帮忙，请想清楚要我帮什么，我会看自己的时间情况决定是否帮忙
  如果我帮忙了，请他还需要配合，如果他不配合或者我没有时间，我会断然拒绝。
  如果是付费让我做事情，请和我签合同
  案例
昨天一个人找我做个东西，愿意付费，我和他的对话基本如下
他说：我有一个自己的东西，一个图像识别的算法，要求实时检测人脸，判断左右移动的输出相对 我说：什么叫左右移动输出相对？ 他说：这个我自己的应用，你看3000能做吗？就是有人在摄像头前面走，能输出这个人的左右移动距离，相对上次输出时的相对距离 我说：3000？再加个0，可以考虑下 他说：不用太复杂的，只以视频画面的中线为准 我说：不用太复杂，为毛你自己不做啊？ 他说：没空啊，我忙着做前端的东西 我说：那你等你有空的时候在做咯 他说：哦，那成吧 我说：这种价格，这种需求，不骂你，算是够意思了，你问别人，就是找骂的节奏啊 他说：安啦，那么多激动。需求你想多了，不能做，就不说了。 我说：你脑子也脱线了，我说的是实事求是的话，你却觉得我激动了，看来你是把我的 level 想成和你一样了 今天另外一个人丢了一段代码过来，让我帮忙看看
他说：哥，帮我看下，我这段代码总是不 work 我说：在忙着 他说：很着急，你帮我看下，拜托拜托🙏 后面因为我没有回复他，然后他就不停的在那边发消息给我。
这上面两种情况基本上是我会拒绝的典型。
在接下来的日子，我拒绝的人还会更多，比如有人因为拖拉导致项目延误，所以我取消了和他的合作。拒绝很难，但拒绝做好了，很多事情会变得很轻松。</description>
    </item>
    
    <item>
      <title>Office 365 Exchange Online 的糟糕设计</title>
      <link>https://tourcoder.com/ugly-design-in-office-365-exchange/</link>
      <pubDate>Mon, 12 Mar 2018 07:34:08 +0000</pubDate>
      
      <guid>https://tourcoder.com/ugly-design-in-office-365-exchange/</guid>
      <description>开大会，翻山越岭的工具出了一些大问题，Gmail 没法很好的访问，随即切换到 Office 365 Exchange Online。
本次问题点
在设置好 dkim 后，发现一直不能正常运行，然后查看了下 Initial domain，发现了问题所在，正常情况下，在添加一个新域名后，在 Initial domain 的 Additional Office 365 records 这里都会自动添加两条记录，而这次我这次添加的域名却没有自动添加成功，基本是因为这里的设置导致 dkim 不能正常工作。
这里就是我说它设计糟糕的地方，正常的设计思维，增加一个域名，会自动的增加两条记录，如果删除一个域名，则应该会自动的把对应的两条记录自动删除。
但他们并没有这么做，很多我曾经用过的旧域名的记录，甚至有些域名早已经被我卖掉，但这些记录还是列在这里，我和他们技术支持的客服沟通的时候，客服和我说这些记录会在一段时间时后就会自动删除，我追问多久，她说她也不清楚。我想说这里不少记录都已经超过 3 年以上。
微软的技术支持
很不客气的说，除了态度普遍比较好外，他们的技术客户水平非常水。我猜一方面是因为他们自身业务能力，更主要的一个方面是他们系统的糟糕设计让他们也不清楚如何解决。
解决办法
现在的解决办法是我给他们的客服去了封邮件，告诉他们问题的点是什么，应该从哪些方面排查解决，得到的回复是感谢之外，告知我他们已经升级到高级技术支持，希望我耐心等待。
我当然不能等，重新设置了翻山越岭的工具，继续访问 Gmail。
另外刚才遇到了更糟糕的问题，邮箱已经无法接受邮件，即便是微软发来的邮件，也无法收到。
感慨
其实 Office 365 Exchange Online 设计糟糕和问题的地方不只是这个点，有很多很多，这些年我都不知道给他们提交了多少这方面的问题。
话说微软买来的 Hotmail 也有 20 年了，为什么现在连一个最基本的邮箱系统还做不好，这是微软真的要考虑的问题。
最糟糕的是，他们现在连收费系统都出问题了，我明明缴了费用，但在他们后台，还是提示没有缴费。 真的很糟糕！
updated@2018-03-12 18:00: 有人看了这篇博文后，说我扯蛋，他没觉得 Gmail 好在哪里，也没有觉得 Hotmail 差在哪里，反而 Gmail 还要翻墙使用，麻烦。怎么说呢，每个人的追求不一样，开心就好。</description>
    </item>
    
    <item>
      <title>币圈</title>
      <link>https://tourcoder.com/about-ico/</link>
      <pubDate>Sun, 11 Mar 2018 07:33:22 +0000</pubDate>
      
      <guid>https://tourcoder.com/about-ico/</guid>
      <description>我想尝试着挽救区块链的名声，显然这并不太现实，但聊胜于无，至少从今天此刻开始，我会有意识的把 ICO 和区块链技术分开说。
ICO 就是币圈，这些天很不安宁，一方面各种币猛跌，很多币已经破发，掉到之前 1/2 的币比比皆是，我认识的一小伙，500 万进入，现在跌到还有 250 万，我昨天还说他是活脱脱的 250。另外一方面，国家政策的不明朗，让币圈很多人的心悬着，一些交易所也开始出现问题，陆续出现无法访问交易的现象。其中有意思的是一个在香港的交易所，它注册在香港，现在却不再为香港居民服务，也不再为美国及其下属国（地区）的居民服务，而我们国内的 IP 地址被封，需要挂代理才能够上。个人觉得，这是一个很有意思的信号，至于这信号所表达的内容，你们自行理解。
也是因为这次的暴跌，让一些平日里吹牛的人现出原形，平日里嘴上吹着百万千万炒币的，号称经历过他们嘴上所谓的 94 的，在这次暴跌后，丑态百出，完全就是担惊受怕，看不到一丝淡定，活脱脱的一只落水老鼠。
币圈的造神造星运动也同样在有条不紊的持续着，从最初的所谓大佬，到现在各式女网红的加入，让这个圈子的疯狂程度持续不减，但究竟是个什么情况，一个成语足矣说明全貌 &amp;ndash; 镜花水月。 就如我以前的博客说到过的一样，我研究了中国从古至今的骗术，其中成功的骗术中就有这么一条：很多事情不能说得太透，说太透，神秘随之而去，让人想象的空间也就没有了，钱自然就没法赚了！币圈，深谙此道！
另外央行行长周小川前两天在记者会上的讲话，很值得回味。
比特币和其他分叉产品出台太快，不够慎重。迅速蔓延可能给消费者带来很大负面影响。这些产品会对货币政策的传导产生不可预测的作用。不慎重的产品要停一下，一些有前途的要经过测试后再推广。目前不认可比特币一类虚拟货币作为支付工具，目前没有认可虚拟货币作为支付工具。 还有前几天央行出支付业规定，从 4 月 1 日起，静态扫码支付每天最高 500 元，以及网联的大限 6 月 30 日即将到来，结合这点来看，不慎重，后面的日子不好过。</description>
    </item>
    
    <item>
      <title>记忆中的鞋子</title>
      <link>https://tourcoder.com/shoes-in-memory/</link>
      <pubDate>Thu, 08 Mar 2018 07:32:39 +0000</pubDate>
      
      <guid>https://tourcoder.com/shoes-in-memory/</guid>
      <description>最近买了三双鞋，一双热风，一双 DC，一双阿迪。买热风是因为那鞋外形是我喜欢的款式，同样原因的还有 DC，阿迪是在那两双鞋退了后买的，因为不想再尝试，还是买自己一直穿的吧。
退掉的两双鞋
热风的这双鞋外形不错，是我喜欢的那种单一不扎眼的状态，价格也比较便宜，149 元。退掉它是因为穿上这鞋很不舒服，穿着它走了几走后，发现右脚吃力非常厉害。
DC 的这双是我喜欢的板鞋款，考虑到最近走路比较多，而 DC 是板鞋街头典型代表，我想当然的认为街头么，穿起来走路肯定很舒服。到手后当时就傻了，实际收到的鞋子和官网看的照片不太一样，主要是风格方面，有点浮夸，很不适合我的，另外就是这鞋有点偏小，我脚小脚背肉多而厚，日常穿 40 码，这鞋我买了 40 码，但穿不进去 😓
回忆鞋子
记得小时候（一九八几年的样子），穿得最多的鞋子是「双星」，我喜欢的是那 99 元一双的板鞋款，它是我记忆中的第一双非常喜欢的鞋子。
对「双星」鞋的追求在初高中的时候戛然而止，那时家乡那边流行起西装皮鞋，长辈们也不问孩子是否喜欢，给自家孩子都会买身西装和一双皮鞋，我也没能逃脱，穿了好多年的皮鞋，有的是去店里买的，有的是在鞋店专门做的。因为十四岁就开始独立生活到外面上学，基本属于自己管理自己，我就开始使坏，经常穿着皮鞋去和同学踢球，目的就是为了能踢坏皮鞋，好有理由买运动鞋，可结果是除了被爸妈说我这个人废鞋外，我得到的还是皮鞋。所以，皮鞋一直是我非常非常非常不喜欢穿的鞋子。
上了大学，父母给我带的衣服鞋子是衬衫，西裤，皮鞋，但是！！！到达学校后，我第一时间就去找之前的「双星」那鞋，双星没找到，倒是找到了匡威，找到了我人生的第二个爱&amp;ndash;T恤。可以想象一个状态，大学的前一年多，在学校我穿着帆布鞋 T 恤，放假回家我穿衬衫西裤皮鞋。到大二下学期开始，即便放假在家，我在家也是穿着帆布鞋 T 恤，纵然家长们不乐意，但我也不再换回来。其实到现在为止，我父母对我穿着还有意见，今年过年还说我总是穿着个运动鞋和 T 恤衫，说别人都是穿着擦得亮亮的皮鞋，我笑笑没说话。
PS. 当年迷匡威有点疯，做了不少奇葩事，比如大学毕业来上海，我查了下当时上海有 58 家匡威店，为了找一件匡威的衣服，我把所有的店都跑了，即便店员和我说其他店没有。这种疯在买 T 恤的时候也有过，比如我那时喜欢大嘴猴的 T 恤，想到每天都洗澡换衣服，还要想着搭配，不如一次多买点，多么省事，然后一次性买了 20 件 😓。
和匡威鞋的缘分随着体重的增加也逐步减少，脚肉了变厚了，变宽了，而匡威是那种细长鞋，我穿起来就很不舒服。再后来因为多方面因素，我鞋子穿得比较杂，什么舒服穿什么。这里面有一双彪马的魔术贴鞋让我非常喜欢，它也是一双我记忆很深的鞋子。
再后来，交了个日本妹子做女朋友，很神奇的是她喜欢韩国货，有次她去韩国旅游给我带了两双韩版的阿迪帆布鞋，简单款的，我穿着居然很舒服，然后这么多年就一直穿着阿迪的鞋，期间也有买过其他的鞋，但穿个两三次就不穿了。
为什么我喜欢板鞋帆布鞋
  这种鞋一般设计简单，我喜欢简单的东西。
  不捂脚，透气，不容易臭脚。
  我喜欢那种有触感的感觉，比如我在家里喜欢赤脚。很多鞋底子厚又硬，踩在油门或刹车上时，感受不到，但这种鞋会让我感官上能感受到油门刹车的运动，这是一种无法用言语表达的感觉。
  我希望能找到的鞋子
  设计简单
  不捂脚，透气
  轻
  触感
  </description>
    </item>
    
    <item>
      <title>一些压力测试工具</title>
      <link>https://tourcoder.com/testing-tools/</link>
      <pubDate>Wed, 07 Mar 2018 07:31:56 +0000</pubDate>
      
      <guid>https://tourcoder.com/testing-tools/</guid>
      <description>压力测试是一个 web 应用必须要做的，不只是为了测试程序的强壮性。压力测试的服务和工具很多，比如网上就很专业的压力测试的服务，也有 ab，webbench，siege，tcpcoy 等这样的测试工具。
ab 测试
ab 是 apache bench，从名字就可以看出是 apache 附带的一个工具，下载地址在这里。
因为它在 macOS 下多少有点问题，就拿 windows 简单说明，在终端中进入到 apache 所在的安装路径，比如 d:\apache， 执行命令
ab -n 请求数 -c 并发数 http://tourcoder.com/ 运行后的结果就是你的测试报告。如果遇到需要登录的页面，使用开发者工具，比如 Chrome Dev Tools 找到登录会话的 Cookies，然后执行命令
ab －n 请求数 －C key＝value http://tourcoder.com/ 如果 Cookies 较多，则设置头部
ab -n 请求数 -H &amp;quot;Cookie: Key1=Value1; Key2=Value2&amp;quot; http://tourcoder.com/ 更多的用法，请去官网查阅资料。
webbench
webbench 也是一款不错的压力测试工具，用法和 ab 差不多，终端中执行命令
webbench -c 并发数 -t 运行测试的时间 http://tourcoder.com 即可。
siege
siege 也是一款不错的压力测试工具，用法和上面一样，在终端中输入命令
siege -c 并发数 -t 运行测试的时间 http://tourcoder.</description>
    </item>
    
    <item>
      <title>A Markdown bug in Jekyll</title>
      <link>https://tourcoder.com/a-markdown-bug-in-jekyll/</link>
      <pubDate>Tue, 06 Mar 2018 16:47:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/a-markdown-bug-in-jekyll/</guid>
      <description>reproduce   Summary
The strikethrough doesn&amp;rsquo;t work.
  Operating Environment
GitHub Pages
  Reproduce
  Create a markdown file in folder _post, such as 2018-03-09-bugs.md
  Write following text in 2018-03-09-bugs.md
--- layout: post title: A bug of Jekyll --- - ~~飘啊飘~~ - ~~飘~~ - ~~测试~~ Review this post, you will see this
 The strikethrough doesn&amp;rsquo;t work.
If I deleted - ~~飘~~, works well, if I deleted - ~~飘啊飘~~ and - ~~测试~~, left code like following</description>
    </item>
    
    <item>
      <title>Chrome 插件开发</title>
      <link>https://tourcoder.com/chrome-extensions/</link>
      <pubDate>Tue, 06 Mar 2018 07:31:14 +0000</pubDate>
      
      <guid>https://tourcoder.com/chrome-extensions/</guid>
      <description>烦透了 Chrome 打开一个新标签时的下面的缩略图，所以就想是不是可以开发一个 Chrome 的插件，说干就干。看了下 Chrome Extensions 的官方开发指南，从文档中可以看出，重点是 manifest.json 这个文件
开发
manifest.json 这是插件非常重要的文件，关于它的内容，请参看官方文档 manifest 部分。这里我只对部分内容进行说明：
{ //必有项 &amp;quot;manifest_version&amp;quot;: 2, //manifest 编写规范版本，目前主流 2 &amp;quot;name&amp;quot;: &amp;quot;插件名字&amp;quot;, &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;, //版本号 //建议项 &amp;quot;default_locale&amp;quot;: &amp;quot;en&amp;quot;, //编码, &amp;quot;description&amp;quot;: &amp;quot;&amp;quot;, //插件描述 &amp;quot;icons&amp;quot;: { //插件图标，PNG 格式 &amp;quot;16&amp;quot;: &amp;quot;icon16.png&amp;quot;, &amp;quot;48&amp;quot;: &amp;quot;icon48.png&amp;quot;, &amp;quot;128&amp;quot;: &amp;quot;icon128.png&amp;quot; }, //只能选一个或都不选 &amp;quot;browser_action&amp;quot;: {}, //图标显示在地址栏外，能在所有页面显示 &amp;quot;page_action&amp;quot;: {}, //图标显示在地址栏里最右边，只在特定页面显示 //可选 &amp;quot;author&amp;quot;: &amp;quot;&amp;quot;, //作者 &amp;quot;automation&amp;quot;: true, //自动化 &amp;quot;background&amp;quot;: { // 可常驻浏览器后台的脚本，可以连接其他页面 &amp;quot;persistent&amp;quot;: false }, &amp;quot;chrome_url_overrides&amp;quot;: { //返回的页面链接，只支持 bookmarks、history、newtab 三个页面 &amp;quot;bookmarks&amp;quot;: &amp;quot;bookmarks.</description>
    </item>
    
    <item>
      <title>Jekyll 结构的不合理</title>
      <link>https://tourcoder.com/unreasonable-in-jekyll/</link>
      <pubDate>Mon, 05 Mar 2018 07:30:25 +0000</pubDate>
      
      <guid>https://tourcoder.com/unreasonable-in-jekyll/</guid>
      <description>过年期间，图省事将博客放到了 GitHub Pages，结合 Jekyll，省事多了。
因为我写文章，喜欢贴一些插图，在这过程过觉得 Jekyll 的结构设计有点不够合理。
当前 Jekyll 的基本结构如下
. ├── _config.yml ├── _includes | ├── footer.html | └── header.html ├── _layouts | ├── default.html | ├── page.html | └── post.html ├── _posts | ├── 2018-03-05-hello.md | └── 2018-03-06-hi.md ├── atom.xml └── index.html 如果是纯文字情况下，这样的结构设计没有问题，但如果文章中包含图片，为了方便的引入图片，则上面的结构中增加内容
. ├── _config.yml ├── _includes | ├── footer.html | └── header.html ├── _layouts | ├── default.html | ├── page.html | └── post.html ├── _posts | ├── 2018-03-05-hello.</description>
    </item>
    
    <item>
      <title>区块链:财富转移的工具</title>
      <link>https://tourcoder.com/blockchain-is-a-tool/</link>
      <pubDate>Fri, 02 Mar 2018 07:29:43 +0000</pubDate>
      
      <guid>https://tourcoder.com/blockchain-is-a-tool/</guid>
      <description>之前写过一篇区块链的文章，这次又有了一些新的想法。区块链是一项很好的技术，可惜它到现在非但没有很好的落地，反而成了很多圈钱项目的高技术外衣。
很多本身互联网的常规项目，和区块链半毛钱关系都没有，但穿上区块链的外衣，瞬间高大上起来。
投资圈
不只是个体投资人，还有不少是有一定规模的投资机构，这群投资区块链项目的人中：
十个有九个指望被投方拉个项目概念出来，用区块链包装下，找一些有光环的人加入，然后 ICO，至于是否有落地项目，技术上是否行得通，他们根本不在乎，弄到钱才是最主要的。一旦一个技术上说不通，他们就会说是基于区块链的，你不懂。
还有一个是听说区块链很赚钱，但啥都不懂，指望你教会他 ICO，带着他赚钱的。
币炒家
俗称韭菜，他们一窝蜂想赚钱，他们当中有一些是很理智的，属于很会看形势赚钱的那种，但更多的是并不懂技术被区块链给忽悠，无脑的。我就遇到过一个项目，没有任何技术含量，但它所谓的信仰者堪比娱乐圈的疯狂粉丝。
ICO 团队
这群人太有意思了，从他们身上你可以清楚的知道什么叫戏精，不同的团队有不同的做法。
有钱的团队，能说会道的团队，能搞定资源的团队，他们会让自己的币上主流交易所，毕竟现在上个主流交易所，需要几千万。
钱少的团队，资源有限的团队，他们会让自己的币上一些非主流的交易所。
最搞笑的是一些穷逼团队，他们没钱，没有资源，所以上不了交易所，他们的做法是最原始的记账式做法，我有幸遇到过一次这样的团队。妈的，在这里我要骂一句了，这个团队都穷逼到这种程度了，还指望他们做出什么产品，能做好什么产品？更何况他们连产品都没有，是几页纸的狗屁不通的概念性的文字。
骂是因为我之前在他们的电报群里问过几句，就是指出他们那几页纸中很多技术的常识性知识都乱说，在碰瓷区块链，没想到被那个群里所谓的信仰追随者攻击，最后我也看开了，退群完事，因为真的没有办法和一群脑残争论。再说，那些信仰追随者们自己想送钱给这个团队花，我何必要阻挡？
团队创始人也有奇葩的，我同学在他的微信公众号上就写过一篇某个币的事情，他还给我讲了一些他挖出来的更多的事情，简直了。而且这个币的创始人在自己微博上的言语，让人很清晰感受到他完全是个没脑子的，甚至精神上是有问题的，就这种情况下，还有很多的信仰追随者交智商税给他。
除此之外，还有一些人他们在背后发多个币，换着不同的身份，一个概念不行了，换个新概念来做，一个币玩死了，换个新币来做。项目变了，但圈钱的人没变。
而用美人计等策略的上次说过，就不说了。
产品
现在别说落地，很多发 ICO 的基本连产品都没有，有的只是一个网页、一份白皮书，全是文字性的东西。
而有产品的，技术方面和区块链本身没有关系，还是和之前做的事情一样，只是在说法上加入了区块链描述包装了下。
比如某个日活不超过 100 个人的产品，最近也用区块链包装并众筹了一把，目前市值几个亿，找谁说理去？为什么我知道？因为这产品前年是我给他开发的啊，和区块链没有半毛钱关系啊。
当然你也可以说币就是产品啊，那也没错，呵呵～
写在最后
其实现在区块链在一定程度上说，已经沦落为一个财富转移的工具，类似的还有早先火热的「知识付费」，那玩意更坑。
应该警惕这些利用技术，高科技包装的财富转移行为，不要做一个脑残。</description>
    </item>
    
    <item>
      <title>账户的二次验证</title>
      <link>https://tourcoder.com/using-2-factor-authentication-for-your-accounts/</link>
      <pubDate>Tue, 27 Feb 2018 07:29:03 +0000</pubDate>
      
      <guid>https://tourcoder.com/using-2-factor-authentication-for-your-accounts/</guid>
      <description>在一个安全异常重要的时代，开启二次认证也许是一个很不错的办法
起因
最近收到几个账户异地登录的提醒，如下图
 不过因为我开启了二次认证，所以貌似没什么太多的威胁。即便他知道了我的密码，也没有办法进入我的账户。
二次认证的方式
二次认证是现在非常流行，也是互联网安全的一个非常重要的环节，虽然在一定程度上，它的操作似乎麻烦了点，但这很重要。其实二次验证早已经存在于我们的生活中，比如我们平常用的银行的 U 盾。现在主流的 App，网站，服务等都已经提供了二次认证的服务，那么选择一个合理好用的方式就显得更为重要。
现在的二次认证方式有
  短信认证：就是输入登录的账号密码后，会被要求输入认证短信，输入你接受到的短信验证码即可。
  第三方 Authenticator：使用率比较高的是 Google 和微软的。同样是输入账号密码后，打开第三方 Authenticator，会有一个六位数字的验证码，输入即可。
  官方自带的：一些提供服务的公司会自己提供一个类似第三方的二次验证工具。
  Backup codes：备用码
  硬件工具：密钥的硬件工具，类似银行 U 盾之类的。
  手机许可：Apple 家的账号登录就是这种方式，Google 也提供了这种方式。
  操作方式大同小异，一般就是输入对账号密码后，会被要求输入二次认证的验证码即可，注意：手机许可直接点确定。
我是怎么做的
我在这方面做得有点强迫症了，一方面是追求安全性，另外一方面又要便利性。
  在所有提供了短信认证的 APP，网站和服务上，我都使用了短信认证，毕竟这个太方便了，但因为几大运营商的电话号码复制非常简单，所以我使用了 Google Voice 提供的号码。
  第三方的 Authenticator，我用了 Google 的，主要是因为微软的做法还不够中立第三方，另外就是比较麻烦。需要注意的是，这些第三方工具有的是跟手机走的。
  非常重要的数据，我使用了硬件工具。
  如果有能生成授权密码的，我都使用授权密码，而非主要密码，比如 GitHub。
  至于 Backup codes，手机许可，我基本没有使用。</description>
    </item>
    
    <item>
      <title>利用 Git Hooks 自动部署到服务器</title>
      <link>https://tourcoder.com/automating-deployments-to-server/</link>
      <pubDate>Mon, 12 Feb 2018 07:28:14 +0000</pubDate>
      
      <guid>https://tourcoder.com/automating-deployments-to-server/</guid>
      <description>使用自动部署的原因很多，我们主要是因为人手关系，还有就是希望开发人员专注于代码的开发，提升代码质量，而非被这些机械式的事情浪费大量时间。
注意点
这里只是搭建一个简单的自动部署功能，起到抛砖引玉的作用，网上也有一些收费的很不错的自动部署的服务，欢迎去购买。
再次强调两点：
  下面的教程内容并不建议你使用在生产力环境里；
  自动部署之前应该需要有严格的测试过程。
  知识点
Git Hooks，俗称钩子，关于它的官方文档 Git Hooks。
开始
为了方便，本次教程服务器和客户端部分都在我本地的电脑上。
  服务器部分
 新建 server 文件夹作为服务器端，在服务器端里创建一个自动部署的目录 autodeploy，使用 git init --bare 初始化，查看这个目录你会发现，它将 .git 的内容显示出来了。它和 git init 的区别是它显示的是 .git 中的内容，而 git init 是初始化一个常规仓库，并且将 .git 作为一个隐藏的文件夹在这个仓库里的。
blogdata 是服务器上需要被自动部署到的地方，进入这个文件夹，将自动部署的内容克隆过来，执行命令 git clone ~/desktop/server/autodeploy posts，完成后查看，posts 存在了，自动部署的内容将会被自动部署在 posts 这个文件夹里。
 进入到 autodeploy/hooks 这个文件夹，执行命令 vi post-receive，创建一个文件，在文件中输入上面的内容，完成编辑保存。
 赋予 post-receive 文件执行权限，到这里，自动部署的服务器部分基本完成了。
  开发端（开发者）
和日常开发一样，并没有什么特别的地方
 创建一个文件夹，用 git init 初始化，添加远程库，注意这里要添加的是自动部署的库，添加完成后查看。</description>
    </item>
    
    <item>
      <title>Git Submodule 的使用</title>
      <link>https://tourcoder.com/use-git-submodule/</link>
      <pubDate>Sun, 11 Feb 2018 07:27:29 +0000</pubDate>
      
      <guid>https://tourcoder.com/use-git-submodule/</guid>
      <description>之前都是博客源码和内容文件放在一起，总感觉怪怪的，今天更新了下本博客的结构，让代码和内容分开，Repository 也分成了代码和内容两个部分。分开后的结构是这样的：
博客代码部分在 GitHub 的显示
 那么怎么把这两个库关联起来，便于开发呢？这就用到了本篇的知识点 Git Submodule，关于 Git Submodule 的更详细介绍，可以去这里查看。这里我是用我的博客为例子
 进入到博客代码的库，用 git submodule add 命令引入子库。 比如我这里引入的博客内容的库，git submodule add https://github.com/***/blogdata.git blogdata，执行完成后查看，发现库里多了个 blogdata 的文件夹。执行 add，commit，push 命令后，查看 GitHub 上的代码库，发现多了个 blogdata 的文件夹和 .gitmodules 的文件，如下图
 这里的 blogdata 是一个链接，点这个文件夹可以跳转到 blogdata 所在的库。
  在主库根目录中增加点内容，然后提交到主库中，blogdata 是不会有任何变化的，比如我在主库增加了 example.js 这个文件。
  如果我们在子库 blogdata 中进行了更改，并且提交到库中，如上面的操作，这时候不但子库的内容发生了变化，主库中的 blogdata 的“指针”也发生了变化。
   如果要更新本地的 blogdata 内容，有两种方式，一个是在主库下面执行命令 git submodule foreach git pull，如上图；还有一种是进入到该子目录中执行命令 git pull。
 将内容克隆到本地，也有两种方式，一种是使用参数 --recursive 的递归方式，如执行命令 git clone https://github.</description>
    </item>
    
    <item>
      <title>Git 更改 commit 历史</title>
      <link>https://tourcoder.com/how-to-change-the-email-in-git-commit/</link>
      <pubDate>Thu, 08 Feb 2018 07:26:39 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-change-the-email-in-git-commit/</guid>
      <description>之前我在 git config 中都会将 Email 地址设置成我当前使用的电脑的名字，比如我当前使用的电脑名字叫 tourcoder，所以我就会设置成 tc@tourcoder.local，命令是 git config --global user.emai tc@tourcoder.local。最近因为工作需要，我需要将 Email 设置成真实的地址，比如我这里改成了 tc@****，除了在全局变量中做了修改，还要修改之前的历史 commit 记录中的 Email 地址。于是我执行了脚本命令
git filter-branch --commit-filter &#39; if [ &amp;quot;$GIT_AUTHOR_EMAIL&amp;quot; = &amp;quot;tc@tourcoder.local&amp;quot; ]; then GIT_AUTHOR_EMAIL=&amp;quot;tc@@****&amp;quot;; fi git commit-tree &amp;quot;$@&amp;quot;; &#39; -f HEAD 命令执行，且自动更改后，执行 git log 检查得到如下结果
 通常情况下，所有的历史 commit 记录的 Email 地址都更改过来了，但是有时候会遇到一个问题，我们挑选任意一个 commit 查看，比如最上面的这个，执行命令 git show --pretty=format:&amp;quot;%ce&amp;quot; 424c8b2089742b0965089b3317670c6152c2ed2c，oops，并没有更改过来，还是 tc@tourcoder.local
 那是因为需要更改 GIT_COMMITTER_EMAIL，即在上面的脚本中加入 GIT_COMMITTER_EMAIL 的内容即可。
git filter-branch --commit-filter &#39; if [ &amp;quot;$GIT_AUTHOR_EMAIL&amp;quot; = &amp;quot;tc@tourcoder.local&amp;quot; ]; then GIT_AUTHOR_NAME=&amp;quot;tc&amp;quot; GIT_AUTHOR_EMAIL=&amp;quot;tc@***&amp;quot;; GIT_COMMITER_NAME=&amp;quot;tc&amp;quot;; GIT_COMMITTER_EMAIL=&amp;quot;tc@***&amp;quot;; fi git commit-tree &amp;quot;$@&amp;quot;; &#39; -f HEAD 执行脚本，完成。在 git 手册中有一篇关于 [git filter branch](https://git-scm.</description>
    </item>
    
    <item>
      <title>记录一次 App 审核</title>
      <link>https://tourcoder.com/appreviewer-of-apple-sucks/</link>
      <pubDate>Thu, 08 Feb 2018 07:25:08 +0000</pubDate>
      
      <guid>https://tourcoder.com/appreviewer-of-apple-sucks/</guid>
      <description>最近被 Apple 的 App 审核给搞惨了，过程也让我对 Apple 感到失望，很多情况体现出了这些审核人员极度不负责，极度的敷衍了事。就拿一个具有代表性的 App 来说吧。
这个 App 是一个简单的图文编辑器，功能就是输入文字插入图片，然后将这些内容导出成一张图片，很简单，但就是这么一个简单的 App 却被审核人员拒绝了四次。
1.0 版本
只拒绝了一次，拒绝的理由是该应用太简单了，没有使用价值，没办法，增加了了数据库保存的功能，再次提交审核，没有什么问题，正常上线。
1.1 版本
我发现 1.0 版本中有一个文字编辑的 bug，我做了下修复，提交，但被拒绝了，拒绝的理由如下
2018年2月7日 上午7:48 发件人 Apple Guideline 2.3.7 - Performance - Accurate Metadata Your app name or subtitle to be displayed on the App Store includes keywords or descriptors, which are not appropriate for use in these metadata items. Specifically, the following words in your app name or subtitle are considered keywords or descriptors: 一款简单的图文编辑器，可将内容导出一张图片，简单容易使用 Next Steps To resolve this issue, please revise your app name or subtitle to remove any keywords and descriptors from all localizations of your app.</description>
    </item>
    
    <item>
      <title>给一些产品一些出路</title>
      <link>https://tourcoder.com/take-sunshine-to-some-products/</link>
      <pubDate>Thu, 25 Jan 2018 07:24:22 +0000</pubDate>
      
      <guid>https://tourcoder.com/take-sunshine-to-some-products/</guid>
      <description>使用一个产品久了，自然会发现里面的问题
Skype
Skype 是我用得比较早的通讯软件（主要是第一个工作的雇主要求使用 Skype），我见证了它从最初的技术颠覆者领跑者，到现在卖给微软后的追赶者，Skype 这一跤摔得可以。在最新的版本中 Skype 向微信学习，搞了个朋友圈的玩意 - Highlights。不知道 Skype 的产品经理们是怎么想的。
其实我很早就想抛弃它，但因为一个特殊的情怀在里面，导致我一直没有放弃使用，甚至一度让它作为自己公司内部的主要交流工具。
现在的问题：
  账号混乱，微软想把它和自己的账号系统整合到一起，可惜做这个产品规划的人是蠢货，整合是一塌糊涂。
  Skype Number 根本没法用，每年 300 多元，可以在 Skype 上租用一个号码，但这个以前让它很骄傲的功能，现在却是处于报废状态，基本都无法接到电话，说白了，买了它的号码就是浪费钱。
  定位不清楚，现在的 Skype 的定位验证了微软没有做网络产品的基因。
  建议出路：
这个建议出路一年前我和他们的技术人员聊过，趁现在 office365 套件还是很热的情况下，Skype 应该定位成一个工作用的沟通工具，完善日常工作用的沟通功能和桥链接的功能，Slack 应该是它学习的榜样。别再去折腾那些有得没得的了。
守望先锋「OverWatch」
暴雪出的一款游戏，前些年刚出来的时候我觉得它就是把玩过的一款游戏「流星蝴蝶剑」给重新设计了下，因为是暴雪的关系，玩得人很多，2017 年火爆极了，但现在慢慢不火了，很多人要说这个游戏要凉，其实已经凉了。
我觉得它的问题不是因为吃鸡这类游戏的出现，而且在国内的玩家氛围里，守望先锋这类游戏注定走不长远，守望先锋注重的是团队合作，一个人的力量往往不能够左右战局，而国内大部分玩家追求的是一个人的风光，什么超神咯，什么多连杀咯，所以，可以在这款游戏里有很多心态爆炸的玩家，彼此推卸责任，怒骂等等是一直没有停止过。我算是一个暴雪迷，暴雪的游戏基本都玩了，最喜欢的是星际争霸，但也非常喜欢守望先锋，但现在玩得少的原因除了时间之外，更多的就是极度厌烦里面的怒骂等。
建议出路：
人性的阴暗面是没有办法把它缩小的，所以索性就应该放大它！
比如守望先锋里让彼此怒骂，心态爆炸的是输出不给力，那么守望先锋的屏幕上就应该有个实时数据显示，让大家彼此看到，晒晒这些人到底谁表现好，金牌到底在谁手上。</description>
    </item>
    
    <item>
      <title>孙子兵法白话版</title>
      <link>https://tourcoder.com/the-art-of-war/</link>
      <pubDate>Tue, 23 Jan 2018 07:23:34 +0000</pubDate>
      
      <guid>https://tourcoder.com/the-art-of-war/</guid>
      <description>写在前面
孙子兵法不用多说，军事家孙武所著，如果你不清楚相关知识，可以去它的维基百科页面了解 &amp;ndash;「孙子兵法 - 维基百科」。
我读的是文言版，然后心血来潮自行注解成了白话文版，肯定会有理解不准确的地方，如果你有其他的理解，欢迎交流。
具体内容
我所读版本的链接地址「孙子兵法」。
计篇
孙子说：用兵打仗这件事，是国家的大事，关乎到国家的生死存亡，一定要清楚熟知，分析研究。
因而列举出五个方面，一是道，二是天，三是地，四是将，五是法，希望从这些方面的分析计算，进而获取到更多的信息。
道，即人心的情况，让上下一心，同生共死，不畏惧危险。天，即天气的情况，白天还是黑夜，冷天还是热天，季节节气。地，即战场的情况，如地势高低，战场距离远近，地势险易，地形开阔还是狭隘，生地还是死地。将，即将领的情况，有智谋，守信用，关爱下属，勇猛果敢，军纪严明。法，即军队情况，军队编制，后勤补给调配等。将领必须熟知了解这五个方面的事，能熟知了解的能够胜利，反之则将失败。
通过这些分析能够得出更为具体的信息，哪边君主更得民心，哪边将领更有才能，天气战场对哪边更有利，哪边的法令更清晰，哪边的兵员充足？哪边的士兵训练有素？哪边的赏罚更为分明？我通过这些方面的比较分析，知道战争的胜负。
听从我计策的将领，让他打仗必胜，留用他；不听从我计策的将领，让他打仗必败，辞退他。 按照分析的结果，就已经获得优势，这只是外部辅助的先决条件。而优势能够在战争中获得打胜仗的主动权。
用兵使计，是诡诈之术。应当有战斗力装着没战斗力，攻打装着不攻打，近攻佯装远攻，远攻佯装近攻，用利诱惑，趁乱取胜，实力强大的要防备并且避开，撩拨容易发怒的，让自卑的产生骄傲的情绪，让精力充沛的劳累，离间其内部的团结，攻击无防备的，在敌方没有注意的时候发起攻击。这是兵家取胜的路数计策，不可以提前外传，暴露自己的计策。
没有开战之前，分析、战略谋划胜的，获胜几率比较大，反之获胜几率比较小。分析等多的人取胜几率大，而分析等少的人取胜几率小，没有分析的不能获胜！我从这些事上来看，胜负是显而易见的。
作战篇
孙子说：但凡用兵作战，轻型车辆千辆，重型车辆千辆，全副武装的兵士十万，能够向千里之外运送粮草，那么军需内外支出，招待使节的支出，军需的耗材，战车盔甲的维护支出等，算起来每天要消耗千金，根据这个标准准备充足菜可以让十万大军上战场。打仗要求快速获得胜利，反之时间太久会让军队士气锐气挫失，攻城之战容易兵力耗尽，长期战争容易让国家财力不足。如果军队士气锐气挫失，军资耗尽，国力空虚，则其他的诸侯会趁机攻打，即便有智谋的谋士，也不能够解决这问题。所以，带兵打仗只听过速胜，并没有见过长时间获胜。而且从未有过长期战争而利国的例子。所以，不非常清楚的了解战争的利害关系，就不能够知道如何有利用兵作战。
善于用兵作战的人，不会多次招募士兵，不会多次运送粮草，战争武器装备来之国内，但粮草应从敌方那边获取，因而军草粮食可足够。
国家因为军队远距离作战，需要长途运输而贫穷，长途运输导致百姓贫穷。驻军附近物价上涨，而导致百姓财产枯竭，财产枯竭则会赋税劳役加重。在战场上，军力缺乏军资不足，在国内物资匮乏，百姓财产的 70% 丧失，公家的财产，因为车马破损，盔甲弓箭，矛戟盾牌，牛车的损失达到 60%。
所以聪明的将领必须要在敌国内解决粮草问题，从敌国获取一钟粮食，相当于从国内供应二十钟，从敌国获取一石草料，相当于从国内供应二十石。
所以，通过激怒士兵，让他们杀敌，并且奖励那些杀敌的士兵物资财产。比如在车战中，抢得十辆车以上的，就应该奖赏先抢得战车的士兵，一旦抢到战车，立刻换上我方战旗，并编入我方车队，投降的士兵要善待他，这就是战胜敌人并且强大自己的方法。
所以，用兵打仗贵在快速取胜，而不是持久作战。
而真懂用兵打仗的将领，掌握着百姓民众的生死，国家的安危存亡。
谋攻篇
孙子说：但凡用兵打仗，让敌国全国降服为上策，用无力征服为次；让敌军全军降服为上策，击杀敌军全军为次；让敌军全旅降服为上策，击杀敌军全旅为次；让敌军士兵降服为上策，击杀敌军士兵为次；让敌军队伍降服为上策，击杀敌军队伍为次；因此百战百胜，并不是最高明的方式；不用打仗而让敌方屈服，才是最高明的方式。
所以，上等的用兵策略是谋略布局上击败对方，其次是外交上击败地方，再次是用武力战胜对方，下策是攻城。攻城是不得已的办法。制造盾牌大车，准备武器器械，需要三个月；堆砌攻城土山，又是三个月。如果将领不能控制住焦躁着急的情绪，让士兵爬城墙攻打，即便士兵死伤三分之一，但城池缺没有攻打下来，这是攻城的大忌。所以善于用兵的，不会通过战斗而让对方屈服，不会通过攻打而拿下城池，不会通过持久的战斗而战胜敌国，必须要用多方面的策略取胜于天下，从而兵力保全，还能获得全面的胜利，这就是用上策谋略布局的方法。
所以用兵作战，我方兵力是对方的十倍以上，则用包围的策略，五倍则进攻对方，两倍则分散敌方势力，势均力敌则战斗，少于敌方则逃离，不如敌方则避免战争，所以，在弱小的敌方面前坚定，在强大的敌人面前如不遵守作战规则会被俘虏。
将领，是国家的辅助，辅助谋划周密，则国家强大，反之辅助谋划疏漏，则国家必然衰弱。
所以，君王对军队的伤害有三种：不知道军队不可以前进而下令让军队前进，不知道军队不可以撤退而下令让军队撤退，这是束缚军队；不知道三军的具体战况，而处理三军的命令事务，让将士们疑惑，不知道怎么办；不知道三军的战术战略的变化而干预指挥，让将士们会感到无所适从。将士们疑虑迷惑，军力势必受到影响，则其他诸侯将会借机发难，这就是扰乱军纪，迷误战机。
所以可以通过五个方面预见胜利：知道是否可以战的的一方胜利；分析敌我双方势力兵力多少的一方胜利；上下齐心团结一致的一方胜利；做好充足准备的一方胜利；将领善于带兵打仗切君王不干预的一方胜利。这就是预知胜利的五个方面。
所以说：知道敌我双方的情况，才能每次战斗都不会失败；不知道对方但知道自己情况的，胜负一半；两方情况都不了解的，每次战斗都肯定会失败。
形篇
孙子说：以前善于用兵打仗的，先确保自己不能够被战胜，等待可以战胜敌方的机会。自己不能被战胜的因素在自己，而战胜敌方的机会在敌方一边。善于用兵打仗的，只能够保证自己不被战胜，但不能左右敌方，确保战胜他们。所以说：胜利只可预见，但不能设定，使之必然。不能战胜的时候，防守；能够战胜的时候，攻打；兵力不足选择守，兵力足够选择攻打。善于防守的，深藏兵力像是隐藏在深地之下；善于攻打的，军队似乎从天而降，攻其不备，这样才能够自保并且获得全面性的胜利。
预见胜利不过是平常人的能力，算不上有多高明；用兵打仗获胜，天下人都赞赏，算不上有多高明。就像是举起秋毫不算力大无穷，看见太阳月亮不算视力好，听见雷霆之声不算耳朵好。古代那些所谓能够用兵打仗的，只不过是战胜了那些容易战胜的敌人。所以善于用兵打仗的，没有惊奇的胜利，没有过人的智慧和名声，没有勇猛盖世的武功。所以他能打胜仗是因为谋划周全没有闪失，谋划周全没有闪失的，必然会战胜注定失败的。所以善于带兵打仗的，不但是自己谋划周全立于不败之地，还不放弃任何击败敌人的机会。所以胜者方常常是先准备充足才会交战，而败者常常是先交战再寻求胜利的机会。善于带兵打仗的，会研究战术战略，而且寻求胜利的方法，所以能够左右战争的胜负。
兵法：一是度，国土面积，二是量，物资资源，三是数，兵力计算，四是称，双方势力对比，五是胜，胜数计算。国土面积决定了物资的容量，物资的容量决定了兵力的数量，比较双方的兵力数量，强弱，即可大致算出胜负情况。
所以，胜利方如同以镒称铢，败者方如同以铢称镒。
胜利取决与民众，如同积水从千仞高的山上决堤而下的样子。
势篇 孙子说：管理大军如同管理小部队一样，依靠的是分而管理；指挥大军如同指挥小部队，依靠的是明确的信号表述；大部队与敌战斗而不失败，依靠的是奇正；像用石头砸鸡蛋一样轻易的攻击地方，依靠的是虚虚实实结合。
但凡带兵打仗，以常规军队与敌正面交战，以奇招出奇制胜。所以善于用奇招的，变化无穷如天地一样，招式之多如江河一样不会枯竭。像日月一样周而复始的变化。想四季一样去而再来。音不过五种，但五音组合变化，却多不胜数。颜色不过五种，但五色组合变化，也看不完。味道不过五种，但无味搭配组合，怎么也尝不完。战术运用不过奇正，但奇正的变化组合，却是无穷无尽。而且奇正又相互转化，循环交错，谁能用尽呢？
湍急的流水之所以能够漂动石头是因为水势；速度快的凶猛的鸟之所以能够捕猎到其他鸟，是因为节奏快。所以善于带兵打仗的，运势磅礴，节奏快速，势如拉满的弓箭有力，节奏如弩箭迅速。
战场混乱，但指挥不能乱；两方乱成一团，形成圆形可以不败。
乱的一方不如治军严明的一方，胆怯的一方不如勇猛的一方，弱小的一方不如强大的一方。治乱在于编制指挥；兵士勇猛胆怯在于声势气势；实力强弱在于战场表现。
所以善于调动敌军的，用假象迷惑对方，敌人必然盲目跟从；再给一些诱惑，敌人必然为利而来；用利益诱惑敌人，但时刻做好备战准备。
所以善于带兵打仗的，都力求多方位的胜势，而不是责求于军队。所以能够选择有用的人增加胜势。那些能够创造胜势的，指挥军队i 如同转动木头石头。木头石头的特点是在平坦地面是静止不动，在斜坡地面是滚动，方形静止不动，圆形滚动。所以善于带兵打仗的创造的胜势，就像是圆形的石头从千轮仞的山上滚下来，这就是势。
虚实篇
孙子说：但凡先入战地的等待敌人的安逸，后入战场而匆忙作战的劳累。所以善于打仗的，应该是调动敌人，让其劳累疲于应战，而不是被敌人所调动。
用利益诱惑敌人，让他来到自己设定的战场；通过设置阻碍让敌人不提前来到战场；所以如果敌人安逸，则使他疲惫，粮草充足则使他饥饿粮草缺少，按兵不动则使他动起来劳累。在他不注意时间和地方发起进攻。
行军千里而不疲惫，说明一路上没有阻拦，进攻肯定能获得胜利，因为是攻打的是他没有设防的地方。防守一定要稳定，也必须防守敌人不会进攻的地方。
所以，善于进攻的，敌人不知道该如何防守；善于防守的人，敌人不知道该如何进攻。
非常细小的细节，没有一丝的表现，非常神奇，没有点讯息，所以能够战胜敌人。
攻击敌人兵力空虚的地方，这样敌人就无法抵挡进攻；因为退兵迅速，速度之快，敌人无法追赶上。所以，当我想战斗的时候，攻击敌人的要害之处，让敌人就是深沟高垒，也不的不出来与我战斗；当我不想战斗的时候，我通过画出界限，让敌人无法与我交战。
所以，让敌人暴露而我方隐蔽，这样我们就能够专注，而敌人就容易分散。我专注于一点而敌人分散，有十处，那么我们就是以十倍攻打他的一点，那么我们人多敌人人少；能够以多人数共计少数的敌人，成功的机会就大。我所攻击的地方也不可以让敌人知道，因为敌人不知道我们攻击的地方，那么他们防备的地方就会变多，一旦防备变多，他们的能够与我们作战的兵力势必变少。
所以，防备前面则后方兵力少，防备后面则前方兵力少，防备左边则右边兵力少，防备右边则左边兵力少，各地都防备则各地兵力都少。兵力少是因为处处防备，兵力多是因为让对方防备，相对自己的兵力就多。
所以，知道交战的地点，知道交战的时间，才可以行军千里于敌人交战；不知道交战的地点，不知道交战的时间，则左军不能够救右军，右军不能够救左军，前军不能够救后军，后军不能够救前军，更何况是两军远的相距数十里，近的也有好几里。
以我的分析，越过虽然兵力强，人数多，但对胜利又有什么帮助呢？
所以，胜利是可以创造的，即便敌人人数众多，但可以是他们的兵力无法参与战争。
所以，计算分析可以知道得失的情况，骚扰敌方可以知道敌人的排兵布阵情况，查看地形情况可以知道是否为死生之地，试探性进攻可以知道敌方后续兵力。所以排兵布阵的极致是让一切无形；因为无形，所以没有办法被打探预测到，敌方军师也无法根据我们的情况设计谋略。
根据敌方情况布置的措施策略，即便告诉众人，他们都是无法理解的。人们都知道我能战胜敌人的办法策略，却不知道我是怎么设定出这些策略的。所以每次胜仗的策略是不一样的，因为制定这些策略的情况也是不一样。
兵士的就像水一样，水是从高处向低处流，所以用兵之道就是避开敌人部署严密的地方，而攻打兵力薄弱的地方。水因为地势而改变流向，用兵根据敌方情况改变战略。所以说用兵不是一成不变的，水也没有常态。能够根据敌人的情况，变化策略，并战胜敌人的，就是用兵如神。
所以五行是没有常胜，四季是轮回交替，白天时间有长有短，月亮也有阴晴圆缺。
军争篇
孙子说：但凡带兵打仗，将帅受命于君王，聚集兵士组成军队，和敌人对战，最困难的就是取得战争的先机。争取先机之难犹如把弯路变成直道，把不利条件变成有利条件。所以让敌人绕弯，用小的利益诱惑敌人，在敌人后发兵，但在敌人之前到达，这就是懂得迂直计策的人。
所以，军争有有利的一面也有危险的一面，如果全副武装去争利，那么行动就会缓慢，如果轻装上阵，那么重要的装备会损失。所以卷起盔甲，昼夜不停，快速行军，走百里而去争利，那么三军的将领会被俘虏。健壮的士兵先到，疲弱的士兵后到，可能只有十分之一的兵士赶到，赶五十里去争利，前军将领会受到挫折，而且只有一部分兵士赶到；赶三十里去争利，只有三分之二的兵士赶到。所以，军队没有战争的武器就会死亡，没有粮草也会死亡，没有物资也会死亡。</description>
    </item>
    
    <item>
      <title>区块链:向左走还是向右走</title>
      <link>https://tourcoder.com/blockchain-left-or-right/</link>
      <pubDate>Sat, 13 Jan 2018 07:22:35 +0000</pubDate>
      
      <guid>https://tourcoder.com/blockchain-left-or-right/</guid>
      <description>我非常认同2018 年将会是区块链的爆发年，但我感觉 2018 年估计也会是造币骗钱更疯狂的一年。
区块链不是洪水猛兽
在加密货币疯狂的背后，有些人谈虎色变，提到区块链就觉得是骗子，这个观点是错的。他们把区块链技术和加密货币画上了等号，诚然区块链技术被更多人所认知是因为比特币的爆发，但比特币却代表不了区块链的技术，加密货币只是区块链技术一个方面的应用而已。
它的其他应用，比如智能合约，加密隐私更应该被关注。
造币（加密货币）
利用现在已经存在的方式造币，很简单，也就是半个小时不到的时间，这里与其说造，不如说是生成，整个过程成本极低，包教包会，我之前就造了个币，我没有发行这个币的原因是这只是我学习下造币方式，只是玩的。
割韭菜与骗局
这几年被骗惨了，做移动支付又认识了形形色色各种人，见识了多种多样的骗局后，我好好的研究了下 自古以来的骗局故事，发现一个有意思的事情，自古以来骗局方式都没有变过，玩法始终就是那么几样，不同的是包装不一样。
我先讲个故事：
比如我想做一个项目，但现在手上没有钱，这时我找很多个朋友聊聊，我说我这里有个项目，未来非常好，你们看这个是我的计划书，你们投资我一笔钱，我给你们多少股份，但是呢，我给你们的股份方式不一样，我不把你们写入我项目或者公司股东名单中，我给你们一百张纸，表示你们拥有一百万份股，重点是这些纸你们是随时可以和任何人交易，自由的卖掉换钱，不需要我这边同意，而且这些纸的价值是会涨或者跌的，不只是受我项目的影响，还会受到你们彼此交易的影响，让更多的人认同这些纸，来买这些纸，一天之内涨个几百倍几千倍，你们说刺不刺激？
造币炒币割韭菜就是上面故事描述的一个大致流程，它是风险投资的变种，它说是众筹，但却没有众筹规范的结尾，虽然众筹现在也很稀烂。它的近亲有集资众筹，P2P 等等。
这里面还有一个有趣的事情就是你会看到很多区块链产品的白皮书里面都有老外，然后你去调查下这些老外的情况，你会觉得非常好笑；还有这些产品的创始人什么的都是学历很高，履历非常漂亮，各种博士，还是国外高等学府的，因为他们喜欢用一句宣传语 “要想火车跑得快，全靠车头带”；而且最近还冒出了一些加密货币找了一些很网红脸的女的来，具体是哪几个我就不点名了，你们很坏啊，美人计都用上了，哈哈哈哈。
但我要强调的是，并不是所有的区块链技术或者币都是骗人的，这和项目本身，操作者有太大的关系了，就像一些投资理财是真实赚钱的一样。
如何应对被割韭菜
这事没法应对，因为这是人性贪婪的问题，还是看韭菜本身的意识，在这些东西面前，胆子小一点，比较好。
不要把自己不清楚，只是一些概念性的，自己没有实际操作过的或者自己道听途说的东西，介绍给其他人。
如果你进入后，发现进入的是一个坑，也请不要拉另外一个人入坑。
另外一个想法：比如一个币一分钱，你买 10000 个也就是 100 块钱，然后就不管了，算是给以后买个机会，这个想法是可以的，投机嘛～但也仅限于在研究对方产品后，觉得值得再买。
我和区块链
  加密货币
比特币就不说了，当年从一个网站领取的，后来随手捐给了某社区的版主，现在一个没有。 第一次持有的币是瑞波币，是几年前程序员的聚集地 Github 送的，大部分捐赠给了开源社区，现在持有极少，总价值也就是一千块钱不到，好像瑞波币曾在我们国家的资金传销组织名单中出现过。
  区块链技术产品
算是打个广告，目前我在用区块链技术做两件事
  改造移动支付产品 做移动支付，我最痛苦的不是发展客户，不是利润，而是被人所左右，中心让我们没有办法让我们快速发展，什么都是中心说了算，中心正确的指导思想我们是要遵守的，但如果你的发展速度和思维远远超过了中心，而你又没有那么多的资源财力去解决这个难题，那么这种感觉就是极为痛苦的，所以只能想办法通过技术手段来改变，区块链就是一个很好的技术手段，目前通道这问题已经解决。
  区块链的钱包 研究下载了几百个钱包，和一两百位币的买家卖家（可以理解为职业炒币的）聊过他们的痛点，所以尝试做了这么一个钱包，计划本月底上线。
  智能合约 我曾很多次和人说过区块链的一个核心在智能合约，政府以后肯定会采购这类的产品，目前我也做这个方面的研究，但目前只有一个 demo 性的东西，没有具体的产品出来。
    </description>
    </item>
    
    <item>
      <title>What&#39;s my stuff, EDC :)</title>
      <link>https://tourcoder.com/stuff/</link>
      <pubDate>Sun, 31 Dec 2017 04:32:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/stuff/</guid>
      <description>2023 年 好几年没有写了，今天突然想写主要是看到好几个 EDC 的视频，这些分享者每天携带的东西之多考虑之细，让我感觉很夸张。要知道我是一个连多带一根数据线都会嫌麻烦的人。废话少说，先上图。
 依旧是两个双肩包轮流换，包里的东西如下
MacBook Pro/iPad Pro 基本每次都只带一个。如果我当天事情主要是写点代码，基本带 MacBook Pro；如果我的当天主要是做产品设计学习等，基本带 iPad Pro。
水杯 我有很多个水杯，但最后还是膳魔师深得我心。
AirPods 随身携带，但基本不用。
iPhone XR 我的主力手机，基本也只带它。
充电宝 京造 10000 毫安的充电宝，已经用坏一个。
Apple Watch 怎么说呢，以前我很后悔买它，但自从之前生了一场病后，我发现它作用很大。
充电器和充电线 氮化镓的充电器，唯一的缺陷是双脚插头，在一些墙壁上插得不稳。2 米长的双 type-C 充电线，够长够好。
卡包 其实这是 10 多年前买的钱包的内包，钱包早丢了。里面放了两张银行卡（信用卡，借记卡），几张现金，一张车锁卡，交通卡驾照身份证什么的已经电子化了。
笔和纸质笔记本 依旧还是喜欢在纸张上写点东西，但纸质笔记本也慢慢不带了，笔是肯定带的。
手帕纸和湿厕纸 个人卫生还是要注意下的，尤其我有痔疮，湿厕纸很重要。
另外，我的包里还不定期的有一个乐扣的饭盒，里面是我做的色拉是午餐。
2019 年 再过两天就要进入 2020 年了，整理了下今年的工具，其实和去年写的变化不大
包里的东西 我有两个双肩背包轮流换
MBA 电脑对一个程序员来说比较重要的，电脑充电器
iPad 极少带出去，但我在尝试慢慢用它取代电脑
iPhone 我的主力手机
Apple Watch 依旧是我比较后悔买的数码产品
充电线 Lightning 的充电线
Airpods 虽然随身携带，但我很少用，主要是不习惯耳朵里总是塞个东西。
牙签 随身带个牙签太重要
得宝手帕纸
湿厕纸
卡包 能放身份证/驾照/两张银行卡</description>
    </item>
    
    <item>
      <title>CentOS 和 Ubuntu</title>
      <link>https://tourcoder.com/centos-ubuntu/</link>
      <pubDate>Wed, 20 Dec 2017 07:21:49 +0000</pubDate>
      
      <guid>https://tourcoder.com/centos-ubuntu/</guid>
      <description>在开始之前
  查看 Linux 内核版本信息，通过 cat /proc/version，或者 uname -a 或者 uname -r
  查看 Linux 系统版本信息，通过 cat /etc/issue 或者 cat /etc/lsb-release 或者 lsb_release -a
  CentOS 学习笔记 安装篇：自动安装和源码手动安装
CentOS 下可以用 yum install 的安装方式来安装需要的软件，也可以通过源码安装的方式来安装需要的软件。
如果需要源码安装，直接安装编译工具和一些依赖包，包你可以根据自己的需要进行安装
yum -y install gcc gcc-c++ autoconf automake yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel 增加用户，这里你可以不用操作
sudo groupadd -r nginx sudo useradd -s /sbin/nologin -g nginx -r nginx 去官网下载源文件，官网地址：nginx.org
wget http://nginx.org/download/nginx-1.13.7.tar.gz 解压，并编译</description>
    </item>
    
    <item>
      <title>初步使用几个“号”</title>
      <link>https://tourcoder.com/talk-about-the-mps/</link>
      <pubDate>Mon, 11 Dec 2017 07:21:15 +0000</pubDate>
      
      <guid>https://tourcoder.com/talk-about-the-mps/</guid>
      <description>一个微信公众号，带火了一批公众号作者的同时，也让各大公司出了自己的号，为了运营的需要，我注册了这些号，在这里简单的分享下这些号。
  注册过程 这些号注册基本大相径庭，都挺好注册的，基本提交个资料就能正常的注册下来，但也有比较麻烦的，比如大鱼号，一点号，新浪的看点号，他们需要打印纸质的许可证，盖章签字，然后拍照提交。
  发布文章 文章的发布，是衡量一个号的重要因素，能够让创作者专注于自己的写作，这是一个很重要的事情，几家的编辑器都带了自动上传图片的功能，大概就是默许你能够复制粘贴吧。
  审核机制 个人比较讨厌今日头条的头条号，机器人审核机制是非常差的，尤其是在对待推广这块，不是一般的差，比如买买买，同款等这些字是不能够出现的。 网易号自身的地位应该就是想圈个地，刷下存在感，为什么怎么说，截止到我写这篇博文到现在，已经过去 20 几个小时了，我在上面发的一篇文章，还在审核中的状态。 其他几个号都还好。
  流量 目前来说，流量最好的还是腾讯家的，其他几家就那样，让我严重怀疑他们的产品的用户存活量。今日头条的情况有点意思，更高质量的文章经常得不到推荐，这点还需要继续研究下去。
  基本就是这么一个情况，后续有什么发现，我会继续更新。</description>
    </item>
    
    <item>
      <title>新的商业模式--骗傻逼</title>
      <link>https://tourcoder.com/new-business-model-called-fooling-sb/</link>
      <pubDate>Mon, 11 Dec 2017 07:19:18 +0000</pubDate>
      
      <guid>https://tourcoder.com/new-business-model-called-fooling-sb/</guid>
      <description>两三年前，曾说过，这社会已经进化出一个新的商业模式叫骗傻逼。这话怎么讲呢？比如此刻，我坐在星巴克里面边写东西边等人，隔壁两个人的聊天就很好的演示了一遍我说的这种商业模式。
隔壁桌的两个人都是很典型的人
女一，20 几岁，是骗方。
女二，82 年的，是傻逼方。
通过他们的聊天，可以判断他们也认识有段时间了，大致的情形如下，女一邀请女二加入到一个电商 APP产品的推广中来，只要交 19,800 元就可以成为这个产品的推广人员，然后大谈特谈现在互联网时代，还有这个电商 APP 有多好，有多少台湾人，多少教授靠这个发了大财等，我就不一一叙说了。
分享一个小经验，如何辨别自己是否进入了这个模式
  绝大多数情况下，这个世界是没有很轻松，发发朋友圈就能轻松赚到很多钱的，如果有，那可能是在朋友圈卖“高级”肉的。
  对方和你说他的商业模式，一定要问清楚，这个模式中你赚钱的点是否能够落地，落地的难度是多少，他的这个商业模式赚钱的点是否落地。
  什么样的人做多少钱生意，一个自己钱少的人，而且过往没有过成绩的人，和你做一个上亿的生意，这个基本不用当真了。
  最简单粗暴的方式，产品在哪里？产品的用户多少？创始人的真实履历？
  </description>
    </item>
    
    <item>
      <title>Slim 初体验</title>
      <link>https://tourcoder.com/new-to-slim/</link>
      <pubDate>Thu, 02 Nov 2017 07:18:23 +0000</pubDate>
      
      <guid>https://tourcoder.com/new-to-slim/</guid>
      <description>最近喜欢上了 Slim 这个小型的 PHP 框架，用它写 RESTFUL API 感觉好极了。官方地址：Slim Framework，Github 上的开源地址。
根据官网的说明，建议使用 Composer 来安装，具体步骤如下
  安装 Composer，如果你已经安装好，这步略过（具体怎么安装 Composer，请去这里查看）
  然后用 Slim-skeleton 安装，执行命令
  php composer.phar create-project slim/slim-skeleton [your-project-name] 等待完成，因为一些因素，速度会慢一点。
进入到创建好的文件夹，执行命令
php -S localhost:8080 用浏览器访问 localhost:8080，就能看到具体的内容，至于更多的参数用法，请自行去查询。
下面是一个 API 的简单示例
&amp;lt;?php require &#39;vendor/autoload.php&#39;; $app = new Slim\App(); $app-&amp;gt;get(&#39;/article&#39;, function ($request, $response, $args) { return $response-&amp;gt;write(&amp;quot;You visit article&amp;quot;); }); $app-&amp;gt;get(&#39;/article/{id}&#39;, function ($request, $response, $args) { return $response-&amp;gt;write(&amp;quot;You visit artile&amp;quot; . $args[&#39;id&#39;]); }); //$app-&amp;gt;post, $app-&amp;gt;put, $app-&amp;gt;delete 等是类似的写法 $app-&amp;gt;run(); 这会我体验下来，和我之前用的 CI 比较起来，它更为直接轻便，还是值得一用的。</description>
    </item>
    
    <item>
      <title>半吊子微软</title>
      <link>https://tourcoder.com/give-a-nickname-mr-half-to-microsoft/</link>
      <pubDate>Wed, 18 Oct 2017 07:17:04 +0000</pubDate>
      
      <guid>https://tourcoder.com/give-a-nickname-mr-half-to-microsoft/</guid>
      <description>心血来潮，给微软起了个绰号 “Mr Half”，中文就叫他半吊子吧！他们热衷于换名字的游戏，有句玩笑话说，微软是专注改名几十年！我这里就重点拿这些年让我痛心的产品来说一说吧。
邮箱
hotmail 应该是微软比较成功的网络产品了，但很可惜这是他们收购的，而且这么多年来，他们在邮箱上面不思进取，就想着玩换域名的游戏，从 msn.com 系列，到 live.com 系列，再到现在的 outlook.com，在 outlook.com 刚推出来还让我眼前一样，但也只是 UI 好看多了。
个人邮箱如此，企业邮箱就更不用说了，我购买了 office 365 的企业邮箱等一些配套的服务，简直是灾难，我给他们的技术客服提交了 50+ 的问题，真正白瞎了。
题外话：Apple 公司和微软有得一拼，也是一个没有做网络产品基因的公司，他们也热衷于换域名游戏，从最早的 mac.com，换到后来的 me.com，再到现在的 icloud.com，换起域名的作死程度一点不逊色微软，其实乔布斯真的没做好 Apple 的网络产品，我个人觉得 me.com 是最好的个人网络品牌，甚至完全可以做成一个 ID。
outlook app
这款应用也是微软收购的，然后改名成 outlook app，没错，又是改名。刚开始我一直用它的原因是的确很好，尤其对我这样的 Gmail 重度用户来说，免翻 Qiang 就可以收发 Gmail 邮件，即便它被爆出把我们的邮件信息私自传送到一个地方，即便它因为访问我的邮件，Gmail 经常发邮件给我说非法登录，但我还是在用它，但最新的版本却 bug 越来越多，提交的 bug 没有修复，新版本又出了其他的 bug，很让人苦扰。
Wunderlist
这是一款非常不错的 GTD 工具，可惜被微软收购了，即将停止更新使用，然后么，微软又让这个团队去做了一款新的 GTD 工具叫 Microsoft TODO，没错，依旧是专注于改名，我在第一时间也体验了下，我只能说还是好好的做 Wunderlist 吧。
Skype
05年因为工作关系，我就开始用 Skype，以前一直好好的，虽然错过了好几个黄金机会，但自动被微软收购后，臃肿不堪，定位模糊。
Microsoft Account
没错，就是微软的账户，它的账户系统弄得特别复杂，又是个人版本，又是组织或学校版本的，每个服务和账户之间还经常性出问题，其中安全性就是一个很重要的，就拿这两天来说吧，我用了下它的 VSTS，因为我提交代码过于频繁，导致的结果就是我账户被封了，说 有人可能利用你的账户发送了大量的垃圾信息..，我也是呵呵！
至于其他的产品，我没有什么感觉，比如 Windows，除了打游戏外，我基本不用，总之，就如我和很多人说过的一样，微软是典型的没有做网络产品基因，过去如此，现在如此，以后估计还是如此！</description>
    </item>
    
    <item>
      <title>吃相难看</title>
      <link>https://tourcoder.com/say-hehe-to-some-companies/</link>
      <pubDate>Mon, 16 Oct 2017 07:15:36 +0000</pubDate>
      
      <guid>https://tourcoder.com/say-hehe-to-some-companies/</guid>
      <description>做安卓开发的基本都知道安卓系统权限相对比较开放，很多权限都能请求，其实 iOS 也差不多，但因为 iOS 的应用都需要经过审核才能够上线，而安卓的应用任何人都可以发布，所以导致的相对来说，安卓更加不安全。
而一些大公司的做法就显得更恶心，不说别的，就看下面两张图吧
  第一张是 outlook，微软出的邮件客户端，它是正面的例子，作为一个邮件客户端，它请求了该请求的权限 &amp;ndash; 通讯录。
第二张是另外一个邮件客户端，出这个邮件客户端的公司也是数一数二的超级大公司，但看看这个邮件客户端请求的权限&amp;ndash;通话，通话记录，发送彩信，相机，录音等等。
我就想问问下面的这家公司，你们要这么多权限做什么，吃相是不是太难看了点？早些年还爆出他们在应用后台偷用户信息的事件。
这也是为什么我基本上都不会用这个公司产品的原因，吃相难看，太恶心，纯吐槽</description>
    </item>
    
    <item>
      <title>Fluid App 初步使用</title>
      <link>https://tourcoder.com/try-fluid-app/</link>
      <pubDate>Thu, 12 Oct 2017 07:11:58 +0000</pubDate>
      
      <guid>https://tourcoder.com/try-fluid-app/</guid>
      <description>昨天有朋友看了我博文后，问了我几个问题
  怎么封包 Gmail 的，性能如何？
Gmail 本身的 Webapp 已经做的非常好，秉着原生就是最好的原则，加上我实在没动力继续开发之前写的邮件客户端了，我产生封包 Gmail 的念头，主要由三个部分组成
  Webview：载入 Gmail 页面，对 Gmail 的操作
  Gmail API：用 swift 做了一些定制性的东西，比如通知
  科学性：内置无 wall
  性能还行，对我来说很好用了，而且比我之前写的邮件客户端要轻便。
  fluid 用过吗？能不能帮忙做点修改？
fluid 听说过但没有用过，随即下载研究了下，朋友付钱买了软件，挺有意思的软件。这个软件的作用就是帮你把任何一个网页打包成一个 macOS 下的 APP，其实我更喜欢叫快捷方式，不过它自带了一些接口，可以通过 userscripts 进行一些修改。
朋友让我帮忙修改的网页是他客户的东西，不方便透露，下面我用 Gmail 来做示例。
打开软件，并参考下图填入相关信息
 点击 Create，稍等一会，你的 Gmail 应用已经诞生了，很方便是不是？
运行刚才创建的 Gmail App，你可以点击顶部菜单 Gmail-Preferences，还可以设置
 其它更多的设置自行研究，我重点说下它的 userscripts，点菜单栏中的 Window-&amp;gt;userscripts
 点左下角的 +，创建一个 Gmail，在右上部填写 Gmail 的几个地址，右下面就是你的 js 工作区。fluid 官方也提供了一些接口，Fluid API。</description>
    </item>
    
    <item>
      <title>Github 和代码权限</title>
      <link>https://tourcoder.com/repos-roles-in-github/</link>
      <pubDate>Mon, 09 Oct 2017 07:11:10 +0000</pubDate>
      
      <guid>https://tourcoder.com/repos-roles-in-github/</guid>
      <description>在经过一圈的折腾后，我们又回到 Github，用它来进行协同开发，之前我们用过其他同类的服务(commitcode,bb)，也用开源软件搭建过私有服务(gitlab,gs)，甚至基于开源自己也二次开发了一套，但现在全都抛弃，回到Github，主要有两点：
  Github 社区氛围是真的太好了，让程序员在这样的氛围下，利大于弊
  Github 配套的延伸产品很多，拿来即可使用，省事
  但它的问题显而易见，比如权限问题，其实这个问题不只是我们遇到，相信很多公司都遇到了这样的问题，尤其是一些做产品的早期创业公司。
对一些大公司来说，在协同开发的过程中，它有足够的能力保护代码的安全，软性的方面有大公司的强势和开发人员对公司的敬畏等，硬性方面有公司的规章法律文件，以及即便拿到代码也只是部分代码等，所以保护代码在大公司并不是非常重要的事情，当然也有大公司权限做得很变态的，比如 Google，它们自己开发的工具已经让权限控制到每个文件。
但小的创业公司就不这样了，人少，没有规范的制度，加上早期的产品不会太复杂，基本每个开发都会很容易的拿到所有的代码，一旦发生这样的恶意事件，分分钟就会有一个竞品出现，而 Github 这样开放式的 workflow 就容易让这一担忧变成现实，所以保护代码可能尤其显得重要。
现在我们强行要求的开发流程是 fork -&amp;gt; clone -&amp;gt; develop -&amp;gt; push -&amp;gt; pull request -&amp;gt; code review -&amp;gt; merge，这是一个非常漂亮的快速开发流，但因为 Github 的弱权限管理，当只有一个 repo 的时候，这个流程会导致所有的开发人员都会很轻易的获得这个 repo 里所有的代码。
目前我们的解决办法是：
  一个项目按模块的方式创建多个 repo，以 repo 为单元进行开发，这样做好处是即便发生代码丢失，最多也是丢失一个模块的代码，而不会获得整个项目源码，但这样做的坏处是多模块之间的协同工作就会很痛苦。
  一个项目只创建一个 repo，但核心部分的代码全部封装加锁，这样做的好处是即便发生代码丢失，核心代码的安全至少有个保障，但这样做的坏处是必须要有人写这些核心的代码，对早期创业团队的人员要求会很高。
  我们想要的：
  一个项目只有一个 repo
  在这个 repo 上有更为细节化的权限控制，做到每开发者只能得到自己的代码
  我们可能会做的：
 在之前自己开发的软件上加入这样的功能，时间是个问题！  最后的话才是最重要的，如果你没有办法保证你的代码安全，不如就对所有开发同事公开，甚至开源吧。</description>
    </item>
    
    <item>
      <title>以太坊开发笔记</title>
      <link>https://tourcoder.com/yi-tai-fang-kai-fa/</link>
      <pubDate>Tue, 12 Sep 2017 16:00:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/yi-tai-fang-kai-fa/</guid>
      <description>通过椭圆曲线算法生成钥匙对（公钥和私钥），以太坊采用的是secp256k1曲线。公钥采用uncompressed模式，生成的私钥为长度32的16进制字串，公钥为长度64的公钥字串。公钥04开头。 把公钥去掉04，剩下的进行keccak-256的哈希，得到长度64的16进制字串，丢掉前面24个，拿后40个，再加上&amp;quot;0x&amp;quot;，即为以太坊地址。 整个过程可以归纳为：
Get Private-key Private-key -&amp;gt; Public-key Public-key -&amp;gt; Address
以太坊合约 pragma solidity ^0.4.26; contract Token{ uint256 public totalSupply; function balanceOf(address _owner) public constant returns (uint256 balance); function transfer(address _to, uint256 _value) public returns (bool success); function transferFrom(address _from, address _to, uint256 _value) public returns (bool success); function approve(address _spender, uint256 _value) public returns (bool success); function allowance(address _owner, address _spender) public constant returns (uint256 remaining); event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); } contract DEMOToken is Token { string public name = &amp;quot;DEMO&amp;quot;; uint8 public decimals = 2; string public symbol = &amp;quot;DEMO&amp;quot;; function DEMO(uint256 _initialAmount, string _tokenName, uint8 _decimalUnits, string _tokenSymbol) public { totalSupply = _initialAmount * 10 ** uint256(_decimalUnits); balances[msg.</description>
    </item>
    
    <item>
      <title>Sticker 欣赏</title>
      <link>https://tourcoder.com/we-love-stickers/</link>
      <pubDate>Tue, 05 Sep 2017 07:10:01 +0000</pubDate>
      
      <guid>https://tourcoder.com/we-love-stickers/</guid>
      <description>作为有点 geek 范的程序员，很多人都喜欢在在电脑上贴一些 sticker，其实有时候 sticker 就是我们的信仰之一。
我比较喜欢工具型公司的 sticker，比如 GitHub，Google，另外我也会自己设计定制一些。
GitHub 章鱼猫系列
章鱼猫，英文名 Octocat，是 GitHub 的吉祥物，其实这里倒是建议每个科技创业公司都应该弄个吉祥物，总觉得一个吉祥物是企业文化的一部分，下面是章鱼猫照片图
  怎么样，不错吧，这里还有一个神奇的网站 https://octodex.github.com/ 里面有各式章鱼猫。
一般，我的电脑上都会有一个位置给章鱼猫。
Google 家的套餐
把我喜欢的公司排名的话，Google 应该是排在前三位的，所以，对于他们家的 sticker，以前我都非常喜欢。
 但有点遗憾的是，Google sticker 的质量没有 GitHub 的质量好，而且去年参加 Google 开发者大会，送的贴纸质量更差，我都没有用。
Google sticker 我现在基本都不贴了。
以上说到的这两家的 sticker 都可以在他们的官方商店买到，当然在某宝上也可能买到。
自制 Sticker
我自己也设计制作过一些 sticker，这些年下来 20 款还是有的。
 这是前两年我一台只贴了自制的 Sticker 的电脑，我一般从某宝找商家做。</description>
    </item>
    
    <item>
      <title>好椅子对程序员很重要</title>
      <link>https://tourcoder.com/chair-is-so-important/</link>
      <pubDate>Tue, 05 Sep 2017 07:09:23 +0000</pubDate>
      
      <guid>https://tourcoder.com/chair-is-so-important/</guid>
      <description>年轻的时候坐硬板凳工作都没事，但随着年岁变大，一把好椅子就显得异常重要。至于如何选择一把合适的椅子，我至今也没有一个考察标准，我就写一下我买过的椅子（稍微好一点的），并说说感受。
百元级别
这个级别我买过一款西昊的，当时价格是 500 多，刚才去某东看了，现在价格是 400 多
 这椅子总体来说，还是蛮舒服的，不足的地方是不知道是不是我的体重问题，我感觉它总是向一个方向偏。
千元级别
千元级别的这个椅子种类很多，我买这个椅子是受游戏启发。我一直喜欢打游戏（以前玩星际，现在玩守望先锋），一次看游戏直播，突然想到这些职业选手每天要坐在椅子上训练十几个小时，那么他们的椅子就应该很好，所以，就入了这个椅子。
 这个椅子的牌子叫 DXRACER，在电竞圈子里比较有名，它也有千元以下的，我用下来的确不错，就是夏天坐着不舒服。
万元级别
提到这个级别的椅子，不得不说 Herman Miller Embody，关于它的信息，随便搜索下就可以搜到很多，是国内外很多公司的标配。
 这个椅子我实在说不出什么缺点，我也只是坐了半年，就被人 “ 讹 ” 去了。
站立办公
我也尝试过一段时间的站立办公，刚开始还好，但过了一个多星期后，腿是不疼了，但我的注意力却无法集中，随放弃。
最后，我现在用的椅子是另外一个牌子的电竞椅子，千元级别的，感觉一般。</description>
    </item>
    
    <item>
      <title>Hello Android, Take a break iPhone</title>
      <link>https://tourcoder.com/hello-android-take-a-break-iphone/</link>
      <pubDate>Sat, 08 Jul 2017 07:08:42 +0000</pubDate>
      
      <guid>https://tourcoder.com/hello-android-take-a-break-iphone/</guid>
      <description>因双卡的需要，又不愿意拿着两个手机，索性入了款安卓手机。
先看下两个手机首屏的对比
 安卓手机
 iPhone
之前测试 APP，安卓手机也买过一些，什么米，什么想，什么酷，什么族等，最后都沦落为只是测试手机，但这次买的这款手机却让我喜欢上了安卓，说下我挑手机的几点。
  外形颜值
我对手机外形的要求比较高，正面颜色统一，不要支离破碎，不要带一些莫名其妙的 logo，背影也是同样的要求，现在好多手机背面正面放了好多 logo，简直就是神经病。手机薄一点，屏幕尺寸小一点，方便放在口袋。
  严谨的工业制作，合理的工业设计
不是太严谨的工业制作是很多安卓手机的一个病，手机出现脱胶，边角翘起来，按键不到位等问题让人很闹心，工业设计也是，我遇到过最奇葩的设计就是某家的手机，扬声器是放在手机背面的，尼玛我是真的服了。
  系统安全
iPhone 上我下载使用一个 APP，下载完就用，并不会去考虑这个应用是否安全，这得益于 iOS 的封闭。
安卓开源，各手机厂商都会修改自己的系统，某些厂商本身就是个大流氓，比如他们肆意推送一些信息，都不需要经过同意，甚至没有办法关掉这些。
上面的 App 也是，它们什么权利都要，比如某大公司的钱包 APP 居然连发短信的权限都要，还有就是它前段时间爆出来，在安卓版本在后台偷偷拍照，偷偷录音，并且上传到它们的服务器，就问你怕不怕？
  耗电问题
我不知道是否是我的 iPhone 太老了，最近掉电非常快，常常半天时间下来，就要充电。这部安卓手机今天陪我在外面待了一天，从早上出门前的 83% 到现在 26%，还是可以的。
基本就是这么一个情况，至于这部手机是什么，我就不说了。另外给点安卓手机的小建议
  还是别用安卓了
大多数女生，年岁大点的人，对手机权限等不太懂但又注重安全的人，还是用 iPhone 吧。
  从安全的应用商店下载应用
除非没有自己需要的 App，不然我都会从 Google Play 官方应用商店下载应用，没别的原因，只是因为我相信 Google。千万别去那些小的，不确定的地方下载应用，风险太高。2011 年的时候我都还搞过一个安卓应用的分享平台呢，就是现在应用市场的雏形，后来没继续做的原因是跑去做外包了，没有对分享的 APK 有个有效的审核管理，最后被人骂惨了，索性关了。
  每一个应用下载后一定要控制权限
一定要在系统的权限控制设置里，对每个 APP 都严格控制权限，必须。
  </description>
    </item>
    
    <item>
      <title>我看苹果和微信的互怼</title>
      <link>https://tourcoder.com/apple-vs-wechat-and-others/</link>
      <pubDate>Sat, 17 Jun 2017 07:07:12 +0000</pubDate>
      
      <guid>https://tourcoder.com/apple-vs-wechat-and-others/</guid>
      <description>前些日子，苹果和微信的互怼的事情闹得沸沸扬扬，基本向着当年 3Q 大战的二选一方向而去。一时间各路神仙，妖魔鬼怪都站出来抨击苹果公司，这事最后会变成什么样子，不得而知，这里自问自答一些有趣的问题。
什么人在借这件事抨击苹果公司？
时下，知识收费内容付费是一个很热的风，目前闹得比较多的是这类平台，以及靠这些生存的人。
打赏到底算什么
打赏行为我并认为是赠予行为，赠予行为是具有偶然性的，而且被赠予的人是不需要付出什么的（除非被要求），但打赏却没有这个属性。我们完全可以把在公众号写文章看成是一个自己出版了一份杂志，所写的每一篇文章都是一份投稿，尤其是那些媒体，团队的公众号就更不用说了，而打赏恰恰就是读者在买这份稿子所支付的钱，只不过这个价钱没有提前标注出来，也不是规定必须要付钱。
至于其他的那些主播平台什么打赏之类的，根本就是商品好不好，和游戏应用的道具什么的，完全没区别。
微信也不干净
我不觉得微信有多干净，我没有去问那些有打赏功能的公众号，他们所收到的打赏费用是否要分给微信，但我知道的是，我通过二维码收到的打赏，我提到自己的账户，他是要分钱的。我还知道的是微信利用一些规则，做一些看似的小动作实则大阴谋的事，比如小程序，最近也开始出现广告，甚至搜索量，排名的迹象，完全违背他当初嘴上说的初衷。 所以，拜托，大家都是商业公司，都是从自己的商业利益考虑去做事情，别搞得自己是那个唯一为用户考虑的圣人一样，恶不恶心？
最后会变成二选一么？
3Q 大战中二选一情况出现的可能性不大，一是 360 本身就干不过 QQ，二是让一个恶名在外的安全软件去和一个伪善的关系联络软件去斗，简直是痴人说梦，这样说吧，非专业点的人士，只要不困扰到他，对电脑安全并不在意，而让他一天不用 sns 之类的工具和他人聊一会，他会疯。
而这次微信没有这个绝对能力让别人二选一，一方面手机现在人人必备，但打赏不是，从人性考虑，打赏还需要我花钱，现在连我花钱的路子都没有了，更好。二是我们更多的是看到很多人换手机，其中大部分都是把 iPhone 换更新的 iPhone，极少见到安卓手机在那边换来换去的。至于那些在那边叫的不用苹果的，很多的是那些嘴上标榜我爱国货的愤青，被媒体舆论一鼓动，就亢奋起来。
这里我只问一个问题，安卓手机使用的人这么多，基数这么大，都跑去用安卓打赏了，为什么在苹果出台这个政策后，却出现所有媒体方面的收入剧降呢？
最后的可能性会是什么
我的理解，很大可能结果就是用户来背锅，如果绕不开苹果的这个支付要求，那就涨价呗。怎么个意思呢？
比如一个用户在其他平台（安卓，电脑端）打赏买道具充会员之类的，可能只要 10 块钱，但在 iPhone 上可能就要花 14 块多钱，然后就这样，用户背锅耗下去。</description>
    </item>
    
    <item>
      <title>Docker 学习笔记</title>
      <link>https://tourcoder.com/study-docker/</link>
      <pubDate>Sat, 10 Jun 2017 07:05:02 +0000</pubDate>
      
      <guid>https://tourcoder.com/study-docker/</guid>
      <description>之前学习 Docker 时，在本子上做的笔记，整理下，放在自己的博客上，方便保存，同时也温习一下，需要注意的是，这些内容是我学习后的解释，便于理解，而非官方的解释。
架构
 左边是传统的虚拟化架构，右边是 Docker 技术。
和传统的对比，Docker 的特点有运行环境一致，性能高效，系统资源利用充分。 三要素
Docker 有三要素，镜像 (Image)，容器 (Container) 和 仓库 (Repository)。
镜像 (Image) 是带有最高权限（root）的最小服务单元，文件系统，它是基础。
容器 (Container) 实际运行的实体，可以理解为是一个进程，它和镜像的关系像是类和实例，很多的操作就是对它的操作，比如创建，删除，停止等。进程里不存数据，所以容器里也应该不写入数据，数据应该写入数据卷中，或者在上图中的母机中。
仓库 (Repository) 镜像分发，粗略理解参考 Github，使用率比较高的是 Docker Hub，国内也有一些镜像。 安装
进入官网下载，macOS 版，windows 版 和 ubuntu 版本，其他更多版本，查看官方。
我用的是 macOS，可以通过 Homebrew 安装
brew cask install docker  安装完成。
Docker 镜像
三要素之一，可以理解为是一个最小化的、完整的、带有 root 权限属性的服务单元，文件系统。
常见命令
  获取 docker pull [OPTIONS] NAME[:TAG|@DIGEST]
从镜像中心(registry)处获取一个镜像，默认来自 Docker Hub，主要的参数有 -a, --all-tags 获取仓库中所有的标签的镜像 --disable-content-trust 跳过镜像验证，这个是默认选项
  列出镜像命令 docker images [OPTIONS] [REPOSITORY[:TAG]]</description>
    </item>
    
    <item>
      <title>WWDC 2017</title>
      <link>https://tourcoder.com/wwdc2017/</link>
      <pubDate>Tue, 06 Jun 2017 07:04:27 +0000</pubDate>
      
      <guid>https://tourcoder.com/wwdc2017/</guid>
      <description>macOS high Serria 篇 主观上说，最新版的 macOS 除了 APFS 和 VR 我想使用下外，其它我没有使用的欲望，就像它不再有一个新名字一样，或者说就像它的名字一样，macOS high Serria 只是前一个版本 macOS Serria 的 high 形式，升了下级。
Safari
号称现在是史上最快的浏览器，比 Chrome 要快 80%，然后我的首选浏览器是 Chrome，选它是因为速度快，除了发热量有点高外，Chrome 在各个方面都完爆 Safari，相信很多人都是这样。
APFS
说起来有点悲催，这个本来几年前就应该出现的东西，现在才出来，似乎已经迟了，自我安慰点想，来了总好过没有。
VR
等我真实体验了后再评说。
照片视频，新的视频格式
这些年这方面的事情做得少，所以没啥感觉。
iCloud
Apple 的云服务一直就是烂的代名词，他和微软公司是没有做网络产品 DNS 的公司的典型代表，iCloud 里面那么多服务中，我只用了一个服务 &amp;ndash; Find My Mac（如下图），就像在 iPhone 上的iCloud 一样，我也只用 Find My iPhone 这唯一的服务。
 所以，我并不会第一时间体验，等稳定版本出来。
另外真不要再为难苹果，催促他们创新什么，在个人电脑方面，苹果公司也的确没有什么再多的创新办法了。
iOS 11 篇 和以往一样，iOS 11 又做了不少的更新内容，主要有以下几个，
iMessage 和 Apple Pay
在 iMessage 里面可以用 Apple Pay 了，就像微信这样发红包转账
Siri</description>
    </item>
    
    <item>
      <title>Codeigniter 中集成 Jquery File Upload</title>
      <link>https://tourcoder.com/codeigniter-jquery-file-upload-integrated/</link>
      <pubDate>Mon, 05 Jun 2017 07:03:47 +0000</pubDate>
      
      <guid>https://tourcoder.com/codeigniter-jquery-file-upload-integrated/</guid>
      <description>最近在基于 PHP 的框架 Codeigniter（以下简称 CI 框架） 开发一款系统，其中用到了上传功能，考虑到用户体验等问题，采用了开源的 Jquery File Upload，如下图
 上传之前
 上传之后
集成步骤
  去 Jquery File Upload 的官网（下面提供）下载最新版本
  将 demo 中 php 文件夹下面的 UploadHandler.php 文件放入到 CI 框架中的 libraries 文件夹中
  新建 controllers 文件，然后写入如下内容
  function fileupload() { $this-&amp;gt;load-&amp;gt;library(&amp;quot;UploadHandler&amp;quot;); } 搞定。
如果你需要对上传的文件做一些操作，比如更改文件名字，存储路径等，你可以自行修改 UploadHandler.php 文件，或者自己写类库，甚至你还可以修改 Jquery File Upload 的源码。
附下载地址
Codeigniter 官网，使用的是 3.1 稳定版。
Jquery File Upload 官网，使用的是最新版。</description>
    </item>
    
    <item>
      <title>解决 AWS Codecommit 在 pull / push 的 403 错误</title>
      <link>https://tourcoder.com/codecommit-pull-push-403-error/</link>
      <pubDate>Mon, 05 Jun 2017 07:02:25 +0000</pubDate>
      
      <guid>https://tourcoder.com/codecommit-pull-push-403-error/</guid>
      <description>最近使用了下 AWS 推出的 Codecommit 的版本控制托管服务，简单明了，加上我也在用他家的云服务，配合部署，很方便。
不过很多时候，在通过 https 方式进行 push/pull 的时候，经常很烦人的出现 403 的错误
fatal: unable to access &#39;https://git-codecommit.us-west-2.amazonaws.com/v1/repos/projecta/&#39;: The requested URL returned error: 403 检查权限等问题，都是没有错的，官方也没有一个很好的解答，在搜索，并进行多种测试后发现可以通过下面的方式解决问题
 打开 Keychain Access 这个应用，搜索 git-codecommit，你会发现相关的信息，双击有提交问题的库的信息，在弹出的窗口中选择 Access Control 这个标签
 将下面的列表框中的内容，清空，并保存。
这时你再在终端中输入 git pull/push 命令时，就会弹出窗口
 这里一定要选择 Deny，即拒绝，这样，你就能正常提交代码到 Codecommit 了，非常美中不足的是，每次提交，你都会遇到这个弹窗，每次你都要选择拒绝。
另外，通过 SSH 目前没有遇到这个问题，至于怎么设置 SSH 的方式，可以看下面 AWS 官方的这篇文章
Setup Steps for SSH Connections to AWS CodeCommit Repositories on Linux, macOS, or Unix</description>
    </item>
    
    <item>
      <title>《支付战争》读后感</title>
      <link>https://tourcoder.com/paypal-wars/</link>
      <pubDate>Sun, 02 Apr 2017 07:01:40 +0000</pubDate>
      
      <guid>https://tourcoder.com/paypal-wars/</guid>
      <description>断断续续的读完了埃里克·M·杰克逊的《支付战争》，英文名 &amp;lt; The PayPal Wars &amp;gt;，这是一本讲述 PayPal 诞生记的书，我更觉得它是关于 PayPal 的史书。读后感触良多，有几点非常值得一提。
   时间紧，快很重要 本书的章节排序很有意思，是根据几个月一排序作为一章节，每个时间点走的每一步都很重要，快是本书全文都透着的一点。
  及时调整变化，一成不变意味着死亡 变是本书透着的另外一点，尤其是和 eBay 打仗的那几段。如果在那些点的时间里，没有作出调整，将会意味着死亡，即便很多的计划没有被赋予行动，但遇到问题，必须有可行动的计划方案。
  这是一群牛人，但即便这样，有时候不一定是非常完美的结局 PayPal 黑帮，多么牛的一群人，如雷贯耳。在离开 PayPal 的时间里，这群人又创造了很多足以改变这个世界的公司，但即便这样，PayPal 最后还是被 eBay 收购，没有完成他们心中 “统治世界” 的梦，这里应该说是计划才对。
  elon musk 真的很喜欢 x 这个字母 从 X.com 到 spaceX，Elon Musk 是真的喜欢 X 这个字母啊。
  总体来说，和一群牛人，做一件很难的事情，在这过程中，不断的根据实际情况调整变化，不断创新，紧紧抓住每个时机，努力成为最优秀的，这就是 PayPal 黑帮文化，甚至是硅谷文化。</description>
    </item>
    
    <item>
      <title>逼格太高，钱包跟不上</title>
      <link>https://tourcoder.com/git-world/</link>
      <pubDate>Wed, 29 Mar 2017 07:01:10 +0000</pubDate>
      
      <guid>https://tourcoder.com/git-world/</guid>
      <description>下午有人和我吐槽 Github Enterprise 价格高，硬件要求高，说白了就是他感觉投入太大，对他这样的小企业承受不起。我回了他一句：“你这是典型的逼格太高，钱包跟不上”。
对 Github Enterprise 的了解还是好几年前的事情，那时配了台高配服务器，在上面架设了 VMware ESXi，写了个程序，所有同事可以通过这个程序点几下就可以申请一个内网云主机做开发测试机或者自己折腾着玩，但可惜他们都没兴趣折腾这些玩意，服务器闲置，我就在上面安装了 Github Enterprise，和现在一样，45 天的免费试用，但那时的起步价格是 5000 美刀／10人／年，我在试用期结束前给他们邮件询问是否价格低一点，最后他们愿意给我一个 2500 美刀的价格，就是现在的价格，但思索后还是没有买，原因主要是价格贵，功能少。
现在想想，我没有的选择是对的
  Github Enterprise 的定位本就不是为了小的创业企业，准确的说，盈利差的企业并不适合用这个。
  每年起步 2500 美刀只是 license 的费用，这里还没有计算服务器带宽等的投入成本，且不说机器吧，以最低情况的考虑，我去看了下，AWS，Google Cloud，Azure 几家，费用最少的一家服务器价格都是超 1000 元的。
  那么买不了 Github Enterprise，就没有选择了吗？有！有很多适合小企业团队的，且听我说下后面我的折腾过程。
Github 私有仓库
我后来买了 Github 私有仓库，买它的原因除了必要的代码控制工作外，让开发的同时时刻泡在 Github 这样的代码环境下，他们可以在上面找到资料，学习等等，一举多得。后来放弃的原因主要有两个
  尽管我一再强调要求，但还是有同事因为对 git 掌握不那么熟练，多次把一些私密信息，比如各种密码，各种密钥提交到 Github 上，我很担忧。
  那时候的 Github 的私有仓库是多个 plan 的，不同价格的 plan，仓库数不一样。
  但现在他们的私有仓库的 plan 改了，个人版 7 美刀／月，无限私有仓库，不限人数，是极具诱惑力的，而团队版 plan 的价格你看看就好，并不建议购买。</description>
    </item>
    
    <item>
      <title>CocoaPods 慢</title>
      <link>https://tourcoder.com/cocoapods-slowly/</link>
      <pubDate>Wed, 22 Mar 2017 07:00:43 +0000</pubDate>
      
      <guid>https://tourcoder.com/cocoapods-slowly/</guid>
      <description>CocoaPods 在 iOS/macOS 应用开发中经常用到，但因为墙等因素，会经常遇到问题，慢显得特别严重，这里提供一些解决办法，至于如何安装使用等基本问题，请去官网查看
方法一：更换源
pod repo remove master pod repo add master 新源库地址 pod repo update pod setup 网上有很多镜像源，你可以搜索看看。
方法二：手工添加索引库
cd ~/cocoapods/repos/ 将 CocoaPods 的库内容添加到这里即可。</description>
    </item>
    
    <item>
      <title>批量取消 twitter following</title>
      <link>https://tourcoder.com/bulk-unfollow-in-twitter/</link>
      <pubDate>Tue, 21 Mar 2017 06:59:54 +0000</pubDate>
      
      <guid>https://tourcoder.com/bulk-unfollow-in-twitter/</guid>
      <description>要在 twitter 上宣传产品，使用很久前注册的 twitter 账号，因为很久没有登录，莫名其妙的 follow（关注） 了很多人，如图
 1411 人基本都是一些莫名其妙的账户，尤其是里面很多是阿拉伯文的账号，只能取消关注，但如果一个一个点取消，那是一项相当大的工程，在研究了下 unfollow（取消关注） 这个按钮的执行机制后，得到下面的方式可以批量取消关注。
登录你的账号后，访问 following（关注） 页面，即 https://twitter.com/following 然后在控制台执行如下命令
$(&amp;quot;.following .js-follow-btn&amp;quot;).click() 输入命令后，等待一段时间，即可出现下图执行效果
 刚才批量取消关注了 576 人。
 效果还不错吧？
需要注意的是，该命令作用于显示出来的关注的人员，在取消的过程中可能会出现错误，比如 rate limit，你可以等一会时间再执行或每次取消关注的数量少一点
当然网上也有一些第三方的服务可以帮你一样实现这些，但出于安全考虑，我没有测试。
题外话，晚上几个人闲聊《守望先锋》，都有差不多的感受
在国服打《守望先锋》，只要掉到鱼塘区（2000分以下），单排上分就非常难，即便你操作厉害，也难一打六，上分的方法就是找个好车队，2-3 个人的车队最好，3 个人以上的车队容易翻车。
话说我的号被我老婆坑到 600 分后，我单排好不容易才打到 1200 分，打的都要吐了。</description>
    </item>
    
    <item>
      <title>记一次食物中毒</title>
      <link>https://tourcoder.com/i-am-sick/</link>
      <pubDate>Sat, 18 Mar 2017 06:59:11 +0000</pubDate>
      
      <guid>https://tourcoder.com/i-am-sick/</guid>
      <description>印象中，吃坏肚子有过几次，食物中毒昨倒是头一遭，这事发生在昨天，即 2017 年 3 月 17 日。 中午 12:00 的时候，我吃了个中饭，吃完差不多是 12:30。
打了一个多小时的电话，感觉老是打饱嗝，是中午吃的某一菜的味道。
因答应媳妇陪她看 15:00 的电影《美女与野兽》，随即赶去影院，两个多小时的电影，在前一个小时我感觉很不舒服，主要症状是打饱嗝，还是那个菜的味道，肚子有点胀，头晕，我以为是工作太累加上前一天我基本没睡觉导致，就在影院睡了一个多小时，还好本场电影只有零星的几个人在看，我媳妇说我都打呼了。
电影院睡了一觉好多了，看完电影到家，玩了几局游戏《守望先锋》，感觉头更晕了，很想睡觉，眼皮都睁不开的感觉，随即下线，洗澡上床，准备补觉，此时我还在以为我是工作累缺觉。
补觉睡了两个多小时，我被呕心醒了，很想吐，刚走进厕所，就吐了，全是中午吃的东西，此时我怀疑中午的食物有问题，伴随着的，还有泻肚，很厉害。
吐过泻后就感觉好多了，喝了点盐开水，又上床睡了十几分钟，然后又呕心的受不了，继续吐继续拉。
就这样，反反复复搞了一夜，到早上八点多，再吐的时候，已经嘴里已经没有昨天那菜的味道，全是盐水的味道，然后就开始不吐，也不恶心了，但还是拉肚。
十点，药店开门，买了药，吃了（家里备的药过期了，不然昨天就吃了），到现在 17:00 为止我在床上躺了一天，一天没有吃，其中去了两次厕所，拉了两次，全是水，其他头晕和呕吐现象暂时消失，也睡了一个小时的样子。
现在我要做的还是继续排毒，吃点药。
这次也是一次人生体验，食物中毒比喝醉酒要难受多了，喝醉酒我可以吐了，然后就能舒舒服服的在床上睡一觉，第二天醒来就没事，但食物中毒简直就是灾难，吐，泻，头晕，乏力。
这个过程中，我觉得我能扛得住，所以就没有去医院。
另外我觉得家里以后不应该只是备药，还要注意生产日期，及时更新。
还有就是在外面吃饭，真的要当心了，昨天我吃饭的地方，是个商场里面的一个店，外面看起来挺干净的。
以后尽量自己做饭菜带着吃。</description>
    </item>
    
    <item>
      <title>Git 及工作流</title>
      <link>https://tourcoder.com/git-workflow/</link>
      <pubDate>Tue, 14 Mar 2017 06:58:29 +0000</pubDate>
      
      <guid>https://tourcoder.com/git-workflow/</guid>
      <description>日常开发中，Git 必不可少，之前的文章我有简单介绍过 Git，具体看这篇，今天我介绍下 Git 的日常用法。
首先先看下这张图，这张图基本包括了 Git 的一些日常用法，并详细介绍了下它的工作流程。
 虽然现在也有很多优秀的图形界面的工具，但使用 Git，我还是建议大家尽可能的使用命令行，以下都是在命令行中完成。
为了更好的说明 Git 的使用，这里我们通过一个例子来说明这些操作。
我要和小金合作一个叫着 t1 的项目，那么我进行了如下操作
cd t1 // 进入该项目文件夹 git init // 初始化项目 git config user.name &#39;tc&#39; // 设置我的名字 git config user.email &#39;your email address&#39; // 设置我的 email 地址 git remote add origin https://url-address.com/projectname // 设置项目远程库的地址 这个时候我设置好了基本信息，在配置 user.name 和 user.email 的时候，可以加上全局变量 --global，但并不建议这么做，如果你加上了，想去掉的话，可以执行命令
git config --global -unset-all user.name // 这样的方式 或者编辑 gitconfig 文件，位置在 ~/.gitconfig。
就这样我对项目做了一些开发，比如
vi README.md // 编辑文件 编辑好 README.</description>
    </item>
    
    <item>
      <title>Google Cloud 体验</title>
      <link>https://tourcoder.com/try-google-cloud/</link>
      <pubDate>Sun, 12 Mar 2017 06:57:51 +0000</pubDate>
      
      <guid>https://tourcoder.com/try-google-cloud/</guid>
      <description>体验了下 Google Cloud，还不错，这里分享下如何创建一个 VM，并且能通过外部 SSH 登录。
首先，创建一个项目，比如我创建了一个项目
  创建完项目后的状态，点左上角的菜单图标
 选择计算引擎
 创建 VM 实例
名称 - 随便填写
地区 - 选择你想要在的地区
机器类型 - 就是你服务器的配置
启动磁盘 - 选择你的磁盘情况
身份验证 - 默认
防火墙 - 勾选两个
其他的暂时可以不配置。
 再次点击左上角的菜单图标，然后选择网络，外部 IP 地址，生成一个 IP 地址，在创建的过程中，你可以将它附加在之前创建好的实例上。
基本到这里，你已经创建好一个 VM 实例了，那么怎么通过外部登录呢？
再次点击左上角的菜单图标，然后选择计算引擎，VM 实例
 如黄色标注的部分，点 SSH 下拉，你可以看到有多个连接方式，因为需要我的目标是使用其他 SSH 客户端，这里有说明。
因为我喜欢记忆复杂的密码，所以这里只介绍下密码的方式，点击上图中的黄色部分，在浏览器窗口中打开，登录进实例。
sudo mv /etc/nologin /etc/nologin.backup 改名 nologin 文件
sudo vi /etc/ssh/sshd_config 开启密码验证，将 /etc/ssh/sshd_config 文件中的 PasswordAuthentication no 改为 PasswordAuthentication yes</description>
    </item>
    
    <item>
      <title>基于 AWS 的架构</title>
      <link>https://tourcoder.com/evolution-on-aws/</link>
      <pubDate>Tue, 07 Mar 2017 06:57:18 +0000</pubDate>
      
      <guid>https://tourcoder.com/evolution-on-aws/</guid>
      <description>凌晨我们更新了服务器端，本次更新抛开功能等因素，但在技术架构方面更为合理的使用了 AWS，趁现在有空，做点笔记。
最早的架构
最早的架构非常简单，在一个 EC2 实例里跑了所有的服务（Web / Web Service / 数据库），只是用 nginx 简单做了一下负载。
这种架构是初创项目的基本架构，好处是省钱，但坏处是显而易见的，比如服务器挂了或者被端了，就一切玩完，而且这并没有使用 AWS，只是把它当着一个服务器来使用了。这种方式在生产环境下运行了一个月不到，就做了一些调整。
第一次调整
这次的架构调整也没有做太多的事情，只是按功能做了下划分，从之前的一台 EC2 实例变成了两台，Web / Web Service 和数据库各一台。在数据库服务器上引入了备份机制，在负载均衡上引入了 ELB，算是用到了一点真正云计算的东西，同时把动态数据和固态数据做了区分，并在服务器上引入了机器人监管程序。这种方式一直运行到今天凌晨。
第二次调整
也就是今日凌晨的调整，这次调整算是比较大的一次调整，在调整前，规划的目标是高并发且无宕机的服务。
我们主要用到了 EC2，RDS，ElastiCache，S3，具体它们的作用可以看 AWS 上的说明。
小帖士：很多人习惯了密码，不是很喜欢密钥的登录方式，其实在创建时候，比如 EC2，在高级选项的时候，输入下面内容
#cloud-config password: your password is here chpasswd: {expire: False} ssh_pwauth: True update@20171018 : 粒子化 UnitServer 架构
因为业务场景变更，我们的架构也做了一些变更，比如把结算中心给独立出来了，之前我们一直用的是 unitserver 的架构，这个架构是我 2011 年做的一个设计，它的产生是因为早些年我做外包，人手不够，研究发现服务器端重复率很高，为了快速开发，就设计了这么一个架构。形象一点说，它是一个五脏俱全的小麻雀，基础技能具备，当业务扩展，就像是给这个小麻雀加各种装备，这种架构相对比较简单。
这个架构另外一个特点就是分布式，当服务中 unitserver 出现问题时，会自动切换到任意一个没有问题的 unitserver，每个 unitserver 之间的数据是自动同步的，所以当切换后，不会出现数据不对的问题。而且它还有一个好处是会根据客户所在地方，连接离他最近的 unitserver，很好的解决了当年的所谓南北线路不同的问题。
这次我们做的事情是进一步细粒化 unitserver，根据不用的服务拆分成不同的颗粒，引入了 microservices 的概念。
实现的效果是：
  每一个粒子化服务单元之间是对等的。
  去中心化，尤其是数据。</description>
    </item>
    
    <item>
      <title>给网站加 SSL</title>
      <link>https://tourcoder.com/ssl-for-website/</link>
      <pubDate>Sun, 05 Mar 2017 06:56:35 +0000</pubDate>
      
      <guid>https://tourcoder.com/ssl-for-website/</guid>
      <description>信息安全无容置疑，现在好多网站还是 http 的方式在跑着，应该早点转到 https。
ssl 就是一道护盾，虽然以前买个 ssl 证书很贵，但现在便宜了很多，而且还有免费好用的，比如 Let&amp;rsquo;s Encrypt 就是一家。
预备条件
服务器 ubuntu 16.04
证书 Let&amp;rsquo;s Encrypt 的 ssl
安装
先更新系统
apt update &amp;amp;&amp;amp; apt upgrade -y  安装需要到的工具
apt install -y zip build-essential  安装 Let&amp;rsquo;s Encrypt client:
apt install -y letsencrypt  查看版本
letsencrypt --version  获取证书
letsencrypt certonly -d yourdomain.com -d www.yourdomain.com --email username@gmail.com --agree-tos --standalone 执行完成后，在 /etc/letsencrypt/live/yourdomain.com 目录下就会有你刚申请好的证书和私钥。
这里记得把域名指向该服务器的 IP
最后直接在 Nginx 或 Apache 上配置下，你的网站就跑在了 ssl 下咯。</description>
    </item>
    
    <item>
      <title>macOS 简易手册</title>
      <link>https://tourcoder.com/macos-manual/</link>
      <pubDate>Tue, 28 Feb 2017 06:56:02 +0000</pubDate>
      
      <guid>https://tourcoder.com/macos-manual/</guid>
      <description>计划每天用一些零碎的时间，写一份 macOS 的手册。
基础设置 安装系统
macOS 的系统很好安装，目前新买任何 Mac 设备，比如MacBook，MacBook Air，MacBook Pro，Mac mini，iMac 和 Mac Pro，都自带 macOS，可以在系统里通过 Appstore 下载最新系统升级到最新系统。 当然，你也可以重新安装系统。
操作方式
开机，按住 Option 键，然后可以选择安装方式，即便你没有安装盘，你也可以通过网络安装系统。
忘记系统密码
如果你在账户里绑定了 Apple ID，你可以通过那个找回密码，如果实在不会了，你也可以开机，按住 command+R，选择终端，输入 resetpassword，回车，选择账户，输入新密码，即可重置密码。
系统的设置
按自己的习惯，进行一些设置。在系统的主界面，点击左上角的苹果图标，选择系统设置，即可进入到系统的设置界面。如图
  这里是系统设置的内容都在这里，因为我当前是在虚拟机的 macOS 里截图，有些内容显示不太一样，但不妨碍。
语言设置
刚进入系统，语言默认是英文的，点击设置界面的 Language &amp;amp; Region，点左边下面的 + 号，在弹出的列表中选择简体中文，然后将简体中文拖到 English 上面。如图
 这时点返回按钮，会提示你是否要重启，选择重启电脑，在重启完成后，你就进入中文界面，依旧点击左上角的苹果图标，进入设置界面。
 这里的每一个设置的内容都描述的很清楚，我不一一讲解，可以按自己的自由习惯去设置，我只说一些通用的设置。
给电脑起名
我很喜欢给我的电子设备起名，给这些设备起名是件很有趣的事情，点击上图系统偏好设置中的共享，这里的电脑名称默认是你的用户名&#39;s Mac**，我将它改名成了 Feb，为啥叫这名，好记。
 这里是计算机名字，也可以通过命令行解决，在终端中输入
sudo scutil --set ComputerName 计算机名 但这不能够更改终端中显示的名称，终端中显示的是主机名 HostName，可以在终端中输入命令
sudo scutil --set HostName 主机名 重启终端即可完成修改。
安全性与隐私
这里主要牵涉到的一个设置是安装网上下载的第三方应用，点击系统偏好设置里的安全性与隐私，即可进入下图界面</description>
    </item>
    
    <item>
      <title>虚拟机中安装 macOS</title>
      <link>https://tourcoder.com/install-macos-in-vmware/</link>
      <pubDate>Sun, 26 Feb 2017 06:55:20 +0000</pubDate>
      
      <guid>https://tourcoder.com/install-macos-in-vmware/</guid>
      <description>一时心血来潮，在家里的 pc 上安装了虚拟机，并在里面安装了最新版的 macOS 10.12，下面是大致的安装步骤。
母机
高配的 PC 里面安装了 Windows 7，这本来是我用来打游戏《守望先锋》的机器。
虚拟机软件
VMware Workstation Pro 12.5.0
客户机系统
macOS 10.12
步骤
  安装 VMware Workstation Pro 12.5.0 一步一步的安装好改软件。
  解锁 VMware Workstation Pro 12.5.0 安装好的 WMware 是没有 macOS 选项的，需要解锁它，解锁的办法也很简单，下载 unlock 文件，然后在 Windows 7 下以管理员的模式，执行解锁的文件即可，解锁文件搜索关键词 unlock wmware。
  配置并安装系统 将系统的 iso 文件配置到虚拟光驱，然后执行安装。
  就这样一步一步安装完成。
注意，在这个过程中可能会遇到一些问题
问题一：VMware Workstation 不可恢复错误: (vcpu-0)
解决办法：打开 vmx 文件，文末添加一句 smc.version = &amp;ldquo;0&amp;rdquo;
问题二：无法全屏
解决办法：安装 wmware tools 即可。</description>
    </item>
    
    <item>
      <title>IPTraf 安装与使用</title>
      <link>https://tourcoder.com/iptraf/</link>
      <pubDate>Wed, 18 Jan 2017 06:54:38 +0000</pubDate>
      
      <guid>https://tourcoder.com/iptraf/</guid>
      <description>最近在做一个采集程序的时候遇到一个问题，自己感觉跑的流量和服务器供应商给出来的统计相差很大，想多方面检测下具体的情况，就使用了 IPTraf。
先决条件
服务器： centOS 7
安装
可以去下载源码安装，去官网下载源码，需要注意的是官网应该是被封了，官网地址
我是直接执行命令 yum install iptraf -y，很快就可以安装完成。
运行
 提示错误，因为在 centOS 中，当安装 iptraf 的时候，已经自动的安装了 iptraf-ng，所以这里应该执行命令 iptraf-ng。
注意，你要调整你的终端尺寸，否则也会报错，一切正常后，进入
 至于怎么用，都是图文化的界面，很容易。</description>
    </item>
    
    <item>
      <title>合同和关系</title>
      <link>https://tourcoder.com/contracts-vs-relationship/</link>
      <pubDate>Sat, 05 Nov 2016 06:53:58 +0000</pubDate>
      
      <guid>https://tourcoder.com/contracts-vs-relationship/</guid>
      <description>一早婉拒了一个项目，不做他们的项目主要是两点异议，违约条款和付款周期。
付款周期
按合同和常规项目的流程，签订合同后三个工作日内预付款项到账，项目开始算时间进行开发。他们却提出让我方先开发，预付款一个月后给我，可这个项目整个开发周期只有两个月，再说这是预付款（占总额的40%），我告知对方，预付款给不了一个月时间，最多给七天，总款可以延迟一点时间，但对方没有办法满足。
违约条款
违约条款是一份合同体现公平平等的一个点，合同草本是我方出的，给出的违约条款是
1.甲方有责任按期支付乙方费用，如因甲方自身原因，未能按时交付，则每延期一天，甲方将额外支付乙方总费用的0.05%作为补偿； 2.乙方有责任按期向交付甲方源代码和设计文档，实现项目中的所有功能，如因乙方自身原因，未能按时交付，则每延期一天，甲方将扣除乙方总费用的0.05%作为补偿。 如确因甲方原因，造成乙方未能按时交付，则乙方不承担由此造成的甲方的损失。 3.一方因不可抗力确实无法承担责任，而造成损失的，不付赔偿责任。本合同所称不可抗力是指不能预见、不能克服并且不能避免的客观事件，包括但不限于自然灾害如洪水、地震、火灾和风暴等以及社会事件如战争、动乱、政府行为等。 合乎合同平等的原则，但对方并不认同，他们给出的违约条款
1.双方应严格履行本合同，任何一方违反本合同均应承担违约责任。 2.由于软件质量未达到合同中约定的验收标准、乙方责任导致工期延误或乙方有其他违反本合同条款行为的，甲方随时享有单方解除本合同的权利，并享有就由于上述原因造成甲方的全部损失（包括但不限于甲方在此之前支付的所有开发费用、甲方为软件开发订购的所有设备款项、甲方由于软件开发失败而遭受的生产经营方面的损失）向乙方要求赔偿的权利。 3.在本合同履行过程中，由于乙方原因导致软件开发失败的，由乙方承担由此为甲方造成的全部损失（包括但不限于甲方在此之前支付的所有开发费用、甲方为软件开发订购的所有设备款项、甲方由于软件开发失败而遭受的生产经营方面的损失）。 4.除非经甲方书面认可，乙方未能按期完成本合同项目的，则每逾期一天向甲方支付合同总款项1‰的违约金。 5.乙方擅自将合同项目的全部或部分转让委托给第三方，甲方有权解除合同，乙方应立即返还所有甲方支付的费用，并支付违约金，违约金为合同总款项的20%。 这哪里还是违约条款，这简直就是我方赔款条约。这样的项目是坚决不能做的。对方一早和我电话的意思是合同也就是这样写写，出现问题不会真的叫我赔偿，再说有 XG（帮我介绍这个项目的朋友） 的关系在，更不会让我赔偿的，他们项目比较着急，让我务必要帮忙。我说朋友是朋友，合同不能乱来，遂拒绝。
随后，我和 XG 沟通了下，他说这个条款太扯，又不是什么大合同，不要做。
其实有时候，关系真的很难处理，尤其是一些关系好的朋友。前些天和朋友吃饭，我们聊到一些事情，都觉得我工作上吃了好多哑巴亏，均因为太抹不开朋友面子，这一点上，我一直很佩服他，工作的事情弄得很清楚。
利益相关的时候，合同是个好东西！</description>
    </item>
    
    <item>
      <title>企业邮局的选择</title>
      <link>https://tourcoder.com/how-to-choose-email-system/</link>
      <pubDate>Thu, 20 Oct 2016 06:53:13 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-choose-email-system/</guid>
      <description>Email 在平时工作中使用率非常高，虽然现在有很多“变异” 的 Email 工具越来越靠近 IM，但依旧无法取代 Email。
那么一个初创公司的企业邮局该如何选择呢？
自架邮局系统
对一个初创公司，并不建议自行架设邮局系统，尤其是如果你的团队中没有这方面的人才。架设牵涉到的问题很多，SPAM，BLACK/WHITE LIST等等，而且在上面所消耗的时间过多，对自身的业务也会有影响。
如果一心想自行架设，这里建议，Linux 下可以去看看 Zimbra，在 Windows 下，Exchange Server 是最好的选择。
第三方邮局系统
初创公司节省成本，但不意味着不花一分钱，尤其当一个方案能很好的解决你的问题，花点钱用起来会更踏实。
  G Suite Google 家的，以前叫过 Google Apps，也叫过 Google Apps for Work。这曾是我唯一的邮局系统选择。还内置了一套纯办公流的东西，完全满足了一个公司的需求。 唯一美中不足的是它需要翻墙才能够顺畅的访问。 收费状态：收费（低配 $5/人/月，更多价格） 评语：什么都好，就是要翻墙，有点累。
  Office 365 微软家的，有微软这个和我朝关系搞得蛮好的爹，Office 365的访问没有了问题。就像我以前吐槽的一样，微软一直没有做网络产品的基因，Office 365的产品思路异常的乱，很多人很有可能一开始就被他的设置购买等弄得晕头转向。也经常出一些莫名其妙的 Bug，用他家产品的那段时间，提交问题，都把他们的技术客服提怕了，索性加了我的 QQ，让我遇到新问题了，除了提交工单外，在 QQ 上也和他说一下。 收费状态：它的每一样产品内容都是需要收费的，这里我重点说的邮局系统，他就有多个配置，最低的配置是 exchangeonline plan，25元/人/月。 评语：能不能做得简单易用点？
  AWS Workmail 亚马逊家的，也只有他的设置配置能和 Google 家的可以一拼了。只是现阶段可选的地区只有三个地区。 收费状态：低配 $4/月/人，还有其他一个包含 Docs 的方案，价格 $8/月/人。 评语：有点太简单了，有些东西还不健全，比如访问网站，就没有办法设置成 mail.domain.com 这样的访问，他的访问方式是 org-name.awsapps.com/mail，略显难受。
  QQ 企业邮局 腾讯家的，在国内应该占有很高的市场份额，很多团队都在用，很多功能需要付费使用。 收发海外路线的邮件会有问题，做外贸的慎用。 收费状态：有免费版本，也有收费版本。 评语：他们家评语最难写，因为争议非常的多，我曾因为一个该邮局系统的问题，询问了十个朋友（他们有自己创业，有大公司的员工，有小公司的员工，平时邮件和他们密不可分），得到的答案也充满争议，在用着的用户，说还可以，也有说也就那样，也有说常常收不到邮件。没用的用户，反馈比较多的就是邮件收发有问题。</description>
    </item>
    
    <item>
      <title>Ghost中文安装指南</title>
      <link>https://tourcoder.com/ghost-install-manual/</link>
      <pubDate>Tue, 11 Oct 2016 06:52:16 +0000</pubDate>
      
      <guid>https://tourcoder.com/ghost-install-manual/</guid>
      <description>“哥，你的博客好漂亮啊，是最近写的吗？”，同事猛不丁的对我嚷嚷起来。
“不是，这个博客是我在一个开源的博客程序上更改的。”，我头也不抬的忙着手上的事情。
“那你帮我也弄一个呗！”，同事凑了过来看着我。
“你去我的 Github 上看吧，教程我分享了”。
同事立刻访问我的 Github 地址，找到了那篇教程。
Ghost 是一个 Markdown 格式的博客程序，使用 Node.js 编写，目前开源在 Github 上。
服务器的选择
为了方便安装该博客，建议购买国外的 VPS，比如 vultr。点这里链接购买，注册即可得到 $10。
如何安装？
2019 年更新：下面不用看了，可以通过 Docker 直接一步安装
sudo docker run -d --name tcblog -p 3000:2368 -v ~/tcblog/content:/var/lib/ghost/content ghost 网上有很多的安装教程，这里我说下在 Ubuntu 上如何安装。
  更新系统
#sudo apt-get update #sudo apt-get upgrade   安装 Node.js 环境
# apt-get install g++ make python python-software-properties # add-apt-repository ppa:chris-lea/node.js # apt-get update # apt-get install nodejs Update: 2017-09-01: 从1.</description>
    </item>
    
    <item>
      <title>URL 地址中字符的转义对照表</title>
      <link>https://tourcoder.com/url-ascii/</link>
      <pubDate>Mon, 26 Sep 2016 06:51:32 +0000</pubDate>
      
      <guid>https://tourcoder.com/url-ascii/</guid>
      <description>ASCII字符 URL编码 空格 %20 ! %21 &amp;quot; %22 # %23 $ %24 % %25 &amp;amp; %26 &#39; %27 ( %28 ) %29 * %2A + %2B , %2C - %2D . %2E / %2F 0 %30 1 %31 2 %32 3 %33 4 %34 5 %35 6 %36 7 %37 8 %38 9 %39 : %3A ; %3B &amp;lt; %3C = %3D &amp;gt; %3E ? %3F @ %40 A %41 B %42 C %43 D %44 E %45 F %46 G %47 H %48 I %49 J %4A K %4B L %4C M %4D N %4E O %4F P %50 Q %51 R %52 S %53 T %54 U %55 V %56 W %57 X %58 Y %59 Z %5A [ %5B \ %5C ] %5D ^ %5E _ %5F ` %60 a %61 b %62 c %63 d %64 e %65 f %66 g %67 h %68 i %69 j %6A k %6B l %6C m %6D n %6E o %6F p %70 q %71 r %72 s %73 t %74 u %75 v %76 w %77 x %78 y %79 z %7A { %7B | %7C } %7D ~ %7E %7F € %80 %81 ‚ %82 ƒ %83 „ %84 … %85 † %86 ‡ %87 ˆ %88 ‰ %89 Š %8A ‹ %8B Œ %8C %8D Ž %8E %8F %90 ‘ %91 ’ %92 “ %93 ” %94 • %95 – %96 — %97 ˜ %98 ™ %99 š %9A › %9B œ %9C %9D ž %9E Ÿ %9F %A0 ¡ %A1 ¢ %A2 £ %A3 %A4 ¥ %A5 | %A6 § %A7 ¨ %A8 © %A9 ª %AA « %AB ¬ %AC ¯ %AD ® %AE ¯ %AF ° %B0 ± %B1 ² %B2 ³ %B3 ´ %B4 µ %B5 ¶ %B6 · %B7 ¸ %B8 ¹ %B9 º %BA » %BB ¼ %BC ½ %BD ¾ %BE ¿ %BF À %C0 Á %C1 Â %C2 Ã %C3 Ä %C4 Å %C5 Æ %C6 Ç %C7 È %C8 É %C9 Ê %CA Ë %CB Ì %CC Í %CD Î %CE Ï %CF Ð %D0 Ñ %D1 Ò %D2 Ó %D3 Ô %D4 Õ %D5 Ö %D6 %D7 Ø %D8 Ù %D9 Ú %DA Û %DB Ü %DC Ý %DD Þ %DE ß %DF à %E0 á %E1 â %E2 ã %E3 ä %E4 å %E5 æ %E6 ç %E7 è %E8 é %E9 ê %EA ë %EB ì %EC í %ED î %EE ï %EF ð %F0 ñ %F1 ò %F2 ó %F3 ô %F4 õ %F5 ö %F6 ÷ %F7 ø %F8 ù %F9 ú %FA û %FB ü %FC ý %FD þ %FE ÿ %FF </description>
    </item>
    
    <item>
      <title>要创业，先花钱</title>
      <link>https://tourcoder.com/startup-clearly/</link>
      <pubDate>Mon, 29 Aug 2016 06:50:57 +0000</pubDate>
      
      <guid>https://tourcoder.com/startup-clearly/</guid>
      <description>这几天有人和我说让我帮忙给他的创业项目弄下网站，我说没有时间，让他去外面找外包。
后来他告诉我说，别人都嫌弃他的项目太小了，不接。再次让我帮忙，我说这样吧，我问题下我同事，让我同事给他做。
我同事报了一千元的价格，但被否决，大概的意思就是一千元太贵了，他要省钱。转而他再次询问我是否有时间，帮他弄一下，就换换图片就好了。
但我没有再回复，理由也很简单：
  我是真的忙。上面看似是换换图片，但要做的事情还是有点多的，我帮着解决问题的时间要占用自己的工作时间或休息时间的，如果我的时间用在解决你的问题，那么我自己的呢？
  我也并不想再继续免费帮这个忙。凭良心讲，我同事开一千的价格是看在我的面子，换成其他人，这个项目是不会接的。
  另外，上次我帮着从买服务器，然后配置服务器，再然后弄域名，后来写网站，已经占用了我很多时间，我一分钱没有收，甚至连一口水都没有喝到，这样的情况我支持一次就够了，但让我再继续，我是不会乐意的。
  其实从大半个月前，我也已经不在微信上回复很多人问问题的信息，尤其是帮一些创业项目解决问题，理由还真就是钱的事。
我觉得创业并不是什么钱都应该省，该花的钱都要花，就拿刚才那位来说，他花了钱请我同事做了，他就能安心于自己项目中他会的东西，至少能保证项目顺利进行，而现在这样，他的项目只能继续拖下去，那么请问他真的重视他的创业项目么？我不是吐槽这个朋友，只是真的不要得不偿失。
所以，要创业，请花钱，这才是一件靠谱的事情！
头有点疼，思路有点乱，写得也有点乱，见谅！
UPDATE: 后来我同事看我面，要了一半的价格做好了。</description>
    </item>
    
    <item>
      <title>Sublime Text 3</title>
      <link>https://tourcoder.com/sublime-text-3/</link>
      <pubDate>Sat, 20 Aug 2016 06:50:24 +0000</pubDate>
      
      <guid>https://tourcoder.com/sublime-text-3/</guid>
      <description>Sublime Text 3 是我喜欢的编辑器，介绍下它在 macOS 下的安装和配置
下载
Official Website
Package
  打开 Sublime Text3
  打开 Console: View-&amp;gt;Console，或快捷键
Ctrl + `   把下面的代码贴进去，具体看 PackageControl
import urllib.request,os,hashlib; h = &#39;2915d1851351e5ee549c20394736b442&#39; + &#39;8bc59f460fa1548d1514676163dafc88&#39;; pf = &#39;Package Control.sublime-package&#39;; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( &#39;http://packagecontrol.io/&#39; + pf.replace(&#39; &#39;, &#39;%20&#39;)).read(); dh = hashlib.sha256(by).hexdigest(); print(&#39;Error validating download (got %s instead of %s), please try manual install&#39; % (dh, h)) if dh !</description>
    </item>
    
    <item>
      <title>MacStyle 之环境配置</title>
      <link>https://tourcoder.com/macstyle-1-devconfig/</link>
      <pubDate>Wed, 10 Aug 2016 06:49:45 +0000</pubDate>
      
      <guid>https://tourcoder.com/macstyle-1-devconfig/</guid>
      <description>Git 版本控制环境
MAMP PHP 环境开发配置
Node.js Nodejs 的开发环境
Oh My Zsh Shell 环境
CocoaPods Xcode 第三方开发工具包管理，其中用到 RubyGems 镜像，官方镜像被墙，可考虑用淘宝镜像(http://ruby.taobao.org)
Homebrew The missing package manager for OS X，这是它的 slogan，已经说得很清楚了
至于怎么配置，怎么弄，上面的官方网址都有说明。
补充
Terminal
  Screenshot
   Theme
基于 Homebrew 主题修改，可以从这里下载我的文件，双击直接安装，在安装前，请先下载下面的字体，先安装字体。
  Font
我使用的字体情况是 InputMono Thin 14pt
你可以去官网下载最新版本。
  Ohmyzsh
Ohmyzsh 的主题是基于 af-magic 这款主题修改，具体操作如下
  Enter folder with command cd ~/.oh-my-zsh/themes
  Run command vi simple.zsh-theme
  The code in simple.</description>
    </item>
    
    <item>
      <title>MacStyle 之软件</title>
      <link>https://tourcoder.com/macstyle-1-apps/</link>
      <pubDate>Wed, 10 Aug 2016 06:49:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/macstyle-1-apps/</guid>
      <description>除了我自己的自用软件外，这里是我在 Mac 上的软件，基本满足了我的需求。
Google Chrome 浏览器
Dropbox 网盘中的王者
Sublime Text 非常好的编辑器
Spectacle 快速管理窗口，需要设置快捷键，有的快捷键会和其他软件冲突
VLC 视频播放软件
Airmail 因为没有时间继续开发自己的邮件客户端，所以买了它。上次购买它还是 1.0 版本的时候，这次购买已经是 3.0 了。[用回了 macOS 自带的 Mail.app]
The Unarchiver 解压软件
Charles 抓包工具
Photos 照片管理
Evernote 在国内叫印象笔记，笔记的好东西
Wunderlist 工作效率的管理工具
KeynoteMac 自带的办公软件，类似 office 中的 PowerPoint
NumbersMac 自带的办公软件，类似 office 中的 Excel
PagesMac 自带的办公软件，类似 office 中的 Word
Android File Transfer 在 Mac 下向安卓手机传输文件
Alfred 神器，因为它工作效率都上来了，配合 Powerpack，简直了。
XCodeiOS / Mac 应用开发工具
Android Studio 安卓应用开发工具
Docker 统一部署，统一开发。
MarkDownMD 格式的写作软件，很好用，我的书基本都是用它来写。</description>
    </item>
    
    <item>
      <title>中国游戏开发者的版号</title>
      <link>https://tourcoder.com/fgr/</link>
      <pubDate>Tue, 05 Jul 2016 06:48:22 +0000</pubDate>
      
      <guid>https://tourcoder.com/fgr/</guid>
      <description>下面这张图的信息，相信所有有 AppStore 中国区开发者帐号的人在 iTunesConnect 后台看到了，那么具体是个什么情况呢？是否有绕过的办法呢？
 目前并不是所有的应用都需要提交这些信息，当开发者在后台将应用的类别选择是游戏的时候，那么在审核的信息里面就会有提示，需要进入版号。
 如果是其他非游戏类的应用时，即将应用类别改成非游戏，则没有任何的提示
 那么我继续选择应用类别为游戏，而发行地区选择不包含中国大陆地区，即该游戏应用不在中国大陆地区运营
 但可惜的是，依旧提示需要版号。
我再次使用了位于香港的开发者账号，任何需要提交资料的提示都没有。 这就是意味着，本次 iTunesConnect 政策的更改只是针对中国大陆地区开发者的游戏应用。
不过以某总局的一贯作风，他们很快会上瘾应用审查这种事情，以后每个应用都可能会被审查。
虽然我们都说上有政策下有对策，也会有很多的办法解决这个问题，只是觉得对很多中小游戏开发团队，甚至独立的游戏开发者来说是件烦心的事情，时间和金钱的成本都增加了。
另外，我想说的是
  与其在那边喊破喉咙的各种秀着鼓励大家创业，自主发展，还不如做点实在的事情，比如少出这些无脑的政策给大家添乱。
  苹果公司这次如此合作，我略感失望。就像我在 twitter 上 @tim_cook 所说的一样，what&#39;s apple&#39;s baseline, and where?
  </description>
    </item>
    
    <item>
      <title>Git 开发模式的更新</title>
      <link>https://tourcoder.com/git-model-1/</link>
      <pubDate>Mon, 13 Jun 2016 06:47:37 +0000</pubDate>
      
      <guid>https://tourcoder.com/git-model-1/</guid>
      <description>现在大部分的团队都已经使用 Git 作为版本控制的主要软件，在这里分享下，我们团队中的 Git 开发模式
 这是早前我们开发模式，2016 年后我们改成了如下的模式
 两者之间不同的是，把 Release 分支合并到了主干 Master，这样做的原因是
  始终保持 Master 是一个可使用的版本
  增加了 Code Review 的主动性
  2018 年分支方式再次更新
项目主仓库
每一个项目应该是一个单独的库，只有一个分支
  dev 分支
是唯一的开发环境的分支，也是该仓库中唯一的分支，该分支是受保护的
  release
任何部署到生产力环境的内容，都是基于 dev 分支通过打 tag 的方式持续部署
  个人仓库
每位开发者在创建期 fork 项目，然后在自己的本地进行开发，开发完成测试通过后，通过 pr 的方式将内容合并到项目主仓库的 dev 分支中。</description>
    </item>
    
    <item>
      <title>项目中数据库的演变</title>
      <link>https://tourcoder.com/nosql-1/</link>
      <pubDate>Sun, 12 Jun 2016 06:47:02 +0000</pubDate>
      
      <guid>https://tourcoder.com/nosql-1/</guid>
      <description>作为后端开发的人员，一直以来，我使用 Mysql 作为主力数据库，然而在数据库管理方面，同时维护着多个数据库和表是一件非常痛苦的事情，尤其是表及其键值的增加修改等，每每这个时候，就想着要解决这种痛苦。
用 json 串来解决这些问题
数据表 user 的键值有 4 个， id name tel sex，常规做法就是，执行下面的 sql 语句，创建这个表
CREATE TABLE IF NOT EXISTS `user` ( `id` int(80) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `tel` varchar(255) NOT NULL, `sex` int(80) NOT NULL DEFAULT &#39;0&#39;, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 这个时候因为项目需求的变更，我们需要增加用户的生日(birth)，这时我们会在数据表中增加 birth 这一键值，这样依次操作，有的是还有一个现象，新增加的键值只是为一条或几条数据服务，而不是为所有的数据服务，那么这些数据的这一个键值的内容就是空，有些浪费。
如果我把这些内容全部通过 json 串的形式封装在一个表的键值中会怎么样呢？
上面的内容就可以写成
CREATE TABLE IF NOT EXISTS `user` ( `id` int(80) NOT NULL AUTO_INCREMENT, `jsonstring` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 而这里的 jsonstring 是上面键值的 json 串合集，形式如</description>
    </item>
    
    <item>
      <title>消灭密码</title>
      <link>https://tourcoder.com/bye-password/</link>
      <pubDate>Sun, 12 Jun 2016 06:46:18 +0000</pubDate>
      
      <guid>https://tourcoder.com/bye-password/</guid>
      <description>密码是个烦人的东西，如果设置简单，就容易被破解，如果不同网站用了同一个密码，那么你的一个账号出现密码泄漏，多个账号的密码都会泄露，比如前几天扎克伯格账号泄露的新闻。
那么，是否有可能不使用密码呢？在最近的一个项目中，我们就做了这方面的尝试。
 对，就是采用短信验证码的方式。我们是这样考虑的：
用户名是手机号码成主流
与以往的 Web 端不同，在移动端，手机号码作为登录的用户名已经是主流，这就意味着相同的手机号码在同一个移动应用中只能有一个帐户，一个用户只有一个账号有利于数据分析和应用的发展，而手机号码是个私人的东西，这么唯一性就不言而喻。
密码的使用率低
在一款应用中，密码的使用率非常低，一般出现在注册，忘记密码，重置密码这样的场景中，而这些场景是应用使用率最低的场景，这样导致密码的使用率也低。
减少了用户操作，提升体验
当用户输入手机号码后，获取验证码，这一过程就已经验证了用户的身份，如果让用户再次输入密码，就略显的多余，从最简单的用户操作来说，不用密码框的人比使用密码框的人少做了一个操作。
增加了安全性
应该很多人和我差不多，在注册一个应用的时候，密码往往就是随手输入，安全性太低，比如我常用的密码就是 000000, 而手机号码验证的话，我没有机会随手输入一个密码，安全性在不知不觉中提升了。
也许我们还有一些担忧？
短信成本
也许有人要说，加入了短信验证，会提高了应用的成本，但事实并非如此，如果你的应用采用了手机号码注册的方式，必然就需要通过短信验证对方是否拥有那个手机号码，那么成本必然没有增长，你完全可以把短信验证码理解为动态的密码。当然如果你的应用用户注册的手机号码都不验证的话，那就另当别论了。
手机丢失或号码更换
手机号码更换这完全可以在应用中的个人资料中进行更新，这个没有问题，但如果手机号码丢失怎么办呢？现在手机号码都是实名制的，如果手机丢失，用户需要做的事情是挂失补号码，而不是在应用中寻求其他的解决方案。这里有个简单的问题，一个频繁更换手机号码的人，对应用的忠诚度是多少不言而喻。
还有其他？</description>
    </item>
    
    <item>
      <title>编程字体</title>
      <link>https://tourcoder.com/coding-fonts/</link>
      <pubDate>Sat, 11 Jun 2016 06:45:42 +0000</pubDate>
      
      <guid>https://tourcoder.com/coding-fonts/</guid>
      <description>看了一集追了三季的美剧，里面有个程序员是个偏执的 Tab 党，甚至因为同是程序员的准女友喜欢用 Space，他选择不和她在一起。其实我是个 Space 党，但在实际的开发中，我喜欢两个都用，缩进的时候用 Tab，需要用到空格的时候用 Space，主要是顺手，下场是被两边的人群殴。
Space，Tab这点小事都这么重要，那么编程字体的重要性更不说了。在实际的开发环境中，每个人都有自己的喜好和标准，但有几个规则还是可以作为重要的参考因素的。
区分不混淆
所谓区分不混淆是指一些字符不混淆，比如 i、1、l、| 的区分，o、O、0 的区分，u、v 的区分等等。
能很好的支持中文
有些字体对中文的支持非常差，常常会出现中文残影，断裂的现象。
字体顺滑清晰且设计合理
没有毛边，清晰这是必然的，而现在很流行等宽字体，如果设计不合理，有时候看着不是那么舒服，显得支离破碎的。比如下面在整个文字串中，因为等宽的关系，字母 i 前后会多出很多空间，怪怪的。
最后，我推荐 Adobe 出的一开源字体，Source Code Pro，我的配置是 Source Code Pro ExtraLight 14 号。再推荐一个代码字体网站 http://input.fontbureau.com/</description>
    </item>
    
    <item>
      <title>如何在应用中集成 Admob</title>
      <link>https://tourcoder.com/admob-in-app/</link>
      <pubDate>Sat, 11 Jun 2016 06:45:09 +0000</pubDate>
      
      <guid>https://tourcoder.com/admob-in-app/</guid>
      <description>如何让免费的应用有额外的收入？Admob是个不错的选择。
什么是 Admob?
Admob 是 Google 于 2009 年底收购的广告平台，国内外类似的广告平台有很多，但实际测试下来，Admob 是我觉得最稳定和安心的。
什么样的应用集成 Admob?
理论上说所有的应用都可以集成 Admob，但我建议集成 Admob 应该有所考量，比如，你的应用是一个游戏，那么在游戏的间隙（暂停），你可以弹窗广告等。
如何在应用中集成？
简单的三步就可以完成 Admob 的集成
第一步、在 Admob 网站添加新应用
登录 Admob 的网站，登录后，选择创建一个新的应用，然后按步骤来
 输入应用名字，选择所在的平台，因为我这个是 iOS 上的应用，所以平台是 iOS。
 选择广告类型，自定义 UI，我选择了顶部的 Banner 形式。
 链接 Firebase 的统计分析，我不需要，选择跳过。
 选择完成，那么在 Admob 网站，你的创建就完成了，记录下这里的 App ID 和 Ad unit ID，后面我们将用用到，就这样我们第一步完成了。
第二步、将 Google Mobile Ads 添加到应用中
去 Admob 网站下载 SDK，当前 SDK 版本是 7.8.1,
 可以选择手工的添加方式，也可以选择用 CocoaPods，图方便，我采用了 CocaPods
 需要注意的是因为某些“不可抗力”的因素，你在使用 CocoaPods 安装时需要挂 VPN，至于 CocoaPods 这个利器怎么用等，在以后我兴许会写一篇文章。</description>
    </item>
    
    <item>
      <title>魔兽和青春</title>
      <link>https://tourcoder.com/warcraft/</link>
      <pubDate>Thu, 09 Jun 2016 15:17:26 +0000</pubDate>
      
      <guid>https://tourcoder.com/warcraft/</guid>
      <description>因为知道看这部电影时，自己会热泪盈眶，甚至会哭，所以包了场，一个人看完。
电影中那一个个熟悉的名字，熟悉的场景，让自己百感交集，此时剧情是什么已完全不重要，我已经融入到这个里面，肆意想念自己青春，肆意的流泪，不是伤心，也没有难过，而是一份心潮澎湃，激动万分。
如果说《圣斗士星矢》、《魔神坛斗士》、《奥特曼》、《三眼神童》、《天书奇谭》、《葫芦娃》、《黑猫警长》等等是童年，很好玩很有趣的话，那么《魔兽世界》、《传奇》、《星际争霸》、《红色警戒》、《灌篮高手》、《足球小将》、《海贼王》等等就是我整个青春，它和现实结合得更密切。
想起一起踢足球，打篮球，打星际争霸，通宵熬夜玩传奇的日子，想起一个个人，一件件事。
我的青春还没有结束，当《灌篮高手》等熟悉的音乐响起，我还能激动万分，心潮澎湃，甚至热泪盈眶。比起这份激动热泪盈眶，酒池肉林，聚会海吹的青春一无是处。
虽然有一段时间我很喜欢李宗盛的歌，也因为喜欢他的歌，特地去现场看了一次他的演唱会，但此刻我却愿这世界少一点李宗盛的堕世，多一份向上的热血。
如果哪一天《星际争霸》被拍成了电影，我会哭的稀里哗啦吧。</description>
    </item>
    
    <item>
      <title>我常用的一些 iOS 插件</title>
      <link>https://tourcoder.com/some-cocoapods-i-use/</link>
      <pubDate>Sat, 03 Oct 2015 06:44:15 +0000</pubDate>
      
      <guid>https://tourcoder.com/some-cocoapods-i-use/</guid>
      <description>在 iOS/OSX 应用开发中，我会用到一些插件，其中比较常规的有几个，我的 Podfile 文件内容如下
source &#39;https://github.com/CocoaPods/Specs.git&#39; platform :iOS, &#39;8.0 #platform :osx, &#39;10.12&#39; target &#39;project-name&#39; do pod &#39;AFNetworking&#39; pod &#39;PSUpdateApp&#39; pod &#39;Appirater&#39; pod &#39;Firebase/Core&#39; pod &#39;Firebase/Crash&#39; pod &#39;Firebase/AdMob&#39; end AFNetworking
这是一个网络请求的，比较好用，我也用的比较多
PSUpdateApp
用于版本更新的提醒，我用的是自己写的，未开源，这个插件和我自己写的差不多，访问这里
Appirater
用于提醒用户给应用评论，我用的也是自己写的，未开源，这个插件和我写的差不多，访问这里
Firebase (Analytics, Crash Reporting, Admob)
Firebase 可以查看官网的说明，官网地址
在 Delegate 文件中
import Firebase; // SWIFT @import Firebase; // OBJECTIVE-C 在头文件里的 application:didFinishLaunchingWithOptions: 中
FIRApp.configure() // SWIFT [FIRApp configure] // OBJECTIVE-C 即可完成配置。
Admob
Admob 的设置
#import &amp;quot;AppDelegate.h&amp;quot; @import GoogleMobileAds; @interface ViewController () @property (nonatomic, strong) GADInterstitial *interstitial; @property (nonatomic, retain) UIButton *btnClick; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.</description>
    </item>
    
    <item>
      <title>十年上海一笑而过</title>
      <link>https://tourcoder.com/ten-years-in-shanghai/</link>
      <pubDate>Fri, 31 Jul 2015 06:43:31 +0000</pubDate>
      
      <guid>https://tourcoder.com/ten-years-in-shanghai/</guid>
      <description>2005 年 7 月 31 日，我背了个塞满衣服的包，提着电脑主机和大屁股的显示器来到了上海，尤清晰地记得春子和根子两人去汽车总站接我，在莘庄地铁站一号线换五号线，两个人抬着个显示器抢座的情形，从那时起，我开始了在上海的近十年生活。
那时很流行一句话：在上海这个冒险家的世界里，只要你敢想敢做，你的愿望就可以达成！可惜那时我并没有太多的愿望，只想着能开开心心的写代码，能和那个心爱的女人在一起，结婚生子，在上海过着一份安定悠闲，很开心的生活。
然而，事情的发展并不是我想要的那样。年少的轻狂，不善于沟通表达和不安定的心，让那份很稳定的感情在七八年后走到了终点，第一次的创业也在那个时间几乎同时结束，一切都来得太突然，措手不及。搬家后，把自己关在家里整整一个月，吓得 Bob 叫来开锁师傅开我家门，看我是不是在家里想不开了，那一个月后，我想通了很多很多，也长大了很多很多。
“努力做好每一件自己想清楚要做的事情，真诚地用一颗真心和别人交流”是我这几年做事做人的一个准则，这从一些层面上切合了上面的那句流行的话，虽然在这几年中有所谓的得与失，甚至是烦扰忧愁，但我却获得了更多的快乐，在做一些事情上，我有了更多的底气。
就这样在上海过了十年，从青涩到成熟，从一个毛头小伙长成了一个能做一家之主的男人，人变得更豁达，心变得更淡稳，我心怀感恩，感谢这十年让我认识这个世界的每一个人，每一件事，感谢你们让我成长，让我成为 Better Man。
下个十年，我一定做好儿子，丈夫和奶爸的角色；下个十年，我一定让每个同事因为公司而倍感荣耀。下个十年，我更努力！
PS. 在写这篇博文的过程中，脑子冒出昨天的两段对话，同事问我为什么每次都能抓住客户项目的点，朋友问类似选择某人的问题，其实在和客户谈项目前，我已经在脑子里面把这个项目过了几十上百遍，把每个和客户沟通的场景脑中演练了很多遍，自然会抓住那些点；同样选人也是，一个人在我脑子里面想了千遍万遍，甚至做梦都梦到，那些身上所谓的好与坏，点点滴滴都想遍了，这时心里选择的还是这个人，那么选择肯定就对了。</description>
    </item>
    
    <item>
      <title>NodeJS 学习笔记</title>
      <link>https://tourcoder.com/study-nodejs/</link>
      <pubDate>Sat, 04 Jul 2015 06:42:39 +0000</pubDate>
      
      <guid>https://tourcoder.com/study-nodejs/</guid>
      <description>前言: 关于NodeJS
Chrome V8 Javascript 引擎上的运行时(runtime)。官方网站 http://nodejs.org ， 开源地址 https://github.com/nodejs/node 。
第二章 安装配置
  2.1 安装及配置
均去官网下载对应的系统版本进行安装，下载地址 https://nodejs.org/en/download/
  2.1.1 Windows 下安装
下载对应的 msi 或 exe 文件，双击安装，如下图，一并安装的还有 Node 包管理器 (Node Package Manager 又叫 NPM)
  可以自由的选择安装位置
 选择安装的内容
多个下一步后，完成安装，安装位置是上图中你定义的位置。
在命令行中运行 node -v， 可以看到你所安装的 nodejs 的版本，运行 npm -v 则可以看到你的 NPM 的版本。
  2.1.2 Mac OSX 下安装
下载对应的 APK 文件，双击安装，如下图，一并安装的还有 Node 包管理器
 在多个继续的点击后，进入最后一步
 可以看出，Node 的安装位置是 /usr/local/bin/node，而 NPM 的安装位置是 /usr/local/bin/npm</description>
    </item>
    
    <item>
      <title>被 Yahoo 收购了</title>
      <link>https://tourcoder.com/yahoo-style/</link>
      <pubDate>Sun, 11 Jan 2015 06:41:48 +0000</pubDate>
      
      <guid>https://tourcoder.com/yahoo-style/</guid>
      <description>阿里巴巴上市，Yahoo套现，梅耶尔又有钱开始收购了，这不，刚收购了一家印度的公司。
在过去的2013年，这位大姐一口气收购了近30家公司，非但没有给Yahoo带来质的变化，就连这些被收购的公司自身都难保，除了关闭的，其它基本也和死了差不多，这里面最有名的就要算Tumblr了。
今年这大姐也已经收购了10几家，目前收购的脚步还在继续。
没钱的时候，这大姐卖资产换钱，有钱的时候莫名其妙的收购，完全是帮创业者暴富，为社会造更多富翁的节奏。反正我是看不懂，不知道那些一开始吹嘘她是Yahoo最适合的CEO，现在却一点屁都不放的人，你们是否还看得懂。
说起收购，无外乎用户，人才技术和防御，粗略的说
  因为该公司有你想要的用户，所以收购
  因为该公司有你想要的人才技术，所以收购
  因为该公司能形成你的战略防御体系，所以收购
  可她的收购有几个是真的符合这些的？
目前看来，梅耶尔自己也不知道如何让Yahoo走在正确的路上，该如何振兴Yahoo！在Google时，她也许是个很好的产品经理，很好的leader，但她毕竟没有自己创业过（她只是Google创业期的第一位女工程师），她现在的做法是很多创业初期的人都会做的事情
  有钱了，总想着为公司买点什么，比如她现在的各种不明的收购，也许有人说，她买这么多的创业公司，目的是为了让Yahoo有更多的创业精神，对这句话，我只能说扯，创业精神也是买得来的么？
  没钱了，总想着公司是不是太臃肿了，是不是应该精简下，卖掉一些资产吧。
  闲的蛋疼了，总想着重塑品牌，比如她为了给Yahoo换logo，还玩了个每天一logo的营销游戏，没想最后选择了一个奇丑的logo。
  本来想多说她几句，在翻看了Yahoo的收购历史后，淡定了，这完全是环境使然啊，只不过她更凶猛点而已。
从这一长串的 Yahoo的收购历史 中可以看出，Yahoo“创造”了多少富豪，比如Broadcast.com，这次收购直接让马克库班一夜暴富，后者直接买了达拉斯小牛队，而Broadcast.com没过多久就死掉了，其他被收购的公司，是这种情况的很多。
猜想下，再这样收购关闭的循环下去，那么被Yahoo收购，哭还是笑?这个可能要成为诸多科技版的头条标题了吧。
小时候听了很多Yahoo创始人是中国人的故事，被洗脑了，喜欢上了Yahoo，后来喜欢YDN，但现在看着Yahoo越走越远，很想对它说一句：Yahoo，我做你的CEO，可好？！</description>
    </item>
    
    <item>
      <title>读书观影</title>
      <link>https://tourcoder.com/booklist/</link>
      <pubDate>Thu, 01 Jan 2015 09:02:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/booklist/</guid>
      <description>2026 年
  [电影] 寻秦记（2026 年 01 月 05 日看完：剪辑得太差了，完全一盘散沙。每次情绪要上来的时候，就被一个莫名的叙情给泼了一盆冷水。）
  [电影] 长安的荔枝（2026 年 01 月 03 日看完：这是古人的一生还是当今世人的一生呢？）
  2025 年
  [电影] 驱魔龙族马小玲（2025 年 12 月 14 日看完：陈十三，1. 真的不是是个人露个腿就能赶上你老婆，就能是马小玲的；2. 山本一夫就是山本一夫，与其改名龙一夫，还不如换个名字，比如抗战的其他战士；3. 我能接受情怀，但僵尸系列还不足以让我完全是情怀。）
  [电影] 一战再战（2025 年 10 月 16 日看完：英文标题是 One Battle After Another，所以导演编剧，你们在战斗什么？解放黑奴吗？）
  [美剧] 性生活（2025 年 09 月 20 日看完：看完第一季完全不想看第二季了，我真想问问这部剧的导演和编剧，在她们的世界里，女性的独立自强就是随时随地的想高潮，即便有家庭了，但自己想和谁搞就和谁搞，对吧？）
  [电影] 超人（2025 年 09 月 06 日看完：大杂烩？完美大超还是不够完美啊，至少电影表现出来他是个弱智）
  [电影] NOBODY 2（2025 年 09 月 06 日看完：没意思，几乎是拷贝第一部的路子，文戏表达等一个都没有有效的展示出来，生硬。）</description>
    </item>
    
    <item>
      <title>阿里巴巴上市</title>
      <link>https://tourcoder.com/alibaba-ipo/</link>
      <pubDate>Tue, 23 Sep 2014 06:41:04 +0000</pubDate>
      
      <guid>https://tourcoder.com/alibaba-ipo/</guid>
      <description>不知道为啥，阿里巴巴的上市似乎戳中了很多人的G点，各种言论层出不穷，最有代表性的是下面一段话:
据说杭州阿里总部已经沸腾了！每人182万美元！阿里巴巴集团今天上市，确定IPO发行价为68美元，此次上市募集资金217.6亿美元，最高募集资金250.2亿美元。将造就百万富翁近万人，30人合伙人团队分享210亿美金，11000名有期权的员工将分享200亿美金，平均每人182万美金。跟对人，做对事，合作伙伴很重要！ 这样内容的短信和微信至少收到了10条，还不算微信朋友圈的分享。大家都在感概最后一句话跟对人，做对事，合作伙伴很重要！，但这句话真的很对吗？我持有完全不同的想法，至于为什么，说两个事情吧。
一：Apple其实有第三位创始人，Apple的第一个logo就是他画的，可是他在Apple成立了12天后，把自己10%的股份以800美刀卖出，这些股份在现在也就是值600多亿美刀吧。即便按当年Apple上市来算，1980年上市，上市后这10%的股份是1.7亿美元，Apple成立于1976年，也就是说四年时间，10%的股份从800变成了1.7亿。这些维基百科上都可以查到。
二：在阿里巴巴中途离开的人呢？是个什么情况？一根鸡毛都没有捞到的人又有多少？ 所以，这句话虽然是对的，但不是绝对的，更不是重点。重点应该是自己的坚持和信仰，坚定自己的想法，做自己想做的，能让自己专注的事！。
最后要说的是，阿里上市对我是有些间接影响的，因为雅虎和阿里的关系，我在阿里上市前又多买了点雅虎的股票，现在就希望雅虎能涨呗:)</description>
    </item>
    
    <item>
      <title>远程工作</title>
      <link>https://tourcoder.com/remotework-1/</link>
      <pubDate>Thu, 14 Aug 2014 06:40:27 +0000</pubDate>
      
      <guid>https://tourcoder.com/remotework-1/</guid>
      <description>自从采用远程工作(Remote Work)的工作方式以来，经常被人问起，你这样可行么？你这样怎么管理团队？其实，越是我们这样技术型团队越应该多多采用远程的工作方式。
  远程工作让注意力更专注
L大神曾说过一句 talk is cheap, show me the code，程序员之间最好的交流的方式就是代码，github 的红火也正好说明了这点，远程工作可以让团队更专注于代码，更专注于实现功能，解决问题。
  远程工作让工作效率更高
每个人对工作时间的需求，对工作场地的需求都是不一样的，远程工作可以让大家在自己喜欢的时间和空间里工作，精神饱满且效率很高。试想一下，当一个人每天要开一个小时的车或者坐一个小时的车到公司，拥挤心情差，在这样的一种状态下工作一天，效率能多高呢？
  远程工作能招到更优秀的人才
招到一个合适而又优秀的人才是件很难的事，有时好不容易招到一个人，却因为不能local工作而失去，非常惋惜。远程工作就可以解决这个问题，远程工作可以让全世界合适而又优秀的人才为项目工作。
  当然远程工作不是万能的，也并不是所有的工作都适合远程工作，在远程工作中也会遇到一些问题
  自控力和干扰因素
这应该是对远程工作者来说是最大的问题了，除了要求远程工作者有很强的自控力外，基本无解，可以引入GTD工具作为辅助引导。而干扰因素也会突然增加很多，这就需要远程工作者如第一条所说，找到自己效率高的时间空间，调节安排。
  沟通
虽然现在的IM工具已经很好的解决了沟通问题，但在一些问题的细节讨论上，还是需要面对面的沟通，尤其是一些重要的环节，面对面的沟通必不可少。
  感受
因为远程工作，队员们根本无法感受到彼此的态度等，这往往会带来一定的麻烦，举个例子，当你对某人不满意了，在电话，IM这些工具中你是无法让对方直观的感受到你的不满意，这时候需要两人直面交流。
  有些工种
有些工作是无法远程工作的，比如电话业务员。
  客户拜访
在国内（国外不知），客户动不动就想拜访你公司的情况非常普遍，有的更离谱到恨不得住在你公司监督着你的人，还有一些客户甚至会根据你团队的大小给你项目费用。所以这看来是个很严重的问题，但这却不在远程工作的讨论范围，因为这是一个误区，远程工作不表示不要办公室。
  远程工作的好处还有很多，环节城市交通，节约能源等等，同样问题也还有很多，但有这么一个更好的工作方式，为什么不试试呢？</description>
    </item>
    
    <item>
      <title>创业者说</title>
      <link>https://tourcoder.com/startup/</link>
      <pubDate>Tue, 12 Aug 2014 06:39:50 +0000</pubDate>
      
      <guid>https://tourcoder.com/startup/</guid>
      <description>写在前面
有段时间很喜欢“扮演”创业导师，也去做过两次创业分享会，后来还是因为不适应这种身份和环境，放弃了，就再也没有参与过，但总还是想把自己创业路上的点点滴滴分享出来，而写博客就是个好的途径。这样做也迎合了互联网的精神－－分享。
为什么要创业？
和早些年创业不太一样，近些年创业似乎成了一股风气，到处都鼓吹着创业，人人都在创业，似乎只有创业才能实现自身的价值，然后很多创业者却忘了自己创业的初心是什么。他们谈得很多的是这个怎么样，那个如何，却唯独没有问自己我为什么要创业？，很多人是为了创业而创业，很多人只是憧憬当老板的感觉，幻想成功后自己辉煌的样子。创业前多问一句为什么，有好处！
核心竞争力
有的人知道自己为什么创业了，但却不知道自己的核心竞争力是什么，总觉得别人能做的，自己也能做，看起来根本就不难，甚至极度容易，然而实际操作后才发现有巨大的落差。因为不知道自己的核心竞争力，频繁变更创业方向和产品就是一个很好的例证，每天在众多看似可行的点子上，来来回回，纠结彷徨，却没有扎实地将任何一个落实到行动上。心态的变化也是一个很好的例证，每天躺在床上，雄心勃勃，恨不得马上起床，立刻工作，一直工作到成功那一刻，可第二天起床又回到了前面的纠结彷徨。创业前弄清楚自己的核心竞争力，把自己最强的一面落地，很重要！
忙
父母想和你打个电话聊聊天，你说忙；老婆女友想和你看场电影，你说忙；兄弟朋友想约你一起吃饭打打球，你还说忙。似乎，全世界只有你最忙！其实你未必很忙，很大可能你只是沉浸在了你想像中忙的假象中，而且有些忙是完全没有必要的，甚至给你的创业带来反向力。创业中“很忙”时，应该停下来想想自己真的这么忙吗？
面子和钱
有个兄弟和我分享过一句他听来的话“先不要脸赚钱，再用钱买脸，最后用脸赚钱”，虽然这句话我不百分百的认同，但这话也表明了一个观点，给了很多创业者一个思考的点。细说起来，面子和钱之间并不矛盾，尤其在当前这个物欲横流，基本靠金钱衡量的社会，它们之间应该是相辅相成的，通俗的说，有钱才有面子，做出有价值的东西才会有面子。创业中你是要面子，还是要钱让你的公司和项目持续下去？要知道，很多时候你的面子都是你自我认为有的，而且自我感觉良好的身份也是你自封的。
脑补和独立思考
创业中的我们因为相信未来的美好，但前进路途艰辛，往往需要打鸡血，让自己时刻保持激情。“吃”很多脑补的东西，就成了很多人喜欢做的事情，比如阅读各种创业传记，名人传记，参加各种创业聚会，甚至是听一些名人的现场演讲。不是说不好，而是这些往往效果不大，至少我是这样。我读了很多创业传记，名人传记，参加过创业聚会，在现场就差像搞传销那样，大家振臂高呼“我们是最棒的，我们要创业！”&amp;hellip;这一切经历后我发现自己除了记得这个人用了多长时间赚了多少亿元，另外一个人又是在35岁前做到了什么，其他的全部都不记得了。
现在我还是会读一些书，看一些视频来脑补，主题内容却变得很杂，但它们都有一些共同的特点，要么能提升我的专业技能，要么是能引起我的独立思考，任何时候，专业技能的提升是一个人价值提升的直观体现，而拥有独立思考能力，这是一个人作为人的证据之一。
推荐一下《TED》上一些能引发思考的公开课，很棒。比如耶鲁的公开课“死亡”和“金融市场”，当然这是非标准，每人有自己爱好，能引起自己独立思考就好。至于技能读物，相信你能找到。
写在最后
以上所有的话都可能是废话，谁都会说出来，重点在执行。
归纳起来，弄清楚自己是否适合创业，熟知自己的核心价值，也明白了让公司正常运转的钱比面子在创业中更重要，同时你还有独立思考的能力，愿意不断提升自我，那么就去创业吧！
但是，如果你在创业中做不到，能和父母最长一个星期通个电话聊聊天，能和老婆女友一起去看喜欢的电影，能和兄弟朋友去打场球吹个牛，那么你还是找份工作吧，这可能更好！
update@20140812 : 创业者说(2)
创业到底是什么样的？这无法千篇一律，每个创业者都会有不同的答案，而且都是正确的答案，当然这些答案肯定不包含下面这些内容：
  创业绝对不是租个办公室，招几个人刷刷微博聊聊天，弄个头衔印个名片随便发，然后对全世界宣布自己当老板了。
  创业绝对不是东一榔头西一棒子的纯吆喝。吆喝完了，你还能剩下什么？
  创业绝对不是毫无准备的。创业者应当有一口“好牙”，逮住机会就应该死死咬住不放。
  创业绝对不是毫无责任的纯忽悠。忽悠在创业的过程中是必须的，忽悠只是为了争取到一个展示自己的机会，在争取到这个机会后，必须把握住，把后续的事情做好做彻底。如果是用很低级的方式这里忽悠一批人后，再去另外一个地方忽悠另外一批人，甚至把自己都忽悠了，这就太可悲了。
  创业绝对不是被别人主导着你。在创业过程中会有很多人不理解，甚至这些人中有自己的亲朋好友，自己的家人，大家都对你的所作所为冷嘲热讽，尤其是在当前这个以金钱衡量成功与否的社会，你遭受的东西会很多，这些都不重要。坚定自己的想法，坚持自己的想法，才是最重要的，往往一个事情没有做成做彻底的原因是自己先崩溃了。
  创业绝对不是没有担当。一个没有担当的人做出来的产品会是什么样子的，无法想像！
  创业路上要做的事情很多，但绝对不能做的事情更多，唯有一步一个脚印的落实到地，当然，如果你不是从底层做起的人，那就另说了。
update@20150314 : 创业者说(3)
如果前两篇的创业者说在说理的话，那这次介绍下我们团队的一些实战情况吧。
团队层级
我们团队是一个无层级的扁平结构的团队，团队里没有层级，也就意味着团队里不存在固定的上下级，即便是创始人也不例外。
没有层级，但有项目负责人，以项目驱动，对该项目理解最透彻的团队成员是该项目的负责人，一切围绕他的架构展开，他有最高等级的决定权，同时他也担负着最大的责任，其他该项目组里的成员需要向他及时的更新自己的项目信息。（这里关于项目责任制的详细内容，可以去看我写的书《那些我做过的项目》）。
因为没有层级，自然就没有什么总什么经理的头衔，那么彼此之间有个合适的称呼也就成了重点，昵称是我们团队唯一使用的称呼，而且昵称还拉近了大家的距离，让彼此亲近了许多，昵称在我们团队中还有更多的应用。
团队文化
“开放，透明”，这两个词是我们一直追求，并努力做到的事。团队成员之间尽可能的把技能信息公开，公司尽可能的向每个成员公开信息。
系统工具 我们常用到的系统工具是三个：
  沟通交流系统
目前我们使用的是 Google Apps for Work，里面包含了多个工具组件，但我们也只是用到了其中 Gmail for Work (以公司域名为后缀的邮局系统)，其他的组件还有 Hangouts，Docs，怎奈被墙，用起来不是那么方便，加上我们内部另外一套系统强劲，基本不需要用到这些，也就没有使用了。需要注意的是，Google 的这套组件目前已经不再免费，每个账户每年需要收费 $50，目前国内有不少免费的企业邮局系统，最好用的应该算属腾讯的吧。 而即时通讯方面，我们使用的是集成在项目管理的聊天插件，专注于对项目的讨论，无可否认 QQ 目前是做得最好的聊天工具了，但很奇怪它并没有成为我们工作沟通的主要工具，更多的是私聊工具。</description>
    </item>
    
    <item>
      <title>我欢迎这样的骚扰电话</title>
      <link>https://tourcoder.com/welcome-spam-calls-like-this/</link>
      <pubDate>Thu, 17 Jul 2014 06:38:46 +0000</pubDate>
      
      <guid>https://tourcoder.com/welcome-spam-calls-like-this/</guid>
      <description>如果在国内某个地方留下的自己的个人信息，即便是留给工商税务局这样的政府部门，抑或是银行这样注重信息安全的机构，自己的个人信息都将会进入一系列的黑数据中心，这些中心有各种骗子呼叫中心，各种推销呼叫中心，各种垃圾短信中心等等，并且随着进入的黑数据中心越多，每天所接到的骚扰电话短信就越多，而我不幸&amp;quot;中标&amp;quot;到现在，以至于每天都会接到十来通的电话(多的时候会有20多通)，十条左右的短信，不厌其烦。
有时候我也会和这些打骚扰电话的聊几句，在和他们的聊天中，发现其实有部分电话，我还是愿意多听几句，甚至愿意接受他们所提供的服务，这些电话有着一些共同的特点：
  不是自动拨号的语音录音电话
有些骚扰电话非常省事，接了这些电话后，会听到一段语音录音，这种电话多是骗子电话（110通知，法院传票，律师函），股票金融投资，代开税务发票等。一般接通这些语音录音电话，我都直接挂断，随手添加到block库中。想给我推销，请先找个人来和我沟通。
  有礼貌的开场和专注
一直以来，我都认为打业务电话是一门高深的技巧，需要公司花大量精力金钱培训出来，我也很佩服那些能打好业务电话的人。然而在接到一些业务电话的时，我却会明显感受到对方没有被专业培训过，完全不专注这通电话。就拿开场来说吧，电话接通后，会听到很重背景声（比如其他业务员在和别人通话），而给我打电话的业务员似乎是在剪自己的最后一个手指甲，总是会停顿几秒钟后，才会慌忙和我通话，这时候往往连一句最简单的问候“你好”都不会说，完全是一副没有准备好的状态。一开始以为这只是个别情况，后来这类电话接多了，发现是一种普遍的现象(莫非电话系统一直有这种bug？)，如今再接到这种电话，我通常是两三秒没有人说话，直接挂断，随手添加block库中。各位招聘电话业务员的人事，招到人只是个开始，培训好他们，让他们更专业是一条更重要的路。
  有节制的拨打
有些电话打起来很没有节制，不分时间的狂轰乱炸，如果不是晚上10点到第二天9点我都设置了免打扰，估计晚上哄我入睡的，还有半夜和早上叫我起床的将会是这类电话，这话毫不夸张，早上看电话，总会有几个未接，看时间，夜里3，4点的都有。还有些电话，我刚明确拒绝他们的服务并把电话block掉，过一会我就会再次接到这家公司的电话，而且还是这个人打的(这种情况曾让我一度怀疑iPhone的block功能是不是有问题，后来发现只是这个人换了个电话号码)，这里我要点名百度地图，其电话团队也是一个很没有节操的团队，也做一样的事情，只是拨打的数量比其它的少点。试问这些脑子抽了筋的老板，你让业务员以这种没节制打电话的方式来拓展业务，真的能获得业务吗？除了能让你们的电话号码被block外，你们在众人眼里也会很low，而且你的员工整天会因为这种电话被人骂，心情会郁结，公司满满的负能量，这真的对你企业的发展有好处？！
  垃圾短信
当Apple在2011年推出iMessage的时候，我想可算用上能和SMS无缝结合的App了，可谁想没用了多久，我就在iOS中关掉了它，理由吗？垃圾短信太多！同样现在很多人的短信功能，基本就是接受垃圾短信了吧？！
  所以，如果你的业务电话能满足上面的三个条件，我还是愿意接你电话，听听你讲点什么，如果不能，Stop calling anybody！</description>
    </item>
    
    <item>
      <title>克洛泽真的比肥罗强吗？</title>
      <link>https://tourcoder.com/r9-vs-c11/</link>
      <pubDate>Tue, 15 Jul 2014 06:37:52 +0000</pubDate>
      
      <guid>https://tourcoder.com/r9-vs-c11/</guid>
      <description>世界杯已经完结，但不少媒体还在刷存在感的说着世界杯的话题，其中克洛泽复仇肥罗，把肥罗比下去成了很热的话题，那么克洛泽真的比肥罗强吗？来比较下：
世界杯进球数及效率
克洛泽：参加了四届世界杯，全都作为主力，出场23场，进球16个，场均0.696个。
肥罗：参加了四届世界杯，第一届没上，其余出场19场，进球15个，场均0.789个。
目前有统计的世界杯射手排名前几位中，克洛泽的场均进球是最低的。
世界杯的冠军数
克洛泽：参加了四届世界杯，拿了一届冠军(2014)，总决赛没有进球，无法左右比赛。
肥罗：参加了四届世界杯，拿了两届冠军(1994，2002)，1994看客，混了个杯，2002绝对主力，决赛正好对德国，肥罗直接进2个，左右比赛。
对手
克洛泽：面对的后卫属于顶级的并不多，很多的都是叫不上名号。
肥罗：面对的顶级后卫数不胜数。 那些后卫都胆颤于肥罗，而不会害怕克洛泽，如果说能让一个两个顶级对手害怕是很强，那能让一群顶级对手害怕该是什么呢？
职业生涯
这个克洛泽完败，看两人所效力的球队和进球数，太直观了。
个人荣誉和薪资
无可争议，这个克洛泽也是完败。
球迷喜欢程度
喜欢肥罗的人除了他那对标志性的兔牙外，更多的是被他大开大合的球风所折服，喜欢克洛泽的呢？
虽然我不是肥罗的粉丝，虽然我也挺替克洛泽能成为世界杯进球最多的人而高兴，但真如我在一个朋友的帖子下面留言的一样，克洛泽是德国队这台精密机器的一个重要部件，但肥罗自身就是一台精密的机器，怎么比，怎么克洛泽就把肥罗比下去了？
ps. 也有不少人说，肥罗有天赋但不努力，克洛泽没有天赋但努力，且不说天赋这个词本就是很扯外，在努力上肥罗并不比克洛泽差，巴西球员大部分都是出身穷苦，都是从小努力训练才会有这么好的球性，这么精湛的技术，比如小罗，阿德等，也正是小时候太穷，才会导致他们成名后，会跌落得比较快，各种赛场外新闻频出，小罗阿德也是这方面的代表，他们在一次跌落后，基本就废掉了，再看肥罗经历多少次跌落，甚至从会导致他瘫痪的重大伤病中恢复过来，重新站在顶峰，不努力能行？</description>
    </item>
    
    <item>
      <title>Linux 下利用 crontab 自动备份</title>
      <link>https://tourcoder.com/auto-backup-on-linux/</link>
      <pubDate>Sat, 22 Mar 2014 06:37:07 +0000</pubDate>
      
      <guid>https://tourcoder.com/auto-backup-on-linux/</guid>
      <description>数据有多重要，不用我详说，如果每天人工备份，又太繁琐，所以利用 crontab 来自动备份文件就是一个很不错的办法。
导出文件或打包压缩文件
  Mysql 数据库
首先需要导出数据库的内容
  导出到文件
/usr/bin/mysqldump -u root -ppwd database &amp;gt; database.sql   或者导出成压缩文件
/usr/bin/mysqldump -u root -ppwd database | gzip &amp;gt; database.sql.gz   补充：导入到数据库
mysql -u root -p database &amp;lt; database.sql //从文件导入到数据库 gzip &amp;lt; database.sql.gz | mysql -u root -p database //从压缩文件导入到数据库   其他文件
其他比如网站的文件等，可以直接用压缩命令打包压缩成压缩文件即可。
tar -zvcf packagename.tar file/forlder     mongodb
直接上脚本
#!/bin/sh DUMP=/usr/bin/mongodump OUT_DIR=/home/backup/mongodb_backup DATE=`date +%Y-%m-%d` DB_NAME=DBNAME DB_USER=dbusername DB_PASS=dbuserpassword TAR_BAK=&amp;quot;mongodb_$DATE.</description>
    </item>
    
    <item>
      <title>REST API 规范手册</title>
      <link>https://tourcoder.com/api-manual/</link>
      <pubDate>Thu, 25 Jul 2013 06:36:11 +0000</pubDate>
      
      <guid>https://tourcoder.com/api-manual/</guid>
      <description>这是我之前写 REST API 的规范手册，在具体的项目中会有调整
通用说明 - header 返回
接口存在，返回 200，并同时返回以下信息
HTTP 200 No Error Content-Security-Policy: Server: API-Media-Type: version.v1; format=json Status: 200 OK Access-Control-Allow-Origin: * Date: Sun, 07 Jan 2018 15:26:30 GMT+8 Content-Type: application/json; charset=utf-8 接口不存在，返回 404，并同时返回以下信息
HTTP 404 Not Found Content-Security-Policy: Server: API-Media-Type: version.v1; format=json Status: 404 Not Found Access-Control-Allow-Origin: * Date: Sun, 07 Jan 2018 15:26:30 GMT+8 Content-Type: application/json; charset=utf-8 通用说明 - 请求地址
要为 REST API 设置专门域名，并加 SSL，请求地址中需要有版本号，如 https://domain.com/v1/</description>
    </item>
    
    <item>
      <title>iOS Dev Tips</title>
      <link>https://tourcoder.com/ios-dev-tips/</link>
      <pubDate>Thu, 10 Nov 2011 06:35:13 +0000</pubDate>
      
      <guid>https://tourcoder.com/ios-dev-tips/</guid>
      <description>AVPlayer 暂停继续播放
最近在开发一款视频直播的应用，其中有一个功能是进入后台暂停，再次进入前台后继续播放的问题，可以通过 Appdelegate 中处理这个问题，先上代码
- (void)applicationWillResignActive:(UIApplication *)application { [player pause]; pausedtime = player.currentTime } - (void)applicationDidBecomeActive:(UIApplication *)application { [player seekToTime:pausedtime toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; [player play]; } 思路是
  在进入后台，即将不活跃的时候，记录下当前时间，就是上面代码的 pausedtime，这里需要在 Appdelegate 里面定义一下 float *pausedtime
  在 applicationWillResignActive 中获取当前暂停的时间
  在 applicationDidBecomeActive 中续播
  MD5 加密
  新建 NSObject，命名为 MD5
  头文件 MD5.h
#import &amp;lt;Foundation/Foundation.h&amp;gt; @interface MD5 : NSObject + (NSString*)md5:(NSString *)stringToEncrypt; @end   主文件 MD5.</description>
    </item>
    
    <item>
      <title>What a fucking day!</title>
      <link>https://tourcoder.com/what-a-fucking-day/</link>
      <pubDate>Thu, 06 Oct 2011 06:34:31 +0000</pubDate>
      
      <guid>https://tourcoder.com/what-a-fucking-day/</guid>
      <description>早知道会有这么一天，可真当这天来临的时候，我却如此无能为力，视线瞬间模糊。Techcrunch的标题清晰地告诉我，Jobs真的离我们而去了，oh，What a fucking day!除了糙话脏话外，我也不知道自己该说些什么。也许uncrunched的说的是对的，“You lived. You really, really lived.”</description>
    </item>
    
    <item>
      <title>WWDC 2011上的&#39;新鲜&#39;</title>
      <link>https://tourcoder.com/wwdc-2011shang-de-xin-xian/</link>
      <pubDate>Tue, 07 Jun 2011 06:33:54 +0000</pubDate>
      
      <guid>https://tourcoder.com/wwdc-2011shang-de-xin-xian/</guid>
      <description>昨天熬夜看完了 WWDC 2011,有些意料之内,也有一些意料之外&amp;hellip;意料之内的是推出了一系列的先前已经被猜出来的东西,甚至是mobileme免费,意料之外的是,本以为只有iphone等移动设备会向着SNS方向发展,但现在整体看下来,整个苹果的产品线似乎都在向着SNS发展.
一. Lion
相对于它的前任(SL),这个版本的系统增加了不少贴心的功能,虽然这些功能并不是那么新鲜,我们甚至在其他地方都见过或者听说过,但真能如此自如地运用的,应该当前只有Mac一个,让我惊讶的是它的价格,相比起微软的大几百上千的windows费用,这次的Lion只要29.99美元,折合人民币200元左右,这绝对是在我们能够承受的范围之内的.当然,你需要一台昂贵的苹果设备来安装它.
二. iOS 5
iOS 5改变的东西太多了,更准确的说是改进的内容很多,提醒通知功能,照相功能,邮件功能等,而它把先前的软键盘一分为二的做法也并不是那么新鲜,我个人很不喜欢这次更新中的一个重要特性&amp;ndash;引入twitter,虽然我是一个twitter的用户,但我真的很不喜欢苹果预置太多的东西在里面,比如youtube,nike等,我觉得这些东西的APP,应该和我们普通开发者一样,进入AppStore,让需要下载的人去下载它,而不是预置.前段时间还听说国内某视频公司想和Apple谈,让在国内销售的iphone等预置他们的视频APP,去他大爷的.
三. iCloud
新鲜吗?不新鲜!又是一个新瓶装旧酒的东西.唯一不同的是,它现在免费了.从最早的.Mac,到后来的mobileme,似乎在同步应用上,苹果一些考虑得都不够成熟.老乔还批评了Gmail,作为一个邮箱重度使用者,我觉得老乔说这个话是没有任何一点底气的,他除了能拿那广告来说事外,基本已经没有批评Gmail的理由了,不知道Google是否会针对老乔的这段话来对Gmail调整,让Gmail去掉所有的广告呢?呵呵,我想太多了.
这里让我感受最深的还是鼠标已经开始告别历史的舞台了。总之,这次的WWDC,对Apple的产品一直抱着尝鲜态度的我,失望大于期待,你呢?</description>
    </item>
    
    <item>
      <title>玩--一件不简单的事</title>
      <link>https://tourcoder.com/wan-yi-jian-bu-jian-dan-de-shi/</link>
      <pubDate>Sat, 04 Jun 2011 06:33:05 +0000</pubDate>
      
      <guid>https://tourcoder.com/wan-yi-jian-bu-jian-dan-de-shi/</guid>
      <description>《功夫熊猫2》的上线，牵动了不少人的神经，他们又开始沮丧，失落起来，理由极其的简单，也同样引用一篇影评来说：
“熊猫是我们的，功夫是我们的，可电影为什么是他们的？”也许是美国人离得远，才能用一种“超脱”的视角去观察异国文化。我们骨子里缺乏“玩”的精神，很难举重若轻。
这句话在微博上受到不少人追捧，甚至还有人以这句话为理由，扩展开去，认为我们除了没有玩的精神外，我们也没有创新，美帝的创新有多好，玩得有多酷，事情也的确如此。那到底是什么扼杀了我们玩的精神呢？
一、体制
不能说我们的体制是多么的糟糕,以至于我们没办法玩,应该说,我们的体制非常不够完善,不足以支持我们去玩.
二、经济
我们现在连最基本的生活保障都没有,每天都要为生计而忙碌,哪里还有那个玩的心情.
三、唯利是图
这个世界上被很多人广为传诵的玩的代表,就应该是Google公司的20%的个人时间了吧.来看看我们国内的绝大部分公司吧,每天的指标就是你今天要完成多少工作量或者业务量,一切是向钱看的,而且除了钱外,其他的时间大家都是放在了和同事交际,巴结上级和领导上了,这样才能保障自己的利益不受损害,虽然有时候交际也是在玩.
四、坚持
也有不少玩的,同样也有不少玩得很出色的,我曾经就碰到过这么一个团队,他们所玩的东西很酷 &amp;ndash; 原创性,体验性等等都是很不错的,可惜因为后来一些原因,他们没能坚持下来,关闭了项目,再后来的一年后,国外出现了一个类似他们的东西,很火,一直火到收到了上千万的投资,现在还在迅猛的发展.
同样是玩,但并不是所有的人都玩的起的,光是上面的四点,已经足以让一段可能玩得非常出色的时间黯然无光,我也不知道我除了在这里呐喊外,我还做了什么,我又能做什么.
可能,玩,真不是一件简单的事!</description>
    </item>
    
    <item>
      <title>关于西瓜的回忆</title>
      <link>https://tourcoder.com/guan-yu-xi-gua-de-hui-yi/</link>
      <pubDate>Fri, 20 May 2011 06:32:35 +0000</pubDate>
      
      <guid>https://tourcoder.com/guan-yu-xi-gua-de-hui-yi/</guid>
      <description>最近讨论得比较热的一个话题，估计要算是对西瓜不安全性的讨论了，更很玄乎的事情是，我可能要过一个不能吃西瓜的夏天，这不是要我的命嘛！
我是一个农村长大的孩子，经历过大家为了致富放着农田不种，把农田全部给种上桑树养蚕这样的疯狂的阶段，还有一个疯狂的阶段就是把全部农田用来种西瓜，种西瓜的那两年我过得可开心了，因为那年父亲也从外地打工回来了。
和父亲出去卖西瓜也是一件挺有意思的事情，我们拉着一车的西瓜，在县城里面转，叫卖，因为天气太热太热，走不了一两个地方，父亲就会问我，我们吃个西瓜吧？我说好啊！然后我们就会找个阴凉的地方，吃西瓜！因为要包熟，所以，别人挑好瓜，过秤后，都会要求你打个三角形的口，看瓜熟了没有。常常出现的情况是，刚切第一刀，瓜就喷的一下裂开了，而往往这个时候，别人都会很开心的把这个瓜提走，因为他们知道这样的瓜很沙甜很脆很好吃。当然，这和现在网上疯传的打什么药剂瓜甜开裂是完全不同的。记得第一个和父亲卖瓜，就这样我们吃吃卖卖，很快就卖完了，然后我坐在板车里面，父亲拉着车子，慢悠悠的回家，到家一算，我们只赚了5元钱，而隔壁的邻居，人家一车瓜赚了200多&amp;hellip;到现在，我都想不明白，为啥他赚了200多，难道真的是我们吃多了？</description>
    </item>
    
    <item>
      <title>SSH管理网站</title>
      <link>https://tourcoder.com/sshguan-li-wang-zhan/</link>
      <pubDate>Wed, 06 Apr 2011 06:31:24 +0000</pubDate>
      
      <guid>https://tourcoder.com/sshguan-li-wang-zhan/</guid>
      <description>今天家里的21端口又莫名其妙的被封了，懒得动，又不想去公司，所以，研究了下SSH管理网站
进入命令 ssh user@ip -i id_rsa (可以省略为 ssh user@ip)，回车后会提示你输入 yes or no，输入完整的 yes，回车后会要求你输入密码，输入密码，OK，你可以开始管理你的站点了 附带一些常用命令和信息
  Linux文件管理命令
$ls 列出当前文件夹下所有内容 $ls -o 列出当前文件夹中所有内容，含详细信息，但不列出group $ls -l 同上，含group信息 $ls -a 列出当前文件夹中所有内容，包含以”.”开头的文件 $ls -t 按更改时间排序 $ls -v 按版本先后排序 $cd [dir] 进入文件夹 $pwd 显示当前路径 $mkdir [dir] 新建文件夹 $chmod [Mode] [dir]，其中Mode形如”755″或”777″等。 $chmod [Mode] [file] $chmod -R [Mode] [dir]，递归形式，即将目标文件夹内所有文件均改变权限 $rm [file] 删除文件/文件夹 $rm -f [file] 强行删除，忽略不存在的文件，无提示 $rm -r [file] 递归删除所有内容 $cp [options] [source] [destination] 拷贝，其中[options]可以为-f（强行拷贝）或-r（递归拷贝），常用-a选项来复制整个目录树，常用于备份或者复制安装程序 $mv [options] [source] [destination] 重命名或移动，[options]常用：-f（强行移动/重命名）, -i（移动/重命名前尝试）, -u（更新）   wget下载</description>
    </item>
    
    <item>
      <title>阴毛和阴谋</title>
      <link>https://tourcoder.com/yin-mao-he-yin-mou/</link>
      <pubDate>Thu, 31 Mar 2011 06:30:30 +0000</pubDate>
      
      <guid>https://tourcoder.com/yin-mao-he-yin-mou/</guid>
      <description>现在越来越不习惯上国内的论坛和新浪微博了，理由也简单得可怜，很多字不认识了，就是认识字，组成的词也不知道什么意思了。很多时候，我要借助 Google 才能知道这个词是什么意思。比如下面的一句话是我今天看到的
“我觉得你们两个人之间有阴毛啊，快点告诉我。”
我在那里想了好一会，这个话是什么意思呢？两个人之间有阴毛？干吗告诉他阴毛啊？是问多少根吗？那怎么数得过来啊！后来突然想到，他应该说的是阴谋。也许有人会觉得，我这话可能描述得很夸张很好笑，但的确是事实，而且一点不好笑。
自古以来，文字是人类沟通交流的一个很重要的工具，词要达意是上小学时，老师就教导我们的。可现在的这些词呢？能表达好意思吗？还是拿刚才的两个词来说吧，阴谋和阴毛是同一个意思吗？晚上的时候，我还特别问了几个朋友，把上面的那句话给他们看了，除了一个人猜出了这句话的意思外，其他人都不知道这句话是什么意思，而他们的年岁都是30左右。伴随着网络和新生一代的兴起，这类的词越来越多，以前的字词正在逐步被这类新的字词给替代。伴着这些替代的深入，那些正确的字词逐步消失。如果说早期的网络词汇新鲜词汇还能根据地方方言或其它因素，能表达好意思的话，而现在已经完全是面目全非，完全是对母语的一种践踏。
说这么多，我不是要指责谁，更不是要指责网络语言，我只是希望大家在说这些的时候也想一想，这样词不达意的表述，你觉得很好吗，觉得很拽吗？正如网上一个网友说的，多年以后，你的儿女孙辈朝你“爆尿”“阴毛”，你觉得很受用吗？
记住！当你处在一个精神缺乏道德沦丧的时代的时候，能用纯正的母语是你最后的一点尊严。没了母语，你还能拽啥？</description>
    </item>
    
    <item>
      <title>创业一年</title>
      <link>https://tourcoder.com/chuang-ye-yi-nian/</link>
      <pubDate>Tue, 01 Mar 2011 06:29:53 +0000</pubDate>
      
      <guid>https://tourcoder.com/chuang-ye-yi-nian/</guid>
      <description>去年，也就是2010年的三月一日，我正式开始了自己的创业之路，以前也创业过，但不同的是，这次的创业，我是全脱产式的，只属于我一个人。
过去的一年，总结起来有如下的几点，这也是我非常想和正计划创业或者刚已经开始创业的朋友分享的，特别想说明的是，我不是什么创业导师，更不是李开复，我只是分享我所遇到的，我所经历的，可能在我的表述过程中，有教条的口吻，但也是非常想提醒大家的地方。
一、关于我和公司的关系
一开始的时候，我对我和公司的关系极其不明确，我一直认为，公司是自己的，创业的钱是自己掏出来，不管公司赚多赚少甚至是赔钱都是自己的，所以，我犯下了第一个错误，我没给自己定工资，没有每个月固定的从公司拿工资出来，而是一旦需要用到钱了，不管是个人想用，还是公司需要用到，我都从这些钱中支出，这样做的后果就是，到最后，我都弄不清楚，我有哪些钱是赚的，哪些钱是我个人花的，哪些钱是公司花的，我唯一明白的是根据最后钱比我创业初掏出来的钱少，能知道我赔钱了。
二 、完美是否真的重要
可能自己是程序员的缘故，总想着扫除自己产品中的BUG，把自己的产品做得最完美的时候，再推向大众，这样给我带来的后果是，我沉浸于不断的修改自己的产品，不断的在向着我所想象的完美的地方进军，以至于这个产品到最后还没推出来就已经死亡了。这个世界上没有最完美的东西，对任何一个产品来说，我现在的认知是，能很好的达到使用者所想的要求和让他用得舒服快乐，这个产品就是完美的。
三 、销售比产品更重要，销售策略也非常重要
我一直很轻视销售，我这里的轻视是不重看销售，我一直觉得只要我产品做得好，铁定就会有人买，但事实给了我一个很响的巴掌。同样一类性质的产品，我们的产品要比别的一家公司要好太多，不管是功能，还是易用性等等，都不是在同一个档次的产品，但就是这样，我们被客户杀到800元（我们的要价是3000），最后还是没有购买我们的产品，是买了那家公司的产品，价格是四万。因为这里，我们犯了两个严重的错误，我们的销售不给力，没能说出我们的产品的优点，没能推销好我们的产品，还有就是我们的销售策略也是失败的，没能抓住用户的心理，最基本的一点，越便宜的东西，现在很多人都认为便宜没好货，或者认为你很便宜，是因为后面还有一些东西在等着赚他的钱。
关于销售策略，我们也尝试过向Google学习，免费，什么产品都免费给用户使用，等他们用习惯了，离不开我们这个产品了，我们再做其他的打算，这里我不能胡乱置评Google的策略，但我只能说，毕竟我们不是Google，等用户离不开我们这个产品的时候，那个时候，我们已经饿死了。
四、适当的合伙人
找一个适当的合伙人是一件非常重要的事情，在这个上面我也犯错了，刚开始的时候，我的一个朋友想和我一起做，当初我想想，两个人一起做也是挺好的事情，就这样，我就答应了，并接受了他的投资。可是事情还是怪我没能好好考虑清楚，在我们的团队中，我的合伙人基本就是一个纯管理者的角色了，尤其是在早期，公司没有招人，没有兼职，只有我和他两个人的时候，我多么希望他能帮我处理一些事情，但可惜的是，他基本什么忙都帮不上，最后演变的后果相当于，我聘请了一个CEO专门管理我一个人，搞得两个人有点矛盾，不是很愉快，最后还是我退回所有的钱，还是自己一个人单干。说这些不是说，有投资不好，有合伙人不好，而是想说，投资和合伙人，还是要注意人选和时机的，我想如果我那个朋友不是一开始投资我，而是在后期投资我，我想会比早期更适合。一句话，如果没到适合投资的时候，坚决不要投资，没有适当的合伙人，坚决一个人单干。
时间不早了，今天就分享到这里吧，还有一些内容，以后有时间和大家继续分享。</description>
    </item>
    
    <item>
      <title>盗梦空间-陀螺的玄妙（上）</title>
      <link>https://tourcoder.com/dao-meng-kong-jian-tuo-luo-de-xuan-miao-shang/</link>
      <pubDate>Mon, 10 Jan 2011 06:29:21 +0000</pubDate>
      
      <guid>https://tourcoder.com/dao-meng-kong-jian-tuo-luo-de-xuan-miao-shang/</guid>
      <description>还是2010年9月30日晚上看的《盗梦空间》，看完后就有很多的疑惑，感觉漏洞百出。恰好昨天做得一梦，梦中，我遇到了道姆，我想尝试把他的图腾陀螺转动起来，可是不知道为啥，这个陀螺怎么也转动不起来，醒来后一想，那个陀螺是道姆的图腾，按片子里面的说法，我肯定是控制不了的，但又一想，这个图腾应该是道姆妻子的，那道姆是怎么能够控制这个图腾的呢？而道姆自己的图腾又是什么呢？现在就以这个陀螺为主线来梳理下这部影片，梳理下这个逻辑梦。看看究竟哪里是现实，哪里是梦。
一、陀螺的第一次出现是在影片开始的地方。影片的一开始，男主角道姆在海边舒醒，他被人发现带到了齐藤的身边，这个时候的齐藤是一个老迈的老人了，这一层应该是道姆所说的迷失域（Limbo）。齐藤问道姆是否是来杀他的？他似乎看到过这个陀螺，并且旋转了这个陀螺，这个时候的陀螺是不停止地旋转的 — 当然是不停止的旋转的，因为这里是本部影片最大的一个梦（姑且称这个梦为D1）的最深的一层，我们把这层叫着 D1-Limbo。
二、接下来是道姆和助手阿瑟在和齐藤聊天，谈一些内容，以及后面发生的事情，可以看出这里是在梦中，我们姑且称这个梦为D2，具体是那一层暂时未知 — 后面我们会说到。
三、随着道姆被推入浴缸被Kick，助手阿瑟被枪杀，他们都醒来，他们处在一个战争的地方，他们似乎从梦D2中回到了现实，也就是说，看似上面的第二段，是梦D2的第一层。但是这里有经典的事情发生了，因为地毯的关系，齐藤发现自己不是在现实中，而是在梦中，实际上，他们四个人是在一列火车上，由一个小孩照顾着。那么按这样说的话，火车上是现实，这个战争的地方是梦D2的第一层，第二段中的是梦D2的第二层。这里也出现了一个新的线索，音乐作为穿越的信号。
四、陀螺的是第二次出现是在影片放到第15分钟左右的时候，他们几个在火车上醒来，发现失败了，各自分开，这时，道姆手上拿着枪，转动陀螺，一直到陀螺停止，他才放下枪，按影片的理论，这里应该是现实中，他从梦D2中彻底醒过来了。
五、道姆等人想离开，被人出卖，齐藤找到了他们，并给了他们任务–给自己的竞争对手的儿子植入意识。并让他们去组建自己新的团队。道姆跑到自己的岳父那里，去找帮手。一直到这里，按影片的发展都是在现实中，但他岳父和他说了一句话“come back to reality,Dom.Please”很值得推敲。
六、道姆开始训练新的造梦师艾里，并带她第一次进入梦中，在某一个街头，他们在喝咖啡，周围爆炸，他们醒过来了，回到了现实，这个时候音乐再次响起，我想这次还是用的是音乐来穿越的吧。他们又继续训练，在梦中新的造梦师艾里被道姆的妻子杀了，从梦中醒了过来，回到了现实。在这里我们知道了一个解释，当时间还没到，你不会从梦中醒过来，除非你死了。同时，道姆对阿瑟说，告诉她图腾的事情。
七、陀螺第三次出现，在阿瑟向艾里解释图腾的时候，道姆转动了陀螺，来检查自己是不是在梦中，陀螺转动了一会，停了下来，也就是说，道姆他们的确回到了现实。这里有两个事情需要注意下，阿瑟对图腾的解释是这样的，一个让只有你自己知道的，用来辨别自己是不是生活在别人梦中的小东西。那么这里有一个疑问，如果是自己造的梦，那么这个图腾是不是有效呢？还有当艾丽想摸阿瑟的图腾的时候，阿瑟说了一句话，不行，你摸了，我的图腾就失效了。那么就是说，如果图腾被人摸了就失效了的话，我对陀螺的是否有用第一次产生了怀疑，要知道这个陀螺本来是道姆妻子的图腾（这个后面会说到），这样被道姆用了，是不是早已经失效了？
八、在现实中，道姆去找梦中表演者艾姆斯，在被追杀中，被齐藤救了。实验室中，艾里又回来了，并在阿瑟的教导下，继续造梦的学习。另外一个地方，道姆被艾姆斯带到药剂师尤斯夫那里，看到了很多老年人在药剂的帮助下做梦，而且梦，还可以分享。这里也出现了另外两句话“做梦这个事情做久了，就很少做梦，除非借助药剂。”，“梦境变成了这些人的现实”，尤其是当那位老者对道姆说“梦境变成了这些人的现实，你说不是吗？”，我觉得他笑得很诡异。
九、陀螺第四次出现，道姆体验药剂的效果，梦中，他见到了妻子，他醒来，去卫生间洗脸，可恍惚间，还是见到他的妻子，他立刻掏出陀螺，试图转动它，但陀螺却掉到了地上，当他捡起的时候，陀螺是停止的（先前是没有转动起来，是直接落在地上的），按先前的发展说，这个时候应该是在现实中的，但这里难免有点疑问了。
看到这里，脑子已经有点晕了，先写到这里吧，晚点再继续写。</description>
    </item>
    
    <item>
      <title>也谈微博微群</title>
      <link>https://tourcoder.com/ye-tan-wei-bo-wei-qun/</link>
      <pubDate>Thu, 06 Jan 2011 06:28:31 +0000</pubDate>
      
      <guid>https://tourcoder.com/ye-tan-wei-bo-wei-qun/</guid>
      <description>昨天收到新浪的微群的要求，故而开通了一个微群体验了下，感觉不错，和我们公司内部的idea sharing差不多，不同的是，它的娱乐性比较强点，涉及面广点，而我们公司内部的idea sharing是以工作为主。说起微群的这个概念，一定要说说yammer等几个比较有名的企业微博，yammer等企业微博是一个定义在公司内部的交流平台，在功能本质上说，微群和企业微博他们是一样的，都是把交流的范围有了一定的限定，从微博一个公开的广播平台转到了私密的内部平台，总之他们也还是微博。但随着这些微群和企业微博的出现，有的人就开始莫名的替Email和即时聊天工具担心了，尤其是Email，他们认为我们已经不需要工作Email了，所有的东西均可以通过这种微博来实现了，我不这样认同，姑且不说Email和微博的性质不一样外，还有更主要的东西，举个例子说明吧！
某公司有两个客户，分别是A和B，那么为了和这两个客户沟通，如果不用Email的话，势必要把这两个客户拉入到这个群中，这样A和B都可以看到你们所有的消息，当然你可以通过一些限制的设定等，能达到这一交流的效果，但这些的操作远比Email要繁琐得多，成本也要高很多。所以，个人认为Email不会被微群给取代。
再来说说微博吧，我用微博有一些年头了，最早使用的是twitter，这个微博的鼻祖。其实在用twitter前，我也写过一个微博的东西，是用PHP写的，不过那个时候，我不知道它叫微博，象征性的给了它一个名字叫碎碎念，因为大学的时候这个词在我身边出现的频率非常高，后来还改成发牢骚。那个时候还用了一个很奇怪的域名jaeke，当然，那个时候还不知道twitter，更没有twitter那么先进的想到用@，我只是实现给自己朋友列表中的某个人或所有人发话，可以选择私密或者公开，后来因为想到一句话，就关闭了站点 &amp;ndash; 一个大男人，整天像个娘们似的，婆婆妈妈的说多少废话，干吗？但后来我还是用了twitter，用了新浪，今天为了写这篇BLOG，开了QQ的微微博，也有一些牢骚和疑问。
一、名人的微博到底是做啥用的？
不知道大家注意到没有，很多名人的微博内容很有意思，很多都是自我标榜。似乎微博成了他们一个给自己歌功颂德的平台。先前我也follow了一些名人，但后来发现他们的内容实在是不对我的胃口，后来索性unfollow了。最近还出了一个上海的某人，和网友在网上骂得起劲。
二、粉丝？
常言说，有有臭脚的，必然就有捧臭脚的，这就是微博中的粉丝。以前我们常说的是，某某某是我的偶像，现在是我是某某某的粉丝，从字面上看，似乎现在我们把自己放在了前面，但事实好像我们却更迷失了自我。在微博上捧臭脚那叫一个起劲！
三、微博的脑残
微博也有不少脑残的地方，尤其是国内的微博，比如我今天才注册的QQ微博，一个微博的ID，它非要你有6个字母，第一次进入微博后，非要挂个广告给你。新浪微博也同样有脑残的地方，注册非要你填写手机，你没办法修改你的登录Email，学学twitter吧。
四、微博没有好处了？
不，我上面的很多牢骚和疑问只是个人的，不能代表大家！它的好处有很多，除了它本身具有的，你可以及时看到你所关注的东西的状态外，你还可以及时的知道你身边发生的一些事情。还有你可以把它看着一个信息和资料的搜索工具，记得那边发生的陈某某的门事件，先前是一个同事给我看的照片，我看了就删除了，后来别人要看，我到处都没找到了（国内被墙了），但在twitter上搜索了下，马上跑出很多，而且还有最新的，哎，嘿嘿~</description>
    </item>
    
    <item>
      <title>从搜狗输入法看中国互联网流氓特性</title>
      <link>https://tourcoder.com/cong-sou-gou-shu-ru-fa-kan-zhong-guo-hu-lian-wang-liu-mang-te-xing/</link>
      <pubDate>Mon, 03 Jan 2011 06:27:50 +0000</pubDate>
      
      <guid>https://tourcoder.com/cong-sou-gou-shu-ru-fa-kan-zhong-guo-hu-lian-wang-liu-mang-te-xing/</guid>
      <description>今天果断卸载了搜狗输入法，不是它不好用，而是它的弹窗广告。可以说，我是搜狗输入法的一个深度用户了，从它诞生的第一天起，我就一直在使用它，甚至我还很有激情的给开发人员提出我那微不足道的建议，但今天上午我却因为弹窗广告的问题，卸载了它。
弹窗广告，这并不是搜狗输入法所创，具体是谁发明的，谁开始了这个广告模式，已经无法考证，只依稀记得，当年的MSN，QQ等IM似乎都有弹窗广告，后来演变成凡是个客户端都想搞一搞弹窗广告，最夸张的估计要是QQ这只小企鹅了，它的弹窗广告还不能取消的，如果想取消，似乎要成为它的会员，不然，你只能被迫的接受它的弹出，给它贡献流量贡献IP，正是因为这样，QQ的门户流量暴涨。
除了弹窗，还有一个东西让人深恶痛绝的&amp;ndash;IE插件，用户在上网的过程中，动不动就被这些插件给绑架了，什么百度工具栏啊等等，有点良心的，还问你是否要安装，没良心的是直接给你安装。
我们国人做事情喜欢一窝蜂，当hao123成功的时候，国内的网址导航网站就像雨后的菌菇一样，冒了出来。这样也推动了一种流氓手段的普及&amp;ndash;篡改IE首页，该死的！就为了这一点点的流量，他们想尽办法，抓破头皮来篡改你的IE首页。这里也有好一点的人，你在安装他们的软件的时候，他给你一个提示，是否设置XX为首页，但即便这样，我还是想说，滚蛋吧，不是是个网站都有资格被设置为首页的。
看到这里，大家应该知道为什么360流行了吧？你想想，他们这些做流氓事情的人，在360老板周鸿祎这个大流氓面前，只是一个小瘪三而已，所以他出了360来对付他们这些流氓手段，对的，正是这些他们流氓的东西成就了360！
还有什么比以暴制暴，以大流氓对付小流氓更好的手段吗？没有！周鸿祎当给这些小流氓们发五毛！
update:昨天写这篇文章的时候，忘了一个很大的流氓&amp;ndash;中国电信！从最早的118114，到现在你访问的网站页面中肆意插入他们的巨幅图片广告！</description>
    </item>
    
    <item>
      <title>该如何备份自己的通讯录</title>
      <link>https://tourcoder.com/backup-contacts/</link>
      <pubDate>Fri, 31 Dec 2010 06:27:09 +0000</pubDate>
      
      <guid>https://tourcoder.com/backup-contacts/</guid>
      <description>想必肯定有朋友遇到过和我同样的问题&amp;ndash;手机丢失，手机损坏，SIM卡损坏，这些都会导致一个严重的后果，我们的联系人突然不见了！在自己想尽了所有的办法后，还是会丢失一些联系人。这样，备份自己的通讯录就显得有非常重要。
备份通讯录主要有两种方式
一、用个小本记录下来
这是一个很早被使用的方式，它的优点在于你不怕丢手机了，但同样，它有一个致命的缺点，便携性差，易用性差，这里说的易用性是当你要打电话的时候，你需要翻开这个小本一个一个的去找到你要拨打的电话，然后在你的电话上输入这些号码，才能拨打你这个电话。
二、网络同步备份
这个是我想重点说的方式，随着科技的发展，一朵朵云的飘起，越来越多的东西被搬到了“网络云”上，通讯录同步也不例外。目前我使用的是Google Contact功能，通过Google Sync与手机同步。这个是我几经尝试后的选择。
通讯录备份，最重要的一个问题就是安全，基于安全考虑，我最早使用的是移动的号簿管家（笔者是移动的号码），毕竟这个可以说是官方的东西，安全性上应该是没有问题的。但让我不爽的事情是，一个简单的事情，被移动搞得太过繁琐，而且运行起来也非常吃力，常出现手机假死的情况（刚开始还好，后来演变成只要打开它，手机就会假死，也可能是因为我的手机差吧）。
在经过移动这糟糕的体验后，我选择了Google这个第三方备份（准确说它不属于备份范畴），并一直沿用到现在，虽然时间不长，但它的易用性让我用起来感觉很舒服，而且和手机的集成也非常好，安全就更不用说了。但即便这样，它也有一些问题在里面，比如因为GFW的关系，它有时候是不能同步的，总是提示出错。
至于其他的第三方备份，我没有尝试，很简单，我不相信他们，我担心他们会倒卖我的通讯录，会对我通讯录中的朋友做坏事！</description>
    </item>
    
    <item>
      <title>联通和它的uphone/unistore</title>
      <link>https://tourcoder.com/unicom/</link>
      <pubDate>Fri, 05 Nov 2010 06:08:48 +0000</pubDate>
      
      <guid>https://tourcoder.com/unicom/</guid>
      <description>坊间消息，千呼万唤的联通unistore将于2010年12月20日揭开神秘的面纱，但这个unistore的价值如何，它所面向的对象又是什么样的呢？这里我们做点猜想
一、面向iphone
众所周知，目前联通是国内唯一一家可以签约买iphone的运营商，道理上说，unistore应该是针对iphone的应用市场，但事实上很难说，一方面是水果公司是否会让unistore审核通过，这是一个未知数，另外一个方面，凡是买了iphone，并会去下载app的人，他们中的大多数，第一选择必然是水果公司的app store，联通的unistore和它比起来，落后的太多了。所以，这条路的可能性太小了。
二、面向uphone
uphone，联通的手机，虽然还不知道什么时候能够开卖，但这个东西是的确存在的，而且笔者朋友中已经有人拿到了样机。但就单单这部手机是否能够支撑得起unistore？回答是不能的！这点可以看看移动，看看他们开发手机系统，看看他们推出的手机。所以，这条路失败的可能性也很大。
三、内嵌在第三方系统中
这里只是笔者的单方面的建议和意象，联通可以不要费力的去研发系统，研发手机等，他们完全可以考虑采用第三方系统&amp;ndash;比如李开复创新工场中点心OS，当第三方系统装机量越来越多的时候，也就表示着unistore的占有率越来越高，这可能是联通一条可行的路，当然也是其他运营商一条可行的路。
现阶段的 Google Market是不成功的，移动的市场是残废的，联通的unistore会怎么样，我们等着看！</description>
    </item>
    
    <item>
      <title>360和QQ</title>
      <link>https://tourcoder.com/360-vs-qq/</link>
      <pubDate>Wed, 03 Nov 2010 06:07:49 +0000</pubDate>
      
      <guid>https://tourcoder.com/360-vs-qq/</guid>
      <description>我佩服的人不多，周鸿祎算是一个。
刚刚和兔子在讨论这次360和QQ之战，我们一直认为360可能会输，QQ也不是最后的赢家。说360会输，是因为对很多用户说，QQ现在已经不只是一个IM；说QQ也不是最后的赢家，是因为经过这次事情后，QQ也受到了一定的冲击，而且，以周的性格脾气，即便360倒了，他必然会有其他的方式来继续对付着QQ。
先来说说QQ这只小企鹅吧，我是从2000年开始用它的，一直用到最近几年，后来断断续续没再使用了，当然偶有打开的时候，多是和朋友聊点事情，还有就是和客户聊工作了，还好这样了工作的时候不多。我谈不上讨厌QQ，但我是提倡并也建议我身边的朋友这样做的&amp;ndash;不要使用QQ，甚至是少开IM，关于这个，我以前的博文《多少个IM才能满足要求》一文就说过。不用QQ，还有一个原因，它真的很不安全！它在我们不清楚的情况下，肆意扫描我们的电脑，并记录下一些信息传送到自己的服务器去，这样的做事情方式是可耻的，卑鄙的。
关于360，很抱歉，我的电脑里面没有安装它，对它不存在喜欢不喜欢一说，反而在我的服务器上全部都安装了360杀毒和安全卫士，为啥？免费，占用资源少！网上是有不少其他的名声显赫的杀毒软件和防火墙啥的，但他们不是太贵，就是太卡。同样对其他用户来说，免费的，占用资源少的杀毒软件，没什么不好！
11月04日更新：
万万没想到，360投降得如此之快，昨天才写的这篇BLOG，早上就看到360投降的新闻了，真悲剧！虽然知道360输是肯定的，但没想到却是输得如此的快，在这个的当中，出现了景德镇最有特色的机构来协调，算是给360一个下的台阶吧！在这里也鄙视下如下几个公司，恶心的金山，宣布自己的软件免费一年，你就是免费十年都没人用你的垃圾。可悲的可牛，你以为你抄袭360的界面能掩盖你可悲的本性？
PS：有个不爽的事情是，今天早上，好几个客户给我他们的联系方式，还是这该死的QQ，哎！！！</description>
    </item>
    
    <item>
      <title>让人担忧的Android</title>
      <link>https://tourcoder.com/hi-android/</link>
      <pubDate>Sat, 05 Jun 2010 06:07:13 +0000</pubDate>
      
      <guid>https://tourcoder.com/hi-android/</guid>
      <description>作为一个Android的从业人员，我是不应该唱衰Android的，尤其是在当前Android的增长势头如此之猛的情况下，但最近的一款游戏，让我不得不对Android有了一些简单的思考。同样的一款游戏，是同一个公司开发的，在ipad上使用很舒服，但在android pad上，就玩得非常痛苦，以至于到了让人一点都不想玩的程度。为什么会这样，就是因为在android pad上手感奇差，效果奇差！当然，这里的Android pad是一款山寨的pad，google本身是没有出pad的。下面我从以下几个方面说说为什么我担忧Android可能会失败：
一、代表产品
和Apple相比，Google自身推出的代表产品真的少得可能，目前只有一款Google Nexus One，而且也很可惜的因为一些原因，目前该产品已经退市了，这无形从一个方面消减了Android的竞争力，也许，这两家公司的方向不一样，Apple是卖的产品，而Google是发展的Android这个系统软件，但用户关注的重点却是产品，而非你里面安装的是什么系统。
二、版本的混乱
不知道这是否是Google最近的一贯作风，就像chrome一样，Android的版本更新，那叫一个没有时间性和盲目，完全让人感觉有点混乱，这里的2.1还在用，2.2版本还没成熟，那里的3.0就要出来了，我们不反对你有新的版本，给我们带来新的功能，但我们反对需要我们不断的刷新系统，而且购买了Android手机的人，又有多少没事去刷手机了？
版本的混乱还体现在服务商方面，因为开源的关系，各个服务商几乎都搞了一个自己版本的系统，诚恳一点点的，只是针对自己的硬件优化系统，不改变很多，不厚道的，从UI到内置软件，全部换了个遍，被他们这样的换法，更加消弱了Android本身。
三、后续支持
iphone之所以被人很多人喜欢，除了它强大的工业设计，完美而又颠覆性的理念外，它还有一个强大的后续支持APP STORE，从一开始，Apple就对自己的APP STORE做了一定的条条框框，让它更好的发展，相比较Android呢，除了一个可有可无的market，还有什么呢？这个market目前也是一个失败的产品，至今还在用着更为残废的google checkout作为支付工具。而过中国开发人员还不能通过正常的方式给自己的APP进行收费，只能免费自己的APP，但在里面嵌入广告，一款不注重创意不注重产品质量，而只注重广告的产品能好到哪里去？当一个市场充斥了这样的产品，那么这个市场的质量又是如何呢？当然目前也有一些服务商推出了自己的market，比如中国移动等，但目前都还没有看到他们的成功点在什么地方。
一家之言，欢迎拍砖！</description>
    </item>
    
    <item>
      <title>无题，乱扯一气</title>
      <link>https://tourcoder.com/nothing-1/</link>
      <pubDate>Fri, 28 May 2010 06:06:31 +0000</pubDate>
      
      <guid>https://tourcoder.com/nothing-1/</guid>
      <description>时间过得好快，离我写上一篇BLOG已经过去大半个月的时间了，这几天也发生了一些小事情，和大家分享分享，尤其是一些事情，希望也给大家提个醒，不犯我这样的错误。
iPhone市场需求比android似乎更多点，用这个创业还是要谨慎
我这里说的市场需求，不是说自行开发一个app，我这里是说外包市场。虽然android的发展迅速，但在应用市场上面，还是略显后劲不足，可能有人要喷我饭说人家Google不是这样统计的，网上又是怎么怎么说的，但我遇到的情况是这样的，绝大部分把iphone的应用开发外包出来的，android的很少。其实我重点更想说的是网上的那些故事，“某人开发了一个应用，然后他就赚了好多钱，而且那个应用还非常简单”，这类的故事在网上太多了，但我可以说，真实的情况不是这样的，也许在早期，app刚开始的时候，可能会这样赚钱，但现在随着越来越多的个人，团队开发者进入，这个已经不是当初刚开始的时候的光鲜，那么容易，所以，那些想开发一个应用，然后丢在market上，认为market会自动帮你卖，你就能定期拿钱的朋友要注意了， 这条路未必行得通，即便你的创意非常好。我就遇到过这么一个人，他是做app推广的，类似百度，Google的竞价排名一样，他也通过一定的技术手段，把你的显示在前面，增加更大的曝光率。</description>
    </item>
    
    <item>
      <title>分享的快乐</title>
      <link>https://tourcoder.com/sharing-happly/</link>
      <pubDate>Mon, 10 May 2010 06:05:45 +0000</pubDate>
      
      <guid>https://tourcoder.com/sharing-happly/</guid>
      <description>今天收到一封好友的Email，他现在人在新加坡，邮件中还是如往常的一样拉了一些家常，分享了一些观点和行情.
说起来也很奇怪，我和这个好友相识于于网络，是通过那个时代的QQ认识的，后来在我上大学一年级的时候，他还来我们学校看过我一次，那个时候他上大二，再后来，他就在QQ上越来越见不到了，但倒是能时不时的收到他的Email，和我说一些事情，分享一些东西。同样的，我也会给他发邮件，说一些事情，分享一些东西。
他这次和我分享了 Loic Le Meur 的创业法则，他告诉我说，本来这个两年前就想与我分享的，只是那个时候还不适合，反而现在，他觉得我更需要看这个东西，很适合我的东西和性格
不要干等一个所谓革命性的创意。它永远不会来的。
请把注意力集中到一个简单、令人兴奋、前景广阔的主意上，并且尽可能快地动手。
共享你的创意。你共享得越多，你得到的建议和学到的东西也就越多。甚至约谈你的竞争对手。
建立社区。使用博客和群件(Social Software)让人们能够听到你的声音。
倾听你社区的声音。回答问题并根据反馈的意见修改你的产品。
组建一个强大的团队。选择那些和你有着非常不同的技能的人。寻找那些比你棒的伙伴。
尽可能最早发现问题。任何人都会犯错。不要害怕在公共场合承认它们，只要你听取教训并改正。
不要浪费时间做市场调研。尽早发布你们的测试版本。并在开放的环境下不断完善。
远离那些长篇累牍的商业计划书。你在其中所预期的事情，永远和现实不一样。 不要花太大力气做市场运营。
让你的用户喜欢你的产品是更加重要和有用的事情。 别老想着发财。在意你的用户。金钱只是成功的一种附属品，它不是目标。
看着这些东西，除了感激外，我更欣慰，可能这个就是分享的快乐吧。</description>
    </item>
    
    <item>
      <title>多少个IM才能满足要求</title>
      <link>https://tourcoder.com/about-im/</link>
      <pubDate>Sat, 01 May 2010 06:05:03 +0000</pubDate>
      
      <guid>https://tourcoder.com/about-im/</guid>
      <description>想必大家都会遇到这么一个情况，办公室里经常响起“滴滴”，“叮叮当”的声音，而且这声音此起彼伏&amp;hellip;没错，这就是一直在我们身边的QQ和MSN等IM的声音，它们一直响在我们身边。
还有有这么一个事情，最近就发生在我的身边，我以前的一位同事，上班的时候，开着QQ，MSN，飞信(移动的IM)，skype，而且，我尝试过通过任何一个IM和她说话，她有话必回，我很诧异，她哪来的那么多时间耗在这个上面，难道她不要工作吗？正当我诧异这个事情的时候，今天她突然问我，你有gtalk吗？原来他们公司的邮箱迁徙到google企业上，自然的开通了gtalk，所以，她又多开了一个IM - gtalk&amp;hellip;..
到这里了，我不知道大家是什么感受，我的感受就是，这个是在工作还是在做什么？这里我也不免问一句：一个人究竟需要多少个IM呢？IM是不是真的那么非常有必要的在我们的生活中，尤其是工作中存在呢？是否担当了一个必不可少的角色呢？
我的回答是否定的！更多时候，IM耽搁了太多的事情，浪费了我们太多的时间！就拿一个人一天的工作来说吧，我们来看看IM是否真的那么有必要，或者一个人开着很多个IM是否真的那么有必要。
业务人员在联系业务的时候肯定是需要用到IM的，但并不是每笔单子都需要用IM，而且最主要的是，IM只是早期的一个认识的途径，很多是应该业务人员约见拜访客户，面谈可能更好于IM，而和对方约见等事情，电话沟通又是一个非常好的方式，它比IM要好，因为在冷漠的IM上，你们彼此不知道对方的表情，对方说这个话的时候的心境语气，当然也有人会说到外贸公司，打长途电话是一笔不小的费用，在外贸工作的朋友我也有不少，他们很多还是通过Email的方式；
客服人员，貌似这类人是最不能离开IM的，尤其是当前像淘宝这类的网站，但情况真的是这样吗？在一个层面上说，是的，但我们这里可以从另外一个方面考虑下，我们是否有必要让一个客服人员开着那么多的IM？是不是一个IM就可以解决问题了呢？
技术开发人员，对技术开发人员来说，除了写代码就是沟通，但他们的沟通真的没有特别的需要开着IM，因为技术的沟通，用面对面的沟通，更胜于在IM上，如果一个项目都是通过IM沟通的方式，那么他出错的几率就更大，甚至失败的几率也更大。
管理层甚至老板，对他们来说，开着IM就是更没必要的事情了，他们手头上每天有那么多的决策要做，有那么多的其他事情要处理，而处理这些事情，做这些决策应该不需要用到IM！
个人浅薄观点，欢迎拍砖！</description>
    </item>
    
    <item>
      <title>你们都要干吗啊？</title>
      <link>https://tourcoder.com/what-do-you-want-to-do/</link>
      <pubDate>Wed, 21 Apr 2010 06:04:24 +0000</pubDate>
      
      <guid>https://tourcoder.com/what-do-you-want-to-do/</guid>
      <description>把这几天遇到的一些扯的事情，放在一起做个总结
事情一、支付宝买家LOGO显示功能关闭
前几天收到来自支付宝的邮件，大致内容如下：
亲爱的支付宝商户： 由于业务规则的调整，自2010年8月11日起支付宝将关闭网站logo在买家收银台的显示功能，由此给您的使用带来的不便敬请谅解！ 说实话，我没整明白支付宝这样做的目的何在，强调自己的品牌，不给使用你商户服务的商户以展现的机会？这让我想到了几天前看到的一篇文章这里查看，虽然这个文章有软文和广告之嫌，但不免也说明了一些事情。支付宝的一些SB做法，让我很莫名，一个让商户显示下自己LOGO，展示下自己品牌的机会都已经被支付宝给剥夺了，我真不知道，在加入商户的时候所花的钱，真的值得吗？
事情二、新版Gmail
新版Gmail我很喜欢，但对它里面的一些东西多少还有点微词，不过那个邀请，我不知道在gmail开放注册后，这个是否真的有存在的必要呢？还有就是我这两天遇到的问题，我无法通过gmail向我的企业邮箱发送Email，邮件总是被退回，显示如下错误信息
Delivery to the following recipient failed permanently: user@mydomain.com Technical details of permanent failure: Google tried to deliver your message, but it was rejected by the recipient domain. We recommend contacting the other email provider for further information about the cause of this error. The error that the other server returned was: 550 550 No Such User Here (state 14).draft: false ----- Message suppressed ----- 找了很多方法，都无法解决，当然这个和新版的Gmail应该没有关系，但问题还是想得到解决啊～</description>
    </item>
    
    <item>
      <title>创业中的现实</title>
      <link>https://tourcoder.com/startup-reallife/</link>
      <pubDate>Wed, 31 Mar 2010 06:01:51 +0000</pubDate>
      
      <guid>https://tourcoder.com/startup-reallife/</guid>
      <description>创业是一个折磨人的过程，它是不断的把你从理想状态打入到现实状态，让你不断地评估你的项目，评估你的状态，有点近乎残酷、残忍，让你抓狂，目前，我就处在这样的抓狂阶段。
这一个月，有一个项目被接连几个没能成交的单子给搞得七零八碎，让我突然警觉起来，这个项目赚钱吗？准确地说，这个项目是赚钱的，只是不能短时间内赚钱，或短时间内只能赚到极少量的钱，这笔钱不足以用来支撑整个公司的运营开销，更多的，还需要靠另外一个项目养着这个项目，而且现在我的成本可以通过下面的图表呈现出来
   项目 成本消耗 是否盈利     项目A 70%的精力+70%的资金 暂无，估计时间要长，长期项目   项目B 30%的精力+30%的资金 盈利，规模中等    问题来了，我该如何平衡这两个项目？</description>
    </item>
    
    <item>
      <title>关于</title>
      <link>https://tourcoder.com/about/</link>
      <pubDate>Wed, 17 Mar 2010 06:49:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/about/</guid>
      <description>写博客有一些年头了，期间域名及博客程序更换过好几次，也曾因为服务器的迁移导致数据丢失很多 ( 主要集中在 05 - 08 年的，服务器从江苏镇江的机房快递到上海移动机房，这台 1U 的服务器后期被我拆了，换了个机箱，至今还在父母家放着 )。博客的名字也随着我更换网名也变很多次。但最后我用了我喜欢的两件事&amp;ndash;代码和旅行组成了这个博客名「代码旅行」，代码和旅行亦如我的「诗和远方」。
写这个博客的初衷是分享学习笔记，分享观点，分享生活趣事。有一段时间也特别不想写，主要是因为觉得自己太菜，觉得分享的内容没有价值。直到看到一段话，翻译过来就是“你不需要成为顶级才可以分享，有时候一些初级的人分享的更值得其他人参考”。
到现在为止，这个博客分享的内容也就那么回事，但依旧希望能帮到他人。
在公元 2021 年 11 月 24 日，我整理了下这个博客，将它开源在 GitHub，不过通过 https://tourcoder.com 的阅读体验应该更好。
特别注意：本博客内容纯手写，坚决杜绝 AI 参与写作，思考深度难免会有缺失，所以阅读时请多加思考。
信仰永恒，无所畏惧 这是我的「座右铭」，翻译成英文是 Do Faith No Fear。
关于我 曾经网名颇多，但近很多年都用的本名。
除了写文章和代码，我还对一些事情感兴趣，比如运动，阅读，看电影，玩游戏和随手拍视频。
我一般通过 Twitter 自建的 List 和订阅 RSS 主动获取信息。
除了这个博客，我也有其他絮絮叨叨的地方，比如 Xcoder，Twitter/X。
我非常喜欢 Email，它是和我联系的最好途径。
订阅 博客 RSS 订阅：https://tourcoder.com/index.xml
播客 RSS 订阅：https://tourcoder.com/podcasts.xml 或 Apple Podcasts
其他 隐私政策及版权声明</description>
    </item>
    
    <item>
      <title>App，免费还是收费？</title>
      <link>https://tourcoder.com/app-mian-fei-huan-shi-shou-fei/</link>
      <pubDate>Tue, 02 Mar 2010 06:00:53 +0000</pubDate>
      
      <guid>https://tourcoder.com/app-mian-fei-huan-shi-shou-fei/</guid>
      <description>今天看了下iTunes上的 Rewind 2010，并制作了一张图，请看下图
 从这张图中，我们不难发现一个现象，似乎排名前十的应用都是以中国国内为主的应用，而收费的不是这样的情况。这样说明了一些或大或小的问题：
一、国内的用户并没有成熟
不知道是什么原因，收费在国内似乎是一件很难的事情，不只是在ＡＰＰ应用方面，在软件网络业的很多方面，都存在这样的问题。单从ＡＰＰ方面来说吧，有时候我就很不明白一个手上拿着被黄牛抬高了价钱的iPhone 4的人，却玩着那些并不是从正常途径得到的收费ＡＰＰ，不知道他是怎么样的一个心理。是ＡＰＰ收费太高吗？其实也不是啊，比如排名前十的，也是目前比较火的两款游戏 &amp;ndash; 愤怒的小鸟和水果忍者，都是最低的0.99美刀，折合下来每个8元人民币不到。想起前几天和一个博主在微博上争论的事情，争论的结果在他的理论下，我似乎是输了，但我还是坚持自己的看法，虽然破解iphone等是合法的，但我并不认同他那所谓的安装某些助手的软件可以免费下载到iTunes上的收费ＡＰＰ是属于破解，我认为这个就是盗版，是偷窃。这些事情还是说明，目前，国内的用户还不成熟，大家还没有一个费用意识，还不知道有些东西，你是应该要给别人适当的报酬的。这里也要补充的是，消灭这些打着破解名义实际进行盗版的无耻助手之类的东西，是件很重要的事情。
二、开发人员的思维
这里，我并不是为开发人员开脱，为了国内的客户，大家也尝试过免费，然后通过其他的方式来收费，比如嵌入式广告，也有卖得很好的。但这对一款ＡＰＰ本身来说，嵌入广告并不是一个多么好的做法，尤其会损害到用户的体验等。而且很多ＡＰＰ的开发是单个或小团队的开发人员（这里不包含打工的开发人员，替公司做的情况），对ＡＰＰ进行收费，远比再去找广告拉广告等要容易得多。而且专注于ＡＰＰ产品的质量和用户体验，是一款ＡＰＰ开发人员应该做的。所以，如果非要ＡＰＰ免费，而让这些开发人员抓破头皮想更多的盈利途径或者模式，基本是一件很难的事情，毕竟，大家都不是Google。
三、开发人员的出逃
出逃，是一种现象。既然国内的用户不能正常收费，那开发人员就放弃国内的用户，做国外的用户，这种现象很常见。不是有过这么一个事情：国内一需求者，在国内找了很长时间没有找到他想要的一款软件，后来他在国外找到了，非常满意，就联系了该软件的作者，发现该软件作者是国内的开发人员。这样的事情，以后可能会发生得更多，至少目前我接触的一些开发人员，都开始把目光放到了国外的需求上，他们也开始放弃国内的用户。
总之，国内的用户能更成熟点，体制更完善点，那个时候应该能有所改变吧。</description>
    </item>
    
    <item>
      <title>治脚气的小偏方</title>
      <link>https://tourcoder.com/jiao-qi/</link>
      <pubDate>Tue, 16 Feb 2010 06:00:08 +0000</pubDate>
      
      <guid>https://tourcoder.com/jiao-qi/</guid>
      <description>这是一个老偏方，还不错
陈醋一斤，加入去皮大蒜头一两，香烟丝10支，泡两日后，泡脚，一次十分钟，一日两次，浸泡后清水洗干净脚，连续用10天，最好在大伏天使用 需要注意的是，使用者自行负责。</description>
    </item>
    
    <item>
      <title>iPhone 家族的冲击波(游戏篇)</title>
      <link>https://tourcoder.com/iphone-vs-others/</link>
      <pubDate>Sat, 13 Feb 2010 05:59:28 +0000</pubDate>
      
      <guid>https://tourcoder.com/iphone-vs-others/</guid>
      <description>昨天在网上碰到同事，闲聊中聊到了游戏，然后就天马行空聊到了 iPhone 家族对 PSP 的冲击，最后我们得到的结论是，iPhone 家族给了 PSP 沉重的打击，这打击更是致命的，如果 PSP 采用了网上所说的方法，将采用 Android 作为它的平台系统的话，那将加快它的死亡。
今天上午在医院，Joe 给我发来短信说，他在地铁上看到一个老阿姨拿着一个 PSP 在玩，心想这个阿姨真潮，仔细一看，原来是个山寨。后来就这样短信来来回回，也聊了 PSP，聊到了 iPhone 家族。
总体说说我的看法吧，我觉得 iPhone 家族这次对传统的日式游戏的冲击非常强，甚至到了一个准备革掉他们命的时候。为什么这么讲？当iPhone家族刚开始出道的时候，还只是一个创新电话，但随着逐步的发展，加上后面推出的GAME CENTER，iPhone家族不再是一部手机那么简单，它完全成了百变金刚，想变什么变什么，套改周星星电影中的一句台词&amp;ndash;你以为它是一部手机？其实它是一个掌上游戏机。iPhone家族已经具备了很多取代PSP的硬件和软件的因素。
这么说，iPhone就能直接取代PSP吗？话还不能这么肯定的说，至少目前不能这么说，PSP还有它的东西是iPhone目前无法取代的！Joe早上就和我说，在iPad上就没有一个他能看上眼的赛车游戏，而且相同容量的游戏PSP上操作和效果，远比iPad要好很多。这个我没有尝试过，但我相信他的话。细想下，出现这个问题除了他作为一个PSP的用户，目前没有习惯iPad的操作方式外，我想还有就是游戏本身的质量吧。现在的iPhone家族的游戏很多都是非专业的游戏公司开发的，而PSP是做了多年游戏的产品，这应该就是所谓的专业公司的底蕴吧，这一点是一时半会学不到的，也难赚到的。
总之，不管是死是活，PSP死了，就像世嘉一样，变成一个游戏开发公司，不再出硬件，专注于游戏开发；活了，肯定做出了它的特色，有了新的方向。期待!!!
PS：这里用iPhone家族指代了一系列的iPhone及iTouch产品。</description>
    </item>
    
    <item>
      <title>&#39;杀死&#39;乔布斯</title>
      <link>https://tourcoder.com/kill-sjobs/</link>
      <pubDate>Mon, 11 Jan 2010 05:51:11 +0000</pubDate>
      
      <guid>https://tourcoder.com/kill-sjobs/</guid>
      <description>iPhone，一个足以载入科技和通讯史册的手机产品，它重新发新了手机，也正是从它发布的第一天开始起，以后每一年，都会有一阵轰动和疯狂。
  这个就是第一个拥有 iPhone 的人，他提前四天就开始排队购买 iPhone。
同样疯狂的不只是在国外，国内也同样很疯狂，因为早期的销售关系，iPhone 一直迟迟不能在国内上市，国内的果粉们就想方设法的从国外购买回来，也催生了 iPhone 代购这一行业，我曾和一个 iPhone 代购聊过，那个时候，他每天要有十几笔的代购单子。以前黄牛都是倒票的，现在黄牛也开始流行起倒卖 iPhone 了，有消息称，现在 iPhone 4 的紧俏就是因为黄牛倒卖导致的，而且影响到的不只是大陆地区的 iPhone 4 供应，甚至连香港的 iPhone 4 供应都受到了一定程度的影响。也许有人要说，iPhone 4 真有那么紧俏吗？好吧，说说我昨天的遭遇，昨天下午，我去联通预约 iPhone 4，被告知需要排队，要等到明年才能拿到实机。而苹果官网已经写明，暂时无法供货，并取消了预定。
  让人如此疯狂的不只是 iPhone，还有 iPad，当平板电脑炒作多年却半死不活的时候，iPad 出现了，虽然它或多或少的还有一点问题，虽然我到现在还不明白，它是不是属于平板电脑的范畴，但它也让我们疯狂了，看看这些图片吧。
 这排队的人中，有你吗？
还有 Mac Book Air，这个能切面包的超薄电脑，你为它疯狂过吗？提起电脑，又想到一个事情，曾几何时，在大家眼中，在国内，Mac是美工的专利，如果有个程序员去用 Mac，很多人会认为他在装 X，程序员用什么 Mac 啊，但现在再看，越来越多的程序员在用 Mac。
如此完美的硬件产品，如此完美的工业设计，必然会让人疯狂，同样的苹果还有其他的东西让人疯狂，比如 AppStore，这个模式不是苹果公司首创，但是到目前为止，它做得最好！它让很多的程序员投入到了它的怀抱，让更多的用户毫不犹豫的购买了它上面的产品，我曾就有两个小时左右的时间，购买并下载了十几个 App 的记录。我想像我这样的人，不在少数！
以上的这些疯狂，已经持续发生了三年，相信也会继续持续下去，而一切疯狂的缔造者，是一个叫 Steven Jobs 的人,他是苹果公司的创始人，江湖人称“乔帮主，乔不死，乔老爷”，正是他和他的水果公司，让这个世界正在疯狂着!
如果可能，你是乐意一起疯狂，还是杀死他呢？</description>
    </item>
    
    <item>
      <title>全角转半角的函数</title>
      <link>https://tourcoder.com/quan-jiao-zhuan-ban-jiao-de-han-shu/</link>
      <pubDate>Tue, 13 Oct 2009 04:14:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/quan-jiao-zhuan-ban-jiao-de-han-shu/</guid>
      <description>一个很无聊的 php 函数，全角转半角
function convert2half($str){ $str = str_replace(&amp;quot;～&amp;quot;, &amp;quot;~&amp;quot;, $str); $str = str_replace(&amp;quot;｀&amp;quot;, &amp;quot;`&amp;quot;, $str); $str = str_replace(&amp;quot;！&amp;quot;, &amp;quot;!&amp;quot;, $str); $str = str_replace(&amp;quot;@&amp;quot;, &amp;quot;@&amp;quot;, $str); $str = str_replace(&amp;quot;＃&amp;quot;, &amp;quot;#&amp;quot;, $str); $str = str_replace(&amp;quot;¥&amp;quot;, &amp;quot;$&amp;quot;, $str); $str = str_replace(&amp;quot;％&amp;quot;, &amp;quot;%&amp;quot;, $str); $str = str_replace(&amp;quot;&amp;amp;&amp;quot;, &amp;quot;&amp;amp;&amp;quot;, $str); $str = str_replace(&amp;quot;＊&amp;quot;, &amp;quot;*&amp;quot;, $str); $str = str_replace(&amp;quot;（&amp;quot;, &amp;quot;(&amp;quot;, $str); $str = str_replace(&amp;quot;）&amp;quot;, &amp;quot;)&amp;quot;, $str); $str = str_replace(&amp;quot;—&amp;quot;, &amp;quot;_&amp;quot;, $str); $str = str_replace(&amp;quot;－&amp;quot;, &amp;quot;-&amp;quot;, $str); $str = str_replace(&amp;quot;＋&amp;quot;, &amp;quot;+&amp;quot;, $str); $str = str_replace(&amp;quot;＝&amp;quot;, &amp;quot;=&amp;quot;, $str); $str = str_replace(&amp;quot;｜&amp;quot;, &amp;quot;|&amp;quot;, $str); $str = str_replace(&amp;quot;｝&amp;quot;, &amp;quot;}&amp;quot;, $str); $str = str_replace(&amp;quot;］&amp;quot;, &amp;quot;]&amp;quot;, $str); $str = str_replace(&amp;quot;｛&amp;quot;, &amp;quot;{&amp;quot;, $str); $str = str_replace(&amp;quot;［&amp;quot;, &amp;quot;[&amp;quot;, $str); $str = str_replace(&amp;quot;“&amp;quot;, &amp;quot;\&amp;quot;&amp;quot;, $str); $str = str_replace(&amp;quot;”&amp;quot;, &amp;quot;\&amp;quot;&amp;quot;, $str); $str = str_replace(&amp;quot;‘&amp;quot;, &amp;quot;&#39;&amp;quot;, $str); $str = str_replace(&amp;quot;’&amp;quot;, &amp;quot;&#39;&amp;quot;, $str); $str = str_replace(&amp;quot;：&amp;quot;, &amp;quot;:&amp;quot;, $str); $str = str_replace(&amp;quot;；&amp;quot;, &amp;quot;;&amp;quot;, $str); $str = str_replace(&amp;quot;？&amp;quot;, &amp;quot;?</description>
    </item>
    
    <item>
      <title>jQuery 插件 wTooltip</title>
      <link>https://tourcoder.com/wtooltip/</link>
      <pubDate>Mon, 28 Sep 2009 05:50:13 +0000</pubDate>
      
      <guid>https://tourcoder.com/wtooltip/</guid>
      <description>今天听同事说，她用了 2 天的时间还没做好一个提示的功能，细问下，原来是要实现一个鼠标移到连接字上，显示出说明文字，但不能使用TITLE,ALT之类，细想下，jQuery插件可以轻松解决这个问题，而且还有很好的延伸作用。
首先，我们需要用到 jQuery 库文件和 wTooltip 库文件
添加引用 jQuery 和 wTooltip
然后写HTML部分的代码
&amp;lt;a href=”&amp;quot;&amp;gt;这里是连接&amp;lt;/a&amp;gt; 具体的JS部分
&amp;lt;script type=”text/javascript”&amp;gt; $(document).ready(function() { $(”a”).wTooltip(); //提示的内容为你连接的内容 }); &amp;lt;/script&amp;gt; 完成…
扩展延伸
一，自定义提示内容
$(”a”).wTooltip({content: “提示内容”}); 二，使用ajax调用远程提示
$(”#block-whatever p”).wTooltip({ content: “提示内容”, ajax: “http://www.tourcoder.com/?query=keyword” }); 三，自定义提示窗口样式
$(”#block2 p”).wTooltip({ content: “提示内容”, style: { border: “2px solid green”, background: “blue”, color: “white”, fontWeight: “bold” } }); </description>
    </item>
    
    <item>
      <title>C-Sharp调用存储过程简单完整例子</title>
      <link>https://tourcoder.com/stored-procedure-in-csharp/</link>
      <pubDate>Mon, 31 Aug 2009 05:49:10 +0000</pubDate>
      
      <guid>https://tourcoder.com/stored-procedure-in-csharp/</guid>
      <description>CREATE PROC P_TEST @Name VARCHAR(20), @Rowcount INT OUTPUT AS BEGIN SELECT * FROM T_Customer WHERE NAME=@Name SET @Rowcount=@@ROWCOUNT END GO 存储过程调用如下:
DECLARE @i INT EXEC P_TEST ‘A’,@i OUTPUT SELECT @i 结果
/* Name Address Tel ———- ———- ——————– A Address Telphone （所影响的行数为 1 行） ———– 1 （所影响的行数为 1 行） */ —————————————————————————————- –DotNet 部分(C#) –WebConfig 文件: —————————————————————————————- …… &amp;lt;/system.web&amp;gt; &amp;lt;!– 数据库连接字符串 –&amp;gt; &amp;lt;appSettings&amp;gt; &amp;lt;add key=”ConnectString” value=”server=(local);User ID=sa;Password=;database=Test” /&amp;gt; &amp;lt;/appSettings&amp;gt; &amp;lt;/configuration&amp;gt; —————————————————————————————- –C#代码:(用到两个测试控件,DataGrid1(用于显示绑定结果集合),Lable(用于显示存储过程返回单值) —————————————————————————————- //添加数据库引用 using System.</description>
    </item>
    
    <item>
      <title>基本功要扎实：概述public、protected、private</title>
      <link>https://tourcoder.com/public-protected-private/</link>
      <pubDate>Mon, 31 Aug 2009 05:48:27 +0000</pubDate>
      
      <guid>https://tourcoder.com/public-protected-private/</guid>
      <description>事实上public、protected、private就是水平访问和垂直访问的区别。水平访问就是能被类 的对象访问，垂直访问就是能被子类访问。public是即可水平访问又可垂直访问；private 是既不可水平访问也不可垂直访问；而protected是可以垂直访问，不可水平访问。
子类的对象也不可访问父类的protected成员
类的成员函数可以访问本类及子类对象的private、protected成员</description>
    </item>
    
    <item>
      <title>关于Regex.Replace只替换第一个的问题</title>
      <link>https://tourcoder.com/about-regex-replace/</link>
      <pubDate>Thu, 20 Aug 2009 05:47:43 +0000</pubDate>
      
      <guid>https://tourcoder.com/about-regex-replace/</guid>
      <description>都知道正则表达式吧，老牛X老牛X的东西了，就是如果你长时间不用，可能很难入门，我也是，当时看的时候都明白了，用的时候也只是那么一两回，几天不用， 全忘光了，今天又遇到一个这样的问题，一个关于 Regex.Replace 只替换第一个的问题，记得在 js 里用 replace 的时候就是只替换第一个匹配的，没办法只能用正则去替换，如今在 asp.net 里用正则去替换自己想要替换掉的内容，无奈也只替换掉了第一个，今天就来说一下我的解决办法：
我的代码是这样的:
string s = “asdfdf1&amp;lt;img src=\”sadfsadf\” width=\”sadf\” height=\”2323\” border=\”0\” /&amp;gt;1sadfsd&amp;lt;img src=\”sdfdsf\” /&amp;gt;fs&amp;lt;img src=\”asdf\” width=\”safds\” &amp;gt;dsdfsdfa”; Regex.Replace(s, @”&amp;lt;img.*?&amp;gt;”, “”, RegexOptions.IgnoreCase); Response.Write(s); 可以注意到，s 字符串里有三个图片，我想把图片全部替换掉，当然得用正则了，因为里面的内容不一样，所以就写了 &amp;lt;img.*?&amp;gt; 这样一个正则表达式，如果你正则不会的话，那你去百度一下，有一个30分钟学会正则表达式，文章还不错。地址：
http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
当然了我上面的代码就是只替换第一个，如果想把里面的图片代码全替换掉怎么办呢，看下面的代码：
//赋给变量后就可以多次替换 string teststr = “asdfdf1&amp;lt;img src=\”sadfsadf\” width=\”sadf\” height=\”2323\” border=\”0\” /&amp;gt;1sadfsd&amp;lt;img src=\”sdfdsf\” /&amp;gt;fs&amp;lt;img src=\”asdf\” width=\”safds\” &amp;gt;dsdfsdfa”; string pattern = @”&amp;lt;img.*?&amp;gt;”; Response.Write(Regex.Replace(teststr,pattern,”###”,RegexOptions.IgnoreCase)); 其实比上面只多了一步，把正则赋值给了一个变量，奇怪的是这样就可以把想要替换的东西全部替换掉了，具体原因我也说不太明白。
我在 csdn 上还看到了另一个问题，有人问，如果只替换第二个怎么办，下面把代码粘出来：
string teststr = “asdfdf1&amp;lt;img src=\”sadfsadf\” width=\”sadf\” height=\”2323\” border=\”0\” /&amp;gt;1sadfsd&amp;lt;img src=\”sdfdsf\” /&amp;gt;fs&amp;lt;img src=\”asdf\” width=\”safds\” &amp;gt;dsdfsdfa”; MatchCollection mc = Regex.</description>
    </item>
    
    <item>
      <title>SQL SERVER防注入</title>
      <link>https://tourcoder.com/hacked-in-sql-server/</link>
      <pubDate>Fri, 14 Aug 2009 05:47:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/hacked-in-sql-server/</guid>
      <description>该死，单位的 SQL 被通过一个ASP程序的漏洞挂马了，不同的是，这次挂马不是正常挂马，别人挂马是为了获利，进而挂上他们的链接 &amp;lt;sc…，而这次是非正常的，直接删除了数据。除了打上对应的漏洞的补丁外，在数据库方面也和大家分享下，如果防注入。
SQL2000的操作方法：
1、 不要使用sa用户连接数据库。
SA帐户拥有所有数据库和数据表的操作权限，在网页中使用SA连接数据库安全隐患非常大。
2、 新建一个public权限数据库用户，并用这个用户访问数据库。
为了增加安全系数，建议每个数据库建立独立的只有public权限管理帐户，并用这个用户访问数据库有利于SQL的安全性。
3、[角色]去掉角色 public 对 sysobjects 与 syscolumns 对象的 select 访问权限。
4、[用户]用户名称-&amp;gt; 右键－属性－权限－在 sysobjects 与 syscolumns 上面打“×”。
SQL2005的操作方法：
1、不要使用sa用户连接数据库。
SA帐户拥有所有数据库和数据表的操作权限，在网页中使用SA连接数据库安全隐患非常大。
2、新建一个public权限数据库用户，并用这个用户访问数据库。
为了增加安全系数，建议每个数据库建立独立的只有public权限管理帐户，并用这个用户访问数据库有利于SQL的安全性。
3、打开数据库—视图–找到–sys.sysobjects–右键“属性”– 左侧“权限”—右侧下面 在 “SELECT” 后面的“拒绝”后面把 “打对号”。
4、打开数据库—视图–找到–sys.syscolumns–右键“属性”– 左侧“权限”—右侧下面 在 “SELECT” 后面的“拒绝”后面把 “打对号”。
SQL2005到此为止问题解决。
用下面的东西查询，权限
DECLARE @T varchar(255), @C varchar(255) DECLARE Table_Cursor CURSOR FOR Select a.name,b.name from sysobjects a,syscolumns b where a.id=b.id and a.xtype= ‘u ‘ and (b.xtype=99 or b.xtype=35 or b.</description>
    </item>
    
    <item>
      <title>全角字符与半角字符的相互转换(C#)</title>
      <link>https://tourcoder.com/half-and-all-in-csharp/</link>
      <pubDate>Tue, 04 Aug 2009 05:46:16 +0000</pubDate>
      
      <guid>https://tourcoder.com/half-and-all-in-csharp/</guid>
      <description>/// &amp;lt;summary&amp;gt;全角半角的相互转换 /// /// &amp;lt;/summary&amp;gt; public class ConvertDBCAndSBC { /// &amp;lt;summary&amp;gt;半角转成全角 /// 半角空格32,全角空格12288 /// 其他字符半角33~126,其他字符全角65281~65374,相差65248 /// &amp;lt;/summary&amp;gt; /// &amp;lt;param name=”input”&amp;gt;&amp;lt;/param&amp;gt; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt; public string DBCToSBC(string input) { char[] cc = input.ToCharArray(); for(int i=0;i&amp;lt;cc.Length;i++) { if(cc[i] == 32) { // 表示空格 cc[i]=(char)12288; continue; } if(cc[i] &amp;lt; 127 &amp;amp;&amp;amp; cc[i] &amp;gt; 32) { cc[i]=(char)(cc[i]+65248); } } return new string(cc); } /// &amp;lt;summary&amp;gt;全角转半角 /// 半角空格32,全角空格12288 /// 其他字符半角33~126,其他字符全角65281~65374,相差65248 /// &amp;lt;/summary&amp;gt; /// &amp;lt;param name=”input”&amp;gt;&amp;lt;/param&amp;gt; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt; public string SBCToDBC(string input) { char[] cc = input.</description>
    </item>
    
    <item>
      <title>SQL server中的随机数</title>
      <link>https://tourcoder.com/rand-in-sqlserver/</link>
      <pubDate>Wed, 29 Jul 2009 05:45:37 +0000</pubDate>
      
      <guid>https://tourcoder.com/rand-in-sqlserver/</guid>
      <description>随机函数：rand()
在查询分析器中执行：select rand()，可以看到结果会是类似于这样的随机小数：0.36361513486289558，像这样的小数在实际应用中用得不多，一般要取随机数都会取随机整数。那就看下面的两种随机取整数的方法：
方式一
A：生成的数是这样的：12.0
select floor(rand()*N) B：生成的数是这样的：12
select cast( floor(rand()*N) as int) 方式二
A：生成的数是这样的：12.0
select ceiling(rand() * N) B：生成的数是这样的：12
select cast(ceiling(rand() * N) as int) 其中里面的N是一个你指定的整数，如 100，可以看出，两种方法的 A 方法是带有 .0 这个的小数的，而 B 方法就是真正的整数了。
大致一看，这两种方法没什么区别，真的没区别？其实是有一点的，那就是他们的生成随机数的范围：
方法1的数字范围：0 至 N-1 之间，如 cast( floor(rand()*100) as int) 就会生成 0 至 99 之间任一整数
方法2的数字范围：1 至 N 之间，如 cast(ceiling(rand() * 100) as int) 就会生成 1 至 100 之间任一整数
比较 CEILING 和 FLOOR
CEILING 函数返回大于或等于所给数字表达式的最小整数。FLOOR 函数返回小于或等于所给数字表达式的最大整数。例如，对于数字表达式 12.9273，CEILING 将返回 13，FLOOR 将返回 12。FLOOR 和 CEILING 返回值的数据类型都与输入的数字表达式的数据类型相同.</description>
    </item>
    
    <item>
      <title>定时关机/重启CMD命令</title>
      <link>https://tourcoder.com/cmd-command-about-shut-restart/</link>
      <pubDate>Wed, 29 Jul 2009 05:45:03 +0000</pubDate>
      
      <guid>https://tourcoder.com/cmd-command-about-shut-restart/</guid>
      <description>Windows XP 的关机是由 Shutdown.exe 程序来控制的，位于 Windows＼System32 文件夹中 。如果想让 Windows 2000 也实现同样的效果，可以把 Shutdown.exe 复制到系统目录下
比如你的电脑要在 22:00 关机，可以选择开始→运行，输入 at 22:00 Shutdown -s，这样，到了22 点电脑就会出现系统关机对话框，默认有 30 秒钟的倒计时并提示你保存工作。如果你想以倒计时的方式关机，可以输入 Shutdown.exe -s -t 3600，这里表示60分钟后自动关机，3600代表 60 分钟
Shutdown.exe 的参数，每个都具有特定的用途，执行每一个都会产生不同的效果，比如 -s 就表示关闭本地计算机，-a 表示取消关机操作，下面列出了更多参数，大家可以在 Shutdown.exe 中按需使用
-f：强行关闭应用程序 -m ＼＼计算机名：控制远程计算机 -i：显示图形用户界面，但必须是Shutdown的第一个选项 -l：注销当前用户 -r：关机并重启 -t时间：设置关机倒计时 -c “消息内容”：输入关机对话框中的消息内容(不能超127个字符) 1、 win2000 系统内没有 shutdown 命令文件，如果在 2000 中使用，必须copy winXP 中的 shutdown.exe 文件（在xp的c盘收索就能找到），在 win2k的C:\\WINNT 中.
2、 实现每日定时关机从新启动，在控制面板中的任务计划中添加一个计划，在运行中输入 C:\\WINNT\\shutdown.exe －r 在设置密码处输入管理员的密码，在日程处输入每天运行的时间，那样就可以达到每天定时重新启动计算机了。</description>
    </item>
    
    <item>
      <title>手动清除远程桌面记录</title>
      <link>https://tourcoder.com/remove-history-of-remote-history/</link>
      <pubDate>Wed, 22 Jul 2009 05:43:18 +0000</pubDate>
      
      <guid>https://tourcoder.com/remove-history-of-remote-history/</guid>
      <description>运行regedit，打开注册表，找到 HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default 右边的那些键值就记录了IP或者域名。 而最后一次连接的IP或者域名还会保留，直接删除“我的文档”下的“Default.rdp”文件
另外，如果想让远程桌面不保存记录 可以将 HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default 这个键值的权限设置为不可改写, 同样Default.rdp也是，这样一来远程桌面连接就不会记录你的登陆信息了。</description>
    </item>
    
    <item>
      <title>UrlEncode和UrlDecode</title>
      <link>https://tourcoder.com/urlencode-urldecode/</link>
      <pubDate>Mon, 20 Jul 2009 05:42:35 +0000</pubDate>
      
      <guid>https://tourcoder.com/urlencode-urldecode/</guid>
      <description>HttpUtility.UrlEncode 方法:
对 URL 字符串进行编码，以便实现从 Web 服务器到客户端的可靠的 HTTP 传输。
重载列表
将字节数组转换为已编码的 URL 字符串，以便实现从 Web 服务器到客户端的可靠的 HTTP 传输。
public static string UrlEncode(byte[]); 对 URL 字符串进行编码，以便实现从 Web 服务器到客户端的可靠的 HTTP 传输。
public static string UrlEncode(string); 使用指定的编码对象对 URL 字符串进行编码，以便实现从 Web 服务器到客户端的可靠 HTTP 传输。
public static string UrlEncode(string, Encoding); 从数组中的指定位置开始一直到指定的字节数为止，将字节数组转换为 URL 编码的字符串，以便实现从 Web 服务器到客户端的可靠的 HTTP 传输。
public static string UrlEncode(byte[], int, int); HttpUtility.UrlDecode 方法：
将已经为在 URL 中传输而编码的字符串转换为解码的字符串。
重载列表
将已经为在 URL 中传输而编码的字符串转换为解码的字符串。
public static string UrlDecode(string); 使用指定的解码对象将 URL 编码的字节数组转换为已解码的字符串。</description>
    </item>
    
    <item>
      <title>巧看IIS LOG</title>
      <link>https://tourcoder.com/view-iis-log/</link>
      <pubDate>Sat, 18 Jul 2009 05:41:50 +0000</pubDate>
      
      <guid>https://tourcoder.com/view-iis-log/</guid>
      <description>维护服务器的时候，大家都会遇到一个情况，就是IIS LOG看起来实在是太痛苦了，这里给大家推荐一个方法，能很好的处理这个问题
在access中新建表，包括十四个文本字段，第6、7、8、10字段长度设长点，其余字段长度为50即可。 在access中导入iis日志，选择使用空格分隔符分隔，导入建好的表，成功后就可以看到了。 是不是比记事本中看到的舒服多了？还可以针对某一字段排序，就可以快速查找我们想要的记录了。
PS:IIS LOG所在的地方：system32/logfiles/</description>
    </item>
    
    <item>
      <title>SQL server 2K5的自动备份</title>
      <link>https://tourcoder.com/auto-backup-in-sqlserver2k5/</link>
      <pubDate>Mon, 06 Jul 2009 05:40:34 +0000</pubDate>
      
      <guid>https://tourcoder.com/auto-backup-in-sqlserver2k5/</guid>
      <description>大家都知道数据库中的数据非常重要，而因为多方面的原因，很多公司未必请了专门的数据库方面的人才，只能靠程序员兼做着，今天就和大家分享一个偷懒但很实用的放大，自动备份数据，具体的创建步骤如下
a. 打开 SQL Server Management Studio，连接到你的实例，打开“对象资源管理器”，没有看到的话，按 F8 展开实例–管理–维护计划–右键“维护计划”–新建维护计划–输入维护计划名称，这样会出现创建维护计划的窗口
b. 在左边的工具箱中（没有的话，按Ctrl+Alt+X），将“备份数据库任务”拖到中间的黄色区域
c. 双击拖出来的这个任务，会出现设计属性的窗口，在数据库中，选择你要备份的数据库，然后设置备份到那里，并且设置备份的文件名，设计好后，单击“确定”，你也可以单击“T-SQL”，看看 sql 大致会用什么样的语句来处理你的需求。
d. 单击“计划”后面的“…”按钮，设置执行的时间计划。
OK，到此完成了~</description>
    </item>
    
    <item>
      <title>告诉你不一样的李嘉诚-揭秘李嘉诚是如何赚钱的</title>
      <link>https://tourcoder.com/about-lijiacheng/</link>
      <pubDate>Thu, 30 Apr 2009 05:39:49 +0000</pubDate>
      
      <guid>https://tourcoder.com/about-lijiacheng/</guid>
      <description>在大家都把李嘉诚捧为神明的时候，我来用我的切身体会说点相反的事情。
skype并不是我常用的软件，但因为对它的喜爱，加上通话的质量和低廉的价格，我会时不时的充值进去使用，可这次跑到skype中国来充值，问题来了，充值成功了，但是我的skype账户就是没有钱，我开始以为是显示问题，但过了十几天，用skype打电话，还是没钱，怪了，在一番琢磨后，突然想起了，会不会是因为我用的是官方正版skype的原因，如果我装上“盗版”的TOM版本的skype是不是就可以了，立刻卸载正版，装上“盗版”，果然，钱回来了，也可以拨打电话了，真想国骂！
这里说明下，
1.skype中国是李嘉诚旗下的
2.不只是我，还有很多的朋友都不喜欢用“盗版”的TOM版本的skype，因为那个广告实在是太多太多了，而且还不让你关闭这些广告，想好了，等这点钱用完了，以后还是在国际站充值吧，现在的这个“盗版”skype，广告实在是太多了！</description>
    </item>
    
    <item>
      <title>被逼，做了一次“流氓”</title>
      <link>https://tourcoder.com/css-hacker-01/</link>
      <pubDate>Wed, 29 Apr 2009 05:39:11 +0000</pubDate>
      
      <guid>https://tourcoder.com/css-hacker-01/</guid>
      <description>一个项目一下子恢复到最初的table的混乱状态，尤其是table的居左，居中，居右问题，如果一个页面一个页面修改，那要死人了，怎么办？
myalign:expression(this.align=&amp;quot;center&amp;quot;); 来帮你忙！
table{myalign:expression(this.align=&amp;quot;center&amp;quot;);} OK，搞定，FF下面，IE下面全部正常，Oh,yeah</description>
    </item>
    
    <item>
      <title>找工作，你真的准备好了吗？</title>
      <link>https://tourcoder.com/are-you-ready-to-find-a-job/</link>
      <pubDate>Mon, 13 Apr 2009 05:38:29 +0000</pubDate>
      
      <guid>https://tourcoder.com/are-you-ready-to-find-a-job/</guid>
      <description>因为受经济危机的影响，工作非常难找，所有应聘者应该理性的认真对待才是，但昨天的招聘会却让我大跌眼镜~
昨天和两位同事一同去参加了人才招聘会，感慨颇多
第一，请调整你的状态
很多人完全是处于一个混沌的状态，不知道是长时间宅在家里的原因，还是其他，大部分面试人员到你面前就是飘过来的一种感觉，草草的和你聊几句，然后又飘走了，颓废得一塌糊涂，拜托，您这副状态，用人单位怎么敢给您这份工作啊。
我强烈建议各位找工作的朋友，早睡早起，多看点书，多做点锻炼，出来走走，除非上网投点简历外，千万不要窝在家里，耗在网上！！！
第二，明确目标，不要满片撒网
昨天还有一个比较普遍的现象，就是很多面试人员的工作方向并不明确，甚至是自己都不清楚自己到底要找什么工作。昨天就发生这么一件事情，一个女生在我们的一个招聘点投了简历应聘某一职位，在我们另外一个招聘点又投了简历应聘另外一个职位，这两个职位是完全八杆子打不着的，让我彻底无语，她这样做虽然夸张了点，但在和面试人员沟通的过程中，我能清晰的感觉到他们目标并不明确，很多人都是又想做这个又想做那个，能捞到一条是一条的感觉。
我强烈建议各位找工作的朋友，请自问下自己，想清楚自己到底想做什么，如果现在自己的能力或者水平还没达到你想要做的工作的水平，拜托，从现在开始每天看点书，培养这些能力，因为找工作不是一时半会的事情，在你找到工作前，你有时间能让自己得到一定的提升。
第三，打好基础，千万不要江湖行骗
很多人没有那个能力，但感觉某一个工作轻松或者其他原因，就想方设法的混过去，昨天就有这么一个人，他和我说的时候头头是道，等到我问他第一个超基础的问题的时候，他想了很长一会，然后我明显感觉到他人开发发抖了，我又给了他一道题目，是入门，很入门的，让我火大的事情发生了，他居然给我乱写一气，当时要不是人多，我真的要骂人了！
我强烈建议各位找工作的朋友，暂时没有做过东西，没有经验没关系，把基础做好了，不光是对你现在找工作，还是将来的工作中，都有很大的帮助。
第四，请独立吧
昨天很多面试人员都是由父母带着来的，拜托，都是出来工作的人了，还不能够独立？
我的小小建议：如果你父母没有这个能力帮你托关系找一份工作，那是正常的，但你不应该拉着他们来招聘会，如果是他们强行要来的话，那是他们爱你，但请你和他们商量下，告诉他们你应该独立了，让你一个人去。
以上是我给正在找工作的朋友的小小建议，希望能引起你的思考。</description>
    </item>
    
    <item>
      <title>做好一个网络编辑</title>
      <link>https://tourcoder.com/how-to-be-a-good-writer/</link>
      <pubDate>Thu, 12 Mar 2009 05:37:36 +0000</pubDate>
      
      <guid>https://tourcoder.com/how-to-be-a-good-writer/</guid>
      <description>很早就想写一片关于网络编辑的文章了，但一直不知道如何组织语言，再加上自己也是半瓶水，所以，就不感盲目说了！今天却好看到一篇，特采摘部分内容，与大家分享一下
一、基本素养 1.特定领域的兴趣与深刻理解（持续关注+深入接触） 2.不断学习的热情与能力 二、新闻业务能力 1.基本新闻能力（信息筛选：采集素材，进行分类和加工；对稿件编辑、审核及监控；采访、撰稿。） 2.特殊新闻能力（网页制作、网络管理与维护、网上调查、论坛管理；信息策划和实施——网站专题、栏目、频道的策划及实施能力。） 3.遵循党和国家有关方针政策、法律法规的能力（国家劳动法、著作权法及其实施条例、互联网信息服务管理办法、互联网站从事登载新闻业务管理暂行规定、计算机信息网络国际联网管理暂行规定。） 三、驾驭网络媒体的能力 1.必须集各媒体传播手段之所长，熟练使用多种新闻表现方式 2.必须具有相当的计算机和网络知识（html，ps，dw，css，java） 3.必须具有驾驭网络互动性的能力（e.g. 人民网《强国论坛》） 四、创新能力（人无我有、人有我新、人新我深） 1.视角要独特，发现别人没有发现的内容 2.网络编辑更需要有深刻的思想 3.利用好图片、视频等视觉元素 </description>
    </item>
    
    <item>
      <title>凑个热闹：我也说说小沈阳</title>
      <link>https://tourcoder.com/about-xiaoshenyang/</link>
      <pubDate>Thu, 12 Mar 2009 05:36:58 +0000</pubDate>
      
      <guid>https://tourcoder.com/about-xiaoshenyang/</guid>
      <description>从春晚后，小沈阳就红得不行，一下子被全国观众所知晓，最近的一次访谈，更是炒得沸沸扬扬，就借这个热闹劲，我也来说我的观点，更欢迎大家来批批
我个人不喜欢小沈阳！也许是娱乐圈的缘故，他娱乐了大众，但我总觉得这种娱乐的方式实在是我所不能接受的，比如说吧，一个大男人搞成女人的样子，而且是那种很恶心的样子，除了觉得恶心外，我实在是娱乐不起来，就如我昨天和火柴，还有COCO下班回家的时候说的一样，我觉得，这样的情况，中国有一个赵本山就够了，其他的，还是算了吧！而且反过来说一句话，小沈阳能达到赵本山的高度吗？看看表演的内容吧，在小品方面，赵本山的作品，很多东西在说一些社会现象，揭露一些社会显示，帮说出了一些百姓的心里话，虽然这些都不是那么的彻底，而小沈阳的作品呢？里面都是啥，模仿别人唱几句？还是扮演那样男不男，女不女的？纯粹娱乐？
个人观点，欢迎拍砖</description>
    </item>
    
    <item>
      <title>WordCamp China 2009，我来了</title>
      <link>https://tourcoder.com/wcc2009/</link>
      <pubDate>Tue, 24 Feb 2009 05:36:18 +0000</pubDate>
      
      <guid>https://tourcoder.com/wcc2009/</guid>
      <description>WordCamp China 2009，我来了！
先前错过了 WordCamp China，这一届绝不能错过，这不，和 hongxiaowan 联系好后，填写了一张报名表，顺利报名成功！
大家需要报名的，也请去WordCamp China 2009的官站报名，请点这里！快点去哦~
需要说明的是：WordCamp2009上海站，定在3月28日的上海复旦大学新闻学院。欢迎大家来观摩，来演讲。这次的活动费用还是靠赞助和捐款。欢迎大家赞助捐款。 所以，如果赞助或捐款的话，可以联系hongxiaowan，Email：hongxiaowan+wordcamp2009@gmail.com 当然，你想省事的话，可以联系我~
放出一些基本信息：
李桢将主持本次 WordCamp2009，她可是复旦大学新闻学院的美女哦
吴海林博士
但凡有点 dig 精神的人，都应该知道Matt是谁，他也会来参加，我超级想知道他今年会给我们讲些什么~
PS：今天一早收到朋友的Email说他报名了WCC，他后来发现，我在他先报名了，对于我这种比较宅点的人来说，能有个共同参会的熟人不容易啊，哈哈~~
我们3月28日复旦见~
update@20090405:Wordcamp China 2009 归来
昨天去参加wordcamp china 2009了，在说这个事情前，先要说三个事情
  首先点名感谢下同事，要不是他的提醒，我可能昨天就错过了。
  还是决定放弃先前自己开发的.net + sqlite的博客程序，重新启用WORDPRESS，并且只导入了部分以前BLOG的数据进入，其他的留着其他备份
  先放出两张我参加WCC的照片，这两张照片是由同事用手机帮我拍的
  言归正传，和我的期望相去甚远的事是，这次的WCC其实并不那么成功，不光是从组织，还是从演讲方面，都不是那么成功！
本来9点30开始的大会，因为大家迟到的原因，被延时到10点多才开始，而大家的交流更倾向于私下的交流，而非听演讲人员的演讲，从Matt的演讲也足以看出问题，刚才开是的慢语速的，到后来，不知道是才思泉涌，还是其他，他的演讲速度终于加快了，简直是在赶时间一样，还从另外一点上可以看出Matt不是一个演讲家，PPT的提纲并没有给他带来更多的演讲的内容，每次都是很少的话解决了问题~
接下来是吴海林的演讲，然后是刘淼，最后是那个我不记得名字的，我不知道他的名字，是有意识的，因为我觉得他更适合去做一个Hipop的人，而非一个演讲者，那种带个帽子，埋头的不看大家的说话，让我非常反感，这和他所演讲的题目对比起来，更显得滑稽~
最后，上午结束的时候，我实在是憋不住了，跑去问了Matt两个问题
  WORDPRESS的用户群更倾向于个人用户，还是商业用户（其实我想知道的是他们在商业化方面有什么规划，对这样一个开源的软件如何商业化）
他回答是，他们正在尝试着商业活动
  对我们这些个人用户来说，WORDPRESS能为我们做点什么，难道我们就是用WORDPRESS写日志，因为我们不可能总是不停的换 theme，或者plugin
他回答是，是的，对我们来说，只能是写BLOG，但我们也可以在WORDPRESS上做一些自己喜欢的设计，
我的理解：做一些自己喜欢的设计？不就是搞搞theme或者plugin，难到还有其他？
  在写这篇BLOG前，我又有一些想法，并且给Matt发了EMAIL，不知道他会怎么回答~</description>
    </item>
    
    <item>
      <title>加入了记忆访客名字的功能</title>
      <link>https://tourcoder.com/a-function-called-remember-guest-name/</link>
      <pubDate>Wed, 04 Feb 2009 05:35:29 +0000</pubDate>
      
      <guid>https://tourcoder.com/a-function-called-remember-guest-name/</guid>
      <description>加入了 Cookies 记忆访客用户名的功能，至于他说的加入链接和 Email 的，过几天再搞吧，要动数据库的结构的，正好因为 TAG 的设计，要动数据库结构，所以等这个一起了。
Cookies 记忆访客用户名代码如下：
写入
string vname1 = HttpUtility.UrlEncode(vname); HttpCookie newCookie = new HttpCookie(&amp;quot;tccom&amp;quot;); newCookie.Values[&amp;quot;visitorname&amp;quot;] = vname1; newCookie.Expires = DateTime.Now.AddDays(1); Response.Cookies.Add(newCookie); 读出
if (Request.Cookies.Get(&amp;quot;tccom&amp;quot;) != null) { string vname1 = HttpUtility.UrlDecode(Request.Cookies.Get(&amp;quot;tccom&amp;quot;).Values.Get(&amp;quot;visitorname&amp;quot;)); this.vname.Value = vname1 ; } 这里说明下，HttpUtility.UrlDecode, HttpUtility.UrlEncode 是为了解决中文的乱码问题.
大家帮忙测试下这个功能哈~</description>
    </item>
    
    <item>
      <title>解决问题Sqlite3问题</title>
      <link>https://tourcoder.com/an-issue-in-sqlite3/</link>
      <pubDate>Mon, 02 Feb 2009 05:34:42 +0000</pubDate>
      
      <guid>https://tourcoder.com/an-issue-in-sqlite3/</guid>
      <description>不知道大家注意到没，这段时间，我的BLOG总是不断出现 This Database is Locked 的现象，回复留言极其痛苦，今天解决了这个问题，在这里给出这个问题的原因和解决过程
我的问题主要是下面Sqlite的知识点所说的问题
多进程可以同时打开同一个数据库，也可以同时 SELECT 。但只有一个进程可以立即改数据库。 Win95/98/ME 操作系统缺乏读书锁定，在低于 2.7.0 的版本中，这意味着在 windows下在同一时间内只能有一个进程读数据库。在版本 2.7.0 中这个问题通过在 windows接口代码中执行一个用户间隔几率读写锁定策略解决了。Windows 现在像 Unix 一样允许并发读取了。 如果数据库文件在一个 NFS 文件系统中，控制并发读书的锁定机制可以会出错。因为 NFS的锁定有时会坏掉。如果有多进程可以并发读书数据库则因当避免把数据库文件放在 NFS 文件系统中。根据微软的文档，如果不运行 Share.exe守护程序则 FAT 文件系统中的锁定可能不工作。对 Windows非常有经验的人告诉我网络文件的锁定有许多问题并且不可靠。如果是这样在二个或以上 Windows 系统中共享一个 SQLite数据库文件会导致不可预知的问题。 SQLite 的锁定是数据库级的，而大型数据库服务(如 PostgreSQL, Oracle 等等) 通常有更好的锁定，如锁定一个表或一记录。如果你的程序有大量并行操作建议使用大型数据服务。 当 SQLite 尝试操作一个被另一个进程锁定的文件时，缺省的行为是返回 SQLITE_BUSY。在 C代码中你可以通过使用sqlite3_busy_handler() 或 sqlite3_busy_timeout() API函数来调整这个缺省行为。详见 API 文档。 如果两个或更多进程同时打开同一个数据库，其中一个进程创建了新的表或索引，则其它进程可能不能立即看见新的表。其它进程可能需要关闭并重新连结数据库。 问题找到了，因为当我在 Insert 数据的时候，先前的 SELECT 操作没有关闭数据库的连接，而导致数据库被锁定，马上加上关闭，重新连接的方式， 但速度还是有问题，在仔细研究了一段 Sqlite 的实例代码后，发现它采用了事务的写法，马上采用，果然，问题得到解决。
PS：因为是个人BLOG，我偷懒，在读取的循环中输出到页面，这样在过程中也容易锁死数据库，更合理的做法是：读取到 DataSet 或者实体类集合再输出。
还有一个让人郁闷的事情就是，Sqlite的英文站点地址是: http://sqlite.org ，习惯性的打开 http://sqlite.org.cn ，看是不是中文支持站点，但发现这个站点居然是一个垃圾站点（诱惑类的图片站点），仔细查询了这个网站的历史，这个网站早期也是一个关于 Sqlite 的站点，只是后来转变成了这么一个垃圾站点，哎~这类网站有“钱途”啊~~</description>
    </item>
    
    <item>
      <title>XML&#43;XSL</title>
      <link>https://tourcoder.com/xml-xsl/</link>
      <pubDate>Fri, 30 Jan 2009 05:33:41 +0000</pubDate>
      
      <guid>https://tourcoder.com/xml-xsl/</guid>
      <description>前段时间和同事谈起过 XML + XSL，今天却好又和海马谈到这个玩意，感觉这个东西貌似是一个趋势，一个以后做站的趋势（技术方面），需要关注的朋友可以关注下：推荐一些内容
http://www.ibm.com/developerworks/cn/xml/theme/x-xsl.html
http://www.blueidea.com/tech/web/2004/1797.asp
http://www.blueidea.com/tech/web/2004/1798.asp
我想对新手有点作用吧。在这里我想说一个奉劝大家的一句话，不要不好意思，不要有其他任何的想法看新手入门资料，我就一直喜欢看新手入门的资料，虽然不我不是一个强人，但我一直觉得有些新手资料很值得看，因为里面的东西最基础，最根本，后期的很多的高深的东西很多是建立在他们的基础上，当然我也不是说不让大家去看一些提高的资料。</description>
    </item>
    
    <item>
      <title>网站创建，团队建设</title>
      <link>https://tourcoder.com/website-and-team/</link>
      <pubDate>Thu, 29 Jan 2009 05:32:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/website-and-team/</guid>
      <description>过年了，这几天围绕我们的网站做一些简单的分析，并有了一些自己的思考，需要说明的是流量统计的是在同事手里，我还没看到具体的流量情况，所以这些说法难免会避开流量分析的内容或者在流量分析方面的数据有点偏差。
  访问流量方面：这几天我们的流量给我整体的感觉就是人气很差，也许是过年的缘故，整体网站感觉起来就是没几个人在看，更不要说活跃度了，我做的评论，一直显示在最上面，后面没有更新。
  网站内容的更新：网站内容更新极少，都是我们的某一编辑在更新的，从23日下午我们放假后，到现在我写这个BLOG，一共更新了13篇，这样的更新量是否太少？我也类比了一些网站，发现除了绝对的大站和个人的专注站点外，能有大量更新的，差不多都是一些用户创建内容或者是用户投稿内容的站点。
  如果我们再放一个星期或一个月的假，我们网站会怎么样？该怎么办？这让我想起很早前一个对网站的讨论，网站该怎么做？流量产生于价值内容，而价值内容该么产生呢？我的一些想法是，当然这些想法大家可能都曾经想过，考虑过。
  养一群编辑，没日没夜的进行更新，让主编做主导，比如，SINA，SOHU等几个国内的门户都是这样吧，这样做的坏处是一旦你的网站停止了更新，就会有立刻丢失用户的危险，当然不排除很多新用户或者想回顾旧新闻的用户浏览旧新闻，挖掘旧新闻。
  完全由用户自己产生内容，让用户自己做主导，这个类似的站点也不少，比如 douban，土豆等，这个是一个取巧的方法，基本的形成模式是：早期的内容它能吸引来用户，用户会产生内容，内容会吸引用户，更多的用户会产生更多的内容。如此循环。但这里有一个致命的问题就是，所产生的内容的价值性有多少，能吸引多少用户过来？这些内容能留下多少用户？
  用户产生和编辑同步：现在这种方式的差不多都是一些比较小型的团队站点或者个人站点，比如国内的CNBETA，他们有自己的编辑在采摘内容，又有大量的用户投递内容，它有一个非常值得我们考虑的地方，很多投稿者以自己的稿件能在CNBETA上出现作为荣耀，哪怕这个稿件还是他自己转载过来的。目前这个也是我们采用的方式，编辑和投稿，只是目前我们的投稿很少，或者说，我们还没有一个正确的方式引导我们的用户来投稿，刺激他们投稿。而且我们还有一个很重要的问题，这个路子是否真的适合我们？尤其是做的教育方面的新闻。
  还有些想法，待续.</description>
    </item>
    
    <item>
      <title>Oh 百度</title>
      <link>https://tourcoder.com/oh-baidu/</link>
      <pubDate>Mon, 26 Jan 2009 05:14:40 +0000</pubDate>
      
      <guid>https://tourcoder.com/oh-baidu/</guid>
      <description>晚上的晚会虽然我没看全，但看到了一个人出现了至少四次，这个人就是百度的CEO&amp;ndash;李彦宏！
他第一次出现在镜头前的时候，我脑子一闪，百度赞助了晚会？没想到在第一个送来的祝福就是由百度带来的，呵呵，后面的时间里面该君还出现了三次。
在这里，我想问下，这是不是百度的新的策略来缓解过去一年百度的压力呢？</description>
    </item>
    
    <item>
      <title>还真的能搞</title>
      <link>https://tourcoder.com/what-the-fuck/</link>
      <pubDate>Sat, 24 Jan 2009 05:13:55 +0000</pubDate>
      
      <guid>https://tourcoder.com/what-the-fuck/</guid>
      <description>今天抽空看了《通缉令》，我最大的感受就是，还真的能搞啊！拐弯的子弹，超远程的子弹，超俗的剧情，唯一让我觉得有点不同的就是，最后半个女主角的安吉丽娜.朱莉选择了死亡，死亡的方式也很特别，剧情描述如下：
男主角被一帮杀手围住了，包括半女主角，一段陈词滥调后，女主角选择死亡，她发出子弹，然后这颗子弹环绕一周，穿透每个杀手的脑部，最后是自己&amp;hellip;
从这个片子，我还知道了一个事情，滴蜡是原来可以治伤的，有点“万金油”.</description>
    </item>
    
    <item>
      <title>总结今年，展望来年</title>
      <link>https://tourcoder.com/wishes-in-next-year/</link>
      <pubDate>Thu, 22 Jan 2009 05:13:28 +0000</pubDate>
      
      <guid>https://tourcoder.com/wishes-in-next-year/</guid>
      <description>时间好快，一晃一年，又到了总结今年，展望来年的时候了，其实在爷爷过世的那天我就一直在想这样一个问题，人一辈子究竟是要个什么，也许是太大，到现在为止，我还没想清楚，想明白，而我所能知道的，就是当前的一个时间段我需要什么，我应该做好什么事情。2008 年，我还有很多的不足和明显感觉到自己在某些方面的退步，以及感觉自己身上的使命感和责任感越来越重，同样也感觉到自己的心越发平稳，我还要向我的最佳理想方向努力 &amp;ndash; 该稳定的时候稳定，该有棱角的时候有棱角。
2009年，我有三个主要计划：
  和同事一起把单位的网站提高到一个等级，实现盈利
  做好一个开源的产品，GIT或MONO，是我优先考虑的，尤其是MONO，早就注册了域名，但一直没做过，从Google的统计上来说，每天这个域名的访问量居然有40多人次，而且回访的人占到了60%（我自己平时都不上的），这足以说明MONO还是有发展前途的，至少有人想使用。
  建好站点facepose.com,收集一亿张不同的脸的照片，人脸的身份识别是个很好的未来。
  </description>
    </item>
    
    <item>
      <title>.net 文章分页</title>
      <link>https://tourcoder.com/pages-in-dotnet/</link>
      <pubDate>Thu, 22 Jan 2009 05:12:51 +0000</pubDate>
      
      <guid>https://tourcoder.com/pages-in-dotnet/</guid>
      <description>.net 文章分页，主要是通过文章页面字符的个数进行分页的，这里需要注意的是
  去HTML，不然会出现超级搞笑的代码现象哦
  如果是纯文本，建议使用，如果不是纯文本的，强烈不建议使用，如果是文本的，请使用字符分页方式。
public string OutputBySize(string p_strContent)//分页函数 { string m_strRet = &amp;quot;&amp;quot;; int m_intPageSize = 1000;//文章每页大小 int m_intCurrentPage = 1;//设置第一页为初始页 int m_intTotalPage = 0; int m_intArticlelength = p_strContent.Length;//文章长度 if (m_intPageSize &amp;lt; m_intArticlelength) {//如果每页大小大于文章长度时就不用分页了 if (m_intArticlelength % m_intPageSize == 0) {//set total pages count m_intTotalPage = m_intArticlelength / m_intPageSize; } else {//if the totalsize m_intTotalPage = m_intArticlelength / m_intPageSize + 1; } if (Request.QueryString[&amp;quot;ps&amp;quot;] != null) {//set Current page number try {//处理不正常的地址栏的值 m_intCurrentPage = Convert.</description>
    </item>
    
    <item>
      <title>css hack 速查手册</title>
      <link>https://tourcoder.com/css-hack/</link>
      <pubDate>Wed, 21 Jan 2009 05:10:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/css-hack/</guid>
      <description>屏蔽IE浏览器（也就是IE下不显示）
*:lang(zh) select {font:12px !important;} /*FF,OP可见，特别提醒：由于Opera最近的升级，目前此句只为FF所识别*/ select:empty {font:12px !important;} /*safari可见*/ 这里select是选择符，根据情况更换。第二句是MAC上safari浏览器独有的。
仅IE7与IE5.0可以识别
*+html select {…} 当面临需要只针对IE7与IE5.0做样式的时候就可以采用这个HACK。
仅IE7可以识别
*+html select {…!important;} 当面临需要只针对IE7做样式的时候就可以采用这个HACK。
IE6及IE6以下识别
* html select {…} 这个地方要特别注意很多博客都写成了是IE6的HACK其实IE5.x同样可以识别这个HACK。其它浏览器不识别。
html/**/ &amp;gt;body select {…} 这句与上一句的作用相同。
仅IE6不识别，屏蔽IE6
select { display /*屏蔽IE6*/:none;} 这里主要是通过CSS注释分开一个属性与值，注释在冒号前。
仅IE6与IE5不识别，屏蔽IE6与IE5
select/**/ { display /*IE6,IE5不识别*/:none;} 这里与上面一句不同的是在选择符与花括号之间多了一个CSS注释。不屏蔽IE5.5
仅IE5不识别，屏蔽IE5
select/*IE5不识别*/ {…} 这一句是在上一句中去掉了属性区的注释。只有IE5不识别，IE5.5可以识别。
盒模型解决方法
selct {width:IE5.x宽度; voice-family :&amp;quot;\&amp;quot;}\&amp;quot;&amp;quot;; voice-family:inherit; width:正确宽度;} 盒模型的清除方法不是通过!important来处理的。这点要明确。
清除浮动
select:after {content:&amp;quot;.&amp;quot;; display:block; height:0; clear:both; visibility:hidden;} 在Firefox中，当子级都为浮动时，那么父级的高度就无法完全的包住整个子级，那么这时用这个清除浮动的HACK来对父级做一次定义，那么就可以解决这个问题。
截字省略号
select { -o-text-overflow:ellipsis; text-overflow:ellipsis; white-space:nowrap; overflow:hidden; } 这个是在越出长度后会自行的截掉多出部分的文字，并以省略号结尾，很好的一个技术。只是目前Firefox并不支持。</description>
    </item>
    
    <item>
      <title>MS OFFICE OUTLOOK中的问题</title>
      <link>https://tourcoder.com/an-issue-in-outlook/</link>
      <pubDate>Wed, 21 Jan 2009 05:08:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/an-issue-in-outlook/</guid>
      <description>今天同事使用了新的邮件刊模板，然后生成的邮件刊，在写的过程中他使用了
.Title_English{background:url(images/title_English.gif) no-repeat left top;} 这样的样式，来进行一个背景的定义，得到的反馈是，在outlook中，该图片无法显示，这里说明下，具体的原因是因为outlook不支持的原因导致的。outlook还可能不支持的属性如下
Forms Background images Animated GIFs Flash Float or position commands Alt tags in images 做页面，写前端的朋友要注意哦。更多的知道，请查看这里
解决方法：   尝试TABLE的形式
  尝试用插入图片不用背景，这里有一个关于图片重复的问题，详细稍后送上
  </description>
    </item>
    
    <item>
      <title>找到了适合自己的杂志，但不敢赋予很高的期望</title>
      <link>https://tourcoder.com/find-the-maga-that-i-love/</link>
      <pubDate>Tue, 20 Jan 2009 05:05:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/find-the-maga-that-i-love/</guid>
      <description>虽然很早就拥有了电脑，但还是一直喜欢通过书本，看实体的书来获取自己想要的知识，很早的时候，一直是电脑报的忠实读者，后来可能是市场经济的原因，电脑报是越来越广告了，真正对我有作用，能让我学习的东西是越来越少，最后很遗憾的和它说拜拜，从那个时候起，就一直没有订过任何杂志报纸，这期间也买过一些杂志，比如《大众软件》，《电脑迷》，但都不适合自己的需求。
正好昨天和女友去买东西，看到《程序员》杂志，就随手翻了翻，哇哦，感觉非常不错，立刻掏钱买了，虽然早就知道它的大名（来之CSDN），但一直以为它是和我上面罗列的那些杂志一样，没想到它却是这么的好，至少，它符合了我的口味，我的要求。鉴于先前杂志的情况，我会先在报亭购买几期，如果觉得的确很好，就会长期订阅，HOHO~~~
PS：昨天下午打了差不多2个小时的羽毛球，我的手臂今天还在酸着~</description>
    </item>
    
    <item>
      <title>删除相同数据</title>
      <link>https://tourcoder.com/delete-the-same-data/</link>
      <pubDate>Tue, 20 Jan 2009 04:58:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/delete-the-same-data/</guid>
      <description>大家在数据的移动过程，导来导去，难免会有数据重复的情况，通过下面的方式，可以帮你解决数据重复的问题
方法一：该方法比较保险点
declare @max integer,@id integer declare cur_rows cursor local for select 主键,count(*) from 数据表 group by 主键 having count(*) &amp;gt; 1 open cur_rows fetch cur_rows into @id,@max while @@fetch_status=0 begin select @max = @max -1 set rowcount @max delete from 数据表 where 主键 = @id fetch cur_rows into @id,@max end close cur_rows set rowcount 0 方法二：该方法，一般是没有问题的，但在处理一些键值的空与null的时候，会出现问题
select distinct * into #Tmp from 数据表 drop table 数据表 select * into 数据表 from #Tmp drop table #Tmp </description>
    </item>
    
    <item>
      <title>皮蛋菜谱</title>
      <link>https://tourcoder.com/100-years-egg/</link>
      <pubDate>Sun, 06 Apr 2008 04:49:00 +0000</pubDate>
      
      <guid>https://tourcoder.com/100-years-egg/</guid>
      <description>这里分享一些皮蛋做的菜。
皮蛋瘦肉粥（经典）   挑米：煮粥用的米最好用东北大米，就是圆圆短短的珍珠米，煮出的粥特别绵软。
  煮粥的米要预先腌：约半碗米淘洗干净后，要用２汤匙的油、１个半茶匙的盐和少许水（２茶匙）拌匀，腌至少半小时。放心，虽然用了很多油，但是油会在煮粥的过程中挥发，令米绵烂，所以并不油腻的。
  煮粥的肉要先用沸水煮煮去腥，或腌成咸肉：煮粥用瘦肉或腌的咸瘦肉，要保持一整块肉块不要切开（我一般用大约巴掌大、１～２厘米厚的一块猪肉，如果条件许可，用猪腱肉味道更好）。如果用瘦肉煮粥，那么要先用沸水把瘦肉略微煮煮，然后洗净；如果喜欢用腌的咸猪肉煮粥，那么要提前一天腌咸猪肉，方法如下：猪肉一块，冲洗干净，抹干，撒２～３茶匙盐，均匀涂抹在肉上，放冰箱冷藏箱腌１２小时或更长时间才可以入味。
  煮粥的水要充分沸腾才下材料：大汤锅中放很多水，煮沸，才放材料。先下肉块、姜片，火不要关小，肉块到了沸水中，外面的部分遇热而熟硬，封住了里面的肉汁，这样肉煮了粥后也不难吃。然后待水再次沸腾时下腌好的米和一个切碎的皮蛋，而这第一个皮蛋切碎下粥与米同煮，皮蛋会融化，融入粥的味道中。
  先大火，后小火，火候要足：水沸了，下了材料后，先大火煮２０分钟，然后再转小火煮１个半小时，火候足，粥就绵软入味而且容易消化。
  粥的质感处理：在转小火煮了１个半小时后，把第二个皮蛋也切碎，同时把煮在粥中的瘦肉捞出来，用筷子扒拉撕成丝丝状，跟第二个皮蛋一起放回粥中，同煮最后半小时，然后关火。第二个皮蛋在关火前半小时加入粥中，半小时可将第二个皮蛋煮得既没有石灰味，同时又变软滑，吃粥时也能吃到有皮蛋，而肉因为是水沸时下的，还保持了一定鲜味，撕成丝后放回粥中，特别好吃。 这样煮出来的粥不必下盐，好吃，而且败火，容易消化。如果粥有点粘底，请千万不要用勺子扒拉锅底的粘皮，要不粥会有糊味。我们通常会放一个轻的小调羹在锅底与粥同煮，水沸腾过程中，小调羹也被带动，可以防止粥煮粘底
  皮蛋豆腐（经典）   内脂豆腐去掉包装，不用切，成盒条状放在碟子上
  皮蛋去壳，切成小粒然后铺在豆腐上
  在豆腐和皮蛋粒上撒上葱花，把酱油、老醋、香油调匀淋上，再撒上点香芝麻即可 上汤皮蛋西兰花
  西兰花切成小朵，用清水冲洗干净后，放入加盐的沸水中汆烫60秒，捞起沥干水。西兰花需放入加盐的沸水中汆烫，这样可保持其清翠的颜色不变；烫西兰花的时间不宜长，以免失去其脆嫩的口感。
  皮蛋去壳，切小块；姜蒜去皮，都切成沫；胡萝卜去皮，切成细片。
  锅烧热放3汤匙油，小火爆香姜蒜沫金黄色后，倒入3碗清水煮沸，加少许白糖和盐还有1汤匙料酒搅匀煮成浓汤。
  放入皮蛋和胡萝卜片拌匀，继续以大火煮至沸腾4分钟。然后倒入西兰花，与锅内食材一同拌匀煮滚。
  最后淋入少许香油，即可出锅。如果有高汤做为汤底那更好，可让西兰花吸收汤底的鲜味，味道也更加鲜美清甜。
  蒜苗皮蛋肉丁   将里脊肉切成肉丁， 加入盐， 胡椒， 生粉， 生抽等调味料；搅拌均匀， 腌制十分钟；
  将锅烧热， 加入适量的油；油烧热后下入腌好的肉丁翻炒；肉丁翻炒变色后加入蒜苗丁， 一起翻炒；加入适量的盐， 胡椒等调味料， 继续翻炒两下；出锅前加入准备好的皮蛋丁；
   一起翻炒就可以啦；出锅装盘。</description>
    </item>
    
  </channel>
</rss>
