这是一个虚构的故事——与Raspberry有关

相似的历史

歌手的爸爸是一个高中的电脑教师,平日不好烟不好酒。幸好他是一个教师,学校的规章、国家的法律、社会的道德都约束着他身边的人不能光明正大、熟视无人地嗜迷烟酒。虽说烟酒本身无罪,但有罪的人沉迷它们,它们就像妓女一样被正直的人唾弃。歌手的爸爸自诩就是这么一个正直的人,对学生说:电脑是伟大的发明,就靠像我一样对社会有正义感的人传扬下去。

他在学校里因为衣着而小有名气。G2000的西服他一件也没有,amanda的皮包你也不会看到在他的手上,老人头的皮鞋仍然让他避之则吉。不细心观察他的学生和同事,大概也不会发现他每天会有不同的穿着:蓬乱的头发下一双几近反白的眼睛透过似乎摔了不下五次的眼镜歪歪地看着这间课室;白蓝相间的横条polo衫,看不出是uniqlo还是衣品天成的货色,不认真看还数不清到底是有多少条纹;下身不管夏热冬寒,永远不穿内裤(当然这除了歌手的妈妈和他的妈妈没别人知道),卡其色的裤筒长度像温度计一样似乎在告知天气今天要几度。

然而,同事间最广为流传的还是歌手的爸爸和一个学生的故事,而且是男学生。那时,还没是歌手妈妈的歌手的妈妈很好奇这段故事的真实性,于是她竟成了除了校长之外,第一个主动和歌手爸爸说话的同事:周习,你和小马到底是什么关系?

小马是个很有趣的学生。当时他刚上高中,大概是2015年的秋天,他已经嗅到了高考的气息。嗅觉如此敏感的小马也马上嗅到了歌手爸爸的独特味道。在动物学之中,达尔文会称之为“臭味相投,适者生存”。过了大半年,两师徒的关系可谓是如日中天,出相入对,羡煞旁人。小马当时拿到了人生的第一笔生活费,在歌手爸爸的怂恿下,买了如下物品:

  • Raspberry Pi model B;

  • Camera Moduel;

  • 各类电阻、传感器、LED;

  • G83056型号无线网卡;

  • HDMI显示器及接线;

  • USB接口的键鼠套装;

  • 面包板及各类杜邦线。

这就是爱!

这就是爱爱!

以上大约花了小马五百元。在2015年,五百人民币大概等于现在的7000元。可以说,歌手的爸爸就是在当时决定对小马献出自己的一生。他的眼睛湿润了,只是因为小马在路口收货时候的情景映入了他的眼帘——这一切都似曾相识。

没错,在歌手爸爸还是个高中生的时候,他就是在这个路口收货的时候遇到了这个快递小哥。

看你还能编多久

“喂,你怎么不说话了?”歌手的妈妈问道。可见,歌手的爸爸早就沉醉在自己的回忆之中。

歌手的妈妈怏怏地走开了。自此,她心里下了一个决定:以后一定不能嫁给这样的男人。她快25岁了,连国家都觉得她晚婚,使得她自己心里也一番着急。她到歌手出世的那天才突然发觉,这一天的决定竟然决定了歌手一生的命运。 她在歌手出生之前从没觉得自己伟大过。她觉得歌手的爸爸在后来竟然答应了她的求婚便是上天最好的眷顾。而现在,她竟然决定了一个生命的一生!歌手的妈妈马上高兴得晕死过去,便再也没有醒来过,也算是含笑九泉了。歌手那一天是他生命里哭得最撕心裂肺的一天,可能他并不知道发生了什么事,也并不知道为什么要哭,但似乎就有一条线引导着这个生命的行为,做最合常理的行为。

小马高考后便离开了学校,再也没有回过来,也没想私下再见歌手爸爸一次。他在高考失利后就认定,是歌手爸爸的体臭,掩盖了他对高考题目的嗅觉。“周习就是一瓶毒药!

不利的消息越传越乱,到了歌手爸爸的耳中已经成了另一个样,只是字数相同:“小马你不是一个人!”歌手爸爸的语文一直学得不好,却喜欢不顾常理独自理解,以为谣言都站在自己那边,在学校里更加自持;但理解能力特别是经过大学四年的荒废,并不会像黄土高原上的坑,越吹越深。不久后,作为第三个也是第一个和他主动交谈的校长决定开除歌手爸爸。

可能现在的观众对当时的学校编制了解不深,容我再补充一下:《公元2015年劳动合同法》规定公司单位不能随意开除员工,除非员工精神失常,危害同事生命安全。校长也决定以此作为开除歌手爸爸的手段。

