关于eclipse:Mac-上安装配置-eclipse

1. 从Eclipse官网(https://www.eclipse.org/downloads/packages/)下载本人电脑对应的版本 2. 下载后点击装置3.在mac上装置GDB应用以下命令装置 brew install gdb装置实现后,应用 gdb --version 验证装置实现 4.配置Eclipse关上Eclipse在其菜单栏抉择 Eclipse > Preferences > C/C++ > Debug > GDB 设置gdb可执行文件的门路,如: 5.创立证书验证GDB1.关上本机钥匙串拜访App2.在其菜单栏抉择 钥匙串拜访 > 证件助手 > 创立证书 填写如下信息: 名称:gdb-cert身份类型:自签名根证书证书类型:代码签名钩选:让我笼罩这些默认设置3.一路确定创立好证书。4.先创立一个文件 gdb-entitlement.xml,内容为: <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>com.apple.security.cs.debugger</key> <true/></dict></plist></pre>5.应用如下命令对gdb进行签名 codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb)6.在Eclipse创立一个hello的C++工程,点击debug可能进入debug场景则为配置胜利。 6.阐明1.如果在配置实现前先关上了Eclipse,则须要重启Eclipse。2.参考文档:https://segmentfault.com/q/1010000004136334

April 7, 2023 · 1 min · jiezi

关于eclipse:Eclipse-给-Java-应用创建-Run-configuration-时找不到-main-type-的错误消息

我在 Eclipse 里选中 com 文件夹下选中一个 .java 文件,这个 Java 文件实现了 public static void main(String[] args) 办法,我想作为一个 Java 利用间接运行它。 抉择 Run As -> Java Application: 遇到谬误音讯:Selection does not contain a main type: 我抉择 Run Configurations: New Launch configuration: 创立一个新的 Configuration,却发现找不到 Main Type: 起因可能在于 com 文件夹并没有被 Eclipse 看作是一个 source folder. 把上图的 com 文件夹拖拽到 Java 创立向导主动生成的 src 文件夹内。 呈现了大量的 jco 相干谬误: 把这些编译谬误全副修复后,在 Select type 下拉菜单里就能看到 SimpleCall 了: 总之,只有 source folder 里的 .java 文件能力成为 Main type 搜寻的 candidate: ...

November 6, 2022 · 1 min · jiezi

关于eclipse:eclipse-Editor-does-not-contain-a-main-type

问题背景环境参数: eclipse: Version: 2020-12 (4.18.0)jdk: 1.8eclipse中编译运行Java 程序,弹出如下谬误提示框 报错信息报错内容: 报错截图: 问题剖析以后源代码( 所有包 ) 没有被作为源文件文件夹 ,即没有被Eclipse构建为门路 Build Path,这就会导致,Eclipse不辨认这个源文件夹,天然外面的主类也不被辨认 问题解决既然源文件 src 没有被作为源文件应用,设置 use as Source folder 构建好后,src门路应该如下图 此时外面的包 也 不再是文件夹款式,而是包的款式! 相干参考https://blog.csdn.net/github_...

March 18, 2022 · 1 min · jiezi

关于eclipse:Eclipse-不为人所知的另一面-企业管理软件领域-ABAP-编程语言开发利器

对于 Java 从业人员来说,无论是刚入门的老手还是专家,必定都正在或者已经应用过 Eclipse,这是一款优良的编写 Java 程序的 IDE. 然而可能大多数 Java 开发人员都没有意识到,Eclipse 同时也能用来进行另一款在企业治理软件开发畛域赫赫有名的编程语言的开发工作,这门语言就是 ABAP. 在 2022 年 3 月最新的 TIOBE 编程语言排行榜上,Python, C 和 Java 分列前三甲,而 ABAP 位列第 42 名。 ABAP 之前的两门语言,别离是同样出自寒门微软的 Powershell 和 TypeScript. 而 ABAP 这门编程语言,是企业治理软件巨头,德国最大的软件公司 SAP 应用的开发语言,其旗舰级产品 S/4HANA 和已经成为 ERP 软件畛域代名词的 R/3,都基于 ABAP 开发而成。 在 SAP 公司开创之初,ABAP 程序的编写工具是 SAP GUI,一个界面古朴的 IDE,如下图所示: SAPGUI 这款 IDE 的页面布局设计,乍一看有点像当初的 Visual Studio Code,但 SAPGUI 诞生于 1992 年,能够说是 Visual Studio Code 的前辈了。 ...

March 12, 2022 · 3 min · jiezi

关于eclipse:EclipseEclipse使用技巧

一、参考链接阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com) eclipse镜像-eclipse下载地址-eclipse装置教程-阿里巴巴开源镜像站 (aliyun.com) https://www.eclipse.org/ 下载地址:https://mirrors.aliyun.com/eclipse/ 二、Eclipse简介Eclipse 是一个凋谢源代码的、基于 Java 的可扩大开发平台。就其自身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。侥幸的是,Eclipse 附带了一个规范的插件集,包含 Java 开发工具(Java Development Tools,JDT)。四、Eclipse应用1、调整eclipse字体大小 2、按“shift+alt+x”组合键,调出运行框,接着按“J”键启动运行代码。 3、导入Java Project我的项目文件夹 个别抉择将Java Project我的项目文件夹对立搁置eclipse-workspace中,便于管理应用。

February 24, 2022 · 1 min · jiezi

关于eclipse:Eclipse阿里云镜像源配置

一、什么是EclipseEclipse 是一个凋谢源代码的、基于 Java 的可扩大开发平台。就其自身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。侥幸的是,Eclipse 附带了一个规范的插件集,包含 Java 开发工具(Java Development Tools,JDT)。 二、阿里云镜像上的eclipse下载地址: https://mirrors.aliyun.com/eclipse/technology/epp/downloads/release/2021-12/R/ 三、为什么要应用阿里云镜像源大家在应用eclipse过程中须要去官网下载各种插件,然而因为官网访问速度起因,极大影响了用户体验,举荐大家应用国内镜像源下载,速度将大幅度回升。 四、应用办法1.Help-Install New Software 2.Add-Name and Location-Addname能够轻易取,我这里填了 aliyunLocation: https://mirrors.aliyun.com/eclipse/releases/latest/ 3.Select and Download能够依据本人的需要下载插件,拖动滑动条能够查看更多插件,须要的插件在后面打勾,按next持续并下载,下载完后按finish完结 4.Finish能够在eclipse右下角查看装置进度。 总结绝对于官网下载速度,我感觉阿里云资源更适宜咱们这些国内用户。

December 24, 2021 · 1 min · jiezi

关于eclipse:使用了-10-年-eclipse-之后我终于放弃了

本文起源:https://www.cnblogs.com/ouyida3/p/9901312.html 作者:噢咦嗒 整顿:起笔应用了eclipse10年之后,我终于投向了IDEA 最近,改用了idea,共事都说我投敌了。当然,这些共事都是和我一样的“老”程序员。不说毕业生,公司里的90后根本电脑都不会装置eclipse。 eclipse 的三足鼎立期间开始我写Java程序,用的并不是eclipse,而是用的一款叫做jbuilder的工具。过后应用这个工具的时候,我曾经感觉十分的好用,因为在此之前,我如同记得只是用个简略的文本工具来编辑。起初才发现,那些喜爱鼓吹文本编辑器能力学会精通java的“高手”真的有点不敢恭维,至多于我,一个好的工具太重要了。 并没有过了多久,我发现一款叫做eclipse的工具,而且身边还越来越多,于是我决定试一试。尝试的最初,我发现切实是太好用了,他的界面变得更丑陋,而且外面的性能感觉就是为程序员量身定做的一样,最激动人心的性能是他居然反对源源不断的插件,而且这个插件你还能够,本人来编写。 eclipse2001年由ibm创建,2003年就成立基金会,惋惜国内嘛,在那个时代,总是要晚一些,而我更落后,直到07、08年才开始真正应用。《程序员》在06年还出了一起专题-Eclipse风暴。那时候,eclipse、jbuilder、netbean三足鼎立的场面,根本造成了。eclipse 称霸 再起初myeclipse呈现了这个货色更加厉害,他集成了所有罕用的插件,只有你一键装置完就啥也有了,基本上用它,你能够开发出java的任何货色。尽管他不是收费的。 缓缓的,jbuilder曾经没什么人应用;而netbean不晓得是不国内还是我圈子太窄,身边用的人总是很少,倒是在国外翻译的技术书里常常和eclipse一起呈现。 重构的风行,让eclipse更受青眼。熊节在《重构》译本里举荐eclipse,起初我亲眼看了他应用eclipse纯键盘(根本不必鼠标)飞快的重构代码,有点傻了眼。起初背诵快捷键成了我的一项课题。 在接下来靠近10年的日子里,就是他陪着我度过了漫长又有意思的编程生涯。尽管常常有人争执用简略版的eclipse好还是用丰盛的myeclipse好,用丰盛版的常常会讥笑用简略的,什么都没有,什么插件都得从新来一遍,用简略版的又会鄙视应用丰盛版的,什么插件都不会装置。我已经见过有一个共事,应用的滚瓜烂熟,每一个插件在文件夹下叫什么名字应该删除哪些文件应该放在什么中央,应该减少哪些配置,怎么装置怎么卸载都滚瓜烂熟,随后我也缓缓学会了这招。再起初插件装置,曾经不须要这么麻烦了,只须要在市场上搜寻一下,点击一下装置就能够了。然而这些性能的改良并没有让他罢黜用户群缓缓转移的危机。 Intellij IDEA 横空出世 其实很久之前我就据说idea十分好用,说只有应用过后就不会在应用eclipse了。还说JetBrains这家公司怎么怎么懂得java程序员。然而,我切实找不到什么扭转的理由,所以始终没有尝试应用。况且,我还须要开发c++、python,这些语言,eclipse都有欠缺相应的版本插件反对。 其实两头,我也一直地询问曾经转向应用的共事,我问他到底别/如同哪里?然而没有一个共事可能清晰的答复我这个问题。大部分的共事只是说就是很好用,你如果细细地问他好在哪儿,他却说不进去。还有一些共事的确列举了一些,他认为更为好用的性能,而后通知我,而后我听完之后通知他,其实这些性能eclipse也有。还有一个共事更搞笑,用了两个月了,说十分的好用,而后我叫他调大一些,字体让我看看,他居然说不晓得怎么调。这些遭逢切实让我想不进去什么要扭转的理由。 然而上个星期呈现了一个契机,就是公司主持了几个培训,不谋而合的这几位培训,是都应用IDEA来培训,其实,工具的不同并没有太大的影响及对培训常识的排汇,然而我切实忍耐不了我明明花了一个小时听培训,然而只听了55分钟的常识,残余的5分钟对于工具的应用技巧也应该排汇过去。加上早就据说Robert C Martin兴许从一个eclipse转向了这个工具,于是我决定我要扭转一下了。 上周一是我扭转的第一天,装置过程十分顺利,官网提供免费版和试用版,我当然毫不犹豫地抉择的试用版,至于30天当前,咱们心领神会,再说。装置过后当然是亮堂堂的一个界面,下面的所有按钮切实是十分的生疏,我应用的10年的那些快捷键发现全副不好使了,我甚至连怎么导入一个现有的工程都不会了。 我有点受不了了,我受不了的不是对新常识的学习与把握,而是效率迅速升高20倍,甚至一百倍。没方法,一个一个问题百度吧。大略过来了半天到一天,神奇的事件产生了,我居然不再想持续用eclipse了,甚至有点没有了IDEA,感觉更麻烦了。于是家接下来的四天,我越来越顺畅地开始编写我的代码了。 对于只是应用了五天的,我来说,我说的什么,其实都只是一个老手的废话,然而我还是喜爱总结一下。 eclipse和idea,哪个更好?idea,集体感觉,的确比eclipse要更好,然而它的益处并不次要是多了哪些性能,从性能的多少数量上来说,他们俩其实是差不多的, IDEA,更优良的关键点在于他在细节上更为人性化,做得更优良而已。 比方配置tomcat,我居然不必百度,本人尝试点点,就胜利跑起来了。感觉它真的懂我的心一样。 逆锋起笔是一个专一于程序员圈子的技术平台,你能够播种最新技术动静、最新内测资格、BAT等大厂大佬的教训、增长本身、学习材料、职业路线、赚钱思维,微信搜寻逆锋起笔关注!开始应用的一些注意事项如果你是刚开始编程,那就没什么关系,然而像我一样是用的eclipse很多年的老程序员,那么对快捷键肯定是一个阻碍,然而idea曾经做了很人性化的设置,默认的快捷键能够一键改成eclipse的快捷键,然而我尝试了,的确扭转了大部分,但并不是百分之百,所以我放弃了。 还有就是对工程和模块要了解好,以前的eclipse都是做工程的概念并没有模块的概念,所以你能够把很多的工程都导入进去,然而IDEA齐全不一样,他只能导入一个工程,如果你要在导入另外一个工程,你必须新开一个界面,当然你不必放心消耗内存的问题,曾经。优化好了,然而在一个工程外面你能够导入多个模块,其实这个更适宜咱们平时的开发,因为maven 就是模块化的配置。 tomcat的设置也十分人性化,留神的是,能够通过勾选tomcat实例,就能够一个tomcat多个工程应用了。当然,端口要不同,能力同时启动。 三个很罕用的设置按钮PreperencesProject structureRun configuration罕用的快捷键(mac)cmd+shift+f 全project或模块等查找某个字符串cmd+shift+o 查找文件cmd+0 查找类cmd+f 本文件中查找字符串cmd+x 删除一行cmd+c 选中该行并且复制alt+enter 主动提醒谬误修复ctrl+alt+h 显示调用该办法的办法cmd+7 显示该类的全副办法cmd+alt+l 整顿代码格局ctrl+alt+o 整顿importshift+f6 重构rename还有很多。。。根本都和eclipse不同,然而我必须一个个的“寻找”回来。我喜爱的特色性能idea默认上面显示了teminal,很好用,当初我很少用mac自带的终端(尽管eclipse找找也有,但切实不好用)右手边有个数据库连贯,我当初也很少用Navicat和mysql workbench了同样左边的maven也很好用,不像eclipse要右键,而且默认的还不齐全JetBrains的确是平凡的公司,当初我弄js,也用了它的webstorm,弄python也用了他的pycharm而不是eclipse的pydev了。 再见,eclipse。 又断断续续用了一周,发现没有设想中完满。偶然有些卡,毕竟太多货色放内存。而且也呈现过闪退。快捷键切实有些还记不住,有个快捷键要按四个键太难记了。有些个别性能感觉还是有点不如eclipse不便比方改字符集(也可能我不相熟)。断点调试也还不习惯。也有很多性能真的要把eclipse彻底遗记,比方重构rename,idea默认居然把同名的都rename掉。我重构个我本人写的类的get办法,它把map.get的get也rename掉了,真的有点无语。不过习惯就好,总比漏了一些rename本人缓缓改好。 逆锋起笔是一个专一于程序员圈子的技术平台,你能够播种最新技术动静、最新内测资格、BAT等大厂大佬的教训、增长本身、学习材料、职业路线、赚钱思维,微信搜寻逆锋起笔关注!

August 23, 2021 · 1 min · jiezi

关于eclipse:eclipse-快速创建-springboot项目

1. 装置springboot插件help -> Eclipse Marketplace -> search ↓一路装置就好了 2. 创立springboot我的项目如果没有找到,能够重启eclipsenext↓,默认是连贯 https://start.spring.io ,然而有可能失败,如下图所示这时候能够将 “https://start.spring.io” 切换为 “http://start.aliyun.com”连贯胜利后↓抉择须要的包↓默认域名8080,这里批改为8000了,输出网址看到就胜利了 ——————至此一个简略的springboot我的项目就创立好了 3. 可能报错如果pom报错,入口文件中org.springframework标红查看本地springboot版本,替换版本号,再右键pom.xml->refresh

May 12, 2021 · 1 min · jiezi

