<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Test2044</title>
    <description>The blog of smartjinyu</description>
    <link>https://rgxy.github.io/</link>
    <atom:link href="https://rgxy.github.io/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Fri, 08 Sep 2017 13:14:29 +0000</pubDate>
    <lastBuildDate>Fri, 08 Sep 2017 13:14:29 +0000</lastBuildDate>
    <generator>Jekyll v3.5.2</generator>
    
      <item>
        <title>欢迎来到大金鱼的博客!</title>
        <description>&lt;p&gt;从几周前产生搭建一个博客的想法，购买域名，到现在搭出一个初步的框架，期间忙于应付各种考试、杂事，效率低得可怜。&lt;/p&gt;

&lt;p&gt;搭博客主要是为了记录一些学习计算机的体会和经验，以前图省事记在Evernote里，不仅不美观，也没有动力认真整理，最终留下一堆日后自己都看不懂的文字。有个博客，也许会有读者，也能激励自己认真梳理自己的想法，把笔记写得更有条理，如果能给他人提供些许的参考或是帮助，那自是再好不过。自由、开放、互助、共享是互联网的基本精神，能为他人的学习历程乃至计算机世界的发展尽一点绵薄之力，着实荣幸。&lt;/p&gt;

&lt;p&gt;你们现在见到的博客，是由Jekyll生成，托管在Github Pages上。网站的基本架构，是从Jekyll提供的基于Google Material Design Lite library的Material Design Lite模板修改而来，搭建过程中，参考了Github、Jekyll以及诸多前辈的教程与经验分享，在此一并表示感谢。将来有时间、有能力，我会把这个博客系统做得更好。&lt;/p&gt;

&lt;p&gt;搭建博客的过程中，学习了Git、Github的有关用法，了解了网站、域名的基础知识，也看得了些CSS、Javascipt的皮毛，解决了一些Windows下Ruby、Jekyll的奇怪问题，顺带复习了Markdown语法知识，深感自己才疏学浅，学习计算机的路才刚刚开始。&lt;/p&gt;

&lt;p&gt;在计算机的世界里，不分学历、年龄，也不注重你的学历，对于一个想要学习的人，互联网上有无穷无尽的资源，认真学习，认真思考，认真总结，虚心向前辈请教，总能有所进步。&lt;/p&gt;

&lt;p&gt;如果您想联系我，可以使用网页底部提供的&lt;a href=&quot;mailto:smartjinyu@gmail.com&quot;&gt;Email&lt;/a&gt;或&lt;a href=&quot;https://twitter.com/smartjinyu&quot;&gt;Twitter&lt;/a&gt;，如果您觉得本博客对您有所帮助，欢迎收藏本站或&lt;a href=&quot;http://smartjinyu.com/feed.xml&quot;&gt;使用RSS订阅&lt;/a&gt;。&lt;/p&gt;

</description>
        <pubDate>Fri, 08 Sep 2017 21:13:00 +0000</pubDate>
        <link>https://rgxy.github.io/others/2017/09/08/test.html</link>
        <guid isPermaLink="true">https://rgxy.github.io/others/2017/09/08/test.html</guid>
        
        
        <category>others</category>
        
      </item>
    
      <item>
        <title>识别厦门某校选课系统验证码的一个思路(Tesseract + TensorFlow)</title>
        <description>&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;

&lt;p&gt;曾经写过一个&lt;a href=&quot;https://smartjinyu.com/python/2016/09/15/XMU_BKXK.html&quot;&gt;脚本&lt;/a&gt;，在先到先得的选课阶段循环 Post 数据来抢课。这次选课想写个监控工具，某些课程一旦有人退课，立即自动补选该课程，为此需要识别&lt;a href=&quot;http://bkxk.xmu.edu.cn/xsxk/login.html&quot;&gt;选课系统&lt;/a&gt;的验证码，正好学了点 Machine Learning 的内容，权当半个 Course Project 吧。本项目基于 Python 3.5.4 编写。&lt;/p&gt;

&lt;h2 id=&quot;识别过程&quot;&gt;识别过程&lt;/h2&gt;

&lt;h3 id=&quot;需求分析&quot;&gt;需求分析&lt;/h3&gt;

&lt;p&gt;稍微分析了一下网站代码，似乎没有明显的漏洞可以绕过验证码，网站的验证码图片如下，主要的障碍在于两条干扰线，而每个字符的位置和扭曲程度都相对固定，无需太多处理。稍加验证可以发现，此网站的验证码只有数字023456789(没有数字1)，且均为黑白图片。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;\img\2017-08-18\sample1.jpg&quot; alt=&quot;sample1&quot; /&gt;
&lt;img src=&quot;\img\2017-08-18\sample2.jpg&quot; alt=&quot;sample2&quot; /&gt;
&lt;img src=&quot;\img\2017-08-18\sample3.jpg&quot; alt=&quot;sample3&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;图片预处理&quot;&gt;图片预处理&lt;/h3&gt;

&lt;p&gt;预处理阶段的主要任务是干掉那两条干扰线。由于干扰线和数字的粗细相仿，使用判断相邻像素的滤波法可能导致误判。个人采取的思路是求出两条干扰线的方程后消除干扰线，要注意在干扰线与数字的交叉处应当保留，否则会破坏数字的图形。求干扰线方程，可以用 Hough 变换来实现，在本例中，由于直线的起点和终点固定，直接在第一个 column 和倒数某个 column 遍历即确定端点。消除干扰线后即可轻松地把验证码分割为四张图片，每张一个数字。&lt;/p&gt;

&lt;p&gt;预处理后的效果如下(分割前)：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;\img\2017-08-18\sample1_pro.jpg&quot; alt=&quot;sample1_processed&quot; /&gt;
&lt;img src=&quot;\img\2017-08-18\sample2_pro.jpg&quot; alt=&quot;sample2_processed&quot; /&gt;
&lt;img src=&quot;\img\2017-08-18\sample3_pro.jpg&quot; alt=&quot;sample3_processed&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这部分的代码可以参见 &lt;a href=&quot;https://github.com/smartjinyu/xmuBKXK_captcha/blob/master/processImg.py&quot;&gt;processImg.py&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;使用-tesseract-获取标记数据&quot;&gt;使用 Tesseract 获取标记数据&lt;/h3&gt;

&lt;p&gt;把分割后的图片丢进 Tessoract，限定 whitelist 为 023456789，本以为验证码识别到这里就完成了，但是测试下来识别率只有 60.0% 左右，也就是单字符识别率 88.0%。虽然在实际应用时问题不大，但是本着探(zhe)索(teng)的精神，希望能通过 Machine Learning 的方法，把识别率提高到 95% 以上。&lt;/p&gt;

&lt;p&gt;虽然 Tesseract 的识别率堪忧，但是通过把识别结果 POST 到选课系统网站尝试登录，根据网站返回的结果，可以判断是否识别正确。利用这一点我们可以自动获取足够的 labeled data 供 ML 进行学习。我大概跑了两天，抓取了 27w 左右标记过的验证码，按照 4:1 的比例划分 training set 和 validation set 的话，每个字符能有 8w 以上的训练样本。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;\img\2017-08-18\tesseract_result.png&quot; alt=&quot;tesseract_result&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这部分代码可以参见 &lt;a href=&quot;https://github.com/smartjinyu/xmuBKXK_captcha/blob/master/downloadCaptchas.py&quot;&gt;downloadCaptchas.py&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;数据处理&quot;&gt;数据处理&lt;/h3&gt;

