首页 文章 精选 留言 我的

精选列表

搜索[双向转换],共10000篇文章
优秀的个人博客,低调大师

上云就上阿里云背后:云计算已成为新旧动能转换关键

近日,阿里云一则“上云就上阿里云”的广告引起了云计算行业的热议。业内人士称,这意味着“上云”已经成为行业共识。而随着云计算理念快速普及,具有行业、生态优势的云计算企业将更具有优势。 据统计,全球云计算市场规模在2015年就达到了522.38亿美元,2015-2020年市场将保持22.10%的复合增速;预计到2020年,全球云计算市场将达到1435.28亿美元。其中,中国云计算市场增速更快,将达到29.45%;预计到2020年,国内云计算市场规模有望达到52.42亿美元。 中国市场的快速增长,源于云计算对传统行业的效率提升。基于产业AI模式,天河光能、协鑫光伏、中策橡胶等一大批工业制造企业正在通过云计算打通各个环节的制造数据,从而提高生产效率。此外,城市治理、机场调度、环境保护等各行各业都开始引入物联网、云计算技术,从而变革传统的管理服

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

百度实时语音转换技术 DeepVocie;谷歌 Python Fire 等| AI 研习社周刊

█开发工具 微软发布 Azure Stack 第三技术预览版本 Azure Stack 是微软为大型企业客户开发,在本地部署的数据中心运行私有云或混合云的服务。其正式版本预计于今年年中推出。3 月 1 日,微软公布了它的第三个技术预览版本。 微软副总裁 Mike Neil 强调,Azure Stack 将根据实际使用情况按需定价,但也会提供年费方式的固定价格选项。 详情:http://www.leiphone.com/news/201703/nYfx3ZLOXqMckzPZ.html?type=preview 谷歌开源Python Fire 3 月 2 日,谷歌公布了新的 Python 工具包——Python Fire。它的功能很简单:能从任何 Python 代码生成命令行接口(CLI)。开发者面对任意一个Python 程序,仅需调用

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

用GCD线程组与GCD信号量将异步线程转换为同步线程

