小编Jen*_*ens的帖子

在Swift中实现可用初始化程序的最佳实践

使用以下代码,我尝试定义一个简单的模型类,它是可用的初始化器,它将(json-)字典作为参数.nil如果未在原始json中定义用户名,则应返回初始化程序.

1.为什么代码不能编译?错误消息说:

在从初始化程序返回nil之前,必须初始化类实例的所有存储属性.

这没有意义.我计划返回时为什么要初始化这些属性nil

2.我的方法是正确的,还是会有其他想法或共同模式来实现我的目标?

class User: NSObject {

    let userName: String
    let isSuperUser: Bool = false
    let someDetails: [String]?

    init?(dictionary: NSDictionary) {
        if let value: String = dictionary["user_name"] as? String {
            userName = value
        }
        else {
           return nil
        }

        if let value: Bool = dictionary["super_user"] as? Bool {
            isSuperUser = value
        }

        someDetails = dictionary["some_details"] as? Array

        super.init()
    }
}
Run Code Online (Sandbox Code Playgroud)

object-initializers swift

98
推荐指数
4
解决办法
2万
查看次数

无法理解整个OSGi网络生态系统

我是整个Java和OSGi世界的新手,我无法理解OSGi Web应用程序的生态系统.

更确切地说,我目前正试图了解生态系统的所有部分是如何相互关联的:

  • OSGi框架(例如Apache Felix,Equinox,Knoplerfish)
  • OSGi运行时(例如Spring DM Server,Pax Runner,Apache Karaf)
  • Web Extender(例如Pax Web Extender,Spring Web Extender)
  • Web容器(例如Apache Tomcat,Jetty)

为了让您直观地了解我对他们的关系的实际理解,请查看此图片:

alt text http://img253.imageshack.us/img253/1631/osgiwebenvironmentschem.png

据我所知,OSGi框架是OSGi规范的一个实现.运行时是一种分发,它在OSGi规范之上添加了额外的功能,例如日志记录.由于OSGi和Web容器(如Tomcat)的类路径机制似乎存在一些差异,因此您需要某种翻译器.这部分由"Web Extender"处理.

请你澄清一下这件事吗?我理解一切正确吗?

tomcat osgi equinox apache-felix

28
推荐指数
1
解决办法
8240
查看次数

Java:将对象转换为数组类型

我正在使用一个返回"对象"类型的普通对象的Web服务.调试清楚地表明在这个对象中有某种数组,所以我想知道如何将这个"对象"转换为数组(或类似的)?

我尝试了以下方法:

Collection<String> arr = (Collection<String>) values;
Vector<String> arr = (Vector<String>) values;
ArrayList<String> arr = (ArrayList<String>) values;
Run Code Online (Sandbox Code Playgroud)

但没有任何效果.我总是得到一个InvocationTargetException.

我究竟做错了什么?

编辑:

遗憾的是,我不得不删除显示Eclipse调试器输出的图像链接,因为它已不再可用.请不要错过为什么在答案中提到的图像不再存在了.

java

26
推荐指数
2
解决办法
12万
查看次数

JVM启动后Java类路径是最终的吗?

我最近读了很多关于Java类加载过程的内容.我经常遇到这样的文本,声称在运行时期间无法在类路径中添加类并在没有类加载器hackery(URLClassLoaders等)的情况下加载它们.

据我所知,类是动态加载的.这意味着它们的字节码表示仅在需要时加载并转换为java.lang.Class对象.

所以,在JVM启动后,不应该可以在类路径中添加JAR或*.class文件并加载这些类,只要它们尚未加载?(要清楚:在这种情况下,类路径只是文件系统上的文件夹."添加JAR或*.class文件"只是意味着将它们放在这个文件夹中.)

如果没有,这是否意味着在JVM启动时搜索类路径,并且找到的类的所有完全限定名称都缓存在内部"列表"中?

如果你能指出我的答案中的一些消息来源,你会很高兴.最好的SUN文档:Sun JVM Spec.我已阅读规范,但无法找到有关类路径的任何内容,以及它是否已在JVM启动时完成.

PS

这是一个理论问题.我只想知道是否有可能.我想实现没有任何实际意义.只有我对知识的渴望:)

java classpath classloader

22
推荐指数
2
解决办法
4851
查看次数

Google Calendar API v3 - 如何获取刷新令牌(Python)

我正在尝试编写一个Django应用程序,用于在特定的Google日历中创建事件.到目前为止,我已经成功了.只有一点问题:

