文章来源于:http://www.iplaysoft.com/nextcloud.html

Nextcloud 是一个免费专业的私有云存储网盘「开源」项目,可以让你简单快速地在个人/公司电脑、服务器甚至是树莓派等设备上架设一套属于自己或团队专属的云同步网盘,从而实现跨平台跨设备文件同步、共享、版本控制、团队协作等功能。

 

Nextcloud 跨平台支持 Windows、Mac、Android、iOS、Linux 等平台,而且还提供了「网页版」以及 WebDAV 形式访问,因此你几乎可以在任何电脑、手机设备上都能轻松获取和访问你的文件文档。

[ Nextcloud iPhone版截图 ]

另外,Nextcloud 还支持 API 和插件扩展,用户可以通过安装各种「插件」来增强网盘的功能,比如 Markdown 编辑器、笔记、日历、任务列表、音乐播放器、文档编辑等等。

由于是自建的网盘,因此只要你的设备性能和空间充足,那么用起来几乎没有任何限制。唯一的门槛,就是在安装和配置 Nextcloud 服务端时需要一点点的折腾。

Nextcloud 网盘Nextcloud 网页版界面截图

Nextcloud 服务端使用 PHP+MySQL 的经典组合,如果你有过建站经验,那么可以非常简单地在 VPS 服务器或个人电脑上架设并运行起来,因为 Nextcloud 就像搭建一个 WordPress 博客那样简单。官方推荐在 Linux  (如 Ubuntu 或 CentOS) 系统下搭建服务器端,会比 Windows 相对稳定些。

对于新手来说,具体的难点应该在于「如何搭建 PHP 和 MySQL 的运行环境」,网上太多太多相关的教程了,大家善用搜索吧,这里就不细说了。如果你打算用 Windows 作为服务器端,那么可以通过 WAMP、XAMPP 等工具来“一键”搭建 PHP+MySQL 环境。

Nextcloud 与 ownCloud 的区别

细心的网友可能会发现,ownCloud 和 Nextcloud 无论的功能、外观甚至是官网都很相似,那么它们到底有什么关系,又有什么区别?

其实,ownCloud 已经被一家德国公司收购了,由于其整体过于追求“商业化”,可能与创始开发团队的理念不合,当然还有其他各种各样的因素吧 (众说纷纭),最终创始团队成员出走另起炉灶了,在 ownCloud 的基础上开辟出一个新的分支,重新打造一款全新的网盘——它就是今天的 Nextcloud。

作为新生儿的 Nextcloud,可以看作是 ownCloud 的下一代后续版本,它修复了更多的 bug 、支持更多的平台、并且也加入很多 ownCloud 没有的新特性,而且依然保持开源免费,所以,考虑到后续的维护升级,大家应该知道怎么选了吧。

总结:

通过 Nextcloud 可以轻松自建一套比较完善的私人网盘,多平台的客户端,加上开源免费的特性,无论是个人使用,还是公司/团队集体使用,都基本能满足各种办公与文件存储或备份等需求。

作为“站在巨人的肩膀上”走过来的“继任者”,Nextcloud 相比 ownCloud 更加的成熟,比如插件支持、多用户等特性。如果你厌烦了到处找那些不靠谱的网盘“寄人篱下”,还真不妨考虑给自己亲手为数据建一个家吧。

相关文件下

本文转自http://www.jianshu.com/p/c81262593c88

本文源码已经全部公开在这里,欢迎大家到Github上fork喔。

前言

笔者本来并没有写攻略的习惯,因为在Google上找到的教程大多数都比较靠谱,没有必要自己仿照他们的重新写一遍。但是这几天为了实验室一个要上线的项目折腾了几天的微信后台开发,意识到了大多数网络上的教程都是抄来抄去,甚至连代码中的错误都一模一样,作者们似乎都没有自己测试过。因此决定记录一下最简单的微信后台开发方法。本文采用Python语言,笔者也不是非常熟悉,正在学习的过程中,用php或者java做后台都可以,原理应该都差不多,也许读了本文就不需要再去读微信公众平台开发者文档了(还是建议读一下)。

