<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>GSGUNDAM砍柴工</title>
  <icon>https://www.gravatar.com/avatar/a7c69d91f86cad406c41a49b81197d37</icon>
  <subtitle>慢慢积累知识和见识，磨刀不误砍柴工</subtitle>
  <link href="https://www.gsgundam.com/atom.xml" rel="self"/>
  
  <link href="https://www.gsgundam.com/"/>
  <updated>2026-06-19T18:29:17.926Z</updated>
  <id>https://www.gsgundam.com/</id>
  
  <author>
    <name>GSGundam</name>
    <email>gsgundam@gmail.com</email>
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>QoderWork CN 一上午初步体验：能干活的桌面助手</title>
    <link href="https://www.gsgundam.com/2026/2026-06-18-qoderwork-cn-first-impression/"/>
    <id>https://www.gsgundam.com/2026/2026-06-18-qoderwork-cn-first-impression/</id>
    <published>2026-06-20T05:22:00.000Z</published>
    <updated>2026-06-19T18:29:17.926Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/%E7%94%A8%E6%88%B7%E9%99%84%E4%BB%B61.png"></p><p>这篇文章的起点很简单，是我收到了一条短信。内容大意是阿里云在推 <code>QoderWork</code> 中国版的首月 Pro 0 元试用，还附带每日免费 <code>Qwen3.7max</code> 调用次数和签到积分。它把调研、数据分析、PPT 这些事都放进了介绍里，甚至还直接说了“不止聊天，搞定一切”。我正好最近在给各个Agent用同一套思路做测试，就打算顺手试一试。</p><p>我这次只用了 <code>QoderWork CN</code> 一个上午，整体感受比较不错，能接任务、能看上下文、能往下推进工作的桌面工具。</p><p>从图里就能看出来，它的定位类似于 <code>Codex</code> 和 <code>Claude桌面版</code>。</p><p>真正开始用的时候，它给我的第一印象是：理解任务的能力比我预期里要强。我用的Auto模式，它自行选择模型，然后可以在较短时间内理解我给它的任务，并比较合理的拆解成可以执行的子任务。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/%E7%94%A8%E6%88%B7%E9%99%84%E4%BB%B63.png"></p><p>我给每个测试的Agent任务都是从调研开始，自行开发一个App到上架。从图里可以看到任务内容已经进入比较具体的项目处理阶段了。像 <code>keystore</code>、<code>SHA1</code>、<code>AAB</code> 这些信息都已经被它抓出来了，并且按照既定的规则开始本地构建AAB包。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/%E7%94%A8%E6%88%B7%E9%99%84%E4%BB%B64.png"></p><p>用量方面，它呈现得很清晰，套餐内 <code>credits</code>、个人资源包、免费额度这些信息摆出来。但用起来还是挺快的，还好基本支撑到编译完成和发布到商店。但是他实际上没有真正完成，因为支付并没有正确实现。</p><p>不过测试也就到此为止了。作为一个国内Agent，我觉得能力基本是合格的，特别是自动化能力非常强，目标清楚以后基本不需要干预。接下来就看他的定价如何了。比如我承认 Claude 很强，但是除了 Codex 以外，我也只会用 <code>Claude Code</code> + <code>DeepSeek V4</code>，因为<code>穷</code> 😀</p><p>这次体验里我没有专门测试图片能力，有了解的朋友可以分享一下体验。</p><p>如果有时间，可以自己看看：<a href="https://qoder.com.cn/referral?referral_code=PaozKKNSVV78cpxSxoh5xco0X1VCORjE">QoderWork CN 体验</a>。个人是觉得比腾讯龙虾更实用。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/%E7%94%A8%E6%88%B7%E9%99%84%E4%BB%B61.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;这篇文章的起点很简单，</summary>
      
    
    
    
    <category term="各种想法" scheme="https://www.gsgundam.com/categories/%E5%90%84%E7%A7%8D%E6%83%B3%E6%B3%95/"/>
    
    
    <category term="QoderWork" scheme="https://www.gsgundam.com/tags/QoderWork/"/>
    
    <category term="桌面助手" scheme="https://www.gsgundam.com/tags/%E6%A1%8C%E9%9D%A2%E5%8A%A9%E6%89%8B/"/>
    
    <category term="AI工具" scheme="https://www.gsgundam.com/tags/AI%E5%B7%A5%E5%85%B7/"/>
    
    <category term="开发体验" scheme="https://www.gsgundam.com/tags/%E5%BC%80%E5%8F%91%E4%BD%93%E9%AA%8C/"/>
    
    <category term="初步体验" scheme="https://www.gsgundam.com/tags/%E5%88%9D%E6%AD%A5%E4%BD%93%E9%AA%8C/"/>
    
  </entry>
  
  <entry>
    <title>药店“闭店潮”持续：一年净减2.2万家门店</title>
    <link href="https://www.gsgundam.com/2026/2026-05-09-z09-pharmacy-store-closures-industry-restructuring/"/>
    <id>https://www.gsgundam.com/2026/2026-05-09-z09-pharmacy-store-closures-industry-restructuring/</id>
    <published>2026-05-09T01:30:00.000Z</published>
    <updated>2026-05-08T18:29:25.748Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260509022540015.png"></p><p>近年来药店行业的调整仍在持续。根据中康数据统计，2025年全国药店数量<strong>净减少2.2万家</strong>，行业进入深度洗牌阶段。简单整理一下数据和趋势，供从业朋友、备考朋友参考。</p><hr><h2 id="一、行业整体态势：闭店潮未止，总量持续下行"><a href="#一、行业整体态势：闭店潮未止，总量持续下行" class="headerlink" title="一、行业整体态势：闭店潮未止，总量持续下行"></a>一、行业整体态势：闭店潮未止，总量持续下行</h2><p>自2024年第四季度行业出现拐点以来，药店数量连续下滑。</p><ul><li>2025年全年：全国药店<strong>净减少2.2万家</strong></li><li>截至2025年四季度末：全国药店总数为<strong>68.04万家</strong></li><li>累计减少：2024年四季度—2025年末，全国药店累计减少近<strong>2.6万家</strong></li><li>行业预测：未来3—5年，全国药店数量有望回落至<strong>50万家以下</strong></li></ul><p>行业逻辑已发生根本改变：过去依靠“多开店、多盈利”的规模扩张模式不再适用，行业转向<strong>高质量、高效率</strong>发展。</p><hr><h2 id="二、结构分化：中小药店加速出清，龙头逆势修复"><a href="#二、结构分化：中小药店加速出清，龙头逆势修复" class="headerlink" title="二、结构分化：中小药店加速出清，龙头逆势修复"></a>二、结构分化：中小药店加速出清，龙头逆势修复</h2><p>本轮调整呈现明显的两极分化：</p><ol><li><p><strong>中小药店承压出局</strong><br>合规能力不足、专业化水平偏低的<strong>单体药店与中小连锁</strong>成为出清主力。2024年四季度—2025年三季度减少的近2万家门店中，中小连锁与单体店占比达**84.5%**。</p></li><li><p><strong>上市连锁利润修复</strong><br>A股8家上市连锁药店中，2025年实现净利润同比上涨的有<strong>6家</strong>，行业盈利端明显改善。</p></li></ol><ul><li>2026年一季度：仅1家企业净利润同比下滑，板块整体修复趋势明确。</li><li>典型企业表现：<ul><li>一心堂：营收下降，但净利润大幅增长，依靠毛利率提升、费用精细化管控实现盈利修复。</li><li>益丰药房：净利润增速持续高于营收增速，以门店优化、降本增效驱动增长。</li><li>大参林：通过AI智能补货系统提升效率，库存周转天数降至83.54天，缺货率下降50%。</li></ul></li></ul><hr><h2 id="三、龙头企业策略转向：从扩规模到提效率"><a href="#三、龙头企业策略转向：从扩规模到提效率" class="headerlink" title="三、龙头企业策略转向：从扩规模到提效率"></a>三、龙头企业策略转向：从扩规模到提效率</h2><p>头部连锁普遍调整经营方向，重心从“新增开店”转向<strong>存量优化</strong>：</p><ol><li><p><strong>收缩直营扩张，聚焦单店质量</strong><br>部分企业主动关闭低效门店，优化网络布局。2025年，多家上市连锁门店数量出现净减少。</p></li><li><p><strong>下沉市场与加盟模式</strong><br>在优势省份推进轻资产加盟，重点布局县域与乡镇市场；以联盟、赋能方式整合中小连锁。</p></li><li><p><strong>门店改造与品类升级</strong><br>推进多元化门店改造，提升慢病服务、中药、非药等高毛利品类占比，优化盈利结构。</p></li><li><p><strong>数字化与AI降本</strong><br>通过智能补货、精准定编、费用管控等方式，提升人效、坪效与库存周转效率。</p></li></ol><hr><h2 id="四、对行业与执业药师的影响"><a href="#四、对行业与执业药师的影响" class="headerlink" title="四、对行业与执业药师的影响"></a>四、对行业与执业药师的影响</h2><ol><li><strong>行业集中度提升</strong><br>头部连锁市占率持续提高，小散乱药店逐步退出市场。</li><li><strong>合规与专业要求提高</strong><br>监管趋严+竞争加剧，药店对<strong>执业药师在岗、合规经营、专业服务</strong>的要求显著提升。</li><li><strong>执业药师就业结构变化</strong><br>大型连锁成为主流用工方，对持证、在岗、合规的药师需求更稳定，“挂证”空间进一步压缩。</li></ol><hr><p>药店行业的洗牌进程本质是合规化、专业化、效率化的升级过程。对于执业药师而言，这更多是机遇与挑战并存的阶段。后续我们一起持续关注行业动态与政策调整。也欢迎大家在评论区分享你们的看法和经历！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260509022540015.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;近年来药店行业的调整仍在持续。根据中康数据统计，2025年全国</summary>
      
    
    
    
    <category term="教育资讯" scheme="https://www.gsgundam.com/categories/%E6%95%99%E8%82%B2%E8%B5%84%E8%AE%AF/"/>
    
    
    <category term="执业药师" scheme="https://www.gsgundam.com/tags/%E6%89%A7%E4%B8%9A%E8%8D%AF%E5%B8%88/"/>
    
    <category term="药店行业" scheme="https://www.gsgundam.com/tags/%E8%8D%AF%E5%BA%97%E8%A1%8C%E4%B8%9A/"/>
    
    <category term="闭店潮" scheme="https://www.gsgundam.com/tags/%E9%97%AD%E5%BA%97%E6%BD%AE/"/>
    
    <category term="连锁药店" scheme="https://www.gsgundam.com/tags/%E8%BF%9E%E9%94%81%E8%8D%AF%E5%BA%97/"/>
    
    <category term="行业整合" scheme="https://www.gsgundam.com/tags/%E8%A1%8C%E4%B8%9A%E6%95%B4%E5%90%88/"/>
    
    <category term="合规经营" scheme="https://www.gsgundam.com/tags/%E5%90%88%E8%A7%84%E7%BB%8F%E8%90%A5/"/>
    
    <category term="药店数量" scheme="https://www.gsgundam.com/tags/%E8%8D%AF%E5%BA%97%E6%95%B0%E9%87%8F/"/>
    
  </entry>
  
  <entry>
    <title>多地通报执业药师 “挂证” 案例：22 人被撤/注销注册证</title>
    <link href="https://www.gsgundam.com/2026/2026-05-06-z10-pharmacist-hanging-certificate-cases/"/>
    <id>https://www.gsgundam.com/2026/2026-05-06-z10-pharmacist-hanging-certificate-cases/</id>
    <published>2026-05-06T02:30:00.000Z</published>
    <updated>2026-05-08T17:37:41.645Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260506110146935.png"></p><p>近期，吉林、新疆、重庆三地药品监督管理局陆续发布公告，通报一批执业药师“挂证”违规案例。共计22名执业药师因存在证件挂靠、未在岗执业等问题，被撤销或注销《执业药师注册证》，相关不良信息记入全国执业药师注册管理信息系统。</p><hr><h2 id="一、各地查处情况汇总"><a href="#一、各地查处情况汇总" class="headerlink" title="一、各地查处情况汇总"></a>一、各地查处情况汇总</h2><h3 id="（一）吉林省：2人因“挂证”被撤销注册证"><a href="#（一）吉林省：2人因“挂证”被撤销注册证" class="headerlink" title="（一）吉林省：2人因“挂证”被撤销注册证"></a>（一）吉林省：2人因“挂证”被撤销注册证</h3><p>吉林省药监局2026年第4期公告显示，经核查，李慧影、尚红燕存在<strong>执业药师注册证挂靠</strong>行为。依据《执业药师注册管理办法》第三十四条规定，<strong>撤销二人《执业药师注册证》，三年内不予注册</strong>。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260506110251885.png"></p><h3 id="（二）重庆市：3人被依法注销注册证"><a href="#（二）重庆市：3人被依法注销注册证" class="headerlink" title="（二）重庆市：3人被依法注销注册证"></a>（二）重庆市：3人被依法注销注册证</h3><p>重庆市药监局公告显示，依据《中华人民共和国行政许可法》第七十条、《执业药师注册管理办法》第二十四条规定，对吴晓红、杨大延、高治容3人<strong>依法注销《执业药师注册证》</strong>并公告。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260506110313433.png"></p><h3 id="（三）新疆：17人因“挂证”记入不良信息系统"><a href="#（三）新疆：17人因“挂证”记入不良信息系统" class="headerlink" title="（三）新疆：17人因“挂证”记入不良信息系统"></a>（三）新疆：17人因“挂证”记入不良信息系统</h3><p>新疆药监局2026年第16号公告显示，马瑶等17名执业药师<strong>未在注册单位上岗执业</strong>，存在“挂证”行为。依据《执业药师注册管理办法》第三十四条、第三十六条规定：</p><ol><li>将不良信息记入<strong>全国执业药师注册管理信息系统</strong></li><li><strong>不良信息记录撤销前，不得再次注册执业</strong></li></ol><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260506110337239.png"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260506110355126.png"></p><hr><h2 id="二、违规依据与处理标准"><a href="#二、违规依据与处理标准" class="headerlink" title="二、违规依据与处理标准"></a>二、违规依据与处理标准</h2><p>本次三地处罚均依据统一监管规定：</p><ol><li><strong>严禁注册证挂靠</strong>：注册单位与实际工作单位不符，属于明确违规。</li><li><strong>处罚标准</strong>：<ul><li>撤销&#x2F;注销《执业药师注册证》</li><li>三年内不予注册</li><li>记入全国注册管理信息系统，公示并限制再次注册</li><li>涉嫌犯罪的，移送司法机关追究刑事责任</li></ul></li></ol><hr><h2 id="三、监管提示与合规提醒"><a href="#三、监管提示与合规提醒" class="headerlink" title="三、监管提示与合规提醒"></a>三、监管提示与合规提醒</h2><p>执业药师“挂证”整治已进入<strong>常态化、跨区域联动</strong>阶段，监管重点包括：</p><ul><li>注册信息与实际在岗情况一致性核查</li><li>药店执业药师配备与在岗履职检查</li><li>不良信息全国联网记录，跨区域限制注册</li></ul><p>对执业药师及药品零售企业而言，<strong>合规执业、在岗履职</strong>是基本要求，切勿心存侥幸。</p><p>欢迎留言交流。我们一起继续关注执业药师相关信息，共享资讯。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260506110146935.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;近期，吉林、新疆、重庆三地药品监督管理局陆续发布公告，通报一批</summary>
      
    
    
    
    <category term="教育资讯" scheme="https://www.gsgundam.com/categories/%E6%95%99%E8%82%B2%E8%B5%84%E8%AE%AF/"/>
    
    
    <category term="执业药师" scheme="https://www.gsgundam.com/tags/%E6%89%A7%E4%B8%9A%E8%8D%AF%E5%B8%88/"/>
    
    <category term="挂证" scheme="https://www.gsgundam.com/tags/%E6%8C%82%E8%AF%81/"/>
    
    <category term="药监局" scheme="https://www.gsgundam.com/tags/%E8%8D%AF%E7%9B%91%E5%B1%80/"/>
    
    <category term="合规执业" scheme="https://www.gsgundam.com/tags/%E5%90%88%E8%A7%84%E6%89%A7%E4%B8%9A/"/>
    
    <category term="注册证" scheme="https://www.gsgundam.com/tags/%E6%B3%A8%E5%86%8C%E8%AF%81/"/>
    
    <category term="行政处罚" scheme="https://www.gsgundam.com/tags/%E8%A1%8C%E6%94%BF%E5%A4%84%E7%BD%9A/"/>
    
    <category term="2026年药监" scheme="https://www.gsgundam.com/tags/2026%E5%B9%B4%E8%8D%AF%E7%9B%91/"/>
    
  </entry>
  
  <entry>
    <title>2026年执业药师考试大纲调整</title>
    <link href="https://www.gsgundam.com/2026/2026-05-03-z03-pharmacist-outline-adjustment/"/>
    <id>https://www.gsgundam.com/2026/2026-05-03-z03-pharmacist-outline-adjustment/</id>
    <published>2026-05-02T19:30:00.000Z</published>
    <updated>2026-05-02T19:37:52.393Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260503032455718.png"></p><p>执业药师考试大纲通常并非每年大改，而是保持相对稳定，进行局部修订与调整。2026年《国家执业药师职业资格考试大纲（第九版）》已发布，已成为当下备考的直接依据。2025年版可作为理解延续性与变化点的对照参考。结合《关于调整2026年国家执业药师职业资格考试大纲的通告》，大概梳理本次调整的范围和方向。</p><h2 id="一、2025年大纲（第九版）的“锚点”价值"><a href="#一、2025年大纲（第九版）的“锚点”价值" class="headerlink" title="一、2025年大纲（第九版）的“锚点”价值"></a>一、2025年大纲（第九版）的“锚点”价值</h2><p>简单回顾2025年大纲的核心特点，这直接关系到我们如何使用现有资料备考：</p><ol><li><strong>结构稳定</strong>：继续分为中药学类和药学类两大方向，每类四科，其中《药事管理与法规》为共考科目。大框架未变。</li><li><strong>内容导向明确</strong>：<ul><li><strong>基础与综合并重</strong>：《中药学专业知识（一）&#x2F;药学专业知识（一）》强调质量标准、化学基础与剂型学；《中药学综合知识与技能&#x2F;药学综合知识与技能》则突出临床应用、辨证论治和药物治疗管理。</li><li><strong>法规时效性强</strong>：《药事管理与法规》紧跟国家药品监管改革最新动态，如“全面深化药品医疗器械监管改革”等新增内容，要求对现行政策有准确把握。</li><li><strong>注重实用与安全</strong>：在各科目中，“合理用药”、“不良反应&#x2F;不良事件”、“用药安全”、“药物警戒”等关键词高频出现，体现了对执业药师保障公众用药安全核心职能的强化。</li></ul></li><li><strong>题型固定</strong>：A、B、C、X四种标准化客观题型，无主观题，考察的是知识的准确性和应用能力。</li></ol><p><strong>结论</strong>：当前手头的2025年备考教材、课程、题库，其主体内容对2026年备考仍有较高参考价值；但应以已发布的2026年大纲为主线，重点补齐新增与调整内容。</p><h2 id="二、2026年大纲调整的“风向标”"><a href="#二、2026年大纲调整的“风向标”" class="headerlink" title="二、2026年大纲调整的“风向标”"></a>二、2026年大纲调整的“风向标”</h2><p>根据国家药监局4月13日发布的《关于调整2026年国家执业药师职业资格考试大纲的通告》，本次调整主要涉及《药事管理与法规》科目，共计27项内容更新。梳理后，以下方向值得关注：</p><ol><li><strong>医药产业高质量发展</strong>：新增“促进医药产业高质量发展”相关内容，包括支持创新药研发、新药上市注册等制度安排。</li><li><strong>境外生产药品管理</strong>：整合原分散内容为“整体要求”和“境外生产药品分包装备案管理”两个要点，结构更清晰。</li><li><strong>中药管理细化</strong>：增加“中药资源评估”要点，医疗机构中药制剂委托配制的要求也更明确。</li><li><strong>特殊药品管理</strong>：新增“麻醉药品和精神药品实验研究”的细目，管理要求更严格。</li></ol><p><strong>结论</strong>：2026年大纲调整以《药事管理与法规》为重点，其他科目可能保持稳定。考生需重点关注法规科目的新增内容，尤其是与医药产业、境外药品、中药管理、特殊药品相关的部分。</p><h2 id="三、资料获取"><a href="#三、资料获取" class="headerlink" title="三、资料获取"></a>三、资料获取</h2><p>可以直接获取访问链接获取：<a href="https://www.kdocs.cn/l/ccrMBQkMgxIz">《国家执业药师职业资格考试大纲（第九版·2026）》</a> 的完整PDF文档。</p><p>或者使用 <strong>其他获取方式</strong>：关注公众号，回复 <strong>药考大纲2025</strong> 。</p><p>下面是《关于调整2026年国家执业药师职业资格考试大纲的通告》的截图，原文在：<a href="http://www.cqlp.org.cn/info/link.aspx?id=7957&page=1">《关于调整2026年国家执业药师职业资格考试大纲的通告》</a></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260503031434987.png"></p><p>欢迎留言交流。我们一起继续关注相关信息，共享信息。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260503032455718.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;执业药师考试大纲通常并非每年大改，而是保持相对稳定，进行局部修</summary>
      
    
    
    
    <category term="教育资讯" scheme="https://www.gsgundam.com/categories/%E6%95%99%E8%82%B2%E8%B5%84%E8%AE%AF/"/>
    
    
    <category term="执业药师" scheme="https://www.gsgundam.com/tags/%E6%89%A7%E4%B8%9A%E8%8D%AF%E5%B8%88/"/>
    
    <category term="考试大纲" scheme="https://www.gsgundam.com/tags/%E8%80%83%E8%AF%95%E5%A4%A7%E7%BA%B2/"/>
    
    <category term="2026年执业药师考试" scheme="https://www.gsgundam.com/tags/2026%E5%B9%B4%E6%89%A7%E4%B8%9A%E8%8D%AF%E5%B8%88%E8%80%83%E8%AF%95/"/>
    
    <category term="备考策略" scheme="https://www.gsgundam.com/tags/%E5%A4%87%E8%80%83%E7%AD%96%E7%95%A5/"/>
    
    <category term="大纲变动" scheme="https://www.gsgundam.com/tags/%E5%A4%A7%E7%BA%B2%E5%8F%98%E5%8A%A8/"/>
    
    <category term="2026年大纲" scheme="https://www.gsgundam.com/tags/2026%E5%B9%B4%E5%A4%A7%E7%BA%B2/"/>
    
  </entry>
  
  <entry>
    <title>2026年执业药师考试的两条新动态：大纲调整和通过率控制</title>
    <link href="https://www.gsgundam.com/2026/2026-05-01-z01-pharmacist-exam-news/"/>
    <id>https://www.gsgundam.com/2026/2026-05-01-z01-pharmacist-exam-news/</id>
    <published>2026-04-30T17:30:00.000Z</published>
    <updated>2026-04-30T16:17:43.768Z</updated>
    
    <content type="html"><![CDATA[<p>最近关注到两条关于2026年执业药师考试的新动态，一条是大纲调整，一条是通过率控制。我自己今年也要报考，顺手整理了一下，供同样备考的朋友参考。</p><hr><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260501001651310.png"></p><h2 id="一、考试大纲有调整"><a href="#一、考试大纲有调整" class="headerlink" title="一、考试大纲有调整"></a>一、考试大纲有调整</h2><p>国家药监局4月13日发布了《关于调整2026年国家执业药师职业资格考试大纲的通告》，主要是《药事管理与法规》科目的内容更新。</p><p><strong>调整背景</strong></p><p>2025年和2026年都有新法规出台，大纲需要同步。这次调整涉及国务院发布的行政法规、最高人民法院司法解释、以及国家药监局等部门发布的部门规章和规范性文件，共计27项。</p><p><strong>主要内容变化</strong></p><p>梳理了一下，比较值得关注的是这几个方向：</p><p><strong>医药产业高质量发展</strong><br>大纲增加了”促进医药产业高质量发展”的相关内容，包括支持创新药研发、新药上市注册等制度安排。</p><p><strong>境外生产药品管理</strong><br>原来分散的内容整合为”整体要求”和”境外生产药品分包装备案管理”两个要点，结构更清晰。</p><p><strong>中药管理细化</strong><br>增加了”中药资源评估”要点，医疗机构中药制剂委托配制的要求也更明确。</p><p><strong>特殊药品管理</strong><br>新增”麻醉药品和精神药品实验研究”的细目，管理要求更严格。</p><p><strong>药品说明书与网络销售</strong><br>增加了”无障碍格式版本药品说明书”和”电子药品说明书编写规定”，以及”互联网药品信息服务管理”和”药品领域的反垄断”内容。</p><p><strong>医疗器械相关调整</strong><br>删除了”医疗器械注册人、备案人”的独立要点，相关内容并入”产品注册与备案管理”；增加了”医疗器械网络销售质量管理”。</p><p><strong>法律责任部分扩充</strong><br>对伪造、变造许可证，药品临床试验机构违规，中药配方颗粒和饮片生产企业的法律责任等，都作了更具体的规定。</p><p><strong>需要注意的一点</strong></p><p>通告明确：本通告发布后，国家新印发或修订的药事管理法律法规<strong>不纳入2026年考试范围</strong>。也就是说，4月13日之后的新规，今年不考。</p><hr><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260501001734509.png"></p><h2 id="二、通过率将控制在10-30-区间"><a href="#二、通过率将控制在10-30-区间" class="headerlink" title="二、通过率将控制在10%-30%区间"></a>二、通过率将控制在10%-30%区间</h2><p>国家药品监督管理局执业药师资格认证中心发布的《2026年度部门预算》中，明确了今年的考试通过率控制目标。</p><p><strong>具体指标</strong></p><ul><li>整体通过率严格控制在<strong>10%~30%区间</strong>（含10%与30%）</li><li>目标通过率为<strong>20%</strong></li><li>每偏离±1%扣1分（分值权重占比最高，达30分）</li></ul><p><strong>与往年对比</strong></p><p>查了一下，2025年度的部门预算中<strong>没有明确提到通过率控制</strong>这件事。今年应该是首次在预算文件中设定具体的通过率区间和绩效指标。</p><p><strong>历年合格率参考</strong></p><p>从2010-2024年的数据来看，合格率波动较大，低的时候11%（2010年），高的时候29%（2017年）。近几年大致在14%-21%之间。</p><p>2024年的数据：报考83.5万人，参考61.7万人，参考率73.9%，合格率21.04%。</p><p><strong>个人理解</strong></p><p>今年明确控制通过率在10%-30%，目标20%，意味着：</p><ul><li>出题难度可能会向这个目标靠拢</li><li>如果参考人数和往年持平，通过人数大概在12万-18万之间</li><li>对备考的要求更明确：不能有侥幸心理，好好准备</li></ul><hr><h2 id="三、对备考的影响"><a href="#三、对备考的影响" class="headerlink" title="三、对备考的影响"></a>三、对备考的影响</h2><p>我自己报的是西药，四科全报，主攻药二和法规。</p><p><strong>法规科目</strong>：大纲调整后内容增加，尤其是新《药师法》、药品集采、医保支付改革、反垄断这些内容，需要重点关注。我打算对照新旧大纲，把新增和修改的部分标出来，重点复习。</p><p><strong>整体策略</strong>：通过率控制意味着竞争更明确，不能靠突击。我目前的计划是制定周计划，周末用整块时间系统学习，平时关注政策动态。</p><hr><h2 id="四、信息来源"><a href="#四、信息来源" class="headerlink" title="四、信息来源"></a>四、信息来源</h2><ul><li>国家药监局执业药师中心：《关于调整2026年国家执业药师职业资格考试大纲的通告》（2026年4月13日）</li><li>国家药品监督管理局执业药师资格认证中心：《2026年度部门预算》</li><li>中国人事考试网：历年考试数据统计</li></ul><p>以上信息根据官方公开资料整理，如有变动以官方最新通知为准。</p><hr><p>今年备考执业药师的朋友们，可以一起交流。我后续会分享一些自己的学习进度和笔记，感兴趣可以关注。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近关注到两条关于2026年执业药师考试的新动态，一条是大纲调整，一条是通过率控制。我自己今年也要报考，顺手整理了一下，供同样备考的朋友参考。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai</summary>
      
    
    
    
    <category term="教育资讯" scheme="https://www.gsgundam.com/categories/%E6%95%99%E8%82%B2%E8%B5%84%E8%AE%AF/"/>
    
    
    <category term="执业药师" scheme="https://www.gsgundam.com/tags/%E6%89%A7%E4%B8%9A%E8%8D%AF%E5%B8%88/"/>
    
    <category term="考试大纲" scheme="https://www.gsgundam.com/tags/%E8%80%83%E8%AF%95%E5%A4%A7%E7%BA%B2/"/>
    
    <category term="通过率" scheme="https://www.gsgundam.com/tags/%E9%80%9A%E8%BF%87%E7%8E%87/"/>
    
    <category term="2026执业药师" scheme="https://www.gsgundam.com/tags/2026%E6%89%A7%E4%B8%9A%E8%8D%AF%E5%B8%88/"/>
    
    <category term="药事管理与法规" scheme="https://www.gsgundam.com/tags/%E8%8D%AF%E4%BA%8B%E7%AE%A1%E7%90%86%E4%B8%8E%E6%B3%95%E8%A7%84/"/>
    
  </entry>
  
  <entry>
    <title>2026年执业药师考试报名与备考</title>
    <link href="https://www.gsgundam.com/2026/2026-04-29-z10-pharmacist-exam-guide/"/>
    <id>https://www.gsgundam.com/2026/2026-04-29-z10-pharmacist-exam-guide/</id>
    <published>2026-04-29T02:30:00.000Z</published>
    <updated>2026-04-30T16:19:26.911Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260429103927216.png"></p><h2 id="一、报名时间与官方入口"><a href="#一、报名时间与官方入口" class="headerlink" title="一、报名时间与官方入口"></a>一、报名时间与官方入口</h2><ul><li><strong>全国统考报名时间</strong>：2026年8月4日—8月25日（各省开放8-20天不等，无补报名）</li><li><strong>官方报名入口</strong>：<a href="http://www.cpta.com.cn/">中国人事考试网</a></li><li><strong>准考证打印</strong>：考前一周左右开放</li><li><strong>成绩公布</strong>：预计2026年12月中旬</li></ul><blockquote><p>建议提前注册账号，确保信息完整，避免因资料不全影响报名。</p></blockquote><h2 id="二、报考条件"><a href="#二、报考条件" class="headerlink" title="二、报考条件"></a>二、报考条件</h2><table><thead><tr><th>专业</th><th>学历</th><th>岗位工作年限</th></tr></thead><tbody><tr><td>药学&#x2F;中药学</td><td>大专</td><td>4年</td></tr><tr><td>药学&#x2F;中药学</td><td>本科</td><td>2年</td></tr><tr><td>药学&#x2F;中药学</td><td>硕士&#x2F;第二学士</td><td>1年</td></tr><tr><td>药学&#x2F;中药学</td><td>博士</td><td>无要求</td></tr><tr><td>相关专业</td><td>相应学历&#x2F;学位</td><td>工作年限增加1年</td></tr></tbody></table><p><strong>注意：</strong> 岗位年限计算截止到2026年12月31日，实习、脱产学习等不计入。</p><h2 id="三、免试政策"><a href="#三、免试政策" class="headerlink" title="三、免试政策"></a>三、免试政策</h2><ul><li>需同时具备：药学&#x2F;医学&#x2F;中药学&#x2F;中医学专业高级职称 + 对应岗位工作</li><li>免试科目：药学类免”药专一””药专二”；中药学类免”中专一””中专二”</li><li>医师、护师、教授等职称不符合免试条件</li></ul><h2 id="四、必考科目与备考重点"><a href="#四、必考科目与备考重点" class="headerlink" title="四、必考科目与备考重点"></a>四、必考科目与备考重点</h2><ol><li><strong>药事管理与法规</strong>：政策更新快，重点关注新《药师法》、药品集采、医保支付改革等最新条款。</li><li><strong>药学&#x2F;中药学专业知识（一）</strong>：基础核心，建议公式、图谱结合记忆，关注药剂学、药物化学、中药鉴定学等。</li><li><strong>案例题</strong>：药物分析实际应用、中药炮制工艺判断等。</li></ol><h2 id="五、常见问题"><a href="#五、常见问题" class="headerlink" title="五、常见问题"></a>五、常见问题</h2><p><strong>Q1：护理专业能否报考？</strong><br>需从事药学&#x2F;中药学岗位工作且满足年限，护理岗位不符合。</p><p><strong>Q2：工作年限如何计算？</strong><br>截止2026年12月31日，非药学相关工作、实习、脱产学习不计入。</p><p><strong>Q3：资格审核不通过怎么办？</strong><br>检查信息完整性，准备岗位工作证明（需体现药品质量管理&#x2F;药学服务内容）。</p><p><strong>Q4：信息填写注意事项？</strong><br>区分”工作年限”（所有工作累计）与”专业年限”（药学&#x2F;中药学岗位工作）；照片需近期白底证件照（30KB内）。</p><p><strong>Q5：如何高效备考？</strong><br>制定严格周计划，利用周末整块时间系统学习与模拟，关注政策新规与教材变化。</p><h2 id="六、官方与学习资源"><a href="#六、官方与学习资源" class="headerlink" title="六、官方与学习资源"></a>六、官方与学习资源</h2><ul><li><a href="http://www.cpta.com.cn/">中国人事考试网</a>（报名、准考证、成绩查询）</li><li>近年真题库、法规政策汇编、权威教材</li><li>关注各地人事考试中心、药师协会官方通知</li></ul><hr><p>今年我自己会参加西药的执业药师考试（四科全报，但是主攻药二和法规），后续会分享一些备考经验和资源，感兴趣可以关注公众号，也可直接在网站&#x2F;知乎&#x2F;小红书与我交流。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260429103927216.png&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;一、报名时间与官方入口&quot;&gt;&lt;a href=&quot;#一、报</summary>
      
    
    
    
    <category term="教育资讯" scheme="https://www.gsgundam.com/categories/%E6%95%99%E8%82%B2%E8%B5%84%E8%AE%AF/"/>
    
    
    <category term="执业药师" scheme="https://www.gsgundam.com/tags/%E6%89%A7%E4%B8%9A%E8%8D%AF%E5%B8%88/"/>
    
    <category term="报名" scheme="https://www.gsgundam.com/tags/%E6%8A%A5%E5%90%8D/"/>
    
    <category term="备考" scheme="https://www.gsgundam.com/tags/%E5%A4%87%E8%80%83/"/>
    
    <category term="政策解读" scheme="https://www.gsgundam.com/tags/%E6%94%BF%E7%AD%96%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="药师考试" scheme="https://www.gsgundam.com/tags/%E8%8D%AF%E5%B8%88%E8%80%83%E8%AF%95/"/>
    
  </entry>
  
  <entry>
    <title>2026年度重庆市执业药师继续教育公需科目上线通知</title>
    <link href="https://www.gsgundam.com/2026/2026-04-27-z10-chongqing-pharmacist-continue-education/"/>
    <id>https://www.gsgundam.com/2026/2026-04-27-z10-chongqing-pharmacist-continue-education/</id>
    <published>2026-04-27T02:00:00.000Z</published>
    <updated>2026-04-27T03:08:11.269Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260427110624727.png"></p><p>2026年度重庆市执业药师继续教育公需科目已于4月20日正式上线，预计今年6月30日截止（参考近年周期）。</p><h2 id="学习安排要点"><a href="#学习安排要点" class="headerlink" title="学习安排要点"></a>学习安排要点</h2><ul><li><strong>培训时间</strong>：2026年4月20日起开放学习，预计截止时间为2026年6月30日</li><li><strong>学时要求</strong>：全年需完成90学时，其中公需科目30学时，专业科目60学时</li><li><strong>学习内容</strong>：涵盖政治理论、法律法规、职业道德、技术信息等基本知识</li><li><strong>学习方式</strong>：通过线上平台完成，不支持跨平台学习，需在选定平台内修完全部学时</li></ul><h2 id="入口方式"><a href="#入口方式" class="headerlink" title="入口方式"></a>入口方式</h2><p>可从以下任一通道进入学习：</p><ul><li><strong>重庆药师网</strong>：<a href="https://www.cqlpa.com/">继续教育报名入口</a></li><li><strong>官网入口</strong>：<a href="https://rlsbj.cq.gov.cn/ywzl/zjrc/zjrygxkmxx/index.html">重庆市人力资源和社会保障局官网</a> → “重庆市专业技术人员公需科目学习平台”栏目</li><li><strong>微信公众号</strong>：关注”重庆人社”，进入”人社资讯—专技人员继续教育”栏目</li></ul><h2 id="平台选择"><a href="#平台选择" class="headerlink" title="平台选择"></a>平台选择</h2><p>需在以下3个平台中任选其一登录学习，选定后不可更换：</p><ul><li>重庆市人力资源开发服务中心</li><li>重庆理工大学</li><li>重庆开放大学</li></ul><blockquote><p>⚠️ <strong>注意</strong>：完成公需科目后，可在线查看、下载并打印培训证书，建议妥善保存以备注册核查。</p></blockquote>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260427110624727.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;2026年度重庆市执业药师继续教育公需科目已于4月20日正式上</summary>
      
    
    
    
    <category term="教育资讯" scheme="https://www.gsgundam.com/categories/%E6%95%99%E8%82%B2%E8%B5%84%E8%AE%AF/"/>
    
    
    <category term="执业药师" scheme="https://www.gsgundam.com/tags/%E6%89%A7%E4%B8%9A%E8%8D%AF%E5%B8%88/"/>
    
    <category term="继续教育" scheme="https://www.gsgundam.com/tags/%E7%BB%A7%E7%BB%AD%E6%95%99%E8%82%B2/"/>
    
    <category term="公需科目" scheme="https://www.gsgundam.com/tags/%E5%85%AC%E9%9C%80%E7%A7%91%E7%9B%AE/"/>
    
    <category term="重庆" scheme="https://www.gsgundam.com/tags/%E9%87%8D%E5%BA%86/"/>
    
  </entry>
  
  <entry>
    <title>Trae 周年礼：Fast Requests Pro 快速领取指南</title>
    <link href="https://www.gsgundam.com/2026/2026-01-20-z01-trae-anniversary-fast-requests/"/>
    <id>https://www.gsgundam.com/2026/2026-01-20-z01-trae-anniversary-fast-requests/</id>
    <published>2026-01-19T17:30:00.000Z</published>
    <updated>2026-01-19T17:45:24.514Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260120012503534.png"></p><p>其实有一段时间了，Trae是给国际版用户送 Fast Request 的额度。不是直接把你升级成一个月的 Pro，而是发了一些“快速请求”配额，让你在一段时间里能优先访问 Pro 模式的模型，体验加速效果。</p><h2 id="具体权益与对象"><a href="#具体权益与对象" class="headerlink" title="具体权益与对象"></a>具体权益与对象</h2><ul><li>这次主要是发放 Fast Request（快速请求）额度，能在高并发或排队时优先通行，提升请求响应优先级。  </li><li>面向对象：所有 Trae 国际版用户都能领，包括 Free 用户和已经订阅 Pro 的用户。  </li><li>额外给 Pro 用户的福利：官方会额外发放 800 次快速请求（到账后在领取页面能看到具体数字）。这只是体验加速用的额度，不等同长期 Pro 的全部功能或企业保障。</li></ul><h2 id="有效期"><a href="#有效期" class="headerlink" title="有效期"></a>有效期</h2><p>活动从 2026-01-14 开始，官方会在到账信息里写明到期时间。官方示例里，Pro 额外 800 次的有效期是到 2026-03-14 10:00（北京时间）。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ20260119-232652.png"></p><h2 id="如何领取"><a href="#如何领取" class="headerlink" title="如何领取"></a>如何领取</h2><p>两种常用方式：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ20260119-232631.png"></p><h3 id="在-IDE-里领（推荐）"><a href="#在-IDE-里领（推荐）" class="headerlink" title="在 IDE 里领（推荐）"></a>在 IDE 里领（推荐）</h3><ol><li>打开你常用的 IDE 并确保 Trae 插件已安装且登录。  </li><li>注意 IDE 顶部横幅或插件通知，会有“Claim Anniversary Gift”的按钮。  </li><li>按提示完成授权与领取，领取成功后在插件账户页能看到剩余额度与到期时间。</li></ol><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ20260119-232754.png"></p><h3 id="在官网领"><a href="#在官网领" class="headerlink" title="在官网领"></a>在官网领</h3><ol><li>访问 trae.ai，找首页横幅或活动页。  </li><li>点击“Claim Anniversary Gift”按钮，登录并按页面流程操作。  </li><li>去控制台确认权益到账并查看说明。</li></ol><h2 id="跟普通-Pro-有啥不一样"><a href="#跟普通-Pro-有啥不一样" class="headerlink" title="跟普通 Pro 有啥不一样"></a>跟普通 Pro 有啥不一样</h2><ul><li>时长：这是限时体验，Pro 是长期按月&#x2F;年付费。  </li><li>功能：只开放部分 Pro 的加速&#x2F;优先级功能，不包含团队管理、企业 SLA 等。</li></ul><p>PS: 我根据各个平台的访客特征，调整了一下内容发布方向。今后中医中药类的不再向微信公众号发布，而技术、资讯方面的内容会重新发布到B站。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20260120012503534.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;其实有一段时间了，Trae是给国际版用户送 Fast Requ</summary>
      
    
    
    
    <category term="技术资讯" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E8%B5%84%E8%AE%AF/"/>
    
    
    <category term="Trae" scheme="https://www.gsgundam.com/tags/Trae/"/>
    
    <category term="活动" scheme="https://www.gsgundam.com/tags/%E6%B4%BB%E5%8A%A8/"/>
    
    <category term="Pro" scheme="https://www.gsgundam.com/tags/Pro/"/>
    
    <category term="福利" scheme="https://www.gsgundam.com/tags/%E7%A6%8F%E5%88%A9/"/>
    
  </entry>
  
  <entry>
    <title>宝塔面板升级失败怎么办？多种解决方案帮你搞定</title>
    <link href="https://www.gsgundam.com/2025/2025-09-25-z14-bin-obj-folder-auto-generated-vscode-unity%20copy/"/>
    <id>https://www.gsgundam.com/2025/2025-09-25-z14-bin-obj-folder-auto-generated-vscode-unity%20copy/</id>
    <published>2025-09-25T06:30:00.000Z</published>
    <updated>2025-09-25T12:56:10.082Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20250925205600.png"></p><p>最近在维护服务器的时候，遇到了宝塔面板升级失败的问题。bt面板服务直接挂了，重新启动报错</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">...bash</span><br><span class="line">------------------------------------------------------</span><br><span class="line"></span><br><span class="line">Error: BT-Task service startup failed.</span><br></pre></td></tr></table></figure><p>解决方案搜了一下，特别简单。就两条命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">rm</span> -rf /www/server/panel/pyenv</span><br><span class="line"></span><br><span class="line">curl https://download.bt.cn/install/update_panel.sh|bash</span><br></pre></td></tr></table></figure><p>看起来是把原来的Python环境配置干掉就行了。原因嘛，我猜是因为我从 <code>7.9</code> 直接升级 <code>11.1</code> ，跳过了中间的环境清理。 </p><p>宝塔虽然现在越来越商业化，但是总的来说服务支持还是大概到位的。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20250925205600.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;最近在维护服务器的时候，遇到了宝塔面板升级失败的问题。bt面板服务直</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="宝塔面板" scheme="https://www.gsgundam.com/tags/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF/"/>
    
    <category term="升级失败" scheme="https://www.gsgundam.com/tags/%E5%8D%87%E7%BA%A7%E5%A4%B1%E8%B4%A5/"/>
    
    <category term="服务器运维" scheme="https://www.gsgundam.com/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BF%90%E7%BB%B4/"/>
    
    <category term="问题解决" scheme="https://www.gsgundam.com/tags/%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/"/>
    
    <category term="Linux" scheme="https://www.gsgundam.com/tags/Linux/"/>
    
  </entry>
  
  <entry>
    <title>Unity项目中VS Code每次新建文件都会自动生成bin和obj文件夹</title>
    <link href="https://www.gsgundam.com/2025/2025-09-18-z10-bin-obj-folder-auto-generated-vscode-unity/"/>
    <id>https://www.gsgundam.com/2025/2025-09-18-z10-bin-obj-folder-auto-generated-vscode-unity/</id>
    <published>2025-09-18T02:30:00.000Z</published>
    <updated>2025-09-18T06:27:54.459Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20250918142550.png"></p><p>最近在使用Unity和VS Code进行开发时，每次在VS Code中新建脚本文件，项目目录下都会自动生成<code>bin</code>和<code>obj</code>文件夹。这些文件夹通常包含编译中间文件和输出文件，但对于Unity项目来说，这些文件夹并不是必须的，反而会让项目目录变得杂乱。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/image.png"></p><p>造成这种现象的原因主要是VS Code的C#插件（OmniSharp）会自动调用MSBuild对项目进行编译，从而生成<code>bin</code>和<code>obj</code>文件夹。Unity本身有自己的编译流程，并不依赖VS Code的自动编译，因此这些文件夹完全不必要。而且这些自动生成的文件夹还会带来编译错误。</p><p>不管是尝试重新生成csproj文件，甚至重装VS Code，但问题依旧。</p><p>依旧谷歌出场摆平问题：</p><ul><li>尝试安装旧版本的C# Dev Kit和C#扩展（C# Dev Kit v1.41.11，C# v2.87.31），并取消自动更新。</li><li>在VS Code设置中关闭<code>dotnet.projects.enableFileBasedPrograms</code>（Enable File Based Programs Preview）选项。</li></ul><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ20250918-100003.png"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ20250918-095932.png"></p><p>这样就解决问题啦。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20250918142550.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;最近在使用Unity和VS Code进行开发时，每次在VS Code</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="Unity" scheme="https://www.gsgundam.com/tags/Unity/"/>
    
    <category term="VSCode" scheme="https://www.gsgundam.com/tags/VSCode/"/>
    
    <category term="bin文件夹" scheme="https://www.gsgundam.com/tags/bin%E6%96%87%E4%BB%B6%E5%A4%B9/"/>
    
    <category term="obj文件夹" scheme="https://www.gsgundam.com/tags/obj%E6%96%87%E4%BB%B6%E5%A4%B9/"/>
    
    <category term="自动生成" scheme="https://www.gsgundam.com/tags/%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90/"/>
    
  </entry>
  
  <entry>
    <title>Windows更新遇ahsProtector失败的定位与解决</title>
    <link href="https://www.gsgundam.com/2025/2025-08-05-z01-windows-update-failed-by-ahsProtector/"/>
    <id>https://www.gsgundam.com/2025/2025-08-05-z01-windows-update-failed-by-ahsProtector/</id>
    <published>2025-08-04T17:30:00.000Z</published>
    <updated>2025-09-18T06:38:40.005Z</updated>
    
    <content type="html"><![CDATA[<p>前段时间给自己的Windows系统更新，总会遇到了一个非常让人头疼的问题：每次更新都会失败，系统提示“无法完成更新”，而且重试了好几次都不行。基本就放弃了。</p><p>这次又遇到了，我打算好好解决一下。提示其实是有的，但是一直没有去看这个叫“ahsProtector”的是什么东西，为什么总是在更新失败的时候出现。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20250918143518.png"></p><p>度娘了一下资料，原来这是某些国产安全软件或者驱动带的保护进程，叫深思数盾反黑引擎，它会拦截或者阻止系统文件的修改，从而导致Windows更新无法正常进行。</p><p>我看网上说将“自然人电子税务局客户端”删掉就行，但是发现实际上是没有用的。最后靠这位仁兄的办法将问题解决：<a href="https://blog.csdn.net/dengshulei/article/details/144989818">Win11升级遇到 ahsProtector 阻止升级问题</a></p><p>删除以下位置的文件内容：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">C:\Windows\System32\drivers\ahs_protect.sys</span><br><span class="line">C:\Windows\SysWOW64\drivers\ahs_protect.sys</span><br></pre></td></tr></table></figure><p>删除注册表内容：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">HKLM\System\CurrentControlSet\Services\ahs_protector</span><br></pre></td></tr></table></figure><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20250918143809.png"></p><p>这下就对了，收工。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;前段时间给自己的Windows系统更新，总会遇到了一个非常让人头疼的问题：每次更新都会失败，系统提示“无法完成更新”，而且重试了好几次都不行。基本就放弃了。&lt;/p&gt;
&lt;p&gt;这次又遇到了，我打算好好解决一下。提示其实是有的，但是一直没有去看这个叫“ahsProtector”的</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="Windows" scheme="https://www.gsgundam.com/tags/Windows/"/>
    
    <category term="更新失败" scheme="https://www.gsgundam.com/tags/%E6%9B%B4%E6%96%B0%E5%A4%B1%E8%B4%A5/"/>
    
    <category term="ahsProtector" scheme="https://www.gsgundam.com/tags/ahsProtector/"/>
    
    <category term="问题定位" scheme="https://www.gsgundam.com/tags/%E9%97%AE%E9%A2%98%E5%AE%9A%E4%BD%8D/"/>
    
    <category term="解决方案" scheme="https://www.gsgundam.com/tags/%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/"/>
    
  </entry>
  
  <entry>
    <title>你的SSL30元一年特价SSL证书 他改域名了！</title>
    <link href="https://www.gsgundam.com/2025/2025-07-02-z02-yrssl-cheap-ssl-certificate-30yuan/"/>
    <id>https://www.gsgundam.com/2025/2025-07-02-z02-yrssl-cheap-ssl-certificate-30yuan/</id>
    <published>2025-07-01T18:30:00.000Z</published>
    <updated>2025-07-02T01:12:46.361Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20250702030328.png"></p><p>真服了，公司网站证书要到期了，我介绍了之前的起尔网（<a href="/2025/2025-03-24-z13-72jz-cheap-ssl-certificate-30yuan">见这一篇</a>），结果居然网站没了！吓我一跳，我自己域名的SSL还用的它呢！</p><p>结果还好，只是改了个域名换了个名字，变成了 <a href="https://www.yrssl.com/aff/MLBIPPPV">-&gt; 你的SSL &lt;-</a> </p><p>网站稍有更新，价格也有些变化。</p><p>比如这个 <code>Certum DV</code> 的通配符证书变成190一年了。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20250702025956.png"></p><p>但 <code>SSL.COM DV</code> 则完全没有变化。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ_1742799301158.png"></p><p>愿这位SSL证书供应商施主永生。</p><p>再来个 callback ：<a href="https://www.yrssl.com/aff/MLBIPPPV">-&gt; 链接在此 &lt;-</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20250702030328.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;真服了，公司网站证书要到期了，我介绍了之前的起尔网（&lt;a href=</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="ssl" scheme="https://www.gsgundam.com/tags/ssl/"/>
    
    <category term="certificate" scheme="https://www.gsgundam.com/tags/certificate/"/>
    
    <category term="便宜" scheme="https://www.gsgundam.com/tags/%E4%BE%BF%E5%AE%9C/"/>
    
    <category term="证书" scheme="https://www.gsgundam.com/tags/%E8%AF%81%E4%B9%A6/"/>
    
  </entry>
  
  <entry>
    <title>解决 Unity TextMesh Pro 字体突然显示为白色方块</title>
    <link href="https://www.gsgundam.com/2025/2025-05-04-z01-tmp-text-rendered-as-white-blocks-in-unity/"/>
    <id>https://www.gsgundam.com/2025/2025-05-04-z01-tmp-text-rendered-as-white-blocks-in-unity/</id>
    <published>2025-05-03T16:30:00.000Z</published>
    <updated>2025-05-03T17:01:09.823Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20250504004954.png"></p><p>跟老王的产品配合出一个功能性小游戏，都快做完了，突然 <code>TextMesh Pro</code> 字体不知道为什么全部变成了白色方块。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20250504004836.png"></p><p>让人莫名其妙的是变成这样之前没有任何相关操作，只是改了点代码。</p><p>尝试了各种通常想得到的方案，包括重启Unity、重启电脑、删除 <code>Library</code> <code>Temp</code> 文件夹等等。差点就要开始排查插件了。</p><p>还好多谷哥了一会，找到了正确解决方案，而且特别简单。</p><p>就是重新导入基本资源就行了 😱  即 <code>TextMeshPro</code> → <code>Import TMP Essential Resources</code></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20250504005803.png"></p><p>简单得离谱。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20250504004954.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;跟老王的产品配合出一个功能性小游戏，都快做完了，突然 &lt;code&gt;T</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="textmesh pro" scheme="https://www.gsgundam.com/tags/textmesh-pro/"/>
    
    <category term="tmp" scheme="https://www.gsgundam.com/tags/tmp/"/>
    
    <category term="unity" scheme="https://www.gsgundam.com/tags/unity/"/>
    
    <category term="白色方块" scheme="https://www.gsgundam.com/tags/%E7%99%BD%E8%89%B2%E6%96%B9%E5%9D%97/"/>
    
  </entry>
  
  <entry>
    <title>起尔网30元一年特价SSL证书</title>
    <link href="https://www.gsgundam.com/2025/2025-03-24-z13-72jz-cheap-ssl-certificate-30yuan/"/>
    <id>https://www.gsgundam.com/2025/2025-03-24-z13-72jz-cheap-ssl-certificate-30yuan/</id>
    <published>2025-03-24T05:30:00.000Z</published>
    <updated>2025-07-01T17:30:43.279Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/72jz.png"></p><p>废话少说， <a href="https://www.yrssl.com/aff/MLBIPPPV">-&gt; 链接在此 &lt;-</a> </p><p>下面是正文。</p><p>最近收入不理想，但是花钱的地儿却不少。</p><p>连着几个域名开始缴费了（已经涨到90一年了，好贵！），以前一年的ssl证书也悉数到期。比如 <code>gsgundam.com</code> 本站。</p><p>而且现在除了 <code>Let&#39;s Encrypt</code> 以外，阿里云、腾讯云这些也通通3个月一签了。云服务器还好，可以 <code>Certbot</code> 自动续签，这个云虚机就很尴尬了。</p><p>之前给客户找的便宜证书，DV单域名最少也是100元一年，通配符是500元一年。自己用还是觉得有点贵了。</p><p>于是在网上搜罗了好久，找到了90的、65的。最后，终于还是让我翻到了这个击穿底价的服务商。</p><p>这个 <code>Certum DV</code> 虽然第一次见，但是不重要。因为他的单域名真的是30块！</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ_1742799190889.png"></p><p>甚至 <code>SSL.COM DV</code> 也最低只要35元一年。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ_1742799301158.png"></p><p>只要他不垮，估摸着这些年都用他了。</p><p>再贴个链接：<a href="https://www.yrssl.com/aff/MLBIPPPV">-&gt; 链接在此 &lt;-</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/72jz.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;废话少说， &lt;a href=&quot;https://www.yrssl.com/aff/MLB</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="ssl" scheme="https://www.gsgundam.com/tags/ssl/"/>
    
    <category term="certificate" scheme="https://www.gsgundam.com/tags/certificate/"/>
    
    <category term="便宜" scheme="https://www.gsgundam.com/tags/%E4%BE%BF%E5%AE%9C/"/>
    
    <category term="证书" scheme="https://www.gsgundam.com/tags/%E8%AF%81%E4%B9%A6/"/>
    
  </entry>
  
  <entry>
    <title>CloudCone特价VPS上新了（圣诞特价）</title>
    <link href="https://www.gsgundam.com/2024/2024-12-27-z10-cloudcone-cheap-vps-christmas/"/>
    <id>https://www.gsgundam.com/2024/2024-12-27-z10-cloudcone-cheap-vps-christmas/</id>
    <published>2024-12-27T02:30:00.000Z</published>
    <updated>2024-12-27T02:18:44.331Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/cloudcone.jpg"></p><p><code>CloudCone</code> 圣诞特价VPS系列上新！</p><p><strong>价格比黑五差太多啦，只是比日常价好，刚需可入。但是配置确实还不错，已经帮朋友入了一台144刀的机子。</strong></p><p>如果页面上方提示 <code>plan is out of stock</code> ，说明售罄缺货。</p><table><thead><tr><th>CPU&#x2F;内存&#x2F;硬盘</th><th>流量@带宽</th><th>价格</th><th></th></tr></thead><tbody><tr><td>2核&#x2F;1G&#x2F;14G</td><td>3T&#x2F;月@1Gbps</td><td>12.99美元&#x2F;年</td><td><a href="https://app.cloudcone.com/vps/349/create?token=xmas-24-ssd-vps-1&ref=8791">前往购买</a></td></tr><tr><td>3核&#x2F;2G&#x2F;26G</td><td>4T&#x2F;月@1Gbps</td><td>21.99美元&#x2F;年</td><td><a href="https://app.cloudcone.com/vps/350/create?token=xmas-24-ssd-vps-2&ref=8791">前往购买</a></td></tr><tr><td>6核&#x2F;4G&#x2F;55G</td><td>5T&#x2F;月@1Gbps</td><td>38.99美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/293/create?token=bf-24-ssd-vps-3&ref=8791">前往购买</a></td></tr><tr><td>10核&#x2F;8G&#x2F;111G</td><td>6T&#x2F;月@1Gbps</td><td>72.99美元&#x2F;年</td><td><a href="https://app.cloudcone.com/vps/352/create?token=xmas-24-ssd-vps-4&ref=8791">前往购买(已售罄)</a></td></tr><tr><td>14核&#x2F;16G&#x2F;223G</td><td>8T&#x2F;月@1Gbps</td><td>144元&#x2F;年</td><td><a href="https://app.cloudcone.com/vps/353/create?token=xmas-24-ssd-vps-5&ref=8791">前往购买(已售罄)</a></td></tr><tr><td>18核&#x2F;32G&#x2F;447G</td><td>10T&#x2F;月@1Gbps</td><td>299美元&#x2F;年</td><td><a href="https://app.cloudcone.com/vps/354/create?token=xmas-24-ssd-vps-6&ref=8791">前往购买(发文时剩余2台)</a></td></tr></tbody></table><p>为什么推荐他们家？因为支持支付宝付款呀！而且我也是我自用了5年的VPS了。</p><p>简单介绍下，CloudCone是一家国外主机商，是QuadCone旗下的子品牌。产品都是KVM虚拟架构，部署在洛杉矶Multacom机房，电信联通直连，1Gbps端口，流量也多，3T起步。</p><p>自带免费的DDoS防护（还有付费的全天候DDoS防护），以及每两周一次的全服务器无差别快照备份，如果有恢复需求可以直接找客服，客服态度都挺好的。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/cloudcone.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CloudCone&lt;/code&gt; 圣诞特价VPS系列上新！&lt;/p&gt;</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="虚拟主机" scheme="https://www.gsgundam.com/tags/%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA/"/>
    
    <category term="VPS" scheme="https://www.gsgundam.com/tags/VPS/"/>
    
    <category term="云服务器" scheme="https://www.gsgundam.com/tags/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="特价" scheme="https://www.gsgundam.com/tags/%E7%89%B9%E4%BB%B7/"/>
    
    <category term="支付宝" scheme="https://www.gsgundam.com/tags/%E6%94%AF%E4%BB%98%E5%AE%9D/"/>
    
    <category term="圣诞" scheme="https://www.gsgundam.com/tags/%E5%9C%A3%E8%AF%9E/"/>
    
  </entry>
  
  <entry>
    <title>CloudCone特价VPS上新了（黑五特价）</title>
    <link href="https://www.gsgundam.com/2024/2024-11-25-z23-cloudcone-cheap-vps-black-friday/"/>
    <id>https://www.gsgundam.com/2024/2024-11-25-z23-cloudcone-cheap-vps-black-friday/</id>
    <published>2024-11-25T15:30:00.000Z</published>
    <updated>2024-11-25T15:36:33.646Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/cloudcone.jpg"></p><p><code>CloudCone</code> 黑五特价VPS系列上新！</p><p><strong>今年价格还不错，配置比去年差一些，但仍然比日常隐藏价略划算，值得入！</strong></p><p>此次上新主要新增了1c512m的机子，实用性比较一般，只适合作为小工具&#x2F;脚本测试机。</p><p>如果页面上方提示 <code>plan is out of stock</code> ，说明售罄缺货。</p><table><thead><tr><th>CPU&#x2F;内存&#x2F;硬盘</th><th>流量@带宽</th><th>价格</th><th></th></tr></thead><tbody><tr><td>1核&#x2F;512M&#x2F;7G</td><td>2T&#x2F;月@1Gbps</td><td>10.99美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/291/create?token=bf-24-ssd-vps-1&ref=8791">前往购买</a></td></tr><tr><td>2核&#x2F;1G&#x2F;14G</td><td>3T&#x2F;月@1Gbps</td><td>12.99美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/291/create?token=bf-24-ssd-vps-1&ref=8791">前往购买</a></td></tr><tr><td>6核&#x2F;2G&#x2F;27G</td><td>4T&#x2F;月@1Gbps</td><td>20.88美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/293/create?token=bf-24-ssd-vps-3&ref=8791">前往购买</a></td></tr><tr><td>9核&#x2F;4G&#x2F;55G</td><td>6T&#x2F;月@1Gbps</td><td>37.5美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/294/create?token=bf-24-ssd-vps-4&ref=8791">前往购买</a></td></tr><tr><td>12核&#x2F;8G&#x2F;111G</td><td>8T&#x2F;月@1Gbps</td><td>71.99美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/295/create?token=bf-24-ssd-vps-5&ref=8791">前往购买</a></td></tr><tr><td>15核&#x2F;16G&#x2F;231G</td><td>9T&#x2F;月@1Gbps</td><td>142.99美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/296/create?token=bf-24-ssd-vps-6&ref=8791">前往购买</a></td></tr><tr><td>20核&#x2F;32G&#x2F;490G</td><td>10T&#x2F;月@1Gbps</td><td>295.99美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/297/create?token=bf-24-ssd-vps-7&ref=8791">前往购买(发文时剩余7台)</a></td></tr></tbody></table><p>为什么推荐他们家？因为支持支付宝付款呀！而且我也是我自用了5年的VPS了。</p><p>简单介绍下，CloudCone是一家国外主机商，是QuadCone旗下的子品牌。产品都是KVM虚拟架构，部署在洛杉矶Multacom机房，电信联通直连，1Gbps端口，流量也多，3T起步。</p><p>自带免费的DDoS防护（还有付费的全天候DDoS防护），以及每两周一次的全服务器无差别快照备份，如果有恢复需求可以直接找客服，客服态度都挺好的。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/cloudcone.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CloudCone&lt;/code&gt; 黑五特价VPS系列上新！&lt;/p&gt;</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="虚拟主机" scheme="https://www.gsgundam.com/tags/%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA/"/>
    
    <category term="VPS" scheme="https://www.gsgundam.com/tags/VPS/"/>
    
    <category term="云服务器" scheme="https://www.gsgundam.com/tags/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="特价" scheme="https://www.gsgundam.com/tags/%E7%89%B9%E4%BB%B7/"/>
    
    <category term="支付宝" scheme="https://www.gsgundam.com/tags/%E6%94%AF%E4%BB%98%E5%AE%9D/"/>
    
    <category term="黑五" scheme="https://www.gsgundam.com/tags/%E9%BB%91%E4%BA%94/"/>
    
  </entry>
  
  <entry>
    <title>uniapp subPackages 微信分包与路由跳转</title>
    <link href="https://www.gsgundam.com/2024/2024-11-24-z22-uniapp-weixin-subpackages-route-navigation/"/>
    <id>https://www.gsgundam.com/2024/2024-11-24-z22-uniapp-weixin-subpackages-route-navigation/</id>
    <published>2024-11-24T14:30:00.000Z</published>
    <updated>2024-11-24T12:32:14.928Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/19afc7d6-10e1-4c3b-ae75-914c0d3f3036.jpg"></p><p>今天有个微信小程序有点问题需要修复，结果问题是几下改好了，一点上传，提示我主包超2MB了……</p><p>之前处理小游戏分包就觉得很烦。终究还是躲不过学习小程序怎样分包呀。</p><p>包括官方在内还是看了好几个教程，有了自己的一点小心得。</p><h2 id="分包开启与目录设置"><a href="#分包开启与目录设置" class="headerlink" title="分包开启与目录设置"></a>分包开启与目录设置</h2><p>首先在 <code>manifest.json</code> 源码中找到 <code>mp-weixin</code> 节点，增加 <code>optimization</code> 属性：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;optimization&quot;</span> <span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;subPackages&quot;</span> <span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>然后按自己的需要构建项目目录，例如：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">┌─pages</span><br><span class="line">│  └─index</span><br><span class="line">│     └─index.vue</span><br><span class="line">├─subpackages1</span><br><span class="line">│  ├─components</span><br><span class="line">│  └─subpage1</span><br><span class="line">│     └─subpage1.vue</span><br><span class="line">├─subpackages2</span><br><span class="line">│  ├─static</span><br><span class="line">│  └─subpage2</span><br><span class="line">│     └─subpage2.vue</span><br><span class="line">├─static</span><br><span class="line">├─main.js</span><br><span class="line">├─App.vue</span><br><span class="line">├─manifest.json</span><br><span class="line">└─pages.json</span><br></pre></td></tr></table></figure><p>由于一开始并没有看官方教程，所以稍微有点被其他文章误导了。说2个关键点，以防大家产生跟我一样困惑：</p><p>1、分包目录没有特定要求。强调这点是因为好几篇文章把分包目录放在pages下面，让我误以为这是一个必要的规范。但是官方示例已经很明确了，放在根目录就是最好的方式，虽然说其实放哪里都可以。（官方文档：<a href="https://uniapp.dcloud.net.cn/collocation/pages.html#subpackages">https://uniapp.dcloud.net.cn/collocation/pages.html#subpackages</a>）</p><p>2、只被分包依赖的组件、静态资源，应放在分包目录中。这实际上也印证了上面的做法。因为分包目录实际上可以看做一个项目的根目录，这个目录中有页面，也可以有组件和静态资源。而作为“伪根目录”放在其他的pages目录下，就显得有点不合逻辑了。</p><h2 id="页面配置与跳转"><a href="#页面配置与跳转" class="headerlink" title="页面配置与跳转"></a>页面配置与跳转</h2><p>目录的改变肯定也带来了配置文件和路由的调整。</p><p>首先修改 <code>pages.json</code> ：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;pages&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;path&quot;</span><span class="punctuation">:</span> <span class="string">&quot;pages/index/index&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;style&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;navigationBarTitleText&quot;</span><span class="punctuation">:</span> <span class="string">&quot;uni-app&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;navigationStyle&quot;</span><span class="punctuation">:</span> <span class="string">&quot;custom&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;subpackages1&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;root&quot;</span><span class="punctuation">:</span> <span class="string">&quot;subpackages1&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;pages&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;path&quot;</span><span class="punctuation">:</span> <span class="string">&quot;subpage1/subpage1&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;style&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;navigationBarTitleText&quot;</span><span class="punctuation">:</span> <span class="string">&quot;分包页1&quot;</span></span><br><span class="line">          <span class="punctuation">&#125;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;globalStyle&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;navigationBarTextStyle&quot;</span><span class="punctuation">:</span> <span class="string">&quot;black&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;navigationBarTitleText&quot;</span><span class="punctuation">:</span> <span class="string">&quot;uni-app&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;navigationBarBackgroundColor&quot;</span><span class="punctuation">:</span> <span class="string">&quot;#F8F8F8&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;backgroundColor&quot;</span><span class="punctuation">:</span> <span class="string">&quot;#F8F8F8&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>然后对应路由跳转需要调整：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">uni.<span class="title function_">navigateTo</span>(&#123;</span><br><span class="line">  <span class="attr">url</span>: <span class="string">&#x27;/subpackage1/subpage1/subpage1&#x27;</span></span><br><span class="line">&#125;)</span><br><span class="line"><span class="comment">// 未分包前为:</span></span><br><span class="line"><span class="comment">// uni.navigateTo(&#123;</span></span><br><span class="line"><span class="comment">//   url: &#x27;/pages/subpage1/subpage1&#x27;</span></span><br><span class="line"><span class="comment">// &#125;)</span></span><br></pre></td></tr></table></figure><h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><p>分包相关逻辑与优化策略：</p><ul><li>静态文件：分包下支持 static 等静态资源拷贝，即分包目录内放置的静态资源不会被打包到主包中，也不可在主包中使用。</li><li>js文件：当某个 js 仅被一个分包引用时，该 js 会被打包到该分包内，否则仍打到主包（即被主包引用，或被超过 1 个分包引用）。</li><li>自定义组件：若某个自定义组件仅被一个分包引用时，且未放入到分包内，编译时会输出提示信息。</li></ul><p>完成配置分包文件后需要重启项目才能预览。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/19afc7d6-10e1-4c3b-ae75-914c0d3f3036.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;今天有个微信小程序有点问</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="微信" scheme="https://www.gsgundam.com/tags/%E5%BE%AE%E4%BF%A1/"/>
    
    <category term="路由" scheme="https://www.gsgundam.com/tags/%E8%B7%AF%E7%94%B1/"/>
    
    <category term="uniapp" scheme="https://www.gsgundam.com/tags/uniapp/"/>
    
    <category term="subpackages" scheme="https://www.gsgundam.com/tags/subpackages/"/>
    
    <category term="分包" scheme="https://www.gsgundam.com/tags/%E5%88%86%E5%8C%85/"/>
    
  </entry>
  
  <entry>
    <title>CloudCone特价VPS上新了（黑五预热）</title>
    <link href="https://www.gsgundam.com/2024/2024-11-06-z19-cloudcone-cheap-vps-daily/"/>
    <id>https://www.gsgundam.com/2024/2024-11-06-z19-cloudcone-cheap-vps-daily/</id>
    <published>2024-11-06T11:30:00.000Z</published>
    <updated>2024-11-06T11:32:01.998Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/cloudcone.jpg"></p><p><code>CloudCone</code> 隐藏特价（黑五预热）VPS日常上新。</p><p><strong>这一场的价格一般，看看即可，刚需可入，不是刚需的话再等等黑五。</strong></p><p>如果页面上方提示 <code>plan is out of stock</code> ，说明售罄缺货。</p><table><thead><tr><th>CPU&#x2F;内存&#x2F;硬盘</th><th>流量@带宽</th><th>价格</th><th></th></tr></thead><tbody><tr><td>2核&#x2F;1G&#x2F;14G</td><td>3T&#x2F;月@1Gbps</td><td>13.99美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/282/create?token=pre-bf-24-ssd-vps-1&ref=8791">前往购买</a></td></tr><tr><td>5核&#x2F;2G&#x2F;27G</td><td>4T&#x2F;月@1Gbps</td><td>21.21美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/283/create?token=pre-bf-24-ssd-vps-2&ref=8791">前往购买</a></td></tr><tr><td>8核&#x2F;4G&#x2F;55G</td><td>5T&#x2F;月@1Gbps</td><td>38.5美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/284/create?token=pre-bf-24-ssd-vps-3&ref=8791">前往购买(已售罄)</a></td></tr><tr><td>11核&#x2F;8G&#x2F;111G</td><td>6T&#x2F;月@1Gbps</td><td>72.99美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/285/create?token=pre-bf-24-ssd-vps-4&ref=8791">前往购买(已售罄)</a></td></tr><tr><td>15核&#x2F;16G&#x2F;223G</td><td>8T&#x2F;月@1Gbps</td><td>144美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/286/create?token=pre-bf-24-ssd-vps-5&ref=8791">前往购买(发文时剩余1台)</a></td></tr><tr><td>20核&#x2F;32G&#x2F;447G</td><td>10T&#x2F;月@1Gbps</td><td>299美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/287/create?token=pre-bf-24-ssd-vps-6&ref=8791">前往购买(已售罄)</a></td></tr></tbody></table><p>为什么推荐他们家？因为支持支付宝付款呀！而且我也是我自用了5年的VPS了。</p><p>简单介绍下，CloudCone是一家国外主机商，是QuadCone旗下的子品牌。产品都是KVM虚拟架构，部署在洛杉矶Multacom机房，电信联通直连，1Gbps端口，流量也多，3T起步。</p><p>自带免费的DDoS防护（还有付费的全天候DDoS防护），以及每两周一次的全服务器无差别快照备份，如果有恢复需求可以直接找客服，客服态度都挺好的。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/cloudcone.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CloudCone&lt;/code&gt; 隐藏特价（黑五预热）VPS日常上</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="虚拟主机" scheme="https://www.gsgundam.com/tags/%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA/"/>
    
    <category term="VPS" scheme="https://www.gsgundam.com/tags/VPS/"/>
    
    <category term="云服务器" scheme="https://www.gsgundam.com/tags/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="特价" scheme="https://www.gsgundam.com/tags/%E7%89%B9%E4%BB%B7/"/>
    
    <category term="支付宝" scheme="https://www.gsgundam.com/tags/%E6%94%AF%E4%BB%98%E5%AE%9D/"/>
    
  </entry>
  
  <entry>
    <title>Google Fonts字体国内镜像加速</title>
    <link href="https://www.gsgundam.com/2024/2024-10-22-z13-google-fonts-mainland-boost/"/>
    <id>https://www.gsgundam.com/2024/2024-10-22-z13-google-fonts-mainland-boost/</id>
    <published>2024-10-22T05:30:00.000Z</published>
    <updated>2024-10-22T16:54:17.046Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ_1729574145486.png"></p><p>之前客户反馈说最近网站访问特别慢，查了一下，有几方面的原因，其中一项就是因为项目引用的 <code>google font</code> 的国内镜像站 <code>loli加速</code>：&#x2F;&#x2F;fonts.loli.net&#x2F; ，无法访问了。</p><p>上网搜了一下，居然在2021年就已经有 <code>google font</code> 的官方中国站了：<a href="https://googlefonts.cn/">https://googlefonts.cn/</a> ，而且速度相当不错。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">&gt;ping fonts.font.im</span><br><span class="line"></span><br><span class="line">正在 Ping fonts.font.im [198.18.1.252] 具有 32 字节的数据:</span><br><span class="line">来自 198.18.1.252 的回复: 字节=32 时间&lt;1ms TTL=64</span><br><span class="line">来自 198.18.1.252 的回复: 字节=32 时间&lt;1ms TTL=64</span><br><span class="line">来自 198.18.1.252 的回复: 字节=32 时间&lt;1ms TTL=64</span><br><span class="line">来自 198.18.1.252 的回复: 字节=32 时间&lt;1ms TTL=64</span><br><span class="line"></span><br><span class="line">198.18.1.252 的 Ping 统计信息:</span><br><span class="line">    数据包: 已发送 = 4，已接收 = 4，丢失 = 0 (0% 丢失)，</span><br><span class="line">往返行程的估计时间(以毫秒为单位):</span><br><span class="line">    最短 = 0ms，最长 = 0ms，平均 = 0ms</span><br></pre></td></tr></table></figure><p>所以只要换掉引用地址，问题就解决了。不过在替时，要注意不能直接用 <code>googlefonts.cn</code> ，而是要使用 <code>fonts.font.im</code> 。例如：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">link</span> <span class="attr">href</span>=<span class="string">&quot;https://fonts.font.im/css?family=Montserrat&quot;</span> <span class="attr">rel</span>=<span class="string">&quot;stylesheet&quot;</span>&gt;</span></span><br></pre></td></tr></table></figure><hr><p>另外，后面跟药学相关的内容可能会比较少在网站和其他平台分享了。</p><p>目前感觉自己发的东西内容太杂了，于是重新规划了一下。接下来应该会这样去分发自己的内容：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">- 技术、软件、网赚：网站、微信公众号、知乎、其他平台；</span><br><span class="line"></span><br><span class="line">- 中药：微信公众号、头条、小红书；</span><br><span class="line"></span><br><span class="line">- 绘画：抖音、哔哩哔哩；</span><br><span class="line"></span><br><span class="line">- 杂谈：网站、知乎、其他平台；</span><br></pre></td></tr></table></figure><p>页面底部也增加了各个平台的链接或关注方式，希望大家多捧捧场~ 谢过啦！</p><p>以后应该会多更新与中药相关的东西，也会持续关注执业药师（中药）考试的内容。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ_1729574145486.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;之前客户反馈说最近网站访问特别慢，查了一下，有几方面的原因，其中</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="google fonts" scheme="https://www.gsgundam.com/tags/google-fonts/"/>
    
    <category term="镜像" scheme="https://www.gsgundam.com/tags/%E9%95%9C%E5%83%8F/"/>
    
    <category term="字体" scheme="https://www.gsgundam.com/tags/%E5%AD%97%E4%BD%93/"/>
    
    <category term="加速" scheme="https://www.gsgundam.com/tags/%E5%8A%A0%E9%80%9F/"/>
    
  </entry>
  
  <entry>
    <title>中药执业药师考试中药在线电子笔记分享（五）</title>
    <link href="https://www.gsgundam.com/2024/2024-10-09-z10-licensed-pharmacist-examination-online-note-V/"/>
    <id>https://www.gsgundam.com/2024/2024-10-09-z10-licensed-pharmacist-examination-online-note-V/</id>
    <published>2024-10-09T01:30:00.000Z</published>
    <updated>2024-10-09T03:09:50.850Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/2e02af13-2ac0-4a63-8816-b8e27ccd3ab0.jpg"></p><p>还有10天就要考试了，大家紧张不？</p><p>我反正是有点慌了，一顿中药一的精学下来，感觉没有强化多少，反而忘了好多中药二的知识点 😱</p><p>但是精学也是有成果的，之前以为很难整理的电子笔记，这下终于出炉了。与之前书本版电子笔记不同，表格版的电子笔记版本很适合打印成纸质的，拿出来随时背（之前分享的中药二表格版电子笔记我早早打印成纸质了，随时可背）。</p><p> 🔥 <a href="https://kdocs.cn/l/cuB6zrUvzVGm">执业药师考试-中药一电子笔记</a></p><p>老规矩，把之前的资料也全部再发一遍。</p><p> 🔗 <a href="https://kdocs.cn/l/cp8o32JBnXVp">执业药师考试-中药一-集训营配套教材(PDF)</a></p><p> 🔗 <a href="https://www.kdocs.cn/l/cehb1ayE2WZY">执业药师中药一鉴定图(2024)(PDF)</a></p><p> 🔗 <a href="https://kdocs.cn/l/cmADj4h3p2bn">执业药师考试-中药一电子笔记(书本版)</a></p><p> 🔗 <a href="https://www.kdocs.cn/l/cqVG7YQSiWaY">执业药师考试-中药二电子笔记</a></p><p>接下来准备猛肝题了。中药一药剂和炮制部分的题接触得还太少，没有题感。中药二是需要大量题来巩固知识点。</p><p>最近润德在推最后8小时，需要提分的小伙伴可以考虑，听说还是有用，但是如果基础不扎实的就不要去花那个冤枉钱了，跟不上的。</p><p>如果你跟我一样，基础还不够扎实的，在最后冲刺阶段除了刷题以外，其实还可以考虑他们已经出了的速效救命班，强化基础的同时会扩展一些相关的小考点，巩固的同时有一定提分作用。</p><p>记住要多刷题，错题一定要整理！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/2e02af13-2ac0-4a63-8816-b8e27ccd3ab0.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;还有10天就要考试了，大</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="执业药师" scheme="https://www.gsgundam.com/tags/%E6%89%A7%E4%B8%9A%E8%8D%AF%E5%B8%88/"/>
    
    <category term="润德教育" scheme="https://www.gsgundam.com/tags/%E6%B6%A6%E5%BE%B7%E6%95%99%E8%82%B2/"/>
    
    <category term="电子笔记" scheme="https://www.gsgundam.com/tags/%E7%94%B5%E5%AD%90%E7%AC%94%E8%AE%B0/"/>
    
    <category term="金山文档" scheme="https://www.gsgundam.com/tags/%E9%87%91%E5%B1%B1%E6%96%87%E6%A1%A3/"/>
    
    <category term="中药" scheme="https://www.gsgundam.com/tags/%E4%B8%AD%E8%8D%AF/"/>
    
  </entry>
  
  <entry>
    <title>CloudCone特价VPS上新了</title>
    <link href="https://www.gsgundam.com/2024/2024-10-05-z18-cloudcone-cheap-vps-daily/"/>
    <id>https://www.gsgundam.com/2024/2024-10-05-z18-cloudcone-cheap-vps-daily/</id>
    <published>2024-10-05T10:30:00.000Z</published>
    <updated>2024-10-05T08:54:57.936Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/cloudcone.jpg"></p><p><code>CloudCone</code> 隐藏特价（黑五预热）VPS日常上新。</p><p>如果页面上方提示 <code>plan is out of stock</code> ，说明售罄缺货。</p><table><thead><tr><th>CPU&#x2F;内存&#x2F;硬盘</th><th>流量@带宽</th><th>价格</th><th></th></tr></thead><tbody><tr><td>1核&#x2F;1G&#x2F;7G</td><td>3T&#x2F;月@1Gbps</td><td>12美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/260/create?ref=8791&token=cloudcone.cc-24-vps-1">前往购买</a></td></tr><tr><td>2核&#x2F;1G&#x2F;14G</td><td>3T&#x2F;月@1Gbps</td><td>13.99美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/282/create?token=pre-bf-24-ssd-vps-1&ref=8791">前往购买</a></td></tr><tr><td>5核&#x2F;2G&#x2F;27G</td><td>4T&#x2F;月@1Gbps</td><td>21.21美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/283/create?token=pre-bf-24-ssd-vps-2&ref=8791">前往购买</a></td></tr><tr><td>8核&#x2F;4G&#x2F;55G</td><td>5T&#x2F;月@1Gbps</td><td>38.5美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/284/create?token=pre-bf-24-ssd-vps-3&ref=8791">前往购买(已售罄)</a></td></tr><tr><td>11核&#x2F;8G&#x2F;111G</td><td>6T&#x2F;月@1Gbps</td><td>72.99美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/285/create?token=pre-bf-24-ssd-vps-4&ref=8791">前往购买(发文时剩余2台)</a></td></tr><tr><td>15核&#x2F;16G&#x2F;223G</td><td>8T&#x2F;月@1Gbps</td><td>144美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/286/create?token=pre-bf-24-ssd-vps-5&ref=8791">前往购买(发文时剩余4台)</a></td></tr><tr><td>20核&#x2F;32G&#x2F;447G</td><td>10T&#x2F;月@1Gbps</td><td>299美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/287/create?token=pre-bf-24-ssd-vps-6&ref=8791">前往购买(发文时剩余4台)</a></td></tr></tbody></table><p>为什么推荐他们家？因为支持支付宝付款呀！而且我也是我自用了5年的VPS了。</p><p>简单介绍下，CloudCone是一家国外主机商，是QuadCone旗下的子品牌。产品都是KVM虚拟架构，部署在洛杉矶Multacom机房，电信联通直连，1Gbps端口，流量也多，3T起步。</p><p>自带免费的DDoS防护（还有付费的全天候DDoS防护），以及每两周一次的全服务器无差别快照备份，如果有恢复需求可以直接找客服，客服态度都挺好的。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/cloudcone.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CloudCone&lt;/code&gt; 隐藏特价（黑五预热）VPS日常上</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="虚拟主机" scheme="https://www.gsgundam.com/tags/%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA/"/>
    
    <category term="VPS" scheme="https://www.gsgundam.com/tags/VPS/"/>
    
    <category term="云服务器" scheme="https://www.gsgundam.com/tags/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="特价" scheme="https://www.gsgundam.com/tags/%E7%89%B9%E4%BB%B7/"/>
    
    <category term="支付宝" scheme="https://www.gsgundam.com/tags/%E6%94%AF%E4%BB%98%E5%AE%9D/"/>
    
  </entry>
  
  <entry>
    <title>解决 Stable Diffusion 提示 You have not selected any ControlNet model 的问题</title>
    <link href="https://www.gsgundam.com/2024/2024-10-02-z15-stable-diffusion-you-have-not-selected-any-controlnet-model/"/>
    <id>https://www.gsgundam.com/2024/2024-10-02-z15-stable-diffusion-you-have-not-selected-any-controlnet-model/</id>
    <published>2024-10-02T07:30:00.000Z</published>
    <updated>2024-10-02T07:56:50.601Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/ai-girl.jpg"></p><h1 id="起因"><a href="#起因" class="headerlink" title="起因"></a>起因</h1><p>好久没有处理AI绘画相关的东西了。帮朋友用草稿生成一张参考图，结果导入<code>scribble</code>模型以后，生成时在控制台提示 <code>You have not selected any ControlNet model</code>。</p><p>开始没在意，因为进度条在走。但是生成结果一出来，就知道不对劲了。彻彻底底的一团糟，连个人形都没有（忘了截图）。</p><p>于是求助谷哥，在 <a href="https://github.com/lllyasviel/ControlNet/issues/401">这个网页</a> 找到了答案。</p><h1 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h1><p>1、下载 <code>scribble</code> 对应的 <code>ControlNet</code> 预训练模型。地址：<a href="https://huggingface.co/lllyasviel/ControlNet-v1-1/tree/main">https://huggingface.co/lllyasviel/ControlNet-v1-1/tree/main</a>。选择所需的pth模型文件下载。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ20241002-155406.png" alt="scribble模型"></p><p>2、拷贝到 <code>stable-diffusion-webui\models\ControlNet</code> 目录中。</p><p>3、重启 webui ，问题解决了。</p><p>收工。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/ai-girl.jpg&quot;&gt;&lt;/p&gt;
&lt;h1 id=&quot;起因&quot;&gt;&lt;a href=&quot;#起因&quot; class=&quot;headerlink&quot;</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="ai" scheme="https://www.gsgundam.com/tags/ai/"/>
    
    <category term="stable diffusion" scheme="https://www.gsgundam.com/tags/stable-diffusion/"/>
    
    <category term="controlnet" scheme="https://www.gsgundam.com/tags/controlnet/"/>
    
    <category term="绘画" scheme="https://www.gsgundam.com/tags/%E7%BB%98%E7%94%BB/"/>
    
    <category term="模型" scheme="https://www.gsgundam.com/tags/%E6%A8%A1%E5%9E%8B/"/>
    
  </entry>
  
  <entry>
    <title>CloudCone预存5.1送2.55 黑五预热</title>
    <link href="https://www.gsgundam.com/2024/2024-09-28-z13-cloudcone-prefund-for-black-friday/"/>
    <id>https://www.gsgundam.com/2024/2024-09-28-z13-cloudcone-prefund-for-black-friday/</id>
    <published>2024-09-28T05:30:00.000Z</published>
    <updated>2024-09-28T06:22:57.154Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/cloudcone.jpg"></p><p>好东西来了！黑五还没开始，CloudCone已经开始了预热活动，预存5.1美元，赠送2.55美元余额，合计到账7.65美元。</p><p>废话不多说，先上我自己的订单。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ20240928-132232.png"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ20240928-135741.png"></p><p>虽然黑五还没开始，但是以我的经验而言，预存包不亏的，黑五肯定会有新的VPS神机上线。现在先把送的拿到，到时候再选就是。</p><p> 🔗 <a href="https://app.cloudcone.com/?ref=8791">戳我去充值</a></p><p>另外，这个活动是所有人都可以参与的，不论新老用户。预计活动在2024年9月29日上午结束，尽可能在28号以内完成充值吧。</p><p>至于说担心跑路的，我个人觉得比他家可能跑路的VPS多了去了，还轮不到他吧。只是不要贪心去搞多账号去薅，多半会被反薅的 😏</p><p>另外，目前特价VPS还剩一台常驻有货了，之前的都已经全部售罄。</p><table><thead><tr><th>CPU&#x2F;内存&#x2F;硬盘</th><th>流量@带宽</th><th>价格</th><th></th></tr></thead><tbody><tr><td>1核&#x2F;1G&#x2F;7G</td><td>3T&#x2F;月@1Gbps</td><td>12美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/260/create?ref=8791&token=cloudcone.cc-24-vps-1">前往购买</a></td></tr></tbody></table>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/cloudcone.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;好东西来了！黑五还没开始，CloudCone已经开始了预热活动，预存5.1美元</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="虚拟主机" scheme="https://www.gsgundam.com/tags/%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA/"/>
    
    <category term="VPS" scheme="https://www.gsgundam.com/tags/VPS/"/>
    
    <category term="云服务器" scheme="https://www.gsgundam.com/tags/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="特价" scheme="https://www.gsgundam.com/tags/%E7%89%B9%E4%BB%B7/"/>
    
    <category term="支付宝" scheme="https://www.gsgundam.com/tags/%E6%94%AF%E4%BB%98%E5%AE%9D/"/>
    
    <category term="黑五" scheme="https://www.gsgundam.com/tags/%E9%BB%91%E4%BA%94/"/>
    
    <category term="预存" scheme="https://www.gsgundam.com/tags/%E9%A2%84%E5%AD%98/"/>
    
  </entry>
  
  <entry>
    <title>CloudCone特价VPS上新了</title>
    <link href="https://www.gsgundam.com/2024/2024-09-23-z09-cloudcone-cheap-vps-daily/"/>
    <id>https://www.gsgundam.com/2024/2024-09-23-z09-cloudcone-cheap-vps-daily/</id>
    <published>2024-09-23T01:30:00.000Z</published>
    <updated>2024-10-02T08:00:04.388Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/cloudcone.jpg"></p><p><code>CloudCone</code> 隐藏特价VPS日常上新。</p><table><thead><tr><th>CPU&#x2F;内存&#x2F;硬盘</th><th>流量@带宽</th><th>价格</th><th></th></tr></thead><tbody><tr><td>1核&#x2F;1G&#x2F;7G</td><td>3T&#x2F;月@1Gbps</td><td>12美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/260/create?ref=8791&token=cloudcone.cc-24-vps-1">前往购买</a></td></tr><tr><td>2核&#x2F;1G&#x2F;30G</td><td>3T&#x2F;月@1Gbps</td><td>13.99美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/281/create?token=mcs-24-ssd-vps-4&ref=8791">前往购买(发文时已售罄)</a></td></tr><tr><td>4核&#x2F;2G&#x2F;60G</td><td>4T&#x2F;月@1Gbps</td><td>24.99美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/280/create?token=mcs-24-ssd-vps-5&ref=8791">前往购买(发文时已售罄)</a></td></tr></tbody></table><p>为什么推荐他们家？因为支持支付宝付款呀！而且我也是我自用了5年的VPS了。</p><p>简单介绍下，CloudCone是一家国外主机商，是QuadCone旗下的子品牌。产品都是KVM虚拟架构，部署在洛杉矶Multacom机房，电信联通直连，1Gbps端口，流量也多，3T起步。</p><p>自带免费的DDoS防护（还有付费的全天候DDoS防护），以及每两周一次的全服务器无差别快照备份，如果有恢复需求可以直接找客服，客服态度都挺好的。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/cloudcone.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CloudCone&lt;/code&gt; 隐藏特价VPS日常上新。&lt;/p&gt;</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="虚拟主机" scheme="https://www.gsgundam.com/tags/%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA/"/>
    
    <category term="VPS" scheme="https://www.gsgundam.com/tags/VPS/"/>
    
    <category term="云服务器" scheme="https://www.gsgundam.com/tags/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="特价" scheme="https://www.gsgundam.com/tags/%E7%89%B9%E4%BB%B7/"/>
    
    <category term="支付宝" scheme="https://www.gsgundam.com/tags/%E6%94%AF%E4%BB%98%E5%AE%9D/"/>
    
  </entry>
  
  <entry>
    <title>更换Intel NUC Kit NUC8i7HVK冥王峡谷风扇和散热硅脂（相变片）</title>
    <link href="https://www.gsgundam.com/2024/2024-09-22-z14-intel-nuc8i7hvk-replace-computer-fan-and-thermal-grease/"/>
    <id>https://www.gsgundam.com/2024/2024-09-22-z14-intel-nuc8i7hvk-replace-computer-fan-and-thermal-grease/</id>
    <published>2024-09-22T06:30:00.000Z</published>
    <updated>2024-09-22T16:43:30.434Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk-2024-preview.jpg"></p><p><code>NUC 冥王峡谷</code> 最近噪音又特别大，感觉风扇再给力点，它就能自己飞走了。</p><h1 id="确定问题"><a href="#确定问题" class="headerlink" title="确定问题"></a>确定问题</h1><p>上网查询+自己摸索，很快有了大概方向。</p><p>首先，肯定有风扇的问题，因为正常它就不该这么大声。毕竟这是台二手货，入手的时候保修虽然还有大半年，但是谁知道里面的零件有没有被动过呢，万一风扇被换成更旧的了呢。</p><p>其次，风扇转速很高，说明散热是有问题的。距离上次换硅脂其实没有多久，每次扫灰我都会查看硅脂状态。如果不是硅脂质量问题，那么就得考虑散热材料是不是需要更新了。</p><h1 id="寻找解决方案"><a href="#寻找解决方案" class="headerlink" title="寻找解决方案"></a>寻找解决方案</h1><h2 id="风扇"><a href="#风扇" class="headerlink" title="风扇"></a>风扇</h2><p>众所周知，笔记本和迷你准系统的散热方案几乎全部是定制的，连风扇都不带重样的。<code>冥王峡谷</code>也是一样的问题，在淘宝上都找不到多少卖家，只能找了一家相对便宜的。运气不错，很安全。 <a href="http://e.tb.cn/h.gr77qel1mAeCz3a?tk=YTas3iEoXEw">&gt;链接在此&lt;</a></p><h2 id="相变片"><a href="#相变片" class="headerlink" title="相变片"></a>相变片</h2><p>没错，这次直接换了散热材料。在此前我就知道现在准系统的内存条流行贴<code>石墨散热</code>材料，没想到在查找的过程中发现了我自认为更合适的材料——<code>相变片</code>。</p><p>网上的资料显示，不管是导热效率还是是用寿命，相变片相对于硅脂都是具有明显优势的。我最后选择了 <a href="https://mobile.yangkeduo.com/goods1.html?ps=VA9fBk5YL6">霍尼韦尔7950相变片</a> 。</p><h1 id="装机"><a href="#装机" class="headerlink" title="装机"></a>装机</h1><h2 id="更换风扇"><a href="#更换风扇" class="headerlink" title="更换风扇"></a>更换风扇</h2><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk-2024-01.jpg" alt="风扇对比"></p><p>先来个风扇对比图，新旧应该一目了然吧？拆装过程我就不再写一遍了，<a href="/2022/2022-12-05-intel-nuc8i7hvk-replace-thermal-grease/">给Intel NUC Kit NUC8i7HVK冥王峡谷拆机更换硅脂</a> 这一篇里面写得应该还是比较清楚。换好以后就正常工作了。有点小插曲后面再讲。</p><h2 id="更换相变片"><a href="#更换相变片" class="headerlink" title="更换相变片"></a>更换相变片</h2><p>买了2张相变片，分别是 <code>20x30mm</code> 和 <code>20x20mm</code> ，对应下图这两个被擦得闪闪发亮的区域。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk-2024-02.jpg" alt="相变片"></p><p>先用小的上手做实验，毕竟第一次贴。下图是揭开一边以后贴上去的样子。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk-2024-03.jpg" alt="贴相变片"></p><p>网上有两种方式，我先用了指甲盖楞的方法，做出来不是特别完美，至少比人家的差。于是又开始用刀轻轻刻下去的方式。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk-2024-04.jpg" alt="贴相变片"></p><p>结果是还不如指甲弄的。哈哈。看下图这个坑坑洼洼的样子，边缘跟狗啃的一样 🐶</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk-2024-05.jpg" alt="相变片贴完"></p><h2 id="后续"><a href="#后续" class="headerlink" title="后续"></a>后续</h2><p>万万没想到，最后装回的时候，主板螺丝拧不上了。观察了好一会才发现，原来是风扇线太短了，直接被压在了螺丝扣的旁边。线材包裹材料都压出痕了，还好没有什么事。用平口起子挑出来了。</p><p>至于为什么用起子却不用手，那是因为风扇线材的包裹材料着实有点硬 😂</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk-2024-06.jpg" alt="风扇线被压"></p><h1 id="成果"><a href="#成果" class="headerlink" title="成果"></a>成果</h1><p>总的来说还是非常理想。</p><p>新风扇在启动的时候似乎是滚珠有一点微弱的声音，转起来了就几乎不太听得到声音了。</p><p>温度也明显比之前低了不少，日常使用的情况下，风扇吹出来的风甚至都不太热。</p><p>完美收工。</p><hr><p>PS: 顺便说一句，<a href="https://fa6.dashgame.com/"><code>FontAwesome V6</code> 版本跟上官方的重要更新了 (v6.6.0) </a>。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/open-graph-general.png"></p><p>之所以说是重要更新，是因为网站结构和字体样式文件都发生了很多变化，因此也对数据库结构进行了很多调整，以便适应作者现在和以后可能会进行的修改。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk-2024-preview.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;NUC 冥王峡谷&lt;/code&gt; 最近噪音</summary>
      
    
    
    
    <category term="DIY实战" scheme="https://www.gsgundam.com/categories/DIY%E5%AE%9E%E6%88%98/"/>
    
    
    <category term="冥王峡谷" scheme="https://www.gsgundam.com/tags/%E5%86%A5%E7%8E%8B%E5%B3%A1%E8%B0%B7/"/>
    
    <category term="nuc8i7hvk" scheme="https://www.gsgundam.com/tags/nuc8i7hvk/"/>
    
    <category term="intel nuc" scheme="https://www.gsgundam.com/tags/intel-nuc/"/>
    
    <category term="nuc" scheme="https://www.gsgundam.com/tags/nuc/"/>
    
    <category term="散热硅脂" scheme="https://www.gsgundam.com/tags/%E6%95%A3%E7%83%AD%E7%A1%85%E8%84%82/"/>
    
    <category term="拆机" scheme="https://www.gsgundam.com/tags/%E6%8B%86%E6%9C%BA/"/>
    
    <category term="更换" scheme="https://www.gsgundam.com/tags/%E6%9B%B4%E6%8D%A2/"/>
    
    <category term="迷你主机" scheme="https://www.gsgundam.com/tags/%E8%BF%B7%E4%BD%A0%E4%B8%BB%E6%9C%BA/"/>
    
    <category term="微型主机" scheme="https://www.gsgundam.com/tags/%E5%BE%AE%E5%9E%8B%E4%B8%BB%E6%9C%BA/"/>
    
    <category term="diy" scheme="https://www.gsgundam.com/tags/diy/"/>
    
    <category term="hades canyon" scheme="https://www.gsgundam.com/tags/hades-canyon/"/>
    
    <category term="thermal grease" scheme="https://www.gsgundam.com/tags/thermal-grease/"/>
    
    <category term="grease" scheme="https://www.gsgundam.com/tags/grease/"/>
    
    <category term="fontawesome" scheme="https://www.gsgundam.com/tags/fontawesome/"/>
    
    <category term="风扇" scheme="https://www.gsgundam.com/tags/%E9%A3%8E%E6%89%87/"/>
    
    <category term="相变片" scheme="https://www.gsgundam.com/tags/%E7%9B%B8%E5%8F%98%E7%89%87/"/>
    
    <category term="准系统" scheme="https://www.gsgundam.com/tags/%E5%87%86%E7%B3%BB%E7%BB%9F/"/>
    
  </entry>
  
  <entry>
    <title>中药执业药师考试中药在线电子笔记分享（四）</title>
    <link href="https://www.gsgundam.com/2024/2024-09-19-z09-licensed-pharmacist-examination-online-note-IV/"/>
    <id>https://www.gsgundam.com/2024/2024-09-19-z09-licensed-pharmacist-examination-online-note-IV/</id>
    <published>2024-09-19T01:30:00.000Z</published>
    <updated>2024-09-19T09:15:17.529Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/1463036586076084335.jpg"></p><p>目前的复习进度仍然缓慢，距离考试只有30天时间了 😱</p><p>这两天想起来除了 <code>超级题库</code> 以外，集训营教材后面也有两套模拟题的，2024版正好没做过，可以练练手。</p><p>但是做完了发现扫码查看答案的页面经常刷不出来，索性在网上把答案找来了。放出来也方便大家吧。</p><p> 🔗 <a href="https://kdocs.cn/l/cr9tZV2CLk50">集训营(2024)中药学一模拟卷(一)答案(PDF)</a></p><p> 🔗 <a href="https://kdocs.cn/l/cmdSbjMeWBoR">集训营(2024)中药学一模拟卷(二)答案(PDF)</a></p><p> 🔗 <a href="https://kdocs.cn/l/crL0Fq0dE2b5">集训营(2024)中药学二模拟卷(一)答案(PDF)</a></p><p> 🔗 <a href="https://kdocs.cn/l/cqaK7TSV6Cac">集训营(2024)中药学二模拟卷(二)答案(PDF)</a></p><p>中药一的笔记目前仍然龟速整理中，感觉💊，哈哈。</p><p>之前的资料再发一次，省得大家再去翻之前的文章。</p><p> 🔗 <a href="https://kdocs.cn/l/cp8o32JBnXVp">执业药师考试-中药一-集训营配套教材(PDF)</a></p><p> 🔗 <a href="https://www.kdocs.cn/l/cehb1ayE2WZY">执业药师中药一鉴定图(2024)(PDF)</a></p><p> 🔗 <a href="https://kdocs.cn/l/cmADj4h3p2bn">执业药师考试-中药一电子笔记</a></p><p> 🔗 <a href="https://www.kdocs.cn/l/cqVG7YQSiWaY?R=L1MvMQ==">执业药师考试-中药二电子笔记</a></p><p>临近考试还有一个月，也总结下学习经验。好多年前无心了解到成人学历也可以考执业药师，因为家里人多少跟医药都沾关系，而且在大学之前我其实也一直对药（特别是中药）感兴趣，所以决定借此机会迈入这个行业。</p><p>于是一边工作一边抽空学习，在 <code>润德教育</code> 拿了成人教育的成果（学历和学位都有了，尽管跟全日制那还是没法比🤭），也在这个过程中真正意义上的开始了解药学。尤其是 <code>中药药理学</code> 和 <code>中药药代动力学</code> ，完全改变了我以前认为中药是纯粹的经验科学的观念。这个观念的转变对于促进我的学习而言，丝毫不亚于“能不能挣钱”这个命题。</p><p>再后来就是考执业药师了。</p><p>第一年真是心不在焉，本来自己也没打算这么早就考，所以就随便买了点视频课，每天看看中药二，睡觉前听一听法规。结果既在情理之中，又在意料之外：情理之中的是，所有的科目分数都很低；意料之外的是，花功夫最多的中药二和其他两门没有复习的科目完全一样，只有40多分，然而法规居然一次性过了。这一年在润德只报了 中药一 和 中药综 <strong>不过就退费</strong>的<code>速效救命班</code>，领了考前要点小册子。不过就是这个小册子，让我对润德的应试能力有了新认识，因为这小玩意临时让我记住和理清了不少法规的考点。<strong>记得考前在考场领这个册子，或者提前拼团购买《考前大爆料90分》，是这个册子的加强版，很便宜！但是很管用！</strong></p><p>第二年振作了一下，加上自己的主业情况非常差，所以就腾出来不少时间主攻中药综和中药一，同时也报了润德的 大咖集训营 和 速效救命班 。中药综学起来其实很有意思，可能入门有一点门槛，但是真正学会辩证以后特别有趣，也理解了很多中医看病诊治的原理。然而中药一对于我这种没有销售经验和全日制本科学历的人来说，学起来就有点吃力了，完全靠口诀，中药一的口诀量又比较吓人，以至于后来我宁愿做中药综的题，也不想多看中药一。当然，最后的考试结果是中药综轻松过线（这一年考的辩证还特别少，感觉有点亏），中药一遗憾落败（这一年的题其实超级简单，有点后悔）。</p><p>这一次决心一口气过了中药一和中药二，毕竟要改大纲了，而且全国的执业药师数量也在不断攀升，以后只会越来越难。这次学习起来感觉又比以前好了不少，大概是因为有经验了。首先就是要耐着性子跟老师过一遍，给所有内容留下印象。其次一定要有一遍精学，我的方式就是整理笔记。精学不只是记住这些知识点，而是对它们进一步加工和构建，在脑子里形成体系。完成这步以后就可以刷题了，一边刷题一边查漏补缺，很快就可以提高分数。</p><p>最后还是要强烈推荐（润德能不能给我打点广告费？😀），<code>大咖集训营</code> 真的不错，便宜实惠非常有用。<code>速效救命班</code> 价格要高一些，但是满满干货，在有基础的前提下听这个，包能提分。当然，重中之重，是自己要有动力去学，不然就跟我第一年一样，花钱只是为了买个心安，最后还是落个惨败。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/1463036586076084335.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;目前的复习进度仍然缓慢，距离考试只有30天时间了 😱&lt;/</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="执业药师" scheme="https://www.gsgundam.com/tags/%E6%89%A7%E4%B8%9A%E8%8D%AF%E5%B8%88/"/>
    
    <category term="润德教育" scheme="https://www.gsgundam.com/tags/%E6%B6%A6%E5%BE%B7%E6%95%99%E8%82%B2/"/>
    
    <category term="电子笔记" scheme="https://www.gsgundam.com/tags/%E7%94%B5%E5%AD%90%E7%AC%94%E8%AE%B0/"/>
    
    <category term="金山文档" scheme="https://www.gsgundam.com/tags/%E9%87%91%E5%B1%B1%E6%96%87%E6%A1%A3/"/>
    
    <category term="中药" scheme="https://www.gsgundam.com/tags/%E4%B8%AD%E8%8D%AF/"/>
    
  </entry>
  
  <entry>
    <title>CloudCone特价VPS上新了</title>
    <link href="https://www.gsgundam.com/2024/2024-09-18-z21-cloudcone-cheap-vps/"/>
    <id>https://www.gsgundam.com/2024/2024-09-18-z21-cloudcone-cheap-vps/</id>
    <published>2024-09-18T13:30:00.000Z</published>
    <updated>2024-09-18T13:41:44.618Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/cloudcone.jpg"></p><p>今天无意看了一下 <code>CloudCone</code> 发现有新上的隐藏特价VPS。</p><table><thead><tr><th>CPU&#x2F;内存&#x2F;硬盘</th><th>流量@带宽</th><th>价格</th><th></th></tr></thead><tbody><tr><td>1核&#x2F;1G&#x2F;7G</td><td>3T&#x2F;月@1Gbps</td><td>12美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/260/create?ref=8791&token=cloudcone.cc-24-vps-1">前往购买</a></td></tr><tr><td>2核&#x2F;1G&#x2F;100G</td><td>3T&#x2F;月@1Gbps</td><td>14.5美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/279/create?token=mcs-24-vps-8&ref=8791">已售罄</a></td></tr><tr><td>2核&#x2F;2G&#x2F;200G</td><td>4T&#x2F;月@1Gbps</td><td>25.5美元&#x2F;年</td><td><a href="https://app.cloudcone.com.cn/vps/278/create?token=mcs-24-vps-7&ref=8791">已售罄</a></td></tr></tbody></table><p>发现得太晚了，后两台配置都没有了。但是就算第一台也是很划算的，随便跑点什么小东西，毕竟一年才12刀。</p><p>为什么推荐他们家？因为支持支付宝付款呀！而且我自己从2019年用到现在，中途也给朋友们推荐过好几次了。</p><p>总的来说是很稳定的，推给同行老总们看了也说好，哈哈哈。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/cloudcone.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;今天无意看了一下 &lt;code&gt;CloudCone&lt;/code&gt; 发现有新上的隐</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="虚拟主机" scheme="https://www.gsgundam.com/tags/%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA/"/>
    
    <category term="VPS" scheme="https://www.gsgundam.com/tags/VPS/"/>
    
    <category term="云服务器" scheme="https://www.gsgundam.com/tags/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="特价" scheme="https://www.gsgundam.com/tags/%E7%89%B9%E4%BB%B7/"/>
    
    <category term="支付宝" scheme="https://www.gsgundam.com/tags/%E6%94%AF%E4%BB%98%E5%AE%9D/"/>
    
  </entry>
  
  <entry>
    <title>中药执业药师考试中药在线电子笔记分享（三）</title>
    <link href="https://www.gsgundam.com/2024/2024-09-13-z01-licensed-pharmacist-examination-online-note-III/"/>
    <id>https://www.gsgundam.com/2024/2024-09-13-z01-licensed-pharmacist-examination-online-note-III/</id>
    <published>2024-09-12T17:30:00.000Z</published>
    <updated>2024-09-12T17:06:52.161Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/3088.jpg_wh300.jpg"></p><p>汇报下进度，中药一的笔记目前整理的超级慢，大概才1&#x2F;3，然而只有37天就考试了 😭</p><p>在整理过程中发现中药鉴定的彩图十分不清晰，所以又找到了一份高清彩图跟大家分享：</p><p> 🔗 <a href="https://www.kdocs.cn/l/cehb1ayE2WZY">执业药师中药一鉴定图(2024)(PDF)</a></p><p>再发一下之前的资料，方便大家自取。</p><p> 🔗 <a href="https://kdocs.cn/l/cp8o32JBnXVp">执业药师考试-中药一-集训营配套教材(PDF)</a></p><p> 🔗 <a href="https://kdocs.cn/l/cmADj4h3p2bn">执业药师考试-中药一电子笔记</a></p><p> 🔗 <a href="https://www.kdocs.cn/l/cqVG7YQSiWaY?R=L1MvMQ==">执业药师考试-中药二电子笔记</a></p><p>暂时中药二还比较安全，在<code>超级题库</code>里买的卷子基本上都能及格了。一边查漏补缺还一边在完善中药二的笔记。个人感觉如果能记牢笔记里的内容，即便很难的卷子，上90都很容易了。</p><p>但是中药一真危啊！十分着急 😨</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/3088.jpg_wh300.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;汇报下进度，中药一的笔记目前整理的超级慢，大概才1&amp;#x2F;3，然</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="执业药师" scheme="https://www.gsgundam.com/tags/%E6%89%A7%E4%B8%9A%E8%8D%AF%E5%B8%88/"/>
    
    <category term="润德教育" scheme="https://www.gsgundam.com/tags/%E6%B6%A6%E5%BE%B7%E6%95%99%E8%82%B2/"/>
    
    <category term="电子笔记" scheme="https://www.gsgundam.com/tags/%E7%94%B5%E5%AD%90%E7%AC%94%E8%AE%B0/"/>
    
    <category term="金山文档" scheme="https://www.gsgundam.com/tags/%E9%87%91%E5%B1%B1%E6%96%87%E6%A1%A3/"/>
    
    <category term="中药" scheme="https://www.gsgundam.com/tags/%E4%B8%AD%E8%8D%AF/"/>
    
  </entry>
  
  <entry>
    <title>中药执业药师考试中药在线电子笔记分享（二）</title>
    <link href="https://www.gsgundam.com/2024/2024-09-05-z01-licensed-pharmacist-examination-online-note-II/"/>
    <id>https://www.gsgundam.com/2024/2024-09-05-z01-licensed-pharmacist-examination-online-note-II/</id>
    <published>2024-09-04T17:30:00.000Z</published>
    <updated>2024-09-12T17:04:21.380Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/73e6e1119811811159cb7af065a0f46c.jpg"></p><p>药二的笔记终于整理完了，而且也花了接近3天时间给中药一的笔记做好了准备工作，那就是，<strong>扫描了整本集训营教材！</strong></p><p>没错，因为我一开始也按药二的方式把纸质笔记整理成电子表格，但是发现个严重的问题，那就是中药一的知识结构不那么成体系，甚至法规都比它有体系，它纯粹是各种小知识点的集合。</p><p>分析了一番，可能最好的方式，就是直接将教材变成电子版。目前有PDF版和Word版，都提供出来。PDF版肯定最完美的还原了书的原貌，但是不能搜索，所以我买了WPS会员转换成了Word版本（试了很多工具和源码，WPS是效果最好的）。最终的笔记也会全部体现在Word文档中。</p><p> 🔗 <a href="https://kdocs.cn/l/cp8o32JBnXVp">执业药师考试-中药一-集训营配套教材(PDF)</a></p><p> 🔗 <a href="https://kdocs.cn/l/cmADj4h3p2bn">执业药师考试-中药一电子笔记</a></p><p>首先还是要说明，上述文档是基于<code>润德教育</code>集训营课程的，2023和2024的药一课程我都买了，所以就基于最新的2024来做了（但是明显2023的课程内容涵盖得更多，我猜想应该是针对2023年的考试出题进行了调整）。</p><p>如果没有参加过润德的课，可能这个书和笔记看起来可能都有点难理解。但是对于学过的朋友来说，应该会跟我一样觉得很有用处。</p><p>而且这个集训营课程是针对过考的，虽然包含的知识点并不全面，但是全部掌握以后，过考是没问题的。非常推荐大家购买这个课，应该是他们整个体系中，我觉得最值的课程之一（另一个课程是速效救命班）</p><p>最后把上一篇提到的中药二的笔记也放在一起提供。</p><p> 🔗 <a href="https://www.kdocs.cn/l/cqVG7YQSiWaY?R=L1MvMQ==">执业药师考试-中药二电子笔记</a></p><p>有更新会在文章里提到的。最后祝大家从容不迫，逢考必过！💪</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/73e6e1119811811159cb7af065a0f46c.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;药二的笔记终于整理完了，而且也花</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="执业药师" scheme="https://www.gsgundam.com/tags/%E6%89%A7%E4%B8%9A%E8%8D%AF%E5%B8%88/"/>
    
    <category term="润德教育" scheme="https://www.gsgundam.com/tags/%E6%B6%A6%E5%BE%B7%E6%95%99%E8%82%B2/"/>
    
    <category term="电子笔记" scheme="https://www.gsgundam.com/tags/%E7%94%B5%E5%AD%90%E7%AC%94%E8%AE%B0/"/>
    
    <category term="金山文档" scheme="https://www.gsgundam.com/tags/%E9%87%91%E5%B1%B1%E6%96%87%E6%A1%A3/"/>
    
    <category term="中药" scheme="https://www.gsgundam.com/tags/%E4%B8%AD%E8%8D%AF/"/>
    
  </entry>
  
  <entry>
    <title>中药执业药师考试在线电子笔记分享（一）</title>
    <link href="https://www.gsgundam.com/2024/2024-08-29-z18-licensed-pharmacist-examination-online-note/"/>
    <id>https://www.gsgundam.com/2024/2024-08-29-z18-licensed-pharmacist-examination-online-note/</id>
    <published>2024-08-29T10:30:00.000Z</published>
    <updated>2024-09-12T16:43:07.234Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/41174a4a40218c9fbbf4e8fb1357332be95f97cf.jpg"></p><p>最近肝药考，本来想脱离电子设备的，结果开始题海战术以后，发现没有电子版的笔记，查起来真是特别麻烦，相当费时间。所以做了这个电子版，<del>目前还没有完成，但是已经包含了将近一半的内容了</del>，目前已经全部整理完成，正在一边做题，一边完善。</p><p> 🔗 <a href="https://www.kdocs.cn/l/cqVG7YQSiWaY?R=L1MvMQ==">执业药师考试-中药二电子笔记</a></p><p>这个东西是基于<code>润德教育</code>集训营课程的，我是2023年买的药二课，所以内容也是2023相关。如果没有参加过润德的课，可能这个笔记看起来有点难理解。但是对于学过的朋友来说，应该会跟我一样觉得很有用处。</p><p>而且这个集训营课程是针对过考的，包含的知识点不全面，只能说全部掌握以后，过考是没问题的。</p><p><del>后面应该还会出药一的笔记，因为现在也都是纸质版的，找起来太麻烦了</del>。</p><p>药一的笔记也出来了，在下边这篇文章里。</p><p><a href="/2024-09-05-z01-licensed-pharmacist-examination-online-note-II/">执业药师考试在线电子笔记分享（二）</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/41174a4a40218c9fbbf4e8fb1357332be95f97cf.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;最近肝药考，本来</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="执业药师" scheme="https://www.gsgundam.com/tags/%E6%89%A7%E4%B8%9A%E8%8D%AF%E5%B8%88/"/>
    
    <category term="润德教育" scheme="https://www.gsgundam.com/tags/%E6%B6%A6%E5%BE%B7%E6%95%99%E8%82%B2/"/>
    
    <category term="电子笔记" scheme="https://www.gsgundam.com/tags/%E7%94%B5%E5%AD%90%E7%AC%94%E8%AE%B0/"/>
    
    <category term="金山文档" scheme="https://www.gsgundam.com/tags/%E9%87%91%E5%B1%B1%E6%96%87%E6%A1%A3/"/>
    
    <category term="中药" scheme="https://www.gsgundam.com/tags/%E4%B8%AD%E8%8D%AF/"/>
    
  </entry>
  
  <entry>
    <title>游戏资源</title>
    <link href="https://www.gsgundam.com/games/games-guide/"/>
    <id>https://www.gsgundam.com/games/games-guide/</id>
    <published>2024-07-27T02:30:00.000Z</published>
    <updated>2024-10-05T09:32:12.177Z</updated>
    
    <content type="html"><![CDATA[<p>这里整理了一些游戏资源，这里的游戏都是免费版或者开源版，收集自网络。如果有版权问题，请联系站长删除。</p><p>如果文件需要解压密码，请关注公众号并发送压缩包名中的ID，例如 <strong>IDxxxxx</strong> 或 <strong>xxxxx</strong>(去掉”ID”这两个英文字母) ，即可获取解压密码。</p><h2 id="战锤40K-战争黎明-灵魂风暴-终极启示录-衍生修改-📅-2024-10-05"><a href="#战锤40K-战争黎明-灵魂风暴-终极启示录-衍生修改-📅-2024-10-05" class="headerlink" title="战锤40K 战争黎明 灵魂风暴 终极启示录 [衍生修改] 📅 2024.10.05"></a>战锤40K 战争黎明 灵魂风暴 终极启示录 [衍生修改] <font color=#999 size=2>📅 2024.10.05</font></h2><h3 id="下载链接"><a href="#下载链接" class="headerlink" title="下载链接"></a>下载链接</h3><p><a href="https://pan.baidu.com/s/17iJDXpEY--OzAq01akIhlA?pwd=wma2">💾百度网盘 📦下载地址(v1.89.54含游戏本体和MOD)</a> | 提取码: <code>wma2</code> | <strong>「软件ID: <code>ID90009</code>」</strong></p><h3 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h3><p>《战锤40K：战争黎明》由Relic小组（又称水雷小组）开发的即时战略游戏，该小组曾因开发“家园”系列而闻名。游戏推出时间为2004年，由THQ发行（现已被SEGA收购）。</p><p>游戏通过“占点”方式获得资源，强调前线作战的激烈度，同时以小组形式制造和指挥。通过资料片扩充，游戏本体最终拥有多达9个可操纵种族。</p><p><code>终极启示录（UltimateApocalypse）</code> 作为一款优秀的MOD模组，在保持游戏原有乐趣和操作的前提下，创造了更多单位和种族，并最大程度地维持了平衡性。在这里你可以指挥泰伦虫族、混沌恶魔，也可以操纵全新的灵族机甲、死灵战车。</p><blockquote><p>个人体验：《战锤40K 战争黎明》的受众不算很广，估计还没有中古战锤的玩家多。但是战争黎明的第一代可谓是出道即巅峰，即便是现在看起来比较糟糕的画面，在当时也是很优秀的存在，更不用说手感、玩法都几乎碾压2代和3代。目前我还没有太多时间来玩 <code>终极启示录（UltimateApocalypse）</code> 这个模组，有机会开个直播跟大家一起分享。另外 <code>Unification</code>（该MOD有超多星际战团作为独立阵营） 也是非常优秀的MOD，但奈何我用 Unification 版本进入遭遇战会闪退。有懂行的朋友还请多多指教。</p></blockquote><h2 id="《黑神话：悟空》PC工具包-辅助工具-📅-2024-9-12"><a href="#《黑神话：悟空》PC工具包-辅助工具-📅-2024-9-12" class="headerlink" title="《黑神话：悟空》PC工具包[辅助工具] 📅 2024.9.12"></a>《黑神话：悟空》PC工具包[辅助工具] <font color=#999 size=2>📅 2024.9.12</font></h2><h3 id="下载链接-1"><a href="#下载链接-1" class="headerlink" title="下载链接"></a>下载链接</h3><p><a href="https://pan.baidu.com/s/1akINIsTt3Ydo3lVPFeOIPQ?pwd=i9jk">💾百度网盘 📦下载地址</a> | 提取码: <code>i9jk</code> | <strong>「软件ID: <code>ID99001</code>」</strong></p><h3 id="简介-1"><a href="#简介-1" class="headerlink" title="简介"></a>简介</h3><p>《黑神话：悟空》真是火爆全球了。</p><p>除了在品质上做到了顶流水准之外，他们真正做到了游戏的独特性。以独具特色的武器和技能，源自小说的变化与法术，加上配套的辅助系统，构成了本作完全符合「西游文化」体系同时又有别于其他同类游戏的「护城河」，这是最让人欣喜的一点。虽然游戏并没有职业系统，但利用不同的武器&#x2F;技能&#x2F;招式依然做到了多样化，游戏系统的深度和广度足以让玩家们体验到不同的战斗乐趣。</p><p>本作不仅在品质上令人惊喜，更是在核心玩法上做到了独此一家。</p><blockquote><p>个人体验：游戏的好不用说了，真的是我们这一代游戏人的骄傲。周围有一些没怎么接触过游戏的朋友玩得很困难，这个工具包中除了<code>画质增强</code>、<code>光影增强</code>、<code>互动地图</code>这几个视觉体验友好工具外，也提供了让大家变得更加生猛的小道具。适度使用，别让它毁了游戏性~</p></blockquote><h2 id="植物大战僵尸杂交版-衍生修改-📅-2024-9-12"><a href="#植物大战僵尸杂交版-衍生修改-📅-2024-9-12" class="headerlink" title="植物大战僵尸杂交版[衍生修改] 📅 2024.9.12"></a>植物大战僵尸杂交版[衍生修改] <font color=#999 size=2>📅 2024.9.12</font></h2><h3 id="下载链接-2"><a href="#下载链接-2" class="headerlink" title="下载链接"></a>下载链接</h3><p><a href="https://pan.baidu.com/s/1XpXQw8tFDCttnZgpAjSsJA?pwd=rpfb">💾百度网盘 📦下载地址-2.4版</a> | 提取码: <code>rpfb</code> | <strong>「软件ID: <code>ID90007</code>」</strong></p><p><a href="https://pan.baidu.com/s/1h_k8qstt-5Ncp25CNIC3EA?pwd=v9f8">💾百度网盘 📦下载地址-2.3.7版</a> | 提取码: <code>v9f8</code> | <strong>「软件ID: <code>ID90005</code>」</strong></p><p><a href="https://pan.baidu.com/s/1V7XgHnWdKPjpkCJPn6YnXw?pwd=4g5y">💾百度网盘 📦下载地址-2.2版</a> | 提取码: <code>4g5y</code> | <strong>「软件ID: <code>ID90004</code>」</strong></p><p><a href="https://pan.baidu.com/s/1MLsbPKYNtiwxtS_W1HM61g?pwd=mjkj">💾百度网盘 📦下载地址-2.0版</a> | 提取码: <code>mjkj</code> | <strong>「软件ID: <code>ID90001</code>」</strong></p><h3 id="简介-2"><a href="#简介-2" class="headerlink" title="简介"></a>简介</h3><p>植物大战僵尸杂交版是一款富有创意和策略性的塔防游戏，它巧妙地结合了经典的植物大战僵尸玩法与独特的植物杂交系统，为玩家带来了一种全新的游戏体验。</p><p>杂交版是由B站UP主“潜艇伟伟迷”（本名：曾佳伟）开发的同人游戏，他基于原版游戏进行了大量的创新和改良。这款游戏的创作初衷是为了弥补作者童年的意难平，并为大家带来欢乐。由于其高质量的内容和独特的玩法，杂交版在玩家中获得了极高的评价和关注度。</p><blockquote><p>个人体验：杂交版除了丰富的植物、僵尸和关卡外，游戏的平衡性和爽快感拿捏得很合适，体验不错。</p></blockquote><h2 id="植物大战僵尸：融合-衍生修改-📅-2024-9-12"><a href="#植物大战僵尸：融合-衍生修改-📅-2024-9-12" class="headerlink" title="植物大战僵尸：融合[衍生修改] 📅 2024.9.12"></a>植物大战僵尸：融合[衍生修改] <font color=#999 size=2>📅 2024.9.12</font></h2><h3 id="下载链接-3"><a href="#下载链接-3" class="headerlink" title="下载链接"></a>下载链接</h3><p><a href="https://pan.baidu.com/s/1MpsrGP6LfQGUUtTot0gJbw?pwd=34kn">💾百度网盘 📦下载地址-2.0.4版(手机+PC)</a> | 提取码: <code>34kn</code> | <strong>「软件ID: <code>ID90008</code>」</strong></p><p><a href="https://pan.baidu.com/s/1vHs8UBjOK1yeqpSvgT9k0g?pwd=yiep">💾百度网盘 📦下载地址-2.0版(手机+PC)</a> | 提取码: <code>yiep</code> | <strong>「软件ID: <code>ID90006</code>」</strong></p><p><a href="https://pan.baidu.com/s/1y92lUH7I0QwYtcolRIPRZA?pwd=yqpd">💾百度网盘 📦下载地址-1.3版</a> | 提取码: <code>yqpd</code> | <strong>「软件ID: <code>ID90003</code>」</strong></p><p><a href="https://pan.baidu.com/s/1uV3lwmPRWIsOR1tfiFyi6w?pwd=1tm1">💾百度网盘 📦下载地址-1.2版</a> | 提取码: <code>1tm1</code> | <strong>「软件ID: <code>ID90002</code>」</strong></p><h3 id="简介-3"><a href="#简介-3" class="headerlink" title="简介"></a>简介</h3><p>在这款融合版的PVZ游戏中，在原本的基础上面增加了融合的机制，所有的植物和僵尸都在原版基础上进行了升级，使游戏的玩法更具特色，玩家们可以将一个植物种在另一个植物身上来进行融合，变成一个新的植物。</p><p>融合版的作者是B站UP主“蓝飘飘fly”，这款同人游戏由于其独特的玩法，在一众植物大战僵尸衍生版中脱颖而出，成为在玩法关注度上仅次于杂交版的存在。而UP主本人则是非常低调的潜心更新，提升游戏品质。</p><blockquote><p>个人体验：融合版虽然整体来说都不错，但是爽快度上还是略显不足。闪光点主要在美术上，与原版风格高度一致，而且不少的设计都很不错，比原版更吸引眼球。</p></blockquote>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;这里整理了一些游戏资源，这里的游戏都是免费版或者开源版，收集自网络。如果有版权问题，请联系站长删除。&lt;/p&gt;
&lt;p&gt;如果文件需要解压密码，请关注公众号并发送压缩包名中的ID，例如 &lt;strong&gt;IDxxxxx&lt;/strong&gt; 或 &lt;strong&gt;xxxxx&lt;/stron</summary>
      
    
    
    
    <category term="游戏" scheme="https://www.gsgundam.com/categories/%E6%B8%B8%E6%88%8F/"/>
    
    
    <category term="软件" scheme="https://www.gsgundam.com/tags/%E8%BD%AF%E4%BB%B6/"/>
    
    <category term="游戏" scheme="https://www.gsgundam.com/tags/%E6%B8%B8%E6%88%8F/"/>
    
  </entry>
  
  <entry>
    <title>CentOS 下修复 &quot;ssl module in Python is not available&quot;</title>
    <link href="https://www.gsgundam.com/2024/2024-06-13-z21-fix-ssl-module-in-python-is-not-available-in-centos/"/>
    <id>https://www.gsgundam.com/2024/2024-06-13-z21-fix-ssl-module-in-python-is-not-available-in-centos/</id>
    <published>2024-06-13T13:30:00.000Z</published>
    <updated>2024-06-13T14:10:36.354Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/t014145f546f35c8414.jpg"></p><p>处理一个历史问题，需要重新部署服务器，写了一段python代码快速恢复环境。结果在 <code>pip install</code> 时报了错误</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip is configured with locations that require TLS/SSL, however the ssl module <span class="keyword">in</span> Python is not available. </span><br></pre></td></tr></table></figure><p>也不用多想，服务器本来是<code>3.6.8</code>的python环境，而我写的代码里有<code>3.9</code>以后的内容，因此升级了python，所以问题一定出在python找不到可用的 <code>openssl</code> 上。</p><p>google一下，轻松解决。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">yum install -y epel</span><br><span class="line">yum install -y openssl11-devel</span><br><span class="line">wget https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tgz</span><br><span class="line">tar zxvf Python-3.10.6.tgz</span><br><span class="line">cd Python-3.10.6</span><br><span class="line">sed -i &#x27;s/PKG_CONFIG openssl /PKG_CONFIG openssl11 /g&#x27; configure</span><br><span class="line">./configure --enable-optimizations</span><br><span class="line">make altinstall</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果运行以下命令没有报错，则说明配置成功</span></span><br><span class="line">python3.10 -m ssl</span><br></pre></td></tr></table></figure><p>很好，收工。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/t014145f546f35c8414.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;处理一个历史问题，需要重新部署服务器，写了一段python</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="修复" scheme="https://www.gsgundam.com/tags/%E4%BF%AE%E5%A4%8D/"/>
    
    <category term="ssl" scheme="https://www.gsgundam.com/tags/ssl/"/>
    
    <category term="centos" scheme="https://www.gsgundam.com/tags/centos/"/>
    
  </entry>
  
  <entry>
    <title>Python 爬虫抓取高校排名</title>
    <link href="https://www.gsgundam.com/2024/2024-05-13-z23-python-crawler-for-college-rankings/"/>
    <id>https://www.gsgundam.com/2024/2024-05-13-z23-python-crawler-for-college-rankings/</id>
    <published>2024-05-13T15:30:00.000Z</published>
    <updated>2024-05-13T19:05:48.247Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/banner20240514.png"></p><p>一位抖音网友老朋友的结课作业。要求是使用 <code>Python</code> 实现一个爬虫程序，根据省份抓取高校排名。</p><p>一开始我也有点困扰，因为给我的是 <code>https://www.shanghairanking.cn/rankings/bcur/2024</code> 这个网址，软科这个网页是 <code>Nuxt</code> 框架的，筛选省份没有url或者参数，交互是个挺头疼的事情。</p><p>当然，幸好还有张嘴，问了下，原来抓取的目标网址都是自己选的。那就好办了，找个结构简单的。直接上代码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># coding:utf-8</span></span><br><span class="line"><span class="keyword">from</span> bs4 <span class="keyword">import</span> BeautifulSoup</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> urllib3</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">from</span> my_fake_useragent <span class="keyword">import</span> UserAgent</span><br><span class="line"></span><br><span class="line">ua = UserAgent(family=<span class="string">&quot;chrome&quot;</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">getRandomUA</span>():</span><br><span class="line">    res = ua.random()</span><br><span class="line">    <span class="keyword">return</span> &#123;<span class="string">&quot;User-Agent&quot;</span>: res&#125;</span><br><span class="line"></span><br><span class="line">urllib3.disable_warnings()</span><br><span class="line"></span><br><span class="line">province_list = &#123;</span><br><span class="line">    <span class="string">&quot;河北&quot;</span>: <span class="string">&quot;https://www.cnur.com/region/1356.html&quot;</span>,</span><br><span class="line">    <span class="string">&quot;河南&quot;</span>: <span class="string">&quot;https://www.cnur.com/region/1401.html&quot;</span>,</span><br><span class="line">    <span class="string">&quot;山东&quot;</span>: <span class="string">&quot;https://www.cnur.com/region/1368.html&quot;</span>,</span><br><span class="line">    <span class="string">&quot;山西&quot;</span>: <span class="string">&quot;https://www.cnur.com/region/1357.html&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">getListUrl</span>(<span class="params">province</span>):</span><br><span class="line">    r = requests.get(province_list[province], headers=getRandomUA())</span><br><span class="line">    dom = BeautifulSoup(r.text, <span class="string">&quot;html.parser&quot;</span>)</span><br><span class="line">    table = dom.find(<span class="string">&quot;table&quot;</span>)</span><br><span class="line">    rows = table.find(<span class="string">&#x27;tbody&#x27;</span>).find_all(<span class="string">&#x27;tr&#x27;</span>)</span><br><span class="line">    <span class="comment"># 表头是第一行</span></span><br><span class="line">    header = [th.text <span class="keyword">for</span> th <span class="keyword">in</span> rows[<span class="number">0</span>].find_all(<span class="string">&#x27;td&#x27;</span>)]</span><br><span class="line">    <span class="comment"># 表格的数据</span></span><br><span class="line">    data = [[td.text <span class="keyword">for</span> td <span class="keyword">in</span> row.find_all(<span class="string">&#x27;td&#x27;</span>)] <span class="keyword">for</span> row <span class="keyword">in</span> rows[<span class="number">1</span>:]]</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 存为csv文件</span></span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">f&quot;<span class="subst">&#123;province&#125;</span>.csv&quot;</span>, <span class="string">&quot;w&quot;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        f.write(<span class="string">&quot;,&quot;</span>.join(header) + <span class="string">&quot;\n&quot;</span>)</span><br><span class="line">        <span class="keyword">for</span> row <span class="keyword">in</span> data:</span><br><span class="line">            f.write(<span class="string">&quot;,&quot;</span>.join(row) + <span class="string">&quot;\n&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    <span class="keyword">for</span> province <span class="keyword">in</span> province_list:</span><br><span class="line">        getListUrl(province)</span><br><span class="line">        time.sleep(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>多余的注释也没写，总之就是实现了题目的要求。</p><p>当然，虽然只做了这点，其实还有其他思考的点，比如：如果要使用交互方式查询想要的省份怎么做？如果硬要解析软科的页面怎么做？</p><p>习惯思考，这也是对自己的奖励。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/banner20240514.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;一位抖音网友老朋友的结课作业。要求是使用 &lt;code&gt;Python&lt;</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="爬虫" scheme="https://www.gsgundam.com/tags/%E7%88%AC%E8%99%AB/"/>
    
    <category term="抓取" scheme="https://www.gsgundam.com/tags/%E6%8A%93%E5%8F%96/"/>
    
    <category term="高校排名" scheme="https://www.gsgundam.com/tags/%E9%AB%98%E6%A0%A1%E6%8E%92%E5%90%8D/"/>
    
  </entry>
  
  <entry>
    <title>CentOS 7 安装 phpize 以及引出的其他问题</title>
    <link href="https://www.gsgundam.com/2024/2024-05-08-z23-centos-7-install-phpize-and-others/"/>
    <id>https://www.gsgundam.com/2024/2024-05-08-z23-centos-7-install-phpize-and-others/</id>
    <published>2024-05-08T15:30:00.000Z</published>
    <updated>2024-05-08T17:03:22.349Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/linux-anime-devushki-temnyi-fon.jpg"></p><p>起因已经忘了，总之就是服务器因为要使用新功能，所以要配置相应的环境，然后安装 <code>phpize</code> 报错。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># yum install -y phpize</span></span><br><span class="line">Can<span class="string">&#x27;t locate Carp.pm in @INC (@INC contains: /usr/share/autoconf /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/lib64/perl5/vendor_perl/Data/Dumper.pm line 22.</span></span><br><span class="line"><span class="string">BEGIN failed--compilation aborted at /usr/lib64/perl5/vendor_perl/Data/Dumper.pm line 22.</span></span><br><span class="line"><span class="string">Compilation failed in require at /usr/share/autoconf/Autom4te/C4che.pm line 33.</span></span><br><span class="line"><span class="string">BEGIN failed--compilation aborted at /usr/share/autoconf/Autom4te/C4che.pm line 33.</span></span><br><span class="line"><span class="string">Compilation failed in require at /usr/bin/autom4te line 37.</span></span><br><span class="line"><span class="string">BEGIN failed--compilation aborted at /usr/bin/autom4te line 37.</span></span><br></pre></td></tr></table></figure><h1 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h1><h2 id="安装-Carp-依赖包"><a href="#安装-Carp-依赖包" class="headerlink" title="安装 Carp 依赖包"></a>安装 Carp 依赖包</h2><p>根据上面的错误，第一反应是安装Carp依赖。在 <a href="https://pkgs.org/download/perl-Carp">https://pkgs.org/download/perl-Carp</a> 网站按照自己需求进行下载，不同的依赖包都可以在  <a href="https://pkgs.org/download/%E4%BE%9D%E8%B5%96%E5%8C%85%E5%90%8D%E7%A7%B0">https://pkgs.org/download/依赖包名称</a> 进行查找下载。</p><p>然后安装rpm包。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># rpm -Uvh /root/perl-Carp-1.26-244.el7.noarch.rpm --nodeps --force</span></span><br><span class="line">/usr/bin/perl: symbol lookup error: /usr/lib64/perl5/vendor_perl/auto/Cwd/Cwd.so: undefined symbol: Perl_Gthr_key_ptr</span><br></pre></td></tr></table></figure><p>不出意外的话就要出意外了， <code>Perl</code> 报错。是因为版本太低了。</p><h2 id="升级系统自带的-Perl"><a href="#升级系统自带的-Perl" class="headerlink" title="升级系统自带的 Perl"></a>升级系统自带的 Perl</h2><p>CentOS 系统自带的 <code>Perl</code> 版本是5.8.8，相当落后。</p><p>下载合适的 Perl 版本进行安装。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># cd ~</span></span><br><span class="line"><span class="comment"># wget -C http://www.cpan.org/src/5.0/perl-5.14.1.tar.gz</span></span><br><span class="line"><span class="comment"># tar perl-5.14.1.tar.gz </span></span><br><span class="line"><span class="comment"># cd perl-5.14.1 </span></span><br><span class="line"><span class="comment"># ./Configure -des -Dprefix=/usr </span></span><br><span class="line"><span class="comment"># make &amp;&amp; make install</span></span><br></pre></td></tr></table></figure><p>如果这步解决了的话，也有点太容易了，继续解决问题。先后报了两个问题。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">/usr/include/xlocale.h:27:16: error: redefinition of <span class="string">&#x27;struct __locale_struct&#x27;</span></span><br><span class="line">typedef struct __locale_struct</span><br><span class="line">^~~~~~~~~~~~~~~</span><br><span class="line">In file included from /usr/include/bits/types/locale_t.h:22,</span><br><span class="line">from /usr/include/stdlib.h:272,</span><br><span class="line">from ../glib/gstrfuncs.c:35:</span><br><span class="line">/usr/include/bits/types/__locale_t.h:28:8: note: originally defined here</span><br><span class="line">struct __locale_struct</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">system libzip must be upgraded to version &gt;= 0.11</span><br></pre></td></tr></table></figure><p>逐个解决即可。</p><h2 id="xlocale-h"><a href="#xlocale-h" class="headerlink" title="xlocale.h"></a>xlocale.h</h2><p>把 &#x2F;usr&#x2F;include&#x2F;xlocale.h 中的内容屏蔽掉。</p><figure class="highlight h"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifndef</span> _XLOCALE_H</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> _XLOCALE_H      1</span></span><br><span class="line"> </span><br><span class="line"><span class="meta">#<span class="keyword">if</span> 0</span></span><br><span class="line"><span class="comment">/* Structure for reentrant locale using functions.  This is an</span></span><br><span class="line"><span class="comment">   (almost) opaque type for the user level programs.  The file and</span></span><br><span class="line"><span class="comment">   this data structure is not standardized.  Don&#x27;t rely on it.  It can</span></span><br><span class="line"><span class="comment">   go away without warning.  */</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> __<span class="title">locale_struct</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">  <span class="comment">/* Note: LC_ALL is not a valid index into this array.  */</span></span><br><span class="line">  <span class="class"><span class="keyword">struct</span> __<span class="title">locale_data</span> *__<span class="title">locales</span>[13];</span> <span class="comment">/* 13 = __LC_LAST. */</span></span><br><span class="line"> </span><br><span class="line">  <span class="comment">/* To increase the speed of this solution we add some special members.  */</span></span><br><span class="line">  <span class="type">const</span> <span class="type">unsigned</span> <span class="type">short</span> <span class="type">int</span> *__ctype_b;</span><br><span class="line">  <span class="type">const</span> <span class="type">int</span> *__ctype_tolower;</span><br><span class="line">  <span class="type">const</span> <span class="type">int</span> *__ctype_toupper;</span><br><span class="line"> </span><br><span class="line">  <span class="comment">/* Note: LC_ALL is not a valid index into this array.  */</span></span><br><span class="line">  <span class="type">const</span> <span class="type">char</span> *__names[<span class="number">13</span>];</span><br><span class="line">&#125; *<span class="type">__locale_t</span>;</span><br><span class="line"> </span><br><span class="line"><span class="comment">/* POSIX 2008 makes locale_t official.  */</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="type">__locale_t</span> <span class="type">locale_t</span>;</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"> </span><br><span class="line"><span class="meta">#<span class="keyword">endif</span> <span class="comment">/* xlocale.h */</span></span></span><br></pre></td></tr></table></figure><h2 id="升级系统自带的-libzip"><a href="#升级系统自带的-libzip" class="headerlink" title="升级系统自带的 libzip"></a>升级系统自带的 libzip</h2><p>先卸载系统自带的libzip。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># yum -y remove libzip-devel</span></span><br></pre></td></tr></table></figure><p>然后从官网下载并编译安装合适的版本。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># cd ~</span></span><br><span class="line"><span class="comment"># wget https://libzip.org/download/libzip-1.3.2.tar.gz</span></span><br><span class="line"><span class="comment"># tar xvf libzip-1.3.2.tar.gz</span></span><br><span class="line"><span class="comment"># cd libzip-1.3.2</span></span><br><span class="line"><span class="comment"># ./configure</span></span><br><span class="line"><span class="comment"># make &amp;&amp; make install</span></span><br></pre></td></tr></table></figure><h2 id="安装-GNU-m4"><a href="#安装-GNU-m4" class="headerlink" title="安装 GNU m4"></a>安装 GNU m4</h2><p>永远都有意外发生，解决完前两个问题，又报下面的错误了。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">autom4te: need GNU m4 1.4 or later: /usr/bin/m4</span><br></pre></td></tr></table></figure><p>那就安装 <code>GNU m4</code> 吧。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># cd ~</span></span><br><span class="line"><span class="comment"># wget http://mirrors.kernel.org/gnu/m4/m4-1.4.13.tar.gz</span></span><br><span class="line"><span class="comment"># tar -xzvf m4-1.4.18.tar.gz</span></span><br><span class="line"><span class="comment"># cd m4-1.4.18 </span></span><br><span class="line"><span class="comment"># ./configure -prefix=/usr/local</span></span><br><span class="line"><span class="comment"># make &amp;&amp; make install</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">ln</span> -s /usr/local/bin/m4 /usr/bin/m4</span><br></pre></td></tr></table></figure><h2 id="收尾"><a href="#收尾" class="headerlink" title="收尾"></a>收尾</h2><p>最后整理一下如果所有报错都存在的情况下，实际上的安装处理顺序：<code>xlocale.h</code> → <code>libzip</code> → <code>GNU m4</code> → <code>Perl</code> → <code>Carp</code> → <code>phpize</code> 。</p><p>收工。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/linux-anime-devushki-temnyi-fon.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;起因已经忘了，总之就是服务器因为要</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="php" scheme="https://www.gsgundam.com/tags/php/"/>
    
    <category term="centos" scheme="https://www.gsgundam.com/tags/centos/"/>
    
    <category term="phpize" scheme="https://www.gsgundam.com/tags/phpize/"/>
    
    <category term="perl" scheme="https://www.gsgundam.com/tags/perl/"/>
    
    <category term="carp" scheme="https://www.gsgundam.com/tags/carp/"/>
    
    <category term="libzip" scheme="https://www.gsgundam.com/tags/libzip/"/>
    
    <category term="xlocale" scheme="https://www.gsgundam.com/tags/xlocale/"/>
    
  </entry>
  
  <entry>
    <title>工具软件资源</title>
    <link href="https://www.gsgundam.com/tools/tools-guide/"/>
    <id>https://www.gsgundam.com/tools/tools-guide/</id>
    <published>2024-05-06T14:30:00.000Z</published>
    <updated>2025-01-04T16:12:01.583Z</updated>
    
    <content type="html"><![CDATA[<p>这里整理了一些常用工具软件资源。</p><p>如果文件需要解压密码，请关注公众号并发送压缩包名中的ID，例如 <strong>IDxxxxx</strong> 或 <strong>xxxxx</strong>(去掉”ID”这两个英文字母) ，即可获取解压密码。</p><h2 id="BandiZip-v6-29-最终官方无广告免费版本-压缩解压-📅-2024-5-6"><a href="#BandiZip-v6-29-最终官方无广告免费版本-压缩解压-📅-2024-5-6" class="headerlink" title="BandiZip v6.29 最终官方无广告免费版本 [压缩解压] 📅 2024.5.6"></a>BandiZip v6.29 最终官方无广告免费版本 [压缩解压] <font color=#999 size=2>📅 2024.5.6</font></h2><h3 id="下载链接"><a href="#下载链接" class="headerlink" title="下载链接"></a>下载链接</h3><p><a href="https://gsgundam.lanzouo.com/iKxj81xxfspg">💾蓝奏云 📦下载地址</a> | 提取码: <code>6dmj</code></p><h3 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h3><p>号称解压速度最快的压缩和解压缩文件管理器。支持多核快速压缩、文件拖放，可创建带密码和多卷的压缩包，可提取包括RAR&#x2F;RAR5&#x2F;7Z&#x2F;ZIP在内30多种格式，支持WinZip、7-Zip 和 WinRAR 及其它压缩格式。</p><h3 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h3><p><strong>把安装目录下的”Updater.exe”文件删除，即可取消更新提示。</strong></p><h2 id="GPU-Z-v2-59-0-显卡检测工具中文单文件版-硬件检测-📅-2024-5-7"><a href="#GPU-Z-v2-59-0-显卡检测工具中文单文件版-硬件检测-📅-2024-5-7" class="headerlink" title="GPU-Z v2.59.0 显卡检测工具中文单文件版 [硬件检测] 📅 2024.5.7"></a>GPU-Z v2.59.0 显卡检测工具中文单文件版 [硬件检测] <font color=#999 size=2>📅 2024.5.7</font></h2><h3 id="下载链接-1"><a href="#下载链接-1" class="headerlink" title="下载链接"></a>下载链接</h3><p><a href="https://gsgundam.lanzouo.com/iCk3L1xyjvba">💾蓝奏云 📦下载地址</a> | 提取码: <code>i3sz</code></p><h3 id="简介-1"><a href="#简介-1" class="headerlink" title="简介"></a>简介</h3><p>GPU-Z是一款轻量级实用程序，旨在为您提供有关视频卡和GPU的所有信息。还是一款绿色免安装显卡测试工具，只需一键即可自动查询当前电脑的显卡的各项信息参数。GPUZ检查的结果页面也很简单、明了，轻松掌握显卡各项信息参数。</p><h2 id="微软常用运行库合集32-64位合集-运行库-📅-2024-6-6"><a href="#微软常用运行库合集32-64位合集-运行库-📅-2024-6-6" class="headerlink" title="微软常用运行库合集32+64位合集 [运行库] 📅 2024.6.6"></a>微软常用运行库合集32+64位合集 [运行库] <font color=#999 size=2>📅 2024.6.6</font></h2><h3 id="下载链接-2"><a href="#下载链接-2" class="headerlink" title="下载链接"></a>下载链接</h3><p><a href="https://gsgundam.lanzouo.com/inTKh1xywccf">💾蓝奏云 📦下载地址</a> | 提取码: <code>14i4</code></p><p><a href="https://cqmzbhnltgo.feishu.cn/file/PjtHbPdnvoI7M8x5f5Cc5dYznuh">💾飞书云 📦下载地址</a></p><h3 id="简介-2"><a href="#简介-2" class="headerlink" title="简介"></a>简介</h3><p>所有的安装文件全部来自微软官方网站，且为最新数字签名版本。</p><p>某些网上和论坛的部分精简软件没有附带这些公用DLL，所以安装这些运行库是系统安装后第一件要做的事情。</p><p>某些程序在64位系统下运行仍然需要32位版本的运行库，因为程序是基于32位Visual Studio开发的，所以也需要安装32位版本。</p><h2 id="AIDA64-v7-30-6900-权威硬件检测工具至尊便携版-硬件检测-📅-2024-6-6"><a href="#AIDA64-v7-30-6900-权威硬件检测工具至尊便携版-硬件检测-📅-2024-6-6" class="headerlink" title="AIDA64 v7.30.6900 权威硬件检测工具至尊便携版 [硬件检测] 📅 2024.6.6"></a>AIDA64 v7.30.6900 权威硬件检测工具至尊便携版 [硬件检测] <font color=#999 size=2>📅 2024.6.6</font></h2><h3 id="下载链接-3"><a href="#下载链接-3" class="headerlink" title="下载链接"></a>下载链接</h3><p>[💾蓝奏云 📦下载地址][<a href="https://gsgundam.lanzouo.com/iTpQM212aa6h">https://gsgundam.lanzouo.com/iTpQM212aa6h</a>) | 提取码: <code>b32p</code></p><h3 id="简介-3"><a href="#简介-3" class="headerlink" title="简介"></a>简介</h3><p>AIDA64 (原EVEREST)是一款综合性的系统软硬件检测工具，最权威的电脑硬件监测、监控与测试软件，硬件检测大师。</p><p>AIDA64不仅提供诸如协助超频，硬件侦错，压力测试和传感器监测等多种功能，而且还可对处理器，系统内存和磁盘驱动器性能进行全面评估。</p><h2 id="ZD-Soft-Screen-Recorder-v17-7-5-0-录屏截图-📅-2024-5-7"><a href="#ZD-Soft-Screen-Recorder-v17-7-5-0-录屏截图-📅-2024-5-7" class="headerlink" title="ZD Soft Screen Recorder v17.7.5.0 [录屏截图] 📅 2024.5.7"></a>ZD Soft Screen Recorder v17.7.5.0 [录屏截图] <font color=#999 size=2>📅 2024.5.7</font></h2><h3 id="下载链接-4"><a href="#下载链接-4" class="headerlink" title="下载链接"></a>下载链接</h3><p><a href="https://gsgundam.lanzouo.com/iH6RG1xz21cf">💾蓝奏云 📦下载地址</a> | 提取码: <code>4s0t</code></p><h3 id="简介-4"><a href="#简介-4" class="headerlink" title="简介"></a>简介</h3><p>ZD Soft Screen Recorder是一款流畅无卡顿的高性能屏幕录像软件，可用于制作视频教程、转录在线视频、录制在线课程&#x2F;视频会议、录制&#x2F;直播电脑游戏画面等应用场景。同时您也可以用鼠标直接在屏幕上画标注，亦可通过麦克风来录入您的口述讲解。录制完成后如果发现视频首尾有多余的内容也可以轻松剪切掉，也可以把分多段录制的视频粘合成一个视频。</p><h2 id="Tiny10-23H1-极限精简版-Windows-10-系统镜像-x2F-支持安装中文语言-系统镜像-📅-2024-5-8"><a href="#Tiny10-23H1-极限精简版-Windows-10-系统镜像-x2F-支持安装中文语言-系统镜像-📅-2024-5-8" class="headerlink" title="Tiny10 (23H1) - 极限精简版 Windows 10 系统镜像 &#x2F; 支持安装中文语言 [系统镜像] 📅 2024.5.8"></a>Tiny10 (23H1) - 极限精简版 Windows 10 系统镜像 &#x2F; 支持安装中文语言 [系统镜像] <font color=#999 size=2>📅 2024.5.8</font></h2><h3 id="下载链接-5"><a href="#下载链接-5" class="headerlink" title="下载链接"></a>下载链接</h3><p><a href="https://pan.baidu.com/s/1EySXh2gxBHGdRVkede6kRw?pwd=mm2g">💾百度网盘 📦下载地址</a> | 提取码: <code>mm2g</code> | <strong>「软件ID: <code>ID80001</code>」</strong></p><h3 id="简介-5"><a href="#简介-5" class="headerlink" title="简介"></a>简介</h3><p>【Tiny 10 23H1】是基于最新版本的 Windows 10 LTSC 制作而成的精简版系统，它最大的特点是保留了“组件安装”功能，可以允许用户下载系统语言包、安装系统功能、下载安全更新等等。因此，这个版本的 Tiny10 可以很方便地安装中文语言包，也更加适合国人使用。</p><p>实际安装之后，Tiny 10 23H1 系统所占用的存储空间大概只有 7.69 GB。不过由于考虑到安全性、稳定性和实用性，新版所保留的组件比旧版本和其他一些精简版系统要多一丢丢，因此这次磁盘空间的占用并不是精简得那么的极限。换来的，也是相对稳定流畅的使用体验。</p><h2 id="Tiny11-2311-极限精简-Win11-系统镜像（包含ARM版）-x2F-含中文字库-系统镜像-📅-2024-5-8"><a href="#Tiny11-2311-极限精简-Win11-系统镜像（包含ARM版）-x2F-含中文字库-系统镜像-📅-2024-5-8" class="headerlink" title="Tiny11 2311 - 极限精简 Win11 系统镜像（包含ARM版）&#x2F; 含中文字库 [系统镜像] 📅 2024.5.8"></a>Tiny11 2311 - 极限精简 Win11 系统镜像（包含ARM版）&#x2F; 含中文字库 [系统镜像] <font color=#999 size=2>📅 2024.5.8</font></h2><h3 id="下载链接-6"><a href="#下载链接-6" class="headerlink" title="下载链接"></a>下载链接</h3><p><a href="https://pan.baidu.com/s/1tMOYA7YeB5CDvn80R3fKFA?pwd=aa31">💾百度网盘 📦下载地址-X64版</a> | 提取码: <code>aa31</code> | <strong>「软件ID: <code>ID80002</code>」</strong></p><p><a href="https://pan.baidu.com/s/1qDoOl9ntOOlQLu2fs9ODXg?pwd=uxhd">💾百度网盘 📦下载地址-ARM版</a> | 提取码: <code>uxhd</code> | <strong>「软件ID: <code>ID80003</code>」</strong></p><h3 id="简介-6"><a href="#简介-6" class="headerlink" title="简介"></a>简介</h3><p>【Tiny 11 2311】是一款专为低配置、小硬盘电脑优化的 Win11 精简系统。它除了有常规的 64 位系统 ISO 镜像外，还另外提供了 Tiny11 for ARM64 版本，更适合树莓派 4 等低功耗设备，同时也是网上唯一能支持在苹果 M1&#x2F;M2&#x2F;M3 处理器的 Mac 上安装运行的 Win11 ARM 精简版系统了。</p><p>Tiny11 不仅节省了硬盘存储占用，同时它对硬件资源的要求也变得更低。比如对于仅需 2GB 内存即可安装！而且已经默认帮你绕过了 Win11 的很多硬件要求限制(比如 TPM 2.0 或必须联网等)。实乃低配电脑和老电脑的福音。</p><h3 id="说明-1"><a href="#说明-1" class="headerlink" title="说明"></a>说明</h3><p>镜像本身只有英文语言，如果需要使用中文，可以安装完成后自行添加：</p><ol><li>使用 <code>Win</code>+<code>i</code> 快捷键打开系统设置，找到 “Time &amp; Language” 选项，在右侧找到 “Language &amp; region” 并打开。</li><li>在 “Language” 语言选项中，选择 “Add a Language” 并添加一个语言，在选项中找到“中华人民共和国”并添加即可。</li><li>提示：记得勾选 “Set as my Windows display language” 选项，将中文设置为你的 Windows 默认显示语言。</li><li>等待几分钟联网下载和安装后，注销并重启系统即可使用简体中文操作系统。</li><li>打开下载文件包含的字体文件夹，解压之后，按 <code>Ctrl</code>+<code>A</code> 选择全部字体文件。</li><li>鼠标右键点击，选择「安装」，最后重启即可。</li></ol><h2 id="ReviOS-专为游戏优化的-Win11-x2F-Win10-精简版系统-x2F-性能与稳定兼备-系统镜像-📅-2024-5-8"><a href="#ReviOS-专为游戏优化的-Win11-x2F-Win10-精简版系统-x2F-性能与稳定兼备-系统镜像-📅-2024-5-8" class="headerlink" title="ReviOS - 专为游戏优化的 Win11 &#x2F; Win10 精简版系统 &#x2F; 性能与稳定兼备 [系统镜像] 📅 2024.5.8"></a>ReviOS - 专为游戏优化的 Win11 &#x2F; Win10 精简版系统 &#x2F; 性能与稳定兼备 [系统镜像] <font color=#999 size=2>📅 2024.5.8</font></h2><h3 id="下载链接-7"><a href="#下载链接-7" class="headerlink" title="下载链接"></a>下载链接</h3><p><a href="https://pan.baidu.com/s/110DI3pk__KnTkf6uDyoePA?pwd=vsd7">💾百度网盘 📦下载地址-Win10</a> | 提取码: <code>vsd7</code> | <strong>「软件ID: <code>ID80004</code>」</strong></p><p><a href="https://pan.baidu.com/s/1W2oMxHPy97vtjN6hXz5wqg?pwd=6t9b">💾百度网盘 📦下载地址-Win11</a> | 提取码: <code>6t9b</code> | <strong>「软件ID: <code>ID80005</code>」</strong></p><h3 id="简介-7"><a href="#简介-7" class="headerlink" title="简介"></a>简介</h3><p>【ReviOS】是一款类似的优化精简版系统。它主要是面向游戏玩家，以及追求性能、流畅、低延迟的高级“玩机”发烧友。体积小巧，还同时提供 Win11 和 Win10 两个版本下载。在不牺牲稳定性的前提下，ReviOS 性能足够强大的低延迟、高效率的操作系统。不仅能提高游戏的 FPS 帧数性能表现，日常办公也能感受到它的流畅。</p><h3 id="说明-2"><a href="#说明-2" class="headerlink" title="说明"></a>说明</h3><p>默认情况下 ReviOS 只有英文语言，但它是可以自己手工下载安装官方简体&#x2F;繁体中文语言包：</p><ol><li>在安装过程中，推荐选择 China 而非 USA，可以省去后面设置时区、地区等的麻烦。</li><li>安装完成进入系统后，打开系统设置，进入 “Time &amp; Language” → “Language &amp; region”。</li><li>在 Preferred Language 这一项旁边点击 “Add a language” 按钮。</li><li>输入 “chinese” 进行搜索，即可找到简体「中文 (中华人民共和国)」或繁体中文可选，选择好之后，点击 Next 按钮继续。</li><li>注意这里必须勾选上 Set as my Windows display language (设置为系统显示语言) 的选项，如下图：语言包、TTS 发声、语音识别、手写等 4 个选项也最好全勾选上。点击 Install 按钮开始下载与安装。</li><li>重新启动即可！</li></ol><h2 id="微软-Windows-10-x2F-Windows-11-LTSC-企业官方原版镜像-x2F-纯净稳定-长期支持-系统镜像-📅-2024-5-9"><a href="#微软-Windows-10-x2F-Windows-11-LTSC-企业官方原版镜像-x2F-纯净稳定-长期支持-系统镜像-📅-2024-5-9" class="headerlink" title="微软 Windows 10 &#x2F; Windows 11 LTSC 企业官方原版镜像 &#x2F; 纯净稳定 长期支持 [系统镜像] 📅 2024.5.9"></a>微软 Windows 10 &#x2F; Windows 11 LTSC 企业官方原版镜像 &#x2F; 纯净稳定 长期支持 [系统镜像] <font color=#999 size=2>📅 2024.5.9</font></h2><p><a href="https://pan.baidu.com/s/1mOKZ76BPl3s47ZtuZKjTeA?pwd=fzyk">💾百度网盘 📦下载地址-Win10</a> | 提取码: <code>fzyk</code> | <strong>「软件ID: <code>ID80006</code>」</strong></p><p><a href="https://pan.baidu.com/s/13FB0LjhJFN53lFhY4Y24KA?pwd=3ucs">💾百度网盘 📦下载地址-Win11</a> | 提取码: <code>3ucs</code> | <strong>「软件ID: <code>ID80007</code>」</strong></p><h3 id="简介-8"><a href="#简介-8" class="headerlink" title="简介"></a>简介</h3><p>【Windows 10 Enterprise LTSC 2021】 是目前最新的长期支持版，由之前的 LTSB 进化而来，提供了 32 和 64 位版本，支持 10 多种语言，包括简体中文。相比常规的 Windows 10，LTSC 精简了众多胡里花哨的功能，如应用商店、Cortana 等，一切都以「稳定」和流畅为优先。</p><p>【Windows 11 Enterprise LTSC 2024】 也是由微软官方精简优化后的版本，移除了不少 Windows 11 零售版里对于企业或长期运作并不需要的组件。但 Windows 11 LTSC 系统默认只内置有英文语言界面，且目前并不是正式发布的 MSDN 镜像。</p><h3 id="说明-3"><a href="#说明-3" class="headerlink" title="说明"></a>说明</h3><p>Windows 11 Enterprise LTSC 2024 手动下载安装中文语言包：</p><ol><li>按下键盘快捷键 <code>Win</code>+<code>X</code> 进入系统设置。</li><li>“Time &amp; Language → Add a Language” 。</li><li>选择中文，并且将其拖动到最顶上。</li><li>然后在 “Windows Display Language” 选项里选择“中文”，耐心等待语言包下载完毕。</li><li>重启后即可！</li></ol><h2 id="WePE-V2-1-整合-傲梅轻松备份-工具维护-📅-2024-11-18"><a href="#WePE-V2-1-整合-傲梅轻松备份-工具维护-📅-2024-11-18" class="headerlink" title="WePE V2.1 整合 傲梅轻松备份 [工具维护] 📅 2024.11.18"></a>WePE V2.1 整合 傲梅轻松备份 [工具维护] <font color=#999 size=2>📅 2024.11.18</font></h2><p><a href="https://pan.baidu.com/s/1HCkFdGhKENNfwd_uqy6g0w?pwd=p9b6">💾百度网盘 📦下载地址</a> | 提取码: <code>p9b6</code> | <strong>「软件ID: <code>ID80008</code>」</strong></p><h3 id="简介-9"><a href="#简介-9" class="headerlink" title="简介"></a>简介</h3><p>微PE工具箱是一款很适合于网管、装机人员使用的多功能WinPE系统维护工具箱，全面完美地支持各种操作系统，包括新的UEFI启动的系统。同时是一个无任何广告推广，内核完整精简，性价比超高的第三方工具合集。</p><p>此版本虽然不是最新的 <code>V2.3</code> ，然而整合 <code>傲梅轻松备份</code> 使得它如此不同。这是一款用于备份文件、分区、硬盘驱动器或系统的简单工具，支持全自动的为系统进行备份工作，支持多种格式的硬盘分区，支持多种形式的备份工作。支持备份最新的Windows 系统，它除了能一键备份系统分区外，还可以选择性地备份其它数据分区与整个磁盘，同时也支持克隆磁盘与分区。</p><h3 id="说明-4"><a href="#说明-4" class="headerlink" title="说明"></a>说明</h3><p>无需多言，装机必备。换硬盘最需要的工具，没有之一。</p><h2 id="口袋阅-SC801a-V91-带Root-手机系统-📅-2025-01-05"><a href="#口袋阅-SC801a-V91-带Root-手机系统-📅-2025-01-05" class="headerlink" title="口袋阅 SC801a V91 带Root [手机系统] 📅 2025.01.05"></a>口袋阅 SC801a V91 带Root [手机系统] <font color=#999 size=2>📅 2025.01.05</font></h2><p><a href="https://pan.baidu.com/s/1enU49qExf6GwtNJfEGKKzQ?pwd=vyc9">💾百度网盘 📦下载地址</a> | 提取码: <code>vyc9</code> | <strong>「软件ID: <code>ID20001</code>」</strong></p><h3 id="简介-10"><a href="#简介-10" class="headerlink" title="简介"></a>简介</h3><p>参考文章 《<a href="/archive/2021-02-24-sc801a-1-eink-fastboot-flash-v91-root/">口袋阅1代sc801a-1墨水屏手机刷v91带root</a>》，这是原作者 <code>Sillage</code> 的rom。我自己做的rom只剩个zip，解压还显示损坏了……</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;这里整理了一些常用工具软件资源。&lt;/p&gt;
&lt;p&gt;如果文件需要解压密码，请关注公众号并发送压缩包名中的ID，例如 &lt;strong&gt;IDxxxxx&lt;/strong&gt; 或 &lt;strong&gt;xxxxx&lt;/strong&gt;(去掉”ID”这两个英文字母) ，即可获取解压密码。&lt;/p&gt;
&lt;</summary>
      
    
    
    
    <category term="工具软件" scheme="https://www.gsgundam.com/categories/%E5%B7%A5%E5%85%B7%E8%BD%AF%E4%BB%B6/"/>
    
    
    <category term="软件" scheme="https://www.gsgundam.com/tags/%E8%BD%AF%E4%BB%B6/"/>
    
    <category term="工具" scheme="https://www.gsgundam.com/tags/%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
  <entry>
    <title>第五人格助力软件-自用引流小工具</title>
    <link href="https://www.gsgundam.com/2024/2024-04-11-z11-earn-identity-v-help-tool/"/>
    <id>https://www.gsgundam.com/2024/2024-04-11-z11-earn-identity-v-help-tool/</id>
    <published>2024-04-11T03:30:00.000Z</published>
    <updated>2024-04-11T03:00:31.618Z</updated>
    
    <content type="html"><![CDATA[<h1 id="简单介绍"><a href="#简单介绍" class="headerlink" title="简单介绍"></a>简单介绍</h1><p>社恐人必备，一键完成第五人格小丑助力活动。</p><p>可无限助力，输入助力链接自动提取邀请码自动助力。</p><p>不管是自用还是用来引流，都是很好的小工具。</p><h1 id="教程下载地址"><a href="#教程下载地址" class="headerlink" title="教程下载地址"></a>教程下载地址</h1><p>🔗 <a href="https://gsgundam.lanzouo.com/iNQcc1uncbqj">点击下载</a></p><h1 id="截图预览"><a href="#截图预览" class="headerlink" title="截图预览"></a>截图预览</h1><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/5tool.png"></p><h1 id="网赚目录"><a href="#网赚目录" class="headerlink" title="网赚目录"></a>网赚目录</h1><p><a href="/earn/earn-guide/">🔙 返回查看网赚目录</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;简单介绍&quot;&gt;&lt;a href=&quot;#简单介绍&quot; class=&quot;headerlink&quot; title=&quot;简单介绍&quot;&gt;&lt;/a&gt;简单介绍&lt;/h1&gt;&lt;p&gt;社恐人必备，一键完成第五人格小丑助力活动。&lt;/p&gt;
&lt;p&gt;可无限助力，输入助力链接自动提取邀请码自动助力。&lt;/p&gt;
&lt;p&gt;不</summary>
      
    
    
    
    <category term="网赚" scheme="https://www.gsgundam.com/categories/%E7%BD%91%E8%B5%9A/"/>
    
    
    <category term="引流" scheme="https://www.gsgundam.com/tags/%E5%BC%95%E6%B5%81/"/>
    
    <category term="网赚" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E8%B5%9A/"/>
    
    <category term="第五人格" scheme="https://www.gsgundam.com/tags/%E7%AC%AC%E4%BA%94%E4%BA%BA%E6%A0%BC/"/>
    
    <category term="助力" scheme="https://www.gsgundam.com/tags/%E5%8A%A9%E5%8A%9B/"/>
    
  </entry>
  
  <entry>
    <title>短剧搜索开源代码-引流利器小工具</title>
    <link href="https://www.gsgundam.com/2024/2024-04-07-z02-earn-short-drama-search-engine/"/>
    <id>https://www.gsgundam.com/2024/2024-04-07-z02-earn-short-drama-search-engine/</id>
    <published>2024-04-06T18:30:00.000Z</published>
    <updated>2024-04-06T18:28:07.707Z</updated>
    
    <content type="html"><![CDATA[<h1 id="简单介绍"><a href="#简单介绍" class="headerlink" title="简单介绍"></a>简单介绍</h1><p>别看现在看好短剧的人多，但是其实短剧热度不如之前了。</p><p>但是作为一个引流工具也是有好过没有。</p><p>而且这套资源特别简单，小白也能很快上手。</p><p>如果有渠道的话，可以快速搞一波。</p><h1 id="教程下载地址"><a href="#教程下载地址" class="headerlink" title="教程下载地址"></a>教程下载地址</h1><p>🔗 <a href="https://gsgundam.lanzouo.com/iUSUA1u5zdfa">点击下载-资源1</a></p><p>🔗 <a href="https://gsgundam.lanzouo.com/iJWk21u5zddi">点击下载-资源2</a></p><h1 id="截图预览"><a href="#截图预览" class="headerlink" title="截图预览"></a>截图预览</h1><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/duanjusousuo.jpg"></p><h1 id="网赚目录"><a href="#网赚目录" class="headerlink" title="网赚目录"></a>网赚目录</h1><p><a href="/earn/earn-guide/">🔙 返回查看网赚目录</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;简单介绍&quot;&gt;&lt;a href=&quot;#简单介绍&quot; class=&quot;headerlink&quot; title=&quot;简单介绍&quot;&gt;&lt;/a&gt;简单介绍&lt;/h1&gt;&lt;p&gt;别看现在看好短剧的人多，但是其实短剧热度不如之前了。&lt;/p&gt;
&lt;p&gt;但是作为一个引流工具也是有好过没有。&lt;/p&gt;
&lt;p&gt;而且</summary>
      
    
    
    
    <category term="网赚" scheme="https://www.gsgundam.com/categories/%E7%BD%91%E8%B5%9A/"/>
    
    
    <category term="引流" scheme="https://www.gsgundam.com/tags/%E5%BC%95%E6%B5%81/"/>
    
    <category term="网赚" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E8%B5%9A/"/>
    
    <category term="加热" scheme="https://www.gsgundam.com/tags/%E5%8A%A0%E7%83%AD/"/>
    
    <category term="b站" scheme="https://www.gsgundam.com/tags/b%E7%AB%99/"/>
    
    <category term="哔哩" scheme="https://www.gsgundam.com/tags/%E5%93%94%E5%93%A9/"/>
    
    <category term="微博" scheme="https://www.gsgundam.com/tags/%E5%BE%AE%E5%8D%9A/"/>
    
  </entry>
  
  <entry>
    <title>安卓手机使用小黄鸟HttpCanary抓取HTTPS</title>
    <link href="https://www.gsgundam.com/2024/2024-04-01-z19-android-httpcanary-https/"/>
    <id>https://www.gsgundam.com/2024/2024-04-01-z19-android-httpcanary-https/</id>
    <published>2024-04-01T11:30:00.000Z</published>
    <updated>2024-04-01T16:18:23.965Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/gura_cat.jpg"></p><p>因为最近又忙了起来，好多事情要做，经常忘记签到。就想起来以前听说过的青龙面板了，确实有很多现成的脚本可以很方便的实现自动签到。</p><p>但是也出现了一些问题，例如一些app的安全等级比较高，则需要用到抓包工具来获取cookie一类的数据了。</p><p>由于安卓7引入了 <code>SSL pinning</code>，用户所安装的证书不再被系统信任，导致不能抓取 HTTPS 流量。想要在 Android 7~12 中抓取HTTPS，需要手机解锁并ROOT权限。 这个操作无需电脑，仅需要手机即可实现抓包。我的操作环境是 <code>红米 K60</code> + <code>MIUI 14</code> + <code>KernelSU 11326</code> + <code>LSPosed 1.9.2</code> 。</p><h1 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a>环境搭建</h1><ul><li>解锁手机（可以通过改手机和电脑的时间来跳过3天等待）[必需]</li><li>KernelSU：<a href="https://kernelsu.org/zh_CN">https://kernelsu.org/zh_CN</a>（或者Magisk：<a href="https://github.com/topjohnwu/Magisk/">https://github.com/topjohnwu/Magisk/</a>）[必需]</li><li>Magisk模块 HttpCanary：<a href="https://github.com/victor141516/httpcanary-magisk">https://github.com/victor141516/httpcanary-magisk</a></li><li>Magisk模块 HttpCanary System CA Mounter：<a href="https://github.com/mingww64/HttpCanary-SSL-Magisk">https://github.com/mingww64/HttpCanary-SSL-Magisk</a></li><li>LSPosed：<a href="https://github.com/LSPosed/LSPosed">https://github.com/LSPosed/LSPosed</a>（或者Xposed：<a href="https://github.com/rovo89/Xposed">https://github.com/rovo89/Xposed</a>）</li><li>Xposed模块 JustTrustME：<a href="https://github.com/Fuzion24/JustTrustMe">https://github.com/Fuzion24/JustTrustMe</a></li><li>Xposed模块 TrustMeAlready：<a href="https://github.com/ViRb3/TrustMeAlready">https://github.com/ViRb3/TrustMeAlready</a></li></ul><h1 id="刷入Magisk模块和Xposed模块"><a href="#刷入Magisk模块和Xposed模块" class="headerlink" title="刷入Magisk模块和Xposed模块"></a>刷入Magisk模块和Xposed模块</h1><p>先确保 <code>KernelSU</code>(or Magisk) 和 <code>LSPosed</code>(or Xposed) 已经安装完毕。网上教程很齐全，就不赘述了。</p><p>主要是按顺序刷入各个模块：<code>HttpCanary</code>、<code>HttpCanary System CA Mounter</code>、<code>JustTrustME</code>、<code>TrustMeAlready</code>。刷入完成以后重启即可，HttpCanary就会出现并可以使用了。</p><p>这种情况下，证书会自动处理好，直接抓包即可。</p><p><img src="https://s2.loli.net/2022/03/18/ZQMV9wkmu5FvTLO.png" alt="效果图"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/gura_cat.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;因为最近又忙了起来，好多事情要做，经常忘记签到。就想起来以前听说过的青龙面板了，</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="https" scheme="https://www.gsgundam.com/tags/https/"/>
    
    <category term="安卓" scheme="https://www.gsgundam.com/tags/%E5%AE%89%E5%8D%93/"/>
    
    <category term="手机" scheme="https://www.gsgundam.com/tags/%E6%89%8B%E6%9C%BA/"/>
    
    <category term="httpcanary" scheme="https://www.gsgundam.com/tags/httpcanary/"/>
    
    <category term="小黄鸟" scheme="https://www.gsgundam.com/tags/%E5%B0%8F%E9%BB%84%E9%B8%9F/"/>
    
    <category term="数据抓包" scheme="https://www.gsgundam.com/tags/%E6%95%B0%E6%8D%AE%E6%8A%93%E5%8C%85/"/>
    
  </entry>
  
  <entry>
    <title>短剧网剧汇总-超火引流资源素材</title>
    <link href="https://www.gsgundam.com/2024/2024-03-31-z05-earn-net-movie-list/"/>
    <id>https://www.gsgundam.com/2024/2024-03-31-z05-earn-net-movie-list/</id>
    <published>2024-03-30T21:30:00.000Z</published>
    <updated>2024-03-30T21:20:29.705Z</updated>
    
    <content type="html"><![CDATA[<h1 id="简单介绍"><a href="#简单介绍" class="headerlink" title="简单介绍"></a>简单介绍</h1><p>你肯定见过闲鱼上1元钱卖短剧、小说、教程，</p><p>可能也想到了可以通过这类资源引流广告。</p><p>在这个文章里我将陆续收录这些资源，</p><p>你可以自己大饱眼福，也可以拿去引流，</p><p>这些资源对我来说很好找，只是花点时间整理一下。</p><p>对需要它们的你来说，怎么使用才是考验，加油！</p><h1 id="资源列表"><a href="#资源列表" class="headerlink" title="资源列表"></a>资源列表</h1><p>🔗 <a href="https://kdocs.cn/l/ccWh8iN5WmOZ">点击访问</a></p><h1 id="截图预览"><a href="#截图预览" class="headerlink" title="截图预览"></a>截图预览</h1><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/duanjulist.png"></p><h1 id="网赚目录"><a href="#网赚目录" class="headerlink" title="网赚目录"></a>网赚目录</h1><p><a href="/earn/earn-guide/">🔙 返回查看网赚目录</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;简单介绍&quot;&gt;&lt;a href=&quot;#简单介绍&quot; class=&quot;headerlink&quot; title=&quot;简单介绍&quot;&gt;&lt;/a&gt;简单介绍&lt;/h1&gt;&lt;p&gt;你肯定见过闲鱼上1元钱卖短剧、小说、教程，&lt;/p&gt;
&lt;p&gt;可能也想到了可以通过这类资源引流广告。&lt;/p&gt;
&lt;p&gt;在这个文章里</summary>
      
    
    
    
    <category term="网赚" scheme="https://www.gsgundam.com/categories/%E7%BD%91%E8%B5%9A/"/>
    
    
    <category term="引流" scheme="https://www.gsgundam.com/tags/%E5%BC%95%E6%B5%81/"/>
    
    <category term="网赚" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E8%B5%9A/"/>
    
    <category term="推广" scheme="https://www.gsgundam.com/tags/%E6%8E%A8%E5%B9%BF/"/>
    
    <category term="短剧" scheme="https://www.gsgundam.com/tags/%E7%9F%AD%E5%89%A7/"/>
    
    <category term="网剧" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E5%89%A7/"/>
    
    <category term="素材" scheme="https://www.gsgundam.com/tags/%E7%B4%A0%E6%9D%90/"/>
    
  </entry>
  
  <entry>
    <title>炫卡扫号引流-想办理手机流量卡选个靓号</title>
    <link href="https://www.gsgundam.com/2024/2024-03-31-z02-earn-nice-phone-number/"/>
    <id>https://www.gsgundam.com/2024/2024-03-31-z02-earn-nice-phone-number/</id>
    <published>2024-03-30T18:30:00.000Z</published>
    <updated>2024-03-30T18:56:34.217Z</updated>
    
    <content type="html"><![CDATA[<h1 id="简单介绍"><a href="#简单介绍" class="headerlink" title="简单介绍"></a>简单介绍</h1><p>手机卡靓号扫号器，安卓手机App。</p><p>软件一直在做维护更新，功能比较完善，</p><p>经过测试是可以使用的，确实能跑出来一些靓号，</p><p>而且每天靓号都是更新的，今天不满意，次日再扫就可以。</p><p>放在闲鱼、小红书一类的引流很不错。</p><p>另外，可以看到我也挂了流量卡入口的，</p><p>所以，也可以试试在选择喜欢的号段之后，去看看能不能走佣金渠道。</p><h1 id="软件-x2F-工具下载地址"><a href="#软件-x2F-工具下载地址" class="headerlink" title="软件&#x2F;工具下载地址"></a>软件&#x2F;工具下载地址</h1><p>🔗 <a href="https://gsgundam.lanzouo.com/ip2Aw1t90uni">点击下载（VIP）</a></p><h1 id="截图预览"><a href="#截图预览" class="headerlink" title="截图预览"></a>截图预览</h1><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/xuankasaohao.jpg"></p><h1 id="网赚目录"><a href="#网赚目录" class="headerlink" title="网赚目录"></a>网赚目录</h1><p><a href="/earn/earn-guide/">🔙 返回查看网赚目录</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;简单介绍&quot;&gt;&lt;a href=&quot;#简单介绍&quot; class=&quot;headerlink&quot; title=&quot;简单介绍&quot;&gt;&lt;/a&gt;简单介绍&lt;/h1&gt;&lt;p&gt;手机卡靓号扫号器，安卓手机App。&lt;/p&gt;
&lt;p&gt;软件一直在做维护更新，功能比较完善，&lt;/p&gt;
&lt;p&gt;经过测试是可以使用的，</summary>
      
    
    
    
    <category term="网赚" scheme="https://www.gsgundam.com/categories/%E7%BD%91%E8%B5%9A/"/>
    
    
    <category term="引流" scheme="https://www.gsgundam.com/tags/%E5%BC%95%E6%B5%81/"/>
    
    <category term="网赚" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E8%B5%9A/"/>
    
    <category term="扫号" scheme="https://www.gsgundam.com/tags/%E6%89%AB%E5%8F%B7/"/>
    
    <category term="流量卡" scheme="https://www.gsgundam.com/tags/%E6%B5%81%E9%87%8F%E5%8D%A1/"/>
    
    <category term="靓号" scheme="https://www.gsgundam.com/tags/%E9%9D%93%E5%8F%B7/"/>
    
    <category term="推广" scheme="https://www.gsgundam.com/tags/%E6%8E%A8%E5%B9%BF/"/>
    
  </entry>
  
  <entry>
    <title>闲鱼拉新引流-流量初起与项目推广</title>
    <link href="https://www.gsgundam.com/2024/2024-03-28-z01-earn-yellow-fish-traffic/"/>
    <id>https://www.gsgundam.com/2024/2024-03-28-z01-earn-yellow-fish-traffic/</id>
    <published>2024-03-27T17:30:00.000Z</published>
    <updated>2024-03-27T17:06:21.785Z</updated>
    
    <content type="html"><![CDATA[<h1 id="简单介绍"><a href="#简单介绍" class="headerlink" title="简单介绍"></a>简单介绍</h1><p>有时候机会就是一个闪现的思路。</p><p>对于没有流量需要做推广的朋友，这个方法不只是省钱的问题，</p><p>关键是省时省力效果还好。</p><p>虽然有时候弯路必须要走，但是能少走点就少走点。</p><h1 id="教程下载地址"><a href="#教程下载地址" class="headerlink" title="教程下载地址"></a>教程下载地址</h1><p>🔗 <a href="https://pan.baidu.com/s/1wyQmImXMQJoA7dOWeTWZww?pwd=ikds">点击下载-线路1</a></p><p>🔗 <a href="https://pan.xunlei.com/s/VNu-qLdxjCWVZSyVO1Dnu96TA1?pwd=b469#">点击下载-线路2</a></p><h1 id="截图预览"><a href="#截图预览" class="headerlink" title="截图预览"></a>截图预览</h1><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/yellowfishtraffic.jpg"></p><h1 id="网赚目录"><a href="#网赚目录" class="headerlink" title="网赚目录"></a>网赚目录</h1><p><a href="/earn/earn-guide/">🔙 返回查看网赚目录</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;简单介绍&quot;&gt;&lt;a href=&quot;#简单介绍&quot; class=&quot;headerlink&quot; title=&quot;简单介绍&quot;&gt;&lt;/a&gt;简单介绍&lt;/h1&gt;&lt;p&gt;有时候机会就是一个闪现的思路。&lt;/p&gt;
&lt;p&gt;对于没有流量需要做推广的朋友，这个方法不只是省钱的问题，&lt;/p&gt;
&lt;p&gt;关键是</summary>
      
    
    
    
    <category term="网赚" scheme="https://www.gsgundam.com/categories/%E7%BD%91%E8%B5%9A/"/>
    
    
    <category term="引流" scheme="https://www.gsgundam.com/tags/%E5%BC%95%E6%B5%81/"/>
    
    <category term="网赚" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E8%B5%9A/"/>
    
    <category term="推广" scheme="https://www.gsgundam.com/tags/%E6%8E%A8%E5%B9%BF/"/>
    
    <category term="闲鱼" scheme="https://www.gsgundam.com/tags/%E9%97%B2%E9%B1%BC/"/>
    
    <category term="拉新" scheme="https://www.gsgundam.com/tags/%E6%8B%89%E6%96%B0/"/>
    
  </entry>
  
  <entry>
    <title>王者隐藏战绩/角色查询教程</title>
    <link href="https://www.gsgundam.com/2024/2024-03-26-z21-earn-honor-of-kings-query/"/>
    <id>https://www.gsgundam.com/2024/2024-03-26-z21-earn-honor-of-kings-query/</id>
    <published>2024-03-26T13:30:00.000Z</published>
    <updated>2024-03-26T13:32:59.966Z</updated>
    
    <content type="html"><![CDATA[<h1 id="简单介绍"><a href="#简单介绍" class="headerlink" title="简单介绍"></a>简单介绍</h1><p>一个网赚大咖分享的，据说这个市场还挺大，并且涉足的人不多。</p><p>又是一个信息差挣钱的项目，外面代查一次可是要10-20块钱。</p><p>虽然是懂原理了直接秒查的玩意，但是咱可不管那些。</p><p>能迅速挣块钱的，直接开干就完了。</p><h1 id="教程下载地址"><a href="#教程下载地址" class="headerlink" title="教程下载地址"></a>教程下载地址</h1><p>🔗 <a href="https://pan.baidu.com/s/1cB_AeS3b65gmuBCjlnuZ9Q?pwd=x6t6">点击下载-线路1</a></p><p>🔗 <a href="https://pan.xunlei.com/s/VNtuvPmaQog_uHFtuH1HsSRRA1?pwd=qpw7#">点击下载-线路2</a></p><h1 id="截图预览"><a href="#截图预览" class="headerlink" title="截图预览"></a>截图预览</h1><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/wangzhechaxun.jpg"></p><h1 id="网赚目录"><a href="#网赚目录" class="headerlink" title="网赚目录"></a>网赚目录</h1><p><a href="/earn/earn-guide/">🔙 返回查看网赚目录</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;简单介绍&quot;&gt;&lt;a href=&quot;#简单介绍&quot; class=&quot;headerlink&quot; title=&quot;简单介绍&quot;&gt;&lt;/a&gt;简单介绍&lt;/h1&gt;&lt;p&gt;一个网赚大咖分享的，据说这个市场还挺大，并且涉足的人不多。&lt;/p&gt;
&lt;p&gt;又是一个信息差挣钱的项目，外面代查一次可是要10-</summary>
      
    
    
    
    <category term="网赚" scheme="https://www.gsgundam.com/categories/%E7%BD%91%E8%B5%9A/"/>
    
    
    <category term="网赚" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E8%B5%9A/"/>
    
    <category term="王者荣耀" scheme="https://www.gsgundam.com/tags/%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80/"/>
    
    <category term="查询" scheme="https://www.gsgundam.com/tags/%E6%9F%A5%E8%AF%A2/"/>
    
    <category term="角色" scheme="https://www.gsgundam.com/tags/%E8%A7%92%E8%89%B2/"/>
    
    <category term="战绩" scheme="https://www.gsgundam.com/tags/%E6%88%98%E7%BB%A9/"/>
    
  </entry>
  
  <entry>
    <title>不蒜子适配Pjax</title>
    <link href="https://www.gsgundam.com/2024/2024-03-26-z18-busuanzi-pjax/"/>
    <id>https://www.gsgundam.com/2024/2024-03-26-z18-busuanzi-pjax/</id>
    <published>2024-03-26T10:30:00.000Z</published>
    <updated>2024-03-26T11:33:49.490Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/fate20240326.jpg"></p><p>不蒜子绝对是静态博客的福音，速度快，功能强，接入极为简单。</p><h1 id="常规配置"><a href="#常规配置" class="headerlink" title="常规配置"></a>常规配置</h1><h2 id="引入脚本"><a href="#引入脚本" class="headerlink" title="引入脚本"></a>引入脚本</h2><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">async</span> <span class="attr">src</span>=<span class="string">&quot;//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="使用标签"><a href="#使用标签" class="headerlink" title="使用标签"></a>使用标签</h2><h3 id="全站访问量"><a href="#全站访问量" class="headerlink" title="全站访问量"></a>全站访问量</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--pv方式 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">span</span> <span class="attr">id</span>=<span class="string">&quot;busuanzi_container_site_pv&quot;</span>&gt;</span></span><br><span class="line">    本站总访问量<span class="tag">&lt;<span class="name">span</span> <span class="attr">id</span>=<span class="string">&quot;busuanzi_value_site_pv&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">span</span>&gt;</span>次</span><br><span class="line"><span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!--uv方式 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">span</span> <span class="attr">id</span>=<span class="string">&quot;busuanzi_container_site_uv&quot;</span>&gt;</span></span><br><span class="line">  本站访客数<span class="tag">&lt;<span class="name">span</span> <span class="attr">id</span>=<span class="string">&quot;busuanzi_value_site_uv&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">span</span>&gt;</span>人次</span><br><span class="line"><span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="单页访问量"><a href="#单页访问量" class="headerlink" title="单页访问量"></a>单页访问量</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">span</span> <span class="attr">id</span>=<span class="string">&quot;busuanzi_container_page_pv&quot;</span>&gt;</span></span><br><span class="line">  本文总阅读量<span class="tag">&lt;<span class="name">span</span> <span class="attr">id</span>=<span class="string">&quot;busuanzi_value_page_pv&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">span</span>&gt;</span>次</span><br><span class="line"><span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br></pre></td></tr></table></figure><h1 id="适配Pjax"><a href="#适配Pjax" class="headerlink" title="适配Pjax"></a>适配Pjax</h1><p>删除原本引入语句：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- &lt;script async src=&quot;//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js&quot;&gt;&lt;/script&gt; --&gt;</span></span><br></pre></td></tr></table></figure><p>在 <code>pjax:end</code> 部分动态引入脚本：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$(<span class="variable language_">document</span>).<span class="title function_">on</span>(<span class="string">&#x27;pjax:end&#x27;</span>, <span class="keyword">function</span>(<span class="params"></span>)&#123;</span><br><span class="line">  $.<span class="title function_">getScript</span>(<span class="string">&quot;//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js&quot;</span>);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/fate20240326.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;不蒜子绝对是静态博客的福音，速度快，功能强，接入极为简单。&lt;/p&gt;
&lt;h</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="js" scheme="https://www.gsgundam.com/tags/js/"/>
    
    <category term="jquery" scheme="https://www.gsgundam.com/tags/jquery/"/>
    
    <category term="网页统计" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E9%A1%B5%E7%BB%9F%E8%AE%A1/"/>
    
    <category term="不蒜子" scheme="https://www.gsgundam.com/tags/%E4%B8%8D%E8%92%9C%E5%AD%90/"/>
    
    <category term="pjax" scheme="https://www.gsgundam.com/tags/pjax/"/>
    
  </entry>
  
  <entry>
    <title>加热引流神器-B站微博爆视频文章专题</title>
    <link href="https://www.gsgundam.com/2024/2024-03-26-z16-earn-bilibili-increase-traffic/"/>
    <id>https://www.gsgundam.com/2024/2024-03-26-z16-earn-bilibili-increase-traffic/</id>
    <published>2024-03-26T08:30:00.000Z</published>
    <updated>2024-03-26T07:39:29.644Z</updated>
    
    <content type="html"><![CDATA[<h1 id="简单介绍"><a href="#简单介绍" class="headerlink" title="简单介绍"></a>简单介绍</h1><p>自己深度测试过，对于B站和微博都非常好用。</p><p>尤其是对于B站而言，要是推的视频爆了，是可以直接变现的。</p><p>提个几十块非常容易！</p><p>站长的管理非常人性化，每周还有抽奖。</p><p>奖品的<code>特权一</code>可以搂到不少流量，<code>幸运星</code>在B站基本上就可以爆视频了。</p><p>同时网站群里面的朋友也会分享一些心得，可以学习。</p><h1 id="平台入口"><a href="#平台入口" class="headerlink" title="平台入口"></a>平台入口</h1><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/liuliangtuiguang.png"></p><h1 id="效果预览"><a href="#效果预览" class="headerlink" title="效果预览"></a>效果预览</h1><p>这是用最低积出价分引流的效果，如果高分出价效果拔群。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/liuliangxiaoguo.png"></p><h1 id="🔒-VIP工具"><a href="#🔒-VIP工具" class="headerlink" title="🔒 VIP工具"></a>🔒 VIP工具</h1><p>网站是好网站，但是手动操作还是费时费力。所以我自己做了工具软件，在不违反网站规则的前提下，自动完成浏览、点赞等操作。</p><p><a href="/earn/earn-guide/">🔗 成为VIP即可获得工具</a>。</p><h1 id="网赚目录"><a href="#网赚目录" class="headerlink" title="网赚目录"></a>网赚目录</h1><p><a href="/earn/earn-guide/">🔙 返回查看网赚目录</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;简单介绍&quot;&gt;&lt;a href=&quot;#简单介绍&quot; class=&quot;headerlink&quot; title=&quot;简单介绍&quot;&gt;&lt;/a&gt;简单介绍&lt;/h1&gt;&lt;p&gt;自己深度测试过，对于B站和微博都非常好用。&lt;/p&gt;
&lt;p&gt;尤其是对于B站而言，要是推的视频爆了，是可以直接变现的。&lt;/p&gt;
</summary>
      
    
    
    
    <category term="网赚" scheme="https://www.gsgundam.com/categories/%E7%BD%91%E8%B5%9A/"/>
    
    
    <category term="引流" scheme="https://www.gsgundam.com/tags/%E5%BC%95%E6%B5%81/"/>
    
    <category term="网赚" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E8%B5%9A/"/>
    
    <category term="加热" scheme="https://www.gsgundam.com/tags/%E5%8A%A0%E7%83%AD/"/>
    
    <category term="b站" scheme="https://www.gsgundam.com/tags/b%E7%AB%99/"/>
    
    <category term="哔哩" scheme="https://www.gsgundam.com/tags/%E5%93%94%E5%93%A9/"/>
    
    <category term="微博" scheme="https://www.gsgundam.com/tags/%E5%BE%AE%E5%8D%9A/"/>
    
  </entry>
  
  <entry>
    <title>网赚资源导航</title>
    <link href="https://www.gsgundam.com/earn/earn-guide/"/>
    <id>https://www.gsgundam.com/earn/earn-guide/</id>
    <published>2024-03-25T04:30:00.000Z</published>
    <updated>2024-05-07T02:56:29.664Z</updated>
    
    <content type="html"><![CDATA[<p>本篇后面会作为汇总，整合尽可能多的内容，也方便大家搜索。</p><p>其实网赚项目相当多，每天都会出很多玩法，但是hui色、坑人的不少，个人会筛选并只推荐安全的项目。</p><p>另外有一些项目我不会直接分享出来，因为知道的人越多，大家能分到的越少。</p><p><strong>所以这里设置一个VIP门槛，<code>88</code>一年，<code>198</code>永久。通过页面底部的 <a href="#donate_guide"><code>🔗 二维码付款</code></a> 后，添加QQ：3765242328，我拉你进群。</strong></p><p>说明：<code>🔗</code> 可点击链接；<code>🔒</code> VIP项目。 </p><h2 id="长期置顶项目"><a href="#长期置顶项目" class="headerlink" title="长期置顶项目"></a>长期置顶项目</h2><h3 id="🔗-短剧网剧汇总-超火引流资源素材"><a href="#🔗-短剧网剧汇总-超火引流资源素材" class="headerlink" title="🔗 短剧网剧汇总-超火引流资源素材"></a>🔗 <a href="/2024/2024-03-31-z05-earn-net-movie-list/">短剧网剧汇总-超火引流资源素材</a></h3><p>一句话总结：资源随时更新，引流or走量or自用？关键看你自己。</p><p>推荐度：⭐⭐⭐⭐⭐</p><p><font color=#999 size=2>📅 2024.3.31</font></p><h3 id="🔗-省钱霸王餐-饿了么美团外卖低价无限吃"><a href="#🔗-省钱霸王餐-饿了么美团外卖低价无限吃" class="headerlink" title="🔗 省钱霸王餐-饿了么美团外卖低价无限吃"></a>🔗 <a href="/2024/2024-03-25-z23-earn-dine-and-dash/">省钱霸王餐-饿了么美团外卖低价无限吃</a></h3><p>一句话总结：亲测好用，省到就是赚到。</p><p>推荐度：⭐⭐⭐⭐⭐</p><p><font color=#999 size=2>📅 2024.3.25</font></p><h2 id="热门项目"><a href="#热门项目" class="headerlink" title="热门项目"></a>热门项目</h2><h3 id="🔗-第五人格助力软件-自用引流小工具"><a href="#🔗-第五人格助力软件-自用引流小工具" class="headerlink" title="🔗 第五人格助力软件-自用引流小工具"></a>🔗 <a href="/2024/2024-04-11-z11-earn-identity-v-help-tool/">第五人格助力软件-自用引流小工具</a></h3><p>一句话总结：社恐玩家必备，可自用可引流。</p><p>推荐度：⭐⭐⭐⭐⭐</p><p><font color=#999 size=2>📅 2024.4.11</font></p><h3 id="🔗-短剧搜索开源代码-引流利器小工具"><a href="#🔗-短剧搜索开源代码-引流利器小工具" class="headerlink" title="🔗 短剧搜索开源代码-引流利器小工具"></a>🔗 <a href="/2024/2024-04-07-z02-earn-short-drama-search-engine/">短剧搜索开源代码-引流利器小工具</a></h3><p>一句话总结：趁着短剧还有些许热度，搭建个自己的平台赶个尾巴。</p><p>推荐度：⭐⭐⭐⭐⭐</p><p><font color=#999 size=2>📅 2024.4.7</font></p><h3 id="🔗-炫卡扫号引流-想办理手机流量卡选个靓号"><a href="#🔗-炫卡扫号引流-想办理手机流量卡选个靓号" class="headerlink" title="🔗 炫卡扫号引流-想办理手机流量卡选个靓号"></a>🔗 <a href="/2024/2024-03-31-z02-earn-nice-phone-number/">炫卡扫号引流-想办理手机流量卡选个靓号</a></h3><p>一句话总结：靓号扫描工具，无论自用还是引流都非常合适。</p><p>推荐度：⭐⭐⭐⭐</p><p><font color=#999 size=2>📅 2024.3.31</font></p><h3 id="🔗-闲鱼拉新引流-流量初起与项目推广"><a href="#🔗-闲鱼拉新引流-流量初起与项目推广" class="headerlink" title="🔗 闲鱼拉新引流-流量初起与项目推广"></a>🔗 <a href="/2024/2024-03-28-z01-earn-yellow-fish-traffic/">闲鱼拉新引流-流量初起与项目推广</a></h3><p>一句话总结：引流从来都是思路，方法可以千变万化。</p><p>推荐度：⭐⭐⭐⭐</p><p><font color=#999 size=2>📅 2024.3.28</font></p><h3 id="🔗-王者隐藏战绩-x2F-角色查询教程，信息差挣钱"><a href="#🔗-王者隐藏战绩-x2F-角色查询教程，信息差挣钱" class="headerlink" title="🔗 王者隐藏战绩&#x2F;角色查询教程，信息差挣钱"></a>🔗 <a href="/2024/2024-03-26-z21-earn-honor-of-kings-query/">王者隐藏战绩&#x2F;角色查询教程，信息差挣钱</a></h3><p>一句话总结：又是信息差项目，王者荣耀热度一直都有。</p><p>推荐度：⭐⭐⭐⭐⭐</p><p><font color=#999 size=2>📅 2024.3.26</font></p><h3 id="🔗-象棋残局挑战直播，内含软件，日入2K，-象棋小白也能做的副业！"><a href="#🔗-象棋残局挑战直播，内含软件，日入2K，-象棋小白也能做的副业！" class="headerlink" title="🔗 象棋残局挑战直播，内含软件，日入2K， 象棋小白也能做的副业！"></a>🔗 <a href="https://pan.baidu.com/s/1fh8E67DplV-IMFIDV_XvdQ?pwd=pygh">象棋残局挑战直播，内含软件，日入2K， 象棋小白也能做的副业！</a></h3><p>一句话总结：象棋直播本身是有流量的，这个资源也很全，但是直播需要自己迈出第一步。</p><p>推荐度：⭐⭐⭐⭐</p><p><font color=#999 size=2>📅 2024.3.25</font></p><h3 id="🔒-手机号码营销标记清除，淘宝售卖的永久清除工具-（VIP）"><a href="#🔒-手机号码营销标记清除，淘宝售卖的永久清除工具-（VIP）" class="headerlink" title="🔒 [手机号码营销标记清除，淘宝售卖的永久清除工具]（VIP）"></a>🔒 [手机号码营销标记清除，淘宝售卖的永久清除工具]（VIP）</h3><p>一句话总结：信息差项目，赚钱引流都是相当棒的工具。</p><p>推荐度：⭐⭐⭐⭐⭐</p><p><font color=#999 size=2>📅 2024.3.25</font></p><h3 id="🔒-短视频出海赚美金，批量操作，小白轻松掌握，月入4500刀（VIP）"><a href="#🔒-短视频出海赚美金，批量操作，小白轻松掌握，月入4500刀（VIP）" class="headerlink" title="🔒 短视频出海赚美金，批量操作，小白轻松掌握，月入4500刀（VIP）"></a>🔒 短视频出海赚美金，批量操作，小白轻松掌握，月入4500刀（VIP）</h3><p>一句话总结：需要一些时间，学习成本不高。</p><p>推荐度：⭐⭐⭐⭐</p><p><font color=#999 size=2>📅 2024.3.25</font></p><h2 id="小钱or简单引流"><a href="#小钱or简单引流" class="headerlink" title="小钱or简单引流"></a>小钱or简单引流</h2><h3 id="🔗-邮箱问卷掘金，单号调查可得20元，批量矩阵无限放大"><a href="#🔗-邮箱问卷掘金，单号调查可得20元，批量矩阵无限放大" class="headerlink" title="🔗 邮箱问卷掘金，单号调查可得20元，批量矩阵无限放大"></a>🔗 <a href="https://pan.baidu.com/s/1wyr1S_lsSuhLM9O1cH7u6Q?pwd=kwvy">邮箱问卷掘金，单号调查可得20元，批量矩阵无限放大</a></h3><p>一句话总结：小羊毛，很好完成，适合挣点小零花钱。</p><p>推荐度：⭐⭐⭐⭐</p><p><font color=#999 size=2>📅 2024.4.3</font></p><h3 id="🔗-日本综艺解说不封号，轻松日入3000-，新手容易上手"><a href="#🔗-日本综艺解说不封号，轻松日入3000-，新手容易上手" class="headerlink" title="🔗 日本综艺解说不封号，轻松日入3000+，新手容易上手"></a>🔗 <a href="https://pan.baidu.com/s/1BXhhGsW7pZdlvcf-UjC-sQ?pwd=nme3">日本综艺解说不封号，轻松日入3000+，新手容易上手</a></h3><p>一句话总结：最近比较火，日本综艺确实很好看，做搬运引流不错。</p><p>推荐度：⭐⭐⭐⭐⭐</p><p><font color=#999 size=2>📅 2024.4.1</font></p><h3 id="🔗-加热引流神器-B站微博爆视频文章专题"><a href="#🔗-加热引流神器-B站微博爆视频文章专题" class="headerlink" title="🔗 加热引流神器-B站微博爆视频文章专题"></a>🔗 <a href="/2024/2024-03-26-z16-earn-bilibili-increase-traffic/">加热引流神器-B站微博爆视频文章专题</a></h3><p>一句话总结：B站微博推广神器，也能直接挣钱。</p><p>推荐度：⭐⭐⭐⭐⭐</p><p><font color=#999 size=2>📅 2024.3.26</font></p><h2 id="过气项目"><a href="#过气项目" class="headerlink" title="过气项目"></a>过气项目</h2><h3 id="🍂-网飞《三体》资源引流"><a href="#🍂-网飞《三体》资源引流" class="headerlink" title="🍂 网飞《三体》资源引流"></a>🍂 网飞《三体》资源引流</h3><p>一句话总结：刚出来的时候很火爆，现在连资源都被封了很多。</p><blockquote><p>更多项目整理中…</p></blockquote>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;本篇后面会作为汇总，整合尽可能多的内容，也方便大家搜索。&lt;/p&gt;
&lt;p&gt;其实网赚项目相当多，每天都会出很多玩法，但是hui色、坑人的不少，个人会筛选并只推荐安全的项目。&lt;/p&gt;
&lt;p&gt;另外有一些项目我不会直接分享出来，因为知道的人越多，大家能分到的越少。&lt;/p&gt;
&lt;p&gt;&lt;s</summary>
      
    
    
    
    <category term="网赚" scheme="https://www.gsgundam.com/categories/%E7%BD%91%E8%B5%9A/"/>
    
    
    <category term="网赚" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E8%B5%9A/"/>
    
  </entry>
  
  <entry>
    <title>省钱霸王餐-饿了么美团外卖低价无限吃</title>
    <link href="https://www.gsgundam.com/2024/2024-03-25-z23-earn-dine-and-dash/"/>
    <id>https://www.gsgundam.com/2024/2024-03-25-z23-earn-dine-and-dash/</id>
    <published>2024-03-25T04:30:00.000Z</published>
    <updated>2024-03-26T13:32:52.292Z</updated>
    
    <content type="html"><![CDATA[<h1 id="简单介绍"><a href="#简单介绍" class="headerlink" title="简单介绍"></a>简单介绍</h1><p>可以很便宜吃到外卖的小程序，主打一二线城市的霸王餐，绝对比领什么饿了么&#x2F;美团红包实惠的多了。</p><p>目前共有2家长期平台，服务地区不同，玩法一样。</p><p>具体得自己注册看看你们地区是否能使用，如果能用的话，有些店铺是可以0-5块吃一顿饭。</p><p>我这里一顿省10+轻轻松松，自己也经常用。</p><p>具体看截图吧，爱吃外卖的话，每天3顿饭能省不少钱。</p><p>不管怎么说，省到也算是赚到吧。</p><h1 id="霸王餐平台1-入口"><a href="#霸王餐平台1-入口" class="headerlink" title="霸王餐平台1-入口"></a>霸王餐平台1-入口</h1><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/bawangcan01.png"></p><h1 id="霸王餐平台2-入口"><a href="#霸王餐平台2-入口" class="headerlink" title="霸王餐平台2-入口"></a>霸王餐平台2-入口</h1><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/bawangcan02.png"></p><h1 id="返利详情"><a href="#返利详情" class="headerlink" title="返利详情"></a>返利详情</h1><p>提现没有门槛，而且到账都很快。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/bawangcan_show.jpg"></p><h1 id="网赚目录"><a href="#网赚目录" class="headerlink" title="网赚目录"></a>网赚目录</h1><p><a href="/earn/earn-guide/">🔙 返回查看网赚目录</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;简单介绍&quot;&gt;&lt;a href=&quot;#简单介绍&quot; class=&quot;headerlink&quot; title=&quot;简单介绍&quot;&gt;&lt;/a&gt;简单介绍&lt;/h1&gt;&lt;p&gt;可以很便宜吃到外卖的小程序，主打一二线城市的霸王餐，绝对比领什么饿了么&amp;#x2F;美团红包实惠的多了。&lt;/p&gt;
&lt;p&gt;目前共</summary>
      
    
    
    
    <category term="网赚" scheme="https://www.gsgundam.com/categories/%E7%BD%91%E8%B5%9A/"/>
    
    
    <category term="网赚" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E8%B5%9A/"/>
    
    <category term="外卖" scheme="https://www.gsgundam.com/tags/%E5%A4%96%E5%8D%96/"/>
    
    <category term="霸王餐" scheme="https://www.gsgundam.com/tags/%E9%9C%B8%E7%8E%8B%E9%A4%90/"/>
    
    <category term="饿了么" scheme="https://www.gsgundam.com/tags/%E9%A5%BF%E4%BA%86%E4%B9%88/"/>
    
    <category term="美团" scheme="https://www.gsgundam.com/tags/%E7%BE%8E%E5%9B%A2/"/>
    
    <category term="省钱" scheme="https://www.gsgundam.com/tags/%E7%9C%81%E9%92%B1/"/>
    
  </entry>
  
  <entry>
    <title>将Hexo博客的评论系统从Valine更换为Waline</title>
    <link href="https://www.gsgundam.com/2024/2024-03-25-z08-change-valine-to-waline-in-hexo/"/>
    <id>https://www.gsgundam.com/2024/2024-03-25-z08-change-valine-to-waline-in-hexo/</id>
    <published>2024-03-25T00:30:00.000Z</published>
    <updated>2024-03-24T19:16:34.547Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/return1999travel.jpg"></p><p>终于又一个历史遗留问题得到了解决。</p><p>起因是打算把平时经常接触到的网赚信息分享出来，几年了，自己又不太用得上，就这么都浪费了挺可惜的。但是如果没有评论系统的话，很影响互动，所以无论如何也要先修复了。</p><h1 id="定位问题"><a href="#定位问题" class="headerlink" title="定位问题"></a>定位问题</h1><p>这次一共有两个问题：第一是 <code>av-min.js</code> 又报错了，大概是被 LeanCloud 拒绝访问了；第二个是 LeanCloud 里的历史评论无法显示出来。</p><h1 id="解决问题"><a href="#解决问题" class="headerlink" title="解决问题"></a>解决问题</h1><h2 id="替换掉Valine"><a href="#替换掉Valine" class="headerlink" title="替换掉Valine"></a>替换掉Valine</h2><p>本来一开始没有想到需要替换掉评论系统，只是偶然google到一个博主的博文中，提到了 <code>Waline</code> （<a href="https://waline.js.org/">https://waline.js.org/</a>）这个从 Valine 衍生的带后端评论系统。据说可以将 Waline 理解为 With backend Valine。</p><p>仔细阅读了以后，发现极为符合我的需求。首先，客户端不再直接连接 LeanCloud ，也就是说有一个 Waline 官方提供的统一服务端来处理与 LeanCloud 的交互，非常有可能我们不用再处理 LeanCloud 频繁改动带来的连接问题；其次，Waline 不但提供了极其丰富的自定义配置和部署方式，而且文档比较完备，步骤相当简单。</p><p>当然，缺点也不是没有。一方面是依赖于 Waline 的核心服务端代码，另一方面最简单的迁移方式还是需要 LeanCloud 的服务，总之就是高度依赖于第三方服务。然而这点问题对于它给我带来的好处而言，完全可以忽略不计。</p><p>这里的步骤已经非常清晰了（<a href="https://waline.js.org/guide/get-started/">https://waline.js.org/guide/get-started/</a>），而且由于 Waline 的数据结构完全兼容 Valine，所以工作量非常小，跟着教程走就行。</p><p>这里只简单说一下几个要点：</p><p>1、国内版 LeanCloud 必须使用有备案的域名，并且由于 Waline 要使用api接口，所以还需要在 <code>Vercel</code> 中配置 <code>LEAN_SERVER</code> 这个变量， 而这个变量在 LeanCloud 上进行绑定时，部署证书的时间长得可怕，而且没有部署完是无法正常访问评论的。这一步一定耐心等待（除非你不打算用 LeanCloud ，而改用其他数据库）。</p><ul><li>绑定API域名对应 <a href="https://waline.js.org/guide/get-started/#leancloud-%E8%AE%BE%E7%BD%AE-%E6%95%B0%E6%8D%AE%E5%BA%93">“LeanCloud 设置 (数据库)” 的最后一步</a></li></ul><p><img src="https://waline.js.org/assets/leancloud-3-CT_lZM0A.png" alt="绑定 LeanCloud API域名"></p><ul><li>配置 <code>LEAN_SERVER</code> 变量对应 <a href="https://waline.js.org/guide/get-started/#vercel-%E9%83%A8%E7%BD%B2-%E6%9C%8D%E5%8A%A1%E7%AB%AF">“Vercel 部署 (服务端)” 的第4步</a></li></ul><p><img src="https://waline.js.org/assets/vercel-6-CQnJ4Agt.png" alt="配置 Vercel 变量"></p><p>2、后端评论管理只需要记住 <code>[二级域名].vercel.app</code> 就可以了，没有必要自己绑定专有。这里对应 <a href="https://waline.js.org/guide/get-started/#%E7%BB%91%E5%AE%9A%E5%9F%9F%E5%90%8D-%E5%8F%AF%E9%80%89">这一步</a>。</p><p>3、客户端引入的时候，如果是普通的浏览器脚本引入方式，例如：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://cdn.jsdelivr.net/npm/@waline/client@3/dist/waline.umd.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>那么初始化部分记得写成：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="title class_">Waline</span>.<span class="title function_">init</span>(&#123;</span><br><span class="line">    <span class="attr">el</span>: <span class="string">&#x27;&lt;%= theme.waline.waline_el %&gt;&#x27;</span>,</span><br><span class="line">    <span class="attr">serverURL</span>: <span class="string">&#x27;&lt;%= theme.waline.waline_server %&gt;&#x27;</span>,</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>这里对应 <a href="https://waline.js.org/guide/get-started/#html-%E5%BC%95%E5%85%A5-%E5%AE%A2%E6%88%B7%E7%AB%AF">“HTML 引入 (客户端)” 的第2步</a>。</p><p>4、最后记得先去 <code>[二级域名].vercel.app/ui/register</code> 注册成为管理员，这样可以更方便的通过域名进行评论管理。</p><h2 id="解决历史评论无法显示的问题"><a href="#解决历史评论无法显示的问题" class="headerlink" title="解决历史评论无法显示的问题"></a>解决历史评论无法显示的问题</h2><p>其实问题我早就猜到了，但是由于前面 Valine 访问 LeanCloud 的问题，修改了也看不到，无法验证。</p><p>在彻底换成 Waline 以后，问题也就轻易的暴露出来，就是我修改了文章的路径，评论系统无法通过 <code>url</code> 参数获取到对应的评论了。所以数据导出来，一个python脚本搞定，再导回去就结束了。</p><h1 id="思考"><a href="#思考" class="headerlink" title="思考"></a>思考</h1><p>其实在过程中我也看了关于 Valine 的解决方案，这里也推荐大家有时间也可以搜索了看一下，其实对理解它的工作流程很有帮助，这也有助于自己进行项目设计，规避设计风险。</p><p>在 Waline 的实施过程中，其实我还尝试了 <code>Vercel</code> 和 <code>腾讯云CloudBase</code> 两种部署方式，也尝试了 <code>LeanCloud</code> 、<code>MongoDB</code> 、<code>MySQL</code> 、 <code>SQLite</code> 和 <code>腾讯云CloudBase</code> 五种数据库连接方式。其中 腾讯云CloudBase 因为现在是要收费的，不推荐， MongoDB 服务端无法访问（端口确认开放，域名也加入白名单，目前没能找到解决方案）。这个过程中我发现 Waline 开发者相当用心，因为文档详尽才能让我快速的尝试这么多方案，而 <a href="https://waline.js.org/guide/get-started/">快速上手文档</a> 中则是选择了可行性最高、最易操作的组合，真是非常棒！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/return1999travel.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;终于又一个历史遗留问题得到了解决。&lt;/p&gt;
&lt;p&gt;起因是打算把平</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="博客" scheme="https://www.gsgundam.com/tags/%E5%8D%9A%E5%AE%A2/"/>
    
    <category term="valine" scheme="https://www.gsgundam.com/tags/valine/"/>
    
    <category term="评论系统" scheme="https://www.gsgundam.com/tags/%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="waline" scheme="https://www.gsgundam.com/tags/waline/"/>
    
  </entry>
  
  <entry>
    <title>解决百度云加速上传SSL证书提示：请上传正确的证书链（服务器+中间证书）问题</title>
    <link href="https://www.gsgundam.com/2024/2024-01-07-baidu-cdn-ssl-certificate-private-key-issue/"/>
    <id>https://www.gsgundam.com/2024/2024-01-07-baidu-cdn-ssl-certificate-private-key-issue/</id>
    <published>2024-01-07T11:30:00.000Z</published>
    <updated>2024-01-07T12:29:48.196Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/duniang.jpeg"></p><p>这其实已经是很久之前自己就遇到过的问题了，今天有个朋友也问到了百度云加速提示证书的问题（其实我很奇怪，现在全面收费了，还折腾这个做什么？），所以顺手记录一下。</p><p>方法来自 <a href="https://twcms.wkl8.cn/baidu_su_cdn_ssl_certificate_private_key_question.html">这里</a>。</p><p>1、打开网址：<a href="https://myssl.com/chain_download.html">https://myssl.com/chain_download.html</a>;</p><p>2、在输入框中填上自己的域名（不要带 <code>http://</code> 或 <code>https://</code> ），点击获取证书链按钮；</p><p>3 、把获取到的 RSA 证书链里的所有内容放到百度云加速的证书上传框里即可。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/duniang.jpeg&quot;&gt;&lt;/p&gt;
&lt;p&gt;这其实已经是很久之前自己就遇到过的问题了，今天有个朋友也问到了百度云加速提示证书</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="baidu" scheme="https://www.gsgundam.com/tags/baidu/"/>
    
    <category term="cdn" scheme="https://www.gsgundam.com/tags/cdn/"/>
    
    <category term="certificate" scheme="https://www.gsgundam.com/tags/certificate/"/>
    
    <category term="百度云加速" scheme="https://www.gsgundam.com/tags/%E7%99%BE%E5%BA%A6%E4%BA%91%E5%8A%A0%E9%80%9F/"/>
    
    <category term="证书链" scheme="https://www.gsgundam.com/tags/%E8%AF%81%E4%B9%A6%E9%93%BE/"/>
    
    <category term="SSL证书" scheme="https://www.gsgundam.com/tags/SSL%E8%AF%81%E4%B9%A6/"/>
    
    <category term="中间证书" scheme="https://www.gsgundam.com/tags/%E4%B8%AD%E9%97%B4%E8%AF%81%E4%B9%A6/"/>
    
  </entry>
  
  <entry>
    <title>成功改造自用Hexo主题Gacman兼容Pjax</title>
    <link href="https://www.gsgundam.com/2023/12/2023-12-24-make-hexo-gacman-theme-compatible-with-pjax/"/>
    <id>https://www.gsgundam.com/2023/12/2023-12-24-make-hexo-gacman-theme-compatible-with-pjax/</id>
    <published>2023-12-24T14:30:00.000Z</published>
    <updated>2023-12-24T18:01:12.428Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/hq720.jpg"></p><p>每天事情多得要命，全靠2毛一袋的咖啡和 <strong>精神氮泵</strong> 续命。所谓精神氮泵，自然是来自网易云音乐的给力歌曲了。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ%E6%88%AA%E5%9B%BE20231224232947.png" alt="我的精神氮泵"></p><p>一直想整合网页版播放器到博客里跟大家一起嗨。但是放在博客里是必须要改造目前的博客,如果不进行改造，跳转页面肯定会引起播放器中断。1月份的时候尝试利用 <code>Pjax</code> 的特性（<a href="/2023/01/2023-01-28-z23-try-to-make-hexo-theme-compatible-with-pjax/">尝试改造Hexo主题以兼容Pjax</a>），局部加载核心内容，而不影响播放器，可惜失败了。不过我这个人有个毛病，就是总会反复做一些事情。不信邪的我又翻出 <code>Pjax</code> 来研究了，别人都可以用，我相信一定有方法可以用上。</p><p>当然，这次不一样。我成功了！</p><h1 id="与其他成功案例进行比较"><a href="#与其他成功案例进行比较" class="headerlink" title="与其他成功案例进行比较"></a>与其他成功案例进行比较</h1><p>我最终找到了 <a href="https://tanyaodan.com/">t0ur1st</a> 的博客作为对比目标进行分析。首先跟我之前最大的区别是我使用了独立版的 <code>Pjax</code> ：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://cdn.jsdelivr.net/npm/pjax@VERSION/pjax.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>然而他使用了jquery版本：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://cdnjs.cloudflare.com/ajax/libs/jquery.pjax/2.0.1/jquery.pjax.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>既然Gacman主题本来就用到了 <code>jQuery</code> ，人家都已经成功了，何必还要去折腾呢？我选择躺平！</p><h1 id="找到整页刷新的问题关键"><a href="#找到整页刷新的问题关键" class="headerlink" title="找到整页刷新的问题关键"></a>找到整页刷新的问题关键</h1><p>Gacman主题继承自已经废弃的老版Jacman主题，各个模板之间的确都有些不太一样。模板不同的确会给 <code>Pjax</code> 改造带来一些困难，但我的Gacman其实已经大幅统一了，十分符合只更新核心部分、不更新页头&#x2F;页脚和侧边栏的需求，所以不应该有这种阻碍才对。</p><p>通过一番寻找，最大的问题就是在改造响应式风格的时候，<code>layout.ejs</code> 对于body模块内容的适配太零散了，分别在 <code>article.ejs</code> 等模板里单独做了嵌套结构和样式适配。而对于我这个模板来说，其实完全可以统一起来。于是 <code>layout.ejs</code> 中body部分变成了：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;container&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;row&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">main</span> <span class="attr">id</span>=<span class="string">&quot;main&quot;</span> <span class="attr">class</span>=<span class="string">&quot;col-md-9&quot;</span>&gt;</span></span><br><span class="line">            &lt;%- body %&gt;</span><br><span class="line">        <span class="tag">&lt;/<span class="name">main</span>&gt;</span></span><br><span class="line">        &lt;%- partial(&#x27;_partial/sidebar&#x27;,&#123;item: page,table: true&#125;) %&gt;</span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p>然后在 <code>after_footer.ejs</code> 模板中加入 <code>Pjax</code> 相关代码进行测试：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;/js/jquery-2.2.4.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;/js/jquery.pjax.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- ... --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 引入其他必要js脚本 --&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">  $(<span class="variable language_">document</span>).<span class="title function_">ready</span>(<span class="keyword">function</span>(<span class="params"></span>)&#123;</span></span><br><span class="line"><span class="language-javascript">    $(<span class="variable language_">document</span>).<span class="title function_">pjax</span>(<span class="string">&#x27;a[target!=_blank]&#x27;</span>, <span class="string">&#x27;#main&#x27;</span>, &#123;<span class="attr">fragment</span>:<span class="string">&#x27;#main&#x27;</span>, <span class="attr">timeout</span>:<span class="number">8000</span>&#125;); <span class="comment">// 绑定动态更新的节点</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="title function_">pageInit</span>(); <span class="comment">// 初始化页面内容的方法</span></span></span><br><span class="line"><span class="language-javascript">  &#125;);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">  $(<span class="variable language_">document</span>).<span class="title function_">on</span>(<span class="string">&#x27;pjax:send&#x27;</span>, <span class="keyword">function</span>(<span class="params"></span>) &#123;</span></span><br><span class="line"><span class="language-javascript">    <span class="title class_">NProgress</span>.<span class="title function_">start</span>(); <span class="comment">// 进度条</span></span></span><br><span class="line"><span class="language-javascript">  &#125;);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">  $(<span class="variable language_">document</span>).<span class="title function_">on</span>(<span class="string">&#x27;pjax:complete&#x27;</span>, <span class="keyword">function</span>(<span class="params"></span>) &#123;</span></span><br><span class="line"><span class="language-javascript">    <span class="title class_">NProgress</span>.<span class="title function_">done</span>();</span></span><br><span class="line"><span class="language-javascript">  &#125;);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">  <span class="variable language_">window</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;popstate&#x27;</span>, <span class="keyword">function</span>(<span class="params">e</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">    <span class="title class_">NProgress</span>.<span class="title function_">done</span>();</span></span><br><span class="line"><span class="language-javascript">  &#125;);</span></span><br></pre></td></tr></table></figure><p>测试一下，初步运行成功了！</p><h1 id="修复失效、报错的脚本"><a href="#修复失效、报错的脚本" class="headerlink" title="修复失效、报错的脚本"></a>修复失效、报错的脚本</h1><p>其实这步挺简单的，主要是个思路的问题。最佳方案是把所有零散的代码分类组合成方法，然后再看哪些方法是进网站加载一次就行的、哪些是需要跳转页面后再次加载的动态内容。</p><p>例如我的评论所使用的 <code>Valine</code> ，就需要在每次文章详情页中重新初始化。那就是定义好相关方法 <code>commentInit</code>，然后在合适的地方添加：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">$(<span class="variable language_">document</span>).<span class="title function_">ready</span>(<span class="keyword">function</span>(<span class="params"></span>)&#123;</span><br><span class="line">      $(<span class="variable language_">document</span>).<span class="title function_">pjax</span>(<span class="string">&#x27;a[target!=_blank]&#x27;</span>, <span class="string">&#x27;#main&#x27;</span>, &#123;<span class="attr">fragment</span>:<span class="string">&#x27;#main&#x27;</span>, <span class="attr">timeout</span>:<span class="number">8000</span>&#125;); <span class="comment">// 绑定动态更新的节点</span></span><br><span class="line"></span><br><span class="line">      <span class="title function_">pageInit</span>(); <span class="comment">// 初始化页面内容的方法</span></span><br><span class="line">      <span class="title function_">commentInit</span>(); <span class="comment">// 初始化评论</span></span><br><span class="line">    &#125;);</span><br><span class="line"></span><br><span class="line">    $(<span class="variable language_">document</span>).<span class="title function_">on</span>(<span class="string">&#x27;pjax:send&#x27;</span>, <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">      <span class="title class_">NProgress</span>.<span class="title function_">start</span>(); <span class="comment">// 进度条</span></span><br><span class="line">    &#125;);</span><br><span class="line"></span><br><span class="line">    $(<span class="variable language_">document</span>).<span class="title function_">on</span>(<span class="string">&#x27;pjax:complete&#x27;</span>, <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">      <span class="title class_">NProgress</span>.<span class="title function_">done</span>();</span><br><span class="line">      <span class="title function_">commentInit</span>(); <span class="comment">// 初始化评论</span></span><br><span class="line">    &#125;);</span><br><span class="line"></span><br><span class="line">    <span class="variable language_">window</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;popstate&#x27;</span>, <span class="keyword">function</span>(<span class="params">e</span>) &#123;</span><br><span class="line">      <span class="title class_">NProgress</span>.<span class="title function_">done</span>();</span><br><span class="line">      <span class="title function_">commentInit</span>(); <span class="comment">// 初始化评论</span></span><br><span class="line">    &#125;);</span><br></pre></td></tr></table></figure><p>那么这一步验证成功后，接下来就把相关的搜索功能依葫芦画瓢就行。当然，实际上很多js是不需要动态执行的，这个要按需规划。</p><h1 id="加入网易云播放器"><a href="#加入网易云播放器" class="headerlink" title="加入网易云播放器"></a>加入网易云播放器</h1><p>我这里什么插件都没有用到，直接在 <code>footer.ejs</code> 中增加网易云官方给出的 iframe 解决方案：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- 网易云音乐插件 --&gt;</span></span><br><span class="line">&lt;% if (theme.music &amp;&amp; theme.music.enable)&#123; %&gt;</span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">style</span>=<span class="string">&quot;position:fixed; bottom:18px; right:60px; &quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">iframe</span> <span class="attr">frameborder</span>=<span class="string">&quot;no&quot;</span> <span class="attr">border</span>=<span class="string">&quot;0&quot;</span> <span class="attr">marginwidth</span>=<span class="string">&quot;0&quot;</span> <span class="attr">marginheight</span>=<span class="string">&quot;0&quot;</span> <span class="attr">width</span>=<span class="string">330</span> <span class="attr">height</span>=<span class="string">110</span> <span class="attr">src</span>=<span class="string">&quot;&lt;%=theme.music.src%&gt;&amp;auto=&lt;%=theme.music.autoplay?1:0%&gt;&amp;height=90&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">iframe</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">&lt;% &#125; %&gt;</span><br></pre></td></tr></table></figure><p>像 <code>&lt;%=theme.music.src%&gt;</code> 这类常量当然是在 <code>_config.yml</code> 中配置好了。</p><p>测试一下，非常完美！</p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>有时候其实就差那么一点顿悟，上次折腾了好几天还没能解决的问题，这次多少是让人有点兴奋。赶紧把网站更新上来，有问题也好速速改掉。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/hq720.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;每天事情多得要命，全靠2毛一袋的咖啡和 &lt;strong&gt;精神氮泵&lt;/strong&gt; 续</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="博客" scheme="https://www.gsgundam.com/tags/%E5%8D%9A%E5%AE%A2/"/>
    
    <category term="blog" scheme="https://www.gsgundam.com/tags/blog/"/>
    
    <category term="主题" scheme="https://www.gsgundam.com/tags/%E4%B8%BB%E9%A2%98/"/>
    
    <category term="pjax" scheme="https://www.gsgundam.com/tags/pjax/"/>
    
    <category term="兼容" scheme="https://www.gsgundam.com/tags/%E5%85%BC%E5%AE%B9/"/>
    
    <category term="theme" scheme="https://www.gsgundam.com/tags/theme/"/>
    
    <category term="精神氮泵" scheme="https://www.gsgundam.com/tags/%E7%B2%BE%E7%A5%9E%E6%B0%AE%E6%B3%B5/"/>
    
    <category term="网易云" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E6%98%93%E4%BA%91/"/>
    
    <category term="播放器" scheme="https://www.gsgundam.com/tags/%E6%92%AD%E6%94%BE%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>WordPress中的时区问题</title>
    <link href="https://www.gsgundam.com/2023/11/2023-11-02-wordpress-timezone-offset/"/>
    <id>https://www.gsgundam.com/2023/11/2023-11-02-wordpress-timezone-offset/</id>
    <published>2023-11-02T03:30:00.000Z</published>
    <updated>2023-12-24T18:01:12.427Z</updated>
    
    <content type="html"><![CDATA[<p>今天维护客户网站的时候，突然想起来自己写的百度统计插件总会时不时出现无法更新数据的问题，就想着再好好检查一下。</p><p>将所有数据都打印出来以后，发现问题实际上是出在 <code>strtotime</code> 函数上。通过百度服务器获取到的时间是正确的，但是转换以后的时间戳多了8个小时出来。这明显就是时区问题了。</p><p>然而在terminal里 <code>date</code> 出来的时间也是对的，那么问题就极有可能是WordPress搞出来的了。我印象里 <code>wpjam</code> 的作者 <code>Denis</code> 有文章提到过他的插件有相应的转换功能。</p><p>经过简单的搜索，确实找到了文章。如果网站本身就用到了 <code>wpjam basic</code> 插件，那么只需要把 <code>strtotime</code> 替换为 <code>wpjam_strtotime</code>，所有问题都迎刃而解。这个函数做了这样一件事情：</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">wpjam_strtotime</span>(<span class="params"><span class="variable">$string</span></span>)</span>&#123;</span><br><span class="line"><span class="keyword">return</span> <span class="title function_ invoke__">date_create</span>(<span class="variable">$string</span>, <span class="title function_ invoke__">wp_timezone</span>())-&gt;<span class="title function_ invoke__">getTimestamp</span>();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>我突然又想到了另外一个问题，我的代码中还用到了 <code>time()</code>  和 <code>date()</code> 函数，那它们的结果正确吗？</p><p>经过测试，我这里得到了正确结果。但是抱着怀疑的态度，我还是再次上网查询。结果网上的建议是不要使用PHP原生的 <code>time()</code>  和 <code>date()</code> 函数，应该使用 <code>current_time( &#39;timestamp&#39; )</code> 和 <code>wp_date()</code> 。出于个人的谨慎，在反复确认结果无误以后，我把相关函数都换成了 <code>current_time( &#39;timestamp&#39; )</code> 和 <code>wp_date()</code> ，谨防出现新的问题。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天维护客户网站的时候，突然想起来自己写的百度统计插件总会时不时出现无法更新数据的问题，就想着再好好检查一下。&lt;/p&gt;
&lt;p&gt;将所有数据都打印出来以后，发现问题实际上是出在 &lt;code&gt;strtotime&lt;/code&gt; 函数上。通过百度服务器获取到的时间是正确的，但是转换以</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="wordpress" scheme="https://www.gsgundam.com/tags/wordpress/"/>
    
    <category term="插件" scheme="https://www.gsgundam.com/tags/%E6%8F%92%E4%BB%B6/"/>
    
    <category term="plugin" scheme="https://www.gsgundam.com/tags/plugin/"/>
    
    <category term="php" scheme="https://www.gsgundam.com/tags/php/"/>
    
    <category term="time" scheme="https://www.gsgundam.com/tags/time/"/>
    
    <category term="时区" scheme="https://www.gsgundam.com/tags/%E6%97%B6%E5%8C%BA/"/>
    
    <category term="timezone" scheme="https://www.gsgundam.com/tags/timezone/"/>
    
    <category term="date" scheme="https://www.gsgundam.com/tags/date/"/>
    
    <category term="wpjam" scheme="https://www.gsgundam.com/tags/wpjam/"/>
    
    <category term="wpjam basic" scheme="https://www.gsgundam.com/tags/wpjam-basic/"/>
    
  </entry>
  
  <entry>
    <title>闲聊从头构建游戏</title>
    <link href="https://www.gsgundam.com/2023/10/2023-10-28-start-2-design-a-game/"/>
    <id>https://www.gsgundam.com/2023/10/2023-10-28-start-2-design-a-game/</id>
    <published>2023-10-28T10:30:00.000Z</published>
    <updated>2023-12-20T23:40:21.756Z</updated>
    
    <content type="html"><![CDATA[<p>近几周在学习之余，除了处理一些外包业务的事情之外，本来也是经常跟老王、向总聊一些游戏设计和开发上的问题和心得，偶尔还给别的游戏出点方案、调下数据和体验。今天又跟老肖聊到一个新游戏的构思，于是就想着把这个过程中的一些想法和过去的一些心得记录下来，沉淀一下。</p><h1 id="为什么要做这个游戏"><a href="#为什么要做这个游戏" class="headerlink" title="为什么要做这个游戏"></a>为什么要做这个游戏</h1><p>这个问题似乎有点蠢，但是很遗憾，我的见闻里真的充满了这样的商业游戏案例，也包括多年前的自己干的傻事。很多人都是因为喜欢游戏，所以想做游戏。但是作为一个商业产品，一个游戏它总有一个市场目标，或许是为了盈利，或许是为了宣传，或许是为了进行某种验证。只有明确了这个目标，从而拆解出子目标和路径，才可能真正有目标的去完成一个商业游戏。</p><h1 id="用户群体"><a href="#用户群体" class="headerlink" title="用户群体"></a>用户群体</h1><p>明确了为什么要做游戏之后，就需要明确游戏的用户群体。不同的用户群体，对游戏的需求、游戏时间、付费习惯等等都是不同的。再深入一点，不同的游戏题材、游戏类型，也会对用户群体有所影响。对目标群体越明确、精准，尤其是能够找到潜在用户群体中的痛点，进行一些独特的游戏设计，成功率就会高一些。</p><p>对于一个成熟的公司，基于一些调研和数据积累，可能会有一个比较明确的用户画像。但是对于一个缺少数据的公司或团队，经验和“第六感”就很重要了。这个时候，就需要对游戏的题材、类型、玩法、画风等等进行一些分析，然后结合自己的经验和感觉，来确定一个用户群体。</p><h1 id="核心玩法与核心体验"><a href="#核心玩法与核心体验" class="headerlink" title="核心玩法与核心体验"></a>核心玩法与核心体验</h1><p>这是个很有意思的命题。对于一个游戏来说，核心玩法和核心体验是相辅相成的，核心玩法是核心体验的基础，核心体验是核心玩法的体现。所以很难说哪个更重要，哪个更需要先确定。但是从开发的角度来说，核心玩法是游戏的基础，是游戏的骨架，是游戏的灵魂。所以在确定核心体验之前，通常情况下，先确定核心玩法，是一个比较好的选择，可操作性强。</p><h2 id="核心玩法"><a href="#核心玩法" class="headerlink" title="核心玩法"></a>核心玩法</h2><p>核心玩法在游戏设计中通常通过三个方面体现：战斗机制、经济体系、社交系统。其中，战斗机制往往是最重要的部分，甚至有时候核心玩法就是指的战斗机制。毕竟战斗是支撑玩家向前推进游戏最重要的部分，也是玩家在游戏中最多花费时间的部分。</p><p>战斗机制可以拆解为战斗公式、战斗规则、战斗策略、关卡机制等。经济体系包含了游戏中的货币体系、道具体系、商店体系、掉落体系等。社交系统包含了游戏中的社交关系、社交玩法、社交奖励等。当然，这三个方面的体现是有交叉的，比如战斗机制中的战斗公式，往往也会影响到经济体系中的道具体系，社交系统中的社交关系，也会影响到战斗机制中的战斗策略。</p><p>上述内容在游戏介绍的时候往往会概括成一句话特征，例如“回合制卡牌游戏”，也就是游戏类型。只是这个描述太过于笼统，在确定核心玩法的时候，需要尽可能的细化。</p><h2 id="核心体验"><a href="#核心体验" class="headerlink" title="核心体验"></a>核心体验</h2><p>有一篇文章形容核心体验是整个游戏的“调性”，我觉得非常贴切。核心体验可以是一种情绪，也可以是一种感觉，它呈现出设计者想要表达的气质。它是一个游戏最抽象的总结，一个玩家在描述这个游戏所用到的关键词，就是他对这个游戏的核心体验的理解。</p><p>核心体验好不好决定了游戏的上限和生命周期，它所呈现的气质与目标用户越贴合，就越容易让用户产生共鸣，从而提升用户的新增、留存和付费。</p><h2 id="个人倾向"><a href="#个人倾向" class="headerlink" title="个人倾向"></a>个人倾向</h2><p>作为一个一直重视游戏体验的人，我自己其实更倾向于先确定核心体验，然后根据用户群体的特性再去找核心玩法，确保核心玩法可以精准的体现核心体验。当然不是说这样做就没有风险，事实上有时候也会因为核心体验的确定，而导致核心玩法的选择受限，使得游戏表现平平无奇。</p><p>至于我为什么会有这个倾向，也大概与我的经历有关，尽管我经常标榜自己为一个独立开发者，但实际上我曾经为了了解游戏产品全过程而大幅降薪去从事运营和产品工作。在此期间经历过多款游戏产品，从玩法上来说平平无奇，但是由于结合运营手段，把各类用户体验做到极致，从而在商业上获得成功。加之我本身是一个注重体验的人（可能也与我本科专业有关），所以在做游戏的时候，更倾向于先确定核心体验。</p><p>当然，无论体验还是玩法，即便是在游戏上线之后，也都是需要不断迭代的。</p><h1 id="系统规划"><a href="#系统规划" class="headerlink" title="系统规划"></a>系统规划</h1><p>明确了核心玩法和核心体验，就可以在此基础上进行系统规划。当然在进行规划时，一定要时刻牢记系统定位。一旦系统定位模糊不清，就非常可能导致后续的设计和开发跑偏。所以在进行系统规划时，一定要把系统定位列出来，包含多个维度、多个功能、多个目的，不能只列一个总的。这样在后续的设计和开发中，就可以时刻检查是否偏离了系统定位，保证每个设计都可以达成它的设计目的，保证游戏系统正常运转。</p><p>我之前跟其他入行策划的新同事聊天时，总会尝试跟他们聊聊规划的重要性。曾经不止一个游戏人跟我说过，自己的游戏自己还不清楚吗？放现在我一定会说，或许现在清楚，但未必过一周还清楚。就个人开发而言，如果没有对规划进行记录，那么在产生新的设计想法的时候，就很容易忘记之前的设计目的，从而导致设计的偏离。而对于团队开发而言，系统规划设计是作为大家沟通的基础，如果没有规划，那么就很容易出现沟通不畅、设计不统一的问题。</p><h2 id="属性与规则"><a href="#属性与规则" class="headerlink" title="属性与规则"></a>属性与规则</h2><p>属性是构成整个游戏的基础元素，是玩法设计的最小体现。而规则可以看做是每个系统的“关键词”，同时它也是各个属性、系统之间的“纽带”。</p><p>常常会有人先去做系统和模块的详细设计，然后来总结属性和规则。这当然是可以的。但是我个人会倾向于先根据核心玩法和核心体验，总结出属性和规则，然后去做系统和模块的详细设计，再返回来查漏补缺。这样做的好处仍然是保证系统设计的目的性，同时也可以保证系统设计的完整性、一致性。</p><h2 id="系统与模块"><a href="#系统与模块" class="headerlink" title="系统与模块"></a>系统与模块</h2><p>这个部分和后面的世界观是更多人关注的、也是更多人擅长的部分。这个部分是在系统规划的基础上，根据核心玩法和核心体验，进行更加具体的设计。理论上来说，只要按照总的规划来设计，不跑偏，不作妖，不会出太大的问题。</p><p>我个人一直推崇思维导图的方式进行系统设计，它可以很好的把握系统的整体性，确保所有散开的枝叶之间保持联系。当然，用其他的方式也是可以的，比如表格、流程图等。</p><h2 id="世界观"><a href="#世界观" class="headerlink" title="世界观"></a>世界观</h2><p>世界观是我个人一直特别感兴趣的东西。但是它的重要性对于一个商业产品而言，更多取决于产品性质和它面向的用户群体。部分用户群体，对于世界观的要求并不高，甚至可以说不在意，那对于开发者而言，就应该把更多的精力放在核心玩法和核心体验上。</p><p>但是作为游戏的外衣，世界观绝对是不可或缺的。所有的故事情节、角色设定、画面表现，都是以世界观为基础，这样才能保持整个游戏的一致性。这层外衣通过文字表述和视觉效果共同呈现，对于重视世界观的用户群体，甚至会因为某个角色人设好、某个道具设计好，而产生强烈的共鸣，愿意为其付费。</p><p>说到这里，我也会想到过去有些特别重视世界观的游戏（特别是IP类），其实核心玩法并不突出。以至于我在想它们应该是从世界观开始设计的，然后再去找核心玩法，这样的游戏也是因为世界观的吸引力获得了成功。</p><p>当然，世界观也是可以在后续的开发中进行调整的，但是一旦调整核心部分，就会牵一发而动全身，所以在确定世界观之后，一定要尽量保持稳定。</p><h1 id="体验设计"><a href="#体验设计" class="headerlink" title="体验设计"></a>体验设计</h1><p>体验设计这个东西其实特别难以量化，它可以是基于个人经验对于事实的总结，也可以基于数据分析。但是无论是哪种方式，都需要在对游戏设计有比较深入的了解、且形成一套逻辑清晰的方法论前提下，才能做出比较准确的判断。</p><p>如何进行体验设计，目前我还没有发现一个具体的规范，实施方法和过程因人而异。就我个人而言，我习惯于先构思游戏的核心循环，然后围绕这个循环，结合目标用户群体的特征去进行设计。</p><h2 id="核心循环"><a href="#核心循环" class="headerlink" title="核心循环"></a>核心循环</h2><p>其实在我入行大概2年多（也就是大约15年前），我还不知道核心循环对于一个商业游戏的重要性。核心循环揭示了我们设计的游戏如何运转、驱动力来自于哪里。例如我跟老肖聊到的卡牌游戏，其核心循环可以极致简化为：关卡→养成→迭代，核心驱动力就是收集。当然，写到策划案里面并不是这么简单一句话，核心循环包含了所有玩家游戏主要行为、展示了每个部分的相关动机，与商业化循环构成一个双循环闭环。</p><p>每个类型的游戏核心驱动力各不相同，但是都基于人的天性，例如“收集”、“成长”、“竞争”、“探索”等等。可以突出某一个方面，也可以结合运用。</p><p>核心循环更像是一个分析的过程，我们通过这个模型来精准的找到重要的体验节点，从而把握住玩家体验的轻重缓急。</p><h2 id="玩家心智模型"><a href="#玩家心智模型" class="headerlink" title="玩家心智模型"></a>玩家心智模型</h2><p>由于缺乏数据支撑，因此心智模型某种程度上可能是使体验设计难以量化的一大重要原因。幸运的是我们可以通过阅读和学习，来了解一些前人、专家的心智模型，然后结合自己的经验，归纳总结分析，得出自己的理论模型。</p><p>我不确定是否所有游戏策划都赞同需要这个东西，也可能是因为我大学专业的缘故把心理学在游戏中的应用放到了一个很重要的位置。但我认为，构建一个能够对玩家行为进行有效的解释和预测的模型，可以让我们能够有效地理解玩家想要什么、他们为什么想要这些，以及应该以什么样的方式满足他们的需求。</p><h2 id="体验流程"><a href="#体验流程" class="headerlink" title="体验流程"></a>体验流程</h2><p>我一直赞同一个理念——“体验存在于玩家头脑里”。这来自于我职业生涯中素未谋面的策划导师 <strong><a href="https://www.zhihu.com/people/zhang-bin-71/creations/19564520">天之虹</a></strong> 所翻译并推荐的书《游戏设计的艺术》。至于为什么赞同，我觉得看过这本书的人应该比较容易理解。</p><p>一个游戏为什么让人沉迷？这或许是让有些人觉得游戏是一种x品的原因。但实际上它与让部分人沉迷的书本没有任何区别。但凡经历过“心流”（flow）的人，都会对那种体验难以忘怀，那是一种持续地专注、愉悦和快乐的状态。而一个拥有良好体验的游戏，一定设计了这样的体验流程，让玩家在游戏中不断地进入心流状态。</p><p>怎么去设计这样的体验流程？书里的几个关键词已经给出了思路：“清晰的目标”、“任务聚焦”、“直接的反馈”、“连续的挑战”。</p><h1 id="数据"><a href="#数据" class="headerlink" title="数据"></a>数据</h1><p>记得我第一次将数据纳入我的游戏策划知识体系，是2009年接触到 <strong><a href="https://www.zhihu.com/people/zhang-bin-71/creations/19564520">天之虹</a></strong> 的博客。加之后来与他的简单交流（包括我去从事产品运营工作，一定程度也参考了他的建议），我将数据采集、数据沉淀、数据分析放在了相当重要的位置，也作为构建游戏之处就需要考虑的方面。</p><p>当然，这部分内容在10多年后的今天，已经不是什么新鲜话题了，早已深入游戏开发者的心中。所以我就简单说说。</p><h2 id="数据沉淀"><a href="#数据沉淀" class="headerlink" title="数据沉淀"></a>数据沉淀</h2><p>数据埋点和初步分析需要在游戏开发的早期就开始进行，一方面用于验证设计的有效性、指导后续设计，另一方面为后续的数据分析提供基础。通常我们要收集的信息包括：用户基础信息、成长数据、战斗数据、经济数据、社交数据等等。</p><h2 id="数据分析"><a href="#数据分析" class="headerlink" title="数据分析"></a>数据分析</h2><p>在进行数据分析前，肯定得明确我们到底需要什么：是想知道用户新增&#x2F;流失情况？还是付费点与ROI的关系？</p><p>通常必要的数据分析，都包含了：用户留存、关卡流失（包括战斗平衡性）、游戏时长（包括系统使用时长）、付费点、付费习惯、付费转化率。</p><p>通常需要用到的方法包括：漏斗分析、折线图分析、对比分析、回归分析。</p><h2 id="数据应用"><a href="#数据应用" class="headerlink" title="数据应用"></a>数据应用</h2><p>这个部分在小型团队其实通常不太被重视，这也是可以理解的，小型团队通常一个人要当几个人使，一个项目的生命周期通常也不会太长。而数据应用在短期内并不会带来明显的收益，从性价比来说的确非常不划算。但是对于大型团队或者公司来说，这就好比BI软件之于企业一样，是必不可少的，是后续产品不断迭代、创新的坚实基础。</p><p>数据应用包括了：数据驱动的设计、数据驱动的运营、数据驱动的迭代。就像我之前说的体验设计是可以基于数据分析的，但首先必须有足够的数据支撑。基于这些数据构建模型，从而反哺设计、运营、乃至新项目的立项，形成一个良性循环。</p><h1 id="写在后面"><a href="#写在后面" class="headerlink" title="写在后面"></a>写在后面</h1><p>感觉罗里吧嗦了一大篇，大部分还是纯理论和概念的东西。但这也是无可奈何，游戏设计是实在一个庞大的体系。就这样写下来，包括商业循环、节奏、概率与奖池等东西都没涉及到。以后有机会再聊吧。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;近几周在学习之余，除了处理一些外包业务的事情之外，本来也是经常跟老王、向总聊一些游戏设计和开发上的问题和心得，偶尔还给别的游戏出点方案、调下数据和体验。今天又跟老肖聊到一个新游戏的构思，于是就想着把这个过程中的一些想法和过去的一些心得记录下来，沉淀一下。&lt;/p&gt;
&lt;h1 i</summary>
      
    
    
    
    <category term="项目开发" scheme="https://www.gsgundam.com/categories/%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="游戏设计" scheme="https://www.gsgundam.com/tags/%E6%B8%B8%E6%88%8F%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="游戏策划" scheme="https://www.gsgundam.com/tags/%E6%B8%B8%E6%88%8F%E7%AD%96%E5%88%92/"/>
    
    <category term="游戏架构" scheme="https://www.gsgundam.com/tags/%E6%B8%B8%E6%88%8F%E6%9E%B6%E6%9E%84/"/>
    
    <category term="游戏开发" scheme="https://www.gsgundam.com/tags/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>尝试改造Hexo主题以兼容Pjax</title>
    <link href="https://www.gsgundam.com/2023/01/2023-01-28-z23-try-to-make-hexo-theme-compatible-with-pjax/"/>
    <id>https://www.gsgundam.com/2023/01/2023-01-28-z23-try-to-make-hexo-theme-compatible-with-pjax/</id>
    <published>2023-01-27T15:30:00.000Z</published>
    <updated>2023-12-20T23:40:21.754Z</updated>
    
    <content type="html"><![CDATA[<p>先说结果，暂时没有改造成功。原因是发现 <code>Pjax</code> 其实非常依赖布局的一致性。而目前自己名为 <em>Gacman</em> 的主题，本质是脱胎于老版本的 <em>Pacman</em> ，各个页面结构差别较大，而 <code>Pjax</code> 在检测到布局差别大的页面时，会自动重新拉取页面，从而失去了局部刷新的特性。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/genshin.jpg"></p><h1 id="什么是-Pjax"><a href="#什么是-Pjax" class="headerlink" title="什么是 Pjax"></a>什么是 Pjax</h1><p><code>Pjax</code> 通过ajax从服务器获取HTML，然后用加载的HTML替换页面上容器元素的内容。然后，它使用pushState更新浏览器中的当前URL。即 <code>pjax = pushState + ajax</code> 。</p><p>它最大的优势在于，可以在网站本身无刷新的情况下，局部刷新内容，同时在现代浏览器中支持前进和后退，由于局部加载的数据量极小，加载速度极快，因此可以最大程度的提升用户体验。</p><p>它的天生劣势在于，默认配置对 <code>SEO</code> 并不友好，需要大量改造来优化。</p><p>最早的时候，<code>Pjax</code> 是一个基于 <code>jQuery</code> 的插件，后来推出了完全独立的版本，适应更广泛的应用场景。</p><h1 id="为-Hexo-引入-Pjax"><a href="#为-Hexo-引入-Pjax" class="headerlink" title="为 Hexo 引入 Pjax"></a>为 Hexo 引入 Pjax</h1><p>很多较早使用 <code>Pjax</code> 的 Hexo 主题，都使用了基于 <em>jQuery</em> 的版本。由于我是新引入，所以使用了最新的独立版本的 <code>Pjax</code> （ <a href="https://github.com/MoOx/pjax">https://github.com/MoOx/pjax</a> ）。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://cdn.jsdelivr.net/npm/pjax@VERSION/pjax.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h1 id="为什么要引入-Pjax"><a href="#为什么要引入-Pjax" class="headerlink" title="为什么要引入 Pjax"></a>为什么要引入 Pjax</h1><p>其实原因超简单，因为最近迷上了 <strong>精神氮泵</strong> ，也是晚上肝代码肝图的有效工具。于是在网易云音乐做了个专辑，想放到博客里。</p><p>但是如果不进行改造，跳转页面肯定会引起播放器中断，于是就想到了利用 <code>Pjax</code> 的特性，局部加载核心内容，而不影响播放器。</p><h1 id="兼容处理"><a href="#兼容处理" class="headerlink" title="兼容处理"></a>兼容处理</h1><p>查了不少资料，整体是参考 <a href="https://volantis.js.org/v5/development-api/#Pjax">Volantis6</a> 主题 Pjax 版的开发文档。</p><p>首先独立版的 Pjax 工作方式其实特别好理解。例如初始化：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;DOMContentLoaded&#x27;</span>, <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">  pjax = <span class="keyword">new</span> <span class="title class_">Pjax</span>(&#123;</span><br><span class="line">    <span class="attr">elements</span>: <span class="string">&#x27;a[href]:not([href^=&quot;#&quot;]):not([href=&quot;javascript:void(0)&quot;]):not([pjax-fancybox]):not([onclick=&quot;return false;&quot;]):not([onclick=&quot;return!1&quot;]):not([target=&quot;_blank&quot;]):not([target=&quot;view_window&quot;]):not([href$=&quot;.xml&quot;])&#x27;</span>, <span class="comment">// 丁仪</span></span><br><span class="line">    <span class="attr">selectors</span>: [</span><br><span class="line">      <span class="string">&quot;head title&quot;</span>, <span class="comment">// 标题</span></span><br><span class="line">      <span class="string">&quot;head meta[name=keywords]&quot;</span>, <span class="comment">// 关键词</span></span><br><span class="line">      <span class="string">&quot;head meta[name=description]&quot;</span>, <span class="comment">// 描述</span></span><br><span class="line">      <span class="string">&quot;.pjax&quot;</span>,</span><br><span class="line">      <span class="string">&quot;pjax&quot;</span>, <span class="comment">// &lt;pjax&gt;&lt;/pjax&gt; 标签</span></span><br><span class="line">      <span class="string">&quot;script[data-pjax], .pjax-reload script&quot;</span> <span class="comment">// script标签添加data-pjax 或 script标签外层添加.pjax-reload 的script代码段重载</span></span><br><span class="line">    ],</span><br><span class="line">    <span class="attr">cacheBust</span>: &lt;%= theme.<span class="property">plugins</span>.<span class="property">pjax</span>.<span class="property">cacheBust</span> %&gt;,   <span class="comment">// url 地址追加时间戳，用以避免浏览器缓存</span></span><br><span class="line">    <span class="attr">timeout</span>: &lt;%= theme.<span class="property">plugins</span>.<span class="property">pjax</span>.<span class="property">timeout</span> %&gt;,</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>然后是标签部分，当然，在我主题中是轻量使用 <code>Pjax</code>，所以主要是用在以下场景：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;pjax&quot;</span>&gt;</span>我是将被pjax重载的内容<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">data-pjax</span>&gt;</span>我是将被pjax重载的内容<span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;pjax-reload&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span>&gt;</span>我不是将被pjax重载的内容<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">script</span>&gt;</span>我是将被pjax重载的内容<span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><h1 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h1><p>看上去都很顺畅，但是后来实际测试问题非常多。</p><h2 id="调整"><a href="#调整" class="headerlink" title="调整"></a>调整</h2><p>我为了模块化管理，把一些脚本都放到各个模块的 <em>ejs</em> 中了，这就造成管理重载内容非常麻烦，需要每个地方单独改，否则就需要整理到一个地方统一处理。总之都很麻烦。</p><p>然而我还是耐着性子花了几乎一个通宵处理好了所有模板（除了评论外）。</p><h2 id="布局"><a href="#布局" class="headerlink" title="布局"></a>布局</h2><p>这个是最严重的问题，独立版的 <code>Pjax</code> 会自动检测布局变化，如果变化过大，则会重载整个页面。</p><p>实际测试就发现非常容易触发重载，尤其是 <code>page</code> 和 <code>post</code> ，因为这两个部分原本的处理就完全不同。测试了一下，如果完全相同，则不会触发重载。</p><p>所以，最终由于这个原因，我给 <code>Pjax</code> 版的博客打了个分支，还是继续使用老版的主题了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;先说结果，暂时没有改造成功。原因是发现 &lt;code&gt;Pjax&lt;/code&gt; 其实非常依赖布局的一致性。而目前自己名为 &lt;em&gt;Gacman&lt;/em&gt; 的主题，本质是脱胎于老版本的 &lt;em&gt;Pacman&lt;/em&gt; ，各个页面结构差别较大，而 &lt;code&gt;Pjax&lt;/code&gt;</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="博客" scheme="https://www.gsgundam.com/tags/%E5%8D%9A%E5%AE%A2/"/>
    
    <category term="blog" scheme="https://www.gsgundam.com/tags/blog/"/>
    
    <category term="主题" scheme="https://www.gsgundam.com/tags/%E4%B8%BB%E9%A2%98/"/>
    
    <category term="pjax" scheme="https://www.gsgundam.com/tags/pjax/"/>
    
    <category term="兼容" scheme="https://www.gsgundam.com/tags/%E5%85%BC%E5%AE%B9/"/>
    
    <category term="theme" scheme="https://www.gsgundam.com/tags/theme/"/>
    
  </entry>
  
  <entry>
    <title>苹果系统macOS安装完成后无法在条款与条件页面点击灰色的同意按钮</title>
    <link href="https://www.gsgundam.com/2023/01/2023-01-18-z15-cant-accept-icloud-terms-after-macos-install-agree-button-greyed-out/"/>
    <id>https://www.gsgundam.com/2023/01/2023-01-18-z15-cant-accept-icloud-terms-after-macos-install-agree-button-greyed-out/</id>
    <published>2023-01-18T07:30:00.000Z</published>
    <updated>2023-01-18T15:18:30.870Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/104036816_p0_master1200.jpg" alt="macOS"></p><p>还是因为 <code>Python</code> 的问题，古董 Macbook Pro 2010 也登场了。过不了引导，就重装了系统。然而问题卡在了账号登录以后，条款和条件无论如何也无法同意，同意按钮是灰色的。</p><p>“智慧”的度娘没有给出任何有用的建议，还是谷哥厉害，一击解决。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230118154353.png" alt="条款与条件的同意按钮是灰色"></p><p>网页还列出了所有会出现这个问题的系统版本，出乎意料的多：</p><ol><li>macOS Catalina 10.15</li><li>macOS Mojave 10.14</li><li>macOS High Sierra 10.13</li><li>macOS Sierra 10.12</li><li>OS X El Capitan 10.11</li><li>OS X Yosemite 10.10</li><li>OS X Mavericks 10.9</li></ol><p>然而，解决方案也出乎意料的简单，在登录账号的时候，点击上方的链接小字 <code>稍后设置</code> ，跳过登录就完事儿了。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230118154512.png" alt="点击“稍后设置”"></p><p>PS：顺便吐个槽，网上那些回答为了得点积分、得点流量，什么乱七八糟的、一点也不解决问题的、相关不相关的、驴头不对马嘴的答案全都出来了。咱还是留点脸行不行，不会就不会，不要浪费搜索资源。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/104036816_p0_master1200.jpg&quot; alt=&quot;macOS&quot;&gt;&lt;/p&gt;
&lt;p&gt;还是因为 &lt;code&gt;Py</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="macos" scheme="https://www.gsgundam.com/tags/macos/"/>
    
    <category term="条款与条件" scheme="https://www.gsgundam.com/tags/%E6%9D%A1%E6%AC%BE%E4%B8%8E%E6%9D%A1%E4%BB%B6/"/>
    
    <category term="同意" scheme="https://www.gsgundam.com/tags/%E5%90%8C%E6%84%8F/"/>
    
    <category term="灰色" scheme="https://www.gsgundam.com/tags/%E7%81%B0%E8%89%B2/"/>
    
    <category term="苹果系统" scheme="https://www.gsgundam.com/tags/%E8%8B%B9%E6%9E%9C%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="macbook" scheme="https://www.gsgundam.com/tags/macbook/"/>
    
    <category term="terms" scheme="https://www.gsgundam.com/tags/terms/"/>
    
    <category term="安装系统" scheme="https://www.gsgundam.com/tags/%E5%AE%89%E8%A3%85%E7%B3%BB%E7%BB%9F/"/>
    
  </entry>
  
  <entry>
    <title>升级Windows11 wsl Ubuntu子系统的 Python 到最新版本(3.10)</title>
    <link href="https://www.gsgundam.com/2023/01/2023-01-18-z08-upgrade-python-3-in-ubuntu-of-wsl-windows/"/>
    <id>https://www.gsgundam.com/2023/01/2023-01-18-z08-upgrade-python-3-in-ubuntu-of-wsl-windows/</id>
    <published>2023-01-18T00:30:00.000Z</published>
    <updated>2023-01-18T15:14:36.478Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/6385559_p0_master1200.jpg"></p><p>跟大神们学习做点小东西，然后发现他们都是 <code>Linux</code> 和 <code>macOS</code> ，写出来的python代码最初是没有考虑 <code>Windows</code> 的。自己跑起来还是有些问题，就打算在Windows下的子系统Ubuntu来运行。</p><p>PS：那句话真是不假，除了自己的破烂系统，微软做的 <code>Linux</code> 和 <code>macOS</code> 甚至手机上的相关软件和平台真是不错 😁</p><h1 id="安装-WSLg"><a href="#安装-WSLg" class="headerlink" title="安装 WSLg"></a>安装 WSLg</h1><p>这个过程挺简单，因为已经在商店安装过WSL了，因此只需要打开命令行，先检查一下是不是 <code>v2</code> 版本，不是就切换一下，然后升级。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">C:\WINDOWS\system32&gt;wsl -l -v</span><br><span class="line">  NAME      STATE           VERSION</span><br><span class="line">* Ubuntu    Running         1</span><br><span class="line">C:\WINDOWS\system32&gt;wsl --set-version Ubuntu 2</span><br><span class="line">C:\WINDOWS\system32&gt;wsl --update</span><br></pre></td></tr></table></figure><p>搞定。然后就是折腾 <code>Python</code> 版本的问题。</p><h1 id="升级-Python"><a href="#升级-Python" class="headerlink" title="升级 Python"></a>升级 Python</h1><p>首先，Python3.10 并不在 Ubuntu 20.04 的默认官方源中，需要添加源单独安装。</p><h2 id="添加源"><a href="#添加源" class="headerlink" title="添加源"></a>添加源</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">gsgundam@NUCHome:~$ sudo add-apt-repository ppa:deadsnakes/ppa</span><br><span class="line">gsgundam@NUCHome:~$ sudo apt update</span><br><span class="line">gsgundam@NUCHome:~$ apt list | grep python3.10</span><br><span class="line"></span><br><span class="line">WARNING: apt does not have a stable CLI interface. Use with caution <span class="keyword">in</span> scripts.</span><br><span class="line"></span><br><span class="line">idle-python3.10/focal 3.10.9-1+focal1 all</span><br><span class="line">libpython3.10-dbg/focal 3.10.9-1+focal1 amd64</span><br><span class="line">libpython3.10-dev/focal 3.10.9-1+focal1 amd64</span><br><span class="line">libpython3.10-minimal/focal,now 3.10.9-1+focal1 amd64 [installed,automatic]</span><br><span class="line">libpython3.10-stdlib/focal,now 3.10.9-1+focal1 amd64 [installed,automatic]</span><br><span class="line">libpython3.10-testsuite/focal 3.10.9-1+focal1 all</span><br><span class="line">libpython3.10/focal 3.10.9-1+focal1 amd64</span><br><span class="line">libqgispython3.10.4/focal 3.10.4+dfsg-1ubuntu2 amd64</span><br><span class="line">python3.10-dbg/focal 3.10.9-1+focal1 amd64</span><br><span class="line">python3.10-dev/focal 3.10.9-1+focal1 amd64</span><br><span class="line">python3.10-distutils/focal,now 3.10.9-1+focal1 all [installed]</span><br><span class="line">python3.10-examples/focal 3.10.9-1+focal1 all</span><br><span class="line">python3.10-full/focal 3.10.9-1+focal1 amd64</span><br><span class="line">python3.10-gdbm-dbg/focal 3.10.9-1+focal1 amd64</span><br><span class="line">python3.10-gdbm/focal 3.10.9-1+focal1 amd64</span><br><span class="line">python3.10-lib2to3/focal,now 3.10.9-1+focal1 all [installed,automatic]</span><br><span class="line">python3.10-minimal/focal,now 3.10.9-1+focal1 amd64 [installed,automatic]</span><br><span class="line">python3.10-tk-dbg/focal 3.10.9-1+focal1 amd64</span><br><span class="line">python3.10-tk/focal 3.10.9-1+focal1 amd64</span><br><span class="line">python3.10-venv/focal 3.10.9-1+focal1 amd64</span><br><span class="line">python3.10/focal,now 3.10.9-1+focal1 amd64 [installed]</span><br></pre></td></tr></table></figure><h2 id="安装-Python-3-10"><a href="#安装-Python-3-10" class="headerlink" title="安装 Python 3.10"></a>安装 Python 3.10</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install python3.10</span><br></pre></td></tr></table></figure><p>很简单的就安装完了 <code>Python 3.10</code> ，现在可以使用命令 <code>python3 --version</code> 打印版本，这个时候发现仍然是老版本。</p><h2 id="设置默认版本为-3-10"><a href="#设置默认版本为-3-10" class="headerlink" title="设置默认版本为 3.10"></a>设置默认版本为 3.10</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">gsgundam@NUCHome:~$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1</span><br><span class="line">update-alternatives: using /usr/bin/python3.8 to provide /usr/bin/python3 (python3) <span class="keyword">in</span> auto mode</span><br><span class="line">gsgundam@NUCHome:~$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 2</span><br><span class="line">update-alternatives: using /usr/bin/python3.10 to provide /usr/bin/python3 (python3) <span class="keyword">in</span> auto mode</span><br><span class="line">gsgundam@NUCHome:~$ sudo update-alternatives --config python3</span><br><span class="line">There are 2 choices <span class="keyword">for</span> the alternative python3 (providing /usr/bin/python3).</span><br><span class="line"></span><br><span class="line">  Selection    Path                 Priority   Status</span><br><span class="line">------------------------------------------------------------</span><br><span class="line">* 0            /usr/bin/python3.10   2         auto mode</span><br><span class="line">  1            /usr/bin/python3.10   2         manual mode</span><br><span class="line">  2            /usr/bin/python3.8    1         manual mode</span><br><span class="line"></span><br><span class="line">Press &lt;enter&gt; to keep the current choice[*], or <span class="built_in">type</span> selection number:</span><br></pre></td></tr></table></figure><p>这里将 3.10 作为可选版本加入了，并设置为了自动选择的版本。</p><h2 id="修复-pip-错误"><a href="#修复-pip-错误" class="headerlink" title="修复 pip 错误"></a>修复 pip 错误</h2><p>这个时候如果用 <code>pip</code> 命令来安装依赖，还是会报错。执行以下命令来修复：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">gsgundam@NUCHome:~$ sudo apt remove --purge python3-apt</span><br><span class="line">gsgundam@NUCHome:~$ sudo apt autoclean</span><br><span class="line">gsgundam@NUCHome:~$ sudo apt install python3-apt</span><br><span class="line">gsgundam@NUCHome:~$ sudo apt install python3.10-distutils</span><br><span class="line">gsgundam@NUCHome:~$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py</span><br><span class="line">gsgundam@NUCHome:~$ sudo python3.10 get-pip.py</span><br></pre></td></tr></table></figure><p>再跑 <code>pip install -r requirements.txt</code>，然后 <code>python3 main.py</code>，一切正常。收工。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/6385559_p0_master1200.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;跟大神们学习做点小东西，然后发现他们都是 &lt;code&gt;</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="windows" scheme="https://www.gsgundam.com/tags/windows/"/>
    
    <category term="ubuntu" scheme="https://www.gsgundam.com/tags/ubuntu/"/>
    
    <category term="wsl" scheme="https://www.gsgundam.com/tags/wsl/"/>
    
    <category term="3.1" scheme="https://www.gsgundam.com/tags/3-1/"/>
    
    <category term="wslg" scheme="https://www.gsgundam.com/tags/wslg/"/>
    
    <category term="子系统" scheme="https://www.gsgundam.com/tags/%E5%AD%90%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="linux" scheme="https://www.gsgundam.com/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>External Media without Import Wordpress外链图片插件汉化</title>
    <link href="https://www.gsgundam.com/2023/01/2023-01-12-z02-localize-external-media-without-import/"/>
    <id>https://www.gsgundam.com/2023/01/2023-01-12-z02-localize-external-media-without-import/</id>
    <published>2023-01-11T18:30:00.000Z</published>
    <updated>2023-01-11T19:45:57.437Z</updated>
    
    <content type="html"><![CDATA[<p>这个插件是我优化官网的时候发现的，简单好用，本着不重复造轮子的原则，就拿来主义了，顺手翻译了一下，也修复了一下在 <code>Wordpress</code> v6 版本下的样式问题。</p><h1 id="获取方式"><a href="#获取方式" class="headerlink" title="获取方式"></a>获取方式</h1><p>链接：<a href="https://pan.baidu.com/s/1rfZqL6QUx2VLjrJcfNzANw?pwd=tuy1">https://pan.baidu.com/s/1rfZqL6QUx2VLjrJcfNzANw?pwd=tuy1</a> </p><p>提取码：tuy1 </p><p><strong>注意</strong>：解压密码需要关注公众号以后，回复 <code>emwi2023</code> 获取。</p><p>这里可以直接关注公众号。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/qrcode_for_gh_461d384b1d56_258.jpg" alt="公众号"></p><h1 id="插件使用汉化"><a href="#插件使用汉化" class="headerlink" title="插件使用汉化"></a>插件使用汉化</h1><p>默认情况下，将图像添加到WordPress媒体库需要您将图像导入或上传到WordPress站点，这意味着站点中必须存储图像文件的副本。本插件允许您通过添加链接到远程图像地址的URL，将存储在外部站点中的图像添加到媒体库。通过这种方式，您可以将图像托管在除WordPress站点之外的服务器中，并且仍然可以通过各种仅从媒体库中获取图像的各类图像插件来显示它们。</p><p>该插件在“媒体”-&gt;“添加新媒体”页面、媒体上传面板和专用的“导入外链媒体”子菜单页面中提供按钮和输入框。因此，您可以在编辑任何文章或页面之前（或之后）添加外部媒体，也可以在编辑文章或页面的过程中添加外部媒体而不中断编辑过程（ <em>[GSGundam]：Wordpress V6会中断的，以后尝试修复</em> ）。</p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>1.将插件文件上传到 <code>/wp-content/plugins/external-media-without-import</code> 目录，或直接通过WordPress插件屏幕安装插件。</p><p>2.通过WordPress中的“插件”屏幕激活插件。</p><p>然后，您可以使用插件添加外部媒体而无需导入到本地。</p><h2 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h2><p>1.单击“媒体”-&gt;“媒体库”页面中的“新增文件”按钮，将显示媒体上传面板，其中有一个“导入外链媒体”按钮。单击它。</p><p>2.或单击侧栏中的“导入外链媒体”子菜单。</p><p>3.填写要添加的图像的URL链接。您可以填写多个URL，每个URL填写一行。</p><p>4.单击“添加”按钮，将添加远程图像。</p><p>单击媒体上传面板中的“导入外链媒体”按钮，将显示“从链接导入媒体”面板：</p><p><img src="https://pic.imgdb.cn/item/63bf0ff3be43e0d30ecfd311.png" alt="screenshot-1"></p><p>输入要添加到媒体库的外部媒体的URL，然后单击“添加”：</p><p><img src="https://pic.imgdb.cn/item/63bf0ff3be43e0d30ecfd31a.png" alt="screenshot-2"></p><p>您可以填写多个URL，每个URL填写一行：</p><p><img src="https://pic.imgdb.cn/item/63bf0ff3be43e0d30ecfd326.png" alt="screenshot-3"></p><p>您也可以在编辑文章或页面的过程中添加外部媒体，方法是单击“新增媒体”-&gt;“上传文件”，然后在上载面板中单击“导入外链媒体”。将出现相同的输入界面。</p><p>注意，WordPress需要提前知道图像的宽度和高度，以便在媒体库页面和任何帖子&#x2F;页面中正确显示图像。在大多数情况下，插件会自动解析这些属性。但在极少数情况下，插件可能无法获得您指定的图像的宽度和高度。在这种情况下，将显示一些输入字段，并允许您手动填写属性。</p><h2 id="更新日志"><a href="#更新日志" class="headerlink" title="更新日志"></a>更新日志</h2><p><strong>Version 1.1.2 - 2023.1.12</strong></p><p>[GSGundam]</p><p>汉化插件。</p><p>优化 在 WordPress 6 中的样式。</p><p><strong>Version 1.1.2 - 2018.12.2</strong></p><p>Fix: external images added in WooCommerce Product gallery disappear when clicking Publish&#x2F;Update.</p><p>Similar issue of other plugins may also by chance be fixed.</p><p>Detailed information of this issue:</p><p><a href="https://github.com/zzxiang/external-media-without-import/issues/10">https://github.com/zzxiang/external-media-without-import/issues/10</a><br><a href="https://wordpress.org/support/topic/product-gallery-image-not-working/">https://wordpress.org/support/topic/product-gallery-image-not-working/</a></p><p><strong>Version 1.1.1</strong></p><p>Debug warnings are fixed.</p><p><strong>Version 1.1</strong></p><p>Multiple URL links can be added in batch to the media library, with one URL per line in the text box.</p><p><strong>Version 1.0.2.1</strong></p><p>Just changed the readme file, the changelog in previous readme file seems not work.</p><p><strong>Version 1.0.2</strong></p><p>Fixed XSS Security Vulnerabilities and bug with mime types including ‘+’ such as ‘image&#x2F;svg+xml’.</p><p>Thank <a href="https://github.com/mvastola">Mike Vastola</a>.</p><p><a href="https://github.com/zzxiang/external-media-without-import/pull/3">Click to see detailed information of this bug</a>.</p><p><strong>Version 1.0.1</strong></p><p>Fixed a bug which causes HTTP 500 - internal server error.</p><p>The error occurs in previous version when the plugin fails to get the image size and MIME type. The HTTP 500 error causes the plugin message not correctly displayed in the media upload panel. It also causes the Add External Media without Import page broken.</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;这个插件是我优化官网的时候发现的，简单好用，本着不重复造轮子的原则，就拿来主义了，顺手翻译了一下，也修复了一下在 &lt;code&gt;Wordpress&lt;/code&gt; v6 版本下的样式问题。&lt;/p&gt;
&lt;h1 id=&quot;获取方式&quot;&gt;&lt;a href=&quot;#获取方式&quot; class=&quot;hea</summary>
      
    
    
    
    <category term="小插件" scheme="https://www.gsgundam.com/categories/%E5%B0%8F%E6%8F%92%E4%BB%B6/"/>
    
    
    <category term="图床" scheme="https://www.gsgundam.com/tags/%E5%9B%BE%E5%BA%8A/"/>
    
    <category term="wordpress" scheme="https://www.gsgundam.com/tags/wordpress/"/>
    
    <category term="插件" scheme="https://www.gsgundam.com/tags/%E6%8F%92%E4%BB%B6/"/>
    
    <category term="plugin" scheme="https://www.gsgundam.com/tags/plugin/"/>
    
    <category term="外链" scheme="https://www.gsgundam.com/tags/%E5%A4%96%E9%93%BE/"/>
    
    <category term="远程" scheme="https://www.gsgundam.com/tags/%E8%BF%9C%E7%A8%8B/"/>
    
    <category term="汉化" scheme="https://www.gsgundam.com/tags/%E6%B1%89%E5%8C%96/"/>
    
    <category term="免导入" scheme="https://www.gsgundam.com/tags/%E5%85%8D%E5%AF%BC%E5%85%A5/"/>
    
  </entry>
  
  <entry>
    <title>理解wordpress中的taxonomy category与term</title>
    <link href="https://www.gsgundam.com/2023/01/2023-01-10-z20-understanding-wordpress-taxonomy-term-category/"/>
    <id>https://www.gsgundam.com/2023/01/2023-01-10-z20-understanding-wordpress-taxonomy-term-category/</id>
    <published>2023-01-10T12:30:00.000Z</published>
    <updated>2023-01-11T05:29:42.610Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/gipsy_wp.png" alt="wordpress"></p><p>最近接触了很多PHP的东西，也学到了很多新的，就想着也利用热乎的知识优化一下基于 <code>Wordpress</code> 的极风游官网。</p><p>实际操作过程中，发现其实除了php的知识以外，wordpress也还是有很多自己的东西，而这些东西它不仅仅是一个概念，主要是深入到了主题及插件开发的方方面面。比如题目中的 <code>taxonomy</code>、<code>category</code> 和 <code>term</code>，就让我花了好些时间去理解。记录一下吧。</p><h1 id="分类法（Taxonomy）"><a href="#分类法（Taxonomy）" class="headerlink" title="分类法（Taxonomy）"></a>分类法（Taxonomy）</h1><p>作为分类法，必须和 <code>Category（分类）</code> 撇清关系。首先它用来对你的数据进行分类并且把他们分组到数据集或子集中。</p><p>简单理解，无论系统默认的 <code>Category</code>，还是 <code>Tag（标签）</code> ，都是一种分类法。</p><p>当然，我们还可以创建自定义分类法，例如 <em>工单</em> 和 <em>常见问题</em> ，这给文章提供了独立的分类方式。</p><h1 id="分类项（Term）"><a href="#分类项（Term）" class="headerlink" title="分类项（Term）"></a>分类项（Term）</h1><p><code>Term</code> 其实就是分类法的一个子集，它进一步细分了分类法。</p><p>接着分类法的例子，我们可能还会创建 <em>计费问题</em>、 <em>售后问题</em>、 <em>服务问题</em> 等作为 <em>工单</em> 的子类。</p><h1 id="分类（Category）"><a href="#分类（Category）" class="headerlink" title="分类（Category）"></a>分类（Category）</h1><p><code>Category</code> 是一个Wordpress系统内置分类法，与 <code>Tag</code> 相对应。前者是一个具有层级结构的分类法，而后者是非层级结构的。</p><p>那么，根据之前我们说的，这里新建分类，例如 <em>最新</em> 和 <em>精选</em>，实际上就是新建了2个 <code>Term</code>。</p><h1 id="进一步理解"><a href="#进一步理解" class="headerlink" title="进一步理解"></a>进一步理解</h1><p>来看图说话吧，下图是数据库设计。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230111012104.png" alt="wordpress数据表关系"></p><p>分类法和分类项相关内容存储于下面的数据表中：</p><ul><li>wp_terms – 所有分类项</li><li>wp_term_taxonomy – 分类项所属分类法</li><li>wp_term_relationships – 分类法所对应的具体对象（例如 category 对应 post）</li></ul><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>这些都理解了，那么诸如 <code>register_taxonomy</code> 、<code>get_terms</code> 之类的方法，也就知道什么时候使用了。</p><p>其实感觉wordpress还是一直在努力与时俱进的，虽然感觉为了向前兼容真的妥协了很多东西，但是总的来说，仍然不失为一个好用的CMS系统。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/gipsy_wp.png&quot; alt=&quot;wordpress&quot;&gt;&lt;/p&gt;
&lt;p&gt;最近接触了很多PHP的东西，也学到了很多新的，就</summary>
      
    
    
    
    <category term="项目开发" scheme="https://www.gsgundam.com/categories/%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="wordpress" scheme="https://www.gsgundam.com/tags/wordpress/"/>
    
    <category term="php" scheme="https://www.gsgundam.com/tags/php/"/>
    
    <category term="category" scheme="https://www.gsgundam.com/tags/category/"/>
    
    <category term="taxonomy" scheme="https://www.gsgundam.com/tags/taxonomy/"/>
    
    <category term="term" scheme="https://www.gsgundam.com/tags/term/"/>
    
    <category term="分类法" scheme="https://www.gsgundam.com/tags/%E5%88%86%E7%B1%BB%E6%B3%95/"/>
    
    <category term="分类项" scheme="https://www.gsgundam.com/tags/%E5%88%86%E7%B1%BB%E9%A1%B9/"/>
    
    <category term="标签" scheme="https://www.gsgundam.com/tags/%E6%A0%87%E7%AD%BE/"/>
    
  </entry>
  
  <entry>
    <title>热搜微信小程序审核通过啦</title>
    <link href="https://www.gsgundam.com/2023/01/2023-01-04-z13-hot-search-keyword-api-wechat-miniprogram/"/>
    <id>https://www.gsgundam.com/2023/01/2023-01-04-z13-hot-search-keyword-api-wechat-miniprogram/</id>
    <published>2023-01-04T05:30:00.000Z</published>
    <updated>2023-01-04T09:33:51.017Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ%E6%88%AA%E5%9B%BE20230104173237.png" alt="热搜小程序"></p><p>微信审核团队还是挺给力的，只要讲道理，还是很容易过审。</p><p>稍微完善了一下，增加 <code>BiliBili热门</code> 的结果展示。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ%E6%88%AA%E5%9B%BE20230104172850.png" alt="bilibili热门"></p><p>扫码即可体验：</p><p><img src="https://pic.imgdb.cn/item/63b509cbbe43e0d30ea1f960.jpg" alt="热门接口展示"></p><p>有什么需要完善和增加的，也请告诉我。我也会按自己的设想持续更新。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ%E6%88%AA%E5%9B%BE20230104173237.png&quot; alt=&quot;热搜小程序&quot;&gt;&lt;/p&gt;
&lt;p&gt;微信</summary>
      
    
    
    
    <category term="项目开发" scheme="https://www.gsgundam.com/categories/%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="热搜" scheme="https://www.gsgundam.com/tags/%E7%83%AD%E6%90%9C/"/>
    
    <category term="微信小程序" scheme="https://www.gsgundam.com/tags/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
    
    <category term="trending" scheme="https://www.gsgundam.com/tags/trending/"/>
    
    <category term="审核" scheme="https://www.gsgundam.com/tags/%E5%AE%A1%E6%A0%B8/"/>
    
    <category term="miniprogram" scheme="https://www.gsgundam.com/tags/miniprogram/"/>
    
    <category term="wechat" scheme="https://www.gsgundam.com/tags/wechat/"/>
    
    <category term="improve" scheme="https://www.gsgundam.com/tags/improve/"/>
    
  </entry>
  
  <entry>
    <title>命令行开启windows 10/11 高性能或卓越性能模式</title>
    <link href="https://www.gsgundam.com/2023/01/2023-01-03-z22-windows-powercfg-to-enable-high-performance/"/>
    <id>https://www.gsgundam.com/2023/01/2023-01-03-z22-windows-powercfg-to-enable-high-performance/</id>
    <published>2023-01-03T14:30:00.000Z</published>
    <updated>2023-01-04T09:19:58.178Z</updated>
    
    <content type="html"><![CDATA[<p>嗯，临时换工作设备真是问题很多，感觉苏菲婆5的性能大不如以前，看看电源模式，只有平衡。于是上网看看怎么开启高性能模式。</p><p>直入主题，网上的所有内容绝大多数都是抄来抄去，完全不去实践。记得一定要像我一样，在复制了一个电源计划以后，用 <code>powercfg /s</code> 去执行这个得到的 GUID 。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20230104132505.jpg" alt="卓越性能"></p><p>最好用管理员身份运行命令行或者 PowerShell ，以防出现权限问题。然后可以直接看到自己所有电源计划 GUID 的命令是 <code>powercfg -l</code>。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230104171336.png" alt="查看电源计划"></p><p>这样就可以参照你自己的 GUID 来运行了，如果 <code>powercfg /s [GUID]</code>不能生效的话，还有一个命令也可以的，<code>powercfg -SETACTIVE [GUID]</code>。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;嗯，临时换工作设备真是问题很多，感觉苏菲婆5的性能大不如以前，看看电源模式，只有平衡。于是上网看看怎么开启高性能模式。&lt;/p&gt;
&lt;p&gt;直入主题，网上的所有内容绝大多数都是抄来抄去，完全不去实践。记得一定要像我一样，在复制了一个电源计划以后，用 &lt;code&gt;powercfg </summary>
      
    
    
    
    <category term="小窍门" scheme="https://www.gsgundam.com/categories/%E5%B0%8F%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="windows" scheme="https://www.gsgundam.com/tags/windows/"/>
    
    <category term="windows11" scheme="https://www.gsgundam.com/tags/windows11/"/>
    
    <category term="windows10" scheme="https://www.gsgundam.com/tags/windows10/"/>
    
    <category term="win10" scheme="https://www.gsgundam.com/tags/win10/"/>
    
    <category term="win11" scheme="https://www.gsgundam.com/tags/win11/"/>
    
    <category term="电源计划" scheme="https://www.gsgundam.com/tags/%E7%94%B5%E6%BA%90%E8%AE%A1%E5%88%92/"/>
    
    <category term="高性能" scheme="https://www.gsgundam.com/tags/%E9%AB%98%E6%80%A7%E8%83%BD/"/>
    
    <category term="卓越性能" scheme="https://www.gsgundam.com/tags/%E5%8D%93%E8%B6%8A%E6%80%A7%E8%83%BD/"/>
    
    <category term="power cfg" scheme="https://www.gsgundam.com/tags/power-cfg/"/>
    
    <category term="surface pro" scheme="https://www.gsgundam.com/tags/surface-pro/"/>
    
  </entry>
  
  <entry>
    <title>修复Git提交代码时提示 detected dubious ownership in repository 的错误</title>
    <link href="https://www.gsgundam.com/2023/01/2023-01-03-z14-fix-git-detected-dubious-ownership-in-repository/"/>
    <id>https://www.gsgundam.com/2023/01/2023-01-03-z14-fix-git-detected-dubious-ownership-in-repository/</id>
    <published>2023-01-03T06:30:00.000Z</published>
    <updated>2023-01-04T09:16:59.975Z</updated>
    
    <content type="html"><![CDATA[<p>总跳闸，暂时不敢用PC了。换到苏菲婆5后，改代码提交遇到问题了：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ%E6%88%AA%E5%9B%BE20230104132846.png" alt="detected dubious ownership in repository"></p><p>其实提示已经非常明确了，发现可疑目录权限，使用下面的命令排除这个目录：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&gt; git config --global --add safe.directory C:\░░░░░░░░░░░</span><br></pre></td></tr></table></figure><p>执行了就好了，这个肯定是目录权限的问题，因为这台surface pro只有C盘，而且全部目录都属于管理员。</p><p>要以绝后患，还可以执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&gt; git config --global --add safe.directory <span class="string">&quot;*&quot;</span>;</span><br></pre></td></tr></table></figure><p>或者干脆在文件夹的属性里面，更改所有者，并应用到所有的子目录和文件。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;总跳闸，暂时不敢用PC了。换到苏菲婆5后，改代码提交遇到问题了：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ%E6%88%AA%E5%9B%BE20</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="git" scheme="https://www.gsgundam.com/tags/git/"/>
    
    <category term="提交" scheme="https://www.gsgundam.com/tags/%E6%8F%90%E4%BA%A4/"/>
    
    <category term="commit" scheme="https://www.gsgundam.com/tags/commit/"/>
    
    <category term="detected dubious ownership" scheme="https://www.gsgundam.com/tags/detected-dubious-ownership/"/>
    
    <category term="可疑目录权限" scheme="https://www.gsgundam.com/tags/%E5%8F%AF%E7%96%91%E7%9B%AE%E5%BD%95%E6%9D%83%E9%99%90/"/>
    
  </entry>
  
  <entry>
    <title>修复GitHub Action 存储上限错误 工作流命令和版本的弃用警告</title>
    <link href="https://www.gsgundam.com/2023/01/2023-01-02-z11-fix-github-action-storage-error-and-deprecation-warnings/"/>
    <id>https://www.gsgundam.com/2023/01/2023-01-02-z11-fix-github-action-storage-error-and-deprecation-warnings/</id>
    <published>2023-01-02T03:30:00.000Z</published>
    <updated>2023-01-02T05:23:53.710Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/100962820_p0.png"></p><p>凌晨更新了上一篇就睡了，早上起来才发现 <code>GitHub Action</code> 竟然运行失败了。</p><p>第一条就算了，存储满了，很明确。但是后面怎么出来几条别的警告？</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230102112229.png"></p><h1 id="Artifact-storage-quota-has-been-hit"><a href="#Artifact-storage-quota-has-been-hit" class="headerlink" title="Artifact storage quota has been hit"></a>Artifact storage quota has been hit</h1><p>这个提示再明确不过了，输出存储配额满了。</p><p>说来一开始我就觉得奇怪，因为在做 <code>GitLab</code> CI&#x2F;CD 配置的时候，其中就有关于这方面的过期配置，但是 <code>GitHub</code> 却没有。今天查了下，2020年10月14日的时候他们加上了（<a href="https://github.com/orgs/community/discussions/25458">https://github.com/orgs/community/discussions/25458</a>），所以只要我们在 <code>upload-artifact</code> 部分加上相关配置即可：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Upload</span> <span class="string">artifacts</span></span><br><span class="line"><span class="attr">uses:</span> <span class="string">actions/upload-artifact@v3</span></span><br><span class="line"><span class="attr">with:</span></span><br><span class="line"><span class="attr">name:</span> <span class="string">public</span></span><br><span class="line"><span class="attr">path:</span> <span class="string">public</span></span><br><span class="line"><span class="attr">retention-days:</span> <span class="number">3</span> <span class="comment"># &lt;= 这里可以设置保留天数</span></span><br></pre></td></tr></table></figure><p>当然，因为满了，所以还得把以前的全都删了 🙄 。搜索了下，市场里有一个第三方提供的相关操作（<a href="https://github.com/marketplace/actions/remove-artifacts">https://github.com/marketplace/actions/remove-artifacts</a>）：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Remove</span> <span class="string">old</span> <span class="string">artifacts</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">schedule:</span></span><br><span class="line">    <span class="comment"># Every day at 1am</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">cron:</span> <span class="string">&#x27;0 1 * * *&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">remove-old-artifacts:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">timeout-minutes:</span> <span class="number">10</span></span><br><span class="line"></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Remove</span> <span class="string">old</span> <span class="string">artifacts</span></span><br><span class="line">      <span class="attr">uses:</span> <span class="string">c-hive/gha-remove-artifacts@v1</span></span><br><span class="line">      <span class="attr">with:</span></span><br><span class="line">        <span class="attr">age:</span> <span class="string">&#x27;15 days&#x27;</span> <span class="comment"># &#x27;&lt;number&gt; &lt;unit&gt;&#x27;, e.g. 5 days, 2 years, 90 seconds, parsed by Moment.js</span></span><br><span class="line">        <span class="comment"># Optional inputs</span></span><br><span class="line">        <span class="comment"># skip-tags: true</span></span><br><span class="line">        <span class="comment"># skip-recent: 5</span></span><br></pre></td></tr></table></figure><p>此外，还可以在项目设置的 Action 中，找到 <code>Artifact and log retention</code> ，把存储保留的时间调整更短（目前我还没有找到手动删除日志的方法，知道的朋友可以分享一下）。</p><p>官方在 <code>upload-artifact</code> 的 issue 中也提到，清除了存储以后，可能计费系统还需要一点时间同步。所以等一等就好了。</p><h1 id="Node-js-12-actions-are-deprecated"><a href="#Node-js-12-actions-are-deprecated" class="headerlink" title="Node.js 12 actions are deprecated"></a>Node.js 12 actions are deprecated</h1><p>原来如此，由于我上次解决 <code>Node.js</code> 高版本报错时（参见《<a href="2021-10-29-hexo-nodejs14-accessing-non-existent-property-issue">解决Hexo在 Node.js 14 下出现的 Accessing non-existent property ‘xxx’ of module exports inside circular dependency 问题 </a>》），只修改了 GitLab 的 CI&#x2F;CD 持续集成配置，没有修改 GitHub 这边，所以还在用老版本安全稳当的跑着。</p><p>解决方案自然也简单，我修改为了 <code>16.16.0 LTS</code> 版本。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">container:</span> <span class="string">node:16.16.0</span></span><br></pre></td></tr></table></figure><h1 id="The-save-state-command-is-deprecated"><a href="#The-save-state-command-is-deprecated" class="headerlink" title="The save-state command is deprecated"></a>The <code>save-state</code> command is deprecated</h1><p>同时警告的还有图中 <code>set-output</code> 这个命令，但是我在 yml 文件里却并没有找到相关内容。那猜想大概就是用到的几个 action 内置操作了吧。</p><p>于是把 <code>checkout</code> 、 <code>cache</code> 、 <code>upload-artifact</code> 都从 @v2 改为了 @v3。</p><p>似乎一切正常了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/100962820_p0.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;凌晨更新了上一篇就睡了，早上起来才发现 &lt;code&gt;GitHub Act</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="修复" scheme="https://www.gsgundam.com/tags/%E4%BF%AE%E5%A4%8D/"/>
    
    <category term="github" scheme="https://www.gsgundam.com/tags/github/"/>
    
    <category term="action" scheme="https://www.gsgundam.com/tags/action/"/>
    
    <category term="nodejs" scheme="https://www.gsgundam.com/tags/nodejs/"/>
    
    <category term="工作流" scheme="https://www.gsgundam.com/tags/%E5%B7%A5%E4%BD%9C%E6%B5%81/"/>
    
    <category term="workflow" scheme="https://www.gsgundam.com/tags/workflow/"/>
    
    <category term="弃用" scheme="https://www.gsgundam.com/tags/%E5%BC%83%E7%94%A8/"/>
    
    <category term="警告" scheme="https://www.gsgundam.com/tags/%E8%AD%A6%E5%91%8A/"/>
    
    <category term="artifact" scheme="https://www.gsgundam.com/tags/artifact/"/>
    
    <category term="warning" scheme="https://www.gsgundam.com/tags/warning/"/>
    
    <category term="save-state" scheme="https://www.gsgundam.com/tags/save-state/"/>
    
    <category term="set-output" scheme="https://www.gsgundam.com/tags/set-output/"/>
    
  </entry>
  
  <entry>
    <title>开发一个简单的热搜微信小程序</title>
    <link href="https://www.gsgundam.com/2023/01/2023-01-02-z00-hot-search-keyword-of-trending-wechat-miniprogram/"/>
    <id>https://www.gsgundam.com/2023/01/2023-01-02-z00-hot-search-keyword-of-trending-wechat-miniprogram/</id>
    <published>2023-01-01T16:30:00.000Z</published>
    <updated>2023-01-02T03:09:54.657Z</updated>
    
    <content type="html"><![CDATA[<p>作为一个还算得上策划的策划，其实经常还是会有很多想法冒出来的，一部分会因为自己简单浅薄的可行性评估淘汰，另一部分则会被能力和精力所打败。</p><p>这不，昨天是新年的第一天，起床就在想新年是不是该有点什么新气象？新？要不就看看有什么新鲜事。</p><p><img src="https://pic.imgdb.cn/item/63b1f1372bbf0e799416444a.jpg"></p><p>好家伙，哪怕只想了解最核心的，也要去几个网站和App才行。那我自己能不能统一到一个地方看呢？要不就做个网站或者小程序吧。做饭的时候一边查资料一边整理思路。本来是打算用爬虫来实现的，这样数据也很可控。但是转念一想，如果有现成api岂不是更快？</p><p>结果还真能找到一些，虽然实际上离我的需求还有点距离，但不管怎样，先把东西做出来看有没有用，如果真的可用再快速迭代。</p><h1 id="选型"><a href="#选型" class="headerlink" title="选型"></a>选型</h1><p>这个阶段没花什么功夫，<code>UniApp</code> 直接就被选中，主要是可用的插件库很丰富，对 ‘node modules’ 的支持也是很不错的。</p><h1 id="插件"><a href="#插件" class="headerlink" title="插件"></a>插件</h1><p>选择依赖也没花太多时间。之前就在跟李嘉吐槽，有个项目在插件搭配上很糟心，总想着用一些看起来好像很酷炫的东西，但其实背后结构和设计思路一团糟。这次的ui库直接用 <code>uni-ui</code> ，网络库直接用 <code>axios</code>，确保最快最稳的开发出来。</p><p>PS：有个小插曲，直接 <code>npm install axios --save</code> 安装最新的版本是跟 uniapp 不兼容的，一定要用 <code>^0.27.2</code> 版本才行。</p><p>其他方面，布局方面用到了 <a href="https://github.com/SunSeekerX/uni-app-starter/tree/main/packages/limm-windi-css-uniapp">limm-windi-css-uniapp</a> ，图片懒加载用到了 <a href="https://ext.dcloud.net.cn/plugin?id=7157">zero-lazy-load</a>。还有一些日期、转换类的js小工具就用的自己以前建起来的私人类库。</p><h1 id="搭建"><a href="#搭建" class="headerlink" title="搭建"></a>搭建</h1><h2 id="网络"><a href="#网络" class="headerlink" title="网络"></a>网络</h2><p>先给 <code>axios</code> 安排上适配器和拦截器。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// utils/http.js</span></span><br><span class="line"><span class="keyword">import</span> <span class="title class_">Vue</span> <span class="keyword">from</span> <span class="string">&#x27;vue&#x27;</span></span><br><span class="line"><span class="keyword">import</span> axios <span class="keyword">from</span> <span class="string">&#x27;axios&#x27;</span></span><br><span class="line"></span><br><span class="line">axios.<span class="property">defaults</span>.<span class="property">adapter</span> = <span class="keyword">function</span>(<span class="params">config</span>) &#123;</span><br><span class="line">  <span class="comment">// ...</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> service = axios.<span class="title function_">create</span>(&#123;</span><br><span class="line"><span class="comment">// ...</span></span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line">service.<span class="property">interceptors</span>.<span class="property">request</span>.<span class="title function_">use</span>(</span><br><span class="line">    <span class="function"><span class="params">config</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="comment">// ...</span></span><br><span class="line">        <span class="keyword">return</span> config;</span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="function"><span class="params">error</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="comment">// ...</span></span><br><span class="line">        <span class="keyword">return</span> <span class="title class_">Promise</span>.<span class="title function_">reject</span>(error);</span><br><span class="line">    &#125;</span><br><span class="line">); </span><br><span class="line"></span><br><span class="line">service.<span class="property">interceptors</span>.<span class="property">response</span>.<span class="title function_">use</span>(<span class="function"><span class="params">res</span> =&gt;</span> &#123;</span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">    <span class="keyword">return</span> res.<span class="property">data</span>;</span><br><span class="line">&#125;, <span class="function"><span class="params">error</span> =&gt;</span> &#123;</span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">    <span class="keyword">return</span> <span class="title class_">Promise</span>.<span class="title function_">reject</span>(error);</span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> service</span><br></pre></td></tr></table></figure><p>然后再统一管理API：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// utils/api.js</span></span><br><span class="line"><span class="keyword">import</span> service <span class="keyword">from</span> <span class="string">&#x27;./http.js&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">function</span> <span class="title function_">baiduTrendApi</span>(<span class="params">data</span>) &#123;</span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="状态管理"><a href="#状态管理" class="headerlink" title="状态管理"></a>状态管理</h2><p>毕竟是免费api，一方面要考虑高频请求被ban的情况，另一方面也想要避免滥用所带来的问题（我自己很热衷于开放各种免费服务，深知滥用的烦恼），所以需要结合 <code>vuex</code> 和 <code>storage</code> 来解决数据缓存。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// store/index.js</span></span><br><span class="line"><span class="keyword">import</span> <span class="title class_">Vue</span> <span class="keyword">from</span> <span class="string">&#x27;vue&#x27;</span></span><br><span class="line"><span class="keyword">import</span> <span class="title class_">Vuex</span> <span class="keyword">from</span> <span class="string">&#x27;vuex&#x27;</span></span><br><span class="line"><span class="title class_">Vue</span>.<span class="title function_">use</span>(<span class="title class_">Vuex</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> cacheNameList = [<span class="string">&quot;baiduTrend&quot;</span>, <span class="string">&quot;...&quot;</span>];</span><br><span class="line"><span class="keyword">const</span> cacheTime = <span class="number">3</span> * <span class="number">60</span> * <span class="number">60</span> * <span class="number">1000</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> store = <span class="keyword">new</span> <span class="title class_">Vuex</span>.<span class="title class_">Store</span>(&#123;</span><br><span class="line"><span class="attr">state</span>: &#123;</span><br><span class="line"><span class="attr">baiduTrend</span>: <span class="literal">null</span>, <span class="comment">// &#123;content, time&#125;</span></span><br><span class="line">&#125;,</span><br><span class="line">  <span class="attr">mutations</span>: &#123;</span><br><span class="line"><span class="title function_">setHotData</span>(<span class="params">state, data</span>) &#123;</span><br><span class="line"><span class="keyword">if</span> (data) &#123;</span><br><span class="line"><span class="keyword">if</span>(data.<span class="property">content</span> &amp;&amp; <span class="keyword">typeof</span> data.<span class="property">content</span> == <span class="string">&#x27;string&#x27;</span>)&#123;</span><br><span class="line">data.<span class="property">content</span> = tools.<span class="title function_">toHttps</span>(data.<span class="property">content</span>);</span><br><span class="line">          data.<span class="property">content</span> = tools.<span class="title function_">fixObjStr</span>(data.<span class="property">content</span>);</span><br><span class="line">data.<span class="property">content</span> = <span class="built_in">decodeURIComponent</span>(data.<span class="property">content</span>);</span><br><span class="line">data.<span class="property">content</span> = <span class="title class_">JSON</span>.<span class="title function_">parse</span>(data.<span class="property">content</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(data.<span class="property">type</span> == <span class="string">&#x27;baidu&#x27;</span>)&#123;</span><br><span class="line">state.<span class="property">baiduTrend</span> = &#123;<span class="attr">content</span>:data.<span class="property">content</span>, <span class="attr">time</span>:<span class="keyword">new</span> <span class="title class_">Date</span>().<span class="title function_">getTime</span>()&#125;;</span><br><span class="line">uni.<span class="title function_">setStorageSync</span>(<span class="string">&#x27;baiduTrend&#x27;</span>, state.<span class="property">baiduTrend</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;,</span><br><span class="line"><span class="title function_">getHotData</span>(<span class="params">state</span>)&#123;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">let</span> name <span class="keyword">of</span> cacheNameList) &#123;</span><br><span class="line"><span class="keyword">let</span> data = uni.<span class="title function_">getStorageSync</span>(name);</span><br><span class="line"><span class="keyword">if</span> (data) &#123;</span><br><span class="line"><span class="keyword">let</span> time = data.<span class="property">time</span>;</span><br><span class="line">time = time || <span class="number">0</span>;</span><br><span class="line"><span class="keyword">let</span> current = <span class="keyword">new</span> <span class="title class_">Date</span>().<span class="title function_">getTime</span>();</span><br><span class="line"><span class="keyword">if</span>(current - time &lt; cacheTime) <span class="keyword">return</span>;</span><br><span class="line">state[name] = data;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;,</span><br><span class="line">&#125;,</span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> store</span><br></pre></td></tr></table></figure><h2 id="界面"><a href="#界面" class="headerlink" title="界面"></a>界面</h2><p>咱们主要是搞功能，先把东西呈现出来就行了，不搞复杂。</p><p>除了图片外，都是 <code>uni-ui</code> 的组件，简单但是高效，好像没什么好讲的。直接上图吧</p><p><img src="https://pic.imgdb.cn/item/63b1eb4f2bbf0e7994128b17.jpg" alt="程序界面"></p><p>其实我自己看起来是很难受的，因为好歹也是学过平面设计和网页设计的人。但是为了效率和进度，必须忍住 😂</p><h1 id="发布"><a href="#发布" class="headerlink" title="发布"></a>发布</h1><p>结果没想到最花时间的是这一步。我以为个人小程序只是不许发布自己加工的信息而已，没想到这种公共接口提供的信息也没法审过。</p><p>来回折腾了2次，加上要等审核，时间直接从1月1日来到了1月2日。最后果断放弃个人小程序这条路，直接换公司以前废弃的小程序号来审核试试吧。</p><h1 id="思考"><a href="#思考" class="headerlink" title="思考"></a>思考</h1><p>其实一开始并没有想到这个东西会有什么大用。但是在快要做完的时候，突然发现这不就是之前学运营课的时候常说要参考的互联网热点吗？ 😲 如果真的有用就太好了。个人是特别喜欢做实用的东西。</p><p>希望小程序能早点审过，到时候大家帮忙测一测，也看看还可以怎样扩展用途。我也会抽空继续完善。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;作为一个还算得上策划的策划，其实经常还是会有很多想法冒出来的，一部分会因为自己简单浅薄的可行性评估淘汰，另一部分则会被能力和精力所打败。&lt;/p&gt;
&lt;p&gt;这不，昨天是新年的第一天，起床就在想新年是不是该有点什么新气象？新？要不就看看有什么新鲜事。&lt;/p&gt;
&lt;p&gt;&lt;img sr</summary>
      
    
    
    
    <category term="项目开发" scheme="https://www.gsgundam.com/categories/%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="微信" scheme="https://www.gsgundam.com/tags/%E5%BE%AE%E4%BF%A1/"/>
    
    <category term="百度" scheme="https://www.gsgundam.com/tags/%E7%99%BE%E5%BA%A6/"/>
    
    <category term="热搜" scheme="https://www.gsgundam.com/tags/%E7%83%AD%E6%90%9C/"/>
    
    <category term="微信小程序" scheme="https://www.gsgundam.com/tags/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
    
    <category term="爱奇艺" scheme="https://www.gsgundam.com/tags/%E7%88%B1%E5%A5%87%E8%89%BA/"/>
    
    <category term="抖音" scheme="https://www.gsgundam.com/tags/%E6%8A%96%E9%9F%B3/"/>
    
    <category term="搜狗" scheme="https://www.gsgundam.com/tags/%E6%90%9C%E7%8B%97/"/>
    
    <category term="trending" scheme="https://www.gsgundam.com/tags/trending/"/>
    
    <category term="趋势" scheme="https://www.gsgundam.com/tags/%E8%B6%8B%E5%8A%BF/"/>
    
    <category term="舆情" scheme="https://www.gsgundam.com/tags/%E8%88%86%E6%83%85/"/>
    
  </entry>
  
  <entry>
    <title>NumPy 图解入门</title>
    <link href="https://www.gsgundam.com/2022/2022-12-31-z14-introduction-of-python-numpy/"/>
    <id>https://www.gsgundam.com/2022/2022-12-31-z14-introduction-of-python-numpy/</id>
    <published>2022-12-31T06:30:00.000Z</published>
    <updated>2022-12-31T18:08:34.441Z</updated>
    
    <content type="html"><![CDATA[<p>最近真是很忙，python的学习都搁置了好久了，<code>NumPy</code> 和 <code>Pandas</code> 一直都在入门过程中。总不能一直这样，赶紧抽时间往前推进，也记录一下笔记。</p><p>整理学习内容是巩固和结构化存储知识的一个非常有用的办法。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/81hbevmloxz31.png" alt="PYTHON"></p><p>PS：文中大量借用了 <a href="https://jalammar.github.io/visual-numpy/">《A Visual Intro to NumPy and Data Representation》</a> 的图片。这是一篇很好的直观入门教程。但是相信我，最好不要看国内网上到处机翻的这篇文章，<strong>要么看原文，要么另找国内大神的教程！切记！！</strong></p><h1 id="了解-NumPy"><a href="#了解-NumPy" class="headerlink" title="了解 NumPy"></a>了解 NumPy</h1><p>NumPy是Python中科学计算的基础包。它是一个Python库，提供多维数组对象，各种派生对象（如掩码数组和矩阵），以及用于数组快速操作的各种API，有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数，基本统计运算和随机模拟等等。</p><p>NumPy包的核心是 <code>ndarray</code> 对象。它封装了python原生的同数据类型的 n 维数组，为了保证其性能优良，其中有许多操作都是代码在本地进行编译后执行的。</p><p>这里有个习惯，那就是引入 <code>NumPy</code> 所实用的别称：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br></pre></td></tr></table></figure><h1 id="数组"><a href="#数组" class="headerlink" title="数组"></a>数组</h1><p>刚才就提到了，数组就是 <code>NumPy</code> 的核心了。使用NumPy提供的这些数组，我们就可以以闪电般的速度执行各种有用的操作。</p><h2 id="创建数组"><a href="#创建数组" class="headerlink" title="创建数组"></a>创建数组</h2><p>我们可以通过传递一个 python 列表并使用 <code>np.array()</code> 来创建 NumPy 数组。下面的图片就是简单的示例。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221231222433.png" alt="创建数组"></p><p>在实际应用中，可能经常会需要初始化数组元素的值，NumPy 很贴心的提供了 <code>ones()</code>、<code>zeros()</code>、<code>random.random()</code> 等方法。这样，我们就只需要传递需要的元素数量即可：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221231222826.png" alt="初始化值"></p><h2 id="数组运算"><a href="#数组运算" class="headerlink" title="数组运算"></a>数组运算</h2><p>我们使用到 NumPy 了，那就肯定不只是保存数据这么简单，我们需要对数组进行计算。</p><p>这里我们来定义两个数组 <code>data = np.array([1,2])</code> 和 <code>ones = op.ones(2)</code> ，然后按元素位置相加，直接输入 <code>data + ones</code> 即可：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221231225905.png" alt="数组相加"></p><p>同理，不只是加法，减、乘、除都是没有问题，甚至可以像下面 <code>data * 1.6</code> 一样直接很方便的统一运算：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221231230307.png" alt="广播机制"></p><h2 id="广播机制"><a href="#广播机制" class="headerlink" title="广播机制"></a>广播机制</h2><p>这里引入了 NumPy 的 <code>广播机制</code>，上面的例子中，标量 <code>1.6</code> 被拉伸为张量 <code>[1,2]</code> 的相同尺寸(2,)的向量。标量被拉伸以后的张量尺寸与待运算值完全适配，传递到空缺位进行计算。这个规则在某些地方被称为 <code>“低维有1”</code>，即 数组维度相同，其中有个轴为1 。</p><p><strong>但其实个人觉得没有必要这么去理解！</strong></p><p>我们可以简单的解释为：广播主要发生在两种情况，一种是两个数组的维数不相等，但是它们的后缘维度的轴长相符，另外一种是有一方的长度为1。再简化一点，<strong>两个数组在任意轴上长度或维度（或长度+维度）相等，则可以触发广播。</strong></p><p>后面的部分我们再去详细分析。</p><h2 id="索引与聚合"><a href="#索引与聚合" class="headerlink" title="索引与聚合"></a>索引与聚合</h2><p>NumPy 的索引应该说非常灵活了，直接上图，非常清晰：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221231231909.png" alt="索引"></p><p>常见的聚合操作 <code>sum</code>、<code>min</code>、<code>max</code> 可以从下图看到运算方式：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221231232216.png" alt="聚合"></p><p>当然，NumPy 还支持以下聚合操作：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">np.prod(big_array)   <span class="comment"># 求数组中所有元素的乘积</span></span><br><span class="line">np.mean(big_array)   <span class="comment"># 求数组中所有元素的平均值</span></span><br><span class="line">np.median(big_array) <span class="comment"># 求数组中所有元素的中位数</span></span><br><span class="line">np.var(big_array)    <span class="comment"># 求数组中所有元素的方差</span></span><br><span class="line">np.std(big_array)    <span class="comment"># 求数组中所有元素的标准差</span></span><br></pre></td></tr></table></figure><h1 id="矩阵"><a href="#矩阵" class="headerlink" title="矩阵"></a>矩阵</h1><p>之前一直是从一维数组的角度来初步理解 NumPy 的使用方式，但实际上从二维数组（矩阵）开始，才算是真正有 NumPy 的用武之地。</p><h2 id="创建矩阵"><a href="#创建矩阵" class="headerlink" title="创建矩阵"></a>创建矩阵</h2><p>我们可以使用 <code>np.array([[1,2],[3,4]])</code> 的方式来创建一个矩阵，也可以使用上个部分提到的 <code>ones()</code>、<code>zeros()</code> 和 <code>random.random()</code> 方法来创建：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221231232618.png"></p><h2 id="矩阵运算"><a href="#矩阵运算" class="headerlink" title="矩阵运算"></a>矩阵运算</h2><p>如果矩阵尺寸完全一致，那么用算数运算符 加减乘除 来处理自然是不在话下。</p><p>但是如果对不同大小的矩阵执行的话，就需要 <code>广播机制</code> 了，比如下面的例子：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221231234809.png" alt="矩阵广播"></p><p>这里我们正好可以再深入理解 <code>广播机制</code> 。这里的 <code>ones_row</code> 是二维数组，但是每个维度只有1个元素，那么我们可以理解为： <strong><code>data</code> 和 <code>ones_row</code> 两个数组在维度上相等，可以触发广播。</strong></p><h2 id="点乘"><a href="#点乘" class="headerlink" title="点乘"></a>点乘</h2><p>虽然在这里提点乘方法 <code>dot()</code> ，但是不代表他必须由矩阵使用。在直接上例子说明更好理解：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221231235416.png" alt="点乘"></p><p>细心观察，图里特意标红了 <code>3</code> ，因为该图的作者在强调两个矩阵的临近边必须有相同数量的维度。</p><p>简单解析一下点乘的规则。如果我们计算 <code>np.dot(A, B)</code>，A为二维<code>m*n</code>的矩阵，B必须为<code>n*l</code>的矩阵，也就是说A有多少列，B就必须有多少行，否则无法运算。下面的图可以简单说明原理：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230101000620.png" alt="点乘运算"></p><p>也就是说，可以把开始的那个点乘例子理解为：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230101004438.png" alt="点乘"></p><h2 id="矩阵索引与聚合"><a href="#矩阵索引与聚合" class="headerlink" title="矩阵索引与聚合"></a>矩阵索引与聚合</h2><p>矩阵的索引使得我们对数据的操作更加得心应手：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230101004556.png" alt="矩阵索引"></p><p>至于聚合，除了之前一维数组提到的基本操作外，我们还可以给出 <code>axis</code> 参数来指定行间、列间的聚合。例如：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230101004753.png" alt="矩阵聚合"></p><h2 id="矩阵旋转与重塑"><a href="#矩阵旋转与重塑" class="headerlink" title="矩阵旋转与重塑"></a>矩阵旋转与重塑</h2><p>又是两个超实用的方法。首先是旋转矩阵，例如需要对两个矩阵执行点乘运算并对齐它们共享的维度时，我们就可以用方法 <code>T</code> 来执行：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230101005000.png" alt="矩阵旋转"></p><p>在某些情况下，我们得到的数据（例如问卷采集、爬虫等）并不符合计算模型的要求，这是我们就可以用 <code>reshape()</code> 来重塑这些数据集：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230101005156.png" alt="重塑"></p><h1 id="N维数组"><a href="#N维数组" class="headerlink" title="N维数组"></a>N维数组</h1><p>好了，现在可以回到我们一开始提到的 <code>ndarray</code> 对象了， <em>n dimension array</em> ，N维数组。</p><h2 id="创建三维数组"><a href="#创建三维数组" class="headerlink" title="创建三维数组"></a>创建三维数组</h2><p>在 NumPy 中，多加一个维度有时只是多加一个参数的事儿：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230101005604.png"></p><h2 id="三维数组运算"><a href="#三维数组运算" class="headerlink" title="三维数组运算"></a>三维数组运算</h2><p>其他基础运算无需多提，只是在这里可以特别把三维数组的 <code>广播机制</code> 拿出来强调一下，这样可以加深我们对它的理解。</p><p>我们来看这个情况：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230101005755.png"></p><p>这个情况里，<code>(3,4,2)</code> 和 <code>(4,2)</code> 的维度是不相同的，前者为3维，后者为2维。但是它们后缘维度的<strong>轴长</strong>相同，都为 <code>(4,2)</code> ，所以可以沿着0轴进行广播。</p><p>再想象一下其他情况，例如 <code>(4,2,3)</code> 和 <code>(2,3)</code> 是可以计算的，甚至 <code>(4,2,3)</code> 和 <code>(3)</code> 也是可以计算的。只是后者需要在同时两个轴上面进行扩展。</p><h1 id="公式"><a href="#公式" class="headerlink" title="公式"></a>公式</h1><p>这个部分我还没有学习太多，但是有个初步了解。例如我们可以看到，均方差公式：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230101010349.png" alt="均方差公式"></p><p>是如何在 NumPy 中实现的：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230101010423.png" alt="NumPy公式"></p><p>精彩的就是，NumPy毫不关心 <code>predictions</code> 和 <code>labels</code> 分别有多少个值，只要他们长度对齐，就一定会得出结果。</p><p>顺带说下，均方差公式是监督机器学习模型处理回归问题的核心。</p><h1 id="数据表达"><a href="#数据表达" class="headerlink" title="数据表达"></a>数据表达</h1><p>其实通过抽象思维，很多现实中的资料、现象都可以数据化，从而进行处理、构建模型。在 NumPy 的学习更深入以后，我会继续学习的 Pandas 也是基于 NumPy 构建的。</p><h2 id="表格"><a href="#表格" class="headerlink" title="表格"></a>表格</h2><p>表格应该是最好理解的了，因为通常它就是1个或多个二维数组。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230101011244.png" alt="表格"></p><h2 id="音频"><a href="#音频" class="headerlink" title="音频"></a>音频</h2><p>一条音轨可以视为一维数组，每个数字代表音频信号的一部分。例如CD 质量的音频每秒包含 44,100 个样本，每个样本是-65535 到 65536 之间的整数，想要提取音频的第一秒，只需将文件加载到 audio 的 NumPy 数组中，然后获取 <code>audio[:44100]</code>。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230101011433.png" alt="音频"></p><h2 id="图像"><a href="#图像" class="headerlink" title="图像"></a>图像</h2><p>图像也是经典的像素矩阵。如果图像是灰度，则每个像素可以使用单个数字表示 0-255 的灰度值，整张图就可以使用二维数组来表达：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230101011644.png" alt="黑白图像"></p><p>如果是彩色图像，那每个像素就需要三个值RGB（如果不考虑透明度的话），那整张图就需要一个三维数组来表达：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230101011803.png" alt="彩色图像"></p><h2 id="语言"><a href="#语言" class="headerlink" title="语言"></a>语言</h2><p>这部分挺有意思，虽然我还没有办法实践，但是也花了相当多实践去理解它是如何实现和表达的。</p><p>这里有个关键概念 <code>词嵌入(embeddings)</code> 。它是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中，每个单词或词组被映射为实数域上的向量。</p><p>其实最后的数据图相对更难理解，但是我相信通过下图，反而会很好理解：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230101013251.png" alt="词嵌入"></p><p>上图是问卷对于一个人的特征进行表达（参见 <a href="https://jalammar.github.io/illustrated-word2vec/">《The Illustrated Word2vec》</a> ）。如果能从上图得到一些启发，那么回到我们说的更直观的语言，或者说文学，我们就可以更好的理解了。</p><p>首先我们将一段英文按单词拆分为词汇表，然后使用 <code>词汇向量化</code> 转化为 <code>嵌入值</code>（原文是50维词汇向量化）。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20230101014826.png"></p><p>这样，就得到了一个基于 <code>词嵌入维度 * 序列长度</code> 的数据表达。别看第一眼觉得好像很抽象，实际上我们平时一致在使用的输入法、智能音箱等等，都在使用相应的自然语言处理相关内容。</p><h1 id="体会"><a href="#体会" class="headerlink" title="体会"></a>体会</h1><p>emmm…确实没想到只是入个门而已，最后查了无数资料，学了这么久 🤔</p><p>多查资料多实践，时刻提醒自己不要妄想妄言。</p><p>路还很长，学无止境。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近真是很忙，python的学习都搁置了好久了，&lt;code&gt;NumPy&lt;/code&gt; 和 &lt;code&gt;Pandas&lt;/code&gt; 一直都在入门过程中。总不能一直这样，赶紧抽时间往前推进，也记录一下笔记。&lt;/p&gt;
&lt;p&gt;整理学习内容是巩固和结构化存储知识的一个非常有用的办法。</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="模块导入" scheme="https://www.gsgundam.com/tags/%E6%A8%A1%E5%9D%97%E5%AF%BC%E5%85%A5/"/>
    
    <category term="模块定义" scheme="https://www.gsgundam.com/tags/%E6%A8%A1%E5%9D%97%E5%AE%9A%E4%B9%89/"/>
    
    <category term="numpy" scheme="https://www.gsgundam.com/tags/numpy/"/>
    
    <category term="data" scheme="https://www.gsgundam.com/tags/data/"/>
    
    <category term="图解" scheme="https://www.gsgundam.com/tags/%E5%9B%BE%E8%A7%A3/"/>
    
    <category term="数据" scheme="https://www.gsgundam.com/tags/%E6%95%B0%E6%8D%AE/"/>
    
    <category term="pandas" scheme="https://www.gsgundam.com/tags/pandas/"/>
    
    <category term="词嵌入" scheme="https://www.gsgundam.com/tags/%E8%AF%8D%E5%B5%8C%E5%85%A5/"/>
    
    <category term="embedding" scheme="https://www.gsgundam.com/tags/embedding/"/>
    
  </entry>
  
  <entry>
    <title>简单理解 CJS AMD UMD ESM</title>
    <link href="https://www.gsgundam.com/2022/2022-12-30-z00-understanding-of-cjs-amd-umd-esm/"/>
    <id>https://www.gsgundam.com/2022/2022-12-30-z00-understanding-of-cjs-amd-umd-esm/</id>
    <published>2022-12-29T16:30:00.000Z</published>
    <updated>2022-12-31T18:01:54.557Z</updated>
    
    <content type="html"><![CDATA[<p>好久没有做过传统网页开发了，这次帮朋友处理的时候用了很多经典插件。在用到 <code>popper</code> 的时候，发现引用地址里分成了 <code>esm</code>、 <code>cjs</code>、 <code>umd</code> 三个路径，我这种半路出家的猿🐒只熟悉 <code>amd</code> 异步模块定义，都不知道这三个是什么。直觉告诉我这里面既然出现了跟 <code>amd</code> 这么相似的 <code>umd</code>，那么跟模块化多少有点关系。赶紧搜索了解学习一下。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/92929948_p0_master1200.jpg" alt="PROGRAMING"></p><p>学习过程发现最直观的还是看代码。其实几个模式我都用过，只是不知道叫什么，但是只需要看一眼代码，立刻就能找到对应的技术路径分支。</p><h1 id="ESM-（ES-Module：异步导入）"><a href="#ESM-（ES-Module：异步导入）" class="headerlink" title="ESM （ES Module：异步导入）"></a>ESM （ES Module：异步导入）</h1><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123;foo, bar&#125; <span class="keyword">from</span> <span class="string">&#x27;./myLib&#x27;</span>;</span><br><span class="line">...</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="keyword">function</span>（） &#123;...&#125;;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> function1（） &#123;...&#125;;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> function2（） &#123;...&#125;;</span><br></pre></td></tr></table></figure><p>对我来说这个形式非常熟悉，因为近几年大量开发 <code>vue</code>、<code>混合app</code> 和 <code>小程序</code>。</p><p>个人简单理解：</p><p>1、ES 模块是 Javascript 提出的实现一个标准模块系统的方案。</p><p>2、具有 <code>CJS</code> 的简单语法和 <code>AMD</code> 的异步。</p><p>3、ESM 允许打包器删除不必要的代码，减少代码包可以获得更快的加载。</p><p>4、得益于 ES6 的静态模块结构，可以进行 <code>Tree Shaking</code> （例如根据rollup阶段做的标记，进行代码收集，最后生成真正用到的代码，对优化非常友好）。</p><h1 id="CJS-（CommonJS：同步导入模块）"><a href="#CJS-（CommonJS：同步导入模块）" class="headerlink" title="CJS （CommonJS：同步导入模块）"></a>CJS （CommonJS：同步导入模块）</h1><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> doSomething = <span class="built_in">require</span>(<span class="string">&#x27;./doSomething.js&#x27;</span>); </span><br><span class="line"></span><br><span class="line"><span class="variable language_">module</span>.<span class="property">exports</span> = <span class="keyword">function</span> <span class="title function_">doSomething</span>(<span class="params">n</span>) &#123;...&#125;</span><br></pre></td></tr></table></figure><p>显然，我们熟知的 <code>NodeJS</code> 就是使用的 <code>CJS</code> 模式。</p><p>个人简单理解：</p><p>1、<code>CJS</code> 不能在浏览器中工作。它必须经过转换和打包。</p><p>2、在 <code>CJS</code> 中每一个 js 文件都是一个单独的模块。</p><p>3、<code>CJS</code> 规范加载模块是同步的，只有加载完成，才能执行后面的操作。</p><p>4、所有代码都运行在模块作用域，不会污染全局作用域。</p><p>5、模块可以多次加载，但是只会在第一次加载时运行一次，然后运行结果就被缓存了，以后再加载，就直接读取缓存结果。要想让模块再次运行，必须清除缓存。</p><h1 id="AMD-（Asynchronous-Module-Definition：异步模块定义）"><a href="#AMD-（Asynchronous-Module-Definition：异步模块定义）" class="headerlink" title="AMD （Asynchronous Module Definition：异步模块定义）"></a>AMD （Asynchronous Module Definition：异步模块定义）</h1><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_">define</span>([<span class="string">&#x27;dep1&#x27;</span>, <span class="string">&#x27;dep2&#x27;</span>], <span class="keyword">function</span> (<span class="params">dep1, dep2</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">function</span> (<span class="params"></span>) &#123;&#125;;</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>可能新时代的 Javascripter 不是很熟悉这个模式了，但是作为老人来说，应该是再熟悉不过了，在那个 <code>ESM</code> 还空缺的状态，<code>AMD</code> 简直就是这个领域的救星，例如经典的 <code>RequireJS</code>。</p><p>个人简单理解：</p><p>1、<code>AMD</code> 允许异步加载模块，并且在加载完成后执行模块的代码。</p><p>2、<code>AMD</code> 可以按需加载模块，并且在加载模块时并行执行其他任务，从而提升应用的性能。</p><p>3、实现js文件的异步加载，避免网页失去响应；管理模块之间的依赖性，便于代码的编写和维护。</p><p>4、<code>AMD</code> 主要作为前端应用，现在已经较少使用。</p><h1 id="UMD（Universal-Module-Definition：通用模块定义）"><a href="#UMD（Universal-Module-Definition：通用模块定义）" class="headerlink" title="UMD（Universal Module Definition：通用模块定义）"></a>UMD（Universal Module Definition：通用模块定义）</h1><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">(<span class="keyword">function</span> (<span class="params">root, factory</span>) &#123;    </span><br><span class="line">  <span class="comment">// AMD</span></span><br><span class="line">  <span class="keyword">if</span> (<span class="keyword">typeof</span> define === <span class="string">&#x27;function&#x27;</span> &amp;&amp; define.<span class="property">amd</span>) &#123; </span><br><span class="line">      <span class="title function_">define</span>([<span class="string">&#x27;jquery&#x27;</span>, <span class="string">&#x27;underscore&#x27;</span>], factory);</span><br><span class="line">  &#125; </span><br><span class="line">  <span class="comment">// CJS</span></span><br><span class="line">  <span class="keyword">else</span> <span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="built_in">exports</span> === <span class="string">&#x27;object&#x27;</span>) &#123; </span><br><span class="line">      <span class="variable language_">module</span>.<span class="property">exports</span> = <span class="title function_">factory</span>(<span class="built_in">require</span>(<span class="string">&#x27;jquery&#x27;</span>), <span class="built_in">require</span>(<span class="string">&#x27;underscore&#x27;</span>));</span><br><span class="line">  &#125; </span><br><span class="line">  <span class="comment">// 浏览器全局变量(root 即 window)</span></span><br><span class="line">  <span class="keyword">else</span> &#123;                </span><br><span class="line">      root.<span class="property">returnExports</span> = <span class="title function_">factory</span>(root.<span class="property">jQuery</span>, root.<span class="property">_</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;(<span class="variable language_">this</span>, <span class="keyword">function</span> (<span class="params">$, _</span>) &#123;   <span class="comment">// 方法</span></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">a</span>(<span class="params"></span>)&#123;&#125;;         <span class="comment">// 私有方法，因为它没被返回 (见下面)</span></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">b</span>(<span class="params"></span>)&#123;&#125;;         <span class="comment">// 公共方法，因为被返回了</span></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">c</span>(<span class="params"></span>)&#123;&#125;;         <span class="comment">// 公共方法，因为被返回了</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// 暴露公共方法</span></span><br><span class="line">    <span class="keyword">return</span> &#123;</span><br><span class="line">      <span class="attr">b</span>: b,</span><br><span class="line">      <span class="attr">c</span>: c</span><br><span class="line">    &#125;</span><br><span class="line">&#125;));</span><br></pre></td></tr></table></figure><p>最开始看 <code>UMD</code> 规范的时候，第一感受：这是一坨什么💩。但是自己看了以后发现，这💩好像我还挺熟的。</p><p>没错，因为前几个月之前修复一个2018年的链游时，为了服务端（NodeJS）和网站（RequireJS）能公用一些模块，我就干了类似的事情。</p><p>个人简单理解：</p><p>1、<code>UMD</code> 让模块能在javascript所有运行环境中发挥作用。</p><p>2、<code>UMD</code> 最外层是一个自执行函数，这个自执行函数最终可以导出一个模块。</p><p>3、它最少包含了适配 <code>AMD</code> 、 <code>CJS</code> 的模块输出。</p><p>4、它主要被用于一些第三方库，随着 <code>AMD</code> 应用的逐渐减少，<code>UMD</code> 也会越来越不重要。</p><h1 id="体会"><a href="#体会" class="headerlink" title="体会"></a>体会</h1><p>其实每个时代都有自己的思想和规范，因为程序入门的时候就走的前端方向，与服务端技术更替的速度相比，前端更是瞬息万变，稍有不注意就会落伍。</p><p>曾经跟技术朋友讨论过关于技术迭代的问题，因为不停学习和淘汰也是一件相当耗费精力和时间的事情。但是最后我们还是必须要学起来，有时候更替的不只是技术，更重要的是一种思想。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;好久没有做过传统网页开发了，这次帮朋友处理的时候用了很多经典插件。在用到 &lt;code&gt;popper&lt;/code&gt; 的时候，发现引用地址里分成了 &lt;code&gt;esm&lt;/code&gt;、 &lt;code&gt;cjs&lt;/code&gt;、 &lt;code&gt;umd&lt;/code&gt; 三个路径，我这种半路出家</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="同步" scheme="https://www.gsgundam.com/tags/%E5%90%8C%E6%AD%A5/"/>
    
    <category term="javascript" scheme="https://www.gsgundam.com/tags/javascript/"/>
    
    <category term="cjs" scheme="https://www.gsgundam.com/tags/cjs/"/>
    
    <category term="amd" scheme="https://www.gsgundam.com/tags/amd/"/>
    
    <category term="umd" scheme="https://www.gsgundam.com/tags/umd/"/>
    
    <category term="esm" scheme="https://www.gsgundam.com/tags/esm/"/>
    
    <category term="node" scheme="https://www.gsgundam.com/tags/node/"/>
    
    <category term="异步" scheme="https://www.gsgundam.com/tags/%E5%BC%82%E6%AD%A5/"/>
    
    <category term="tree shaking" scheme="https://www.gsgundam.com/tags/tree-shaking/"/>
    
    <category term="模块导入" scheme="https://www.gsgundam.com/tags/%E6%A8%A1%E5%9D%97%E5%AF%BC%E5%85%A5/"/>
    
    <category term="模块定义" scheme="https://www.gsgundam.com/tags/%E6%A8%A1%E5%9D%97%E5%AE%9A%E4%B9%89/"/>
    
  </entry>
  
  <entry>
    <title>开放世界游戏的事件设计思考</title>
    <link href="https://www.gsgundam.com/2022/2022-12-25-z02-game-open-world-event-design/"/>
    <id>https://www.gsgundam.com/2022/2022-12-25-z02-game-open-world-event-design/</id>
    <published>2022-12-24T18:30:00.000Z</published>
    <updated>2022-12-25T02:33:57.437Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/93077711_p0.jpg"></p><p>大概我自己都时常不记得我本身是个策划，毕竟很多有能力的人都去了大公司，我们这种地方的人就需要身兼数职。大概能用在深入和研究策划设计上的时间，只有程序和美术的1&#x2F;10不到吧，有点愧对自己的本职工作。</p><p>PS：近几年的代码能力真的长进很多，从一开始炜哥给我C++服务器我拿着教程都有点懵杯跑不起来，到现在拿个高级语言看个几天就能开始写东西了。甚至说美术能力都比以前长进了不少，开始理解二次元的画法了。策划其实更是需要大量积累、大量思考才能输出的领域，要更加油才行啊。</p><p>周末了，就抽点时间，把这段时间关于随机事件的思考好好总结一下。</p><h1 id="为什么需要随机事件"><a href="#为什么需要随机事件" class="headerlink" title="为什么需要随机事件"></a>为什么需要随机事件</h1><p>万事皆有因。之所以会在这段时间都思考这个东西，是因为现在人员紧缺，但是战舰的设计规模摆在这里，如果砍掉随机事件这个特色的东西，将失去一个重要特色，甚至说游戏本身都不完整了。</p><p>好吧，上面说的是我不能放弃随机事件设计的原因。但是不能解释为什么一开始选择了随机事件。显然对于2个人做游戏，就又回到了刚才说到的困境。项目之初我就意识到我们在内容填充上可能存在数量的短板，但是如果内容过少、或补充太慢，游戏肯定是缺乏生命力的。那么这个时候随机事件也同样是一个不错的解决方案。通过各种条件组合到一起的事件（或者也可以称为任务），在有限的时间和素材中，提供了更多可能性。</p><p>所以，在项目设计之初，我就十分肯定的采用了大量 <code>Roguelike</code> 元素，不论是 <strong>随机性</strong>、<strong>非线性</strong>、还是 <strong>复杂性</strong> ，从角色、地图、事件、奖励、全局因素等各方面着手，期待在可控的时间和精力里，创造出一个能让玩家沉浸其中的世界。（当然，很尴尬的是，最后非常不可控 😅 ）</p><p>其实有这个设计理念并不是一天两天了，也不是一年两年，而是从我还是个少年开始的。因为25年前那个中学生的我，在那个年代接触了一个近两年特别火的游戏设计思路—— <em><strong>开放世界</strong></em> 。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/102059157_p0.png"></p><h1 id="什么是开放世界"><a href="#什么是开放世界" class="headerlink" title="什么是开放世界"></a>什么是开放世界</h1><p>现在提到开放世界，网游玩家第一个想到的多半是《原神》，主机玩家第一个想到的多半是《塞尔达传说：旷野之息》。其实咱们重庆的本土企业也很热衷于开放世界的，举例就交给诸位看客了😁。而属于我那个年代第一个称得上开放世界的游戏，恐怕得要给《辐射》了。</p><p>在前两者推动下，开放世界的概念在当下很多游戏里又被提起，或真或假，或多或少。那到底怎样才算开放世界？</p><p>借由知乎的一个名问题我们可以窥见一斑 - <a href="https://www.zhihu.com/question/422076282">《一个开放世界游戏必须具备哪些东西才能算开放世界游戏?》</a> 。</p><p>其中，以下两点是我认为十分重要的内容：</p><blockquote><p>第一、开放世界最基本的要素是玩家在游戏里从某个地点A到某个地点B的移动，其路径应该是不固定的。或者说，对任何一个从某A点移动到某B点的行为，有无数条路线。</p></blockquote><blockquote><p>第二、开放世界游戏通常会尝试在游戏内按照一些规则建立起一个虚拟的世界。这个世界当中除了玩家角色外，NPC会有他们自己的活动。玩家按照游戏内规则与NPC互动时，NPC会按照规则给出反馈。在理想状况下，游戏内世界可以独立于玩家行为自行运转。</p></blockquote><p>之所以提出来，是因为这两点体现了与传统游戏区别开的决定性因素——非线性设计。</p><p>线性故事的优势在于易于设计，叙事清晰，目的明确，也很好烘托剧情和氛围。但这些都是由玩家自身的叙事权利和被动代入为代价的，也就是说，玩家并不是因为自己想要做这件事而做，而是游戏告诉他只能这样做才行。</p><p>非线性设计之所以美妙，在于玩家与游戏互动的同时，投入了更多的情感和思考，也就是我们常说的代入感、沉浸感。这种感觉凭借语言是难以准确表达的，就像是你只有身处 《头号玩家》 的世界才能感受到一样。</p><p>然而非线性设计也不是完美的存在，无论是 <strong>信息不透明</strong>、<strong>目标不明确</strong>、<strong>剧情不连贯</strong>、还是 <strong>逻辑不自洽</strong>，任意一点都可以让玩家感到索然无味，毫无游戏动力。</p><p>实际上，非线性设计难度极大，以至于我在从业10多年来，自己还没有真正意义上实现过类似的设计。毕竟做设计不难，但是做好设计很难。</p><p>所以，我一直以来在思考的，就是如何在这个框框里把非线性设计的优势尽可能的呈现出来，同时，还不会有太多的重复劳动。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/102900229_p0.jpg"></p><h1 id="随机事件的设计思路"><a href="#随机事件的设计思路" class="headerlink" title="随机事件的设计思路"></a>随机事件的设计思路</h1><p>回想起来，其实对于开放世界、非线性设计理解的历程，也基本上就是非线性设计思路的深入程度。干脆就顺着这个思路来思考随机事件的设计。</p><h2 id="分支"><a href="#分支" class="headerlink" title="分支"></a>分支</h2><p>这个应该是最简单的非线性设计了，或者说某种程度上，它应该算是线性设计的变种而已。通过设置不同的选项，得到不同的结果，从而导致另一个事件的发生。</p><p>但是假如我们不局限于单向进程，让B任务可以去修改已经完成的A任务的结果，或者说，完成了C任务，就可以再去完成A任务，从而重新选择。这样就开始向非线性设计迈近了一步。</p><p>而这确实也是我的项目设计中随机事件的雏形。这个设计有一个后几种设计没有的天然优势，就是可以最大限度维持主线剧情的存在感，叙事依然很清晰。</p><h2 id="网络"><a href="#网络" class="headerlink" title="网络"></a>网络</h2><p>分支有了，那么是不是可以再进一步。A任务不再是独立的A任务，而是和B、C、D一起组成任务组I。这样的设计，将可能性变得更多，例如 “给任务组I穿插进一些零散的小任务”， “让任务组I和任务组II的选择直接触发E任务”。</p><p>这是第二版的设计思路，也是目前正在使用的。事实上，这个设计在测试中已经引起了同事和合作伙伴的好评。它在部分削弱了主线剧情的情况下，提升了游戏世界的代入感，似乎这个虚拟世界真的会发生一些意料之外的事情。</p><p>事实上，在这个阶段，我才把 <code>任务系统</code> 改称为 <strong><code>随机事件系统</code></strong> 的。</p><p>那为什么不按这个设计继续做下去？因为这个设计量也很大，而且任务之间的穿插很考究合理性，继续往后大量设计，极有可能造成无可挽回的逻辑错误、叙事漏洞。</p><h2 id="全局"><a href="#全局" class="headerlink" title="全局"></a>全局</h2><p>这个设计与前两个其实并不冲突，它是在这个事件之外设置了一系列玩家不可见的值，通过玩家完成事件所做的一些操作，转化为值的变化，从而引起单个事件或者事件组的变化，甚至可以产生新的事件和结果。</p><p>其实已经有相当多的游戏都使用了这个设计，宅如《心跳回忆》，硬如《克苏鲁的呼唤》（常说的SAN值就来自于这里）。也许它本身其实并不是 线性设计 与 非线性设计 的分界线，但是它<strong>在 非线性设计 中是可以大放异彩的</strong>。</p><p>在我的设计中本来是有少量这类全局变量存在的，但实操过程中发现其实很难控制，特别是对于一款没有具体结局的中大型网络游戏，设计的不好就意味着它可有可无，鸡肋一般的存在。因此目前已经废弃。</p><h2 id="沙盒"><a href="#沙盒" class="headerlink" title="沙盒"></a>沙盒</h2><p>好吧，这下来到了真正意义上的非线性设计了。在这个设计下面，如果能跳出游戏本身来看，主线剧情看起来其实更像是被硬加进去。因为在这种方式中，设计重点变成了用户如何与NPC、环境来进行交互。换句话说，玩家与它们交互时，它们应该展现出什么样的特点，在什么样的情况下，提供什么样的任务、什么样的选项。</p><p>是的，你其实完全可以把这种设计用程序思维表达出来，那就是 <strong><code>面向对象</code></strong> 。</p><p>在这个设计中，玩家有足够的自由度，玩家有机会通过行动、思考、表达来书写自己的“异世界故事”。</p><p>但是想象一下，假如你迷失在一个这样的世界中不知道该做什么，不知道可以做什么，甚至你做的事情在这个世界里也没有什么影响力，没有情节、没有故事……嗯，这简直是一场世纪灾难。</p><p>如果是一个有结局的游戏，那么沙盒游戏多多少少都还维持住自己的游戏性。但是对于一款开放式网游来说，如果不硬加入一条主线剧情，基本上就是应了 <strong>沙盒设计</strong> 里的 <strong>“沙”</strong> 字，真是一盘散沙。</p><p>这也是我一开始并没有选择这个方向的理由。既要设计众多的交互因子（属性和内容等等一大堆配置），又要设计一条主线剧情，这个设计量实在不是我等小民可以承受的。或者说我一个人可以承受的。</p><h2 id="GPT？强化学习？"><a href="#GPT？强化学习？" class="headerlink" title="GPT？强化学习？"></a>GPT？强化学习？</h2><p>那么，我所寻找的出路在哪里？其实方向已经有了，那就是将游戏交互全面规则化、属性化。</p><p>在这个前提下，主线的实现也变成了规则，通过制定世界的规则、阵营的规则、环境的规则，来实现主线的推进。</p><p>如何实现？</p><p>之前的思路是GPT通过规则来理解世界结构和局部情况，从来构建剧情大纲，确定详细目标（这块表现得并不好）。然后设定各种障碍和目标后，通过强化学习，最终将生成好的特定事件，落实到各个随机生成的有特定属性的NPC或者地点上。</p><p>现在正尝试把一些本来期望用AI来实现的内容（特别是剧情大纲），转由传统的代码逻辑实现。</p><p>但是具体怎么做？一方面可能是想保密吧，但是另一方面来说，我本来也还在验证阶段，还真的就是只有四个字可说，“无可奉告” 😋 。期待可以早点实现早点面市吧，我们自己也等得太久了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/93077711_p0.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;大概我自己都时常不记得我本身是个策划，毕竟很多有能力的人都去了大公司，我们</summary>
      
    
    
    
    <category term="项目开发" scheme="https://www.gsgundam.com/categories/%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="开放世界" scheme="https://www.gsgundam.com/tags/%E5%BC%80%E6%94%BE%E4%B8%96%E7%95%8C/"/>
    
    <category term="非线性设计" scheme="https://www.gsgundam.com/tags/%E9%9D%9E%E7%BA%BF%E6%80%A7%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="分支故事" scheme="https://www.gsgundam.com/tags/%E5%88%86%E6%94%AF%E6%95%85%E4%BA%8B/"/>
    
    <category term="随机任务" scheme="https://www.gsgundam.com/tags/%E9%9A%8F%E6%9C%BA%E4%BB%BB%E5%8A%A1/"/>
    
    <category term="随机事件" scheme="https://www.gsgundam.com/tags/%E9%9A%8F%E6%9C%BA%E4%BA%8B%E4%BB%B6/"/>
    
    <category term="强化学习" scheme="https://www.gsgundam.com/tags/%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="游戏设计" scheme="https://www.gsgundam.com/tags/%E6%B8%B8%E6%88%8F%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="思考" scheme="https://www.gsgundam.com/tags/%E6%80%9D%E8%80%83/"/>
    
    <category term="open world" scheme="https://www.gsgundam.com/tags/open-world/"/>
    
    <category term="non-linear design" scheme="https://www.gsgundam.com/tags/non-linear-design/"/>
    
    <category term="game design" scheme="https://www.gsgundam.com/tags/game-design/"/>
    
  </entry>
  
  <entry>
    <title>使用VS Code调试PhpStudy环境里的代码</title>
    <link href="https://www.gsgundam.com/2022/2022-12-25-z00-vscode-phpstudy-debug/"/>
    <id>https://www.gsgundam.com/2022/2022-12-25-z00-vscode-phpstudy-debug/</id>
    <published>2022-12-24T16:30:00.000Z</published>
    <updated>2022-12-24T22:40:07.114Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/90261625_p1.png"></p><p>最近几个月把所有项目都迁过来 <code>VS Code</code> 了（除了因为Unity调试问题反而用回了 <code>Visual Studio</code>），PHP也就抛弃了最强的 <code>PhpStorm</code> 。</p><p>这段时间抽空在帮朋友处理PHP项目，然而从来没有用过PHP调试功能的我，突然发现一个项目的bug，但是却怎么也打印不出东西，并且又不抛出错误。这就很离谱。于是乎，又开始填补自己的知识盲区，咱也要用上PHP的调试功能。</p><h1 id="配置-PhpStudy"><a href="#配置-PhpStudy" class="headerlink" title="配置 PhpStudy"></a>配置 PhpStudy</h1><p>我使用的是WNMP环境，web服务器是 <code>Nginx</code> ，<code>Apache</code> 环境也是一样的流程。</p><h2 id="使用默认版本PHP"><a href="#使用默认版本PHP" class="headerlink" title="使用默认版本PHP"></a>使用默认版本PHP</h2><p>使用默认版本的PHP就相当简单了，直接打开 <code>XDebug调试组件</code> 即可。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221225051937.png"></p><p>配置好了就可以跳过下面的部分，直接去看 <a href="#%E9%85%8D%E7%BD%AE-VS-Code">配置 VS Code</a> 。</p><h2 id="使用自定义版本PHP"><a href="#使用自定义版本PHP" class="headerlink" title="使用自定义版本PHP"></a>使用自定义版本PHP</h2><p>要不说我这个人做东西怎么慢呢，因为经常想要知道 <code>为什么</code> 和 <code>别的方法</code>。所以我并没有使用默认的PHP版本，而是顺便想要更新到PHP 7.x的最新版。</p><h3 id="下载新版PHP"><a href="#下载新版PHP" class="headerlink" title="下载新版PHP"></a>下载新版PHP</h3><p>先到官方网站下载最新的 <code>PHP 7.4.33</code> - <a href="https://windows.php.net/download">https://windows.php.net/download</a>，我使用的是 <code>nts</code> 版本。下载完成以后放到 phpstudy 的相应目录下，例如 <code>X:\path\to\phpstudy_pro\Extensions\php</code> 。文件夹名称修改为相同规则，例如 <code>php-7.4.33nts</code> 。</p><h3 id="下载并配置XDebug"><a href="#下载并配置XDebug" class="headerlink" title="下载并配置XDebug"></a>下载并配置XDebug</h3><p>刚才下载的包里是不包含 <code>XDebug</code> 插件的，我们需要自己去下载和配置。</p><p><code>XDebug</code> 官方网站有个非常贴心的功能，就是将本地 <code>php_info</code> 输出的信息，粘贴到输入框后，可以帮你分析出要下载的版本，并给出下载地址。到网址 <a href="https://xdebug.org/wizard">https://xdebug.org/wizard</a> 输入，然后点击 <em><strong>Analyse my phpinfo() output</strong></em> 按钮即可。</p><p>把下载好的dll插件拷贝到刚才 <code>php-7.4.33nts\ext</code> 目录中，然后在 <code>php.ini</code> 中加上以下信息（直接加在最末尾即可，确保是在 <code>OPCache</code> 配置的后面）：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">[XDebug]</span><br><span class="line">zend_extension=&quot;D:\phpstudy_pro\Extensions\php\php-7.4.33nts\ext\php_xdebug.dll&quot;</span><br><span class="line">xdebug.mode = debug</span><br><span class="line">xdebug.start_with_request = yes</span><br><span class="line">xdebug.client_port = 9000</span><br><span class="line">xdebug.remote_autostart = 1</span><br><span class="line">xdebug.collect_params=1</span><br><span class="line">xdebug.collect_return=1</span><br><span class="line">xdebug.auto_trace=On</span><br><span class="line">xdebug.remote_enable=On</span><br><span class="line">xdebug.remote_host=localhost</span><br><span class="line">xdebug.remote_port=9000</span><br><span class="line">xdebug.remote_handler=dbgp</span><br></pre></td></tr></table></figure><p>记得把 <code>zend_extension</code> 的值改为你插件实际所在的路径和实际的名称。</p><h3 id="测试配置是否成功"><a href="#测试配置是否成功" class="headerlink" title="测试配置是否成功"></a>测试配置是否成功</h3><p>首先重启web服务器（无论 Nginx 还是 Apache），然后用 <code>phpinfo()</code> 打印PHP信息，看是否有 <code>XDebug</code> 插件。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221225055059.png"></p><h1 id="配置-VS-Code"><a href="#配置-VS-Code" class="headerlink" title="配置 VS Code"></a>配置 VS Code</h1><p>确保 VSCode 中已经下载 <code>PHP Debug</code> 插件。可以搜索下载，也可以点击这里跳转后下载 - <a href="https://marketplace.visualstudio.com/items?itemName=xdebug.php-debug">https://marketplace.visualstudio.com/items?itemName=xdebug.php-debug</a> 。</p><p>打开 <em>文件-&gt;首选项-&gt;设置</em> , 在配置中添加如下内容：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;php.validate.executablePath&quot;:</span> <span class="string">&quot;D:/phpstudy_pro/Extensions/php/php-7.4.33nts/php.exe&quot;</span></span><br></pre></td></tr></table></figure><p>最后直接点击 <em><strong>运行和调试</strong></em> 按钮，在创建的 <code>launch.json</code> 里添加一个配置，或者找到已存在的配置来修改：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Listen for Xdebug&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;php&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;request&quot;</span><span class="punctuation">:</span> <span class="string">&quot;launch&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;port&quot;</span><span class="punctuation">:</span> <span class="number">9000</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h1 id="相关资源下载"><a href="#相关资源下载" class="headerlink" title="相关资源下载"></a>相关资源下载</h1><p>老规矩，我在 <a href="https://www.gsgunda.com/repository/">二机联盟-知识星球</a> 存了一份我自己配置好的 <code>php7.4.33nts</code> ，只需要修改一下 <code>XDebug</code> dll插件路径即可。同时这个包也配置好了 <code>Memcached</code> ，如果服务器没有安装，或者不需要启用，注释掉相关内容即可。</p><p>打开调试，一切豁然开朗，还顺手解决了原有框架的一个问题，舒坦 😏</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/90261625_p1.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;最近几个月把所有项目都迁过来 &lt;code&gt;VS Code&lt;/code&gt; 了</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="vscode" scheme="https://www.gsgundam.com/tags/vscode/"/>
    
    <category term="windows" scheme="https://www.gsgundam.com/tags/windows/"/>
    
    <category term="php" scheme="https://www.gsgundam.com/tags/php/"/>
    
    <category term="wnmp" scheme="https://www.gsgundam.com/tags/wnmp/"/>
    
    <category term="windows11" scheme="https://www.gsgundam.com/tags/windows11/"/>
    
    <category term="phpstudy" scheme="https://www.gsgundam.com/tags/phpstudy/"/>
    
    <category term="调试" scheme="https://www.gsgundam.com/tags/%E8%B0%83%E8%AF%95/"/>
    
    <category term="debug" scheme="https://www.gsgundam.com/tags/debug/"/>
    
    <category term="xdebug" scheme="https://www.gsgundam.com/tags/xdebug/"/>
    
    <category term="remote" scheme="https://www.gsgundam.com/tags/remote/"/>
    
  </entry>
  
  <entry>
    <title>Windows11 2022H2版本使用StartAllBack后资源管理器闪烁卡顿问题处理</title>
    <link href="https://www.gsgundam.com/2022/2022-12-24-z11-window11-2022h2-explorer-flash-with-startallback/"/>
    <id>https://www.gsgundam.com/2022/2022-12-24-z11-window11-2022h2-explorer-flash-with-startallback/</id>
    <published>2022-12-24T03:30:00.000Z</published>
    <updated>2022-12-24T22:29:37.557Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/windows_10_chan.jpg"></p><p>自从更新到 Windows11 以后，就一直在使用各种工具修改开始菜单，不然实在很难习惯放在中间的开始菜单。最后选择了 <code>StartAllBack</code> ，倒不是它多优秀，主要是占用少，速度快，功能够用。 </p><p>PS：到目前为止我都不习惯macOS底部的快捷栏，顶部倒是很习惯，我猜想应该是因为鼠标随便一晃就能到最角落，然后这样向目标寻路的时候比较精准方便😀</p><p>这次是我自己手贱把 Windows 升级了 2022H2 新版本，然后就出现了开始菜单一直闪烁的问题。上网大概一搜，并没有太多类似的情况可以查到。按推理来说，最有可能的就是管理着资源管理器的 <code>StartAllBack</code> 了。（而且我还想到之前资源管理器之前经常出现高占用，是不是也是它的问题？）</p><p>废话少说，直接更新呗。于是直接上最新的 <code>3.5.6</code> 版。</p><p>果真不再闪烁，使用了2天也没有出现资源管理器高占用卡顿的问题。👍</p><p>最后建议大家购买正版，淘宝京东都有，随便一搜一大把，25-29都可以保证买到正版，20以下的就不好说了。</p><p>当然，这里也提供一个体验通道：<a href="https://www.ghxi.com/startallback.html">果核剥壳</a>。</p><p>同时，我也在 <a href="https://www.gsgunda.com/repository/">二机联盟-知识星球</a> 存了一份。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/windows_10_chan.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;自从更新到 Windows11 以后，就一直在使用各种工具修改开始</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="修复" scheme="https://www.gsgundam.com/tags/%E4%BF%AE%E5%A4%8D/"/>
    
    <category term="windows" scheme="https://www.gsgundam.com/tags/windows/"/>
    
    <category term="windows11" scheme="https://www.gsgundam.com/tags/windows11/"/>
    
    <category term="2022h2" scheme="https://www.gsgundam.com/tags/2022h2/"/>
    
    <category term="startallback" scheme="https://www.gsgundam.com/tags/startallback/"/>
    
    <category term="资源管理器" scheme="https://www.gsgundam.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86%E5%99%A8/"/>
    
    <category term="开始菜单" scheme="https://www.gsgundam.com/tags/%E5%BC%80%E5%A7%8B%E8%8F%9C%E5%8D%95/"/>
    
    <category term="explorer" scheme="https://www.gsgundam.com/tags/explorer/"/>
    
    <category term="闪烁" scheme="https://www.gsgundam.com/tags/%E9%97%AA%E7%83%81/"/>
    
    <category term="卡顿" scheme="https://www.gsgundam.com/tags/%E5%8D%A1%E9%A1%BF/"/>
    
    <category term="黑屏" scheme="https://www.gsgundam.com/tags/%E9%BB%91%E5%B1%8F/"/>
    
  </entry>
  
  <entry>
    <title>Windows环境下安装和配置WNMP的Memcached</title>
    <link href="https://www.gsgundam.com/2022/2022-12-19-z13-windows-wnmp-install-php-memcached/"/>
    <id>https://www.gsgundam.com/2022/2022-12-19-z13-windows-wnmp-install-php-memcached/</id>
    <published>2022-12-19T05:30:00.000Z</published>
    <updated>2022-12-19T09:18:58.046Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/@php.png"></p><p>PHP开发不是我最擅长的服务端语言，但是因为接触WordPress很早，了解到一个叫做 <code>WPJam</code> - <a href="https://blog.wpjam.com/article/wordpress-memcached/">https://blog.wpjam.com/article/wordpress-memcached/</a> 的插件，后来他更新了一个支持Memcached的功能，从而使我了解到除了常用的 <code>Redis</code>、<code>MongoDB</code> 以外，还有 <code>Memcache</code> 和 <code>Memcached</code> 这样两个先辈。</p><p>PS：说得好像我其他语言开发服务端就很厉害，其实只是基于对javascript和python的熟悉程度，所以用 <code>NodeJS</code> 和 <code>Python</code> 两种开发更快。</p><p>说回来主角 <code>Memcached</code> ，其实在熟悉了以后，我就经常使用他作为一些小型项目的高速缓存系统。它的优势在于配置十分迅速，使用起来与 <code>MongoDB</code> 无异，开发效率极高，同时也能够应对小型项目的压力。</p><p>由于我同时要兼任 策划、美术、开发 多个职务，本地环境一直都是Windows，但对windows服务器环境不熟悉，导致了 <code>Memcached</code> 始终不能正常运行。最近帮朋友处理一个项目，考虑到后续如果有人接手，恐怕还是 <code>PHP</code> 最快最容易找到人，所以把解决 <code>Memcached</code> 如何在Windows WNMP环境下跑起来又提上了日程。</p><p>PS2：继续吐槽度娘的技术文章搜索功能，<strong>80%的结果都帮不上忙，还有20%连边都不沾</strong>。最后还是靠谷哥出面解决了问题。可长点心吧。</p><p>文章里所有的文件我都尽可能提供了下载地址，同时也在 <a href="https://www.gsgunda.com/repository/">二机联盟-知识星球</a> 存了一份。</p><h1 id="Memcache-与-Memcached"><a href="#Memcache-与-Memcached" class="headerlink" title="Memcache 与 Memcached"></a>Memcache 与 Memcached</h1><p><code>Memcache</code> 是一个原生版本，完全是在 PHP 框架内开发的，支持 面向对象 和 面向过程 两套接口并存，而 <code>Memcached</code> 是建立在 libmemcached 的基础上的，只支持 面向对象 接口。这就意味着在安装 <code>Memcache</code> 扩展的时候不要求安装其他的东西，但是在安装 <code>Memcached</code> 的时候会要求你安装 <code>libmemcached</code>。</p><p><code>Memcached</code> 支持 Binary Protocol，而 <code>Memcache</code> 不支持，这意味着 <code>Memcached</code> 会有更高的性能。</p><p>网上90%的文章都是打着 <code>Memcached</code> 的旗号在讲 <code>Memcache</code> ，真的是浪费大家时间。</p><h1 id="安装-Memcached-服务"><a href="#安装-Memcached-服务" class="headerlink" title="安装 Memcached 服务"></a>安装 Memcached 服务</h1><p>其实我很早就安装并测试好了 memcached 服务，再回顾一下。</p><h2 id="下载-memcached-exe"><a href="#下载-memcached-exe" class="headerlink" title="下载 memcached.exe"></a>下载 memcached.exe</h2><p>我只用到了1.4.4版本，因为1.4.5开始就不能作为服务来启动了。而我本来就是测试用途，没有必要搞那么麻烦。</p><p>下载地址：</p><p>64位系统 1.4.4版本：<a href="http://static.runoob.com/download/memcached-win64-1.4.4-14.zip">http://static.runoob.com/download/memcached-win64-1.4.4-14.zip</a></p><p>32位系统 1.4.4版本：<a href="http://static.runoob.com/download/memcached-win32-1.4.4-14.zip">http://static.runoob.com/download/memcached-win32-1.4.4-14.zip</a></p><p>解压出来，推荐放到系统盘以外，免得什么时候重装或者恢复了系统又要重新下载。</p><h2 id="安装为服务"><a href="#安装为服务" class="headerlink" title="安装为服务"></a>安装为服务</h2><p>管理员身份打开cmd，cd 到 <code>memcached.exe</code> 所在目录。</p><p>执行命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&gt; memcached.exe -d install</span><br></pre></td></tr></table></figure><p>其他相关命令可以用 <code>-h</code> 参数来查看。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line">&gt; memcached.exe -h</span><br><span class="line">memcached 1.4.4-14-g9c660c0</span><br><span class="line">-p &lt;num&gt;      TCP port number to listen on (default: 11211)</span><br><span class="line">-U &lt;num&gt;      UDP port number to listen on (default: 11211, 0 is off)</span><br><span class="line">-s &lt;file&gt;     UNIX socket path to listen on (disables network support)</span><br><span class="line">-a &lt;mask&gt;     access mask <span class="keyword">for</span> UNIX socket, <span class="keyword">in</span> octal (default: 0700)</span><br><span class="line">-l &lt;ip_addr&gt;  interface to listen on (default: INADDR_ANY, all addresses)</span><br><span class="line">-s &lt;file&gt;     unix socket path to listen on (disables network support)</span><br><span class="line">-a &lt;mask&gt;     access mask <span class="keyword">for</span> unix socket, <span class="keyword">in</span> octal (default 0700)</span><br><span class="line">-l &lt;ip_addr&gt;  interface to listen on, default is INADDR_ANY</span><br><span class="line">-d start          tell memcached to start</span><br><span class="line">-d restart        tell running memcached to <span class="keyword">do</span> a graceful restart</span><br><span class="line">-d stop|shutdown  tell running memcached to shutdown</span><br><span class="line">-d install        install memcached service</span><br><span class="line">-d uninstall      uninstall memcached service</span><br><span class="line">-r            maximize core file <span class="built_in">limit</span></span><br><span class="line">-u &lt;username&gt; assume identity of &lt;username&gt; (only when run as root)</span><br><span class="line">-m &lt;num&gt;      max memory to use <span class="keyword">for</span> items <span class="keyword">in</span> megabytes (default: 64 MB)</span><br><span class="line">-M            <span class="built_in">return</span> error on memory exhausted (rather than removing items)</span><br><span class="line">-c &lt;num&gt;      max simultaneous connections (default: 1024)</span><br><span class="line">-k            lock down all paged memory.  Note that there is a</span><br><span class="line">              <span class="built_in">limit</span> on how much memory you may lock.  Trying to</span><br><span class="line">              allocate more than that would fail, so be sure you</span><br><span class="line">              <span class="built_in">set</span> the <span class="built_in">limit</span> correctly <span class="keyword">for</span> the user you started</span><br><span class="line">              the daemon with (not <span class="keyword">for</span> -u &lt;username&gt; user;</span><br><span class="line">              under sh this is <span class="keyword">done</span> with <span class="string">&#x27;ulimit -S -l NUM_KB&#x27;</span>).</span><br><span class="line">-v            verbose (<span class="built_in">print</span> errors/warnings <span class="keyword">while</span> <span class="keyword">in</span> event loop)</span><br><span class="line">-vv           very verbose (also <span class="built_in">print</span> client commands/reponses)</span><br><span class="line">-vvv          extremely verbose (also <span class="built_in">print</span> internal state transitions)</span><br><span class="line">-h            <span class="built_in">print</span> this <span class="built_in">help</span> and <span class="built_in">exit</span></span><br><span class="line">-i            <span class="built_in">print</span> memcached and libevent license</span><br><span class="line">-P &lt;file&gt;     save PID <span class="keyword">in</span> &lt;file&gt;, only used with -d option</span><br><span class="line">-f &lt;<span class="built_in">factor</span>&gt;   chunk size growth <span class="built_in">factor</span> (default: 1.25)</span><br><span class="line">-n &lt;bytes&gt;    minimum space allocated <span class="keyword">for</span> key+value+flags (default: 48)</span><br><span class="line">-L            Try to use large memory pages (<span class="keyword">if</span> available). Increasing</span><br><span class="line">              the memory page size could reduce the number of TLB misses</span><br><span class="line">              and improve the performance. In order to get large pages</span><br><span class="line">              from the OS, memcached will allocate the total item-cache</span><br><span class="line">              <span class="keyword">in</span> one large chunk.</span><br><span class="line">-D &lt;char&gt;     Use &lt;char&gt; as the delimiter between key prefixes and IDs.</span><br><span class="line">              This is used <span class="keyword">for</span> per-prefix stats reporting. The default is</span><br><span class="line">              <span class="string">&quot;:&quot;</span> (colon). If this option is specified, stats collection</span><br><span class="line">              is turned on automatically; <span class="keyword">if</span> not, <span class="keyword">then</span> it may be turned on</span><br><span class="line">              by sending the <span class="string">&quot;stats detail on&quot;</span> <span class="built_in">command</span> to the server.</span><br><span class="line">-t &lt;num&gt;      number of threads to use (default: 4)</span><br><span class="line">-R            Maximum number of requests per event, limits the number of</span><br><span class="line">              requests process <span class="keyword">for</span> a given connection to prevent</span><br><span class="line">              starvation (default: 20)</span><br><span class="line">-C            Disable use of CAS</span><br><span class="line">-b            Set the backlog queue <span class="built_in">limit</span> (default: 1024)</span><br><span class="line">-B            Binding protocol - one of ascii, binary, or auto (default)</span><br><span class="line">-I            Override the size of each slab page. Adjusts max item size</span><br><span class="line">              (default: 1mb, min: 1k, max: 128m)</span><br></pre></td></tr></table></figure><h2 id="检查启动状况"><a href="#检查启动状况" class="headerlink" title="检查启动状况"></a>检查启动状况</h2><p>使用 <code>telnet</code> 来查看 memcached 是否正常运作。首先确保已经安装了 <code>telnet</code> 客户端，没有安装的到 <code>打开或关闭 Windows 功能</code> 里安装即可。输入 telnet 命令后，先回车一个，出现了 <code>Error</code> 再输入 <code>stats</code> 命令。 </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">&gt;telnet 127.0.0.1 11211</span><br><span class="line"></span><br><span class="line">ERROR</span><br><span class="line"></span><br><span class="line">&gt;stats</span><br><span class="line"></span><br><span class="line">STAT get_hits 3096</span><br><span class="line">STAT get_misses 1269</span><br><span class="line">STAT delete_misses 0</span><br><span class="line">STAT delete_hits 4</span><br><span class="line">STAT incr_misses 0</span><br><span class="line">STAT incr_hits 0</span><br><span class="line">STAT decr_misses 0</span><br><span class="line">STAT decr_hits 0</span><br><span class="line">STAT cas_misses 0</span><br><span class="line">STAT cas_hits 0</span><br><span class="line">STAT cas_badval 0</span><br><span class="line">STAT auth_cmds 0</span><br><span class="line">STAT auth_errors 0</span><br><span class="line">STAT bytes_read 364075</span><br><span class="line">STAT bytes_written 824270</span><br><span class="line">STAT limit_maxbytes 67108864</span><br><span class="line">STAT accepting_conns 1</span><br><span class="line">STAT listen_disabled_num 0</span><br><span class="line">STAT threads 4</span><br><span class="line">STAT conn_yields 0</span><br><span class="line">STAT bytes 71129</span><br><span class="line">STAT curr_items 189</span><br><span class="line">STAT total_items 1054</span><br><span class="line">STAT evictions 0</span><br><span class="line">END</span><br></pre></td></tr></table></figure><p>这样就是跑起来了。</p><p>当然也可以到 windows 的服务面板里查看 <code>memcached</code> 服务是否运行，或者在任务管理器面板里查看服务标签。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221219144335.png"></p><h1 id="配置php环境"><a href="#配置php环境" class="headerlink" title="配置php环境"></a>配置php环境</h1><p>我使用的是 <code>PhpStudy</code> 的 WNMP 集成环境。PHP版本为7.4，x64位架构，非线程安全。</p><h2 id="下载相关dll"><a href="#下载相关dll" class="headerlink" title="下载相关dll"></a>下载相关dll</h2><p>废话不多说，两种方式下载：</p><p>GitHub下载：<a href="https://github.com/nono303/PHP-memcache-dll">https://github.com/nono303/PHP-memcache-dll</a></p><p>PECL官网：<a href="https://pecl.php.net/package/memcached/3.2.0/windows">https://pecl.php.net/package/memcached/3.2.0/windows</a></p><p>这里特别要注意版本问题，要完全对上运行环境才行。</p><p>下载以后，将 <code>php_memcached.dll</code> 放到 <code>DISK:\your\path\to\php\ext</code> 目录下，将 <code>libmemcached.dll</code> 放到 <code>C:\Windows</code> 目录下。</p><h2 id="配置php-ini"><a href="#配置php-ini" class="headerlink" title="配置php.ini"></a>配置php.ini</h2><p>这个就简单了，在所用的php版本的 <code>php.ini</code> 文档末尾加入 <code>extension=php_memcached.dll</code> 即可。</p><h1 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h1><p><code>phpinfo()</code> 查看状态：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221219140939.png"></p><p>当然，也可以写代码来检测：</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">if</span> (<span class="title function_ invoke__">class_exists</span>(<span class="string">&#x27;Memcached&#x27;</span>))&#123;</span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&#x27;Memcached&#x27;</span>;</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&#x27;No Memcached&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// [OUTPUT] Memcached</span></span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p>清理缓存：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">telnet localhost 11211</span><br><span class="line">flush_all</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/@php.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;PHP开发不是我最擅长的服务端语言，但是因为接触WordPress很早，了解到一个叫做 </summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="github" scheme="https://www.gsgundam.com/tags/github/"/>
    
    <category term="windows" scheme="https://www.gsgundam.com/tags/windows/"/>
    
    <category term="php" scheme="https://www.gsgundam.com/tags/php/"/>
    
    <category term="wnmp" scheme="https://www.gsgundam.com/tags/wnmp/"/>
    
    <category term="memcached" scheme="https://www.gsgundam.com/tags/memcached/"/>
    
    <category term="缓存" scheme="https://www.gsgundam.com/tags/%E7%BC%93%E5%AD%98/"/>
    
    <category term="telnet" scheme="https://www.gsgundam.com/tags/telnet/"/>
    
    <category term="高速缓存" scheme="https://www.gsgundam.com/tags/%E9%AB%98%E9%80%9F%E7%BC%93%E5%AD%98/"/>
    
    <category term="扩展" scheme="https://www.gsgundam.com/tags/%E6%89%A9%E5%B1%95/"/>
    
    <category term="安装" scheme="https://www.gsgundam.com/tags/%E5%AE%89%E8%A3%85/"/>
    
    <category term="配置" scheme="https://www.gsgundam.com/tags/%E9%85%8D%E7%BD%AE/"/>
    
  </entry>
  
  <entry>
    <title>Windows下VS Code推送GitHub代码的时候提示 ssh connect to host github.com port 22 Connection timed out</title>
    <link href="https://www.gsgundam.com/2022/2022-12-18-z16-windows-vscode-github-port-22-connection-timeout/"/>
    <id>https://www.gsgundam.com/2022/2022-12-18-z16-windows-vscode-github-port-22-connection-timeout/</id>
    <published>2022-12-18T08:30:00.000Z</published>
    <updated>2022-12-18T12:36:05.983Z</updated>
    
    <content type="html"><![CDATA[<p>因为之前一直习惯用PhpStorm做网站开发，所以也是用它在写博客。但是最近确实感觉它太重了，资源消耗太大。我又是长期开一堆网页，开一堆IDE，可能还要跑 <code>Photoshop</code>、<code>Word</code>、<code>Excel</code> 之类的，天天听Intel NUC起飞是真难受。所以最近大部分开发都转战了<code>VS Code</code>。（但是有一说一，JetBrains 的东西实在太强大了，好用至极，每款都是。缺点是资源占用也确实严重。）</p><p>转战之路却并不顺畅，比如 <code>git</code> 就只能commit到本地，无法push到 <code>github</code> 仓库，出现以下提示。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221218183105.png"></p><p>这点很奇怪，因为托管在公司服务器上的git仓库，在 VS Code 里是可以正常 push 和 pull 的。</p><p>习惯性地先打开了百度，然后得到了一堆莫名其妙的结果。真的醉了，对度娘只能送上《服气》两个字。同样的搜索词在google里轻易得到了解决方案。</p><p>首先测试一下跟github的通讯是否正常。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&gt; ssh -T -p 443 git@ssh.github.com</span><br><span class="line">The authenticity of host <span class="string">&#x27;[ssh.github.com]:443 ([20.205.243.160]:443)&#x27;</span> can<span class="string">&#x27;t be established.</span></span><br><span class="line"><span class="string">ECDSA key fingerprint is SHA256:░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░.</span></span><br><span class="line"><span class="string">Are you sure you want to continue connecting (yes/no/[fingerprint])? yes</span></span><br><span class="line"><span class="string">Warning: Permanently added &#x27;</span>[ssh.github.com]:443,[20.205.243.160]:443<span class="string">&#x27; (ECDSA) to the list of known hosts.</span></span><br><span class="line"><span class="string">Hi gsgundam! You&#x27;</span>ve successfully authenticated, but GitHub does not provide shell access.</span><br></pre></td></tr></table></figure><p>嗯……不只是通讯正常，连授权都ok。但是再试一次push，仍然得到了之前那个错误。通过搜索到的结果，得知实际上我们只要在 <code>C:\Users\[your username]\.ssh\</code> 目录里新增一个 <code>config</code> 文件就可以了。文件的内容如下。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">Host</span> <span class="string">github.com</span></span><br><span class="line"><span class="string">Hostname</span> <span class="string">ssh.github.com</span></span><br><span class="line"><span class="string">Port</span> <span class="number">443</span></span><br><span class="line"><span class="string">User</span> <span class="string">&lt;your</span> <span class="string">github</span> <span class="string">registered</span> <span class="string">email&gt;</span></span><br></pre></td></tr></table></figure><p>再尝试一下，恢复正常了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;因为之前一直习惯用PhpStorm做网站开发，所以也是用它在写博客。但是最近确实感觉它太重了，资源消耗太大。我又是长期开一堆网页，开一堆IDE，可能还要跑 &lt;code&gt;Photoshop&lt;/code&gt;、&lt;code&gt;Word&lt;/code&gt;、&lt;code&gt;Excel&lt;/code&gt;</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="vs code" scheme="https://www.gsgundam.com/tags/vs-code/"/>
    
    <category term="vscode" scheme="https://www.gsgundam.com/tags/vscode/"/>
    
    <category term="git" scheme="https://www.gsgundam.com/tags/git/"/>
    
    <category term="github" scheme="https://www.gsgundam.com/tags/github/"/>
    
    <category term="push" scheme="https://www.gsgundam.com/tags/push/"/>
    
    <category term="ssh" scheme="https://www.gsgundam.com/tags/ssh/"/>
    
    <category term="timed out" scheme="https://www.gsgundam.com/tags/timed-out/"/>
    
    <category term="超时" scheme="https://www.gsgundam.com/tags/%E8%B6%85%E6%97%B6/"/>
    
    <category term="仓库" scheme="https://www.gsgundam.com/tags/%E4%BB%93%E5%BA%93/"/>
    
    <category term="版本管理" scheme="https://www.gsgundam.com/tags/%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>自定义Live2D插件配置并加载CDN数据</title>
    <link href="https://www.gsgundam.com/2022/2022-12-16-z11-live2d-update-customize-config-with-cdn/"/>
    <id>https://www.gsgundam.com/2022/2022-12-16-z11-live2d-update-customize-config-with-cdn/</id>
    <published>2022-12-16T03:30:00.000Z</published>
    <updated>2022-12-18T07:47:03.811Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221218025850.png"></p><p>修复博客问题的时候，发现加载 <code>Live2D</code> 的模型报了一堆错误。仔细看，是由于看板娘的动作文件出错了，而且居然是大小写的问题，想必windows服务器就不会出现这个问题，所以模型的作者并没有发现。</p><p>既然都在批量修复问题了，那把这个问题一并处理掉吧。</p><h1 id="更换插件"><a href="#更换插件" class="headerlink" title="更换插件"></a>更换插件</h1><p>本来想着应该是个很快的过程，找到问题所在，如果可以修复，我也想继续使用这个模型。或者不可以，那我就换个模型继续用。</p><p>但是访问 <code>hexo-helper-live2d</code> - <a href="https://github.com/EYHN/hexo-helper-live2d">https://github.com/EYHN/hexo-helper-live2d</a> 时，顶部黄条让我心头一颤，接着在 Readme 看到一条让人遗憾的说明。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">This repository has been archived by the owner before Nov 9, 2022. It is now read-only.</span><br><span class="line"></span><br><span class="line">...</span><br><span class="line"></span><br><span class="line">The project is not actively maintained. Please try similar projects stevenjoezhang/live2d-widget</span><br></pre></td></tr></table></figure><p>emmm……看最近更新确实都是3年前了。于是循着他的推荐，我去访问了 <code>Live2D Widget</code> - <a href="https://github.com/stevenjoezhang/live2d-widget">https://github.com/stevenjoezhang/live2d-widget</a> 这个项目。</p><p>该项目并不是hexo的特有插件，所以看起来自定义集成会比之前的插件略微麻烦。当然，如果只需要最基本的功能，则比之前还简单。只用将下面这一行代码加入 <code>html</code> 页面的 <code>head</code> 或 <code>body</code> 中，即可加载看板娘：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://fastly.jsdelivr.net/gh/stevenjoezhang/live2d-widget@latest/autoload.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>我以上方式尝试了一下，得到了下图的结果。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221218030915.png"></p><p>然而，我希望博客上的看板娘插件能干干净净的，不说废话，不用换人换装，更不用各种乱七八糟的功能。很明显这并不是我想要的。</p><p>略微纠结了一会要不要换回以前的插件，然后打定主意还是要更换为新的，毕竟有维护更新还是更有保障一些。</p><h1 id="本地部署"><a href="#本地部署" class="headerlink" title="本地部署"></a>本地部署</h1><p>对于线上托管版本，其实项目已经提供了一些可选配置。项目中的 <code>autoload.js</code> 文件也大致都列出来了可选配置。<code>autoload.js</code> 会自动加载三个文件：<code>waifu.css</code>，<code>live2d.min.js</code> 和 <code>waifu-tips.js</code>。<code>waifu-tips.js</code> 会创建 <code>initWidget</code> 函数，这就是加载看板娘的主函数。<code>initWidget</code> 函数接收一个 Object 类型的参数，作为看板娘的配置。</p><table><thead><tr><th>选项</th><th>类型</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>waifuPath</code></td><td><code>string</code></td><td><code>https://fastly.jsdelivr.net/gh/stevenjoezhang/live2d-widget@latest/waifu-tips.json</code></td><td>看板娘资源路径，可自行修改</td></tr><tr><td><code>apiPath</code></td><td><code>string</code></td><td><code>https://live2d.fghrsh.net/api/</code></td><td>API 路径，可选参数</td></tr><tr><td><code>cdnPath</code></td><td><code>string</code></td><td><code>https://fastly.jsdelivr.net/gh/fghrsh/live2d_api/</code></td><td>CDN 路径，可选参数</td></tr><tr><td><code>tools</code></td><td><code>string[]</code></td><td>见 <code>autoload.js</code></td><td>加载的小工具按钮，可选参数</td></tr></tbody></table><p>这些配置确实能够解决不要显示小工具的问题，但是自己说话的问题（原来的文本实在是太那个了，都不敢让我孩子看见），以及指定角色和服装，在这里并不能解决。</p><p>于是我还是走上了进阶道路——自定义配置。</p><p>首先当然是把项目克隆到本地：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/stevenjoezhang/live2d-widget.git</span><br></pre></td></tr></table></figure><p>直接把整个目录复制到source文件夹下面就可以。依赖就不用安装了，毕竟我是要在自己的Hexo博客里运行。</p><p>试试引入 </p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://your.site.com/path/to/live2d-widget/autoload.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>部署运行没有问题，那么剩下就是真正的自定义阶段了。</p><h1 id="自定义配置"><a href="#自定义配置" class="headerlink" title="自定义配置"></a>自定义配置</h1><p>要干活首先得安排好要干什么活儿，所以先分析一波它的demo，其中一个是基础例子，不管它，我们来看另外一个 <code>login.html</code>。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">live2d-widget</span><br><span class="line">│  live2d.min.js      &lt;-- 主文件</span><br><span class="line">│  waifu.css          &lt;-- 样式</span><br><span class="line">├─demo</span><br><span class="line">│      login.html     &lt;-- 功能实现参考</span><br><span class="line">└─src</span><br><span class="line">        index.js      &lt;-- 与login.html一起作为实现参考</span><br><span class="line">        model.js      &lt;-- 模型加载参考</span><br></pre></td></tr></table></figure><p>上面的树形图我把不重要的文件都隐藏了，重要的都留下来了。这就是今天的主角们。</p><p>感觉废话也不用多说，直接来看我要干什么。</p><h2 id="插入画布"><a href="#插入画布" class="headerlink" title="插入画布"></a>插入画布</h2><p>调用 <code>insertAdjacentHTML</code> 方法来插入一个固定在左下角的画布。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">insertAdjacentHTML</span>(<span class="string">&quot;beforeend&quot;</span>, <span class="string">`&lt;div id=&quot;waifu&quot; style=&quot;position:fixed;left:20px; bottom:0;z-index:2;&quot;&gt;</span></span><br><span class="line"><span class="string">            &lt;div id=&quot;waifu-tips&quot;&gt;&lt;/div&gt;</span></span><br><span class="line"><span class="string">            &lt;canvas id=&quot;live2d&quot; width=&quot;250&quot; height=&quot;250&quot;&gt;&lt;/canvas&gt;</span></span><br><span class="line"><span class="string">            &lt;div id=&quot;waifu-tool&quot;&gt;&lt;/div&gt;</span></span><br><span class="line"><span class="string">        &lt;/div&gt;`</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 这里是参考了demo代码，猜想可能是担心bottom 0不生效，又赋值了一遍。因为原来的css里面有个鼠标移上去以后的浮动效果</span></span><br><span class="line"><span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;waifu&quot;</span>).<span class="property">style</span>.<span class="property">bottom</span> = <span class="number">0</span>;</span><br><span class="line">&#125;, <span class="number">0</span>); </span><br></pre></td></tr></table></figure><h2 id="构造初始化配置方法"><a href="#构造初始化配置方法" class="headerlink" title="构造初始化配置方法"></a>构造初始化配置方法</h2><p>分析Demo我们可以知道，它通过api的方式获得参数，然后传参来创建模型。</p><p>那么先来构造一个初始化配置的方法。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">initConfig</span>(<span class="params">config</span>)&#123;</span><br><span class="line">  <span class="keyword">let</span> &#123; apiPath, cdnPath &#125; = config;</span><br><span class="line">  <span class="keyword">let</span> useCDN = <span class="literal">false</span>;</span><br><span class="line">  <span class="keyword">if</span> (<span class="keyword">typeof</span> cdnPath === <span class="string">&quot;string&quot;</span>) &#123;</span><br><span class="line">      useCDN = <span class="literal">true</span>;</span><br><span class="line">      <span class="keyword">if</span> (!cdnPath.<span class="title function_">endsWith</span>(<span class="string">&quot;/&quot;</span>)) cdnPath += <span class="string">&quot;/&quot;</span>;</span><br><span class="line">  &#125; <span class="keyword">else</span> <span class="keyword">if</span> (<span class="keyword">typeof</span> apiPath === <span class="string">&quot;string&quot;</span>) &#123;</span><br><span class="line">      <span class="keyword">if</span> (!apiPath.<span class="title function_">endsWith</span>(<span class="string">&quot;/&quot;</span>)) apiPath += <span class="string">&quot;/&quot;</span>;</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      <span class="keyword">throw</span> <span class="string">&quot;Invalid initWidget argument!&quot;</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> &#123;<span class="attr">useCDN</span>: useCDN, <span class="attr">apiPath</span>: apiPath, <span class="attr">cdnPath</span>: cdnPath&#125;;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这里我参考原作者允许了 <code>api</code> 和 <code>cdn</code> 两种获取配置的方式，由传入参数来确定到底用哪种。接下来就调用这个方法初始化我们的配置参数。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> config = <span class="title function_">initConfig</span>(&#123;</span><br><span class="line">    <span class="comment">// apiPath: &quot;https://live2d.fghrsh.net/api/&quot;, // 这里是api方式请求，这个api的作者服务器已经用爱发电了很多年，已经说了很多次要废弃了，但是目前还运作着。为了他，也为了保证自己少出问题，我们还是选用cdn的方式。</span></span><br><span class="line">    <span class="attr">cdnPath</span>: <span class="string">&quot;https://npm.elemecdn.com/akilar-live2dapi@latest/&quot;</span>,</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h2 id="构造模型加载方法"><a href="#构造模型加载方法" class="headerlink" title="构造模型加载方法"></a>构造模型加载方法</h2><p>因为配置保留了 <code>api</code> 和 <code>cdn</code> 两种方式，所以实现加载的时候，也同时考虑这两种方式。</p><p>但是通过分析cdn的文件，我们可以知道，要获取模型参数跟api方式是不一样的。api可以使用url传参的方式直接获取到对应模型，而api也会有自己的容错处理。但cdn就需要我们通过自己的方式来处理了。所以我们还构造了 <code>modelSelection</code> 这个方法。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">loadModel</span>(<span class="params">modelId, modelTexturesId, config</span>) &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;modelId&quot;</span>, modelId); <span class="comment">// 保留了demo 中本地存储配置的思路，随时可以将切换模型工具添加上</span></span><br><span class="line">  <span class="keyword">if</span> (modelTexturesId === <span class="literal">undefined</span>) modelTexturesId = <span class="number">0</span>;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&quot;modelTexturesId&quot;</span>, modelTexturesId);</span><br><span class="line">  <span class="keyword">if</span> (config.<span class="property">useCDN</span>) &#123; <span class="comment">// cdn load</span></span><br><span class="line">      <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(<span class="string">`<span class="subst">$&#123;config.cdnPath&#125;</span>model_list.json`</span>);</span><br><span class="line">      <span class="keyword">const</span> modelList = <span class="keyword">await</span> response.<span class="title function_">json</span>();</span><br><span class="line">      <span class="keyword">const</span> target = <span class="title function_">modelSelection</span>(modelList.<span class="property">models</span>[modelId], modelTexturesId);</span><br><span class="line">      <span class="title function_">loadlive2d</span>(<span class="string">&quot;live2d&quot;</span>, <span class="string">`<span class="subst">$&#123;config.cdnPath&#125;</span>model/<span class="subst">$&#123;target&#125;</span>/index.json`</span>);</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`Live2D 模型 <span class="subst">$&#123;modelId&#125;</span>-<span class="subst">$&#123;modelTexturesId&#125;</span> 加载完成`</span>);</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123; <span class="comment">// api load</span></span><br><span class="line">      <span class="title function_">loadlive2d</span>(<span class="string">&quot;live2d&quot;</span>, <span class="string">`<span class="subst">$&#123;config.apiPath&#125;</span>get/?id=<span class="subst">$&#123;modelId&#125;</span>-<span class="subst">$&#123;modelTexturesId&#125;</span>`</span>);</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`Live2D 模型 <span class="subst">$&#123;modelId&#125;</span>-<span class="subst">$&#123;modelTexturesId&#125;</span> 加载完成`</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">modelSelection</span>(<span class="params">obj, textureId</span>) &#123;</span><br><span class="line">  <span class="keyword">if</span>(<span class="title class_">Array</span>.<span class="title function_">isArray</span>(obj))&#123;</span><br><span class="line">    <span class="keyword">if</span>(textureId &lt; obj.<span class="property">length</span>)&#123;</span><br><span class="line">      <span class="keyword">return</span> obj[textureId]</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> obj[<span class="title class_">Math</span>.<span class="title function_">floor</span>(<span class="title class_">Math</span>.<span class="title function_">random</span>() * obj.<span class="property">length</span>)]</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="样式优化"><a href="#样式优化" class="headerlink" title="样式优化"></a>样式优化</h2><p>我希望屏幕尺寸太小时不要显示看板娘，但是又不希望pc上改变浏览器尺寸会导致直接不加载，所以用css样式来实现。修改 <code>waifu.css</code> 。</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-width</span>: <span class="number">768px</span>) &#123;</span><br><span class="line"><span class="selector-id">#waifu</span> &#123;</span><br><span class="line"><span class="attribute">display</span>: none;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>另外，我也不希望鼠标移上去会浮动。</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#waifu</span> &#123;</span><br><span class="line"><span class="attribute">bottom</span>: -<span class="number">1000px</span>;</span><br><span class="line"><span class="attribute">left</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">line-height</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">margin-bottom</span>: -<span class="number">10px</span>;</span><br><span class="line"><span class="attribute">position</span>: fixed;</span><br><span class="line"><span class="comment">/* transform: translateY(3px);  注释掉 */</span></span><br><span class="line"><span class="attribute">transition</span>: transform .<span class="number">3s</span> ease-in-out, bottom <span class="number">3s</span> ease-in-out;</span><br><span class="line"><span class="attribute">z-index</span>: <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#waifu</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line"><span class="comment">/* transform: translateY(0);  注释掉 */</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>最后，记得把尺寸改成跟你的画布同样大小。</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#live2d</span> &#123;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">250px</span>;</span><br><span class="line"><span class="attribute">width</span>: <span class="number">250px</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="实现加载"><a href="#实现加载" class="headerlink" title="实现加载"></a>实现加载</h2><p>最后，在页面加载完成后执行加载代码就可以了。</p><p>其中的模型ID和材质ID可以通过这个页面去查找，<a href="https://github.com/Akilarlxh/live2d_api/blob/master/model_list.json">https://github.com/Akilarlxh/live2d_api&#x2F;blob&#x2F;master&#x2F;model_list.json</a>。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">window</span>.<span class="title function_">addEventListener</span>(<span class="string">&quot;load&quot;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="string">&quot;modelId&quot;</span>);</span><br><span class="line">  <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="string">&quot;modelTexturesId&quot;</span>);</span><br><span class="line">  <span class="keyword">let</span> state = <span class="number">0</span>, loading = <span class="literal">false</span>,</span><br><span class="line">    modelId = <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;modelId&quot;</span>),</span><br><span class="line">    modelTexturesId = <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&quot;modelTexturesId&quot;</span>);</span><br><span class="line">  <span class="keyword">if</span> (modelId === <span class="literal">null</span>) &#123;</span><br><span class="line">    modelId = <span class="number">3</span>;</span><br><span class="line">    modelTexturesId = <span class="number">20</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="title function_">loadModel</span>(modelId, modelTexturesId, config);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>锵锵，完成。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221218154314.png"></p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>其实总体来说还是挺简单的，主要是读懂代码，看看原作者的方法都在做什么就行了。</p><p>思路 &gt; 方法 &gt; 实现。</p><p>收工。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221218025850.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;修复博客问题的时候，发现加载 &lt;code&gt;Live2D&lt;/code&gt;</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="博客" scheme="https://www.gsgundam.com/tags/%E5%8D%9A%E5%AE%A2/"/>
    
    <category term="插件" scheme="https://www.gsgundam.com/tags/%E6%8F%92%E4%BB%B6/"/>
    
    <category term="修复" scheme="https://www.gsgundam.com/tags/%E4%BF%AE%E5%A4%8D/"/>
    
    <category term="plugin" scheme="https://www.gsgundam.com/tags/plugin/"/>
    
    <category term="配置" scheme="https://www.gsgundam.com/tags/%E9%85%8D%E7%BD%AE/"/>
    
    <category term="live2d" scheme="https://www.gsgundam.com/tags/live2d/"/>
    
    <category term="cdn" scheme="https://www.gsgundam.com/tags/cdn/"/>
    
    <category term="自定义" scheme="https://www.gsgundam.com/tags/%E8%87%AA%E5%AE%9A%E4%B9%89/"/>
    
    <category term="升级" scheme="https://www.gsgundam.com/tags/%E5%8D%87%E7%BA%A7/"/>
    
  </entry>
  
  <entry>
    <title>阿里云Apache虚拟主机利用.htaccess实现重定向</title>
    <link href="https://www.gsgundam.com/2022/2022-12-15-z10-aliyun-vps-apache-301-redirect-url/"/>
    <id>https://www.gsgundam.com/2022/2022-12-15-z10-aliyun-vps-apache-301-redirect-url/</id>
    <published>2022-12-15T02:30:00.000Z</published>
    <updated>2022-12-18T07:48:29.583Z</updated>
    
    <content type="html"><![CDATA[<p>之前做一个测试功能发现本地ok，一部署到线上就总是失效。Debug了好久，突然想到，会不会是域名解析的问题呢。然后试着加了www来访问，果然就对了。</p><p>自己确实经常都没有习惯加 <code>www</code> 前缀，而且相信也有不少人跟我一样。所以肯定是有必要处理相关问题的，毕竟当年做极风游官网的SEO的时候，为了搜索引擎能够更好的识别，只记住唯一域名，也是进行了跳转。极风游官网是基于域名解析的301重定向，而因为今天的测试环境是阿里云虚拟主机，所以需要用到.htaccess。</p><p><strong>这里需要特别注意，.htaccess 文件仅适用于 <code>Apache</code> 服务器，不适用于 <code>Nginx</code> 类服务器。</strong></p><h1 id="Apache服务器重定向"><a href="#Apache服务器重定向" class="headerlink" title="Apache服务器重定向"></a>Apache服务器重定向</h1><p>把下面内容写入到 <code>.htaccess</code> 文件，然后放到服务器根目录即可。</p><p>如果是重定向到带www的域名：</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">RewriteEngine</span> <span class="literal">On</span></span><br><span class="line"><span class="attribute">RewriteCond</span> <span class="variable">%&#123;HTTP_HOST&#125;</span> ^xjh.me<span class="meta"> [NC]</span></span><br><span class="line"><span class="attribute">RewriteRule</span> ^(.*)$ http://www.xjh.me/$<span class="number">1</span><span class="meta"> [L,R=301]</span></span><br></pre></td></tr></table></figure><p>如果是重定向到顶级域名：</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">RewriteEngine</span> <span class="literal">On</span></span><br><span class="line"><span class="attribute">RewriteCond</span> <span class="variable">%&#123;HTTP_HOST&#125;</span> !^xjh.me$<span class="meta"> [NC]</span></span><br><span class="line"><span class="attribute">RewriteRule</span> ^(.*)$ http://xjh.me/$<span class="number">1</span><span class="meta"> [L,R=301]</span></span><br></pre></td></tr></table></figure><h1 id="Nginx服务器重定向"><a href="#Nginx服务器重定向" class="headerlink" title="Nginx服务器重定向"></a>Nginx服务器重定向</h1><p>都说到这里了，不如就也说一下怎么处理Nginx的重定向。其实在Nginx的应用中，重定向是极其常见的，熟悉的朋友应该一点即通。直接在配置文件里加上下面内容即可。</p><p>如果是重定向到带www的域名：</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">server_name</span> example.com;</span><br><span class="line">    <span class="attribute">return</span> <span class="number">301</span> <span class="variable">$scheme</span>://www.example.com<span class="variable">$request_uri</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>如果是重定向到顶级域名：</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">server_name</span> www.example.com;</span><br><span class="line">    <span class="attribute">return</span> <span class="number">301</span> <span class="variable">$scheme</span>://example.com<span class="variable">$request_uri</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;之前做一个测试功能发现本地ok，一部署到线上就总是失效。Debug了好久，突然想到，会不会是域名解析的问题呢。然后试着加了www来访问，果然就对了。&lt;/p&gt;
&lt;p&gt;自己确实经常都没有习惯加 &lt;code&gt;www&lt;/code&gt; 前缀，而且相信也有不少人跟我一样。所以肯定是有必要</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="阿里云" scheme="https://www.gsgundam.com/tags/%E9%98%BF%E9%87%8C%E4%BA%91/"/>
    
    <category term="vps" scheme="https://www.gsgundam.com/tags/vps/"/>
    
    <category term="虚拟主机" scheme="https://www.gsgundam.com/tags/%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA/"/>
    
    <category term="apache" scheme="https://www.gsgundam.com/tags/apache/"/>
    
    <category term="nginx" scheme="https://www.gsgundam.com/tags/nginx/"/>
    
    <category term="重定向" scheme="https://www.gsgundam.com/tags/%E9%87%8D%E5%AE%9A%E5%90%91/"/>
    
    <category term="301" scheme="https://www.gsgundam.com/tags/301/"/>
    
    <category term="htacess" scheme="https://www.gsgundam.com/tags/htacess/"/>
    
    <category term="redirect" scheme="https://www.gsgundam.com/tags/redirect/"/>
    
    <category term="服务器" scheme="https://www.gsgundam.com/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>修复百度分享不支持https的问题</title>
    <link href="https://www.gsgundam.com/2022/2022-12-15-z09-fix-baidu-share-block-by-https-mixed/"/>
    <id>https://www.gsgundam.com/2022/2022-12-15-z09-fix-baidu-share-block-by-https-mixed/</id>
    <published>2022-12-15T01:30:00.000Z</published>
    <updated>2022-12-17T05:53:28.730Z</updated>
    
    <content type="html"><![CDATA[<p>在这次调试博客报错问题时发现百度分享的js文件，其实感觉挺奇怪的，因为在上次博客更新加入公众号链接之前，我还能正常看到百度分享的按钮。</p><p>上网查了下，百度分享不支持https由来已久，而且不只是百度分享，还有一些古早的百度托管的代码，都是属于死活不放到https链接里的。</p><p>解决办法倒也简单，把相关文件下载回来自己托管，修改Hexo模板的链接地址即可。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">window</span>.<span class="property">_bd_share_config</span>=&#123;</span><br><span class="line">    <span class="string">&quot;common&quot;</span>:&#123;</span><br><span class="line">        <span class="string">&quot;bdSnsKey&quot;</span>:&#123;&#125;,</span><br><span class="line">        <span class="string">&quot;bdText&quot;</span>:<span class="string">&quot;&quot;</span>,</span><br><span class="line">        <span class="string">&quot;bdMini&quot;</span>:<span class="string">&quot;2&quot;</span>,</span><br><span class="line">        <span class="string">&quot;bdMiniList&quot;</span>:<span class="literal">false</span>,</span><br><span class="line">        <span class="string">&quot;bdPic&quot;</span>:<span class="string">&quot;&quot;</span>,</span><br><span class="line">        <span class="string">&quot;bdStyle&quot;</span>:<span class="string">&quot;0&quot;</span>,</span><br><span class="line">        <span class="string">&quot;bdSize&quot;</span>:<span class="string">&quot;24&quot;</span></span><br><span class="line">    &#125;,<span class="string">&quot;share&quot;</span>:&#123;&#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="title function_">with</span>(<span class="variable language_">document</span>)<span class="number">0</span>[(<span class="title function_">getElementsByTagName</span>(<span class="string">&#x27;head&#x27;</span>)[<span class="number">0</span>]||body).<span class="title function_">appendChild</span>(<span class="title function_">createElement</span>(<span class="string">&#x27;script&#x27;</span>)).<span class="property">src</span>=<span class="string">&#x27;&lt;%- config.root %&gt;static/api/js/share.js?v=89860593.js?cdnversion=&#x27;</span>+~(-<span class="keyword">new</span> <span class="title class_">Date</span>()/<span class="number">36e5</span>)];</span><br><span class="line"></span><br><span class="line"><span class="comment">// 重点就是把路径改到本地根目录即可</span></span><br></pre></td></tr></table></figure><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221217135152.png"></p><p>需要注意的是，一定要将 <code>static</code> 文件夹放到根目录，因为它其中的文件依赖是写死的，要改的话得改一堆，特麻烦。</p><p>压缩包在网上可以直接搜索到。我也在 <a href="https://www.gsgunda.com/repository/">二机联盟-知识星球</a> 存了一份。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;在这次调试博客报错问题时发现百度分享的js文件，其实感觉挺奇怪的，因为在上次博客更新加入公众号链接之前，我还能正常看到百度分享的按钮。&lt;/p&gt;
&lt;p&gt;上网查了下，百度分享不支持https由来已久，而且不只是百度分享，还有一些古早的百度托管的代码，都是属于死活不放到https</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="博客" scheme="https://www.gsgundam.com/tags/%E5%8D%9A%E5%AE%A2/"/>
    
    <category term="插件" scheme="https://www.gsgundam.com/tags/%E6%8F%92%E4%BB%B6/"/>
    
    <category term="修复" scheme="https://www.gsgundam.com/tags/%E4%BF%AE%E5%A4%8D/"/>
    
    <category term="baidu" scheme="https://www.gsgundam.com/tags/baidu/"/>
    
    <category term="share" scheme="https://www.gsgundam.com/tags/share/"/>
    
    <category term="https" scheme="https://www.gsgundam.com/tags/https/"/>
    
    <category term="ssl" scheme="https://www.gsgundam.com/tags/ssl/"/>
    
    <category term="托管" scheme="https://www.gsgundam.com/tags/%E6%89%98%E7%AE%A1/"/>
    
  </entry>
  
  <entry>
    <title>修复Hexo图片弹出框Fancybox和评论插件Valine</title>
    <link href="https://www.gsgundam.com/2022/2022-12-14-z23-fix-hexo-error-fancybox-valine/"/>
    <id>https://www.gsgundam.com/2022/2022-12-14-z23-fix-hexo-error-fancybox-valine/</id>
    <published>2022-12-14T15:30:00.000Z</published>
    <updated>2022-12-18T05:12:33.299Z</updated>
    
    <content type="html"><![CDATA[<p>由于发现之前 <a href="https://www.gsgundam.com/2022/2022-12-12-z14-hexo-readmore-direct-to-wechat/">Hexo利用阅读更多的功能引流到微信公众号</a> 文章里提到的阅读更多插件在本地ok，但是在部署以后却没法正常运作，于是乎就开始F12的Debug旅程。这期间发现了无数问题，耗时半天多，怎一个惨字了得。接下来，让我们接下来几篇博文一一讲述 😢</p><p>F12让我发现了很多报错，最神奇的是居然报了 <code>av-min.js</code> 找不到，以及 <code>$(...).fancybox is not a function</code> 这两个错误。</p><h1 id="…-fancybox-is-not-a-function"><a href="#…-fancybox-is-not-a-function" class="headerlink" title="$(…).fancybox is not a function"></a>$(…).fancybox is not a function</h1><p>这就很意外了，因为最近除了增加阅读更多的功能，Hexo博客本身我是几乎没有做改动的。但是我也不确定是什么时候出现的问题，所以第一想法是希望能找到有关的修改。</p><p>通过查询git日志，也没有什么有价值的线索。只能开始转向别的线路，看试错+分析能不能奏效。</p><p>期间测试了如果用 <code>RequireJS</code> 来处理加载的依赖，会不会容易找到问题所在。但实际情况是，处理到一半，发现改动的地方实在太多，工作量性价比太低了，最后放弃引入requirejs。但这一尝试却让我意外地确定了引入CDN托管的 <code>fancybox v3.5.7</code> 是真的可以正常加载。</p><p>那么接下来就是换掉原来本地引用的fancybox库，并修改相关的运行代码，测试一下是否正常工作。</p><p>CDN地址，来自BootCDN：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">link</span> <span class="attr">href</span>=<span class="string">&quot;https://cdn.bootcdn.net/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.css&quot;</span> <span class="attr">rel</span>=<span class="string">&quot;stylesheet&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://cdn.bootcdn.net/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>然后我自己的主题没有在渲染的时候添加标签，是使用js后处理的图片弹出框。于是去掉了早期版本所使用的js调用，而是给标签加上 <code>data-fancybox</code> 属性。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">    $(<span class="variable language_">this</span>).<span class="title function_">find</span>(<span class="string">&#x27;.fancybox&#x27;</span>).<span class="title function_">each</span>(<span class="keyword">function</span>(<span class="params"></span>)&#123;</span><br><span class="line">-      $(<span class="variable language_">this</span>).<span class="title function_">attr</span>(<span class="string">&#x27;rel&#x27;</span>, <span class="string">&#x27;article&#x27;</span> + i);</span><br><span class="line">+      $(<span class="variable language_">this</span>).<span class="title function_">attr</span>(<span class="string">&#x27;data-fancybox&#x27;</span>, <span class="string">&#x27;article&#x27;</span> + i);</span><br><span class="line">    &#125;);</span><br><span class="line">  &#125;);</span><br><span class="line">-  <span class="keyword">if</span>($.fancybox)&#123;</span><br><span class="line">-    $(<span class="string">&#x27;.fancybox&#x27;</span>).<span class="title function_">fancybox</span>();</span><br><span class="line">-  &#125;</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>测试一切正常，Next。</p><h1 id="RequireJS"><a href="#RequireJS" class="headerlink" title="RequireJS"></a>RequireJS</h1><p>第一次真正使用 <code>RequireJS</code> 是在王老师团队里做区块链应用前端时，因为当时太懒不想学vue（说实在的，也是因为学了AngularJS以后，面目全非的2.0出来让我对这些迭代太快的新物种有所畏惧），就退而求其次，在原生js技术上引入一些小东西来构建自己更能把控的框架。而其中用来解决引用依赖的问题，就是 <code>RequireJS</code> 了。</p><p><code>RequireJS</code> 依赖于一个重要的概念，AMD。对于浏览器，同步加载是一个大问题，因为模块都放在服务器端，等待时间取决于网速的快慢，可能要等很长时间，浏览器处于”假死”状态。因此，浏览器端的模块，不能采用”同步加载”（synchronous），只能采用”异步加载”（asynchronous）。这就是AMD(Asynchronous Module Definition)规范诞生的背景。</p><h2 id="入口文件"><a href="#入口文件" class="headerlink" title="入口文件"></a>入口文件</h2><p>require.js在加载的时候会检查data-main属性，当RequireJS自身加载执行后，就会再次异步加载data-main属性指向的main.js。这个main.js是当前网页所有逻辑的入口，理想情况下，整个网页只需要这一个script标记，利用RequireJS加载依赖的其它文件。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;script data-main=<span class="string">&quot;scripts/main&quot;</span> src=<span class="string">&quot;js/require.js&quot;</span>&gt;&lt;/script&gt;</span><br></pre></td></tr></table></figure><h2 id="路径配置"><a href="#路径配置" class="headerlink" title="路径配置"></a>路径配置</h2><p>我比较惯于使用 <code>require.config</code> 进行统一配置，这样方便管理。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// main.js</span></span><br><span class="line"><span class="built_in">require</span>.<span class="title function_">config</span>(&#123;</span><br><span class="line">    <span class="attr">paths</span>:&#123;</span><br><span class="line">        <span class="string">&#x27;moduleA&#x27;</span>:<span class="string">&#x27;lib/moduleA.min&#x27;</span> <span class="comment">// 注意，不要带.js后缀</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br><span class="line"><span class="built_in">require</span>([<span class="string">&#x27;moduleA&#x27;</span>], <span class="keyword">function</span>(<span class="params">a</span>)&#123; <span class="comment">// 这里表示function里的方法依赖于moudleA，并输出为变量a</span></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(a);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="comment">//moduleA-min.js</span></span><br><span class="line"><span class="title function_">define</span>(<span class="keyword">function</span>(<span class="params"></span>)&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;I am A.&quot;</span>;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h2 id="shim"><a href="#shim" class="headerlink" title="shim"></a>shim</h2><p>有一些依赖于jQuery的插件本身是不符合AMD规范的，而shim配置就可以用来加载这些非规范的模块。例如：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">require</span>.<span class="title function_">config</span>(&#123;</span><br><span class="line">　　　　<span class="attr">shim</span>: &#123;</span><br><span class="line">　　　　　　<span class="string">&#x27;underscore&#x27;</span>:&#123;</span><br><span class="line">　　　　　　　　<span class="attr">exports</span>: <span class="string">&#x27;_&#x27;</span></span><br><span class="line">　　　　　　&#125;,</span><br><span class="line">　　　　　　<span class="string">&#x27;backbone&#x27;</span>: &#123;</span><br><span class="line">　　　　　　　　<span class="attr">deps</span>: [<span class="string">&#x27;underscore&#x27;</span>, <span class="string">&#x27;jquery&#x27;</span>],</span><br><span class="line">　　　　　　　　<span class="attr">exports</span>: <span class="string">&#x27;Backbone&#x27;</span></span><br><span class="line">　　　　　　&#125;</span><br><span class="line">　　　　&#125;</span><br><span class="line">　　&#125;);</span><br></pre></td></tr></table></figure><h2 id="加载其他文件"><a href="#加载其他文件" class="headerlink" title="加载其他文件"></a>加载其他文件</h2><p>通过插件的支持，requirejs还可以做到一些其他的事情，例如加载文本类文件：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">require</span>([<span class="string">&quot;some/module&quot;</span>, <span class="string">&quot;text!some/index.html&quot;</span>, <span class="string">&quot;text!some/style.css&quot;</span>],</span><br><span class="line">    <span class="keyword">function</span>(<span class="params"><span class="variable language_">module</span>, html, css</span>) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(...)</span><br><span class="line">    &#125;</span><br><span class="line">);</span><br></pre></td></tr></table></figure><p>当然，最后我并没有用到 <code>RequireJS</code>。我的主题是依赖于 <code>Jacman</code> 大改的，而它又是依赖于早期的 <code>Pacman</code> 主题，除了模板十分零碎以外，脚本也按功能拆成很独立的文件，使得按requirejs加载的方式来处理会很麻烦。</p><h1 id="av-min-js"><a href="#av-min-js" class="headerlink" title="av-min.js"></a>av-min.js</h1><p>刚看到报了 <code>av-min.js</code> 找不到的时候，我完全是懵的。因为实在不记得为什么会引用了 <code>av-min.js</code> 这个文件。当然，简单搜索项目，我就知道原来这是 <code>Valine</code> 所用到的 <code>LeanCloud</code> 基础库。</p><p><code>Valine</code> 是一款基于 <code>LeanCloud</code> 的快速、简洁且高效的无后端评论系统。搭建方便，无需梯子，而且小用量免费，实在是Hexo博客的不二之选。</p><p>如果没记错，10月份我还收到一条评论的邮件，但是此后就没有了。搜索了一下，是因为LeanCloud资源托管的域名和路径规则都变了，所以按理说引用这个新地址就可以了：</p><p><code>https://unpkg.com/leancloud-storage@4.12.2/dist/av-live-query-min.js</code></p><p>但是以防万一，我还是将文件下载下来，和Valine的文件一起放到了本地。网上可以直接搜索到，或者通过上面这个地址下载。我也在 <a href="https://www.gsgunda.com/repository/">二机联盟-知识星球</a> 存了一份。</p><h1 id="删除无用的配置和引用"><a href="#删除无用的配置和引用" class="headerlink" title="删除无用的配置和引用"></a>删除无用的配置和引用</h1><p>当然，清理了一下，发现还有很多代码和引用都没用了，该删的都删了，他们都有可能拖慢访问速度。</p><p>例如，<code>disqus</code>（墙外无法访问）、<code>duoshuo</code>（已经倒了）、<code>Baidu Image Plus</code>（已经下线）、<code>Baidu Share</code>（后来处理了一下，能用了，下一篇博文说）、<code>Live2D widget</code>（修复了一下，不然很多报错，也没有再使用hexo的配套插件，下下篇博文讲）。</p><p>最后看着干净的控制台输出和网络请求，终于安心了🧐</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;由于发现之前 &lt;a href=&quot;https://www.gsgundam.com/2022/2022-12-12-z14-hexo-readmore-direct-to-wechat/&quot;&gt;Hexo利用阅读更多的功能引流到微信公众号&lt;/a&gt; 文章里提到的阅读更多插件在本地ok</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="博客" scheme="https://www.gsgundam.com/tags/%E5%8D%9A%E5%AE%A2/"/>
    
    <category term="插件" scheme="https://www.gsgundam.com/tags/%E6%8F%92%E4%BB%B6/"/>
    
    <category term="fancybox" scheme="https://www.gsgundam.com/tags/fancybox/"/>
    
    <category term="valine" scheme="https://www.gsgundam.com/tags/valine/"/>
    
    <category term="lightbox" scheme="https://www.gsgundam.com/tags/lightbox/"/>
    
    <category term="图片弹出框" scheme="https://www.gsgundam.com/tags/%E5%9B%BE%E7%89%87%E5%BC%B9%E5%87%BA%E6%A1%86/"/>
    
    <category term="av-min" scheme="https://www.gsgundam.com/tags/av-min/"/>
    
    <category term="requirejs" scheme="https://www.gsgundam.com/tags/requirejs/"/>
    
    <category term="评论" scheme="https://www.gsgundam.com/tags/%E8%AF%84%E8%AE%BA/"/>
    
    <category term="修复" scheme="https://www.gsgundam.com/tags/%E4%BF%AE%E5%A4%8D/"/>
    
    <category term="plugin" scheme="https://www.gsgundam.com/tags/plugin/"/>
    
  </entry>
  
  <entry>
    <title>Hexo利用阅读更多的功能引流到微信公众号</title>
    <link href="https://www.gsgundam.com/2022/2022-12-12-z14-hexo-readmore-direct-to-wechat/"/>
    <id>https://www.gsgundam.com/2022/2022-12-12-z14-hexo-readmore-direct-to-wechat/</id>
    <published>2022-12-12T06:30:00.000Z</published>
    <updated>2022-12-12T11:11:54.050Z</updated>
    
    <content type="html"><![CDATA[<p>无意看到个小玩意，挺有意思。其实本来是要找一个文章同步的插件或者平台的，结果突然在他们这里发现个新功能：<a href="https://openwrite.cn/guide/readmore/readmore.html">OpenWrite-博客导流公众号</a>。</p><p>感觉还挺好用，整合起来也很方便，就来和大家分享一下。现在就可以向下滚动，看文章是不是已经被隐藏了一半？ 😄</p><p>简单来说，这个工具的主要功能是通过隐藏文章的部分内容，引导用户关注微信公众号，在回复相关关键词之后，可以获取解锁链接，用来把当前用户从网站引流到公众号。</p><h1 id="OpenWrite平台配置"><a href="#OpenWrite平台配置" class="headerlink" title="OpenWrite平台配置"></a>OpenWrite平台配置</h1><p>先去这个地址注册账号：<a href="http://admin.openwrite.cn/">http://admin.openwrite.cn/</a>。</p><p>然后到这里登录：<a href="https://readmore.openwrite.cn/login">https://readmore.openwrite.cn/login</a>。</p><p>我猜之所以会分成两个地址，大概率是之前没有考虑到会开发更多功能 😏</p><p>接着到 <code>配置页面</code> ，选择 <code>添加</code>。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221212153308.png" alt="添加博客"></p><p>填写完内容以后，就会出现使用指南，根据指南分别到 <strong>微信公众号</strong> 和 <strong>Hexo博客</strong> 进行设置即可。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221212153408.png" alt="使用指南"></p><p>注意，在博客设置的代码中，id部分后面一定要根据自己的主题进行修改，下一个部分我也会提及。</p><p>相信会看这篇文章的人，也大都在自己玩公众号了，怎么设置公众号的自动回复恐怕不用我多说。所以接下来看Hexo的配置。</p><h1 id="Hexo插件配置"><a href="#Hexo插件配置" class="headerlink" title="Hexo插件配置"></a>Hexo插件配置</h1><p>哦，我忘了，人家没有插件（皮一下😛）。</p><p>其实他家已经做得很方便了，只需要引入一个js，然后选用或者设置一个要隐藏容器的id就可以。</p><p>看官们留意一下，根据主题不同，要修改的模板类型也不同。我这里是ejs模板引擎，如果你使用的是 <code>NEXT</code> 一类的主题，那就应该是swig模板引擎，需要在 <code>themes/next/layout</code> 目录里找到 <code>_layout.swig</code></p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">main</span> <span class="attr">id</span>=<span class="string">&quot;main&quot;</span> <span class="attr">class</span>=<span class="string">&quot;main&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;main-inner&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;content-wrap&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;content&quot;</span> <span class="attr">class</span>=<span class="string">&quot;content&quot;</span>&gt;</span></span><br><span class="line">          &#123;% block content %&#125;&#123;% endblock %&#125;</span><br><span class="line">        <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p>这段代码中，<code>id=&quot;content&quot;</code> 就是我们的目标。然后在footer.swig一类的地方加入OpenWrite提供的js代码即可。</p><p>再例如我自己的Hexo主题里，就是ejs引擎，找到article.ejs，给 <code>&lt;div class=&quot;article-content&quot;&gt;&lt;/div&gt;</code> 加上 <code>id=&quot;article-body&quot;</code>。然后在末尾加上js代码。</p><p>不过我这里特殊处理了一下，因为我的大部分博文肯定是不会去隐藏内容的。所以我需要一个判断。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&lt;% if (item.readmore) &#123; %&gt;</span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://readmore.openwrite.cn/js/readmore.js&quot;</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">const</span> btw = <span class="keyword">new</span> <span class="title class_">BTWPlugin</span>();</span></span><br><span class="line"><span class="language-javascript">    btw.<span class="title function_">init</span>(&#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="attr">id</span>: <span class="string">&#x27;article-body&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">        <span class="attr">blogId</span>: <span class="string">&#x27;********&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">        <span class="attr">name</span>: <span class="string">&#x27;GSGUNDAM砍柴工&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">        <span class="attr">qrcode</span>: <span class="string">&#x27;********&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">        <span class="attr">keyword</span>: <span class="string">&#x27;fans&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">    &#125;);</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">&lt;% &#125; %&gt;</span><br></pre></td></tr></table></figure><p>也就是我在文章markdown文件的题头里加入 <code>readmore: true</code> 以后，才会隐藏内容。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;无意看到个小玩意，挺有意思。其实本来是要找一个文章同步的插件或者平台的，结果突然在他们这里发现个新功能：&lt;a href=&quot;https://openwrite.cn/guide/readmore/readmore.html&quot;&gt;OpenWrite-博客导流公众号&lt;/a&gt;。&lt;/p</summary>
      
    
    
    
    <category term="小插件" scheme="https://www.gsgundam.com/categories/%E5%B0%8F%E6%8F%92%E4%BB%B6/"/>
    
    
    <category term="博客" scheme="https://www.gsgundam.com/tags/%E5%8D%9A%E5%AE%A2/"/>
    
    <category term="微信" scheme="https://www.gsgundam.com/tags/%E5%BE%AE%E4%BF%A1/"/>
    
    <category term="Hexo" scheme="https://www.gsgundam.com/tags/Hexo/"/>
    
    <category term="引流" scheme="https://www.gsgundam.com/tags/%E5%BC%95%E6%B5%81/"/>
    
    <category term="导流" scheme="https://www.gsgundam.com/tags/%E5%AF%BC%E6%B5%81/"/>
    
    <category term="公众号" scheme="https://www.gsgundam.com/tags/%E5%85%AC%E4%BC%97%E5%8F%B7/"/>
    
    <category term="阅读更多" scheme="https://www.gsgundam.com/tags/%E9%98%85%E8%AF%BB%E6%9B%B4%E5%A4%9A/"/>
    
    <category term="readmore" scheme="https://www.gsgundam.com/tags/readmore/"/>
    
    <category term="插件" scheme="https://www.gsgundam.com/tags/%E6%8F%92%E4%BB%B6/"/>
    
  </entry>
  
  <entry>
    <title>怎样写出Axie Infinity的合约（二）</title>
    <link href="https://www.gsgundam.com/2022/2022-12-12-axie-contract-how-to-2/"/>
    <id>https://www.gsgundam.com/2022/2022-12-12-axie-contract-how-to-2/</id>
    <published>2022-12-11T16:30:00.000Z</published>
    <updated>2022-12-12T06:43:15.948Z</updated>
    
    <content type="html"><![CDATA[<p>回头一看，居然距离上次写Axie Infinity合约的文章过了整整一年了。这一年因为手头忙，杂事多，也没来得及更新。趁着家人都睡了，再来更新一波吧。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221211103313.png"></p><p>我们先来回顾一下目录结构：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">│  AxieAccessControl.sol</span><br><span class="line">│  AxieCore.sol</span><br><span class="line">│</span><br><span class="line">├─dependency</span><br><span class="line">│      AxieDependency.sol</span><br><span class="line">│      AxieManager.sol</span><br><span class="line">│      AxieManagerCustomizable.sol</span><br><span class="line">│</span><br><span class="line">├─erc721</span><br><span class="line">│      AxieERC721.sol</span><br><span class="line">│      AxieERC721BaseEnumerable.sol</span><br><span class="line">│      AxieERC721Metadata.sol</span><br><span class="line">│</span><br><span class="line">└─lifecycle</span><br><span class="line">       AxiePausable.sol</span><br><span class="line">       AxieUpgradeable.sol</span><br></pre></td></tr></table></figure><p>上次把erc721目录基本都讲到了，这也是最核心的部分。上一部分都了解了以后，基本的erc721结构已经清晰了。本来这次是打算先从权限部分来分析，但是出于我心理学专业的本能，我想如果是自己第一次看这个系列，现在更希望看到什么。我猜自己会希望更快的能发布我的NFT，所以这次我们直接先分析最核心文件<code>AxieCore.sol</code> <a href="https://github.com/axieinfinity/public-smart-contracts/blob/master/contracts/core/AxieCore.sol">文件链接：AxieCore.sol</a>。</p><h1 id="AxieCore-sol"><a href="#AxieCore-sol" class="headerlink" title="AxieCore.sol"></a>AxieCore.sol</h1><p>关于头部引入的的 <code>AxieERC721.sol</code> ，我们在上一篇已经讲过了，其作为核心依赖的合约，管理了基础数据（即直译过来的基础可枚举）和扩展属性（即直译过来的元数据）。我们现在更关心的是，Core这个合约它在这个基础上实现了什么功能。</p><p>我们来看第一部分：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// solium-disable-next-line no-empty-blocks</span></span><br><span class="line">contract <span class="title class_">AxieCore</span> is <span class="title class_">AxieERC721</span> &#123;</span><br><span class="line">  struct <span class="title class_">Axie</span> &#123;</span><br><span class="line">    uint256 genes;</span><br><span class="line">    uint256 bornAt;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="title class_">Axie</span>[] axies;</span><br></pre></td></tr></table></figure><p>有时候真是要感谢代码和命名规范，我们可以很清楚的看到，这个代码在一开始就声明了一个名为 <code>Axie</code> 的结构，它包含了一个256长度Int的基因密钥和一个256长度的出生标记。紧接着就声明了一个axies数组，想必是用来存放生成的axie。我们现在可以猜测，这个合约很可能是在制定一只Axie的生命周期和规则，然后把他们存起来。</p><p>下一部分就真正切入主题：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">  event <span class="title class_">AxieSpawned</span>(uint256 indexed _axieId, address indexed _owner, uint256 _genes);</span><br><span class="line">  event <span class="title class_">AxieRebirthed</span>(uint256 indexed _axieId, uint256 _genes);</span><br><span class="line">  event <span class="title class_">AxieRetired</span>(uint256 indexed _axieId);</span><br><span class="line">  event <span class="title class_">AxieEvolved</span>(uint256 indexed _axieId, uint256 _oldGenes, uint256 _newGenes);</span><br><span class="line"></span><br><span class="line">...</span><br><span class="line"></span><br><span class="line">  <span class="keyword">function</span> <span class="title function_">spawnAxie</span>(<span class="params"></span></span><br><span class="line"><span class="params">    uint256 _genes,</span></span><br><span class="line"><span class="params">    address _owner</span></span><br><span class="line"><span class="params">  </span>)</span><br><span class="line">    external</span><br><span class="line">    onlySpawner</span><br><span class="line">    <span class="title function_">whenSpawningAllowed</span>(_genes, _owner)</span><br><span class="line">    returns (uint256)</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="title function_">_spawnAxie</span>(_genes, _owner);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">...</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">_spawnAxie</span>(<span class="params">uint256 _genes, address _owner</span>) private returns (uint256 _axieId) &#123;</span><br><span class="line">    <span class="title class_">Axie</span> memory _axie = <span class="title class_">Axie</span>(_genes, now);</span><br><span class="line">    _axieId = axies.<span class="title function_">push</span>(_axie) - <span class="number">1</span>;</span><br><span class="line">    <span class="title function_">_mint</span>(_owner, _axieId);</span><br><span class="line">    <span class="title class_">AxieSpawned</span>(_axieId, _owner, _genes);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">...</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>我省略了不少地方，因为相较而言，我认为这里能够理解，接下来的东西也很好理解。这里更多的是去思考它为什么要做这种设计。这里我们重点放在事件和方法的关联上。可以看到第一个事件就是产卵 <code>event AxieSpawned</code> （可以理解成生成，但是这里理解成产卵更合适），我们往后看，它是通过 <code>_spawnAxie</code> 这个方法触发的。这个方法需要一个基因密钥和一个所有者地址，从而构造生成（铸造）一只axie，并把其id通过 <code>AxieSpawned</code> 事件广播出来。</p><p>当然， <code>_spawnAxie</code> 是个private私有方法，而有个专门供external外部调用的 <code>spawnAxie</code> 方法，它可以由拥有产卵权限的用户地址（同时还在被允许的产卵时间里）调用，从而返回所生成axie的信息，并广播事件。</p><p>这个逻辑理顺了，其他几个有关出生、死亡、进化等的事件和方法也就迎刃而解了。</p><p>还值得一提的是这段代码：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">getAxie</span>(<span class="params"></span></span><br><span class="line"><span class="params">  uint256 _axieId</span></span><br><span class="line"><span class="params"></span>)</span><br><span class="line">  external</span><br><span class="line">  view</span><br><span class="line">  <span class="title function_">mustBeValidToken</span>(_axieId)</span><br><span class="line">  returns (uint256 <span class="comment">/* _genes */</span>, uint256 <span class="comment">/* _bornAt */</span>)</span><br><span class="line">&#123;</span><br><span class="line">  <span class="title class_">Axie</span> storage _axie = axies[_axieId];</span><br><span class="line">  <span class="keyword">return</span> (_axie.<span class="property">genes</span>, _axie.<span class="property">bornAt</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这个方法几乎在所有的nft中都会出现，算是基础操作。咱总得有个获取已经生成的nft的方法，对吧？</p><h1 id="AxieAccessControl-sol"><a href="#AxieAccessControl-sol" class="headerlink" title="AxieAccessControl.sol"></a>AxieAccessControl.sol</h1><p>这个文件其实没什么好讲的，甚至如果比较轻型的团队或比较简单的合约，都会勿略掉权限控制部分。这里大概就是定义了各种各样的修饰器，例如 <code>onlyCEO</code>、<code>onlyCOO</code>、<code>onlyCLevel</code> 等等，用来控制某些关键操作只能由特定的账户地址来操作。</p><p>例如其中比较经典的：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">withdrawBalance</span>(<span class="params"></span>) external onlyCFO &#123;</span><br><span class="line">  cfoAddress.<span class="title function_">transfer</span>(<span class="variable language_">this</span>.<span class="property">balance</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这里就限制了只有CFO账户地址可以提取资产。</p><p>同理其实 <code>dependency/AxieDependency.sol</code> 这个合约也在做类似的事情。如果是类似的事情为什么会分成两个合约还放在归在不同的文件夹中呢？其实仔细分析就会知道，<code>AxieAccessControl</code> 是针对整个Axie Infinity系统而言的，而 <code>AxieDependency</code> 仅仅是针对某一只Axie而言的。</p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>其实讲到这里，Axie Infinity的公开合约中关于核心NFT资产部分也就没什么好分析的了。Core文件夹中的其他合约，都是一些修饰性的内容。而关于如何生成基因密钥，包括怀孕、产卵等比较关建的详细合约，都不在其中。</p><p>如果想要了解有关生成一个NFT的过程，可以参考 <code>CryptoKitties</code> 的相关代码，网上有很多公开的分析。当然，有需要，我也可以粗略分析一下。</p><p>如果想要了解有关NFT市场的代码，同理搜索 <code>CryptoKitties</code> 的相关信息，附带有讲到相关内容。当然，还是上面那句话，有需要我也可以粗略分析一下。</p><p>最后，本人学疏才浅，各位看官如果发现有任何问题或者遗漏，还请帮忙指出来，不胜感激。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;回头一看，居然距离上次写Axie Infinity合约的文章过了整整一年了。这一年因为手头忙，杂事多，也没来得及更新。趁着家人都睡了，再来更新一波吧。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="区块链" scheme="https://www.gsgundam.com/tags/%E5%8C%BA%E5%9D%97%E9%93%BE/"/>
    
    <category term="blockchain" scheme="https://www.gsgundam.com/tags/blockchain/"/>
    
    <category term="ethereum" scheme="https://www.gsgundam.com/tags/ethereum/"/>
    
    <category term="axie infinity" scheme="https://www.gsgundam.com/tags/axie-infinity/"/>
    
    <category term="axie" scheme="https://www.gsgundam.com/tags/axie/"/>
    
    <category term="合约" scheme="https://www.gsgundam.com/tags/%E5%90%88%E7%BA%A6/"/>
    
    <category term="智能合约" scheme="https://www.gsgundam.com/tags/%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6/"/>
    
    <category term="contract" scheme="https://www.gsgundam.com/tags/contract/"/>
    
  </entry>
  
  <entry>
    <title>或许超越常规自然语言处理的ChatGPT</title>
    <link href="https://www.gsgundam.com/2022/2022-12-11-meet-chatgpt-natural-language-processing-open-ai/"/>
    <id>https://www.gsgundam.com/2022/2022-12-11-meet-chatgpt-natural-language-processing-open-ai/</id>
    <published>2022-12-10T18:30:00.000Z</published>
    <updated>2022-12-11T02:45:36.377Z</updated>
    
    <content type="html"><![CDATA[<p>特别凑巧，这几天又被ChatGPT的消息刷屏了。上一次被AI刷屏还是图形方向的Stable Diffusion。而我提到AI在语言处理方面的尝试，还就在上个月 <a href="https://www.gsgundam.com/archive/2022-11-15-batman-written-by-ai/">《人工智能写的《蝙蝠侠》长什么样？》</a>。</p><p>为什么说凑巧呢？因为这段时间很纠结于游戏的内容生产问题，毕竟只有2个人做一个其实体量不算小的游戏，内容填充是个很大的问题。为了能够减小工作量的同时，保证游戏内容充实，设计上已经做了几次改版了。最近的想法就是用自然语言处理来解决事件和对话的问题，已经看了有一段时间并做了些实践了。</p><p>先说体验的结论吧，要实际应用起来应该说还有一定距离。<strong>但是带给人的震撼和想象力，已经足够了</strong>。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221211024422.png"></p><h1 id="什么是GPT？"><a href="#什么是GPT？" class="headerlink" title="什么是GPT？"></a>什么是GPT？</h1><p>GPT全称是“Generative Pre-Training”，直译过来就是“生成式预训练”。</p><p>而 Open AI GPT 是 OpenAI 团队在论文 <a href="https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf">《Improving Language Understanding by Generative Pre-Training》</a> 中提出的预训练语言模型。</p><p>现在常用的GPT模型是GPT-3。GPT-3的神经网络包含1750亿个参数，为有史以来参数最多的神经网络模型。OpenAI于发表GPT-3的论文后，在次月为少量公司与开发人团放出应用程序界面的测试版。微软在2020年9月22日宣布取得了GPT-3的独家授权。</p><p>基本上可以说，GPT-3目前是这个领域的一家独大。OpenAI也是这个领域的霸主地位。</p><h1 id="ChatGPT可以做什么？"><a href="#ChatGPT可以做什么？" class="headerlink" title="ChatGPT可以做什么？"></a>ChatGPT可以做什么？</h1><p>ChatGPT 是基于GPT-3.5模型的魔改。GPT-3.5和3.0的区别有几点，首先是和微软合作，在微软的Azure AI云服务器上完成了训练；另一个重要的区别是其训练数据集里除了文字，还加入了代码，因此 ChatGPT 现在已经可以写程序，甚至给现成的代码找bug了。</p><p>为什么试用过 ChatGPT 的同学都感觉提升很明显？一个重要的原因是 ChatGPT 引入了一个新的训练方法RLHF，见论文 <a href="https://arxiv.org/abs/2203.02155">《Training language models to follow instructions with human feedback》</a>，简单地说，就是用<strong>人类反馈的方式加强训练</strong>。</p><p>他们其实在最初的论文中就提及了一种新的训练方式，即半监督的方法：结合无监督的预训练和有监督的微调。就是这个半监督，成就了今天 ChatGPT 的震撼。</p><p>作为一个语言模型，ChatGPT 具备最基本的文本生成能力，在创作和续写小说、诗歌等文学创作场景上的表现不凡。</p><p>此外，它还能以非文本形式与人对话，甚至能够各种 emojis 的含义且能将其按照文本叙事的逻辑进行排列。</p><p>当然，更震撼的还在于 ChatGPT 能够帮助调试代码，并且还能对提问的合理性提出质疑，要求用户调整提问。以至于 Replit 的 CEO 也发帖称赞它的代码能力：不仅能够解释 bug，还能修复 bug 并解释如何修复。</p><p>但是恐怕最让人感到逆天的，是它强大的问答能力无不透露出其充当甚至代替搜索引擎的潜力。参见下图。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221211023153.png" alt="来自Goolge的结果"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221211023230.png" alt="来自ChatGPT的回答"></p><p>自己实际试用以后，确实感受到了强大，不仅仅在于它听懂了你字面上的意思，甚至能够理解语境的含义。也难怪有人让它来替自己跟Adobe的销售砍价。</p><p>当然，被举出来的例子都是完美的表现。其实它也有很多词不达意的时候，甚至你问的A领域的问题，它回答的是Z领域的建议。尽管瑕不掩瑜。</p><p>但，以上这些是否就是 ChatGPT 的终极目标？很难说，因为结合人们的想象力，它可以为视频AI提供脚本、可以为绘画AI指定描述词、可以为音乐AI提供乐谱风格……</p><h1 id="ChatGPT是否有替代品？"><a href="#ChatGPT是否有替代品？" class="headerlink" title="ChatGPT是否有替代品？"></a>ChatGPT是否有替代品？</h1><p>这是我给自己提出的很有意思的问题，也因此我才能在解决内容生产的道路上继续前行。</p><p>没错，GPT-3.5已经证明了它的强大，但是这并不影响已经足够应对一些非正式场景的GPT-3。而GPT-3已经有了开源平替，我已经初步验证完可行性的 <a href="https://github.com/EleutherAI/gpt-neo">GPT-Neo</a>。</p><p>如果说当年的 <code>Style2Paint</code> 和 <code>Stable-Diffusion</code> 让我眼前一亮， 那 <code>GPT-Neo</code> 算得上我现在手里的当红小生。</p><p>我不太清楚目前国内一些新兴的自然语言处理AI平台是基于什么技术，但是 <code>GPT-Neo</code> 经过自己的训练，完全可以实现同等效果。</p><p>它目前包含了三组模型：EleutherAI&#x2F;gpt-neo-2.7B（容量10G+，包含27亿参数）、EleutherAI&#x2F;gpt-neo-1.3B（容量5G+，包含13亿参数）、EleutherAI&#x2F;gpt-neo-125M（容量500Mb+，包含1.25亿参数）。最小的模型结果还是有点惨不忍睹，最大的模型在英文方面已经游刃有余。</p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>大概，AI的时代越来越近了。如果它们开始代替我们生产所有内容，那么我们还能多大程度上制定规则？</p><p>谁知道呢，总之我们现在需要它们来提升效率就对了 😀</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;特别凑巧，这几天又被ChatGPT的消息刷屏了。上一次被AI刷屏还是图形方向的Stable Diffusion。而我提到AI在语言处理方面的尝试，还就在上个月 &lt;a href=&quot;https://www.gsgundam.com/archive/2022-11-15-batm</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="技术" scheme="https://www.gsgundam.com/tags/%E6%8A%80%E6%9C%AF/"/>
    
    <category term="学习" scheme="https://www.gsgundam.com/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="笔记" scheme="https://www.gsgundam.com/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="chatgpt" scheme="https://www.gsgundam.com/tags/chatgpt/"/>
    
    <category term="gpt-3" scheme="https://www.gsgundam.com/tags/gpt-3/"/>
    
    <category term="gpt-neo" scheme="https://www.gsgundam.com/tags/gpt-neo/"/>
    
    <category term="openai" scheme="https://www.gsgundam.com/tags/openai/"/>
    
    <category term="open ai" scheme="https://www.gsgundam.com/tags/open-ai/"/>
    
    <category term="自然语言处理" scheme="https://www.gsgundam.com/tags/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/"/>
    
    <category term="语义分析" scheme="https://www.gsgundam.com/tags/%E8%AF%AD%E4%B9%89%E5%88%86%E6%9E%90/"/>
    
    <category term="人工智能" scheme="https://www.gsgundam.com/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    <category term="ai" scheme="https://www.gsgundam.com/tags/ai/"/>
    
  </entry>
  
  <entry>
    <title>Vue的Observer对象使用Object.assign转化为普通对象或数组</title>
    <link href="https://www.gsgundam.com/2022/2022-12-08-vue-observer-object-assign-covertion/"/>
    <id>https://www.gsgundam.com/2022/2022-12-08-vue-observer-object-assign-covertion/</id>
    <published>2022-12-08T04:30:00.000Z</published>
    <updated>2022-12-18T13:10:57.167Z</updated>
    
    <content type="html"><![CDATA[<p>每次做vue开发的时候都会遇到这个问题，这次记录下来。</p><h1 id="为什么要转换Observer对象"><a href="#为什么要转换Observer对象" class="headerlink" title="为什么要转换Observer对象"></a>为什么要转换Observer对象</h1><p>Vue2.6新增了observable函数，用于生成一个响应式对象。这个响应式对象即Observer对象。Observer对象主要用于触发DOM的更新。</p><p>也就是说，观察者模式的主要应用场景，是当一个变量值被修改时，可以自动通知所有关注这个变量的其他对象，自动重新更新获取这个变量的新值。</p><p>emmm，确实非常符合vue的特征。</p><p>但是这也带来一些弊端，很多时候我们习惯于拿到一个数据可以直接操作，或者至少像一些更严格点的语言，定义getter和setter。而Observer这种不能直接操作对象总是有点让人懵。</p><p>网上提供了一些解决思路。<strong>或许他们在某些情况下有用吧，但是我这里实测无效。</strong></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> parsedobj = <span class="title class_">JSON</span>.<span class="title function_">parse</span>(<span class="title class_">JSON</span>.<span class="title function_">stringify</span>(obj))</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(parsedobj)</span><br></pre></td></tr></table></figure><p>不得不说，js里也经常有些骚操作。但是我还是推荐更规范的做法，比如用 <code>Object.assign</code>。</p><h1 id="Object-assign是什么"><a href="#Object-assign是什么" class="headerlink" title="Object.assign是什么"></a>Object.assign是什么</h1><p>先看看ES6官方文档是怎么介绍的：</p><blockquote><p>Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。</p><p>简单来说，就是Object.assign()是对象的静态方法，可以用来复制对象的可枚举属性到目标对象，利用这个特性可以实现对象属性的合并。</p></blockquote><p>使用起来也很简单：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="title class_">Object</span>.<span class="title function_">assign</span>(target, ...sources)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 参数:  </span></span><br><span class="line"><span class="comment">//     target---&gt;目标对象</span></span><br><span class="line"><span class="comment">//     source---&gt;源对象</span></span><br><span class="line"><span class="comment">// 返回值：</span></span><br><span class="line"><span class="comment">//     target，即目标对象</span></span><br></pre></td></tr></table></figure><h1 id="举个例子-🌰"><a href="#举个例子-🌰" class="headerlink" title="举个例子 🌰"></a>举个例子 🌰</h1><p>基础用法：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> target = &#123;<span class="attr">name</span>:<span class="string">&#x27;lilei&#x27;</span>, <span class="attr">age</span>:<span class="number">40</span>&#125;;</span><br><span class="line"><span class="keyword">let</span> source = &#123;<span class="attr">state</span>:<span class="string">&#x27;single&#x27;</span>&#125;</span><br><span class="line"><span class="keyword">let</span> result = <span class="title class_">Object</span>.<span class="title function_">assign</span>(target, source);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(target, target==result);</span><br><span class="line"></span><br><span class="line"><span class="comment">// output: &#123;name:&#x27;lilei&#x27;, age:40, state:&#x27;single&#x27;&#125; true</span></span><br></pre></td></tr></table></figure><p>多个源对象与重名的情况：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> target = &#123;<span class="attr">name</span>:<span class="string">&#x27;lilei&#x27;</span>, <span class="attr">age</span>:<span class="number">40</span>&#125;;</span><br><span class="line"><span class="keyword">let</span> source1 = &#123;<span class="attr">state</span>:<span class="string">&#x27;single&#x27;</span>, <span class="attr">age</span>:<span class="number">39</span>&#125;</span><br><span class="line"><span class="keyword">let</span> source2 = &#123;<span class="attr">mood</span>:<span class="string">&#x27;happy&#x27;</span>&#125;</span><br><span class="line"><span class="keyword">let</span> result = <span class="title class_">Object</span>.<span class="title function_">assign</span>(target, source1, source2);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(target);</span><br><span class="line"></span><br><span class="line"><span class="comment">// output: &#123;name:&#x27;lilei&#x27;, age:39, state:&#x27;single&#x27;, mood:&#x27;happy&#x27;&#125;</span></span><br></pre></td></tr></table></figure><h1 id="实战解决数据操作"><a href="#实战解决数据操作" class="headerlink" title="实战解决数据操作"></a>实战解决数据操作</h1><p>针对oberser对象的情况，我们通常需要直接转换为普通对象或者数组。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 转换为对象</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">convert2Object</span>(<span class="params">source</span>)&#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="title class_">Object</span>.<span class="title function_">assign</span>(&#123;&#125;, source);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 转换为数组</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">convert2Array</span>(<span class="params">source</span>)&#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="title class_">Object</span>.<span class="title function_">assign</span>([], source);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>So easy，收工。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;每次做vue开发的时候都会遇到这个问题，这次记录下来。&lt;/p&gt;
&lt;h1 id=&quot;为什么要转换Observer对象&quot;&gt;&lt;a href=&quot;#为什么要转换Observer对象&quot; class=&quot;headerlink&quot; title=&quot;为什么要转换Observer对象&quot;&gt;&lt;/a&gt;为什么</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="技术" scheme="https://www.gsgundam.com/tags/%E6%8A%80%E6%9C%AF/"/>
    
    <category term="学习" scheme="https://www.gsgundam.com/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="笔记" scheme="https://www.gsgundam.com/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="vue" scheme="https://www.gsgundam.com/tags/vue/"/>
    
    <category term="observer" scheme="https://www.gsgundam.com/tags/observer/"/>
    
    <category term="观察者模式" scheme="https://www.gsgundam.com/tags/%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F/"/>
    
    <category term="observable" scheme="https://www.gsgundam.com/tags/observable/"/>
    
    <category term="assign" scheme="https://www.gsgundam.com/tags/assign/"/>
    
    <category term="object.assign" scheme="https://www.gsgundam.com/tags/object-assign/"/>
    
    <category term="对象" scheme="https://www.gsgundam.com/tags/%E5%AF%B9%E8%B1%A1/"/>
    
    <category term="数组" scheme="https://www.gsgundam.com/tags/%E6%95%B0%E7%BB%84/"/>
    
  </entry>
  
  <entry>
    <title>给Intel NUC Kit NUC8i7HVK冥王峡谷拆机更换硅脂</title>
    <link href="https://www.gsgundam.com/2022/2022-12-05-intel-nuc8i7hvk-replace-thermal-grease/"/>
    <id>https://www.gsgundam.com/2022/2022-12-05-intel-nuc8i7hvk-replace-thermal-grease/</id>
    <published>2022-12-04T12:30:00.000Z</published>
    <updated>2024-09-21T16:40:31.770Z</updated>
    
    <content type="html"><![CDATA[<p>最近都在家办公了，天天都在使用家里的NUC，天天都感觉在机场享受“引擎”的轰鸣。今天实在受不了了，抽了一些时间换了硅脂，顺便清理了一下灰尘。</p><p>Intel的<strong>nuc8i7hvk 冥王峡谷</strong>是一台很神奇的机型，使用的是我唯一见过的Intel和AMD合作搞的CPU。而且性能还算很不错的，当时入的二手，也不贵，很契合我开发+策划+美术的定位，性能很平衡。（唯独就是没法使用nvdia的cuda，所以无论跑 <code>style2paint</code> 还是 <code>stable diffusion</code> 都很吃力）</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221205201418.png"></p><p>搜了一下，B站上有个比较详细的拆机视频，这里就不放了，去搜索 <code>冥王峡谷 换硅脂</code> ，第一位肯定就是了。注意先完整看一遍，因为他有些期间无用的操作，自己实战的时候完全可以避免。</p><p>我这里就直接图文说明了，多图预警！</p><h1 id="流程"><a href="#流程" class="headerlink" title="流程"></a>流程</h1><p>1、第一步很简单，拆骷髅头一边的外壳面板，6颗螺丝，用H2.5内六角的起子即可。这里顺便把从金属板下面伸出来的白色的较宽的接头拆开。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk_0001.jpg"></p><p>2、这里有一颗螺丝，拆下之前不要蛮力去掰金属板。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk_0002.jpg"></p><p>3、将金属板垂直提起即可，如果侧边有点卡住的感觉，不要用力，稍稍调整位置就可以抽出来。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk_0003.jpg"></p><p>4、取下这根中网框架上伸出来的线。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk_0004.jpg"></p><p>5、取下中网框架。这里要小心一点，有的地方和接口处是有卡扣的，往外轻轻掰一下就能轻松解开。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk_0005.jpg"></p><p>6、两个端头各有一根从主板下方伸出来的风扇电源线，取掉。同时这步也把内存条取下来，避免操作中不小心损坏。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk_0006.jpg"></p><p>7、无线网卡有一根线从主板下方伸出来连接，正常情况下无线网卡是重叠安装在主硬盘下方的，需要先拧下螺丝取掉上层的硬盘，然后使用尖嘴钳之类的工具轻轻拧动留下来夹住网卡的螺栓，接着手动拧下，就可以取下网卡了。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk_0007.jpg"></p><p>8、这里也有一个螺栓，用刚才的方法取下来。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk_0008.jpg"></p><p>9、这个支架在取的时候一定保证四个螺丝轮流松动，以免支架变形。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk_0009.jpg"></p><p>10、图中这个地方还有一个螺丝，别直接开始抠主板下来。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk_0010.jpg"></p><p>11、现在是整个过程最需要技巧的地方，四个指头轻轻抬起图中主板朝上的一边，两个大拇指分别向下轻靠上方的两个橙色圆孔处。（图中是我已经取下来了，实际上没有取下之前，橙色圆孔处是伸出来的黑色螺栓）</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk_0011.jpg"></p><p>12、主板拿下来的瞬间真是惨不忍睹。硅脂已经完全干了，跟蛋壳似的能碎掉。风扇的位置全是灰尘，灰尘都结成团了，拿出来都不散的那种……</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk_0012.jpg"></p><p>13、拆下风扇和散热板，清理完所有的部件，准备涂硅脂。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk_0013.jpg"></p><p>14、大致涂好硅脂，按刚才拆开的步骤反向顺序安回去。注意线材不要被框架和主板压住。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/nuc8i7hvk_0014.jpg"></p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>这种小主机真的结构非常密集，而且很特殊，拆之前一定先查资料。</p><p>重新安装以后，机场的感觉没有消失，但是明显温度和噪音都变小了。大概是因为我同时开了一大堆东西吧，毕竟各个职位的事情都得做。也辛苦这个小玩意了😛</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近都在家办公了，天天都在使用家里的NUC，天天都感觉在机场享受“引擎”的轰鸣。今天实在受不了了，抽了一些时间换了硅脂，顺便清理了一下灰尘。&lt;/p&gt;
&lt;p&gt;Intel的&lt;strong&gt;nuc8i7hvk 冥王峡谷&lt;/strong&gt;是一台很神奇的机型，使用的是我唯一见过的In</summary>
      
    
    
    
    <category term="DIY实战" scheme="https://www.gsgundam.com/categories/DIY%E5%AE%9E%E6%88%98/"/>
    
    
    <category term="冥王峡谷" scheme="https://www.gsgundam.com/tags/%E5%86%A5%E7%8E%8B%E5%B3%A1%E8%B0%B7/"/>
    
    <category term="nuc8i7hvk" scheme="https://www.gsgundam.com/tags/nuc8i7hvk/"/>
    
    <category term="intel nuc" scheme="https://www.gsgundam.com/tags/intel-nuc/"/>
    
    <category term="nuc" scheme="https://www.gsgundam.com/tags/nuc/"/>
    
    <category term="散热硅脂" scheme="https://www.gsgundam.com/tags/%E6%95%A3%E7%83%AD%E7%A1%85%E8%84%82/"/>
    
    <category term="硅脂" scheme="https://www.gsgundam.com/tags/%E7%A1%85%E8%84%82/"/>
    
    <category term="拆机" scheme="https://www.gsgundam.com/tags/%E6%8B%86%E6%9C%BA/"/>
    
    <category term="更换" scheme="https://www.gsgundam.com/tags/%E6%9B%B4%E6%8D%A2/"/>
    
    <category term="迷你主机" scheme="https://www.gsgundam.com/tags/%E8%BF%B7%E4%BD%A0%E4%B8%BB%E6%9C%BA/"/>
    
    <category term="微型主机" scheme="https://www.gsgundam.com/tags/%E5%BE%AE%E5%9E%8B%E4%B8%BB%E6%9C%BA/"/>
    
    <category term="diy" scheme="https://www.gsgundam.com/tags/diy/"/>
    
    <category term="hades canyon" scheme="https://www.gsgundam.com/tags/hades-canyon/"/>
    
    <category term="thermal grease" scheme="https://www.gsgundam.com/tags/thermal-grease/"/>
    
    <category term="grease" scheme="https://www.gsgundam.com/tags/grease/"/>
    
  </entry>
  
  <entry>
    <title>使用python把所有hexo博客文章同步到微信公众号</title>
    <link href="https://www.gsgundam.com/2022/2022-12-04-python-sync-hexo-to-wechat/"/>
    <id>https://www.gsgundam.com/2022/2022-12-04-python-sync-hexo-to-wechat/</id>
    <published>2022-12-04T00:30:00.000Z</published>
    <updated>2022-12-05T12:16:38.961Z</updated>
    
    <content type="html"><![CDATA[<p>对我个人而言，最快的学习方式都是一边用一边学，于是继一年前通过9块9的在线课程入门后，最近半年都在频繁使用python开发一些小工具。</p><p>python真的是个有趣的东西，在以前真的很难想象，我在学习和工作的同时，后台还跑着两个刚入门的我写的程序，不停的帮我自动处理各种数据。</p><p>最近自己的两个小项目觉得都特别有意义，决定把hexo同步文章到公众号这个分享出来。相信对很多人而言，比我更有用处（毕竟我只会玩点技术，运营就是渣渣）。</p><p>这篇文章重点参考了 <a href="https://blog.csdn.net/kylequ5521/article/details/122033921">Python爬取网上文章并发表到微信公众号</a> ，我针对接口调整和自己实际情况，进行了一些调整。感谢作者的分享。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221205201622.png"></p><h1 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h1><h2 id="设计结构"><a href="#设计结构" class="headerlink" title="设计结构"></a>设计结构</h2><p>由于之前的实践，我先做了一种假设：</p><p>1、在本地运行hexo，然后通过 <code>requests</code> 和 <code>BeautifulSoup</code> 爬取和解析列表存到本地sqlite数据库，然后内容和样式爬下来；</p><p>2、将相关图片从对象存储下载下来，调用公众号接口上传到微信公众号素材；</p><p>3、组装好所有内容，调用公众号接口上传到草稿箱；</p><p>4、确认内容，调用公众号接口发布。</p><p>这里面有个问题，是后面才发现的，所以实际上的流程并不是这样，下面我会说。</p><h2 id="验证设想"><a href="#验证设想" class="headerlink" title="验证设想"></a>验证设想</h2><p>设想有了，就构造各种方法，每个方法都测试一下。</p><p>验证过程就省略了，说下最后的流程和如此选择的原因。</p><p>实际上我从本地运行的hexo站点爬完所有内容进行测试的时候，本希望直接上传爬到的样式，公众号就能够完美呈现。然而我想多了，很多样式会被吃掉，而且有的样式在公众号呈现的结果和网页并不一样。</p><p>因此，我最后选择了直接用本地的markdown文件解析为最基本的html文档结构，然后参照 <a href="https://editor.mdnice.com/?outId=18a046ec060f406fa88b528fe179a2c6">mdnice</a> 的样式以及微信公众号自带编辑器的样式，对html重新定义样式。</p><p>那么废话少说，开工。</p><h1 id="实践"><a href="#实践" class="headerlink" title="实践"></a>实践</h1><h2 id="抓取、构造数据"><a href="#抓取、构造数据" class="headerlink" title="抓取、构造数据"></a>抓取、构造数据</h2><p>首先是爬取列表，定义一个获取列表内容的方法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># coding:utf-8</span></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> yaml</span><br><span class="line"><span class="keyword">import</span> sqlite3</span><br><span class="line"><span class="keyword">import</span> logging</span><br><span class="line"><span class="keyword">import</span> logging.config</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> my_fake_useragent <span class="keyword">import</span> UserAgent</span><br><span class="line"><span class="keyword">from</span> bs4 <span class="keyword">import</span> BeautifulSoup</span><br><span class="line"></span><br><span class="line"><span class="comment"># 静态配置都放在额外的文件中</span></span><br><span class="line">config_file = <span class="built_in">open</span>(<span class="string">&#x27;config.yml&#x27;</span>, encoding=<span class="string">&quot;utf-8&quot;</span>)</span><br><span class="line">conf = yaml.safe_load(config_file)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">getPostList</span>():</span><br><span class="line">    posts_arr = []</span><br><span class="line">    index = <span class="number">0</span></span><br><span class="line">    <span class="built_in">max</span> = conf[<span class="string">&quot;source&quot;</span>][<span class="string">&quot;max_page&quot;</span>] <span class="comment"># 这里控制了每次最多爬多少页，没有必要每次都全部跑一遍</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, <span class="built_in">max</span>):</span><br><span class="line">        list_url = conf[<span class="string">&quot;source&quot;</span>][<span class="string">&quot;url&quot;</span>]+<span class="string">&#x27;page/%s&#x27;</span>%(i)</span><br><span class="line">        <span class="keyword">if</span> i == <span class="number">1</span>:</span><br><span class="line">            list_url = conf[<span class="string">&quot;source&quot;</span>][<span class="string">&quot;url&quot;</span>]</span><br><span class="line">        r = requests.get(list_url, headers=getRandomUA(), verify=<span class="literal">False</span>)</span><br><span class="line">        root = BeautifulSoup(r.content, <span class="string">&#x27;html.parser&#x27;</span>)</span><br><span class="line">        node_arr = root.select(<span class="string">&#x27;#main section.post a&#x27;</span>) <span class="comment"># 这里根据自己的主题因人而异，我是自己的一个主题</span></span><br><span class="line">        <span class="keyword">for</span> node <span class="keyword">in</span> node_arr:</span><br><span class="line">            date_str = node.time.text.replace(<span class="string">&#x27;年&#x27;</span>, <span class="string">&#x27;-&#x27;</span>).replace(<span class="string">&#x27;月&#x27;</span>, <span class="string">&#x27;-&#x27;</span>).replace(<span class="string">&#x27;日&#x27;</span>, <span class="string">&#x27;&#x27;</span>)</span><br><span class="line">            timeArray = time.strptime(date_str, <span class="string">&quot;%Y-%m-%d&quot;</span>)</span><br><span class="line">            ret = <span class="built_in">int</span>(time.mktime(timeArray)) <span class="comment"># 这里记录的时间主要用来做上传草稿和发布文章时候的排序</span></span><br><span class="line">            posts_arr.append(&#123;<span class="string">&#x27;url&#x27;</span>: node.attrs[<span class="string">&#x27;href&#x27;</span>], <span class="string">&#x27;title&#x27;</span>: node.h1.text, <span class="string">&#x27;summury&#x27;</span>: node.p.text, <span class="string">&#x27;time&#x27;</span>: ret, <span class="string">&#x27;date&#x27;</span>: date_str, <span class="string">&#x27;index&#x27;</span>: index&#125;)</span><br><span class="line">            index += <span class="number">1</span></span><br><span class="line">    posts_arr.sort(key=posts_sort, reverse=<span class="literal">True</span>)</span><br><span class="line">    <span class="keyword">for</span> post <span class="keyword">in</span> posts_arr:</span><br><span class="line">        insert2Db(post[<span class="string">&#x27;url&#x27;</span>], post[<span class="string">&#x27;title&#x27;</span>], post[<span class="string">&#x27;summury&#x27;</span>], post[<span class="string">&#x27;time&#x27;</span>]) <span class="comment"># 这里是调用的一个定义好的sqlite方法插入数据，这里对数据库操作就不赘述了</span></span><br><span class="line">    logger.info(<span class="string">&#x27;All posts inserted!&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 对爬取到的所有文章进行排序</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">posts_sort</span>(<span class="params">k</span>):</span><br><span class="line">    <span class="keyword">return</span> k[<span class="string">&#x27;index&#x27;</span>]</span><br></pre></td></tr></table></figure><p>接下来按列表来爬取详情，特别说明一下，这里的 <code>formatApiHighlight</code> 方法是调用了一个接口来格式化代码高亮，实际上本地是可以用 <code>pygments</code> 库来处理的，处理完后把css样式代码赋值给html代码即可。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># max_posts是每次用户操作允许处理的文章数量，没有写在config里面，由用户自己输入</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">dealPostList</span>(<span class="params">max_posts</span>): </span><br><span class="line">    cur = con.cursor()</span><br><span class="line">    index = <span class="number">0</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        cur.execute(<span class="string">&#x27;select url,summury,title,time from posts where complete is null order by time&#x27;</span>)</span><br><span class="line">        results = cur.fetchall()</span><br><span class="line">        logger.info(<span class="string">&#x27;共查询到&#123;&#125;篇需要上传草稿的文章，预计将要处理&#123;&#125;篇&#x27;</span>.<span class="built_in">format</span>(<span class="built_in">len</span>(results), max_posts <span class="keyword">if</span> max_posts &gt; -<span class="number">1</span> <span class="keyword">else</span> <span class="built_in">len</span>(results)))</span><br><span class="line">        <span class="keyword">for</span> result <span class="keyword">in</span> results:</span><br><span class="line">            logger.info(<span class="string">&#x27;开始处理第&#123;&#125;篇需要上传草稿的文章&#x27;</span>.<span class="built_in">format</span>(index+<span class="number">1</span>))</span><br><span class="line">            md_file_path = conf[<span class="string">&quot;source&quot;</span>][<span class="string">&quot;system_path&quot;</span>] + result[<span class="number">0</span>].strip(<span class="string">&quot;/&quot;</span>)</span><br><span class="line">            <span class="keyword">if</span> os.path.exists(md_file_path + <span class="string">&#x27;.md&#x27;</span>):</span><br><span class="line">                md_file_path += <span class="string">&#x27;.md&#x27;</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                md_file_path += <span class="string">&#x27;.markdown&#x27;</span></span><br><span class="line">            <span class="keyword">with</span> <span class="built_in">open</span>(md_file_path, <span class="string">&#x27;r&#x27;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">                text = f.read()</span><br><span class="line">            html_content = mistune.html(text)</span><br><span class="line">            <span class="comment"># 根据hexo文件的结构特征，处理掉头部信息</span></span><br><span class="line">            key_word = <span class="string">&#x27;&lt;hr/&gt;&#x27;</span></span><br><span class="line">            html_content = html_content[html_content.find(key_word)+<span class="built_in">len</span>(key_word):]</span><br><span class="line">            key_word = <span class="string">&#x27;&lt;hr /&gt;&#x27;</span></span><br><span class="line">            html_content = html_content[html_content.find(key_word)+<span class="built_in">len</span>(key_word):]</span><br><span class="line">            root = BeautifulSoup(html_content, <span class="string">&#x27;html.parser&#x27;</span>)</span><br><span class="line">            title = result[<span class="number">2</span>]</span><br><span class="line">            content_arr = root.find_all(recursive=<span class="literal">False</span>)</span><br><span class="line">            logger.info(<span class="string">&quot;初步处理的Html原始内容：&quot;</span>+<span class="built_in">str</span>(content_arr))</span><br><span class="line">            new_content_arr = [] <span class="comment"># 新建数组用来存放新的节点组成，因为code和pre节点比较特殊</span></span><br><span class="line">            <span class="keyword">for</span> content <span class="keyword">in</span> content_arr:</span><br><span class="line">                new_node = content</span><br><span class="line">                <span class="comment">#这里根据不同内容来添加样式</span></span><br><span class="line">                <span class="keyword">if</span> content.name == <span class="string">&#x27;p&#x27;</span>:</span><br><span class="line">                    content.attrs[<span class="string">&#x27;style&#x27;</span>] = <span class="string">&quot;padding-top: 8px; padding-bottom: 8px; line-height: 26px;&quot;</span></span><br><span class="line">                    <span class="keyword">if</span> content.img:</span><br><span class="line">                        content.attrs[<span class="string">&#x27;mpa-paragraph-type&#x27;</span>] = <span class="string">&quot;image&quot;</span></span><br><span class="line">                        content.attrs[<span class="string">&#x27;align&#x27;</span>] = <span class="string">&quot;center&quot;</span></span><br><span class="line">                    <span class="keyword">else</span>:</span><br><span class="line">                        content.attrs[<span class="string">&#x27;mpa-paragraph-type&#x27;</span>] = <span class="string">&quot;body&quot;</span></span><br><span class="line">                    <span class="keyword">if</span> content.code:</span><br><span class="line">                        content.code.attrs[<span class="string">&#x27;style&#x27;</span>] = <span class="string">&quot;font-size: 14px; padding: 2px 4px; border-radius: 4px; margin-right: 2px; margin-left: 2px; color: rgb(30, 107, 184); background-color: rgba(27, 31, 35, 0.05); font-family: &amp;quot;Operator Mono&amp;quot;, Consolas, Monaco, Menlo, monospace; word-break: break-all;&quot;</span></span><br><span class="line">                <span class="keyword">elif</span> content.name == <span class="string">&#x27;blockquote&#x27;</span>:</span><br><span class="line">                    content.attrs[<span class="string">&#x27;style&#x27;</span>] = <span class="string">&quot;border-top: none; border-right: none; border-bottom: none; font-size: 0.9em; overflow: auto; border-left-color: rgba(0, 0, 0, 0.4); background: rgba(0, 0, 0, 0.05); color: rgb(106, 115, 125); padding: 10px 10px 10px 20px; margin-bottom: 20px; margin-top: 20px;&quot;</span></span><br><span class="line">                    content.attrs[<span class="string">&#x27;mpa-paragraph-type&#x27;</span>] = <span class="string">&quot;quote&quot;</span></span><br><span class="line">                    content.attrs[<span class="string">&#x27;class&#x27;</span>] = <span class="string">&quot;multiquote-1&quot;</span></span><br><span class="line">                <span class="keyword">elif</span> content.name == <span class="string">&#x27;code&#x27;</span>:</span><br><span class="line">                    lexer = <span class="string">&#x27;bash&#x27;</span></span><br><span class="line">                    <span class="keyword">if</span> content.has_attr(<span class="string">&#x27;class&#x27;</span>) <span class="keyword">and</span> <span class="string">&#x27;language-&#x27;</span> <span class="keyword">in</span> content.attrs[<span class="string">&#x27;class&#x27;</span>]:</span><br><span class="line">                        lexer = content.attrs[<span class="string">&#x27;class&#x27;</span>][content.attrs[<span class="string">&#x27;class&#x27;</span>].rindex(<span class="string">&#x27;-&#x27;</span>)+<span class="number">1</span>:]</span><br><span class="line">                    new_node = formatApiHighlight(content, lexer)</span><br><span class="line">                    <span class="keyword">if</span> <span class="keyword">not</span> new_node:</span><br><span class="line">                        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">                <span class="keyword">elif</span> content.name == <span class="string">&#x27;pre&#x27;</span>:</span><br><span class="line">                    <span class="keyword">if</span> content.code:</span><br><span class="line">                        lexer = <span class="string">&#x27;bash&#x27;</span></span><br><span class="line">                        <span class="keyword">if</span> content.code.has_attr(<span class="string">&#x27;class&#x27;</span>) <span class="keyword">and</span> <span class="string">&#x27;language-&#x27;</span> <span class="keyword">in</span> content.code.attrs[<span class="string">&#x27;class&#x27;</span>]:</span><br><span class="line">                            lexer = content.code.attrs[<span class="string">&#x27;class&#x27;</span>][content.code.attrs[<span class="string">&#x27;class&#x27;</span>].rindex(<span class="string">&#x27;-&#x27;</span>)+<span class="number">1</span>:] </span><br><span class="line">                        new_node = formatApiHighlight(content.code, lexer)</span><br><span class="line">                        <span class="keyword">if</span> <span class="keyword">not</span> new_node:</span><br><span class="line">                            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">                <span class="keyword">elif</span> content.name == <span class="string">&#x27;h1&#x27;</span>:</span><br><span class="line">                    content.attrs[<span class="string">&#x27;style&#x27;</span>] = <span class="string">&quot;margin-top: 30px; margin-bottom: 15px; font-weight: bold; font-size: 24px;&quot;</span></span><br><span class="line">                <span class="keyword">elif</span> content.name == <span class="string">&#x27;h2&#x27;</span>:</span><br><span class="line">                    content.attrs[<span class="string">&#x27;style&#x27;</span>] = <span class="string">&quot;margin-top: 30px; margin-bottom: 15px; font-weight: bold; font-size: 22px;&quot;</span></span><br><span class="line">                <span class="keyword">elif</span> content.name == <span class="string">&#x27;h3&#x27;</span>:</span><br><span class="line">                    content.attrs[<span class="string">&#x27;style&#x27;</span>] = <span class="string">&quot;margin-top: 30px; margin-bottom: 15px; font-weight: bold; font-size: 20px;&quot;</span></span><br><span class="line">                </span><br><span class="line">                <span class="keyword">if</span> <span class="keyword">not</span> new_node:</span><br><span class="line">                    new_content_arr.append(content)</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    new_content_arr.append(new_node)</span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">len</span>(new_content_arr) &lt; <span class="number">1</span>:</span><br><span class="line">                logger.exception(<span class="string">&#x27;新内容节点数太少，请检查问题！&#x27;</span>)</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">            res = dealPostDetail(title, result[<span class="number">1</span>], new_content_arr, conf[<span class="string">&quot;source&quot;</span>][<span class="string">&quot;public_url&quot;</span>]+result[<span class="number">0</span>])</span><br><span class="line">            <span class="keyword">if</span> res:</span><br><span class="line">                markAsComplete(result[<span class="number">0</span>], res) <span class="comment"># 这里是调用的一个定义好的sqlite标记完成</span></span><br><span class="line">                index += <span class="number">1</span></span><br><span class="line">            <span class="keyword">if</span> max_posts &gt; -<span class="number">1</span> <span class="keyword">and</span> index &gt;= max_posts:</span><br><span class="line">                exit()</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        logger.exception(<span class="string">&#x27;文章内容处理失败&#x27;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><h2 id="组织草稿内容"><a href="#组织草稿内容" class="headerlink" title="组织草稿内容"></a>组织草稿内容</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">dealPostDetail</span>(<span class="params">title, summury, content_arr, origin_url</span>):</span><br><span class="line">    logger.info(<span class="string">&quot;======================================&quot;</span>)</span><br><span class="line">    logger.info(<span class="string">&#x27;开始处理[标题]《&#123;&#125;》的文章...&#x27;</span>.<span class="built_in">format</span>(title))</span><br><span class="line">    <span class="comment">#循环content_arr，处理图片</span></span><br><span class="line">    <span class="comment">#定义一个封面图变量，以便后面处理</span></span><br><span class="line">    cover_id = <span class="literal">None</span></span><br><span class="line">    s = requests.session()</span><br><span class="line">    s.keep_alive=<span class="literal">False</span></span><br><span class="line">    <span class="keyword">for</span> content <span class="keyword">in</span> content_arr:</span><br><span class="line">        <span class="comment"># 处理一下外链问题，未认证公众号不允许外链</span></span><br><span class="line">        link_node = content.a</span><br><span class="line">        <span class="keyword">if</span> link_node:</span><br><span class="line">            <span class="keyword">del</span> content.a[<span class="string">&quot;href&quot;</span>]</span><br><span class="line">        <span class="comment"># 查看是否有图片节点。由于解析出的markdown肯定一个p节点只有一张图片，不用处理数组的做法</span></span><br><span class="line">        img_node = content.img</span><br><span class="line">        <span class="keyword">if</span> img_node:</span><br><span class="line">            <span class="comment">#下载相关图片</span></span><br><span class="line">            logger.info(<span class="string">&quot;图片节点信息：&quot;</span>+<span class="built_in">str</span>(img_node))</span><br><span class="line">            logger.info(<span class="string">&quot;开始处理图片[url]&#123;&#125;...&quot;</span>.<span class="built_in">format</span>(img_node[<span class="string">&#x27;src&#x27;</span>]))</span><br><span class="line">            src_url = img_node[<span class="string">&#x27;src&#x27;</span>]</span><br><span class="line">            a = urlparse(src_url)</span><br><span class="line">            file_name = os.path.basename(a.path)</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(<span class="string">&quot;tmp&quot;</span>):</span><br><span class="line">                os.mkdir(<span class="string">&quot;tmp&quot;</span>)</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(<span class="string">&quot;tmp/images&quot;</span>):</span><br><span class="line">                os.mkdir(<span class="string">&quot;tmp/images&quot;</span>)</span><br><span class="line">            img_path = <span class="string">&#x27;tmp/images/&#x27;</span>+file_name</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(img_path):</span><br><span class="line">                <span class="keyword">try</span>:</span><br><span class="line">                    tmp = s.get(src_url, stream=<span class="literal">True</span>, headers=getRandomUA())</span><br><span class="line">                    <span class="keyword">if</span> <span class="built_in">str</span>(tmp) == <span class="string">&#x27;&lt;Response [200]&gt;&#x27;</span>:</span><br><span class="line">                        <span class="keyword">with</span> <span class="built_in">open</span>(img_path, <span class="string">&#x27;wb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">                            f.write(tmp.content)</span><br><span class="line">                    <span class="keyword">else</span>:</span><br><span class="line">                        logger.info(<span class="string">&quot;博客图片下载失败：&quot;</span>+src_url)</span><br><span class="line">                        <span class="keyword">continue</span></span><br><span class="line">                <span class="keyword">except</span>:</span><br><span class="line">                    logger.exception(<span class="string">&quot;博客图片下载失败：&quot;</span>+src_url)</span><br><span class="line">                    <span class="keyword">continue</span></span><br><span class="line">            image_valid = imageBrokenCheck(img_path)</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> image_valid:</span><br><span class="line">                os.remove(img_path)</span><br><span class="line">                <span class="keyword">continue</span></span><br><span class="line">            <span class="comment"># 如果cover_id还为空，则先上传作为封面图</span></span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> cover_id:</span><br><span class="line">                cover_id = uploadWxCover(img_path, title)</span><br><span class="line">            <span class="comment">#上传素材图并替换内容图片，如果图片尺寸大于1mb，公众号不允许，先压缩</span></span><br><span class="line">            logger.info(<span class="string">&quot;[图片]&#123;&#125;的尺寸为：&#123;&#125;&quot;</span>.<span class="built_in">format</span>(src_url, os.path.getsize(img_path)))</span><br><span class="line">            <span class="keyword">if</span> os.path.getsize(img_path) &gt; <span class="number">1048576</span>:</span><br><span class="line">                compress_image(img_path)</span><br><span class="line">            new_url = uploadWxImg(img_path)</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> new_url:</span><br><span class="line">                exit()</span><br><span class="line">            content.img[<span class="string">&#x27;src&#x27;</span>] = new_url</span><br><span class="line">            <span class="keyword">if</span> os.path.exists(img_path):</span><br><span class="line">                os.remove(img_path)</span><br><span class="line">    <span class="comment">#如果缺少封面图片，从api中拿一个，上传封面图并获得id</span></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> cover_id:</span><br><span class="line">        api_src_url = conf[<span class="string">&quot;source&quot;</span>][<span class="string">&quot;404_cover_url&quot;</span>]</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            api_tmp = s.get(conf[<span class="string">&#x27;tool&#x27;</span>][<span class="string">&#x27;api_src_url&#x27;</span>], headers=getRandomUA()) <span class="comment"># 调用了第三方api获取一张随机图片</span></span><br><span class="line">            resJson = api_tmp.json()</span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">str</span>(resJson[<span class="string">&#x27;code&#x27;</span>]).strip() == <span class="string">&#x27;200&#x27;</span>:</span><br><span class="line">                api_a = urlparse(resJson[<span class="string">&#x27;imgurl&#x27;</span>])</span><br><span class="line">                api_file_name = os.path.basename(api_a.path)</span><br><span class="line">                <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(<span class="string">&quot;tmp&quot;</span>):</span><br><span class="line">                    os.mkdir(<span class="string">&quot;tmp&quot;</span>)</span><br><span class="line">                <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(<span class="string">&quot;tmp/images&quot;</span>):</span><br><span class="line">                    os.mkdir(<span class="string">&quot;tmp/images&quot;</span>)</span><br><span class="line">                api_img_path = <span class="string">&#x27;tmp/images/&#x27;</span>+api_file_name</span><br><span class="line">                api_img_tmp = s.get(resJson[<span class="string">&#x27;imgurl&#x27;</span>], stream=<span class="literal">True</span>, headers=getRandomUA())</span><br><span class="line">                <span class="keyword">with</span> <span class="built_in">open</span>(api_img_path, <span class="string">&#x27;wb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">                    f.write(api_img_tmp.content)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">        <span class="keyword">except</span>:</span><br><span class="line">            logger.exception(<span class="string">&quot;api随机图片下载失败：&quot;</span>+api_src_url)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">        cover_id = uploadWxCover(api_img_path, title)</span><br><span class="line">        <span class="keyword">if</span> os.path.exists(api_img_path):</span><br><span class="line">            os.remove(api_img_path)</span><br><span class="line">    <span class="comment">#上传微信内容</span></span><br><span class="line">    content_str = <span class="string">&#x27;&lt;section style=&quot;font-size: 16px; color: black; padding-right: 10px; padding-left: 10px; line-height: 1.6; letter-spacing: 0px; word-break: break-word; text-align: left;&quot;&gt;&#x27;</span></span><br><span class="line">    <span class="keyword">for</span> content <span class="keyword">in</span> content_arr:</span><br><span class="line">        content_str += <span class="built_in">str</span>(content)</span><br><span class="line">    content_str += <span class="string">&#x27;&lt;/section&gt;&#x27;</span></span><br><span class="line">    content_str = dealWxKeyword(content_str)</span><br><span class="line">    logger.info(<span class="string">&#x27;组装好的文章内容：&#x27;</span>)</span><br><span class="line">    logger.info(content_str)</span><br><span class="line">    res = uploadWxPost(title, summury, content_str, cover_id, origin_url)</span><br><span class="line">    <span class="keyword">if</span> res:</span><br><span class="line">        logger.info(<span class="string">&#x27;已处理完[标题]《&#123;&#125;》的文章&#x27;</span>.<span class="built_in">format</span>(title))</span><br><span class="line">        logger.info(<span class="string">&quot;======================================&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> res</span><br><span class="line">    logger.error(<span class="string">&#x27;处理[标题]《&#123;&#125;》出现严重错误，自动中断&#x27;</span>.<span class="built_in">format</span>(title))</span><br><span class="line">    exit()</span><br></pre></td></tr></table></figure><p>上面的方法中涉及到了2个额外的方法。其中之一，是上传头图，这张图必须用单独的公众号接口，因为我们需要它的媒体ID。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">uploadWxCover</span>(<span class="params">src_url, title</span>):</span><br><span class="line">    url = <span class="string">&#x27;https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=&#123;&#125;&amp;type=&#123;&#125;&#x27;</span>.<span class="built_in">format</span>(wx_token, <span class="string">&#x27;image&#x27;</span>)</span><br><span class="line">    ext_name = os.path.splitext(src_url)[-<span class="number">1</span>]</span><br><span class="line">    request_file = &#123;</span><br><span class="line">        <span class="string">&#x27;media&#x27;</span>: (title+ext_name, <span class="built_in">open</span>(src_url, <span class="string">&#x27;rb&#x27;</span>))&#125;</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        wx_res = requests.post(url=url, files=request_file)</span><br><span class="line">        obj = json.loads(wx_res.content)</span><br><span class="line">        logger.info(<span class="string">&#x27;[uploadWxCover]get wx response:&#x27;</span>)</span><br><span class="line">        logger.info(obj)</span><br><span class="line">        <span class="keyword">return</span> obj[<span class="string">&#x27;media_id&#x27;</span>]</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        logger.exception(<span class="string">&#x27;上传封面图到微信错误：&#x27;</span>+<span class="built_in">str</span>(e))</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><p>另一个方法就是上传正文图片，然后拿到url。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">uploadWxImg</span>(<span class="params">src_url</span>):</span><br><span class="line">    wx_img_url = <span class="string">&#x27;https://api.weixin.qq.com/cgi-bin/media/uploadimg&#x27;</span></span><br><span class="line">    file_name = os.path.basename(src_url)</span><br><span class="line">    request_file = &#123;</span><br><span class="line">        <span class="string">&#x27;media&#x27;</span>: (file_name, <span class="built_in">open</span>(src_url, <span class="string">&#x27;rb&#x27;</span>))</span><br><span class="line">        &#125;</span><br><span class="line">    data = &#123;</span><br><span class="line">        <span class="string">&#x27;access_token&#x27;</span>: wx_token</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        wx_res = requests.post(url=wx_img_url, files=request_file, data=data)</span><br><span class="line">        obj = json.loads(wx_res.content)</span><br><span class="line">        logger.info(<span class="string">&#x27;[uploadWxImg]get wx response:&#x27;</span>)</span><br><span class="line">        logger.info(obj)</span><br><span class="line">        <span class="keyword">return</span> obj[<span class="string">&#x27;url&#x27;</span>]</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        logger.exception(<span class="string">&#x27;上传内容图到微信错误：&#x27;</span>+<span class="built_in">str</span>(e))</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><h2 id="上传草稿"><a href="#上传草稿" class="headerlink" title="上传草稿"></a>上传草稿</h2><p>因为自己使用的关系，代码比较随意，上传草稿的接口在上面的代码里其实已经调用了，就是 <code>res = uploadWxPost(title, summury, content_str, cover_id, origin_url)</code> 这段。方法内容如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">uploadWxPost</span>(<span class="params">title, summury, content, cover_id, content_source_url</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(title) &gt; <span class="number">64</span>:</span><br><span class="line">        title = title[:<span class="number">63</span>]</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(summury) &gt; <span class="number">120</span>:</span><br><span class="line">        summury = summury[:<span class="number">119</span>]</span><br><span class="line"> </span><br><span class="line">    url = <span class="string">&#x27;https://api.weixin.qq.com/cgi-bin/draft/add?access_token=&#x27;</span>+wx_token</span><br><span class="line">    data = &#123;</span><br><span class="line">        <span class="string">&quot;articles&quot;</span>: [</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="string">&quot;title&quot;</span>: title,</span><br><span class="line">                <span class="string">&quot;author&quot;</span>: conf[<span class="string">&quot;wx&quot;</span>][<span class="string">&quot;author&quot;</span>],</span><br><span class="line">                <span class="string">&quot;digest&quot;</span>: summury,</span><br><span class="line">                <span class="string">&quot;content&quot;</span>: content,</span><br><span class="line">                <span class="string">&quot;content_source_url&quot;</span>: content_source_url,</span><br><span class="line">                <span class="string">&quot;show_cover_pic&quot;</span>: <span class="number">1</span>,</span><br><span class="line">                <span class="string">&quot;need_open_comment&quot;</span>: <span class="number">0</span>,</span><br><span class="line">                <span class="string">&quot;only_fans_can_comment&quot;</span>: <span class="number">0</span>,</span><br><span class="line">                <span class="string">&quot;thumb_media_id&quot;</span>: cover_id</span><br><span class="line">            &#125;</span><br><span class="line">        ]</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        wx_res = requests.post(url=url, data=json.dumps(data, ensure_ascii=<span class="literal">False</span>).encode(<span class="string">&quot;utf-8&quot;</span>))</span><br><span class="line">        logger.info(wx_res)</span><br><span class="line">        obj = json.loads(wx_res.content)</span><br><span class="line">        logger.info(<span class="string">&#x27;[uploadWxContent]get wx response:&#x27;</span>)</span><br><span class="line">        logger.info(obj)</span><br><span class="line">        <span class="keyword">return</span> obj[<span class="string">&#x27;media_id&#x27;</span>]</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        logger.exception(<span class="string">&#x27;上传所有内容到微信错误：&#x27;</span>+<span class="built_in">str</span>(e))</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><h2 id="发布文章"><a href="#发布文章" class="headerlink" title="发布文章"></a>发布文章</h2><p><strong>特别提醒</strong>：如果你需要勾选 <em>原创</em> 或者 <em>赞赏</em>，那么先不要发布！一定先到后台手动编辑！</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">publishPostList</span>(<span class="params">max_posts</span>):</span><br><span class="line">    cur = con.cursor()</span><br><span class="line">    index = <span class="number">0</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        cur.execute(<span class="string">&#x27;select url,m_id,title,time from posts where p_id is null order by time&#x27;</span>)</span><br><span class="line">        results = cur.fetchall()</span><br><span class="line">        logger.info(<span class="string">&#x27;共查询到&#123;&#125;篇需要发布的文章，预计将要处理&#123;&#125;篇&#x27;</span>.<span class="built_in">format</span>(<span class="built_in">len</span>(results), max_posts <span class="keyword">if</span> max_posts &gt; -<span class="number">1</span> <span class="keyword">else</span> <span class="built_in">len</span>(results)))</span><br><span class="line">        <span class="keyword">for</span> result <span class="keyword">in</span> results:</span><br><span class="line">            logger.info(<span class="string">&quot;======================================&quot;</span>)</span><br><span class="line">            logger.info(<span class="string">&#x27;开始发布[标题]《&#123;&#125;》的文章...&#x27;</span>.<span class="built_in">format</span>(result[<span class="number">2</span>]))</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> result[<span class="number">1</span>]:</span><br><span class="line">                logger.error(<span class="string">&#x27;文章缺少媒体ID，无法发布，略过&#x27;</span>)</span><br><span class="line">                <span class="keyword">continue</span></span><br><span class="line">            p_id = publishWxPost(result[<span class="number">1</span>])</span><br><span class="line">            <span class="keyword">if</span> p_id:</span><br><span class="line">                markAsPublish(result[<span class="number">0</span>], <span class="built_in">str</span>(p_id))</span><br><span class="line">                time.sleep(<span class="number">30</span>) <span class="comment"># 公众号自动审核文章需要一些时间，审核过程中是拿不到发布id的。实际上有时候30秒都不够，这里的等待时间可以视情况调整</span></span><br><span class="line">                getSingleArticleId(<span class="built_in">str</span>(p_id))</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                logger.exception(<span class="string">&#x27;发布[标题]《&#123;&#125;》出现严重错误，自动中断&#x27;</span>.<span class="built_in">format</span>(result[<span class="number">2</span>]))</span><br><span class="line">            index += <span class="number">1</span></span><br><span class="line">            <span class="keyword">if</span> max_posts &gt; -<span class="number">1</span> <span class="keyword">and</span> index &gt;= max_posts:</span><br><span class="line">                exit()</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        logger.exception(<span class="string">&#x27;发布[标题]《&#123;&#125;》出现严重错误，自动中断&#x27;</span>.<span class="built_in">format</span>(result[<span class="number">2</span>]))</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">publishWxPost</span>(<span class="params">m_id</span>):</span><br><span class="line">    url = <span class="string">&#x27;https://api.weixin.qq.com/cgi-bin/freepublish/submit?access_token=&#x27;</span>+wx_token</span><br><span class="line">    data = &#123;</span><br><span class="line">        <span class="string">&#x27;media_id&#x27;</span>: m_id</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        wx_res = requests.post(url=url, data=json.dumps(data, ensure_ascii=<span class="literal">False</span>).encode(<span class="string">&quot;utf-8&quot;</span>))</span><br><span class="line">        obj = json.loads(wx_res.content)</span><br><span class="line">        logger.info(<span class="string">&#x27;[publishWxContent]get wx response:&#x27;</span>)</span><br><span class="line">        logger.info(obj)</span><br><span class="line">        <span class="keyword">return</span> obj[<span class="string">&#x27;publish_id&#x27;</span>]</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        logger.exception(<span class="string">&#x27;发布微信文章错误：&#x27;</span>+<span class="built_in">str</span>(e))</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><p>至此，发布完成。接下来可以在公众号后台进行后续操作。</p><h2 id="微信Token"><a href="#微信Token" class="headerlink" title="微信Token"></a>微信Token</h2><p>前面一直没有提，相对的，我也觉得这一步其实没有什么说的必要，因为任何微信接口肯定都需要token。</p><p>但是一路写下来，好像每个步骤都在提微信token，那就还是给它露个脸吧。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">getWxToken</span>():</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(<span class="string">&quot;tmp&quot;</span>):</span><br><span class="line">        os.mkdir(<span class="string">&quot;tmp&quot;</span>)</span><br><span class="line">    token_path = <span class="string">&#x27;tmp/token.txt&#x27;</span> <span class="comment"># 存下来免得总去请求接口，没必要。而且后来发现这个步骤还很有用。</span></span><br><span class="line">    <span class="keyword">if</span> os.path.exists(token_path):</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(token_path, <span class="string">&#x27;r&#x27;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            data = json.load(f)</span><br><span class="line">        <span class="keyword">if</span> data <span class="keyword">and</span> data[<span class="string">&#x27;access_token&#x27;</span>]:</span><br><span class="line">            t = time.time()</span><br><span class="line">            <span class="keyword">if</span> data[<span class="string">&#x27;expires_in&#x27;</span>] &gt; <span class="built_in">int</span>(t) - data[<span class="string">&#x27;time&#x27;</span>]:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&#x27;[Suprise!] local wx access_token valid! &#x27;</span>, data[<span class="string">&#x27;access_token&#x27;</span>])</span><br><span class="line">                <span class="keyword">return</span> data[<span class="string">&#x27;access_token&#x27;</span>]</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        wx_res= requests.get(<span class="string">&#x27;https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;appid=&#123;&#125;&amp;secret=&#123;&#125;&#x27;</span>.<span class="built_in">format</span>(conf[<span class="string">&quot;wx&quot;</span>][<span class="string">&quot;app_id&quot;</span>], conf[<span class="string">&quot;wx&quot;</span>][<span class="string">&quot;app_secret&quot;</span>]))</span><br><span class="line">        obj = json.loads(wx_res.content)</span><br><span class="line">        logger.info(<span class="string">&#x27;[getWxToken]get wx response:&#x27;</span>)</span><br><span class="line">        logger.info(obj)</span><br><span class="line">        t = time.time()</span><br><span class="line">        obj[<span class="string">&#x27;time&#x27;</span>] = <span class="built_in">int</span>(t)</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(token_path, <span class="string">&#x27;w&#x27;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            f.write(json.dumps(obj))</span><br><span class="line">        <span class="keyword">return</span> obj[<span class="string">&#x27;access_token&#x27;</span>]</span><br><span class="line">    <span class="keyword">except</span> json.decoder.JSONDecodeError <span class="keyword">as</span> e:</span><br><span class="line">        logger.exception(<span class="string">&quot;微信Token接口数据解析错误...&quot;</span>+<span class="built_in">str</span>(e))</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        logger.exception(<span class="string">&#x27;微信Token获取失败&#x27;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><h1 id="遇到的问题"><a href="#遇到的问题" class="headerlink" title="遇到的问题"></a>遇到的问题</h1><p>本人也算是个python小白，所以实现过程中自然也有很多问题，大致梳理了一下。</p><h2 id="接口次数"><a href="#接口次数" class="headerlink" title="接口次数"></a>接口次数</h2><p>这个就是前面提到把微信Token存下来的好处，我一直忽略了微信接口有次数的问题。由于尝试的次数太多，微信直接丢给我 <code>errcode: 45009</code>，我才查到这个问题。接口频次限制如下：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221204235436.png" alt="微信公众号接口频次"></p><p>当然，也可参见 <a href="https://developers.weixin.qq.com/doc/offiaccount/Message_Management/API_Call_Limits.html">基础消息能力 &#x2F;接口调用频次限制说明</a>。</p><h2 id="文章格式优化"><a href="#文章格式优化" class="headerlink" title="文章格式优化"></a>文章格式优化</h2><p>这个问题是比较意外的，耽搁了很久。毕竟我以为直接把带样式的html文本发过去就完了，结果居然样式全乱了。而且现在也不是最理想的状态，先将就了。</p><p>接口次数限制也是由于这个问题才发现的 😂</p><p>大神们有更好的处理办法也请分享，谢谢！</p><h2 id="原创与赞赏"><a href="#原创与赞赏" class="headerlink" title="原创与赞赏"></a>原创与赞赏</h2><p>翻找了很久，发现微信开放社区有人跟我一样的疑问，为什么没有原创与赞赏接口。然后我确定了，的确没有，需要自己手动操作。</p><p>emmm🤔，懒得吐槽了，寄人篱下，多低头 </p><h2 id="资源管理"><a href="#资源管理" class="headerlink" title="资源管理"></a>资源管理</h2><p>这个目前对我而言其实算不上问题，因为我是完全同步博客，不需要资源管理。</p><p>但是如果要管理，其实可以参考我十分熟悉的wordpress，以及fastadmin，用一张表单独存储附件信息，然后跟文章关联起来。思路十分简单。</p><h1 id="使用到的接口文档"><a href="#使用到的接口文档" class="headerlink" title="使用到的接口文档"></a>使用到的接口文档</h1><p><a href="https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Add_draft.html">草稿箱 &#x2F;新建草稿</a></p><p><a href="https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Adding_Permanent_Assets.html">素材管理 &#x2F;新增永久素材</a></p><p><a href="https://developers.weixin.qq.com/doc/offiaccount/Publish/Publish.html">发布能力 &#x2F;发布接口</a></p><p><a href="https://developers.weixin.qq.com/doc/offiaccount/openApi/clear_quota.html">openApi管理 &#x2F;清空api的调用quota</a></p><p><a href="https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html">开始开发 &#x2F;获取Access token</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;对我个人而言，最快的学习方式都是一边用一边学，于是继一年前通过9块9的在线课程入门后，最近半年都在频繁使用python开发一些小工具。&lt;/p&gt;
&lt;p&gt;python真的是个有趣的东西，在以前真的很难想象，我在学习和工作的同时，后台还跑着两个刚入门的我写的程序，不停的帮我自动处</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="技术" scheme="https://www.gsgundam.com/tags/%E6%8A%80%E6%9C%AF/"/>
    
    <category term="学习" scheme="https://www.gsgundam.com/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="笔记" scheme="https://www.gsgundam.com/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="博客" scheme="https://www.gsgundam.com/tags/%E5%8D%9A%E5%AE%A2/"/>
    
    <category term="微信" scheme="https://www.gsgundam.com/tags/%E5%BE%AE%E4%BF%A1/"/>
    
    <category term="微信公众号" scheme="https://www.gsgundam.com/tags/%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7/"/>
    
    <category term="同步" scheme="https://www.gsgundam.com/tags/%E5%90%8C%E6%AD%A5/"/>
    
    <category term="迁移" scheme="https://www.gsgundam.com/tags/%E8%BF%81%E7%A7%BB/"/>
    
    <category term="migrate" scheme="https://www.gsgundam.com/tags/migrate/"/>
    
    <category term="sync" scheme="https://www.gsgundam.com/tags/sync/"/>
    
  </entry>
  
  <entry>
    <title>python的条件运算符用法</title>
    <link href="https://www.gsgundam.com/2022/2022-11-30-python-if-else/"/>
    <id>https://www.gsgundam.com/2022/2022-11-30-python-if-else/</id>
    <published>2022-11-29T18:30:00.000Z</published>
    <updated>2022-11-29T18:38:07.819Z</updated>
    
    <content type="html"><![CDATA[<p>很多语言在变量赋值的时候，都有简单的条件运算符（好像又叫三元操作符）。例如：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// javascript</span></span><br><span class="line"><span class="keyword">let</span> a = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">let</span> b = <span class="number">2</span>;</span><br><span class="line"><span class="keyword">let</span> max = a &gt; b ? a : b;</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(max)</span><br><span class="line"><span class="comment">// 输出：2</span></span><br></pre></td></tr></table></figure><p>又例如：</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// C#</span></span><br><span class="line"><span class="built_in">int</span> a = <span class="number">1</span>;</span><br><span class="line"><span class="built_in">int</span> b = <span class="number">2</span>;</span><br><span class="line"><span class="built_in">int</span> max = a &gt; b ? a: b;</span><br><span class="line">Console.WriteLine(max);</span><br><span class="line"><span class="comment">// 输出：2</span></span><br></pre></td></tr></table></figure><p>如此通用的写法，让我觉得python应该也差不多。但是一写，vs code就提示语法错误了。</p><p>赶紧上网搜了搜，居然这么神奇。完全就是if…else的变体，很好理解，就是别和其他语言搞混了。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">a = <span class="number">1</span></span><br><span class="line">b = <span class="number">2</span></span><br><span class="line"><span class="built_in">max</span> = a <span class="keyword">if</span> a &gt; b <span class="keyword">else</span> b</span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">max</span>)</span><br><span class="line"><span class="comment"># 输出：2</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;很多语言在变量赋值的时候，都有简单的条件运算符（好像又叫三元操作符）。例如：&lt;/p&gt;
&lt;figure class=&quot;highlight javascript&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="技术" scheme="https://www.gsgundam.com/tags/%E6%8A%80%E6%9C%AF/"/>
    
    <category term="学习" scheme="https://www.gsgundam.com/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="笔记" scheme="https://www.gsgundam.com/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="条件运算符" scheme="https://www.gsgundam.com/tags/%E6%9D%A1%E4%BB%B6%E8%BF%90%E7%AE%97%E7%AC%A6/"/>
    
    <category term="三元操作符" scheme="https://www.gsgundam.com/tags/%E4%B8%89%E5%85%83%E6%93%8D%E4%BD%9C%E7%AC%A6/"/>
    
    <category term="if else" scheme="https://www.gsgundam.com/tags/if-else/"/>
    
  </entry>
  
  <entry>
    <title>解决hexo发布时unexpected end of file的问题</title>
    <link href="https://www.gsgundam.com/2022/2022-11-29-hexo-unexpected-end-of-file/"/>
    <id>https://www.gsgundam.com/2022/2022-11-29-hexo-unexpected-end-of-file/</id>
    <published>2022-11-29T05:30:00.000Z</published>
    <updated>2022-12-04T16:15:31.234Z</updated>
    
    <content type="html"><![CDATA[<p>最近倒腾了博客，改了下github action用的node容器版本，使用 <code>hexo generate</code> 命令发布时又报错了。这是个老问题，好像从hexo升级到3.x以后就一直存在。</p><p>错误内容如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">INFO  Start processing</span><br><span class="line">FATAL Something<span class="string">&#x27;s wrong. Maybe you can find the solution here: https://hexo.io/docs/troubleshooting.html</span></span><br><span class="line"><span class="string">Template render error: (unknown path)</span></span><br><span class="line"><span class="string">  unexpected end of file</span></span><br><span class="line"><span class="string">...</span></span><br></pre></td></tr></table></figure><p>疫情在家，不如好好研究下怎么回事，也许不复杂呢？</p><p>然后简单的搜索了下，好家伙，真的一下就找到问题了。参见 <a href="https://github.com/hexojs/hexo/issues/1771#issuecomment-187583293">https://github.com/hexojs/hexo/issues/1771#issuecomment-187583293</a></p><p>按这篇帖子的意思，hexo从2.x使用 <code>Swig</code> 渲染markdown到3.x版本使用 <code>Nunjucks</code> 渲染，有的语法已经不支持了。</p><p>比如我早期由于使用 <code>artTemplate</code> 开发前端，很喜欢用 <code>\&#123;\% abc \%\&#125;</code> 这样的语法，于是写博客的时候也这么用，但是到了3.x就报错了。</p><p>虽然这并不能解释为什么我用 v12.x 的node环境仍然可以正常发布，用 v14.x 的就不行，但是我觉得原因应该类似吧。</p><p>目前把所有的旧语法都改为新的，就可以正常发布了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近倒腾了博客，改了下github action用的node容器版本，使用 &lt;code&gt;hexo generate&lt;/code&gt; 命令发布时又报错了。这是个老问题，好像从hexo升级到3.x以后就一直存在。&lt;/p&gt;
&lt;p&gt;错误内容如下：&lt;/p&gt;
&lt;figure class=</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="unexpected end of file" scheme="https://www.gsgundam.com/tags/unexpected-end-of-file/"/>
    
    <category term="Template render error" scheme="https://www.gsgundam.com/tags/Template-render-error/"/>
    
    <category term="unknown path" scheme="https://www.gsgundam.com/tags/unknown-path/"/>
    
    <category term="generate" scheme="https://www.gsgundam.com/tags/generate/"/>
    
    <category term="Nunjucks" scheme="https://www.gsgundam.com/tags/Nunjucks/"/>
    
    <category term="Swig" scheme="https://www.gsgundam.com/tags/Swig/"/>
    
    <category term="hexo发布" scheme="https://www.gsgundam.com/tags/hexo%E5%8F%91%E5%B8%83/"/>
    
    <category term="技术" scheme="https://www.gsgundam.com/tags/%E6%8A%80%E6%9C%AF/"/>
    
    <category term="学习" scheme="https://www.gsgundam.com/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="笔记" scheme="https://www.gsgundam.com/tags/%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Wordpress由于load-script.php加载时间太长导致载入缓慢</title>
    <link href="https://www.gsgundam.com/2022/2022-11-26-wordpress-config-load-script-too-slow/"/>
    <id>https://www.gsgundam.com/2022/2022-11-26-wordpress-config-load-script-too-slow/</id>
    <published>2022-11-25T16:30:00.000Z</published>
    <updated>2022-11-25T16:37:45.762Z</updated>
    
    <content type="html"><![CDATA[<p>最近一个测试中用到了wordpress海外主题，发现Wordpress后台载入特别慢，主要是 <code>load-script.php</code> 和 <code>load-style.php</code> 的缘故。</p><p>上网查询了下，很简单，解决方法就是在网站根目录wp-config.php文件中，禁止合并脚本。代码如下：</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_ invoke__">define</span>(<span class="string">&#x27;CONCATENATE_SCRIPTS&#x27;</span>, <span class="literal">false</span>);</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近一个测试中用到了wordpress海外主题，发现Wordpress后台载入特别慢，主要是 &lt;code&gt;load-script.php&lt;/code&gt; 和 &lt;code&gt;load-style.php&lt;/code&gt; 的缘故。&lt;/p&gt;
&lt;p&gt;上网查询了下，很简单，解决方法就是在网</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="技术" scheme="https://www.gsgundam.com/tags/%E6%8A%80%E6%9C%AF/"/>
    
    <category term="学习" scheme="https://www.gsgundam.com/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="笔记" scheme="https://www.gsgundam.com/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="wordpress" scheme="https://www.gsgundam.com/tags/wordpress/"/>
    
    <category term="load-script" scheme="https://www.gsgundam.com/tags/load-script/"/>
    
    <category term="load-script.php" scheme="https://www.gsgundam.com/tags/load-script-php/"/>
    
    <category term="加载时间" scheme="https://www.gsgundam.com/tags/%E5%8A%A0%E8%BD%BD%E6%97%B6%E9%97%B4/"/>
    
  </entry>
  
  <entry>
    <title>使用python上传到遇见图床</title>
    <link href="https://www.gsgundam.com/2022/2022-11-24-python-upload-image-to-hualigs/"/>
    <id>https://www.gsgundam.com/2022/2022-11-24-python-upload-image-to-hualigs/</id>
    <published>2022-11-24T05:30:00.000Z</published>
    <updated>2022-11-24T06:18:54.939Z</updated>
    
    <content type="html"><![CDATA[<p>目前需要把一些图片上传到图床进行托管，看了一圈，感觉聚合类的图床很不错，而且很多也包含了我之前用过的imgur这类非常稳定的图床资源。</p><p>最后选择了 <a href="https://www.hualigs.cn/">遇见图床</a> ，感觉挺正规的，自称2018年就开始运营，而且强制开启鉴黄接口，保证了干净整洁，不容易被封。</p><p>选择它也是因为api比较完善。我这次只会用到图片上传，参看 <a href="https://www.hualigs.cn/doc/upload">遇见图床api文档</a></p><p>之所以会写这一篇，是因为遇见图床的api必须使用表单的文件类型上传图片，于是又学习了一下。</p><p>其中关键代码如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">imgOpen = <span class="built_in">open</span>(localImg, <span class="string">&#x27;rb&#x27;</span>)</span><br><span class="line">files = &#123;<span class="string">&#x27;image&#x27;</span>: imgOpen&#125;</span><br><span class="line">r = requests.post(hualigs_url, data=&#123;<span class="string">&#x27;apiType&#x27;</span>: hualigs_api_type, <span class="string">&#x27;privateStorage&#x27;</span>: <span class="string">&#x27;&#x27;</span>, <span class="string">&#x27;token&#x27;</span>: hualigs_token&#125;, files=files)</span><br><span class="line">imgOpen.close()</span><br></pre></td></tr></table></figure><p>这里面重点就是file需要读取二进制文件，而不能直接填入文件名。同时，图床文档里明确了图片的字段为<code>image</code>，因此不能随便写个<code>file</code>之类的上去。</p><p>然后根据文档中的响应解释，构造对响应的解析。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221124141353.png"></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">try</span>:</span><br><span class="line">    respJson = r.json()</span><br><span class="line"><span class="keyword">except</span> json.decoder.JSONDecodeError <span class="keyword">as</span> e:</span><br><span class="line">    logger.exception(<span class="string">&quot;接口解析错误：&quot;</span>+<span class="built_in">str</span>(e)+<span class="string">&quot;\n返回信息：&quot;</span>+r.text)</span><br><span class="line">    <span class="keyword">return</span> src_url</span><br><span class="line"><span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">    logger.exception(<span class="string">&quot;未知的接口调用错误:&quot;</span>+<span class="built_in">str</span>(e))</span><br><span class="line">    <span class="keyword">return</span> src_url</span><br><span class="line">urls = &#123;&#125;</span><br><span class="line"><span class="keyword">if</span> <span class="built_in">str</span>(respJson[<span class="string">&#x27;code&#x27;</span>]).strip() == <span class="string">&#x27;200&#x27;</span> <span class="keyword">and</span> <span class="built_in">str</span>(respJson[<span class="string">&#x27;msg&#x27;</span>]).strip() == <span class="string">&#x27;success&#x27;</span>:</span><br><span class="line">    urls = respJson[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;url&#x27;</span>]</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><p>最后贴上整个方法的全部代码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">dealImage</span>(<span class="params">src_url</span>):</span><br><span class="line">    a = urlparse(src_url)</span><br><span class="line">    file_name = os.path.basename(a.path)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(<span class="string">&quot;tmp&quot;</span>):</span><br><span class="line">        os.mkdir(<span class="string">&quot;tmp&quot;</span>)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(<span class="string">&quot;tmp/images&quot;</span>):</span><br><span class="line">        os.mkdir(<span class="string">&quot;tmp/images&quot;</span>)</span><br><span class="line">    img_path = <span class="string">&#x27;tmp/images/&#x27;</span>+file_name</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(img_path):</span><br><span class="line">        tmp = requests.get(src_url, headers=getRandomUA(), timeout=<span class="number">2</span>)</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(img_path, <span class="string">&#x27;wb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            f.write(tmp.content)</span><br><span class="line">    logger.info(<span class="string">&#x27;Uploading 2 imgur: &#x27;</span>+img_path)</span><br><span class="line">    imgOpen = <span class="built_in">open</span>(img_path, <span class="string">&#x27;rb&#x27;</span>)</span><br><span class="line">    files = &#123;<span class="string">&#x27;image&#x27;</span>: imgOpen&#125;</span><br><span class="line">    r = requests.post(hualigs_url, data=&#123;<span class="string">&#x27;apiType&#x27;</span>: hualigs_api_type, <span class="string">&#x27;privateStorage&#x27;</span>: <span class="string">&#x27;&#x27;</span>, <span class="string">&#x27;token&#x27;</span>: hualigs_token&#125;, files=files)</span><br><span class="line">    imgOpen.close()</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        respJson = r.json()</span><br><span class="line">    <span class="keyword">except</span> json.decoder.JSONDecodeError <span class="keyword">as</span> e:</span><br><span class="line">        logger.exception(<span class="string">&quot;接口解析错误：&quot;</span>+<span class="built_in">str</span>(e)+<span class="string">&quot;\n返回信息：&quot;</span>+r.text)</span><br><span class="line">        <span class="keyword">return</span> src_url</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        logger.exception(<span class="string">&quot;未知的接口调用错误:&quot;</span>+<span class="built_in">str</span>(e))</span><br><span class="line">        <span class="keyword">return</span> src_url</span><br><span class="line">    urls = &#123;&#125;</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">str</span>(respJson[<span class="string">&#x27;code&#x27;</span>]).strip() == <span class="string">&#x27;200&#x27;</span> <span class="keyword">and</span> <span class="built_in">str</span>(respJson[<span class="string">&#x27;msg&#x27;</span>]).strip() == <span class="string">&#x27;success&#x27;</span>:</span><br><span class="line">        urls = respJson[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;url&#x27;</span>]</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    <span class="keyword">if</span> urls[<span class="string">&quot;distribute&quot;</span>]:</span><br><span class="line">        logger.info(<span class="string">&#x27;[url]&#x27;</span>+src_url+<span class="string">&#x27; uploaded! [new url]&#x27;</span>+urls[<span class="string">&quot;distribute&quot;</span>])</span><br><span class="line">        <span class="keyword">if</span> os.path.exists(img_path):</span><br><span class="line">            os.remove(img_path)</span><br><span class="line">        <span class="keyword">return</span> urls[<span class="string">&quot;distribute&quot;</span>]</span><br><span class="line">    <span class="keyword">if</span> hualigs_api_type <span class="keyword">in</span> urls:</span><br><span class="line">        logger.info(<span class="string">&#x27;[url]&#x27;</span>+src_url+<span class="string">&#x27; uploaded! [new url]&#x27;</span>+urls[hualigs_api_type])</span><br><span class="line">        <span class="keyword">if</span> os.path.exists(img_path):</span><br><span class="line">            os.remove(img_path)</span><br><span class="line">        <span class="keyword">return</span> urls[hualigs_api_type]</span><br><span class="line">    <span class="keyword">return</span> src_url</span><br></pre></td></tr></table></figure><p>以上内容主要参考了 <a href="https://gitee.com/icexmoon/markdown-img/blob/master/src/markdown_img/img_service/yujian_img_service.py">魔芋红茶 &#x2F; markdown-img</a> 。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;目前需要把一些图片上传到图床进行托管，看了一圈，感觉聚合类的图床很不错，而且很多也包含了我之前用过的imgur这类非常稳定的图床资源。&lt;/p&gt;
&lt;p&gt;最后选择了 &lt;a href=&quot;https://www.hualigs.cn/&quot;&gt;遇见图床&lt;/a&gt; ，感觉挺正规的，自称201</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="技术" scheme="https://www.gsgundam.com/tags/%E6%8A%80%E6%9C%AF/"/>
    
    <category term="学习" scheme="https://www.gsgundam.com/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="笔记" scheme="https://www.gsgundam.com/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="上传" scheme="https://www.gsgundam.com/tags/%E4%B8%8A%E4%BC%A0/"/>
    
    <category term="图床" scheme="https://www.gsgundam.com/tags/%E5%9B%BE%E5%BA%8A/"/>
    
    <category term="遇见图床" scheme="https://www.gsgundam.com/tags/%E9%81%87%E8%A7%81%E5%9B%BE%E5%BA%8A/"/>
    
    <category term="hualigs" scheme="https://www.gsgundam.com/tags/hualigs/"/>
    
    <category term="表单" scheme="https://www.gsgundam.com/tags/%E8%A1%A8%E5%8D%95/"/>
    
    <category term="formdata" scheme="https://www.gsgundam.com/tags/formdata/"/>
    
    <category term="学习笔记" scheme="https://www.gsgundam.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Python的with...as学习笔记</title>
    <link href="https://www.gsgundam.com/2022/2022-11-19-python-with-as-learning/"/>
    <id>https://www.gsgundam.com/2022/2022-11-19-python-with-as-learning/</id>
    <published>2022-11-19T04:00:00.000Z</published>
    <updated>2022-11-19T07:42:44.900Z</updated>
    
    <content type="html"><![CDATA[<p>都说 with 语句是 Python 中 “人生苦短，我用 Python” 的经典代表之一，它可以使得我们在编写代码的时候非常简短，且行之有效。</p><h1 id="引子"><a href="#引子" class="headerlink" title="引子"></a>引子</h1><p>我习惯于一边做一边学知识，这次的实际情况是想要使用代码下载一张图片，看到了三种方式，其中一种就是with…as，于是打算好好理解一下。</p><p>代码如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">tmp = requests.get(src_url, timeout=<span class="number">2</span>)</span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&#x27;file_name.jpg&#x27;</span>, <span class="string">&#x27;wb&#x27;</span>) <span class="keyword">as</span> file:</span><br><span class="line">    file.write(tmp.content)</span><br></pre></td></tr></table></figure><p>按理说，如果现在的我拿到这个需求，我会这样写：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">tmp = requests.get(src_url, timeout=<span class="number">2</span>)</span><br><span class="line">file = <span class="built_in">open</span>(<span class="string">&#x27;file_name.jpg&#x27;</span>, <span class="string">&#x27;wb&#x27;</span>)</span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line">    file.write(tmp.content)</span><br><span class="line"><span class="keyword">finally</span>:</span><br><span class="line">    file.close()</span><br></pre></td></tr></table></figure><p>区别似乎很明显了，看上去with像是python对于try的语法糖，但是还需要查资料理解一下它具体的工作方式。</p><p>以下内容主要参考了 <a href="http://www.manongjc.com/article/55725.html">Python之with as语句 （屌丝版）</a> 、 <a href="https://www.yisu.com/zixun/667717.html">python中with和异常处理实例分析</a> 、 官网 <a href="https://docs.python.org/zh-cn/3/reference/compound_stmts.html">8. 复合语句¶</a> 的第5部分。</p><h1 id="详述"><a href="#详述" class="headerlink" title="详述"></a>详述</h1><h2 id="enter与exit"><a href="#enter与exit" class="headerlink" title="enter与exit"></a>enter与exit</h2><p>首先with所操作的对象，必须有两个重要的方法，<code>__enter__</code>、<code>__exit__</code>。</p><p>Python对with的处理很聪明。</p><p>紧跟with后面的语句被求值后，返回对象的<code>enter()</code>方法被调用，这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后，将调用前面返回对象的<code>exit()</code>方法。</p><h2 id="上下文管理器"><a href="#上下文管理器" class="headerlink" title="上下文管理器"></a>上下文管理器</h2><p>with 要生效，需要作用于一个上下文管理器——</p><p>打住，到底什么是上下文管理器呢？</p><p>长话短说，就是实现了<code>__enter__</code>和<code>__exit__</code>方法的对象。</p><p>在进入一个运行时上下文前，会先加载这两个方法以备使用。进入这个运行时上下文时，调用<code>__enter__</code>方法；退出该上下文前，则会调用<code>__exit__</code>方法。</p><p>这里的“运行时上下文”，可以简单地理解为一个提供了某些特殊配置的代码作用域。</p><p>这里有一点特殊的是，Python中文件对象本身就是一个上下文管理器，因此我们可以使用open函数作为求值的表达式。</p><p>随后调用<code>__enter__</code>方法，返回的对象绑定到我们指定的标识符file上。文件对象的<code>__enter__</code>返回文件对象自身，因此这句代码就是将打开的 <code>file_name.jpg</code> 文件对象绑定到了标识符file上。</p><p>紧跟着执行 with 语句块中的内容。</p><p>最后调用<code>__exit__</code>，退出 with 语句块。</p><h1 id="自己的理解"><a href="#自己的理解" class="headerlink" title="自己的理解"></a>自己的理解</h1><p>似乎with语句直接跳过了异常处理，对于不关心异常的场景下，无疑大幅减少了代码量，同时还保证了程序可以正常运行不被中断。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;都说 with 语句是 Python 中 “人生苦短，我用 Python” 的经典代表之一，它可以使得我们在编写代码的时候非常简短，且行之有效。&lt;/p&gt;
&lt;h1 id=&quot;引子&quot;&gt;&lt;a href=&quot;#引子&quot; class=&quot;headerlink&quot; title=&quot;引子&quot;&gt;&lt;/a&gt;</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="技术" scheme="https://www.gsgundam.com/tags/%E6%8A%80%E6%9C%AF/"/>
    
    <category term="学习" scheme="https://www.gsgundam.com/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="笔记" scheme="https://www.gsgundam.com/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="学习笔记" scheme="https://www.gsgundam.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    <category term="Python" scheme="https://www.gsgundam.com/tags/Python/"/>
    
    <category term="with as" scheme="https://www.gsgundam.com/tags/with-as/"/>
    
    <category term="with...as" scheme="https://www.gsgundam.com/tags/with-as/"/>
    
    <category term="with" scheme="https://www.gsgundam.com/tags/with/"/>
    
    <category term="as" scheme="https://www.gsgundam.com/tags/as/"/>
    
  </entry>
  
  <entry>
    <title>人工智能写的《蝙蝠侠》长什么样？</title>
    <link href="https://www.gsgundam.com/archive/2022-11-15-batman-written-by-ai/"/>
    <id>https://www.gsgundam.com/archive/2022-11-15-batman-written-by-ai/</id>
    <published>2022-11-15T07:45:00.000Z</published>
    <updated>2022-12-11T02:46:22.268Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>蝙蝠侠站在他的蝙蝠车旁边，用着他的蝙蝠电脑。<br>他有时是布鲁斯韦恩，有时是蝙蝠侠。但他永远是个孤儿。</p><p>蝙蝠侠：<br>现在这是一个安全的城市。我把企鹅人打进了监狱。</p><p>阿尔弗雷德，蝙蝠侠的忠实战士，端着一盘哥特火腿。</p><p>阿尔弗雷德：<br>吃晚饭了，韦恩床垫。</p><p>爆炸发生了。小丑和双面人进入洞穴。<br>小丑是个小丑，但很疯狂。双面人是一个人，但不是律师。</p><p>蝙蝠侠：<br>不！他们是双面人和单面人。<br>他们恨我是一只蝙蝠。</p><p>蝙蝠侠将阿尔弗雷德扔向双面人。双面人像抛硬币一样抛投阿尔弗雷德。 阿尔弗雷德头朝上脚落地，于是双面人只好回家了。</p><p>蝙蝠侠：<br>现在只有你和我了，小丑。<br>蝙蝠对小丑。放下一切大干一场吧。</p><p>小丑：<br>我是个怪人。这个社会很糟糕。<br>你喝的是水，我喝的则是混乱。</p><p>蝙蝠侠：<br>不，我像蝙蝠一样喝蝙蝠！</p><p>蝙蝠侠四处寻找他的父母，但他们仍然死了。<br>这让他很生气。他发射了一枚蝙蝠飞弹。小丑用他病态的幽默感弹开了它。这就是小丑的力量。</p><p>小丑：<br>我从来没有遵守规则。那就是我的规则。你跟吗？我不。</p><p>蝙蝠侠：<br>阿尔弗雷德，去生下罗宾。</p><p>于是阿尔弗雷德开始生罗宾，因为这是他的工作。<br>小丑手里拿着一份礼物。 他把它交给了蝙蝠侠。</p><p>小丑：<br>蝙蝠日快乐，生日人。</p><p>蝙蝠侠打开礼物，因为他是个好人。礼物里有一张新父母兑换券，但已经过期了。<br>这是一个小丑笑话。</p></blockquote><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221129113735.png"></p><p>完全摸不着头脑，而且笑抽风了是不是。</p><p>据说这是喜剧演员兼作家 Keaton Patti 让一个人工智能机器人观看超过1000小时的蝙蝠侠电影，然后让它自己写一部蝙蝠侠电影剧本。</p><p>不得不说，故事还是挺精彩的，尤其抓住了双面人掷硬币和小丑开冷笑话的特征。这也是整个剧本的亮点。</p><p>可能大家现在还觉得ai蠢蠢的，但是放到2018年，那会儿我们几个人潜心研究区块链和人工智能的时候，才什么样子。短短4年，不论是自然语言、着色、绘画、故事逻辑，全都有了飞跃般的进步。未来是什么样真的难以预测。</p><p>这个时代的卷，很大程度上只是效率进步的副产物。当机器进一步替代了一些原来还需要靠人脑处理的事情，人类将继续探索一些现在还没深入的领域。</p><p>最后附上原文。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221115010241.png"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;蝙蝠侠站在他的蝙蝠车旁边，用着他的蝙蝠电脑。&lt;br&gt;他有时是布鲁斯韦恩，有时是蝙蝠侠。但他永远是个孤儿。&lt;/p&gt;
&lt;p&gt;蝙蝠侠：&lt;br&gt;现在这是一个安全的城市。我把企鹅人打进了监狱。&lt;/p&gt;
&lt;p&gt;阿尔弗雷德，蝙蝠侠的忠实战士，端着一盘哥特火腿。&lt;</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="人工智能" scheme="https://www.gsgundam.com/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    <category term="ai" scheme="https://www.gsgundam.com/tags/ai/"/>
    
    <category term="bot" scheme="https://www.gsgundam.com/tags/bot/"/>
    
    <category term="蝙蝠侠" scheme="https://www.gsgundam.com/tags/%E8%9D%99%E8%9D%A0%E4%BE%A0/"/>
    
    <category term="续集" scheme="https://www.gsgundam.com/tags/%E7%BB%AD%E9%9B%86/"/>
    
    <category term="续写" scheme="https://www.gsgundam.com/tags/%E7%BB%AD%E5%86%99/"/>
    
    <category term="batman" scheme="https://www.gsgundam.com/tags/batman/"/>
    
    <category term="剧本" scheme="https://www.gsgundam.com/tags/%E5%89%A7%E6%9C%AC/"/>
    
    <category term="电影" scheme="https://www.gsgundam.com/tags/%E7%94%B5%E5%BD%B1/"/>
    
  </entry>
  
  <entry>
    <title>nginx设置反向代理后js css文件无法加载</title>
    <link href="https://www.gsgundam.com/archive/2022-08-14-css-js-404-nginx-reverse-proxy/"/>
    <id>https://www.gsgundam.com/archive/2022-08-14-css-js-404-nginx-reverse-proxy/</id>
    <published>2022-08-14T07:45:00.000Z</published>
    <updated>2022-08-14T10:42:48.617Z</updated>
    
    <content type="html"><![CDATA[<p>最近发生了很多事情，不过中年人了，见怪不惊。已经出院4天了，很多事情都已经步入正轨。这不，又遇上工作的问题了。</p><p>第一次玩express+ejs的组合，其他都还顺利，唯独部署以后，用域名访问无法加载css js等文件。</p><p>很快确定了是反向代理的问题，因为直接ip+端口访问，是一切正常的。</p><p>谷歌了一下，很快得到了答案，这个组合下，需要对静态资源单独配置。直接上代码：</p><figure class="highlight apacheconf"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">server</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">80</span>;</span><br><span class="line">    <span class="attribute">server_name</span> moc.net.cn;</span><br><span class="line">    </span><br><span class="line">    <span class="comment">#禁止访问的文件或目录</span></span><br><span class="line">    <span class="attribute">location</span> ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="attribute">return</span> <span class="number">404</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="attribute">location</span> / &#123;</span><br><span class="line">      <span class="attribute">proxy_pass</span> http://<span class="number">127.0.0.1:8899</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># !!!--用于解决js css等资源无法加载的问题--!!!</span></span><br><span class="line">    <span class="attribute">location</span> ~ .*\.(js|css|jpg|gif|png|bmp|jpeg|svg)$ &#123;</span><br><span class="line">      <span class="attribute">proxy_pass</span> http://<span class="number">127.0.0.1:8899</span>; </span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>收工。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近发生了很多事情，不过中年人了，见怪不惊。已经出院4天了，很多事情都已经步入正轨。这不，又遇上工作的问题了。&lt;/p&gt;
&lt;p&gt;第一次玩express+ejs的组合，其他都还顺利，唯独部署以后，用域名访问无法加载css js等文件。&lt;/p&gt;
&lt;p&gt;很快确定了是反向代理的问题，</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="nginx" scheme="https://www.gsgundam.com/tags/nginx/"/>
    
    <category term="js" scheme="https://www.gsgundam.com/tags/js/"/>
    
    <category term="css" scheme="https://www.gsgundam.com/tags/css/"/>
    
    <category term="404" scheme="https://www.gsgundam.com/tags/404/"/>
    
    <category term="反向代理" scheme="https://www.gsgundam.com/tags/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/"/>
    
    <category term="gif" scheme="https://www.gsgundam.com/tags/gif/"/>
    
    <category term="reverse proxy" scheme="https://www.gsgundam.com/tags/reverse-proxy/"/>
    
    <category term="无法加载" scheme="https://www.gsgundam.com/tags/%E6%97%A0%E6%B3%95%E5%8A%A0%E8%BD%BD/"/>
    
  </entry>
  
  <entry>
    <title>Python实现带皮肤的电子钟</title>
    <link href="https://www.gsgundam.com/archive/2022-07-15-how-to-digital-clock-python/"/>
    <id>https://www.gsgundam.com/archive/2022-07-15-how-to-digital-clock-python/</id>
    <published>2022-07-15T09:30:00.000Z</published>
    <updated>2022-07-15T09:43:50.227Z</updated>
    
    <content type="html"><![CDATA[<p>原本这次实践是想看看翻译的，但是发现一众插件好像都有点问题，不知道是不是谷歌翻译的接口有变化了。</p><p>那这次就干脆简单实现个带皮肤的电子钟吧。</p><p>先确保依赖模块装了，这次是需要 <code>tkinter</code>。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install tkinter</span><br></pre></td></tr></table></figure><p>首先引入模块 <code>tkinter</code> 和 <code>time</code>。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> tkinter <span class="keyword">as</span> tk</span><br><span class="line"><span class="keyword">from</span> time <span class="keyword">import</span> strftime</span><br></pre></td></tr></table></figure><p>然后定义好界面样式，包括主题。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">light_theme</span>():</span><br><span class="line">    frame = tk.Frame(root, bg=<span class="string">&quot;white&quot;</span>)</span><br><span class="line">    frame.place(relx=<span class="number">0.1</span>, rely=<span class="number">0.1</span>, relwidth=<span class="number">0.8</span>, relheight=<span class="number">0.8</span>)</span><br><span class="line">    lbl_1 = tk.Label(frame, font=(<span class="string">&#x27;calibri&#x27;</span>, <span class="number">40</span>, <span class="string">&#x27;bold&#x27;</span>), background=<span class="string">&#x27;White&#x27;</span>, foreground=<span class="string">&#x27;black&#x27;</span>)</span><br><span class="line">    lbl_1.pack(anchor=<span class="string">&quot;s&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">time</span>():</span><br><span class="line">        string = strftime(<span class="string">&#x27;%I:%M:%S %p&#x27;</span>)</span><br><span class="line">        lbl_1.config(text=string)</span><br><span class="line">        lbl_1.after(<span class="number">1000</span>, time)</span><br><span class="line">    time()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">dark_theme</span>():</span><br><span class="line">    frame = tk.Frame(root, bg=<span class="string">&quot;#22478a&quot;</span>)</span><br><span class="line">    frame.place(relx=<span class="number">0.1</span>, rely=<span class="number">0.1</span>, relwidth=<span class="number">0.8</span>, relheight=<span class="number">0.8</span>)</span><br><span class="line">    lbl_2 = tk.Label(frame, font=(<span class="string">&#x27;calibri&#x27;</span>, <span class="number">40</span>, <span class="string">&#x27;bold&#x27;</span>), background=<span class="string">&#x27;#22478a&#x27;</span>, foreground=<span class="string">&#x27;white&#x27;</span>)</span><br><span class="line">    lbl_2.pack(anchor=<span class="string">&quot;s&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">time</span>():</span><br><span class="line">        string = strftime(<span class="string">&#x27;%I:%M:%S %p&#x27;</span>)</span><br><span class="line">        lbl_2.config(text=string)</span><br><span class="line">        lbl_2.after(<span class="number">1000</span>, time)</span><br><span class="line">    time()</span><br><span class="line"></span><br><span class="line">root = tk.Tk()</span><br><span class="line">root.title(<span class="string">&quot;电子钟&quot;</span>)</span><br><span class="line">canvas = tk.Canvas(root, height=<span class="number">140</span>, width=<span class="number">400</span>)</span><br><span class="line">canvas.pack()</span><br><span class="line"></span><br><span class="line">frame = tk.Frame(root, bg=<span class="string">&#x27;#22478a&#x27;</span>)</span><br><span class="line">frame.place(relx=<span class="number">0.1</span>, rely=<span class="number">0.1</span>, relwidth=<span class="number">0.8</span>, relheight=<span class="number">0.8</span>)</span><br><span class="line">lbl = tk.Label(frame, font=(<span class="string">&#x27;calibri&#x27;</span>, <span class="number">40</span>, <span class="string">&#x27;bold&#x27;</span>), background=<span class="string">&#x27;#22478a&#x27;</span>, foreground=<span class="string">&#x27;white&#x27;</span>)</span><br><span class="line">lbl.pack(anchor=<span class="string">&quot;s&quot;</span>)</span><br></pre></td></tr></table></figure><p>实现核心的显示时钟功能。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">time</span>():</span><br><span class="line">    string = strftime(<span class="string">&#x27;%I:%M:%S %p&#x27;</span>)</span><br><span class="line">    lbl.config(text=string)</span><br><span class="line">    lbl.after(<span class="number">1000</span>, time)</span><br><span class="line">time()</span><br></pre></td></tr></table></figure><p>最后，加上切换主题的方法。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">menubar = tk.Menu(root)</span><br><span class="line">theme_menu = tk.Menu(menubar, tearoff=<span class="number">0</span>)</span><br><span class="line">theme_menu.add_command(label=<span class="string">&quot;Light&quot;</span>, command=light_theme)</span><br><span class="line">theme_menu.add_command(label=<span class="string">&quot;Dark&quot;</span>, command=dark_theme)</span><br><span class="line">menubar.add_cascade(label=<span class="string">&quot;主题&quot;</span>, menu=theme_menu)</span><br><span class="line">root.config(menu=menubar)</span><br><span class="line">root.mainloop()</span><br></pre></td></tr></table></figure><p>运行一下看看。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20220715174323.png"></p><p>附上所有源码。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> tkinter <span class="keyword">as</span> tk</span><br><span class="line"><span class="keyword">from</span> time <span class="keyword">import</span> strftime</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">light_theme</span>():</span><br><span class="line">    frame = tk.Frame(root, bg=<span class="string">&quot;white&quot;</span>)</span><br><span class="line">    frame.place(relx=<span class="number">0.1</span>, rely=<span class="number">0.1</span>, relwidth=<span class="number">0.8</span>, relheight=<span class="number">0.8</span>)</span><br><span class="line">    lbl_1 = tk.Label(frame, font=(<span class="string">&#x27;calibri&#x27;</span>, <span class="number">40</span>, <span class="string">&#x27;bold&#x27;</span>), background=<span class="string">&#x27;White&#x27;</span>, foreground=<span class="string">&#x27;black&#x27;</span>)</span><br><span class="line">    lbl_1.pack(anchor=<span class="string">&quot;s&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">time</span>():</span><br><span class="line">        string = strftime(<span class="string">&#x27;%I:%M:%S %p&#x27;</span>)</span><br><span class="line">        lbl_1.config(text=string)</span><br><span class="line">        lbl_1.after(<span class="number">1000</span>, time)</span><br><span class="line">    time()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">dark_theme</span>():</span><br><span class="line">    frame = tk.Frame(root, bg=<span class="string">&quot;#22478a&quot;</span>)</span><br><span class="line">    frame.place(relx=<span class="number">0.1</span>, rely=<span class="number">0.1</span>, relwidth=<span class="number">0.8</span>, relheight=<span class="number">0.8</span>)</span><br><span class="line">    lbl_2 = tk.Label(frame, font=(<span class="string">&#x27;calibri&#x27;</span>, <span class="number">40</span>, <span class="string">&#x27;bold&#x27;</span>), background=<span class="string">&#x27;#22478a&#x27;</span>, foreground=<span class="string">&#x27;white&#x27;</span>)</span><br><span class="line">    lbl_2.pack(anchor=<span class="string">&quot;s&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">time</span>():</span><br><span class="line">        string = strftime(<span class="string">&#x27;%I:%M:%S %p&#x27;</span>)</span><br><span class="line">        lbl_2.config(text=string)</span><br><span class="line">        lbl_2.after(<span class="number">1000</span>, time)</span><br><span class="line">    time()</span><br><span class="line"></span><br><span class="line">root = tk.Tk()</span><br><span class="line">root.title(<span class="string">&quot;电子钟&quot;</span>)</span><br><span class="line">canvas = tk.Canvas(root, height=<span class="number">140</span>, width=<span class="number">400</span>)</span><br><span class="line">canvas.pack()</span><br><span class="line"></span><br><span class="line">frame = tk.Frame(root, bg=<span class="string">&#x27;#22478a&#x27;</span>)</span><br><span class="line">frame.place(relx=<span class="number">0.1</span>, rely=<span class="number">0.1</span>, relwidth=<span class="number">0.8</span>, relheight=<span class="number">0.8</span>)</span><br><span class="line">lbl = tk.Label(frame, font=(<span class="string">&#x27;calibri&#x27;</span>, <span class="number">40</span>, <span class="string">&#x27;bold&#x27;</span>), background=<span class="string">&#x27;#22478a&#x27;</span>, foreground=<span class="string">&#x27;white&#x27;</span>)</span><br><span class="line">lbl.pack(anchor=<span class="string">&quot;s&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">time</span>():</span><br><span class="line">    string = strftime(<span class="string">&#x27;%I:%M:%S %p&#x27;</span>)</span><br><span class="line">    lbl.config(text=string)</span><br><span class="line">    lbl.after(<span class="number">1000</span>, time)</span><br><span class="line">time()</span><br><span class="line"></span><br><span class="line">menubar = tk.Menu(root)</span><br><span class="line">theme_menu = tk.Menu(menubar, tearoff=<span class="number">0</span>)</span><br><span class="line">theme_menu.add_command(label=<span class="string">&quot;Light&quot;</span>, command=light_theme)</span><br><span class="line">theme_menu.add_command(label=<span class="string">&quot;Dark&quot;</span>, command=dark_theme)</span><br><span class="line">menubar.add_cascade(label=<span class="string">&quot;主题&quot;</span>, menu=theme_menu)</span><br><span class="line">root.config(menu=menubar)</span><br><span class="line">root.mainloop()</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;原本这次实践是想看看翻译的，但是发现一众插件好像都有点问题，不知道是不是谷歌翻译的接口有变化了。&lt;/p&gt;
&lt;p&gt;那这次就干脆简单实现个带皮肤的电子钟吧。&lt;/p&gt;
&lt;p&gt;先确保依赖模块装了，这次是需要 &lt;code&gt;tkinter&lt;/code&gt;。&lt;/p&gt;
&lt;figure cla</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="脚本" scheme="https://www.gsgundam.com/tags/%E8%84%9A%E6%9C%AC/"/>
    
    <category term="howto" scheme="https://www.gsgundam.com/tags/howto/"/>
    
    <category term="电子钟" scheme="https://www.gsgundam.com/tags/%E7%94%B5%E5%AD%90%E9%92%9F/"/>
    
    <category term="皮肤" scheme="https://www.gsgundam.com/tags/%E7%9A%AE%E8%82%A4/"/>
    
    <category term="暗夜" scheme="https://www.gsgundam.com/tags/%E6%9A%97%E5%A4%9C/"/>
    
    <category term="digital clock" scheme="https://www.gsgundam.com/tags/digital-clock/"/>
    
    <category term="skin" scheme="https://www.gsgundam.com/tags/skin/"/>
    
    <category term="dark" scheme="https://www.gsgundam.com/tags/dark/"/>
    
  </entry>
  
  <entry>
    <title>Python获取页面链接</title>
    <link href="https://www.gsgundam.com/archive/2022-07-14-how-to-all-links-webpage-python/"/>
    <id>https://www.gsgundam.com/archive/2022-07-14-how-to-all-links-webpage-python/</id>
    <published>2022-07-13T16:30:00.000Z</published>
    <updated>2022-07-13T16:45:53.697Z</updated>
    
    <content type="html"><![CDATA[<p>网页资源嗅探功能应该大部分人都很熟悉了，我们也用python来实验一下从指定的网页获取所有链接。</p><p>先安装好依赖模块。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pip install beautifulsoup4</span><br><span class="line">pip install requests</span><br></pre></td></tr></table></figure><p>结合前几个实践，这次的也是简单到不行，直接上代码。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests <span class="keyword">as</span> rq</span><br><span class="line"><span class="keyword">from</span> bs4 <span class="keyword">import</span> BeautifulSoup</span><br><span class="line"></span><br><span class="line">url = <span class="built_in">input</span>(<span class="string">&quot;Enter Link: &quot;</span>)</span><br><span class="line"><span class="keyword">if</span> (<span class="string">&quot;https&quot;</span> <span class="keyword">or</span> <span class="string">&quot;http&quot;</span>) <span class="keyword">in</span> url:</span><br><span class="line">    data = rq.get(url)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    data = rq.get(<span class="string">&quot;https://&quot;</span> + url)</span><br><span class="line">soup = BeautifulSoup(data.text, <span class="string">&quot;html.parser&quot;</span>)</span><br><span class="line">links = []</span><br><span class="line"><span class="keyword">for</span> link <span class="keyword">in</span> soup.find_all(<span class="string">&quot;a&quot;</span>):</span><br><span class="line">    links.append(link.get(<span class="string">&quot;href&quot;</span>))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 实际运用中可能会使用 a（追加）模式 来替代 w（写入）模式</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&quot;E:/WindowsDocuments/G7/Desktop/links.txt&quot;</span>, <span class="string">&#x27;w&#x27;</span>) <span class="keyword">as</span> saved:</span><br><span class="line">    <span class="built_in">print</span>(links[:<span class="number">10</span>], file=saved)</span><br></pre></td></tr></table></figure><p>输入 <code>www.baidu.com</code> ，得到下面的文件：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20220714004327.png"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;网页资源嗅探功能应该大部分人都很熟悉了，我们也用python来实验一下从指定的网页获取所有链接。&lt;/p&gt;
&lt;p&gt;先安装好依赖模块。&lt;/p&gt;
&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="脚本" scheme="https://www.gsgundam.com/tags/%E8%84%9A%E6%9C%AC/"/>
    
    <category term="howto" scheme="https://www.gsgundam.com/tags/howto/"/>
    
    <category term="实践" scheme="https://www.gsgundam.com/tags/%E5%AE%9E%E8%B7%B5/"/>
    
    <category term="页面" scheme="https://www.gsgundam.com/tags/%E9%A1%B5%E9%9D%A2/"/>
    
    <category term="链接" scheme="https://www.gsgundam.com/tags/%E9%93%BE%E6%8E%A5/"/>
    
    <category term="webpage" scheme="https://www.gsgundam.com/tags/webpage/"/>
    
    <category term="links" scheme="https://www.gsgundam.com/tags/links/"/>
    
  </entry>
  
  <entry>
    <title>Python生成指定长度随机密码</title>
    <link href="https://www.gsgundam.com/archive/2022-07-13-how-to-generate-random-password-python/"/>
    <id>https://www.gsgundam.com/archive/2022-07-13-how-to-generate-random-password-python/</id>
    <published>2022-07-12T16:30:00.000Z</published>
    <updated>2022-07-12T16:44:51.150Z</updated>
    
    <content type="html"><![CDATA[<p>这次实践做个简单实用的玩意，指定长度的随机密码。</p><p>自己是 <code>LastPass</code> app的忠实用户，生成随机密码的功能也经常用到，今天来实现一下。</p><p>首先导入 <code>random</code> 和 <code>math</code> 这两个自带库，并定义好组成密码的字符串内容。同时，也展示一个交互对话，让用户输入期望的密码长度。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> math</span><br><span class="line"></span><br><span class="line">alpha = <span class="string">&quot;abcdefghijklmnopqrstuvwxyz&quot;</span></span><br><span class="line">num = <span class="string">&quot;0123456789&quot;</span></span><br><span class="line">special = <span class="string">&quot;@#$%&amp;*!^&quot;</span></span><br><span class="line"></span><br><span class="line">pass_len = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&quot;Enter Password Length: &quot;</span>))</span><br></pre></td></tr></table></figure><p>然后，根据输入的长度，先分别生成字母、数字、特殊字符所需要的长度。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">alpha_len = pass_len//<span class="number">2</span></span><br><span class="line">num_len = math.ceil(pass_len*<span class="number">30</span>/<span class="number">100</span>)</span><br><span class="line">special_len = pass_len-(alpha_len+num_len)</span><br><span class="line"></span><br><span class="line">password = []</span><br></pre></td></tr></table></figure><p>接下来定义关键方法，在这里处理所有的字符串：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">generate_pass</span>(<span class="params">length, array, is_alpha=<span class="literal">False</span></span>):</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(length):</span><br><span class="line">        index = random.randint(<span class="number">0</span>, <span class="built_in">len</span>(array) - <span class="number">1</span>)</span><br><span class="line">        character = array[index]</span><br><span class="line">        <span class="keyword">if</span> is_alpha:</span><br><span class="line">            <span class="keyword">case</span> = random.randint(<span class="number">0</span>, <span class="number">1</span>)</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">case</span> == <span class="number">1</span>:</span><br><span class="line">                character = character.upper()</span><br><span class="line">        password.append(character)</span><br></pre></td></tr></table></figure><p>最后，调用处理密码字符串的方法，合并所有处理好的字符串，并随机排列一次，打印出来。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 英文字母</span></span><br><span class="line">generate_pass(alpha_len, alpha, <span class="literal">True</span>)</span><br><span class="line"><span class="comment"># 数字</span></span><br><span class="line">generate_pass(num_len, num)</span><br><span class="line"><span class="comment"># 特殊字符</span></span><br><span class="line">generate_pass(special_len, special)</span><br><span class="line"><span class="comment"># 随机排列所有字符</span></span><br><span class="line">random.shuffle(password)</span><br><span class="line"><span class="comment"># convert List To string</span></span><br><span class="line">gen_password = <span class="string">&quot;&quot;</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> password:</span><br><span class="line">    gen_password = gen_password + <span class="built_in">str</span>(i)</span><br><span class="line"><span class="built_in">print</span>(gen_password)</span><br></pre></td></tr></table></figure><p>附上完整代码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> math</span><br><span class="line"></span><br><span class="line">alpha = <span class="string">&quot;abcdefghijklmnopqrstuvwxyz&quot;</span></span><br><span class="line">num = <span class="string">&quot;0123456789&quot;</span></span><br><span class="line">special = <span class="string">&quot;@#$%&amp;*!^&quot;</span></span><br><span class="line"></span><br><span class="line">pass_len = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&quot;Enter Password Length: &quot;</span>))</span><br><span class="line"></span><br><span class="line">alpha_len = pass_len//<span class="number">2</span></span><br><span class="line">num_len = math.ceil(pass_len*<span class="number">30</span>/<span class="number">100</span>)</span><br><span class="line">special_len = pass_len-(alpha_len+num_len)</span><br><span class="line"></span><br><span class="line">password = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">generate_pass</span>(<span class="params">length, array, is_alpha=<span class="literal">False</span></span>):</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(length):</span><br><span class="line">        index = random.randint(<span class="number">0</span>, <span class="built_in">len</span>(array) - <span class="number">1</span>)</span><br><span class="line">        character = array[index]</span><br><span class="line">        <span class="keyword">if</span> is_alpha:</span><br><span class="line">            <span class="keyword">case</span> = random.randint(<span class="number">0</span>, <span class="number">1</span>)</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">case</span> == <span class="number">1</span>:</span><br><span class="line">                character = character.upper()</span><br><span class="line">        password.append(character)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 英文字母</span></span><br><span class="line">generate_pass(alpha_len, alpha, <span class="literal">True</span>)</span><br><span class="line"><span class="comment"># 数字</span></span><br><span class="line">generate_pass(num_len, num)</span><br><span class="line"><span class="comment"># 特殊字符</span></span><br><span class="line">generate_pass(special_len, special)</span><br><span class="line"><span class="comment"># 随机排列所有字符</span></span><br><span class="line">random.shuffle(password)</span><br><span class="line"><span class="comment"># convert List To string</span></span><br><span class="line">gen_password = <span class="string">&quot;&quot;</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> password:</span><br><span class="line">    gen_password = gen_password + <span class="built_in">str</span>(i)</span><br><span class="line"><span class="built_in">print</span>(gen_password)</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;这次实践做个简单实用的玩意，指定长度的随机密码。&lt;/p&gt;
&lt;p&gt;自己是 &lt;code&gt;LastPass&lt;/code&gt; app的忠实用户，生成随机密码的功能也经常用到，今天来实现一下。&lt;/p&gt;
&lt;p&gt;首先导入 &lt;code&gt;random&lt;/code&gt; 和 &lt;code&gt;math&lt;/</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="脚本" scheme="https://www.gsgundam.com/tags/%E8%84%9A%E6%9C%AC/"/>
    
    <category term="howto" scheme="https://www.gsgundam.com/tags/howto/"/>
    
    <category term="实践" scheme="https://www.gsgundam.com/tags/%E5%AE%9E%E8%B7%B5/"/>
    
    <category term="随机密码" scheme="https://www.gsgundam.com/tags/%E9%9A%8F%E6%9C%BA%E5%AF%86%E7%A0%81/"/>
    
    <category term="password" scheme="https://www.gsgundam.com/tags/password/"/>
    
    <category term="random" scheme="https://www.gsgundam.com/tags/random/"/>
    
  </entry>
  
  <entry>
    <title>用Python将图片转为彩色字符画</title>
    <link href="https://www.gsgundam.com/archive/2022-07-12-how-to-draw-image-ascii-color-python-pil-tkinter/"/>
    <id>https://www.gsgundam.com/archive/2022-07-12-how-to-draw-image-ascii-color-python-pil-tkinter/</id>
    <published>2022-07-11T16:30:00.000Z</published>
    <updated>2022-07-11T16:58:24.115Z</updated>
    
    <content type="html"><![CDATA[<p>说实话，原本我也没想到做个字符画还能有续集。今天搜教程，看到了有彩色版的转换方式。有了之前两个教程的基础，既解决了基本的字符处理问题( <a href="https://gsgundam.com/2022-07-10-how-to-draw-image-ascii-python-pil/">用Python将图片转为字符画</a> )，又解决了界面问题( <a href="https://gsgundam.com/2022-07-11-how-to-simple-calculator-python-tkinter/">用Python实现简易计算器</a> )，这次的实践就是轻松加愉快了。</p><p>如果没有基础，可以看前面两篇了解一下，这次就直接上代码吧。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image, ImageFont, ImageDraw</span><br><span class="line"><span class="keyword">from</span> tkinter <span class="keyword">import</span> filedialog, Tk</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">open_path</span>():</span><br><span class="line">    root = Tk()</span><br><span class="line">    root.withdraw()</span><br><span class="line">    file_path = (filedialog.askopenfilename(title=<span class="string">&#x27;选择图片文件&#x27;</span>, filetypes=[(<span class="string">&#x27;All Files&#x27;</span>, <span class="string">&#x27;*&#x27;</span>)]))</span><br><span class="line">    <span class="keyword">return</span> file_path</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;请选择图片：&#x27;</span>)</span><br><span class="line">IMG = open_path()  <span class="comment"># 图片路径</span></span><br><span class="line">ascii_char = <span class="built_in">list</span>(<span class="string">&quot;$@B%8&amp;WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1&#123;&#125;[]?-_+~&lt;&gt;i!lI;:,\&quot;^`&#x27;. &quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;正在转换......&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_char</span>(<span class="params">r, g, b, alpha=<span class="number">256</span></span>):  <span class="comment"># alpha透明度</span></span><br><span class="line">    <span class="keyword">if</span> alpha == <span class="number">0</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27; &#x27;</span></span><br><span class="line">    length = <span class="built_in">len</span>(ascii_char)</span><br><span class="line">    gray = <span class="built_in">int</span>(<span class="number">0.2126</span> * r + <span class="number">0.7152</span> * g + <span class="number">0.0722</span> * b)</span><br><span class="line">    unit = (<span class="number">256.0</span> + <span class="number">1</span>) / length</span><br><span class="line">    <span class="keyword">return</span> ascii_char[<span class="built_in">int</span>(gray / unit)]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">save_path</span>():</span><br><span class="line">    <span class="comment"># 保存图片路径</span></span><br><span class="line">    root = Tk()</span><br><span class="line">    root.withdraw()</span><br><span class="line">    file_path = (filedialog.asksaveasfilename(title=<span class="string">&#x27;保存路径&#x27;</span>, filetypes=[(<span class="string">&#x27;All Files&#x27;</span>, <span class="string">&#x27;*&#x27;</span>)]))</span><br><span class="line">    <span class="keyword">return</span> file_path</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    img = Image.<span class="built_in">open</span>(IMG)</span><br><span class="line">    WIDTH = <span class="built_in">int</span>(img.width / <span class="number">6</span>)</span><br><span class="line">    HEIGHT = <span class="built_in">int</span>(img.height / <span class="number">15</span>)</span><br><span class="line">    img_txt = Image.new(<span class="string">&quot;RGB&quot;</span>, (img.width, img.height), (<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>))</span><br><span class="line">    img = img.resize((WIDTH, HEIGHT), Image.NEAREST)</span><br><span class="line">    txt = <span class="string">&quot;&quot;</span></span><br><span class="line">    colors = []</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(HEIGHT):</span><br><span class="line">        <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(WIDTH):</span><br><span class="line">            pixel = img.getpixel((j, i))</span><br><span class="line">            colors.append((pixel[<span class="number">0</span>], pixel[<span class="number">1</span>], pixel[<span class="number">2</span>]))  <span class="comment"># 记录像素颜色信息</span></span><br><span class="line">            <span class="keyword">if</span> (<span class="built_in">len</span>(pixel) == <span class="number">4</span>):</span><br><span class="line">                txt += get_char(pixel[<span class="number">0</span>], pixel[<span class="number">1</span>], pixel[<span class="number">2</span>], pixel[<span class="number">3</span>])</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                txt += get_char(pixel[<span class="number">0</span>], pixel[<span class="number">1</span>], pixel[<span class="number">2</span>])</span><br><span class="line">        txt += <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">        colors.append((<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>))</span><br><span class="line">    dr = ImageDraw.Draw(img_txt)</span><br><span class="line">    font = ImageFont.load_default().font</span><br><span class="line">    x = y = <span class="number">0</span></span><br><span class="line">    <span class="comment"># 获取字体的宽高</span></span><br><span class="line">    font_w, font_h = font.getsize(txt[<span class="number">1</span>])</span><br><span class="line">    font_h *= <span class="number">1.37</span></span><br><span class="line">    <span class="comment"># 为每个ascii进行上色</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(txt)):</span><br><span class="line">        <span class="keyword">if</span> (txt[i] == <span class="string">&#x27;\n&#x27;</span>):</span><br><span class="line">            x += font_h</span><br><span class="line">            y = -font_w</span><br><span class="line">        dr.text([y, x], txt[i], colors[i])</span><br><span class="line">        y += font_w</span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;转换成功！&#x27;</span>)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;请选择保存路径：&#x27;</span>)</span><br><span class="line">    save_path = save_path()+<span class="string">&#x27;.png&#x27;</span></span><br><span class="line">    img_txt.save(save_path)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;保存成功&#x27;</span>)</span><br><span class="line">    img = Image.<span class="built_in">open</span>(save_path)</span><br><span class="line">    img.show()</span><br></pre></td></tr></table></figure><p>原图片、完成图、细节图如下。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20220712005503.png"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;说实话，原本我也没想到做个字符画还能有续集。今天搜教程，看到了有彩色版的转换方式。有了之前两个教程的基础，既解决了基本的字符处理问题( &lt;a href=&quot;https://gsgundam.com/2022-07-10-how-to-draw-image-ascii-pyth</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="图片" scheme="https://www.gsgundam.com/tags/%E5%9B%BE%E7%89%87/"/>
    
    <category term="脚本" scheme="https://www.gsgundam.com/tags/%E8%84%9A%E6%9C%AC/"/>
    
    <category term="howto" scheme="https://www.gsgundam.com/tags/howto/"/>
    
    <category term="pil" scheme="https://www.gsgundam.com/tags/pil/"/>
    
    <category term="字符画" scheme="https://www.gsgundam.com/tags/%E5%AD%97%E7%AC%A6%E7%94%BB/"/>
    
    <category term="实践" scheme="https://www.gsgundam.com/tags/%E5%AE%9E%E8%B7%B5/"/>
    
    <category term="间谍过家家" scheme="https://www.gsgundam.com/tags/%E9%97%B4%E8%B0%8D%E8%BF%87%E5%AE%B6%E5%AE%B6/"/>
    
    <category term="阿尼亚" scheme="https://www.gsgundam.com/tags/%E9%98%BF%E5%B0%BC%E4%BA%9A/"/>
    
    <category term="spy family" scheme="https://www.gsgundam.com/tags/spy-family/"/>
    
    <category term="anya" scheme="https://www.gsgundam.com/tags/anya/"/>
    
    <category term="tkinter" scheme="https://www.gsgundam.com/tags/tkinter/"/>
    
  </entry>
  
  <entry>
    <title>用Python实现简易计算器</title>
    <link href="https://www.gsgundam.com/archive/2022-07-11-how-to-simple-calculator-python-tkinter/"/>
    <id>https://www.gsgundam.com/archive/2022-07-11-how-to-simple-calculator-python-tkinter/</id>
    <published>2022-07-10T16:30:00.000Z</published>
    <updated>2022-07-10T16:30:42.020Z</updated>
    
    <content type="html"><![CDATA[<p>又看到个好玩的，赶紧来试试。利用Python 3 自带的 <code>tkinter</code> 库做一个简单的计算器。</p><p><code>tkinter</code> 主要是解决界面问题。</p><p>首先导入库，定义计算器的界面窗体。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> tkinter <span class="keyword">as</span> tk</span><br><span class="line"></span><br><span class="line"><span class="comment"># 新建一个主窗口</span></span><br><span class="line">root = tk.Tk()</span><br><span class="line"><span class="comment"># 设置窗口的大小</span></span><br><span class="line">root.geometry(<span class="string">&#x27;480x300+100+100&#x27;</span>)</span><br><span class="line"><span class="comment"># 设置窗口的标题</span></span><br><span class="line">root.title(<span class="string">&quot;计算器&quot;</span>)</span><br></pre></td></tr></table></figure><p>接下来定义界面控件，并关联事件。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 定义一个可变字符变量</span></span><br><span class="line">result_str= tk.StringVar()</span><br><span class="line">result_str.<span class="built_in">set</span>(<span class="string">&#x27;&#x27;</span>)</span><br><span class="line">label = tk.Label(root,textvariable=result_str,font=(<span class="string">&#x27;宋体&#x27;</span>,<span class="number">20</span>),width=<span class="number">32</span>,padx=<span class="number">5</span>, pady=<span class="number">5</span>,anchor=<span class="string">&#x27;e&#x27;</span>)</span><br><span class="line">label.grid(row=<span class="number">1</span>,column=<span class="number">1</span>,columnspan=<span class="number">4</span>)</span><br><span class="line">font_number = (<span class="string">&#x27;宋体&#x27;</span>,<span class="number">18</span>)</span><br><span class="line">btn_m = tk.Button(root,text=<span class="string">&#x27;%&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_CE = tk.Button(root,text=<span class="string">&#x27;CE&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_clear = tk.Button(root,text=<span class="string">&#x27;C&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_div = tk.Button(root,text=<span class="string">&#x27;/&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_m.grid(row=<span class="number">2</span>,column=<span class="number">1</span>)</span><br><span class="line">btn_CE.grid(row=<span class="number">2</span>,column=<span class="number">2</span>)</span><br><span class="line">btn_clear.grid(row=<span class="number">2</span>,column=<span class="number">3</span>)</span><br><span class="line">btn_div.grid(row=<span class="number">2</span>,column=<span class="number">4</span>)</span><br><span class="line">font_number = (<span class="string">&#x27;宋体&#x27;</span>,<span class="number">18</span>)</span><br><span class="line">btn_seven = tk.Button(root,text=<span class="string">&#x27;7&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_eight = tk.Button(root,text=<span class="string">&#x27;8&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_nine = tk.Button(root,text=<span class="string">&#x27;9&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_multi = tk.Button(root,text=<span class="string">&#x27;x&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_seven.grid(row=<span class="number">3</span>,column=<span class="number">1</span>)</span><br><span class="line">btn_eight.grid(row=<span class="number">3</span>,column=<span class="number">2</span>)</span><br><span class="line">btn_nine.grid(row=<span class="number">3</span>,column=<span class="number">3</span>)</span><br><span class="line">btn_multi.grid(row=<span class="number">3</span>,column=<span class="number">4</span>)</span><br><span class="line"></span><br><span class="line">btn_four = tk.Button(root,text=<span class="string">&#x27;4&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_five = tk.Button(root,text=<span class="string">&#x27;5&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_six = tk.Button(root,text=<span class="string">&#x27;6&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_sub = tk.Button(root,text=<span class="string">&#x27;-&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_four.grid(row=<span class="number">4</span>,column=<span class="number">1</span>)</span><br><span class="line">btn_five.grid(row=<span class="number">4</span>,column=<span class="number">2</span>)</span><br><span class="line">btn_six.grid(row=<span class="number">4</span>,column=<span class="number">3</span>)</span><br><span class="line">btn_sub.grid(row=<span class="number">4</span>,column=<span class="number">4</span>)</span><br><span class="line">btn_one = tk.Button(root,text=<span class="string">&#x27;1&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_two = tk.Button(root,text=<span class="string">&#x27;2&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_three = tk.Button(root,text=<span class="string">&#x27;3&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_add = tk.Button(root,text=<span class="string">&#x27;+&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_one.grid(row=<span class="number">5</span>,column=<span class="number">1</span>)</span><br><span class="line">btn_two.grid(row=<span class="number">5</span>,column=<span class="number">2</span>)</span><br><span class="line">btn_three.grid(row=<span class="number">5</span>,column=<span class="number">3</span>)</span><br><span class="line">btn_add.grid(row=<span class="number">5</span>,column=<span class="number">4</span>)</span><br><span class="line"></span><br><span class="line">btn_zero = tk.Button(root,text=<span class="string">&#x27;0&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">18</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_dot = tk.Button(root,text=<span class="string">&#x27;.&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_equal = tk.Button(root,text=<span class="string">&#x27;=&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_zero.grid(row=<span class="number">6</span>,column=<span class="number">1</span>,columnspan=<span class="number">2</span>)</span><br><span class="line">btn_dot.grid(row=<span class="number">6</span>,column=<span class="number">3</span>)</span><br><span class="line">btn_equal.grid(row=<span class="number">6</span>,column=<span class="number">4</span>)</span><br></pre></td></tr></table></figure><p>再然后处理按键事件</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">inputnumber</span>(<span class="params">param</span>):</span><br><span class="line">    <span class="comment"># 定义global变量</span></span><br><span class="line">    result_str.<span class="built_in">set</span>(result_str.get() + param)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">equal</span>():</span><br><span class="line">    <span class="built_in">str</span> = result_str.get()</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(<span class="built_in">str</span>) != <span class="number">0</span>:</span><br><span class="line">        num = <span class="built_in">eval</span>(<span class="built_in">str</span>)</span><br><span class="line">        result_str.<span class="built_in">set</span>(num)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">clear</span>():</span><br><span class="line">    result_str.<span class="built_in">set</span>(<span class="string">&#x27;&#x27;</span>)</span><br><span class="line">btn_zero.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;0&#x27;</span>) );</span><br><span class="line">btn_one.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;1&#x27;</span>) );</span><br><span class="line">btn_two.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;2&#x27;</span>));</span><br><span class="line">btn_three.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;3&#x27;</span>));</span><br><span class="line">btn_four.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;4&#x27;</span>));</span><br><span class="line">btn_five.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;5&#x27;</span>));</span><br><span class="line">btn_six.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;6&#x27;</span>));</span><br><span class="line">btn_seven.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;7&#x27;</span>));</span><br><span class="line">btn_eight.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;8&#x27;</span>));</span><br><span class="line">btn_nine.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;9&#x27;</span>));</span><br><span class="line">btn_add.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;+&#x27;</span>));</span><br><span class="line">btn_sub.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;-&#x27;</span>));</span><br><span class="line">btn_multi.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;*&#x27;</span>));</span><br><span class="line">btn_div.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;/&#x27;</span>));</span><br><span class="line">btn_dot.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;.&#x27;</span>));</span><br><span class="line"></span><br><span class="line"><span class="comment">#定义等于点击事件</span></span><br><span class="line">btn_equal.config(command=equal)</span><br><span class="line"><span class="comment">#清除结果</span></span><br><span class="line">btn_clear.config(command=clear)</span><br></pre></td></tr></table></figure><p>最后运行窗体主循环。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">root.mainloop()</span><br></pre></td></tr></table></figure><p>运行一下，效果如图。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20220711002948.png"></p><p>附上全部代码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> tkinter <span class="keyword">as</span> tk</span><br><span class="line"></span><br><span class="line"><span class="comment"># 新建一个主窗口</span></span><br><span class="line">root = tk.Tk()</span><br><span class="line"><span class="comment"># 设置窗口的大小</span></span><br><span class="line">root.geometry(<span class="string">&#x27;462x300+100+100&#x27;</span>)</span><br><span class="line"><span class="comment"># 设置窗口的标题</span></span><br><span class="line">root.title(<span class="string">&quot;计算器&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 定义一个可变字符变量</span></span><br><span class="line">result_str= tk.StringVar()</span><br><span class="line">result_str.<span class="built_in">set</span>(<span class="string">&#x27;&#x27;</span>)</span><br><span class="line">label = tk.Label(root,textvariable=result_str,font=(<span class="string">&#x27;宋体&#x27;</span>,<span class="number">20</span>),width=<span class="number">32</span>,padx=<span class="number">5</span>, pady=<span class="number">5</span>,anchor=<span class="string">&#x27;e&#x27;</span>)</span><br><span class="line">label.grid(row=<span class="number">1</span>,column=<span class="number">1</span>,columnspan=<span class="number">4</span>)</span><br><span class="line">font_number = (<span class="string">&#x27;宋体&#x27;</span>,<span class="number">18</span>)</span><br><span class="line">btn_m = tk.Button(root,text=<span class="string">&#x27;%&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_CE = tk.Button(root,text=<span class="string">&#x27;CE&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_clear = tk.Button(root,text=<span class="string">&#x27;C&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_div = tk.Button(root,text=<span class="string">&#x27;/&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_m.grid(row=<span class="number">2</span>,column=<span class="number">1</span>)</span><br><span class="line">btn_CE.grid(row=<span class="number">2</span>,column=<span class="number">2</span>)</span><br><span class="line">btn_clear.grid(row=<span class="number">2</span>,column=<span class="number">3</span>)</span><br><span class="line">btn_div.grid(row=<span class="number">2</span>,column=<span class="number">4</span>)</span><br><span class="line">font_number = (<span class="string">&#x27;宋体&#x27;</span>,<span class="number">18</span>)</span><br><span class="line">btn_seven = tk.Button(root,text=<span class="string">&#x27;7&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_eight = tk.Button(root,text=<span class="string">&#x27;8&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_nine = tk.Button(root,text=<span class="string">&#x27;9&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_multi = tk.Button(root,text=<span class="string">&#x27;x&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_seven.grid(row=<span class="number">3</span>,column=<span class="number">1</span>)</span><br><span class="line">btn_eight.grid(row=<span class="number">3</span>,column=<span class="number">2</span>)</span><br><span class="line">btn_nine.grid(row=<span class="number">3</span>,column=<span class="number">3</span>)</span><br><span class="line">btn_multi.grid(row=<span class="number">3</span>,column=<span class="number">4</span>)</span><br><span class="line"></span><br><span class="line">btn_four = tk.Button(root,text=<span class="string">&#x27;4&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_five = tk.Button(root,text=<span class="string">&#x27;5&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_six = tk.Button(root,text=<span class="string">&#x27;6&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_sub = tk.Button(root,text=<span class="string">&#x27;-&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_four.grid(row=<span class="number">4</span>,column=<span class="number">1</span>)</span><br><span class="line">btn_five.grid(row=<span class="number">4</span>,column=<span class="number">2</span>)</span><br><span class="line">btn_six.grid(row=<span class="number">4</span>,column=<span class="number">3</span>)</span><br><span class="line">btn_sub.grid(row=<span class="number">4</span>,column=<span class="number">4</span>)</span><br><span class="line">btn_one = tk.Button(root,text=<span class="string">&#x27;1&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_two = tk.Button(root,text=<span class="string">&#x27;2&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_three = tk.Button(root,text=<span class="string">&#x27;3&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_add = tk.Button(root,text=<span class="string">&#x27;+&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_one.grid(row=<span class="number">5</span>,column=<span class="number">1</span>)</span><br><span class="line">btn_two.grid(row=<span class="number">5</span>,column=<span class="number">2</span>)</span><br><span class="line">btn_three.grid(row=<span class="number">5</span>,column=<span class="number">3</span>)</span><br><span class="line">btn_add.grid(row=<span class="number">5</span>,column=<span class="number">4</span>)</span><br><span class="line"></span><br><span class="line">btn_zero = tk.Button(root,text=<span class="string">&#x27;0&#x27;</span>,font=font_number,bg=<span class="string">&#x27;#FFFFFF&#x27;</span>,width=<span class="number">18</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_dot = tk.Button(root,text=<span class="string">&#x27;.&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_equal = tk.Button(root,text=<span class="string">&#x27;=&#x27;</span>,font=font_number,width=<span class="number">8</span>,padx=<span class="number">5</span>,pady=<span class="number">5</span>)</span><br><span class="line">btn_zero.grid(row=<span class="number">6</span>,column=<span class="number">1</span>,columnspan=<span class="number">2</span>)</span><br><span class="line">btn_dot.grid(row=<span class="number">6</span>,column=<span class="number">3</span>)</span><br><span class="line">btn_equal.grid(row=<span class="number">6</span>,column=<span class="number">4</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inputnumber</span>(<span class="params">param</span>):</span><br><span class="line">    <span class="comment"># 定义global变量</span></span><br><span class="line">    result_str.<span class="built_in">set</span>(result_str.get() + param)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">equal</span>():</span><br><span class="line">    <span class="built_in">str</span> = result_str.get()</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(<span class="built_in">str</span>) != <span class="number">0</span>:</span><br><span class="line">        num = <span class="built_in">eval</span>(<span class="built_in">str</span>)</span><br><span class="line">        result_str.<span class="built_in">set</span>(num)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">clear</span>():</span><br><span class="line">    result_str.<span class="built_in">set</span>(<span class="string">&#x27;&#x27;</span>)</span><br><span class="line">btn_zero.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;0&#x27;</span>) );</span><br><span class="line">btn_one.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;1&#x27;</span>) );</span><br><span class="line">btn_two.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;2&#x27;</span>));</span><br><span class="line">btn_three.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;3&#x27;</span>));</span><br><span class="line">btn_four.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;4&#x27;</span>));</span><br><span class="line">btn_five.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;5&#x27;</span>));</span><br><span class="line">btn_six.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;6&#x27;</span>));</span><br><span class="line">btn_seven.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;7&#x27;</span>));</span><br><span class="line">btn_eight.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;8&#x27;</span>));</span><br><span class="line">btn_nine.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;9&#x27;</span>));</span><br><span class="line">btn_add.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;+&#x27;</span>));</span><br><span class="line">btn_sub.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;-&#x27;</span>));</span><br><span class="line">btn_multi.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;*&#x27;</span>));</span><br><span class="line">btn_div.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;/&#x27;</span>));</span><br><span class="line">btn_dot.config(command=<span class="keyword">lambda</span>:inputnumber(<span class="string">&#x27;.&#x27;</span>));</span><br><span class="line"></span><br><span class="line"><span class="comment">#定义等于点击事件</span></span><br><span class="line">btn_equal.config(command=equal)</span><br><span class="line"><span class="comment">#清除结果</span></span><br><span class="line">btn_clear.config(command=clear)</span><br><span class="line"></span><br><span class="line">root.mainloop()</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;又看到个好玩的，赶紧来试试。利用Python 3 自带的 &lt;code&gt;tkinter&lt;/code&gt; 库做一个简单的计算器。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tkinter&lt;/code&gt; 主要是解决界面问题。&lt;/p&gt;
&lt;p&gt;首先导入库，定义计算器的界面窗体。&lt;/p&gt;
&lt;figure</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="计算器" scheme="https://www.gsgundam.com/tags/%E8%AE%A1%E7%AE%97%E5%99%A8/"/>
    
    <category term="脚本" scheme="https://www.gsgundam.com/tags/%E8%84%9A%E6%9C%AC/"/>
    
    <category term="howto" scheme="https://www.gsgundam.com/tags/howto/"/>
    
    <category term="实践" scheme="https://www.gsgundam.com/tags/%E5%AE%9E%E8%B7%B5/"/>
    
    <category term="calculator" scheme="https://www.gsgundam.com/tags/calculator/"/>
    
    <category term="tkinter" scheme="https://www.gsgundam.com/tags/tkinter/"/>
    
  </entry>
  
  <entry>
    <title>用Python搭建简单的web服务器</title>
    <link href="https://www.gsgundam.com/archive/2022-07-10-how-to-simple-socket-server-python/"/>
    <id>https://www.gsgundam.com/archive/2022-07-10-how-to-simple-socket-server-python/</id>
    <published>2022-07-10T05:30:00.000Z</published>
    <updated>2022-07-10T05:46:10.398Z</updated>
    
    <content type="html"><![CDATA[<p>之前写vue的时候，有时会用到Python的 <code>SimpleHTTPServer</code> 。SimpleHTTPServer是Python 2自带的一个模块，是Python的Web服务器。在Python 3已经合并到http.server模块中。如果不指定端口号默认的是8000端口。在局域网中使用web去访问 <code>http:/IP:8000</code> 即可。</p><p>其中Python 2语法为：<code>python -m SimpleHTTPServer</code></p><p>Python 3语法为：<code>python -m http.server</code></p><p>当然，这个只是顺带提一句。因为今天打算实践的是C&#x2F;S双向通信。</p><p>代码特别好懂，就不赘述了。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> threading</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"> </span><br><span class="line">server = socket.socket()</span><br><span class="line"> </span><br><span class="line">server.bind((<span class="string">&#x27;127.0.0.1&#x27;</span>, <span class="number">8080</span>))</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;Server started, http://127.0.0.1&#x27;</span>)</span><br><span class="line">server.listen(<span class="number">20</span>)</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"><span class="keyword">def</span> <span class="title function_">send</span>(<span class="params">client: <span class="built_in">tuple</span></span>):</span><br><span class="line">    header = <span class="string">&#x27;HTTP/1.1 200 OK&#x27;</span></span><br><span class="line">    body = <span class="string">f&#x27;&#x27;&#x27;&lt;html&gt;</span></span><br><span class="line"><span class="string">        &lt;head&gt;</span></span><br><span class="line"><span class="string">            &lt;title&gt;Test Page&lt;/title&gt;</span></span><br><span class="line"><span class="string">        &lt;/head&gt;</span></span><br><span class="line"><span class="string">        &lt;body&gt;</span></span><br><span class="line"><span class="string">          &lt;h1 style=&#x27;color:red;&#x27;&gt;Welcome:<span class="subst">&#123;client[<span class="number">1</span>]&#125;</span>&lt;/h1&gt;</span></span><br><span class="line"><span class="string">          &lt;img src =&#x27;http://wubaiyi.oss-cn-beijing.aliyuncs.com/202205/16/131514261.jpg&#x27;&gt;</span></span><br><span class="line"><span class="string">        &lt;/body&gt;</span></span><br><span class="line"><span class="string">        &lt;/html&gt;&#x27;&#x27;&#x27;</span></span><br><span class="line">    data = header + <span class="string">&#x27;\r\n\r\n&#x27;</span> + body</span><br><span class="line">    client[<span class="number">0</span>].send(data.encode())</span><br><span class="line"> </span><br><span class="line">    time.sleep(<span class="number">1</span>)</span><br><span class="line">    client[<span class="number">0</span>].close()</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">    client = server.accept()</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;Welcome, &#x27;</span>, client[<span class="number">1</span>])</span><br><span class="line">    threading.Thread(target=send, args=(client,)).start()</span><br></pre></td></tr></table></figure><p>首先，命令行启动服务端。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20220710134444.png"></p><p>然后打开网页，网页和服务端控制台都正常输出。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20220710134544.png"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20220710134602.png"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;之前写vue的时候，有时会用到Python的 &lt;code&gt;SimpleHTTPServer&lt;/code&gt; 。SimpleHTTPServer是Python 2自带的一个模块，是Python的Web服务器。在Python 3已经合并到http.server模块中。如果不指定端</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="服务器" scheme="https://www.gsgundam.com/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="socket" scheme="https://www.gsgundam.com/tags/socket/"/>
    
    <category term="脚本" scheme="https://www.gsgundam.com/tags/%E8%84%9A%E6%9C%AC/"/>
    
    <category term="howto" scheme="https://www.gsgundam.com/tags/howto/"/>
    
    <category term="实践" scheme="https://www.gsgundam.com/tags/%E5%AE%9E%E8%B7%B5/"/>
    
    <category term="server" scheme="https://www.gsgundam.com/tags/server/"/>
    
  </entry>
  
  <entry>
    <title>用Python将图片转为字符画</title>
    <link href="https://www.gsgundam.com/archive/2022-07-10-how-to-draw-image-ascii-python-pil/"/>
    <id>https://www.gsgundam.com/archive/2022-07-10-how-to-draw-image-ascii-python-pil/</id>
    <published>2022-07-09T16:30:00.000Z</published>
    <updated>2022-07-10T05:22:30.862Z</updated>
    
    <content type="html"><![CDATA[<p>今天打算玩个好玩的，也是基于一个优秀的图像处理库——PIL，使用ascii字符把图片转为黑白字符画。</p><p>首先有个问题，就是模拟灰度，这里有个公式：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Gray = 0.2126 × R + 0.7152 × G + 0.0722 × B</span><br></pre></td></tr></table></figure><p>这样就好办了。当然，RGB模式下，256x256x256的颜色范围虽然被转换成了256的灰度范围，字符还是不好一一对应。我们可以使用一个字符对应多个灰度的方式来解决。</p><p>记得要先安装PIL库，其中：</p><p>如果是Python 2，运行 <code>pip install PIL</code>。</p><p>如果是Python 3，运行 <code>pip install pillow</code>。</p><p>接下来直接上代码吧：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image</span><br><span class="line"><span class="comment">#设置显示的字符集</span></span><br><span class="line">ascii_char = <span class="built_in">list</span>(<span class="string">&quot;$@B%8&amp;WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1&#123;&#125;[]?-_+~&lt;&gt;i!lI;:,\&quot;^`&#x27;. &quot;</span>)    </span><br><span class="line">WIDTH = <span class="number">130</span></span><br><span class="line">HEIGHT = <span class="number">50</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_char</span>(<span class="params">r,g,b,alpha = <span class="number">256</span></span>):</span><br><span class="line">    <span class="keyword">if</span> alpha == <span class="number">0</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27; &#x27;</span></span><br><span class="line">    length = <span class="built_in">len</span>(ascii_char)</span><br><span class="line">    gray = <span class="built_in">int</span>(<span class="number">0.2126</span> * r + <span class="number">0.7152</span> * g + <span class="number">0.0722</span> * b)</span><br><span class="line">    unit = (<span class="number">255.0</span> + <span class="number">1</span>)/length</span><br><span class="line">    <span class="keyword">return</span> ascii_char[<span class="built_in">int</span>(gray/unit)]</span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    img = <span class="string">&quot;E:/WindowsDocuments/G7/Desktop/1.png&quot;</span></span><br><span class="line">    im = Image.<span class="built_in">open</span>(img)</span><br><span class="line">    im = im.resize((WIDTH,HEIGHT), Image.NEAREST)</span><br><span class="line">    txt = <span class="string">&quot;&quot;</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(HEIGHT):</span><br><span class="line">        <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(WIDTH):</span><br><span class="line">            txt += get_char(*im.getpixel((j,i)))</span><br><span class="line">        txt += <span class="string">&#x27;\n&#x27;</span></span><br><span class="line">    <span class="built_in">print</span>(txt)</span><br></pre></td></tr></table></figure><p>如果想要输出到文件，可以在定义的部分，加上想要保存的文件名 <code>OUTPUT = &#39;output.txt&#39;</code>，然后在最后写进去：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(OUTPUT, <span class="string">&#x27;w&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">    f.write(txt)</span><br></pre></td></tr></table></figure><p>最后，我们得到了这个：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20220710023426.png"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天打算玩个好玩的，也是基于一个优秀的图像处理库——PIL，使用ascii字符把图片转为黑白字符画。&lt;/p&gt;
&lt;p&gt;首先有个问题，就是模拟灰度，这里有个公式：&lt;/p&gt;
&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td cl</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="图片" scheme="https://www.gsgundam.com/tags/%E5%9B%BE%E7%89%87/"/>
    
    <category term="脚本" scheme="https://www.gsgundam.com/tags/%E8%84%9A%E6%9C%AC/"/>
    
    <category term="howto" scheme="https://www.gsgundam.com/tags/howto/"/>
    
    <category term="pil" scheme="https://www.gsgundam.com/tags/pil/"/>
    
    <category term="字符画" scheme="https://www.gsgundam.com/tags/%E5%AD%97%E7%AC%A6%E7%94%BB/"/>
    
    <category term="实践" scheme="https://www.gsgundam.com/tags/%E5%AE%9E%E8%B7%B5/"/>
    
    <category term="间谍过家家" scheme="https://www.gsgundam.com/tags/%E9%97%B4%E8%B0%8D%E8%BF%87%E5%AE%B6%E5%AE%B6/"/>
    
    <category term="阿尼亚" scheme="https://www.gsgundam.com/tags/%E9%98%BF%E5%B0%BC%E4%BA%9A/"/>
    
    <category term="spy family" scheme="https://www.gsgundam.com/tags/spy-family/"/>
    
    <category term="anya" scheme="https://www.gsgundam.com/tags/anya/"/>
    
  </entry>
  
  <entry>
    <title>百度云加速上传SSL证书提示“请上传正确的证书链(服务器+中间证书)”</title>
    <link href="https://www.gsgundam.com/archive/2022-07-08-su-baidu-cert-error/"/>
    <id>https://www.gsgundam.com/archive/2022-07-08-su-baidu-cert-error/</id>
    <published>2022-07-08T09:30:00.000Z</published>
    <updated>2022-07-08T15:44:53.821Z</updated>
    
    <content type="html"><![CDATA[<p>给老哥做的国航现场监管app今天ssl证书又过期了，用Let’s encrypt申请了一个临时的。但回头还是觉得，干脆给他弄一个泛域名长期的吧，省得app一个证书、后台一个证书的。</p><p>在 <a href="https://www.ssldun.net/">SSLDUN</a> 上弄了个 <code>positiveSSL</code> 的泛域名证书，真的便宜到哭，一年才500元。</p><p>都配好了以后，就到了在百度云加速上提交SSL证书的环节。云加速服务还是挺好的，免费5G&#x2F;天的流量，带IPv6，带基础防护。但是，不出意外的出了幺蛾子。</p><p>提交证书的时候有提示 <strong>“请上传正确的证书链(服务器+中间证书)”</strong> 问题错误。证书当然是没有问题的，不使用云加速已经可以正常访问，猜想应该是格式不符合导致的。</p><p>百度到了一个挺有用的工具：<a href="https://myssl.com/chain_download.html">MySSL 证书链修复工具</a></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20220708234134.png"></p><p>在以上界面上传证书文件，或者直接拷贝证书文本内容。证书一般是crt或者pem格式。最后把获得的字符串复制到百度云加速证书上传的证书部分，填入剩下的内容，就可以成功提交了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;给老哥做的国航现场监管app今天ssl证书又过期了，用Let’s encrypt申请了一个临时的。但回头还是觉得，干脆给他弄一个泛域名长期的吧，省得app一个证书、后台一个证书的。&lt;/p&gt;
&lt;p&gt;在 &lt;a href=&quot;https://www.ssldun.net/&quot;&gt;SSL</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="baidu" scheme="https://www.gsgundam.com/tags/baidu/"/>
    
    <category term="ssl" scheme="https://www.gsgundam.com/tags/ssl/"/>
    
    <category term="证书" scheme="https://www.gsgundam.com/tags/%E8%AF%81%E4%B9%A6/"/>
    
    <category term="百度云加速" scheme="https://www.gsgundam.com/tags/%E7%99%BE%E5%BA%A6%E4%BA%91%E5%8A%A0%E9%80%9F/"/>
    
    <category term="error" scheme="https://www.gsgundam.com/tags/error/"/>
    
    <category term="百度" scheme="https://www.gsgundam.com/tags/%E7%99%BE%E5%BA%A6/"/>
    
    <category term="cert" scheme="https://www.gsgundam.com/tags/cert/"/>
    
    <category term="证书链" scheme="https://www.gsgundam.com/tags/%E8%AF%81%E4%B9%A6%E9%93%BE/"/>
    
  </entry>
  
  <entry>
    <title>记录Python程序的运行时间</title>
    <link href="https://www.gsgundam.com/archive/2022-07-08-how-to-elapsed-time-python/"/>
    <id>https://www.gsgundam.com/archive/2022-07-08-how-to-elapsed-time-python/</id>
    <published>2022-07-07T16:30:00.000Z</published>
    <updated>2022-07-07T16:36:41.294Z</updated>
    
    <content type="html"><![CDATA[<p>昨天写了个Python的实践，突然有点上瘾。趁热打铁，今天再来个简单，或许这样就能把Python捡起来了。</p><p>这次我们来玩 <code>time</code> 模块。</p><h1 id="实践1-time模块"><a href="#实践1-time模块" class="headerlink" title="实践1 time模块"></a>实践1 time模块</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line">start = time.time()</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="number">55</span>*<span class="number">5.5</span>)</span><br><span class="line"></span><br><span class="line">end = time.time()</span><br><span class="line"><span class="built_in">print</span>(end - start)</span><br></pre></td></tr></table></figure><p>输出</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">302.5</span></span><br><span class="line"><span class="number">1.0251998901367188e-05</span></span><br></pre></td></tr></table></figure><p>我是在 <a href="https://c.runoob.com/compile/9/">这个网站</a> 运行python代码的。因为如果本地运行，执行太快，间隔时间直接就成了0了。</p><p>这里，我们使用到了 <code>time.time()</code> ，把时间戳存到 <code>start</code> 里了。</p><p>然后在计算了 <code>55*5.5</code> 以后，又记录了一次时间戳，存到变量 <code>end</code> 中。</p><p>最后，打印 <code>end</code> 和 <code>start</code> 的差值。</p><h1 id="实践2-timeit模块"><a href="#实践2-timeit模块" class="headerlink" title="实践2 timeit模块"></a>实践2 timeit模块</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> timeit <span class="keyword">import</span> default_timer <span class="keyword">as</span> timer</span><br><span class="line"></span><br><span class="line">start = timer()</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="number">55</span>*<span class="number">5.5</span>)</span><br><span class="line"></span><br><span class="line">end = timer()</span><br><span class="line"><span class="built_in">print</span>(end - start)</span><br></pre></td></tr></table></figure><p>输出</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">302.5</span></span><br><span class="line"><span class="number">1.1092051863670349e-05</span></span><br></pre></td></tr></table></figure><p>看上去他们干的事情是一样的。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;昨天写了个Python的实践，突然有点上瘾。趁热打铁，今天再来个简单，或许这样就能把Python捡起来了。&lt;/p&gt;
&lt;p&gt;这次我们来玩 &lt;code&gt;time&lt;/code&gt; 模块。&lt;/p&gt;
&lt;h1 id=&quot;实践1-time模块&quot;&gt;&lt;a href=&quot;#实践1-time模块&quot; c</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="脚本" scheme="https://www.gsgundam.com/tags/%E8%84%9A%E6%9C%AC/"/>
    
    <category term="howto" scheme="https://www.gsgundam.com/tags/howto/"/>
    
    <category term="elapsed" scheme="https://www.gsgundam.com/tags/elapsed/"/>
    
    <category term="time" scheme="https://www.gsgundam.com/tags/time/"/>
    
    <category term="运行实践" scheme="https://www.gsgundam.com/tags/%E8%BF%90%E8%A1%8C%E5%AE%9E%E8%B7%B5/"/>
    
    <category term="timeit" scheme="https://www.gsgundam.com/tags/timeit/"/>
    
  </entry>
  
  <entry>
    <title>使用Python和Selenium构建简单的自动登录机器人</title>
    <link href="https://www.gsgundam.com/archive/2022-07-07-how-to-auto-create-login-bot-python-selenium/"/>
    <id>https://www.gsgundam.com/archive/2022-07-07-how-to-auto-create-login-bot-python-selenium/</id>
    <published>2022-07-06T17:30:00.000Z</published>
    <updated>2022-07-08T15:25:19.333Z</updated>
    
    <content type="html"><![CDATA[<p>孩子随全国流感大浪潮，反复高烧住院一周了。天天守在医院里，平板和苏菲婆也胜任不了日常工作。于是抽空回顾了一些以前学习了，却没有派上用场的知识。</p><p>python是当初报了个9块9的班入了个门。不得不感叹它确实是一门相当好掌握的语言，而且工具很多。难怪陈总一直用它做小工具。说到自动化、机器学习、神经网络，真的是一个都绕不开python。这次参考了hongkiat上的一篇文章，实现了Gmail自动登录。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20220707011828.png"></p><h1 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h1><p>这个实践中，与原作者不同，我使用了以下工具：</p><ol><li>Python 3 <a href="https://www.python.org/downloads/">下载</a></li><li>Selenium 4</li><li>Chrome 93.0.4577.63 <a href="https://chrome.softwaredownload.co.in/chrome-93-0-4577">下载</a></li><li>Chrome 驱动 <a href="https://sites.google.com/a/chromium.org/chromedriver/">Google下载</a> | <a href="https://npm.taobao.org/mirrors/chromedriver/93.0.4577.63/chromedriver_win32.zip">淘宝镜像下载</a></li></ol><p>安装后，重新启动计算机以使安装生效。</p><p>在cmd中输入<code>pip install selenium</code>，将Selenium Web自动化工具包添加到Python中。Selenium让我们可以通过代码来滚动页面、复制文本、填写表单和点击按钮。</p><p>下载对应的 Chrome 驱动，然后解压到Python根目录。</p><h1 id="编写代码"><a href="#编写代码" class="headerlink" title="编写代码"></a>编写代码</h1><p>首先，导入Selenium Python库中所需的模块。</p><p>打开你喜欢的任意python编辑器，我偏向于vscode，因为它免费。当然，我绝不否认 jetbrain 的 PyCharm 是我用过的最强Python IDE。</p><p>创建文件 <code>gmail.py</code> ，加入以下代码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> selenium <span class="keyword">import</span> webdriver</span><br><span class="line"><span class="keyword">from</span> selenium.webdriver.common.by <span class="keyword">import</span> By</span><br><span class="line"><span class="keyword">from</span> selenium.webdriver.support.ui <span class="keyword">import</span> WebDriverWait</span><br><span class="line"><span class="keyword">from</span> selenium.webdriver.support <span class="keyword">import</span> expected_conditions <span class="keyword">as</span> EC</span><br></pre></td></tr></table></figure><p>然后，写入你的用户名和密码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">username = <span class="string">&#x27;yourUsername&#x27;</span></span><br><span class="line">password = <span class="string">&#x27;yourPassword&#x27;</span></span><br></pre></td></tr></table></figure><p>接下来就通过驱动程序打开Chrome，并跳转到Gmail的登录页面。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">browser = webdriver.Chrome()</span><br><span class="line">browser.get((<span class="string">&#x27;https://accounts.google.com/ServiceLogin?&#x27;</span></span><br><span class="line">            <span class="string">&#x27;service=mail&amp;continue=https://mail.google&#x27;</span></span><br><span class="line">            <span class="string">&#x27;.com/mail/#identifier&#x27;</span>))</span><br></pre></td></tr></table></figure><h1 id="寻找节点元素"><a href="#寻找节点元素" class="headerlink" title="寻找节点元素"></a>寻找节点元素</h1><p>通过前面的代码，我们跳转到了登录页面。接下来要找到页面中的节点来输入用户名和密码。</p><p>F12打开Chrome的开发者工具，使用选择工具找到节点元素。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20220707013528.png"></p><p>我们在代码中使用html的<code>id</code>属性找到<code>Email</code>并填入用户名。然后，我们则需要再点击<code>Next</code>按钮，以便切换到输入密码的界面。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 填充用户名，并点击下一步按钮</span></span><br><span class="line"></span><br><span class="line">username = browser.find_element(By.ID, <span class="string">&#x27;identifierId&#x27;</span>)</span><br><span class="line">username.send_keys(usernameStr)</span><br><span class="line"></span><br><span class="line">nextButton = browser.find_element(By.ID, <span class="string">&#x27;identifierNext&#x27;</span>)</span><br><span class="line">nextButton.click()</span><br></pre></td></tr></table></figure><p>原本接下来就应该输入密码，点击登录。但是代码执行速度远远快于页面切换的速度，因此我们需要让程序等一会，直到它找到密码输入框。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 在找到密码输入框之前，等待最多10秒</span></span><br><span class="line"></span><br><span class="line">password = WebDriverWait(browser, <span class="number">10</span>).until(</span><br><span class="line">    EC.presence_of_element_located((By.NAME, <span class="string">&quot;password&quot;</span>)))</span><br><span class="line"></span><br><span class="line">password.send_keys(passwordStr)</span><br><span class="line"></span><br><span class="line">signInButton = browser.find_element(By.ID, <span class="string">&#x27;passwordNext&#x27;</span>)</span><br><span class="line">signInButton.click()</span><br></pre></td></tr></table></figure><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>现在已经简单的完成了自动登录Gmail的机器人。</p><p><strong>注意，由于安全原因，最后极可能登录失败。</strong></p><p>然而，这个实践的重点根本不在于能不能登录gmail。它告诉我们如何通过代码打开网页，跳转到需要的页面，查找到所需要的元素，进行相应的操作，最后得到我们想要的结果。这个自动化过程可以应用的场景实在太多，给人带来无穷无尽的可能性和想象空间。</p><p>但是，要记得合法合理合情使用，不要作死！</p><p>最后附上 <code>gmail.py</code> 完整代码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> selenium <span class="keyword">import</span> webdriver</span><br><span class="line"><span class="keyword">from</span> selenium.webdriver.common.by <span class="keyword">import</span> By</span><br><span class="line"><span class="keyword">from</span> selenium.webdriver.support.ui <span class="keyword">import</span> WebDriverWait</span><br><span class="line"><span class="keyword">from</span> selenium.webdriver.support <span class="keyword">import</span> expected_conditions <span class="keyword">as</span> EC</span><br><span class="line"></span><br><span class="line">username = <span class="string">&#x27;yourUsername&#x27;</span></span><br><span class="line">password = <span class="string">&#x27;yourPassword&#x27;</span></span><br><span class="line"></span><br><span class="line">browser = webdriver.Chrome()</span><br><span class="line">browser.get((<span class="string">&#x27;https://accounts.google.com/ServiceLogin?&#x27;</span></span><br><span class="line">            <span class="string">&#x27;service=mail&amp;continue=https://mail.google&#x27;</span></span><br><span class="line">            <span class="string">&#x27;.com/mail/#identifier&#x27;</span>))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 填充用户名，并点击下一步按钮</span></span><br><span class="line"></span><br><span class="line">username = browser.find_element(By.ID, <span class="string">&#x27;identifierId&#x27;</span>)</span><br><span class="line">username.send_keys(usernameStr)</span><br><span class="line"></span><br><span class="line">nextButton = browser.find_element(By.ID, <span class="string">&#x27;identifierNext&#x27;</span>)</span><br><span class="line">nextButton.click()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 在找到密码输入框之前，等待最多10秒</span></span><br><span class="line"></span><br><span class="line">password = WebDriverWait(browser, <span class="number">10</span>).until(</span><br><span class="line">    EC.presence_of_element_located((By.NAME, <span class="string">&quot;password&quot;</span>)))</span><br><span class="line"></span><br><span class="line">password.send_keys(passwordStr)</span><br><span class="line"></span><br><span class="line">signInButton = browser.find_element(By.ID, <span class="string">&#x27;passwordNext&#x27;</span>)</span><br><span class="line">signInButton.click()</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;孩子随全国流感大浪潮，反复高烧住院一周了。天天守在医院里，平板和苏菲婆也胜任不了日常工作。于是抽空回顾了一些以前学习了，却没有派上用场的知识。&lt;/p&gt;
&lt;p&gt;python是当初报了个9块9的班入了个门。不得不感叹它确实是一门相当好掌握的语言，而且工具很多。难怪陈总一直用它做</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="chrome" scheme="https://www.gsgundam.com/tags/chrome/"/>
    
    <category term="脚本" scheme="https://www.gsgundam.com/tags/%E8%84%9A%E6%9C%AC/"/>
    
    <category term="selenium" scheme="https://www.gsgundam.com/tags/selenium/"/>
    
    <category term="login" scheme="https://www.gsgundam.com/tags/login/"/>
    
    <category term="自动登录" scheme="https://www.gsgundam.com/tags/%E8%87%AA%E5%8A%A8%E7%99%BB%E5%BD%95/"/>
    
    <category term="bot" scheme="https://www.gsgundam.com/tags/bot/"/>
    
    <category term="机器人" scheme="https://www.gsgundam.com/tags/%E6%9C%BA%E5%99%A8%E4%BA%BA/"/>
    
    <category term="gmail" scheme="https://www.gsgundam.com/tags/gmail/"/>
    
    <category term="howto" scheme="https://www.gsgundam.com/tags/howto/"/>
    
  </entry>
  
  <entry>
    <title>Git RPC failed  HTTP 413 curl 22 The requested URL returned error 413</title>
    <link href="https://www.gsgundam.com/archive/2022-06-22-git-RPC-failed-HTTP-413-curl-22/"/>
    <id>https://www.gsgundam.com/archive/2022-06-22-git-RPC-failed-HTTP-413-curl-22/</id>
    <published>2022-06-22T05:30:00.000Z</published>
    <updated>2022-06-22T08:17:09.364Z</updated>
    
    <content type="html"><![CDATA[<p>因为公司有很多涉及到大资源的项目，因此偶尔都会碰到git无法推送或者无法拉取的情况。</p><p>网上一般提供的方法都是设置缓存，这里不再多说，一句<code>git config http.postBuffer 524288000</code>就完事。</p><p>我们这里讨论的是自建git服务器的情况。</p><p>直接说答案，两种方案：</p><h1 id="1-服务端设置网页服务器允许的文件大小"><a href="#1-服务端设置网页服务器允许的文件大小" class="headerlink" title="1. 服务端设置网页服务器允许的文件大小"></a>1. 服务端设置网页服务器允许的文件大小</h1><h2 id="1-1-Nginx"><a href="#1-1-Nginx" class="headerlink" title="1.1 Nginx"></a>1.1 Nginx</h2><p>打开 <code>nginx.conf</code>，编辑 <code>client_max_body_size 50m;</code> 这一行，把大小改成你需要的单文件大小，比如 <code>1024m</code> 。</p><h2 id="1-2-Apache"><a href="#1-2-Apache" class="headerlink" title="1.2 Apache"></a>1.2 Apache</h2><p>打开 <code>httpd.conf</code>，编辑 <code>LimitRequestBody 52428800</code> 这一行，同上。</p><h1 id="2-不使用https-url"><a href="#2-不使用https-url" class="headerlink" title="2. 不使用https url"></a>2. 不使用https url</h1><p>没错，直接不要使用https，而是用<strong>ssh地址</strong>，这样就不会受到网页服务器的配置限制了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;因为公司有很多涉及到大资源的项目，因此偶尔都会碰到git无法推送或者无法拉取的情况。&lt;/p&gt;
&lt;p&gt;网上一般提供的方法都是设置缓存，这里不再多说，一句&lt;code&gt;git config http.postBuffer 524288000&lt;/code&gt;就完事。&lt;/p&gt;
&lt;p&gt;我</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="git" scheme="https://www.gsgundam.com/tags/git/"/>
    
    <category term="rpc" scheme="https://www.gsgundam.com/tags/rpc/"/>
    
    <category term="RPC failed" scheme="https://www.gsgundam.com/tags/RPC-failed/"/>
    
    <category term="HTTP 413" scheme="https://www.gsgundam.com/tags/HTTP-413/"/>
    
    <category term="curl 22" scheme="https://www.gsgundam.com/tags/curl-22/"/>
    
    <category term="无法推送" scheme="https://www.gsgundam.com/tags/%E6%97%A0%E6%B3%95%E6%8E%A8%E9%80%81/"/>
    
    <category term="无法拉取" scheme="https://www.gsgundam.com/tags/%E6%97%A0%E6%B3%95%E6%8B%89%E5%8F%96/"/>
    
  </entry>
  
  <entry>
    <title>处理CentOS的报错信息 version &quot;CXXABI_1.3.9&quot; not found</title>
    <link href="https://www.gsgundam.com/archive/2022-06-03-cxxabi-1.3.9-not-fount-libstdc-so-6-centos/"/>
    <id>https://www.gsgundam.com/archive/2022-06-03-cxxabi-1.3.9-not-fount-libstdc-so-6-centos/</id>
    <published>2022-06-02T19:30:00.000Z</published>
    <updated>2022-06-04T17:10:46.782Z</updated>
    
    <content type="html"><![CDATA[<p><strong>特别说明，升级glibc属于系统核心操作，极易造成系统崩溃，一旦崩溃，重启都无效。</strong></p><p><strong>如果没有十足把握，建议参考 <a href="https://cloud.tencent.com/developer/article/1669876">CentOS7下升级GLIBC2.31</a> 这篇文章进行操作。完全保姆级的，全避坑。</strong> </p><hr><p>以下是我自己的操作，过程中出现了报错，出现了重启无法进入系统。进行了一系列修复，才成功升级。</p><hr><p>NodeJs测试服务端总是重启，日志又没有任何异常，就很绝望。在不断细化日志也没有找到问题以后，只能怀疑内存和堆栈了。于是查了一圈，发现heapdump似乎还不错，准备使用。</p><p>反正不顺利是常态，在本地测试ok后，就部署到测试服准备等结果。结果是直接报错了。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.9<span class="string">&#x27; not found</span></span><br></pre></td></tr></table></figure><p>网上还是很容易查到相关信息，但实际上解决起来并不简单，问题都是一环扣一环的。</p><p>首先发现需要更新glibc，那么就在官网地址：<a href="http://ftp.gnu.org/gnu/glibc/">http://ftp.gnu.org/gnu/glibc/</a> 下载了一个版本。然后尝试编译安装。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">tar -xf glibc-2.32.tar.gz</span><br><span class="line"><span class="built_in">cd</span> glibc-2.32</span><br><span class="line"><span class="built_in">mkdir</span> build</span><br><span class="line"><span class="built_in">cd</span> build</span><br><span class="line"></span><br><span class="line">../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin</span><br><span class="line"></span><br><span class="line">make</span><br><span class="line">make install</span><br></pre></td></tr></table></figure><p>然而make是过不了的，提示说：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">*** These critical programs are missing or too old: make compiler</span><br><span class="line">*** Check the INSTALL file <span class="keyword">for</span> required versions.</span><br></pre></td></tr></table></figure><p>又继续上网查资料，说make和gcc版本又太低。这……</p><p>好吧，那么又开始更新make和gcc，可以参考这两个链接来处理：</p><p><a href="https://blog.csdn.net/qq_41054313/article/details/119455667">更新make</a></p><p><a href="https://blog.csdn.net/qq_41054313/article/details/119453611">更新gcc</a></p><p>上面gcc编译非常耗费时间，能不等就不要等，差一点的服务器直接是按小时计算的。</p><p>更新结束以后，回来继续编译glibc。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">make &amp; make install</span><br></pre></td></tr></table></figure><p>最后检测一下</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">ls</span> -l /lib64/libc.so.6</span><br><span class="line">strings /lib64/libc.so.6 | grep GLIBC</span><br></pre></td></tr></table></figure><p>如果找不到，或者发现链接有问题，就手动链接一下</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /usr/local/lib64</span><br><span class="line"><span class="built_in">cp</span> libstdc++.so.6.0.22 /usr/lib64/</span><br><span class="line"><span class="built_in">cd</span> /usr/lib64/</span><br><span class="line"><span class="built_in">mv</span> libstdc++.so.6 libstdc++.so.6.OLD</span><br><span class="line"><span class="built_in">ln</span> -sf libstdc++.so.6.0.22 libstdc++.so.6</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;strong&gt;特别说明，升级glibc属于系统核心操作，极易造成系统崩溃，一旦崩溃，重启都无效。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果没有十足把握，建议参考 &lt;a href=&quot;https://cloud.tencent.com/developer/arti</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="nodejs" scheme="https://www.gsgundam.com/tags/nodejs/"/>
    
    <category term="libstdc++.so.6" scheme="https://www.gsgundam.com/tags/libstdc-so-6/"/>
    
    <category term="CXXABI_1.3.9" scheme="https://www.gsgundam.com/tags/CXXABI-1-3-9/"/>
    
    <category term="glibc" scheme="https://www.gsgundam.com/tags/glibc/"/>
    
    <category term="lib64" scheme="https://www.gsgundam.com/tags/lib64/"/>
    
    <category term="ImportError" scheme="https://www.gsgundam.com/tags/ImportError/"/>
    
    <category term="centos" scheme="https://www.gsgundam.com/tags/centos/"/>
    
  </entry>
  
  <entry>
    <title>有关盲盒的区块链智能合约实现</title>
    <link href="https://www.gsgundam.com/archive/2022-03-08-contract-for-mystery-box-how-to/"/>
    <id>https://www.gsgundam.com/archive/2022-03-08-contract-for-mystery-box-how-to/</id>
    <published>2022-03-08T06:30:00.000Z</published>
    <updated>2022-03-12T18:17:25.477Z</updated>
    
    <content type="html"><![CDATA[<p>好几个月没有更新了相关内容了，之前跟炜哥聊到合约实现各种功能的时候，还催我把 <a href="https://gsgundam.com/2021-10-31-axie-contract-how-to-1/">《怎样写出Axie Infinity的合约（一）》</a> 这个系列更完，但是真的是没时间。不过之前也正好聊到盲盒相关的问题了，可能关于上链后更改状态不熟悉区块链的朋友会有疑问，但其实实现起来挺简单的，趁这个机会也更个文章吧。</p><p>目前能想到的有两种实现方式，一种比较灵活：直接修改tokenURI，即暴露一个方法给授权地址，在需要的时候可以修改tokenURI；一种比较简洁：设置一个变量作为开关，被授权的地址调用方法来切换不同的tokenURI。</p><p>那么有没有既灵活又简洁的方法呢？把两种方式加起来就好了（对不起，抖了个机灵）……即开启盲盒的时候，既改变开关变量（这个是为了在其他相关逻辑中方便的获取到开启状态），同时也要设置tokenURI。</p><p>上代码：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// contracts/test.sol</span></span><br><span class="line"><span class="comment">// SPDX-License-Identifier: MIT</span></span><br><span class="line">pragma solidity ^<span class="number">0.8</span><span class="number">.0</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;@openzeppelin/contracts/token/ERC721/ERC721.sol&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;@openzeppelin/contracts/access/Ownable.sol&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;@openzeppelin/contracts/utils/Strings.sol&quot;</span>;</span><br><span class="line"></span><br><span class="line">contract <span class="title class_">MyToken</span> is <span class="title class_">ERC721</span>, <span class="title class_">ERC721URIStorage</span>, <span class="title class_">Ownable</span> &#123;</span><br><span class="line">    <span class="title function_">constructor</span>(<span class="params"></span>) <span class="title class_">ERC721</span>(<span class="string">&quot;MyToken&quot;</span>, <span class="string">&quot;MTK&quot;</span>) &#123;&#125;</span><br><span class="line"></span><br><span class="line">    string private _tokenURIPrefix = <span class="string">&quot;https://some.storage.online/opened/&quot;</span>;</span><br><span class="line">    string private _tokenURISuffix = <span class="string">&quot;.json&quot;</span>;</span><br><span class="line">    bool private _mysteryBoxOpened = <span class="literal">false</span>;</span><br><span class="line">    string private _mysteryTokenURI = <span class="string">&quot;https://some.storage.online/mystery/token.png&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">_burn</span>(<span class="params">uint256 tokenId</span>) internal <span class="title function_">override</span>(<span class="params">ERC721, ERC721URIStorage</span>) &#123;</span><br><span class="line">        <span class="variable language_">super</span>.<span class="title function_">_burn</span>(tokenId);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">isMysteryBoxOpened</span>(<span class="params"></span>) public view returns (bool) &#123;</span><br><span class="line">        <span class="keyword">return</span> _mysteryBoxOpened;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">setMysteryBoxStatus</span>(<span class="params">bool _status, string memory _baseUrl</span>) external onlyOwner &#123;</span><br><span class="line">        _mysteryBoxOpened= _status;</span><br><span class="line">        <span class="comment">//如果_baseUrl传入空字符串&#x27;&#x27;，则不会改变原有的路径前缀</span></span><br><span class="line">        <span class="keyword">if</span>(<span class="title function_">bytes</span>(_baseUrl).<span class="property">length</span> &gt; <span class="number">0</span>) _tokenURIPrefix = _baseUrl;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">tokenURI</span>(<span class="params">uint256 tokenId</span>)</span><br><span class="line">        public</span><br><span class="line">        view</span><br><span class="line">        <span class="title function_">override</span>(<span class="title class_">ERC721</span>, <span class="title class_">ERC721URIStorage</span>)</span><br><span class="line">        returns (string memory)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (_mysteryBoxOpened) &#123;</span><br><span class="line">            <span class="keyword">return</span></span><br><span class="line">            <span class="title function_">string</span>(</span><br><span class="line">                <span class="comment">//最近查阅到有abi.encodePacked的方法可以用，非常方便</span></span><br><span class="line">                <span class="comment">//以前参考使用axie的代码，组装起来很复杂</span></span><br><span class="line">                abi.<span class="title function_">encodePacked</span>(_tokenURIPrefix, <span class="title class_">Strings</span>.<span class="title function_">toString</span>(tokenId), _tokenURISuffix)</span><br><span class="line">            );</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> _mysteryTokenURI;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>就酱紫。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;好几个月没有更新了相关内容了，之前跟炜哥聊到合约实现各种功能的时候，还催我把 &lt;a href=&quot;https://gsgundam.com/2021-10-31-axie-contract-how-to-1/&quot;&gt;《怎样写出Axie Infinity的合约（一）》&lt;/a&gt; 这个</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="区块链" scheme="https://www.gsgundam.com/tags/%E5%8C%BA%E5%9D%97%E9%93%BE/"/>
    
    <category term="blockchain" scheme="https://www.gsgundam.com/tags/blockchain/"/>
    
    <category term="ethereum" scheme="https://www.gsgundam.com/tags/ethereum/"/>
    
    <category term="合约" scheme="https://www.gsgundam.com/tags/%E5%90%88%E7%BA%A6/"/>
    
    <category term="智能合约" scheme="https://www.gsgundam.com/tags/%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6/"/>
    
    <category term="contract" scheme="https://www.gsgundam.com/tags/contract/"/>
    
    <category term="盲盒" scheme="https://www.gsgundam.com/tags/%E7%9B%B2%E7%9B%92/"/>
    
    <category term="mystery box" scheme="https://www.gsgundam.com/tags/mystery-box/"/>
    
  </entry>
  
  <entry>
    <title>关于MG共创新电跑Cyberster</title>
    <link href="https://www.gsgundam.com/archive/2021-12-13-a-flash-for-mg-new-racing-ev-car/"/>
    <id>https://www.gsgundam.com/archive/2021-12-13-a-flash-for-mg-new-racing-ev-car/</id>
    <published>2021-12-12T18:30:00.000Z</published>
    <updated>2021-12-12T18:59:09.226Z</updated>
    
    <content type="html"><![CDATA[<p>这篇博客应该是目前为止我最神经病的一篇了。因为最近比较疯狂，学习和回顾了无数技术、动了各种手术，然后吧，在刚刚凌晨2点10分完成了这个学期的药学在线考试，突然想到今天有人发了昨天Cyberster共创现场的观感，想抒发一下感想。毕竟，在这么多可写的事情里，选了这么一个既不重要，也不特别的事情，我觉得就很神😀</p><p>会有感而发，不仅仅因为我对这台车感兴趣，而是因为我也是众筹成员之一，并且从来也没动过退费的心思，甚至买鸡蛋都上张大妈的我，已经为它准备好了车库。因为这台车的设计初衷就是我想要的东西——一台价格足够屌丝、外观足够炸街、内涵水桶平衡的电跑车。</p><p>这次的共创会可以参考这篇观感——<a href="https://social.saicmg.com/saicui/mg-post?id=60236&saicDeeplink=https://gio.ren/dOGQ?path=/mgCommunityCarCircle/trendsDetailPage&params=eyJidXNpbmVzc0lkIjoiNjAyMzYifQ==&brandCode=2&share_type=1">参与现场的用户手记</a></p><p>话说每次打算开共创会都会遇上疫情的Cyberster，这次终于赶上和现场的参与者见面了。当然，出于保密的原因，我们并没有见到这次的真身。然而从有幸一睹芳容的现场参与朋友的字里行间，无论文章还是群聊，都透露出整体满意的情绪。这也让我十分安心。除了文章里提到保留的极具特点的“箭头尾灯“，群里还提到了，无论价格，将全系配备”剪刀门“，以及已经有4门设计的计划。这确实让我更加期待。毕竟一家三口出行炸街，是我这样中年男人更想要做的事情。哈哈😄</p><p>其实在共创会期间有2件有趣的事情，还让我有所感触。</p><p>一个是在共创会前后，有一些平时不太出现的朋友忽然说话、不知道具体情况的其他网友随便张口，但是张嘴就是”现场好简陋“、”都是官方吧“，这类东西，怎么说呢，确实我们言论自由很幸福，但是张嘴就来真的好吗？我不太喜欢评判，但是如果评判了，那我一定不止想了10秒钟。</p><p>第二个是有朋友觉得这个共创会感觉像做戏，似乎什么有用的消息都没有，也没有对参与众筹的朋友有更多信息的公开，感觉大家跟名爵的其他用户甚至广大网友的待遇没有任何区别。其实吧，这个事情某种层面上跟营销有关。记得有个群友说得好，MG这些传统车企，做到合格就是满分了，就是说不要期望太高。更何况在我看来，名爵这次的操作如果把主要目标用户考虑成次准用户，那么绝对不止合格。</p><p>哎，年纪大了，用脑太多，脑子也糊涂。乱七八糟说了这些，可能明天自己都看不懂。</p><p>希望这台大家爱称cy的车，能在2022年末如期步入大家的眼帘，2023年内成为我家的新座驾。期待(☆▽☆)</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;这篇博客应该是目前为止我最神经病的一篇了。因为最近比较疯狂，学习和回顾了无数技术、动了各种手术，然后吧，在刚刚凌晨2点10分完成了这个学期的药学在线考试，突然想到今天有人发了昨天Cyberster共创现场的观感，想抒发一下感想。毕竟，在这么多可写的事情里，选了这么一个既不重</summary>
      
    
    
    
    <category term="各种想法" scheme="https://www.gsgundam.com/categories/%E5%90%84%E7%A7%8D%E6%83%B3%E6%B3%95/"/>
    
    
    <category term="mg" scheme="https://www.gsgundam.com/tags/mg/"/>
    
    <category term="名爵" scheme="https://www.gsgundam.com/tags/%E5%90%8D%E7%88%B5/"/>
    
    <category term="跑车" scheme="https://www.gsgundam.com/tags/%E8%B7%91%E8%BD%A6/"/>
    
    <category term="电动车" scheme="https://www.gsgundam.com/tags/%E7%94%B5%E5%8A%A8%E8%BD%A6/"/>
    
    <category term="cyberster" scheme="https://www.gsgundam.com/tags/cyberster/"/>
    
    <category term="共创" scheme="https://www.gsgundam.com/tags/%E5%85%B1%E5%88%9B/"/>
    
    <category term="众筹" scheme="https://www.gsgundam.com/tags/%E4%BC%97%E7%AD%B9/"/>
    
    <category term="ev" scheme="https://www.gsgundam.com/tags/ev/"/>
    
    <category term="racing car" scheme="https://www.gsgundam.com/tags/racing-car/"/>
    
  </entry>
  
  <entry>
    <title>在NodeJS中使用Mocha和Chai编写测试用例</title>
    <link href="https://www.gsgundam.com/archive/2021-12-05-use-mocha-chai-for-test-case-in-nodejs/"/>
    <id>https://www.gsgundam.com/archive/2021-12-05-use-mocha-chai-for-test-case-in-nodejs/</id>
    <published>2021-12-04T16:30:00.000Z</published>
    <updated>2021-12-04T16:41:28.317Z</updated>
    
    <content type="html"><![CDATA[<p>最近同时写几个客户端和几个服务端，还跟老王一起调unity特效，脑袋有点炸，做事情也顾头不顾尾。但是幸好二王（老王和王老师）都是清醒人，前天王老师提醒我，现在中间件部分的测试，用网页按钮来一个个测试太不科学了，应该写测试用例来自动化测试。</p><p>啊，我感到醍醐灌顶，如梦初醒 Σ(っ °Д °;)っ</p><p>对于我们这种惜时如金的小团队，这不是基本操作吗？二话不说，就开始找nodejs的测试框架。</p><p>过程省略，总之选了 <a href="https://mochajs.org/">Mocha</a> + <a href="https://www.chaijs.com/">Chai</a> ，不是别的，因为这个组合如果说自己的使用率在nodejs排第二，那没人敢排第一。而且可以找到的案例和支持特别丰富。那就赶紧入手开始吧。</p><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install --save-dev mocha chai chai-http</span><br></pre></td></tr></table></figure><h1 id="配置Package-json"><a href="#配置Package-json" class="headerlink" title="配置Package.json"></a>配置Package.json</h1><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line">  &quot;scripts&quot;: &#123;</span><br><span class="line">    ...</span><br><span class="line">    &quot;test&quot;: &quot;mocha --timeout 10000&quot;</span><br><span class="line">    ...</span><br><span class="line">  &#125;</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>默认是2秒超时，但是链上返回有时特别慢，所以改成10秒了。</p><h1 id="NodeJS主文件"><a href="#NodeJS主文件" class="headerlink" title="NodeJS主文件"></a>NodeJS主文件</h1><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line"></span><br><span class="line">module.exports = app;</span><br></pre></td></tr></table></figure><p>必须要将主文件作为模块导出，提供给<code>Mocha</code>使用。</p><h1 id="编写测试用例"><a href="#编写测试用例" class="headerlink" title="编写测试用例"></a>编写测试用例</h1><p>创建 <code>test/web3.js</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">process.env.NODE_ENV=&#x27;development&#x27;; //使用测试环境</span><br><span class="line"></span><br><span class="line">const chai = require(&#x27;chai&#x27;);</span><br><span class="line">const chaiHttp = require(&#x27;chai-http&#x27;);</span><br><span class="line">const server = require(&#x27;../app&#x27;); //引入NodeJS主文件</span><br><span class="line">const should = chai.should();</span><br><span class="line"></span><br><span class="line">chai.use(chaiHttp);</span><br><span class="line"></span><br><span class="line">describe(&#x27;Contract&#x27;, () =&gt; &#123;</span><br><span class="line">    describe(&#x27;/GET initWeb3&#x27;, () =&gt; &#123;</span><br><span class="line">        it(&#x27;it should init web3&#x27;, (done) =&gt; &#123;</span><br><span class="line">            chai.request(server)</span><br><span class="line">                .get(&#x27;/initWeb3&#x27;)</span><br><span class="line">                .end((err, res) =&gt; &#123;</span><br><span class="line">                    res.should.have.status(200);</span><br><span class="line">                    ...</span><br><span class="line">                    done();</span><br><span class="line">                &#125;);</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;);</span><br><span class="line">    ...</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">...</span><br></pre></td></tr></table></figure><h1 id="运行"><a href="#运行" class="headerlink" title="运行"></a>运行</h1><p>执行 <code>npm run test</code></p><p>输出结果</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Server is running at: http://127.0.0.1:8080</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">  Contract</span><br><span class="line">    /GET initWeb3</span><br><span class="line">      √ it should init web3 (84ms)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">  1 passing (90ms)</span><br></pre></td></tr></table></figure><p>收工</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近同时写几个客户端和几个服务端，还跟老王一起调unity特效，脑袋有点炸，做事情也顾头不顾尾。但是幸好二王（老王和王老师）都是清醒人，前天王老师提醒我，现在中间件部分的测试，用网页按钮来一个个测试太不科学了，应该写测试用例来自动化测试。&lt;/p&gt;
&lt;p&gt;啊，我感到醍醐灌顶，</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="nodejs" scheme="https://www.gsgundam.com/tags/nodejs/"/>
    
    <category term="mocha" scheme="https://www.gsgundam.com/tags/mocha/"/>
    
    <category term="chai" scheme="https://www.gsgundam.com/tags/chai/"/>
    
    <category term="测试用例" scheme="https://www.gsgundam.com/tags/%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B/"/>
    
    <category term="test" scheme="https://www.gsgundam.com/tags/test/"/>
    
    <category term="case" scheme="https://www.gsgundam.com/tags/case/"/>
    
  </entry>
  
  <entry>
    <title>从 GitLab CI/CD 迁移到 GitHub Actions</title>
    <link href="https://www.gsgundam.com/archive/2021-11-29-gitlab-cicd-migrate-to-github-actions/"/>
    <id>https://www.gsgundam.com/archive/2021-11-29-gitlab-cicd-migrate-to-github-actions/</id>
    <published>2021-11-28T16:30:00.000Z</published>
    <updated>2021-11-28T18:16:23.362Z</updated>
    
    <content type="html"><![CDATA[<p>就很尴尬，白天写了博客，回头就发现GitLab发了邮件过来，pipelines执行失败了。但是陪孩子也没空去看。</p><p>安顿孩子睡了以后，想着看看怎么回事，结果就很尴尬。 <code>The gsgundam namespace has exceeded its pipeline minutes quota. Buy additional pipeline minutes, or no new jobs or pipelines in its projects will run.</code> 就是说时间到头了。那要什么时候才能再用呢？查了下，说一个月400分钟。难道是这个月调试hexo的新问题提交太多次了？</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20211129011736.png"></p><p>咨询了一下 <a href="https://chenzaichun.github.io/">陈总</a> ，说github的时间肯定够。果然，GitHub的Actions每月有2000分钟，存储上限是500MB。那么又试着转GitHub吧。</p><p>参考了GitHub Docs里 <a href="https://docs.github.com/cn/actions/migrating-to-github-actions/migrating-from-gitlab-cicd-to-github-actions">从 GitLab CI&#x2F;CD 迁移到 GitHub Actions</a> 的官方教程和另一篇来自于网友的 <a href="https://hdj.me/github-actions-hexo-cicd/">如何正确的使用 GitHub Actions 实现 Hexo 博客的 CICD</a> 。</p><p>直入正题吧，项目里建立<code>.gihub/workflows/upload2ftp.yml</code>，写入一下内容：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">upload2ftp</span></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">master</span></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">container:</span> <span class="string">node:12.14.1</span></span><br><span class="line"></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v2</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Cache</span> <span class="string">node</span> <span class="string">modules</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/cache@v2</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">path:</span> <span class="string">~/node_modules/</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">dependencies</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          npm install hexo-cli -g</span></span><br><span class="line"><span class="string">          test -e package.json &amp;&amp; npm install</span></span><br><span class="line"><span class="string">          hexo generate</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Upload</span> <span class="string">artifacts</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/upload-artifact@v2</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">name:</span> <span class="string">public</span></span><br><span class="line">          <span class="attr">path:</span> <span class="string">public</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Deploy</span> <span class="number">2</span> <span class="string">FTP</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          apt-get update -qq &amp;&amp; apt-get install -y -qq lftp</span></span><br><span class="line"><span class="string">          lftp -c &quot;set ftp:ssl-allow false; set ftp:ignore-pasv-address true; set ftp:prefer-epsv no; set ftp:charset gbk; set file:charset utf-8; debug; open -u $&#123;&#123; secrets.USERNAME &#125;&#125;,$&#123;&#123; secrets.PASSWORD &#125;&#125; $&#123;&#123; secrets.HOST &#125;&#125;; mirror -R public/ ./htdocs --verbose -p --ignore-time --transfer-all --parallel=5 --exclude-glob .git* --exclude .git/&quot;</span></span><br><span class="line"><span class="string"></span></span><br></pre></td></tr></table></figure><p>大概需要注意的就是，依然为了不要暴露密码，所以把ftp相关信息写到了项目的action secrets中。</p><p>测试一下，好像没什么问题。</p><p>如果这边时间也不够了，下个月又切另一边，哈哈。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;就很尴尬，白天写了博客，回头就发现GitLab发了邮件过来，pipelines执行失败了。但是陪孩子也没空去看。&lt;/p&gt;
&lt;p&gt;安顿孩子睡了以后，想着看看怎么回事，结果就很尴尬。 &lt;code&gt;The gsgundam namespace has exceeded its p</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="迁移" scheme="https://www.gsgundam.com/tags/%E8%BF%81%E7%A7%BB/"/>
    
    <category term="github" scheme="https://www.gsgundam.com/tags/github/"/>
    
    <category term="gitlab" scheme="https://www.gsgundam.com/tags/gitlab/"/>
    
    <category term="cicd" scheme="https://www.gsgundam.com/tags/cicd/"/>
    
    <category term="ci/cd" scheme="https://www.gsgundam.com/tags/ci-cd/"/>
    
    <category term="actions" scheme="https://www.gsgundam.com/tags/actions/"/>
    
  </entry>
  
  <entry>
    <title>Unity多版本共存（自用）</title>
    <link href="https://www.gsgundam.com/archive/2021-11-28-unity-mutiple-version/"/>
    <id>https://www.gsgundam.com/archive/2021-11-28-unity-mutiple-version/</id>
    <published>2021-11-28T06:30:00.000Z</published>
    <updated>2021-11-28T07:17:17.605Z</updated>
    
    <content type="html"><![CDATA[<p>主要是自己备用。</p><p>先安装低版本，包括Unity hub，hub尽可能安装能使用的最高版本。</p><p>安装完成后，确保可以使用，并备份C:\ProgramData\Unity\Unity_lic.ulf。</p><p>安装高版本，不要重复安装hub了，其他跟低版本基本一样，但是不要去动C:\ProgramData\Unity\Unity_lic.ulf，覆盖exe文件和删除Unity安装目录的Unity\Editor\Data\Resources\Licensing目录即可。</p><p><code>完全不用再去处理Unity_lic.ulf</code></p><p>然后在hub里添加高版本的Unity程序。</p><p>如此反复，可以安装若干版本的unity editor。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;主要是自己备用。&lt;/p&gt;
&lt;p&gt;先安装低版本，包括Unity hub，hub尽可能安装能使用的最高版本。&lt;/p&gt;
&lt;p&gt;安装完成后，确保可以使用，并备份C:\ProgramData\Unity\Unity_lic.ulf。&lt;/p&gt;
&lt;p&gt;安装高版本，不要重复安装hub了，其</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="unity" scheme="https://www.gsgundam.com/tags/unity/"/>
    
    <category term="多版本" scheme="https://www.gsgundam.com/tags/%E5%A4%9A%E7%89%88%E6%9C%AC/"/>
    
    <category term="共存" scheme="https://www.gsgundam.com/tags/%E5%85%B1%E5%AD%98/"/>
    
    <category term="version" scheme="https://www.gsgundam.com/tags/version/"/>
    
    <category term="hub" scheme="https://www.gsgundam.com/tags/hub/"/>
    
  </entry>
  
  <entry>
    <title>解决WordPress中Invalid argument supplied for foreach</title>
    <link href="https://www.gsgundam.com/archive/2021-11-24-wordpress-invalid-argument-supplied-for-foreach/"/>
    <id>https://www.gsgundam.com/archive/2021-11-24-wordpress-invalid-argument-supplied-for-foreach/</id>
    <published>2021-11-22T02:30:00.000Z</published>
    <updated>2021-11-25T13:59:11.022Z</updated>
    
    <content type="html"><![CDATA[<p>昨天偶然发现在WordPress页面出现如下警告：</p><p><code>PHP Warning: Invalid argument supplied for foreach() in \wp-admin\includes\script-loader.php on line 2678</code></p><p>不知道怎么出现的，但这是在wp自己的代码里，怀疑跟升级有关。</p><p>打开被警告的文件找到对应行：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">foreach ( $wp_styles-&gt;queue as $handle ) &#123;</span><br></pre></td></tr></table></figure><p>看样子是<code>$wp_styles</code>没有被认为是一个有效的数组，我试着强制转换了一下</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">foreach ( (array)$wp_styles-&gt;queue as $handle ) &#123;</span><br></pre></td></tr></table></figure><p>测试通过，收工。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;昨天偶然发现在WordPress页面出现如下警告：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;PHP Warning: Invalid argument supplied for foreach() in \wp-admin\includes\script-loader.php on li</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="wordpress" scheme="https://www.gsgundam.com/tags/wordpress/"/>
    
    <category term="invalid" scheme="https://www.gsgundam.com/tags/invalid/"/>
    
    <category term="argument" scheme="https://www.gsgundam.com/tags/argument/"/>
    
    <category term="supplied" scheme="https://www.gsgundam.com/tags/supplied/"/>
    
    <category term="foreach" scheme="https://www.gsgundam.com/tags/foreach/"/>
    
  </entry>
  
  <entry>
    <title>小米平板4 clover 刷入更加省电顺滑的MIUIMix</title>
    <link href="https://www.gsgundam.com/archive/2021-11-21-mipad-4-miui-mix-clover-20191203/"/>
    <id>https://www.gsgundam.com/archive/2021-11-21-mipad-4-miui-mix-clover-20191203/</id>
    <published>2021-11-21T14:30:00.000Z</published>
    <updated>2022-11-27T04:32:46.931Z</updated>
    
    <content type="html"><![CDATA[<p>所以说XDA真的是个好地方，总觉得小米平板4最近跑电有点快，上去看了下，发现了一个叫做<code>MIUIMix</code>的Rom，省电顺滑的优化做得不错，刨下来试了试，真的蛮好用。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20221127123157.png" alt="MIUIMix"></p><p>首先呢，这个Rom完全只是<strong>优化MIUI</strong>，安卓版本也停留在8.1.0，所以<strong>想要尝鲜新系统的家人们就不要试了！！！</strong>如果真的有朋友需要，我可以把最新的<code>lineage 19 for MiPad4</code>搬运回来，安卓版本也更新到了11的。</p><p>老样子，进入正题。</p><h1 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h1><p>–<a href="https://ava4.androidfilehost.com/dl/dheCzsJS7DIgx8GNg6H5Qw/1637572999/4349826312261651986/MiuiMiX_2.0_clover_9.12.3_v11-8.1_20191203.zip">MiuiMiX_2.0_clover_9.12.3_v11-8.1_20191203.zip</a> -必需  </p><p>–<a href="https://doc-0k-2k-docs.googleusercontent.com/docs/securesc/jpavj7r76s2mqcekjm1cnsfgju3g5873/2hcde0ljuj61fiuuvq1onkq2mh7ikavn/1637512500000/03019621104757481724/15449195808364768729/1CIsunciDypS_raAc6uzQdBAaiAX3Sm3a?e=download&authuser=0&nonce=f8e81hvb50t6a&user=15449195808364768729&hash=rgri9u5rvl5qv42cl79kqlh38n915mlv">TWRP-20191001-3.3.1.0-clover.img</a> -必需</p><p>–<a href="https://miuirom.xiaomi.com/rom/u1106245679/5.5.224.24/miflash_unlock-en-5.5.224.24.zip">miflash_unlock-en-5.5.224.24.zip</a> -必需</p><p>–<a href="https://sn9.us/file/22501768-406562145">TOOLS_BY_CZ_V7.20</a> -推荐（密码：6666）</p><p>还是老样子，如果下载遇到问题，欢迎加入我的知识星球，已经备好了各种资源，直接下载即可。另外说下，白嫖客太多了，现在改了加入方式，需要先在 <a href="https://www.gsgundam.com/repository/">这里</a> 操作。</p><h1 id="USB调试"><a href="#USB调试" class="headerlink" title="USB调试"></a>USB调试</h1><p>设置里进去&gt;我的设备&gt;全部参数，但大部分都是点击MIUI版本号若干次，开启<code>开发者模式</code>。然后进入开发者模式找到<code>USB调试</code>，打开开关即可。</p><h1 id="解锁"><a href="#解锁" class="headerlink" title="解锁"></a>解锁</h1><p>在开发者模式里找到<code>设备解锁状态</code>，插入SIM卡并绑定账号。米Pad4支持最新版本的<code>miflash_unlock</code>，所以为所谓用哪个版本，只要能连上服务器都行。</p><p>按照软件指引操作完成。</p><p><strong>另外，如果需要备份资料，现在就操作，并拷贝到其他地方，方便操作！</strong></p><h1 id="线刷TWRP"><a href="#线刷TWRP" class="headerlink" title="线刷TWRP"></a>线刷TWRP</h1><p>用MIUIMix必须刷入第三方Recovery。首先进入bootloader，比如长按音量键下+锁屏键，直到手机完全重启。</p><p>当然是要用数据线连接手机和PC，刷入recovery可以直接命令行，例如：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb fastboot flash recovery twrp.img</span><br></pre></td></tr></table></figure><p>或者使用图形化工具<code>TOOLS_BY_CZ</code>，将<code>TWRP-20191001-3.3.1.0-clover.img</code>放到工具目录下的”File”文件夹里，然后直接选择线刷专区，文件选中<code>TWRP-20191001-3.3.1.0-clover.img</code>，分区选中<code>Recovery</code>，点击刷入，等待完成即可。</p><h1 id="TWRP准备"><a href="#TWRP准备" class="headerlink" title="TWRP准备"></a>TWRP准备</h1><p>这个是我躺了的坑，安卓8.0以后，Data会自动加密，似乎直接重刷会造成新系统无法使用Data（个人理解是这样，因为刷回MIUI就重新可用了，请大神指正）。</p><p>所以，在重启进入TWRP以后，输入密码可以忽略不管。重要的是下面这几步：</p><pre><code>1、进入Wipe，选择Format Data2、不要重启！！！再进入Wipe，选择高级清除选项，三清3、保持USB插入，进入Mount，禁用MTP，再启用MTP（我这边刷完TWRP，虽然显示启用了MTP，但是实际上PC上并没有）</code></pre><p>如果上述清理过程中，出现了提示无法清理Data目录，重新进入Recovery再试。那么，不用犹豫，刷入原版MIUI从头再来一次，否则都是浪费时间。</p><h1 id="卡刷lineage"><a href="#卡刷lineage" class="headerlink" title="卡刷lineage"></a>卡刷lineage</h1><p>用PC拷入<code>MiuiMiX_2.0_clover_9.12.3_v11-8.1_20191203.zip</code>到手机存储，选择Install，然后选择这个文件，右滑刷入即可。</p><p>刷入的提示里可能有少量看起来不正常的信息，不用管。</p><p>刷入完成重启手机，第一次进入系统会比较慢，可能还要重启一次，耐心等待。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20211122034533.jpg"></p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>至此，焕发青春的MiPad4 Plus再临。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20211122034907.jpg"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20211122034910.jpg"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;所以说XDA真的是个好地方，总觉得小米平板4最近跑电有点快，上去看了下，发现了一个叫做&lt;code&gt;MIUIMix&lt;/code&gt;的Rom，省电顺滑的优化做得不错，刨下来试了试，真的蛮好用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gsgundam-125210613</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="小米" scheme="https://www.gsgundam.com/tags/%E5%B0%8F%E7%B1%B3/"/>
    
    <category term="平板" scheme="https://www.gsgundam.com/tags/%E5%B9%B3%E6%9D%BF/"/>
    
    <category term="小米平板4" scheme="https://www.gsgundam.com/tags/%E5%B0%8F%E7%B1%B3%E5%B9%B3%E6%9D%BF4/"/>
    
    <category term="mi" scheme="https://www.gsgundam.com/tags/mi/"/>
    
    <category term="pad4" scheme="https://www.gsgundam.com/tags/pad4/"/>
    
    <category term="clover" scheme="https://www.gsgundam.com/tags/clover/"/>
    
    <category term="miui" scheme="https://www.gsgundam.com/tags/miui/"/>
    
    <category term="xda" scheme="https://www.gsgundam.com/tags/xda/"/>
    
    <category term="miuimix" scheme="https://www.gsgundam.com/tags/miuimix/"/>
    
    <category term="省电" scheme="https://www.gsgundam.com/tags/%E7%9C%81%E7%94%B5/"/>
    
  </entry>
  
  <entry>
    <title>怎样写出Axie Infinity的合约（一）</title>
    <link href="https://www.gsgundam.com/archive/2021-10-31-axie-contract-how-to-1/"/>
    <id>https://www.gsgundam.com/archive/2021-10-31-axie-contract-how-to-1/</id>
    <published>2021-10-31T15:30:00.000Z</published>
    <updated>2021-11-21T02:46:45.396Z</updated>
    
    <content type="html"><![CDATA[<p>想了想，还是决定开这个新坑吧。上一次玩合约，好像已经是19年的事情了。18年跟几位大神入了区块链这个神坑，受益匪浅。时隔数年，有好多东西都忘了。借着Axie Infinity这些NFTs概念游戏大火，来温故一番、也知新一下。</p><p>这里声明一下我的观点，区块链的前景还是可以说很大的，但是不是在炒币炒NFT炒概念上。必须承认这个目前能赚钱，但是除非能确保赚钱的是自己。我们国家的趋势是支持区块链应用，但是绝对反对用来做金融投机的。</p><p>我的另一个观点是，了解区块链，应用区块链，对个人绝对是有好处的。但是不要太乐观，从18年到现在，这个行业的实际应用到目前为止几乎没有发生实质性的实用性进展。不过就是从炒币变成了炒NFTs。这一堆数据在会操作的人手里是工具，但是在韭菜那里就是悬在头上的镰刀而已。</p><p>好了，胡扯了这么多，说回正题，来看Axie Infinity的合约吧。从白皮书的《智能合约与GitHub仓库》 <a href="https://whitepaper.axieinfinity.com/technology/key-smart-contracts">Smart contracts and GitHub Repo</a> 上可以看到，有一些完全公开的合约，也有一些并没有公开源代码但提供了查询地址的合约。我们先看公开的部分，初步进行了解，也帮助我自己确定自己都理解了。</p><p>Axie Infinity的核心资产是Axie，我们从 <a href="https://github.com/axieinfinity/public-smart-contracts">GitHub仓库公开合约</a> 里可以找到，<strong>Core contract</strong>部分就是我们要找的东西。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20211031031441.png"></p><p>目录结构是这样的：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">│  AxieAccessControl.sol</span><br><span class="line">│  AxieCore.sol</span><br><span class="line">│</span><br><span class="line">├─dependency</span><br><span class="line">│      AxieDependency.sol</span><br><span class="line">│      AxieManager.sol</span><br><span class="line">│      AxieManagerCustomizable.sol</span><br><span class="line">│</span><br><span class="line">├─erc721</span><br><span class="line">│      AxieERC721.sol</span><br><span class="line">│      AxieERC721BaseEnumerable.sol</span><br><span class="line">│      AxieERC721Metadata.sol</span><br><span class="line">│</span><br><span class="line">└─lifecycle</span><br><span class="line">        AxiePausable.sol</span><br><span class="line">        AxieUpgradeable.sol</span><br></pre></td></tr></table></figure><p><code>AxieCore.sol</code>就是我们目前最需要的东西。现在我们顺着依赖往回理，看它是如何从最基础的协议一步步做过来的。这个文件头部写明：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">pragma solidity ^<span class="number">0.4</span><span class="number">.19</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;./erc721/AxieERC721.sol&quot;</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// solium-disable-next-line no-empty-blocks</span></span><br></pre></td></tr></table></figure><p>所以我们再找到<code>AxieERC721.sol</code></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">pragma solidity ^<span class="number">0.4</span><span class="number">.19</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;./AxieERC721BaseEnumerable.sol&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;./AxieERC721Metadata.sol&quot;</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// solium-disable-next-line no-empty-blocks</span></span><br><span class="line">contract <span class="title class_">AxieERC721</span> is <span class="title class_">AxieERC721BaseEnumerable</span>, <span class="title class_">AxieERC721Metadata</span> &#123;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后我们又可以发现，这个作为核心依赖的合约，主要由两部分构成，<code>AxieERC721BaseEnumerable.sol</code>和<code>AxieERC721Metadata.sol</code>，从名称上我们可以推测，这两部分分别管理了基础数据（即直译过来的基础可枚举）和扩展属性（即直译过来的元数据）。通常在实现一个ERC721资产的时候，链上只会存储最基础的数据，例如作为先锋的CryptoKitties，链上只存储了基因数据和生育相关数据（因为要用于链上计算）。而更多的信息，例如名字、描述、图片信息、其他属性等等，则通过Metadata的方式存储在其他地方，例如IPFS或者自己指定的传统互联网地址等。</p><p>先来看<code>AxieERC721BaseEnumerable.sol</code>文件。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">pragma solidity ^<span class="number">0.4</span><span class="number">.19</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;zeppelin/contracts/math/SafeMath.sol&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;../../erc/erc165/ERC165.sol&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;../../erc/erc721/IERC721Base.sol&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;../../erc/erc721/IERC721Enumerable.sol&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;../../erc/erc721/IERC721TokenReceiver.sol&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;../dependency/AxieDependency.sol&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;../lifecycle/AxiePausable.sol&quot;</span>;</span><br></pre></td></tr></table></figure><p>好吧，我终于还是打算先说一句，虽然我相信来看文章的新人肯定很少，但以防万一嘛。<code>pragma solidity ^0.4.19</code>这一句是指定了solidity的版本，这个与js很相近的语言，一直在迭代更新，现在已经到了0.8.x的版本，虽然谈不上大相径庭，但是已经产生了很多不兼容的情况，甚至无法通过编译。所以熟悉和指定语言版本在这里很重要。</p><p>如果没记错，Axie说过在他们开发完成合约之前，EIP721还在草案阶段，所以在引入的这些IERC721xxx可以看到，跟Zeppelin这一类的合约库相比，有一些不同。但是这也不重要，因为他们功能其实基本一致。然后我们来看，他引用的这些类（erc165和erc721文件夹里的这些合约就不详细说了，现在已经成了ERC721标准，可以直接在Zeppelin引入）：</p><p>SafeMath - 没有专门去弄清楚这个用于<strong>避免程序结果产生溢出</strong>的类到底是不是出自Zeppelin，但是他们的这个类库很出名也很有用的。这么有名的库为什么不重点说说呢？因为在最新的<code>Solidity 0.8.x</code>中，这个类库已经不需要了。</p><p>ERC165 - 一种发布并能检测到一个智能合约实现了什么接口的标准。我自己组织了很久语言，都没找到合适的描述方式，最后觉得这句听上去特别废话的话最能解释他的作用。可以看看这位的解析<a href="https://www.cnblogs.com/wanghui-garcia/p/9507128.html">erc721-165学习</a>，这句话就出自他。事实上我认为，能弄懂这个看起来很简单的标准，也就代表区块链基础知识已经完全过关了。</p><p>IERC721Base - 直接翻译过来，就是符合ERC721的合约基本需求的接口。包括了用户余额、Token持有者、转让、授权等等。</p><p>IERC721Enumerable - 这一个也有点不好归纳，通过内容和EIP721的描述，大概可以理解为作为查看整个合约的资产状况的接口。但似乎这里包含了更多内容，例如资产总量、根据索引查资产、根据索引查持有者、Token有效性验证、持有者有效性验证、以及一些修饰器。</p><p>IERC721TokenReceiver - 这个对应了ERC721的safeTransfer，用于在接收到safeTransferFrom完成的消息后，触发onERC721Received方法。</p><p>基本的合约和接口分析完了，接下来又是2个Axie自己的特有依赖<code>AxieDependency</code>和<code>AxiePausable</code>。为了防止无限套娃，这里就此打住，目前只需要知道，前者主要在规范整个合约的权限，后者可暂停代币的一切行为。这些以后再详说。只是这里再补一句，大家认为的完全去中心化，只是一厢情愿，所有区块链的应用，只可能在信任的基础上，一定程度上去中心化。</p><p>接下来看合约部分：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">contract <span class="title class_">AxieERC721BaseEnumerable</span> is <span class="title class_">ERC165</span>, <span class="title class_">IERC721Base</span>, <span class="title class_">IERC721Enumerable</span>, <span class="title class_">AxieDependency</span>, <span class="title class_">AxiePausable</span> &#123;</span><br><span class="line">  using <span class="title class_">SafeMath</span> <span class="keyword">for</span> uint256;</span><br><span class="line"></span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>整个合约因为其实都是ERC721标准的实现，没有太多可讲的。重点说一下<code>using ... for ...</code>，通常是指将前者的函数用于后者。在这里，则是说把SafeMath的方法绑定到uint256类型上。需要注意的是，using之前，<strong>必须要先import</strong>！</p><p>好了，来看另一个合约，<code>AxieERC721Metadata</code>，它引入了两个类库</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;../../erc/erc721/IERC721Metadata.sol&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;./AxieERC721BaseEnumerable.sol&quot;</span>;</span><br><span class="line"></span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>很熟悉的身影是不是，没错，就是上面的<code>AxieERC721BaseEnumerable</code>。<code>AxieERC721Metadata</code>合约通过继承前者，来实现了一些定义。这个文件内容不多，但是有很多特别有意思，也是对新人特别有用的地方。</p><p>先来看第一个：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line"></span><br><span class="line">  <span class="keyword">function</span> <span class="title function_">AxieERC721Metadata</span>(<span class="params"></span>) internal &#123;</span><br><span class="line">    supportedInterfaces[<span class="number">0x5b5e139f</span>] = <span class="literal">true</span>; <span class="comment">// ERC-721 Metadata</span></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>来看网上的这句说明： <code>Note: the ERC-165 identifier for this interface is 0x5b5e139f.</code> 是不是有点意思？还记得前面我提到的那篇文章和那句话吗？结合起来，看懂了，就明白ERC165在做什么了。</p><p>来看下一个点，</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line"></span><br><span class="line">  <span class="keyword">function</span> <span class="title function_">name</span>(<span class="params"></span>) external pure returns (string) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;Axie&quot;</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">function</span> <span class="title function_">symbol</span>(<span class="params"></span>) external pure returns (string) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;AXIE&quot;</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>这里的作用很简单，其实就是定义了Token的名字叫<code>Axie</code>， 代币符号为<code>AXIE</code>。但这不重要，因为重点是出现了一个很难在其他语言里看到的词，<code>pure</code>。我一开始接触到这个修饰器的时候，第一个想到了惜字如金的电报时代。因为每一个操作都是白花花的银子，所以能不操作的东西，就<strong>不要操作</strong>。于是在solidity中出现了这两个东西<code>view</code>和<code>pure</code>。其中view表示，对storage变量可读不可写，而pure则对storage既不可读也不可写。因为不写就代表不需要矿工验证，不需要gas，也就是不需要花钱。那说到storage，是不是还有个对应的东西？没错，0.4.x版本里模糊了这个概念，很多时候开发者不需要关心是什么（只是很多时候，因为后面我们就能看到声明）。但是0.8.x版本已经把这个权力交回到开发者手里，到底是<code>storage</code>还是<code>memory</code>，需要开发者自己来规划。有什么区别呢？是不是记得区块链最贵的操作是存储💴？但是结果需要大家自己去实践，不要省这点时间。</p><p>下一部分可以有两个地方注意：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line"></span><br><span class="line">  <span class="keyword">function</span> <span class="title function_">setTokenURIAffixes</span>(<span class="params">string _prefix, string _suffix</span>) external onlyCEO &#123;</span><br><span class="line">    tokenURIPrefix = _prefix;</span><br><span class="line">    tokenURISuffix = _suffix;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>第一个，我们一直没说的<code>external</code>，以及之前出现了的<code>internal</code>，实际上还有<code>public</code>和<code>private</code>。来个清晰的说明：</p><p>private - 只能在当前合约内访问，在继承合约中都不可访问。</p><p>internal - 函数只能通过内部访问（当前合约或者继承的合约），可在当前合约或继承合约中调用。</p><p>external - external标识的函数是合约接口的一部分。函数只能通过外部的方式调用。外部函数在接收大的数组时更有效。</p><p>public - public标识的函数是合约接口的一部分。可以通过内部，或者消息来进行调用。</p><p>除了以上解释以外，作为合约开发，还有一个必须扎根心底的概念，就是gas消耗。那么，如果你的函数仅仅需要外部调用，那么你应该用external，如果你的函数需要内部和外部同时调用，那么使用public。这个涉及到内存分配管理，我觉得也没必要深入了解，仅仅上面几句话足以判断4个可见性花费的递进关系了。</p><p>第二个，是<code>onlyCEO</code>，这个看起来很特别的修饰器，实际上是在<code>AxieDependency</code>所引入的另一个文件<code>AxieAccessControl</code>中定义的，它判断了消息发送者地址是否跟我们定义的ceo地址一致。有时候我们用的很少的判断，会直接在需要的地方<code>require(msg.sender == ceoAddress)</code>，但是这种随时可能用到的判断，直接定义为修饰器会更方便。</p><p>到了最后一个方法了</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line"></span><br><span class="line">  <span class="keyword">function</span> <span class="title function_">tokenURI</span>(<span class="params"></span></span><br><span class="line"><span class="params">    uint256 _tokenId</span></span><br><span class="line"><span class="params">  </span>)</span><br><span class="line">    external</span><br><span class="line">    view</span><br><span class="line">    <span class="title function_">mustBeValidToken</span>(_tokenId)</span><br><span class="line">    returns (string)</span><br><span class="line">  &#123;</span><br><span class="line">    bytes memory _tokenURIPrefixBytes = <span class="title function_">bytes</span>(tokenURIPrefix);</span><br><span class="line">    bytes memory _tokenURISuffixBytes = <span class="title function_">bytes</span>(tokenURISuffix);</span><br><span class="line">    uint256 _tmpTokenId = _tokenId;</span><br><span class="line">    uint256 _length;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">do</span> &#123;</span><br><span class="line">      _length++;</span><br><span class="line">      _tmpTokenId /= <span class="number">10</span>;</span><br><span class="line">    &#125; <span class="keyword">while</span> (_tmpTokenId &gt; <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">    bytes memory _tokenURIBytes = <span class="keyword">new</span> <span class="title function_">bytes</span>(_tokenURIPrefixBytes.<span class="property">length</span> + _length + <span class="number">5</span>);</span><br><span class="line">    uint256 _i = _tokenURIBytes.<span class="property">length</span> - <span class="number">6</span>;</span><br><span class="line"></span><br><span class="line">    _tmpTokenId = _tokenId;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">do</span> &#123;e</span><br><span class="line">      _tokenURIBytes[_i--] = <span class="title function_">byte</span>(<span class="number">48</span> + _tmpTokenId % <span class="number">10</span>);</span><br><span class="line">      _tmpTokenId /= <span class="number">10</span>;</span><br><span class="line">    &#125; <span class="keyword">while</span> (_tmpTokenId &gt; <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (_i = <span class="number">0</span>; _i &lt; _tokenURIPrefixBytes.<span class="property">length</span>; _i++) &#123;</span><br><span class="line">      _tokenURIBytes[_i] = _tokenURIPrefixBytes[_i];</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (_i = <span class="number">0</span>; _i &lt; _tokenURISuffixBytes.<span class="property">length</span>; _i++) &#123;</span><br><span class="line">      _tokenURIBytes[_tokenURIBytes.<span class="property">length</span> + _i - <span class="number">5</span>] = _tokenURISuffixBytes[_i];</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="title function_">string</span>(_tokenURIBytes);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>这部分是这个合约的核心部分。它定义了扩展数据的网络地址，以便可以在访问ERC721资产的同时，得到一些诸如图片之类的额外数据。头部的<code>mustBeValidToken(_tokenId)</code>比较明显，是在基础类里定义的修饰器。</p><p>这里主要打算说的是另一个问题，一开始我想当然的觉得，把<code>_tokenURIPrefix</code>、<code>tokenURISuffix</code>、<code>_tokenId</code>组合起来的方式肯定是<code>tokenURIPrefix + _tokenId + tokenURISuffix</code>。当然，现在看起来这很蠢。因为作为一个处处花钱的语言，是不会轻易自动去做任何转换的。所以正确的方式，是把所有内容全部转换为字节（其实多看点代码还会发现，string并不是经常被使用的类型，相信原因都懂的），然后拼接起来。</p><p>劈里啪啦写了一堆，再一看时间，都凌晨5点了。下次继续吧。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;想了想，还是决定开这个新坑吧。上一次玩合约，好像已经是19年的事情了。18年跟几位大神入了区块链这个神坑，受益匪浅。时隔数年，有好多东西都忘了。借着Axie Infinity这些NFTs概念游戏大火，来温故一番、也知新一下。&lt;/p&gt;
&lt;p&gt;这里声明一下我的观点，区块链的前景</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="区块链" scheme="https://www.gsgundam.com/tags/%E5%8C%BA%E5%9D%97%E9%93%BE/"/>
    
    <category term="blockchain" scheme="https://www.gsgundam.com/tags/blockchain/"/>
    
    <category term="ethereum" scheme="https://www.gsgundam.com/tags/ethereum/"/>
    
    <category term="axie infinity" scheme="https://www.gsgundam.com/tags/axie-infinity/"/>
    
    <category term="axie" scheme="https://www.gsgundam.com/tags/axie/"/>
    
    <category term="合约" scheme="https://www.gsgundam.com/tags/%E5%90%88%E7%BA%A6/"/>
    
    <category term="智能合约" scheme="https://www.gsgundam.com/tags/%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6/"/>
    
    <category term="contract" scheme="https://www.gsgundam.com/tags/contract/"/>
    
  </entry>
  
  <entry>
    <title>解决Hexo使用GitLab持续集成部署阿里云虚机lftp无法全部完成的问题</title>
    <link href="https://www.gsgundam.com/archive/2021-10-30-fix-hexo-gitlab-deploy-ci-yml/"/>
    <id>https://www.gsgundam.com/archive/2021-10-30-fix-hexo-gitlab-deploy-ci-yml/</id>
    <published>2021-10-30T15:30:00.000Z</published>
    <updated>2021-10-30T18:34:19.080Z</updated>
    
    <content type="html"><![CDATA[<p>说来就很离谱。使用了这么久的持续集成来部署阿里云虚机的ftp，但是实际上一直有问题，经常无法完全部署上去，但是看日志又没有任何报错。</p><p>这次跟着解决搜索的问题，索性一并仔细找寻了一下。</p><p>整个过程一点都不轻松，因为完全没有头绪。开发最怕的事情是3件，1、找不到问题；2、找不到原因；3、找不到方法。我被成功卡在第二步。</p><p>不知道原因，只能不断的排除。能上传，说明基础配置是没有问题的。那么就调整lftp的参数，进行各种尝试。</p><p>废话不多说，直接上结果：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># This file is a template, and might need editing before it works on your project.</span></span><br><span class="line"><span class="comment"># Full project: https://gitlab.com/pages/hexo</span></span><br><span class="line"><span class="attr">image:</span> <span class="string">node:12.14.1</span></span><br><span class="line"></span><br><span class="line"><span class="attr">cache:</span></span><br><span class="line">  <span class="attr">paths:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">node_modules/</span></span><br><span class="line"></span><br><span class="line"><span class="attr">before_script:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">npm</span> <span class="string">install</span> <span class="string">hexo-cli</span> <span class="string">-g</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">test</span> <span class="string">-e</span> <span class="string">package.json</span> <span class="string">&amp;&amp;</span> <span class="string">npm</span> <span class="string">install</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">hexo</span> <span class="string">generate</span></span><br><span class="line"></span><br><span class="line"><span class="attr">pages:</span></span><br><span class="line">  <span class="attr">script:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">apt-get</span> <span class="string">update</span> <span class="string">-qq</span> <span class="string">&amp;&amp;</span> <span class="string">apt-get</span> <span class="string">install</span> <span class="string">-y</span> <span class="string">-qq</span> <span class="string">lftp</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">lftp</span> <span class="string">-c</span> <span class="string">&quot;set ftp:ssl-allow false; set ftp:ignore-pasv-address true; set ftp:prefer-epsv no; set ftp:charset gbk; set file:charset utf-8; debug; open -u $USERNAME,$PASSWORD $HOST; mirror -R public/ ./htdocs --verbose -p --ignore-time --transfer-all --parallel=5 --exclude-glob .git* --exclude .git/&quot;</span></span><br><span class="line">  <span class="attr">artifacts:</span></span><br><span class="line">    <span class="attr">expire_in:</span> <span class="number">3</span> <span class="string">days</span>  </span><br><span class="line">    <span class="attr">paths:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">public</span> </span><br><span class="line">  <span class="attr">only:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">master</span></span><br></pre></td></tr></table></figure><p>重点在于把lftp命令提前到script中执行，并且添加–trasfer-all参数，尝试确保全部传输完毕。事实证明成功了。</p><p>原文在这里 <a href="https://gsgundam.com/2020-01-14-gitlab-ci-hexo-auto-deploy/">使用GitLab CI持续集成并自动FTP同步</a> 。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;说来就很离谱。使用了这么久的持续集成来部署阿里云虚机的ftp，但是实际上一直有问题，经常无法完全部署上去，但是看日志又没有任何报错。&lt;/p&gt;
&lt;p&gt;这次跟着解决搜索的问题，索性一并仔细找寻了一下。&lt;/p&gt;
&lt;p&gt;整个过程一点都不轻松，因为完全没有头绪。开发最怕的事情是3件，</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="gitlab" scheme="https://www.gsgundam.com/tags/gitlab/"/>
    
    <category term="ci" scheme="https://www.gsgundam.com/tags/ci/"/>
    
    <category term="持续集成" scheme="https://www.gsgundam.com/tags/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/"/>
    
    <category term="部署" scheme="https://www.gsgundam.com/tags/%E9%83%A8%E7%BD%B2/"/>
    
    <category term="pipeline" scheme="https://www.gsgundam.com/tags/pipeline/"/>
    
    <category term="yml" scheme="https://www.gsgundam.com/tags/yml/"/>
    
    <category term="lftp" scheme="https://www.gsgundam.com/tags/lftp/"/>
    
    <category term="阿里云虚机" scheme="https://www.gsgundam.com/tags/%E9%98%BF%E9%87%8C%E4%BA%91%E8%99%9A%E6%9C%BA/"/>
    
  </entry>
  
  <entry>
    <title>解决Hexo在 Node.js 14 下出现的 Accessing non-existent property &#39;xxx&#39; of module exports inside circular dependency 问题</title>
    <link href="https://www.gsgundam.com/archive/2021-10-29-hexo-nodejs14-accessing-non-existent-property-issue/"/>
    <id>https://www.gsgundam.com/archive/2021-10-29-hexo-nodejs14-accessing-non-existent-property-issue/</id>
    <published>2021-10-29T07:00:00.000Z</published>
    <updated>2021-10-31T09:02:44.042Z</updated>
    
    <content type="html"><![CDATA[<p>终于处理好了hexo本地搜索的问题，但是在这个过程中，由于顺手升级了nodejs，其实产生了新问题的。</p><p>问题如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ hexo -s                              </span><br><span class="line">(node:87224) Warning: Accessing non-existent property <span class="string">&#x27;lineno&#x27;</span> of module exports inside circular dependency</span><br><span class="line">(Use `node --trace-warnings ...` to show <span class="built_in">where</span> the warning was created)</span><br><span class="line">(node:87224) Warning: Accessing non-existent property <span class="string">&#x27;column&#x27;</span> of module exports inside circular dependency</span><br><span class="line">(node:87224) Warning: Accessing non-existent property <span class="string">&#x27;filename&#x27;</span> of module exports inside circular dependency</span><br><span class="line">(node:87224) Warning: Accessing non-existent property <span class="string">&#x27;lineno&#x27;</span> of module exports inside circular dependency</span><br><span class="line">(node:87224) Warning: Accessing non-existent property <span class="string">&#x27;column&#x27;</span> of module exports inside circular dependency</span><br><span class="line">(node:87224) Warning: Accessing non-existent property <span class="string">&#x27;filename&#x27;</span> of module exports inside circular dependency</span><br></pre></td></tr></table></figure><p>虽说不影响运行，但是很莫名其妙，因为除了环境以外，什么都没动过哎。哪来的循环依赖。</p><p>直接上google吧，很顺利的找到了解决方案。我个人倾向于这种： <a href="https://www.haoyizebo.com/posts/710984d0/">https://www.haoyizebo.com/posts/710984d0/</a> 。</p><h1 id="原因"><a href="#原因" class="headerlink" title="原因"></a>原因</h1><p>可以直接看这里 <a href="https://github.com/nodejs/node/pull/29935">https://github.com/nodejs/node/pull/29935</a> 。但是其实不太重要，只要知道是Hexo以及所依赖的插件造成的问题。通过 <code>npx cross-env NODE_OPTIONS=&quot;--trace-warnings&quot; hexo s</code> 命令来启动本地服务，可以查看到调试信息，找到是哪里警告和报错。</p><p>然后我们追踪可以发现，其实就是stylus跟nodejs14新合并的pr产生的问题。但是通过google到的文章可以知道，这个问题已经在<code>0.54.8</code>版本修复了，也就是说，应该是有插件依赖了旧版本的stylus。每个人的情况不一样，上面的文章说是出在nib，但我出在cjs。这都不重要，问题找到了，现在就来搞解决方案吧。</p><p>总的来说有有两大方案吧：</p><h1 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h1><h2 id="降级NodeJS"><a href="#降级NodeJS" class="headerlink" title="降级NodeJS"></a>降级NodeJS</h2><p>这个最直接、干脆、暴力，既然是新的nodejs出的问题，那降级不就好了？</p><p>Windows：直接到 <a href="https://nodejs.org/download/release/v12.22.7/">https://nodejs.org/download/release/v12.22.7/</a> 下载安装包，并安装到原有位置即可。</p><p>Linux&#x2F;Mac：安装版本管理器n就可以切换版本了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ npm install -g n</span><br><span class="line">$ n 12.22.7</span><br><span class="line">$ node --version</span><br></pre></td></tr></table></figure><p>检查一下node版本，然后最好重启一下console，不然有缓存，npm还是使用的新版本。问题解决！</p><h2 id="使用resolutions"><a href="#使用resolutions" class="headerlink" title="使用resolutions"></a>使用resolutions</h2><p><code>resolutions</code>是什么？简单来说，它是 yarn 提供的统一所有依赖和依赖的依赖和依赖的依赖的依赖……（无限循环下去）的字段。什么？你问我yarn是什么？如果真的懒得去查一下的话，那你就把它理解成npm的替代品。</p><p>为什么使用resolutions？因为简单方便，如果要用npm来解决依赖问题，需要新安装插件，更麻烦的配置，更多的理解。而resolutions简单直白，就是大声说出来：“这个插件我只用这个版本！”</p><p>那么，在 package.json 里增加 resolutions 来覆盖版本定义：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line">&quot;resolutions&quot;: &#123;</span><br><span class="line">  &quot;stylus&quot;: &quot;^0.54.8&quot;</span><br><span class="line">&#125;</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>如果没有安装yarn，使用 <code>npm install -g yarn</code> 安装一下，然后执行 <code>yarn install</code>，一切都安静了。</p><h1 id="写在文末"><a href="#写在文末" class="headerlink" title="写在文末"></a>写在文末</h1><p>这之后一定要记得，都要用 yarn 来管理包，不然resolutions就没有用了。</p><p>另外，搜索真的是互联网人的重要能力，大家都保持吧！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;终于处理好了hexo本地搜索的问题，但是在这个过程中，由于顺手升级了nodejs，其实产生了新问题的。&lt;/p&gt;
&lt;p&gt;问题如下：&lt;/p&gt;
&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;s</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="nodejs" scheme="https://www.gsgundam.com/tags/nodejs/"/>
    
    <category term="npm" scheme="https://www.gsgundam.com/tags/npm/"/>
    
    <category term="stylus" scheme="https://www.gsgundam.com/tags/stylus/"/>
    
    <category term="accessing" scheme="https://www.gsgundam.com/tags/accessing/"/>
    
    <category term="non-existent" scheme="https://www.gsgundam.com/tags/non-existent/"/>
    
    <category term="circular" scheme="https://www.gsgundam.com/tags/circular/"/>
    
    <category term="yarn" scheme="https://www.gsgundam.com/tags/yarn/"/>
    
  </entry>
  
  <entry>
    <title>geth命令miner.start返回null的问题</title>
    <link href="https://www.gsgundam.com/archive/2021-10-16-miner-start-null/"/>
    <id>https://www.gsgundam.com/archive/2021-10-16-miner-start-null/</id>
    <published>2021-10-16T15:30:00.000Z</published>
    <updated>2021-10-28T16:22:17.929Z</updated>
    
    <content type="html"><![CDATA[<p>昨天还在跟老王闲聊，圈圈绕绕，做了一圈区块链应用，最终还是绕回对链的研究了。</p><p>从bitcoin到ethereum到eos，3条最主流应用的链看完了，还是有很多收获。当然，还是要扯回今天的主题，实际在搭建基于geth的poa链时，<code>miner.start()</code>返回了<code>null</code>。</p><p>检查了好几遍也没有发现有什么问题。突然灵机一动，检查了一下当前的区块，就出现了下面一幕。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&gt; miner.start()</span><br><span class="line">null</span><br><span class="line">&gt; eth.blocakNumber</span><br><span class="line">undefined</span><br><span class="line">&gt; eth.blockNumber</span><br><span class="line">1106</span><br><span class="line">&gt; eth.blockNumber</span><br><span class="line">1109</span><br><span class="line">&gt; eth.blockNumber</span><br><span class="line">1125</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>……居然是正常的，怪不得google上的那些回答都有点答非所问……</p><p>直接跳过了，先把主要的东西理清楚，再来解决这些奇奇怪怪的小东西 🤬</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;昨天还在跟老王闲聊，圈圈绕绕，做了一圈区块链应用，最终还是绕回对链的研究了。&lt;/p&gt;
&lt;p&gt;从bitcoin到ethereum到eos，3条最主流应用的链看完了，还是有很多收获。当然，还是要扯回今天的主题，实际在搭建基于geth的poa链时，&lt;code&gt;miner.star</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="区块链" scheme="https://www.gsgundam.com/tags/%E5%8C%BA%E5%9D%97%E9%93%BE/"/>
    
    <category term="blockchain" scheme="https://www.gsgundam.com/tags/blockchain/"/>
    
    <category term="geth" scheme="https://www.gsgundam.com/tags/geth/"/>
    
    <category term="miner.start" scheme="https://www.gsgundam.com/tags/miner-start/"/>
    
  </entry>
  
  <entry>
    <title>查看UnityAds收入状况</title>
    <link href="https://www.gsgundam.com/archive/2021-05-29-unity-ads-finance/"/>
    <id>https://www.gsgundam.com/archive/2021-05-29-unity-ads-finance/</id>
    <published>2021-05-29T03:30:00.000Z</published>
    <updated>2021-06-13T18:44:13.508Z</updated>
    
    <content type="html"><![CDATA[<p>有好长时间没登录unity的服务后台了。最近因为重启了几个项目，又开始捣鼓这一块。</p><p>好家伙，有段时间没见，后台都改得我都不认识了。</p><p>想看看现在Unity Ads还有多少钱，折腾了整整半天，终于找到了。</p><p>路径是 <a href="https://unity.com/">https://unity.com/</a> -&gt; 登录账号 -&gt; 选择“Dashboard(控制面板)” -&gt; Monetize -&gt; Finance 即可。其中，可能前面进入了某一个特定的项目，在<code>Monetize</code>这里需要先返回到上一层，再点击 <code>Finance</code>。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20210614023708.png"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;有好长时间没登录unity的服务后台了。最近因为重启了几个项目，又开始捣鼓这一块。&lt;/p&gt;
&lt;p&gt;好家伙，有段时间没见，后台都改得我都不认识了。&lt;/p&gt;
&lt;p&gt;想看看现在Unity Ads还有多少钱，折腾了整整半天，终于找到了。&lt;/p&gt;
&lt;p&gt;路径是 &lt;a href=&quot;ht</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="unity" scheme="https://www.gsgundam.com/tags/unity/"/>
    
    <category term="ads" scheme="https://www.gsgundam.com/tags/ads/"/>
    
    <category term="收入" scheme="https://www.gsgundam.com/tags/%E6%94%B6%E5%85%A5/"/>
    
    <category term="余额" scheme="https://www.gsgundam.com/tags/%E4%BD%99%E9%A2%9D/"/>
    
    <category term="新版" scheme="https://www.gsgundam.com/tags/%E6%96%B0%E7%89%88/"/>
    
  </entry>
  
  <entry>
    <title>米4老爷机刷入带Magisk的Lineage 17.1 安卓10后重获新生</title>
    <link href="https://www.gsgundam.com/archive/2021-03-07-mi4-lte-lineage-17.1-android-10-magisk/"/>
    <id>https://www.gsgundam.com/archive/2021-03-07-mi4-lte-lineage-17.1-android-10-magisk/</id>
    <published>2021-03-07T13:00:00.000Z</published>
    <updated>2021-11-22T05:23:49.396Z</updated>
    
    <content type="html"><![CDATA[<p>我觉得吧，良心这个词，现在可用的地方越来越少了。但是对于Lineage这个rom来说，却可以毫不吝啬的用来夸它。</p><p>这是孩儿她妈唯一一次送我手机，特别稀罕，即便已经过去7年了，还是一直舍不得完全淘汰。第一次刷Lineage就是用的米4。</p><p>这回在搞完口袋阅以后，就琢磨着要不让米4这老爷机也新生一次？</p><p>我先来描述一下之前的惨状，刷了一个魔改的基于安卓7的Lineage，安装软件不太多，大约5个，有微信，无sim卡。使用有卡顿感，大部分时间息屏，但是待机时间不超过1天。</p><p>由于陈总之前的引导，我相信只要能找到适配米4的原版Lineage，一定有希望让米4的表现有所改观。</p><p>所以，你能想到吗？一台7年前的老爷机，还能被一直支持到次新系统，拥有专门的<a href="https://www.cyanogenmods.org/forums/topic/mi-3-lineage-os-17-1/">机型页面</a>。我知道，这次有戏了。</p><h1 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h1><p>–<a href="https://androidfilehost.com/?fid=4349826312261760847">lineage-17.1-20200403-UNOFFICIAL-cancro.zip</a> -必需  </p><p>–<a href="https://wws.lanzous.com/iKRRBmy1f1i">twrp-3.2.1-0-cancro-20180305.img</a> -必需（密码:auxp）  </p><p>–<a href="http://miuirom.xiaomi.com/rom/u1106245679/4.5.813.51/miflash_unlock-4.5.813.51.zip">miflash_unlock-4.5.813.51.zip</a> -必需</p><p>–<a href="https://sn9.us/file/22501768-406562145">TOOLS_BY_CZ_V7.20</a> -推荐（密码：6666）  </p><p>–<a href="https://wws.lanzous.com/i4g9Dmy1d3i">Magisk-v21-4.zip</a> -推荐（密码:g1a0） </p><p>–<a href="https://opengapps.org/">opengapp</a> -推荐（选择ARM-&gt;Android 10-&gt;pico已经够用）</p><p>其中magisk是被lineage官方采用了的新的root方案，建议直接刷入。（这也是我觉得lineage优秀的方面，可以接纳其他工具比自己的做的好）</p><h1 id="USB调试"><a href="#USB调试" class="headerlink" title="USB调试"></a>USB调试</h1><p>这一步当然是安卓搞机必需做的事情，每台机子打开开发者模式的方式不尽相同，但大部分都是点击mod的版本号若干次。然后进入找到<code>USB调试</code>，打开开关即可。</p><h1 id="解锁"><a href="#解锁" class="headerlink" title="解锁"></a>解锁</h1><p>要想刷机，小米当然得解锁才行。我的米4早在刷安卓7的时候就解锁了，但是为了确保万无一失，我还是下载了小米解锁工具来确认。幸好有这么一步，又帮大家躺平一坑。目前所有的国内官网上的解锁工具，都已经无法解锁甚至无法确认米4是否解锁，需要下载一个<code>miflash_unlock-4.5.813.51</code>的老版本才能正常运作。</p><p>这步很简单，按照软件指引操作即可。</p><h1 id="线刷TWRP"><a href="#线刷TWRP" class="headerlink" title="线刷TWRP"></a>线刷TWRP</h1><p>印象里米4的TWRP特别容易掉，果然，用音量上+锁屏键进Recovery，直接就是小米的，这当然不行。</p><p>首先进入bootloader，比如长按音量键下+锁屏键，直到手机完全重启。</p><p>所谓线刷，当然是要用数据线连接手机和PC。</p><p>刷入recovery可以直接命令行，例如：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb fastboot flash recovery twrp.img</span><br></pre></td></tr></table></figure><p>但是还有图形化更好用的工具，例如<code>TOOLS_BY_CZ</code>，将<code>twrp-3.2.1-0-cancro-20180305.img</code>放到工具目录下的”File”文件夹里，然后直接选择线刷专区，文件选中<code>twrp-3.2.1-0-cancro-20180305.img</code>，分区选中<code>Recovery</code>，点击刷入，等待完成即可。</p><h1 id="卡刷lineage"><a href="#卡刷lineage" class="headerlink" title="卡刷lineage"></a>卡刷lineage</h1><p>首先进入Recovery，可以长按音量上+锁屏键，也可以用<code>TOOLS_BY_CZ</code>工具来操作。为了确保刷入以后能正常启动，请备份必要资料并三清。</p><p>清理完成以后，用PC拷入<code>lineage-17.1-20200403-UNOFFICIAL-cancro.zip</code>到手机存储，选择Install，然后选择这个文件，右滑刷入即可。</p><p>刷入完成重启手机，第一次进入系统会比较慢，耐心等待。</p><h1 id="卡刷magisk-x2F-gapp"><a href="#卡刷magisk-x2F-gapp" class="headerlink" title="卡刷magisk&#x2F;gapp"></a>卡刷magisk&#x2F;gapp</h1><p>实际操作中，我发现可能作者并没有很好的内置magisk，以至于我第一次进系统，打开Magisk manager发现magisk并没有安装，所以我们用PC拷入<code>Magisk-v21-4.zip</code>到手机存储，再次进入到Recovery，安装zip包。如果对google服务有要求，一并刷入gapp就可以了。</p><h1 id="修复信号上的叉号（备选）"><a href="#修复信号上的叉号（备选）" class="headerlink" title="修复信号上的叉号（备选）"></a>修复信号上的叉号（备选）</h1><p>lineage是基于安卓原版进行优化和适配的，因此本身是要基于谷歌服务的。基于一些特殊原因，任何连接都会被判定为网络不通畅（除非你有工具）。这个不止是视觉上的问题，重要的是一旦网络断开，手机并不会自动连接该网络，很影响体验，耗电也有所干扰。</p><p>在开启USB调试，并且连接PC的情况下，进行以下操作即可：</p><p>1、输入命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell settings put global captive_portal_https_url https://www.google.cn/generate_204</span><br></pre></td></tr></table></figure><p>2、开启飞行模式，然后关闭飞行模式，收工！</p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>至此，小米4彻底复活。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/mi4.202103.jpg"></p><p>在酷安上筛选了各种工具以后，开启冰箱，耗电得到极好的控制。尤其在Kitsunebi始终运行的情况下，纯待机2天半毫无压力。来，米4再战3年。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/mi4_battery.202103.jpg"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;我觉得吧，良心这个词，现在可用的地方越来越少了。但是对于Lineage这个rom来说，却可以毫不吝啬的用来夸它。&lt;/p&gt;
&lt;p&gt;这是孩儿她妈唯一一次送我手机，特别稀罕，即便已经过去7年了，还是一直舍不得完全淘汰。第一次刷Lineage就是用的米4。&lt;/p&gt;
&lt;p&gt;这回在搞完</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="android" scheme="https://www.gsgundam.com/tags/android/"/>
    
    <category term="小米" scheme="https://www.gsgundam.com/tags/%E5%B0%8F%E7%B1%B3/"/>
    
    <category term="米4" scheme="https://www.gsgundam.com/tags/%E7%B1%B34/"/>
    
    <category term="lineage" scheme="https://www.gsgundam.com/tags/lineage/"/>
    
    <category term="magisk" scheme="https://www.gsgundam.com/tags/magisk/"/>
    
    <category term="android10" scheme="https://www.gsgundam.com/tags/android10/"/>
    
    <category term="老爷机" scheme="https://www.gsgundam.com/tags/%E8%80%81%E7%88%B7%E6%9C%BA/"/>
    
  </entry>
  
  <entry>
    <title>口袋阅1代sc801a-1墨水屏手机刷v91带root</title>
    <link href="https://www.gsgundam.com/archive/2021-02-24-sc801a-1-eink-fastboot-flash-v91-root/"/>
    <id>https://www.gsgundam.com/archive/2021-02-24-sc801a-1-eink-fastboot-flash-v91-root/</id>
    <published>2021-02-23T23:00:00.000Z</published>
    <updated>2025-01-04T16:13:40.902Z</updated>
    
    <content type="html"><![CDATA[<p>最近也不知道是太忙了还是手痒，之前打卡翻车的口袋阅听书越来越不舒坦了。大概是因为操作不方便，耗电还挺快的。于是想着怎么折腾一下让它更好用。</p><p>所以说安卓机的好处和坏处都在这里：既有机会让它变得更加个性化更好用，也可能挥霍掉宝贵的时间还有可能变砖赔钱。</p><p><del>能写这一篇，自然是因为最后成功了，而且还要安利一个QQ群：25130136，入群费10元，但是买不了吃亏买不了上当。如果你在玩老爷机、墨水屏、偏门机型，那在这里大概率能得到你想要的答案，可能会迟到，但是一定不会缺席。</del></p><p><del>群主一直没有回复我是否可以授权，于是我花了几个星期自己学习了一下展讯Rom的制作，开了个星球来放自己的所有资源，考虑到以后可能会下载或者自己手动做一些东西，给了个收费门槛。有需要可以考虑下。做了个优惠券：<a href="https://t.zsxq.com/b6iIaUr">https://t.zsxq.com/b6iIaUr</a>。</del></p><p>因为有朋友在公众号咨询下载的问题，现在已经放出来了 &gt;&gt;&gt; <a href="/tools/tools-guide/#%E5%8F%A3%E8%A2%8B%E9%98%85-SC801a-V91-%E5%B8%A6Root-%E6%89%8B%E6%9C%BA%E7%B3%BB%E7%BB%9F-%F0%9F%93%85-2025-01-05">口袋阅 SC801a V91 带Root</a> &lt;&lt;&lt;</p><p>废话说完，我们来到正题，刷机。</p><h1 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h1><p>查看自己口袋阅1代的版本，可以在关于手机里先看看，理论上sc801a和sc801a-1都可以使用，但是不确定sc801c可以使用。如果是sc801a-1，那刷网上流传的v88.root版，很容易丢蜂窝信号（不要问我是怎么知道的）。所以请加入我前面说的到的QQ群，获取SC801a-1.V91.202005281427_Modify_by_Sillage.pac。</p><p>所有需要准备的文件如下：</p><p>  –SPRD_NPI_USBDriver_1.4（驱动）-<strong>必需</strong>  </p><p>  –SPD_Driver_R4.20.0201（驱动）-如果上面的驱动无效，试试这个  </p><p>  –UnLockBL（解锁工具）-<strong>必需</strong>  </p><p>  –ResearchDownload_R25.20.3901（刷机工具）-<strong>必需</strong>  </p><p>  –SC801a-1.V91.202005281427_Modify_by_Sillage.pac（刷机包） -<strong>必需</strong>  </p><p>  –SC801a.V88_Modify_Root.pac（刷机包） -推荐  </p><p>  –TOOLS_BY_CZ_V7.20（adb&#x2F;fb工具箱） -推荐  </p><p>  –KDY_Magisk21.4_Patch_by_Sillage.pac（magisk刷机包） -备用  </p><p>以上所有内容，全部可以在推荐的QQ群里找到。网上也有部分流传，但是作为对群主劳动成果的尊重，我就不多说了，反正我是入群下载的。</p><h1 id="USB调试"><a href="#USB调试" class="headerlink" title="USB调试"></a>USB调试</h1><p>不论刷入哪个版本的固件，开发者选项必须打开，从而打开USB调试模式的开关。如果是v81以上，可以使用<code>*#*#5858#*#*</code>；如果是v58以上，可以使用<code>*#*#415263#*#*</code>。特别的，似乎v77版本是没有办法打开调试模式的，如果不巧刚好是这个版本，选择在线更新即可。</p><p>打开开发者选项以后，进入找到<code>USB调试</code>，打开开关即可。</p><h1 id="安装驱动"><a href="#安装驱动" class="headerlink" title="安装驱动"></a>安装驱动</h1><p>这步简单，直接运行<code>SPRD_NPI_USBDriver_1.4</code>安装文件即可。</p><h1 id="解锁"><a href="#解锁" class="headerlink" title="解锁"></a>解锁</h1><p>刷v91版本必须解锁BootLoader。</p><p>这里有个要注意的事情，必须使用<code>UnLockBL.7z</code>内的文件进行全部操作。我之前就犯了这个问题，搞了2天都没弄对，千万不要使用其他platform_tools来执行命令。</p><p>连接好PC和手机以后，开始后面的操作步骤。</p><p>首先进入bootloader，通常有以下几种方式：</p><p>1、长按音量键下+锁屏键，直到手机完全重启;</p><p>2、使用adb命令，运行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb reboot bootloader</span><br></pre></td></tr></table></figure><p>3、打开之前下载的<code>TOOLS_BY_CZ_V7.20</code>工具，选择线刷专区，点击<code>Fastboot(BL)</code>。</p><h2 id="获取device-sn"><a href="#获取device-sn" class="headerlink" title="获取device_sn"></a>获取device_sn</h2><p>记得从这里开始，必须使用<code>UnLockBL.7z</code>内的文件进行操作，否则一定会有问题，我尝试了各种版本的platform tools，都是没法正确走完流程的。另外，记得安装Git客户端，不过相信大部分愿意折腾的都是程序猿，所以不太可能没有安装。</p><p>执行以下命令得到序列号</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">fastboot oem get_identifier_token</span><br></pre></td></tr></table></figure><h2 id="制作解锁文件signature-bin"><a href="#制作解锁文件signature-bin" class="headerlink" title="制作解锁文件signature.bin"></a>制作解锁文件signature.bin</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">unlockbl.sh device_sn sign.pem signature.bin</span><br></pre></td></tr></table></figure><p>其中”device_sn”为第一步获得的，记得有多长就复制多长，就算换行了也要一并复制。</p><h2 id="解锁bl"><a href="#解锁bl" class="headerlink" title="解锁bl"></a>解锁bl</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">fastboot flashing unlock_bootloader signature.bin</span><br></pre></td></tr></table></figure><p>这里要注意的是，口袋阅在bootloader下，屏幕是没有提示的，等到差不多的时候（约5秒，或听PC连接音提示），按下<code>音量下</code>键确认操作。这个坑也卡了我好久，最后在群友的配合下找到了问题所在，已经在群公告里加入了提示。</p><h2 id="重启"><a href="#重启" class="headerlink" title="重启"></a>重启</h2><p>群公告里还有一步重新刷入userdata，但是对我来说完全不需要，所以跳过了，直接执行以下命令重启手机。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">fastboot reboot</span><br></pre></td></tr></table></figure><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ%E5%9B%BE%E7%89%8720210315004206.png"></p><h1 id="刷机"><a href="#刷机" class="headerlink" title="刷机"></a>刷机</h1><p>特别说明，这里只讲刷入v91版本的过程。如果是801a-1机型要刷入v88版本，记得取消勾选NV_LTE和Vendor即可正常使用。</p><p>如果不是很熟悉安卓软硬件的朋友，以下步骤最好照做：</p><h2 id="载入固件"><a href="#载入固件" class="headerlink" title="载入固件"></a>载入固件</h2><p>打开刷机工具<code>ResearchDownload</code>，点击齿轮图标选择下载的系统固件<code>SC801a-1.V91.202005281427_Modify_by_Sillage</code>，直到载入完成。</p><h2 id="刷入固件"><a href="#刷入固件" class="headerlink" title="刷入固件"></a>刷入固件</h2><p><del>点击箭头图标，参考之前的步骤，让口袋阅进入bootloader。然后插入数据线。</del></p><p>经过小伙伴们的反映，上面这一步不太确定我是否记正确了。参考评论区的大神回答，请各位看官优先尝试 <strong>关机后按音量下键，再插数据线</strong>。</p><p>刷机工具出现进度条后，耐心等待完成即可。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/QQ%E5%9B%BE%E7%89%8720210315004214.png"></p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>正常走完以上步骤，是不太可能再有坑的。至此，口袋阅就成了一个标准的备用机，后面再加上冰箱等app，待机时间进一步控制，很趁手。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/sc801a.202103.jpg"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近也不知道是太忙了还是手痒，之前打卡翻车的口袋阅听书越来越不舒坦了。大概是因为操作不方便，耗电还挺快的。于是想着怎么折腾一下让它更好用。&lt;/p&gt;
&lt;p&gt;所以说安卓机的好处和坏处都在这里：既有机会让它变得更加个性化更好用，也可能挥霍掉宝贵的时间还有可能变砖赔钱。&lt;/p&gt;
&lt;</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="口袋阅" scheme="https://www.gsgundam.com/tags/%E5%8F%A3%E8%A2%8B%E9%98%85/"/>
    
    <category term="magisk" scheme="https://www.gsgundam.com/tags/magisk/"/>
    
    <category term="sc801a" scheme="https://www.gsgundam.com/tags/sc801a/"/>
    
    <category term="sc801a-1" scheme="https://www.gsgundam.com/tags/sc801a-1/"/>
    
    <category term="墨水屏" scheme="https://www.gsgundam.com/tags/%E5%A2%A8%E6%B0%B4%E5%B1%8F/"/>
    
    <category term="v99" scheme="https://www.gsgundam.com/tags/v99/"/>
    
    <category term="root" scheme="https://www.gsgundam.com/tags/root/"/>
    
  </entry>
  
  <entry>
    <title>MacBook Pro 2010安装macOS Big Sur</title>
    <link href="https://www.gsgundam.com/archive/2021-01-09-mac-book-pro-2010-install-big-sur/"/>
    <id>https://www.gsgundam.com/archive/2021-01-09-mac-book-pro-2010-install-big-sur/</id>
    <published>2021-01-09T04:00:00.000Z</published>
    <updated>2021-01-09T09:10:29.411Z</updated>
    
    <content type="html"><![CDATA[<p>金主爸爸前两天反应说目前的项目在iPhone5s上光照贴图有问题，然而最近真机部分都是老王在测试，我连编译环境都没有，更别说打包测试了。</p><p>难道说我该换掉2010款的mbp了吗？</p><p>当然不，因为没钱……</p><p>我相信，一定有办法越过苹果的屏蔽装上最新的macOS的。于是谷歌了一下，主要有两个工具，一个是推荐给Mac工作站的<a href="https://github.com/StarPlayrX/bigmac">BigMa</a>，另一个就是今天的主角——<a href="https://github.com/barrykn/big-sur-micropatcher">big-sur-micropatcher</a>。</p><h1 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h1><h2 id="下载工具"><a href="#下载工具" class="headerlink" title="下载工具"></a>下载工具</h2><p>首先准备一个至少16G的容量的U盘。</p><p>下载最新的<a href="https://link.zhihu.com/?target=http://swcdn.apple.com/content/downloads/00/55/001-86606-A_9SF1TL01U7/5duug9lar1gypwunjfl96dza0upa854qgg/InstallAssistant.pkg">Big Sur安装程序</a>。</p><p>下载最新版本的<a href="https://github.com/barrykn/big-sur-micropatcher/archive/v0.5.1.zip">big-sur-micropatcher 0.5.1</a>，最早可以支持到2008的Mac Pro。</p><h2 id="装入安装程序"><a href="#装入安装程序" class="headerlink" title="装入安装程序"></a>装入安装程序</h2><p>双击下载好的<strong>InstallAssistant.pkg</strong>。这样会把安装程序放到Application中。</p><h2 id="制作安装盘"><a href="#制作安装盘" class="headerlink" title="制作安装盘"></a>制作安装盘</h2><p>1、最好先使用mac的磁盘工具手动格式化一下。默认的Mac OS扩展（日志式），GUID分区图即可。格式化时一定确认自己清楚U盘的名字，一会要用到。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20210109161753.png"></p><p>2、打开终端，输入以下命令，并输入<code>y</code>，回车确认。记得替换[udisk]为U盘名字，不确定的时候，多用Tab键补全对比下。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo /Applications/Install\ macOS\ Big\ Sur.app/Contents/Resources/createinstallmedia --volume /Volumes/[udisk]</span><br></pre></td></tr></table></figure><p>这步时间有点长，一定要等待完成。</p><h2 id="安装盘打补丁"><a href="#安装盘打补丁" class="headerlink" title="安装盘打补丁"></a>安装盘打补丁</h2><p>1、解压下载的补丁程序zip，得到big-sur-micropatcher，里边有<code>micropatcher.sh</code>和<code>install-setvars.sh</code>两个重要文件。</p><p>2、首先将<code>micropatcher.sh</code>拖入终端窗口，再将U盘从Finder里拖入终端窗口，回车执行。</p><p>3、等待完成后，按同样的方式处理<code>install-setvars.sh</code>。</p><h2 id="备份系统"><a href="#备份系统" class="headerlink" title="备份系统"></a>备份系统</h2><p>无论什么设备，都一定<strong>先用时间机器Time Machine完全备份一次</strong>。不管后面是因为安装失败恢复原系统，还是安装成功恢复设置，都有用。</p><p>至此，准备工作完成。</p><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><p>1、重新启动Mac，按住Option键，直到出现引导菜单。这里要选择<code>EFI启动</code>，如果有多个<code>EFI启动</code>选项，选择黄色图标的那个。选择了以后，通常在几秒内就会自动关闭，当然，也有可能跟我一样，Mac立即就关闭了。</p><p>2、然后再次开机，同样按住Option键，这次选择<code>安装 macOS Big Sur</code>。</p><p>3、建议使用磁盘工具，把主驱动器全盘抹除格式化为APFS系统卷。</p><p>4、执行安装程序并等待。</p><p>5、按补丁作者所说，大部分早于2011年的Mac，例如MacBook 2010系列，都会遭遇内核错误而反复重启。我也不例外。不过人家都提示了，当然是有方案的。在重启过程中，按住Option键，像上面的第2步一样，选择<code>安装 macOS Big Sur</code>。如果在这个过程当中又报错了，不要气馁，连续两次都进入引导菜单，并选择<code>安装 macOS Big Sur</code>，就可以了。</p><p>6、在安装助手中打开终端，输入以下内容。记得将<code>[Macintosh\ HD]</code>替换为自己主驱动器的名字。再次温馨提示多用Tab键。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/Volumes/Image\ Volume/patch-kexts.sh --2010 /Volumes/[Macintosh\ HD].</span><br></pre></td></tr></table></figure><p>7、重启MacBook，这样安装会继续顺利进行，直至最终完成。</p><p>8、再次进入MacBook，已经是Big Sur的启动界面，在设置过程中，希望你还记得我们之前用Time Machine备份过一次，这下大用场来了。因为之前是完全重新安装，因此我们可以通过备份恢复绝大部分资料和设置。这里千万要记得出现资料传输时，<strong>如果你希望恢复资料和设置，一定一定一定要现在恢复。</strong>错过了就没有机会了。</p><p>9、等待所有设置完成。最后，进入系统。欢迎来到<strong>Big Sur</strong>。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/20210109165900.png"></p><h1 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h1><h2 id="关于操作"><a href="#关于操作" class="headerlink" title="关于操作"></a>关于操作</h2><p>如果你要按照本篇操作，并且有一定的英文阅读能力，请一定阅读<a href="https://github.com/barrykn/big-sur-micropatcher">补丁作者原文</a>。他写的比我目前看到网上的任何一篇教程都要清晰和详细，各种意外情况都包含在内。</p><h2 id="关于传闻"><a href="#关于传闻" class="headerlink" title="关于传闻"></a>关于传闻</h2><p>网上有说，在安装完成后，一定不要操作以下两种模式启动mac ，会导致无法引导启动。本人没有试过，也不会去试，大家可以借鉴一下。</p><p>1、重置配置开机：</p><p>按住 shift + control + option + 开机键四个按钮，大概20秒，松手。</p><p>2、 清除缓存开机：<br>开机按住 command + option + P + R 四个按钮20秒松开，让电脑开机。</p><h2 id="关于备份"><a href="#关于备份" class="headerlink" title="关于备份"></a>关于备份</h2><p>macOS的内置Time Machine实在是一个非常有用的东西，如果有闲置硬盘，甚至壕气的你有Time Capsule，那不要吝啬，开着，太有帮助了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;金主爸爸前两天反应说目前的项目在iPhone5s上光照贴图有问题，然而最近真机部分都是老王在测试，我连编译环境都没有，更别说打包测试了。&lt;/p&gt;
&lt;p&gt;难道说我该换掉2010款的mbp了吗？&lt;/p&gt;
&lt;p&gt;当然不，因为没钱……&lt;/p&gt;
&lt;p&gt;我相信，一定有办法越过苹果的屏蔽</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="mac os" scheme="https://www.gsgundam.com/tags/mac-os/"/>
    
    <category term="big sur" scheme="https://www.gsgundam.com/tags/big-sur/"/>
    
    <category term="macboock" scheme="https://www.gsgundam.com/tags/macboock/"/>
    
    <category term="macboock pro" scheme="https://www.gsgundam.com/tags/macboock-pro/"/>
    
    <category term="mbp" scheme="https://www.gsgundam.com/tags/mbp/"/>
    
    <category term="2010" scheme="https://www.gsgundam.com/tags/2010/"/>
    
    <category term="10.15" scheme="https://www.gsgundam.com/tags/10-15/"/>
    
  </entry>
  
  <entry>
    <title>部署docsify项目时出现无法访问README.md</title>
    <link href="https://www.gsgundam.com/archive/2020-12-23-docsify-deploy-md-missing-404/"/>
    <id>https://www.gsgundam.com/archive/2020-12-23-docsify-deploy-md-missing-404/</id>
    <published>2020-12-23T03:00:00.000Z</published>
    <updated>2020-12-23T03:55:26.546Z</updated>
    
    <content type="html"><![CDATA[<p>今天在服务器上部署用docsify编写的文档项目，结果发现首页竟然无法显示，提示404。</p><p>打开开发者调试窗口，发现是因为无法访问README.md文件。</p><p>这就奇怪了，因为这个文件跟首页同级目录存放，而且没有什么特殊权限。</p><p>于是想到了是不是网站配置文件的问题。</p><p>打开宝塔，查看nginx的配置，果然，README.md被放到了禁止访问的文件列表中。</p><p>去除掉就好了。</p><p><img src="https://www.bt.cn/bbs/data/attachment/forum/201907/20/191258cu5kukkxkrmm4rkr.jpg"></p><p>收工。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天在服务器上部署用docsify编写的文档项目，结果发现首页竟然无法显示，提示404。&lt;/p&gt;
&lt;p&gt;打开开发者调试窗口，发现是因为无法访问README.md文件。&lt;/p&gt;
&lt;p&gt;这就奇怪了，因为这个文件跟首页同级目录存放，而且没有什么特殊权限。&lt;/p&gt;
&lt;p&gt;于是想到了</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="404" scheme="https://www.gsgundam.com/tags/404/"/>
    
    <category term="宝塔" scheme="https://www.gsgundam.com/tags/%E5%AE%9D%E5%A1%94/"/>
    
    <category term="docsify" scheme="https://www.gsgundam.com/tags/docsify/"/>
    
    <category term="部署" scheme="https://www.gsgundam.com/tags/%E9%83%A8%E7%BD%B2/"/>
    
    <category term="README.md" scheme="https://www.gsgundam.com/tags/README-md/"/>
    
    <category term="无法访问" scheme="https://www.gsgundam.com/tags/%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE/"/>
    
  </entry>
  
  <entry>
    <title>uniapp调试微信小程序vender.js过大</title>
    <link href="https://www.gsgundam.com/archive/2020-12-17-weixin-mini-program-vender.js-too-large/"/>
    <id>https://www.gsgundam.com/archive/2020-12-17-weixin-mini-program-vender.js-too-large/</id>
    <published>2020-12-17T15:00:00.000Z</published>
    <updated>2021-11-02T05:15:12.867Z</updated>
    
    <content type="html"><![CDATA[<p>今天review新同事代码，发现一点问题，跑uniapp调试，结果因为小程序主包太大，没有办法真机扫码，于是开始寻觅办法。</p><p>首先看生成的微信小程序里，最大的部分是vender.js，1.8Mb。如果这个能缩小一些，那就有希望。</p><h1 id="压缩插件"><a href="#压缩插件" class="headerlink" title="压缩插件"></a>压缩插件</h1><p>先从npm插件入手，看看哪些是还可以压缩。自己找了一圈，发现只有 moment 插件有机会优化，比如去掉中文以外的所有语言文档。</p><p>在<code>vue.config.js</code>中增加</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">plugins</span>: [  </span><br><span class="line">    <span class="keyword">new</span> webpack.<span class="title class_">ContextReplacementPlugin</span>(  </span><br><span class="line">        <span class="regexp">/moment[\\\/]locale$/</span>,  </span><br><span class="line">        <span class="regexp">/^\.\/(zh-cn)$/</span>  </span><br><span class="line">    ) </span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>然而发现效果微乎其微，就减少了200k左右。</p><h1 id="开启调试环境压缩"><a href="#开启调试环境压缩" class="headerlink" title="开启调试环境压缩"></a>开启调试环境压缩</h1><p>在网上查了一下资料，发现即便配置了开启运行时压缩，其实也只是生产环境下有用，开发环境下是不会进行压缩的。</p><p>要全部都压缩，需要在<code>vue.config.js</code>增加这段代码</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">optimization</span>: &#123;</span><br><span class="line"><span class="attr">minimize</span>: <span class="literal">true</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>这样打包以后，发现vender.js只有600多k了，而且其他文件也都跟生产环境一样，全部压缩了。</p><h1 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h1><p>可能有朋友或者以后的自己会纳闷，那为什么还需要一段代码单独来开关这个功能？因为如果始终开启，在微信小程序工具里，调试窗口里也就一堆看不懂的压缩消息了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天review新同事代码，发现一点问题，跑uniapp调试，结果因为小程序主包太大，没有办法真机扫码，于是开始寻觅办法。&lt;/p&gt;
&lt;p&gt;首先看生成的微信小程序里，最大的部分是vender.js，1.8Mb。如果这个能缩小一些，那就有希望。&lt;/p&gt;
&lt;h1 id=&quot;压缩插件</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="微信" scheme="https://www.gsgundam.com/tags/%E5%BE%AE%E4%BF%A1/"/>
    
    <category term="uniapp" scheme="https://www.gsgundam.com/tags/uniapp/"/>
    
    <category term="小程序" scheme="https://www.gsgundam.com/tags/%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
    
    <category term="vender.js" scheme="https://www.gsgundam.com/tags/vender-js/"/>
    
    <category term="主包" scheme="https://www.gsgundam.com/tags/%E4%B8%BB%E5%8C%85/"/>
    
    <category term="过大" scheme="https://www.gsgundam.com/tags/%E8%BF%87%E5%A4%A7/"/>
    
  </entry>
  
  <entry>
    <title>重启gogs</title>
    <link href="https://www.gsgundam.com/archive/2020-12-01-gogs-restart/"/>
    <id>https://www.gsgundam.com/archive/2020-12-01-gogs-restart/</id>
    <published>2020-12-01T12:00:00.000Z</published>
    <updated>2020-12-01T11:58:12.833Z</updated>
    
    <content type="html"><![CDATA[<p>经常因为修改gogs的设置需要重启，但是总是不记得怎么操作。</p><p>这次在自己的博客上记一下，免得总是找度娘。</p><p>结束gogs进程，gogs默认端口位3000（这里一定自己要匹配自己的端口），查询端口进程</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$lsof</span> -i:3000</span><br></pre></td></tr></table></figure><p>然后杀死进程</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$kill</span> -9 [pid]</span><br></pre></td></tr></table></figure><p>然后启动服务</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$nohup</span> ./gogs web &amp;</span><br></pre></td></tr></table></figure><p>收工。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;经常因为修改gogs的设置需要重启，但是总是不记得怎么操作。&lt;/p&gt;
&lt;p&gt;这次在自己的博客上记一下，免得总是找度娘。&lt;/p&gt;
&lt;p&gt;结束gogs进程，gogs默认端口位3000（这里一定自己要匹配自己的端口），查询端口进程&lt;/p&gt;
&lt;figure class=&quot;highl</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="git" scheme="https://www.gsgundam.com/tags/git/"/>
    
    <category term="后台" scheme="https://www.gsgundam.com/tags/%E5%90%8E%E5%8F%B0/"/>
    
    <category term="错误" scheme="https://www.gsgundam.com/tags/%E9%94%99%E8%AF%AF/"/>
    
    <category term="gogs" scheme="https://www.gsgundam.com/tags/gogs/"/>
    
    <category term="重启" scheme="https://www.gsgundam.com/tags/%E9%87%8D%E5%90%AF/"/>
    
  </entry>
  
  <entry>
    <title>PowerShell解决因为在此系统中禁止执行脚本的错误</title>
    <link href="https://www.gsgundam.com/archive/2020-11-21-powershell-security-error-exception/"/>
    <id>https://www.gsgundam.com/archive/2020-11-21-powershell-security-error-exception/</id>
    <published>2020-11-21T04:00:00.000Z</published>
    <updated>2020-11-21T04:54:50.895Z</updated>
    
    <content type="html"><![CDATA[<p>其实这个问题已经很久了，但是通常我都通过<code>cmd</code>来替代操作，所以就没管它。</p><p>但是最近<code>powershell</code>好像使用得特别多，就各种不方便了，所有npm安装的软件几乎都用不了。均提示：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">无法加载文件 xxx ,因为在此系统中禁止执行脚本。有关详细信息,请参阅 <span class="string">&quot;get-help about_signing&quot;</span></span><br></pre></td></tr></table></figure><p>解决方案很简单，管理员身份打开<code>powershell</code>，运行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">set-ExecutionPolicy ALLSIGNED</span><br></pre></td></tr></table></figure><p>然后选择“Y”。解决。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;其实这个问题已经很久了，但是通常我都通过&lt;code&gt;cmd&lt;/code&gt;来替代操作，所以就没管它。&lt;/p&gt;
&lt;p&gt;但是最近&lt;code&gt;powershell&lt;/code&gt;好像使用得特别多，就各种不方便了，所有npm安装的软件几乎都用不了。均提示：&lt;/p&gt;
&lt;figure cl</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="error" scheme="https://www.gsgundam.com/tags/error/"/>
    
    <category term="powershell" scheme="https://www.gsgundam.com/tags/powershell/"/>
    
    <category term="禁止" scheme="https://www.gsgundam.com/tags/%E7%A6%81%E6%AD%A2/"/>
    
    <category term="脚本" scheme="https://www.gsgundam.com/tags/%E8%84%9A%E6%9C%AC/"/>
    
    <category term="错误" scheme="https://www.gsgundam.com/tags/%E9%94%99%E8%AF%AF/"/>
    
    <category term="security" scheme="https://www.gsgundam.com/tags/security/"/>
    
    <category term="exception" scheme="https://www.gsgundam.com/tags/exception/"/>
    
  </entry>
  
  <entry>
    <title>Fastadmin 从2018升级到2020</title>
    <link href="https://www.gsgundam.com/archive/2020-11-20-fastadmin-update-2018-to-2020/"/>
    <id>https://www.gsgundam.com/archive/2020-11-20-fastadmin-update-2018-to-2020/</id>
    <published>2020-11-20T14:00:00.000Z</published>
    <updated>2020-12-22T17:15:53.951Z</updated>
    
    <content type="html"><![CDATA[<p>公司里启动了很多以前搁置的老项目，包括一个简单好用的账本系统，我记流水账也一直在用。他们在开发新版本的时候，我突然想原来的老版本能不能也方便的放到小程序上用呢？</p><p>老版本的服务端是基于fastadmin开发的，于是我查看了一下，真的有一个叫fastadmin助手小程序的插件，可以在服务端方便的生成crud接口，同时提供小程序段代码。</p><p>二话不说，入手。</p><p>然后……</p><p>尴尬了，原来fastadmin的版本是2018，但是助手小程序要求202008以后的版本才可以。</p><p>升级过程也不算顺利，记录一下吧：</p><h2 id="同步项目代码"><a href="#同步项目代码" class="headerlink" title="同步项目代码"></a>同步项目代码</h2><p>1、首先下载最新版fastadmin完整包，本地安装。</p><p>2、备份原项目。</p><p>3、使用BeyondCompare比对，逐一更新项目文件。这里需要注意一下，由于大部分目录都没修改过，其实可以直接覆盖就好了。但是application目录下肯定有不少新增文件，还包括config和database，一定要仔细比对，逐行添加和修改。</p><h2 id="更新项目依赖"><a href="#更新项目依赖" class="headerlink" title="更新项目依赖"></a>更新项目依赖</h2><p>1、删除<code>public/assets/libs</code>目录所有内容。</p><p>2、保证bower和composer的配置文件都是最新的。</p><p>3、使用<code>bower install</code>安装前端依赖。</p><p>4、使用<code>composer update</code>安装php依赖。注意，在安装过程中，有可能出现 </p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">putenv() has been disabled for security reasons</span><br></pre></td></tr></table></figure><p>或者 </p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">shell_exe() has been disabled for security reasons</span><br></pre></td></tr></table></figure><p>之类的错误，原因只是对应的php版本禁用了这个函数，允许使用就好了。</p><h2 id="同步数据库"><a href="#同步数据库" class="headerlink" title="同步数据库"></a>同步数据库</h2><p>1、使用navicat连接原项目和新安装fastadmin的数据库。</p><p>2、选中新数据库，选择菜单<code>工具-&gt;结构同步</code>。这里首先只同步所有存在的数据表结构，忽略掉新增的。</p><p>3、选择菜单<code>工具-&gt;数据传输</code>。将新增的表添加到原项目中。</p><h2 id="同步应用环境"><a href="#同步应用环境" class="headerlink" title="同步应用环境"></a>同步应用环境</h2><p>1、直接启动ngnix，访问项目看有没有问题，没有问题就可以跳过了。</p><p>2、然而我写这一步，当然是因为我的出问题了😢 进入站点提示：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Parse error: syntax error, unexpected &#x27;:&#x27;, expecting &#x27;&#123;&#x27; in E:\wamp64\www\yii\vendor\symfony\polyfill-php80\bootstrap.php</span><br></pre></td></tr></table></figure><p>很容易的搜到了原因，新的依赖包polyfill中没有支持 <code>php5.6</code>，所以把项目使用的php环境改为了7.2，一切恢复正常。 </p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;公司里启动了很多以前搁置的老项目，包括一个简单好用的账本系统，我记流水账也一直在用。他们在开发新版本的时候，我突然想原来的老版本能不能也方便的放到小程序上用呢？&lt;/p&gt;
&lt;p&gt;老版本的服务端是基于fastadmin开发的，于是我查看了一下，真的有一个叫fastadmin助手</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="升级" scheme="https://www.gsgundam.com/tags/%E5%8D%87%E7%BA%A7/"/>
    
    <category term="update" scheme="https://www.gsgundam.com/tags/update/"/>
    
    <category term="fastadmin" scheme="https://www.gsgundam.com/tags/fastadmin/"/>
    
    <category term="upgrade" scheme="https://www.gsgundam.com/tags/upgrade/"/>
    
    <category term="putevn" scheme="https://www.gsgundam.com/tags/putevn/"/>
    
    <category term="shell_exec" scheme="https://www.gsgundam.com/tags/shell-exec/"/>
    
  </entry>
  
  <entry>
    <title>Multiple assemblies with equivalent identity have been imported 错误</title>
    <link href="https://www.gsgundam.com/archive/2020-11-15-unity-3d-multiple-assemblies-dll/"/>
    <id>https://www.gsgundam.com/archive/2020-11-15-unity-3d-multiple-assemblies-dll/</id>
    <published>2020-11-15T05:00:00.000Z</published>
    <updated>2020-11-15T05:34:45.960Z</updated>
    
    <content type="html"><![CDATA[<p>最近重拾老本行，开始折腾unity，由于需要用到一些新特性，从2018升到了2019，结果发现项目报错了，大致如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line">Multiple assemblies with equivalent identity have been imported...System.Data.dll...</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>好吧，因为处理完了才想起来应该记录下来，所以记不得全文了。</p><p>但是错误原因在console里写得很清楚，就是unity 2019已经内置了System.Data.dll，但是我们原来的项目在处理excel的时候，由于2017和2018都没有System.Data，所以我们导入了。现在二者冲突了，所以必须去掉一个。</p><p>当然，肯定是删除我们导入的，然后一切恢复了正常。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近重拾老本行，开始折腾unity，由于需要用到一些新特性，从2018升到了2019，结果发现项目报错了，大致如下：&lt;/p&gt;
&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;sp</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="Unity" scheme="https://www.gsgundam.com/tags/Unity/"/>
    
    <category term="dll" scheme="https://www.gsgundam.com/tags/dll/"/>
    
    <category term="multiple" scheme="https://www.gsgundam.com/tags/multiple/"/>
    
    <category term="assemblies" scheme="https://www.gsgundam.com/tags/assemblies/"/>
    
    <category term="冲突" scheme="https://www.gsgundam.com/tags/%E5%86%B2%E7%AA%81/"/>
    
  </entry>
  
  <entry>
    <title>宝塔面板定期清理redis.log</title>
    <link href="https://www.gsgundam.com/archive/2020-11-11-delete-bt-redis-log/"/>
    <id>https://www.gsgundam.com/archive/2020-11-11-delete-bt-redis-log/</id>
    <published>2020-11-11T03:00:00.000Z</published>
    <updated>2020-11-15T11:18:49.959Z</updated>
    
    <content type="html"><![CDATA[<p>今天登录公司测试服务器一看，吓了一跳，系统盘空间又告急了。哎。</p><p>于是先命令行查一下到底是什么占用了大量空间。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">find / -<span class="built_in">type</span> f -size +100000000c -<span class="built_in">exec</span> <span class="built_in">du</span> -sh &#123;&#125; \;</span><br></pre></td></tr></table></figure><p>然后发现了这堆东西</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line">5.7G/www/server/redisBak/cluster-config/6384/redis.log</span><br><span class="line">5.7G/www/server/redisBak/cluster-config/6385/redis.log</span><br><span class="line">5.7G/www/server/redisBak/cluster-config/6383/redis.log</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>呃……询问以后没有什么用处，于是直接删掉了</p><p>想了想，感觉总靠人力发现不行，而且又是测试服，只要定期清理就好了。</p><p>于是打开宝塔面板，添加计划任务-&gt;Shell脚本，文本框里加上</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">find /www/server/redisBak -name <span class="string">&quot;redis.log&quot;</span> -<span class="built_in">exec</span> <span class="built_in">rm</span> -rf &#123;&#125; \;</span><br></pre></td></tr></table></figure><p>收工。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天登录公司测试服务器一看，吓了一跳，系统盘空间又告急了。哎。&lt;/p&gt;
&lt;p&gt;于是先命令行查一下到底是什么占用了大量空间。&lt;/p&gt;
&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="宝塔面板" scheme="https://www.gsgundam.com/tags/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF/"/>
    
    <category term="log" scheme="https://www.gsgundam.com/tags/log/"/>
    
    <category term="日志" scheme="https://www.gsgundam.com/tags/%E6%97%A5%E5%BF%97/"/>
    
    <category term="宝塔" scheme="https://www.gsgundam.com/tags/%E5%AE%9D%E5%A1%94/"/>
    
    <category term="清理" scheme="https://www.gsgundam.com/tags/%E6%B8%85%E7%90%86/"/>
    
    <category term="删除" scheme="https://www.gsgundam.com/tags/%E5%88%A0%E9%99%A4/"/>
    
    <category term="redis" scheme="https://www.gsgundam.com/tags/redis/"/>
    
  </entry>
  
  <entry>
    <title>修复wordpress分类分页无效</title>
    <link href="https://www.gsgundam.com/archive/2020-10-24-wordpress-category-pagination-fix/"/>
    <id>https://www.gsgundam.com/archive/2020-10-24-wordpress-category-pagination-fix/</id>
    <published>2020-10-24T15:00:00.000Z</published>
    <updated>2020-11-03T04:56:38.560Z</updated>
    
    <content type="html"><![CDATA[<p>最近在处理新站点<a href="https://mp.dashgame.com/">陌泊小程序</a>的时候，使用到了wordpress作为后台支持，在自定义主题时发现分页的时候总是返回404。数次度娘无果，最终寻求谷歌。</p><p>路途漫漫，但是功夫不负有心人，最终使用一个插件解决<a href="https://wordpress.org/plugins/category-pagination-fix/#reviews">Category pagination fix</a>。</p><p>知其然，还要知其所以然。原文注释提到：<code>the &#39;page&#39; looks like a post name, not the keyword &quot;page&quot;</code>，也就是说wordpress会把分页路径中的page当成文章名来处理，自然就找不到了。</p><p>整个插件内容如下：</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * This plugin will fix the problem where next/previous of page number buttons are broken on list</span></span><br><span class="line"><span class="comment"> * of posts in a category when the custom permalink string is:</span></span><br><span class="line"><span class="comment"> * /%category%/%postname%/ </span></span><br><span class="line"><span class="comment"> * The problem is that with a url like this:</span></span><br><span class="line"><span class="comment"> * /categoryname/page/2</span></span><br><span class="line"><span class="comment"> * the &#x27;page&#x27; looks like a post name, not the keyword &quot;page&quot;</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">remove_page_from_query_string</span>(<span class="params"><span class="variable">$query_string</span></span>)</span></span><br><span class="line"><span class="function"></span>&#123; </span><br><span class="line">    <span class="keyword">if</span> (<span class="variable">$query_string</span>[<span class="string">&#x27;name&#x27;</span>] == <span class="string">&#x27;page&#x27;</span> &amp;&amp; <span class="keyword">isset</span>(<span class="variable">$query_string</span>[<span class="string">&#x27;page&#x27;</span>])) &#123;</span><br><span class="line">        <span class="keyword">unset</span>(<span class="variable">$query_string</span>[<span class="string">&#x27;name&#x27;</span>]);</span><br><span class="line">        <span class="comment">// &#x27;page&#x27; in the query_string looks like &#x27;/2&#x27;, so i&#x27;m spliting it out</span></span><br><span class="line">        <span class="keyword">list</span>(<span class="variable">$delim</span>, <span class="variable">$page_index</span>) = <span class="title function_ invoke__">split</span>(<span class="string">&#x27;/&#x27;</span>, <span class="variable">$query_string</span>[<span class="string">&#x27;page&#x27;</span>]);</span><br><span class="line">        <span class="variable">$query_string</span>[<span class="string">&#x27;paged&#x27;</span>] = <span class="variable">$page_index</span>;</span><br><span class="line">    &#125;      </span><br><span class="line">    <span class="keyword">return</span> <span class="variable">$query_string</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// I will kill you if you remove this. I died two days for this line </span></span><br><span class="line"><span class="title function_ invoke__">add_filter</span>(<span class="string">&#x27;request&#x27;</span>, <span class="string">&#x27;remove_page_from_query_string&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// following are code adapted from Custom Post Type Category Pagination Fix by jdantzer</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">fix_category_pagination</span>(<span class="params"><span class="variable">$qs</span></span>)</span>&#123;</span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$qs</span>[<span class="string">&#x27;category_name&#x27;</span>]) &amp;&amp; <span class="keyword">isset</span>(<span class="variable">$qs</span>[<span class="string">&#x27;paged&#x27;</span>]))&#123;</span><br><span class="line"><span class="variable">$qs</span>[<span class="string">&#x27;post_type&#x27;</span>] = <span class="title function_ invoke__">get_post_types</span>(<span class="variable">$args</span> = <span class="keyword">array</span>(</span><br><span class="line"><span class="string">&#x27;public&#x27;</span>   =&gt; <span class="literal">true</span>,</span><br><span class="line"><span class="string">&#x27;_builtin&#x27;</span> =&gt; <span class="literal">false</span></span><br><span class="line">));</span><br><span class="line"><span class="title function_ invoke__">array_push</span>(<span class="variable">$qs</span>[<span class="string">&#x27;post_type&#x27;</span>],<span class="string">&#x27;post&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="variable">$qs</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="title function_ invoke__">add_filter</span>(<span class="string">&#x27;request&#x27;</span>, <span class="string">&#x27;fix_category_pagination&#x27;</span>);</span><br></pre></td></tr></table></figure><p>另外，在用wp_query请求内容的时候，需要记得传递分页参数 <code>paged</code> 。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近在处理新站点&lt;a href=&quot;https://mp.dashgame.com/&quot;&gt;陌泊小程序&lt;/a&gt;的时候，使用到了wordpress作为后台支持，在自定义主题时发现分页的时候总是返回404。数次度娘无果，最终寻求谷歌。&lt;/p&gt;
&lt;p&gt;路途漫漫，但是功夫不负有心人，最终</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="wordpress" scheme="https://www.gsgundam.com/tags/wordpress/"/>
    
    <category term="修复" scheme="https://www.gsgundam.com/tags/%E4%BF%AE%E5%A4%8D/"/>
    
    <category term="404" scheme="https://www.gsgundam.com/tags/404/"/>
    
    <category term="分类" scheme="https://www.gsgundam.com/tags/%E5%88%86%E7%B1%BB/"/>
    
    <category term="分页" scheme="https://www.gsgundam.com/tags/%E5%88%86%E9%A1%B5/"/>
    
    <category term="无效" scheme="https://www.gsgundam.com/tags/%E6%97%A0%E6%95%88/"/>
    
    <category term="陌泊小程序" scheme="https://www.gsgundam.com/tags/%E9%99%8C%E6%B3%8A%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
    
    <category term="陌泊收录" scheme="https://www.gsgundam.com/tags/%E9%99%8C%E6%B3%8A%E6%94%B6%E5%BD%95/"/>
    
    <category term="category" scheme="https://www.gsgundam.com/tags/category/"/>
    
    <category term="pagination" scheme="https://www.gsgundam.com/tags/pagination/"/>
    
  </entry>
  
  <entry>
    <title>Windows Store 无法连接，错误代码 0x80131500</title>
    <link href="https://www.gsgundam.com/archive/2020-10-19-windows-10-store-0x80131500/"/>
    <id>https://www.gsgundam.com/archive/2020-10-19-windows-10-store-0x80131500/</id>
    <published>2020-10-19T04:00:00.000Z</published>
    <updated>2020-10-24T15:45:34.776Z</updated>
    
    <content type="html"><![CDATA[<p>话也不多说，总之用来当作nas的nuc需要用一下windows store，但是一打开就显示无法连接，提示代码：0x80131500。</p><p>然而处理方法很简单：</p><p>1、<code>Win+R</code>后，输入<code>inetcpl.cpl</code>；</p><p>2、点击<code>高级</code>，勾选<code>使用TLS 1.2</code>。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/windows-store-error.png"></p><p>如此即可。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;话也不多说，总之用来当作nas的nuc需要用一下windows store，但是一打开就显示无法连接，提示代码：0x80131500。&lt;/p&gt;
&lt;p&gt;然而处理方法很简单：&lt;/p&gt;
&lt;p&gt;1、&lt;code&gt;Win+R&lt;/code&gt;后，输入&lt;code&gt;inetcpl.cpl&lt;/c</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="windows" scheme="https://www.gsgundam.com/tags/windows/"/>
    
    <category term="微软" scheme="https://www.gsgundam.com/tags/%E5%BE%AE%E8%BD%AF/"/>
    
    <category term="store" scheme="https://www.gsgundam.com/tags/store/"/>
    
    <category term="2148734208" scheme="https://www.gsgundam.com/tags/2148734208/"/>
    
    <category term="商店" scheme="https://www.gsgundam.com/tags/%E5%95%86%E5%BA%97/"/>
    
    <category term="无法连接" scheme="https://www.gsgundam.com/tags/%E6%97%A0%E6%B3%95%E8%BF%9E%E6%8E%A5/"/>
    
  </entry>
  
  <entry>
    <title>Teambition网盘内测银色徽章get</title>
    <link href="https://www.gsgundam.com/archive/2020-09-25-aliyun-teambition-pan-alpha-test/"/>
    <id>https://www.gsgundam.com/archive/2020-09-25-aliyun-teambition-pan-alpha-test/</id>
    <published>2020-09-25T15:00:00.000Z</published>
    <updated>2020-09-25T16:09:02.005Z</updated>
    
    <content type="html"><![CDATA[<p>正在跟孩子做游戏呢，来了个邮件。完事回头一看，是个小惊喜，阿里云的网盘给我发邮件了。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/blog%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20200925235225.png"></p><p>虽然作为一个资深互联网入坑者，早已知道这个等待也有可能遥遥无期的。但是对于我这个阿里云和Teambition的重度使用者来说，还是十分期待。</p><p>看邮件内容，3-6周内会进入下一个阶段，估算一下，2-3个月应该就能拿到网盘资格了。</p><p>不知道百度网盘目前作何感想。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;正在跟孩子做游戏呢，来了个邮件。完事回头一看，是个小惊喜，阿里云的网盘给我发邮件了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/blog%E5%BE%A</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="阿里云" scheme="https://www.gsgundam.com/tags/%E9%98%BF%E9%87%8C%E4%BA%91/"/>
    
    <category term="Teambition" scheme="https://www.gsgundam.com/tags/Teambition/"/>
    
    <category term="网盘" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E7%9B%98/"/>
    
    <category term="内测" scheme="https://www.gsgundam.com/tags/%E5%86%85%E6%B5%8B/"/>
    
    <category term="徽章" scheme="https://www.gsgundam.com/tags/%E5%BE%BD%E7%AB%A0/"/>
    
  </entry>
  
  <entry>
    <title>宝塔面板安装php 7.4失败</title>
    <link href="https://www.gsgundam.com/archive/2020-09-22-bt-panel-php-install-failed/"/>
    <id>https://www.gsgundam.com/archive/2020-09-22-bt-panel-php-install-failed/</id>
    <published>2020-09-22T04:00:00.000Z</published>
    <updated>2020-09-22T03:27:13.885Z</updated>
    
    <content type="html"><![CDATA[<p>我们给客户搭建服务器目前都习惯使用宝塔面板。这两天客户要求将php升级到7.4，于是我们直接点击安装以为可以轻松解决。</p><p>然而失策了……</p><p>居然安装失败了，消息列表写着<code>安装[php-7.4]【已完成】耗时29秒</code>，然而软件商店里php7.4还显示着“安装”按钮。</p><p>赶紧查看下执行日志吧（摘录关键的）：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">No package &#x27;libjpeg&#x27; found</span><br><span class="line"></span><br><span class="line">Consider adjusting the PKG_CONFIG_PATH environment variable if you</span><br><span class="line">installed software in a non-standard prefix.</span><br><span class="line"></span><br><span class="line">Alternatively, you may set the environment variables JPEG_CFLAGS</span><br><span class="line">and JPEG_LIBS to avoid the need to call pkg-config.</span><br><span class="line">See the pkg-config man page for more details.</span><br><span class="line">make: *** No targets specified and no makefile found.  Stop.</span><br><span class="line">make: *** No rule to make target `install&#x27;.  Stop.</span><br></pre></td></tr></table></figure><p>原因很明确了，应该安装<code>libjpeg</code>包就可以了。</p><p>于是连上ssh，执行安装命令：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install libjpeg libjpeg-devel</span><br></pre></td></tr></table></figure><p>搞定。安装php7.4。成功。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;我们给客户搭建服务器目前都习惯使用宝塔面板。这两天客户要求将php升级到7.4，于是我们直接点击安装以为可以轻松解决。&lt;/p&gt;
&lt;p&gt;然而失策了……&lt;/p&gt;
&lt;p&gt;居然安装失败了，消息列表写着&lt;code&gt;安装[php-7.4]【已完成】耗时29秒&lt;/code&gt;，然而软件商店</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="php" scheme="https://www.gsgundam.com/tags/php/"/>
    
    <category term="宝塔面板" scheme="https://www.gsgundam.com/tags/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF/"/>
    
    <category term="宝塔" scheme="https://www.gsgundam.com/tags/%E5%AE%9D%E5%A1%94/"/>
    
    <category term="libjpeg" scheme="https://www.gsgundam.com/tags/libjpeg/"/>
    
  </entry>
  
  <entry>
    <title>处理MySQL ERROR：1153</title>
    <link href="https://www.gsgundam.com/archive/2020-09-21-mysql-error-1153/"/>
    <id>https://www.gsgundam.com/archive/2020-09-21-mysql-error-1153/</id>
    <published>2020-09-21T14:00:00.000Z</published>
    <updated>2020-09-22T01:50:03.812Z</updated>
    
    <content type="html"><![CDATA[<p>报错内容大概会是：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Err [Imp] 1153 - Got a packet bigger than &#x27;max_allowed_packet&#x27; bytes</span><br></pre></td></tr></table></figure><p>解决方法如下：</p><p>1、首先使用root登录mysql</p><p>2、然后执行以下命令：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">set global max_allowed_packet=1000000000;</span><br><span class="line">set global net_buffer_length=1000000;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;报错内容大概会是：&lt;/p&gt;
&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="mysql" scheme="https://www.gsgundam.com/tags/mysql/"/>
    
    <category term="error" scheme="https://www.gsgundam.com/tags/error/"/>
    
    <category term="1153" scheme="https://www.gsgundam.com/tags/1153/"/>
    
  </entry>
  
  <entry>
    <title>将口袋阅变成一部日常使用的墨水屏安卓手机</title>
    <link href="https://www.gsgundam.com/archive/2020-09-13-turn-yuewen-reader-to-e-ink-phone/"/>
    <id>https://www.gsgundam.com/archive/2020-09-13-turn-yuewen-reader-to-e-ink-phone/</id>
    <published>2020-09-13T14:00:00.000Z</published>
    <updated>2020-09-13T15:22:15.949Z</updated>
    
    <content type="html"><![CDATA[<p>话说一个多月前上了口袋阅的灵车，不出意料，果然还差一天拿第一笔款就翻车了。（PS：带娃的人千万千万不要信需要时间打卡的玩意，哪一天你必须全程陪娃的时候，就知道厉害了……）</p><p>于是可以放心大胆的开始折腾机器了。</p><p>年龄大了，其实也不想折腾太多，只想能当作普通备用机就行了。网上到处搜罗了一下，刷机什么的就不想干了，打算用最简单的安装应用来实现。</p><p>V91版本开启USB调式是输入<code>*#*#5858#*#*</code>，其他版本可以自行上网搜索。</p><p>开启USB调式以后，需要安装一个第三方市场，因为口袋阅本身是不允许下载应用的。最简单就是电脑安装豌豆荚，然后连接手机，这样就装上了豌豆荚手机端。以后要下载网页的apk是可以通过豌豆荚的。当然，我又通过豌豆荚装上了酷安。</p><p>下面说一下变身需要的两个重要软件：</p><p>1、Button Mapper Pro</p><p>2、E-ink Launcher</p><p>两个App的作用已经通过名字体现得淋漓尽致了。首先通过酷安把 E-ink Launcher 安装好。然后可以在电脑上下载 <a href="http://www.yxssp.com/26892.html">Button Mapper Pro</a>，拷贝到手机内存中，然后通过任意市场找到apk来安装。</p><p>接下来的设置有点复杂，主要关于 Button Mapper Pro：</p><p>首先在打开App以后，会进入无障碍设置：</p><p>1、点击最下面的 去设置</p><p>2、点击 音量键快捷方式</p><p>3、打开</p><p>4、点击 快捷方式服务</p><p>5、点击 Button Mapper</p><p>6、点击 确定</p><p>7、返回</p><p>8、点击 屏幕锁定时也可以用</p><p>9、返回</p><p>10、点击 Button Mapper</p><p>11、打开</p><p>然后进入 Button Mapper 进行详细设置：</p><p>1、点击主页键</p><p>2、打开自定义</p><p>3、点击 单击</p><p>4、点击 操作</p><p>5、点击 大约第二个选项的位置</p><p>6、选择 E-ink Launcher</p><p>7、点击最近应用按键</p><p>8、打开自定义</p><p>9、再点击 单击</p><p>10、点击 大约第一个选项的位置</p><p>11、选择 最近</p><p>这样，大功告成，基本实现了日常机的需求。</p><p>如果对省内存有要求，还可以通过禁用QQ阅读来节省运存</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell pm disable-user com.yuewen.cooperate.ekreader</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;话说一个多月前上了口袋阅的灵车，不出意料，果然还差一天拿第一笔款就翻车了。（PS：带娃的人千万千万不要信需要时间打卡的玩意，哪一天你必须全程陪娃的时候，就知道厉害了……）&lt;/p&gt;
&lt;p&gt;于是可以放心大胆的开始折腾机器了。&lt;/p&gt;
&lt;p&gt;年龄大了，其实也不想折腾太多，只想能当</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="cdn" scheme="https://www.gsgundam.com/tags/cdn/"/>
    
    <category term="口袋阅" scheme="https://www.gsgundam.com/tags/%E5%8F%A3%E8%A2%8B%E9%98%85/"/>
    
    <category term="墨水瓶" scheme="https://www.gsgundam.com/tags/%E5%A2%A8%E6%B0%B4%E7%93%B6/"/>
    
    <category term="e-ink" scheme="https://www.gsgundam.com/tags/e-ink/"/>
    
    <category term="电纸书" scheme="https://www.gsgundam.com/tags/%E7%94%B5%E7%BA%B8%E4%B9%A6/"/>
    
    <category term="button mapper" scheme="https://www.gsgundam.com/tags/button-mapper/"/>
    
    <category term="e-ink launcher" scheme="https://www.gsgundam.com/tags/e-ink-launcher/"/>
    
  </entry>
  
  <entry>
    <title>WordPress使用百度云加速和https后出现too many redirects</title>
    <link href="https://www.gsgundam.com/archive/2020-07-08-baidu-cdn-wp-https-too-many-redirects/"/>
    <id>https://www.gsgundam.com/archive/2020-07-08-baidu-cdn-wp-https-too-many-redirects/</id>
    <published>2020-07-08T09:00:00.000Z</published>
    <updated>2020-09-13T14:08:32.631Z</updated>
    
    <content type="html"><![CDATA[<p>同事跟我紧急求救，客户网站又访问不了。试了下，是原来出现过的 too many redirects。以前就出现过，我从容的开始回忆……</p><p>首先网站使用了let’s encrypt的免费证书，然后使用了百度云加速进行cdn加速，最后，网站使用了wordpress作为cms管理。</p><p>证书本身没有问题，wordpress肯定也没有问题（之前运行得好好的），那么锅可能会在百度云加速。</p><p>经过简单的尝试，只要把ssl证书添加到百度云加速控制面板的证书列表中，再打开安全设置的https加密即可（建议使用全程加密）。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/20200708150828.png" alt="添加证书并打开https加密"></p><p>记录一下，备忘。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;同事跟我紧急求救，客户网站又访问不了。试了下，是原来出现过的 too many redirects。以前就出现过，我从容的开始回忆……&lt;/p&gt;
&lt;p&gt;首先网站使用了let’s encrypt的免费证书，然后使用了百度云加速进行cdn加速，最后，网站使用了wordpress作</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="wordpress" scheme="https://www.gsgundam.com/tags/wordpress/"/>
    
    <category term="https" scheme="https://www.gsgundam.com/tags/https/"/>
    
    <category term="ssl" scheme="https://www.gsgundam.com/tags/ssl/"/>
    
    <category term="cdn" scheme="https://www.gsgundam.com/tags/cdn/"/>
    
    <category term="wp" scheme="https://www.gsgundam.com/tags/wp/"/>
    
    <category term="百度云" scheme="https://www.gsgundam.com/tags/%E7%99%BE%E5%BA%A6%E4%BA%91/"/>
    
    <category term="百度云加速" scheme="https://www.gsgundam.com/tags/%E7%99%BE%E5%BA%A6%E4%BA%91%E5%8A%A0%E9%80%9F/"/>
    
  </entry>
  
  <entry>
    <title>Hexo上添加Live 2D模型</title>
    <link href="https://www.gsgundam.com/archive/2020-05-30-hexo-live-2d/"/>
    <id>https://www.gsgundam.com/archive/2020-05-30-hexo-live-2d/</id>
    <published>2020-05-30T12:00:00.000Z</published>
    <updated>2020-09-13T14:08:32.631Z</updated>
    
    <content type="html"><![CDATA[<p>经常在看博客的时候，发现很多博客上有可爱的Live 2D模型，今天空余时间较多，就研究了一下怎样添加。</p><p>首先，安装npm包：</p><p><code>npm install --save hexo-helper-live2d</code></p><p>然后在hexo的配置文件_config.yml中添加如下配置，详细配置可以参考<a href="https://www.npmjs.com/package/hexo-helper-live2d">官方文档</a>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">live2d:</span><br><span class="line">  enable: true</span><br><span class="line">  pluginModelPath: assets/</span><br><span class="line">  model:</span><br><span class="line">    use: live2d-widget-model-tsumiki  #模板目录，在node_modules里</span><br><span class="line">  display:</span><br><span class="line">    position: left</span><br><span class="line">    width: 200</span><br><span class="line">    height: 400</span><br><span class="line">  mobile:</span><br><span class="line">    show: false  #是否在手机进行显示</span><br></pre></td></tr></table></figure><p>然后下载模型，模型名称可以到<a href="https://github.com/xiazeyu/live2d-widget-models">模型仓库</a>参考，一些模型的预览可以试试<a href="https://huaji8.top/post/live2d-plugin-2.0/">这个博客</a>。</p><p>最好使用npm命令安装对应的模型包，例如：</p><p><code>npm install live2d-widget-model-shizuku</code></p><p>所有模型列表如下：</p><ul><li>live2d-widget-model-chitose</li><li>live2d-widget-model-epsilon2_1</li><li>live2d-widget-model-gf</li><li>live2d-widget-model-haru&#x2F;01 (use npm install –save live2d-widget-model-haru)</li><li>live2d-widget-model-haru&#x2F;02 (use npm install –save live2d-widget-model-haru)</li><li>live2d-widget-model-haruto</li><li>live2d-widget-model-hibiki</li><li>live2d-widget-model-hijiki</li><li>live2d-widget-model-izumi</li><li>live2d-widget-model-koharu</li><li>live2d-widget-model-miku</li><li>live2d-widget-model-ni-j</li><li>live2d-widget-model-nico</li><li>live2d-widget-model-nietzsche</li><li>live2d-widget-model-nipsilon</li><li>live2d-widget-model-nito</li><li>live2d-widget-model-shizuku</li><li>live2d-widget-model-tororo</li><li>live2d-widget-model-tsumiki</li><li>live2d-widget-model-unitychan</li><li>live2d-widget-model-wanko</li><li>live2d-widget-model-z16</li></ul><p>确实还是挺好看的。</p><p><img src="/!%5B%5D(https:/gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/20200708145246.png)" alt="确实还是挺好看的"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;经常在看博客的时候，发现很多博客上有可爱的Live 2D模型，今天空余时间较多，就研究了一下怎样添加。&lt;/p&gt;
&lt;p&gt;首先，安装npm包：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;npm install --save hexo-helper-live2d&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;然后</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="live2d" scheme="https://www.gsgundam.com/tags/live2d/"/>
    
  </entry>
  
  <entry>
    <title>Imgur API 使用笔记</title>
    <link href="https://www.gsgundam.com/archive/2020-03-09-imgur-api-usage/"/>
    <id>https://www.gsgundam.com/archive/2020-03-09-imgur-api-usage/</id>
    <published>2020-03-09T15:00:00.000Z</published>
    <updated>2020-03-09T16:12:03.854Z</updated>
    
    <content type="html"><![CDATA[<p>疫情期间，各种特殊的情形催生出来一些特殊的互联网项目。比如我给孩子幼儿园班上就做了一个签到的小程序，方便同班家长报告孩子情况，也方便老师一键催签和快速统计。</p><p>当然我也一直在思考这个小程序能不能再多为班上提供点什么便利的服务？比如上线几天后，就增加了基于语雀接口的资讯模块。</p><p>要说一开始想到的是资讯，不如一开始想到的其实是图片和视频分享。但是说起来容易，做起来肉疼。图片和视频托管都是白花花的银子。从一开始我就没有想过要靠这个挣一分钱（当然也没想过要往里投入什么钱）。所以其实寻觅这个功能的实现方式，花费了相当长的时间。</p><p>第一时间想到的自然是各个对象存储，因为大部分都有免费额度，但是因为自己是基于无服务端开发，不想再去敲服务端代码了，哪怕只有简单几行。第二考虑的是国内非常有名的免费图床：sm.ms，但是恰逢去年改版，目前已经不允许客户端直接访问，必须服务端验证身份，所以也只有放弃。当然也有想过已经用上的语雀服务，但是语雀虽然提供了资源知识库，却并不提供相关接口，也就此放弃。</p><p>最后很幸运的碰到的imgur，一个令人难以置信的高质量图床，提供免费的空间和各种功能，以及丰富的api。<strong>当然有一点很关键：该服务在墙外。</strong></p><p>首先记录一下如何使用api，方法基本来自于这篇博客：<a href="https://letswrite.tw/imgur-api-upload-load/">https://letswrite.tw/imgur-api-upload-load/</a>。</p><h1 id="获取token"><a href="#获取token" class="headerlink" title="获取token"></a>获取token</h1><p>其实如果只是get方法，而且要获取的内容都是public的，那这步完全可以简化。因为用CLIENT_ID就可以通过验证了。</p><p>但是如果是私有或者说要上传，那对不起，这步是最麻烦的。</p><p>先列举一下需要的链接：</p><p>Imgur api 说明文档：<a href="https://apidocs.imgur.com/">https://apidocs.imgur.com/</a></p><p>Imgur app 注册：<a href="https://api.imgur.com/oauth2/addclient">https://api.imgur.com/oauth2/addclient</a></p><p>Postman 下载：<a href="https://www.getpostman.com/">https://www.getpostman.com/</a></p><h2 id="注册imgur"><a href="#注册imgur" class="headerlink" title="注册imgur"></a>注册imgur</h2><p>Authorization type 选择第二个不需要回调 URL。输入email后点击submit，就可以看到 App 的 ID、secret。记下scret，这个只出现一次，服务端不保留，之后只能重新生成。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/blog20200309235235.png"></p><p>了解注册过程的朋友们先不要开喷，因为这就是我的操作步骤。接下来，把之前没有填写的回调URL给补上……在Redirect那里，填写<code>https://www.getpostman.com/oauth2/callback</code>。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/blog20200309235549.png"></p><p>然后点击update。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/blog20200309235656.png"></p><h2 id="生成token"><a href="#生成token" class="headerlink" title="生成token"></a>生成token</h2><p>打开Postman，新建请求页，授权type选择OAuth2.0，然后点击Get New Access Token。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/blog20200309235846.png"></p><p>在弹出框中填写以下信息：</p><p>Callback URL：<a href="https://www.getpostman.com/oauth2/callback">https://www.getpostman.com/oauth2/callback</a></p><p>Auth URL：<a href="https://api.imgur.com/oauth2/authorize">https://api.imgur.com/oauth2/authorize</a></p><p>Access Token URL：<a href="https://api.imgur.com/oauth2/token">https://api.imgur.com/oauth2/token</a></p><p>Client ID、Client Secret：这个应该记录下来了，直接填入就是</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/blog20200309235949.png"></p><p>点击 Request Token，就弹出 Imgur 的登录框。<strong>注意，要命的地方来了。</strong></p><p>如果你是邮箱注册，那么恭喜你，直接就可以登录，然后获取到token，就像下图一样。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/blog20200310000137.png"></p><p>如果你是第三方授权的，那么也恭喜你，<strong>回到你的浏览器网页，退出登录，选择忘记密码，重新设置密码以后，才可以在刚才的登录框里登录。</strong></p><p>记得记下Access Token，否则还得再做一遍刚才的事情。</p><h1 id="获取相册内容"><a href="#获取相册内容" class="headerlink" title="获取相册内容"></a>获取相册内容</h1><p>因为我目前不使用上传接口，都是直接使用imgur的后台上传，所以直接进入下一阶段，获取内容：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> id = <span class="string">&#x27;YOUR-CLIENT-ID&#x27;</span>; </span><br><span class="line"><span class="keyword">const</span> token = <span class="string">&#x27;YOUR-TOKEN&#x27;</span>; </span><br><span class="line"><span class="keyword">const</span> album = <span class="string">&#x27;YOUR-ALBUM-ID&#x27;</span>; </span><br><span class="line"></span><br><span class="line">$.<span class="title function_">ajax</span>(&#123;</span><br><span class="line">   <span class="attr">url</span>: <span class="string">&quot;https://api.imgur.com/3/album/&quot;</span> + album + <span class="string">&quot;/images&quot;</span>,</span><br><span class="line">   <span class="string">&quot;headers&quot;</span>: &#123;</span><br><span class="line">      <span class="string">&quot;Authorization&quot;</span>: <span class="string">&#x27;Bearer &#x27;</span> + token</span><br><span class="line">   &#125;</span><br><span class="line">&#125;).<span class="title function_">done</span>(<span class="keyword">function</span>(<span class="params">res</span>) &#123;</span><br><span class="line">   <span class="variable language_">console</span>.<span class="title function_">log</span>(res.<span class="property">data</span>);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>真是非常感恩有这样优秀的服务，也感谢语雀，使得无服务端的小程序得以实现。</p><p>PS：关于怎么能正常的在国内使用这个服务，可以留言跟我交流。为了所有希望正常使用该服务的朋友还可以享受一段时间，就不在这里po出来了。也恳请所有正在使用imgur的朋友积点德，把这么好的服务用到正道上。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;疫情期间，各种特殊的情形催生出来一些特殊的互联网项目。比如我给孩子幼儿园班上就做了一个签到的小程序，方便同班家长报告孩子情况，也方便老师一键催签和快速统计。&lt;/p&gt;
&lt;p&gt;当然我也一直在思考这个小程序能不能再多为班上提供点什么便利的服务？比如上线几天后，就增加了基于语雀接口</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="图床" scheme="https://www.gsgundam.com/tags/%E5%9B%BE%E5%BA%8A/"/>
    
    <category term="托管" scheme="https://www.gsgundam.com/tags/%E6%89%98%E7%AE%A1/"/>
    
    <category term="imgur" scheme="https://www.gsgundam.com/tags/imgur/"/>
    
    <category term="使用" scheme="https://www.gsgundam.com/tags/%E4%BD%BF%E7%94%A8/"/>
    
  </entry>
  
  <entry>
    <title>beyond compare 4 评估期过期</title>
    <link href="https://www.gsgundam.com/archive/2020-02-06-beyond-compare-4-evaluation-expired/"/>
    <id>https://www.gsgundam.com/archive/2020-02-06-beyond-compare-4-evaluation-expired/</id>
    <published>2020-02-06T05:00:00.000Z</published>
    <updated>2020-02-06T07:07:20.673Z</updated>
    
    <content type="html"><![CDATA[<p>今天在同步几个项目的工具类时，因为不能全部覆盖，所以需要文件对比工具。自然要用到最强大的beyond compare。</p><p>电脑上安装的是beyond compare 4，但是因为很久没用了，早过了评估期。</p><p>度娘了一下，临时解决方案也挺简单的。</p><p>1、window+R打开管理，输入regedit</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/blog20200206135643.png"></p><p>2、注册表中找到 HKEY_CURRENT_USER\Software\Scooter Software\Beyond Compare 4 ，找到其中的 CacheID，删除掉</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/blog20200206135818.png"></p><p>3、找到 beyond compare 安装路径中的<code>BCUnrar.dll</code>， 删除</p><p><strong>再次打开就可以使用了！</strong></p><p><em>PS: 有条件还是使用正版吧，毕竟开发不易，大家都要吃饭的。</em></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天在同步几个项目的工具类时，因为不能全部覆盖，所以需要文件对比工具。自然要用到最强大的beyond compare。&lt;/p&gt;
&lt;p&gt;电脑上安装的是beyond compare 4，但是因为很久没用了，早过了评估期。&lt;/p&gt;
&lt;p&gt;度娘了一下，临时解决方案也挺简单的。&lt;/p</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="beyond" scheme="https://www.gsgundam.com/tags/beyond/"/>
    
    <category term="compare" scheme="https://www.gsgundam.com/tags/compare/"/>
    
    <category term="beyond compare" scheme="https://www.gsgundam.com/tags/beyond-compare/"/>
    
    <category term="过期" scheme="https://www.gsgundam.com/tags/%E8%BF%87%E6%9C%9F/"/>
    
    <category term="评估期" scheme="https://www.gsgundam.com/tags/%E8%AF%84%E4%BC%B0%E6%9C%9F/"/>
    
  </entry>
  
  <entry>
    <title>用gitlab网页直接发布文章</title>
    <link href="https://www.gsgundam.com/archive/2020-02-02-write-post-by-gitlab/"/>
    <id>https://www.gsgundam.com/archive/2020-02-02-write-post-by-gitlab/</id>
    <published>2020-02-02T11:00:00.000Z</published>
    <updated>2020-02-06T05:33:40.108Z</updated>
    
    <content type="html"><![CDATA[<p>正在准备明天正式上班的东西，突然脑子闪过一道光，gitlab不是跟github一样可以在线编辑文档吗？</p><p>于是立马打开gitlab开始编辑，然后就有了这篇简单的博客。</p><p>也就是说，之前定的计划里，在线编辑文章，并且自动发布，也完全可以实现了。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/blog20200202200430.png"></p><p>最后只剩下如果移动设备编辑的时候，没有办法实现图片上传cdn了。</p><p>以后再思考怎么来实现了。现在已经方便了很多。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;正在准备明天正式上班的东西，突然脑子闪过一道光，gitlab不是跟github一样可以在线编辑文档吗？&lt;/p&gt;
&lt;p&gt;于是立马打开gitlab开始编辑，然后就有了这篇简单的博客。&lt;/p&gt;
&lt;p&gt;也就是说，之前定的计划里，在线编辑文章，并且自动发布，也完全可以实现了。&lt;/p&gt;</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="web" scheme="https://www.gsgundam.com/tags/web/"/>
    
    <category term="gitlab" scheme="https://www.gsgundam.com/tags/gitlab/"/>
    
    <category term="suprise" scheme="https://www.gsgundam.com/tags/suprise/"/>
    
    <category term="万万没想到" scheme="https://www.gsgundam.com/tags/%E4%B8%87%E4%B8%87%E6%B2%A1%E6%83%B3%E5%88%B0/"/>
    
  </entry>
  
  <entry>
    <title>office提示“缓存的凭证到期”无法保存和修改的问题</title>
    <link href="https://www.gsgundam.com/archive/2020-01-30-cached-credentials-expire-office-onedrive/"/>
    <id>https://www.gsgundam.com/archive/2020-01-30-cached-credentials-expire-office-onedrive/</id>
    <published>2020-01-30T12:00:00.000Z</published>
    <updated>2020-02-01T05:15:08.367Z</updated>
    
    <content type="html"><![CDATA[<p>最近苏菲婆的触屏因为windows又抽筋自动升级了，所以非常悲催的重装了系统。</p><p>但是在装完系统以后又出现了更悲催的事情——打开word文档一直不断的弹出提示“由于你的缓存凭据已过期，我们无法上载或下载你的更改”或“无法保存或检查所做修改，因为缓存的凭据已到期，请重新登录”的警告。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/ea9b4252-095a-4a97-a024-219662350ec5.png"></p><p>这不仅仅只是影响了视觉，关键每修改一个字或者保存一次，都要卡顿很长的一段时间，完全没法工作。</p><p>轻轻度娘，就找到了解决方案：<a href="https://blog.haitianhome.com/onedrive-office-huancun-pingju.html">https://blog.haitianhome.com/onedrive-office-huancun-pingju.html</a></p><h1 id="原因"><a href="#原因" class="headerlink" title="原因"></a>原因</h1><p>罪魁祸首是onedrive里多此一举的“文件协作”功能。按文章作者的理解，onedrive好心的去同步保存office的文件，但是因为是云操作，文件不能及时上传，所以就挂起操作，这个时候office就会弹出警告；当上传后，office的警告就消失了，因为是协作需要不断查询、保存的操作，于是就重复弹出“缓存的凭证到期，无法保存修改”的警告。</p><h1 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h1><p>在onedrive将“文件协作”功能关闭，然后重启Office软件。</p><p>进入onedrive“更多”—“设置”，点击“office”项卡，把文件协作下“使用Office应用程序同步我打开的Office文件”前的勾去掉即可。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/20200130222554.png"></p><p>重启Office即可解决“缓存的凭据到期，无法保存修改”的警告问题。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近苏菲婆的触屏因为windows又抽筋自动升级了，所以非常悲催的重装了系统。&lt;/p&gt;
&lt;p&gt;但是在装完系统以后又出现了更悲催的事情——打开word文档一直不断的弹出提示“由于你的缓存凭据已过期，我们无法上载或下载你的更改”或“无法保存或检查所做修改，因为缓存的凭据已到期，</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="windows" scheme="https://www.gsgundam.com/tags/windows/"/>
    
    <category term="onedrive" scheme="https://www.gsgundam.com/tags/onedrive/"/>
    
    <category term="office" scheme="https://www.gsgundam.com/tags/office/"/>
    
    <category term="缓存的凭证到期" scheme="https://www.gsgundam.com/tags/%E7%BC%93%E5%AD%98%E7%9A%84%E5%87%AD%E8%AF%81%E5%88%B0%E6%9C%9F/"/>
    
    <category term="提示登录" scheme="https://www.gsgundam.com/tags/%E6%8F%90%E7%A4%BA%E7%99%BB%E5%BD%95/"/>
    
  </entry>
  
  <entry>
    <title>使用GitLab CI持续集成并自动FTP同步</title>
    <link href="https://www.gsgundam.com/archive/2020-01-14-gitlab-ci-hexo-auto-deploy/"/>
    <id>https://www.gsgundam.com/archive/2020-01-14-gitlab-ci-hexo-auto-deploy/</id>
    <published>2020-01-13T06:00:00.000Z</published>
    <updated>2021-10-30T17:55:27.284Z</updated>
    
    <content type="html"><![CDATA[<p>坚持不懈的寻找方案终于有了结果——使用GitLab CI持续集成并自动部署到FTP。</p><p>这样减少了相当多的人力工作。</p><p>主要分为两个过程：</p><h1 id="持续集成"><a href="#持续集成" class="headerlink" title="持续集成"></a>持续集成</h1><p>第一步很关键，但是也很简单。创建GitLab私有仓库以后，在项目根目录添加<code>.gitlab-ci.yml</code>配置文件，以便上传代码后GitLab CI使用。</p><p>其中有两个关键点。第一个是标记<code>expire_in</code>，不然会自动删除的。第二个是我这里配置了分支是<code>master</code>，这个依自己情况而定。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># This file is a template, and might need editing before it works on your project.</span></span><br><span class="line"><span class="comment"># Full project: https://gitlab.com/pages/hexo</span></span><br><span class="line"><span class="attr">image:</span> <span class="string">node:12.14.1</span></span><br><span class="line"></span><br><span class="line"><span class="attr">cache:</span></span><br><span class="line">  <span class="attr">paths:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">node_modules/</span></span><br><span class="line"></span><br><span class="line"><span class="attr">before_script:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">npm</span> <span class="string">install</span> <span class="string">hexo-cli</span> <span class="string">-g</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">test</span> <span class="string">-e</span> <span class="string">package.json</span> <span class="string">&amp;&amp;</span> <span class="string">npm</span> <span class="string">install</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">hexo</span> <span class="string">generate</span></span><br><span class="line"></span><br><span class="line"><span class="attr">pages:</span></span><br><span class="line">  <span class="attr">script:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">hexo</span> <span class="string">generate</span></span><br><span class="line">  <span class="attr">artifacts:</span></span><br><span class="line">    <span class="attr">expire_in:</span> <span class="number">3</span> <span class="string">days</span>  <span class="comment"># &lt;== !!!</span></span><br><span class="line">    <span class="attr">paths:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">public</span>  <span class="comment"># &lt;== 每次会将生成的 public 文件夹当成附件，保存起来</span></span><br><span class="line">  <span class="attr">only:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">master</span></span><br></pre></td></tr></table></figure><h1 id="自动部署"><a href="#自动部署" class="headerlink" title="自动部署"></a>自动部署</h1><p>自动部署这个折腾了很久。先描述过程，后面再说自己挖的坑。</p><p>增加FTP服务器配置后，<code>.gitlab-ci.yml</code>配置文件如下：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># This file is a template, and might need editing before it works on your project.</span></span><br><span class="line"><span class="comment"># Full project: https://gitlab.com/pages/hexo</span></span><br><span class="line"><span class="attr">image:</span> <span class="string">node:12.14.1</span></span><br><span class="line"></span><br><span class="line"><span class="attr">cache:</span></span><br><span class="line">  <span class="attr">paths:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">node_modules/</span></span><br><span class="line"></span><br><span class="line"><span class="attr">before_script:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">npm</span> <span class="string">install</span> <span class="string">hexo-cli</span> <span class="string">-g</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">test</span> <span class="string">-e</span> <span class="string">package.json</span> <span class="string">&amp;&amp;</span> <span class="string">npm</span> <span class="string">install</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">hexo</span> <span class="string">generate</span></span><br><span class="line"></span><br><span class="line"><span class="attr">pages:</span></span><br><span class="line">  <span class="attr">script:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">hexo</span> <span class="string">generate</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">apt-get</span> <span class="string">update</span> <span class="string">-qq</span> <span class="string">&amp;&amp;</span> <span class="string">apt-get</span> <span class="string">install</span> <span class="string">-y</span> <span class="string">-qq</span> <span class="string">lftp</span></span><br><span class="line">  <span class="attr">artifacts:</span></span><br><span class="line">    <span class="attr">expire_in:</span> <span class="number">3</span> <span class="string">days</span>  <span class="comment"># &lt;== !!!</span></span><br><span class="line">    <span class="attr">paths:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">public</span>  <span class="comment"># &lt;== 每次会将生成的 public 文件夹当成附件，保存起来</span></span><br><span class="line">  <span class="attr">only:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">master</span></span><br><span class="line">  <span class="attr">after_script:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">lftp</span> <span class="string">-c</span> <span class="string">&quot;set ftp:ssl-allow no; open -u $USERNAME,$PASSWORD $HOST; mirror -Rev public/ ./ --ignore-time --parallel=10 --exclude-glob .git* --exclude .git/&quot;</span></span><br></pre></td></tr></table></figure><p><strong>上述配置已更新为下面内容</strong> （相关链接 <a href="https://gsgundam.com/2021-10-30-fix-hexo-gitlab-deploy-ci-yml/">解决Hexo使用GitLab持续集成部署阿里云虚机lftp无法全部完成的问题</a> ）</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># This file is a template, and might need editing before it works on your project.</span></span><br><span class="line"><span class="comment"># Full project: https://gitlab.com/pages/hexo</span></span><br><span class="line"><span class="attr">image:</span> <span class="string">node:12.14.1</span></span><br><span class="line"></span><br><span class="line"><span class="attr">cache:</span></span><br><span class="line">  <span class="attr">paths:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">node_modules/</span></span><br><span class="line"></span><br><span class="line"><span class="attr">before_script:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">npm</span> <span class="string">install</span> <span class="string">hexo-cli</span> <span class="string">-g</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">test</span> <span class="string">-e</span> <span class="string">package.json</span> <span class="string">&amp;&amp;</span> <span class="string">npm</span> <span class="string">install</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">hexo</span> <span class="string">generate</span></span><br><span class="line"></span><br><span class="line"><span class="attr">pages:</span></span><br><span class="line">  <span class="attr">script:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">apt-get</span> <span class="string">update</span> <span class="string">-qq</span> <span class="string">&amp;&amp;</span> <span class="string">apt-get</span> <span class="string">install</span> <span class="string">-y</span> <span class="string">-qq</span> <span class="string">lftp</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">lftp</span> <span class="string">-c</span> <span class="string">&quot;set ftp:ssl-allow false; set ftp:ignore-pasv-address true; set ftp:prefer-epsv no; set ftp:charset gbk; set file:charset utf-8; debug; open -u $USERNAME,$PASSWORD $HOST; mirror -R public/ ./htdocs --verbose -p --ignore-time --transfer-all --parallel=5 --exclude-glob .git* --exclude .git/&quot;</span></span><br><span class="line">  <span class="attr">artifacts:</span></span><br><span class="line">    <span class="attr">expire_in:</span> <span class="number">3</span> <span class="string">days</span>  </span><br><span class="line">    <span class="attr">paths:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">public</span> </span><br><span class="line">  <span class="attr">only:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">master</span></span><br></pre></td></tr></table></figure><p>大致流程是先安装lftp工具，再上传。特别注意，这里为了不在代码中暴露关键信息，使用了<code>$USERNAME</code> <code>$PASSWORD</code> <code>$HOST</code>来获取CI&#x2F;CD中提前配置好的变量值。</p><h1 id="踩过的坑"><a href="#踩过的坑" class="headerlink" title="踩过的坑"></a>踩过的坑</h1><p>这个坑嘛，估计无人能懂。一开始部署的时候，觉得好像没有什么问题，但是最后生成的文件都是0kb。想着应该能有输出吧。</p><p>上CI&#x2F;CD日志一看，一脸懵逼，居然说没有layout，那指定是主题出问题了。</p><p>突然想到自己的主题原来是拿去做了开源项目给大家使用的，一检查，原来是作为submodule放在这个项目中的，所以没有上传到仓库去。最后依照这篇文章的方法去掉了submodule，一切恢复正常。<br><a href="https://www.jianshu.com/p/7acb3a2fc05c">https://www.jianshu.com/p/7acb3a2fc05c</a></p><p>世上本没有坑，倒腾的次数多了，自然就挖好了坑。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/emotion/noface2.jpg"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;坚持不懈的寻找方案终于有了结果——使用GitLab CI持续集成并自动部署到FTP。&lt;/p&gt;
&lt;p&gt;这样减少了相当多的人力工作。&lt;/p&gt;
&lt;p&gt;主要分为两个过程：&lt;/p&gt;
&lt;h1 id=&quot;持续集成&quot;&gt;&lt;a href=&quot;#持续集成&quot; class=&quot;headerlink&quot; ti</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="gitlab" scheme="https://www.gsgundam.com/tags/gitlab/"/>
    
    <category term="ci" scheme="https://www.gsgundam.com/tags/ci/"/>
    
    <category term="自动同步" scheme="https://www.gsgundam.com/tags/%E8%87%AA%E5%8A%A8%E5%90%8C%E6%AD%A5/"/>
    
    <category term="持续集成" scheme="https://www.gsgundam.com/tags/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/"/>
    
  </entry>
  
  <entry>
    <title>回归Hexo</title>
    <link href="https://www.gsgundam.com/archive/2020-01-11-back-to-hexo/"/>
    <id>https://www.gsgundam.com/archive/2020-01-11-back-to-hexo/</id>
    <published>2020-01-11T06:00:00.000Z</published>
    <updated>2022-11-28T05:39:21.553Z</updated>
    
    <content type="html"><![CDATA[<p>作为打脸专业户，上一篇文章我刚说换回了wordpress，结果立刻又跳到了Hexo。</p><p>怎么回事呢？因为站点用的是前些年淘到的超便宜万网云虚机，一年才50多块钱。在使用静态博客时，完全没有任何问题，轻松应对各种压力。</p><p>但是换到wordpress以后，问题出来了，不知道是高版本wp还是别的插件问题，仅仅切换7天，服务器被阿里云关闭2次——因为资源使用超标了。</p><p>这就尴尬了，是不是？</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/emotion/noface2.jpg"></p><p>所以呢，在第二次被关闭后，毅然决定换回hexo。但是我并没有忘记当初为什么要抛弃hexo，所以以下的问题必须要一一解决才行。</p><h1 id="在线编辑"><a href="#在线编辑" class="headerlink" title="在线编辑"></a>在线编辑</h1><p>这个应该是要分两个步骤，分别是：1、可以脱离webstorm一类的ide，使用在线编辑器写作；2、可以脱离对pc的依赖，使用任意设备随时写作。目前实现了第1个目标，很简单，几行命令解决问题。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ npm install --save hexo-admin</span><br><span class="line">$ hexo s</span><br><span class="line"><span class="comment">#接着就可以摆脱编辑器的束缚，直接访问 localhost:4000/admin 来进行文章编辑了（一些特殊的处理，比如Mathjax之类的还是要靠自己的编辑器，或者可以使用我在博客顶部推荐的https://stackedit.io/editor#，神一般的md编辑器）</span></span><br></pre></td></tr></table></figure><h1 id="评论"><a href="#评论" class="headerlink" title="评论"></a>评论</h1><p>这个其实才是想切到wordpress最根本的原因，由于静态博客无法记录动态数据，因此一开始就完全依赖于第三方社会化评论。然而第三方评论的陆续退出，使得以前辛苦积攒的评论化为泡影。</p><p>后来一度使用了gitment。说实话，并没有什么不好用的。但是访问博客的人未必拥有github账号，而github的可访问性在一段时间内也让我充满了疑问。</p><p>得益于互联网技术和开源库的发展，Hexo也有更加适合国内环境的评论系统出现。比如我目前所使用的valine。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/blog20200111230343.png" alt="valine"></p><p>配置起来非常容易，请参考这篇博客：<a href="https://ink-bottle.github.io/2019/03/03/hexo-%E5%8D%9A%E5%AE%A2%E5%A2%9E%E5%8A%A0Valine-gitalk%E8%AF%84%E8%AE%BA%E6%8F%92%E4%BB%B6/">hexo 博客增加Valine&#x2F;gitalk评论插件</a></p><h1 id="图床"><a href="#图床" class="headerlink" title="图床"></a>图床</h1><p>这是一个附加题目。人毕竟都希望能缩短做任何事情的时间，以便有时间拓宽或者延申到自己希望的领域中去。如果需要打开一个网页或者特定的管理工具，还要选择目标地址，选择图片上传，未免也太耽搁时间了。<code>hexo-admin</code> 其实已经做到了这点，只是还不够多。它只能快捷的将图片放置到<code>/img</code>文件夹中，无法实现上传CDN。</p><p>目前也还没有找到完美的解决方案，但是<code>PicGo</code>这个项目已经能比较方便的与<code>hexo-admin</code>配合使用了。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/blog20200111225458.png" alt="PicGo"></p><p>访问这个网址即可：<a href="https://github.com/Molunerfinn/PicGo">https://github.com/Molunerfinn/PicGo</a></p><p>先这样，以后有时间研究新的配置方案再更新。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;作为打脸专业户，上一篇文章我刚说换回了wordpress，结果立刻又跳到了Hexo。&lt;/p&gt;
&lt;p&gt;怎么回事呢？因为站点用的是前些年淘到的超便宜万网云虚机，一年才50多块钱。在使用静态博客时，完全没有任何问题，轻松应对各种压力。&lt;/p&gt;
&lt;p&gt;但是换到wordpress以后</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="图床" scheme="https://www.gsgundam.com/tags/%E5%9B%BE%E5%BA%8A/"/>
    
    <category term="wordpress" scheme="https://www.gsgundam.com/tags/wordpress/"/>
    
    <category term="评论" scheme="https://www.gsgundam.com/tags/%E8%AF%84%E8%AE%BA/"/>
    
    <category term="cdn" scheme="https://www.gsgundam.com/tags/cdn/"/>
    
    <category term="在线编辑" scheme="https://www.gsgundam.com/tags/%E5%9C%A8%E7%BA%BF%E7%BC%96%E8%BE%91/"/>
    
  </entry>
  
  <entry>
    <title>Hexo迁移到Wordpress</title>
    <link href="https://www.gsgundam.com/archive/2020-01-03-change-hexo-to-wordpress/"/>
    <id>https://www.gsgundam.com/archive/2020-01-03-change-hexo-to-wordpress/</id>
    <published>2020-01-03T06:00:00.000Z</published>
    <updated>2022-11-28T05:39:21.553Z</updated>
    
    <content type="html"><![CDATA[<p>时隔多年，终于还是接受不了Hexo的各种缺点，例如必须打开能支持编译的设备写博客，必须要借助一个评论工具(经历了社会化评论纷纷倒下的人都懂那种痛)，等等。其实回想一下，当初从WP转到Hexo的目的是为了让访问速度更快，更容易做seo。但是在当下这个服务器越来越便宜，内容越来越重要的时代，老的思路不那么合适了。</p><p>这次转回WP还是花了不少功夫，主要是在导出文章上。</p><p>长话短说，看看导出导入文章都需要做些什么。</p><p>1、从Hexo导出feed。首先在站点的_config.yml配置文件中找到feed节点，确保配置如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#feed</span></span><br><span class="line">feed:</span><br><span class="line">  <span class="built_in">type</span>: atom</span><br><span class="line">  path: atom.xml</span><br><span class="line">  <span class="built_in">limit</span>: <span class="literal">false</span></span><br></pre></td></tr></table></figure><p>2、使用 hexo g 或者 hexo server 生成atom.xml文件。</p><p>3、在搭建好的WP中安装 feedwordpress 插件，并进行同步操作。（完全不用担心插件兼容性，跟5.x版本的WP完美兼容）</p><p>导入后的文章会比较混乱，主要体现在以下几个方面：</p><p>1、原来的标签都被当做分类了。这个时候只能耐心的删除所有分类，并重新添加。然后加上分类标签。</p><p>2、语义式的文章链接全部丢失，需要重新给所有文章修改别名。</p><p>3、代码高亮需要重新配置，WP默认code标签的解析不是好不好看的问题，是根本不能看。逐篇文章检查……要死要死……</p><p>轻易确实不打算再换环境了，年纪一把，折腾不起了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;时隔多年，终于还是接受不了Hexo的各种缺点，例如必须打开能支持编译的设备写博客，必须要借助一个评论工具(经历了社会化评论纷纷倒下的人都懂那种痛)，等等。其实回想一下，当初从WP转到Hexo的目的是为了让访问速度更快，更容易做seo。但是在当下这个服务器越来越便宜，内容越来</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="wordpress" scheme="https://www.gsgundam.com/tags/wordpress/"/>
    
    <category term="code" scheme="https://www.gsgundam.com/tags/code/"/>
    
    <category term="feed" scheme="https://www.gsgundam.com/tags/feed/"/>
    
  </entry>
  
  <entry>
    <title>不使用AndroidStudio直接修改targetSDKVersion</title>
    <link href="https://www.gsgundam.com/archive/2018-11-03-change-targetsdkversion-without-android-studio/"/>
    <id>https://www.gsgundam.com/archive/2018-11-03-change-targetsdkversion-without-android-studio/</id>
    <published>2018-11-03T06:00:00.000Z</published>
    <updated>2022-11-28T05:39:21.553Z</updated>
    
    <content type="html"><![CDATA[<p>又有非常长的时间没有更新博客了，应该很多人都以为挂了吧……最近有非常多的变动，似乎都在往好的方向发展。可喜可贺呀！</p><p>近来HybridApp需要更新的情况下，我都尽量在往DCloud迁移了，毕竟人家是团队维护的框架，稳定性更有保证。但是也发现了一个很蛋疼的地方，Dcloud不支持修改targetSDKVersion，但是客户的需求最高啊。总不能为了修改一个targetSDKVersion，专门去维护一个android studio版本吧。</p><p>谷歌了一下，果然很快找到方法，原文在此：<a href="http://www.saycoding.cn/portal/article/detail/1526895431139400">http://www.saycoding.cn/portal/article/detail/1526895431139400</a></p><p>流程如下：</p><p>#1、下载 <code>apktool</code></p><p><a href="https://ibotpeaches.github.io/Apktool/install/">https://ibotpeaches.github.io/Apktool/install/</a></p><p>下载前两个 apktool.bat 和 apktool.jar</p><p>将两个文件放到一个目录内命名为 <code>apktool</code></p><p>#2、解压apk</p><p>将 <code>target.apk</code> 放到文件夹 <code>apktool</code> 内</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> apktool</span><br><span class="line">apktool d target.apk</span><br></pre></td></tr></table></figure><p>执行成功后 目录下生成 target 包 找到 apktool.yml 打开文件</p><p>找到</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sdkInfo:</span><br><span class="line">  minSdkVersion: <span class="string">&#x27;9&#x27;</span></span><br><span class="line">  targetSdkVersion: <span class="string">&#x27;20&#x27;</span></span><br></pre></td></tr></table></figure><p>修改 <code>targetSdkVersion</code> 为 <code>26</code></p><p>#3、重新打包</p><p>生成文件：</p><p><code>apktool b target -o new_target.apk</code></p><p>完事，然后该签名签名，改加密加密就好了。不知道有没有后患，测试起来没什么问题，先解决当下的困难吧。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;又有非常长的时间没有更新博客了，应该很多人都以为挂了吧……最近有非常多的变动，似乎都在往好的方向发展。可喜可贺呀！&lt;/p&gt;
&lt;p&gt;近来HybridApp需要更新的情况下，我都尽量在往DCloud迁移了，毕竟人家是团队维护的框架，稳定性更有保证。但是也发现了一个很蛋疼的地方，</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="android" scheme="https://www.gsgundam.com/tags/android/"/>
    
    <category term="studio" scheme="https://www.gsgundam.com/tags/studio/"/>
    
    <category term="targetSDKVersion" scheme="https://www.gsgundam.com/tags/targetSDKVersion/"/>
    
  </entry>
  
  <entry>
    <title>npm WARN react-redux@5.0.5 requires a peer of redux@^2.0.0 || ^3.0.0 but none was installed解决办法</title>
    <link href="https://www.gsgundam.com/archive/2017-06-07-react-redux-none-was-installed/"/>
    <id>https://www.gsgundam.com/archive/2017-06-07-react-redux-none-was-installed/</id>
    <published>2017-06-07T03:00:20.000Z</published>
    <updated>2022-11-28T05:42:00.322Z</updated>
    
    <content type="html"><![CDATA[<p>最近继续在研究react-native，不过时间相当少，进度也非常慢。今天在安装react-redux的时候碰到一个问题，如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">+-- react-redux@5.0.5</span><br><span class="line">`-- UNMET DEPENDENCY redux@^3.5.2</span><br><span class="line"></span><br><span class="line">npm WARN react-redux@5.0.5 requires a peer of redux@^2.0.0 || ^3.0.0 but none was installed.</span><br></pre></td></tr></table></figure><p>很奇怪，因为感觉这些东西都相对成熟了，怎么还会出现依赖问题呢？</p><p>Google了一下，解决方法在此：<a href="https://github.com/poetic/meteor-reacterminator/issues/33">https://github.com/poetic/meteor-reacterminator/issues/33</a></p><p>大概描述一下：</p><p>1、打开package.json，在依赖部分写入</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&quot;redux&quot;</span>: <span class="string">&quot;^3.5.2&quot;</span></span><br></pre></td></tr></table></figure><p>2、命令行进入项目，输入下面命令单独安装redux</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$npm</span> install --save redux</span><br></pre></td></tr></table></figure><p>3、再次安装react-redux</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$npm</span> install --save react-redux</span><br></pre></td></tr></table></figure><p>完工！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近继续在研究react-native，不过时间相当少，进度也非常慢。今天在安装react-redux的时候碰到一个问题，如下：&lt;/p&gt;
&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;s</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="react" scheme="https://www.gsgundam.com/tags/react/"/>
    
    <category term="native" scheme="https://www.gsgundam.com/tags/native/"/>
    
    <category term="redux" scheme="https://www.gsgundam.com/tags/redux/"/>
    
    <category term="依赖" scheme="https://www.gsgundam.com/tags/%E4%BE%9D%E8%B5%96/"/>
    
  </entry>
  
  <entry>
    <title>更快的Android SDK在线更新镜像服务器</title>
    <link href="https://www.gsgundam.com/archive/2016-10-14-better-android-sdk-mirror/"/>
    <id>https://www.gsgundam.com/archive/2016-10-14-better-android-sdk-mirror/</id>
    <published>2016-10-14T04:50:20.000Z</published>
    <updated>2017-06-07T02:52:17.751Z</updated>
    
    <content type="html"><![CDATA[<p><strong><font color=red>腾讯Bugly镜像已经关闭了，以下内容已作废</font></strong></p><p>有点兴趣研究一下react-native，于是需要更新android sdk。但是这次用东软的代理地址更新相当慢，而且总出错。索性上网打算再找一个靠谱一些的。</p><p>度娘的姿势你懂的，翻来覆去就那么几个答案，幸好还是发现了一个与众不同的。</p><p><strong>腾讯Bugly镜像</strong></p><p>访问地址：<a href="http://android-mirror.bugly.qq.com:8080/include/usage.html">http://android-mirror.bugly.qq.com:8080/include/usage.html</a></p><p>使用方法都懂的：</p><p>1、打开Android SDK Manager，点击Tools -&gt; Options…。在代理服务器和端口处分别填入“android-mirror.bugly.qq.com”和“8080”。记得要勾选“Force https:&#x2F;&#x2F;… sources to be fetched using http:&#x2F;&#x2F;…” </p><p><img src="http://android-mirror.bugly.qq.com:8080/include/images/proxy.png" alt="Options..."></p><p>2、检查一下代理是否正常，点击Package -&gt; Reload。</p><p><img src="http://android-mirror.bugly.qq.com:8080/include/images/7_reload_check.png" alt="Reload"></p><p>OK! Have fun~</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;strong&gt;&lt;font color=red&gt;腾讯Bugly镜像已经关闭了，以下内容已作废&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;有点兴趣研究一下react-native，于是需要更新android sdk。但是这次用东软的代理地址更新相当慢，而且总出错。索性上网</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="android" scheme="https://www.gsgundam.com/tags/android/"/>
    
    <category term="sdk" scheme="https://www.gsgundam.com/tags/sdk/"/>
    
    <category term="update" scheme="https://www.gsgundam.com/tags/update/"/>
    
    <category term="更新" scheme="https://www.gsgundam.com/tags/%E6%9B%B4%E6%96%B0/"/>
    
    <category term="镜像" scheme="https://www.gsgundam.com/tags/%E9%95%9C%E5%83%8F/"/>
    
  </entry>
  
  <entry>
    <title>Windows下在文件夹中打开命令行</title>
    <link href="https://www.gsgundam.com/archive/2016-10-10-open-cmd-in-explorer-in-windows/"/>
    <id>https://www.gsgundam.com/archive/2016-10-10-open-cmd-in-explorer-in-windows/</id>
    <published>2016-10-10T08:50:20.000Z</published>
    <updated>2018-11-07T05:46:52.026Z</updated>
    
    <content type="html"><![CDATA[<p>很久没有更新博客了，说懒也是，但是更多的是绝大部分精力都耗在了工作上，以至于陪家人的时间都非常少。</p><p>现在有所变动了，时间上也宽裕了很多，陪陪家人之余，也再多记录点东西。</p><p>这两天抽空又折腾了一下博客，发现nodejs，hexo各种更新，原来没什么问题的博客也各种出错。索性删了几篇，懒得折腾。</p><p>在操作命令行时，突然觉得一直<code>Win+R</code>，然后cd到需要的目录去是一件很sb的事情。在ubuntu和osx下都可以很方便的在文件夹中打开命令行工具，立马想看一看windows行不行。于是打开博客目录，点了一下鼠标右键。</p><p><img src="http://images.cnitblog.com/i/391736/201407/261440051973227.png" alt="右键菜单"></p><p>呵呵，什么都没有。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/emotion/noface2.jpg"></p><p>好吧，我还是去度娘了一下，居然答案很少，没有人转载吗？最后在 <a href="http://www.cnblogs.com/taoweiji/p/3870108.html">这个博客</a> 找到了答案。</p><p>只需要在点击鼠标右键时，按住Shift，就会出现“在此处打开命令窗口（W）”的选项，真是方便多了！</p><p><img src="http://images.cnitblog.com/i/391736/201407/261440383859787.png" alt="Shift右键菜单"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;很久没有更新博客了，说懒也是，但是更多的是绝大部分精力都耗在了工作上，以至于陪家人的时间都非常少。&lt;/p&gt;
&lt;p&gt;现在有所变动了，时间上也宽裕了很多，陪陪家人之余，也再多记录点东西。&lt;/p&gt;
&lt;p&gt;这两天抽空又折腾了一下博客，发现nodejs，hexo各种更新，原来没什么问</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="windows" scheme="https://www.gsgundam.com/tags/windows/"/>
    
    <category term="explorer" scheme="https://www.gsgundam.com/tags/explorer/"/>
    
    <category term="cmd" scheme="https://www.gsgundam.com/tags/cmd/"/>
    
    <category term="文件夹" scheme="https://www.gsgundam.com/tags/%E6%96%87%E4%BB%B6%E5%A4%B9/"/>
    
    <category term="命令行" scheme="https://www.gsgundam.com/tags/%E5%91%BD%E4%BB%A4%E8%A1%8C/"/>
    
  </entry>
  
  <entry>
    <title>TortoiseGit（小乌龟Git）保存密码</title>
    <link href="https://www.gsgundam.com/archive/2015-07-11-tortoise-git-save-password/"/>
    <id>https://www.gsgundam.com/archive/2015-07-11-tortoise-git-save-password/</id>
    <published>2015-07-11T03:31:20.000Z</published>
    <updated>2015-07-11T03:02:19.157Z</updated>
    
    <content type="html"><![CDATA[<p>做项目肯定需要版本管理，版本控制方面目前主流是svn和git，git在本地管理上有svn无法比拟的优势，所以越来越多的开源项目甚至私有项目都开始使用git作为版本控制的工具。</p><p>但是git有个很烦的问题，没有在明显的位置提示可以保存密码，所以一直以来都忍受着不断输密码的痛苦。</p><p>昨天Fenix跟我说他保存上密码了，但是不记得怎么做的，于是出于学(xian)习(mu)新(ji)知(du)识(hen)的积极心态，我自己也上度娘走了一圈，找到了如下方法</p><p>方法一：</p><p>设置 -&gt; git 编辑本地 .git&#x2F;config 增加</p><pre><code>[credential]       helper = store    </code></pre><p>保存，输入一次密码后第二次就会记住密码了</p><p>方法二：</p><pre><code>Windows中添加一个HOME环境变量，值为%USERPROFILE%在“开始&gt;运行”中打开%Home%，新建一个名为“_netrc”的文件用记事本打开_netrc文件，输入Git服务器名、用户名、密码，并保存：machine github.com      #git服务器名称login user         #git帐号passwordpwd  #git密码</code></pre><p>在windows上建_netrc</p><pre><code>copy con _netrc #创建_netrc文件#依次输入以下3行：machine github.com   #git服务器名称login username       #git帐号password password    #git密码</code></pre><p>在最后一行后输入ctrl+z，文件会自动保存并退出</p><p>再次在git上提交时就不用重复输入用户名密码了</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;做项目肯定需要版本管理，版本控制方面目前主流是svn和git，git在本地管理上有svn无法比拟的优势，所以越来越多的开源项目甚至私有项目都开始使用git作为版本控制的工具。&lt;/p&gt;
&lt;p&gt;但是git有个很烦的问题，没有在明显的位置提示可以保存密码，所以一直以来都忍受着不断</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="TortoiseGit" scheme="https://www.gsgundam.com/tags/TortoiseGit/"/>
    
    <category term="Tortoise" scheme="https://www.gsgundam.com/tags/Tortoise/"/>
    
    <category term="Git" scheme="https://www.gsgundam.com/tags/Git/"/>
    
    <category term="小乌龟" scheme="https://www.gsgundam.com/tags/%E5%B0%8F%E4%B9%8C%E9%BE%9F/"/>
    
    <category term="保存密码" scheme="https://www.gsgundam.com/tags/%E4%BF%9D%E5%AD%98%E5%AF%86%E7%A0%81/"/>
    
    <category term="版本控制" scheme="https://www.gsgundam.com/tags/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/"/>
    
  </entry>
  
  <entry>
    <title>Xcode 编译按钮灰色 不能点击</title>
    <link href="https://www.gsgundam.com/archive/2015-06-19-xcode-build-button-disabled/"/>
    <id>https://www.gsgundam.com/archive/2015-06-19-xcode-build-button-disabled/</id>
    <published>2015-06-19T14:31:20.000Z</published>
    <updated>2015-06-19T03:54:15.796Z</updated>
    
    <content type="html"><![CDATA[<p>项目需要打包iOS版本，但是导出到Xcode以后，尴尬的发现居然没有办法编译项目了。<code>Build</code>、<code>Clean</code>等等神马按钮都是灰色的，不能点击。</p><p>研究了一会，没找到问题的症结所在，所以直接谷哥了，得到的解决办法很简单：</p><ol><li><p>点击菜单上的<code>Project</code></p></li><li><p>选择<code>New Schemes…</code></p></li><li><p>直接使用默认值</p></li></ol><p>done了。</p><p>估计在导出Xcode项目的时候，程序还在使用老的配置文件。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;项目需要打包iOS版本，但是导出到Xcode以后，尴尬的发现居然没有办法编译项目了。&lt;code&gt;Build&lt;/code&gt;、&lt;code&gt;Clean&lt;/code&gt;等等神马按钮都是灰色的，不能点击。&lt;/p&gt;
&lt;p&gt;研究了一会，没找到问题的症结所在，所以直接谷哥了，得到的解决办法很</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="unity" scheme="https://www.gsgundam.com/tags/unity/"/>
    
    <category term="ionic" scheme="https://www.gsgundam.com/tags/ionic/"/>
    
    <category term="Xcode" scheme="https://www.gsgundam.com/tags/Xcode/"/>
    
    <category term="build" scheme="https://www.gsgundam.com/tags/build/"/>
    
    <category term="clean" scheme="https://www.gsgundam.com/tags/clean/"/>
    
    <category term="disabled" scheme="https://www.gsgundam.com/tags/disabled/"/>
    
    <category term="gray" scheme="https://www.gsgundam.com/tags/gray/"/>
    
  </entry>
  
  <entry>
    <title>VBox修改动态虚拟硬盘大小</title>
    <link href="https://www.gsgundam.com/archive/2015-05-18-vbox-resize-dymanic-hdd/"/>
    <id>https://www.gsgundam.com/archive/2015-05-18-vbox-resize-dymanic-hdd/</id>
    <published>2015-05-17T14:31:20.000Z</published>
    <updated>2022-11-29T03:29:32.955Z</updated>
    
    <content type="html"><![CDATA[<p>为了测试32位的Unity，使用了虚拟机，但是原来硬盘大小为10G，肯定不够用了，需要把硬盘增加到60G。</p><p>度娘了一下，步骤蛮简单的：</p><p>#第一步：列出uuid</p><p>运行cmd，执行命令</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">VBoxManage list hdds</span><br></pre></td></tr></table></figure><p>得到uuid。 </p><p>#第二步：修改磁盘大小</p><p>例如需要修改为60G：（修改大小前，要关闭所要修改的虚拟机）</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">VBoxManage modifyhd  虚拟机的uuid  --resize 60000</span><br></pre></td></tr></table></figure><p>本方法只支持VDI格式</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;为了测试32位的Unity，使用了虚拟机，但是原来硬盘大小为10G，肯定不够用了，需要把硬盘增加到60G。&lt;/p&gt;
&lt;p&gt;度娘了一下，步骤蛮简单的：&lt;/p&gt;
&lt;p&gt;#第一步：列出uuid&lt;/p&gt;
&lt;p&gt;运行cmd，执行命令&lt;/p&gt;
&lt;figure class=&quot;highli</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="硬盘" scheme="https://www.gsgundam.com/tags/%E7%A1%AC%E7%9B%98/"/>
    
    <category term="vbox" scheme="https://www.gsgundam.com/tags/vbox/"/>
    
    <category term="virtualbox" scheme="https://www.gsgundam.com/tags/virtualbox/"/>
    
    <category term="修改大小" scheme="https://www.gsgundam.com/tags/%E4%BF%AE%E6%94%B9%E5%A4%A7%E5%B0%8F/"/>
    
  </entry>
  
  <entry>
    <title>使用.gitignore管理需要忽略的Unity项目文件</title>
    <link href="https://www.gsgundam.com/archive/2015-04-27-gitignore-for-unity/"/>
    <id>https://www.gsgundam.com/archive/2015-04-27-gitignore-for-unity/</id>
    <published>2015-04-27T14:31:20.000Z</published>
    <updated>2022-11-29T03:29:32.955Z</updated>
    
    <content type="html"><![CDATA[<p>新项目较大，需要多人同时使用Git管理，因此版本管理需要规范化，所以配置<code>.gitignore</code>文件成了必然。</p><p>项目目前只需要将<code>Assets</code>文件夹纳入版本控制即可（后期可能也会将<code>ProjectSettings</code>纳入管理）。</p><p>如果还需要将<code>ProjectSettins</code>纳入管理，在编写<code>.gitignore</code>文件前，可以进行以下几步，将设置以文本形式存储以利于版本控制（有利有弊，自己权衡）：</p><p>1.在 <code>Edit-&gt;Project Settings-&gt;Editor-&gt;Version Control Mode</code> 中选择 <code>Visible Meta files</code>。</p><p>2.在 <code>Edit-&gt;Project Settings-&gt;Editor-&gt;Asset Serialization Mode</code> 中选择 <code>Force Text</code>。</p><p>3.保存场景和项目。</p><p>下面是一份参考的<code>.gitignore</code>文件：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">=============== </span><br><span class="line">Unity generated</span><br><span class="line">===============</span><br><span class="line">#Assets/</span><br><span class="line">ProjectSettings/</span><br><span class="line">Temp/</span><br><span class="line">Library/</span><br><span class="line"></span><br><span class="line">=====================================</span><br><span class="line">Visual Studio / MonoDevelop generated</span><br><span class="line">=====================================</span><br><span class="line">ExportedObj/</span><br><span class="line">obj/</span><br><span class="line">*.svd</span><br><span class="line">*.userprefs</span><br><span class="line">/*.csproj</span><br><span class="line">*.pidb</span><br><span class="line">*.suo</span><br><span class="line">/*.sln</span><br><span class="line">*.user</span><br><span class="line">*.unityproj</span><br><span class="line">*.booproj</span><br><span class="line"></span><br><span class="line">============</span><br><span class="line">OS generated</span><br><span class="line">============</span><br><span class="line">.DS_Store</span><br><span class="line">.DS_Store?</span><br><span class="line">._*</span><br><span class="line">.Spotlight-V100</span><br><span class="line">.Trashes</span><br><span class="line">ehthumbs.db</span><br><span class="line">Thumbs.db</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;新项目较大，需要多人同时使用Git管理，因此版本管理需要规范化，所以配置&lt;code&gt;.gitignore&lt;/code&gt;文件成了必然。&lt;/p&gt;
&lt;p&gt;项目目前只需要将&lt;code&gt;Assets&lt;/code&gt;文件夹纳入版本控制即可（后期可能也会将&lt;code&gt;ProjectSett</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="git" scheme="https://www.gsgundam.com/tags/git/"/>
    
    <category term="版本管理" scheme="https://www.gsgundam.com/tags/%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86/"/>
    
    <category term="unity" scheme="https://www.gsgundam.com/tags/unity/"/>
    
    <category term="gitignore" scheme="https://www.gsgundam.com/tags/gitignore/"/>
    
  </entry>
  
  <entry>
    <title>AngularJS ng-repeat 带来的性能损耗</title>
    <link href="https://www.gsgundam.com/archive/2015-03-14-angular-ng-repeat-loss-of-performance/"/>
    <id>https://www.gsgundam.com/archive/2015-03-14-angular-ng-repeat-loss-of-performance/</id>
    <published>2015-03-14T02:31:20.000Z</published>
    <updated>2015-05-18T03:10:17.475Z</updated>
    
    <content type="html"><![CDATA[<p>做新版信用卡计算器的时候用到了APICloud，本来按说应该随大家的方向，使用jQuery或者Zepto来作为js库。但是由于习惯了AngularJS的绑定机制，觉得前两者写出来的代码相当啰嗦。于是决心把适合SPA的AngularJS用到MPA的APICloud中去。</p><p>折腾了好几天，终于用上了，但是也有非常恶心的事情，那就是使用ng-repeat造成的卡顿。</p><p>AngularJS的ng-repeat一直都让我感觉非常方便，可以很轻松的遍历数组生成Dom元素。但是，少量的绑定增加就会带来更大的多的$digest循环开销，从指令方面来说，创造一个可能的静态渲染组件，并在真正需要外都独立在Angular监控体系外是相当有用的，应该保持对隐式创建的watch对象的留心。比如在想好应用结构、coding前关心一下自己可以减少多少个watchers。</p><p>也许最终的计算器会脱离AngularJS框架，毕竟它还是适用于SPA，而且对安卓机还是有些挑剔。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;做新版信用卡计算器的时候用到了APICloud，本来按说应该随大家的方向，使用jQuery或者Zepto来作为js库。但是由于习惯了AngularJS的绑定机制，觉得前两者写出来的代码相当啰嗦。于是决心把适合SPA的AngularJS用到MPA的APICloud中去。&lt;/p</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="angular" scheme="https://www.gsgundam.com/tags/angular/"/>
    
    <category term="前端开发" scheme="https://www.gsgundam.com/tags/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    <category term="ng-repeat" scheme="https://www.gsgundam.com/tags/ng-repeat/"/>
    
    <category term="性能" scheme="https://www.gsgundam.com/tags/%E6%80%A7%E8%83%BD/"/>
    
  </entry>
  
  <entry>
    <title>Web开发者技能树</title>
    <link href="https://www.gsgundam.com/archive/2015-03-03-web-developer-skill-tree/"/>
    <id>https://www.gsgundam.com/archive/2015-03-03-web-developer-skill-tree/</id>
    <published>2015-03-03T15:50:20.000Z</published>
    <updated>2018-11-07T05:46:52.081Z</updated>
    
    <content type="html"><![CDATA[<p>王哥前段时间发了个好玩的东西，<a href="http://skill.phodal.com/">Web Developer 技能树</a>。</p><p>玩了一下，居然点亮了大部分，原来我已经这么腻害了么，嚯嚯嚯嚯~</p><p>我的链接：<a href="http://skill.phodal.com/#_a2b2cde3fh3i2jkmr2s2tuvwxy2_1_GSGundam">http://skill.phodal.com/#_a2b2cde3fh3i2jkmr2s2tuvwxy2_1_GSGundam</a></p><iframe src="http://skill.phodal.com/#_a2b2cde3fh3i2jkmr2s2tuvwxy2_1_GSGundam"></iframe><p>话说有Github帐号的童鞋应该填入自己的用户名哦，可以直接抓取头像的。</p><p>慢，难，险，都不是问题，只要还在前进。继续学习！</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/emotion/tomybow.jpg" alt="知识快到碗里来"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;王哥前段时间发了个好玩的东西，&lt;a href=&quot;http://skill.phodal.com/&quot;&gt;Web Developer 技能树&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;玩了一下，居然点亮了大部分，原来我已经这么腻害了么，嚯嚯嚯嚯~&lt;/p&gt;
&lt;p&gt;我的链接：&lt;a href=&quot;http</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="web" scheme="https://www.gsgundam.com/tags/web/"/>
    
    <category term="网页开发" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E9%A1%B5%E5%BC%80%E5%8F%91/"/>
    
    <category term="技能树" scheme="https://www.gsgundam.com/tags/%E6%8A%80%E8%83%BD%E6%A0%91/"/>
    
    <category term="前端开发" scheme="https://www.gsgundam.com/tags/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>Swiftype 专业站内搜索工具</title>
    <link href="https://www.gsgundam.com/archive/2015-03-03-swiftype-professional-search-tool/"/>
    <id>https://www.gsgundam.com/archive/2015-03-03-swiftype-professional-search-tool/</id>
    <published>2015-03-03T14:50:20.000Z</published>
    <updated>2022-11-29T03:29:32.955Z</updated>
    
    <content type="html"><![CDATA[<p>开始使用Hexo以后就一直为站内搜索头疼，毕竟静态博客要自建搜索引擎就是吃饱了撑的，肯定需要用到第三方搜索引擎。</p><p>Google就不用想了，原因大家都懂。百度站内搜索一直没能成功实现，原因不明，也懒得找明，只有指定域的方法可行。</p><p>一早听说了Swfitype这枚神器，但是始终没腾出来时间研究。随便百度时无意找到了这篇文章（<a href="http://www.jerryfu.net/post/search-engine-for-hexo-with-swiftype.html">http://www.jerryfu.net/post/search-engine-for-hexo-with-swiftype.html</a>），才好好研究了一下。</p><p>原文引导作用很好，就是有若干处错误，所以在下干脆就重新整理了(图均借用了原文)。</p><p>虽然本文是基于自己的主题<a href="https://github.com/gsgundam/gacman">Gacman</a>（当然，也完全适用于<a href="https://github.com/wuchong/jacman">Jacman</a>和<a href="https://github.com/A-limon/pacman">Pacman</a>），但是其实各个主题都大同小异。先展示一下效果吧：<a href="http://gsgundam.com/search/index.html#stq=%E8%A3%85%E7%94%B2%E7%BA%B5%E9%98%9F&stp=1">我要搜索“装甲纵队”</a></p><p>首先前往Swiftype的官网<a href="https://swiftype.com/">https://swiftype.com</a>注册一个账号，然后根据指引建立好自己网站对应的索引。</p><p>然后切换到install面板，如下图：</p><p><img src="http://www.jerryfu.net/img/search-engine-for-hexo-with-swiftype/1.jpg" alt="install 面板"></p><p>进入安装面板后需要先配置一下自己的站点，按照下图的配置来操作：</p><p><img src="http://www.jerryfu.net/img/search-engine-for-hexo-with-swiftype/2.jpg" alt="站点配置"></p><p>其中的网址注意把<a href="http://www.jerryfu.net部分替换成自己的网址./">www.jerryfu.net部分替换成自己的网址。</a></p><p>然后点击配置界面左侧的“SWIFTYPE INSTALL CODE”来获取所需要的js代码，获取类似下边的代码：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">(<span class="keyword">function</span>(<span class="params">w,d,t,u,n,s,e</span>)&#123;w[<span class="string">&#x27;SwiftypeObject&#x27;</span>]=n;w[n]=w[n]||<span class="keyword">function</span>(<span class="params"></span>)&#123;</span></span><br><span class="line"><span class="language-javascript">(w[n].<span class="property">q</span>=w[n].<span class="property">q</span>||[]).<span class="title function_">push</span>(<span class="variable language_">arguments</span>);&#125;;s=d.<span class="title function_">createElement</span>(t);</span></span><br><span class="line"><span class="language-javascript">e=d.<span class="title function_">getElementsByTagName</span>(t)[<span class="number">0</span>];s.<span class="property">async</span>=<span class="number">1</span>;s.<span class="property">src</span>=u;e.<span class="property">parentNode</span>.<span class="title function_">insertBefore</span>(s,e);</span></span><br><span class="line"><span class="language-javascript">&#125;)(<span class="variable language_">window</span>,<span class="variable language_">document</span>,<span class="string">&#x27;script&#x27;</span>,<span class="string">&#x27;//s.swiftypecdn.com/install/v1/st.js&#x27;</span>,<span class="string">&#x27;_st&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript"><span class="title function_">_st</span>(<span class="string">&#x27;install&#x27;</span>,<span class="string">&#x27;your install code&#x27;</span>); <span class="comment">//每个网址的install code都不同</span></span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>直接把这段代码拷贝到主题目录中layout_partial的footer.js或者header.js中，以保证每个页面都运行了Swiftype代码。可以考虑加上判断条件，比如下文的<code>if(theme.swiftype.enable)</code>。</p><p>在主题下的_config.yml文件中添加如下代码（注意不要打断其它配置，可以考虑加在自定义搜索附近或干脆文件最后），增加一个swiftype的配置选项：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">swiftype:</span><br><span class="line">  enable: true</span><br></pre></td></tr></table></figure><p>然后到Hexo根目录中的source目录下建立一个search文件夹，再在其下建立一个index.md，index.md中写入如下代码：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">layout: search</span><br><span class="line">title: search</span><br><span class="line">----</span><br></pre></td></tr></table></figure><p>然后到主题目录中layout_partial目录下打开header.ejs，在搜索模块的各条件之间添加一个条件（这里的class样式是Gacman特定的，各个主题都应该用自己的）：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&lt;% &#125; else if(theme.swiftype.enable)&#123; %&gt;</span><br><span class="line">&lt;form class=&quot;search&quot; action=&quot;&lt;%- config.root %&gt;search/index.html&quot; method=&quot;get&quot; accept-charset=&quot;utf-8&quot;&gt;</span><br><span class="line">    &lt;label&gt;Search&lt;/label&gt;</span><br><span class="line">    &lt;input type=&quot;text&quot; id=&quot;st-search-input searchbox&quot; class=&quot;text-input&quot; placeholder=&quot;&quot; /&gt;</span><br><span class="line">    &lt;input type=&quot;submit&quot; class=&quot;search-btn&quot; value=&quot;SEARCH&quot;&gt;</span><br><span class="line">&lt;/form&gt;</span><br><span class="line">&lt;% &#125; else &#123; %&gt;</span><br></pre></td></tr></table></figure><p>还是layout_partial目录，打开search.ejs，同样是为Swiftype增加一个条件：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&lt;% &#125; else if(theme.swiftype.enable) &#123; %&gt;</span><br><span class="line">&lt;div class=&quot;container&quot;&gt;</span><br><span class="line">    &lt;div id=&quot;st-results-container&quot;&gt;正在加载搜索结果，请稍后...&lt;/div&gt;</span><br><span class="line">&lt;/div&gt;</span><br><span class="line">&lt;% &#125; %&gt;</span><br></pre></td></tr></table></figure><p>嗯，这样就完成了。<code>hexo g</code>，<code>hexo d</code>，all done~</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;开始使用Hexo以后就一直为站内搜索头疼，毕竟静态博客要自建搜索引擎就是吃饱了撑的，肯定需要用到第三方搜索引擎。&lt;/p&gt;
&lt;p&gt;Google就不用想了，原因大家都懂。百度站内搜索一直没能成功实现，原因不明，也懒得找明，只有指定域的方法可行。&lt;/p&gt;
&lt;p&gt;一早听说了Swfi</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="搜索" scheme="https://www.gsgundam.com/tags/%E6%90%9C%E7%B4%A2/"/>
    
    <category term="swiftype" scheme="https://www.gsgundam.com/tags/swiftype/"/>
    
    <category term="站内搜索" scheme="https://www.gsgundam.com/tags/%E7%AB%99%E5%86%85%E6%90%9C%E7%B4%A2/"/>
    
    <category term="search" scheme="https://www.gsgundam.com/tags/search/"/>
    
  </entry>
  
  <entry>
    <title>重要他人与人格发展阶段——发展心理学/儿童心理学</title>
    <link href="https://www.gsgundam.com/archive/2015-02-22-development-stage-and-important-person/"/>
    <id>https://www.gsgundam.com/archive/2015-02-22-development-stage-and-important-person/</id>
    <published>2015-02-22T05:21:20.000Z</published>
    <updated>2018-11-07T05:46:52.166Z</updated>
    
    <content type="html"><![CDATA[<p>小小宝已经11个月了，最近可能会有一些变动，担心给她造成一些不好的影响，于是回顾起老专业来了。</p><h1 id="重要他人"><a href="#重要他人" class="headerlink" title="重要他人"></a>重要他人</h1><p>最关心的就是<strong>重要他人</strong>部分。因为我和阿宝一直认为一个人的性格、个性就是来源于他的成长环境，而这很大程度上决定了他的命运。在这个人文环境中影响最大的就是重要他人。重要他人的缺失和错误影响，都将会是难以挽回的遗憾。</p><p>这部分找到了一篇<a href="http://www.d3syxx.com/ssss11/ShowArticle.asp?ArticleID=8352">非常不错的文章</a>，作了一些摘录和修改。</p><h2 id="学前阶段"><a href="#学前阶段" class="headerlink" title="学前阶段"></a>学前阶段</h2><p>在生命的最初几年，对个体产生重要影响的人物无疑就是我们的<strong>父母</strong>。一般来说，在个体离开家庭，上幼儿园和小学之前，父母对孩子的影响无可替代。可以说，在这个时候，也是做人家父母最舒服的时候，自身权威意识膨胀，孩子的崇拜也无限。</p><p>在埃里克森看来，人生发展的第一个阶段所要解决的任务，就是基本的信任感和不信任感，这个时间大致从出生到1岁之间。此时的我们，由于能力有限，主要的活动只有一项，吃奶，这也是我们当时快乐的源泉。而母亲则是满足我们需要的最重要的人物，我们的生存和幸福都依赖于她，我们与母亲的交流，是我们最初的人生经验。 </p><p>根据埃里克森的观点，如果我们遇到的是一位慈爱而敏感的母亲，她能敏锐地感知到我们的需要，在我们需要的时候能出现在我们身边。那么，我们就会形成对世界的一种满足和信任，觉得自己不是无助的，他人是可以信任的。即使母亲某一时候不在我的身边，我也不用担心，因为和她接触的经验告诉我，只要我需要她的时候，她是会按时出现的，我们不必焦虑和烦躁，安心睡我们的大觉就是了。一位慈爱而敏感的母亲，喂养出来的是一个对他人具有充分信任感的人。 </p><p>但是，如果我们遇到了一位粗心大意的母亲，有的时候她高兴了就让我们喝点奶，有的时候不高兴我们怎么哭都没有办法，我们就是在这种饥一顿饱一顿的环境中成长。如果这样，我们会觉得母亲的行为是不可预测的，这个世界也是不可信任的，母亲离开的时候我只有大声哭喊，因为我不知道她什么时候才回到我们身边。一位粗心大意的母亲，喂养出来的是一个对世界充满怀疑和不信任的人。</p><p><em>补充</em></p><p>这个时候需要的是<strong>一对理智、清醒、慈爱的父母</strong>。对于男孩来说，父亲教会他如何与同性相处、希望自己成为什么样的人，而母亲则教会他如何与异性相处、将要选择什么样的配偶。对于女孩来说则相反。孩子将体会到他人是否值得信任，人生是否无助。在这个时期，孩子也将初步形成对权威的态度。</p><h2 id="小学阶段"><a href="#小学阶段" class="headerlink" title="小学阶段"></a>小学阶段</h2><p>当孩子们飞速中成长为一名小学生的时候，父母的权威地位无疑被孩子的<strong>老师</strong>所替代。说起来，和大学、中学老师比较起来，不见得小学老师的水平是最高的，但论起在学生心目中的地位，却绝对非小学老师莫属。所有的小学生都有一句口头禅，“我老师说……”。</p><p>然而，可以肯定的是，影响大，责任也大。小学老师从当老师层面来讲是最牛的，说什么话学生都相信。但也正因为如此，小学老师麻烦事做多，因为小学生相信你，什么事情都告老师。小学老师是好当的，因为我们正赶上了孩子把老师作为最权威人物所推崇的时候；小学老师也是难当的，因为我们不小心的一句话，可能伤害的是学生的一辈子。</p><p><em>补充</em></p><p>这个时候需要的是<strong>至少一位负责、理性、有爱心的老师</strong>。权威是个什么样的概念？该怎样对待权威？怎样与权威进行交流？这个时期的老师将告诉孩子们。</p><h2 id="中学阶段"><a href="#中学阶段" class="headerlink" title="中学阶段"></a>中学阶段</h2><p>处在青春期的中学生们，在放弃了自己的母亲和老师为权威人物的时候，他们会更为重视自己的友谊，他们更为重视的是自己能否在同龄人群体中找到共鸣，能否得到<strong>朋友</strong>的认可。这个时候，对他们影响最大的人可能不是老师和父母，而是自己的铁哥们和铁姐们。也正是在这个时候，老师的权威容易遭受到挑战，他们在学生心目中的威信也很难建立起来。面对着一群处在“暴风骤雨”阶段的年轻人，作为他们的老师，也是很难有所作为的。如果青春期的孩子，再碰上更年期的家长或老师，那可真是充满了戏剧性的冲突。</p><p><em>补充</em></p><p>这个时候需要的是<strong>至少一位正直、善良、友好的亲密好友</strong>。他们之间的交流模式会教会他如何与同龄人相处，是否应该信任周围人等等。</p><h2 id="大学阶段"><a href="#大学阶段" class="headerlink" title="大学阶段"></a>大学阶段</h2><p>如果生命历程比较平稳，顺利地升到了大学，这时候朋友对于个体而言还是很重要的，但这时朋友有了分化，朋友具有更强的选择性，尤其是，当谈了场恋爱的时候，<strong>恋人</strong>的影响就更大了。人生在哪个阶段最容易“重色轻友”，答案很明显，就是大学阶段。 </p><p>当大学生谈起一场恋爱，给人的感觉有时候就像参加了邪教组织，或者“被传销”一样，精神亢奋而又迷迷糊糊。为了亲密的爱人，他们可以对周遭的一切视而不见。处在这个阶段，爱情使他们忘记了一切清规戒律。</p><p><em>补充</em></p><p>这个时候需要的是<strong>一位能够分享、也能够分担的恋人</strong>。嗯，没什么好说的了，这就是为谈婚论嫁铺路，所有的经验都将在最后的婚姻里体现。</p><p>大概这样就结束了……吗？<strong>我个人还有一点看法，其实后三个阶段的选择，很大程度上在第一个阶段就已经决定了。所以父母至关重要。</strong>当然，重要他人只是头把交椅的相互替代，而不是从生命中消失。所有提到的这些重要他人、以及没有提到的（尤其在一些重要他人缺失的情况下），都会对人格发展产生影响。</p><h1 id="埃里克森人格发展理论"><a href="#埃里克森人格发展理论" class="headerlink" title="埃里克森人格发展理论"></a>埃里克森人格发展理论</h1><p>这部分是在寻找重要他人的时候带出来的问题，算是相互补充吧。虽说他的理论并不是所有人都认同，毕竟临床观察有主观成分，可能有失偏颇，但同时我个人还是觉得非常有参考价值。下面内容均来自度娘。</p><h2 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h2><p>埃里克森的人格发展理论把个体自我意识的形成与发展划分为八个相互联系的阶段。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/tutorial/alks.gif" alt="埃里克森理论"></p><h2 id="第一阶段-获得基本信任感克服基本不信任感"><a href="#第一阶段-获得基本信任感克服基本不信任感" class="headerlink" title="第一阶段 获得基本信任感克服基本不信任感"></a>第一阶段 获得基本信任感克服基本不信任感</h2><p>从出生到十八个月左右是婴儿期。这是获得基本信任感而克服基本不信任感阶段。所谓基本信任，就是婴儿的需要与外界对他需要的满足保持一致。这阶段婴儿对母亲或其他代理人表示信任，婴儿感到所处的环境是个安全的地方，周围人们是可以信任的，由此就会扩展为对一般人的信任。</p><p>婴儿如果得不到周围人们的关心与照顾，他就会对外界特别是对周围的人产生害怕与怀疑的心理，以致会影响到下一阶段的顺利发展。</p><h2 id="第二阶段-获得自主感而避免怀疑感与羞耻感"><a href="#第二阶段-获得自主感而避免怀疑感与羞耻感" class="headerlink" title="第二阶段 获得自主感而避免怀疑感与羞耻感"></a>第二阶段 获得自主感而避免怀疑感与羞耻感</h2><p>从十八个月到三、四岁是童年期。这是获得自主感而避免怀疑感与羞耻感阶段。个体在第—，阶段处于依赖性较强的状态下，什么都由成人照顾。到了第二阶段，儿童开始有了独立自主的要求，如想要自己穿衣、吃饭、走路、拿玩具等，他们开始去探索周围的世界。这时候，如果父母及其他照顾他们的成人，允许他们独立地去干一些力所能及的事情，并且表扬他们完成的工作，就能培养他们的意志力，使他们获得了一种自主感，能够自己控制自己。</p><p>相反，如果成人过分爱护他们，处处包办代替，什么也不需要他们动手；或过分严厉，这也不准那也不许，稍有差错就粗暴地斥责，甚至采用体罚。例如，孩子由于不小心打碎了杯子，尿湿了裤子，成人就对其打骂，使孩子一直遭到许多失败的体验，就会产生自我怀疑与羞耻之感。</p><h2 id="第三阶段-获得主动感而克服内疚感"><a href="#第三阶段-获得主动感而克服内疚感" class="headerlink" title="第三阶段　获得主动感而克服内疚感"></a>第三阶段　获得主动感而克服内疚感</h2><p>四到五岁是学前期。这是获得主动感而克服内疚感阶段。个体在这阶段的肌肉运动与言语能力发展很快，能参加跑、跳、骑小车等运动，能说一些连贯的话，还能把自己的活动扩展到超出家庭的范围。除了模仿行为外，个体对周围的环境(也包括他自己的机体)充满了好奇心，知道自己的性别，也知道动物是公是母，常常问问这，动动那。这时候，如果成人对于孩子的好奇心以及探索行为不横加阻挠，让他们有更多机会去自由参加各种活动，耐心地解答他们提出的各种问题，而不是嘲笑；禁止，更不是指责，那么，孩子的主动性就会得到进一步发展；表现出很大的积极性与进取心。</p><p>反之；如果父母对儿童采取否定与压制的态度，就会使他们认为自己的游戏是不好的，自己提出的问题是笨拙的，自己在父母面前是讨厌的；致使孩子产生内疚感与失败感(所谓内疚感，就是认为自己做错了事情，做坏了事情)，这种内疚感与失败感还会影响下一阶段的发展。</p><h2 id="第四阶段-获得勤奋感而避免自卑感"><a href="#第四阶段-获得勤奋感而避免自卑感" class="headerlink" title="第四阶段　获得勤奋感而避免自卑感"></a>第四阶段　获得勤奋感而避免自卑感</h2><p>从六岁到十一、二岁是学龄初期。这是获得勤奋感避免自卑感阶段。学龄初期儿童的智力不断地得到发展，特别是逻辑思维能力发展迅速，他们提出的问题很广泛，而且有一定的深度。他们的能力也日益发展，参加的活动已经扩展到学校以外的社会。这时候，对他们影响最大的已经不是父母，而是同伴或邻居，尤其是学校中的教师。他们很关心物品的构造、用途与性质，对于工具技术也很感兴趣。这些方面如果能得到成人的支持、帮助与赞扬，则能进一步加强他们的勤奋感，使之进一步对这些方面发生兴趣。 埃里克森劝告做父母的人，不要把孩子的勤奋行为看作为捣乱，否则孩子会形成自卑感，认为自己不如别人，应该鼓励孩子努力获得成功，努力完成任务，激发他们的勤奋感与竞争心，有信心获得好成绩；还要鼓励他们尽自己最大努力与周围人们发生联系，进行社会交往，使他们相信自己是有能力的、聪明的，任何事情都能做得很好，即使是参加赛跑，也会认为自己是跑得很快的。总之，使他们怀有一种成就感。</p><h2 id="第五阶段-获得同一感而克服同一性混乱"><a href="#第五阶段-获得同一感而克服同一性混乱" class="headerlink" title="第五阶段 获得同一感而克服同一性混乱"></a>第五阶段 获得同一感而克服同一性混乱</h2><p>从十一、二岁到十七、八岁是青春期。这一阶段的核心问题是自我意识的确定和自我角色的形成。</p><p>“同一性”这一概念是埃里克森自我发展理论中的一个重要组成部分，它具有非常广泛的含义。它可以理解为社会与个人的统一，个体的主我与客我的统一，个体的历史性任务的认识与其主观．愿望的统一；也可理解为对自己的过去、现在和将来，即在任何情况下都能够全面认识到意识与行动的主体是自己，或者说能抓住自己，亦即是“真正的自我”，也可称为“核心的自我”。<br>青少年对周围世界有了新的观察与新的思考方法，他们经常考虑自己到底是怎样一个人，他们从别人对他的态度中，从自己扮演的各种社会角色中，逐渐认清了自己。此时，他们逐渐疏远了自己的父母，从对父母的依赖关系中解脱出来，而与同伴们建立了亲密的友谊，从而进一步认识自己，对自己的过去、现在、将来产生 ——种内在的连续之感，也认识自己与他人在外表上与性格上的相同与差别。认识自己的现在与未来在社会生活中的关系，这就是同一性，即心理社会同一感。</p><p>埃里克森认为，这种同一感可以帮助青少年了解自己以及了解自己与各种人、事、物的关系，以便能顺利地进入成年期。否则就会产生同一性的混乱。如：怀疑自我认识与他人对自己认识之间的一致性；做事情马虎，看不到努力工作与获得成就之间的关系。同一性混乱，还表现在对领导与被领导之间的共同点与差异看不清，要么持对立情绪，要么盲目顺从等。在两性问题上也会发生同一性的混乱，认识不到两性之间的同一与差异等。</p><h2 id="第六阶段-获得亲密感而避免孤独感"><a href="#第六阶段-获得亲密感而避免孤独感" class="headerlink" title="第六阶段 获得亲密感而避免孤独感"></a>第六阶段 获得亲密感而避免孤独感</h2><p>从十七、八岁至三十岁是成年早期。这是建立家庭生活的阶段，这是获得亲密感，避免孤独感阶段。亲密感，是人与人之间的亲密关系，包括友谊与爱情。亲密的社会意义，是个人能与他人同甘共苦、相互关怀。亲密感在危急情况下往往会发展为一种互相承担义务的感情，它是在共同完成任务的过程中建立起来的。</p><p>如果一个人不能与他人分享快乐与痛苦，不能与他人进行思想情感的交流；不相互关心与帮助，就会陷入孤独寂寞的苦恼情境之中。</p><h2 id="第七阶段-获得创造力感，避免“自我专注”"><a href="#第七阶段-获得创造力感，避免“自我专注”" class="headerlink" title="第七阶段 获得创造力感，避免“自我专注”"></a>第七阶段 获得创造力感，避免“自我专注”</h2><p>这是中年期与壮年期，是成家立业的阶段。这是获得创造力感，避免“自我专注”阶段。这一阶段有两种发展的可能性，一种可能是向积极方面发展，个人除关怀家庭成员外，还会扩展到关心社会上其他人，关心下一代以至子孙后代的幸福。他们在工作上勇于创造，追求事业的成功，而不仅是满足个人需要；另一种可能性是向消极方面发展，即所谓“自我专注”，就是只顾自己以及自己家庭的幸福，而不顾他人的困难和痛苦，即使有创造，其目的也完全是为了自己的利益。</p><h2 id="第八阶段-获得完美感而避免失望感"><a href="#第八阶段-获得完美感而避免失望感" class="headerlink" title="第八阶段 获得完美感而避免失望感"></a>第八阶段 获得完美感而避免失望感</h2><p>这是老年期，亦即成熟期。这是获得完美感，避免失望感阶段。如果前面七个阶段积极的成分多于消极的成分，就会在老年期汇集成完美感，回顾—生觉得这一辈子过得很有价值，生活得很有意义。相反，如果消极成分多于积极成分，就会产生失望感，感到自己的一生失去了许多机会，走错了方向，想要重新开始又感到为时已晚，痛不胜痛，于是产生了—．种绝望的感觉，精神萎靡不振，马马虎虎混日子。</p><p>埃里克森在分析每个阶段肘，都提出一些积极的建议。例如，他认为，一个人不应该对任何人都信任，不信任感也有一点用处，有了不信任感后，对于外界的危险会有一种准备，对于外界不愉快的事情可有一种预期，否则一遇社会挫折就感到不可思议或束手无策，不利于自我的成长。但埃里克森认为，在人际关系中信任与不信任感要有一定的比例，信任感应该多于不信任感，以有利于心理发展。</p><p>他还认为，自主感也不能无限制地发展，也必须有—定的怀疑感与羞耻感，如果过分相信自己，以后就不容易适应社会准则，变得独断孤行。埃里克森认为，自主感应强于怀疑感与羞耻感。儿童的勤奋感中也应该有一点失败的经验，以便今后能经受住失败的挫折，但又不能过分地经常地遭受失败，经常失败就会产生自卑感。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>以上是埃里克森自我发展的八个阶段，从中可以看到自我的形成与社会文化因素的关系，也可以看到自我与社会生活在个体人格发展中的作用。他的八个阶段是他临床经验的总结，尚缺乏严格的科学事实作依据，但比起弗洛伊德强调本能的生物学观点来，侧重了社会文化因素在自我意识形成与发展中的作用，他的理论有相对的合理性，在西方心理学界有相当大的影响。<br>有研究表明，埃里克森自我发展的八个阶段在具体的年龄段上的划分有些偏前，因此如果我们看到自己所属的心理发展阶段小于自己的生理年龄时不必沮丧。</p><p>最后习惯性吐个槽。现在再回头看有些理论，真是描述得太不容易推广了。在我看来，心理学应该是一门值得被普及的科学，它其中的一些常用知识理论应该被描述得浅显易懂，而不是靠晦涩的专业术语来突显自己的地位。这对大众和心理学自己都是有利的。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;小小宝已经11个月了，最近可能会有一些变动，担心给她造成一些不好的影响，于是回顾起老专业来了。&lt;/p&gt;
&lt;h1 id=&quot;重要他人&quot;&gt;&lt;a href=&quot;#重要他人&quot; class=&quot;headerlink&quot; title=&quot;重要他人&quot;&gt;&lt;/a&gt;重要他人&lt;/h1&gt;&lt;p&gt;最关心的就是&lt;</summary>
      
    
    
    
    <category term="心理学" scheme="https://www.gsgundam.com/categories/%E5%BF%83%E7%90%86%E5%AD%A6/"/>
    
    
    <category term="心理学" scheme="https://www.gsgundam.com/tags/%E5%BF%83%E7%90%86%E5%AD%A6/"/>
    
    <category term="发展阶段" scheme="https://www.gsgundam.com/tags/%E5%8F%91%E5%B1%95%E9%98%B6%E6%AE%B5/"/>
    
    <category term="重要他人" scheme="https://www.gsgundam.com/tags/%E9%87%8D%E8%A6%81%E4%BB%96%E4%BA%BA/"/>
    
    <category term="发展心理学" scheme="https://www.gsgundam.com/tags/%E5%8F%91%E5%B1%95%E5%BF%83%E7%90%86%E5%AD%A6/"/>
    
    <category term="儿童心理学" scheme="https://www.gsgundam.com/tags/%E5%84%BF%E7%AB%A5%E5%BF%83%E7%90%86%E5%AD%A6/"/>
    
    <category term="埃里克森" scheme="https://www.gsgundam.com/tags/%E5%9F%83%E9%87%8C%E5%85%8B%E6%A3%AE/"/>
    
    <category term="人格渐成论" scheme="https://www.gsgundam.com/tags/%E4%BA%BA%E6%A0%BC%E6%B8%90%E6%88%90%E8%AE%BA/"/>
    
  </entry>
  
  <entry>
    <title>ionic 整合 Crosswalk</title>
    <link href="https://www.gsgundam.com/archive/2015-02-12-ionic-build-with-crosswalk/"/>
    <id>https://www.gsgundam.com/archive/2015-02-12-ionic-build-with-crosswalk/</id>
    <published>2015-02-12T14:01:20.000Z</published>
    <updated>2022-11-29T03:29:32.955Z</updated>
    
    <content type="html"><![CDATA[<p>该怎么说呢，果然不出乎意料，客户对这次安卓客户端的运行效率不满意。这点其实我早预料到了，果然是逃不掉专门优化安卓的命运。</p><p>但是作为一个Hybrid应用，还能怎么样呢？<a href="http://www.wishwolf.com/">Wishwolf</a>建议我还是把浏览器内核打进安装包里，用体积换性能，起码给客户的体验要好些。</p><p>在这个项目之初就试过把Crosswalk打包进安装包里，单是支持Arm平台，安装包就活生生的增加了20mb，但是20mb换来的性能提升实在是微乎其微，所以放弃了。</p><h1 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h1><p>先说说这次的结果吧，给看官们一点信心。</p><p>这次打包的是<a href="https://download.01.org/crosswalk/releases/crosswalk/android/stable/10.39.235.15/arm/crosswalk-cordova-10.39.235.15-arm.zip">Cordova Crosswalk (ARM) 10.39.235.15 Stable</a>，Chromium内核版本39，禁用js scrolling而改用native scrolling。</p><p>实测结果：</p><p>4.4版本以下系统，性能明显提升，页面滚动流畅度大大提升，页面切换卡顿感减少。</p><p>4.4版本以上系统，性能稍有提升，页面滚动流畅度稍有提升，页面切换卡顿感减少。</p><p>5.0系统版本模拟器，性能提升很少，页面滚动流畅度有改观，页面切换无变化。</p><p>安装包体积增加约18mb。</p><p>怎么样？会不会觉得这点体积还是换来了不少价值？</p><p>提升的原理自然是很明显的，4.4版本以下的系统使用的是Webkit内核，从4.4开始才使用Chromium内核，而5.0系统也不过使用了Chromium 37内核，这里直接换成了Chromium 39，性能提升不言而喻。</p><h1 id="关于坑"><a href="#关于坑" class="headerlink" title="关于坑"></a>关于坑</h1><p>其实打包并不难，关键是中途有各种坑供大家踩，为防止老年痴呆提前发生，先把自己打怪升级的过程（踩过的两个大坑）记下来。</p><p>1、第一坑：ionic cli 1.3.2 开始官方支持使用cli直接打包。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="variable">$ionic</span> browser <span class="built_in">ls</span></span><br><span class="line">iOS - Browsers Listing:</span><br><span class="line"></span><br><span class="line">Not Available Yet - WKWebView</span><br><span class="line">Not Available Yet - UIWebView</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">Android - Browsers Listing:</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">Available - Crosswalk - ionic browser add crosswalk</span><br><span class="line">         Version 8.37.189.14 Published Fri Oct 10 2014 03:26:00 GMT+0800 (中国标准时间)</span><br><span class="line">         Version 9.38.208.10 Published Tue Nov 25 2014 11:45:00 GMT+0800 (中国标准时间)</span><br><span class="line">         Version 10.39.235.15 Published Wed Dec 31 2014 13:16:00 GMT+0800 (中国标准时间)</span><br><span class="line">(beta)   Version 11.40.277.1 Published Mon Jan 05 2015 02:52:00 GMT+0800 (中国标准时间)</span><br><span class="line">(canary) Version 11.40.277.0 Published Thu Jan 01 2015 08:27:00 GMT+0800 (中国标准时间)</span><br><span class="line">(canary) Version 12.40.283.0 Published Mon Jan 12 2015 08:27:00 GMT+0800 (中国标准时间)</span><br><span class="line"></span><br><span class="line">Available - Browser (default) - ionic browser revert android</span><br><span class="line">Not Available Yet - GeckoView</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>作为一个官方脑残粉，一般官方提供了服务，哪怕他是alpha 0.0.1版我也愿意试试。嗯，果然不出所料上当了。</p><p>各种报错，各种调试。期间还改动过多次Crosswalk和android的版本，最后还是无奈放弃了。</p><p>2、第二坑：手动集成Crosswalk。</p><p>嗯，没错。就算是手动集成也有大坑。</p><p>首先，不要尝试<code>cordova platform android@3.5.1</code>以上的平台版本，纯属浪费时间。</p><p>第二，不要尝试<code>Crosswalk 10.39.235.15 Stable</code>以上的浏览器内核，纯属浪费时间。</p><h1 id="集成概述"><a href="#集成概述" class="headerlink" title="集成概述"></a>集成概述</h1><p>好了，那么切入正题，说一说简单的集成步骤。</p><h2 id="使用命令行"><a href="#使用命令行" class="headerlink" title="使用命令行"></a>使用命令行</h2><p>1、首先进入目录，创建3.5版本的android平台：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cd</span> yourproject</span><br><span class="line">$ cordova platform add android@3.5</span><br></pre></td></tr></table></figure><p>2、删除 <code>platforms/android/CordovaLib</code> 目录中的所有内容：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">rm</span> -Rf platforms/android/CordovaLib/*</span><br></pre></td></tr></table></figure><p>3、将解压好的Crosswalk目录中的 <code>framework/</code> 所有文件拷贝到 <code>platforms/android/CordovaLib</code> 中（如果你实在需要同时支持arm和x86平台，那把两个该目录下的文件都拷进去就可以了。普通情况下，一般没必要为x86平台浪费那20mb体积）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cp</span> -a &lt;path_to_unpacked_bundle&gt;/framework/* \</span><br><span class="line">    platforms/android/CordovaLib/</span><br></pre></td></tr></table></figure><p>4、将 <code>VERSION</code> 拷贝到Android项目根目录：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cp</span> -a &lt;path_to_bundle&gt;/VERSION platforms/android/</span><br></pre></td></tr></table></figure><p>5、Crosswalk需要两个权限才能运作，如果你安装的插件里没有，那就需要手动在 <code>platforms/android/AndroidManifest.xml</code> 里添加一下。（我比较懒，直接在cordova官方插件network-information添加了<code>android.permission.ACCESS_WIFI_STATE</code>的需求）</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&lt;uses-permission android:name=&quot;android.permission.ACCESS_WIFI_STATE&quot; /&gt;</span><br><span class="line">&lt;uses-permission android:name=&quot;android.permission.ACCESS_NETWORK_STATE&quot; /&gt;</span><br></pre></td></tr></table></figure><p>6、就要完工啦。按以下顺序编译项目：</p><p><code>xwalk_core_library</code></p><p><code>CordovaLib</code></p><p><code>kitchensink</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cd</span> platforms/android/CordovaLib/</span><br><span class="line">$ android update project --subprojects --path . --target <span class="string">&quot;android-19&quot;</span></span><br><span class="line">$ ant debug</span><br><span class="line">$ <span class="built_in">cd</span> ..</span><br><span class="line">$ <span class="built_in">rm</span> -Rf ant-gen</span><br><span class="line">$ <span class="built_in">rm</span> -Rf ant-build</span><br><span class="line">$ <span class="built_in">cd</span> ../..</span><br><span class="line">$ cordova build android</span><br></pre></td></tr></table></figure><p>以上完成，恭喜你，不出意外的话，你的项目就可以跑起来了。</p><h2 id="使用ADT-x2F-Eclipse"><a href="#使用ADT-x2F-Eclipse" class="headerlink" title="使用ADT&#x2F;Eclipse"></a>使用ADT&#x2F;Eclipse</h2><p>1、先按命令行方式创建3.5版本的android平台，然后打开ADT&#x2F;Eclipse。</p><p>2、按导入Android <code>Existing Android Code into Workspace</code> 的方法，将解压好的Crosswalk中的 <code>framework/</code> 文件夹导入ADT&#x2F;Eclipse，会出现下面两个项目：</p><p><code>Cordova</code></p><p><code>xwalk_core_library</code></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/cordova-adt-import-and-rename-projects.png" alt="导入Crosswalk项目"></p><p>3、导入你的Cordova项目，导入过程中不要选择CordovaLib项目，因为我们要选择Crosswalk的Cordova包作为依赖。</p><p>4、右键点击主项目，选择 属性&#x2F;Properties ，点击 Android ，点击 Add…&#x2F;添加… ，这里要把 CrosswalkCordova 和 xwalk_core_library 项目都作为主项目的依赖库。添加完毕以后应该看起来像是这样的：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/cordova-adt-import-and-rename-projects.png" alt="导入Crosswalk项目"></p><p>5、清理所有项目。</p><p>6、要完工咯。按以下顺序编译项目：</p><p><code>xwalk_core_library</code></p><p><code>CrosswalkCordova</code></p><p><code>your application project</code></p><p>这种方法也就完结啦。</p><h1 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h1><p>最后小絮叨一个。为了适应最广泛的应用，cordova选择了支持对Html5单页面应用进行最好的支持。这不坏，网页前端攻城狮因此可以很快的转型为app前端开发，而且几乎没有学习成本，也能对原生略有了解。然而这不得不牺牲了很多优秀的原生体验，转而变成了“将就”。</p><p>Fenix已经对Android原生开发十分熟练，iOS原生也已经能做个大概。我做了好几个cordova项目了，也差不多该转型了，当然，纯粹的原生对我将是个很大的挑战。所以下一个项目应该是多页面应用作为过渡吧。比如Supersonic或者Apicloud。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/emotion/orz.jpg" alt="orz"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;该怎么说呢，果然不出乎意料，客户对这次安卓客户端的运行效率不满意。这点其实我早预料到了，果然是逃不掉专门优化安卓的命运。&lt;/p&gt;
&lt;p&gt;但是作为一个Hybrid应用，还能怎么样呢？&lt;a href=&quot;http://www.wishwolf.com/&quot;&gt;Wishwolf&lt;/a&gt;</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="js" scheme="https://www.gsgundam.com/tags/js/"/>
    
    <category term="cordova" scheme="https://www.gsgundam.com/tags/cordova/"/>
    
    <category term="angularjs" scheme="https://www.gsgundam.com/tags/angularjs/"/>
    
    <category term="ionic" scheme="https://www.gsgundam.com/tags/ionic/"/>
    
    <category term="phonegap" scheme="https://www.gsgundam.com/tags/phonegap/"/>
    
    <category term="crosswalk" scheme="https://www.gsgundam.com/tags/crosswalk/"/>
    
    <category term="xwalk" scheme="https://www.gsgundam.com/tags/xwalk/"/>
    
  </entry>
  
  <entry>
    <title>ionic framework 整合 ngCordova</title>
    <link href="https://www.gsgundam.com/archive/2015-02-11-ionic-with-ngCordova/"/>
    <id>https://www.gsgundam.com/archive/2015-02-11-ionic-with-ngCordova/</id>
    <published>2015-02-10T16:26:20.000Z</published>
    <updated>2022-11-28T05:42:00.323Z</updated>
    
    <content type="html"><![CDATA[<p>最近手里的ionic app项目在交付阶段遇到了好些问题，其中有几个都很诡异，最气人的是network-infomation和toast插件经常不正常工作，这两个关键的功能是必不可少的，因此我也没想过要去做容错，所以直接就把app搞瘫痪了。</p><p>这一系列问题硬生生的花了我四天时间绕着弯去想临时办法解决它们。但是到network-infomation和toast的时候实在是绕不过了，于是只好静下心来思考方法。</p><p>原来在用jqmobi的时候从来没有出过这个问题，那十有八九都是因为angularjs了。虽然并不知道具体原因，但是早就知道<a href="http://ngcordova.com/">ngCordova</a>这个项目，只不过之前的ionic app都只是离线展示的作用，没有涉及到这么多功能，因此觉得这个项目对自己用处不大。</p><p>但是这次不同了，整合只花了1个多小时，却解决了我4天熬夜都没搞定的问题。值得反省啊！</p><p>整合起来很简单，只要在<code>angular.js/ionic.bundle.js</code>之后、<code>cordova.js</code>之前引入即可。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- ionic/angularjs js --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;lib/ionic/js/ionic.bundle.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!--ngCordova--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;lib/utils/ng-cordova.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- cordova script (this will be a 404 during development) --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;cordova.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>将其作为Angularjs的依赖注入到module中。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">angular.<span class="title function_">module</span>(<span class="string">&#x27;myApp&#x27;</span>, [<span class="string">&#x27;ngCordova&#x27;</span>])</span><br></pre></td></tr></table></figure><p>如此，前期工作就做完了，剩下的就是根据<a href="http://ngcordova.com/docs/plugins/">插件列表</a>中所需要的内容来添加插件和代码了。</p><p>例如，我需要判断在线还是离线，比我自己写方法还要简单，直接这样就行了。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">$ionicPlatform.<span class="title function_">ready</span>(<span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">    ...</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// listen for Online event</span></span><br><span class="line">    $rootScope.$on(<span class="string">&#x27;$cordovaNetwork:online&#x27;</span>, <span class="keyword">function</span>(<span class="params">event, networkState</span>)&#123;</span><br><span class="line">        <span class="title function_">alert</span>(<span class="string">&#x27;连上啦&#x27;</span>);</span><br><span class="line">    &#125;)</span><br><span class="line"></span><br><span class="line">    <span class="comment">// listen for Offline event</span></span><br><span class="line">    $rootScope.$on(<span class="string">&#x27;$cordovaNetwork:offline&#x27;</span>, <span class="keyword">function</span>(<span class="params">event, networkState</span>)&#123;</span><br><span class="line">        <span class="title function_">alert</span>(<span class="string">&#x27;掉线啦&#x27;</span>);</span><br><span class="line">    &#125;)</span><br><span class="line">    </span><br><span class="line">    ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>嗯，夫复何求。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/emotion/likeit.jpg" alt="点个赞"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近手里的ionic app项目在交付阶段遇到了好些问题，其中有几个都很诡异，最气人的是network-infomation和toast插件经常不正常工作，这两个关键的功能是必不可少的，因此我也没想过要去做容错，所以直接就把app搞瘫痪了。&lt;/p&gt;
&lt;p&gt;这一系列问题硬生生</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="js" scheme="https://www.gsgundam.com/tags/js/"/>
    
    <category term="cordova" scheme="https://www.gsgundam.com/tags/cordova/"/>
    
    <category term="angularjs" scheme="https://www.gsgundam.com/tags/angularjs/"/>
    
    <category term="ionic" scheme="https://www.gsgundam.com/tags/ionic/"/>
    
    <category term="ngcordova" scheme="https://www.gsgundam.com/tags/ngcordova/"/>
    
    <category term="phonegap" scheme="https://www.gsgundam.com/tags/phonegap/"/>
    
  </entry>
  
  <entry>
    <title>【收集】实现 苹果 WWDC 2014 海报效果</title>
    <link href="https://www.gsgundam.com/archive/2015-02-04-wwdc-2014-post-effect/"/>
    <id>https://www.gsgundam.com/archive/2015-02-04-wwdc-2014-post-effect/</id>
    <published>2015-02-04T07:26:20.000Z</published>
    <updated>2022-11-28T05:42:00.325Z</updated>
    
    <content type="html"><![CDATA[<p>该效果来自于：<a href="http://www.funnyjs.com/wwdc2014_rainbowblock/#more-92">Funny JS</a></p><p>作者是因为知乎上的一个问题而写了这篇文章和这个程序，使用HTML5+JS进行开发，可以将任意图片转换成WWDC2014海报的样式：用色调如彩虹般绚丽的圆角矩形来拼成原图。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/wwdc2014.jpg" alt="苹果 WWDC 2014 海报"></p><p>我只想说，效果超乎想像。Canvas确实可以大有作为。</p><p>看官们就自行体验吧。</p><iframe src="http://gsgundam.com/demo/wwdc2014/wwdc2014.html"></iframe><p>以下贴上所有代码：</p><p>HTML部分：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;toolbar&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">value</span>=<span class="string">&quot;苹果&quot;</span> <span class="attr">id</span>=<span class="string">&quot;apple&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">value</span>=<span class="string">&quot;微软&quot;</span> <span class="attr">id</span>=<span class="string">&quot;windows&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">value</span>=<span class="string">&quot;Twitter&quot;</span> <span class="attr">id</span>=<span class="string">&quot;twitter&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">value</span>=<span class="string">&quot;知乎&quot;</span> <span class="attr">id</span>=<span class="string">&quot;zhihu&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">value</span>=<span class="string">&quot;刘看山&quot;</span> <span class="attr">id</span>=<span class="string">&quot;liukanshan&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">value</span>=<span class="string">&quot;喵&quot;</span> <span class="attr">id</span>=<span class="string">&quot;cat&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">value</span>=<span class="string">&quot;苏莉安&quot;</span> <span class="attr">id</span>=<span class="string">&quot;sulian&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">span</span> <span class="attr">id</span>=<span class="string">&quot;uploadspan&quot;</span>&gt;</span>上传图片：<span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;file&quot;</span> <span class="attr">id</span>=<span class="string">&quot;localimg&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;container&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">canvas</span> <span class="attr">id</span>=<span class="string">&quot;image&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">canvas</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p>CSS部分：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">body</span> &#123;</span><br><span class="line">            <span class="attribute">margin</span>: <span class="number">0px</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="selector-id">#container</span> &#123;</span><br><span class="line">            <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="selector-id">#toolbar</span> &#123;</span><br><span class="line">            <span class="attribute">background-color</span>: <span class="number">#CCC</span>;</span><br><span class="line">            <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">            <span class="attribute">height</span>: <span class="number">32px</span>;</span><br><span class="line">            <span class="attribute">font-size</span>: <span class="number">16px</span>;</span><br><span class="line">            <span class="attribute">line-height</span>: <span class="number">32px</span>;</span><br><span class="line">            <span class="attribute">margin</span>: <span class="number">0px</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="selector-id">#toolbar</span> <span class="selector-tag">input</span> &#123;</span><br><span class="line">            <span class="attribute">font-size</span>: <span class="number">16px</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="selector-id">#toolbar</span> <span class="selector-tag">input</span><span class="selector-attr">[type=<span class="string">&quot;button&quot;</span>]</span> &#123;</span><br><span class="line">            <span class="attribute">background-color</span>: <span class="number">#99CCFF</span>;</span><br><span class="line">            <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#6699CC</span>;</span><br><span class="line">            <span class="attribute">width</span>: <span class="number">64px</span>;</span><br><span class="line">            <span class="attribute">height</span>: <span class="number">24px</span>;</span><br><span class="line">            <span class="attribute">margin</span>: <span class="number">0px</span>;</span><br><span class="line">        &#125;</span><br></pre></td></tr></table></figure><p>Javascript部分：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> canvas; <span class="comment">//画布</span></span><br><span class="line"><span class="keyword">var</span> ctx; <span class="comment">//绘图内容</span></span><br><span class="line"><span class="keyword">var</span> blocksize = <span class="number">14</span><span class="comment">//单个图块的尺寸</span></span><br><span class="line"><span class="keyword">var</span> row, col<span class="comment">//按图块尺寸算出的行列数</span></span><br><span class="line"><span class="keyword">var</span> drawing = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//页面加载</span></span><br><span class="line">$(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="title function_">init</span>();</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="comment">//初始化</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">init</span>(<span class="params"></span>) &#123;</span><br><span class="line">    canvas = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;image&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span> (!canvas.<span class="property">getContext</span>) self.<span class="property">location</span> = <span class="string">&quot;/nohtml5.html&quot;</span></span><br><span class="line">    <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="comment">//初始化容器尺寸</span></span><br><span class="line">        <span class="keyword">var</span> container = $(<span class="string">&quot;#container&quot;</span>);</span><br><span class="line">        container.<span class="title function_">height</span>($(<span class="variable language_">window</span>).<span class="title function_">height</span>() - $(<span class="string">&quot;#toolbar&quot;</span>).<span class="title function_">height</span>() - <span class="number">2</span>);</span><br><span class="line">        canvas.<span class="property">width</span> = container.<span class="title function_">width</span>();</span><br><span class="line">        canvas.<span class="property">height</span> = container.<span class="title function_">height</span>();</span><br><span class="line">        ctx = canvas.<span class="title function_">getContext</span>(<span class="string">&quot;2d&quot;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">var</span> rainbowfill = ctx.<span class="title function_">createLinearGradient</span>(<span class="number">0</span>, <span class="number">0</span>, canvas.<span class="property">width</span>, <span class="number">0</span>);<span class="comment">//彩虹色填充</span></span><br><span class="line">        rainbowfill.<span class="title function_">addColorStop</span>(<span class="number">0</span>, <span class="string">&quot;#92ea0e&quot;</span>);</span><br><span class="line">        rainbowfill.<span class="title function_">addColorStop</span>(<span class="number">0.25</span>, <span class="string">&quot;#03d9f5&quot;</span>);</span><br><span class="line">        rainbowfill.<span class="title function_">addColorStop</span>(<span class="number">0.5</span>, <span class="string">&quot;#8e49f7&quot;</span>);</span><br><span class="line">        rainbowfill.<span class="title function_">addColorStop</span>(<span class="number">0.75</span>, <span class="string">&quot;#fb9343&quot;</span>);</span><br><span class="line">        rainbowfill.<span class="title function_">addColorStop</span>(<span class="number">1</span>, <span class="string">&quot;#fdda06&quot;</span>);</span><br><span class="line">        ctx.<span class="property">fillStyle</span> = rainbowfill;</span><br><span class="line"></span><br><span class="line">        row = <span class="title class_">Math</span>.<span class="title function_">floor</span>(canvas.<span class="property">height</span> / blocksize)</span><br><span class="line">        col = <span class="title class_">Math</span>.<span class="title function_">floor</span>(canvas.<span class="property">width</span> / blocksize)</span><br><span class="line"></span><br><span class="line">        $(<span class="string">&quot;#toolbar :button&quot;</span>).<span class="title function_">click</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (drawing) <span class="keyword">return</span>;</span><br><span class="line">            drawing = <span class="literal">true</span>;</span><br><span class="line">            <span class="title function_">loadServerImg</span>(<span class="string">&quot;wwdc2014/&quot;</span> + $(<span class="variable language_">this</span>).<span class="title function_">attr</span>(<span class="string">&quot;id&quot;</span>) + <span class="string">&quot;.jpg&quot;</span>);</span><br><span class="line">        &#125;)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span>(<span class="keyword">typeof</span> <span class="title class_">FileReader</span>===<span class="string">&#x27;undefined&#x27;</span>)&#123;</span><br><span class="line">            $(<span class="string">&quot;#uploadspan&quot;</span>).<span class="title function_">hide</span>();<span class="comment">//不能使用本地文件接口则禁用</span></span><br><span class="line">        &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">            $(<span class="string">&quot;#localimg&quot;</span>).<span class="title function_">change</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                <span class="keyword">var</span> file = <span class="variable language_">this</span>.<span class="property">files</span>[<span class="number">0</span>];</span><br><span class="line">                <span class="keyword">if</span>(!<span class="regexp">/image\/\w+/</span>.<span class="title function_">test</span>(file.<span class="property">type</span>))&#123;</span><br><span class="line">                    <span class="title function_">alert</span>(<span class="string">&quot;你选择的不是图片文件！&quot;</span>);</span><br><span class="line">                    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">var</span> imgreader = <span class="keyword">new</span> <span class="title class_">FileReader</span>();</span><br><span class="line">                imgreader.<span class="title function_">readAsDataURL</span>(file);</span><br><span class="line">                imgreader.<span class="property">onload</span> = <span class="keyword">function</span>(<span class="params">e</span>)&#123;</span><br><span class="line">                    <span class="title function_">loadServerImg</span>(<span class="variable language_">this</span>.<span class="property">result</span>);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="title function_">loadServerImg</span>(<span class="string">&quot;wwdc2014/apple.jpg&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//根据左上角坐标xy和尺寸size绘制单个圆角矩形</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">roundRectanglePath</span>(<span class="params">x, y, size, radius</span>) &#123;</span><br><span class="line">    <span class="keyword">var</span> radius = <span class="title class_">Math</span>.<span class="title function_">ceil</span>(size / <span class="number">4</span>);</span><br><span class="line">    ctx.<span class="title function_">beginPath</span>();</span><br><span class="line">    ctx.<span class="title function_">moveTo</span>(x + radius, y);</span><br><span class="line">    ctx.<span class="title function_">lineTo</span>(x + size - radius, y);</span><br><span class="line">    ctx.<span class="title function_">arc</span>(x + size - radius, y + radius, radius, <span class="number">3</span> * <span class="title class_">Math</span>.<span class="property">PI</span> / <span class="number">2</span>, <span class="number">2</span> * <span class="title class_">Math</span>.<span class="property">PI</span>, <span class="literal">false</span>);</span><br><span class="line">    ctx.<span class="title function_">lineTo</span>(x + size, y + size - radius);</span><br><span class="line">    ctx.<span class="title function_">arc</span>(x + size - radius, y + size - radius, radius, <span class="number">0</span>, <span class="title class_">Math</span>.<span class="property">PI</span> / <span class="number">2</span>, <span class="literal">false</span>);</span><br><span class="line">    ctx.<span class="title function_">lineTo</span>(x + radius, y + size);</span><br><span class="line">    ctx.<span class="title function_">arc</span>(x + radius, y + size - radius, radius, <span class="title class_">Math</span>.<span class="property">PI</span> / <span class="number">2</span>, <span class="title class_">Math</span>.<span class="property">PI</span>, <span class="literal">false</span>);</span><br><span class="line">    ctx.<span class="title function_">lineTo</span>(x, y + radius);</span><br><span class="line">    ctx.<span class="title function_">arc</span>(x + radius, y + radius, radius, <span class="title class_">Math</span>.<span class="property">PI</span>, <span class="number">3</span> * <span class="title class_">Math</span>.<span class="property">PI</span> / <span class="number">2</span>, <span class="literal">false</span>);</span><br><span class="line">    ctx.<span class="title function_">closePath</span>();</span><br><span class="line">    ctx.<span class="title function_">fill</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//绘制一斜行方块</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">drawBlocks</span>(<span class="params">imgdata, maxgray, mingray, cursor</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (cursor &gt;= col + row) &#123;</span><br><span class="line">        drawing = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">var</span> r , c;<span class="comment">//起始行列</span></span><br><span class="line">    <span class="keyword">if</span> (cursor &lt; col) &#123;</span><br><span class="line">        r = <span class="number">0</span>;</span><br><span class="line">        c = cursor;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span> &#123;</span><br><span class="line">        r = cursor - col + <span class="number">1</span>;</span><br><span class="line">        c = col - <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">while</span> (r &lt; row &amp;&amp; c &gt;= <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="keyword">var</span> gray = (imgdata[c][r] - mingray) / (maxgray - mingray);<span class="comment">//以最大和最小灰度为界，计算出相对灰度</span></span><br><span class="line">        <span class="keyword">if</span> (gray &gt; <span class="number">0.25</span>) &#123;<span class="comment">//过浅的灰度不绘制</span></span><br><span class="line">            <span class="keyword">var</span> pointsize = <span class="number">2</span> * (<span class="title class_">Math</span>.<span class="title function_">ceil</span>(gray * blocksize / <span class="number">2</span>) - <span class="number">1</span>);<span class="comment">//灰度决定尺寸</span></span><br><span class="line">            <span class="keyword">if</span> (pointsize &gt;= blocksize) pointsize = blocksize - <span class="number">2</span>;<span class="comment">//防止超限</span></span><br><span class="line">            <span class="keyword">var</span> x = c * blocksize + (blocksize - pointsize) / <span class="number">2</span></span><br><span class="line">            <span class="keyword">var</span> y = r * blocksize + (blocksize - pointsize) / <span class="number">2</span></span><br><span class="line">            <span class="title function_">roundRectanglePath</span>(x, y, pointsize)</span><br><span class="line">        &#125;</span><br><span class="line">        r++;</span><br><span class="line">        c--;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">setTimeout</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        <span class="title function_">drawBlocks</span>(imgdata, maxgray, mingray, cursor + <span class="number">1</span>);</span><br><span class="line">    &#125;, <span class="number">7</span>);<span class="comment">//延时绘制下一排</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//读取图片</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">loadServerImg</span>(<span class="params">src</span>) &#123;</span><br><span class="line">    <span class="keyword">var</span> imageObj = <span class="keyword">new</span> <span class="title class_">Image</span>();</span><br><span class="line">    imageObj.<span class="property">onload</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        <span class="comment">//生成离屏画布</span></span><br><span class="line">        <span class="keyword">var</span> offcanvas = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;canvas&#x27;</span>);</span><br><span class="line">        <span class="keyword">var</span> imgw, imgh;<span class="comment">//缩放后的图片尺寸</span></span><br><span class="line">        <span class="keyword">if</span> (col / row &gt; imageObj.<span class="property">width</span> / imageObj.<span class="property">height</span>) &#123;<span class="comment">//如果画布比图片宽，则以高度为准进行放缩</span></span><br><span class="line">            imgw = <span class="title class_">Math</span>.<span class="title function_">floor</span>(imageObj.<span class="property">width</span> / imageObj.<span class="property">height</span> * row);</span><br><span class="line">            imgh = row;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> &#123;<span class="comment">//否则以宽度为准进行放缩</span></span><br><span class="line">            imgw = col;</span><br><span class="line">            imgh = <span class="title class_">Math</span>.<span class="title function_">floor</span>(imageObj.<span class="property">height</span> / imageObj.<span class="property">width</span> * col);</span><br><span class="line">        &#125;</span><br><span class="line">        offcanvas.<span class="property">width</span> = imgw;</span><br><span class="line">        offcanvas.<span class="property">height</span> = imgh;</span><br><span class="line">        <span class="keyword">var</span> offctx = offcanvas.<span class="title function_">getContext</span>(<span class="string">&quot;2d&quot;</span>);</span><br><span class="line">        offctx.<span class="title function_">drawImage</span>(<span class="variable language_">this</span>, <span class="number">0</span>, <span class="number">0</span>, imgw, imgh);</span><br><span class="line">        <span class="keyword">var</span> imgdata = offctx.<span class="title function_">getImageData</span>(<span class="number">0</span>, <span class="number">0</span>, imgw, imgh)</span><br><span class="line">        <span class="comment">//返回数组初始化为全黑</span></span><br><span class="line">        <span class="keyword">var</span> returndata = <span class="keyword">new</span> <span class="title class_">Array</span>()</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; col; i++) &#123;</span><br><span class="line">            returndata[i] = <span class="keyword">new</span> <span class="title class_">Array</span>()</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">var</span> j = <span class="number">0</span>; j &lt; row; j++)</span><br><span class="line">                returndata[i][j] = <span class="number">255</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">//然后为中心部分赋值</span></span><br><span class="line">        <span class="keyword">var</span> startcol = <span class="title class_">Math</span>.<span class="title function_">floor</span>((col - imgw) / <span class="number">2</span>)</span><br><span class="line">        <span class="keyword">var</span> startrow = <span class="title class_">Math</span>.<span class="title function_">floor</span>((row - imgh) / <span class="number">2</span>)</span><br><span class="line">        <span class="keyword">var</span> maxgray = <span class="number">0</span>, mingray = <span class="number">255</span>;<span class="comment">//最大最小灰度值</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; imgw; i++) &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">var</span> j = <span class="number">0</span>; j &lt; imgh; j++) &#123;</span><br><span class="line">                <span class="keyword">var</span> cursor = (i + j * imgw) * <span class="number">4</span>;</span><br><span class="line">                <span class="keyword">var</span> gray = imgdata.<span class="property">data</span>[cursor] * <span class="number">.3</span> + imgdata.<span class="property">data</span>[cursor + <span class="number">1</span>] * <span class="number">.59</span> + imgdata.<span class="property">data</span>[cursor + <span class="number">2</span>] * <span class="number">.11</span>;<span class="comment">//取灰度</span></span><br><span class="line">                <span class="keyword">if</span> (gray &gt; maxgray) maxgray = gray;</span><br><span class="line">                <span class="keyword">if</span> (gray &lt; mingray) mingray = gray;</span><br><span class="line">                returndata[startcol + i][startrow + j] = gray;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        ctx.<span class="title function_">clearRect</span>(<span class="number">0</span>, <span class="number">0</span>, canvas.<span class="property">width</span>, canvas.<span class="property">height</span>);</span><br><span class="line">        <span class="title function_">drawBlocks</span>(returndata, maxgray, mingray, <span class="number">0</span>);</span><br><span class="line">    &#125;;</span><br><span class="line">    imageObj.<span class="property">src</span> = src;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//建立动画对象</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">createAnime</span>(<span class="params">callback</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (!callback) <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">    <span class="keyword">var</span> anime = <span class="keyword">new</span> <span class="title class_">Object</span>();</span><br><span class="line">    anime.<span class="property">starttime</span><span class="comment">//动画开始时间</span></span><br><span class="line">    anime.<span class="property">fps</span>;<span class="comment">//上一秒帧数</span></span><br><span class="line">    anime.<span class="property">secondstarttime</span>;<span class="comment">//当前秒开始时间（用于统计每秒的帧数）</span></span><br><span class="line">    anime.<span class="property">framestarttime</span>;</span><br><span class="line">    anime.<span class="property">nextfps</span>;</span><br><span class="line">    anime.<span class="property">status</span> = <span class="string">&quot;idle&quot;</span>;</span><br><span class="line">    anime.<span class="property">start</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="variable language_">this</span>.<span class="property">status</span> == <span class="string">&quot;running&quot;</span>) <span class="keyword">return</span>;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">status</span> = <span class="string">&quot;running&quot;</span>;</span><br><span class="line">        <span class="keyword">if</span> (<span class="variable language_">this</span>.<span class="property">status</span> == <span class="string">&quot;idle&quot;</span>) <span class="variable language_">this</span>.<span class="property">starttime</span> = <span class="keyword">new</span> <span class="title class_">Date</span>();<span class="comment">//初次启动才计时</span></span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">secondstarttime</span> = <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">framestarttime</span> = <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">fps</span> = <span class="number">0</span>;<span class="comment">//上一秒帧数</span></span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">nextfps</span> = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">        <span class="title function_">_animeFrame</span>(<span class="variable language_">this</span>, callback);</span><br><span class="line">    &#125;;</span><br><span class="line">    anime.<span class="property">stop</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">status</span> = <span class="string">&quot;stopped&quot;</span>;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">return</span> anime;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">_animeFrame</span>(<span class="params">anime, callback</span>) &#123;</span><br><span class="line">    anime.<span class="property">nextfps</span>++;<span class="comment">//累加帧数</span></span><br><span class="line">    <span class="keyword">var</span> currenttime = <span class="keyword">new</span> <span class="title class_">Date</span>()</span><br><span class="line">    <span class="keyword">if</span> (currenttime - anime.<span class="property">secondstarttime</span> &gt;= <span class="number">1000</span>) &#123;<span class="comment">//满1秒则为帧数赋值，清空计数</span></span><br><span class="line">        anime.<span class="property">fps</span> = anime.<span class="property">nextfps</span>;</span><br><span class="line">        anime.<span class="property">nextfps</span> = <span class="number">0</span>;</span><br><span class="line">        anime.<span class="property">secondstarttime</span> = currenttime;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">var</span> framespan = currenttime - anime.<span class="property">framestarttime</span>;<span class="comment">//计算两帧间隔</span></span><br><span class="line">    anime.<span class="property">framestarttime</span> = currenttime;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">callback</span>(framespan, anime.<span class="property">fps</span>);</span><br><span class="line">    <span class="keyword">if</span> (anime &amp;&amp; anime.<span class="property">status</span> == <span class="string">&quot;running&quot;</span>) &#123;</span><br><span class="line">        <span class="title function_">requestAnimationFrame</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                <span class="title function_">_animeFrame</span>(anime, callback);</span><br><span class="line">            &#125;</span><br><span class="line">        );</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//requestAnimationFrame动画方法的兼容性</span></span><br><span class="line">(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">var</span> lastTime = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">var</span> vendors = [<span class="string">&#x27;webkit&#x27;</span>, <span class="string">&#x27;moz&#x27;</span>];</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">var</span> x = <span class="number">0</span>; x &lt; vendors.<span class="property">length</span> &amp;&amp; !<span class="variable language_">window</span>.<span class="property">requestAnimationFrame</span>; ++x) &#123;</span><br><span class="line">        <span class="variable language_">window</span>.<span class="property">requestAnimationFrame</span> = <span class="variable language_">window</span>[vendors[x] + <span class="string">&#x27;RequestAnimationFrame&#x27;</span>];</span><br><span class="line">        <span class="variable language_">window</span>.<span class="property">cancelAnimationFrame</span> = <span class="variable language_">window</span>[vendors[x] + <span class="string">&#x27;CancelAnimationFrame&#x27;</span>] ||    <span class="comment">// Webkit中此取消方法的名字变了</span></span><br><span class="line">            <span class="variable language_">window</span>[vendors[x] + <span class="string">&#x27;CancelRequestAnimationFrame&#x27;</span>];</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (!<span class="variable language_">window</span>.<span class="property">requestAnimationFrame</span>) &#123;</span><br><span class="line">        <span class="variable language_">window</span>.<span class="property">requestAnimationFrame</span> = <span class="keyword">function</span> (<span class="params">callback, element</span>) &#123;</span><br><span class="line">            <span class="keyword">var</span> currTime = <span class="keyword">new</span> <span class="title class_">Date</span>().<span class="title function_">getTime</span>();</span><br><span class="line">            <span class="keyword">var</span> timeToCall = <span class="title class_">Math</span>.<span class="title function_">max</span>(<span class="number">0</span>, <span class="number">16.7</span> - (currTime - lastTime));</span><br><span class="line">            <span class="keyword">var</span> id = <span class="variable language_">window</span>.<span class="built_in">setTimeout</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">                <span class="title function_">callback</span>(currTime + timeToCall);</span><br><span class="line">            &#125;, timeToCall);</span><br><span class="line">            lastTime = currTime + timeToCall;</span><br><span class="line">            <span class="keyword">return</span> id;</span><br><span class="line">        &#125;;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (!<span class="variable language_">window</span>.<span class="property">cancelAnimationFrame</span>) &#123;</span><br><span class="line">        <span class="variable language_">window</span>.<span class="property">cancelAnimationFrame</span> = <span class="keyword">function</span> (<span class="params">id</span>) &#123;</span><br><span class="line">            <span class="built_in">clearTimeout</span>(id);</span><br><span class="line">        &#125;;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;());</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;该效果来自于：&lt;a href=&quot;http://www.funnyjs.com/wwdc2014_rainbowblock/#more-92&quot;&gt;Funny JS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;作者是因为知乎上的一个问题而写了这篇文章和这个程序，使用HTML5+JS进行开发，可以将任意</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="js" scheme="https://www.gsgundam.com/tags/js/"/>
    
    <category term="wwdc" scheme="https://www.gsgundam.com/tags/wwdc/"/>
    
    <category term="2014" scheme="https://www.gsgundam.com/tags/2014/"/>
    
    <category term="海报" scheme="https://www.gsgundam.com/tags/%E6%B5%B7%E6%8A%A5/"/>
    
    <category term="彩虹" scheme="https://www.gsgundam.com/tags/%E5%BD%A9%E8%99%B9/"/>
    
    <category term="jquery" scheme="https://www.gsgundam.com/tags/jquery/"/>
    
  </entry>
  
  <entry>
    <title>微观经济学效用论消费者均衡计算题笔记</title>
    <link href="https://www.gsgundam.com/archive/2015-02-01-economics-utility-calculate/"/>
    <id>https://www.gsgundam.com/archive/2015-02-01-economics-utility-calculate/</id>
    <published>2015-02-01T15:01:20.000Z</published>
    <updated>2016-10-11T05:58:10.854Z</updated>
    
    <content type="html"><![CDATA[<p>今天跟阿宝一起学效用论《总效用极大化和消费者均衡》的时候，被计算题折腾得够呛。幸好是两个人一起学习，讨论了一下，明白了一个大概。记录一下，免得忘了。</p><h1 id="命题"><a href="#命题" class="headerlink" title="命题"></a>命题</h1><p>消费者在既定的预算线约束 $ I &#x3D; P_1X_1 + P_2X_2 $ 下寻求效用 $ U(X_1,X_2) $ 极大化，是一个条件极值问题，即：</p><p>　$$ \cases{ {MaxU(X_1,X_2)}\\{s.t.I &#x3D; P_1X_1 + P_2X_2} } $$</p><p>解决方法是用拉格朗日乘数法。</p><p>首先制造拉格朗日函数：</p><p>　$$ L &#x3D; U(X_1,X_2) + λ(I - P_1X_1 - P_2X_2) $$</p><blockquote><p><em>注：λ &#x3D; 边际效用 &#x2F; 商品单价，这个函数的意思是购买商品1和商品2所得的效用，加上购买商品的所剩余预算产生的效用，等于一个值L。</em></p></blockquote><p>将上式分别对$X_1$、$X_2$、$λ$求导并令其等于0，可得：</p><p>$$<br> \cases{<br>    {\frac{\partial L}{\partial X_1} &#x3D; \frac{\partial U}{\partial X_1} - λP_1 &#x3D; 0}<br>    \\{\frac{\partial L}{\partial X_2} &#x3D; \frac{\partial U}{\partial X_2} - λP_2 &#x3D; 0}<br>    \\{\frac{\partial L}{\partial λ} &#x3D; I - P_1X_1 - P_2X_2 &#x3D; 0}<br>  } %}<br>$$</p><blockquote><p><em>注：</em></p></blockquote><blockquote><p><em>算式一相当于假设所有的钱都去购买了商品1，那么已经购买的每一个商品1所产生的效用等于边际效用。</em></p></blockquote><blockquote><p><em>同理，算式二相当于假设所有的钱都去购买了商品2，那么已经购买的每一个商品2所产生的效用等于边际效用。</em></p></blockquote><blockquote><p><em>而算式三即是在均衡效用的情况下，购买商品1和商品2的预算，刚好等于消费者的既定预算。</em></p></blockquote><h1 id="例题"><a href="#例题" class="headerlink" title="例题"></a>例题</h1><p><strong>设效用函数 $ U &#x3D; X_1^{\frac{1}{2}}X_2^{\frac{1}{2}} $ ，两种商品的价格分别是 $P_1&#x3D;4$元, $P_2&#x3D;5$元, 消费者收入为$1000$元，试求消费者的最优选择。</strong></p><p>（省略其中一种解法，不然自己全混淆了……）</p><p>首先制造拉格朗日函数：</p><p>　$$ L &#x3D; X_1^{\frac{1}{2}}X_2^{\frac{1}{2}} + λ(1000 - 4X_1 - 5X_2) $$</p><p>分别对$X_1$、$X_2$、$λ$求导并令其等于0，可得：</p><p>$$<br> \cases{<br>    {\frac{\partial L}{\partial X_1} &#x3D; \frac{\partial U}{\partial X_1} - λP_1 &#x3D; \frac{1}{2}X_1^{-\frac{1}{2}}X_2^{\frac{1}{2}} - 4λ &#x3D; 0}<br>    \\{\frac{\partial L}{\partial X_2} &#x3D; \frac{\partial U}{\partial X_2} - λP_2 &#x3D; \frac{1}{2}X_1^{\frac{1}{2}}X_2^{-\frac{1}{2}} - 5λ &#x3D; 0}<br>    \\{\frac{\partial L}{\partial λ} &#x3D; 1000 - 4X_1 - 5X_2 &#x3D; 0}<br>  }<br>$$</p><p>整理得：</p><p>$$<br>　\frac{\frac{1}{2}X_1^{-\frac{1}{2}}X_2^{\frac{1}{2}}}{4} &#x3D; \frac{\frac{1}{2}X_1^{\frac{1}{2}}X_2^{-\frac{1}{2}}}{5} &#x3D; λ<br>$$</p><p>化简为 $4X_1 &#x3D; 5X_2$，</p><p>代入 $1000-4X_1-5X_2 &#x3D; 0$，</p><p>可得消费者最优选择为：</p><p>　$X_1 &#x3D; 125$，$X_2 &#x3D; 100$</p><h1 id="几个求解时可能用到的初等导数"><a href="#几个求解时可能用到的初等导数" class="headerlink" title="几个求解时可能用到的初等导数"></a>几个求解时可能用到的初等导数</h1><h2 id="常数导数"><a href="#常数导数" class="headerlink" title="常数导数"></a>常数导数</h2><p>　$$ c’ &#x3D; 0 $$</p><h2 id="幂函数导数"><a href="#幂函数导数" class="headerlink" title="幂函数导数"></a>幂函数导数</h2><p>　$(x^α)’ &#x3D; αx^{(α-1)}$</p><p>特殊：</p><p>　$x’ &#x3D; 1$， $(x^2)’ &#x3D; 2x$</p><p>　$(\frac{1}{x})’ &#x3D; -\frac{1}{x^2}$， $(\sqrt{x})’ &#x3D; \frac{1}{2\sqrt{x}}$</p><h2 id="对数函数导数"><a href="#对数函数导数" class="headerlink" title="对数函数导数"></a>对数函数导数</h2><p>　$(log_αx)’ &#x3D; \frac{1}{x\ln α}$，$(\ln x)’ &#x3D; \frac{1}{x}$</p><h2 id="正余弦函数导数"><a href="#正余弦函数导数" class="headerlink" title="正余弦函数导数"></a>正余弦函数导数</h2><p>　$(\sin x)’ &#x3D; \cos x$， $(\cos x)’ &#x3D; -\sin x$</p><p>大概就是这样吧，但愿我们都理解对了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天跟阿宝一起学效用论《总效用极大化和消费者均衡》的时候，被计算题折腾得够呛。幸好是两个人一起学习，讨论了一下，明白了一个大概。记录一下，免得忘了。&lt;/p&gt;
&lt;h1 id=&quot;命题&quot;&gt;&lt;a href=&quot;#命题&quot; class=&quot;headerlink&quot; title=&quot;命题&quot;&gt;&lt;/</summary>
      
    
    
    
    <category term="金融经济" scheme="https://www.gsgundam.com/categories/%E9%87%91%E8%9E%8D%E7%BB%8F%E6%B5%8E/"/>
    
    
    <category term="微观经济学" scheme="https://www.gsgundam.com/tags/%E5%BE%AE%E8%A7%82%E7%BB%8F%E6%B5%8E%E5%AD%A6/"/>
    
    <category term="经济学" scheme="https://www.gsgundam.com/tags/%E7%BB%8F%E6%B5%8E%E5%AD%A6/"/>
    
    <category term="效用论" scheme="https://www.gsgundam.com/tags/%E6%95%88%E7%94%A8%E8%AE%BA/"/>
    
    <category term="消费者均衡" scheme="https://www.gsgundam.com/tags/%E6%B6%88%E8%B4%B9%E8%80%85%E5%9D%87%E8%A1%A1/"/>
    
    <category term="拉格朗日" scheme="https://www.gsgundam.com/tags/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5/"/>
    
    <category term="边际效用" scheme="https://www.gsgundam.com/tags/%E8%BE%B9%E9%99%85%E6%95%88%E7%94%A8/"/>
    
    <category term="均衡效用" scheme="https://www.gsgundam.com/tags/%E5%9D%87%E8%A1%A1%E6%95%88%E7%94%A8/"/>
    
  </entry>
  
  <entry>
    <title>Hexo创建404页面</title>
    <link href="https://www.gsgundam.com/archive/2015-02-01-hexo-create-404-page/"/>
    <id>https://www.gsgundam.com/archive/2015-02-01-hexo-create-404-page/</id>
    <published>2015-02-01T05:11:20.000Z</published>
    <updated>2015-02-01T15:07:57.558Z</updated>
    
    <content type="html"><![CDATA[<p>博客终于完成迁移了，累个半死。</p><p>整个架构已经搭建完成了，但是也有很多零碎的东西需要补充。比如<strong>没有404页面</strong>。</p><p>以前是Wordpress自己就带的，也懒得改了。这次得自己来了。</p><p>要创建404.html很容易，直接在source根目录下创建自己的404.html就可以。<code>hexo s</code>会直接在public目录下生成文件。</p><p>其实，404页面可以做更多有意义的事，来做个404公益项目吧。现在，看下我的404页面一个ibruce.info上不存在的页面，做点有意义的事情，也对得起这个域名。</p><p>从<a href="http://ibruce.info/2013/11/22/hexo-your-blog/">不如</a>的站上找来了几个公益404接入地址，我选择了益云的。可以看看效果：<a href="http://gsgundam.com/404.html">我的公益404页面</a></p><p><a href="http://www.qq.com/404/">腾讯公益404</a></p><p><a href="http://yibo.iyiyun.com/Home/Index/web404">404公益_益云(公益互联网)社会创新中心</a></p><p><a href="http://404page.missingkids.org.tw/">失蹤兒童少年資料管理中心404</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;博客终于完成迁移了，累个半死。&lt;/p&gt;
&lt;p&gt;整个架构已经搭建完成了，但是也有很多零碎的东西需要补充。比如&lt;strong&gt;没有404页面&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;以前是Wordpress自己就带的，也懒得改了。这次得自己来了。&lt;/p&gt;
&lt;p&gt;要创建404.html</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="404" scheme="https://www.gsgundam.com/tags/404/"/>
    
    <category term="page" scheme="https://www.gsgundam.com/tags/page/"/>
    
  </entry>
  
  <entry>
    <title>Hexo 无法生成CSS 样式文件</title>
    <link href="https://www.gsgundam.com/archive/2015-01-29-hexo-css-missing/"/>
    <id>https://www.gsgundam.com/archive/2015-01-29-hexo-css-missing/</id>
    <published>2015-01-29T13:02:27.000Z</published>
    <updated>2022-11-28T05:39:21.553Z</updated>
    
    <content type="html"><![CDATA[<p>使用了最新版本的Hexo，但是npm安装好以后，用<code>hexo g</code>始终无法生成css样式文件。</p><p>这下就该万能的谷哥登场了。在github上找到了解决方法，而且居然这个issue就在hexo项目里的……传送门在此：<a href="https://github.com/hexojs/hexo/issues/995">https://github.com/hexojs/hexo/issues/995</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm install hexo-renderer-stylus@0.1 --save</span><br></pre></td></tr></table></figure><p>然后继续自定义主题……</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;使用了最新版本的Hexo，但是npm安装好以后，用&lt;code&gt;hexo g&lt;/code&gt;始终无法生成css样式文件。&lt;/p&gt;
&lt;p&gt;这下就该万能的谷哥登场了。在github上找到了解决方法，而且居然这个issue就在hexo项目里的……传送门在此：&lt;a href=&quot;http</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="generate" scheme="https://www.gsgundam.com/tags/generate/"/>
    
    <category term="css" scheme="https://www.gsgundam.com/tags/css/"/>
    
    <category term="style" scheme="https://www.gsgundam.com/tags/style/"/>
    
    <category term="生成" scheme="https://www.gsgundam.com/tags/%E7%94%9F%E6%88%90/"/>
    
    <category term="stylus" scheme="https://www.gsgundam.com/tags/stylus/"/>
    
    <category term="render" scheme="https://www.gsgundam.com/tags/render/"/>
    
  </entry>
  
  <entry>
    <title>从Wordpress导出文章并转换成Markdown格式</title>
    <link href="https://www.gsgundam.com/archive/2015-01-30-export-posts-from-wordpress/"/>
    <id>https://www.gsgundam.com/archive/2015-01-30-export-posts-from-wordpress/</id>
    <published>2015-01-29T13:02:27.000Z</published>
    <updated>2022-11-28T05:39:21.553Z</updated>
    
    <content type="html"><![CDATA[<p>被木哈哈游说了两天才换博客，最主要的原因就是博文转移太麻烦了，更何况还要转成Markdown。</p><p>本来已经在一篇一篇的改了，今天木哈哈突然提醒我应该有工具的。想想也是，于是谷哥了一下，前人还真留下了点东西的。</p><p>这个工具本来是给jekyll用的，虽然我用的Hexo，但是他能导出markdown格式的文章就足够了。名字很不错<strong>ExitWP</strong>。嗯，虽然我很懒，但是被折磨得不轻的我，也赞同这个标题。</p><p>言归正传，先给个项目的传送门：<a href="https://github.com/thomasf/exitwp">https://github.com/thomasf/exitwp</a></p><p>这个项目大部分文件都2年没动过了，不过并不影响使用。</p><p>先说一下我的环境：</p><p>1、Wordpress 4.1</p><p>2、Hexo 2.8.3</p><p>3、Windows 8 x64</p><p>大概说一下使用方法吧：</p><p>1、从Wordpress导出文章或页面，在<code>工具→导出</code>里就可以办到，最后会得到若干个<code>xml</code>文件。</p><p>2、下载ExitWP项目到任何地方解压，可以直接<a href="https://github.com/thomasf/exitwp/zipball/master">下载</a>，也可以使用git clone。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git <span class="built_in">clone</span> https://github.com/thomasf/exitwp</span><br></pre></td></tr></table></figure><p>3、安装ExitWP的依赖，包括一下几个<a href="http://python.org/">Python</a>，<a href="http://pyyaml.org/wiki/PyYAML">PyYAML</a>，<a href="http://www.crummy.com/software/BeautifulSoup/">Beautiful soup</a>。可能最后一个以来需要说一下，因为Python和PyYAML都可以直接安装的，但是Beautiful soup需要命令行一下。其实也很简单，在命令行里cd到Beautiful soup的解压目录中，然后执行下面命令就可以了。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ python setup.py install</span><br></pre></td></tr></table></figure><p>4、将之前导出的所有<code>xml</code>文件复制到ExitWP解压目录的<code>wordpress-xml</code>目录中。</p><p>5、在命令行中cd到ExitWP的解压目录中，执行以下命令即可。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ python exitwp.py</span><br></pre></td></tr></table></figure><p>6、最后，会在<code>build/jekyll/&lt;你的域名&gt;</code>目录中找到很多让人头大的<code>.md</code>文件。</p><p>好了，不说了，我去哭一会。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;被木哈哈游说了两天才换博客，最主要的原因就是博文转移太麻烦了，更何况还要转成Markdown。&lt;/p&gt;
&lt;p&gt;本来已经在一篇一篇的改了，今天木哈哈突然提醒我应该有工具的。想想也是，于是谷哥了一下，前人还真留下了点东西的。&lt;/p&gt;
&lt;p&gt;这个工具本来是给jekyll用的，虽然</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="hexo" scheme="https://www.gsgundam.com/tags/hexo/"/>
    
    <category term="python" scheme="https://www.gsgundam.com/tags/python/"/>
    
    <category term="wordpress" scheme="https://www.gsgundam.com/tags/wordpress/"/>
    
    <category term="git" scheme="https://www.gsgundam.com/tags/git/"/>
    
    <category term="导出文章" scheme="https://www.gsgundam.com/tags/%E5%AF%BC%E5%87%BA%E6%96%87%E7%AB%A0/"/>
    
    <category term="markdown" scheme="https://www.gsgundam.com/tags/markdown/"/>
    
    <category term="转换" scheme="https://www.gsgundam.com/tags/%E8%BD%AC%E6%8D%A2/"/>
    
    <category term="exitwp" scheme="https://www.gsgundam.com/tags/exitwp/"/>
    
  </entry>
  
  <entry>
    <title>Cordova/Phonegap 给 iOS 模拟器指定设备</title>
    <link href="https://www.gsgundam.com/archive/2015-01-16-cordova-phonegap-specify-ios-emulator/"/>
    <id>https://www.gsgundam.com/archive/2015-01-16-cordova-phonegap-specify-ios-emulator/</id>
    <published>2015-01-16T05:02:40.000Z</published>
    <updated>2022-11-28T05:39:21.553Z</updated>
    
    <content type="html"><![CDATA[<p>备忘一下，怕忘了。</p><p>首先是通过cordova查看可以模拟的设备类型：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">    $ ./platforms/ios/cordova/lib/list-emulator-images </span><br><span class="line">    iPhone-4s</span><br><span class="line">    iPhone-5</span><br><span class="line">    iPhone-5s</span><br><span class="line">    iPhone-6-Plus</span><br><span class="line">    iPhone-6</span><br><span class="line">    iPad-2</span><br><span class="line">    iPad-Retina</span><br><span class="line">    iPad-Air</span><br><span class="line">    Resizable-iPhone</span><br><span class="line">    Resizable-iPad</span><br><span class="line">```  </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">不过实际测试下来iPhone只有以下三种尺寸可用：</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">```bash    </span><br><span class="line">    cordova <span class="built_in">emulate</span> ios --target=\&quot;iPhone-4s\&quot;</span><br><span class="line">    cordova <span class="built_in">emulate</span> ios --target=\&quot;iPhone-6\&quot;</span><br><span class="line">    cordova <span class="built_in">emulate</span> ios --target=\&quot;iPhone-6-Plus\&quot;</span><br></pre></td></tr></table></figure><p>以上。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;备忘一下，怕忘了。&lt;/p&gt;
&lt;p&gt;首先是通过cordova查看可以模拟的设备类型：&lt;/p&gt;
&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/spa</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="ipad" scheme="https://www.gsgundam.com/tags/ipad/"/>
    
    <category term="cordova" scheme="https://www.gsgundam.com/tags/cordova/"/>
    
    <category term="ios" scheme="https://www.gsgundam.com/tags/ios/"/>
    
    <category term="PhoneGap" scheme="https://www.gsgundam.com/tags/PhoneGap/"/>
    
    <category term="emulator" scheme="https://www.gsgundam.com/tags/emulator/"/>
    
    <category term="iphone" scheme="https://www.gsgundam.com/tags/iphone/"/>
    
    <category term="simulator" scheme="https://www.gsgundam.com/tags/simulator/"/>
    
    <category term="模拟器" scheme="https://www.gsgundam.com/tags/%E6%A8%A1%E6%8B%9F%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>Mac OS X 使用科学工具国内外访问分流必备神器 chnroutes</title>
    <link href="https://www.gsgundam.com/archive/2015-01-01-mac-os-x-vpn-divert-chnroutes/"/>
    <id>https://www.gsgundam.com/archive/2015-01-01-mac-os-x-vpn-divert-chnroutes/</id>
    <published>2015-01-01T06:53:32.000Z</published>
    <updated>2023-12-20T23:40:21.758Z</updated>
    
    <content type="html"><![CDATA[<p>因为手里的项目需要xcode和iOS模拟器，所以最近工作自然而然全都到了Mac OS X下（说实话也不想回Windows了）。但是很多资料度娘都是无力提供的（一直都想吐槽，程序猿实在是无力爱度娘啊，娇弱无力待人推啊），只能靠给力的谷哥来支撑各种技术需求，所以出墙是必须的了。</p><p>谷哥了一番，还真有如此神器！<strong>Mac 科学神器——chnroutes登场！！</strong></p><p>作者大神是条天朝汉子，在GitHub里他也说了，其实这个项目利用来自APNIC的数据生成路由命令脚本，让科学客户端在连接时自动执行。通过这些路由脚本，可以让用户在使用科学工具作为默认网关时，不使用科学访问中国国内IP，从而减轻科学工具负担，并提高访问国内网站的速度。大数据万岁啊！感谢APNIC和jimmyxu大神！</p><p>项目地址：<a href="https://github.com/jimmyxu/chnroutes">https://github.com/jimmyxu/chnroutes</a></p><p>此项目不仅仅是针对Mac，而且同时支持windows&#x2F;linux，以及基于linux的路由器。</p><p>Mac OS X下的使用步骤着实很简单：</p><ol><li><p>下载项目，解压chnroutes.py这个文件；</p></li><li><p>打开终端进入下载文件所在的目录，执行python chnroutes.py -p mac，在该目录下会生成2个文件，ip-up和ip-down；</p></li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ python chnroutes.py -p mac</span><br></pre></td></tr></table></figure><ol start="3"><li>打开Finder找到刚刚生成的2个文件，拷贝粘贴到&#x2F;etc&#x2F;ppp中；</li></ol><p>4. 回到终端，进入目录（&#x2F;etc&#x2F;ppp）执行：sudo chmod a+x ip-up ip-down</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cd</span> /etc/ppp</span><br><span class="line">$ sudo <span class="built_in">chmod</span> a+x ip-up ip-down</span><br></pre></td></tr></table></figure><p>结束了，就这么简单。连上测试一下吧。</p><p>如果一切正常的话，访问 <a href="http://www.whatismyip.com/">http://www.whatismyip.com/</a> 会显示为国外地址，访问 <a href="http://www.ip138.com/">http://www.ip138.com/</a> 则会显示为国内地址。</p><p>如果不想要分流了，直接把&#x2F;etc&#x2F;ppp下面那2个文件删了就行了。</p><p>Done.</p><p>PS：国内能不能搞个认证神马的，让因工作需要出墙的人更方便一点啊，这点钱一定要拿给私营企业来赚么？</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;因为手里的项目需要xcode和iOS模拟器，所以最近工作自然而然全都到了Mac OS X下（说实话也不想回Windows了）。但是很多资料度娘都是无力提供的（一直都想吐槽，程序猿实在是无力爱度娘啊，娇弱无力待人推啊），只能靠给力的谷哥来支撑各种技术需求，所以出墙是必须的了。</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="mac" scheme="https://www.gsgundam.com/tags/mac/"/>
    
    <category term="mac os x" scheme="https://www.gsgundam.com/tags/mac-os-x/"/>
    
    <category term="chnroutes" scheme="https://www.gsgundam.com/tags/chnroutes/"/>
    
    <category term="出墙" scheme="https://www.gsgundam.com/tags/%E5%87%BA%E5%A2%99/"/>
    
    <category term="分流" scheme="https://www.gsgundam.com/tags/%E5%88%86%E6%B5%81/"/>
    
  </entry>
  
  <entry>
    <title>Dell Inspiron 17R 7720 SE 安装 黑苹果 Mac OS X Yosemite 10.10 教程</title>
    <link href="https://www.gsgundam.com/archive/2014-12-18-dell-inspiron-17r-7720-se-intall-mac-os-x-yosemite-10-10/"/>
    <id>https://www.gsgundam.com/archive/2014-12-18-dell-inspiron-17r-7720-se-intall-mac-os-x-yosemite-10-10/</id>
    <published>2014-12-18T06:13:50.000Z</published>
    <updated>2018-11-07T05:46:52.137Z</updated>
    
    <content type="html"><![CDATA[<p>折腾了几天黑苹果，本来已经妥协，打算就用虚拟机跑黑苹果来完成手上的项目。但是现在虚拟机的速度，我·已·经·无·法·再·忍·受·了！很难想象我之前是怎么用虚拟机来做bsc的苹果版本的。</p><p>翻了很多国内的帖子，装遍了各种懒人版，可惜一个版本都无法成功。最后放弃了懒人版，直接原版安装，通过墙外谷歌解决了。基本完美，<a href="http://www.tonymacx86.com/yosemite-laptop-support/151080-guide-dell-inspiron-17r-7720-se-mac-os-x-yosemite-10-10-1-a.html">→原帖在此←</a>。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/hactonish-mac-yosemite-screenshot.png" alt="&quot;Yosemite截屏&quot;"></p><p>先说说大致情况和存在的问题，看官们先确认是否能接受：</p><ul><li><p>触摸板只有基本功能，无法实现手势（例如双指滚动、三指切换程序等）</p></li><li><p>默认内置WiFi模块无法工作（下文有替代方案）</p></li><li><p>音频和麦克风正常，但低音炮和HDMI音频不能工作</p></li><li><p>FN键可控制音频和多媒体（音量控制单独操作正常，但跟界面上的音量控制并不同步），背光正常（这是废话，因为是板子在控制），对于亮度、禁用触摸板、WiFi均不起作用（WiFi本来就不能工作……）</p></li><li><p>目测睡眠完美，测试5次，每次都能正常唤醒</p></li><li><p>主板虚拟化可以开启，但是安卓模拟器仍然无法使用x86镜像</p></li><li><p>读卡器不能识别</p></li><li><p>安装完蓝牙不能使用，但是可以在安装完成以后自行配置</p></li><li><p>亮度控制不太正常，有时会自动调到接近最亮，另外不能调到最暗，否则会黑屏（不要问我怎么知道的 <img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/emotion/noface2.jpg">）</p></li><li><p>ACPI传感器工作正常，使用了HWMonitor</p></li></ul><p>给个图看看吧：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/hactonish-mac-yosemite-summary.png" alt="&quot;配置图&quot;"></p><p>接着是我的机器配置：</p><ul><li><p>17.3” 寸全高清 1080p LED 防眩光显示器</p></li><li><p>第三代 Intel® 酷睿 i7-3630QM 2.4 Ghz</p></li><li><p>8GB 双通道 DDR3 SDRAM ，1600MHz</p></li><li><p>128GB Plextor SSD M5 PRO（已安装Windows 8.1 - MBR，有系统保留分区）</p></li><li><p>1TB 5400RPM SATA HDD ST1000LM024 HN-M101MBB（资料分区 - MBR）</p></li><li><p>32GB mSATA SSD SanDisk（用于安装Mac OS X Yosemite - GUID, BIOS 设置为 AHCI，mSATA无法作为启动盘，需要使用其他硬盘或者U盘启动）</p></li><li><p>NVIDIA GeForce GT 650M GDDR5 2GB (独显，必须用DSDT屏蔽掉)</p></li><li><p>Intel HD Graphics 4000 (内置显卡和HDMI enabled by DSDT+patched AppleIntelFramebufferCapri.kext )</p></li><li><p>WiFi (默认内置无线网卡无法启用，可以根据tonymacx86上的教程更换为Atheros 9285芯片的WiFi模块来驱动，也可以上EDUP系列USB网卡，推荐<a href="http://item.jd.com/870975.html">EDUP（EDUP） EP-MS1558 300M</a>，京东有卖，便宜好用）</p></li></ul><p>对于以上配置，7720之间的主要区别就是在于CPU了，你可以针对自己的CPU来配置电源管理，不过理论上不修改也可以用。</p><p>最后是需要准备的东西：</p><p>1、一台苹果电脑，或者可以运行苹果系统的虚拟机</p><p>2、一个大于8G的U盘（我是用的SanDisk Cruz Edge 16G）</p><p>3、下载Yosemite的App安装包（现已在下文的百度网盘中分享，<del>这里给一个异次元的<a href="http://www.iplaysoft.com/osx-yosemite.html">→下载地址←</a></del>，是10.10版本，看官们也可自行下载10.10.1版）</p><p>4、下载需要用到的工具和配置，包括UniBeast、U盘Extra文件夹、MutiBeast、Yosemite Extra文件夹和SLE文件夹。给一个百度网盘分享，如下：</p><p>链接: <a href="http://pan.baidu.com/s/1mg62uJe">http://pan.baidu.com/s/1mg62uJe</a> 密码: vyoa</p><p>以上内容都可以接受的童鞋们，你们可以继续往下看了。</p><h2 id="一、准备启动U盘"><a href="#一、准备启动U盘" class="headerlink" title="一、准备启动U盘"></a>一、准备启动U盘</h2><p>1、进入你已经准备的苹果电脑或者虚拟机，将下载好的Yosemite App安装包拷入应用程序文件夹（如果熟悉英文的童鞋，现在就可以把系统主语言切换为英文，运行UniBeast的时候需要）</p><p>2、插上U盘，运行磁盘工具，选中U盘</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/hactonish-usb-1.png" alt="&quot;选中U盘&quot;"></p><p>3、选中分区标签，然后选择1个分区</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/hactonish-usb-2.png" alt="&quot;选择分区方式&quot;"></p><p>4、点击选项，选择GUID分区表</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/hactonish-usb-3.png" alt="&quot;选择GUID分区表&quot;"></p><p>5、分区名称命名为USB，格式选择Mac OS 扩展（日志式），点击应用，开始格式化</p><p>6、解压下载的 <strong>UniBeast-5.0.2.zip</strong> ，打开UniBeast（记得把系统主语言改为英文），一路Continue、Continue、Continue、Agree，直到出现选择安装目标。选择USB，并Continue</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/hactonish-ub-1.png" alt="&quot;UniBeast&quot;"></p><p>7、接着选择Yosemite，继续Continue</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/hactonish-ub-2.png" alt="&quot;选择Yosemite&quot;"></p><p>8、选择Laptop Support，继续Continue</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/hactonish-ub-3.png" alt="&quot;选择Laptop Support&quot;"></p><p>9、输入登录密码，点击Install进行安装。等待大概15分钟（我的U盘是2.0接口，3.0应该会快很多），千万不要拔掉U盘、关机神马的</p><p>10、删除U盘里Extra文件夹里的内容，将之前下载文件中的 <strong>USB Drive-Extra.zip</strong> 中的内容解压到U盘里的Extra文件夹中</p><p>11、另外，建议删除蓝牙驱动，即S&#x2F;L&#x2F;E目录下的2个<strong>IOBlueToothxxxxx.kext</strong>，否则会出现强行让你开启蓝牙键盘开关的情况</p><p>12、建议将网盘 <strong>Tools.zip</strong> 里的文件都解压出来放到U盘根目录，用得着。</p><h2 id="二、安装Mac-OS-X-Yosemite"><a href="#二、安装Mac-OS-X-Yosemite" class="headerlink" title="二、安装Mac OS X Yosemite"></a>二、安装Mac OS X Yosemite</h2><p>1、插好U盘，启动Dell 7720 17R SE（如果之前步骤是用虚拟机做的，就重新启动计算机，你懂的），Bios设置进行如下修改：</p><ul><li><p>Intel SpeedStep ~ Enabled</p></li><li><p>Virtualization ~ Disabled</p></li><li><p>Integrated NIC ~ Enabled</p></li><li><p>USB Emulation ~ Enabled</p></li><li><p>USB Powershare ~ Enabled</p></li><li><p>USB Wake Support ~ Disabled</p></li><li><p>SATA Operation ~ AHCI</p></li></ul><p>这个时候一定要把虚拟化Vitualization禁用，不然启动过程会出问题，如果一定要启用，那就等所有内容配置好以后再启用。</p><p>同时记得设置USB优先启动，或者启动的时候按F12来选择启动盘。</p><p>2、在Chimera启动界面选择USB，启动参数最好加上 -v -f -x ，以便一次成功。我是没加-x也成功了的。加-v是为了看如果出问题，是出在哪里。其他启动参数已经在 org.chameleon.Boot.plist 中写好了</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/hactonish-restart.png" alt="&quot;Chimera启动界面&quot;"></p><p>3、进入OS X Yosemite后的安装就大概说说了，网上教程非常多。首先是格式化目标安装盘，仍然使用磁盘工具，参考之前制作启动U盘的步骤，选择要安装的目标硬盘，选中分区标签，格式化为一个分区，选项选择GUID分区表，格式选择Mac OS 扩展（日志式），取一个好记的名字（比如Mac OS X），点击应用。然后返回，接着就开始安装了。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/hactonish-disk-utility.png" alt="&quot;格式化Mac系统盘&quot;"></p><p>等上一会，系统就安装完毕了。</p><h2 id="三、配置Mac-OS-X-Yosemite"><a href="#三、配置Mac-OS-X-Yosemite" class="headerlink" title="三、配置Mac OS X Yosemite"></a>三、配置Mac OS X Yosemite</h2><p>保证U盘插好，重新启动系统。这里有个分支，如果你熟悉Windows下利用HFS+或者MacDrive来操作Mac分区文件，那接下来的工作在Windows里操作实在很方便。当然，在Mac OS X里也麻烦不到哪里去，实际上跟Windows下配置差不多。</p><p>1、Windows下进行配置</p><p>1.1 进入Windows系统，安装HFS+ 10.3（之前分享的百度网盘文件中已经提供 - <strong>hfs_win_trial_c10.3.zip</strong>），安装时选择10天试用，安装完毕后直接重新启动。重启进入Windows后，在注册窗口中填入zip压缩包注释中的内容，你懂的</p><p>1.2 这时候你应该已经可以看到Mac OS X的盘了。进入后完整删除Extra文件夹中的所有内容，将下载文件 <strong>YosemiteHD-Extra.zip</strong> 中的所有内容拷进去。然后进入 System&#x2F;Library&#x2F;Extensions&#x2F; ，将下载文件 <strong>YosemiteHD-SLE.zip</strong> 中的所有内容拷进去，如果有重复的，最好直接将原来已有的备份，然后删除</p><p>1.3 重新启动，继续选择USB，用之前可用的启动参数进入安装程序，选择磁盘工具，选中Mac OS X分区，点击修复磁盘权限</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/hactonish-repair-permission.png" alt="&quot;修复磁盘权限-1&quot;"></p><p>1.4 重新启动，选择Mac OS X，如果幸运的话，你已经可以不加任何参数进入了，当然，保险起见 -v -f 还是加上的好。</p><p>1.5 进入系统后，配置好你的账户，就可以进入系统了。建议不要创建网络账户，如果实在需要，也在进入系统后，配置好网络再说。如果你的Mac OS X系统盘没有使用SSD，那么恭喜你，安装已经完成了，享受你的黑苹果吧！</p><p>1.6 如果和我一样，Mac OS X是安装在SSD上的，那么我们还有点事情要做。下载百度网盘中的 <strong>Tools.zip</strong> ，解压后可以得到很多文件。只需要打开 <strong>Del Inspiron 7720 SE.mb</strong> ，这是已经配置好的MultiBeast文件。现在还需要勾选上TRIM Enabler，让SSD能够正常工作。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/hactonish-MultiBeast-Trim.png" alt="&quot;MultiBeast TRIM Enabler&quot;"></p><p>好了，这下是真的配置完成了。欢迎再看看最后的小结。</p><p>2、Mac OS X 下进行配置</p><p>2.1 Chimera启动界面选择Mac OS X，使用启动参数 -v -f -x，这次-x不能少。</p><p>2.2 依次执行Windows步骤中的1.2、1.6。记得在Finder的偏好设置→边栏里，把“xxx的Macbook Pro”勾选上，这样可以比较直观的看到文件夹路径。当然熟悉的童鞋用终端来拷贝可能更快，因为可能涉及到权限问题，终端直接sudo就ok了。如果实在不知道怎么将 <strong>YosemiteHD-SLE.zip</strong> 中的内容拷贝到系统中，可以使用 <strong>Tools.zip</strong> 解压后文件夹里的 <strong>Kext Wizard</strong> 来操作。选择Installation标签，然后将需要安装的kext选取到Browse里，勾选Backup kexts that will be replaced，目标位置选择S&#x2F;L&#x2F;E，点击Install安装即可</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/hactonish-Kext-Wizard-installation.png" alt="&quot;使用Kext Wizard安装Kext&quot;"></p><p>2.3 如果你的Mac OS X安装在SSD上，请参考Windows步骤中的1.6操作。如果不是，则直接到下一步。</p><p>2.4 打开百度网盘下载的 <strong>Tools.zip</strong> 解压后文件夹里的 <strong>Kext Wizard</strong>，在Maintenace标签页中勾选全部，点击Execute修复权限</p><p>![“修复磁盘权限-2”](<a href="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/hactonish-kext">https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/hactonish-kext</a> wizard-repair-permission.png)</p><p>好了，这种方式也是真的完成了。</p><h2 id="四、小结"><a href="#四、小结" class="headerlink" title="四、小结"></a>四、小结</h2><p>每次黑苹果都是一段闹心的历程，但愿这篇拙劣的教程能减少一些童鞋的烦恼。这篇教程已经尽量傻瓜式，跳过了诸如DSDT、SSDT等黑苹果过程必须了解的内容。如果有朋友能在此基础上进行改进，欢迎交流！</p><p>好久没写这么长的东西了，手残了啊……继续项目的iOS版开发了……</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;折腾了几天黑苹果，本来已经妥协，打算就用虚拟机跑黑苹果来完成手上的项目。但是现在虚拟机的速度，我·已·经·无·法·再·忍·受·了！很难想象我之前是怎么用虚拟机来做bsc的苹果版本的。&lt;/p&gt;
&lt;p&gt;翻了很多国内的帖子，装遍了各种懒人版，可惜一个版本都无法成功。最后放弃了懒人</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="7720" scheme="https://www.gsgundam.com/tags/7720/"/>
    
    <category term="dell" scheme="https://www.gsgundam.com/tags/dell/"/>
    
    <category term="戴尔" scheme="https://www.gsgundam.com/tags/%E6%88%B4%E5%B0%94/"/>
    
    <category term="10.10" scheme="https://www.gsgundam.com/tags/10-10/"/>
    
    <category term="mac os x" scheme="https://www.gsgundam.com/tags/mac-os-x/"/>
    
    <category term="Yosemite" scheme="https://www.gsgundam.com/tags/Yosemite/"/>
    
    <category term="黑苹果" scheme="https://www.gsgundam.com/tags/%E9%BB%91%E8%8B%B9%E6%9E%9C/"/>
    
    <category term="hactonish" scheme="https://www.gsgundam.com/tags/hactonish/"/>
    
    <category term="inspiron 17r" scheme="https://www.gsgundam.com/tags/inspiron-17r/"/>
    
    <category term="U盘引导" scheme="https://www.gsgundam.com/tags/U%E7%9B%98%E5%BC%95%E5%AF%BC/"/>
    
    <category term="傻瓜教程" scheme="https://www.gsgundam.com/tags/%E5%82%BB%E7%93%9C%E6%95%99%E7%A8%8B/"/>
    
    <category term="教程" scheme="https://www.gsgundam.com/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>VirtualBox调整Mac OS X 10.9 10.10分辨率</title>
    <link href="https://www.gsgundam.com/archive/2014-12-14-virtualbox-change-resolution-ratio-of-mac-os-x-10-9-10-10/"/>
    <id>https://www.gsgundam.com/archive/2014-12-14-virtualbox-change-resolution-ratio-of-mac-os-x-10-9-10-10/</id>
    <published>2014-12-14T07:32:20.000Z</published>
    <updated>2022-11-28T05:39:21.553Z</updated>
    
    <content type="html"><![CDATA[<p>本来想在硬盘上直接装黑苹果，无奈怎么都无法引导成功不说，还搞挂了一个分区。只好继续vbox黑苹果了。</p><p>之前有个已经装好10.9，但是分辨率只有默认的1024x768，各种不爽。</p><p>还记得博客里曾经有人问我怎么调整分辨率，虽然当时我也觉得太小，不过因为用mac的时间很少，就编译+发布，所以查得不多，也没找到办法。</p><p>这次仅靠度娘就找到了方法，分享一下。</p><p>在命令行中输入以下语句（注意，需要在vbox的安装目录下）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ VBoxManage setextradata \&quot;MacOSMavericks\&quot; VBoxInternal2/EfiGopMode 4</span><br></pre></td></tr></table></figure><p>其中&quot;MacOSMavericks&quot;要换成自己的虚拟机名称，而不同的分辨率对应如下：</p><pre><code>0 – 640×4801 – 800×6002 – 1024×7683 – 1280×10244 – 1440×9005 – 1920×1200</code></pre><p><strong>值得注意的是：如果发现没有效果，很可能你需要用管理员权限来打开cmd和vbox！</strong></p><p>以上方法10.10 Yosemite同样适用。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;本来想在硬盘上直接装黑苹果，无奈怎么都无法引导成功不说，还搞挂了一个分区。只好继续vbox黑苹果了。&lt;/p&gt;
&lt;p&gt;之前有个已经装好10.9，但是分辨率只有默认的1024x768，各种不爽。&lt;/p&gt;
&lt;p&gt;还记得博客里曾经有人问我怎么调整分辨率，虽然当时我也觉得太小，不过因</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="vbox" scheme="https://www.gsgundam.com/tags/vbox/"/>
    
    <category term="10.9" scheme="https://www.gsgundam.com/tags/10-9/"/>
    
    <category term="Mavericks" scheme="https://www.gsgundam.com/tags/Mavericks/"/>
    
    <category term="VirtualBOX" scheme="https://www.gsgundam.com/tags/VirtualBOX/"/>
    
    <category term="10.10" scheme="https://www.gsgundam.com/tags/10-10/"/>
    
    <category term="mac os x" scheme="https://www.gsgundam.com/tags/mac-os-x/"/>
    
    <category term="vboxmanage" scheme="https://www.gsgundam.com/tags/vboxmanage/"/>
    
    <category term="Yosemite" scheme="https://www.gsgundam.com/tags/Yosemite/"/>
    
    <category term="分辨率" scheme="https://www.gsgundam.com/tags/%E5%88%86%E8%BE%A8%E7%8E%87/"/>
    
    <category term="虚拟机黑苹果" scheme="https://www.gsgundam.com/tags/%E8%99%9A%E6%8B%9F%E6%9C%BA%E9%BB%91%E8%8B%B9%E6%9E%9C/"/>
    
    <category term="黑苹果" scheme="https://www.gsgundam.com/tags/%E9%BB%91%E8%8B%B9%E6%9E%9C/"/>
    
  </entry>
  
  <entry>
    <title>PC电脑数据恢复神器 电脑数据恢复工具箱</title>
    <link href="https://www.gsgundam.com/archive/2014-12-14-pc-data-recovery-toolbox/"/>
    <id>https://www.gsgundam.com/archive/2014-12-14-pc-data-recovery-toolbox/</id>
    <published>2014-12-14T01:02:59.000Z</published>
    <updated>2018-11-07T05:46:51.908Z</updated>
    
    <content type="html"><![CDATA[<p>因为出远门，黑苹果主机实在没法跟着带走，于是就惦记着需要的时候在自己的7720上装个黑苹果就行了。</p><p>但是，我万万没有想到，黑苹果没能成功装上，工作用的分区却挂了。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/emotion/ah!.jpg"></p><p>过程就不废话了，直接分享找到的好东西吧：</p><p>**《电脑数据恢复工具箱》 汉化新世纪出品 **</p><p><strong>下载地址：<a href="http://www.hanzify.org/software/13831.html">http://www.hanzify.org/software/13831.html</a></strong></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/recovery.jpg" alt="&quot;软件界面&quot;"></p><p>各种恢复软件的集合，而且全部可用，功能完全。</p><p>我就用了传统的EasyRecovery就恢复了所有文件，幸好幸好。</p><p>不然手里还有没完成的项目，不然估计客户都会发飙的。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/emotion/noface1.jpg"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;因为出远门，黑苹果主机实在没法跟着带走，于是就惦记着需要的时候在自己的7720上装个黑苹果就行了。&lt;/p&gt;
&lt;p&gt;但是，我万万没有想到，黑苹果没能成功装上，工作用的分区却挂了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="17r" scheme="https://www.gsgundam.com/tags/17r/"/>
    
    <category term="data recover" scheme="https://www.gsgundam.com/tags/data-recover/"/>
    
    <category term="dell 7720" scheme="https://www.gsgundam.com/tags/dell-7720/"/>
    
    <category term="easyrecovery" scheme="https://www.gsgundam.com/tags/easyrecovery/"/>
    
    <category term="数据恢复" scheme="https://www.gsgundam.com/tags/%E6%95%B0%E6%8D%AE%E6%81%A2%E5%A4%8D/"/>
    
    <category term="汉化新世纪" scheme="https://www.gsgundam.com/tags/%E6%B1%89%E5%8C%96%E6%96%B0%E4%B8%96%E7%BA%AA/"/>
    
    <category term="电脑数据恢复工具箱" scheme="https://www.gsgundam.com/tags/%E7%94%B5%E8%84%91%E6%95%B0%E6%8D%AE%E6%81%A2%E5%A4%8D%E5%B7%A5%E5%85%B7%E7%AE%B1/"/>
    
  </entry>
  
  <entry>
    <title>AngularJS 不得不了解的服务 $compile 用于动态显示html内容</title>
    <link href="https://www.gsgundam.com/archive/2014-12-13-angularjs-compile-to-show-dymanic-html-content/"/>
    <id>https://www.gsgundam.com/archive/2014-12-13-angularjs-compile-to-show-dymanic-html-content/</id>
    <published>2014-12-12T20:12:26.000Z</published>
    <updated>2022-11-28T05:40:02.254Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/angularjs.jpg"></p><p>项目中一度纠结与AngularJS如何动态显示不同的html内容。</p><p>本来是希望直接使用下面的语句来实现：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span>&gt;</span> &#123;&#123;html&#125;&#125; <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p>但是很尴尬的是，这样不能识别出html标签，而是直接将html里的页面标签全都显示出来了。这当然不是我想要的效果。</p><p>谷哥了一番，没想到在官网上就找到了我想要实现的效果，而实现的主角就是今天的 <strong>$compile</strong> 服务。</p><p><a href="https://docs.angularjs.org/api/ng/service/$compile">https://docs.angularjs.org/api/ng/service/$compile</a></p><p>节选一下关键部分内容，Javascript：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">&lt;script&gt;</span><br><span class="line">  angular.<span class="title function_">module</span>(<span class="string">&#x27;compileExample&#x27;</span>, [], <span class="keyword">function</span>(<span class="params">$compileProvider</span>) &#123;</span><br><span class="line">    <span class="comment">// configure new &#x27;compile&#x27; directive by passing a directive</span></span><br><span class="line">    <span class="comment">// factory function. The factory function injects the &#x27;$compile&#x27;</span></span><br><span class="line">    $compileProvider.<span class="title function_">directive</span>(<span class="string">&#x27;compile&#x27;</span>, <span class="keyword">function</span>(<span class="params">$compile</span>) &#123;</span><br><span class="line">      <span class="comment">// directive factory creates a link function</span></span><br><span class="line">      <span class="keyword">return</span> <span class="keyword">function</span>(<span class="params">scope, element, attrs</span>) &#123;</span><br><span class="line">        scope.$watch(</span><br><span class="line">          <span class="keyword">function</span>(<span class="params">scope</span>) &#123;</span><br><span class="line">             <span class="comment">// watch the &#x27;compile&#x27; expression for changes</span></span><br><span class="line">            <span class="keyword">return</span> scope.$eval(attrs.<span class="property">compile</span>);</span><br><span class="line">          &#125;,</span><br><span class="line">          <span class="keyword">function</span>(<span class="params">value</span>) &#123;</span><br><span class="line">            <span class="comment">// when the &#x27;compile&#x27; expression changes</span></span><br><span class="line">            <span class="comment">// assign it into the current DOM</span></span><br><span class="line">            element.<span class="title function_">html</span>(value);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// compile the new DOM and link it to the current</span></span><br><span class="line">            <span class="comment">// scope.</span></span><br><span class="line">            <span class="comment">// <span class="doctag">NOTE:</span> we only compile .childNodes so that</span></span><br><span class="line">            <span class="comment">// we don&#x27;t get into infinite loop compiling ourselves</span></span><br><span class="line">            $compile(element.<span class="title function_">contents</span>())(scope);</span><br><span class="line">          &#125;</span><br><span class="line">        );</span><br><span class="line">      &#125;;</span><br><span class="line">    &#125;);</span><br><span class="line">  &#125;)</span><br><span class="line">  .<span class="title function_">controller</span>(<span class="string">&#x27;GreeterController&#x27;</span>, [<span class="string">&#x27;$scope&#x27;</span>, <span class="keyword">function</span>(<span class="params">$scope</span>) &#123;</span><br><span class="line">    $scope.<span class="property">name</span> = <span class="string">&#x27;Angular&#x27;</span>;</span><br><span class="line">    $scope.<span class="property">html</span> = <span class="string">&#x27;Hello &#123;&#123;name&#125;&#125;&#x27;</span>;</span><br><span class="line">  &#125;]);</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure><p>Html：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">ng-controller</span>=<span class="string">&quot;GreeterController&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">input</span> <span class="attr">ng-model</span>=<span class="string">&quot;name&quot;</span>&gt;</span> <span class="tag">&lt;<span class="name">br</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">textarea</span> <span class="attr">ng-model</span>=<span class="string">&quot;html&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">textarea</span>&gt;</span> <span class="tag">&lt;<span class="name">br</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">compile</span>=<span class="string">&quot;html&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p>总之就是用$compile服务创建一个directive ‘compile’，这个complie会将传入的html字符串或者DOM转换为一个template，然后直接在html里调用compile即可。</p><p>我基本就是直接copy过来就可以用了，各位看官自便咯~</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/emotiondongnanzhi.jpg"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/angularjs.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;项目中一度纠结与AngularJS如何动态显示不同的html内</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="template" scheme="https://www.gsgundam.com/tags/template/"/>
    
    <category term="html" scheme="https://www.gsgundam.com/tags/html/"/>
    
    <category term="angularjs" scheme="https://www.gsgundam.com/tags/angularjs/"/>
    
    <category term="directive" scheme="https://www.gsgundam.com/tags/directive/"/>
    
    <category term="$compile" scheme="https://www.gsgundam.com/tags/compile/"/>
    
    <category term="dom" scheme="https://www.gsgundam.com/tags/dom/"/>
    
    <category term="html标签" scheme="https://www.gsgundam.com/tags/html%E6%A0%87%E7%AD%BE/"/>
    
    <category term="ngBink" scheme="https://www.gsgundam.com/tags/ngBink/"/>
    
    <category term="service" scheme="https://www.gsgundam.com/tags/service/"/>
    
    <category term="动态显示" scheme="https://www.gsgundam.com/tags/%E5%8A%A8%E6%80%81%E6%98%BE%E7%A4%BA/"/>
    
    <category term="服务" scheme="https://www.gsgundam.com/tags/%E6%9C%8D%E5%8A%A1/"/>
    
  </entry>
  
  <entry>
    <title>npm ERR! Failed to parse json, npm ERR cb() never called, NodeJS错误</title>
    <link href="https://www.gsgundam.com/archive/2014-12-11-npm-err-failed-to-parse-json-npm-err-cb-never-called-nodejs/"/>
    <id>https://www.gsgundam.com/archive/2014-12-11-npm-err-failed-to-parse-json-npm-err-cb-never-called-nodejs/</id>
    <published>2014-12-11T06:49:05.000Z</published>
    <updated>2018-11-07T04:53:53.114Z</updated>
    
    <content type="html"><![CDATA[<p>之前笔记本摔了一次，然后系统就各种毛病了，于是很悲剧的重装了系统。</p><p>在ubuntu下因为qq沟通太困难了，只好还是想办法恢复了Windows作业。但是Win妹还是很不争气的出了很多问题，最后一步就来自于NodeJS。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/nodejs.png"></p><p>npm install -g cordova的时候，虽然看起来只有2次错误，一次npm ERR! Failed to parse json，一次npm ERR cb() never called。但就这两个问题就耗掉了我一个下午去度娘谷哥。然而最后所有的搜索结果都没解决我的问题。</p><p>没办法，只好自己分析。昨天网络一直有点故障，不记得是不是那个时候装了codova，加上看到命令行工具里提示npm-cache里的某个package.json不对，于是到C:User你的目录AppDataRoamingnpm-cache里看了一下，果然对应的那个json文件只有2kb，打开一开是空的。随便检查了一下，还有几个也是空的。</p><p>索性把npm-cache全删了，重新安装。果然一切都好了……</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;之前笔记本摔了一次，然后系统就各种毛病了，于是很悲剧的重装了系统。&lt;/p&gt;
&lt;p&gt;在ubuntu下因为qq沟通太困难了，只好还是想办法恢复了Windows作业。但是Win妹还是很不争气的出了很多问题，最后一步就来自于NodeJS。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="cordova" scheme="https://www.gsgundam.com/tags/cordova/"/>
    
    <category term="nodejs" scheme="https://www.gsgundam.com/tags/nodejs/"/>
    
    <category term="npm" scheme="https://www.gsgundam.com/tags/npm/"/>
    
    <category term="npm err" scheme="https://www.gsgundam.com/tags/npm-err/"/>
    
    <category term="npm-cache" scheme="https://www.gsgundam.com/tags/npm-cache/"/>
    
    <category term="package.json" scheme="https://www.gsgundam.com/tags/package-json/"/>
    
  </entry>
  
  <entry>
    <title>cordova 3.6 a标签tel无效 无法拨号</title>
    <link href="https://www.gsgundam.com/archive/2014-11-22-cordova-3-6-tel-label-lose-efficacy/"/>
    <id>https://www.gsgundam.com/archive/2014-11-22-cordova-3-6-tel-label-lose-efficacy/</id>
    <published>2014-11-22T07:43:01.000Z</published>
    <updated>2022-11-28T05:38:24.148Z</updated>
    
    <content type="html"><![CDATA[<p>今天遇到一件奇事，在开发Hybrid App的过程中，发现直接用a标签，以前html5那么好用的代码，居然不管用了？！</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;tel:4008888888&quot;</span>&gt;</span>拨号吧！<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br></pre></td></tr></table></figure><p>这是几个意思？</p><p>谷歌度娘了好久，各种乱七八糟的解决方案都看过了，终于在google上发现了真相！</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/cordova-tel.jpg" alt="&quot;google上的答案&quot;"></p><p>总的来说，意思就是从cordova 3.6.0开始，mailto、geo、 sms等等这些非http请求的地址，也被列入限制范围内，需要在config.xml里加入白名单来允许访问。</p><p><code>-v</code>一下自己的cordova版本。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/cordova-v.jpg" alt="&quot;cordova版本&quot;"></p><p>呵呵</p><p>哎，不知道说什么了，已经没脾气了，解决了就好。</p><p>近来身体越来越透支了，得多吃点来撑住了。</p><p>话说，Fenix跟我都越来越没脾气了。据说人没了脾气就离成功不远了。</p><p>我们这是要成功的节奏？</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天遇到一件奇事，在开发Hybrid App的过程中，发现直接用a标签，以前html5那么好用的代码，居然不管用了？！&lt;/p&gt;
&lt;figure class=&quot;highlight html&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span c</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="cordova" scheme="https://www.gsgundam.com/tags/cordova/"/>
    
    <category term="PhoneGap" scheme="https://www.gsgundam.com/tags/PhoneGap/"/>
    
    <category term="html5" scheme="https://www.gsgundam.com/tags/html5/"/>
    
    <category term="a标签" scheme="https://www.gsgundam.com/tags/a%E6%A0%87%E7%AD%BE/"/>
    
    <category term="geo" scheme="https://www.gsgundam.com/tags/geo/"/>
    
    <category term="hybrid" scheme="https://www.gsgundam.com/tags/hybrid/"/>
    
    <category term="hybrid app" scheme="https://www.gsgundam.com/tags/hybrid-app/"/>
    
    <category term="mailto" scheme="https://www.gsgundam.com/tags/mailto/"/>
    
    <category term="sms" scheme="https://www.gsgundam.com/tags/sms/"/>
    
    <category term="tel" scheme="https://www.gsgundam.com/tags/tel/"/>
    
  </entry>
  
  <entry>
    <title>AngularJS vs jQuery 编程思想的对弈</title>
    <link href="https://www.gsgundam.com/archive/2014-10-31-angularjs-vs-jquery/"/>
    <id>https://www.gsgundam.com/archive/2014-10-31-angularjs-vs-jquery/</id>
    <published>2014-10-31T07:14:18.000Z</published>
    <updated>2015-02-04T01:08:24.594Z</updated>
    
    <content type="html"><![CDATA[<p>之前无论做什么页面都会条件反射性的引入jQuery，他的编程思想尤其适合设计师方向的开发者（或者说得更具体一点，是由设计师转型成为开发者的童鞋），以视觉为导向。</p><p>但是鉴于在移动平台上的碰壁，无论是jQuery本身，还是与它思想一致的zepto、jqMobi、jQuery Mobile，抛开为了简单的功能不得不写好几段代码这样的情况，更让人头疼的是，它们都难以避免的出现了效率问题，尤其是在安卓手机上。</p><p>于是开始了一段长达两个月的探索，寻找适合Html5应用开发的平台。最终，AngularJS和Titanium被选中，由于后者学习成本更高，因此出身于google的AngularJS成为了首选。</p><p>最初接触AngularJS是一段并不太顺利的过程，因为jQuery虽然是面向对象语言，但是默认就并非MVC模式，而是我自己戏称为过程式的面向对象语言。个人其实非常适应这种模式进行开发，对于我这样非技术出身的开发，更方便理解。然而，选中AngularJS就决定了我必须挑战我的习惯，因为它生来就是MV*(MVW、MVVM、MVC)框架，它将结构抽象到了一个更高更简化的层次。</p><p>在实战了几个项目以后，无意中发现了这篇文章《有jQuery背景，该如何用AngularJS编程思想？》（<a href="%22http://blog.jobbole.com/46589/%22">http://blog.jobbole.com/46589/</a>），仔细阅读了以后，我对AngularJS有了更好的认识，也更加理清了自己的学习和开发思路，也更坚定了近几个项目都不会混用jQuery和AngularJS的想法。</p><p>全文如下：</p><p>“我可以熟练使用jQuery进行客户端应用的开发，但是现在我希望开始使用Angular.js。哪位能描述一下这个过程中必要的模式变化吗？希望您的答案能够围绕下面这些具体的问题：</p><ol><li><p>我如何对客户端web应用进行不同方式的架构和设计？它们之间最大的区别是什么？（译者注：指jQuery和Angular.js）</p></li><li><p>有什么是我不该做或者不该使用的；而又有什么是我应该做或者应该使用的呢？</p></li><li><p>有没有一些服务端的考量&#x2F;约束呢？</p></li></ol><p>我在寻找的就是一个关于jQuery和Angular.js之间的详细的比较。”</p><h4 id="下面是来自-Josh-David-Miller-的最佳回答："><a href="#下面是来自-Josh-David-Miller-的最佳回答：" class="headerlink" title="下面是来自 Josh David Miller 的最佳回答："></a>下面是来自 <a href="%22http://stackoverflow.com/users/259038/josh-david-miller%22">Josh David Miller</a> 的最佳回答：</h4><h3 id="1-绝不要先设计你的页面，然后用DOM操作去改变它"><a href="#1-绝不要先设计你的页面，然后用DOM操作去改变它" class="headerlink" title="1. 绝不要先设计你的页面，然后用DOM操作去改变它"></a><strong>1. 绝不要先设计你的页面，然后用DOM操作去改变它</strong></h3><p>在jQuery中，你会先设计一个页面，然后让它变得动态化。这是因为jQuery是为了扩展而设计的，并在这个前提下变得越来越臃肿。</p><p>但是在Angular.js中， 你必须从一开始就在脑子里挂着架构的弦。不要一开始就想着“我有这样一个DOM，我想让它做X”， 你必须从你要完成的目标开始思考，然后设计你的应用， 最后才是设计你的视图。</p><h3 id="2-不要用-Angular-js-扩展-jQuery"><a href="#2-不要用-Angular-js-扩展-jQuery" class="headerlink" title="2. 不要用 Angular.js 扩展 jQuery"></a><strong>2. 不要用 Angular.js 扩展 jQuery</strong></h3><p>类似地，不要一开始就带着这样的想法：jQuery可以完成X，Y，Z，所以我只要在其上为模型和控制器添加Angular.js就行了。在起步阶段这确实很容易勾引你，这也是为什么我总是推荐Angular.js新手根本不要使用jQuery，至少要在他们习惯了“angular 方式”之后。</p><p>我在这里（译者注：指stackoverflow）和邮件列表上看到过很多开发者，他们用150或者200行代码的jQuery插件，然后利用一堆让人困惑的复杂的回调和$apply与Angular.js粘合起来建立这些详尽的解决方案；最终确实可以跑起来！ 但是其实这个问题在大多数情况下，我们可以用一小段Angular.js代码来重写jQuery插件即可，而这种方式会让一切刹那间简单明了可理解。</p><p>我觉得这类问题的底线是：当你在解决问题时，首先利用“Angular.js思想”去做；如果你不能想出一个方案，那么就在社区里询问；如果还是没有简单的解决方法，那么再请随意使用jQuery吧。但是注意，千万别让jqeury成为你的拐杖，不然你将永远无法真正精通Angular.js。</p><h3 id="3-永远根据架构去思考"><a href="#3-永远根据架构去思考" class="headerlink" title="3. 永远根据架构去思考"></a><strong>3. 永远根据架构去思考</strong></h3><p>首先你要知道，单页面结构也是应用。它不是网页。所以我们需要有服务端开发者思想加上客户端开发者思想。 我们必须考虑如何将我们的应用拆分为独立，可扩展，可测试的组件。</p><p>那么你要怎么做呢？你如何做到利用“angualrjs思想”呢？这里有一些普遍的原则，与jQuery作为比照。</p><p><strong>视图是“正式记录”</strong></p><p>在jQuery中，我们通过编程方式来改变视图。我们可以像下面这样通过ul标签来定义一个下拉菜单：</p><pre><code>&lt;ul class=&quot;main-menu&quot;&gt;    &lt;li class=&quot;active&quot;&gt;        &lt;a href=&quot;#/home&quot;&gt;Home&lt;/a&gt;    &lt;/li&gt;    &lt;li&gt;        &lt;a href=&quot;#/menu1&quot;&gt;Menu 1&lt;/a&gt;        &lt;ul&gt;            &lt;li&gt;&lt;a href=&quot;#/sm1&quot;&gt;Submenu 1&lt;/a&gt;&lt;/li&gt;            &lt;li&gt;&lt;a href=&quot;#/sm2&quot;&gt;Submenu 2&lt;/a&gt;&lt;/li&gt;            &lt;li&gt;&lt;a href=&quot;#/sm3&quot;&gt;Submenu 3&lt;/a&gt;&lt;/li&gt;        &lt;/ul&gt;    &lt;/li&gt;    &lt;li&gt;        &lt;a href=&quot;#/home&quot;&gt;Menu 2&lt;/a&gt;    &lt;/li&gt;&lt;/ul&gt;</code></pre><p>在jQuery中，根据我们应用的逻辑，可以用类似下面的语句来激活它。</p><pre><code>(&#39;.main-menu&#39;).dropdownMenu();</code></pre><p>当我们只是看着视图的时候，不会立刻看出它的功能。对于小应用而言，这样是没问题的。但是对于大型的应用，情况就一下子变得令人困惑并且难以维护。</p><p>但是在Angular.js中，视图是基于视图的功能的正式记录。我们的ul是像下面这样声明的：</p><pre><code>&lt;ul class=&quot;main-menu&quot; dropdown-menu&gt;...&lt;/ul&gt;</code></pre><p>这两者其实做了同样的事情，但是在Angular.js的版本中，任何看到这个模板的人都知道将要发生什么。不论何时，开发团队里有任何新的开发人员加入，她可以一眼看出有一个叫做dropdownMenu的指令作用在视图上；她根本不需要凭直觉猜测或者研究下代码才找到正确的答案。视图本身就告诉我们将会发生什么了。清晰多了。</p><p>angualrjs的新手经常会问这样一个问题： 我如何找到某一类所有的链接并且给它们添加一个指令呢？当看到我们回复的时候小伙伴都震惊了：压根别去这样做。但是劝你不要这样做的原因是，这样做就像是一半jQuery，一半angulrjs，而这真心很糟。这里的问题是，开发者想在angualrjs的情境中使用jQuery方式。而这绝对不会玩得转。视图是正式记录。超出指令的范围（这点下文会谈论更多），你绝不要去改变DOM。而且指令是应用在视图中的，目的自然也一目了然。</p><p>记住：不要先设计再修饰。你必须先进行架构，然后再考虑设计。</p><p><strong>数据绑定</strong></p><p>这是Angular.js目前最酷的特性之一，并且秒杀我前文提到的各种需要的DOM操作。不需要你自己动手，Angular.js将自动更新你的视图有木有!</p><p>在jQuery里， 我们响应事件并更新内容，大概是这个样子：</p><pre><code>$.ajax(&#123;  url: &#39;/myEndpoint.json&#39;,  success: function ( data, status ) &#123;    $(&#39;ul#log&#39;).append(&#39;&lt;li&gt;Data Received!&lt;/li&gt;&#39;);  &#125;&#125;);</code></pre><p>视图则看上去是这样的：</p><pre><code>&lt;ul class=&quot;messages&quot; id=&quot;log&quot;&gt;</code></pre><p>除了关注点混合的问题，这里同样有之前提到的表征目的的问题。更重要的是，我们不得不手动引用并更新dom节点。并且如果我们想要删除一个日志，我们不得不再次对dom编程操作。我们怎样才能抛开dom来测试逻辑呢？还有，如果我们希望改变展现呢？ 真是让人凌乱。。。 但是在Angular.js中，我们可以这样做：</p><pre><code>$http( &#39;/myEndpoint.json&#39; ).then( function ( response ) &#123;    $scope.log.push( &#123; msg: &#39;Data Received!&#39; &#125; );&#125;);</code></pre><p>我们的视图看上去是这样的：</p><pre><code>&lt;ul class=&quot;messages&quot;&gt;    &lt;li ng-repeat=&quot;entry in log&quot;&gt;&#123;&#123; entry.msg &#125;&#125;&lt;/li&gt;&lt;/ul&gt;</code></pre><p>但是考虑到刚才提到的问题，我们的视图看上去可以是这样的：</p><pre><code>&lt;div class=&quot;messages&quot;&gt;    &lt;div class=&quot;alert&quot; ng-repeat=&quot;entry in log&quot;&gt;        &#123;&#123; entry.msg &#125;&#125;    &lt;/div&gt;&lt;/div&gt;</code></pre><p>现在，替换掉了无序列表，我们使用Bootstrap警告框。同时我们根本不需要改变控制器代码！更重要的是，不论日志何时或者如何更新，视图也会跟着改变。自动的！漂亮！</p><p>虽然我没有在这里演示出来，但是数据绑定是双向的。所以这些日志信息同样可以在视图中被编辑，就像这样：</p><pre><code>&lt;input ng-model=&quot;entry.msg&quot; /&gt;</code></pre><p>是不是更开心了？</p><p><strong>不同的模型层</strong></p><p>在jQuery中，dom有点像模型。但是在angualrjs中，我们有一个分离的模型层， 而这个模型层可以让我们用任何方式管理，完全独立于视图。这对于上面说的数据绑定很有帮助， 还可以维护关注点分离，并且引入更多的可测试性。其它的答案提到了这点，所以我这里就不再赘述了。</p><p><strong>关注点分离</strong></p><p>以上所有的这些把我们带入了这样的主题：保持你的关注点分离。你的视图表现的像记录什么会发生（大部分情况）的正式记录；你的模型表现你的数据；你有一个服务层来执行可重用的任务；你执行dom操作并通过指令扩展你的视图；并且你用控制器来组合这些。这些同样已经在其它答案中提到，我在这里唯一还要提出的一个事情就是可测试性，我会在下文的另一节里专门讨论。</p><p><strong>依赖注入</strong></p><p>依赖注入是让我们实现关注点分离的方法。如果你是一个服务器端的开发者（从java到php），你可能对这个概念已经非常熟悉了，但是如果你是一个来自jQuery的客户端的朋友，那么你可能会认为这个概念是傻浅挫。但是它可不是：）</p><p>从一个更广的观点来看， 依赖注入意味着你可以非常自由的声明组件，然后你可以通过任意其它组件，呼叫一个它的实例，然后授权。</p><p>你不需要知道载入顺序，或者文件位置，或者其它类似的东西。这种强大的力量可能不会立刻显现，但是我这里会提供一个（通常）的例子：测试。</p><p>比如在我们的应用中，需要一个通过REST API，同时也依赖于应用状态，本地存储实现了服务器端存储的服务。当在我们的控制器上跑测试的时候，我们不希望与服务器端通讯-毕竟我们在测试控制器。我们能够仅仅添加一个与我们原始组件同名的mock服务，注入器将确保我们的控制器自动获取伪造对象–我们的控制器不会也不需要知道它们的区别。</p><p>那么既然提到测试……</p><h3 id="4-保持测试驱动的开发"><a href="#4-保持测试驱动的开发" class="headerlink" title="4. 保持测试驱动的开发"></a><strong>4. 保持测试驱动的开发</strong></h3><p>这个其实是关于架构的第三节的一部分，但是这个主题非常重要，所以我需要将其提出来作为自成体系的部分。</p><p>那些你看过，用过，写过的所有jQuery插件，它们中有多少有相应的测试包？不是很多吧？ 因为jQuery可不是很遵守这个规矩。但是angualrjs是。</p><p>在jQuery中， 测试的唯一方法是用示例页面来独立地创建组件，针对该页面我们的测试可以实施dom操作。于是我们就不得不分离地开发一个组件然后将其集成进我们的应用。多么不方便啊！</p><p>那么多时间啊，当我们使用jQuery开发时，我们选择使用迭代开发代替测试驱动的开发。可以谁又能怪我们呢？</p><p>但是因为我们有关注点分离，我们能够在Angular.js里反复使用测试驱动开发。举个例子，我们想要一个超简单的指令来指示在菜单中我们目前的路径是什么。我们可以在视图中这样声明我们想获取的：</p><pre><code>&lt;a href=&quot;/hello&quot; when-active&gt;Hello&lt;/a&gt;</code></pre><p>好了，我们现在可以写个测试：</p><pre><code>it( &#39;should add &quot;active&quot; when the route changes&#39;, inject(function() &#123;    var elm = $compile( &#39;&lt;a href=&quot;/hello&quot; when-active&gt;Hello&lt;/a&gt;&#39; )( $scope );     $location.path(&#39;/not-matching&#39;);    expect( elm.hasClass(&#39;active&#39;) ).toBeFalsey();     $location.path( &#39;/hello&#39; );    expect( elm.hasClass(&#39;active&#39;) ).toBeTruthy();&#125;));</code></pre><p>我们运行测试，并确认它是失败的。那么我们来写下我们的指令：</p><pre><code>.directive( &#39;whenActive&#39;, function ( $location ) &#123;    return &#123;        scope: true,        link: function ( scope, element, attrs ) &#123;            scope.$on( &#39;$routeChangeSuccess&#39;, function () &#123;                if ( $location.path() == element.attr( &#39;href&#39; ) ) &#123;                    element.addClass( &#39;active&#39; );                &#125;                else &#123;                    element.removeClass( &#39;active&#39; );                &#125;            &#125;);        &#125;    &#125;;&#125;);</code></pre><p>现在我们的测试通过了，并且我们的菜单按照请求运行。我们的开发是迭代并且测试驱动的，太酷了哦！</p><h3 id="5-从概念上来看，指令不是打包的jQuery"><a href="#5-从概念上来看，指令不是打包的jQuery" class="headerlink" title="5. 从概念上来看，指令不是打包的jQuery"></a><strong>5. 从概念上来看，指令不是打包的jQuery</strong></h3><p>你会经常听到“只在指令里做dom操作”。这是必要的。请对它表示出尊重！</p><p>但是让我们谈点更深入的。。。</p><p>一些指令只是装饰那些在视图里的已有的（想想ngClass），因此有时候就直接进行dom操作，基本上都能搞定。但是如果一个指令像个“widget”并有一个模板，</p><p>那它同样要遵守关注点分离原则。也就是说，这个模板也应该与它在链接和控制器函数里的实现保持最大的独立。</p><p>Angular.js自带着一套工具让这件事变得简单； 使用ngClass我们能够动态的更新类；ngBind允许双向的数据绑定；ngShow和ngHide以编程的方式显示或隐藏一个元素；还有更多–包括我们自己写的那些。换句话说， 我们可以不用DOM操作来实现所有的酷炫的事儿。 dom操作越少，指令越容易测试，它们也更容易样式化，在未来它们也更容易改变，并且也变得更加可重用和可分发。</p><p>我看到很多Angular.js开发新手将指令当做放置一堆jQuery的地方。换句话说， 他们认为：“既然我不能在控制器里做dom操纵，那么我就把这段代码放到指令里”。当然这看上去好多了，但是通常这仍然是错的。</p><p>想一下在第三节里我们编写的日志记录。即使我们将其放到一个指令里，我们仍然希望用“anggualjs方式”来做这件事情。这仍然没有做任何dom操作！在很多情况下dom操作是必须的，但是这种情况其实比你想的少得多！在你在你的应用中到处使用dmo操作之前，问问你自己，这真的是必须的吗。可能有更好的方法呢。</p><p>这里用一个简单的例子来展示我们经常会看到的一个模式。我们需要一个切换按钮。（注意：这个例子有那么一点人为设计的技巧并且有点啰嗦，但是很多更复杂的情况其实也完全可以根据这个例子的方式来解决。）</p><pre><code>.directive( &#39;myDirective&#39;, function () &#123;    return &#123;        template: &#39;&lt;a class=&quot;btn&quot;&gt;Toggle me!&lt;/a&gt;&#39;,        link: function ( scope, element, attrs ) &#123;            var on = false;             $(element).click( function () &#123;                if ( on ) &#123;                    $(element).removeClass( &#39;active&#39; );                &#125;                else &#123;                    $(element).addClass( &#39;active&#39; );                &#125;                 on = !on;            &#125;);        &#125;    &#125;;&#125;);</code></pre><p>这里有一些错误。第一，jQuery不是必须的。我们这里做的一切都不需要jQuery！第二， 即使是我们的页面上已经有jQuery，也没有理由一定要在这里使用它；我们可以简单的使用angular.element，而且就算在一个没有jQuery的项目中我们的组件仍然可以工作。第三，即使我们假设为了让这个指令工作，jQuery是必须的，如果jqury被加载，那么jqLite（angler.element）一定会使用jQuery。所以我们不需要使用$（译者注：jQuery的一个标识符号，是jQuery函数的别名）–我们可以使用angular.element。第四， 紧接第三点，jqLite元素不需要被包裹在$里–传递给link函数的element已经是一个jQuery元素！第五， 我上一节已经提过的，为什么我们要将模板混合进我们的逻辑呢？</p><p>这个指令可以更精简的重写（即时在更复杂的例子里也一样）：</p><pre><code>directive( &#39;myDirective&#39;, function () &#123;    return &#123;        scope: true,        template: &#39;&lt;a class=&quot;btn&quot; ng-class=&quot;&#123;active: on&#125;&quot; ng-click=&quot;toggle()&quot;&gt;Toggle me!&lt;/a&gt;&#39;,        link: function ( scope, element, attrs ) &#123;            scope.on = false;             scope.toggle = function () &#123;                scope.on = !$scope.on;            &#125;;        &#125;    &#125;;&#125;);</code></pre><p>再次强调，模板的那些代码都是在模板里的，所以你或者你的使用者能够很方便的将其换成一个符合任何需要的样式，同时逻辑不被改变。这就是重用性-赞！</p><p>当然，还有其它很多好处–比如测试 – 这很容易！ 不论什么在模板中，指令的内部API绝不会被接触，所以重构就变得容易。你可以在不接触指令的情况下随意改变你的模板。并且不论你怎么变，你的测试仍可以通过。</p><p>耶！</p><p>所以如果指令不只是一组jQuery风格的函数，那么它们是什么呢？指令其实就是html的扩展。如果html不能完成你希望它做的一些事情，你就写一个指令来做，并且当它是html的一部分来使用。</p><p>换句话说， 如果Angular.js一下子无法完成手头的工作，想想看你的团队是否能用ngClick、ngClass等来搞定它。</p><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a><strong>总结</strong></h3><p>别用jQuery。甚至都别引用它。它会阻碍你。当你有个问题已经知道怎么用jQuery来解决的时候，在你将手伸向$的时候，试试能不能在Angular.js的规范内解决。如果你不知道，就问！</p><p>十有八九最佳的方法是不需要jQuery的，而当你选择用jQuery的时候反而会导致更多的工作呢。</p><p>原文链接： <a href="%22http://stackoverflow.com/questions/14994391/how-do-i-think-in-angularjs-if-i-have-a-jquery-background?lq=1%22">stackoverflow</a></p><p>译文链接： <a href="%22http://blog.jobbole.com/46589/%22">http://blog.jobbole.com/46589/</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;之前无论做什么页面都会条件反射性的引入jQuery，他的编程思想尤其适合设计师方向的开发者（或者说得更具体一点，是由设计师转型成为开发者的童鞋），以视觉为导向。&lt;/p&gt;
&lt;p&gt;但是鉴于在移动平台上的碰壁，无论是jQuery本身，还是与它思想一致的zepto、jqMobi、j</summary>
      
    
    
    
    <category term="各种想法" scheme="https://www.gsgundam.com/categories/%E5%90%84%E7%A7%8D%E6%83%B3%E6%B3%95/"/>
    
    
    <category term="jQuery" scheme="https://www.gsgundam.com/tags/jQuery/"/>
    
    <category term="angular" scheme="https://www.gsgundam.com/tags/angular/"/>
    
    <category term="angularjs" scheme="https://www.gsgundam.com/tags/angularjs/"/>
    
    <category term="google" scheme="https://www.gsgundam.com/tags/google/"/>
    
    <category term="jqeury mobile" scheme="https://www.gsgundam.com/tags/jqeury-mobile/"/>
    
    <category term="jqmobi" scheme="https://www.gsgundam.com/tags/jqmobi/"/>
    
    <category term="mvc" scheme="https://www.gsgundam.com/tags/mvc/"/>
    
    <category term="mvvm" scheme="https://www.gsgundam.com/tags/mvvm/"/>
    
    <category term="mvw" scheme="https://www.gsgundam.com/tags/mvw/"/>
    
    <category term="titanium" scheme="https://www.gsgundam.com/tags/titanium/"/>
    
    <category term="zepto" scheme="https://www.gsgundam.com/tags/zepto/"/>
    
    <category term="客户端" scheme="https://www.gsgundam.com/tags/%E5%AE%A2%E6%88%B7%E7%AB%AF/"/>
    
    <category term="应用" scheme="https://www.gsgundam.com/tags/%E5%BA%94%E7%94%A8/"/>
    
    <category term="编程思想" scheme="https://www.gsgundam.com/tags/%E7%BC%96%E7%A8%8B%E6%80%9D%E6%83%B3/"/>
    
  </entry>
  
  <entry>
    <title>wordpress后台打开缓慢的解决方法</title>
    <link href="https://www.gsgundam.com/archive/2014-10-23-wordpress-backend-too-slow/"/>
    <id>https://www.gsgundam.com/archive/2014-10-23-wordpress-backend-too-slow/</id>
    <published>2014-10-22T21:40:44.000Z</published>
    <updated>2022-11-28T05:41:21.550Z</updated>
    
    <content type="html"><![CDATA[<p>前一段时间起就发现打开博客后台速度很慢。</p><p>在度娘和谷哥的帮助下了解到可能是谷歌字体的关系，自己用开发者调试工具对网络加载进行检测，发现确实后台使用了谷歌字体的API。谷歌早就被墙了，所以浏览器反复的请求谷歌服务器导致无法正常加载页面，拖慢速度也就是正常的了。</p><p>解决方法是在当前主题的functions.php中加入下面的代码：</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//禁用Open Sans</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Disable_Google_Fonts</span> </span>&#123;</span><br><span class="line"><span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line"><span class="title function_ invoke__">add_filter</span>( <span class="string">&#x27;gettext_with_context&#x27;</span>, <span class="keyword">array</span>( <span class="variable">$this</span>, <span class="string">&#x27;disable_open_sans&#x27;</span> ), <span class="number">888</span>, <span class="number">4</span> );</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">disable_open_sans</span>(<span class="params"> <span class="variable">$translations</span>, <span class="variable">$text</span>, <span class="variable">$context</span>, <span class="variable">$domain</span> </span>) </span>&#123;</span><br><span class="line"><span class="keyword">if</span> ( <span class="string">&#x27;Open Sans font: on or off&#x27;</span> == <span class="variable">$context</span> &amp;&amp; <span class="string">&#x27;on&#x27;</span> == <span class="variable">$text</span> ) &#123;</span><br><span class="line"><span class="variable">$translations</span> = <span class="string">&#x27;off&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="variable">$translations</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="variable">$disable_google_fonts</span> = <span class="keyword">new</span> <span class="title class_">Disable_Google_Fonts</span>;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;前一段时间起就发现打开博客后台速度很慢。&lt;/p&gt;
&lt;p&gt;在度娘和谷哥的帮助下了解到可能是谷歌字体的关系，自己用开发者调试工具对网络加载进行检测，发现确实后台使用了谷歌字体的API。谷歌早就被墙了，所以浏览器反复的请求谷歌服务器导致无法正常加载页面，拖慢速度也就是正常的了。&lt;</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="wordpress" scheme="https://www.gsgundam.com/tags/wordpress/"/>
    
    <category term="博客" scheme="https://www.gsgundam.com/tags/%E5%8D%9A%E5%AE%A2/"/>
    
    <category term="function.php" scheme="https://www.gsgundam.com/tags/function-php/"/>
    
    <category term="google fonts" scheme="https://www.gsgundam.com/tags/google-fonts/"/>
    
    <category term="open sans" scheme="https://www.gsgundam.com/tags/open-sans/"/>
    
    <category term="后台" scheme="https://www.gsgundam.com/tags/%E5%90%8E%E5%8F%B0/"/>
    
    <category term="谷歌" scheme="https://www.gsgundam.com/tags/%E8%B0%B7%E6%AD%8C/"/>
    
    <category term="谷歌api" scheme="https://www.gsgundam.com/tags/%E8%B0%B7%E6%AD%8Capi/"/>
    
  </entry>
  
  <entry>
    <title>AngularJS select详细用法</title>
    <link href="https://www.gsgundam.com/archive/2014-10-11-angularjs-selecte-label-usage/"/>
    <id>https://www.gsgundam.com/archive/2014-10-11-angularjs-selecte-label-usage/</id>
    <published>2014-10-11T03:45:04.000Z</published>
    <updated>2022-11-28T05:40:02.255Z</updated>
    
    <content type="html"><![CDATA[<p><strong>转自：<a href="http://my.oschina.net/gejiawen0913/blog/188539#OSC_h2_2">http://my.oschina.net/gejiawen0913/blog/188539#OSC_h2_2</a>，相当实用，尤其是实例3和4。</strong></p><p><code>select</code> 是 AngularJS 预设的一组directive。下面是其官网api doc给出的用法：<a href="http://docs.angularjs.org/api/ng.directive:select">AngularJS:select</a></p><p>大意是，<code>select</code>中的<code>ngOption</code>可以采用和<code>ngRepeat</code>指令类似的循环结构，其data source可以是array或者是object。针对两种data source又有衍生的好几种用法。但是官网的例子实在是太少了。</p><p>下面是针对几个不太容易理解的用法的例子。</p><p>先上controller</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">selectCtrl</span>(<span class="params">$scope</span>) &#123;</span><br><span class="line">    $scope.<span class="property">selected</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    $scope.<span class="property">model</span> = [&#123;</span><br><span class="line">        <span class="attr">id</span>: <span class="number">10001</span>,</span><br><span class="line">        <span class="attr">mainCategory</span>: <span class="string">&#x27;男&#x27;</span>,</span><br><span class="line">        <span class="attr">productName</span>: <span class="string">&#x27;水洗T恤&#x27;</span>,</span><br><span class="line">        <span class="attr">productColor</span>: <span class="string">&#x27;白&#x27;</span></span><br><span class="line">    &#125;, &#123;</span><br><span class="line">        <span class="attr">id</span>: <span class="number">10002</span>,</span><br><span class="line">        <span class="attr">mainCategory</span>: <span class="string">&#x27;女&#x27;</span>,</span><br><span class="line">        <span class="attr">productName</span>: <span class="string">&#x27;圆领短袖&#x27;</span>,</span><br><span class="line">        <span class="attr">productColor</span>: <span class="string">&#x27;黑&#x27;</span></span><br><span class="line">    &#125;, &#123;</span><br><span class="line">        <span class="attr">id</span>: <span class="number">10003</span>,</span><br><span class="line">        <span class="attr">mainCategory</span>: <span class="string">&#x27;女&#x27;</span>,</span><br><span class="line">        <span class="attr">productName</span>: <span class="string">&#x27;短袖短袖&#x27;</span>,</span><br><span class="line">        <span class="attr">productColor</span>: <span class="string">&#x27;黃&#x27;</span></span><br><span class="line">    &#125;];</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="实例一：基本下拉效果"><a href="#实例一：基本下拉效果" class="headerlink" title="实例一：基本下拉效果"></a>实例一：基本下拉效果</h2><p>usage: <em>label for value in array</em></p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">select</span> <span class="attr">ng-model</span>=<span class="string">&quot;selected&quot;</span> <span class="attr">ng-options</span>=<span class="string">&quot;m.productName for m in model&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">option</span> <span class="attr">value</span>=<span class="string">&quot;&quot;</span>&gt;</span>-- 请选择 --<span class="tag">&lt;/<span class="name">option</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">select</span>&gt;</span></span><br></pre></td></tr></table></figure><p><em>说明</em></p><ol><li><p>usage中的 value 也就是 ng-options 中的 m，而 m 是数组model的一个元素，它是一个变量</p></li><li><p>usage中的 label 也就是 ng-options 中的<code>m.productName</code>， 其实就是一个 <a href="http://docs.angularjs.org/guide/expression">AngularJS Expression</a></p></li></ol><h2 id="实例二：自定义下拉显示名称"><a href="#实例二：自定义下拉显示名称" class="headerlink" title="实例二：自定义下拉显示名称"></a>实例二：自定义下拉显示名称</h2><p>usage: <em>label for value in array</em></p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">select</span> <span class="attr">ng-model</span>=<span class="string">&quot;selected&quot;</span> <span class="attr">ng-options</span>=<span class="string">&quot;(m.productColor + &#x27; - &#x27; + m.productName) for m in model&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">option</span> <span class="attr">value</span>=<span class="string">&quot;&quot;</span>&gt;</span>-- 请选择 --<span class="tag">&lt;/<span class="name">option</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">select</span>&gt;</span></span><br></pre></td></tr></table></figure><p><em>说明</em></p><ol><li>可以看到，usage 中的 label 可以根据需求拼接出不同的字符串</li></ol><h2 id="实例三：-让选项分组"><a href="#实例三：-让选项分组" class="headerlink" title="实例三： 让选项分组"></a>实例三： 让选项分组</h2><p><em>usage</em>: label group by group for value in array</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">select</span> <span class="attr">ng-model</span>=<span class="string">&quot;selected&quot;</span> <span class="attr">ng-options</span>=<span class="string">&quot;(m.productColor + &#x27; - &#x27; + m.productName) group by m.mainCategory for m in model&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">option</span> <span class="attr">value</span>=<span class="string">&quot;&quot;</span>&gt;</span>-- 请选择 --<span class="tag">&lt;/<span class="name">option</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">select</span>&gt;</span></span><br></pre></td></tr></table></figure><p><em>说明</em></p><ol><li>这里使用了<code>group by</code>，通过<code>$scope.model</code>中的<code>mainCategory</code>字段进行分组</li></ol><h2 id="实例四：自定义ngModel的值"><a href="#实例四：自定义ngModel的值" class="headerlink" title="实例四：自定义ngModel的值"></a>实例四：自定义<code>ngModel</code>的值</h2><p><em>usage</em>: select as label for value in array</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">select</span> <span class="attr">ng-model</span>=<span class="string">&quot;selected&quot;</span> <span class="attr">ng-options</span>=<span class="string">&quot;m.id as m.productName for m in model&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">option</span> <span class="attr">value</span>=<span class="string">&quot;&quot;</span>&gt;</span>-- 请选择 --<span class="tag">&lt;/<span class="name">option</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">select</span>&gt;</span></span><br></pre></td></tr></table></figure><p><em>说明</em></p><ol><li>这种用法也是select指令最复杂的一种。从效果中可以看出，usage中select的作用就是重新定义<code>ng-model</code>的值。在这里，ng-model等于m.id，当<code>ng-model</code>发生改变的时候，得到的是<code>m.id</code>的值</li></ol><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ol><li><p><a href="http://docs.angularjs.org/api/ng.directive:select">http://docs.angularjs.org/api/ng.directive:select</a></p></li><li><p><a href="http://blog.miniasp.com/post/2013/05/12/AngularJS-ng-module-select-ngOptions-usage-samples.aspx">http://blog.miniasp.com/post/2013/05/12/AngularJS-ng-module-select-ngOptions-usage-samples.aspx</a></p></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;strong&gt;转自：&lt;a href=&quot;http://my.oschina.net/gejiawen0913/blog/188539#OSC_h2_2&quot;&gt;http://my.oschina.net/gejiawen0913/blog/188539#OSC_h2_2&lt;/a&gt;，</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="javascript" scheme="https://www.gsgundam.com/tags/javascript/"/>
    
    <category term="js" scheme="https://www.gsgundam.com/tags/js/"/>
    
    <category term="angular" scheme="https://www.gsgundam.com/tags/angular/"/>
    
    <category term="angularjs" scheme="https://www.gsgundam.com/tags/angularjs/"/>
    
    <category term="directive" scheme="https://www.gsgundam.com/tags/directive/"/>
    
    <category term="label" scheme="https://www.gsgundam.com/tags/label/"/>
    
    <category term="ngoption" scheme="https://www.gsgundam.com/tags/ngoption/"/>
    
    <category term="ngrepeat" scheme="https://www.gsgundam.com/tags/ngrepeat/"/>
    
    <category term="scope" scheme="https://www.gsgundam.com/tags/scope/"/>
    
    <category term="select" scheme="https://www.gsgundam.com/tags/select/"/>
    
    <category term="value" scheme="https://www.gsgundam.com/tags/value/"/>
    
    <category term="下拉" scheme="https://www.gsgundam.com/tags/%E4%B8%8B%E6%8B%89/"/>
    
    <category term="下拉框" scheme="https://www.gsgundam.com/tags/%E4%B8%8B%E6%8B%89%E6%A1%86/"/>
    
    <category term="下拉选项" scheme="https://www.gsgundam.com/tags/%E4%B8%8B%E6%8B%89%E9%80%89%E9%A1%B9/"/>
    
  </entry>
  
  <entry>
    <title>使用DNSCrypt解决DNS污染问题</title>
    <link href="https://www.gsgundam.com/archive/2014-09-26-dnscrypte/"/>
    <id>https://www.gsgundam.com/archive/2014-09-26-dnscrypte/</id>
    <published>2014-09-25T23:07:51.000Z</published>
    <updated>2018-11-07T04:53:53.300Z</updated>
    
    <content type="html"><![CDATA[<p><strong>转自：<a href="http://www.williamlong.info/archives/3890.html">http://www.williamlong.info/archives/3890.html</a> ，原文是为了解决dropbox无法访问的问题，我是为了解决onedrive无法访问的问题……</strong></p><p>DNSCrypt是OpenDNS发布的加密DNS工具，可加密DNS流量，阻止常见的DNS攻击，如重放攻击、观察攻击、时序攻击、中间人攻击和解析伪造攻击。DNSCrypt支持Mac OS和Windows，是防止DNS污染的绝佳工具。</p><p>DNSCrypt使用类似于SSL的加密连接向DNS服务器拉取解析，所以能够有效对抗DNS劫持、DNS污染以及中间人攻击。</p><p>DNSCrypt的Windows客户端版运行后，会自动在状态栏显示服务状态，并自动修改DNS服务器地址为127.0.0.1，通过本地加密的方式安全连接OpenDNS，这样，本地所有的DNS请求都会加密进行从而绕过DNS污染，最终顺利解析到正确IP地址，根据我的测试，这个工具可以一劳永逸地解决所有DNS污染问题，包括此次<a href="http://www.williamlong.info/archives/3889.html">针对Dropbox的DNS污染</a>。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/dns.jpg" alt="&quot;使用DNSCrypt解决DNS污染问题&quot;"></p><p>DNSCrypt官方介绍页面：<a href="http://www.opendns.com/about/innovations/dnscrypt/">http://www.opendns.com/about/innovations/dnscrypt/</a></p><p>DNSCrypt下载地址：<a href="http://shared.opendns.com/dnscrypt/packages/windows-client/DNSCryptWin-v0.0.6.exe">http://shared.opendns.com/dnscrypt/packages/windows-client/DNSCryptWin-v0.0.6.exe</a></p><p>DNSCrypt <a href="http://opendns.github.com/dnscrypt-osx-client/">MAC版源码</a>，<a href="https://github.com/opendns/dnscrypt-win-client">Windows版源码</a>。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;strong&gt;转自：&lt;a href=&quot;http://www.williamlong.info/archives/3890.html&quot;&gt;http://www.williamlong.info/archives/3890.html&lt;/a&gt; ，原文是为了解决dropbox无法访</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="dnscrypt" scheme="https://www.gsgundam.com/tags/dnscrypt/"/>
    
    <category term="dns劫持" scheme="https://www.gsgundam.com/tags/dns%E5%8A%AB%E6%8C%81/"/>
    
    <category term="dns污染" scheme="https://www.gsgundam.com/tags/dns%E6%B1%A1%E6%9F%93/"/>
    
    <category term="dropbox" scheme="https://www.gsgundam.com/tags/dropbox/"/>
    
    <category term="onedrive" scheme="https://www.gsgundam.com/tags/onedrive/"/>
    
    <category term="opendns" scheme="https://www.gsgundam.com/tags/opendns/"/>
    
    <category term="中间人攻击" scheme="https://www.gsgundam.com/tags/%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/"/>
    
  </entry>
  
  <entry>
    <title>戴尔Dell 17R Turbo 7720 更换风扇</title>
    <link href="https://www.gsgundam.com/archive/2014-09-23-dell-17r-turbo-7720-diy-change-fan/"/>
    <id>https://www.gsgundam.com/archive/2014-09-23-dell-17r-turbo-7720-diy-change-fan/</id>
    <published>2014-09-23T07:37:18.000Z</published>
    <updated>2018-11-07T04:53:53.353Z</updated>
    
    <content type="html"><![CDATA[<p>前段时间家里事情真不少，大人轮番感冒，小小宝肠炎+感冒，还有楼上漏水、碰伤、摔伤等一系列事情，搞得焦头烂额。关键时刻，连笔记本也不给面子，风扇不转，搞得每20分钟到1个小时电脑就要重启一次，搞得项目也没法做。</p><p>利用解决其它事情的空闲，跟戴尔客服咨询了一下维修的问题，悲剧的是风扇只有一年质保，明显我的已经过了。直接问客服价格，他也不清楚，给了我附近维修站的电话和地址。不问不知道，一问哎呀卧“哔—”。<strong>就这么个破风扇，非原装的就要收我150，吃人哪？哥书读的少，你别骗我。</strong></p><p>于是自己上淘宝搜了一下，果然很多**<a href="http://redirect.simba.taobao.com/rd?w=unionnojs&f=http://ai.taobao.com/auction/edetail.htm?e=VMMd0U5XlJ8jmraEDZVrLtbdyweLJZBmZ6U672N6gVGLltG5xFicOdXrTUTgh9sMDPIwxrc30rgCtVdTv6FH8AYRql%252BHP2cAFs4lzI5B9h51wzovgewU0m3abJM7sDg2rKsjw2brAriWdRmT3b5ysw%253D%253D&ptype=100010&from=basic&k=5ccfdb950740ca16&c=un&b=alimm_0&p=mm_51289531_5730227_25778948">Dell 7720 风扇</a>**的货，而且基本上都可以在含运费50以下的价格买到。幸好没上当。随便挑了一家先放购物车。</p><p>像我这么谨慎的人当然不可能立即下单了，首先必须要确认自己能换才行。于是风扇还没入手，就开始拆机了。</p><p>7720拆机非常简单，而且网上有**<a href="http://wenku.baidu.com/view/01e0d116a76e58fafab00325.html">完整的官方说明</a>**！戴尔的确有他的优势，连拆机都有官方说明，只要照做，一切ok。但是，即便如此简单也可能有意外的……下文会提到……</p><p>1、按说明拆下D面和C面的壳，螺丝一定不要弄混了。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/dell1.jpg" alt="&quot;&quot;"></p><p>2、特别注意拆D面的时候一定要把光驱连带拆下，不然D面有3颗螺丝是无法看到的。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/dell2.jpg" alt="&quot;&quot;"></p><p>3、是哪3颗螺丝呢？就是下图这里的螺孔了。有没有发现其中有一个孔不对劲？要大一点，而且有磨痕。<strong>因为悲剧就发生在这里啊！</strong>不知道是哪位大侠装配的时候菊花一紧，力道过猛，把这脆弱的铝制螺丝拧得死紧，我只用了两下就给拧花了，Orz……坑我呢哥？还好哥练过，正好俺爹的电钻还在……</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/dell3.jpg" alt="&quot;&quot;"></p><p>4、就是它了，一共用到两种批头。先用尖头（瓷砖打孔用）定位，以防后面使用小孔螺纹批头的时候位置打偏了。接着再用小孔螺纹磨掉整个螺丝的头部即可。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/dell4.jpg" alt="&quot;&quot;"></p><p>5、整个螺丝头部磨掉以后，壳自然就开了。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/dell5.jpg" alt="&quot;&quot;"></p><p>6、来欣赏一下打开后的杰（can）作（ju）吧！图中的亮点就是螺丝的尸体。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/dell6.jpg" alt="&quot;&quot;"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/dell7.jpg" alt="&quot;&quot;"></p><p>拆好了机，自然安装风扇就不在话下了。顺道还清理了一下灰尘。接着当然是：买了风扇，坐等2天，安装完毕，电脑复活！</p><p>苦逼的码字生活继续……</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;前段时间家里事情真不少，大人轮番感冒，小小宝肠炎+感冒，还有楼上漏水、碰伤、摔伤等一系列事情，搞得焦头烂额。关键时刻，连笔记本也不给面子，风扇不转，搞得每20分钟到1个小时电脑就要重启一次，搞得项目也没法做。&lt;/p&gt;
&lt;p&gt;利用解决其它事情的空闲，跟戴尔客服咨询了一下维修的</summary>
      
    
    
    
    <category term="DIY实战" scheme="https://www.gsgundam.com/categories/DIY%E5%AE%9E%E6%88%98/"/>
    
    
    <category term="拆机" scheme="https://www.gsgundam.com/tags/%E6%8B%86%E6%9C%BA/"/>
    
    <category term="17r" scheme="https://www.gsgundam.com/tags/17r/"/>
    
    <category term="7720" scheme="https://www.gsgundam.com/tags/7720/"/>
    
    <category term="dell" scheme="https://www.gsgundam.com/tags/dell/"/>
    
    <category term="官方拆机说明" scheme="https://www.gsgundam.com/tags/%E5%AE%98%E6%96%B9%E6%8B%86%E6%9C%BA%E8%AF%B4%E6%98%8E/"/>
    
    <category term="戴尔" scheme="https://www.gsgundam.com/tags/%E6%88%B4%E5%B0%94/"/>
    
    <category term="打孔" scheme="https://www.gsgundam.com/tags/%E6%89%93%E5%AD%94/"/>
    
    <category term="电钻" scheme="https://www.gsgundam.com/tags/%E7%94%B5%E9%92%BB/"/>
    
    <category term="风扇" scheme="https://www.gsgundam.com/tags/%E9%A3%8E%E6%89%87/"/>
    
  </entry>
  
  <entry>
    <title>目测最牛逼的语音输入法（没有之一）——讯飞输入法</title>
    <link href="https://www.gsgundam.com/archive/2014-08-24-the-best-speech-input-app/"/>
    <id>https://www.gsgundam.com/archive/2014-08-24-the-best-speech-input-app/</id>
    <published>2014-08-24T05:09:07.000Z</published>
    <updated>2018-11-07T05:41:32.399Z</updated>
    
    <content type="html"><![CDATA[<p><strong>【序】</strong></p><p>自从用了米2以后，曾经没少为输入法的问题折腾，问题出在对【美观、体验、功能】三者平衡的高标准严要求。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/emotion/serious.jpg"></p><p>第一个被淘汰的是搜狗。本来自己曾经是搜狗的老用户，体验、功能上面其实都还是不错的（尤其还有我自己的在线词库）。为什么淘汰呢？因为搜狗小米版不给力啊，阉割得太厉害了吧？那一定有人说你用原版好啦。这么说吧，如果原版有跟小米版一样的皮肤的话，估计我就用了。没办法，这就是一个看脸的世界。使用时间大概在5个月左右。</p><p>第二个被淘汰的是百度。这位选手我就不多说了，虽然电脑版还不错，但是手机版我没法吐槽了，这东西完全不是我的菜。亮点是它也有小米版，皮肤很和谐。不过也就仅此而已。使用时间大概在1个月左右。</p><p>省略掉中途试过的N多输入法（留下印象的也只有触宝而已，不过表现普普通通），下一个被正式淘汰的是QQ输入法。我用他完全是因为我是个泛QQ用户，凡是QQ有的服务，别家没有明显比他家好的，我就会用他的……QQ输入法其实表现也就是普普通通，皮肤也只能找到一个勉强合格的，但是毕竟是我PC上使用最久的输入法，词库最全，所以成为了到目前为止我使用时间最长的手机输入法。使用时间大概在8个月左右。</p><p>最后到了今天的主角，目前除了系统自带以外，唯一存活在我手机上的输入法——讯飞输入法。安装他完全是出于偶然，当年给父母的越狱ipad mini安装第3方输入法的时候，支持手写的根本就没有什么可选择的，当然就讯飞了。而且使用下来感觉还是很不错，识别率高，连笔都可以。</p><p>而我将他安装到我手机上的原因，正好是我需要一个在我不知道怎么拼的时候，能手写的输入法。</p><p>为什么不选别的呢？市面上可以手写的输入法到处都是。但是有一点，当时可以在键盘输入的同时直接手写的可不多，这点体验对我这样有追求（？）的人来说，非常重要。再加上之前对他使用上友好度的体验，识别率的感受，差不多就定下来用他了。</p><p>呵呵，其实没那么容易。我是个看脸的人，怎么可能只用功能和体验就打败我呢？所以最终让我使用这个从没真正了解过的输入法的原因是，当时他有一套用户自制的小米皮肤（后来被官方收为“典雅灰”了，看九宫格的笑脸表情就能明显分辨与其它官方皮肤不同）。嗯，我被征服了。</p><p><strong>【正文】</strong></p><p>前面扯太多了……以至我自己感觉好像都要结尾了似的……</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/emotion/noface2.jpg"></p><p>今天的题目是语音输入，所以讯飞那些NB的功能，像连笔输入、叠字输入什么的，其它输入法也有，也不是讨论范围内的东西。真正把其它输入法瞬间秒成渣渣的，就是语音输入功能了。</p><p>因为阿宝要帮单位一位不太懂电脑的师傅打一份文稿，而小小宝在她下班后是一定找她的，所以我得把这个任务接过来。嗯，看到几大页的字，我头都大了。</p><p>对于我这样能偷懒就一定要偷的人，怎么可能老老实实打字呢？所以我掏出了手机，准备体验讯飞输入法的看家本领——语音输入。人家科大讯飞本来就是专业从事智能语音及语音技术研究的啊。</p><p>体验下来本人有以下几点感受：</p><p>1、官方说识别率90%以上，这绝不是吹的。几千字的文稿输入下来，修改的地方没过三位数，而且大部分都是标点，文字除了人名以外很少出错。同时，要知道，这篇文稿涉及到很多专业术语。<strong>而这些术语完全正确，一个都没错！</strong></p><p>2、连续输入的情况下，只要阅读者正确断句，标点符号都能在正确的位置打出来。之所以说是正确的位置，是因为讯飞并不能完全正确的识别应该用什么标点符号。尤其是逗号和句号，基本没法分辨。而引号、顿号、书名号之类的就更不用想了。曾试过直接读出“顿号”这两个字，自然，讯飞很诚恳的把这两个字打在了屏幕上。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/emotion/noface1.jpg"></p><p>3、网络不稳定的情况下，还是需要下载离线语音的。离线语音包的识别率也还是很不错，对比24Mb的容量来说，实在很实惠。</p><p><strong>【附带】</strong></p><p>为什么还来个附带？因为手机保存失败了啊！输入几千字全部泡汤了啊有木有？！坑爹的手机版wps不带这样的！</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/emotion/bighead.jpg"></p><p>于是我回到PC上，抱着试一试的想法，安装了讯飞输入法电脑版。</p><p>不曾想到，PC上的讯飞也非常给力，识别率稍比手机端低，怀疑是麦克风的问题。对比QQ输入法的语音输入功能，200%一击必杀啊。</p><p><strong>【结论】</strong></p><p>讯飞输入法，个人目测最牛逼的语音输入法（没有之一）。</p><p><strong>【PS】</strong></p><p>就我现在这博客的pr、指数神马的，就足以说明这肯定不是软文。但是科大讯飞的朋友们，你们看我这么靠谱的用户，能给个什么奖励不？</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/emotion/hehe.jpg"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;strong&gt;【序】&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;自从用了米2以后，曾经没少为输入法的问题折腾，问题出在对【美观、体验、功能】三者平衡的高标准严要求。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shangh</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="功能" scheme="https://www.gsgundam.com/tags/%E5%8A%9F%E8%83%BD/"/>
    
    <category term="小米" scheme="https://www.gsgundam.com/tags/%E5%B0%8F%E7%B1%B3/"/>
    
    <category term="qq输入法" scheme="https://www.gsgundam.com/tags/qq%E8%BE%93%E5%85%A5%E6%B3%95/"/>
    
    <category term="体验" scheme="https://www.gsgundam.com/tags/%E4%BD%93%E9%AA%8C/"/>
    
    <category term="搜狗输入法" scheme="https://www.gsgundam.com/tags/%E6%90%9C%E7%8B%97%E8%BE%93%E5%85%A5%E6%B3%95/"/>
    
    <category term="搜狗输入法小米版" scheme="https://www.gsgundam.com/tags/%E6%90%9C%E7%8B%97%E8%BE%93%E5%85%A5%E6%B3%95%E5%B0%8F%E7%B1%B3%E7%89%88/"/>
    
    <category term="最牛逼的语音输入法" scheme="https://www.gsgundam.com/tags/%E6%9C%80%E7%89%9B%E9%80%BC%E7%9A%84%E8%AF%AD%E9%9F%B3%E8%BE%93%E5%85%A5%E6%B3%95/"/>
    
    <category term="百度输入法" scheme="https://www.gsgundam.com/tags/%E7%99%BE%E5%BA%A6%E8%BE%93%E5%85%A5%E6%B3%95/"/>
    
    <category term="百度输入法小米版" scheme="https://www.gsgundam.com/tags/%E7%99%BE%E5%BA%A6%E8%BE%93%E5%85%A5%E6%B3%95%E5%B0%8F%E7%B1%B3%E7%89%88/"/>
    
    <category term="美观" scheme="https://www.gsgundam.com/tags/%E7%BE%8E%E8%A7%82/"/>
    
    <category term="讯飞输入法" scheme="https://www.gsgundam.com/tags/%E8%AE%AF%E9%A3%9E%E8%BE%93%E5%85%A5%E6%B3%95/"/>
    
    <category term="讯飞输入法PC版" scheme="https://www.gsgundam.com/tags/%E8%AE%AF%E9%A3%9E%E8%BE%93%E5%85%A5%E6%B3%95PC%E7%89%88/"/>
    
    <category term="讯飞输入法小米版" scheme="https://www.gsgundam.com/tags/%E8%AE%AF%E9%A3%9E%E8%BE%93%E5%85%A5%E6%B3%95%E5%B0%8F%E7%B1%B3%E7%89%88/"/>
    
    <category term="讯飞输入法电脑版" scheme="https://www.gsgundam.com/tags/%E8%AE%AF%E9%A3%9E%E8%BE%93%E5%85%A5%E6%B3%95%E7%94%B5%E8%84%91%E7%89%88/"/>
    
    <category term="语音输入法" scheme="https://www.gsgundam.com/tags/%E8%AF%AD%E9%9F%B3%E8%BE%93%E5%85%A5%E6%B3%95/"/>
    
    <category term="输入法" scheme="https://www.gsgundam.com/tags/%E8%BE%93%E5%85%A5%E6%B3%95/"/>
    
  </entry>
  
  <entry>
    <title>Apache 定制日志</title>
    <link href="https://www.gsgundam.com/archive/2014-08-22-apache-custom-log/"/>
    <id>https://www.gsgundam.com/archive/2014-08-22-apache-custom-log/</id>
    <published>2014-08-22T07:00:49.000Z</published>
    <updated>2015-01-31T08:34:39.082Z</updated>
    
    <content type="html"><![CDATA[<p>最近公司服务器不断被攻击，很是伤脑筋啊。</p><p>判定攻击源和确定处理办法的第一步自然是查看日志，但是一看，有一种蛋蛋的忧桑……居然只有最基本的IP、访问时间、访问页面等信息，连user-agent都木有啊。</p><p>其实Apache的日志还是很强大的，我们可以在httpd.conf中找到下面这段代码：</p><pre><code>LogFormat \&quot;%h %l %u %t \&quot;%r\&quot; %&gt;s %b\&quot; common</code></pre><p>这就是日志格式定义的地方。该行指令创建了一种名为“common”的日志格式，日志的格式在双引号包围的内容中指定。格式字符串中的每个变量代表着一项特定的信息，这些信息按照格式串规定的次序写入到日志文件。</p><pre><code>%...a: 远程IP地址 %...A: 本地IP地址 %...B: 已发送的字节数，不包含HTTP头 %...b: CLF格式的已发送字节数量，不包含HTTP头。 例如当没有发送数据时，写入‘-’而不是0。 %e: 环境变量FOOBAR的内容 %...f: 文件名字 %...h: 远程主机 %...H 请求的协议 %i: Foobar的内容，发送给服务器的请求的标头行。 %...l: 远程登录名字（来自identd，如提供的话） %...m 请求的方法 %n: 来自另外一个模块的注解“Foobar”的内容 %o: Foobar的内容，应答的标头行 %...p: 服务器响应请求时使用的端口 %...P: 响应请求的子进程ID。 %...q 查询字符串（如果存在查询字符串，则包含“?”后面的 部分；否则，它是一个空字符串。） %...r: 请求的第一行 %...s: 状态。对于进行内部重定向的请求，这是指*原来*请求 的状态。如果用%...&gt;s，则是指后来的请求。 %...t: 以公共日志时间格式表示的时间（或称为标准英文格式） %t: 以指定格式format表示的时间 %...T: 为响应请求而耗费的时间，以秒计 %...u: 远程用户（来自auth；如果返回状态（%s）是401则可能是伪造的） %...U: 用户所请求的URL路径 %...v: 响应请求的服务器的ServerName %...V: 依照UseCanonicalName设置得到的服务器名字</code></pre><p>在所有上面列出的变量中，“…”表示一个可选的条件。如果没有指定条件，则变量的值将以“-”取代。分析前面来自默认httpd.conf文件的LogFormat指令示例，可以看出它创建了一种名为“common”的日志格式，其中包括：远程主机、远程登录名字、远程用户、请求时间、请求的第一行代码、请求状态，以及发送的字节数（LogFormat &quot;%h %l %u %t &quot;%r&quot; %&gt;s %b&quot; common）<br>有时候我们只想在日志中记录某些特定的、已定义的信息，这时就要用到”…”。如果在“%”和变量之间放入了一个或者多个HTTP状态代码，则只有当请求返回的状态属于指定的状态代码之一时，变量所代表的内容才会被记录。</p><p>观察刚才定义common处的上下文，我们还可以发现apache的默认配置文件就预置了多种格式，而combined就是我所需要的。只要把每个访问目录的CustomLog都使用combined就可以了。</p><p>PS：最后确定是CC攻击。小样们，我们准备好了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近公司服务器不断被攻击，很是伤脑筋啊。&lt;/p&gt;
&lt;p&gt;判定攻击源和确定处理办法的第一步自然是查看日志，但是一看，有一种蛋蛋的忧桑……居然只有最基本的IP、访问时间、访问页面等信息，连user-agent都木有啊。&lt;/p&gt;
&lt;p&gt;其实Apache的日志还是很强大的，我们可以</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="apache" scheme="https://www.gsgundam.com/tags/apache/"/>
    
    <category term="cc" scheme="https://www.gsgundam.com/tags/cc/"/>
    
    <category term="cc攻击" scheme="https://www.gsgundam.com/tags/cc%E6%94%BB%E5%87%BB/"/>
    
    <category term="combine" scheme="https://www.gsgundam.com/tags/combine/"/>
    
    <category term="common" scheme="https://www.gsgundam.com/tags/common/"/>
    
    <category term="customlog" scheme="https://www.gsgundam.com/tags/customlog/"/>
    
    <category term="httpd.conf" scheme="https://www.gsgundam.com/tags/httpd-conf/"/>
    
    <category term="log" scheme="https://www.gsgundam.com/tags/log/"/>
    
    <category term="logformat" scheme="https://www.gsgundam.com/tags/logformat/"/>
    
    <category term="定制" scheme="https://www.gsgundam.com/tags/%E5%AE%9A%E5%88%B6/"/>
    
    <category term="日志" scheme="https://www.gsgundam.com/tags/%E6%97%A5%E5%BF%97/"/>
    
    <category term="黑客攻击" scheme="https://www.gsgundam.com/tags/%E9%BB%91%E5%AE%A2%E6%94%BB%E5%87%BB/"/>
    
  </entry>
  
  <entry>
    <title>MySQL初始化数据表</title>
    <link href="https://www.gsgundam.com/archive/2014-08-15-mysql-initialize-table/"/>
    <id>https://www.gsgundam.com/archive/2014-08-15-mysql-initialize-table/</id>
    <published>2014-08-15T06:16:51.000Z</published>
    <updated>2022-11-28T05:40:46.604Z</updated>
    
    <content type="html"><![CDATA[<p>正在开发的一款Html5游戏快要上线了，Fenix很忙，而我数据库这块了解得不多，于是请教了一点知识来方便自己维护。</p><p>首先当然就是初始化数据表，把测试数据都干掉，不要影响正式游戏数据。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">    <span class="keyword">TRUNCATE</span> <span class="keyword">TABLE</span> table_name;</span><br><span class="line">```  </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">如果已经有数据，而且不希望删除，只希望把主键的起始值修改掉，那么：</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">```<span class="keyword">sql</span>     </span><br><span class="line">    <span class="keyword">alter</span> <span class="keyword">table</span> table_name AUTO_INCREMENT<span class="operator">=</span><span class="number">10000</span>;</span><br></pre></td></tr></table></figure><p>方便自己不要忘掉，我已经把它们存到了我的navicat for mysql中 :)</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;正在开发的一款Html5游戏快要上线了，Fenix很忙，而我数据库这块了解得不多，于是请教了一点知识来方便自己维护。&lt;/p&gt;
&lt;p&gt;首先当然就是初始化数据表，把测试数据都干掉，不要影响正式游戏数据。&lt;/p&gt;
&lt;figure class=&quot;highlight sql&quot;&gt;&lt;ta</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="数据" scheme="https://www.gsgundam.com/tags/%E6%95%B0%E6%8D%AE/"/>
    
    <category term="fenix" scheme="https://www.gsgundam.com/tags/fenix/"/>
    
    <category term="html5" scheme="https://www.gsgundam.com/tags/html5/"/>
    
    <category term="alter" scheme="https://www.gsgundam.com/tags/alter/"/>
    
    <category term="auto_increment" scheme="https://www.gsgundam.com/tags/auto-increment/"/>
    
    <category term="mysql" scheme="https://www.gsgundam.com/tags/mysql/"/>
    
    <category term="navicat" scheme="https://www.gsgundam.com/tags/navicat/"/>
    
    <category term="truncate" scheme="https://www.gsgundam.com/tags/truncate/"/>
    
    <category term="主键" scheme="https://www.gsgundam.com/tags/%E4%B8%BB%E9%94%AE/"/>
    
    <category term="数据库" scheme="https://www.gsgundam.com/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    <category term="数据表" scheme="https://www.gsgundam.com/tags/%E6%95%B0%E6%8D%AE%E8%A1%A8/"/>
    
    <category term="正式" scheme="https://www.gsgundam.com/tags/%E6%AD%A3%E5%BC%8F/"/>
    
    <category term="测试" scheme="https://www.gsgundam.com/tags/%E6%B5%8B%E8%AF%95/"/>
    
    <category term="清空" scheme="https://www.gsgundam.com/tags/%E6%B8%85%E7%A9%BA/"/>
    
  </entry>
  
  <entry>
    <title>小米2更换触摸屏</title>
    <link href="https://www.gsgundam.com/archive/2014-08-06-mi-2-diy-change-screen/"/>
    <id>https://www.gsgundam.com/archive/2014-08-06-mi-2-diy-change-screen/</id>
    <published>2014-08-05T23:27:05.000Z</published>
    <updated>2018-11-07T04:53:53.472Z</updated>
    
    <content type="html"><![CDATA[<p>前些天送小小宝去宝宝妈那里的时候，犯了个傻。充电器接触不好，本来要把扶手合上压住充电线插口，结果压下来以后才知道，手机位置没放对，压住屏幕了。是的，你没猜错，所以有了这篇日志。我的米2屏裂了……</p><p>刚开始我还觉得很庆幸，因为内屏没事，液晶屏照样显示得很好，所以以为没事，等按上去没反应才意识到……OGS全贴合原来还有这个缺点，想当初看人家的手机保护外屏裂了，照样用得挺好。我就没这么幸运了 T-T</p><p>第一反应当然是找小米官方服务，但是搜了一下，如果直接换屏，统一价490。太狗血了(　´Д&#96;)……况且最近的小米之家也得要1个小时才能过去，太远了。（好吧，其实主要还是因为那490……）</p><p>于是只好转战淘宝，卖的还挺多，价格也基本上没有过 300的。淘了很久淘到了这家店：【<a href="http://redirect.simba.taobao.com/rd?w=unionnojs&f=http://ai.taobao.com/auction/edetail.htm?e=ZFdTBysqm%252FIjmraEDZVrLnkUtYjk8a4EPw%252BjlVVlaO6LltG5xFicOdXrTUTgh9sMDPIwxrc30rgCtVdTv6FH8AYRql%252BHP2cAFs4lzI5B9h4Bx0V%252BY%252FyNfuIZWR1bMnHu&unid=51289531&ptype=100010&from=basic&k=5ccfdb950740ca16&c=un&b=alimm_0&p=mm_51289531_5730227_24176013">小米2屏幕总成</a>】。卖家很好，东西也很便宜，我选的原装后压不带框才170包邮，还送好些东西。据说原装后压的概念就是把好的外屏和好的内屏合在一起。个人认为没有原装总成那么完美，但是绝对值这个价。</p><p>对于唯一给店家这宝贝中评的那位朋友，我只想说你太认真了。想要纯正原装就不要省这点钱……</p><p>当然，我能发这个日志说明我选对了，我的米2复活了。后来因为光线感应的问题还咨询过卖家，结果他还特地打电话过来给我讲解。这么好的服务，赞一个！</p><p>废话说差不多了，来分享一下更换触摸屏的流程吧。</p><p>1、碎裂当天立即拆机（卖家宝贝页面有非常详尽的<a href="http://redirect.simba.taobao.com/rd?w=unionnojs&f=http://ai.taobao.com/auction/edetail.htm?e=ZFdTBysqm%252FIjmraEDZVrLnkUtYjk8a4EPw%252BjlVVlaO6LltG5xFicOdXrTUTgh9sMDPIwxrc30rgCtVdTv6FH8AYRql%252BHP2cAFs4lzI5B9h4Bx0V%252BY%252FyNfuIZWR1bMnHu&unid=51289531&ptype=100010&from=basic&k=5ccfdb950740ca16&c=un&b=alimm_0&p=mm_51289531_5730227_24176013">拆机视频</a>，建议看过有把握了以后再开干）。我看到主板背后写的字，虎躯一震。为毛突然觉得我的米2档次骤降……</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/mi-2-1.jpg" alt="&quot;主板&quot;"></p><p>2、把屏幕拆下来大概是这个样子的。螺丝共有3种，分类保管好，别丢了。还有供触摸、减震和绝缘的几个胶片也别弄丢了。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/mi-2-2.jpg" alt="&quot;拆机&quot;"></p><p>3、用电吹风开到热风档，把贴屏用的胶吹软，把屏幕取下来。我这屏幕取下来是真坑啊，下面的小碎片要挨着抠……但是这也是值得的，因为就这个外框还得要30块钱呢。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/mi-2-3.jpg" alt="&quot;取下外框&quot;"></p><p>4、拆完后的全家福，一个都不能丢啊！</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/mi-2-4.jpg" alt="&quot;拆机全家福&quot;"></p><p>5、这是卖家寄来的东西。包装没拍，其实包得特别好，尤其是屏幕。赠品包括：2张胶贴（用来把屏幕粘到外框上）、1个撬棒、1个小起子、1对螺丝封帖（没用上，反正也不会去小米之家修）、1张磨砂膜（卖家已帮忙贴到屏幕上，贴得非常完美）、1张高透膜、1个软胶保护套（本来我有保护套了，而且卖家送这个……太不适合我了……）。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/mi-2-5.jpg" alt="&quot;总成配件&quot;"></p><p>6、两块屏幕站对比较一下，真心看不出来区别。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/mi-2-6.jpg" alt="&quot;新旧屏幕&quot;"></p><p>7、背面比较。话说为毛我旧的屏幕后面的石墨散热层有这么多划痕？</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/mi-2-7.jpg" alt="&quot;新旧屏幕背部&quot;"></p><p>8、正式安装以前先测试一下。完全没问题，准备安装。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/mi-2-8.jpg" alt="&quot;屏幕测试&quot;"></p><p>9、先把外框上原来的胶全部清理干净（就是那些白色的），底部的屏幕碎片也再次确认都清理掉了。</p><p>然后把赠送的胶贴贴上去，好固定屏幕。卖家给了2个胶贴，如果1个贴坏了，还可以有备用的，很细心。</p><p>不过像我这样DIY成性的人，1个足矣 :D</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/mi-2-9.jpg" alt="&quot;去除旧胶&quot;"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/mi-2-10.jpg" alt="&quot;贴上新胶&quot;"></p><p>10、贴上屏幕，再把所有部件组合起来，完工。启动。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/mi-2-11.jpg" alt="&quot;组装完成&quot;"></p><p>使用2天以后有点小小的瑕疵，屏幕右上方有一条亮痕，但是只在黑屏下能看见。不过按照目前屏幕的工艺，这么一条亮痕想要扩散到影响使用，恐怕得等到我淘汰米2的那一天了吧。</p><p>之前提到光线感应有问题（微信尤其明显），我发现不是卖家跟我说的原因，应该是跟屏幕一点关系也没有，而是有可能我拆机的时候碰到哪里了。因为在使用小米手机的硬件测试（_#<em>#64663#</em>#_）时，发现光线感应数值一切正常。所以拆机有风险，DIY需谨慎哪。</p><p>不过对我来说，这次经历仍然非常完美。满足了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;前些天送小小宝去宝宝妈那里的时候，犯了个傻。充电器接触不好，本来要把扶手合上压住充电线插口，结果压下来以后才知道，手机位置没放对，压住屏幕了。是的，你没猜错，所以有了这篇日志。我的米2屏裂了……&lt;/p&gt;
&lt;p&gt;刚开始我还觉得很庆幸，因为内屏没事，液晶屏照样显示得很好，所以以</summary>
      
    
    
    
    <category term="DIY实战" scheme="https://www.gsgundam.com/categories/DIY%E5%AE%9E%E6%88%98/"/>
    
    
    <category term="淘宝" scheme="https://www.gsgundam.com/tags/%E6%B7%98%E5%AE%9D/"/>
    
    <category term="mi2" scheme="https://www.gsgundam.com/tags/mi2/"/>
    
    <category term="xiaomi" scheme="https://www.gsgundam.com/tags/xiaomi/"/>
    
    <category term="小米" scheme="https://www.gsgundam.com/tags/%E5%B0%8F%E7%B1%B3/"/>
    
    <category term="小米之家" scheme="https://www.gsgundam.com/tags/%E5%B0%8F%E7%B1%B3%E4%B9%8B%E5%AE%B6/"/>
    
    <category term="屏幕总成" scheme="https://www.gsgundam.com/tags/%E5%B1%8F%E5%B9%95%E6%80%BB%E6%88%90/"/>
    
    <category term="碎屏" scheme="https://www.gsgundam.com/tags/%E7%A2%8E%E5%B1%8F/"/>
    
    <category term="米2" scheme="https://www.gsgundam.com/tags/%E7%B1%B32/"/>
    
    <category term="触摸屏" scheme="https://www.gsgundam.com/tags/%E8%A7%A6%E6%91%B8%E5%B1%8F/"/>
    
  </entry>
  
  <entry>
    <title>Apache Cordova 3.5 安卓项目标准创建方式</title>
    <link href="https://www.gsgundam.com/archive/2014-08-06-apache-cordova-3-5-android-create-by-cli/"/>
    <id>https://www.gsgundam.com/archive/2014-08-06-apache-cordova-3-5-android-create-by-cli/</id>
    <published>2014-08-05T18:35:16.000Z</published>
    <updated>2022-11-28T05:39:21.553Z</updated>
    
    <content type="html"><![CDATA[<p>《账单分期计算器》的更新工作基本完成，只待发布了。记录一下这次新版本开发中有关Apache Cordova 安卓项目标准创建方式的过程。</p><p>之所以说是标准，是因为完全按照官方文档来创建，而不是像之前那篇日志《<a href="/2014-01-17-phonegap-develop-part-one-android-environment/">PhoneGap开发心得（一） 搭建PhoneGap+Eclipse+Android环境</a>》的做法。废话少说，开始吧。</p><p>1、首先是常规的环境要配置好，JDK（<a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html">点击这里下载</a>）、ADK（<a href="http://developer.android.com/sdk/index.html">点击这里下载</a>）、Eclipse（<a href="http://www.eclipse.org/downloads/">点击这里下载</a>）、Eclipse装上ADT插件（打开Eclipse中的菜单 “Help”-&gt;”InstallNewSoftware”进入软件安装界面，点击“Add”按钮，Location地址栏填入：<strong><a href="https://dl-ssl.google.com/android/eclipse/%EF%BC%89%E3%80%82">https://dl-ssl.google.com/android/eclipse/）。</a></strong>然后Node.js（<a href="http://nodejs.org/">http://nodejs.org/</a>）的安装，GIT（<a href="http://git-scm.com/">http://git-scm.com/</a>）的安装也是必不可少的。这些都跟之前的日志所描述的大同小异，就不赘述了。<strong>但是一定要记得把应该配置的环境变量配好！</strong></p><p>2、接着来看正规军的操作方式吧，我们准备安装配置最新的Cordova项目。我的主工作环境是Windows8，所以就写Windows下的方式啦。打开命令行工具（Win+R→cmd），输入：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">    C:&gt;npm install -g cordova</span><br><span class="line">```   </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">等待流程结束，cordova也下载配置完毕了。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">3、然后我们来创建一个项目：</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">```bash     </span><br><span class="line">    C:&gt;<span class="built_in">cd</span> [项目目录]</span><br><span class="line">    C:项目目录&gt;cordova create hello com.example.hello HelloWorld</span><br></pre></td></tr></table></figure><p>继续等待cordova CLI下载配置一堆东西，ok。</p><p>4、接下来创建android平台的内容。首先进入项目目录：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">C:项目目录&gt;<span class="built_in">cd</span> hello</span><br><span class="line">C:项目目录hello&gt;cordova platform add android</span><br></pre></td></tr></table></figure><p>很自然的，再次等待cordova CLI blablabla处理一堆玩意。</p><p>5、现在android项目也创建好了，然后我们该来点实际点的东西了。把之前写好的网站项目拷贝到 **C:项目目录hellowww **中，如果你有的项目将会发布多个平台，这一步会比较重要，因为它不但将省去你挨个向各个拷贝网站项目源码的过程，更重要的是会免除挨个检查遗漏和错误的悲惨经历。</p><p>从现在开始，就可以在这个www目录中编辑网站项目了。</p><p>但是别忘了，虽然这个时候你的项目里面可能没有cordova.js，但是仍然必须引入才可以，如果用到了插件，还需要引入cordova_plugins.js。</p><p>6、刚才拷贝到www目录的网站项目源码怎么在android平台项目中生效呢？很简单：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">C:项目目录hello&gt;cordova build</span><br></pre></td></tr></table></figure><p>当然，如果你的项目中已经有多个平台了，而你只希望编译android项目，那么：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">C:项目目录hello&gt;cordova build android</span><br></pre></td></tr></table></figure><p>7、下面轮到Eclipse登场了。打开Eclipse，新建一个项目，选择“Android Project from Existing Code”，然后选择C:项目目录helloplatformsandroid，然后导入所有项目。至此，标准方式创建完成。</p><p>8、为什么我要选择标准创建方式？因为添加各种插件十分方便，所以接下来是讲如何创建插件：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">C:项目目录hello&gt;cordova plugin add org.apache.cordova.network-information</span><br></pre></td></tr></table></figure><p>在此官方页面（<a href="http://cordova.apache.org/docs/en/3.5.0//guide_cli_index.md.html#The%20Command-Line%20Interface">http://cordova.apache.org/docs/en/3.5.0//guide_cli_index.md.html#The%20Command-Line%20Interface</a>）可以看到都有哪些插件可用。</p><p>好了，一切ok。记得每次修改了网站项目以后，都在CLI中build一次，这样才能保证Eclipse编译出来的项目是最新的。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;《账单分期计算器》的更新工作基本完成，只待发布了。记录一下这次新版本开发中有关Apache Cordova 安卓项目标准创建方式的过程。&lt;/p&gt;
&lt;p&gt;之所以说是标准，是因为完全按照官方文档来创建，而不是像之前那篇日志《&lt;a href=&quot;/2014-01-17-phoneg</summary>
      
    
    
    
    <category term="项目开发" scheme="https://www.gsgundam.com/categories/%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="apache" scheme="https://www.gsgundam.com/tags/apache/"/>
    
    <category term="windows" scheme="https://www.gsgundam.com/tags/windows/"/>
    
    <category term="android" scheme="https://www.gsgundam.com/tags/android/"/>
    
    <category term="安卓" scheme="https://www.gsgundam.com/tags/%E5%AE%89%E5%8D%93/"/>
    
    <category term="cordova" scheme="https://www.gsgundam.com/tags/cordova/"/>
    
    <category term="PhoneGap" scheme="https://www.gsgundam.com/tags/PhoneGap/"/>
    
    <category term="elcipse" scheme="https://www.gsgundam.com/tags/elcipse/"/>
    
    <category term="环境配置" scheme="https://www.gsgundam.com/tags/%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/"/>
    
    <category term="账单分期计算器" scheme="https://www.gsgundam.com/tags/%E8%B4%A6%E5%8D%95%E5%88%86%E6%9C%9F%E8%AE%A1%E7%AE%97%E5%99%A8/"/>
    
    <category term="项目创建" scheme="https://www.gsgundam.com/tags/%E9%A1%B9%E7%9B%AE%E5%88%9B%E5%BB%BA/"/>
    
    <category term="cli" scheme="https://www.gsgundam.com/tags/cli/"/>
    
  </entry>
  
  <entry>
    <title>js监听浏览器关闭刷新 兼容IE6+ Firefox Chrome Safari</title>
    <link href="https://www.gsgundam.com/archive/2014-07-22-js-listen-web-browser-close-refresh-ie6-firefox-chrome-safari/"/>
    <id>https://www.gsgundam.com/archive/2014-07-22-js-listen-web-browser-close-refresh-ie6-firefox-chrome-safari/</id>
    <published>2014-07-21T17:01:15.000Z</published>
    <updated>2022-11-28T05:40:02.255Z</updated>
    
    <content type="html"><![CDATA[<p>最近一个开发中的项目需要检测所有浏览器的关闭、刷新行为，但是普通的 <code>onbeforeunload</code> 不能满足要求，因为像Chrome就不响应，而有不少浏览器都是基于Chromium二次开发的，肯定会有相似的问题。</p><p>很幸运，度娘到了一个非常好用的方法，不敢藏匿，拿来与大家分享。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> <span class="title class_">UnloadConfirm</span> = &#123;&#125;;</span><br><span class="line"><span class="comment">//设置弹出信息内容</span></span><br><span class="line"><span class="title class_">UnloadConfirm</span>.<span class="property">MSG_UNLOAD</span> = <span class="string">&quot;数据尚未保存，离开后可能会导致数据丢失&quot;</span>;</span><br><span class="line"><span class="comment">//弹出框方法定义</span></span><br><span class="line"><span class="title class_">UnloadConfirm</span>.<span class="property">set</span> = <span class="keyword">function</span>(<span class="params">a</span>) &#123;</span><br><span class="line">    <span class="variable language_">window</span>.<span class="property">onbeforeunload</span> = <span class="keyword">function</span>(<span class="params">b</span>) &#123;</span><br><span class="line">        b = b || <span class="variable language_">window</span>.<span class="property">event</span>;</span><br><span class="line">        b.<span class="property">returnValue</span> = a;</span><br><span class="line">        <span class="keyword">return</span> a</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="comment">//清除弹出框方法</span></span><br><span class="line"><span class="title class_">UnloadConfirm</span>.<span class="property">clear</span> = <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="comment">//fckDraft.delDraftById(); //网上代码拷贝下来的内容，看上去没什么用，也没有一个叫做fckDraft的对象</span></span><br><span class="line">    <span class="variable language_">window</span>.<span class="property">onbeforeunload</span> = <span class="keyword">function</span>(<span class="params"></span>) &#123;&#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="comment">//调用弹出框方法</span></span><br><span class="line"><span class="title class_">UnloadConfirm</span>.<span class="title function_">set</span>(<span class="title class_">UnloadConfirm</span>.<span class="property">MSG_UNLOAD</span>);</span><br></pre></td></tr></table></figure><p>该方法兼容IE6+、Firefox、Chrome和Safari，而且对Alt+F4 、右键关闭都起作用。更厉害的是，对移动浏览器也一样好用。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近一个开发中的项目需要检测所有浏览器的关闭、刷新行为，但是普通的 &lt;code&gt;onbeforeunload&lt;/code&gt; 不能满足要求，因为像Chrome就不响应，而有不少浏览器都是基于Chromium二次开发的，肯定会有相似的问题。&lt;/p&gt;
&lt;p&gt;很幸运，度娘到了一个非</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="javascript" scheme="https://www.gsgundam.com/tags/javascript/"/>
    
    <category term="js" scheme="https://www.gsgundam.com/tags/js/"/>
    
    <category term="ie" scheme="https://www.gsgundam.com/tags/ie/"/>
    
    <category term="chrome" scheme="https://www.gsgundam.com/tags/chrome/"/>
    
    <category term="chromium" scheme="https://www.gsgundam.com/tags/chromium/"/>
    
    <category term="firefox" scheme="https://www.gsgundam.com/tags/firefox/"/>
    
    <category term="onbeforeunload" scheme="https://www.gsgundam.com/tags/onbeforeunload/"/>
    
    <category term="safari" scheme="https://www.gsgundam.com/tags/safari/"/>
    
    <category term="关闭" scheme="https://www.gsgundam.com/tags/%E5%85%B3%E9%97%AD/"/>
    
    <category term="刷新" scheme="https://www.gsgundam.com/tags/%E5%88%B7%E6%96%B0/"/>
    
    <category term="网页开发" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E9%A1%B5%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>作为一个有身份（证）的博客</title>
    <link href="https://www.gsgundam.com/archive/2014-07-21-website-record/"/>
    <id>https://www.gsgundam.com/archive/2014-07-21-website-record/</id>
    <published>2014-07-21T04:40:47.000Z</published>
    <updated>2015-01-31T13:56:34.950Z</updated>
    
    <content type="html"><![CDATA[<p>博客已经差不多一个星期打不开了，既没有被黑，也没有欠费，只是因为博主备案去了。</p><p>话说阿里云备案很给力啊，第二次使用了，用户体验再次提升。</p><p>不但全程免费，而且还免费顺丰寄送照相用的背景布。有任何问题，万网的妹子都会打电话过来通知修改，还会给出修改建议。全程都so easy，呵呵。</p><p>阿里云备案地址：<a href="http://beian.gein.cn/">http://beian.gein.cn</a>。</p><p>另外以前的看官们也应该发现博客的名字变了，原来叫“GSGundam知识库”，这是从博客大巴延续下来的名称，但是备案时不允许用“知识库”之类的名字。后来改了2次，万网妹子都电话过来说不行。</p><p>于是干脆不着急，回想了一下自己的历程，发现印证了一句老话“磨刀不误砍柴工”，用现代一点的名言则是引用乔布斯的斯坦福大学演讲中的一句“你必须相信这些片断会在你未来的某一天串连起来”。我到底经历了什么历程呢？从高中开始大概有这些：</p><p>1、高中跟着大学老师学了3年专业美术；</p><p>2、大学参加了动漫社团，做了1年创作部长；</p><p>3、大学自学html和网页开发IDE，并开设了1个校内下载站、1个校内学习站、1个校内论坛；</p><p>4、毕业后投过不少简历，选择了重庆一家较大的软件工作做游戏，碰巧后来几乎所有在重庆比较nx的游戏人都从这里出来，或者来这里工作过；</p><p>5、在重庆经历过一家创业公司担任主策后，又去了北京想学习运营，于是去了一家现在是页游巨头之一的公司；</p><p>6、可能是由于自己学习的特质，在又去了一家大型公司以后，在家参加了一个网页设计师班，这个也在之前的博文中提到了。虽然只有短短2、3个月，但是彻底补齐了我在网页设计和制作上的基本功空白；</p><p>7、最后以一家创业公司经历了整个开发流程和运营流程的经历结束了北京之行以后，回到了家乡自行创业；</p><p>8、现在的业务主要是网站和游戏。博主也意识到，正这么多年来的经历才造就了自己的今天（虽然还没有什么成绩……呵呵……）</p><p>好了，费这么大劲，想说的其实就是，我的博客改名叫“GSGundam砍柴工”了。说这么多也是为了让大家不要觉得这个名字太土……</p><p>我的话说完了。[鼓掌]</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;博客已经差不多一个星期打不开了，既没有被黑，也没有欠费，只是因为博主备案去了。&lt;/p&gt;
&lt;p&gt;话说阿里云备案很给力啊，第二次使用了，用户体验再次提升。&lt;/p&gt;
&lt;p&gt;不但全程免费，而且还免费顺丰寄送照相用的背景布。有任何问题，万网的妹子都会打电话过来通知修改，还会给出修改建</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="博客" scheme="https://www.gsgundam.com/tags/%E5%8D%9A%E5%AE%A2/"/>
    
    <category term="阿里云" scheme="https://www.gsgundam.com/tags/%E9%98%BF%E9%87%8C%E4%BA%91/"/>
    
    <category term="gsgundam" scheme="https://www.gsgundam.com/tags/gsgundam/"/>
    
    <category term="备案" scheme="https://www.gsgundam.com/tags/%E5%A4%87%E6%A1%88/"/>
    
    <category term="砍柴工" scheme="https://www.gsgundam.com/tags/%E7%A0%8D%E6%9F%B4%E5%B7%A5/"/>
    
    <category term="经历" scheme="https://www.gsgundam.com/tags/%E7%BB%8F%E5%8E%86/"/>
    
    <category term="身份" scheme="https://www.gsgundam.com/tags/%E8%BA%AB%E4%BB%BD/"/>
    
    <category term="身份证" scheme="https://www.gsgundam.com/tags/%E8%BA%AB%E4%BB%BD%E8%AF%81/"/>
    
  </entry>
  
  <entry>
    <title>群晖设置使用网络打印机</title>
    <link href="https://www.gsgundam.com/archive/2014-07-05-synology-network-printer-setup/"/>
    <id>https://www.gsgundam.com/archive/2014-07-05-synology-network-printer-setup/</id>
    <published>2014-07-05T05:11:06.000Z</published>
    <updated>2018-11-07T05:41:32.627Z</updated>
    
    <content type="html"><![CDATA[<p>家里的黑群晖已经运作了一段时间了，一切正常。</p><p>于是手贱的我自然会想到利用它更多的功能……比方说，网络打印机。</p><p>之所以想到这个功能，是因为5年前买过一台<a href="http://redirect.simba.taobao.com/rd?w=unionnojs&f=http://ai.taobao.com/auction/edetail.htm?e=haz7uXnugEvuDAZjWhpTWBYAQtrjujdYYS9AVrmcovTlL1tPWpvWRP7gvmtLyoa3Dlg3nJM8sR83aKJwFrfR4cfzu6InUy6hLLopGL8Ka5vDmlLruObVxdWkmprDaodj&unid=51289531&ptype=100010&from=basic&k=5ccfdb950740ca16&c=un&b=alimm_0&p=mm_51289531_5730227_23514643">佳能 Pixma ip1980</a>，现在功能完好（连外观都跟新的似的），但是由于桌面上实在没有地方放，于是现在每次用都要从放满东西的柜子里取出来，用完又放回去，神烦啊！</p><p>废话少说了，实现过程大概是这样的：</p><p>1、将打印机连上 <a href="http://redirect.simba.taobao.com/rd?w=unionnojs&f=http://ai.taobao.com/auction/edetail.htm?e=l7glTGC4eQ7ghojqVNxKsRhyaW24nDTuEUtHUPud5YyLltG5xFicOdXrTUTgh9sMDPIwxrc30rgCtVdTv6FH8AYRql%252BHP2cAFs4lzI5B9h4ViKKJRO%252FGxeIZWR1bMnHu&unid=51289531&ptype=100010&from=basic&k=5ccfdb950740ca16&c=un&b=alimm_0&p=mm_51289531_5730227_23234441">EeePC 1005PX</a> 上，打开电源。</p><p>2、打开群晖网页界面，选择 控制面板→外接设备→打印机。我这里直接已经识别到了打印机，但是原来的默认设置是不对的。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/synology-printer-list.jpg" alt="&quot;群晖打印机设置&quot;"></p><p>3、点击要设置的打印机，选择 打印机管理→设置打印机。因为ip1980只是一台打印机，没有其它功能，所以选择了网络打印机。同时启用AirPrint，方便家里的apple设备进行打印。最重要的是选择好打印机驱动程序。由于驱动列表中没有1900系列，所以我选择了可能最相近的2000系列驱动。幸运的是能够进行识别。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/synology-printer-assistent-option.jpg" alt="&quot;群晖打印机驱动&quot;"></p><p>4、接着使用群晖助手操作终端来安装设置网络打印机。打开群晖助手，选到打印机设备标签，点击新增按钮。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/synology-printer-assitent-setup.jpg" alt="&quot;新增打印机&quot;"></p><p>5、可以看到在设置向导里出现了需要添加的打印机，接着下一步，选择正确的驱动程序，安装完毕！</p><p><img src="/%22https:/gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/synology-printer-assitent-setup2.jpg" alt="&quot;选择驱动程序&quot;"></p><p>用笔记本测试打印了一下，一切正常，完美！</p><p>等抽空试试AirPrint。</p><p>话说等下一次有空闲了再倒腾一下看1005PX能不能网络唤醒（虽然理论上不太可能，这是一台笔记本啊喂！）。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;家里的黑群晖已经运作了一段时间了，一切正常。&lt;/p&gt;
&lt;p&gt;于是手贱的我自然会想到利用它更多的功能……比方说，网络打印机。&lt;/p&gt;
&lt;p&gt;之所以想到这个功能，是因为5年前买过一台&lt;a href=&quot;http://redirect.simba.taobao.com/rd?w=u</summary>
      
    
    
    
    <category term="DIY实战" scheme="https://www.gsgundam.com/categories/DIY%E5%AE%9E%E6%88%98/"/>
    
    
    <category term="nas" scheme="https://www.gsgundam.com/tags/nas/"/>
    
    <category term="synology" scheme="https://www.gsgundam.com/tags/synology/"/>
    
    <category term="群晖" scheme="https://www.gsgundam.com/tags/%E7%BE%A4%E6%99%96/"/>
    
    <category term="airprint" scheme="https://www.gsgundam.com/tags/airprint/"/>
    
    <category term="canon" scheme="https://www.gsgundam.com/tags/canon/"/>
    
    <category term="ip1900" scheme="https://www.gsgundam.com/tags/ip1900/"/>
    
    <category term="ip1980" scheme="https://www.gsgundam.com/tags/ip1980/"/>
    
    <category term="Pixma" scheme="https://www.gsgundam.com/tags/Pixma/"/>
    
    <category term="佳能" scheme="https://www.gsgundam.com/tags/%E4%BD%B3%E8%83%BD/"/>
    
    <category term="家用服务器" scheme="https://www.gsgundam.com/tags/%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="打印机" scheme="https://www.gsgundam.com/tags/%E6%89%93%E5%8D%B0%E6%9C%BA/"/>
    
    <category term="网络打印机" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E7%BB%9C%E6%89%93%E5%8D%B0%E6%9C%BA/"/>
    
    <category term="黑群辉" scheme="https://www.gsgundam.com/tags/%E9%BB%91%E7%BE%A4%E8%BE%89/"/>
    
  </entry>
  
  <entry>
    <title>关于IE8 CSS Hack</title>
    <link href="https://www.gsgundam.com/archive/2014-06-30-ie8-css-hack/"/>
    <id>https://www.gsgundam.com/archive/2014-06-30-ie8-css-hack/</id>
    <published>2014-06-30T02:05:25.000Z</published>
    <updated>2022-11-28T05:38:24.148Z</updated>
    
    <content type="html"><![CDATA[<p>这次的一个项目中，在一开始承诺了客户会处理掉IE8以上IE浏览器的问题，于是走上了不归路……</p><p>这次的问题主要有两个：</p><p>1、中部产品展示图片在IE8中不显示；</p><p>2、新闻Accordion内容错位。</p><p>其实这两个问题都很好解决：</p><p>1、随便google一下，就知道是 max-width:100% 造成的，改成 max-width:none 即可；</p><p>2、在不同的分辨率下（使用@media），写入分别适应不同的css样式即可。</p><p>既然说起来这么简单，为嘛我还要说是不归路呢？不就是因为要针对IE8的唯一CSS Hack么……不能影响其它浏览器……</p><p>算起来，我总共绕了三圈：</p><p>1、尝试在css里直接hack，这样的话，基本不会增加加载量，也不会影响运行效率。度娘谷哥了一下，的确有效的有这些：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">div</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="attribute">background-color</span>:red\<span class="number">0</span>;  <span class="comment">/* ie 8/9/10*/</span></span><br><span class="line"></span><br><span class="line"><span class="attribute">background-color</span>:blue9\<span class="number">0</span>;  <span class="comment">/* ie 9*/</span></span><br><span class="line"></span><br><span class="line">*<span class="attribute">background-color</span>:green;  <span class="comment">/* ie 7*/</span></span><br><span class="line"></span><br><span class="line">_background-<span class="attribute">color</span>:gray;  <span class="comment">/* ie 6*/</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>注意写csshack的顺序，其中：</p><p>1.<code>background-color:red\0;</code>IE8和IE9都支持；<br>2.<code>background-color:blue9\0;</code> 仅IE9支持；</p><p>(1)区别FF(IE8)与IE6 IE7</p><p><code>backgorund:orange;</code> FF和IE8背景色将为橘黄色</p><p><code>*backgorund:red;</code>   IE6和IE7背景色将为红色</p><p>(2)区别FF(IE8)与IE6与IE7</p><p><code>background:orange;</code>   FF和IE8背景色将为橘黄色</p><p><code>*background:red !important;</code>  IE7背景色将为红色</p><p><code>*background:blue;</code>     IE6背景色将为蓝色</p><p>(3)区别FF(IE8)与IE6与IE7</p><p><code>background:orange;</code>        FF和IE8背景色将为橘黄色</p><p><code>*background:red;</code>          IE7背景色将为红色</p><p><code>_background:blue;</code>         IE6背景色将为蓝色</p><p>(4)区别FF与IE6 IE7 IE8 IE9</p><p><code>color:gray;</code>       FF等非IE浏览器字体色将为灰色</p><p><code>color:red9;</code>     IE8 IE9字体色将为红色</p><p><code>*color:green;</code>     IE7字体色将为绿色</p><p><code>_color:blue;</code>     IE6字体色将为蓝色</p><p>但是为什么我最终放弃了呢？因为这个在比较简洁清晰的css里还比较好。但是这个项目运用了框架和各种js，css被修改的几率大大增加，导致追踪问题的复杂程度也加大。</p><p>说简单点，其直接后果就是IE8的问题解决了，同时又带来了IE9、10、11的问题，分别hack的时候，发现还有更多问题要解决。</p><p>记得以前余叔说过，<strong>如果一个解决办法在解决这个问题的同时还会带来新的问题，那这就不叫解决办法。</strong></p><p>2、直接用JS写CSS样式，这样相比前一个方式会增加加载量和渲染时间，但是只要能解决就好。</p><p>这样的话，主要是使用<!--[if]><![endif]-->的方法来判断浏览器类型，然后执行jQuery的CSS方法。</p><p>比如这样：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--[if IE 8]&gt;</span></span><br><span class="line"><span class="comment">&lt;script&gt;</span></span><br><span class="line"><span class="comment">    $(&#x27;#target&#x27;).css(&#123;</span></span><br><span class="line"><span class="comment">      &#x27;width&#x27;:auto;</span></span><br><span class="line"><span class="comment">      &#x27;max-width&#x27;:none;</span></span><br><span class="line"><span class="comment">    &#125;)</span></span><br><span class="line"><span class="comment">&lt;/script&gt;</span></span><br><span class="line"><span class="comment">&lt;![endif]--&gt;</span></span><br></pre></td></tr></table></figure><p>这个方法为什么也被抛弃了呢？说来也怪，明明跟之前CSS一样，但是居然不起作用。第一个方法折腾了太久，这个方法就懒得debug了，直接用最简单粗暴的方法解决好了。</p><p>3、最后用了最笨的方式，也是最耗费加载时间和效率的方式，但是也是最安全最不影响其它部分的方式。即是使用<!--[if]><![endif]-->的方法来判断浏览器类型，来加载css文件，而这个css文件里只写入针对IE8的样式修正。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--[if IE 8]&gt;</span></span><br><span class="line"><span class="comment">&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css/ie8.css&quot;&gt;</span></span><br><span class="line"><span class="comment">&lt;![endif]--&gt;</span></span><br></pre></td></tr></table></figure><p>好了，一切问题都解决了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;这次的一个项目中，在一开始承诺了客户会处理掉IE8以上IE浏览器的问题，于是走上了不归路……&lt;/p&gt;
&lt;p&gt;这次的问题主要有两个：&lt;/p&gt;
&lt;p&gt;1、中部产品展示图片在IE8中不显示；&lt;/p&gt;
&lt;p&gt;2、新闻Accordion内容错位。&lt;/p&gt;
&lt;p&gt;其实这两个问题都很好解</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="javascript" scheme="https://www.gsgundam.com/tags/javascript/"/>
    
    <category term="js" scheme="https://www.gsgundam.com/tags/js/"/>
    
    <category term="css" scheme="https://www.gsgundam.com/tags/css/"/>
    
    <category term="hack" scheme="https://www.gsgundam.com/tags/hack/"/>
    
    <category term="ie" scheme="https://www.gsgundam.com/tags/ie/"/>
    
    <category term="ie8" scheme="https://www.gsgundam.com/tags/ie8/"/>
    
    <category term="ie9" scheme="https://www.gsgundam.com/tags/ie9/"/>
    
    <category term="浏览器判断" scheme="https://www.gsgundam.com/tags/%E6%B5%8F%E8%A7%88%E5%99%A8%E5%88%A4%E6%96%AD/"/>
    
  </entry>
  
  <entry>
    <title>EeePC 1005PX 黑群晖NAS实战</title>
    <link href="https://www.gsgundam.com/archive/2014-06-22-eeepc-1005px-hack-synology-diy/"/>
    <id>https://www.gsgundam.com/archive/2014-06-22-eeepc-1005px-hack-synology-diy/</id>
    <published>2014-06-22T04:29:53.000Z</published>
    <updated>2018-11-07T04:53:53.412Z</updated>
    
    <content type="html"><![CDATA[<p>标题写得很大，其实非常easy……最终成品只花了2个小时就搞定了全部的东西……</p><p>先来看看漂亮的5.0界面 :)</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/synology-screenshot.jpg" alt="&quot;群晖5.0界面&quot;"></p><ol><li>大概说一下背景吧：</li></ol><p>最初想入手一台nas，完全是因为小小宝的诞生。家里所有人都录像、拍照、录音，结果所有东西都分散了。于是想到需要有一台家用服务器来汇总存储小小宝的各种资料，免得大家的设备出现什么问题，结果再也找不回这些东西。毕竟曾经就因为小本硬盘、台式机硬盘、西数移动硬盘同时挂掉，一部分婚纱照的底片就从此消失了。想起来以前统计学老师上课说的：<strong>小概率事件不会发生，但是必然发生</strong>……</p><p>在网上搜索了很多信息，了解到原来nas不仅仅是我原本想像的作为存储，nas也不仅仅是一堆NB的服务器硬件，它应该是一个软硬件套件，是作为终端设备的延伸，是对终端设备在实用性和易用性方面的扩展。</p><p>在充分了解了的西数 MyBook系列、D-Link DNS系列、铁威马、ORICO和群晖（Synology DiskStation）几个主流品牌系列以后，<strong>我认定群晖就是我要寻找的The One</strong>。尽管在数据安全性、硬盘损耗方面，群晖是普遍遭人诟病的。但是综合它漂亮的界面、良好的操作体验、众多的系统套件（尤其能与百度云同步，在我看来完美的解决了数据安全性问题）。</p><ol start="2"><li>选好了自然就该动手了：</li></ol><p>上网转一圈群晖，差点吓尿，最便宜的不带硬盘999，虽然用料看起来还是不错，但是那性能跟自己买配件比渣得……这哪里是我等屌丝玩得起的东西……</p><p>但是，还发现了个好东西——黑群晖。似乎名称取自于黑苹果，说白了就是破解了的群晖系统。有了这东西，不就是我们屌丝的福音么！</p><p>琢磨着在网上捣鼓一下硬件DIY吧，之前不是还整了个<a href="/2014-06-06-tp-link-wr842n-cooling-diy/">《TP-Link WR842N 路由散热DIY》</a>么。于是在网上淘了块别人 <a href="http://item.taobao.com/item.htm?spm=a230r.1.0.0.KXb0Mb&id=35620630661&ns=1#detail">推荐的主板</a> ，东西很新，老板人也很好，可惜似乎我自己的内存条跟它不配，折腾了2天，试了5条，只有1条能用，最后装系统还总是失败……幸好我说了，老板人很好，爽快的给我退掉了。（在这个过程中还不忘给我炫耀一下他能一次成功 - -||）。</p><ol start="3"><li>最后的成功：</li></ol><p>本来已经无奈的绝望了，认为只能等自己成了暴发户再玩nas了。</p><p>幸运的是不知被哪里来的闪电劈中脑袋，想起来家里还有两台闲置的华硕EeePC上网本——一台 1000HE 和一台 1005PX。1000HE比较悲剧，不知道哪个部件出了问题，很难再点亮了。但是1005PX还一切正常，于是赶紧实验。</p><p>装机过程完全参考 《<a href="http://jy.smzdm.com/detail/20115">NAS群晖DSM 5.0-4458 傻瓜安装教程</a>》，当然，资源也是在那里下的。我这里也提供一个 <a href="http://pan.baidu.com/s/1qWlWWX2">下载地址</a> ，其中包含了官方3612xs机型5.0-4458版本的PAT文件（174.9M），Gnoboot-alpha7-4458.img文件（32M），然后是win32diskimager文件（13.6M）。Gnoboot-alpha10其实也是可用的，不过这不是重点，各位看官随便用一个就好。</p><p>教程写的是傻瓜安装教程，过程到底有多傻瓜呢？我下面用几行文字说明：</p><ol><li><p>用win32diskimager将img文件写入U盘。（注：U盘要始终用作黑群晖引导，所以就不要想着拔下来了。有米的同志们可以考虑 <a href="http://redirect.simba.taobao.com/rd?w=unionnojs&f=http://ai.taobao.com/auction/edetail.htm?e=5AwCZeCIFm7ghojqVNxKsbRELfvBRtvP8Ev3mcYS1DWLltG5xFicOdXrTUTgh9sMDPIwxrc30rgCtVdTv6FH8AYRql%252BHP2cAFs4lzI5B9h6gT%252BixfWCFHuIZWR1bMnHu&unid=51289531&ptype=100010&from=basic&k=5ccfdb950740ca16&c=un&b=alimm_0&p=mm_51289531_5730227_23236382">闪迪酷豆</a> ，小巧得能让你1分钟就搞丢它。）</p></li><li><p>把U盘插上小本（没有的同志们淘个 <a href="http://redirect.simba.taobao.com/rd?w=unionnojs&f=http://ai.taobao.com/auction/edetail.htm?e=l7glTGC4eQ7ghojqVNxKsRhyaW24nDTuEUtHUPud5YyLltG5xFicOdXrTUTgh9sMDPIwxrc30rgCtVdTv6FH8AYRql%252BHP2cAFs4lzI5B9h4ViKKJRO%252FGxeIZWR1bMnHu&unid=51289531&ptype=100010&from=basic&k=5ccfdb950740ca16&c=un&b=alimm_0&p=mm_51289531_5730227_23234441">二手的EeePC 1005PX</a> 应该再合适不过了，完全够用，还是整机，保证能用，省的瞎折腾。如果实在有必要，就把 <a href="http://redirect.simba.taobao.com/rd?w=unionnojs&f=http://ai.taobao.com/auction/edetail.htm?e=kcRsoKXVqwTghojqVNxKsX%252FzWWpOhfRYz%252Ftk3MFUxAaLltG5xFicOdXrTUTgh9sMDPIwxrc30rgCtVdTv6FH8AYRql%252BHP2cAFs4lzI5B9h4mEdSu4Vp59%252BIZWR1bMnHu&unid=51289531&ptype=100010&from=basic&k=5ccfdb950740ca16&c=un&b=alimm_0&p=mm_51289531_5730227_23240407">硬盘</a> 换一换就ok了。），设置U盘启动。记得使用网线连接路由，黑群晖不认识它的无线网卡。</p></li></ol><p>3) 开机后屏幕上会出现三个选项，选择第二项gnoboot-me，然后继续，直到出现 DiskStation Login:</p><ol start="4"><li><p>然后到PC或者笔记本上运行群晖助手，可以到 <a href="http://download.synology.com/download/Tools/SynologyAssistant/4448/Windows/SynologyAssistantSetup-5.0-4448.exe">官网下载</a>。运行以后应该能查找到1台NAS。</p></li><li><p>双击，然后按照步骤进行安装，中途选择之前下载的pat文件。</p></li><li><p>输入1005PX的IP地址。然后就出现了华丽的登录界面。</p></li></ol><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/synology-login.jpg" alt="&quot;登录界面&quot;"></p><p>最后剩下的就是折腾了。总之套件中心的Cloud Sync、Cloud Station、Video Station对我来说是非常有用的。</p><p>Cloud Sync连上百度云，随时随地将上传到DSM的文件同步到云端，再不用想我到底拿那3点几个T来做什么 :P</p><p>Cloud Station同步PC设备的文件。</p><p>Video Station让移动设备能够远端直接播放视频。</p><p>手机端主要用得上的是DS File（上传&#x2F;浏览文件）、DS Video（观看云端视频）、DS Photo+（浏览云端图片）。</p><p>当然，其实使用各种设备直接访问网页版控制台，所有功能都能实现，非常方便。</p><p>最后，放一个京东的 <a href="http://search.jd.com/Search?keyword=%E7%BE%A4%E6%99%96&enc=utf-8">白群晖展览</a> ……只能妄想一下了……</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;标题写得很大，其实非常easy……最终成品只花了2个小时就搞定了全部的东西……&lt;/p&gt;
&lt;p&gt;先来看看漂亮的5.0界面 :)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/</summary>
      
    
    
    
    <category term="DIY实战" scheme="https://www.gsgundam.com/categories/DIY%E5%AE%9E%E6%88%98/"/>
    
    
    <category term="DIY" scheme="https://www.gsgundam.com/tags/DIY/"/>
    
    <category term="1005px" scheme="https://www.gsgundam.com/tags/1005px/"/>
    
    <category term="diskstation" scheme="https://www.gsgundam.com/tags/diskstation/"/>
    
    <category term="dsm" scheme="https://www.gsgundam.com/tags/dsm/"/>
    
    <category term="eeepc" scheme="https://www.gsgundam.com/tags/eeepc/"/>
    
    <category term="nas" scheme="https://www.gsgundam.com/tags/nas/"/>
    
    <category term="synology" scheme="https://www.gsgundam.com/tags/synology/"/>
    
    <category term="群晖" scheme="https://www.gsgundam.com/tags/%E7%BE%A4%E6%99%96/"/>
    
    <category term="黑群晖" scheme="https://www.gsgundam.com/tags/%E9%BB%91%E7%BE%A4%E6%99%96/"/>
    
  </entry>
  
  <entry>
    <title>PhpStorm的正则表达式搜索功能</title>
    <link href="https://www.gsgundam.com/archive/2014-06-14-phpstorm-search-by-regex/"/>
    <id>https://www.gsgundam.com/archive/2014-06-14-phpstorm-search-by-regex/</id>
    <published>2014-06-14T07:00:49.000Z</published>
    <updated>2015-01-31T09:50:35.136Z</updated>
    
    <content type="html"><![CDATA[<p>继续回到没有“之一”的最强php编辑器——PhpStorm。这次又发现了一个非常有用的功能，正则表达式搜索。</p><p>Ctrl+F打开顶部搜索栏以后，勾选上Regex就可以使用NB的正则表达式进行搜索了。</p><p>比如这次我希望把文件中的以 href&#x3D;”..&#x2F;i 开头，以 “ 结尾的字符串都找出来。只要在搜索框输入以下文本（其实我说得简单，耗掉了许多时间都没能写对正则表达式，还是靠了Fenix的帮助）：</p><pre><code>href=&quot;../i[/w|-]*&quot;</code></pre><p>接着就会发现所有符合条件的文本都被高亮了，现在想干什么就干什么啰~</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;继续回到没有“之一”的最强php编辑器——PhpStorm。这次又发现了一个非常有用的功能，正则表达式搜索。&lt;/p&gt;
&lt;p&gt;Ctrl+F打开顶部搜索栏以后，勾选上Regex就可以使用NB的正则表达式进行搜索了。&lt;/p&gt;
&lt;p&gt;比如这次我希望把文件中的以 href&amp;#x3D;</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="php" scheme="https://www.gsgundam.com/tags/php/"/>
    
    <category term="fenix" scheme="https://www.gsgundam.com/tags/fenix/"/>
    
    <category term="phpstorm" scheme="https://www.gsgundam.com/tags/phpstorm/"/>
    
    <category term="regex" scheme="https://www.gsgundam.com/tags/regex/"/>
    
    <category term="功能" scheme="https://www.gsgundam.com/tags/%E5%8A%9F%E8%83%BD/"/>
    
    <category term="搜索" scheme="https://www.gsgundam.com/tags/%E6%90%9C%E7%B4%A2/"/>
    
    <category term="正则" scheme="https://www.gsgundam.com/tags/%E6%AD%A3%E5%88%99/"/>
    
    <category term="正则表达式" scheme="https://www.gsgundam.com/tags/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/"/>
    
    <category term="编辑器" scheme="https://www.gsgundam.com/tags/%E7%BC%96%E8%BE%91%E5%99%A8/"/>
    
    <category term="高亮" scheme="https://www.gsgundam.com/tags/%E9%AB%98%E4%BA%AE/"/>
    
  </entry>
  
  <entry>
    <title>极风游开启首个义务维护项目 – Font Awesome 中文网</title>
    <link href="https://www.gsgundam.com/archive/2014-06-13-dashgame-start-font-awesome-chinese/"/>
    <id>https://www.gsgundam.com/archive/2014-06-13-dashgame-start-font-awesome-chinese/</id>
    <published>2014-06-12T17:27:30.000Z</published>
    <updated>2018-11-07T04:53:53.523Z</updated>
    
    <content type="html"><![CDATA[<p>Font Awesome是一个免费的、强大的、丰富的、简单的、好用的图标字库。早在3.0版本，极风游就受益于它，首先要感谢作者 Dave Gandy 创作出这么优秀的项目。</p><p>其实制作这么一个 **<a href="http://fontawesome.dashgame.com/">Font Awesome中文文档网站</a> **非常简单，但是维护它却是一个长期、需要耐心的工程。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/fontawesome-logo.jpg" alt="&quot;FontAwesome&quot;"></p><p>目前翻译整理了最新的 4.1.0 版，随着其官网的更新，新的内容将同步更新到中文文档网站中。</p><p>另外，将原站点改为了单页网站，方便游客浏览。</p><p>自从4.0版开始，作者就加入了不少具有中国特色的图标，例如微信、微博等，越来越适合国内站点使用。</p><p>希望越来越多的人能成为 <a href="http://fontawesome.io/"><strong>Font Awesome</strong></a> 以及** <a href="http://fontawesome.dashgame.com/">Font Awesome中文文档网站</a> **的受益者。</p><p>翻译过程中难免遗漏出错，如果有任何问题和建议，请不要吝啬言辞，<a href="http://www.dashgame.com/contact">联系我们</a>吧。</p><p>当然，也可以直接在本站中留言 ;P</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Font Awesome是一个免费的、强大的、丰富的、简单的、好用的图标字库。早在3.0版本，极风游就受益于它，首先要感谢作者 Dave Gandy 创作出这么优秀的项目。&lt;/p&gt;
&lt;p&gt;其实制作这么一个 **&lt;a href=&quot;http://fontawesome.dash</summary>
      
    
    
    
    <category term="项目开发" scheme="https://www.gsgundam.com/categories/%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="fontawesome" scheme="https://www.gsgundam.com/tags/fontawesome/"/>
    
    <category term="图标字库" scheme="https://www.gsgundam.com/tags/%E5%9B%BE%E6%A0%87%E5%AD%97%E5%BA%93/"/>
    
  </entry>
  
  <entry>
    <title>POCO相册外链图片无法显示</title>
    <link href="https://www.gsgundam.com/archive/2014-06-12-poco-image-load-failed/"/>
    <id>https://www.gsgundam.com/archive/2014-06-12-poco-image-load-failed/</id>
    <published>2014-06-12T00:42:03.000Z</published>
    <updated>2015-01-31T13:56:35.036Z</updated>
    
    <content type="html"><![CDATA[<p>今天翻看前段时间写的《<a href="/2014-06-06-tp-link-wr842n-cooling-diy/">TP-Link WR842N 路由散热DIY</a>》，发现图全都裂了。</p><p>一直都用poco相册做外链，之前的都没问题，怎么现在就不行了呢？</p><p>对比能显示和不能显示的图片地址，发现不能显示的前缀均为 img16-c ，试着把 -c 去掉，居然就可以了！(⊙ｏ⊙)</p><p>世界真奇妙啊……</p><p><img src="http://d.hiphotos.baidu.com/baike/w%3D268/sign=6a411db45066d0167e19992eaf2ad498/8b82b9014a90f6032017023e3b12b31bb151f8198618cd18.jpg"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天翻看前段时间写的《&lt;a href=&quot;/2014-06-06-tp-link-wr842n-cooling-diy/&quot;&gt;TP-Link WR842N 路由散热DIY&lt;/a&gt;》，发现图全都裂了。&lt;/p&gt;
&lt;p&gt;一直都用poco相册做外链，之前的都没问题，怎么现在就不行了呢？</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="poco" scheme="https://www.gsgundam.com/tags/poco/"/>
    
    <category term="不显示" scheme="https://www.gsgundam.com/tags/%E4%B8%8D%E6%98%BE%E7%A4%BA/"/>
    
    <category term="图片" scheme="https://www.gsgundam.com/tags/%E5%9B%BE%E7%89%87/"/>
    
    <category term="图裂" scheme="https://www.gsgundam.com/tags/%E5%9B%BE%E8%A3%82/"/>
    
    <category term="外链" scheme="https://www.gsgundam.com/tags/%E5%A4%96%E9%93%BE/"/>
    
    <category term="相册" scheme="https://www.gsgundam.com/tags/%E7%9B%B8%E5%86%8C/"/>
    
  </entry>
  
  <entry>
    <title>PhpStorm强大的补全功能——CSS动画</title>
    <link href="https://www.gsgundam.com/archive/2014-06-11-phpstorm-css-transition-autocomplete/"/>
    <id>https://www.gsgundam.com/archive/2014-06-11-phpstorm-css-transition-autocomplete/</id>
    <published>2014-06-11T06:59:11.000Z</published>
    <updated>2018-11-07T04:53:53.210Z</updated>
    
    <content type="html"><![CDATA[<p>不知道怎么说好了，直接上图吧。</p><p>需要transition属性，于是刚打完transi几个字后，补全出现的一幕吓到我了，所有浏览器的transition方法全都出来了。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/phpstorm-autocompelte1.png"></p><p>Tab补全后接着出现了更神奇的画面，修改红框的属性，所有浏览器对应的transition属性值一起在改变。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/phpstorm-autocompelte2.png"></p><p>我之前跟Fenix说PhpStorm是我用过的最强大的php网页编辑器，没有之一。现在我更加这么认为了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;不知道怎么说好了，直接上图吧。&lt;/p&gt;
&lt;p&gt;需要transition属性，于是刚打完transi几个字后，补全出现的一幕吓到我了，所有浏览器的transition方法全都出来了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.c</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="php" scheme="https://www.gsgundam.com/tags/php/"/>
    
    <category term="fenix" scheme="https://www.gsgundam.com/tags/fenix/"/>
    
    <category term="css" scheme="https://www.gsgundam.com/tags/css/"/>
    
    <category term="css3" scheme="https://www.gsgundam.com/tags/css3/"/>
    
    <category term="phpstorm" scheme="https://www.gsgundam.com/tags/phpstorm/"/>
    
    <category term="tab" scheme="https://www.gsgundam.com/tags/tab/"/>
    
    <category term="动画" scheme="https://www.gsgundam.com/tags/%E5%8A%A8%E7%94%BB/"/>
    
    <category term="补全" scheme="https://www.gsgundam.com/tags/%E8%A1%A5%E5%85%A8/"/>
    
  </entry>
  
  <entry>
    <title>TP-Link WR842N 路由散热DIY</title>
    <link href="https://www.gsgundam.com/archive/2014-06-06-tp-link-wr842n-cooling-diy/"/>
    <id>https://www.gsgundam.com/archive/2014-06-06-tp-link-wr842n-cooling-diy/</id>
    <published>2014-06-05T17:30:47.000Z</published>
    <updated>2018-11-07T04:53:53.549Z</updated>
    
    <content type="html"><![CDATA[<p>上一篇博文（<a href="/2014-06-02-tp-link-wr842n-and-netcore-nw710-wireless-bridge/">TP-Link WR842N 与 Netcore NW710 路由无线桥接组网</a>）就说到我要DIY TP-Link WR842N的路由散热了，于是跟阿宝申请了资金，去淘宝上淘了点小玩意回来。</p><p>说是申请资金，着实没花什么钱，混着别的地方要用的小零件，零零碎碎24块，加11块邮费，一共35……DIY精神么，屌丝的DIY精神，核心就是性价比！</p><p>一共购入：</p><p><strong>12厘米风扇*1</strong></p><p><strong>4Pin口转USB线*1</strong></p><p><strong>17_17_2mm 散热片*4</strong></p><p><strong>20_14_6mm 散热片*3</strong></p><p><strong>20_20_6mm 散热片*1</strong></p><p><strong>22_22_6mm 散热片*1</strong></p><p>*<em>撬棒+三角片 <em>1</em></em></p><p>*<em>塑料扎带 100PCS <em>1</em></em></p><p>看起来好丰富是吧？我也这么觉得……</p><p>好吧，废话少说，DIY开始！</p><p>1.拆机是在淘宝下单之前就拆了，为了测量散热片的尺寸，没有撬棒和三角片，所以是暴力拆解，没能办到无损。左下的卡口和右侧的散热口有破损，基本没影响。</p><p>可以看到稳定性奇差的Ar9331主控板子很简洁干净，加上esmt的16m内存，整体给人的感觉就是，这个路由的成本真的很省啊，坑死啦……连电容位都不给上满……以后再要败东西一定要听阿宝的：<strong>一步到位！</strong></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-1.jpg"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-2.jpg"></p><p>2.快递包来了，NND，这是用屁股坐过？盒子瘪成这样了！</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-3.jpg"></p><p>3.来个散热片与裸体路由的合照</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-4.jpg"></p><p>4.这次的散热方案因为要用到外置风扇散热，所以三片散热足矣。CPU正面背面各一片，内存上一片。这个方案参考了小米论坛上一位朋友的帖子。</p><p>购入的散热片均自带散热贴，撕下蓝色膜就可以直接贴了，很方便。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-5.jpg"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-6.jpg"></p><p>5.按照尺寸使用了一块20_20_6mm贴在CPU上，一块20_14_6mm贴在内存上，一块17_17_2mm超薄的就贴在CPU背面。反复按压几次就好了。没能在卖家那里看到6mm高的22mm长条形散热片，所以内存没贴满。还是贴满的散热更均匀，但没办法了，将就吧。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-7.jpg"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-8.jpg"></p><p>6.然后开始真正称得上DIY的散热风扇底座制作。</p><p>屌丝就不用高大上的材料了，家里空盒子很多，随便找了个亚麻籽油的小盒子，比较干净也比较结实，表面难看点也没关系。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-9.jpg"></p><p>7.把盒子拆开，将风扇放到希望安装的位置上，勾出轮廓，以便抠风口出来。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-10.jpg"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-11.jpg"></p><p>8.刚才勾错风口风口了，勾中心有个毛用啊……顺便把螺丝孔位也标注出来。（另外，似乎这张照片上下反了…………）</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-12.jpg"></p><p>9.用刀子把风口抠出来，剪刀的切口虽然会比刀要更整齐一些，但是位置难以这么精准，而且容易损伤纸板。</p><p>同时用锥子把螺丝孔位戳穿，方便一会从另一边上螺丝。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-13.jpg"></p><p>10.接着也要把四周的底部出风口给切出来。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-14.jpg"></p><p>11.固定风扇啦，风扇配的四根短螺丝就够用。注意，补切了一个线的出口，从侧面出比从下边出更方便、更美观。DIY嘛，在过程中就要不断改进。</p><p>如此一来，基本完工了。剩下的就是收尾而已。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-15.jpg"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-16.jpg"></p><p>12.收尾工作主要是模具成型和外观美化。用人话说，就是贴边和喷漆。</p><p>贴边用的是玻璃胶，时间长久而且有韧性。估计盒子坏了，它也不会开胶。家里有小小宝，就放在阳台上用书固定了一天，那结实程度，杠杠的！（感觉家里的书已经很久没有派上过用场了，终于重出江湖！）</p><p>家里有一罐7年前买的银色喷漆，居然还没用完。喷出来还挺好看的。照片里加了盖子（就是之前抠出来那块），不使用的时候可以放在上面挡挡灰尘。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-17.jpg"></p><p>13.最后来个成品图。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/WR842N-diy-18.jpg"></p><p>风扇超静音，还没通电时多口充电头的电流声音大。粗略估算风扇功率是2瓦，也就是这么一直开一年也就18度电。</p><p>当然，要响应节能环保嘛，晚上拔掉电源就是。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;上一篇博文（&lt;a href=&quot;/2014-06-02-tp-link-wr842n-and-netcore-nw710-wireless-bridge/&quot;&gt;TP-Link WR842N 与 Netcore NW710 路由无线桥接组网&lt;/a&gt;）就说到我要DIY TP-Lin</summary>
      
    
    
    
    <category term="DIY实战" scheme="https://www.gsgundam.com/categories/DIY%E5%AE%9E%E6%88%98/"/>
    
    
    <category term="DIY" scheme="https://www.gsgundam.com/tags/DIY/"/>
    
    <category term="taobao" scheme="https://www.gsgundam.com/tags/taobao/"/>
    
    <category term="tp" scheme="https://www.gsgundam.com/tags/tp/"/>
    
    <category term="TP-Link" scheme="https://www.gsgundam.com/tags/TP-Link/"/>
    
    <category term="wr842n" scheme="https://www.gsgundam.com/tags/wr842n/"/>
    
    <category term="快递包装" scheme="https://www.gsgundam.com/tags/%E5%BF%AB%E9%80%92%E5%8C%85%E8%A3%85/"/>
    
    <category term="拆解" scheme="https://www.gsgundam.com/tags/%E6%8B%86%E8%A7%A3/"/>
    
    <category term="散热" scheme="https://www.gsgundam.com/tags/%E6%95%A3%E7%83%AD/"/>
    
    <category term="散热底座" scheme="https://www.gsgundam.com/tags/%E6%95%A3%E7%83%AD%E5%BA%95%E5%BA%A7/"/>
    
    <category term="散热片" scheme="https://www.gsgundam.com/tags/%E6%95%A3%E7%83%AD%E7%89%87/"/>
    
    <category term="淘宝" scheme="https://www.gsgundam.com/tags/%E6%B7%98%E5%AE%9D/"/>
    
    <category term="纸盒" scheme="https://www.gsgundam.com/tags/%E7%BA%B8%E7%9B%92/"/>
    
    <category term="路由" scheme="https://www.gsgundam.com/tags/%E8%B7%AF%E7%94%B1/"/>
    
  </entry>
  
  <entry>
    <title>TP-Link WR842N 与 Netcore NW710 路由无线桥接组网</title>
    <link href="https://www.gsgundam.com/archive/2014-06-02-tp-link-wr842n-and-netcore-nw710-wireless-bridge/"/>
    <id>https://www.gsgundam.com/archive/2014-06-02-tp-link-wr842n-and-netcore-nw710-wireless-bridge/</id>
    <published>2014-06-02T00:13:43.000Z</published>
    <updated>2018-11-07T04:53:52.861Z</updated>
    
    <content type="html"><![CDATA[<p>提前预告：组网失败……各方面显示都正常，偏偏就是连接桥接路由端的客户端上不了网……</p><p>之前趁降价入手了一台Netcore NW710，一方面家里的TP-Link WR842N在主卧的信号特别差，一方面看NW710有桥接功能，就琢磨着用两台路由器无线桥接组网，扩大信号范围。</p><p>1.我使用TP-Link作为主路由。为确保一次成功，排除组网过程中会出现的干扰因素，将本机的IP（IPv4）设置成了固定的192.168.1.101，与主路由（192.168.1.1）网段一致。</p><p>2.进入TP-Link设置页面，首先在DHCP菜单中确保DHCP是<strong>启用状态</strong>（一般都开着的，不然拨号上网都成问题）。</p><p>3.在无线网络基本设置中设置好无线网络名称SSID、信道（我这里测试下来9信道使用的人最少，干扰最少，据说6和9能照顾到部分神奇的设备）、频段带宽（不要选自动，20或者40都行，记下来，辅助路由需要与其设置一样）。确保WDS未开启。主路由到此就设置完了。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/wireless-config.jpg"></p><p>4.然后使用Netcore NW710作为辅助路由。进入高级设置，先进入网络参数&gt;内网配置，将LAN IP 配置中的IP地址设置为192.168.1.2，方便在出现差错时进行调试。保存并重启。</p><p>5.接着保证两个路由同时开启，进入无线配置&gt; WDS配置，点击AP探测，找到主路由的无线SSID，选择连接</p><p>6.再进入无线配置&gt;无线基本配置，工作模式选择WDS，参数设置与主路由WR842N一致</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/wireless-config2.jpg"></p><p>7.最后在不重启路由的情况下，将桥接的辅助路由NW710的DHCP关闭，相关设置在网络参数&gt;内网配置。重启路由，至此设置完毕。</p><p>至于为什么没有成功，上网度娘谷哥了一下，也有类似的情况发生，据说不同品牌不能桥接的情况很正常。于是很蛋疼的看着两个不能同时使用的路由，不知道说点什么好……</p><p>话说回来，最近TP-Link WR842N掉线十分频繁，看网上的各种吐槽，才了解到原来WR842N算是个阉割玩意，比起来其它型号，缩水十分严重，于是拆机来看，内容果然比较简陋。关键是机子散热差，夏天抽筋频繁不是我一个人的事情，在网上是普遍现象。暂时只能用Netcore NW710代替着，虽然信号要更好一些了，但是也时而会断线，尤其有时网速严重受影响，一搜索，果然又是个缩水玩意儿，便宜果然没好货么？</p><p>到淘宝上淘了一些散热配件，准备给WR842N做个简单的散热，看情况能不能好些。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;提前预告：组网失败……各方面显示都正常，偏偏就是连接桥接路由端的客户端上不了网……&lt;/p&gt;
&lt;p&gt;之前趁降价入手了一台Netcore NW710，一方面家里的TP-Link WR842N在主卧的信号特别差，一方面看NW710有桥接功能，就琢磨着用两台路由器无线桥接组网，扩大</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="tp" scheme="https://www.gsgundam.com/tags/tp/"/>
    
    <category term="TP-Link" scheme="https://www.gsgundam.com/tags/TP-Link/"/>
    
    <category term="wr842n" scheme="https://www.gsgundam.com/tags/wr842n/"/>
    
    <category term="路由" scheme="https://www.gsgundam.com/tags/%E8%B7%AF%E7%94%B1/"/>
    
    <category term="netcore" scheme="https://www.gsgundam.com/tags/netcore/"/>
    
    <category term="nw710" scheme="https://www.gsgundam.com/tags/nw710/"/>
    
    <category term="无线桥接" scheme="https://www.gsgundam.com/tags/%E6%97%A0%E7%BA%BF%E6%A1%A5%E6%8E%A5/"/>
    
    <category term="普联" scheme="https://www.gsgundam.com/tags/%E6%99%AE%E8%81%94/"/>
    
    <category term="磊科" scheme="https://www.gsgundam.com/tags/%E7%A3%8A%E7%A7%91/"/>
    
    <category term="组网" scheme="https://www.gsgundam.com/tags/%E7%BB%84%E7%BD%91/"/>
    
    <category term="缩水" scheme="https://www.gsgundam.com/tags/%E7%BC%A9%E6%B0%B4/"/>
    
    <category term="设置" scheme="https://www.gsgundam.com/tags/%E8%AE%BE%E7%BD%AE/"/>
    
  </entry>
  
  <entry>
    <title>【原画】装甲纵队–铁拳</title>
    <link href="https://www.gsgundam.com/archive/2014-04-10-origin-painting-dasher-for-battle-array/"/>
    <id>https://www.gsgundam.com/archive/2014-04-10-origin-painting-dasher-for-battle-array/</id>
    <published>2014-04-10T05:45:30.000Z</published>
    <updated>2018-11-07T04:55:08.729Z</updated>
    
    <content type="html"><![CDATA[<p>小小宝越来越乖了，让我有时间在两天的闲暇时间内完成一副原画。表扬一个~</p><p>铁拳的设定和模型是逆向的，因为Fenix需要先完成一个模型进行游戏开发，因此铁拳作为极风游戏冠名机甲——Dasher，直接跳过了原画制作了模型。</p><p>铁拳的设定稿跟模型稍有区别，主要集中在手臂和“铁拳”上，但身体结构基本一致——大型4喷口助推器，巨大的肩甲，硕大的前臂和拳头。</p><p>废话少说，看看吧。透视似乎还是有问题，但线条比之前流畅了。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/dasher.jpg" alt="&quot;铁拳&quot;"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;小小宝越来越乖了，让我有时间在两天的闲暇时间内完成一副原画。表扬一个~&lt;/p&gt;
&lt;p&gt;铁拳的设定和模型是逆向的，因为Fenix需要先完成一个模型进行游戏开发，因此铁拳作为极风游戏冠名机甲——Dasher，直接跳过了原画制作了模型。&lt;/p&gt;
&lt;p&gt;铁拳的设定稿跟模型稍有区别，</summary>
      
    
    
    
    <category term="随笔涂鸦" scheme="https://www.gsgundam.com/categories/%E9%9A%8F%E7%AC%94%E6%B6%82%E9%B8%A6/"/>
    
    
    <category term="原画" scheme="https://www.gsgundam.com/tags/%E5%8E%9F%E7%94%BB/"/>
    
    <category term="array" scheme="https://www.gsgundam.com/tags/array/"/>
    
    <category term="battle" scheme="https://www.gsgundam.com/tags/battle/"/>
    
    <category term="装甲纵队" scheme="https://www.gsgundam.com/tags/%E8%A3%85%E7%94%B2%E7%BA%B5%E9%98%9F/"/>
    
    <category term="原画设定" scheme="https://www.gsgundam.com/tags/%E5%8E%9F%E7%94%BB%E8%AE%BE%E5%AE%9A/"/>
    
    <category term="设定" scheme="https://www.gsgundam.com/tags/%E8%AE%BE%E5%AE%9A/"/>
    
    <category term="设定原画" scheme="https://www.gsgundam.com/tags/%E8%AE%BE%E5%AE%9A%E5%8E%9F%E7%94%BB/"/>
    
    <category term="ba" scheme="https://www.gsgundam.com/tags/ba/"/>
    
    <category term="dasher" scheme="https://www.gsgundam.com/tags/dasher/"/>
    
    <category term="铁拳" scheme="https://www.gsgundam.com/tags/%E9%93%81%E6%8B%B3/"/>
    
  </entry>
  
  <entry>
    <title>【原画】装甲纵队–庇护者</title>
    <link href="https://www.gsgundam.com/archive/2014-04-04-origin-painting-aegis-for-battle-array/"/>
    <id>https://www.gsgundam.com/archive/2014-04-04-origin-painting-aegis-for-battle-array/</id>
    <published>2014-04-04T07:08:54.000Z</published>
    <updated>2018-11-07T04:55:08.785Z</updated>
    
    <content type="html"><![CDATA[<p>新设定定稿啦！——新庇护者诞生！</p><p>熟悉某个游戏的人应该能很容易发现原型的出处。</p><p>近乎完全颠覆Fenix上一版的设计，只保留了悬浮底座。采用黄色光来显示其能治疗的特性。</p><p>主要是原型和设计方向太一致了，所以直接用了……（好吧，其实是我懒了）</p><p>炮台尾部修改了2次，我已经画晕了，最后透视出问题了，各位看官将就吧……</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/aegis.jpg" alt="&quot;庇护者&quot;"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;新设定定稿啦！——新庇护者诞生！&lt;/p&gt;
&lt;p&gt;熟悉某个游戏的人应该能很容易发现原型的出处。&lt;/p&gt;
&lt;p&gt;近乎完全颠覆Fenix上一版的设计，只保留了悬浮底座。采用黄色光来显示其能治疗的特性。&lt;/p&gt;
&lt;p&gt;主要是原型和设计方向太一致了，所以直接用了……（好吧，其实是我懒</summary>
      
    
    
    
    <category term="随笔涂鸦" scheme="https://www.gsgundam.com/categories/%E9%9A%8F%E7%AC%94%E6%B6%82%E9%B8%A6/"/>
    
    
    <category term="原画" scheme="https://www.gsgundam.com/tags/%E5%8E%9F%E7%94%BB/"/>
    
    <category term="array" scheme="https://www.gsgundam.com/tags/array/"/>
    
    <category term="battle" scheme="https://www.gsgundam.com/tags/battle/"/>
    
    <category term="装甲纵队" scheme="https://www.gsgundam.com/tags/%E8%A3%85%E7%94%B2%E7%BA%B5%E9%98%9F/"/>
    
    <category term="原画设定" scheme="https://www.gsgundam.com/tags/%E5%8E%9F%E7%94%BB%E8%AE%BE%E5%AE%9A/"/>
    
    <category term="设定" scheme="https://www.gsgundam.com/tags/%E8%AE%BE%E5%AE%9A/"/>
    
    <category term="设定原画" scheme="https://www.gsgundam.com/tags/%E8%AE%BE%E5%AE%9A%E5%8E%9F%E7%94%BB/"/>
    
    <category term="aegis" scheme="https://www.gsgundam.com/tags/aegis/"/>
    
    <category term="ba" scheme="https://www.gsgundam.com/tags/ba/"/>
    
    <category term="庇护者" scheme="https://www.gsgundam.com/tags/%E5%BA%87%E6%8A%A4%E8%80%85/"/>
    
  </entry>
  
  <entry>
    <title>【原画】装甲纵队-雷神 追猎者</title>
    <link href="https://www.gsgundam.com/archive/2014-03-28-origin-painting-hunter-thor-for-battle-array/"/>
    <id>https://www.gsgundam.com/archive/2014-03-28-origin-painting-hunter-thor-for-battle-array/</id>
    <published>2014-03-28T03:49:30.000Z</published>
    <updated>2018-11-07T05:41:32.372Z</updated>
    
    <content type="html"><![CDATA[<p>由于小小宝的关系，一直都没来得及完成新版《装甲纵队》的原画设定。今天终于抽空完成了新雷神，加上之前完成的新追猎者一并放出来接受审阅。</p><p>很久没画原画了，生疏得很，随便批。反正Fenix已经开始制作了 ;P</p><p>追猎者：较上一版本修改幅度较大，只保留了步行机和4炮管武装的设计。采用鸟足设计以增大步幅，增加手臂关节突显武器特色，修改开放式驾驶舱为封闭式以增加神秘感。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/Hunter.jpg" alt="&quot;追猎者&quot;"></p><p>雷神：保留电磁轨道炮和坦克底座的大体设计思路，修改较少。减少高度、增加宽度来显示厚重感，并通过灯光来渲染整体效果。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/Thor.jpg" alt="&quot;雷神&quot;"></p><p>PS：知道RF签名意思的童鞋都是老朋友了哈~</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;由于小小宝的关系，一直都没来得及完成新版《装甲纵队》的原画设定。今天终于抽空完成了新雷神，加上之前完成的新追猎者一并放出来接受审阅。&lt;/p&gt;
&lt;p&gt;很久没画原画了，生疏得很，随便批。反正Fenix已经开始制作了 ;P&lt;/p&gt;
&lt;p&gt;追猎者：较上一版本修改幅度较大，只保留了步</summary>
      
    
    
    
    <category term="随笔涂鸦" scheme="https://www.gsgundam.com/categories/%E9%9A%8F%E7%AC%94%E6%B6%82%E9%B8%A6/"/>
    
    
    <category term="原画" scheme="https://www.gsgundam.com/tags/%E5%8E%9F%E7%94%BB/"/>
    
    <category term="array" scheme="https://www.gsgundam.com/tags/array/"/>
    
    <category term="battle" scheme="https://www.gsgundam.com/tags/battle/"/>
    
    <category term="装甲纵队" scheme="https://www.gsgundam.com/tags/%E8%A3%85%E7%94%B2%E7%BA%B5%E9%98%9F/"/>
    
    <category term="原画设定" scheme="https://www.gsgundam.com/tags/%E5%8E%9F%E7%94%BB%E8%AE%BE%E5%AE%9A/"/>
    
    <category term="设定" scheme="https://www.gsgundam.com/tags/%E8%AE%BE%E5%AE%9A/"/>
    
    <category term="设定原画" scheme="https://www.gsgundam.com/tags/%E8%AE%BE%E5%AE%9A%E5%8E%9F%E7%94%BB/"/>
    
    <category term="ba" scheme="https://www.gsgundam.com/tags/ba/"/>
    
    <category term="Hunter" scheme="https://www.gsgundam.com/tags/Hunter/"/>
    
    <category term="Thor" scheme="https://www.gsgundam.com/tags/Thor/"/>
    
    <category term="追猎者" scheme="https://www.gsgundam.com/tags/%E8%BF%BD%E7%8C%8E%E8%80%85/"/>
    
    <category term="雷神" scheme="https://www.gsgundam.com/tags/%E9%9B%B7%E7%A5%9E/"/>
    
  </entry>
  
  <entry>
    <title>VT-X 与 Hyper-V</title>
    <link href="https://www.gsgundam.com/archive/2014-03-17-vt-x-and-hyper-v/"/>
    <id>https://www.gsgundam.com/archive/2014-03-17-vt-x-and-hyper-v/</id>
    <published>2014-03-16T22:24:23.000Z</published>
    <updated>2018-11-07T05:36:17.706Z</updated>
    
    <content type="html"><![CDATA[<p>苹果非常好意的为我们Reject了新应用，原因是图标意义不明确 - -||||</p><p>将图标意义改得特别明确以后，准备重新提交应用，打开虚拟机，结果……</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/vt-x.jpg"></p><p>你们这是要闹哪样……</p><p>之前也出现过这样的问题，但是正赶上加装SSD，所以重装了一次系统，问题也就解决了。这次又发生了这样的事情，为毛？</p><p>大概捋了捋，其实问题应该很明确了，因为两次Vbox不能使用都是在安装了VS2013以后的事情，也就是说多半都是微软的Hyper-V占用了CPU的虚拟化通道。</p><p>随便Google了一下，还好不算复杂，关闭Hpyer-V就可以了。</p><p><img src="http://image.tianjimedia.com/uploadImages/2013/012/3848KFT7AL0M_500.jpg" alt="开启Windows"></p><p>我只能淡淡的忧桑了……</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;苹果非常好意的为我们Reject了新应用，原因是图标意义不明确 - -||||&lt;/p&gt;
&lt;p&gt;将图标意义改得特别明确以后，准备重新提交应用，打开虚拟机，结果……&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shan</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="windows" scheme="https://www.gsgundam.com/tags/windows/"/>
    
    <category term="苹果" scheme="https://www.gsgundam.com/tags/%E8%8B%B9%E6%9E%9C/"/>
    
    <category term="ios" scheme="https://www.gsgundam.com/tags/ios/"/>
    
    <category term="hyper-v" scheme="https://www.gsgundam.com/tags/hyper-v/"/>
    
    <category term="vbox" scheme="https://www.gsgundam.com/tags/vbox/"/>
    
    <category term="vt-x" scheme="https://www.gsgundam.com/tags/vt-x/"/>
    
    <category term="图标" scheme="https://www.gsgundam.com/tags/%E5%9B%BE%E6%A0%87/"/>
    
    <category term="微软" scheme="https://www.gsgundam.com/tags/%E5%BE%AE%E8%BD%AF/"/>
    
    <category term="虚拟机" scheme="https://www.gsgundam.com/tags/%E8%99%9A%E6%8B%9F%E6%9C%BA/"/>
    
  </entry>
  
  <entry>
    <title>在Win7/Win8下使用VirtualBOX虚拟机安装OS X 10.9 Mavericks</title>
    <link href="https://www.gsgundam.com/archive/2014-03-07-mac-os-x-10-9-mavericks-install-in-virtualbox-on-win7-win8/"/>
    <id>https://www.gsgundam.com/archive/2014-03-07-mac-os-x-10-9-mavericks-install-in-virtualbox-on-win7-win8/</id>
    <published>2014-03-07T07:44:07.000Z</published>
    <updated>2015-01-31T13:56:34.919Z</updated>
    
    <content type="html"><![CDATA[<p>转自威锋论坛：<a href="http://bbs.weiphone.com/forum.php?mod=viewthread&tid=7625465">http://bbs.weiphone.com/forum.php?mod=viewthread&tid=7625465</a></p><p><strong>绝对是史上Windows用VBox安装OS X 10.9 Mavericks的最强教程，没有之一！</strong></p><p>由于虚拟机不支持 Apple Quartz Extreme&#x2F;Core Image, 需要 Quartz Extreme 的应用软件例如 iBooks Author，Pixelmator，SketchBook 等不能在虚拟机下使用 。</p><p>安装步骤<br>⑴ 下载:<a href="http://pan.baidu.com/s/1hqebqYw">http://pan.baidu.com/s/1hqebqYw</a><br>VirtualBox-4.3.6-91406-Win.exe<br>Oracle_VM_VirtualBox_Extension_Pack-4.3.6-91406.vbox-extpack<br>HackBoot_Mav.iso<br>OSXMavericks2.iso  (解压 OSXMavericks2.part1.rar, OSXMavericks2.part2.rar, OSXMavericks2.part3.rar)</p><p>⑵ 双击安装 VirtualBox-4.3.6-91406-Win.exe 及 Oracle_VM_VirtualBox_Extension_Pack-4.3.6-91406.vbox-extpack</p><p>⑶.1 在 VirtualBOX 新建虚拟电脑<br>名称        :  Mac OS X Mavericks<br>操作系统 :  Mac OS X<br>版本        :  Mac OS X 10.9 Mavericks (64 bit)<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/28/121111o8usz864t7ukaoqu.png"></p><p>⑶.2 内存分配最少 2048 MB 以上<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/114246dek7eddjgezsf89y.png"></p><p>⑶.3 创建新的虚拟硬盘<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/114310o0t777vlk9xzk14f.png"></p><p>⑶.4 选择 VDI (VirtualBox Disk Image)<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/114332plktoidoikolvse4.png"></p><p>⑶.5 选择 Dynamically allocated<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/114355sp5hie9p5i51whbe.png"></p><p>⑶.6 设置虚拟硬盘位置及大小, 建议大小为 20 GB (最好 40 GB)<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/114417dcgbgpgp5uc5dadu.png"></p><p>⑷.1 打开 VirtualBOX 虚拟机的设置, 在设置的系统 -&gt; 主板, 去掉 “软驱”，取消勾选 “启用 EFI”<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/114442rszdms86dlsdjc6l.png"></p><p>⑷.2 系统 -&gt; 处理器, 选择双核 CPU 数量 &#x3D; 2<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/114508trhysr9b8z8gqs4w.png"></p><p>⑷.3 显示 -&gt; 显卡 -&gt; 显存大小设置到最大 128 MB<br>勾选 Enable 3D Acceleration<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/114536xqw7qecuk5xw8ywz.png"></p><p>⑸.1 在设置的 Storage -&gt; Storage Type  属性 Controller SATA 的光盘图标 Choose a virtual CD&#x2F;DVD disk file 选择HackBoot_Mav.iso 文件<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/114622sfd8ffmb822dfq12.png"></p><p>⑸.2 在 HackBoot_Mav.iso 的启动引导下, 如下 OSX Boot 页面出现后，在虚拟机菜单 CD &#x2F; DVD Drive -&gt; Choose a virtual CD&#x2F;DVD disk file 选择 OSXMavericks2.iso 文件<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/131005ojohjffdrxeao1ed.png"></p><p>⑸.3 按键 F5刷新后, 图标标签变为 OS X Base System，回车开始安装系统<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/131154la68nrhhfuefz33m.png"></p><p>启动过程可能停在这里一分钟<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/141357vnrra8o04kkznvk0.png"></p><p>⑸.4 开始时, 选择安装语言<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/151006gbw91tf9wvffu0zw.png"></p><p>⑸.5 安装系统开始时，找不到任何有效的硬盘 , 使用菜单 实用工具 -&gt;磁盘工具  格式化虚拟硬盘<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/131507pp37p00f77g7pkwk.png"></p><p>⑸.6 左边点选硬盘, 选择 “抹掉”, 名称 Name 录入 “Mavericks”,  然后点击 Erase 抹掉<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/131527on5dw7u1vdvruxwz.png"></p><p>⑸.7 格式化完毕, 关闭磁盘工具后, 点选 Mavericks 磁盘, 点击 安装<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/132348jf6frhyxfy6656u5.png"></p><p>安装系统需要 30 分钟以上<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/132245yyitrnl2b2ziz2lm.png"></p><p>安装 Mac OS X 系统完毕。<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/170838cmniwmwdg7d5iwte.png"></p><p>⑸.8 安装系统后, 需要重新启动, 虚拟机选 Close 及 Power Off 关闭虚拟机<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/170919skwhvzmpt0tt0rs0.png"></p><p>⑸.9.1 关闭 Mac OS X Mavericks 虚拟机后, 在设置的 Storage -&gt; Storage Type  Controller SATA 属性 退出OSXMavericks2.iso<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/171345fzsdppsspgoaawsx.png"></p><p>⑸.9.2 CD &#x2F; DVD Drive 的光盘图标 Add CD&#x2F;DVD Drive 选择 HackBoot_Mav.iso 文件<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/28/102509ypvfo5f7y8cn65if.png"></p><p>⑸.10 在 HackBoot_Mav.iso 的启动引导下, 如下 OSX Boot 页面出现后<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/141316wi1md5b544itd5lt.png"></p><p>⑸.11 在虚拟机菜单 CD &#x2F; DVD Drive -&gt; Choose a virtual CD&#x2F;DVD disk file 选择 OSXMavericks2.iso 文件<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/141332vc2n7uunnen7m7md.png"></p><p>⑸.12 按键 F5刷新后, OSX Boot 图标标签变为 OS X Base System(绿灯亮)，回车再次进入安装系统<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/141345szdxx1919x8djjw2.png"></p><p>启动过程可能停在这里一分钟<br><img src="http://images.weiphone.com/data/attachment/forum/201401/26/141357vnrra8o04kkznvk0.png"></p><p>⑸.13 再次进入安装系统，这次选实用工具菜单  -&gt; 终端<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/141416tjs16461646o1dq5.png"></p><p>⑸.14 进入终端, 安装内核扩展，依次输入命令<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/170633nath2uouz44nfo8h.png"></p><p>⑸.15 依次输入命令如下：</p><pre><code>umount /Volumes/Maverickshdiutil attach /dev/disk0s2 -mountpoint /Volumes/mntcp -rp /Backup/Kexts/ElliottForceLegacyRTC.kext /Volumes/mnt/System/Library/Extensionscp -rp /Backup/Kexts/FakeSMC.kext /Volumes/mnt/System/Library/Extensionscp -rp /Backup/Kexts/NullCPUPowerManagement.kext /Volumes/mnt/System/Library/Extensionschmod -R 0755 /Volumes/mnt/System/Library/Extensions/ElliottForceLegacyRTC.kextchmod -R 0755 /Volumes/mnt/System/Library/Extensions/FakeSMC.kext chmod -R 0755 /Volumes/mnt/System/Library/Extensions/NullCPUPowerManagement.kextchown -R root:wheel /Volumes/mnt/System/Library/Extensions/ElliottForceLegacyRTC.kextchown -R root:wheel /Volumes/mnt/System/Library/Extensions/FakeSMC.kext chown -R root:wheel /Volumes/mnt/System/Library/Extensions/NullCPUPowerManagement.kexthdiutil detach /Volumes/mnt</code></pre><p>⑸.16安装内核扩展后, 退出终端后, 必须等待虚拟机的硬盘指示灯熄灭, Power Off 关闭虚拟机<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/172443khug2lhsrgug3hlh.png"></p><p>⑹.1 关闭 Mac OS X Mavericks 虚拟机后, 在设置的 Storage -&gt; Storage Type  Controller SATA 属性 CD &#x2F; DVD Drive 的光盘图标 Add CD&#x2F;DVD Drive 选择 HackBoot_Mav.iso 文件<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/28/102019znydeae0vdq4y46m.png"></p><p>⑹.2 在 HackBoot_Mav.iso 的启动引导下, 如下 OSX Boot 页面出现后 , 使用右键选择启动 Mavericks (绿灯亮)，回车开始启动系统<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/132525t4xdwqqt6nxpdj67.png"></p><p>⑹.3 启动 Mac OS X Mavericks 虚拟机文件后, 进入 Mac OS X 设置国家<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/131623xpmut54r4dtrardx.png"></p><p>⑹.4 输入用户名称和用户初始密码<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/132631r7fzz9p7ww0f7wkw.png"></p><p>⑹.5 完成其他安装步骤后，不要启动 iCloud 也不要注册, 并成功进入 Mac OS X 系统<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/170755axbr3v32sh4ss3h3.png"></p><p>如需要更改时区 (左上角的 苹果菜单 -&gt; 系统偏好设置(System Preferences) -&gt; Date &amp; Time)<br>如需要更改语言 (左上角的 苹果菜单 -&gt; 系统偏好设置(System Preferences) -&gt; Language &amp; Text), 重启后才更新</p><p>⑹.6 在 苹果菜单 -&gt; 系统偏好设置(System Preferences) -&gt; “安全性与私隐” 里面选择 “任何来源” (用于安装 MultiBeast)<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/132735yxttfsilkft114fi.png"></p><p>⑹.7 使用 Mac OS X Mavericks 的 Safari, 下载  <a href="http://pan.baidu.com/s/1bnb3D9P%22">http://pan.baidu.com/s/1bnb3D9P</a> 及自动解压 MultiBeast-Mavericks-Edition-6.0.1.zip<br>下载 MultiBeast 6.1 更新 : <a href="http://pan.baidu.com/s/1sjCUOGH%22">http://pan.baidu.com/s/1sjCUOGH</a></p><p>⑹.8 自动解压后的文件是在 下载 文件夹里面, 双击 MultiBeast 启动安装<ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/082048f33dtd3jsmealldi.png"></p><p>点选 Quick Start, 点选  EasyBeast<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/170531mnn556rii5tyida6.png"></p><p>⑹.9 点选 Build 及最后点击右下角的 Install 开始安装<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/173214vf070zelz3fafo0h.png"></p><p>⑹.10 等待几分钟后，安装完毕后, 在 Mac 关机。<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/133026z3f1vh7vhwqhj1dz.png"></p><p>⑹.11 Mac关机及关闭 Mac OS X Mavericks 虚拟机后,  打开 VirtualBOX 设置虚拟机, 在 Storage -&gt; Controller SATA 属性退出 HackBoot_Mav.iso 文件<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/185120qzezjz2erk4eku4m.png"></p><p>⑹.12 及在虚拟机设置的 系统 -&gt; 主板 勾选 “启用 Enable EFI”<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/185055o9x80djpez1o9yl9.png"></p><p>⑹.13 启动虚拟电脑, 会直接启动 Mac OS X Mavericks 虚拟硬盘,  以后并不需要 Hackboot_Mav.iso 光盘文件的引导<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/133326vd0brkw5tpkdzt2b.png"></p><p>⑺ 重新启动虚拟电脑后, 可选择挂上磁盘映像 xcode_5.0.1_gm_seed.dmg 安装 Xcode 5 及command_line_tools_os_x_mavericks_for_xcode__late_october_2013.dmg 安装 Command Line Tools<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/26/133421y1cn0u82usklpk7u.png"></p><p>⑺.1 使用 Mac 的终端, 取消强制 iOS 项目的签名</p><ol><li><p>SDKFILE&#x3D;”$(xcode-select –print-path)&#x2F;Platforms&#x2F;iPhoneOS.platform&#x2F;Developer&#x2F;SDKs&#x2F;iPhoneOS7.0.sdk&#x2F;SDKSettings.plist”</p></li><li><p>sudo &#x2F;usr&#x2F;libexec&#x2F;PlistBuddy -c “Set :DefaultProperties:CODE_SIGNING_REQUIRED NO” “$SDKFILE”</p></li><li><p>sudo &#x2F;usr&#x2F;bin&#x2F;plutil -convert binary1 “$SDKFILE”</p></li></ol><p>复制代码</p><p>⑺.2 在 Xcode 测试编译适用于iOS的终端 MobileTerminal 项目<br>下载 MobileTerminal 项目文件夹 : <ignore_js_op><img src="http://bbs.weiphone.com/static/image/filetype/zip.gif"> mobileterminal-520-A.zip (234.82 KB, 下载次数: 73)</p><ignore_js_op><p><img src="http://images.weiphone.com/data/attachment/forum/201401/30/133305pzwmepxbkknmnm66.png"></p><p>⑻.1 本地机器连接到虚拟机, 除了挂上磁盘映像以外, 还有 2 个方案, 方案一 使用SMB 文件共享<br>SMB文件共享从其他设备访问Windows 7<br>在 Windows 7的机器 控制面板 -&gt; 所有控制面板项 -&gt; 网络和共享中心 -&gt; 进阶共用设定”</p><ol><li>启用网络搜索</li><li>启用文件和打印机共用</li><li>关闭公用文件夹共享</li><li>流媒体“不要紧，这个挑选你所需要的</li><li>启用文件共享对于使用设备40 -或56位加密</li><li>启用密码保护的共用（除非你希望每个人都在网络上访问）</li></ol><p>参考 : <a href="http://support.apple.com/kb/PH13882?viewlocale=zh_CN%22">http://support.apple.com/kb/PH13882?viewlocale=zh_CN</a></p><p>在 Mac 虚拟机的设置<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/175150cbkw3xxghukpeuhm.png"></p><p>⑻.2 本地机器连接到虚拟机, 方案二 本地机器使用 <a href="http://code.google.com/p/puttycn/downloads/list%22">PuTTY</a> 及 <a href="http://winscp.net/eng/docs/lang:chs%22">WinSCP</a> 远程登录</p><p>⑻.2.1 在虚拟机的设置选择 网络 -&gt; 端口转发 Port Forwarding<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/181309nfzkfpfxzixj40sk.png"></p><p>⑻.2.2 添加规则 TCP 协议 主机端口 2222 转发 虚拟机端口 22 如下<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/175526ubahfruor66sh2af.png"></p><p>⑻.2.3 Mac 虚拟机, 苹果菜单 -&gt; 系统偏好设置 -&gt; 共享 内启动 远程登录<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/181244bkrr5bppshhrhin4.png"></p><p>⑻.2.4 本地机器用 PuTTY 或 WinSCP 连接到虚拟机,  使用本地机器地址 localhost 及端口 2222<br><ignore_js_op></p><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/181221zmm4lwwo2o82a2wj.png"></p><ignore_js_op><p><img src="http://images.weiphone.com/data/attachment/forum/201401/27/204544ld3r3y3z99w3wbpa.png"></p><hr><p>相关帖子<br>在 Win 7 下使用 VirtualBOX 虚拟机安装 OS X 10.8 Mountain Lion 及 Xcode 4.5 <a href="http://bbs.weiphone.com/read-htm-tid-5329046.html">http://bbs.weiphone.com/read-htm-tid-5329046.html</a><br>iOS 7 开发的好东西【本地下载】<a href="http://bbs.weiphone.com/read-htm-tid-7244970.html">http://bbs.weiphone.com/read-htm-tid-7244970.html</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;转自威锋论坛：&lt;a href=&quot;http://bbs.weiphone.com/forum.php?mod=viewthread&amp;tid=7625465&quot;&gt;http://bbs.weiphone.com/forum.php?mod=viewthread&amp;tid=762546</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="windows" scheme="https://www.gsgundam.com/tags/windows/"/>
    
    <category term="mac" scheme="https://www.gsgundam.com/tags/mac/"/>
    
    <category term="苹果" scheme="https://www.gsgundam.com/tags/%E8%8B%B9%E6%9E%9C/"/>
    
    <category term="开发" scheme="https://www.gsgundam.com/tags/%E5%BC%80%E5%8F%91/"/>
    
    <category term="win8" scheme="https://www.gsgundam.com/tags/win8/"/>
    
    <category term="ios" scheme="https://www.gsgundam.com/tags/ios/"/>
    
    <category term="osx" scheme="https://www.gsgundam.com/tags/osx/"/>
    
    <category term="vbox" scheme="https://www.gsgundam.com/tags/vbox/"/>
    
    <category term="10.9" scheme="https://www.gsgundam.com/tags/10-9/"/>
    
    <category term="Mavericks" scheme="https://www.gsgundam.com/tags/Mavericks/"/>
    
    <category term="VirtualBOX" scheme="https://www.gsgundam.com/tags/VirtualBOX/"/>
    
    <category term="win7" scheme="https://www.gsgundam.com/tags/win7/"/>
    
  </entry>
  
  <entry>
    <title>Windows Denfender Offline</title>
    <link href="https://www.gsgundam.com/archive/2014-03-02-windows-denfender-offline/"/>
    <id>https://www.gsgundam.com/archive/2014-03-02-windows-denfender-offline/</id>
    <published>2014-03-02T07:08:07.000Z</published>
    <updated>2015-01-31T13:56:34.907Z</updated>
    
    <content type="html"><![CDATA[<p>话说之前提到了最近电脑总抽筋，而且还在这个特别忙的时段里。</p><p>为了解决这个让人伤感的问题，irst也折腾了无数遍，硬盘检测了若干次，免费杀毒软件挨着用，仍然无济于事。</p><p>啊，对了，这个问题是windows8.1的taskhostex.exe进程间歇性抽风发作，占用磁盘读写60%-100%，查遍谷歌度娘也没找到解决方法，哪位大侠有高招请赐教。</p><p>好了，回到正题，谷歌上有一条来自ms community的建议，说是使用标题中提到的Windows Denfender Offline进行木马病毒排查。</p><p><img src="http://image15-c.poco.cn/mypoco/myphoto/20140305/18/6609835920140305183617033.png"></p><p>抱着试一试的态度，去微软官网下载了beta版安装程序（官网说8.1要使用beta版）。进入流程就傻眼了，还要下载文件……立马开始搜索mdo的iso文件，但是…网上居然没有！于是开始自己下载。历经1个小时和6次重试，终于把镜像下载到本地了。刻盘，重启，进wdo扫描，无果……</p><p>想到既然都下了，那还是贡献出来吧。</p><p>百度网盘：<a href="http://pan.baidu.com/s/1sjFDmhf">http://pan.baidu.com/s/1sjFDmhf</a>。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;话说之前提到了最近电脑总抽筋，而且还在这个特别忙的时段里。&lt;/p&gt;
&lt;p&gt;为了解决这个让人伤感的问题，irst也折腾了无数遍，硬盘检测了若干次，免费杀毒软件挨着用，仍然无济于事。&lt;/p&gt;
&lt;p&gt;啊，对了，这个问题是windows8.1的taskhostex.exe进程间歇性</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="windows" scheme="https://www.gsgundam.com/tags/windows/"/>
    
    <category term="8.1" scheme="https://www.gsgundam.com/tags/8-1/"/>
    
    <category term="beta" scheme="https://www.gsgundam.com/tags/beta/"/>
    
    <category term="defender" scheme="https://www.gsgundam.com/tags/defender/"/>
    
    <category term="io" scheme="https://www.gsgundam.com/tags/io/"/>
    
    <category term="irst" scheme="https://www.gsgundam.com/tags/irst/"/>
    
    <category term="iso" scheme="https://www.gsgundam.com/tags/iso/"/>
    
    <category term="offline" scheme="https://www.gsgundam.com/tags/offline/"/>
    
    <category term="taskhostex" scheme="https://www.gsgundam.com/tags/taskhostex/"/>
    
    <category term="wdo" scheme="https://www.gsgundam.com/tags/wdo/"/>
    
    <category term="磁盘读写" scheme="https://www.gsgundam.com/tags/%E7%A3%81%E7%9B%98%E8%AF%BB%E5%86%99/"/>
    
  </entry>
  
  <entry>
    <title>极风游科技官网更新啦！</title>
    <link href="https://www.gsgundam.com/archive/2014-02-21-dashgame-website-updated/"/>
    <id>https://www.gsgundam.com/archive/2014-02-21-dashgame-website-updated/</id>
    <published>2014-02-21T08:25:23.000Z</published>
    <updated>2018-11-07T05:35:26.126Z</updated>
    
    <content type="html"><![CDATA[<p>最近虽然各种事情都很多，但极风游官网自适应的事情一直耿耿于怀，终于花了一天时间处理掉了。</p><p>在原来最大适应1200像素的基础上，新增了1600像素宽度适应。优化了各种分辨率下的显示，部分元素做了特殊处理。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/newsite.jpg"></p><p>新版本的账单分期计算器安卓版已经在豌豆荚上架了（ <a href="http://www.wandoujia.com/apps/com.dashgame.billstagingcalc">http://www.wandoujia.com/apps/com.dashgame.billstagingcalc</a> ）。</p><p>因为电脑最近抽筋得厉害，所以干什么效率都低，加上还有比这个 更优先的工程，所以iOS和Windows Phone版的账单分期计算器就延后了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近虽然各种事情都很多，但极风游官网自适应的事情一直耿耿于怀，终于花了一天时间处理掉了。&lt;/p&gt;
&lt;p&gt;在原来最大适应1200像素的基础上，新增了1600像素宽度适应。优化了各种分辨率下的显示，部分元素做了特殊处理。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gsg</summary>
      
    
    
    
    <category term="项目开发" scheme="https://www.gsgundam.com/categories/%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="极风游" scheme="https://www.gsgundam.com/tags/%E6%9E%81%E9%A3%8E%E6%B8%B8/"/>
    
    <category term="官网" scheme="https://www.gsgundam.com/tags/%E5%AE%98%E7%BD%91/"/>
    
    <category term="自适应" scheme="https://www.gsgundam.com/tags/%E8%87%AA%E9%80%82%E5%BA%94/"/>
    
    <category term="html5" scheme="https://www.gsgundam.com/tags/html5/"/>
    
    <category term="responsive" scheme="https://www.gsgundam.com/tags/responsive/"/>
    
    <category term="响应式" scheme="https://www.gsgundam.com/tags/%E5%93%8D%E5%BA%94%E5%BC%8F/"/>
    
    <category term="计算器" scheme="https://www.gsgundam.com/tags/%E8%AE%A1%E7%AE%97%E5%99%A8/"/>
    
    <category term="账单分期" scheme="https://www.gsgundam.com/tags/%E8%B4%A6%E5%8D%95%E5%88%86%E6%9C%9F/"/>
    
  </entry>
  
  <entry>
    <title>Flappy Bird Html5</title>
    <link href="https://www.gsgundam.com/archive/2014-02-11-flappy-bird-html5/"/>
    <id>https://www.gsgundam.com/archive/2014-02-11-flappy-bird-html5/</id>
    <published>2014-02-11T04:27:12.000Z</published>
    <updated>2018-11-07T05:33:51.990Z</updated>
    
    <content type="html"><![CDATA[<p>Flappy Bird （像素鸟）因为作者个人原因直接下架了。一款一夜爆红的游戏为什么会如此收场？作者到底是什么来头？他接下来还会做什么？装有Flappy Bird的手机最终价值会不会超过100万元？</p><p>以上这些，都不是今天的论题。</p><p>这么火、<strong>这么虐</strong>的游戏只在手机上怎么行？所以有人用html5复制了Flappy Bird，除了画面比原作要更简单，核心绝对一样，喜(nue)大(ren)普(wu)奔(jin)吧！</p><p>有一位兄台给我分享了这个项目，并且是开源的，代码就在GitHub上， <a href="https://github.com/chairuosen/FlappyBird-By-JS">https://github.com/chairuosen/FlappyBird-By-JS</a></p><p>当然你可以在这个网址（<a href="http://bird.ruosen.io/">http://bird.ruosen.io/</a>）上找到这个游戏，获得高(zi)分(nue)，并且与其他人进行排名比较。</p><p>[<img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/flappybird.jpg"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Flappy Bird （像素鸟）因为作者个人原因直接下架了。一款一夜爆红的游戏为什么会如此收场？作者到底是什么来头？他接下来还会做什么？装有Flappy Bird的手机最终价值会不会超过100万元？&lt;/p&gt;
&lt;p&gt;以上这些，都不是今天的论题。&lt;/p&gt;
&lt;p&gt;这么火、&lt;st</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="github" scheme="https://www.gsgundam.com/tags/github/"/>
    
    <category term="javascript" scheme="https://www.gsgundam.com/tags/javascript/"/>
    
    <category term="js" scheme="https://www.gsgundam.com/tags/js/"/>
    
    <category term="html" scheme="https://www.gsgundam.com/tags/html/"/>
    
    <category term="html5" scheme="https://www.gsgundam.com/tags/html5/"/>
    
    <category term="Bird" scheme="https://www.gsgundam.com/tags/Bird/"/>
    
    <category term="Flappy" scheme="https://www.gsgundam.com/tags/Flappy/"/>
    
    <category term="像素小鸟" scheme="https://www.gsgundam.com/tags/%E5%83%8F%E7%B4%A0%E5%B0%8F%E9%B8%9F/"/>
    
    <category term="像素鸟" scheme="https://www.gsgundam.com/tags/%E5%83%8F%E7%B4%A0%E9%B8%9F/"/>
    
  </entry>
  
  <entry>
    <title>星狮创想的日子（四）</title>
    <link href="https://www.gsgundam.com/archive/2014-01-24-since-idea-part-four/"/>
    <id>https://www.gsgundam.com/archive/2014-01-24-since-idea-part-four/</id>
    <published>2014-01-24T00:49:24.000Z</published>
    <updated>2018-11-07T05:32:49.882Z</updated>
    
    <content type="html"><![CDATA[<p>在星狮创想网页设计基础班的最后一部分，也是作为赠送课程和公开课的部分，是Flash课程。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/W3CSchoolCSS-test.jpg"></p><p>这个更巧了，之前就跟Fenix学习AS3来着。这部分个人有点小骄傲，因为感觉自己起点比较高。但是在学习的过程中才发现，原来我还有很多可学的。</p><p>原因很简单：所有的课程都为网页设计服务。</p><p>从画面效果、实现技巧到互动体验，全都围绕网页设计来。因此例如水波的制作，循环动画的处理，都用了我以前没用过的方式，也学到了一些广告的处理方法。</p><p>BTW，刘俊言老师以前就是做互动广告的。</p><p>好了，最后展示一下劣作吧，只有3个比较拿得出手，自己最喜欢大门五郎那段。</p><p><object width="550" height="400" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.swfcabin.com/swf-files/1390480857.swf" /><param name="pluginspage" value="http://www.macromedia.com/go/getflashplayer" /><embed width="550" height="400" type="application/x-shockwave-flash" src="http://www.swfcabin.com/swf-files/1390480857.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" /></object></p><p><strong>Loading</strong></p><p><object width="550" height="320" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.swfcabin.com/swf-files/1390528900.swf" /><embed width="550" height="320" type="application/x-shockwave-flash" src="http://www.swfcabin.com/swf-files/1390528900.swf" /></object></p><p><strong>大门五郎</strong></p><p><object width="650" height="400" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.swfcabin.com/swf-files/1390528942.swf" /><embed width="650" height="400" type="application/x-shockwave-flash" src="http://www.swfcabin.com/swf-files/1390528942.swf" /></object></p><p><strong>W3CSchool CSS 测验</strong></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;在星狮创想网页设计基础班的最后一部分，也是作为赠送课程和公开课的部分，是Flash课程。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/W3CSc</summary>
      
    
    
    
    <category term="各种想法" scheme="https://www.gsgundam.com/categories/%E5%90%84%E7%A7%8D%E6%83%B3%E6%B3%95/"/>
    
    
    <category term="FLASH" scheme="https://www.gsgundam.com/tags/FLASH/"/>
    
    <category term="swf" scheme="https://www.gsgundam.com/tags/swf/"/>
    
    <category term="html" scheme="https://www.gsgundam.com/tags/html/"/>
    
    <category term="si27" scheme="https://www.gsgundam.com/tags/si27/"/>
    
    <category term="sinceidea" scheme="https://www.gsgundam.com/tags/sinceidea/"/>
    
    <category term="上课" scheme="https://www.gsgundam.com/tags/%E4%B8%8A%E8%AF%BE/"/>
    
    <category term="刘俊言" scheme="https://www.gsgundam.com/tags/%E5%88%98%E4%BF%8A%E8%A8%80/"/>
    
    <category term="星狮创想" scheme="https://www.gsgundam.com/tags/%E6%98%9F%E7%8B%AE%E5%88%9B%E6%83%B3/"/>
    
    <category term="网站" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E7%AB%99/"/>
    
    <category term="网页设计" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="远程教学" scheme="https://www.gsgundam.com/tags/%E8%BF%9C%E7%A8%8B%E6%95%99%E5%AD%A6/"/>
    
    <category term="webdesign" scheme="https://www.gsgundam.com/tags/webdesign/"/>
    
    <category term="暴雪" scheme="https://www.gsgundam.com/tags/%E6%9A%B4%E9%9B%AA/"/>
    
  </entry>
  
  <entry>
    <title>星狮创想的日子（三）</title>
    <link href="https://www.gsgundam.com/archive/2014-01-22-since-idea-part-three/"/>
    <id>https://www.gsgundam.com/archive/2014-01-22-since-idea-part-three/</id>
    <published>2014-01-22T08:36:14.000Z</published>
    <updated>2018-11-07T05:31:41.619Z</updated>
    
    <content type="html"><![CDATA[<p>星狮创想的第二阶段是让我具备前端工程师基本素质的过程——Html+CSS。</p><p>这期间我非常投入，正好在那之前刚学习过actionscript3，加上自己在大学期间就开过班级学习站，对网页开发其实特别有感情。以现在来看自己大学的第一个站，技术方面当然是烂到爆了，但是内容上却十分有想法，虽然是自己兴趣建站，到后来吸引了好几个同学来提供自己版本的复习大纲，整个年级更是几乎所有人都来关注网站。</p><p>好吧，有点扯远了。</p><p>整个课程讲得并不是那么深，主要以打底子为主。但是绝不是敷衍了事，我是真真实实的从中学到了语义化结构化的思维和方法。</p><p>同时我也感受到，前端技术很重要，但它是以实现设计效果为目的的。两者相互依存，才让用户在网站的浅度操作上得到良好体验。</p><p>这期间有很多作业，不少作业也很有特点。但是印象最深刻的，是刘老师即兴发挥，让我们仿暴雪官网首页。作为初学者，这个命题难度够呛，作为学委，我又必须带好头尽量实现。</p><p>虽然现在再做这样的站十分轻松了，但现在看来这个作品也不差，可见当时自己还是下了功夫的，哈哈。废话少说了，看看吧。</p><p><a href="http://battlearray.dashgame.com/case/Blizzard/">查看DEMO</a></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/blizzard-index.jpg"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;星狮创想的第二阶段是让我具备前端工程师基本素质的过程——Html+CSS。&lt;/p&gt;
&lt;p&gt;这期间我非常投入，正好在那之前刚学习过actionscript3，加上自己在大学期间就开过班级学习站，对网页开发其实特别有感情。以现在来看自己大学的第一个站，技术方面当然是烂到爆了，但</summary>
      
    
    
    
    <category term="各种想法" scheme="https://www.gsgundam.com/categories/%E5%90%84%E7%A7%8D%E6%83%B3%E6%B3%95/"/>
    
    
    <category term="html" scheme="https://www.gsgundam.com/tags/html/"/>
    
    <category term="css" scheme="https://www.gsgundam.com/tags/css/"/>
    
    <category term="si27" scheme="https://www.gsgundam.com/tags/si27/"/>
    
    <category term="sinceidea" scheme="https://www.gsgundam.com/tags/sinceidea/"/>
    
    <category term="上课" scheme="https://www.gsgundam.com/tags/%E4%B8%8A%E8%AF%BE/"/>
    
    <category term="刘俊言" scheme="https://www.gsgundam.com/tags/%E5%88%98%E4%BF%8A%E8%A8%80/"/>
    
    <category term="星狮创想" scheme="https://www.gsgundam.com/tags/%E6%98%9F%E7%8B%AE%E5%88%9B%E6%83%B3/"/>
    
    <category term="网站" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E7%AB%99/"/>
    
    <category term="网页设计" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="远程教学" scheme="https://www.gsgundam.com/tags/%E8%BF%9C%E7%A8%8B%E6%95%99%E5%AD%A6/"/>
    
    <category term="webdesign" scheme="https://www.gsgundam.com/tags/webdesign/"/>
    
    <category term="暴雪" scheme="https://www.gsgundam.com/tags/%E6%9A%B4%E9%9B%AA/"/>
    
    <category term="blizzard" scheme="https://www.gsgundam.com/tags/blizzard/"/>
    
  </entry>
  
  <entry>
    <title>jQuery.resBg - 页面背景自适应插件</title>
    <link href="https://www.gsgundam.com/archive/2014-01-21-jquery-resbg-responsive-background-picture-plugin/"/>
    <id>https://www.gsgundam.com/archive/2014-01-21-jquery-resbg-responsive-background-picture-plugin/</id>
    <published>2014-01-21T07:52:36.000Z</published>
    <updated>2022-11-28T05:38:24.148Z</updated>
    
    <content type="html"><![CDATA[<p>碰到一个客户网站的首页需要参考以纯Yishion官网的处理方式，并且不用flash实现。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/tutorial/jQuery.resBg.jpg"></p><p>这个需求基本上可以概括为两点：</p><ol><li><p>背景图覆盖全屏</p></li><li><p>背景图要做到浏览器自适应（同时适应高度和宽度）</p></li></ol><p>脑袋里理了一下思路，直接用CSS设置背景基本上不太可能办到了。于是开始自己整理js实现的思路。</p><ol><li><p>将图片独立出来，用CSS控制它<code>position:absolute;</code> 然后放置到最底层<code>z-index:-1;</code></p></li><li><p>使用js控制其跟随页面变化，但是考虑到图片变形，因此不能直接跟着页面宽高而变化，需要按照比例。例如宽度如果小于高度与宽度的比例值，则宽度不能再缩小了，只缩小高度。</p></li></ol><p>今天心情比较舒畅，索性把这个功能做成了一个插件。由于托管在Github，可能有些时候直接下载资源包会有问题，可以到 <a href="https://github.com/gsgundam/jQuery.resBg">https://github.com/gsgundam/jQuery.resBg</a> 直接引用或拷贝文件。</p><p><a href="https://github.com/gsgundam/jQuery.resBg/archive/master.zip">下载插件</a></p><p>效果基本没问题，下面用一个html文件讲解使用方法（特别说明一下参数position，主要用途是控制是否可以查看整个背景，简单来说就是使用absolute时可能出现滚动条，而fixed不会）:</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!doctype <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;utf-8&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">&quot;Content-Type&quot;</span> <span class="attr">content</span>=<span class="string">&quot;text/html; charset=utf-8&quot;</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">&quot;description&quot;</span> <span class="attr">content</span>=<span class="string">&quot;jQuery.resBg - 一个简单的自适应页面背景插件&quot;</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;description&quot;</span> <span class="attr">content</span>=<span class="string">&quot;jQuery.resBg - 一个简单的自适应页面背景插件&quot;</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;author&quot;</span> <span class="attr">content</span>=<span class="string">&quot;gsgundam&quot;</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">title</span>&gt;</span>jQuery.resBg - 一个简单的自适应页面背景插件<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;http://libs.baidu.com/jquery/1.10.2/jquery.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;js/jQuery.resBg.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">$(<span class="variable language_">document</span>).<span class="title function_">ready</span>(<span class="keyword">function</span>(<span class="params"></span>) &#123;</span></span><br><span class="line"><span class="language-javascript">    $(<span class="string">&quot;#bg&quot;</span>).<span class="title function_">resBg</span>(&#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="attr">position</span>: <span class="string">&#x27;absolute&#x27;</span> <span class="comment">//可选， &#x27;absolute&#x27;或&#x27;fixed&#x27;</span></span></span><br><span class="line"><span class="language-javascript">    &#125;);</span></span><br><span class="line"><span class="language-javascript">&#125;);</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;img/bg.jpg&quot;</span> <span class="attr">class</span>=<span class="string">&quot;resBg&quot;</span> <span class="attr">id</span>=<span class="string">&quot;bg&quot;</span> /&gt;</span>  <span class="comment">&lt;!-- 使用resBg类来明确背景图片,一定要放在&lt;body&gt;层 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">p</span> <span class="attr">style</span>=<span class="string">&quot;color:#eee; display:block; font-size:36px; text-align:center; font-family:arial, &#x27;微软雅黑&#x27;; margin-top:60px;&quot;</span>&gt;</span>STEVE JOBS&#x27; WORK<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">p</span> <span class="attr">style</span>=<span class="string">&quot;color:#eee; display:block; text-align:center; font-family:arial, &#x27;微软雅黑&#x27;;&quot;</span>&gt;</span> 这是一个演示网站，背景大小会随着浏览器大小改变<span class="tag">&lt;<span class="name">br</span>&gt;</span>This is a demo. The background picture will resize when your browser size changes.<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>欢迎有人来指出问题，提出建议。我会尽量完善。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;碰到一个客户网站的首页需要参考以纯Yishion官网的处理方式，并且不用flash实现。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/tutorial/j</summary>
      
    
    
    
    <category term="小插件" scheme="https://www.gsgundam.com/categories/%E5%B0%8F%E6%8F%92%E4%BB%B6/"/>
    
    
    <category term="插件" scheme="https://www.gsgundam.com/tags/%E6%8F%92%E4%BB%B6/"/>
    
    <category term="plugin" scheme="https://www.gsgundam.com/tags/plugin/"/>
    
    <category term="javascript" scheme="https://www.gsgundam.com/tags/javascript/"/>
    
    <category term="jQuery" scheme="https://www.gsgundam.com/tags/jQuery/"/>
    
    <category term="网页" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E9%A1%B5/"/>
    
    <category term="js" scheme="https://www.gsgundam.com/tags/js/"/>
    
    <category term="html" scheme="https://www.gsgundam.com/tags/html/"/>
    
    <category term="网页前端" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E9%A1%B5%E5%89%8D%E7%AB%AF/"/>
    
    <category term="开发" scheme="https://www.gsgundam.com/tags/%E5%BC%80%E5%8F%91/"/>
    
    <category term="jQuery.resBg" scheme="https://www.gsgundam.com/tags/jQuery-resBg/"/>
    
    <category term="resBg" scheme="https://www.gsgundam.com/tags/resBg/"/>
    
    <category term="背景" scheme="https://www.gsgundam.com/tags/%E8%83%8C%E6%99%AF/"/>
    
    <category term="自适应" scheme="https://www.gsgundam.com/tags/%E8%87%AA%E9%80%82%E5%BA%94/"/>
    
  </entry>
  
  <entry>
    <title>PhoneGap开发心得（四） iOS项目Tip</title>
    <link href="https://www.gsgundam.com/archive/2014-01-21-phonegap-develop-part-four-ios-tip/"/>
    <id>https://www.gsgundam.com/archive/2014-01-21-phonegap-develop-part-four-ios-tip/</id>
    <published>2014-01-21T00:56:17.000Z</published>
    <updated>2015-01-31T13:56:34.988Z</updated>
    
    <content type="html"><![CDATA[<p>#1. 归档与上传</p><p>上传发布版本之前需要将Release处均改为发行版设置。</p><p>包括下图中的部分，开启方式为 Product → Scheme → Edit Scheme。</p><p><img src="http://static.oschina.net/uploads/space/2013/1014/180601_XlHe_152736.jpg"></p><p>然后通过Product → Archive进行归档。在所有信息都正确的前提下，可以直接选择发布企业版或上传到APP STORE，这样就不用专门过一遍Application Loader了。</p><p>#2. Team成员</p><p>在Xcode中点击.xcodeproj项目文件，在中间窗口里点击Team项目，选择一个有效的成员。否则不能正常导出发行版。</p><p>#3. 证书与授权</p><p>基本参照Appstore发布流程中的步骤即可。网上文章非常多，就不赘述了。附送一篇文章地址：<a href="http://blog.csdn.net/htttw/article/details/7981395">http://blog.csdn.net/htttw/article/details/7981395</a>。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;#1. 归档与上传&lt;/p&gt;
&lt;p&gt;上传发布版本之前需要将Release处均改为发行版设置。&lt;/p&gt;
&lt;p&gt;包括下图中的部分，开启方式为 Product → Scheme → Edit Scheme。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://static.oschin</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="证书" scheme="https://www.gsgundam.com/tags/%E8%AF%81%E4%B9%A6/"/>
    
    <category term="开发" scheme="https://www.gsgundam.com/tags/%E5%BC%80%E5%8F%91/"/>
    
    <category term="ios" scheme="https://www.gsgundam.com/tags/ios/"/>
    
    <category term="PhoneGap" scheme="https://www.gsgundam.com/tags/PhoneGap/"/>
    
    <category term="xcode" scheme="https://www.gsgundam.com/tags/xcode/"/>
    
    <category term="发布" scheme="https://www.gsgundam.com/tags/%E5%8F%91%E5%B8%83/"/>
    
    <category term="appstore" scheme="https://www.gsgundam.com/tags/appstore/"/>
    
    <category term="授权" scheme="https://www.gsgundam.com/tags/%E6%8E%88%E6%9D%83/"/>
    
  </entry>
  
  <entry>
    <title>PhoneGap开发心得（三） 搭建PhoneGap+Xcode+iOS环境</title>
    <link href="https://www.gsgundam.com/archive/2014-01-20-phonegap-develop-part-three-ios-environment/"/>
    <id>https://www.gsgundam.com/archive/2014-01-20-phonegap-develop-part-three-ios-environment/</id>
    <published>2014-01-19T19:41:08.000Z</published>
    <updated>2022-11-28T05:39:21.554Z</updated>
    
    <content type="html"><![CDATA[<p>倒腾完Android端，自然就该iOS了。不得不含泪打开了vbox虚拟机的黑苹果OS X 10.8.5，忍受各种不正常来进行苹果开发。</p><p>#1. 安装</p><p>Xcode就不用说。都2014年了，一定要使用Xcode5，不然没法发布iOS7应用。</p><p>接着下载PhoneGap就好了（<a href="http://phonegap.com/install/">点击这里下载</a>）。有个比较严肃的问题，OS X下实在找不到安装版的PhoneGap到底去了何方，所以直接下载了2.9.1版使用。</p><p>好吧，这样直接就安装完了。是不是感觉很简单的样子？</p><p>#2. 新建项目</p><p>使用PhoneGap&#x2F;create命令创建项目，例如</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ ./create /Users/gsgundam/Documents/Workspace/Xcode/iphone com.dashgame HelloWorld</span><br></pre></td></tr></table></figure><p>注意，项目目录要事先创建好，同时赋予读写权限：chmod 777</p><p>如果遇到empty folder的错误，那就把iphone目录清空一下就好了。</p><p>如果什么都没有打印，那就说明成功了。进入刚才的目录，可以看到一个.xcodeproj后缀名的文件，双击使用xCode打开。</p><p>#3. Xcode设置</p><p>默认打开目录结构如下：</p><p><img src="http://static.oschina.net/uploads/space/2013/1014/181758_89js_152736.jpg"></p><p>与Android项目一样，www文件夹就是网页目录地址，如果直接拷贝Android项目过来，需要将cordova.js替换为iOS版的，就在之前下载的PhoneGap2.9.1的包中。</p><p>要修改安装后的显示名称，在xxx.info.plist文件中的Bundle display name，如下图。</p><p><img src="http://static.oschina.net/uploads/space/2013/1014/174737_96O8_152736.jpg"></p><p>在Classes&#x2F;AppDelegate.m中添加下面代码修改默认启动文件，按照实际目录修改！</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">self.viewController.wwwFolderName = @&quot;www&quot;;</span><br><span class="line">self.viewController.startPage = @&quot;index.html&quot;;</span><br></pre></td></tr></table></figure><p>点击菜单Product → Build，出现带Success的锤子图标，就成功了。</p><p>网上还说可以看看Products文件夹中，如果有一个.app文件，那就把它拖到iTunes中再拖出来就成了.ipa文件，可以直接在越狱机上安装了。我没有进行尝试，只在本地黑苹果调试成功以后，就开始上传工作了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;倒腾完Android端，自然就该iOS了。不得不含泪打开了vbox虚拟机的黑苹果OS X 10.8.5，忍受各种不正常来进行苹果开发。&lt;/p&gt;
&lt;p&gt;#1. 安装&lt;/p&gt;
&lt;p&gt;Xcode就不用说。都2014年了，一定要使用Xcode5，不然没法发布iOS7应用。&lt;/p&gt;
</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="开发" scheme="https://www.gsgundam.com/tags/%E5%BC%80%E5%8F%91/"/>
    
    <category term="cordova" scheme="https://www.gsgundam.com/tags/cordova/"/>
    
    <category term="ios" scheme="https://www.gsgundam.com/tags/ios/"/>
    
    <category term="ipa" scheme="https://www.gsgundam.com/tags/ipa/"/>
    
    <category term="osx" scheme="https://www.gsgundam.com/tags/osx/"/>
    
    <category term="PhoneGap" scheme="https://www.gsgundam.com/tags/PhoneGap/"/>
    
    <category term="xcode" scheme="https://www.gsgundam.com/tags/xcode/"/>
    
  </entry>
  
  <entry>
    <title>PhoneGap开发心得（二） Android项目Tip</title>
    <link href="https://www.gsgundam.com/archive/2014-01-18-phonegap-develop-part-two-android-tip/"/>
    <id>https://www.gsgundam.com/archive/2014-01-18-phonegap-develop-part-two-android-tip/</id>
    <published>2014-01-18T05:21:13.000Z</published>
    <updated>2022-11-28T05:38:55.995Z</updated>
    
    <content type="html"><![CDATA[<p>#1. 运行中旋转屏幕导致应用退出</p><p>解决办法：为activity标签中的configChanges添加screenSize属性，如下：</p><p><code>android:configChanges=&quot;orientation|**screenSize**|keyboardHidden&quot;</code></p><p>原因：通常情况下，PhoneGap在设备旋转屏幕后不能正确获得屏幕大小导致出错。网上还有其他办法，比如调低sdk版本，但是个人发现在PhoneGap 3.3.0不适用（很多标签和代码已经与2.x不同了）。</p><p>#2. versionCode和versionName</p><p>由于不是程序出身，可能开始对这两个东西的概念不是太明确，所以也没管他。</p><p>老程序猿们估计都不会认为这个也算问题。</p><p>但是我在实际发布的时候发现了自己的问题，因为在更新版本的时候，不知道应该修改哪个。</p><p>最终依靠度娘和谷歌解决了这个疑问：versionCode是给开发团队和App商店用的，用以标记有版本改动，与build概念很像；versionName是给用户看的，没有实际的用处，只是给用户一个更简单明确的途径了解应用现在是那个版本。由于versionCode可能迅速的叠加得很大，导致用户无法正确识别版本，因此后者的作用也很大。</p><p>所以在发布公开版本时，两个都需要修改。</p><p>#3. 发布与数字签名</p><p>问题：在Google Play中提交应用，提示数字签名不为发布版，以及应用没有经过Zipalign对齐。</p><p>同样的问题没有出现在豌豆荚和亚马逊，应该是因为这二位不关心这两个问题。</p><p>解决办法：</p><p>在Eclipse中，使用ADT Export Wizard进行签名比较容易。右键单击应用程序工程，如图选择</p><p><img src="http://images.cnblogs.com/cnblogs_com/feisky/WindowsLiveWriter/8083a2df1f14_EADF/image_8.png"></p><p>选择证书的存放路径，填写相关资料，完成，即可生成被签名的apk文件。如下图所示：</p><p><img src="http://images.cnblogs.com/cnblogs_com/feisky/WindowsLiveWriter/8083a2df1f14_EADF/image_10.png"></p><p>如上图所示，可以在这里选择<code>Create new keystore</code>来创建一个证书。输入密码，点击下一步，填写相关信息，如下图所示。</p><p><img src="http://images.cnblogs.com/cnblogs_com/feisky/WindowsLiveWriter/8083a2df1f14_EADF/image_12.png"></p><p>ADT导出项目自动Zipalign对齐，因此问题直接解决。</p><p>#4. 升级推送</p><p>参考以下代码即可，但是必须在xml中开启相关权限，包括网络、挂载、安装、存储。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.io.BufferedReader;</span><br><span class="line"><span class="keyword">import</span> java.io.File;</span><br><span class="line"><span class="keyword">import</span> java.io.FileOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStreamReader;</span><br><span class="line"><span class="keyword">import</span> java.net.HttpURLConnection;</span><br><span class="line"><span class="keyword">import</span> java.net.URL;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.apache.cordova.DroidGap;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.HttpEntity;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.HttpResponse;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.client.HttpClient;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.client.methods.HttpGet;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.impl.client.DefaultHttpClient;</span><br><span class="line"><span class="keyword">import</span> org.json.JSONArray;</span><br><span class="line"><span class="keyword">import</span> org.json.JSONObject;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.example.syzx.MainActivity;</span><br><span class="line"><span class="keyword">import</span> com.example.syzx.R;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> android.net.ConnectivityManager;</span><br><span class="line"><span class="keyword">import</span> android.net.NetworkInfo;</span><br><span class="line"><span class="keyword">import</span> android.net.Uri;</span><br><span class="line"><span class="keyword">import</span> android.os.Bundle;</span><br><span class="line"><span class="keyword">import</span> android.os.Environment;</span><br><span class="line"><span class="keyword">import</span> android.os.Handler;</span><br><span class="line"><span class="keyword">import</span> android.os.Message;</span><br><span class="line"><span class="keyword">import</span> android.os.StrictMode;</span><br><span class="line"><span class="keyword">import</span> android.annotation.SuppressLint;</span><br><span class="line"><span class="keyword">import</span> android.app.AlertDialog;</span><br><span class="line"><span class="keyword">import</span> android.app.Dialog;</span><br><span class="line"><span class="keyword">import</span> android.app.ProgressDialog;</span><br><span class="line"><span class="keyword">import</span> android.content.ComponentName;</span><br><span class="line"><span class="keyword">import</span> android.content.Context;</span><br><span class="line"><span class="keyword">import</span> android.content.DialogInterface;</span><br><span class="line"><span class="keyword">import</span> android.content.Intent;</span><br><span class="line"><span class="keyword">import</span> android.content.pm.PackageInfo;</span><br><span class="line"><span class="keyword">import</span> android.content.pm.PackageManager;</span><br><span class="line"><span class="keyword">import</span> android.content.pm.PackageManager.NameNotFoundException;</span><br><span class="line"><span class="keyword">import</span> android.util.Log;</span><br><span class="line"></span><br><span class="line"><span class="meta">@SuppressLint(&#123; &quot;HandlerLeak&quot;, &quot;NewApi&quot; &#125;)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MainActivity</span> <span class="keyword">extends</span> <span class="title class_">DroidGap</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="type">String</span> <span class="variable">jsonurl</span> <span class="operator">=</span> <span class="string">&quot;http://192.168.2.100/app/version.js&quot;</span>;</span><br><span class="line"><span class="type">String</span> <span class="variable">newVerName</span> <span class="operator">=</span> <span class="string">&quot;&quot;</span>; <span class="comment">// 新版本名称</span></span><br><span class="line"><span class="type">String</span> <span class="variable">downurl</span> <span class="operator">=</span> <span class="string">&quot;&quot;</span>; <span class="comment">//下载 地址</span></span><br><span class="line"><span class="type">int</span> <span class="variable">newVerCode</span> <span class="operator">=</span> -<span class="number">1</span>; <span class="comment">// 新版本号</span></span><br><span class="line"><span class="type">String</span> <span class="variable">UPDATE_SERVERAPK</span> <span class="operator">=</span> <span class="string">&quot;yhupdate.apk&quot;</span>;</span><br><span class="line"><span class="type">ProgressDialog</span> <span class="variable">pd</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">onCreate</span><span class="params">(Bundle savedInstanceState)</span> &#123;</span><br><span class="line"><span class="built_in">super</span>.onCreate(savedInstanceState);</span><br><span class="line">StrictMode.setThreadPolicy(<span class="keyword">new</span> <span class="title class_">StrictMode</span>.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());</span><br><span class="line"><span class="built_in">super</span>.setIntegerProperty(<span class="string">&quot;splashscreen&quot;</span>, R.drawable.splash);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(checkNetWorkStatus())&#123;</span><br><span class="line">updateVersion();</span><br><span class="line"><span class="built_in">super</span>.loadUrl(<span class="string">&quot;file:///android_asset/www/index.html&quot;</span>, <span class="number">3000</span>);</span><br><span class="line"><span class="comment">//super.loadUrl(&quot;file:///android_asset/www/test/index.html&quot;, 3000);</span></span><br><span class="line">&#125;  </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">* 检测版本</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">updateVersion</span><span class="params">()</span> &#123;</span><br><span class="line"><span class="keyword">if</span> (getServerVer()) &#123;</span><br><span class="line"><span class="type">int</span> <span class="variable">verCode</span> <span class="operator">=</span> <span class="built_in">this</span>.getVerCode(<span class="built_in">this</span>);</span><br><span class="line"><span class="keyword">if</span> (newVerCode &gt; verCode) &#123;</span><br><span class="line">doNewVersionUpdate();<span class="comment">// 更新版本</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">* 获得版本号</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getVerCode</span><span class="params">(Context context)</span> &#123;</span><br><span class="line"><span class="type">int</span> <span class="variable">verCode</span> <span class="operator">=</span> -<span class="number">1</span>;</span><br><span class="line"><span class="keyword">try</span> &#123;</span><br><span class="line"><span class="type">String</span> <span class="variable">packName</span> <span class="operator">=</span> context.getPackageName();</span><br><span class="line">verCode = context.getPackageManager().getPackageInfo(packName, <span class="number">0</span>).versionCode;</span><br><span class="line">&#125; <span class="keyword">catch</span> (NameNotFoundException e) &#123;</span><br><span class="line"><span class="comment">// TODO Auto-generated catch block</span></span><br><span class="line">Log.e(<span class="string">&quot;版本号获取异常&quot;</span>, e.getMessage());</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> verCode;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 获得版本名称</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">getVerName</span><span class="params">(Context context)</span>&#123;</span><br><span class="line">        <span class="type">String</span> <span class="variable">verName</span> <span class="operator">=</span> <span class="string">&quot;&quot;</span>;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">         <span class="type">String</span> <span class="variable">packName</span> <span class="operator">=</span> context.getPackageName();</span><br><span class="line">            verName = context.getPackageManager().getPackageInfo(packName, <span class="number">0</span>).versionName;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (NameNotFoundException e) &#123;</span><br><span class="line">            Log.e(<span class="string">&quot;版本名称获取异常&quot;</span>, e.getMessage());</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> verName;</span><br><span class="line">    &#125;</span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">* 检测版本</span></span><br><span class="line"><span class="comment">* <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">* <span class="doctag">@throws</span> Exception</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">public</span> String <span class="title function_">getVerName</span><span class="params">()</span>&#123;</span><br><span class="line">  <span class="comment">//获取包名</span></span><br><span class="line">  <span class="type">PackageManager</span> <span class="variable">packageManager</span> <span class="operator">=</span> getPackageManager();</span><br><span class="line"></span><br><span class="line">  <span class="type">PackageInfo</span> <span class="variable">packInfo</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"><span class="keyword">try</span> &#123;</span><br><span class="line">packInfo = packageManager.getPackageInfo(getPackageName(), <span class="number">0</span>);</span><br><span class="line">&#125; <span class="keyword">catch</span> (NameNotFoundException e) &#123;</span><br><span class="line"><span class="comment">// TODO 自动生成的 catch 块</span></span><br><span class="line">e.printStackTrace();</span><br><span class="line">&#125;</span><br><span class="line">      <span class="keyword">return</span> packInfo.versionName; </span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">* 从服务器端获得版本号与版本名称</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">getServerVer</span><span class="params">()</span> &#123;</span><br><span class="line"><span class="keyword">try</span> &#123;</span><br><span class="line"><span class="type">URL</span> <span class="variable">url</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">URL</span>(jsonurl);</span><br><span class="line"><span class="type">HttpURLConnection</span> <span class="variable">httpConnection</span> <span class="operator">=</span> (HttpURLConnection) url.openConnection();</span><br><span class="line">httpConnection.setDoInput(<span class="literal">true</span>);</span><br><span class="line">httpConnection.setDoOutput(<span class="literal">true</span>);</span><br><span class="line">httpConnection.setRequestMethod(<span class="string">&quot;GET&quot;</span>);</span><br><span class="line">httpConnection.connect();</span><br><span class="line"><span class="type">InputStreamReader</span> <span class="variable">reader</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">InputStreamReader</span>(httpConnection.getInputStream());</span><br><span class="line"><span class="type">BufferedReader</span> <span class="variable">bReader</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedReader</span>(reader);</span><br><span class="line"><span class="type">String</span> <span class="variable">json</span> <span class="operator">=</span> bReader.readLine();</span><br><span class="line"><span class="type">JSONArray</span> <span class="variable">array</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JSONArray</span>(json);</span><br><span class="line"><span class="type">JSONObject</span> <span class="variable">jsonObj</span> <span class="operator">=</span> array.getJSONObject(<span class="number">0</span>);</span><br><span class="line">newVerCode = Integer.parseInt(jsonObj.getString(<span class="string">&quot;verCode&quot;</span>));</span><br><span class="line">newVerName = jsonObj.getString(<span class="string">&quot;verName&quot;</span>);</span><br><span class="line">downurl = jsonObj.getString(<span class="string">&quot;downurl&quot;</span>);</span><br><span class="line">&#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line"><span class="comment">// TODO Auto-generated catch block</span></span><br><span class="line">e.printStackTrace();</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;<span class="comment">// 如果这里改为false 则不更新会退出程序</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">* 更新版本</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">doNewVersionUpdate</span><span class="params">()</span> &#123;</span><br><span class="line"><span class="type">int</span> <span class="variable">verCode</span> <span class="operator">=</span> <span class="built_in">this</span>.getVerCode(<span class="built_in">this</span>);</span><br><span class="line"><span class="type">String</span> <span class="variable">verName</span> <span class="operator">=</span> <span class="built_in">this</span>.getVerName(<span class="built_in">this</span>);</span><br><span class="line"><span class="type">StringBuffer</span> <span class="variable">sb</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuffer</span>();</span><br><span class="line">sb.append(<span class="string">&quot;当前版本：&quot;</span>);</span><br><span class="line">sb.append(verName);</span><br><span class="line">sb.append(<span class="string">&quot; V&quot;</span>);</span><br><span class="line">sb.append(verCode);</span><br><span class="line">sb.append(<span class="string">&quot;,发现版本：&quot;</span>);</span><br><span class="line">sb.append(newVerName);</span><br><span class="line">sb.append(<span class="string">&quot; V&quot;</span>);</span><br><span class="line">sb.append(newVerCode);</span><br><span class="line">sb.append(<span class="string">&quot;,是否更新?&quot;</span>);</span><br><span class="line"><span class="type">Dialog</span> <span class="variable">dialog</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AlertDialog</span>.Builder(<span class="built_in">this</span>)</span><br><span class="line">.setTitle(<span class="string">&quot;软件更新&quot;</span>)</span><br><span class="line">.setMessage(sb.toString())</span><br><span class="line">.setPositiveButton(<span class="string">&quot;更新&quot;</span>, <span class="keyword">new</span> <span class="title class_">DialogInterface</span>.OnClickListener() &#123;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">onClick</span><span class="params">(DialogInterface dialog, <span class="type">int</span> which)</span> &#123;</span><br><span class="line"><span class="comment">// TODO Auto-generated method stub</span></span><br><span class="line">pd = <span class="keyword">new</span> <span class="title class_">ProgressDialog</span>(MainActivity.<span class="built_in">this</span>);</span><br><span class="line">pd.setTitle(<span class="string">&quot;正在下载&quot;</span>);</span><br><span class="line">pd.setMessage(<span class="string">&quot;请稍后。。。&quot;</span>);</span><br><span class="line">pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);</span><br><span class="line">downFile(downurl);</span><br><span class="line">&#125;</span><br><span class="line">&#125;)</span><br><span class="line">.setNegativeButton(<span class="string">&quot;暂不更新&quot;</span>,</span><br><span class="line"><span class="keyword">new</span> <span class="title class_">DialogInterface</span>.OnClickListener() &#123;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">onClick</span><span class="params">(DialogInterface dialog,</span></span><br><span class="line"><span class="params"><span class="type">int</span> which)</span> &#123;</span><br><span class="line"><span class="comment">// TODO Auto-generated method stub</span></span><br><span class="line"><span class="comment">// finish();</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;).create();</span><br><span class="line"><span class="comment">// 显示更新框</span></span><br><span class="line">dialog.show();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">* 下载apk</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">downFile</span><span class="params">(<span class="keyword">final</span> String url)</span> &#123;</span><br><span class="line">pd.show();</span><br><span class="line"><span class="keyword">new</span> <span class="title class_">Thread</span>() &#123;</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">run</span><span class="params">()</span> &#123;</span><br><span class="line"><span class="type">HttpClient</span> <span class="variable">client</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DefaultHttpClient</span>();</span><br><span class="line"><span class="type">HttpGet</span> <span class="variable">get</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HttpGet</span>(url);</span><br><span class="line">HttpResponse response;</span><br><span class="line"><span class="keyword">try</span> &#123;</span><br><span class="line">response = client.execute(get);</span><br><span class="line"><span class="type">HttpEntity</span> <span class="variable">entity</span> <span class="operator">=</span> response.getEntity();</span><br><span class="line"><span class="comment">// long length = entity.getContentLength();</span></span><br><span class="line"><span class="type">InputStream</span> <span class="variable">is</span> <span class="operator">=</span> entity.getContent();</span><br><span class="line"><span class="type">FileOutputStream</span> <span class="variable">fileOutputStream</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"><span class="keyword">if</span> (is != <span class="literal">null</span>) &#123;</span><br><span class="line"><span class="type">File</span> <span class="variable">file</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">File</span>(</span><br><span class="line">Environment.getExternalStorageDirectory(),</span><br><span class="line">UPDATE_SERVERAPK);</span><br><span class="line">fileOutputStream = <span class="keyword">new</span> <span class="title class_">FileOutputStream</span>(file);</span><br><span class="line"><span class="type">byte</span>[] b = <span class="keyword">new</span> <span class="title class_">byte</span>[<span class="number">1024</span>];</span><br><span class="line"><span class="type">int</span> <span class="variable">charb</span> <span class="operator">=</span> -<span class="number">1</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">count</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span> ((charb = is.read(b)) != -<span class="number">1</span>) &#123;</span><br><span class="line">fileOutputStream.write(b, <span class="number">0</span>, charb);</span><br><span class="line">count += charb;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">fileOutputStream.flush();</span><br><span class="line"><span class="keyword">if</span> (fileOutputStream != <span class="literal">null</span>) &#123;</span><br><span class="line">fileOutputStream.close();</span><br><span class="line">&#125;</span><br><span class="line">down();</span><br><span class="line">&#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line"><span class="comment">// TODO Auto-generated catch block</span></span><br><span class="line">e.printStackTrace();</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;.start();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">Handler</span> <span class="variable">handler</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Handler</span>() &#123;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">handleMessage</span><span class="params">(Message msg)</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="built_in">super</span>.handleMessage(msg);</span><br><span class="line">pd.cancel();</span><br><span class="line">update();</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">* 下载完成，通过handler将下载对话框取消</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">down</span><span class="params">()</span> &#123;</span><br><span class="line"><span class="keyword">new</span> <span class="title class_">Thread</span>() &#123;</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">run</span><span class="params">()</span> &#123;</span><br><span class="line"><span class="type">Message</span> <span class="variable">message</span> <span class="operator">=</span> handler.obtainMessage();</span><br><span class="line">handler.sendMessage(message);</span><br><span class="line">&#125;</span><br><span class="line">&#125;.start();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">* 安装应用</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">update</span><span class="params">()</span> &#123;</span><br><span class="line"><span class="type">Intent</span> <span class="variable">intent</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Intent</span>(Intent.ACTION_VIEW);</span><br><span class="line">intent.setDataAndType(Uri.fromFile(<span class="keyword">new</span> <span class="title class_">File</span>(Environment</span><br><span class="line">.getExternalStorageDirectory(), UPDATE_SERVERAPK)),</span><br><span class="line"><span class="string">&quot;application/vnd.android.package-archive&quot;</span>);</span><br><span class="line">startActivity(intent);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">* check network Status</span></span><br><span class="line"><span class="comment">* </span></span><br><span class="line"><span class="comment">* <span class="doctag">@return</span> boolean</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">checkNetWorkStatus</span><span class="params">()</span> &#123;</span><br><span class="line"><span class="type">boolean</span> result;</span><br><span class="line"><span class="type">ConnectivityManager</span> <span class="variable">cm</span> <span class="operator">=</span> (ConnectivityManager) <span class="built_in">this</span></span><br><span class="line">.getSystemService(Context.CONNECTIVITY_SERVICE);</span><br><span class="line"><span class="type">NetworkInfo</span> <span class="variable">netinfo</span> <span class="operator">=</span> cm.getActiveNetworkInfo();</span><br><span class="line"><span class="keyword">if</span> (netinfo != <span class="literal">null</span> &amp;&amp; netinfo.isConnected()) &#123; <span class="comment">// 当前网络可用</span></span><br><span class="line">result = <span class="literal">true</span>;</span><br><span class="line">&#125; <span class="keyword">else</span> &#123; <span class="comment">// 不可用</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">new</span> <span class="title class_">AlertDialog</span>.Builder(MainActivity.<span class="built_in">this</span>)</span><br><span class="line">.setMessage(<span class="string">&quot;检查到没有可用的网络连接,请打开网络连接&quot;</span>)</span><br><span class="line">.setPositiveButton(<span class="string">&quot;确定&quot;</span>,</span><br><span class="line"><span class="keyword">new</span> <span class="title class_">DialogInterface</span>.OnClickListener() &#123;</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">onClick</span><span class="params">(</span></span><br><span class="line"><span class="params">DialogInterface dialoginterface, <span class="type">int</span> i)</span> &#123;</span><br><span class="line"><span class="type">ComponentName</span> <span class="variable">cn</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ComponentName</span>(</span><br><span class="line"><span class="string">&quot;com.android.settings&quot;</span>,</span><br><span class="line"><span class="string">&quot;com.android.settings.Settings&quot;</span>);</span><br><span class="line"><span class="type">Intent</span> <span class="variable">intent</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Intent</span>();</span><br><span class="line">intent.setComponent(cn);</span><br><span class="line">intent.setAction(<span class="string">&quot;android.intent.action.VIEW&quot;</span>);</span><br><span class="line">startActivity(intent);</span><br><span class="line">finish();</span><br><span class="line">&#125;</span><br><span class="line">&#125;).show();</span><br><span class="line">result = <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;#1. 运行中旋转屏幕导致应用退出&lt;/p&gt;
&lt;p&gt;解决办法：为activity标签中的configChanges添加screenSize属性，如下：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;android:configChanges=&amp;quot;orientation|**screenS</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="android" scheme="https://www.gsgundam.com/tags/android/"/>
    
    <category term="开发" scheme="https://www.gsgundam.com/tags/%E5%BC%80%E5%8F%91/"/>
    
    <category term="PhoneGap" scheme="https://www.gsgundam.com/tags/PhoneGap/"/>
    
    <category term="adt" scheme="https://www.gsgundam.com/tags/adt/"/>
    
    <category term="Eclipse" scheme="https://www.gsgundam.com/tags/Eclipse/"/>
    
    <category term="screensize" scheme="https://www.gsgundam.com/tags/screensize/"/>
    
    <category term="shooting" scheme="https://www.gsgundam.com/tags/shooting/"/>
    
    <category term="trouble" scheme="https://www.gsgundam.com/tags/trouble/"/>
    
    <category term="versioncode" scheme="https://www.gsgundam.com/tags/versioncode/"/>
    
    <category term="versionname" scheme="https://www.gsgundam.com/tags/versionname/"/>
    
    <category term="发布" scheme="https://www.gsgundam.com/tags/%E5%8F%91%E5%B8%83/"/>
    
    <category term="数字签名" scheme="https://www.gsgundam.com/tags/%E6%95%B0%E5%AD%97%E7%AD%BE%E5%90%8D/"/>
    
    <category term="旋转屏幕" scheme="https://www.gsgundam.com/tags/%E6%97%8B%E8%BD%AC%E5%B1%8F%E5%B9%95/"/>
    
  </entry>
  
  <entry>
    <title>PhoneGap开发心得（一） 搭建PhoneGap+Eclipse+Android环境</title>
    <link href="https://www.gsgundam.com/archive/2014-01-17-phonegap-develop-part-one-android-environment/"/>
    <id>https://www.gsgundam.com/archive/2014-01-17-phonegap-develop-part-one-android-environment/</id>
    <published>2014-01-17T14:04:45.000Z</published>
    <updated>2022-11-28T05:38:55.995Z</updated>
    
    <content type="html"><![CDATA[<p>最近实验一个小东西，需要用到PhoneGap打包编译Html项目，于是从头学起。</p><p>#1.安装</p><p>首先是JDK（<a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html">点击这里下载</a>）。不安装的话不能正常安装Android SDK。安装成功检测：启动DOS窗口start–&gt;run–&gt;cmd，在DOS窗口中键入：<code>java -version</code>，如能显示版本信息说明安装正常。</p><p>接着是ADK（<a href="http://developer.android.com/sdk/index.html">点击这里下载</a>）。安装完之后是一个Android SDK Manager，你需要下载以下组件（至少包含一个完整版本的文件内容），可能需要较长时间：<img src="http://pic002.cnblogs.com/images/2012/423946/2012081417413679.jpg"></p><p>再来是Eclipse（<a href="http://www.eclipse.org/downloads/">点击这里下载</a>）。强大的IDE，不用多说了吧。安个标准版就好。</p><p>接着给Eclipse装上ADT插件。打开Eclipse中的菜单 “Help”-&gt;”InstallNewSoftware”进入软件安装界面，点击“Add”按钮，Location地址栏填入：<code>https://dl-ssl.google.com/android/eclipse/</code>。</p><p>最后到了我们的主角，PhoneGap（<a href="http://phonegap.com/download">点击这里下载</a>）。需要注意的是，PhoneGap的最新版本似乎只支持命令行安装，可以根据官方文档安装Node.js以后直接安装，也可以下载2.x版本后备用。</p><p>#2.创建PhoneGap项目</p><p>1.在eclipse中新建<code>Android Project</code>。</p><p>2.在项目的目录下，新建两个文件夹：</p><p><code>/libs</code><br><code>/assets/www</code></p><p>3.进入将刚刚下载并解压的PhoneGap包里Anroid目录，我们需要的资源都在这个目录下。</p><p>复制<code>cordova.js</code>这个文件（具体名称视下载的版本而定，如果是直接安装的，从新建的PhoneGap项目中拷贝一个出来即可），粘贴到<code>/assets/www</code>目录下。</p><p>把<code>cordova.jar</code>文件复制到&#x2F;libs目录下（可能会发现在新版本的PhoneGap中找不到该文件，这里我提供一个3.3.0版本的，<a href="http://pan.baidu.com/s/1ntpwmV3">点击这里下载</a>）。</p><p>再把xml目录复制到android项目的res目录下。</p><p>4.在<code>/assets/www</code>下建立<code>index.html</code>文件，内容看起来像这样：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">HTML</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">title</span>&gt;</span>PhoneGap<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span> <span class="attr">src</span>=<span class="string">&quot;cordova.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">h1</span>&gt;</span>Hello World<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>5.将以下权限配置的xml内容复制到<code>AndroidManifest.xml</code>文件中（这里粘贴了所有权限，在实际项目过程中注意清除掉没用的）：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">supports-screens</span></span></span><br><span class="line"><span class="tag"></span></span><br><span class="line"><span class="tag"><span class="attr">android:largeScreens</span>=<span class="string">&quot;true&quot;</span></span></span><br><span class="line"><span class="tag"></span></span><br><span class="line"><span class="tag"><span class="attr">android:normalScreens</span>=<span class="string">&quot;true&quot;</span></span></span><br><span class="line"><span class="tag"></span></span><br><span class="line"><span class="tag"><span class="attr">android:smallScreens</span>=<span class="string">&quot;true&quot;</span></span></span><br><span class="line"><span class="tag"></span></span><br><span class="line"><span class="tag"><span class="attr">android:resizeable</span>=<span class="string">&quot;true&quot;</span></span></span><br><span class="line"><span class="tag"></span></span><br><span class="line"><span class="tag"><span class="attr">android:anyDensity</span>=<span class="string">&quot;true&quot;</span></span></span><br><span class="line"><span class="tag"></span></span><br><span class="line"><span class="tag">/&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.CAMERA&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.VIBRATE&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.ACCESS_COARSE_LOCATION&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.ACCESS_FINE_LOCATION&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.ACCESS_LOCATION_EXTRA_COMMANDS&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.READ_PHONE_STATE&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.INTERNET&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.RECEIVE_SMS&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.RECORD_AUDIO&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.MODIFY_AUDIO_SETTINGS&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.READ_CONTACTS&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.WRITE_CONTACTS&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot;</span> /&gt;</span><span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.ACCESS_NETWORK_STATE&quot;</span> /&gt;</span> <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.GET_ACCOUNTS&quot;</span> /&gt;</span></span><br></pre></td></tr></table></figure><p>6.将以下内容添加到<code>AndroidManifest.xml</code>文件的activity标签中:</p><p><code>android:configChanges=&quot;orientation|**screenSize**|keyboardHidden&quot;</code> （关于screenSize，之后会专门说明）</p><p>这是为了保证机器在横竖屏切换的时候不会重新执行Activity的onCreate方法；</p><p>7.AndroidManifest.xml最后看起来会像这样（注意，package包名称部分的com.example.shawn应该修改为你自己的，忘了也没关系，很容易debug到）：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;utf-8&quot;</span>?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">manifest</span> <span class="attr">xmlns:android</span>=<span class="string">&quot;http://schemas.android.com/apk/res/android&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">package</span>=<span class="string">&quot;com.example.shawn&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:versionCode</span>=<span class="string">&quot;1&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:versionName</span>=<span class="string">&quot;1.0&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">supports-screens</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:anyDensity</span>=<span class="string">&quot;true&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:largeScreens</span>=<span class="string">&quot;true&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:normalScreens</span>=<span class="string">&quot;true&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:resizeable</span>=<span class="string">&quot;true&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:smallScreens</span>=<span class="string">&quot;true&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:xlargeScreens</span>=<span class="string">&quot;true&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.CAMERA&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.VIBRATE&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.ACCESS_COARSE_LOCATION&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.ACCESS_FINE_LOCATION&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.ACCESS_LOCATION_EXTRA_COMMANDS&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.INTERNET&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.RECEIVE_SMS&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.RECORD_AUDIO&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.RECORD_VIDEO&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.MODIFY_AUDIO_SETTINGS&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.READ_CONTACTS&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.WRITE_CONTACTS&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.ACCESS_NETWORK_STATE&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.GET_ACCOUNTS&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">&quot;android.permission.BROADCAST_STICKY&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-sdk</span> <span class="attr">android:minSdkVersion</span>=<span class="string">&quot;8&quot;</span> <span class="attr">android:targetSdkVersion</span>=<span class="string">&quot;15&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">application</span> <span class="attr">android:label</span>=<span class="string">&quot;@string/app_name&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:icon</span>=<span class="string">&quot;@drawable/ic_launcher&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:theme</span>=<span class="string">&quot;@style/AppTheme&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">activity</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:name</span>=<span class="string">&quot;outer&quot;</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:configChanges</span>=<span class="string">&quot;orientation|screenSize|keyboardHidden&quot;</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:label</span>=<span class="string">&quot;@string/app_name&quot;</span> &gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">action</span> <span class="attr">android:name</span>=<span class="string">&quot;android.intent.action.MAIN&quot;</span> /&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">category</span> <span class="attr">android:name</span>=<span class="string">&quot;android.intent.category.LAUNCHER&quot;</span> /&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">activity</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">application</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">manifest</span>&gt;</span></span><br></pre></td></tr></table></figure><p>其中<application>标签我们可以看做是我们当前的应用，而<activity>代表我们应用内的一个界面，<intent-filter>标签里我们给当前页面设置了一个权限</p><p><code>android.intent.action.MAIN</code>表示是最先启动的的界面；</p><p><code>android.intent.category.LAUNCHER</code>决定应用程序是否显示在程序列表里；</p><p>另外需要注意的是：</p><pre><code>&lt;activity android:name=&quot;outer&quot; android:configChanges=&quot;orientation|keyboardHidden&quot; android:label=&quot;@string/app_name&quot; &gt;</code></pre><p>我们的<activity>标签中有这样一个类名outer，可以自己定义它，例子中会用到这个类名，相当于主类。</p><p>8.在刚刚新建的Android Project中找到libs目录，在cordova.jar上点击右键，选择 Build Path-&gt;Add to Build Path。</p><p>9.最后再修改下src下的Java主文件（如果没有就自己创建一个，包名要记得跟之前在AndroidManifest.xml中写的一样）：</p><p>1)添加import com.phonegap.*;</p><p>2)删掉import android.app.Activity;</p><p>3)将outer继承为DroidGap;</p><p>4)把setContentView()这行替换为super.loadUrl(“file:&#x2F;&#x2F;&#x2F;android_asset&#x2F;www&#x2F;index.html”);</p><p>5)最后看起来就像这样：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.example.shawn;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> android.os.Bundle;</span><br><span class="line"><span class="keyword">import</span> org.apache.cordova.*;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">outer</span> <span class="keyword">extends</span> <span class="title class_">DroidGap</span> &#123;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">onCreate</span><span class="params">(Bundle savedInstanceState)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">super</span>.onCreate(savedInstanceState);</span><br><span class="line">        <span class="built_in">super</span>.loadUrl(<span class="string">&quot;file:///android_asset/www/index.html&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>super.loadUrl(&quot;file:///android_asset/www/index.html&quot;);</code>是加载首页。</p><p>然后就可以Run一下项目，在模拟器下跑跑看，成功的话会出现Hello World的界面。Great，搭建成功！可以将网页成功的封装为Android应用了！</p><p><img src="http://pic002.cnblogs.com/images/2012/423946/2012081519561610.png"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近实验一个小东西，需要用到PhoneGap打包编译Html项目，于是从头学起。&lt;/p&gt;
&lt;p&gt;#1.安装&lt;/p&gt;
&lt;p&gt;首先是JDK（&lt;a href=&quot;http://www.oracle.com/technetwork/java/javase/downloads/jdk-</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="android" scheme="https://www.gsgundam.com/tags/android/"/>
    
    <category term="安卓" scheme="https://www.gsgundam.com/tags/%E5%AE%89%E5%8D%93/"/>
    
    <category term="html" scheme="https://www.gsgundam.com/tags/html/"/>
    
    <category term="开发" scheme="https://www.gsgundam.com/tags/%E5%BC%80%E5%8F%91/"/>
    
    <category term="cordova" scheme="https://www.gsgundam.com/tags/cordova/"/>
    
    <category term="PhoneGap" scheme="https://www.gsgundam.com/tags/PhoneGap/"/>
    
    <category term="adk" scheme="https://www.gsgundam.com/tags/adk/"/>
    
    <category term="adt" scheme="https://www.gsgundam.com/tags/adt/"/>
    
    <category term="Eclipse" scheme="https://www.gsgundam.com/tags/Eclipse/"/>
    
    <category term="jdk" scheme="https://www.gsgundam.com/tags/jdk/"/>
    
  </entry>
  
  <entry>
    <title>纯CSS3打造质感按钮</title>
    <link href="https://www.gsgundam.com/archive/2014-01-05-pure-css-beautiful-button/"/>
    <id>https://www.gsgundam.com/archive/2014-01-05-pure-css-beautiful-button/</id>
    <published>2014-01-05T07:57:27.000Z</published>
    <updated>2022-11-28T05:38:24.158Z</updated>
    
    <content type="html"><![CDATA[<p>纯CSS手工打造的质感按钮（就是不知道为什么灰色左箭头按钮before部分在hover状态下有问题，谁来帮忙纠个错？）</p><p>先看看效果：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/tutorial/%E7%BA%AFCSS3%E6%8C%89%E9%92%AE.jpg" alt="&quot;纯CSS3打造质感按钮&quot;"></p><p>其实挺简单的，只要用好CSS3的特性，很多效果都很好做，完全不需要教程。所以直接上代码了。</p><p>【Html部分】</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">&quot;Content-Type&quot;</span> <span class="attr">content</span>=<span class="string">&quot;text/html; charset=utf-8&quot;</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">title</span>&gt;</span>纯CSS3按钮<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;demo_con&quot;</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button gray&quot;</span>&gt;</span>立即购买<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button black&quot;</span>&gt;</span>立即购买<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button red&quot;</span>&gt;</span>立即购买<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button yellow&quot;</span>&gt;</span>立即购买<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button green&quot;</span>&gt;</span>立即购买<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button blue&quot;</span>&gt;</span>立即购买<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button gray round&quot;</span>&gt;</span>下载资源<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button black round&quot;</span>&gt;</span>下载资源<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button red round&quot;</span>&gt;</span>下载资源<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button yellow round&quot;</span>&gt;</span>下载资源<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button green round&quot;</span>&gt;</span>下载资源<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button blue round&quot;</span>&gt;</span>下载资源<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button gray side&quot;</span>&gt;</span>下载资源<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button black side&quot;</span>&gt;</span>下载资源<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button red side&quot;</span>&gt;</span>下载资源<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button yellow side&quot;</span>&gt;</span>下载资源<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button green side&quot;</span>&gt;</span>下载资源<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button blue side&quot;</span>&gt;</span>下载资源<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button gray tags&quot;</span>&gt;</span>登录<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button black tags&quot;</span>&gt;</span>登录<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button red tags&quot;</span>&gt;</span>登录<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button yellow tags&quot;</span>&gt;</span>登录<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button green tags&quot;</span>&gt;</span>登录<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button blue tags&quot;</span>&gt;</span>登录<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button gray rarrow&quot;</span>&gt;</span>了解更多<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button black rarrow&quot;</span>&gt;</span>了解更多<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button red rarrow&quot;</span>&gt;</span>了解更多<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button yellow rarrow&quot;</span>&gt;</span>了解更多<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button green rarrow&quot;</span>&gt;</span>了解更多<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button blue rarrow&quot;</span>&gt;</span>了解更多<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button gray larrow&quot;</span>&gt;</span>返回<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button black larrow&quot;</span>&gt;</span>返回<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button red larrow&quot;</span>&gt;</span>返回<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button yellow larrow&quot;</span>&gt;</span>返回<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button green larrow&quot;</span>&gt;</span>返回<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">class</span>=<span class="string">&quot;button blue larrow&quot;</span>&gt;</span>返回<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>【CSS部分】</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br></pre></td><td class="code"><pre><span class="line">*&#123;<span class="attribute">margin</span>:<span class="number">0</span>;<span class="attribute">padding</span>:<span class="number">0</span>;<span class="attribute">list-style-type</span>:none;&#125;</span><br><span class="line"><span class="selector-tag">a</span>,<span class="selector-tag">img</span>&#123;<span class="attribute">border</span>:<span class="number">0</span>;&#125;</span><br><span class="line"><span class="selector-tag">body</span>&#123;<span class="attribute">font-size</span>:<span class="number">14px</span>;<span class="attribute">font-family</span>:<span class="string">&quot;微软雅黑&quot;</span>;<span class="attribute">background</span>:<span class="number">#f5faff</span>;&#125;</span><br><span class="line"><span class="selector-class">.demo_con</span>&#123;<span class="attribute">width</span>: <span class="number">960px</span>;<span class="attribute">margin</span>:<span class="number">40px</span> auto <span class="number">0</span>;&#125;</span><br><span class="line"><span class="selector-class">.button</span>&#123;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">140px</span>;</span><br><span class="line">    <span class="attribute">line-height</span>:<span class="number">38px</span>;</span><br><span class="line">    <span class="attribute">text-align</span>:center;</span><br><span class="line">    <span class="attribute">font-weight</span>:bold;</span><br><span class="line">    <span class="attribute">color</span>:<span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">text-shadow</span>:<span class="number">1px</span> <span class="number">1px</span> <span class="number">1px</span> <span class="number">#333</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>:<span class="number">5px</span>;</span><br><span class="line">    <span class="attribute">margin</span>:<span class="number">0</span> <span class="number">20px</span> <span class="number">20px</span> <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">position</span>:relative;</span><br><span class="line">    <span class="attribute">overflow</span>:hidden;</span><br><span class="line">    <span class="attribute">float</span><span class="selector-pseudo">:left</span>;<span class="attribute">display</span>:inline;</span><br><span class="line">    <span class="attribute">outline</span>:none;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.button</span><span class="selector-pseudo">:nth-child</span>(<span class="number">6</span>n)&#123;<span class="attribute">margin-right</span>:<span class="number">0</span>;&#125;</span><br><span class="line"><span class="selector-class">.button</span><span class="selector-class">.gray</span>&#123;</span><br><span class="line">    <span class="attribute">color</span>:<span class="number">#8c96a0</span>;</span><br><span class="line">    <span class="attribute">text-shadow</span>:<span class="number">1px</span> <span class="number">1px</span> <span class="number">1px</span> <span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">border</span>:<span class="number">1px</span> solid <span class="number">#dce1e6</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">2px</span> <span class="number">#fff</span> inset,<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#a8abae</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#f2f3f7</span>,<span class="number">#e4e8ec</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#f2f3f7</span>,<span class="number">#e4e8ec</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#f2f3f7</span>,<span class="number">#e4e8ec</span>);</span><br><span class="line">    <span class="attribute">filter</span>:progid:DXImageTransform.Microsoft.<span class="built_in">gradient</span>(startColorstr=<span class="string">&#x27;#f2f3f7&#x27;</span>, endColorstr=<span class="string">&#x27;#e4e8ec&#x27;</span>); <span class="comment">/*  IE */</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.button</span><span class="selector-class">.black</span>&#123;</span><br><span class="line">    <span class="attribute">border</span>:<span class="number">1px</span> solid <span class="number">#333</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">2px</span> <span class="number">#8b8b8b</span> inset,<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#3d3d3d</span> inset,<span class="number">0</span> -<span class="number">2px</span> <span class="number">3px</span> <span class="number">#8b8b8b</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#656565</span>,<span class="number">#4c4c4c</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#656565</span>,<span class="number">#4a4a4a</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#656565</span>,<span class="number">#4a4a4a</span>);</span><br><span class="line">    <span class="attribute">filter</span>:progid:DXImageTransform.Microsoft.<span class="built_in">gradient</span>(startColorstr=<span class="string">&#x27;#656565&#x27;</span>, endColorstr=<span class="string">&#x27;#4a4a4a&#x27;</span>); <span class="comment">/*  IE */</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.button</span><span class="selector-class">.red</span>&#123;</span><br><span class="line">    <span class="attribute">border</span>:<span class="number">1px</span> solid <span class="number">#b42323</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">2px</span> <span class="number">#e99494</span> inset,<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#954b4b</span> inset,<span class="number">0</span> -<span class="number">2px</span> <span class="number">3px</span> <span class="number">#e99494</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#d53939</span>,<span class="number">#b92929</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#d53939</span>,<span class="number">#b92929</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#d53939</span>,<span class="number">#b92929</span>);</span><br><span class="line">    <span class="attribute">filter</span>:progid:DXImageTransform.Microsoft.<span class="built_in">gradient</span>(startColorstr=<span class="string">&#x27;#d53939&#x27;</span>, endColorstr=<span class="string">&#x27;#b92929&#x27;</span>); <span class="comment">/*  IE */</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.button</span><span class="selector-class">.yellow</span>&#123;</span><br><span class="line">    <span class="attribute">border</span>:<span class="number">1px</span> solid <span class="number">#d2a000</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">2px</span> <span class="number">#fedd71</span> inset,<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#a38b39</span> inset,<span class="number">0</span> -<span class="number">2px</span> <span class="number">3px</span> <span class="number">#fedd71</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#fece34</span>,<span class="number">#d8a605</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#fece34</span>,<span class="number">#d8a605</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#fece34</span>,<span class="number">#d8a605</span>);</span><br><span class="line">    <span class="attribute">filter</span>:progid:DXImageTransform.Microsoft.<span class="built_in">gradient</span>(startColorstr=<span class="string">&#x27;#fece34&#x27;</span>, endColorstr=<span class="string">&#x27;#d8a605&#x27;</span>); <span class="comment">/*  IE */</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.button</span><span class="selector-class">.green</span>&#123;</span><br><span class="line">    <span class="attribute">border</span>:<span class="number">1px</span> solid <span class="number">#64c878</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">2px</span> <span class="number">#b9ecc4</span> inset,<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#6c9f76</span> inset,<span class="number">0</span> -<span class="number">2px</span> <span class="number">3px</span> <span class="number">#b9ecc4</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#90dfa2</span>,<span class="number">#84d494</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#90dfa2</span>,<span class="number">#84d494</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#90dfa2</span>,<span class="number">#84d494</span>);</span><br><span class="line">    <span class="attribute">filter</span>:progid:DXImageTransform.Microsoft.<span class="built_in">gradient</span>(startColorstr=<span class="string">&#x27;#90dfa2&#x27;</span>, endColorstr=<span class="string">&#x27;#84d494&#x27;</span>); <span class="comment">/*  IE */</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.button</span><span class="selector-class">.blue</span>&#123;</span><br><span class="line">    <span class="attribute">border</span>:<span class="number">1px</span> solid <span class="number">#1e7db9</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">2px</span> <span class="number">#8fcaee</span> inset,<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#497897</span> inset,<span class="number">0</span> -<span class="number">2px</span> <span class="number">3px</span> <span class="number">#8fcaee</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#42a4e0</span>,<span class="number">#2e88c0</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#42a4e0</span>,<span class="number">#2e88c0</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#42a4e0</span>,<span class="number">#2e88c0</span>);</span><br><span class="line">    <span class="attribute">filter</span>:progid:DXImageTransform.Microsoft.<span class="built_in">gradient</span>(startColorstr=<span class="string">&#x27;#42a4e0&#x27;</span>, endColorstr=<span class="string">&#x27;#2e88c0&#x27;</span>); <span class="comment">/*  IE */</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.round</span>,<span class="selector-class">.side</span>,<span class="selector-class">.tags</span>&#123;<span class="attribute">padding-right</span>:<span class="number">30px</span>;&#125;</span><br><span class="line"><span class="selector-class">.round</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">position</span>:absolute;</span><br><span class="line">    <span class="attribute">display</span>:inline-block;</span><br><span class="line">    <span class="attribute">content</span>:<span class="string">&quot;\003c&quot;</span>;</span><br><span class="line">    <span class="attribute">top</span>:<span class="number">50%</span>;</span><br><span class="line">    <span class="attribute">right</span>:<span class="number">10px</span>;</span><br><span class="line">    <span class="attribute">margin-top</span>:-<span class="number">10px</span>;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">17px</span>;</span><br><span class="line">    <span class="attribute">height</span>:<span class="number">20px</span>;</span><br><span class="line">    <span class="attribute">padding-left</span>:<span class="number">3px</span>;</span><br><span class="line">    <span class="attribute">line-height</span>:<span class="number">18px</span>;</span><br><span class="line">    <span class="attribute">font-size</span>:<span class="number">10px</span>;</span><br><span class="line">    <span class="attribute">font-weight</span>:normal;</span><br><span class="line">    <span class="attribute">border-radius</span>:<span class="number">10px</span>;</span><br><span class="line">    <span class="attribute">text-shadow</span>:-<span class="number">2px</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">#333</span>;</span><br><span class="line">    -webkit-<span class="attribute">transform</span>:<span class="built_in">rotate</span>(-<span class="number">90deg</span>);</span><br><span class="line">    -moz-<span class="attribute">transform</span>:<span class="built_in">rotate</span>(-<span class="number">90deg</span>); </span><br><span class="line">    <span class="attribute">transform</span>:<span class="built_in">rotate</span>(-<span class="number">90deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.gray</span><span class="selector-class">.round</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="built_in">rgba</span>(<span class="number">255</span>,<span class="number">255</span>,<span class="number">255</span>,<span class="number">1</span>) inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="built_in">rgba</span>(<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>,.<span class="number">2</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#dce1e6</span>,<span class="number">#dde2e7</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#dce1e6</span>,<span class="number">#dde2e7</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#dce1e6</span>,<span class="number">#dde2e7</span>);</span><br><span class="line">    <span class="attribute">text-shadow</span>:-<span class="number">2px</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">#fff</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.black</span><span class="selector-class">.round</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="built_in">rgba</span>(<span class="number">255</span>,<span class="number">255</span>,<span class="number">255</span>,.<span class="number">5</span>) inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="built_in">rgba</span>(<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>,.<span class="number">9</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#333</span>,<span class="number">#454545</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#333</span>,<span class="number">#454545</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#333</span>,<span class="number">#454545</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.red</span><span class="selector-class">.round</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="built_in">rgba</span>(<span class="number">255</span>,<span class="number">255</span>,<span class="number">255</span>,.<span class="number">6</span>) inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="built_in">rgba</span>(<span class="number">130</span>,<span class="number">25</span>,<span class="number">25</span>,.<span class="number">9</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#b12222</span>,<span class="number">#b42323</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#b12222</span>,<span class="number">#b42323</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#b12222</span>,<span class="number">#b42323</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.yellow</span><span class="selector-class">.round</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="built_in">rgba</span>(<span class="number">255</span>,<span class="number">255</span>,<span class="number">255</span>,.<span class="number">8</span>) inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="built_in">rgba</span>(<span class="number">148</span>,<span class="number">131</span>,<span class="number">4</span>,.<span class="number">9</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#cf9d00</span>,<span class="number">#d2a000</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#cf9d00</span>,<span class="number">#d2a000</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#cf9d00</span>,<span class="number">#d2a000</span>);                         </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.green</span><span class="selector-class">.round</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="built_in">rgba</span>(<span class="number">255</span>,<span class="number">255</span>,<span class="number">255</span>,.<span class="number">8</span>) inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="built_in">rgba</span>(<span class="number">51</span>,<span class="number">126</span>,<span class="number">66</span>,.<span class="number">9</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#64c878</span>,<span class="number">#6dcb80</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#64c878</span>,<span class="number">#6dcb80</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#64c878</span>,<span class="number">#6dcb80</span>);                         </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.blue</span><span class="selector-class">.round</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="built_in">rgba</span>(<span class="number">255</span>,<span class="number">255</span>,<span class="number">255</span>,.<span class="number">8</span>) inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="built_in">rgba</span>(<span class="number">18</span>,<span class="number">85</span>,<span class="number">128</span>,.<span class="number">9</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#1e7db9</span>,<span class="number">#2b85bd</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#1e7db9</span>,<span class="number">#2b85bd</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#1e7db9</span>,<span class="number">#2b85bd</span>);                         </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.side</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">position</span>:absolute;</span><br><span class="line">    <span class="attribute">display</span>:inline-block;</span><br><span class="line">    <span class="attribute">content</span>:<span class="string">&quot;\00bb&quot;</span>;</span><br><span class="line">    <span class="attribute">top</span>:<span class="number">3px</span>;</span><br><span class="line">    <span class="attribute">right</span>:-<span class="number">4px</span>;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">38px</span>;</span><br><span class="line">    <span class="attribute">height</span>:<span class="number">30px</span>;</span><br><span class="line">    <span class="attribute">font-weight</span>:normal;</span><br><span class="line">    <span class="attribute">line-height</span>:<span class="number">26px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>:<span class="number">0</span> <span class="number">0</span> <span class="number">5px</span> <span class="number">5px</span>;</span><br><span class="line">    <span class="attribute">text-shadow</span>:-<span class="number">2px</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">#333</span>;</span><br><span class="line">    -webkit-<span class="attribute">transform</span>:<span class="built_in">rotate</span>(-<span class="number">90deg</span>);</span><br><span class="line">    -moz-<span class="attribute">transform</span>:<span class="built_in">rotate</span>(-<span class="number">90deg</span>);</span><br><span class="line">    <span class="attribute">transform</span>:<span class="built_in">rotate</span>(-<span class="number">90deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.gray</span><span class="selector-class">.side</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">text-shadow</span>:-<span class="number">2px</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">border-top</span>:<span class="number">1px</span> solid <span class="number">#d4d4d4</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:-<span class="number">2px</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">#eceef1</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#e1e6ea</span>,<span class="number">#f2f2f6</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#e1e6ea</span>,<span class="number">#f2f2f6</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#e1e6ea</span>,<span class="number">#f2f2f6</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.black</span><span class="selector-class">.side</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">border-top</span>:<span class="number">1px</span> solid <span class="number">#222</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:-<span class="number">2px</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">#606060</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#373737</span>,<span class="number">#555</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#373737</span>,<span class="number">#555</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#373737</span>,<span class="number">#555</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.red</span><span class="selector-class">.side</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">border-top</span>:<span class="number">1px</span> solid <span class="number">#aa1e1e</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:-<span class="number">2px</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">#c75959</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#b82929</span>,<span class="number">#d73f3f</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#b82929</span>,<span class="number">#d73f3f</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#b82929</span>,<span class="number">#d73f3f</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.yellow</span><span class="selector-class">.side</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">border-top</span>:<span class="number">1px</span> solid <span class="number">#ba8f06</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:-<span class="number">2px</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">#deb842</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#d5a406</span>,<span class="number">#fdc40b</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#d5a406</span>,<span class="number">#fdc40b</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#d5a406</span>,<span class="number">#fdc40b</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.green</span><span class="selector-class">.side</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">border-top</span>:<span class="number">1px</span> solid <span class="number">#53b567</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:-<span class="number">2px</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">#8ad599</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#69ca7c</span>,<span class="number">#91e5a5</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#69ca7c</span>,<span class="number">#91e5a5</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#69ca7c</span>,<span class="number">#91e5a5</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.blue</span><span class="selector-class">.side</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">border-top</span>:<span class="number">1px</span> solid <span class="number">#1971a8</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:-<span class="number">2px</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">#559dca</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#2482bd</span>,<span class="number">#3fa2e0</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#2482bd</span>,<span class="number">#3fa2e0</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#2482bd</span>,<span class="number">#3fa2e0</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tags</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">font-weight</span>:normal;</span><br><span class="line">    <span class="attribute">position</span>:absolute;</span><br><span class="line">    <span class="attribute">display</span>:inline-block;</span><br><span class="line">    <span class="attribute">content</span>:<span class="string">&quot;FREE&quot;</span>;</span><br><span class="line">    <span class="attribute">top</span>:-<span class="number">3px</span>;</span><br><span class="line">    <span class="attribute">right</span>:-<span class="number">33px</span>;</span><br><span class="line">    <span class="attribute">color</span>:<span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">text-shadow</span>:none;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">85px</span>;</span><br><span class="line">    <span class="attribute">height</span>:<span class="number">25px</span>;</span><br><span class="line">    <span class="attribute">line-height</span>:<span class="number">28px</span>;</span><br><span class="line">    -webkit-<span class="attribute">transform</span>:<span class="built_in">rotate</span>(<span class="number">45deg</span>) <span class="built_in">scale</span>(.<span class="number">7</span>,.<span class="number">7</span>);</span><br><span class="line">    -moz-<span class="attribute">transform</span>:<span class="built_in">rotate</span>(<span class="number">45deg</span>) <span class="built_in">scale</span>(.<span class="number">7</span>,.<span class="number">7</span>);</span><br><span class="line">    <span class="attribute">transform</span>:<span class="built_in">rotate</span>(<span class="number">45deg</span>) <span class="built_in">scale</span>(.<span class="number">7</span>,.<span class="number">7</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.gray</span><span class="selector-class">.tags</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">background</span>:<span class="number">#8c96a0</span>;<span class="attribute">border</span>:<span class="number">2px</span> solid <span class="number">#fff</span>;&#125;</span><br><span class="line"><span class="selector-class">.black</span><span class="selector-class">.tags</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">background</span>:<span class="number">#333</span>;<span class="attribute">border</span>:<span class="number">2px</span> solid <span class="number">#777</span>;&#125;</span><br><span class="line"><span class="selector-class">.red</span><span class="selector-class">.tags</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">background</span>:<span class="number">#b42323</span>;<span class="attribute">border</span>:<span class="number">2px</span> solid <span class="number">#df4141</span>;&#125;</span><br><span class="line"><span class="selector-class">.yellow</span><span class="selector-class">.tags</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">background</span>:<span class="number">#d2a000</span>;<span class="attribute">border</span>:<span class="number">2px</span> solid <span class="number">#fcc100</span>;&#125;</span><br><span class="line"><span class="selector-class">.green</span><span class="selector-class">.tags</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">background</span>:<span class="number">#64c878</span>;<span class="attribute">border</span>:<span class="number">2px</span> solid <span class="number">#9bebac</span>;&#125;</span><br><span class="line"><span class="selector-class">.blue</span><span class="selector-class">.tags</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">background</span>:<span class="number">#1e7db9</span>;<span class="attribute">border</span>:<span class="number">2px</span> solid <span class="number">#54b1e9</span>;&#125;</span><br><span class="line"><span class="selector-class">.button</span><span class="selector-class">.rarrow</span>,<span class="selector-class">.button</span><span class="selector-class">.larrow</span>&#123;<span class="attribute">overflow</span>:visible;&#125;</span><br><span class="line"><span class="selector-class">.rarrow</span><span class="selector-pseudo">:after</span>,<span class="selector-class">.rarrow</span><span class="selector-pseudo">:before</span>,<span class="selector-class">.larrow</span><span class="selector-pseudo">:after</span>,<span class="selector-class">.larrow</span><span class="selector-pseudo">:before</span>&#123;</span><br><span class="line">    <span class="attribute">position</span>:absolute;</span><br><span class="line">    <span class="attribute">content</span>:<span class="string">&quot;&quot;</span>;</span><br><span class="line">    <span class="attribute">display</span>:block;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">28px</span>;</span><br><span class="line">    <span class="attribute">height</span>:<span class="number">28px</span>;</span><br><span class="line">    -webkit-<span class="attribute">transform</span>:<span class="built_in">rotate</span>(<span class="number">45deg</span>);</span><br><span class="line">    -moz-<span class="attribute">transform</span>:<span class="built_in">rotate</span>(<span class="number">45deg</span>);</span><br><span class="line">    <span class="attribute">transform</span>:<span class="built_in">rotate</span>(<span class="number">45deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rarrow</span><span class="selector-pseudo">:before</span>&#123;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">27px</span>;</span><br><span class="line">    <span class="attribute">height</span>:<span class="number">27px</span>;</span><br><span class="line">    <span class="attribute">top</span>:<span class="number">6px</span>;</span><br><span class="line">    <span class="attribute">right</span>:-<span class="number">13px</span>;</span><br><span class="line">    <span class="attribute">clip</span>:<span class="built_in">rect</span>(auto auto <span class="number">26px</span> <span class="number">2px</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rarrow</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">top</span>:<span class="number">6px</span>;</span><br><span class="line">    <span class="attribute">right</span>:-<span class="number">12px</span>;</span><br><span class="line">    <span class="attribute">clip</span>:<span class="built_in">rect</span>(auto auto <span class="number">26px</span> <span class="number">2px</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.gray</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:before</span>&#123;<span class="attribute">background</span>:<span class="number">#d6dbe0</span>;&#125;</span><br><span class="line"><span class="selector-class">.gray</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">0</span> <span class="number">#fff</span> inset,-<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#b7babd</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#f2f3f7</span>,<span class="number">#e4e8ec</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#f2f3f7</span>,<span class="number">#e4e8ec</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#f2f3f7</span>,<span class="number">#e4e8ec</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.black</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:before</span>&#123;<span class="attribute">background</span>:<span class="number">#333</span>;&#125;</span><br><span class="line"><span class="selector-class">.black</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">0</span> <span class="number">#8B8B8B</span> inset,-<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#3d3d3d</span> inset,-<span class="number">2px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#8B8B8B</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#656565</span>,<span class="number">#4C4C4C</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#656565</span>,<span class="number">#4C4C4C</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#656565</span>,<span class="number">#4C4C4C</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.red</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:before</span>&#123;<span class="attribute">background</span>:<span class="number">#B42323</span>;&#125;</span><br><span class="line"><span class="selector-class">.red</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">0</span> <span class="number">#E99494</span> inset,-<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#954B4B</span> inset,-<span class="number">2px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#E99494</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#D53939</span>,<span class="number">#B92929</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#D53939</span>,<span class="number">#B92929</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#D53939</span>,<span class="number">#B92929</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.yellow</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:before</span>&#123;<span class="attribute">background</span>:<span class="number">#D2A000</span>;&#125;</span><br><span class="line"><span class="selector-class">.yellow</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">0</span> <span class="number">#FEDD71</span> inset,-<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#A38B39</span> inset,-<span class="number">2px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#FEDD71</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#FECE34</span>,<span class="number">#D8A605</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#FECE34</span>,<span class="number">#D8A605</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#FECE34</span>,<span class="number">#D8A605</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.green</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:before</span>&#123;<span class="attribute">background</span>:<span class="number">#64C878</span>;&#125;</span><br><span class="line"><span class="selector-class">.green</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">0</span> <span class="number">#B9ECC4</span> inset,-<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#6C9F76</span> inset,-<span class="number">2px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#B9ECC4</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#90DFA2</span>,<span class="number">#84D494</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#90DFA2</span>,<span class="number">#84D494</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#90DFA2</span>,<span class="number">#84D494</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.blue</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:before</span>&#123;<span class="attribute">background</span>:<span class="number">#1E7DB9</span>;&#125;</span><br><span class="line"><span class="selector-class">.blue</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">0</span> <span class="number">#8FCAEE</span> inset,-<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#497897</span> inset,-<span class="number">2px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#8FCAEE</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#42A4E0</span>,<span class="number">#2E88C0</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#42A4E0</span>,<span class="number">#2E88C0</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#42A4E0</span>,<span class="number">#2E88C0</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.larrow</span><span class="selector-pseudo">:before</span>&#123;</span><br><span class="line">    <span class="attribute">top</span>:<span class="number">6px</span>;</span><br><span class="line">    <span class="attribute">left</span>:-<span class="number">13px</span>;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">27px</span>;</span><br><span class="line">    <span class="attribute">height</span>:<span class="number">27px</span>;</span><br><span class="line">    <span class="attribute">clip</span>:<span class="built_in">rect</span>(<span class="number">2px</span> <span class="number">26px</span> auto auto);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.larrow</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">top</span>:<span class="number">6px</span>;</span><br><span class="line">    <span class="attribute">left</span>:-<span class="number">12px</span>;</span><br><span class="line">    <span class="attribute">clip</span>:<span class="built_in">rect</span>(<span class="number">2px</span> <span class="number">26px</span> auto auto);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.gray</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:before</span>&#123;<span class="attribute">background</span>:<span class="number">#d6dbe0</span>;&#125;</span><br><span class="line"><span class="selector-class">.gray</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#b7babd</span> inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#fff</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#f2f3f7</span>,<span class="number">#e4e8ec</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#f2f3f7</span>,<span class="number">#e4e8ec</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#f2f3f7</span>,<span class="number">#e4e8ec</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.black</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:before</span>&#123;<span class="attribute">background</span>:<span class="number">#333</span>;&#125;</span><br><span class="line"><span class="selector-class">.black</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#3d3d3d</span> inset,<span class="number">0</span> -<span class="number">2px</span> <span class="number">0</span> <span class="number">#8B8B8B</span> inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#8B8B8B</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#656565</span>,<span class="number">#4C4C4C</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#656565</span>,<span class="number">#4C4C4C</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#656565</span>,<span class="number">#4C4C4C</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.red</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:before</span>&#123;<span class="attribute">background</span>:<span class="number">#B42323</span>;&#125;</span><br><span class="line"><span class="selector-class">.red</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#954B4B</span> inset,<span class="number">0</span> -<span class="number">2px</span> <span class="number">0</span> <span class="number">#E99494</span> inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#E99494</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#D53939</span>,<span class="number">#B92929</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#D53939</span>,<span class="number">#B92929</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#D53939</span>,<span class="number">#B92929</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.yellow</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:before</span>&#123;<span class="attribute">background</span>:<span class="number">#D2A000</span>;&#125;</span><br><span class="line"><span class="selector-class">.yellow</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#A38B39</span> inset,<span class="number">0</span> -<span class="number">2px</span> <span class="number">0</span> <span class="number">#FEDD71</span> inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#FEDD71</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#FECE34</span>,<span class="number">#D8A605</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#FECE34</span>,<span class="number">#D8A605</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#FECE34</span>,<span class="number">#D8A605</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.green</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:before</span>&#123;<span class="attribute">background</span>:<span class="number">#64C878</span>;&#125;</span><br><span class="line"><span class="selector-class">.green</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#6C9F76</span> inset,<span class="number">0</span> -<span class="number">2px</span> <span class="number">0</span> <span class="number">#B9ECC4</span> inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#B9ECC4</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#90DFA2</span>,<span class="number">#84D494</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#90DFA2</span>,<span class="number">#84D494</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#90DFA2</span>,<span class="number">#84D494</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.blue</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:before</span>&#123;<span class="attribute">background</span>:<span class="number">#1E7DB9</span>;&#125;</span><br><span class="line"><span class="selector-class">.blue</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#497897</span> inset,<span class="number">0</span> -<span class="number">2px</span> <span class="number">0</span> <span class="number">#8FCAEE</span> inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#8FCAEE</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#42A4E0</span>,<span class="number">#2E88C0</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#42A4E0</span>,<span class="number">#2E88C0</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#42A4E0</span>,<span class="number">#2E88C0</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.gray</span><span class="selector-pseudo">:hover</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#fefefe</span>,<span class="number">#ebeced</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#f2f3f7</span>,<span class="number">#ebeced</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#f2f3f7</span>,<span class="number">#ebeced</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.black</span><span class="selector-pseudo">:hover</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#818181</span>,<span class="number">#575757</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#818181</span>,<span class="number">#575757</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#818181</span>,<span class="number">#575757</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.red</span><span class="selector-pseudo">:hover</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#eb6f6f</span>,<span class="number">#c83c3c</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#eb6f6f</span>,<span class="number">#c83c3c</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#eb6f6f</span>,<span class="number">#c83c3c</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.yellow</span><span class="selector-pseudo">:hover</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#ffd859</span>,<span class="number">#e3bb38</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#ffd859</span>,<span class="number">#e3bb38</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#ffd859</span>,<span class="number">#e3bb38</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.green</span><span class="selector-pseudo">:hover</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#aaebb9</span>,<span class="number">#82d392</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#aaebb9</span>,<span class="number">#82d392</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#aaebb9</span>,<span class="number">#82d392</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.blue</span><span class="selector-pseudo">:hover</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#70bfef</span>,<span class="number">#4097ce</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#70bfef</span>,<span class="number">#4097ce</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#70bfef</span>,<span class="number">#4097ce</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.gray</span><span class="selector-pseudo">:active</span>&#123;</span><br><span class="line">    <span class="attribute">top</span>:<span class="number">1px</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">3px</span> <span class="number">#a8abae</span> inset,<span class="number">0</span> <span class="number">3px</span> <span class="number">0</span> <span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#e4e8ec</span>,<span class="number">#e4e8ec</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#e4e8ec</span>,<span class="number">#e4e8ec</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#e4e8ec</span>,<span class="number">#e4e8ec</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.black</span><span class="selector-pseudo">:active</span>&#123;</span><br><span class="line">    <span class="attribute">top</span>:<span class="number">1px</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">3px</span> <span class="number">#111</span> inset,<span class="number">0</span> <span class="number">3px</span> <span class="number">0</span> <span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#424242</span>,<span class="number">#575757</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#424242</span>,<span class="number">#575757</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#424242</span>,<span class="number">#575757</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.red</span><span class="selector-pseudo">:active</span>&#123;</span><br><span class="line">    <span class="attribute">top</span>:<span class="number">1px</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">3px</span> <span class="number">#5b0505</span> inset,<span class="number">0</span> <span class="number">3px</span> <span class="number">0</span> <span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#b11a1a</span>,<span class="number">#bf2626</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#b11a1a</span>,<span class="number">#bf2626</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#b11a1a</span>,<span class="number">#bf2626</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.yellow</span><span class="selector-pseudo">:active</span>&#123;</span><br><span class="line">    <span class="attribute">top</span>:<span class="number">1px</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">3px</span> <span class="number">#816b1f</span> inset,<span class="number">0</span> <span class="number">3px</span> <span class="number">0</span> <span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#d3a203</span>,<span class="number">#dba907</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#d3a203</span>,<span class="number">#dba907</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#d3a203</span>,<span class="number">#dba907</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.green</span><span class="selector-pseudo">:active</span>&#123;</span><br><span class="line">    <span class="attribute">top</span>:<span class="number">1px</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">3px</span> <span class="number">#4d7254</span> inset,<span class="number">0</span> <span class="number">3px</span> <span class="number">0</span> <span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#5eac6e</span>,<span class="number">#72b37e</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#5eac6e</span>,<span class="number">#72b37e</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#5eac6e</span>,<span class="number">#72b37e</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.blue</span><span class="selector-pseudo">:active</span>&#123;</span><br><span class="line">    <span class="attribute">top</span>:<span class="number">1px</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">3px</span> <span class="number">#114566</span> inset,<span class="number">0</span> <span class="number">3px</span> <span class="number">0</span> <span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top,<span class="number">#1a71a8</span>,<span class="number">#1976b1</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top,<span class="number">#1a71a8</span>,<span class="number">#1976b1</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top,<span class="number">#1a71a8</span>,<span class="number">#1976b1</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.gray</span><span class="selector-class">.side</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#e7ebee</span>,<span class="number">#f8f8f8</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#e7ebee</span>,<span class="number">#f8f8f8</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#e7ebee</span>,<span class="number">#f8f8f8</span> <span class="number">60%</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.black</span><span class="selector-class">.side</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#555</span>,<span class="number">#6f6f6f</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#555</span>,<span class="number">#6f6f6f</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#555</span>,<span class="number">#6f6f6f</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.red</span><span class="selector-class">.side</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#c43333</span>,<span class="number">#dc4949</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#c43333</span>,<span class="number">#dc4949</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#c43333</span>,<span class="number">#dc4949</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.yellow</span><span class="selector-class">.side</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#e1b21a</span>,<span class="number">#fbc71d</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#e1b21a</span>,<span class="number">#fbc71d</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#e1b21a</span>,<span class="number">#fbc71d</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.green</span><span class="selector-class">.side</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#85da95</span>,<span class="number">#94e0a5</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#85da95</span>,<span class="number">#94e0a5</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#85da95</span>,<span class="number">#94e0a5</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.blue</span><span class="selector-class">.side</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#338fc8</span>,<span class="number">#56b2eb</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#338fc8</span>,<span class="number">#56b2eb</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#338fc8</span>,<span class="number">#56b2eb</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.gray</span><span class="selector-class">.side</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">top</span>:<span class="number">4px</span>;</span><br><span class="line">    <span class="attribute">border-top</span>:<span class="number">1px</span> solid <span class="number">#9fa6ab</span>;</span><br><span class="line">    <span class="attribute">box-shadow</span>:-<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">#a8abae</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#e4e8ec</span>,<span class="number">#e4e8ec</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#e4e8ec</span>,<span class="number">#e4e8ec</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#e4e8ec</span>,<span class="number">#e4e8ec</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.black</span><span class="selector-class">.side</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:-<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">#111</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#414040</span>,<span class="number">#4d4c4c</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#414040</span>,<span class="number">#4d4c4c</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#414040</span>,<span class="number">#4d4c4c</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.red</span><span class="selector-class">.side</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:-<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">#4b0707</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#b11a1a</span>,<span class="number">#b11a1a</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#b11a1a</span>,<span class="number">#b11a1a</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#b11a1a</span>,<span class="number">#b11a1a</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.yellow</span><span class="selector-class">.side</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:-<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">#816b1f</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#d3a203</span>,<span class="number">#dba907</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#d3a203</span>,<span class="number">#dba907</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#d3a203</span>,<span class="number">#dba907</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.green</span><span class="selector-class">.side</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:-<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">#33663d</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#63a870</span>,<span class="number">#72b37e</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#63a870</span>,<span class="number">#72b37e</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#63a870</span>,<span class="number">#72b37e</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.blue</span><span class="selector-class">.side</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>:-<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">#114566</span> inset;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(right,<span class="number">#1a71a8</span>,<span class="number">#1976b1</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(right,<span class="number">#1a71a8</span>,<span class="number">#1976b1</span> <span class="number">60%</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(right,<span class="number">#1a71a8</span>,<span class="number">#1976b1</span> <span class="number">60%</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.gray</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>,<span class="selector-class">.gray</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#fefefe</span>,<span class="number">#ebeced</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#fefefe</span>,<span class="number">#ebeced</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#fefefe</span>,<span class="number">#ebeced</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.black</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>,<span class="selector-class">.black</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#818181</span>,<span class="number">#575757</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#818181</span>,<span class="number">#575757</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#818181</span>,<span class="number">#575757</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.red</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>,<span class="selector-class">.red</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#eb6f6f</span>,<span class="number">#c83c3c</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#eb6f6f</span>,<span class="number">#c83c3c</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#eb6f6f</span>,<span class="number">#c83c3c</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.yellow</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>,<span class="selector-class">.yellow</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#ffd859</span>,<span class="number">#e3bb38</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#ffd859</span>,<span class="number">#e3bb38</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#ffd859</span>,<span class="number">#e3bb38</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.green</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>,<span class="selector-class">.green</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#aaebb9</span>,<span class="number">#82d392</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#aaebb9</span>,<span class="number">#82d392</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#aaebb9</span>,<span class="number">#82d392</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.blue</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>,<span class="selector-class">.blue</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#70bfef</span>,<span class="number">#4097ce</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#70bfef</span>,<span class="number">#4097ce</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#70bfef</span>,<span class="number">#4097ce</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.gray</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>,<span class="selector-class">.gray</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#e4e8ec</span>,<span class="number">#e4e8ec</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#e4e8ec</span>,<span class="number">#e4e8ec</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#e4e8ec</span>,<span class="number">#e4e8ec</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.black</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>,<span class="selector-class">.black</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#424242</span>,<span class="number">#575757</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#424242</span>,<span class="number">#575757</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#424242</span>,<span class="number">#575757</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.red</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>,<span class="selector-class">.red</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#b11a1a</span>,<span class="number">#bf2626</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#b11a1a</span>,<span class="number">#bf2626</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#b11a1a</span>,<span class="number">#bf2626</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.yellow</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>,<span class="selector-class">.yellow</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#d3a203</span>,<span class="number">#dba907</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#d3a203</span>,<span class="number">#dba907</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#d3a203</span>,<span class="number">#dba907</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.green</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>,<span class="selector-class">.green</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#63a870</span>,<span class="number">#72b37e</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#63a870</span>,<span class="number">#72b37e</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#63a870</span>,<span class="number">#72b37e</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.blue</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>,<span class="selector-class">.blue</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-webkit-linear-gradient</span>(top left,<span class="number">#1a71a8</span>,<span class="number">#1976b1</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">-moz-linear-gradient</span>(top left,<span class="number">#1a71a8</span>,<span class="number">#1976b1</span>);</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">linear-gradient</span>(top left,<span class="number">#1a71a8</span>,<span class="number">#1976b1</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.gray</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">0</span> <span class="number">#b7babd</span> inset,-<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#b7babd</span> inset;&#125;</span><br><span class="line"><span class="selector-class">.gray</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">box-shadow</span>:<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#b7babd</span> inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#b7babd</span> inset;&#125;</span><br><span class="line"><span class="selector-class">.black</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">0</span> <span class="number">#333</span> inset,-<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#333</span> inset;&#125;</span><br><span class="line"><span class="selector-class">.black</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">box-shadow</span>:<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#333</span> inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#333</span> inset;&#125;</span><br><span class="line"><span class="selector-class">.red</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">0</span> <span class="number">#640909</span> inset,-<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#640909</span> inset;&#125;</span><br><span class="line"><span class="selector-class">.red</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">box-shadow</span>:<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#640909</span> inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#640909</span> inset;&#125;</span><br><span class="line"><span class="selector-class">.yellow</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">0</span> <span class="number">#816b1f</span> inset,-<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#816b1f</span> inset;&#125;</span><br><span class="line"><span class="selector-class">.yellow</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">box-shadow</span>:<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#816b1f</span> inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#816b1f</span> inset;&#125;</span><br><span class="line"><span class="selector-class">.green</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">0</span> <span class="number">#4d7254</span> inset,-<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#4d7254</span> inset;&#125;</span><br><span class="line"><span class="selector-class">.green</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">box-shadow</span>:<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#4d7254</span> inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#4d7254</span> inset;&#125;</span><br><span class="line"><span class="selector-class">.blue</span><span class="selector-class">.rarrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">1px</span> <span class="number">0</span> <span class="number">#114566</span> inset,-<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#114566</span> inset;&#125;</span><br><span class="line"><span class="selector-class">.blue</span><span class="selector-class">.larrow</span><span class="selector-pseudo">:active</span><span class="selector-pseudo">:after</span>&#123;<span class="attribute">box-shadow</span>:<span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#114566</span> inset,<span class="number">1px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">#114566</span> inset;&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;纯CSS手工打造的质感按钮（就是不知道为什么灰色左箭头按钮before部分在hover状态下有问题，谁来帮忙纠个错？）&lt;/p&gt;
&lt;p&gt;先看看效果：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.my</summary>
      
    
    
    
    <category term="各种想法" scheme="https://www.gsgundam.com/categories/%E5%90%84%E7%A7%8D%E6%83%B3%E6%B3%95/"/>
    
    
    <category term="css" scheme="https://www.gsgundam.com/tags/css/"/>
    
    <category term="按钮" scheme="https://www.gsgundam.com/tags/%E6%8C%89%E9%92%AE/"/>
    
    <category term="button" scheme="https://www.gsgundam.com/tags/button/"/>
    
  </entry>
  
  <entry>
    <title>星狮创想的日子（二）</title>
    <link href="https://www.gsgundam.com/archive/2014-01-05-since-idea-part-two/"/>
    <id>https://www.gsgundam.com/archive/2014-01-05-since-idea-part-two/</id>
    <published>2014-01-04T19:12:11.000Z</published>
    <updated>2018-11-07T05:28:48.220Z</updated>
    
    <content type="html"><![CDATA[<p>在星狮创想第一阶段的第二部分就开始实践着学习做网页设计了。是的，没错，不是抽象着去谈该怎么设计，而是将网站按功能分成几大类型，从案例中归纳方法进行演示。</p><p>很关键的是，作业要求很严格，不能瞎拼凑。什么叫严格？</p><ol><li><p>要制作的网站，它的所属对象是存在的。也就是说不能为一个空想的需求方服务。所以我的作业往往都是寻找一些已经有网站的企业或单位，试图超越他们原来的设计。</p></li><li><p>站点分析。通过需求方的文化背景、面向群体等多个方面进行分析，由此来总结出设计思路和大致搭配。</p></li><li><p>素材整理。根据站点分析来整理出一些资源需求，到网上去寻找一些可参考或可使用的素材，把一个理念上的东西转变为一些可见的元素，帮助站点实体化。</p></li><li><p>草图制作。这步倒不是必须的，但是对于页面构图很有帮助，不至于大返工。</p></li></ol><p>实际做的时候着实压力挺大，有时候努力去做了，也不一定能达到想要的效果。但是的确收获了很多，因为通过作业点评，可以知道自己哪些地方没处理好。（比如虹元素的首页我原来是设计的彩色的，为了呼应“虹”这个主题。但是带来的后果就是整个画面色彩过多，难以突出视觉焦点。刘俊言老师让我课后换成黑色试试。果然一下就把版面压住了。）</p><p>这些实操的课程让我受益匪浅，很多页面我都有自信超越了原版设计。展示一小部分吧（有好有坏，但是都不至于太糟）</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/page-copy.jpg" alt="&quot;页面高仿&quot;"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/pasteur-index.jpg" alt="&quot;百先得首页&quot;"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/pasteur-product.jpg" alt="&quot;百先得产品页&quot;"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/franic-index.jpg" alt="&quot;法兰琳卡首页&quot;"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/franic-product.jpg" alt="&quot;法兰琳卡产品页&quot;"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/chinabreed.jpg" alt="&quot;中国养殖网&quot;"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/orion-index.jpg" alt="&quot;猎手首页&quot;"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/orion-product.jpg" alt="&quot;猎手产品页&quot;"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/hong-index.jpg" alt="&quot;虹元素首页&quot;"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;在星狮创想第一阶段的第二部分就开始实践着学习做网页设计了。是的，没错，不是抽象着去谈该怎么设计，而是将网站按功能分成几大类型，从案例中归纳方法进行演示。&lt;/p&gt;
&lt;p&gt;很关键的是，作业要求很严格，不能瞎拼凑。什么叫严格？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;要制作的网站，它的所</summary>
      
    
    
    
    <category term="各种想法" scheme="https://www.gsgundam.com/categories/%E5%90%84%E7%A7%8D%E6%83%B3%E6%B3%95/"/>
    
    
    <category term="photoshop" scheme="https://www.gsgundam.com/tags/photoshop/"/>
    
    <category term="ps" scheme="https://www.gsgundam.com/tags/ps/"/>
    
    <category term="si27" scheme="https://www.gsgundam.com/tags/si27/"/>
    
    <category term="sinceidea" scheme="https://www.gsgundam.com/tags/sinceidea/"/>
    
    <category term="上课" scheme="https://www.gsgundam.com/tags/%E4%B8%8A%E8%AF%BE/"/>
    
    <category term="刘俊言" scheme="https://www.gsgundam.com/tags/%E5%88%98%E4%BF%8A%E8%A8%80/"/>
    
    <category term="星狮创想" scheme="https://www.gsgundam.com/tags/%E6%98%9F%E7%8B%AE%E5%88%9B%E6%83%B3/"/>
    
    <category term="网站" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E7%AB%99/"/>
    
    <category term="网页设计" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="远程教学" scheme="https://www.gsgundam.com/tags/%E8%BF%9C%E7%A8%8B%E6%95%99%E5%AD%A6/"/>
    
    <category term="webdesign" scheme="https://www.gsgundam.com/tags/webdesign/"/>
    
  </entry>
  
  <entry>
    <title>emmet(ZenCoding)-快速编写HTML神器</title>
    <link href="https://www.gsgundam.com/archive/2014-01-01-emmet-zencoding-html-quick-edit/"/>
    <id>https://www.gsgundam.com/archive/2014-01-01-emmet-zencoding-html-quick-edit/</id>
    <published>2013-12-31T23:07:40.000Z</published>
    <updated>2022-11-29T03:29:32.967Z</updated>
    
    <content type="html"><![CDATA[<p>最近大量编写HTML代码，着实被fenix命名的“人力智能”给伤心了，全是体力劳动啊。</p><p>不过功夫不负有心人（随便乱用的词……），在查阅资料时，无意发现了一枚小巧而实用的神器——**emmet(ZenCoding)**。</p><p><img src="http://emmet.io/i/logo.png"></p><p>它对我来说最重要的作用就是快速编写HTML代码。它能快成什么样子呢？</p><p>比如下面这部分代码</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">nav</span> <span class="attr">id</span>=<span class="string">&quot;navbar&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">ul</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span> <span class="attr">class</span>=<span class="string">&quot;item1&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span><span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span> <span class="attr">class</span>=<span class="string">&quot;item2&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span><span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span> <span class="attr">class</span>=<span class="string">&quot;item3&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span><span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span> <span class="attr">class</span>=<span class="string">&quot;item4&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span><span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span> <span class="attr">class</span>=<span class="string">&quot;item5&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span><span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">ul</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">nav</span>&gt;</span></span><br></pre></td></tr></table></figure><p>看着这种东西会觉得php才能勉强算是救星吧？其实只要下边这段话，加上Ctrl+E就解决了！</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nav#navbar&gt;ul&gt;li.item$*5&gt;a</span><br></pre></td></tr></table></figure><p>如何，是不是很棒？</p><p>这个插件支持的IDE多得吓人，Eclipse自然是支持，连Notepad++都有！不过对我来说支持Dreamweaver就心满意足了。</p><p><strong>官方下载地址：</strong><br>点击这里顺便看看官网资料：<a href="http://emmet.io/download/">http://emmet.io/download/</a> ，或者直接点这里下载：<a href="http://download.emmet.io/dreamweaver/Emmet.zxp">Emmet.zxp</a></p><p>我安装的Adobe套件是CC版，下载以后一路next就安装好了。（前提是你已经安装了Adobe的Extension Manager(扩展管理器)，神马？你居然没有安？没关系，赠送一个，点击<a href="http://www.adobe.com/exchange/em_download/">这里</a>下载。）</p><p>emmet的默认快捷键是Ctrl+E，如果没有快捷键冲突，那么你输入下面这段代码，按下Ctrl+E以后</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nav#navbar&gt;ul&gt;li.item$*5&gt;a</span><br></pre></td></tr></table></figure><p>就应该可以看到以下内容了</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">nav</span> <span class="attr">id</span>=<span class="string">&quot;navbar&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">ul</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span> <span class="attr">class</span>=<span class="string">&quot;item1&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span><span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span> <span class="attr">class</span>=<span class="string">&quot;item2&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span><span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span> <span class="attr">class</span>=<span class="string">&quot;item3&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span><span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span> <span class="attr">class</span>=<span class="string">&quot;item4&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span><span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span> <span class="attr">class</span>=<span class="string">&quot;item5&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span><span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">ul</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">nav</span>&gt;</span></span><br></pre></td></tr></table></figure><p>非常好用，强烈吐(ji)血(qing)推荐，网页前端苦力必备。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近大量编写HTML代码，着实被fenix命名的“人力智能”给伤心了，全是体力劳动啊。&lt;/p&gt;
&lt;p&gt;不过功夫不负有心人（随便乱用的词……），在查阅资料时，无意发现了一枚小巧而实用的神器——**emmet(ZenCoding)**。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;htt</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="网页" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E9%A1%B5/"/>
    
    <category term="html" scheme="https://www.gsgundam.com/tags/html/"/>
    
    <category term="前端" scheme="https://www.gsgundam.com/tags/%E5%89%8D%E7%AB%AF/"/>
    
    <category term="adobe" scheme="https://www.gsgundam.com/tags/adobe/"/>
    
    <category term="cc" scheme="https://www.gsgundam.com/tags/cc/"/>
    
    <category term="code" scheme="https://www.gsgundam.com/tags/code/"/>
    
    <category term="dreamweaver" scheme="https://www.gsgundam.com/tags/dreamweaver/"/>
    
    <category term="dw" scheme="https://www.gsgundam.com/tags/dw/"/>
    
    <category term="emmet" scheme="https://www.gsgundam.com/tags/emmet/"/>
    
    <category term="web" scheme="https://www.gsgundam.com/tags/web/"/>
    
    <category term="zencoding" scheme="https://www.gsgundam.com/tags/zencoding/"/>
    
    <category term="代码" scheme="https://www.gsgundam.com/tags/%E4%BB%A3%E7%A0%81/"/>
    
  </entry>
  
  <entry>
    <title>星狮创想的日子（一）</title>
    <link href="https://www.gsgundam.com/archive/2013-12-29-since-idea-part-one/"/>
    <id>https://www.gsgundam.com/archive/2013-12-29-since-idea-part-one/</id>
    <published>2013-12-29T04:52:20.000Z</published>
    <updated>2018-11-07T05:23:59.535Z</updated>
    
    <content type="html"><![CDATA[<p>看上去像是广告，但是的确我在星狮创想学习过（<a href="http://www.si27.com/">http://www.si27.com/</a>，好吧，我还真就打了个广告），大概是2012年第一季度的事情了，参加的是零基础班。</p><p>最近主要都在做网页方面的东西，虽然现在已经使用了超越当时太多的技术和技巧，但当时星狮创想还是从网页设计方面给了我很好的启蒙，让我现在感到很感激。</p><p>当时其实并不是要想学个饭碗技能，只是碰巧想学个东西，而阿宝报了这个班，干脆就由我来学习了。没想到到现在派上了大用场。</p><p>让我不得不佩服乔布斯所说：“<strong>你现在所经历的将在你未来的生命中串联起来。</strong>”</p><p>06班有幸是刘俊言老师（星狮创想的创立者，真正师范出身）全程教授。他的讲课风格很温和，思维也很全面，优点在于让有意愿学习的人能很快理解课堂内容。（因为星狮创想当时实行一次缴费终身听课制，所以后来也参加了07班的课，廖俊枫老师真的很优秀，但是完全是启发型的，而且语言上属于决不留情的那种……不适合我的风格……）</p><p>由于自己有一些PS技巧和美术功底储备，当时在星狮创想莫名其妙的就成了学委，鸭梨山大……不过也督促我要尽全力做好每一次作业。</p><p>说到作业，就展示一部分劣作吧（第一阶段的第一部分都是各种练习，尤其PS方面非常多，网页设计部分下次再放）</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/beauty-and-beast.jpg" alt="&quot;美女与野兽合成&quot;"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/website-element.jpg" alt="&quot;网页元素练习&quot;"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/page-modify.jpg" alt="&quot;页面修改&quot;"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/stamp.jpg" alt="&quot;邮票设计&quot;"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/CatShow.jpg" alt="&quot;CATSHOW仿站&quot;"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;看上去像是广告，但是的确我在星狮创想学习过（&lt;a href=&quot;http://www.si27.com/&quot;&gt;http://www.si27.com/&lt;/a&gt;，好吧，我还真就打了个广告），大概是2012年第一季度的事情了，参加的是零基础班。&lt;/p&gt;
&lt;p&gt;最近主要都在做网页方面</summary>
      
    
    
    
    <category term="乱七八糟" scheme="https://www.gsgundam.com/categories/%E4%B9%B1%E4%B8%83%E5%85%AB%E7%B3%9F/"/>
    
    
    <category term="photoshop" scheme="https://www.gsgundam.com/tags/photoshop/"/>
    
    <category term="ps" scheme="https://www.gsgundam.com/tags/ps/"/>
    
    <category term="si27" scheme="https://www.gsgundam.com/tags/si27/"/>
    
    <category term="sinceidea" scheme="https://www.gsgundam.com/tags/sinceidea/"/>
    
    <category term="上课" scheme="https://www.gsgundam.com/tags/%E4%B8%8A%E8%AF%BE/"/>
    
    <category term="乔布斯" scheme="https://www.gsgundam.com/tags/%E4%B9%94%E5%B8%83%E6%96%AF/"/>
    
    <category term="刘俊言" scheme="https://www.gsgundam.com/tags/%E5%88%98%E4%BF%8A%E8%A8%80/"/>
    
    <category term="星狮创想" scheme="https://www.gsgundam.com/tags/%E6%98%9F%E7%8B%AE%E5%88%9B%E6%83%B3/"/>
    
    <category term="网站" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E7%AB%99/"/>
    
    <category term="网页设计" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="远程教学" scheme="https://www.gsgundam.com/tags/%E8%BF%9C%E7%A8%8B%E6%95%99%E5%AD%A6/"/>
    
  </entry>
  
  <entry>
    <title>Photoshop打开PNG图片崩溃</title>
    <link href="https://www.gsgundam.com/archive/2013-12-28-photoshop-crash-open-png/"/>
    <id>https://www.gsgundam.com/archive/2013-12-28-photoshop-crash-open-png/</id>
    <published>2013-12-28T04:11:39.000Z</published>
    <updated>2018-11-07T05:17:06.358Z</updated>
    
    <content type="html"><![CDATA[<p>今天改一张png资源图的时候，用photoshop cc一打开，就突然出现了这个问题。以前也出现过，但是重启一次电脑就好了，但是这次不然。</p><p>度娘了一下，轻松解决。</p><p>我的问题是因为不知道为什么设置暂存盘的地方，一个硬盘都没勾选……</p><p>另外，如果没勾选主硬盘所在分区，也可能出现问题。</p><p>勾选位置在 编辑  &gt; 首选项 &gt; 性能</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/ps%E6%9A%82%E5%AD%98%E7%9B%98.jpg" alt="&quot;ps暂存盘&quot;"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天改一张png资源图的时候，用photoshop cc一打开，就突然出现了这个问题。以前也出现过，但是重启一次电脑就好了，但是这次不然。&lt;/p&gt;
&lt;p&gt;度娘了一下，轻松解决。&lt;/p&gt;
&lt;p&gt;我的问题是因为不知道为什么设置暂存盘的地方，一个硬盘都没勾选……&lt;/p&gt;
&lt;p&gt;另</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="photoshop" scheme="https://www.gsgundam.com/tags/photoshop/"/>
    
    <category term="ps" scheme="https://www.gsgundam.com/tags/ps/"/>
    
    <category term="cc" scheme="https://www.gsgundam.com/tags/cc/"/>
    
    <category term="png" scheme="https://www.gsgundam.com/tags/png/"/>
    
    <category term="暂存盘" scheme="https://www.gsgundam.com/tags/%E6%9A%82%E5%AD%98%E7%9B%98/"/>
    
    <category term="硬盘" scheme="https://www.gsgundam.com/tags/%E7%A1%AC%E7%9B%98/"/>
    
  </entry>
  
  <entry>
    <title>本地FlashPlayer访问本地文件</title>
    <link href="https://www.gsgundam.com/archive/2013-12-22-flashplay-play-local-files/"/>
    <id>https://www.gsgundam.com/archive/2013-12-22-flashplay-play-local-files/</id>
    <published>2013-12-22T03:22:46.000Z</published>
    <updated>2015-01-31T13:56:34.858Z</updated>
    
    <content type="html"><![CDATA[<p>转自：<a href="http://www.cnblogs.com/zhwl/archive/2012/03/05/2379962.html">http://www.cnblogs.com/zhwl/archive/2012/03/05/2379962.html</a></p><p>今天邮箱收到百度统计报告，下载下来，曲线是flash+xml的，但需要到Adobe网站上进行安全设置。</p><p>为了保护本地文件的安全，在默认情况下，FlashPlayer不能直接访问本地文件。如果您需要让FlashPlayer能够访问指定的本地目录，您可以采用以下一些设置方法：</p><p>  1. </p><p>确认FlashPlayer要访问的本地目录或文件</p><p>首先您需要确认让FlashPlayer自动访问的本地目录或文件，如：本地的E:local。然后在这个目录中放置Flash文件（swf格式）以及Flash要访问的所有文件，如xml、txt、jpg、png等格式文件。</p><p>  1. </p><p>登录Adobe官方网站进入FlashPlayer安全设置页面</p><p>URL地址：<br><a href="http://www.macromedia.com/support/documentation/cn/flashplayer/help/settings_manager04.html">http://www.macromedia.com/support/documentation/cn/flashplayer/help/settings_manager04.html</a><br>在这个页面中您会看到一个Flash的设置面板<br><img src="http://www.eeepa.com/images/clip_image002.jpg" alt="&quot;FlashPlayer 设置管理器&quot;"></p><p>  1. </p><p>在全局安全设置中选择“始终允许”；</p><p><img src="http://www.eeepa.com/images/clip_image004.jpg" alt="&quot;选择始终允许&quot;"></p><p>  1. </p><p>点击“编辑多个位置”弹出编辑下拉菜单</p><p><img src="http://www.eeepa.com/images/clip_image006.jpg" alt="&quot;点击“编辑多个位置”&quot;"></p><p>  1. </p><p>点击“添加位置”弹出设置安全路径面板，如图1-4</p><p><img src="http://www.eeepa.com/images/clip_image008.jpg" alt="&quot;添加安全路径面板&quot;"></p><p>  1. </p><p>点击“浏览文件夹”，选择您要设置的FlashPlayer安全访问路径，如图1-5；</p><p><img src="http://www.eeepa.com/images/clip_image010.jpg" alt="&quot;选择安全访问路径&quot;"></p><p>  1. </p><p>点击确定后，您就可以在“始终信任一下位置的文件”中看到已设置的安全路径，如图1-6；</p><p><img src="http://www.eeepa.com/images/clip_image012.jpg" alt="&quot;安全访问路径已经设置完毕&quot;"></p><p>到这一步，目录E:local就已经被成功设置成为FlashPlayer的安全访问路径，FlashPlayer在本地运行时访问这个文件夹下的文件将不再受限制。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;转自：&lt;a href=&quot;http://www.cnblogs.com/zhwl/archive/2012/03/05/2379962.html&quot;&gt;http://www.cnblogs.com/zhwl/archive/2012/03/05/2379962.html&lt;/a&gt;&lt;</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="FLASH" scheme="https://www.gsgundam.com/tags/FLASH/"/>
    
    <category term="adobe" scheme="https://www.gsgundam.com/tags/adobe/"/>
    
    <category term="flashplayer" scheme="https://www.gsgundam.com/tags/flashplayer/"/>
    
    <category term="local" scheme="https://www.gsgundam.com/tags/local/"/>
    
    <category term="安全" scheme="https://www.gsgundam.com/tags/%E5%AE%89%E5%85%A8/"/>
    
    <category term="本地" scheme="https://www.gsgundam.com/tags/%E6%9C%AC%E5%9C%B0/"/>
    
    <category term="本地文件" scheme="https://www.gsgundam.com/tags/%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6/"/>
    
  </entry>
  
  <entry>
    <title>Wordpress在windows主机下无法发送邮件</title>
    <link href="https://www.gsgundam.com/archive/2013-12-21-wordpresse-send-email-on-windows-server/"/>
    <id>https://www.gsgundam.com/archive/2013-12-21-wordpresse-send-email-on-windows-server/</id>
    <published>2013-12-21T04:38:08.000Z</published>
    <updated>2018-11-07T05:15:41.098Z</updated>
    
    <content type="html"><![CDATA[<p>转自<a href="http://polaris.blog.51cto.com/1146394/391976">http://polaris.blog.51cto.com/1146394/391976</a>，但是自己配图一张</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/wordpress-mail.gif" alt="wp"></p><p>WordPress的功能很强大，可扩展性也很强大，博客搭建完成之后，需要不断地改进完善，这样自己的博客才能够越来越好。</p><p><a href="http://www.beijixing001.com/post/364.html">polaris的博客</a>搭建完成后，想要备份博客，备份方法有多种，其中有一种是通过<code>WordPress Database Backup</code>插件实现。该插件提供了定期备份功能，有一个选项是发送备份数据到指定的邮箱中。然而设置之后却发现无法发送到指定的邮箱中。当时也就算了，没有细细的研究。</p><p>今天想要在博客上实现评论回复邮件通知的功能，这样有利于吸引游客再度光临。在网上一查阅，发现Windows主机+IIS+php配置，不支持php的mail()函数发送邮件，只是简简单单的提供smtp组件，无奈评论回复和数据库备份的邮件发送都不能实现。而国内很多服务器都是该种配置，polaris购买的空间就是这种配置，于是需要找到一种解决方法。</p><p>在网上一搜，看到好多关于<code>wp-mail-smtp</code>插件的教程，一一测试，可是发现没有一个好用。看到这些文章的评论，有不少人跟polaris一样，按照他们的方法配置怎么也不成功，而且改用了若干邮箱类型，都是以失败告终。通过自己的不断尝试，终于解决了。</p><h2 id="1-配置wp-mail-smtp插件"><a href="#1-配置wp-mail-smtp插件" class="headerlink" title="1 配置wp-mail-smtp插件"></a>1 配置wp-mail-smtp插件</h2><p>借用网上的一些翻译结果。</p><pre><code>From Email:发送者的邮件地址,也就是对方收到邮件后看到的发件人地址。From Name:发件人姓名。Mailer:Send all WordPress emails via SMTP.Use the PHP mail() function to send emails.这里要注意一下,有的朋友的空间不支持mail()函数,通常是Windows环境的主机。如果不支持此函数,那么就选择上面的那个选项。SMTP OptionsSMTP服务器设置,也就是邮件发送服务器设置,如果设置错误就不会给留言的人发送邮件,当然,也不会把备份的数据文件发送到你的邮箱中。SMTP Host:QQ邮箱的是:SMTP.QQ.COM 谷歌的SMTP.GMAIL.COM 126邮箱是：SMTP.126.COM （大小写无所谓）SMTP Port:QQ邮箱的是:25谷歌的是587，126是25。QQ帮助里说端口号是465或587，试了没成功，不知道原因。Encryption:是否启用加密连接No encryption.无加密Use SSL encryption.采用SSL方式Use TLS encryption. This is not the same as STARTTLS. For most servers SSL is the recommended option.使用TLS方式.polaris提醒您，此处是关键。一会儿详细讨论这点。Authentication:用户验证No: Do not use SMTP authentication.Yes: Use SMTP authentication.如果你这里用的是免费邮箱,那么都是选择yes,如果不验证的话恐怕垃圾邮件就满天飞了吧.下面的这两项，就是你的用户名和密码。Username: 注意:这个用户名是全名，如我的：polaris_bjx@126.comPassword: 密码就不公布了，这个插件作者比较奇怪，密码域竟然是明文显示而不是***，着实让人不爽。update option全部填写后点此更新设置。Send a Test Email发送一个测试邮件To: (这里填写邮件地址)</code></pre><p>好了，设置完了，测试下结果。如果看到有：</p><pre><code>Test Message SentThe result was:bool(true)</code></pre><p>那恭喜您，您的设置成功了。如果您测试失败，那请您接着往下看。</p><h2 id="2-配置失败的解决方法"><a href="#2-配置失败的解决方法" class="headerlink" title="2 配置失败的解决方法"></a>2 配置失败的解决方法</h2><p>在网上可以看到，通过网上看到的方法设置，测试失败的比比皆是吧。polaris也一样，试了n多次都失败。不过幸好，最后终于成功了。在此分享两种失败解决方法：</p><h3 id="2-1-从WordPress与服务器上找原因"><a href="#2-1-从WordPress与服务器上找原因" class="headerlink" title="2.1 从WordPress与服务器上找原因"></a>2.1 从WordPress与服务器上找原因</h3><p>在此引用柳絮轻飞的博文《<a href="http://www.pc502.com/server-vps/5.html">配置 WP Mail SMTP 的一点经验</a>》：</p><p>今天给wordpress博客增加评论回复邮件提醒功能，选中了WP Mail SMTP插件，配置QQ邮箱的参数一切正常，但是发送测试邮件的时候提示：<code>ERROR: Failed to connect to server: Unable to find the socket transport “ssl” – did you forget to enable it when you configured PHP？</code>既然是ssl错误，习惯性的从<code>php.ini</code>中相应行打开支持，（extension&#x3D;php_openssl.dll），服务器是windows主机，重启iis发现竟然还是不支持？查明原因是php_openssl.dll这个链接库无法装入。</p><p>上网查了一下资料，原来openssl扩展是依赖于第三方库的。</p><p>要想开启OpenSSL支持，系统需要安装<code>libeay32.dll</code>和<code>ssleay32.dll</code>两个库</p><p>如果你以前安装过OpenSSL，那么你的系统目录中应该已经存在这两个文件；如果没有安装，PHP的windows发行包里同样附带了这两个文件，将其复制到%system%&#x2F;system32目录下即可。</p><p>总结，windows主机如果碰到了类似 ERROR: Failed to connect to server: Unable to find the socket transport “ssl” – did you forget to enable it when you configured PHP? 这样的问题，不能只是修改php.ini了事，还要检查下libeay32.dll和ssleay32.dll两个库有没有正确安装。</p><p>BTW：但是新版本（0.8.2）的WP Mail SMTP和WP Thread Comment有冲突，请按照一下方法修改即可解决问题。</p><p>将<code>../wp-content/plugins/wp-mail-smtp/wp_mail_smtp.php</code>中第391-393行的以下代码注释掉或者删掉就可以了：</p><pre><code>if ( $orig != $default_from ) &#123;    return $orig;&#125;</code></pre><h3 id="2-2-更简单的解决方法"><a href="#2-2-更简单的解决方法" class="headerlink" title="2.2 更简单的解决方法"></a>2.2 更简单的解决方法</h3><p>由于polaris租用别人的主机，让人检查<code>libeay32.dll</code>和<code>ssleay32.dll</code>库之类的有点麻烦，而且不一定能够很好的帮您解决，所以，polaris不曾测试柳絮轻飞的方法。不过polaris发现了一个更简单而且很有用的方法，不过不知道有没有缺点哦，您如知道请留言告之。</p><p>上面提到在配置<code>Encryption</code>时是个关键。网上很多人都说应该选择第二项：采用SSL方式。然而，polaris在选中该项后，换用各种邮箱都是失败，都有这种提示：<code>ERROR: Failed to connect to server: Unable to find the socket transport “ssl” – did you forget to enable it when you configured PHP？</code>这因为这个，polaris才找到了柳絮轻飞的解决方法。然而没有试验，而是另寻了一个方法。</p><p>这个方法呢，很简单，就是选中第一项：<code>No encryption</code>（无加密），一测试，成功了。真真高兴，折腾了半天终于成功了。没有写过WordPress相关的文章，解决了这个问题，欣喜之余便迫不及待地拿出来与大家分享，希望对您有用。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;转自&lt;a href=&quot;http://polaris.blog.51cto.com/1146394/391976&quot;&gt;http://polaris.blog.51cto.com/1146394/391976&lt;/a&gt;，但是自己配图一张&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="wordpress" scheme="https://www.gsgundam.com/tags/wordpress/"/>
    
    <category term="服务器" scheme="https://www.gsgundam.com/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="windows" scheme="https://www.gsgundam.com/tags/windows/"/>
    
    <category term="iis" scheme="https://www.gsgundam.com/tags/iis/"/>
    
    <category term="smtp" scheme="https://www.gsgundam.com/tags/smtp/"/>
    
    <category term="socket" scheme="https://www.gsgundam.com/tags/socket/"/>
    
    <category term="空间" scheme="https://www.gsgundam.com/tags/%E7%A9%BA%E9%97%B4/"/>
    
    <category term="邮件" scheme="https://www.gsgundam.com/tags/%E9%82%AE%E4%BB%B6/"/>
    
  </entry>
  
  <entry>
    <title>Windows 8.1 与 TortoiseSVN 1.8.x 64位</title>
    <link href="https://www.gsgundam.com/archive/2013-10-28-windows-8-1-with-tortoisesvn-1-8-x64/"/>
    <id>https://www.gsgundam.com/archive/2013-10-28-windows-8-1-with-tortoisesvn-1-8-x64/</id>
    <published>2013-10-27T18:49:41.000Z</published>
    <updated>2015-01-31T09:31:21.913Z</updated>
    
    <content type="html"><![CDATA[<p>自从一个星期前升级了windows8.1就惹来了不少折腾，这一个星期就没怎么消停，工作耽搁了不少。其中有一个问题就是安装小乌龟SVN1.8.x造成的explorer反复崩溃，出现thumbnail错误。</p><p>在windows下面还有比小乌龟更好用的图形化svn客户端吗？相信答案会极度统一：没有。subclipse再好用，也必须在eclipse里才行。</p><p>因此这是个必须解决的问题，google和百度了一番，没有符合我的情况。</p><p>于是大概分析了一下，加上之前还有不断的crash report不成功，于是选择了重新安装小乌龟时，取消 <code>additional icon sets</code> 和 <code>crash report</code> 选项，安装，搞定。</p><p>估计是兼容性的问题了，哎。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;自从一个星期前升级了windows8.1就惹来了不少折腾，这一个星期就没怎么消停，工作耽搁了不少。其中有一个问题就是安装小乌龟SVN1.8.x造成的explorer反复崩溃，出现thumbnail错误。&lt;/p&gt;
&lt;p&gt;在windows下面还有比小乌龟更好用的图形化svn客户</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="windows" scheme="https://www.gsgundam.com/tags/windows/"/>
    
    <category term="升级" scheme="https://www.gsgundam.com/tags/%E5%8D%87%E7%BA%A7/"/>
    
    <category term="1.8.x" scheme="https://www.gsgundam.com/tags/1-8-x/"/>
    
    <category term="64位" scheme="https://www.gsgundam.com/tags/64%E4%BD%8D/"/>
    
    <category term="8.1" scheme="https://www.gsgundam.com/tags/8-1/"/>
    
    <category term="svn" scheme="https://www.gsgundam.com/tags/svn/"/>
    
    <category term="tortoise" scheme="https://www.gsgundam.com/tags/tortoise/"/>
    
    <category term="tortoisesvn" scheme="https://www.gsgundam.com/tags/tortoisesvn/"/>
    
    <category term="win8" scheme="https://www.gsgundam.com/tags/win8/"/>
    
  </entry>
  
  <entry>
    <title>css hack</title>
    <link href="https://www.gsgundam.com/archive/2013-10-20-css-hack/"/>
    <id>https://www.gsgundam.com/archive/2013-10-20-css-hack/</id>
    <published>2013-10-20T05:34:05.000Z</published>
    <updated>2022-11-28T05:35:39.670Z</updated>
    
    <content type="html"><![CDATA[<p>此文转自：<a href="http://www.css88.com/">WEB前端开发 http://www.css88.com/</a> (真心很实用，尤其对于国内的网页前端开发)</p><p>首先感谢“<a href="http://wanz.im/">丸子</a>”提供的这个IE8的css hack；</p><p>关注过IE8的css hack的人相信大家都在使用这个hack，就是“9”的css hack：</p><p>&lt;% codeblock lang:css %&gt;<br>    .test{<br>    color:#000000;                  &#x2F;* FF,OP支持 <em>&#x2F;<br>    color:#0000FF9;       &#x2F;</em> 所有IE浏览器(ie6+)支持 ；但是IE8不能识别“*”和“_”的css hack；所以我们可以这样写hack <em>&#x2F;<br>    [color:#000000;color:#00FF00;      &#x2F;</em> SF,CH支持 *&#x2F;<br>    <em>color:#FFFF00;                 &#x2F;</em> IE7支持 <em>&#x2F;<br>    _color:#FF0000;               &#x2F;</em> IE6支持 *&#x2F;<br>    }<br>&lt;% endcodeblock %&gt; </p><p>包括我自己也是使用这种的，这是我前段时间整理的《<a href="http://www.css88.com/archives/1265">主流浏览器的一些CSS hack</a>》。</p><p>很多人再研究color:#0000FF9;中的为什么IE6-IE8支持“9”写法，和它的原理，我只是个工程师，不是科学家，我不懂为什么和它的真正原理，真的！很惭愧！</p><p>昨天在某个群里也看到部分前端工程师或网页重构师势利的一面，同样的一个解决方案，大公司有名的前端工程师或网页重构师写的东西都追捧，而小公司没名气的前端工程师或网页重构师写的解决方案却被反问：“css有这种写法吗？看来你连最基本的css的几个属性和属性值都没搞懂；就算你解决了问题你写的css也是不规范的，就是规范你跟我讲讲你解决方案的原理；”同样的一个解决方案，大公司有名的前端工程师或网页重构师写的这些反问质疑就全都没了，拼命的去研究他这个解决方案，呵呵，我觉得那些人很可笑。还有很多人问问题只有得到大公司有名的前端工程师或网页重构师的肯定回答后才放心而又开心的走了，甚至不留一句谢谢。当然没人（包括我）否认大公司有名的前端工程师或网页重构师在业界的影响力，他们为前端和重构业界做的贡献大家都是看得到的，只是觉得做人（特别是我们做技术的）不能太势利，多一点技术共享和探讨，多一点感激，学习成长才是最重要的。我承认我以前经常骂人，骂人家SB，内参国王说的对，骂人家SB就等于骂自己SB，我以前是很SB。不想探讨就看着呗，骂人是不对的！</p><p>扯远了，回到IE8的CSS hack，讲讲color:#0000FF9：</p><p>color:#0000FF9的hack支持IE6-IE8（其他版本没有测试），但是IE8不能识别“*”和“_”的css hack，所以我们可以使用</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">color</span>:#<span class="number">0000</span>FF9; ;<span class="comment">/*ie6,ie7,ie8*/</span></span><br><span class="line"></span><br><span class="line">*<span class="attribute">color</span>:<span class="number">#FFFF00</span>;<span class="comment">/*ie7*/</span></span><br><span class="line"></span><br><span class="line">_color:<span class="number">#FF0000</span>;<span class="comment">/*ie6*/</span></span><br></pre></td></tr></table></figure><p>来区分IE的各个版本。</p><p>至于为什么使用“9”我真的不清楚原因，但是“<a href="http://www.princeb4d.com/">丸子</a>”测试了其他0-13的数字，最终结果如下：</p><p><img src="http://www.css88.com/wp-content/uploads/2009/07/2009-07-18_125722.png"></p><p>其中：OP表示Opera，SA表示Safari，Ch表示Chrome；当然你如果还有耐心可以测试“14”，“15”，“16”。。。</p><p>从上面测试结果我们可以看出“\0”的写法只被IE8识别，ie6，ie7都不能识别，那么“\0”应该是IE8的真正hack。主流浏览器的CSS hack这样更好一些：</p><pre><code class="css">    .test&#123;    color:#000000;                  /* FF,OP支持 */    color:#0000FF\0;       /* IE8支持*/    [color:#000000;color:#00FF00;      /* SF,CH支持 */    *color:#FFFF00;                 /* IE7支持 */    _color:#FF0000;              /* IE6支持 */    &#125;</code></pre><p>其中：OP表示Opera，SA表示Safari，Ch表示Chrome；</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;此文转自：&lt;a href=&quot;http://www.css88.com/&quot;&gt;WEB前端开发 http://www.css88.com/&lt;/a&gt; (真心很实用，尤其对于国内的网页前端开发)&lt;/p&gt;
&lt;p&gt;首先感谢“&lt;a href=&quot;http://wanz.im/&quot;&gt;丸子&lt;/a&gt;</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="html" scheme="https://www.gsgundam.com/tags/html/"/>
    
    <category term="网页前端" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E9%A1%B5%E5%89%8D%E7%AB%AF/"/>
    
    <category term="css" scheme="https://www.gsgundam.com/tags/css/"/>
    
    <category term="hack" scheme="https://www.gsgundam.com/tags/hack/"/>
    
    <category term="ie" scheme="https://www.gsgundam.com/tags/ie/"/>
    
    <category term="前端" scheme="https://www.gsgundam.com/tags/%E5%89%8D%E7%AB%AF/"/>
    
  </entry>
  
  <entry>
    <title>网页流媒体处理（监控）</title>
    <link href="https://www.gsgundam.com/archive/2013-10-20-web-media-stream-camera/"/>
    <id>https://www.gsgundam.com/archive/2013-10-20-web-media-stream-camera/</id>
    <published>2013-10-20T00:16:13.000Z</published>
    <updated>2022-11-28T05:38:24.158Z</updated>
    
    <content type="html"><![CDATA[<p>一直没接触过流媒体，这次项目当中需要涉及到接收来自服务器的流媒体监控视频，并实时播放、切换、关闭，于是查找了一下资料。发现原以为是难点的地方，全部都很简单。</p><p><strong>首先</strong>，要嵌入流媒体很简单，主要有以下2种方式：</p><p>1.** 标签型（严重推荐）**:</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">embed</span> <span class="attr">width</span>=<span class="string">240</span> <span class="attr">height</span>=<span class="string">140</span> <span class="attr">transparentatstart</span>=<span class="string">true</span> <span class="attr">animationatstart</span>=<span class="string">false</span> <span class="attr">autostart</span>=<span class="string">true</span> <span class="attr">autosize</span>=<span class="string">false</span> <span class="attr">volume</span>=<span class="string">100</span> <span class="attr">displaysize</span>=<span class="string">0</span> <span class="attr">showdisplay</span>=<span class="string">true</span> <span class="attr">showstatusbar</span>=<span class="string">true</span> <span class="attr">showcontrols</span>=<span class="string">true</span> <span class="attr">showaudiocontrols</span>=<span class="string">true</span> <span class="attr">showtracker</span>=<span class="string">true</span> <span class="attr">showpositioncontrols</span>=<span class="string">true</span> <span class="attr">balance</span>=<span class="string">true</span> <span class="attr">src</span>=<span class="string">&quot;[流媒体地址]&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">embed</span>&gt;</span></span><br></pre></td></tr></table></figure><p>当然，还有简化版的：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">embed</span> <span class="attr">src</span>=<span class="string">&quot;[流媒体地址]&quot;</span> <span class="attr">style</span>=<span class="string">&quot;height: 140px; width: 240px&quot;</span> <span class="attr">type</span>=<span class="string">audio/mpeg</span> <span class="attr">AUTOSTART</span>=<span class="string">&quot;1&quot;</span> <span class="attr">loop</span>=<span class="string">&quot;0&quot;</span>&gt;</span></span><br></pre></td></tr></table></figure><p>2. 综合型：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">object</span> <span class="attr">classid</span>=<span class="string">clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95</span> <span class="attr">codebase</span>=<span class="string">&quot;http://activex.microsoft.com/activex/controls/mplayer</span></span></span><br><span class="line"><span class="string"><span class="tag">/en/nsmp2inf.cab#Version=6,1,5,217&quot;</span></span></span><br><span class="line"><span class="tag"><span class="attr">id</span>=<span class="string">MediaPlayer</span> <span class="attr">type</span>=<span class="string">application/x-oleobject</span> <span class="attr">width</span>=<span class="string">210</span> <span class="attr">height</span>=<span class="string">340</span> <span class="attr">standby</span>=<span class="string">&quot;Loading Microsoft Windows Media Player components...&quot;</span> <span class="attr">VIEWASTEXT</span> <span class="attr">align</span>=<span class="string">MIDDLE</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">AudioStream</span> <span class="attr">value</span>=<span class="string">-1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">AutoSize</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">AutoStart</span> <span class="attr">value</span>=<span class="string">1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">AnimationAtStart</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">AllowScan</span> <span class="attr">value</span>=<span class="string">-1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">AllowChangeDisplaySize</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">AutoRewind</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">Balance</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">BaseURL</span> <span class="attr">value</span>=<span class="string">&quot;&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">BufferingTime</span> <span class="attr">value</span>=<span class="string">5</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">CaptioningID</span> <span class="attr">value</span>=<span class="string">&quot;&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">ClickToPlay</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">CursorType</span> <span class="attr">value</span>=<span class="string">32512</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">CurrentPosition</span> <span class="attr">value</span>=<span class="string">-1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">CurrentMarker</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">DefaultFrame</span> <span class="attr">value</span>=<span class="string">1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">DisplayBackColor</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">DisplayForeColor</span> <span class="attr">value</span>=<span class="string">16777215</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">DisplayMode</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">DisplaySize</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">Enabled</span> <span class="attr">value</span>=<span class="string">-1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">EnableContextMenu</span> <span class="attr">value</span>=<span class="string">-1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">EnablePositionControls</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">EnableFullScreenControls</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">EnableTracker</span> <span class="attr">value</span>=<span class="string">1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">Filename</span> <span class="attr">value</span>=<span class="string">&quot;[流媒体地址]&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">InvokeURLs</span> <span class="attr">value</span>=<span class="string">-1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">Language</span> <span class="attr">value</span>=<span class="string">-1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">Mute</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">PlayCount</span> <span class="attr">value</span>=<span class="string">1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">PreviewMode</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">Rate</span> <span class="attr">value</span>=<span class="string">1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">SAMILang</span> <span class="attr">value</span>=<span class="string">&quot;&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">SAMIStyle</span> <span class="attr">value</span>=<span class="string">&quot;&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">SAMIFileName</span> <span class="attr">value</span>=<span class="string">&quot;&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">SelectionStart</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">SelectionEnd</span> <span class="attr">value</span>=<span class="string">true</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">SendOpenStateChangeEvents</span> <span class="attr">value</span>=<span class="string">-1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">SendWarningEvents</span> <span class="attr">value</span>=<span class="string">-1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">SendErrorEvents</span> <span class="attr">value</span>=<span class="string">-1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">SendKeyboardEvents</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">SendMouseClickEvents</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">SendMouseMoveEvents</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">SendPlayStateChangeEvents</span> <span class="attr">value</span>=<span class="string">-1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">ShowCaptioning</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">ShowControls</span> <span class="attr">value</span>=<span class="string">1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">ShowAudioControls</span> <span class="attr">value</span>=<span class="string">1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">ShowDisplay</span> <span class="attr">value</span>=<span class="string">1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">ShowGotoBar</span> <span class="attr">value</span>=<span class="string">1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">ShowPositionControls</span> <span class="attr">value</span>=<span class="string">1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">ShowStatusBar</span> <span class="attr">value</span>=<span class="string">1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">ShowTracker</span> <span class="attr">value</span>=<span class="string">1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">TransparentAtStart</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">VideoBorderWidth</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">VideoBorderColor</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">VideoBorder3D</span> <span class="attr">value</span>=<span class="string">0</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">Volume</span> <span class="attr">value</span>=<span class="string">-1070</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">param</span> <span class="attr">name</span>=<span class="string">WindowlessVideo</span> <span class="attr">value</span>=<span class="string">1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">object</span>&gt;</span></span><br></pre></td></tr></table></figure><p><strong>其次</strong>，非常重要的一个环节，就是停止播放和切换流媒体地址。也相当简单粗暴。</p><p>尝试过直接用js操作替换src内容，发现并不会发生变化。于是采用了移除原有的embed标签，新建一个包含新地址的embed在原来的div中，完美解决。</p><p>唯一不放心的是，不知道被移除标签中嵌入的流媒体在后台会不会继续。反正有人告诉我不会……</p><p><strong>最后</strong>，是切换一页显示多少个视频，也就是布局问题。这个乍看好像有点麻烦，其实也再简单不过了。</p><p>先定义好最多有几个，并且给每个流媒体的div标签id赋值。然后按切换需要，隐藏div，并重新给div赋值进行布局（不要删除div，否则还原回多个摄像头画面时，原有的视频会消失，同时会影响布局时的操控，更复杂）。</p><p>没图说个XX，好吧，上代码……</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span> <span class="keyword">PUBLIC</span> <span class="string">&quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;</span> <span class="string">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">xmlns</span>=<span class="string">&quot;http://www.w3.org/1999/xhtml&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">&quot;Content-Type&quot;</span> <span class="attr">content</span>=<span class="string">&quot;text/html; charset=utf-8&quot;</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">title</span>&gt;</span>流媒体切换<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;jquery-1.7.2.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="selector-tag">button</span>&#123;<span class="attribute">width</span>:<span class="number">200px</span>;<span class="attribute">height</span>:<span class="number">50px</span>;<span class="attribute">margin-top</span>:<span class="number">30px</span>;&#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    $(<span class="variable language_">document</span>).<span class="title function_">ready</span>(<span class="keyword">function</span>(<span class="params"></span>)&#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">var</span> embedStart = <span class="string">&quot;&lt;embed width=240 height=140 transparentatstart=true animationatstart=false autostart=true autosize=false volume=100 displaysize=0 showdisplay=true showstatusbar=true showcontrols=true showaudiocontrols=true showtracker=true showpositioncontrols=true balance=true src=&#x27;&quot;</span>;</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">var</span> embedEnd = <span class="string">&quot;&#x27;&gt;&lt;/embed&gt;&quot;</span>;</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">var</span> mms1 = <span class="string">&quot;rtsp://live.hugd.com/whyl.wmv&quot;</span>; <span class="comment">//湖州文化娱乐</span></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">var</span> mms2 = <span class="string">&quot;rtsp://live.hugd.com/xwzh.wmv&quot;</span>; <span class="comment">//湖州新闻综合</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        $(<span class="string">&#x27;#btn1&#x27;</span>).<span class="title function_">click</span>(<span class="keyword">function</span>(<span class="params"></span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            $(<span class="string">&quot;#mms3 embed&quot;</span>).<span class="title function_">remove</span>();</span></span><br><span class="line"><span class="language-javascript">            $(<span class="string">&quot;#mms3&quot;</span>).<span class="title function_">append</span>(embedStart+mms1+embedEnd);</span></span><br><span class="line"><span class="language-javascript">        &#125;);</span></span><br><span class="line"><span class="language-javascript">        $(<span class="string">&#x27;#btn2&#x27;</span>).<span class="title function_">click</span>(<span class="keyword">function</span>(<span class="params"></span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            $(<span class="string">&quot;#mms1 embed&quot;</span>).<span class="title function_">remove</span>();</span></span><br><span class="line"><span class="language-javascript">            $(<span class="string">&quot;#mms1&quot;</span>).<span class="title function_">append</span>(embedStart+mms2+embedEnd);</span></span><br><span class="line"><span class="language-javascript">        &#125;);</span></span><br><span class="line"><span class="language-javascript">    &#125;)</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;mms1&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">embed</span> <span class="attr">width</span>=<span class="string">240</span> <span class="attr">height</span>=<span class="string">140</span> <span class="attr">transparentatstart</span>=<span class="string">true</span> <span class="attr">animationatstart</span>=<span class="string">false</span> <span class="attr">autostart</span>=<span class="string">true</span> <span class="attr">autosize</span>=<span class="string">false</span> <span class="attr">volume</span>=<span class="string">100</span> <span class="attr">displaysize</span>=<span class="string">0</span> <span class="attr">showdisplay</span>=<span class="string">true</span> <span class="attr">showstatusbar</span>=<span class="string">true</span> <span class="attr">showcontrols</span>=<span class="string">true</span> <span class="attr">showaudiocontrols</span>=<span class="string">true</span> <span class="attr">showtracker</span>=<span class="string">true</span> <span class="attr">showpositioncontrols</span>=<span class="string">true</span> <span class="attr">balance</span>=<span class="string">true</span> <span class="attr">src</span>=<span class="string">&quot;rtsp://live.hugd.com/whyl.wmv&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">embed</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;mms2&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">embed</span> <span class="attr">width</span>=<span class="string">240</span> <span class="attr">height</span>=<span class="string">140</span> <span class="attr">transparentatstart</span>=<span class="string">true</span> <span class="attr">animationatstart</span>=<span class="string">false</span> <span class="attr">autostart</span>=<span class="string">true</span> <span class="attr">autosize</span>=<span class="string">false</span> <span class="attr">volume</span>=<span class="string">100</span> <span class="attr">displaysize</span>=<span class="string">0</span> <span class="attr">showdisplay</span>=<span class="string">true</span> <span class="attr">showstatusbar</span>=<span class="string">true</span> <span class="attr">showcontrols</span>=<span class="string">true</span> <span class="attr">showaudiocontrols</span>=<span class="string">true</span> <span class="attr">showtracker</span>=<span class="string">true</span> <span class="attr">showpositioncontrols</span>=<span class="string">true</span> <span class="attr">balance</span>=<span class="string">true</span> <span class="attr">src</span>=<span class="string">&quot;rtsp://live.hugd.com/xwzh.wmv&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">embed</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;mms3&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">embed</span> <span class="attr">width</span>=<span class="string">240</span> <span class="attr">height</span>=<span class="string">140</span> <span class="attr">transparentatstart</span>=<span class="string">true</span> <span class="attr">animationatstart</span>=<span class="string">false</span> <span class="attr">autostart</span>=<span class="string">true</span> <span class="attr">autosize</span>=<span class="string">false</span> <span class="attr">volume</span>=<span class="string">100</span> <span class="attr">displaysize</span>=<span class="string">0</span> <span class="attr">showdisplay</span>=<span class="string">true</span> <span class="attr">showstatusbar</span>=<span class="string">true</span> <span class="attr">showcontrols</span>=<span class="string">true</span> <span class="attr">showaudiocontrols</span>=<span class="string">true</span> <span class="attr">showtracker</span>=<span class="string">true</span> <span class="attr">showpositioncontrols</span>=<span class="string">true</span> <span class="attr">balance</span>=<span class="string">true</span> <span class="attr">src</span>=<span class="string">&quot;mms://211.106.66.141/moretv/drama/2tv/dra_misa/bgm/01.asf&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">embed</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;mms4&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">embed</span> <span class="attr">width</span>=<span class="string">240</span> <span class="attr">height</span>=<span class="string">140</span> <span class="attr">transparentatstart</span>=<span class="string">true</span> <span class="attr">animationatstart</span>=<span class="string">false</span> <span class="attr">autostart</span>=<span class="string">true</span> <span class="attr">autosize</span>=<span class="string">false</span> <span class="attr">volume</span>=<span class="string">100</span> <span class="attr">displaysize</span>=<span class="string">0</span> <span class="attr">showdisplay</span>=<span class="string">true</span> <span class="attr">showstatusbar</span>=<span class="string">true</span> <span class="attr">showcontrols</span>=<span class="string">true</span> <span class="attr">showaudiocontrols</span>=<span class="string">true</span> <span class="attr">showtracker</span>=<span class="string">true</span> <span class="attr">showpositioncontrols</span>=<span class="string">true</span> <span class="attr">balance</span>=<span class="string">true</span> <span class="attr">src</span>=<span class="string">&quot;mms://211.106.66.141/moretv/drama/2tv/dra_misa/bgm/01.asf&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">embed</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;mms5&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">embed</span> <span class="attr">width</span>=<span class="string">240</span> <span class="attr">height</span>=<span class="string">140</span> <span class="attr">transparentatstart</span>=<span class="string">true</span> <span class="attr">animationatstart</span>=<span class="string">false</span> <span class="attr">autostart</span>=<span class="string">true</span> <span class="attr">autosize</span>=<span class="string">false</span> <span class="attr">volume</span>=<span class="string">100</span> <span class="attr">displaysize</span>=<span class="string">0</span> <span class="attr">showdisplay</span>=<span class="string">true</span> <span class="attr">showstatusbar</span>=<span class="string">true</span> <span class="attr">showcontrols</span>=<span class="string">true</span> <span class="attr">showaudiocontrols</span>=<span class="string">true</span> <span class="attr">showtracker</span>=<span class="string">true</span> <span class="attr">showpositioncontrols</span>=<span class="string">true</span> <span class="attr">balance</span>=<span class="string">true</span> <span class="attr">src</span>=<span class="string">&quot;mms://211.106.66.141/moretv/drama/2tv/dra_misa/bgm/01.asf&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">embed</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">id</span>=<span class="string">&quot;btn1&quot;</span>&gt;</span>点我填充第3个<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">id</span>=<span class="string">&quot;btn2&quot;</span>&gt;</span>点我替换第1个<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;一直没接触过流媒体，这次项目当中需要涉及到接收来自服务器的流媒体监控视频，并实时播放、切换、关闭，于是查找了一下资料。发现原以为是难点的地方，全部都很简单。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;首先&lt;/strong&gt;，要嵌入流媒体很简单，主要有以下2种方式：&lt;/p&gt;
&lt;p&gt;1.*</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="javascript" scheme="https://www.gsgundam.com/tags/javascript/"/>
    
    <category term="jQuery" scheme="https://www.gsgundam.com/tags/jQuery/"/>
    
    <category term="网页" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E9%A1%B5/"/>
    
    <category term="js" scheme="https://www.gsgundam.com/tags/js/"/>
    
    <category term="html" scheme="https://www.gsgundam.com/tags/html/"/>
    
    <category term="embed" scheme="https://www.gsgundam.com/tags/embed/"/>
    
    <category term="mms" scheme="https://www.gsgundam.com/tags/mms/"/>
    
    <category term="rtps" scheme="https://www.gsgundam.com/tags/rtps/"/>
    
    <category term="摄像头" scheme="https://www.gsgundam.com/tags/%E6%91%84%E5%83%8F%E5%A4%B4/"/>
    
    <category term="流媒体" scheme="https://www.gsgundam.com/tags/%E6%B5%81%E5%AA%92%E4%BD%93/"/>
    
    <category term="监控" scheme="https://www.gsgundam.com/tags/%E7%9B%91%E6%8E%A7/"/>
    
  </entry>
  
  <entry>
    <title>dwz表单navTabAjaxDone/dialogAjaxDone</title>
    <link href="https://www.gsgundam.com/archive/2013-10-19-dwz-form-navtabajaxdone-dialogajaxdone/"/>
    <id>https://www.gsgundam.com/archive/2013-10-19-dwz-form-navtabajaxdone-dialogajaxdone/</id>
    <published>2013-10-19T10:35:15.000Z</published>
    <updated>2022-11-28T05:37:54.503Z</updated>
    
    <content type="html"><![CDATA[<p>最近的一个项目前端需要一个便捷的框架，基于中文、上手便捷度、使用率、文档可查度等等几个方面，选来选去，挑中了以前跟木哈哈讨论过后放弃掉的dwz。</p><p>不少国人的项目确实是要么没文档，要么文档不全，或者老死不更新。dwz的情况不比他们好多少，不过至少使用者还是很多的，基本用法的资料还是比较好查。</p><p>这次就碰到了表单提交响应的问题，对于客户端要传递什么内容，服务器要传回什么内容，demo和手册里实在没找到。上网上看了一下，大致有这个几个方面需要注意。</p><p>1. Form标签上增加onsubmit&#x3D;”<strong>return</strong> validateCallback(*<em>this, <strong>[navTabAjaxDone&#x2F;dialogAjaxDone]</strong></em>*)”</p><ol><li>服务端必须返回一个包含以下信息的object（无论以什么形式返回，dwz都能解析，但是推荐json）：</li></ol><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="attr">&quot;statusCode&quot;</span><span class="punctuation">:</span><span class="string">&quot;200&quot;</span><span class="punctuation">,</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="attr">&quot;message&quot;</span><span class="punctuation">:</span><span class="string">&quot;操作成功&quot;</span><span class="punctuation">,</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="attr">&quot;navTabId&quot;</span><span class="punctuation">:</span><span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="attr">&quot;rel&quot;</span><span class="punctuation">:</span><span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="attr">&quot;callbackType&quot;</span><span class="punctuation">:</span><span class="string">&quot;closeCurrent&quot;</span><span class="punctuation">,</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="attr">&quot;forwardUrl&quot;</span><span class="punctuation">:</span><span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>而在原始代码中其实有相关的注释：</p><ul><li><p>form提交后返回json数据结构statusCode&#x3D;DWZ.statusCode.ok表示操作成功, 做页面跳转等操作. statusCode&#x3D;DWZ.statusCode.error表示操作失败, 提示错误原因.</p></li><li><p>statusCode&#x3D;DWZ.statusCode.timeout表示session超时，下次点击时跳转到DWZ.loginUrl</p></li><li><p>{“statusCode”:”200”, “message”:”操作成功”, “navTabId”:”navNewsLi”, “forwardUrl”:””, “callbackType”:”closeCurrent”}</p></li><li><p>{“statusCode”:”300”, “message”:”操作失败”}</p></li><li><p>{“statusCode”:”301”, “message”:”会话超时”}</p></li></ul><ol><li><p>callbackType设置为空，则可以只刷新当前页面，而不是关闭</p></li><li><p>顶部弹出的对话框不影响操作，过段时间会自动消失，但缺点是展示的时间过长，太容易吸引人去点它，影响体验。暂时还没找到在哪里修改。</p></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近的一个项目前端需要一个便捷的框架，基于中文、上手便捷度、使用率、文档可查度等等几个方面，选来选去，挑中了以前跟木哈哈讨论过后放弃掉的dwz。&lt;/p&gt;
&lt;p&gt;不少国人的项目确实是要么没文档，要么文档不全，或者老死不更新。dwz的情况不比他们好多少，不过至少使用者还是很多的</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="jQuery" scheme="https://www.gsgundam.com/tags/jQuery/"/>
    
    <category term="ajax" scheme="https://www.gsgundam.com/tags/ajax/"/>
    
    <category term="dialogAjaxDone" scheme="https://www.gsgundam.com/tags/dialogAjaxDone/"/>
    
    <category term="dwz" scheme="https://www.gsgundam.com/tags/dwz/"/>
    
    <category term="html" scheme="https://www.gsgundam.com/tags/html/"/>
    
    <category term="j-ui" scheme="https://www.gsgundam.com/tags/j-ui/"/>
    
    <category term="jui" scheme="https://www.gsgundam.com/tags/jui/"/>
    
    <category term="navTabAjaxDone" scheme="https://www.gsgundam.com/tags/navTabAjaxDone/"/>
    
    <category term="框架" scheme="https://www.gsgundam.com/tags/%E6%A1%86%E6%9E%B6/"/>
    
    <category term="网页前端" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E9%A1%B5%E5%89%8D%E7%AB%AF/"/>
    
  </entry>
  
  <entry>
    <title>翻到一张很早以前的设定画</title>
    <link href="https://www.gsgundam.com/archive/2013-10-01-concept-painting/"/>
    <id>https://www.gsgundam.com/archive/2013-10-01-concept-painting/</id>
    <published>2013-09-30T18:20:00.000Z</published>
    <updated>2018-11-07T05:13:43.986Z</updated>
    
    <content type="html"><![CDATA[<p>很早以前的古物了（估计是07年左右画的），因为要做新东西，整理一下以前的素材，无意发现了它。</p><p>不过现在看还是蛮喜欢的。</p><p>记得当时是沉迷于攻壳机动队TV版SAC，觉得塔其克玛的构造还是挺合理的，感觉的确比人型容易实现多了。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/craftDesign.jpg" alt="战车设定"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;很早以前的古物了（估计是07年左右画的），因为要做新东西，整理一下以前的素材，无意发现了它。&lt;/p&gt;
&lt;p&gt;不过现在看还是蛮喜欢的。&lt;/p&gt;
&lt;p&gt;记得当时是沉迷于攻壳机动队TV版SAC，觉得塔其克玛的构造还是挺合理的，感觉的确比人型容易实现多了。&lt;/p&gt;
&lt;p&gt;&lt;img </summary>
      
    
    
    
    <category term="随笔涂鸦" scheme="https://www.gsgundam.com/categories/%E9%9A%8F%E7%AC%94%E6%B6%82%E9%B8%A6/"/>
    
    
    <category term="涂鸦" scheme="https://www.gsgundam.com/tags/%E6%B6%82%E9%B8%A6/"/>
    
    <category term="原画" scheme="https://www.gsgundam.com/tags/%E5%8E%9F%E7%94%BB/"/>
    
    <category term="战车" scheme="https://www.gsgundam.com/tags/%E6%88%98%E8%BD%A6/"/>
    
    <category term="原画设定" scheme="https://www.gsgundam.com/tags/%E5%8E%9F%E7%94%BB%E8%AE%BE%E5%AE%9A/"/>
    
    <category term="塔其克玛" scheme="https://www.gsgundam.com/tags/%E5%A1%94%E5%85%B6%E5%85%8B%E7%8E%9B/"/>
    
    <category term="攻壳机动队" scheme="https://www.gsgundam.com/tags/%E6%94%BB%E5%A3%B3%E6%9C%BA%E5%8A%A8%E9%98%9F/"/>
    
    <category term="设定" scheme="https://www.gsgundam.com/tags/%E8%AE%BE%E5%AE%9A/"/>
    
    <category term="设定原画" scheme="https://www.gsgundam.com/tags/%E8%AE%BE%E5%AE%9A%E5%8E%9F%E7%94%BB/"/>
    
  </entry>
  
  <entry>
    <title>与微信开发有关的学习资料</title>
    <link href="https://www.gsgundam.com/archive/2013-06-24-study-materials-about-weixin-develop/"/>
    <id>https://www.gsgundam.com/archive/2013-06-24-study-materials-about-weixin-develop/</id>
    <published>2013-06-23T19:49:33.000Z</published>
    <updated>2015-01-31T13:56:34.771Z</updated>
    
    <content type="html"><![CDATA[<p><strong>1.一个用Python和Bottle实现基于微信公众平台API和SAE查询豆瓣电影的简单应用</strong></p><p><a href="http://kingson.org/?p=259">http://kingson.org/?p=259</a></p><p><strong>2.微信机器人框架 - WeRoBot</strong></p><p><a href="https://github.com/whtsky/WeRoBot">https://github.com/whtsky/WeRoBot</a></p><p><strong>3.在SAE上搭建微信公众平台账号消息服务器</strong></p><p><a href="http://www.cnblogs.com/gzb1985/archive/2012/12/30/weixin-msg-server-based-on-sae-python.html">http://www.cnblogs.com/gzb1985/archive/2012/12/30/weixin-msg-server-based-on-sae-python.html</a></p><p><strong>4.小蜗牛有道翻译小助手</strong></p><p><a href="http://blog.csdn.net/liushuaikobe/article/details/8453716">http://blog.csdn.net/liushuaikobe/article/details/8453716</a></p><p><strong>5.微信公众平台消息接口指南</strong></p><p><a href="http://mp.weixin.qq.com/wiki/index.php?title=%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3%E6%8C%87%E5%8D%97">http://mp.weixin.qq.com/wiki/index.php?title=%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3%E6%8C%87%E5%8D%97</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;strong&gt;1.一个用Python和Bottle实现基于微信公众平台API和SAE查询豆瓣电影的简单应用&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://kingson.org/?p=259&quot;&gt;http://kingson.org/?p=259&lt;/a&gt;&lt;</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="微信" scheme="https://www.gsgundam.com/tags/%E5%BE%AE%E4%BF%A1/"/>
    
    <category term="开发" scheme="https://www.gsgundam.com/tags/%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>Pad上的新游戏预告</title>
    <link href="https://www.gsgundam.com/archive/2013-06-16-battle-array-on-pad/"/>
    <id>https://www.gsgundam.com/archive/2013-06-16-battle-array-on-pad/</id>
    <published>2013-06-16T15:37:00.000Z</published>
    <updated>2015-01-31T09:31:21.683Z</updated>
    
    <content type="html"><![CDATA[<p><strong>极风游戏的3D版pad休闲竞技游戏《装甲纵队》在点名时间上预热啦！求关注！求扩散！</strong></p><p><a href="http://url.cn/GnU7fB">http://url.cn/GnU7fB</a></p><p><a href="http://www.demohour.com/projects/319405"><img src="http://aliyun.demohour.com/demohour-upload/project_photos-files-000-032-082-32082-large.png?1370493058" alt="装甲纵队"></a></p><p>最近公司这边也一直很忙，以至于耽搁了装甲纵队的发布进度（毕竟这次的开发主要是Fenix同学，所以基本没耽搁开发进度）。公司的游戏也在紧张测试中，估计近两个月能上线。祝我们的游戏都能大卖啊！各位看官捧个场吧！</p><p>记得关注《装甲纵队》～</p><p><a href="http://url.cn/GnU7fB">http://url.cn/GnU7fB</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;strong&gt;极风游戏的3D版pad休闲竞技游戏《装甲纵队》在点名时间上预热啦！求关注！求扩散！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://url.cn/GnU7fB&quot;&gt;http://url.cn/GnU7fB&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=</summary>
      
    
    
    
    <category term="项目开发" scheme="https://www.gsgundam.com/categories/%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="极风游戏" scheme="https://www.gsgundam.com/tags/%E6%9E%81%E9%A3%8E%E6%B8%B8%E6%88%8F/"/>
    
    <category term="array" scheme="https://www.gsgundam.com/tags/array/"/>
    
    <category term="battle" scheme="https://www.gsgundam.com/tags/battle/"/>
    
    <category term="装甲纵队" scheme="https://www.gsgundam.com/tags/%E8%A3%85%E7%94%B2%E7%BA%B5%E9%98%9F/"/>
    
    <category term="android" scheme="https://www.gsgundam.com/tags/android/"/>
    
    <category term="demohour" scheme="https://www.gsgundam.com/tags/demohour/"/>
    
    <category term="ipad" scheme="https://www.gsgundam.com/tags/ipad/"/>
    
    <category term="pad" scheme="https://www.gsgundam.com/tags/pad/"/>
    
    <category term="安卓" scheme="https://www.gsgundam.com/tags/%E5%AE%89%E5%8D%93/"/>
    
    <category term="点名时间" scheme="https://www.gsgundam.com/tags/%E7%82%B9%E5%90%8D%E6%97%B6%E9%97%B4/"/>
    
    <category term="苹果" scheme="https://www.gsgundam.com/tags/%E8%8B%B9%E6%9E%9C/"/>
    
  </entry>
  
  <entry>
    <title>如何在Windows8中设置虚拟热点共享上网</title>
    <link href="https://www.gsgundam.com/archive/2013-05-24-setup-wifi-hotspot-share-in-windows-8/"/>
    <id>https://www.gsgundam.com/archive/2013-05-24-setup-wifi-hotspot-share-in-windows-8/</id>
    <published>2013-05-23T19:21:23.000Z</published>
    <updated>2015-01-31T13:56:34.959Z</updated>
    
    <content type="html"><![CDATA[<p>转自：<a href="http://software.it168.com/a2013/0403/1468/000001468931.shtml">http://software.it168.com/a2013/0403/1468/000001468931.shtml</a></p><p>在Windows 7中，我们可以通过网络与共享中心的“设置新的连接和网络”来创建一个无线热点，供<a href="http://product.it168.com/list/b/0302_1.shtml">手机</a>或其他设备进行网络连接。但是，在Windows 8下，这个功能却找不到了。不过，我们依旧可以通过命令提示符来开启该功能。</p><p>在Win8系统屏幕的左下角单击右键唤出神秘菜单（快捷键Win + X ），选择“命令提示符(管理员)”。</p><p><img src="http://image20.it168.com/201304_0x0/1388/ca1018a999018c41.jpg" alt="Windows"></p><p>首先查看设备是否支持创建ad-hoc。在命令提示符中输入<code>netsh wlan show drivers</code>，在结果中查看“支持的承载网络”，“是”才可创建热点。</p><p><img src="http://image20.it168.com/201304_500x375/1388/28cea70bdb6a6bea.jpg" alt="Windows"><br>▲支持的承载网络</p><p>接下来就可以创建无线热点了。</p><p>在命令提示符中输入<code>netsh wlan set hostednetwork mode=allow ssid=jht2013 key=password</code>。其中“ssid&#x3D;”后面的为无线网络名称，“key&#x3D;”后面的为无线网络密码，以上均可定义，但是密码至少需要8位。</p><p><img src="http://image20.it168.com/201304_500x375/1388/42b72ca907ea9ae.jpg" alt="Windows"><br>▲设置用户名和密码</p><p>接下来，继续通过命令<code>netsh wlan start hostednetwork</code>开启无线热点。并可以在网络连接设备中找到如下虚拟<a href="http://product.it168.com/list/b/0411_1.shtml">网卡</a>适配器。(名字自行更改)</p><p><img src="http://image20.it168.com/201304_500x375/1388/b29df244a05a7e92.jpg" alt="Windows"><br>▲创建的连接</p><p>在本机正在连接的网络上将Internet连接共享。</p><p><img src="http://image20.it168.com/201304_500x375/1388/61cd6a7ea7a3d7d4.jpg" alt="Windows"><br>▲已经共享</p><p>此时，<a href="http://product.pcpop.com/Mobile/10734_1.html">手机</a>或其他设备已经可以通过该无线热点进行连接。</p><p><img src="http://image20.it168.com/201304_0x0/1388/eab0557daced018a.jpg" alt="Windows"><br>▲手机端的共享连接</p><p>若需要关闭无线热点可输入<code>netsh wlan stop hostednetwork</code>即可。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;转自：&lt;a href=&quot;http://software.it168.com/a2013/0403/1468/000001468931.shtml&quot;&gt;http://software.it168.com/a2013/0403/1468/000001468931.shtml&lt;/a</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="windows" scheme="https://www.gsgundam.com/tags/windows/"/>
    
    <category term="8" scheme="https://www.gsgundam.com/tags/8/"/>
    
    <category term="共享" scheme="https://www.gsgundam.com/tags/%E5%85%B1%E4%BA%AB/"/>
    
    <category term="热点" scheme="https://www.gsgundam.com/tags/%E7%83%AD%E7%82%B9/"/>
    
    <category term="虚拟热点" scheme="https://www.gsgundam.com/tags/%E8%99%9A%E6%8B%9F%E7%83%AD%E7%82%B9/"/>
    
  </entry>
  
  <entry>
    <title>Mac OS Flash builder 4.7 破解方法 | 不用序列号</title>
    <link href="https://www.gsgundam.com/archive/2013-05-23-mac-os-flash-builder-4-7-patch/"/>
    <id>https://www.gsgundam.com/archive/2013-05-23-mac-os-flash-builder-4-7-patch/</id>
    <published>2013-05-23T02:43:32.000Z</published>
    <updated>2015-01-31T13:56:34.819Z</updated>
    
    <content type="html"><![CDATA[<p>转自 <a href="http://blog.sban.us/77.html">http://blog.sban.us/77.html</a></p><p>将CS6的通用破解覆盖补丁amtlib.framework，覆盖到程序目录:<code>/Applications/Adobe Flash Builder 4.7/eclipse/plugins/com.adobe.flexide.amt_4.7.0.349722/os/macosx/Frameworks</code></p><p>没有cs6 amtlib.framework for mac吗，在这里可以下载：</p><p><a href="http://vdisk.weibo.com/s/nlxW7">http://vdisk.weibo.com/s/nlxW7</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;转自 &lt;a href=&quot;http://blog.sban.us/77.html&quot;&gt;http://blog.sban.us/77.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;将CS6的通用破解覆盖补丁amtlib.framework，覆盖到程序目录:&lt;code&gt;/Applications</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="mac" scheme="https://www.gsgundam.com/tags/mac/"/>
    
    <category term="flash" scheme="https://www.gsgundam.com/tags/flash/"/>
    
    <category term="flashbuilder" scheme="https://www.gsgundam.com/tags/flashbuilder/"/>
    
  </entry>
  
  <entry>
    <title>使用 VirtualBox 虚拟机安装 MAC OS X 10.8 Mountain Lion</title>
    <link href="https://www.gsgundam.com/archive/2013-05-23-install-mac-os-x-10-8-mountain-lion-virtualbox/"/>
    <id>https://www.gsgundam.com/archive/2013-05-23-install-mac-os-x-10-8-mountain-lion-virtualbox/</id>
    <published>2013-05-23T00:12:54.000Z</published>
    <updated>2015-01-31T13:56:34.728Z</updated>
    
    <content type="html"><![CDATA[<h1 id="转载自：http-bbs-weiphone-com-read-htm-tid-5329046-html"><a href="#转载自：http-bbs-weiphone-com-read-htm-tid-5329046-html" class="headerlink" title="转载自：http://bbs.weiphone.com/read-htm-tid-5329046.html"></a>转载自：<a href="http://bbs.weiphone.com/read-htm-tid-5329046.html">http://bbs.weiphone.com/read-htm-tid-5329046.html</a></h1><p>建议电脑要求</p><p>Windows 7, 32 &#x2F; 64 bit<br>CPU Intel Core i5 &#x2F; i7<br>内存 4GB 以上<br>硬盘 500GB 以上</p><p>由于虚拟机不支持 Apple Quartz Extreme&#x2F;Core Image, 需要 Quartz Extreme 的应用软件例如 iBooks Author，Pages，Pixelmator，SketchBook 等不能在虚拟机下使用 。</p><p>安装步骤<br>⑴ 迅雷下载: <a href="http://kuai.xunlei.com/d/LMGYDWMVJWYI">http://kuai.xunlei.com/d/LMGYDWMVJWYI</a><br>VirtualBox-4.1.20-80170-Win.exe<br>Oracle_VM_VirtualBox_Extension_Pack-4.1.20-80170.vbox-extpack<br>HackBoot1.iso<br>HackBoot2.iso<br>OS X 10.8 Install DVD.iso</p><p>⑵ 双击安装 VirtualBox-4.1.20-80170-Win.exe 及 Oracle_VM_VirtualBox_Extension_Pack-4.1.20-80170.vbox-extpack</p><p>⑶.1 在 VirtualBOX 新建虚拟电脑<br>名称    Mac OS X 10.8<br>操作系统 :  Mac OS X<br>版本        :  Mac OS X Server (64 bit)<br><img src="http://m3.img.libdd.com/farm5/2013/0120/08/9C20C0FBF40C6375D8087D29E9FB30EE4115EB1F76937_586_395.PNG"></p><p>⑶.2 内存分配最好 2048 MB 以上<br><img src="http://m1.img.libdd.com/farm5/2013/0120/08/DDBE32C0A1964E1CDA9A08121374FA55D236DD1AB1578_593_397.PNG"></p><p>⑶.3  创建新的虚拟硬盘<br><img src="http://m2.img.libdd.com/farm4/2013/0120/08/4322F6BB63FF7D1CE984D6EAF1BAF1AAA7869CDC66F96_596_404.PNG"></p><p>⑶.4  选择 VDI (VirtualBox Disk Image)<br><img src="http://m2.img.libdd.com/farm4/2013/0120/08/4B55E1B4033A4D970896671C73BE02C1BCC84AB3C7622_658_468.PNG"></p><p>⑶.5 选择 Dynamically allocated<br><img src="http://m3.img.libdd.com/farm5/2013/0120/08/A714C334F4F6EE052E077E8798883A665A2E63C9C2914_662_472.PNG"></p><p>⑶.6  设置虚拟硬盘位置及大小, 建议大小为 20 GB 至 (最好) 40 GB<br><img src="http://m3.img.libdd.com/farm5/2013/0120/08/8CBDB10AE518B259CD6E8176D56A55281BC8598CF25C6_660_470.PNG"></p><p>⑷.1 打开 VirtualBOX 设置虚拟机，系统 -&gt; 主板, 去掉 “软驱”，取消勾选 “启用 EFI”<br><img src="http://m2.img.libdd.com/farm5/2013/0120/08/A18DDC44492D8BC8E53DD0DFB9BD45E88063108C6B8E2_597_340.PNG"></p><p>⑷.2 系统 -&gt; 处理器, 选择双核 CPU数量&#x3D; 2<br><img src="http://m3.img.libdd.com/farm4/2013/0120/08/88E3DA131E555244CCCE46FECD44F70E4257EFB45AA89_603_330.PNG"></p><p>⑷.3 显示 -&gt; 显卡 -&gt; 显存大小设置到最大 128 MB<br><img src="http://m3.img.libdd.com/farm4/2013/0120/08/3606001F319BC1BCC19CDF14025ACCD2B2F6F81BA09D9_609_337.PNG"></p><p>⑸.1  在 Storage -&gt; IDE Controller 属性 CD &#x2F; DVD Drive 右边的光盘图标 Choose a virtual CD&#x2F;DVD disk file 选择 HackBoot1.iso 文件<br><img src="http://m2.img.libdd.com/farm5/2013/0120/08/C78BB836AC3D5BA60FE91CB3B84D71E6A5B1DD41B303A_509_83.PNG"></p><p>⑸.2 在 HackBoot1.iso 的启动引导下, 如下 HackBoot 页面出现后<br><img src="http://m2.img.libdd.com/farm5/2013/0120/08/B1F92B916999518956B620F962E459788AE765812461E_461_260.PNG"></p><p>在虚拟机底右下状态位置-&gt; 光盘图标 Choose a virtual CD&#x2F;DVD disk file 选择 OS X 10.8 Install DVD.iso 文件，按键 F5 刷新后，回车开始安装系统<br><img src="http://m3.img.libdd.com/farm4/2013/0120/08/8FACD7074EB01A0BEF00016BF2519ABA5D2D181CB1D21_264_124.PNG"></p><p>⑸.3 安装系统开始时，提示找不到任何有效的硬盘 , 使用菜单 Utilities -&gt; Disk Utility 格式化虚拟硬盘, 左边点击硬盘, 选择 Erase, Name 录入 “Macintosh HD”,  然后点击 Erase<br><img src="http://m2.img.libdd.com/farm5/2013/0120/08/A4D07DDEB77D451F3C72A64824CD98B6B7C28AE6372D5_461_260.PNG"></p><p>⑸.4 安装系统成功后, 关闭 Mac OS X 10.8 虚拟机, 在 Storage -&gt; IDE Controller 属性 CD &#x2F; DVD Drive 右边的光盘图标 Choose a virtual CD&#x2F;DVD disk file 选择 HackBoot2.iso 文件<br><img src="http://m2.img.libdd.com/farm5/2013/0120/08/C78BB836AC3D5BA60FE91CB3B84D71E6A5B1DD41B303A_509_83.PNG"></p><p>⑸.5 在 HackBoot2.iso 的启动引导下, 如下 HackBoot 页面出现后 , 使用右键选择启动 Macintosh HD<br><img src="http://m1.img.libdd.com/farm5/2013/0120/08/891AF4276EB60F125D631E3436DDA1E8B543137A30881_461_260.PNG"></p><p>⑸.6 启动 Mac OS X 10.8 虚拟机文件后的 Mac OS X 设置<br>如需要更改语言 (左上角的 苹果菜单 -&gt; 系统偏好设置(System Preferences) -&gt; Language &amp; Text), 重启后才更新<br>如需要更改时区 (左上角的 苹果菜单 -&gt; 系统偏好设置(System Preferences) -&gt; Date &amp; Time)<br><img src="http://m3.img.libdd.com/farm5/2013/0120/08/C87189797BBACEDB2ECE87CFC75A04FDFCD9CC4FC49BE_258_332.JPEG"></p><p>⑸.7 在 苹果菜单 -&gt; 系统偏好设置(System Preferences) -&gt; “安全性与私隐” 里面选择 “任何来源” (用于安装 MultiBeast)<br><img src="http://m1.img.libdd.com/farm5/2013/0120/08/578DB77DF00DAFF3B90F42DC5A2D7A30C58F720FFD648_300_248.PNG"></p><p>⑸.8 使用 Mac OS X 10.8 的 Safari, 下载及解压 MultiBeast-4.6.1.zip (用于解决虚拟机的声音问题)<br>迅雷下载 : <a href="http://kuai.xunlei.com/d/LDAYOTMGKBOO">http://kuai.xunlei.com/d/LDAYOTMGKBOO</a></p><p>⑸.9 解压后的文件夹内, 双击安装 MultiBeast 4.6.1.pkg, 安装时勾选如下 4项<br>UserDSDT Install<br>System Utilities -&gt; Repair Permissions<br><img src="http://m3.img.libdd.com/farm5/2013/0120/08/7C03E22A35B55C98C633E041CF5893871F70F758A4284_423_64.PNG"></p><p>AppleHDA Rollback<br><img src="http://m1.img.libdd.com/farm5/2013/0120/08/1D208E6ABAE04CA4B769F68AF7139CF8DCD60F60858AB_418_114.PNG"></p><p>NullCPUPowerManagement<br><img src="http://m2.img.libdd.com/farm5/2013/0120/08/4E339668F375765B56045AA0F558944D790D011ECDC9C_416_180.PNG"></p><p><img src="http://m3.img.libdd.com/farm5/2013/0120/08/1A47F003E45A7AD9AD0F661516491BC7FBB3A265FD4DB_284_250.PNG"></p><p>⑸.10 Finder 菜单，前往 -&gt; 前往文件夹 &#x2F;System&#x2F;Library&#x2F;Extensions&#x2F;<br><img src="http://m1.img.libdd.com/farm5/2013/0120/08/9AB23ACE877DDA60F9A7E2B4A70E30B224FD23672E9C0_459_342.PNG"> <img src="http://m2.img.libdd.com/farm4/2013/0120/08/023D0057B50C9F6AD71F46CBE2A64E946A39747856035_378_101.PNG"><br>删除 AppleGraphicsControl.kext 文件<br><img src="http://m2.img.libdd.com/farm5/2013/0120/08/83A17D897B8E6D9148A4E490800D886DBD62766B250D4_327_135.PNG"></p><p>⑸.11 Finder 菜单，前往 -&gt; 前往文件夹 &#x2F;Extra&#x2F;<br><img src="http://m1.img.libdd.com/farm5/2013/0120/08/9AB23ACE877DDA60F9A7E2B4A70E30B224FD23672E9C0_459_342.PNG"> <img src="http://m1.img.libdd.com/farm4/2013/0120/08/9CAF62675120BC169637E85CEC5C668CD90BA39331DDC_373_101.PNG"></p><p>修改 org.Chameleon.boot.plist , 增加分辨率内容如下</p><p><code>&lt;key&gt;Graphics Mode&lt;/key&gt;</code></p><p><code>&lt;string&gt;1440x768x32&lt;/string&gt;</code></p><p><img src="http://m1.img.libdd.com/farm4/2013/0120/08/03B24E07277A6BFA911615A3883CBAA7374DD679CE602_624_257.PNG"><br>也可以选择以下分辨率<br>1152x720x32<br>1366x768x32<br>1440x900x32</p><p>⑸.12 关闭 Mac OS X 10.8 虚拟机,  在 Storage -&gt; IDE Controller 属性 CD &#x2F; DVD Drive 右边的光盘图标<br>选择 Remove disk from virtual drive 去退出 HackBoot2.iso 文件<br><img src="http://m2.img.libdd.com/farm4/2013/0120/08/12336FCD413659E974E81E4A83346524C87D6501FF822_700_217.PNG"></p><p>⑸.13 在 Windows 下 cmd 执行<br><img src="http://m1.img.libdd.com/farm4/2013/0120/08/2986C0E39C863AB2A9220FC653A86922C627F4679333C_400_323.PNG"><br>请根据 ⑶.1 虚拟电脑的名称 及 ⑸.11 选择的分辨率，执行</p><p><code>cd &quot;C:Program FilesOracleVirtualBox&quot;</code></p><p><code>VBoxManage setextradata &quot;Mac OS X 10.8&quot; &quot;CustomVideoMode1&quot; &quot;1440x768x32&quot;</code></p><p><img src="http://m3.img.libdd.com/farm4/2013/0120/08/D97AD119AF7EA6DE8CCB04749E434466B7902A009F439_700_182.PNG"></p><p>⑸.14 启动虚拟电脑, 会直接启动 Mac OS X 10.8 虚拟硬盘,  以后并不需要Hackboot 光盘文件的引导<br>重新启动虚拟电脑后, 可选择在 苹果菜单 -&gt; 软件更新<br>可选择更新 OS X Mountain Lion 10.8.2 <a href="http://support.apple.com/kb/DL1580?viewlocale=zh_CN">http://support.apple.com/kb/DL1580?viewlocale=zh_CN</a><br>及 10.8.2 Supplemental Update <a href="http://support.apple.com/kb/DL1600?viewlocale=zh_CN">http://support.apple.com/kb/DL1600?viewlocale=zh_CN</a></p><p>系统更新 10.8.2 后要重覆步骤 ⑸.9 至 ⑸.11 及关闭 Mac OS X 10.8 虚拟机后重新启动。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;转载自：http-bbs-weiphone-com-read-htm-tid-5329046-html&quot;&gt;&lt;a href=&quot;#转载自：http-bbs-weiphone-com-read-htm-tid-5329046-html&quot; class=&quot;headerlin</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="mac" scheme="https://www.gsgundam.com/tags/mac/"/>
    
    <category term="10.8" scheme="https://www.gsgundam.com/tags/10-8/"/>
    
    <category term="box" scheme="https://www.gsgundam.com/tags/box/"/>
    
    <category term="lion" scheme="https://www.gsgundam.com/tags/lion/"/>
    
    <category term="mountain" scheme="https://www.gsgundam.com/tags/mountain/"/>
    
    <category term="virtual" scheme="https://www.gsgundam.com/tags/virtual/"/>
    
  </entry>
  
  <entry>
    <title>TweenLite使用autoAlpha需要先注册</title>
    <link href="https://www.gsgundam.com/archive/2013-03-08-tweenlitee-register-autoalpha-before-use/"/>
    <id>https://www.gsgundam.com/archive/2013-03-08-tweenlitee-register-autoalpha-before-use/</id>
    <published>2013-03-07T23:48:12.000Z</published>
    <updated>2022-11-28T05:37:22.549Z</updated>
    
    <content type="html"><![CDATA[<p>以前测试的时候就发现这个问题了，不过没有深究，这次正式要用到了，才知道原来有个步骤没有做。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> com.<span class="property">greensock</span>.<span class="property">TweenLite</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.<span class="property">greensock</span>.<span class="property">plugins</span>.<span class="property">TweenPlugin</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.<span class="property">greensock</span>.<span class="property">plugins</span>.<span class="property">AutoAlphaPlugin</span>;</span><br><span class="line"></span><br><span class="line"><span class="title class_">TweenPlugin</span>.<span class="title function_">activate</span>([<span class="title class_">AutoAlphaPlugin</span>]);<span class="comment">//要先注册才能使用autoAlpha ，在TweenLite.as中有说明。</span></span><br><span class="line"></span><br><span class="line"><span class="title class_">TweenLite</span>.<span class="title function_">to</span>(mc,<span class="number">1</span>,&#123;<span class="attr">autoAlpha</span>:<span class="number">0</span>&#125;);</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;以前测试的时候就发现这个问题了，不过没有深究，这次正式要用到了，才知道原来有个步骤没有做。&lt;/p&gt;
&lt;figure class=&quot;highlight javascript&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;li</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="FLASH" scheme="https://www.gsgundam.com/tags/FLASH/"/>
    
    <category term="actionscript" scheme="https://www.gsgundam.com/tags/actionscript/"/>
    
    <category term="as3" scheme="https://www.gsgundam.com/tags/as3/"/>
    
    <category term="autoAlpha" scheme="https://www.gsgundam.com/tags/autoAlpha/"/>
    
    <category term="TweenLite" scheme="https://www.gsgundam.com/tags/TweenLite/"/>
    
    <category term="注册" scheme="https://www.gsgundam.com/tags/%E6%B3%A8%E5%86%8C/"/>
    
  </entry>
  
  <entry>
    <title>jsfl批量导出swf</title>
    <link href="https://www.gsgundam.com/archive/2013-01-25-jsfl-export-swf/"/>
    <id>https://www.gsgundam.com/archive/2013-01-25-jsfl-export-swf/</id>
    <published>2013-01-24T19:19:15.000Z</published>
    <updated>2022-11-28T05:37:22.549Z</updated>
    
    <content type="html"><![CDATA[<p>转自 <a href="http://www.cnblogs.com/as3lib/archive/2012/09/17/2688435.html">http://www.cnblogs.com/as3lib/archive/2012/09/17/2688435.html</a></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> inputPath = \<span class="string">&quot;file:///E|/work/war_test/bin-debug/fla/fight/\&quot;;</span></span><br><span class="line"><span class="string">var exportPath=\&quot;file:///E|/work/war_test/bin-debug/swf/fight/\&quot;;</span></span><br><span class="line"><span class="string">fl.trace(inputPath);</span></span><br><span class="line"><span class="string">//封装成一个函数</span></span><br><span class="line"><span class="string">function IOExecute(flaName,swfName)&#123;</span></span><br><span class="line"><span class="string">//打开需要导出的fla源文件</span></span><br><span class="line"><span class="string">var fla=fl.openDocument(inputPath + flaName);</span></span><br><span class="line"><span class="string">//导出影片</span></span><br><span class="line"><span class="string">fla.exportSWF(exportPath + swfName,false);</span></span><br><span class="line"><span class="string">//关闭源文件</span></span><br><span class="line"><span class="string">fl.closeDocument(fl.documents[0],false);</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string">//执行函数</span></span><br><span class="line"><span class="string">/_IOExecute(\&quot;am.fla\&quot;,\&quot;am.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;index.fla\&quot;,\&quot;index.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;navi_link.fla\&quot;,\&quot;navi_link.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;night.fla\&quot;,\&quot;night.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;nightfall.fla\&quot;,\&quot;nightfall.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;products.fla\&quot;,\&quot;products.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;products_loader.fla\&quot;,\&quot;products_loader.swf\&quot;);_/</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战步兵-近卫步兵.fla\&quot;,\&quot;f4.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战步兵-猎兵.fla\&quot;,\&quot;f2.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战步兵-燧发枪兵.fla\&quot;,\&quot;f1.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战步兵-医务兵.fla\&quot;,\&quot;f3.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战步兵-掷弹兵.fla\&quot;,\&quot;f5.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战炮兵-长管炮兵.fla\&quot;,\&quot;f12.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战炮兵-短重炮兵.fla\&quot;,\&quot;f13.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战炮兵-攻城炮兵.fla\&quot;,\&quot;f14.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战炮兵-加农炮兵.fla\&quot;,\&quot;f11.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战炮兵-巨炮兵.fla\&quot;,\&quot;f15.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战骑兵-皇家骑兵.fla\&quot;,\&quot;f8.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战骑兵-猎骑兵.fla\&quot;,\&quot;f6.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战骑兵-龙骑兵.fla\&quot;,\&quot;f10.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战骑兵-轻骑兵.fla\&quot;,\&quot;f7.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战骑兵-重骑兵.fla\&quot;,\&quot;f9.swf\&quot;);</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">IOExecute(\&quot;战船-单桅商船.fla\&quot;,\&quot;f16.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战船-双桅横帆船.fla\&quot;,\&quot;f17.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战船-纵帆船.fla\&quot;,\&quot;f18.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战船-双桅纵横帆帆船.fla\&quot;,\&quot;f19.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战船-三桅战船.fla\&quot;,\&quot;f20.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战船-巡航战船.fla\&quot;,\&quot;f21.swf\&quot;);</span></span><br><span class="line"><span class="string">IOExecute(\&quot;战船-海盗船王.fla\&quot;,\&quot;f22.swf\&quot;);</span></span><br><span class="line"><span class="string"></span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;转自 &lt;a href=&quot;http://www.cnblogs.com/as3lib/archive/2012/09/17/2688435.html&quot;&gt;http://www.cnblogs.com/as3lib/archive/2012/09/17/2688435.html&lt;</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="FLASH" scheme="https://www.gsgundam.com/tags/FLASH/"/>
    
    <category term="fla" scheme="https://www.gsgundam.com/tags/fla/"/>
    
    <category term="swf" scheme="https://www.gsgundam.com/tags/swf/"/>
    
    <category term="导出" scheme="https://www.gsgundam.com/tags/%E5%AF%BC%E5%87%BA/"/>
    
  </entry>
  
  <entry>
    <title>关于addFrameScript的使用</title>
    <link href="https://www.gsgundam.com/archive/2012-12-15-use-addframescript/"/>
    <id>https://www.gsgundam.com/archive/2012-12-15-use-addframescript/</id>
    <published>2012-12-14T19:58:35.000Z</published>
    <updated>2022-11-28T05:37:22.551Z</updated>
    
    <content type="html"><![CDATA[<p>在写自己的东西时，涉及到需要stop或者removeChild或者要dispatchEvent的动画，原来都是直接在Flash IDE里的帧上直接写代码。后来Fenix告诉我这样不便于代码管理，fla里边尽量不要写代码，可以使用EnterFrame来侦听是不是到了指定帧。虽然并没有发现对效率有什么影响，但是其实个人一直担心<code>EnterFrame</code>会带来不少负担。</p><p>最近公司的项目有不少小东西要处理，于是也稍微介入了一些程序的工作，发现其中用到了不少<code>addFrameScript</code>。看起来似乎很好用，于是到网上搜索了一下，大概整理出了以下资料。</p><p>1.基本用法</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mc.<span class="title function_">addFrameScript</span>(frameIndex,<span class="keyword">function</span>);</span><br></pre></td></tr></table></figure><p>2.需要一次过在多个帧上面添加不同的帧标记的时候，可以这样使用：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mc.<span class="title function_">addFrameScript</span>(<span class="number">1</span>,fun1,<span class="number">5</span>,fun2,<span class="number">10</span>,fun3);</span><br></pre></td></tr></table></figure><p>3.frameIndex是从0开始的，而不是像<code>gotoAndStop()</code>函数是从1开始的，这里需要将实际的帧减1才是正确的。如果对同一帧重复添加帧代码，新的帧代码会自动替换旧的。<code>addFrameScript(frameIndex, null)</code>的方法可以清除frameIndex帧的代码。特别需要注意的是，一旦这个MC开始了播放，再次调用<code>addFrameScript</code>就会无效的了，所以需要在构造函数中就定义好。<br>目前已经把自己的用到代码中可以替换的都换掉了，但是网上也有人说不推荐使用这个方法，因为<code>addFrameScript</code>是flash的隐藏方法，与<code>EnterFrame</code>在底层实现机制是一样的。比较耸人听闻的还有，它有可能造成内存泄漏。先用着看吧。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;在写自己的东西时，涉及到需要stop或者removeChild或者要dispatchEvent的动画，原来都是直接在Flash IDE里的帧上直接写代码。后来Fenix告诉我这样不便于代码管理，fla里边尽量不要写代码，可以使用EnterFrame来侦听是不是到了指定帧。虽</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="action" scheme="https://www.gsgundam.com/tags/action/"/>
    
    <category term="FLASH" scheme="https://www.gsgundam.com/tags/FLASH/"/>
    
    <category term="actionscript" scheme="https://www.gsgundam.com/tags/actionscript/"/>
    
    <category term="as3" scheme="https://www.gsgundam.com/tags/as3/"/>
    
  </entry>
  
  <entry>
    <title>Blizzard啟動程式:無法從[ http://zhCN.patch.battle.net:1119/patch ]</title>
    <link href="https://www.gsgundam.com/archive/2012-12-05-blizzard-start-failed/"/>
    <id>https://www.gsgundam.com/archive/2012-12-05-blizzard-start-failed/</id>
    <published>2012-12-05T07:08:56.000Z</published>
    <updated>2015-01-31T11:30:50.446Z</updated>
    
    <content type="html"><![CDATA[<p>这两天因为工作原因，想到台服暗黑3看一下游戏内容。</p><p>结果安装时悲剧的弹出提示：Blizzard啟動程式:無法從[ <a href="http://zhcn.patch.battle.net:1119/patch">http://zhCN.patch.battle.net:1119/patch</a> ]取得安裝資料URL,請檢查你的網絡連接.</p><p><img src="http://imgsrc.baidu.com/forum/pic/item/f7275eafa40f4bfb73f159b4034f78f0f63618d6.jpg" alt="&quot;错误截屏&quot;"></p><p>神马？是zhCN？</p><p>答案很明了，应该是安装魔兽世界的时候，被国服客户端写定下载地址了。</p><p>问了下度娘，删除C盘隐藏文件夹<code>Program data</code>里面 <code>Battle.net</code>和<code>Blizzard Entertainment</code>两个文件夹， 然后再重新安装就行了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;这两天因为工作原因，想到台服暗黑3看一下游戏内容。&lt;/p&gt;
&lt;p&gt;结果安装时悲剧的弹出提示：Blizzard啟動程式:無法從[ &lt;a href=&quot;http://zhcn.patch.battle.net:1119/patch&quot;&gt;http://zhCN.patch.battl</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="安装" scheme="https://www.gsgundam.com/tags/%E5%AE%89%E8%A3%85/"/>
    
    <category term="diablo" scheme="https://www.gsgundam.com/tags/diablo/"/>
    
    <category term="暗黑3" scheme="https://www.gsgundam.com/tags/%E6%9A%97%E9%BB%913/"/>
    
    <category term="暗黑破坏神" scheme="https://www.gsgundam.com/tags/%E6%9A%97%E9%BB%91%E7%A0%B4%E5%9D%8F%E7%A5%9E/"/>
    
  </entry>
  
  <entry>
    <title>体感切水果</title>
    <link href="https://www.gsgundam.com/archive/2012-12-03-play-fruitninja-with-kinect/"/>
    <id>https://www.gsgundam.com/archive/2012-12-03-play-fruitninja-with-kinect/</id>
    <published>2012-12-02T18:14:01.000Z</published>
    <updated>2018-11-07T05:09:53.382Z</updated>
    
    <content type="html"><![CDATA[<p>昨天和阿宝去了一家新开的KTV，玩得不错。不光是整体环境好，送的小吃饮料神马的也挺给力，而且在大厅里还有若干台免费上网的电脑和2台配了Kinect、玩水果忍者的电视。</p><p>看2个小孩儿玩了一会，我和阿宝也去玩了一把。大致还是挺精准的，而且，非常累人……比wii锻炼多了……</p><p><img src="http://i-2.yxdown.com/2014/8/5/KDYwMHgp/896fb94e-74ca-446f-991d-76b6a7e3fad0.jpg" alt="体感切水果"></p><p>阿宝说这个可以吸引到那些曾经幻想通过影子隔空取物、和羡慕科幻电影里面直接在空气中就能操纵电脑的人。嗯，想想还真有可能。百科在此：<a href="http://baike.baidu.com/view/3766855.htm">http://baike.baidu.com/view/3766855.htm</a> 。</p><p>等着有钱了，回头自家也弄个玩。看了下网上的介绍，大概800大洋出头，但是还得有xb360先……</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;昨天和阿宝去了一家新开的KTV，玩得不错。不光是整体环境好，送的小吃饮料神马的也挺给力，而且在大厅里还有若干台免费上网的电脑和2台配了Kinect、玩水果忍者的电视。&lt;/p&gt;
&lt;p&gt;看2个小孩儿玩了一会，我和阿宝也去玩了一把。大致还是挺精准的，而且，非常累人……比wii锻炼</summary>
      
    
    
    
    <category term="各种想法" scheme="https://www.gsgundam.com/categories/%E5%90%84%E7%A7%8D%E6%83%B3%E6%B3%95/"/>
    
    
    <category term="游戏" scheme="https://www.gsgundam.com/tags/%E6%B8%B8%E6%88%8F/"/>
    
    <category term="kinect" scheme="https://www.gsgundam.com/tags/kinect/"/>
    
    <category term="xbox360" scheme="https://www.gsgundam.com/tags/xbox360/"/>
    
    <category term="切水果" scheme="https://www.gsgundam.com/tags/%E5%88%87%E6%B0%B4%E6%9E%9C/"/>
    
    <category term="水果忍者" scheme="https://www.gsgundam.com/tags/%E6%B0%B4%E6%9E%9C%E5%BF%8D%E8%80%85/"/>
    
  </entry>
  
  <entry>
    <title>【转】一个将image转化为“黑白灰度”图像的函数</title>
    <link href="https://www.gsgundam.com/archive/2012-11-27-function-image-turn-to-grayscale/"/>
    <id>https://www.gsgundam.com/archive/2012-11-27-function-image-turn-to-grayscale/</id>
    <published>2012-11-26T18:04:02.000Z</published>
    <updated>2022-11-28T05:37:22.551Z</updated>
    
    <content type="html"><![CDATA[<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">private <span class="keyword">function</span> <span class="title function_">convertToGrayscale</span>(<span class="params">image:DisplayObject</span>):<span class="keyword">void</span> </span><br><span class="line">    &#123; </span><br><span class="line">      <span class="keyword">var</span> <span class="attr">matrix</span>:<span class="title class_">Array</span> = [<span class="number">0.3</span>, <span class="number">0.59</span>, <span class="number">0.11</span>, <span class="number">0</span>, <span class="number">0</span>, </span><br><span class="line">                  <span class="number">0.3</span>, <span class="number">0.59</span>, <span class="number">0.11</span>, <span class="number">0</span>, <span class="number">0</span>, </span><br><span class="line">                  <span class="number">0.3</span>, <span class="number">0.59</span>, <span class="number">0.11</span>, <span class="number">0</span>, <span class="number">0</span>, </span><br><span class="line">                  <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>]; </span><br><span class="line">      <span class="keyword">var</span> <span class="attr">grayscaleFilter</span>:<span class="title class_">ColorMatrixFilter</span> = <span class="keyword">new</span> <span class="title class_">ColorMatrixFilter</span>(matrix); </span><br><span class="line">      <span class="keyword">var</span> <span class="attr">filters</span>:<span class="title class_">Array</span> = image.<span class="property">filters</span>; </span><br><span class="line">      filters.<span class="title function_">push</span>(grayscaleFilter); </span><br><span class="line">      image.<span class="property">filters</span> = filters; </span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;figure class=&quot;highlight javascript&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span </summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="action" scheme="https://www.gsgundam.com/tags/action/"/>
    
    <category term="script" scheme="https://www.gsgundam.com/tags/script/"/>
    
    <category term="FLASH" scheme="https://www.gsgundam.com/tags/FLASH/"/>
    
    <category term="actionscript" scheme="https://www.gsgundam.com/tags/actionscript/"/>
    
    <category term="as3" scheme="https://www.gsgundam.com/tags/as3/"/>
    
  </entry>
  
  <entry>
    <title>FlashDevelop调用fl包</title>
    <link href="https://www.gsgundam.com/archive/2012-11-24-flashdevelop-use-fl-package/"/>
    <id>https://www.gsgundam.com/archive/2012-11-24-flashdevelop-use-fl-package/</id>
    <published>2012-11-24T07:32:28.000Z</published>
    <updated>2018-11-07T05:08:38.412Z</updated>
    
    <content type="html"><![CDATA[<p>个人一直偏好于使用FlashDevelop这种轻量级的IDE，而不是FlashBuilder那样大而全的东西。但是有得必有失，在使用过程中碰到的问题自然不少。</p><p>这次在使用颜色滤镜 fl.motion.ColorMatrix 的时候，又遇到了问题。原来是因为FlashDevelop的AS3项目默认没有导入fl包，于是将FlashIDE 项目中的fl包拷贝到AS3项目中（复制FlashDevelopLibraryAS3frameworksFlashIDE下面的FL包到FlashDevelopLibraryAS3intrinsicFP10），这下就愉快的开始使用了。</p><p>但是！居然编译时报错了！告诉我找不到这个类！</p><p>原来这样操作以后，只是用来补全代码的吗？为这么一个小问题就把项目迁移到FB去完成，那太不值了！于是，我开始了搜索历程。</p><p>1.首先找到了一个很惊喜的东西，一个老外在做他的FDT项目时，也因为没有fl包，所以把这个包导出成了swc（猛击这里下载：<a href="http://apdevblog.com/wp-content/uploads/2008/02/fl_package.swc">http://apdevblog.com/wp-content/uploads/2008/02/fl_package.swc</a>），当然，还有更猛的，连控件皮肤的资源都带上了（猛击这里下载：<a href="http://code.google.com/p/asform/downloads/list">http://code.google.com/p/asform/downloads/list</a>）。</p><p>测试效果如何呢？也许这可以满足一部分人的需求，但是我并不在内。因为这里面并没有把 fl.motion.ColorMatrix 打包进去。所以历程继续。</p><p>2.有人提到可以把fl包加入全局类路径（ tools&gt;Global Classpaths ），这个方法看上去就很可行。于是我按教程找到了 ..Adobe Flash CS5.5zh_cnConfigurationActionScript 3.0Classes，完成，编译……靠！还是失败？这是为毛？我循着路径到目录中，只看到了一个孤零零的mxml文件。虽然没有一下子找到，不过这种事情搜索一下就解决了。对于CS5.5，正确的路径应该是 <strong>..Adobe Flash CS5.5CommonConfigurationActionScript 3.0projectsFlashsrc</strong> 。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/fl%E5%8C%85%E4%BD%8D%E7%BD%AE.png" alt="&quot;fl包位置&quot;"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/general/%E6%B7%BB%E5%8A%A0%E5%85%A8%E5%B1%80%E8%B7%AF%E5%BE%84.png" alt="&quot;添加全局类路径&quot;"></p><p>Shift+F8清理，F5编译完美通过，菜鸟工程继续！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;个人一直偏好于使用FlashDevelop这种轻量级的IDE，而不是FlashBuilder那样大而全的东西。但是有得必有失，在使用过程中碰到的问题自然不少。&lt;/p&gt;
&lt;p&gt;这次在使用颜色滤镜 fl.motion.ColorMatrix 的时候，又遇到了问题。原来是因为Fl</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="FLASH" scheme="https://www.gsgundam.com/tags/FLASH/"/>
    
    <category term="actionscript" scheme="https://www.gsgundam.com/tags/actionscript/"/>
    
    <category term="as3" scheme="https://www.gsgundam.com/tags/as3/"/>
    
    <category term="ColorMatrix" scheme="https://www.gsgundam.com/tags/ColorMatrix/"/>
    
    <category term="fl" scheme="https://www.gsgundam.com/tags/fl/"/>
    
    <category term="flashdevelop" scheme="https://www.gsgundam.com/tags/flashdevelop/"/>
    
  </entry>
  
  <entry>
    <title>【转】ColorMatrixFilter色彩矩阵滤镜</title>
    <link href="https://www.gsgundam.com/archive/2012-09-25-color-matrix-filter/"/>
    <id>https://www.gsgundam.com/archive/2012-09-25-color-matrix-filter/</id>
    <published>2012-09-25T15:53:47.000Z</published>
    <updated>2022-11-28T05:37:22.561Z</updated>
    
    <content type="html"><![CDATA[<p>开始着手纯粹数独2的开发了，想打造全新的用户体验，所以要用到一些以前没接触过新东西，网上看到这个颜色滤镜方法的说明，蛮有用的，存下来。</p><p>转自：<a href="http://blog.163.com/mdzhg@126/blog/static/1633215682010423113048711/">http://blog.163.com/mdzhg@126/blog/static/1633215682010423113048711/</a></p><p>包 <code>flash.filters</code><br>类 <code>public final class ColorMatrixFilter</code><br>继承 <code>ColorMatrixFilter  BitmapFilter  Object</code><br>使 用 <code>ColorMatrixFilter</code> 类可以将 4 x 5 矩阵转换应用于输入图像上的每个像素的 RGBA 颜色和 Alpha 值，以生成具有一组新的 RGBA 颜色和 Alpha 值的结果。 该类允许饱和度更改、色相旋转、亮度为 Alpha 以及各种其它效果。 您可以将滤镜应用于任何显示对象（即，从 <code>DisplayObject</code> 类继承的对象），例如 <code>MovieClip</code>、<code>SimpleButton</code>、<code>TextField</code> 和 <code>Video</code> 对象，以及 <code>BitmapData</code> 对象。<br>注意：对于 RGBA 值，最高有效字节代表红色通道值，其后的有效字节分别代表绿色、蓝色和 Alpha 通道值。</p><p>一、构造方法：</p><p><code>ColorMatrixFilter(matrix:Array = null)；</code></p><p>二、matrix属性详解：</p><p>注意；这里的matrix并不是Matrix的实例，其实是一个Array；</p><p><code>matrix:Array</code>  [read-write]</p><p>由 20 个项目组成的数组，适用于 4 x 5 颜色转换。 matrix 属性不能通过直接修改它的值来更改（例如 myFilter.matrix[2] &#x3D; 1;）。 相反，必须先获取对数组的引用，对引用进行更改，然后重置该值。</p><p>颜 色矩阵滤镜将每个源像素分离成它的红色、绿色、蓝色和 Alpha 成分，分别以 srcR、srcG、srcB 和 srcA 表示。 若要计算四个通道中每个通道的结果，可将图像中每个像素的值乘以转换矩阵中的值。 （可选）可以将偏移量（介于 -255 至 255 之间）添加到每个结果（矩阵的每行中的第五项）中。 滤镜将各颜色成分重新组合为单一像素，并写出结果。 在下列公式中，a[0] 到 a[19] 对应于由 20 个项目组成的数组中的条目 0 至 19，该数组已传递到 matrix 属性：</p><p><code>redResult = (a[0] * srcR) + (a[1] * srcG) + (a[2] * srcB) + (a[3] * srcA) + a[4]</code></p><p><code>greenResult = (a[5] * srcR) + (a[6] * srcG) + (a[7] * srcB) + (a[8] * srcA) + a[9]</code></p><p><code>blueResult = (a[10] * srcR) + (a[11] * srcG) + (a[12] * srcB) + (a[13] * srcA) + a[14]</code></p><p><code>alphaResult = (a[15] * srcR) + (a[16] * srcG) + (a[17] * srcB) + (a[18] * srcA) + a[19]</code><br>对于数组中的每个颜色值，值 1 等于正发送到输出的通道的 100%，同时保留颜色通道的值。</p><p>计算是对非相乘的颜色值执行的。 如果输入图形由预先相乘的颜色值组成，这些值会自动转换为非相乘的颜色值以执行此操作。</p><p>可使用两种经过优化的模式：</p><p>三、理解、体会；</p><p>matrix是一个长度为4*5＝20的数组，其构成如下所示：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> <span class="attr">matrix</span>:<span class="title class_">Array</span> = <span class="keyword">new</span> <span class="title class_">Array</span>();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//                                              R  ,G, B,  A, offset</span></span><br><span class="line">            matrix = matrix.<span class="title function_">concat</span>([<span class="number">1</span>,  <span class="number">0</span>,  <span class="number">0</span>,  <span class="number">0</span>,  <span class="number">0</span>]); <span class="comment">// red</span></span><br><span class="line">matrix = matrix.<span class="title function_">concat</span>([<span class="number">0</span>,  <span class="number">1</span>,  <span class="number">0</span>,  <span class="number">0</span>,  <span class="number">0</span>]); <span class="comment">// green</span></span><br><span class="line">            matrix = matrix.<span class="title function_">concat</span>([<span class="number">0</span>,  <span class="number">0</span>,  <span class="number">1</span>,  <span class="number">0</span>,  <span class="number">0</span>]); <span class="comment">// blue</span></span><br><span class="line">matrix = matrix.<span class="title function_">concat</span>([<span class="number">0</span>,  <span class="number">0</span>,  <span class="number">0</span>,  <span class="number">1</span>,  <span class="number">0</span>]); <span class="comment">// alpha</span></span><br></pre></td></tr></table></figure><p>上面是matrix的初始状态。</p><p>下面我分先来分析一下其初始状态。</p><p>red通道的值：（1，0，0，0，0）表示，R通道的乘数是1（完全保留），别的道道的的乘数是0，（不加入别的通道的颜色），色彩偏移量off是0；</p><p>。。。</p><p>别的通道依次类推。</p><p>下面来做一些效果，增加对colorMatrixFilter的认识；</p><p><strong>1、调整亮度：</strong></p><p>亮度(N取值为-255到255)<br>1,0,0,0,N<br>0,1,0,0,N<br>0,0,1,0,N<br>0,0,0,1,0</p><p>我们只需要设置一下RGB的色彩偏移就能调节其亮度，是不是很简单呢。</p><p><strong>2、颜色反向</strong><br>-1,0,0,0,255</p><p>0,-1,0,0,255</p><p>0,0,-1,0,255</p><p>0,0,0,1,0</p><p>先解释一下颜色反向：就是把0变为255，255变为0，1变为254，254变为1…..</p><p>因此，我们只需把RGB通道的原通道乘数设为－1，然后再把色彩偏移量设为255就行了。</p><p><strong>3、图像去色：</strong></p><p>0.3086, 0.6094, 0.0820, 0, 0<br>0.3086, 0.6094, 0.0820, 0, 0<br>0.3086, 0.6094, 0.0820, 0, 0<br>0    , 0    , 0    , 1, 0</p><p>1）、首先了解一下去色原理：只要把RGB三通道的色彩信息设置成一样；即：R＝G＝B，那么图像就变成了灰色，并且，为了保证图像亮度不变，同一个通道中的R+G+B&#x3D;1:如：0.3086+0.6094+0.0820＝1；</p><p>2）、三个数字的由来：0.3086, 0.6094, 0.0820；</p><p>按理说应该把RGB平分，都是0.3333333。三个数字应该是根据色彩光波频率及色彩心理学计算出来的（本人是这么认为，当然也查询了一些资料，目前尚未找到准确答案。</p><p>在作用于人眼的光线中，彩色光要明显强于无色光。对一个图像按RGB平分理论给图像去色的话，人眼就会明显感觉到图像变暗了（当然可能有心理上的原因，也有光波的科学依据）另外，在彩色图像中能识别的一下细节也可能会丢失。我假想：可能绿色的一些东西会丢失。</p><p>下面是我从PS中对RGB都为255的明度对比图：</p><p><img src="http://img616.ph.126.net/JjaaqHHDYIAyaQlTNMSJ9A==/1709960483519212313.jpg" alt="&quot;ColorMatrixFilter色彩矩阵滤镜&quot;"></p><p>同样的RGB，给人的感觉是绿色最亮，红色次之，蓝色最暗。它们的比例大概是3：6：1，即：0.3086, 0.6094, 0.0820</p><p>所以，在给图像去色时我们保留了大量的G通道信息，使得图像不至于变暗或者绿色信息不至于丢失（我猜想）。</p><p><strong>4、色彩饱和度</strong></p><p>N取值为0到2，当然也可以更高。<br>0.3086*(1-N) + N, 0.6094*(1-N)    , 0.0820*(1-N)    , 0, 0,<br>0.3086*(1-N)   , 0.6094*(1-N) + N, 0.0820*(1-N)    , 0, 0,<br>0.3086*(1-N)   , 0.6094*(1-N)    , 0.0820*(1-N) + N 0, 0,<br>0        , 0        , 0        , 1, 0</p><p>分析：</p><p>1、当色彩饱和度低到一定成度的时候，就想当于给图像去色，所以跟第3条：图像去色，有着千丝万缕的联系，在此不想过多解释；</p><p>2、N为原有通道信息保留量；可以理解为百分之几，等于0时完全去色，小于1时降低色度，大于1时增加色度，等于2时色度翻一倍，等于3时……。注意：RGB的原有通道信息保留量都应该相等，不然会产生偏色。</p><p>3、为什么是这样的计算公式：</p><p>N是原通道色彩保留量：所以，在原通道中，我们都+ N，这是不能被别的通道瓜分的。剩余的就是（1－N），就让RGB按0.3086, 0.6094, 0.0820的比例还瓜分这个剩余量吧。</p><p>** 5、对比度**</p><p>N取值为0到10<br>N,0,0,0,128_(1-N)<br>0,N,0,0,128_(1-N)<br>0,0,N,0,128*(1-N)<br>0,0,0,1,0</p><p>分析：</p><p>所 谓对比度就是让红的更红，绿的更绿……或反之。初一想，我们只需要修改RGB的乘数（要一至，不然偏色）。可仔细一琢磨，不对。如果只增加乘数，那么整个 图像就会被漂白，（或反之）。好，有办法了，设置色彩偏移量，offset。具体要偏移多少呢，我们找到了一个折中的方案：128（1－N);即：一幅图 像，不论很亮或很黑，但对比度为0了，最终得到的都是一幅中性灰度的图像（128），<br><strong>6、阈值</strong></p><p>所谓阈值，就是以一个色度值为基准对图像作非黑即白的处理（注意没有灰色），由于不去除了彩色属性，因此，也离不开0.3086, 0.6094, 0.0820这三组神奇的数字。</p><p>(N取值为0到255)</p><p>下面的256也可以改成255；（那样就能看到图一和图五的小黑点和小白点）；<br>0.3086_256,0.6094_256,0.0820_256,0,-256_N<br>0.3086_256,0.6094_256,0.0820_256,0,-256_N<br>0.3086_256,0.6094_256,0.0820_256,0,-256_N<br>0, 0, 0, 1, 0</p><p>分析：</p><p>先不看最后面的色彩偏移：-256*N</p><p>前 面我们提及过，当RGB三个通道的色彩信息一模一样时，图像就失去了色彩（去色），从 0.3086_256,0.6094_256,0.0820_256,0,-256_N可以看出：图像已经去色了，并且，（*256）亮度已经翻了256 倍（当然也可以是255）；我们知道，RGB的有效值是0－255，即：0，1，2……255，把这些值乘以255以后会出现什么情况呢？但是除了0之 外，别的全都大于或等于255了，所以此时的图像除了剩有几个黑点外，其它的全都变成白色了如图一（N＝0）；那么现在我们再作色彩偏移处理：把RGB都 减去255；上次值为255（白色）的现在又变成0（黑色了）超过255的仍然是白色，我们不断的反复减255，图2，图3，图4，图5，分别是 N＝64，N＝128，n&#x3D;192,n&#x3D;255时的图像：</p><p><img src="http://img58.ph.126.net/mua3Sfwr0I2WebC99yWx_A==/822188406973435599.jpg" alt="&quot;ColorMatrixFilter色彩矩阵滤镜&quot;"></p><p><strong>7、色彩旋转</strong></p><p>所 谓色彩旋转就是让某一个通道的色彩信息让另一个通道去显示；比如，R显示G的信息，G显示B的信息，B显示R的信息，也可以只拿出一部份信息让给别的通道 去显示，至于参数的瓜分可以平分。不必太讲究，但是，始终要坚持的一个原则就是每一个通道中的RGB信息量之和一定要为1，不然将会生偏色，如果您要制作 偏色效果又另当别论；请偿试下面的参数<strong>：</strong></p><p>0,1,0,0,0<br>0,0,1,0,0<br>1,0,0,0,0<br>0,0,0,1,0</p><p>&#x2F;&#x2F;—————</p><p>0,0,1,0,0<br>1,0,0,0,0<br>0,1,0,0,0<br>0,0,0,1,0</p><p><strong>8、只显示某个通道</strong>；</p><p>1,0,0,0,0<br>0,0,0,0,0<br>0,0,0,0,0<br>0,0,0,1,0</p><p>&#x2F;&#x2F;上面是只显示红色通道。依次类推。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;开始着手纯粹数独2的开发了，想打造全新的用户体验，所以要用到一些以前没接触过新东西，网上看到这个颜色滤镜方法的说明，蛮有用的，存下来。&lt;/p&gt;
&lt;p&gt;转自：&lt;a href=&quot;http://blog.163.com/mdzhg@126/blog/static/16332156</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="游戏" scheme="https://www.gsgundam.com/tags/%E6%B8%B8%E6%88%8F/"/>
    
    <category term="界面" scheme="https://www.gsgundam.com/tags/%E7%95%8C%E9%9D%A2/"/>
    
    <category term="FLASH" scheme="https://www.gsgundam.com/tags/FLASH/"/>
    
    <category term="actionscript" scheme="https://www.gsgundam.com/tags/actionscript/"/>
    
    <category term="colormatrixfilter" scheme="https://www.gsgundam.com/tags/colormatrixfilter/"/>
    
    <category term="justsudoku" scheme="https://www.gsgundam.com/tags/justsudoku/"/>
    
    <category term="数独" scheme="https://www.gsgundam.com/tags/%E6%95%B0%E7%8B%AC/"/>
    
    <category term="滤镜" scheme="https://www.gsgundam.com/tags/%E6%BB%A4%E9%95%9C/"/>
    
    <category term="纯粹" scheme="https://www.gsgundam.com/tags/%E7%BA%AF%E7%B2%B9/"/>
    
    <category term="颜色" scheme="https://www.gsgundam.com/tags/%E9%A2%9C%E8%89%B2/"/>
    
  </entry>
  
  <entry>
    <title>牛仔很忙</title>
    <link href="https://www.gsgundam.com/archive/2012-09-21-so-busy/"/>
    <id>https://www.gsgundam.com/archive/2012-09-21-so-busy/</id>
    <published>2012-09-21T08:12:04.000Z</published>
    <updated>2015-01-31T09:31:21.752Z</updated>
    
    <content type="html"><![CDATA[<p>哈，取了个俏皮的题目，舒缓一下小紧张到有点溃疡的情绪。</p><p>经过Fenix的辛勤劳作，《装甲纵队（Battle Array）》网络版的第一个版本终于问世了，小小宣传一下！至于我做了神马……当然是更新官网了！（<a href="http://www.dashgame.com/">http://www.dashgame.com</a>）</p><p>传送门：<a href="http://www.3366.com/flash/80693.shtml">http://www.3366.com/flash/80693.shtml</a></p><p>从Fenix那里又学到了很多AS技巧，比如在做移动版本的时候，如果是基于原版，那么很多方法可以用protected，让移动版本继承原版的方法。想到原来自己做的纯粹数独移动版是完全独立的一个项目，感觉好费劲。</p><p>这个新的博客主题是因为更新博客的时候上一版主题挂掉了……不过也好，不破不立嘛！现在是用的现成主题FLAT，感觉很清爽，不错。有空再自定义一下吧。</p><p>至于公司的游戏，也在稳步推进中。有很多很多很多很多问题，不过还是看得到曙光。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;哈，取了个俏皮的题目，舒缓一下小紧张到有点溃疡的情绪。&lt;/p&gt;
&lt;p&gt;经过Fenix的辛勤劳作，《装甲纵队（Battle Array）》网络版的第一个版本终于问世了，小小宣传一下！至于我做了神马……当然是更新官网了！（&lt;a href=&quot;http://www.dashgame</summary>
      
    
    
    
    <category term="项目开发" scheme="https://www.gsgundam.com/categories/%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="游戏" scheme="https://www.gsgundam.com/tags/%E6%B8%B8%E6%88%8F/"/>
    
    <category term="dash" scheme="https://www.gsgundam.com/tags/dash/"/>
    
    <category term="game" scheme="https://www.gsgundam.com/tags/game/"/>
    
    <category term="array" scheme="https://www.gsgundam.com/tags/array/"/>
    
    <category term="疾风" scheme="https://www.gsgundam.com/tags/%E7%96%BE%E9%A3%8E/"/>
    
    <category term="actionscript" scheme="https://www.gsgundam.com/tags/actionscript/"/>
    
    <category term="batttle" scheme="https://www.gsgundam.com/tags/batttle/"/>
    
    <category term="官网" scheme="https://www.gsgundam.com/tags/%E5%AE%98%E7%BD%91/"/>
    
    <category term="装甲纵队" scheme="https://www.gsgundam.com/tags/%E8%A3%85%E7%94%B2%E7%BA%B5%E9%98%9F/"/>
    
  </entry>
  
  <entry>
    <title>Visio中以像素为单位绘图的解决办法</title>
    <link href="https://www.gsgundam.com/archive/2012-08-29-visio-measure-in-pixels/"/>
    <id>https://www.gsgundam.com/archive/2012-08-29-visio-measure-in-pixels/</id>
    <published>2012-08-29T03:30:27.000Z</published>
    <updated>2015-01-31T11:30:50.425Z</updated>
    
    <content type="html"><![CDATA[<p>今天要用visio 2010来绘制比较精确的示意图，于是需要以像素为单位，但是。。。我从来都没发现过visio可以用像素作单位。于是上网搜了一下，发现有前辈发表了这篇博文（<a href="http://www.cnblogs.com/silentmj/archive/2010/03/09/1681677.html">http://www.cnblogs.com/silentmj/archive/2010/03/09/1681677.html</a>），很顺利的解决了。别被英文吓到，其实只要把文末的Visio file template下载下来就可以了，里面有一个转换好的元件。当然，也可以猛击<a href="http://complexdiagrams.com/docs/pixel_rulers.zip">这里下载</a>。</p><p>最近的工作需要在VISIO2003中绘制仪表的界面效果图，拿到前辈们画的文件，发现都不是以像素为单位的。为了方便，想设置成以像素为单位，自己折腾一番，未果。还好GOOGLE没有让我失望，下面就是一个不错的解决办法：</p><p>来自：<a href="http://complexdiagrams.com/2008/06/01/pixel-rulers-in-visio/">http://complexdiagrams.com/2008/06/01/pixel-rulers-in-visio/</a></p><p><strong><a href="http://complexdiagrams.com/2008/06/01/pixel-rulers-in-visio/">Pixel rulers in Visio</a></strong></p><p>Should you be required to work in Visio, you may well find yourself, as I did, wishing to measure your drawing in pixels. I couldn’t figure out how do do it, though Visio does support such diverse measurements as Ciceros and Didots.</p><p>I finally found the definitive answer from Microsoft: For some types of drawings, you may want to change the measurement units to pixels. However, a pixel isn’t a unit of measurement. A pixel is just a dot on a screen and the size of the dot varies for different screens. To simulate pixels, set the measurement units to points.</p><p>Needless to say, this is not satisfying. It’s true a pixel is only an on-screen measure, and is clearly only useful for a few, obscure situations, such as when creating interface mockups, wireframes, or prototypes for software, the web, or any other sort of images meant to be viewed on a screen.</p><p>Luckily, Visio provides a set of features that allow a fairly simple, two step work-around. <strong>Warning:</strong> doing this on existing Visio documents may severely distort your existing drawings. I suggest working on duplicate files, not originals.</p><p><strong>Step One</strong> Open the File &gt; Page Setup menu and select the Page Properties tab. In the Measurement units field select Picas. </p><p><img src="http://images.cnblogs.com/cnblogs_com/silentmj/WindowsLiveWriter/Visi2003_CC9C/clip_image002_thumb.gif" alt="&quot;clip_image002&quot;"></p><p><strong>Step Two</strong> In the same dialog box, select the Drawing Scale tab. Select the Custom Scale radio button and set the ratio to 1 p &#x3D; 16 p.</p><p><img src="http://images.cnblogs.com/cnblogs_com/silentmj/WindowsLiveWriter/Visi2003_CC9C/clip_image004_thumb.gif" alt="&quot;clip_image004&quot;"></p><p>That’s it. Click OK and you’re all set to go.</p><p><strong>Why it works</strong> Picas are 6 to the inch. By setting the ratio at 1:16, Visio presents a diagram at 96 picas per inch, the same as the Windows standard of 96 pixels per inch. You could set an appropriate ratio with any of the available units, but it works well with picas, and I find it useful that all units are labeled as p.</p><p><a href="http://complexdiagrams.com/docs/pixel_rulers.zip">Here is a Visio file template</a> with the units set properly.</p><p>连Ciceros and Didots这样奇怪单位都有的VISIO2003居然不能方便的以像素，诶。。。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天要用visio 2010来绘制比较精确的示意图，于是需要以像素为单位，但是。。。我从来都没发现过visio可以用像素作单位。于是上网搜了一下，发现有前辈发表了这篇博文（&lt;a href=&quot;http://www.cnblogs.com/silentmj/archive/20</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="设计" scheme="https://www.gsgundam.com/tags/%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="pixel" scheme="https://www.gsgundam.com/tags/pixel/"/>
    
    <category term="template" scheme="https://www.gsgundam.com/tags/template/"/>
    
    <category term="visio" scheme="https://www.gsgundam.com/tags/visio/"/>
    
    <category term="像素" scheme="https://www.gsgundam.com/tags/%E5%83%8F%E7%B4%A0/"/>
    
    <category term="示意图" scheme="https://www.gsgundam.com/tags/%E7%A4%BA%E6%84%8F%E5%9B%BE/"/>
    
  </entry>
  
  <entry>
    <title>家中教学-用photoshop制作简单的水下场景</title>
    <link href="https://www.gsgundam.com/archive/2012-08-29-create-underwater-scene-by-photoshop/"/>
    <id>https://www.gsgundam.com/archive/2012-08-29-create-underwater-scene-by-photoshop/</id>
    <published>2012-08-28T18:24:44.000Z</published>
    <updated>2018-11-07T05:06:21.590Z</updated>
    
    <content type="html"><![CDATA[<p>昨天阿宝想做一个PS效果，但是碰到了一些小问题。我尝试着做了一下，解决了阿宝的部分问题。</p><p>这个教程的原文在<a href="http://abduzeedo.com/">Abduzeedo官网</a>上《Simple Underwater Scene in Photoshop》：<a href="http://abduzeedo.com/simple-underwater-scene-photoshop">http://abduzeedo.com/simple-underwater-scene-photoshop</a>，我就不一一翻译了，用google的网页翻译已经足以看懂。</p><p>我做出来的效果是这样的：</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/bubble.jpg" alt="水下效果"></p><p>大致总结了一下，有以下一些要点。尤其是教程中没有提到的，或者容易被遗漏的：</p><p>1、在第3步修改绿色的遮罩的时候，一定要注意周围边缘，透明度要压低，可以降低第4步时进行修饰的繁琐程度。</p><p>2、第6步的深蓝色需要好好修饰，尽量过度自然。不用拘泥于教程的方式。</p><p>3、第9步的泡泡千万记得要对画笔进行设置，不是简单的点上去就有很好的效果，起码【形状动态】和【散布】这两个选项是一定要调整的，因为需要不同的大小、密度和旋转角度。即便是设置了，也尽量多进行尝试，做设计得有耐心。</p><p>4、第11步中，一定记得，【斜面和浮雕】中的高光模式和投影模式应该设置成一样的，都得用白色，才有晶莹剔透的感觉。另外，根据自己字体的不同，尤其是大小和笔画宽度，应当自己调节一下，保证笔画中间可以透出背景颜色，边缘也有玻璃感觉。</p><p>5、第15步中，调整色阶的时候，要把黑白对比度拉开，才能看到水纹的效果，否则你将看到一片浮云。</p><p>6、第18步用到的素材还可以用在顶部，以还原原图效果。</p><p>PSD文件可以在这里下载：<a href="http://imgs.abduzeedo.com/files/tutorials/Simple_Underwater_Scene_in_Photoshop/Sample.psd.zip">http://imgs.abduzeedo.com/files/tutorials/Simple_Underwater_Scene_in_Photoshop&#x2F;Sample.psd.zip</a>。出于空间容量的原因，我就不贴自己的PSD了……</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;昨天阿宝想做一个PS效果，但是碰到了一些小问题。我尝试着做了一下，解决了阿宝的部分问题。&lt;/p&gt;
&lt;p&gt;这个教程的原文在&lt;a href=&quot;http://abduzeedo.com/&quot;&gt;Abduzeedo官网&lt;/a&gt;上《Simple Underwater Scene in P</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="设计" scheme="https://www.gsgundam.com/tags/%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="adbuzeedo" scheme="https://www.gsgundam.com/tags/adbuzeedo/"/>
    
    <category term="design" scheme="https://www.gsgundam.com/tags/design/"/>
    
    <category term="photoshop" scheme="https://www.gsgundam.com/tags/photoshop/"/>
    
    <category term="ps" scheme="https://www.gsgundam.com/tags/ps/"/>
    
    <category term="psd" scheme="https://www.gsgundam.com/tags/psd/"/>
    
    <category term="场景" scheme="https://www.gsgundam.com/tags/%E5%9C%BA%E6%99%AF/"/>
    
    <category term="水下" scheme="https://www.gsgundam.com/tags/%E6%B0%B4%E4%B8%8B/"/>
    
  </entry>
  
  <entry>
    <title>有点小郁闷</title>
    <link href="https://www.gsgundam.com/archive/2012-08-22-little-depressed/"/>
    <id>https://www.gsgundam.com/archive/2012-08-22-little-depressed/</id>
    <published>2012-08-22T08:06:24.000Z</published>
    <updated>2015-01-31T11:30:50.398Z</updated>
    
    <content type="html"><![CDATA[<p>今天心情比较低落，受各方面的影响吧。</p><p>不过首先有件值得庆贺的事情，昨天终于处理好所有问题，疾风(<a href="http://www.dashgame.com/">http://www.dashgame.com</a>)的新游戏《Battle Array》（中文名《装甲纵队》）终于正式上线了。因为一些问题，只发布了麻球和3366平台，贴个地址吧。这是Fenix的独立游戏，我只负责web版本的发布、平台接入和运营工作。以后还会不断更新，另外还有iOS版本，敬请期待 :)</p><p>版本发布并不算顺利，因为代码结构与之前不一样，在接入两个平台的时候都发生了意想不到的情况，折腾了2天。这是让我比较心烦的。</p><p>另外一个麻烦是关于网站设计，JS还是太不熟，操作网页元件出了各种问题，很是麻烦，至今未解决。</p><p>生活当中还有点小麻烦……不过跟前两个比起来都还好了。<br>还是告诉自己，总会好的 :)</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天心情比较低落，受各方面的影响吧。&lt;/p&gt;
&lt;p&gt;不过首先有件值得庆贺的事情，昨天终于处理好所有问题，疾风(&lt;a href=&quot;http://www.dashgame.com/&quot;&gt;http://www.dashgame.com&lt;/a&gt;)的新游戏《Battle Array》（</summary>
      
    
    
    
    <category term="各种想法" scheme="https://www.gsgundam.com/categories/%E5%90%84%E7%A7%8D%E6%83%B3%E6%B3%95/"/>
    
    
    <category term="游戏" scheme="https://www.gsgundam.com/tags/%E6%B8%B8%E6%88%8F/"/>
    
    <category term="jQuery" scheme="https://www.gsgundam.com/tags/jQuery/"/>
    
    <category term="dash" scheme="https://www.gsgundam.com/tags/dash/"/>
    
    <category term="game" scheme="https://www.gsgundam.com/tags/game/"/>
    
    <category term="3366" scheme="https://www.gsgundam.com/tags/3366/"/>
    
    <category term="array" scheme="https://www.gsgundam.com/tags/array/"/>
    
    <category term="battle" scheme="https://www.gsgundam.com/tags/battle/"/>
    
    <category term="fenix" scheme="https://www.gsgundam.com/tags/fenix/"/>
    
    <category term="js" scheme="https://www.gsgundam.com/tags/js/"/>
    
    <category term="mochi" scheme="https://www.gsgundam.com/tags/mochi/"/>
    
    <category term="疾风" scheme="https://www.gsgundam.com/tags/%E7%96%BE%E9%A3%8E/"/>
    
    <category term="纵队" scheme="https://www.gsgundam.com/tags/%E7%BA%B5%E9%98%9F/"/>
    
    <category term="装甲" scheme="https://www.gsgundam.com/tags/%E8%A3%85%E7%94%B2/"/>
    
    <category term="麻球" scheme="https://www.gsgundam.com/tags/%E9%BA%BB%E7%90%83/"/>
    
  </entry>
  
  <entry>
    <title>几年前的涂鸦</title>
    <link href="https://www.gsgundam.com/archive/2012-08-11-some-graffiti-years-ago/"/>
    <id>https://www.gsgundam.com/archive/2012-08-11-some-graffiti-years-ago/</id>
    <published>2012-08-11T03:59:17.000Z</published>
    <updated>2022-11-27T20:37:29.858Z</updated>
    
    <content type="html"><![CDATA[<p>最近photobucket不太稳定，于是开始寻找稳定的外链相册，比较了半天，觉得只要不挂，还是flickr好。结果呢，居然翻出来以前在flickr存的图，以为都不见了来着。但是，最后的最后，还是用了poco……</p><p>整理一下，贴在这里吧。应该都是2008年左右的东西了。</p><p>·首先是可能第一次厚涂最成功的了，战锤40k里的Necron族代表。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/WH40k%20Necron.jpg" alt="战锤40k"></p><p>·接着是国漫风自画像….</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/self.jpg" alt="&quot;国漫风自画像&quot;"></p><p>·再来是自己原来给自己设计的漫画形象</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/comic-self.jpg" alt="&quot;漫画形象&quot;"></p><p>·613室长同学08年生日的时候给她涂的，涂得很随便……</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/jia-birthday.jpg" alt="&quot;室长生日涂鸦&quot;"></p><p>·王国之心凯莉的涂鸦练习</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/kairi.jpg" alt="&quot;王国之心凯莉&quot;"></p><p>·根据61式战车II型画的，当年似乎很流行娘化军械…</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/61-tank-MM.jpg" alt="&quot;61式战车MM&quot;"></p><p>·曾经应邀设计的一台机体….完成稿要更好看一些……可惜已经没了</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/robot-design.jpg" alt="&quot;机体原画&quot;"></p><p>·在宏信做星球计划，还梦想着做原画的时代，给游戏设计的机体。受铁骑影响过重了。只是加了个变形。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/transform-1.jpg" alt="&quot;变形机体&quot;"></p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/transform-2.jpg" alt="&quot;变形机体-变形&quot;"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近photobucket不太稳定，于是开始寻找稳定的外链相册，比较了半天，觉得只要不挂，还是flickr好。结果呢，居然翻出来以前在flickr存的图，以为都不见了来着。但是，最后的最后，还是用了poco……&lt;/p&gt;
&lt;p&gt;整理一下，贴在这里吧。应该都是2008年左右的东</summary>
      
    
    
    
    <category term="随笔涂鸦" scheme="https://www.gsgundam.com/categories/%E9%9A%8F%E7%AC%94%E6%B6%82%E9%B8%A6/"/>
    
    
    <category term="杂文" scheme="https://www.gsgundam.com/tags/%E6%9D%82%E6%96%87/"/>
    
    <category term="涂鸦" scheme="https://www.gsgundam.com/tags/%E6%B6%82%E9%B8%A6/"/>
    
    <category term="设计" scheme="https://www.gsgundam.com/tags/%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="photobucket" scheme="https://www.gsgundam.com/tags/photobucket/"/>
    
    <category term="2008" scheme="https://www.gsgundam.com/tags/2008/"/>
    
    <category term="40k" scheme="https://www.gsgundam.com/tags/40k/"/>
    
    <category term="61式" scheme="https://www.gsgundam.com/tags/61%E5%BC%8F/"/>
    
    <category term="flickr" scheme="https://www.gsgundam.com/tags/flickr/"/>
    
    <category term="gundam" scheme="https://www.gsgundam.com/tags/gundam/"/>
    
    <category term="hammer" scheme="https://www.gsgundam.com/tags/hammer/"/>
    
    <category term="necron" scheme="https://www.gsgundam.com/tags/necron/"/>
    
    <category term="poco" scheme="https://www.gsgundam.com/tags/poco/"/>
    
    <category term="POP" scheme="https://www.gsgundam.com/tags/POP/"/>
    
    <category term="war" scheme="https://www.gsgundam.com/tags/war/"/>
    
    <category term="凯莉" scheme="https://www.gsgundam.com/tags/%E5%87%AF%E8%8E%89/"/>
    
    <category term="厚涂" scheme="https://www.gsgundam.com/tags/%E5%8E%9A%E6%B6%82/"/>
    
    <category term="原画" scheme="https://www.gsgundam.com/tags/%E5%8E%9F%E7%94%BB/"/>
    
    <category term="国漫" scheme="https://www.gsgundam.com/tags/%E5%9B%BD%E6%BC%AB/"/>
    
    <category term="娘化" scheme="https://www.gsgundam.com/tags/%E5%A8%98%E5%8C%96/"/>
    
    <category term="宏信" scheme="https://www.gsgundam.com/tags/%E5%AE%8F%E4%BF%A1/"/>
    
    <category term="室长" scheme="https://www.gsgundam.com/tags/%E5%AE%A4%E9%95%BF/"/>
    
    <category term="形象" scheme="https://www.gsgundam.com/tags/%E5%BD%A2%E8%B1%A1/"/>
    
    <category term="战车" scheme="https://www.gsgundam.com/tags/%E6%88%98%E8%BD%A6/"/>
    
    <category term="战锤" scheme="https://www.gsgundam.com/tags/%E6%88%98%E9%94%A4/"/>
    
    <category term="星球计划" scheme="https://www.gsgundam.com/tags/%E6%98%9F%E7%90%83%E8%AE%A1%E5%88%92/"/>
    
    <category term="机体" scheme="https://www.gsgundam.com/tags/%E6%9C%BA%E4%BD%93/"/>
    
    <category term="机甲悍将" scheme="https://www.gsgundam.com/tags/%E6%9C%BA%E7%94%B2%E6%82%8D%E5%B0%86/"/>
    
    <category term="漫画" scheme="https://www.gsgundam.com/tags/%E6%BC%AB%E7%94%BB/"/>
    
    <category term="王国之心" scheme="https://www.gsgundam.com/tags/%E7%8E%8B%E5%9B%BD%E4%B9%8B%E5%BF%83/"/>
    
    <category term="生日" scheme="https://www.gsgundam.com/tags/%E7%94%9F%E6%97%A5/"/>
    
    <category term="自画像" scheme="https://www.gsgundam.com/tags/%E8%87%AA%E7%94%BB%E5%83%8F/"/>
    
    <category term="铁骑" scheme="https://www.gsgundam.com/tags/%E9%93%81%E9%AA%91/"/>
    
    <category term="高达" scheme="https://www.gsgundam.com/tags/%E9%AB%98%E8%BE%BE/"/>
    
  </entry>
  
  <entry>
    <title>原来的涂鸦</title>
    <link href="https://www.gsgundam.com/archive/2012-08-08-graffiti/"/>
    <id>https://www.gsgundam.com/archive/2012-08-08-graffiti/</id>
    <published>2012-08-07T21:41:40.000Z</published>
    <updated>2018-11-07T04:59:28.390Z</updated>
    
    <content type="html"><![CDATA[<p>无意在photobucket中翻到了一张以前的涂鸦，按说应该都不见了才对，很久都没画过什么了。</p><p>应该是在趣游的时候，某天中午休息时，在渔场的涂鸦板鼠绘的。挺烂，哈哈，帽子像钢板做的。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/qingwazi.jpg" alt="&quot;青蛙子&quot;"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;无意在photobucket中翻到了一张以前的涂鸦，按说应该都不见了才对，很久都没画过什么了。&lt;/p&gt;
&lt;p&gt;应该是在趣游的时候，某天中午休息时，在渔场的涂鸦板鼠绘的。挺烂，哈哈，帽子像钢板做的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252</summary>
      
    
    
    
    <category term="随笔涂鸦" scheme="https://www.gsgundam.com/categories/%E9%9A%8F%E7%AC%94%E6%B6%82%E9%B8%A6/"/>
    
    
    <category term="涂鸦" scheme="https://www.gsgundam.com/tags/%E6%B6%82%E9%B8%A6/"/>
    
    <category term="photobucket" scheme="https://www.gsgundam.com/tags/photobucket/"/>
    
    <category term="东方" scheme="https://www.gsgundam.com/tags/%E4%B8%9C%E6%96%B9/"/>
    
    <category term="渔场" scheme="https://www.gsgundam.com/tags/%E6%B8%94%E5%9C%BA/"/>
    
    <category term="趣游" scheme="https://www.gsgundam.com/tags/%E8%B6%A3%E6%B8%B8/"/>
    
    <category term="青蛙" scheme="https://www.gsgundam.com/tags/%E9%9D%92%E8%9B%99/"/>
    
    <category term="鼠绘" scheme="https://www.gsgundam.com/tags/%E9%BC%A0%E7%BB%98/"/>
    
  </entry>
  
  <entry>
    <title>终于修复了U盘</title>
    <link href="https://www.gsgundam.com/archive/2012-08-05-usb-storage-fixed/"/>
    <id>https://www.gsgundam.com/archive/2012-08-05-usb-storage-fixed/</id>
    <published>2012-08-04T19:00:56.000Z</published>
    <updated>2015-01-31T11:30:50.371Z</updated>
    
    <content type="html"><![CDATA[<p>家宝的U盘已经靠“写保护”傲娇了2个月了，期间曾经尝试过量产修复，但是都以失败告终。</p><p>今天实在忍无可忍，在易讯上看好了一个U盘，加入购物车，下决心在半个小时内无法解决就再买一个。</p><p>于是乎在百度文库搜到一篇通过量产修复的详文，找到了对应的量产程序，居然就修复了。果然，对自己要狠一点才行。</p><p>分享一下经验吧。</p><p>1.太平洋网上下了一个chipgenius-v4 b23工具(<a href="http://dl.pconline.com.cn/html_2/1/60/id=50720&pn=0&linkPage=1.html">http://dl.pconline.com.cn/html_2&#x2F;1&#x2F;60&#x2F;id&#x3D;50720&amp;pn&#x3D;0&amp;linkPage&#x3D;1.html</a>)，找到U盘的主控芯片信息如下：<br>设备描述: [K:]USB 大容量存储设备(USB FLASH DRIVE)<br>设备类型:　　大容量存储设备<br>协议版本: USB 2.00<br>当前速度: 高速(HighSpeed)<br>电力消耗: 200mA<br>USB设备ID: VID &#x3D; 1005 PID &#x3D; B113<br>设备序列号: 198A16521C6C<br>设备名称: USB FLASH DRIVE<br>设备修订版: 0110<br>产品型号: USB FLASH DRIVE<br>产品修订版: PMAP<br>芯片厂商: Phison(群联)<br>芯片型号: PS2251-32(PS2232) - F&#x2F;W 01.05.10 [2008-01-26]<br>闪存识别码:2CD5943E - Micron(美光) [MLC-4K]</p><p>2.根据芯片的型号  PS2251-32(PS2232) 下载量产工具进行低格。我在优盘之家(<a href="http://www.upan.cc)上下的这个:群联低格工具">http://www.upan.cc)上下的这个:群联低格工具</a> Formatter 2.9.0.6(PS2232,PS2251-32)(<a href="http://www.upan.cc/tools/repair/2011/Formatter_2.9.0.6_PS2232.html">http://www.upan.cc/tools/repair/2011/Formatter_2.9.0.6_PS2232.html</a>)。保证U盘插好，双击Formatter2.9.0.6(PS2232).exe，确定。不到30秒，格式化完毕。重新检测，一切如初。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;家宝的U盘已经靠“写保护”傲娇了2个月了，期间曾经尝试过量产修复，但是都以失败告终。&lt;/p&gt;
&lt;p&gt;今天实在忍无可忍，在易讯上看好了一个U盘，加入购物车，下决心在半个小时内无法解决就再买一个。&lt;/p&gt;
&lt;p&gt;于是乎在百度文库搜到一篇通过量产修复的详文，找到了对应的量产程序，</summary>
      
    
    
    
    <category term="实用窍门" scheme="https://www.gsgundam.com/categories/%E5%AE%9E%E7%94%A8%E7%AA%8D%E9%97%A8/"/>
    
    
    <category term="修复" scheme="https://www.gsgundam.com/tags/%E4%BF%AE%E5%A4%8D/"/>
    
    <category term="检测" scheme="https://www.gsgundam.com/tags/%E6%A3%80%E6%B5%8B/"/>
    
    <category term="DRIVE" scheme="https://www.gsgundam.com/tags/DRIVE/"/>
    
    <category term="FLASH" scheme="https://www.gsgundam.com/tags/FLASH/"/>
    
    <category term="Phison" scheme="https://www.gsgundam.com/tags/Phison/"/>
    
    <category term="PS2232" scheme="https://www.gsgundam.com/tags/PS2232/"/>
    
    <category term="PS2251-32" scheme="https://www.gsgundam.com/tags/PS2251-32/"/>
    
    <category term="USB" scheme="https://www.gsgundam.com/tags/USB/"/>
    
    <category term="U盘" scheme="https://www.gsgundam.com/tags/U%E7%9B%98/"/>
    
    <category term="优盘" scheme="https://www.gsgundam.com/tags/%E4%BC%98%E7%9B%98/"/>
    
    <category term="低格" scheme="https://www.gsgundam.com/tags/%E4%BD%8E%E6%A0%BC/"/>
    
    <category term="型号" scheme="https://www.gsgundam.com/tags/%E5%9E%8B%E5%8F%B7/"/>
    
    <category term="经验" scheme="https://www.gsgundam.com/tags/%E7%BB%8F%E9%AA%8C/"/>
    
    <category term="群联" scheme="https://www.gsgundam.com/tags/%E7%BE%A4%E8%81%94/"/>
    
    <category term="芯片" scheme="https://www.gsgundam.com/tags/%E8%8A%AF%E7%89%87/"/>
    
    <category term="量产" scheme="https://www.gsgundam.com/tags/%E9%87%8F%E4%BA%A7/"/>
    
  </entry>
  
  <entry>
    <title>最近的杂记</title>
    <link href="https://www.gsgundam.com/archive/2012-08-04-essay/"/>
    <id>https://www.gsgundam.com/archive/2012-08-04-essay/</id>
    <published>2012-08-04T08:33:16.000Z</published>
    <updated>2018-11-07T04:58:32.446Z</updated>
    
    <content type="html"><![CDATA[<p>为公司的游戏做了一套界面，勉强认可了，哈哈。第一次正经做界面，问题多多。之前一直认为有些游戏的界面控制不好亮度与对比度，结果界面挺漂亮，但是不耐看。这次自己设计的时候也犯同样的问题了。</p><p>PS的矢量图形上，功力还是不足，不过美术方面本来也没打算朝这方面发展。Flash矢量和像素图才是我工具上的方向。</p><p>Fenix已经出了新游戏的Demo版了，感觉还不错，他的美术功底也越来越了得了。只是由于种种限制，不得不取消了很多之前的设计，可能玩法上会显得有点落俗了。但是总体感觉还是不错的。截图预告一个，哈哈。</p><p>图片托管站木有啦~</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;为公司的游戏做了一套界面，勉强认可了，哈哈。第一次正经做界面，问题多多。之前一直认为有些游戏的界面控制不好亮度与对比度，结果界面挺漂亮，但是不耐看。这次自己设计的时候也犯同样的问题了。&lt;/p&gt;
&lt;p&gt;PS的矢量图形上，功力还是不足，不过美术方面本来也没打算朝这方面发展。Fl</summary>
      
    
    
    
    <category term="各种想法" scheme="https://www.gsgundam.com/categories/%E5%90%84%E7%A7%8D%E6%83%B3%E6%B3%95/"/>
    
    
    <category term="游戏" scheme="https://www.gsgundam.com/tags/%E6%B8%B8%E6%88%8F/"/>
    
    <category term="杂文" scheme="https://www.gsgundam.com/tags/%E6%9D%82%E6%96%87/"/>
    
    <category term="dash" scheme="https://www.gsgundam.com/tags/dash/"/>
    
    <category term="极风游" scheme="https://www.gsgundam.com/tags/%E6%9E%81%E9%A3%8E%E6%B8%B8/"/>
    
    <category term="极风游戏" scheme="https://www.gsgundam.com/tags/%E6%9E%81%E9%A3%8E%E6%B8%B8%E6%88%8F/"/>
    
    <category term="demo" scheme="https://www.gsgundam.com/tags/demo/"/>
    
    <category term="截图" scheme="https://www.gsgundam.com/tags/%E6%88%AA%E5%9B%BE/"/>
    
    <category term="界面" scheme="https://www.gsgundam.com/tags/%E7%95%8C%E9%9D%A2/"/>
    
    <category term="设计" scheme="https://www.gsgundam.com/tags/%E8%AE%BE%E8%AE%A1/"/>
    
  </entry>
  
  <entry>
    <title>极风游戏主页又更新啦！</title>
    <link href="https://www.gsgundam.com/archive/2012-07-29-dashgame-site-updated/"/>
    <id>https://www.gsgundam.com/archive/2012-07-29-dashgame-site-updated/</id>
    <published>2012-07-29T13:02:27.000Z</published>
    <updated>2018-11-07T05:04:04.944Z</updated>
    
    <content type="html"><![CDATA[<p>刚刚更新完疾风游戏主页 <a href="http://www.dashgame.com/">http://www.dashgame.com</a>。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/oldsite.png"></p><p>加了一些jQuery控制缓动效果，毕竟是初学者，代码写得很啰嗦，不过效果应该还算凑合。</p><p>IE6和IE8的效果没有专门调试，有点问题。不过现在都神马时代了，还在用IE6的童鞋们还是醒醒吧！</p><p>Fenix正在奋笔疾书新游戏中，8月20日，监督！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;刚刚更新完疾风游戏主页 &lt;a href=&quot;http://www.dashgame.com/&quot;&gt;http://www.dashgame.com&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.</summary>
      
    
    
    
    <category term="项目开发" scheme="https://www.gsgundam.com/categories/%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="jQuery" scheme="https://www.gsgundam.com/tags/jQuery/"/>
    
    <category term="极风游戏" scheme="https://www.gsgundam.com/tags/%E6%9E%81%E9%A3%8E%E6%B8%B8%E6%88%8F/"/>
    
    <category term="设计" scheme="https://www.gsgundam.com/tags/%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="dashgame" scheme="https://www.gsgundam.com/tags/dashgame/"/>
    
    <category term="网页" scheme="https://www.gsgundam.com/tags/%E7%BD%91%E9%A1%B5/"/>
    
  </entry>
  
  <entry>
    <title>发布一个新游戏 – UFO Story</title>
    <link href="https://www.gsgundam.com/archive/2012-07-04-new-game-ufo-story/"/>
    <id>https://www.gsgundam.com/archive/2012-07-04-new-game-ufo-story/</id>
    <published>2012-07-04T13:02:27.000Z</published>
    <updated>2022-11-28T05:37:22.562Z</updated>
    
    <content type="html"><![CDATA[<p>花了几天零碎时间给极风游的新主页 <a href="http://dashgame.com/">http://dashgame.com</a> 做了一个小游戏，随便起了个名字叫《UFO Story》。（麻球已去，这里放上3366版本，大家支持下……）</p><p>传送门：<a href="http://www.3366.com/flash/90949.shtml">http://www.3366.com/flash/90949.shtml</a></p><p>游戏是受到一个html5小游戏的启发。移动鼠标来控制自己的UFO，躲开敌人的UFO，吃掉能量方块。小创新是，吃掉能量方块到一定分数，可以激活子弹时间，减缓敌人移动速度5秒。吃掉普通蓝色方块得10分，吃掉带D字的绿色方块得20分。</p><p>做这个游戏还是又学习了一些新东西。之前一直没做过像素级碰撞检测，刚开始边学边摸索的自己写了个类，结果超过15个敌人就开始卡了。下载了别人写好的一个高效像素级碰撞检测类，发现用起来效率相当不错，1000HE小本上都是40个敌人才开始卡。内存控制方面还不熟悉，很多实现的思路都没太考虑到实际运行情况。不废话了，分享这个类。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br></pre></td><td class="code"><pre><span class="line">package</span><br><span class="line"></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">//像素级精确碰撞算法优化</span></span><br><span class="line">    <span class="comment">//代码：Aone</span></span><br><span class="line">    <span class="comment">//2009-10-30</span></span><br><span class="line">    <span class="keyword">import</span> flash.<span class="property">display</span>.<span class="property">BitmapData</span>;</span><br><span class="line">    <span class="keyword">import</span> flash.<span class="property">display</span>.<span class="property">BlendMode</span>;</span><br><span class="line">    <span class="keyword">import</span> flash.<span class="property">display</span>.<span class="property">DisplayObject</span>;</span><br><span class="line">    <span class="keyword">import</span> flash.<span class="property">geom</span>.<span class="property">ColorTransform</span>;</span><br><span class="line">    <span class="keyword">import</span> flash.<span class="property">geom</span>.<span class="property">Matrix</span>;</span><br><span class="line">    <span class="keyword">import</span> flash.<span class="property">geom</span>.<span class="property">Point</span>;</span><br><span class="line">    <span class="keyword">import</span> flash.<span class="property">geom</span>.<span class="property">Rectangle</span>;</span><br><span class="line"></span><br><span class="line">    public <span class="keyword">class</span> <span class="title class_">PixHitTestH</span></span><br><span class="line"></span><br><span class="line">    &#123;</span><br><span class="line"></span><br><span class="line">        private <span class="keyword">var</span> <span class="attr">tileSize</span>:int = <span class="number">20</span></span><br><span class="line"></span><br><span class="line">        public <span class="keyword">function</span> <span class="title function_">PixHitTestH</span>(<span class="params"></span>):<span class="keyword">void</span></span><br><span class="line">        &#123;</span><br><span class="line"></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        public <span class="keyword">function</span> <span class="title function_">checkObject</span>(<span class="params">target1:DisplayObject, target2:DisplayObject</span>):<span class="title class_">Boolean</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="comment">//横向缩小到tileSize尺寸需要的倍数，也就是期望检测的时候缩小到的尺寸。</span></span><br><span class="line">            <span class="keyword">var</span> <span class="attr">scaleX</span>:<span class="title class_">Number</span> = (target1.<span class="property">width</span> &lt; target2.<span class="property">width</span> ? target1.<span class="property">width</span> : target2.<span class="property">width</span>) / tileSize</span><br><span class="line">            <span class="comment">//纵向缩小到tileSize尺寸需要的倍</span></span><br><span class="line">            <span class="keyword">var</span> <span class="attr">scaleY</span>:<span class="title class_">Number</span> = (target1.<span class="property">height</span> &lt; target2.<span class="property">height</span> ? target1.<span class="property">height</span> : target2.<span class="property">height</span>) / tileSize</span><br><span class="line">            <span class="comment">//</span></span><br><span class="line">            <span class="comment">//如果倍数小于1则按原始倍率也就是原始尺寸</span></span><br><span class="line">            scaleX = scaleX &lt; <span class="number">1</span> ? <span class="number">1</span> : scaleX</span><br><span class="line">            scaleY = scaleY &lt; <span class="number">1</span> ? <span class="number">1</span> : scaleY</span><br><span class="line">            <span class="comment">//draw用point</span></span><br><span class="line">            <span class="keyword">var</span> <span class="attr">pt</span>:<span class="title class_">Point</span> = <span class="keyword">new</span> <span class="title class_">Point</span>()</span><br><span class="line">            <span class="comment">//做2次draw时使用的颜色</span></span><br><span class="line">            <span class="keyword">var</span> <span class="attr">ct</span>:<span class="title class_">ColorTransform</span> = <span class="keyword">new</span> <span class="title class_">ColorTransform</span>()</span><br><span class="line">            ct.<span class="property">color</span> = <span class="number">0xFF00000F</span></span><br><span class="line">            <span class="comment">//原始尺寸下的重叠矩形</span></span><br><span class="line">            <span class="keyword">var</span> <span class="attr">oldHitRectangle</span>:<span class="title class_">Rectangle</span> = <span class="title function_">intersectionRectangle</span>(target1, target2)</span><br><span class="line">            <span class="comment">//用于存放缩放的重叠矩形</span></span><br><span class="line">            <span class="keyword">var</span> <span class="attr">hitRectangle</span>:<span class="title class_">Rectangle</span> = <span class="keyword">new</span> <span class="title class_">Rectangle</span>()</span><br><span class="line">            <span class="keyword">return</span> <span class="title function_">complexIntersectionRectangle</span>(target1, target2, scaleX, scaleY, pt, ct, oldHitRectangle, hitRectangle, tileSize, tileSize).<span class="property">width</span> != <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        private <span class="keyword">function</span> <span class="title function_">intersectionRectangle</span>(<span class="params">target1:DisplayObject, target2:DisplayObject</span>):<span class="title class_">Rectangle</span></span><br><span class="line"></span><br><span class="line">        &#123;</span><br><span class="line"></span><br><span class="line">            <span class="comment">// If either of the items don&#x27;t have a reference to stage, then they are not in a display list</span></span><br><span class="line"></span><br><span class="line">            <span class="comment">// or if a simple hitTestObject is false, they cannot be intersecting.</span></span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (!target1.<span class="property">root</span> || !target2.<span class="property">root</span> || !target1.<span class="title function_">hitTestObject</span>(target2))</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Rectangle</span>();</span><br><span class="line"></span><br><span class="line">            <span class="comment">// Get the bounds of each DisplayObject.</span></span><br><span class="line"></span><br><span class="line">            <span class="keyword">var</span> <span class="attr">bounds1</span>:<span class="title class_">Rectangle</span> = target1.<span class="title function_">getBounds</span>(target1.<span class="property">root</span>);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">var</span> <span class="attr">bounds2</span>:<span class="title class_">Rectangle</span> = target2.<span class="title function_">getBounds</span>(target2.<span class="property">root</span>);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// Determine test area boundaries.</span></span><br><span class="line"></span><br><span class="line">            <span class="keyword">var</span> <span class="attr">intersection</span>:<span class="title class_">Rectangle</span> = <span class="keyword">new</span> <span class="title class_">Rectangle</span>();</span><br><span class="line"></span><br><span class="line">            intersection.<span class="property">x</span> = <span class="title class_">Math</span>.<span class="title function_">max</span>(bounds1.<span class="property">x</span>, bounds2.<span class="property">x</span>);</span><br><span class="line"></span><br><span class="line">            intersection.<span class="property">y</span> = <span class="title class_">Math</span>.<span class="title function_">max</span>(bounds1.<span class="property">y</span>, bounds2.<span class="property">y</span>);</span><br><span class="line"></span><br><span class="line">            intersection.<span class="property">width</span> = <span class="title class_">Math</span>.<span class="title function_">min</span>((bounds1.<span class="property">x</span> + bounds1.<span class="property">width</span>) - intersection.<span class="property">x</span>, (bounds2.<span class="property">x</span> + bounds2.<span class="property">width</span>) - intersection.<span class="property">x</span>);</span><br><span class="line"></span><br><span class="line">            intersection.<span class="property">height</span> = <span class="title class_">Math</span>.<span class="title function_">min</span>((bounds1.<span class="property">y</span> + bounds1.<span class="property">height</span>) - intersection.<span class="property">y</span>, (bounds2.<span class="property">y</span> + bounds2.<span class="property">height</span>) - intersection.<span class="property">y</span>);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">return</span> intersection;</span><br><span class="line"></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        private <span class="keyword">function</span> <span class="title function_">complexIntersectionRectangle</span>(<span class="params">target1:DisplayObject, target2:DisplayObject, scaleX:<span class="built_in">Number</span>, scaleY:<span class="built_in">Number</span>, pt:Point, ct:ColorTransform, oldhitRectangle:Rectangle, hitRectangle:Rectangle, nowW:int, nowH:int</span>):<span class="title class_">Rectangle</span></span><br><span class="line"></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (!target1.<span class="title function_">hitTestObject</span>(target2))</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Rectangle</span>();</span><br><span class="line">            <span class="comment">//根据纵横的缩小倍数来计算缩小的重叠矩形尺寸</span></span><br><span class="line">            hitRectangle.<span class="property">x</span> = oldhitRectangle.<span class="property">x</span></span><br><span class="line">            hitRectangle.<span class="property">y</span> = oldhitRectangle.<span class="property">y</span></span><br><span class="line">            hitRectangle.<span class="property">width</span> = oldhitRectangle.<span class="property">width</span> / scaleX</span><br><span class="line">            hitRectangle.<span class="property">height</span> = oldhitRectangle.<span class="property">height</span> / scaleY</span><br><span class="line">            <span class="comment">//建立一个用来draw的临时BitmapData对象，尺寸为期望宽nowW,期望高nowH</span></span><br><span class="line">            <span class="keyword">var</span> <span class="attr">bitmapData</span>:<span class="title class_">BitmapData</span> = <span class="keyword">new</span> <span class="title class_">BitmapData</span>(nowW, nowH, <span class="literal">true</span>, <span class="number">0</span>);</span><br><span class="line">            <span class="comment">//绘制对象1其缩放比例和位移量由getDrawMatrix（）函数计算，并且把不透明处绘制为ct的颜色</span></span><br><span class="line">            bitmapData.<span class="title function_">draw</span>(target1, <span class="title function_">getDrawMatrix</span>(target1, hitRectangle, scaleX, scaleY), ct);</span><br><span class="line">            <span class="comment">//当纵横缩小比例不为1的时候把任何有色像素重新替换成ct的颜色0xFF00000F，原因为缩小的对象在进行纯色绘制的时候会有半透明像素产生，如果不加以重新替换会影响后面对象2的滤镜效果。</span></span><br><span class="line">            <span class="keyword">if</span> (scaleX != <span class="number">1</span> &amp;&amp; scaleY != <span class="number">1</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                bitmapData.<span class="title function_">threshold</span>(bitmapData, bitmapData.<span class="property">rect</span>, pt, \<span class="string">&quot;&gt;\&quot;, 0, 0xFF00000F)</span></span><br><span class="line"><span class="string">            &#125;</span></span><br><span class="line"><span class="string">            //绘制对象2其缩放比例和位移量由getDrawMatrix（）函数计算，并且把不透明处绘制为ct的颜色，并且模式为叠加。如此一来两个对象重叠的部分颜色值必定大于0xFF00000F。</span></span><br><span class="line"><span class="string">            bitmapData.draw(target2, getDrawMatrix(target2, hitRectangle, scaleX, scaleY), ct, BlendMode.ADD);</span></span><br><span class="line"><span class="string">            //把所有颜色值大于0xFF00000F的部分（也就是重叠部分）重新替换为不透明红色方便后面getColorBoundsRect()方法计算尺寸。这里替换的原因是getColorBoundsRect()不支持范围取色而只支持单色计算。</span></span><br><span class="line"><span class="string">            //对象1缩放后可以重新替换掉透明色，但是对象2则无法使用同一方法，但是对象2由于也是经过缩放绘制也会有半透明像素，那么重叠部分虽然全部大于0xFF00000F，但未必是统一的。</span></span><br><span class="line"><span class="string">            var hits:int = bitmapData.threshold(bitmapData, bitmapData.rect, pt, \&quot;&gt;\&quot;, 0xFF00000F, 0xFFFF0000)</span></span><br><span class="line"><span class="string">            //判断红色区域尺寸</span></span><br><span class="line"><span class="string">            var intersection:Rectangle = bitmapData.getColorBoundsRect(0xFFFFFFFF, 0xFFFF0000);</span></span><br><span class="line"><span class="string">            //      </span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">            bitmapData = null</span></span><br><span class="line"><span class="string">            //如果红色区域宽度不为0，即bitmapData中含有红色像素。此时说明对象1和对象2在此次判定中有重叠有碰撞</span></span><br><span class="line"><span class="string">            if (intersection.width != 0)</span></span><br><span class="line"><span class="string">            &#123;</span></span><br><span class="line"><span class="string">                //如果纵横缩放比例有任意一个不是原始尺寸</span></span><br><span class="line"><span class="string">                if (scaleX &gt; 1 || scaleY &gt; 1)</span></span><br><span class="line"><span class="string">                &#123;</span></span><br><span class="line"><span class="string">                    //并且红色像素的数量比较少，对象1和对象2的碰撞面积比较小的话</span></span><br><span class="line"><span class="string">                    if (hits &lt;= (scaleX + scaleY) * 1.5)</span></span><br><span class="line"><span class="string">                    &#123;</span></span><br><span class="line"><span class="string">                        //由于bitmapData的宽高坐标都是以整数表示，那么经过缩放后取整的区域势必回又可能在取整的时候把真正可能产生碰撞的区域忽略。</span></span><br><span class="line"><span class="string">                        //所以要进行下一次检测时候适当的把检测区域扩大xadd和yadd就是这个扩大的系数</span></span><br><span class="line"><span class="string">                        var xadd:int = .5</span></span><br><span class="line"><span class="string">                        var yadd:int = .5</span></span><br><span class="line"><span class="string">                        //下次检测时候bitmapData的期望大小</span></span><br><span class="line"><span class="string">                        var nextW:int = tileSize</span></span><br><span class="line"><span class="string">                        var nextH:int = tileSize</span></span><br><span class="line"><span class="string">                        //如果此次判定发现碰撞区域和bitmapData尺寸相同，那么在计算下次需要判断区域时候会和此次的区域相同，那么判断结果可能会和此次结果相同。这样则会引起堆栈上溢的情况，为了避免该情况发生，将缩小判断的尺寸扩大一倍进行再次检测。</span></span><br><span class="line"><span class="string">                        if (intersection.width != nowW)</span></span><br><span class="line"><span class="string">                        &#123;</span></span><br><span class="line"><span class="string">                            nextW = tileSize</span></span><br><span class="line"><span class="string">                        &#125;</span></span><br><span class="line"><span class="string">                        else</span></span><br><span class="line"><span class="string">                        &#123;</span></span><br><span class="line"><span class="string">                            nextW = nowW * 2</span></span><br><span class="line"><span class="string">                        &#125;</span></span><br><span class="line"><span class="string">                        if (intersection.height != nowH)</span></span><br><span class="line"><span class="string">                        &#123;</span></span><br><span class="line"><span class="string">                            nextH = tileSize</span></span><br><span class="line"><span class="string">                        &#125;</span></span><br><span class="line"><span class="string">                        else</span></span><br><span class="line"><span class="string">                        &#123;</span></span><br><span class="line"><span class="string">                            nextH = nowH * 2</span></span><br><span class="line"><span class="string">                        &#125;</span></span><br><span class="line"><span class="string">                        //根据检测出来的缩的碰撞区域来计算未缩小的碰撞区域大小以方便下一次计算的时候缩小检测范围。</span></span><br><span class="line"><span class="string">                        oldhitRectangle.x += (intersection.x - xadd) * scaleX</span></span><br><span class="line"><span class="string">                        oldhitRectangle.y += (intersection.y - yadd) * scaleY</span></span><br><span class="line"><span class="string">                        oldhitRectangle.width = (intersection.width + xadd * 2) * scaleX</span></span><br><span class="line"><span class="string">                        oldhitRectangle.height = (intersection.height + yadd * 2) * scaleY</span></span><br><span class="line"><span class="string">                        //根据检测期望缩小到的尺寸重新计算缩小倍率</span></span><br><span class="line"><span class="string">                        scaleX = (oldhitRectangle.width / nextW)</span></span><br><span class="line"><span class="string">                        scaleY = (oldhitRectangle.height / nextH)</span></span><br><span class="line"><span class="string">                        //如果倍率小于2则直接按原始尺寸</span></span><br><span class="line"><span class="string">                        scaleX = scaleX &lt; 2 ? 1 : scaleX</span></span><br><span class="line"><span class="string">                        scaleY = scaleY &lt; 2 ? 1 : scaleY</span></span><br><span class="line"><span class="string">                        //进行下一次判定</span></span><br><span class="line"><span class="string">                        intersection = complexIntersectionRectangle(target1, target2, scaleX, scaleY, pt, ct, oldhitRectangle, hitRectangle, nextW, nextH)</span></span><br><span class="line"><span class="string">                    &#125;</span></span><br><span class="line"><span class="string">                &#125;</span></span><br><span class="line"><span class="string">            &#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">            return intersection;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        private function getDrawMatrix(target:DisplayObject, hitRectangle:Rectangle, scaleX:Number, scaleY:Number):Matrix</span></span><br><span class="line"><span class="string">        &#123;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">            var localToGlobal:Point;</span></span><br><span class="line"><span class="string">            var matrix:Matrix;</span></span><br><span class="line"><span class="string">            var rootConcatenatedMatrix:Matrix = target.root.transform.concatenatedMatrix;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">            localToGlobal = target.localToGlobal(new Point());</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">            matrix = target.transform.concatenatedMatrix;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">            matrix.tx = (localToGlobal.x - hitRectangle.x) / scaleX;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">            matrix.ty = (localToGlobal.y - hitRectangle.y) / scaleY;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">            matrix.a = matrix.a / rootConcatenatedMatrix.a / scaleX;</span></span><br><span class="line"><span class="string">            matrix.d = matrix.d / rootConcatenatedMatrix.d / scaleY;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">            return matrix;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    &#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&#125;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;花了几天零碎时间给极风游的新主页 &lt;a href=&quot;http://dashgame.com/&quot;&gt;http://dashgame.com&lt;/a&gt; 做了一个小游戏，随便起了个名字叫《UFO Story》。（麻球已去，这里放上3366版本，大家支持下……）&lt;/p&gt;
&lt;p&gt;传送门：</summary>
      
    
    
    
    <category term="项目开发" scheme="https://www.gsgundam.com/categories/%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="dash" scheme="https://www.gsgundam.com/tags/dash/"/>
    
    <category term="game" scheme="https://www.gsgundam.com/tags/game/"/>
    
    <category term="极风游" scheme="https://www.gsgundam.com/tags/%E6%9E%81%E9%A3%8E%E6%B8%B8/"/>
    
    <category term="极风游戏" scheme="https://www.gsgundam.com/tags/%E6%9E%81%E9%A3%8E%E6%B8%B8%E6%88%8F/"/>
    
    <category term="action" scheme="https://www.gsgundam.com/tags/action/"/>
    
    <category term="script" scheme="https://www.gsgundam.com/tags/script/"/>
    
    <category term="ufo" scheme="https://www.gsgundam.com/tags/ufo/"/>
    
    <category term="检测" scheme="https://www.gsgundam.com/tags/%E6%A3%80%E6%B5%8B/"/>
    
    <category term="碰撞" scheme="https://www.gsgundam.com/tags/%E7%A2%B0%E6%92%9E/"/>
    
    <category term="高效" scheme="https://www.gsgundam.com/tags/%E9%AB%98%E6%95%88/"/>
    
  </entry>
  
  <entry>
    <title>涂鸦20120413</title>
    <link href="https://www.gsgundam.com/archive/2012-04-13-graffiti/"/>
    <id>https://www.gsgundam.com/archive/2012-04-13-graffiti/</id>
    <published>2012-04-13T13:02:27.000Z</published>
    <updated>2018-11-07T04:55:08.608Z</updated>
    
    <content type="html"><![CDATA[<p>没想到小本里还保存了一份这个涂鸦，有时间在这次的游戏中画出来。不过这次画不出来也要发布，毕竟就是个练手的游戏。</p><p><img src="https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture/work/Pilot-Mercury.jpg"></p><p>特别兴奋，筹备了3年的计划终于要开始了，疾风游戏要开始正式运转了！就是现在，拼这一回，永远都不后悔。</p><p>想赢，不怕输。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;没想到小本里还保存了一份这个涂鸦，有时间在这次的游戏中画出来。不过这次画不出来也要发布，毕竟就是个练手的游戏。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gsgundam-1252106130.cos.ap-shanghai.myqcloud.com/picture</summary>
      
    
    
    
    <category term="随笔涂鸦" scheme="https://www.gsgundam.com/categories/%E9%9A%8F%E7%AC%94%E6%B6%82%E9%B8%A6/"/>
    
    
    <category term="游戏" scheme="https://www.gsgundam.com/tags/%E6%B8%B8%E6%88%8F/"/>
    
    <category term="dash" scheme="https://www.gsgundam.com/tags/dash/"/>
    
    <category term="game" scheme="https://www.gsgundam.com/tags/game/"/>
    
    <category term="涂鸦" scheme="https://www.gsgundam.com/tags/%E6%B6%82%E9%B8%A6/"/>
    
    <category term="极风游" scheme="https://www.gsgundam.com/tags/%E6%9E%81%E9%A3%8E%E6%B8%B8/"/>
    
    <category term="极风游戏" scheme="https://www.gsgundam.com/tags/%E6%9E%81%E9%A3%8E%E6%B8%B8%E6%88%8F/"/>
    
  </entry>
  
  <entry>
    <title>杂文20120409</title>
    <link href="https://www.gsgundam.com/archive/2012-04-09-essay/"/>
    <id>https://www.gsgundam.com/archive/2012-04-09-essay/</id>
    <published>2012-04-09T13:02:27.000Z</published>
    <updated>2015-01-31T01:47:29.281Z</updated>
    
    <content type="html"><![CDATA[<p>最近各种事情发生在身边，自己有不少的想法，也感到了很多外力的干预。</p><p>改版自WeisaySimple的Pure主题还有很多不完善的地方，尤其是IE8以下的兼容性问题。虽然各种事情很多，但是也在抽时间尝试修复，希望能有更好的东西展现在大家面前。</p><p>游戏进度很尴尬的暂停了，由于一些毫不相干的原因。挺可笑的，完全是我自己没有规划好一切，没准备备用方案。</p><p>帝都就是帝都，大家都在这里忙着实现自己的梦想，目标更加明确，行为更加纯粹。而这些天发现，雾都终究不是帝都，充满了抱怨、妒忌、懒散，曾经觉得全世界只有这里最美好、最天堂，现在变成了磨练意志和考验综合能力的地方。更深入的了解一切，更巧妙的应对一切，更熟练的掌握一切，我还有很多要学习的。</p><p>并不知道现在的这些行为和决定对以后有多少实际的用处，但是在自己目前的世界观和价值观体系下，我试着努力走向自己的目标。成败已经不重要，坚持变得更加关键。希望自己能够更加成熟。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近各种事情发生在身边，自己有不少的想法，也感到了很多外力的干预。&lt;/p&gt;
&lt;p&gt;改版自WeisaySimple的Pure主题还有很多不完善的地方，尤其是IE8以下的兼容性问题。虽然各种事情很多，但是也在抽时间尝试修复，希望能有更好的东西展现在大家面前。&lt;/p&gt;
&lt;p&gt;游戏</summary>
      
    
    
    
    <category term="各种想法" scheme="https://www.gsgundam.com/categories/%E5%90%84%E7%A7%8D%E6%83%B3%E6%B3%95/"/>
    
    
    <category term="学习" scheme="https://www.gsgundam.com/tags/%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="blog" scheme="https://www.gsgundam.com/tags/blog/"/>
    
    <category term="weisay" scheme="https://www.gsgundam.com/tags/weisay/"/>
    
    <category term="pure" scheme="https://www.gsgundam.com/tags/pure/"/>
    
    <category term="主题" scheme="https://www.gsgundam.com/tags/%E4%B8%BB%E9%A2%98/"/>
    
    <category term="帝都" scheme="https://www.gsgundam.com/tags/%E5%B8%9D%E9%83%BD/"/>
    
    <category term="成熟" scheme="https://www.gsgundam.com/tags/%E6%88%90%E7%86%9F/"/>
    
    <category term="杂文" scheme="https://www.gsgundam.com/tags/%E6%9D%82%E6%96%87/"/>
    
    <category term="雾都" scheme="https://www.gsgundam.com/tags/%E9%9B%BE%E9%83%BD/"/>
    
  </entry>
  
  <entry>
    <title>jQuery实现回到顶部 图片渐隐 Fancybox 效果</title>
    <link href="https://www.gsgundam.com/archive/2012-04-05-jquery-totop-picture-fade-fancybox/"/>
    <id>https://www.gsgundam.com/archive/2012-04-05-jquery-totop-picture-fade-fancybox/</id>
    <published>2012-04-05T13:02:27.000Z</published>
    <updated>2022-11-28T05:36:11.854Z</updated>
    
    <content type="html"><![CDATA[<p>很幸运的保存了一篇blogbus时代的博文。</p><p>前两天为了修复疾风博客中的两个bug，由于jQuery特效都不是原创的，所以看了一下jQuery。把bug fix掉了，也顺道学了些效果。尝试了一下，之前不知道为什么js都没添加成功，但是这次没问题了，大致记录下。(碰到没有引入jQuery库的，在单独使用时要自行引入)</p><p>#1.回到顶部 转到底部</p><p>老生常谈的东西了，记下几个关键点：</p><p>1.css中 <code>#回到顶部ID&#123;position:fixed&#125;</code> 不能少，否则位置无法固定；</p><p>2.jQuery中要直接实现转到底部，只要 <code>$(’html,body’)</code> 来获取页面高度就可以了。如果是要转到某一个对象，那就替换成该对象ID或类名，也可以很方便的实现。</p><p>那么贴上我自己的jQuery部分的代码吧</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_ invoke__">jQuery</span>(document).<span class="title function_ invoke__">ready</span>(function($)&#123;</span><br><span class="line">$(<span class="string">&#x27;#go-top&#x27;</span>).<span class="title function_ invoke__">click</span>(function()&#123;$(<span class="string">&#x27;html,body&#x27;</span>).<span class="title function_ invoke__">animate</span>(&#123;<span class="attr">scrollTop</span>: <span class="string">&#x27;0px&#x27;</span>&#125;, <span class="number">800</span>);&#125;);</span><br><span class="line">$(<span class="string">&#x27;#fall&#x27;</span>).<span class="title function_ invoke__">click</span>(function()&#123;$(<span class="string">&#x27;html,body&#x27;</span>).<span class="title function_ invoke__">animate</span>(&#123;<span class="attr">scrollTop</span>:$(<span class="string">&#x27;#footer&#x27;</span>).<span class="title function_ invoke__">offset</span>().top&#125;, <span class="number">800</span>);&#125;);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>另外也贴上一个个人觉得很不错的代码，带 FadeIn 和 FadeOut 效果。（原文地址：<a href="http://my.oss.org.cn/space.php?uid=5499&do=blog&id=87655">http://my.oss.org.cn/space.php?uid=5499&amp;do=blog&amp;id=87655</a> ）</p><p>CSS部分：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#back-top</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: fixed;</span><br><span class="line">    <span class="attribute">bottom</span>: <span class="number">30px</span>;</span><br><span class="line">    <span class="attribute">margin-left</span>: -<span class="number">150px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#back-top</span> <span class="selector-tag">a</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">108px</span>;</span><br><span class="line">    <span class="attribute">display</span>: block;</span><br><span class="line">    <span class="attribute">text-align</span>: center;</span><br><span class="line">    <span class="attribute">font</span>: <span class="number">11px</span>/<span class="number">100%</span> Arial, Helvetica, sans-serif;</span><br><span class="line">    <span class="attribute">text-transform</span>: uppercase;</span><br><span class="line">    <span class="attribute">text-decoration</span>: none;</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#bbb</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* transition */</span></span><br><span class="line">    -webkit-<span class="attribute">transition</span>: <span class="number">1s</span>;</span><br><span class="line">    -moz-<span class="attribute">transition</span>: <span class="number">1s</span>;</span><br><span class="line">    <span class="attribute">transition</span>: <span class="number">1s</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#back-top</span> <span class="selector-tag">a</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#000</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* arrow icon (span tag) */</span></span><br><span class="line"><span class="selector-id">#back-top</span> <span class="selector-tag">span</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">108px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">108px</span>;</span><br><span class="line">    <span class="attribute">display</span>: block;</span><br><span class="line">    <span class="attribute">margin-bottom</span>: <span class="number">7px</span>;</span><br><span class="line">    <span class="attribute">background</span>: <span class="number">#ddd</span> <span class="built_in">url</span>(<span class="string">up-arrow.png</span>) no-repeat center center;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* rounded corners */</span></span><br><span class="line">    -webkit-<span class="attribute">border-radius</span>: <span class="number">15px</span>;</span><br><span class="line">    -moz-<span class="attribute">border-radius</span>: <span class="number">15px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">15px</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* transition */</span></span><br><span class="line">    -webkit-<span class="attribute">transition</span>: <span class="number">1s</span>;</span><br><span class="line">    -moz-<span class="attribute">transition</span>: <span class="number">1s</span>;</span><br><span class="line">    <span class="attribute">transition</span>: <span class="number">1s</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#back-top</span> <span class="selector-tag">a</span><span class="selector-pseudo">:hover</span> <span class="selector-tag">span</span> &#123;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="number">#777</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>jQuery部分：</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">&lt;script type=<span class="string">&quot;text/javascript&quot;</span> src=<span class="string">&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js&quot;</span>&gt;&lt;/script&gt;</span><br><span class="line"></span><br><span class="line">&lt;script&gt;</span><br><span class="line">$(document).<span class="title function_ invoke__">ready</span>(function()&#123;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// hide #back-top first</span></span><br><span class="line">    $(<span class="string">&quot;#back-top&quot;</span>).<span class="title function_ invoke__">hide</span>();</span><br><span class="line"></span><br><span class="line">    <span class="comment">// fade in #back-top</span></span><br><span class="line">    $(<span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">        $(window).<span class="title function_ invoke__">scroll</span>(function () &#123;</span><br><span class="line">            <span class="keyword">if</span> ($(this).<span class="title function_ invoke__">scrollTop</span>() &gt; <span class="number">100</span>) &#123;</span><br><span class="line">                $(<span class="string">&#x27;#back-top&#x27;</span>).<span class="title function_ invoke__">fadeIn</span>();</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                $(<span class="string">&#x27;#back-top&#x27;</span>).<span class="title function_ invoke__">fadeOut</span>();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// scroll body to 0px on click</span></span><br><span class="line">        $(<span class="string">&#x27;#back-top a&#x27;</span>).<span class="title function_ invoke__">click</span>(function () &#123;</span><br><span class="line">            $(<span class="string">&#x27;body,html&#x27;</span>).<span class="title function_ invoke__">animate</span>(&#123;</span><br><span class="line">                <span class="attr">scrollTop</span>: <span class="number">0</span></span><br><span class="line">            &#125;, <span class="number">800</span>);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;);</span><br><span class="line"></span><br><span class="line">&#125;);</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure><p>HTML部分：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">p</span> <span class="attr">id</span>=<span class="string">&quot;back-top&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;#top&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">span</span>&gt;</span><span class="tag">&lt;/<span class="name">span</span>&gt;</span>Back to Top<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span>&gt;</span></span><br></pre></td></tr></table></figure><p>#2.图片渐隐 图片渐现</p><p>几个要点：</p><p>1.图片显示的方式，是在css中使用background而不是直接在html中使用<code>&lt;img /&gt;</code>，否则难以实现图片替换；</p><p>2.<code>&lt;span class=\”hover\”&gt;&lt;/span&gt;</code>要嵌入在<code>&lt;a&gt;&lt;/a&gt;</code>标签中；</p><p>3.用jQuery来控制span.hover的透明度。</p><p>CSS部分：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#header</span> <span class="selector-class">.nav</span> <span class="selector-class">.sns</span>&#123;</span><br><span class="line">    <span class="attribute">float</span><span class="selector-pseudo">:right</span>;</span><br><span class="line">    <span class="attribute">margin</span>:-<span class="number">10px</span> -<span class="number">20px</span> <span class="number">0</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#header</span> <span class="selector-class">.nav</span> <span class="selector-class">.sns</span> <span class="selector-tag">a</span><span class="selector-id">#rss</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">url</span>(<span class="string">http://weisay.googlecode.com/files/rss.gif</span>) no-repeat scroll center top transparent;</span><br><span class="line">    <span class="attribute">float</span><span class="selector-pseudo">:right</span>;</span><br><span class="line">    <span class="attribute">display</span>:block;</span><br><span class="line">    <span class="attribute">cursor</span>:pointer;</span><br><span class="line">    <span class="attribute">background-position</span>:<span class="number">0</span> <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">height</span>:<span class="number">28px</span>;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">28px</span>;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">20px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.sns</span> <span class="selector-tag">a</span><span class="selector-id">#rss</span> <span class="selector-tag">span</span><span class="selector-class">.hover</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">url</span>(<span class="string">http://weisay.googlecode.com/files/rss.gif</span>) no-repeat scroll center top transparent;</span><br><span class="line">    <span class="attribute">float</span><span class="selector-pseudo">:right</span>;</span><br><span class="line">    <span class="attribute">display</span>:block;</span><br><span class="line">    <span class="attribute">cursor</span>:pointer;</span><br><span class="line">    <span class="attribute">background-position</span>:<span class="number">0</span> -<span class="number">28px</span>;</span><br><span class="line">    <span class="attribute">height</span>:<span class="number">28px</span>;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">28px</span>;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">20px</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>jQuery部分：</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">&lt;script type=<span class="string">&quot;text/javascript&quot;</span>&gt;</span><br><span class="line"><span class="title function_ invoke__">jQuery</span>(document).<span class="title function_ invoke__">ready</span>(function(jQuery)&#123;    <span class="title function_ invoke__">jQuery</span>(<span class="string">&#x27;.sns&#x27;</span>).<span class="title function_ invoke__">wrapInner</span>(<span class="string">&#x27;&lt;span class=&quot;hover&quot;&gt;&lt;/span&gt;&#x27;</span>).<span class="title function_ invoke__">css</span>(<span class="string">&#x27;textIndent&#x27;</span>,<span class="string">&#x27;0&#x27;</span>).<span class="title function_ invoke__">each</span>(function () &#123;</span><br><span class="line">        <span class="title function_ invoke__">jQuery</span>(<span class="string">&#x27;span.hover&#x27;</span>).<span class="title function_ invoke__">css</span>(<span class="string">&#x27;opacity&#x27;</span>, <span class="number">0</span>).<span class="title function_ invoke__">hover</span>(function () &#123;</span><br><span class="line">            <span class="title function_ invoke__">jQuery</span>(this).<span class="title function_ invoke__">stop</span>().<span class="title function_ invoke__">fadeTo</span>(<span class="number">350</span>, <span class="number">1</span>);</span><br><span class="line">        &#125;, <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">            <span class="title function_ invoke__">jQuery</span>(this).<span class="title function_ invoke__">stop</span>().<span class="title function_ invoke__">fadeTo</span>(<span class="number">350</span>, <span class="number">0</span>);</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;);</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure><p>HTML部分：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;sns&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">a</span> <span class="attr">id</span>=<span class="string">&quot;rss&quot;</span> <span class="attr">href</span>=<span class="string">&quot;http://feed.feedsky.com/gsgundam&quot;</span> <span class="attr">title</span>=<span class="string">&quot;订阅我的博客&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">&quot;hover&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">span</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p>3.FancyBox</p><p>插件类的就再简单不过了，直接参照使用说明，有2个要注意的小点：</p><p>1.在初始化的时候最好使用一个单独的类来区别使用fancybox效果的图片，例如，$(\’.fancybox\’).fancybox()，以免出现一些不可预见的问题；</p><p>2.我是直接引用官方的jQuery文件，有时加载速度会比较慢，有条件还是放在本地比较好，也能保证稳定性。</p><p>jQuery部分：</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">&lt;!-- Add fancyBox --&gt;</span><br><span class="line">&lt;link rel=<span class="string">&quot;stylesheet&quot;</span> href=<span class="string">&quot;http://fancyapps.com/fancybox/source/jquery.fancybox.css?v=2.0.5&quot;</span> type=<span class="string">&quot;text/css&quot;</span> media=<span class="string">&quot;screen&quot;</span> /&gt;</span><br><span class="line">&lt;script type=<span class="string">&quot;text/javascript&quot;</span> src=<span class="string">&quot;http://fancyapps.com/fancybox/source/jquery.fancybox.pack.js?v=2.0.5&quot;</span>&gt;&lt;/script&gt;</span><br><span class="line">&lt;script type=<span class="string">&quot;text/javascript&quot;</span>&gt;</span><br><span class="line">    $(document).<span class="title function_ invoke__">ready</span>(function() &#123;</span><br><span class="line">        $(<span class="string">&#x27;.fancybox&#x27;</span>).<span class="title function_ invoke__">fancybox</span>();</span><br><span class="line">    &#125;);</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure><p>HTML部分：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">img</span> <span class="attr">class</span>=<span class="string">&quot;fancybox&quot;</span> <span class="attr">img</span>=<span class="string">&quot;yourimg&quot;</span> /&gt;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;很幸运的保存了一篇blogbus时代的博文。&lt;/p&gt;
&lt;p&gt;前两天为了修复疾风博客中的两个bug，由于jQuery特效都不是原创的，所以看了一下jQuery。把bug fix掉了，也顺道学了些效果。尝试了一下，之前不知道为什么js都没添加成功，但是这次没问题了，大致记录下。</summary>
      
    
    
    
    <category term="技术知识" scheme="https://www.gsgundam.com/categories/%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="fancybox" scheme="https://www.gsgundam.com/tags/fancybox/"/>
    
    <category term="blog" scheme="https://www.gsgundam.com/tags/blog/"/>
    
    <category term="jQuery" scheme="https://www.gsgundam.com/tags/jQuery/"/>
    
    <category term="回到顶部" scheme="https://www.gsgundam.com/tags/%E5%9B%9E%E5%88%B0%E9%A1%B6%E9%83%A8/"/>
    
    <category term="图片渐隐" scheme="https://www.gsgundam.com/tags/%E5%9B%BE%E7%89%87%E6%B8%90%E9%9A%90/"/>
    
  </entry>
  
  <entry>
    <title>只不过是从头再来</title>
    <link href="https://www.gsgundam.com/archive/2012-04-02-restart/"/>
    <id>https://www.gsgundam.com/archive/2012-04-02-restart/</id>
    <published>2012-04-02T13:02:27.000Z</published>
    <updated>2015-01-31T01:47:29.174Z</updated>
    
    <content type="html"><![CDATA[<p>托blogbus的福，号给封了。当然，连我自己都不知道我做错了什么，我只是自己做了个主题而已。</p><p>也好，正好网页设计班没有报wordpress部分，用了weisay的simple模板为底稿，还原了当初为blogbus做的一套风格。这次比原来节省了很多时间，一方面是熟练了，另外wordpress自身的优点也很重要。</p><p>针对原版，主要是增加了宽屏适应，修改了部分版面，进一步简化了侧边栏。FancyBox没用插件，毕竟使用不了那么多功能，就加载了一个JS就完了。以后这个风格还会继续完善，争取逐渐从weisay的模子中脱离出来。</p><p>凡事有弊有利，所有的博文都消失了。我得以重新审视自己的过去和现在有的知识。</p><p>继续进步，坚持不懈！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;托blogbus的福，号给封了。当然，连我自己都不知道我做错了什么，我只是自己做了个主题而已。&lt;/p&gt;
&lt;p&gt;也好，正好网页设计班没有报wordpress部分，用了weisay的simple模板为底稿，还原了当初为blogbus做的一套风格。这次比原来节省了很多时间，一方面</summary>
      
    
    
    
    <category term="各种想法" scheme="https://www.gsgundam.com/categories/%E5%90%84%E7%A7%8D%E6%83%B3%E6%B3%95/"/>
    
    
    <category term="wordpress" scheme="https://www.gsgundam.com/tags/wordpress/"/>
    
    <category term="fancybox" scheme="https://www.gsgundam.com/tags/fancybox/"/>
    
    <category term="blogbus" scheme="https://www.gsgundam.com/tags/blogbus/"/>
    
    <category term="weisay" scheme="https://www.gsgundam.com/tags/weisay/"/>
    
  </entry>
  
</feed>