关于eclipse:Mybatis

一、Mybatis简介1、什么是mybatis Mybatis是由apache提供的一个针对长久层开源框架,对JDBC拜访数据库的过程进行了简化和封装应用mybatis能够只关注SQL语句自身,而不须要关注(JDBC中的)注册驱动、获取连贯、获取传输器、开释资源等过程。mybatis能够将要执行的SQL语句应用xml文件的形式或者注解形式配置起来,在执行时,将Java对象中携带的参数值和SQL骨架进行映射,生成最终要执行的SQL语句,将执行的后果解决后再返回。2、mybatis的一些劣势 1)JDBC连贯拜访数据库有大量反复的代码,而mybatis能够极大的简化JDBC代码 注册驱动、获取连贯、获取传输器、开释资源2)JDBC没有自带连接池,而mybatis自带的有连接池3)JDBC中是将SQL语句、连贯参数写死在程序中,而mybatis是将SQL语句以及连贯参数都写在配置文件中。4)JDBC执行查问后失去的ResultSet咱们须要手动解决,而mybatis执行查问后失去的后果会解决完后,将解决后的后果返回。二、mybatis的疾速入门程序1、筹备数据: 执行 /unit08-mybatis/sql脚本.txt 文件中的所有sql语句,创立yonghedb库,并创立emp表,往emp表中插入若干条记录。2、创立我的项目、导入jar包、提供测试类 2.1.创立的Maven的java我的项目:CGB-Mybatis-012.2.在我的项目的pom文件中导入依赖:junit、mysql驱动、mybatis、log4j等2.3.创立com.tedu.MybatisTest01测试类 ------------------------------- <dependencies> <!-- 引入mybatis依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <!-- 引入mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> </dependency> <!-- 引入单元测试的依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> <!-- 引入日志框架的依赖 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.4</version> </dependency> </dependencies> -------------------------------3、提供配置文件(mybatis-config.xml、EmpMapper.xml) 3.1.提供mybatis-config.xml文件 mybatis-config文件中次要配置了事务管理形式、连贯数据库的参数、导入mapper文件3.2.提供EmpMapper.xml文件 EmpMapper文件次要配置未来要执行的SQL语句(查问、新增、删除、批改) 4、提供Emp实体类 如果要查问所有的员工信息,员工信息查问进去后须要封装到Java对象中因为这里须要提供的Emp(员工)类,这个类用于封装所有的员工信息com.tedu.pojo.Emp有哪些信息(数据)须要封装到Emp类中,就在Emp类中提供什么的属性/变量在Emp中提供4个变量(id、name、job、salary)别离用来封装emp表中的id、name、job、salary四列数据。再提供4个变量(id、name、job、salary)对应的Get和Set办法----------------------------------------------------1) 什么是POJO? plain old/ordinary java object: 简略java对象, 专指用于封装数据的对象 例如: 为了封装员工信息, 咱们能够提供一个Emp类来封装员工信息2) id和salary为什么不必根本数据类型而是应用包装数据类型? 根本数据类型有默认值, 例如 int类型变量默认值是0, 如果应用包装类型,默认值为null 默认值为0,有时影响咱们的判断(例如,一个int类型的变量为0,咱们无奈辨别0是赋的值还是默认值)3) Emp类中的变量名为什么要和emp表中的列名保持一致? 框架在将查问的后果封装到Emp对象中时,就是通过emp表中的列名(id,name,job,salary) 生成对应的set办法( setId, setName, setJob, setSalary ), 将查问的后果封装到Emp对象中 如果没有set办法, 也是通过emp表中的列名(id,name,job,salary)找到Emp类中的 变量(id,name,job,salary), 通过暴力反射将查问的后果封装到Emp对象中。----------------------------------------------------三、MyBatis中的占位符0、启用log4j日志框架: 专门为Java语言提供的一套日志框架,能够通过log4j打印程序中执行的日志信息 ...

April 20, 2021 · 1 min · jiezi

关于ssm:javalangNullPointerException-with-root-cause

报错大抵内容java.lang.NullPointerException] with root cause写在后面阐明:这只是我发现的其中一个起因,可能你的和我有所不同。如果没有解决问题,轻喷。。 我的项目简介SSM我的项目,用eclipse开发。 背景阐明商城后盾增加商品。填写完商品的相干信息后,提交表单,报错。 起因填写的时候,所输出的值要和POJO实体类的属性的类型统一,否则就报错   例子前台页面及局部代码 后盾POJO类 因为POJO类中price的类型是Double,那商品价格一栏就不要输出字符串(本人最开始测试时轻易输出了一些字母,报错了,改输为数字即可。) 参考java.lang.NullPointerException] with root cause

April 9, 2021 · 1 min · jiezi

关于eclipse:eclipse-SSM项目前端填写表单往数据表存数据中文乱码导致后端显示也乱码