&lt;p&gt;在获取标记的验证码后，我们使用 &lt;a href=&quot;https://github.com/smartjinyu/xmuBKXK_captcha/blob/master/processImg.py&quot;&gt;processImg.py&lt;/a&gt; 将数据分割为单个字符，并分成 training set 和 validation set。请注意大量的小文件会占用巨大的磁盘空间，并且我建议在 SSD 上进行数据存储和处理以加快小文件的访问速度。然后使用 &lt;a href=&quot;https://github.com/smartjinyu/xmuBKXK_captcha/blob/master/build_tfrecords.py&quot;&gt;build_tfrecords.py&lt;/a&gt; 脚本，将数据转化为 TFRecords 文件，这是 TensorFlow 的标准数据文件格式。&lt;/p&gt;

&lt;h3 id=&quot;训练-tensorflow-模型&quot;&gt;训练 TensorFlow 模型&lt;/h3&gt;

&lt;p&gt;Machine Learning 的框架我选的是 TensorFlow，有 Google 爸爸这条大腿，文档齐全，社区活跃，将来少不了跟它打交道。这两天花了不少时间看官方文档和例程，弄懂了其基本的使用方法。在本例中，我们参考 MNIST 样例，使用前面准备好的 TFRecords 文件作为输入样本，因为 CNN (Convolutional Neural Network) 尚未学过，采用较为简单的 &lt;code class=&quot;highlighter-rouge&quot;&gt;softmax&lt;/code&gt; 函数作为 cost function，只要样本量充足，效果还是令人满意的。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;\img\2017-08-18\model_code.png&quot; alt=&quot;model_code&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在训练过程中，在 steps = 1000 之后，loss 趋向于 0，validation accuracy 基本固定在1.0。保存训练好的 model，登录选课系统进行实验，几次实验的识别率都在 99.9% 以上，速度也快于 Tesseract，单就识别效果而言令人相当满意。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;\img\2017-08-18\tensorflow_result.png&quot; alt=&quot;TensorFlow&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这部分训练模型的代码可以参见 &lt;a href=&quot;https://github.com/smartjinyu/xmuBKXK_captcha/blob/master/train_models.py&quot;&gt;train_models.py&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;开源项目&quot;&gt;开源项目&lt;/h2&gt;

&lt;p&gt;本项目遵循 Apache v2 License 开放全部源代码，你可以在我的 &lt;a href=&quot;https://github.com/smartjinyu/xmuBKXK_captcha&quot;&gt;GitHub Repository&lt;/a&gt; 获取代码，并按照 README 的步骤自行训练 model。如有任何建议或问题，请不吝提出 issues 或 PR。&lt;/p&gt;

&lt;p&gt;同时，GitHub Repository 里面已经包含一份我训练好的 model. You can use it out of box. 调用只需一条命令&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Import ocrCaptcha
result = ocrRawCaptcha(Image)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;效果如下
&lt;img src=&quot;\img\2017-08-18\sample_cmd.png&quot; alt=&quot;sample_cmd&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;参考资料&quot;&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://drops.wooyun.org/tips/141&quot;&gt;常见验证码的弱点与验证码识别 乌云知识库&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/tesseract-ocr/tesseract&quot;&gt;Tesseract 文档&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;TensorFlow &lt;a href=&quot;https://www.tensorflow.org/get_started/&quot;&gt;文档&lt;/a&gt;和&lt;a href=&quot;https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/&quot;&gt;示例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;后记&quot;&gt;后记&lt;/h2&gt;
&lt;p&gt;本项目完成后，实现前言中所说的自动捡漏工具已经没有技术难度，只是看过课表后，越发觉得厦门某校这些课程完全不值得我去写个工具抢。互联网上有许多更加优秀的学习资源，比如：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://see.stanford.edu/Course/CS229&quot;&gt;CS229 - Machine Learning by Andrew Ng, Stanford University&lt;/a&gt;  大名鼎鼎的 ML 入门课，相比 Coursera 上那门极简版，这门课有完整的数学推导。此课程是 ML 领域绝大多数课程的先修课程，目前大约刷完一半。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://cs231n.stanford.edu/&quot;&gt;CS231n - Convolutional Neural Networks for Visual Recognition by Fei-Fei Li, Stanford University&lt;/a&gt; 讲 CNN 在 Computer Vision 中的应用，也是一门经典课程。我应当会在完成 CS229 后开始此课程。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.coursera.org/learn/probabilistic-graphical-models&quot;&gt;Probabilistic Graphical Models, Coursera&lt;/a&gt; 据说是 Coursera 上最早的三门课程之一，讲概率图模型，ML 的重要理论基础，刚刚开坑。&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果有同学愿意一起刷这些课程，我将非常高兴。当然如有大佬实现了那个自动捡漏工具，也请发我一份咯。&lt;/p&gt;

</description>
        <pubDate>Fri, 18 Aug 2017 01:00:00 +0000</pubDate>
        <link>https://rgxy.github.io/machine/learning/2017/08/18/xmu_bkxk_captcha.html</link>
        <guid isPermaLink="true">https://rgxy.github.io/machine/learning/2017/08/18/xmu_bkxk_captcha.html</guid>
        
        
        <category>Machine</category>
        
        <category>Learning</category>
        
      </item>
    
      <item>
        <title>Bookshelf v1.3 更新 --开源的书籍管理应用</title>
        <description>&lt;p&gt;English Version &lt;a href=&quot;https://github.com/smartjinyu/MyBookshelf/blob/master/README.md&quot;&gt;Here&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;开发背景&quot;&gt;开发背景&lt;/h2&gt;

&lt;p&gt;从家里到学校，我的每一个书架上都堆满了各种杂书，需要寻找時却往往手忙脚乱乃至无迹可寻，常常发生购买相同书籍的事情，迫切需要一款应用来管理实体书籍。试过国内的几款应用后，发现都有恼人的社交功能，且无法关闭。个人以为自己的书单是一件相当隐私的事，不应该未经同意被拿出去被人四处评价，正好&lt;a href=&quot;https://smartjinyu.com/android/2016/10/25/Begin_to_learn_android_again.html&quot;&gt;初学 Android 开发&lt;/a&gt;，便利用寒假时间自己写了一款。&lt;/p&gt;

&lt;h2 id=&quot;应用介绍&quot;&gt;应用介绍&lt;/h2&gt;

&lt;p&gt;Bookshelf - 开源的实体书籍管理工具，您的电子书架&lt;/p&gt;

&lt;p&gt;本软件用于管理实体书籍，将书籍扫描添加到本应用中，即可记录书籍信息、笔记、阅读状态、标签等，完善的搜索功能，让您不再需要翻箱倒柜，不再错买同样的书籍，轻松管理多个实体书架。
本应用在 GPL v3 协议下开放全部源代码。&lt;/p&gt;

&lt;p&gt;爱范儿的推荐文章: &lt;a href=&quot;http://www.ifanr.com/app/798137&quot;&gt;http://www.ifanr.com/app/798137&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;特点：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Material Design 界面设计&lt;/li&gt;
  &lt;li&gt;没有多余的社交等功能，专为管理书籍而生&lt;/li&gt;
  &lt;li&gt;完全开源，无隐私忧虑&lt;/li&gt;
  &lt;li&gt;支持单个、批量、手动等多种模式添加书籍&lt;/li&gt;
  &lt;li&gt;支持自动从网络服务中获取书籍详情*&lt;/li&gt;
  &lt;li&gt;支持导出书单为 .csv 文件&lt;/li&gt;
  &lt;li&gt;完善的标签、书架系统&lt;/li&gt;
  &lt;li&gt;支持数据备份与还原&lt;/li&gt;
  &lt;li&gt;无广告&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*目前仅支持 Douban.com 和 OpenLibrary.org, 后续会加入更多网络服务支持&lt;/p&gt;

&lt;h2 id=&quot;更新日志&quot;&gt;更新日志&lt;/h2&gt;