闲话少说,我们开始介绍整个流程。申请公众平台并且开启开发者模式应该是比较容易的,所以在这里不再赘述,让我们直接进入配置服务器的阶段。

后台服务器的配置

点击修改配置,我们看到微信平台要求我们提供服务器地址URL,令牌Token和EncodingAESKey才可以开启服务器。对于还没有服务器的同学,可以申请一个新浪云sae调用他们的服务器地址(免费的,功能也还不错)。

简单注册之后,可以创建一个新应用,语言选择Python2.7。托管代码的方式有git和SVN供选择,笔者选择的是后者(因为从来没有用过觉得好新奇),使用git比较熟练的同学也可以使用前者,管理起来应该比较方便。当然了,选择SVN可以同时管理多个版本,并且新浪云还内嵌了在线编辑器,方便了很多。

创建默认版本1,就可以得到一个默认版本以及你的urlhttp://1.xxxx.applinzi.com(但是这个url可能和你要提供给微信的url不一样),其中xxxx代表你的web应用名称。点击“编辑代码”,可以看到默认的代码文件是index.wsgiconfig.yaml。下面我们为了能够让微信后台验证我们的服务器地址,我们需要添加一些代码。

config.yaml文件中,在name和version之下添加代码

libraries:
- name: webpy 
  version: "0.36"
- name: lxml
  version: "2.3.4"

可以看出我们将要调用webpy和lxml包。接下来我们更改index.wsgi中所有的代码如下

#coding: UTF-8
import os

import sae
import web

from weixinInterface import WeixinInterface

urls = (
'/weixin','WeixinInterface'
)

app_root = os.path.dirname(__file__)
templates_root = os.path.join(app_root, 'templates')
render = web.template.render(templates_root)

app = web.application(urls, globals()).wsgifunc()        
application = sae.create_wsgi_app(app)

其中我们相当于把我们的服务器地址设在了http://1.xxxx.applinzi.com/weixin(这也就是微信后台所需要提供的服务器地址)。注意到,我们这里提到了一些其它的文件,比如'templates''WeixinInterface'。接下来就在代码编写页面创建空文件夹templates虽然我们暂时用不到,但是之后文件夹中将会放上.xml文件方便我们在调用不同的后台回复方式。

同时创建weixinInterface.py文件,注意,不是上面所提到的WeixinInterface,有大小写区别(当然你可以随便起一个喜欢的名字),这个文件中将调用名为后者的类,所以请不要弄混。
创建该文件之后我们需要在其中添加GET方法从而可以验证Token验证服务器。

# -*- coding: utf-8 -*-
import hashlib
import web
import lxml
import time
import os
import urllib2,json
from lxml import etree

class WeixinInterface:

    def __init__(self):
        self.app_root = os.path.dirname(__file__)
        self.templates_root = os.path.join(self.app_root, 'templates')
        self.render = web.template.render(self.templates_root)

    def GET(self):
        #获取输入参数
        data = web.input()
        signature=data.signature
        timestamp=data.timestamp
        nonce=data.nonce
        echostr=data.echostr
        #自己的token
        token="YourToken" #这里改写你在微信公众平台里输入的token
        #字典序排序
        list=[token,timestamp,nonce]
        list.sort()
        sha1=hashlib.sha1()
        map(sha1.update,list)
        hashcode=sha1.hexdigest()
        #sha1加密算法        

        #如果是来自微信的请求,则回复echostr
        if hashcode == signature:
            return echostr

这里的YourToken可以随便起一个喜欢的名字,只要和微信公众平台后台服务器配置那里输入的Token一样就可以了。现在基本就已经配置完毕了,可以保存了之后回到微信后台界面,输入URL和Token,并且随机生成一个明文Key,服务器配置应该就可以通过了。

如果显示Token验证失败,可能是代码问题,请到你的应用网址http://1.xxxx.applinzi.com查看log判断代码错误位置。一般可能是由于缩进导致的错误。