问题形容eclipse我的项目,SSM,前端填写表单(form元素),提交所填写的中文“收货地址”,存到数据库,呈现中文乱码的问题(数据表中是乱码的,从数据库读到页面上的也是乱码的)    可能1.eclipse我的项目编码格局(这个预计最影响)批改eclipse我的项目的编码格局 阐明:Windows下eclipse默认编码为GBK。 留神:如果你不介意我的项目中的中文正文全乱码,能够间接批改。如果介意,倡议从新建一个我的项目,而后用原我的项目的src文件夹和WebContent文件夹笼罩新我的项目的src和WebContent文件夹      2.批改tomcat的server.xml(这个也很重要)1)用文本编辑器(如记事本),关上tomcat装置目录下conf文件夹下的server.xml 阐明:如果不记得装置门路,能够用everything软件搜寻tomcat-   2)搜寻connectionTimeout="20000",加上URIEncoding="UTF-8",保留文件。      3.数据库连贯时要写上encoding=UTF81)如果你是间接在applicationContext.xml中配置数据源,查看下url的值 即下方的<property name="url" value="jdbc:mysql://localhost:3306/easymall?characterEncoding=utf8"/>看是否写了characterEncoding=utf8 <!--配置数据源--> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/easymall?characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="12345678"/> <!--最大连接数--> <property name="maxTotal" value="30"/> <!--最大闲暇连接数--> <property name="maxIdle" value="10"/> <!--初始化连接数--> <property name="initialSize" value="5"/> </bean>   留神(满腹经纶,踩过坑,所以补充一下,轻喷): 不要写成<property name="url" value="jdbc:mysql://localhost:3306/easymall?useUnicode=true&characterEncoding=utf8"/>或者<property name="url" value="jdbc:mysql://localhost:3306/easymall?characterEncoding=utf8&useUnicode=true"/>即不要加上useUnicode=true,否则无奈启动服务器,无法访问页面,如果报错了,倡议翻下console面板中的控制台输入(多往上翻,不要只看最初一块的报错信息)      2)如果你是加载配置文件,则批改配置文件中url的编码 具体参考此文:SSM解决中文存入数据库乱码问题(记录本人的问题)     4.jsp视图加上UTF8(在新建jsp文件时就要留神)个别在新建jsp时留神改过来就行(个别是ISO-8859-1 文件顶部的pageEncoding设置 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>     5.我的项目的web.xml写上一些配置代码(影响不是很大)留神:filter中的filter-name的值与filter-mapping中filter-name的值统一 <!-- 防止中文乱码 --> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>     参考解决springmvc承受前端传来的中文呈现中文乱码状况 SSM解决中文存入数据库乱码问题(记录本人的问题) IDEA向数据库中插入中文数据乱码问题永恒解决办法

April 9, 2021 · 1 min · jiezi

关于spring-mvc:MybatisMapper-method-attempted-to-return-null-from-a-method

关键词SpringMVC SSM Mybatis eclipse 报错内容Mybatis:Mapper method attempted to return null from a method with a primitive return type (int)起因Mapper.xml的标签用错了。。。(低级谬误,轻喷。。。) 比方原本应该:插入语句用<insert></insert>,更新语句用<update></update>,删除语句用<delete></delete> 后果全用成<select></select> 解决用回对应的标签就行。 参考Mybatis:Mapper method attempted to return null from a method with a primitive return type (int)

April 9, 2021 · 1 min · jiezi

关于eclipse:微信计数器微信自动加好友微信自动通过好友微信HOOK微信静默清粉

<blockquote>理解了微信吸粉等相干行业,其中有个需要就是计数器,原理是通过HOOK指定CALL,从中调用计数平台API来实现此性能。当然广泛免费的计数器都是要本人搭建服务器的,此软件目前仅在本地测试。</blockquote> 全套微信HOOK教程地址:https://www.bilibili.com/video/BV1it411F7w8?p=18 这是微信通信的XML <msg fromusername="wxid_0ojxufnztgnr22" encryptusername="v3_020b3826fd0301000000000087de3255bad3b6000000501ea9a3dba12f95f6b60a0536a1adb6b4d6b90308c17550336cc3cb0dfc183b2979f9988e9f7b80f5ada580513895594bec3726809fabd47e3890d30e8f5ae70f1a0e80866183e177de817d44@stranger" fromnickname="ABC的" content="加我呀" fullpy="ABCde" shortpy="ABCD" imagestatus="3" scene="6" country="" province="" city="" sign="" percard="0" sex="1" alias="gulumiha" weibo="" albumflag="0" albumstyle="0" albumbgimgid="" snsflag="256" snsbgimgid="http://shmmsns.qpic.cn/mmsns/uchmtWQh7iapUrYlBseDgJmicxZ3g5BxOr6PiaCda3r3RDjKQVs8nRLZ644KuNPSr8WIJMz8WunlD8/0" snsbgobjectid="12970871503333953733" mhash="0940aeaf7810628dfa0d1115198c9ce4" mfullhash="0940aeaf7810628dfa0d1115198c9ce4" bigheadimgurl="http://wx.qlogo.cn/mmhead/ver_1/RtvTzjrPU9IJP6KHnHJ0znVQT8VMTGZ3OD6NsHTHlNFzaXqd5OhsKVrx7Z6z3PL7tokNw3icwJWpY0sBHZOZvJWHpbBWPt4pK1DfyaNyM2nM/0" smallheadimgurl="http://wx.qlogo.cn/mmhead/ver_1/RtvTzjrPU9IJP6KHnHJ0znVQT8VMTGZ3OD6NsHTHlNFzaXqd5OhsKVrx7Z6z3PL7tokNw3icwJWpY0sBHZOZvJWHpbBWPt4pK1DfyaNyM2nM/132" ticket="v4_000b708f0b0400000100000000007b41b1b242dd870f3fd75e03fd5f1000000050ded0b020927e3c97896a09d47e6e9e143fb24151eaa11f6a66e5a6540bfc311db0c61d8f28e10982a3784b4ee27993cf96884c23f1e6206386eda12aa65633ccd8650389f0445d4be7bb1c7f465d4d89e081ebe4da657a2282234113833a8f7da8a58773ece7379862eb32d21c6fe3a02ebb4532d2fd5eb5@stranger" opcode="2" googlecontact="" qrticket="" chatroomusername="" sourceusername="" sourcenickname="" sharecardusername="" sharecardnickname="" cardversion=""><brandlist count="0" ver="727332477"></brandlist></msg>这是主动批准好友CALL //主动批准好友pushad mov ecx, dword [ebp-0x1C] //V1push dword [ecx+0x00000428]sub esp, 0x14push espcall dword [ebp-0x04] //第一个CALLmov ecx, dword [ebp-0x1C]//V1mov eax, dword [ebp-0x28]//Buff24push eaxcall dword [ebp-0x08]//第二个CALLmov esi, eaxsub esp, 0x08mov ecx, dword [ebp-0x14]//Eaxaddcall dword [ebp-0x0C]//第三个CALLmov edi, dword [ebp-0x2C]//BuffEdimov edx, edilea ecx, dword [edi+0x00000514]neg edxpush eaxsbb edx, edxand edx, ecxlea ecx, dword [edi+0x0000054C]push edxpush esicall dword [ebp-0x10]//第四个CALLpopad 目前半成品,对接了现成的计数平台,目前没有页面分享版本,将来会退出静默革除僵尸粉性能,以及页面分享性能。 拉勾注册机 本文转载自https://www.tgee.cn/微信计数... 本文由博客 TGEE|小黑猪的博客一键转发.

March 27, 2021 · 1 min · jiezi

关于eclipse:最好的IDEA-debug长文看完我佛了

你好,我是A哥(YourBatman)。 最近写了几篇IntelliJ IDEA系列的文章,反应蛮好。我想了下,因为并非是分享什么破解办法、举荐插件、主题这种蛋炒饭式哗众取宠的文章,而是实在对工作有帮忙,对进步工作效率很有用的内容。同学们对应用IDEA还是有不少痛点,或者姿态不够正确优雅,始终以来A哥保持写些不同流合污、有肯定深度专栏文章,哪怕只是个工具IDEA而已。 上篇文章 文末做了阐明,本打算IDEA系列告一段落,但有收到几条上百字的留言和私信,感觉有些读者的确很用心在看,所以决定宠粉再干几篇。对于IDEA系列,工具嘛,钻研原理没有意义,而是站在使用者的角度,介绍正确姿态和最佳实际,用工具提效是惟一目标。 当然,也有私信问我我的主题咋设置的挺难看?用了哪些好用的插件?自定义的插件如何开发?之类的,我认为这种的确没必要独自分享喽,因为用谷歌百度一下就能够找到一推拉,各行大佬写的文章多了去了本篇介绍IDEA调试debug,因为它的确很重要。会不会debug,有没有debug的意识,懂不懂 debug 的技巧,是有没有入门编程的重要标记。 对于IDEA debug调试的文章我在CSDN里早已发表过,反应还不错(看来有痛点的人不少呀): 明天我就把它“搬过去”,并做“加强”改变分享进去,心愿你喜爱。 本文提纲 版本约定IntelliJ IDEA:2020.3.2小插曲:IDEA刚公布了其2020.3.2这个小版本,启动图换成了20周年图,IntelliJ IDEA 20周岁啦,为期2天的周年庆流动对开发者收费凋谢,感受一下: 注释Debug调试对IT从业者不是个生疏概念,工作中常常会用到它,这无关乎于高级、中级、高级程序员。调试程序的形式有多种,如:输入日志、减少辅助变量、拆分函数体、断点调试等等,本文将介绍的是断点调试 -- 一种最卓有成效的调试办法。精确的讲,本文讲述是应用IntelliJ IDEA断点调试。 Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常时,启用Debug模式能够剖析定位异样产生的地位,以及在运行过程中参数的变动。除此之外,咱们也能够应用Debug模式来跟踪代码的运行流程来学习优良的开源框架。 断点调试有多重要?俗话说编码5分钟,debug2小时,从这句话就能体现出调试的重要性,毕竟它占据你“大部分”的工夫。 为了实在的体现出它的重要性,我“旁征博引”,找来了几个资深行业教训的大佬用援用他们的话来表述: 调试技巧比编码技巧更为重要,因为破费在调试上的工夫往往比编码还多,学到的货色比编码中学到的更丰盛调试技能重要性甚⾄超过学习⼀门语⾔不会调试的程序员,必定编制不出任何好的软件我把关键词都加粗划重点了,其重要性可见一斑。大佬尚且这么认为,何况是我等?所以,本文好好浏览O(∩_∩)O哈哈~ 什么是断点?忽然被这么一问,是不是脑袋懵懵的? 一个天天都在用的“货色”,若是真要你对它下个定义说给他人听,预计一时半会还解释不清。当然喽,大道至简,体会其要义能纯熟应用才是硬道理。本文作为一篇“庄重”的技术文章,天然须要先把断点这个概念用文字描述进去。 断点:为了调试而成心让程序暂停的中央。它是一种附加在源代码下面的非凡标记,在debug模式下能够触发特定动作,如暂停执行、打印线程堆栈、计算表达式的值、变量跟踪等等。断点的设置和勾销全人为手动治理,若不手动解决(删除)将会和我的项目始终存在。 如果你看过前两篇文章,肯定能解释为何它会始终存在我的项目里。倡议你返回参阅,电梯中转可见,断点的外围要义是暂停程序,从而在暂停那时刻就能够看到上线文的变量状况、IO状况、线程状况等信息,进而更深刻的理解程序,及时发现问题和追踪到谬误的本源。 断点参数断点并不是孤立存在的,它也能够有参数,从而定制出不同的断点行为,让其能在不同条件下失效,这个参数就叫断点参数。 咱们平时用得比拟多的条件断点,它就是断点参数的最典型利用。当然除了条件断点,其它的断点类型也是能够定制化参数的。那到底有哪些断点类型能够应用和定制呢?那么接下来就步入到本文主体内容,开始进入更有意思的局部啦。 断点的根本应用应该没人不会打断点吧,即便你是产品经理(产品经理莫名躺枪,手动狗头~)。 打断点最简略最间接的形式就是在你想设置断点的哪一行代码的最右边窗栏鼠标左键单击一下,实现后能看到一个小红点,就示意断点设置胜利啦,再点击一下就勾销。形如这样: 因为我的IDEA界面简洁,尽可能的去掉了“按钮”,所以平时我本人是应用到大量的快捷键来操作IDEA,打断点也是如此常常用快捷键去实现。当然喽,很多时候也用鼠标的啦,毕竟鼠标解决还是有其很大劣势的。 阐明:我的快捷键是Ctrl + Shift + B,仅供应你参考治理断点治理断点包含新增、删除断点。 对于大量断点来讲,鼠标一个个的点击给它删除掉是能够的。但若打了“大量”的断点在代码里(比方看xxx源码的时候),这时让去一个个找来删除是不太事实的,毕竟你可能本人都忘了哪儿有断点。这个时候一个治理页面/窗口就显得分外的重要了,在IDEA中提供了这样的窗口,你有多种形式关上它: 菜单栏形式:Run -> view breakpoints,毛病是门路太长太麻烦Actions形式:双击shift调出Actions窗口,输出view breakpoints即可关上任意断点处鼠标右键:抉择more即可关上治理窗口。毛病是:你至多得找到一个断点作为抓手(当然喽你能够任意处随便打一个点进去也成)调试窗口:该打开方式上面会提到快捷键形式:毫无疑问,这是我最为举荐的形式喽 在这个治理页面,你能够对断点进行增删改。 阐明:我的快捷键是Ctrl + Shift + F8,仅供应你参考如何debug模式运行?额,这讲得是不是有点过于简略了点。 启动Debug模式运行的形式有多种,比方工具栏的虫子小图标按钮、程序办法入口左键点击、菜单栏、右键菜单栏等等,上面简略演示下: 据我理解,很多同学最罕用的形式是点击上方工具栏右上角的虫子图标,因为我“没有”这个图标,所以“教程”中就不演示了。A哥平时99%状况下都是应用快捷键形式启动程序,因为我认为那是最迅速和便捷的(当然不肯定适宜你)。 此性能我的快捷键分为两大类 运行右上角以后选中的入口类。它有一组快捷键 Ctrl + Shift + Alt + enter:Run运行Ctrl + Shift + Alt + \:Debug运行因为很多时候须要从新的入口启动程序,做Spring Boot工程开发可能领会不到(入口只有一个),但在做教程、Demo的时候程序入口是常常变动的,所以不可能每次都还人肉去改启动类,效率太低。为此我就新设置了这组快捷键 ...

February 7, 2021 · 2 min · jiezi

关于eclipse:谁再把IDEA的Project比作Eclipse的Workspace我就跟谁急

你好,我是A哥(YourBatman)。 有一个观点:若一个Java开发者能把IDEA玩得666,则技术肯定不会差;但若玩不转IDEA(如不会设置、定制、解决日常问题、快捷键等等),那大概率程度很个别。因为高手个别得有高手的样子,你批准这个观点吗? 通过上篇文章 你也理解到,现今的Javaer绝大部分都应用IntelliJ IDEA作为IDE进行开发,但同时发现(从身边共事考察)大部分同学都并不能很好的应用IDEA,其中体现最为突出的是IDEA里的Project和Module两个概念,混淆不清或者概念齐全扭曲。 A哥是一个绝对来讲很重视基础知识搭建的Javaer,所以对于最罕用的工具也是如此,违心花些工夫去搞明确,包含页布局、性能定制、插件、以及快捷键都会调为本人最棘手的状态,毕竟工欲善其事,必先利其器。 本文将着眼于帮你深刻的介绍IntelliJ IDEA里最重要的两个概念:Project和Module,它是最最最根底也是最重要的,我认为本文不仅适宜应用IDEA的萌新,同样适宜应用IDEA的“新手”(已经eclipse的重度用户尤甚)。 本文提纲 版本约定IntelliJ IDEA:2020.3.1注释IntelliJ IDEA相较于Eclipse堪称是后起之秀,2006年开始锋芒毕露,2012年整体性能上完败Eclipse,2016年市场份额实现全面超过,一步步的逐步成为JVM平台的支流IDE。 正是因为有这样的历史进程,有少量“老”程序员是从Eclipse适度到IDEA来的,因而就有了一个颇具代表性的概念比照表格,不便“迁徙”: 诚然,IntelliJ IDEA的应用老本比eclipse略高,在那样的历史背景下,这张表格的确升高了“老”程序员们的迁徙适度老本,即便当初看来这张表格的形容并不精确,设置具备极大的误导作用(副作用开始展示......)。 IDEA和eclipse的概念类比上,最“驰名”的当属把IDEA的Project比作Eclipse的Workspace,回顾下你当初是不是常常听到这样的声音?博客文章这样说、培训机构老师这样说、甚至大学的老师也是教你这么去了解的。更有甚者,对于很多“中毒”很深的、已经的eclipse用户来说,他们是这样应用IDEA的: 实现了所谓的:IDEA在同一窗口显示多个我的项目。若你发现你身边有这么样治理我的项目的共事,那么他是你的“前辈”没跑了,因为铁定是eclipse的资深用户,而后迁徙到IDEA来。 这种做法是谬误的,毫不相干的我的项目(近程调用不叫有关系)没有理由放在同一视窗内,除了烦扰还是烦扰。Eclipse里有workspace工作空间的概念尚可了解,可IDEA里是相对不要这么做。 在 IntelliJ IDEA 中,没有相似于 Eclipse 工作空间(Workspace)的概念,而是提出了Project和Module这两个概念。本文来通知你,IntelliJ IDEA是如何治理我的项目Project、模块Module以及它俩关系,看完之后你会发现单这一点IntelliJ IDEA就比Eclipse优良得多。 Project和Module概念什么是ProjectEclipse中一个Workspace能够包含多个Project,而在IDEA里Project是顶级概念。 Project(翻译为:我的项目)IntelliJ IDEA的顶级组织单元,它是个逻辑概念。一般来说一个Project代表一个残缺的解决方案,如它可蕴含多个局部,如: 源代码构建脚本配置文件文档SDK依赖库...也就是说Project是个完整体,是个资源的汇合,扔到任何中央都是能够被解释的。 阐明:倡议把Project翻译为我的项目,而非工程,不在一个维度。因为一个module其实也能够了解为一个工程,防止混同什么是Module模块是是我的项目Project的一部分,必须隶属于Project而存在。它能够独立编译、测试、运行甚至部署。 模块是分而治之思维的体现,是升高大型项目复杂度的一种无效伎俩。模块是可重用的,若须要,一个模块能够被多个模块援用,甚至多个Project我的项目援用(比方commons模块)。 此处强烈不再倡议你把Eclipse的Workspace引入进来做类比,那只会把你带跑偏了。细品这两个概念定义,总结一下: 在IDEA中,Project我的项目是最顶级的结构单元,一个IDEA视窗有且只能代表一个Project 当初晓得为何把user、account、order扔到一个视窗里有如许的不适合了吧一个Project由一个or多个Module模块组成,对于大型项目来讲个别会有N多个module组成,如dubbo我的项目构造如下图所示: 一个module模块里,仍旧能够有子模块,已经可有限延长(但不倡议太多)Project是个逻辑概念,Module才是最终的存在模式 谬误应用 长处: 一个窗口,能看见全貌弊病: 视窗性能不繁多。account、order、user属于不同我的项目,是为了解决不同问题而存在,没有理由放在一起烦扰性太强。比方他们三都有类叫ProcessService,那么在你查找的时候永远无奈“精确定位” 额定性能开销。比方你只想开发user,但还得把其它的加载进来,齐全没有必要嘛。 阐明:idea不能像eclipse一样close project的,毕竟人家那是workspace的概念,而idea同一视窗属于同一我的项目,总不能说敞开某个模块吧,模块个别相关性很强,齐全没必要独自开/关想一想,若你一个人负责了20+个我的项目,每次关上是不是得花上个几分钟呢?概念上凌乱。这么放在一起,其实就不是user我的项目、order我的项目了,而是user模块、order模块,很显著概念上就不精确了 正确应用 这种应用形式界面清新,运行晦涩,解决了下面谬误形式的所有弊病。 新建我的项目Project万丈高楼平地起,应用IDEA的第一步肯定是新建一个我的项目Project: 或者你也能够在视窗外部新建,顶部菜单栏File -> New -> 三选一: 三种创立形式: 创立一个全新我的项目关上现有我的项目从VCS版本控制系统里clone一个我的项目本文就以1为例,因为2和3从实质上讲都叫关上我的项目,并不会经验创立流程。上面咱们按步骤走一篇创立流程: 第一步:抉择创立我的项目的形式,本文抉择创立创立Java我的项目 第二步:抉择依据模版创立我的项目。这个在maven还没呈现之前挺有用,当初简直不必了,因而个别都不勾选 第三步:填写我的项目名、我的项目地位(以及同步创立的模块名、地位等,可选) ①:我的项目存储地位,个别作为整个我的项目的根目录②:内容根目录③:模块文件寄存的目录④:我的项目格式文件(IDEA负责辨认,前面它还会出镜)More Setttings选项默认是收起状态,也就是说大多数状况下创立时你并不需要批改同步创立的模块的这些信息,而实际上也的确是这么干的。 点击Finish,IDEA 100%就会在新窗口(或者笼罩本窗口)关上新创建的这个我的项目: ...

February 1, 2021 · 1 min · jiezi

关于eclipse:Eclipse-418-稳定版发布

局部更新亮点: 控制台输入反对主动换行 (该设置默认敞开) 引入新的"System"主题,可能和任何 OS 和 OS 主题进行良好集成 更新 macOS 版本的浅色主题,与新零碎的设计格调保持一致 旧 新

December 30, 2020 · 1 min · jiezi

关于eclipse:Eclipse使用指南

一、MyEclipse使用指南1.web举荐应用Package Explorer关上,不要应用Project Explorer; 打开方式:Windows--Show View--Other中搜寻Package Explorer--open,默认显示在下方,拖拽到左上角即可2.Eclipse默认用内置浏览器拜访Servlet,然而这个外部浏览器有bug,最好是应用本地的资源去测试! Eclipse批改默认浏览器:Window--Web browser--Chrome 默认用谷歌运行Servlet3.增加Servlet模板 Windows--Perferences--Java--Editor--Templates--New--Pattern外面增加你想罕用的模板4.Eclipse快捷键 (1)主动补齐代码,Alt+Shift+L (2)设置单词提醒:Windows--Perferences--Java--Editor--Content Assist --Auto activation trigger for java里增加a-z和A-Z5.如何导入/导出--java/web程序到Eclipse (1)导出:--想把文件发给他人,间接复制粘贴到桌面即可导出 (2)导入:--新建一个同类型的的我的项目,名字前面加上-teacher(跟本人的不一样就能够) 而后复制目录下的src和WebContent到我的项目里即可 Import导入:Import-General-Existing Projects into Workspace--select root directory 选上Copy projects into workspace选项(就会主动保留在工作空间里一份)6.我的项目太多,查找不不便,想临时敞开不必的我的项目: 右键我的项目,Close Project,切换到Package Explorer视图之后,有一个向下的小箭头,点击之后抉择Filters 勾选上Close projects即可把敞开的我的项目暗藏7.点击一个,按住shift,点最初一个,就能选中列表里全部内容8.编写mybatis-config.xml没有提醒的解决办法:参考第二阶段讲义04.md,外面有具体步骤 Window-Preferences-在左侧搜寻catalog,,在右侧抉择第一个User Specified Entries,点击Add 点击左侧第一个Catalog Enty,点击File System,去找mybatis-3-config.dtd,点击关上,门路就会显示在上方, Key Type抉择URI,key:把http:--mybatis.org/dtd/mybatis-3-config.dtd复制在这个外面,点击ok User Specified Entries外面就会呈现你方才指定的内容9.Alt+Shift+L:补全左方代码二、Maven1.如何将maven配置到Eclipse里 window右键 --> Preferences --> 点击Maven选项,在右侧选项中勾选 "Download Artifact Sources" 点击add --> 将本人装置的Maven增加进来 --> 增加本人装置的Maven(指定Maven装置地位) -->将默认的maven切换为本人配置的maven: -->设置maven的settings文件的地位:(抉择setting.xml的地位) Local Repository(From merged user and global setting)里门路会有变动 --> 测试是否配置胜利:Winshow-show view-other-->maven(双击关上,是一个窗口) 发现pom.xml文件会报错,解决方案:鼠标右键工程名字抉择JavaEE Tools--> Generate...2.通过Maven创立一个Java我的项目 File/new/ Maven Project-->抉择--new simple project Group Id : 公司域名(com.tedu) Artifact Id : 我的项目名(CGB-MAVEN-JAVA01) Version : 默认的就能够 我的项目的版本,创立的我的项目默认是0.0.1-SNAPSHOT快照,也叫非正式版,正式版是RELEASE Packging:抉择jar就是java工程,war是web工程,pom:示意创立的是父工程(当然绝对的还有子工程)或者聚合工程三、Navicat软件的应用1.新建连贯:连贯名轻易起一个就可,主机名/IP地址,端口,用户名都是默认的,间接输出明码就ok2.新建数据库时,右边栏不显示新建的数据库,右键连贯刷新即可3.数据库插入数据时value和values的区别: value只能够插入一条数据,values能够插入多条数据,两头用逗号分隔,代码如下: insert into emp values(null,'于影','程序员',10000),(null,'李闯','程序员',10000)

November 9, 2020 · 1 min · jiezi

关于eclipse:百度刷下拉框百度刷下拉工具百度刷下拉下载

<blockquote> 百度下拉的官网正式叫法是下拉联想词,也被称作是百度联想词或百度下拉框。目标是不便网民们的搜寻,进步搜寻效率。本文简略介绍下TGEE百度刷下拉框工具的应用。</blockquote> 一、概述1.1 简介原理:百度定时从数以亿计的搜索词当中,将搜寻量微小的词条剖析提炼进去,进而生成百度举荐词的库。每次当用户在搜寻框输出文字的过程当中,动静的从该库中提取出以已输出打头的词条,并实时的生成下拉框。 大多数人在搜寻某一个关键词时,并不知道该如何组织语言以便更加准确的达到搜寻目标,下拉框就为他提供了便捷。当搜索词过长时,则能节约工夫。依据国内某权威考察公司的剖析数据显示,百度下拉框能够无效的进步输出效率39.8%,用户满意度达91.3%。同时,下拉框在疏导用户发现热点,拓展视线,轻松搜寻方面,带给用户极好的体验。 1.2 获取百度下拉内容刷下拉词之前,咱们要晓得联想出的下拉词内容。 经测试接口如下:第一次输出:https://www.baidu.com/sugrec?...第二次输出:https://www.baidu.com/sugrec?... sugrec: suggest record 倡议内容prod: provide 由pc 还是 phone 提供wd: word 搜寻的内容csor: 次数, 比方先输出d 是第一次, 再输出dd是第二次pwd=d: pre-word 示意上次输出的是什么1.2.1 通过抓包获取下拉词接口 这是接口地址:https://www.baidu.com/sugrec?... 1.2.2 应用软件查看下拉词 例:输出小白兔,则显示其联想词,就能够通过这种方法来批量验证 百度下拉词是否刷胜利与否。 二、百度刷下拉词软件(工具)2.1 软件界面 2.2 软件阐明 工具起源:TGEE博客 商业转载请分割作者取得受权,非商业转载请注明出处。For commercial use, please contact the author for authorization. For non-commercial use, please indicate the source. 协定(License):署名-非商业性应用-雷同形式共享 4.0 国内 (CC BY-NC-SA 4.0). 作者(Author):Jarrett's blog 链接(URL):https://www.tgee.cn/xiala.html 起源(Source):tgee 本文由博客 TGEE|小黑猪的博客一键转发。

October 12, 2020 · 1 min · jiezi

关于eclipse:eclipsejee201912-下载

下载实现eclipse中须要装置各种插件,我下载好了,插件也装置好了,压缩后上传到了七牛云上,下载地址是http://qiniu.litong.uairobot....装置了上面的插件并且整合了lombokcloudtoolkitsubclipse 4.3.0Enhanced Class Decompiler 3.1.1mybatipse 1.2.3SpringTools 3 (Standalone Edition) 3.9.13.RELEASEOpenExplorer_1.5.0jetty-5gefAmaterasUML

September 11, 2020 · 1 min · jiezi

关于eclipse:使用Eclipse调试PHP应用

(1) Install WAMPServer: Change Apache server default port 80 to another port: configuration: <installation folder>binapacheapache2.4.9confhttpd.conf (2) In Eclipse, specify PHP Executable: debug setting: Create a new debug configuration: (3) Then launch the application via url: http://localhost:8098/jerry/newfile.php?XDEBUG_SESSION_START=ECLIPSE_DBGP&KEY=14572383566191Then debugger is launched automatically: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

September 9, 2020 · 1 min · jiezi

Groovy的本地安装和Eclipse插件的配置

从Groovy的官网下载Development kit: https://groovy.apache.org/dow... 下载到本地,解压: 把解压后的文件夹门路增加到环境变量里。 次要是GROOVY_HOME和Path里退出%GROOVY_HOME%bin两条记录。 如果间接在命令行里输出groovy加上文件名,如果可能胜利执行,阐明环境变量配置没有问题了。 还能够在Eclipse这种IDE里装置Groovy的开发插件。关上Eclipse,抉择About,查看Eclipse的版本为4.12.0: 到这个链接里找到4.12.0对应的Groovy-Eclipse的Release update site链接:https://github.com/groovy/gro... https://dist.springsource.org... 在Eclipse的插件装置页面里,轻易保护一个site name,把下面wiki里拷贝进去的url保护进去: 选中所有解析进去的插件,全副装置: 重启Eclipse后,就能看到Groovy的我的项目创立向导了: 抉择Run as Groovy script,即可在Eclipse里执行Groovy脚本: 能够间接在Eclipse的console控制台看到后果: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

July 12, 2020 · 1 min · jiezi

谷歌浏览器如何更改语言win10专业版

谷歌浏览器是不少用户的最爱,因其稳定、速度、安全,不少企业都用其日常办公。有不少用户反馈,因为工作原因需要使用其他语言,公司安装的谷歌浏览器都是中文的,不方便其使用,那么要如何更改浏览器的语言呢?其实很简单,下面小编就教大家谷歌浏览器如何设置语言。 详细如下: 1、打开浏览器,点击右上角的三个点; 2、点击设置; 3、选择高级设置; 4、找到语言,点击语言和输入设置; 5、选择添加; 6、找到要添加的语言,再点击确认; 7、点击“以这种语言显示Googlechrome”,然后点击完成。 8、关闭浏览器,再重新运行,这时你就会发现浏览器的语言已经变更了。 以上就是谷歌浏览器GoogleChrome如何设置语言的详细方法,有需要更换浏览器语言的可以参照操作。 本文来源于win10专业版,转载请注明来源与出处。

May 30, 2020 · 1 min · jiezi

Eclipse快捷键

单个文本内常用快捷键--编辑 Ctrl+D删除当前光标所在行Alt+↓当前行和下面一行交换位置Alt+↑当前行和上面一行交换位置Ctrl+Alt+↓ / ↑将当前行/选中的代码向下或向上复制Shift+Enter在当前行的下一行插入空行Shift+Ctrl+Enter在当前行插入空行Ctrl+/注释当前行,再按则取消注释Ctrl+Shift+/注释多行Ctrl+Shift+ \取消多行Ctrl+2,L快速生成返回值变量Ctrl+1快速修复Alt+/代码补全提示或对选中代码SYSO输出Alt+Shift+R变量重命名Alt+Shift+M抽取方法Alt+Shift+Z快速生成TRY CATCHAlt+Shift+C修改函数结构Ctrl+Shift+F代码格式化Ctrl+Shift+O批量导包整理单个文本内常用快捷键--查询定位 Ctrl+F最常用的查找方式Ctrl+J正向增量查找(所输入的每个字母编辑器都提供快速匹配定位到某个单词),Esc键退出输入状态Ctrl+Shift+J反向增量查找(和上条相同,只不过是从后往前查), Esc键退出输入状态Ctrl+K参照选中的Word快速定位到下一个Ctrl+Q定位到最后编辑的地方Ctrl+L定位在某行单个文本内常用快捷键--结构展示 Ctrl+O展示当前类的大纲Ctrl+T展示当前类的继承体系单个文本内常用快捷键--JavaBean Alt+Shift+S,R生成get,set方法Alt+Shift+S,S生成toString方法Alt+Shift+S,C生成构造方法全局查找快捷键 Ctrl+Shift+T查找引用包中的类名Ctrl+Shift+R查找当前项目内存在的文件名键盘党常用快捷键 Ctrl+PgUp/PgDn不同的编辑窗口切换Ctrl+E快速显示当前所有编辑窗口的下拉列表Alt+ ←/→返回上一个编辑窗口或切换回下一个编辑窗口(最近编辑的窗口切换)Ctrl+W关闭当前编辑窗口Ctrl+M最大化当前的编辑窗口或视图 (再按则还原)Ctrl+Shift+W关闭所有打开的编辑窗口

October 1, 2019 · 1 min · jiezi

建立Struts2工程

导包包的地址在地址,点击进去可以看到clone or down,点击即可下载把包放进你的工程里面,在引入你的项目就完成了 web.xml里添加过滤器配置在配置文件复制添加下面部分内容即可 <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping> <filter-name>struts</filter-name> <url-pattern>/*</url-pattern></filter-mapping>配置struts.xml在src下创建struts.xml 然后在struts.xml加入下面代码<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.5.dtd">基本格式 <struts> <package name="a" extends="struts-default"> <action name="随意取" class="action类的全路径" method="方法名"> <result name="xx">页面地址</result> <result name="tt">页面地址</result> </action> </package></struts>创建Action类,继承ActionSupport,添加execute方法 知识点http://ip:端口/工程/[命名空间/]action配置package和action的配置(访问:1.先找命名空间2.找对应的action)一.package的属性:name、extends、namespace1.name:用于为package命名,给其他package继承使用2.extends:继承3.namespace:命名空间,避免同名的action造成歧义namespace="/abc"namespace="/"namespace="" 默认命名空间(不配置时就是默认的)在匹配路径时,首先需按照命名空间,如果我们配置了命名空间,并且路径里包含命名相同空间时,则开始第二步:找action的配置。 如果路径中的命名空间我们并没有配置,默认去namespace="/"配置中开始第二步

September 20, 2019 · 1 min · jiezi

eclipse查看英文源码时有道词典划词问题

由于英文水平不太好,所以使用eclipse查看英文源码时总是先把单词或句子复制下来然后贴到有道词典里边去查询,但是这样做的效率很低,需要不停复制粘贴,真的很累。有道词典其实也蛮强大的,基本上大部分软件都能进行划词翻译,但是就是不支持这个eclipse,猜想应该是eclipse的窗口不是标准的window窗口。IDEA倒是能翻译,但是本人真的用不惯它,大部分其实都转IDEA了,可能有一种老java人的情怀吧,说实在的我就喜欢简单轻量的东西。 没办法了,有一种自己想写个插件的冲动,但是考虑暂时实在没时间只能找个折中的方案,大家觉得可以就先讲究着用吧,至少比不停复制粘贴好多了。废话不多说,直接上操作步骤。 打开有道词典并找到设置菜单点击设置菜单后进入取词划词模块并且勾选 启用复制查词,选取内容后复制即可显示释义 打开eclipse,选中一段英文然后crtl+c 各位先讲究着用吧,期待有个更好的eclipse翻译插件~~~

September 8, 2019 · 1 min · jiezi

eclipse-常用快捷键

快捷键功能快捷键代码右移选定后,tab代码左移选定后,shift + tab自动对其格式ctrl + shift + F打开资源Ctrl + shift + R切换已代开的编辑窗口ctrl + E多行注释选定后,ctrl + shift + /取消多行注释光标落在注释范围内,ctrl + shift + \找具体的类ctrl + shift + T抽取方法ctrl + shift + M重命名 (类名、变量名)alt + shift + R自动生成代码alt + shift + S整理包(导包)ctrl + shift + O合并当前行和下一行ctrl + alt + J跳到指定行ctrl + L跳到匹配的括号ctrl + shift + P上次编辑的地方ctrl + Q保存全部ctrl + shift + S快捷键列表ctrl + shift + L最大化编辑窗口ctrl + M

August 18, 2019 · 1 min · jiezi

Eclipse-常用开发快捷键

15 个 Eclipse 常用开发快捷键使用技巧1、alt+? 或 alt+/:自动补全代码或者提示代码2、ctrl+o:快速outline视图3、ctrl+shift+r:打开资源列表4、ctrl+shift+f:格式化代码5、ctrl+e:快速转换编辑器6、ctrl+page down 或 ctrl+page up: 选项卡之间快速切换7、shift+enter 及 ctrl+shift+enter: 在当前行上或者下边创建空白。8、Alt+方向键上下:上下行交换内容或把当前行内容把上或下移动9、Control+Alt+方向上下键:复制高亮显示的一行或多行10、ctrl+m:当前编辑页面窗口最大化11、ctrl+/:自动注释当前行或者选择的多行12、ctrl+shift+/:自动注释掉选择的代码块13、ctrl+d:删除当前行14、ctrl+shift+x 和 ctrl+shift+y :英文字母大小写的转换15、ctrl+shift+o:自动引入包和删除无用包 附上一些小窍门:锁定命令行窗口:在命令行视图中(Window -> Show View ->Other -> Basic -> Console),试试看用滚动锁定按钮来锁定控制台输出不要滚屏。 使用 Ant 视图: 在我的 Java 或 Debug 模式下,我喜欢显示出 Ant 视图,这样我就可以迅速的运行 Ant 任务。通过 Window Ant 可以找到该视图。把 Ant 视图放在屏幕的一角, 通过"添加编译文件(Add -> Other-> Show View -> Buildfiles)"按钮来添加build.xml文件。在3.1版本中,甚至支持Ant调试脚本语言。 自动遍历一个集合:for + Control-Space: 如果你还不知道,那么你应该记住Control-Space是自动完成功能。在Eclipse中,你还可以自动完成结构。在一个数组或集合范围内,试试看 输入"for"然后按下Control-Space键。Eclipse会问你你想要遍历哪一个集合然后自动完成循环代码。 使用分级布局: 在包浏览视图(Package Explorer view)中默认的布局(扁平式)方式让我困惑,它把包的全名显示在导航树(navigation tree)中。我更喜欢我源码的包和文件系统视图,在Eclipse中叫做分级布局(Hierarchical Layout)。要切换到这种模式,点击包浏览视图中向下的按钮,选择布局(Layout),然后选择分级(Hierarchial)。一次显示多个文件:你可以一次浏览多个文件。把不在激活状态的编辑窗口拖到激活窗口的底部或侧边的滚动条上,就可以打开该编辑窗口。这是我能描述该窍门的最好方式了。 同时打开两个Eclipse: 要将改动从一个CVS分支上合并到另外一个上,我喜欢通过同时打开两个工作目录(Workspace)不同Eclipse来实现。这样我可以通过比较 CVS上的最新版本看到所有的变化(右键单击工程,然后选择Compare Lastest from HEAD)然后把每一个变化都合并到另外一个CVS分支上。启动多个Eclipse的最简单的方法是利用Eclipseàwith Launcher。 ...

July 15, 2019 · 1 min · jiezi

eclipse-mqttclient-性能MQTT32202-正在发布过多的消息

mqttclient性能&MQTT(32202): 正在发布过多的消息org.eclipse.paho.client.mqttv32.2 GHz Intel Core i7 mac系统 publish性能,注意请使用单线程的 mqttclinet 1万条 341毫秒4万条 1163毫秒5万 1450毫秒10万条 2700毫秒 多线程的 mqttclinet MQTT(32202): 正在发布过多的消息 问题 异常信息[15:07:21]: publish failed, message: aaaa正在进行过多的发布 (32202) at org.eclipse.paho.client.mqttv3.internal.ClientState.send(ClientState.java:496) at org.eclipse.paho.client.mqttv3.internal.ClientComms.internalSend(ClientComms.java:132) at org.eclipse.paho.client.mqttv3.internal.ClientComms.sendNoWait(ClientComms.java:156) at org.eclipse.paho.client.mqttv3.MqttAsyncClient.publish(MqttAsyncClient.java:1027) at org.eclipse.paho.client.mqttv3.MqttClient.publish(MqttClient.java:399) at io.communet.ichater.emq.util.MqttUtil.publishMsg(MqttUtil.java:171) at io.communet.ichater.emq.util.MqttUtil.publishMsg(MqttUtil.java:161) at io.communet.ichater.emq.sub.MqttSendMsgEventSubscribe.onEvent(MqttSendMsgEventSubscribe.java:28) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at org.greenrobot.eventbus.EventBus.invokeSubscriber(EventBus.java:507) at org.greenrobot.eventbus.EventBus.invokeSubscriber(EventBus.java:501) at org.greenrobot.eventbus.AsyncPoster.run(AsyncPoster.java:46) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) 解决办法消息发送发送限流用单独的一个线程来完成 MQ 消息的推送 (不用这个MqttAsyncClient ,使用MqttClient 就没有事)options.setMaxInflight(1000) 增加 actualInFlight 的值; 反思笔者出现这个错误是因为使用 EventBus, 之前使用单独线程的 Handler 是没有问题的, 调查发现, 使用 EventBus 是新建线程运行的, 而 Handler 是单独一个线程.所以当发送大量消息的时候, EventBus 几乎是同一个点发出去, 就会造成这个错误 ...

July 15, 2019 · 2 min · jiezi

Eclipse-安装Tomcat插件及部署配置教程

Eclipse安装Tomcat插件 1.Eclipse里通过Marketplace在线安装(1).点击 Help --> Eclipse Marketplace…(2).在弹出的窗口中点击搜索Tomcat,点击install安装。 (3).全选,然后一步一步往下点,然后接受协议,安装完成后重启eclipse出现三只小猫即安装成功。 2.配置Tomcat(1).点击 Window --> Preferences (2).在弹出的窗口中点击Tomcat,进行本地Tomcat配置。 (3).点击apply,即配置成功。

June 30, 2019 · 1 min · jiezi

Eclipse-安装svn插件教程

Eclipse安装svn插件的三种方式1.Eclipse里在线安装(1).点击 Help --> Install New Software… (2).在弹出的窗口中点击add按钮,输入Name(任意)和Location(插件的URL),点击OKSVN插件下载地址及更新地址,你根据需要选择你需要的版本。现在最新是1.8.xLinks for 1.8.x Release:Eclipse update site URL: http://subclipse.tigris.org/u...Links for 1.6.x Release:Eclipse update site URL: http://subclipse.tigris.org/u...Links for 1.4.x Release:Eclipse update site URL: http://subclipse.tigris.org/u... (3).勾选出现的全部插件内容,一步步安装即可。 2.Eclipse里通过Marketplace在线安装(1).点击 Help --> Eclipse Marketplace…(2).在弹出的窗口中点击搜索svn,点击installed安装。(3).全选,然后一步一步往下点,然后接受协议,安装完成后重启eclipse即可生效。 3.离线安装(1).下载subeclipse插件包SVN插件下载地址及更新地址,你根据需要选择你需要的版本。现在最新是1.8.xLinks for 1.8.x Release:svn插件包下载: http://subclipse.tigris.org/s...Links for 1.6.x Release:svn插件包下载: http://subclipse.tigris.org/s...Links for 1.4.x Release:svn插件包下载: http://subclipse.tigris.org/s...(2).将插件包features和plugins目录中的文件分别复制到Eclipse安装目录的features和plugins中。(3).重启eclipse即可生效

June 30, 2019 · 1 min · jiezi

二维数组的旋转赋值递归

描述 给定一个h行h列的整数数组array,要求从array[0][0]元素开始,按回形从外向内顺时针顺序赋值整个数组。如图所示:![图片描述][1]输出结果:4 4 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int h = scanner.nextInt();//输入二维数组长度 int[][] arr = new int[h][h];//创建二维数组 setWay(arr,0,0);//赋值 for (int[] p : arr) {//遍历 for (int p1 : p) { System.out.printf("%-4d",p1); } System.out.println(); } System.out.println(t); } static int p = 1;//所赋的值 static int f = 0;//控制转向 0为右 1为下 2为左 3为上 static int t = 0;//纪录函数调用次数 public static boolean setWay(int[][]map,int i,int j){ if(i==map.length || j ==map.length || i == -1 || j == -1){//若超出数组 f = (f+1)%4;//转向 t++; return false; } if (map[i][j] == 0) {// 若当前点没有走过 map[i][j] = p;//赋值 p++; while(p != map.length*map.length+1)//输出到最后一个数跳出循环转向 switch(f){ case 0: if (setWay(map, i, j + 1)) {//向右走 return true; } break; case 1: if (setWay(map, i+1, j )) {// 向下走 return true; } break; case 2: if (setWay(map, i , j-1)) {// 向左走 return true; } break; case 3: if (setWay(map, i-1, j)) {// 向上走 return true; } break; } } f = (f+1)%4;//循环转向 t++; return false; }

June 23, 2019 · 1 min · jiezi

Java面试技术学习总结最后一站

一直在找这样的项目,准备作为个人项目,找工作时候的谈资:贯穿真个Java知识点的,用到ssh,或者ssm框架,这样就可以让自己对java有一个整体的、清晰的认识。 不管是OA人事管理系统,或者ERP系统,都不能很好地满足我,直到看到这样一个项目,一个很用心的自学网站,分为一个个小的学习模块,有视频教学,还有题目和答案,可以边动手边学习。天猫整站(J2EE、SSH、SSM、SpringBoot等技术实现) 天猫网站实现技术路径及效果

June 6, 2019 · 1 min · jiezi

JavaWeb学生选课ServletJSPJDBC

运行结果: 数据库的2个表:course表 student表 ps:一定要build path导入数据库用的jar包,以及在在lib文件夹中导入数据库jar包 文件目录结构: 具体代码:index.jsp 首页 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>欢迎进入选课系统</title></head><body><center><h2>欢迎进入选课 系统</h2><a href="login.jsp">学生登录</a><a href="regist.jsp">学生注册</a><a href="admin.jsp">管理员登录</a></center></body></html>login.jsp 学生登录 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>学生登录</title></head> <body style="text-align: center;"> <br><br> <h3>学生登录</h3> <form action="LoginServlet" method="post"> 学号:<input type="text" name="stuno"> <br><br> 密码:<input type="password" name="stupassowrd"> <br><br> <input type="submit" value="登录" name="submit"> <a href="regist.jsp" role="button">注册</a> <a href="index.jsp">返回</a> </form> </body></html>regist.jsp 学生注册 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>注册</title> <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"></head><body><h2 align=center>注册页面</h2> <center> <form action="RegisterServlet" method="post" > <table border="1"> <tr> <td>学号:</td> <td><input name="userNo"></td> </tr> <tr> <td>姓名:</td> <td><input name="userName"></td> </tr> <tr> <td>密码:</td> <td><input name="password" type="password"></td> </tr> <tr> <td>院系:</td> <td><input name="major"></td> </tr> <tr> <td>年级:</td> <td><input name="grade"></td> </tr> <tr> <td>班级:</td> <td><input name="sclass"></td> </tr> <tr align="center"> <td colspan="2"><input type="submit" value="提交注册"><input type = "reset" value = "重置"></td> </tr> </table> </form> 您有账号?<a href="login.jsp"><front color="GREEN" >点击直接登录</front></a> </center> </body></html>studentIndex.jsp 学生选课主页 ...

May 30, 2019 · 17 min · jiezi

Eclipse-最常用的-10-组快捷键个个牛逼

虽然栈长我现在不怎么用 Eclipse 了,但 Eclipse 的快捷键还是忘不了的,可以说 Eclipse 的快捷键很方便,恰到好处。 今天,我大概整理了 10 组 Eclipse 我觉得比较常用的牛逼快捷键,希望对你有帮助。如果你是 IDEA 粉,请略过,或者期待下篇文章分解,我们再讲 IDEA 的快捷键。 1、打开资源 CTRL + SHIFT + R:打开所有类型文件,不包括 JAR 包; CTRL + SHIFT + T:打开 Java 类型文件,包括 JAR 包; 2、查找资源 CTRL + F:查找当前编辑器内容; CTRL + H:查找所有文件内容; CTRL + SHIFT + G:快速查找所有引用的地方; 3、代码整理 CTRL + SHIFT + F:格式化代码; CTRL + SHIFT + O:去除没有用到的引用; CTRL + SHIFT + M:导入需要的类引用; 4、重命名 ALT + SHIFT + R:重命名; ...

May 29, 2019 · 1 min · jiezi

解决Could-not-create-the-Java-virtual-machine

    这个坑我遇到了两次了,所以就写下来以防自己再遇到。    第一次没看conscole,所以就不知道具体原因是什么。    第二次留意了conscole Djava.endorsed.dirs=D:\Tomcat 9.0\endorsed is not supported. Endorsed standards and standalone APIsin modular form will be supported via the concept of upgradeable modules.    第一次整整弄了一个下午,最后通过降级jdk版本到1.8解决掉。    第二次就在想每一次新建工作空间都像第一次这样过于麻烦。因为命令行启动tomcat是没有问题的,所以猜测应该是eclipse的问题。解决方法: eclipse--Window--Preferences--Install/update--Available Software Sites,将The Eclipse Web Tools Platform的location后缀的neon改成oxygen。help--check for update,等待重启。Run--Run Configurations--Apache Tomcat--Tomcat v9.0 Server--Arguments--VM arguments,将参数最后的-Djava.endorsed.dirs="D:javatomcatapache-tomcat-9.0.10endorsed删除掉,Apply然后再Start Tomcat就好了。    第二次的解决方法部分来自https://bbs.csdn.net/topics/392277991中的12楼的层主Ice2017,谢谢了。<br/>    为什么说部分呢,因为我是在更新WTP之后再修改设置的(因为练习的项目涉及到JSTL库,所以之前更新了),Ice是修改设置之后再更新WTP的。

May 5, 2019 · 1 min · jiezi

更改eclipse中jsp默认编码格式为UTF8

    近段时间一直在学java三大框架,遇到了一个问题:eclipse中jsp默认编码格式不是UTF-8,导致页面显示中文出现乱码,每次单独修改过于麻烦。    解决方案:window--Preferences--Web--JSP File--在encoding的下拉列表选择UTF-8。

May 5, 2019 · 1 min · jiezi

eclipse

注释注释 Ctrl+Shift+/取消注释 Ctrl+Shift+\查找搜索 Ctrl+h在workspace中搜索引用 Ctrl+Shift+g正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到 Ctrl+J 反向增量查找 Ctrl+Shift+J 快速向下和向上查找选定的内容 Ctrl+K、Ctrl++Shift+K 查找工作空间(Workspace)构建路径中的可找到Java类 Ctrl+Shift+T 查找类、方法和属性的引用 Ctrl+Shift+G查找当前文件所在项目中的路径 ALT+Shift+W定位定位到对于的匹配符(譬如{}) Ctrl+Shift+p定位到当前编辑器的某一行 Ctrl+L 后退历史记录和前进历史记录 Alt+←、Alt+→ 快速定位光标位置的某个类、方法和属性 F3显示显示类中方法和属性的大纲 Ctrl+O窗口窗口最大化和还原 Ctrl+m关闭当前Editer Ctrl+W 关闭所有打开的Editer Ctrl+Shift+F4 切换到下一个编辑器 Ctrl+F6切换到上一个编辑器 Ctrl+Shift+F6切换到下一个透视图 Ctrl+F8显示类的继承关系,并打开类继承视图 F4编辑Ctrl+Shift+X 把当前选中的文本全部变味小写。Ctrl+Shift+Y 把当前选中的文本全部变为小写。Ctrl+Shift+S:保存全部Ctrl+Shift+Enter 在当前行插入空行Shift+Enter 在当前行的下一行插入空行shift+alt+z可以快速抛异常shift+alt+r改所有地方的名称shift end 快速选一行shift+alt+s得到构造方法sourcedebug在当前行设置断点或取消设置的断点 Ctrl+Shift+B跟踪到方法中step into F5单步执行程序,下一行 F6执行完方法,返回到调用此方法的后一条语句 F7继续执行,到下一个断点或程序结束 F8调试最后一次执行的程序。F11运行最后一次执行的程序。 ctrl + F11不够的话

April 18, 2019 · 1 min · jiezi

在 IntelliJ IDEA 中部署应用到服务器(Eclipse)

在之前的文章《在 Intellij IDEA 中部署 Java 应用到 阿里云 ECS》中讲解了如何将一个本地应用部署到阿里云 ECS 上去,有些读者反馈目前还有一些测试机器是在经典网络,甚至是在本地机房中,咨询是否可以通过 Cloud Toolkit 插件将应用部署到这些服务器上去?最新版本的 Cloud Toolkit 已经发布,完全支持啦。本地开发无论是编写云端运行的,还是编写本地运行的 Java 应用程序,代码编写本身并没有特别大的变化,因此本文采用一个及其基础的样例《在 Web 页面打印 HelloWorld 的 Java Servlet 》为例,做参考。public class IndexServlet extends HttpServlet { private static final long serialVersionUID = -112210702214857712L; @Override public void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); //Demo:通过 Cloud Toolkit ,高效的将本地应用程序代码修改,部署到云上。 writer.write(“Deploy from alibaba cloud toolkit. 2018-10-24”); return; } @Override protected void doPost( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { return; }}源代码下载上述代码就是一个标准的 Java 工程,用于在 Web 页面上打印一串“Hello World”的文案。安装插件阿里云提供了基于 Intellij IDEA 的插件,以方便开发人员能够高效的将本地 IDE 中编写的应用程序,极速部署到服务器中去。插件主页:https://www.aliyun.com/product/cloudtoolkit阿里云的这个 IntelliJ IDEA 插件的安装过程,和普通的插件大同小异,这里不再赘述,读者请自行安装。添加服务器如上图所示,在菜单 Tools - Alibaba Cloud - Alibaba Cloud View - Host中打开机器视图界面,如下图:点击右上角Add Host按钮,出现添加机器界面部署在 IntelliJ IDEA 中,鼠标右键项目工程名,在出现的菜单中点击 Alibaba Cloud - Deploy to Host…,会出现如下部署窗口:在 Deploy to Host 对话框设置部署参数,然后单击 Deploy,即可执行初次部署。部署参数说明:Deploy File:部署文件包含两种方式。Maven Build:如果当前工程采用 Maven 构建,可以使用 Cloud Toolkit 直接构建并部署。Upload File:如果当前工程并非采用 Maven 构建,或者本地已经存在打包好的部署文件,可以选择并直接上传本地的部署文件。Target Deploy host:在下拉列表中选择Tag,然后选择要部署的服务器。Deploy Location :输入在 ECS 上部署路径,如 /root/tomcat/webapps。Commond:输入应用启动命令,如 sh /root/restart.sh。表示在完成应用包的部署后,需要执行的命令 —— 对于 Java 程序而言,通常是一句 Tomcat 的启动命令。本文作者:银时阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

April 18, 2019 · 1 min · jiezi

在che中增加EMF支持 - Day2:生成代码

(略)在关注编辑支持和客户端模型的创建之前,我们先看为模板项目进行代码生成。这是我们目标的一个基础的需求,我们想使用现有的EMF code generator。所以在che里面复用已有的Eclipse架构是可行的吗?让我们快速的看一哈EMF代码生成器如何被触发。默认的方式是利用Eclipse IDE里的UI。除此之外,EMF提供就一个Java API来运行代码生成。这听上去很吸引人,因为Che的server构件也是用java编写的。也就是说我们可以为Che的server写一个封装的功能:由Che的浏览器IDE触发并调用EMF的API来生成代码。但,等一下,EMF是被设计运行在OSGi运行时环境的。此话,他使用了一些扩展点(如注册表打包)。虽然用Java可以直接调用EMF的代码生成器,但我们需要手动将这些东西连接起来。在这种场景下,在没有OSGi的情况下设置类的路径就像噩梦。另一个坏处是我们可能需要在我们的服务器端配置EMF库,这会使更新变得繁琐。幸运的是,有一个很简单的方式来整合现有的代码生成器。Eclipse的桌面IDE提供了一个在命令行执行的无头应用程序。用如下的指令,你可以为make it happen样例生成代码。$ /eclipse/eclipse -noSplash \ # do not show the eclipse splash screen-data /path/to/data/dir \ # the path to be our current project-application org.eclipse.emf.codegen.ecore.Generator \ # the application id to execute-model \ # generate EMF model classes-edit \ # generate EMF edit bundle/path/to/modelname.genmodel # the path to the genmodel file那么我们如何将这一段代码整合进Che里面?好消息是我们可以直接把Eclipse部署到一个工作空间里。Che里的工作空间不仅仅是托管代码的目录。它同样也是一个docker的容器并包含一些工具。因此如果我们将一个Eclipse Modeling Tools Edition安装进我们的工作空间。我们就能用命令行调用EMF的API生成代码。首先,我们需要在Che的工作空间容器中安装Eclipse。作为一个基于Linux image的容器,我们可以直接用shell去下载和提取最新的Eclipse Modeling Tools。下载链接可以由官网下载(复制Linux 32/64 bit的链接)。如果界面里没有shell的话,点击低端的terminal即可打开,实际的shell指令如下:$ sudo su # gain super user privileges (become root)$ cd / # switch to the root directory$ wget ${Download Link} -o eclipse.tar.gz # download eclipse$ tar xfv eclipse.tar.gz # extract the downloaded tar.gz file然后你就可以用下面的命令行出发EMF code generator了。$ /eclipse/eclipse -noSplash -data /projects/makeithappen -application org.eclipse.emf.codegen.ecore.Generator -model -edit /projects/makeithappen/org.eclipse.emf.ecp.makeithappen.model/model/task.genmodel下一张截图展现了代码生成器在shell里打印的log。我们然后就可以在IDE打开被生成的代码。这就意味着,我们成功在che里面复用了EMF的代码生成器!现在,我们完成了从命令行启动code generator。让我们为用户提供更便利的方式,而不是来自己输入这些复杂的指令。我们想要使得这个代码生成的过程只需由一个点击触发。Che允许我们自己定义一个‘custom command’。点击右上角的下拉菜单选择Edit commands。然后点击’+’,然后点Custom,如图所示填好右边的内容。你就可以看到Che里面多了这个指令(刚刚的右上角位置)。然鹅,最后一部分ganmodel的路径还是静态的,现在,我们就可以用一个click为一个模板项目生成代码了。我们复用了现有的EMF code generator,也没有写过一行代码。但是,存在很多开放的问题需要提升。比如,我们只可以为固定的项目生成代码,我们仍然是在指定的模板上修改,无法真正改变模型。这些问题都需要我们进一步优化,之后我们还会涉及。现在下一部分的内容,我们先关注如何创建一个custom stack是的我们的这一部分内容可复用。这个目的是使得我们这个下载了Eclipse实例的定义了自定义指令的工作关键可以从scratch获取。请期待~ ...

April 16, 2019 · 1 min · jiezi

word文档

作为开发者,基本上都要写文档了,但是一个文档的格式如果不懂的话,那真的是百般难受,后来通过网上查找跟模拟之后,终于不在怕了,如图两步骤即可学会目录也是生成的。+|-是控制折叠的(chrl+shift+n回到最低级别)v|^是控制移动的插入,是在标题的前面回车的,以前就是在后面进行回车,所以永远都不会对

March 26, 2019 · 1 min · jiezi

Eclipse提交项目到GitHub以及解决代码冲突

前言:来这家公司上班后,开始使用Git作为项目版本控制系统,由于以前用的是SVN,所以对Git也就简单学习了一下。但是,实践出真知,当开始使用Git后,发现遇到了不少问题,也遇到过血的教训,于是决定记录一下,方便以后查看。一、Eclipse安装Git插件如果是比较新的Eclipse版本,默认就已经安装了Git插件。菜单栏 –> Help –> About Eclipse,如下图:如果有这个图标,表示Eclipse已经安装了Git插件,如果没有这个图标,就到Eclipse插件市场下载Git插件,具体步骤自行百度谷歌。二、Eclipse提交代码到GitHub1、登录GitHub,创建代码仓库登录github,然后在右上角+号下拉列表里找到New repository,创建一个新的仓库。在Repository name填入testgit,其他保持默认设置,点击Create repository按钮,就成功地创建了一个空的Git仓库。 创建完成后如下图:将最上方的仓库地址(也就是这个:https://github.com/你的GitHub账号名称/Git仓库名称.git)复制下来,后面要用到。2、在Eclipse中创建要发布到GitHub的项目我这里是创建了一个最简单的Spring Boot项目,结构如下:3、与GitHub建立连接,发布项目到GitHub3.1 share project及创建本地Git仓库选中要发布的项目 –> 右击 –> Team –> Share Project…,勾选Use or create repository in parent folder ofproject,点击红色箭头处,也就是项目,点击Create Repository按钮,会在后面显示的路径下建立本地仓库,最后点击Finish按钮即可。效果如下:文件会变成未提交状态,此时我们可以提交代码到本地仓库。3.2 提交代码到本地Git仓库为了方便提交代码到Git,我们在Eclipse中打开相应的视图窗口,菜单栏Window –> Show View –> Other…,在输入框中输入git,选择Git Staging,确定即可。选择项目,切换到Git Staging视图,在未提交文件区选择要提交的文件,拖到下面待提交文件区或者右击选择的文件选择Add to Index,填写提交信息,点击Commit将文件提交到本地Git仓库。3.3 发布项目到GitHub选中要发布的项目 –> 右击 –> Team –> Remote –> Push…,粘贴URI(也就是GitHub仓库地址,https://github.com/你的GitHub账号名称/Git仓库名称.git),填写GitHub用户名User、密码Password,点击next。点击Source ref的下拉框,选择master [branch],然后点击Add Spec,下方Specifications for push下面会出现要提交的分支信息,点击Next,再点击Finish,最后点击OK就完成了。最后在GitHub上查看项目。三、Eclipse中使用Git提交代码流程:一般是先commit到本地仓库,然后再pull更新远程仓库代码到本地,如果有冲突,文件会标红,解决冲突了再commit,最后push到远程仓库。用血的教训得到的注意点:一定要经常commit代码到本地仓库!当初就是因为没有提交代码到本地仓库,导致本地写的代码被远程仓库的代码覆盖了,周末加班重新写那些丢失的代码!四、Eclipse中解决代码冲突刚开始使用Git时,出现冲突后修改冲突部分,再提交到本地仓库,结果所有文件都冲突了,对比却又是一样的,当时不知道怎么办,就在另外的工作空间重新拉取一套代码,把修改的代码加进去。后来又遇到了,于是就找资料看怎么解决冲突,所以这里记录一下。比如我现在的项目冲突情况如下:现在我们解决冲突,比如改为下面这样:右击冲突文件 –> Team –> Add to Index此时,冲突文件变为修改图标样式,Git Staging视图中变成下图:后面就是正常的提交代码流程了,commit到本地仓库,再push到远程仓库。五、参考资料Eclipse 提交项目到 GitHubeclipse 中git解决冲突eclipse 中 git 解决冲突(重点)

March 16, 2019 · 1 min · jiezi

Eclipse 配置 Tomcat 服务器和发布 Web 应用

步骤1:服务器运行环境配置依次点击:Window/Preferences/Server/Runtime Environments,选择已安装的Tomcat 版本,然后选择其安装路径,如图。出现下面这个就成功完成步骤一了。步骤2:设置发布位置双击这个:找到 Server Locations 按图中顺序设置:部署位置 webapps 文件夹在 Tomcat 安装目录里。 如果是灰色的不能更改,需要把 Tomcat 下的所有项目移除,并右击,clean 之后方可设置,启动后将可以更改。步骤2完成之后Tomcat的配置就完成了。发布Web应用右击项目—> Run As —> Run on Server —>选择服务器 —> 添加资源 —> 完成

March 9, 2019 · 1 min · jiezi

机试题-三星

3月1日,西安三星研究所公司机试。之前HR介绍,机试题主要考察分析和逻辑能力,不会用到复杂的算法,而且现场也不能使用除了输入输出流之外的其他的库或包。总体过程:在公司的一间机试屋子考试,有VisualStudio和Eclipse两种编译器可选。三星机试有专门的系统,可以查看题目,并且在下方编程(没有提示,得全程手打,而且不提醒语法错误,建议用编译器),该页面同时可以进行测试案例调试,运行后可得编译结果(会提示语法错误和异常)提供参考。机试总共3小时,系统界面和题目都是英语,手机得飞行模式,现场提供纸笔。题目:原题记不太清了,大致意思如下:给一个10×10的表格(grid),其中放置有2×1的方块(blocks),方块和横竖放置。让表格中的方块自由下落(类似俄罗斯方块),堆积在底部。表格中有方块占有的格子用1表示,没有的用0表示。用数字0-10表示下落后,每列的方块高度。注:题目要求方块不能全部靠在左侧、右侧、上侧或下侧,而且下边这种连续放置方块的情况也不允许(题目中英文没全看懂,个人理解)。这个条件尤其要注意,中途写完程序,就是忽略了这个约束,结果老是不对。输入输出1、Input0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0…… 共10个case2、Output*1 1 2 2 1 2 1 1 0 3 0 0 …… 10个case,每个case的结果都按行输出(*1表示case1) ...

March 1, 2019 · 1 min · jiezi

LinkedList中查询(contains)源码分析

contains源码分析本文分析双向链表LinkedList的查询操作源码实现。jdk中源程序中,LinkedList的查询操作,通过contains(Object o)函数实现。具体见下面两部分程序:①public boolean contains(Object o) { return indexOf(o) != -1;}②public int indexOf(Object o) { int index = 0; if (o == null) { for (Node<E> x = first; x != null; x = x.next) { if (x.item == null) return index; index++; } } else { for (Node<E> x = first; x != null; x = x.next) { if (o.equals(x.item)) return index; index++; } } return -1;}indexOf函数查询对象o在链表中的索引位置。源码首先将元素为null的情形单独判读剥离,个人分析,应该是如果不单独分析,null元素在下边的for循环中,不能执行o.equals操作(编译器输入null.,会自动将已有输入替换为NullPointerException.,提示空指针异常)。由于链表不同于数组,在内存中并非连续存储,因此访问某个元素需要遍历。源程序中使用for循环进行遍历。index表示链表元素索引,初值为0。1、针对空元素(null)的情况,用for循环遍历,查找元素为null的节点,并返回索引index。for循环初始条件为头指针(无元素),判断条件为节点不为null,自增表达式为x重赋值为下个节点(利用节点x的next指针实现,在java中next为node对象的属性成员)。每次自增,index+1。2、针对非空元素,遍历操作同上。函数结束的判断条件变为o.equals(x.item),这里equals方法为Object超类的方法,程序中元素类型非Object也可调用。两种情形下,链表遍历完毕(仍为return),表明该元素o在链表中不存在,因此返回-1。

February 22, 2019 · 1 min · jiezi

Problem 4:替换空格(字符串)

一、题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。注:用%20替换的原因,空格在ASCII码中的序号为32,用十六进制表示为0x20。二、思路分析参考剑指offer上的说明,需要考虑操作是原地(in place)操作还是新建字符串操作。以原地操作为例,首先考虑最直观的方法-从前往后依次替换。在第一个空格处,空格替换为%20,空格之后的字符全部右移三个位置。同理,第一次移动后,向后遍历,在第二个空格处继续将后边字符移动。从算法角度分析,设输入规模为n,我们需要循环遍历字符串中空格(循环中,判断是否为空的操作执行n次),在每个空格处,进行字符移动操作,每个字符的移动又相当于一次循环。因此,总的运行效率为$$O(n^2)$$直接遍历移动的方法效率太低,因此,考虑其他方法。方法1:考虑比Sting高效的字符串操作工具-StringBuffer,同样使用之前的直接遍历的方法,但是对比发现,不需要重复移动,每次判断执行一次操作,共执行n此判断,效率为$$O({n^2})$$方法2:不使用StringBuffer三、Java实现方法1源程序:package jz_offer;public class problem04 { public static String spaceReplace(String str) { StringBuffer newStr=new StringBuffer(); int length=str.length(); //特殊情况 if(str==null||length==0) return null; for(int i=0;i<length;i++) { if(str.charAt(i)==’ ‘) { newStr.append("%20"); }else { newStr.append(str.charAt(i)); } } return newStr.toString(); } public static void main(String[] args) { // TODO Auto-generated method stub //包含空格-:前-后-中-连续空格 String str1 = " Wearehappy"; String str2 = “Wearehappy “; String str3 = “We are happy”; String str4 = “We are happy “; //没有空格 String str5=“Wearehappy”; //特殊输入测试:只有连续空格、只有一个空格、是null指针、是空字符串 String str6=” “; String str7=” “; //String str8=null; //会出现NullPointerException(运行时异常) String str8=””; String[] strArray=new String[] {str1,str2,str3,str4,str5, str6,str7,str8}; for(int i=0;i<strArray.length;i++) { System.out.println(spaceReplace(strArray[i])); } }} ...

February 15, 2019 · 1 min · jiezi

依赖包的优先级设置

问题出现:一个老项目的退款功能被微信支付后台停用,原因是xml解析工具有漏洞风险, 微信客服给出的解决方案是使用官方的补丁。使用补丁后发现:xml-api包与jdk自带的包冲突。具体原因: xml-api包的某个类与jdk自带的某个类具有相同的全限定名,但是xml-api包中并没有相关实现, IDE没有依赖jdk自带的包,而是优先依赖xml-api包,导致项目无法完成编译。尝试解决:在 Maven 中排除 xml-api 包: 从父 pom 里面做排除: 但是项目年代久远,各种类库的依赖盘根错节, 到父 pom 里面没找到依赖,到依赖的自定义基本库里面也没找到。 况且考虑到父 pom 被其他项目依赖的可能性,所以还是想想其他办法。 全局排除: 在 pom 文件里加入冲突包的依赖,然后再排除包里全部的内容: <dependency> <groupId></groupId> <artifactId></artifactId> <version></version> <exclusions> <exclusion> <groupId></groupId> <artifactId></artifactId> </exclusion> </exclusions> </dependency> 这个方法能够排除掉项目对 xml-api 包里的全部依赖; 但是因为先导入后排除,项目依然会优先依赖 xml-api 包;所以问题还是没有解决。推荐方案:修改依赖包的优先级: 因为这个老项目是用 Eclipse 开发,先说 Eclipse 操作方法。 Eclipse: 设置 build path order; 把优先级高的包放到上面, 所以可以把 jre 的包放到最上面。 顺便看了下 IDEA 的设置,也能修改优先级。 IDEA: 修改 classpath order: 菜单:File -> Project Structure -> Modules 快捷键:Ctrl + Alt + Shift + S -> Modules 把优先级高的包放到上面, IDEA 中,jdk 自带的包默认就是最高优先级,所以使用 IDEA 不会出现类似的问题。 传送门:http://blog.51cto.com/1350814…本文系笔者原创转载请注明出处————————————— ...

February 12, 2019 · 1 min · jiezi

netty搭建web聊天室(1)

之前一直在搞前端的东西,都快忘了自己是个java开发。其实还有好多java方面的东西没搞过,突然了解到netty,觉得有必要学一学。介绍Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。一些IO概念NIO (non-blocking IO) 非阻塞BIO (blocking IO) 阻塞以上两种又可分为同步和异步,即同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。阻塞:数据没来,啥都不做,直到数据来了,才进行下一步的处理。非阻塞:数据没来,进程就不停的去检测数据,直到数据来。至于这块的详细概念,大家可以自行百度学习。总之,netty处理io很高效,不需要你担心。netty结构可以看出它支持的网络传输协议,以及容器支持,安全支持,io.工作流程:所有客户端的连接交给住主线程去管理,响应客户端的消息交给从线程去处理,整个线程池由netty负责。搭建服务创建maven工程引入最新的依赖<project xmlns=“http://maven.apache.org/POM/4.0.0" xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mike</groupId> <artifactId>netty</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.32.Final</version> </dependency> </dependencies></project>创建消息处理器package netty;import io.netty.buffer.Unpooled;import io.netty.channel.Channel;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.SimpleChannelInboundHandler;import io.netty.channel.group.ChannelGroup;import io.netty.channel.group.DefaultChannelGroup;import io.netty.handler.codec.http.DefaultFullHttpResponse;import io.netty.handler.codec.http.FullHttpRequest;import io.netty.handler.codec.http.FullHttpResponse;import io.netty.handler.codec.http.HttpHeaderValues;import io.netty.handler.codec.http.HttpHeaders;import io.netty.handler.codec.http.HttpResponse;import io.netty.handler.codec.http.HttpResponseStatus;import io.netty.handler.codec.http.HttpVersion;import io.netty.handler.codec.http2.Http2Headers;import io.netty.util.concurrent.GlobalEventExecutor;/** * /public class ChatHandler extends SimpleChannelInboundHandler{ public static ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); /* * 每当从服务端收到新的客户端连接时,客户端的 Channel 存入ChannelGroup列表中,并通知列表中的其他客户端 Channel / @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { Channel incoming = ctx.channel(); for (Channel channel : channels) { channel.writeAndFlush("[SERVER] - " + incoming.remoteAddress() + " 加入\n”); } channels.add(ctx.channel()); } /* * 每当从服务端收到客户端断开时,客户端的 Channel 移除 ChannelGroup 列表中,并通知列表中的其他客户端 Channel / @Override public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { Channel incoming = ctx.channel(); for (Channel channel : channels) { channel.writeAndFlush("[SERVER] - " + incoming.remoteAddress() + " 离开\n”); } channels.remove(ctx.channel()); } /* * 会话建立时 / @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { // (5) Channel incoming = ctx.channel(); System.out.println(“ChatClient:"+incoming.remoteAddress()+“在线”); } /* * 会话结束时 / @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { // (6) Channel incoming = ctx.channel(); System.out.println(“ChatClient:"+incoming.remoteAddress()+“掉线”); } /* * 出现异常 / @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { // (7) Channel incoming = ctx.channel(); System.out.println(“ChatClient:"+incoming.remoteAddress()+“异常”); // 当出现异常就关闭连接 cause.printStackTrace(); ctx.close(); } /* * 读取客户端发送的消息,并将信息转发给其他客户端的 Channel。 / @Override protected void channelRead0(ChannelHandlerContext ctx, Object request) throws Exception { FullHttpResponse response = new DefaultFullHttpResponse( HttpVersion.HTTP_1_1,HttpResponseStatus.OK , Unpooled.wrappedBuffer(“Hello netty” .getBytes())); response.headers().set(“Content-Type”, “text/plain”); response.headers().set(“Content-Length”, response.content().readableBytes()); response.headers().set(“connection”, HttpHeaderValues.KEEP_ALIVE); ctx.writeAndFlush(response); }}这里面其实只需要重写channelRead0 方法就可以了,其他是它的生命周期的方法,可以用来做日至记录。我们在读取消息后,往channel里写入了一个http的response。初始化我们的消息处理器package netty;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelPipeline;import io.netty.channel.socket.SocketChannel;import io.netty.handler.codec.http.HttpRequestDecoder;import io.netty.handler.codec.http.HttpResponseEncoder;/* * 用来增加多个的处理类到 ChannelPipeline 上,包括编码、解码、SimpleChatServerHandler 等。 /public class ChatServerInitializer extends ChannelInitializer<SocketChannel>{ @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(“HttpResponseEncoder”,new HttpResponseEncoder()); pipeline.addLast(“HttpRequestDecoder”,new HttpRequestDecoder()); pipeline.addLast(“chathandler”, new ChatHandler()); System.out.println(“ChatClient:"+ch.remoteAddress() +“连接上”); }}这个pipeline可以理解为netty的拦截器,每个消息进来,经过各个拦截器的处理。我们需要响应http消息,所以加入了响应编码以及请求解码,最后加上了我们的自定义处理器。这里面有很多处理器,netty以及帮你定义好的。服务启动类package netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelOption;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.nio.NioServerSocketChannel;/* * The class ChatServer */public class ChatServer { private int port; public ChatServer(int port) { this.port = port; } public void run() throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChatServerInitializer()) .option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true); System.out.println(“ChatServer 启动了”); // 绑定端口,开始接收进来的连接 ChannelFuture f = b.bind(port).sync(); // (7) // 等待服务器 socket 关闭 。 // 在这个例子中,这不会发生,但你可以优雅地关闭你的服务器。 f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); System.out.println(“ChatServer 关闭了”); } } public static void main(String[] args) throws Exception { new ChatServer(8090).run(); }}这个启动类就是按照上面那个结构图来的,添加两个线程组,设置channel,添加消息处理器,配置一些选项option。测试启动程序,浏览器访问 http://localhost:8090可以在浏览器看到我们返回的消息,但是控制台却显示连接了多个客户端,其实是因为浏览器发送了无关的请求道服务端,由于我们没有做路由,所以所有请求都是200。可以看到,发送了两次请求。现在我们换postman测试。这次只有一个客户端连接,当我们关闭postman:客户端显示掉线,整个会话过程结束。总结我们完成了服务端的简单搭建,模拟了聊天会话场景。后面再接着完善。别忘了关注我 mike啥都想搞还有其他后端技术分享在我的公众号。 ...

