首页 文章 精选 留言 我的

精选列表

搜索[认证互认],共10003篇文章
优秀的个人博客,低调大师

Jetpack Compose for Desktop 添加 Swing 操作层和 Apple Silicon 支持

Jetpack Compose for Desktop是软件开发厂商 JetBrains推出的一个 Kotlin 桌面 UI 框架,采用声明式和响应式的方法构建 UI。简化并加快了桌面应用程序的 UI 开发,允许 Android 和桌面应用程序之间的 UI 代码共享。 Jetpack Compose for Desktop的第一个里程碑(M1)版本已于上月发布,这也是该 UI 框架的首次公开迭代。现在,JetBrains又发布了 Jetpack Compose for Desktop的第二个里程碑(M2)版本。它带有一个新的 project wizard、提高了 Compose for Desktop 与不同操作系统和构建系统的兼容性、引入了新的代码重用功能,并修复了许多错误。 一些重点更新内容如下: Quick start via project wizard 在 IntelliJ IDEA 2020.3 中添加了一个project wizard模板。现在,创建 Compose for Desktop 应用程序比以往任何时候都要容易:当使用 File | New | Project......创建一个新的项目时,可在 Kotlinwizard的 "Compose for Desktop"类别中选择一个可用的模板,然后开始构建你的应用程序,而无需自己编写 Gradle 配置。 兼容性增强 Compose for Desktop Milestone 2 引入了对 macOS 10.13 和 10.14(在 M1 中已经支持 10.15 及更高版本)的支持。还增加了对 Gradle 最新版本的支持,支持 Gradle 6.6 和 6.7。 M2 版本也提供了 Apple Silicon支持。用户的应用程序现在可以直接在苹果的基于 ARM 的硬件(例如 M1)上运行,而无需依赖于 Rosetta 2 的动态二进制转换。 在 Swing 中嵌入 Compose for Desktop M2版本中添加了一种称为ComposePanel的新机制,使用户可以将 Compose UI 无缝添加到基于 Swing 的容器(如JFrame)中。这使得用户可以在基于 Swing 的环境中进行实验并逐步采用 Compose for Desktop,而不必完全替换现有的用户界面。 示例如下: 可查看有关将 Compose for Desktop 集成到基于 Swing 的应用程序的教程,以获取更多信息。值得注意的是,目前尚不支持反向操作(将 Swing 组件添加到 Compose for Desktop composition中)。 支持 Android XM L图标 Compose for Desktop 现在还支持 Android 的基于 XML 的矢量图像(称为vector drawables),使得用户可以直接在桌面应用程序中渲染这些图像,而无需先进行调整。这也意味着用户可以在针对 Android 和台式机的跨平台应用程序中共享 vector drawables 作为公共资源。 具体可查看”Image and in-app icons manipulation“教程。 发布公告:https://blog.jetbrains.com/cross-post/jetpack-compose-for-desktop-milestone-2-released/

优秀的个人博客,低调大师

阿里云API创新应用大赛启动:智慧开放,链解决

2017年6月11日,阿里云第一届API大赛在上海国际采购会展中心完美落幕,然而时隔6个月,第二届API创新应用大赛于12月12日应约而归。 有人说 API 带动了 IOT 的增长,也有人说一个发展的 IOT 生态系统推动了强大的 API 及 API 经济的需求。API帮助企业领导人实现公司转型、围绕现有产品打造新的生态系统,也变现核心资本、服务和产品。 互联网云计算时代,如何打破封闭的系统,让企业内外充分连接和互动?成了各企业管理者们面临的紧要问题。而API简单便捷的调用方式,提高了开发效率,加强了系统的灵活性和可扩展性,提高了快速交付的能力。 得益于API这种便捷的商业模式,许多过去不可及的功能,今天也在逐渐变成现实。不管是新零售,金融,还是物联网,API经济都正在帮助他们迈入一个新的时代。 为此阿里云方也希望通过API创新应用大赛的

优秀的个人博客,低调大师

华为腾讯掐背后物联网数据的重要性

