《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);
}
}

黑客入门必须脚本

好吧,还是直接翻译一个真实的故事,标题就是《黑客不会浪费自己的生命超过90秒》:

Project: https://github.com/NARKOZ/hacker-scripts

xxx: 是这样的,我们的构建工程师已经离职到了另外一家公司。那哥们儿天天就生活在机器的终端里,你知道的,这种家伙喜欢用Vim编辑文件、用Dot创建图表、用Markdown创建wiki帖子……如果任何东西需要他超过90秒,他就会写一个脚本。

xxx: 因此,我们来这里看看他留下的“遗产”。

xxx: 然后,你将会喜欢上这些的。

xxx: 甩我的贱人一巴掌.sh(译者注:smack my bitch up是一首被英国禁掉的歌曲) - 发送一个信息文本“晚点在工作”给他的妻子,并自动从一个数组中随机挑选一个理由。这个脚本在cron job中运行,这个脚本将在九点之后依然有SSH-session的时候触发。

xxx: Kumar的屁眼.sh - 从邮箱的inbox中扫描来自kumar(客户的DBA)的邮件。搜寻“help”、“trouble”、“sorry”等之类的关键词。如果关键词被找到,脚本将会SSH进去客户的服务器,回滚stage数据库到最新的备份。然后送一个回复给Kumar说,“不要着急,兄弟,下次要小心”。

xxx: 宿醉.sh - 另外一个cron job被设定在一个特别的日期。会发送标题为“感觉不舒服/在家工作”之类的邮件,并从一个预定义的数组里随机挑选一个原因。这个脚本将会在早上8点45没有交互式的session时被触发。

xxx: 去他妈的咖啡.sh - 这个脚本等了足足17秒,然后打开一个telnet session到我们的咖啡机(我们完全不知道我们的咖啡机是联网的,运行在linux下,并开放一个socket端口),然后发送一些命令比如sys brew,然后这些命令就会制作一个中杯的拿铁咖啡,再等24秒把咖啡倾倒入杯子里,而这个时长刚好是这家伙从座位走到咖啡机的时间。

xxx: 好可怕呀,我将会把这些都保留着。