首页 文章 精选 留言 我的

精选列表

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

用JavaScript开发Stellar区块链应用

Stellar JS SDK封装了Stellar交易的提交,以及与Stellar Horizon API服务器的交互过程,可以运行在Node.js环境或Web浏览器中。js-stellar-sdk主要有两个作用:1、通过HorizonAPI服务器查询Stellar区块链数据 2、构建Stellar交易、签名并提交到Stellar网络中。 相关推荐:汇智网 区块链开发系列教程 1、构造Horizon访问请求 js-stellar-sdk使用Builder模式来创建要发送给Horizon API服务器的请求。从一个server对象开始,你可以通过链式调用来生成最终的查询请求。例如: var StellarSdk = require('stellar-sdk'); var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); // get a list of transactions that occurred in ledger 1400 server.transactions() .forLedger(1400) .call().then(function(r){ console.log(r); }); // get a list of transactions submitted by a particular account server.transactions() .forAccount('GASOCNHNNLYFNMDJYQ3XFMI7BYHIOCFW3GJEOWRPEGK2TDPGTG2E5EDW') .call().then(function(r){ console.log(r); }); 一旦请求构造好了,就可以调用.call()或.stream()来提交请求。.call()将返回一个promise对象,其解析结果为Horizon服务器的响应。 2、发送流式请求 许多请求可以使用.stream()来调用。与.call()返回promise对象不同,.stream()将返回一个EventSource对象。Horizon API服务器会自动推送相关的数据给请求的客户端。 例如,下面的代码显示输出指定的Stellar账户的交易: var StellarSdk = require('stellar-sdk') var server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); var lastCursor=0; // or load where you left off var txHandler = function (txResponse) { console.log(txResponse); }; var es = server.transactions() .forAccount(accountAddress) .cursor(lastCursor) .stream({ onmessage: txHandler }) 3、处理Stellar Horizon API服务器的响应 3.1 Stellar XDR格式解码 Horizon API服务器的交易访问端结点会以原始XDR格式返回某些字段。你可以使用.fromXDR()将XDR转换为JSON格式。 例如,下面的代码重写了上面示例中的txHandler来将XDR字段显示为JSON格式: var txHandler = function (txResponse) { console.log( JSON.stringify(StellarSdk.xdr.TransactionEnvelope.fromXDR(txResponse.envelope_xdr, 'base64')) ); console.log( JSON.stringify(StellarSdk.xdr.TransactionResult.fromXDR(txResponse.result_xdr, 'base64')) ); console.log( JSON.stringify(StellarSdk.xdr.TransactionMeta.fromXDR(txResponse.result_meta_xdr, 'base64')) ); }; 3.2 Horizon响应结果中的链接跟随 在Horizon响应中包含的链接已经被转换为对应的方法调用,这让你可以简单地通过.next()方法来逐页查看结果,同时也让获取额外信息更加轻松。例如: server.payments() .limit(1) .call() .then(function(response){ // will follow the transactions link returned by Horizon response.records[0].transaction().then(function(txs){ console.log(txs); }); }); 4、Stellar交易构建与广播 4.1 Stellar交易构建 Stellar的交易构建过程稍微复杂一点,我们将在另一篇文章中介绍,你可以先查看英文原文 4.2 Stellar交易提交 一旦创建好了交易,就可以使用Server.submitTransaction()方法将其提交到Stellar网络中。 const StellarSdk = require('stellar-sdk') StellarSdk.Network.useTestNetwork(); const server = new StellarSdk.Server('https://horizon-testnet.stellar.org'); (async function main() { const account = await server.loadAccount(publicKey); /* Right now, we have one function that fetches the base fee. In the future, we'll have functions that are smarter about suggesting fees, e.g.: `fetchCheapFee`, `fetchAverageFee`, `fetchPriorityFee`, etc. */ const fee = await server.fetchBaseFee(); const transaction = new StellarSdk.TransactionBuilder(account, { fee }) .addOperation( // this operation funds the new account with XLM StellarSdk.Operation.payment({ destination: "GASOCNHNNLYFNMDJYQ3XFMI7BYHIOCFW3GJEOWRPEGK2TDPGTG2E5EDW", asset: StellarSdk.Asset.native(), amount: "20000000" }) ) .setTimeout(30) .build(); // sign the transaction transaction.sign(StellarSdk.Keypair.fromSecret(secretString)); try { const transactionResult = await server.submitTransaction(transaction); console.log(transactionResult); } catch (err) { console.error(err); } })() 原文链接:Stellar JS SDK简明教程 - 汇智网

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