随着来自物联网设备的数据量不断增加,我们可以大胆地认为,物联网数据的向前发展将带来大量的数据产品。思科估计,到2020年,物联网设备产生的数据将达到600泽字节(相当于6000万亿字节)。腾讯近日指控华为荣耀Magic手机侵害了腾讯的数据和用户的数据,并声称已经邀请监管部门介入,而华为则言之凿凿认为所有数据都是用户的数据,并且已经获得了用户的授权。 从性质上看,这是一场局部摩擦,充其量只是一款手机与微信的一次小规模冲突而已,双方连真正的争端都难以算得上,华为选择一款出货量并不算大的手机作为试点,腾讯则通过微调接口以示回应,保守与克制还是可以看得出来。 但是从产业的角度,华为的这次小规模冲锋却显得意义重大:打破全球最大的即时通信运营商腾讯对即时通信通道的垄断的一次积极的试探。 众所周知,微信已经成为即时通信的最大基础设施,用户几乎所有的即时沟通都在微信上完成,腾讯作为即时通信运营在过去的几年里一直在独自享受即时通信管道垄断带来的数据红利,闭环封闭的微信体系成就了微信生态,但是对于微信之外的移动互联网应用而言,却无法公平的享受微信的即时通信管道数据红利。 这里朗锐智科(www.lrist.com)不得不提另一个物联网流行词-人工智能,机器学习是人工智能的心脏,要依靠数据实现所谓的“?通过实施算法来学习识别模式,并做出预测和决策”。如果没有数据,人工智能最终会变成一个空瓶子,一组算法在里边搅来荡去,而不会产生任何的利益。 事实上,可以说如果没有人工智能,很多数据将起不到作用,毫无疑问,在能获取这些数据的公司里,负责人工智能开发的人员将利用这些数据工作。 有一种趋势,可能有助于人工智能研究人员获取物联网数据,至少对于那些有能力为此付费的组织内部人员而言,的确如此。这就是所谓的“数据货币化”或“数据集市”,越来越多的公司正在考虑能否从它们的数据仓库中创造适销对路的产品。 例如摩拜单车发布了一项节日期间客户使用模式的分析报告,提供了以下这类信息:哪些城市的旅游交通有所增加,游客来自哪些城市,以及哪些旅游目的地大受欢迎。这种数据有望对中国旅游企业带来很大的价值,如此它们就可以更好地推销自己的产品。随着联网设备在消费者中不断扩散,营销人员对消费者生活相关的更多综合数据会有更大需求。 据IBM发布的“全球CIO调查之CIO重要启示”,已经有83%的CIO拥有涵盖商业智能和分析的远期计划,并且CIO们开始更多地关注数据,而非应用。 从生活方面的购物交易,到工业方面的生产制造,从社交网络媒体信息,到在线视频图像资料,从企业的信息管理系统,到政府部门的电子政务,都会产生大量的数据,数据关乎企业智商,那么,驾驭大数据的能力也自然成为了企业的核心能力,随着社交媒体、电子商务、物联网等新应用的兴起,打破了企业原有价值链围墙,仅对原有价值链各个环节的数据进行分析,已经不能满足需求,他们需要借助大数据战略打破数据边界,了解更为全面的运营及运营环境的全景图。

优秀的个人博客,低调大师

互惠赢,英国将为中国大数据注入新活力

