豪翔天下

Change My World by Program

0%

![](http://7xnc86.com1.z0.glb.clouddn.com/the-difference-of-frame-and-
framework_0.jpg)

该文章是我之前在麦库里收藏的,但不知为何现在已找不到原文链接了,网上都是些转载文章,还不完整。如果作者能看到,希望作者可以联系我。为使文章结构更清晰,下文稍
有改动。

架构和框架的区别

笔者发现,人们对软件架构存在非常多的误解,其中一个最为普遍的误解就是:将架构和框架(Framework)混为一谈。本文阐述了它们的区别。算是对思辨成果的一个
应用吧。一图胜千言,下图切中肯綮地点出了架构和框架的区别。一句话,框架是软件,架构不是软件。

框架是一种特殊的软件,它并不能提供完整无缺的解决方案,而是为你构建解决方案提供良好的基础。框架是半成品。典型地,框架是系统或子系统的半成品;框架中的服务可以被最终应用直接调用,而框架中的扩展点是供应用开发人员定制的“可变化点”。

软件架构不是软件,而是关于软件如何设计的重要决策。软件架构决策涉及到如何将软件系统分解成不同的部分、各部分之间的静态结构关系和动态交互关系等。经过完整的开发过程之后,这些架构决策将体现在最终开发出的软件系统中;当然,引入软件框架之后,整个开发过程变成了“分两步走”,而架构决策往往会体现在框架之中。或许,人们常把架构和框架混为一谈的原因就在于此吧。

理解了本图,我们就很容易理解Frank Buschmann等人在《面向模式的软件体系结构(第一卷)》中为框架所下的定义了,其中也提到了框架和架构的关系:
_框架是一个可实例化的、部分完成的软件系统或子系统,它为一组系统或子系统定义了架构,并提供了构造系统的基本构造块,还为实现特定功能定义了可调整点。在面向对象环境中,框架由抽象类和具体类组成_。(A framework is a partially complete software (sub-) system that is intended to be instantiated. It defines the architecture for a family of (sub-) systems and provides the basic building blocks to create them. It also defines the places where adaptations for specific functionality should be made. In an object-oriented environment a framework consists of abstract and concrete classes.)

在以前经常和同事、朋友,甚至是合作伙伴之间进行一些技术上的交流,很多时候他们给我的印象是软件“架构”和“框架”被混为一谈,而我也曾经经历过这个阶段。在理解上
从模糊混淆到有所认识是需要投入足够的时间来进行理解的。软件“架构”和“框架”是两个不同的概念,但它们也是相互关联的。

软件框架是一特殊的软件,由实际的代码构建而成,是软件系统、子系统的半成品。软件框架为具体的解决方案提供了基础,提供了基础服务和可扩展点,同时软件框架也建立了一些约束,开发人员在此基础上进行特定业务功能的定制开发。例如,在J2EE企业级应用程序开发中,经常使用struts+spring+hibernate来搭建一个基本的项目结构,在没有其他特殊系统需求的前提下,_这就是一个软件框架_。

软件架构是引导如何设计软件框架的重要决策。它决定了软件系统如何划分,在一定程度上描述了被划分的各个部分之间的静态、动态关系。软件架构的决策体现在软件系统的框架中。

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。可以说,一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法,它为构件复用提供了上下文(Context)关系。因此构件库的大规模重用也需要框架。

构件领域框架方法在很大程度上借鉴了硬件技术发展的成就,它是构件技术、软件体系结构研究和应用软件开发三者发展结合的产物。在很多情况下,框架通常以构件库的形式出
现,但构件库只是框架的一个重要部分。框架的关键还在于框架内对象间的交互模式和控制流模式。

框架比构件可定制性强。在某种程度上,将构件和框架看成两个不同但彼此协作的技术或许更好。框架为构件提供重用的环境,为构件处理错误、交换数据及激活操作提供了标准
的方法。

应用框架的概念也很简单。它并不是包含构件应用程序的小片程序,而是实现了某应用领域通用完备功能(除去特殊应用的部分)的底层服务。使用这种框架的编程人员可以在一
个通用功能已经实现的基础上开始具体的系统开发。框架提供了所有应用期望的默认行为的类集合。具体的应用通过重写子类(该子类属于框架的默认行为)或组装对象来支持应
用专用的行为。