Java设计模式应用_责任链模式

生产一个产品,需要依次执行多个步骤,才能完成,那么是使用责任链模式则是极好的。 在性能告警模块开发过程中,创建一条告警规则需要执行阈值解析,中间表生成,流任务生成,规则入库,告警事件入库等诸多操作。如果把这些步骤糅合在一个类中,代码可读性及复杂度往往是灾难的,特别对于这么多步骤的事务性操作,更是力不从心。使用责任链模式,上述问题迎刃而解。 以告警规则创建为例子,简化流程如下 阈值解析 ---> 流任务生成 ---> 规则入库 回滚流程如下 1、 阈值解析失败:回滚阈值解析。 2、 流任务生产失败:回滚流任务生成,阈值解析。 3、 规则入库失败:回滚规则入库,流任务生成,阈值解析。 采用责任链模式编码,思路如下: 1、 编写阈值解析处理器,流任务生成处理器,规则入库处理器,每个处理器包含业务处理方法和回滚方法; 2、 一个处理器业务代码执行完成后主动调用下一个处理器业务方法; 3、 一个处理器业务代码执行失败主动调用本处理器回滚方法,本处理器回滚完成后主动调用上一个处理器回滚方法。 代码如下 1、 抽象处理器 package com.coshaho.learn.handler; /** * * AbstractRuleHandler.java Create on 2017年5月5日 下午11:20:15 * * 类功能说明: 告警规则责任链处理节点抽象类 * * Copyright: Copyright(c) 2013 * Company: COSHAHO * @Version 1.0 * @Author coshaho */ public abstract class AbstractRuleHandler { // 上一个处理器 private AbstractRuleHandler preHandler; // 下一个处理器 private AbstractRuleHandler nextHandler; /** * 业务执行 * * @author coshaho * @param rule */ public void doHandle(AlarmRule rule) { try { doHandleReal(rule); } catch(Exception e) { // 业务代码执行失败主动回滚 rollBack(rule); return; } // 业务代码执行成功主动调用下一个处理器处理 if(null != nextHandler) { nextHandler.doHandle(rule); } } /** * 事务回滚 * * @author coshaho * @param rule */ public void rollBack(AlarmRule rule) { rollBackReal(rule); // 本处理器业务回滚完成,主动调用前一个处理器业务回滚 if(null != preHandler) { preHandler.rollBack(rule); } } /** * 每个处理器特有的业务处理方法 * * @author coshaho * @param rule * @throws Exception */ public abstract void doHandleReal(AlarmRule rule) throws Exception; /** * 每个处理器特有的业务回滚方法 * * @author coshaho * @param rule */ public abstract void rollBackReal(AlarmRule rule); private AbstractRuleHandler setPreHandler(AbstractRuleHandler preHandler) { this.preHandler = preHandler; return preHandler; } public AbstractRuleHandler setNextHandler(AbstractRuleHandler nextHandler) { this.nextHandler = nextHandler; nextHandler.setPreHandler(this); return nextHandler; } } 2、阈值解析处理器 package com.coshaho.learn.handler; import org.apache.commons.lang.StringUtils; /** * * ThresholdParseHandler.java Create on 2017年5月5日 下午11:41:20 * * 类功能说明: 阈值解析 * * Copyright: Copyright(c) 2013 * Company: COSHAHO * @Version 1.0 * @Author coshaho */ public class ThresholdParseHandler extends AbstractRuleHandler { @Override public void doHandleReal(AlarmRule rule) throws Exception { if(StringUtils.isEmpty(rule.getThreshold())) { throw new Exception("Threshold is empty."); } System.out.println("Parse threshold success. Threshold is " + rule.getThreshold()); } @Override public void rollBackReal(AlarmRule rule) { System.out.println("Roll parse threshold. Threshold is " + rule.getThreshold()); } } 3、流任务生成处理器 package com.coshaho.learn.handler; /** * * StreamGenerateHandler.java Create on 2017年5月5日 下午11:41:43 * * 类功能说明: 告警流规则生成 * * Copyright: Copyright(c) 2013 * Company: COSHAHO * @Version 1.0 * @Author coshaho */ public class StreamGenerateHandler extends AbstractRuleHandler { @Override public void doHandleReal(AlarmRule rule) throws Exception { System.out.println("Generate stream success."); } @Override public void rollBackReal(AlarmRule rule) { System.out.println("Roll Generate stream."); } } 4、规则入库处理器 package com.coshaho.learn.handler; import org.apache.commons.lang.StringUtils; /** * * RulePesistHandler.java Create on 2017年5月5日 下午11:41:08 * * 类功能说明: 告警规则持久化 * * Copyright: Copyright(c) 2013 * Company: COSHAHO * @Version 1.0 * @Author coshaho */ public class RulePesistHandler extends AbstractRuleHandler { @Override public void doHandleReal(AlarmRule rule) throws Exception { if(StringUtils.isEmpty(rule.getName())) { throw new Exception("Rule name is empty."); } System.out.println("Persist rule success. Rule name is " + rule.getName()); } @Override public void rollBackReal(AlarmRule rule) { System.out.println("Roll persist rule. Rule name is " + rule.getName()); } } 5、规则入库处理器 package com.coshaho.learn.handler; import org.apache.commons.lang.StringUtils; /** * * RulePesistHandler.java Create on 2017年5月5日 下午11:41:08 * * 类功能说明: 告警规则持久化 * * Copyright: Copyright(c) 2013 * Company: COSHAHO * @Version 1.0 * @Author coshaho */ public class RulePesistHandler extends AbstractRuleHandler { @Override public void doHandleReal(AlarmRule rule) throws Exception { if(StringUtils.isEmpty(rule.getName())) { throw new Exception("Rule name is empty."); } System.out.println("Persist rule success. Rule name is " + rule.getName()); } @Override public void rollBackReal(AlarmRule rule) { System.out.println("Roll persist rule. Rule name is " + rule.getName()); } } 6、告警规则 package com.coshaho.learn.handler; /** * * AlarmRule.java Create on 2017年5月5日 下午11:40:50 * * 类功能说明: 告警规则 * * Copyright: Copyright(c) 2013 * Company: COSHAHO * @Version 1.0 * @Author coshaho */ public class AlarmRule { private String name; private String type; private String threshold; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getThreshold() { return threshold; } public void setThreshold(String threshold) { this.threshold = threshold; } } 7、规则创建责任链 package com.coshaho.learn.handler; /** * * AlarmRuleCreator.java Create on 2017年5月5日 下午11:56:45 * * 类功能说明: 告警规则创建 * * Copyright: Copyright(c) 2013 * Company: COSHAHO * @Version 1.0 * @Author coshaho */ public class AlarmRuleCreator { private AbstractRuleHandler alarmRuleHandler; public AlarmRuleCreator() { alarmRuleHandler = new ThresholdParseHandler(); alarmRuleHandler.setNextHandler(new StreamGenerateHandler()) .setNextHandler(new RulePesistHandler()); } public void create(AlarmRule rule) { alarmRuleHandler.doHandle(rule); } public static void main(String[] args) { AlarmRule rule = new AlarmRule(); rule.setThreshold("cpuRate < 10"); rule.setName("Cpu Alarm"); AlarmRuleCreator ruleCreator = new AlarmRuleCreator(); ruleCreator.create(rule); System.out.println(); rule.setName(""); ruleCreator.create(rule); } } 测试结果 Parse threshold success. Threshold is cpuRate < 10 Generate stream success. Persist rule success. Rule name is Cpu Alarm Parse threshold success. Threshold is cpuRate < 10 Generate stream success. Roll persist rule. Rule name is Roll Generate stream. Roll parse threshold. Threshold is cpuRate < 10

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

区块链的原理与应用? -2

接着上一篇.上一篇还没有输出,其实加入了index在实体类中. package com.sha256.sha256.bean; import com.sha256.sha256.utils.SHA256Util; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; @Data @NoArgsConstructor @AllArgsConstructor public class Block { private long index; private String hash; // our signature private String previousHash; // the hash of previous block 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(long index,String data,String previousHash){ this.index = index; this.data = data; this.previousHash = previousHash; this.timeStamp = new Date().getTime(); this.hash = SHA256Util.calculateHash(this); //Making sure we do this after we set the other values. } } 测试类: package com.sha256.sha256.test; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.google.gson.GsonBuilder; import com.sha256.sha256.bean.Block; import com.sha256.sha256.utils.SHA256Util; import java.util.ArrayList; import java.util.Random; public class TestSHA256 { //声明一个区块链,用于添加Block实体 public static ArrayList<Block> blockChain = new ArrayList<>(); public static void main(String[] args) { //test1 测试三个被加密字符串 加密后的hash值的差别 /** * 虽然第三条信息仅仅多一个".",但加密后的数据hash相差极大 */ // String message0 = "我是要被加密的信息"; // String message1 = "我是要被加密的信息"; // String message2 = "我是要被加密的信息."; // String encryptionMessage0 = SHA256Util.applySha256(message0); // String encryptionMessage1 = SHA256Util.applySha256(message1); // String encryptionMessage2 = SHA256Util.applySha256(message2); // System.out.println(encryptionMessage0); // System.out.println(encryptionMessage1); // System.out.println(encryptionMessage2); // // //test2 创建区块链逻辑, 因为第一个块没有上一个块的hash头部值,所以输入0 作为前一个块的previous hash // /** // * 由于在{@link SHA256Util#calculateHash(Block)} // * 中对同时产生的new Date().getTime() (timestamp) // * 也加入进行了hash加密,所以固有的message (data)及 // * previoushash之和进行了加密. // */ // Block genesisBlock = new Block(0,"这是第一个区块中的要被加密的信息和交易信息","0"); // String hash1 = genesisBlock.getHash(); // System.out.println("Hash for block 1 : "+hash1); // // Block secondBlock = new Block(1,"这是第二个区块,以及其中信息!!!它的前区块头部hash我们拿上一个的来使用",hash1); // String hash2 = secondBlock.getHash(); // // System.out.println("Hash for block 2 : "+hash2); // // Block thirdBlock = new Block(2,"这是第三个区块,它的hash应该已经被前两个的信息纳入进来了,它的hash如果对不上,那么说明前面的信息被改动过了",hash2); // String hash3 = thirdBlock.getHash(); // System.out.println("Hash for block 3 : "+hash3); // //// test3 add our blocks to the blockchain ArrayList : // blockChain.add(new Block(0,"区块链上第一小节","0")); // blockChain.add(new Block(1,"区块链第二小节",blockChain.get(blockChain.size()-1).getHash())); // blockChain.add(new Block(2,"区块链第三小节",blockChain.get(blockChain.size()-1).getHash())); int chainNumber = 24; int index = 0; while (chainNumber > 0) { System.out.println("blockChain.size():" + blockChain.size()); if (blockChain.size() == 0) { blockChain.add(new Block(0, "创世块", "0")); } index++; blockChain.add(new Block(index, "区块内容" + blockChainMessage(index), blockChain.get(blockChain.size() - 1).getHash())); chainNumber--; } // JSONArray blockChainJson1 = (JSONArray)JSONArray.toJSON(blockChain); //JSONArray是不排版的 // System.out.println(blockChainJson1); String blockChainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockChain); System.out.println(blockChainJson); } //模拟一些交易信息 private static String blockChainMessage(int getNumber) { Random random = new Random(getNumber); long l = random.nextLong(); System.out.println("blockChainMessage:" + l); return String.valueOf(l); } }

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

Java学习:反射的应用,依赖加载

使用反射实现从配置文件加载类以及根据配置文件解决特定依赖关系。 配置文件reflect.properties: 1AdminDao=reflect.AdminDao 1GuestDao=reflect.GuestDao 1Manager=reflect.Manager 2Manager:AdminDao 2Manager:GuestDao 对应类文件AdminDao: package reflect; public class AdminDao { public AdminDao(){ System.out.println("成功实例化AdminDao"); } } 对应类文件GuestDao: package reflect; public class GuestDao { public GuestDao(){ System.out.println("成功实例化GuestDao"); } } 对应类文件Manager: package reflect; public class Manager { private AdminDao adminDao = null; private GuestDao guestDao = null; public Manager() { System.out.println("Manage实例化成功"); } public void setAdminDao (Object o) { this.adminDao = (AdminDao)o; System.out.println("解决adminDao依赖"); } public void setGuestDao (Object o) { this.guestDao = (GuestDao)o; System.out.println("解决guestDao依赖"); } } 反射测试工厂类: package reflect; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import java.util.Set; public class ObjectFactory { public static Map<String,Object> map = new HashMap<String,Object>(); static { BufferedReader br = null; try { br = new BufferedReader(new FileReader("src/reflect.properties")); String str = br.readLine(); while(str != null) { char c = str.charAt(0); switch (c) { case '1': String[] arr = str.substring(1).split("="); Object o = Class.forName(arr[1]).newInstance(); map.put(arr[0].trim().toLowerCase(), o); break; case '2': String[] arr2 = str.substring(1).split(":"); Object obj = map.get(arr2[0].trim().toLowerCase()); Object fieldObj = map.get(arr2[1].trim().toLowerCase()); String methodName = "set"+arr2[1].substring(0, 1).toUpperCase()+arr2[1].substring(1); Method method = obj.getClass().getDeclaredMethod(methodName, Object.class); method.invoke(obj, fieldObj); break; } str = br.readLine(); } } catch (Exception e) { e.printStackTrace(); } finally { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { Set<String> set = map.keySet(); for (String string:set) { System.out.println(string+"--"+map.get(string)); } } } 跑起来结果: 成功实例化AdminDao 成功实例化GuestDao Manage实例化成功 解决adminDao依赖 解决guestDao依赖 admindao--reflect.AdminDao@10d1f30 manager--reflect.Manager@7aacc1 guestdao--reflect.GuestDao@1e3cabd

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

单页应用部署时缓存策略

问题描述 前端网站采用Vue + Nginx的方式进行生产环境部署。 系统在发布更新次日,收到客户的投诉,发现登录系统之后,出现页面空白问题,刷新几次后显示正常。查看日志发现: 2019/01/07 10:26:01 [error] 19#0: *833 open() "/.../static/js/0.4a66cb25e7f24262c3f6.js" failed (2: No such file or directory), client: XX.XX.XX.XX, server: localhost, request: "GET /static/js/0.4a66cb25e7f24262c3f6.js HTTP/1.1" 问题分析 由于vue在build之后,会重新生成index.html + static资源。从日志判断,【/static/js/0.4a66cb25e7f24262c3f6.js】是上一版本的静态资源。而index.html中get请求获取,跟浏览器缓存有关。 但是查看nginx配置,发现没有配置缓存策略。 server { listen 80 default_server; server_name localhost; root /www/; index index.html index.htm; location / { try_files $uri $uri/ index.html; } } 当http头中无缓存配置,那么将使用浏览器默认缓存策略,如下: 先放上结论吧,Chrome和Firefox对js、css之类的文件,在内存中的缓存时长,是: (访问时间 - 该文件的最后修改时间) ÷ 10 假设文件 a.js 最后编辑时间是 2018年12月1号 10点0分0秒; Chrome的第一次访问时间是 2018年12月1号 12点0分0秒; 第一次访问与文件编辑时间相差2小时,即7200秒,那么缓存时长就是720秒 解决方案 http请求头中,通过cache-control声明缓存策略。 对于index.html采用no-cache策略,客户端使用缓存,但是使用前需要与服务器确认版本状态。 对于static资源,采用客户端缓存。 nginx配置参考: location /index.html { add_header "Cache-Control" "no-cache"; } location /static/ { access_log none; expires 14d; } location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8081; client_max_body_size 500m; } location = / { } 参考资料 https://blog.csdn.net/youbl/article/details/84879670 https://www.cnblogs.com/feng9exe/p/8083237.html

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册