实现最简单的后台回复功能

在微信后台开发者文档中我们可以看到,回复消息的时候我们有多种可选方式,比如文本消息,图片消息,图文消息,语音消息和视频消息。笔者还没有测试过所有的,现在只测试了文本消息的回复,其它的都大同小异。在文档中给出了相应的.xml文件代码,稍加修改就可以适用。

我们先来实现一个最简单的功能,就是重复发送者的消息。我们先在刚刚创建的空文件夹templates中创建文件reply_text.xml并且在里面增加代码

$def with (toUser,fromUser,createTime,content)
<xml>
<ToUserName><![CDATA[$toUser]]></ToUserName>
<FromUserName><![CDATA[$fromUser]]></FromUserName>
<CreateTime>$createTime</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[$content]]></Content>
</xml>

这种封装方式是webpy中的,可以方便我们在主程序中调用。从第二行开始的代码则是在开发者文档中给出的。

我们回到主程序weixinInterface.py,在class中再添加一个POST方法(和GET方法同缩进),代码如下

def POST(self):        
    str_xml = web.data() #获得post来的数据
    xml = etree.fromstring(str_xml)#进行XML解析
    content=xml.find("Content").text#获得用户所输入的内容
    msgType=xml.find("MsgType").text
    fromUser=xml.find("FromUserName").text
    toUser=xml.find("ToUserName").text
    return self.render.reply_text(fromUser,toUser,int(time.time()), u"我现在的功能可以重复你的消息 :"+content)

这段代码中显然我们没有处理我们得到的消息,而是直接获得之后就返回给对方。如果我们想设置口令,返回给用户特定消息怎么办?可以将代码修改如下

def POST(self):        
    str_xml = web.data() #获得post来的数据
    xml = etree.fromstring(str_xml)#进行XML解析
    msgType=xml.find("MsgType").text
    fromUser=xml.find("FromUserName").text
    toUser=xml.find("ToUserName").text
    if msgType == 'text':
        content = xml.find("Content").text
        if content == 'help':
            return self.render.reply_text(fromUser, toUser, int(time.time()), "随便看看?(对不起我功能有限QAQ)")
        else:
            return self.render.reply_text(fromUser, toUser, int(time.time()), "哎呀出错了 输入个help看看如何正确的调戏我?")

这里的处理相当于判断了发送者的消息类型,如果是'text',又是help那么就输出 随便看看?(对不起我功能有限QAQ),其它情况输出 哎呀出错了 输入个help看看如何正确的调戏我?。这里建立口令的方法非常简单,大家可以随心所欲不逾矩。

仿照上面的方法,也就不难设置图文消息的回复了。回复图片、语音、视频需要MediaID,可能需要调用access_token,笔者没有尝试,这里也就先不表。

设置欢迎用户消息

当有用户订阅了公众号之后,我们需要设置回复模版。和上面相似的是,我们回复的仍然是文本消息,但是需要我们判断接受的消息不再是用户输入的文本Text而是一个Event,因此我们需要添加对于Event事件的代码。

if msgType == 'text':并列,可以继续添加下列代码

if msgType == 'event':
    if xml.find("Event").text == 'subscribe':#关注的时候的欢迎语
        return self.render.reply_text(fromUser, toUser, int(time.time()), u"谢谢你的关注,输入help看看如何正确的调戏我")

这样就可以实现发送欢迎消息的功能了。

在线编辑器下的代码缩进很容易错误,所以建议大家可以用PyCharm先把代码同步到本地再处理代码(直接从命令行调SVN版本当然也是可以的)。如果出现了错误,请利用应用网页的日志来进行调试。

还有别的问题欢迎留言给我一起讨论。

本文参考了使用python一步一步搭建微信公众平台一文。修改了其中少许的代码错误。

作者:木子麦麦
链接:http://www.jianshu.com/p/c81262593c88
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