应用框架强调的是软件的设计重用性和系统的可扩充性,以缩短大型应用软件系统的开发周期,提高开发质量。与传统的基于类库的面向对象重用技术比较,应用框架更注重于面
向专业领域的软件重用。应用框架具有领域相关性,构件根据框架进行复合而生成可运行的系统。框架的粒度越大,其中包含的领域知识就更加完整。

框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟
的,不断升级的软件。

框架目前还没有统一的定义,其中Ralph Johnson所给出的定义基本上为大多数研究人员所接受:

一个框架是一个可复用设计,它是由一组抽象类及其实例间协作关系来表达的 【Johnson 98】。

这个定义是从框架内涵的角度来定义框架的,当然也可以从框架用途的角度来给出框架的定义:

一个框架是在一个给定的问题领域内,一个应用程序的一部分设计与实现【Bosch 97】。

从以上两个定义可以看出,框架是对特定应用领域中的应用系统的部分设计和实现的整体结构。_框架将应用系统划分为类和对象,定义类和对象的责任,类和对象如何互相协作
,以及对象之间的控制线程。_这些共有的设计因素由框架预先定义,应用开发人员只须关注于特定的应用系统特有部分。框架刻画了其应用领域所共有的设计决策,所
以说框架着重于设计复用,尽管框架中可能包含用某种程序设计语言实现的具体类。

一个基于框架开发的应用系统包含一个或多个框架,与框架相关的构件类,以及与应用系统相关的功能扩展。与应用系统相关的扩展包括与应用系统相关的类和对象。应用系统可
能仅仅复用了面向对象框架的一部分,或者说,它可能需要对框架进行一些适应性修改,以满足系统需求。

面向对象的框架作为一种可复用的软件,在基于框架的软件开发过程中会涉及到框架的开发和利用两个方面的工作。框架的开发阶段在于产生领域中可复用的设计。该阶段的主要
结果是框架以及与框架相关的构件类。该阶段的一个重要活动是框架的演变和维护。象所有软件一样,框架也易于变化。产生变化的原因很多,如应用出错,业务领域变化,等等

不论是哪一种技术,最终都是为业务发展而服务的。从业务的角度来讲。首先,框架的是为了企业的业务发展和战略规划而服务的,他服从于企业的愿景(vision);其次
,框架最重要的目标是提高企业的竞争能力,包括降低成本、提高质量、改善客户满意程度,控制进度等方面。最后,框架实现这一目标的方式是进行有效的知识积累。软件开发
是一种知识活动,因此知识的聚集和积累是至关重要的。框架能够采用一种结构化的方式对某个特定的业务领域进行描述,也就是将这个领域相关的技术以代码、文档、模型等方
式固化下来。

详细介绍一下框架的作用

一、框架要解决的问题

框架要解决的最重要的一个问题是技术整合的问题,在J2EE的框架中,有着各种各样的技术,不同的软件企业需要从J2EE中选择不同的技术,这就使得软件企业
最终的应用依赖于这些技术,技术自身的复杂性和技术的风险性将会直接对应用造成冲击。而应用是软件企业的核心,是竞争力的关键所在,因此应该将应用自身的设计和具体的
实现技术解耦。这样,软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响。

要理解这一点,我们来举一些例子:

一个做视频流应用的软件企业,他为电广行业提供整体的解决方案。他的优势在于将各种各样的视频硬件、服务器、和管理结合起来,因此他扮演的是一个集成商的角色。因此他
的核心价值在于使用软件技术将不同的硬件整合起来,并在硬件的整合层面上提供一个统一的管理平台。所以他的精力应该放在解决两个问题:

如何找到一种方法,将不同的硬件整合起来,注意,这里的整合并不是技术整合,而是一种思路上的整合。_首先要考虑的绝对不是要使用什么技术,而是这些硬件需要提供哪些
服务,需要以什么样的方式进行管理_。因此,这时候做的事情实际上是对领域进行建模。例如,我们定义任何一种硬件都需要提供两种能力,一种是统一的管理接口,用于对所
有硬件统一管理;另一种是服务接口,系统平台可以查询硬件所能够提供的服务,并调用这些服务。所以,设计的规范将会针对两种能力进行。

另一个问题是如何描述这个管理系统的规范。你需要描述各种管理活动,以及管理中所涉及的不同实体。因为管理系统是针对硬件的管理,所以它是构架在硬件整合平台之上的。

