首页 文章 精选 留言 我的

精选列表

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

swift4 代理的写法

简单记录swift中的代理的写法。首先在storyboard中画出两个VC: image.png 然后,把对应的类文件添加上 // // ViewController.swift // DelegateTest // // Created by iOS on 2018/2/27. // Copyright © 2018年 iOS. All rights reserved. // import UIKit class ViewController: UIViewController { @IBOutlet weak var showTextLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func nextAction(_ sender: UIButton) { let vc = NextViewController.instance() vc.delegate = self present(vc, animated: true) {} } } extension ViewController: NextViewControllerProtocol { func callBack(string: String) { showTextLabel.text = string } } // // NextViewController.swift // DelegateTest // // Created by iOS on 2018/2/27. // Copyright © 2018年 iOS. All rights reserved. // import UIKit protocol NextViewControllerProtocol: NSObjectProtocol { func callBack(string: String) } class NextViewController: UIViewController { @IBOutlet weak var ContentStr: UILabel! weak var delegate:NextViewControllerProtocol? override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } class func instance() -> NextViewController { let storeB = UIStoryboard.init(name: "Main", bundle: nil) let vc = storeB.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController return vc } @IBAction func back(_ sender: UIButton) { delegate?.callBack(string: ContentStr.text ?? "没有数据") dismiss(animated: true) {} } } 实现效果是反向传值。

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

Java程序性能优化4