有时候我们会碰到这样子的一种情形: 同时获取两个网络请求的数据,但是网络请求是异步的,我们需要获取到两个网络请求的数据之后才能够进行下一步的操作,这个时候,就是线程组与信号量的用武之地了. #import "ViewController.h" #import <AFNetworking.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self getNetworkingData]; } - (void)getNetworkingData{ NSString *appIdKey = @"8781e4ef1c73ff20a180d3d7a42a8c04"; NSString* urlString_1 = @"http://api.openweathermap.org/data/2.5/weather"; NSString* urlString_2 = @"http://api.openweathermap.org/data/2.5/forecast/daily"; NSDictionary* dictionary =@{@"lat":@"40.04991291", @"lon":@"116.25626162", @"APPID" : appIdKey}; // 创建组 dispatch_group_t group = dispatch_group_create(); // 将第一个网络请求任务添加到组中 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 创建信号量 dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); // 开始网络请求任务 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager GET:urlString_1 parameters:dictionary progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"成功请求数据1:%@",[responseObject class]); // 如果请求成功,发送信号量 dispatch_semaphore_signal(semaphore); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"失败请求数据"); // 如果请求失败,也发送信号量 dispatch_semaphore_signal(semaphore); }]; // 在网络请求任务成功之前,信号量等待中 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); }); // 将第二个网络请求任务添加到组中 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 创建信号量 dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); // 开始网络请求任务 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager GET:urlString_2 parameters:dictionary progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"成功请求数据2:%@",[responseObject class]); // 如果请求成功,发送信号量 dispatch_semaphore_signal(semaphore); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"失败请求数据"); // 如果请求失败,也发送信号量 dispatch_semaphore_signal(semaphore); }]; // 在网络请求任务成功之前,信号量等待中 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); }); dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"完成了网络请求,不管网络请求失败了还是成功了。"); }); } @end 打印结果: 2016-03-15 04:01:53.279 NetWorking[83611:1508240] 成功请求数据1:__NSCFDictionary2016-03-15 04:01:53.280 NetWorking[83611:1508240] 成功请求数据2:__NSCFDictionary2016-03-15 04:01:53.281 NetWorking[83611:1508287] 完成了网络请求,不管网络请求失败了还是成功了。 为了和上面形成对比,我特地将所有的信号量的代码全部去除,但是保留GCD线程组的使用,然后运行看打印结果。 #import "ViewController.h" #import <AFNetworking.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self getNetworkingData]; } - (void)getNetworkingData{ NSString *appIdKey = @"8781e4ef1c73ff20a180d3d7a42a8c04"; NSString* urlString_1 = @"http://api.openweathermap.org/data/2.5/weather"; NSString* urlString_2 = @"http://api.openweathermap.org/data/2.5/forecast/daily"; NSDictionary* dictionary =@{@"lat":@"40.04991291", @"lon":@"116.25626162", @"APPID" : appIdKey}; // 创建组 dispatch_group_t group = dispatch_group_create(); // 将第一个网络请求任务添加到组中 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 开始网络请求任务 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager GET:urlString_1 parameters:dictionary progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"成功请求数据1:%@",[responseObject class]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"失败请求数据"); }]; }); // 将第二个网络请求任务添加到组中 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 开始网络请求任务 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager GET:urlString_2 parameters:dictionary progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"成功请求数据2:%@",[responseObject class]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"失败请求数据"); }]; }); dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"完成了网络请求,不管网络请求失败了还是成功了。"); }); } @end 打印结果: 2016-03-15 04:05:09.378 NetWorking[83698:1510242] 完成了网络请求,不管网络请求失败了还是成功了。2016-03-15 04:05:10.185 NetWorking[83698:1510096] 成功请求数据1:__NSCFDictionary2016-03-15 04:05:10.186 NetWorking[83698:1510096] 成功请求数据2:__NSCFDictionary 看到这个打印结果,我们似乎有点看不懂了,难道notify线程组没用了?notify不是会在组中的异步任务执行完毕了才会执行么?这是什么情况? 下面我在上面的代码基础上添加了第33、38、39、49、54、55行代码(也就是下面红色高亮的几行代码,都是打印当前线程),然后我们再来看看打印结果: #import "ViewController.h" #import <AFNetworking.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self getNetworkingData]; } - (void)getNetworkingData{ NSString *appIdKey = @"8781e4ef1c73ff20a180d3d7a42a8c04"; NSString* urlString_1 = @"http://api.openweathermap.org/data/2.5/weather"; NSString* urlString_2 = @"http://api.openweathermap.org/data/2.5/forecast/daily"; NSDictionary* dictionary =@{@"lat":@"40.04991291", @"lon":@"116.25626162", @"APPID" : appIdKey}; // 创建组 dispatch_group_t group = dispatch_group_create(); // 将第一个网络请求任务添加到组中 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 开始网络请求任务 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager GET:urlString_1 parameters:dictionary progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"%@",[NSThread currentThread]); NSLog(@"成功请求数据1:%@",[responseObject class]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"失败请求数据"); }]; NSLog(@"%@",[NSThread currentThread]); NSLog(@"AFN网络请求框架请求完毕"); }); // 将第二个网络请求任务添加到组中 dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 开始网络请求任务 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager GET:urlString_2 parameters:dictionary progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"%@",[NSThread currentThread]); NSLog(@"成功请求数据2:%@",[responseObject class]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"失败请求数据"); }]; NSLog(@"%@",[NSThread currentThread]); NSLog(@"AFN网络请求框架请求完毕"); }); dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"完成了网络请求,不管网络请求失败了还是成功了。"); }); } @end 打印结果(温馨提示:请求数据可能会出现失败,因为这个网络请求的url是国外的服务器,但是没关系,不要在意这个细节,打印顺序还是一样的): 2016-03-15 04:30:07.406 NetWorking[84306:1523047] {number = 2, name = (null)}2016-03-15 04:30:07.406 NetWorking[84306:1523048] {number = 3, name = (null)}2016-03-15 04:30:07.407 NetWorking[84306:1523047] AFN网络请求框架请求完毕2016-03-15 04:30:07.407 NetWorking[84306:1523048] AFN网络请求框架请求完毕2016-03-15 04:30:07.407 NetWorking[84306:1523075] 完成了网络请求,不管网络请求失败了还是成功了。2016-03-15 04:30:08.239 NetWorking[84306:1523016] {number = 1, name = main}2016-03-15 04:30:08.239 NetWorking[84306:1523016] 成功请求数据1:__NSCFDictionary2016-03-15 04:30:08.240 NetWorking[84306:1523016] {number = 1, name = main}2016-03-15 04:30:08.240 NetWorking[84306:1523016] 成功请求数据2:__NSCFDictionary 总结:网络请求然后处理响应数据是个耗时的操作,也是我们开发中常见的一种情形,在网络请求以及处理响应数据操作完毕之后我们在执行别的操作这样的过程也是我们开发中常见的情形。根据第三部分代码(没有使用信号量的代码)打印结果的顺序,我们可以知道,网络请求的任务是提交给子线程异步处理了,网络请求这样的任务也就快速执行完毕了,但是网络请求是一个任务,处理收到的网络响应又是一个任务,注意不要把这两个过程混为一谈。而收到网络响应以及处理返回响应的数据并不是在子线程中执行的,我们通过在回调响应处理的block(比如48~53行之间就有两个block)中打印当前线程,会发现回调响应处理的block是在主线程中被执行的。 如果读者很熟悉block回调这种通信机制的话,就不难理解,这个回调响应的block真正被调用执行的地方应该是AFN框架的底层代码,AFN 底层代码,是在获取到最终数据后,执行回调操作,此时,才能拿到相应数据,而这个处理网络响应的过程,AFN底层最终是这么做的: 也就是说,seccess和failure都是在主线中异步任务中执行的。 那么,这时候,如果我们需要确定这个主线程中收到网络响应的数据被处理操作结束之后,才最后执行我们需要最后的操作的话,仅仅依靠线程组看来是不够的,所以很少用到的GCD信号量就有了用武之地了。 当然,以上代码如果不用GCD线程组,只用GCD的信号量来处理,也是可以的,这个就留给大家自己探究吧。 最后再简化总结一下:信号量的使用前提是,想清楚你需要处理哪个线程等待,又要哪个线程继续执行,然后使用信号量。 比如上面的AFN网络请求的示例,block回调是在main主线程中执行的,而get请求是在自己创建的异步子线程中执行的。所以按照需求,就需要自己创建的异步子线程等待main主线程中的block执行完了之后再执行。所以异步子线程需要信号量wait,main主线程就设置signal发送信号量。

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