在完成业务层面的设计之后,我们再来看看具体的技术实现。光有规范和设计是不够的,我们还需要选择一个优秀的技术。由于是对不同硬件的整合,我们想到采用Java提供
的JMX技术。JMX技术适合用来进行系统整合,它定义了一个通用的规范,并给出了远程管理端口的一些默认实现。JMX已经经过了实践的检验,不少的应用服务器都采用
了以JMX为基础的结构,例如有名的JBoss。JMX已经是一个很好的开始了,但是我们还需要在JMX的基础上再做一些工作。

二、什么要用框架?

因为软件系统发展到今天已经很复杂了,特别是服务器端软件,设计到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作,你只
需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟,稳健的,他可以处理系统很多细节问题,比如,事物处理,安全性,数据流控制等问题。还有框架一般都经过很多
人使用,所以结构很好,所以扩展性也很好,而且它是不断升级的,你可以直接享受别人升级代码带来的好处。

框架一般处在低层应用平台(如J2EE)和高层业务逻辑之间的中间层。软件为什么要分层?为了实现“高内聚、低耦合”。把问题划分开来各个解决,易于控制,易
于延展,易于分配资源…总之好处很多啦。

三、为什么要进行框架开发?

框架的最大好处就是重用。面向对象系统获得的最大的复用方式就是框架,一个大的应用系统往往可能由多层互相协作的框架组成。

由于框架能重用代码,因此从一已有构件库中建立应用变得非常容易,因为构件都采用框架统一定义的接口,从而使构件间的通信简单。

框架能重用设计。它提供可重用的抽象算法及高层设计,并能将大系统分解成更小的构件,而且能描述构件间的内部接口。这些标准接口使在已有的构件基础上通过组装建立各种
各样的系统成为可能。只要符合接口定义,新的构件就能插入框架中,构件设计者就能重用构架的bsp;
框架还能重用分析。所有的人员若按照框架的思想来分析事务,那么就能将它划分为同样的构件,采用相似的解决方法,从而使采用同一框架的分析人员之间能进行沟通。

采用框架技术进行软件开发的主要特点包括:

  • 领域内的软件结构一致性好
  • 建立更加开放的系统
  • 重用代码大大增加,软件生产效率和质量也得到了提高
  • 软件设计人员要专注于对领域的了解,使需求分析更充分
  • 存储了经验,可以让那些经验丰富的人员去设计框架和领域构件,而不必限于低层编程
  • 允许采用快速原型技术
  • 有利于在一个项目内多人协同工作
  • 大粒度的重用使得平均开发费用降低,开发速度加快,开发人员减少,维护费用降低,而参数化框架使得适应性、灵活性增强

四、与框架相关的概念

1\. 白盒与黑盒框架

框架可分为白盒(White-Box)与黑盒(Black-Box)两种框架。

基于继承的框架被称为白盒框架。所谓白盒即具备可视性,被继承的父类的内部实现细节对子类而言都是可知的。利用白盒框架的应用开发者通过衍生子类或重写父类的成员方法来开发系统。子类的实现很大程度上依赖于父类的实现,这种依赖性限制了重用的灵活性和完全性。但解决这种局限性的方法可以是只继承抽象父类,因为抽象类基本上不提供具体的实现。白盒框架是一个程序骨架,而用户衍生出的子类是这个骨架上的附属品。

基于对象构件组装的框架就是黑盒框架。应用开发者通过整理、组装对象来获得系统的实现。用户只须了解构件的_外部接口_,无须了解内部的具体实现。另外,组装比继承更为灵活,它能动态地改变,继承只是一个静态编译时的概念。

在理想情况下,任何所需的功能都可通过组装已有的构件得到,事实上可获得的构件远远不能满足需求,有时通过继承获得新的构件比利用已有构件组装新构件更容易,因此白盒
和黑盒将同时应用于系统的开发中。不过白盒框架趋向于向黑盒框架发展,黑盒框架也是系统开发希望达到的理想目标。

2\. 热点、食谱以及好莱坞原则

成功的框架开发需要确定领域专用的“热点” (Hot spot)。应用开发者在框架的基础上进行开发,只须扩展框架的某些部分,_“热点”就是在应用领域的一种扩展
槽,开发者根据自己的需要填充这些扩展槽_。“热点”使框架具有灵活性,如在具体的实现中,扩展槽可以被看成是一些抽象类,开发者通过重写抽象方法获得具体实现。

“食谱” (Cookbook)就是描述如何使用框架方法的文档。在“食谱”中包含了许多“烹饪”方法,这些“烹饪”方法相当于一些具体的操作步骤,描述了为解决某一
专门问题如何使用框架的详细方法。框架的内部设计和实现细节通常不出现在“食谱”中。