我不知道如何使用google python客户端获取刷新令牌.

结果是,在我的令牌过期后,应用程序无法运行,我必须创建一个新令牌.如果我理解文档正确,那就是刷新令牌的来源.

访问令牌的生命周期有限,在某些情况下,应用程序需要在单个访问令牌的生命周期之外访问Google API.在这种情况下,您的应用程序可以获得所谓的刷新令牌.刷新令牌允许您的应用程序获取新的访问令牌.

Google文档(请参阅"基本步骤",第4节)

我的代码

import gflags
import httplib2

from apiclient.discovery import build
from oauth2client.file import Storage
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.tools import run

FLAGS = gflags.FLAGS

FLOW = OAuth2WebServerFlow(
    client_id=GOOGLE_API_CLIENT_ID,
    client_secret=GOOGLE_API_CLIENT_SECRET,
    scope=GOOGLE_API_CALENDAR_SCOPE,
    user_agent=GOOGLE_API_USER_AGENT)

storage = Storage(GOOGLE_API_CREDENTIAL_PATH)
credentials = storage.get()
if credentials is None or credentials.invalid == True:
  credentials = run(FLOW, storage)

http = httplib2.Http()
http = credentials.authorize(http)

service = build(serviceName='calendar', version='v3', http=http,
   developerKey=GOOGLE_API_DEVELOPER_KEY)