&lt;h3 id=&quot;2017-03-11-v13-更新&quot;&gt;2017-03-11 v1.3 更新&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;支持 App shortcuts (7.1+)&lt;/li&gt;
  &lt;li&gt;支持导出为 .csv 文件&lt;/li&gt;
  &lt;li&gt;支持手动更换书籍封面&lt;/li&gt;
  &lt;li&gt;支持手动添加书籍&lt;/li&gt;
  &lt;li&gt;捐赠方式优化&lt;/li&gt;
  &lt;li&gt;新增使用条款&lt;/li&gt;
  &lt;li&gt;错误修正和性能提升&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;2017-02-19-v12-更新&quot;&gt;2017-02-19 v1.2 更新&lt;/h3&gt;
&lt;ol&gt;
  &lt;li&gt;支持 Android Auto Backup for Apps 特性 (6.0+)&lt;/li&gt;
  &lt;li&gt;新增 OpenLibrary.org 的 API&lt;/li&gt;
  &lt;li&gt;问题修正与性能提升&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;2017-02-18-v11-更新&quot;&gt;2017-02-18 v1.1 更新&lt;/h3&gt;
&lt;ol&gt;
  &lt;li&gt;新增“备份与还原”功能&lt;/li&gt;
  &lt;li&gt;问题修正与性能提升&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;2017-02-09-v10-发布&quot;&gt;2017-02-09 v1.0 发布&lt;/h3&gt;
&lt;p&gt;最初版本&lt;/p&gt;

&lt;h2 id=&quot;应用截图&quot;&gt;应用截图&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;\img\2017-02-09\1.png&quot; alt=&quot;Screenshot1&quot; /&gt;
&lt;img src=&quot;\img\2017-02-09\2.png&quot; alt=&quot;Screenshot2&quot; /&gt;
&lt;img src=&quot;\img\2017-02-09\3.png&quot; alt=&quot;Screenshot3&quot; /&gt;
&lt;img src=&quot;\img\2017-02-09\4.png&quot; alt=&quot;Screenshot4&quot; /&gt;
&lt;img src=&quot;\img\2017-02-09\5.png&quot; alt=&quot;Screenshot5&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;开源项目&quot;&gt;开源项目&lt;/h2&gt;

&lt;p&gt;本应用在 GPL v3 协议下开放全部源代码，您可以从&lt;a href=&quot;https://github.com/smartjinyu/MyBookshelf&quot;&gt;我的 Github Repository&lt;/a&gt;获取代码。&lt;/p&gt;

&lt;h2 id=&quot;应用下载&quot;&gt;应用下载&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.smartjinyu.mybookshelf&quot;&gt;Google Play&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://coolapk.com/apk/com.smartjinyu.mybookshelf&quot;&gt;酷安&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Thu, 09 Feb 2017 01:00:00 +0000</pubDate>
        <link>https://rgxy.github.io/android/2017/02/09/mybookshelf.html</link>
        <guid isPermaLink="true">https://rgxy.github.io/android/2017/02/09/mybookshelf.html</guid>
        
        
        <category>Android</category>
        
      </item>
    
      <item>
        <title>厦门大学教务系统出分情况监测脚本</title>
        <description>&lt;h2 id=&quot;背景介绍&quot;&gt;背景介绍&lt;/h2&gt;

&lt;p&gt;敝校的教务系统喜欢挤牙膏式地一门一门发布成绩，发布后也没有邮件通知，学渣如我得整天提心吊胆有事没事打开教务系统网页刷新一下，看看有没有哪门科目需要 see u next year。上次写过一个&lt;a href=&quot;https://smartjinyu.com/python/2016/09/09/XMU_GPA_Calc.html&quot;&gt;计算 GPA 的脚本&lt;/a&gt;，刚考完闲来无事改进一下，写了个监控脚本，一旦有新的科目发布成绩就发送邮件通知，图个方便，没啥难度。&lt;/p&gt;

&lt;h2 id=&quot;原理&quot;&gt;原理&lt;/h2&gt;

&lt;p&gt;简单粗暴，把每次计算出的 GPA 结果存储下来，与上次计算结果比对，若是出现变动，即认为发布了新的成绩，按照设置发送邮件提醒。（GPA 计算结果精确到小数点后4位，理论上出了新的成绩而 GPA 不变的概率极小，除非有学神一直保持4.0。。）&lt;/p&gt;

&lt;h2 id=&quot;使用方式&quot;&gt;使用方式&lt;/h2&gt;

&lt;h3 id=&quot;1-安装第三方库&quot;&gt;1. 安装第三方库&lt;/h3&gt;

&lt;p&gt;本程序基于 Python 2.7.13 编写，完整的依赖库列表可见代码头部，以下几个第三方库可能需要额外安装，直接 &lt;code class=&quot;highlighter-rouge&quot;&gt;pip install&lt;/code&gt; 即可。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;requests&lt;/li&gt;
  &lt;li&gt;BeautifulSoup&lt;/li&gt;
  &lt;li&gt;PrettyTable&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2-配置个人信息&quot;&gt;2. 配置个人信息&lt;/h3&gt;

&lt;p&gt;按照代码头部的说明设置你的个人信息，包括以下：
&lt;img src=&quot;\img\2017-01-14\personalinfo.png&quot; alt=&quot;Info&quot; /&gt;&lt;/p&gt;

&lt;p&gt;注意的是邮件部分前五个参数为发送通知的邮箱信息，最后一个为用于接收提醒的邮箱。发送邮箱需要开启 SMTP 服务，建议不要使用163邮箱，捣腾了半天还是会触发反垃圾规则导致无法发件，个人使用腾讯企业邮箱测试通过，或者自行搭建 sendmail 服务器也可。&lt;/p&gt;

&lt;h3 id=&quot;3-设置定期运行&quot;&gt;3. 设置定期运行&lt;/h3&gt;

&lt;p&gt;在你的 VPS 系统里的 crontab 里加个定时任务，或者 PC 上 Windows 里加个计划任务，按照你设定的时间段和时间间隔执行即可，方法多样，找个合适的就好。第一次执行会发送一封提醒邮件，可以借此检验是否配置成功。&lt;/p&gt;

&lt;p&gt;下面是提醒邮件的样例：
&lt;img src=&quot;\img\2017-01-14\mail.png&quot; alt=&quot;mail&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;开源项目&quot;&gt;开源项目&lt;/h2&gt;

&lt;p&gt;本程序使用 GPL v3 协议开放全部源代码，你可以在&lt;a href=&quot;https://github.com/smartjinyu/XMUGPA&quot;&gt;我的 Github 仓库&lt;/a&gt;里获取，欢迎 star。最后祝各位出分顺利。&lt;/p&gt;

</description>
        <pubDate>Sat, 14 Jan 2017 01:00:00 +0000</pubDate>
        <link>https://rgxy.github.io/python/2017/01/14/xmu_gpa_monitor.html</link>
        <guid isPermaLink="true">https://rgxy.github.io/python/2017/01/14/xmu_gpa_monitor.html</guid>
        
        
        <category>Python</category>
        
      </item>
    
      <item>
        <title>关于隐写术(Steganography)的简单总结</title>
        <description>&lt;p&gt;十二月初在厦大有个网络安全方面的邀请赛，承蒙同学不弃，组队入坑。竞赛采用典型的CTF(Capture the flag) 竞赛模式，之前对此一无所知，这两天看了些隐写术的相关内容，感觉这方面成体系资料不多，简单总结一下，大神请飘过。&lt;/p&gt;

