《Introduction to React》 阅读笔记

Chapter 01: 什么是React

React诞生于Facebook的广告部门,开始的时候这些前端的程序依然使用的是MVC模式去渲染模板的方法构建,这些模式主要用来处理数据集的双向绑定的问题。后来演进为现在的React的全新的前端开发模式,包括使用virtual DOM,JSX,Flux概念来构建复杂的javascript程序和前端用户界面。再到后面,react通过提供react native延及到手机开发领域,使用与react同样的开发模式和理念。

Read More

几个有用的python库介绍

Folium

项目地址:https://github.com/python-visualization/folium

基于Leaflet.js地图库的python实现,主要是python在前端生成、控制和操作数据,而后端地图
的实现则给予Leaflet.js。

tinydb

项目地址:http://tinydb.readthedocs.org/en/latest/

NoSQL数据库的的纯python实现,可以用于快速的原型开发。

>>> from tinydb import TinyDB, Query
>>> db = TinyDB('path/to/db.json')
>>> User = Query()
>>> db.insert({'name': 'John', 'age': 22})
>>> db.search(User.name == 'John')
[{'name': 'John', 'age': 22}]

dill

项目地址:http://trac.mystic.cacr.caltech.edu/project/pathos/wiki/dill

pickle的更优替代,由于pickle不能处理嵌套的function,lambda,slices,接口与
pickle是一模一样的。

ORM?不是数据库的专利

项目地址:https://github.com/marshmallow-code/marshmallow/

marshmallow提供的是一个轻量级的Python ORM框架,管理python里的复杂的数据。

from datetime import date
from marshmallow import Schema, fields, pprint

class ArtistSchema(Schema):
name = fields.Str()

class AlbumSchema(Schema):
title = fields.Str()
release_date = fields.Date()
artist = fields.Nested(ArtistSchema)


bowie = dict(name='David Bowie')
album = dict(artist=bowie, title='Hunky Dory', release_date=date(1971, 12, 17))

schema = AlbumSchema()
result = schema.dump(album)
pprint(result.data, indent=2)
# { 'artist': {'name': 'David Bowie'},
# 'release_date': '1971-12-17',
# 'title': 'Hunky Dory'}

这里的schema类似于数据库里的ORM里的model的概念,也可以设定constraint和foreign key,所以schema可以在这里有如下作用:

  • 验证输入的数据完整性,通过fields的validator
  • 反序列化(deserialize)input到应用级别的对象
  • 序列化(serialize)应用级别的对象到python原生的对象,然后python原生的对象可以
    进一步被渲染为其他所需的数据格式(比如JSON)

Read More

Joblib: the memoize and parallelism and persistence framework

joblib项目地址:https://github.com/joblib/joblib

这个库主要提供三方面的功能:

  • 缓存(cache, memoize)
  • 并发(parallelism)
  • 序列化(persistence)

这三个是程序设计与开发中最常见的功能,而该库的主要作用是:

  • 通过抽象封装,减少开发人员在程序设计与实现中容易出现的错误
  • 修复python的内建库不能处理的小bug

主要包含三个类:Memory、Parallel、MemorizedFunc

Read More

A Funny Music Synchronizer

项目介绍:

一个好玩的可以在所有的电脑同步音频的cs架构的实现。

Want to sync up your music on multiple computers? This accomplishes exactly that - using only a simple Python server and a browser. Simply run the Python server, and open up a browser on each computer you want to sync up - that’s it!

项目地址:https://github.com/schollz/musicsaur

技术栈:

  • tornado (backend)
  • jinja (frontend)
  • howler.js (service)

Android Unit Test Without Emulator

项目地址

http://robolectric.org/

项目介绍

想直接在Android IDE中运行andorid test?会得到如下结果:

java.lang.RuntimeException: Stub!

如果引入了TDD的开发模式,在android中就需要不停启动关闭emulator,因为ide没有办法直接模拟运行android test cases,所有才有了Robolectric方案:

示例App

  1. layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
android:id="@+id/login"
android:text="Login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
  1. main activity
public class WelcomeActivity extends Activity {
@Overrid
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome_activity);

final View button = findViewById(R.id.login);
button.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View view) {
startActivity(new Intent(WelcomeActivity.this, LoginActivity.class));
}
});
}
}

测试用例,直接在ide里执行

@RunWith(RobolectricTestRunner.class)
public class WelcomeActivityTest {
@Test
public void clickingLogin_shouldStartLoginActivity() {
WelcomeActivity activity = Robolectric.setupActivity(WelcomeActitity.class);
activity.findViewById(R.id.login).performClick();
Intent expectedIntent = new Intent(activity, WelcomeActivity.class);
assertThat(shadowOf(activity).getNextStartedActivity()).isEqualTo(expectedIntent);
}
}