框架的一个重要特征就是用户定义的方法经常被框架自身调用,而不是从用户的应用代码中调用。这种机制常称为“好莱坞原则”(Hollywood
Principle)或“别调用我们,我们会调用您”。

又搞了一天才搞好,主要原因是没看懂错误提示信息。

webhook:简单地说,使用webhook可以让每次在本地push到github上去后,让服务器自动pull下来,这样就不用每次提交然后手动pull的过程了。

下面是详细配置过程(基于laravel):

  1. 首先,得在laravel里添加一个路由,然后指向某个文件,例如路由为’/webhook’,然后指向PHP文件为’webhook.php’,然后在该文件内添加如下内容,该文件即是服务器响应Github webhook请求的文件:

     <?php
         $dir = '/var/www/test';
         echo shell_exec("cd /var/www/test");
         echo shell_exec("sudo git pull -f git@github.com:haoflynet/guake.git 2>&1");
     ?>
    
  2. 用户权限问题,由于执行该PHP文件的用户是apache的默认用户www-data,所以我在上面的命令中使用的是’sudo’,这样可以不用给www-
    data用户生成ssh,然后又出现各种混乱的问题。但是www-
    data又怎么免输密码执行git命令呢,还好linux提供了这么一个方面的操作,在’/etc/sudoers’文件里有如下内容:

     # User privilege specification
     root ALL=(ALL:ALL) ALL  # 默认的root用户可以在所有平台使用所有权限
     www-data ALL=NOPASSWD:/usr/bin/git # 这里给www-data赋予免密码执行git的权限
    
  3. 在仓库中添加钩子,执行vim .git/hooks/post-receive,然后添加如下内容,最后还要加入可执行权限:

     GIT_WORK_TREE=/var/www git checkout -f
    
  4. 在Github上进行设置

    如图所示添加webhook,设置中可以选择各种出发事件event,一般默认是push事件,在Payload
    URL中设置自己刚才所设置的URL,最后添加即可完成。

  5. 测试
    测试钩子的时候,可以直接在Github上面看到执行的列表,还可以看到每一个POST的详细信息以及响应信息:

TroubleShooting:

  • Laravel 5中如果要设置webhook,该POST路由不能使用CSRF

  • Django同样要禁用csrf:

      import os
      from django.views.decorators.csrf import csrf_exempt
      from django.http import HttpResponse
    
      @csrf_exempt
      def webhook(request):
          os.system('cd /var/www/admin')
      os.system('git pull -f git@github.com:haoflynet/admin.git 2>&1')
          return HttpResponse('ok')
    

Android API Levels版本

Android Studio 的使用

Gradle和Gradle Plugin对应关系

生成APK/ABB文件

  • 生成APK文件: Build -> Build Bundles/APK(s) -> Build APK(s)

  • 生成能上传到google playstore的签名了的bundle文件(.abb格式)

    • Build -> Generate Signed Bundle/APK,生成的时候记得勾选Export encrypted key for enrolling published apps in Google Play App Signing(导出的key的格式是pepk)

    • 如果是第一次上传,可以点击Create new生成一个新的keystore文件(一般会以.keystore或者.jks结尾)

    • 一个keystore可能包含多个alias的key,可以多次点击Create new来生成即可

    • 如果之前没有上传过google play console,那么在console里面直接新建一个release即可,不用先上传key这些

    • 如果之前已经上传了upload key certificate到google play console里面,那么必须用之前的来生成才行,否则上传会提示SHA-1指纹不一致。可以在后台查看Setup -> App Integrity -> Upload key certificate看是否有了,注意这里的Download certificate只是下载公钥,没啥用的。

    • 如果已经有上传证书并且丢失了的话,只能联系google重新生成一个了(注意是Upload key certificate,而不是App signing key certificate),在这里提交或者页面的contact our support team,下面有一些问题

      • Is your app enrolled in Play App Signing by Google Play? 选择Yes,然后选择I have an upload key-related issue,然后选择I lost my upload key,选这个。会提示你生成一个新的.pem格式的文件,并且会直接给你生成的命令

        1
        2
        keytool -genkeypair -alias upload -keyalg RSA -keysize 2048 -validity 9125 -keystore keystore.jks # 这条命令其实就是在Android studio里面Create new的功能
        keytool -export -rfc -alias upload -file upload_certificate.pem -keystore keystore.jks # 会生成PEM文件的
      • Is your app enrolled in Play App Signing by Google Play? 选择No,然后选择I lost my upload key,不要选这个,google说它不能重置,你必须创建新的app

    • 获取keystore的sha-1指纹: keytool -list -v -keystore {keystore_name} -alias {alias_name}