2017数博会期间,英国国际贸易部携带二十余家英国大数据领域内的优秀企业和学术研究机构来华,对中英双方需求进行深度探讨,以寻求进一步合作。数据观记者参加会议,并采访了英国国际贸易部技术与智慧城市贸易主管安德鲁·柯本(Andrew Cockburn)以及相关企业代表Speechmatics公司CEO Benedikt、Utterberry公司CEO Heba、以及全球地球信息科学专家、英国伦敦大学学院时空数据实验室(SpaceTimeLab)创始人程涛教授。 “2017中英大数据合作交流·英国日 ”主题活动 5月27日,英国国际贸易部在数博会期间举办了“2017中英大数据合作交流·英国日 ”主题活动, 就“智慧城市与产业合作”、“大数据智能商业应用”和“大数据创新技术与基础框架”三大主题展开专题讨论,分享英国在各分支领域内创新科技与商业应用。 安德鲁·柯本在会中介绍道,“在大数据方面,英国拥有一流的研究机构和创新协作环境,而且英国企业的大数据商业应用广泛,在智慧城市、医药、金融等在内的诸多行业均拥有卓越成果”。此外,在政策方面,英国投入大量的人力物力来发展大数据,花费上亿英镑促成数据的全部开放,以提升政府的治理水平。税收也是英国的一大优势。对于初创和中小企业而言,英国也有更多的支持和激励政策,如数字化战略,为企业间的合作营造一个良好氛围。伦敦大学学院时空实验室(SpaceTimeLab)创始人程涛教授透露:英国政府相当重视用数据做决策,当前正积极组织一个Data Policy的会议,预计今年9月举行。由此可以看出英国对大数据行业发展的重视程度可见一斑。 此行,英方希望通过与中国的企业、学术界的接洽,一起在大数据方面进行合作,共同创造价值,增加效益,以增强两方在大数据行业的领导力量。对于中国的投资者或者企业而言,英国政府承诺为其免费开放数据,给与最大支持。 顶尖的大数据人才,良好的科研环境 对于英国当前大数据行业的现状,安德鲁·柯本表示,英国政府数据的开放程度在国际上处于领先地位。同时,在人才培养方面,英国也是相当的重视,英国有超过160所大学,其中多数都有从本科到博士阶段相应的大数据相关课程设置。当前,英国拥有世界顶尖的数据科学家3万多人,接下来五年还会有69000人做大数据的工作,这个数量还将上升243%。而且英国数据中心的数量超过德国、爱尔兰和荷兰,这使英国在科研领域占很大的优势。此外,英国在大数据行业也有非常优秀的加速器,以帮助企业实现数据价值的快速转化。 先进的技术,良好的风投环境 与部分欧洲国家相比,英国的投资环境会更好,特别是在大数据领域。对于当前英国的风险投资环境,安德鲁·柯本也做了一些细节性的解说。英国是继美国之后第二大的风投国家,拥有众多的风投资源,但与美国不同,英国的风险投资是以保证企业的自主掌控权为准的,不会像美国一样,让企业成为他们的。英国良好的风投环境,其实对我国的投资者而言是比较有利的。 对于风险投资,安德鲁·柯本表示英国的企业主要分为两类,一类需要风险投资的资金,另一类是有机成长的企业。Utterberry是有机成长的代表企业之一,Speechmatics是合作过多个风险投资公司的代表企业,这是一家做语音识别技术的公司,公司CEO Benedikt表示他们公司的语音识别技术已经很成熟了,可以根据各种口音达到正确的转录,数据观记者也当场试验了其产品,转录功能可以说是相当的灵敏。从Benedikt处了解到Speechmatics在未来还将研发更多的功能,比如翻译等,Benedikt也希望在中国找到更多合作伙伴进行共同研发。就记者试验看来,它未来确实可能会成为我国一家企业——科大讯飞的竞争者之一。 大数据助力智慧城市建设 会议当天,慧思拓总经理张峰担任主持人,并就智慧城市建设提出了自己的见解,他认为“大数据是智慧城市建设的核心,大数据分析,大数据在基础设施的建设方面都起着举足轻重的作用,同时也可以帮助我们改善民生,大数据扮演着非常重要的作用”。 安德鲁·柯本认为智慧城市建设主要有四个方面:一个是数据的采集,一个是数据的传送,一个是数据的分析,最后一个就是怎么样去利用这些数据让我们的生活变得更好,而在这几个方面,英国可以说是走在世界前列的。安德鲁·柯本说英国是一个比中国小的多的国家,中国可以将英国作为测试示范地,将想法在这测试实验,实验成功后回国应用,而在这方面,英国也已有多次先例,有足够的经验支撑。 此外,对于中国企业来说,英国政府愿意给与全方位的支持,从市场调研,到人才和政策的支持等,英国不会采用“一刀切”的方式,而是根据企业需求以及企业的特色决定支持方式。 然而,中英双方的合作共赢才是最终目的。安德鲁·柯本认为,双方的合作需要建立在互信的基础上,中国市场对英国的企业具有巨大的吸引力。Utterberry是其中的代表企业之一,一家提供地质、环境监测感应器的公司,它的产品可以用在各个产业当中,据悉是当前世界上最小最轻薄的在人工智能基础上搭建的传感器,完全的远程操控,且功率非常低。中国因为地形地势的原因,其实在这方面有相当大的需求。而公司CEO Heba女士也表示,中国市场对于他们企业来说是目前最大的市场之一,她感受到了中国的热情,而Utterberry能够提供的产品不仅仅只是软件、AI或者是机器学习的技术,而是把软件和硬件结合在一起,提供一个大数据的应用,以助力智慧城市的建设。 数据观采访感悟:一个拥有领先的技术和丰富的人才,一个拥有强劲的市场发展优势,英国和中国大数据行业正在并将持续进行优势互补,达成合作双赢。对于中国的企业而言,选择与国际上其他企业的合作,或许是其长久发展最有利的道路。缺乏大数据相关人才,是我国大数据行业的整体现状,而英国本就是人才培养强国,现有3万多的大数据科学家,以及众多高校持续不断的培养着大数据相关人才,中英双方若能长期合作,将会给我国的大数据行业带来新的生机。 本文转自d1net(转载)

