[{"content":"#!/bin/bash input_image=\u0026#34;1.png\u0026#34; sizes=(16 32 64 128 256 512 1024) for size in \u0026#34;${sizes[@]}\u0026#34;; do output_image=\u0026#34;${size}.png\u0026#34; ffmpeg -i \u0026#34;$input_image\u0026#34; -vf scale=${size}:${size} -c:v png -pix_fmt rgba \u0026#34;$output_image\u0026#34; done ","permalink":"https://blog-foamzou-com.pages.dev/posts/convert-all-size-of-xcode-app-icon-by-ffmpeg/","summary":"\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003einput_image\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1.png\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003esizes\u003c/span\u003e\u003cspan class=\"o\"\u003e=(\u003c/span\u003e\u003cspan class=\"m\"\u003e16\u003c/span\u003e \u003cspan class=\"m\"\u003e32\u003c/span\u003e \u003cspan class=\"m\"\u003e64\u003c/span\u003e \u003cspan class=\"m\"\u003e128\u003c/span\u003e \u003cspan class=\"m\"\u003e256\u003c/span\u003e \u003cspan class=\"m\"\u003e512\u003c/span\u003e 1024\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e size in \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003esizes\u003c/span\u003e\u003cspan class=\"p\"\u003e[@]\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003eoutput_image\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003esize\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e.png\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ffmpeg -i \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$input_image\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e -vf \u003cspan class=\"nv\"\u003escale\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003esize\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e:\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003esize\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e -c:v png -pix_fmt rgba \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$output_image\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"使用 ffmpeg 批量转换 xcode 全尺寸 App icon"},{"content":"Issue 今天在运行 golangci-lint run 时报了标题的错误，完整的错误信息如下：\nERRO [linters context] typechecking error: # github.com/xx/xx/internal/domains/protection_product [github.com/xx/xx/internal/domains/protection_product.test] internal/domains/protection_product/product.go:4:2: could not import \u0026#34;context\u0026#34;: open : no such file or directory Diagnosis 很明显问题并不出在 context，这是一个系统库，不可能不存在。\n找了一圈 google，百度，ChatGPT 都没找到答案。\n最后搜索到这个 link 类似的问题，为了快速验证，我把该包下的 test 文件注释掉，果然能够通过 lint 了。\n然后经过排查，果然 test 文件存在一个较深的循环依赖调用。要解决这个循环依赖比较麻烦，所以在 test 文件的原始包名后面加上 _test 后缀，解决了问题。\nBy the way 上面那个报错其实是 go list 报的，golang-ci 会调用 go list。如果需要快速验证是否还存在上述报错，可以直接这么调用：\ngo list -e -json -compiled=false -test=true -export=true -deps=false -find=false ./... \u0026gt;/dev/null ","permalink":"https://blog-foamzou-com.pages.dev/posts/could-not-import-xx-open-no-such-file-or-directory/","summary":"\u003ch2 id=\"issue\"\u003eIssue\u003c/h2\u003e\n\u003cp\u003e今天在运行 golangci-lint run 时报了标题的错误，完整的错误信息如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eERRO [linters context] typechecking error: # github.com/xx/xx/internal/domains/protection_product [github.com/xx/xx/internal/domains/protection_product.test]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einternal/domains/protection_product/product.go:4:2: could not import \u0026#34;context\u0026#34;: open : no such file or directory\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"diagnosis\"\u003eDiagnosis\u003c/h2\u003e\n\u003cp\u003e很明显问题并不出在 context，这是一个系统库，不可能不存在。\u003c/p\u003e\n\u003cp\u003e找了一圈 google，百度，ChatGPT 都没找到答案。\u003c/p\u003e\n\u003cp\u003e最后搜索到这个 \u003ca href=\"https://github.com/golang/go/issues/51180\"\u003elink\u003c/a\u003e 类似的问题，为了快速验证，我把该包下的 test 文件注释掉，果然能够通过 lint 了。\u003c/p\u003e\n\u003cp\u003e然后经过排查，果然 test 文件存在一个较深的循环依赖调用。要解决这个循环依赖比较麻烦，所以在 test 文件的原始包名后面加上 \u003ccode\u003e_test\u003c/code\u003e 后缀，解决了问题。\u003c/p\u003e\n\u003ch2 id=\"by-the-way\"\u003eBy the way\u003c/h2\u003e\n\u003cp\u003e上面那个报错其实是 go list 报的，golang-ci 会调用 go list。如果需要快速验证是否还存在上述报错，可以直接这么调用：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ego\u003c/span\u003e \u003cspan class=\"n\"\u003elist\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ejson\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecompiled\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"bp\"\u003efalse\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etest\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"bp\"\u003etrue\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"k\"\u003eexport\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"bp\"\u003etrue\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edeps\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"bp\"\u003efalse\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efind\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"bp\"\u003efalse\u003c/span\u003e \u003cspan class=\"o\"\u003e./...\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;/\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003enull\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"could not import \"xx\": open : no such file or directory"},{"content":" 好久没有写博客了，今年才写了 2 篇，但并不是说我在创作方面懒惰了，反而今年写了一个还算不错的开源项目(后面会写一系列文章记录我在做这个开源项目遇到的技术问题和一些人文)。可能空闲时间的精力倾斜到开源项目，导致博客投入不多吧。Anyway，本文也是我先发在公司 notion 的，先抄自己一篇，不那么费神。\n背景 One day，公司要求所有的 repo 都要在 Jenkins 打开 sonar 的配置，这需要我们给 repo 的 Jenkins 文件添加多一个配置，然后提 PR。天呐，我们 team 有 7-80 个 repo ，简直是噩梦。所以，我们需要自动化。automizely！\nFlow 先来看看我司的 git flow，就是标准的 github flow。下图所示的 1 - 4 步骤的自动化都比较好实现，不涉及到复杂的逻辑。比较复杂的在于 clone 到本地后，需要自己写代码来批量修改每个 repo 的文件。对于后者，每次的逻辑都不太一样，自行实现即可。\n步骤 1. 准备 repo list 文件 我们将需要处理的 repo 放到一个文件里，例如 all-repo.txt ，每行是一个 repo 名。 repo-name1 repo-name2 repo-name3 2. 将 all-repo.txt 复制一份为 all-repo-cur.txt , 等会我们的脚本就用这份 cur ，目的是等会处理过程中可能会因为中间有个 repo 意外失败，需要重新跑，我们就可以把已经成功的 repo 从 cur 文件中移除。注意 cur 文件最后一行必须是空行，避免 shell 命令读取不到最后一行的 repo\n2. 装好必备工具 安装 github 的 cli\nbrew install gh ## 按提示登录 gh auth login 新建一个 index.sh 文件，将以下方法粘贴进去，等会要用\ngclone () { git clone $1 dirname=$(echo -n $1 | awk -F\u0026#39;/\u0026#39; \u0026#39;{print $NF}\u0026#39; | awk -F\u0026#39;.git\u0026#39; \u0026#39;{print $(NF-1)}\u0026#39;) cd $dirname upstreamUrl=$(echo $1 | sed -r \u0026#39;s|(.*github.com)/.+/(.*)|\\1/换成你公司的名/\\2|\u0026#39;) git remote add upstream $upstreamUrl git remote -v } nb (){ git fetch upstream git checkout -b $1 --track upstream/master } gp (){ A=`git status | grep \u0026#34;On branch\u0026#34; | sed \u0026#34;s/On branch //\u0026#34; ` git push -u origin $A } mkdir -p repos 3. Fork repo to your github account cd repos cat ../all-repo-cur.txt | while read line do echo $line gh repo fork 换成你公司的名/${line} cd - done 4. Clone all the repos to local cd repos cat ../all-repo-cur.txt | while read line do echo $line gclone https://github.com/foamzou/${line}.git # foamzou 替换成你的账号名 cd - done 5. Modify the file of repos 因为涉及一些需要逻辑判断的地方，shell 不太方便写，就用 js 写了。下边的 demo 是在 Jenkins file 里添加多一个配置。大家按照自己实际需求来编写替换文件即可。\nconst fs = require(\u0026#39;fs\u0026#39;); const execSync = require(\u0026#39;child_process\u0026#39;).execSync; const AllRepo = fs.readFileSync(\u0026#39;./all-repo-cur.txt\u0026#39;).toString().split(\u0026#39;\\n\u0026#39;); function findFileWithRegex(regex, dir) { const l = []; const files = fs.readdirSync(dir); for (let i = 0; i \u0026lt; files.length; i++) { const file = files[i]; const filePath = dir + \u0026#39;/\u0026#39; + file; if (regex.test(file)) { l.push(filePath); } } return l; } // 在 aaa 属性下面新增属性 bbb function insertPropertyIntoFile(file) { const content = fs.readFileSync(file).toString(); if (content.indexOf(\u0026#39;bbb\u0026#39;) \u0026gt; 0) { return true; } const lines = content.split(\u0026#39;\\n\u0026#39;); const newLines = []; let isInserted = false; for (let i = 0; i \u0026lt; lines.length; i++) { const line = lines[i]; if (line.indexOf(\u0026#39;aaa\u0026#39;) \u0026gt;= 0) { const find = line.replace(\u0026#39;aaa\u0026#39;, \u0026#39;bbb\u0026#39;).replace(\u0026#39;false\u0026#39;, \u0026#39;true\u0026#39;); newLines.push(line); newLines.push(find); isInserted = true; } else { newLines.push(line); } } fs.writeFileSync(file, newLines.join(\u0026#39;\\n\u0026#39;)); return isInserted; } AllRepo.forEach(repo =\u0026gt; { const repoPath = `./repos/${repo}`; try { const files = findFileWithRegex(/Jenkinsfile*/, repoPath); files.forEach(file =\u0026gt; { if (!insertPropertyIntoFile(file)) { console.log(`${file} is not inserted`); } else { console.log(`${file} is inserted`); } }); } catch (err) { console.log(err); } }); 6. Create PR cd repos cat ../all-repo-cur.txt | while read line do echo \u0026#34;-------------------------------------------------------\u0026#34; echo \u0026#34;-------------------------------------------------------\u0026#34; echo $line cd $line nb feat/XXX-id-ci-integrate-sonar git add -A git commit -am \u0026#34;[XXX-id] ci: integrate sonar\u0026#34; gp gh pr create --title \u0026#34;[XXX-id] ci: integrate sonar\u0026#34; -R 换成你公司的名/$line -b \u0026#34;\u0026#34; cd - done The last 为了避免后续可能会用到 RR ID，建议可以将 步骤 6 中的运行结果保存起来 \u0026gt; pr.log\n然后可以把 PR 链接集合起来。\ncat pr* | grep \u0026#39;github.com/换成你公司的名/\u0026#39; | grep \u0026#39;/pull/\u0026#39; 因为不太确定改动是否有问题，所以本次 case 我还是把所有 PR 链接提供给 teammate check 改动，手动 merge。\n如果大伙在代码里能够 10000% 保证改动是没有问题的，那么完全可以用 gh 命令让有权限 approve 并 merge 的同学用自动化脚本， merge all the pr 。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/batch-modify-github-repo/","summary":"\u003cblockquote\u003e\n\u003cp\u003e好久没有写博客了，今年才写了 2 篇，但并不是说我在创作方面懒惰了，反而今年写了一个还算不错的开源项目(后面会写一系列文章记录我在做这个开源项目遇到的技术问题和一些人文)。可能空闲时间的精力倾斜到开源项目，导致博客投入不多吧。Anyway，本文也是我先发在公司 notion 的，先抄自己一篇，不那么费神。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003eOne day，公司要求所有的 repo 都要在 Jenkins 打开 sonar 的配置，这需要我们给 repo 的 Jenkins 文件添加多一个配置，然后提 PR。天呐，我们 team 有 7-80 个 repo ，简直是噩梦。所以，我们需要自动化。automizely！\u003c/p\u003e\n\u003ch2 id=\"flow\"\u003eFlow\u003c/h2\u003e\n\u003cp\u003e先来看看我司的 git flow，就是标准的 github flow。下图所示的 1 - 4 步骤的自动化都比较好实现，不涉及到复杂的逻辑。比较复杂的在于 clone 到本地后，需要自己写代码来批量修改每个 repo 的文件。对于后者，每次的逻辑都不太一样，自行实现即可。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/batch-modify-github-repo/batch-modify-github-repo.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"步骤\"\u003e步骤\u003c/h2\u003e\n\u003ch3 id=\"1-准备-repo-list-文件\"\u003e1. 准备 repo list 文件\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e我们将需要处理的 repo 放到一个文件里，例如 \u003ccode\u003eall-repo.txt\u003c/code\u003e ，每行是一个 repo 名。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erepo-name1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erepo-name2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erepo-name3\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e2. 将 \u003ccode\u003eall-repo.txt\u003c/code\u003e 复制一份为 \u003ccode\u003eall-repo-cur.txt\u003c/code\u003e , 等会我们的脚本就用这份 \u003ccode\u003ecur\u003c/code\u003e ，目的是等会处理过程中可能会因为中间有个 repo 意外失败，需要重新跑，我们就可以把已经成功的 repo 从 \u003ccode\u003ecur\u003c/code\u003e 文件中移除。注意 \u003ccode\u003ecur\u003c/code\u003e 文件最后一行必须是空行，避免 shell 命令读取不到最后一行的 repo\u003c/p\u003e","title":"自动化批量修改 Github 的 repo"},{"content":" JetBrains 允许用户通过多种途径免费申请 license，例如用于学术研究、参与开源项目等。本文介绍的是参与开源项目这种途径。\n谁可以申请 拥有一个开源项目，或者是该项目的核心贡献者 在过去三个月内，你有定期贡献代码 该开源项目不能有付费版本 该开源项目尚未接收商业公司或组织的资助 鉴于申请资格随着时间发展可能会发生变化，可以参考 官网说明\n据网上各网友的情况来看，JetBrains 不关心你的 repo 有多少 stars，用的什么语言。所以只要满足它的要求，都可以通过。\n但希望不要滥用，因为 JetBrains 的初衷是支持开源项目，我们 respect 它。\nLicense 说明 有效期：1年。到期可以再次申请 仅能用于开发非商业开源项目 不能和他人共享该 License 申请流程 申请网址：https://www.jetbrains.com/shop/eform/opensource\n接下来是填各种信息。因为要求是最近三个月有在积极贡献代码，所以我选择了一个 GitHub 插件项目。原本还担心这个 repo 比较简单，会不会无法通过，但后面证明是我多虑了。\n填完之后点击提交即可\n通过申请 大概3个工作日后，我收到了来自 JetBrains 的 邮件。\n附件是 License 的订单凭证。Email 中提到如果我愿意的话，希望我可以将 JetBrains 作为项目支持者展示在 repo 主页。Sure, I would.\n激活 License 点击邮件的 Take me to my license 链接，然后会看到有一个待激活的 License 躺在列表里，选择 assign 给指定人，我填了自己的邮箱。勾选了将 offline code 作为邮件内容的一部分发到我邮箱。\n然后，我收到了邮件，附件是两份离线 license code （分别使用在 2018.1 前后的产品）\n然后贴在 IDE register 页面就好啦~\nCoding 愉快，开源贡献者们~\n再次感谢 JetBrains\n","permalink":"https://blog-foamzou-com.pages.dev/posts/apply-jetbrains-free-license/","summary":"\u003cblockquote\u003e\n\u003cp\u003eJetBrains 允许用户通过多种途径免费申请 license，例如用于学术研究、参与开源项目等。本文介绍的是参与开源项目这种途径。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"谁可以申请\"\u003e谁可以申请\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e拥有一个开源项目，或者是该项目的核心贡献者\u003c/li\u003e\n\u003cli\u003e在过去三个月内，你有定期贡献代码\u003c/li\u003e\n\u003cli\u003e该开源项目不能有付费版本\u003c/li\u003e\n\u003cli\u003e该开源项目尚未接收商业公司或组织的资助\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e鉴于申请资格随着时间发展可能会发生变化，可以参考 \u003ca href=\"https://www.jetbrains.com/community/opensource/#support\"\u003e官网说明\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e据网上各网友的情况来看，JetBrains 不关心你的 repo 有多少 stars，用的什么语言。所以只要满足它的要求，都可以通过。\u003c/p\u003e\n\u003cp\u003e但希望不要滥用，因为 JetBrains 的初衷是支持开源项目，我们 respect 它。\u003c/p\u003e\n\u003ch2 id=\"license-说明\"\u003eLicense 说明\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e有效期：1年。到期可以再次申请\u003c/li\u003e\n\u003cli\u003e仅能用于开发非商业开源项目\u003c/li\u003e\n\u003cli\u003e不能和他人共享该 License\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"申请流程\"\u003e申请流程\u003c/h2\u003e\n\u003cp\u003e申请网址：https://www.jetbrains.com/shop/eform/opensource\u003c/p\u003e\n\u003cp\u003e接下来是填各种信息。因为要求是最近三个月有在积极贡献代码，所以我选择了一个 \u003ca href=\"https://github.com/foamzou/group-by-repo-on-github\"\u003eGitHub 插件项目\u003c/a\u003e。原本还担心这个 repo 比较简单，会不会无法通过，但后面证明是我多虑了。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/apply-jetbrains-free-license/1.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/apply-jetbrains-free-license/2.png\"\u003e\u003c/p\u003e\n\u003cp\u003e填完之后点击提交即可\u003c/p\u003e\n\u003ch2 id=\"通过申请\"\u003e通过申请\u003c/h2\u003e\n\u003cp\u003e大概3个工作日后，我收到了来自 JetBrains 的 邮件。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/apply-jetbrains-free-license/WX20220122-231935_2x-1024x615.png\"\u003e\u003c/p\u003e\n\u003cp\u003e附件是 License 的订单凭证。Email 中提到如果我愿意的话，希望我可以将 JetBrains 作为项目支持者展示在 repo 主页。Sure, I would.\u003c/p\u003e\n\u003ch2 id=\"激活-license\"\u003e激活 License\u003c/h2\u003e\n\u003cp\u003e点击邮件的 \u003ccode\u003eTake me to my license\u003c/code\u003e 链接，然后会看到有一个待激活的 License 躺在列表里，选择 assign 给指定人，我填了自己的邮箱。勾选了将 offline code 作为邮件内容的一部分发到我邮箱。\u003c/p\u003e\n\u003cp\u003e然后，我收到了邮件，附件是两份离线 license code （分别使用在 2018.1 前后的产品）\u003c/p\u003e","title":"免费申请 JetBrains 全家桶 License"},{"content":" grep 在 *nix 系统都有预装，也是程序员日常工作经常用到的工具。我最近的工作，涉及到很多大文本处理，grep 处理得不是很快。于是就用到了 ripgrep，这个工具跑起来快很多。本文主要摘录自己平时可能会用到的用法\n安装 在 GitHub Repo 的指引下找到你对应的系统命令安装即可，一行命令。\n安装完之后，ripgrep 的可执行命令是 rg\n常用参数 一般搜索 rg str sample.txt 默认，标准输出会高亮你的搜索词，并且每行前面会有行号。不过请放心，重定向到另一个文本时，是不包含行号的。\n如果你不想要输出行号，使用 -N\nrg str sample.txt -N 统计行数 rg str sample.txt -c # 相当于 grep str sample.txt | wc -l And 条件 A ha, 现在还不支持，老早就有很多用户提这个需求了。看看固执的作者什么时候允许加上。可以关注这个 Issue。\n只能管道后再次筛选了， --color always 是为了第一个搜索词也能被高亮\nrg str sample.txt --color always | rg str2 Or 条件 使用多个 -e 参数 作为条件。只要匹配到任何一个搜索词，都会被匹配到\nrg -e \u0026#39;str1\u0026#39; -e \u0026#39;str2\u0026#39; -e \u0026#39;str3\u0026#39; sample.txt 匹配到N条结果就停止 很多情况下，我们知道只有 N 条匹配项，为了节约时间，希望匹配到足够数量就不要往下搜索了。\nrg str sample.txt -m 数量 不输出文件名 默认情况下， ripgrep 会在每行开头输出文件名。当我们需要结合 grep 做统计分析的时候，往往不期望输出文件名。Just add the flag -I\nrg \u0026#39;hello\u0026#39; sample.txt -I 正则 下边的 -e 可以不加，因为默认把搜索词当做正则。\n如果希望把搜索词当成普通文本处理，使用 -F ，为什么默认要当成正则呢，神奇的设计，可能文件搜索普遍使用正则？\nrg -e \u0026#39;^UE.+?NL\u0026#39; sample.txt 如果期望只输出正则匹配到的组(group)，那么可以结合 -r flag 来做到。原理就是将整行文本替换成 $1 (group 1)\nrg -e \u0026#39;^.*?(your-pattern).*?$\u0026#39; sample.txt -r \u0026#39;$1\u0026#39; 替换文本 会将搜索到的文本，替换成你指定的再输出。使用 -r 。\n注意，该参数不会改变你原来的文本，只是输出时替换文本\nrg -e \u0026#39;123456\u0026#39; sample.txt -r \u0026#39;******\u0026#39; 如果希望实现替换原有文件的特定文本，可以这么做:\nrg --passthru \u0026#39;like\u0026#39; sample.txt -r \u0026#39;love\u0026#39; --passthru 参数会将未匹配的行也进行标准输出\n","permalink":"https://blog-foamzou-com.pages.dev/posts/ripgrep/","summary":"\u003cblockquote\u003e\n\u003cp\u003e\u003ccode\u003egrep\u003c/code\u003e 在 *nix 系统都有预装，也是程序员日常工作经常用到的工具。我最近的工作，涉及到很多大文本处理，grep 处理得不是很快。于是就用到了 ripgrep，这个工具跑起来快很多。本文主要摘录自己平时可能会用到的用法\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"安装\"\u003e安装\u003c/h2\u003e\n\u003cp\u003e在 \u003ca href=\"https://github.com/BurntSushi/ripgrep#installation\"\u003eGitHub Repo\u003c/a\u003e 的指引下找到你对应的系统命令安装即可，一行命令。\u003c/p\u003e\n\u003cp\u003e安装完之后，ripgrep 的可执行命令是 \u003ccode\u003erg\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"常用参数\"\u003e常用参数\u003c/h2\u003e\n\u003ch3 id=\"一般搜索\"\u003e一般搜索\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erg str sample.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e默认，标准输出会高亮你的搜索词，并且每行前面会有行号。不过请放心，重定向到另一个文本时，是不包含行号的。\u003c/p\u003e\n\u003cp\u003e如果你不想要输出行号，使用 \u003ccode\u003e-N\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erg str sample.txt -N\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"统计行数\"\u003e统计行数\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erg str sample.txt -c  # 相当于 grep str sample.txt | wc -l\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"and-条件\"\u003eAnd 条件\u003c/h3\u003e\n\u003cp\u003eA ha, 现在还不支持，老早就有很多用户提这个需求了。看看固执的作者什么时候允许加上。可以关注这个 \u003ca href=\"https://github.com/BurntSushi/ripgrep/issues/875\"\u003eIssue\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e只能管道后再次筛选了， \u003ccode\u003e--color always\u003c/code\u003e 是为了第一个搜索词也能被高亮\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erg str sample.txt --color always | rg str2\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"or-条件\"\u003eOr 条件\u003c/h3\u003e\n\u003cp\u003e使用多个 -e 参数 作为条件。只要匹配到任何一个搜索词，都会被匹配到\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erg -e \u0026#39;str1\u0026#39; -e \u0026#39;str2\u0026#39; -e \u0026#39;str3\u0026#39; sample.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"匹配到n条结果就停止\"\u003e匹配到N条结果就停止\u003c/h3\u003e\n\u003cp\u003e很多情况下，我们知道只有 N 条匹配项，为了节约时间，希望匹配到足够数量就不要往下搜索了。\u003c/p\u003e","title":"用 ripgrep 替换 grep"},{"content":"文本处理 清除每行头\u0026amp;尾部的空白符 awk \u0026#39;{$1=$1;print}\u0026#39; ref: https://stackoverflow.com/questions/448005/whats-an-easy-way-to-read-random-line-from-a-file\n在一个文本随机选取若干行 // macos 则先 brew install coreutils，然后用 gshuf shuf foo.txt | head -n 100 cat foo.txt | awk \u0026#39;BEGIN{srand();}{print rand()\u0026#34;\\t\u0026#34;$0}\u0026#39; | sort -k1 -n | cut -f2- | head -n 100 ref: https://stackoverflow.com/questions/448005/whats-an-easy-way-to-read-random-line-from-a-file\n截取每行的前几个字符 cut -c 1-3 file // 前三个字符 ref: https://stackoverflow.com/questions/19869511/how-to-restrict-length-of-string-present-in-a-line-using-linux\n","permalink":"https://blog-foamzou-com.pages.dev/posts/shell-skill/","summary":"\u003ch2 id=\"文本处理\"\u003e文本处理\u003c/h2\u003e\n\u003ch3 id=\"清除每行头尾部的空白符\"\u003e清除每行头\u0026amp;尾部的空白符\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eawk \u0026#39;{$1=$1;print}\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eref: \u003ca href=\"https://stackoverflow.com/questions/448005/whats-an-easy-way-to-read-random-line-from-a-file\"\u003ehttps://stackoverflow.com/questions/448005/whats-an-easy-way-to-read-random-line-from-a-file\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"在一个文本随机选取若干行\"\u003e在一个文本随机选取若干行\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// macos 则先 brew install coreutils，然后用 gshuf\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eshuf foo.txt | head -n 100\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecat foo.txt | awk \u0026#39;BEGIN{srand();}{print rand()\u0026#34;\\t\u0026#34;$0}\u0026#39; | sort -k1 -n | cut -f2- | head -n 100\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eref: \u003ca href=\"https://stackoverflow.com/questions/448005/whats-an-easy-way-to-read-random-line-from-a-file\"\u003ehttps://stackoverflow.com/questions/448005/whats-an-easy-way-to-read-random-line-from-a-file\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"截取每行的前几个字符\"\u003e截取每行的前几个字符\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecut -c 1-3 file // 前三个字符\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eref: \u003ca href=\"https://stackoverflow.com/questions/19869511/how-to-restrict-length-of-string-present-in-a-line-using-linux\"\u003ehttps://stackoverflow.com/questions/19869511/how-to-restrict-length-of-string-present-in-a-line-using-linux\u003c/a\u003e\u003c/p\u003e","title":"实用 shell"},{"content":"写在前面 如果你觉得这篇文章对你有所帮助，并且想要使用又拍云，可以通过我这个 -\u0026gt; 链接 \u0026lt;- 注册，你我都能得到 不要白不要的 奖励。（注意，又拍云绑定的域名需要是备案过的） 如果你已经有 CDN ，可以跳过 又拍云 部分，直接看插件配置部分。 本篇文章对所有 CDN 都适用，这里以 又拍云 为例子作说明 又拍云更香？ 上周在 V 站 发了个帖，安利了我写的一个 Alfred 插件，该插件可以方便地将图片上传到七牛云，顺便向大家安利了七牛。马上有 V 友跳出来说又拍云更香，免费流量比七牛云多 5 G，HTTPs CDN 流量也是算在免费套餐里边的。\n趁着周末有点时间，去白嫖下又拍云。\n又拍云联盟 没错。小标题 是 又拍云对开发者的白嫖活动的名字。我们加入这个联盟就能获得：\n10 GB 免费存储 每个月 15 GB 免费 CDN 流量（HTTP[s] 都可以） 流程很简单。注册账号、在你的网站页脚添加又拍云的链接；填申请表。我是周六申请的，1个小时左右就收到了审核通过的通知。\nUpdate(2022/12/02): 大家要留意一年的到期时间，快到期的时候去 联盟页面 申请续期。否则欠费就不好了，我就迟了几天，欠费 2 分钱 :)\n审核通过后，会发放一年份的代金券给你，到期再次申请即可。\nCDN 配置 系统设计 不想看我啰嗦的同学，可以跳过系统设计这部分。配置部分以 又拍云 为例子叙述\n从上图的设计可以看出，我把文件分为三类：\n动态接口/文件：例如 WordPress 中的 php 接口。这类请求是动态的，不适合放到 CDN 缓存中（一直回源，没有意义）。域名使用 foamzou.com ，该域名解析到我的服务器里，执行 WordPress 程序 适合短期缓存的文件：指的是短时间不会发生变化，但仍然有可能变化的文件。例如 WordPress 的系统库文件 域名使用：cdn.foamzou.com，该域名做个 cname 解析到 CDN 服务 当 CDN 未命中资源，则回源到 cdn.foamzou.com ( IP: 回源设置的 IP ) 适合长期缓存的文件：指的是几乎不会发生变化的资源文件。例如图片、第三方 css、js资源 域名配置同 2 给 CDN 配置一个对象存储桶 配置指定的路径从桶里取资源，没取到再回源到服务器 从服务器取到数据，存储到桶里 好处有 2 点 减少回源次数（毕竟对于同一个文件只会回源 1 次），节省服务器带宽 回源速度快（我在又拍云创建了个对象存储桶，CDN 和 存储 在同一个区域，速度当然比跨个公网访问我服务器快） 创建 CDN 服务 到 创建页面 ：\n加速域名：填一个新的域名，后面需要将该域名解析到 CDN 服务 源站设置 回源协议：我选了 HTTPS，如果你的源站点没有配置 SSL，就选 HTTP 吧。 源站地址：填你 WordPress 服务所在的域名。这里要注意，加速域名 和 源站地址 不能填同一个，否则就重定向循环了。 这里也可以填域名，为了方便，我填了 foamzou.com。这样 CDN 回源时会先将 foamzou.com 解析为 IP 再用来请求 cdn.foamzou.com。 这里又拍云产品设计得不好，容易让人误以为会回源到 foamzou.com，其实不是的。到时候会这样回源请求： curl -H\u0026quot;Host: 加速域名\u0026quot; http[s]://源站地址IP[或者 源站地址域名的IP]/xxx 也就是说，我还需要在我的 nginx 配置里的 server_name 多添加一个 cdn.foamzou.com 添加 CDN 域名解析 到 又拍云域名管理 页面，找到 cname 域名。然后到你的域名解析后台，添加一条 cname 记录。\n添加 SSL 证书 到 HTTPS tab，给你的域名添加一个 SSL 证书。你可以添加自有证书，也可以在又拍云申请一个免费证书。具体步骤这里就不赘述了，配合去域名解析添加个 TXT 记录就行。\n创建云存储 到这个 页面 创建服务。即，上边 方案设计 里的 Object Storage Bucket。我们期望将一般不会变化的资源放到这里。\n配置回源到 bucket 到 回源管理 页面，开启 源站资源迁移。\n资源路径，我填写了 /wp-content/* , /wp-includes/* 。我希望这两个路径的资源缓存到 bucket 里去。\nCDN 其他配置项 又拍云还有很多配置项，例如支持 webp 响应等，大伙自行摸索吧。\n至此，CDN 部分配置完毕。但此时面临一个问题，我们配置的 CDN 域名是 cdn.foamzou.com 。而此时 资源的域名是 foamzou.com。例如这张图片：emoji-bg-1.jpeg。\nWordPress 是否有插件，能够将指定路径的域名替换调呢？这样，我们可以通过 emoji-bg.jpeg 访问资源。有的，WP Super Cache！\n配置 WP Super Cache 插件 安装 到 官方下载页 下载插件，放到服务器 WordPress 目录下的 wp-content/plugins 目录里。解压它！\n确保 wp-content 目录的用户组是 www:www (以你实际 php-fpm 用户组为准)，目录权限设置为 755 。确保 fpm 有权限写该目录。\n编辑 wp-config.php ，在最后一行的 require 上一行，加上\ndefine(\u0026#39;WP_CACHE\u0026#39;, true); define(\u0026#39;WPCACHEHOME\u0026#39;, \u0026#39;/your-site/wp-content/plugins/wp-super-cache/\u0026#39;); 拷贝文件\ncp wp-content/plugins/wp-super-cache/wp-cache-config-sample.php wp-content/wp-cache-config.php 到 WP 管理后台 - 插件管理，启用该插件。\n配置 WP 管理后台 - 设置页面，找到 WP Super Cache 设置 页面。\n启用缓存功能。注意每个 tab 都要点底下的 保存/更新 按钮\n开启 CDN 支持。该插件会将 包含目录 里 URL 的 Site URL 替换为 Off-site URL。\n最后 至此。 wp-content 和 wp-includes 底下的文件将走 CDN 加速。\n无论是 CDN 配置 还是 WP Super Cache 插件配置，都还有很多有趣的配置，本篇文章就不再多写了，毕竟我也今天刚配置。大伙自行摸索吧。\n欢迎留言交流。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/upyun-cdn-wordpress/","summary":"\u003ch2 id=\"写在前面\"\u003e写在前面\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e如果你觉得这篇文章对你有所帮助，并且想要使用又拍云，可以通过我这个 -\u0026gt; \u003ca href=\"https://console.upyun.com/register/?invite=SJpItuU_K\"\u003e链接\u003c/a\u003e \u0026lt;- 注册，你我都能得到 \u003ccode\u003e不要白不要的\u003c/code\u003e 奖励。（注意，又拍云绑定的域名需要是备案过的）\u003c/li\u003e\n\u003cli\u003e如果你已经有 CDN ，可以跳过 又拍云 部分，直接看插件配置部分。\u003c/li\u003e\n\u003cli\u003e本篇文章对所有 CDN 都适用，这里以 又拍云 为例子作说明\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"又拍云更香\"\u003e又拍云更香？\u003c/h2\u003e\n\u003cp\u003e上周在 V 站 发了个帖，安利了我写的一个 Alfred 插件，该插件可以方便地将图片上传到七牛云，顺便向大家安利了七牛。马上有 V 友跳出来说又拍云更香，免费流量比七牛云多 5 G，HTTPs CDN 流量也是算在免费套餐里边的。\u003c/p\u003e\n\u003cp\u003e趁着周末有点时间，去白嫖下又拍云。\u003c/p\u003e\n\u003ch2 id=\"又拍云联盟\"\u003e又拍云联盟\u003c/h2\u003e\n\u003cp\u003e没错。小标题 是 又拍云对开发者的白嫖活动的名字。我们加入这个联盟就能获得：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e10 GB 免费存储\u003c/li\u003e\n\u003cli\u003e每个月 15 GB 免费 CDN 流量（HTTP[s] 都可以）\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e流程很简单。注册账号、在你的网站页脚添加又拍云的链接；填申请表。我是周六申请的，1个小时左右就收到了审核通过的通知。\u003c/p\u003e\n\u003cp\u003eUpdate(2022/12/02): 大家要留意一年的到期时间，快到期的时候去 \u003ca href=\"https://www.upyun.com/league\"\u003e联盟页面\u003c/a\u003e 申请续期。否则欠费就不好了，我就迟了几天，欠费 2 分钱 :)\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/upyun-cdn-wordpress/image-3-1024x551.png\"\u003e\u003c/p\u003e\n\u003cp\u003e审核通过后，会发放一年份的代金券给你，到期再次申请即可。\u003c/p\u003e\n\u003ch2 id=\"cdn-配置\"\u003eCDN 配置\u003c/h2\u003e\n\u003ch3 id=\"系统设计\"\u003e系统设计\u003c/h3\u003e\n\u003cp\u003e不想看我啰嗦的同学，可以跳过系统设计这部分。配置部分以 又拍云 为例子叙述\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/upyun-cdn-wordpress/image-12-1024x585.png\"\u003e\u003c/p\u003e\n\u003cp\u003e从上图的设计可以看出，我把文件分为三类：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e动态接口/文件\u003c/strong\u003e：例如 WordPress 中的 php 接口。这类请求是动态的，不适合放到 CDN 缓存中（一直回源，没有意义）。域名使用 foamzou.com ，该域名解析到我的服务器里，执行 WordPress 程序\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e适合短期缓存的文件\u003c/strong\u003e：指的是短时间不会发生变化，但仍然有可能变化的文件。例如 WordPress 的系统库文件\n\u003cul\u003e\n\u003cli\u003e域名使用：cdn.foamzou.com，该域名做个 cname 解析到 CDN 服务\u003c/li\u003e\n\u003cli\u003e当 CDN 未命中资源，则回源到 cdn.foamzou.com ( IP: 回源设置的 IP )\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e适合长期缓存的文件\u003c/strong\u003e：指的是几乎不会发生变化的资源文件。例如图片、第三方 css、js资源\n\u003cul\u003e\n\u003cli\u003e域名配置同 2\u003c/li\u003e\n\u003cli\u003e给 CDN 配置一个对象存储桶\n\u003cul\u003e\n\u003cli\u003e配置指定的路径从桶里取资源，没取到再回源到服务器\u003c/li\u003e\n\u003cli\u003e从服务器取到数据，存储到桶里\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e好处有 2 点\n\u003col\u003e\n\u003cli\u003e减少回源次数（毕竟对于同一个文件只会回源 1 次），节省服务器带宽\u003c/li\u003e\n\u003cli\u003e回源速度快（我在又拍云创建了个对象存储桶，CDN 和 存储 在同一个区域，速度当然比跨个公网访问我服务器快）\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"创建-cdn-服务\"\u003e创建 CDN 服务\u003c/h3\u003e\n\u003cp\u003e到 \u003ca href=\"https://console.upyun.com/services/create/cdn/\"\u003e创建页面\u003c/a\u003e ：\u003c/p\u003e","title":"用 CDN 加速 WordPress"},{"content":"怎么可以这么慢 今天给我的博客加了 CDN ，绝大部分文件都很快被加载。唯独有一片 emoji 文件列表响应在 400+ ms，怎么能忍。\n官方的 emoji built-in 方案成了负担 貌似从 4.2 版本开始，WordPress 官方提供 emoji 的自支持方案。详细可查看 《WordPress 4.2 Emoji Performance》，这篇文章分析了官方方案的原理和弊端。\nWordPress 的 js 脚本会把 html 中的 emoji code 替换成 WordPress 站点的 emoji 图片。目的应该是为了让那些尚不支持 emoji 的网站能够正常展示 emoji。\n就我看来，这更多是自作多情了，毕竟现代浏览器还有多少是不支持 emoji 的？另外，这个方案是一刀切的，不管当前浏览器是否支持 emoji 都自动 fallback 到它的 build-in 方案。\n这给浏览器带来了额外的网络请求，增大了网页的加载速率。在一些无法很好访问 s.w.org 站点的地区，更是直接被暴击。\n不清楚 WordPress 后面的版本是否有做优化，anyway，让我们来干掉它吧。\n解决方案 方案一：直接禁用（推荐） 本博客采用了这个方案，因为我不需要照顾 不支持 emoji 的浏览器用户。\n下载这个插件（disable-emojis）, 上传到 /wp-content/plugins/ 目录下，解压。到你的 plugin 管理后台，启用它即可。\n世界瞬间清爽了，浏览器直接渲染 emoji ，再也不需要另外去请求网络获取图片文件。\n方案二：替换为本地文件 如果你的站点希望照顾到 不支持 emoji 的浏览器。\n那么请下载这个插件（Compressed-Emoji），同样上传之后，启用它。\n再套个 cdn，这可比官方源快多了。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/wordpress-emoji-s-w-org/","summary":"\u003ch2 id=\"怎么可以这么慢\"\u003e怎么可以这么慢\u003c/h2\u003e\n\u003cp\u003e今天给我的博客加了 CDN ，绝大部分文件都很快被加载。唯独有一片 emoji 文件列表响应在 400+ ms，怎么能忍。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/wordpress-emoji-s-w-org/image-1.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"官方的-emoji-built-in-方案成了负担\"\u003e官方的 emoji built-in 方案成了负担\u003c/h2\u003e\n\u003cp\u003e貌似从 4.2 版本开始，WordPress 官方提供 emoji 的自支持方案。详细可查看 《\u003ca href=\"https://facetwp.com/wordpress-4-2-emoji-performance/\"\u003eWordPress 4.2 Emoji Performance\u003c/a\u003e》，这篇文章分析了官方方案的原理和弊端。\u003c/p\u003e\n\u003cp\u003eWordPress 的 js 脚本会把 html 中的 emoji code 替换成 WordPress 站点的 emoji 图片。目的应该是为了让那些尚不支持 emoji 的网站能够正常展示 emoji。\u003c/p\u003e\n\u003cp\u003e就我看来，这更多是自作多情了，毕竟现代浏览器还有多少是不支持 emoji 的？另外，这个方案是一刀切的，不管当前浏览器是否支持 emoji 都自动 fallback 到它的 build-in 方案。\u003c/p\u003e\n\u003cp\u003e这给浏览器带来了额外的网络请求，增大了网页的加载速率。在一些无法很好访问 s.w.org 站点的地区，更是直接被暴击。\u003c/p\u003e\n\u003cp\u003e不清楚 WordPress 后面的版本是否有做优化，anyway，让我们来干掉它吧。\u003c/p\u003e\n\u003ch2 id=\"解决方案\"\u003e解决方案\u003c/h2\u003e\n\u003ch3 id=\"方案一直接禁用推荐\"\u003e方案一：直接禁用（推荐）\u003c/h3\u003e\n\u003cp\u003e本博客采用了这个方案，因为我不需要照顾 不支持 emoji 的浏览器用户。\u003c/p\u003e\n\u003cp\u003e下载这个插件（\u003ca href=\"https://wordpress.org/plugins/disable-emojis/\"\u003edisable-emojis\u003c/a\u003e）, 上传到 \u003ccode\u003e/wp-content/plugins/\u003c/code\u003e 目录下，解压。到你的 plugin 管理后台，启用它即可。\u003c/p\u003e\n\u003cp\u003e世界瞬间清爽了，浏览器直接渲染 emoji ，再也不需要另外去请求网络获取图片文件。\u003c/p\u003e\n\u003ch3 id=\"方案二替换为本地文件\"\u003e方案二：替换为本地文件\u003c/h3\u003e\n\u003cp\u003e如果你的站点希望照顾到 不支持 emoji 的浏览器。\u003c/p\u003e","title":"优化 WordPress emoji (s.w.org) 速度"},{"content":"背景 一年前我写过《使用 CloudFlare/百度云加速做免费SSL》，里面提到了：因为 Chrome 的最新安全限制， https 站点无法正常加载 http 的图片和其他静态资源，这使得我不得不给我的图床加上 SSL。\n前几天发现我的博客里的图片无法被正常加载，观察控制台后发现 图床的 SSL 证书出问题了。到百度云加速控制台看，才发现上次申请的一年 SSL 证书已经到期了，并且需要付费才能继续申请证书。好吧，白嫖的快乐没有了。\n那就不用百度云加速了，SSL CDN 也用七牛云的吧。\n七牛云 前提：你需要有一个已备案的域名，否则只能使用七牛的临时测试域名，是有有效期的\n免费套餐 从 2016 年白嫖七牛云存储至今，本文就当做给七牛打回广告吧。\n先说结论：\n如果你只用 http 访问文件，每个月不超过 10G 流量的话，那么用七牛云相当于白嫖，一分钱都不用花 如果需要使用 https 则需要花费一些费用（0.28 元/GB），一般博客小站，每个月最多不超过 1 块钱吧。等过段时间，我有了一定数据再回来更新这个数值。 对于个人用户来说，有 10G 的免费存储，每个月 10G 的流量已经非常足够了。具体的资费可以参看 官网价格 。PS. 从价格表会看到 外网流出流量 会被收费，这点不用担心，我专门查了下官方说明：\n如果使用了七牛测试域名或者融合 CDN 域名访问资源，是不会计算外网流出流量的\n也就是说，你绑定一个域名回源到七牛云的对象存储，每个月不超过 10G 则不收费。\n创建一个 bucket 在七牛云对象存储 管理后台，创建一个bucket:\n存储区域选国内的都行；访问控制设置为公开，毕竟我们要将其用作图床\n绑定域名 创建成功后，会提示你绑定一个域名。该域名将作为 CDN 域名，通过该域名访问你的文件时，会尝试在 CDN 节点找缓存；缓存未命中再回源到你上边创建的 bucket。\n我们添加一个域名，该域名必须是经过备案的。\n通信协议：如果你不需要 HTTPS，那么选择 HTTP 就足够了\n配置 SSL 证书 如果我们期望使用 HTTPS 访问文件，那么需要将通信协议设置为 HTTPS 。页面会引导我们跳到 证书管理页面。\n七牛云允许我们 购买证书 或者 上传自有证书。但我发现，购买证书这个 tab 里边包含免费证书。所以我选择了它。\n接下来点击创建订单后，会引导我们跳到证书信息补充页面.\n域名: 填写你期望绑定的 cdn 域名，例如我上边的 file.foamzou.com。 证书备注名：随便填 域名所有权验证方式：我选的 DNS 验证 公司和联系人信息：都是必填，由于我没有公司，就公司信息就瞎填了，没有关系的。但个人信息最好填自己的，或者真实格式的，否则可能无法通过。 最后点提交，会提示补齐信息成功。接下来需要我们配置 DNS 解析以证明该域名是我们的。\n我们到自己的域名管理后台新增一个 TXT 解析即可：\n过几分钟后，点击 检测验证结果 的按钮，通过就 ok\n配置 CDN 域名解析 不管选择的是 HTTP 还是 HTTPS 都要完成这步操作。将我们的域名做个 CNAME 解析到七牛云的服务器域名。\n访问七牛 CDN 域名管理页面，选择你的域名。点击进去可以看到七牛的 CNAME 域名\n到我们域名的管理后台，新增一条 CNAME 记录，解析到该域名\n至此，所有配置都完成了。\n使用图床 在管理后台上传文件 在七牛云管理后台，打开你的 bucket 页面。从 overview 可以看到该桶的一些统计数据。\n点击 文件管理，可以直接上传文件到桶，然后你就可以用域名访问啦。但每次都通过这种途径上传文件，是很麻烦的。\nAlfred 插件上传文件 我个人的习惯是：截图，上传到图床，将图床链接插入到博客使用。\n为了方便将其自动化，我两年前写过一个 Alfred 插件，可以通过以下两种途径上传文件：\n截图后，用户触发组合键，上传到七牛云 选中文件（支持多个文件），用户触发组合键，上传到七牛云 但有时截图的体积比较大，所以昨天稍微有点空，加上了压缩的功能：本地压缩之后再上传。\n有需要的朋友可以用用。\n其他上传方式 官方应该有提供方便的 GUI 工具。各种博客应该也有提供一些插件来帮助用户自动上传文件到桶，例如 WordPress 的 WP-QINIU 插件。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/image-hosted-service-qiniu/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e一年前我写过\u003ca href=\"/posts/use-cloudflare-as-free-ssl/\"\u003e《使用 CloudFlare/百度云加速做免费SSL》\u003c/a\u003e，里面提到了：因为 Chrome 的最新安全限制， https 站点无法正常加载 http 的图片和其他静态资源，这使得我不得不给我的图床加上 SSL。\u003c/p\u003e\n\u003cp\u003e前几天发现我的博客里的图片无法被正常加载，观察控制台后发现 图床的 SSL 证书出问题了。到百度云加速控制台看，才发现上次申请的一年 SSL 证书已经到期了，并且需要付费才能继续申请证书。好吧，白嫖的快乐没有了。\u003c/p\u003e\n\u003cp\u003e那就不用百度云加速了，SSL CDN 也用七牛云的吧。\u003c/p\u003e\n\u003ch2 id=\"七牛云\"\u003e七牛云\u003c/h2\u003e\n\u003cp\u003e前提：你需要有一个已备案的域名，否则只能使用七牛的临时测试域名，是有有效期的\u003c/p\u003e\n\u003ch3 id=\"免费套餐\"\u003e免费套餐\u003c/h3\u003e\n\u003cp\u003e从 2016 年白嫖七牛云存储至今，本文就当做给七牛打回广告吧。\u003c/p\u003e\n\u003cp\u003e先说结论：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e如果你只用 http 访问文件，每个月不超过 10G 流量的话，那么用七牛云相当于白嫖，一分钱都不用花\u003c/li\u003e\n\u003cli\u003e如果需要使用 https 则需要花费一些费用（0.28 元/GB），一般博客小站，每个月最多不超过 1 块钱吧。等过段时间，我有了一定数据再回来更新这个数值。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e对于个人用户来说，有 10G 的免费存储，每个月 10G 的流量已经非常足够了。具体的资费可以参看 \u003ca href=\"https://www.qiniu.com/prices/kodo\"\u003e官网价格\u003c/a\u003e 。PS. 从价格表会看到 外网流出流量 会被收费，这点不用担心，我专门查了下官方说明：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e如果使用了七牛测试域名或者融合 CDN 域名访问资源，是\u003cstrong\u003e不会计算\u003c/strong\u003e外网流出流量的\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e也就是说，你绑定一个域名回源到七牛云的对象存储，每个月不超过 10G 则不收费。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/image-hosted-service-qiniu/1a6c9eaa-29ba-4825-83a1-3f84b1ab2af5.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"创建一个-bucket\"\u003e创建一个 bucket\u003c/h3\u003e\n\u003cp\u003e在七牛云对象存储 \u003ca href=\"https://portal.qiniu.com/kodo/bucket\"\u003e管理后台\u003c/a\u003e，创建一个bucket:\u003c/p\u003e\n\u003cp\u003e存储区域选国内的都行；访问控制设置为公开，毕竟我们要将其用作图床\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/image-hosted-service-qiniu/0709db48-91dc-4281-931a-8150a13ed532.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"绑定域名\"\u003e绑定域名\u003c/h3\u003e\n\u003cp\u003e创建成功后，会提示你绑定一个域名。该域名将作为 CDN 域名，通过该域名访问你的文件时，会尝试在 CDN 节点找缓存；缓存未命中再回源到你上边创建的 bucket。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/image-hosted-service-qiniu/7dee1fc0-919a-4437-9418-7580674b6ad8.png\"\u003e\u003c/p\u003e\n\u003cp\u003e我们添加一个域名，该域名必须是经过备案的。\u003c/p\u003e\n\u003cp\u003e通信协议：如果你不需要 HTTPS，那么选择 HTTP 就足够了\u003c/p\u003e","title":"用七牛云作图床并配置 SSL"},{"content":"引子 前几天 v 站有个帖子《V 友们有没有写日记的习惯？》，大家有在上边回帖，我也有表达一些自己的观点。\n回帖的大概有以下几类同学：\nJust 发个梗，“正经人谁写日记啊” 没有坚持下去的，“日记写着写着，变成了周记，，慢慢变成了月记，然后就是年记，，最后成了回忆” 认为没有必要的，“主要是大多人的生活全都两点一线，没有必要记录” 也有在坚持写的，“重要事情会写 三四年写满了好多的笔记本 有时候回头看看 真不错” 我\u0026amp;日记 我为什么写日记 先点一下题，我之所以写日记，是想要用文字记录我的生活以及当时的所思所想。这样，我可以在很多年以后，翻过来看看当时的我在做些什么，想些什么。实在是很有趣的。就像我翻以前 qq 空间的说说一样，虽然觉得有些很 SB，但同时也觉得挺可爱的。但我也有看过有人因为过去过于幼稚，想把过去的说说删掉。这类同学可能就不太适合写日记吧。\n我属于坚持在写日记的那部分群体，从2013年12月13日开始到现在，写了快 8 年了。从有道云笔记到为知笔记，从大二到六年社会人。 偶尔流水账碎碎念，偶尔思考未来感叹人生；有时洋洋洒洒 1 千字，有时寥寥几个字: 今天好忙。 我写日记纯粹是为了记录自己的生活与当时的所思所想。 若我喜欢，我可以翻到过去的某一天，看看我又做了什么得意的，有趣的，无聊的，愚蠢的事。 也可以回忆起，大学去哪几个省参加比赛，顺道看了熊猫当做旅游；和朋友们去 hk 爬山，带车厘子被海关抓包；跟风玩起了费鞋的一起来捉妖；有个同事中了彩票一等奖，大家纷纷买起了彩票；娱乐圈谁谁谁又出事了，感叹贵圈真乱。 若干年后，我已经忘记的事情还有地方能够记起，真好。\nPS. 有同学对于日记的第一印象是秘密日记，其实大部分不是在写秘密啦，哪有那么多秘密写，我们又不是朱朝阳。\n缘起 今天开始使用有道云笔记来记录我的日记。记得以前从来没有写过自己内心的日记。除了以前老师布置的作业——官方日记。好的，从今天开始，想起来就会来这里写写。没有什么排版风格。只要不写错字就OK，标点符号什么的，随意啦~~~狂写~~走起！！！！\n上边是我2013年12月13日写的第一篇日记的开头。具体的缘由已经不记得了，我当时竟然没有记录下来。隐约记得当时是在知乎上看到某个关于日记的回答，大致是说，想写什么就写什么，不需要有任何拘束。嗯，然后我就尝试着坚持写了。\n如何把日记进行下去 管它什么内容，先写再说 兄弟们，`不要有任何拘束 这个很重要，是坚持写日记的重要观念。这意味着无论是内容，还是形式上都可以随心所欲。\n举个🌰，你觉得今天啥事也没做，上班下班累死了，写日记也不知道写啥，玩会手机就准备睡觉吧。此时，其实你可以在今天的日记里写，“今天啥事也没做，上班下班累死了，写日记也不知道写啥，玩会手机就准备睡觉吧”。\nWhat the hell, 你可能会想这样有什么意义。其实还真有意义，第一层意义，未来的你知道那天你过得很无聊，又是日常的一天。更重要的是，这可以让你坚持写日记。因为大部分人的每一天大概率是三点一线，周而复始的。当你在判断今天该不该写日记的时候，很有可能就是不值得写，因为在你看来，今天又是上班下班，稀疏平常的一天，等真正发生有意思的事情再写吧。拜托，等到那个时候，我猜你也不会写的，因为写日记这件事对你来说太麻烦了。\n所以，哪怕今天很平常，也可以敲下几个字，“今天又是平常的一天”。这样做的目的其实是在强迫你对今天进行一个回忆和思考。你总不可能每天打开日记本就写一样的话吧，哈哈。当然，你累了的时候，也可以今天的日记就写一个字，“累”。这也是我上边提到的，不要在意内容写得怎么样。偶尔偷下懒还是可以的。\n最后再点下小标题。很多朋友在写日记，开始下笔时想到今天发生的事情，不会马上写下来，而是会先构思整个叙事框架。这个无形中会带来记录成本，我个人推崇的是，想到哪写到哪，咱写日记又不是为了锻炼文笔和语言组织能力，纯粹记录而已。当然，偶尔哪天想要写正式点也是可以的，随你啦，开心就好。\n补日记 说实话，我写了这么多年，也并没有做到把 “写日记” 变成一个习惯（那些说坚持 21天、3个月做一件事就能成为习惯的真是瞎说），我到现在偶尔还是会抗拒、懒得写日记。可能有些朋友会比较诧异，坚持了这么多年的事，难道不是像喝水那么简单吗？还真不是，就是这么真实。\n所以，我偶尔也会有偷懒的时候，今天太累可能就不写了。但我会在第二天或过几天把今天的日记给补上，这也算是一种休息、缓冲的方式。给自己一个暗示，能够补回去的就不算断。\n但是，拖更的天数不能太长，一旦中断的时间超出一定阈值，这件事就真这么断了。所以我一般不会超过3天。\n片段记录 一天中发生的事，到晚上记录时总会有想不起来的时候，哪怕这件事你当时觉得非常有趣，晚上一定要记录下来。\n因此，当发生有趣的事时，你可以先把它记录下来。例如拍个照片，或者在备忘录、微信文件传输助手等地方简单写一些关键字。这样，你在记录的时候，就可以捡起这些片段了。\n如果你也想写日记 很多朋友有时候会冒出想记录生活的想法，发朋友圈、拍照无疑也是记录的一种方式，但我们记录的内容有一些是不太方便给到他人去看的，此时写日记就是比较方便的形式啦。\n日记的载体，我个人推荐云笔记（方便电脑 /手机都可以写），最好带有加密功能。 实体的本子的确比较有 feel，但在存储、记录方面还是比较麻烦。\n最后，行动起来吧，非常有趣。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/about-my-diary/","summary":"\u003ch2 id=\"引子\"\u003e引子\u003c/h2\u003e\n\u003cp\u003e前几天 v 站有个帖子\u003ca href=\"https://www.v2ex.com/t/800970\"\u003e《V 友们有没有写日记的习惯？》\u003c/a\u003e，大家有在上边回帖，我也有表达一些自己的观点。\u003c/p\u003e\n\u003cp\u003e回帖的大概有以下几类同学：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eJust 发个梗，“正经人谁写日记啊”\u003c/li\u003e\n\u003cli\u003e没有坚持下去的，“日记写着写着，变成了周记，，慢慢变成了月记，然后就是年记，，最后成了回忆”\u003c/li\u003e\n\u003cli\u003e认为没有必要的，“主要是大多人的生活全都两点一线，没有必要记录”\u003c/li\u003e\n\u003cli\u003e也有在坚持写的，“重要事情会写 三四年写满了好多的笔记本 有时候回头看看 真不错”\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"我日记\"\u003e我\u0026amp;日记\u003c/h2\u003e\n\u003ch3 id=\"我为什么写日记\"\u003e我为什么写日记\u003c/h3\u003e\n\u003cp\u003e先点一下题，我之所以写日记，是想要用文字记录我的生活以及当时的所思所想。这样，我可以在很多年以后，翻过来看看当时的我在做些什么，想些什么。实在是很\u003cstrong\u003e有趣\u003c/strong\u003e的。就像我翻以前 qq 空间的说说一样，虽然觉得有些很 SB，但同时也觉得挺可爱的。但我也有看过有人因为过去过于幼稚，想把过去的说说删掉。这类同学可能就不太适合写日记吧。\u003c/p\u003e\n\u003cp\u003e我属于坚持在写日记的那部分群体，从2013年12月13日开始到现在，写了快 8 年了。从有道云笔记到为知笔记，从大二到六年社会人。 偶尔流水账碎碎念，偶尔思考未来感叹人生；有时洋洋洒洒 1 千字，有时寥寥几个字: 今天好忙。 我写日记纯粹是为了记录自己的生活与当时的所思所想。 若我喜欢，我可以翻到过去的某一天，看看我又做了什么得意的，有趣的，无聊的，愚蠢的事。 也可以回忆起，大学去哪几个省参加比赛，顺道看了熊猫当做旅游；和朋友们去 hk 爬山，带车厘子被海关抓包；跟风玩起了费鞋的一起来捉妖；有个同事中了彩票一等奖，大家纷纷买起了彩票；娱乐圈谁谁谁又出事了，感叹贵圈真乱。 若干年后，我已经忘记的事情还有地方能够记起，真好。\u003c/p\u003e\n\u003cp\u003ePS. 有同学对于日记的第一印象是秘密日记，其实大部分不是在写秘密啦，哪有那么多秘密写，我们又不是朱朝阳。\u003c/p\u003e\n\u003ch3 id=\"缘起\"\u003e缘起\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003cp\u003e今天开始使用有道云笔记来记录我的日记。记得以前从来没有写过自己内心的日记。除了以前老师布置的作业——官方日记。好的，从今天开始，想起来就会来这里写写。没有什么排版风格。只要不写错字就OK，标点符号什么的，随意啦~~~狂写~~走起！！！！\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e上边是我2013年12月13日写的第一篇日记的开头。具体的缘由已经不记得了，我当时竟然没有记录下来。隐约记得当时是在知乎上看到某个关于日记的回答，大致是说，想写什么就写什么，不需要有任何拘束。嗯，然后我就尝试着坚持写了。\u003c/p\u003e\n\u003ch2 id=\"如何把日记进行下去\"\u003e如何把日记进行下去\u003c/h2\u003e\n\u003ch3 id=\"管它什么内容先写再说\"\u003e管它什么内容，先写再说\u003c/h3\u003e\n\u003cp\u003e兄弟们，`\u003ccode\u003e不要有任何拘束\u003c/code\u003e 这个很重要，是坚持写日记的重要观念。这意味着无论是内容，还是形式上都可以随心所欲。\u003c/p\u003e\n\u003cp\u003e举个🌰，你觉得今天啥事也没做，上班下班累死了，写日记也不知道写啥，玩会手机就准备睡觉吧。此时，其实你可以在今天的日记里写，“今天啥事也没做，上班下班累死了，写日记也不知道写啥，玩会手机就准备睡觉吧”。\u003c/p\u003e\n\u003cp\u003eWhat the hell, 你可能会想这样有什么意义。其实还真有意义，第一层意义，未来的你知道那天你过得很无聊，又是日常的一天。更重要的是，这可以让你坚持写日记。因为大部分人的每一天大概率是三点一线，周而复始的。当你在判断今天该不该写日记的时候，很有可能就是不值得写，因为在你看来，今天又是上班下班，稀疏平常的一天，等真正发生有意思的事情再写吧。拜托，等到那个时候，我猜你也不会写的，因为写日记这件事对你来说太麻烦了。\u003c/p\u003e\n\u003cp\u003e所以，哪怕今天很平常，也可以敲下几个字，“今天又是平常的一天”。这样做的目的其实是在强迫你对今天进行一个回忆和思考。你总不可能每天打开日记本就写一样的话吧，哈哈。当然，你累了的时候，也可以今天的日记就写一个字，“累”。这也是我上边提到的，不要在意内容写得怎么样。偶尔偷下懒还是可以的。\u003c/p\u003e\n\u003cp\u003e最后再点下小标题。很多朋友在写日记，开始下笔时想到今天发生的事情，不会马上写下来，而是会先构思整个叙事框架。这个无形中会带来记录成本，我个人推崇的是，想到哪写到哪，咱写日记又不是为了锻炼文笔和语言组织能力，纯粹记录而已。当然，偶尔哪天想要写正式点也是可以的，随你啦，开心就好。\u003c/p\u003e\n\u003ch3 id=\"补日记\"\u003e补日记\u003c/h3\u003e\n\u003cp\u003e说实话，我写了这么多年，也并没有做到把 “写日记” 变成一个习惯（那些说坚持 21天、3个月做一件事就能成为习惯的真是瞎说），我到现在偶尔还是会抗拒、懒得写日记。可能有些朋友会比较诧异，坚持了这么多年的事，难道不是像喝水那么简单吗？还真不是，就是这么真实。\u003c/p\u003e\n\u003cp\u003e所以，我偶尔也会有偷懒的时候，今天太累可能就不写了。但我会在第二天或过几天把今天的日记给补上，这也算是一种休息、缓冲的方式。给自己一个暗示，能够补回去的就不算断。\u003c/p\u003e\n\u003cp\u003e但是，拖更的天数不能太长，一旦中断的时间超出一定阈值，这件事就真这么断了。所以我一般不会超过3天。\u003c/p\u003e\n\u003ch3 id=\"片段记录\"\u003e片段记录\u003c/h3\u003e\n\u003cp\u003e一天中发生的事，到晚上记录时总会有想不起来的时候，哪怕这件事你当时觉得非常有趣，晚上一定要记录下来。\u003c/p\u003e\n\u003cp\u003e因此，当发生有趣的事时，你可以先把它记录下来。例如拍个照片，或者在备忘录、微信文件传输助手等地方简单写一些关键字。这样，你在记录的时候，就可以捡起这些片段了。\u003c/p\u003e\n\u003ch2 id=\"如果你也想写日记\"\u003e如果你也想写日记\u003c/h2\u003e\n\u003cp\u003e很多朋友有时候会冒出想记录生活的想法，发朋友圈、拍照无疑也是记录的一种方式，但我们记录的内容有一些是不太方便给到他人去看的，此时写日记就是比较方便的形式啦。\u003c/p\u003e\n\u003cp\u003e日记的载体，我个人推荐云笔记（方便电脑 /手机都可以写），最好带有加密功能。 实体的本子的确比较有 feel，但在存储、记录方面还是比较麻烦。\u003c/p\u003e\n\u003cp\u003e最后，行动起来吧，非常有趣。\u003c/p\u003e","title":"我为什么写日记"},{"content":" 个人喜好悬疑、惊悚剧情片，不看恐怖片，因为不敢看🙈；偶尔看些温情治愈片；不太喜欢喜剧和无厘头。 这里记录下我喜欢的电视剧（📺）和电影（🎬）及其他影视作品\n本文简介慢慢补，尽可能不涉及剧透\n评分为个人喜好标准（满分5分），不会参考豆瓣这类评分网站\n同一部影视，分类会有多个，这里只会为其选择一个最贴切的。例如 釜山行 属于灾难、惊悚、丧尸题材，我会将其归类到丧尸，同时打上灾难、惊悚的标签（也可能不打😁）\nTODO 秘密森林[韩剧] 剧情 寄生虫 4.6分。纯剧情片，这里的寄生虫不是指怪物（别害怕），情节相当有意思。\n美丽心灵 3.6分。#精神分裂# 的数学天才，男主也是幸运，有这样不离不弃的妻子\n网络迷踪 4.2分。男主是程序员吧？这清晰、缜密的思维\n九回时间旅行（韩剧 📺） 4.6分。与信号有同工异曲之妙，但没有那么悬疑，偏一点偶像剧的感觉，放在剧情分类吧。蝴蝶效应题材的电视剧，因为过去有些遗憾，想要回去改变，怎知带来更大的变数。只能强忍痛苦再次回到过去。是 HE 放心，值得一看\n非自然死亡（日剧 📺）4.3分。法医、小案件。剧集比较短，日剧就是很多哲理。石原里美在这部剧挺好看的\n绝命毒师（美剧 📺 ）4.2分。有好几季，剧情不拖沓。一个身患绝症的化学老师竟成为大毒枭，离初衷渐行渐远。\n黑客帝国系列 4.2分。经典片，世界观构思很好。我自己看来剧情稍显乏味\n恐怖直播 3.8分。这里的恐怖指的是恐怖袭击，非恐怖片。算是谈判片吧，带有韩国电影特有的社会批判意义\n本杰明巴顿奇事 3.4分。男主的生理成长是反过来的，出生是老人，慢慢变成中年，青年，婴儿。对我来说，影片风格比较怪诞。但故事设计有点意思。\n无间道 4.4分。看第一部就好了，很经典，剧情不老套，现在看来还是挺优秀的电影。\n天才枪手 4.5分。讲作弊的故事，故事情节紧凑，毫不拖沓。值得一看\n头文字D 4.5分。周杰伦颜值巅峰，AE86帅。\n楚门的世界 4.1分。很妙的构思，在那个年代就开始了。我们真实的世界又是什么样的呢。\n科幻 源代码 3.9分。\n星际穿越 3.7分。\n我，机器人 4.0分。\n盗梦空间 4.1分。\n悬疑 信号（韩剧 📺）4.7分。道具有点老套，使用无线电通讯器，连通过去和现在的时空。但情节很不错，包含了韩国几个经典案件。\n窥探（韩剧 📺）4.8分。这几年的韩剧真是很不错，这一部是近几年看过最优秀的悬疑剧集。第一集可能稍显枯燥，后面就完全铺开了\n鱿鱼游戏（韩剧Netflix 📺）4.0分。大逃杀类型的电视剧，一群人因为金钱自愿去参加这个游戏，最后当然是几乎都死光了。挺老套的模式，不知道为什么宣传得这么好，竟然比上边两个优秀影视还🔥。有点郁闷\n禁闭岛 4.2分。不打标签了，避免剧透。小李子演的很好\n记忆裂痕 3.8分。可以当悬疑动作片看\n人生切割术（Severance）（美剧 📺） 4.5分。有没有想过有一种手术，可以将你的记忆一分为二，踏入工作区是一个你，离开工作区是另一个你，同一个人两份不同的记忆。这个设定还是非常巧妙的，我觉得在人性就有很多可以拍的故事。果然，人类是不能做到完全的感同身受的，即使对方是拥有另一个记忆的你。可惜最后一集在高潮的时候戛然而止了。等待第二季 ~ 对了，影片片头太赞了\n记忆碎片\n七宗罪\n致命魔术\n我是谁：没有绝对安全的系统\n解除好友2\n蝴蝶效应系列\n消失的爱人 #西班牙#\n看不见的客人 #西班牙#\n黑暗面 #西班牙#\n海市蜃楼 #西班牙#\n误杀瞒天记 4.7分。非常精彩的印度片，墙裂推荐，男主牛逼\n调音师 4.5分。也是反转不断的印度片\n杀人回忆\n杀人者的记忆法\n64号病历\n循环/时空 恐怖游轮\n土拨鼠之日 4.0分。设定很有趣，每天醒来又是重复的一天，即使年代有点久了，但看着男主每天醒来，用不同的方式演绎同样的一天还是挺有趣\n彗星来的那一夜 #平行时空#\n忌日快乐\n明日边缘\n前目的地\n开端（📺 2021年国产剧） 4.7分。正午阳光出品。不管是演员还是编剧，都太优秀了。发生在公交车上的循环悬疑剧，不剧透了。可以透露下，是 HE。\n惊悚 致命ID\n灵异第六感\n异次元杀阵（心慌方/cube）\n逃出绝命镇\n万能钥匙\n孤儿怨\n当你熟睡\n门锁\n目击者之追凶（中国台湾）\n1408幻影凶间\n追击者（韩国电影、结局太惨了）\n林中小屋\n侵入者（韩国电影） 4.1分。有种孤儿怨+寄生虫的感觉，不算很惊艳，但算是合格的悬疑惊悚片。或许是受限于片长，整个故事衔接得不是很流畅。\n灾难/末日 流感（致命感冒）\n迷雾\n雪国列车\n铁线虫入侵\n2012\n先知（神秘代码）\n丧尸/怪物 我是传奇\n釜山行 4.7分。最好看的丧尸片电影（之一？），挺感人的。看第一部就好，第二部很糟糕。\n僵尸校园（韩剧 📺）4.75分。强推，丧尸是釜山行的种类，人物形象饱满，情节紧凑刺激，引人入胜，太上头了。希望有第二部\n僵尸世界大战\n行尸走肉（美剧 📺）\n生化危机系列\n寄生兽（不算丧尸）\n惊变28周\n王国（韩剧 📺）\n甜蜜家园（韩剧 📺）\n寂静之地 4.2分。基础设定：不能说话，否则会把怪物吸引过来。两部都可以看看\n励志/温情/治愈 重启人生（日剧 📺）4.6分。主角魂穿到过去，努力把自己新的人生给过好，以及拯救好友，经历了 n 周目后，总算有了好的变化。整体来说这个剧很温暖，适合和家人、朋友一起看呢。\n肖申克的救赎\n请回答19xx（韩剧）\n心灵捕手\n不能说的秘密\n那些年我们一起追过的女孩\n我的野蛮女友\n当幸福来敲门\n风犬少年的天空（电视剧）\n你的名字\n番剧 间谍过家家 4.5分。各自隐瞒身份的临时一家人，女鹅是超能力者，父亲是间谍，母亲是杀手。温馨、可爱、搞笑。值得一看\n死亡笔记 4.2分。少年间的智斗是非常精彩的，可惜作者给主角的行为塑造得过于极端，太可惜了，否则这部作品能更封神。我给本作品没有打高分也是因为如此。\n国产剧 琅琊榜 4.7分。前面几集有点枯燥，耐心看下去就是新天地了。基督山伯爵类型的电视剧，梅长苏的智斗真的强\n伪装者 4.8分。琅琊榜原班人马出演。抗战时期背景下的特情斗争，人物形象相当饱满。近年来我最喜欢的国产剧\n反恐特战队之猎影 4.7分。军事反恐题材，里边的战斗特别精彩，人物形象也很饱满，无论是明面的特战队还是暗地的特情。里边我最喜欢的是陆豪，人中豪杰，智勇双全。对了，他说希望大家记得他不是陆豪，不是6号，他叫刘浩。\n唐朝诡事录 4.6分。2022年的惊喜。是狄仁杰的弟子探案的故事，里边每个故事都挺独立的，而且确实诡异，故事质量很高。人物诙谐幽默。结局的案子有点鸡尾就是了。强推。\n隐秘的角落\n沉默的真相\n御赐小仵作\nTVB 学警狙击\n潜行狙击\nEU超时空任务\n使徒行者\n护花危情\n僵\n心理追凶\n读心神探\n雷霆扫毒\n天与地：看完很沉重\n白色强人\n洗冤录\n寻秦记\n综艺 向往的生活 4.8分。很棒的综艺，看看嘉宾的世外桃源生活，挺惬意的。推荐看前几季就好，后面几季比较 boring\n乘风破浪的姐姐第一季\n非诚勿扰\n爸爸去哪儿（林志颖、吴尊两季）\n中国好声音（周杰伦）\n纪录片 体内怪物（可以当恐怖片或悬疑片看）\n舌尖上的中国\n终极工厂：可口可乐\n人生一串\n老广的味道\n","permalink":"https://blog-foamzou-com.pages.dev/posts/film-and-television/","summary":"\u003cblockquote\u003e\n\u003cp\u003e个人喜好悬疑、惊悚剧情片，不看恐怖片，因为不敢看🙈；偶尔看些温情治愈片；不太喜欢喜剧和无厘头。 这里记录下我喜欢的电视剧（📺）和电影（🎬）及其他影视作品\u003c/p\u003e\n\u003cp\u003e本文简介慢慢补，尽可能不涉及剧透\u003c/p\u003e\n\u003cp\u003e评分为个人喜好标准（满分5分），不会参考豆瓣这类评分网站\u003c/p\u003e\n\u003cp\u003e同一部影视，分类会有多个，这里只会为其选择一个最贴切的。例如 \u003ccode\u003e釜山行\u003c/code\u003e 属于灾难、惊悚、丧尸题材，我会将其归类到丧尸，同时打上灾难、惊悚的标签（也可能不打😁）\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"todo\"\u003eTODO\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e秘密森林[韩剧]\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"剧情\"\u003e剧情\u003c/h2\u003e\n\u003cp\u003e寄生虫 4.6分。纯剧情片，这里的寄生虫不是指怪物（别害怕），情节相当有意思。\u003c/p\u003e\n\u003cp\u003e美丽心灵 3.6分。#精神分裂# 的数学天才，男主也是幸运，有这样不离不弃的妻子\u003c/p\u003e\n\u003cp\u003e网络迷踪 4.2分。男主是程序员吧？这清晰、缜密的思维\u003c/p\u003e\n\u003cp\u003e九回时间旅行（韩剧 📺） 4.6分。与信号有同工异曲之妙，但没有那么悬疑，偏一点偶像剧的感觉，放在剧情分类吧。蝴蝶效应题材的电视剧，因为过去有些遗憾，想要回去改变，怎知带来更大的变数。只能强忍痛苦再次回到过去。是 HE 放心，值得一看\u003c/p\u003e\n\u003cp\u003e非自然死亡（日剧 📺）4.3分。法医、小案件。剧集比较短，日剧就是很多哲理。石原里美在这部剧挺好看的\u003c/p\u003e\n\u003cp\u003e绝命毒师（美剧 📺 ）4.2分。有好几季，剧情不拖沓。一个身患绝症的化学老师竟成为大毒枭，离初衷渐行渐远。\u003c/p\u003e\n\u003cp\u003e黑客帝国系列 4.2分。经典片，世界观构思很好。我自己看来剧情稍显乏味\u003c/p\u003e\n\u003cp\u003e恐怖直播 3.8分。这里的恐怖指的是恐怖袭击，非恐怖片。算是谈判片吧，带有韩国电影特有的社会批判意义\u003c/p\u003e\n\u003cp\u003e本杰明巴顿奇事 3.4分。男主的生理成长是反过来的，出生是老人，慢慢变成中年，青年，婴儿。对我来说，影片风格比较怪诞。但故事设计有点意思。\u003c/p\u003e\n\u003cp\u003e无间道 4.4分。看第一部就好了，很经典，剧情不老套，现在看来还是挺优秀的电影。\u003c/p\u003e\n\u003cp\u003e天才枪手 4.5分。讲作弊的故事，故事情节紧凑，毫不拖沓。值得一看\u003c/p\u003e\n\u003cp\u003e头文字D 4.5分。周杰伦颜值巅峰，AE86帅。\u003c/p\u003e\n\u003cp\u003e楚门的世界 4.1分。很妙的构思，在那个年代就开始了。我们真实的世界又是什么样的呢。\u003c/p\u003e\n\u003ch2 id=\"科幻\"\u003e科幻\u003c/h2\u003e\n\u003cp\u003e源代码 3.9分。\u003c/p\u003e\n\u003cp\u003e星际穿越 3.7分。\u003c/p\u003e\n\u003cp\u003e我，机器人 4.0分。\u003c/p\u003e\n\u003cp\u003e盗梦空间 4.1分。\u003c/p\u003e\n\u003ch2 id=\"悬疑\"\u003e悬疑\u003c/h2\u003e\n\u003cp\u003e信号（韩剧 📺）4.7分。道具有点老套，使用无线电通讯器，连通过去和现在的时空。但情节很不错，包含了韩国几个经典案件。\u003c/p\u003e\n\u003cp\u003e窥探（韩剧 📺）4.8分。这几年的韩剧真是很不错，这一部是近几年看过最优秀的悬疑剧集。第一集可能稍显枯燥，后面就完全铺开了\u003c/p\u003e\n\u003cp\u003e鱿鱼游戏（韩剧Netflix 📺）4.0分。大逃杀类型的电视剧，一群人因为金钱自愿去参加这个游戏，最后当然是几乎都死光了。挺老套的模式，不知道为什么宣传得这么好，竟然比上边两个优秀影视还🔥。有点郁闷\u003c/p\u003e\n\u003cp\u003e禁闭岛 4.2分。不打标签了，避免剧透。小李子演的很好\u003c/p\u003e\n\u003cp\u003e记忆裂痕 3.8分。可以当悬疑动作片看\u003c/p\u003e\n\u003cp\u003e人生切割术（Severance）（美剧 📺） 4.5分。有没有想过有一种手术，可以将你的记忆一分为二，踏入工作区是一个你，离开工作区是另一个你，同一个人两份不同的记忆。这个设定还是非常巧妙的，我觉得在人性就有很多可以拍的故事。果然，人类是不能做到完全的感同身受的，即使对方是拥有另一个记忆的你。可惜最后一集在高潮的时候戛然而止了。等待第二季 ~ 对了，影片片头太赞了\u003c/p\u003e\n\u003cp\u003e记忆碎片\u003c/p\u003e\n\u003cp\u003e七宗罪\u003c/p\u003e\n\u003cp\u003e致命魔术\u003c/p\u003e\n\u003cp\u003e我是谁：没有绝对安全的系统\u003c/p\u003e","title":"我喜欢的影视"},{"content":"广东政务服务网站上边可以找到我们身份证的照片，Let\u0026rsquo;s go！\n百度搜索“广东政务服务网”，或者直接访问 https://www.gdzwfw.gov.cn/\n点击右上角的登录，用粤省事登录最简单\n在首页找到【我的证照】\n选择【居民身份证】\n点击【查看数据】\n点击【数据】，在人像处右击鼠标，点另存为。记得保存的时候文件名加上 .jpg\n最后你可以拿着电子照片粘贴到文档，或者去照相馆打印纸质照片啦\n","permalink":"https://blog-foamzou-com.pages.dev/posts/get-idcard-epicture-in-guangdong/","summary":"\u003cp\u003e广东政务服务网站上边可以找到我们身份证的照片，Let\u0026rsquo;s go！\u003c/p\u003e\n\u003cp\u003e百度搜索“广东政务服务网”，或者直接访问 \u003ca href=\"https://www.gdzwfw.gov.cn/\"\u003ehttps://www.gdzwfw.gov.cn/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e点击右上角的登录，用粤省事登录最简单\u003c/p\u003e\n\u003cp\u003e在首页找到【我的证照】\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/get-idcard-epicture-in-guangdong/1f37b7f8-b3f6-45d6-b16b-05f9204af99e.png\"\u003e\u003c/p\u003e\n\u003cp\u003e选择【居民身份证】\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/get-idcard-epicture-in-guangdong/a4dc0c21-52e3-4f70-a622-7359a47743f9.png\"\u003e\u003c/p\u003e\n\u003cp\u003e点击【查看数据】\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/get-idcard-epicture-in-guangdong/image-3-1024x651.png\"\u003e\u003c/p\u003e\n\u003cp\u003e点击【数据】，在人像处右击鼠标，点另存为。记得保存的时候文件名加上 .jpg\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/get-idcard-epicture-in-guangdong/image-2-1024x938.png\"\u003e\u003c/p\u003e\n\u003cp\u003e最后你可以拿着电子照片粘贴到文档，或者去照相馆打印纸质照片啦\u003c/p\u003e","title":"\b（广东）获取身份证的照片电子档"},{"content":"背景 今天安装某个npm库，但是安装失败了。日志里看看到是安装leveldown包失败了，于是单独安装leveldown进行测试。\n问题排查 [duser@hy-docker02 tmp]$ npm i leveldown \u0026gt; leveldown@5.6.0 install /tmp/node_modules/leveldown \u0026gt; node-gyp-build make: Entering directory `/tmp/node_modules/leveldown/build\u0026#39; CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/builder.o cc1plus: error: unrecognized command line option \u0026#34;-std=gnu++1y\u0026#34; make: *** [Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/builder.o] Error 1 make: Leaving directory `/tmp/node_modules/leveldown/build\u0026#39; 从cc1plus: error: unrecognized command line option \u0026quot;-std=gnu++1y\u0026quot;可以看出是调用g++编译时使用了不支持的参数。\n因为另外有台机器（机器B）是可以将这个库安装成功的，所以我到那台机器执行 g++ -std=gnu++1y 1.c，但也是报一样的错误。并且这台机器的g++版本和我失败的那台是一致的，甚至操作系统版本也比较低。为什么机器B能够安装成功呢，一时想不出头绪来。\n到安装成功的node_module/leveldown/里看了下，有个prebuilds目录引起了我的注意，发现里边放了各主流平台的预编译好的文件。再结合README，里边说了，如果预编译好的文件不存在（应该还做了检查）才会 fallback to a compile step。\n这就能够解释为什么同样的g++版本，机器B能够成功安装了。大概就是机器B使用了预编译库，没有触发重新编译。\n从github下载源码，打算跟踪下为什么当前机器没有用预编译好的包。下载后发现package.json文件有个test-prebuild命令用于测试预编译包。于是先npm install先安装一些包，然后执行download-prebuilds把编译好的包先下载下来。\n[duser@hy-docker02 /tmp/foamzou/leveldown-master]$ npm run test-prebuild \u0026gt; leveldown@5.6.0 test-prebuild /tmp/foamzou/leveldown-master \u0026gt; cross-env PREBUILDS_ONLY=1 npm t \u0026gt; leveldown@5.6.0 test /tmp/foamzou/leveldown-master \u0026gt; standard \u0026amp;\u0026amp; (nyc -s tape test/*-test.js | faucet) \u0026amp;\u0026amp; nyc report standard: Node 10.12.0 or greater is required. `standard` did not run. module.js:664 return process.dlopen(module, path._makeLong(filename)); ^ Error: /lib64/libc.so.6: version `GLIBC_2.14\u0026#39; not found (required by /tmp/foamzou/leveldown-master/prebuilds/linux-x64/node.napi.glibc.node) at Object.Module._extensions..node (module.js:664:18) at Module.load (module.js:554:32) at tryModuleLoad (module.js:497:12) at Function.Module._load (module.js:489:3) at Module.require (module.js:579:17) at require (internal/module.js:11:18) at load (/tmp/foamzou/leveldown-master/node_modules/node-gyp-build/index.js:21:10) at Object.\u0026lt;anonymous\u0026gt; (/tmp/foamzou/leveldown-master/binding.js:2:153) at Module._compile (module.js:635:30) at Module.replacementCompile (/tmp/foamzou/leveldown-master/node_modules/append-transform/index.js:60:13) 然后发现上面这个GLIBC_2.14' not found，原来是glibc的问题。执行 strings /lib64/libc.so.6|grep GLIBC查看本机glibc版本，最高到GLIBC_2.12，而机器B是GLIBC_2.17。所以接下来升级glibc即可。由于是测试机器，并且版本更新不大，不是很担心升级后大量软件挂掉的问题。\n安装Glibc2.17 wget http://ftp.gnu.org/pub/gnu/glibc/glibc-2.17.tar.gz tar -zxvf glibc-2.17.tar.gz cd glibc-2.17 mkdir build cd build ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin make sudo make install 执行 strings /lib64/libc.so.6|grep GLIBC 。OK，看到2.17了\n问题解决 再次尝试 npm i leveldown，成功安装，至此问题解决。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/npm-install-leveldown-and-upgrade-glibc/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e今天安装某个npm库，但是安装失败了。日志里看看到是安装leveldown包失败了，于是单独安装leveldown进行测试。\u003c/p\u003e\n\u003ch2 id=\"问题排查\"\u003e问题排查\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[duser@hy-docker02 tmp]$ npm i leveldown\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; leveldown@5.6.0 install /tmp/node_modules/leveldown\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; node-gyp-build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emake: Entering directory `/tmp/node_modules/leveldown/build\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/builder.o\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecc1plus: error: unrecognized command line option \u0026#34;-std=gnu++1y\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emake: *** [Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/builder.o] Error 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emake: Leaving directory `/tmp/node_modules/leveldown/build\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e从\u003ccode\u003ecc1plus: error: unrecognized command line option \u0026quot;-std=gnu++1y\u0026quot;\u003c/code\u003e可以看出是调用g++编译时使用了不支持的参数。\u003c/p\u003e\n\u003cp\u003e因为另外有台机器（机器B）是可以将这个库安装成功的，所以我到那台机器执行 \u003ccode\u003eg++ -std=gnu++1y 1.c\u003c/code\u003e，但也是报一样的错误。并且这台机器的g++版本和我失败的那台是一致的，甚至操作系统版本也比较低。为什么机器B能够安装成功呢，一时想不出头绪来。\u003c/p\u003e\n\u003cp\u003e到安装成功的node_module/leveldown/里看了下，有个prebuilds目录引起了我的注意，发现里边放了各主流平台的预编译好的文件。再结合README，里边说了，如果预编译好的文件不存在（应该还做了检查）才会 \u003ccode\u003efallback to a compile step\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e这就能够解释为什么同样的g++版本，机器B能够成功安装了。大概就是机器B使用了预编译库，没有触发重新编译。\u003c/p\u003e\n\u003cp\u003e从github下载源码，打算跟踪下为什么当前机器没有用预编译好的包。下载后发现package.json文件有个\u003ccode\u003etest-prebuild\u003c/code\u003e命令用于测试预编译包。于是先npm install先安装一些包，然后执行\u003ccode\u003edownload-prebuilds\u003c/code\u003e把编译好的包先下载下来。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-mysql\" data-lang=\"mysql\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eduser\u003c/span\u003e\u003cspan class=\"o\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ehy\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edocker02\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003efoamzou\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eleveldown\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003emaster\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003enpm\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003etest\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eprebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eleveldown\u003c/span\u003e\u003cspan class=\"o\"\u003e@\u003c/span\u003e\u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003etest\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eprebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003efoamzou\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eleveldown\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003emaster\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecross\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eenv\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ePREBUILDS_ONLY\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003enpm\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eleveldown\u003c/span\u003e\u003cspan class=\"o\"\u003e@\u003c/span\u003e\u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003etest\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003efoamzou\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eleveldown\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003emaster\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003estandard\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enyc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003etape\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003etest\u003c/span\u003e\u003cspan class=\"cm\"\u003e/*-test.js | faucet) \u0026amp;\u0026amp; nyc report\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003estandard: Node 10.12.0 or greater is required. `standard` did not run.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003emodule.js:664\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e  return process.dlopen(module, path._makeLong(filename));\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e                 ^\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003eError: /lib64/libc.so.6: version `GLIBC_2.14\u0026#39; not found (required by /tmp/foamzou/leveldown-master/prebuilds/linux-x64/node.napi.glibc.node)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    at Object.Module._extensions..node (module.js:664:18)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    at Module.load (module.js:554:32)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    at tryModuleLoad (module.js:497:12)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    at Function.Module._load (module.js:489:3)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    at Module.require (module.js:579:17)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    at require (internal/module.js:11:18)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    at load (/tmp/foamzou/leveldown-master/node_modules/node-gyp-build/index.js:21:10)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    at Object.\u0026lt;anonymous\u0026gt; (/tmp/foamzou/leveldown-master/binding.js:2:153)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    at Module._compile (module.js:635:30)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    at Module.replacementCompile (/tmp/foamzou/leveldown-master/node_modules/append-transform/index.js:60:13)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后发现上面这个\u003ccode\u003eGLIBC_2.14' not found\u003c/code\u003e，原来是glibc的问题。执行 \u003ccode\u003estrings /lib64/libc.so.6|grep GLIBC\u003c/code\u003e查看本机glibc版本，最高到GLIBC_2.12，而机器B是GLIBC_2.17。所以接下来升级glibc即可。由于是测试机器，并且版本更新不大，不是很担心升级后大量软件挂掉的问题。\u003c/p\u003e","title":"npm包leveldown安装之升级Glibc"},{"content":"生活啥子时候给过我十八岁\n我奋力以赴的终点，还不如你的起点\n喜欢一个人的时候，哪个又不是烂命一条\n河里的虾和海里的虾能生活在一起吗\n我喜欢你！！是同学之间的喜欢，是同桌之间的喜欢，也是十七十八岁的时候真心实意的喜欢！！我喜欢你，那你呢？\n李安然，我喜欢你 ，不只是同桌之间的那种喜欢，不只是同学之间的那种喜欢，是十七十八岁的时候，那种真心实意的喜欢，我不管导演怎么拍，我也不管编剧怎么写，我不管你爸妈反对不反对，如果编剧这一季不让我们在一起，我就让他一直写一直写，总有一天，他会累的，我们一定会在一起。李安然，我们一定会在一起！\n小的时候 我以为大兴村的长梯 从头到尾就很远了 现在才知道,什么是真正的距离\n咪咪：狗哥 你难受啥子 你跟我们分享一下嘛 狗哥：安然说 我只是她的好朋友 咪咪：啥子哦 我听不懂啊 狗哥 狗哥：你听不懂很正常的 咪哥。这个事情好微妙 龟儿子考上大学了，我是涂家第一个大学生！！\n莫忘少年凌云志，曾许人间第一流\n今天，没请哭丧的，也没请主持人，涂夫是个屠夫和卖猪肉的，也是我老汉，他走的那天我就在他身边。那天下着雨，把我们两个都淋惨了，啊天我叫天天不应，叫地地不灵，周围一个人都没得，你们都晓得吧，屠夫好大一个，就背到他跑，一直跑一直跑，一直跑，跑了好久哦，好不容易跑到了医院了，结果因为失血过多，来不及抢救走了。我老汉是个嗨粗俗的人，没啥子素质，出口成脏，相信大家都记得吧。我告诉你们，他有很严重的脚气，有好严重呢，有一次啊，他把一个鞋子放到阳台上，风一吹，剩个屋头都毁了。我觉得他的死是因为他很财迷，有好财迷唉，连个几百块钱的小灵通都不舍得给我买，导致我在那一天找不到手机，打不了120，我父亲有好财迷呢，他，小的时候嘛，过年你们都有新礼物，我就跑回屋头问屠夫，我的新礼物呢？屠夫就告诉我，他说龟儿子老子早就给你准备好了，然后就把一个卖剩下的卤水猪头打到我身上，当时我就哭惨了嘛，然后他还赶快过来安慰我。他说龟儿子勒个好耍，嘞个好耍哎，耍累了可以直接吃，吃饱了接到耍嘛，他有的时候，还喜欢到家里洗猪肉，洗到满头是汗，然后，他就用洗猪肉的水在那里洗脸，更厉害的是你们根本就不晓得，他根本不得洗第二遍直接上床就睡觉了，好臭喔！今天来的，一定都是关心我老汉的亲朋好友，也都是我老汉在乎的人，我老汉走的时候跟我说啊，他说，我走之前就想看一哈身边朋友的笑脸，谢谢你们，让他如愿以偿\n他一定看得到，说不定那朵云就你是老汉儿\n老子好不容易开到七十迈，心情自由自在\n狗哥：诶 娇娇 怎么了 娇娇：想要考大学就要认真学习，不要讲些有的没的，靠嘴是靠不上大学的 狗哥：(抱拳)谢谢娇娇 咪咪：（拍桌而起）不对，我有梦想。（跑出门）主任，我的梦想就是陈圆圆\n这不是五十块钱的事。这是老子第一次的好运气，这都要从我身边梭过去\n刘闻钦。好久不见\n你现在过去，看到他，他不是会很尴尬。你不懂，你不懂。男人在外头那都是顶天立地。但是，他们也有很脆弱，很无助的一面。哎呀，你们钦哥也这个样子\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E9%A3%8E%E7%8A%AC%E5%B0%91%E5%B9%B4%E7%9A%84%E5%A4%A9%E7%A9%BA-%E5%96%9C%E6%AC%A2%E7%9A%84%E8%AF%AD%E5%BD%95/","summary":"\u003cp\u003e生活啥子时候给过我十八岁\u003c/p\u003e\n\u003cp\u003e我奋力以赴的终点，还不如你的起点\u003c/p\u003e\n\u003cp\u003e喜欢一个人的时候，哪个又不是烂命一条\u003c/p\u003e\n\u003cp\u003e河里的虾和海里的虾能生活在一起吗\u003c/p\u003e\n\u003cp\u003e我喜欢你！！是同学之间的喜欢，是同桌之间的喜欢，也是十七十八岁的时候真心实意的喜欢！！我喜欢你，那你呢？\u003c/p\u003e\n\u003cp\u003e李安然，我喜欢你 ，不只是同桌之间的那种喜欢，不只是同学之间的那种喜欢，是十七十八岁的时候，那种真心实意的喜欢，我不管导演怎么拍，我也不管编剧怎么写，我不管你爸妈反对不反对，如果编剧这一季不让我们在一起，我就让他一直写一直写，总有一天，他会累的，我们一定会在一起。李安然，我们一定会在一起！\u003c/p\u003e\n\u003cp\u003e小的时候 我以为大兴村的长梯 从头到尾就很远了 现在才知道,什么是真正的距离\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e咪咪：狗哥 你难受啥子 你跟我们分享一下嘛\u003c/li\u003e\n\u003cli\u003e狗哥：安然说 我只是她的好朋友\u003c/li\u003e\n\u003cli\u003e咪咪：啥子哦 我听不懂啊 狗哥\u003c/li\u003e\n\u003cli\u003e狗哥：你听不懂很正常的 咪哥。这个事情好微妙\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e龟儿子考上大学了，我是涂家第一个大学生！！\u003c/p\u003e\n\u003cp\u003e莫忘少年凌云志，曾许人间第一流\u003c/p\u003e\n\u003cp\u003e今天，没请哭丧的，也没请主持人，涂夫是个屠夫和卖猪肉的，也是我老汉，他走的那天我就在他身边。那天下着雨，把我们两个都淋惨了，啊天我叫天天不应，叫地地不灵，周围一个人都没得，你们都晓得吧，屠夫好大一个，就背到他跑，一直跑一直跑，一直跑，跑了好久哦，好不容易跑到了医院了，结果因为失血过多，来不及抢救走了。我老汉是个嗨粗俗的人，没啥子素质，出口成脏，相信大家都记得吧。我告诉你们，他有很严重的脚气，有好严重呢，有一次啊，他把一个鞋子放到阳台上，风一吹，剩个屋头都毁了。我觉得他的死是因为他很财迷，有好财迷唉，连个几百块钱的小灵通都不舍得给我买，导致我在那一天找不到手机，打不了120，我父亲有好财迷呢，他，小的时候嘛，过年你们都有新礼物，我就跑回屋头问屠夫，我的新礼物呢？屠夫就告诉我，他说龟儿子老子早就给你准备好了，然后就把一个卖剩下的卤水猪头打到我身上，当时我就哭惨了嘛，然后他还赶快过来安慰我。他说龟儿子勒个好耍，嘞个好耍哎，耍累了可以直接吃，吃饱了接到耍嘛，他有的时候，还喜欢到家里洗猪肉，洗到满头是汗，然后，他就用洗猪肉的水在那里洗脸，更厉害的是你们根本就不晓得，他根本不得洗第二遍直接上床就睡觉了，好臭喔！今天来的，一定都是关心我老汉的亲朋好友，也都是我老汉在乎的人，我老汉走的时候跟我说啊，他说，我走之前就想看一哈身边朋友的笑脸，谢谢你们，让他如愿以偿\u003c/p\u003e\n\u003cp\u003e他一定看得到，说不定那朵云就你是老汉儿\u003c/p\u003e\n\u003cp\u003e老子好不容易开到七十迈，心情自由自在\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e狗哥：诶 娇娇 怎么了\u003c/li\u003e\n\u003cli\u003e娇娇：想要考大学就要认真学习，不要讲些有的没的，靠嘴是靠不上大学的\u003c/li\u003e\n\u003cli\u003e狗哥：(抱拳)谢谢娇娇\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e咪咪：（拍桌而起）不对，我有梦想。（跑出门）主任，我的梦想就是陈圆\u003cdel\u003e圆\u003c/del\u003e\u003c/p\u003e\n\u003cp\u003e这不是五十块钱的事。这是老子第一次的好运气，这都要从我身边梭过去\u003c/p\u003e\n\u003cp\u003e刘闻钦。好久不见\u003c/p\u003e\n\u003cp\u003e你现在过去，看到他，他不是会很尴尬。你不懂，你不懂。男人在外头那都是顶天立地。但是，他们也有很脆弱，很无助的一面。哎呀，你们钦哥也这个样子\u003c/p\u003e","title":"风犬少年的天空 - 喜欢的语录"},{"content":"2021-11-14更新：百度云加速过期了，CDN 也直接用七牛云的吧。有兴趣的朋友可以看这篇文章《用七牛云作图床并配置 SSL》\n2020-11-03更新：已将cdn部署到百度云加速服务。国内使用Cloudflare确实不行，最近看到百度云加速有免费套餐，个人博客来说完全够用了。步骤不复杂，就不详细描述了。步骤大概为：\n需要域名备案 在百度云加速实名认证 添加网站时，选择CNAME接入方式。（官方推荐的是NS方式，这样可以全称托管，但我目前只希望托管我的cdn域名） 证书管理-证书申请可以免费申请ssl证书 安全功能-HTTPS，选择半程加密。这样源站可以不支持SSL 以下为原文：\n注意一下，由于众所周知的原因，在国内访问CloudFlare会很慢，我只是用于个人博客的部分图片使用，所以容忍度会比较高。有高要求的同学，不建议在国内使用。\n对于经常科学上网，尤其是自己搭建科学上网的同学来说，CloudFlare一定再熟悉不过了。经常有同学将它套在国外机子上，用来加速流量。因为CF本身就是一个CDN服务，可以用于加速各种服务。\n今天我选择用它做我图床的cdn服务。\n背景 起因是这样的，这两天发现我博客的背景图加载不出来了，查看网络请求后发现我的图床域名https://cdn.foamzou.com/legacy被强制使用https发起请求了。这是因为我的html页面是https的，chrome很不喜欢https页面包含了http请求，认为这很不安全。所以它强制在发起请求的时候在http header加了upgrade-insecure-requests: 1。该头部会告知服务端，客户端支持将http升级为https。在接下来的http请求中，浏览器会将其替换为https再发起请求。(但我将upgrade-insecure-requests: 1改为0，还是会替换为https，不确定是不是该头部的原因，也可能是chrome最近自升级加的特性。其它浏览器例如Safari就正常访问)\nOk，已经确定是chrome新版本的特性，将混合内容（mixed content）的http改写为https了。在2019年10月份，google就通过博客发布了chrome关于内容安全的更新时间表： - v79 [2019年12月发布到稳定渠道]：将mixed的脚本文件、iframe升级到https - v80 [2020年1月发布到试用渠道]：将mixed的音视频文件升级到https。虽然允许mixed的图片文件加载，但该站点会在地址栏被标记不安全 - v81 [2020年2月发布到试用渠道]：将mixed的图片文件升级到https 按计划是2月份发布到early release渠道，估计也是前段时间才被更新到稳定渠道，然后自更新导致我的图片挂掉 问题来了，我的图床域名并不支持https，导致ssl握手失败，我的图裂开了！如果要支持的话，我需要在七牛支付一定的费用（https流量没有免费额度），而且需要配置一个ssl证书，可以购买（几千块一年，好贵），也可以上传自定义证书（也略麻烦）。\n突然想起我可以把CF套在域名上，CF有免费套餐，一般的需求足够了，ssl证书还不用自己配置。\n开干 说干就干，打开官网，没有账号的话注册一个。\n添加站点 注意，这里只能填写根域，不支持单独加速子域名。但我只想加速某个子域名怎么办？没事，后面步骤可以配置。\n添加站点\n选择套餐 选择免费的就可以啦\n选择套餐\n修改代理状态 选择完套餐后，CF会将你域名的解析记录带出来，如下图\ndns记录\n在代理状态那列点击小图标可以切换状态。现在有两个状态可以切换，已代理和仅限DNS。注意，对于你不希望走CF的域名，请设置为仅限DNS，这样CF只会帮你将域名解析到你的源ip，而代理则解析到CDN节点，再帮你回源。\n由于CF在国内的网络情况并没有阿里云这些本地的厂商好，所以博客域名我没有走CF，只是代理了file.zoufeng.net\n好，点击继续。\n修改域名的DNS服务器 这一步需要到你的域名管理台(在哪买的域名就去哪)，将原来的DNS服务器删除，换成CF自己的。完成之后点击蓝色按钮。\n设置ssl 点击SSL/TLS按钮，将选项修改为灵活，这样CF节点支持ssl，而源服务器不需要ssl。完全的话，源服务器就需要支持ssl了。我的七牛图床域名不支持ssl，所以选择了灵活。这也是本篇文章的最开始的目的。\n等待生效 等吧。修改DNS服务器那一步耗费的时间可能会长一些。你可以通过ping命令检查是否已经解析到CF的ip了。\n其它 你可能看到上一张图有很多菜单：缓存、防火墙、worker等。CF挺多功能的，有兴趣的话，注册一个玩玩吧。worker就是serverless那东西，类似AWS CloudFront的lambda@edge\n","permalink":"https://blog-foamzou-com.pages.dev/posts/use-cloudflare-as-free-ssl/","summary":"\u003cp\u003e2021-11-14更新：百度云加速过期了，CDN 也直接用七牛云的吧。有兴趣的朋友可以看这篇文章《\u003ca href=\"/posts/image-hosted-service-qiniu/\"\u003e用七牛云作图床并配置 SSL\u003c/a\u003e》\u003c/p\u003e\n\u003cp\u003e2020-11-03更新：已将cdn部署到\u003ca href=\"https://su.baidu.com/\"\u003e百度云加速服务\u003c/a\u003e。国内使用Cloudflare确实不行，最近看到百度云加速有免费套餐，个人博客来说完全够用了。步骤不复杂，就不详细描述了。步骤大概为：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e需要域名备案\u003c/li\u003e\n\u003cli\u003e在百度云加速实名认证\u003c/li\u003e\n\u003cli\u003e添加网站时，选择CNAME接入方式。（官方推荐的是NS方式，这样可以全称托管，但我目前只希望托管我的cdn域名）\u003c/li\u003e\n\u003cli\u003e证书管理-证书申请可以免费申请ssl证书\u003c/li\u003e\n\u003cli\u003e安全功能-HTTPS，选择半程加密。这样源站可以不支持SSL\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e以下为原文：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e注意一下，由于众所周知的原因，在国内访问CloudFlare会很慢，我只是用于个人博客的部分图片使用，所以容忍度会比较高。\u003cstrong\u003e有高要求的同学，不建议在国内使用。\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e对于经常科学上网，尤其是自己搭建科学上网的同学来说，CloudFlare一定再熟悉不过了。经常有同学将它套在国外机子上，用来加速流量。因为CF本身就是一个CDN服务，可以用于加速各种服务。\u003c/p\u003e\n\u003cp\u003e今天我选择用它做我图床的cdn服务。\u003c/p\u003e\n\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e起因是这样的，这两天发现我博客的背景图加载不出来了，查看网络请求后发现我的图床域名\u003ccode\u003ehttps://cdn.foamzou.com/legacy\u003c/code\u003e被强制使用\u003ccode\u003ehttps\u003c/code\u003e发起请求了。这是因为我的html页面是https的，chrome很不喜欢https页面包含了http请求，认为这很不安全。所以它强制在发起请求的时候在http header加了\u003ccode\u003eupgrade-insecure-requests: 1\u003c/code\u003e。该头部会告知服务端，客户端支持将http升级为https。在接下来的http请求中，浏览器会将其替换为https再发起请求。(但我将\u003ccode\u003eupgrade-insecure-requests: 1\u003c/code\u003e改为0，还是会替换为https，不确定是不是该头部的原因，也可能是chrome最近自升级加的特性。其它浏览器例如Safari就正常访问)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOk，已经确定是chrome新版本的特性，将混合内容（mixed content）的http改写为https了。在2019年10月份，google就通过博客发布了chrome关于内容安全的更新时间表：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- v79 [2019年12月发布到稳定渠道]：将mixed的脚本文件、iframe升级到https\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- v80 [2020年1月发布到试用渠道]：将mixed的音视频文件升级到https。虽然允许mixed的图片文件加载，但该站点会在地址栏被标记不安全\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- v81 [2020年2月发布到试用渠道]：将mixed的图片文件升级到https\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e按计划是2月份发布到early release渠道，估计也是前段时间才被更新到稳定渠道，然后自更新导致我的图片挂掉\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e问题来了，我的图床域名并不支持https，导致ssl握手失败，我的图裂开了！如果要支持的话，我需要在七牛支付一定的费用（https流量没有免费额度），而且需要配置一个ssl证书，可以购买（几千块一年，好贵），也可以上传自定义证书（也略麻烦）。\u003c/p\u003e\n\u003cp\u003e突然想起我可以把CF套在域名上，CF有免费套餐，一般的需求足够了，ssl证书还不用自己配置。\u003c/p\u003e\n\u003ch2 id=\"开干\"\u003e开干\u003c/h2\u003e\n\u003cp\u003e说干就干，打开\u003ca href=\"https://dash.cloudflare.com/\"\u003e官网\u003c/a\u003e，没有账号的话注册一个。\u003c/p\u003e\n\u003ch3 id=\"添加站点\"\u003e添加站点\u003c/h3\u003e\n\u003cp\u003e注意，这里只能填写根域，不支持单独加速子域名。但我只想加速某个子域名怎么办？没事，后面步骤可以配置。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/use-cloudflare-as-free-ssl/image.png\"\u003e\u003c/p\u003e\n\u003cp\u003e添加站点\u003c/p\u003e\n\u003ch3 id=\"选择套餐\"\u003e选择套餐\u003c/h3\u003e\n\u003cp\u003e选择免费的就可以啦\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/use-cloudflare-as-free-ssl/image-1-1024x780.png\"\u003e\u003c/p\u003e\n\u003cp\u003e选择套餐\u003c/p\u003e\n\u003ch3 id=\"修改代理状态\"\u003e修改代理状态\u003c/h3\u003e\n\u003cp\u003e选择完套餐后，CF会将你域名的解析记录带出来，如下图\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/use-cloudflare-as-free-ssl/image-2-1024x501.png\"\u003e\u003c/p\u003e\n\u003cp\u003edns记录\u003c/p\u003e\n\u003cp\u003e在代理状态那列点击小图标可以切换状态。现在有两个状态可以切换，\u003ccode\u003e已代理\u003c/code\u003e和\u003ccode\u003e仅限DNS\u003c/code\u003e。注意，对于你不希望走CF的域名，请设置为\u003ccode\u003e仅限DNS\u003c/code\u003e，这样CF只会帮你将域名解析到你的源ip，而代理则解析到CDN节点，再帮你回源。\u003c/p\u003e\n\u003cp\u003e由于CF在国内的网络情况并没有阿里云这些本地的厂商好，所以博客域名我没有走CF，只是代理了\u003ccode\u003efile.zoufeng.net\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e好，点击继续。\u003c/p\u003e\n\u003ch3 id=\"修改域名的dns服务器\"\u003e修改域名的DNS服务器\u003c/h3\u003e\n\u003cp\u003e这一步需要到你的域名管理台(在哪买的域名就去哪)，将原来的DNS服务器删除，换成CF自己的。完成之后点击蓝色按钮。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/use-cloudflare-as-free-ssl/image-3-793x1024.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"设置ssl\"\u003e设置ssl\u003c/h3\u003e\n\u003cp\u003e点击SSL/TLS按钮，将选项修改为\u003ccode\u003e灵活\u003c/code\u003e，这样CF节点支持ssl，而源服务器不需要ssl。\u003ccode\u003e完全\u003c/code\u003e的话，源服务器就需要支持ssl了。我的七牛图床域名不支持ssl，所以选择了灵活。这也是本篇文章的最开始的目的。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/use-cloudflare-as-free-ssl/image-4-1024x649.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"等待生效\"\u003e等待生效\u003c/h3\u003e\n\u003cp\u003e等吧。修改DNS服务器那一步耗费的时间可能会长一些。你可以通过ping命令检查是否已经解析到CF的ip了。\u003c/p\u003e\n\u003ch2 id=\"其它\"\u003e其它\u003c/h2\u003e\n\u003cp\u003e你可能看到上一张图有很多菜单：缓存、防火墙、worker等。CF挺多功能的，有兴趣的话，注册一个玩玩吧。worker就是serverless那东西，类似AWS CloudFront的lambda@edge\u003c/p\u003e","title":"使用CloudFlare/百度云加速做免费SSL"},{"content":"Github Provides docker environment and code which process image. Welcome to star, fork or PR to improve the practice. Repo：Click The Link\nWhat\u0026rsquo;s this For the same image link, we may response different sizes of thumbnails according to different pages. Unfortunately, AWS does not directly provide such services. But it provides lambda@edge with CloudFront to handle this kind of demand. Therefore, I designed a set of solutions to achieve the requirements of image processing. This article contains instructions, design solutions and practical steps.\nUsing this solution, the client can splice parameters behind the original cdn link to obtain the thumbnail, add watermark and other processing requirements.\nRoles involved in the solution CloudFront Amazon\u0026rsquo;s CDN service. Be used to cache thumbnails in the solution. Hereinafter referred to as CF\nLambda@edge Lambda is Amazon\u0026rsquo;s cloud function, a form of serverless\nLambda@edge is a function that can run on the edge of CloudFront, which is weaker than Lambda. For example, only supports Node.js and Python Runtime; it does not support Layer, so the image library used cannot be deployed on the layer and can only be packaged into the source code.\nThe image processing logic runs on it, which is the key object of this project. Hereinafter referred to as Lambda\nS3 Amazon\u0026rsquo;s object storage service. Used to store original images, thumbnails, the source which CDN back to.\nWorkflow Image Generate WOrkflow\nThe following is the specific process:\nStep 0: User requests an image link, The link is like: http://cdn.com/image/abc.jpg@250w_60q.webp. Among them, http://cdn.com/image/abc.jpg is the original image link, and those after @ is processing parameters. Please refer to the manual for the specific meaning\nStep 1: The request arrives at the CF first, will directly returned to the user if checking that the CF has cache, and response with 304 Not Modified when the etag is same with the client\nStep 2: If CF misses, back to the source (S3) to get the image\nStep 3: After S3 response, CF will trigger an event to lambda, and the code will check the response status of event:\nIf the http code is a normal value, it means that the thumbnail already exists in S3. So no other processing is needed, return the response object directly Step 5: If the http code is an abnormal value, it means that S3 does not have the image, and we need to do the following: Strip the URI from @, the front is the original image KEY, and the back is the processing parameters. We obtain the original image from the S3 bucket (the bucket name can be extracted from the request link of the CF event property) by that KEY, and then process the image with parameters. We use Sharp Module to process image here (Sharp base on libvips which has better performance than ImageMagic). Put the processed image To S3. Therefore, CF Can back to S3 to get it if CDN cache is expire. By the way, I tagged (createByLambda:1) to the object, so that we can add lifecycle rule with the tags, avoid the waste of too many thumbnails in S3. Response image to CF with base64 encoding. So we need to set content-encoding to base64. The reason why base64 is used is because lambda only supports receiving json Step4：CF cache the response from origin, and response to client\nParameter description url format：https://cdn-domain/filename@_.outputFormat\nexample, https://d1xxxxxxxx.cloudfront.net/foamzou/image/4951f0e35a37e5190e78798dcfcad984.jpg@1020w_160h_0e_1l_70q.webp\nParameters w: Width of thumb. 1-4096\nh: Height of thumb. 1-4096\ne: Policy about aspect ratio. 0: Keep the aspect ratio, base on long side(Default). 1: Keep the aspect ratio, base on short side. 2: Ignore aspect ratio, force resize with width and height.\nl: Whether to process if the target thumbnail is larger than the original image.1: no processing; 0: will processing(Default)\np: Percent of the size (1-1000). Less than 100 means zoom out, and greater than 100 means zoom in. If the parameter p is used in combination with w and h, p will directly act on w and h (multiply by p%) to get the new w and h. For example, 100w_100h_200p has the same effect as 200w_200h. The default value is 100\nq: Percent of quality (1-100) . Default: 80\nr: Whether to response progressive jpeg. 0: not used (default), 1 used. The default is 0. This parameter will take effect only when the output format is jpg. Note: 1. Small size image are not recommended, because progressive jpeg will be larger than the original image; 2. If you can use webp, try to use webp;\n.format: Be output format. Support jpg, png, webp. No need to add .format if you keep the original format\nNotice When the total area exceeds 4096px * 4096px, or the length of one side exceeds 4096px * 4, the image will not be scaled\nPractical steps Create public access bucket in S3 Permissions -\u0026gt; Block public access. Just open the first 2 options:\nBucket Policy\n{ \u0026#34;Version\u0026#34;: \u0026#34;2012-10-17\u0026#34;, \u0026#34;Statement\u0026#34;: [ { \u0026#34;Sid\u0026#34;: \u0026#34;PublicRead\u0026#34;, \u0026#34;Effect\u0026#34;: \u0026#34;Allow\u0026#34;, \u0026#34;Principal\u0026#34;: \u0026#34;*\u0026#34;, \u0026#34;Action\u0026#34;: \u0026#34;s3:GetObject\u0026#34;, \u0026#34;Resource\u0026#34;: \u0026#34;arn:aws:s3:::your-bucket-name/*\u0026#34; } ] } CORS Configuration\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;CORSConfiguration xmlns=\u0026#34;http://s3.amazonaws.com/doc/2006-03-01/\u0026#34;\u0026gt; \u0026lt;CORSRule\u0026gt; \u0026lt;AllowedOrigin\u0026gt;http://*.your-domain.com\u0026lt;/AllowedOrigin\u0026gt; \u0026lt;AllowedOrigin\u0026gt;https://*.your-domain.com\u0026lt;/AllowedOrigin\u0026gt; \u0026lt;AllowedMethod\u0026gt;PUT\u0026lt;/AllowedMethod\u0026gt; \u0026lt;ExposeHeader\u0026gt;ETag\u0026lt;/ExposeHeader\u0026gt; \u0026lt;ExposeHeader\u0026gt;x-amz-meta-custom-header\u0026lt;/ExposeHeader\u0026gt; \u0026lt;AllowedHeader\u0026gt;*\u0026lt;/AllowedHeader\u0026gt; \u0026lt;/CORSRule\u0026gt; \u0026lt;/CORSConfiguration\u0026gt; Use this solution from scratch Note: Functions must be created in the us-east-1 region\nPrepare Get the latest code. Repo: Link To Github. Deploy docker according to the readme guide, enter the lambda directory from docker, install dependencies with npm install, compress the entire lambda directory into a zip file(NOTICE: don\u0026rsquo;t contain directory, you cancd lambda; zip -r ../function.zip ./*; cd -), upload it to S3 (for security, it is recommended to upload to a private bucket), remember the s3 file link, below Deployment needs. Create a role to execute lambda. The role need the following permissions（Permissions → Attach policies） AmazonS3FullAccess AWSLambdaReadOnlyAccess AWSLambdaBasicExecutionRole Add (Trust relationship → Edit trust relationship) { \u0026#34;Version\u0026#34;: \u0026#34;2012-10-17\u0026#34;, \u0026#34;Statement\u0026#34;: [ { \u0026#34;Effect\u0026#34;: \u0026#34;Allow\u0026#34;, \u0026#34;Principal\u0026#34;: { \u0026#34;Service\u0026#34;: \u0026#34;lambda.amazonaws.com\u0026#34; }, \u0026#34;Action\u0026#34;: \u0026#34;sts:AssumeRole\u0026#34; }, { \u0026#34;Effect\u0026#34;: \u0026#34;Allow\u0026#34;, \u0026#34;Principal\u0026#34;: { \u0026#34;Service\u0026#34;: \u0026#34;edgelambda.amazonaws.com\u0026#34; }, \u0026#34;Action\u0026#34;: \u0026#34;sts:AssumeRole\u0026#34; } ] } Create Lambda Function Service → Lambda → Functions → Create function, Select Author from scratch Basic information. function name : cdnEdgeImageHandler. Runtime : Node.js 12.x. Execution role → Use an existing role → Select the role just created. Click Create function Upload Code. Open function dashboard, Function Code -\u0026gt; Actions -\u0026gt; Upload a file from Amazon S3. Then paste the zip link (the previous upload) .BTW, even if it is a private bucket link, it does not need to be signed, as long as the bucket belongs to this account, Lambda can access it. Setting runtime. Basic Settings → edit. Handler: index.handler. Memory: change to about 384MB, Timeout set to 15 sec. Then Save. Public new version. Actions → Public new version → write description → Publish. You will see a string(ARN) in the top of the page. Will be use in following. The ARN format: arn:aws:lambda:us-east-1:016655625412:function:cdnEdgeImageHandler:1 Attach Lambda To CloudFront Service -\u0026gt; CloudFront: Create distribution (Skip the step if attach an existed instance). Select a delivery method: Web → Origin Domain Name: select origin which back to → Click Create Create Behavior. Open distribution dashboard → Behavior tab → Create Behavior → Path Pattern: /*.jpg@* ; Lambda Function Associations: CloudFront Event: Select Origin Response, Function ARN: The string at the top of the function dashboard (NOTICE: the string MUST BE end with version id ) → Click Create If there are other image types, should added as in step 2. Or if you want to uniformly process the pictures under a certain path, you can set a path to Path Pattern. Such as /images/* Add lifecycle rule in S3 bucket (You can choose whether to add the rule). This solution will upload the generated image to S3. In order not to waste space, you can add rules to delete old files. Step: Open S3 dashboard → Management tab → Add lifecycle rule → rule name: Delete cdn cache → rule scope: Limit the scope to specific prefixes or tags → type createByLambda, select tag, type tag value 1. Click next -\u0026gt; Transitions: don\u0026rsquo;t need to do → next: Configure expiration: Both check Current version and Previous versions. Modify days value → Click Save How to update Lambda Refer to steps 3 and 5 of \u0026ldquo;Create Lambda Function\u0026rdquo; above to release a new version. Lambda Function dashboard → Actions → Deploy to Lambda@edge → Select Use existing CloudFront trigger on this function → Select CloudFront trigger → Click Deploy Check the effect after a while. Because it takes time for CF to deploy to global nodes. BTW, You should deploy it to the CDN trigger which for testing BEFORE deploy to production. Skill of Debug Debug it in the development environment first. There is an event.json file in the github, which can be used to simulate CF requests. Before deploying to the edge, use the \u0026ldquo;test events\u0026rdquo; in the lambda dashboard to test first. It is recommended to paste the content in event.json as a test event. Make good use of console.log. The log will be report to CloudWatch. But you need to switch to a specific region to see the log of the corresponding request. (The region identification can be seen in the x-amz-cf-pop in the response header of the image, which can be used to locate the region) Related Information Demo of Lambda Guide\nAWS CDN Blog\n","permalink":"https://blog-foamzou-com.pages.dev/posts/best-practices-for-using-lambdaedge-to-process-images-on-aws-en/","summary":"\u003ch2 id=\"github\"\u003eGithub\u003c/h2\u003e\n\u003cp\u003eProvides docker environment and code which process image. Welcome to star, fork or PR to improve the practice. Repo：\u003ca href=\"https://github.com/foamzou/aws-lambda-edge-image-process\"\u003eClick The Link\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"whats-this\"\u003eWhat\u0026rsquo;s this\u003c/h2\u003e\n\u003cp\u003eFor the same image link, we may response different sizes of thumbnails according to different pages. Unfortunately, AWS does not directly provide such services. But it provides lambda@edge with CloudFront to handle this kind of demand. Therefore, I designed a set of solutions to achieve the requirements of image processing. This article contains instructions, design solutions and practical steps.\u003c/p\u003e","title":"Best Practices for using Lambda@Edge to process images on AWS"},{"content":"Github 提供了docker环境和简单的图片处理代码；欢迎star、fork或提交pr以改善该实践。仓库：点我\n这是什么 类似阿里云OSS的图片处理服务、腾讯云的数据万象。\n因为AWS并没有单独将图片处理单独发布服务，只提供了lambda配合CloudFront用于处理这类需求。因此我设计了一套方案用于实现图片处理的需求，本文档包含使用说明、设计方案。\n有了本方案，前端可以在原有的cdn图片链接后面拼接参数，获取对应的缩略图、加水印等图片处理需求。\n本方案涉及到的几个角色 CloudFront Amazon的CDN服务，在本方案用于缓存缩略图。下面简称CF\nLambda@edge Lambda是Amazon的云函数，就是serverless那一套。\nLambda@edge则是可以运行在CloudFront边缘的函数，比Lambda支持的能力要弱一些。例如runtime只支持Node.js和Python；不支持Layer，导致使用的图片库无法部署在layer，只能全部打包到源码。\n对图片的处理逻辑在这一层运行，是本方案的重点对象。下面简称Lambda\nS3 Amazon的对象存储服务，类似阿里的OSS。在本方案扮演 存储原图、缩略图；cdn回源的角色\n工作流程 Image Generate WOrkflow\n注意：只有在CF行为规则配置了规则（例如 .jpg@ ），才会触发lambda。直接访问原图的不经过lambda，不必担心过度计费问题。\n请参考上图，流程为：\n步骤0：用户请求图片链接：链接形如：http://cdn.com/image/abc.jpg@250w_60q.webp。其中 http://cdn.com/image/abc.jpg 是原图链接，@后面是处理参数，具体含义请参看使用手册\n步骤1：请求先到达CF，检查CF有缓存则直接返回给用户，并且etag与客户端一致时响应304 Not Modified\n步骤2：若CF未命中，则回源到S3获取图片。\n步骤3：S3响应后，CF事件会触发给lambda，函数逻辑会对response进行判断：\n如果http code为正常值，说明缩略图在S3已存在，那么不进行其它处理，直接将response返回 步骤5：如果http code为异常值，说明S3没有该图，我们需要做以下处理： 将URI从@开始剥离，前面的为原图KEY，后面的为处理参数。我们使用原图KEY从S3桶（CF事件的request链接可以提取到桶名）获取原图，然后使用处理参数对图片进行处理。这里使用sharp图片处理库(底层使用libvips，比ImageMagic性能要好)。 将处理好的图片存储到S3，以便下次CF失效时，直接回源到S3获取。这里存储到S3时，给图片打了标签（createByLambda:1），方便在S3根据标签制定淘汰规则，避免过多缩略图长期存在S3造成浪费。 将图片以base64编码返回到CF，content-encoding为base64。这里之所以使用base64是因为lambda只支持接收json 步骤4：CF将源头的图片存储起来并响应给用户\n前端使用说明 url构成：https://cdn域名/文件名@\u0026lt;参数值1\u0026gt;\u0026lt;参数名1\u0026gt;_\u0026lt;参数值2\u0026gt;\u0026lt;参数名2\u0026gt;.期望转换的文件格式\n例子：https://d1xxxxxxxx.cloudfront.net/foamzou/image/4951f0e35a37e5190e78798dcfcad984.jpg@1020w_160h_0e_1l_70q.webp\n参数 w: 指定目标缩略图的宽度。1-4096\nh: 指定目标缩略图的高度。1-4096\ne: 缩放优先边。0：长边优先，1：短边优先，2：强制按指定宽高缩放。默认为0\nl: 目标缩略图大于原图是否处理。如果值是1, 即不处理；是0，表示处理。默认为0\np: 比例百分比。 小于100，即是缩小，大于100即是放大。1-1000。如果参数p跟w、h合用时，p将直接作用于w、h （乘以p%）得到新的w、h，例如100w_100h_200p的作用跟200w_200h的效果是一样的。默认为100\nq: 质量百分比。1-100。默认为80\nr: 是否使用渐进式jpeg。0：不使用，1使用。默认为0。只有在输出格式为jpg时，该参数才会生效。注意：1. 小尺寸图片不建议使用，因为渐进式jpeg会比原图大；2. 能够使用webp尽量使用webp；3. 渐进式展示图片的最佳方案应当是前端同时渲染小图和大图，动画过度到大图\n.format 格式转换。目前支持jpg, png, webp。若保留原文件格式，那么 .format 可以不添加\n注意 当总面积超过4096px * 4096px，或者单边长度超过4096px * 4，那么不会对图片进行缩放处理\n实践 在S3创建一个公有桶 Block权限只勾选前两项\n存储桶策略\n{ \u0026#34;Version\u0026#34;: \u0026#34;2012-10-17\u0026#34;, \u0026#34;Statement\u0026#34;: [ { \u0026#34;Sid\u0026#34;: \u0026#34;PublicRead\u0026#34;, \u0026#34;Effect\u0026#34;: \u0026#34;Allow\u0026#34;, \u0026#34;Principal\u0026#34;: \u0026#34;*\u0026#34;, \u0026#34;Action\u0026#34;: \u0026#34;s3:GetObject\u0026#34;, \u0026#34;Resource\u0026#34;: \u0026#34;arn:aws:s3:::你的桶名/*\u0026#34; } ] } CORS配置\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;CORSConfiguration xmlns=\u0026#34;http://s3.amazonaws.com/doc/2006-03-01/\u0026#34;\u0026gt; \u0026lt;CORSRule\u0026gt; \u0026lt;AllowedOrigin\u0026gt;http://*.your-domain.com\u0026lt;/AllowedOrigin\u0026gt; \u0026lt;AllowedOrigin\u0026gt;https://*.your-domain.com\u0026lt;/AllowedOrigin\u0026gt; \u0026lt;AllowedMethod\u0026gt;PUT\u0026lt;/AllowedMethod\u0026gt; \u0026lt;ExposeHeader\u0026gt;ETag\u0026lt;/ExposeHeader\u0026gt; \u0026lt;ExposeHeader\u0026gt;x-amz-meta-custom-header\u0026lt;/ExposeHeader\u0026gt; \u0026lt;AllowedHeader\u0026gt;*\u0026lt;/AllowedHeader\u0026gt; \u0026lt;/CORSRule\u0026gt; \u0026lt;/CORSConfiguration\u0026gt; 在全新的AWS账号接入这套方案(部署) 注意：必须统一在 us-east-1 地区创建函数\n准备工作 拉取最新的lambda代码。仓库：跳转到Github，按照readme指引部署好docker，从docker进入lambda目录，npm install 安装好依赖，将lambda整个目录压缩为zip文件，上传到S3（为了代码安全，建议上传到私有桶）, 记好s3文件链接，下面部署要用到 创建一个角色用于运行lambda。该角色需要有以下权限（权限→ 附加策略） AmazonS3FullAccess AWSLambdaReadOnlyAccess AWSLambdaBasicExecutionRole 需要给角色添加信任关系（信任关系→ 编辑信任关系） { \u0026#34;Version\u0026#34;: \u0026#34;2012-10-17\u0026#34;, \u0026#34;Statement\u0026#34;: [ { \u0026#34;Effect\u0026#34;: \u0026#34;Allow\u0026#34;, \u0026#34;Principal\u0026#34;: { \u0026#34;Service\u0026#34;: \u0026#34;lambda.amazonaws.com\u0026#34; }, \u0026#34;Action\u0026#34;: \u0026#34;sts:AssumeRole\u0026#34; }, { \u0026#34;Effect\u0026#34;: \u0026#34;Allow\u0026#34;, \u0026#34;Principal\u0026#34;: { \u0026#34;Service\u0026#34;: \u0026#34;edgelambda.amazonaws.com\u0026#34; }, \u0026#34;Action\u0026#34;: \u0026#34;sts:AssumeRole\u0026#34; } ] } 创建Lambda 打开控制台 → Lambda → 函数 → 创建函数，选择从头开始创作； 填写信息：基本信息：函数名称填：cdnEdgeImageHandler ；运行时选择 Node.js 12.x，选择角色→ 使用现有角色→ 选择前面创建好的角色；点击【创建函数】按钮 上传代码：正常情况下会跳转到函数详情页面。“函数代码”这行有个按钮“操作”→ \u0026ldquo;从AmazonS3上传\u0026rdquo;，然后粘贴前边上传后返回的zip链接（即使是私有桶链接，也不需要加签名，只要桶属于本账号，Lambda就能够读取） 设置运行时参数：基本设置→ 编辑，处理程序保持为“index.handler”，内存调到“384MB”，超时时间调为15秒。保存。 发布新版本：函数详情页顶部“操作”按钮 → 发布新版本 → 描述可选填 → 发布。此时页面刷新后会看到顶部ARN有一串字符串，后面部署需要用到。形如“arn:aws:lambda:us-east-1:016655625412:function:cdnEdgeImageHandler:1” 接入新的CDN业务 创建CloudFront（在已有的CF上接入请跳过这一步）：选择分发方式，选择Web，下一步→ 源域名：选择回源的域名；源路径：没有特别设置起始目录就留空；→ 点击创建按钮 添加jpg行为：点击到对应CF的详情页→ 行为tab→ 创建行为→ 路径模式：填 /*.jpg@* ；Lambda函数关联：CF事件选择“源响应”，Lambda函数ARN填写函数详情页顶部的那串字符串（注意字符串最后需要带有 “:版本id”）。 → 点击创建按钮 如果还有其他图片类型，也需要像步骤2一样添加。或者希望对某一个路径下边的图片统一处理，路径模式填目录名也可以，例如 /images/* 给对应S3实例添加生命周期规则（使用者可自行选择是否制定该规则）：本方案会将生成的缩略图上传到S3，为了不浪费空间，可以定义规则将老文件删除。步骤：打开对应的S3实例配置页→ \u0026ldquo;管理\u0026quot;tab → 添加生命周期规则 → 填写规则名称“Delete cdn cache” → 规则范围：限制在特定前缀或标签 → 输入框输入“createByLambda”,选择“标签“，输入标签值”1” 。此时会看到下方多出一个元素：标签 createByLambda | 1。→ 下一步：转换不用配置 → 下一步：配置过期：勾选当前版本和先前版本，下面两个天数都修改为10天（可按实际情况自行修改）→ 下一步，保存。 如何更新Lambda 参考上边“创建Lambda”第3和第5步，发布新版本。 函数详情页→ 顶部“操作”按钮→ 部署到Lambda@edge → 选择 对此函数使用现有的CloudFront触发器 → 选择触发器（注意这里要选中对应CF实例的事件）→ 点击部署按钮 过一会检测效果。因为CF部署到全球节点需要点时间。PS：每次发布新版本到生产环境的cdn，建议先部署到测试CDN进行测试。 调试技巧 先在开发环境调试好。代码仓库里有一份event.json，可用于模拟CF的请求。 在部署到edge之前，先用lambda控制台里的“测试事件”先进行测试，建议把event.json里的内容粘贴过去作为测试事件。 利用好console.log，日志会输出到CloudWatch。但是你需要切换到特定的区域才能看到对应请求的日志。（在图片响应头的x-amz-cf-pop可以看到区域标识，可用该标识定位区域。ps. 香港节点比较坑，日志有时会跑到它临近的首尔、新加坡节点去） 相关资料 官方lambda入门demo\n官方缩略图实践指南\n","permalink":"https://blog-foamzou-com.pages.dev/posts/best-practices-for-using-lambdaedge-to-process-images-on-aws/","summary":"\u003ch2 id=\"github\"\u003eGithub\u003c/h2\u003e\n\u003cp\u003e提供了docker环境和简单的图片处理代码；欢迎star、fork或提交pr以改善该实践。仓库：\u003ca href=\"https://github.com/foamzou/aws-lambda-edge-image-process\"\u003e点我\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"这是什么\"\u003e这是什么\u003c/h2\u003e\n\u003cp\u003e类似阿里云OSS的图片处理服务、腾讯云的数据万象。\u003c/p\u003e\n\u003cp\u003e因为AWS并没有单独将图片处理单独发布服务，只提供了lambda配合CloudFront用于处理这类需求。因此我设计了一套方案用于实现图片处理的需求，本文档包含使用说明、设计方案。\u003c/p\u003e\n\u003cp\u003e有了本方案，前端可以在原有的cdn图片链接后面拼接参数，获取对应的缩略图、加水印等图片处理需求。\u003c/p\u003e\n\u003ch2 id=\"本方案涉及到的几个角色\"\u003e本方案涉及到的几个角色\u003c/h2\u003e\n\u003ch3 id=\"cloudfront\"\u003eCloudFront\u003c/h3\u003e\n\u003cp\u003eAmazon的CDN服务，在本方案用于缓存缩略图。下面简称CF\u003c/p\u003e\n\u003ch3 id=\"lambdaedge\"\u003eLambda@edge\u003c/h3\u003e\n\u003cp\u003eLambda是Amazon的云函数，就是serverless那一套。\u003c/p\u003e\n\u003cp\u003eLambda@edge则是可以运行在CloudFront边缘的函数，比Lambda支持的能力要弱一些。例如runtime只支持Node.js和Python；不支持Layer，导致使用的图片库无法部署在layer，只能全部打包到源码。\u003c/p\u003e\n\u003cp\u003e对图片的处理逻辑在这一层运行，是本方案的重点对象。下面简称Lambda\u003c/p\u003e\n\u003ch3 id=\"s3\"\u003eS3\u003c/h3\u003e\n\u003cp\u003eAmazon的对象存储服务，类似阿里的OSS。在本方案扮演 存储原图、缩略图；cdn回源的角色\u003c/p\u003e\n\u003ch2 id=\"工作流程\"\u003e工作流程\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/best-practices-for-using-lambdaedge-to-process-images-on-aws/image-3-1024x434.png\"\u003e\u003c/p\u003e\n\u003cp\u003eImage Generate WOrkflow\u003c/p\u003e\n\u003cp\u003e注意：只有在CF行为规则配置了规则（例如 \u003cstrong\u003e.jpg@\u003c/strong\u003e ），才会触发lambda。直接访问原图的不经过lambda，不必担心过度计费问题。\u003c/p\u003e\n\u003cp\u003e请参考上图，流程为：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e步骤0：用户请求图片链接：链接形如：\u003cstrong\u003e\u003ca href=\"http://cdn.com/image/abc.jpg@250w\"\u003ehttp://cdn.com/image/abc.jpg@250w\u003c/a\u003e_60q.webp\u003c/strong\u003e。其中 http://cdn.com/image/abc.jpg 是原图链接，@后面是处理参数，具体含义请参看使用手册\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e步骤1：请求先到达CF，检查CF有缓存则直接返回给用户，并且etag与客户端一致时响应304 Not Modified\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e步骤2：若CF未命中，则回源到S3获取图片。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e步骤3：S3响应后，CF事件会触发给lambda，函数逻辑会对response进行判断：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e如果http code为正常值，说明缩略图在S3已存在，那么不进行其它处理，直接将response返回\u003c/li\u003e\n\u003cli\u003e步骤5：如果http code为异常值，说明S3没有该图，我们需要做以下处理：\n\u003cul\u003e\n\u003cli\u003e将URI从@开始剥离，前面的为\u003cstrong\u003e原图KEY\u003c/strong\u003e，后面的为\u003cstrong\u003e处理参数\u003c/strong\u003e。我们使用原图KEY从S3桶（CF事件的request链接可以提取到桶名）获取原图，然后使用处理参数对图片进行处理。这里使用sharp图片处理库(底层使用libvips，比ImageMagic性能要好)。\u003c/li\u003e\n\u003cli\u003e将处理好的图片存储到S3，以便下次CF失效时，直接回源到S3获取。这里存储到S3时，给图片打了标签（createByLambda:1），方便在S3根据标签制定淘汰规则，避免过多缩略图长期存在S3造成浪费。\u003c/li\u003e\n\u003cli\u003e将图片以base64编码返回到CF，content-encoding为base64。这里之所以使用base64是因为lambda只支持接收json\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e步骤4：CF将源头的图片存储起来并响应给用户\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"前端使用说明\"\u003e前端使用说明\u003c/h2\u003e\n\u003cp\u003eurl构成：https://cdn域名/文件名@\u0026lt;参数值1\u0026gt;\u0026lt;参数名1\u0026gt;_\u0026lt;参数值2\u0026gt;\u0026lt;参数名2\u0026gt;.期望转换的文件格式\u003c/p\u003e\n\u003cp\u003e例子：https://d1xxxxxxxx.cloudfront.net/foamzou/image/4951f0e35a37e5190e78798dcfcad984.jpg@1020w_160h_0e_1l_70q.webp\u003c/p\u003e\n\u003ch3 id=\"参数\"\u003e参数\u003c/h3\u003e\n\u003cp\u003ew: 指定目标缩略图的宽度。1-4096\u003c/p\u003e\n\u003cp\u003eh: 指定目标缩略图的高度。1-4096\u003c/p\u003e\n\u003cp\u003ee: 缩放优先边。0：长边优先，1：短边优先，2：强制按指定宽高缩放。默认为0\u003c/p\u003e\n\u003cp\u003el: 目标缩略图大于原图是否处理。如果值是1, 即不处理；是0，表示处理。默认为0\u003c/p\u003e\n\u003cp\u003ep: 比例百分比。 小于100，即是缩小，大于100即是放大。1-1000。如果参数p跟w、h合用时，p将直接作用于w、h （乘以p%）得到新的w、h，例如100w_100h_200p的作用跟200w_200h的效果是一样的。默认为100\u003c/p\u003e\n\u003cp\u003eq: 质量百分比。1-100。默认为80\u003c/p\u003e\n\u003cp\u003er: 是否使用渐进式jpeg。0：不使用，1使用。默认为0。只有在输出格式为jpg时，该参数才会生效。注意：1. 小尺寸图片不建议使用，因为渐进式jpeg会比原图大；2. 能够使用webp尽量使用webp；3. 渐进式展示图片的最佳方案应当是前端同时渲染小图和大图，动画过度到大图\u003c/p\u003e\n\u003cp\u003e.format 格式转换。目前支持jpg, png, webp。若保留原文件格式，那么  .format 可以不添加\u003c/p\u003e","title":"在AWS使用Lambda@Edge处理图片的最佳实践"},{"content":"用途 定点提醒你做事。例如到点发现你还没写日记就提醒你 配合手机tasker、workflow做消息提醒 触发各种你关心的webhook等 准备工作 可以科学上网的机器 一个手机号 注册TG账号 在网络下载一个tg客户端，并注册账号，现在貌似都要用手机注册。\n注册完成后，记得在设置 -\u0026gt; Privacy and Security -\u0026gt; Phone Number 设置为Nobody，网上冲浪还是要把自己保护好。\n有时候可能会遇到无法发消息给别人的情况，有可能是系统误杀。可以跟在搜索框添加官方账号 @SpamBot ，反馈问题。用 /start 开启和它的对话，然后点击用它返回的菜单或者直接和它沟通。不出意外，一段时间后会帮你清理掉你账号的异常情况。\n创建机器人 搜索框添加官方机器人管理员@BotFather 。键入 /start 开启和它的对话，点击它返回的 /newbot。管理员提示给它取个爱称，输入后，管理员提示给它取个昵称，ok，这俩名字取一样的应该没啥问题。\n然后管理员会回你一段话，其中1377170000:AAGApipyadqh3ZAqgFNiJJwWohXIs3xxxxx 就是你机器人的token，请妥善保存，后面会用到。\nUse this token to access the HTTP API:\n1377170000:AAGApipyadqh3ZAqgFNiJJwWohXIs3xxxxx\nKeep your token secure and store it safely, it can be used by anyone to control your bot.\n到这里就已经创建了一个机器人，你可以多创建几个，如果有需要的话。\n获取你与机器人的聊天会话id 机器人发信息的api需要指定聊天会话id（chat_id），所以我们要获取到它。\n首先你需要找到机器人跟它说句话，然后访问链接（浏览器打开或者curl都行）：https://api.telegram.org/bot1377170000:AAGApipyadqh3ZAqgFNiJJwWohXIs3xxxxx/getUpdates 。将链接的token换成你机器人的，bot\u0026lt;你的token\u0026gt;/getUpdates。会正常响应机器人最近的聊天记录，找到message.chat节点下的id，这就是chat_id，记录下来。\n{ \u0026#34;ok\u0026#34;: true, \u0026#34;result\u0026#34;: [{ \u0026#34;update_id\u0026#34;: 345541000, \u0026#34;message\u0026#34;: { ..... \u0026#34;chat\u0026#34;: { \u0026#34;id\u0026#34;: 703240000, \u0026#34;first_name\u0026#34;: \u0026#34;foam\u0026#34;, \u0026#34;last_name\u0026#34;: \u0026#34;zou\u0026#34;, \u0026#34;username\u0026#34;: \u0026#34;foamzou\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;private\u0026#34; }.... 当然，你也可以把机器人拉到群里，在群里说几句话，然后也是像上面操作，拿到chat_id。ps.如果是私密群，id是负数。\n调用发信息api 直接贴curl。\ncurl -d \u0026#39;{\u0026#34;chat_id\u0026#34;:703240000, \u0026#34;text\u0026#34;:\u0026#34;hello\u0026#34;, \u0026#34;parse_mode\u0026#34;: \u0026#34;Markdown\u0026#34;}\u0026#39; -H \u0026#34;Content-Type: application/json\u0026#34; -X POST https://api.telegram.org/b1377170000:AAGApipyadqh3ZAqgFNiJJwWohXIs3xxxxx/sendMessage 执行上边的命令，没有意外的话，你的机器人将会给你发一句hello。parse_mode选择的markdown，那么文本内容将可以很丰富啦。具体的用法和参数请自行去查阅官方文档哦。\nps. TGBot还有很多高级的功能，例如可以自定义会话菜单，自动回复等\npss. 国内也有很多优秀的可以用于做消息通知的方式。例如，server酱（微信）、钉钉机器人。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E4%BD%BF%E7%94%A8telegram-bot%E5%8F%91%E9%80%9A%E7%9F%A5%E6%B6%88%E6%81%AF/","summary":"\u003ch3 id=\"用途\"\u003e用途\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e定点提醒你做事。例如到点发现你还没写日记就提醒你\u003c/li\u003e\n\u003cli\u003e配合手机tasker、workflow做消息提醒\u003c/li\u003e\n\u003cli\u003e触发各种你关心的webhook等\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"准备工作\"\u003e准备工作\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e可以科学上网的机器\u003c/li\u003e\n\u003cli\u003e一个手机号\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"注册tg账号\"\u003e注册TG账号\u003c/h3\u003e\n\u003cp\u003e在网络下载一个tg客户端，并注册账号，现在貌似都要用手机注册。\u003c/p\u003e\n\u003cp\u003e注册完成后，记得在设置 -\u0026gt; Privacy and Security -\u0026gt; Phone Number 设置为Nobody，网上冲浪还是要把自己保护好。\u003c/p\u003e\n\u003cp\u003e有时候可能会遇到无法发消息给别人的情况，有可能是系统误杀。可以跟在搜索框添加官方账号 @SpamBot ，反馈问题。用 /start 开启和它的对话，然后点击用它返回的菜单或者直接和它沟通。不出意外，一段时间后会帮你清理掉你账号的异常情况。\u003c/p\u003e\n\u003ch3 id=\"创建机器人\"\u003e创建机器人\u003c/h3\u003e\n\u003cp\u003e搜索框添加官方机器人管理员@BotFather 。键入 /start 开启和它的对话，点击它返回的 /newbot。管理员提示给它取个爱称，输入后，管理员提示给它取个昵称，ok，这俩名字取一样的应该没啥问题。\u003c/p\u003e\n\u003cp\u003e然后管理员会回你一段话，其中1377170000:AAGApipyadqh3ZAqgFNiJJwWohXIs3xxxxx 就是你机器人的token，请妥善保存，后面会用到。\u003c/p\u003e\n\u003cp\u003eUse this token to access the HTTP API:\u003cbr\u003e\n1377170000:AAGApipyadqh3ZAqgFNiJJwWohXIs3xxxxx\u003cbr\u003e\nKeep your token secure and store it safely, it can be used by anyone to control your bot.\u003c/p\u003e\n\u003cp\u003e到这里就已经创建了一个机器人，你可以多创建几个，如果有需要的话。\u003c/p\u003e\n\u003ch3 id=\"获取你与机器人的聊天会话id\"\u003e获取你与机器人的聊天会话id\u003c/h3\u003e\n\u003cp\u003e机器人发信息的api需要指定聊天会话id（chat_id），所以我们要获取到它。\u003c/p\u003e\n\u003cp\u003e首先你需要找到机器人跟它说句话，然后访问链接（浏览器打开或者curl都行）：https://api.telegram.org/bot1377170000:AAGApipyadqh3ZAqgFNiJJwWohXIs3xxxxx/getUpdates 。将链接的token换成你机器人的，bot\u0026lt;你的token\u0026gt;/getUpdates。会正常响应机器人最近的聊天记录，找到message.chat节点下的id，这就是chat_id，记录下来。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;ok\u0026#34;: true,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;result\u0026#34;: [{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#34;update_id\u0026#34;: 345541000,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#34;message\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            .....\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#34;chat\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u0026#34;id\u0026#34;: 703240000,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u0026#34;first_name\u0026#34;: \u0026#34;foam\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u0026#34;last_name\u0026#34;: \u0026#34;zou\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u0026#34;username\u0026#34;: \u0026#34;foamzou\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u0026#34;type\u0026#34;: \u0026#34;private\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            }....\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e当然，你也可以把机器人拉到群里，在群里说几句话，然后也是像上面操作，拿到chat_id。ps.如果是私密群，id是负数。\u003c/p\u003e","title":"使用Telegram Bot发通知消息"},{"content":"[admonition]这几年推荐过身边不少朋友买Mac，开箱后，我通常会给一些使用心得和常用的工具。正巧今天又有一位朋友买了mac，这次干脆直接将我的使用心得整理成文章。已经有使用经验的朋友可以直接拉到最下面看看我推荐的效率工具鸭~[/admonition]\n开箱 检查外表\n检查外表、屏幕等是否有损伤\n序列号\n官网查询序列号，判断型号、保修期是否正常。传送门\n关于applecare+服务的购买建议\n这个延保服务我还是建议大家购买的，毕竟mac保修只有1年（主要部件2年，江苏省主要部件3年），而applecare可以将保修期延长到3年（自机器购买之日起）。注意，这个服务只能在购机60天内买，超过时间就买不了了，所以建议在购机的时候就一起买了。\n为什么我推荐大家买呢，因为mbp的品控的确不太好，而且现在里边的部件集成度做得太高，例如有次我的一个充电口充不了电，拿去修说要换掉主板，因为是焊在一起的。还好那时候还在保，否则要花费2k貌似。坏1次基本就回本的（咦，听起来怪怪的）\n周边配件 拓展坞 现在的mbp都没有usb、hdmi等接口了，全都是typc-c，所以此时需要一个拓展坞。有钱直接官网买，像我一样没钱的可以考虑买绿联家的。下图1有几个usb和1个hdmi，按需购买，有的拓展坞是vga、网口等的集成。\n还可以另外买几个小型的tc-\u0026gt;usb做备用，也方便携带。（我觉得应该向绿联要点广告费~）\n鼠标 用mbp的前两年一直用触摸板，即使多屏后使用mbp作为副屏时也是如此。但后面实在感觉手指按得久了有点疼，就用了苹果自家的MagicMouse，这玩意是真的贵（还好我用的公司的😝 离职了，现在买了2个，公司和家里各放一个）~ 不过体验是真的好。推荐买买买！！\n支架 建议外接键盘的多屏用户购买一个支架。好处是可以把mac撑高，使主副屏之间的视线差不会太大；另一方面方便散热\n清理屏幕 Mac的屏幕挺难清理的，用纸巾或普通的布擦了之后，往往还有一层油渍的感觉。直到我在知乎看到有人用汽车布\u0026hellip;\u0026hellip;我在JD搜了个汽车布，买回来擦了一下，真的好用，屏幕焕然一新。\n熟悉基本操作 从windows过来的同学可能会有一些不习惯，花个一周就好了。\n键位/快捷键 复制粘贴：command+c/v，建议指法：左右手正常放在键盘的情况下，左手拇指从空格移动到cmd键（手腕不用动），左手食指触击c/v。这是我认为最舒服的指法了~ 删除文件：finder（访达）选中文件，cmd + delete 多选非连续文件：cmd + 鼠标点击 在finder（访达）跳转到指定目录：cmd + shift + g，然后输入目录后按enter 切换窗口：ctrl + 方向键左右 触摸板 三指左右滑动：切换桌面 三指向上扫：打开调度中心 四指向中间抓：打开启动台 四指从中间向外推开：显示桌面 想要修改设置 或 查看详细说明：系统偏好设置 -\u0026gt; 触控板\n文件系统 这方面确实比较差，没有windows做得好必须承认。以前看过一些文章，有的朋友用标签去归档文件（我用得不多），也曾买过网友写的文件管理器Qspace，现在也扔在一边了，也不知道更新得咋样了。可能习惯了没有文件管理器的日子吧，貌似也不觉得有太大影响。ps. 小技巧：你可以将你经常访问的目录拖动到访达 -\u0026gt; 个人收藏侧边栏，作为一个快速入口\n输入法 自带的我很不喜欢，无法通过shift切换中/英文；中文状态下，输入英文后按shift或enter键都无法将字符打下来。所以我使用的是搜狗输入法，再换个喜欢的皮肤，很棒。\n系统偏好设置 按键速度\n场景：长按一个键，默认速度很慢，例如在命令行需要将光标移动到左/右边时，我们希望长按方向左/右键能快速移动。\n设置：系统偏好设置-\u0026gt;键盘。我的设置如图，可作参考：\n锁屏快捷方式\n场景：离开工位时习惯锁屏，将鼠标移动到左下角（可设置）就锁屏啦~\n设置：系统偏好设置-\u0026gt;桌面与屏幕保护程序\n权限相关 从网上下载的软件，打开提示\u0026quot;xx已损坏，请移至废纸篓\u0026quot;:\n莫慌，打开终端，输入 sudo spctl --master-disable ，再次打开软件看看是不是好了\n使用sudo也无法干一些越权限的事？\n别慌，只是权限还不够。关机完毕后，按cmd+R不松开，开机后会进入恢复模式。上方bar点击 实用工具 -\u0026gt; terminal 打开终端，输入命令 csrutil disable 。重启后就可以用sudo为所欲为了\n解除登录密码严格格式限制\n新版本的系统对账户登录密码的格式有严格要求，需要包含数字字母特殊字符，在终端输入 pwpolicy -clearaccountpolicies 可以解除该限制\n多显示器 [admonition]多个显示器真的能很大地提高生产力，希望你也有。[/admonition]\n相关设置：系统偏好设置-\u0026gt;显示器\n拖动显示器显示位置\n点击排列tab，拖动显示器位置。按你实际摆放位置拖动到对应位置即可。\n切换主显示器\n默认主显示器在mac显示器，如果你的主屏在其他屏幕，建议拖动小白条到你的主显示器。这样消息推送也会在你的主屏显示。如下图所示，那个小白条是可以移动的。\n其他细节 我习惯将主要使用的软件放大为全屏（独立占满一个桌面），然后通过三指左右滑动切换不同软件（桌面）。这样避免了鼠标在同一个桌面点击不同窗口 关闭应用程序：点击左上角的x只是最小化，要想完全关闭应用，需要在程序坞右击应用，点击退出 日常软件/效率工具推荐 [admonition]终于到这一环节了，忍不住有些好东西要分享给你们。（下面会有收费软件，请不要问我在哪里破解之类的，请支持正版直接购买，或者你自己去找办法😬）[/admonition]\n办公套件 推荐WPS，如果你不是经常使用高级公式等功能的话，wps绝对够用了。我曾经用过接近两年office，感觉bug还是蛮多的，偶尔还会崩溃。\n记事本、随手草稿：推荐sublimeText。从windows就一直用，做草稿、临时备忘录之类的非常方便\nhomebrew [免费] mac下的软件管理器，类似Centos的yum，Ubuntu的apt。必备！\n官网：\u0026gt;\u0026gt;Click\u0026laquo;，或者网络找找说明，例如 这篇\niTerm2 [免费] 一款终端软件，相较于mac自带的终端，我喜欢这个实在太多了。列几点我喜欢的点吧：\n分屏：cmd+d 、 cmd + shift + d (关闭窗口：cmd + w) 在屏幕搜索文字：cmd + F 恢复窗口：如果误关闭窗口，5秒内 cmd+ z 可以恢复 广播命令：打开多个分屏时，每个屏幕打开一台服务器；在每个panel右击菜单点击“Toggle Broadcasting Input”，然后你任意在一个panel输入命令，会同步到其它panel。这个简直是运维神器，不需要ansible之类工具就能做到批量部署 自定义script，这个就比较高级了。可以编写脚本做一些自动化的东西，有兴趣的同学自行搜索：iTerm2 Scripts 下拉半透明悬浮窗：想在任意窗口临时调用终端时很方便，这里不多介绍。自行搜索：iTerm2 Hotkey Window 好用的命令（与iTerm2无直接关系）：\n剪贴板利器：pbcopy 和 pbpaste。例如从程序标准输出复制到剪贴板：node test.js | pbcopy ；将剪贴板的base64字符串deocde出来：pbpaste | base64 -D 打开当前终端所在目录：命令行执行：open . 语音说话： say 你想让它说的话 ，例如 say i am foam zou , 还支持多国语言哦 更好看的主题：也和iTerm2无关。可以参看我另一篇文章《从fish切换到zsh》 Snipaste [高级功能收费] 贴图工具，可以将截图贴在屏幕上。（win的qq有这个功能，mac的没有）\n这个工具节省了我很多时间，提升了很多效率。当你觉得屏幕不够用，又没有办法新添屏幕的时候，我觉得你此时需要这个软件，相信我！！\nHidden Bar [免费] Mac 顶部菜单栏，一旦摆放了很多应用图标就会显得很乱，而且有些图标是无法设置隐藏的。\n这时可以使用 Hidden Bar , 它可以帮你把不希望显示的图标给收缩进去。当然这款应用也不算完美，如果有发现更好的，会在这里补充。\nCharles [收费] mac下的抓包工具，类似win下的fiddler。列几点我觉得ok的功能：\n基本的抓包：能抓http[s]、websocket Map Remote：将请求地址 map 到另一个地址，在测试时特别好用 模拟慢速网络 压力测试：用repeat并发功能 copy curl：将请求作为curl复制出来（现代浏览器，如chrome也有） 篡改替换报文 Chrome插件 [免费] 我不知道chrome插件为什么会安排到本文，也许是任性吧~\nSwitchyOmega：科学上网你懂的 FeHelper：常用的小工具都有了 Modify Headers：可以修改header，测试时特别好用 Octotree：常逛github的你，必备。可以将仓库代码梳理成一个树状文件列表，挂到页面左侧 onetab：浏览器经常放着几十个tab舍不得关掉，用它！！ 广告终结者：这个不用说了吧，清爽 Dualsub：生啃YouTube的你可能需要这个双语展示插件 Video Resumer: YouTube 竟然不支持 在上次离开的地方继续播放 ， amazing。可以用这个插件来实现该功能。 Git工具 一般命令行就能满足日常需求了 JetBrains公司系列产品[收费]（PHPstorm、webstorm、Goland、CLion等）都内置了git工具，很好用 Sourcetree [免费] 这款软件也很多同学在用，图形化界面很好看 虚拟机 Parallel desktop [收费]\n优秀的虚拟机软件。有时候，一些事需要在windows下才能办，就只能装一个虚拟机了。\n比vmware好用很多，使用融合模式的话，你甚至察觉不出哪个是虚拟机（当然我也很少用融合模式）。\nDocker[免费]\n如果你是linux开发，且mac的库不能满足你，建议安装docker，下载对应系统镜像。代码目录映射进去，开发在mac，调试运行在对应终端\n流量（网速）监控 [收费] 我用的是 iStat Menus。当然除了网速监控，它还可以看cpu温度啥的。我主要用来看网速啦~ ps.它会显示在顶部bar\n我现在用的是自己写的网速监控工具，已开源。GitHub链接\n鼠标反向 [免费] 我用的 Scroll Reverser 。因为mac与win的鼠标滚轮方向不一致，一开始很不习惯，就用了这个软件。现在基本没用过了\nSwitchHosts [免费] host切换神器，也是开发神器，谁用谁知道。管理host非常方便。\n数据库管理工具TablePlus [收费] 除了管理常用数据库外，redis也是可以的哦。\n与其他数据库软件比有什么特别的点呢：\n修改多个数据后，不会马上生效。按下cmd + s 才会落地保存 在落地保存之前，你修改的数据记录（包括表结构修改）会以sql的形式展示在修改历史，保存前你可以复制下来，上线前记录在备忘录 Alfred [workflow功能收费] 终于讲到这个超级神器了。我用的3，现在已经出到4了。如果你不想付费，可以使用 uTools ，这是免费的\n设置呼唤热键：我设置成了 连续按cmd2次\n文件搜索：find 要搜索的文件(下图1) 、 打开软件：直接键入软件名（下图2）. ps: 当然，mac自带的聚焦搜索也可以办到，但有时候感觉没那么聪明\n各种workflows工具 是的，workflow才是提高效率的根本，我用了一些第三方插件，例如有道词典，也自己写了一些插件，例如时间戳转换、生成UUID、CDN上传器\n本文的所有图片都是通过我的cdn上传插件粘贴的，我只需要截图，再按一个快捷键，就会生成一个图片链接。\n除此之外，还有灰常多好用的插件。还有些是我平时工作用的，就不放出来了，例如excel多行数据转换成php的数组（运营提供数据给我的时候，特别好用）。\n快利用它提高你的工作效率吧~\n数据安全/备份 备份\n最好买一个移动硬盘（1T应该够了），定期打开系统自带的时间机器（TimeMachine）进行备份；\n后面换新电脑了，插上硬盘，直接用时间机器恢复也非常方便\n误删文件\n如果文件在JB系列的IDE里管理，那么还可以通过local history恢复；如果不在，恰巧你又喜欢用rm删除文件那就不好了。建议给你的rm命令做个回收站，可参考我这篇文章《给你的Mac/Linux的rm装一个回收站》\nBug fix 右侧的 Touch bar 没有反应 killall ControlStrip\n先到这里，后面会有机会补充的。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/mac-started-guide/","summary":"\u003cp\u003e[admonition]这几年推荐过身边不少朋友买Mac，开箱后，我通常会给一些使用心得和常用的工具。正巧今天又有一位朋友买了mac，这次干脆直接将我的使用心得整理成文章。已经有使用经验的朋友可以直接拉到最下面看看我推荐的效率工具鸭~[/admonition]\u003c/p\u003e\n\u003ch2 id=\"开箱\"\u003e开箱\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e检查外表\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e检查外表、屏幕等是否有损伤\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e序列号\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e官网查询序列号，判断型号、保修期是否正常。\u003ca href=\"https://checkcoverage.apple.com/cn/zh\"\u003e传送门\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e关于applecare+服务的购买建议\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这个延保服务我还是建议大家购买的，毕竟mac保修只有1年（主要部件2年，江苏省主要部件3年），而applecare可以将保修期延长到3年（自机器购买之日起）。\u003cstrong\u003e注意\u003c/strong\u003e，这个服务只能在购机60天内买，超过时间就买不了了，所以建议在购机的时候就一起买了。\u003c/p\u003e\n\u003cp\u003e为什么我推荐大家买呢，因为mbp的品控的确不太好，而且现在里边的部件集成度做得太高，例如有次我的一个充电口充不了电，拿去修说要换掉主板，因为是焊在一起的。还好那时候还在保，否则要花费2k貌似。坏1次基本就回本的（咦，听起来怪怪的）\u003c/p\u003e\n\u003ch2 id=\"周边配件\"\u003e周边配件\u003c/h2\u003e\n\u003ch3 id=\"拓展坞\"\u003e拓展坞\u003c/h3\u003e\n\u003cp\u003e现在的mbp都没有usb、hdmi等接口了，全都是typc-c，所以此时需要一个拓展坞。有钱直接官网买，像我一样没钱的可以考虑买绿联家的。下图1有几个usb和1个hdmi，按需购买，有的拓展坞是vga、网口等的集成。\u003c/p\u003e\n\u003cp\u003e还可以另外买几个小型的tc-\u0026gt;usb做备用，也方便携带。（我觉得应该向绿联要点广告费~）\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/mac-started-guide/66cd5248-a2ef-4722-8a26-46ac10aa949c.png\"\u003e\u003c/p\u003e\n\u003cp\u003e \u003cimg loading=\"lazy\" src=\"/posts/mac-started-guide/73942bed-2749-4049-bcd1-984d9516d799.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"鼠标\"\u003e鼠标\u003c/h3\u003e\n\u003cp\u003e用mbp的前两年一直用触摸板，即使多屏后使用mbp作为副屏时也是如此。但后面实在感觉手指按得久了有点疼，就用了苹果自家的MagicMouse，这玩意是真的贵（还好我用的公司的😝 离职了，现在买了2个，公司和家里各放一个）~ 不过体验是真的好。推荐买买买！！\u003c/p\u003e\n\u003ch3 id=\"支架\"\u003e支架\u003c/h3\u003e\n\u003cp\u003e建议外接键盘的多屏用户购买一个支架。好处是可以把mac撑高，使主副屏之间的视线差不会太大；另一方面方便散热\u003c/p\u003e\n\u003ch3 id=\"清理屏幕\"\u003e清理屏幕\u003c/h3\u003e\n\u003cp\u003eMac的屏幕挺难清理的，用纸巾或普通的布擦了之后，往往还有一层油渍的感觉。直到我在知乎看到有人用汽车布\u0026hellip;\u0026hellip;我在JD搜了个汽车布，买回来擦了一下，真的好用，屏幕焕然一新。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/mac-started-guide/deced837-34c5-4227-b160-6b1fbd4d1539.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"熟悉基本操作\"\u003e熟悉基本操作\u003c/h2\u003e\n\u003cp\u003e从windows过来的同学可能会有一些不习惯，花个一周就好了。\u003c/p\u003e\n\u003ch3 id=\"键位快捷键\"\u003e键位/快捷键\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e复制粘贴\u003c/strong\u003e：command+c/v，建议指法：左右手正常放在键盘的情况下，左手拇指从空格移动到cmd键（手腕不用动），左手食指触击c/v。这是我认为最舒服的指法了~\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e删除文件\u003c/strong\u003e：finder（访达）选中文件，cmd + delete\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e多选非连续文件\u003c/strong\u003e：cmd + 鼠标点击\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e在finder（访达）跳转到指定目录\u003c/strong\u003e：cmd + shift + g，然后输入目录后按enter\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e切换窗口\u003c/strong\u003e：ctrl + 方向键左右\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"触摸板\"\u003e触摸板\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e三指左右滑动：切换桌面\u003c/li\u003e\n\u003cli\u003e三指向上扫：打开调度中心\u003c/li\u003e\n\u003cli\u003e四指向中间抓：打开启动台\u003c/li\u003e\n\u003cli\u003e四指从中间向外推开：显示桌面\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e想要修改设置 或 查看详细说明：系统偏好设置 -\u0026gt; 触控板\u003c/p\u003e\n\u003ch3 id=\"文件系统\"\u003e文件系统\u003c/h3\u003e\n\u003cp\u003e这方面确实比较差，没有windows做得好必须承认。以前看过一些文章，有的朋友用标签去归档文件（我用得不多），也曾买过网友写的文件管理器Qspace，现在也扔在一边了，也不知道更新得咋样了。可能习惯了没有文件管理器的日子吧，貌似也不觉得有太大影响。ps. 小技巧：你可以将你经常访问的目录拖动到访达 -\u0026gt; 个人收藏侧边栏，作为一个快速入口\u003c/p\u003e\n\u003ch3 id=\"输入法\"\u003e输入法\u003c/h3\u003e\n\u003cp\u003e自带的我很不喜欢，无法通过shift切换中/英文；中文状态下，输入英文后按shift或enter键都无法将字符打下来。所以我使用的是搜狗输入法，再换个喜欢的皮肤，很棒。\u003c/p\u003e\n\u003ch3 id=\"系统偏好设置\"\u003e系统偏好设置\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003e按键速度\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e场景：长按一个键，默认速度很慢，例如在命令行需要将光标移动到左/右边时，我们希望长按方向左/右键能快速移动。\u003c/p\u003e\n\u003cp\u003e设置：系统偏好设置-\u0026gt;键盘。我的设置如图，可作参考：\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/mac-started-guide/c4ea6704-f5f2-4f2a-88e8-0b2043dca15e.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e锁屏快捷方式\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e场景：离开工位时习惯锁屏，将鼠标移动到左下角（可设置）就锁屏啦~\u003c/p\u003e\n\u003cp\u003e设置：系统偏好设置-\u0026gt;桌面与屏幕保护程序\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/mac-started-guide/f64d180b-6fb0-4fde-ae46-6342655581a8.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"权限相关\"\u003e权限相关\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003e从网上下载的软件，打开提示\u0026quot;xx已损坏，请移至废纸篓\u0026quot;\u003c/strong\u003e:\u003c/p\u003e\n\u003cp\u003e莫慌，打开终端，输入 \u003ccode\u003esudo spctl --master-disable\u003c/code\u003e ，再次打开软件看看是不是好了\u003c/p\u003e","title":"Mac从入门到效率工具"},{"content":"楔子 [admonition] 今天朋友找我解决一个问题，他的java服务在阿里服务器里监听了某端口（使用的TCP），但通过公网无法连接。我尝试在本地telnet那个端口（跨公网），不通。在他服务器里telnet 127.0.0.1 端口，是通的。说明服务正常监听了端口。但由于我不熟悉他的java服务，无法判断该java服务是否只监听了本地回环地址。 因此公网无法访问大概有两种可能，一，java服务只监听了本地回环地址； 二、防火墙限制了端口 排除第二种情况对我来说比较简单，我通过netcat在服务器监听端口，然后在本地telnet，不通！说明问题的确出在防火墙身上。该服务器为Ubuntu，使用ufw status查看防火墙状态，显示为inactive，也就是关闭状态。再查看阿里云安全组规则，已经开放了tcp/udp的所有端口(-1/-1)。后面我再次执行ufw disable，端口就通了。所以这是ufw的bug？ [/admonition] 引子有点长了。主要是为了说明，如果想知道与服务器之间的tcp连接是否通，可以使用netcat工具去判断。下面介绍下netcat ~\nnetcat是什么 是一种计算机网络实用程序，用于使用TCP或UDP读写网络连接，号称 TCP/IP 的瑞士军刀。大家一般简写为nc。总之，涉及到网络的事儿，它几乎都能做。为什么叫瑞士军刀，因为它体积很小，不同版本的nc可执行文件只有几十k到300多k，而且大部分linux发行版都有预安装。\n各种版本 netcat有许多版本，能力从弱到强为：GUN、BSD、Ncat。基础功能三者都一样，不同的是一些版本额外内置了些高级/有趣的功能（例如Ncat有个参数--chat，可以创建匿名聊天室）。 大部分centos6内置的是BSD版本的nc，我的Centos7里边内置的nc是Ncat（属于nmap工具集里边） 使用man nc，拉到最下边可以看到你的nc版本。（使用man你基本能够查阅所有的用法了，其它软件也是如此，只要是标准安装的） ps. socat号称是更为强大的nc，有兴趣的小伙伴可以自己去看看。\n用途 检查端口通不通 以往我一直使用telnet来判断某个端口是否通，但telnet是基于tcp协议的，如果要判断udp端口就无能为力了。这时可以使用nc来判断。为了方便实验，本文统一使用同一台机器模拟服务端和客户端。\n# 咱们使用nc创建一个tcp协议监听的端口。-l为listen，默认协议为tcp nc -l 8088 # 使用nc连上该端口。-v(verbose)用于显示更多信息，-z（zero I/O）表示不发送数据包，仅显示连接状态。 # 下面succeed表示端口是通的 nc -vz 127.0.0.1 8088 Connection to 127.0.0.1 8088 port [tcp/radan-http] succeeded! # 创建一个udp端口。-u指使用udp协议 nc -lu 8088 # 同样，加一个u表示使用udp连接该端口，同时你会看到服务端打印出若干个X。 # 不是说加了z参数就不会发数据包吗，为什么服务端收到了报文？我认为udp是无连接状态的，通过系统调用write # 往该套接字发数据，通过返回值才知道包发出去没有，从而判断udp端口是否通 nc -vzu 127.0.0.1 8088 Connection to 127.0.0.1 8088 port [udp/radan-http] succeeded! 端口扫描 # 扫描tcp端口。-w(wait)指定连接超时时间，单位秒。 # 连接成功的端口将作为标准输出 nc -v -w3 -z 127.0.0.1 1-65535 | tee succeed_port.log # 下面摘抄部分连接成功的端口 Connection to 127.0.0.1 22 port [tcp/ssh] succeeded! Connection to 127.0.0.1 25 port [tcp/smtp] succeeded! Connection to 127.0.0.1 80 port [tcp/http] succeeded! Connection to 127.0.0.1 443 port [tcp/https] succeeded! Connection to 127.0.0.1 1100 port [tcp/mctp] succeeded! Connection to 127.0.0.1 1111 port [tcp/lmsocialserver] succeeded! Connection to 127.0.0.1 2255 port [tcp/vrtp] succeeded! Connection to 127.0.0.1 3001 port [tcp/*] succeeded! Connection to 127.0.0.1 3306 port [tcp/mysql] succeeded! Connection to 127.0.0.1 4300 port [tcp/corelccam] succeeded! Connection to 127.0.0.1 4369 port [tcp/epmd] succeeded! Connection to 127.0.0.1 5672 port [tcp/amqp] succeeded! Connection to 127.0.0.1 6553 port [tcp/*] succeeded! # 扫描udp端口。nc -v -zu 127.0.0.1 1-65535 # 以下为我本地扫描结果 Connection to 127.0.0.1 636 port [udp/ldaps] succeeded! Connection to 127.0.0.1 35157 port [udp/*] succeeded! Connection to 127.0.0.1 54890 port [udp/*] succeeded! 文件传输 归根到底都是创建一个tcp/udp连接，通过连接收发数据而已。所以，无论数据是ascii字符串，二进制文件都可以发送/接收。 为了加快传输速率/加密，你甚至还可以在发送之前对数据进行压缩/加密。 对于大文件，个人认为还是scp、rsync这类专业的工具靠谱。小文件可以试试这种方法，毕竟简单，不需要ssh认证。\n# 接收端监听端口，把数据包重定向到指定文件 nc -l 8085 \u0026gt; file.ext # 发送方往指定ip:端口发送数据 nc 127.0.0.1 8085 \u0026lt; file.ext ssh代理 是的，可以用作ssh代理！！如果某台内网机器需要通过代理才能连接，那么给ssh配置个代理是个不错的选择。这样ssh和scp都可以正常访问那台机器。 主要是利用了ssh的ProxyCommand选项，例如你要访问的机器ip为1.2.3.4，代理ip:端口为5.6.7.8:1988，那么编辑 ~/.ssh/config\nHost 1.2.3.4 ProxyCommand nc -X 5 -x 5.6.7.8:1988 %h %p -X指定代理协议，默认为5 (socks5)，还有其他选项：4(socks4)、connect(https) -x指定代理地址[端口]\n网络测速 接收端：\nnc -l port \u0026gt; /dev/null 发送端：\ndd if=/dev/zero bs=9100004096 count=1 | nc 接收端ip port 最后你会看到结果： 2147479552 bytes (2.1 GB) copied, 12.7978 s, 168 MB/s\n其它 另外还可以做以下事情，但我觉得一般来说用处不大。ps. 有些版本的nc可能参数有所差异或没有对应的特性\n远程执行shell/bash。例子：服务端执行 nc -l 8083 -e /bin/bash（或shell），客户端 nc 127.0.0.1 8083，然后客户端就可以执行bash/shell了。但这种用法不要在公网用，否则很危险呐 网速测试(已补充到本文)。 啊，编不出来了~ ps. 有啥实用/有趣的用途，欢迎留言。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/what-can-netcat-do/","summary":"\u003ch2 id=\"楔子\"\u003e楔子\u003c/h2\u003e\n\u003cp\u003e[admonition] 今天朋友找我解决一个问题，他的java服务在阿里服务器里监听了某端口（使用的TCP），但通过公网无法连接。我尝试在本地telnet那个端口（跨公网），不通。在他服务器里telnet 127.0.0.1 端口，是通的。说明服务正常监听了端口。但由于我不熟悉他的java服务，无法判断该java服务是否只监听了本地回环地址。 因此公网无法访问大概有两种可能，一，java服务只监听了本地回环地址； 二、防火墙限制了端口 排除第二种情况对我来说比较简单，我通过netcat在服务器监听端口，然后在本地telnet，不通！说明问题的确出在防火墙身上。该服务器为Ubuntu，使用\u003ccode\u003eufw status\u003c/code\u003e查看防火墙状态，显示为\u003ccode\u003einactive\u003c/code\u003e，也就是关闭状态。再查看阿里云安全组规则，已经开放了tcp/udp的所有端口(-1/-1)。后面我再次执行\u003ccode\u003eufw disable\u003c/code\u003e，端口就通了。所以这是ufw的bug？ [/admonition] 引子有点长了。主要是为了说明，如果想知道与服务器之间的tcp连接是否通，可以使用netcat工具去判断。下面介绍下netcat ~\u003c/p\u003e\n\u003ch2 id=\"netcat是什么\"\u003enetcat是什么\u003c/h2\u003e\n\u003cp\u003e是一种计算机网络实用程序，用于使用TCP或UDP读写网络连接，号称 TCP/IP 的瑞士军刀。大家一般简写为\u003ccode\u003enc\u003c/code\u003e。总之，涉及到网络的事儿，它几乎都能做。为什么叫瑞士军刀，因为它体积很小，不同版本的nc可执行文件只有几十k到300多k，而且大部分linux发行版都有预安装。\u003c/p\u003e\n\u003ch2 id=\"各种版本\"\u003e各种版本\u003c/h2\u003e\n\u003cp\u003enetcat有许多版本，能力从弱到强为：GUN、BSD、Ncat。基础功能三者都一样，不同的是一些版本额外内置了些高级/有趣的功能（例如Ncat有个参数\u003ccode\u003e--chat\u003c/code\u003e，可以创建匿名聊天室）。 大部分centos6内置的是BSD版本的nc，我的Centos7里边内置的nc是Ncat（属于nmap工具集里边） 使用\u003ccode\u003eman nc\u003c/code\u003e，拉到最下边可以看到你的nc版本。（使用man你基本能够查阅所有的用法了，其它软件也是如此，只要是标准安装的） ps. socat号称是更为强大的nc，有兴趣的小伙伴可以自己去看看。\u003c/p\u003e\n\u003ch2 id=\"用途\"\u003e用途\u003c/h2\u003e\n\u003ch3 id=\"检查端口通不通\"\u003e检查端口通不通\u003c/h3\u003e\n\u003cp\u003e以往我一直使用telnet来判断某个端口是否通，但telnet是基于tcp协议的，如果要判断udp端口就无能为力了。这时可以使用nc来判断。为了方便实验，本文统一使用同一台机器模拟服务端和客户端。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 咱们使用nc创建一个tcp协议监听的端口。-l为listen，默认协议为tcp\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enc -l 8088\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 使用nc连上该端口。-v(verbose)用于显示更多信息，-z（zero I/O）表示不发送数据包，仅显示连接状态。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 下面succeed表示端口是通的\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enc -vz 127.0.0.1 8088\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eConnection to 127.0.0.1 8088 port [tcp/radan-http] succeeded!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 创建一个udp端口。-u指使用udp协议\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enc -lu 8088\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 同样，加一个u表示使用udp连接该端口，同时你会看到服务端打印出若干个X。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 不是说加了z参数就不会发数据包吗，为什么服务端收到了报文？我认为udp是无连接状态的，通过系统调用write\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 往该套接字发数据，通过返回值才知道包发出去没有，从而判断udp端口是否通\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enc -vzu 127.0.0.1 8088\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eConnection to 127.0.0.1 8088 port [udp/radan-http] succeeded!\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"端口扫描\"\u003e端口扫描\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 扫描tcp端口。-w(wait)指定连接超时时间，单位秒。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 连接成功的端口将作为标准输出\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enc -v -w3 -z 127.0.0.1 1-65535 | tee succeed_port.log\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 下面摘抄部分连接成功的端口\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Connection to 127.0.0.1 22 port [tcp/ssh] succeeded!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Connection to 127.0.0.1 25 port [tcp/smtp] succeeded!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Connection to 127.0.0.1 80 port [tcp/http] succeeded!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Connection to 127.0.0.1 443 port [tcp/https] succeeded!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Connection to 127.0.0.1 1100 port [tcp/mctp] succeeded!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Connection to 127.0.0.1 1111 port [tcp/lmsocialserver]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e succeeded! Connection to 127.0.0.1 2255 port [tcp/vrtp]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e succeeded! Connection to 127.0.0.1 3001 port [tcp/*]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e succeeded! Connection to 127.0.0.1 3306 port [tcp/mysql]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e succeeded! Connection to 127.0.0.1 4300 port [tcp/corelccam] succeeded!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Connection to 127.0.0.1 4369 port [tcp/epmd] succeeded!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Connection to 127.0.0.1 5672 port [tcp/amqp] succeeded!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Connection to 127.0.0.1 6553 port [tcp/*] succeeded!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 扫描udp端口。nc -v -zu 127.0.0.1 1-65535\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 以下为我本地扫描结果\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eConnection to 127.0.0.1 636 port [udp/ldaps] succeeded!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eConnection to 127.0.0.1 35157 port [udp/*] succeeded!\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eConnection to 127.0.0.1 54890 port [udp/*] succeeded!\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"文件传输\"\u003e文件传输\u003c/h3\u003e\n\u003cp\u003e归根到底都是创建一个tcp/udp连接，通过连接收发数据而已。所以，无论数据是ascii字符串，二进制文件都可以发送/接收。 为了加快传输速率/加密，你甚至还可以在发送之前对数据进行压缩/加密。 对于大文件，个人认为还是scp、rsync这类专业的工具靠谱。小文件可以试试这种方法，毕竟简单，不需要ssh认证。\u003c/p\u003e","title":"使用netcat能够做什么"},{"content":"背景 背景就是我把线上某张表的某个字段给清空了。用的是腾讯云的数据库实例，运维配置的快照是每天早上备份一次，因此可以通过快照文件恢复数据。直接恢复到线上实例是不现实的，所以想法是将快照恢复到本地实例，然后用脚本/工具把数据导出来，再写入线上实例。当时恢复过程比较曲折，这里记录下比较好的操作步骤。\n获取xb文件 从云服务商或你自行备份的xb文件中获取。腾讯云 这里 可找到备份列表\n安装xbstream和qpress工具 腾讯云使用qpress压缩文件，再通过xbsteam打包为xb文件。[参考腾讯云文章]\n安装xbstream 下载并安装 XtraBackup 工具。 下载地址请参见 Percona XtraBackup 官网，请选择 Percona XtraBackup 2.4.6 及以上的版本，安装介绍请参见 Percona XtraBackup 2.4。 支持的实例版本：MySQL 5.5、5.6、5.7 高可用版和金融版。 启用数据加密功能的实例，不支持使用物理备份恢复数据库。 我使用的是mac，使用brew进行安装 brew install percona-xtrabackup\n安装qpress 从quicklz下载编译好的二进制文件。 我的mac无法直接使用linux的可执行文件，所以从上面网站下载源码，编译安装。 mac编译qpress时报错\nqpress.cpp:1040:18: error: use of undeclared identifier \u0026#39;isatty\u0026#39; tty_stderr = isatty(fileno(stderr)); ^ 1 error generated. make: *** [g++] Error 1 qpress.cpp 添加头文件 #include \u0026lt;unistd.h\u0026gt; 重新编译成功。将编译好的qpress拷贝到 /usr/local/bin 。必须放到该目录下，因为xbstream工具调用qpress是用的绝对路径(为啥这样设计￣□￣｜｜)\n对xb文件进行解包\u0026amp;解压缩 xbstream -x -C /tmp/新建的目录 \u0026lt; ~/你的xb文件.xb # 使用 xbstream 命令将备份文件解包到目标目录 xtrabackup --decompress --target-dir=/tmp/新建的目录 # 将目标目录下所有以.qp结尾的文件都解压出来 将解压出来的frm、ibd文件附到本地mysql实例 腾讯云的方法 腾讯云文档的方法是起一个mysqld_safe实例将data配置为刚刚那个新建的目录\n步骤4：Prepare 备份文件 备份解压出来之后，执行如下命令进行 apply log 操作。\nxtrabackup \u0026ndash;prepare \u0026ndash;target-dir=/data\n执行后若结果中包含如下输出，则表示 prepare 成功。 步骤5：修改配置文件 执行如下命令打开backup-my.cnf文件。\nvi /data/backup-my.cnf\n说明：\n本文以目标目录/data为例，您可以根据实际情况将其替换成实际路径。\n由于存在的版本问题，请将解压文件backup-my.cnf中如下参数进行注释。\ninnodb_checksum_algorithm innodb_log_checksum_algorithm innodb_fast_checksum innodb_page_size innodb_log_block_size redo_log_version 步骤6：修改文件属性 修改文件属性，并检查文件所属为 mysql 用户。\nchown -R mysql:mysql /data\n步骤7：启动 mysqld 进程并登录验证 启动 mysqld 进程。\nmysqld_safe \u0026ndash;defaults-file=/data/backup-my.cnf \u0026ndash;user=mysql \u0026ndash;datadir=/data \u0026amp;\n客户端登录 mysql 验证。\nmysql -uroot\n我的方法 为什么我不用腾讯云的方法呢。因为现在整理写博客时才看到。盆友们可以试试吧，如果行不通的话，可以用我的方法。ps.平时从别的实例拷贝.ibd/.frm到新实例也可以用该方法\n在你的实例新建一个同名数据库 在刚创建的数据库里创建需要恢复的table 删除对应表的.ibd文件：ALTER TABLE 你的表名 DISCARD TABLESPACE; 将上面解压的.ibd文件拷贝到mysql实例加载的data/数据库名/ 目录下 将新的.ibd文件加载到新表：ALTER TABLE 你的表名 IMPORT TABLESPACE; 以上方法参考自mysql官方文档 自此数据恢复到新实例，可以操作数据了~\n","permalink":"https://blog-foamzou-com.pages.dev/posts/recover-snapshot-xb-file-to-mysql-new-instance/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e背景就是我把线上某张表的某个字段给清空了。用的是腾讯云的数据库实例，运维配置的快照是每天早上备份一次，因此可以通过快照文件恢复数据。直接恢复到线上实例是不现实的，所以想法是将快照恢复到本地实例，然后用脚本/工具把数据导出来，再写入线上实例。当时恢复过程比较曲折，这里记录下比较好的操作步骤。\u003c/p\u003e\n\u003ch2 id=\"获取xb文件\"\u003e获取xb文件\u003c/h2\u003e\n\u003cp\u003e从云服务商或你自行备份的xb文件中获取。腾讯云 \u003ca href=\"https://console.cloud.tencent.com/cdb/backup\"\u003e这里\u003c/a\u003e 可找到备份列表\u003c/p\u003e\n\u003ch2 id=\"安装xbstream和qpress工具\"\u003e安装xbstream和qpress工具\u003c/h2\u003e\n\u003cp\u003e腾讯云使用qpress压缩文件，再通过xbsteam打包为xb文件。[参考腾讯云\u003ca href=\"https://cloud.tencent.com/document/product/236/33363\"\u003e文章\u003c/a\u003e]\u003c/p\u003e\n\u003ch3 id=\"安装xbstream\"\u003e安装xbstream\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003cul\u003e\n\u003cli\u003e下载并安装 XtraBackup 工具。 下载地址请参见 \u003ca href=\"https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/\"\u003ePercona XtraBackup 官网\u003c/a\u003e，请选择 Percona XtraBackup 2.4.6 及以上的版本，安装介绍请参见 \u003ca href=\"https://www.percona.com/doc/percona-xtrabackup/2.4/installation.html?spm=a2c4g.11186623.2.14.4d8653a6QmHkgI\"\u003ePercona XtraBackup 2.4\u003c/a\u003e。\u003c/li\u003e\n\u003cli\u003e支持的实例版本：MySQL 5.5、5.6、5.7 高可用版和金融版。\u003c/li\u003e\n\u003cli\u003e启用数据加密功能的实例，不支持使用物理备份恢复数据库。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e我使用的是mac，使用brew进行安装 \u003ccode\u003ebrew install percona-xtrabackup\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"安装qpress\"\u003e安装qpress\u003c/h3\u003e\n\u003cp\u003e  从\u003ca href=\"http://www.quicklz.com/\"\u003equicklz\u003c/a\u003e下载编译好的二进制文件。 我的mac无法直接使用linux的可执行文件，所以从上面网站下载源码，编译安装。 mac编译qpress时报错\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eqpress.cpp:1040:18: error: use of undeclared identifier \u003cspan class=\"s1\"\u003e\u0026#39;isatty\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003etty_stderr\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e isatty\u003cspan class=\"o\"\u003e(\u003c/span\u003efileno\u003cspan class=\"o\"\u003e(\u003c/span\u003estderr\u003cspan class=\"o\"\u003e))\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                 ^\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e error generated.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emake: *** \u003cspan class=\"o\"\u003e[\u003c/span\u003eg++\u003cspan class=\"o\"\u003e]\u003c/span\u003e Error \u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eqpress.cpp 添加头文件 #include \u0026lt;unistd.h\u0026gt; 重新编译成功。将编译好的qpress拷贝到 /usr/local/bin 。必须放到该目录下，因为xbstream工具调用qpress是用的绝对路径(为啥这样设计￣□￣｜｜)\u003c/p\u003e\n\u003ch3 id=\"对xb文件进行解包解压缩\"\u003e对xb文件进行解包\u0026amp;解压缩\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003exbstream -x -C /tmp/新建的目录 \u0026lt; ~/你的xb文件.xb \u003cspan class=\"c1\"\u003e# 使用 xbstream 命令将备份文件解包到目标目录\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003extrabackup --decompress --target-dir\u003cspan class=\"o\"\u003e=\u003c/span\u003e/tmp/新建的目录 \u003cspan class=\"c1\"\u003e# 将目标目录下所有以.qp结尾的文件都解压出来\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"将解压出来的frmibd文件附到本地mysql实例\"\u003e将解压出来的frm、ibd文件附到本地mysql实例\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003e腾讯云的方法\u003c/strong\u003e 腾讯云文档的方法是起一个mysqld_safe实例将data配置为刚刚那个新建的目录\u003c/p\u003e","title":"恢复数据库快照xb文件到新实例"},{"content":"fish shell 想来用了也3年多了，大部分时间并不是在用fish shell的语法特性，而是觉得自带的主题好看，以及自动补全功能。当时挑选 xx shell时还网上做了功课，也在zsh和fish之间徘徊，后面看了阮一峰老师的推荐文章后就入坑了fish-shell 😂 今天装了一个软件，要用到alias别名，翻了翻~/.bash_profile，~/.config/fish/config.fish，发现按我之前的习惯，需要将别名配置在这两个文件（后者是fish shell启动时会读取的配置文件，相当于bash shell 的 bash_rc/profile）。为什么不统一放到bash_profile，然后在fish的config文件里source呢？因为fish shell不支持bash语法，而我的bash_profile有一些bash。 今天看了看我的bash_profile，看到了之前配置的autojump，因为fish不支持source该配置，导致换了fish后没用过了（不过貌似fish也有autojump插件？）。总之这算是一个契机吧，把fish换成支持bash语法的zsh，以后配置alias、exports就只配置在bash_profile就好了。\nmac安装zsh mac出厂就自带了zsh，zsh --version 看到版本号应该蛮旧的，毕竟没更新过。重新装一个吧\n安装zsh: brew install zsh zsh-completions 切换默认shell为zsh: chsh -s /bin/zsh 安装oh my zsh: sh -c \u0026quot;$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)\u0026quot; ps. 如果之前存在~/.zshrc文件，这次安装oh-my-zsh会将原来的文件备份为.zshrc.pre-oh-my-zsh，我将这个备份文件的配置追加到新的.zshrc里了。\n主题 主题很重要，影响日常工作的心情和效率呢。 主题列表：https://github.com/ohmyzsh/ohmyzsh/wiki/themes 可以在上面列表挑选个你喜欢的，在 ~/.zshrc 配置ZSH_THEME=\u0026quot;主题名\u0026quot;。当然，如果你是一个随心主义者，也可以将其设置为random，每次启动zsh都会随机一个主题。\n安装自动建议插件 fish shell有个很好用的功能: 输入命令时，会用灰颜色提示你最近的命令，使用方向键↑可以翻看相同前缀的历史命令。 zsh也有类似的插件\ngit clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions # 编辑 ~/.zshrc，若有其他插件，则括号里面用空格隔开 plugins=(zsh-autosuggestions) 移除不必要的别名 oh-my-zsh添加了很多git的别名，例如git -\u0026gt; g, git fetch -\u0026gt; gf，恰好我有其它命令和这些别名冲突。所以我在bash_profile将这俩别名干掉了\nunalias g unalias gf 其他 zsh 默认支持一个叫 magic function 的功能，但这会给我带来困扰，粘贴url时会帮我自动转义，很烦。可以 vim ~/.zshrc , 将 这行的注释去掉：`DISABLE_MAGIC_FUNCTIONS=true 对了，最后还是安利下 autojump , 用的时间越长，越节省时间呢。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/fish-shell-to-zsh/","summary":"\u003cp\u003efish shell 想来用了也3年多了，大部分时间并不是在用fish shell的语法特性，而是觉得自带的主题好看，以及自动补全功能。当时挑选 xx shell时还网上做了功课，也在zsh和fish之间徘徊，后面看了阮一峰老师的\u003ca href=\"http://www.ruanyifeng.com/blog/2017/05/fish_shell.html\"\u003e推荐文章\u003c/a\u003e后就入坑了fish-shell 😂 今天装了一个软件，要用到alias别名，翻了翻\u003ccode\u003e~/.bash_profile\u003c/code\u003e，\u003ccode\u003e~/.config/fish/config.fish\u003c/code\u003e，发现按我之前的习惯，需要将别名配置在这两个文件（后者是fish shell启动时会读取的配置文件，相当于bash shell 的 bash_rc/profile）。为什么不统一放到bash_profile，然后在fish的config文件里\u003ccode\u003esource\u003c/code\u003e呢？因为fish shell不支持bash语法，而我的bash_profile有一些bash。 今天看了看我的bash_profile，看到了之前配置的autojump，因为fish不支持source该配置，导致换了fish后没用过了（不过貌似fish也有autojump插件？）。总之这算是一个契机吧，把fish换成支持bash语法的zsh，以后配置alias、exports就只配置在bash_profile就好了。\u003c/p\u003e\n\u003ch2 id=\"mac安装zsh\"\u003emac安装zsh\u003c/h2\u003e\n\u003cp\u003emac出厂就自带了zsh，\u003ccode\u003ezsh --version\u003c/code\u003e 看到版本号应该蛮旧的，毕竟没更新过。重新装一个吧\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e安装zsh: \u003ccode\u003ebrew install zsh zsh-completions\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e切换默认shell为zsh: \u003ccode\u003echsh -s /bin/zsh\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e安装oh my zsh: \u003ccode\u003esh -c \u0026quot;$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)\u0026quot;\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eps. 如果之前存在~/.zshrc文件，这次安装oh-my-zsh会将原来的文件备份为.zshrc.pre-oh-my-zsh，我将这个备份文件的配置追加到新的.zshrc里了。\u003c/p\u003e\n\u003ch2 id=\"主题\"\u003e主题\u003c/h2\u003e\n\u003cp\u003e主题很重要，影响日常工作的心情和效率呢。 主题列表：https://github.com/ohmyzsh/ohmyzsh/wiki/themes 可以在上面列表挑选个你喜欢的，在 ~/.zshrc 配置\u003ccode\u003eZSH_THEME=\u0026quot;主题名\u0026quot;\u003c/code\u003e。当然，如果你是一个随心主义者，也可以将其设置为\u003ccode\u003erandom\u003c/code\u003e，每次启动zsh都会随机一个主题。\u003c/p\u003e\n\u003ch2 id=\"安装自动建议插件\"\u003e安装自动建议插件\u003c/h2\u003e\n\u003cp\u003efish shell有个很好用的功能: 输入命令时，会用灰颜色提示你最近的命令，使用方向键↑可以翻看相同前缀的历史命令。 zsh也有类似的\u003ca href=\"https://github.com/zsh-users/zsh-autosuggestions/blob/master/INSTALL.md#oh-my-zsh\"\u003e插件\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone https://github.com/zsh-users/zsh-autosuggestions \u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eZSH_CUSTOM\u003c/span\u003e\u003cspan class=\"k\"\u003e:-\u003c/span\u003e\u003cspan class=\"p\"\u003e~/.oh-my-zsh/custom\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e/plugins/zsh-autosuggestions\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 编辑 ~/.zshrc，若有其他插件，则括号里面用空格隔开\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eplugins\u003c/span\u003e\u003cspan class=\"o\"\u003e=(\u003c/span\u003ezsh-autosuggestions\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/fish-shell-to-zsh/e9a493e8-fda7-4a8c-bb27-e4f8f31fcce4.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"移除不必要的别名\"\u003e移除不必要的别名\u003c/h2\u003e\n\u003cp\u003eoh-my-zsh添加了很多git的别名，例如git -\u0026gt; g, git fetch -\u0026gt; gf，恰好我有其它命令和这些别名冲突。所以我在bash_profile将这俩别名干掉了\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eunalias\u003c/span\u003e g\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eunalias\u003c/span\u003e gf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"其他\"\u003e其他\u003c/h2\u003e\n\u003cp\u003ezsh 默认支持一个叫 \u003ccode\u003emagic function\u003c/code\u003e 的功能，但这会给我带来困扰，粘贴url时会帮我自动转义，很烦。可以 \u003ccode\u003evim ~/.zshrc\u003c/code\u003e , 将 这行的注释去掉：`\u003ccode\u003eDISABLE_MAGIC_FUNCTIONS=true\u003c/code\u003e 对了，最后还是安利下 autojump , 用的时间越长，越节省时间呢。\u003c/p\u003e","title":"fish shell切换到zsh"},{"content":"git clean 之前的文章 git-clean\nexclude: 本地的.gitignore 有时候我们在本地创建的文件，不想提交到仓库时，会考虑用.gitignore。\n但.gitignore文件本身往往是添加到版本控制的。为了不影响其他协作者。git提供了一个只对本地生效的规则文件\n在项目的 .git/info/exclude 文件里编辑即可。规则用法与.gitignore一致。\n统计两个commit之间的文件行数增改情况 将以下shell保存为diff_git_commit.sh\ngit log $1...$2 --pretty=tformat: --numstat | grep -v \u0026#39;src/proto_lib/\u0026#39; | grep -v \u0026#39;test/\u0026#39; | awk \u0026#39;{ add += $1; subs += $2; loc += $1 - $2 } END { printf \u0026#34;added lines: %s, removed lines: %s, total lines: %s\\n\u0026#34;, add, subs, loc }\u0026#39; - 用法：./diff_git_commit.sh commitId1 commitId2，当然你也可以用 ./diff_git_commit.sh tag1 tag2。\n你可能注意到了上面的grep -v。我把不需要统计的文件目录排除了。你可以按需修改以上shell。\n文件权限/格式相关（常用于需要与unix协作的win下） 以下命令需要设置为全局时，在 git config 后面加 \u0026ndash;global 即可\ngit config core.filemode false # 忽略文件权限 git config core.autocrlf true # 将所有add到仓库的文本的结束符从crlf替换成lf（unix系统下将true替换成input） git config core.eol lf # 设置行结束符，不过当core.autocrlf设置为true/input时，该配置不生效 git config core.ignorecase false #区分大小写 分支相关 git push origin :branchName # 删除远程分支。其实就是把空分支push上去 git fetch origin --prune # 清除远程没有了,本地却还有的origin分支 Tag git tag -a tag名 -m \u0026#34;tag描述\u0026#34; # 创建tag git push origin tag名 # 推送指定tag到远程 git tag [-n] [--sort=creatordate] # 列出所有tag，并按创建时间排序 git fetch --tags # 从远程拉取所有tag 彻底将已删除的文件从版本库中清理掉 主要使用 git filter-branch\n具体可参照这篇文章《使用git filter-branch删除没有使用的大文件》\nCommit相关 git commit \u0026ndash;amend # 修改已commit但未提交的评论\n","permalink":"https://blog-foamzou-com.pages.dev/posts/git-skill/","summary":"\u003ch2 id=\"git-clean\"\u003egit clean\u003c/h2\u003e\n\u003cp\u003e之前的文章 \u003ca href=\"/posts/git-clean/\"\u003egit-clean\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"exclude-本地的gitignore\"\u003eexclude: 本地的.gitignore\u003c/h2\u003e\n\u003cp\u003e有时候我们在本地创建的文件，不想提交到仓库时，会考虑用.gitignore。\u003c/p\u003e\n\u003cp\u003e但.gitignore文件本身往往是添加到版本控制的。为了不影响其他协作者。git提供了一个只对本地生效的规则文件\u003c/p\u003e\n\u003cp\u003e在项目的 \u003ccode\u003e.git/info/exclude\u003c/code\u003e 文件里编辑即可。规则用法与.gitignore一致。\u003c/p\u003e\n\u003ch2 id=\"统计两个commit之间的文件行数增改情况\"\u003e统计两个commit之间的文件行数增改情况\u003c/h2\u003e\n\u003cp\u003e将以下shell保存为diff_git_commit.sh\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit log \u003cspan class=\"nv\"\u003e$1\u003c/span\u003e...\u003cspan class=\"nv\"\u003e$2\u003c/span\u003e --pretty\u003cspan class=\"o\"\u003e=\u003c/span\u003etformat: --numstat \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep -v \u003cspan class=\"s1\"\u003e\u0026#39;src/proto_lib/\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep -v \u003cspan class=\"s1\"\u003e\u0026#39;test/\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e awk \u003cspan class=\"s1\"\u003e\u0026#39;{ add += $1; subs += $2; loc += $1 - $2 } END { printf \u0026#34;added lines: %s, removed lines: %s, total lines: %s\\n\u0026#34;, add, subs, loc }\u0026#39;\u003c/span\u003e -\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e用法：\u003ccode\u003e./diff_git_commit.sh commitId1 commitId2\u003c/code\u003e，当然你也可以用 \u003ccode\u003e./diff_git_commit.sh tag1 tag2\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e你可能注意到了上面的\u003ccode\u003egrep -v\u003c/code\u003e。我把不需要统计的文件目录排除了。你可以按需修改以上shell。\u003c/p\u003e\n\u003ch2 id=\"文件权限格式相关常用于需要与unix协作的win下\"\u003e文件权限/格式相关（常用于需要与unix协作的win下）\u003c/h2\u003e\n\u003cp\u003e以下命令需要设置为全局时，在 git config 后面加 \u0026ndash;global 即可\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit config core.filemode \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e \u003cspan class=\"c1\"\u003e# 忽略文件权限\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit config core.autocrlf \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# 将所有add到仓库的文本的结束符从crlf替换成lf（unix系统下将true替换成input）\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit config core.eol lf \u003cspan class=\"c1\"\u003e# 设置行结束符，不过当core.autocrlf设置为true/input时，该配置不生效\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit config core.ignorecase \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e  \u003cspan class=\"c1\"\u003e#区分大小写\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"分支相关\"\u003e分支相关\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push origin :branchName \u003cspan class=\"c1\"\u003e# 删除远程分支。其实就是把空分支push上去\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit fetch origin --prune \u003cspan class=\"c1\"\u003e# 清除远程没有了,本地却还有的origin分支\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"tag\"\u003eTag\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit tag -a tag名 -m \u003cspan class=\"s2\"\u003e\u0026#34;tag描述\u0026#34;\u003c/span\u003e \u003cspan class=\"c1\"\u003e# 创建tag\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push origin tag名  \u003cspan class=\"c1\"\u003e# 推送指定tag到远程\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit tag \u003cspan class=\"o\"\u003e[\u003c/span\u003e-n\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e--sort\u003cspan class=\"o\"\u003e=\u003c/span\u003ecreatordate\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"c1\"\u003e# 列出所有tag，并按创建时间排序\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit fetch --tags \u003cspan class=\"c1\"\u003e# 从远程拉取所有tag\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"彻底将已删除的文件从版本库中清理掉\"\u003e彻底将已删除的文件从版本库中清理掉\u003c/h2\u003e\n\u003cp\u003e主要使用 git filter-branch\u003c/p\u003e","title":"Git使用技巧"},{"content":"对于这个错误我也是很服气的。 用客户端传过来的 access token 换用户信息时报错：{\u0026ldquo;error\u0026rdquo;:100016,\u0026ldquo;error_description\u0026rdquo;:\u0026ldquo;access token check failed\u0026rdquo;} 请求的链接为：https://graph.qq.com/oauth2.0/me?access_token=我的token\u0026amp;unionid=1 官网文档说这是AccessToken过期了，或token不对。但我确信AccessToken是正确的。毕竟前后端的代码没有动过，唯一改变的是appid。 我鬼使神差地把unionid=1去掉后，正常响应了。我立马知道是因为该应用没有关联到开放平台，导致没有unionId，所以报错了。（评论区有同学也遇到这个问题，解决方案是：还要在【QQ互联】里面点击一下申请获取unionid权限，该权限申请后自动通过） 但\u0026hellip;.报的这个错也太不负责任了。想到这是qq互联，我立马原谅了他。毕竟他还是5年前那个qq互联呀。 ps: 5年前的吐槽 qq互联100010错误\n","permalink":"https://blog-foamzou-com.pages.dev/posts/qq-connect-oauth-error-100016/","summary":"\u003cp\u003e对于这个错误我也是很服气的。 用客户端传过来的 access token 换用户信息时报错：{\u0026ldquo;error\u0026rdquo;:100016,\u0026ldquo;error_description\u0026rdquo;:\u0026ldquo;access token check failed\u0026rdquo;} 请求的链接为：https://graph.qq.com/oauth2.0/me?access_token=我的token\u0026amp;unionid=1 官网文档说这是AccessToken过期了，或token不对。但我确信AccessToken是正确的。毕竟前后端的代码没有动过，唯一改变的是appid。 我鬼使神差地把unionid=1去掉后，正常响应了。我立马知道是因为该应用没有关联到开放平台，导致没有unionId，所以报错了。（评论区有同学也遇到这个问题，解决方案是：还要在【QQ互联】里面点击一下申请获取unionid权限，该权限申请后自动通过） \u003cimg loading=\"lazy\" src=\"/posts/qq-connect-oauth-error-100016/04916421-3d6b-435c-bb14-e1e561a6e2dd.png\"\u003e 但\u0026hellip;.报的这个错也太不负责任了。想到这是qq互联，我立马原谅了他。毕竟他还是5年前那个qq互联呀。 ps: 5年前的吐槽 \u003ca href=\"/posts/error-of-qq-connect-redirect-uri-is-illegal-100010/\"\u003eqq互联100010错误\u003c/a\u003e\u003c/p\u003e","title":"qq互联100016错误"},{"content":"今天在阿里云购买了一个便宜的实例，打算把旧实例迁移到新实例。步骤很简单。\n旧实例创建自定义镜像 控制台找到ECS实例，点击创建自定义镜像。镜像名称随意填，反正是一次性的。因为我的实例只有系统盘，所以只有默认资源组可以选，如果你有别的盘，可能可以选择多个。 共享自定义镜像（在同一账号内迁移的跳过这一步） 提交创建后，在镜像菜单可以看到提交的镜像，进度在不断累加，直至100%。等待进度的过程中，我们可以设置镜像共享了。 如下图，在你的镜像菜单点击 更多-共享镜像。 然后输入新实例所在的账号的UID，然后点击共享镜像。 UID在这里： 同一账号不同区域 需要复制镜像到目标区域 在新实例创建系统时选择共享镜像(同一账号内迁移选择自定义镜像) 等待上面镜像创建进度到100%后。就可以在新实例创建镜像了。 如果已经购买了实例，那么需要先停止新实例，然后点击菜单更换操作系统。会弹出镜像选择页面。 若还在创建中，在镜像选择页面直接选择即可 迁移网络安全组 旧实例：网络与安全-安全组，找到你实例所在的安全组。点进去，右上角有导出按钮，导出文件。 新实例：也是对应的页面，点击导入。\n更换域名解析 这个就很简单了，将原域名全部解析到新ip即可。\n观察流量 确认旧机器没有流量就可以下掉了\n","permalink":"https://blog-foamzou-com.pages.dev/posts/migrate-ecs-in-short-time/","summary":"\u003cp\u003e今天在阿里云购买了一个便宜的实例，打算把旧实例迁移到新实例。步骤很简单。\u003c/p\u003e\n\u003ch2 id=\"旧实例创建自定义镜像\"\u003e旧实例创建自定义镜像\u003c/h2\u003e\n\u003cp\u003e控制台找到ECS实例，点击创建自定义镜像。镜像名称随意填，反正是一次性的。因为我的实例只有系统盘，所以只有默认资源组可以选，如果你有别的盘，可能可以选择多个。 \u003cimg loading=\"lazy\" src=\"/posts/migrate-ecs-in-short-time/80fea6bd-1981-400d-b39d-117609329e0e.png\"\u003e \u003cimg loading=\"lazy\" src=\"/posts/migrate-ecs-in-short-time/6d012206-f4f4-4dd6-9df9-14845e9aa863.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"共享自定义镜像在同一账号内迁移的跳过这一步\"\u003e共享自定义镜像（在同一账号内迁移的跳过这一步）\u003c/h2\u003e\n\u003cp\u003e提交创建后，在镜像菜单可以看到提交的镜像，进度在不断累加，直至100%。等待进度的过程中，我们可以设置镜像共享了。 如下图，在你的镜像菜单点击 更多-共享镜像。 \u003cimg loading=\"lazy\" src=\"/posts/migrate-ecs-in-short-time/88a7ae92-529e-4cbd-b54b-db02712ce40f.png\"\u003e 然后输入新实例所在的账号的UID，然后点击共享镜像。 \u003cimg loading=\"lazy\" src=\"/posts/migrate-ecs-in-short-time/611955df-2d70-4585-9db5-1394ab0fb433.png\"\u003e UID在这里： \u003cimg loading=\"lazy\" src=\"/posts/migrate-ecs-in-short-time/bedbcee5-d3e9-430f-b451-277d9597d8dd.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"同一账号不同区域\"\u003e同一账号不同区域\u003c/h2\u003e\n\u003cp\u003e需要复制镜像到目标区域 \u003ca href=\"aliyun-clone-image.png\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/migrate-ecs-in-short-time/aliyun-clone-image-1024x651.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"在新实例创建系统时选择共享镜像同一账号内迁移选择自定义镜像\"\u003e在新实例创建系统时选择共享镜像(同一账号内迁移选择自定义镜像)\u003c/h2\u003e\n\u003cp\u003e等待上面镜像创建进度到100%后。就可以在\u003cstrong\u003e新实例\u003c/strong\u003e创建镜像了。 如果已经购买了实例，那么需要先停止新实例，然后点击菜单更换操作系统。会弹出镜像选择页面。 \u003cimg loading=\"lazy\" src=\"/posts/migrate-ecs-in-short-time/46f1c643-d8e2-470b-bb15-99c61d23f1bc.png\"\u003e 若还在创建中，在镜像选择页面直接选择即可 \u003cimg loading=\"lazy\" src=\"/posts/migrate-ecs-in-short-time/48144a08-f82f-4e10-bb63-a8081fd00759.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"迁移网络安全组\"\u003e迁移网络安全组\u003c/h2\u003e\n\u003cp\u003e旧实例：网络与安全-安全组，找到你实例所在的安全组。点进去，右上角有导出按钮，导出文件。 新实例：也是对应的页面，点击导入。\u003c/p\u003e\n\u003ch2 id=\"更换域名解析\"\u003e更换域名解析\u003c/h2\u003e\n\u003cp\u003e这个就很简单了，将原域名全部解析到新ip即可。\u003c/p\u003e\n\u003ch2 id=\"观察流量\"\u003e观察流量\u003c/h2\u003e\n\u003cp\u003e确认旧机器没有流量就可以下掉了\u003c/p\u003e","title":"10分钟内跨账号迁移阿里云ECS实例"},{"content":"2019是平淡的一年，没有太大的变化，所以觉得平淡无奇。年度总结会以比较特殊的散文形式叙述，形散而神\u0026hellip;也散。 首先迎来的是2018年的收场，年会，抽了个还算不错的小奖。 过年与往年一样，亲人朋友间聚聚，除了家里各种商业小店纷纷开起来外，倒是没有其他改变。 接着便真正拉开了新的一年的帷幕，开始返工了。开工利是很大，那天我司小伙伴的朋友圈里纷纷成为了“别人家”的公司，也因此成功拉到前同事入坑。 3月份去办理了公租房轮候，其实就先排着，可能要等十几年呢(笑~)，年底时候看了下排名，才到20+w名。看来只能寄希望于暴富啦~ 今年去电影院看的电影不多，比较有印象的是调音师，真的是年度好评的电影。 4月份腾讯出了一款手游，一起来捉妖。这可真是一款宝藏游戏，费鞋又费时间，一度成为我周末出门的一大理由。可惜到后来，周围的妖怪几乎都被我抓光了，便成为了我光明正大卸载的理由（走不动了，走不动了~） 周末或不回去的节假日里，除了和朋友出去爬爬山、聚聚会之外，也会去吃点好吃的，早茶代表：新伊香园，牛蛙代表：蛙小侠（这里推荐南山的欢乐颂店，壹方城店实在太多人），还有就是牛肉火锅代表：八合里了。正巧西丽这边有个分店，平时去吃也很方便。 说起节假日，今年的五一是在顺德度过的，和我哥还有个好基友跑到那边去就是为了吃，可惜，人是真的多啊，各种网红店门口必然排着令人惊叹的长龙，只能忍痛找些小店吃点当地的美食。比较有印象的是双皮奶，还有。额，没有了。真的只有双皮奶，看来我真的喜欢吃甜品呢。 周末会偶尔会和趣宝爬山小队或基友去爬山、徒步啥的。一年算下来也不多，接近10次吧。在大梅沙海滩、羊台山、塘朗山、仙湖公园、深圳湾公园等地方留下了小脚印，中间还去了次HK，后面HK事儿比较多，就没去的计划了。爬山我以为是比较轻松、纯肢体锻炼的事，有时却因为带头大哥不走寻常路的想法，往往会穿插些刺激的经历，今年倒是收敛了很多，点名表扬一下。 5月份尝试用LogicProX写歌，电钢作为midi输入设备。写歌的因由是前公司老大在群里发了李彦宏的歌，我一看Robin都有这么口水的歌，我们Ray同学怎么也得拥有一首更口水的歌吧。于是今年第一首歌就出来了。写歌是一件很累的事，更多的是边写边学习，很多乐理知识一窍不通，更多的是自娱自乐。但凭借这么一首没有学术质量的歌，竟也申请网易云音乐人成功了。于是感慨，这真是一个最好的时代，同时也是最糟糕的时代。今年也就写了两首歌，后面被新项目需求压过来，便没有了这样的闲暇心情。2020年争取多写几首，这个Flag有点压力（hahaa~ 6-7月是比较特别的时间，我竟然暴瘦了7斤。原因是我种了一颗牙(第一阶段)、给三颗牙做了根管治疗。所以有一个月的时间里，我两侧都不能咀嚼，只能靠粥和牛奶勉强度日，还好遇到的医生挺不错的，牙齿弄得棒棒的。换另一个角度来看，这也算2019年里比较令人满意的事儿~ 转眼8月份到了，由于组织需要，我从原来的项目组转了新项目组。开始了加班的日子，10点、11点下班变成了家常便饭，一直到年底都是如此。但是也还好，尽管我不喜欢加班，也不喜欢上班，但从刚毕业实习那时起，我就知道，其实我是一个工作狂。这看似是一件矛盾的事，但其实也不矛盾，既然不得不开始，那就把它做好吧。有什么收获吗？技术上多多少少有一些吧，但是不多；项目进度把控、成员协作方面呢？进步也不多。呀，真是有些挫败。但也够用了。而失去了什么呢？唉，说到损失，昨天就牺牲了两根兄弟，一根叫蔡徐坤，一根叫乔碧萝。我摸摸发凉的后脑勺，唉，杰西卡和弗拉迪斯拉夫也快掉了。（开玩笑，开玩笑~ 优剪的小哥说我发量惊人 9月份，大学宿舍的大哥，也是我的老表哥结婚了。加班的日子里抽空去参加了婚礼，大哥作为宿舍结婚第一人，得到了我们其他几个小家伙的祝福和羡慕。 国庆回家了，归途那天真的特别难忘。那是一个想起来就觉得屁股痛的一天。本应4个小时的路径，我们经历了接近10个小时后终于到家了。感恩。同时也感激早上没有怎么喝水的我。因为假期比较长，大学社团环创举办了20周年庆，这一届的师弟师妹们真的给力，可以看出付出的时间和精力也很多，这一次作为社会人师兄的角色参加聚会，不禁有些唏嘘，自己也没什么拿得出手的经历或者经验给到师弟妹们，或许后面的日子里能有点不一样的经历吧，努力向大佬们看齐。 10月份参加了公司的一次团建，去佛山某温泉度假村。对于吃的，就不说了，嗯。玩的倒还可以，人生第一次划皮艇，第一次泡了温泉和蒸桑拿，是真的热，桑拿，每次有人往滚烫的石头浇水的时候，我都想哭。这次团建总体来说，还算满意。 还是10月份，我换了mbp，这次是16g的。旧的mbp通过闲鱼卖给了一个开教育培训中心的小姐姐，然后收获是经常在朋友圈看到各种可爱的小朋友的画作及一言不合就开始表演的武术。 距离年底还有3天的某个周五傍晚，坐大巴和系统部的同学们一起去龙华团建，是一次高级别墅的轰趴。这次的轰趴很不错，和大伙玩了uno 狼人杀。玩到接近凌晨4点，然后和两位同学通宵唱K，期间睡了一个钟。回去后感觉还是太累了，以后不要轻易喝红牛熬夜了。（反面教材，划重点！！） 对啦，今年下半年我开始理财了，之前会一股脑将工资存余额宝，现在会分析考虑什么理财产品收益高，怎么定投好一些。尽管本金不多，收益不会特别多，但又开始慢慢get一个新技能，是一种很棒的感觉。我是一个喜欢学习的人呢~ 然后就，真的结束了，我的2019。波澜不惊，不知所云。 期望2020，这个世界对我好一些吧，当然，我也会更友好地，对这个世界和人们报以温柔~\n","permalink":"https://blog-foamzou-com.pages.dev/posts/2019-year-summary/","summary":"\u003cp\u003e2019是平淡的一年，没有太大的变化，所以觉得平淡无奇。年度总结会以比较特殊的散文形式叙述，形散而神\u0026hellip;也散。 首先迎来的是2018年的收场，年会，抽了个还算不错的小奖。 过年与往年一样，亲人朋友间聚聚，除了家里各种商业小店纷纷开起来外，倒是没有其他改变。 接着便真正拉开了新的一年的帷幕，开始返工了。开工利是很大，那天我司小伙伴的朋友圈里纷纷成为了“别人家”的公司，也因此成功拉到前同事入坑。 3月份去办理了公租房轮候，其实就先排着，可能要等十几年呢(笑~)，年底时候看了下排名，才到20+w名。看来只能寄希望于暴富啦~ 今年去电影院看的电影不多，比较有印象的是调音师，真的是年度好评的电影。 4月份腾讯出了一款手游，一起来捉妖。这可真是一款宝藏游戏，费鞋又费时间，一度成为我周末出门的一大理由。可惜到后来，周围的妖怪几乎都被我抓光了，便成为了我光明正大卸载的理由（走不动了，走不动了~） 周末或不回去的节假日里，除了和朋友出去爬爬山、聚聚会之外，也会去吃点好吃的，早茶代表：新伊香园，牛蛙代表：蛙小侠（这里推荐南山的欢乐颂店，壹方城店实在太多人），还有就是牛肉火锅代表：八合里了。正巧西丽这边有个分店，平时去吃也很方便。 说起节假日，今年的五一是在顺德度过的，和我哥还有个好基友跑到那边去就是为了吃，可惜，人是真的多啊，各种网红店门口必然排着令人惊叹的长龙，只能忍痛找些小店吃点当地的美食。比较有印象的是双皮奶，还有。额，没有了。真的只有双皮奶，看来我真的喜欢吃甜品呢。 周末会偶尔会和趣宝爬山小队或基友去爬山、徒步啥的。一年算下来也不多，接近10次吧。在大梅沙海滩、羊台山、塘朗山、仙湖公园、深圳湾公园等地方留下了小脚印，中间还去了次HK，后面HK事儿比较多，就没去的计划了。爬山我以为是比较轻松、纯肢体锻炼的事，有时却因为带头大哥不走寻常路的想法，往往会穿插些刺激的经历，今年倒是收敛了很多，点名表扬一下。 5月份尝试用LogicProX写歌，电钢作为midi输入设备。写歌的因由是前公司老大在群里发了李彦宏的歌，我一看Robin都有这么口水的歌，我们Ray同学怎么也得拥有一首更口水的歌吧。于是今年第一首歌就出来了。写歌是一件很累的事，更多的是边写边学习，很多乐理知识一窍不通，更多的是自娱自乐。但凭借这么一首没有学术质量的歌，竟也申请网易云音乐人成功了。于是感慨，这真是一个最好的时代，同时也是最糟糕的时代。今年也就写了两首歌，后面被新项目需求压过来，便没有了这样的闲暇心情。2020年争取多写几首，这个Flag有点压力（hahaa~ 6-7月是比较特别的时间，我竟然暴瘦了7斤。原因是我种了一颗牙(第一阶段)、给三颗牙做了根管治疗。所以有一个月的时间里，我两侧都不能咀嚼，只能靠粥和牛奶勉强度日，还好遇到的医生挺不错的，牙齿弄得棒棒的。换另一个角度来看，这也算2019年里比较令人满意的事儿~ 转眼8月份到了，由于组织需要，我从原来的项目组转了新项目组。开始了加班的日子，10点、11点下班变成了家常便饭，一直到年底都是如此。但是也还好，尽管我不喜欢加班，也不喜欢上班，但从刚毕业实习那时起，我就知道，其实我是一个工作狂。这看似是一件矛盾的事，但其实也不矛盾，既然不得不开始，那就把它做好吧。有什么收获吗？技术上多多少少有一些吧，但是不多；项目进度把控、成员协作方面呢？进步也不多。呀，真是有些挫败。但也够用了。而失去了什么呢？唉，说到损失，昨天就牺牲了两根兄弟，一根叫蔡徐坤，一根叫乔碧萝。我摸摸发凉的后脑勺，唉，杰西卡和弗拉迪斯拉夫也快掉了。（开玩笑，开玩笑~ 优剪的小哥说我发量惊人 9月份，大学宿舍的大哥，也是我的老表哥结婚了。加班的日子里抽空去参加了婚礼，大哥作为宿舍结婚第一人，得到了我们其他几个小家伙的祝福和羡慕。 国庆回家了，归途那天真的特别难忘。那是一个想起来就觉得屁股痛的一天。本应4个小时的路径，我们经历了接近10个小时后终于到家了。感恩。同时也感激早上没有怎么喝水的我。因为假期比较长，大学社团环创举办了20周年庆，这一届的师弟师妹们真的给力，可以看出付出的时间和精力也很多，这一次作为社会人师兄的角色参加聚会，不禁有些唏嘘，自己也没什么拿得出手的经历或者经验给到师弟妹们，或许后面的日子里能有点不一样的经历吧，努力向大佬们看齐。 10月份参加了公司的一次团建，去佛山某温泉度假村。对于吃的，就不说了，嗯。玩的倒还可以，人生第一次划皮艇，第一次泡了温泉和蒸桑拿，是真的热，桑拿，每次有人往滚烫的石头浇水的时候，我都想哭。这次团建总体来说，还算满意。 还是10月份，我换了mbp，这次是16g的。旧的mbp通过闲鱼卖给了一个开教育培训中心的小姐姐，然后收获是经常在朋友圈看到各种可爱的小朋友的画作及一言不合就开始表演的武术。 距离年底还有3天的某个周五傍晚，坐大巴和系统部的同学们一起去龙华团建，是一次高级别墅的轰趴。这次的轰趴很不错，和大伙玩了uno 狼人杀。玩到接近凌晨4点，然后和两位同学通宵唱K，期间睡了一个钟。回去后感觉还是太累了，以后不要轻易喝红牛熬夜了。（反面教材，划重点！！） 对啦，今年下半年我开始理财了，之前会一股脑将工资存余额宝，现在会分析考虑什么理财产品收益高，怎么定投好一些。尽管本金不多，收益不会特别多，但又开始慢慢get一个新技能，是一种很棒的感觉。我是一个喜欢学习的人呢~ 然后就，真的结束了，我的2019。波澜不惊，不知所云。 期望2020，这个世界对我好一些吧，当然，我也会更友好地，对这个世界和人们报以温柔~\u003c/p\u003e","title":"2019年度总结"},{"content":"一、 获取临时密钥的请求里，权限列表里需要添加下载权限。php实例代码： $config = [ \u0026#39;url\u0026#39; =\u0026gt; self::URL, \u0026#39;domain\u0026#39; =\u0026gt; self::DOMAIN, \u0026#39;proxy\u0026#39; =\u0026gt; \u0026#39;\u0026#39;, \u0026#39;secretId\u0026#39; =\u0026gt; $cos[\u0026#39;secret_id\u0026#39;], // 固定密钥 \u0026#39;secretKey\u0026#39; =\u0026gt; $cos[\u0026#39;secret_key\u0026#39;], // 固定密钥 \u0026#39;bucket\u0026#39; =\u0026gt; $bucket, // 换成你的 bucket \u0026#39;region\u0026#39; =\u0026gt; $region, // 换成 bucket 所在园区 \u0026#39;durationSeconds\u0026#39; =\u0026gt; self::EXPIRE_TIME, // 密钥有效期 \u0026#39;allowPrefix\u0026#39; =\u0026gt; \u0026#39;*\u0026#39;, // 这里改成允许的路径前缀，可以根据自己网站的用户登录态判断允许上传的目录，例子：* 或者 a/* 或者 a.jpg // 密钥的权限列表。简单上传和分片需要以下的权限， \u0026#39;allowActions\u0026#39; =\u0026gt; array ( // 简单上传 \u0026#39;name/cos:PutObject\u0026#39;, \u0026#39;name/cos:PostObject\u0026#39;, // 分片上传 \u0026#39;name/cos:InitiateMultipartUpload\u0026#39;, \u0026#39;name/cos:ListMultipartUploads\u0026#39;, \u0026#39;name/cos:ListParts\u0026#39;, \u0026#39;name/cos:UploadPart\u0026#39;, \u0026#39;name/cos:CompleteMultipartUpload\u0026#39;, // 下载 \u0026#39;name/cos:GetObject\u0026#39;, ) ]; // 获取临时密钥，计算签名 $tempKeys = $this-\u0026gt;sts-\u0026gt;getTempKeys($config); 二、确保用于生成临时密钥的账号在所在的桶有相应的权限 https://console.cloud.tencent.com/cos5/bucket 我踩的坑是因为运维给到我的账号是子账号，但是没有权限。使用该子账号的密钥生成的临时密钥能够进行上传操作，但是下载对象返回403。这就很懵逼了。 提了工单给腾讯云，折腾几回合无果后，客服让我在桶所在的权限控制台页面截图看看，说如果是子账号的话，也是需要将子账号及相应权限添加到对应桶的。 让运维将子账号添加到所在桶，并勾选上传、下载数据权限后，成功下载。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/tencent-cos-get-object-failed-using-temp-secret/","summary":"\u003cp\u003e一、 获取临时密钥的请求里，权限列表里需要添加下载权限。php实例代码：  \u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003e$config\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;url\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"na\"\u003eURL\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;domain\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"na\"\u003eDOMAIN\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;proxy\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;secretId\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nv\"\u003e$cos\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;secret_id\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 固定密钥\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;secretKey\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nv\"\u003e$cos\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;secret_key\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 固定密钥\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;bucket\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nv\"\u003e$bucket\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 换成你的 bucket\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;region\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nv\"\u003e$region\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 换成 bucket 所在园区\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;durationSeconds\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"na\"\u003eEXPIRE_TIME\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 密钥有效期\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;allowPrefix\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;*\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 这里改成允许的路径前缀，可以根据自己网站的用户登录态判断允许上传的目录，例子：* 或者 a/* 或者 a.jpg\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"c1\"\u003e// 密钥的权限列表。简单上传和分片需要以下的权限，\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;allowActions\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"k\"\u003earray\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"c1\"\u003e// 简单上传\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;name/cos:PutObject\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;name/cos:PostObject\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"c1\"\u003e// 分片上传\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;name/cos:InitiateMultipartUpload\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;name/cos:ListMultipartUploads\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;name/cos:ListParts\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;name/cos:UploadPart\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;name/cos:CompleteMultipartUpload\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"c1\"\u003e// 下载\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;name/cos:GetObject\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e// 获取临时密钥，计算签名\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003e$tempKeys\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$this\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003ests\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003egetTempKeys\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$config\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e  二、确保用于生成临时密钥的账号在所在的桶有相应的权限 \u003ca href=\"https://console.cloud.tencent.com/cos5/bucket\"\u003ehttps://console.cloud.tencent.com/cos5/bucket\u003c/a\u003e 我踩的坑是因为运维给到我的账号是子账号，但是没有权限。使用该子账号的密钥生成的临时密钥能够进行上传操作，但是下载对象返回403。这就很懵逼了。 提了工单给腾讯云，折腾几回合无果后，客服让我在桶所在的权限控制台页面截图看看，说如果是子账号的话，也是需要将子账号及相应权限添加到对应桶的。 让运维将子账号添加到所在桶，并勾选上传、下载数据权限后，成功下载。\u003c/p\u003e","title":"腾讯COS - 使用临时密钥下载私有桶对象失败Cos Error Code: AccessDenied【踩坑】"},{"content":"转载自：简书 解决方法一： 允许任何来源的应用。在系统偏好设置里，打开“安全性和隐私”，将“允许从以下位置下载的应用程序”设置为“任何来源“。当然，这个设置已经无法在Mac OS Sierra上完成了。 在Mac OS Sierra上，应该进行以下操作：\n打开终端（Terminal），输入以下命令后回车，输入密码 sudo spctl --master-disable 重新运行下载的应用程序 解决方法二： 移除这个应用的安全隔离属性，操作如下：\n打开终端（Terminal），输入以下命令后回车，如需要，请输入密码 xattr -r -d com.apple.quarantine \u0026lt;path\u0026gt; 是你下载的应用程序的路径，一般在/Applications/应用程序名字\n重新运行下载的应用程序。 ","permalink":"https://blog-foamzou-com.pages.dev/posts/mac-tips-file-has-broken-pls-move-it-to-trash/","summary":"\u003ch3 id=\"转载自简书\"\u003e转载自：\u003ca href=\"https://www.jianshu.com/p/5c778b725837\"\u003e简书\u003c/a\u003e\u003c/h3\u003e\n\u003ch3 id=\"解决方法一\"\u003e解决方法一：\u003c/h3\u003e\n\u003cp\u003e允许任何来源的应用。在系统偏好设置里，打开“安全性和隐私”，将“允许从以下位置下载的应用程序”设置为“任何来源“。当然，这个设置已经无法在Mac OS Sierra上完成了。 在Mac OS Sierra上，应该进行以下操作：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e打开终端（Terminal），输入以下命令后回车，输入密码\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo spctl --master-disable\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e重新运行下载的应用程序\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"解决方法二\"\u003e解决方法二：\u003c/h3\u003e\n\u003cp\u003e移除这个应用的安全隔离属性，操作如下：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e打开终端（Terminal），输入以下命令后回车，如需要，请输入密码\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003exattr -r -d com.apple.quarantine \u0026lt;path\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003c!-- raw HTML omitted --\u003e是你下载的应用程序的路径，一般在/Applications/应用程序名字\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e重新运行下载的应用程序。\u003c/li\u003e\n\u003c/ol\u003e","title":"【转】Mac打开软件提示：xx已损坏，请移至废纸篓"},{"content":"Github地址\n使用php对象，描述Json-Schema变得更容易（支持draft-07 和 draft-06） 使用opis/json-schema作为校验器 好处 定义容易，不用写复杂的json 定义更有可读性 安装 composer require \u0026quot;foamzou/easy-json-schema\u0026quot;\n基本使用 use Foamzou\\EasyJsonSchema\\Manager\\Validator; use Foamzou\\EasyJsonSchema\\Manager\\Parser; use Foamzou\\EasyJsonSchema\\Type\\{ Str, Integer }; // 定义一个schema $schema = new Obj([ \u0026#39;name\u0026#39; =\u0026gt; (new Integer)-\u0026gt;min(2)-\u0026gt;max(5), \u0026#39;age\u0026#39; =\u0026gt; (new Str)-\u0026gt;max(120), ]); $data = [ \u0026#39;name\u0026#39; =\u0026gt; \u0026#39;foam\u0026#39;, \u0026#39;age\u0026#39; =\u0026gt; 18, ]; // 生成json-schema $jsonSchema = Parser::run($schema); //校验数据合法性，如果校验失败，errorMessage将返回具体信息 $bool = Validator::getInstance()-\u0026gt;isValid($jsonSchema, $data, $errorMessage); Schema的定义 下面是与json-schema的对比，可以看到使用php对象的定义会更简单、更有可读性且更容易维护 php版\nnew Obj([ \u0026#39;name\u0026#39; =\u0026gt; (new Integer)-\u0026gt;min(2)-\u0026gt;max(5), \u0026#39;age\u0026#39; =\u0026gt; (new Str)-\u0026gt;min(16)-\u0026gt;max(120), \u0026#39;skill\u0026#39; =\u0026gt; (new Arr)-\u0026gt;items((new Obj([ \u0026#39;name\u0026#39; =\u0026gt; (new Str())-\u0026gt;min(1)-\u0026gt;max(64), \u0026#39;value\u0026#39; =\u0026gt; (new Num())-\u0026gt;min(0)-\u0026gt;max(100)-\u0026gt;multipleOf(0.25), ]))-\u0026gt;requiredAll()-\u0026gt;additionalProp(false)), ]); Json-Schema\n{ \u0026#34;type\u0026#34;: \u0026#34;object\u0026#34;, \u0026#34;properties\u0026#34;: { \u0026#34;name\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;integer\u0026#34;, \u0026#34;minimum\u0026#34;: 2, \u0026#34;maximum\u0026#34;: 5 }, \u0026#34;age\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;string\u0026#34;, \u0026#34;minLength\u0026#34;: 16, \u0026#34;maxLength\u0026#34;: 120 }, \u0026#34;skill\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;array\u0026#34;, \u0026#34;items\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;object\u0026#34;, \u0026#34;properties\u0026#34;: { \u0026#34;name\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;string\u0026#34;, \u0026#34;minLength\u0026#34;: 1, \u0026#34;maxLength\u0026#34;: 64 }, \u0026#34;value\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;number\u0026#34;, \u0026#34;minimum\u0026#34;: 0, \u0026#34;maximum\u0026#34;: 100, \u0026#34;multipleOf\u0026#34;: 0.25 } }, \u0026#34;required\u0026#34;: [ \u0026#34;name\u0026#34;, \u0026#34;value\u0026#34; ], \u0026#34;additionalProperties\u0026#34;: false } } } } 数据类型 use Foamzou\\EasyJsonSchema\\Type\\{ Str, Integer, Num, Obj, Boolean, Arr, Nul }; 字符串 (new Str)-\u0026gt;min(最短长度)-\u0026gt;max(最大长度)-\u0026gt;pattern(\u0026#39;/正则/\u0026#39;)-\u0026gt;contentEncoding(编码类型)-\u0026gt;contentMediaType(媒体类型) 数字 (new Num)-\u0026gt;min(1)-\u0026gt;max(20); // \u0026gt;=1 且 \u0026lt;=20 (new Num)-\u0026gt;exMin(1)-\u0026gt;exMax(20)-\u0026gt;multipleOf(5);// \u0026gt;1 且 \u0026lt;20 且 被5整除 整型 (new Integer)-\u0026gt;min(1)-\u0026gt;max(20); // \u0026gt;=1 且 \u0026lt;=20 (new Integer)-\u0026gt;exMin(1)-\u0026gt;exMax(20)-\u0026gt;multipleOf(5);// \u0026gt;1 且 \u0026lt;20 且 被5整除 布尔 new Boolean 空值 new Nul 数组 (new Arr)-\u0026gt;items(new obj([ \u0026#39;name\u0026#39; =\u0026gt; new Integer, \u0026#39;age\u0026#39; =\u0026gt; new Str, ]))-\u0026gt;min(\u0026#39;数组长度最小值\u0026#39;) -\u0026gt;max(\u0026#39;数组长度最大值\u0026#39;) -\u0026gt;uniq(\u0026#39;bool:是否要求元素唯一\u0026#39;) -\u0026gt;additionalItems(\u0026#39;额外元素\u0026#39;) -\u0026gt;contains(\u0026#39;包含元素\u0026#39;); 对象 (new Obj([ \u0026#39;name\u0026#39; =\u0026gt; new Str, \u0026#39;age\u0026#39; =\u0026gt; new Integer, \u0026#39;childObj\u0026#39; =\u0026gt; new Obj([ // 对象可嵌套 \u0026#39;newName\u0026#39; =\u0026gt; new Str, \u0026#39;newAge\u0026#39; =\u0026gt; new Integer, ]) ]))-\u0026gt;required([\u0026#39;name\u0026#39;, \u0026#39;age\u0026#39;]); 关键字 枚举 new Enum([1, 2, 3]); 常量 new Constant(\u0026#39;mustBeMe\u0026#39;); AnyOf, OneOf, AllOf // 如果差异在于不同的数据类型，可用new对象的方式 new OneOf([ new Integer, new Str, ]); // 如果在同一个数据类型的不同属性，则调用方法 (new Arr())-\u0026gt;items(new Integer)-\u0026gt;oneOf([ [ \u0026#34;items\u0026#34;=\u0026gt; [ \u0026#34;exclusiveMinimum\u0026#34;=\u0026gt; 0 ] ], [ \u0026#34;items\u0026#34;=\u0026gt; [ \u0026#34;exclusiveMaximum\u0026#34;=\u0026gt; 0 ] ], [ \u0026#34;items\u0026#34;=\u0026gt; [ \u0026#34;const\u0026#34;=\u0026gt; 0 ] ] ]); not new Not(new Str) if.then.else // 方式1，适用于new if的场景 (new Kif(new Integer())) -\u0026gt;then([\u0026#34;minLength\u0026#34; =\u0026gt; 3]) -\u0026gt;else([\u0026#34;const\u0026#34; =\u0026gt; 0]); // 方式2，适用于基本类型内部的链式场景 (new Obj)-\u0026gt;if([ \u0026#39;properties\u0026#39; =\u0026gt; [ \u0026#39;gender\u0026#39; =\u0026gt; new Constant(\u0026#39;female\u0026#39;) ] ])-\u0026gt;then([ \u0026#39;properties\u0026#39; =\u0026gt; [ \u0026#39;gender\u0026#39; =\u0026gt; new Constant(\u0026#39;female\u0026#39;), \u0026#39;age\u0026#39; =\u0026gt; (new Integer)-\u0026gt;min(16), ] ])-\u0026gt;else([ \u0026#39;properties\u0026#39; =\u0026gt; [ \u0026#39;gender\u0026#39; =\u0026gt; new Constant(\u0026#39;male\u0026#39;), \u0026#39;age\u0026#39; =\u0026gt; (new Integer)-\u0026gt;min(18), ] ]); 复用schema 在开发中，经常会定义公共的实体。当其他地方需要复用同一个schema时，可使用require引入\nnew Obj([ \u0026#39;name\u0026#39; =\u0026gt; (new Str()), \u0026#39;location\u0026#39; =\u0026gt; require __DIR__ . \u0026#39;/Location.php\u0026#39;, ]); 公共方法 所有对象都有desc方法，用于描述该对象\n(new Obj([ \u0026#39;name\u0026#39; =\u0026gt; (new Str)-\u0026gt;desc(\u0026#39;用户姓名\u0026#39;), \u0026#39;age\u0026#39; =\u0026gt; (new Integer)-\u0026gt;desc(\u0026#39;用户年龄\u0026#39;), ]))-\u0026gt;desc(\u0026#39;我是一个请求体\u0026#39;); 基于Type的对象，都有default方法，用于设置默认值\n(new Str)-\u0026gt;default(\u0026#39;jay\u0026#39;); 将EasyJsonSchema编译为Json Schema use Foamzou\\EasyJsonSchema\\Manager\\Parser; $schema = (new Obj([ \u0026#39;name\u0026#39; =\u0026gt; (new Str)-\u0026gt;desc(\u0026#39;用户姓名\u0026#39;), \u0026#39;age\u0026#39; =\u0026gt; (new Integer)-\u0026gt;desc(\u0026#39;用户年龄\u0026#39;), ]))-\u0026gt;desc(\u0026#39;我是一个请求体\u0026#39;); $jsonSchema = Parser::run($schema); 校验数据并获取错误信息 如果给定的数据与schema不匹配，isValid方法将返回false，反之则为true\nuse Foamzou\\EasyJsonSchema\\Manager\\Validator; $validator = Validator::getInstance(); $isValid = $validator-\u0026gt;isValid($jsonSchema, json_encode($data), $errMessage, $errList); 当返回false时，$errMessage和$errList不为空。 $errMessage为语义化好的字符串，$errList是一个item为Opis\\JsonSchema\\ValidationError的数组 如果$errMessage展示的格式或内容不符合需求，你可以使用$errList来构建想要展示出来的错误信息\n","permalink":"https://blog-foamzou-com.pages.dev/posts/easy-json-schema/","summary":"\u003cp\u003e\u003ca href=\"https://github.com/foamzou/easy-json-schema\"\u003eGithub地址\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e使用php对象，描述Json-Schema变得更容易（支持draft-07 和 draft-06）\u003c/li\u003e\n\u003cli\u003e使用\u003ca href=\"https://github.com/opis/json-schema\"\u003eopis/json-schema\u003c/a\u003e作为校验器\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"好处\"\u003e\u003ca href=\"https://github.com/foamzou/easy-json-schema/blob/master/README.zh-CN.md#%E5%A5%BD%E5%A4%84\"\u003e\u003c/a\u003e好处\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e定义容易，不用写复杂的json\u003c/li\u003e\n\u003cli\u003e定义更有可读性\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"安装\"\u003e\u003ca href=\"https://github.com/foamzou/easy-json-schema/blob/master/README.zh-CN.md#%E5%AE%89%E8%A3%85\"\u003e\u003c/a\u003e安装\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003ecomposer require \u0026quot;foamzou/easy-json-schema\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"基本使用\"\u003e\u003ca href=\"https://github.com/foamzou/easy-json-schema/blob/master/README.zh-CN.md#%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8\"\u003e\u003c/a\u003e基本使用\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euse Foamzou\\EasyJsonSchema\\Manager\\Validator;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euse Foamzou\\EasyJsonSchema\\Manager\\Parser;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euse Foamzou\\EasyJsonSchema\\Type\\{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Str, Integer\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e};\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// 定义一个schema\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$schema = new Obj([\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u0026#39;name\u0026#39; =\u0026gt; (new Integer)-\u0026gt;min(2)-\u0026gt;max(5),\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u0026#39;age\u0026#39; =\u0026gt; (new Str)-\u0026gt;max(120),\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          ]);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$data = [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#39;name\u0026#39; =\u0026gt; \u0026#39;foam\u0026#39;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#39;age\u0026#39; =\u0026gt; 18,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// 生成json-schema\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$jsonSchema = Parser::run($schema);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e//校验数据合法性，如果校验失败，errorMessage将返回具体信息\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$bool = Validator::getInstance()-\u0026gt;isValid($jsonSchema, $data, $errorMessage);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"schema的定义\"\u003e\u003ca href=\"https://github.com/foamzou/easy-json-schema/blob/master/README.zh-CN.md#schema%E7%9A%84%E5%AE%9A%E4%B9%89\"\u003e\u003c/a\u003eSchema的定义\u003c/h2\u003e\n\u003cp\u003e下面是与json-schema的对比，可以看到使用php对象的定义会更简单、更有可读性且更容易维护 php版\u003c/p\u003e","title":"用php对象，简化Json Schema的定义"},{"content":"有一台服务器只能对外开80端口，但该服务器有几个项目同时共用。因此做了一个方案，使用不同的url前缀，proxy_pass到对应项目监听的端口。 如default.conf配置如下\nserver { listen 80 default_server; location /a/ { rewrite ^/a/(.*)$ /$1 break; # 剥掉 /a 这一层 proxy_pass http://127.0.0.1:8083; } location /b/ { rewrite ^/b/(.*)$ /$1 break; proxy_pass http://127.0.0.1:8084; } location /c/ { rewrite ^/c/(.*)$ /$1 break; proxy_pass http://127.0.0.1:8085; } } a项目配置里开启了gzip\nserver { listen 8083; root /path/to/a; gzip on; gzip_comp_level 3; .... } 但发现gzip未生效。 后面把gzip配置放到default.conf的location部分就正常运行了。\nlocation /a/ { gzip on; gzip_comp_level 6; rewrite ^/a/(.*)$ /$1 break; # 剥掉 /a 这一层 proxy_pass http://127.0.0.1:8083; } 对于这问题，暂未看到合理的解释。知晓原理的同学欢迎留言指教下，谢谢。 ps: apachebench(ab) 只支持http 1.0，如果要测试gzip的话，nginx配置还需加上 gzip_http_version 1.0;\n","permalink":"https://blog-foamzou-com.pages.dev/posts/gzip-not-work-after-proxy_pass/","summary":"\u003cp\u003e有一台服务器只能对外开80端口，但该服务器有几个项目同时共用。因此做了一个方案，使用不同的url前缀，proxy_pass到对应项目监听的端口。 如default.conf配置如下\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eserver \u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\tlisten       \u003cspan class=\"m\"\u003e80\u003c/span\u003e default_server\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\tlocation /a/ \u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e           rewrite ^/a/\u003cspan class=\"o\"\u003e(\u003c/span\u003e.*\u003cspan class=\"o\"\u003e)\u003c/span\u003e$ /\u003cspan class=\"nv\"\u003e$1\u003c/span\u003e break\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e# 剥掉 /a 这一层\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e           proxy_pass http://127.0.0.1:8083\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\tlocation /b/ \u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e           rewrite ^/b/\u003cspan class=\"o\"\u003e(\u003c/span\u003e.*\u003cspan class=\"o\"\u003e)\u003c/span\u003e$ /\u003cspan class=\"nv\"\u003e$1\u003c/span\u003e break\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e           proxy_pass http://127.0.0.1:8084\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\tlocation /c/ \u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e           rewrite ^/c/\u003cspan class=\"o\"\u003e(\u003c/span\u003e.*\u003cspan class=\"o\"\u003e)\u003c/span\u003e$ /\u003cspan class=\"nv\"\u003e$1\u003c/span\u003e break\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e           proxy_pass http://127.0.0.1:8085\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ea项目配置里开启了gzip\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eserver \u003cspan class=\"o\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    listen 8083\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    root /path/to/a\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    gzip on\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    gzip_comp_level 3\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ....\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e但发现gzip未生效。 后面把gzip配置放到default.conf的location部分就正常运行了。\u003c/p\u003e","title":"nginx proxy_pass后gzip不生效"},{"content":"有些软件需要安装python2.7，但centos6默认安装的是2.6版本。但yum依赖2.6，所以不能覆盖安装。需要保留两者\n编译安装python2.7 wget https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tgz tar xvf Python-2.7.14.tgz sudo mkdir /usr/local/python2.7 cd Python-2.7.14 ./configure --prefix=/usr/local/python2.7 --enable-shared make sudo make install 验证 cd /usr/local/python2.7/bin ./python 报错：\n./python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory 将python2.7的动态链接库加入到系统会读取的配置中\nsudo vim /etc/ld.so.conf # 在该配置文件追加一行：/usr/local/python2.7/lib sudo ldconfig 备份原有的python which python # /usr/bin/python [myhost tmp]$ md5sum /usr/bin/python /usr/bin/python2.6 8505ca7b24f60f8dca8d6d2622ed0563 /usr/bin/python 8505ca7b24f60f8dca8d6d2622ed0563 /usr/bin/python2.6 # 发现已经有python2.6，且与python的md5一致，那就不用备份直接删除了 sudo rm /usr/bin/python 编辑yum的执行程序 sudo vim /usr/bin/yum # 将#!/usr/bin/python 中的python改为python2.6 # 即 #!/usr/bin/python2.6 执行yum验证下，没有报错就ok了\n配置python2.7 sudo ln -s /usr/local/python2.7/bin/python /usr/bin/python # 执行python [foam@host tmp]$ python Python 2.7.14 (default, Apr 9 2019, 17:06:25) [GCC 4.4.7 20120313 (Red Hat 4.4.7-23)] on linux2 # ok 正常运行 # 安装pip wget https://bootstrap.pypa.io/get-pip.py python get-pip.py # 软链 sudo ln -s /usr/local/python2.7/bin/pip2.7 /usr/bin/pip # 验证 [foam@host tmp]$ pip -V pip 19.0.3 from /usr/local/python2.7/lib/python2.7/site-packages/pip (python 2.7) # ok 没问题 # 为了能够愉快地在全局运行python安装的软件，将bin加入到环境变量 sudo vim /etc/profile 追加一行：export PATH=/usr/local/python2.7/bin:$PATH ","permalink":"https://blog-foamzou-com.pages.dev/posts/upgrade-python-to-2-7-in-centos/","summary":"\u003cp\u003e有些软件需要安装python2.7，但centos6默认安装的是2.6版本。但yum依赖2.6，所以不能覆盖安装。需要保留两者\u003c/p\u003e\n\u003ch2 id=\"编译安装python27\"\u003e编译安装python2.7\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tgz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etar xvf Python-2.7.14.tgz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo mkdir /usr/local/python2.7\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e Python-2.7.14\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./configure --prefix\u003cspan class=\"o\"\u003e=\u003c/span\u003e/usr/local/python2.7 --enable-shared\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emake\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo make install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"验证\"\u003e验证\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e /usr/local/python2.7/bin\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./python\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e报错：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./python: error \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e将python2.7的动态链接库加入到系统会读取的配置中\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo vim /etc/ld.so.conf  \u003cspan class=\"c1\"\u003e# 在该配置文件追加一行：/usr/local/python2.7/lib\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo ldconfig\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"备份原有的python\"\u003e备份原有的python\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewhich python\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# /usr/bin/python\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003emyhost tmp\u003cspan class=\"o\"\u003e]\u003c/span\u003e$ md5sum /usr/bin/python /usr/bin/python2.6\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e8505ca7b24f60f8dca8d6d2622ed0563  /usr/bin/python\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e8505ca7b24f60f8dca8d6d2622ed0563  /usr/bin/python2.6\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 发现已经有python2.6，且与python的md5一致，那就不用备份直接删除了\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo rm /usr/bin/python\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"编辑yum的执行程序\"\u003e编辑yum的执行程序\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo vim /usr/bin/yum\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 将#!/usr/bin/python 中的python改为python2.6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 即 #!/usr/bin/python2.6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e执行yum验证下，没有报错就ok了\u003c/p\u003e","title":"centos6升级python到2.7版本"},{"content":" 查看执行进程的文件 sudo ls -l /proc/\u0026lt;pid\u0026gt;/exe 例如，可以看到node这个可执行程序的绝对路径\nroot@iZ94qht95zsZ ~# ps -ef | grep node root 17078 16750 88 16:47 pts/0 00:00:00 node index.js root@iZ94qht95zsZ ~# sudo ls -l /proc/17078/exe lrwxrwxrwx 1 root root 0 4月 8 16:47 /proc/17078/exe -\u0026gt; /usr/local/node-v10.4.0-linux-x64/bin/node 查看进程的工作目录 上面ps只能看到相对路径的index.js。我们要查看绝对路径可用以下命令\npwdx \u0026lt;pid\u0026gt; 例如，该index.js文件的工作目录为/root/test\nroot@iZ94qht95zsZ ~# pwdx 17078 17078: /root/test ","permalink":"https://blog-foamzou-com.pages.dev/posts/get-absolute-path-of-a-running-process/","summary":"\u003cul\u003e\n\u003cli\u003e查看执行进程的文件\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo ls -l /proc/\u0026lt;pid\u0026gt;/exe\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e例如，可以看到node这个可执行程序的绝对路径\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eroot@iZ94qht95zsZ ~# ps -ef \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep node\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eroot     \u003cspan class=\"m\"\u003e17078\u003c/span\u003e \u003cspan class=\"m\"\u003e16750\u003c/span\u003e \u003cspan class=\"m\"\u003e88\u003c/span\u003e 16:47 pts/0    00:00:00 node index.js\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eroot@iZ94qht95zsZ ~# sudo ls -l /proc/17078/exe\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elrwxrwxrwx \u003cspan class=\"m\"\u003e1\u003c/span\u003e root root \u003cspan class=\"m\"\u003e0\u003c/span\u003e 4月   \u003cspan class=\"m\"\u003e8\u003c/span\u003e 16:47 /proc/17078/exe -\u0026gt; /usr/local/node-v10.4.0-linux-x64/bin/node\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e查看进程的工作目录\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e上面ps只能看到相对路径的index.js。我们要查看绝对路径可用以下命令\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epwdx \u0026lt;pid\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e例如，该index.js文件的工作目录为/root/test\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eroot@iZ94qht95zsZ ~# pwdx \u003cspan class=\"m\"\u003e17078\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e17078: /root/test\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"根据pid查找进程所在的执行文件"},{"content":"最近在一台CentOS6.2的机器上部署php7.3，系统有点旧，稍微折腾点。\n安装需要的依赖 sudo yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libjpeg libpng freetype libjpeg-devel libpng-devel freetype-devel gmp-devel readline-devel libxslt-devel libmemcached libmemcached-devel -y 编译安装 到官网下载最新的稳定版本 注意用户组最好与nginx的保持一致，例如我这里设置与nginx一致的nobody\n./configure --prefix=/usr/local/php7 --with-config-file-path=/usr/local/php7/etc --enable-fpm --with-fpm-user=nobody --with-fpm-group=nobody --enable-inline-optimization --disable-debug --disable-rpath --enable-shared --enable-soap --with-libxml-dir --with-xmlrpc --with-openssl --with-mhash --with-pcre-regex --with-sqlite3 --with-zlib --enable-bcmath --with-iconv --with-bz2 --enable-calendar --with-curl=/usr/local/include/curl/ --with-cdb --enable-dom --enable-exif --enable-fileinfo --enable-filter --with-pcre-dir --enable-ftp --with-gd --with-openssl-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-freetype-dir --enable-gd-jis-conv --with-gettext --with-gmp --with-mhash --enable-json --enable-mbstring --enable-mbregex --enable-mbregex-backtrack --with-onig --enable-pdo --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-zlib-dir --with-pdo-sqlite --with-readline --enable-session --enable-shmop --enable-simplexml --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-wddx --with-libxml-dir --with-xsl --enable-zip --enable-mysqlnd-compression-support --with-pear --enable-opcache make sudo make install 编译期间遇到的问题汇总 checking for cURL 7.15.5 or greater\u0026hellip; configure: error: cURL version 7.15.5 or later is required to compile php with cURL support 实际上我本地已经安装了最新的版本。\u0026ndash;with-curl不指定路径的话，会在/usr/include/curl下找头文件。但我本机已有的libcurl貌似没有这些头文件。尝试`yum install curl curl-devel`，报了一个多版本冲突的问题。所以最后还是从curl官网下载了最新的tar包，手动编译安装后，--with-curl指定路径为/usr/local/include/curl/\nconfigure: error: Please reinstall the libzip distribution 通过yum安装的libzip版本过低，只能到官网下载编译安装。\ncd libzip-1.5.2 mkdir build cd build cmake ../ make sudo make install 执行cmake的时候报错：Error when bootstrapping CMake: Cannot find a C++ compiler that supports both C++11 and the specified C++ flags. Please specify one using environment variable CXX. The C++ flags are \u0026ldquo;\u0026rdquo;. 原因是yum安装的cmake版本过低，不支持c++11特性。所以到cmake官网下载源码安装，悲剧的是编译cmake需要支持c++11的GCC/G++, 考虑到在这台机器上升级GCC会很麻烦，所以直接下载cmake官方编译好的可执行文件\nredis、memcached扩展到 https://pecl.php.net 搜索下载，编译安装即可。最后在php.ini末尾加上扩展 extension=memcached.so extension=redis.so php -m 可以查看加载成功的扩展，php \u0026ndash;ri 扩展名 可以查看某扩展的具体版本和相关配置\n其它需要注意的 生产环境务必开启opcache，在php.ini添加 zend_extension=opcache.so 对于不依赖php内置的会话的app来说，每次请求都自动开启会话，生成一个session文件是不必要的。编辑php.ini，将session的配置session.auto_start设置为0。 如果你的应用依赖于php内置的会话，请务必实现session_set_save_handle方法，将session保存到redis或其他缓存中。否则大量地读写session文件(存储在磁盘)，磁盘IO会很大，系统负载就刷刷的上去了。 ","permalink":"https://blog-foamzou-com.pages.dev/posts/install-php7/","summary":"\u003cp\u003e最近在一台CentOS6.2的机器上部署php7.3，系统有点旧，稍微折腾点。\u003c/p\u003e\n\u003ch2 id=\"安装需要的依赖\"\u003e安装需要的依赖\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libjpeg libpng freetype libjpeg-devel libpng-devel freetype-devel gmp-devel readline-devel libxslt-devel libmemcached  libmemcached-devel -y\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"编译安装\"\u003e编译安装\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e到\u003ca href=\"https://www.php.net/downloads.php\"\u003e官网\u003c/a\u003e下载最新的稳定版本\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e注意用户组最好与nginx的保持一致，例如我这里设置与nginx一致的nobody\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./configure --prefix\u003cspan class=\"o\"\u003e=\u003c/span\u003e/usr/local/php7 --with-config-file-path\u003cspan class=\"o\"\u003e=\u003c/span\u003e/usr/local/php7/etc --enable-fpm --with-fpm-user\u003cspan class=\"o\"\u003e=\u003c/span\u003enobody --with-fpm-group\u003cspan class=\"o\"\u003e=\u003c/span\u003enobody --enable-inline-optimization --disable-debug --disable-rpath --enable-shared --enable-soap --with-libxml-dir --with-xmlrpc --with-openssl --with-mhash --with-pcre-regex --with-sqlite3 --with-zlib --enable-bcmath --with-iconv --with-bz2 --enable-calendar --with-curl\u003cspan class=\"o\"\u003e=\u003c/span\u003e/usr/local/include/curl/ --with-cdb --enable-dom --enable-exif --enable-fileinfo --enable-filter --with-pcre-dir --enable-ftp --with-gd --with-openssl-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-freetype-dir --enable-gd-jis-conv --with-gettext --with-gmp --with-mhash --enable-json --enable-mbstring --enable-mbregex --enable-mbregex-backtrack --with-onig --enable-pdo --with-mysqli\u003cspan class=\"o\"\u003e=\u003c/span\u003emysqlnd --with-pdo-mysql\u003cspan class=\"o\"\u003e=\u003c/span\u003emysqlnd --with-zlib-dir --with-pdo-sqlite --with-readline --enable-session --enable-shmop --enable-simplexml --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-wddx --with-libxml-dir --with-xsl --enable-zip --enable-mysqlnd-compression-support --with-pear --enable-opcache\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emake\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo make install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"编译期间遇到的问题汇总\"\u003e编译期间遇到的问题汇总\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003echecking for cURL 7.15.5 or greater\u0026hellip; configure: error: cURL version 7.15.5 or later is required to compile php with cURL support\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e实际上我本地已经安装了最新的版本。\u0026ndash;with-curl不指定路径的话，会在/usr/include/curl下找头文件。但我本机已有的libcurl貌似没有这些头文件。尝试`yum install curl curl-devel`，报了一个多版本冲突的问题。所以最后还是从curl官网下载了最新的tar包，手动编译安装后，--with-curl指定路径为/usr/local/include/curl/\u003c/p\u003e","title":"编译安装php7.3"},{"content":"在官网下载适合php版本的包。pecl官网 解压\ntar zxvf protobuf.tar.gz cd到目录并用phpize生成configure文件\ncd protobuf-3.7.1/(如果是从github下载的，则cd到protobuf-3.7.1/php/ext/google/protobuf) phpize 编译三板斧\n./configure --with-php-config=/usr/local/bin/php-config make sudo make install 最后会提示你已经装到指定扩展目录了 Installing shared extensions: /usr/local/php7/lib/php/extensions/no-debug-non-zts-20180731/ 其它扩展编译也是一样的方式：参考 /posts/compiled-php-extension-in-linux/\n","permalink":"https://blog-foamzou-com.pages.dev/posts/install-protobuf-so/","summary":"\u003cp\u003e在官网下载适合php版本的包。\u003ca href=\"https://pecl.php.net/package/protobuf\"\u003epecl官网\u003c/a\u003e 解压\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etar zxvf protobuf.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ecd到目录并用phpize生成configure文件\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e protobuf-3.7.1/\u003cspan class=\"o\"\u003e(\u003c/span\u003e如果是从github下载的，则cd到protobuf-3.7.1/php/ext/google/protobuf\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ephpize\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e编译三板斧\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./configure --with-php-config\u003cspan class=\"o\"\u003e=\u003c/span\u003e/usr/local/bin/php-config\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emake\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo make install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e最后会提示你已经装到指定扩展目录了 Installing shared extensions:     /usr/local/php7/lib/php/extensions/no-debug-non-zts-20180731/ 其它扩展编译也是一样的方式：参考 /posts/compiled-php-extension-in-linux/\u003c/p\u003e","title":"编译protobuf.so扩展"},{"content":"安装 参见github\n使用场景 保证同一时间只有一个进程运行。 例如 crontab 设定每分钟跑一次 1.php ，但如果超过1分钟该脚本还没执行完，就会出现多个php脚本同时运行的情况，在某些场景下可能会有问题。 为了满足上述需求，我们可能会在脚本里添加一段代码，创建锁，执行完后删除锁，若锁文件存在则直接return。 还有另一种解决方案就是用 lockf 使用例子：\nlockf -s -t 0 /tmp/xx.lock /usr/local/bin/php -f 1.php ","permalink":"https://blog-foamzou-com.pages.dev/posts/lockf/","summary":"\u003ch3 id=\"安装\"\u003e安装\u003c/h3\u003e\n\u003cp\u003e参见\u003ca href=\"https://github.com/woshizoufeng/lockf\"\u003egithub\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"使用场景\"\u003e使用场景\u003c/h3\u003e\n\u003cp\u003e保证同一时间只有一个进程运行。 例如 crontab 设定每分钟跑一次 1.php ，但如果超过1分钟该脚本还没执行完，就会出现多个php脚本同时运行的情况，在某些场景下可能会有问题。 为了满足上述需求，我们可能会在脚本里添加一段代码，创建锁，执行完后删除锁，若锁文件存在则直接return。 还有另一种解决方案就是用 lockf 使用例子：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elockf -s -t \u003cspan class=\"m\"\u003e0\u003c/span\u003e /tmp/xx.lock /usr/local/bin/php -f 1.php\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"用lockf保证同一时间只有一个进程运行"},{"content":"今天有需求需要用到nginx的stream模块，但mac已经安装的nginx默认是不带该扩展的。 我选择了重新安装nginx。\nbrew tap denji/nginx brew install nginx-full --with-stream #如果已经是最新版本，则会提示nginx版本已安装，可选择重新安装 brew reinstall nginx-full --with-stream 若安装nginx时提示，与已有nginx有冲突。需要先断开软链\nbrew unlink nginx ","permalink":"https://blog-foamzou-com.pages.dev/posts/install-nginx-module-in-mac/","summary":"\u003cp\u003e今天有需求需要用到nginx的stream模块，但mac已经安装的nginx默认是不带该扩展的。 我选择了重新安装nginx。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew tap denji/nginx\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew install nginx-full --with-stream\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#如果已经是最新版本，则会提示nginx版本已安装，可选择重新安装\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew reinstall nginx-full --with-stream\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e若安装nginx时提示，与已有nginx有冲突。需要先断开软链\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew unlink nginx\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"在mac安装nginx模块"},{"content":" 作为程序员，在工作中经常用到rm。我在不久前用vscode写代码，在底下的终端里想删掉没用的文件，手抖把未提交到git的代码文件删了。还好代码量不多，否则会崩溃。毕竟重写代码是很痛苦的~ 因此本文标题提上了日程\n选择一款安全的删除脚本 Github看到一个脚本满足需求。 github地址，里边有多种安装方式。我选择的是npm全局安装。\nnpm i -g safe-rm 安装后，safe-rm命令就可以用了~\n将安装好的脚本设置为rm的别名 vim编辑~/.bash_profile(或其他bash启动时会执行的文件)。添加 alias rm='safe-rm' 由于我使用了fish-shell，因此还需要在fish启动时会执行的config文件里添加别名：vim编辑~/.config/fish/config.fish。添加 alias rm='safe-rm' Done 添加完之后别忘了重新打开终端窗口哦（或者source刚刚的配置文件）。至此，rm后文件的被mv到~/.Trash。即使是重名的文件也会在文件尾添加时间后缀，保证文件不被覆盖。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/setup-trash-for-safe-rm/","summary":"\u003cblockquote\u003e\n\u003cp\u003e作为程序员，在工作中经常用到rm。我在不久前用vscode写代码，在底下的终端里想删掉没用的文件，手抖把未提交到git的代码文件删了。还好代码量不多，否则会崩溃。毕竟重写代码是很痛苦的~ 因此本文标题提上了日程\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"选择一款安全的删除脚本\"\u003e选择一款安全的删除脚本\u003c/h3\u003e\n\u003cp\u003eGithub看到一个脚本满足需求。 \u003ca href=\"https://github.com/kaelzhang/shell-safe-rm\"\u003egithub地址\u003c/a\u003e，里边有多种安装方式。我选择的是npm全局安装。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm i -g safe-rm\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e安装后，safe-rm命令就可以用了~\u003c/p\u003e\n\u003ch3 id=\"将安装好的脚本设置为rm的别名\"\u003e将安装好的脚本设置为rm的别名\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003evim编辑~/.bash_profile(或其他bash启动时会执行的文件)。添加 \u003ccode\u003ealias rm='safe-rm'\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e由于我使用了fish-shell，因此还需要在fish启动时会执行的config文件里添加别名：vim编辑~/.config/fish/config.fish。添加 \u003ccode\u003ealias rm='safe-rm'\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"done\"\u003eDone\u003c/h3\u003e\n\u003cp\u003e添加完之后别忘了重新打开终端窗口哦（或者source刚刚的配置文件）。至此，rm后文件的被mv到~/.Trash。即使是重名的文件也会在文件尾添加时间后缀，保证文件不被覆盖。\u003c/p\u003e","title":"给你的Mac/Linux的rm装一个回收站"},{"content":"HTTP是什么 超文本传输协议（英文：HyperText Transfer Protocol，缩写：HTTP）是互联网上应用最为广泛的一种网络协议。是一个基于请求与响应模式的、无状态的、应用层的协议，常基于TCP的连接方式，绝大多数的Web开发，都是构建在HTTP协议之上的Web应用。\n为了方便通信就必须统一约定好双方的数据协议，如果每个人都搞一套自己的规则，这玩起来就很麻烦了。因此IETF (互联网工程任务组) 推动了HTTP的统一和发展。现在大家用得最多的还是1999年收录于RFC 2616的1.1版本，2015年发布的2.0版本在推广道路上任重道远。\nHTTP[S]报文 最直观上的差异，HTTP协议用明文传输报文，HTTPS用密文。 HTTP的缺陷 窃听风险（eavesdropping）：明文传输，第三方可以获知通信内容。 篡改风险（tampering）：第三方可以修改通信内容。 冒充风险（pretending）：第三方可以冒充他人身份参与通信。 HTTPS是什么 超文本传输安全协议（英语：Hypertext Transfer Protocol Secure，缩写：HTTPS，常称为HTTP over TLS，HTTP over SSL或HTTP Secure） 是一种透过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信，但利用SSL/TLS协议来加解密数据包。\nHTTPS开发的主要目的，是提供对网站服务器的身份认证，保护交换数据的隐私与完整性； HTTPS并不是一个单独的协议，而是对工作在一加密连接（TLS/SSL）上的常规HTTP协议的称呼。因此HTTPS被称之为身披SSL外壳的HTTP。\nSSL/TLS协议 传输层安全性协议（Transport Layer Security，缩写作 TLS），及其前身安全套接层（Secure Sockets Layer，缩写作 SSL）是一种安全协议，目的是为互联网通信，提供安全及数据完整性保障\n网景公司（Netscape）在1994年推出首版网页浏览器，网景导航者时，推出HTTPS协议，以SSL进行加密，这是SSL的起源。后面，IETF将SSL进行标准化，称为TLS。在浏览器、电子邮件、即时通信、VoIP、网络传真等应用程序中，广泛支持这个协议\n协议\n年份\n描述\nSSL 1.0\nN/A\n从未公开过，因为存在严重的安全漏洞\nSSL 2.0\n1995\n因为存在数个严重的安全漏洞而被3.0版本替代\nSSL 3.0\n1996\n2014年10月Google发现该版本的严重漏洞，建议全面禁用SSL版本\nTLS 1.0\n1999\nIETF标准化后的第一个版本。包括可以降级到SSL 3.0的实现，这削弱了连接的安全性\nTLS 1.1\n2006\n-\nTLS 1.2\n2008\n删除了对SSL的兼容。目前使用最广泛的版本\nTLS 1.3\n2018\n截至本文撰写，为建议标准的互联网草案\n在TCP/IP模型的位置：介于传输层与应用层之间 TLS内部协议划分 记录协议：位于TLS握手协议的下面，在可靠的传输协议(如TCP/IP)上面。其负责识别不同的消息类型，以及每条消息的完整性、安全性验证 握手协议：服务端与客户端在应用程序协议传输之前进行相互认证，协商加密算法和加密密钥 另外还有3个辅助协议：\n改变加密方式协议，用来通知对方接下来要切换加解密方案了(有点冗余，在TLS1.3里面已经被删掉了) 警告协议，定义了校验及其他出错类型， 应用数据协议， 把http，smtp等数据流传入记录层做处理并传输。 SSL/TLS解决了什么问题 【内容加密】所有信息都是加密传播，第三方无法窃听。（密钥协商机制） 【数据完整性】具有校验机制，一旦被篡改，通信双方会立刻发现。（MAC（Message authentication code）校验机制） 【身份认证】配备身份证书，防止身份被冒充（证书认证机制）\nSSL的握手过程 以下是使用curl请求https://baidu.com的详情\nfoam@cee: ~ » curl \u0026#34;https://baidu.com\u0026#34; -v * Rebuilt URL to: https://baidu.com/ * Trying 123.125.115.110... * TCP_NODELAY set * Connected to baidu.com (123.125.115.110) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH * successfully set certificate verify locations: * CAfile: /etc/ssl/cert.pem CApath: none * TLSv1.2 (OUT), TLS handshake, Client hello (1): * TLSv1.2 (IN), TLS handshake, Server hello (2): * TLSv1.2 (IN), TLS handshake, Certificate (11): * TLSv1.2 (IN), TLS handshake, Server key exchange (12): * TLSv1.2 (IN), TLS handshake, Server finished (14): * TLSv1.2 (OUT), TLS handshake, Client key exchange (16): * TLSv1.2 (OUT), TLS change cipher, Client hello (1): * TLSv1.2 (OUT), TLS handshake, Finished (20): * TLSv1.2 (IN), TLS change cipher, Client hello (1): * TLSv1.2 (IN), TLS handshake, Finished (20): * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 * ALPN, server accepted to use http/1.1 * Server certificate: * subject: C=CN; L=Beijing; O=BeiJing Baidu Netcom Science Technology Co., Ltd; OU=service operation department; CN=www.baidu.cn * start date: Apr 3 00:00:00 2018 GMT * expire date: Apr 3 12:00:00 2019 GMT * subjectAltName: host \u0026#34;baidu.com\u0026#34; matched cert\u0026#39;s \u0026#34;baidu.com\u0026#34; * issuer: C=US; O=DigiCert Inc; CN=DigiCert SHA2 Secure Server CA * SSL certificate verify ok. \u0026gt; GET / HTTP/1.1 ... \u0026lt; HTTP/1.1 302 Moved Temporarily ... 我们分析下其中TLS1.2握手的过程：\nTLS handshake, Client Hello【客户端向服务端问好】 客户端通过发送Client Hello报文开始建立SSL通信，报文包含客户端支持的SSL版本，加密套件列表，随机数。上面例子中，ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH就是客户端支持的加密套件的表达式。 TLS handshake, Server Hello【服务端回礼】 服务端回复Server Hello作为应答，报文包含服务端选择好的SSL版本，加密套件，随机数。上面例子中，服务端选择了TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256。 TLS handshake, Certificate【服务端亮出身份】 服务端发送证书链（从根证书到自身的证书）。证书包含证书所有者、颁发机构以及公钥、数字签名等信息。 客户端收到证书后，会校验域名；判断有效时间；判断颁发机构是否可信任；用颁发机构的公钥解开加密后的数字签名（解开后得到证书摘要和摘要算法），计算并判断证书摘要是否一致。 如果校验过程中出现问题，客户端将报Alert警告，并终止SSL握手。当然，如果警告级别只是warning（还有一种是fatal），那么客户端也可以选择忽略警告并继续完成握手过程。 TLS handshake, Server key exchange【服务端将密钥生成参数及方法告知客户端】 对于使用DHE/ECDHE非对称密钥协商算法的，会有该次握手（RSA、DH、ECDH则没有）。 以ECDHE为例，服务端随机生成随机值Rb，计算Pb(x,y) = Rb * Q(x, y)。然后将Pb(x, y)发送给客户端，用来在后续步骤中计算出PreMasterSecret。ps：该条消息包含一个用服务端私钥作的签名。 TLS handshake, Server finished【服务端提醒：关于密钥生成，该说的我都说完了】 服务器发送这条消息表明，服务器部分的密钥交换信息已经发送完了，等待客户端的消息以继续接下来的步骤。这条消息只用作提醒，不包含数据域。 TLS handshake, Client key exchange【客户端将密钥生成参数及方法告知服务端】 这条消息会把PreMasterSecret或者生成PreMasterSecret的数据发给服务端。 具体是哪种数据与所选用的密钥交换算法有关： RSA：数据为用服务器RSA公钥加密过的PreMasterSecret ECDHE：客户端随机生成随机值Ra，计算Pa(x, y) = Ra * Q(x, y)。然后将Pa(x, y)发给服务端。客户端计算Sa(x, y) = Ra * Pb(x, y)；服务器计算Sb(x, y) = Rb *Pa(x, y)；算法保证了Sa = Sb = S，提取其中的S的x向量作为PreMasterSecret ps: 此次握手过后，双方都拿到了可以计算出MasterSecret的PreMasterSecret。 PRF( secret , label , seed ) master_secret = PRF(pre_master_secret, \u0026#34;master secret\u0026#34;, ClientHello.random + ServerHello.random) [0..47]; TLS change cipher, Client hello【客户端：接下来我要用新的加密方式与你交流啦】 客户端发送更改加密方式信号。本流程不携带任何数据，也不参与最后的哈希完整性计算。只是一个宣告信道开始的流程。TLS1.3将其移除。 TLS handshake, Finished【客户端：我对握手全过程计算了哈希，你验证下】 客户端发送，用协商好的对称加密密钥（MasterSecret）加密过的握手数据包。该数据包完整地计算了从握手开始到结束的所有内容的哈希值，保证了整个握手过程中，数据没有被篡改。服务端会去做校验。 ps: 这条是整个SSL握手过程中，首次使用对称性加密的数据。 TLS change cipher, Client hello【服务端：接下来我也要用新的加密方式与你交流啦】 服务端发送更改加密方式信号。TLS1.3将其移除。 TLS handshake, Finished【服务端：我也对握手全过程计算了哈希，你也验证下】 服务端发送，用协商好的对称加密密钥加密过的握手数据包。客户端也会去做校验。 握手终于结束啦，接下来的http数据传输将全部用辛辛苦苦协商好的MasterSecret进行对称加密。\nTLS1.3减少了握手期间的RTT（来回通信延迟） 扩展 密码学套件的标准名字 以TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256为例：\nTLS代表的是TLS协议 WITH是一个分隔单词，前面的ECDHE_RSA是握手过程所使用的非对称加密方法，后面的AES_128_GCM_SHA256是加密信道的对称加密方法和用于数据完整性检查的哈希方法 ECDHE_RSA，客户端与服务端之间在握手期间，密钥交换信息使用的非对称加密算法是第一个算法，证书认证时使用的非对称加密算法是第二个。有的证书套件，例如TLS_RSA_WITH_AES_256_CBC_SHA，WITH单词前面只有一个RSA单词，这时就表示密钥交换算法和证书算法都是使用的RSA，所以只指定一次即可。可选的主要的密钥交换算法包括: RSA, DH, ECDH, ECDHE。可选的主要的证书算法包括：RSA, DSA, ECDSA。两者可以独立选择，并不冲突。 AES_128_GCM，指的是AES这种对称加密算法的128位算法的GCM模式 SHA256，计算消息完整性的哈希算法。 Charles等代理程序是怎么实现解析https的 本质是中间人。代理程序处在客户端与服务端之间，服务端下发证书的时候，代理程序copy一份数据，并将公钥信息换成自己的，最后用自己的根证书签名。 最最重要的一步是，将自己的根证书加入到系统信任证书列表里边。没有内鬼是破解不了HTTPS的。\n参考资料 HTTPS的二三事 图解HTTP之HTTPS详解 HTTPS协议详解(四)：TLS/SSL握手过程 沃通 维基百科 阮一峰博客 TLS的密码学套件 深度解读SSL/TLS实现 Master secret的生成 ECC证书和RSA证书 TLS1.3/QUIC 是怎样做到 0-RTT 的\n","permalink":"https://blog-foamzou-com.pages.dev/posts/about-https/","summary":"\u003ch2 id=\"http是什么\"\u003eHTTP是什么\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e超文本传输协议（英文：HyperText Transfer Protocol，缩写：HTTP）是互联网上应用最为广泛的一种网络协议。是一个基于请求与响应模式的、无状态的、应用层的协议，常基于TCP的连接方式，绝大多数的Web开发，都是构建在HTTP协议之上的Web应用。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e为了方便通信就必须统一约定好双方的数据协议，如果每个人都搞一套自己的规则，这玩起来就很麻烦了。因此IETF (互联网工程任务组) 推动了HTTP的统一和发展。现在大家用得最多的还是1999年收录于RFC 2616的1.1版本，2015年发布的2.0版本在推广道路上任重道远。\u003c/p\u003e\n\u003ch2 id=\"https报文\"\u003eHTTP[S]报文\u003c/h2\u003e\n\u003cp\u003e最直观上的差异，HTTP协议用明文传输报文，HTTPS用密文。  \u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"报文对比\" loading=\"lazy\" src=\"/posts/about-https/12842298-abae88306d66e241-2.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"http的缺陷\"\u003eHTTP的缺陷\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e窃听风险（eavesdropping）：明文传输，第三方可以获知通信内容。\u003c/li\u003e\n\u003cli\u003e篡改风险（tampering）：第三方可以修改通信内容。\u003c/li\u003e\n\u003cli\u003e冒充风险（pretending）：第三方可以冒充他人身份参与通信。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"https是什么\"\u003eHTTPS是什么\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e超文本传输安全协议（英语：Hypertext Transfer Protocol Secure，缩写：HTTPS，常称为HTTP over TLS，HTTP over SSL或HTTP Secure） 是一种透过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信，但利用SSL/TLS协议来加解密数据包。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eHTTPS开发的主要目的，是提供对网站服务器的身份认证，保护交换数据的隐私与完整性； HTTPS并不是一个单独的协议，而是对工作在一加密连接（TLS/SSL）上的常规HTTP协议的称呼。因此HTTPS被称之为身披SSL外壳的HTTP。\u003c/p\u003e\n\u003ch2 id=\"ssltls协议\"\u003eSSL/TLS协议\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e传输层安全性协议（Transport Layer Security，缩写作 TLS），及其前身安全套接层（Secure Sockets Layer，缩写作 SSL）是一种安全协议，目的是为互联网通信，提供安全及数据完整性保障\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e网景公司（Netscape）在1994年推出首版网页浏览器，网景导航者时，推出HTTPS协议，以SSL进行加密，这是SSL的起源。后面，IETF将SSL进行标准化，称为TLS。在浏览器、电子邮件、即时通信、VoIP、网络传真等应用程序中，广泛支持这个协议\u003c/p\u003e\n\u003cp\u003e协议\u003c/p\u003e\n\u003cp\u003e年份\u003c/p\u003e\n\u003cp\u003e描述\u003c/p\u003e\n\u003cp\u003eSSL 1.0\u003c/p\u003e\n\u003cp\u003eN/A\u003c/p\u003e\n\u003cp\u003e从未公开过，因为存在严重的安全漏洞\u003c/p\u003e\n\u003cp\u003eSSL 2.0\u003c/p\u003e\n\u003cp\u003e1995\u003c/p\u003e\n\u003cp\u003e因为存在数个严重的安全漏洞而被3.0版本替代\u003c/p\u003e\n\u003cp\u003eSSL 3.0\u003c/p\u003e\n\u003cp\u003e1996\u003c/p\u003e\n\u003cp\u003e2014年10月Google发现该版本的严重漏洞，建议全面禁用SSL版本\u003c/p\u003e\n\u003cp\u003eTLS 1.0\u003c/p\u003e\n\u003cp\u003e1999\u003c/p\u003e\n\u003cp\u003eIETF标准化后的第一个版本。包括可以降级到SSL 3.0的实现，这削弱了连接的安全性\u003c/p\u003e\n\u003cp\u003eTLS 1.1\u003c/p\u003e\n\u003cp\u003e2006\u003c/p\u003e\n\u003cp\u003e-\u003c/p\u003e\n\u003cp\u003eTLS 1.2\u003c/p\u003e\n\u003cp\u003e2008\u003c/p\u003e\n\u003cp\u003e删除了对SSL的兼容。目前使用最广泛的版本\u003c/p\u003e\n\u003cp\u003eTLS 1.3\u003c/p\u003e\n\u003cp\u003e2018\u003c/p\u003e\n\u003cp\u003e截至本文撰写，为建议标准的互联网草案\u003c/p\u003e\n\u003ch3 id=\"在tcpip模型的位置介于传输层与应用层之间\"\u003e在TCP/IP模型的位置：介于传输层与应用层之间\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"SSL/TLS在TCP/IP模型的位置\" loading=\"lazy\" src=\"/posts/about-https/12842298-cfed569a5b9bd924-2.png\"\u003e\u003c/p\u003e","title":"HTTPS原理解析"},{"content":"背景 近来es查询很慢，kibana的discover界面偶尔还会因为查询请求超时而无法显示数据。/_cat/indices?v 等对es的查询也慢的出奇，需要1、2分钟才返回结果。\n排查 top命令看了es的java进程，发现cpu一直很高，130%左右，一直没有下降过。查看es的日志，发现gc.log中几乎每秒都要触发一次GC Full GC (Allocation Failure)。内存不够用，又没有内存可回收，所以GC也不断。怪不得CPU这么高，大部分时间都用在gc上面了。\n处理 调整es可使用的内存大小。编辑config/jvm.options，调整了Xms和Xmx的大小，由原来默认的1g调整为10g。（官方建议这个值不要超过物理内存的50%，也不要超过32G。详见官网说明）接着重启es就好了。观察cpu，虽然偶尔也会彪上130%，但总体来说正常了，查询也变得很快。 ps：es重启后，需要观察logstash是否退出了。如果退出，需要重新把logstash拉起来。 pss：这次是小坑，后面可能还有很多大坑需要踩。后续有cpu高、查询慢的问题也一并归类到该文。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/cpu-of-elasticsearch-high-search-slow/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e近来es查询很慢，kibana的discover界面偶尔还会因为查询请求超时而无法显示数据。\u003ccode\u003e/_cat/indices?v\u003c/code\u003e 等对es的查询也慢的出奇，需要1、2分钟才返回结果。\u003c/p\u003e\n\u003ch2 id=\"排查\"\u003e排查\u003c/h2\u003e\n\u003cp\u003etop命令看了es的java进程，发现cpu一直很高，130%左右，一直没有下降过。查看es的日志，发现gc.log中几乎每秒都要触发一次GC \u003ccode\u003eFull GC (Allocation Failure)\u003c/code\u003e。内存不够用，又没有内存可回收，所以GC也不断。怪不得CPU这么高，大部分时间都用在gc上面了。\u003c/p\u003e\n\u003ch2 id=\"处理\"\u003e处理\u003c/h2\u003e\n\u003cp\u003e调整es可使用的内存大小。编辑\u003ccode\u003econfig/jvm.options\u003c/code\u003e，调整了Xms和Xmx的大小，由原来默认的1g调整为10g。（官方建议这个值不要超过物理内存的50%，也不要超过32G。详见\u003ca href=\"https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html\"\u003e官网说明\u003c/a\u003e）接着重启es就好了。观察cpu，虽然偶尔也会彪上130%，但总体来说正常了，查询也变得很快。 ps：es重启后，需要观察logstash是否退出了。如果退出，需要重新把logstash拉起来。 pss：这次是小坑，后面可能还有很多大坑需要踩。后续有cpu高、查询慢的问题也一并归类到该文。\u003c/p\u003e","title":"排查elasticsearch的cpu居高不下，查询慢的问题"},{"content":"2020-04-02更新： 之前的安装方法已经废弃了，可通过以下方式安装\nbrew tap AdoptOpenJDK/openjdk brew cask install \u0026lt;version\u0026gt; 这里有全部的version列表 例如可以这么安装\nbrew cask install adoptopenjdk8 之前用brew安装了java9。但我有些软件不兼容，只能降级到java8。这里简单记录下步骤。\n卸载 brew cask uninstall java 安装指定版本 brew tap caskroom/versions foam@foamdeMBP: sens » brew cask search java [15:13:54] ==\u0026gt; Exact Match java ==\u0026gt; Partial Matches charles-applejava eclipse-javascript java6 netbeans-java-ee yourkit-java-profiler eclipse-java java-jdk-javadoc java8 netbeans-java-se 估计我没更新brew的缘故，上面只列出java6和java8。java7呢，有点懵逼。 键入下面命令，然后就会自动下载安装了。可能会有点慢。\nfoam@foamdeMBP: sens » brew cask install java8 Updating Homebrew... ^CWarning: Unexpected method \u0026#39;license\u0026#39; called during caveats on Cask java8. Follow the instructions here: https://github.com/caskroom/homebrew-cask#reporting-bugs ==\u0026gt; Caveats This Cask makes minor modifications to the JRE to prevent issues with packaged applications, as discussed here: https://bugs.eclipse.org/bugs/show_bug.cgi?id=411361 If your Java application still asks for JRE installation, you might need to reboot or logout/login. ==\u0026gt; Satisfying dependencies ==\u0026gt; Downloading http://download.oracle.com/otn-pub/java/jdk/8u172-b11/a58eab1ec242421181065cdc37240b08/jdk-8u172-macosx-x64.dmg ######################################################################## 100.0% ==\u0026gt; Verifying checksum for Cask java8 ==\u0026gt; Installing Cask java8 ==\u0026gt; Running installer for java8; your password may be necessary. ==\u0026gt; Package installers may write to any location; options such as --appdir are ignored. Password: ==\u0026gt; installer: Package name is JDK 8 Update 172 ==\u0026gt; installer: Installing at base path / ==\u0026gt; installer: The install was successful. 🍺 java8 was successfully installed! 确认下，ok了。\nfoam@foamdeMBP: sens » java -version [15:46:05] java version \u0026#34;1.8.0_172\u0026#34; Java(TM) SE Runtime Environment (build 1.8.0_172-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode) ","permalink":"https://blog-foamzou-com.pages.dev/posts/uninstall-and-install-specific-java-version-on-mac/","summary":"\u003cp\u003e2020-04-02更新： 之前的安装方法已经废弃了，可通过以下方式安装\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew tap AdoptOpenJDK/openjdk\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew cask install \u0026lt;version\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ca href=\"https://github.com/AdoptOpenJDK/homebrew-openjdk\"\u003e这里\u003c/a\u003e有全部的version列表 例如可以这么安装\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew cask install adoptopenjdk8\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003e之前用brew安装了java9。但我有些软件不兼容，只能降级到java8。这里简单记录下步骤。\u003c/p\u003e\n\u003ch2 id=\"卸载\"\u003e卸载\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew cask uninstall java\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"安装指定版本\"\u003e安装指定版本\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew tap caskroom/versions\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efoam@foamdeMBP: sens » brew cask search java                                                                                                                                         \u003cspan class=\"o\"\u003e[\u003c/span\u003e15:13:54\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u0026gt; Exact Match\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003ejava\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u0026gt; Partial Matches\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003echarles-applejava                     eclipse-javascript                    java6                                 netbeans-java-ee                      yourkit-java-profiler\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eeclipse-java                          java-jdk-javadoc                      java8                                 netbeans-java-se\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e估计我没更新brew的缘故，上面只列出java6和java8。java7呢，有点懵逼。 键入下面命令，然后就会自动下载安装了。可能会有点慢。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efoam@foamdeMBP: sens » brew cask install java8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUpdating Homebrew...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e^CWarning: Unexpected method \u003cspan class=\"s1\"\u003e\u0026#39;license\u0026#39;\u003c/span\u003e called during caveats on Cask java8.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFollow the instructions here:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  https://github.com/caskroom/homebrew-cask#reporting-bugs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u0026gt; Caveats\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis Cask makes minor modifications to the JRE to prevent issues with\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epackaged applications, as discussed here:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  https://bugs.eclipse.org/bugs/show_bug.cgi?id\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e411361\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIf your Java application still asks \u003cspan class=\"k\"\u003efor\u003c/span\u003e JRE installation, you might need\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eto reboot or logout/login.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u0026gt; Satisfying \u003cspan class=\"nv\"\u003edependencies\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u0026gt; Downloading http://download.oracle.com/otn-pub/java/jdk/8u172-b11/a58eab1ec242421181065cdc37240b08/jdk-8u172-macosx-x64.dmg\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e######################################################################## 100.0%\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u0026gt; Verifying checksum \u003cspan class=\"k\"\u003efor\u003c/span\u003e Cask \u003cspan class=\"nv\"\u003ejava8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u0026gt; Installing Cask \u003cspan class=\"nv\"\u003ejava8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u0026gt; Running installer \u003cspan class=\"k\"\u003efor\u003c/span\u003e java8\u003cspan class=\"p\"\u003e;\u003c/span\u003e your password may be necessary.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u0026gt; Package installers may write to any location\u003cspan class=\"p\"\u003e;\u003c/span\u003e options such as --appdir are ignored.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePassword:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u0026gt; installer: Package name is JDK \u003cspan class=\"m\"\u003e8\u003c/span\u003e Update \u003cspan class=\"nv\"\u003e172\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u0026gt; installer: Installing at base path /\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u0026gt; installer: The install was successful.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e🍺  java8 was successfully installed!\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e确认下，ok了。\u003c/p\u003e","title":"mac卸载和安装java指定版本"},{"content":"为什么使用它 受够了mysql原生client后，你会爱上mycli的自动补全和高亮。对于我这种常常记不住表结构的人来说，自动补全真是爽得不行。 ps：sql新手谨慎使用，建议多裸写sql后再来使用该软件\n安装 Mac\nbrew install mycli CentOS\n# 请尽量先将pip升级到最新版本 pip install --upgrade pip yum install python-devel yum install libffi-devel easy_install mycli 使用方法 和mysql原生命令行一样：\nmycli -uname ","permalink":"https://blog-foamzou-com.pages.dev/posts/mycli/","summary":"\u003ch2 id=\"为什么使用它\"\u003e为什么使用它\u003c/h2\u003e\n\u003cp\u003e受够了mysql原生client后，你会爱上mycli的自动补全和高亮。对于我这种常常记不住表结构的人来说，自动补全真是爽得不行。 ps：sql新手谨慎使用，建议多裸写sql后再来使用该软件\u003c/p\u003e\n\u003ch2 id=\"安装\"\u003e安装\u003c/h2\u003e\n\u003cp\u003eMac\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebrew install mycli\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCentOS\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 请尽量先将pip升级到最新版本\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install --upgrade pip\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eyum install python-devel\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eyum install libffi-devel \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eeasy_install mycli\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"使用方法\"\u003e使用方法\u003c/h2\u003e\n\u003cp\u003e和mysql原生命令行一样：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emycli -uname\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"mysql命令行神器mycli"},{"content":" 总结：知乎的视频播放基于M3U8文件，找一种支持通过该类文件下载目标文件的工具即可，例如FFmpeg\n某个慵懒的周末上午刷着知乎，一位知友po了自己用鼓(还是啥?)敲击的旅行青蛙音乐的视频，评论区有小伙伴想要该视频的音频文件下载，想着举手之劳，顺便看看知乎的视频播放用的啥技术。 打开开发者工具，刷新网页并播放，观察网络请求并没有media文件的下载，倒是看到很多.ts文件不断下载中。看来是将视频切割为多个片段了，Google后了解到知乎使用的是M3U8文件，再从该文件下载片段。 什么是M3U8？这是一种utf8格式的M3U（MP3 URL的缩写）文件，最先由Fraunhofer协会（研究出MP3算法的那个）设计并用于Winplay3软件。最初只是应用于MP3等音频文件，现在广泛应用于在线流媒体和视频播放。说白了，它就是一个资源文件的播放列表索引文件，该文件记录了目标资源片段的url链接。具体请看维基百科 打开知乎视频，观察网络请求，你会发现请求了一个m3u8的资源。看看它返回的是什么：\nfoam@foamdeMacBook-Pro: ~ » curl \u0026#34;https://vdn.vzuu.com/Act-ss-m3u8-hd/c338e5b09ab2431080a58ed4d1bb6e17/5a996be2-17da-11e8-b60a-0242ac112a05None.m3u8?auth_key=1521964082-0-0-4d282a5ef6e479a492e6182f044384f5\u0026amp;expiration=1521964082\u0026amp;disable_local_cache=0\u0026#34; #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:2 #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:2.000000, 5a996be2-17da-11e8-b60a-0242ac112a05None-00001.ts?auth_key=1521964082-0-0-c0110f185ac09713b4d717e1f2ec30ca #EXTINF:2.000000, 5a996be2-17da-11e8-b60a-0242ac112a05None-00002.ts?auth_key=1521964082-0-0-26ad0014261d1e1f94b1273d91e9a1ec #EXTINF:2.000000, 5a996be2-17da-11e8-b60a-0242ac112a05None-00003.ts?auth_key=1521964082-0-0-ed71bc54e68662748af8eb5228525b84 #EXTINF:2.000000, 5a996be2-17da-11e8-b60a-0242ac112a05None-00004.ts?auth_key=1521964082-0-0-7ef99c02438c16e8d0eabc4955cf3f84 # 有点长，省略若干行... ... #EXT-X-ENDLIST 可以看到返回了一个列表，每个片段2秒钟，包含了链接。 这里使用FFmpeg下载M3U8的资源。FFmpeg是一种处理音视频的强大的开源工具（向开源大佬们致敬），强大到令我泪流满面。该工具有win/linux/mac版本，请自行到官网或包管理器下载。 贴出命令： 根据M3U8下载资源文件：\nffmpeg -i \u0026#34;https://vdn.vzuu.com/Act-ss-m3u8-hd/c338e5b09ab2431080a58ed4d1bb6e17/5a996be2-17da-11e8-b60a-0242ac112a05None.m3u8?auth_key=1521964082-0-0-4d282a5ef6e479a492e6182f044384f5\u0026amp;expiration=1521964082\u0026amp;disable_local_cache=0\u0026#34; -c copy 1.mp4 将MP4转换为MP3\nffmpeg -i 1.mp4 -f mp3 -vn 1.mp3 感谢科技的美好~\n","permalink":"https://blog-foamzou-com.pages.dev/posts/download-zhihu-vedio/","summary":"\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e总结：知乎的视频播放基于M3U8文件，找一种支持通过该类文件下载目标文件的工具即可，例如FFmpeg\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e  某个慵懒的周末上午刷着知乎，一位知友po了自己用鼓(还是啥?)敲击的旅行青蛙音乐的视频，评论区有小伙伴想要该视频的音频文件下载，想着举手之劳，顺便看看知乎的视频播放用的啥技术。 打开开发者工具，刷新网页并播放，观察网络请求并没有media文件的下载，倒是看到很多.ts文件不断下载中。看来是将视频切割为多个片段了，Google后了解到知乎使用的是M3U8文件，再从该文件下载片段。 什么是M3U8？这是一种utf8格式的M3U（MP3 URL的缩写）文件，最先由Fraunhofer协会（研究出MP3算法的那个）设计并用于Winplay3软件。最初只是应用于MP3等音频文件，现在广泛应用于在线流媒体和视频播放。说白了，它就是一个资源文件的播放列表索引文件，该文件记录了目标资源片段的url链接。具体请看\u003ca href=\"https://en.wikipedia.org/wiki/M3U\"\u003e维基百科\u003c/a\u003e 打开知乎视频，观察网络请求，你会发现请求了一个m3u8的资源。看看它返回的是什么：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efoam@foamdeMacBook-Pro: ~ » curl \u003cspan class=\"s2\"\u003e\u0026#34;https://vdn.vzuu.com/Act-ss-m3u8-hd/c338e5b09ab2431080a58ed4d1bb6e17/5a996be2-17da-11e8-b60a-0242ac112a05None.m3u8?auth_key=1521964082-0-0-4d282a5ef6e479a492e6182f044384f5\u0026amp;expiration=1521964082\u0026amp;disable_local_cache=0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#EXTM3U\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#EXT-X-VERSION:3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#EXT-X-TARGETDURATION:2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#EXT-X-MEDIA-SEQUENCE:0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#EXTINF:2.000000,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5a996be2-17da-11e8-b60a-0242ac112a05None-00001.ts?auth_key\u003cspan class=\"o\"\u003e=\u003c/span\u003e1521964082-0-0-c0110f185ac09713b4d717e1f2ec30ca\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#EXTINF:2.000000,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5a996be2-17da-11e8-b60a-0242ac112a05None-00002.ts?auth_key\u003cspan class=\"o\"\u003e=\u003c/span\u003e1521964082-0-0-26ad0014261d1e1f94b1273d91e9a1ec\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#EXTINF:2.000000,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5a996be2-17da-11e8-b60a-0242ac112a05None-00003.ts?auth_key\u003cspan class=\"o\"\u003e=\u003c/span\u003e1521964082-0-0-ed71bc54e68662748af8eb5228525b84\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#EXTINF:2.000000,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5a996be2-17da-11e8-b60a-0242ac112a05None-00004.ts?auth_key\u003cspan class=\"o\"\u003e=\u003c/span\u003e1521964082-0-0-7ef99c02438c16e8d0eabc4955cf3f84\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 有点长，省略若干行...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#EXT-X-ENDLIST\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e可以看到返回了一个列表，每个片段2秒钟，包含了链接。 这里使用FFmpeg下载M3U8的资源。FFmpeg是一种处理音视频的强大的开源工具（向开源大佬们致敬），强大到令我泪流满面。该工具有win/linux/mac版本，请自行到官网或包管理器下载。 贴出命令： 根据M3U8下载资源文件：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003effmpeg -i \u003cspan class=\"s2\"\u003e\u0026#34;https://vdn.vzuu.com/Act-ss-m3u8-hd/c338e5b09ab2431080a58ed4d1bb6e17/5a996be2-17da-11e8-b60a-0242ac112a05None.m3u8?auth_key=1521964082-0-0-4d282a5ef6e479a492e6182f044384f5\u0026amp;expiration=1521964082\u0026amp;disable_local_cache=0\u0026#34;\u003c/span\u003e -c copy 1.mp4\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e将MP4转换为MP3\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003effmpeg -i 1.mp4 -f mp3 -vn 1.mp3\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e  感谢科技的美好~\u003c/p\u003e","title":"下载知乎的视频(M3U8)"},{"content":"Mysql的基本数据类型中并没有布尔型，之所以建表和数据操作中能够使用BOOLEAN是因为mysql将其作为了tinyint(1)的别名。用0表示false，1表示true。 但开发过程中，既然我们给某一字段定义为布尔型，那么在我们获取数据后，期望得到的必然是布尔值而不是0或1。因此我们可以在得到返回值后转换一下。 这里我使用的是mysql模块，该模块允许给typeCase属性设置一个回调函数。详见官网说明\nconnection.query({ sql: \u0026#39;...\u0026#39;, typeCast: function (field, next) { if (field.type == \u0026#39;TINY\u0026#39; \u0026amp;\u0026amp; field.length == 1) { return (field.string() == \u0026#39;1\u0026#39;); // 1 = true, 0 = false } return next(); } }); 但这也意味着使用该方法的项目不能使用tinyInt(1)类型了，自行取舍吧~\n","permalink":"https://blog-foamzou-com.pages.dev/posts/convert-tinyint-to-boolean-in-nodejs/","summary":"\u003cp\u003eMysql的基本数据类型中并没有布尔型，之所以建表和数据操作中能够使用BOOLEAN是因为mysql将其作为了tinyint(1)的别名。用0表示false，1表示true。 但开发过程中，既然我们给某一字段定义为布尔型，那么在我们获取数据后，期望得到的必然是布尔值而不是0或1。因此我们可以在得到返回值后转换一下。 这里我使用的是mysql模块，该模块允许给typeCase属性设置一个回调函数。详见\u003ca href=\"https://github.com/mysqljs/mysql#string\"\u003e官网说明\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-js\" data-lang=\"js\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econnection\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003equery\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003esql\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;...\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003etypeCast\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003efield\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003enext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003efield\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;TINY\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nx\"\u003efield\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elength\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003efield\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;1\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 1 = true, 0 = false\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nx\"\u003enext\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e但这也意味着使用该方法的项目不能使用tinyInt(1)类型了，自行取舍吧~\u003c/p\u003e","title":"NodeJs中将TinyInt转换为Boolean"},{"content":"平时用网易云音乐。要找我这里哦 偶尔也喜欢听一些外文歌，日语、韩语还有一些英文歌~\n","permalink":"https://blog-foamzou-com.pages.dev/posts/song-list-touch-heart-foreign-language/","summary":"\u003cp\u003e平时用网易云音乐。要找我\u003ca href=\"http://music.163.com/#/user/home?id=52644372\"\u003e这里\u003c/a\u003e哦 偶尔也喜欢听一些外文歌，日语、韩语还有一些英文歌~\u003c/p\u003e","title":"【歌单】那些柔情的外文歌"},{"content":"平时用网易云音乐。要找我这里哦 读书时候已经积累听过好多好多歌了，周杰伦，林俊杰，梁静茹等大神的作品默认就已经被标记为我喜欢。因此歌单里不会将这些大神的作品列入其中了。歌单里一般是近期感觉还可以的歌。 希望大家喜欢。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/song-list-my-love/","summary":"\u003cp\u003e平时用网易云音乐。要找我\u003ca href=\"http://music.163.com/#/user/home?id=52644372\"\u003e这里\u003c/a\u003e哦 读书时候已经积累听过好多好多歌了，周杰伦，林俊杰，梁静茹等大神的作品默认就已经被标记为我喜欢。因此歌单里不会将这些大神的作品列入其中了。歌单里一般是近期感觉还可以的歌。 希望大家喜欢。\u003c/p\u003e","title":"【歌单】我喜欢的"},{"content":"背景：最近需要使用nodeJs访问一个历史久远的网站，那个网站的服务器证书是错误的，且使用的协议是TLSv1.0。浏览器上不得不使用IE并关闭各种安全设置和设置为兼容模式才能正常访问。Nodejs的新版本已经不支持这种不安全的协议，所以需要搭建一个代理服务进行访问。刚开始使用的是mitmproxy ，当时的最新版本对于SSL错误会报错，所以将源码中校验部分去掉就可以正常使用了。但部署到生产环境，会出现cpu占用过高的情况。所以后面换了Squid。\n部署Squid参考了一篇文章，原文：here，下面是简单翻译。\nSquid是个很强大的Web代理，它可以应用于无线认证、重定向、用户身份验证、日志记录等。但其在SSL方面一直存在局限性。在3.2版本之前，Squid的策略只是简单地传递SSL加密流量，因为它无法校验受信任的SSL链接。对于每个SSL连接也无法给用户做预警。但3.5版本后允许更多的控制，但要注意仍然无法校验受信任的SSL链接。\n这里不会过多地介绍使用SSL Bump配置Squid以外的知识，对于编译和配置squid的细节你最好看下官方文档。 如果通过代理自动监测，通知浏览器连接到代理服务器，这样是挺简单的。但有些用户可能会试图规避这一点，并尝试直接连接。 在这种情况下，我们需要强制这些用户通过截取流量来使用代理。SSL Bumping的前提是中间人攻击，但由于这是在您的用户清楚所有流量都是检查过的环境中完成的，因此这并不是真正的攻击，这只是一种策略。Squid用于执行SSL Bumping有一些新方法，但是我会总结出最具实战性的方法：Squid收到一个https请求，然后为用户建立安全连接。 远程连接建立后，Squid会重新加密所有流量; 这时候的加密使用的是本地私钥，以及本地证书颁发机构即时创建出来的证书。 所以我们首先要确保的是你已经安装了3.5或更高版本的Squid。尽管3.2，3.3以及3.4版本也能实现，但3.5版本后SSL Bump的指令有了些显著变化。另外，编译Squid时需要带上‘\u0026ndash;with-openssl’参数。 在CentOS我使用以下参数来编译Squid（foam：我带上\u0026ndash;enable-ipf-transparent参数会报错，所以我是去掉再编译的）\n./configure \\ --prefix=/usr \\ --exec-prefix=/usr \\ --includedir=/usr/include \\ --datadir=/usr/share \\ --libdir=/usr/lib64 \\ --libexecdir=/usr/lib64/squid \\ --localstatedir=/var \\ --sysconfdir=/etc/squid \\ --sharedstatedir=/var/lib \\ --with-logdir=/var/log/squid \\ --with-pidfile=/var/run/squid.pid \\ --with-default-user=squid \\ --enable-silent-rules \\ --enable-dependency-tracking \\ --with-openssl \\ --enable-icmp \\ --enable-delay-pools \\ --enable-useragent-log \\ --enable-esi \\ --enable-follow-x-forwarded-for \\ --enable-ipf-transparent \\ --enable-auth 接下来我们需要生成本地的SSL证书，这里我使用的是简单的命令，没有在意怎么去加密。\n# Generate Private Key openssl genrsa -out example.com.private 2048 然后是创建Certificate Signing Request（CSR），即证书注册请求。\n# Create Certificate Signing Request openssl req -new -key example.com.private -out example.com.csr Country Name (2 letter code) [XX]:US State or Province Name (full name) []:Illinois Locality Name (eg, city) [Default City]:Chicago Organization Name (eg, company) [Default Company Ltd]:Example Company LTD. Organizational Unit Name (eg, section) []:Information Technology Common Name (eg, your name or your server\u0026#39;s hostname) []:Example Company LTD. Email Address []: Please enter the following \u0026#39;extra\u0026#39; attributes to be sent with your certificate request A challenge password []: An optional company name []:Example Company LTD. 请注意，我并没有给‘Common Name’ 设置一个域名。因为Squid会在用户请求时，使用当前访问的域名动态生成证书。接下来，我们给CSR生成个签名证书。\n# Sign Certificate openssl x509 -req -days 3652 -in example.com.csr -signkey example.com.private -out example.com.cert 完成以上操作后，请将私钥和证书复制到Squid能够访问的目录。另外，请确保存放私钥的目录是安全的。Squid代理用户需要拥有访问证书的权限，并作为受信任的根证书安装到每个用户的计算机上。 这是我没有使用*或一个域名作为‘Common Name’的真正原因，因为当作为证书颁发机构加载时，该属性就会被固定了。 下面来看看Squid的配置，以下配置只与主题相关，并不是完整的。ps:请按照下面的顺序配置。\n# Proxy Aware (non-intercepted traffic) http_port 192.168.0.1:3128 ssl-bump cert=/etc/squid/example.com.cert key=/etc/squid/example.com.private generate-host-certificates=on version=1 options=NO_SSLv2,NO_SSLv3,SINGLE_DH_USE # Intercepted Traffic https_port 192.168.0.1:3130 cert=/etc/squid/example.com.cert key=/etc/squid/example.com.private ssl-bump intercept generate-host-certificates=on version=1 options=NO_SSLv2,NO_SSLv3,SINGLE_DH_USE # SSL Bump Config ssl_bump stare all ssl_bump bump all 下面作些说明： http_port: 让Squid在ssl_bump模式下监听192.168.0.1的3130端口。这里我拒绝了SSLv2以及SSLv3的链接，并使用SINGLE_DH_USE。使用http_port时，浏览器是知道自己在与代理连接的。 https_port: 让Squid在ssl_bump拦截模式下监听192.168.0.1的3128端口。这里我同样拒绝了SSLv2以及SSLv3的链接，并使用SINGLE_DH_USE。使用https_port时，浏览器并不知道自己在连接代理，也就是说此时是透明代理。 ssl_bump stare：必需指令，关乎证书的正确生成。下面有更详细的介绍。 ssl_bump bump：执行bump的方法。 Squid的3.5版本有多种bump的方法和层次： splice：旧的方式，并没有涉及到证书。 bump：自动生成证书并对流量重新加密，这正是我们想要的。 peek：可以参与连接，并允许在后续拼接流量。 stare：可以参与连接，并允许在后续对其bump。 为了能够成功拦截流量并生成证书，我们需要知道用来生成证书的域。 如果浏览器知道它正在使用代理，倒是没问题。 但如果我们仅仅是通过拦截流量来获取信息，就会使用远程服务器的IP地址来生成证书，这样是行不通的。 所以我们必须先\u0026rsquo;stare\u0026rsquo; 连接。这样我们就可以获得域并用其生成正确的证书。 看到这里，你应该知道怎么做了。 但请注意，这本质上是打破了SSL信任机制。 你控制并影响了用户的信任策略（对某些人来说可能是一件好事），并默认信任代理服务器。 此配置的强大功能可以让您充分利用Squid强大的功能，如破解SSL保护的站点来过滤一些内容。 Notes::我在CentOS上编译时遇到一个问题，这通过修改 USE_SOLARIS_IPFILTER__MINOR_T_HACK 的定义来解决。大概在38725行。\n#define USE_SOLARIS_IPFILTER_MINOR_T_HACK 0 以上为原文翻译，下面贴出我用于访问那个老旧网站的配置\n# # Recommended minimum configuration: # # Example rule allowing access from your local networks. # Adapt to list your (internal) IP networks from where browsing # should be allowed acl localnet src 10.0.0.0/8\t# RFC1918 possible internal network acl localnet src 172.16.0.0/12\t# RFC1918 possible internal network acl localnet src 192.168.0.0/16\t# RFC1918 possible internal network acl localnet src fc00::/7 # RFC 4193 local private network range acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines acl SSL_ports port 443 acl Safe_ports port 80\t# http acl Safe_ports port 21\t# ftp acl Safe_ports port 443\t# https acl Safe_ports port 70\t# gopher acl Safe_ports port 210\t# wais acl Safe_ports port 1025-65535\t# unregistered ports acl Safe_ports port 280\t# http-mgmt acl Safe_ports port 488\t# gss-http acl Safe_ports port 591\t# filemaker acl Safe_ports port 777\t# multiling http acl CONNECT method CONNECT # # Recommended minimum Access Permission configuration: # # Deny requests to certain unsafe ports #http_access deny !Safe_ports # Deny CONNECT to other than secure SSL ports #http_access deny CONNECT !SSL_ports # Only allow cachemgr access from localhost http_access allow localhost manager http_access deny manager #忽略证书错误 sslproxy_cert_error allow all sslproxy_flags DONT_VERIFY_PEER #使用TLSv1.0连接 sslproxy_version 4 sslproxy_options ALL # We strongly recommend the following be uncommented to protect innocent # web applications running on the proxy server who think the only # one who can access services on \u0026#34;localhost\u0026#34; is a local user #http_access deny to_localhost # # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS # # Example rule allowing access from your local networks. # Adapt localnet in the ACL section to list your (internal) IP networks # from where browsing should be allowed http_access allow localnet http_access allow localhost # And finally deny all other access to this proxy http_access allow all # Squid normally listens to port 3128 http_port 127.0.0.1:8888 ssl-bump cert=/etc/squid/my.cert key=/etc/squid/my.private generate-host-certificates=on ssl_bump stare all ssl_bump bump all # Uncomment and adjust the following to add a disk cache directory. #cache_dir ufs /var/cache/squid 100 16 256 # Leave coredumps in the first cache dir coredump_dir /var/cache/squid # # Add any of your own refresh_pattern entries above these. # refresh_pattern ^ftp:\t1440\t20%\t10080 refresh_pattern ^gopher:\t1440\t0%\t1440 refresh_pattern -i (/cgi-bin/|\\?) 0\t0%\t0 refresh_pattern .\t0\t20%\t4320 ","permalink":"https://blog-foamzou-com.pages.dev/posts/squid-proxy-with-ssl-bump/","summary":"\u003cp\u003e背景：最近需要使用nodeJs访问一个历史久远的网站，那个网站的服务器证书是错误的，且使用的协议是TLSv1.0。浏览器上不得不使用IE并关闭各种安全设置和设置为兼容模式才能正常访问。Nodejs的新版本已经不支持这种不安全的协议，所以需要搭建一个代理服务进行访问。刚开始使用的是\u003ca href=\"https://github.com/mitmproxy/mitmproxy\"\u003emitmproxy\u003c/a\u003e ，当时的最新版本对于SSL错误会报错，所以将源码中校验部分去掉就可以正常使用了。但部署到生产环境，会出现cpu占用过高的情况。所以后面换了Squid。\u003c/p\u003e\n\u003cp\u003e部署Squid参考了一篇文章，原文：\u003ca href=\"https://smoothnet.org/squid-v3-5-proxy-with-ssl-bump/\"\u003ehere\u003c/a\u003e，下面是简单翻译。\u003c/p\u003e\n\u003cp\u003e  Squid是个很强大的Web代理，它可以应用于无线认证、重定向、用户身份验证、日志记录等。但其在SSL方面一直存在局限性。在3.2版本之前，Squid的策略只是简单地传递SSL加密流量，因为它无法校验受信任的SSL链接。对于每个SSL连接也无法给用户做预警。但3.5版本后允许更多的控制，但要注意仍然无法校验受信任的SSL链接。\u003c/p\u003e\n\u003cp\u003e这里不会过多地介绍使用SSL Bump配置Squid以外的知识，对于编译和配置squid的细节你最好看下官方文档。 如果通过代理自动监测，通知浏览器连接到代理服务器，这样是挺简单的。但有些用户可能会试图规避这一点，并尝试直接连接。 在这种情况下，我们需要强制这些用户通过截取流量来使用代理。SSL Bumping的前提是中间人攻击，但由于这是在您的用户清楚所有流量都是检查过的环境中完成的，因此这并不是真正的攻击，这只是一种策略。Squid用于执行SSL Bumping有一些新方法，但是我会总结出最具实战性的方法：Squid收到一个https请求，然后为用户建立安全连接。 远程连接建立后，Squid会重新加密所有流量; 这时候的加密使用的是本地私钥，以及本地证书颁发机构即时创建出来的证书。 所以我们首先要确保的是你已经安装了3.5或更高版本的Squid。尽管3.2，3.3以及3.4版本也能实现，但3.5版本后SSL Bump的指令有了些显著变化。另外，编译Squid时需要带上‘\u0026ndash;with-openssl’参数。 在CentOS我使用以下参数来编译Squid（foam：我带上\u0026ndash;enable-ipf-transparent参数会报错，所以我是去掉再编译的）\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003econfigure\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eprefix\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"n\"\u003eusr\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eexec\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eprefix\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"n\"\u003eusr\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eincludedir\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"n\"\u003eusr\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003einclude\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003edatadir\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"n\"\u003eusr\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eshare\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003elibdir\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"n\"\u003eusr\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib64\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003elibexecdir\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"n\"\u003eusr\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib64\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esquid\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003elocalstatedir\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003esysconfdir\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"n\"\u003eetc\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esquid\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003esharedstatedir\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ewith\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elogdir\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nb\"\u003elog\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esquid\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ewith\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epidfile\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esquid\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epid\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ewith\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003euser\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003esquid\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003esilent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003erules\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edependency\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etracking\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ewith\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eopenssl\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eicmp\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edelay\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epools\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003euseragent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nb\"\u003elog\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eesi\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efollow\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eforwarded\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eipf\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etransparent\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eauth\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e接下来我们需要生成本地的SSL证书，这里我使用的是简单的命令，没有在意怎么去加密。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Generate Private Key\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eopenssl genrsa -out example.com.private 2048  \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后是创建Certificate Signing Request（CSR），即证书注册请求。\u003c/p\u003e","title":"Squid使用SSLBump正向代理"},{"content":"一句话描述 git clean的作用是: 删除工作目录中尚未添加到git版本控制的文件或目录。\n使用场景 未添加到版本控制，且不在.gitignore中的，都是Untracked的状态。\n有时候我们在项目中添加了些自己的临时文件、目录或临时脚本，用完成后想把它们删了。 有时候则是执行回滚后，有些文件或目录回滚到了Untracked状态，我们需要把它们删掉。 这时候就可以使用git clean。\n用法 常用：git clean -df 路径[可选]\nusage: git clean [-d] [-f] [-n] [-q] [-x | -X] [--] \u0026lt;paths\u0026gt;... -q, --quiet be quiet（静默删除，只会告诉你出错信息。如果是成功删除了文件或目录则保持沉默） -n, --dry-run dry run（告诉你会被删除的文件或目录有哪些，删除文件毕竟是一件严肃的事，在执行该命令前请务必加上该参数先确定下） -f, --force force（强制删除，clean.requireForce默认的值是true。这种情况下只有加上该参数才能删除） -d remove whole directories（删除的范围是整个目录） -x remove ignored files, too（即使是被添加进gitignore的文件或目录也删掉。这里有坑，下面说~） -X remove only ignored files（只删除被添加进gitignore的文件或目录） 预演：在执行该命令前，务必先加上-n以检查一遍要删除的文件清单。否则删除后要找回来也是挺麻烦的事~ 有坑 正常情况下，不加x参数，git clean是不会将ignore的文件或目录删除的。但是~！！如果你在.gitignore文件中对目录的描述是\ndir/* 那么很抱歉，这个目录及里面的文件也会被清除掉。即使该目录的确是被git所忽略的。 所以，在.gitignore中对目录的描述最好是\ndir1/ dir2 最后吐槽网上很多关于git clean的介绍(中文的)中，对-f参数的描述是file。但其实是force~\n","permalink":"https://blog-foamzou-com.pages.dev/posts/git-clean/","summary":"\u003ch2 id=\"一句话描述\"\u003e一句话描述\u003c/h2\u003e\n\u003cp\u003egit clean的作用是:  \u003cstrong\u003e删除\u003c/strong\u003e工作目录中尚\u003cstrong\u003e未添加\u003c/strong\u003e到git版本控制的文件或目录。\u003c/p\u003e\n\u003ch2 id=\"使用场景\"\u003e使用场景\u003c/h2\u003e\n\u003cp\u003e未添加到版本控制，且不在.gitignore中的，都是\u003cstrong\u003eUntracked\u003c/strong\u003e的状态。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e有时候我们在项目中添加了些自己的临时文件、目录或临时脚本，用完成后想把它们删了。\u003c/li\u003e\n\u003cli\u003e有时候则是执行回滚后，有些文件或目录回滚到了Untracked状态，我们需要把它们删掉。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e这时候就可以使用git clean。\u003c/p\u003e\n\u003ch2 id=\"用法\"\u003e用法\u003c/h2\u003e\n\u003cp\u003e常用：git clean -df 路径[可选]\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eusage: git clean \u003cspan class=\"o\"\u003e[\u003c/span\u003e-d\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-f\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-n\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-q\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e-x \u003cspan class=\"p\"\u003e|\u003c/span\u003e -X\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e[\u003c/span\u003e--\u003cspan class=\"o\"\u003e]\u003c/span\u003e \u0026lt;paths\u0026gt;...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -q, --quiet           be quiet（静默删除，只会告诉你出错信息。如果是成功删除了文件或目录则保持沉默）\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -n, --dry-run         dry run（告诉你会被删除的文件或目录有哪些，删除文件毕竟是一件严肃的事，在执行该命令前请务必加上该参数先确定下）\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -f, --force           force（强制删除，clean.requireForce默认的值是true。这种情况下只有加上该参数才能删除）\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -d                    remove whole directories（删除的范围是整个目录）\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -x                    remove ignored files, too（即使是被添加进gitignore的文件或目录也删掉。这里有坑，下面说~）\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -X                    remove only ignored files（只删除被添加进gitignore的文件或目录）\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e预演：在执行该命令前，务必先加上-n以检查一遍要删除的文件清单。否则删除后要找回来也是挺麻烦的事~\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"有坑\"\u003e有坑\u003c/h2\u003e\n\u003cp\u003e正常情况下，不加x参数，git clean是不会将ignore的文件或目录删除的。但是~！！如果你在.gitignore文件中对目录的描述是\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edir/*\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e那么很抱歉，这个目录及里面的文件也会被清除掉。即使该目录的确是被git所忽略的。 所以，在.gitignore中对目录的描述最好是\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edir1/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edir2\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e最后吐槽网上很多关于git clean的介绍(中文的)中，对-f参数的描述是file。但其实是force~\u003c/p\u003e","title":"git clean"},{"content":"什么是职责链 职责链模式(Chain of Responsibility)：使多个对象都有机会处理请求，从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链，并沿着这条链传递该请求，直到有一个对象处理它为止。\n例子一：支付宝的花呗自动还款扣款顺序 余额-\u0026gt;借记卡快捷-\u0026gt;余额宝 首先会从余额扣款，若余额不足或扣款失败则将扣款这一动作往后传递~\n例子二：备胎 母亲：闺女，你们也不小了。赶紧给我找个女婿，具体怎么找，你们自己决定。 大女儿：妈，别急，我正在找呢，我要求不高，对我好就行了。 小女儿：妈，我要求也不高，对我好也就可以啦~ 女生说要求不高，往往要求很高~ 哼.jpg。但女生说自己懒，往往就是真的懒。这不，找上我这个程序员了。 大小女儿：foam，你是学计算机的，除了修电脑，帮忙找备胎也是会的哈~ foam：说吧，什么要求 大女儿：我要求不高，只要对我好就可以了。但，有钱很重要~ 小女儿：我和姐姐一样，找个对我好的就行。但，长得帅很重要~ 大小女儿：还有其他不是要求的要求嘛，长得高的不能太瘦，比较矮的又不能太胖；理科生的话最好会点音乐，文科生则需要懂点修电脑 foam：（转身吐血）你们还会改需求吗~ 大小女儿：不会的 我知道，女生说不会，就是会！ 于是我放弃了if…else的写法。 首先将备胎对象化是必须的。重要的是，给这些备胎串成一条链。每个节点，只要满足基本条件就返回给客户，否则往下传递，直到找到符合条件的备胎为止。 但，备胎的排序也是有条件的。大女儿说，最好有钱，那先将备胎们按身家排序，最有钱的排在链头，最穷的在链尾。小女儿的颜值要求也如法炮制。\n用php简单实现的职责链demo \u0026lt;?php abstract class Handler { private $successor = null; final public function append(Handler $handler) { if (is_null($this-\u0026gt;successor)) { $this-\u0026gt;successor = $handler; } else { $this-\u0026gt;successor-\u0026gt;append($handler); } } final public function handle() { $processed = $this-\u0026gt;processing(); if (!$processed) { if (!is_null($this-\u0026gt;successor)) { $processed = $this-\u0026gt;successor-\u0026gt;handle(); } } return $processed; } abstract protected function processing(); } class AHandler extends Handler { public function processing() { echo \u0026#39;A processing \u0026#39;; if (满足要求) { return true; } return false; } } class BHandler extends Handler { public function processing() { echo \u0026#39;B processing \u0026#39;; if (满足要求) { return true; } return false; } } class CHandler extends Handler { public function processing() { echo \u0026#39;C processing \u0026#39;; if (满足要求) { return true; } return false; } } class Client { private $_chain; public function init() { //例子一（花呗扣款）： $this-\u0026gt;_chain = new AHandler(); $this-\u0026gt;_chain-\u0026gt;append(new BHandler); $this-\u0026gt;_chain-\u0026gt;append(new CHandler); //例子二（备胎）： $hanlerList = getManOrderByRich(); $this-\u0026gt;_chain = new $handlerList[0]; for ($i=1;$i\u0026lt;count($handlerList),++$i) { $this-\u0026gt;_chain-\u0026gt;append(new $handlerList[$i]); } } public function doIt() { $this-\u0026gt;_chain-\u0026gt;handle(); } } $client = new Client; $client-\u0026gt;init(); $client-\u0026gt;doIt(); 对了，后来过了几天，大女儿来找我了。 大女儿：foam，我觉得钱不是最重要的，身高才是 foam：我知道了，你等我几分钟 …… 于是我这么改了下代码\n//$hanlerList = getManOrderByRich(); $hanlerList = getManOrderByTall(); $this-\u0026gt;_chain = new $handlerList[0]; for ($i=1;$i\u0026lt;count($handlerList),++$i) { $this-\u0026gt;_chain-\u0026gt;append(new $handlerList[$i]); } 她说以后不会再来麻烦我了，我点了点头我知道的 几天后，果然如我知道的那般 hey，foam，在吗\n","permalink":"https://blog-foamzou-com.pages.dev/posts/chain-of-responsibility/","summary":"\u003ch4 id=\"什么是职责链\"\u003e什么是职责链\u003c/h4\u003e\n\u003cp\u003e职责链模式(Chain of Responsibility)：使多个对象都有机会处理请求，从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链，并沿着这条链传递该请求，直到有一个对象处理它为止。\u003c/p\u003e\n\u003ch4 id=\"例子一支付宝的花呗自动还款扣款顺序\"\u003e例子一：支付宝的花呗自动还款扣款顺序\u003c/h4\u003e\n\u003cp\u003e余额-\u0026gt;借记卡快捷-\u0026gt;余额宝 首先会从余额扣款，若余额不足或扣款失败则将扣款这一动作往后传递~\u003c/p\u003e\n\u003ch4 id=\"例子二备胎\"\u003e例子二：备胎\u003c/h4\u003e\n\u003cp\u003e母亲：闺女，你们也不小了。赶紧给我找个女婿，具体怎么找，你们自己决定。 大女儿：妈，别急，我正在找呢，我要求不高，对我好就行了。 小女儿：妈，我要求也不高，对我好也就可以啦~ 女生说要求不高，往往要求很高~ 哼.jpg。但女生说自己懒，往往就是真的懒。这不，找上我这个程序员了。 大小女儿：foam，你是学计算机的，除了修电脑，帮忙找备胎也是会的哈~ foam：说吧，什么要求 大女儿：我要求不高，只要对我好就可以了。但，有钱很重要~ 小女儿：我和姐姐一样，找个对我好的就行。但，长得帅很重要~ 大小女儿：还有其他不是要求的要求嘛，长得高的不能太瘦，比较矮的又不能太胖；理科生的话最好会点音乐，文科生则需要懂点修电脑 foam：（转身吐血）你们还会改需求吗~ 大小女儿：不会的 我知道，女生说不会，就是会！ 于是我放弃了if…else的写法。 首先将备胎对象化是必须的。重要的是，给这些备胎串成一条链。每个节点，只要满足基本条件就返回给客户，否则往下传递，直到找到符合条件的备胎为止。 但，备胎的排序也是有条件的。大女儿说，最好有钱，那先将备胎们按身家排序，最有钱的排在链头，最穷的在链尾。小女儿的颜值要求也如法炮制。\u003c/p\u003e\n\u003ch4 id=\"用php简单实现的职责链demo\"\u003e用php简单实现的职责链demo\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"nx\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eabstract\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eHandler\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eprivate\u003c/span\u003e \u003cspan class=\"nv\"\u003e$successor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efinal\u003c/span\u003e \u003cspan class=\"k\"\u003epublic\u003c/span\u003e \u003cspan class=\"k\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eHandler\u003c/span\u003e \u003cspan class=\"nv\"\u003e$handler\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eis_null\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$this\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003esuccessor\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nv\"\u003e$this\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003esuccessor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$handler\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nv\"\u003e$this\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003esuccessor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$handler\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efinal\u003c/span\u003e \u003cspan class=\"k\"\u003epublic\u003c/span\u003e \u003cspan class=\"k\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003e$processed\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$this\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eprocessing\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nv\"\u003e$processed\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eis_null\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$this\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003esuccessor\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"nv\"\u003e$processed\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$this\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003esuccessor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nv\"\u003e$processed\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eabstract\u003c/span\u003e \u003cspan class=\"k\"\u003eprotected\u003c/span\u003e \u003cspan class=\"k\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003eprocessing\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eAHandler\u003c/span\u003e \u003cspan class=\"k\"\u003eextends\u003c/span\u003e \u003cspan class=\"nx\"\u003eHandler\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003epublic\u003c/span\u003e \u003cspan class=\"k\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003eprocessing\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eecho\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;A processing  \u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003e满足要求\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eBHandler\u003c/span\u003e \u003cspan class=\"k\"\u003eextends\u003c/span\u003e \u003cspan class=\"nx\"\u003eHandler\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003epublic\u003c/span\u003e \u003cspan class=\"k\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003eprocessing\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eecho\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;B processing  \u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003e满足要求\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eCHandler\u003c/span\u003e \u003cspan class=\"k\"\u003eextends\u003c/span\u003e \u003cspan class=\"nx\"\u003eHandler\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003epublic\u003c/span\u003e \u003cspan class=\"k\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003eprocessing\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eecho\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;C processing  \u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003e满足要求\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eClient\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eprivate\u003c/span\u003e \u003cspan class=\"nv\"\u003e$_chain\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003epublic\u003c/span\u003e \u003cspan class=\"k\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e//例子一（花呗扣款）：\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003e$this\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003e_chain\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eAHandler\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003e$this\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003e_chain\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eBHandler\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003e$this\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003e_chain\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eCHandler\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e//例子二（备胎）：\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003e$hanlerList\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003egetManOrderByRich\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003e$this\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003e_chain\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nv\"\u003e$handlerList\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$i\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$i\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nx\"\u003ecount\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$handlerList\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"nv\"\u003e$i\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nv\"\u003e$this\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003e_chain\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nv\"\u003e$handlerList\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003e$i\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003epublic\u003c/span\u003e \u003cspan class=\"k\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003edoIt\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nv\"\u003e$this\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003e_chain\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$client\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eClient\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$client\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$client\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003edoIt\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e  对了，后来过了几天，大女儿来找我了。 大女儿：foam，我觉得钱不是最重要的，身高才是 foam：我知道了，你等我几分钟 …… 于是我这么改了下代码\u003c/p\u003e","title":"设计模式之职责链"},{"content":"安全问题 现在的移动互联网应用，大多是通过客户端带上数据请求不同动作的api来实现不同业务要求的。即是说，通过抓包就可以获取到请求的api和发送、接收到的数据。如果没有一定的安全防范意识，很容易被攻击。 这里推荐一款叫fiddler的抓包工具，使用方法自行搜索。下面是对车来了App的抓包截图： 没有使用https，所以数据完全暴露出来了。可以看到我经常坐的19路其中一辆公交还有12分钟到站。 用户身份验证 Web应用可以使用session来保存用户会话，App可没有这东西。 下面是一个很致命的设计： 只要带上userId，服务端就会为该用户执行操作。就是说任何人都可以假冒123这个用户执行一些操作。 嗯，打死都不承认上面这种设计我曾经写过。 其实参考session的实现原理就可以解决这个问题。大多数情况，Session都是结合客户端的Cookie来实现的。 Web中Session的实现： 1.用户的登录名、密码校验正确后，我们通常会将用户的一些信息存入到Session中。 2.此时服务端会生成一个全局唯一标识SessionID来标记这个用户生成的Session，并将该SessionID通过Set-Cookie回应给浏览器。 3.So，浏览器访问该网站的其他页面时只要带上了这个SessionID,服务端就知道它面对的用户存储在了哪个Session中，程序便可取出来用。\n如何实现 那么移动端App怎么玩？与Web的Session是一样的，只不过我们要自己实现了。 简单实现 1.用户名密码校验无误后，生成UUID，存储到该用户记录中对应的字段中 2.将该UUID返回给前端(Android、iOS等) 3.App请求其他需要用户登录的接口时，带上该字段 4.服务端校验无误后方可继续执行业务 进一步完善以便实现其他需求的话，可以在生成UUID的同时，记录下用户ip、设备ID、过期时间等~ 如：发现设备ID与登录时的不同，要求其重新登录~ 当然，校验技术不可能是完美的，Hacker们有太多的方法骗过服务端。作为开发者，能做的是尽可能地提高验证水平和Hacker的破解成本；而作为用户，不要总想着蹭网啦，免费或虚假Wifi的后面可能有人正抓着包…\n","permalink":"https://blog-foamzou-com.pages.dev/posts/user-identity-authentication/","summary":"\u003ch3 id=\"安全问题\"\u003e安全问题\u003c/h3\u003e\n\u003cp\u003e现在的移动互联网应用，大多是通过客户端带上数据请求不同动作的api来实现不同业务要求的。即是说，通过抓包就可以获取到请求的api和发送、接收到的数据。如果没有一定的安全防范意识，很容易被攻击。 这里推荐一款叫fiddler的抓包工具，使用方法自行搜索。下面是对车来了App的抓包截图： 没有使用https，所以数据完全暴露出来了。可以看到我经常坐的19路其中一辆公交还有12分钟到站。 \u003cimg loading=\"lazy\" src=\"/posts/user-identity-authentication/00e69a77567b111d3084eadeb349323a.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"用户身份验证\"\u003e用户身份验证\u003c/h3\u003e\n\u003cp\u003eWeb应用可以使用session来保存用户会话，App可没有这东西。 下面是一个很致命的设计： \u003cimg loading=\"lazy\" src=\"/posts/user-identity-authentication/699fb87904637be087893d60aae00082.png\"\u003e 只要带上userId，服务端就会为该用户执行操作。就是说任何人都可以假冒123这个用户执行一些操作。 嗯，打死都不承认上面这种设计我曾经写过。 其实参考session的实现原理就可以解决这个问题。大多数情况，Session都是结合客户端的Cookie来实现的。 \u003cstrong\u003eWeb中Session的实现\u003c/strong\u003e： 1.用户的登录名、密码校验正确后，我们通常会将用户的一些信息存入到Session中。 2.此时服务端会生成一个全局唯一标识SessionID来标记这个用户生成的Session，并将该SessionID通过Set-Cookie回应给浏览器。 3.So，浏览器访问该网站的其他页面时只要带上了这个SessionID,服务端就知道它面对的用户存储在了哪个Session中，程序便可取出来用。\u003c/p\u003e\n\u003ch3 id=\"如何实现\"\u003e如何实现\u003c/h3\u003e\n\u003cp\u003e那么移动端App怎么玩？与Web的Session是一样的，只不过我们要自己实现了。 \u003cstrong\u003e简单实现\u003c/strong\u003e 1.用户名密码校验无误后，生成UUID，存储到该用户记录中对应的字段中 2.将该UUID返回给前端(Android、iOS等) 3.App请求其他需要用户登录的接口时，带上该字段 4.服务端校验无误后方可继续执行业务 \u003cimg loading=\"lazy\" src=\"/posts/user-identity-authentication/c5f74baa79fd772c0a09c3a601117b38.png\"\u003e 进一步完善以便实现其他需求的话，可以在生成UUID的同时，记录下用户ip、设备ID、过期时间等~ 如：发现设备ID与登录时的不同，要求其重新登录~ 当然，校验技术不可能是完美的，Hacker们有太多的方法骗过服务端。作为开发者，能做的是尽可能地提高验证水平和Hacker的破解成本；而作为用户，不要总想着蹭网啦，免费或虚假Wifi的后面可能有人正抓着包…\u003c/p\u003e","title":"App用户身份验证"},{"content":"写在前面 简介 memcache是一款开源软件，由LiveJournal的Brad Fitzpatrick开发，以BSD license授权发布。 是一个高性能的分布式的内存对象缓存系统，通过在内存里维护一个巨大的hash表，将数据(包括图像、视频、文件以及数据库检索的结果等)调用到内存中，然后从内存中读取，从而大大提高读取速度。 特性 非持久性存储 定位于分布式存储，不适用于单机系统 不支持List、Array等复杂的数据 Memcache和Memcached 这款开源软件的项目名叫Memcache，Memcached (Memcached-Daemon的简称) 是软件的主程序名。 在php中，有两个为memcache开发的扩展（客户端）：Memcache扩展和memcached扩展。后者比前者要新，功能也比较多。推荐安装后者。 部署环境 安装memcache服务端 sudo apt-get install memcached #for Ubuntu yum install memcached #for CentOS 安装php扩展(客户端) 这里以安装memcached扩展为例，从官网下载最新版本，解压并cd到目录\nwget http://pecl.php.net/get/memcached-2.2.0.tgz tar -zxvf memcached-2.2.0.tgz cd memcached-2.2.0 编译安装\nphpize #生成configure配置文件。若找不到命令请用绝对路径 /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config #配置 make #编译 make install #安装。需要root权限 安装完后会提示安装的目录：\nInstalling shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/ 编辑php.ini文件\n#找到extension_dir，如果没有设置扩展的路径，则把上面memcached.so所在的路径粘贴进去 extension_dir = \u0026#34;/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/\u0026#34; #找到;extension=php_XXX.dll的地方，在最下面添加上 extension=memcached.so 最后，重启web服务器和php-fpm 看看phpinfo()是否将memcached添加成功。我这里为了做测试编译了两个扩展，实际编译后者就可以。 简单使用 这里只介绍php中memcached类的使用。更多请参考手册\n\u0026lt;?php $md = new memcached; //向服务器池添加服务器，也可以使用addServers方法一次添加多个 //public bool Memcached::addServer ( string $host , int $port [, int $weight = 0 ] ) $md-\u0026gt;addServer(\u0026#39;127.0.0.1\u0026#39;,11211); //$expiration默认为0，永不超时。但即使为0，当内存不够用的时候，memcache也会将不常使用的数据删掉 //expiration不能超过60×60×24×30（30天时间的秒数）;如果大于这个值，服务端会将其作为一个真实的Unix时间戳来处理而不是 自当前时间的偏移 //public bool Memcached::add ( string $key , mixed $value [, int $expiration ] ) $md-\u0026gt;add(\u0026#39;addItem\u0026#39;,\u0026#39;this is content one by add\u0026#39;); $md-\u0026gt;add(\u0026#39;addItem\u0026#39;,\u0026#39;this is content two by add\u0026#39;);//false.若使用add方法添加已经存在的key，无法添加成功 //public mixed Memcached::get ( string $key [, callback $cache_cb [, float \u0026amp;$cas_token ]] ) echo $md-\u0026gt;get(\u0026#39;addItem\u0026#39;);//after add:this is content one by add //public bool Memcached::delete ( string $key [, int $time = 0 ] ) $md-\u0026gt;delete(\u0026#39;addItem\u0026#39;); echo $md-\u0026gt;get(\u0026#39;addItem\u0026#39;);//空 //使用set方法重复添加同样的key是合法的，且后面的数据会覆盖前面的数据 //public bool Memcached::set ( string $key , mixed $value [, int $expiration ] ) $md-\u0026gt;set(\u0026#39;tip\u0026#39;,\u0026#39;hello\u0026#39;);//tip=\u0026#39;hello\u0026#39; $md-\u0026gt;set(\u0026#39;tip\u0026#39;,\u0026#39;world\u0026#39;);//tip=\u0026#39;world\u0026#39; //若使用追加方法，必须将OPT_COMPRESSION（压缩）设置为false $md-\u0026gt;setOption(Memcached::OPT_COMPRESSION,false); $md-\u0026gt;set(\u0026#39;tip\u0026#39;,\u0026#39;hello\u0026#39;);//tip=\u0026#39;hello\u0026#39; //向指定元素后面追加一个字符串 //public bool Memcached::append ( string $key , string $value ) $md-\u0026gt;append(\u0026#39;tip\u0026#39;,\u0026#39; world\u0026#39;);//tip=\u0026#39;hello world\u0026#39; $arr = [ \u0026#39;name\u0026#39; =\u0026gt; \u0026#39;foam\u0026#39;, \u0026#39;age\u0026#39; =\u0026gt; \u0026#39;22\u0026#39;, ]; //同时存储多个数据 //public bool Memcached::setMulti ( array $items [, int $expiration ] ) $md-\u0026gt;setMulti($arr); echo $md-\u0026gt;get(\u0026#39;name\u0026#39;);//foam echo $md-\u0026gt;get(\u0026#39;age\u0026#39;);//22 $md-\u0026gt;set(\u0026#39;count\u0026#39;,\u0026#39;-99\u0026#39;);//count=-99 //自增 //public int Memcached::increment ( string $key [, int $offset = 1 ] ) $md-\u0026gt;increment(\u0026#39;count\u0026#39;);//false.对于负数和非整数是无法自增的 $md-\u0026gt;set(\u0026#39;count\u0026#39;,0); $md-\u0026gt;increment(\u0026#39;count\u0026#39;);//count=1 $md-\u0026gt;increment(\u0026#39;count\u0026#39;,100);//count=101 //自减 //public int Memcached::decrement ( string $key [, int $offset = 1 ] ) $md-\u0026gt;decrement(\u0026#39;count\u0026#39;);//count=100 $md-\u0026gt;decrement(\u0026#39;count\u0026#39;,50);//count=50 $md-\u0026gt;decrement(\u0026#39;count\u0026#39;,60);//count=0.最小只能减到0 //清空所有数据 //public bool Memcached::flush ([ int $delay = 0 ] ) $md-\u0026gt;flush(); $md-\u0026gt;get(\u0026#39;tip\u0026#39;);//false $md-\u0026gt;get(\u0026#39;count\u0026#39;);//false 其他 Memcache的分布式缓存 Memcache尽管说是分布式缓存服务器，但其分布式却是由客户端实现的。 保存数据时，客户端会根据数据的键使用特定的算法（不同的客户端，算法不同）选择要保存的服务器，将其存入其中。获取数据时也是使用相同的算法在所在的服务器获取。这些客户端算法一般在Hash的基础上进行改良，保证其数据的分散性。 具体策略就不展开说明了。\nMemcache与锁 在高并发的业务场景中，都会使用锁的概念。如： 场景一:一批cache同时过期，许多客户端同时并发请求cache。此时业务逻辑发现cache过期，会高并发下从DB同时请求数据并重新设置给memcache。整个过程都是高并发的，就如决堤，洪水汹涌袭来一般。对系统的负载能力将是巨大的挑战。 场景二：脏数据场景，有两个客户A和B。A发送投票请求，服务器在12时00分00秒10毫秒取出当前票数100，在12时00分00秒15毫秒给当前票数自增1并保存。B发送投票请求，服务器在12时00分00秒12毫秒取出当前票数100，在12时00分00秒13毫秒给当前票数自增1并保存。总票数原本应该为102的实际上却是101。即使数据库上已经使用了锁的策略，但由于磁盘IO速度慢，仍然会导致读写脏数据的错误。如果锁的动作发生在内存上就不一样了。 我们可以用memcache实现简单的锁，重点在于memcache的add方法，如果cache上有相同的键了，add方法会返回false。下面是用php实现的简单锁。\nclass MemcacheLock { private $_host = \u0026#39;127.0.0.1\u0026#39;; private $_port = 11212; private $_md; const TIMEOUT = 10; public function __construct() { $this-\u0026gt;_md = new memcached; $this-\u0026gt;_md-\u0026gt;addServer($this-\u0026gt;_host,$this-\u0026gt;_port); } //为防止产生死锁，需要设置过期时间，时间长度根据业务决定 public function lock($key,$timeOut=self::TIMEOUT) { return $this-\u0026gt;_md-\u0026gt;add($key,\u0026#39;lock\u0026#39;,$timeOut); } public function unLock($key) { $this-\u0026gt;_md-\u0026gt;delete($key); } } Memcache和Memcached扩展互不兼容 NOTIC:这里指的是Memcache的两个php扩展\nphp.net上有人做了测试，两个扩展间由于调用的客户端库不同，存储的方式有一定的差异。 测试脚本：\n$memcache = new Memcache; $memcacheD = new Memcached; $memcache-\u0026gt;addServer(\u0026#39;127.0.0.1\u0026#39;,11211); $memcacheD-\u0026gt;addServer(\u0026#39;127.0.0.1\u0026#39;,11211); $checks = array( 123, 4542.32, \u0026#39;a string\u0026#39;, true, array(123, \u0026#39;string\u0026#39;), (object)array(\u0026#39;key1\u0026#39; =\u0026gt; \u0026#39;value1\u0026#39;), ); foreach ($checks as $i =\u0026gt; $value) { print \u0026#34;\u0026lt;br/\u0026gt;\u0026lt;br/\u0026gt;Checking WRITE with Memcache\u0026lt;br/\u0026gt;\u0026#34;; $key = \u0026#39;cachetest\u0026#39; . $i; $memcache-\u0026gt;set($key, $value); usleep(100); $val = $memcache-\u0026gt;get($key); $valD = $memcacheD-\u0026gt;get($key); if ($val !== $valD) { print \u0026#34;Not compatible!\u0026lt;br/\u0026gt;\u0026#34;; var_dump(compact(\u0026#39;val\u0026#39;, \u0026#39;valD\u0026#39;)); } print \u0026#34;\u0026lt;br/\u0026gt;\u0026lt;br/\u0026gt;Checking WRITE with MemcacheD\u0026#34;; $key = \u0026#39;cachetest\u0026#39; . $i; $memcacheD-\u0026gt;set($key, $value); usleep(100); $val = $memcache-\u0026gt;get($key); $valD = $memcacheD-\u0026gt;get($key); if ($val !== $valD) { print \u0026#34;Not compatible!\u0026lt;br/\u0026gt;\u0026#34;; var_dump(compact(\u0026#39;val\u0026#39;, \u0026#39;valD\u0026#39;)); } } 结果是只有处理string的方式一样，其他数据结构都采用了不同的处理方式。因此两个扩展间是不能相互切换的。 Last：还有许多值得说的地方，日后若有memcache的相关内容可能会补充进来。以上内容若存在错误的地方，请留言或发邮件指正错误，谢谢。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/primer-of-memcache/","summary":"\u003ch2 id=\"写在前面\"\u003e写在前面\u003c/h2\u003e\n\u003ch3 id=\"简介\"\u003e简介\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003ememcache是一款开源软件，由LiveJournal的Brad Fitzpatrick开发，以BSD license授权发布。\u003c/li\u003e\n\u003cli\u003e是一个高性能的分布式的内存对象缓存系统，通过在内存里维护一个巨大的hash表，将数据(包括图像、视频、文件以及数据库检索的结果等)调用到内存中，然后从内存中读取，从而大大提高读取速度。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"特性\"\u003e特性\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e非持久性存储\u003c/li\u003e\n\u003cli\u003e定位于分布式存储，不适用于单机系统\u003c/li\u003e\n\u003cli\u003e不支持List、Array等复杂的数据\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"memcache和memcached\"\u003eMemcache和Memcached\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e这款开源软件的项目名叫Memcache，Memcached (Memcached-Daemon的简称) 是软件的主程序名。\u003c/li\u003e\n\u003cli\u003e在php中，有两个为memcache开发的扩展（客户端）：Memcache扩展和memcached扩展。后者比前者要新，功能也比较多。推荐安装后者。\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"部署环境\"\u003e部署环境\u003c/h2\u003e\n\u003ch3 id=\"安装memcache服务端\"\u003e安装memcache服务端\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt-get install memcached \u003cspan class=\"c1\"\u003e#for Ubuntu\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eyum install memcached \u003cspan class=\"c1\"\u003e#for CentOS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"安装php扩展客户端\"\u003e安装php扩展(客户端)\u003c/h3\u003e\n\u003cp\u003e这里以安装memcached扩展为例，从官网下载最新版本，解压并cd到目录\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget http://pecl.php.net/get/memcached-2.2.0.tgz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etar -zxvf memcached-2.2.0.tgz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e memcached-2.2.0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e编译安装\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ephpize \u003cspan class=\"c1\"\u003e#生成configure配置文件。若找不到命令请用绝对路径 /usr/local/php/bin/phpize\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./configure --with-php-config\u003cspan class=\"o\"\u003e=\u003c/span\u003e/usr/local/php/bin/php-config  \u003cspan class=\"c1\"\u003e#配置\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emake  \u003cspan class=\"c1\"\u003e#编译\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emake install \u003cspan class=\"c1\"\u003e#安装。需要root权限\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e安装完后会提示安装的目录：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eInstalling shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e编辑php.ini文件\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#找到extension_dir，如果没有设置扩展的路径，则把上面memcached.so所在的路径粘贴进去\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eextension_dir\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#找到;extension=php_XXX.dll的地方，在最下面添加上\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eextension\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ememcached.so\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e最后，重启web服务器和php-fpm 看看phpinfo()是否将memcached添加成功。我这里为了做测试编译了两个扩展，实际编译后者就可以。 \u003cimg loading=\"lazy\" src=\"/posts/primer-of-memcache/a48fc9b5444114d5d64bbcc2a925ae75.png\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"简单使用\"\u003e简单使用\u003c/h2\u003e\n\u003cp\u003e这里只介绍php中memcached类的使用。更多请参考\u003ca href=\"http://php.net/manual/zh/book.memcached.php\"\u003e手册\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"nx\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003ememcached\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//向服务器池添加服务器，也可以使用addServers方法一次添加多个\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//public bool Memcached::addServer ( string $host , int $port [, int $weight = 0 ] )\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eaddServer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;127.0.0.1\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e11211\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//$expiration默认为0，永不超时。但即使为0，当内存不够用的时候，memcache也会将不常使用的数据删掉\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//expiration不能超过60×60×24×30（30天时间的秒数）;如果大于这个值，服务端会将其作为一个真实的Unix时间戳来处理而不是 自当前时间的偏移\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//public bool Memcached::add ( string $key , mixed $value [, int $expiration ] )\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;addItem\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;this is content one by add\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;addItem\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;this is content two by add\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//false.若使用add方法添加已经存在的key，无法添加成功\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//public mixed Memcached::get ( string $key [, callback $cache_cb [, float \u0026amp;$cas_token ]] )\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eecho\u003c/span\u003e \u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;addItem\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//after add:this is content one by add\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//public bool Memcached::delete ( string $key [, int $time = 0 ] )\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003edelete\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;addItem\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eecho\u003c/span\u003e \u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;addItem\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//空\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//使用set方法重复添加同样的key是合法的，且后面的数据会覆盖前面的数据\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//public bool Memcached::set ( string $key , mixed $value [, int $expiration ] )\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;tip\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;hello\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//tip=\u0026#39;hello\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;tip\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;world\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//tip=\u0026#39;world\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//若使用追加方法，必须将OPT_COMPRESSION（压缩）设置为false\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003esetOption\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eMemcached\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"na\"\u003eOPT_COMPRESSION\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"k\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;tip\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;hello\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//tip=\u0026#39;hello\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//向指定元素后面追加一个字符串\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//public bool Memcached::append ( string $key , string $value )\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;tip\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39; world\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//tip=\u0026#39;hello world\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$arr\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s1\"\u003e\u0026#39;name\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;foam\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s1\"\u003e\u0026#39;age\u0026#39;\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;22\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//同时存储多个数据\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//public bool Memcached::setMulti ( array $items [, int $expiration ] )\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003esetMulti\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$arr\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eecho\u003c/span\u003e \u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;name\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//foam\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eecho\u003c/span\u003e \u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;age\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//22\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;count\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;-99\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//count=-99\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//自增\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//public int Memcached::increment ( string $key [, int $offset = 1 ] )\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eincrement\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;count\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//false.对于负数和非整数是无法自增的\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;count\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eincrement\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;count\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//count=1\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eincrement\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;count\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//count=101\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//自减\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//public int Memcached::decrement ( string $key [, int $offset = 1 ] )\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003edecrement\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;count\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//count=100\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003edecrement\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;count\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e50\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//count=50\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003edecrement\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;count\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e60\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//count=0.最小只能减到0\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//清空所有数据\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//public bool Memcached::flush ([ int $delay = 0 ] )\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eflush\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;tip\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//false\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$md\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;count\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//false\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"其他\"\u003e其他\u003c/h2\u003e\n\u003ch3 id=\"memcache的分布式缓存\"\u003eMemcache的分布式缓存\u003c/h3\u003e\n\u003cp\u003eMemcache尽管说是分布式缓存服务器，但其分布式却是由客户端实现的。 保存数据时，客户端会根据数据的键使用特定的算法（不同的客户端，算法不同）选择要保存的服务器，将其存入其中。获取数据时也是使用相同的算法在所在的服务器获取。这些客户端算法一般在Hash的基础上进行改良，保证其数据的分散性。 具体策略就不展开说明了。\u003c/p\u003e","title":"memcache入门"},{"content":"回顾2015是一个漫长而又短暂的一年，成长是一种很棒的体验。\n零点一过，2015已成去年，签日期的时候也要将习惯改成2016了。与去年不同的是，今年的元旦是在深圳过的，心情并无多大的波动，与成长相关的不是年岁，而是经历。\n去年1月，第一次参与商业项目的开发，我接触微信公众平台开发，尽管只做了接近10天，却让我体验到了赶项目的压力感，也意识到学习能力是有多麽重要，哪怕你之前相关的技能树为0。\n我一直对英语有种亲切感，年初的时候那种亲切却是表现得很突出，于是这段热情维持了罕见的1个月。那个时候买Kindle的动机之一大概也是因为E文吧，尽管后面看中文比较多。开始用Kindle看中英文书籍，鸡汤也灌了不少。Kindle的阅读体验真的很赞，前提是你真的喜欢看书。\n3月份的时候，万网搞活动送2年的主机，一直纠结国外VPS访问速度的我终于将博客搬迁到了国外主机，果然访问速度快了不少。后来几个月都有定时更新，但近两个月却偷懒下来，可能是近来没写代码的缘故吧，毕竟我博客的主要内容还是以IT为主。还好日记没有断，一直坚持下来，现在重新翻翻又像是过了一年。\n大三的生活过得还是比较充实，天天除了代码就是代码，一写就是三年，而写了四年的师兄们也在5月份回来拿毕业证拍毕业照了。师兄们过得都还好，也提醒我们要准备校招的事了，于是开始了刷题刷校招信息的半找工作状态，在阿波的指导下用AI完成了一份看起来不错的简历。\n7月份结束了大三的生活，也结束了在环创的日子。看着简历的项目经验不禁想起一些东西，我的大学为Coding付出了很多，在别人出去娱乐的时候我在学习，别人在宿舍打机的时候我在做项目。而在大三这个黄金时段，本应该钻研自己领域的技术，但我却在为工作室的项目付出着时间。但问我是否后悔，不！因为我得到的更多。我收获了很多比赛，收获了项目经验，收获了一群并肩作战的师弟师妹，还收获了很多说不清道不明的东西。有时候我在想，我们是不是应该丢掉现在社会上将任何东西都物质化的风气呢，其实很多东西是不应该被物质化的。那些我经过的事，做过的事，是否可以仅仅因为我的乐意而显得有价值呢，而不去刻意计算得失。\n人生最后一个暑假也在去年开始了，完全不像以前般的挥霍，生活规律变得特别地好。会早上起来跑步（好吧，我承认是被我妈催起来的），开始注意锻炼身体，没事就玩深蹲。当然Coding也没落下，学习了laravel这个号称最优雅的框架并拙计地完成了中国象棋，我的棋力在那段时间一度飞升，后来就被虐到谷底了。暑假的生活比较悠闲，加之每餐都是我做菜，所以开始思量着怎么做会比较好吃，扫了眼百度的菜谱就开始做，也算是积累了些通用的技巧吧。比较喜欢的是做自己没做又觉得会很好的菜，反之做过的菜再做会觉得没意思 。厨艺技能算是得到了小小的提升。\n4年没有画过画的我，翻到从前的画也是笑笑，原来以前我还有这兴致和耐心。然后买来素描纸和各种B的铅笔给师妹画了些画后，发现自己的兴致和耐心一直没变。人身上一些好的特性是不会轻易消失不见的，只要你有心。\n暑假很快就结束了，我从来没有感受过如此短暂的假期，再见。来到学校，宿舍后面来了个师弟，稚嫩的身形提醒着我已经大四了。\n大四这段时间，或许是临近毕业的原因，越来越发现自己知道的东西太少了，比如金融、股票、期权、这些经济概念和名词完全不懂，有心让自己的知识储备变得充实起来，所以遇到自己不懂的东西总是要摸个半懂。这也是让自己变得更好的一方面，放在以前，恐怕我完全不想理这些表面看起来“对自己无用”的东西。\n用Kindle看了自控力这本书，里面介绍了一些提高自控力的方法。如冥想、静坐、锻炼、充足的睡眠等。现在看书都是边看边摘录下来了，看书的确是要做笔记的，以前看到别人说需要些读书笔记总是不以为然，认为没什么用。这种思想大抵是因为小时候上学时被应试教育的强制写读书笔记给毒害了。看书的确免不了笔记，即使没有自己的见解，将其中精华部分摘录下来也是好的。否则，以常人的记忆力，半个月后恐怕已抛之脑后，还有什么记得的呢。可能有人会想，那我看完书再去找别人摘录的岂不甚好。其实不然，每个人的思维方式和轨迹都不一样，你自己摘录的方式自然是最符合自己的思维方式的，这么，以后回来翻翻笔记，文中精华便按照你自己的思维轨迹以最舒服最快速的路径重新回到了你的记忆体中。因此，我总是喜欢以自己的方式再梳理一遍文章摘录，或者重新写一篇技术文章。这样，才是真正属于你自己的。\n大四几乎没写代码，思量人生比较多。顺便在中秋去了趟长沙，和绍逸一起去的，终结了提了N次的湖南之旅。尽管只玩了2天，但还是去了不少地方，岳麓山、橘子洲、靖港古镇。自拍模式开启之后却是停不下来。都是临时做攻略的，以后出去玩要提前做好攻略，会更充实。\n也是在大四这段无聊的时间，开始试着写歌编曲，五线谱不懂的我只能用钢琴app弹着黑白键记录下简谱，很享受这个过程，尤其是写完曲子开始填词的时候，但功能还不够，被吐槽太淡。果然自己写的和别人听所感受到的情感是不一样的，是谁说写歌的假正经，听歌的人最无情的。没有用心写怎么能写出好歌，没有用心感受怎么能理解音乐呢。后面下载了个FLStudio，用来编曲，发现自己对乐器的匮乏程度还是蛮高的，编的曲和主旋律配合得不好，有机会应该总体了解每种常用乐器，结合起来必定能编出好曲，林迈可、钟兴民大神，收下我的膝盖。\n10月份出发去广州霸面YY，霸面未遂还是不甘心空手回去的。小伙伴们收集着当天的校招和宣讲会信息，刚好当天下午有个公司在附近的广外宣讲。于是去做了笔试，第二天面试完便拿了个offer。这也是我现在实习的公司。是否觉得缘分这东西很奇妙呢，假设我当时没去凡趣的宣讲会，我现在又会在哪家公司写着什么样的应用呢。\n人生最后一节课和最后一场考试在11月份结束了，可耻的是我当时简直没有注意到这个最后意味着什么，在身边同学发着朋友圈感慨的时候我才后知后觉反应过来。\n毕业答辩终于在12月5号开始了，尽管一直没把答辩放心上，但没想到的是在当天竟然睡过头了，学委打电话给我的时候才迷迷糊糊起来刷牙。没有想象中的老师问很多专业问题，甚至没有让我把PPT演示完就草草结束了。是的，的确很不满意。我最大的作业就这么被应付了，还不比我的课程设计呢。\n纠结完就算了，生活还是得过，房子还是得找。开始留意检索深圳的租房信息，凭借我深厚的检索能力倒是搜集了不少信息。最后得出结论，还是直接去实地找吧。\n圣诞节，师弟师妹给我和英灿过了大学最后一个生日。谢谢你们给我们的准备，每年的圣诞节都给我们过生日。哦，今年蛋糕上的两个小雪人很赞。\n接着就突然跑来深圳了，就这么突然来到了一个陌生又让我感到亲切的城市，去公司报到，感受不一样的Coding生活。对了，这里的宜家很赞哦，房子\n是租的，但生活不是。开始期待我会怎样弹奏我的生活。\n最后以五月天的歌词结尾，下段旅程，你一定要更幸福丰盛。\n共勉。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/summaryof2015/","summary":"\u003cp\u003e回顾2015是一个漫长而又短暂的一年，成长是一种很棒的体验。\u003c/p\u003e\n\u003cp\u003e零点一过，2015已成去年，签日期的时候也要将习惯改成2016了。与去年不同的是，今年的元旦是在深圳过的，心情并无多大的波动，与成长相关的不是年岁，而是经历。\u003c/p\u003e\n\u003cp\u003e去年1月，第一次参与商业项目的开发，我接触微信公众平台开发，尽管只做了接近10天，却让我体验到了赶项目的压力感，也意识到学习能力是有多麽重要，哪怕你之前相关的技能树为0。\u003c/p\u003e\n\u003cp\u003e我一直对英语有种亲切感，年初的时候那种亲切却是表现得很突出，于是这段热情维持了罕见的1个月。那个时候买Kindle的动机之一大概也是因为E文吧，尽管后面看中文比较多。开始用Kindle看中英文书籍，鸡汤也灌了不少。Kindle的阅读体验真的很赞，前提是你真的喜欢看书。\u003c/p\u003e\n\u003cp\u003e3月份的时候，万网搞活动送2年的主机，一直纠结国外VPS访问速度的我终于将博客搬迁到了国外主机，果然访问速度快了不少。后来几个月都有定时更新，但近两个月却偷懒下来，可能是近来没写代码的缘故吧，毕竟我博客的主要内容还是以IT为主。还好日记没有断，一直坚持下来，现在重新翻翻又像是过了一年。\u003c/p\u003e\n\u003cp\u003e大三的生活过得还是比较充实，天天除了代码就是代码，一写就是三年，而写了四年的师兄们也在5月份回来拿毕业证拍毕业照了。师兄们过得都还好，也提醒我们要准备校招的事了，于是开始了刷题刷校招信息的半找工作状态，在阿波的指导下用AI完成了一份看起来不错的简历。\u003c/p\u003e\n\u003cp\u003e7月份结束了大三的生活，也结束了在环创的日子。看着简历的项目经验不禁想起一些东西，我的大学为Coding付出了很多，在别人出去娱乐的时候我在学习，别人在宿舍打机的时候我在做项目。而在大三这个黄金时段，本应该钻研自己领域的技术，但我却在为工作室的项目付出着时间。但问我是否后悔，不！因为我得到的更多。我收获了很多比赛，收获了项目经验，收获了一群并肩作战的师弟师妹，还收获了很多说不清道不明的东西。有时候我在想，我们是不是应该丢掉现在社会上将任何东西都物质化的风气呢，其实很多东西是不应该被物质化的。那些我经过的事，做过的事，是否可以仅仅因为我的乐意而显得有价值呢，而不去刻意计算得失。\u003c/p\u003e\n\u003cp\u003e人生最后一个暑假也在去年开始了，完全不像以前般的挥霍，生活规律变得特别地好。会早上起来跑步（好吧，我承认是被我妈催起来的），开始注意锻炼身体，没事就玩深蹲。当然Coding也没落下，学习了laravel这个号称最优雅的框架并拙计地完成了中国象棋，我的棋力在那段时间一度飞升，后来就被虐到谷底了。暑假的生活比较悠闲，加之每餐都是我做菜，所以开始思量着怎么做会比较好吃，扫了眼百度的菜谱就开始做，也算是积累了些通用的技巧吧。比较喜欢的是做自己没做又觉得会很好的菜，反之做过的菜再做会觉得没意思 。厨艺技能算是得到了小小的提升。\u003c/p\u003e\n\u003cp\u003e4年没有画过画的我，翻到从前的画也是笑笑，原来以前我还有这兴致和耐心。然后买来素描纸和各种B的铅笔给师妹画了些画后，发现自己的兴致和耐心一直没变。人身上一些好的特性是不会轻易消失不见的，只要你有心。\u003c/p\u003e\n\u003cp\u003e暑假很快就结束了，我从来没有感受过如此短暂的假期，再见。来到学校，宿舍后面来了个师弟，稚嫩的身形提醒着我已经大四了。\u003c/p\u003e\n\u003cp\u003e大四这段时间，或许是临近毕业的原因，越来越发现自己知道的东西太少了，比如金融、股票、期权、这些经济概念和名词完全不懂，有心让自己的知识储备变得充实起来，所以遇到自己不懂的东西总是要摸个半懂。这也是让自己变得更好的一方面，放在以前，恐怕我完全不想理这些表面看起来“对自己无用”的东西。\u003c/p\u003e\n\u003cp\u003e用Kindle看了自控力这本书，里面介绍了一些提高自控力的方法。如冥想、静坐、锻炼、充足的睡眠等。现在看书都是边看边摘录下来了，看书的确是要做笔记的，以前看到别人说需要些读书笔记总是不以为然，认为没什么用。这种思想大抵是因为小时候上学时被应试教育的强制写读书笔记给毒害了。看书的确免不了笔记，即使没有自己的见解，将其中精华部分摘录下来也是好的。否则，以常人的记忆力，半个月后恐怕已抛之脑后，还有什么记得的呢。可能有人会想，那我看完书再去找别人摘录的岂不甚好。其实不然，每个人的思维方式和轨迹都不一样，你自己摘录的方式自然是最符合自己的思维方式的，这么，以后回来翻翻笔记，文中精华便按照你自己的思维轨迹以最舒服最快速的路径重新回到了你的记忆体中。因此，我总是喜欢以自己的方式再梳理一遍文章摘录，或者重新写一篇技术文章。这样，才是真正属于你自己的。\u003c/p\u003e\n\u003cp\u003e大四几乎没写代码，思量人生比较多。顺便在中秋去了趟长沙，和绍逸一起去的，终结了提了N次的湖南之旅。尽管只玩了2天，但还是去了不少地方，岳麓山、橘子洲、靖港古镇。自拍模式开启之后却是停不下来。都是临时做攻略的，以后出去玩要提前做好攻略，会更充实。\u003c/p\u003e\n\u003cp\u003e也是在大四这段无聊的时间，开始试着写歌编曲，五线谱不懂的我只能用钢琴app弹着黑白键记录下简谱，很享受这个过程，尤其是写完曲子开始填词的时候，但功能还不够，被吐槽太淡。果然自己写的和别人听所感受到的情感是不一样的，是谁说写歌的假正经，听歌的人最无情的。没有用心写怎么能写出好歌，没有用心感受怎么能理解音乐呢。后面下载了个FLStudio，用来编曲，发现自己对乐器的匮乏程度还是蛮高的，编的曲和主旋律配合得不好，有机会应该总体了解每种常用乐器，结合起来必定能编出好曲，林迈可、钟兴民大神，收下我的膝盖。\u003c/p\u003e\n\u003cp\u003e10月份出发去广州霸面YY，霸面未遂还是不甘心空手回去的。小伙伴们收集着当天的校招和宣讲会信息，刚好当天下午有个公司在附近的广外宣讲。于是去做了笔试，第二天面试完便拿了个offer。这也是我现在实习的公司。是否觉得缘分这东西很奇妙呢，假设我当时没去凡趣的宣讲会，我现在又会在哪家公司写着什么样的应用呢。\u003c/p\u003e\n\u003cp\u003e人生最后一节课和最后一场考试在11月份结束了，可耻的是我当时简直没有注意到这个最后意味着什么，在身边同学发着朋友圈感慨的时候我才后知后觉反应过来。\u003c/p\u003e\n\u003cp\u003e毕业答辩终于在12月5号开始了，尽管一直没把答辩放心上，但没想到的是在当天竟然睡过头了，学委打电话给我的时候才迷迷糊糊起来刷牙。没有想象中的老师问很多专业问题，甚至没有让我把PPT演示完就草草结束了。是的，的确很不满意。我最大的作业就这么被应付了，还不比我的课程设计呢。\u003c/p\u003e\n\u003cp\u003e纠结完就算了，生活还是得过，房子还是得找。开始留意检索深圳的租房信息，凭借我深厚的检索能力倒是搜集了不少信息。最后得出结论，还是直接去实地找吧。\u003c/p\u003e\n\u003cp\u003e圣诞节，师弟师妹给我和英灿过了大学最后一个生日。谢谢你们给我们的准备，每年的圣诞节都给我们过生日。哦，今年蛋糕上的两个小雪人很赞。\u003c/p\u003e\n\u003cp\u003e接着就突然跑来深圳了，就这么突然来到了一个陌生又让我感到亲切的城市，去公司报到，感受不一样的Coding生活。对了，这里的宜家很赞哦，房子\u003c/p\u003e\n\u003cp\u003e是租的，但生活不是。开始期待我会怎样弹奏我的生活。\u003c/p\u003e\n\u003cp\u003e最后以五月天的歌词结尾，下段旅程，你一定要更幸福丰盛。\u003c/p\u003e\n\u003cp\u003e共勉。\u003c/p\u003e","title":"2015年度总结"},{"content":"时间会让你忘掉好多，但写下的字不会。\n岳麓山下、橘子洲头、烟花散布星空 8点多出门，尽管昨晚比较晚睡下，但今天精神还是很好，毕竟出来旅游很多事物都是新鲜的，很难不兴奋起来。 直接无视旅馆比较糟糕的住宿体验，洗漱完毕就到附近吃早餐，对早餐没什么要求，吃了份红烧牛肉面就赶着去坐公交，长沙的公交不是很多人，即使是在高峰期也不会显得很恐怖。 值得提到的是，这里的居民挺热情的，跟个岁数较大的阿姨问个路，我们听完后离开，还是会赶上来跟我们说，应该走哪边。念叨着，你们小孩出去玩不要走丢了。我们都是一阵汗颜，我们哪里是小孩子啦~ （绍逸的感冒开始了，买了点药。活该咯，谁让他在学校前一晚出去浪喝那么多酒。） 我们今天上午的目标是岳麓山，路线大致两种，一种是从东门上去，南门下来。另一种是南门上去，东门下来。东门是岳麓山的正门，但是从网上的攻略看，景点都在南门，东门几乎没什么景。所以很多人都是从东门坐索道的车上去，再步行下来的。 然而我们走的是第一种路线，也是挺多人喜欢的。南门爬上去，到山顶从索道坐吊车下来。因为我一直觉得从上面滑下去才爽，后面证明这个爽是没有的，太慢了笑 既然从南门上去，就免不了经过湖南师范大学和湖南大学。到那里的时候湖师大的新生正在军训，然而感觉这群娃娃的军训没有feel，软绵绵的。我们的计划是先去湖南师大逛逛，在小门遇到从里面出来的女生，搭讪问完路后，女生笑着说，“湖南师大没什么好看的哈”。我们当时也笑回道，“自家看惯啦当然不觉得好看啦~”后来走进去后发现果然除了校道两边的树及淡淡的香味，的确没什么好看的。当然可能是我们只经过了一个角落。沿着校道出了湖南师大后前往湖南大学，湖南大学的建筑还是古朴一点的，相较于湖南师大好看了些许。 继续前进，准备上山。遇到义卖月饼的学生们，顺便问了路。绍逸因此还买了一块月饼顺着指的路走去就看到了矗立在东方红广场的毛爷爷的雕像，这块雕像挺高大的。拍摄需要仰望的角度挺大。没有和毛爷爷合影，绍逸说总觉得合影有点不恭敬的意味。毛爷爷后面是一面雕刻着沁园春的大长石板，拿出自拍神器，但这东西竟然不能用，泪奔。还好手长，拿着手机给我俩来了张合照，然后觉得没有将整块石板囊括起来有点不爽，让路人给我们来了张全景。照片上的我们一人站在石块的一边，pose什么的自然是最土的手插裤袋站立式啦~ 毛爷爷广场算是收场了，赶紧前往第一站岳麓书院，这边超级多人，而且是需要门票的。原本可以考虑买张门票进去耍耍，但人这么多不禁没意思了。在门口拍了张照就继续前往下一站。然而途中遇到荷花池和亭子又驻足拍了几张，这边还有人在画画呢，那位同学画的水彩画不是很懂欣赏。穿过一个小门准备前往爱晚亭，这边到处都是树（特么不是废话么，山上的树能少吗）。沿着石板和泥路走了会，穿过狭窄的小道就看到不少游客了，敢情我们这边走的是超级小道，笑~ 爱晚亭比较小，亭下站满了人，大家都在拍照，甚至不顾照片上出现的路人甲乙丙丁，依旧和爱晚亭合影得不亦乐乎。我是没什么心思来合影啦，于是将镜头往上拉，越过游客们的头顶线，将爱晚亭定格住。爱晚亭的名字源于杜牧《山行》的“停车坐爱枫林晚”，然而下一句“霜叶红于二月花”现在倒还看不到。这边很多枫树，都有100多年的树龄了。可惜尚未等到深秋时节，层林尽染时候。不然一片红，拍起来定是绝美绝美的。我很喜欢枫叶，红色的枫叶，很喜欢。缓缓飘落的枫叶像思念，为何挽回要赶在冬天来之前。因为冬天来之前是深秋，最是红透，正是思念最为深切之时。 再往上走就是麓山寺了，途经一些革命烈士的墓碑便过去致敬了下。看着绍逸体力有点不行的样子，扔给他几粒益达，顺便小小鄙视了下，看在他感冒的份上，我的鄙视很轻。 麓山寺到了，寺庙比较小，香火也不算太旺。游客稀少得我很喜欢。和一般寺庙没多大区别，便在亭下长凳坐下来开始享受一片荫凉。休息完毕后对于寺庙并不大感冒的我便出门继续往上走。 然后，然后就真的到山顶了，不禁感叹岳麓山好矮，网上大家说爬上来很累很累原来都是骗人的。岳麓山的景点很袖珍呢，可能你经过都不知道原来已经路过了一个景点，笑~ 既然到山顶，当然得好好俯瞰众山小的感觉啦，听说还可以俯瞰到像长条面包的橘子洲呢。但是雾很大，什么都看不清，拍出来的是一层迷雾笼罩着树木的画面。说好的俯拍就这样没了，但是这种情况下还有很多游客像我一样傻逼地拍拍拍~ 顶着几条黑线的我买了索道下行的票，这里的索道装置很简单，山顶山脚贯通着铁线，我们坐的吊车就这样被吊在下面。吊车十分简单，就像是秋千前面加了个防护栏。当时我倒觉得很安全，后来给朋友看拍的照片，朋友被吓得不要不要的。吊车的速度很慢，在上面拍小视频就像拍静物。还以为从山顶滑下去会很爽呢，不过慢也有慢的好，可以多点时间享受山木尽在脚下的感觉。我和绍逸开始启动自拍模式，两个傻逼拍了几张表情一样的傻照片，还在继续对好光线和角度。绍逸这二货看着脚下葱郁的树木，脑洞大开，“你说手机从这里扔下去还能不能找回来。”我睥睨回道，“可以啊，你扔下去我马上给你开GPS定位”。 几乎忘了是怎么到山脚的，只知道快下车的时候，售卖照片的大叔拼命让我们摆pose，给我们拍坐着吊车最后的时刻。“怎么样，晒几张留作纪念吧~”看着比我们自己拍的还要傻逼的照片，果断拒绝离开了。从索道口出去便是东门，很多游客便是从这边上去的。 此时已经接近2点，回去旅馆睡了会便又出门了。这次的目的地是橘子洲，我们准备坐地铁过去。从旅馆出来穿过一条马路就是地铁站，这个地铁站我们已经注意好久了，貌似都没人出入的。怀着求知的科学精神，我们决定一探究竟。沿着楼梯走下去，是的，没有电梯。看到了工作人员我不禁皱了皱眉，还以为有生化危机呢。买好票去候车，等车的人非常少，后来才知道我们这边西湖公园站算是郊区，人少也不奇怪了。这条2号地铁线贯穿长沙东南，还是很便利的。至于它的哥哥1号线去哪了，不要问我，我一直疑惑到现在。 橘子洲到了，迎面吹来的风很舒服。橘子洲大桥横跨湘江，岸边杨柳依依，微风吹来难免有“杨柳岸晓风残月”的触感。在这里看书写字画画和coding也必定是极好的，当然可以的话，其实我想在这里睡一觉。靠着江堤想拍几张装逼照，未果。倒是后来偶然遇到一栋古色古香的建筑依靠在墙上来了张装逼。然后一发不可收拾，眼睛变得贼丽丽的，总能发现几处能够装逼的点开始拍拍拍。这是后话了，咱们继续今天的旅程~ 由于今天是周六，按照惯例，晚上20:30-20:50橘子洲会燃放烟花哦。所以当我们想去看看橘子洲头的毛爷爷石像时发现路被拦住了，烟花装置开始布置，游客禁入。这也是此次一行较为遗憾的地方，那块青年毛爷爷的石像可是相当帅气的。 看着时间接近6点，开始前往杜甫江阁，那边是观赏橘子洲烟花绝妙之地之一。抱着“这么早前往应该能占个好位置吧”的想法，后来被狠狠打了一脸，比你早的人大有人在，杜甫江阁附近的台阶已经坐满了人，护栏边也不少人。我们好不容易深入人群才找到能够坐下的地方，随着时间的推移，不断有人一波一波地涌进涌出，绍逸的脚还被人踩了好多下（为什么我没被踩到呢）。看来大家对今晚的烟花特别期待呢。 我读着分钟，到点了！！“Biu~”“Biu~”“Biu~”小束烟花开始燃放升空，预热开始了。紧接着一波接着一波的烟花不断升空盛开，不同颜色的星星点点迅速散布在黑色的夜空中，相当璀璨。好漂亮，手机拍摄出来美感却是减了一大半，果然人的眼睛才是最好的相机。\n靖港古镇、太平老街 得到任何东西都是需要付出代价的，尤其是美好的事物。今天的目的地是靖港古镇，代价就是2个多小时枯燥无味的公交时间。当绍逸听我说路途如此漫长之时，我告诉他，我已经打算把一天的时间留给还未见到的古镇了。 如果在一个陌生的地方偶遇老朋友，绝对是因为上辈子无数次的拥抱。当然与英灿的相遇却并非偶然，这家伙到了湖南整天待在机房里闭关，好不容易来趟长沙自然免不了约出来捏捏他的脸（我好像忘记捏了~）。见到英灿时，他已经一头长发，长长的刘海却是遮掩不住他的阳光笑容。没有变的是，英灿还是没有长高。三人来了几张合影，不顾街上满是游客的背景。 古镇到处都有适合装文艺青年的场景，若不拍下来岂不是浪费人生？我们管这种行为叫装逼，装逼谁不喜欢呢。然而装逼三人组的装逼技能尚未点满，pose少得没朋友，下次一定要带个擅长zhuangbility的妹子。小巷里斑驳的砖墙、镂空的竹窗，几米阳光斜斜地打落下来。我还是没忍住，闯进了这处静谧，并将这块时空剪切下来粘贴在了我手机的壁纸上。 古镇上有处地方在进行皮影戏表演，这种富有乡土气息的传统艺术终于得以亲眼所见。表演的曲目很简单，两个小动物争着过桥最后相互谦让的故事，对于我们来说倒是显得幼稚了。可是谁管呢，让我们好好欣赏皮影人物随着老先生抖动的双手不断地跳跃在屏纸上吧。 下午时分离开古镇，因为要赶在天黑之前忘了你的眼睛（什么鬼？！）抵达太平老街。都说这里很多小吃，的确如此，但遗憾的是哥胃口比较小，好多东西无法装下，刚吃一点就饱了。下次还有机会的话一定要先饿一天，大家记住，请先饿一天。这边的凉粉是白色的，加点红糖、薄荷水便成了一碗清凉的凉粉。问老板是否吃过黑凉粉竟回答没有，于是告诉老板，黑凉粉吃起来味道好多了呢。 剩下的文字交由下次吧，如果还有机会的话。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/changsha/","summary":"\u003cp\u003e时间会让你忘掉好多，但写下的字不会。\u003c/p\u003e\n\u003ch2 id=\"岳麓山下橘子洲头烟花散布星空\"\u003e岳麓山下、橘子洲头、烟花散布星空\u003c/h2\u003e\n\u003cp\u003e8点多出门，尽管昨晚比较晚睡下，但今天精神还是很好，毕竟出来旅游很多事物都是新鲜的，很难不兴奋起来。 直接无视旅馆比较糟糕的住宿体验，洗漱完毕就到附近吃早餐，对早餐没什么要求，吃了份红烧牛肉面就赶着去坐公交，长沙的公交不是很多人，即使是在高峰期也不会显得很恐怖。\u003cimg alt=\"长沙火车站\" loading=\"lazy\" src=\"/posts/changsha/_____.jpg\"\u003e 值得提到的是，这里的居民挺热情的，跟个岁数较大的阿姨问个路，我们听完后离开，还是会赶上来跟我们说，应该走哪边。念叨着，你们小孩出去玩不要走丢了。我们都是一阵汗颜，我们哪里是小孩子啦~ （绍逸的感冒开始了，买了点药。活该咯，谁让他在学校前一晚出去浪喝那么多酒。） 我们今天上午的目标是岳麓山，路线大致两种，一种是从东门上去，南门下来。另一种是南门上去，东门下来。东门是岳麓山的正门，但是从网上的攻略看，景点都在南门，东门几乎没什么景。所以很多人都是从东门坐索道的车上去，再步行下来的。 然而我们走的是第一种路线，也是挺多人喜欢的。南门爬上去，到山顶从索道坐吊车下来。因为我一直觉得从上面滑下去才爽，后面证明这个爽是没有的，太慢了\u003cdel\u003e笑\u003c/del\u003e 既然从南门上去，就免不了经过湖南师范大学和湖南大学。到那里的时候湖师大的新生正在军训，然而感觉这群娃娃的军训没有feel，软绵绵的。我们的计划是先去湖南师大逛逛，在小门遇到从里面出来的女生，搭讪问完路后，女生笑着说，“湖南师大没什么好看的哈”。我们当时也笑回道，“自家看惯啦当然不觉得好看啦~”后来走进去后发现果然除了校道两边的树及淡淡的香味，的确没什么好看的。当然可能是我们只经过了一个角落。沿着校道出了湖南师大后前往湖南大学，湖南大学的建筑还是古朴一点的，相较于湖南师大好看了些许。 继续前进，准备上山。遇到义卖月饼的学生们，顺便问了路。绍逸因此还买了一块月饼\u003cdel\u003e顺着指的路走去就看到了矗立在东方红广场的毛爷爷的雕像，这块雕像挺高大的。拍摄需要仰望的角度挺大。没有和毛爷爷合影，绍逸说总觉得合影有点不恭敬的意味。毛爷爷后面是一面雕刻着沁园春的大长石板，拿出自拍神器，但这东西竟然不能用，泪奔。还好手长，拿着手机给我俩来了张合照，然后觉得没有将整块石板囊括起来有点不爽，让路人给我们来了张全景。照片上的我们一人站在石块的一边，pose什么的自然是最土的手插裤袋站立式啦~ 毛爷爷广场算是收场了，赶紧前往第一站岳麓书院，这边超级多人，而且是需要门票的。原本可以考虑买张门票进去耍耍，但人这么多不禁没意思了。在门口拍了张照就继续前往下一站。然而途中遇到荷花池和亭子又驻足拍了几张，这边还有人在画画呢，那位同学画的水彩画不是很懂欣赏。穿过一个小门准备前往爱晚亭，这边到处都是树（特么不是废话么，山上的树能少吗）。沿着石板和泥路走了会，穿过狭窄的小道就看到不少游客了，敢情我们这边走的是超级小道，笑~ 爱晚亭比较小，亭下站满了人，大家都在拍照，甚至不顾照片上出现的路人甲乙丙丁，依旧和爱晚亭合影得不亦乐乎。我是没什么心思来合影啦，于是将镜头往上拉，越过游客们的头顶线，将爱晚亭定格住。爱晚亭的名字源于杜牧《山行》的“停车坐爱枫林晚”，然而下一句“霜叶红于二月花”现在倒还看不到。这边很多枫树，都有100多年的树龄了。可惜尚未等到深秋时节，层林尽染时候。不然一片红，拍起来定是绝美绝美的。我很喜欢枫叶，红色的枫叶，很喜欢。缓缓飘落的枫叶像思念，为何挽回要赶在冬天来之前。因为冬天来之前是深秋，最是红透，正是思念最为深切之时。\u003ca href=\"__.jpg\"\u003e\u003cimg alt=\"枫树\" loading=\"lazy\" src=\"/posts/changsha/__.jpg\"\u003e\u003c/a\u003e 再往上走就是麓山寺了，途经一些革命烈士的墓碑便过去致敬了下。看着绍逸体力有点不行的样子，扔给他几粒益达，顺便小小鄙视了下，看在他感冒的份上，我的鄙视很轻。 麓山寺到了，寺庙比较小，香火也不算太旺。游客稀少得我很喜欢。和一般寺庙没多大区别，便在亭下长凳坐下来开始享受一片荫凉。休息完毕后对于寺庙并不大感冒的我便出门继续往上走。 然后，然后就真的到山顶了，不禁感叹岳麓山好矮，网上大家说爬上来很累很累原来都是骗人的。岳麓山的景点很袖珍呢，可能你经过都不知道原来已经路过了一个景点，笑~ 既然到山顶，当然得好好俯瞰众山小的感觉啦，听说还可以俯瞰到像长条面包的橘子洲呢。但是雾很大，什么都看不清，拍出来的是一层迷雾笼罩着树木的画面。说好的俯拍就这样没了，但是这种情况下还有很多游客像我一样傻逼地拍拍拍~ 顶着几条黑线的我买了索道下行的票，这里的索道装置很简单，山顶山脚贯通着铁线，我们坐的吊车就这样被吊在下面。吊车十分简单，就像是秋千前面加了个防护栏。当时我倒觉得很安全，后来给朋友看拍的照片，朋友被吓得不要不要的。吊车的速度很慢，在上面拍小视频就像拍静物。还以为从山顶滑下去会很爽呢，不过慢也有慢的好，可以多点时间享受山木尽在脚下的感觉。我和绍逸开始启动自拍模式，两个傻逼拍了几张表情一样的傻照片，还在继续对好光线和角度。绍逸这二货看着脚下葱郁的树木，脑洞大开，“你说手机从这里扔下去还能不能找回来。”我睥睨回道，“可以啊，你扔下去我马上给你开GPS定位”。 几乎忘了是怎么到山脚的，只知道快下车的时候，售卖照片的大叔拼命让我们摆pose，给我们拍坐着吊车最后的时刻。“怎么样，晒几张留作纪念吧~”看着比我们自己拍的还要傻逼的照片，果断拒绝离开了。从索道口出去便是东门，很多游客便是从这边上去的。 此时已经接近2点，回去旅馆睡了会便又出门了。这次的目的地是橘子洲，我们准备坐地铁过去。从旅馆出来穿过一条马路就是地铁站，这个地铁站我们已经注意好久了，貌似都没人出入的。怀着求知的科学精神，我们决定一探究竟。沿着楼梯走下去，是的，没有电梯。看到了工作人员我不禁皱了皱眉，还以为有生化危机呢。买好票去候车，等车的人非常少，后来才知道我们这边西湖公园站算是郊区，人少也不奇怪了。这条2号地铁线贯穿长沙东南，还是很便利的。至于它的哥哥1号线去哪了，不要问我，我一直疑惑到现在。 橘子洲到了，迎面吹来的风很舒服。橘子洲大桥横跨湘江，岸边杨柳依依，微风吹来难免有“杨柳岸晓风残月”的触感。在这里看书写字画画和coding也必定是极好的，当然可以的话，其实我想在这里睡一觉。靠着江堤想拍几张装逼照，未果。倒是后来偶然遇到一栋古色古香的建筑依靠在墙上来了张装逼。然后一发不可收拾，眼睛变得贼丽丽的，总能发现几处能够装逼的点开始拍拍拍。这是后话了，咱们继续今天的旅程~ 由于今天是周六，按照惯例，晚上20:30-20:50橘子洲会燃放烟花哦。所以当我们想去看看橘子洲头的毛爷爷石像时发现路被拦住了，烟花装置开始布置，游客禁入。这也是此次一行较为遗憾的地方，那块青年毛爷爷的石像可是相当帅气的。 看着时间接近6点，开始前往杜甫江阁，那边是观赏橘子洲烟花绝妙之地之一。抱着“这么早前往应该能占个好位置吧”的想法，后来被狠狠打了一脸，比你早的人大有人在，杜甫江阁附近的台阶已经坐满了人，护栏边也不少人。我们好不容易深入人群才找到能够坐下的地方，随着时间的推移，不断有人一波一波地涌进涌出，绍逸的脚还被人踩了好多下（为什么我没被踩到呢\u003c/del\u003e）。看来大家对今晚的烟花特别期待呢。 \u003ca href=\"psbe.jpg\"\u003e\u003cimg alt=\"psbe\" loading=\"lazy\" src=\"/posts/changsha/psbe.jpg\"\u003e\u003c/a\u003e 我读着分钟，到点了！！“Biu~”“Biu~”“Biu~”小束烟花开始燃放升空，预热开始了。紧接着一波接着一波的烟花不断升空盛开，不同颜色的星星点点迅速散布在黑色的夜空中，相当璀璨。好漂亮，手机拍摄出来美感却是减了一大半，果然人的眼睛才是最好的相机。\u003c/p\u003e\n\u003ch2 id=\"靖港古镇太平老街\"\u003e靖港古镇、太平老街\u003c/h2\u003e\n\u003cp\u003e得到任何东西都是需要付出代价的，尤其是美好的事物。今天的目的地是靖港古镇，代价就是2个多小时枯燥无味的公交时间。当绍逸听我说路途如此漫长之时，我告诉他，我已经打算把一天的时间留给还未见到的古镇了。 如果在一个陌生的地方偶遇老朋友，绝对是因为上辈子无数次的拥抱。当然与英灿的相遇却并非偶然，这家伙到了湖南整天待在机房里闭关，好不容易来趟长沙自然免不了约出来捏捏他的脸（我好像忘记捏了~）。见到英灿时，他已经一头长发，长长的刘海却是遮掩不住他的阳光笑容。没有变的是，英灿还是没有长高。三人来了几张合影，不顾街上满是游客的背景。 \u003ca href=\"___.jpg\"\u003e\u003cimg alt=\"三人行\" loading=\"lazy\" src=\"/posts/changsha/___.jpg\"\u003e\u003c/a\u003e 古镇到处都有适合装文艺青年的场景，若不拍下来岂不是浪费人生？我们管这种行为叫装逼，装逼谁不喜欢呢。然而装逼三人组的装逼技能尚未点满，pose少得没朋友，下次一定要带个擅长zhuangbility的妹子。小巷里斑驳的砖墙、镂空的竹窗，几米阳光斜斜地打落下来。我还是没忍住，闯进了这处静谧，并将这块时空剪切下来粘贴在了我手机的壁纸上。 古镇上有处地方在进行皮影戏表演，这种富有乡土气息的传统艺术终于得以亲眼所见。表演的曲目很简单，两个小动物争着过桥最后相互谦让的故事，对于我们来说倒是显得幼稚了。可是谁管呢，让我们好好欣赏皮影人物随着老先生抖动的双手不断地跳跃在屏纸上吧。 下午时分离开古镇，因为要赶在天黑之前忘了你的眼睛（什么鬼？！）抵达太平老街。都说这里很多小吃，的确如此，但遗憾的是哥胃口比较小，好多东西无法装下，刚吃一点就饱了。下次还有机会的话一定要先饿一天，大家记住，请先饿一天。这边的凉粉是白色的，加点红糖、薄荷水便成了一碗清凉的凉粉。问老板是否吃过黑凉粉竟回答没有，于是告诉老板，黑凉粉吃起来味道好多了呢。 剩下的文字交由下次吧，如果还有机会的话。\u003c/p\u003e","title":"九月、长沙"},{"content":"本文by藥師, 原问题：点击这里 对于不同社会阶层的流动，我一直有悲观的看法，认为目前国内的状况，社会趋于成熟，阶层之间的流动越来越少。 题主私信邀请我来回答这一问题，我很愧疚，因为我觉得我回答不好，所以告诉题主，我在午睡。但是题主回复我说“不扰了，谢谢。” 因为这句谢谢，突然心有所动，决定爬起来来回答，后面我会说为什么因为这句谢谢我来写我的回答。 想直接看具体实施方式的，请直奔第三个段落，不要去阅读第一、二个段落，第一段落基本是我的碎碎念，第二个段落只是一个引例。 一、写歌的人假正经，听歌的人最无情。 阅读前请先记得陈升说的这句话，**写歌的人假正经，听歌的人最无情。**对于知乎上大量热门回复，点赞过K的，我的观察是，这些回复并不是最有道理，对读者最有意义的回复，却经常是能挑动读者情绪的回复，因为情绪，所以认同，所以高票。 我在知乎陆续答了一个月的题，尝试了不同的书写方式，最后往往是我觉得写出了有一定专业度真知灼见的东西不为人所认同，自己胡扯的很多东西被赞爆。我读了不少自己能接触到行业内的回答，一些高票答案基本是在信誓旦旦的胡扯，却获满堂彩（一些基本的常识已经错了，难以相信是行业内的高手写的）；我也读过一些真正高手的回答，令我心悦诚服，令我虚心向学，但却只获得寥寥无几的赞同票，他们自身也在知乎变得默默无闻。 这是很悲哀的事情，说明绝大多数人并没有独立思考，辨别真伪的能力，这是古斯塔夫·勒庞《乌合之众》一书中描绘现象的体现，这是羊群效应、马太效应的具体显现。知乎不过是这个现实社会的缩影。单单比较知乎同quora很多同样问题下的不同回答，既可知对于国人基本独立思考能力的培育，任重而道远。 Quora精选：我身边的同事都很优秀，我该怎么办？ Quora精选：为什么很多人都以为自己是天才？ 可自行对比知乎类似问题。看看同样的问题下，老外的思路同国人思路的不同；看看同样的问题下，高票答案的思路高低差多少。 说这些无非是想告诉题主，不要去轻易相信任一答案，用自己的思考去证明答案，用自己的生活去验证答案，而不是简单的看了我的答案、别人的答案，觉得谁说的对，点个赞那么简单。 你点的不是赞，而是认同，“我”写的不是对，而只是“我”为给我点赞的人说了他们想说的话，所以他们认同。 当你读了答案，彻底认同一个人的观点是，只说明了两件事。\n你被洗脑了。 这个人的观点对你来说毫无用处，因为你完全认同，所以你并未学习到任何新的思维。 希望阅读答案的人，阅读答案的同时，都能好好思考下，这条答案是否是作者的真知灼见，或者，只为了拿高票而作的迎合读者情绪、思维的回答，假正经回答。 最重要的，一个答案，是否真的对你有用，值得你去学习、实践。 二、不同社会阶层的人思维上的差异是低阶层人群上行的主要阻力。 擦桌子有多少种方法？ 花3分钟思考下这个问题再往下看。 曾经一位损友用这个问题，证明了我的思维力不足，没有掌控大项目的能力，操控大公司的能力。 当你擦一个桌子时，要考虑桌子的质地——塑料、金属、木质、木质是实木还是贴皮。 观察桌子上本身的污物——灰尘、油尘还是积水。 而后要考虑的是针对不同桌子的材质所需求的擦桌布质地——丝质、纯棉、麻、棉麻或化纤质地。 擦桌布是干是湿，沾水的话，沾多少，使用清洁剂嘛，用什么清洁剂。 以上我说的这些，有区别吗？ 有很大的区别。这是一个餐厅里老板、大厅主管或清洁工思维上的区别。 一个清洁工会简单的随手找块布\u0026quot;擦干净\u0026quot;桌子，一个主管会略微考虑下具体情况再决定用什么擦桌布去擦什么桌子。而老板却会通过观察得出结论，哪个人是值得托付可以把事情交给他的。 这就是简单的，位处于不同思维层次的人会思考的问题。而这些问题不是说我告诉你，你听了，就能立刻改变你的思维。 思维难以改变，除非你所处的社会阶层、生活环境发生了改变，我说了，你只是听了，但你遇到类似的情况，还是不会。 这次是桌子的问题，下次可能是扫地，处于不同社会阶层的人拥有的不同思维，决定了人们看待这个世界的方方面面都会得出截然不同的答案，哪怕只是擦桌子这么小的一件事。 我只是想通过引例来证明，不同阶层人群思维互相理解上的无力化，处于低阶层的人，真的非常难以理解比自己社会阶层高的人思维，这是低阶层人被困住无法上行的主要因素。 回到题主工厂的案例也是一样的，在工厂里工作，但是小姑娘可以花时间弄清楚每个人的职能，观察每个人每天在做什么，思考管理人员每天想什么，工厂的老板每天想什么。 如果这个小姑娘能理清所有人的职能、思路、做事手段时，她就有了做这个工厂厂长的能力。 回到小姑娘自己的工作，只是做一道简单的工序，可能简单如擦桌子，但如何能比别人做得更快，更好。能否改进这道工序。当作出改变时，也是自我提升的时候。 好了，引例说完了。说针对题主设定环境的具体回答。 三、针对题目的具体回答，位处社会底层的人能做的事。 **1、**有哪些重要的道理现在就需要认识？ 没有什么重要的道理需要现在就认识，你需要有的只是更宽广的世界观，去接纳不同的观点，这个世界上没有绝对的真理，处于不同位阶的人理解世界有不同的观点，这种观点无对错之分，所有人形成的所有观点不过是适于自己在自己所处环境生存的观点，观点的形成得益于其自身所处环境，形成后回馈于他们自己的生活。 不要轻易去否定哪些观点，地主们的丛林法则可能在商业世界里比年轻精英们的MBA学历更适用，土法造钢未必不行。 而自己需要的是去观察他人做事的手段、思考的思路，一切总结不过是对复杂事物的简化，当你真正明白一个道理，是很难对他人言传身教的。这也就意味着哪怕是鸡汤的存在，也有它的道理，成功人士会给鸡汤点赞，也可能是鸡汤里的某一句触动了成功人士内心里对于成功的简要总结。 但只是简要总结而已，这句总结你学会了对你的生活毫无意义，你只是知道了一个证明的结果，却不知整道题如何证明，你得到一个正确的结论却无法用在你生命里的任何一处，除非，有天你自己亲身验证了这个道理。 打开你的思维，去接纳一切，去学习，去分辨。 最后决定一个人所在社会阶层的往往是他的思维，而不是财富。 2、有哪些事情可以去尝试？ 不要给自己设限，黄赌毒不要碰，法律上允许的事（我可没说道德上），都可以去尝试。 所有事，你都可以去试。 年轻意味着你是个不着边际的多边形，不去不停的试错，你不会知道自己的形状，自己的容器到底有多大。 希望你不要花太多时间弄清楚自己到底是个什么玩意，也少花点时间在人生的困惑上，多去做做事情，读读书。 虽然到目前为止，我还没弄清楚自己是个什么玩意，也经常困惑不已。 3、有哪些通俗又精辟的书籍推荐？ **如果一本书是通俗的，它往往很难是精辟的。**题主的问题其实我并不喜欢，从问题中透露出一种速成的要求，这和知乎自身的存在很像，很多看似精辟的回答，精简化的知识并不会给一个人带来任何实际的能力提升，但知乎的自我定位很准，让你看到一个更大的世界——但不意味着你能进入这个更大的世界。 别人的世界终究是别人的世界，你只能看到，要踏入，非自己踏一步不成。 所有读书人都有着自己的思维构架，我经常用树来举例，最开始是根，而后枝叶，当你自己的一棵树形成后，其实往往无法理解他人的“树”，他人能给你推荐的，对你有效用的书籍往往少之又少。不妨自己去试错，不停地推翻自己。 读错了书没关系，但要带着怀疑的观点看待任何一本书，这次读错了，至少下次你知道怎么选一本对的书。这不是绕弯路，试图直线最短距离前进的人往往得到的结果更糟糕。 具体如何选书、买书读，可以参考我的这篇文。这是我对某个我的知乎答案的整理。 你有药吗丨咱家买书时，那都是锣鼓喧天、鞭炮齐鸣、红旗招展、人山人海的。 但更大的建议是，当你遇到困惑时，当你觉得你需要学点什么的时候，再去找，去读。 4.勇气、性格 关于自我性格的塑造，勇气这些东西。不要指望任何人去帮助你，拉你出你自己的小世界。 除非你下了决心改变自己，否则谈勇气这些东西都是毫无意义。 综上，知识，学历，阅历，怎么读书，读什么书，都不是最重要的，最重要的是自己思维方式的改变。 思维方式改变后，其他一切只是顺水推舟。 但思维的改变，却是最难的。 我不知道怎么对一个18岁的厂妹解释这些，所以我说我回答不好，这不是一个好答案。 四、其他能给出的建议 1. 大多数免费的信息获取渠道，往往也意味着无价值。 我说的这种信息获取渠道，包括互联网，包括知乎——往往难以获得真正真实有效的信息。“你”认为你获得的有效的知识，往往是因为“你”自身缺乏对知识的辨别能力。 这种知识往往只能成为你茶余饭后闲聊的资本，对你的人生规划、职场规划，对你真实的能力提高，毫无意义。 写歌的人假正经，少看点我这种二道贩子（在我看来目前互联网乃至传统传媒出产的大量“作家”，都是二道贩子）写的东西，多读读先哲们写的东西，在不知道阅读什么的时候，所有的经典都可以翻出来读。 你不是书读得少，你是经典读得少\n我们现在这个时代，这些浮于表面的潮流与声音就特别多，充斥在书架上的评论集，充斥在社交工具上，充斥在一些精神导师的心灵鸡汤里。那些满是标签与结论的东西，根据触及不到事物的本质，只是一堆情绪的排泻物，但它们足够的多，年轻的孩子们很难穿过它们，找到一处安静之地，人烟稀小，用自己的头脑想点东西。\n读书的方式就是你的生活方式，思考可能不会为你的生活增加什么，但会让你明白自己是怎么走到今天，如何更好地面对自己，面对他人，怎样能够活得更加坦然。\n这篇文章的观点我是认同的，建议一读。不知道看什么的时候，就读读经典。 2.扩宽自己的社交圈，三教九流皆可。但不要指望比自身段位高的人无偿帮助自己。 我知道这是件很难的事，我说的扩宽自己的社交圈不是简单的微信摇一摇、看看附近的人。这都是毫无意义的。 门口修车的大叔可以认识一下；厂里的厂长可以每次见笑一笑，打个招呼；路边摊麻辣烫老板可以聊几句，不要羞于展示自己。其实对18岁的阅历来说，没什么好掩饰的。 不到最后你不会知道哪个人无心告诉你的那句话真正的帮助了你。 不要指望比自身段位高的人无偿帮助自己，也不要认为一个比自己段位低的人认识你只是为了利用你。 确实这个社会社交的本质是等价交换，包养二奶只是其中的特例、互相利用只是极端的显现。但不要因为这些特例而放弃与人为善。永远要记得头上三尺有神灵。人在做，天在看。同样的，天道酬勤，自己努力去做的事，多多少少会有些回报。 3.记得心存善念，尽量不去恶意揣摩他人的意图。 无论在做什么，记得心存善念，尽量不去恶意揣摩他人的意图。 这是我发现我自身的很大一个缺点，这两年来我一直在克制自己恶意揣摩他人的想法。 这也是我知道的众多“穷人”（无论物质、精神）共有的缺点。 “穷人”因为生活环境所困，会去防备他人，恶意揣摩他人的意图。富人很少恶意揣摩他人，因为富人（不是国内这些暴发户，他们还是穷人）生活在一种更安定的环境，对生活更满意。真正的物质、精神丰腴的人，不会去恶意揣摩他人。想走进富人的圈子，乃至自己成为富人，也要慢慢学会用善意去思考他人，同时把自己的善意传达给他人。 4.以我浅薄的见识看来，人生既是努力的结果，也是机遇的结果。 我认识18岁小学文凭先去深圳打工，而后做外贸做到年薪30w（30岁左右），在深圳有房有车的外贸企业中层管理的大姐。 这个小学文凭的大姐跟着他的老板十几年，但同他老板的相识过程属于我上面说的在扩宽了自己的人际圈，最后跳出了自己曾经的小世界。 对，她就是厂妹出身。 但我也知道更多厂妹从18岁开始在工厂里做，做到20几岁回老家嫁人的事。 都不算错，只在于自己的选择，如果你想看到更大的世界总得自己去迈出一步；但如果你只想小富即安，拿一笔钱回老家过安稳的生活，嫁个老实人，也是很好的选择，很好的结果。 5.活在当下 明天的事情太远，想清楚今天要做的事，马上去做。犯了错，马上改。 6.保有赤子之心，不要去哀叹生活。 视频：\nSigur Ros Hoppipolla 就像这样。 og ég stend alltaf upp(But I\u0026rsquo;ll always stand up). 这句话我不想展开谈，但说白了就是一个心态，没有良好的心态，无法保持你努力到最后一刻，说得俗点，让自己正能量满满。 7.最后，无论成败，感恩所有帮助过你的人。 上面我谈到的那个案例，那个小学文凭做到现在外贸企业中层管理的姑娘，她的英语是她的老板手把手教的，她的所有外贸知识是她的老板手把手教的。她把她的工作能力献给她的老板，她创造价值的能力回馈给她的企业，因为感恩。 听歌的人最无情，不要做无情的人。 去感恩所有帮助过你的人，去感恩所有宽厚的人，哪怕一句谢谢。 希望能帮助到题主，能从我的回答里整理出一些对那个姑娘有用的东西。 2014.10.20更新 @Botton Alain 同我私信，对于擦桌子提供了一个新的角度思考。 以下是他的思考角度： 假设你认为的这个经营对象是餐厅。 企业可以分为创业初期，初具规模，和已形成品牌效应三个阶段。 你所说的情况，只建立在初具规模，涉及陈本合算时减低成本所要做的。 而创业初期，考虑的是生存，这时候擦桌子就要快。 形成品牌效应以后，考虑的维持口碑，强化优势。这是候就需要不惜资本的维持形象。 我用例子谈一谈。 黄焖鸡，一个很具有中国特色的小餐馆。开遍了全国，维持它大范围传播的是他的鸡肉有特色好吃。所有一切，就为这个鸡肉有特色好吃让步。包括擦桌子，这意味着只要你迅速提供位置，这时候干净度是可以被牺牲掉的。所以大部分时候，黄焖鸡的员工们为了追求效率，只用桌上粗糙的餐巾纸擦桌子。拿起来快，不用清洗，假如顾客觉得不干净，他们也会效仿着拿起餐巾纸擦。你看这就和你要考虑的桌子材料，还有毛巾质地，还有清洁剂一点关系都没有。 在说一例，国内的必胜客。窗明几净，他们为了保证干净，每张桌子擦的次数，标准是三次，用的是高效清洁剂。你觉得一张桌子真的需要擦这么多次才能干净吗？他们其实在用标准维持国人心目中，这是一个西餐厅，我来这儿吃是有身份地位的印象。 美国就完全不一样了，追求就是效率，不擦桌子也是常事。 总而言之，我的意思是作为商品，你擦桌子也是服务的一种，要符合这家餐厅的定位。不符合，投入再多也没用，讲究再细也没用。 2014.11.17更新 很早之前写的了，突然被挖出来很不好意思，默默把排版重新做了下。 我说的都是错的，但如果这些错的东西能给您一点对的启示，我就很开心了。 p.s. 请你们别纠结擦桌子那个问题了，只是举了一个不恰当的例子，用以说明思维层面的不同，不会擦一个桌子也不能代表什么。 -\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;end**-\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;**\n","permalink":"https://blog-foamzou-com.pages.dev/posts/expanded-your-horizons/","summary":"\u003cp\u003e本文by\u003ca href=\"http://www.zhihu.com/people/e6kq\"\u003e藥師\u003c/a\u003e,  原问题：\u003ca href=\"http://www.zhihu.com/question/25544344\"\u003e点击这里\u003c/a\u003e 对于不同社会阶层的流动，我一直有悲观的看法，认为目前国内的状况，社会趋于成熟，阶层之间的流动越来越少。 题主私信邀请我来回答这一问题，我很愧疚，因为我觉得我回答不好，所以告诉题主，我在午睡。但是题主回复我说“不扰了，谢谢。” 因为这句谢谢，突然心有所动，决定爬起来来回答，后面我会说为什么因为这句谢谢我来写我的回答。 想直接看具体实施方式的，请直奔第三个段落，不要去阅读第一、二个段落，第一段落基本是我的碎碎念，第二个段落只是一个引例。 \u003cstrong\u003e一、写歌的人假正经，听歌的人最无情。\u003c/strong\u003e 阅读前请先记得陈升说的这句话，**写歌的人假正经，听歌的人最无情。**对于知乎上大量热门回复，点赞过K的，我的观察是，这些回复并不是最有道理，对读者最有意义的回复，却经常是能挑动读者情绪的回复，因为情绪，所以认同，所以高票。 我在知乎陆续答了一个月的题，尝试了不同的书写方式，最后往往是我觉得写出了有一定专业度真知灼见的东西不为人所认同，自己胡扯的很多东西被赞爆。我读了不少自己能接触到行业内的回答，一些高票答案基本是在信誓旦旦的胡扯，却获满堂彩（一些基本的常识已经错了，难以相信是行业内的高手写的）；我也读过一些真正高手的回答，令我心悦诚服，令我虚心向学，但却只获得寥寥无几的赞同票，他们自身也在知乎变得默默无闻。 这是很悲哀的事情，说明绝大多数人并没有独立思考，辨别真伪的能力，这是古斯塔夫·勒庞《乌合之众》一书中描绘现象的体现，这是羊群效应、马太效应的具体显现。知乎不过是这个现实社会的缩影。单单比较知乎同quora很多同样问题下的不同回答，既可知对于国人基本独立思考能力的培育，任重而道远。 \u003ca href=\"http://jandan.net/2014/10/01/be-an-average.html\"\u003eQuora精选：我身边的同事都很优秀，我该怎么办？\u003c/a\u003e \u003ca href=\"http://jandan.net/2014/10/01/many-geniuses.html\"\u003eQuora精选：为什么很多人都以为自己是天才？\u003c/a\u003e 可自行对比知乎类似问题。看看同样的问题下，老外的思路同国人思路的不同；看看同样的问题下，高票答案的思路高低差多少。 说这些无非是想告诉题主，不要去轻易相信任一答案，用自己的思考去证明答案，用自己的生活去验证答案，而不是简单的看了我的答案、别人的答案，觉得谁说的对，点个赞那么简单。 你点的不是赞，而是认同，“我”写的不是对，而只是“我”为给我点赞的人说了他们想说的话，所以他们认同。 当你读了答案，彻底认同一个人的观点是，只说明了两件事。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e你被洗脑了。\u003c/li\u003e\n\u003cli\u003e这个人的观点对你来说毫无用处，因为你完全认同，所以你并未学习到任何新的思维。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e希望阅读答案的人，阅读答案的同时，都能好好思考下，这条答案是否是作者的真知灼见，或者，只为了拿高票而作的迎合读者情绪、思维的回答，假正经回答。 最重要的，一个答案，\u003cstrong\u003e是否真的对你有用，值得你去学习、实践\u003c/strong\u003e。 \u003cstrong\u003e二、不同社会阶层的人思维上的差异是低阶层人群上行的主要阻力。\u003c/strong\u003e 擦桌子有多少种方法？ 花3分钟思考下这个问题再往下看。 曾经一位损友用这个问题，证明了我的思维力不足，没有掌控大项目的能力，操控大公司的能力。 当你擦一个桌子时，要考虑桌子的质地——塑料、金属、木质、木质是实木还是贴皮。 观察桌子上本身的污物——灰尘、油尘还是积水。 而后要考虑的是针对不同桌子的材质所需求的擦桌布质地——丝质、纯棉、麻、棉麻或化纤质地。 擦桌布是干是湿，沾水的话，沾多少，使用清洁剂嘛，用什么清洁剂。 以上我说的这些，有区别吗？ 有很大的区别。这是一个餐厅里老板、大厅主管或清洁工思维上的区别。 一个清洁工会简单的随手找块布\u0026quot;擦干净\u0026quot;桌子，一个主管会略微考虑下具体情况再决定用什么擦桌布去擦什么桌子。而老板却会通过观察得出结论，哪个人是值得托付可以把事情交给他的。 这就是简单的，位处于不同思维层次的人会思考的问题。而这些问题不是说我告诉你，你听了，就能立刻改变你的思维。 思维难以改变，除非你所处的社会阶层、生活环境发生了改变，我说了，你只是听了，但你遇到类似的情况，还是不会。 这次是桌子的问题，下次可能是扫地，处于不同社会阶层的人拥有的不同思维，决定了人们看待这个世界的方方面面都会得出截然不同的答案，哪怕只是擦桌子这么小的一件事。 我只是想通过引例来证明，不同阶层人群思维互相理解上的无力化，\u003cstrong\u003e处于低阶层的人，真的非常难以理解比自己社会阶层高的人思维，这是低阶层人被困住无法上行的主要因素。\u003c/strong\u003e 回到题主工厂的案例也是一样的，在工厂里工作，但是小姑娘可以花时间弄清楚每个人的职能，观察每个人每天在做什么，思考管理人员每天想什么，工厂的老板每天想什么。 如果这个小姑娘能理清所有人的职能、思路、做事手段时，她就有了做这个工厂厂长的能力。 回到小姑娘自己的工作，只是做一道简单的工序，可能简单如擦桌子，但如何能比别人做得更快，更好。能否改进这道工序。当作出改变时，也是自我提升的时候。 好了，引例说完了。说针对题主设定环境的具体回答。 \u003cstrong\u003e三、针对题目的具体回答，位处社会底层的人能做的事。\u003c/strong\u003e **1、**有哪些重要的道理现在就需要认识？ 没有什么重要的道理需要现在就认识，\u003cstrong\u003e你需要有的只是更宽广的世界观，去接纳不同的观点\u003c/strong\u003e，这个世界上没有绝对的真理，处于不同位阶的人理解世界有不同的观点，这种观点无对错之分，所有人形成的所有观点不过是适于自己在自己所处环境生存的观点，观点的形成得益于其自身所处环境，形成后回馈于他们自己的生活。 不要轻易去否定哪些观点，地主们的丛林法则可能在商业世界里比年轻精英们的MBA学历更适用，土法造钢未必不行。 而自己需要的是去观察他人做事的手段、思考的思路，一切总结不过是对复杂事物的简化，当你真正明白一个道理，是很难对他人言传身教的。这也就意味着哪怕是鸡汤的存在，也有它的道理，成功人士会给鸡汤点赞，也可能是鸡汤里的某一句触动了成功人士内心里对于成功的简要总结。 但只是简要总结而已，这句总结你学会了对你的生活毫无意义，你只是知道了一个证明的结果，却不知整道题如何证明，你得到一个正确的结论却无法用在你生命里的任何一处，除非，有天你自己亲身验证了这个道理。 \u003cstrong\u003e打开你的思维，去接纳一切，去学习，去分辨。\u003c/strong\u003e \u003cstrong\u003e最后决定一个人所在社会阶层的往往是他的思维，而不是财富。\u003c/strong\u003e 2、有哪些事情可以去尝试？ 不要给自己设限，黄赌毒不要碰，法律上允许的事（我可没说道德上），都可以去尝试。 所有事，你都可以去试。 年轻意味着你是个不着边际的多边形，不去不停的试错，你不会知道自己的形状，自己的容器到底有多大。 \u003cstrong\u003e希望你不要花太多时间弄清楚自己到底是个什么玩意，也少花点时间在人生的困惑上，多去做做事情，读读书。\u003c/strong\u003e \u003cstrong\u003e虽然到目前为止，我还没弄清楚自己是个什么玩意，也经常困惑不已。\u003c/strong\u003e 3、有哪些通俗又精辟的书籍推荐？ **如果一本书是通俗的，它往往很难是精辟的。**题主的问题其实我并不喜欢，从问题中透露出一种速成的要求，这和知乎自身的存在很像，很多看似精辟的回答，精简化的知识并不会给一个人带来任何实际的能力提升，但知乎的自我定位很准，让你看到一个更大的世界——但不意味着你能进入这个更大的世界。 别人的世界终究是别人的世界，你只能看到，要踏入，非自己踏一步不成。 所有读书人都有着自己的思维构架，我经常用树来举例，最开始是根，而后枝叶，当你自己的一棵树形成后，其实往往无法理解他人的“树”，他人能给你推荐的，对你有效用的书籍往往少之又少。不妨自己去试错，不停地推翻自己。 读错了书没关系，但要带着怀疑的观点看待任何一本书，这次读错了，至少下次你知道怎么选一本对的书。这不是绕弯路，试图直线最短距离前进的人往往得到的结果更糟糕。 具体如何选书、买书读，可以参考我的这篇文。这是我对某个我的知乎答案的整理。 \u003ca href=\"http://mp.weixin.qq.com/s?__biz=MzAxMzAyMTk1NA==\u0026amp;mid=200664612\u0026amp;idx=1\u0026amp;sn=3e14c1f87c8221f2a1a40412ec9124a0#rd\"\u003e你有药吗丨咱家买书时，那都是锣鼓喧天、鞭炮齐鸣、红旗招展、人山人海的。\u003c/a\u003e 但更大的建议是，当你遇到困惑时，当你觉得你需要学点什么的时候，再去找，去读。 4.勇气、性格 关于自我性格的塑造，勇气这些东西。不要指望任何人去帮助你，拉你出你自己的小世界。 除非你下了决心改变自己，否则谈勇气这些东西都是毫无意义。 \u003cstrong\u003e综上，知识，学历，阅历，怎么读书，读什么书，都不是最重要的，最重要的是自己思维方式的改变。\u003c/strong\u003e \u003cstrong\u003e思维方式改变后，其他一切只是顺水推舟。\u003c/strong\u003e \u003cstrong\u003e但思维的改变，却是最难的。\u003c/strong\u003e 我不知道怎么对一个18岁的厂妹解释这些，所以我说我回答不好，这不是一个好答案。 \u003cstrong\u003e四、其他能给出的建议\u003c/strong\u003e \u003cstrong\u003e1. 大多数免费的信息获取渠道，往往也意味着无价值。\u003c/strong\u003e 我说的这种信息获取渠道，包括互联网，包括知乎——往往难以获得真正真实有效的信息。“你”认为你获得的有效的知识，往往是因为“你”自身缺乏对知识的辨别能力。 这种知识往往只能成为你茶余饭后闲聊的资本，对你的人生规划、职场规划，对你真实的能力提高，毫无意义。 写歌的人假正经，少看点我这种二道贩子（在我看来目前互联网乃至传统传媒出产的大量“作家”，都是二道贩子）写的东西，多读读先哲们写的东西，在不知道阅读什么的时候，所有的经典都可以翻出来读。 \u003ca href=\"http://mp.weixin.qq.com/s?__biz=MzAxMzAyMTk1NA==\u0026amp;mid=200677811\u0026amp;idx=1\u0026amp;sn=b38944a35e11509a9c63b4af257812ff#rd\"\u003e你不是书读得少，你是经典读得少\u003c/a\u003e\u003c/p\u003e","title":"扩大自己的视野"},{"content":"读完全书，就两个字，执念。 不用说什么谢谢，这是应该的。这世间，没有什么不需要付出代价，那些萝卜，是你见我的代价。而你想从我这里知道的，无论是真相还是消息，代价的大小由其价值来决定。你已经付了报酬，我给你解答，可还公平？ 我又不是算命的，未来在你自己手中，我也并不是像江湖传言的那样无所不能。我可以知道历朝历代发生的几乎所有事，还有无数被岁月风尘掩埋的真相，可是，永远把握不了人心。 花千骨没办法想象自己若是当了道士还得去降妖除魔什么的，她只求有个小屋能夜夜睡个安稳觉，没有小鬼来烦她就已经很好了。可能是没什么出息，可是她就这么简单的愿望。 我才不管这些，我要天下皆在我手，还怕逆不了这小小乾坤！ 说着拿下佩剑递给她：“我看你跟这剑颇有缘分，就赠给你吧。” 骨头，我知道你心中的执着和坚持，也知道哪个环境才真正适合你的成长。但是我希望我有一天不要为了让你去长留山这个决定而后悔。 感情这种事，对你也好对他人也好，只能是负累。你需要做到心中只有大爱，没有私情。这对剑也好，对人也好，都万万不可有执念。我赠你断念，一是因为它比较能帮到你，二是提醒你要时刻记着绝情断念。 她，从今日起，便是我长留上仙白子画的徒弟。 我白子画此生只收一个徒儿。 不过，结果既已注定，其他的都不重要。妖神，是一定要出世的，但是小不点，是谁都不能碰的！ 小骨，你记住，人有多大的能力，便要负起多大的责任。如果仅随心所欲做自己想做的事，而逃避应有的责任，那便是罪孽。想要抛开一切，自由的活着，并不是一件那么容易的事情。更何况，师傅我，虽然不喜欢这些事情，却也没有什么事情是喜欢的。所以，不管以怎样一种方式活着，对于师傅来说，都是无关紧要的。 你不知道，这个世上，我最怕鬼和师傅了！ 你别看我师傅他平时总是冷冰冰的，不苟言笑，其实他是很温柔的，对我可好了。 她不知道他听到她从未吹过的哨音一声更比一声急促而尖锐的响起，划破他的耳膜，声声催命。他是如何疯了一般，御剑御风都不够快的急召唤了火凤，从魔界拼了命的往这里赶来的么？是不是只要他再晚一点，就再也看不见她了？ 谁在弹琴，是子画来了么 子画……子画他竟然收了弟子了么？ 子画……他，他竟有向你提起过我么？ “子画他，也会夸人么？”紫薰浅夏捏住月饼呆呆的看着，好像那个是白子画的脸。 我若杀了你，哪怕以你师傅的为人，说不定也是会来找我算账的，或许，我便可以见着他了。 \u0026ldquo;是啊，也对，无心无情的白子画，又怎么会插手他人的命运呢？”紫薰浅夏幽幽说道 姐姐，姐姐拿，拿东西跟你换这个香囊好不好？你要什么都可以！《调香秘录》好不好？对了，你已经很厉害了，不需要这些了。那，那姐姐的剑谱或者百年功力好不好？不然，对了，大家不是都想要神器么？姐姐有浮沉珠，虽然刚拿到手没多久，还没来得及解开封印，姐姐拿浮沉珠跟你换香囊好不好！ “好好好……千古之事，我怎么会不帮忙。别说打倒小小一只妖怪，就是刀山火海我也去啊，你忘了朗哥哥老本行是干吗的啦，哈哈哈……”轩辕朗摩拳擦掌的把两个袖子一卷，双眼冒光，又恢复到当初那个山野少年的模样。 却见紫薰浅夏以那样观世音一般大慈大悲，怜悯众生的眼神，同情地俯视着她。“千骨，赶快忘掉他，千万不能陷进去，像他那样高高在上的仙，岂是我们这些又傻又卑微的女子可以恋慕的？你若是能……依旧乖乖做他上慈下孝的好徒儿，你便是世上最快乐之人，否则……你的下场，只能比姐姐还要惨上千倍万倍……” 白子画面上宠溺的微笑一闪而逝，可惜花千骨正慌忙地挣扎爬动，生怕嘴巴跟冰面冻住了。错过了她殷切企盼了整整六年的笑容。 漫漫风雪中，花千骨就这样牵着白子画的手，走完了她人生中最后一段甜蜜的路程。 没有人，可以一辈子做个孩子。 白子画看她多年未变的容颜，突然很想知道小骨长大了之后是什么样子，可惜自己再也没机会见到了。 你欠异朽阁的太多，不是那么容易就还得清，我只求你好好待我们阁主。他这一生够苦的了，不要再让他难过…… 我一开始始终不明白自己活着的意义，又为什么要去长留山，后来遇见你，后来你说你要收集神器为尊上解毒。那一刻我终于懂了，原来从千年前就已注定，我的存在，只是为了给你一个成全。 妖神是由你和众神合力封印，女娲石是因你而碎，合着你的血肉化做千万片去修补滋养这片大地。花千骨，你是这世上，最后一个神啊…… 东方彧卿长长地叹一口气，望着上空。他痛恨自己的身份，更痛恨自己知道再多，却永远只能当一个旁观者的无可奈何 “她是我的，我告诉你白子画，你若敢为你门中弟子伤她一分，我便屠你满门，你若敢为天下人损她一毫，我便杀尽天下人！” “我的弟子，我说不逐就不逐。”白子画冷道 “师父，求你，不要……至少不要用断念……” 骨头，或许他为你所舍弃，所背叛，所付出的，远比你的还要多…… 我们一起想办法回去吧，蓝雨澜风她一直在等你。 双臂慢慢张开，一个世间最温柔的声音说道。“骨头，我来接你回家……” 无数情念想道，最后只化作那么简单的一句——骨头，我来接你回家…… 白子画，这世上没有什么事是我东方彧卿插手不了知道不了的，你以为小小的蛮荒，能难得住我几时？我非要将骨头从蛮荒带出来，让你知道！什么叫做命！ 忆及昨夜他虚弱的咳嗽声，梦回竟迷迷糊糊想喝桃花羹，花千骨心痛地蜷缩成一团。自己在蛮荒就算再苦，又如何比得上他为自己受的苦？ 原来师父才是最苦的人，自己虽没说为什么偷盗神器，他定也猜出来了。一面要顾着六界一面要顾着她，一面怜惜着她一面怜惜着世人。虽重责在身，可是自己宁愿成为千古罪人，也不愿意白白牺牲了她 心头一阵酸楚，望着白子画漆黑如墨的长发，一片茫然。师父，如今，又是谁为你束的发？ 幽若连忙一脸兴奋激动地接口道：“爹爹，你别生气，这是我自己的意思！是我求了尊上好久，非要拜入他门下，做花姐姐的徒弟的！” 白子画飞身落于院中，看着落满白雪的桃花树，花千骨小小的脸不由浮现在脑海中…… ——师父，师父，小骨什么时候才可以像十一师兄一样收徒弟呢？ ——为什么会突然想要收徒弟？ ——那么大的绝情殿上只有我们两个人，好冷清啊。我想多个人陪我玩，被我欺负，又不想要师弟师妹，那当然是自己收个徒弟最好啦！师父你看小骨我这么乖这么听师父的话，小骨要是收个徒弟来玩，一定也很有趣吧。 …… 尊上你放心你放心，我记得你的吩咐，半点都没有弄乱，也没有移动过师父房间里的东西哦！她的衣裳我也没有试穿过，书我没有翻阅过，发饰也没有偷戴过……还、还有啊，我每天都很勤快地打扫来着……” 小骨，这个孩子这么像你，为师自作主张帮你收她入门。不知你是欢喜还是会生师父的气…… “没关系，你想怎么叫就怎么叫。不过你心里面要记住，我不光是疼你的杀姐姐。”也是想要守护你的男人，杀阡陌在心里补充道。 他以前以为子画只是一时护短偏私，却没想到他竟宁愿愧对天下人也不愿愧对她一个。 轻水慢慢闭上眼睛，知道轩辕朗是喜欢自己的。只是他这世先遇上的人、先爱上的人是千骨。以为可以随着时间，用的真心去融化他心里对千骨淡淡的初恋的青涩情愫，也相信总有个男子会爱上。可是，时间来不及…… 宿命如何？就算是妖神，也是我白子画的徒弟。只要我当她师父一天，对她，还有对她所作的一切，都会负起责任。” 花千骨淡淡摇头：“朗哥哥，你喜欢的人不是我，那么多年我们在一起相处的时间不多，彼此之间也并不了解。刹那的心动不是爱，你只是被年少时青涩的感觉所迷惑，以致再看不见其他。我们俩都是执念很重的人，而你一贯争强好胜，习惯了坚持。我对你而言与其说是心爱之人不如说是一种信念和符号。朗哥哥，与其罔顾身边触手可得的幸福和真爱，而继续固执的坚守一个年少时的虚无假象、梦幻泡影，不如冷静下来，好好想想自己一直想要的究竟是什么。” 情不知所起，一往而深。很多事他想问，因为再不问就来不急了。带着千年记忆轮回，他早已学会了不去执着，行事只是随着自己本心，所以，没有多少的悲苦。他可以知道所有事，可是爱上她是个迷，连他自己都不知道为什么。可是世界上不是每一件事，他都必须要知道答案的。就这样永远不知道，永远有一丝想念和希冀也未尝不可。 竹染在一旁看着听着，见杀阡陌执念竟深至此，心头不由一阵怆然，终于慢慢开口说道：“琉夏临死前说，她对不起你，还有，希望你下辈子别再长得比她还漂亮，她配你不起。” 傻瓜，你以为我爱的是琉夏，一直把你当成她么？你跟她对我同样重要，可是我对你有一点却是不同的。知道她喜欢竹染我会生气，可是看见你和别的男子在一起，我却是会吃醋啊。 东方彧卿用尽全力将她抱在怀里，周身布满结界，同时飞快的用手捂住她的眼睛。“骨头，不要看！” 能够想见东方彧卿死状之残忍，他连到最后一刻都还不忘捂住的眼，不忘对她说——不要看。 那是他能做到的对她最后的呵护和温柔。 一直想看骨头长大后是什么模样，可惜我再也等不到了……”东方彧卿温柔一笑，犹如清风拂过草原，然后慢慢消失得无影无踪。 却只听白子画缓言道：“东方彧卿向来世借了五年寿，来换取今生多陪你一年。下场……是不得好死。” 竹染见状，这才醒悟，原来哼唧兽竟不是原本就生活在蛮荒，而是白子画特意送进去的，为的是照顾和保护花千骨。所以才会无缘故的突然出现在她身边，为她引路，替她觅食。 只是千骨她，或许永远也不知道了罢…… 断念已残，宫铃已毁，从今往后，我与你师徒恩断义绝！ 白子画慢慢闭上眼睛，他整整在长留海底守了她十六年，她被囚禁，他就陪着她一起被囚禁。说不清是为了赎罪还是为了什么，只是每天远远的看着她，他以为这样就是永生永世。可是如今，一切再也回不了头了…… 姐姐你好好睡，你不是最喜欢睡觉的了么，就当做了一个长长的梦，梦里的我还是那个什么都不懂的孩子。我保证一定会让你醒过来，就在我死的那一天…… 最让人幸福的一种力量，是遗忘。 白子画，我以神的名义诅咒你，今生今世，永生永世，不老不死，不伤不灭！” 早猜到会有这一天，知道没办法避免，所以一直在想怎样才能挽回，才能救她，可是能力有限，哪怕集尽六界之法，我这一命，也只能换回她的一魄。白子画，这是最后的机会，希望这一次你能够珍惜，不要再等到失去了才来后悔…… 六界的人都知道，当初高高在上的长留上仙，如今只是一个疯子，法力高强之外还不会受任何伤害，没有人打得过他，所以只能躲着他。他满世界乱转，整整三十年，只为了找杀阡陌要回花千骨的最后一缕魂魄。时常发狂失控，随便拉住一个人便问杀阡陌在哪，他的小骨在哪？ 先找个地方安定下来，好好照顾她。上辈子我为了天下为了自己肩头的责任，可以付出一切，可是，在拔出轩辕剑的那一刻，白子画就已经死了，今生，我只为她而活。” 他其实也好想见见花千骨，有太多话想要问她。许多事，他总感觉身边的人在瞒着他。例如他为什么会失忆，为什么会莫名其妙在屋子里养一堆蚕宝宝和五颜六色的毛毛虫…… 这便是你长大的模样么？骨头，叫我怎么认得出来。 世上最可悲的事是当过去深爱你的那个人成为你的一切之时，你却对她不再重要了。 这世上，最不可赌、最容易输的，就是感情了\n","permalink":"https://blog-foamzou-com.pages.dev/posts/huaqiangu/","summary":"\u003cp\u003e读完全书，就两个字，执念。 不用说什么谢谢，这是应该的。这世间，没有什么不需要付出代价，那些萝卜，是你见我的代价。而你想从我这里知道的，无论是真相还是消息，代价的大小由其价值来决定。你已经付了报酬，我给你解答，可还公平？ 我又不是算命的，未来在你自己手中，我也并不是像江湖传言的那样无所不能。我可以知道历朝历代发生的几乎所有事，还有无数被岁月风尘掩埋的真相，可是，永远把握不了人心。 花千骨没办法想象自己若是当了道士还得去降妖除魔什么的，她只求有个小屋能夜夜睡个安稳觉，没有小鬼来烦她就已经很好了。可能是没什么出息，可是她就这么简单的愿望。 我才不管这些，我要天下皆在我手，还怕逆不了这小小乾坤！ 说着拿下佩剑递给她：“我看你跟这剑颇有缘分，就赠给你吧。” 骨头，我知道你心中的执着和坚持，也知道哪个环境才真正适合你的成长。但是我希望我有一天不要为了让你去长留山这个决定而后悔。 感情这种事，对你也好对他人也好，只能是负累。你需要做到心中只有大爱，没有私情。这对剑也好，对人也好，都万万不可有执念。我赠你断念，一是因为它比较能帮到你，二是提醒你要时刻记着绝情断念。 她，从今日起，便是我长留上仙白子画的徒弟。 我白子画此生只收一个徒儿。 不过，结果既已注定，其他的都不重要。妖神，是一定要出世的，但是小不点，是谁都不能碰的！ 小骨，你记住，人有多大的能力，便要负起多大的责任。如果仅随心所欲做自己想做的事，而逃避应有的责任，那便是罪孽。想要抛开一切，自由的活着，并不是一件那么容易的事情。更何况，师傅我，虽然不喜欢这些事情，却也没有什么事情是喜欢的。所以，不管以怎样一种方式活着，对于师傅来说，都是无关紧要的。 你不知道，这个世上，我最怕鬼和师傅了！ 你别看我师傅他平时总是冷冰冰的，不苟言笑，其实他是很温柔的，对我可好了。 她不知道他听到她从未吹过的哨音一声更比一声急促而尖锐的响起，划破他的耳膜，声声催命。他是如何疯了一般，御剑御风都不够快的急召唤了火凤，从魔界拼了命的往这里赶来的么？是不是只要他再晚一点，就再也看不见她了？ 谁在弹琴，是子画来了么 子画……子画他竟然收了弟子了么？ 子画……他，他竟有向你提起过我么？ “子画他，也会夸人么？”紫薰浅夏捏住月饼呆呆的看着，好像那个是白子画的脸。 我若杀了你，哪怕以你师傅的为人，说不定也是会来找我算账的，或许，我便可以见着他了。 \u0026ldquo;是啊，也对，无心无情的白子画，又怎么会插手他人的命运呢？”紫薰浅夏幽幽说道 姐姐，姐姐拿，拿东西跟你换这个香囊好不好？你要什么都可以！《调香秘录》好不好？对了，你已经很厉害了，不需要这些了。那，那姐姐的剑谱或者百年功力好不好？不然，对了，大家不是都想要神器么？姐姐有浮沉珠，虽然刚拿到手没多久，还没来得及解开封印，姐姐拿浮沉珠跟你换香囊好不好！ “好好好……千古之事，我怎么会不帮忙。别说打倒小小一只妖怪，就是刀山火海我也去啊，你忘了朗哥哥老本行是干吗的啦，哈哈哈……”轩辕朗摩拳擦掌的把两个袖子一卷，双眼冒光，又恢复到当初那个山野少年的模样。 却见紫薰浅夏以那样观世音一般大慈大悲，怜悯众生的眼神，同情地俯视着她。“千骨，赶快忘掉他，千万不能陷进去，像他那样高高在上的仙，岂是我们这些又傻又卑微的女子可以恋慕的？你若是能……依旧乖乖做他上慈下孝的好徒儿，你便是世上最快乐之人，否则……你的下场，只能比姐姐还要惨上千倍万倍……” 白子画面上宠溺的微笑一闪而逝，可惜花千骨正慌忙地挣扎爬动，生怕嘴巴跟冰面冻住了。错过了她殷切企盼了整整六年的笑容。 漫漫风雪中，花千骨就这样牵着白子画的手，走完了她人生中最后一段甜蜜的路程。 没有人，可以一辈子做个孩子。 白子画看她多年未变的容颜，突然很想知道小骨长大了之后是什么样子，可惜自己再也没机会见到了。 你欠异朽阁的太多，不是那么容易就还得清，我只求你好好待我们阁主。他这一生够苦的了，不要再让他难过…… 我一开始始终不明白自己活着的意义，又为什么要去长留山，后来遇见你，后来你说你要收集神器为尊上解毒。那一刻我终于懂了，原来从千年前就已注定，我的存在，只是为了给你一个成全。 妖神是由你和众神合力封印，女娲石是因你而碎，合着你的血肉化做千万片去修补滋养这片大地。花千骨，你是这世上，最后一个神啊…… 东方彧卿长长地叹一口气，望着上空。他痛恨自己的身份，更痛恨自己知道再多，却永远只能当一个旁观者的无可奈何 “她是我的，我告诉你白子画，你若敢为你门中弟子伤她一分，我便屠你满门，你若敢为天下人损她一毫，我便杀尽天下人！” “我的弟子，我说不逐就不逐。”白子画冷道 “师父，求你，不要……至少不要用断念……” 骨头，或许他为你所舍弃，所背叛，所付出的，远比你的还要多…… 我们一起想办法回去吧，蓝雨澜风她一直在等你。 双臂慢慢张开，一个世间最温柔的声音说道。“骨头，我来接你回家……” 无数情念想道，最后只化作那么简单的一句——骨头，我来接你回家…… 白子画，这世上没有什么事是我东方彧卿插手不了知道不了的，你以为小小的蛮荒，能难得住我几时？我非要将骨头从蛮荒带出来，让你知道！什么叫做命！ 忆及昨夜他虚弱的咳嗽声，梦回竟迷迷糊糊想喝桃花羹，花千骨心痛地蜷缩成一团。自己在蛮荒就算再苦，又如何比得上他为自己受的苦？ 原来师父才是最苦的人，自己虽没说为什么偷盗神器，他定也猜出来了。一面要顾着六界一面要顾着她，一面怜惜着她一面怜惜着世人。虽重责在身，可是自己宁愿成为千古罪人，也不愿意白白牺牲了她 心头一阵酸楚，望着白子画漆黑如墨的长发，一片茫然。师父，如今，又是谁为你束的发？ 幽若连忙一脸兴奋激动地接口道：“爹爹，你别生气，这是我自己的意思！是我求了尊上好久，非要拜入他门下，做花姐姐的徒弟的！” 白子画飞身落于院中，看着落满白雪的桃花树，花千骨小小的脸不由浮现在脑海中…… 　　——师父，师父，小骨什么时候才可以像十一师兄一样收徒弟呢？ 　　——为什么会突然想要收徒弟？ 　　——那么大的绝情殿上只有我们两个人，好冷清啊。我想多个人陪我玩，被我欺负，又不想要师弟师妹，那当然是自己收个徒弟最好啦！师父你看小骨我这么乖这么听师父的话，小骨要是收个徒弟来玩，一定也很有趣吧。 　　…… 尊上你放心你放心，我记得你的吩咐，半点都没有弄乱，也没有移动过师父房间里的东西哦！她的衣裳我也没有试穿过，书我没有翻阅过，发饰也没有偷戴过……还、还有啊，我每天都很勤快地打扫来着……” 小骨，这个孩子这么像你，为师自作主张帮你收她入门。不知你是欢喜还是会生师父的气…… “没关系，你想怎么叫就怎么叫。不过你心里面要记住，我不光是疼你的杀姐姐。”也是想要守护你的男人，杀阡陌在心里补充道。 他以前以为子画只是一时护短偏私，却没想到他竟宁愿愧对天下人也不愿愧对她一个。 轻水慢慢闭上眼睛，知道轩辕朗是喜欢自己的。只是他这世先遇上的人、先爱上的人是千骨。以为可以随着时间，用的真心去融化他心里对千骨淡淡的初恋的青涩情愫，也相信总有个男子会爱上。可是，时间来不及…… 宿命如何？就算是妖神，也是我白子画的徒弟。只要我当她师父一天，对她，还有对她所作的一切，都会负起责任。” 花千骨淡淡摇头：“朗哥哥，你喜欢的人不是我，那么多年我们在一起相处的时间不多，彼此之间也并不了解。刹那的心动不是爱，你只是被年少时青涩的感觉所迷惑，以致再看不见其他。我们俩都是执念很重的人，而你一贯争强好胜，习惯了坚持。我对你而言与其说是心爱之人不如说是一种信念和符号。朗哥哥，与其罔顾身边触手可得的幸福和真爱，而继续固执的坚守一个年少时的虚无假象、梦幻泡影，不如冷静下来，好好想想自己一直想要的究竟是什么。” 情不知所起，一往而深。很多事他想问，因为再不问就来不急了。带着千年记忆轮回，他早已学会了不去执着，行事只是随着自己本心，所以，没有多少的悲苦。他可以知道所有事，可是爱上她是个迷，连他自己都不知道为什么。可是世界上不是每一件事，他都必须要知道答案的。就这样永远不知道，永远有一丝想念和希冀也未尝不可。 竹染在一旁看着听着，见杀阡陌执念竟深至此，心头不由一阵怆然，终于慢慢开口说道：“琉夏临死前说，她对不起你，还有，希望你下辈子别再长得比她还漂亮，她配你不起。” 傻瓜，你以为我爱的是琉夏，一直把你当成她么？你跟她对我同样重要，可是我对你有一点却是不同的。知道她喜欢竹染我会生气，可是看见你和别的男子在一起，我却是会吃醋啊。 东方彧卿用尽全力将她抱在怀里，周身布满结界，同时飞快的用手捂住她的眼睛。“骨头，不要看！” 能够想见东方彧卿死状之残忍，他连到最后一刻都还不忘捂住的眼，不忘对她说——不要看。 那是他能做到的对她最后的呵护和温柔。 一直想看骨头长大后是什么模样，可惜我再也等不到了……”东方彧卿温柔一笑，犹如清风拂过草原，然后慢慢消失得无影无踪。 却只听白子画缓言道：“东方彧卿向来世借了五年寿，来换取今生多陪你一年。下场……是不得好死。” 竹染见状，这才醒悟，原来哼唧兽竟不是原本就生活在蛮荒，而是白子画特意送进去的，为的是照顾和保护花千骨。所以才会无缘故的突然出现在她身边，为她引路，替她觅食。 只是千骨她，或许永远也不知道了罢…… 断念已残，宫铃已毁，从今往后，我与你师徒恩断义绝！ 白子画慢慢闭上眼睛，他整整在长留海底守了她十六年，她被囚禁，他就陪着她一起被囚禁。说不清是为了赎罪还是为了什么，只是每天远远的看着她，他以为这样就是永生永世。可是如今，一切再也回不了头了…… 姐姐你好好睡，你不是最喜欢睡觉的了么，就当做了一个长长的梦，梦里的我还是那个什么都不懂的孩子。我保证一定会让你醒过来，就在我死的那一天…… 最让人幸福的一种力量，是遗忘。 白子画，我以神的名义诅咒你，今生今世，永生永世，不老不死，不伤不灭！” 早猜到会有这一天，知道没办法避免，所以一直在想怎样才能挽回，才能救她，可是能力有限，哪怕集尽六界之法，我这一命，也只能换回她的一魄。白子画，这是最后的机会，希望这一次你能够珍惜，不要再等到失去了才来后悔…… 六界的人都知道，当初高高在上的长留上仙，如今只是一个疯子，法力高强之外还不会受任何伤害，没有人打得过他，所以只能躲着他。他满世界乱转，整整三十年，只为了找杀阡陌要回花千骨的最后一缕魂魄。时常发狂失控，随便拉住一个人便问杀阡陌在哪，他的小骨在哪？ 先找个地方安定下来，好好照顾她。上辈子我为了天下为了自己肩头的责任，可以付出一切，可是，在拔出轩辕剑的那一刻，白子画就已经死了，今生，我只为她而活。” 他其实也好想见见花千骨，有太多话想要问她。许多事，他总感觉身边的人在瞒着他。例如他为什么会失忆，为什么会莫名其妙在屋子里养一堆蚕宝宝和五颜六色的毛毛虫…… 这便是你长大的模样么？骨头，叫我怎么认得出来。 世上最可悲的事是当过去深爱你的那个人成为你的一切之时，你却对她不再重要了。 这世上，最不可赌、最容易输的，就是感情了\u003c/p\u003e","title":"仙侠奇缘之花千骨"},{"content":"Laravel5.1学习之旅(二) 路由 上一篇：Laravel5.1学习之旅(一) 安装Laravel5.1 访问一个页面，你可以不需要Model、View和Controller，但必然需要路由(Route) 本文示例代码可能会涉及到Controller、Model、View，这些内容将会在下一篇介绍，对于学习本文没有影响\n路由是什么 学过计算机网络的都知道，路由负责将接收到的数据包拆解出目标ip地址等信息，然后根据路由表进行分组转发给下一个目标。 Web框架中的路由也是如此，它将请求中的URL拆解为控制器、方法、参数等信息，然后调用相应的控制器文件来处理业务，最后将带有数据的视图呈现给用户。当然，Laravel显得更为简单粗暴，它直接提供了一个路由表app/Http/route.php，你可以在该文件定制你的路由规则。这样你的路由非常直观且灵活，代价就是当你要添加一个新的请求时必须要在该文件添加一条新的路由规则。\n最简单的路由 废话懒得说，直接上代码：\nRoute::get(\u0026#39;/\u0026#39;,function(){ return \u0026#39;Hello foam\u0026#39;; }); 可以看到，上面的Route::get需要传递两个参数，第一个是URL，第二个是闭包方法。因为是闭包方法，你可以在里面写业务逻辑，这里我们只简单返回一个Hello foam。 在浏览器中输入http://foam.com（网站根目录），页面会打印出Hello foam。\n基础路由 基本路由： \u0026lt;?php //以get方法访问http://foam.com/home时将执行HomeController里的index方法 Route::get(\u0026#39;home\u0026#39;,\u0026#39;HomeController@index\u0026#39;); //除此之外还有post、put、delete等方式。一般用得比较多的是get和post Route::post(\u0026#39;home\u0026#39;,\u0026#39;HomeController@index\u0026#39;); Route::put(\u0026#39;home\u0026#39;,\u0026#39;HomeController@index\u0026#39;); Route::delete(\u0026#39;home\u0026#39;,\u0026#39;HomeController@index\u0026#39;); 带有参数的路由： 很多场景的url都是带有参数的，例如文章详细页http://foam.com/article/9434\nRoute::get(\u0026#39;article/{id}\u0026#39;,\u0026#39;ArticleController@detail\u0026#39;); 如此一来，ArticleController的detail方法便能接收到id参数，具体方法我们下一篇介绍\n路由群组： 路由群组一方面将一组相关路由写在一块，提高了代码可读性；另一方面简化了代码，可利用中间件统一处理相关代码 举个例子，假如我们需要写个后台管理，URL为http://foam.com/backend/***/，命名空间为Admin，且需要使用中间件AdminAuth对后台管理系统的所有请求作权限验证。 没有群组，需要这么写：\nRoute::get(\u0026#39;backend/aaaaa\u0026#39;, [\u0026#39;middleware\u0026#39; =\u0026gt; \u0026#39;AdminAuth\u0026#39;, \u0026#39;Admin\\AaaController@index\u0026#39;]); Route::get(\u0026#39;backend/bbbbb\u0026#39;, [\u0026#39;middleware\u0026#39; =\u0026gt; \u0026#39;AdminAuth\u0026#39;, \u0026#39;Admin\\BbbController@index\u0026#39;]); Route::get(\u0026#39;backend/ccccc\u0026#39;, [\u0026#39;middleware\u0026#39; =\u0026gt; \u0026#39;AdminAuth\u0026#39;, \u0026#39;Admin\\CccController@index\u0026#39;]); 现在让我们的群组重新演绎：\nRoute::group([\u0026#39;prefix\u0026#39;=\u0026gt;\u0026#39;backend\u0026#39;,\u0026#39;namespace\u0026#39;=\u0026gt;\u0026#39;Admin\u0026#39;,\u0026#39;middleware\u0026#39;=\u0026gt;\u0026#39;AdminAuth\u0026#39;],function(){ Route::get(\u0026#39;/aaaaa\u0026#39;,\u0026#39;AaaController@index\u0026#39;); Route::get(\u0026#39;/bbbbb\u0026#39;,\u0026#39;BbbController@index\u0026#39;); Route::get(\u0026#39;/ccccc\u0026#39;,\u0026#39;CccController@index\u0026#39;); }); 群组里prefix是URL前缀，namespace是命名空间，middleware是中间件，这些都是可选的。 群组也是可以嵌套的，当部分页面需要同一个中间件处理时，可以这么做：\nRoute::group([\u0026#39;namespace\u0026#39;=\u0026gt;\u0026#39;Home\u0026#39;],function(){ Route::get(\u0026#39;/\u0026#39;, \u0026#39;PageController@index\u0026#39;); Route::get(\u0026#39;task/{id}\u0026#39;,\u0026#39;TaskController@detail\u0026#39;); Route::group([\u0026#39;middleware\u0026#39;=\u0026gt;\u0026#39;UserAuth\u0026#39;],function(){ Route::get(\u0026#39;myhome\u0026#39;,\u0026#39;MyhomeController@index\u0026#39;); Route::get(\u0026#39;myhome/taskDetail/{id}\u0026#39;,\u0026#39;MyhomeController@taskDetail\u0026#39;); }); }); ","permalink":"https://blog-foamzou-com.pages.dev/posts/learn-laravel5-1-step-two-route/","summary":"\u003ch1 id=\"laravel51学习之旅二-路由\"\u003eLaravel5.1学习之旅(二) 路由\u003c/h1\u003e\n\u003cp\u003e上一篇：\u003ca href=\"/posts/learn-laravel5-1-step-one-install-laravel/\"\u003eLaravel5.1学习之旅(一) 安装Laravel5.1\u003c/a\u003e 访问一个页面，你可以不需要Model、View和Controller，但必然需要路由(Route) 本文示例代码可能会涉及到Controller、Model、View，这些内容将会在下一篇介绍，对于学习本文没有影响\u003c/p\u003e\n\u003ch3 id=\"路由是什么\"\u003e路由是什么\u003c/h3\u003e\n\u003cp\u003e学过计算机网络的都知道，路由负责将接收到的数据包拆解出目标ip地址等信息，然后根据路由表进行分组转发给下一个目标。 Web框架中的路由也是如此，它将请求中的URL拆解为控制器、方法、参数等信息，然后调用相应的控制器文件来处理业务，最后将带有数据的视图呈现给用户。当然，Laravel显得更为简单粗暴，它直接提供了一个路由表\u003ccode\u003eapp/Http/route.php\u003c/code\u003e，你可以在该文件定制你的路由规则。这样你的路由非常直观且灵活，代价就是当你要添加一个新的请求时必须要在该文件添加一条新的路由规则。\u003c/p\u003e\n\u003ch3 id=\"最简单的路由\"\u003e最简单的路由\u003c/h3\u003e\n\u003cp\u003e废话懒得说，直接上代码：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRoute::get(\u0026#39;/\u0026#39;,function(){\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return \u0026#39;Hello foam\u0026#39;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e});\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e可以看到，上面的Route::get需要传递两个参数，第一个是URL，第二个是闭包方法。因为是闭包方法，你可以在里面写业务逻辑，这里我们只简单返回一个Hello foam。 在浏览器中输入\u003ccode\u003ehttp://foam.com\u003c/code\u003e（网站根目录），页面会打印出Hello foam。\u003c/p\u003e\n\u003ch3 id=\"基础路由\"\u003e基础路由\u003c/h3\u003e\n\u003ch5 id=\"基本路由\"\u003e基本路由：\u003c/h5\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"nx\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//以get方法访问http://foam.com/home时将执行HomeController里的index方法\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eRoute\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"na\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;home\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;HomeController@index\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//除此之外还有post、put、delete等方式。一般用得比较多的是get和post\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eRoute\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"na\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;home\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;HomeController@index\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eRoute\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"na\"\u003eput\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;home\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;HomeController@index\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eRoute\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"na\"\u003edelete\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;home\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;HomeController@index\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch5 id=\"带有参数的路由\"\u003e带有参数的路由：\u003c/h5\u003e\n\u003cp\u003e很多场景的url都是带有参数的，例如文章详细页\u003ccode\u003ehttp://foam.com/article/9434\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRoute::get(\u0026#39;article/{id}\u0026#39;,\u0026#39;ArticleController@detail\u0026#39;);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e如此一来，ArticleController的detail方法便能接收到id参数，具体方法我们下一篇介绍\u003c/p\u003e\n\u003ch5 id=\"路由群组\"\u003e路由群组：\u003c/h5\u003e\n\u003cp\u003e路由群组一方面将一组相关路由写在一块，提高了代码可读性；另一方面简化了代码，可利用中间件统一处理相关代码 举个例子，假如我们需要写个后台管理，URL为\u003ccode\u003ehttp://foam.com/backend/***/\u003c/code\u003e，命名空间为\u003ccode\u003eAdmin\u003c/code\u003e，且需要使用中间件\u003ccode\u003eAdminAuth\u003c/code\u003e对后台管理系统的所有请求作权限验证。 没有群组，需要这么写：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRoute::get\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;backend/aaaaa\u0026#39;\u003c/span\u003e, \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;middleware\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\u0026gt; \u003cspan class=\"s1\"\u003e\u0026#39;AdminAuth\u0026#39;\u003c/span\u003e, \u003cspan class=\"s1\"\u003e\u0026#39;Admin\\AaaController@index\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e])\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRoute::get\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;backend/bbbbb\u0026#39;\u003c/span\u003e, \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;middleware\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\u0026gt; \u003cspan class=\"s1\"\u003e\u0026#39;AdminAuth\u0026#39;\u003c/span\u003e, \u003cspan class=\"s1\"\u003e\u0026#39;Admin\\BbbController@index\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e])\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRoute::get\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;backend/ccccc\u0026#39;\u003c/span\u003e, \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;middleware\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\u0026gt; \u003cspan class=\"s1\"\u003e\u0026#39;AdminAuth\u0026#39;\u003c/span\u003e, \u003cspan class=\"s1\"\u003e\u0026#39;Admin\\CccController@index\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e])\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e现在让我们的群组重新演绎：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRoute::group\u003cspan class=\"o\"\u003e([\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;prefix\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u0026gt;\u003cspan class=\"s1\"\u003e\u0026#39;backend\u0026#39;\u003c/span\u003e,\u003cspan class=\"s1\"\u003e\u0026#39;namespace\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u0026gt;\u003cspan class=\"s1\"\u003e\u0026#39;Admin\u0026#39;\u003c/span\u003e,\u003cspan class=\"s1\"\u003e\u0026#39;middleware\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u0026gt;\u003cspan class=\"s1\"\u003e\u0026#39;AdminAuth\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e]\u003c/span\u003e,function\u003cspan class=\"o\"\u003e(){\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Route::get\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;/aaaaa\u0026#39;\u003c/span\u003e,\u003cspan class=\"s1\"\u003e\u0026#39;AaaController@index\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Route::get\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;/bbbbb\u0026#39;\u003c/span\u003e,\u003cspan class=\"s1\"\u003e\u0026#39;BbbController@index\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Route::get\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;/ccccc\u0026#39;\u003c/span\u003e,\u003cspan class=\"s1\"\u003e\u0026#39;CccController@index\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e})\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e群组里prefix是URL前缀，namespace是命名空间，middleware是中间件，这些都是可选的。 群组也是可以嵌套的，当部分页面需要同一个中间件处理时，可以这么做：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRoute::group\u003cspan class=\"o\"\u003e([\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;namespace\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u0026gt;\u003cspan class=\"s1\"\u003e\u0026#39;Home\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e]\u003c/span\u003e,function\u003cspan class=\"o\"\u003e(){\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Route::get\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e, \u003cspan class=\"s1\"\u003e\u0026#39;PageController@index\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Route::get\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;task/{id}\u0026#39;\u003c/span\u003e,\u003cspan class=\"s1\"\u003e\u0026#39;TaskController@detail\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Route::group\u003cspan class=\"o\"\u003e([\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;middleware\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u0026gt;\u003cspan class=\"s1\"\u003e\u0026#39;UserAuth\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e]\u003c/span\u003e,function\u003cspan class=\"o\"\u003e(){\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        Route::get\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;myhome\u0026#39;\u003c/span\u003e,\u003cspan class=\"s1\"\u003e\u0026#39;MyhomeController@index\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        Route::get\u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;myhome/taskDetail/{id}\u0026#39;\u003c/span\u003e,\u003cspan class=\"s1\"\u003e\u0026#39;MyhomeController@taskDetail\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e})\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e})\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"Laravel5.1学习之旅(二) 路由"},{"content":"关于Tokens你需要知道的10件事 ——进一步探讨基于Token认证的一些常见问题 原文链接：Here 原作者：Matias Woloski 几周前我们发表了一篇短文《cookies与tokens在单页应用中的对比》(主要以AngularJs应用为例)。社区里对这个话题很感兴趣，于是我们接着发表了第二篇《在socket.io等实时框架中基于Token的认证》。趁着大家对这个话题还保持着热情，我们决定再写一篇文章进一步探讨基于Token认证的常见问题。我们开始吧~\n1.Tokens需要保存在Local Storage、Session Storage或Cookies中 在Tokens被应用于单页应用的背景下，有人提出了问题：在浏览器中刷新页面时，token会发生什么变化。答案很简单：你需要将token保存在Local Storage、Session Storage或客户端内置的Cookies中，在浏览器不支持Session Storage的情况下，它会被polyfills为cookies。 你或许想问“但如果我将token保存在cookie的话，岂不是很危险”。其实不然，这种情况下，你使用的cookies只是作为存储机制而非验证机制(即是说，web框架不会使用cookie来验证用户，因此不存在XSRF攻击的危险)\n2.Tokens像Cookies一样会过期，但你有更多的控制权 Tokens具有生命周期（在JSON Web Tokens中由exp属性控制），否则用户就可以登录一次却永远无需认证了。Cookies由于相同的原因也具有生命周期。 在Cookies中，如下不同情况生命周期也不一样： 1.当关闭浏览器时，Cookies会被销毁（如Session Cookies） 2.你也可以实现一个服务端检查机制（通常由Web框架帮你完成），你可以设置生命周期或滑动窗口生命周期。 3.Cookies在一段时间内可以是永久的（即使关闭浏览器也不会被销毁） 在Tokens中，一旦过期，你只需要获取一个新的token。你可以写一个端点来更新token： 1.验证旧的token 2.检查用户是否还处于登录状态或者在访问你的网站 3.产生一个重新续时的新token 你甚至可以将token生成的时间写入其中，并在大约两周后强制用户重新登录。\napp.post(\u0026#39;/refresh_token\u0026#39;, function (req, res) { // verify the existing token var profile = jwt.verify(req.body.token, secret); // if more than 14 days old, force login if (profile.original_iat - new Date() \u0026gt; 14) { // iat == issued at return res.send(401); // re-logging } // check if the user still exists or if authorization hasn\u0026#39;t been revoked if (!valid) return res.send(401); // re-logging // issue a new token var refreshed_token = jwt.sign(profile, secret, { expiresInMinutes: 60*5 }); res.json({ token: refreshed_token }); }); 3.Local/Session Storage无法跨域，请使用Cookies作标记 如果你将cookie的作用域名设置为.yourdomain.com，那么它可以在yourdomain.com和app.yourdomain.com中被访问。如果用户在主域登录却被重定向到app.yourdomain.com，要验证cookie也是很方便的。 Tokens存储在local/session storage中，这意味着不同域名之间是无法相互访问的（即使是子域名）。那么你该怎么做呢？ 其中一种做法是，当用户在app.yourdomain.com中验证完毕后，你生成一个token并设置一个作用域名为.yourdomain.com的Cookie标记用户已经登录。\n$.post(\u0026#39;/authenticate, function() { // store token on local/session storage or cookie .... // create a cookie signaling that user is logged in $.cookie(\u0026#39;loggedin\u0026#39;, profile.name, \u0026#39;.yourdomain.com\u0026#39;); }); 然后，你可以在yourdomain.com验证cookie的存在并重定向到app.yourdomain.com。而Token可以在app的子域中使用（如果token依然合法）。 可能会出现cookie存在而token已经被删除的情况。这种情况下，用户必须重新登录。这里需要强调的是，正如我们之前所说，我们并不将cookie当作验证机制，而仅仅把它作为能够跨域保存信息的存储机制。\n4.每个CORS请求都会先发一个预请求 有人指出，Authorization报头并非一个简单的报头，因此在向特定URLs发送请求前都需要发送一个预请求。\nOPTIONS https://api.foo.com/bar GET https://api.foo.com/bar Authorization: Bearer .... OPTIONS https://api.foo.com/bar2 GET https://api.foo.com/bar2 Authorization: Bearer .... GET https://api.foo.com/bar Authorization: Bearer .... 这时你需要发送Content-Type: application/json。 提醒下，OPTIONS请求自身并没有Authorization报头信息，所以你的web框架需要对OPTIONS和后续的请求作一些处理（提示：微软的IIS因为某些原因在这方面存在一些问题）。\n5.当你处理流媒体时，请用token获取签名请求 在使用cookies时，你可以轻易地触发文件下载和一些文本流。然而，在tokens中，是通过XHR来完成请求的，你无法依赖于此。解决的办法就是像AWS那样生成一个签名请求，例如，Hawk Bewits就是一个支持该方法的优秀框架： 请求：\nPOST /download-file/123 Authorization: Bearer... 回应：\nticket=lahdoiasdhoiwdowijaksjdoaisdjoasidja 其中，ticket是无状态的。它通过URL: host + path + query + headers + timestamp + HMAC来生成，并带有过期时间。所以它能在一段时间内(比如5分钟)被用来下载文件。 你会被重定向到/download-file/123?ticket=lahdoiasdhoiwdowijaksjdoaisdjoasidja。服务器将验证ticket是否合法并完成接下来的业务操作。\n6.比起XSRF，处理XSS较为容易 Cookies具有允许设置HttpOnly标记的特性，它可以只允许服务器访问而非JavaScript。这很有用，因为它保护Cookies不被客户端代码注入攻击（XSS）。 由于tokens被存储在local/Session Storage或者客户端内置的Cookie中，这容易遭受XSS攻击并被攻击者获取到token。这是个令人担忧的问题，因此你需要将tokens的生存时间设置得短一点。 Cookies层面上，一种主要的攻击是XSRF。真实情况是，XSRF是最让人忽略的攻击之一。普通的开发者可能甚至不了解这种风险，因此很多应用缺少反XSRF攻击的机制。然而，每个人都知道注入是什么。简单地说，如果你允许在不转义的情况下渲染用户输入的内容，那么你的应用就暴露在XSS攻击之下了。根据我们的经验，防范XSS比XSRF容易。因为并非所有的web框架都内置了反XSRF机制，而在绝大多数支持转义语法的模板引擎中，防范XSS却是容易得多。\n7.每次请求都需要发送token，请注意它的大小 当你每发送一次API请求，都需要将token附加到Authorization头部中发出去。\nGET /foo Authorization: Bearer ...2kb token... 和Cookies的比较\nGET /foo connect.sid: ...20 bytes cookie... token的大小取决于你将多少信息存在里面了，这可能会很大。相比起来，Session Cookies只保存一个标记（connect.sid，PHPSESSID等等），主体内容被保存在服务端（仅有一台服务器就保存在内存，在服务器群中则保存在数据库）。 现在，你完全可以实现一个类似tokens的机制。这个token拥有你需要的基本信息，在服务端中根据每次API的调用，你都可以为token补充更多的信息。Cookies的确也能做到这样，但不同的是tokens有一个好处，你可以完全控制它，毕竟它是你代码的一部分。\nGET /foo Authorization: Bearer ……500 bytes token…. 在服务端中：\napp.use(\u0026#39;/api\u0026#39;, // validate token first expressJwt({secret: secret}), // enrich req.user with more data from db function(req, res, next) { req.user.extra_data = get_from_db(); next(); }); 值得注意的是，你可以完整地将Session保存在Cookie中(而不仅仅是一个标记)。但并不是所有的Web平台都支持这么做，举个例子，在Node.js中，你可以使用mozilla/node-client-sessions。\n8.如果存储敏感信息，请对token加密 Token的签名能够防止信息被篡改，TLS/SSL能够防止中间人攻击。但如果包含了用户的敏感信息（身份证号等），你就需要对它进行加密。JWT(JSON Web Tokens)用JWE(JSON Web Encryption)作为规范，但大多数类库都还没有实现JWE，所以最简单的做法就是像下面那样使用AES-CBC模式进行加密。\napp.post(\u0026#39;/authenticate\u0026#39;, function (req, res) { // validate user // encrypt profile var encrypted = { token: encryptAesSha256(\u0026#39;shhhh\u0026#39;, JSON.stringify(profile)) }; // sing the token var token = jwt.sign(encrypted, secret, { expiresInMinutes: 60*5 }); res.json({ token: token }); } function encryptAesSha256 (password, textToEncrypt) { var cipher = crypto.createCipher(\u0026#39;aes-256-cbc\u0026#39;, password); var crypted = cipher.update(textToEncrypt, \u0026#39;utf8\u0026#39;, \u0026#39;hex\u0026#39;); crypted += cipher.final(\u0026#39;hex\u0026#39;); return crypted; } 当然，你也可以像#7那样，将敏感信息保存在数据库中。\n9.JSON Web Tokens可以在OAuth中使用 Tokens往往和OAuth联系在一起。OAuth2是一种解决身份认证授权的协议。经过用户同意授权访问自己的数据后，认证服务器会返回一个access_token，这样可以使用用户的身份访问对应的APIs。 通常这些tokens是不透明的。他们被称之为bearertokens，并且以随机字符串保存到某种类型的哈希表中，并存储在服务器里(数据库、缓存等)。内容包括过期时间、请求范围(例如访问好友列表)以及授权的用户。然后当API被调用时，token会被发送给服务器，服务器会在哈希表中查找信息并开始验证（比如token是否已过期，是否超出请求范围）。 这种token和我们一直讨论的签名token(如JWT)的主要区别是，后者是无状态的，它们并不需要存储在哈希表中，因此它是一种更轻量级的方法。OAuth2并没有规定access_token的格式，所以你可以返回一个经授权服务器包含的带有“请求范围、权限列表和过期时间”的JWT。\n10.Tokens不是万能的，请仔细考虑授权使用场景 几年前，我们为一家大公司实施开发基于token的架构。这是一个有大量信息需要被保护的拥有超过10万名员工的公司。他们想要实现一个基于“身份验证和授权”的集中式管理组织系统。试想想“用户X可以读取W地区里Z医院的临床试验Y的ID和名称”的应用场景。这种细粒度的授权，你可以想像，不管是在技术还是管理上，都是很难处理的。\nTokens会变得很大 你的apps/APIs会变得很复杂 不管是让谁来授予权限都是很难进行下去的 站在信息架构的角度上，为确保创建合理的作用范围和权限，我们放弃了这个工作。 结论：要抵制把一切东西都转换成tokens的诱惑，在使用这种方式时请务必先做好各种分析。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/ten-things-you-should-know-about-tokens-and-cookies/","summary":"\u003ch1 id=\"关于tokens你需要知道的10件事\"\u003e关于Tokens你需要知道的10件事\u003c/h1\u003e\n\u003ch2 id=\"进一步探讨基于token认证的一些常见问题\"\u003e——进一步探讨基于Token认证的一些常见问题\u003c/h2\u003e\n\u003cp\u003e原文链接：\u003ca href=\"https://auth0.com/blog/2014/01/27/ten-things-you-should-know-about-tokens-and-cookies/\"\u003eHere\u003c/a\u003e 原作者：\u003ca href=\"https://twitter.com/woloski\"\u003eMatias Woloski\u003c/a\u003e 几周前我们发表了一篇短文\u003ca href=\"https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/\"\u003e《cookies与tokens在单页应用中的对比》\u003c/a\u003e(主要以AngularJs应用为例)。社区里对这个话题很感兴趣，于是我们接着发表了第二篇\u003ca href=\"https://auth0.com/blog/2014/01/15/auth-with-socket-io/\"\u003e《在socket.io等实时框架中基于Token的认证》\u003c/a\u003e。趁着大家对这个话题还保持着热情，我们决定再写一篇文章进一步探讨基于Token认证的常见问题。我们开始吧~\u003c/p\u003e\n\u003ch3 id=\"1tokens需要保存在local-storagesession-storage或cookies中\"\u003e1.Tokens需要保存在Local Storage、Session Storage或Cookies中\u003c/h3\u003e\n\u003cp\u003e在Tokens被应用于单页应用的背景下，有人提出了问题：在浏览器中刷新页面时，token会发生什么变化。答案很简单：你需要将token保存在Local Storage、Session Storage或客户端内置的Cookies中，在浏览器不支持Session Storage的情况下，它会被polyfills为cookies。 你或许想问“但如果我将token保存在cookie的话，岂不是很危险”。其实不然，这种情况下，你使用的cookies只是作为存储机制而非验证机制(即是说，web框架不会使用cookie来验证用户，因此不存在XSRF攻击的危险)\u003c/p\u003e\n\u003ch3 id=\"2tokens像cookies一样会过期但你有更多的控制权\"\u003e2.Tokens像Cookies一样会过期，但你有更多的控制权\u003c/h3\u003e\n\u003cp\u003eTokens具有生命周期（在JSON Web Tokens中由\u003ccode\u003eexp\u003c/code\u003e属性控制），否则用户就可以登录一次却永远无需认证了。Cookies由于相同的原因也具有生命周期。 在Cookies中，如下不同情况生命周期也不一样： 1.当关闭浏览器时，Cookies会被销毁（如Session Cookies） 2.你也可以实现一个服务端检查机制（通常由Web框架帮你完成），你可以设置生命周期或滑动窗口生命周期。 3.Cookies在一段时间内可以是永久的（即使关闭浏览器也不会被销毁） 在Tokens中，一旦过期，你只需要获取一个新的token。你可以写一个端点来更新token： 1.验证旧的token 2.检查用户是否还处于登录状态或者在访问你的网站 3.产生一个重新续时的新token 你甚至可以将token生成的时间写入其中，并在大约两周后强制用户重新登录。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;/refresh_token\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ereq\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003everify\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003eexisting\u003c/span\u003e \u003cspan class=\"n\"\u003etoken\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eprofile\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ejwt\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003everify\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ereq\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003esecret\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003emore\u003c/span\u003e \u003cspan class=\"n\"\u003ethan\u003c/span\u003e \u003cspan class=\"mi\"\u003e14\u003c/span\u003e \u003cspan class=\"n\"\u003edays\u003c/span\u003e \u003cspan class=\"n\"\u003eold\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eforce\u003c/span\u003e \u003cspan class=\"n\"\u003elogin\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eprofile\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eoriginal_iat\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eDate\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e14\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eiat\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eissued\u003c/span\u003e \u003cspan class=\"n\"\u003eat\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e401\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003ere\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elogging\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003echeck\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003euser\u003c/span\u003e \u003cspan class=\"n\"\u003estill\u003c/span\u003e \u003cspan class=\"n\"\u003eexists\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eauthorization\u003c/span\u003e \u003cspan class=\"n\"\u003ehasn\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;t been revoked\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003evalid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e401\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003ere\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elogging\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eissue\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003etoken\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003erefreshed_token\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ejwt\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esign\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eprofile\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003esecret\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eexpiresInMinutes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e60\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"mi\"\u003e5\u003c/span\u003e \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e \u003cspan class=\"n\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003erefreshed_token\u003c/span\u003e \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"3localsession-storage无法跨域请使用cookies作标记\"\u003e3.Local/Session Storage无法跨域，请使用Cookies作标记\u003c/h3\u003e\n\u003cp\u003e如果你将cookie的作用域名设置为\u003ccode\u003e.yourdomain.com\u003c/code\u003e，那么它可以在\u003ccode\u003eyourdomain.com\u003c/code\u003e和\u003ccode\u003eapp.yourdomain.com\u003c/code\u003e中被访问。如果用户在主域登录却被重定向到\u003ccode\u003eapp.yourdomain.com\u003c/code\u003e，要验证cookie也是很方便的。 Tokens存储在local/session storage中，这意味着不同域名之间是无法相互访问的（即使是子域名）。那么你该怎么做呢？ 其中一种做法是，当用户在\u003ccode\u003eapp.yourdomain.com\u003c/code\u003e中验证完毕后，你生成一个token并设置一个作用域名为\u003ccode\u003e.yourdomain.com\u003c/code\u003e的Cookie标记用户已经登录。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e$.\u003c/span\u003e\u003cspan class=\"n\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;/authenticate, function() {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003estore\u003c/span\u003e \u003cspan class=\"n\"\u003etoken\u003c/span\u003e \u003cspan class=\"n\"\u003eon\u003c/span\u003e \u003cspan class=\"n\"\u003elocal\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esession\u003c/span\u003e \u003cspan class=\"n\"\u003estorage\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003ecookie\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e....\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003ecreate\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003ecookie\u003c/span\u003e \u003cspan class=\"n\"\u003esignaling\u003c/span\u003e \u003cspan class=\"n\"\u003ethat\u003c/span\u003e \u003cspan class=\"n\"\u003euser\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003elogged\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e$.\u003c/span\u003e\u003cspan class=\"n\"\u003ecookie\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;loggedin\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eprofile\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;.yourdomain.com\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后，你可以在\u003ccode\u003eyourdomain.com\u003c/code\u003e验证cookie的存在并重定向到\u003ccode\u003eapp.yourdomain.com\u003c/code\u003e。而Token可以在app的子域中使用（如果token依然合法）。 可能会出现cookie存在而token已经被删除的情况。这种情况下，用户必须重新登录。这里需要强调的是，正如我们之前所说，我们并不将cookie当作验证机制，而仅仅把它作为能够跨域保存信息的存储机制。\u003c/p\u003e\n\u003ch3 id=\"4每个cors请求都会先发一个预请求\"\u003e4.每个CORS请求都会先发一个预请求\u003c/h3\u003e\n\u003cp\u003e有人指出，Authorization报头并非一个简单的报头，因此在向特定URLs发送请求前都需要发送一个预请求。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOPTIONS https://api.foo.com/bar\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGET https://api.foo.com/bar\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   Authorization: Bearer ....\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOPTIONS https://api.foo.com/bar2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGET https://api.foo.com/bar2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   Authorization: Bearer ....\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGET https://api.foo.com/bar\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   Authorization: Bearer ....\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这时你需要发送\u003ccode\u003eContent-Type: application/json\u003c/code\u003e。 提醒下，\u003ccode\u003eOPTIONS\u003c/code\u003e请求自身并没有Authorization报头信息，所以你的web框架需要对\u003ccode\u003eOPTIONS\u003c/code\u003e和后续的请求作一些处理（提示：微软的IIS因为某些原因在这方面存在一些问题）。\u003c/p\u003e","title":"关于Tokens你需要知道的10件事"},{"content":"在windows下我们需要开启某个扩展，很容易。一般情况下，dll文件都已经安静地躺在extension目录下，只等待你在php.ini里将它前面的;去掉。 而在linux，你cd到php的extensions目录往往发现里面空空的。或许只有几个so文件落寞地待着。 这里以编译fileinfo扩展为例（注意这是php内置的扩展，如果你编译的是第三方扩展请自行到官网下载源码）\n一、找到扩展包 你需要到PHP源码包里寻找，希望源码包没被你删除。 cd到php-5.x.x/ext/目录，你会发现里面有很多内置的扩展 我们cd到fileinfo目录\n二、编译 phpize ./configure --with-php-config=/usr/local/php/bin/php-config make \u0026amp;\u0026amp; make install 上面的命令很好理解，首先是执行phpize，它是用来安装php扩展的工具，如果你的系统无法识别，请使用完整路径。比如/usr/local/php/bin/phpize 。这个工具会在当前目录下生成configure文件。 接着就是编译的三板斧啦~其中with-php-config参数请按照你实际情况填写 没有意外的话，经过上面的编译，你会在php/lib/php/extensions/(在php.ini的extension_dir可找到, 或者 php -i | grep exten)目录下找到生成的fileinfo.so文件\n三、添加配置 最后只需要在php.ini里把扩展添加进去就好了\nextension = \u0026#34;fileinfo.so\u0026#34; 最后别忘了reload php-fpm\n","permalink":"https://blog-foamzou-com.pages.dev/posts/compiled-php-extension-in-linux/","summary":"\u003cp\u003e在windows下我们需要开启某个扩展，很容易。一般情况下，dll文件都已经安静地躺在extension目录下，只等待你在php.ini里将它前面的;去掉。 而在linux，你cd到php的extensions目录往往发现里面空空的。或许只有几个so文件落寞地待着。 这里以编译\u003cstrong\u003efileinfo\u003c/strong\u003e扩展为例（注意这是php内置的扩展，如果你编译的是第三方扩展请自行到官网下载源码）\u003c/p\u003e\n\u003ch3 id=\"一找到扩展包\"\u003e一、找到扩展包\u003c/h3\u003e\n\u003cp\u003e你需要到PHP源码包里寻找，希望源码包没被你删除。 cd到php-5.x.x/ext/目录，你会发现里面有很多内置的扩展 \u003cimg loading=\"lazy\" src=\"/posts/compiled-php-extension-in-linux/9c4c484bf505c7695d964585d3b51a2f.png\"\u003e 我们cd到fileinfo目录\u003c/p\u003e\n\u003ch3 id=\"二编译\"\u003e二、编译\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ephpize\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./configure --with-php-config\u003cspan class=\"o\"\u003e=\u003c/span\u003e/usr/local/php/bin/php-config\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emake \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e make install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e上面的命令很好理解，首先是执行phpize，它是用来安装php扩展的工具，如果你的系统无法识别，请使用完整路径。比如/usr/local/php/bin/phpize 。这个工具会在当前目录下生成configure文件。 接着就是编译的三板斧啦~其中with-php-config参数请按照你实际情况填写 没有意外的话，经过上面的编译，你会在php/lib/php/extensions/(在php.ini的extension_dir可找到, 或者 php -i | grep exten)目录下找到生成的fileinfo.so文件\u003c/p\u003e\n\u003ch3 id=\"三添加配置\"\u003e三、添加配置\u003c/h3\u003e\n\u003cp\u003e最后只需要在php.ini里把扩展添加进去就好了\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eextension = \u0026#34;fileinfo.so\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e最后别忘了reload php-fpm\u003c/p\u003e","title":"在Linux下编译php扩展"},{"content":"首先必须说明，这是一个由官方开发文档导致的错误。 关于回调地址，官方文档是作如下说明的：\n申请时填写的callback是：mysite.com;example.com 合法的回调地址可以是：http://bbs.mysite.com/qqlogin.php?a=1 也可以是：http://www.example.com/qqlogin.php?a=1 但当我在管理中心给回调地址填写了 http://domain.com，在代码中配置为http://demo.domain.com/callback.php时却报了标题的错误。 Google后找到了原因，QQ互联已在今年作出了调整，为提高安全措施，管理中心的配置的回调地址必须完全与实际的回调地址一致。 如果你实际的回调地址为 http://demo.domain.com/callback.php，那么在管理中心就得一字不差地输入进去。 QQ互联，或者说腾讯这种整理开发文档的执行能力，怎么吐槽呢~想推广微信开放平台也用不着这么放弃QQ互联吧，毕竟对开发者不负责可不是什么好事。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/error-of-qq-connect-redirect-uri-is-illegal-100010/","summary":"\u003cp\u003e首先必须说明，这是一个由官方开发文档导致的错误。 关于回调地址，\u003ca href=\"http://wiki.connect.qq.com/%E5%9B%9E%E8%B0%83%E5%9C%B0%E5%9D%80%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E5%8F%8A%E4%BF%AE%E6%94%B9%E6%96%B9%E6%B3%95\"\u003e官方文档\u003c/a\u003e是作如下说明的：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e申请时填写的callback是：mysite.com\u003cspan class=\"p\"\u003e;\u003c/span\u003eexample.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e合法的回调地址可以是：http://bbs.mysite.com/qqlogin.php?a\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e也可以是：http://www.example.com/qqlogin.php?a\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e但当我在管理中心给回调地址填写了 \u003ca href=\"http://domain.com\"\u003ehttp://domain.com\u003c/a\u003e，在代码中配置为http://demo.domain.com/callback.php时却报了标题的错误。 Google后找到了原因，QQ互联已在今年作出了调整，为提高安全措施，管理中心的配置的回调地址必须\u003cstrong\u003e完全\u003c/strong\u003e与实际的回调地址\u003cstrong\u003e一致\u003c/strong\u003e。 如果你实际的回调地址为 \u003ca href=\"http://demo.domain.com/callback.php\"\u003ehttp://demo.domain.com/callback.php\u003c/a\u003e，那么在管理中心就得\u003cstrong\u003e一字不差\u003c/strong\u003e地输入进去。 QQ互联，或者说腾讯这种整理开发文档的执行能力，怎么吐槽呢~想推广微信开放平台也用不着这么放弃QQ互联吧，毕竟对开发者不负责可不是什么好事。\u003c/p\u003e","title":"关于QQ互联的redirect uri is illegal(100010)错误"},{"content":"知乎收藏分类下的所有文章均来自知乎。知乎是一个好平台，至少现在还是。有时候看到一些好文章，不忍私藏，权当与大家学习共勉吧。 译文分类下的文章均由我翻译，当作锻炼英文水平吧。 至于版权，两个分类下的所有文章均得到原作者同意如果你需要转载，请直接联系原作者哦\n","permalink":"https://blog-foamzou-com.pages.dev/posts/about-category-of-zhihu/","summary":"\u003cp\u003e知乎收藏分类下的所有文章均来自知乎。知乎是一个好平台，至少现在还是。有时候看到一些好文章，不忍私藏，权当与大家学习共勉吧。 译文分类下的文章均由我翻译，当作锻炼英文水平吧。 至于版权，两个分类下的所有文章均得到原作者同意\u003cdel\u003e如果你需要转载，请直接联系原作者哦\u003c/del\u003e\u003c/p\u003e","title":"关于知乎收藏和译文"},{"content":"本文来自知友苏杨，原问题Here 我怎么感觉很多关于如何训练自己提前入睡，分成几个步骤操作的答案对我来说都像是一种精神凌虐。 那些睡前训练对我来说更像是一种反人性的行为，你要让我睡前不说话，不上网，光躺床上做傻兮兮的放松运动，我一定会觉得，God!~,I\u0026rsquo;m crazy！何必要强迫自己做不愿做的事情呢？安然舒适的入睡是一件多么惬意且重要的事情啊，我不相信一个无法控制自己入睡时间的人能够通过这些方法，把它变成习惯，真正改变睡眠时间。我想问一下，之前看过类似方法后现在真正坚持下来的人有多少？ 与其控制人性，改变人性，倒不如顺应人性，安抚人性。以下方法，亲测有效。 其实我们之所以很晚还不想睡去，只是因为我们的潜意识里认为，入睡意味着结束，我们迟迟不愿入睡只是因为我们迟迟不愿放下手边的娱乐，和今天的自己说再见，我们的心是浮躁的，还没有得到那个”恩，够了“的满足。但偏偏很多人在睡前的焦虑中会试图通过刷微博，刷知乎，不停的在信息流中漫游来找寻自己的满足感，殊不知，这种做法是大错特错的。这样做只会让心变得更加浮躁。 其实我们心里需要的只是一个仪式，一个完整的带有仪式感的行为来让自己的心得到满足感，来告诉自己，今天已经结束了，我从这件事情上得到了满足感，可以心甘情愿的睡去。记住这个仪式不可以是碎片化的浏览和查看，一定要是一个完整的观看或者聆听。 比如可以听一段完整的抒情文字，有时我在不愿入睡的时候会让自己听一段类似”陌声人广播“或者私人电台这种文艺电台的呢喃，因为我向往这种夜晚的自省与反思，然后心就会得到满足，安静入睡。 比如读一段完整的文字，让自己在流畅完整的阅读中得到满足，你潜意识里会告诉自己，我看完了一段自己喜欢的文字，我已经得到了自己想要的，我做完了，于是心不再焦虑，可以甘愿睡去。再比如听一张完整的专辑或者是看一段完整的视频。 总之这件事情要是一件流畅的，完整的，让你心里感到满足的事情而不能是碎片的，零散的。这样做完，内心多半都会感到安静和舒适，同时大脑也会告诉你：“恩，我可以去睡了。”\n","permalink":"https://blog-foamzou-com.pages.dev/posts/how-to-get-rid-of-sleep-disorder/","summary":"\u003cp\u003e本文来自知友\u003ca href=\"http://www.zhihu.com/people/suyang123\"\u003e苏杨\u003c/a\u003e，原问题\u003ca href=\"http://www.zhihu.com/question/19761485\"\u003eHere\u003c/a\u003e 我怎么感觉很多关于如何训练自己提前入睡，分成几个步骤操作的答案对我来说都像是一种精神凌虐。 那些睡前训练对我来说更像是一种反人性的行为，你要让我睡前不说话，不上网，光躺床上做傻兮兮的放松运动，我一定会觉得，God!~,I\u0026rsquo;m crazy！何必要强迫自己做不愿做的事情呢？安然舒适的入睡是一件多么惬意且重要的事情啊，我不相信一个无法控制自己入睡时间的人能够通过这些方法，把它变成习惯，真正改变睡眠时间。我想问一下，之前看过类似方法后现在真正坚持下来的人有多少？ \u003cstrong\u003e与其控制人性，改变人性，倒不如顺应人性，安抚人性。\u003cstrong\u003e以下方法，亲测有效。 其实我们之所以很晚还不想睡去，只是因为我们的潜意识里认为，入睡意味着结束，我们迟迟不愿入睡只是因为我们迟迟不愿放下手边的娱乐，和今天的自己说再见，我们的心是浮躁的，还没有得到那个”恩，够了“的满足。\u003cstrong\u003e但偏偏很多人在睡前的焦虑中会试图通过刷微博，刷知乎，不停的在信息流中漫游来找寻自己的满足感，殊不知，这种做法是大错特错的。这样做只会让心变得更加浮躁。\u003c/strong\u003e \u003cstrong\u003e其实我们心里需要的只是一个仪式，一个完整的带有仪式感的行为来让自己的心得到满足感\u003c/strong\u003e，来告诉自己，今天已经结束了，我从这件事情上得到了满足感，可以心甘情愿的睡去。记住这个仪式不可以是碎片化的浏览和查看，一定要是一个完整的观看或者聆听。 比如可以听一段完整的抒情文字，有时我在不愿入睡的时候会让自己听一段类似”陌声人广播“或者私人电台这种文艺电台的呢喃，因为我向往这种夜晚的自省与反思，然后心就会得到满足，安静入睡。 比如读一段完整的文字，让自己在流畅完整的阅读中得到满足，你潜意识里会告诉自己，我看完了一段自己喜欢的文字，我已经得到了自己想要的，我做完了，于是心不再焦虑，可以甘愿睡去。再比如听一张完整的专辑或者是看一段完整的视频。 总之这件事情要是一件\u003c/strong\u003e流畅的，完整的，让你心里感到满足\u003c/strong\u003e的事情而不能是碎片的，零散的。这样做完，内心多半都会感到安静和舒适，同时大脑也会告诉你：“恩，我可以去睡了。”\u003c/p\u003e","title":"如何改掉晚睡强迫症"},{"content":"对于不喜欢折腾运行环境的同学来说，集成环境包绝对是好东西。由于WAMP上php5.6版本有点小坑，现在已转向XAMPP的怀抱。\n给apache服务器授权 打开Apache的配置文件httpd.conf，找到下面的节点\nDocumentRoot \u0026#34;C:/xampp/htdocs\u0026#34; \u0026lt;Directory \u0026#34;C:/xampp/htdocs\u0026#34;\u0026gt; # # Possible values for the Options directive are \u0026#34;None\u0026#34;, \u0026#34;All\u0026#34;, # or any combination of: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # Note that \u0026#34;MultiViews\u0026#34; must be named *explicitly* --- \u0026#34;Options All\u0026#34; # doesn\u0026#39;t give it to you. # # The Options directive is both complicated and important. Please see # http://httpd.apache.org/docs/2.4/mod/core.html#options # for more information. # Options Indexes FollowSymLinks Includes ExecCGI # # AllowOverride controls what directives may be placed in .htaccess files. # It can be \u0026#34;All\u0026#34;, \u0026#34;None\u0026#34;, or any combination of the keywords: # AllowOverride FileInfo AuthConfig Limit # AllowOverride All # # Controls who can get stuff from this server. # Require all granted \u0026lt;/Directory\u0026gt; 可以看到已经在C:/xampp/htdocs目录下授权了，你可以把多个项目放在该目录下。我一般习惯在非系统盘放置项目，此时将C:/xampp/htdocs改为自定义目录就可以。 接着查看是否加载了vhost的配置文件。若你的配置文件没有这一行，你可以手动添加上去并在对应目录新建httpd-vhosts.conf配置文件。\n# Virtual hosts Include conf/extra/httpd-vhosts.conf 添加虚拟站点 打开httpd-vhosts.conf文件，为每个项目添加如下节点即可\n\u0026lt;VirtualHost *:80\u0026gt; DocumentRoot \u0026#34;G:\\WWWROOT\\entersgu\u0026#34; ServerName 127.0.0.2 \u0026lt;/VirtualHost\u0026gt; ","permalink":"https://blog-foamzou-com.pages.dev/posts/set-vhost-in-xampp-or-wamp/","summary":"\u003cp\u003e对于不喜欢折腾运行环境的同学来说，集成环境包绝对是好东西。由于WAMP上php5.6版本有点小坑，现在已转向XAMPP的怀抱。\u003c/p\u003e\n\u003ch4 id=\"给apache服务器授权\"\u003e给apache服务器授权\u003c/h4\u003e\n\u003cp\u003e打开Apache的配置文件\u003cstrong\u003ehttpd.conf\u003c/strong\u003e，找到下面的节点\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDocumentRoot \u003cspan class=\"s2\"\u003e\u0026#34;C:/xampp/htdocs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;Directory \u003cspan class=\"s2\"\u003e\u0026#34;C:/xampp/htdocs\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Possible values for the Options directive are \u0026#34;None\u0026#34;, \u0026#34;All\u0026#34;,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# or any combination of:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Note that \u0026#34;MultiViews\u0026#34; must be named *explicitly* --- \u0026#34;Options All\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# doesn\u0026#39;t give it to you.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# The Options directive is both complicated and important.  Please see\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# http://httpd.apache.org/docs/2.4/mod/core.html#options\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# for more information.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Options Indexes FollowSymLinks Includes ExecCGI\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# AllowOverride controls what directives may be placed in .htaccess files.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# It can be \u0026#34;All\u0026#34;, \u0026#34;None\u0026#34;, or any combination of the keywords:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#   AllowOverride FileInfo AuthConfig Limit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    AllowOverride All\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Controls who can get stuff from this server.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Require all granted\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;/Directory\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e可以看到已经在\u003cstrong\u003eC:/xampp/htdocs\u003c/strong\u003e目录下授权了，你可以把多个项目放在该目录下。我一般习惯在非系统盘放置项目，此时将\u003cstrong\u003eC:/xampp/htdocs\u003c/strong\u003e改为自定义目录就可以。 接着查看是否加载了vhost的配置文件。若你的配置文件没有这一行，你可以手动添加上去并在对应目录新建httpd-vhosts.conf配置文件。\u003c/p\u003e","title":"在XAMPP、WAMP等集成环境中配置虚拟站点"},{"content":"学习一门框架，首先要了解的就是目录结构。对目录结构清晰就可以着手学习了~ 这里不作新特性的介绍，权当目录结构手册看吧。若发现有何不恰当的地方请联系我哦~ 注：写本文时参照的是5.1.4版本\n目录或文件\n说明\n｜–　app\n包含Controller、Model、路由等在内的应用目录，大部分业务将在该目录下进行\n｜　｜–　Console\n命令行程序目录\n｜　｜　｜–　Commands\n包含了用于命令行执行的类，可在该目录下自定义类\n｜　｜　｜–　Kernel.php\n命令调用内核文件，包含commands变量(命令清单，自定义的命令需加入到这里)和schedule方法(用于任务调度，即定时任务)\n｜　｜–　Events\n事件目录\n｜　｜–　Exceptions\n包含了自定义错误和异常处理类\n｜　｜–　Http\nHTTP传输层相关的类目录\n｜　｜　｜–　Controllers\n控制器目录\n｜　｜　｜–　Kernel.php\n包含http中间件和路由中间件的内核文件\n｜　｜　｜–　Middleware\n中间件目录\n｜　｜　｜–　Requests\n请求类目录\n｜　｜　｜–　routes.php\n强大的路由\n｜　｜–　Jobs\n该目录下包含队列的任务类\n｜　｜–　Listeners\n监听器目录\n｜　｜–　Providers\n服务提供者目录\n｜　｜–　User.php\n自带的模型实例，我们新建的Model默认也存储在该目录\n｜–　artisan\n强大的命令行接口，你可以在app/Console/Commands下编写自定义命令\n｜–　bootstrap\n框架启动载入目录\n｜　｜–　app.php\n创建框架应用实例\n｜　｜–　autoload.php\n自动加载\n｜　｜–　cache\n存放框架启动缓存，web服务器需要有该目录的写入权限\n｜–　composer.json\n存放依赖关系的文件\n｜–　composer.lock\n锁文件，存放安装时依赖包的真实版本\n｜–　config\n各种配置文件的目录\n｜　｜–　app.php\n系统级配置文件\n｜　｜–　auth.php\n用户身份认证配置文件，指定好table和model就可以很方便地用身份认证功能了\n｜　｜–　broadcasting.php\n事件广播配置文件\n｜　｜–　cache.php\n缓存配置文件\n｜　｜–　compile.php\n编译额外文件和类需要的配置文件，一般用户很少用到\n｜　｜–　database.php\n数据库配置文件\n｜　｜–　filesystems.php\n文件系统配置文件，这里可以配置云存储参数\n｜　｜–　mail.php\n电子邮件配置文件\n｜　｜–　queue.php\n消息队列配置文件\n｜　｜–　services.php\n可存放第三方服务的配置信息\n｜　｜–　session.php\n配置session的存储方式、生命周期等信息\n｜　｜–　view.php\n模板文件配置文件，包含模板目录和编译目录等\n｜–　database\n数据库相关目录\n｜　｜–　factories\n5.1版本的新特性，工厂类目录，也是用于数据填充\n｜　｜　｜–　ModelFactory.php\n在该文件可定义不同Model所需填充的数据类型\n｜　｜–　migrations\n存储数据库迁移文件\n｜　｜–　seeds\n存放数据填充类的目录\n｜　｜–　DatabaseSeeder.php\n执行php artisan db:seed命令将会调用该类的run方法。该方法可调用执行该目录下其他Seeder类，也可调用factories方法生成ModelFactory里定义的数据模型\n｜–　.env\n环境配置文件。config目录下的配置文件会使用该文件里面的参数，不同生产环境使用不同的.env文件即可。\n｜–　gulpfile.js\ngulp（一种前端构建工具）配置文件\n｜–　package.json\ngulp配置文件\n｜–　phpspec.yml\nphpspec（一种PHP测试框架）配置文件\n｜–　phpunit.xml\nphpunit（一种PHP测试框架）配置文件\n｜–　public\n网站入口，应当将ip或域名指向该目录而不是根目录。可供外部访问的css、js和图片等资源皆放置于此\n｜　｜–　index.php\n入口文件\n｜　｜–　.htaccess\nApache服务器用该文件重写URL\n｜　｜–　web.config\nIIS服务器用该文件重写URL\n｜–　resources\n资源文件目录\n｜　｜–　assets\n可存放包含LESS、SASS、CoffeeScript在内的原始资源文件\n｜　｜–　lang\n本地化文件目录\n｜　｜–　views\n视图文件就放在这啦\n｜–　server.php\nPHP内置的Web服务器将把这个文件作为入口。以public/index.php为入口的可以忽略掉该文件\n｜–　storage\n存储目录。web服务器需要有该目录及所有子目录的写入权限\n｜　｜–　app\n可用于存储应用程序所需的一些文件？待补充\n｜　｜–　framework\n该目录下包括缓存、sessions和编译后的视图文件\n｜　｜–　logs\n日志目录\n｜–　tests\n测试目录\n｜–　vendor\n该目录下包含Laravel源代码和第三方依赖包\n","permalink":"https://blog-foamzou-com.pages.dev/posts/laravel5-1-dir-analysis/","summary":"\u003cp\u003e学习一门框架，首先要了解的就是目录结构。对目录结构清晰就可以着手学习了~ 这里不作新特性的介绍，权当目录结构手册看吧。若发现有何不恰当的地方请联系我哦~ 注：写本文时参照的是\u003ccode\u003e5.1.4\u003c/code\u003e版本\u003c/p\u003e\n\u003cp\u003e目录或文件\u003c/p\u003e\n\u003cp\u003e说明\u003c/p\u003e\n\u003cp\u003e｜–　\u003cstrong\u003eapp\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e包含Controller、Model、路由等在内的应用目录，大部分业务将在该目录下进行\u003c/p\u003e\n\u003cp\u003e｜　　｜–　Console\u003c/p\u003e\n\u003cp\u003e命令行程序目录\u003c/p\u003e\n\u003cp\u003e｜　　｜　　｜–　Commands\u003c/p\u003e\n\u003cp\u003e包含了用于命令行执行的类，可在该目录下自定义类\u003c/p\u003e\n\u003cp\u003e｜　　｜　　｜–　Kernel.php\u003c/p\u003e\n\u003cp\u003e命令调用内核文件，包含commands变量(命令清单，自定义的命令需加入到这里)和schedule方法(用于任务调度，即定时任务)\u003c/p\u003e\n\u003cp\u003e｜　　｜–　Events\u003c/p\u003e\n\u003cp\u003e事件目录\u003c/p\u003e\n\u003cp\u003e｜　　｜–　Exceptions\u003c/p\u003e\n\u003cp\u003e包含了自定义错误和异常处理类\u003c/p\u003e\n\u003cp\u003e｜　　｜–　Http\u003c/p\u003e\n\u003cp\u003eHTTP传输层相关的类目录\u003c/p\u003e\n\u003cp\u003e｜　　｜　　｜–　Controllers\u003c/p\u003e\n\u003cp\u003e控制器目录\u003c/p\u003e\n\u003cp\u003e｜　　｜　　｜–　Kernel.php\u003c/p\u003e\n\u003cp\u003e包含http中间件和路由中间件的内核文件\u003c/p\u003e\n\u003cp\u003e｜　　｜　　｜–　Middleware\u003c/p\u003e\n\u003cp\u003e中间件目录\u003c/p\u003e\n\u003cp\u003e｜　　｜　　｜–　Requests\u003c/p\u003e\n\u003cp\u003e请求类目录\u003c/p\u003e\n\u003cp\u003e｜　　｜　　｜–　routes.php\u003c/p\u003e\n\u003cp\u003e强大的路由\u003c/p\u003e\n\u003cp\u003e｜　　｜–　Jobs\u003c/p\u003e\n\u003cp\u003e该目录下包含队列的任务类\u003c/p\u003e\n\u003cp\u003e｜　　｜–　Listeners\u003c/p\u003e\n\u003cp\u003e监听器目录\u003c/p\u003e\n\u003cp\u003e｜　　｜–　Providers\u003c/p\u003e","title":"Laravel5.1 目录结构解析"},{"content":"对于企业来说，最重要的已经不是程序代码而是用户数据了。对于我们普通用户来说，自己网站的数据同样重要。如果网站搭建在大公司的主机或服务器上那还好，假设是三流公司就玩完了。所以定期对我们的数据进行备份还是很重要的。 现在互联网上已经有很多提供备份的服务了，我选择了多备份，下面以此为例简要说明。\n一、注册多备份账号 官方网站：http://www.dbfen.com/ 一般用户使用免费套餐就能满足需求了\n二、账户设置 多备份现在支持以下几种云存储应用，选择你拥有的应用绑定即可，我选择的是百度云。 绑定完后，如果仍显示未绑定，重新登录多备份账号即可 三、新建任务 1. 文件备份 可以选择备份频率，保留份数和备份速度。还可以自定义要备份的文件目录 默认备份频率最高是每周1次，如果你希望频率再高一点，可以在兑换商城用积分兑换备份频率。 2. 数据库备份 新建好这两个任务后，就能在控制面板看到这个列表啦。这里可以对任务进行相关设置。 四、恢复数据 自动恢复 这个比较简便，直接选择备份的时间进行恢复。类似版本回滚 手动恢复 一般用户点击解密并下载就好了，反正不是什么机密文件。当然，如果是需要进行安全传输的，可以点击直接下载将加密后文件下载来，再发给别人手动解密。 手动解密，下载官方的多备份解密工具就好。如果官方的找不到了可以点击下载 密钥在账户设置-密钥查看可以找到 ","permalink":"https://blog-foamzou-com.pages.dev/posts/backup-web-file-by-dbfen/","summary":"\u003cp\u003e对于企业来说，最重要的已经不是程序代码而是用户数据了。对于我们普通用户来说，自己网站的数据同样重要。如果网站搭建在大公司的主机或服务器上那还好，假设是三流公司就玩完了。所以定期对我们的数据进行备份还是很重要的。 现在互联网上已经有很多提供备份的服务了，我选择了多备份，下面以此为例简要说明。\u003c/p\u003e\n\u003ch3 id=\"一注册多备份账号\"\u003e一、注册多备份账号\u003c/h3\u003e\n\u003cp\u003e官方网站：\u003ca href=\"http://www.dbfen.com/\"\u003ehttp://www.dbfen.com/\u003c/a\u003e 一般用户使用免费套餐就能满足需求了\u003c/p\u003e\n\u003ch3 id=\"二账户设置\"\u003e二、账户设置\u003c/h3\u003e\n\u003cp\u003e多备份现在支持以下几种云存储应用，选择你拥有的应用绑定即可，我选择的是百度云。 绑定完后，如果仍显示未绑定，重新登录多备份账号即可 \u003ca href=\"vKqt1LPHVvAAAAABJRU5ErkJggg.png\"\u003e\u003cimg alt=\"vKqt1LPHVvAAAAABJRU5ErkJggg==\" loading=\"lazy\" src=\"/posts/backup-web-file-by-dbfen/vKqt1LPHVvAAAAABJRU5ErkJggg.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"三新建任务\"\u003e三、新建任务\u003c/h3\u003e\n\u003ch5 id=\"1-文件备份\"\u003e1. 文件备份\u003c/h5\u003e\n\u003cp\u003e\u003ca href=\"A4onC03uvfOjAAAAAElFTkSuQmCC.png\"\u003e\u003cimg alt=\"A4onC03uvfOjAAAAAElFTkSuQmCC\" loading=\"lazy\" src=\"/posts/backup-web-file-by-dbfen/A4onC03uvfOjAAAAAElFTkSuQmCC.png\"\u003e\u003c/a\u003e 可以选择备份频率，保留份数和备份速度。还可以自定义要备份的文件目录 \u003ca href=\"WdLyQgggAACCCCAAAIIIODHAv8fmgg6Ud1V9nIAAAAASUVORK5CYII.png\"\u003e\u003cimg alt=\"WdLyQgggAACCCCAAAIIIODHAv8fmgg6Ud1V9nIAAAAASUVORK5CYII=\" loading=\"lazy\" src=\"/posts/backup-web-file-by-dbfen/WdLyQgggAACCCCAAAIIIODHAv8fmgg6Ud1V9nIAAAAASUVORK5CYII.png\"\u003e\u003c/a\u003e 默认备份频率最高是每周1次，如果你希望频率再高一点，可以在兑换商城用积分兑换备份频率。 \u003ca href=\"wHtsdDYP9gXYAAAAABJRU5ErkJggg.png\"\u003e\u003cimg alt=\"wHtsdDYP9gXYAAAAABJRU5ErkJggg==\" loading=\"lazy\" src=\"/posts/backup-web-file-by-dbfen/wHtsdDYP9gXYAAAAABJRU5ErkJggg.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch5 id=\"2-数据库备份\"\u003e2. 数据库备份\u003c/h5\u003e\n\u003cp\u003e\u003ca href=\"uW2yCBAgQIECAAAECBAgIPo4BAgQIECBAgAABAgRyLyD45L7FJkiAAAECBAgQIECAwP8A7p9pqiUzfpkAAAAASUVORK5CYII.png\"\u003e\u003cimg alt=\"uW2yCBAgQIECAAAECBAgIPo4BAgQIECBAgAABAgRyLyD45L7FJkiAAAECBAgQIECAwP8A7p9pqiUzfpkAAAAASUVORK5CYII=\" loading=\"lazy\" src=\"/posts/backup-web-file-by-dbfen/uW2yCBAgQIECAAAECBAgIPo4BAgQIECBAgAABAgRyLyD45L7FJkiAAAECBAgQIECAwP8A7p9pqiUzfpkAAAAASUVORK5CYII.png\"\u003e\u003c/a\u003e 新建好这两个任务后，就能在控制面板看到这个列表啦。这里可以对任务进行相关设置。 \u003ca href=\"AxCcjspH206lAAAAAElFTkSuQmCC.png\"\u003e\u003cimg alt=\"AxCcjspH206lAAAAAElFTkSuQmCC\" loading=\"lazy\" src=\"/posts/backup-web-file-by-dbfen/AxCcjspH206lAAAAAElFTkSuQmCC.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"四恢复数据\"\u003e四、恢复数据\u003c/h3\u003e\n\u003ch5 id=\"自动恢复\"\u003e自动恢复\u003c/h5\u003e\n\u003cp\u003e这个比较简便，直接选择备份的时间进行恢复。类似版本回滚 \u003ca href=\"EUAAga-UgDEnbkynGFfiQYe4l4AtQe5Vn0UEEEAAAZsF-K4Vm4EpjwACCNgtQJDbLUx9BBBAwGYBgtxmYMojgAACdgsQ5HYLUx8BBBCwWYAgtxmY8ggggIDdAgS53cLURwABBGwWIMhtBqY8AgggYLcAQW63MPURQAABmwX-P3EM4wNYRKMVAAAAAElFTkSuQmCC.png\"\u003e\u003cimg alt=\"EUAAga+UgDEnbkynGFfiQYe4l4AtQe5Vn0UEEEAAAZsF+K4Vm4EpjwACCNgtQJDbLUx9BBBAwGYBgtxmYMojgAACdgsQ5HYLUx8BBBCwWYAgtxmY8ggggIDdAgS53cLURwABBGwWIMhtBqY8AgggYLcAQW63MPURQAABmwX+P3EM4wNYRKMVAAAAAElFTkSuQmCC\" loading=\"lazy\" src=\"/posts/backup-web-file-by-dbfen/EUAAga-UgDEnbkynGFfiQYe4l4AtQe5Vn0UEEEAAAZsF-K4Vm4EpjwACCNgtQJDbLUx9BBBAwGYBgtxmYMojgAACdgsQ5HYLUx8BBBCwWYAgtxmY8ggggIDdAgS53cLURwABBGwWIMhtBqY8AgggYLcAQW63MPURQAABmwX-P3EM4wNYRKMVAAAAAElFTkSuQmCC.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch5 id=\"手动恢复\"\u003e手动恢复\u003c/h5\u003e\n\u003cp\u003e一般用户点击\u003ccode\u003e解密并下载\u003c/code\u003e就好了，反正不是什么机密文件。当然，如果是需要进行安全传输的，可以点击\u003ccode\u003e直接下载\u003c/code\u003e将加密后文件下载来，再发给别人手动解密。 \u003ca href=\"j-zkir1JBa-VQAAAABJRU5ErkJggg.png\"\u003e\u003cimg alt=\"j+zkir1JBa+VQAAAABJRU5ErkJggg==\" loading=\"lazy\" src=\"/posts/backup-web-file-by-dbfen/j-zkir1JBa-VQAAAABJRU5ErkJggg.png\"\u003e\u003c/a\u003e 手动解密，下载官方的多备份解密工具就好。如果官方的找不到了可以\u003ca href=\"http://pan.baidu.com/s/1mgN54xi\"\u003e点击下载\u003c/a\u003e 密钥在\u003ccode\u003e账户设置\u003c/code\u003e-\u003ccode\u003e密钥查看\u003c/code\u003e可以找到 \u003ca href=\"h-db0Fhhz-orwAAAABJRU5ErkJggg.png\"\u003e\u003cimg alt=\"h+db0Fhhz+orwAAAABJRU5ErkJggg==\" loading=\"lazy\" src=\"/posts/backup-web-file-by-dbfen/h-db0Fhhz-orwAAAABJRU5ErkJggg.png\"\u003e\u003c/a\u003e\u003c/p\u003e","title":"使用多备份对网站进行备份"},{"content":"最近在做页面的抓取工作，用到了一个很方便的项目——QueryList，这是基于PhpQuery开发的。 因为只需要很少的代码就能完成复杂的正则抓取，所以我决定将它集成到ThinkPHP使用。 由于ThinkPHP3.2使用了命名空间，所以我一开始想要将QueryList里的类文件都加上命名空间，以规范化。但后面折腾了好久，未果(毕竟这项目require的文件太多了，且一个方法又同时写了静态和非静态，改起来难度还是比较大的)。Ok，咱还是用比较原始的方法吧。 于是我将这个第三方项目文件放在Org下\nimport(\u0026#39;Org.Jae.QueryList\u0026#39;);//导入类 $hj = \\QueryList::Query($url,$reg);//这里记得要加上\\，表示该类是属于根命名空间的 ","permalink":"https://blog-foamzou-com.pages.dev/posts/thinkphp3-2-3%E5%BC%95%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9%E7%B1%BB%E5%BA%93%E7%9A%84%E9%97%AE%E9%A2%98/","summary":"\u003cp\u003e最近在做页面的抓取工作，用到了一个很方便的项目——QueryList，这是基于PhpQuery开发的。 因为只需要很少的代码就能完成复杂的正则抓取，所以我决定将它集成到ThinkPHP使用。 由于ThinkPHP3.2使用了命名空间，所以我一开始想要将QueryList里的类文件都加上命名空间，以规范化。但后面折腾了好久，未果(毕竟这项目require的文件太多了，且一个方法又同时写了静态和非静态，改起来难度还是比较大的)。Ok，咱还是用比较原始的方法吧。 于是我将这个第三方项目文件放在Org下\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eimport\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Org.Jae.QueryList\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//导入类\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$hj\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003e\\QueryList\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"na\"\u003eQuery\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$url\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nv\"\u003e$reg\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e//这里记得要加上\\，表示该类是属于根命名空间的\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"ThinkPHP3.2.3引用第三方类库的问题"},{"content":"大家好，我是运营部部长兼负责人之一。现为我一年来的工作进行总结以及发表感言。 地球又公转一周了，去年5月18日晚上，工作室换届了，当时是选举三个分别负责 财政、室内和室外的负责人。所谓室外，就是负责公关。就像嘉伟戏称的那样，我在官场打拼多年，在工作室众多成员中，的确是较为适合这一角色。于是那时候我成为了负责工作室与外界打交道的负责人。 然而，一个人的路上不可能总是一帆风顺的，工作室 也不例外。当环境改变的时候，必然要改变前行的姿势。于是，十五周年庆活动结束后的6月8日傍晚，我们在信工五楼外边开了个很长的会议。现在我仍然记得在那个被夕阳染红的天空下，大家围坐在空地讨论未来大计的场景。工作室现有的架构雏形和走进韶大就是在那个时候诞生的。也是在那天，运营部诞生了。6月8号，真是值得纪念的日子。 6月11日晚上，依旧是那片空地和那些人。我们要为之前讨论的架构选举负责人了。不同的是大家的心情比往常凝重了许多。毕竟架构是新的，项目也是新的，负责人选出来后就意味着我们要开始走一段未知的路了，面对未知的一切，人总是本能地排斥和恐惧。 终于轮到选举运营部部长，我举了手。尽管当时我并不喜欢这一个工作。但另一句话爬满了我的心，能力越大责任越大。我想我有责任去保护我们的工作室，我当时的想法就是保护，我想不到其他更贴切的词汇了。如果当时我退缩了，没有参选运营部部长，我想我是不能原谅自己的。庆幸的是，我没有。 然后是暑假留校参与走进韶大的开发。暑假过后便是开学，开学也就意味着招新快来了。对运营部的招新，说实话我心里是没有底的，会担心宣传是否做到位，是否会有人来面试运营部。庆幸的是，我等的人来了。 结合运营部的职能，我制定的考核内容是项目策划书和视频海报的制作。这里感谢林昊的参与，为运营部考核的顺利进行出了份力。现在想来，从二轮考核的老男孩视频到三轮在三楼机房答辩青涩的模样，都是属于我，属于运营部每位成员满满而美好的回忆。 我为我们运营部的小伙伴指导的并不多，这和我是一个开发人员有很大关系，很多时候都感觉分身乏术。请原谅我是一个不那么称职的部长。同时，我也很感激小伙伴对我的宽容和谅解以及他们在这8个月来为工作室默默付出的一切。 作为负责人之一，我已经尽自己的能力负了应有的责任。或许大家看到我们几个负责人也就是周日开开例会，看起来似乎没什么事干。实际上，我们私底下会为大大小小的事讨论几天，会关注最近工作室的动向并采取应有的措施，一些细微的举措都需要从各个方面考虑，推敲几番才能作出最后的决定。有时候想想，对比往届，我们几个大三的也是够拼的了。 这一年，我算是亲眼见证了工作室由单一的架构向多元化发展的轨迹。深夜看到润忠朋友圈的感慨，有些人总要离开，有些路总得自己走。离开了伞的孩子就会学着如何奔跑，后来也将会成为另一批人的伞。期待变得更强大的你们，我相信工作室在大家的努力下会变得越来越好。 过去任职的一年里，很高兴有大家的支持，帮助以及陪伴。以上是我的工作总结以及感言，谢谢大家！！！\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E5%B7%A5%E4%BD%9C%E6%80%BB%E7%BB%93%E5%8F%8A%E6%84%9F%E8%A8%80/","summary":"\u003cp\u003e大家好，我是运营部部长兼负责人之一。现为我一年来的工作进行总结以及发表感言。   地球又公转一周了，去年5月18日晚上，工作室换届了，当时是选举三个分别负责 财政、室内和室外的负责人。所谓室外，就是负责公关。就像嘉伟戏称的那样，我在官场打拼多年，在工作室众多成员中，的确是较为适合这一角色。于是那时候我成为了负责工作室与外界打交道的负责人。   然而，一个人的路上不可能总是一帆风顺的，工作室    也不例外。当环境改变的时候，必然要改变前行的姿势。于是，十五周年庆活动结束后的6月8日傍晚，我们在信工五楼外边开了个很长的会议。现在我仍然记得在那个被夕阳染红的天空下，大家围坐在空地讨论未来大计的场景。工作室现有的架构雏形和走进韶大就是在那个时候诞生的。也是在那天，运营部诞生了。6月8号，真是值得纪念的日子。   6月11日晚上，依旧是那片空地和那些人。我们要为之前讨论的架构选举负责人了。不同的是大家的心情比往常凝重了许多。毕竟架构是新的，项目也是新的，负责人选出来后就意味着我们要开始走一段未知的路了，面对未知的一切，人总是本能地排斥和恐惧。   终于轮到选举运营部部长，我举了手。尽管当时我并不喜欢这一个工作。但另一句话爬满了我的心，能力越大责任越大。我想我有责任去保护我们的工作室，我当时的想法就是保护，我想不到其他更贴切的词汇了。如果当时我退缩了，没有参选运营部部长，我想我是不能原谅自己的。庆幸的是，我没有。   然后是暑假留校参与走进韶大的开发。暑假过后便是开学，开学也就意味着招新快来了。对运营部的招新，说实话我心里是没有底的，会担心宣传是否做到位，是否会有人来面试运营部。庆幸的是，我等的人来了。   结合运营部的职能，我制定的考核内容是项目策划书和视频海报的制作。这里感谢林昊的参与，为运营部考核的顺利进行出了份力。现在想来，从二轮考核的老男孩视频到三轮在三楼机房答辩青涩的模样，都是属于我，属于运营部每位成员满满而美好的回忆。   我为我们运营部的小伙伴指导的并不多，这和我是一个开发人员有很大关系，很多时候都感觉分身乏术。请原谅我是一个不那么称职的部长。同时，我也很感激小伙伴对我的宽容和谅解以及他们在这8个月来为工作室默默付出的一切。   作为负责人之一，我已经尽自己的能力负了应有的责任。或许大家看到我们几个负责人也就是周日开开例会，看起来似乎没什么事干。实际上，我们私底下会为大大小小的事讨论几天，会关注最近工作室的动向并采取应有的措施，一些细微的举措都需要从各个方面考虑，推敲几番才能作出最后的决定。有时候想想，对比往届，我们几个大三的也是够拼的了。   这一年，我算是亲眼见证了工作室由单一的架构向多元化发展的轨迹。深夜看到润忠朋友圈的感慨，有些人总要离开，有些路总得自己走。离开了伞的孩子就会学着如何奔跑，后来也将会成为另一批人的伞。期待变得更强大的你们，我相信工作室在大家的努力下会变得越来越好。   过去任职的一年里，很高兴有大家的支持，帮助以及陪伴。以上是我的工作总结以及感言，谢谢大家！！！\u003c/p\u003e","title":"工作总结及感言"},{"content":"防火墙开启3306端口 首先检查你的防火墙是否开启了3306端口\nservice iptables status 如果没有看到3306的踪影，我们就要在iptables文件添加上去。\nvi /etc/sysconfig/iptables 可以看到文件中有22,80等几个端口已经开启了\n-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT 我们照着将3306添加上去就ok。\nservice iptables restart #注意要先执行重启，再save。如果先执行save的话，会重新加载之前的iptables，那么刚刚就白做了。 service iptables save 修改mysql数据库 mysql默认是不允许远程连接的，mysql数据库中user表的host字段默认是127.0.0.1和localhost。我们只要把其中一个记录的host改为%就可以了（%是一种匹配所有字符的通配符）。\nmysql\u0026gt;grant all privileges on databaseName.* to username@\u0026#39;%\u0026#39; identified by \u0026#39;123456\u0026#39;; mysql\u0026gt;flush privileges; 或者\nmysql\u0026gt;use mysql; mysql\u0026gt;update user set host =’%\u0026#39;where user =’root’; mysql\u0026gt;flush privileges; 至此，你可以在别的机子连接MySql了 ：）\n","permalink":"https://blog-foamzou-com.pages.dev/posts/allow-remote-connection-mysql/","summary":"\u003cp\u003e\u003cstrong\u003e防火墙开启3306端口\u003c/strong\u003e 首先检查你的防火墙是否开启了3306端口\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eservice iptables status\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e如果没有看到3306的踪影，我们就要在iptables文件添加上去。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003evi\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003eetc\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003esysconfig\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003eiptables\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e可以看到文件中有22,80等几个端口已经开启了\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-A INPUT -p tcp -m state --state NEW -m tcp --dport \u003cspan class=\"m\"\u003e22\u003c/span\u003e -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-A INPUT -p tcp -m state --state NEW -m tcp --dport \u003cspan class=\"m\"\u003e80\u003c/span\u003e -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-A INPUT -p tcp -m state --state NEW -m tcp --dport \u003cspan class=\"m\"\u003e443\u003c/span\u003e -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e我们照着将3306添加上去就ok。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eservice iptables restart \u003cspan class=\"c1\"\u003e#注意要先执行重启，再save。如果先执行save的话，会重新加载之前的iptables，那么刚刚就白做了。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eservice iptables save\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e修改mysql数据库\u003c/strong\u003e mysql默认是不允许远程连接的，mysql数据库中user表的host字段默认是127.0.0.1和localhost。我们只要把其中一个记录的host改为%就可以了（%是一种匹配所有字符的通配符）。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-mysql\" data-lang=\"mysql\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emysql\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"k\"\u003egrant\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eall\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eprivileges\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eon\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edatabaseName\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eto\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"o\"\u003e@\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;%\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eidentified\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eby\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;123456\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emysql\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"k\"\u003eflush\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eprivileges\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e或者\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-mysql\" data-lang=\"mysql\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emysql\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"k\"\u003euse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emysql\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emysql\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"k\"\u003eupdate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003euser\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eset\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ehost\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"err\"\u003e’\u003c/span\u003e\u003cspan class=\"o\"\u003e%\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;where user =’root’;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003emysql\u0026gt;flush privileges;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e至此，你可以在别的机子连接MySql了 ：）\u003c/p\u003e","title":"允许MySql远程连接"},{"content":"人不能没有书，在这个浮躁的时代。\n是的，现在是信息膨胀到要爆炸的时代，互联网给了我们很多便利，但也在很多方面从负面影响着青少年。\n当代大学生的平均阅读量我相信远不如十年前了。或许在宿舍里我们听到的往往是随着电脑屏幕上刀光剑影传出的砍杀声，是倚靠在床边翘着二郎腿刷着朋友圈发出的傻笑声，还有理工生昼夜不息地在黑乎乎的屏幕上敲着没有任何生气的代码，你很难看到他们读书的背影。\n现在的人总是太忙了。上班族白天高负荷上班，晚上为了减压夜夜笙歌，泡肥皂剧，刷朋友圈。学生忙着打游戏，不同专业的学生在忙自己领域上的学术。总之一句话，我很忙，没时间看书。\n我是一个喜欢读书并鼓励身边朋友同学读书的人。从我记事起，我就喜欢读各种各样的书籍，从诗歌、散文到小说、传记。小学初中最喜欢的礼物就是书籍，每逢六一或生日，我想要的礼物就是在书店安静地看看书并挑选一本买下来，我喜欢新书每一页淡淡的纸墨香味。每逢新学期，认识了新的同学，总会问对方家里有什么书，明天记得带来看看哦。这样又通过不同的人看到了很多不同的书。我很庆幸我有了看书的习惯，虽然阅读量还比较少，但这足以让我在这个世界有自己思考的一片天空。\n有的人会问，读书有什么用，你以前看的书现在还记得多少。我承认我记性是比较差的，要我把自己所看的书籍一一列出来并大概陈述每本的内容我想是做不到的，但这并非说之前的书就白看了。记得知乎上有个类似的问题，里面有很多很好的答案，其中有一个我很熟悉的小故事，原文是用英文写的。\n大概是讲一个村庄里住着祖孙二人，爷爷每天都坚持读书，孙子受爷爷影响，也尽自己的能力去阅读书籍。但有一天他忍不住了，问爷爷“我现在每天读书，但我无法真正地理解它，看多了也会忘记。那么读书有什么用呢？”爷爷没有直接回答，而是拿了一个装过煤的黑漆漆的竹篮，让孙子去打水。孙子跑到河边用竹篮打起水，发现水不停地往外面漏，所以他以最快的速度跑回去。但回去的时候，水漏完，竹篮已经是空的了。爷爷让孙子再去试试，就这样往返了几次，但结果依旧如前面一般。孙子终于抱怨道，“竹篮是不可能打到水的”。爷爷让他看看竹篮，发现原来又黑又脏的竹篮已经变得洁净如新了。看着孙子呆萌的样子，爷爷笑着说，“孩子，读书也是如此，你可能无法完全理解它，也会忘记之前所读的内容，但你只要用心阅读，让它在你脑海中畅游一番，它就会在不知不觉中净化了你的心灵”。\n看完这个故事，我相信读者心中应该有自己的想法了。书籍并不能直接带给我们任何实质的东西，但它能够让我们浮躁的心变得平静，在很多人利益熏心的时候不容易受到影响。古人说的腹有诗书气自华大概就是这个道理吧。\n即使生活再忙，即使你把很多东西都丢掉了，但书是不应该被忘记的。所以，请安静地读会书吧。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/reading-in-peace/","summary":"\u003cp\u003e人不能没有书，在这个浮躁的时代。\u003cbr\u003e\n    是的，现在是信息膨胀到要爆炸的时代，互联网给了我们很多便利，但也在很多方面从负面影响着青少年。\u003cbr\u003e\n当代大学生的平均阅读量我相信远不如十年前了。或许在宿舍里我们听到的往往是随着电脑屏幕上刀光剑影传出的砍杀声，是倚靠在床边翘着二郎腿刷着朋友圈发出的傻笑声，还有理工生昼夜不息地在黑乎乎的屏幕上敲着没有任何生气的代码，你很难看到他们读书的背影。\u003cbr\u003e\n    现在的人总是太忙了。上班族白天高负荷上班，晚上为了减压夜夜笙歌，泡肥皂剧，刷朋友圈。学生忙着打游戏，不同专业的学生在忙自己领域上的学术。总之一句话，我很忙，没时间看书。\u003cbr\u003e\n    我是一个喜欢读书并鼓励身边朋友同学读书的人。从我记事起，我就喜欢读各种各样的书籍，从诗歌、散文到小说、传记。小学初中最喜欢的礼物就是书籍，每逢六一或生日，我想要的礼物就是在书店安静地看看书并挑选一本买下来，我喜欢新书每一页淡淡的纸墨香味。每逢新学期，认识了新的同学，总会问对方家里有什么书，明天记得带来看看哦。这样又通过不同的人看到了很多不同的书。我很庆幸我有了看书的习惯，虽然阅读量还比较少，但这足以让我在这个世界有自己思考的一片天空。\u003cbr\u003e\n    有的人会问，读书有什么用，你以前看的书现在还记得多少。我承认我记性是比较差的，要我把自己所看的书籍一一列出来并大概陈述每本的内容我想是做不到的，但这并非说之前的书就白看了。记得知乎上有个类似的问题，里面有很多很好的答案，其中有一个我很熟悉的小故事，原文是用英文写的。\u003cbr\u003e\n    大概是讲一个村庄里住着祖孙二人，爷爷每天都坚持读书，孙子受爷爷影响，也尽自己的能力去阅读书籍。但有一天他忍不住了，问爷爷“我现在每天读书，但我无法真正地理解它，看多了也会忘记。那么读书有什么用呢？”爷爷没有直接回答，而是拿了一个装过煤的黑漆漆的竹篮，让孙子去打水。孙子跑到河边用竹篮打起水，发现水不停地往外面漏，所以他以最快的速度跑回去。但回去的时候，水漏完，竹篮已经是空的了。爷爷让孙子再去试试，就这样往返了几次，但结果依旧如前面一般。孙子终于抱怨道，“竹篮是不可能打到水的”。爷爷让他看看竹篮，发现原来又黑又脏的竹篮已经变得洁净如新了。看着孙子呆萌的样子，爷爷笑着说，“孩子，读书也是如此，你可能无法完全理解它，也会忘记之前所读的内容，但你只要用心阅读，让它在你脑海中畅游一番，它就会在不知不觉中净化了你的心灵”。\u003cbr\u003e\n    看完这个故事，我相信读者心中应该有自己的想法了。书籍并不能直接带给我们任何实质的东西，但它能够让我们浮躁的心变得平静，在很多人利益熏心的时候不容易受到影响。古人说的腹有诗书气自华大概就是这个道理吧。\u003cbr\u003e\n即使生活再忙，即使你把很多东西都丢掉了，但书是不应该被忘记的。所以，请安静地读会书吧。\u003c/p\u003e","title":"请安静地读会书"},{"content":"有不少朋友想要搭建个人博客，这里以我的个人网站为例说说吧。\n搭建类似本站的博客，你需要以下东西：域名、空间和网页程序。\n域名\nzoufeng.net这个域名是在西部数码购买的。国内比较有名的是新网、西部数码等代理商，国外的是godaddy。对于E文不好的同学，这里推荐选择国内的代理商。\n1.注册用户\n这个就没什么好说了，到某个域名代理网站按说明注册用户就好。\n2.选择并购买域名\n输入你喜欢的域名，点击查询。如下图，你就可以看到哪些域名你可以注册。对于建站来说，域名是挺便宜的，现在.com等主流域名首年只需要40+块，续费的话也不过是90+元/年。\n点击注册按钮后，会填写域名注册的相关资料，按你的实际情况填写就可以。\n3.域名解析。\n购买成功后，打开你的管理中心，选择域名管理，会在列表里看到你的域名。\n下图可以看到我有两个已经解析的记录。分别是一级域名(这里用@表示)和二级域名www。两个都作A记录指向我的主机IP，关于主机，下文会提及。你还可以添加多条记录，解析类型一般是A记录和CNAME(别名)记录。我买的主机是有提供IP的，所以我选择A记录就行，但有些主机商提供给你的是一个二级或三级域名，此时就需要你选择CNAME记录了。\n至此，你就完成了域名解析，只要DNS服务器更新后(几分钟-几小时不等)，你就可以用域名访问你的网站了。怎么知道是否解析成功呢？打开CMD，用ping命令。下图看到已经可以解析为指定的IP了。\n空间\n1.购买空间\n空间用来存放网站程序。你可选择虚拟主机、VPS或者云服务器。发表本文章时，本站是挂在美国VPS里的。现已挂在国内主机。\n三种空间各有优势，本文就不分析了。对于网络上免费的空间(像主机屋啥的)，这里不推荐大家使用，除非你是用于普通学习，没打算保存数据。\n阿里之前是有ACE云引擎(可以看做空间)免费体验的，现在免费账号貌似不提供了。 2015年4月阿里ACE已实现按量付费，这意味着你可以购买使用了。\n如果你和我一样没什么钱，建议买一个便宜VPS。关于我的VPS，可以参看这篇文章 /posts/move-to-vps/。\n2.绑定域名（搭建好LAMP环境后操作）\n还记得刚刚将域名解析为主机IP了吗？那只是做了将域名解析为IP的部分，当我在浏览器输入域名或IP的时候，谁来做出响应呢？此时就需要在主机绑定域名了。\n如果你购买的是虚拟主机或云服务器，你可以在你购买的网站打开管理主机或服务器的面板，将域名绑定。\n如果你买的是VPS，假设你安装的是Linux，那么你需要在你的web服务器配置文件(例如Apache的httpd.conf文件)配置绑定你的域名。\n安装网页程序\n目前主流的个人博客程序是用PHP写的WordPress。当然如果你喜欢折腾，自己写一个只属于你自己的博客也未尝不可。\n1.配置环境\n安装此程序前，如果你买的是VPS，需要先搭建好LAMP环境，请参考这篇文章 /posts/lnmp-lamp-lnmpa-install-by-one-press/\n虚拟主机不需要配置环境，提供商已经配置好了。\n2.下载WP\n首先到官网下载最新版本的WordPress，下载后是一个压缩包。\n3.将WP文件上传到主机\n如果你的是虚拟主机且不支持解压操作，那么你先在本地解压。再利用FTP上传工具上传到主机。VPS的话，为了提高上传效率，直接将zip包通过FTP上传到指定目录，然后用unzip命令解压就可以。FTP工具，这里推荐使用FileZilla.\n","permalink":"https://blog-foamzou-com.pages.dev/posts/how-to-install-your-blog/","summary":"\u003cp\u003e有不少朋友想要搭建个人博客，这里以我的个人网站为例说说吧。\u003c/p\u003e\n\u003cp\u003e搭建类似本站的博客，你需要以下东西：域名、空间和网页程序。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e域名\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ezoufeng.net这个域名是在西部数码购买的。国内比较有名的是新网、西部数码等代理商，国外的是godaddy。对于E文不好的同学，这里推荐选择国内的代理商。\u003c/p\u003e\n\u003cp\u003e1.注册用户\u003c/p\u003e\n\u003cp\u003e这个就没什么好说了，到某个域名代理网站按说明注册用户就好。\u003c/p\u003e\n\u003cp\u003e2.选择并购买域名\u003c/p\u003e\n\u003cp\u003e输入你喜欢的域名，点击查询。如下图，你就可以看到哪些域名你可以注册。对于建站来说，域名是挺便宜的，现在.com等主流域名首年只需要40+块，续费的话也不过是90+元/年。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/how-to-install-your-blog/20150506160634_55252.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"QQ截图20141207235743.png\" loading=\"lazy\" src=\"file://C:/Users/Administrator/AppData/Local/YNote/data/282332576@qq.com/41275dfebd6440668f3e8da12d0c7095/qq%E6%88%AA%E5%9B%BE20141207235743.png\"\u003e\u003c/p\u003e\n\u003cp\u003e点击注册按钮后，会填写域名注册的相关资料，按你的实际情况填写就可以。\u003c/p\u003e\n\u003cp\u003e3.域名解析。\u003c/p\u003e\n\u003cp\u003e购买成功后，打开你的管理中心，选择域名管理，会在列表里看到你的域名。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/how-to-install-your-blog/20150506160720_21504.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"搜狗截图20141208000957.png\" loading=\"lazy\" src=\"file://C:/Users/Administrator/AppData/Local/YNote/data/282332576@qq.com/1d1926faff264eae874b3b620ee543da/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE20141208000957.png\"\u003e\u003c/p\u003e\n\u003cp\u003e下图可以看到我有两个已经解析的记录。分别是一级域名(这里用@表示)和二级域名www。两个都作A记录指向我的主机IP，关于主机，下文会提及。你还可以添加多条记录，解析类型一般是A记录和CNAME(别名)记录。我买的主机是有提供IP的，所以我选择A记录就行，但有些主机商提供给你的是一个二级或三级域名，此时就需要你选择CNAME记录了。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"搜狗截图20141208001230.png\" loading=\"lazy\" src=\"file://C:/Users/Administrator/AppData/Local/YNote/data/282332576@qq.com/c9a326431f6846f3816e9ead3abcbb96/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE20141208001230.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/how-to-install-your-blog/20150506160735_23436.png\"\u003e\u003c/p\u003e\n\u003cp\u003e至此，你就完成了域名解析，只要DNS服务器更新后(几分钟-几小时不等)，你就可以用域名访问你的网站了。怎么知道是否解析成功呢？打开CMD，用ping命令。下图看到已经可以解析为指定的IP了。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"搜狗截图20141208002308.png\" loading=\"lazy\" src=\"file://C:/Users/Administrator/AppData/Local/YNote/data/282332576@qq.com/8794780a74a84ac2935ca221aabca6f0/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE20141208002308.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/posts/how-to-install-your-blog/20150506160747_14777.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e空间\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.购买空间\u003c/p\u003e\n\u003cp\u003e空间用来存放网站程序。你可选择虚拟主机、VPS或者云服务器。发表本文章时，本站是挂在美国VPS里的。现已挂在国内主机。\u003c/p\u003e\n\u003cp\u003e三种空间各有优势，本文就不分析了。对于网络上免费的空间(像主机屋啥的)，这里不推荐大家使用，除非你是用于普通学习，没打算保存数据。\u003c/p\u003e\n\u003cp\u003e阿里之前是有ACE云引擎(可以看做空间)免费体验的，现在免费账号貌似不提供了。    2015年4月阿里ACE已实现按量付费，这意味着你可以购买使用了。\u003c/p\u003e\n\u003cp\u003e如果你和我一样没什么钱，建议买一个便宜VPS。关于我的VPS，可以参看这篇文章 \u003ca href=\"/posts/move-to-vps/\"\u003e/posts/move-to-vps/\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e2.绑定域名（搭建好LAMP环境后操作）\u003c/p\u003e\n\u003cp\u003e还记得刚刚将域名解析为主机IP了吗？那只是做了将域名解析为IP的部分，当我在浏览器输入域名或IP的时候，谁来做出响应呢？此时就需要在主机绑定域名了。\u003c/p\u003e\n\u003cp\u003e如果你购买的是虚拟主机或云服务器，你可以在你购买的网站打开管理主机或服务器的面板，将域名绑定。\u003c/p\u003e\n\u003cp\u003e如果你买的是VPS，假设你安装的是Linux，那么你需要在你的web服务器配置文件(例如Apache的httpd.conf文件)配置绑定你的域名。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e安装网页程序\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e目前主流的个人博客程序是用PHP写的WordPress。当然如果你喜欢折腾，自己写一个只属于你自己的博客也未尝不可。\u003c/p\u003e\n\u003cp\u003e1.配置环境\u003c/p\u003e\n\u003cp\u003e安装此程序前，如果你买的是VPS，需要先搭建好LAMP环境，请参考这篇文章 \u003ca href=\"/posts/lnmp-lamp-lnmpa-install-by-one-press/\"\u003e/posts/lnmp-lamp-lnmpa-install-by-one-press/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e虚拟主机不需要配置环境，提供商已经配置好了。\u003c/p\u003e\n\u003cp\u003e2.下载WP\u003c/p\u003e\n\u003cp\u003e首先到官网下载最新版本的WordPress，下载后是一个压缩包。\u003c/p\u003e\n\u003cp\u003e3.将WP文件上传到主机\u003c/p\u003e\n\u003cp\u003e如果你的是虚拟主机且不支持解压操作，那么你先在本地解压。再利用FTP上传工具上传到主机。VPS的话，为了提高上传效率，直接将zip包通过FTP上传到指定目录，然后用unzip命令解压就可以。FTP工具，这里推荐使用FileZilla.\u003c/p\u003e","title":"如何搭建个人博客"},{"content":"自从TP升级为3.2.3升级后，默认对数据库字段进行全部小写化。官方是这么解释的：\n规范起见，默认的数据库驱动类设置了 字段名强制转换为小写，如果你的数据表字段名采用大小写混合方式的话，需要在配置文件中增加如下设置：\n\u0026#39;DB_PARAMS\u0026#39; =\u0026gt; array(\\PDO::ATTR_CASE =\u0026gt; \\PDO::CASE_NATURAL), ","permalink":"https://blog-foamzou-com.pages.dev/posts/thinkphp3-2-3%E4%B8%AD%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AD%97%E6%AE%B5%E5%A4%A7%E5%B0%8F%E5%86%99%E9%97%AE%E9%A2%98/","summary":"\u003cp\u003e自从TP升级为3.2.3升级后，默认对数据库字段进行全部小写化。官方是这么解释的：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e规范起见，默认的数据库驱动类设置了 字段名强制转换为小写，如果你的数据表字段名采用大小写混合方式的话，需要在配置文件中增加如下设置：\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e\u0026#39;DB_PARAMS\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"k\"\u003earray\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003e\\PDO\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"na\"\u003eATTR_CASE\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003e\\PDO\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"na\"\u003eCASE_NATURAL\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"ThinkPHP3.2.3中数据库字段大小写问题"},{"content":"近来，工作室每个人都写下自己当年考核一个月的心得。想起来当时还真是什么都没有留下呢。趁现在记忆还没有被时光抹掉，记录下来吧。\n说起第一次，那是2013年花满枝桠的季节，我在校道与环创电脑工作室招新的横幅相遇了。这不是那个很厉害的工作室吗？去试试吧？不要，听说很难进的。去试试吧，万一进了呢？“梦想还是要有的，万一实现了呢”，两年后这句话在互联网上火了起来，而我恰恰可以为之佐证。\n有些场景是一辈子都无法忘却的，黎灿307是我与环创真正相遇的地方。和班里的小伙伴相约来到了307，已经有几位师兄师姐在门外等待面试者报名。和大部分面试者一样，那时候的我是个小白，不懂C++，C语言也没掌握得很好，好在我基础不算差，轻松过了面试后也勉强过了二轮机试。第三轮考核当时是用Asp.net制作一个新闻发布系统，完全不懂HTML、C#和MSSqlServer的我也只能硬着头皮上了。有谁不是从零开始的呢？\n接下来的一个月，我开始很早起床，早到工作室的门还没开，伴随着孤单北半球的歌声开始等候；我开始很晚回去，晚到一楼街舞的声音开始消失，工作室只剩下我一个人和键盘孤独的敲击声，直至11点不忍心地反锁上工作室的门。有时候小跑到宿舍门口发现已经关门。\n那时候我开始学会怎样自学，怎么去调试一段程序。尽管有时候比较多疑问，师兄们亦会耐心地解答。我开始喜欢上这里，我愈发努力，甚至晚上做梦会梦到coding时遇到的难题。\n每个周日晚上都有例会，除了考察我们的学习情况，师兄师姐们还会分享他们正在学习的技术点。当时觉得这群大神好厉害，我也要成为这样的人。\n随着考核验收作品时间的逼近，我发现自己做得不够，页面还是那么龊，甚至连update,delete等功能都还没开始写。3月29验收作品并准备一场机试，然后师兄让我们先回去，稍后会通知结果。\n晚上师姐打来电话，还没接电话我就激动得不行，\u0026ldquo;恭喜你\u0026quot;已经被我假想了很多次，但\u0026quot;很抱歉\u0026quot;把我狠狠地拉回了现实。放下手机的我麻木地继续写着一篇链表教程，只是没有了前一分钟的热情。\n第二天清晨，春天的早上袭人以阵阵凉意。我怀揣着不一样的心情到了工作室，这次我是来收拾自己的书本回去的。磨蹭磨蹭收拾好，跟师兄说了声再见，准备走出门口时没忍住，我跟文杰师兄说我还是无法理解，我想知道自己没有被通过的原因。具体的对话已经不记得了，但很清楚地记得，那次是我记忆中文杰师兄说得最长的话，然后让我好好学习，下次再来。我说我会的。于是，后来每每听到孤单北半球都会想起这一个月关于环创的记忆。\n半年后。\n相比第一次，我早早了解到了环创的招新时间。地点仍然是那个叫307的地方，只是我的心态不一样了，不会过于患得患失。一轮和二轮结束后，我收到了第三轮考核的通知，依旧是新闻发布系统。作为第二次来考核的成员，我知道要求肯定会比较高，但我能做的只是尽力去做好它，其他的一切我控制不了。这次考核过程中工作室突发情况，不得不从黎灿搬到信工5楼。从师兄们收拾工作室物品的时候我看到了他们的各种不舍，同时我也感受到环创在黎灿307的历史痕迹原来那么重。现在到黎灿楼，有时还会特地走过去看看锁着的307的门，回忆往脑子汹涌袭来。\n搬到信工后的那段时间，也刚好迎来了我所在部门最忙的时候，我是助学部的，不得不天天往办公室跑，收集各年级的审批表，这些文件是错一个字，打偏几毫米都不可以的。有时候晚上熬夜核对、制作表格到凌晨三四点。甚至逃了几节课来处理部门的文件。有时候在工作室刚打开电脑敲了几行代码，一个电话我就得中断某个关键字的拼写，跑到办公室将注意力转到审批表那边。这种压力下我几度怀疑自己能不能扛住28小时的考验，我甚至想过放弃，“你个SB，这点小事都扛不住，你还叫邹锋吗？”我似乎条件反射般反驳了自己的想法。还好我部门的小伙伴兼我的舍友很理解我的情况，有好几次收集表单都让我快去忙我的考核，那边由他继续忙着，很感激我的小伙伴。\n任何杀不死我的，都只能让我变得更强大。面对你没有尝试过的东西，你不能说不行。若不尽力，又怎能知道自己的极限到底在哪里呢？我跑步的时候，也是这么跟自己说的。我学会了如何在强压力下学习和工作，或许我的学习效率不是最高的，但我有与别人不一样的毅力和一颗恒心，这已经足够了。\n感谢这两段一样却又不一样的岁月，留下斑驳的剪影与大家共勉，以上。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/something-in-two-months/","summary":"\u003cp\u003e近来，工作室每个人都写下自己当年考核一个月的心得。想起来当时还真是什么都没有留下呢。趁现在记忆还没有被时光抹掉，记录下来吧。\u003cbr\u003e\n    说起第一次，那是2013年花满枝桠的季节，我在校道与环创电脑工作室招新的横幅相遇了。这不是那个很厉害的工作室吗？去试试吧？不要，听说很难进的。去试试吧，万一进了呢？“梦想还是要有的，万一实现了呢”，两年后这句话在互联网上火了起来，而我恰恰可以为之佐证。\u003c/p\u003e\n\u003cp\u003e    有些场景是一辈子都无法忘却的，黎灿307是我与环创真正相遇的地方。和班里的小伙伴相约来到了307，已经有几位师兄师姐在门外等待面试者报名。和大部分面试者一样，那时候的我是个小白，不懂C++，C语言也没掌握得很好，好在我基础不算差，轻松过了面试后也勉强过了二轮机试。第三轮考核当时是用Asp.net制作一个新闻发布系统，完全不懂HTML、C#和MSSqlServer的我也只能硬着头皮上了。有谁不是从零开始的呢？\u003c/p\u003e\n\u003cp\u003e    接下来的一个月，我开始很早起床，早到工作室的门还没开，伴随着孤单北半球的歌声开始等候；我开始很晚回去，晚到一楼街舞的声音开始消失，工作室只剩下我一个人和键盘孤独的敲击声，直至11点不忍心地反锁上工作室的门。有时候小跑到宿舍门口发现已经关门。\u003c/p\u003e\n\u003cp\u003e    那时候我开始学会怎样自学，怎么去调试一段程序。尽管有时候比较多疑问，师兄们亦会耐心地解答。我开始喜欢上这里，我愈发努力，甚至晚上做梦会梦到coding时遇到的难题。\u003c/p\u003e\n\u003cp\u003e     每个周日晚上都有例会，除了考察我们的学习情况，师兄师姐们还会分享他们正在学习的技术点。当时觉得这群大神好厉害，我也要成为这样的人。\u003c/p\u003e\n\u003cp\u003e    随着考核验收作品时间的逼近，我发现自己做得不够，页面还是那么龊，甚至连update,delete等功能都还没开始写。3月29验收作品并准备一场机试，然后师兄让我们先回去，稍后会通知结果。\u003c/p\u003e\n\u003cp\u003e    晚上师姐打来电话，还没接电话我就激动得不行，\u0026ldquo;恭喜你\u0026quot;已经被我假想了很多次，但\u0026quot;很抱歉\u0026quot;把我狠狠地拉回了现实。放下手机的我麻木地继续写着一篇链表教程，只是没有了前一分钟的热情。\u003c/p\u003e\n\u003cp\u003e    第二天清晨，春天的早上袭人以阵阵凉意。我怀揣着不一样的心情到了工作室，这次我是来收拾自己的书本回去的。磨蹭磨蹭收拾好，跟师兄说了声再见，准备走出门口时没忍住，我跟文杰师兄说我还是无法理解，我想知道自己没有被通过的原因。具体的对话已经不记得了，但很清楚地记得，那次是我记忆中文杰师兄说得最长的话，然后让我好好学习，下次再来。我说我会的。于是，后来每每听到孤单北半球都会想起这一个月关于环创的记忆。\u003c/p\u003e\n\u003cp\u003e     半年后。\u003c/p\u003e\n\u003cp\u003e    相比第一次，我早早了解到了环创的招新时间。地点仍然是那个叫307的地方，只是我的心态不一样了，不会过于患得患失。一轮和二轮结束后，我收到了第三轮考核的通知，依旧是新闻发布系统。作为第二次来考核的成员，我知道要求肯定会比较高，但我能做的只是尽力去做好它，其他的一切我控制不了。这次考核过程中工作室突发情况，不得不从黎灿搬到信工5楼。从师兄们收拾工作室物品的时候我看到了他们的各种不舍，同时我也感受到环创在黎灿307的历史痕迹原来那么重。现在到黎灿楼，有时还会特地走过去看看锁着的307的门，回忆往脑子汹涌袭来。\u003c/p\u003e\n\u003cp\u003e    搬到信工后的那段时间，也刚好迎来了我所在部门最忙的时候，我是助学部的，不得不天天往办公室跑，收集各年级的审批表，这些文件是错一个字，打偏几毫米都不可以的。有时候晚上熬夜核对、制作表格到凌晨三四点。甚至逃了几节课来处理部门的文件。有时候在工作室刚打开电脑敲了几行代码，一个电话我就得中断某个关键字的拼写，跑到办公室将注意力转到审批表那边。这种压力下我几度怀疑自己能不能扛住28小时的考验，我甚至想过放弃，“你个SB，这点小事都扛不住，你还叫邹锋吗？”我似乎条件反射般反驳了自己的想法。还好我部门的小伙伴兼我的舍友很理解我的情况，有好几次收集表单都让我快去忙我的考核，那边由他继续忙着，很感激我的小伙伴。\u003c/p\u003e\n\u003cp\u003e    任何杀不死我的，都只能让我变得更强大。面对你没有尝试过的东西，你不能说不行。若不尽力，又怎能知道自己的极限到底在哪里呢？我跑步的时候，也是这么跟自己说的。我学会了如何在强压力下学习和工作，或许我的学习效率不是最高的，但我有与别人不一样的毅力和一颗恒心，这已经足够了。\u003c/p\u003e\n\u003cp\u003e    感谢这两段一样却又不一样的岁月，留下斑驳的剪影与大家共勉，以上。\u003c/p\u003e","title":"两个月的剪影"},{"content":"如题，这是一本书，一本值得所有不懂如何合理利用时间的人看的书。 昨天突然想起上学期借的一本书还没有还，上图书馆系统查了下逾期时间，顺便检索上学期推荐学校购买的书是否有到。出乎意料地，这本暗时间出现在了结果目录里。很遗憾地看到，有两本已经被借了，仅剩一本安静地躺在教师参考书库的书架上。当然，我应当为还存在一本感到庆幸。 下午的阳光刚刚好，把那本逾期的书还了。上到6楼教师参考书库，很顺利地找到了那本黑色封面的书，并把它带到3楼，准备今天下午安静地看会书，without anything. 在三楼找了张桌子坐下，将暗时间平铺在方桌，手机静音反扣在桌面。就这样，我开始了一场2小时30分钟的阅读，期间没有任何的思想转移，以至于晚饭时我怀疑不间断阅读消耗的能量是否有那么大。 书的封面是一个沙漏，文中解释得很好。 “我们每个人的生命就像一个个沙漏，每个人的沙漏里装的沙子总量是相当的。不同的是，有的人的沙漏颈部较细，有些人的沙漏颈部较粗。哪些颈部较细的沙漏能够抓住每一粒时间之沙，虽然沙子总量一样，但相对却拥有更长的生命” 我们大学都是四年，但显然每个人对四年的感觉都是不一样的。对时间利用得当的人会在无形中比他人多了不止一倍的时间，这就是所谓的暗时间。对于我来说，无聊老师和无聊的课就是很长的暗时间，只是有人发现并利用了起来。 书中强调“能够迅速进入专注状态，以及能够长期保持专注状态，是高效学习的两个最重要的习惯”。这些大道理是老生常谈了，但没有为此付诸行动的人很多。我下午尝试将连续的大段时间投入其中，这种感觉真的很爽，直至现在我仍然保持愉悦的状态。 兴趣遍地都是，专注和持之以恒才是真正稀缺的。这句话说得很好，我从小自认为兴趣爱好相当广泛，好奇心特别重，窃以为在很多方面都有一定的天赋，但兴趣往往持续不了多久，大多是丢了捡回来，捡回来没多久又丢掉。所以我现在没什么特别长的地方也是理所当然的。上了大学后，学的是计算机相关的知识，喜欢的领域自然也是异常广泛，直至加入校工作室后，这方面有所收敛。 说起来，写作也是我广大爱好海洋中其中一朵浪花。最近刷知乎，有个人写的文字我特别赞同。他说，“码字是一种闲情逸致，当我想要放松的时候，我会从码字、看电影、听歌、读书、散步、吃大餐、打星际、出门做个好事、看别人撕个大逼里选一样翻个牌，偶尔也会拿着美食边吃边听歌边散步； 码字可以由着我的性子来，想写什么写什么，写个隐晦的哪怕只有一个人能看懂也ok。有人赞我我开心，有人骂我我也看看，骂的够痛快我读起来都觉得解气的，给他点个赞然后把句子摘录下来。”当自己并非对读者投其所好而写文章时，写什么都是很开心的啊。It\u0026rsquo;s just free time for me. 书写是为了更好地思考，只有将你的所思所想用语言表达出来，才能说明相应的知识是自己真正懂得的，若是不懂则能在书写的过程中思考，从而加深在某一方面的领悟。所以很多时候，不要天真地以为自己懂了，please write in paper. 今天下午的不间断阅读给我带来的精神享受才是本篇文章主要想表达的，并不局限于这本书。但是我很感谢《暗时间》给我的人生带来的指引作用。 ","permalink":"https://blog-foamzou-com.pages.dev/posts/dark-time/","summary":"\u003cp\u003e如题，这是一本书，一本值得所有不懂如何合理利用时间的人看的书。 昨天突然想起上学期借的一本书还没有还，上图书馆系统查了下逾期时间，顺便检索上学期推荐学校购买的书是否有到。出乎意料地，这本暗时间出现在了结果目录里。很遗憾地看到，有两本已经被借了，仅剩一本安静地躺在教师参考书库的书架上。当然，我应当为还存在一本感到庆幸。 下午的阳光刚刚好，把那本逾期的书还了。上到6楼教师参考书库，很顺利地找到了那本黑色封面的书，并把它带到3楼，准备今天下午安静地看会书，without anything. 在三楼找了张桌子坐下，将暗时间平铺在方桌，手机静音反扣在桌面。就这样，我开始了一场2小时30分钟的阅读，期间没有任何的思想转移，以至于晚饭时我怀疑不间断阅读消耗的能量是否有那么大。 书的封面是一个沙漏，文中解释得很好。 “我们每个人的生命就像一个个沙漏，每个人的沙漏里装的沙子总量是相当的。不同的是，有的人的沙漏颈部较细，有些人的沙漏颈部较粗。哪些颈部较细的沙漏能够抓住每一粒时间之沙，虽然沙子总量一样，但相对却拥有更长的生命” 我们大学都是四年，但显然每个人对四年的感觉都是不一样的。对时间利用得当的人会在无形中比他人多了不止一倍的时间，这就是所谓的暗时间。对于我来说，无聊老师和无聊的课就是很长的暗时间，只是有人发现并利用了起来。 书中强调“能够迅速进入专注状态，以及能够长期保持专注状态，是高效学习的两个最重要的习惯”。这些大道理是老生常谈了，但没有为此付诸行动的人很多。我下午尝试将连续的大段时间投入其中，这种感觉真的很爽，直至现在我仍然保持愉悦的状态。 兴趣遍地都是，专注和持之以恒才是真正稀缺的。这句话说得很好，我从小自认为兴趣爱好相当广泛，好奇心特别重，窃以为在很多方面都有一定的天赋，但兴趣往往持续不了多久，大多是丢了捡回来，捡回来没多久又丢掉。所以我现在没什么特别长的地方也是理所当然的。上了大学后，学的是计算机相关的知识，喜欢的领域自然也是异常广泛，直至加入校工作室后，这方面有所收敛。 说起来，写作也是我广大爱好海洋中其中一朵浪花。最近刷知乎，有个人写的文字我特别赞同。他说，“码字是一种闲情逸致，当我想要放松的时候，我会从码字、看电影、听歌、读书、散步、吃大餐、打星际、出门做个好事、看别人撕个大逼里选一样翻个牌，偶尔也会拿着美食边吃边听歌边散步； 码字可以由着我的性子来，想写什么写什么，写个隐晦的哪怕只有一个人能看懂也ok。有人赞我我开心，有人骂我我也看看，骂的够痛快我读起来都觉得解气的，给他点个赞然后把句子摘录下来。”当自己并非对读者投其所好而写文章时，写什么都是很开心的啊。It\u0026rsquo;s just free time for me. 书写是为了更好地思考，只有将你的所思所想用语言表达出来，才能说明相应的知识是自己真正懂得的，若是不懂则能在书写的过程中思考，从而加深在某一方面的领悟。所以很多时候，不要天真地以为自己懂了，please write in paper. 今天下午的不间断阅读给我带来的精神享受才是本篇文章主要想表达的，并不局限于这本书。但是我很感谢《暗时间》给我的人生带来的指引作用。 \u003ca href=\"microMsg.1429254396630.jpg\"\u003e\u003cimg alt=\"microMsg.1429254396630\" loading=\"lazy\" src=\"/posts/dark-time/microMsg.1429254396630-1024x576.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e","title":"暗时间"},{"content":"PHP Data Objects(PDO)是随着PHP5.1发布开始附带的，所以不用担心你的PHP环境上是否支持PDO扩展。\n该扩展默认是开启的，如果你的代码跑不起来，应该去phpinfo看看是否已经开启PDO扩展。\nThinkPHP从3.2.3版本开始，数据库类和驱动采用PDO重写了。但我在学TP之前还不知道PDO，还在用那个要被淘汰的mysql扩展。\n下面是PDO常用的方法\nPDO::query() 一般用于SELECT操作\nPDO::exec() 一般用于INSERT、UPDATE等不需要返回记录集的操作\nPDO::prepare() 预处理操作，需要通过创建的statement-\u0026gt;execute()来执行经过预处理的SQL语句\nPDO::lastInsertId() 返回上次插入的自增ID\nPDOStatement::execute() 执行通过PDO::prepare()预处理过的SQL语句\nPDOStatement::fetch() 返回一条记录\nPDOStatement::fetchAll() 返回一个包含结果集中所有行的数组\nPDOStatement::fetchColumn() 返回记录集中第一行的第一个字段\nPDOStatement::rowCount() 返回受 DELETE、INSERT、 或 UPDATE 语句影响的行数。对PDO::exec()方法和SELECT操作无效。\n操作MySql的实例\n\u0026lt;?php $pdo = new PDO(\u0026#34;mysql:host=localhost;dbname=数据库名\u0026#34;,\u0026#34;账号\u0026#34;,\u0026#34;密码\u0026#34;); $rs = $pdo-\u0026gt;query(\u0026#34;SELECT * FROM table\u0026#34;); foreach($rs as $row) { $users[] = $row; } $stmt = $pdo-\u0026gt;prepare(\u0026#34;INSERT INTO table VALUES(:name,:sex,:age)\u0026#34;); $stmt-\u0026gt;bindParam(\u0026#34;:name\u0026#34;,$name); $stmt-\u0026gt;bindParam(\u0026#34;:sex\u0026#34;,$sex); $stmt-\u0026gt;bindParam(\u0026#34;:age\u0026#34;,$age); $stmt-\u0026gt;execute(); ?\u0026gt; ","permalink":"https://blog-foamzou-com.pages.dev/posts/pdo%E5%AD%A6%E4%B9%A0-step-1/","summary":"\u003cp\u003ePHP Data Objects(PDO)是随着PHP5.1发布开始附带的，所以不用担心你的PHP环境上是否支持PDO扩展。\u003c/p\u003e\n\u003cp\u003e该扩展默认是开启的，如果你的代码跑不起来，应该去phpinfo看看是否已经开启PDO扩展。\u003c/p\u003e\n\u003cp\u003eThinkPHP从3.2.3版本开始，数据库类和驱动采用PDO重写了。但我在学TP之前还不知道PDO，还在用那个要被淘汰的mysql扩展。\u003c/p\u003e\n\u003cp\u003e下面是PDO常用的方法\u003c/p\u003e\n\u003cp\u003ePDO::query()                                         一般用于SELECT操作\u003c/p\u003e\n\u003cp\u003ePDO::exec()                                           一般用于INSERT、UPDATE等不需要返回记录集的操作\u003c/p\u003e\n\u003cp\u003ePDO::prepare()                                     预处理操作，需要通过创建的statement-\u0026gt;execute()来执行经过预处理的SQL语句\u003c/p\u003e\n\u003cp\u003ePDO::lastInsertId()                                返回上次插入的自增ID\u003c/p\u003e\n\u003cp\u003ePDOStatement::execute()                     执行通过PDO::prepare()预处理过的SQL语句\u003c/p\u003e\n\u003cp\u003ePDOStatement::fetch()                         返回一条记录\u003c/p\u003e\n\u003cp\u003ePDOStatement::fetchAll()                     返回一个包含结果集中所有行的数组\u003c/p\u003e\n\u003cp\u003ePDOStatement::fetchColumn()            返回记录集中第一行的第一个字段\u003c/p\u003e\n\u003cp\u003ePDOStatement::rowCount()                 返回受 DELETE、INSERT、 或 UPDATE 语句影响的行数。对PDO::exec()方法和SELECT操作无效。\u003c/p\u003e\n\u003cp\u003e操作MySql的实例\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"nx\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$pdo\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003ePDO\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mysql:host=localhost;dbname=数据库名\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;账号\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;密码\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$rs\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$pdo\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003equery\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;SELECT * FROM table\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eforeach\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$rs\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"nv\"\u003e$row\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003e$users\u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$row\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$stmt\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$pdo\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eprepare\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;INSERT INTO table VALUES(:name,:sex,:age)\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$stmt\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003ebindParam\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;:name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nv\"\u003e$name\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$stmt\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003ebindParam\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;:sex\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nv\"\u003e$sex\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$stmt\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003ebindParam\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;:age\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nv\"\u003e$age\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$stmt\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"na\"\u003eexecute\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"PDO学习 step 1"},{"content":"我是一个游游荡荡，经常被互联网上的各种链接引得跳来跳去的人。今天的引导流是这样的： 学习PHP的PDO -\u0026gt; 到博客写个相关的技术文章 -\u0026gt; WP后台再次注意到可以升级版本 -\u0026gt;先去万网备份数据 -\u0026gt;万网首页再次看到关于企业邮箱的注册 -\u0026gt;注册时，要让指定的域名解析MX和其他记录到万网邮箱 -\u0026gt; 前往Namecheap Ok，以上就是我今天的时光流。 话说到我登录了Namecheap，看到如往常一样龊的管理面板。但在记录解析处没有看到MX类型，百度之，看到某网友在11年也遇到类似我的问题，是在线和客服解决的。哥不要搜索引擎了，哥就是要和在线客服用我的烂渣英文对话！！！于是就有了本文最下面的谈话记录。 不墨迹了，说正事。首先找到你的域名管理面板。你会找到你熟悉的解析面板 然而。MAIL SETTINGS就在下面的地方。 选择 User (Mail Server\u0026rsquo;s Host Name Required) 下面的 I will specify my own MX records。然后保存就会出现下面的填写表单了。 附上我的烂E文对白~~ Your Question: Where is the domain MX RECORD，I can\u0026rsquo;t find this.Thx in advance Please wait, an operator will be with you shortly. You are now chatting with Alexandra Kr. - Domains Support 16:36Alexandra Kr.:Hello Foam! Thank you for contacting our Live Chat Support! Would you please provide me with the domain name? 16:36foam chou:zoufeng.me 16:36Alexandra Kr.:Thank you for the provided information. Please hold on. 16:36foam chou:ok 16:37Alexandra Kr.:As far as I see, your domain has the following MX records: 16:37Alexandra Kr.:zoufeng.me. 1800 IN MX 10 mx1.privateemail.com. zoufeng.me. 1800 IN MX 10 mx2.privateemail.com. 16:38foam chou:I wanna modify this 16:39foam chou:because I start the service of private mail by mistake,just now 16:39foam chou:how can I close the service of private mail? 16:40Alexandra Kr.:Please hold on, Foam. 16:42Alexandra Kr.:In order to set your custom MX records, you need to refer to the following article \u0026ndash;https://www.namecheap.com/support/knowledgebase/article.aspx/322/78/how-can-i-setup-mx-record-for-my-domain 16:42Alexandra Kr.:As for private email, do you want to cancel it or you use a free trial private email? 16:43foam chou:I want to cancel it 16:44foam chou:Can I use the private mail by othername.zoufeng.me rather mail.zoufeng.me ? 16:44Alexandra Kr.:Please let me transfer our chat session to our Hosting department for further assistance. 16:45foam chou:OK Eugene St. has joined the conversation. 16:45Eugene St.:Hello, I will assist you further 16:45Eugene St.:Please give me a few minutes to check your previous conversation. Alexandra Kr. has left the conversation. 16:45foam chou:Thx for your coming 16:47Eugene St.:Thank you for your patience 16:49Eugene St.:So, as I understand you would like to remove Private Email MX records and moreover cancel the subscription, am I right? 16:49foam chou:Yes 16:50Eugene St.:Ler me verify your account ownership before I can cancel the subscription 16:50Eugene St.:Please provide me with your Namecheap username and your Support PIN. You can find it here: https://manage.www.namecheap.com/myaccount/modify-profile-supportsettings.aspx 16:50foam chou:select the radio \u0026ldquo;User (Mail Server\u0026rsquo;s Host Name Required) \u0026ldquo;,right? 16:51Eugene St.:Would you like to set different MX records? 16:52foam chou:yes,I wanna transer it to other mail server 16:53Eugene St.:In this case please select I will specify my own MX records radio button 16:53Eugene St.:Also, please provide the verification details so I can cancel the subscription 16:54foam chou:I want to what is the subscription?private mail? 16:54foam chou:I want to know what is the subscription?private mail? 16:57Eugene St.:Yes, email account created with Private Email service is called subscription 16:58foam chou:My Support Pin is 3298 16:59foam chou:my username is foam 17:00Eugene St.:Thank you, please give me 5-7 minutes to cancel the subscription 17:00foam chou:Okay 17:01Eugene St.:The subscription has been canceled. 17:01Eugene St.:The subscription has been canceled. 17:01Eugene St.:The subscription has been canceled. 17:01Eugene St.:The subscription has been canceled. 17:03foam chou:thx for your help :)\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E5%9C%A8namecheap%E8%A7%A3%E6%9E%90%E9%82%AE%E7%AE%B1/","summary":"\u003cp\u003e我是一个游游荡荡，经常被互联网上的各种链接引得跳来跳去的人。今天的引导流是这样的： 学习PHP的PDO -\u0026gt; 到博客写个相关的技术文章 -\u0026gt; WP后台再次注意到可以升级版本 -\u0026gt;先去万网备份数据 -\u0026gt;万网首页再次看到关于企业邮箱的注册 -\u0026gt;注册时，要让指定的域名解析MX和其他记录到万网邮箱 -\u0026gt; 前往Namecheap Ok，以上就是我今天的时光流。 话说到我登录了Namecheap，看到如往常一样龊的管理面板。但在记录解析处没有看到MX类型，百度之，看到某网友在11年也遇到类似我的问题，是在线和客服解决的。哥不要搜索引擎了，哥就是要和在线客服用我的烂渣英文对话！！！于是就有了本文最下面的谈话记录。 不墨迹了，说正事。首先找到你的域名管理面板。你会找到你熟悉的解析面板 \u003ca href=\"2.png\"\u003e\u003cimg loading=\"lazy\" src=\"/posts/%E5%9C%A8namecheap%E8%A7%A3%E6%9E%90%E9%82%AE%E7%AE%B1/2.png\"\u003e\u003c/a\u003e 然而。MAIL SETTINGS就在下面的地方。 选择 User (Mail Server\u0026rsquo;s Host Name Required) 下面的 I will specify my own MX records。然后保存就会出现下面的填写表单了。 \u003ca href=\"1.png\"\u003e\u003cimg alt=\"1\" loading=\"lazy\" src=\"/posts/%E5%9C%A8namecheap%E8%A7%A3%E6%9E%90%E9%82%AE%E7%AE%B1/1.png\"\u003e\u003c/a\u003e   附上我的烂E文对白~~ Your Question: Where is the domain MX RECORD，I can\u0026rsquo;t find this.Thx in advance Please wait, an operator will be with you shortly. You are now chatting with Alexandra Kr. - Domains Support 16:36Alexandra Kr.:Hello Foam! Thank you for contacting our Live Chat Support! Would you please provide me with the domain name? 16:36foam chou:zoufeng.me 16:36Alexandra Kr.:Thank you for the provided information. Please hold on. 16:36foam chou:ok 16:37Alexandra Kr.:As far as I see, your domain has the following MX records: 16:37Alexandra Kr.:zoufeng.me. 1800 IN MX 10 mx1.privateemail.com. zoufeng.me. 1800 IN MX 10 mx2.privateemail.com. 16:38foam chou:I wanna modify this 16:39foam chou:because I start the service of private mail by mistake,just now 16:39foam chou:how can I close the service of private mail? 16:40Alexandra Kr.:Please hold on, Foam. 16:42Alexandra Kr.:In order to set your custom MX records, you need to refer to the following article \u0026ndash;\u003ca href=\"https://www.namecheap.com/support/knowledgebase/article.aspx/322/78/how-can-i-setup-mx-record-for-my-domain\"\u003ehttps://www.namecheap.com/support/knowledgebase/article.aspx/322/78/how-can-i-setup-mx-record-for-my-domain\u003c/a\u003e 16:42Alexandra Kr.:As for private email, do you want to cancel it or you use a free trial private email? 16:43foam chou:I want to cancel it 16:44foam chou:Can I use the private mail by othername.zoufeng.me rather mail.zoufeng.me ? 16:44Alexandra Kr.:Please let me transfer our chat session to our Hosting department for further assistance. 16:45foam chou:OK Eugene St. has joined the conversation. 16:45Eugene St.:Hello, I will assist you further 16:45Eugene St.:Please give me a few minutes to check your previous conversation. Alexandra Kr. has left the conversation. 16:45foam chou:Thx for your coming 16:47Eugene St.:Thank you for your patience 16:49Eugene St.:So, as I understand you would like to remove Private Email MX records and moreover cancel the subscription, am I right? 16:49foam chou:Yes 16:50Eugene St.:Ler me verify your account ownership before I can cancel the subscription 16:50Eugene St.:Please provide me with your Namecheap username and your Support PIN. You can find it here: \u003ca href=\"https://manage.www.namecheap.com/myaccount/modify-profile-supportsettings.aspx\"\u003ehttps://manage.www.namecheap.com/myaccount/modify-profile-supportsettings.aspx\u003c/a\u003e 16:50foam chou:select the radio \u0026ldquo;User (Mail Server\u0026rsquo;s Host Name Required) \u0026ldquo;,right? 16:51Eugene St.:Would you like to set different MX records? 16:52foam chou:yes,I wanna transer it to other mail server 16:53Eugene St.:In this case please select I will specify my own MX records radio button 16:53Eugene St.:Also, please provide the verification details so I can cancel the subscription 16:54foam chou:I want to what is the subscription?private mail? 16:54foam chou:I want to know what is the subscription?private mail? 16:57Eugene St.:Yes, email account created with Private Email service is called subscription 16:58foam chou:My Support Pin is 3298 16:59foam chou:my username is foam 17:00Eugene St.:Thank you, please give me 5-7 minutes to cancel the subscription 17:00foam chou:Okay 17:01Eugene St.:The subscription has been canceled. 17:01Eugene St.:The subscription has been canceled. 17:01Eugene St.:The subscription has been canceled. 17:01Eugene St.:The subscription has been canceled. 17:03foam chou:thx for your help :)\u003c/p\u003e","title":"在Namecheap解析邮箱"},{"content":"我很喜欢闹腾，这次又给我的博客搬家了，距离上次干这事不过两个月。 写这篇文章的时候，这些代码正运行在国内万网的虚拟主机里。想想以前从未想过在国内放置网站的呢，但这次既然万网跟了老大这么大方到要送我2年的虚拟主机，我也是不能拒绝的吧，拒绝运气可是要被惩罚的呢。 由于用的是国内的主机，那就免不了备案咯。很庆幸的是，万网的老大，阿里云非常人性化地为用户提供了免费帮助备案的机制。从申请备案，填写备案资料到邮寄幕布，寄送备案资料到工信部。没有花我一分钱。但这种好运貌似到我就截止了，我的小伙伴们不得不自己邮寄资料到工信部。备案是今天批下来的，按要求给自己的网站添加了备案信息。 顺便把上次在github学生礼包里免费获得的zoufeng.me域名也解析到这里了、so, you can visit my blog from zoufeng.net or zoufeng.me 希望距离下次搬家是2年后 ：）\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E5%8D%9A%E5%AE%A2%E5%86%8D%E6%AC%A1%E6%90%AC%E5%AE%B6/","summary":"\u003cp\u003e我很喜欢闹腾，这次又给我的博客搬家了，距离上次干这事不过两个月。 写这篇文章的时候，这些代码正运行在国内万网的虚拟主机里。想想以前从未想过在国内放置网站的呢，但这次既然万网跟了老大这么大方到要送我2年的虚拟主机，我也是不能拒绝的吧，拒绝运气可是要被惩罚的呢。 由于用的是国内的主机，那就免不了备案咯。很庆幸的是，万网的老大，阿里云非常人性化地为用户提供了免费帮助备案的机制。从申请备案，填写备案资料到邮寄幕布，寄送备案资料到工信部。没有花我一分钱。但这种好运貌似到我就截止了，我的小伙伴们不得不自己邮寄资料到工信部。备案是今天批下来的，按要求给自己的网站添加了备案信息。 顺便把上次在github学生礼包里免费获得的zoufeng.me域名也解析到这里了、so, you can visit my blog from zoufeng.net or zoufeng.me 希望距离下次搬家是2年后 ：）\u003c/p\u003e","title":"博客再次搬家"},{"content":"最近在DO买了个VPS。这个安装包不错，不需要重复造轮子，可以专心做自己的事了。 注：本文转自Linux运维笔记 这个脚本是使用shell编写，为了快速在生产环境上部署LNMP/LAMP/LANMP（Linux、Nginx/Tengine、MySQL /MariaDB/Percona、PHP）,适用于CentOS/Redhat 5+、Debain 6+和Ubuntu 12+ 脚本特性：\n持续不断更新 源码编译安装，大多数源码是最新stable版，并从官方网址下载 一些安全优化 提供多个数据库版本(MySQL-5.6, MySQL-5.5, MariaDB-10.0, MariaDB-5.5, Percona-5.6, Percona-5.5) 提供多个PHP版本(php-5.3, php-5.4, php-5.5,php-5.6,php-7/phpng(alpha)) 提供Nginx、Tengine 提供多个Apache版本（Apache-2.4，Apache-2.2） 根据自己需求安装PHP缓存加速器，提供ZendOPcache、xcache、apcu、eAccelerator、ionCube和ZendGuardLoader（php-5.4、php-5.3 PHP源码加密） 根据自己需求安装Pureftpd、phpMyAdmin 根据自己需求安装memcached、redis 根据自己需求可使用tcmalloc或者jemalloc优化MySQL、Nginx 提供添加虚拟主机脚本 提供Nginx/Tengine、PHP、Redis、phpMyAdmin升级脚本 提供本地备份和远程备份（服务器之间rsync）脚本 提供CentOS 6/7下HHVM安装**#news** Github地址：https://github.com/lj2007331/lnmp LNMP问题反馈论坛：http://bbs.linuxeye.com LNMP最新源码一键安装脚本问题反馈请加QQ群： 235258658 安装步骤：\nyum -y install wget screen #for CentOS/Redhat #apt-get -y install wget screen # for Debian/Ubuntu wget http://linuxeye.oss-cn-hangzhou-internal.aliyuncs.com/lnmp/lnmp-full.tar.gz #阿里云内网下载地址（包含源码） wget http://mirrors.linuxeye.com/lnmp-full.tar.gz # 国内下载地址（包含源码） wget http://downloads.linuxeye.com/lnmp-full.tar.gz # 美国下载地址（包含源码） wget http://downloads.linuxeye.com/lnmp.tar.gz # 仅脚本源码，建议国外主机下载此包，源码包从官方站点下载 tar xzf lnmp-full.tar.gz #tar xzf lnmp.tar.gz cd lnmp # 如果需要修改目录(安装、数据存储、Nginx日志)，请修改options.conf文件 screen -S lnmp # 如果网路出现中断，可以执行命令`screen -r lnmp`重新连接安装窗口 ./install.sh # 请勿sh install.sh或者bash install.sh这样执行 添加虚拟主机**:**\ncd ~/lnmp # 必须进入lnmp目录下执行 ./vhost.sh 如下图 数据备份**:**\ncd ~/lnmp # 必须进入lnmp目录下执行 ./backup_setup.sh # 备份参数设置 ./backup.sh # 立即执行备份 crontab -e # 可添加到计划任务，如每天凌晨1点自动备份 0 1 * * * cd ~/lnmp; ./backup.sh \u0026gt; /dev/null 2\u0026gt;\u0026amp;1 \u0026amp; 备份参数设置如下图： 管理服务**:** Nginx/Tengine:\nservice nginx {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest} MySQL/MariaDB/Percona:\nservice mysqld {start|stop|restart|reload|force-reload|status} PHP:\nservice php-fpm {start|stop|force-quit|restart|reload|status} Apache:\nservice httpd {start|restart|graceful|graceful-stop|stop} Pure-Ftpd:\nservice pureftpd {start|stop|restart|condrestart|status} Redis:\nservice redis-server {start|stop|status|restart|condrestart|try-restart|reload|force-reload} Memcached:\nservice memcached {start|stop|status|restart|reload|force-reload} 版本升级：\ncd ~/lnmp # 必须进入lnmp目录下执行 ./upgrade_php.sh #升级PHP ./upgrade_web.sh #升级Nginx/Tengine ./upgrade_redis.sh #升级Redis ./upgrade_phpmyadmin.sh #升级phpMyAdmin 卸载lnmp：\ncd ~/lnmp # 必须进入lnmp目录下执行 ./uninstall.sh 重装lnmp：\ncd ~/lnmp # 必须进入lnmp目录下执行 ./uninstall.sh #备份数据；卸载 ./install.sh #再次安装 ","permalink":"https://blog-foamzou-com.pages.dev/posts/lnmp-lamp-lnmpa-install-by-one-press/","summary":"\u003cp\u003e最近在DO买了个VPS。这个安装包不错，不需要重复造轮子，可以专心做自己的事了。 注：本文转自\u003ca href=\"http://blog.linuxeye.com/31.html\"\u003eLinux运维笔记\u003c/a\u003e 这个脚本是使用shell编写，为了快速在生产环境上部署\u003ca href=\"http://blog.linuxeye.com/31.html\"\u003eLNMP\u003c/a\u003e/\u003ca href=\"http://blog.linuxeye.com/82.html\"\u003eLAMP\u003c/a\u003e/LANMP（\u003ca href=\"http://www.linuxeye.com/\"\u003eLinux\u003c/a\u003e、\u003ca href=\"http://blog.linuxeye.com/tag/Nginx\"\u003eNginx\u003c/a\u003e/Tengine、\u003ca href=\"http://blog.linuxeye.com/tag/mysql\"\u003eMySQL\u003c/a\u003e /\u003ca href=\"http://blog.linuxeye.com/tag/mariadb\"\u003eMariaDB\u003c/a\u003e/\u003ca href=\"http://blog.linuxeye.com/359.html\"\u003ePercona\u003c/a\u003e、PHP）,适用于CentOS/Redhat 5+、Debain 6+和Ubuntu 12+ \u003cstrong\u003e脚本特性：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e持续不断更新\u003c/li\u003e\n\u003cli\u003e源码编译安装，大多数源码是最新stable版，并从官方网址下载\u003c/li\u003e\n\u003cli\u003e一些安全优化\u003c/li\u003e\n\u003cli\u003e提供多个数据库版本(MySQL-5.6, MySQL-5.5, MariaDB-10.0, MariaDB-5.5, Percona-5.6, Percona-5.5)\u003c/li\u003e\n\u003cli\u003e提供多个PHP版本(php-5.3, php-5.4, php-5.5,php-5.6,php-7/phpng(alpha))\u003c/li\u003e\n\u003cli\u003e提供\u003ca href=\"http://blog.linuxeye.com/tag/Nginx\"\u003eNginx\u003c/a\u003e、Tengine\u003c/li\u003e\n\u003cli\u003e提供多个\u003ca href=\"http://blog.linuxeye.com/tag/apache\"\u003eApache\u003c/a\u003e版本（\u003ca href=\"http://blog.linuxeye.com/tag/apache\"\u003eApache\u003c/a\u003e-2.4，\u003ca href=\"http://blog.linuxeye.com/tag/apache\"\u003eApache\u003c/a\u003e-2.2）\u003c/li\u003e\n\u003cli\u003e根据自己需求安装PHP缓存加速器，提供ZendOPcache、xcache、apcu、eAccelerator、ionCube和ZendGuardLoader（php-5.4、php-5.3 PHP源码加密）\u003c/li\u003e\n\u003cli\u003e根据自己需求安装\u003ca href=\"http://blog.linuxeye.com/tag/Pureftpd\"\u003ePureftpd\u003c/a\u003e、phpMyAdmin\u003c/li\u003e\n\u003cli\u003e根据自己需求安装memcached、\u003ca href=\"http://blog.linuxeye.com/tag/redis\"\u003eredis\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e根据自己需求可使用tcmalloc或者\u003ca href=\"http://blog.linuxeye.com/356.html\"\u003ejemalloc\u003c/a\u003e优化MySQL、Nginx\u003c/li\u003e\n\u003cli\u003e提供添加虚拟主机脚本\u003c/li\u003e\n\u003cli\u003e提供Nginx/Tengine、PHP、Redis、phpMyAdmin升级脚本\u003c/li\u003e\n\u003cli\u003e提供本地备份和远程备份（服务器之间rsync）脚本\u003c/li\u003e\n\u003cli\u003e提供CentOS 6/7下HHVM安装**#news**\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eGithub地址：\u003ca href=\"https://github.com/lj2007331/lnmp\"\u003ehttps://github.com/lj2007331/lnmp\u003c/a\u003e \u003ca href=\"http://blog.linuxeye.com/31.html\"\u003eLNMP\u003c/a\u003e问题反馈论坛：\u003ca href=\"http://bbs.linuxeye.com/\"\u003ehttp://bbs.linuxeye.com\u003c/a\u003e \u003ca href=\"http://blog.linuxeye.com/31.html\"\u003eLNMP\u003c/a\u003e最新源码一键安装脚本问题反馈请加QQ群： \u003cstrong\u003e235258658\u003c/strong\u003e \u003cstrong\u003e安装步骤：\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eyum\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ey\u003c/span\u003e \u003cspan class=\"nx\"\u003einstall\u003c/span\u003e \u003cspan class=\"nx\"\u003ewget\u003c/span\u003e \u003cspan class=\"nx\"\u003escreen\u003c/span\u003e \u003cspan class=\"c1\"\u003e#for CentOS/Redhat\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#apt-get -y install wget screen # for Debian/Ubuntu\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewget\u003c/span\u003e \u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"o\"\u003e://\u003c/span\u003e\u003cspan class=\"nx\"\u003elinuxeye\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eoss\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ecn\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ehangzhou\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003einternal\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ealiyuncs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecom\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003elnmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003elnmp\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003efull\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etar\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egz \u003c/span\u003e\u003cspan class=\"c1\"\u003e#阿里云内网下载地址（包含源码） \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewget\u003c/span\u003e \u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"o\"\u003e://\u003c/span\u003e\u003cspan class=\"nx\"\u003emirrors\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elinuxeye\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecom\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003elnmp\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003efull\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etar\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egz \u003c/span\u003e\u003cspan class=\"c1\"\u003e# 国内下载地址（包含源码） \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewget\u003c/span\u003e \u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"o\"\u003e://\u003c/span\u003e\u003cspan class=\"nx\"\u003edownloads\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elinuxeye\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecom\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003elnmp\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003efull\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etar\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egz \u003c/span\u003e\u003cspan class=\"c1\"\u003e# 美国下载地址（包含源码） \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ewget\u003c/span\u003e \u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"o\"\u003e://\u003c/span\u003e\u003cspan class=\"nx\"\u003edownloads\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elinuxeye\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecom\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003elnmp\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etar\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egz \u003c/span\u003e\u003cspan class=\"c1\"\u003e# 仅脚本源码，建议国外主机下载此包，源码包从官方站点下载\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etar\u003c/span\u003e \u003cspan class=\"nx\"\u003exzf\u003c/span\u003e \u003cspan class=\"nx\"\u003elnmp\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003efull\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etar\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egz \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#tar xzf lnmp.tar.gz \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ecd\u003c/span\u003e \u003cspan class=\"nx\"\u003elnmp \u003c/span\u003e\u003cspan class=\"c1\"\u003e# 如果需要修改目录(安装、数据存储、Nginx日志)，请修改options.conf文件\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003escreen\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003eS\u003c/span\u003e \u003cspan class=\"nx\"\u003elnmp \u003c/span\u003e\u003cspan class=\"c1\"\u003e# 如果网路出现中断，可以执行命令`screen -r lnmp`重新连接安装窗口 \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"nx\"\u003einstall\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esh \u003c/span\u003e\u003cspan class=\"c1\"\u003e# 请勿sh install.sh或者bash install.sh这样执行\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e添加虚拟主机\u003c/strong\u003e**:**\u003c/p\u003e","title":"lnmp、lamp、lnmpa一键安装包"},{"content":"为了避免用户点击浏览器的后退按钮和前进按钮触发提交，导致重复数据。有一种方法可以设置header头中的Cache-control为no-cache和no-store。该属性默认是private的。\nCache-directive\n说明\npublic\n所有内容都将被缓存\nprivate\n内容只缓存到私有缓存中\nno-cache\n所有内容都不会被缓存\nno-store\n所有内容都不会被缓存到缓存或 Internet 临时文件中\nmust-revalidation/proxy-revalidation\n如果缓存的内容失效，请求必须发送到服务器/代理以进行重新验证\nmax-age=xxx (xxx is numeric)\n缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高\n易点SEO随笔有一篇博客解释得很浅显： 其作用根据不同的重新浏览方式分为以下几种情况： 1.打开新窗口(_blank) private、no-cache、must-revalidate 再次访问服务器 Cache-control: max-age=5(表示当访问此网页后的5秒内再次访问不 会去服务器) 2.在地址栏回车 值为private或must-revalidate则只有第一次访问时会访问服务器，以后就不再访问。 值为no-cache，那么每次都会访问。 值为max-age，则在过期之前不会重复访问。 3.按后退按扭 值为private、must-revalidate、max-age，则不会重访问， 值为no-cache，则每次都重复访问 4.按刷新按扭 无论为何值，都会重复访问 ThinkPHP的view缓存机制里默认是使用private的。 ThinkPHP\\Library\\Think\\View.class.php第92行 我使用的是TP3.2，可以在配置文件中设置该属性，就不需要注释该行代码了。 \u0026lsquo;HTTP_CACHE_CONTROL\u0026rsquo; =\u0026gt; \u0026rsquo;no-cache,no-store\u0026rsquo; 但是这么一来，整个项目的页面的Cache-control都是no-cache,no-store了。只针对某些页面设置为no-cache,no-store。有没有更灵活的处理方法呢？有时间再看看。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/thinkphp%E9%87%8C%E5%85%B3%E4%BA%8E%E7%A6%81%E7%94%A8%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%BC%93%E5%AD%98%E7%9A%84%E9%97%AE%E9%A2%98/","summary":"\u003cp\u003e为了避免用户点击浏览器的后退按钮和前进按钮触发提交，导致重复数据。有一种方法可以设置header头中的Cache-control为no-cache和no-store。该属性默认是private的。\u003c/p\u003e\n\u003cp\u003eCache-directive\u003c/p\u003e\n\u003cp\u003e说明\u003c/p\u003e\n\u003cp\u003epublic\u003c/p\u003e\n\u003cp\u003e所有内容都将被缓存\u003c/p\u003e\n\u003cp\u003eprivate\u003c/p\u003e\n\u003cp\u003e内容只缓存到私有缓存中\u003c/p\u003e\n\u003cp\u003eno-cache\u003c/p\u003e\n\u003cp\u003e所有内容都不会被缓存\u003c/p\u003e\n\u003cp\u003eno-store\u003c/p\u003e\n\u003cp\u003e所有内容都不会被缓存到缓存或 Internet 临时文件中\u003c/p\u003e\n\u003cp\u003emust-revalidation/proxy-revalidation\u003c/p\u003e\n\u003cp\u003e如果缓存的内容失效，请求必须发送到服务器/代理以进行重新验证\u003c/p\u003e\n\u003cp\u003emax-age=xxx (xxx is numeric)\u003c/p\u003e\n\u003cp\u003e缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.ggseo.cn/blog/post/cache-control.html\"\u003e易点SEO随笔\u003c/a\u003e有一篇博客解释得很浅显： \u003cstrong\u003e其作用根据不同的重新浏览方式分为以下几种情况：\u003c/strong\u003e 1.打开新窗口(_blank) private、no-cache、must-revalidate 再次访问服务器 Cache-control: max-age=5(表示当访问此网页后的5秒内再次访问不 会去服务器) 2.在地址栏回车 值为private或must-revalidate则只有第一次访问时会访问服务器，以后就不再访问。 值为no-cache，那么每次都会访问。 值为max-age，则在过期之前不会重复访问。 3.按后退按扭 值为private、must-revalidate、max-age，则不会重访问， 值为no-cache，则每次都重复访问 4.按刷新按扭 无论为何值，都会重复访问 ThinkPHP的view缓存机制里\u003cstrong\u003e默认是使用private\u003c/strong\u003e的。 ThinkPHP\\Library\\Think\\View.class.php第92行 \u003ca href=\"____20150320171945.png\"\u003e\u003cimg alt=\"搜狗截图20150320171945\" loading=\"lazy\" src=\"/posts/thinkphp%E9%87%8C%E5%85%B3%E4%BA%8E%E7%A6%81%E7%94%A8%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%BC%93%E5%AD%98%E7%9A%84%E9%97%AE%E9%A2%98/____20150320171945-300x81.png\"\u003e\u003c/a\u003e 我使用的是TP3.2，可以在配置文件中设置该属性，就不需要注释该行代码了。 \u0026lsquo;HTTP_CACHE_CONTROL\u0026rsquo; =\u0026gt; \u0026rsquo;no-cache,no-store\u0026rsquo; 但是这么一来，整个项目的页面的Cache-control都是no-cache,no-store了。只针对某些页面设置为no-cache,no-store。有没有更灵活的处理方法呢？有时间再看看。\u003c/p\u003e","title":"ThinkPHP里关于禁用客户端缓存的问题"},{"content":"这个ajax是用jq写的。突然觉得jq或者说前端不是那么难，如果只是coding而不是设计的话。 今天用到了jq的 $(this) 。原本想在ajax成功后将某行的某个元素替换掉，但用 $(this)却又获取不到元素。百度后，在CSDN论坛找到了解答\nthis就是当前函数的调用者，只不过在JS里面可以用call或者apply来强行改变这个this指向。 在AJAX的success里面应该指向的是一个Deferred对象 而$(this)一般是用来将一个dom节点转换成jquery对象 所以在ajax的success里面无效了。\n知道原因就好办了，将$(this)赋值给对象，在success直接使用该对象就行了。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E5%85%B3%E4%BA%8E%E5%9C%A8ajax%E7%9A%84success%E9%87%8C%E8%8E%B7%E5%8F%96%E5%85%83%E7%B4%A0%E7%9A%84%E9%97%AE%E9%A2%98/","summary":"\u003cp\u003e这个ajax是用jq写的。突然觉得jq或者说前端不是那么难，如果只是coding而不是设计的话。 今天用到了jq的 $(this) 。原本想在ajax成功后将某行的某个元素替换掉，但用 $(this)却又获取不到元素。百度后，在\u003ca href=\"http://bbs.csdn.net/topics/390848098\"\u003eCSDN论坛\u003c/a\u003e找到了解答\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003ethis就是当前函数的调用者，只不过在JS里面可以用call或者apply来强行改变这个this指向。 在AJAX的success里面应该指向的是一个Deferred对象 而$(this)一般是用来将一个dom节点转换成jquery对象 所以在ajax的success里面无效了。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e知道原因就好办了，将$(this)赋值给对象，在success直接使用该对象就行了。\u003c/p\u003e","title":"关于在ajax的success里获取元素的问题"},{"content":"最近在做图书馆检索，用到了PHP的cURL和正则表达。 今天遇到一个匹配不到的问题，原本以为是正则规则写错了，但后来发现，其实是正则中的文本不符。 一般情况下我是通过ctrl U 查看网页源代码来写正则规则的。通过源代码可以看到这次我要匹配的是。其中我要匹配的是1899.\n\u0026lt;span id=\u0026ldquo;ctl00_ContentPlaceHolder1_countlbl\u0026rdquo; style=\u0026ldquo;color:Red;\u0026rdquo;\u0026gt;1899\u0026lt;/span\u0026gt;\n于是我使用了下面的规则：\n#\u0026lt;span id=\u0026ldquo;ctl00_ContentPlaceHolder1_countlbl\u0026rdquo; style=\u0026ldquo;color:Red;\u0026rdquo;\u0026gt;([^\u0026quot;]+)\u0026lt;/span\u0026gt;#iUs\n但始终无法匹配出结果。后来将cURL获取到的网页数据输出来，看到的数据竟然和网页源代码的不一致：\n\u0026lt;span id=\u0026ldquo;ctl00_ContentPlaceHolder1_countlbl\u0026rdquo;\u0026gt;\u0026lt;font color=\u0026ldquo;Red\u0026rdquo;\u0026gt;1899\n至此匹配的问题解决。 现在仍然无法理解缘何不同，若游客有见解，留下言吧 ：）\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E7%BD%91%E9%A1%B5%E6%BA%90%E4%BB%A3%E7%A0%81%E4%B8%8Ecurl%E8%8E%B7%E5%8F%96%E5%88%B0%E7%9A%84%E6%95%B0%E6%8D%AE%E4%B8%8D%E7%AC%A6/","summary":"\u003cp\u003e最近在做图书馆检索，用到了PHP的cURL和正则表达。 今天遇到一个匹配不到的问题，原本以为是正则规则写错了，但后来发现，其实是正则中的文本不符。 一般情况下我是通过ctrl U 查看网页源代码来写正则规则的。通过源代码可以看到这次我要匹配的是。其中我要匹配的是1899.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026lt;span id=\u0026ldquo;ctl00_ContentPlaceHolder1_countlbl\u0026rdquo; style=\u0026ldquo;color:Red;\u0026rdquo;\u0026gt;1899\u0026lt;/span\u0026gt;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e于是我使用了下面的规则：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e#\u0026lt;span id=\u0026ldquo;ctl00_ContentPlaceHolder1_countlbl\u0026rdquo; style=\u0026ldquo;color:Red;\u0026rdquo;\u0026gt;([^\u0026quot;]+)\u0026lt;/span\u0026gt;#iUs\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e但始终无法匹配出结果。后来将cURL获取到的网页数据输出来，看到的数据竟然和网页源代码的不一致：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026lt;span id=\u0026ldquo;ctl00_ContentPlaceHolder1_countlbl\u0026rdquo;\u0026gt;\u0026lt;font color=\u0026ldquo;Red\u0026rdquo;\u0026gt;1899\u003c!-- raw HTML omitted --\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e至此匹配的问题解决。 现在仍然无法理解缘何不同，若游客有见解，留下言吧 ：）\u003c/p\u003e","title":"网页源代码与cURL获取到的数据不符"},{"content":"引子：\n事情的经过是这样的。最近在做微信公众平台开发，其中有一个模块是实现微信授权登录。\n页面A（链接为：domain.com/index.php/Store/route.html#/bbb/1/aaa）\n微信授权接口文件（链接为：domain.com/index.php/Wechat/Oauth）\n业务是这样的：\n用户点击页面A，若检测到未授权登录，则跳转到微信授权接口文件，授权完成后再跳转回页面A。\n很显然，在页面A检测到未授权，跳转前必须保存当前页面的Url。\n那么问题来了，小伙伴用了AngularJs的路由。Url中是带有#的，服务器端不可能获取到整个Url，只能获取到domain.com/index.php/Store/route.html\n尽管可以使用html5模式，把#去掉。但为了不大费周章，还是想了其他方法。\nJs是可以获取包括hash值的整个Url的。所以我自然得想到使用Js存Cookie，然后用PHP来取。但是实践告诉我，这种方法不行。因为是先执行服务器脚本语言再执行Js的。那么要刷新2次页面才能看到Cookie被echo出来了。**但是，亲，**哥是要在A页面跳转到接口文件啊。这么一跳转，根本没办法存储到Cookie。\n说了那么多“废话”，讲讲解决办法吧。\nA页面：使用js获取到带#的整个Url，然后使用replace将#替换为任意字符串，比如|sharp|。然后将该Url作为参数，用window.location.href跳转到接口文件。\n接口文件：$_GET获取到传过来的Url。再用PHP的方法将|sharp|替换回#。接着就可以做大事啦~~~\n最后附上主要代码：\nA页面\necho \u0026ldquo; var targetUrl = document.location.href; targetUrl = targetUrl.replace(\u0026rsquo;#\u0026rsquo;,\u0026rsquo;|sharp|\u0026rsquo;); window.location.href=\u0026lsquo;http://domain.com/index.php/Wechat/Oauth?targetUrl='+targetUrl\n\u0026rdquo;;\n接口文件：\n$targetUrl =$_GET[\u0026rsquo;targetUrl\u0026rsquo;];\n$targetUrl = str_replace(\u0026rsquo;|sharp|\u0026rsquo;,\u0026rsquo;#\u0026rsquo;,$targetUrl);\n","permalink":"https://blog-foamzou-com.pages.dev/posts/php%E8%8E%B7%E5%8F%96%E5%B8%A6%E7%9A%84url%E7%9A%84%E6%96%B9%E6%B3%95/","summary":"\u003cp\u003e引子：\u003c/p\u003e\n\u003cp\u003e事情的经过是这样的。最近在做微信公众平台开发，其中有一个模块是实现微信授权登录。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e页面A\u003c/strong\u003e（链接为：domain.com/index.php/Store/route.html#/bbb/1/aaa）\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e微信授权接口文件\u003c/strong\u003e（链接为：domain.com/index.php/Wechat/Oauth）\u003c/p\u003e\n\u003cp\u003e业务是这样的：\u003c/p\u003e\n\u003cp\u003e用户点击\u003cstrong\u003e页面A\u003c/strong\u003e，若检测到未授权登录，则跳转到\u003cstrong\u003e微信授权接口文件\u003c/strong\u003e，授权完成后再跳转回\u003cstrong\u003e页面A。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e很显然，在页面A检测到未授权，跳转前必须\u003cstrong\u003e保存\u003c/strong\u003e当前页面的Url。\u003c/p\u003e\n\u003cp\u003e那么问题来了，小伙伴用了AngularJs的路由。Url中是带有#的，服务器端不可能获取到整个Url，只能获取到domain.com/index.php/Store/route.html\u003c/p\u003e\n\u003cp\u003e尽管可以使用html5模式，把#去掉。但为了不大费周章，还是想了其他方法。\u003c/p\u003e\n\u003cp\u003eJs是可以获取包括hash值的整个Url的。所以我自然得想到使用Js存Cookie，然后用PHP来取。但是实践告诉我，这种方法不行。因为是先执行服务器脚本语言再执行Js的。那么要刷新2次页面才能看到Cookie被echo出来了。**但是，亲，**哥是要在A页面跳转到接口文件啊。这么一跳转，根本没办法存储到Cookie。\u003c/p\u003e\n\u003cp\u003e说了那么多“废话”，讲讲解决办法吧。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eA页面\u003c/strong\u003e：使用js获取到带#的整个Url，然后使用replace将#替换为任意字符串，比如|sharp|。然后将该Url作为参数，用window.location.href跳转到接口文件。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e接口文件\u003c/strong\u003e：$_GET获取到传过来的Url。再用PHP的方法将|sharp|替换回#。接着就可以做大事啦~~~\u003c/p\u003e\n\u003cp\u003e最后附上主要代码：\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eA页面\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eecho \u0026ldquo;\u003c!-- raw HTML omitted --\u003e var targetUrl = document.location.href; targetUrl = targetUrl.replace(\u0026rsquo;#\u0026rsquo;,\u0026rsquo;|sharp|\u0026rsquo;); window.location.href=\u0026lsquo;\u003ca href=\"http://domain.com/index.php/Wechat/Oauth?targetUrl='+targetUrl\"\u003ehttp://domain.com/index.php/Wechat/Oauth?targetUrl='+targetUrl\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u0026rdquo;;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e接口文件\u003c/strong\u003e：\u003c/p\u003e\n\u003cp\u003e$targetUrl =$_GET[\u0026rsquo;targetUrl\u0026rsquo;];\u003c/p\u003e\n\u003cp\u003e$targetUrl = str_replace(\u0026rsquo;|sharp|\u0026rsquo;,\u0026rsquo;#\u0026rsquo;,$targetUrl);\u003c/p\u003e","title":"PHP获取带#的Url的方法"},{"content":"这个年度总结应该会写得比较像流水账，哈哈。按月份来吧。 1月 买了心仪已久的神船和4g内存条，这下我的硬件是得到了很大的飞跃，这还得感谢我哥哥，哈哈。 概率统计没有挂，这是令我比较惊讶同时又很惊喜的，总之没有挂科是最好的。 哥哥给妈妈买了手机，哥哥你真是好哥哥。 今年很早过年，31号就是年初一了。当然年前免不了从记忆起就做着的事，卖春联。尽管做这个很多年了，但还是没能习惯，今年很好，天气暖得不像话，所以还是比较轻松就顺利打完BOSS，直接通关。 2月 过年是小朋友(包括我)很喜欢的时光。年初七送三姨她们回去，我也一同过去玩了几天。珠海的环境很好，老了在这呆着应该蛮不错的，顺便还去深圳走了一趟。 接着看了护花危情这个令我心痛很久的电视剧，我真的很久没有这样痛过了，也令我深深喜欢上了最幸福的事这首歌，接着听了钟嘉欣很多很不错的歌，比如日夜想你。突然就对讲粤语的热情小爆发了下，貌似还持续了一段时间，其实我的粤语也不算很烂啦~~ 月底回校，准备大二下学期的生活。其实这学期的课程还算蛮不错的，相较于大三上学期来说。 3月 女生节，我们男生在洪富的带领下很努力地准备了节目，这也是我们班这么久以来最好的活动吧，至少我是这么想的。至今还是想对那段无节操的小品爆笑一番。洪富你放心吧，视频我有存档的。 又到了环创招新的时期，这次考核内容是五子棋，质量一般吧。所以这次很罕见地只吸收了2个人。 蓝桥杯总算是要开始了，于是坐了生平第一次火车，没有想象中的简陋，看来我对火车还是有偏见的，哈哈。这次的比赛不算难，大家都说省赛是挺简单的，国赛可就难了，可惜我是没见识到。 WPF写了个点名系统加强版，这个点名系统我觉得还是蛮好玩的，界面是名侦探柯南，貌似班里不少人中枪了，加强版把自己和宿舍另外2个小伙伴加入了白名单，若不幸被刘老师看到，莫怪哈~ 4月 1号通过微信查了蓝桥成绩，是二等。说实话这个成绩我还是比较满意的，但没有一等不能去北京，还是有点遗憾的。 这个月的睡眠状况不是很好，经常头晕脑胀的，估计是作息时间没有安排合理的缘故，这也使我开始了跑步计划，不过很可惜，这个跑步计划只是坚持了这个月，往后就没有了。 看了下读心神探，这部剧是后期发力的，前期倒不是很好看。会看这部剧也是护花的缘故吧，世界真是奇妙，若没有之前的事，后面的结局都会很不同。蝴蝶效应是很明显的。有点感慨高中的机器人足球以及高考分数对我现在的影响，若没有前面两者，我很肯定，今日的我一定与现在大不相同，从此人生是另一番模样。没有好坏，只是纯粹感慨。 汪苏泷的歌友会在体育馆开展，说实话，本以为在现场听，效果会很好，但大跌我眼镜的是，不仅是音效，连唱歌都没有很大感觉，反倒是隔壁音乐厅的吉他演唱会high爆了全场，安可不断。 5月 环创毕业照，又到了即将毕业的时候，师兄师姐都赶回来拍毕业照了。现在的大三的我，也是快了哈，岁月不饶人啊。很快就会把我从大学里推出去了。像我，有时很渴望毕业出去工作，有时很想校园的生活。总之以后会很怀念校园生活，以及所有人都会怀念的无法回去的青春年少。就如现在敲着稚嫩文字的这个夜晚，也是很久以后翻到这篇文章的我会深深想念的。岁月不饶人。 看了生平第一次3D电影，超凡蜘蛛侠。什么蜘蛛侠，蝙蝠侠，美国超人，忍者神龟，变形金刚之类的剧情，都不是我的菜。所以这次 不是冲着剧情去的，3D的效果很好，想必大型电影院的效果会更好的，以后会去看看的。 追了潜行狙击。这部剧我很喜欢，目前最喜欢的两部剧，护花和潜行。很佩服TVB的编剧，这种引人入胜的剧情真的只有他们才写得出，台湾偶像剧什么的真的弱爆了。 环创换届了，很出乎意料的晚上，师兄突然告诉我们，该换届了。于是我也背负了一份不一样的责任，作为负责人之一，对环创的感觉真的大不一样了，要把环创升级提升地位的想法变得很强烈。当然6月份是重新调整了成员架构。 月底给陈江小学的小朋友过六一，自从大二很久没有骑过单车了，去过六一的感觉很棒，小朋友的欢乐时光被定格一瞬间，成了我qq空间的一抹不一样的风景。 6月 环创十五周年。这个活动，我很感谢最初的提出人。若没有这次活动，我不知道我们工作室要什么时候才开始改革。对我的影响也是蛮大的，突然觉得工作室没有我想象中的坚强，经过那么多年，这个孩子也是该改变了，15年，是该走向青少年时期了，不是吗。 在环创重新设计成员架构的时候，阳光也换届了，刚开始还是蛮担忧这一届的，到了他们实战的时候，我们发现自己的担忧完全是多余的，他们很棒，我很欣慰。 走进韶大项目讨论也开始了，这个产品刚开始真的以为有点难度，现在感觉也不过如此。很多事情没有接触过就没产生畏惧感，毕竟距离太远了，走近去瞧瞧，这种距离感马上就会被淡化，而一接触，距离感破碎。不要太小瞧自己了，你的潜力远远比自己的想象大得多。 这个月零零散散学了点东西，linux，php，vps的一些东东。 然后，高考的放榜了。有人欢喜有人愁的季节。弟弟妹妹一个高考一个中考也是又即将翻开不一样的篇章。 月底倒是大把考试，和以前一样，断断续续的。一直到6.27的会计这天后，假期就算开始了。 7月 16号前一直在学校写走进韶大的项目。没有暑假的日子真的很不习惯啊，想想以后工作就更不用想什么寒暑假，心里倒是好受了点。 16号回家的，玩得很好，在家的感觉真的很不错。小妹妹感觉长大了不少，不过以后要是很任性就不好了。还是不要过度溺爱这孩子。 24号又重返学校，继续Project，效率很高。 这段日子在学校倒是蛮安静的，如果晚上回到宿舍没有那么多的蟑螂和老鼠，这段日子应该是校园生活中蛮不错的回忆。 8月 月初完善走进韶大。 接着去四川参加博弈大赛，结果被完虐。下次再接再厉，要虐爆他们啊。 然后终于得以回家度过一个星期的暑假时光，感觉良好。 CET4到底还是过了，我不会告诉你们，这是我第三次考CET4的。 整个暑假来说，很忙，但收获了不错的项目经验和团队协作能力。 又翻开雷霆扫毒这部TVB看了，剧情还好，但就警匪片来说，还是远远不及潜行狙击啊。laughing真是太帅了，我喜欢。 9月 毫无疑问开学的日子到了，暑假还没玩够啊~~ 这次项目是游得乐了。准备去江苏参赛，有是一次不错的旅行，哈哈。 10号大概是8点多到无锡的。11号鼋头渚走起，拍了好多照片。12号答辩，老师真的厉害，给我们抽到第一个进去答辩。答辩的过程还算比较满意，至少自己没有表现得很差劲。尽管最后我们只拿了三等奖。答辩完成后，我们回到展厅，观看各个队伍的作品，有些也是挺有意思的。13号是颁奖的日子。我代表我们队伍到前面就坐，期待着奖项。轮到B组，首先是宣布二等奖，我很期待这项，因为我们几乎不可能拿一等，如果不是二等的话就是三等了。结果二等真的没有我们。然后是一等奖，我带着一丝希望，结果自然是被浇了一头冷水。只能乖乖接受三等奖的事实。 下午我们去了三国水浒城，这个倒是比较好玩点。照片自然也是拍了许多的。这里不细说啦~~ 14号清晨坐高铁到杭州转车，顺便到西湖骑单车兜了一圈。人太多了，所以没什么好玩的。中国就是人多，不管什么事物，人多了总是会破坏那么一种美。游完西湖，看时间差不多了，我们就赶往车站验票上车。 15号上午10点多回到了韶关。终于要开始真正的大三生活了哈。 10月 又是一个比较无聊的国庆假期，买了个SSD，不得不说，有了这玩意，神船真是得到了一次质的飞跃。有点小贵，不过能得到这飞一般的感觉，完全是值得的。 回去学校，订餐app的师兄联系了我们。于是开始学习TP。这里对那个师兄说声抱歉，似乎是我们把师兄坑了，由于工作室太忙，这项目倒是没有进展。现在应该算是不了了之了吧。 11月 去电影院看了场3D电影，超体。剧情还可以。这天是难得的休息哈，毕竟我的大学没有周末，想到这也是不禁苦笑一把。不过不后悔，没有周末完全是值得的。谁的青春不奋斗呢？ 11月4号 韶师小伙伴拍毕业照了，又有小伙伴即将毕业，祝他们前程似锦，现在有不少伙伴已经开始实习老师了呢。教师这职业挺不错的，哥哥，你会努力的，是吧。 今年的双十一倒是很走运，拿到了111元红包。其中100元红包完全是走大运收到的，红包说明是：店铺游戏红包。人品爆发到这程度，还是很难相信的，毕竟我从未想过中奖什么的会出现在我身上。 这个月环创招新结束了，这次招收的新人很满意，无论是技术还是运营。这是我们工作室首次设立运营部，共3人，每个都很棒，质量比我想象中要高很多。再次感到设立运营部是无比正确的选择，突然感受到一股新生力量慢慢成长。其实，术业有专攻，运营能力强的人，是很厉害的，亦不需要对自己不懂技术感到羞愧。我一直认为术业有专攻是很正确的一句话，你也是这么想的，是吧？ 这个月，早睡坚持了7天。本以为会坚持更久的。说真的，早睡早起的感觉真的很不错。7月份在学校就是早睡早起的，那个时候的工作效率及精神状态真是相当不错的。 我的个人博客在暑假就搭建好了，但实在太丑，没有打理。这个月为自己的wordpress弄了个不错的主题，和志豪同学的是一样的。这个主题真的很赞。附上我的博客链接 / 12月 这个月相对比较平淡。 安卓比赛的结果还是比较失望的，但从中确实看到了些我们的不足。 走进韶大2.0终于是看到雏形了，大家会一起努力的，加油各位。 CF第一次玩，感觉还不错。这段日子以后也会很怀念的，对吧，3位小伙伴。 2014年，收获了很多，谢谢所有帮助过我的人，也谢谢努力奔跑的自己。2015年，我们一样能好好过，会更好的，是吧。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/2014%E5%B9%B4%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/","summary":"\u003cp\u003e这个年度总结应该会写得比较像流水账，哈哈。按月份来吧。 \u003cstrong\u003e1月\u003c/strong\u003e 买了心仪已久的神船和4g内存条，这下我的硬件是得到了很大的飞跃，这还得感谢我哥哥，哈哈。 概率统计没有挂，这是令我比较惊讶同时又很惊喜的，总之没有挂科是最好的。 哥哥给妈妈买了手机，哥哥你真是好哥哥。 今年很早过年，31号就是年初一了。当然年前免不了从记忆起就做着的事，卖春联。尽管做这个很多年了，但还是没能习惯，今年很好，天气暖得不像话，所以还是比较轻松就顺利打完BOSS，直接通关。 \u003cstrong\u003e2月\u003c/strong\u003e 过年是小朋友(包括我)很喜欢的时光。年初七送三姨她们回去，我也一同过去玩了几天。珠海的环境很好，老了在这呆着应该蛮不错的，顺便还去深圳走了一趟。 接着看了护花危情这个令我心痛很久的电视剧，我真的很久没有这样痛过了，也令我深深喜欢上了最幸福的事这首歌，接着听了钟嘉欣很多很不错的歌，比如日夜想你。突然就对讲粤语的热情小爆发了下，貌似还持续了一段时间，其实我的粤语也不算很烂啦~~ 月底回校，准备大二下学期的生活。其实这学期的课程还算蛮不错的，相较于大三上学期来说。 \u003cstrong\u003e3月\u003c/strong\u003e 女生节，我们男生在洪富的带领下很努力地准备了节目，这也是我们班这么久以来最好的活动吧，至少我是这么想的。至今还是想对那段无节操的小品爆笑一番。洪富你放心吧，视频我有存档的。 又到了环创招新的时期，这次考核内容是五子棋，质量一般吧。所以这次很罕见地只吸收了2个人。 蓝桥杯总算是要开始了，于是坐了生平第一次火车，没有想象中的简陋，看来我对火车还是有偏见的，哈哈。这次的比赛不算难，大家都说省赛是挺简单的，国赛可就难了，可惜我是没见识到。 WPF写了个点名系统加强版，这个点名系统我觉得还是蛮好玩的，界面是名侦探柯南，貌似班里不少人中枪了，加强版把自己和宿舍另外2个小伙伴加入了白名单，若不幸被刘老师看到，莫怪哈~ \u003cstrong\u003e4月\u003c/strong\u003e 1号通过微信查了蓝桥成绩，是二等。说实话这个成绩我还是比较满意的，但没有一等不能去北京，还是有点遗憾的。 这个月的睡眠状况不是很好，经常头晕脑胀的，估计是作息时间没有安排合理的缘故，这也使我开始了跑步计划，不过很可惜，这个跑步计划只是坚持了这个月，往后就没有了。 看了下读心神探，这部剧是后期发力的，前期倒不是很好看。会看这部剧也是护花的缘故吧，世界真是奇妙，若没有之前的事，后面的结局都会很不同。蝴蝶效应是很明显的。有点感慨高中的机器人足球以及高考分数对我现在的影响，若没有前面两者，我很肯定，今日的我一定与现在大不相同，从此人生是另一番模样。没有好坏，只是纯粹感慨。 汪苏泷的歌友会在体育馆开展，说实话，本以为在现场听，效果会很好，但大跌我眼镜的是，不仅是音效，连唱歌都没有很大感觉，反倒是隔壁音乐厅的吉他演唱会high爆了全场，安可不断。   \u003cstrong\u003e5月\u003c/strong\u003e 环创毕业照，又到了即将毕业的时候，师兄师姐都赶回来拍毕业照了。现在的大三的我，也是快了哈，岁月不饶人啊。很快就会把我从大学里推出去了。像我，有时很渴望毕业出去工作，有时很想校园的生活。总之以后会很怀念校园生活，以及所有人都会怀念的无法回去的青春年少。就如现在敲着稚嫩文字的这个夜晚，也是很久以后翻到这篇文章的我会深深想念的。岁月不饶人。 看了生平第一次3D电影，超凡蜘蛛侠。什么蜘蛛侠，蝙蝠侠，美国超人，忍者神龟，变形金刚之类的剧情，都不是我的菜。所以这次 不是冲着剧情去的，3D的效果很好，想必大型电影院的效果会更好的，以后会去看看的。 追了潜行狙击。这部剧我很喜欢，目前最喜欢的两部剧，护花和潜行。很佩服TVB的编剧，这种引人入胜的剧情真的只有他们才写得出，台湾偶像剧什么的真的弱爆了。 环创换届了，很出乎意料的晚上，师兄突然告诉我们，该换届了。于是我也背负了一份不一样的责任，作为负责人之一，对环创的感觉真的大不一样了，要把环创升级提升地位的想法变得很强烈。当然6月份是重新调整了成员架构。 月底给陈江小学的小朋友过六一，自从大二很久没有骑过单车了，去过六一的感觉很棒，小朋友的欢乐时光被定格一瞬间，成了我qq空间的一抹不一样的风景。 \u003cstrong\u003e6月\u003c/strong\u003e 环创十五周年。这个活动，我很感谢最初的提出人。若没有这次活动，我不知道我们工作室要什么时候才开始改革。对我的影响也是蛮大的，突然觉得工作室没有我想象中的坚强，经过那么多年，这个孩子也是该改变了，15年，是该走向青少年时期了，不是吗。 在环创重新设计成员架构的时候，阳光也换届了，刚开始还是蛮担忧这一届的，到了他们实战的时候，我们发现自己的担忧完全是多余的，他们很棒，我很欣慰。 走进韶大项目讨论也开始了，这个产品刚开始真的以为有点难度，现在感觉也不过如此。很多事情没有接触过就没产生畏惧感，毕竟距离太远了，走近去瞧瞧，这种距离感马上就会被淡化，而一接触，距离感破碎。不要太小瞧自己了，你的潜力远远比自己的想象大得多。 这个月零零散散学了点东西，linux，php，vps的一些东东。 然后，高考的放榜了。有人欢喜有人愁的季节。弟弟妹妹一个高考一个中考也是又即将翻开不一样的篇章。 月底倒是大把考试，和以前一样，断断续续的。一直到6.27的会计这天后，假期就算开始了。   \u003cstrong\u003e7月\u003c/strong\u003e 16号前一直在学校写走进韶大的项目。没有暑假的日子真的很不习惯啊，想想以后工作就更不用想什么寒暑假，心里倒是好受了点。 16号回家的，玩得很好，在家的感觉真的很不错。小妹妹感觉长大了不少，不过以后要是很任性就不好了。还是不要过度溺爱这孩子。 24号又重返学校，继续Project，效率很高。 这段日子在学校倒是蛮安静的，如果晚上回到宿舍没有那么多的蟑螂和老鼠，这段日子应该是校园生活中蛮不错的回忆。   \u003cstrong\u003e8月\u003c/strong\u003e 月初完善走进韶大。 接着去四川参加博弈大赛，结果被完虐。下次再接再厉，要虐爆他们啊。 然后终于得以回家度过一个星期的暑假时光，感觉良好。 CET4到底还是过了，我不会告诉你们，这是我第三次考CET4的。 整个暑假来说，很忙，但收获了不错的项目经验和团队协作能力。 又翻开雷霆扫毒这部TVB看了，剧情还好，但就警匪片来说，还是远远不及潜行狙击啊。laughing真是太帅了，我喜欢。   \u003cstrong\u003e9月\u003c/strong\u003e 毫无疑问开学的日子到了，暑假还没玩够啊~~ 这次项目是游得乐了。准备去江苏参赛，有是一次不错的旅行，哈哈。 10号大概是8点多到无锡的。11号鼋头渚走起，拍了好多照片。12号答辩，老师真的厉害，给我们抽到第一个进去答辩。答辩的过程还算比较满意，至少自己没有表现得很差劲。尽管最后我们只拿了三等奖。答辩完成后，我们回到展厅，观看各个队伍的作品，有些也是挺有意思的。13号是颁奖的日子。我代表我们队伍到前面就坐，期待着奖项。轮到B组，首先是宣布二等奖，我很期待这项，因为我们几乎不可能拿一等，如果不是二等的话就是三等了。结果二等真的没有我们。然后是一等奖，我带着一丝希望，结果自然是被浇了一头冷水。只能乖乖接受三等奖的事实。 下午我们去了三国水浒城，这个倒是比较好玩点。照片自然也是拍了许多的。这里不细说啦~~ 14号清晨坐高铁到杭州转车，顺便到西湖骑单车兜了一圈。人太多了，所以没什么好玩的。中国就是人多，不管什么事物，人多了总是会破坏那么一种美。游完西湖，看时间差不多了，我们就赶往车站验票上车。 15号上午10点多回到了韶关。终于要开始真正的大三生活了哈。   \u003cstrong\u003e10月\u003c/strong\u003e 又是一个比较无聊的国庆假期，买了个SSD，不得不说，有了这玩意，神船真是得到了一次质的飞跃。有点小贵，不过能得到这飞一般的感觉，完全是值得的。 回去学校，订餐app的师兄联系了我们。于是开始学习TP。这里对那个师兄说声抱歉，似乎是我们把师兄坑了，由于工作室太忙，这项目倒是没有进展。现在应该算是不了了之了吧。   \u003cstrong\u003e11月\u003c/strong\u003e 去电影院看了场3D电影，超体。剧情还可以。这天是难得的休息哈，毕竟我的大学没有周末，想到这也是不禁苦笑一把。不过不后悔，没有周末完全是值得的。谁的青春不奋斗呢？ 11月4号  韶师小伙伴拍毕业照了，又有小伙伴即将毕业，祝他们前程似锦，现在有不少伙伴已经开始实习老师了呢。教师这职业挺不错的，哥哥，你会努力的，是吧。 今年的双十一倒是很走运，拿到了111元红包。其中100元红包完全是走大运收到的，红包说明是：店铺游戏红包。人品爆发到这程度，还是很难相信的，毕竟我从未想过中奖什么的会出现在我身上。 这个月环创招新结束了，这次招收的新人很满意，无论是技术还是运营。这是我们工作室首次设立运营部，共3人，每个都很棒，质量比我想象中要高很多。再次感到设立运营部是无比正确的选择，突然感受到一股新生力量慢慢成长。其实，术业有专攻，运营能力强的人，是很厉害的，亦不需要对自己不懂技术感到羞愧。我一直认为术业有专攻是很正确的一句话，你也是这么想的，是吧？ 这个月，早睡坚持了7天。本以为会坚持更久的。说真的，早睡早起的感觉真的很不错。7月份在学校就是早睡早起的，那个时候的工作效率及精神状态真是相当不错的。 我的个人博客在暑假就搭建好了，但实在太丑，没有打理。这个月为自己的wordpress弄了个不错的主题，和志豪同学的是一样的。这个主题真的很赞。附上我的博客链接 \u003ca href=\"/\"\u003e/\u003c/a\u003e  \u003cstrong\u003e12月\u003c/strong\u003e 这个月相对比较平淡。 安卓比赛的结果还是比较失望的，但从中确实看到了些我们的不足。 走进韶大2.0终于是看到雏形了，大家会一起努力的，加油各位。 CF第一次玩，感觉还不错。这段日子以后也会很怀念的，对吧，3位小伙伴。 2014年，收获了很多，谢谢所有帮助过我的人，也谢谢努力奔跑的自己。2015年，我们一样能好好过，会更好的，是吧。\u003c/p\u003e","title":"【2014年】年度总结"},{"content":"注册\n打开官方网站 http://www.paypal.com 就可以点击注册，按照自己实际情况填写即可。\n建议选择高级账号，个人账号是不能收款的。\n银行卡号我填的是工行普通的银联借记卡。现在paypal支持很多卡种了。\n验证邮箱\n邮箱建议填写gmail hotmail等国际邮箱(邮箱将是你的收款账号，当然注册后也可以添加其他邮箱作为主邮箱)，如果等了几分钟还没有确定邮件发过来，请打开paypal个人主页右侧的 “邮箱验证” 菜单。\n跳转后，点击最下方的重新发送。\n用户认证\n此时的状态仍然是未认证，点击进去，安装好安全控件，输入你的取款密码和预留手机号就可以验证成功，此时你的账号就没有一些限制了。当然你也可以不认证，对不提现也没有大资金出入的用户来说。\nps：E文不好的同学，页面右上角有语言选择简体中文就ok。\n附：\n一、个人账户\n个人账户通俗点来讲，其实就是喜欢海外购物的买家使用账户！它相对于高级账户来说，功能少，限制多！\n不能接受来自信用卡的付款\n不能使用ebay来进行拍卖物品\n不能使用网站及购物车收款\n不能接受捐赠\n如果没有认证，有1000美元/lefttime的付款限制。认证后没有限制\n支票提现有每月2500美元限制\n二、高级账户\n高级账户适合于进行海外交易与收款比较多的卖家使用，功能在个人账户的基础上增加了不少\n可以接受来自信用卡的付款\n认证后的账户收款没有任何限制\n支持网站及购物车收款功能\n三、企业账户\n企业账户适合大型商户进行收汇款，方便公司及企业财务管理\n拥有高级账户的所有功能\n在高级账户的基础上，可以管理多达200个子账户进行不同权限的操作，很大程度上方便了企业的管理\n因为需要绑定企业银行账户信息，在收款收摆脱了个人账户每年只能结汇5万美金的限制\n一定程度上，增加了收款方对企业账户的信任度\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E6%B3%A8%E5%86%8C%E5%B9%B6%E8%AE%A4%E8%AF%81paypal/","summary":"\u003cp\u003e\u003cstrong\u003e注册\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e打开官方网站 \u003ca href=\"http://www.paypal.com/\"\u003ehttp://www.paypal.com\u003c/a\u003e 就可以点击注册，按照自己实际情况填写即可。\u003c/p\u003e\n\u003cp\u003e建议选择高级账号，个人账号是不能收款的。\u003c/p\u003e\n\u003cp\u003e银行卡号我填的是工行普通的银联借记卡。现在paypal支持很多卡种了。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e验证邮箱\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e邮箱建议填写gmail hotmail等国际邮箱(邮箱将是你的收款账号，当然注册后也可以添加其他邮箱作为主邮箱)，如果等了几分钟还没有确定邮件发过来，请打开paypal个人主页右侧的 “邮箱验证” 菜单。\u003c/p\u003e\n\u003cp\u003e跳转后，点击最下方的重新发送。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e用户认证\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e此时的状态仍然是未认证，点击进去，安装好安全控件，输入你的取款密码和预留手机号就可以验证成功，此时你的账号就没有一些限制了。当然你也可以不认证，对不提现也没有大资金出入的用户来说。\u003c/p\u003e\n\u003cp\u003eps：E文不好的同学，页面右上角有语言选择简体中文就ok。\u003c/p\u003e\n\u003cp\u003e附：\u003c/p\u003e\n\u003cp\u003e一、个人账户\u003c/p\u003e\n\u003cp\u003e个人账户通俗点来讲，其实就是喜欢海外购物的买家使用账户！它相对于高级账户来说，功能少，限制多！\u003c/p\u003e\n\u003cp\u003e不能接受来自信用卡的付款\u003c/p\u003e\n\u003cp\u003e不能使用ebay来进行拍卖物品\u003c/p\u003e\n\u003cp\u003e不能使用网站及购物车收款\u003c/p\u003e\n\u003cp\u003e不能接受捐赠\u003c/p\u003e\n\u003cp\u003e如果没有认证，有1000美元/lefttime的付款限制。认证后没有限制\u003c/p\u003e\n\u003cp\u003e支票提现有每月2500美元限制\u003c/p\u003e\n\u003cp\u003e二、高级账户\u003c/p\u003e\n\u003cp\u003e高级账户适合于进行海外交易与收款比较多的卖家使用，功能在个人账户的基础上增加了不少\u003c/p\u003e\n\u003cp\u003e可以接受来自信用卡的付款\u003c/p\u003e\n\u003cp\u003e认证后的账户收款没有任何限制\u003c/p\u003e\n\u003cp\u003e支持网站及购物车收款功能\u003c/p\u003e\n\u003cp\u003e三、企业账户\u003c/p\u003e\n\u003cp\u003e企业账户适合大型商户进行收汇款，方便公司及企业财务管理\u003c/p\u003e\n\u003cp\u003e拥有高级账户的所有功能\u003c/p\u003e\n\u003cp\u003e在高级账户的基础上，可以管理多达200个子账户进行不同权限的操作，很大程度上方便了企业的管理\u003c/p\u003e\n\u003cp\u003e因为需要绑定企业银行账户信息，在收款收摆脱了个人账户每年只能结汇5万美金的限制\u003c/p\u003e\n\u003cp\u003e一定程度上，增加了收款方对企业账户的信任度\u003c/p\u003e","title":"注册并认证paypal"},{"content":"写在前面：\n这是高二是作为日记写的，但是只写了一点，写的是开头和结尾。本人认为还是终章写得比较好。结尾大家能看懂多少就多少。\n这个小说可以说，是我们现实世界在镜中的模样，如，小说的背景：厄斯星，与earth（地球）发音是不是很像？\nPs:小说的开头和结尾是照应的，揭示的是宇宙万物的哲学道理：一花一世界。本人认为，一花是多世界的啦。当然，不止花，其他东西都是如此。\n《命运》讲的是厄斯星上的一个少年（格斯）的故事，由于大陆上所谓命运之神（命运灵魂）的“命运计划”，些许人开始了成为“命运者”的考验。对于这个命运之神的计划，后来人们才知道，他们一直被命运之神计划，落于黑暗之中。于这黑暗，也只有那一抹蓝色，化为光……\n\u0026mdash;- 2011-7-15 21:15\n第一章：一抹蓝色\n庭院里，阳光浸满。\n草坪中盛开着一朵花，花的旁边架起一架仪器。从那仪器的屏幕可以清晰地看到一串不断增加的数字，单位是秒。\n一个少年从窗口往外看着那朵花，皱起了眉头，不满地说：“我还没见过这么麻烦的作业，非要我计算这朵花的存活时间。”\n少年离开窗口，转身打开门走向草坪。\n刺眼的阳光让少年不情愿地半眯着眼，他看着屏幕上的数字，“这朵花已经存活了86400秒！”\n与此同时，时空似乎转移到了花朵内部，不断深入——\n“86400年？没错，厄斯星的确与宇宙共存了86400年。”一个身穿黑袍的老人低着头，踏着积雪向前走。老人旁边的是一个身着蓝色长袍的少年，少年也同样低着头。\n老人突然停住，温和的双眼看着少年，“格斯，怎么突然问这个问题？”声音洪亮，却给人以无尽体贴的感觉。\n这位叫格斯的少年也停住了脚步，望着眼前不断飘落的雪花道：“没什么，老师。我只是感叹这人生的漫长，我就想到我们的星球是否同样漫长得令人迷惘。只是，我没想到我们的厄斯星是与宇宙一起形成的。”\n老人笑了起来，“人生漫长？哈哈，孩子，你应该在你的人生中找些乐趣。像我，我还觉得这人生太短暂了呢！我们厄斯星人不过1500年的寿命而已。”\n老人用手扫扫少年肩上的雪，“格斯，今天可是我们柯尔特学院开学的日子，你就不去看看那些新学员。说不定，新学员中也有像你这样的人呢！”\n如老人预料的一样，格斯的神情并没多大变化，海蓝色的眼有着无尽的冷漠，“像我有什么好？”格斯沉默了一会，“老师，今天是开学的第一天，你一定很忙，我就先离开了。”\n老人微微点头，一抹蓝色消失在这雪地上。\n这时，这片雪地森林只剩黑袍老人伫立原地，“格斯他，依旧是一抹蓝色。”\n……\n今天正是柯尔特学院占的地像一个矩形东西两侧为长，南北两侧为宽。因为柯尔特学院开设了炼金术和魔法两种不同的学科，所以学院被划分为南北两部分。其中北面是炼金术士的地盘，称为北院；南面则是魔法师的天地，称为南院。北院与南院被一堵墙分隔开来，只有墙中间的一扇门连通两院，这扇门被叫做中门。\n一般情况下，魔法师是不允许到北院去的，同样，炼金术士也不能到南院。若他们要出学院，也得走各自的大门。北院的大门在学院最北处，南院的大门理所当然在学院最南处。\n中门两侧坐落着两座高塔，这两座塔是柯尔特学院的标志性建筑，叫中门双塔。\n靠东边的塔叫测试塔，用于检测学生的能力，靠西边的塔叫首塔，是柯尔特学院的总务处。两座塔底部南北面各开一扇门，这就意味着在院内，魔法师与炼金术士的见面地点被固定在塔内，没有其他地方。\n而现在全学院最热闹的地方就在中门东侧的测试塔内。\n测试塔第二层。\n幽黑的空间里透不进一丝亮光，唯一的光源来自一个闪耀着白光的五芒星魔法阵。魔法阵流转着的绚丽的白光泻在前来测试的孩子们脸上，一片喧闹顿时充斥在这幽黑的空间里。\n“我还没见过魔法阵呢。”一双小眼跳动着惊喜之色，“好耀眼。”\n另一个男孩眼睛盯着流转的白光，道：“魔法阵我也见过不少，就是没见过光是白色的。”说完，一脸羡慕地呆看着。\n“我要当魔法师，天天在房间里布置各种颜色的魔法阵。”\n“哼，这魔法阵是拿来玩闹的吗？到底是小孩子。”一个较高的黑发少年低语，“要是我成了炼金术士，父亲就不用为家发愁了。”\n“安静。”魔法阵旁蓦然出现一位黑袍老人，白光照在满是皱纹的脸上。正是被格斯称呼为老师的老者。“我叫莫曼·威金斯。你们都是通过精神力测试的，以后你们就叫我老师，明白吗？”\n“明白。”所有人都严肃起来，自己可是柯尔特学院的学生了。\n莫曼看着乖巧的学生，笑了，“很好，现在分学科。要成为魔法师还是炼金术士可不是由你们决定的，而是要让这魔法阵测试。现在你们一个个通过魔法阵。”\n孩子们一个接一个小心地穿过魔法阵的白色光芒。\n莫曼则在一旁默念着，“炼金术士、魔法师、魔法师、炼金术士、魔法师……”\n南院的一个湖泊旁。\n一个留着天蓝色头发，身穿蓝色长袍的少年正站在铺满白雪的地上，在风雪中一动不动，岿然雕塑。他额前的长发紧紧遮住右眼及右脸颊，风吹不动他的头发，原来连风也无法窥视。一片雪花飘落到浅蓝长裤上，融化成水珠，滑落到深蓝长靴上，被蒸发。\n这少年正是格斯。\n“老师让我过去？”格斯海蓝色的眸子闪烁了一下，“好。”\n依旧在测试塔第二层。\n孩子们被分为三类站在他们老师——莫曼面前。 莫曼看到眼前两个孩子就想到了格斯，也想到了当年的自己。当年自己也跟这两个孩子一样呢！一样傲气逼人。格斯当时也一样吧！可是现在——\n一抹蓝色从塔的第三层挪到了第二层。“老师。”\n“格斯，这些孩子都是这次招收的学生。打个招呼吧！”\n格斯将眼前的孩子扫了一眼。孩子被分为三类，左边的是魔法师，右边的是炼金术士，而中间的，和自己一样，都是双修师，“大家好，我叫格斯。”\n孩子们一阵哗然。\n“他的瞳孔是白色的哎，好奇怪。”\n“对啊，有点吓人。还有，你看他的蓝头发，好像流动着银光。”\n“而且，他一身蓝色。他是不是很喜欢蓝色？只有他背上漆黑的剑不是蓝色的。”\n“他为什么要将右眼遮住啊？差不多将半边脸遮住了耶！”\n莫曼笑看着格斯，“格斯，大家好像对你的右眼挺感兴趣的。你还是不愿意扫开你眼前的头发吗？”\n格斯那露在空气中的左眼黯淡了，随即恢复往日的眼神，“老师，没什么事我先走了。”\n莫曼苦笑着点头。一抹蓝色，消失不见。\n第二章：命运的秘密（上）\n厄斯历86400年3月4日。\n今天距离学院开学之日已经过去3天了，学生们渐渐习惯了学院近似封闭式的管理。北院和南院结束了三个月的寂静，开始活跃起来。\n阳光斜斜地照在漫天飞舞的白雪上，晶莹非常。这迷人的景色在其他大陆一定会引起居民的赞叹，但这里是圣光大陆，厄斯星的最北部，这里终年飘雪，雪并不珍贵。\n在北院的雪地森林里，莫曼与三个孩子缓缓行走，他们的影子被拉得很长，犹如他们旁边高树的长影。\n三个孩子中最小的一个略显慌张。这是一个黑发男孩，穿着学院的蓝色制服，眼光停在莫曼的背影时，身体不由一抖。他心道，这个平时很慈祥的老师，会不会也有可怕的一面呢？这个男孩叫布恩·德里克。\n“布恩，你似乎有点紧张啊。不过，我也有点紧张呢！老师一大早叫我们来，到现在还没说话。”说话的是一个叫雅米·德里克的女孩，身穿粉红色的制服。看来粉红色真是女孩们的偏爱。“布恩，我记得你以前喜欢黑颜色的，怎么现在专挑蓝色的衣服穿？”\n布恩把头一扭，“我这叫向格斯学长致敬！”\n雅米一脸不屑，“致敬就致敬，干嘛连衣服都穿同种颜色的。算了，我不跟你说这些了。我问你，你做了什么坏事？紧张这种表情可不适合你。”\n布恩赶紧把声音压小，“我昨天去老师房里，看到一株尚未开花的植物。一不小心使用了千青术。”\n千青术，因可促进植物开花结果，使之长青而得名。\n旁边的雅米听后吓了一大跳，“你惨了，老师喜欢看植物生长的过程，你一个千青术就让植物开花了？还好，可以用逆之千青术让植物恢复原样。你待会带我去，看在你我邻居一场，我也不能见死不救，我就帮你一次。”\n布恩一脸尴尬，“那个，我的千青术失败了，植物也化为一堆死灰了。”\n雅米脸上的表情静止了1秒，随即怒视着布恩，“如果老师这次是因你做的好事而惩罚我们，你等着。”\n三个孩子中最大的一个，这时开口了，“这点小事老师不会怪我们的。老师应该有别的事，我们等等。”这个男孩穿着黑色制服，在白雪地里很是显眼。这个男孩叫穆特·德里克。\n在柯尔特村，德里克是一个常见的姓氏。常见也就意味着普通，可谁也没想到这普通的人家中这次竟出现了三个天才。继格斯·德里克之后的三个天才。\n这三个孩子的确是天才，既可以修炼魔法又可以修炼炼金术。可以修炼两种技能听起来似乎没什么天才的。但事实就证明这的确是天才，毕竟整个厄斯星的这种人物不足百人，而这类人的实力在厄斯星里是最强的，这类人被称为双修师。\n而且，成为双修师跟后天没有关系，也就是说一出生就被注定能否成为双修师，后天的努力跟双修师没有一点关系。\n走在前面的莫曼停住脚步，回过头。表情异常严肃，双目炯亮，“穆特，雅米，布恩。”\n“是。”三人应声道。\n莫曼道，“你们身为双修师，实力与其他人不同，知道吗？”\n“知道。”\n莫曼冷冷点头，不同以往的祥和，“那么，你们就有特殊的使命。现在，你们必须知道一些秘密了。”\n第三章——命运的秘密（下）\n空气变得凝重，似乎连呼吸都被压抑。只有雪花，不识趣地落在四人身上，渐消融。\n莫曼接着道，“我们厄斯星，有命运灵魂的存在。命运灵魂就是我们说的命运之神。命运之神存在于帝国大陆、帝东大陆和帝西大陆，而我们圣光大陆和极南的冰山大陆没有命运之神。这些你们都知道。”\n这些事情，穆特三人的确知道，想去见命运之神只有去“三帝”大陆。且不说路途漫漫，单是自己圣光大陆这关便难以过，毕竟圣光大陆有一条人尽皆知的命令：凡我圣光大陆的子民，没有圣光城城主的批准，一律不得离开圣光大陆。违者，按圣光城律令予以惩罚。\n想得到圣光城城主的批准，以城主的性格看，几乎不可能。而一旦违背了这条命令，几乎一个下场，死。\n“然而你们不知道的是，”莫曼顿了顿，“我们圣光大陆，其实有命运之神的存在。”\n说到这，穆特三人盯着莫曼，吃惊流露于眼眸之中，“我们这，也有，命运之神？”\n莫曼定住双眼，微点头，“没错。我们圣光大陆是厄斯星第四个拥有命运之神的大陆。”\n布恩忍不住插嘴，“那冰山大陆也有命运之神吗？”\n“没有，”莫曼很肯定，“不知什么原因，冰山大陆的冰山城城主拒绝了命运之神的降临。”\n三人大吃一惊，“拒绝神？拒绝命运？”\n莫曼却是说：“他的确代表冰山大陆拒绝了神，但并不是说拒绝了命运。命运，怎能被拒绝。”说到最后两个字时，莫曼洪亮的声音却小了许多。\n“不说这些，”莫曼正色道，“现在讲讲命运之神的‘命运计划’。这‘命运计划’是命运之神制定的。计划内容是：只要大陆上有10个人通过命运考验成为命运者，命运之神便会赐予一份改变命运的奖赏。”\n“神赐予的奖赏？成为命运者？我要成为命运者！”布恩连道。\n其余二人也有向往的样子。\n莫曼要的就是这种效果，自己主动去做可比被命令去做效果要好得多。\n“我刚才说过，要成为命运者必先经受命运之神的考验。神的考验，你们无法想象有多难，在我们圣光大陆，就只有双修师有可能通过考验，一般的魔法师、炼金术士去，只是送死。这也是我们对外称圣光大陆没有命运之神的原因。\n你们应对考验成功的可能性也挺大，前提是你们必须为之努力，从现在开始，努力修炼魔法和炼金术。等你们大概够资格了我会带你们去圣光城，命运之神便在那。”\n“好，”莫曼有恢复以往的祥和，“我们走吧。”\n三人跟着莫曼缓行。\n见莫曼有了笑容，三人又活跃起来。\n“老师，”是穆特的声音，“我们圣光大陆现在有多少个命运者？”\n“呵呵，已有8个了，再加上2个就够了。你们其中出2个应该不是问题。”\n“可是老师，”布恩小心道，“奖赏是什么？”\n莫曼微迟疑，道，“奖赏岂是我们能知道的？”\n“那奖赏怎么分，老师应该知道了吧？”\n“只要我们圣光大陆完成了‘命运计划’，每个圣光大陆子民都能享受奖励。”莫曼笑道。\n布恩一脸不满，“那我们岂不是白干了？”\n“怎么能这么说，”莫曼沉下脸，“我们作为圣光大陆的子民，就有责任为我们的圣光大陆争取荣耀与利益。不过，大概是命运者得到的奖赏较大。”\n“那也不错。”布恩笑了，“既然我选择了命运考验，那我就不顾风雨兼程。”\n莫曼无奈地说：“还是不懂啊！不是你们选择命运，而是命运选择了你们。”\n……\n转眼夕阳西下，晚风吹雪，夜寂静，惟有狂风。\n柯尔特学院的一间小屋内。\n一个少年卧在床上，显然正熟睡。在梦中，一个女人牵着一个小孩的手，“格斯，你父亲的考验快到了。”\n“格斯要和母亲一起去。”小孩打开双臂。\n女人抱起小孩，“好啊，格斯要乖乖的哦。”\n女人身影渐渐消散，世界变得灰暗，然后一切重归漆黑的夜。\n卧在床上的少年，身体好像动了一下。在月光斜照下，少年眼里落下一滴液体。\n梦散，人空，泪自流。\n【中间省略N章】\n终章——灭世重生 厄斯历86490年。\n一片柳树林里，微风轻轻牵起两人的黑发，发丝飘动。两人就这么站着，低头看着躺在地上的青年，沉默不语。\n躺着的青年有一头流转银光的天蓝色头发，双眸已经合上。空气中飞舞着的白雪时而落在青年的蓝色长袍上，雪越积越厚，却没有消融。这是一场不会消融的雪。\n可这里是帝国大陆，厄斯星赤道附近，怎么会降雪？\n一阵风吹来，青年身上的白雪重新飞回空中。果然不是雪，而是柳絮。\n“灰夕灰，”站着的女人依旧看着地上的青年，“格斯就真这么躺下了？”\n那个叫灰夕灰的男人正用如利剑般的眼睛凝视着青年。这青年的确是格斯。灰夕灰开口道，“洛羡，你应该明白，格斯了无遗憾。”\n洛羡却是说：“还记得格斯第一次来帝国大陆见到柳絮纷飞时的样子。那时他就那么呆住了，他那时还以为是雪呢。不过，这柳絮倒也挺像雪的。”说完浅浅一笑。\n“对，格斯在这帝国大陆没什么在乎的东西，”灰夕灰也望向从柳条飘飞出来的柳絮，“倒是看到柳絮时，眼里总露出那么一点激动。” 洛羡微笑着看向格斯微闭的眼，“嗯，他的眼神很少流露激动，就连与命运之神决战时，眼神都那么平静。灰夕灰，你知道格斯为什么偏爱雪吗？他的家乡就在圣光大陆，一个终年飘雪的大陆。”\n“别提那命运之神，”灰夕灰微皱眉头，“它也配叫神？不过，也只有格斯看清了那命运灵魂。可最后——”他们都还记得当时的情景。\n格斯击败命运灵魂也是奄奄一息了，灰夕灰赶紧飞向正下坠的格斯，接住了他。洛羡靠近他们时，格斯才用微弱的气息说：“我真想再看一次雪。”\n可在这远离圣光大陆的地方，会有雪？\n他们这才来到帝国大陆最大的柳树林。当灰夕灰把格斯放到地上时，格斯笑了，洛羡他们从来没见格斯笑过，从来没有。格斯闭上眼之前说的最后一句话是：“我，没有遗憾了。”\n洛羡抱起格斯，对灰夕灰说，“走吧！去圣光大陆。”\n两个身影渐渐消失在远空。\n两天后的圣光大陆上空，两个人站在空中，其中一个人还抱着一个青年。忽然，这两人就降落了。\n当两人踏在雪地上时，洛羡轻声道：“格斯，你回来了。你回到你的家乡了。”\n正如当年格斯描绘的那样，圣光大陆毫无人烟，只有堆起的座座坟墓。在这里，雪也是孤独的。\n洛羡他们找到了柯尔特学院，在雪地森林里将格斯埋进了深深的雪地。“格斯说过，南院的雪地森林是他最喜欢的地方。”洛羡盯着刚刚立下的墓碑，“格斯，现在你真的没有遗憾了。”\n在这里，大雪纷飞，是真的雪。\n“洛羡，”灰夕灰转过身，面向洛羡，“格斯说的灭世之年就是今年吧？”\n“是，”洛羡笑了，“我们也没有什么遗憾，无遗憾地死去，很幸福。”\n……\n三个月后的某一天，天地能量爆发了，空间被挤压成虚无。\n这年正是厄斯历86490年。\n犹如时空转换，时空从花朵内部出来，到了一个在阳光沐浴下的草坪。\n一个少年正一手握着刚被摧残的花朵，一手填着表格。在阳光下，他在“花朵存活时间”栏里，写下86490s。\n写完后，少年张开手，残花飘落。\n时空又转移到残花内部，似乎另一个世界又已形成，恍惚听到一个声音，“今年是罗寂历1年……”\n【全书完】\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E5%91%BD%E8%BF%90/","summary":"\u003cp\u003e写在前面：\u003cbr\u003e\n这是高二是作为日记写的，但是只写了一点，写的是开头和结尾。本人认为还是终章写得比较好。结尾大家能看懂多少就多少。\u003cbr\u003e\n这个小说可以说，是我们现实世界在镜中的模样，如，小说的背景：厄斯星，与earth（地球）发音是不是很像？\u003cbr\u003e\nPs:小说的开头和结尾是照应的，揭示的是宇宙万物的哲学道理：一花一世界。本人认为，一花是多世界的啦。当然，不止花，其他东西都是如此。\u003cbr\u003e\n《命运》讲的是厄斯星上的一个少年（格斯）的故事，由于大陆上所谓命运之神（命运灵魂）的“命运计划”，些许人开始了成为“命运者”的考验。对于这个命运之神的计划，后来人们才知道，他们一直被命运之神计划，落于黑暗之中。于这黑暗，也只有那一抹蓝色，化为光……\u003c/p\u003e\n\u003cp\u003e                    \u0026mdash;-  2011-7-15 21:15\u003c/p\u003e\n\u003cp\u003e                         第一章：一抹蓝色\u003cbr\u003e\n    庭院里，阳光浸满。\u003cbr\u003e\n    草坪中盛开着一朵花，花的旁边架起一架仪器。从那仪器的屏幕可以清晰地看到一串不断增加的数字，单位是秒。\u003cbr\u003e\n    一个少年从窗口往外看着那朵花，皱起了眉头，不满地说：“我还没见过这么麻烦的作业，非要我计算这朵花的存活时间。”\u003cbr\u003e\n    少年离开窗口，转身打开门走向草坪。\u003cbr\u003e\n    刺眼的阳光让少年不情愿地半眯着眼，他看着屏幕上的数字，“这朵花已经存活了86400秒！”\u003cbr\u003e\n    与此同时，时空似乎转移到了花朵内部，不断深入——\u003cbr\u003e\n   “86400年？没错，厄斯星的确与宇宙共存了86400年。”一个身穿黑袍的老人低着头，踏着积雪向前走。老人旁边的是一个身着蓝色长袍的少年，少年也同样低着头。\u003cbr\u003e\n    老人突然停住，温和的双眼看着少年，“格斯，怎么突然问这个问题？”声音洪亮，却给人以无尽体贴的感觉。\u003cbr\u003e\n    这位叫格斯的少年也停住了脚步，望着眼前不断飘落的雪花道：“没什么，老师。我只是感叹这人生的漫长，我就想到我们的星球是否同样漫长得令人迷惘。只是，我没想到我们的厄斯星是与宇宙一起形成的。”\u003cbr\u003e\n    老人笑了起来，“人生漫长？哈哈，孩子，你应该在你的人生中找些乐趣。像我，我还觉得这人生太短暂了呢！我们厄斯星人不过1500年的寿命而已。”\u003cbr\u003e\n    老人用手扫扫少年肩上的雪，“格斯，今天可是我们柯尔特学院开学的日子，你就不去看看那些新学员。说不定，新学员中也有像你这样的人呢！”\u003cbr\u003e\n    如老人预料的一样，格斯的神情并没多大变化，海蓝色的眼有着无尽的冷漠，“像我有什么好？”格斯沉默了一会，“老师，今天是开学的第一天，你一定很忙，我就先离开了。”\u003cbr\u003e\n    老人微微点头，一抹蓝色消失在这雪地上。\u003cbr\u003e\n    这时，这片雪地森林只剩黑袍老人伫立原地，“格斯他，依旧是一抹蓝色。”\u003cbr\u003e\n    ……\u003cbr\u003e\n    今天正是柯尔特学院占的地像一个矩形东西两侧为长，南北两侧为宽。因为柯尔特学院开设了炼金术和魔法两种不同的学科，所以学院被划分为南北两部分。其中北面是炼金术士的地盘，称为北院；南面则是魔法师的天地，称为南院。北院与南院被一堵墙分隔开来，只有墙中间的一扇门连通两院，这扇门被叫做中门。\u003cbr\u003e\n    一般情况下，魔法师是不允许到北院去的，同样，炼金术士也不能到南院。若他们要出学院，也得走各自的大门。北院的大门在学院最北处，南院的大门理所当然在学院最南处。\u003cbr\u003e\n    中门两侧坐落着两座高塔，这两座塔是柯尔特学院的标志性建筑，叫中门双塔。\u003cbr\u003e\n    靠东边的塔叫测试塔，用于检测学生的能力，靠西边的塔叫首塔，是柯尔特学院的总务处。两座塔底部南北面各开一扇门，这就意味着在院内，魔法师与炼金术士的见面地点被固定在塔内，没有其他地方。\u003cbr\u003e\n    而现在全学院最热闹的地方就在中门东侧的测试塔内。\u003cbr\u003e\n    测试塔第二层。\u003cbr\u003e\n    幽黑的空间里透不进一丝亮光，唯一的光源来自一个闪耀着白光的五芒星魔法阵。魔法阵流转着的绚丽的白光泻在前来测试的孩子们脸上，一片喧闹顿时充斥在这幽黑的空间里。\u003cbr\u003e\n    “我还没见过魔法阵呢。”一双小眼跳动着惊喜之色，“好耀眼。”\u003cbr\u003e\n     另一个男孩眼睛盯着流转的白光，道：“魔法阵我也见过不少，就是没见过光是白色的。”说完，一脸羡慕地呆看着。\u003cbr\u003e\n    “我要当魔法师，天天在房间里布置各种颜色的魔法阵。”\u003cbr\u003e\n    “哼，这魔法阵是拿来玩闹的吗？到底是小孩子。”一个较高的黑发少年低语，“要是我成了炼金术士，父亲就不用为家发愁了。”\u003cbr\u003e\n    “安静。”魔法阵旁蓦然出现一位黑袍老人，白光照在满是皱纹的脸上。正是被格斯称呼为老师的老者。“我叫莫曼·威金斯。你们都是通过精神力测试的，以后你们就叫我老师，明白吗？”\u003cbr\u003e\n    “明白。”所有人都严肃起来，自己可是柯尔特学院的学生了。\u003cbr\u003e\n     莫曼看着乖巧的学生，笑了，“很好，现在分学科。要成为魔法师还是炼金术士可不是由你们决定的，而是要让这魔法阵测试。现在你们一个个通过魔法阵。”\u003cbr\u003e\n     孩子们一个接一个小心地穿过魔法阵的白色光芒。\u003cbr\u003e\n     莫曼则在一旁默念着，“炼金术士、魔法师、魔法师、炼金术士、魔法师……”\u003cbr\u003e\n     南院的一个湖泊旁。\u003cbr\u003e\n     一个留着天蓝色头发，身穿蓝色长袍的少年正站在铺满白雪的地上，在风雪中一动不动，岿然雕塑。他额前的长发紧紧遮住右眼及右脸颊，风吹不动他的头发，原来连风也无法窥视。一片雪花飘落到浅蓝长裤上，融化成水珠，滑落到深蓝长靴上，被蒸发。\u003cbr\u003e\n     这少年正是格斯。\u003cbr\u003e\n    “老师让我过去？”格斯海蓝色的眸子闪烁了一下，“好。”\u003cbr\u003e\n     依旧在测试塔第二层。\u003cbr\u003e\n     孩子们被分为三类站在他们老师——莫曼面前。   \u003cbr\u003e\n     莫曼看到眼前两个孩子就想到了格斯，也想到了当年的自己。当年自己也跟这两个孩子一样呢！一样傲气逼人。格斯当时也一样吧！可是现在——\u003cbr\u003e\n    一抹蓝色从塔的第三层挪到了第二层。“老师。”\u003cbr\u003e\n    “格斯，这些孩子都是这次招收的学生。打个招呼吧！”\u003cbr\u003e\n    格斯将眼前的孩子扫了一眼。孩子被分为三类，左边的是魔法师，右边的是炼金术士，而中间的，和自己一样，都是双修师，“大家好，我叫格斯。”\u003cbr\u003e\n    孩子们一阵哗然。\u003cbr\u003e\n    “他的瞳孔是白色的哎，好奇怪。”\u003cbr\u003e\n    “对啊，有点吓人。还有，你看他的蓝头发，好像流动着银光。”\u003cbr\u003e\n    “而且，他一身蓝色。他是不是很喜欢蓝色？只有他背上漆黑的剑不是蓝色的。”\u003cbr\u003e\n    “他为什么要将右眼遮住啊？差不多将半边脸遮住了耶！”\u003cbr\u003e\n     莫曼笑看着格斯，“格斯，大家好像对你的右眼挺感兴趣的。你还是不愿意扫开你眼前的头发吗？”\u003cbr\u003e\n     格斯那露在空气中的左眼黯淡了，随即恢复往日的眼神，“老师，没什么事我先走了。”\u003cbr\u003e\n     莫曼苦笑着点头。一抹蓝色，消失不见。\u003cbr\u003e\n                      第二章：命运的秘密（上）\u003cbr\u003e\n     厄斯历86400年3月4日。\u003cbr\u003e\n     今天距离学院开学之日已经过去3天了，学生们渐渐习惯了学院近似封闭式的管理。北院和南院结束了三个月的寂静，开始活跃起来。\u003cbr\u003e\n     阳光斜斜地照在漫天飞舞的白雪上，晶莹非常。这迷人的景色在其他大陆一定会引起居民的赞叹，但这里是圣光大陆，厄斯星的最北部，这里终年飘雪，雪并不珍贵。\u003cbr\u003e\n     在北院的雪地森林里，莫曼与三个孩子缓缓行走，他们的影子被拉得很长，犹如他们旁边高树的长影。\u003cbr\u003e\n     三个孩子中最小的一个略显慌张。这是一个黑发男孩，穿着学院的蓝色制服，眼光停在莫曼的背影时，身体不由一抖。他心道，这个平时很慈祥的老师，会不会也有可怕的一面呢？这个男孩叫布恩·德里克。\u003cbr\u003e\n     “布恩，你似乎有点紧张啊。不过，我也有点紧张呢！老师一大早叫我们来，到现在还没说话。”说话的是一个叫雅米·德里克的女孩，身穿粉红色的制服。看来粉红色真是女孩们的偏爱。“布恩，我记得你以前喜欢黑颜色的，怎么现在专挑蓝色的衣服穿？”\u003cbr\u003e\n     布恩把头一扭，“我这叫向格斯学长致敬！”\u003cbr\u003e\n     雅米一脸不屑，“致敬就致敬，干嘛连衣服都穿同种颜色的。算了，我不跟你说这些了。我问你，你做了什么坏事？紧张这种表情可不适合你。”\u003cbr\u003e\n     布恩赶紧把声音压小，“我昨天去老师房里，看到一株尚未开花的植物。一不小心使用了千青术。”\u003cbr\u003e\n     千青术，因可促进植物开花结果，使之长青而得名。\u003cbr\u003e\n     旁边的雅米听后吓了一大跳，“你惨了，老师喜欢看植物生长的过程，你一个千青术就让植物开花了？还好，可以用逆之千青术让植物恢复原样。你待会带我去，看在你我邻居一场，我也不能见死不救，我就帮你一次。”\u003cbr\u003e\n     布恩一脸尴尬，“那个，我的千青术失败了，植物也化为一堆死灰了。”\u003cbr\u003e\n     雅米脸上的表情静止了1秒，随即怒视着布恩，“如果老师这次是因你做的好事而惩罚我们，你等着。”\u003cbr\u003e\n     三个孩子中最大的一个，这时开口了，“这点小事老师不会怪我们的。老师应该有别的事，我们等等。”这个男孩穿着黑色制服，在白雪地里很是显眼。这个男孩叫穆特·德里克。\u003cbr\u003e\n     在柯尔特村，德里克是一个常见的姓氏。常见也就意味着普通，可谁也没想到这普通的人家中这次竟出现了三个天才。继格斯·德里克之后的三个天才。\u003cbr\u003e\n    这三个孩子的确是天才，既可以修炼魔法又可以修炼炼金术。可以修炼两种技能听起来似乎没什么天才的。但事实就证明这的确是天才，毕竟整个厄斯星的这种人物不足百人，而这类人的实力在厄斯星里是最强的，这类人被称为双修师。\u003cbr\u003e\n     而且，成为双修师跟后天没有关系，也就是说一出生就被注定能否成为双修师，后天的努力跟双修师没有一点关系。\u003cbr\u003e\n    走在前面的莫曼停住脚步，回过头。表情异常严肃，双目炯亮，“穆特，雅米，布恩。”\u003cbr\u003e\n   “是。”三人应声道。\u003cbr\u003e\n    莫曼道，“你们身为双修师，实力与其他人不同，知道吗？”\u003cbr\u003e\n   “知道。”\u003cbr\u003e\n    莫曼冷冷点头，不同以往的祥和，“那么，你们就有特殊的使命。现在，你们必须知道一些秘密了。”\u003cbr\u003e\n                          第三章——命运的秘密（下）\u003cbr\u003e\n     空气变得凝重，似乎连呼吸都被压抑。只有雪花，不识趣地落在四人身上，渐消融。\u003cbr\u003e\n     莫曼接着道，“我们厄斯星，有命运灵魂的存在。命运灵魂就是我们说的命运之神。命运之神存在于帝国大陆、帝东大陆和帝西大陆，而我们圣光大陆和极南的冰山大陆没有命运之神。这些你们都知道。”\u003cbr\u003e\n     这些事情，穆特三人的确知道，想去见命运之神只有去“三帝”大陆。且不说路途漫漫，单是自己圣光大陆这关便难以过，毕竟圣光大陆有一条人尽皆知的命令：凡我圣光大陆的子民，没有圣光城城主的批准，一律不得离开圣光大陆。违者，按圣光城律令予以惩罚。\u003cbr\u003e\n     想得到圣光城城主的批准，以城主的性格看，几乎不可能。而一旦违背了这条命令，几乎一个下场，死。\u003cbr\u003e\n    “然而你们不知道的是，”莫曼顿了顿，“我们圣光大陆，其实有命运之神的存在。”\u003cbr\u003e\n     说到这，穆特三人盯着莫曼，吃惊流露于眼眸之中，“我们这，也有，命运之神？”\u003cbr\u003e\n     莫曼定住双眼，微点头，“没错。我们圣光大陆是厄斯星第四个拥有命运之神的大陆。”\u003cbr\u003e\n     布恩忍不住插嘴，“那冰山大陆也有命运之神吗？”\u003cbr\u003e\n    “没有，”莫曼很肯定，“不知什么原因，冰山大陆的冰山城城主拒绝了命运之神的降临。”\u003cbr\u003e\n     三人大吃一惊，“拒绝神？拒绝命运？”\u003cbr\u003e\n     莫曼却是说：“他的确代表冰山大陆拒绝了神，但并不是说拒绝了命运。命运，怎能被拒绝。”说到最后两个字时，莫曼洪亮的声音却小了许多。\u003cbr\u003e\n     “不说这些，”莫曼正色道，“现在讲讲命运之神的‘命运计划’。这‘命运计划’是命运之神制定的。计划内容是：只要大陆上有10个人通过命运考验成为命运者，命运之神便会赐予一份改变命运的奖赏。”\u003cbr\u003e\n     “神赐予的奖赏？成为命运者？我要成为命运者！”布恩连道。\u003cbr\u003e\n      其余二人也有向往的样子。\u003cbr\u003e\n     莫曼要的就是这种效果，自己主动去做可比被命令去做效果要好得多。\u003cbr\u003e\n     “我刚才说过，要成为命运者必先经受命运之神的考验。神的考验，你们无法想象有多难，在我们圣光大陆，就只有双修师有可能通过考验，一般的魔法师、炼金术士去，只是送死。这也是我们对外称圣光大陆没有命运之神的原因。\u003cbr\u003e\n      你们应对考验成功的可能性也挺大，前提是你们必须为之努力，从现在开始，努力修炼魔法和炼金术。等你们大概够资格了我会带你们去圣光城，命运之神便在那。”\u003cbr\u003e\n     “好，”莫曼有恢复以往的祥和，“我们走吧。”\u003cbr\u003e\n      三人跟着莫曼缓行。\u003cbr\u003e\n      见莫曼有了笑容，三人又活跃起来。\u003cbr\u003e\n     “老师，”是穆特的声音，“我们圣光大陆现在有多少个命运者？”\u003cbr\u003e\n     “呵呵，已有8个了，再加上2个就够了。你们其中出2个应该不是问题。”\u003cbr\u003e\n     “可是老师，”布恩小心道，“奖赏是什么？”\u003cbr\u003e\n     莫曼微迟疑，道，“奖赏岂是我们能知道的？”\u003cbr\u003e\n     “那奖赏怎么分，老师应该知道了吧？”\u003cbr\u003e\n     “只要我们圣光大陆完成了‘命运计划’，每个圣光大陆子民都能享受奖励。”莫曼笑道。\u003cbr\u003e\n     布恩一脸不满，“那我们岂不是白干了？”\u003cbr\u003e\n     “怎么能这么说，”莫曼沉下脸，“我们作为圣光大陆的子民，就有责任为我们的圣光大陆争取荣耀与利益。不过，大概是命运者得到的奖赏较大。”\u003cbr\u003e\n     “那也不错。”布恩笑了，“既然我选择了命运考验，那我就不顾风雨兼程。”\u003cbr\u003e\n     莫曼无奈地说：“还是不懂啊！不是你们选择命运，而是命运选择了你们。”\u003cbr\u003e\n      ……\u003cbr\u003e\n     转眼夕阳西下，晚风吹雪，夜寂静，惟有狂风。\u003cbr\u003e\n     柯尔特学院的一间小屋内。\u003cbr\u003e\n     一个少年卧在床上，显然正熟睡。在梦中，一个女人牵着一个小孩的手，“格斯，你父亲的考验快到了。”\u003cbr\u003e\n   “格斯要和母亲一起去。”小孩打开双臂。\u003cbr\u003e\n    女人抱起小孩，“好啊，格斯要乖乖的哦。”\u003cbr\u003e\n    女人身影渐渐消散，世界变得灰暗，然后一切重归漆黑的夜。\u003cbr\u003e\n    卧在床上的少年，身体好像动了一下。在月光斜照下，少年眼里落下一滴液体。\u003cbr\u003e\n    梦散，人空，泪自流。\u003cbr\u003e\n                             【中间省略N章】\u003cbr\u003e\n                             终章——灭世重生 \u003cbr\u003e\n    厄斯历86490年。\u003cbr\u003e\n    一片柳树林里，微风轻轻牵起两人的黑发，发丝飘动。两人就这么站着，低头看着躺在地上的青年，沉默不语。\u003cbr\u003e\n    躺着的青年有一头流转银光的天蓝色头发，双眸已经合上。空气中飞舞着的白雪时而落在青年的蓝色长袍上，雪越积越厚，却没有消融。这是一场不会消融的雪。\u003cbr\u003e\n    可这里是帝国大陆，厄斯星赤道附近，怎么会降雪？\u003cbr\u003e\n    一阵风吹来，青年身上的白雪重新飞回空中。果然不是雪，而是柳絮。\u003cbr\u003e\n   “灰夕灰，”站着的女人依旧看着地上的青年，“格斯就真这么躺下了？”\u003cbr\u003e\n    那个叫灰夕灰的男人正用如利剑般的眼睛凝视着青年。这青年的确是格斯。灰夕灰开口道，“洛羡，你应该明白，格斯了无遗憾。”\u003cbr\u003e\n    洛羡却是说：“还记得格斯第一次来帝国大陆见到柳絮纷飞时的样子。那时他就那么呆住了，他那时还以为是雪呢。不过，这柳絮倒也挺像雪的。”说完浅浅一笑。\u003cbr\u003e\n    “对，格斯在这帝国大陆没什么在乎的东西，”灰夕灰也望向从柳条飘飞出来的柳絮，“倒是看到柳絮时，眼里总露出那么一点激动。” \u003cbr\u003e\n    洛羡微笑着看向格斯微闭的眼，“嗯，他的眼神很少流露激动，就连与命运之神决战时，眼神都那么平静。灰夕灰，你知道格斯为什么偏爱雪吗？他的家乡就在圣光大陆，一个终年飘雪的大陆。”\u003cbr\u003e\n   “别提那命运之神，”灰夕灰微皱眉头，“它也配叫神？不过，也只有格斯看清了那命运灵魂。可最后——”他们都还记得当时的情景。\u003cbr\u003e\n    格斯击败命运灵魂也是奄奄一息了，灰夕灰赶紧飞向正下坠的格斯，接住了他。洛羡靠近他们时，格斯才用微弱的气息说：“我真想再看一次雪。”\u003cbr\u003e\n    可在这远离圣光大陆的地方，会有雪？\u003cbr\u003e\n    他们这才来到帝国大陆最大的柳树林。当灰夕灰把格斯放到地上时，格斯笑了，洛羡他们从来没见格斯笑过，从来没有。格斯闭上眼之前说的最后一句话是：“我，没有遗憾了。”\u003cbr\u003e\n    洛羡抱起格斯，对灰夕灰说，“走吧！去圣光大陆。”\u003cbr\u003e\n    两个身影渐渐消失在远空。\u003cbr\u003e\n    两天后的圣光大陆上空，两个人站在空中，其中一个人还抱着一个青年。忽然，这两人就降落了。\u003cbr\u003e\n    当两人踏在雪地上时，洛羡轻声道：“格斯，你回来了。你回到你的家乡了。”\u003cbr\u003e\n    正如当年格斯描绘的那样，圣光大陆毫无人烟，只有堆起的座座坟墓。在这里，雪也是孤独的。\u003cbr\u003e\n    洛羡他们找到了柯尔特学院，在雪地森林里将格斯埋进了深深的雪地。“格斯说过，南院的雪地森林是他最喜欢的地方。”洛羡盯着刚刚立下的墓碑，“格斯，现在你真的没有遗憾了。”\u003cbr\u003e\n    在这里，大雪纷飞，是真的雪。\u003cbr\u003e\n   “洛羡，”灰夕灰转过身，面向洛羡，“格斯说的灭世之年就是今年吧？”\u003cbr\u003e\n   “是，”洛羡笑了，“我们也没有什么遗憾，无遗憾地死去，很幸福。”\u003cbr\u003e\n    ……\u003cbr\u003e\n    三个月后的某一天，天地能量爆发了，空间被挤压成虚无。\u003cbr\u003e\n    这年正是厄斯历86490年。\u003cbr\u003e\n    犹如时空转换，时空从花朵内部出来，到了一个在阳光沐浴下的草坪。\u003cbr\u003e\n    一个少年正一手握着刚被摧残的花朵，一手填着表格。在阳光下，他在“花朵存活时间”栏里，写下86490s。\u003cbr\u003e\n    写完后，少年张开手，残花飘落。\u003cbr\u003e\n    时空又转移到残花内部，似乎另一个世界又已形成，恍惚听到一个声音，“今年是罗寂历1年……”\u003cbr\u003e\n                               【全书完】\u003c/p\u003e","title":"命运"},{"content":"第二篇章：仙墨 ——2011-7-11 14:08 很难得的是我一大早就起来了。\n当我走出小屋，有几个村民与我打招呼，“柳圣人，精神好啊。”\n我置之一笑，“叫我柳画就好，我可不是圣人啊。”心里却道，“精神好？我可是一夜没睡。”\n旁边的村民依旧叫我柳圣人，我也是有口难辩了。看着这灿烂的晴空，不禁感叹，这世界果然只有一天的日出和日落，而今天，没有日出，有的只是蓦然悬挂高空的烈日和瞬间的阳光普照。\n还记得当时是漆黑一片，我正在床上思索着什么，忽然从窗外冲进的刺眼的光打断了我的思索，让我有种时空跳跃的错觉，我需要时间来习惯这奇异的世界。\n………\n与此同时的另一个空间——\n暗黑的空间，一头银发乱飘的男子站立不动，左手托着一个彩光与邪黑之气相互交替的砚台，“这砚台快完全妖化了。不过，还有那支笔。”男子突然身形晃了晃，宛如鹰爪的手支住晕眩的头颅，然后将头扭向易村的方位，嘴角勾起笑容，“画主，你到底还是来了。”\n银发男子心念一动，一名身穿玄色长袍的老人踏进这个暗黑的空间，老人微微一躬，“火大人。”\n“传令下去，今天起，让驻军撤离封笔仙山”，银发男子的声音很冷，不像他的名字，火，“画主已经入画，一切开始改变。”\n画主已经入画，一切开始改变。\n………\n晨。易村。易族祠堂。\n“大家也知道了，柳圣人决定在我易村住下”，村长坐在一张黑漆长桌的主座前，“我想将我易村的仙墨长老这一职位授予柳圣人。不知各位长老，有何异议？”\n这个世界叫：仙墨之界。\n仙墨，这个世界的信仰所在。\n传说，仙墨之界的创者（创世主）正是用笔墨洒落寰宇，用笔墨画山添河，用笔墨招人唤灵，才成就了这个世界。因此，仙墨之界的各种存在都隐约带着点墨色。人们把创世主称为仙墨画主。而，仙墨，画主用于创世的存在，却遗留下来了。\n至于仙墨在何处，有人说在封笔仙山。\n封笔仙山，传说是仙墨画主的最后一笔，仙山的形状像极了笔尖朝上的画笔。故，很多人纷纷前往封笔仙山，爬上峰顶寻找传说中的仙墨。但是从来没人得到过。封笔仙山因为多人游览参观，反而成为了仙墨之界最著名的旅游胜地，很多人都想去瞻仰这座最后的神之笔迹。但是最近仙山上却多了几股势力，世人猜测，又是想寻找仙墨的。\n仙墨长老，每个村的最高长老职位。传说让善者担任，可得到仙墨画主的庇护。\n黑漆长桌前还坐着五位长老。\n“我没有任何异议。”长须长老是昨天亲眼见到柳画的，他很肯定柳画有资格成为仙墨长老。\n“我也同意”，矮长老细细的声音响起，“仙墨长老，是非柳圣人担任不可的。”\n一个精瘦的长老眉头一皱，此人正是瘦长老，“这恐怕不妥，我认为还是别让任何人担任仙墨长老的好。大家别忘了，其他村正是因为没弄清楚，让心地非善的人担任了他们村里的仙墨长老，才让他们村遭受了一场又一场的灾祸”，瘦长老顿了顿，“这就是仙墨画主的惩罚，画主绝不容许有人亵渎了仙墨。”\n“对”，胖长老点头称是，“像我们易村这几百年来不是好么，因为不让人担任仙墨长老，避免了非善之人成为仙墨长老的可能。所以，我们易村才不至于像其他村一样灾祸连连。所以，我想还是保持原样的好。仙墨长老一职，空着。”\n五大长老中还剩下高长老没有表达想法，中立是他一直以来的习惯。虽然其他长老对此不满，但也不好说什么。毕竟，高长老在农业方面的贡献是很大的，民以食为天，所以高长老在村里的威信还是很高的。\n可是这次高长老却说话了，“还是让柳圣人担任吧。如果有圣人出现，而不让他担任仙墨长老的话，我想，仙墨画主也会生气的。”\n“高长老，你了解那个柳画吗？”瘦长老小眼睛眯起来，“千万别冒险，为了易村，我作为长老，绝不能让易村遭受一点危难的可能。”\n村长从五位长老发表意见时就一直在思考，这时开口了，“我，代表我们易村，决定让柳圣人担任仙墨长老。各位长老不必多言了。”\n“这……”瘦长老难以置信，“村长，你怎么……”\n瘦长老是无法反对，也许别人没有资格代表全村，但是村长绝对有，这并不因为他的职位是村长，而是因为那个发生在30多年前的事。\n…………\n此时我正在村里逛着，早饭在这之前就在一个村民家里吃过了。正信步走着的我绝对没想到，村长会让我担任村里的长老。而村长没想过我会不会答应。\n我们就这样，对话了。\n“柳圣人，请担任我们易村的仙墨长老吧。”村长开门见山。\n我一脸惊愕，“什么？仙墨长老？我？可是仙墨长老是什么？”\n“仙墨长老，是村里除村长外的最高的职位。从仙墨二字便可看出，这仙墨长老的荣耀。还请柳圣人担任。”\n“仙墨又是什么？烦请村长解释一下。”\n“这，柳圣人不可能连这都不知道的啊。柳圣人，请别开我这老头子的玩笑了。”村长笑起来。\n到后来，村长终于相信我的无知了，于是将仙墨的来历说给我听。\n我暗道，这个世界，叫仙墨之界？好熟悉的感觉。\n村长见我呆站着，忙提醒，“柳圣人，你了解了吗？”\n“啊！”我惊醒，“我，愿意。”\n…………\n易村的村民都知道，几百年都不曾有过的仙墨长老，易村现在有了。\n易村。一个木屋里，一个白衣少女正绘着一幅画，“柳画？这个名字不是……”\n“是啊”，高长老坐在少女旁边，“千年，柳画这个名字你是从六岁开始在画上写的吧？”\n白衣少女正是易千年，我画中的那个女子。“嗯，我从六岁才开始画画的嘛，从那时到现在，我每画完一幅画，总是不知不觉地在落款处写上柳画。”\n高长老摸摸胡子，“这倒是奇怪了。”\n千年停下画笔，笑看着高长老，“爹，这你不是见怪不怪了吗？怎么今天突然提起这件事？”\n高长老苦笑一声，“千年啊，昨天迟暮之日我们村来了位圣人，他在夕阳西下时读出了十年内尘世间的劫数，可是圣人却读出了你的名字。”\n易千年微微一笑，看向高长老，“我的名字？爹，真的吗？”易千年看出了高长老的担心，“爹，没事的，夕阳落下的图像只是暗示劫数，并不是说我就是尘世的那一劫啦。很有可能就是由我来为尘世破劫的哟，爹，你看我这幅画。”\n易千年小手张开画，将它展示在高长老眼前。画中的是一座云气缭绕的高山，笔墨洒得恰到好处，认真欣赏时会看到，画纸里外有呈墨绿色的气体透过纸张，飞舞灵动。\n“嗯，很好”，高长老满眼喜色，“千年，你的画技又高了。墨气更浓了。”\n“爹”，易千年娇嗔道，“都说这叫仙墨灵气了。”\n“是，是，仙墨灵气。”高长老长叹一口气，“唉，千年你画得那么好，爹却没能力让你到仙墨城去。不说了，不说了。”\n一阵寂静过后。\n“千年，你知道那位圣人叫什么名字吗？”高长老问道。\n易千年娇哼了一声，“爹，我怎么猜得到嘛，你又没说。”\n“圣人的名字叫柳画。”\n“啊。”易千年叫出了声，“柳画，那不是我一直落款的名字吗？”\n高长老深深地说，“就是这样，我才更觉得千年你，可能会有很多故事。”\n现在，柳画和易千年的故事才刚刚开始，在仙墨之界开始…………\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E5%8D%83%E5%B9%B4%E7%94%BB%E7%AC%AC%E4%BA%8C%E7%AF%87%E7%AB%A0%E4%BB%99%E5%A2%A8/","summary":"\u003cp\u003e第二篇章：仙墨    ——2011-7-11 14:08 \u003c/p\u003e\n\u003cp\u003e     很难得的是我一大早就起来了。\u003cbr\u003e\n     当我走出小屋，有几个村民与我打招呼，“柳圣人，精神好啊。”\u003cbr\u003e\n     我置之一笑，“叫我柳画就好，我可不是圣人啊。”心里却道，“精神好？我可是一夜没睡。”\u003cbr\u003e\n     旁边的村民依旧叫我柳圣人，我也是有口难辩了。看着这灿烂的晴空，不禁感叹，这世界果然只有一天的日出和日落，而今天，没有日出，有的只是蓦然悬挂高空的烈日和瞬间的阳光普照。\u003cbr\u003e\n     还记得当时是漆黑一片，我正在床上思索着什么，忽然从窗外冲进的刺眼的光打断了我的思索，让我有种时空跳跃的错觉，我需要时间来习惯这奇异的世界。\u003cbr\u003e\n      ………\u003cbr\u003e\n     与此同时的另一个空间——\u003cbr\u003e\n     暗黑的空间，一头银发乱飘的男子站立不动，左手托着一个彩光与邪黑之气相互交替的砚台，“这砚台快完全妖化了。不过，还有那支笔。”男子突然身形晃了晃，宛如鹰爪的手支住晕眩的头颅，然后将头扭向易村的方位，嘴角勾起笑容，“画主，你到底还是来了。”\u003cbr\u003e\n     银发男子心念一动，一名身穿玄色长袍的老人踏进这个暗黑的空间，老人微微一躬，“火大人。”\u003cbr\u003e\n    “传令下去，今天起，让驻军撤离封笔仙山”，银发男子的声音很冷，不像他的名字，火，“画主已经入画，一切开始改变。”\u003cbr\u003e\n     画主已经入画，一切开始改变。\u003cbr\u003e\n      ………\u003cbr\u003e\n     晨。易村。易族祠堂。\u003cbr\u003e\n     “大家也知道了，柳圣人决定在我易村住下”，村长坐在一张黑漆长桌的主座前，“我想将我易村的仙墨长老这一职位授予柳圣人。不知各位长老，有何异议？”\u003cbr\u003e\n     这个世界叫：仙墨之界。\u003cbr\u003e\n     仙墨，这个世界的信仰所在。\u003cbr\u003e\n     传说，仙墨之界的创者（创世主）正是用笔墨洒落寰宇，用笔墨画山添河，用笔墨招人唤灵，才成就了这个世界。因此，仙墨之界的各种存在都隐约带着点墨色。人们把创世主称为仙墨画主。而，仙墨，画主用于创世的存在，却遗留下来了。\u003cbr\u003e\n     至于仙墨在何处，有人说在封笔仙山。\u003cbr\u003e\n     封笔仙山，传说是仙墨画主的最后一笔，仙山的形状像极了笔尖朝上的画笔。故，很多人纷纷前往封笔仙山，爬上峰顶寻找传说中的仙墨。但是从来没人得到过。封笔仙山因为多人游览参观，反而成为了仙墨之界最著名的旅游胜地，很多人都想去瞻仰这座最后的神之笔迹。但是最近仙山上却多了几股势力，世人猜测，又是想寻找仙墨的。\u003cbr\u003e\n     仙墨长老，每个村的最高长老职位。传说让善者担任，可得到仙墨画主的庇护。\u003cbr\u003e\n     黑漆长桌前还坐着五位长老。\u003cbr\u003e\n    “我没有任何异议。”长须长老是昨天亲眼见到柳画的，他很肯定柳画有资格成为仙墨长老。\u003cbr\u003e\n    “我也同意”，矮长老细细的声音响起，“仙墨长老，是非柳圣人担任不可的。”\u003cbr\u003e\n    一个精瘦的长老眉头一皱，此人正是瘦长老，“这恐怕不妥，我认为还是别让任何人担任仙墨长老的好。大家别忘了，其他村正是因为没弄清楚，让心地非善的人担任了他们村里的仙墨长老，才让他们村遭受了一场又一场的灾祸”，瘦长老顿了顿，“这就是仙墨画主的惩罚，画主绝不容许有人亵渎了仙墨。”\u003cbr\u003e\n    “对”，胖长老点头称是，“像我们易村这几百年来不是好么，因为不让人担任仙墨长老，避免了非善之人成为仙墨长老的可能。所以，我们易村才不至于像其他村一样灾祸连连。所以，我想还是保持原样的好。仙墨长老一职，空着。”\u003cbr\u003e\n     五大长老中还剩下高长老没有表达想法，中立是他一直以来的习惯。虽然其他长老对此不满，但也不好说什么。毕竟，高长老在农业方面的贡献是很大的，民以食为天，所以高长老在村里的威信还是很高的。\u003cbr\u003e\n     可是这次高长老却说话了，“还是让柳圣人担任吧。如果有圣人出现，而不让他担任仙墨长老的话，我想，仙墨画主也会生气的。”\u003cbr\u003e\n   “高长老，你了解那个柳画吗？”瘦长老小眼睛眯起来，“千万别冒险，为了易村，我作为长老，绝不能让易村遭受一点危难的可能。”\u003cbr\u003e\n    村长从五位长老发表意见时就一直在思考，这时开口了，“我，代表我们易村，决定让柳圣人担任仙墨长老。各位长老不必多言了。”\u003cbr\u003e\n   “这……”瘦长老难以置信，“村长，你怎么……”\u003cbr\u003e\n     瘦长老是无法反对，也许别人没有资格代表全村，但是村长绝对有，这并不因为他的职位是村长，而是因为那个发生在30多年前的事。\u003cbr\u003e\n     …………\u003cbr\u003e\n     此时我正在村里逛着，早饭在这之前就在一个村民家里吃过了。正信步走着的我绝对没想到，村长会让我担任村里的长老。而村长没想过我会不会答应。\u003cbr\u003e\n     我们就这样，对话了。\u003cbr\u003e\n    “柳圣人，请担任我们易村的仙墨长老吧。”村长开门见山。\u003cbr\u003e\n      我一脸惊愕，“什么？仙墨长老？我？可是仙墨长老是什么？”\u003cbr\u003e\n    “仙墨长老，是村里除村长外的最高的职位。从仙墨二字便可看出，这仙墨长老的荣耀。还请柳圣人担任。”\u003cbr\u003e\n    “仙墨又是什么？烦请村长解释一下。”\u003cbr\u003e\n    “这，柳圣人不可能连这都不知道的啊。柳圣人，请别开我这老头子的玩笑了。”村长笑起来。\u003cbr\u003e\n     到后来，村长终于相信我的无知了，于是将仙墨的来历说给我听。\u003cbr\u003e\n     我暗道，这个世界，叫仙墨之界？好熟悉的感觉。\u003cbr\u003e\n     村长见我呆站着，忙提醒，“柳圣人，你了解了吗？”\u003cbr\u003e\n    “啊！”我惊醒，“我，愿意。”\u003cbr\u003e\n      …………\u003cbr\u003e\n     易村的村民都知道，几百年都不曾有过的仙墨长老，易村现在有了。\u003cbr\u003e\n     易村。一个木屋里，一个白衣少女正绘着一幅画，“柳画？这个名字不是……”\u003cbr\u003e\n    “是啊”，高长老坐在少女旁边，“千年，柳画这个名字你是从六岁开始在画上写的吧？”\u003cbr\u003e\n     白衣少女正是易千年，我画中的那个女子。“嗯，我从六岁才开始画画的嘛，从那时到现在，我每画完一幅画，总是不知不觉地在落款处写上柳画。”\u003cbr\u003e\n     高长老摸摸胡子，“这倒是奇怪了。”\u003cbr\u003e\n     千年停下画笔，笑看着高长老，“爹，这你不是见怪不怪了吗？怎么今天突然提起这件事？”\u003cbr\u003e\n     高长老苦笑一声，“千年啊，昨天迟暮之日我们村来了位圣人，他在夕阳西下时读出了十年内尘世间的劫数，可是圣人却读出了你的名字。”\u003cbr\u003e\n     易千年微微一笑，看向高长老，“我的名字？爹，真的吗？”易千年看出了高长老的担心，“爹，没事的，夕阳落下的图像只是暗示劫数，并不是说我就是尘世的那一劫啦。很有可能就是由我来为尘世破劫的哟，爹，你看我这幅画。”\u003cbr\u003e\n     易千年小手张开画，将它展示在高长老眼前。画中的是一座云气缭绕的高山，笔墨洒得恰到好处，认真欣赏时会看到，画纸里外有呈墨绿色的气体透过纸张，飞舞灵动。\u003cbr\u003e\n     “嗯，很好”，高长老满眼喜色，“千年，你的画技又高了。墨气更浓了。”\u003cbr\u003e\n     “爹”，易千年娇嗔道，“都说这叫仙墨灵气了。”\u003cbr\u003e\n     “是，是，仙墨灵气。”高长老长叹一口气，“唉，千年你画得那么好，爹却没能力让你到仙墨城去。不说了，不说了。”\u003cbr\u003e\n      一阵寂静过后。\u003cbr\u003e\n     “千年，你知道那位圣人叫什么名字吗？”高长老问道。\u003cbr\u003e\n      易千年娇哼了一声，“爹，我怎么猜得到嘛，你又没说。”\u003cbr\u003e\n     “圣人的名字叫柳画。”\u003cbr\u003e\n     “啊。”易千年叫出了声，“柳画，那不是我一直落款的名字吗？”\u003cbr\u003e\n     高长老深深地说，“就是这样，我才更觉得千年你，可能会有很多故事。”\u003cbr\u003e\n     现在，柳画和易千年的故事才刚刚开始，在仙墨之界开始…………\u003c/p\u003e","title":"《千年·画》第二篇章：仙墨 "},{"content":"写在前面：\n这部小说是我从未写过的题材……\n——21:14 2011-4-29\n引子：如画\n是失去了什么，还是正在得到些什么？\n一阵时光流动，以绚丽的颜色，还是以我无法言状的墨色，正在为这个世界渲染上一切。如幻如实的色彩氤氲开来，那些虚的，那些幻的，尽皆成实。\n一切如画。\n在我前面的是一幅画，只是这幅画不断飘散于空间，水痕墨迹溢出。\n空间成画。\n我置身于这幅画里，想的只是“千年”。这个令我痛苦了好久的词，我现在寻它去了。可能，我在画里，会忘记所有，但是我相信，我终会想起。\n身影入画。\n第一篇章：这个世界的迟暮\n我是怎么了？关于我，我一点也想不起来。我唯一知道的是，这不是我之前的世界，还有我记得在以前的世界里，我喜欢看迟暮黄昏，看夕阳慢慢下落时给苍穹的云留下的种种色彩，直至没有了夕阳，没有了云，没有了颜色。\n现在，我正站在一座山峰上，周围是高高低低的山，云气缭绕，恍如仙境。不知道是不是上天在听我说话，否则，为什么我刚想到黄昏，我眼前就出现了迟暮的黄昏。还是说，一直都是黄昏，只是我没发现？\n我慢慢蹲下，远方的夕阳开始下沉，周围的云彩被披上赤红的外衣，那些云气在余晖的照射下泛出些黄色。跟以前的世界好像。这个世界与以前的世界，我，无法分辨。甚至连我，我也不知道，我是否也跟这个世界一起，变了。\n我很迷茫，我是谁，我叫什么名字，还有，我为何到这个世界来？\n什么也想不起来，那就不要想了。\n我开始下山。虽然云气掩实了山，很难看清楚路，但是我却敏捷地往山下窜去，因为我对这山很熟悉，尽管我从未来过。山上长着的花木很漂亮，傲人的鲜艳里透出些墨色，像是被谁用墨笔添上去的。我突然停住了，这周围的尽是墨色，连空气也隐约可见灰色，这时我已经在山脚下了，前方的是一潭水，在远处看是黑色的，我走上前去，水的颜色慢慢变浅，最后变成浅灰色了。我用手掬起水，是很干净的水，灰色大概是属于水底的吧。\n我从水里看到了我的样子，黑色的长发，一张我无法形容的脸，很好看。\n“喂，你是哪个村的，快回你的村子，你没看到太阳就快沉到最后了。”一个不知道从哪里发出的声音，是个嗓音粗的男人发出的。\n我环顾四周，一个人也没有，“你是谁？”\n“我是易村的监望手，你别看了，我是通过传音阵跟你说话的。听到没有，快回你村子，你现在离太阳很近，一不小心就会灰飞烟灭。”\n我听后，笑了，太阳其实离我们是很远的，况且它就快下山了。\n可能那个监望手看我无动于衷，所以就没再理我了。我禁不住看了看不断下沉的太阳，此时它的光已经不耀眼了，天边的云彩因为失去了强光而变得暗淡，那些厚厚的云层使我感到异常沉重。\n太阳沉到最后了。忽然，阳光四射，原本厚黑的云层被照得格外灿烂，连空气里潜藏着的灰色也荡然无存，如同白昼。我的身体感到无比温暖，眼睛看向太阳，没有刺眼的感觉，反而像是洞穿了一切，然后看到了一个令我的心一震的风景，我一时什么也说不出来，一种悲凄之感流连脑海。\n这个景象似乎停留了好久。\n这个世界的迟暮使得这天的白昼变得很长。\n后来，有人告诉我，他们从来没有见过这么长的白昼。也是他们告诉我的，这个世界的迟暮，一年只有一次。我还记得我当时诧异的表情，“怎么会没有迟暮？每天太阳不是慢慢上升，然后慢慢下降吗？那段快降到底的过程就是迟暮啊。”\n他们是这么回答我的，“太阳的上升与下降，一年就只有一次，也就是说，一年只有一次日出与日落。而剩下的日子，太阳是突然出现，突然消失的。可能现在还是白昼，下一刻就是黑夜了。”\n我想不起来，这个世界迟暮的那天，我是怎么去到易村的了。我只记得，那天来到易村的村门口时，有几位老人出来迎接我，后来我知道他们中的一个是村长，其他人是村里的长老。他们把我迎到一个整洁干净的小屋，我刚坐下，他们就对我深深地鞠躬，我连忙站起来，“你们这是？”\n村长满脸恭敬，“阁下一定是上天派来拯救我们易村的圣人，还请阁下指点一二，我们的劫数是什么。”\n“劫数？”我连自己的劫数都不知道，又何曾听过别人的劫数，“抱歉，老先生。对于您说的劫数，我一无所知。”\n站在村长左边的长须长老微微躬身，“先辈说过，能于迟暮之日，太阳沉落之时，在阳山范围内而不灰飞烟灭者，定是上天派来拯救尘世的圣人。而那太阳沉到最后所形成的景象，便暗示了这十年内尘世间的劫数。这景象只有圣人才能洞穿，若我们普通人看了，逃不过永世之劫。老朽恳请阁下告知这劫数，让尘世免遭一番惨痛。”\n被这个长须长老一说，我的脑海隐隐浮现出之前太阳西沉时我的眼睛洞穿的景象。之所以是洞穿，是因为那个奇异的景象用肉眼看起来是模糊的，但我却看得真真切切，是洞穿。关于那个景象，我实在不知道要怎么告诉几位老人，因为他们说那是一个劫数，可我看到的，却是一个貌若天仙，气质脱俗的女子。若我对他们说我看到的是一个女子，不知道他们会不会把我误会成一个好色之徒。\n况且，在我的印象里，关于劫数的图像是灾难性的。除非，这女子是红颜祸水，都说，自古红颜多薄命，什么祸水，什么薄命，还不都是那些好色的国君、贵族沉迷于酒色之中，不理国政所造成的。还反过来说人家红颜是祸水……\n停……我好像扯得太远了，“老先生，劫数的景象似乎不是灾难，而是——”\n我的话还没说完，站在村长右边的矮长老就插话道，“是个人，对不对。”\n村长和长须长老狠狠瞪了矮长老一眼，“阁下不必在意，请继续说。”\n“的确是个人”，看来我看到的应该是他们所说的劫数了，“是个女子。”\n村长瞪大了眼睛，“那女子旁边有字吗？”\n当然有字，本来那女子的面容并不能给我带来那么悲凄的感觉，只是她突然一转身，手中的一张纸 随风滑落。接着，我看到了那张纸，是一幅刚才那个女子的画像，画像中的女子清眸含笑，这是谁的眼捕捉到的瞬间？上面用纤细的正楷写着：给易村我最爱的千年。\n千年？为何我对这名字感觉这样熟悉，亲切。还有一种情绪，是悲恸。\n“是你们易村的，名字大概是，千年。”我淡淡地说道。\n长须长老小声对村长说，“是千年那孩子。”\n“嗯，是千年”。村长眉头皱起，对矮长老说，“明天正午召集所有长老，在易族祠堂里商议。”\n矮长老和长须长老出去后，村长笑道，“阁下，今夜就在我们易村休息吧。这个房子就是你的住处了。”\n“嗯，好的。那，麻烦了。”我答应了。\n村长忙道，“不麻烦，不麻烦，阁下在我们村里住，是我们的荣幸啊。阁下永远在我们易村住下来才好呢。”\n我听后，觉得这个提议甚是好，我在这个世界是没有家的，“村长，我愿意在易村住下，也许是永远。”\n“那好啊，好啊，现在也很晚了，我就不打扰你休息了。我们易村的一些东西，明天再谈，好吧。”村长笑望着我。\n我也浅浅地笑了，“好的。”\n等到村长离开后，我躺在床上，想起夕阳下的那幅画，那副女子的画，上面是写着“给易村我最爱的千年”的。我没有告诉村长，景象有一幅画，那幅画的落款是，柳画。\n而我的名字,我想起来了，是，柳画。\n那天，我一夜未眠。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E5%8D%83%E5%B9%B4%E7%94%BB%E7%AC%AC%E4%B8%80%E7%AF%87%E7%AB%A0%E8%BF%99%E4%B8%AA%E4%B8%96%E7%95%8C%E7%9A%84%E8%BF%9F%E6%9A%AE/","summary":"\u003cp\u003e写在前面：\u003cbr\u003e\n这部小说是我从未写过的题材……\u003cbr\u003e\n ——21:14 2011-4-29\u003cbr\u003e\n                           \u003c/p\u003e\n\u003cp\u003e                                  引子：如画\u003cbr\u003e\n    是失去了什么，还是正在得到些什么？\u003cbr\u003e\n    一阵时光流动，以绚丽的颜色，还是以我无法言状的墨色，正在为这个世界渲染上一切。如幻如实的色彩氤氲开来，那些虚的，那些幻的，尽皆成实。\u003cbr\u003e\n    一切如画。\u003cbr\u003e\n    在我前面的是一幅画，只是这幅画不断飘散于空间，水痕墨迹溢出。\u003cbr\u003e\n    空间成画。\u003cbr\u003e\n    我置身于这幅画里，想的只是“千年”。这个令我痛苦了好久的词，我现在寻它去了。可能，我在画里，会忘记所有，但是我相信，我终会想起。\u003cbr\u003e\n    身影入画。\u003c/p\u003e\n\u003cp\u003e                       第一篇章：这个世界的迟暮\u003cbr\u003e\n    我是怎么了？关于我，我一点也想不起来。我唯一知道的是，这不是我之前的世界，还有我记得在以前的世界里，我喜欢看迟暮黄昏，看夕阳慢慢下落时给苍穹的云留下的种种色彩，直至没有了夕阳，没有了云，没有了颜色。\u003cbr\u003e\n    现在，我正站在一座山峰上，周围是高高低低的山，云气缭绕，恍如仙境。不知道是不是上天在听我说话，否则，为什么我刚想到黄昏，我眼前就出现了迟暮的黄昏。还是说，一直都是黄昏，只是我没发现？\u003cbr\u003e\n    我慢慢蹲下，远方的夕阳开始下沉，周围的云彩被披上赤红的外衣，那些云气在余晖的照射下泛出些黄色。跟以前的世界好像。这个世界与以前的世界，我，无法分辨。甚至连我，我也不知道，我是否也跟这个世界一起，变了。\u003cbr\u003e\n    我很迷茫，我是谁，我叫什么名字，还有，我为何到这个世界来？\u003cbr\u003e\n    什么也想不起来，那就不要想了。\u003cbr\u003e\n    我开始下山。虽然云气掩实了山，很难看清楚路，但是我却敏捷地往山下窜去，因为我对这山很熟悉，尽管我从未来过。山上长着的花木很漂亮，傲人的鲜艳里透出些墨色，像是被谁用墨笔添上去的。我突然停住了，这周围的尽是墨色，连空气也隐约可见灰色，这时我已经在山脚下了，前方的是一潭水，在远处看是黑色的，我走上前去，水的颜色慢慢变浅，最后变成浅灰色了。我用手掬起水，是很干净的水，灰色大概是属于水底的吧。\u003cbr\u003e\n    我从水里看到了我的样子，黑色的长发，一张我无法形容的脸，很好看。\u003cbr\u003e\n   “喂，你是哪个村的，快回你的村子，你没看到太阳就快沉到最后了。”一个不知道从哪里发出的声音，是个嗓音粗的男人发出的。\u003cbr\u003e\n    我环顾四周，一个人也没有，“你是谁？”\u003cbr\u003e\n   “我是易村的监望手，你别看了，我是通过传音阵跟你说话的。听到没有，快回你村子，你现在离太阳很近，一不小心就会灰飞烟灭。”\u003cbr\u003e\n    我听后，笑了，太阳其实离我们是很远的，况且它就快下山了。\u003cbr\u003e\n    可能那个监望手看我无动于衷，所以就没再理我了。我禁不住看了看不断下沉的太阳，此时它的光已经不耀眼了，天边的云彩因为失去了强光而变得暗淡，那些厚厚的云层使我感到异常沉重。\u003cbr\u003e\n    太阳沉到最后了。忽然，阳光四射，原本厚黑的云层被照得格外灿烂，连空气里潜藏着的灰色也荡然无存，如同白昼。我的身体感到无比温暖，眼睛看向太阳，没有刺眼的感觉，反而像是洞穿了一切，然后看到了一个令我的心一震的风景，我一时什么也说不出来，一种悲凄之感流连脑海。\u003cbr\u003e\n    这个景象似乎停留了好久。\u003cbr\u003e\n    这个世界的迟暮使得这天的白昼变得很长。\u003cbr\u003e\n    后来，有人告诉我，他们从来没有见过这么长的白昼。也是他们告诉我的，这个世界的迟暮，一年只有一次。我还记得我当时诧异的表情，“怎么会没有迟暮？每天太阳不是慢慢上升，然后慢慢下降吗？那段快降到底的过程就是迟暮啊。”\u003cbr\u003e\n    他们是这么回答我的，“太阳的上升与下降，一年就只有一次，也就是说，一年只有一次日出与日落。而剩下的日子，太阳是突然出现，突然消失的。可能现在还是白昼，下一刻就是黑夜了。”\u003cbr\u003e\n    我想不起来，这个世界迟暮的那天，我是怎么去到易村的了。我只记得，那天来到易村的村门口时，有几位老人出来迎接我，后来我知道他们中的一个是村长，其他人是村里的长老。他们把我迎到一个整洁干净的小屋，我刚坐下，他们就对我深深地鞠躬，我连忙站起来，“你们这是？”\u003cbr\u003e\n    村长满脸恭敬，“阁下一定是上天派来拯救我们易村的圣人，还请阁下指点一二，我们的劫数是什么。”\u003cbr\u003e\n    “劫数？”我连自己的劫数都不知道，又何曾听过别人的劫数，“抱歉，老先生。对于您说的劫数，我一无所知。”\u003cbr\u003e\n    站在村长左边的长须长老微微躬身，“先辈说过，能于迟暮之日，太阳沉落之时，在阳山范围内而不灰飞烟灭者，定是上天派来拯救尘世的圣人。而那太阳沉到最后所形成的景象，便暗示了这十年内尘世间的劫数。这景象只有圣人才能洞穿，若我们普通人看了，逃不过永世之劫。老朽恳请阁下告知这劫数，让尘世免遭一番惨痛。”\u003cbr\u003e\n    被这个长须长老一说，我的脑海隐隐浮现出之前太阳西沉时我的眼睛洞穿的景象。之所以是洞穿，是因为那个奇异的景象用肉眼看起来是模糊的，但我却看得真真切切，是洞穿。关于那个景象，我实在不知道要怎么告诉几位老人，因为他们说那是一个劫数，可我看到的，却是一个貌若天仙，气质脱俗的女子。若我对他们说我看到的是一个女子，不知道他们会不会把我误会成一个好色之徒。\u003cbr\u003e\n    况且，在我的印象里，关于劫数的图像是灾难性的。除非，这女子是红颜祸水，都说，自古红颜多薄命，什么祸水，什么薄命，还不都是那些好色的国君、贵族沉迷于酒色之中，不理国政所造成的。还反过来说人家红颜是祸水……\u003cbr\u003e\n    停……我好像扯得太远了，“老先生，劫数的景象似乎不是灾难，而是——”\u003cbr\u003e\n    我的话还没说完，站在村长右边的矮长老就插话道，“是个人，对不对。”\u003cbr\u003e\n    村长和长须长老狠狠瞪了矮长老一眼，“阁下不必在意，请继续说。”\u003cbr\u003e\n   “的确是个人”，看来我看到的应该是他们所说的劫数了，“是个女子。”\u003cbr\u003e\n    村长瞪大了眼睛，“那女子旁边有字吗？”\u003cbr\u003e\n    当然有字，本来那女子的面容并不能给我带来那么悲凄的感觉，只是她突然一转身，手中的一张纸 随风滑落。接着，我看到了那张纸，是一幅刚才那个女子的画像，画像中的女子清眸含笑，这是谁的眼捕捉到的瞬间？上面用纤细的正楷写着：给易村我最爱的千年。\u003cbr\u003e\n    千年？为何我对这名字感觉这样熟悉，亲切。还有一种情绪，是悲恸。\u003cbr\u003e\n   “是你们易村的，名字大概是，千年。”我淡淡地说道。\u003cbr\u003e\n    长须长老小声对村长说，“是千年那孩子。”\u003cbr\u003e\n   “嗯，是千年”。村长眉头皱起，对矮长老说，“明天正午召集所有长老，在易族祠堂里商议。”\u003cbr\u003e\n    矮长老和长须长老出去后，村长笑道，“阁下，今夜就在我们易村休息吧。这个房子就是你的住处了。”\u003cbr\u003e\n   “嗯，好的。那，麻烦了。”我答应了。\u003cbr\u003e\n    村长忙道，“不麻烦，不麻烦，阁下在我们村里住，是我们的荣幸啊。阁下永远在我们易村住下来才好呢。”\u003cbr\u003e\n    我听后，觉得这个提议甚是好，我在这个世界是没有家的，“村长，我愿意在易村住下，也许是永远。”\u003cbr\u003e\n   “那好啊，好啊，现在也很晚了，我就不打扰你休息了。我们易村的一些东西，明天再谈，好吧。”村长笑望着我。\u003cbr\u003e\n    我也浅浅地笑了，“好的。”\u003cbr\u003e\n    等到村长离开后，我躺在床上，想起夕阳下的那幅画，那副女子的画，上面是写着“给易村我最爱的千年”的。我没有告诉村长，景象有一幅画，那幅画的落款是，柳画。\u003cbr\u003e\n    而我的名字,我想起来了，是，柳画。\u003cbr\u003e\n    那天，我一夜未眠。\u003c/p\u003e","title":"《千年·画》第一篇章：这个世界的迟暮"},{"content":"旧事如烟，忆往昔，青风绕琴弦，情意缱绻。莫叹明月圆又缺，只愿此生终不忘，笑忆伊人颜。\n——题记\n柳絮纷飞，雪花沓来。负剑长发少年半跪在一个光亮的墓碑前，轻抚着雕刻在青玉石板上的名字——柳如烟。少年嘴角微微扬起，温柔地笑了，呵，是苦笑么？都不重要了，不是都已经结束了么？\n少年呢喃，泪自流，“如烟，按你说的，我在墓碑上刻满了你的笑颜，你说要让我始终记得你最美的样子，但同样的，上面充斥着我的悲伤。”站起身，双肩积雪慢慢融化，于是转过身，渐渐远去，只留下漫舞飘飞的雪花在渲染离别\u0026hellip;\u0026hellip;\n关于我们的回忆才刚刚开始。\n我叫林青风，是长安城最年轻的顶级控风剑师，在长安城比我厉害的没有几个，但我并不觉得有什么意义，直到我遇见了一个人，一个即使我拼尽性命都想要保护的人。\n星空璀璨，丝竹管弦不断吟绕在一座弥漫着雾气的城堡。一个隔离了外界任何声响的房间里，雄浑凝练的声音打破了沉静，“秦管家，真的确定好他的身份了么？”\n茶几上的水几乎没动过，“请老爷放心，林青风孤儿出身，并没有什么家世背景，而且风术极其不朽，让他保护如烟小姐是最为妥当的了。”\n“哎，烟儿从小就身子弱，现在还碰到这样的事。”老爷叹了口气，随即眼神一狠，手紧握茶杯，呢喃，“谁要是动了烟儿，我定要他挫骨扬灰。”说完长袖一挥，两人消失在空气中，只留下刚被捏碎的茶杯在流淌着水。\n“滴答，滴答”，嗯\u0026hellip;\u0026hellip;是下雨了么？我睁开双眼，站起身，伸出手触摸着雨花，笑了，自从那场火神之战后，长安城已经很久没下过雨了。不过现在不是欣赏雨的时候，任务来了，目的地:柳烟堡。\n风动，呵，正适合动身，剑风成罡，影动。雾气依旧缭绕，柳烟堡。\n大厅里，金块珠砾，琴音曼舞。\n“林公子，小女的安全就交给你了，报酬不是问题。”柳堡主沉声道。\n我闭上眼睛聆听着弥漫过来的琴音，正是霓裳羽衣曲，睁开眼，“柳伯父，我并不是为了什么报酬来的，我只是欠秦总管一个人情，想必你也知道。等事情结束我便会离开，这里的生活并不适合我。呵，长安，真的是长安么？”\n“嗯\u0026hellip;\u0026hellip;你也倒是爽快之人，从今天开始就在这里住下吧，有什么要求尽管提，我就只有一个要求，保证烟儿的安全。”\n\u0026hellip;\u0026hellip;\n夜微凉，我盘坐在地上小憩，这时敲门声使我睁开了眼。“请进。”\n只见一个女仆推开门，“林公子，我家小姐想要上阁楼赏花，老爷吩咐叫你陪同保护小姐。”\n我朝她笑了笑，站起身，“好。”\n花香四溢，扑鼻而来，我上了阁楼，一眼望去，各式花种层出不穷，嗯？那个便是柳小姐柳如烟吧。\n和想象中差不多，冰肌玉骨，身披淡绿色的翠水薄烟纱，青丝垂肩，只是脸色少了点红润，如此也算的上倾国倾城的美人了。\n我走上前去，“如烟小姐，在下林青风，这段时间便由我来保护你的安全。”\n黛眸冷瞥了我一眼，转过头朝身旁的丫鬟说道，“画儿，我不是叫父亲不要再派人来了么，这种日子我真受够了，呵，画地为牢。”\n“小姐，这是老爷\u0026hellip;\u0026hellip;”\n话被打断，“叫他走吧，免得到时又死了一个。”\n“既然打扰了小姐，我这就告退。”说完便转身离去，嘴微扬，借助风术将声音传入正皱眉的画儿耳边，“放心，我会在门边看着形势，我想以小姐的功力也发现不了我吧。”\n我对这位如烟小姐的冷艳态度并不感到讶异，毕竟这段时间一直有来自异处的高手前来对她下手，倒是受了不少惊吓，而且保护她的人没一个活下来了。我并不清楚她身上有什么惊人的秘密，我只知道一点，保护她。 我静坐在门旁，操纵着风迷离着我的身体。我看见玉手沾着花香，纤手微微摆弄着彼岸花的瓣，眼神惆怅。借助风控，我微微听到她自语，“彼岸花，幸福永远在彼岸。”\n又是一个多愁善感的女子，我正想着。突然，几千道疾风从我耳边闪过，“哼，终于要来了么？”\n我快步闪移到如烟小姐跟前，一道小型风罩覆盖了我们周围，只见霎时几千道箭芒向潮水般汹涌过来，我听见她尖叫一声，然后贴向我的胸口，“我的花。”只见一朵朵花被箭摧残着。没办法，我只好加大风控灵气，将风罩撑大以能够覆盖住整个花阁。\n哼，是那帮家伙，我将声音传入四周，“飞箭门的都给我听清楚了，这柳小姐，我林青风保定了，不想灭门就给我识相点。”说完过了会，箭雨停了，又一阵声音传过来。\n“呦～我说是谁那么大口气，既然今晚你在此我也不久留了，不过，就凭你一个就想护住她？啧啧，我想你是不知道她的事吧，不过也没必要了，将死之人罢了。”\n一片寂静，死一般地静\u0026hellip;\u0026hellip;\n“如烟小姐，没事了。”我低头看着还紧贴我怀中的佳人。\n意识到情况，如烟像做错事的孩子一般迅速地逃离，原本白玉般的脸上出现了红润，双手微理了下两鬓青丝，低声道，“谢谢。”\n“呵呵，没想到如烟小姐还会道谢。”\n“我只是谢你守住了我的花，要不然一定不会饶了你的。”如烟看了我一眼又悻悻地低下头去。\n“好好好，再送你一种花草。”我微笑着，手一招。如烟从我手里接过，“萱草，林公子对花草也有研究吗？”\n“多多少少略懂一二吧。”我静笑着。\n如烟听罢，翠眸看着我，“那我考一下你咯。”说完自个先走，我苦笑着也跟了上去。\n“这个是扶桑。”我顺着如烟的手势看着说道，“那这个呢？”“紫丁香，代表的是羞怯，倒挺像如烟小姐的。”如烟瞪了我一眼，“哪有。”\n“夜来香。”“紫罗兰。”“嗯\u0026hellip;这个倒挺特殊，四叶丁香，看来柳伯父为了小姐倒是花了不少心思。”\n如烟得意道，“我爹爹当然疼我了，只是\u0026hellip;..”继而又叹息一声。“林公子，时候不早了，下楼休息吧。”\n我应了一声便陪同如烟下了楼，目送如烟进了房间便转身离去，听到如烟低语，“萱草，又叫忘忧草，忘忧，忘忧，呵呵。”\n我也静笑着推开我的房门，嗯？只见一个人影独坐在地板上，“秦总管，你怎么在这？”忽然间我有一种很不好的预感，因为天生对风灵力敏感的我竟然没发现他来了。\n“青风，你知道我叫你来保护小姐是为了什么？还有小姐身上究竟有什么秘密，竟然会引来四路高手下手么？”\n“青风不知，有什么话请直说。”\n“你是否听到过这么一句话，如烟飘散，灵光封开\u0026hellip;\u0026hellip;.”\n我的喉咙一动，有一种恐惧感透过胸腔，“难道是\u0026hellip;\u0026hellip;”\n“没错，小姐身上封印了一枚充满灵光之气的灵珠，哈哈，你也有兴趣了，对吧？只要得到它，功力便能踏上一个更高的层次。”\n“秦总管，她可是你们家小姐，你怎么能对她下手，呵，怪不得那些烂渣也会有下手的机会，原来是有你在\u0026hellip;\u0026hellip;”\n“住嘴，不要忘记你的命还是我救的，我叫你来便是让你来还人情，说到底小姐也是我看着长大的，不过要是实在没办法我也会亲自动手的。”说着哼了一声，“还有，我来的时候你应该没发现吧，这意味着什么？我和你已经在同一层次了。最后，记住，你的命是我救的。”说完长袖一挥而去。\n“可恶。”我紧握拳头。\n第二天清晨，如烟一早就起了，琴房里，如烟纤手细弹，心情显得特别好，只是偶尔抬头看了下四周，似乎没见到想见的人，叹了口气又接着抚琴。\n“如烟小姐的《春江花月夜》弹得倒是挺娴熟。”我悄然走进琴房出了一声。\n似乎被惊吓了点，如烟弹走一个音，然后抬头看了我一眼又低下头去，脸微红，“还好，你昨天没受伤罢？”\n“没有啊。”\n“哦，那就好。”一弹弦一断，“嘣”的一声，琴架裂开。我立刻闪身将如烟抱住，只见一根飞针穿过如烟刚才坐的地方直刺向墙壁，成洞。“可恶。”\n如烟紧抱着我，丝毫没有松开的意思，抽泣着，“林大哥，我受够了这样的生活，我很害怕，你带我走好不好？好不好？”一滴温热的泪珠滚进我的胸口。\n我丝毫没意料到她会这样，毕竟我们只是初识，但我却不知道有种感觉叫做一眼万年。\n我拍着她的后背，“没事的，我会一直保护你。”\n“真的吗？不能骗我哦。”\n我心里想着她的单纯，“好，不骗你。”\n于是我开始每天在她身旁守护着她，有时会有一些小插曲，但日子过得还算平静。我也愈发感觉到她身上的魅力。不论是对仆人的好还是心底里散发出的善良，总之，我觉得我这辈子好像就注定是要守护她了。\n繁花终有落尽时，花落人去，飞鸟嘶鸣。\n“林大哥，听到飞鸟的声音了吗？和我去楼阁看看吧！”如烟眼睛一眨一眨，如星空般璀璨。\n“嗯，走吧。”\n楼阁花香依旧，醉人心脾。只是香得有些诡异。\n“嗖”地一声，人影现。\n“秦总管，你也来看飞鸟吗？”如烟看向刚出现的人影，笑道。\n“是啊，看来我是打扰了小姐和青风私会哟。”秦总管笑着慢慢走过来。\n如烟听闻，脸微红。\n我眉头微皱，隐隐将如烟藏在身后，“秦总管，既然你觉得打扰我们了，那你是不是该走开才对，是吧？”我冷笑道。\n如烟脸更红了，“林大哥，没关系啦。”\n“青风啊，做人何必那么较真，小姐都说没关系，所以说你是不是该接受我的建议了呢？”说完右手虚张，一道火焰迅速朝我奔来。\n“别以为我真不会对你出手。”我正要风控，突然身体一软，摊在地上。\n花香，最迷人的最危险。\n“秦总管，你怎么，你\u0026hellip;\u0026hellip;”如烟乱了，完全不知所措。\n“小姐，你还不明白么？封印在你身上的灵珠啊，啧啧，我也不想的。”\n一切都明白了，如烟静立着，一抹无奈的浅笑，“我原以为，秦伯伯是除了爹娘外最疼我的长辈，看着我长大，当爹爹苛责我的时候，会替我求情，擦干我的眼泪。会在我最无助的时候安慰我\u0026hellip;\u0026hellip;”\n“不要说了，都过去了。”秦总管低下头叹口气，右手又一道火焰升起，指向如烟。\n我用尽浑身力气，扑向如烟，“噗”的一声玫瑰红洒满了一地。\n“林大哥，林大哥\u0026hellip;\u0026hellip;”\n“快去找你爹爹，快。”\n秦总管冷哼一声，“你父亲睡得正香呢，估计得好几个时辰才能醒来吧。”\n“你\u0026hellip;\u0026hellip;林大哥，林大哥，”如烟黛眉紧蹙，泪雨如花，然后突然抱住我，两唇紧贴，舌尖缭绕，一股强大的灵气汹涌而来。\n“林大哥，记得照顾好自己还有我父亲，我不能陪你了，对不起\u0026hellip;\u0026hellip;”\n“如烟——”我抱住如烟狂喊，只是再也没用了。\n秦总管慌着逃离，我抽泣着没有阻止，双手抱起如烟，“输了你，我赢了世界又如何？”\n飞鸟归，嘶鸣起，青风化如烟，只是记忆的碎片，要我怎么捡拾，去拼凑属于我们曾经最美的回忆\u0026hellip;\u0026hellip;\n注：本文转自我哥的日志\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E9%9D%92%E9%A3%8E%E5%8C%96%E5%A6%82%E7%83%9F/","summary":"\u003cp\u003e旧事如烟，忆往昔，青风绕琴弦，情意缱绻。莫叹明月圆又缺，只愿此生终不忘，笑忆伊人颜。\u003cbr\u003e\n——题记\u003cbr\u003e\n柳絮纷飞，雪花沓来。负剑长发少年半跪在一个光亮的墓碑前，轻抚着雕刻在青玉石板上的名字——柳如烟。少年嘴角微微扬起，温柔地笑了，呵，是苦笑么？都不重要了，不是都已经结束了么？\u003cbr\u003e\n少年呢喃，泪自流，“如烟，按你说的，我在墓碑上刻满了你的笑颜，你说要让我始终记得你最美的样子，但同样的，上面充斥着我的悲伤。”站起身，双肩积雪慢慢融化，于是转过身，渐渐远去，只留下漫舞飘飞的雪花在渲染离别\u0026hellip;\u0026hellip;\u003cbr\u003e\n关于我们的回忆才刚刚开始。\u003cbr\u003e\n我叫林青风，是长安城最年轻的顶级控风剑师，在长安城比我厉害的没有几个，但我并不觉得有什么意义，直到我遇见了一个人，一个即使我拼尽性命都想要保护的人。\u003cbr\u003e\n星空璀璨，丝竹管弦不断吟绕在一座弥漫着雾气的城堡。一个隔离了外界任何声响的房间里，雄浑凝练的声音打破了沉静，“秦管家，真的确定好他的身份了么？”\u003cbr\u003e\n茶几上的水几乎没动过，“请老爷放心，林青风孤儿出身，并没有什么家世背景，而且风术极其不朽，让他保护如烟小姐是最为妥当的了。”\u003cbr\u003e\n“哎，烟儿从小就身子弱，现在还碰到这样的事。”老爷叹了口气，随即眼神一狠，手紧握茶杯，呢喃，“谁要是动了烟儿，我定要他挫骨扬灰。”说完长袖一挥，两人消失在空气中，只留下刚被捏碎的茶杯在流淌着水。\u003cbr\u003e\n“滴答，滴答”，嗯\u0026hellip;\u0026hellip;是下雨了么？我睁开双眼，站起身，伸出手触摸着雨花，笑了，自从那场火神之战后，长安城已经很久没下过雨了。不过现在不是欣赏雨的时候，任务来了，目的地:柳烟堡。\u003cbr\u003e\n风动，呵，正适合动身，剑风成罡，影动。雾气依旧缭绕，柳烟堡。\u003cbr\u003e\n大厅里，金块珠砾，琴音曼舞。\u003cbr\u003e\n“林公子，小女的安全就交给你了，报酬不是问题。”柳堡主沉声道。\u003cbr\u003e\n我闭上眼睛聆听着弥漫过来的琴音，正是霓裳羽衣曲，睁开眼，“柳伯父，我并不是为了什么报酬来的，我只是欠秦总管一个人情，想必你也知道。等事情结束我便会离开，这里的生活并不适合我。呵，长安，真的是长安么？”\u003cbr\u003e\n“嗯\u0026hellip;\u0026hellip;你也倒是爽快之人，从今天开始就在这里住下吧，有什么要求尽管提，我就只有一个要求，保证烟儿的安全。”\u003cbr\u003e\n\u0026hellip;\u0026hellip;\u003cbr\u003e\n夜微凉，我盘坐在地上小憩，这时敲门声使我睁开了眼。“请进。”\u003cbr\u003e\n只见一个女仆推开门，“林公子，我家小姐想要上阁楼赏花，老爷吩咐叫你陪同保护小姐。”\u003cbr\u003e\n我朝她笑了笑，站起身，“好。”\u003cbr\u003e\n花香四溢，扑鼻而来，我上了阁楼，一眼望去，各式花种层出不穷，嗯？那个便是柳小姐柳如烟吧。\u003cbr\u003e\n和想象中差不多，冰肌玉骨，身披淡绿色的翠水薄烟纱，青丝垂肩，只是脸色少了点红润，如此也算的上倾国倾城的美人了。\u003cbr\u003e\n我走上前去，“如烟小姐，在下林青风，这段时间便由我来保护你的安全。”\u003cbr\u003e\n黛眸冷瞥了我一眼，转过头朝身旁的丫鬟说道，“画儿，我不是叫父亲不要再派人来了么，这种日子我真受够了，呵，画地为牢。”\u003cbr\u003e\n“小姐，这是老爷\u0026hellip;\u0026hellip;”\u003cbr\u003e\n话被打断，“叫他走吧，免得到时又死了一个。”\u003cbr\u003e\n“既然打扰了小姐，我这就告退。”说完便转身离去，嘴微扬，借助风术将声音传入正皱眉的画儿耳边，“放心，我会在门边看着形势，我想以小姐的功力也发现不了我吧。”\u003cbr\u003e\n我对这位如烟小姐的冷艳态度并不感到讶异，毕竟这段时间一直有来自异处的高手前来对她下手，倒是受了不少惊吓，而且保护她的人没一个活下来了。我并不清楚她身上有什么惊人的秘密，我只知道一点，保护她。 \u003cbr\u003e\n我静坐在门旁，操纵着风迷离着我的身体。我看见玉手沾着花香，纤手微微摆弄着彼岸花的瓣，眼神惆怅。借助风控，我微微听到她自语，“彼岸花，幸福永远在彼岸。”\u003cbr\u003e\n又是一个多愁善感的女子，我正想着。突然，几千道疾风从我耳边闪过，“哼，终于要来了么？”\u003cbr\u003e\n我快步闪移到如烟小姐跟前，一道小型风罩覆盖了我们周围，只见霎时几千道箭芒向潮水般汹涌过来，我听见她尖叫一声，然后贴向我的胸口，“我的花。”只见一朵朵花被箭摧残着。没办法，我只好加大风控灵气，将风罩撑大以能够覆盖住整个花阁。\u003cbr\u003e\n哼，是那帮家伙，我将声音传入四周，“飞箭门的都给我听清楚了，这柳小姐，我林青风保定了，不想灭门就给我识相点。”说完过了会，箭雨停了，又一阵声音传过来。\u003cbr\u003e\n“呦～我说是谁那么大口气，既然今晚你在此我也不久留了，不过，就凭你一个就想护住她？啧啧，我想你是不知道她的事吧，不过也没必要了，将死之人罢了。”\u003cbr\u003e\n一片寂静，死一般地静\u0026hellip;\u0026hellip;\u003cbr\u003e\n“如烟小姐，没事了。”我低头看着还紧贴我怀中的佳人。\u003cbr\u003e\n意识到情况，如烟像做错事的孩子一般迅速地逃离，原本白玉般的脸上出现了红润，双手微理了下两鬓青丝，低声道，“谢谢。”\u003cbr\u003e\n“呵呵，没想到如烟小姐还会道谢。”\u003cbr\u003e\n“我只是谢你守住了我的花，要不然一定不会饶了你的。”如烟看了我一眼又悻悻地低下头去。\u003cbr\u003e\n“好好好，再送你一种花草。”我微笑着，手一招。如烟从我手里接过，“萱草，林公子对花草也有研究吗？”\u003cbr\u003e\n“多多少少略懂一二吧。”我静笑着。\u003cbr\u003e\n如烟听罢，翠眸看着我，“那我考一下你咯。”说完自个先走，我苦笑着也跟了上去。\u003cbr\u003e\n“这个是扶桑。”我顺着如烟的手势看着说道，“那这个呢？”“紫丁香，代表的是羞怯，倒挺像如烟小姐的。”如烟瞪了我一眼，“哪有。”\u003cbr\u003e\n“夜来香。”“紫罗兰。”“嗯\u0026hellip;这个倒挺特殊，四叶丁香，看来柳伯父为了小姐倒是花了不少心思。”\u003cbr\u003e\n如烟得意道，“我爹爹当然疼我了，只是\u0026hellip;..”继而又叹息一声。“林公子，时候不早了，下楼休息吧。”\u003cbr\u003e\n我应了一声便陪同如烟下了楼，目送如烟进了房间便转身离去，听到如烟低语，“萱草，又叫忘忧草，忘忧，忘忧，呵呵。”\u003cbr\u003e\n我也静笑着推开我的房门，嗯？只见一个人影独坐在地板上，“秦总管，你怎么在这？”忽然间我有一种很不好的预感，因为天生对风灵力敏感的我竟然没发现他来了。\u003cbr\u003e\n“青风，你知道我叫你来保护小姐是为了什么？还有小姐身上究竟有什么秘密，竟然会引来四路高手下手么？”\u003cbr\u003e\n“青风不知，有什么话请直说。”\u003cbr\u003e\n“你是否听到过这么一句话，如烟飘散，灵光封开\u0026hellip;\u0026hellip;.”\u003cbr\u003e\n我的喉咙一动，有一种恐惧感透过胸腔，“难道是\u0026hellip;\u0026hellip;”\u003cbr\u003e\n“没错，小姐身上封印了一枚充满灵光之气的灵珠，哈哈，你也有兴趣了，对吧？只要得到它，功力便能踏上一个更高的层次。”\u003cbr\u003e\n“秦总管，她可是你们家小姐，你怎么能对她下手，呵，怪不得那些烂渣也会有下手的机会，原来是有你在\u0026hellip;\u0026hellip;”\u003cbr\u003e\n“住嘴，不要忘记你的命还是我救的，我叫你来便是让你来还人情，说到底小姐也是我看着长大的，不过要是实在没办法我也会亲自动手的。”说着哼了一声，“还有，我来的时候你应该没发现吧，这意味着什么？我和你已经在同一层次了。最后，记住，你的命是我救的。”说完长袖一挥而去。\u003cbr\u003e\n“可恶。”我紧握拳头。\u003cbr\u003e\n第二天清晨，如烟一早就起了，琴房里，如烟纤手细弹，心情显得特别好，只是偶尔抬头看了下四周，似乎没见到想见的人，叹了口气又接着抚琴。\u003cbr\u003e\n“如烟小姐的《春江花月夜》弹得倒是挺娴熟。”我悄然走进琴房出了一声。\u003cbr\u003e\n似乎被惊吓了点，如烟弹走一个音，然后抬头看了我一眼又低下头去，脸微红，“还好，你昨天没受伤罢？”\u003cbr\u003e\n“没有啊。”\u003cbr\u003e\n“哦，那就好。”一弹弦一断，“嘣”的一声，琴架裂开。我立刻闪身将如烟抱住，只见一根飞针穿过如烟刚才坐的地方直刺向墙壁，成洞。“可恶。”\u003cbr\u003e\n如烟紧抱着我，丝毫没有松开的意思，抽泣着，“林大哥，我受够了这样的生活，我很害怕，你带我走好不好？好不好？”一滴温热的泪珠滚进我的胸口。\u003cbr\u003e\n我丝毫没意料到她会这样，毕竟我们只是初识，但我却不知道有种感觉叫做一眼万年。\u003cbr\u003e\n我拍着她的后背，“没事的，我会一直保护你。”\u003cbr\u003e\n“真的吗？不能骗我哦。”\u003cbr\u003e\n我心里想着她的单纯，“好，不骗你。”\u003cbr\u003e\n于是我开始每天在她身旁守护着她，有时会有一些小插曲，但日子过得还算平静。我也愈发感觉到她身上的魅力。不论是对仆人的好还是心底里散发出的善良，总之，我觉得我这辈子好像就注定是要守护她了。\u003cbr\u003e\n繁花终有落尽时，花落人去，飞鸟嘶鸣。\u003cbr\u003e\n“林大哥，听到飞鸟的声音了吗？和我去楼阁看看吧！”如烟眼睛一眨一眨，如星空般璀璨。\u003cbr\u003e\n“嗯，走吧。”\u003cbr\u003e\n楼阁花香依旧，醉人心脾。只是香得有些诡异。\u003cbr\u003e\n“嗖”地一声，人影现。\u003cbr\u003e\n“秦总管，你也来看飞鸟吗？”如烟看向刚出现的人影，笑道。\u003cbr\u003e\n“是啊，看来我是打扰了小姐和青风私会哟。”秦总管笑着慢慢走过来。\u003cbr\u003e\n如烟听闻，脸微红。\u003cbr\u003e\n我眉头微皱，隐隐将如烟藏在身后，“秦总管，既然你觉得打扰我们了，那你是不是该走开才对，是吧？”我冷笑道。\u003cbr\u003e\n如烟脸更红了，“林大哥，没关系啦。”\u003cbr\u003e\n“青风啊，做人何必那么较真，小姐都说没关系，所以说你是不是该接受我的建议了呢？”说完右手虚张，一道火焰迅速朝我奔来。\u003cbr\u003e\n“别以为我真不会对你出手。”我正要风控，突然身体一软，摊在地上。\u003cbr\u003e\n花香，最迷人的最危险。\u003cbr\u003e\n“秦总管，你怎么，你\u0026hellip;\u0026hellip;”如烟乱了，完全不知所措。\u003cbr\u003e\n“小姐，你还不明白么？封印在你身上的灵珠啊，啧啧，我也不想的。”\u003cbr\u003e\n一切都明白了，如烟静立着，一抹无奈的浅笑，“我原以为，秦伯伯是除了爹娘外最疼我的长辈，看着我长大，当爹爹苛责我的时候，会替我求情，擦干我的眼泪。会在我最无助的时候安慰我\u0026hellip;\u0026hellip;”\u003cbr\u003e\n“不要说了，都过去了。”秦总管低下头叹口气，右手又一道火焰升起，指向如烟。\u003cbr\u003e\n我用尽浑身力气，扑向如烟，“噗”的一声玫瑰红洒满了一地。\u003cbr\u003e\n“林大哥，林大哥\u0026hellip;\u0026hellip;”\u003cbr\u003e\n“快去找你爹爹，快。”\u003cbr\u003e\n秦总管冷哼一声，“你父亲睡得正香呢，估计得好几个时辰才能醒来吧。”\u003cbr\u003e\n“你\u0026hellip;\u0026hellip;林大哥，林大哥，”如烟黛眉紧蹙，泪雨如花，然后突然抱住我，两唇紧贴，舌尖缭绕，一股强大的灵气汹涌而来。\u003cbr\u003e\n“林大哥，记得照顾好自己还有我父亲，我不能陪你了，对不起\u0026hellip;\u0026hellip;”\u003cbr\u003e\n“如烟——”我抱住如烟狂喊，只是再也没用了。\u003cbr\u003e\n秦总管慌着逃离，我抽泣着没有阻止，双手抱起如烟，“输了你，我赢了世界又如何？”\u003cbr\u003e\n飞鸟归，嘶鸣起，青风化如烟，只是记忆的碎片，要我怎么捡拾，去拼凑属于我们曾经最美的回忆\u0026hellip;\u0026hellip;\u003c/p\u003e","title":"青风化如烟"},{"content":"回不去的那段相知相许美好，都在发黄的信纸上闪耀，那是青春，失去记号，莫怪读了心还会跳。 ——题记\n你的世界但愿都好，当我想起你的微笑，就会无意间想起那些年我们彼此写过的情书。只是我不知道，现在的你是否还记得那段美好。\n可能是我的记性太好，把本不该记住的记忆都硬塞在了脑海的漂流瓶里。遗忘，并不是我所能选择的，记得便是记得，只是有时想起会有一些揪心的疼痛。酸楚，不安。\n初次相识的那年，似乎是秋天吧，大片大片枫叶从头顶上散落而过，风飒飒地吹乱我的长发，走在校园里，我看见你一个人站在小青板石路，遥看向远方，不知在冥想着什么。\n后来我过去和你说了话，你说你失恋了，我看到你深邃的眼睛四周发红，安慰你，但我似乎天生就不会安慰别人，因为我连我自己都安慰不了。\n然后我们互留了联系方式，只是偶尔联系一两次。\n冬天来了，人们开始穿起厚厚的羽绒服，把自己裹得像是一个大粽子。大家早上都不愿意起床，一直拖到快上课迟到。\n而我喜欢晨跑，即使是冰冻三尺的冬天。在操场上，我又遇见了你，我笑着对你说我俩真有缘，然后你笑我变成了一个胖胖的大粽子。后来的后来，我从别人那里知道你是没有晨跑的习惯的。\n就这样我们跑了整个冬天，如果可以，我想就这样跑下去，没有尽头那该有多好，只是有的时候，远方是会出现十字路口的，最后你走你的，我的我的，各形陌路\u0026hellip;\u0026hellip;\n初春，积雪消融，却是更冷的时候。我开始收到你写给我的很长很长的情书，我想像着在冷夜里，你呵着气，冻僵的手持着笔慢慢地将温热的柔情化为笔迹。我心里默默地读着，轻轻抚摸着你清秀的字迹，你写着:没有你，我的幸福无法靠岸。\n这样肉麻的句子我不知道是不是应该叫做煽情还是无趣，总之那时的我看着却觉得有种温热，让我在寒冷的季节里有了些精神上的寄托。\n我终于也给你回信了，我对你说，你不要觉得我很好，也许那只是你的幻觉。再美的爱情都会有瑕疵的时候，也许相处后你会发现我很多的缺点，又或许，你喜欢的，只是你想像中的我。如果想好再给我回复。\n有时候会觉得我们很好笑，明明是在同一个学校却还要写着书信，然后悉心包装好信封，但也许，这就是另外一种感觉吧。\n过了几天，和我想的一样，你给我回信了。你说你会爱我，让我做你的女朋友吧。我看到后沉默了很久，我不知道我是否是害怕恋爱，亦或是还没有做好准备。我只知道来得太快的爱情在很多时候都不是好事，但我还是答应了，我说你一定要对我好一点，你说会的。\n我们就这样在一起了，一起去上课，一起去饭堂，有时偷偷跑出学校去看场电影。你会在晚上打个电话给我说声晚安，然后挂了电话就是舍友们“喔”的起哄声，她们对我说，你真幸福。于是我就真的很幸福了。\n毕业了，我对你说，我们会分手吗？就像旁边很多的同学，毕业后相拥哭一场，然后笑着说了再见。\n你抚摸着我的脸，说我真傻，然后我们拥抱着笑了。那时我突然发觉，我好像很害怕失去，而且我发觉我爱你胜过了你爱我。\n是不是说越害怕就越容易失去，越想拥有往往就越会得不到。\n两个月后的某一天，你还是把那句话说出口，你说分手吧。我在电话那头强忍着哭泣，只是眼泪划过面庞，嘴唇有点咸，我问你为什么？你只是说了声对不起便挂了。\n我一直不知道是什么原因，我也没再去问过，我们就这样断了联系。我只知道，既然你选择了放弃，我又何必放下自尊去强求，你选择了离开，那我便不会再留。\n只是即使现在回想起来，也会有种莫名的酸楚，说会觉得惋惜吗？会的吧，只是都已经随着尘风过去了的事情又何必再去牵挂，或许你已经不再记得我了，所以我现在会试着把你忘记。\n我的记性太好，我忏悔，我真不是一个好孩子\u0026hellip;\u0026hellip;\n注：本文转自我哥的日志\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E9%82%A3%E5%B9%B4%E7%9A%84%E6%83%85%E4%B9%A6-%E6%95%A3%E6%96%87/","summary":"\u003cp\u003e回不去的那段相知相许美好，都在发黄的信纸上闪耀，那是青春，失去记号，莫怪读了心还会跳。 \u003c/p\u003e\n\u003cp\u003e——题记\u003c/p\u003e\n\u003cp\u003e你的世界但愿都好，当我想起你的微笑，就会无意间想起那些年我们彼此写过的情书。只是我不知道，现在的你是否还记得那段美好。\u003c/p\u003e\n\u003cp\u003e可能是我的记性太好，把本不该记住的记忆都硬塞在了脑海的漂流瓶里。遗忘，并不是我所能选择的，记得便是记得，只是有时想起会有一些揪心的疼痛。酸楚，不安。\u003c/p\u003e\n\u003cp\u003e初次相识的那年，似乎是秋天吧，大片大片枫叶从头顶上散落而过，风飒飒地吹乱我的长发，走在校园里，我看见你一个人站在小青板石路，遥看向远方，不知在冥想着什么。\u003c/p\u003e\n\u003cp\u003e后来我过去和你说了话，你说你失恋了，我看到你深邃的眼睛四周发红，安慰你，但我似乎天生就不会安慰别人，因为我连我自己都安慰不了。\u003c/p\u003e\n\u003cp\u003e然后我们互留了联系方式，只是偶尔联系一两次。\u003c/p\u003e\n\u003cp\u003e冬天来了，人们开始穿起厚厚的羽绒服，把自己裹得像是一个大粽子。大家早上都不愿意起床，一直拖到快上课迟到。\u003c/p\u003e\n\u003cp\u003e而我喜欢晨跑，即使是冰冻三尺的冬天。在操场上，我又遇见了你，我笑着对你说我俩真有缘，然后你笑我变成了一个胖胖的大粽子。后来的后来，我从别人那里知道你是没有晨跑的习惯的。\u003c/p\u003e\n\u003cp\u003e就这样我们跑了整个冬天，如果可以，我想就这样跑下去，没有尽头那该有多好，只是有的时候，远方是会出现十字路口的，最后你走你的，我的我的，各形陌路\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003cp\u003e初春，积雪消融，却是更冷的时候。我开始收到你写给我的很长很长的情书，我想像着在冷夜里，你呵着气，冻僵的手持着笔慢慢地将温热的柔情化为笔迹。我心里默默地读着，轻轻抚摸着你清秀的字迹，你写着:没有你，我的幸福无法靠岸。\u003c/p\u003e\n\u003cp\u003e这样肉麻的句子我不知道是不是应该叫做煽情还是无趣，总之那时的我看着却觉得有种温热，让我在寒冷的季节里有了些精神上的寄托。\u003c/p\u003e\n\u003cp\u003e我终于也给你回信了，我对你说，你不要觉得我很好，也许那只是你的幻觉。再美的爱情都会有瑕疵的时候，也许相处后你会发现我很多的缺点，又或许，你喜欢的，只是你想像中的我。如果想好再给我回复。\u003c/p\u003e\n\u003cp\u003e有时候会觉得我们很好笑，明明是在同一个学校却还要写着书信，然后悉心包装好信封，但也许，这就是另外一种感觉吧。\u003c/p\u003e\n\u003cp\u003e过了几天，和我想的一样，你给我回信了。你说你会爱我，让我做你的女朋友吧。我看到后沉默了很久，我不知道我是否是害怕恋爱，亦或是还没有做好准备。我只知道来得太快的爱情在很多时候都不是好事，但我还是答应了，我说你一定要对我好一点，你说会的。\u003c/p\u003e\n\u003cp\u003e我们就这样在一起了，一起去上课，一起去饭堂，有时偷偷跑出学校去看场电影。你会在晚上打个电话给我说声晚安，然后挂了电话就是舍友们“喔”的起哄声，她们对我说，你真幸福。于是我就真的很幸福了。\u003c/p\u003e\n\u003cp\u003e毕业了，我对你说，我们会分手吗？就像旁边很多的同学，毕业后相拥哭一场，然后笑着说了再见。\u003c/p\u003e\n\u003cp\u003e你抚摸着我的脸，说我真傻，然后我们拥抱着笑了。那时我突然发觉，我好像很害怕失去，而且我发觉我爱你胜过了你爱我。\u003c/p\u003e\n\u003cp\u003e是不是说越害怕就越容易失去，越想拥有往往就越会得不到。\u003c/p\u003e\n\u003cp\u003e两个月后的某一天，你还是把那句话说出口，你说分手吧。我在电话那头强忍着哭泣，只是眼泪划过面庞，嘴唇有点咸，我问你为什么？你只是说了声对不起便挂了。\u003c/p\u003e\n\u003cp\u003e我一直不知道是什么原因，我也没再去问过，我们就这样断了联系。我只知道，既然你选择了放弃，我又何必放下自尊去强求，你选择了离开，那我便不会再留。\u003c/p\u003e\n\u003cp\u003e只是即使现在回想起来，也会有种莫名的酸楚，说会觉得惋惜吗？会的吧，只是都已经随着尘风过去了的事情又何必再去牵挂，或许你已经不再记得我了，所以我现在会试着把你忘记。\u003c/p\u003e\n\u003cp\u003e我的记性太好，我忏悔，我真不是一个好孩子\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003cp\u003e注：本文转自我哥的日志\u003c/p\u003e","title":"那年的情书——散文"},{"content":"久未放晴的天空，依旧留着你的笑容\n——引言\n如果再回到三年前的那一天的那一刻，如果那时开了口，一切都会不同吧。可能现在的生活都会不一样。\n铛铛裆～铛铛铛，一列列火车从西城身前呼啸而过，声音悠长悠长，像是二胡破了音 ，西城缓缓地从袋口掏出装火车票的黑色钱包，手微微一松，钱包啪啦一声掉在地上，一张略皱的照片散落出来，西城弯腰捡起，拍拍灰尘，嘴角微扬，看着里面他和小染嘻笑的合照，苦笑了一声。\n车站的画面总像一场离别伤感的电影场景，在陈旧的灰色的光泽下，再让夕阳的光线弥漫开来。就是这样地，西城在夕阳的笼罩下，注视着前方那个不断被呼呼而过的火车隔离又时而显现的熟悉的身影，再低头看着照片上那纯情的笑颜，呵呵，三年了，你还是没变。只是，再也回不去了，西城看着那个熟悉的身影牵着一个大概一岁，走路还很不稳的小孩，笑着渐走渐远。\n最后被拉长的身影也一点一点消逝干净，西城抬起头，看着天空，是的，依旧留着你的笑容。思绪流转，回到三年前，西城的双眼有了点微光，有些H2O成分的微光。\n哭过却无法掩埋歉疚。西城曾经是一家医院最年轻的医师，也就是在四年前的某一天，一个脚受了重伤的女孩住进了这家医院，她的名字叫小染。这个爱笑的一笑就会露出两个深深的酒窝的女孩就这样走进了西城的世界。的确，她的笑意很容易感染人，也许一笑倾城，再笑就倾国，三笑就把西城的心俘虏了。\n晴天永远是西城最美好的回忆，天空一放晴，西城就会推着坐在轮椅上的小染到医院附近的公园，大多时候都是放风筝的吧，风筝随着风高高地在天空飘荡，它在高空中微笑地俯视着地下边笑边拉着线的小染和西城，似乎周围都没有了人，时间静止，咔嚓一声，一张照片成了西城以后最依赖的记忆。\n就这样平静地生活着，该有多好？很好，非常好。西城会天天买两盒巧克力雪糕，两个人走到有阳光透过的窗前靠在一起品尝着。会在每次小染动小手术前，握住她的手，唠唠叨叨地说着些安慰的话语，尽管小染连说知道啦知道啦，他也会一直唠叨个没完没了，但小染听着心里却是很舒服。会在小染睡觉前唱首给她的歌，有时会让她感动地哭了，于是就拿过纸巾帮她抹着闪烁的泪光，两个人噗嗤一笑。会偷偷带她出去看场貌似枯燥的电影，但看的时候却很开心。会\u0026hellip;\u0026hellip;\u0026hellip;..但是现在看来，以后都不会了。\n就这样过了一年，小染的脚渐渐好了，能开始自由走路了。一天，也就是三年前的一天，一个身穿黑色毛衣的女孩来到这家医院探望亲属。一个转角，西城与这个女孩擦肩而过，两人停住脚步，缓缓转过身去目视着对方，西城冲她淡然一笑，“过得还好吗？”\n女孩的步伐缓缓走向西城，两手朝西城一合，紧紧地抱住他，“我发觉我还是忘不了你。”西城没有松开她的手，毕竟她是他的前任，多多少少还是有点情愫的。“抱歉，我已经\u0026hellip;\u0026hellip;\u0026hellip;”说着说着，忽然看到眼前那两盒在空中做着自由落体运动，准备落地的巧克力雪糕，而施放这个作用力的主人捂着脸，脚步有点杂乱地转身小跑着离开。小染，你就这样走了？\n西城立马挣开拥抱，大步朝小染走的方向跑去，没有人，连一丁点影子都看不见，因为是阴天，他们的心，也是阴天。小染在西城停住脚步的左边的墙角处，俯着身，捂住嘴抽泣着，如果你从没出现，我会不会，觉得快乐一些？\n西城离开了这座城市，一座城，一生心疼。开始了一个人的生活，只能永远读着对白吧，读着我给你的伤害，我原谅不了我，就请你当做我已不在。\n暮色四合，火车渐渐地少了，而西城也错过了他的车，西城闭上眼睛，手里的车票随着灰色的风飘荡飞远，于是睁开双眼看着空白，忘记你对我的期待，也许，那一天开始就没有了期待了吧？\n读完了依赖，我很快就离开。只能一个人在空地里拉着线复习你给的温柔\u0026hellip;\u0026hellip;.\n——改编周杰伦《搁浅》\n注：本文转自我哥的日志\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E6%90%81%E6%B5%85-%E6%82%B2%E9%9F%B3%E4%B9%90%E5%B0%8F%E8%AF%B4/","summary":"\u003cp\u003e久未放晴的天空，依旧留着你的笑容\u003c/p\u003e\n\u003cp\u003e——引言\u003c/p\u003e\n\u003cp\u003e如果再回到三年前的那一天的那一刻，如果那时开了口，一切都会不同吧。可能现在的生活都会不一样。\u003c/p\u003e\n\u003cp\u003e铛铛裆～铛铛铛，一列列火车从西城身前呼啸而过，声音悠长悠长，像是二胡破了音 ，西城缓缓地从袋口掏出装火车票的黑色钱包，手微微一松，钱包啪啦一声掉在地上，一张略皱的照片散落出来，西城弯腰捡起，拍拍灰尘，嘴角微扬，看着里面他和小染嘻笑的合照，苦笑了一声。\u003c/p\u003e\n\u003cp\u003e车站的画面总像一场离别伤感的电影场景，在陈旧的灰色的光泽下，再让夕阳的光线弥漫开来。就是这样地，西城在夕阳的笼罩下，注视着前方那个不断被呼呼而过的火车隔离又时而显现的熟悉的身影，再低头看着照片上那纯情的笑颜，呵呵，三年了，你还是没变。只是，再也回不去了，西城看着那个熟悉的身影牵着一个大概一岁，走路还很不稳的小孩，笑着渐走渐远。\u003c/p\u003e\n\u003cp\u003e最后被拉长的身影也一点一点消逝干净，西城抬起头，看着天空，是的，依旧留着你的笑容。思绪流转，回到三年前，西城的双眼有了点微光，有些H2O成分的微光。\u003c/p\u003e\n\u003cp\u003e哭过却无法掩埋歉疚。西城曾经是一家医院最年轻的医师，也就是在四年前的某一天，一个脚受了重伤的女孩住进了这家医院，她的名字叫小染。这个爱笑的一笑就会露出两个深深的酒窝的女孩就这样走进了西城的世界。的确，她的笑意很容易感染人，也许一笑倾城，再笑就倾国，三笑就把西城的心俘虏了。\u003c/p\u003e\n\u003cp\u003e晴天永远是西城最美好的回忆，天空一放晴，西城就会推着坐在轮椅上的小染到医院附近的公园，大多时候都是放风筝的吧，风筝随着风高高地在天空飘荡，它在高空中微笑地俯视着地下边笑边拉着线的小染和西城，似乎周围都没有了人，时间静止，咔嚓一声，一张照片成了西城以后最依赖的记忆。\u003c/p\u003e\n\u003cp\u003e就这样平静地生活着，该有多好？很好，非常好。西城会天天买两盒巧克力雪糕，两个人走到有阳光透过的窗前靠在一起品尝着。会在每次小染动小手术前，握住她的手，唠唠叨叨地说着些安慰的话语，尽管小染连说知道啦知道啦，他也会一直唠叨个没完没了，但小染听着心里却是很舒服。会在小染睡觉前唱首给她的歌，有时会让她感动地哭了，于是就拿过纸巾帮她抹着闪烁的泪光，两个人噗嗤一笑。会偷偷带她出去看场貌似枯燥的电影，但看的时候却很开心。会\u0026hellip;\u0026hellip;\u0026hellip;..但是现在看来，以后都不会了。\u003c/p\u003e\n\u003cp\u003e就这样过了一年，小染的脚渐渐好了，能开始自由走路了。一天，也就是三年前的一天，一个身穿黑色毛衣的女孩来到这家医院探望亲属。一个转角，西城与这个女孩擦肩而过，两人停住脚步，缓缓转过身去目视着对方，西城冲她淡然一笑，“过得还好吗？”\u003c/p\u003e\n\u003cp\u003e女孩的步伐缓缓走向西城，两手朝西城一合，紧紧地抱住他，“我发觉我还是忘不了你。”西城没有松开她的手，毕竟她是他的前任，多多少少还是有点情愫的。“抱歉，我已经\u0026hellip;\u0026hellip;\u0026hellip;”说着说着，忽然看到眼前那两盒在空中做着自由落体运动，准备落地的巧克力雪糕，而施放这个作用力的主人捂着脸，脚步有点杂乱地转身小跑着离开。小染，你就这样走了？\u003c/p\u003e\n\u003cp\u003e西城立马挣开拥抱，大步朝小染走的方向跑去，没有人，连一丁点影子都看不见，因为是阴天，他们的心，也是阴天。小染在西城停住脚步的左边的墙角处，俯着身，捂住嘴抽泣着，如果你从没出现，我会不会，觉得快乐一些？\u003c/p\u003e\n\u003cp\u003e西城离开了这座城市，一座城，一生心疼。开始了一个人的生活，只能永远读着对白吧，读着我给你的伤害，我原谅不了我，就请你当做我已不在。\u003c/p\u003e\n\u003cp\u003e暮色四合，火车渐渐地少了，而西城也错过了他的车，西城闭上眼睛，手里的车票随着灰色的风飘荡飞远，于是睁开双眼看着空白，忘记你对我的期待，也许，那一天开始就没有了期待了吧？\u003c/p\u003e\n\u003cp\u003e读完了依赖，我很快就离开。只能一个人在空地里拉着线复习你给的温柔\u0026hellip;\u0026hellip;.\u003c/p\u003e\n\u003cp\u003e——改编周杰伦《搁浅》\u003c/p\u003e\n\u003cp\u003e注：本文转自我哥的日志\u003c/p\u003e","title":"搁浅——【悲】音乐小说"},{"content":"是不是每一束光都会有消失散尽的时候，是不是每一场梦都会有悲伤的结局。如果我变成回忆，终于没那么幸运，没机会白着头发，蹒跚牵着你，看晚霞落尽。若有人可以，让他陪你，我不怪你……\n——前奏\n累了，依然照惯例努力清醒着，也照惯例想你了。城东支着身，缓缓走到阳台，困乏的双眼散发着无力的眼神。此时已是落日夕阳斜，可以看到楼下时而有几对情侣在慵懒的夕阳下，牵着有温度的手，脸上泛着笑意漫步着。自己应该也可以这样的吧？可以的，肯定可以的。只不过这道证明题里需要有一个论证条件：2年前。于是城东在A4纸上悄悄写下了两个字：无解。\n无解，就像是数学里二次函数的图象，和Y轴没有一个交点，谈不上丝毫交集，无缘无份。\n回忆永远都是最美好的，因为在回忆的保温杯里始终都充斥着你的温柔，你的美。记得以前看到这么一句话：你若不离不弃，我便生死相依。城东笑了，笑得好落寞，然后眼神变得温柔而又伤感，筱雅，我不想你生死相依，不想看到你难过的样子，所以我必须学会狠心。不离不弃？我想的，但是，这样真的就会更好吗？\n那些过去的人，那些过去的事，如果曾经美好，如果现在怀念。那就怀念吧，哪怕回不到从前。\n现在想起来，斗嘴的日子也是挺值得怀念的。在某一年的某一天晚上的某一瞬间，一个短发的穿着碎花洋裙的女孩打破了沉静，“哎，你说，是不是你先说永远地爱我的呀？”说完眼睛眨巴眨巴仰着头看着城东。他也怔怔地看了对方三秒，于是开口，“喂喂喂，筱雅，明明是你先向我表白的好不，你写给我的信还在呢。”\n“不行不行，明明是你写信给我的。”筱雅嘟起了嘴，霓虹的灯光照在粉粉的脸上，那时城东就想，多可惜了这么可爱的女孩子，这么好胜。其实现在想想，女生不就都这样，撒撒娇。也没什么的吧。\n城东假装生气，板起了脸，“等会拿证据给你看。”\n“哎，人家是女孩子耶，都不让让。”筱雅的脸显得更红了。\n城东只好妥协，“好好好，是我向你表白的，情书都是我写的，好不？”\n筱雅撇过头去，“没诚意。”\n温热的眼神把所有的光线都凝聚在筱雅的瞳孔里，“其实，我喜欢你很久很久了，从第一眼见到你的时候，你的发香，你的笑颜……”可是，没等说完，就被筱雅打断了，“行了行了，我快吐啦。哼，你们男人就会油嘴滑舌。嗯……算了，这次姑且饶过你。”说完得意地往前走，嘴角微扬，一抹惊艳。\n“我……”城东想要说些什么，又无言以对。没办法，在两个人的世界里，男生往往说不过女生，不是没能耐，而是不忍心。\n太美好的东西往往越在乎，就越不能持久。像是早已设定好时间的定时炸弹，在某一刻迅速膨胀，轰的一声完全引爆开来，将所有的幸福喜悦炸得只剩下黑白照片般冰冷的回忆。\n就是这么一张白色的体检报告单上的时间，成为了一切欢乐的引爆点。城东，男，21岁，先天性心脏病。以前在书上看到这六个字的时候，就像是六只小船平静地从脑海间划过，而现在呢，却像是千万根狰狞的毒针狞笑着狠狠地扎向自己。丝毫没有选择的余地。\n如果我变成回忆，退出了这场生命，留下你错愕哭泣，而我冰冷的身体却拥抱不了你，那么我会恨自己的吧，恨自己如此狠心。“筱雅，分手吧，我已经很累了。”城东面无表情地面对着筱雅，心里却是说不出的辛酸。\n娇小的身躯微微一颤，拍了拍城东的肩膀，嗔笑道，“开什么玩笑呢你，今天又不是四月一。”\n“没开玩笑，真的……对不起。这段时间打扰你了，我们……并不合衬。”城东断断续续地终于说出了口，期间差点泪奔。不合衬？说完后连自己都觉得恨自己。\n“不准，你不准走……你可不可以不要走，你答应过我会永远地爱我的，你这么快就忘了？”筱雅拉住城东的袖口，终于忍不住，泪水决堤。是不是真的像一首歌唱的，承诺常常很像蝴蝶，美丽地飞，盘旋着然后再也不见？\n城东心一狠，用力地挣开筱雅的手，转身离开，坚决的步伐铿锵有力，“我真的得走了，你不用找我，你找不到的。”筱雅如果这时追上去，就会看到城东已是泪流满面的。男人流血不流泪？不知是哪位先辈说的，不过可以肯定的是，他一定很可怜，因为他的心永远都是冰冷的，没有春天。\n筱雅看着城东的背影渐渐远去，眼泪滑过嘴角，咸咸的味道。为什么会这样？也许是有原因的吧，可是，真的有吗？不甘心，不想死心，很不甘心，很不想死心。但是当亲眼看着曾经的美好离去的时候，还有用吗？不知道，也不想知道。脑袋已经是一片空白……\n很久以后，每当想起这一幕，不管心情有多好也总会掉泪。\n漫长时光总有一天你会伤心痊愈，若有人可以，让他陪你，我不怪你。城东连夜飞往了上海，在这座以光速不断发展的城市里，一呆就是2年。慢慢调养下，病情似乎有了点好转，只是身体显得有些单薄，整个人有些颓废。\n2年时间，足以发生很多事。\n好久没回去了，回去看看也是好的。只是，筱雅她，或许已经不是一个人了吧，但是又有什么关系呢，她快乐就好。但是她真的快乐么？三天后，城东带上行李飞回了充满美好回忆的本属于他和筱雅的城市。\n城东从阳台边看着夕阳，接着出门走到一个地方，停了下来。夕阳公园，和筱雅邂逅的地方，此时站在这里，有种说不出口的莫名的感受，似乎缺少了点什么。\n想起一句话：你永远也看不到我最寂寞的时候，因为只有当你看不到我的时候，我才最寂寞。城东望着夕阳出了神，喃喃道，“筱雅，你在哪？我好想你。”\n“我也很想你。”一个熟悉的温柔的声音从城东身后响起。\n于是像是触电般，城东一个转身，看见一个人。\n依旧是短发，依旧是碎花洋裙，还有，那久违了的温情的笑容。\n在夕阳西下的瞬间，两人相拥而吻，然后像很多电影最后的场面，镜头越拉越远，最后形成一个静止的定格。\n一个白的有些森然的病房里，躺着一个正在熟睡的青年，脸上泛着淡淡的笑意。\n“林医师，城东已经沉睡了三天了，怎么还没醒？”心电仪器旁，一个身穿白色素服的护士看向城东。\n“他是在做一场很长很长的梦，而且看样子，他已经不想醒了………”\n—— 改编TANK《如果我变成回忆》\n注：本文转自我哥的日志。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E5%A6%82%E6%9E%9C%E6%88%91%E5%8F%98%E6%88%90%E5%9B%9E%E5%BF%86-%E6%82%B2%E9%9F%B3%E4%B9%90%E5%B0%8F%E8%AF%B4/","summary":"\u003cp\u003e是不是每一束光都会有消失散尽的时候，是不是每一场梦都会有悲伤的结局。如果我变成回忆，终于没那么幸运，没机会白着头发，蹒跚牵着你，看晚霞落尽。若有人可以，让他陪你，我不怪你……\u003cbr\u003e\n                                                                             ——前奏\u003cbr\u003e\n    \u003cbr\u003e\n      累了，依然照惯例努力清醒着，也照惯例想你了。城东支着身，缓缓走到阳台，困乏的双眼散发着无力的眼神。此时已是落日夕阳斜，可以看到楼下时而有几对情侣在慵懒的夕阳下，牵着有温度的手，脸上泛着笑意漫步着。自己应该也可以这样的吧？可以的，肯定可以的。只不过这道证明题里需要有一个论证条件：2年前。于是城东在A4纸上悄悄写下了两个字：无解。\u003cbr\u003e\n      无解，就像是数学里二次函数的图象，和Y轴没有一个交点，谈不上丝毫交集，无缘无份。\u003cbr\u003e\n      回忆永远都是最美好的，因为在回忆的保温杯里始终都充斥着你的温柔，你的美。记得以前看到这么一句话：你若不离不弃，我便生死相依。城东笑了，笑得好落寞，然后眼神变得温柔而又伤感，筱雅，我不想你生死相依，不想看到你难过的样子，所以我必须学会狠心。不离不弃？我想的，但是，这样真的就会更好吗？\u003cbr\u003e\n      那些过去的人，那些过去的事，如果曾经美好，如果现在怀念。那就怀念吧，哪怕回不到从前。\u003cbr\u003e\n      现在想起来，斗嘴的日子也是挺值得怀念的。在某一年的某一天晚上的某一瞬间，一个短发的穿着碎花洋裙的女孩打破了沉静，“哎，你说，是不是你先说永远地爱我的呀？”说完眼睛眨巴眨巴仰着头看着城东。他也怔怔地看了对方三秒，于是开口，“喂喂喂，筱雅，明明是你先向我表白的好不，你写给我的信还在呢。”\u003cbr\u003e\n      “不行不行，明明是你写信给我的。”筱雅嘟起了嘴，霓虹的灯光照在粉粉的脸上，那时城东就想，多可惜了这么可爱的女孩子，这么好胜。其实现在想想，女生不就都这样，撒撒娇。也没什么的吧。\u003cbr\u003e\n       城东假装生气，板起了脸，“等会拿证据给你看。”\u003cbr\u003e\n      “哎，人家是女孩子耶，都不让让。”筱雅的脸显得更红了。\u003cbr\u003e\n       城东只好妥协，“好好好，是我向你表白的，情书都是我写的，好不？”\u003cbr\u003e\n       筱雅撇过头去，“没诚意。”\u003cbr\u003e\n       温热的眼神把所有的光线都凝聚在筱雅的瞳孔里，“其实，我喜欢你很久很久了，从第一眼见到你的时候，你的发香，你的笑颜……”可是，没等说完，就被筱雅打断了，“行了行了，我快吐啦。哼，你们男人就会油嘴滑舌。嗯……算了，这次姑且饶过你。”说完得意地往前走，嘴角微扬，一抹惊艳。\u003cbr\u003e\n      “我……”城东想要说些什么，又无言以对。没办法，在两个人的世界里，男生往往说不过女生，不是没能耐，而是不忍心。\u003cbr\u003e\n       太美好的东西往往越在乎，就越不能持久。像是早已设定好时间的定时炸弹，在某一刻迅速膨胀，轰的一声完全引爆开来，将所有的幸福喜悦炸得只剩下黑白照片般冰冷的回忆。\u003cbr\u003e\n       就是这么一张白色的体检报告单上的时间，成为了一切欢乐的引爆点。城东，男，21岁，先天性心脏病。以前在书上看到这六个字的时候，就像是六只小船平静地从脑海间划过，而现在呢，却像是千万根狰狞的毒针狞笑着狠狠地扎向自己。丝毫没有选择的余地。\u003cbr\u003e\n      如果我变成回忆，退出了这场生命，留下你错愕哭泣，而我冰冷的身体却拥抱不了你，那么我会恨自己的吧，恨自己如此狠心。“筱雅，分手吧，我已经很累了。”城东面无表情地面对着筱雅，心里却是说不出的辛酸。\u003cbr\u003e\n       娇小的身躯微微一颤，拍了拍城东的肩膀，嗔笑道，“开什么玩笑呢你，今天又不是四月一。”\u003cbr\u003e\n      “没开玩笑，真的……对不起。这段时间打扰你了，我们……并不合衬。”城东断断续续地终于说出了口，期间差点泪奔。不合衬？说完后连自己都觉得恨自己。\u003cbr\u003e\n      “不准，你不准走……你可不可以不要走，你答应过我会永远地爱我的，你这么快就忘了？”筱雅拉住城东的袖口，终于忍不住，泪水决堤。是不是真的像一首歌唱的，承诺常常很像蝴蝶，美丽地飞，盘旋着然后再也不见？\u003cbr\u003e\n     城东心一狠，用力地挣开筱雅的手，转身离开，坚决的步伐铿锵有力，“我真的得走了，你不用找我，你找不到的。”筱雅如果这时追上去，就会看到城东已是泪流满面的。男人流血不流泪？不知是哪位先辈说的，不过可以肯定的是，他一定很可怜，因为他的心永远都是冰冷的，没有春天。\u003cbr\u003e\n     筱雅看着城东的背影渐渐远去，眼泪滑过嘴角，咸咸的味道。为什么会这样？也许是有原因的吧，可是，真的有吗？不甘心，不想死心，很不甘心，很不想死心。但是当亲眼看着曾经的美好离去的时候，还有用吗？不知道，也不想知道。脑袋已经是一片空白……\u003cbr\u003e\n     很久以后，每当想起这一幕，不管心情有多好也总会掉泪。\u003cbr\u003e\n     漫长时光总有一天你会伤心痊愈，若有人可以，让他陪你，我不怪你。城东连夜飞往了上海，在这座以光速不断发展的城市里，一呆就是2年。慢慢调养下，病情似乎有了点好转，只是身体显得有些单薄，整个人有些颓废。\u003cbr\u003e\n     2年时间，足以发生很多事。\u003cbr\u003e\n     好久没回去了，回去看看也是好的。只是，筱雅她，或许已经不是一个人了吧，但是又有什么关系呢，她快乐就好。但是她真的快乐么？三天后，城东带上行李飞回了充满美好回忆的本属于他和筱雅的城市。\u003cbr\u003e\n     城东从阳台边看着夕阳，接着出门走到一个地方，停了下来。夕阳公园，和筱雅邂逅的地方，此时站在这里，有种说不出口的莫名的感受，似乎缺少了点什么。\u003cbr\u003e\n     想起一句话：你永远也看不到我最寂寞的时候，因为只有当你看不到我的时候，我才最寂寞。城东望着夕阳出了神，喃喃道，“筱雅，你在哪？我好想你。”\u003cbr\u003e\n    “我也很想你。”一个熟悉的温柔的声音从城东身后响起。\u003cbr\u003e\n     于是像是触电般，城东一个转身，看见一个人。\u003cbr\u003e\n     依旧是短发，依旧是碎花洋裙，还有，那久违了的温情的笑容。\u003cbr\u003e\n     在夕阳西下的瞬间，两人相拥而吻，然后像很多电影最后的场面，镜头越拉越远，最后形成一个静止的定格。\u003cbr\u003e\n     一个白的有些森然的病房里，躺着一个正在熟睡的青年，脸上泛着淡淡的笑意。\u003cbr\u003e\n    “林医师，城东已经沉睡了三天了，怎么还没醒？”心电仪器旁，一个身穿白色素服的护士看向城东。\u003cbr\u003e\n     “他是在做一场很长很长的梦，而且看样子，他已经不想醒了………”\u003c/p\u003e\n\u003cp\u003e                                                        —— 改编TANK《如果我变成回忆》\u003c/p\u003e\n\u003cp\u003e注：本文转自我哥的日志。\u003c/p\u003e","title":"如果我变成回忆——【悲】音乐小说"},{"content":"爱你是孤单的心事，不懂你微笑的意思。\n—— 引言\n雨下在我窗前，玻璃也在流眼泪，街上的人都看起来比我幸福一点。\n我叫林雪，我妈说我出生的时候窗外一片洁白，雪花飞起来的样子很好看，希望我做个洁白、自由、纯净的女子。不负所望，我成为了家人眼中的好孩子，老师眼中的乖学生，同学眼中文静，学习好的女孩子。\n即使我集百般宠爱于一身，但我似乎并没有那么快乐，可能我就是雪吧，不喜阳光，注定成不了明媚的女子。\n高一那年夏天，我遇见了他。学校的篮球场总有几个酷爱篮球的高挑男生和一堆眼睛泛着微光的女生，她们脚下是几瓶摆放整齐的怡宝。挥汗如雨的他们释放着青春的能量，“啪”的一声，又是一个漂亮的灌篮，接着是女生们花痴的喝彩声，几瓶怡宝迅速地从地板上跃起，受到的拉力过大，以致瓶内泛起几朵漂亮的泡沫，转瞬即逝。\n收到怡宝最多的还是他，没有丝毫的意外。低下头，我对旁边的许晴小声说，“那个男生叫什么名字？看起来还挺受欢迎的嘛。”许晴是我同桌兼死党，标准的花痴，她收住眯着眼，嘴角上扬30度的形象，笑着回道，“哎呦，是不是看上隔壁班的程北了，也是，你看他多高挑，还有那灌篮的绝技，一个字，帅，改天介绍你认识认识……”正当她开始犯病时，我抽身边走边说，“去你的，才没有呢。”\n“哎，我还没说完呢，你去哪？”\n“回教室，看看书，准备考试了。”我泛着微红的脸朝着教室那边走去，“原来他叫程北。”\n“你这书呆，小心嫁不出去啦，喂，回下头看呗，程北看着你笑呢……”\n操场的嬉笑声渐渐地抽离到真空瓶中，悄悄地摁上瓶塞。回到教室，又是自己一个人，开始拿起书却看不进去，抛物线开口向上，A大于零……脑海里闪过那道抛出篮球优雅弧线的身影。\n买早餐的时候渐渐地开始习惯多带一份，趁大家都还没来，悄悄地往隔壁班靠窗第二张桌一放，早餐旁边有本漂亮的笔记本，上面写着：程北。\n“哎，林雪，听说每天早晨程北桌上总会有些早餐，真羡慕死他了，怎么就没人给我送呢？”许晴一副深情的模样。\n我翻动着书页，若无其事地探问，“是么，他什么反应，吃了没？”\n“吃了啊，他说既然是同学的一片心意，就不要辜负了。”\n“啪”，重重地合上书本，“真的啊？”\n“是啊，喂，你这么激动干嘛，嘿嘿，难不成是你送的？”许晴不怀好意地笑着，听得我头皮发麻。\n“怎么可能，我闲着没事做了我。”心里却是扑通扑通地跳着。\n“说笑的嘛，这么当真，就算你用刀指着我，我都不会相信，是吧，我的书呆大小姐……哎呦喂，痛……”不等她说完，我的手早已狠狠地扭住她了。\n高一下半学期的某一节体育课，那是我们第一次说话。春风微拂，一脸惬意，我和一群女生坐在石凳上看他们男生打球。我的眼光像是GPS定位般捕捉着程北的身影，一直如此。上半场结束，程北抹完汗喝着水，然后突然朝我们这边走来，准确说，是走向我，因为他开始对着我说话了。\n“同学，你是林雪吧，经常听说你呢，成绩很不错。”程北微笑着，看得我一脸醉意。\n“嗯，还好。程北同学，有事么？”因为紧张，我的声音有点僵，起初想微笑以对的，却一脸紧绷，怎么也挤不出弧线。\n“没见过你打篮球，我就是想让你平时多打打，单是一味看书可不行的呐。”\n“我不会打篮球的。”还是面无表情。\n“哦，可以学啊，要不我教你？”\n“其实我对篮球没什么兴趣。”\n“好吧，什么时候想学了就来找我，当书呆子可不好呢，我走了。”说完程北微笑着走了，而我却是一脸茫然，我捏了自己的脸，关键时刻掉链子。\n下课，我和许晴走在后面，因为我听见前面的女生在说着我的名字。\n“哎，你们看见林雪那样子没，书呆子一个，打个篮球都不会，真笑死我了。”\n“对嘛，不就是成绩好嘛，有什么了不起的，怪不得程北哥对着她笑，我看得出那是一种嘲笑。”\n不论在哪个城市的哪间学校，总有一群说话说得寒酸的女生，像是吃了酸豆角，然后从口中吐出，将锋利的角狠狠地扎进对方的心脏。\n我的心脏被狠狠地攥了一把，心痛，不是因为她们尖酸的话语，而是听到自己似乎被他嘲讽，我真的被他讨厌了吗？我不知道。\n爱你是孤单的心事，不懂你微笑的意思，只能像一朵向日葵，在夜里默默地坚持。\n被特别在乎的人讨厌会很难过，即使只是可能，但更难过的是你必须要装的若无其事。\n许晴听得火大，上前推了那两个女生一把，女生回过头恶狠狠吼道，“许晴，你发什么神经？”随即看到我后笑颜微灿，“哦，林雪啊，听说你最近每天都收到13朵玫瑰呀，真是好羡慕啊，真不知哪个男生送的，我想是那个年级第一的眼镜男吧，也挺般配的哦，听说他也不会打篮球耶。”\n我扼住心头上的怒火，拉着许晴，“我们走。”\n从上个月开始就每天收到13朵玫瑰，许晴说13朵玫瑰的花语是暗恋，我偷偷喜欢你。\n每次收到花，心里总会有程北的脸庞闪过，我狠狠摇头，怎么可能是他呢，苦笑。程北，你是我编造的童话故事中的王子，而我只是你生命里一个匆匆的过客吧。\n每天早晨，仍然是买两份早餐。直到今年夏天，我们高三毕业。我做的一切都是默默的，有苦有甜，更多的是自己咀嚼心痛。\n一直爱着你，用我自己的方式。我最后还是没有说出口。\n我喜欢袁湘琴的大胆和执着，但很可惜，我是“沈佳宜”。\n后记：\n你不曾给我一次回眸，我却始终在对你微笑。\n我叫程北，我喜欢的女孩叫做林雪，好美的名字，美得有些神圣，以至于我不敢靠得太近。\n虽然我的球技还行，但我的成绩却一塌糊涂，我经常对着她笑，但更多时候她总是低下头去，我不清楚她是不是瞧不起我。有时候我看见她和年级第一的男生讨论问题说说笑笑时，心里会有些难受。正如有句话说的，在乎够深的东西，别人碰一下都觉得是抢。有一次我鼓起勇气想找她聊聊天，但是看她的样子似乎有些冷漠，有些不耐烦。我的心里很不是滋味，但我还是继续保持笑容。\n她永远都不会知道那13朵玫瑰是我送的，正如我永远也不知道送了三年早餐给我的女孩是谁一样。暗恋是一种幸福的寂寞，我相信了，我最终还是没向她表白。\n那些年，我们错过的不是爱情，而是勇气……\n注：本文转自我哥的日志\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E5%AD%A4%E5%8D%95%E5%BF%83%E4%BA%8B-%E6%82%B2%E9%9F%B3%E4%B9%90%E5%B0%8F%E8%AF%B4/","summary":"\u003cp\u003e爱你是孤单的心事，不懂你微笑的意思。\u003c/p\u003e\n\u003cp\u003e                                                   —— 引言\u003c/p\u003e\n\u003cp\u003e     雨下在我窗前，玻璃也在流眼泪，街上的人都看起来比我幸福一点。\u003c/p\u003e\n\u003cp\u003e    我叫林雪，我妈说我出生的时候窗外一片洁白，雪花飞起来的样子很好看，希望我做个洁白、自由、纯净的女子。不负所望，我成为了家人眼中的好孩子，老师眼中的乖学生，同学眼中文静，学习好的女孩子。\u003c/p\u003e\n\u003cp\u003e    即使我集百般宠爱于一身，但我似乎并没有那么快乐，可能我就是雪吧，不喜阳光，注定成不了明媚的女子。\u003c/p\u003e\n\u003cp\u003e    高一那年夏天，我遇见了他。学校的篮球场总有几个酷爱篮球的高挑男生和一堆眼睛泛着微光的女生，她们脚下是几瓶摆放整齐的怡宝。挥汗如雨的他们释放着青春的能量，“啪”的一声，又是一个漂亮的灌篮，接着是女生们花痴的喝彩声，几瓶怡宝迅速地从地板上跃起，受到的拉力过大，以致瓶内泛起几朵漂亮的泡沫，转瞬即逝。\u003c/p\u003e\n\u003cp\u003e    收到怡宝最多的还是他，没有丝毫的意外。低下头，我对旁边的许晴小声说，“那个男生叫什么名字？看起来还挺受欢迎的嘛。”许晴是我同桌兼死党，标准的花痴，她收住眯着眼，嘴角上扬30度的形象，笑着回道，“哎呦，是不是看上隔壁班的程北了，也是，你看他多高挑，还有那灌篮的绝技，一个字，帅，改天介绍你认识认识……”正当她开始犯病时，我抽身边走边说，“去你的，才没有呢。”\u003c/p\u003e\n\u003cp\u003e   “哎，我还没说完呢，你去哪？”\u003c/p\u003e\n\u003cp\u003e   “回教室，看看书，准备考试了。”我泛着微红的脸朝着教室那边走去，“原来他叫程北。”\u003c/p\u003e\n\u003cp\u003e   “你这书呆，小心嫁不出去啦，喂，回下头看呗，程北看着你笑呢……”\u003c/p\u003e\n\u003cp\u003e    操场的嬉笑声渐渐地抽离到真空瓶中，悄悄地摁上瓶塞。回到教室，又是自己一个人，开始拿起书却看不进去，抛物线开口向上，A大于零……脑海里闪过那道抛出篮球优雅弧线的身影。\u003c/p\u003e\n\u003cp\u003e    买早餐的时候渐渐地开始习惯多带一份，趁大家都还没来，悄悄地往隔壁班靠窗第二张桌一放，早餐旁边有本漂亮的笔记本，上面写着：程北。\u003c/p\u003e\n\u003cp\u003e   “哎，林雪，听说每天早晨程北桌上总会有些早餐，真羡慕死他了，怎么就没人给我送呢？”许晴一副深情的模样。\u003c/p\u003e\n\u003cp\u003e    我翻动着书页，若无其事地探问，“是么，他什么反应，吃了没？”\u003c/p\u003e\n\u003cp\u003e   “吃了啊，他说既然是同学的一片心意，就不要辜负了。”\u003c/p\u003e\n\u003cp\u003e    “啪”，重重地合上书本，“真的啊？”\u003c/p\u003e\n\u003cp\u003e   “是啊，喂，你这么激动干嘛，嘿嘿，难不成是你送的？”许晴不怀好意地笑着，听得我头皮发麻。\u003c/p\u003e\n\u003cp\u003e    “怎么可能，我闲着没事做了我。”心里却是扑通扑通地跳着。\u003c/p\u003e\n\u003cp\u003e    “说笑的嘛，这么当真，就算你用刀指着我，我都不会相信，是吧，我的书呆大小姐……哎呦喂，痛……”不等她说完，我的手早已狠狠地扭住她了。\u003c/p\u003e\n\u003cp\u003e     高一下半学期的某一节体育课，那是我们第一次说话。春风微拂，一脸惬意，我和一群女生坐在石凳上看他们男生打球。我的眼光像是GPS定位般捕捉着程北的身影，一直如此。上半场结束，程北抹完汗喝着水，然后突然朝我们这边走来，准确说，是走向我，因为他开始对着我说话了。\u003c/p\u003e\n\u003cp\u003e   “同学，你是林雪吧，经常听说你呢，成绩很不错。”程北微笑着，看得我一脸醉意。\u003c/p\u003e\n\u003cp\u003e   “嗯，还好。程北同学，有事么？”因为紧张，我的声音有点僵，起初想微笑以对的，却一脸紧绷，怎么也挤不出弧线。\u003c/p\u003e\n\u003cp\u003e   “没见过你打篮球，我就是想让你平时多打打，单是一味看书可不行的呐。”\u003c/p\u003e\n\u003cp\u003e   “我不会打篮球的。”还是面无表情。\u003c/p\u003e\n\u003cp\u003e   “哦，可以学啊，要不我教你？”\u003c/p\u003e\n\u003cp\u003e   “其实我对篮球没什么兴趣。”\u003c/p\u003e\n\u003cp\u003e   “好吧，什么时候想学了就来找我，当书呆子可不好呢，我走了。”说完程北微笑着走了，而我却是一脸茫然，我捏了自己的脸，关键时刻掉链子。\u003c/p\u003e\n\u003cp\u003e    下课，我和许晴走在后面，因为我听见前面的女生在说着我的名字。\u003c/p\u003e\n\u003cp\u003e    “哎，你们看见林雪那样子没，书呆子一个，打个篮球都不会，真笑死我了。”\u003c/p\u003e\n\u003cp\u003e    “对嘛，不就是成绩好嘛，有什么了不起的，怪不得程北哥对着她笑，我看得出那是一种嘲笑。”\u003c/p\u003e\n\u003cp\u003e     不论在哪个城市的哪间学校，总有一群说话说得寒酸的女生，像是吃了酸豆角，然后从口中吐出，将锋利的角狠狠地扎进对方的心脏。\u003c/p\u003e\n\u003cp\u003e     我的心脏被狠狠地攥了一把，心痛，不是因为她们尖酸的话语，而是听到自己似乎被他嘲讽，我真的被他讨厌了吗？我不知道。\u003c/p\u003e\n\u003cp\u003e     爱你是孤单的心事，不懂你微笑的意思，只能像一朵向日葵，在夜里默默地坚持。\u003c/p\u003e\n\u003cp\u003e     被特别在乎的人讨厌会很难过，即使只是可能，但更难过的是你必须要装的若无其事。\u003c/p\u003e\n\u003cp\u003e     许晴听得火大，上前推了那两个女生一把，女生回过头恶狠狠吼道，“许晴，你发什么神经？”随即看到我后笑颜微灿，“哦，林雪啊，听说你最近每天都收到13朵玫瑰呀，真是好羡慕啊，真不知哪个男生送的，我想是那个年级第一的眼镜男吧，也挺般配的哦，听说他也不会打篮球耶。”\u003c/p\u003e\n\u003cp\u003e     我扼住心头上的怒火，拉着许晴，“我们走。”\u003c/p\u003e\n\u003cp\u003e     从上个月开始就每天收到13朵玫瑰，许晴说13朵玫瑰的花语是暗恋，我偷偷喜欢你。\u003c/p\u003e\n\u003cp\u003e     每次收到花，心里总会有程北的脸庞闪过，我狠狠摇头，怎么可能是他呢，苦笑。程北，你是我编造的童话故事中的王子，而我只是你生命里一个匆匆的过客吧。\u003c/p\u003e\n\u003cp\u003e     每天早晨，仍然是买两份早餐。直到今年夏天，我们高三毕业。我做的一切都是默默的，有苦有甜，更多的是自己咀嚼心痛。\u003c/p\u003e\n\u003cp\u003e     一直爱着你，用我自己的方式。我最后还是没有说出口。\u003c/p\u003e\n\u003cp\u003e     我喜欢袁湘琴的大胆和执着，但很可惜，我是“沈佳宜”。\u003c/p\u003e\n\u003cp\u003e后记：\u003c/p\u003e\n\u003cp\u003e     你不曾给我一次回眸，我却始终在对你微笑。\u003c/p\u003e\n\u003cp\u003e     我叫程北，我喜欢的女孩叫做林雪，好美的名字，美得有些神圣，以至于我不敢靠得太近。\u003c/p\u003e\n\u003cp\u003e     虽然我的球技还行，但我的成绩却一塌糊涂，我经常对着她笑，但更多时候她总是低下头去，我不清楚她是不是瞧不起我。有时候我看见她和年级第一的男生讨论问题说说笑笑时，心里会有些难受。正如有句话说的，在乎够深的东西，别人碰一下都觉得是抢。有一次我鼓起勇气想找她聊聊天，但是看她的样子似乎有些冷漠，有些不耐烦。我的心里很不是滋味，但我还是继续保持笑容。\u003c/p\u003e\n\u003cp\u003e     她永远都不会知道那13朵玫瑰是我送的，正如我永远也不知道送了三年早餐给我的女孩是谁一样。暗恋是一种幸福的寂寞，我相信了，我最终还是没向她表白。\u003c/p\u003e\n\u003cp\u003e    那些年，我们错过的不是爱情，而是勇气……\u003c/p\u003e\n\u003cp\u003e注：本文转自我哥的日志\u003c/p\u003e","title":"孤单心事——【悲】音乐小说 "},{"content":"有的人一旦被伤害过，即使再怎么后悔也已经无法挽回，也许，我真的就是那个错的人。如果能够让我重新再来一次，我希望我不曾出现在你的生命里。 ——题记\n10月27日，黄昏。\n太阳直射点已经越过赤道，离南回归线还有一段距离。昏黄的光线穿过教室的玻璃，将地面上的影子拉得很长很长，有两道影子凑到一起，似乎在说着悄悄话。\n女孩抬起头，眼神洋溢着笑容，“你是不是喜欢我？”\n似乎所有的光汹涌地扑向男孩，原本健康的古铜色肌肤显得有些红晕，“我..我没有喜欢你。”\n女孩小鼻子微缩，眼神黯淡下来，“你骗一下我都不肯喔。”\n所有的光线开始消失，暮色四合。\n森白的颜色充斥着整个房间，pale。消毒水的气味浓郁得像是要把人体内的氧气统统驱逐出去，占领。\n我翻着她的日记本，清秀的字迹浮想起她那似乎被雕刻过的精致的笑容，看到10月27日那天，久皱的眉头稍稍舒展，苦笑呢喃，“婳婳那时候问的问题啊\u0026hellip;”\n再抬起头看向已在病床上躺了一年的女孩，又恢复了早已成为习惯的皱眉，“医生，这方法有效吗？”\n“只能试试了，你看11月14日那天的日记，写着写着突然就断笔了\u0026hellip;” 我重新翻着有点泛黄的纸张，摩擦的声音透着些许沧桑，戛然而止，11月14日么\u0026hellip;\n字迹依然清秀，还透着些欢愉的灵气：\n“今天是11月14日，快到晚上了，感觉今天过得好慢喔，今晚将是我和他第一次约会。我要穿上他最喜欢的粉色碎花洋裙，稍微化点淡妆\u0026hellip;\n快到八点了，心里有点紧张，我要出去啦，晚上回来再见咯，我的乖乖日记，我会永远记住这一天的，啦啦啦。”\n……\n如果她的心态一直如此，那该有多好，突然看到接下来她平时纤细却有劲的笔迹变得那么苍白无力，像极了天花板上的微尘。 “ 我太笨 明知道你是错的人\n明知道这不是缘分\n但是我还奋不顾身\n可能 在爱里面这样算笨\n可能 永远没有所谓永恒\n但是我 不愿放弃这里面一点点可能\n宁愿笨也不想要悔恨 所以我将自己打扮得漂漂亮亮，可是今晚在天桥的那端，你\u0026hellip;”\n我现在还能看到泛黄的纸上，凸凸凹凹的斑斑点点，想到从你眼中滑落的泪伤心欲绝，想到哽咽的泪滴腐蚀着脆弱的心脏，还有想到那天晚上的我，心里一阵揪痛，婳婳，为什么要那么傻，连解释的机会都没能给我。如果那样的话，也许现在都会不一样。\n“翻开10月27日那天的日记，一切从那里开始吧，”白着头发的医生眼中闪烁着不易察觉的泪光，“那里是她心情开始波动的地方，或许可以改变。但愿她能醒过来”\n希望吧，让我们重新开始。\n我翻开那天的日记，场景慢慢置换，我想起《盗梦空间》，婳婳，请容许我为你造一次梦，在梦里你是最美的新娘。 记忆里陈旧的教室变得清晰，昏黄的光线又开始躁动，现在是黄昏。\n一阵甜美的声音从我后面响起，女孩抬起头，眼神洋溢着笑容，“你是不是喜欢我？”\n我愣了下，好久没看到她如此阳光的笑容了，我的心中堵满了好多情绪，微微抬头，任由光线在我脸庞上跳动，这一次，却没有脸红，“我当然喜欢你呢。”\n女孩也愣了下，随即眼睛一眯，笑得很好看，“是嘛，其实我也知道的呢。”说完嘴角上扬，得意地显示出小小的酒窝，一抹惊艳。\n我的心跳突然变得很快，这一切似乎真的可以改变\u0026hellip;\n之后的时光里，我能感觉到她是幸福的，而在这之前的现实里，我从来没见过她能如此放肆地微笑。在很久很久以后，医生告诉我，在病床上躺着的她，那天突然浅笑了，但是转瞬即逝。\n听说在有流星雨的晚上，向流星许下一个愿望，就能实现，但是如果将愿望说出来了，就不灵了。\n11月14日，我等待已久的这天终于到了。\n婳婳依偎着我，“听说今天晚上有流星雨哦，要不要一起去看嘛。”\n“好啊”\n“那，这算不算我们第一次的约会呢？”狡黠的目光看着我，露出一排洁白的牙齿。\n“这个嘛\u0026hellip;\u0026hellip;”\n“哼，不跟你说了，拜拜，晚上在雨花天桥见咯。”\n雨花天桥是整个城市最受情侣欢迎的地方。\n我望着她渐行渐远的身影，一切发生得和去年一样。但是不知怎么，总觉得有不安分的因子在身体里躁动。\n暮色四合，晚上7点多，换上简单的运动服后，我也准备出门了。这时我的手机响了，是一条婳婳的闺蜜赵梦发来的短信：\n“林杰，我有一件事要对你说，很重要很重要，你一定要来，8点钟，雨花天桥见。”\n我摁着手机键盘，屏幕上跳动着“删除”的彩色字，我笑了，这一次，我不会再错过你了，婳婳。\n记忆穿梭到一年前的这天晚上。\n“哎，我家婳婳以后就是你的了，这手链不要也得要，给她戴上。”我和赵梦拉扯着。\n我想放开手，“太贵重了，我不能要啊”，赵梦扔不放手，狠狠地塞给我，“这可不行，你以后要是愧对她，我可不饶你。”\n“我发誓，我会永远和她在一起的。”就在远处的我说完后，一道流星闪过。\n……\n赵梦说这是她这一辈子做的最后悔的事，当初就不该那样做的。\n“好吧，赵梦，今晚你不会有遗憾了，但你得自己一个人呆在另一边了，对不起了。”\n如期的8点，天下着微光小雨，我远远就看到了正准备走到天桥的婳婳，她撑着把红色小伞，穿着碎花洋裙，化着点淡妆，眼睛看向另一边。我跑了过去，“婳婳，看什么，我在这呢。\n”\n跑过去准备拥抱她的时候，我穿过了她，仿佛我透明了一般。\n然后看着她长长的睫毛下，一双眼睛呆呆地看着天桥的另一端。\n脑子像是被突然抽掉了氧气，一片空白。我定格住身子，不能动弹，眼睛挣得很大，另一个我似乎在跟赵梦牵着手，边走边笑，“哎，我家婳婳以后就是你的了，这手链不要也得要，给她戴上。”我和赵梦拉扯着。\n我想放开手，“太贵重了，我不能要啊”，赵梦扔不放手，狠狠地塞给我，“这可不行，你以后要是愧对她，我可不饶你。”\n“我发誓，我会永远和她在一起的。”就在远处的我说完后，一道流星闪过。\n“婳婳，我在这”，真正的我颤抖着的手迅速伸向她的黯然的面容，依然穿透。 而她依然呆呆地望着远处。\n这是一个无法挽救与弥补的时刻。\n只能看着她丢下伞，掩面小跑着消失在雨中。\n有些人有些事，错过了便是错过了，你再怎么想要挽回，也没有什么用了，也许最美的爱情，只能在回忆里待续\u0026hellip;\u0026hellip;\n还是那个黄昏。\n女孩抬起头，眼神洋溢着笑容，“你是不是喜欢我？”\n依然是略带羞涩的男孩，“我..我没有喜欢你”。\n女孩小鼻子微皱，眼神黯淡下来“你骗一下我都不肯喔”。 注：本文转自我哥的日志\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E9%94%99%E7%9A%84%E4%BA%BA-%E6%82%B2%E9%9F%B3%E4%B9%90%E5%B0%8F%E8%AF%B4/","summary":"\u003cp\u003e有的人一旦被伤害过，即使再怎么后悔也已经无法挽回，也许，我真的就是那个错的人。如果能够让我重新再来一次，我希望我不曾出现在你的生命里。                                                                                                                                                                                        ——题记\u003cbr\u003e\n     10月27日，黄昏。\u003cbr\u003e\n     太阳直射点已经越过赤道，离南回归线还有一段距离。昏黄的光线穿过教室的玻璃，将地面上的影子拉得很长很长，有两道影子凑到一起，似乎在说着悄悄话。\u003cbr\u003e\n     女孩抬起头，眼神洋溢着笑容，“你是不是喜欢我？”\u003cbr\u003e\n     似乎所有的光汹涌地扑向男孩，原本健康的古铜色肌肤显得有些红晕，“我..我没有喜欢你。”\u003cbr\u003e\n     女孩小鼻子微缩，眼神黯淡下来，“你骗一下我都不肯喔。”\u003cbr\u003e\n     所有的光线开始消失，暮色四合。\u003cbr\u003e\n     森白的颜色充斥着整个房间，pale。消毒水的气味浓郁得像是要把人体内的氧气统统驱逐出去，占领。\u003cbr\u003e\n     我翻着她的日记本，清秀的字迹浮想起她那似乎被雕刻过的精致的笑容，看到10月27日那天，久皱的眉头稍稍舒展，苦笑呢喃，“婳婳那时候问的问题啊\u0026hellip;”\u003cbr\u003e\n     再抬起头看向已在病床上躺了一年的女孩，又恢复了早已成为习惯的皱眉，“医生，这方法有效吗？”\u003cbr\u003e\n     “只能试试了，你看11月14日那天的日记，写着写着突然就断笔了\u0026hellip;” \u003cbr\u003e\n     我重新翻着有点泛黄的纸张，摩擦的声音透着些许沧桑，戛然而止，11月14日么\u0026hellip;\u003cbr\u003e\n     字迹依然清秀，还透着些欢愉的灵气：\u003cbr\u003e\n     “今天是11月14日，快到晚上了，感觉今天过得好慢喔，今晚将是我和他第一次约会。我要穿上他最喜欢的粉色碎花洋裙，稍微化点淡妆\u0026hellip;\u003cbr\u003e\n     快到八点了，心里有点紧张，我要出去啦，晚上回来再见咯，我的乖乖日记，我会永远记住这一天的，啦\u003cdel\u003e啦\u003c/del\u003e啦。”\u003cbr\u003e\n     ……\u003cbr\u003e\n     如果她的心态一直如此，那该有多好，突然看到接下来她平时纤细却有劲的笔迹变得那么苍白无力，像极了天花板上的微尘。     “ 我太笨 明知道你是错的人\u003cbr\u003e\n    明知道这不是缘分\u003cbr\u003e\n　  但是我还奋不顾身\u003cbr\u003e\n　  可能 在爱里面这样算笨\u003cbr\u003e\n　  可能 永远没有所谓永恒\u003cbr\u003e\n　  但是我 不愿放弃这里面一点点可能\u003cbr\u003e\n　  宁愿笨也不想要悔恨         所以我将自己打扮得漂漂亮亮，可是今晚在天桥的那端，你\u0026hellip;”\u003cbr\u003e\n      我现在还能看到泛黄的纸上，凸凸凹凹的斑斑点点，想到从你眼中滑落的泪伤心欲绝，想到哽咽的泪滴腐蚀着脆弱的心脏，还有想到那天晚上的我，心里一阵揪痛，婳婳，为什么要那么傻，连解释的机会都没能给我。如果那样的话，也许现在都会不一样。\u003cbr\u003e\n     “翻开10月27日那天的日记，一切从那里开始吧，”白着头发的医生眼中闪烁着不易察觉的泪光，“那里是她心情开始波动的地方，或许可以改变。但愿她能醒过来”\u003cbr\u003e\n     希望吧，让我们重新开始。\u003cbr\u003e\n     我翻开那天的日记，场景慢慢置换，我想起《盗梦空间》，婳婳，请容许我为你造一次梦，在梦里你是最美的新娘。         记忆里陈旧的教室变得清晰，昏黄的光线又开始躁动，现在是黄昏。\u003cbr\u003e\n     一阵甜美的声音从我后面响起，女孩抬起头，眼神洋溢着笑容，“你是不是喜欢我？”\u003cbr\u003e\n    我愣了下，好久没看到她如此阳光的笑容了，我的心中堵满了好多情绪，微微抬头，任由光线在我脸庞上跳动，这一次，却没有脸红，“我当然喜欢你呢。”\u003cbr\u003e\n    女孩也愣了下，随即眼睛一眯，笑得很好看，“是嘛，其实我也知道的呢。”说完嘴角上扬，得意地显示出小小的酒窝，一抹惊艳。\u003cbr\u003e\n    我的心跳突然变得很快，这一切似乎真的可以改变\u0026hellip;\u003cbr\u003e\n    之后的时光里，我能感觉到她是幸福的，而在这之前的现实里，我从来没见过她能如此放肆地微笑。在很久很久以后，医生告诉我，在病床上躺着的她，那天突然浅笑了，但是转瞬即逝。\u003cbr\u003e\n    听说在有流星雨的晚上，向流星许下一个愿望，就能实现，但是如果将愿望说出来了，就不灵了。\u003cbr\u003e\n    11月14日，我等待已久的这天终于到了。\u003cbr\u003e\n    婳婳依偎着我，“听说今天晚上有流星雨哦，要不要一起去看嘛。”\u003cbr\u003e\n    “好啊”\u003cbr\u003e\n    “那，这算不算我们第一次的约会呢？”狡黠的目光看着我，露出一排洁白的牙齿。\u003cbr\u003e\n    “这个嘛\u0026hellip;\u0026hellip;”\u003cbr\u003e\n    “哼，不跟你说了，拜拜，晚上在雨花天桥见咯。”\u003cbr\u003e\n     雨花天桥是整个城市最受情侣欢迎的地方。\u003cbr\u003e\n     我望着她渐行渐远的身影，一切发生得和去年一样。但是不知怎么，总觉得有不安分的因子在身体里躁动。\u003cbr\u003e\n     暮色四合，晚上7点多，换上简单的运动服后，我也准备出门了。这时我的手机响了，是一条婳婳的闺蜜赵梦发来的短信：\u003cbr\u003e\n    “林杰，我有一件事要对你说，很重要很重要，你一定要来，8点钟，雨花天桥见。”\u003cbr\u003e\n     我摁着手机键盘，屏幕上跳动着“删除”的彩色字，我笑了，这一次，我不会再错过你了，婳婳。\u003c/p\u003e\n\u003cp\u003e     记忆穿梭到一年前的这天晚上。\u003cbr\u003e\n     “哎，我家婳婳以后就是你的了，这手链不要也得要，给她戴上。”我和赵梦拉扯着。\u003cbr\u003e\n     我想放开手，“太贵重了，我不能要啊”，赵梦扔不放手，狠狠地塞给我，“这可不行，你以后要是愧对她，我可不饶你。”\u003cbr\u003e\n    “我发誓，我会永远和她在一起的。”就在远处的我说完后，一道流星闪过。\u003cbr\u003e\n       ……\u003cbr\u003e\n     赵梦说这是她这一辈子做的最后悔的事，当初就不该那样做的。\u003cbr\u003e\n    “好吧，赵梦，今晚你不会有遗憾了，但你得自己一个人呆在另一边了，对不起了。”\u003c/p\u003e\n\u003cp\u003e    如期的8点，天下着微光小雨，我远远就看到了正准备走到天桥的婳婳，她撑着把红色小伞，穿着碎花洋裙，化着点淡妆，眼睛看向另一边。我跑了过去，“婳婳，看什么，我在这呢。\u003c/p\u003e\n\u003cp\u003e”\u003cbr\u003e\n    跑过去准备拥抱她的时候，我穿过了她，仿佛我透明了一般。\u003cbr\u003e\n    然后看着她长长的睫毛下，一双眼睛呆呆地看着天桥的另一端。\u003cbr\u003e\n    脑子像是被突然抽掉了氧气，一片空白。我定格住身子，不能动弹，眼睛挣得很大，另一个我似乎在跟赵梦牵着手，边走边笑，“哎，我家婳婳以后就是你的了，这手链不要也得要，给她戴上。”我和赵梦拉扯着。\u003cbr\u003e\n    我想放开手，“太贵重了，我不能要啊”，赵梦扔不放手，狠狠地塞给我，“这可不行，你以后要是愧对她，我可不饶你。”\u003cbr\u003e\n    “我发誓，我会永远和她在一起的。”就在远处的我说完后，一道流星闪过。\u003cbr\u003e\n    “婳婳，我在这”，真正的我颤抖着的手迅速伸向她的黯然的面容，依然穿透。 \u003cbr\u003e\n 而她依然呆呆地望着远处。\u003cbr\u003e\n     这是一个无法挽救与弥补的时刻。\u003cbr\u003e\n     只能看着她丢下伞，掩面小跑着消失在雨中。\u003cbr\u003e\n     有些人有些事，错过了便是错过了，你再怎么想要挽回，也没有什么用了，也许最美的爱情，只能在回忆里待续\u0026hellip;\u0026hellip;\u003c/p\u003e","title":"错的人——【悲】音乐小说"},{"content":"再陪我看一次，你爱我的时候，慢动作重播，我们的步伐相同，一步接一步跟著浪漫转动，让甜蜜充满这星球。\n——题记 上海是个快节奏的城市，而我喜欢它。\n别误会了，这并不是因为它的快 ，而是因为上海是各种名特小吃荟萃的地方，它的口味，既不同于粤港地区的纯甜味，也有别于四川、重庆的麻辣味，而是以清淡、鲜美、可口著称。\n被你猜对了，不过没有糖果哦，我就是一吃货，但是世界上有哪个女孩不爱吃呢？嗯\u0026hellip;我叫伊依，但还是叫我小伊吧，大家都这么熟了，就这样子叫吧。\n此时我看见一个手撑透明雨伞，穿着蓝色牛仔裤，踏着白色球鞋的女孩气质轩昂地朝前走，嗯？她的样子怎么越看越像我？等等，天哪，原来我在低头看着雨水形成的镜子。\n好吧，你一定以为我有点神经质，其实我的成绩在我们年级排第二呢，可能智商高的人难免会神经质的，就像那个年级第一的家伙，老是冲着我笑，都不知道笑什么，难道我脸上长麻花了？\n我的目的地是天秘一中，也就是我的学校，但是我们一般都叫它甜蜜一中，谁叫它一点神秘的气息都没有呢，而且一眼望去，成双成对的校园情侣，“俯拾皆是”，我能用这个词吗？哎，管他呢，词不在准，能用就行。\n现在正值初夏，雨说停就停了，我刚把雨伞合上就感到头上一片凉意，不用看都知道啦，肯定是该死的樟树树叶，地上的落叶都撒了一地。正当我想要把头上的树叶盘干净时，“咔嚓”一声，接着是傻笑的声音统统钻进我的耳朵，没错，就是那个年级第一的家伙，他叫林雷，别看他平时大大咧咧，做的事雷人，但是他的成绩可是没话说的，而且打棒球打得很好，人嘛，也还长得挺帅的，停——我怎么可以帮他说好话呢？\n“咳咳，林雷，你拿着相机是要干什么？给我看看”说着就要一把夺过他手中精致的相机。\n“你也知道我是个摄影控嘛，看到好看的东西当然要拍下来咯。”林雷嘻笑着说。\n啧啧，真难得林雷会夸人，“是嘛，你是说我好看咯？”我眼睛直盯着他，嘴角微微上扬着。\n“不要误会，谁说你好看了，准确的说是你头上顶着那些东西好看。”林雷一副一本正经的样子，不熟悉他的人还以为我欺负他了。\n“是嘛？你是说我不好看了？”我的嘴角继续上扬，笑着看着他。熟悉我的人都知道这是个危险的信号。显然，林雷熟悉我，。\n林雷的脸一抖，一拍胸膛，“谁说你不好看了，很好看啊，我先走了哈。”说完二话不说溜得比金宝三还要快。可是还没等到我来得及得意微笑的时候，远方传来一个听了就恨不得封了他口的声音，“好-看-是-好-看-啦-，就-是-丑-了-点。”最恨的是说完不算，还要加上这几个字，“知-道-不-，小-伊-。”\n我认输，现在全校的人都知道了。\n其实我就一直没赢过他，当然，这要除了下个星期的月考外。\n时间直接跳跃到下个星期的某一天下午，“喂，小伊，你一直都没赢过我嘛，这么弱。”又是林雷那个欠揍的声音。\n我一听就火了，“林雷啊，很嚣张了嘛，明天不是月考么，咱么比比呀，小伊我就不信比不过你那大懒虫了。”说完把书狠狠砸了下林雷。\n“痛，不要这么暴力嘛，比就比，赌注是什么？”\n“要是我输了，就帮你这个大懒虫扫一个学期的课室，要是我赢了，你就做我男朋友。怎么样？”我双手插腰，不顾形象地说道。\n“什么？做你男朋友，啧啧，原来你早就喜欢我了啊，我还真没发现，哎，我都不好意思了。放心，你的愿望会落空了，因为赢的人是我”\n“林雷啊，别把话说得太满了，我什么时候说喜欢你了，等我赢了，你只有做男朋友的义务，但是没有做男朋友的权利，到时你还不是任由我驱使？哼哼，别太小看我小伊。”\n林雷咽了咽口水，“算你狠。”\n任何事都有出现奇迹的时候，更何况，甜蜜一中，从来就不缺奇迹。\n就像我之前说的，我赢了，不要怀疑你的眼睛，你没看错，我-赢-了。\n虽然，在很久以后，我从朋友那里知道了是林雷故意输给我的，但是我一开始就知道了。\n“林雷男朋友，我渴了，去帮我买一瓶水来。”我将声音拉得悠长，好像唯恐全班人听不到。\n林雷无力地说，“小伊啊，能把那男朋友三个字去掉么，听着你就不嫌别扭，买水嘛，我去就是了。”\n“听话呀，乖。”我坐在椅子上挥手，犹如一个胜利归来的女王。\n就在林雷买水的时候，我的前桌李颖回过头来，似笑非笑，“小伊呀，你是不是喜欢上林雷了？”\n我的眼睛挣得大大的，用手伸向李颖摸着她的额头，“你是不是发烧了，不是和你说过了吗，他只有男朋友的义务，就我的跟班啊，更何况他长得又不是非常帅，人又坏又懒，又不讲卫生，更可恶的是，他经常弄得我很尴尬，我每天都得骂上他十句。”\n李颖笑着摇了摇头，然后故作深沉的说，“当一个女人的嘴里反复出现一个男人的名字的时候，无论是夸那个男人还是骂那个男人，潜台词都是：‘我爱他’。嘿嘿，小伊，你懂么？”\n我的脸霎时红了，刚又想说李雷的缺点，但是她刚才的话还萦绕在我耳边。于是我转回身来，弱弱地说，“才没有呢，不和你玩了，欺负我。”\n那天下午放学本来是叫他骑车送我回去的，但是不知怎么的，我就自己一个人回去了。\n似乎当有人告诉你，你喜欢一个人的时候，你总会不自觉的就逃避那个人，更郁闷的是，你不知道那个人喜不喜欢你。\n那天晚上，我收到了林雷发来的短信，“小伊，我站在学校的巷子口，大概等了几个钟头，可还是没见到任何你的影子经过，我有点失落。”\n我没有回他，第二天早上去上课，走着走着我看到林雷在我前面，样子似乎有点失落。于是我鼓起勇气，走到他的身后拍他肩膀，他回过头，我的脸蛋有点绯红，轻轻地说了一声，“对不起，我喜欢你。”接着是林雷呆滞的表情，“没开玩笑吧，小伊。”\n“没呢，明天周六喔，你一定要请我去看《小时代》，拜拜。”说完我悻悻地走了。只留下林雷在一旁饶着头，接着听到林雷大喝一声，“耶稣上帝如来佛，万岁。”听到后我也噗嗤一声笑了。\n以后的日子，林雷总是拿着他的DV，他说要把我们的生活都记录下来。\n“小伊呀，真羡慕你，你家林雷那么浪漫，要不把他让给我吧！”一个女生打趣道。\n“去去去，别取笑我啦，他那么笨的人，哪里懂浪漫。”正当我还在想损损林雷的时候，他走了过来，“小伊，你刚才是说我什么么？”\n我马上止住口，偎依向他的肩膀，“没有啦，亲爱的，我说你很好很好啊。”说完含情脉脉的望着他。\n“哎呦喂，不要这么肉麻……”\n“不行么？”打断他的话，我的手轻轻扭着他。\n“痛\u0026hellip;行，行。”\n“这还差不多嘛\u0026hellip;.”\n“走，咱们去吃三鲜小馄饨。”\n“不要，我要吃开洋葱油拌面。”\n“走啦\u0026hellip;\u0026hellip;”\n以上我描述的这些画面几乎都被林雷用DV拍到了，我现在都不知道他是怎么拍的，他也不肯说，但是我总喜欢让他陪我看。。\n我凑到林雷的耳边呢喃，“再陪我看一次你爱我的时候嘛。但是这次看完你要写一封情书给我，你都没写过。”\n就这样子我们看了好多遍，第二天我收到林雷写来的情书，或者说是诗，看了后，我深深地笑了：\n再陪我看一次 你爱我的时候\n慢动作重播 我们的步伐相同\n一步接一步跟著浪漫转动　让甜密充满这星球\n河堤上只坐着你和我 夕阳照着你脸红红\n害羞影子随光线慢慢向我靠拢\n将手中那个青苹果 画上要给你的笑容　酸甜的传递说不出的心动\n沁凉的微风 你发梢摆动\n幸福气味将我紧拥　好想在这一刻留下些什么\n你是否与我相同\n再陪我看一次 你爱我的时候　慢动作重播 你嘴角浅浅温柔\n泡泡上的影子 倒映著你和我\n让所有幸福都升空\n我爱你\n林雷\n注：本文转自我哥的日志\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E5%86%8D%E9%99%AA%E6%88%91%E7%9C%8B%E4%B8%80%E6%AC%A1-%E5%96%9C%E9%9F%B3%E4%B9%90%E5%B0%8F%E8%AF%B4/","summary":"\u003cp\u003e再陪我看一次，你爱我的时候，慢动作重播，我们的步伐相同，一步接一步跟著浪漫转动，让甜蜜充满这星球。\u003c/p\u003e\n\u003cp\u003e                                                                                                                                                                           ——题记  \u003c/p\u003e\n\u003cp\u003e       上海是个快节奏的城市，而我喜欢它。\u003c/p\u003e\n\u003cp\u003e       别误会了，这并不是因为它的快 ，而是因为上海是各种名特小吃荟萃的地方，它的口味，既不同于粤港地区的纯甜味，也有别于四川、重庆的麻辣味，而是以清淡、鲜美、可口著称。\u003c/p\u003e\n\u003cp\u003e       被你猜对了，不过没有糖果哦，我就是一吃货，但是世界上有哪个女孩不爱吃呢？嗯\u0026hellip;我叫伊依，但还是叫我小伊吧，大家都这么熟了，就这样子叫吧。\u003c/p\u003e\n\u003cp\u003e       此时我看见一个手撑透明雨伞，穿着蓝色牛仔裤，踏着白色球鞋的女孩气质轩昂地朝前走，嗯？她的样子怎么越看越像我？等等，天哪，原来我在低头看着雨水形成的镜子。\u003c/p\u003e\n\u003cp\u003e       好吧，你一定以为我有点神经质，其实我的成绩在我们年级排第二呢，可能智商高的人难免会神经质的，就像那个年级第一的家伙，老是冲着我笑，都不知道笑什么，难道我脸上长麻花了？\u003c/p\u003e\n\u003cp\u003e       我的目的地是天秘一中，也就是我的学校，但是我们一般都叫它甜蜜一中，谁叫它一点神秘的气息都没有呢，而且一眼望去，成双成对的校园情侣，“俯拾皆是”，我能用这个词吗？哎，管他呢，词不在准，能用就行。\u003c/p\u003e\n\u003cp\u003e       现在正值初夏，雨说停就停了，我刚把雨伞合上就感到头上一片凉意，不用看都知道啦，肯定是该死的樟树树叶，地上的落叶都撒了一地。正当我想要把头上的树叶盘干净时，“咔嚓”一声，接着是傻笑的声音统统钻进我的耳朵，没错，就是那个年级第一的家伙，他叫林雷，别看他平时大大咧咧，做的事雷人，但是他的成绩可是没话说的，而且打棒球打得很好，人嘛，也还长得挺帅的，停——我怎么可以帮他说好话呢？\u003c/p\u003e\n\u003cp\u003e         “咳咳，林雷，你拿着相机是要干什么？给我看看”说着就要一把夺过他手中精致的相机。\u003c/p\u003e\n\u003cp\u003e         “你也知道我是个摄影控嘛，看到好看的东西当然要拍下来咯。”林雷嘻笑着说。\u003c/p\u003e\n\u003cp\u003e          啧啧，真难得林雷会夸人，“是嘛，你是说我好看咯？”我眼睛直盯着他，嘴角微微上扬着。\u003c/p\u003e\n\u003cp\u003e         “不要误会，谁说你好看了，准确的说是你头上顶着那些东西好看。”林雷一副一本正经的样子，不熟悉他的人还以为我欺负他了。\u003c/p\u003e\n\u003cp\u003e         “是嘛？你是说我不好看了？”我的嘴角继续上扬，笑着看着他。熟悉我的人都知道这是个危险的信号。显然，林雷熟悉我，。\u003c/p\u003e\n\u003cp\u003e         林雷的脸一抖，一拍胸膛，“谁说你不好看了，很好看啊，我先走了哈。”说完二话不说溜得比金宝三还要快。可是还没等到我来得及得意微笑的时候，远方传来一个听了就恨不得封了他口的声音，“好-看-是-好-看-啦-，就-是-丑-了-点。”最恨的是说完不算，还要加上这几个字，“知-道-不-，小-伊-。”\u003c/p\u003e\n\u003cp\u003e         我认输，现在全校的人都知道了。\u003c/p\u003e\n\u003cp\u003e         其实我就一直没赢过他，当然，这要除了下个星期的月考外。\u003c/p\u003e\n\u003cp\u003e         时间直接跳跃到下个星期的某一天下午，“喂，小伊，你一直都没赢过我嘛，这么弱。”又是林雷那个欠揍的声音。\u003c/p\u003e\n\u003cp\u003e        我一听就火了，“林雷啊，很嚣张了嘛，明天不是月考么，咱么比比呀，小伊我就不信比不过你那大懒虫了。”说完把书狠狠砸了下林雷。\u003c/p\u003e\n\u003cp\u003e       “痛，不要这么暴力嘛，比就比，赌注是什么？”\u003c/p\u003e\n\u003cp\u003e       “要是我输了，就帮你这个大懒虫扫一个学期的课室，要是我赢了，你就做我男朋友。怎么样？”我双手插腰，不顾形象地说道。\u003c/p\u003e\n\u003cp\u003e       “什么？做你男朋友，啧啧，原来你早就喜欢我了啊，我还真没发现，哎，我都不好意思了。放心，你的愿望会落空了，因为赢的人是我”\u003c/p\u003e\n\u003cp\u003e        “林雷啊，别把话说得太满了，我什么时候说喜欢你了，等我赢了，你只有做男朋友的义务，但是没有做男朋友的权利，到时你还不是任由我驱使？哼哼，别太小看我小伊。”\u003c/p\u003e\n\u003cp\u003e         林雷咽了咽口水，“算你狠。”\u003c/p\u003e\n\u003cp\u003e         任何事都有出现奇迹的时候，更何况，甜蜜一中，从来就不缺奇迹。\u003c/p\u003e\n\u003cp\u003e         就像我之前说的，我赢了，不要怀疑你的眼睛，你没看错，我-赢-了。\u003c/p\u003e\n\u003cp\u003e         虽然，在很久以后，我从朋友那里知道了是林雷故意输给我的，但是我一开始就知道了。\u003c/p\u003e\n\u003cp\u003e        “林雷男朋友，我渴了，去帮我买一瓶水来。”我将声音拉得悠长，好像唯恐全班人听不到。\u003c/p\u003e\n\u003cp\u003e         林雷无力地说，“小伊啊，能把那男朋友三个字去掉么，听着你就不嫌别扭，买水嘛，我去就是了。”\u003c/p\u003e\n\u003cp\u003e        “听话呀，乖。”我坐在椅子上挥手，犹如一个胜利归来的女王。\u003c/p\u003e\n\u003cp\u003e         就在林雷买水的时候，我的前桌李颖回过头来，似笑非笑，“小伊呀，你是不是喜欢上林雷了？”\u003c/p\u003e\n\u003cp\u003e         我的眼睛挣得大大的，用手伸向李颖摸着她的额头，“你是不是发烧了，不是和你说过了吗，他只有男朋友的义务，就我的跟班啊，更何况他长得又不是非常帅，人又坏又懒，又不讲卫生，更可恶的是，他经常弄得我很尴尬，我每天都得骂上他十句。”\u003c/p\u003e\n\u003cp\u003e         李颖笑着摇了摇头，然后故作深沉的说，“当一个女人的嘴里反复出现一个男人的名字的时候，无论是夸那个男人还是骂那个男人，潜台词都是：‘我爱他’。嘿嘿，小伊，你懂么？”\u003c/p\u003e\n\u003cp\u003e         我的脸霎时红了，刚又想说李雷的缺点，但是她刚才的话还萦绕在我耳边。于是我转回身来，弱弱地说，“才没有呢，不和你玩了，欺负我。”\u003c/p\u003e\n\u003cp\u003e         那天下午放学本来是叫他骑车送我回去的，但是不知怎么的，我就自己一个人回去了。\u003c/p\u003e\n\u003cp\u003e         似乎当有人告诉你，你喜欢一个人的时候，你总会不自觉的就逃避那个人，更郁闷的是，你不知道那个人喜不喜欢你。\u003c/p\u003e\n\u003cp\u003e         那天晚上，我收到了林雷发来的短信，“小伊，我站在学校的巷子口，大概等了几个钟头，可还是没见到任何你的影子经过，我有点失落。”\u003c/p\u003e\n\u003cp\u003e         我没有回他，第二天早上去上课，走着走着我看到林雷在我前面，样子似乎有点失落。于是我鼓起勇气，走到他的身后拍他肩膀，他回过头，我的脸蛋有点绯红，轻轻地说了一声，“对不起，我喜欢你。”接着是林雷呆滞的表情，“没开玩笑吧，小伊。”\u003c/p\u003e\n\u003cp\u003e        “没呢，明天周六喔，你一定要请我去看《小时代》，拜拜。”说完我悻悻地走了。只留下林雷在一旁饶着头，接着听到林雷大喝一声，“耶稣上帝如来佛，万岁。”听到后我也噗嗤一声笑了。\u003c/p\u003e\n\u003cp\u003e          以后的日子，林雷总是拿着他的DV，他说要把我们的生活都记录下来。\u003c/p\u003e\n\u003cp\u003e        “小伊呀，真羡慕你，你家林雷那么浪漫，要不把他让给我吧！”一个女生打趣道。\u003c/p\u003e\n\u003cp\u003e         “去去去，别取笑我啦，他那么笨的人，哪里懂浪漫。”正当我还在想损损林雷的时候，他走了过来，“小伊，你刚才是说我什么么？”\u003c/p\u003e\n\u003cp\u003e            我马上止住口，偎依向他的肩膀，“没有啦，亲爱的，我说你很好很好啊。”说完含情脉脉的望着他。\u003c/p\u003e\n\u003cp\u003e          “哎呦喂，不要这么肉麻……”\u003c/p\u003e\n\u003cp\u003e          “不行么？”打断他的话，我的手轻轻扭着他。\u003c/p\u003e\n\u003cp\u003e          “痛\u0026hellip;行，行。”\u003c/p\u003e\n\u003cp\u003e          “这还差不多嘛\u0026hellip;.”\u003c/p\u003e\n\u003cp\u003e          “走，咱们去吃三鲜小馄饨。”\u003c/p\u003e\n\u003cp\u003e          “不要，我要吃开洋葱油拌面。”\u003c/p\u003e\n\u003cp\u003e          “走啦\u0026hellip;\u0026hellip;”\u003c/p\u003e\n\u003cp\u003e          以上我描述的这些画面几乎都被林雷用DV拍到了，我现在都不知道他是怎么拍的，他也不肯说，但是我总喜欢让他陪我看。。\u003c/p\u003e\n\u003cp\u003e          我凑到林雷的耳边呢喃，“再陪我看一次你爱我的时候嘛。但是这次看完你要写一封情书给我，你都没写过。”\u003c/p\u003e\n\u003cp\u003e          就这样子我们看了好多遍，第二天我收到林雷写来的情书，或者说是诗，看了后，我深深地笑了：\u003c/p\u003e\n\u003cp\u003e               再陪我看一次 你爱我的时候\u003c/p\u003e\n\u003cp\u003e               慢动作重播 我们的步伐相同\u003c/p\u003e\n\u003cp\u003e               一步接一步跟著浪漫转动　\u003c/p\u003e\n\u003cp\u003e               让甜密充满这星球\u003c/p\u003e\n\u003cp\u003e               河堤上只坐着你和我 夕阳照着你脸红红\u003c/p\u003e\n\u003cp\u003e               害羞影子随光线慢慢向我靠拢\u003c/p\u003e\n\u003cp\u003e               将手中那个青苹果 画上要给你的笑容　\u003c/p\u003e\n\u003cp\u003e               酸甜的传递说不出的心动\u003c/p\u003e\n\u003cp\u003e               沁凉的微风 你发梢摆动\u003c/p\u003e\n\u003cp\u003e               幸福气味将我紧拥　\u003c/p\u003e\n\u003cp\u003e               好想在这一刻留下些什么\u003c/p\u003e","title":"再陪我看一次——【喜】音乐小说"},{"content":"人生中总会遇到一个不懂爱的，等你懂了的时候我也不敢爱了。\n——题记\n我看球赛看了三年，很努力地学习了三年，和林雪坐了三年。 只因，我喜欢你，喜欢了三年。\n我们总会在未来遇到一个属于自己对的人。也许现在的我正错过你，也许现在的你正错过我。可无论现在如何错过，对的人依然会在未来相遇。再见了，程北。\n在黄昏时刻，一个背着双肩背包的女孩拖着装满回忆的旅行箱缓慢走向机场，一滴泪狠狠砸在光滑的地板上，四溅碎裂开来，从眼中滑落的泪伤心欲绝，昏暗中有种热泪烧伤的错觉，许晴回过头看了一眼黄昏的地平线，转身离开，消失在人海\u0026hellip;\u0026hellip;\n在许晴的大脑神经中枢的刺激下，想念若隐若现。\n很早就注意到他了，篮球场上的健将，女生心目中的王子。在那个青春羞涩的年华里不知勾走了多少女生的心魂，包括许晴。每次看到他打球，装成一副花痴的模样，这个样子不知被同桌林雪说教了多少遍。\n“咳咳，许晴，注意点形象嘛。他叫什么名字？”林雪板着脸看着旁边张大着嘴的女生。“还有，你的口水不要流到我的肩膀上来了。”\n许晴迅速收拢，拿起纸巾擦了下嘴，想到之前程北吩咐过她的话，眼神持续了0.5秒的黯然，笑着回道，“哎呦，你是不是也看上隔壁班的程北了，也是，你看他多高挑，还有那灌篮的绝技，一个字，帅，改天介绍你认识认识……”\n“才没有呢，我走啦，看书去。”\n听到这句话后，心里有些为程北伤心，但是自己却是有些开心，这种矛盾的心理，连自己都觉得恶心。爱情是残酷的，是自私的，但是为何自己却自私不起来。就像是一只树梢上温饱的乌鸦，有一天看到一个昏迷的路人，于是把剩下的一点食物给他，这样的自己，应该可以归根为傻，但是又怎样呢，傻都傻了，那就这样下去吧，也许自私会更好，但是看到程北不开心，自己也会不开心。\n许晴看着湛蓝的天空，的眼睛出现了点微光，怪只怪自己喜欢上了他吧，我不是找不到更好的，只是因为已经有了你，再好的我都不想要。\n看着篮球场上不断跳动的程北，许晴微微地笑了。\n你就是犯贱，犯贱\u0026hellip;犯贱\u0026hellip;..\n《犯贱》么，一直很喜欢这首歌的吧。\n但是又有什么关系了呢？我没有想过以后会怎样，只是想着喜欢了，那就喜欢下去吧，青春是杯诱人的葡萄酒，即使里面装满了毒药，也会情不自禁地灌下肚，我们都太年轻，面对迷人的风景时，总是不自觉地就向前踏去，义无反顾。\n你有没有经历过，听着自己喜欢的人说他喜欢的人的名字。\n你有没有经历过，看着自己喜欢的人提到他喜欢的人时微笑的神情。\n你有没有经历过，当你想对他说我爱你的时候，他却说了声，我爱她。\n你有没有经历过，当你喜欢的人把玫瑰递给你，你很兴奋地想要收下，然后他说了句，帮我交给她。\n……\n在放学的某一天，许晴收到程北的短信，叫自己明天早晨早点到外面的小巷来，那天晚上是她这几年来第一次失眠，他找自己干什么呢，他想对自己说什么？偷偷爬起床，悄悄拿到妈妈的香水喷了下，然后想到似乎他不喜欢香水味道，起码在林雪身上就从没闻到过。于是又到浴室重新洗了澡，冲洗掉身上氤氲的香水味……\n天微亮，许晴早早地起了身，刷牙洗脸的时间比往常久了点。\n现实往往没有想象的美好，而在女生的世界里，往往充斥着童话式的色彩，似乎生命里总有一个白马王子等待着自己，但却是忘了，自己也许只是个丢了水晶鞋的灰姑娘，那个王子注定就不属于自己。\n小巷里，男生打破了沉静，“许晴，你也知道我喜欢谁是吧。”说完递过精心扎好的玫瑰花束给她。许晴接过来，脸色微红，“嗯\u0026hellip;谁啊？”他喜欢林雪吧，可是他送花给我啊。\n“你同桌林雪啊，你不是知道吗？”\n听到后手中的玫瑰差点掉下去，“其实我喜欢你呢！”\n“不要开玩笑啦许晴，而且也不好笑的嘛。就这样，我走了，记住不要让她知道是我送的。谢谢哈。”说完挥着手走了。\n你难道不知道我喜欢你吗？\n你到底懂不懂？\n知道的吧。\n许晴手中拿着玫瑰，尽管只有13支，但是却觉得无比沉重。原来感情那么难以学会。\n明明是三个人的电影，我却始终不能有姓名，程北，我给你的爱，一直很安静\u0026hellip;\u0026hellip;\n去到课室，许晴悄悄地将玫瑰递到林雪的抽屉，一声叹气，说不嫉妒林雪是不可能的，学习又好，家教素养什么的都比自己好，最大的优势是自己喜欢的人喜欢她。也不知道林雪对他什么感觉，也没表过态，密不透风的，如果她和程北在一起，也许会很好吧。可是那样的话\u0026hellip;..\n如果我从来就没有遇见过你，我一定不会如此迷茫。\n如果我从来就没有遇见过你，我一定不会爱得如此卑微。\n如果我从来就没有遇见过你，我一定会很快乐。\n可是你知道吗，梁静茹有一首歌叫做《没有如果》\n一心想让你过的快乐，却忘了问问自己到底快不快乐。\n当自己看到好看的书，会像一个小学生样笑嘻嘻地借给他看，当自己听到好听的歌，会忍不住马上发条短信给他，当看到他发的说说表示难过时，自己也会很难过\u0026hellip;\u0026hellip;\n爱与被爱不一定成正比，这个道理自己懂，但还是忍不住会去爱。\n我以为只要很认真的喜欢就能打动一个人，到后来，却只打动了我自己。就像之前看到韩寒说的，失恋的人的伤心大多不是因为恋人的离开，而是因为自己对自己处境的同情和怜悯。虽然自己都还没恋，但情况却是一样的。\n高中三年就这样悄无声息地过去了，程北最终没有向林雪表白，许晴几次向程北透露心意，但都被婉拒，爱情这条路上，两个人就好，三个人太多了。\n忘了吧，但是能说忘就忘么。\n可以的，自己骗骗自己而已。\n在感情的天平世界里，当他的心慢慢地远离你而移动到另一端，你就该清楚地知道，他已不会属于你，因为你们已经失衡在这个不平行的空间里，爱已缺氧，再待下去，也只能是窒息。\n许晴在飞机上闭着眼，静静地坐着，准备飞往上海，一间很有名的大学，然后开始一个完全不同的人生。\n放弃了，程北，我没有想象中的那么坚强 。\n但是，我还是得感谢你，你是我第一次爱的人，一个教会了我该怎么去爱的一个人，但，也仅仅是一个人。\n许晴缓缓睁开眼，嘴角浮现浅痕，双眼闪烁着微光，迷离地笑了，如夏花静美。\n当有一天你发现最爱你的人是我，等你懂了的时候我已不敢爱了\u0026hellip;\u0026hellip;\n——此篇为《孤单心事》续作\n注：本文转自我哥的日志\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E7%AD%89%E4%BD%A0%E6%87%82%E4%BA%86-%E6%82%B2%E9%9F%B3%E4%B9%90%E5%B0%8F%E8%AF%B4/","summary":"\u003cp\u003e人生中总会遇到一个不懂爱的，等你懂了的时候我也不敢爱了。\u003c/p\u003e\n\u003cp\u003e                                                                                                                  ——题记\u003c/p\u003e\n\u003cp\u003e       我看球赛看了三年，很努力地学习了三年，和林雪坐了三年。                                                                                                                                                                               只因，我喜欢你，喜欢了三年。\u003c/p\u003e\n\u003cp\u003e       我们总会在未来遇到一个属于自己对的人。也许现在的我正错过你，也许现在的你正错过我。可无论现在如何错过，对的人依然会在未来相遇。再见了，程北。\u003c/p\u003e\n\u003cp\u003e      在黄昏时刻，一个背着双肩背包的女孩拖着装满回忆的旅行箱缓慢走向机场，一滴泪狠狠砸在光滑的地板上，四溅碎裂开来，从眼中滑落的泪伤心欲绝，昏暗中有种热泪烧伤的错觉，许晴回过头看了一眼黄昏的地平线，转身离开，消失在人海\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003cp\u003e      在许晴的大脑神经中枢的刺激下，想念若隐若现。\u003c/p\u003e\n\u003cp\u003e      很早就注意到他了，篮球场上的健将，女生心目中的王子。在那个青春羞涩的年华里不知勾走了多少女生的心魂，包括许晴。每次看到他打球，装成一副花痴的模样，这个样子不知被同桌林雪说教了多少遍。\u003c/p\u003e\n\u003cp\u003e     “咳咳，许晴，注意点形象嘛。他叫什么名字？”林雪板着脸看着旁边张大着嘴的女生。“还有，你的口水不要流到我的肩膀上来了。”\u003c/p\u003e\n\u003cp\u003e      许晴迅速收拢，拿起纸巾擦了下嘴，想到之前程北吩咐过她的话，眼神持续了0.5秒的黯然，笑着回道，“哎呦，你是不是也看上隔壁班的程北了，也是，你看他多高挑，还有那灌篮的绝技，一个字，帅，改天介绍你认识认识……”\u003c/p\u003e\n\u003cp\u003e     “才没有呢，我走啦，看书去。”\u003c/p\u003e\n\u003cp\u003e      听到这句话后，心里有些为程北伤心，但是自己却是有些开心，这种矛盾的心理，连自己都觉得恶心。爱情是残酷的，是自私的，但是为何自己却自私不起来。就像是一只树梢上温饱的乌鸦，有一天看到一个昏迷的路人，于是把剩下的一点食物给他，这样的自己，应该可以归根为傻，但是又怎样呢，傻都傻了，那就这样下去吧，也许自私会更好，但是看到程北不开心，自己也会不开心。\u003c/p\u003e\n\u003cp\u003e      许晴看着湛蓝的天空，的眼睛出现了点微光，怪只怪自己喜欢上了他吧，我不是找不到更好的，只是因为已经有了你，再好的我都不想要。\u003c/p\u003e\n\u003cp\u003e      看着篮球场上不断跳动的程北，许晴微微地笑了。\u003c/p\u003e\n\u003cp\u003e      你就是犯贱，犯贱\u0026hellip;犯贱\u0026hellip;..\u003c/p\u003e\n\u003cp\u003e     《犯贱》么，一直很喜欢这首歌的吧。\u003c/p\u003e\n\u003cp\u003e      但是又有什么关系了呢？我没有想过以后会怎样，只是想着喜欢了，那就喜欢下去吧，青春是杯诱人的葡萄酒，即使里面装满了毒药，也会情不自禁地灌下肚，我们都太年轻，面对迷人的风景时，总是不自觉地就向前踏去，义无反顾。\u003c/p\u003e\n\u003cp\u003e      你有没有经历过，听着自己喜欢的人说他喜欢的人的名字。\u003c/p\u003e\n\u003cp\u003e      你有没有经历过，看着自己喜欢的人提到他喜欢的人时微笑的神情。\u003c/p\u003e\n\u003cp\u003e      你有没有经历过，当你想对他说我爱你的时候，他却说了声，我爱她。\u003c/p\u003e\n\u003cp\u003e      你有没有经历过，当你喜欢的人把玫瑰递给你，你很兴奋地想要收下，然后他说了句，帮我交给她。\u003c/p\u003e\n\u003cp\u003e      ……\u003c/p\u003e\n\u003cp\u003e      在放学的某一天，许晴收到程北的短信，叫自己明天早晨早点到外面的小巷来，那天晚上是她这几年来第一次失眠，他找自己干什么呢，他想对自己说什么？偷偷爬起床，悄悄拿到妈妈的香水喷了下，然后想到似乎他不喜欢香水味道，起码在林雪身上就从没闻到过。于是又到浴室重新洗了澡，冲洗掉身上氤氲的香水味……\u003c/p\u003e\n\u003cp\u003e      天微亮，许晴早早地起了身，刷牙洗脸的时间比往常久了点。\u003c/p\u003e\n\u003cp\u003e      现实往往没有想象的美好，而在女生的世界里，往往充斥着童话式的色彩，似乎生命里总有一个白马王子等待着自己，但却是忘了，自己也许只是个丢了水晶鞋的灰姑娘，那个王子注定就不属于自己。\u003c/p\u003e\n\u003cp\u003e      小巷里，男生打破了沉静，“许晴，你也知道我喜欢谁是吧。”说完递过精心扎好的玫瑰花束给她。许晴接过来，脸色微红，“嗯\u0026hellip;谁啊？”他喜欢林雪吧，可是他送花给我啊。\u003c/p\u003e\n\u003cp\u003e      “你同桌林雪啊，你不是知道吗？”\u003c/p\u003e\n\u003cp\u003e       听到后手中的玫瑰差点掉下去，“其实我喜欢你呢！”\u003c/p\u003e\n\u003cp\u003e      “不要开玩笑啦许晴，而且也不好笑的嘛。就这样，我走了，记住不要让她知道是我送的。谢谢哈。”说完挥着手走了。\u003c/p\u003e\n\u003cp\u003e       你难道不知道我喜欢你吗？\u003c/p\u003e\n\u003cp\u003e       你到底懂不懂？\u003c/p\u003e\n\u003cp\u003e       知道的吧。\u003c/p\u003e\n\u003cp\u003e       许晴手中拿着玫瑰，尽管只有13支，但是却觉得无比沉重。原来感情那么难以学会。\u003c/p\u003e\n\u003cp\u003e       明明是三个人的电影，我却始终不能有姓名，程北，我给你的爱，一直很安静\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003cp\u003e       去到课室，许晴悄悄地将玫瑰递到林雪的抽屉，一声叹气，说不嫉妒林雪是不可能的，学习又好，家教素养什么的都比自己好，最大的优势是自己喜欢的人喜欢她。也不知道林雪对他什么感觉，也没表过态，密不透风的，如果她和程北在一起，也许会很好吧。可是那样的话\u0026hellip;..\u003c/p\u003e\n\u003cp\u003e        如果我从来就没有遇见过你，我一定不会如此迷茫。\u003c/p\u003e\n\u003cp\u003e        如果我从来就没有遇见过你，我一定不会爱得如此卑微。\u003c/p\u003e\n\u003cp\u003e        如果我从来就没有遇见过你，我一定会很快乐。\u003c/p\u003e\n\u003cp\u003e        可是你知道吗，梁静茹有一首歌叫做《没有如果》\u003c/p\u003e\n\u003cp\u003e       一心想让你过的快乐，却忘了问问自己到底快不快乐。\u003c/p\u003e\n\u003cp\u003e       当自己看到好看的书，会像一个小学生样笑嘻嘻地借给他看，当自己听到好听的歌，会忍不住马上发条短信给他，当看到他发的说说表示难过时，自己也会很难过\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003cp\u003e       爱与被爱不一定成正比，这个道理自己懂，但还是忍不住会去爱。\u003c/p\u003e\n\u003cp\u003e       我以为只要很认真的喜欢就能打动一个人，到后来，却只打动了我自己。就像之前看到韩寒说的，失恋的人的伤心大多不是因为恋人的离开，而是因为自己对自己处境的同情和怜悯。虽然自己都还没恋，但情况却是一样的。\u003c/p\u003e\n\u003cp\u003e       高中三年就这样悄无声息地过去了，程北最终没有向林雪表白，许晴几次向程北透露心意，但都被婉拒，爱情这条路上，两个人就好，三个人太多了。\u003c/p\u003e\n\u003cp\u003e       忘了吧，但是能说忘就忘么。\u003c/p\u003e\n\u003cp\u003e       可以的，自己骗骗自己而已。\u003c/p\u003e\n\u003cp\u003e       在感情的天平世界里，当他的心慢慢地远离你而移动到另一端，你就该清楚地知道，他已不会属于你，因为你们已经失衡在这个不平行的空间里，爱已缺氧，再待下去，也只能是窒息。\u003c/p\u003e\n\u003cp\u003e       许晴在飞机上闭着眼，静静地坐着，准备飞往上海，一间很有名的大学，然后开始一个完全不同的人生。\u003c/p\u003e\n\u003cp\u003e       放弃了，程北，我没有想象中的那么坚强 。\u003c/p\u003e\n\u003cp\u003e       但是，我还是得感谢你，你是我第一次爱的人，一个教会了我该怎么去爱的一个人，但，也仅仅是一个人。\u003c/p\u003e\n\u003cp\u003e       许晴缓缓睁开眼，嘴角浮现浅痕，双眼闪烁着微光，迷离地笑了，如夏花静美。\u003c/p\u003e\n\u003cp\u003e       当有一天你发现最爱你的人是我，等你懂了的时候我已不敢爱了\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003cp\u003e                                                                          ——此篇为《孤单心事》续作\u003c/p\u003e\n\u003cp\u003e注：本文转自我哥的日志\u003c/p\u003e","title":"等你懂了——【悲】音乐小说"},{"content":"经过《爸爸去哪儿》节目组的千挑万拣，决定第七次节目拍摄地点定在广东财经大学华商学院。\n“爸比，华商好玩吗？我们为什么要去华商呀？”kimi牵着爸爸林志颖的手，亮亮的小眼睛直瞪瞪地望着爸爸。\n林志颖摸摸kimi的头，“当然是锻炼kimi的各种能力啦，我们去看看，你就知道咯。”\n这时节目组一行已经抵达增城华商学院。刚踏进校门，石头的肚子开始嘀咕了，“爸，咱们先去吃饭吧。”\n镜头移向Angela，一双眼睛瞪得大大的，嘴巴“哇”地一声，只见她拿着一张不知哪里冒泡出来的地图，兴奋地一喊，“石头哥，我发现了吃饭的地方，明星饭堂耶！明星明星，原来这就是我们来华商的原因。”\n“那咱们快去吧，肯定有很多好吃的！”石头凑过来看着地图，舔着嘴唇。\n一行人走着，不一会“明星饭堂”的雕字映入眼帘，目的地二楼。天天主动提出帮大家买饭票，等了会也没见回来，于是张亮走过去一看，天天竟然在拿着阿姨的iPad玩起了游戏，张亮眼神与儿子一对视，天天败北\u0026hellip;\u0026hellip;\n排队打好饭菜，“小朋友们，好不好吃呀？”代理校长李锐走过来问道。\n森蝶抢答道，“不好吃，米饭怎么是一粒一粒的呀？”\n“爸比，我好怀念上次吃的竹筒饭。”kimi嘟起了嘴。\n石头更是嘟囔了，“本来就饿了，怎么吃得饱啊！”爸爸郭涛回应道，“所以来华商的目标之一，就是让你减减肥，之前打听过了，华商大多数人觉得吃饭堂吃不饱。”\nAngela深情地望着王岳伦，“爸爸，我也要减肥吗？”，王岳伦回道，“你不肥，只是婴儿肥而已，可爱着呢。”\n“我是没关系啦，只是担心我爸，他下巴已经够尖了，在华商呆下去不知会不会变成针。”天天显得无所谓。\n五位小朋友发完言，李锐便说，“从今天开始你们就是大一的华商新生，现在开始安排宿舍区，听好了哟，分配的是不能更改的。”李锐顿了下，继续说道，“森蝶和Angela住在6栋，kimi住水帘洞，天天住天梯，石头住H区，具体的宿舍你们自己去挑。好好享受大学生活吧！”\n“水帘洞耶，爸比，我是美猴王。”kimi兴奋道。林志颖拉着kimi，“走啦，咱们去看我们的宿舍咯。”\n出了明星没走多久，“我们到啦，哈哈，好近呐。”两个女生牵着手，蹦蹦跳跳进了6栋。\n不一会张亮父子也停住了脚步，“爸爸，这就是天梯吗？”天天咽了咽口水，“好高的阶梯，我们以后就要每天这样上上下下了？”张亮对儿子安慰道，“你看旁边的哥哥们，都是一脸淡定，都已经习惯了，我们也会习惯的，走啦！”\n石头和kimi相视一笑，似乎想说幸亏我们不在天梯，四个人继续走，听到水哗啦哗啦的声音，水帘洞也到了，kimi牵着爸爸的手，“石头哥哥，我们先走了，你也快点去到你的宿舍喔。”\n“爸，我们的H在哪，咋还没到？”石头有点急了，郭涛拿出地图，“嗯\u0026hellip;..快了，还有一半的路程。”说完后石头瞬间石化。\n两人继续走，经过四饭，越走风越大，头发被狂风肆虐着，“爸，我好冷啊，不是说这里有十度的吗，怎么我感觉比上次去的雪乡还要冷。”把石头偎依在胸前的郭涛也瑟瑟发抖，“其实华商不算冷，只是风有点大，风有点大。”\n“这还叫有点大？”继续走着，走到与崇德楼相对的十字路口，戴起来的帽子呼的一声被吹倒，石头倒退了几步，“刚才还真算是有点大，爸，我不要住H了。”郭涛哀叹一声，“孩子，咱认了吧，校长之命，难以违抗！”\n就这样，最后一组也抵达了宿舍。大家都开始了在华商的大一生活，也渐渐地习惯起来。\n不久，大家又重聚起来，小伙伴们唧唧喳喳起来。Angela兴奋地说道，“昨天我又和森蝶去宝乐迪唱K了，好好玩。”说完手舞足蹈起来。\n“咋不去大润发唱呢，听说还有免费车搭呢！”天天问道。\n“唉，别提大润发的免费车了，上次差点回不来了，特别是华商车，那叫一个挤啊，不过哥哥姐姐们倒是体谅我们小孩，坐的位置解决了，但是手却遭殃了，一直让我们签名。”森蝶心有余悸。\n“我没去过大润发，一直都是去挂绿，那里的玩具好多，假面超人，奥特曼\u0026hellip;\u0026hellip;”kimi还在陶醉着。\n林志颖打断儿子的话，“kimi又不乖了哦，老是去挂绿，难道不知道挂绿和挂科是两兄弟吗？就不怕挂科？”\n“爸比，爸比，有了老师划的重点就天不怕地不怕。”kimi笑嘻嘻回道，但瞬间又变了色，“不过，听说今年管理学没有重点。”\n乌鸦声响起，众人脸上两条黑线\u0026hellip;\u0026hellip;\n天天看向石头，“石头，你过得怎么样，咋不说话呢？”\n“我，身在H的我已经没力气说话了，路太远，一路走来走得太艰辛，如果我不说话，请不要以为我怎么了，哥只是累了。”石头捂住脸，深沉地说道，这是多么痛的领悟。\n“石头哥，不对啊，你的脸蛋看起来似乎是又胖了，我看过得很好，怎么会累呢。”细心的森蝶凑过去，拿开石头挡住脸的手。\n一句话戳中要害，石头连着椅子滑落地，站起来不好意思地说道，“我真的又胖了吗，不能怪我，只能怪五饭二楼的鸡扒饭太好吃了。\n“不过鸡扒饭要9块钱，我的饭卡快没钱了。”石头尴尬一笑。\n又一只乌鸦飞过\u0026hellip;\u0026hellip;\u0026hellip;\n“爸比，我的饭卡也快没钱了。”kimi抱怨道，“这里的饭菜太贵了，比我们之前去过的6个地方都贵。”\n李锐听到钱，忍不住说道，“我昨天去三饭的中行ATM排队取钱，轮到我的时候竟然没钱了，今天再去，竟然说机器故障，暂停服务。唉，等会去明星那边跨行取款吧，虽然节目组要求我们能省则省，但这也是没办法的，谁叫华商的中行只有一个而且经常故障呢。”\n森蝶和Angela两个女生则是一笑，“我们的钱还挺多喔。”\n石头呆住了，“你们要减肥吗？”\n“才不是呢，我们找了兼职\u0026hellip;..”女生嗯哼一声，发腔了，“皮蛋瘦肉粥，热狗，鸡肉卷，蛋蛋日记，有没有要汉堡的同学，买了的同学都能获得合影留念机会并附带签名。”说完两个人得意的瞥笑了男生们一眼。\n天天也发话了，“我也找了兼职，我帮人代课，华商价15块钱2节课。虽然不多，但也算涨了点知识。不过话说，我们天梯高也就算了，而且很早就没热水了，我听石头哥说他们H区的晚上十一点还热水不断，哎，不说了，说多了都是泪。”\n“我们也快离开华商了，有什么不满的地方就提出来吧，就算是帮哥哥姐姐们，我会传达给校长。”李锐说道。\n——我要洗热水澡。\n——五饭的鸡扒饭排的队伍太长了，要多安排工作人员。\n——大晚上不睡觉地，还有人大声唱歌，要让校长多叫几个假面超人收拾他们。\n——饭堂的饭质量不好，价钱太贵了，我想问华商是不是想让他（她）们都瘦成模特，让我爸丢了饭碗。\n——看电影明明说七点半才开始的，但是早就被书占领啦，人都不知去哪里了呢。\n——还有风太大了，要让他们多种些树，防防风。\n——还有很重要的一点，快过年了，不要让哥哥姐姐们挂科了，虽然他（她）们经常去挂绿。\n\u0026hellip;\u0026hellip;.\n于是《爸爸去哪儿》节目组离开了华商，开始了他们新的征途。\n在车中，李锐问孩子们，通过这次华商之旅，最大的感悟是什么？\n孩子们说，“我们要好好学习，天天向上，因为2B的学校伤不起，学费，物价太贵了\u0026hellip;\u0026hellip;.”\n“不过另外说一声，华商五饭的鸡扒饭真的不错！”石头总结道。\n看来他的减肥目标还是没实现\u0026hellip;\u0026hellip;\n注：本文转自我哥的日志\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E7%88%B8%E7%88%B8%E5%8E%BB%E5%93%AA%E5%84%BF%E5%8E%BB%E5%8D%8E%E5%95%86%E5%90%A7/","summary":"\u003cp\u003e经过《爸爸去哪儿》节目组的千挑万拣，决定第七次节目拍摄地点定在广东财经大学华商学院。\u003c/p\u003e\n\u003cp\u003e“爸比，华商好玩吗？我们为什么要去华商呀？”kimi牵着爸爸林志颖的手，亮亮的小眼睛直瞪瞪地望着爸爸。\u003c/p\u003e\n\u003cp\u003e林志颖摸摸kimi的头，“当然是锻炼kimi的各种能力啦，我们去看看，你就知道咯。”\u003c/p\u003e\n\u003cp\u003e这时节目组一行已经抵达增城华商学院。刚踏进校门，石头的肚子开始嘀咕了，“爸，咱们先去吃饭吧。”\u003c/p\u003e\n\u003cp\u003e镜头移向Angela，一双眼睛瞪得大大的，嘴巴“哇”地一声，只见她拿着一张不知哪里冒泡出来的地图，兴奋地一喊，“石头哥，我发现了吃饭的地方，明星饭堂耶！明星明星，原来这就是我们来华商的原因。”\u003c/p\u003e\n\u003cp\u003e“那咱们快去吧，肯定有很多好吃的！”石头凑过来看着地图，舔着嘴唇。\u003c/p\u003e\n\u003cp\u003e一行人走着，不一会“明星饭堂”的雕字映入眼帘，目的地二楼。天天主动提出帮大家买饭票，等了会也没见回来，于是张亮走过去一看，天天竟然在拿着阿姨的iPad玩起了游戏，张亮眼神与儿子一对视，天天败北\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003cp\u003e排队打好饭菜，“小朋友们，好不好吃呀？”代理校长李锐走过来问道。\u003c/p\u003e\n\u003cp\u003e森蝶抢答道，“不好吃，米饭怎么是一粒一粒的呀？”\u003c/p\u003e\n\u003cp\u003e“爸比，我好怀念上次吃的竹筒饭。”kimi嘟起了嘴。\u003c/p\u003e\n\u003cp\u003e石头更是嘟囔了，“本来就饿了，怎么吃得饱啊！”爸爸郭涛回应道，“所以来华商的目标之一，就是让你减减肥，之前打听过了，华商大多数人觉得吃饭堂吃不饱。”\u003c/p\u003e\n\u003cp\u003eAngela深情地望着王岳伦，“爸爸，我也要减肥吗？”，王岳伦回道，“你不肥，只是婴儿肥而已，可爱着呢。”\u003c/p\u003e\n\u003cp\u003e“我是没关系啦，只是担心我爸，他下巴已经够尖了，在华商呆下去不知会不会变成针。”天天显得无所谓。\u003c/p\u003e\n\u003cp\u003e五位小朋友发完言，李锐便说，“从今天开始你们就是大一的华商新生，现在开始安排宿舍区，听好了哟，分配的是不能更改的。”李锐顿了下，继续说道，“森蝶和Angela住在6栋，kimi住水帘洞，天天住天梯，石头住H区，具体的宿舍你们自己去挑。好好享受大学生活吧！”\u003c/p\u003e\n\u003cp\u003e“水帘洞耶，爸比，我是美猴王。”kimi兴奋道。林志颖拉着kimi，“走啦，咱们去看我们的宿舍咯。”\u003c/p\u003e\n\u003cp\u003e出了明星没走多久，“我们到啦，哈哈，好近呐。”两个女生牵着手，蹦蹦跳跳进了6栋。\u003c/p\u003e\n\u003cp\u003e不一会张亮父子也停住了脚步，“爸爸，这就是天梯吗？”天天咽了咽口水，“好高的阶梯，我们以后就要每天这样上上下下了？”张亮对儿子安慰道，“你看旁边的哥哥们，都是一脸淡定，都已经习惯了，我们也会习惯的，走啦！”\u003c/p\u003e\n\u003cp\u003e石头和kimi相视一笑，似乎想说幸亏我们不在天梯，四个人继续走，听到水哗啦哗啦的声音，水帘洞也到了，kimi牵着爸爸的手，“石头哥哥，我们先走了，你也快点去到你的宿舍喔。”\u003c/p\u003e\n\u003cp\u003e“爸，我们的H在哪，咋还没到？”石头有点急了，郭涛拿出地图，“嗯\u0026hellip;..快了，还有一半的路程。”说完后石头瞬间石化。\u003c/p\u003e\n\u003cp\u003e两人继续走，经过四饭，越走风越大，头发被狂风肆虐着，“爸，我好冷啊，不是说这里有十度的吗，怎么我感觉比上次去的雪乡还要冷。”把石头偎依在胸前的郭涛也瑟瑟发抖，“其实华商不算冷，只是风有点大，风有点大。”\u003c/p\u003e\n\u003cp\u003e“这还叫有点大？”继续走着，走到与崇德楼相对的十字路口，戴起来的帽子呼的一声被吹倒，石头倒退了几步，“刚才还真算是有点大，爸，我不要住H了。”郭涛哀叹一声，“孩子，咱认了吧，校长之命，难以违抗！”\u003c/p\u003e\n\u003cp\u003e就这样，最后一组也抵达了宿舍。大家都开始了在华商的大一生活，也渐渐地习惯起来。\u003c/p\u003e\n\u003cp\u003e不久，大家又重聚起来，小伙伴们唧唧喳喳起来。Angela兴奋地说道，“昨天我又和森蝶去宝乐迪唱K了，好好玩。”说完手舞足蹈起来。\u003c/p\u003e\n\u003cp\u003e“咋不去大润发唱呢，听说还有免费车搭呢！”天天问道。\u003c/p\u003e\n\u003cp\u003e“唉，别提大润发的免费车了，上次差点回不来了，特别是华商车，那叫一个挤啊，不过哥哥姐姐们倒是体谅我们小孩，坐的位置解决了，但是手却遭殃了，一直让我们签名。”森蝶心有余悸。\u003c/p\u003e\n\u003cp\u003e“我没去过大润发，一直都是去挂绿，那里的玩具好多，假面超人，奥特曼\u0026hellip;\u0026hellip;”kimi还在陶醉着。\u003c/p\u003e\n\u003cp\u003e林志颖打断儿子的话，“kimi又不乖了哦，老是去挂绿，难道不知道挂绿和挂科是两兄弟吗？就不怕挂科？”\u003c/p\u003e\n\u003cp\u003e“爸比，爸比，有了老师划的重点就天不怕地不怕。”kimi笑嘻嘻回道，但瞬间又变了色，“不过，听说今年管理学没有重点。”\u003c/p\u003e\n\u003cp\u003e乌鸦声响起，众人脸上两条黑线\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003cp\u003e天天看向石头，“石头，你过得怎么样，咋不说话呢？”\u003c/p\u003e\n\u003cp\u003e“我，身在H的我已经没力气说话了，路太远，一路走来走得太艰辛，如果我不说话，请不要以为我怎么了，哥只是累了。”石头捂住脸，深沉地说道，这是多么痛的领悟。\u003c/p\u003e\n\u003cp\u003e“石头哥，不对啊，你的脸蛋看起来似乎是又胖了，我看过得很好，怎么会累呢。”细心的森蝶凑过去，拿开石头挡住脸的手。\u003c/p\u003e\n\u003cp\u003e一句话戳中要害，石头连着椅子滑落地，站起来不好意思地说道，“我真的又胖了吗，不能怪我，只能怪五饭二楼的鸡扒饭太好吃了。\u003c/p\u003e\n\u003cp\u003e“不过鸡扒饭要9块钱，我的饭卡快没钱了。”石头尴尬一笑。\u003c/p\u003e\n\u003cp\u003e又一只乌鸦飞过\u0026hellip;\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003cp\u003e“爸比，我的饭卡也快没钱了。”kimi抱怨道，“这里的饭菜太贵了，比我们之前去过的6个地方都贵。”\u003c/p\u003e\n\u003cp\u003e李锐听到钱，忍不住说道，“我昨天去三饭的中行ATM排队取钱，轮到我的时候竟然没钱了，今天再去，竟然说机器故障，暂停服务。唉，等会去明星那边跨行取款吧，虽然节目组要求我们能省则省，但这也是没办法的，谁叫华商的中行只有一个而且经常故障呢。”\u003c/p\u003e\n\u003cp\u003e森蝶和Angela两个女生则是一笑，“我们的钱还挺多喔。”\u003c/p\u003e\n\u003cp\u003e石头呆住了，“你们要减肥吗？”\u003c/p\u003e\n\u003cp\u003e“才不是呢，我们找了兼职\u0026hellip;..”女生嗯哼一声，发腔了，“皮蛋瘦肉粥，热狗，鸡肉卷，蛋蛋日记，有没有要汉堡的同学，买了的同学都能获得合影留念机会并附带签名。”说完两个人得意的瞥笑了男生们一眼。\u003c/p\u003e\n\u003cp\u003e天天也发话了，“我也找了兼职，我帮人代课，华商价15块钱2节课。虽然不多，但也算涨了点知识。不过话说，我们天梯高也就算了，而且很早就没热水了，我听石头哥说他们H区的晚上十一点还热水不断，哎，不说了，说多了都是泪。”\u003c/p\u003e\n\u003cp\u003e“我们也快离开华商了，有什么不满的地方就提出来吧，就算是帮哥哥姐姐们，我会传达给校长。”李锐说道。\u003c/p\u003e\n\u003cp\u003e——我要洗热水澡。\u003c/p\u003e\n\u003cp\u003e——五饭的鸡扒饭排的队伍太长了，要多安排工作人员。\u003c/p\u003e\n\u003cp\u003e——大晚上不睡觉地，还有人大声唱歌，要让校长多叫几个假面超人收拾他们。\u003c/p\u003e\n\u003cp\u003e——饭堂的饭质量不好，价钱太贵了，我想问华商是不是想让他（她）们都瘦成模特，让我爸丢了饭碗。\u003c/p\u003e\n\u003cp\u003e——看电影明明说七点半才开始的，但是早就被书占领啦，人都不知去哪里了呢。\u003c/p\u003e\n\u003cp\u003e——还有风太大了，要让他们多种些树，防防风。\u003c/p\u003e\n\u003cp\u003e——还有很重要的一点，快过年了，不要让哥哥姐姐们挂科了，虽然他（她）们经常去挂绿。\u003c/p\u003e\n\u003cp\u003e\u0026hellip;\u0026hellip;.\u003c/p\u003e\n\u003cp\u003e于是《爸爸去哪儿》节目组离开了华商，开始了他们新的征途。\u003c/p\u003e\n\u003cp\u003e在车中，李锐问孩子们，通过这次华商之旅，最大的感悟是什么？\u003c/p\u003e\n\u003cp\u003e孩子们说，“我们要好好学习，天天向上，因为2B的学校伤不起，学费，物价太贵了\u0026hellip;\u0026hellip;.”\u003c/p\u003e\n\u003cp\u003e“不过另外说一声，华商五饭的鸡扒饭真的不错！”石头总结道。\u003c/p\u003e\n\u003cp\u003e看来他的减肥目标还是没实现\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003cp\u003e注：本文转自我哥的日志\u003c/p\u003e","title":"爸爸去哪儿@去华商吧"},{"content":"请按照特定人物的语调，动作进行画面想象。\n——前言\n曾小贤场外音，“欢迎来到爱情公寓华商的世界，好男人就是我，我就是\u0026hellip;..”说着两眉上挑，嘴角上扬，嘴露笑意，“\u0026hellip;\u0026hellip;曾小贤。”\n“是的，你没听错。这就是华商的世界，很多华商的小朋友都不知道四饭斜对面那些挖土机挖山石是做什么，其实是用来\u0026hellip;..”胡一菲缓缓走近镜头。\n“挖土？姐，这还用想，这摆明是坑爹的。”展博两眼一呆。\n“展博，这你就不知道了，那是学校为了帮我们建华商版爱情公寓，以后我们的宿舍就在那啦，”悠悠凑过来，仰着15度角，面带桃花笑容，眼神迷离，“想象一下，多么浪漫啊，在一个充满黄土青草气息的小山坡上，关谷君拿着画笔画板写生，而我就穿着碎花洋裙在放\u0026hellip;..”\n“小姨妈，这么冷的天气你穿洋裙，你还要放羊？”子乔也刚从第四季穿越到了华商特别篇。\n悠悠瞪了子乔一眼，“大外甥，谁说我放羊，我是在放哨，”继而又是悠悠的脑海幻境，请看VCR。\n在四饭斜对面空旷的黄土且不知从哪里冒出来的草原上，关谷坐着拿起画笔写生，突然四饭方向快速飞来一块坚不可摧的不明物，目标是关谷，穿着碎花洋裙的悠悠以更快的速度飞奔过去，“什么东西，敢伤我关谷君”悠悠牙齿嘣的一声咬住不明物，“悠悠，这是一块肥猪肉。”\n突然，悠悠嘴角溢出血红的液体，“关谷，这是一块染了禽流感的肥猪肉，我不能陪你了，关谷君，你以后要在华商好好学习，记得要早点洗澡，晚了没热水，还有千万不能去五饭二楼吃鸡扒饭了，排得慢慢的都是队。华商女生多，你找一个汉语言文学的，恶补下你的中文，我得走了。”说完眼睛一闭，脖子一歪。\n“悠悠，你不能死，你死了，剧情怎么发展下去。”关谷摇着悠悠的身体。\n悠悠脑袋直立起来，“关谷君，记住我不是被禽流感害死的，我是被肥猪肉的油腻死的。”说完两眼一白，整个人又倒了下去。\n幻境VCR结束。众人倒。\n悠悠看见不知什么时候走过来的关谷，拉着关谷笑道，“关关，是不是好浪漫呀，我也可以保护你了。”\n关谷用他那不标准的普通话说道，“浪漫？我只觉得我的逻辑碎了一地，而且你怎么来到华商之后，扮演的角色还是死了，”转过身小声自语，“还是吃肥猪肉死的。”\n悠悠眉头一皱，“不是说好剧情就是这么安排的呀。”\n“谁跟你说好的啊。”关谷回道。\n\u0026hellip;\u0026hellip;\n“大家好，欢迎收听华商之声之华商电台之你的月亮我的心，好男人就是我，我就是曾小贤，有什么情感，心理等问题可以直接拨打我的短号669267，我会为大家解答问题。好，现在有一位听众的电话接入。”\n“曾老师，你好，我最近喜欢上了一个男生，她说她是大四的工商管理系毕业生\u0026hellip;\u0026hellip;”\n曾小贤打断她的话，“等等，你说错字了吧，你喜欢一个男生，那你应该打单人旁的他吧，怎么成了女字旁的\u0026hellip;\u0026hellip;”\n“等等，我说话同一个音你怎么能听出什么偏旁？”\n“编导让我有这能力我也没办法，你还是说重点吧，而且听你的声音\u0026hellip;你是个男生吧，你喜欢男生，咳咳，其实我能理解的。”\n“什么呀，她就叫做‘一个男生’，这是她的脸盆网昵称。”\n曾小贤一愣，看向镜头，“这——都——行。”\n“咳咳，你喜欢上那个叫做一个男生的女生，然后呢？”\n“她上学期高数挂了，想叫我代考，可是被抓住后果很严重\u0026hellip;..”男生说道。\n“既然你喜欢她，就应该直接去帮她代考嘛，你被抓了还是小事，爱情抓走了就是大事了。”\n“我不是想问你这个，我已经准备好帮她代考了，不过就是不知道监考老师严不严”\n“这个简单，你告诉我在哪个试室，我帮你查查是哪个老师监考。”\n“我也不是问这个，我已经知道是个新来的叫做胡一菲的老师监考。”\n“大哥，你一刀杀了我吧，你到底要问什么？”曾小贤抓着头发。\n“我不知道我女神叫做什么名字，万一胡一菲老师严厉，我乱写名字的事被拆穿怎么办？”\n“一菲监考，我已经想象到10086种你的死法了，完了，你没救了，我怎么知道那个能起那么非主流昵称的奇葩叫什么名字。你直接问她不就得了。”\n“她不怎么在线，而且也就和她聊过几句话而已。”\n“什么？你也太草率了吧，才聊了几句话你就喜欢上她了？”\n“哎，这不能怪我，只能怪她太可爱了，连计算都那么有趣，‘一一得一，一二得二。三八妇女节，五一劳动节，六一儿童节’\u0026hellip;\u0026hellip;”\n曾小贤一怔，咽了咽口水，“陈——美——嘉。”\n“陈美嘉？这就是她的名字啊，你太厉害了，谢谢曾老师，再见。”\n曾小贤抹了抹脸上的汗，“有请下一位听众。”\n“曾老师，不知道是谁说视听说不会挂的，害我白高兴一场，结果我58分挂了，差两分都不让我过，害得我少收了100张红发毛爷爷。”\n“这位同学，首先你应该值得庆幸，我逛华商贴吧看到一个视听说59分还挂了的，其次，你家是开银行的吧，最后，这个才是重点，这视听说怎么来问我了？”\n曾小贤场外音，【我的乖乖，我英语平时能考50分都算展博附体了。】\n“我当然不是问你视听说的问题，问你我还不如问明星饭堂打饭的阿姨呢，说笑呢，曾老师是个好男人应该不会介意的吧。我是想问下，你能弄到补考试题的答案吗？”女生小声问道。\n“什么？答案？这我可办不到了，去年华商管理学漏题上了电视，而我除了出现在电视剧里，可不想上新闻节目了。”\n“还说自己是什么好男人，果然经常说自己是好男人的往往都不可靠\u0026hellip;\u0026hellip;”\n“嘟嘟嘟嘟，”挂了。\n“果然还是好男人难做啊，话说，能来个正常点的听众吗？”\n华商街上。\n“经过路过不要错过，一定还有莘莘学子担忧社会实践报告的盖章问题吧，放心，有我吕小布在，包你们全部过了。”子乔坐在大排档旁边的桌子上喊道。\n一个女生经过，“说吧，多少钱？”\n子乔暗忖，这个女生说话一针见血，恐怕一般言语蛊惑不了她，我似乎不知在第几季第几集说过这么一句话，剧本背多了还真快忘，“关键时刻来几句女生听不懂的话，可以有效提升你的魅力。”想到了，有了。\n子乔拿出一个萝卜章，“这位美女，你可不要小看这萝卜章，这个可不是一般的萝卜，它是用希米亚泥土栽培，每天淋上100毫升但丁圣水，经过九九八十一天紫外线照射才能收获，用它刻的章能够让你精神焕发\u0026hellip;\u0026hellip;”\n“停，我问你，多少钱？”\n子乔一翻白眼，“好吧，我认栽。50块钱，顺丰包邮，你值得拥有。”\n“你抢银行吧，还顺丰，哪来的顺丰？”\n子乔一听，立马从地上拿起一个小盒子，上面赫然印着两个大字——顺丰。\n“这——都——行。”\n\u0026hellip;\u0026hellip;\n【开学篇完结】\n注：本文转自我哥的日志。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E7%88%B1%E6%83%85%E5%85%AC%E5%AF%93%E5%8D%8E%E5%95%86%E7%89%B9%E5%88%AB%E7%AF%87/","summary":"\u003cp\u003e请按照特定人物的语调，动作进行画面想象。\u003c/p\u003e\n\u003cp\u003e                                              ——前言\u003c/p\u003e\n\u003cp\u003e曾小贤场外音，“欢迎来到爱情公寓华商的世界，好男人就是我，我就是\u0026hellip;..”说着两眉上挑，嘴角上扬，嘴露笑意，“\u0026hellip;\u0026hellip;曾小贤。”\u003c/p\u003e\n\u003cp\u003e“是的，你没听错。这就是华商的世界，很多华商的小朋友都不知道四饭斜对面那些挖土机挖山石是做什么，其实是用来\u0026hellip;..”胡一菲缓缓走近镜头。\u003c/p\u003e\n\u003cp\u003e“挖土？姐，这还用想，这摆明是坑爹的。”展博两眼一呆。\u003c/p\u003e\n\u003cp\u003e“展博，这你就不知道了，那是学校为了帮我们建华商版爱情公寓，以后我们的宿舍就在那啦，”悠悠凑过来，仰着15度角，面带桃花笑容，眼神迷离，“想象一下，多么浪漫啊，在一个充满黄土青草气息的小山坡上，关谷君拿着画笔画板写生，而我就穿着碎花洋裙在放\u0026hellip;..”\u003c/p\u003e\n\u003cp\u003e“小姨妈，这么冷的天气你穿洋裙，你还要放羊？”子乔也刚从第四季穿越到了华商特别篇。\u003c/p\u003e\n\u003cp\u003e悠悠瞪了子乔一眼，“大外甥，谁说我放羊，我是在放哨，”继而又是悠悠的脑海幻境，请看VCR。\u003c/p\u003e\n\u003cp\u003e在四饭斜对面空旷的黄土且不知从哪里冒出来的草原上，关谷坐着拿起画笔写生，突然四饭方向快速飞来一块坚不可摧的不明物，目标是关谷，穿着碎花洋裙的悠悠以更快的速度飞奔过去，“什么东西，敢伤我关谷君”悠悠牙齿嘣的一声咬住不明物，“悠悠，这是一块肥猪肉。”\u003c/p\u003e\n\u003cp\u003e突然，悠悠嘴角溢出血红的液体，“关谷，这是一块染了禽流感的肥猪肉，我不能陪你了，关谷君，你以后要在华商好好学习，记得要早点洗澡，晚了没热水，还有千万不能去五饭二楼吃鸡扒饭了，排得慢慢的都是队。华商女生多，你找一个汉语言文学的，恶补下你的中文，我得走了。”说完眼睛一闭，脖子一歪。\u003c/p\u003e\n\u003cp\u003e“悠悠，你不能死，你死了，剧情怎么发展下去。”关谷摇着悠悠的身体。\u003c/p\u003e\n\u003cp\u003e悠悠脑袋直立起来，“关谷君，记住我不是被禽流感害死的，我是被肥猪肉的油腻死的。”说完两眼一白，整个人又倒了下去。\u003c/p\u003e\n\u003cp\u003e幻境VCR结束。众人倒。\u003c/p\u003e\n\u003cp\u003e悠悠看见不知什么时候走过来的关谷，拉着关谷笑道，“关关，是不是好浪漫呀，我也可以保护你了。”\u003c/p\u003e\n\u003cp\u003e关谷用他那不标准的普通话说道，“浪漫？我只觉得我的逻辑碎了一地，而且你怎么来到华商之后，扮演的角色还是死了，”转过身小声自语，“还是吃肥猪肉死的。”\u003c/p\u003e\n\u003cp\u003e悠悠眉头一皱，“不是说好剧情就是这么安排的呀。”\u003c/p\u003e\n\u003cp\u003e“谁跟你说好的啊。”关谷回道。\u003c/p\u003e\n\u003cp\u003e \u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003cp\u003e “大家好，欢迎收听华商之声之华商电台之你的月亮我的心，好男人就是我，我就是曾小贤，有什么情感，心理等问题可以直接拨打我的短号669267，我会为大家解答问题。好，现在有一位听众的电话接入。”\u003c/p\u003e\n\u003cp\u003e “曾老师，你好，我最近喜欢上了一个男生，她说她是大四的工商管理系毕业生\u0026hellip;\u0026hellip;”\u003c/p\u003e\n\u003cp\u003e 曾小贤打断她的话，“等等，你说错字了吧，你喜欢一个男生，那你应该打单人旁的他吧，怎么成了女字旁的\u0026hellip;\u0026hellip;”\u003c/p\u003e\n\u003cp\u003e “等等，我说话同一个音你怎么能听出什么偏旁？”\u003c/p\u003e\n\u003cp\u003e “编导让我有这能力我也没办法，你还是说重点吧，而且听你的声音\u0026hellip;你是个男生吧，你喜欢男生，咳咳，其实我能理解的。”\u003c/p\u003e\n\u003cp\u003e “什么呀，她就叫做‘一个男生’，这是她的脸盆网昵称。”\u003c/p\u003e\n\u003cp\u003e曾小贤一愣，看向镜头，“这——都——行。”\u003c/p\u003e\n\u003cp\u003e“咳咳，你喜欢上那个叫做一个男生的女生，然后呢？”\u003c/p\u003e\n\u003cp\u003e“她上学期高数挂了，想叫我代考，可是被抓住后果很严重\u0026hellip;..”男生说道。\u003c/p\u003e\n\u003cp\u003e“既然你喜欢她，就应该直接去帮她代考嘛，你被抓了还是小事，爱情抓走了就是大事了。”\u003c/p\u003e\n\u003cp\u003e“我不是想问你这个，我已经准备好帮她代考了，不过就是不知道监考老师严不严”\u003c/p\u003e\n\u003cp\u003e“这个简单，你告诉我在哪个试室，我帮你查查是哪个老师监考。”\u003c/p\u003e\n\u003cp\u003e“我也不是问这个，我已经知道是个新来的叫做胡一菲的老师监考。”\u003c/p\u003e\n\u003cp\u003e“大哥，你一刀杀了我吧，你到底要问什么？”曾小贤抓着头发。\u003c/p\u003e\n\u003cp\u003e“我不知道我女神叫做什么名字，万一胡一菲老师严厉，我乱写名字的事被拆穿怎么办？”\u003c/p\u003e\n\u003cp\u003e“一菲监考，我已经想象到10086种你的死法了，完了，你没救了，我怎么知道那个能起那么非主流昵称的奇葩叫什么名字。你直接问她不就得了。”\u003c/p\u003e\n\u003cp\u003e“她不怎么在线，而且也就和她聊过几句话而已。”\u003c/p\u003e\n\u003cp\u003e“什么？你也太草率了吧，才聊了几句话你就喜欢上她了？”\u003c/p\u003e\n\u003cp\u003e“哎，这不能怪我，只能怪她太可爱了，连计算都那么有趣，‘一一得一，一二得二。三八妇女节，五一劳动节，六一儿童节’\u0026hellip;\u0026hellip;”\u003c/p\u003e\n\u003cp\u003e曾小贤一怔，咽了咽口水，“陈——美——嘉。”\u003c/p\u003e\n\u003cp\u003e“陈美嘉？这就是她的名字啊，你太厉害了，谢谢曾老师，再见。”\u003c/p\u003e\n\u003cp\u003e 曾小贤抹了抹脸上的汗，“有请下一位听众。”\u003c/p\u003e\n\u003cp\u003e“曾老师，不知道是谁说视听说不会挂的，害我白高兴一场，结果我58分挂了，差两分都不让我过，害得我少收了100张红发毛爷爷。”\u003c/p\u003e\n\u003cp\u003e“这位同学，首先你应该值得庆幸，我逛华商贴吧看到一个视听说59分还挂了的，其次，你家是开银行的吧，最后，这个才是重点，这视听说怎么来问我了？”\u003c/p\u003e\n\u003cp\u003e  曾小贤场外音，【我的乖乖，我英语平时能考50分都算展博附体了。】\u003c/p\u003e\n\u003cp\u003e  “我当然不是问你视听说的问题，问你我还不如问明星饭堂打饭的阿姨呢，说笑呢，曾老师是个好男人应该不会介意的吧。我是想问下，你能弄到补考试题的答案吗？”女生小声问道。\u003c/p\u003e\n\u003cp\u003e “什么？答案？这我可办不到了，去年华商管理学漏题上了电视，而我除了出现在电视剧里，可不想上新闻节目了。”\u003c/p\u003e\n\u003cp\u003e “还说自己是什么好男人，果然经常说自己是好男人的往往都不可靠\u0026hellip;\u0026hellip;”\u003c/p\u003e\n\u003cp\u003e “嘟嘟嘟嘟，”挂了。\u003c/p\u003e\n\u003cp\u003e “果然还是好男人难做啊，话说，能来个正常点的听众吗？”\u003c/p\u003e\n\u003cp\u003e 华商街上。\u003c/p\u003e\n\u003cp\u003e“经过路过不要错过，一定还有莘莘学子担忧社会实践报告的盖章问题吧，放心，有我吕小布在，包你们全部过了。”子乔坐在大排档旁边的桌子上喊道。\u003c/p\u003e\n\u003cp\u003e 一个女生经过，“说吧，多少钱？”\u003c/p\u003e\n\u003cp\u003e 子乔暗忖，这个女生说话一针见血，恐怕一般言语蛊惑不了她，我似乎不知在第几季第几集说过这么一句话，剧本背多了还真快忘，“关键时刻来几句女生听不懂的话，可以有效提升你的魅力。”想到了，有了。\u003c/p\u003e\n\u003cp\u003e子乔拿出一个萝卜章，“这位美女，你可不要小看这萝卜章，这个可不是一般的萝卜，它是用希米亚泥土栽培，每天淋上100毫升但丁圣水，经过九九八十一天紫外线照射才能收获，用它刻的章能够让你精神焕发\u0026hellip;\u0026hellip;”\u003c/p\u003e\n\u003cp\u003e“停，我问你，多少钱？”\u003c/p\u003e\n\u003cp\u003e子乔一翻白眼，“好吧，我认栽。50块钱，顺丰包邮，你值得拥有。”\u003c/p\u003e\n\u003cp\u003e“你抢银行吧，还顺丰，哪来的顺丰？”\u003c/p\u003e\n\u003cp\u003e子乔一听，立马从地上拿起一个小盒子，上面赫然印着两个大字——顺丰。\u003c/p\u003e\n\u003cp\u003e“这——都——行。”\u003c/p\u003e\n\u003cp\u003e\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003cp\u003e                                                                                                                            【开学篇完结】\u003c/p\u003e\n\u003cp\u003e注：本文转自我哥的日志。\u003c/p\u003e","title":"爱情公寓华商特别篇"},{"content":"孤单心事是一首我很喜欢的歌曲，以至于手机用来存储歌曲的文件夹也被我命名为孤单心事，这里也继续沿用吧。\n该分类是我用来存放关于音乐的一切。\n我热爱音乐，有的会让我安静，有的则会让我燃起热情。在这里，你或许会看到整整齐齐的推荐列表，参差不齐的对某些歌的看法。\n如果你发现我喜欢的歌曲，和你的很像，可以留个言哦。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E5%85%B3%E4%BA%8E%E5%AD%A4%E5%8D%95%E5%BF%83%E4%BA%8B/","summary":"\u003cp\u003e孤单心事是一首我很喜欢的歌曲，以至于手机用来存储歌曲的文件夹也被我命名为孤单心事，这里也继续沿用吧。\u003c/p\u003e\n\u003cp\u003e该分类是我用来存放关于音乐的一切。\u003c/p\u003e\n\u003cp\u003e我热爱音乐，有的会让我安静，有的则会让我燃起热情。在这里，你或许会看到整整齐齐的推荐列表，参差不齐的对某些歌的看法。\u003c/p\u003e\n\u003cp\u003e如果你发现我喜欢的歌曲，和你的很像，可以留个言哦。\u003c/p\u003e","title":"关于孤单心事"},{"content":"Ok，之前一直懒得写，现在刚上SSD（2014年国庆上的），一边给自己刚装的win8加料，一边写。\n1.激活win8\n安装了2次 KMS_for_Windows8.1 才ok，郁闷。两次都是要我强制kill掉进程。\n2.我安装的这个win8版本默认就是Administrator用户，现在我要切换为我自己的微软用户。\n使用“Win+R”快捷键或右键单击左下角，进入运行界面;输入“netplwiz”进入用户帐户设置界面。\n1.1 首先 添加用户 。 输入完邮箱，在网络连接状态下即可添加成功。\n1.2 更改组成员为管理员\n1.3 去掉需要密码的勾，确认后，需填写用户名和密码，用户名要用自己的邮箱全称，不要用默认填写好的。\n1.4 禁用administrator用户：运行 gpedit.msc 。在组策略编辑器左边面板依次展开：“计算机配置”\u0026ndash;“Windows设置”\u0026ndash;“安全设置”- -“本地策略”\u0026ndash;“安全选项”，找到“账户：管理员账户状态”的选项。改为禁用。\n1.5 最后就可以切换用户了\n3.将文档默认位置更改为我特定的盘\n这里不作详细说明\n4.安装驱动\n现在已经把所有需要安装的驱动程式备份了。\n5.安装各种应用\u0026hellip;.\n**PS.**win8.1不自带.net3.0 2.0.\n如果我们要用到，快速的方法就是将系统镜像映射到光驱，然后输入下面的命令：\n如果无法连接到 Internet，则可以通过使用部署映像服务和管理 (DISM) 命令行工具并指定从中安装了 Windows 8 的安装媒体（ISO 映像或 DVD），来启用 .NET Framework 3.5。\n1. 在 Windows 8 或 Windows Server 2012 中，使用管理凭据打开命令提示符窗口（即选择“以管理员身份运行”）。\n2. 要从位于 D:\\sources\\sxs 目录中的安装媒体安装 .NET Framework 3.5，请使用以下命令：\nDISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:d:\\sources\\sxs\n其中：\n- /Online 面向您正在运行的操作系统（而不是脱机 Windows 映像）。\n- /Enable-Feature /FeatureName:NetFx3 指定您需要启用 .NET Framework 3.5。\n- /All 启用 .NET framework 3.5 的所有上级功能。\n- /LimitAccess 防止 DISM 与 Windows Update 连接。\n- /Source 指定还原功能需要的文件位置（在本示例中，D:\\sources\\sxs 目录）。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/win8%E6%96%B0%E8%A3%85%E7%B3%BB%E7%BB%9F-%E5%BF%85%E5%81%9A%E5%8A%9F%E8%AF%BE/","summary":"\u003cp\u003eOk，之前一直懒得写，现在刚上SSD（2014年国庆上的），一边给自己刚装的win8加料，一边写。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.激活win8\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e安装了2次 KMS_for_Windows8.1 才ok，郁闷。两次都是要我强制kill掉进程。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2.我安装的这个win8版本默认就是Administrator用户，现在我要切换为我自己的微软用户。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e使用“Win+R”快捷键或右键单击左下角，进入运行界面;输入“netplwiz”进入用户帐户设置界面。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.1\u003c/strong\u003e  首先 \u003cstrong\u003e添加用户 。\u003c/strong\u003e 输入完邮箱，在网络连接状态下即可添加成功。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.2\u003c/strong\u003e  更改组成员为管理员\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.3\u003c/strong\u003e  去掉需要密码的勾，确认后，需填写用户名和密码，用户名要用自己的邮箱全称，不要用默认填写好的。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.4\u003c/strong\u003e  禁用administrator用户：运行 gpedit.msc 。在组策略编辑器左边面板依次展开：“计算机配置”\u0026ndash;“Windows设置”\u0026ndash;“安全设置”-    -“本地策略”\u0026ndash;“安全选项”，找到“账户：管理员账户状态”的选项。改为禁用。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1.5\u003c/strong\u003e  最后就可以切换用户了\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3.将文档默认位置更改为我特定的盘\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这里不作详细说明\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4.安装驱动\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e现在已经把所有需要安装的驱动程式备份了。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e5.安装各种应用\u0026hellip;.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e**PS.**\u003cstrong\u003ewin8.1不自带.net3.0 2.0.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e如果我们要用到，快速的方法就是将系统镜像映射到光驱，然后输入下面的命令：\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e如果无法连接到 Internet，则可以通过使用部署映像服务和管理 (DISM) 命令行工具并指定从中安装了 Windows 8 的安装媒体（ISO 映像或 DVD），来启用 .NET Framework 3.5。\u003c/p\u003e\n\u003cp\u003e    1. 在 Windows 8 或 Windows Server 2012 中，使用管理凭据打开命令提示符窗口（即选择“以管理员身份运行”）。\u003c/p\u003e\n\u003cp\u003e    2. 要从位于 D:\\sources\\sxs 目录中的安装媒体安装 .NET Framework 3.5，请使用以下命令：\u003c/p\u003e\n\u003cp\u003eDISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:d:\\sources\\sxs\u003c/p\u003e\n\u003cp\u003e其中：\u003c/p\u003e\n\u003cp\u003e        - /Online 面向您正在运行的操作系统（而不是脱机 Windows 映像）。\u003c/p\u003e","title":"win8新装系统 - 必做功课"},{"content":"我的本本安装win7时，我就讲IE升级到11了。\n近期打开IE，主要窗体竟然是空白。郁闷了好久，点开高级设置，点击还原设置。提示关闭所有IE页才能还原。\n没有打开IE的我顿时不知道这提示是什么意思，后来百度了下，解决方案是：\n关闭关于IExplorer的所有进程，然后再重置。\n我打开任务管理器，里面还真是有IExplorer的几个进程，我kill掉后重置IE。\n重开IE，真的可以了。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/ie11-for-win7%E6%89%93%E5%BC%80%E7%A9%BA%E7%99%BD/","summary":"\u003cp\u003e我的本本安装win7时，我就讲IE升级到11了。\u003c/p\u003e\n\u003cp\u003e近期打开IE，主要窗体竟然是空白。郁闷了好久，点开高级设置，点击还原设置。提示关闭所有IE页才能还原。\u003c/p\u003e\n\u003cp\u003e没有打开IE的我顿时不知道这提示是什么意思，后来百度了下，解决方案是：\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e关闭关于IExplorer的所有进程，然后再重置。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我打开任务管理器，里面还真是有IExplorer的几个进程，我kill掉后重置IE。\u003c/p\u003e\n\u003cp\u003e重开IE，真的可以了。\u003c/p\u003e","title":"IE11 for Win7打开空白"},{"content":"我安装的frontopen2主题，是有为文章添加一个浏览量字段的。今天突然发现，我发表的文章浏览量全都是0。这使我很郁闷，就算只有我一个人访问，也不应该是0。\n我找到了frontopen2对应地方的代码，没发现问题。数据库中看，每发表一篇文章，都会创建一条浏览量的记录，可见INSERT命令是可以执行的，那么UPDATE为什么不行呢，百思不得其解后，突然意识到如果php没有获取到文章id是没有办法更新数据的。\n我果断打开wp的后台管理，此时我的固定链接样式是index.php/archives/%post_id%，将其改成默认的/?p=123后。浏览量可以正常地加1 了。看来是php没有获取到URL中的post_id。\n再然后，我将样式改为/archives/%post_id%。点击文章时就跳转不过去了。\n是的，正是httpd.conf文件中，Directory 节点中的 AllowOverride为None。\n我们只要将其改为All就好了。\n这时，无论固定链接的样式改成什么，都可以访问，且浏览量能够正常地+1啦~~ ps：修改 \u0026lt;Directory \u0026ldquo;/var/www/html\u0026rdquo;\u0026gt; 下的AllowOverride就好 。\n\u0026lt;Directory \u0026ldquo;/var/www/icons\u0026rdquo;\u0026gt; \u0026lt;Directory \u0026ldquo;/var/www/cgi-bin\u0026rdquo;\u0026gt; 这些就没有必要改了 。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/wordpress%E5%9B%BA%E5%AE%9A%E9%93%BE%E6%8E%A5%E7%9A%84%E9%97%AE%E9%A2%98/","summary":"\u003cp\u003e我安装的frontopen2主题，是有为文章添加一个浏览量字段的。今天突然发现，我发表的文章浏览量全都是0。这使我很郁闷，就算只有我一个人访问，也不应该是0。\u003c/p\u003e\n\u003cp\u003e我找到了frontopen2对应地方的代码，没发现问题。数据库中看，每发表一篇文章，都会创建一条浏览量的记录，可见INSERT命令是可以执行的，那么UPDATE为什么不行呢，百思不得其解后，突然意识到如果php没有获取到文章id是没有办法更新数据的。\u003c/p\u003e\n\u003cp\u003e我果断打开wp的后台管理，此时我的固定链接样式是index.php/archives/%post_id%，将其改成默认的/?p=123后。浏览量可以正常地加1 了。看来是php没有获取到URL中的post_id。\u003c/p\u003e\n\u003cp\u003e再然后，我将样式改为/archives/%post_id%。点击文章时就跳转不过去了。\u003c/p\u003e\n\u003cp\u003e是的，正是httpd.conf文件中，Directory 节点中的 AllowOverride为None。\u003c/p\u003e\n\u003cp\u003e我们只要将其改为All就好了。\u003c/p\u003e\n\u003cp\u003e这时，无论固定链接的样式改成什么，都可以访问，且浏览量能够正常地+1啦~~ \u003c/p\u003e\n\u003cp\u003eps：修改\u003c!-- raw HTML omitted --\u003e  \u0026lt;Directory \u0026ldquo;/var/www/html\u0026rdquo;\u0026gt; 下的AllowOverride就好 。\u003c/p\u003e\n\u003cp\u003e\u0026lt;Directory \u0026ldquo;/var/www/icons\u0026rdquo;\u0026gt; \u0026lt;Directory \u0026ldquo;/var/www/cgi-bin\u0026rdquo;\u0026gt; 这些就没有必要改了 。\u003c/p\u003e","title":"WordPress固定链接的问题"},{"content":"有时候为了区分业务，给不同二级域名配置不同的站点也是很不错的。 以下配置的环境是：CentOS + Apache 首先在 httpd/conf/httpd.conf, 将其中的 ServerAdmin ServerName DocumentRoot 注释掉。 其中看到有一行是： Include conf.d/*.conf 既然已经包含了所有conf文件，那我就直接开干了。 以下是apache配置目录下的文件，很清楚地看到没有vhosts.conf之类的文件，那么我们自己在conf.d目录下创建\n[root@foam conf.d]# tree /etc/httpd/ -L 3 /etc/httpd/ |-- conf | |-- httpd.conf | |-- httpd.conf.bak.2014.12.10 | |-- httpd.conf.bak.2014.12.2 | |-- httpd.conf.rpmsave | `-- magic |-- conf.d | |-- README | |-- php.conf | `-- welcome.conf |-- logs -\u0026gt; ../../var/log/httpd |-- modules -\u0026gt; ../../usr/lib64/httpd/modules `-- run -\u0026gt; ../../var/run/httpd 5 directories, 8 files vhosts.conf文件内容如下：\nNameVirtualHost *:80 #这行我一开始漏掉了，导致访问的一直是第一个虚拟站点，很郁闷啊。 \u0026lt;VirtualHost *:80\u0026gt; ServerAdmin #管理员账号，如 root@localhost DocumentRoot #该主机的目录，如 /var/www/html ServerName #域名1,如 zoufeng.me ServerAlias #别名（可选），如 www.zoufeng.me ErrorLog \u0026#34;logs/域名1-error.log\u0026#34; CustomLog \u0026#34;logs/域名1-access.log\u0026#34; combined \u0026lt;Directory \u0026#34;/var/www/html\u0026#34;\u0026gt; order allow,deny allow from all \u0026lt;/Directory\u0026gt; \u0026lt;/VirtualHost\u0026gt; \u0026lt;VirtualHost *:80\u0026gt; ServerAdmin #管理员账号，如 root@localhost DocumentRoot #该主机的目录，如 /var/www/html2 ServerName #域名2,如 m.zoufeng.me ServerAlias #别名（可选） ErrorLog \u0026#34;logs/域名2-error.log\u0026#34; CustomLog \u0026#34;logs/域名2-access.log\u0026#34; combined \u0026lt;Directory \u0026#34;/var/www/html\u0026#34;\u0026gt; order allow,deny allow from all \u0026lt;/Directory\u0026gt; \u0026lt;/VirtualHost\u0026gt; 编辑后，重启apache服务\n[root@foam conf.d]# service httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ] ","permalink":"https://blog-foamzou-com.pages.dev/posts/%E7%BB%99%E4%B8%8D%E5%90%8C%E5%9F%9F%E5%90%8D%E9%85%8D%E7%BD%AE%E4%B8%8D%E5%90%8C%E8%99%9A%E6%8B%9F%E7%AB%99%E7%82%B9/","summary":"\u003cp\u003e有时候为了区分业务，给不同二级域名配置不同的站点也是很不错的。 以下配置的环境是：CentOS + Apache 首先在 httpd/conf/httpd.conf, 将其中的 ServerAdmin ServerName DocumentRoot 注释掉。 其中看到有一行是： Include conf.d/*.conf 既然已经包含了所有conf文件，那我就直接开干了。 以下是apache配置目录下的文件，很清楚地看到没有vhosts.conf之类的文件，那么我们自己在conf.d目录下创建\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e@\u003c/span\u003e\u003cspan class=\"nx\"\u003efoam\u003c/span\u003e \u003cspan class=\"nx\"\u003econf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ed\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"c1\"\u003e# tree /etc/httpd/ -L 3\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003eetc\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003ehttpd\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e|--\u003c/span\u003e \u003cspan class=\"nx\"\u003econf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e   \u003cspan class=\"o\"\u003e|--\u003c/span\u003e \u003cspan class=\"nx\"\u003ehttpd\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e   \u003cspan class=\"o\"\u003e|--\u003c/span\u003e \u003cspan class=\"nx\"\u003ehttpd\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebak\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e2014.12\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e   \u003cspan class=\"o\"\u003e|--\u003c/span\u003e \u003cspan class=\"nx\"\u003ehttpd\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebak\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e2014.12\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e   \u003cspan class=\"o\"\u003e|--\u003c/span\u003e \u003cspan class=\"nx\"\u003ehttpd\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erpmsave\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e   \u003cspan class=\"sb\"\u003e`-- magic\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e|-- conf.d\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e|   |-- README\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e|   |-- php.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"sb\"\u003e|   `\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e \u003cspan class=\"nx\"\u003ewelcome\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e|--\u003c/span\u003e \u003cspan class=\"nx\"\u003elogs\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e../../\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003ehttpd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e|--\u003c/span\u003e \u003cspan class=\"nx\"\u003emodules\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e../../\u003c/span\u003e\u003cspan class=\"nx\"\u003eusr\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003elib64\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003ehttpd\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003emodules\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e \u003cspan class=\"nx\"\u003erun\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e../../\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003erun\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003ehttpd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e5\u003c/span\u003e \u003cspan class=\"nx\"\u003edirectories\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e \u003cspan class=\"nx\"\u003efiles\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003evhosts.conf文件内容如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eNameVirtualHost\u003c/span\u003e \u003cspan class=\"o\"\u003e*:\u003c/span\u003e\u003cspan class=\"mi\"\u003e80\u003c/span\u003e  \u003cspan class=\"c1\"\u003e#这行我一开始漏掉了，导致访问的一直是第一个虚拟站点，很郁闷啊。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nx\"\u003eVirtualHost\u003c/span\u003e \u003cspan class=\"o\"\u003e*:\u003c/span\u003e\u003cspan class=\"mi\"\u003e80\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eServerAdmin\u003c/span\u003e \u003cspan class=\"c1\"\u003e#管理员账号，如 root@localhost\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eDocumentRoot\u003c/span\u003e \u003cspan class=\"c1\"\u003e#该主机的目录，如 /var/www/html\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eServerName\u003c/span\u003e \u003cspan class=\"c1\"\u003e#域名1,如 zoufeng.me\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eServerAlias\u003c/span\u003e \u003cspan class=\"c1\"\u003e#别名（可选），如 www.zoufeng.me\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eErrorLog\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;logs/域名1-error.log\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eCustomLog\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;logs/域名1-access.log\u0026#34;\u003c/span\u003e \u003cspan class=\"nx\"\u003ecombined\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nx\"\u003eDirectory\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/var/www/html\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eorder\u003c/span\u003e \u003cspan class=\"nx\"\u003eallow\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nx\"\u003edeny\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eallow\u003c/span\u003e \u003cspan class=\"nx\"\u003efrom\u003c/span\u003e \u003cspan class=\"nx\"\u003eall\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nx\"\u003eDirectory\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nx\"\u003eVirtualHost\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nx\"\u003eVirtualHost\u003c/span\u003e \u003cspan class=\"o\"\u003e*:\u003c/span\u003e\u003cspan class=\"mi\"\u003e80\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eServerAdmin\u003c/span\u003e \u003cspan class=\"c1\"\u003e#管理员账号，如 root@localhost\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eDocumentRoot\u003c/span\u003e \u003cspan class=\"c1\"\u003e#该主机的目录，如 /var/www/html2\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eServerName\u003c/span\u003e \u003cspan class=\"c1\"\u003e#域名2,如 m.zoufeng.me\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eServerAlias\u003c/span\u003e \u003cspan class=\"c1\"\u003e#别名（可选）\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eErrorLog\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;logs/域名2-error.log\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eCustomLog\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;logs/域名2-access.log\u0026#34;\u003c/span\u003e \u003cspan class=\"nx\"\u003ecombined\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nx\"\u003eDirectory\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;/var/www/html\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eorder\u003c/span\u003e \u003cspan class=\"nx\"\u003eallow\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nx\"\u003edeny\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eallow\u003c/span\u003e \u003cspan class=\"nx\"\u003efrom\u003c/span\u003e \u003cspan class=\"nx\"\u003eall\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nx\"\u003eDirectory\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nx\"\u003eVirtualHost\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e编辑后，重启apache服务\u003c/p\u003e","title":"给不同域名配置不同虚拟站点"},{"content":"12月6日，下载了RC4版本。\n安装后迫不及待新建了一个Project，运行。\n出现一个错误提示：\nADB not responding. You can wait more,or kill\u0026quot;abd.exe\u0026quot; process manually and click \u0026lsquo;Restart\u0026rsquo; ABD.exe使用的5037端口被占用了。找到哪个进程占用了该端口，然后把它kill掉就行了。\nnetstat -ano | findstr \u0026ldquo;5037\u0026rdquo;\n","permalink":"https://blog-foamzou-com.pages.dev/posts/abd-exe%E7%AB%AF%E5%8F%A3%E9%97%AE%E9%A2%98/","summary":"\u003cp\u003e12月6日，下载了RC4版本。\u003c/p\u003e\n\u003cp\u003e安装后迫不及待新建了一个Project，运行。\u003c/p\u003e\n\u003cp\u003e出现一个错误提示：\u003c/p\u003e\n\u003ch5 id=\"adb-not-responding-you-can-wait-moreor-killabdexe-process-manually-and-click-restart\"\u003eADB not responding. You can wait more,or kill\u0026quot;abd.exe\u0026quot; process manually and click \u0026lsquo;Restart\u0026rsquo;\u003c/h5\u003e\n\u003cp\u003eABD.exe使用的5037端口被占用了。找到哪个进程占用了该端口，然后把它kill掉就行了。\u003c/p\u003e\n\u003cp\u003enetstat -ano | findstr \u0026ldquo;5037\u0026rdquo;\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"2\" loading=\"lazy\" src=\"/posts/abd-exe%E7%AB%AF%E5%8F%A3%E9%97%AE%E9%A2%98/2.jpg\"\u003e\u003c/p\u003e","title":"abd.exe端口问题"},{"content":"BBQScreen 从其他小伙伴了解到这款软件，帧率挺高，是目前看到过最顺畅的。建议用PC开个热点，安卓连接上PC使用。 传送门：点击我\nVNC 这款我用着没有BBQScreen顺畅~~\nVNC (Virtual Network Computer)，即虚拟网络计算机。是基于Unix和Linux的开源软件。\nVNC Viewer for Windows是VNC的客户端，我们只需要在安卓手机上安装VNC-Server服务器端就可以实现将安卓屏幕投影到PC端，并且在PC端也可以操控安卓端。\nPC端\n安卓端\n由于是在局域网里，图像质量还不错，但传输还是一帧一帧的，如果演示对流畅度有要求的，还是使用模拟器吧，目前我还没找到投影顺畅的软件。如果你找到了，留个言哦。\n最后留下下载链接：点击我\n","permalink":"https://blog-foamzou-com.pages.dev/posts/vnc%E5%AE%9E%E7%8E%B0pc%E8%BF%9E%E6%8E%A5%E5%AE%89%E5%8D%93%E6%89%8B%E6%9C%BA/","summary":"\u003ch1 id=\"bbqscreen\"\u003eBBQScreen\u003c/h1\u003e\n\u003cp\u003e从其他小伙伴了解到这款软件，帧率挺高，是目前看到过最顺畅的。建议用PC开个热点，安卓连接上PC使用。 传送门：\u003ca href=\"http://pan.baidu.com/s/1sjNmY77\" title=\"点击我\"\u003e点击我\u003c/a\u003e\u003c/p\u003e\n\u003ch1 id=\"vnc\"\u003e\u003cstrong\u003eVNC\u003c/strong\u003e\u003c/h1\u003e\n\u003cp\u003e这款我用着没有BBQScreen顺畅~~\u003c/p\u003e\n\u003cp\u003eVNC (Virtual Network Computer)，即虚拟网络计算机。是基于Unix和Linux的开源软件。\u003c/p\u003e\n\u003cp\u003eVNC Viewer for Windows是VNC的客户端，我们只需要在安卓手机上安装VNC-Server服务器端就可以实现将安卓屏幕投影到PC端，并且在PC端也可以操控安卓端。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePC端\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003cimg alt=\"clipboard\" loading=\"lazy\" src=\"/posts/vnc%E5%AE%9E%E7%8E%B0pc%E8%BF%9E%E6%8E%A5%E5%AE%89%E5%8D%93%E6%89%8B%E6%9C%BA/clipboard1-300x163.png\"\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e安卓端\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"screenshot_2014-12-05-17-32-35.png\"\u003e\u003cimg alt=\"screenshot_2014-12-05-17-32-35\" loading=\"lazy\" src=\"/posts/vnc%E5%AE%9E%E7%8E%B0pc%E8%BF%9E%E6%8E%A5%E5%AE%89%E5%8D%93%E6%89%8B%E6%9C%BA/screenshot_2014-12-05-17-32-35-184x300.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e由于是在局域网里，图像质量还不错，但传输还是一帧一帧的，如果演示对流畅度有要求的，还是使用模拟器吧，目前我还没找到投影顺畅的软件。如果你找到了，留个言哦。\u003c/p\u003e\n\u003cp\u003e最后留下下载链接：\u003ca href=\"http://pan.baidu.com/s/1kTiN8Sv\" title=\"点击我\"\u003e点击我\u003c/a\u003e\u003c/p\u003e","title":"将安卓APP投影到PC"},{"content":"本月1号凌晨在Kvmla买了个VPS，倒也便宜，99RMB/年。配置和流量也足够我使用了。 本站之前是挂在香港虚拟主机的，延迟还好，只有10-100ms，但经常调整线路，这段时间经常连接不上。买了VPS后，马上有了将站点搬迁过去的想法。 虚拟主机只放置了WP文件，数据库是放在阿里的，阿里我还是很放心的，所以计划是不动数据库，将WP文件拷贝到VPS站点下就好。 因为我这个VPS不过200-300ms的延迟，所以当我点开首页，等了好久看到10+s的加载时间，瞬间心凉了。刚开始以为是WordPress程序的问题，后来意识到了是远程数据库的原因。这么一去一回，加上延迟丢包真心是受不了。 所以只好将阿里的数据库导出来，然后导入我的CentOS里的Mysql里。这里字符编码问题也卡了一会，以后导入导出数据要看清文字编码啦~~ 轻轻点开我的站点，这次终于让我看到了丝丝顺滑的感觉。 最后解决了些小问题，倒也是弄到凌晨3点多，到此时，说好的不熬夜计划还是没有愉快地进行下去：( 至此，我的小站也算是安置好了，不知道按我这种各种拖延症、写东西毅力不强的人来说，写博客能坚持多久呢。请大家监督我，我叫foam，多多指教 ：） BTW：昨晚在putty敲了好多命令，那时间vps倒挺乖，各种顺畅，没有卡的感觉。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/move-to-vps/","summary":"\u003cp\u003e本月1号凌晨在\u003ca href=\"http://www.kvmla.com/aff.php?aff=1965\"\u003eKvmla\u003c/a\u003e买了个VPS，倒也便宜，99RMB/年。配置和流量也足够我使用了。 本站之前是挂在香港虚拟主机的，延迟还好，只有10-100ms，但经常调整线路，这段时间经常连接不上。买了VPS后，马上有了将站点搬迁过去的想法。 虚拟主机只放置了WP文件，数据库是放在阿里的，阿里我还是很放心的，所以计划是不动数据库，将WP文件拷贝到VPS站点下就好。 因为我这个VPS不过200-300ms的延迟，所以当我点开首页，等了好久看到10+s的加载时间，瞬间心凉了。刚开始以为是WordPress程序的问题，后来意识到了是远程数据库的原因。这么一去一回，加上延迟丢包真心是受不了。 所以只好将阿里的数据库导出来，然后导入我的CentOS里的Mysql里。这里字符编码问题也卡了一会，以后导入导出数据要看清文字编码啦~~ 轻轻点开我的站点，这次终于让我看到了丝丝顺滑的感觉。 最后解决了些小问题，倒也是弄到凌晨3点多，到此时，说好的不熬夜计划还是没有愉快地进行下去：( 至此，我的小站也算是安置好了，不知道按我这种各种拖延症、写东西毅力不强的人来说，写博客能坚持多久呢。请大家监督我，我叫foam，多多指教 ：） BTW：昨晚在putty敲了好多命令，那时间vps倒挺乖，各种顺畅，没有卡的感觉。\u003c/p\u003e","title":"搬迁到VPS"},{"content":"google被墙后，那些直接调用Google服务（比如Font）的网站就悲催了，由于访问google服务文件超时，打开个网页都要等个10+秒、\n对此类网页，一般等得差不多了，直接点击**停止加载此页。**少了这google font也不影响。但每次都点击停止加载还是很纠结的。\nwp-admin下的文件很遗憾，都加载了google font，对此，用以下方法解决：\n1、修改源码\n通过浏览器开发工具可以看到是哪个文件超时了。打开它，将连接到google的代码注释掉。\n2、插件实现\nDisable Google Fonts Remove Open Sans font Link from WP\n我使用的是前者，安装插件这种方法简单，不熟悉PHP的小伙伴用这种方法就好。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/wp-admin%E4%BD%BF%E7%94%A8%E8%B0%B7%E6%AD%8C%E5%AD%97%E4%BD%93%E5%AF%BC%E8%87%B4%E5%8A%A0%E8%BD%BD%E6%85%A2%E7%9A%84%E9%97%AE%E9%A2%98/","summary":"\u003cp\u003egoogle被墙后，那些直接调用Google服务（比如Font）的网站就悲催了，由于访问google服务文件超时，打开个网页都要等个10+秒、\u003c/p\u003e\n\u003cp\u003e对此类网页，一般等得差不多了，直接点击**停止加载此页。**少了这google font也不影响。但每次都点击停止加载还是很纠结的。\u003c/p\u003e\n\u003cp\u003ewp-admin下的文件很遗憾，都加载了google font，对此，用以下方法解决：\u003c/p\u003e\n\u003cp\u003e1、修改源码\u003c/p\u003e\n\u003cp\u003e通过浏览器开发工具可以看到是哪个文件超时了。打开它，将连接到google的代码注释掉。\u003c/p\u003e\n\u003cp\u003e2、插件实现\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDisable Google Fonts\u003c/strong\u003e Remove Open Sans font Link from WP\u003c/p\u003e\n\u003cp\u003e我使用的是前者，安装插件这种方法简单，不熟悉PHP的小伙伴用这种方法就好。\u003c/p\u003e","title":"wp-admin使用谷歌字体导致加载慢的问题"},{"content":"在windows和虚拟主机都是没有问题的。虚拟主机上，尽管也是linux，但主机商会把权限给用户，所以标题两个问题都没有冒出来。\n昨晚挂到VPS上，就出现问题了:\n1、安装插件需要提供FTP密码，这个不仅输入麻烦，丢包延迟严重的时候，FTP都无法Connect。\n2、我使用的是frontopen2的主题(真心不错)，文章如果有图片，列表就图裂了。原因是timthumb.php没有访问主题目录下的cache及里面的index.html权限。\n解决问题1，可以把该网站的所有者权限设置为web服务器角色。(需要root权限)\nchown -R apache /var/www/html\nBTW：我的CentOS的web服务器角色，名字是apache、其他系统也可能是www之类的。这里我的网站目录是html，可根据你的实际目录填写\n解决问题2，将cache目录和子文件的权限设置为可读写执行\nchmod -R 777 /var/www/html/wp-content/themes/你的主题/cache\n至此以上问题解决\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E8%A7%A3%E5%86%B3wordpress%E5%AE%89%E8%A3%85%E6%8F%92%E4%BB%B6%E9%9C%80%E8%A6%81%E6%8F%90%E4%BE%9Bftp%E8%B4%A6%E5%8F%B7%E5%AF%86%E7%A0%81%E5%92%8Ctimthumb-php%E7%9A%84%E8%AE%BF%E9%97%AE%E6%9D%83/","summary":"\u003cp\u003e在windows和虚拟主机都是没有问题的。虚拟主机上，尽管也是linux，但主机商会把权限给用户，所以标题两个问题都没有冒出来。\u003c/p\u003e\n\u003cp\u003e昨晚挂到VPS上，就出现问题了:\u003c/p\u003e\n\u003cp\u003e1、安装插件需要提供FTP密码，这个不仅输入麻烦，丢包延迟严重的时候，FTP都无法Connect。\u003c/p\u003e\n\u003cp\u003e2、我使用的是\u003ca href=\"http://www.frontopen.com/\" title=\"frontopen主题官方站\"\u003efrontopen2\u003c/a\u003e的主题(真心不错)，文章如果有图片，列表就图裂了。原因是timthumb.php没有访问主题目录下的cache及里面的index.html权限。\u003c/p\u003e\n\u003cp\u003e解决问题1，可以把该网站的所有者权限设置为web服务器角色。(需要root权限)\u003c/p\u003e\n\u003cp\u003echown -R apache /var/www/html\u003c/p\u003e\n\u003cp\u003eBTW：我的CentOS的web服务器角色，名字是apache、其他系统也可能是www之类的。这里我的网站目录是html，可根据你的实际目录填写\u003c/p\u003e\n\u003cp\u003e解决问题2，将cache目录和子文件的权限设置为可读写执行\u003c/p\u003e\n\u003cp\u003echmod -R  777 /var/www/html/wp-content/themes/你的主题/cache\u003c/p\u003e\n\u003cp\u003e至此以上问题解决\u003c/p\u003e","title":"解决WordPress安装插件需要提供FTP账号密码和timthumb.php的访问权限问题"},{"content":"管理这种vps简直要让人抓狂，敲一行命令有时要等待好久~~ 连接上vps后，可设置这两项，这样可以在本地敲击完命令，Enter后，再将命令发送给终端。不过缺点也是很明显的，这样就无法使用tab和vim了。所以对于依赖tab的我，一般还是用不上的。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E5%AF%B9%E4%BA%8E%E9%AB%98%E5%BB%B6%E8%BF%9F%E7%9A%84%E4%B8%A2%E5%8C%85%E7%8E%87%E9%AB%98%E7%9A%84vps/","summary":"\u003cp\u003e管理这种vps简直要让人抓狂，敲一行命令有时要等待好久~~ 连接上vps后，可设置这两项，这样可以在本地敲击完命令，Enter后，再将命令发送给终端。不过缺点也是很明显的，这样就无法使用tab和vim了。所以对于依赖tab的我，一般还是用不上的。\u003cimg alt=\"clipboard\" loading=\"lazy\" src=\"/posts/%E5%AF%B9%E4%BA%8E%E9%AB%98%E5%BB%B6%E8%BF%9F%E7%9A%84%E4%B8%A2%E5%8C%85%E7%8E%87%E9%AB%98%E7%9A%84vps/clipboard.png\"\u003e\u003c/p\u003e","title":"对于高延迟、丢包率高的VPS"},{"content":"直接在服务器端修改： 修改server端的sshd_config文件\nvi etc/ssh/sshd_config ClientAliveInterval 60 ＃server 每隔60秒发送一次请求给client，然后client响应，从而保持连接。 ClientAliveCountMax 3 ＃server 发出请求后，客户端超过3次未响应，就断开。 然后还是会超时，最后悲剧地发现，忘记重启sshd了。\n/etc/init.d/sshd restart Ok，跟超时说88。 ============2015-03-18=========== 在DO买了个Vistual Server .安装的是CentOS7 64bit 上面的路径出不来了。用的是下面的命令\n[root@foam /]# service sshd restart Redirecting to /bin/systemctl restart sshd.service ","permalink":"https://blog-foamzou-com.pages.dev/posts/putty%E8%B6%85%E6%97%B6%E9%97%AE%E9%A2%98/","summary":"\u003cp\u003e直接在服务器端修改： 修改server端的sshd_config文件\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evi etc/ssh/sshd_config\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eClientAliveInterval \u003cspan class=\"m\"\u003e60\u003c/span\u003e ＃server 每隔60秒发送一次请求给client，然后client响应，从而保持连接。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eClientAliveCountMax \u003cspan class=\"m\"\u003e3\u003c/span\u003e ＃server 发出请求后，客户端超过3次未响应，就断开。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后还是会超时，最后悲剧地发现，忘记重启sshd了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/etc/init.d/sshd restart\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOk，跟超时说88。 ============2015-03-18=========== 在DO买了个Vistual Server .安装的是CentOS7 64bit 上面的路径出不来了。用的是下面的命令\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003eroot@foam /\u003cspan class=\"o\"\u003e]\u003c/span\u003e\u003cspan class=\"c1\"\u003e# service sshd restart\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRedirecting to /bin/systemctl restart sshd.service\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"putty超时问题"},{"content":"首先检查我的CentOS6是否预装apache [root@foam /]# rpm -qa | grep httpd httpd-tools-2.2.15-29.el6.centos.x86_64 httpd-2.2.15-29.el6.centos.x86_64 果然是安装了的，那么先卸载它。 [root@foam /]# rpm -e httpd warning: /etc/httpd/conf/httpd.conf saved as /etc/httpd/conf/httpd.conf.rpmsave 出来个警告，但是不影响卸载。一、安装Apache1. yum install httpd 2. [root@foam init.d]# /etc/init.d/httpd start Starting httpd: httpd: Could not reliably determine the server\u0026rsquo;s fully qualified domain name, using 23.245.26.38 for ServerName [ OK ] 没找到domain name，使用ip地址做为server name。 设置Domain [root@foam init.d]# cd /etc/httpd/conf [root@foam conf]# vim httpd.conf 找到ServerName。将前面的#去掉 ServerName zoufeng.com:80 ：wq 保存 [root@foam conf]# chkconfig httpd on #设为开机启动 [root@foam conf]# /etc/init.d/httpd restart #重启Apache Stopping httpd: [ OK ] Starting httpd: [ OK ] ps：安装并启动apache后，浏览器输入IP，可以访问了。二、安装Mysql1.安装 [root@foam conf]# yum install mysql mysql-server btw:下载速率有8.0M/s [root@foam ~]# /etc/init.d/mysqld start #启动 Initializing MySQL database: Installing MySQL system tables\u0026hellip; OK Filling help tables\u0026hellip; OK [root@foam ~]# chkconfig mysqld on #设置为开机启动 [root@foam ~]# cp /usr/share/mysql/my-medium.cnf /etc/my.cnf cp: overwrite `/etc/my.cnf\u0026rsquo;? #可以覆盖它 2.设置密码 [root@foam /]# mysql_secure_installation 提示需要输入密码 Enter current password for root (enter for none): （默认是空，直接enter即可） Set root password? [Y/n] 接下来输入两次新密码即可 提示是否把匿名用户删除 Remove anonymous users? [Y/n] y \u0026hellip; Success! 提示是否不允许root远程登录（安全起见，不允许） Disallow root login remotely? [Y/n] y \u0026hellip; Success! 后面还有两个询问，默认Y就可以。 重启Mysql [root@foam ~]# /etc/init.d/mysqld restart Stopping mysqld: [ OK ] Starting mysqld: [ OK ]三、安装PHP51.安装 [root@foam ~]# yum install php btw：这次是8.4MB/s 2.安装php组件 [root@foam ~]# yum install php-mysql php-gd libjpeg* php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-bcmath php-mhash libmcrypt 3.重启mysql和apache [root@foam ~]# /etc/init.d/mysqld restart Stopping mysqld: [ OK ] Starting mysqld: [ OK ] [root@foam ~]# /etc/init.d/httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ] 最后在/var/www/html/下新建index.php。 echo phpinfo(); 浏览器输入ip地址，看到了熟悉的php参数页面。配置成功！！ ==============至此LAMP搭建完成================== 如果希望调试PHP，希望显示错误信息，需要到 /etc/php.ini 修改\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E6%90%AD%E5%BB%BAlamp/","summary":"\u003cp\u003e首先检查我的CentOS6是否预装apache [root@foam /]# rpm -qa | grep httpd httpd-tools-2.2.15-29.el6.centos.x86_64 httpd-2.2.15-29.el6.centos.x86_64 果然是安装了的，那么先卸载它。 [root@foam /]# rpm -e httpd warning: /etc/httpd/conf/httpd.conf saved as /etc/httpd/conf/httpd.conf.rpmsave 出来个警告，但是不影响卸载。\u003cstrong\u003e一、安装Apache\u003c/strong\u003e1. yum install httpd 2. [root@foam init.d]# /etc/init.d/httpd start Starting httpd: httpd: Could not reliably determine the server\u0026rsquo;s fully qualified domain name, using 23.245.26.38 for ServerName [ OK ] 没找到domain name，使用ip地址做为server name。 设置Domain [root@foam init.d]# cd /etc/httpd/conf [root@foam conf]# vim httpd.conf 找到ServerName。将前面的#去掉 ServerName zoufeng.com:80 ：wq 保存 [root@foam conf]# chkconfig httpd on #设为开机启动 [root@foam conf]# /etc/init.d/httpd restart #重启Apache Stopping httpd: [ OK ] Starting httpd: [ OK ] ps：安装并启动apache后，浏览器输入IP，可以访问了。\u003cstrong\u003e二、安装Mysql\u003c/strong\u003e1.安装 [root@foam conf]# yum install mysql mysql-server btw:下载速率有8.0M/s [root@foam ~]# /etc/init.d/mysqld start #启动 Initializing MySQL database: Installing MySQL system tables\u0026hellip; OK Filling help tables\u0026hellip; OK [root@foam ~]# chkconfig mysqld on #设置为开机启动 [root@foam ~]# cp /usr/share/mysql/my-medium.cnf /etc/my.cnf cp: overwrite `/etc/my.cnf\u0026rsquo;? #可以覆盖它 2.设置密码 [root@foam /]# mysql_secure_installation 提示需要输入密码 Enter current password for root (enter for none): （默认是空，直接enter即可） Set root password? [Y/n] 接下来输入两次新密码即可 提示是否把匿名用户删除 Remove anonymous users? [Y/n] y \u0026hellip; Success! 提示是否不允许root远程登录（安全起见，不允许） Disallow root login remotely? [Y/n] y \u0026hellip; Success! 后面还有两个询问，默认Y就可以。 重启Mysql [root@foam ~]# /etc/init.d/mysqld restart Stopping mysqld: [ OK ] Starting mysqld: [ OK ]\u003cstrong\u003e三、安装PHP5\u003c/strong\u003e1.安装 [root@foam ~]# yum install php btw：这次是8.4MB/s 2.安装php组件 [root@foam ~]# yum install php-mysql php-gd libjpeg* php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-bcmath php-mhash libmcrypt 3.重启mysql和apache [root@foam ~]# /etc/init.d/mysqld restart Stopping mysqld: [ OK ] Starting mysqld: [ OK ] [root@foam ~]# /etc/init.d/httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ] 最后在/var/www/html/下新建index.php。 echo phpinfo(); 浏览器输入ip地址，看到了熟悉的php参数页面。配置成功！！ ==============至此LAMP搭建完成================== 如果希望调试PHP，希望显示错误信息，需要到 /etc/php.ini 修改\u003c/p\u003e","title":"搭建LAMP"},{"content":" 十一月伴随着周末就这样过去了，悄然袭来的是十二月，和突如其来的冷空气。 回首十一月，工作室的招新结束了，走进韶大的版本也在大家讨论中展露出了2.0版本的影子。很是期待全校学生手机上都装上它的时候。只是，大家又要开始忙了，我的PHP，注定还是要solo一段时间的。现在已经预见到了像暑假赶项目时的场景。 说到工作室，转变的确是蛮大的。好像很多元素在我们的推动下都开始往美好的方向走去，运营部的成立是我们改革的一个重要标识点，我们不能像以前一样沉浸在自己的象牙塔里了，或许周遭的事物为我们的改革添加了催化剂。突然感受到了清王朝被列强夹击时的反抗精神，一个强大的团体在遭受攻击时的反抗和自我的改革。我们不要做诺基亚身后的影子。 十二月，还是习惯说声加油，为你，为我。\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E5%8D%81%E4%BA%8C%E6%9C%88%E6%9D%A5%E4%BA%86/","summary":"\u003cp\u003e\u003cimg alt=\"12月来了\" loading=\"lazy\" src=\"/posts/%E5%8D%81%E4%BA%8C%E6%9C%88%E6%9D%A5%E4%BA%86/1417364211-1024x575.jpg\"\u003e 十一月伴随着周末就这样过去了，悄然袭来的是十二月，和突如其来的冷空气。             回首十一月，工作室的招新结束了，走进韶大的版本也在大家讨论中展露出了2.0版本的影子。很是期待全校学生手机上都装上它的时候。只是，大家又要开始忙了，我的PHP，注定还是要solo一段时间的。现在已经预见到了像暑假赶项目时的场景。 说到工作室，转变的确是蛮大的。好像很多元素在我们的推动下都开始往美好的方向走去，运营部的成立是我们改革的一个重要标识点，我们不能像以前一样沉浸在自己的象牙塔里了，或许周遭的事物为我们的改革添加了催化剂。突然感受到了清王朝被列强夹击时的反抗精神，一个强大的团体在遭受攻击时的反抗和自我的改革。我们不要做诺基亚身后的影子。 十二月，还是习惯说声加油，为你，为我。\u003c/p\u003e","title":"十二月来了"},{"content":"这个博客今年暑假就搭建起来了，但迟迟没有写点东西上来。这几天在做算法题，突然又燃起了写点技术文章的热情。顺带写写周围的人，身边的事也是极好的。 之前的主题实在是不忍直视，没有给人想阅读的感觉。今天晚上(发现现在是凌晨了~~)重新安装了WordPress，目的是将wp的数据库文件放置到阿里云，阿里的数据库应该会安全点。 另外，令人心情好的是，使用了一套漂亮的主题。这个主题是在志豪的个人博客发现的，看了下尾部版权，发现是一个叫frontopen开发者的免费作品。看起来很高端，但不会显得过于装逼。 很是佩服那些持续更新的博主，恐怕我是做不到的，但有时间上来写写，几年后，看看留下了几页书。 作为本博客的第一篇文章，就这样开始吧 ：）\n","permalink":"https://blog-foamzou-com.pages.dev/posts/%E6%96%B0%E7%9A%84wp%E6%96%B0%E7%9A%84%E5%BC%80%E5%A7%8B/","summary":"\u003cp\u003e这个博客今年暑假就搭建起来了，但迟迟没有写点东西上来。这几天在做算法题，突然又燃起了写点技术文章的热情。顺带写写周围的人，身边的事也是极好的。 之前的主题实在是不忍直视，没有给人想阅读的感觉。今天晚上(发现现在是凌晨了~~)重新安装了WordPress，目的是将wp的数据库文件放置到阿里云，阿里的数据库应该会安全点。 另外，令人心情好的是，使用了一套漂亮的主题。这个主题是在志豪的个人博客发现的，看了下尾部版权，发现是一个叫frontopen开发者的免费作品。看起来很高端，但不会显得过于装逼。 很是佩服那些持续更新的博主，恐怕我是做不到的，但有时间上来写写，几年后，看看留下了几页书。 作为本博客的第一篇文章，就这样开始吧 ：）\u003c/p\u003e","title":"新的WP，新的开始"}]