January 21, 2019 · 2 min · jiezi

sts开发工具解决properties显示中文问题

方法一:将下图的*.properties编码选为UTF-8方法二: 如果你是springboot的项目,可以将application.properties改用application.yml即可直接敲入中文

January 21, 2019 · 1 min · jiezi

IDE 插件新版本发布,开发效率 “biu” 起来了

近日,Cloud Toolkit正式推出了面向 IntelliJ 和 Eclipse 两个平台的新款插件,本文挑选了其中三个重大特性进行解读,点击文末官网跳转链接,可查看详细的版本说明。本地应用一键部署到任何机器上IDE 内置的命令行终端文件上传到服务器添加机器到 IntelliJ 或 Eclipse 中需要重点提下的是,虽然这个插件是阿里云官方插件,但了解到我们的开发者,还有不少原来的机器,以及线下环境,因此,这个插件不仅仅适用于阿里云 ECS,任何支持标准 SSH 协议的机器,都适用滴!在 IntelliJ 或 Eclipse,可以通过插件提供的图形引导界面,将机器配置到 IDE 中去。内置终端 Terminal在 IDE 内,开发者可以直接通过内置的终端 Terminal,即可一键快速登陆远程服务器。部署应用到远程服务器Cloud Toolkit 帮助开发者将本地应用程序一键部署到线下自有 VM,或阿里云 ECS、EDAS 和 Kubernetes 中去。当您每次修改完代码后,是否正在经历反复地打包?采用 SCP 工具上传?使用XShell或SecureCRT登陆服务器?替换部署包?重启?现在开始,请把这些重复繁琐的工作交给 Cloud Toolkit 吧!部署到 ECS完成编码后,无需在一系列运维工具之间切换,只需在 Cloud Toolkit 的图形界面上选择目标 ECS 实例,即可将应用部署至 ECS 指定目录部署到线下自有 VM支持 SSH 标准协议,你甚至可以将应用部署到任意机器中去部署到 EDAS针对阿里云 EDAS 开发者, 可以将本地代码和云端应用进行关联,实现自动化的部署部署到 Kubernetes针对阿里云 Kubernetes 开发者, 可以将本地代码和云端容器进行关联,实现自动化的镜像上传和部署文件上传Cloud Toolkit 帮助开发者在 IDE 内,一键将本地或者远程 URL 文件上传到服务器指定目录下去,无需在各种 FTP、SCP 工具之间频繁切换。更为重要的是,文件上传完毕后,还支持命令执行,比如:文件解压缩、程序启动等。官网https://toolkit.aliyun.com文档中心https://yq.aliyun.com/articles/665049需求Bug反馈https://www.wenjuan.com/s/emIFb2/本文作者:银时,Cloud Toolkit产品经理,《从Paxos到ZooKeeper》作者。立即点击下载官网:https://toolkit.aliyun.com本文作者:中间件小哥阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 17, 2019 · 1 min · jiezi

