首页 文章 精选 留言 我的

精选列表

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

008 以太坊Dapp编译安装部署工具Remix

Remix IDE是Solidity DApp开发人员的IDE ,Remix地址: https://remix.ethereum.org/ 1、前提条件 要使用Remix IDE,需要连接到以太坊节点。 可以使用Mist、MetaMask,或连接到您的本地以太坊节点(geth或eth)。 注意:连接到geth不能通过https工作。 2、Mist钱包安装 http://blog.csdn.net/zxs9999/article/details/79052728 3、MetaMask钱包安装 http://blog.csdn.net/zxs9999/article/details/79052801 4、安装部署合约 4.1、在Remix IDE浏览器中输入以下合约代码。 pragma solidity ^0.4.18; contract SimpleStorage { uint storedData; function set(uint x) public { storedData = x; } function get() public view returns (uint) { return storedData; } } 4.2 、点击Compile,点击Start to compile开始编译,编译成功后会出现SimpleStorage合约。 4.3 、点击Run,通过Environment中的JavaScript VM,选择Account中任意一个本地账户, 最后点击Create将合约部署到本地私有链上。 4.4、在set中输入设置的值并点击set按钮。 4.5、点击get按钮,显示之前通过set设置的值,并查看Account账户中以太币的变化(部署合约和执行set都会使用以太币)

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

BinderPool — Andorid端的“服务发现治理工具