如何把一个web集群由HTTP转换为HTTPS(LVS+HAProxy+SSL)

一、环境介绍 接到通知,要求网站由http改为使用https,目前我的网站前端架构如下图所示: 假设我们有两台物理机,每台物理机上面有很多的tomcat容器,前端使用的是haproxy进行的http层负载均衡,再前端我们使用了LVS负载均衡,整个LVS使用的是DR模型。 刚开始我打算把tomcat改成https,设置成之后再设置haproxy的时候,发现haproxy不能再使用负载均衡了,因为SSL是在第四层的,所以这个方案就结束了,下面我就尝试在haproxy层设定SSL,到后端还使用普通的连接。 二、设置步骤 1、概述 如果你的应用使用SSL证书,则需要决定如何在负载均衡器上使用它们。 单服务器的简单配置通常是考虑客户端SSL连接如何被接收请求的服务器解码。由于负载均衡器处在客户端和更多服务器之间,SSL连接解码就成了需要关注的焦点。 2、有两种主要的策略 第一种是我们选择的模式,在haproxy这里设定SSL,这样我们可以继续使用七层负载均衡。SSL连接终止在负载均衡器haproxy ----->解码SSL连接并发送非加密连接到后端应用tomcat,这意味着负载均衡器负责解码SSL连接,这与SSL穿透相反,它是直接向代理服务器发送SSL连接的。 第二种使用SSL穿透,SSL连接在每个tomcat服务器终止,将CPU负载都分散到tomcat服务器。然而,这样做会让你失去增加或修改HTTP报头的能力,因为连接只是简单地从负载均衡器路由到tomcat服务器,这意味着应用服务器会失去获取 X-Forwarded-* 报头的能力,这个报头包含了客户端IP地址、端口和使用的协议。 有两种策略的组合做法,那就是第三种,SSL连接在负载均衡器处终止,按需求调整,然后作为新的SSL连接代理到后台服务器。这可能会提供最大的安全性和发送客户端信息的能力。这样做的代价是更多的CPU能耗和稍复杂一点的配置。 选择哪个策略取决于你及应用的需求。SSL终端为我所见过最典型的策略,但SSL穿透可能会更安全。 3、使用HAProxy作为SSL终端 首先,我们将介绍最典型的解决方案 - SSL 终端。正如前面提到的,我们需要让负载均衡器处理SSL连接。这就意味着要将SSL证书放在负载均衡服务器上。 记住,在生产环境里使用(而不是自签名)的SSL证书,是不会需要你自己来生成或签名 - 你只需要创建证书签名请求 (csr) 并把它交给那个你向它购买证书的机构即可。 首先, 我们创建一份自签名的证书作为示范,并在本地使用同一份证书。 opensslgenrsa-out/etc/haproxy/wzlinux.key2048 opensslreq-new-key/etc/haproxy/wzlinux.key-out/etc/haproxy/wzlinux.csr >CountryName(2lettercode)[AU]:CN >StateorProvinceName(fullname)[Some-State]:Shanghai >LocalityName(eg,city)[]:Shanghai >OrganizationName(eg,company)[InternetWidgitsPtyLtd]:wzlinux >OrganizationalUnitName(eg,section)[]: >CommonName(e.g.serverFQDNorYOURname)[]:www.wzlinux.com >EmailAddress[]: >Pleaseenterthefollowing'extra'attributestobesentwithyourcertificaterequest >Achallengepassword[]: >Anoptionalcompanyname[]: cd/etc/haproxy opensslx509-req-days3655-inwzlinux.csr-signkeywzlinux.key-outwzlinux.crt 这就生成了wzlinux.csr,wzlinux.key和wzlinux.crt文件了。 接着,在创建了证书之后,我们需要创建pem文件。pem文件本质上只是将证书、密钥及证书认证中心证书(可有可无)拼接成一个文件。在我们的例子中,我们只是简单地将证书及密钥文件并以这个顺序拼接在一样来创建wzlinux.pem 文件。这是HAProxy读取SSL证书首选的方式。 catwzlinux.crtwzlinux.key|teewzlinux.pem 当购买真正的证书 时,你不一定会获取拼接后的文件。你可以要自己拼接它们。然而,很多机构也会提供一份拼接好的文件给你。如果你没有获取到拼接后的文件,则它可能不是一个 pem 文件,而是 bundle、cert、cert、key文件或一些相同概念但名称类似的文件。 无论如何,只要我们得到了HAProxy使用的pem文件,我们只需经过简单配置就是可以处理SSL连接了。 下面我们将要配置haproxy来安装SSL证书,配置文件如下 #--------------------------------------------------------------------- #Exampleconfigurationforapossiblewebapplication.Seethe #fullconfigurationoptionsonline. # #http://haproxy.1wt.eu/download/1.4/doc/configuration.txt # #--------------------------------------------------------------------- #--------------------------------------------------------------------- #Globalsettings #--------------------------------------------------------------------- global #tohavethesemessagesendupin/var/log/haproxy.logyouwill #needto: # #1)configuresyslogtoacceptnetworklogevents.Thisisdone #byaddingthe'-r'optiontotheSYSLOGD_OPTIONSin #/etc/sysconfig/syslog # #2)configurelocal2eventstogotothe/var/log/haproxy.log #file.Alinelikethefollowingcanbeaddedto #/etc/sysconfig/syslog # #local2.*/var/log/haproxy.log # log127.0.0.1local2warning chroot/var/lib/haproxy pidfile/var/run/haproxy.pid maxconn400000 userhaproxy grouphaproxy daemon tune.ssl.default-dh-param2048 #nbproc3 #turnonstatsunixsocket statssocket/var/lib/haproxy/stats #--------------------------------------------------------------------- #commondefaultsthatallthe'listen'and'backend'sectionswill #useifnotdesignatedintheirblock #--------------------------------------------------------------------- defaults modehttp logglobal optionhttplog optiondontlognull optionhttp-server-close optionforwardforexcept127.0.0.0/8 optionredispatch optionhttpclose retries3 timeouthttp-request10s timeoutqueue1m timeoutconnect10s timeoutclient1m timeoutserver1m timeouthttp-keep-alive10s timeoutcheck10s statsenable statshide-version statsuri/haproxy?status statsrealmHaproxy\Statistics statsauthadmin:asd870719 #statsadminifTRUE #--------------------------------------------------------------------- #mainfrontendwhichproxystothebackends #--------------------------------------------------------------------- #frontendmain*:5000 #aclurl_staticpath_beg-i/static/images/javascript/stylesheets #aclurl_staticpath_end-i.jpg.gif.png.css.js #use_backendstaticifurl_static #default_backendapp frontendwzlinux_ssl bind*:80 bind*:443sslcrt/etc/haproxy/wzlinux.pem modehttp default_backendwzlinux #--------------------------------------------------------------------- #staticbackendforservingupimages,stylesheetsandsuch #--------------------------------------------------------------------- #backendstatic #balanceroundrobin #serverstatic127.0.0.1:4331check backendwzlinux modehttp balanceroundrobin optionforwardfor #optionhttpchkHEAD/HTTP/1.1\r\nHost:localhost serverwzlinux0110.0.0.9:8080checkinter15000rise2fall4 serverwzlinux0210.0.0.9:8081checkinter15000rise2fall4 serverwzlinux0310.0.0.9:8082checkinter15000rise2fall4 serverwzlinux0410.0.0.9:8083checkinter15000rise2fall4 serverwzlinux0510.0.0.9:8084checkinter15000rise2fall4 serverwzlinux0610.0.0.9:8085checkinter15000rise2fall4 serverwzlinux0710.0.0.9:8086checkinter15000rise2fall4 #http-requestset-headerX-Forwarded-Port%[dst_port] #http-requestadd-headerX-Forwarded-Protohttpsif{ssl_fc} 因为 SSL 连接在负载均衡器上终止了,我们依然来发送正常的 HTTP 请求到后台服务器。 只接受SSL连接 如果你想让网站只接受SSL连接,你可以添加向前端配置加上redirect导向: frontendwzlinux_ssl bind*:80 bind*:443sslcrt/etc/haproxy/wzlinux.pem redirectschemehttpsif!{ssl_fc} modehttp default_backendwzlinux 上面,我们添加了 redirect 导向,如果连接不是通过SSL连接的,它将http重定向到https。 4、使用HAProxy实现SSL穿透 使用SSL穿透,我们将让后台服务器处理SSL连接,而非负载均衡器来处理。 负载均衡器的工作就只是简单地将请求转发到配置好的后台服务器。因为连接还保持加密状态,HAProxy只能将它转发给其他服务器,其他事情就没法做了。 在这个配置中,我们需要在前端和后台配置中同时使用TCP模式而不是HTTP模式。HAProxy只会把连接当作信息流来转发到其他服务器,而不会使用在HTTP请求上才能使用的功能。 首先,我们调整一下前端配置: frontendwzlinux_ssl bind*:80 bind*:443 optiontcplog modetcp default_backendwzlinux 这里依然同时绑定80和443端口,以保证正常的HTTP连接和SSL连接都能工作。 正如上述提到的,转发一个安全连接而服务器而不作任何解码,我们需要使用TCP模式(mode tcp)。这也意味着我们需要设置tcp日志而不是默认的http日志(option tcplog)。 接着,我们要调整后台end配置。注意,我们还要将这个更改成TCP模式,并删除一些directives以避免因为修改/增加HTTP报头功能所带来的冲突: backendwzlinux modetcp balanceroundrobin optionssl-hello-chk serverwzlinux0110.0.0.9:8080checkinter15000rise2fall4 serverwzlinux0210.0.0.9:8081checkinter15000rise2fall4 serverwzlinux0310.0.0.9:8082checkinter15000rise2fall4 serverwzlinux0410.0.0.9:8083checkinter15000rise2fall4 serverwzlinux0510.0.0.9:8084checkinter15000rise2fall4 serverwzlinux0610.0.0.9:8085checkinter15000rise2fall4 serverwzlinux0710.0.0.9:8086checkinter15000rise2fall4 正如你所看到的,这里设置成了mode tcp - 前端和后台配置都需要设置成这个模式。 我们还删除了option forwardfor和http-request选项 - 这些不能用于TCP模式,而且我们也不能向已加密的请求添加报头,还有一些前面的默认配置也删去关于http的配置,这里不再演示。 为了检查正确与否,我们可以使用ssl-hello-chk来检查连接及它处理SSL(特别是SSLv3)连接的能力。 在这个例子中,我虚构了两个接受SSL证书的后台服务器。如果你有阅读过edition SSL certificates,你会看到如何将它们集成到 Apache 或 Nginx 来创建一个网络服务器后台,以处理SSL通信。使用SSL 穿越,不需要给HAProxy创建或使用SSL证书。后台服务器都能够处理SSL连接,如同只有一台服务器且没有使用负载均衡器那样。 在关于如何设定lvs分发这里不再进行设定演示,大家可以查看我有关LVS的文章。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

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

WebStorm

WebStorm

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

用户登录
用户注册