物理设备镜像到电脑

Settings -> Tools -> Device mirroring -> Enable mirroring of physical Android devices

模拟器里面实现震动

  • 目前能找到能行的方法只有在模拟器设置里面选择Virtual sensors -> Move,然后拖动X、Y、Z三个轴移动,不能太快也不能太慢

模拟器里面使用代理

1
2
# 执行下面命令然后重启模拟器即可
adb shell settings put global http_proxy $(ipconfig getifaddr en0):7890

Google Play Console的使用

  • 即使google play console审核通过了,且也被邀请加入测试了,也要等很久才能在app store里面搜索得到并且下载,可以直接搜索的
  • Activity log中可以查看最近的操作日志
  • 审核被拒: Please provide login credentials: 需要在Policy -> App content -> App access -> Manage 中添加Login Credentials
阅读全文 »

写这篇文章源于年前一个程序爱好者的QQ群里的一次讨论,很想说说自己的想法。以下是我们的聊天内容(本来想直接上传截图的,但是太小看不清,所以一字一字敲出来吧)

A:家里人给介绍一个工作,在一个效益很好的单位干文职
A即是主人公
A:我想,我以后不会再做程序方面的工作了
A:…可是我还是对PHP比较有兴趣
A:for($i=╯﹏╰; $i < 999999; $i++){ echo $i;}
B:这种工作应该不会太忙吧
我上场啦
A:是的
B:还不是可以在闲暇的时候写代码
A:家里人都想找个稳定的
让他们去找呗。。。
A:..我觉得 如果爱好 就要一心一意的
不同意,反正我爱好很多,如果一辈子只有一个爱好那多无聊呀
A:想了很久 真想 破釜沉舟!!
破釜沉舟这个词我是去年在决定不考研的时候用过,当时一下就把所有的书给卖了
C:那么问题来了
A:妈的 就是 不敢
D:。。。
C:到底应该是践行自己的目标呢?还是开一辈子挖掘机
不是蓝翔毕业能开好挖掘机吗,哈哈
D:亮点是不敢
有的人怕的是违反父命,有的人怕的是未知的人生
B:无法理解你们已经工作了的人
由于大人总是说我幼稚,所以有可能确实是我没去社会无法理解你们
A:要是敢了 我也不会这么说…
如果真的觉得自己不能勇敢一次,就没必要说出来了
A:现实!
A:马勒个B
E:我父母当年安排进入事业单位,年少轻狂,坚决不去,结果现在惨兮兮。。。
这是重点任务,只有经历过的,才有资格说话
D:不能反抗 那你就躺好姿势享受就是了
生活就像强奸,要么反抗要么就去享受;工作就像轮奸,您不行就让别人上 ;社会就像自慰,所有的都要靠自己的双手来解决
A:我不能说,如果我继续干PHP,以后能怎么样怎么样,但是现在就是选择
我知道,他们会说如果按照他们的干,以后能怎么样怎么样
A:我就是知道这些,才特别特别的纠结
A:就是选择if else,执行了,if下面就跟你没关系了
D:呵呵
E:惨兮兮怎么了,好歹自己选的
A:你后悔么?如果让你再选你怎么选?
E:有时候哭起来,说不后悔是假的。但是心里还是觉得,自己能选择还是好
这句话说到我心坎里来了
F:我就是听从了父母的安排,每天就像在等死一样!现在觉得我不能再坐以待毙!才开始自学网页方面的知识,虽然我不了解网页!但是我有学习的能力!
另一个例子出来了,无论怎样,看样子他已经找到了自己想要走的路了

虽然我还在上大学,但我已经体会到生活中有各种各样的if else,很多情况,我们只能选择一条路。但无论选择哪一条路,未来都是未知的,只是从过往的经验来看,总
有那么一条路要诱人一点。选择诱人的那条路无可厚非。但别人的现在并不一定会成为你的未来,既然都是未知的,为何不选择自己喜欢的那条路呢,既然都可能会后悔,你想想
选择哪一条路会更后悔呢?下面是罗伯特·弗罗斯特的一首诗,我们应该都听过:

黄色的林子里有两条路
很遗憾我无法同时选择两者
身在旅途的我久久站立
对着其中一条极目眺望
直到它蜿蜒拐进远处的树丛

