技术文章

Java的常量接口思考,项目中的常量是放在接口里还是放在类里呢?

Deadly 提交于 2021-02-20 08:08:02
最近在看一本书 Java与模式,里面提了一句不建议使用常量接口,甚至举了个java源码的反例, 蛋疼的是没有说为什么? 查了网上一圈发现他们也是知道怎么做而不知道为什么这么做。 然后我只能找谷歌了,翻译后,我把自己理解外加总结的放在下面。 第一 常量类应该是final,不变的,而接口里的参数是final,也是不变的。 那么,看起来接口是放常量没有一定问题,还省去了final的输入,非常的合适。 但是,类是只能单继承的,接口是允许多实现的。 要是类实现的多个接口出现重名的常量,会报错,必须要在实现类明确常量用的是哪个接口的。 虽然这可以说是架构师设计的问题,但是,架构师这么做就违反了依赖倒转原则,这玩意就不细说了。 第二 如果某个实现了常量接口的类被修改不再需要常量了,也会因为序列化兼容原因不得不保持该实现,而且非final类实现常量接口会导致所有子类被污染。 这个应该很少人遇到过,不过这是 Effective Java 里面说的。 具体的理解就是,能被序列化的一定是数据, 那么突然改了数据结构,可能导致老版的数据无法被反序列化,而新版的数据会有冗杂的数据, 要是折腾个几次,网络传输协议 这个无法通过时间或者空间提升的玩意就能逼死你了。 Effective Java 作者 大佬的原话 According to Joshua Bloch, author of "Effective

23、Python之加密&解密以及加签&验签

笑着哭i 提交于 2021-02-20 08:07:13
一、rsa基本原理 关于加密与加签其目的就是为了保证数据传输的安全性,加签的作用就像签名,告诉别人这个就是我发的数据,别人无法模仿,加密的作用是传输的报文是一串密文,他人无法看懂什么意思,下图描述了使用rsa进行加签,加密,验签,解密的过程。 AB双方生成2对秘钥,A用自己的私钥进行签名(表示是自己发的数据),然后用B的公钥进行加密(这个数据是密文,第三方压根看不懂),B在接收到A发过来的数据时,先用B的私钥进行解密(嘿嘿,只有我能解密),随后用A的公钥进行验签(嗯,就是A发过来的数据),最终使用A传过来的明文进行后续业务处理(上图中B端数据描述不太准确,忽略,懒的画图)。后续通信亦是如此! 二、python中rsa操作 python中使用rsa模块,首先我们要先生成2对秘钥值,在python中使用下面代码生成秘钥值(记得生成2对)。 1 import rsa 2 3 import base64 4 # 生成密钥 5 (pubkey, privkey) = rsa.newkeys(1024 ) 6 # 保存密钥 7 with open( ' public.pem ' , ' w+ ' ) as f: 8 f.write(pubkey.save_pkcs1().decode()) 9 10 with open( ' private.pem ' , ' w+ ' ) as f: 11

Python数据结构与算法——双端队列Dequeue

老子叫甜甜 提交于 2021-02-20 08:06:51
点击上方 蓝字 关注我们 双端队列Dequeue 双端队列是一种有序的数据集,与队列相似,但双端队列的两端都可以作为队首和队尾( 即数据在两端都可以删除和插入 ) 某种意义上来说,双端队列Dequeue 集合了栈和队列的功能 ,Dequeue既可以实现栈也可以实现队列 双端队列的操作: Dequeue() 创建一个双端队列 addFront() 队首加入数据 addFear() 队尾加入数据 removeFront() 队首删除数据 removeFear() 队尾删除数据 size() 双端队列元素个数 isEmpty() 是否为空 双端队列使用实例: 双端队列代码: 双端队列应用—— “回文词”判定 “回文词”: 正读和反读都一样的词 例:radar(雷达),madam,foot,“上海自来水来自海上”,“山东落花生花落” 算法: 利用双端队列Dequeue,先将字符串加入双端队列,再从两端开始移除判断是否相同,最后剩一个字符 代码: 所有代码: class Dequeue () : """双端队列""" def __init__ (self) : self.items = [] def addFront (self, item) : self.items.append(item) def addFear (self, item) : self.items.insert( 0 ,

查看SQL SERVER数据库的连接数

不想你离开。 提交于 2021-02-20 08:06:08
1,查看连接到‘TestDB2’数据库的连接 select * from master.dbo.sysprocesses where dbid = DB_ID ( ' TestDB2 ' ) *查询某个数据库用户的连接情况 sp_who ' sa ' 2,查看数据库允许的最大连接 select @@MAX_CONNECTIONS 3,查看数据库自上次启动以来的连接次数 SELECT @@CONNECTIONS 4,关闭连接 上面的查询可以得到spid,根据spid,关闭进程就可以了。 kill 54 来源: oschina 链接: https://my.oschina.net/u/4384397/blog/4044966

Map的几种遍历方式

别等时光非礼了梦想. 提交于 2021-02-20 08:05:46
方式1: Iterator<String> iterator = map.keySet().iterator(); while (iterator.hasNext()) { String key = (String) iterator.next(); String value = map.get(key); } 方式2: for (String key : map.keySet()) { String value = map.get(key); } 方式3: Iterator<Entry<String, String>> iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, String> entry = (Map.Entry<String, String>) iterator.next(); String key = entry.getKey(); String value = entry.getValue(); } 方式4: for (Entry<String, String> entry : map.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); } 来源:

nginx + tomcat + https配置

我的梦境 提交于 2021-02-20 08:05:23
nginx + tomcat + https配置 模式: 客户端 ---https -----> nginx ----- http ------> tomcat 浏览器和 Nginx 之间走的 HTTPS 通讯,而 Nginx 到 Tomcat 通过 proxy_pass 走的是普通 HTTP 连接。 证书申请: 在有域名的服务器上部署申请证书的程序: 备注:python 版本在2.6以上 1. #mkdir ~/cert/ wget https://dl.eff.org/certbot-auto chmod a+x certbot-auto 2、mkdir ~/.pip pip.conf配置文件: [global] index-url=https://pypi.doubanio.com/simple/ [install] trusted-host=pypi.doubanio.com 3、安装申请证书所依赖的工具 cd ~/cert #./certbot-auto 安装过程可能需要比较长的时间,有时可能是网络连接不好执行不成功 You should test your configuration at: https://www.ssllabs.com/ssltest/analyze.html?d=www.lelaohui.com.cn -----------------------

Tomcat 启用 HTTPS/SSL

一曲冷凌霜 提交于 2021-02-20 08:04:35
生成 key # $JAVA_HOME/bin/keytool \ -genkeypair \ -keyalg RSA \ -keysize 2048 \ -keystore tomcat.jks \ -alias tomcat \ -storepass yourpass \ -keypass yourpass \ -dname "CN=YourName, OU=YourOrg, O=Your Company, L=YourCity, S=YourState, C=CN" 特别说明 :上边输入的“-storepass”和“-keypass“ 2个密码一定要相同,否则TOMCAT起不来。 参考: http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/keytool.html http://www-01.ibm.com/software/webservers/hostondemand/library/v8infocenter/ssh-pk03.html 然后将生成的 tomcat.jks 文件 copy 到 $CATALINA_BASE/conf 目录 编辑 $CATALINA_BASE/conf/server.xml 打开下面的配置 <Connector port="8443" protocol="HTTP/1.1"

响铃——卡死

给你一囗甜甜゛ 提交于 2021-02-20 08:03:55
//卡死 #include <iostream> #include <string> #include <ctime> using namespace std; int main() { char alarm = '\a'; for(;;) { cout << alarm << "Don't do that again!"<<endl; } return 0; } 来源: oschina 链接: https://my.oschina.net/u/853930/blog/94109

生命周期事件——Lifecycle Events

非 Y 不嫁゛ 提交于 2021-02-20 08:03:37
Lifecycle Events Overview Cloudify支持以下类型的生命周期事件: Application events — 内置events,在Cloudify shell提示符输入命令来调用。 Service events —在service recipe中定义的事件,由ESM调用。 Service instance events — 在service recipe中定义的最后要的生命周期事件,由ESM调用。 当一个生命周期事件被触发,事件需要的动作发生对应的事件处理脚本会运行。例如一个安装事件被ESM调用,对应的安装事件处理(定义在服务描述文件中)会执行。 已知的限制: 当 start 事件反回,Cloudify将认为service 实例已经停止并且会试图重试。为了避免该行为,确保start脚本永久睡眠。 Application Events Application events 是Cloudify内置的,当前不能在应用recipe中自定义。它们是由Cloudify shell提示符输入命令来调用的。通常用于执行各各任务,如,将recipes拷贝到管理machines中,然后触发相应的内置应用事件。 存在两种application events: Application install –用于安装应用,在 Cloudify shell prompt中输入:

java kafka 生产者消费者demo

夙愿已清 提交于 2021-02-20 08:03:23
一、修改kafka server.porperties的ip是你本机的ip listeners=PLAINTEXT: // 192.168.111.130:9092 二、生产者的例子 import org.apache.kafka.clients.producer.* ; import java.util.Properties; public class KafkaProducerDemo { private final Producer<String, String> kafkaProdcer; public final static String TOPIC = "JAVA_TOPIC" ; private KafkaProducerDemo() { kafkaProdcer = createKafkaProducer(); } private Producer<String, String> createKafkaProducer() { Properties props = new Properties(); props.put( "bootstrap.servers", "192.168.111.130:9092" ); props.put( "acks", "all" ); props.put( "retries", 0 ); props.put( "batch