&lt;h2 id=&quot;1-入门介绍&quot;&gt;1. 入门介绍&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Steganography&quot;&gt;Wikipedia Steganograhy 词条&lt;/a&gt; 可以用来简单了解一下隐写术的原理和历史&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;drops.wooyun.org/tips/4862&quot;&gt;隐写术总结 - 乌云知识库&lt;/a&gt; 此文很好地结合了隐写术的基本原理和实战操作，推荐阅读(乌云网目前无法打开，使用网页快照或搜索转载文章即可)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.shiyanbar.com/courses/detail/344.&quot;&gt;实验吧课程-CTF新手入门之隐写术实例讲解&lt;/a&gt; 几个很短的视频，可以观摩一下各种工具的使用&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://book.douban.com/subject/25837887/&quot;&gt;《数据隐藏技术揭秘》&lt;/a&gt; 一本很薄的小书，介绍了隐写术的相关技术和工具，难度不大，比较系统，可以一读&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;2-习题演练&quot;&gt;2. 习题演练&lt;/h2&gt;

&lt;p&gt;可以找各种 CTF 竞赛的真题，也可以在攻防平台上练习，入门阶段我是在实验吧网站上进行的练习。&lt;/p&gt;

&lt;h2 id=&quot;3-常用工具&quot;&gt;3. 常用工具&lt;/h2&gt;

&lt;p&gt;进行隐写文件的分析用到的工具大多比较小众，在此略作总结。此处仅列举本人目前使用过的工具，这个 &lt;a href=&quot;https://github.com/smartjinyu/ctf-tools&quot;&gt;Github Repository&lt;/a&gt; 里有更加完整的集合。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Winhex&lt;/strong&gt;、&lt;strong&gt;UltraEdit&lt;/strong&gt;: 用于查看文件的二进制\十六进制代码&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;StegSolve&lt;/strong&gt;: 神器中的神器，能够对常见的图片格式进行偏移、LSB 提取、帧提取、像素偏移、数据提取，对两张图片进行结合等等，覆盖了常见的分析需求。&lt;a href=&quot;http://www.caesum.com/handbook/Stegsolve.jar&quot;&gt;下载地址&lt;/a&gt;，需要 Java 运行环境。
&lt;img src=&quot;\img\2016-11-29\stegsolve.jpg&quot; alt=&quot;StegSolve&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Binwalk&lt;/strong&gt;: 常用工具，可以进行文件的分析和提取。使用说明可参看&lt;a href=&quot;http://www.secbox.cn/hacker/ctf/8078.html&quot;&gt;这篇博客&lt;/a&gt;，在 Linux 下运行 &lt;code class=&quot;highlighter-rouge&quot;&gt;sudo apt-get install binwalk&lt;/code&gt; 即可安装。
&lt;img src=&quot;\img\2016-11-29\binwalk.png&quot; alt=&quot;binwalk&quot; /&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;binwalk filename&lt;/code&gt; 分析文件构成&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;binwalk -e filename&lt;/code&gt; 自动解压已知文件格式&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;binwalk -D=[extension] filename&lt;/code&gt; 根据后缀名解压，如 &lt;code class=&quot;highlighter-rouge&quot;&gt;-D=jpeg&lt;/code&gt; 等 &lt;a href=&quot;http://www.shiyanbar.com/ctf/1926&quot;&gt;例题&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Stegdetect&lt;/strong&gt;: 用于检测 JPEG 文件中是否包含隐藏内容并尝试分析隐藏内容通过哪个隐写工具嵌入，官网打不开，网上找到一份&lt;a href=&quot;http://ftp.mirrorservice.org/sites/ftp.wiretapped.net/pub/security/steganography/stegdetect/&quot;&gt;编译好的 Windows 版本&lt;/a&gt;。使用方式为：
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;stegdetect [-nqV] [-s &amp;lt;float&amp;gt;] [-d &amp;lt;num&amp;gt;] [-t &amp;lt;tests&amp;gt;] [file.jpg ...]&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;-q 仅显示可能包含隐藏内容的图像。&lt;/li&gt;
      &lt;li&gt;-n 启用检查 JPEG 文件头功能，以降低误报率。如果启用，所有带有批注区域的文件将被视为没有被嵌入信息。如果 JPEG 文件的 JFIF 标识符中的版本号不是1.1，则禁用 OutGuess 检测。&lt;/li&gt;
      &lt;li&gt;-s 修改检测算法的敏感度，该值的默认值为1。检测结果的匹配度与检测算法的敏感度成正比，算法敏感度的值越大，检测出的可疑文件包含敏感信息的可能性越大。&lt;/li&gt;
      &lt;li&gt;-d 打印带行号的调试信息。&lt;/li&gt;
      &lt;li&gt;-t 设置要检测哪些隐写工具（默认检测 jopi），可设置的选项如下：
        &lt;ul&gt;
          &lt;li&gt;j 检测图像中的信息是否是用 jsteg 嵌入的。&lt;/li&gt;
          &lt;li&gt;o 检测图像中的信息是否是用 outguess 嵌入的。&lt;/li&gt;
          &lt;li&gt;p 检测图像中的信息是否是用 jphide 嵌入的。&lt;/li&gt;
          &lt;li&gt;i 检测图像中的信息是否是用 invisible secrets 嵌入的。&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;-V 显示软件版本号。&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Outguess&lt;/strong&gt;: 用于提取 JPEG 文件中使用 Outguess 算法的加入的隐藏信息，官网挂了一堆代理都打不开，网上找到一份编译好的&lt;a href=&quot;http://www-uxsup.csx.cam.ac.uk/pub/windows/cygwin/x86/release/outguess/&quot;&gt; Windows 版本&lt;/a&gt;。常用命令：
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;./outguess -r test.jpg output.txt&lt;/code&gt;  用于还原 JPG 图片中的隐藏信息 &lt;a href=&quot;http://www.shiyanbar.com/ctf/1926&quot;&gt;例题&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;JPHS&lt;/strong&gt;: 用于对 JPEG 文件进行 Jhide 算法的隐写或提取，详细介绍及软件下载可以参见&lt;a href=&quot;http://www.secbox.cn/hacker/ctf/8078.html&quot;&gt;这篇博客&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;MP3Stego&lt;/strong&gt;: 用于对 MP3 音频文件进行隐写、提取等操作，下载及使用&lt;a href=&quot;http://www.petitcolas.net/steganography/mp3stego/&quot;&gt;参见此网页&lt;/a&gt;，常用命令：
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;encode -E hidden_text.txt -P pass svega.wav svega_stego.mp3&lt;/code&gt; 用于写入隐藏信息&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;decode -X -P pass svega_stego.mp3&lt;/code&gt; 用于提取隐藏在音频文件中的信息 &lt;a href=&quot;http://www.shiyanbar.com/ctf/1926&quot;&gt;例题&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;MSU Stego&lt;/strong&gt;: 用于对 AVI 文件进行隐写\提取操作，介绍见&lt;a href=&quot;http://www.compression.ru/video/stego_video/index_en.html&quot;&gt;官网&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;其他工具&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;QR Reader&lt;/strong&gt;: 用于在 Windows 下进行 QR Code 的扫描，可以自定义参数&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Advanced Archive Password Recovery&lt;/strong&gt;: 爆破压缩文档密码&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://www.dmd5.com/md5-decrypter.jsp&quot;&gt;MD5 解密&lt;/a&gt;&lt;/strong&gt;: 在线工具，用于解密 MD5 字符串&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://encode.chahuo.com/&quot;&gt;在线加密解密&lt;/a&gt;&lt;/strong&gt;: 亦是在线工具，支持各种加密协议&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;4-值得注意的题目&quot;&gt;4. 值得注意的题目&lt;/h2&gt;

&lt;p&gt;太过基础的题目不再列举，此处记录一些我认为值得注意的题目，大多比较简单。&lt;/p&gt;

&lt;h3 id=&quot;41-jpg-文件格式&quot;&gt;4.1 JPG 文件格式&lt;/h3&gt;