event = {
    [... Dictionary with all the necessary …
Run Code Online (Sandbox Code Playgroud)

python google-calendar-api google-api-python-client

18
推荐指数
3
解决办法
8340
查看次数

Amazon Product Advertising API使用Java签署了请求

经过几个小时的修补和多次阅读整个互联网,我无法弄清楚如何签署使用Product Advertising API的请求.

到目前为止,我设法从提供的WSDL文件生成客户端.我使用了亚马逊的教程.你可以在这里找到它:

生成Web服务客户端的教程

到目前为止没有问题.为了测试客户端,我写了一小段代码.该代码旨在简单地获取有关产品的一些信息.该产品由其ASIN指定.

代码:

package client;

import com.ECS.client.jax.AWSECommerceService;
import com.ECS.client.jax.AWSECommerceServicePortType;
import com.ECS.client.jax.ItemLookup;
import com.ECS.client.jax.ItemLookupResponse;
import com.ECS.client.jax.ItemLookupRequest;

public class Client {

  public static void main(String[] args) {
    System.out.println("API Test startet");

    AWSECommerceService service = new AWSECommerceService();
    AWSECommerceServicePortType port = service.getAWSECommerceServicePort();

    ItemLookupRequest itemLookup = new ItemLookupRequest();
    itemLookup.setIdType("ASIN");
    itemLookup.getItemId().add("B000RE216U");

    ItemLookup lookup = new ItemLookup();
    lookup.setAWSAccessKeyId("<mykeyishere>");
    lookup.getRequest().add(itemLookup);

    ItemLookupResponse response = port.itemLookup(lookup);

    String r = response.toString();
    System.out.println("response: " + r);

    System.out.println("API Test stopped");
  }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我没有签署请求的部分.我已经通过了很多使用过的类,并没有找到签署请求的方法.

那么,如何签署请求?

我实际上在文档中找到了一些东西:请求身份验证

但他们不使用自己的API.所提出的解决方案或多或少仅供手动使用.所以我查看了客户端类,以便了解我是否可以获取请求URL并将自己请求签名所需的所有部分放入其中.但是没有这样的方法.

我希望有人可以指出我做错了什么.


这就是我为解决问题所做的.所有的功劳归功于乔恩 …

java api amazon web-services amazon-web-services

16
推荐指数
1
解决办法
8686
查看次数

模拟浏览器下载文件?

网络上有一个FLV文件,可以直接在Chrome中下载.该文件是由中央电视台(CCTV)出版的电视节目.中央电视台是一家非盈利的国有广播公司,由中国纳税人提供资金,允许我们在不侵犯版权的情况下下载其内容.

使用wget,我可以从不同的地址下载文件,但不能从Chrome中的地址下载.

这就是我试图做的事情:

url='http://114.80.235.200/f4v/94/163005294.h264_1.f4v?10000&key=7b9b1155dc632cbab92027511adcb300401443020d&amp;playtype=1&amp;tk=163659644989925531390490125&amp;brt=2&amp;bc=0&amp;nt=0&amp;du=1496650&amp;ispid=23&amp;rc=200&amp;inf=1&amp;si=11000&amp;npc=1606&amp;pp=0&amp;ul=2&amp;mt=-1&amp;sid=10000&amp;au=0&amp;pc=0&amp;cip=222.73.44.31&amp;hf=0&amp;id=tudou&amp;itemid=135558267&amp;fi=163005294&amp;sz=59138302'  

wget -c  $url --user-agent="" -O  xfgs.f4v
Run Code Online (Sandbox Code Playgroud)

这也不起作用:

wget -c  $url   -O  xfgs.f4v
Run Code Online (Sandbox Code Playgroud)

输出是:

Connecting to 118.26.57.12:80... connected.  
HTTP request sent, awaiting response... 403 Forbidden  
2013-02-13 09:50:42 ERROR 403: Forbidden.  
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

我最终想用Python库下载它mechanize.这是我正在使用的代码:

import mechanize  
br = mechanize.Browser()  
br = mechanize.Browser()  
br.set_handle_robots(False)  
br.set_handle_equiv(False)   
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]  
url='http://114.80.235.200/f4v/94/163005294.h264_1.f4v?10000&key=7b9b1155dc632cbab92027511adcb300401443020d&amp;playtype=1&amp;tk=163659644989925531390490125&amp;brt=2&amp;bc=0&amp;nt=0&amp;du=1496650&amp;ispid=23&amp;rc=200&amp;inf=1&amp;si=11000&amp;npc=1606&amp;pp=0&amp;ul=2&amp;mt=-1&amp;sid=10000&amp;au=0&amp;pc=0&amp;cip=222.73.44.31&amp;hf=0&amp;id=tudou&amp;itemid=135558267&amp;fi=163005294&amp;sz=59138302' 
r = br.open(url).read()  
tofile=open("/tmp/xfgs.f4v","w")  
tofile.write(r)  
tofile.close()
Run Code Online (Sandbox Code Playgroud)

这是结果:

Traceback (most recent call last):  
  File "<stdin>", line 1, in …
Run Code Online (Sandbox Code Playgroud)

python shell wget mechanize

15
推荐指数
4
解决办法
1万
查看次数

鼻子没有找到Django测试

我试图使用Django的鼻子在我目前的项目,但我无法弄清楚如何让鼻子跑我的测试.所以我开始了一个简单的Django 1.4.1项目来了解鼻子.但即使在这个简单的测试项目中,我也无法运行它.

在继续之前:我知道Stackoverflow上有很多类似的问题,比如这个问题:

我怎么告诉Django-nose我的测试在哪里?

但谷歌搜索后,阅读博客文章和StackOverflow答案我仍然无法运行.

我如何设置我的测试项目

  1. 创建虚拟环境.
  2. pip install django django-nose nose.
  3. django-admin.py startproject djangonosetest.创建项目.
  4. 创建一个应用程序 manage.py startapp testapp
  5. 编辑settings.py:

    • 设置ENGINEdjango.db.backends.sqlite3
    • 添加django_nose,testappINSTALLED_APPS
    • 补充说TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'.
  6. manage.py test

但我得到的只是这个输出:

nosetests --verbosity 1
Creating test database for alias 'default'...

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK
Destroying test database for alias 'default'...
Run Code Online (Sandbox Code Playgroud)

但至少应该运行默认的测试用例.

当我运行python manage.py test djangonosetest.testapp.tests:SimpleTest它时,将运行测试.但是,如果我必须为每个测试文件执行此操作,那似乎有点矫枉过正.但它证明了测试可以运行.

当我跑manage.py test -v 3(高级别级别)时,这出现了:

nose.selector: INFO: /Users/Jens/Projects/Django/djangonosetest/djangonosetest/settings.py …
Run Code Online (Sandbox Code Playgroud)

django nose django-nose

13
推荐指数
1
解决办法
3321
查看次数

Django ORM - 模拟值().filter()链

我试图在Djangos model.Manager()类上模拟一个链式调用.现在我想嘲笑values()filter()方法.

为了测试我创建了一个小测试项目:

  1. 创建一个虚拟环境
  2. pip install django mock mock-django nose django-nose
  3. 创建一个项目 django-admin.py startproject mocktest
  4. 创建一个应用程序 manage.py startapp mockme
  5. 添加django_nosemocktest.mockmeINSTALLED_APPS(settings.py)
  6. 添加TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'到settings.py

为了确保所有设置都正确,我跑了manage.py test.运行一个测试,Django在您创建应用程序时创建的标准测试.

我做的下一件事是创建一个非常简单的模型.

mockme/models.py

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)

我做的下一件事是创建一个使用的简单函数MyModel.这是我想要稍后测试的功能.

mockme/functions.py

from models import MyModel

def chained_query():
    return MyModel.objects.values('name').filter(name='Frank')
Run Code Online (Sandbox Code Playgroud)

这里没有什么特别的事情发生.该函数正在过滤MyModel对象以查找其中的所有实例name='Frank'.对values()的调用将返回一个ValuesQuerySet只包含所有找到的MyModel实例的name字段的内容.

mockme/tests.py

import mock

from django.test import TestCase
from mocktest.mockme.models import MyModel …
Run Code Online (Sandbox Code Playgroud)

python django django-orm python-mock django-nose

13
推荐指数
2
解决办法
5394
查看次数

为什么我更喜欢OSGi服务而不是导出的包?

我试图了解OSGi服务.我一直在问自己的主要问题是:使用服务而不是使用捆绑包及其导出的包有什么好处?

据我所知,Late Binding的概念似乎与它有关.Bundle依赖关系在bundle start处连接在一起,所以我猜它们非常固定.但随着服务似乎几乎相同.捆绑包启动并注册服务或绑定到服务.当然,服务可以随时出入,你必须跟踪这些机会.但核心理念似乎与我不同.

另一个方面似乎是服务更灵活.一个特定接口可能有许多实现.另一方面,对于特定的导出包也可以有许多不同的实现.

在另一篇文章中,我读到使用导出包的缺点是它们使应用程序比服务更脆弱.作者写道,如果从依赖图中删除一个包,则不再满足其他依赖关系,从而可能对整个图形造成多米诺骨牌效应.但是如果服务脱机会发生同样的情况吗?对我而言,服务依赖性似乎并不比bundle依赖性更好.

到目前为止,我找不到可以清楚地描述为什么服务比通过导出和导入包公开功能更好的博客文章,书籍或演示文稿.

总结一下我的问题:

使用OSGi服务使其优于导出和导入包有哪些主要好处?


加成

我试图收集有关此问题的更多信息,并在包和服务的普通导出/导入之间进行某种比较.也许这会帮助我们找到一个令人满意的答案.

  1. 启动/停止/更新

    捆绑(因此包)和服务都可以启动和停止.除此之外,他们可以更新.服务也与捆绑生命周期本身有关.但在这种情况下,我只是意味着你可以启动和停止服务或捆绑(以便导出的包"消失").

  2. 跟踪变化

    ServiceTracker和BundleTracker使跟踪和响应捆绑和服务可用性变化成为可能.

  3. 与其他捆绑包或服务的特定依赖关系.

    如果要使用导出的包,则必须导入它.

    Import-Package: net.jens.helloworld
    
    Run Code Online (Sandbox Code Playgroud)

    net.jens.helloworld提供服务,我还需要导入的包,以获取接口.

    因此,在这两种情况下,它们都会与某种或多或少的特定包装形成"紧密耦合".

  4. 能够拥有多个实现

    特定包可以通过多个包导出.可能有一个包net.jens.twitterclient,它由bundle A和bundle B导出.这同样适用于服务.接口net.jens.twitterclient.TwitterService可以由bundle A和B发布.

总结这里的简短比较(导出包/服务):

  1. 是的是的
  2. 是的是的
  3. 是的是的
  4. 是的是的

所以没有区别.

此外,似乎服务增加了更多的复杂性并引入了另一层依赖关系(见下).

alt text http://img688.imageshack.us/img688/4421/bundleservicecomparison.png

因此,如果导出的包和服务之间没有真正的区别,那么使用服务的好处是什么?

我的解释:

服务的使用似乎更复杂.但服务本身似乎更轻巧.如果您启动/停止整个捆绑包或者您只是启动和停止特定服务,那么它应该是(在性能和资源方面)的差异.

从架构的角度来看,我也猜测捆绑包可以被视为应用程序的基础.在启动和停止捆绑方面,基础不应经常更改.该功能由该包的服务在"捆绑层"之上的某种动态层中提供.这个"服务层"可能会经常变化.例如,如果数据库脱机,则取消注册用于查询数据库的服务.


你怎么看?我是开始得到服务的全部还是我还在想错误的方法?是否有我遗漏的东西会使服务比出口包更具吸引力?

service osgi late-binding

12
推荐指数
2
解决办法
4599
查看次数