《跳出思维的坑》精彩书摘!

 不管你要的是什么,如果没能在三十岁时迎接到转折点,那么到了四十岁一切将会变得更加困难,等到五十岁时一切都将变得不可能。
  也就是说,无所事事地度过三十岁,就等于把人生给你的最好机会给白白地、原封不动地浪费掉了。
未来从三十岁开始
人们常说:“人生从40 岁开始!”那么为了能从40岁开始人生,30 岁以前就要做好准备。所有事物的开始都需要事前准备,所以30 岁就应该是40 岁以及往后人生的准备时期。
我们听说过很多40岁以后开始成功的人。比如,喊出“Every Day Low Price! ”的口号,受尽千辛万苦直到44岁才转入零售业,最终成为《财富》杂志评选的全球最大规模企业———“沃尔玛”的创始人山姆?沃尔顿;还有在历经无数的挑战与实验失败之后,终于在40岁时创建了汽车公司,直到现在一直都被认为是“美国汽车界尊严”的福特汽车创始人亨利?福特。他们的成功并非只是因为运气好,也不是上了年纪便自然而然成功的特殊人。山姆?沃尔顿在40 岁前历尽“千辛万苦”,而亨利?福特则是无数次的“挑战与实验失败”,正是这些修饰语暗示了他们的成功秘诀———为了能在40岁以后获得成功,他们都曾度过无比残酷的三十岁。
40 岁之前的人生是为了迎接华丽的40 岁而积累知识和经验的准备时期。现在在哪里做着什么事情,其实并不重要,只要你心中的梦想依然在触动着你(即使那是多么微不足道的梦想),那就为了实现那个梦想而努力吧!而这个准
备时期就是你的三十岁。
秃鹫是一种大约可以活70 年的禽类,在能活70 年这一点上,秃鹫和人类有着许多相似之处。但是,秃鹫在活了35 年以后,长长的喙就会变弯,翅膀也会变得异常沉重,再也无法自由地翱翔蓝天。如果一直这样下去,不采取任何补
救措施,最后肯定连动一动都会非常困难,以至于无法进食———没东西吃那就只能饿死了。那么秃鹫究竟是怎么挺过危机而生存下来,度过余生的呢?答案就在于残酷的自我变化。秃鹫会经历一次自我更新过程,那些年老的秃鹫会飞到高高的山顶上,用喙啄坚硬的岩石,靠这种方式使那些都快碰到胸口、又弯又长的喙脱落,然后长出崭新的喙;再用新长出来的喙,将指甲和羽毛一根接一根地拔下来———原本因为衰老下垂的羽毛和喙而托着沉重身子的秃鹫,就这样重新变得像鼎盛时期一样倍感轻松,直到可以再次飞翔。
秃鹫之所以能再次翱翔于蓝天,能再活30 年之久,其答案就在于痛苦的更新期。人类也是一样。一过四十,读书、学习都会变得不再那么轻松。这时候眼睛也花了,身不由己了。因此,人类必须像秃鹫一样,在三十岁的时候进行一次更新。如果这时不为三十岁以后的人生做投资,那你就将永远错过一生中唯一的

哪一个会触动你的软肋、撩拨你最敏感的神经?

你周末摊在床上的时候,你的对手在看书;

你准备放弃竞争,不想努力的时候,你的仇人在磨刀;

闺蜜在减肥的时候,你死死的捂住棉裤腰;

你说自己不行的时候,隔壁老王在练腰

我们必须不断学习,否则我们将被学习者超越!

来源:https://zhuanlan.zhihu.com/p/24412945

1、404BUS(可访问googole,googole学术,维基,bing)

谷歌学术_谷歌_维基百科_搜索引擎服务提供



2、在线工具(在线工具

3、快搜(快搜 – 搜索快人一步

4、学术搜索(学术搜索 – 站在巨人的肩膀上

5、图片搜索(图片搜索 – 让图片搜索更简单

6、磁力搜索(磁力搜索

7、数据搜索(数据搜索 – 让数据搜索更简单

8、求职搜索(职位搜索 – 更快找到好工作!