校长:周习,我看你在工作上努力付出,真是辛苦了。

歌手爸爸:不不,那是我应该做的。

校长: 你谦虚了。过分谦虚就是虚伪你知道吧哈哈。

歌手爸爸:是的是的。你过奖了。

校长: 小马是个好孩子,不过沉迷于网络,让他一生就毁了。

歌手爸爸:校长你这样说就不对了。小马只是个高中毕业生,后面的路还长着呢,怎么算是毁了呢?况且,他也不是沉迷网络。他喜欢上了这个。(说着从裤挡里掏出了一块芯片。)

校长: (惊!)你的宝贝竟然是?!

歌手爸爸:这是我和小马的宝贝,学名树莓派。

校长: 干什么用?

歌手爸爸:外国的小学生就是用这个学电脑的。

校长: 你在胡扯!崇洋媚外!

歌手爸爸:校长,你看这里有四本书,都是树莓派的入门图书,还有树莓派的官网可以让全世界的树莓派用户交流和学习!

校长: 为什么要看四本?

歌手爸爸:当年,入门类书籍可写内容不多,所以都比较雷同,按内容充实程度来分可以这么排序:

  • 《Raspberry Pi快速入门指南》(日常应用为主,游戏性高。)
  • 《爱上Raspberry Pi》(交互式设计为主,亮点是Arduino的学习。)
  • 《玩转树莓派》(包含了Linux入门和服务器的应用,也对硬件扩展有所描述。)
  • 《Raspberry Pi入门指南》(简单的服务器;Python不作为主要的部分来陈述。)

校长: 然并卵。为什么要看四本?

这就是爱爱!

歌手爸爸:其实,如果不深入研究的话,根本不用买书来学习。简单来说,Raspberry就是一个小型主板,可以安装Linux和windows系统。因为能耗小,可以当作服务器使用;因为小型,可以当作遥控的中介放置在某些机器人中。(校长根本就不想听。)我来举个例子:如何编译一个微博机器人。

校长: 可以了,我有点累了。

过了三天,歌手的爸爸收到了法庭的传票;校长以受害人的身份把他告上了法庭。歌手的爸爸失业了。“看你还能编多久!”这是他失聪之前听到的最后一句话。

巨星

包括歌手妈妈在内的学校同事和学生对歌手爸爸被辞退的事并不感到一丝惊讶和在意,似乎他每天上班上课才是最值得世界去怀疑的事。歌手妈妈每每在歌手还在肚子里的时候回忆她和歌手爸爸的相恋时刻都会感到无比惊奇。歌手小时候耳朵再好,天分再高,都没可能听得到妈妈隔着肚皮对自己说过的话。但在他妈妈去世后的第17年的那年高考作文中,他写出了以下文字:

本来我不认识他,只觉得他十分特别。这种特别怎么形容呢?就像蚂蚁看到了白蚁,Nemo看到了鲨鱼,害怕却又想靠近。佛教的佛是“佛陀”的简称,原意为“觉悟了的人”;所以信佛的人严格上不算是有神论,只是有了一些和EXO一样的实力派偶像罢了。我就是这样看他的。

那年高考,歌手从来都不知道他这篇作文拿了多少分。他拿到的只是一间2B院校的录取通知书。但家里穷得1B的歌手根本读不起,于是就走上了卖唱的生涯。每天在天河体育中心的十字路口上卖唱,他能月入过万。但他最希望能让爸爸听到自己唱的歌;他恨那个把爸爸告上法庭的高中校长。

歌手曾经看到过爸爸填的认罪书。原因那一栏里写得密密麻麻,远看还以为是墨汁有了生命在乱跳。在爸爸一案被平反时,电视上才重现了文字的原貌。


  • 在新浪微博开放平台申请开发应用(随便选就好);
  • 填写高级信息里的授权回调页为随便一个网址(记下来就好);
  • 在Raspbian系统里,打开IDLE,新建文件,输入以下文字(带格式和空格):
#! /usr/bin/python

import weibo 
import urllib
import time
import os