&lt;p&gt;一个完整的 JPG 文件由 &lt;code class=&quot;highlighter-rouge&quot;&gt;FF D8&lt;/code&gt; 开头，&lt;code class=&quot;highlighter-rouge&quot;&gt;FF D9&lt;/code&gt;结尾，图片浏览器会忽略 &lt;code class=&quot;highlighter-rouge&quot;&gt;FF D9&lt;/code&gt; 以后的内容，因此可以在 JPG 文件中加入其他文件。 &lt;code class=&quot;highlighter-rouge&quot;&gt;Binwalk&lt;/code&gt; 中提到的那个例题可以尝试不适用 &lt;code class=&quot;highlighter-rouge&quot;&gt;Binwalk&lt;/code&gt; 提供的自动分拆功能，而使用 &lt;code class=&quot;highlighter-rouge&quot;&gt;Winhex&lt;/code&gt; 手动分解。&lt;/p&gt;

&lt;h3 id=&quot;42-gif-文件格式&quot;&gt;4.2 Gif 文件格式&lt;/h3&gt;

&lt;p&gt;详细格式可以参阅 &lt;a href=&quot;http://dev.gameres.com/Program/Visual/Other%20/GIFDoc.htm&quot;&gt;GIF 文档&lt;/a&gt;，注意开头的 &lt;code class=&quot;highlighter-rouge&quot;&gt;GIF8&lt;/code&gt; 四位，例题可见1中给出的隐写术总结中的相关内容。&lt;/p&gt;

&lt;h3 id=&quot;43-zip-伪加密&quot;&gt;4.3 Zip 伪加密&lt;/h3&gt;

&lt;p&gt;有时候得到一个加密的 ZIP 文件，但没有任何关于密码的线索，可以考虑是否为伪加密的 ZIP 文件，&lt;a href=&quot;http://www.shiyanbar.com/ctf/716&quot;&gt;此题&lt;/a&gt;即是很好的例子，相关说明可见&lt;a href=&quot;http://www.secbox.cn/hacker/ctf/8078.html&quot;&gt;这篇博客&lt;/a&gt;。&lt;/p&gt;

&lt;h3 id=&quot;44-双图问题&quot;&gt;4.4 双图问题&lt;/h3&gt;

&lt;p&gt;对于两张图片的问题，可用 &lt;code class=&quot;highlighter-rouge&quot;&gt;StegSolve&lt;/code&gt; 对双图进行各种操作(SUB、XOR、AND)等等，看是否获取有用信息，可能与加解密、二维码等综合。&lt;a href=&quot;http://www.shiyanbar.com/ctf/1926&quot;&gt;例题&lt;/a&gt;。&lt;/p&gt;

&lt;h3 id=&quot;45-f5-隐写术&quot;&gt;4.5 F5 隐写术&lt;/h3&gt;