优秀的个人博客,低调大师

详解Django的CSRF认证

1.csrf原理 csrf要求发送post,put或delete请求的时候,是先以get方式发送请求,服务端响应时会分配一个随机字符串给客户端,客户端第二次发送post,put或delete请求时携带上次分配的随机字符串到服务端进行校验 2.Django中的CSRF中间件 首先,我们知道Django中间件作用于整个项目。 在一个项目中,如果想对全局所有视图函数或视图类起作用时,就可以在中间件中实现,比如想实现用户登录判断,基于用户的权限管理(RBAC)等都可以在Django中间件中来进行操作 Django内置了很多中间件,其中之一就是CSRF中间件 MIDDLEWARE_CLASSES = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] 上面第四个就是Django内置的CSRF中间件 3.Django中间件的执行流程 Django中间件中最多可以定义5个方法 process_request process_response process_view process_exception process_template_response Django中间件的执行顺序 1.请求进入到Django后,会按中间件的注册顺序执行每个中间件中的process_request方法 如果所有的中间件的process_request方法都没有定义return语句,则进入路由映射,进行url匹配 否则直接执行return语句,返回响应给客户端 2.依次按顺序执行中间件中的process_view方法 如果某个中间件的process_view方法没有return语句,则根据第1步中匹配到的URL执行对应的视图函数或视图类 如果某个中间件的process_view方法中定义了return语句,则后面的视图函数或视图类不会执行,程序会直接返回 3.视图函数或视图类执行完成之后,会按照中间件的注册顺序逆序执行中间件中的process_response方法 如果中间件中定义了return语句,程序会正常执行,把视图函数或视图类的执行结果返回给客户端 否则程序会抛出异常 4.程序在视图函数或视图类的正常执行过程中 如果出现异常,则会执行按顺序执行中间件中的process_exception方法 否则process_exception方法不会执行 如果某个中间件的process_exception方法中定义了return语句,则后面的中间件中的process_exception方法不会继续执行了 5.如果视图函数或视图类中使用render方法来向客户端返回数据,则会触发中间件中的process_template_response方法 4.Django CSRF中间件的源码解析 Django CSRF中间件的源码 class CsrfViewMiddleware(MiddlewareMixin): def _accept(self, request): request.csrf_processing_done = True return None def _reject(self, request, reason): logger.warning( 'Forbidden (%s): %s', reason, request.path, extra={ 'status_code': 403, 'request': request, } ) return _get_failure_view()(request, reason=reason) def _get_token(self, request): if settings.CSRF_USE_SESSIONS: try: return request.session.get(CSRF_SESSION_KEY) except AttributeError: raise ImproperlyConfigured( 'CSRF_USE_SESSIONS is enabled, but request.session is not ' 'set. SessionMiddleware must appear before CsrfViewMiddleware ' 'in MIDDLEWARE%s.' % ('_CLASSES' if settings.MIDDLEWARE is None else '') ) else: try: cookie_token = request.COOKIES[settings.CSRF_COOKIE_NAME] except KeyError: return None csrf_token = _sanitize_token(cookie_token) if csrf_token != cookie_token: # Cookie token needed to be replaced; # the cookie needs to be reset. request.csrf_cookie_needs_reset = True return csrf_token def _set_token(self, request, response): if settings.CSRF_USE_SESSIONS: request.session[CSRF_SESSION_KEY] = request.META['CSRF_COOKIE'] else: response.set_cookie( settings.CSRF_COOKIE_NAME, request.META['CSRF_COOKIE'], max_age=settings.CSRF_COOKIE_AGE, domain=settings.CSRF_COOKIE_DOMAIN, path=settings.CSRF_COOKIE_PATH, secure=settings.CSRF_COOKIE_SECURE, httponly=settings.CSRF_COOKIE_HTTPONLY, ) patch_vary_headers(response, ('Cookie',)) def process_request(self, request): csrf_token = self._get_token(request) if csrf_token is not None: # Use same token next time. request.META['CSRF_COOKIE'] = csrf_token def process_view(self, request, callback, callback_args, callback_kwargs): if getattr(request, 'csrf_processing_done', False): return None if getattr(callback, 'csrf_exempt', False): return None if request.method not in ('GET', 'HEAD', 'OPTIONS', 'TRACE'): if getattr(request, '_dont_enforce_csrf_checks', False): return self._accept(request) if request.is_secure(): referer = force_text( request.META.get('HTTP_REFERER'), strings_only=True, errors='replace' ) if referer is None: return self._reject(request, REASON_NO_REFERER) referer = urlparse(referer) if '' in (referer.scheme, referer.netloc): return self._reject(request, REASON_MALFORMED_REFERER) if referer.scheme != 'https': return self._reject(request, REASON_INSECURE_REFERER) good_referer = ( settings.SESSION_COOKIE_DOMAIN if settings.CSRF_USE_SESSIONS else settings.CSRF_COOKIE_DOMAIN ) if good_referer is not None: server_port = request.get_port() if server_port not in ('443', '80'): good_referer = '%s:%s' % (good_referer, server_port) else: good_referer = request.get_host() good_hosts = list(settings.CSRF_TRUSTED_ORIGINS) good_hosts.append(good_referer) if not any(is_same_domain(referer.netloc, host) for host in good_hosts): reason = REASON_BAD_REFERER % referer.geturl() return self._reject(request, reason) csrf_token = request.META.get('CSRF_COOKIE') if csrf_token is None: return self._reject(request, REASON_NO_CSRF_COOKIE) request_csrf_token = "" if request.method == "POST": try: request_csrf_token = request.POST.get('csrfmiddlewaretoken', '') except IOError: pass if request_csrf_token == "": request_csrf_token = request.META.get(settings.CSRF_HEADER_NAME, '') request_csrf_token = _sanitize_token(request_csrf_token) if not _compare_salted_tokens(request_csrf_token, csrf_token): return self._reject(request, REASON_BAD_TOKEN) return self._accept(request) def process_response(self, request, response): if not getattr(request, 'csrf_cookie_needs_reset', False): if getattr(response, 'csrf_cookie_set', False): return response if not request.META.get("CSRF_COOKIE_USED", False): return response self._set_token(request, response) response.csrf_cookie_set = True return response 从上面的源码中可以看到,CsrfViewMiddleware中间件中定义了process_request,process_view和process_response三个方法 先来看process_request方法 def _get_token(self, request): if settings.CSRF_USE_SESSIONS: try: return request.session.get(CSRF_SESSION_KEY) except AttributeError: raise ImproperlyConfigured( 'CSRF_USE_SESSIONS is enabled, but request.session is not ' 'set. SessionMiddleware must appear before CsrfViewMiddleware ' 'in MIDDLEWARE%s.' % ('_CLASSES' if settings.MIDDLEWARE is None else '') ) else: try: cookie_token = request.COOKIES[settings.CSRF_COOKIE_NAME] except KeyError: return None csrf_token = _sanitize_token(cookie_token) if csrf_token != cookie_token: # Cookie token needed to be replaced; # the cookie needs to be reset. request.csrf_cookie_needs_reset = True return csrf_token def process_request(self, request): csrf_token = self._get_token(request) if csrf_token is not None: # Use same token next time. request.META['CSRF_COOKIE'] = csrf_token 从Django项目配置文件夹中读取CSRF_USE_SESSIONS的值,如果获取成功,则从session中读取CSRF_SESSION_KEY的值,默认为'_csrftoken',如果没有获取到CSRF_USE_SESSIONS的值,则从发送过来的请求中获取CSRF_COOKIE_NAME的值,如果没有定义则返回None。 再来看process_view方法 在process_view方法中,先检查视图函数是否被csrf_exempt装饰器装饰,如果视图函数没有被csrf_exempt装饰器装饰,则程序继续执行,否则返回None。接着从request请求头中或者cookie中获取携带的token并进行验证,验证通过才会继续执行与URL匹配的视图函数,否则就返回403 Forbidden错误。 实际项目中,会在发送POST,PUT,DELETE,PATCH请求时,在提交的form表单中添加 {% csrf_token %} 即可,否则会出现403的错误 5.csrf_exempt装饰器和csrf_protect装饰器 5.1 基于Django FBV 在一个项目中,如果注册起用了CsrfViewMiddleware中间件,则项目中所有的视图函数和视图类在执行过程中都要进行CSRF验证。 此时想使某个视图函数或视图类不进行CSRF验证,则可以使用csrf_exempt装饰器装饰不想进行CSRF验证的视图函数 from django.views.decorators.csrf import csrf_exempt @csrf_exempt def index(request): pass 也可以把csrf_exempt装饰器直接加在URL路由映射中,使某个视图函数不经过CSRF验证 from django.views.decorators.csrf import csrf_exempt from users import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/',csrf_exempt(views.index)), ] 同样的,如果在一个Django项目中,没有注册起用CsrfViewMiddleware中间件,但是想让某个视图函数进行CSRF验证,则可以使用csrf_protect装饰器 csrf_protect装饰器的用法跟csrf_exempt装饰器用法相同,都可以加上视图函数上方装饰视图函数或者在URL路由映射中直接装饰视图函数 from django.views.decorators.csrf import csrf_exempt @csrf_protect def index(request): pass 或者 from django.views.decorators.csrf import csrf_protect from users import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/',csrf_protect(views.index)), ] 5.1 基于Django CBV 上面的情况是基于Django FBV的,如果是基于Django CBV,则不可以直接加在视图类的视图函数中了 此时有三种方式来对Django CBV进行CSRF验证或者不进行CSRF验证 方法一,在视图类中定义dispatch方法,为dispatch方法加csrf_exempt装饰器 from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator class UserAuthView(View): @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super(UserAuthView,self).dispatch(request,*args,**kwargs) def get(self,request,*args,**kwargs): pass def post(self,request,*args,**kwargs): pass def put(self,request,*args,**kwargs): pass def delete(self,request,*args,**kwargs): pass 方法二:为视图类上方添加装饰器 @method_decorator(csrf_exempt,name='dispatch') class UserAuthView(View): def get(self,request,*args,**kwargs): pass def post(self,request,*args,**kwargs): pass def put(self,request,*args,**kwargs): pass def delete(self,request,*args,**kwargs): pass 方式三:在url.py中为类添加装饰器 from django.views.decorators.csrf import csrf_exempt urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^auth/', csrf_exempt(views.UserAuthView.as_view())), ] csrf_protect装饰器的用法跟上面一样

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册