首页 文章 精选 留言 我的

精选列表

搜索[电机控制],共10008篇文章
优秀的个人博客,低调大师

使用java获取版本控制工具提交记录

项目地址 https://github.com/mjm13/revision 场景描述 问题描述: 进行代码升级时偶尔会碰到同一个问题被多人修改,其中一人的代码已测试通过但另一人的问题未解决但是提交过代码导致最后提取升级包时有新的bug.解决方法: 通过获取svn提交记录和描述与bug管理系统关联的方式来对每次代码提交进行描述. 通过java来获取svn提交记录生成精确的小包,并产生对应的日志.以减少这种情况. 包含内容: 使用JGIT访问git项目 使用SVNkit访问svn 遗留问题 使用jgit时如何更简便的方式获取提交文件列表,以及相关的提交动作

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

golang自定义路由控制实现(一)

由于本人之前一直是Java Coder,在Java web开发中其实大家都很依赖框架,所以当在学习Golang的时候,自己便想着在Go开发中脱离框架,自己动手造框架来练习。通过学习借鉴Java的思想还有部分框架的源码,在golang上面进行实现,从而达到对Java和Golang的同时学习目的,这就很美滋滋了。 Golang中http的设计非常轻量,又兼具很高的扩展性,初学者都可以轻易的设计出自定义的路由功能,使用上十分简单(这里……来吐槽一下Java的Servlet,虽然我也对Java爱得深沉),下面请看Go的Demo。 func HelloServer1(w http.ResponseWriter, req *http.Request) { fmt.Fprint(w,"hello world") } func main() { http.HandleFunc("/test", HelloServer1) err := http.ListenAndServe(":8080", nil) if err != nil { log.Fatal("ListenAndServe: ", err.Error()) } } 短短的几行代码便可以成功注册一个接口并跑起服务。但是原生的开发方式提供的功能是比较精简的目前几乎所有的Web应用路由实现都是基于http默认的路由器,但是Go自带的路由器有几个限制: 不支持参数设定,例如/user/:uid 这种泛类型匹配。 无法很好的支持REST模式,无法限制访问的方法,例如上面的例子中,用户访问/foo,可以用GET、POST、DELETE、HEAD等方式访问。 一般网站的路由规则太多了,编写繁琐,可以通过struct的方法进行一种简化。 Go有如此限制跟http提供的默认方式有关,我们先看下http两个关键的struct type ServeMux struct { mu sync.RWMutex m map[string]muxEntry hosts bool // whether any patterns contain hostnames } type muxEntry struct { explicit bool h Handler pattern string } 我们需要重点关键两个地方,一个是ServeMux 中的参数m,它的类型是 map[string]muxEntry ,这里我们自然而然可以想到,参数m负责路由分发。第二个重点则是muxEntry,muxEntry的h Handler 对应的就是我们编写的接口,而围绕这个接口,http并没有其他过多的功能,甚至连像Java中制定一套统一web开发标准都没有。因此http中只是提供最基础的功能,用户则需要以这些功能为基础,进而YY出自己想要的框架或者更丰富的功能。 首先我们问题,能够快速简单的设置Http Method,以方便日后支持RESTFUL的URL规范。有两种简单的做法,第一种做法是使用二维Map ,即map[string]map[string]http.HandlerFunc,其中一维的键String表示请求method比如post, get 等。二维的键string表示要匹配的URL地址, http.HandlerFunc当然就是处理URL请求的具体方法。第二种做法即是笔者采用的做法,其实是第一种做法演变而来的,HTTP 中Method的种类是固定的,其实我们完全可以用一个数组,而值为map[string]http.HandlerFunc来实现。 const ( GET = iota POST PUT DELETE CONNECTIBNG HEAD OPTIONS PATCH TRACE ) 看完上面常量的设置,想必读者已经知道了我的意思,e.g:array[0]表示GET方法下所有的接口的集合,array[1]表示POST方法下所有的接口的集合基本原理其实也简单,把Get方法下的所有的接口都存储到array[0]的值中,以此推理其他方法。原理简单,但是一个框架的设计必须高内聚低耦合,一个Web框架中路由分发是基础,在该此处上需要建立更多的功能,比如说过滤器等。在初期设计的时候必须保证要有可扩展性,所以笔者认为难点在于此。下面直接上代码,对应的代码有充分的注释。 package odserver import ( "net/http" ) //实现IOdServer的接口,以及http提供ServeHttp方法 type OdServer struct { router MethodMaps } type IOdServer interface { GET(url string, f HandlerFunc) POST(url string, f HandlerFunc) PUT(url string, f HandlerFunc) DELETE(url string, f HandlerFunc) } type HandlerMapped struct { f HandlerFunc } //接口函数单位,即我们编写代码逻辑的函数 type HandlerFunc func(w http.ResponseWriter, req *http.Request) func Default() *OdServer { return &OdServer{ router:NewRouter(), } } //实现Handler接口,匹配方法以及路径 func (o *OdServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { //转发给doHandler进行执行 o.doHandler(w,req) } //判断需要执行的Http Method,从而查找对应的接口并且执行 func (o *OdServer) doHandler(w http.ResponseWriter, req *http.Request) { switch req.Method { case http.MethodGet: { if hm, ok := o.router.GetMapping(req.URL.RequestURI()); ok { hm.f(w, req) } } case http.MethodPost: { if hm, ok := o.router.PostMapping(req.URL.RequestURI()); ok { hm.f(w, req) } } case http.MethodDelete: { if hm, ok := o.router.DeleteMapping(req.URL.String()); ok { hm.f(w, req) } } case http.MethodPut: { if hm, ok := o.router.PutMapping(req.URL.String()); ok { hm.f(w, req) } } default: { } } } func (o *OdServer) GET(url string, f HandlerFunc) { o.router.GetAdd(url, HandlerMapped{f: f}) } func (o *OdServer) POST(url string, f HandlerFunc) { o.router.PostAdd(url, HandlerMapped{f: f}) } func (o *OdServer) PUT(url string, f HandlerFunc) { o.router.PutAdd(url, HandlerMapped{f: f}) } func (o *OdServer) DELETE(url string, f HandlerFunc) { o.router.DeleteAdd(url, HandlerMapped{f: f}) } package odserver /** 提供基本的路由功能,添加路由,查找路由 */ const ( GET = iota POST PUT DELETE CONNECTIBNG HEAD OPTIONS PATCH TRACE ) func NewRouter() MethodMaps { return []handler{ GET: make(handler), POST: make(handler), PUT: make(handler), DELETE: make(handler), } } type MethodMaps [] handler type handler map[string]HandlerMapped //映射路由,获取Get方法下对应的接口 func (m MethodMaps) GetMapping(url string) (HandlerMapped, bool) { if hm, ok := m[GET][url]; ok { return hm, true } return HandlerMapped{}, false } //映射路由,获取Post方法下对应的接口 func (m MethodMaps) PostMapping(url string) (HandlerMapped, bool) { if hm, ok := m[POST][url]; ok { return hm, true } return HandlerMapped{}, false } //映射路由,获取Delete方法下对应的接口 func (m MethodMaps) DeleteMapping(url string) (HandlerMapped, bool) { if hm, ok := m[DELETE][url]; ok { return hm, true } return HandlerMapped{}, false } //映射路由,获取Put方法下对应的接口 func (m MethodMaps) PutMapping(url string) (HandlerMapped, bool) { if hm, ok := m[PUT][url]; ok { return hm, true } return HandlerMapped{}, false } //增加Get方法下的接口 func (m MethodMaps) GetAdd(url string, mapped HandlerMapped) { if _, ok := m.GetMapping(url); ok { panic("duplicate url with get method") } m[GET].SetUrl(url,mapped) } //增加Post方法下的接口 func (m MethodMaps) PostAdd(url string, mapped HandlerMapped) { if _, ok := m.GetMapping(url); ok { panic("duplicate url with Post method") } m[POST].SetUrl(url,mapped) } //增加Put方法下的接口 func (m MethodMaps) PutAdd(url string, mapped HandlerMapped) { if _, ok := m.GetMapping(url); ok { panic("duplicate url with Put method") } m[PUT].SetUrl(url,mapped) } //增加Delete方法下的接口 func (m MethodMaps) DeleteAdd(url string, mapped HandlerMapped) { if _, ok := m.GetMapping(url); ok { panic("duplicate url with Delete method") } m[DELETE].SetUrl(url,mapped) } func (h handler) SetUrl(url string, mapped HandlerMapped) { h[url] = mapped } 如我所说,我觉得学习Golang比较有意思的是,可以将从Java里学到的东西,转之在Golang里尝试实现,不仅学习了Golang,还使得自己对Java的认识进一步提升。如果读者有更好的方法,不吝赐教 参考资料:# Golang学习笔记 - 标准库"net/http"的简析及自制简单路由框架

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

第 5 章 版本控制及如何运作

目录 5.1. 版本库布局 5.2. 策略 5.3. nightly version 5.4. rc1,rc2,rc4 5.5. 怎样写注释信息 5.5.1. Fixed Bug 5.5.2. Implemented 5.5.3. Add 5.1.版本库布局 版本库布局 trunk branches tags releases 多项目版本库布局 /-> branches .---> project 2 ---> trunk / \-> tags / / /-> branches repositories -------> project 1 ---> trunk \ \-> tags \ \ /-> branches `---> project 3 ---> trunk \-> tags Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a>comments powered by Disqus 原文出处:Netkiller 系列 手札 本文作者:陈景峯 转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

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

ANDROID L——Material Design详细解释(UI控制)

转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lollipop(5.0)。 前几天发现Android5.0正式版的sdk已经能够下载了。并且首次搭载Android L系统的Nexus 6和 Nexus 9也即将上市。 所以是时候開始学习Android L了。 关于Android L怎样配置模拟器和创建项目,假设大家有兴趣的话能够看看我之前的一篇文章: Android L——模拟器配置及创建项目 Material Design: Material Design是Google推出的一个全新的设计语言,它的特点就是拟物扁平化。 Material Design包括了非常多内容,我大致把它分为四部分: 主题和布局——ANDROID L——Material Design具体解释(主题和布局) 视图和阴影——ANDROID L——Material Design具体解释(视图和阴影) UI控件——ANDROID L——Material Design具体解释(UI控件) 动画——ANDROID L——Material Design具体解释(动画篇) 今天就先来说说第三部分——Material新增的UI控件 UI控件 在Android L中新增了两个控件各自是RecyclerView,CardView : RecyclerView: RecyclerView是ListView的升级版,它提供了更好的性能并且更easy使用。 RecyclerView这个控件是一个能够装载大量的视图集合,而且能够很效率的进行回收和滚动。当你list中的元素常常动态改变时能够使用RecyclerView控件。 RecyclerView很easy使用,它提供了例如以下两个功能: 为每一个条目位置提供了layout管理器(RecyclerView.setLayoutManager) 为每一个条目设置了操作动画(RecyclerView.setItemAnimator) 以下的样例介绍了怎样定义和使用一个RecyclerView: 1.在布局文件里加入一个RecyclerView <!-- A RecyclerView with some commonly used attributes --> <android.support.v7.widget.RecyclerView android:id="@+id/my_recycler_view" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent"/> 2.初始化RecyclerView參数。设置layoutManager和adapter public class MyActivity extends Activity { private RecyclerView mRecyclerView; private RecyclerView.Adapter mAdapter; private RecyclerView.LayoutManager mLayoutManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_activity); mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); // improve performance if you know that changes in content // do not change the size of the RecyclerView mRecyclerView.setHasFixedSize(true); // use a linear layout manager mLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLayoutManager); // specify an adapter (see also next example) mAdapter = new MyAdapter(myDataset); mRecyclerView.setAdapter(mAdapter); } ... } 3.创建一个adapter public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private String[] mDataset; // Provide a reference to the type of views that you are using // (custom viewholder) public static class ViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; public ViewHolder(TextView v) { super(v); mTextView = v; } } // Provide a suitable constructor (depends on the kind of dataset) public MyAdapter(String[] myDataset) { mDataset = myDataset; } // Create new views (invoked by the layout manager) @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.my_text_view, parent, false); // set the view's size, margins, paddings and layout parameters ... ViewHolder vh = new ViewHolder(v); return vh; } // Replace the contents of a view (invoked by the layout manager) @Override public void onBindViewHolder(ViewHolder holder, int position) { // - get element from your dataset at this position // - replace the contents of the view with that element holder.mTextView.setText(mDataset[position]); } // Return the size of your dataset (invoked by the layout manager) @Override public int getItemCount() { return mDataset.length; } } CardView: CardView继承自FrameLayout。同意你在card视图中显示信息. CardView也能够设置阴影和圆角。(事实上如今非常多应用都自己定义了Card视图,Google这回将card视图作为基本控件,能够拿来直接使用了) Layout中为CardView设置圆角使用card_view:cardCornerRadius属性 代码中为CardView设置圆角使用CardView.setRadius方法 为CardView设置背景颜色使用card_view:cardBackgroundColor属性 在布局中包括一个CardView,例如以下: <!-- A CardView that contains a TextView --> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_gravity="center" android:layout_width="200dp" android:layout_height="200dp" card_view:cardCornerRadius="4dp"> <TextView android:id="@+id/info_text" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v7.widget.CardView> 兼容性: RecyclerView,CardView都包括在Android L Developer Preview Support Library中。所以他们能够在之前的版本号中使用,仅仅会有一些限制。 总结: 我将Material Design分为例如以下四部分: 主题和布局——ANDROID L——Material Design具体解释(主题和布局) 视图和阴影——ANDROID L——Material Design具体解释(视图和阴影) UI控件——ANDROID L——Material Design具体解释(UI控件) 动画——ANDROID L——Material Design具体解释(动画篇) 本文所介绍的两个控件(RecyclerView,CardView)很重要,由于在以后Android L的开发中会经经常使用到。 这篇文章介绍的内容都是从官方文档翻译过来的,大家看着可能有点迷糊。只是没关系。过几天我会更新一个介绍RecyclerView,CardView在Android Studio和Eclipse中是怎样导包。和两个控件结合使用的小Demo。 Android L——RecyclerView,CardView导入和使用(Demo) Material Desgin的介绍仅仅剩下动画部分了。我会尽快更新,敬请期待。。。 版权声明:本文博客原创文章,博客,未经同意,不得转载。 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4681969.html,如需转载请自行联系原作者

资源下载

更多资源
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等操作系统。

用户登录
用户注册