&lt;p&gt;一种隐写算法，可以由 `Stegdetect· 检测出，&lt;a href=&quot;https://github.com/matthewgao/F5-steganography&quot;&gt;Github&lt;/a&gt; 上有工具提取密文，也可参看&lt;a href=&quot;http://www.shiyanbar.com/ctf/1938&quot;&gt;此例题&lt;/a&gt;。&lt;/p&gt;

&lt;h3 id=&quot;46-加密算法&quot;&gt;4.6 加密算法&lt;/h3&gt;

&lt;p&gt;有时候分析出来的 flag 经过加密，简单的 Base64、MD5 等不再赘述，&lt;a href=&quot;http://www.secbox.cn/hacker/ctf/8078.html&quot;&gt;这篇博客&lt;/a&gt;比较全面地总结了隐写术中用到的加密算法，可以参看。文中还提供了各种加密方式的解密工具。&lt;/p&gt;

&lt;h2 id=&quot;5-简单总结&quot;&gt;5. 简单总结&lt;/h2&gt;

&lt;p&gt;看起来隐写术是个非常有趣的智力游戏，涉及密码学、文件格式、编程能力等的综合运用，目前我也仅在入门阶段，上述内容是个极简略极浅显的总结，适用于初学者快速入门，很多内容比如编程解法、Photoshop 解法、视频隐写等均未涉及，随着钻研的深入，我会逐步加入以上内容的总结。&lt;/p&gt;
</description>
        <pubDate>Tue, 29 Nov 2016 01:00:00 +0000</pubDate>
        <link>https://rgxy.github.io/ctf/2016/11/29/introduction_to_stereo.html</link>
        <guid isPermaLink="true">https://rgxy.github.io/ctf/2016/11/29/introduction_to_stereo.html</guid>
        
        
        <category>CTF</category>
        
      </item>
    
      <item>
        <title>推荐一下吴军博士的《数学之美》</title>
        <description>&lt;p&gt;近来无心复习，乱翻闲书，吴军博士的这本《数学之美》网上评价甚高，去图书馆借来，读后大呼过瘾，改变自己不少观点，特地购买一本收藏，并撰文荐之。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/2016-11-12/cover.jpg&quot; alt=&quot;cover&quot; /&gt;&lt;/p&gt;

&lt;p&gt;(封面图片来自当当网)&lt;/p&gt;

&lt;p&gt;作者吴军博士，清华大学本科毕业后，进入约翰·霍普金斯大学 CLSP 实验室攻读博士学位，师从著名的自然语言处理专家弗里德里克·贾里尼克博士，毕业后加入 Google，主持设计了 Google 的搜索反作弊系统，也是 Google 中日韩文搜索算法的主要设计者。
本书主要讲述数学理论与模型在计算机科学领域的应用，作者凭借他在自然语言处理和搜索技术等方面的造诣，指出许多看似复杂的现实问题背后简洁清晰的数学模型，特别适合我这个身在数学学院、一心想学计算机的人，个人以为，数学专业的、计算机专业的甚至非相关专业的，都可以读一读此书。&lt;/p&gt;

&lt;p&gt;说来惭愧，作为一个数学专业的学生，虽然对学科的知识结构有粗略的认识，但一直没有了解过学习它们的用处(能从推导数学公式中获得快感的学神请无视)，以为不过是玩一些“这也要证？”、“这也能证？”推理游戏罢了，甚至一度认为，对于计算机的很多领域来说，除了部分线性代数和离散数学知识，其他内容充其量作为一个思维训练罢了。因此，在学习计算机时，我知道每一块理论在知识架构中的位置和应用，因此会千方百计(软院专业课/MOOC/经典教材等等)把它们学好，而本专业的课程，大抵就是以混过考试为目标了。做个没有数据支持的猜测，其实很多学生，不论大学是否是数学专业，从小学学到大学的数学，仅仅是用来应付考试而不是一件有用的工具，作者在书中也坦诚，当年他读本科时同样不知那些数学课程有何意义，不得不说是一件很悲哀的事。&lt;/p&gt;

&lt;p&gt;而他的这本《数学之美》，却让我有幸在大二时就对自己学习的专业知识的应用有了粗浅的认识，书中具体而又生动地诠释了数学在计算机科学领域的巨大影响，其中不少模型，我这个大二本科生都已经耳熟能详。上世纪70年代，基于文法规则进行的自然语言分析走入了死胡同，相反基于统计学模型的方法，却后来居上，而这个统计学模型，其实质就是条件概率公式的应用而已。同样，基于隐含马尔克夫模型解决了很多通信解码和自然语言处理问题、基于矩阵运算和余弦定理完成了文本的相关性分析、基于费马小定理设计了RSA密码系统(谨此纪念周一数论考试)、基于最大熵模型解决了句法分析机器翻译等问题······很多看上去无从下手或是极其复杂的现实问题，被吴军博士抽象成数学模型后，就变得十分简单明了了。在被一大堆公式定理证明淹没的日常学习中，不妨跳到高处看一看，能让苦逼的生活有趣不少，比如我在期中复习之余读读此书，就极大减缓了扔掉让我一脸茫然的数分数论常微分概率论课本的进程。&lt;/p&gt;

&lt;p&gt;值得数学系学生注意的是，书中的许多数学模型并没有给出严格的、充满学院派风格的理论证明，我想跟它作为一本通俗读物的定位有关，不过书中给出的关于这些公式的说明，大多数足以说服我了，个人以为，在数学研究之外的实际应用中，一些公式和定理的解释，只要能让自己和别人信服，也就足够了。如果阅读过程中实在懒得推敲这些理论，也不妨跳过那些说明，同样可以领略“数学之美”。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/2016-11-12/Jelinek.jpg&quot; alt=&quot;Jelinek&quot; /&gt;&lt;/p&gt;

&lt;p&gt;(弗里德里克·贾里尼克博士)&lt;/p&gt;

&lt;p&gt;此书还有一个值得称道的地方，就是书中花了不少篇幅讲述了计算机科学领域的前辈们的故事，不同于其他人维基百科式的描述，作者把自己与他们在工作、研究中的实际接触和他们的成就结合在一起书写，让我看到的是一个个活生生的人，而非一群只能膜拜无法却窥得一二的神。弗里德里克·贾里尼克博士、阿米特·辛格博士、马库斯、布莱尔、柯林斯等一个个熠熠生辉的名字，作者把他们的求学的生涯、研究时的轶事、在学术界或工业界的成就娓娓道来，让人不时赞叹他们的一些解决方法的精妙，也展示了研究问题、改进解决方案的乐趣。毫不夸张地说，本书让我第一次有了读几年 Phd，混几年实验室的想法(以及“凡今谁是出群雄”的谜之自信)。&lt;/p&gt;

&lt;p&gt;读完此书，推的了公式，证的了定理，解的了方程，建的了模型，写的了代码，成了我这个数学学院的计算机鱼的最大心愿， 可惜啊，这些任务并不能拆分成一堆不相关子任务，丢给一群(小)大金鱼去并行计算。熬过还剩一周的期中考试，还有这么多有趣的东西等着本鱼单进程单线程地去学习。&lt;/p&gt;
</description>
        <pubDate>Sat, 12 Nov 2016 01:00:00 +0000</pubDate>
        <link>https://rgxy.github.io/mathematics/2016/11/12/recommend_the_beauty_of_math.html</link>
        <guid isPermaLink="true">https://rgxy.github.io/mathematics/2016/11/12/recommend_the_beauty_of_math.html</guid>
        
        
        <category>Mathematics</category>
        
      </item>
    
      <item>
        <title>暂停一下准备期中考试咯</title>
        <description>&lt;p&gt;从十天前开坑 Android 以来，保持平时每天一个 Chapter，周末每天两个 Chapter 的进度，同时跟着 MOOC 的进度继续 Computer Network 和数据库系统的学习，在宿舍阳台搭建的码代码环境下倒也忙得不亦乐乎，然而，死亡期中考试正在来临，接下来两周时间有5门数学专业考试正在招手，考虑到低得令人发指的绩点，这段时间内不得不暂时停止以上计算机知识的学习以全力应对考试(总是为自己不好好学习找借口)。&lt;/p&gt;

&lt;p&gt;回顾以下，从八月回校至今的，计算机方面做了以下事情：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;ACM: 跟 ACM 队水了一个月，完成了&lt;a href=&quot;https://smartjinyu.com/acm/2016/08/21/dsa-Summary.html&quot;&gt;基本的算法和数据结构&lt;/a&gt;训练，目前 ACM 基本弃坑。&lt;/li&gt;
  &lt;li&gt;图形学：参加了一个实习营，了解基本的图形学知识并体验了实际 Project 的开发流程。&lt;/li&gt;
  &lt;li&gt;汇编语言：完成基本指令的学习(此项参加软件学院专业课)。&lt;/li&gt;
  &lt;li&gt;计算机网络：完成 &lt;code class=&quot;highlighter-rouge&quot;&gt;Computer Network: A Top-down Approach&lt;/code&gt; 的前四章 (Until Network Layer) (此项主要读书，MOOC 为辅，有些习题还未完成)。&lt;/li&gt;
  &lt;li&gt;数据库系统：完成基本的概念认知和基础 SQL 语法(此项主要根据 MOOC，所花精力较少)。&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://smartjinyu.com/android/2016/10/25/Begin_to_learn_android_again.html&quot;&gt;Android Development&lt;/a&gt;：读完 &lt;code class=&quot;highlighter-rouge&quot;&gt;Android Programming, The Big Nerd Ranch Guide (2nd Edition)&lt;/code&gt; 前十二章，敲完示例代码。&lt;/li&gt;
  &lt;li&gt;Python：了解基础语法，写了几个小爬虫、&lt;a href=&quot;https://smartjinyu.com/python/2016/09/09/XMU_GPA_Calc.html&quot;&gt;计算 GPA 工具&lt;/a&gt;、&lt;a href=&quot;https://smartjinyu.com/python/2016/09/15/XMU_BKXK.html&quot;&gt;自动选课脚本&lt;/a&gt;练手。&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://smartjinyu.com/datamining/2016/10/12/XMU_Lib_Seats.html&quot;&gt;数据挖掘&lt;/a&gt;：校选课，上课后发现神坑，老师认为我们无所不知讲得飞起，目前正在收集数据阶段，待填坑。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;其他零碎的如了解基本的 Linux 用法、了解一些最基本的前端常识等不再一一罗列。&lt;/p&gt;

&lt;p&gt;从期中考完到本学期结束，在计算机方面还应该完成：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;计算机网络：跟完 MOOC，至少读完 A Top-down Approach，有时间开始阅读 &lt;code class=&quot;highlighter-rouge&quot;&gt;TCP/IP协议&lt;/code&gt;，并尝试使用 Wireshark 进行进阶网络分析。&lt;/li&gt;
  &lt;li&gt;数据库系统：跟完 MOOC，熟悉 SQL 的用法与嵌入式 SQL，并进行适当练习。&lt;/li&gt;
  &lt;li&gt;汇编语言：按照软院专业课要求，通过考试(此处”通过”的定义已被重载)，有时间开始练习基础的反汇编。&lt;/li&gt;
  &lt;li&gt;数据挖掘：了解一些基本知识，完成课程要求的论文并提交(此项应在12月中旬前完成)。&lt;/li&gt;
  &lt;li&gt;Android Development: 吃透 &lt;code class=&quot;highlighter-rouge&quot;&gt;Android Programming, The Big Nerd Ranch Guide (2nd Edition)&lt;/code&gt;,并开始对 Java 的深入学习。有时间做一两个小 APP 练手。&lt;/li&gt;
  &lt;li&gt;Java: 开始阅读 &lt;code class=&quot;highlighter-rouge&quot;&gt;Java设计模式&lt;/code&gt;、 &lt;code class=&quot;highlighter-rouge&quot;&gt;Effective Java&lt;/code&gt; 两本书，争取读完其中一本。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;通过这半个学期的学习，又一次领略了计算机领域的庞大，作为入门新手，既需要努力增加代码量，积累编程经验，也需要学好基础的理论课程提升认知水平。在学习的过程中，很多东西已经在代码中一知半解地进行运用了，当基础知识学到此处时，之前的经验会促进对理论的理解，而理论的学习也让此前的疑问豁然开朗。&lt;/p&gt;

&lt;p&gt;而这一段时间里，个人以为在学习方法上最大的突破就是终于敢于直接阅读英文原著了，很多计算机领域的经典书籍，翻译过来佶屈聱牙，甚至不知所云，往往需要靠猜测原文再来揣摩原意。此前一直自认为英语水平欠佳，读原著会对学习进度造成拖累。然而国内的翻译版本通常没有电子版，鄙人又不愿意背着砖头一样的书满学校跑，就尝试读英文的PDF，竟发现绝大多数时候都能很顺畅地看下来。目前在读 &lt;code class=&quot;highlighter-rouge&quot;&gt;Computer Network: A Top-down Approach&lt;/code&gt; 和 &lt;code class=&quot;highlighter-rouge&quot;&gt;Android Programming, The Big Nerd Ranch Guide (2nd Edition)&lt;/code&gt;，目前保持每周200页左右的速度，感觉非常不错。一旦突破这道门槛后(其实主要是心理上的)，计算机领域大量的经典学习材料便可以为我所用，只是自我感觉英文表达能力还欠佳，难以顺畅、忠实地表达自己的想法。&lt;/p&gt;

&lt;p&gt;计算机领域的学习之路还很漫长，重视实际的项目经验，重视基础理论的学习，而数学和英语，是学好计算机的左膀右臂，祝自己期中顺利，考试后继续努力吧！&lt;/p&gt;

&lt;p&gt;2016-11-05 凌晨 于厦大学生公寓&lt;/p&gt;

</description>
        <pubDate>Fri, 04 Nov 2016 01:00:00 +0000</pubDate>
        <link>https://rgxy.github.io/learning/2016/11/04/pause_for_midterm_exams.html</link>
        <guid isPermaLink="true">https://rgxy.github.io/learning/2016/11/04/pause_for_midterm_exams.html</guid>
        
        
        <category>Learning</category>
        
      </item>
    
      <item>
        <title>重新开坑：开始自学Android编程</title>
        <description>&lt;h4 id=&quot;开坑原因&quot;&gt;开坑原因&lt;/h4&gt;

&lt;p&gt;从高考后开始的这轮对于计算机知识的学习，最早的热情就是来自于学习Android Development。我们几百块钱就能买到一个不错的廉价Android设备，WLAN、GPS、NFC、4G、Screen、Camera等硬件一应俱全，利用这些硬件实现一些有趣的功能，让生活更高效，是我学习Android Development的最初动力。当然，事情不是我想象的那么简单，没有Java基础(或者说没有任何Computer Science基础)的我被搞得晕头转向，只得抱起厚厚的Core Java从头学起。把J2SE的基础搞定后，为了学习算法和数据结构、刷OJ又学习了C++基础，为了做一些网络爬虫又学了点Python······&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/2016-10-25/android-nougat.png&quot; alt=&quot;android&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在此期间，“初恋”Android已经从6.0 DP发展到了7.1 DP，而我只是看完了郭霖老师的《第一行代码》的前七章，写了个&lt;a href=&quot;https://smartjinyu.com/savenotpic/2016/08/02/SaveNoTPic.html&quot;&gt;名叫SaveNOTPic的小应用&lt;/a&gt;练手，如今也已遗忘殆尽。Computer Science领域还有很多技能树等着我去点亮，回来研究Android Development，一方面最初的动力还没有消失，另一方面尝试把从其他领域学到的略显枯燥的理论知识应用到实际的Project中，提升项目经验，我觉得还是十分必要的。因此，本鱼就在一堆坑还没填上前再开一新坑。&lt;/p&gt;

&lt;h4 id=&quot;学习规划&quot;&gt;学习规划&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/img/2016-10-25/APTBNRG.png&quot; alt=&quot;APTBNRG&quot; /&gt;&lt;/p&gt;

&lt;p&gt;郭神那本《第一行代码》虽然经典，但是基于Android 4.4和Eclipse显得有些古老，第二版据说今年十二月份会出版，但学习最重要的还是趁热(情)打铁，决定从Android Programming: The Big Nerd Ranch Guide (2nd Edition)开始，并结合Google官方的&lt;a href=&quot;https://developer.android.com/training/index.html&quot;&gt;Android Training&lt;/a&gt;进行学习,此书在国外评价甚高，读原版也能免去诸多翻译上的问题，顺便锻炼锻炼英文水平。此书是Project Based，全书共分34 Chapter，共有8个Project来熟悉Android开发的方方面面。此前虽然有一点基础，但是Java的知识遗忘不少，加上数学专业课、计算机网络、数据库系统、汇编语言、Linux、数据挖掘等一堆坑等着填，以及下个月死亡期中考，尽我所能在2016年结束之前完成这第一阶段的计划，就像Computer Network中的IP Protocol，do best effort,but offer no guarantee。&lt;/p&gt;

&lt;p&gt;等第一阶段完成后，再视情况进行下一步的学习，可能是从Java方面读比如Effective Java, Thinking in Java,或者Android方面进一步深入。&lt;/p&gt;

&lt;h5 id=&quot;update-2016-11-04&quot;&gt;Update 2016-11-04:&lt;/h5&gt;

&lt;p&gt;读完后需要阅读《Java设计模式》&lt;/p&gt;

&lt;h4 id=&quot;github&quot;&gt;Github&lt;/h4&gt;

&lt;p&gt;为了防止本鱼哪天突然弃坑，跟着书上敲的示例代码我都会上传到&lt;a href=&quot;https://github.com/smartjinyu/APTBNRG&quot;&gt;我的Github&lt;/a&gt;，仅仅是为了督促自己努力学习，一切版权等均归属书籍原作者/出版商所有，如有侵犯之处，请联系我。&lt;/p&gt;

</description>
        <pubDate>Tue, 25 Oct 2016 01:00:00 +0000</pubDate>
        <link>https://rgxy.github.io/android/2016/10/25/Begin_to_learn_android_again.html</link>
        <guid isPermaLink="true">https://rgxy.github.io/android/2016/10/25/Begin_to_learn_android_again.html</guid>
        
        
        <category>Android</category>
        
      </item>
    
      <item>
        <title>Smartjinyu's Blog 全新改版啦！</title>
        <description>&lt;p&gt;由于种种原因，第一版的博客存在诸多缺陷，比如缺乏HTTPS加密、文章较多时浏览体验不佳等，这两天抽空对博客进行了改版，在界面美观度、易用性等方面应该会有很大提高。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/logo.png&quot; alt=&quot;logo&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;关于模板&quot;&gt;关于模板&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/img/2016-10-19/website.png&quot; alt=&quot;website&quot; /&gt;&lt;/p&gt;

&lt;p&gt;鉴于自己审美和美工方面极度欠缺，加上对Javascript、Html等前端的技能不熟悉，本次改版根据DONGChuan的&lt;a href=&quot;https://github.com/DONGChuan/Yummy-Jekyll&quot;&gt;Yummy-Jekyll&lt;/a&gt;的模板进行修改，博客使用Jekyll生成，搭建在Github Pages上。在修改模板的过程中，遇到一些环境配置问题，解决过程参考了&lt;a href=&quot;http://knightcodes.com/miscellaneous/2016/09/13/fix-github-metadata-error.html&quot;&gt;此篇博客&lt;/a&gt;，在此一并表示感谢。&lt;/p&gt;

&lt;h4 id=&quot;关于博客&quot;&gt;关于博客&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/img/2016-10-19/guide.png&quot; alt=&quot;Guide&quot; /&gt;&lt;/p&gt;

&lt;p&gt;改版之后的博客不再采用原先的Material Design，以标题栏的形式将博客分为Home、Open-Source、Blog、About四个部分，其中Open-Source部分直接与&lt;a href=&quot;https://github.com/smartjinyu&quot;&gt;我的Github账号&lt;/a&gt;联动，同时也在Home页面以侧边栏的形式展示Popular Repositories，感觉本渣的Github完全拿不出手，以后还当加倍努力。(又是Flag)&lt;/p&gt;

&lt;h4 id=&quot;关于https&quot;&gt;关于HTTPS&lt;/h4&gt;

&lt;p&gt;基于数据传输的安全性、对抗运营商的流氓劫持、Google的结果排名等诸多因素的考量，本次改版为博客加上了HTTPS加密，并且强制启用。由于博客搭建在Github Pages上，在选择SSL证书方面存在诸多限制，目前的解决方案是使用Cloudflare的证书，Flexible方案免费，使用namesever将流量转到CF的服务器上，实现从客户端到CF服务器的加密，不过从CF的服务器到原始服务器这一段依旧是不加密的，基于博客现有的需要和技术限制，暂且认为可以接受。启用HTTPS的过程参考了CF的&lt;a href=&quot;https://support.cloudflare.com/hc/en-us/articles/201720164-Sign-up-planning-guide&quot;&gt;Official Guide&lt;/a&gt; and &lt;a href=&quot;https://sheharyar.me/blog/free-ssl-for-github-pages-with-custom-domains/&quot;&gt;This blog&lt;/a&gt;。由于域名没有备案，无法使用CF与百度云合作的国内CDN节点，经测试，厦门移动会连接到Hong Kong的服务器，latency在50ms-80ms左右，尚可接受，但是电信会重定向到Los Angeles的CF服务器，延迟可能超过150ms，还望谅解。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/2016-10-19/ssl.png&quot; alt=&quot;ssl&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;关于disqus&quot;&gt;关于Disqus&lt;/h4&gt;

&lt;p&gt;把protocol从HTTP迁移到HTTPS后，原先页面下的Disqus的评论会消失，Disqus官方提供了相应的&lt;a href=&quot;https://help.disqus.com/customer/portal/articles/286778-using-the-migration-tools&quot;&gt;Migration Tools&lt;/a&gt;，按照说明进行迁移即可(最多可能需要24小时才能生效)。&lt;/p&gt;

&lt;h4 id=&quot;感言&quot;&gt;感言&lt;/h4&gt;

&lt;p&gt;在前端方面我是彻头彻尾的菜鸟，虽然你看到博客相比原始模板没有太大的改变，但我也不得不试图理解整个网站的框架结构。几天的捣腾对Javascript、HTML、bower等大抵有了些了解，学习了SVG图标的相关知识，虽然还远谈不上入门了，但至少撩起了门帘。&lt;/p&gt;

&lt;p&gt;改版初期本打算使用WordPress搭建一个全功能的动态网站，但是在选购VPS(现有的这台还有他用)、数据库管理、前端开发、网站的安全维护等方面感到力不从心，先使用比较省心的Github Pages，待以后才学有所长进后(点亮以下技能后)，再来完整地尝试建站。&lt;/p&gt;

&lt;p&gt;目前正在点的技能:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Computer Network&lt;/li&gt;
  &lt;li&gt;DataBase and SQL&lt;/li&gt;
  &lt;li&gt;Usage of Linux&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;将要点的技能:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Javascipt&lt;/li&gt;
  &lt;li&gt;HTML\CSS&lt;/li&gt;
  &lt;li&gt;ETC..&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(但愿以上不全是Flag)&lt;/p&gt;

&lt;p&gt;如果你有好的建议或者发现的网站Bug，欢迎留言提出。&lt;/p&gt;
</description>
        <pubDate>Wed, 19 Oct 2016 01:00:00 +0000</pubDate>
        <link>https://rgxy.github.io/others/2016/10/19/Move_to_new_blog.html</link>
        <guid isPermaLink="true">https://rgxy.github.io/others/2016/10/19/Move_to_new_blog.html</guid>
        
        
        <category>others</category>
        
      </item>
    
      <item>
        <title>开始数据挖掘项目之“厦门大学图书馆座位使用情况”</title>
        <description>&lt;p&gt;You can find English Edition in &lt;a href=&quot;https://github.com/smartjinyu/xmuSeats&quot;&gt;my GitHub Repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;昨天早上去学生公寓图书馆自习，选座机告诉我座位情况96/96，只得另觅教学楼空闲教室自习。上学期公寓图书馆有150多个座位，尚且时常爆满，暑假改造，把三楼和二楼靠墙的座位全部拆除，硬生生地把座位减少了40%，简直不可理喻。正好在跟 MOOC 的数据库系统，也选修了学校的数据挖掘原理和实战，便打算以图书馆座位的使用情况为例进行分析。（仅用于练手+泄愤，大神绕过）&lt;/p&gt;

&lt;h2 id=&quot;2016-12-15-更新&quot;&gt;2016-12-15 更新：&lt;/h2&gt;

&lt;p&gt;自2016年12月16日起，采用新的数据库结构，从早上8点到晚上10点，每分钟抓取一次数据，存储在名为 &lt;code class=&quot;highlighter-rouge&quot;&gt;libseat.db&lt;/code&gt; 的数据库中，采集样例和 schema 可见下图。从2016年10月14日至2016年12月15日的数据保存在名为 &lt;code class=&quot;highlighter-rouge&quot;&gt;seatState_old.db&lt;/code&gt; 的数据库中，其中数据每隔两分钟采集一次。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/2016-10-12/libseat.png&quot; alt=&quot;db&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;数据来源&quot;&gt;数据来源&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://library.xmu.edu.cn/portal/SeatManage.asp&quot;&gt;厦门大学图书馆网站&lt;/a&gt;提供当前座位信息的查询，经验证，基本能保证与实际情况同步，故采用此处数据作为来源，共抓取书库1楼、自习室A、信息工程分馆、经济分馆等14个阅览室的座位信息。数据库采用 sqlite3。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/2016-10-12/seats.png&quot; alt=&quot;seat&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;注意事项&quot;&gt;注意事项&lt;/h2&gt;

&lt;p&gt;因为种种原因，数据库中的有些数据可能不准确，请在分析之前务必进行数据清理(对于 &lt;code class=&quot;highlighter-rouge&quot;&gt;seatState.db&lt;/code&gt; 中的数据，此工作可由 preprocess.py 脚本自动完成)。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;每周三下午1点至6点图书馆闭馆，期间读者无法入内，但选座系统数据不会清零。&lt;/li&gt;
  &lt;li&gt;每晚21:30以后，选座系统数据会清零，而非等到晚上十点闭馆以后。&lt;/li&gt;
  &lt;li&gt;2016年10月14日、15日的数据可能是每3分钟采集一次。&lt;/li&gt;
  &lt;li&gt;2016年12月9日至2016年12月11日的数据，由于 VPS 的时区配置问题，时间需要加上8小时，并且可能当天数据不完整。&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;开源项目&quot;&gt;开源项目&lt;/h2&gt;

&lt;p&gt;本脚本采用 GPL v3 协议开放源代码，你可以从&lt;a href=&quot;https://github.com/smartjinyu/xmuSeats&quot;&gt;我的 Github 页面&lt;/a&gt;上获取所有代码和使用帮助。每周日我会上传抓取到的数据到 Github 仓库中，你可以在注明数据来源的情况下使用这些数据进行分析。最终的研究结论和报告是否公开还有待决定，如果有建议或意见欢迎以留言或邮件的形式提出。&lt;/p&gt;

</description>
        <pubDate>Wed, 12 Oct 2016 08:38:20 +0000</pubDate>
        <link>https://rgxy.github.io/datamining/2016/10/12/XMU_Lib_Seats.html</link>
        <guid isPermaLink="true">https://rgxy.github.io/datamining/2016/10/12/XMU_Lib_Seats.html</guid>
        
        
        <category>DataMining</category>
        
      </item>
    
  </channel>
</rss>