我选择了另外的一条,天经地义
也许更为诱人
因为它充满荆棘,需要开拓
然而这样的路过
并未引起太大的改变

那天清晨这两条小路一起静卧在
无人踩过的树叶丛中
哦,我把另一条路留给了明天
明知路连着路
我不知是否该回头

我将轻轻叹息,叙述这一切
许多许多年以后:
林子里有两条路,我——
选择了行人稀少的那一条
它改变了我的一生

记得以前在wamp设置虚拟目录的时候都还挺简单的,干脆直接没有记录下来,但这次遇到一些坑,特记录于此。

系统环境:Windows 7 + WampServer2.5

注意事项:下面的步骤一定要参考其完整路径,切勿直接在资源管理器里进行搜索,因为在C:\wamp\bin\apache\apache2.4.9\conf目录下居然有一个original,应该是用来保存最原始的配置信息,对这里面的配置文件进行的更改并不会影响当前的使用。

配置过程:

  1. 首先在C:\\wamp\\bin\\apache\\apache2.4.9\\conf\\httpd.conf目录中找到下面两行:

    1
    2
    # Virtual hosts
    Include conf/extra/httpd-vhosts.conf # 去掉这一行的注释
  2. 然后仍然在该文件中找到监听端口的配置

    1
    2
    3
    4
    # Listen 12.34.56.78:80
    Listen 0.0.0.0:80
    Listen [::0]:80
    Listen 8080 # 这一行是自己添加的,我想要它监听8080端口
  3. 将vhost的配置文件C:\\wamp\\bin\\apache\\apache2.4.9\\conf\\extra\\httpd-vhosts.conf修改为如下(去掉原来的):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <VirtualHost *:80>
    DocumentRoot "c:/wamp/www"
    ServerName localhost
    ServerAlias localhost

    <Directory "c:/wamp/www">
    AllowOverride All
    Require local
    </Directory>

    </VirtualHost>
TroubleShooting
  • wamp局域网403 Forbidden解决方法: 出现在我想使用手机通过电脑分享的wifi网络访问电脑中的wamp服务。其实和linux一样,只是linux使用Allow from all,而windows使用Require all granted。解决方法如下:
    1.首先找到wamp的apache配置文件目录,我的在C:\\wamp\\bin\\apache\\apache2.4.9\\conf\\http.conf,然后打开它后找到,如下几行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # Each directory to which Apache has access can be configured with respect
    # to which services and features are allowed and/or disabled in that
    # directory (and its subdirectories).
    #
    # First, we configure the "default" to be a very restrictive set of
    # features.
    #
    <Directory />
    AllowOverride All
    #Order Deny,Allow # 注释掉
    Require all granted # 添加这一行
    </Directory>

    <VirtualHost *:8080>
    DocumentRoot "f:/workspace/laravel/public"
    ServerName localhost
    ServerAlias localhost
    <Directory "f:/workspace/laravel/public">
    AllowOverride All
    Require local
    </Directory>
    </VirtualHost>

    然后重启Apache即可

Django教程

Django常用项目结构以及cookiecutter-django

Django第三方库推荐

django-extensions: Django扩展库,有很多其他框架有但是Django没有的扩展

Python一直是我最喜欢的语言,在这个寒假打算认真学习一下Python的Web框架。在Django和Tornado之间我选择了前者,没有特别的原因,网上人云亦云的,肯定不会有一方离另一方差很远,我就直接去看了看Github上两个项目的活跃度,所以选择了前者。

应该说Django坚持自己造轮子,确实为开发者节约了不少的时间,我很看重它的扩展功能,packages数量十分丰富。Django采用的是最流行也是我最熟悉的MVC设计模式,虽然在之前的一个PHP(Laravel)项目中也是采用的MVC模式,但一直都没怎么吃透,始终在各层分离的时候不是很清晰,所以也可趁学习Django对MVC的概念进行强化。

Django另一个我特别喜欢的特性就是Application,它与Project的概念不同,一个APP就相当于一个功能模块,一个Project可以包含多个APP,一个APP可以同时被多个Project引用,App增加了代码的复用机会,提高了扩展性和松耦合性,Django中很多的packages都是以APP的形式存在的。

阅读全文 »

2013年1月7日注册微博至今已经发了1000条微博了。微博带给了我太多的改变,必须在这里感谢一下。

我承认,最先申请微博是因为某苍姓明星,第一个关注的是她,第二个关注的就是创新工场李开复。这两年,社会上发生了太多的事情,开心的不开心的,深沉的悲哀的,都已成
往事,但感谢微博,这些,我都没有错过。

