写给新的一年

Created: 2017-01-04
Categories: Misc

Tags: 闲扯

因为需要重新换宽带套餐,今天把网关了,于是也有了时间来写这个年终总结暨新年展望。

2016

2016 年对我来说是进步最多的一年。我希望每年都是这样,最好进步幅度更大。

Android

其实回头翻看 Projects 文件夹里的东西、看这一年的日记,才发现自己居然学了好久的 Android 开发,可是还是欠缺很多,demo 的东西一大堆,却没有一个像样的完整的 app,那个所谓的清心天气也早已觉得烂到不行。勉强能算还行的项目可能只有 DBox 和 FusionCache 吧,后者其实也并没有什么技术含量。最终没能坚持学 Android,上一次写 Android 代码已经是 9 月份了,一个烂尾的 app。

就这种水平我居然还尝试投了几个简历,自然全是石沉大海。

Python

BlogA - Created: Friday, February 5, 2016 at 20:58

1 月 28 号创建了 Test,2 月 5 号创建了上面这个 BlogA 项目,这个时间开始尝试写 Python。现在回忆起来,这时候应该是,刚学了一些 Android,然后寒假就没有继续学,转而学了点 Python,之后下一学期开始后的某个时间又开始继续学 Android。

总之,刚学了几天 Python 之后写的这个 BlogA 竟然成了可能是目前为止自己写的最好的一个项目之一,也可能是维护时间最长的之一,而且自己的博客以及 Fenkipedia 也正在用它跑。之后又写了 BlogNG 和 BlogT,分别是前端、主题集,共同构成 BlogTANG 系列,你可以轻松地看出,这个命名是故意的。

后来也写了个学校学生门户网站的爬虫+重新封装的 API,当时还想着后续再重新写个前端、移动端,但是结果因为学校网站请求实在太慢,调用一个 API 要 10 秒多,就放弃了。其实部分也是因为懒,写完 API 之后,激情已经不在这上面了,其实也有其它方案获取信息,比如抓掌上校园 app 的包,反正是没有动力继续了。也许以后会重新来做吧。

Python 也尝试投了一个简历,DaoCloud,面试没过,十分糟糕,这次面试也让我知道了自己的能力还差多少。

……

READ MORE

BlogA 添加 Webhook 回调的支持

Created: 2016-09-29
Categories: Misc

Tags: BlogA, Webhook, Backend

刚刚给 BlogA 支持了 Webhook 回调,其实也就是开了一个支持 POST 的 URL 然后去执行自定义脚本而已。

因为之前把博客的内容和 BlogA 框架本身分离了,内容放在 richardchien/blog-content,然后 BlogA 跑在 docker,后台用脚本每 100 秒 pull 一次,不过这样还是有一种很不爽的感觉,于是这次直接加了 Webhook 回调,在 GitHub 添加一个 Webhook 然后在发生 push 时通知 BlogA,从而执行我的更新博客内容的脚本,这样看起来要清爽很多。

所以这篇就算水完了……主要算是测试一下效果。

利用 JSONP 实现跨站请求的方法及原理

Created: 2016-08-07
Categories: Dev

Tags: JSONP, JavaScript, Frontend, Backend, 跨站请求

因为之前想解决博客前后端对接时候跨站请求的问题,于是看到可以用 JSONP 来实现,研究了一番之后做一下笔记。

实现方法

要实现跨站请求是需要同时牵扯到前后两端的代码的。

后端

首先需要修改后端,这边以 Flask 为例:

from functools import wraps
from flask import Flask, request, current_app, jsonify

app = Flask(__name__)


def support_jsonp(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        callback = request.args.get('callback', False)
        if callback:
            content = str(callback) + '(' + f(*args, **kwargs).data.decode('utf-8') + ')'
            return current_app.response_class(content, mimetype='application/json')
        else:
            return f(*args, **kwargs)

    return decorated_function


@app.route('/test')
@support_jsonp
def test():
    return jsonify({'abc': 1, 'def': 2})

这边 support_jsonp 装饰器会判断是否是 JSONP 请求,如果是,则返回相应的「特殊」数据(具体在下面原理的地方详细讲),否则就按正常的请求处理。

前端

后端改完之后,前端就可以来请求了,这边先以 jQuery 的 ajax 函数为例:

$.ajax({
    url: 'http://api.example.com/test',
    dataType: 'jsonp',
    type: 'get',
    success: function(data) {
        console.log(JSON.parse(data));
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        console.log('failed');
    }
});

这样就可以成功请求到跨站的 JSON 了。

……

READ MORE

FusionCache 实现思路和使用方法

Created: 2016-06-16
Categories: Dev, Detailed

Tags: Android, FusionCache, Cache

前几天看《Android 开发艺术探索》关于 Bitmap 加载的那章,里面讲解了一个内存和磁盘二级缓存的 ImageLoader 的实现方法,然后就突然想自己写一个内存+磁盘的混合缓存框架,正好平时上课闲得慌,就在课上构思,最终在昨天完成了这个 FusionCache。虽然注释写得挺多,但还是怕以后看不懂,所以这里记录一下实现思路。

实现思路

首先这个缓存应该基于键值对,使用起来方便嘛,作为一个缓存,本身就是为了增强应用使用体验而用的,并不是什么逻辑上的核心部件,那么就应该用起来越简单越好。

并且缓存应当可以分别设置内存和磁盘缓存的容量上限,也就是说要计算每个对象在内存和磁盘中所占空间。

由于不是所有类的对象都能存到磁盘中,也不是所有对象都能成功计算内存占用,所以需要限制支持存入缓存的对象类型,参考 ASimpleCache,支持 StringJSONObjectJSONArraybyte[]BitmapDrawableSerializable

……

READ MORE