class myAPIClient(weibo.APIClient):
        """
        myAPIClient类继承自weibo包中的APIClient类,对其进行了扩展。SDK中的APIClient类没有根据已授权的access_token获取授权详细信息的接口。另外,SDK中的APIClient不能保存当前授权用户的uid,该继承类实现了这两个功能,使得用起来更加方便。
        """
    def __init__(self, app_key, app_secret, redirect_uri=None, response_type='code', domain='api.weibo.com', version='2'):
        weibo.APIClient.__init__(self, app_key, app_secret, redirect_uri=None, response_type='code', domain='api.weibo.com', version='2')
                #保存当前授权用户的uid
        self.uid = ""

    def request_access_token_info(self, at):
                """
                该接口传入参数at为已经授权的access_token,函数将返回该access_token的详细信息,返回Json对象,与APIClient类的request_access_token类似。
                """
        r = weibo._http_post('%s%s' % (self.auth_url, 'get_token_info'), access_token = at)
        current = int(time.time())
        expires = r.expire_in + current
        remind_in = r.get('remind_in', None)
        if remind_in:
            rtime = int(remind_in) + current
            if rtime < expires:
                expires = rtime
        return weibo.JsonDict(expires=expires, expires_in=expires, uid=r.get('uid', None))

    def set_uid(self, uid):
        self.uid = uid


TOKEN_FILE = 'token-record.log'
def load_tokens(filename=TOKEN_FILE):
    acc_tk_list = []
    try:
        filepath = os.path.join(os.path.dirname(__file__), filename)
        f = open(filepath)
        acc_tk_list.append(f.readline().strip())
        print "===> Get the access_token from file token-record.log : ", acc_tk_list[0]
    except IOError:
        print "===> File token-record.log does not exist."
    f.close()
    return acc_tk_list


def dump_tokens(tk, filename=TOKEN_FILE):
    try:
        filepath = os.path.join(os.path.dirname(__file__), filename)
        f = open(filename, 'a')
        f.write(tk)
        f.write('\n')
    except IOError:
        print "===> File token-record.log does not exist."
    f.close()
    print "===> The new access_token has been written to file token-record.log."


def get_client(appkey, appsecret, callback):
    client = myAPIClient(appkey, appsecret, callback)
    at_list = load_tokens()
    if at_list:
        access_token = at_list[-1]
        r = client.request_access_token_info(access_token)
        expires_in = r.expires_in
        print "===> The access_token's expires_in : %f" % expires_in
                #授权access_token过期
        if r.expires_in <= 0:
            return None
        client.set_uid(r.uid)
    else:
        auth_url = client.get_authorize_url()
        print "===> auth_url : " + auth_url 
        print """===> Note! The access_token is not available, you should be authorized again. Please open the url above in your browser, 
then you will get a returned url with the code field. Input the code in the follow step."""
        code = raw_input("===> input the retured code : ")
        r = client.request_access_token(code)
        access_token = r.access_token
        expires_in = r.expires_in
        print "===> the new access_token is : ", access_token
        dump_tokens(access_token)
    client.set_access_token(access_token, expires_in)
    client.set_uid(r.uid)
    return client

保存为initclient.py,放入initclient文件夹里(新建的)。 在文件夹里,新建一个没有内容的initpy文件和一个token-record.log文件。后者里的内容下面再说。 新建send_weibo.py文件,内容如下:

#! /usr/bin/python

from initclient import initclient
import time

APP_KEY = '2024******'
APP_SECRET = '91a57******'
#开放平台的应用信息里查看以上两个APP信息

CALL_BACK = 'http://bingbingrobot.sinaapp.com/'

def run():
        #调用initclietn模块创建授权的client对象
    client = initclient.get_client(APP_KEY, APP_SECRET, CALL_BACK)
    if not client:
                return

        #根据用户输入内容发微博
    while True:

        content = “You are brilliant at  ” + time.ctime() + “ !”
               #因为之后要设置定时重复发送,微博反垃圾系统会把重复发送相同内容的账号冻结,于是加入当前时间。
        if content:
            client.statuses.update.post(status=content)
            print "Send succesfully!"
            break;
        else:
            print "Error! Empty content!"


if __name__ == "__main__":
    run()

文件编写完成后,按f5运行两个有内容的py文件,可能会出现格式、编码和import问题。IDLE会帮助解决前面两个问题,import问题是因为缺少微博的SDK文件。

在terminal中输入:

sudo apt-get install python-pip

安装pip之后,再输入:

pip install sinaweibopy

试运行send_weibo.py文件,成功的话便可以设置定时重复发送的计划。在terminal输入:

sudo crontab –e

在编辑界面输入:

*/10 * * * * python send_weibo.py

然后按ctrl+x保存y,回车并退出。

这就是爱爱!


歌手完全看不懂上边写什么,也无法验证上边代码的真实性。但他心里对爸爸的敬仰之情更加浓烈。他写过一首歌,歌颂爸爸叫《大地》。曲已经不知在哪里了,也没有copy,也没有发行,所以不知道他是不是抄别人的:

但日落日出永没变迁。

这就是爱爱!

歌手一直没有说自己叫什么名字,大概是怕被人人肉吧。

写在 June 13, 2015