在我眼里,微信和QQ更多的是熟人的圈子,而微博则更多是围绕着名人或者一个自己感兴趣的圈子。我关注的600人里,IT圈子的人就有300+。有了微博,我不像以前
那样在大学里按着学校的计划一步一步学,而是学得更有激情,了解到太多学校里可能连老师都不知道的东西。通过微博,我可以了解到在大城市里(我说的是互联网意识高的那
些城市)的程序员最近都在关注着什么,现在主流的技术是什么,虽然大多数我并不会去接触,但至少我要知道有这些东西,身处“互联网的浪潮”,如果连周围的东西都看不清
,又怎么能在浪潮之巅尽情弄潮呢!

微博有时也会让人迷失,无聊的时候一遍一遍的刷着,很多人就这样沉迷其中。我不排斥碎片化的消息,但既然是碎片化的消息为何不用碎片化的时间去对待它,而不是让碎片化
的消息来将我们原本的时间碎片化。

对于微博,现在有很多人唱衰,我不置可否。确实,由于言论审核以及对某些人的打击让微博少了很多的自由,我认为在打击谣言方面,确实是需要Z·F来管理,但是他们在做
这些事情的时候做得太不明不白了,很多公众根本就不知道它到底做了些什么,这,我也只能呵呵了。另外,微信的兴起,也让微博的地位颤抖了一下,但是我认为微信和微博本
身并不冲突,侧重点不同,谁都不可能完全取代谁。不过还好,目前看来确实看不到一种可以彻底颠覆微博或者微信模式的社交平台诞生,至少,国内没有。

总之,感谢微博!

说实话,这样一部片子,很不想跟它写观后感的,但由于辅导员布置的寒假任务需要有这一项,那我就勉为其难地写一写观感。毕竟,这部片子我很早就开始在微博上听到,并且
在8月份首播时也是天天晚上守着电视观看的。

首先,抛开其他的,从片子本身来说,这种大型纪录片还是非常令人震撼的,与浪潮之巅一样,能深深地让人体会到身处互联网时代的我们是有多么地幸运。全片分为十集:时代
、浪潮、能量、再构、崛起、迁徙、控制、忧虑、世界、眺望,向我们全面展示了信息时代的发展过程以及其当前的影响力。

我是一个90后,电脑系统从Windows Xp一直用到Windows 10,从老式的闪屏电脑到最新的高清平板电脑,从MTK国产手机到最新的MIUI手机,我统
统都经历过,深刻地体会到技术力量的不断推进给我们人类生活带来的方便和生活方式上带来的改进。我相信互联网正以改变一切的力量,在全球范围(以后也一定会扩展到外太
空去)掀起一场影响人类所有层面的深刻边个,人类正站在一个新时代到来的前沿。

纪录片中说,对于互联网,人类未知的远远大于已知的,但我认为,在互联网方面,人类未知的远远小于已知的,但人类未通过互联网创造的远远大于人类所有历史中所已知的。
我们不仅要理解互联网,体会互联网,更要使用互联网为未来创造,给人类带来更加深远的影响。

作为一名计算机专业的大学生,我深深地被这些改变所震撼。从各个新兴互联网公司的崛起,比如小米、淘宝、京东等让我们年轻人也看到了希望,互联网行业远没有饱和。微博
改变了新闻传播的方式,支付宝改变了金钱传播的方式,Coursera改变了教育的方式。当互联网产品越来越多地替代了现实生活中的事务时,我们就进入了互联网时代。
目前,内陆人们的互联网意识完全不及沿海地区的人们,可以预见,今后的互联网不仅会更多地渗透入我们的日常生活,还会渗透到各个地区,各个行业,实现真正的公平。

最后就说说我对这部片不满意的地方了,每次看到CCAV那欲说还休的嘴脸我也是醉了。片中多次出现长城这个镜头,让人难免联想到GFVV这个众所周知但又没人敢承认的
东西。据悉,全球仅有四个国家屏蔽了facebook、twitter等世界最大的几个社交网站,包括朝鲜,伊朗,叙利亚和其它国家。这些国家的ZF都深喑控制言论的
方法,将言论自由牢牢地控制在自己手上。互联网发展到今天,如果还要拿国情来当借口,那么总有一天这些国家会因为闭关锁国而没落。还记得中国的第一封跨洋电子邮件的内
容:Across the Great Wall we can reach every corner in thee world(越过长城,走向世界),而在某
些国家可能一封电子邮件也很难发出去,所以,即使是在互联网这个整个人类历史上最开放的阶段,也依然存在着不公平的现象,改变这种现象,需要的是我们新一代的计算机人