使用'System.arraycopy ()'代替通过来循环复制数组 'System.arraycopy ()' 要比通过循环来复制数组快的多。 例子:public class IRB{ void method () { int[] array1 = new int [100]; for (int i = 0; i < array1.length; i++) { array1 [i] = i; } int[] array2 = new int [100]; for (int i = 0; i < array2.length; i++) { array2 [i] = array1 [i]; // Violation } } } 更正:public class IRB{ void method () { int[] array1 = new int [100]; for (int i = 0; i < array1.length; i++) { array1 [i] = i; } int[] array2 = new int [100]; System.arraycopy(array1, 0, array2, 0, 100); } }

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

4 章 数据类型

目录 4.1. type 数据类型检测 4.2. String 4.2.1. String function 4.2.1.1. str.find() 4.2.1.2. str.find() 4.2.2. Convert str to bytes in python 4.2.3. String format 4.3. Array 4.3.1. split / join 4.4. Datetime 4.4.1. datetime 4.5. bytes 类型 4.5.1. BOM头 4.5.2. replace 4.5.3. pack/unpack 4.1.type 数据类型检测 http://docs.python.org/library/types.html >>> type( [] ) == list True >>> type( {} ) == dict True >>> type( "" ) == str True >>> type( 0 ) == int True >>> class Test1 ( object ): pass >>> class Test2 ( Test1 ): pass >>> a = Test1() >>> b = Test2() >>> type( a ) == Test1 True >>> type( b ) == Test2 True >>> type( b ) == Test1 False >>> isinstance( b, Test1 ) True >>> isinstance( b, Test2 ) True >>> isinstance( a, Test1 ) True >>> isinstance( a, Test2 ) False >>> isinstance( [], list ) True >>> isinstance( {}, dict ) True >>> a = [] >>> type(a) <type 'list'> >>> f = () >>> type(f) <type 'tuple'> 原文出处:Netkiller 系列 手札 本文作者:陈景峯 转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

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

Laravel4中的Validator

不管写接口还是写web页面,实质都是传入参数,然后进行业务逻辑,然后再输出具体内容。所以,对参数的验证是不可避免的一个环节,比如传过来的email是不是为空,是不是合法的email格式?laravel已经为phper想到简化这种逻辑的办法了。就是Validator。 Validator的使用 制造一个验证器 validator使用Validator::make可以制造一个验证器。然后使用验证器判断传入的参数是否是合法的。 看make的定义: public Validator make(array $data, array $rules, array $messages = array(), array $customAttributes = array()) $data是keyvalue的要验证的数据 $rules是验证的规则 $messages是提示信息 $customAttributes是设置属性别名的 其中后两个消息都是为了提示信息而设置的 直接看一个例子,理解了就validator就理解了: public function getIndex() { $rules = array( 'email' => 'required|email', 'name' => 'required|between:1,20', 'password' => 'required|min:8', ); $message = array( "required" => ":attribute 不能为空", "between" => ":attribute 长度必须在 :min 和 :max 之间" ); $attributes = array( "email" => '电子邮件', 'name' => '用户名', 'password' => '用户密码', ); $validator = Validator::make( Input::all(), $rules, $message, $attributes ); if ($validator->fails()) { $warnings = $validator->messages(); $show_warning = $warnings->first(); return Response::Json(compact('show_warning')); } return Response::Json("ok"); } 在这个例子中 如果你传递的参数为 /index?name=12321321321321321321321 会返回: { show_warning: "电子邮件 不能为空" } Input::all() 将所有参数传入进行验证rule规定了email字段不能为空,它必须符合email的格式。rule规定了email字段不能为空,它必须符合email的格式。message 说明如果违反required规则的话,显示错误的格式为:“:attribute 不能为空” $attributes 说明了显示的错误中email显示为文字“电子邮件” 上面几个设置加起来就导致了最后参数没传email的时候显示的错误信息为: “电子邮件 不能为空” Validator的验证扩展 验证规则扩展 你一定会遇到比如要验证是否手机号合法的问题,laravel的Validator没有提供手机号验证的规则,因为每个国家的手机号规则是不统一的。 但是这个使用想使用Validator做验证怎么办呢? Validator::extend('mobile', function($attribute, $value, $parameters) { return preg_match('/^0?(13[0-9]|15[012356789]|18[0-9]|14[57])[0-9]{8}$/', $value); }); 然后在rule中就可以使用mobile做为规则了。 这种扩展验证规则放到哪里呢? 我建议是在filters同级目录下增加一个validator.php,然后再start/global.php中 require app_path().'/validator.php'; 输出信息统一提示 上面的那个例子中,message和message和attribute都需要在使用validator的时候自己定义,比较麻烦,有没有更好的方法能统一设置呢? validator的提示设置是按照语言来进行设置的。 语言设置是config目录下的app.php里面的locale界定的。默认为en。 而en对应的错误提示都在lang目录下的en目录里面的validation.php中设置。 你可以看一眼lang/en/validation.php 就明白对应的英文提示信息怎么出来的了。 要设置中文提示: 修改config/app.php里面的locale,设置为ch 创建 lang/ch/validation.php 修改validation.php文件,将里面的提示信息修改为中文,注意提示信息中的:attribute在显示的时候会被替换成对应属性名称,attributes是设置属性的中文名字的。 从这里也就看出来了laravel对跨语言的支持是什么样子的。 lang下面的文件夹除了validation.php之外还有分页:pagination.php,提示:reminders.php文件。 laravel自带了哪些rule规则呢? 查看手册吧。。。laravel自带的验证规则 本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/4324159.html,如需转载请自行联系原作者

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

OpenStack HA集群4-Haproxy

1、安装haproxy # yum install -y haproxy # systemctl enable haproxy.service 2、配置haproxy日志 [root@controller1 ~]# cd /etc/rsyslog.d/ [root@controller1 rsyslog.d]# vim haproxy.conf $ModLoad imudp $UDPServerRun 514 $template Haproxy,"%msg%" local0.=info -/var/log/haproxy.log;Haproxy local0.notice -/var/log/haproxy-status.log;Haproxy local0.* ~ [root@controller1 ~]# scp /etc/rsyslog.d/haproxy.conf controller2:/etc/rsyslog.d/ haproxy.conf 100% 164 0.2KB/s 00:00 [root@controller1 ~]# scp /etc/rsyslog.d/haproxy.conf controller3:/etc/rsyslog.d/ 启动rsyslog [root@controller1 ~]# systemctl restart rsyslog.service [root@controller1 ~]# systemctl status rsyslog.service 配置haproxy [root@controller1 ~]# vim /etc/haproxy/haproxy.cfg #--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 stats uri /haproxy-stats #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- listen haproxy-status bind *:80 option http-server-close option forwardfor default_backend httpd maxconn 10 stats refresh 30s stats hide-version stats auth admin:admin stats uri /haproxy-stats #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- listen httpd balance roundrobin mode http option httplog # option httpchk HEAD / HTTP/1.1\r\nHost:\ localhost # option httpchk GET /index.html server controller1 controller1:8080 check server controller2 controller2:8080 check server controller3 controller3:8080 check listen mysql balance roundrobin mode http option httplog server controller1 controller1:3306 check server controller2 controller2:3306 check server controller3 controller3:3306 check listen keystone_api_cluster # bind 192.168.17.132:5000 balance source option tcpka option httpchk option tcplog server controller1 controller1:5000 check inter 2000 rise 2 fall 5 server controller2 controller2:5000 check inter 2000 rise 2 fall 5 server controller3 controller3:5000 check inter 2000 rise 2 fall 5 listen cinder_api_cluster bind 192.168.17.132:8776 balance source option tcpka option httpchk option tcplog server controller1 controller1:8778 check inter 2000 rise 2 fall 5 server controller2 controller2:8778 check inter 2000 rise 2 fall 5 server controller3 controller3:8778 check inter 2000 rise 2 fall 5 listen nova_vncproxy_cluster bind 192.168.17.132:6080 balance source option tcpka option httpchk option tcplog server controller1 controller1:6081 check inter 2000 rise 2 fall 5 server controller2 controller2:6081 check inter 2000 rise 2 fall 5 server controller3 controller3:6081 check inter 2000 rise 2 fall 5 listen neutron_api_cluster bind 192.168.17.132:9696 balance source option tcpka option httpchk option tcplog server controller1 controller1:9797 check inter 2000 rise 2 fall 5 server controller2 controller2:9797 check inter 2000 rise 2 fall 5 server controller3 controller3:9797 check inter 2000 rise 2 fall 5 [root@controller1 ~]# scp /etc/haproxy/haproxy.cfg controller2:/etc/haproxy/ [root@controller1 ~]# scp /etc/haproxy/haproxy.cfg controller3:/etc/haproxy/ [root@controller1 ~]# systemctl restart haproxy [root@controller1 ~]# systemctl status haproxy 本文转自 OpenStack2015 博客,原文链接: http://blog.51cto.com/andyliu/1917398 如需转载请自行联系原作者

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

Android开发4——文件操作模式

一、基本概念 //上下文对象 privateContextcontext; publicFileService(Contextcontext) { super(); this.context=context; } //保存文件方法 publicvoidsave(Stringfilename,StringfileContent)throwsException { FileOutputStreamfos=context.openFileOutput(filename,context.MODE_PRIVATE); fos.write(fileContent.getBytes("UTF-8")); fos.close(); } 私有模式①只能被创建这个文件的当前应用访问 ②若文件不存在会创建文件;若创建的文件已存在则会覆盖掉原来的文件 Context.MODE_PRIVATE = 0; 追加模式①私有的 ②若文件不存在会创建文件;若文件存在则在文件的末尾进行追加内容 Context.MODE_APPEND = 32768; 可读模式①创建出来的文件可以被其他应用所读取 Context.MODE_WORLD_READABLE=1; 可写模式①允许其他应用对其进行写入。 Context.MODE_WORLD_WRITEABLE=2 以上文件操作模式均针对保存在手机自带存储空间的文件。若文件存储在SDCard上,则不受读写控制。 二、组合使用 FileOutputStreamoutStream=this.openFileOutput("xy.txt",Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE); 允许其他应用读写,并默认覆盖 FileOutputStreamoutStream=this.openFileOutput("xy.txt",Context.MODE_APPEND+Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE); 追加模式,但允许其他应用读写 本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1076786如需转载请自行联系原作者 woshixuye111

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

【20160924】GOCVHelper 图像增强部分(4

//使得rect区域半透明 Mattranslucence(Matsrc,Rectrect,intidepth){ Matdst=src.clone(); Matroi=dst(rect); roi+=cv::Scalar(idepth,idepth,idepth); returndst; } 将选择的区域打上变成半透明。虽然这只是一个简单的函数,但是使用起来灵活多变。 比如说,可以将图像某个区域变成半透明,然后在上面写字,这样起到强化作用; 也可以将一个区域图片在半透明和不透明之间切换,起到强掉作用。 //使得rect区域打上马赛克 Matmosaic(Matsrc,Rectrect,intW,intH){ Matdst=src.clone(); Matroi=dst(rect); for(inti=W;i<roi.cols;i+=W){ for(intj=H;j<roi.rows;j+=H){ uchars=roi.at<uchar>(j-H/2,(i-W/2)*3); uchars1=roi.at<uchar>(j-H/2,(i-W/2)*3+1); uchars2=roi.at<uchar>(j-H/2,(i-W/2)*3+2); for(intii=i-W;ii<=i;ii++){ for(intjj=j-H;jj<=j;jj++){ roi.at<uchar>(jj,ii*3+0)=s; roi.at<uchar>(jj,ii*3+1)=s1; roi.at<uchar>(jj,ii*3+2)=s2; } } } } returndst; } 将选择的区域打上马赛克,也就是常见的所谓打码。 //基于颜色直方图的距离计算 doubleGetHsVDistance(Matsrc_base,Matsrc_test1){ Mathsv_base; Mathsv_test1; ///ConverttoHSV cvtColor(src_base,hsv_base,COLOR_BGR2HSV); cvtColor(src_test1,hsv_test1,COLOR_BGR2HSV); ///Using50binsforhueand60forsaturation inth_bins=50;ints_bins=60; inthistSize[]={h_bins,s_bins}; //huevariesfrom0to179,saturationfrom0to255 floath_ranges[]={0,180}; floats_ranges[]={0,256}; constfloat*ranges[]={h_ranges,s_ranges}; //Usetheo-thand1-stchannels intchannels[]={0,1}; ///Histograms MatNDhist_base; MatNDhist_test1; ///CalculatethehistogramsfortheHSVimages calcHist(&hsv_base,1,channels,Mat(),hist_base,2,histSize,ranges,true,false); normalize(hist_base,hist_base,0,1,NORM_MINMAX,-1,Mat()); calcHist(&hsv_test1,1,channels,Mat(),hist_test1,2,histSize,ranges,true,false); normalize(hist_test1,hist_test1,0,1,NORM_MINMAX,-1,Mat()); ///Applythehistogramcomparisonmethods doublebase_test1=compareHist(hist_base,hist_test1,0); returnbase_test1; } 基于颜色直方图的增强算法是一种经典的图像增强算法。这里提供了opencv实现。这个部分应该是从gimp中扒出来的。 来自为知笔记(Wiz) 目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com

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

【20160924】GOCVHelper MFC增强算法(4

//string替换 voidstring_replace(string&strBig,conststring&strsrc,conststring&strdst) { string::size_typepos=0; string::size_typesrclen=strsrc.size(); string::size_typedstlen=strdst.size(); while((pos=strBig.find(strsrc,pos))!=string::npos) { strBig.replace(pos,srclen,strdst); pos+=dstlen; } } 字符串操作一直都是重要的基础操作。在图像处理的过程中,涉及到文件名等变换都需要字符串操作。string_replace中能够成块地换字符。虽然在std中可能已经有相关函数,不过既然我自己的这个用的比较熟悉,就是使用了。 //C++的spilt函数 voidSplitString(conststring&s,vector<string>&v,conststring&c){ std::string::size_typepos1,pos2; pos2=s.find(c); pos1=0; while(std::string::npos!=pos2){ v.push_back(s.substr(pos1,pos2-pos1)); pos1=pos2+c.size(); pos2=s.find(c,pos1); } if(pos1!=s.length()) v.push_back(s.substr(pos1)); } 依然是增强了std中的相关功能,实际使用的时候非常有用。 //!通过文件夹名称获取文件名,不包括后缀 voidgetFileName(conststring&filepath,string&name,string&lastname){ vector<string>spilt_path; SplitString(filepath,spilt_path,"\\"); intspiltsize=spilt_path.size(); stringfilename=""; if(spiltsize!=0){ filename=spilt_path[spiltsize-1]; vector<string>spilt_name; SplitString(filename,spilt_name,"."); intname_size=spilt_name.size(); if(name_size!=0) name=spilt_name[0]; lastname=spilt_name[name_size-1]; } } 前面的函数getfiles能够获得文件的真实路径。那么getFileName能够进一步处理,直接获得图片的名称。很多时候,图片读取了,需要处理一下,这个都是需要的。 来自为知笔记(Wiz) 目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com

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

OpenCV学习(40) 人脸识别(4)

在人脸识别模式类中,还实现了一种基于LBP直方图的人脸识别方法。LBP图的原理参照:http://www.cnblogs.com/mikewolf2002/p/3438698.html 在代码中,我们只要使用 Ptr<FaceRecognizer> model = createLBPHFaceRecognizer(); 就创建了一个基于LBPH的人脸识别类,其它代码和前面两种人脸识别方法一样。 在train函数中,会计算每个样本的LBP图像,并求出该图像的二维直方图,把直方图保存在_histograms中,以便在predict函数调用这些直方图进行匹配。 for(size_t sampleIdx = 0; sampleIdx < src.size(); sampleIdx++) { // 计算LBP图 Mat lbp_image = elbp(src[sampleIdx], _radius, _neighbors); // 得到直方图 Mat p = spatial_histogram( lbp_image, /* lbp_image */ static_cast<int>(std::pow(2.0, static_cast<double>(_neighbors))), //可能的模式数 _grid_x, /* grid size x */ _grid_y, /* grid size y */ true); // 把直方图加到匹配模版中 _histograms.push_back(p); } 在预测函数中,会先求出输入图像的LBPH图,然后和保存的样本LBPH进行比较,距离最今即为匹配的人脸。 Mat lbp_image = elbp(src, _radius, _neighbors); Mat query = spatial_histogram( lbp_image, /* lbp_image */ static_cast<int>(std::pow(2.0, static_cast<double>(_neighbors))), /* number of possible patterns */ _grid_x, /* grid size x */ _grid_y, /* grid size y */ true /* normed histograms */); // 查找最近的匹配者 minDist = DBL_MAX; minClass = -1; for(size_t sampleIdx = 0; sampleIdx < _histograms.size(); sampleIdx++) { double dist = compareHist(_histograms[sampleIdx], query, CV_COMP_CHISQR); if((dist < minDist) && (dist < _threshold)) { minDist = dist; minClass = _labels.at<int>((int) sampleIdx); } } 代码: #include "opencv2/core/core.hpp"#include "opencv2/contrib/contrib.hpp"#include "opencv2/highgui/highgui.hpp"#include <iostream>#include <fstream>#include <sstream>using namespace cv;using namespace std;static void read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator = ';') { std::ifstream file(filename.c_str(), ifstream::in);if (!file) { string error_message = "No valid input file was given, please check the given filename."; CV_Error(CV_StsBadArg, error_message); } string line, path, classlabel;while (getline(file, line)) { stringstream liness(line); getline(liness, path, separator); getline(liness, classlabel);if(!path.empty() && !classlabel.empty()) { images.push_back(imread(path, 0)); labels.push_back(atoi(classlabel.c_str())); } } }int main(int argc, const char *argv[]) {// Get the path to your CSV. string fn_csv = string("facerec_at_t.txt");// These vectors hold the images and corresponding labels. vector<Mat> images; vector<int> labels;// Read in the data. This can fail if no valid// input filename is given.try { read_csv(fn_csv, images, labels); } catch (cv::Exception& e) { cerr << "Error opening file \"" << fn_csv << "\". Reason: " << e.msg << endl;// nothing more we can do exit(1); }// Quit if there are not enough images for this demo.if(images.size() <= 1) { string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!"; CV_Error(CV_StsError, error_message); }// Get the height from the first image. We'll need this// later in code to reshape the images to their original// size:int height = images[0].rows;// The following lines simply get the last images from// your dataset and remove it from the vector. This is// done, so that the training data (which we learn the// cv::FaceRecognizer on) and the test data we test// the model with, do not overlap. Mat testSample = images[images.size() - 1];int testLabel = labels[labels.size() - 1]; images.pop_back(); labels.pop_back();// The following lines create an LBPH model for// face recognition and train it with the images and// labels read from the given CSV file.//// The LBPHFaceRecognizer uses Extended Local Binary Patterns// (it's probably configurable with other operators at a later// point), and has the following default values//// radius = 1// neighbors = 8// grid_x = 8// grid_y = 8//// So if you want a LBPH FaceRecognizer using a radius of// 2 and 16 neighbors, call the factory method with://// cv::createLBPHFaceRecognizer(2, 16);//// And if you want a threshold (e.g. 123.0) call it with its default values://// cv::createLBPHFaceRecognizer(1,8,8,8,123.0)// Ptr<FaceRecognizer> model = createLBPHFaceRecognizer(); model->train(images, labels);// The following line predicts the label of a given// test image:int predictedLabel = model->predict(testSample);//// To get the confidence of a prediction call the model with://// int predictedLabel = -1;// double confidence = 0.0;// model->predict(testSample, predictedLabel, confidence);// string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel); cout << result_message << endl;// Sometimes you'll need to get/set internal model data,// which isn't exposed by the public cv::FaceRecognizer.// Since each cv::FaceRecognizer is derived from a// cv::Algorithm, you can query the data.//// First we'll use it to set the threshold of the FaceRecognizer// to 0.0 without retraining the model. This can be useful if// you are evaluating the model:// model->set("threshold", 0.0);// Now the threshold of this model is set to 0.0. A prediction// now returns -1, as it's impossible to have a distance below// it predictedLabel = model->predict(testSample); cout << "Predicted class = " << predictedLabel << endl;// Show some informations about the model, as there's no cool// Model data to display as in Eigenfaces/Fisherfaces.// Due to efficiency reasons the LBP images are not stored// within the model: cout << "Model Information:" << endl; string model_info = format("\tLBPH(radius=%i, neighbors=%i, grid_x=%i, grid_y=%i, threshold=%.2f)", model->getInt("radius"), model->getInt("neighbors"), model->getInt("grid_x"), model->getInt("grid_y"), model->getDouble("threshold")); cout << model_info << endl;// We could get the histograms for example: vector<Mat> histograms = model->getMatVector("histograms");// But should I really visualize it? Probably the length is interesting: cout << "Size of the histograms: " << histograms[0].total() << endl;return 0; } 程序代码:工程FirstOpenCV35

资源下载

更多资源
Mario

Mario

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

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等操作系统。

用户登录
用户注册