Problem 3:二维数组中的查找

一、题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。二、思路分析首先分析该数组的特点,在向下和向右方向上,数值会递增。以二维数组中任意位置元素为例,同行右侧元素皆大于该点,同列下侧元素皆大于该点,因此该点右下侧元素皆大于该点。而右上侧和左下侧点都可能有大于该点的点,初步可认为,大于该值的点位于右侧和下侧。因此,我们可以根据该数组的特点进行逐行剔除,达到缩小范围,查找目标值的目的。算法思路首先确定初始点,由于剔除某行/列,需要与目标值对比。初始点大于目标值,需要往小侧移动;初始点小于目标值,需要往大侧移动。而四个顶点,只有左下角和右下角,进行横向和纵向移动能高效筛选和剔除行列。选择右上角为初始点,执行下述操作1)如果该点等于目标值,结束查找2)如果该点小于目标值,往大侧移动,下移一行(列索引不变)3)如果该点大于目标值,往小侧移动,左移一列(行索引不变)重复上述过程,直到索引超过数组边界。如果符合1,退出重复。这里,我们认为本题找到目标值即可,无需查找是否有其他位置的目标值。根据上述思路,通过向左下移动,达到整行或者整列的剔除,实现比较快速的查找。可以把这个过程理解为剥洋葱,一层层剥开外层的非目标层,查找内部的目标值。三、Java实现源程序:package jz_offer;public class problem03{ /** * -查找二维数据arr中是否存在数值num * @param arr:二维数组 * num:目标值 * @return 在二维数组中是否找到了目标值怒骂,返回类型boolean */ public static boolean findNum(int[][] arr,int num){ boolean flag=false; //标志位,为true时表示找到目标值 int i=0; int j=arr[0].length-1; while(flag!=true&&i<arr.length&&j>=0){ if(arr[i][j]==num){ flag = true; break; }else if(arr[i][j]<num){ i++; }else{ j–; } } return flag; } public static void main(String[] args){ int[][] array={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}}; boolean found=findNum(array,7); System.out.println(“if the num 7 is in the array?"+found); } }

January 9, 2019 · 1 min · jiezi

使用Java创建第一个区块链

本系列教程的目的是帮助你了解如何开发区块链技术。在本教程中,我们将:创建你的第一个非常基础的区块链。实施简单的工作量证明系统(采矿)。探讨任何的可能性。我假设你对面向对象编程有基本的了解。值得注意的是,这不是一个功能齐全的生产区块链。相反,这是一个概念验证实现,可帮助你了解区块链对于未来教程中区块链的作用。配置我们将使用Java,但你应该能够使用任何OOP语言。我将使用Eclipse,但你可以使用任何新的花哨的文本编辑器(虽然你会错过很多好的扩展)。你会需要:安装了Java和JDK。Eclipse或其他IDE。或者你可以通过谷歌获取GSON库。这将允许我们将对象转换为Json。这是一个非常有用的库,我们也将在peer2peer中使用更多的东西,但是可以随意使用替代方法。在Eclipse中(file> new>)创建一个Java项目。我将把我的项目称为noobchain,并使用相同的名称创建一个新类NoobChain。现在你就可以去试试:)创建区块链。区块链只是一个链/列表块。区块链中的每个区块都有自己的数字签名,包含前一个区块的数字签名,并且有一些数据(例如,这些数据可能是交易)。哈希=数字签名。每个块不仅包含之前块的哈希值,而且它自己的哈希部分是从前一个哈希计算的。如果前一个块的数据被改变,那么前一个块的哈希将改变(因为它部分地由数据计算),进而影响其后的块的所有哈希。计算和比较哈希值可以让我们看到区块链是否无效。这是什么意思?…更改此列表中的任何数据,将更改签名并破坏区块链。所以先让我们创建构成区块链的类Block:import java.util.Date;public class Block { public String hash; public String previousHash; private String data; //our data will be a simple message. private long timeStamp; //as number of milliseconds since 1/1/1970. //Block Constructor. public Block(String data,String previousHash ) { this.data = data; this.previousHash = previousHash; this.timeStamp = new Date().getTime(); }}正如你所看到的,我们的基本块包含一个String hash,它将保存我们的数字签名。变量previousHash用于保存前一个块的哈希和String data以保存我们的块数据。接下来我们需要一种生成数字签名的方法,你可以选择许多加密算法,但SHA256适用于此示例。我们可以import java.security.MessageDigest;访问SHA256算法。我们需要稍后使用SHA256,以便在新的StringUtil utility类中创建一个方便的helper方法:import java.security.MessageDigest;public class StringUtil { //Applies Sha256 to a string and returns the result. public static String applySha256(String input){ try { MessageDigest digest = MessageDigest.getInstance(“SHA-256”); //Applies sha256 to our input, byte[] hash = digest.digest(input.getBytes(“UTF-8”)); StringBuffer hexString = new StringBuffer(); // This will contain hash as hexidecimal for (int i = 0; i < hash.length; i++) { String hex = Integer.toHexString(0xff & hash[i]); if(hex.length() == 1) hexString.append(‘0’); hexString.append(hex); } return hexString.toString(); } catch(Exception e) { throw new RuntimeException(e); } } }如果你不理解这个帮助方法的内容,不要太担心,你需要知道的是它需要一个字符串并对其应用SHA256算法,并将生成的签名作为字符串返回。现在让我们使用我们的applySha256 helper,在Block类的新方法中计算哈希值。我们必须计算我们不想被篡改的块的所有部分的哈希值。因此,对于我们的块,我们将包括previousHash,data和timeStamp。public String calculateHash() { String calculatedhash = StringUtil.applySha256( previousHash + Long.toString(timeStamp) + data ); return calculatedhash;}并让我们将此方法添加到Block构造函数中 … public Block(String data,String previousHash ) { this.data = data; this.previousHash = previousHash; this.timeStamp = new Date().getTime(); this.hash = calculateHash(); //Making sure we do this after we set the other values. }一些测试时间……在我们的主NoobChain类中,我们可以创建一些块并将哈希值打印到屏幕上,以查看所有内容是否正常工作。让我们测试一下……第一个块称为genesis块,因为没有先前的块,我们只需输入“0”作为前一个哈希。public class NoobChain { public static void main(String[] args) { Block genesisBlock = new Block(“Hi im the first block”, “0”); System.out.println(“Hash for block 1 : " + genesisBlock.hash); Block secondBlock = new Block(“Yo im the second block”,genesisBlock.hash); System.out.println(“Hash for block 2 : " + secondBlock.hash); Block thirdBlock = new Block(“Hey im the third block”,secondBlock.hash); System.out.println(“Hash for block 3 : " + thirdBlock.hash); }}输出应该类似于:你的值会有所不同,因为你的时间戳会有所不同。每个块现在都有自己的数字签名,基于其信息和前一个块的签名。目前它不是一个区块链,所以让我们将块存储在ArrayList中,并导入gson以将其视为Json。(单击此处了解如何导入gson库)import java.util.ArrayList;import com.google.gson.GsonBuilder;public class NoobChain { public static ArrayList<Block> blockchain = new ArrayList<Block>(); public static void main(String[] args) { //add our blocks to the blockchain ArrayList: blockchain.add(new Block(“Hi im the first block”, “0”)); blockchain.add(new Block(“Yo im the second block”,blockchain.get(blockchain.size()-1).hash)); blockchain.add(new Block(“Hey im the third block”,blockchain.get(blockchain.size()-1).hash)); String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain); System.out.println(blockchainJson); }}现在我们的输出应该看起来更接近我们对区块链的期望。现在我们需要一种方法来检查区块链的完整性。让我们在NoobChain类中创建一个isChainValid()的布尔值方法,它将遍历链中的所有块并比较哈希值。此方法需要检查哈希变量实际上是否等于计算的哈希值,并且前一个块的哈希值等于previousHash变量。public static Boolean isChainValid() { Block currentBlock; Block previousBlock; //loop through blockchain to check hashes: for(int i=1; i < blockchain.size(); i++) { currentBlock = blockchain.get(i); previousBlock = blockchain.get(i-1); //compare registered hash and calculated hash: if(!currentBlock.hash.equals(currentBlock.calculateHash()) ){ System.out.println(“Current Hashes not equal”); return false; } //compare previous hash and registered previous hash if(!previousBlock.hash.equals(currentBlock.previousHash) ) { System.out.println(“Previous Hashes not equal”); return false; } } return true;}对区块链块的任何更改都将导致此方法返回false。在比特币网络节点上共享其区块链,并且网络接受最长的有效链。什么阻止某人篡改旧块中的数据然后创建一个全新的更长的区块链并将其呈现给网络?工作量证明。工作系统的hashcash证明意味着创建新块需要相当多的时间和计算能力。因此,攻击者需要比其他对等组合更多的计算能力。让我们开始挖掘块!我们将要求矿工通过在块中尝试不同的变量值来进行工作量证明,直到其哈希以一定数量的0开始。让我们在calculateHash()方法中添加一个名为nonce的int,以及非常需要的mineBlock()方法:import java.util.Date;public class Block { public String hash; public String previousHash; private String data; //our data will be a simple message. private long timeStamp; //as number of milliseconds since 1/1/1970. private int nonce; //Block Constructor. public Block(String data,String previousHash ) { this.data = data; this.previousHash = previousHash; this.timeStamp = new Date().getTime(); this.hash = calculateHash(); //Making sure we do this after we set the other values. } //Calculate new hash based on blocks contents public String calculateHash() { String calculatedhash = StringUtil.applySha256( previousHash + Long.toString(timeStamp) + Integer.toString(nonce) + data ); return calculatedhash; } public void mineBlock(int difficulty) { String target = new String(new char[difficulty]).replace(’\0’, ‘0’); //Create a string with difficulty * “0” while(!hash.substring( 0, difficulty).equals(target)) { nonce ++; hash = calculateHash(); } System.out.println(“Block Mined!!! : " + hash); }}实际上,每个矿工将从随机点开始迭代。一些矿工甚至可以尝试随机数来获取随机数。另外值得注意的是,在更难的解决方案可能需要超过integer.MAX_VALUE,矿工可以尝试更改时间戳。mineBlock()方法接受一个名为difficulty的int,这中间必须解决的数量为0的问题。在大多数计算机上几乎可以立即解决像1或2这样的低难度问题,我建议在4-6左右进行难度测试。在撰写本文时,Litecoin的难度大约是442,592。让我们将难度作为静态变量添加到NoobChain类:public static int difficulty = 5; 我们应该更新NoobChain类以触发每个新块的mineBlock()方法。isChainValid()布尔值还应检查每个块是否具有已解决(通过挖掘)哈希。import java.util.ArrayList;import com.google.gson.GsonBuilder;public class NoobChain { public static ArrayList<Block> blockchain = new ArrayList<Block>(); public static int difficulty = 5; public static void main(String[] args) { //add our blocks to the blockchain ArrayList: blockchain.add(new Block(“Hi im the first block”, “0”)); System.out.println(“Trying to Mine block 1… “); blockchain.get(0).mineBlock(difficulty); blockchain.add(new Block(“Yo im the second block”,blockchain.get(blockchain.size()-1).hash)); System.out.println(“Trying to Mine block 2… “); blockchain.get(1).mineBlock(difficulty); blockchain.add(new Block(“Hey im the third block”,blockchain.get(blockchain.size()-1).hash)); System.out.println(“Trying to Mine block 3… “); blockchain.get(2).mineBlock(difficulty); System.out.println("\nBlockchain is Valid: " + isChainValid()); String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain); System.out.println("\nThe block chain: “); System.out.println(blockchainJson); } public static Boolean isChainValid() { Block currentBlock; Block previousBlock; String hashTarget = new String(new char[difficulty]).replace(’\0’, ‘0’); //loop through blockchain to check hashes: for(int i=1; i < blockchain.size(); i++) { currentBlock = blockchain.get(i); previousBlock = blockchain.get(i-1); //compare registered hash and calculated hash: if(!currentBlock.hash.equals(currentBlock.calculateHash()) ){ System.out.println(“Current Hashes not equal”); return false; } //compare previous hash and registered previous hash if(!previousBlock.hash.equals(currentBlock.previousHash) ) { System.out.println(“Previous Hashes not equal”); return false; } //check if hash is solved if(!currentBlock.hash.substring( 0, difficulty).equals(hashTarget)) { System.out.println(“This block hasn’t been mined”); return false; } } return true; }}请注意,我们还检查并打印isChainValid。运行此结果应如下所示:挖掘每个区块需要一些时间!(大约3秒)你应该弄乱难度值,看看这会影响挖掘每个区块的时间。如果有人要篡改区块链系统中的数据:他们的区块链无效。他们无法创建更长的区块链。你网络中的诚实区块链将在最长的链条上具有时间优势。被篡改的区块链将无法赶上更长且有效的链条。除非它们的计算速度远远超过网络中所有其他节点的总和。未来的量子计算机或其他东西。你已经完成了基本的区块链!你的区块链:由存储数据的块组成。具有将你的块链接在一起的数字签名。需要工作挖掘证明来验证新块。可以检查其中的数据是否有效且未更改。你可以在Github上下载项目文件。======================================================================分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。汇智网原创翻译,转载请标明出处。这里是原文使用Java创建第一个区块链 ...

January 3, 2019 · 4 min · jiezi

清除eclipse中Runnable JAR file 的历史记录

使用 eclipse 的 Export打包Runnable JAR file 时间久了会产生很多记录,影响下次打包时找到主方法找到eclipse的workspace(工作空间)下的{workspace}/.metadata/.plugins/org.eclipse.debug.core/.launches删除里面的内容即可

December 26, 2018 · 1 min · jiezi

浅谈Android O Touch声音播放流程

前言当我们点击屏幕按键时,就会听到touch音,那么touch音是如何播放起来的呢,由于最近项目需求顺便熟悉下了touch音的逻辑。正文谈touch逻辑首先要说下这个类ViewRootImpl.java,位于frameworks/base/core/java/android/view下,ViewRootImpl的主要功能:A:链接WindowManager和DecorView的纽带,更广一点可以说是Window和View之间的纽带。B:完成View的绘制过程,包括measure、layout、draw过程。C:向DecorView分发收到的用户发起的event事件,如按键,触屏等事件。关于ViewRootImpl的源码可参照博客ViewRootImpl类源码解析,我们从performFocusNavigation()入手private boolean performFocusNavigation(KeyEvent event) { //略 if (v.requestFocus(direction, mTempRect)) { playSoundEffect(SoundEffectConstants.getContantForFocusDirection(direction)); return true; } //略 return false;}当我们点击某个控件时,会先触发performFocusNavigation()这个方法,然后当控件获取到focus后便会调用playSoundEffect()方法,我只截取了performFocusNavigation()中关键代码playSoundEffect()部分,来看下playSoundEffect()这个方法 public void playSoundEffect(int effectId) { checkThread(); try { final AudioManager audioManager = getAudioManager(); switch (effectId) { case SoundEffectConstants.CLICK: audioManager.playSoundEffect(AudioManager.FX_KEY_CLICK); return; case SoundEffectConstants.NAVIGATION_DOWN: audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_DOWN); return; case SoundEffectConstants.NAVIGATION_LEFT: audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_LEFT); return; case SoundEffectConstants.NAVIGATION_RIGHT: audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT); return; case SoundEffectConstants.NAVIGATION_UP: audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_UP); return; default: throw new IllegalArgumentException(“unknown effect id " + effectId + " not defined in " + SoundEffectConstants.class.getCanonicalName()); } } catch (IllegalStateException e) { // Exception thrown by getAudioManager() when mView is null Log.e(mTag, “FATAL EXCEPTION when attempting to play sound effect: " + e); e.printStackTrace(); } }发现调用了audioManager的playSoundEffect()方法,audiomanager就不说了,接触android audio最先接触的可能就是AudioManager了,音量控制,声音焦点申请等。接着看 public void playSoundEffect(int effectType) { if (effectType < 0 || effectType >= NUM_SOUND_EFFECTS) { return; } //查询是否开启touch音,如果settings中关闭了,则直接返回 if (!querySoundEffectsEnabled(Process.myUserHandle().getIdentifier())) { return; } final IAudioService service = getService(); try { //调用到AudioService的playSoundEffect() service.playSoundEffect(effectType); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } }查询touch音是否可播放,因为毕竟在android的setting中有个touch音的开关,如果可播放则调用到AudioService的playSoundEffect() public void playSoundEffect(int effectType) { playSoundEffectVolume(effectType, -1.0f); } public void playSoundEffectVolume(int effectType, float volume) { if (effectType >= AudioManager.NUM_SOUND_EFFECTS || effectType < 0) { Log.w(TAG, “AudioService effectType value " + effectType + " out of range”); return; } sendMsg(mAudioHandler, MSG_PLAY_SOUND_EFFECT, SENDMSG_QUEUE, effectType, (int) (volume * 1000), null, 0); }其实AudioService初始化的时候会创建一个子线HandlerThread,HandlerThread主要处理一些相对耗时的操作,这里将播放touch音的功能放在了这个子线程中去执行,这样避免了主线程的阻塞,其实大家在做mediaplayer播放时也建议放在子线程去播放,接下来看看handler里对消息的处理,关键代码如下case MSG_PLAY_SOUND_EFFECT: if (msg.obj == null) { onPlaySoundEffect(msg.arg1, msg.arg2, 0); } else { onPlaySoundEffect(msg.arg1, msg.arg2, (int) msg.obj); } break;直接调用onPlaySoundEffect()的方法 private void onPlaySoundEffect(int effectType, int volume) { synchronized (mSoundEffectsLock) { //初始化mSoundPool和要播放的资源文件 onLoadSoundEffects(); if (mSoundPool == null) { return; } float volFloat; // use default if volume is not specified by caller if (volume < 0) { volFloat = (float)Math.pow(10, (float)sSoundEffectVolumeDb/20); } else { volFloat = volume / 1000.0f; } if (SOUND_EFFECT_FILES_MAP[effectType][1] > 0) { //播放touch音 mSoundPool.play(SOUND_EFFECT_FILES_MAP[effectType][1], volFloat, volFloat, 0, 0, 1.0f); } else { MediaPlayer mediaPlayer = new MediaPlayer(); try { String filePath = Environment.getRootDirectory() + SOUND_EFFECTS_PATH + SOUND_EFFECT_FILES.get(SOUND_EFFECT_FILES_MAP[effectType][0]); mediaPlayer.setDataSource(filePath); mediaPlayer.setAudioStreamType(AudioSystem.STREAM_SYSTEM); mediaPlayer.prepare(); mediaPlayer.setVolume(volFloat); mediaPlayer.setOnCompletionListener(new OnCompletionListener() { public void onCompletion(MediaPlayer mp) { cleanupPlayer(mp); } }); mediaPlayer.setOnErrorListener(new OnErrorListener() { public boolean onError(MediaPlayer mp, int what, int extra) { cleanupPlayer(mp); return true; } }); mediaPlayer.start(); } catch (IOException ex) { Log.w(TAG, “MediaPlayer IOException: “+ex); } catch (IllegalArgumentException ex) { Log.w(TAG, “MediaPlayer IllegalArgumentException: “+ex); } catch (IllegalStateException ex) { Log.w(TAG, “MediaPlayer IllegalStateException: “+ex); } } } }最终通过soundPool来播放指定的资源文件实现了touch音的播放,因此大家在工作中如果有什么需要对应touch音的逻辑,可参照AudioService的onPlaySoundEffect()中的逻辑。比如指定touch音的AudioAttributes使touch音输出到指定的device上等。总结touch音的流程就简单分析到这里,欢迎大家交流指正。努力学习ing~ ...

December 13, 2018 · 2 min · jiezi

不使用盗版软件

问题概述最近跟朋友做的java项目,使用到了mysql和MyEclipse。先谈谈我对软件的理解,等项目都结束时,再开一个文章,谈谈自己的总结。记得几年前接触学习java 的时候,被MyEclipse折腾得够呛。因为当时软件各种看不懂,也不会用,这次趁着合作项目,又回顾了下用java开发。其实去年在北京理工大学时候,就用java做过一个“假”项目。当时就是为了应对考试,随便找了个网上的例子,然后跑跑tomcat就演示给同学看下,就行。其实那个时候,我就发现,虽然自己是接触过、学习过java,但是长久的不使用,会忘得一干二净。这次有朋友的帮忙,而且可以远程控制电脑,慢慢地想起来怎么配置了开发环境和使用MyEclipse了,还有各种项目中要配置的东西。因为朋友使用的是MyEclipse,为了方便,我也就下载了正版的软件,让他帮我配置上环境。正版的MyEclipse是有试用期的,目前我了解的朋友,使用的都是盗版破解的版本。但是我始终觉得,盗版不安全。正好项目做得差不多了,我有机会折腾下了,因为前期朋友帮我配置环境的时候,我基本上想起来了怎么配置服务器啊、配置环境变量啊、配置MySql链接啊,等等的。所以我心里就有底儿,可以自己捯饬捯饬了。首先,我想到的自然是正版。如果说正版的价格合适,花钱买个正版软件用用也不是不行。毕竟MyEclipse是开发java最强大的IDE。但是正版的价格,我去看了下,还真是贵啊。既然正版的价格贵,盗版的存在安全隐患。要知道在中国有成千上万的java开发者,我相信在中国,即使是一线的大公司企业,也很难紧紧是为了购买一个软件,就开发人员花费巨额资金。既然如此,就放弃MyEclipse吧,方法总是有的。其实还有个Eclipse,比MyEclipse更小,运行速度更快,配置插件非常灵活。最重要的就是免费啊~ 其实之前上学时候,用过Eclipse,只不过后来配置Spring、struts等等框架的时候,Eclipse比较麻烦,后来还是用盗版的MyEclipse了。当时主要就是为了学习java,盗版就盗版了。现在不同了,如果从长远的角度考虑,还是不使用盗版软件。虽然说,我的项目也都不值钱,也没必要搞得人心惶惶的。但是心态要摆正,违法的事情还是要避免。而且现在也不是学生时代了,没有任何的个人维权意识,也没有个人保护意识。用Eclipse呢,其实完全能胜任java 的各项开发工作。唯一的问题就是要配置各种相匹配的插件。MyEclipse强大就是把各种各样的插件都集成起来了,开发者根本不用关心怎么配置,非常“傻瓜化”。eclipse环境下配置tomcat打开Eclipse,单击“Window”菜单,选择下方的“Preferences”。单击“Server”选项,选择下方的“Runtime Environments”。点击“Add”添加Tomcat。点击“Next”,选中自己安装的Tomcat路径。点击“Finish”完成。建立一个Web应用File → New → Dynamic Web Project如果在新建的菜单中没有找到Dynamic Web Project这个选项,可以去Other这个菜单中查找。创建一个Dynamic Web Project点击“Next”下一步点击“Next”下一步这一步其实配置的就是服务器访问路径啦。Context root,也就是根目录的名称相当于访问localhost:8080/XXX中的xxx;Content directory也就是部署到Tomcat中目录。我新安装的Eclipse默认给我显示的是WebContent,这是不行的,需要将这个值设置为WebRoot。点击“Finish”完成让Tomcat服务器显示在控制台上,将Web应用部署到Tomcat中Window → Show View → Servers点击链接No servers are available. Click ths link to create a new server. ,在弹出的对话框中选择Tomcat版本点击“Next”,添加我们的项目选中项目并点击Add,或是双击都可以添加到右边点击“Finish”完成返回下方的“Servers”面板,右键单击该面板中的Tomcat v8.0 Server at localhost节点,在弹出的快捷菜单中单击Start,即可启动指定的Web服务器。如果此时直接启动访问http://localhost:8080/TomcatTest ,会发现会报404的错误。这是因为我们没有添加主页,下面添加主页(index.jsp)的内容:<%@ page language=“java” contentType=“text/html; charset=utf-8” pageEncoding=“utf-8”%><!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv=“Content-Type” content=“text/html; charset=ISO-8859-1”><title>欢迎页面</title></head><body>欢迎使用eclipse部署Tomcat。</body></html>注意:web资源一定要在WebRoot目录下添加。如图:此时,再一次来访问该链接:http://localhost:8080/TomcatTest ,效果如下:补充说明其实以上图片来源于网络,我是按照这个文章原文操作的。原文章作者是Windows系统,而我是Mac系统。其实还是有一丢丢不一样的,需要自己去灵活变通的。其中安装自己的Tomcat路径中,必须得自己在电脑中下载安装一个Tomcat。我下载的是tomcat-7.0.73,在选择安装目录的时候,选择自己系统中的tomcat目录。如果使用MyEclipse的话,就没有这么麻烦,在MyEclipse中内置好了Tomcat,不用再去下载安装。另外一个问题,就是引入jar包。因为原来的项目是在MyEclipse中运行的,换成Eclipse时,jar包会丢失找不到。需要导入一下。例如我的项目提示:import javax.servlet.http.HttpSession无法引入。这时候得加入tomcat的jar包,右击项目->build path-add libraries->server Runtime->选择要导入的tomcat 就可以了。MySql图形化工具目前比较流行的工具就是Nacicat,破解的版本非常容易获得,中文界面,操作简单。很多公司,即使是商业开发,用的也是破解版的。只要对数据进行严格的权限管理和数据备份,还是比较安全的。我之前接触的时候,也是用这个软件,上手特别容易而且英语水平差,比较排斥英文软件。不过现在情况不同了,英语水平提高,软件使用方法、概念也比较清楚,而且不愿意使用盗版软件了。去网上找了,我个人觉得还是官方推出的图形工具,是最靠谱的。直接下载使用MySQL Workbench 即可。

November 12, 2018 · 1 min · jiezi