总之,这部纪录片让我们对互联网有了更加深刻的理解,互联网绝不仅是一场技术上的变革,而是一场社会变革,它势必会引领人类进入一个全新的时代。而我们计算机专业的学
生也应该有危机感,抱着终身学习的态度,务必让自己处于浪潮之巅。

看到知乎上一个问题:为什么有人说日本人冷漠?这是我特别喜欢的一个回答:

日本人有一颗,只要你不影响别人,随便你怎么变态的包容心,和不管自己怎么变态,都不能影响别人的责任感;
中国人有一颗,只要你和别人不一样,就觉得你需要教导的温暖爱心,和不管自己多么平庸,都要去影响教导别人的责任感。

我没去过日本,不知道日本人到底是怎么样的,所以这段话暂且抛弃国籍因素,至少我遇到的人,基本上都属于后者,而我自己更愿意做前者。

之前看日本电视剧《Legal High》,从第一季第一集开始我就一直在想,这样的电影到底在宣传一种什么样的价值观,还是纯粹的搞笑,古美门律师到底是好人还是坏
人呢?直到看到第二季的最后一集,我仿佛明白了一些。日本的电视剧并没有那么强烈刻意地去宣传一种价值观,而是非常微妙的在传达,让观众自己去领悟,自己去总结。

归根结底,是对人性的一种尊重。人也是一种动物,有自己的欲望,无论是对金钱还是对道德都一样,我从不否定。

我不愿强加自己的观点到别人身上去,只要不是自己所关心爱护的,只要不是关乎切身利益的,别人做什么,关我屁事。最讨厌的就是那种自以为自己的道理是正确的,并且并没
有从自己的那个道理中获得什么的人。

我献血我捐款,不是为了做个好人,也不是因为整个社会都觉得这样对我才去做,而是因为我想通过这样的方式帮助别人
我不给路边的乞丐钱财,不为别的,就是觉得他们太懒了
姓方的那个校长,我就诅咒他,妨碍社会进步,还让我无法自由上网。
很多热门事件我不发表意见,不为别人,因为我知道自己可能没有全面了解事实,当然我绝不是那种不会提意见的人,该说就说,该骂就骂
我也经常看那些心灵鸡汤,但只是看看而已,因为我知道,无论别人怎么走,无论马云怎么成功,即使我完全按照别人的生活方式、成长轨迹走,也不会成长为第二个他,当然我
也不想成为第二个他,要做就做最好的自己。

PS:以上观点只是个人吐槽,无关对错,无关善恶。

根据以往的经验,做规划最好是做一些能够量化的目标,这样会更加有行动力。但今年,我不打算这样做,很多时候我觉得我的大学过得太理性了,一点儿都不精彩,每天除了写
代码就是去学习如何写代码。我不想再每天都窝在寝室了,虽然现实让我不得不面对未来,但今年我想在大量的未知中体会后青春时代的精彩。所以今年,就围绕以下几个关键词

  • 实习:等了好久终于等到今天,终于可以验证这几年的学习成果了,终于可以用自己的双手为未来打拼了。
  • 减肥:额,说实话,我身高160体重70,但看起来其实不胖的,只是身体已经因为脂肪太多出现一些毛病了,所以今年必须狠下心了。
  • 健康:自打前年得了肾结石后就非常关注身体健康了,虽然我从来没想过要多长寿,今朝有酒今朝醉呗,但就目前看来再这样宅下去,我真正的人生还没开始就溘然长逝了。
  • 女朋友:采访过多位学长学姐,十有八九说大学最遗憾的事情就是没有谈恋爱。我不是别人都在谈恋爱我就去谈恋爱,也不是不想谈恋爱,是一直找不到那个人,希望今年能加一把劲。
  • 换装备:每次回家家人都强烈要求我去买几件成熟的衣服,而我却一直觉得衣服没穿烂就不用去买新的,而且衣服多了对于我这个重度选择困难患者简直是一种折磨,但是,毕竟该找工作了,还是换一换装备吧。
  • 说到做到:我一直自诩为一个重信用的人,不过总是答应了别人的事情到最后时间却有点畏惧了,归根结底是自己不够勇敢和太爱做承诺了,所以今后一定少说什么承诺,但每个承诺务必保证说到做到。正如漩涡鸣人:说到做到,这就是我的忍道!