导语 最近在学习微服务相关知识,突然想到:微服务的思想虽然是在server端的场景下提出来的,但是无论是server,还是移动端,思想是相通的,移动端也会有多服务的场景,就同样面临多服务需要整合治理的问题。 1. 背景 随着公司业务的发展,项目规模会越来越大,可能会遇到多多服务IPC的场景,有很多模块,而每一个模块都需要和服务端通讯,那么我们也要为每一个模块创建特定的AIDL文件,那么服务端service也会产生很多个。作为四大组件之一,过多使用也会造成性能资源消耗。所以我们可以设计只有一个Service,对于不同可客户端我们只是去返回一个不同的Binder即可,这样就避免了创建了大量的Service。 2. AIDL 模拟Binder连接池, 使用两个简单的AIDL接口与实现, 一个是加解密, 一个是加法。 package com.mantoudev.binderpooldemo; interface ISecurityCenter { String encrypt(String content); String decrypt(String pwd); } 加密和解密的实现, 这里使用简单的异或运算处理。 public class SecurityCenterImpl extends ISecurityCenter.Stub { private static final char CODE_SECRET = 'z'; @Override public String encrypt(String content) throws RemoteException { char[] chars = content.toCharArray(); for (int i = 0; i < chars.length; i++) { chars[i] ^= CODE_SECRET; } return new String(chars); } @Override public String decrypt(String password) throws RemoteException { return encrypt(password); } } 求和的AIDL接口: package com.mantoudev.binderpooldemo; interface ICompute { int add(int a, int b); } 求和的实现: public class ComputeImpl extends ICompute.Stub { @Override public int add(int a, int b) throws RemoteException { return a + b; } } Binder连接池通过ID查找Bidner, 查询并返回匹配的Binder: package com.mantoudev.binderpooldemo; interface IBinderPool { IBinder queryBinder(int binderCode); } 3. Binder 连接池 Service服务通过Binder连接池动态选择Binder请求: private Binder mBinderPool = new BinderPool.BinderPoolImpl(); @Override public IBinder onBind(Intent intent) { Log.e(TAG, "onBind"); return mBinderPool; } Binder连接池的具体实现, 创建BinderPool单例, 连接服务: private BinderPool(Context context) { mContext = context.getApplicationContext(); connectBinderPoolService(); // 连接服务 } public static BinderPool getInstance(Context context) { if (sInstance == null) { synchronized (BinderPool.class) { if (sInstance == null) { sInstance = new BinderPool(context); } } } return sInstance; } 绑定服务, 通过CountDownLatch类, 把异步操作转换为同步操作, 防止绑定冲突,对通过CountDownLatch类不了解的请自行百度: private synchronized void connectBinderPoolService() { mCountDownLatch = new CountDownLatch(1); // 只保持一个绑定服务 Intent service = new Intent(mContext, BinderPoolService.class); mContext.bindService(service, mBinderPoolConnection, Context.BIND_AUTO_CREATE); try { mCountDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } } 通过DeathRecipient处理Binder连接池死亡重联机制: 很多人喜欢在servierConnection的onServiceDisconnected()回调中做重连处理,这里我简单介绍下DeathRecipient DeathRecipient Binder有可以让对端的进程得到意外退出通知的机制:Link-To-Death。我这里以我们这里Service被通知Client意外退出的情况为例,实现的方法如下: Client传递一个Binder对象给Service,此Binder对象与Client的进程关联; 在Sevice中接受到这个Binder对象,并且使用binder.linkToDeath(),注册一个DeathRecipient回调; 实现DeathRecipient。当Client意外退出的时候,DeathRecipient.binderDied()将被回调,我们可以在这里释放相关的资源。 // 失效重联机制, 当Binder死亡时, 重新连接 private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() { @Override public void binderDied() { Log.e(TAG, "binderDied@DeathRecipient()"); mBinderPool.asBinder().unlinkToDeath(mDeathRecipient, 0); mBinderPool = null; connectBinderPoolService(); } }; // Binder的服务连接 private ServiceConnection mBinderPoolConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.e(TAG, "onServiceConnected@ServiceConnection()"); mBinderPool = IBinderPool.Stub.asInterface(service); try { mBinderPool.asBinder().linkToDeath(mDeathRecipient, 0); } catch (RemoteException e) { e.printStackTrace(); } mCountDownLatch.countDown(); } @Override public void onServiceDisconnected(ComponentName name) { Log.e(TAG, "onServiceDisconnected@ServiceConnection()"); } }; 通过ID连接不同的Binder请求. public IBinder queryBinder(int binderCode) { Log.e(TAG, "queryBinder---BinderCode:" + binderCode ); IBinder binder = null; try { if (mBinderPool != null) { binder = mBinderPool.queryBinder(binderCode); } } catch (RemoteException e) { e.printStackTrace(); } return binder; } Binder连接池AIDL的具体实现, 通过ID选择Binder. public static class BinderPoolImpl extends IBinderPool.Stub { public BinderPoolImpl() { super(); } @Override public IBinder queryBinder(int binderCode) throws RemoteException { IBinder binder = null; switch (binderCode) { case BINDER_COMPUTE: binder = new ComputeImpl(); break; case BINDER_SECURITY_CENTER: binder = new SecurityCenterImpl(); break; default: break; } return binder; } } 1.4 Binder客户端 我们在子线程进行耗时操作: //测试 private void doTest(){ new Thread(new Runnable() { @Override public void run(){ encryptTest(); } }).start(); } private void encryptTest() { BinderPool binderPool = BinderPool.getInstance(getApplicationContext()); IBinder securityBinder = binderPool.queryBinder(BinderPool.BINDER_SECURITY_CENTER); mISecurityCenter = SecurityCenterImpl.asInterface(securityBinder); String msg = "BinderPool Test Msg!~~~"; try { String encryptMsg = mISecurityCenter.encrypt(msg); Log.e(TAG, "加密了: " + encryptMsg); String decryptMsg = mISecurityCenter.decrypt(encryptMsg); Log.e(TAG, "解密了: " + decryptMsg); Message hm = new Message(); hm.what = 0; hm.obj = encryptMsg + "\n" + decryptMsg; mHandler.sendMessage(hm); } catch (RemoteException e) { e.printStackTrace(); } } 1.5 总结 使用BinderPool我们就只需要建立一个Service就足够了。当我们添加一个AIDL接口的时候只需要在BinderPool中添加一个id,然后根据这个id,在BinderPoolImpl中创建一个对应的Binder对象即可。这样就很大程度上简化了我们的工作,同时也节省了系统资源开销,要知道,在移动端,资源、性能的要求要做到更高。

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

ELK套件之 X-pack 工具的安装

服务器信息: CentOS6.7 x86_64 IP地址:10.0.20.25 ELK版本: elasticsearch-5.6.0.rpm kibana-5.6.0-x86_64.rpm logstash-5.6.0.rpm x-pack版本: x-pack-5.6.0.zip先提前下载好zip安装包丢到/root目录下,这样离线安装起来比较快。 ELK单节点的搭建步骤省略,可以参考http://lee90.blog.51cto.com/10414478/1968035。下面直接开始x-pack的安装。 elasticsearch安装x-pack cd /usr/share/elasticsearch/ bin/elasticsearch-plugin installfile:///root/x-pack-5.6.0.zip /etc/init.d/elasticsearch restart kibana安装x-pack cd /usr/share/kibana/ bin/kibana-plugin install file:///root/x-pack-5.6.1.zip /etc/init.d/kibana restart logstash安装x-pack cd /usr/share/logstash/ bin/logstash-plugin install file:///root/x-pack-5.6.1.zip /etc/init.d/logstas hrestart x-pack的配置 在浏览器打开http://10.0.20.25:5601自动跳转到登录页面(用户名elastic密码changeme) 我们开启了xpack后,默认情况下访问集群需要密码了。 这会导致packetbeat等上送数据失败,提示401报错。因此需要配置下。 以packetbeat为例,其他的我暂时用不到没有去试验。 vim /etc/packetbeat/packetbeat.yml加上ES的用户名和密码 packetbeat.interfaces.device:any packetbeat.protocols.mysql: ports: [3306] send_request: true transaction_timeout: 30s output.elasticsearch: hosts: ["10.0.20.25:9200"] username:"elastic" password:"changeme" work: 1 bulk_max_size: 50 timeout: 90 flush_interval: 1s template.enabled: true template.name:"packetbeat.template" template.overwrite: true index: test-mysql-%{+yyyy.MM.dd} 然后重启下packetbeat即可正常的抓取数据存到ES集群里面。 (官网文档地址:https://www.elastic.co/guide/en/beats/packetbeat/current/elasticsearch-output.html) 更详细的用法可以参考文章:http://blog.csdn.net/pistolove/article/details/53838138 本文转自 lirulei90 51CTO博客,原文链接:http://blog.51cto.com/lee90/1968085,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

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

用户登录
用户注册