Cocos2d-X定时任务实现参数传递

通常Cocos2d-X实现定时任务通过

void Node::schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay);
void Node::scheduleOnce(SEL_SCHEDULE selector, float delay);

这两种方式,都是传递 SEL_SCHEDULE 类型的方法指针,查看SEL_SCHEDULE定义可以发现定义如下:

typedef void (Ref::*SEL_SCHEDULE)(float);

这个定义只传递一个 float 参数,如果需要传递参数怎么办呢,其实可以通过如下方式:
getScheduler()->schedule(CC_CALLBACK_1(AAA::run, this, 参数1, 参数2), this, 0.0f, 0, 2.0f, false, “定时器名称”);

void Scheduler::schedule(const ccSchedulerFunc& callback, void *target, float interval, unsigned int repeat, float delay, bool paused, const std::string& key)

定时任务的Node一定要加入到 场景中才会执行哦。!

C语言的bit位控制工具FvMask

实际中经常通过bit的 0 或者 1 来控制系统状态,可能就需要个专门用来控制bit的工具类,下面就分享个。

例如:
m_dwRuleIndex = 0;
FvMask::Add(m_dwRuleIndex, _MASK_(1)); //第一个bit位置改为1
FvMask::Del(m_dwRuleIndex, _MASK_(1)); //第一个bit位置改为0
FvMask::HasAny(m_dwRuleIndex, _MASK_(1)); //判断第一个bit位置是否为1

#pragma once

namespace FvMask
{
	template<typename TFlag, typename TMask>
	bool HasAny(const TFlag flag, const TMask mask)
	{
		return ((flag&mask) != 0);
	}
	template<typename TFlag, typename TMask>
	bool HasAll(const TFlag flag, const TMask mask)
	{
		return ((flag&mask) == mask);
	}

	template<typename TFlag, typename TMask>
	void Add(TFlag& flag, const TMask mask)
	{
		flag |= mask;
	}

	template<typename TFlag, typename TMask>
	void Del(TFlag& flag, const TMask mask)
	{
		flag &= ~ mask;
	}

	template<typename TFlag, typename TMask>
	TFlag Remove(const TFlag flag, const TMask mask)
	{
		return (flag & (~ mask));
	}

	template<typename TFlag, typename TMask>
	TFlag IsAdd(const TFlag oldFlag, const TFlag newFlag, const TMask mask)
	{
		return (((oldFlag&mask) == 0) && ((newFlag&mask) != 0));
	}
	template<typename TFlag, typename TMask>
	TFlag IsDel(const TFlag oldFlag, const TFlag newFlag, const TMask mask)
	{
		return (((oldFlag&mask) != 0) && ((newFlag&mask) == 0));
	}
}
#ifndef _MASK_
#define _MASK_(flag) (0X01 << (flag))
#endif

根据两点的经纬度计算距离C

通过地球上的两点经纬度计算物理距离,单位是米

double rad(double d)
{
   return d * M_PI / 180.0;
}
/**
 * 获取距离
 * @param lon1
 * @param lat1
 * @param lon2
 * @param lat2
 * @return
 */
double distance(double lon1,double lat1,double lon2, double lat2)
{
   double radLat1 = rad(lat1);
   double radLat2 = rad(lat2);
   double a = radLat1 - radLat2;
   double b = rad(lon1) - rad(lon2);
   double s = 2 * asin(sqrt(pow(sin(a/2),2)+cos(radLat1)*cos(radLat2)*pow(sin(b/2),2)));
   s = s * 6378137;   
   return s;
}

C语言十六进制字符串与字节数组相互转换

直接上代码片段

/**
 * 字节数组转字符串
 * @param source
 *  字符数组
 * @param length
 *  字符数组长度
 * @param target
 *  字符串
 */
void uint8_2_hex(unsigned char *source, unsigned int length, unsigned char *target) {
    unsigned char ddl, ddh;
    for (int i = 0; i < length; i++) {
        ddh = static_cast<unsigned char>(48 + source[i] / 16);
        ddl = static_cast<unsigned char>(48 + source[i] % 16);
        if (ddh > 57) ddh = static_cast<unsigned char>(ddh + (97 - 58));
        if (ddl > 57) ddl = static_cast<unsigned char>(ddl + (97 - 58));
        target[i * 2] = ddh;
        target[i * 2 + 1] = ddl;
    }
}

/**
 * 字符串转字节数组
 * @param source
 *  字符串
 * @param length
 *  字符串长度
 * @param target
 *  字节数组
 * @param n
 *  转换后长度
 */
void hex_2_uint8(const unsigned char *source, size_t length, unsigned char *target, size_t &n) {
    n = 0;
    for (int i = 0; i < length; i += 2) {
        if (source[i] >= 'a' && source[i] <= 'f') {
            target[n] = static_cast<unsigned char>(source[i] - 'a' + 10);
        } else if (source[i] >= 'A' && source[i] <= 'F') {
            target[n] = static_cast<unsigned char>(source[i] - 'A' + 10);
        } else {
            target[n] = static_cast<unsigned char>(source[i] - '0');
        }
        if (source[i + 1] >= 'a' && source[i + 1] <= 'f') {
            target[n] = static_cast<unsigned char>((target[n] << 4) | (source[i + 1] - 'a' + 10));
        } else if (source[i + 1] >= 'A' && source[i + 1] <= 'F') {
            target[n] = static_cast<unsigned char>((target[n] << 4) | (source[i + 1] - 'A' + 10));
        } else {
            target[n] = (target[n] << 4) | (source[i + 1] - '0');
        }
        ++n;
    }
}

区块链相关的一些开源库

加密算法库:https://github.com/trezor/trezor-crypto

区块链相关的各种加密、编码算法库

以太坊IOS开发库:https://github.com/ethers-io/ethers.objc

使用Object-C编写的以太坊开发库

以太坊钱包:https://github.com/ethers-io/EthersWallet-ios

使用ethers-io框架开发的IOS以太坊钱包

椭圆曲线加密:https://github.com/bitcoin-core/secp256k1

比特币椭圆曲线加密库

SECP256K1库IOS版:https://github.com/beyonderyue/ios-secp256k1

SECP256K1编译为IOS库

以太坊JAVA版:https://github.com/ether-camp/ethereum-harmony

基于ethereumJ实现

WordPress环境 云服务器CentOS 装机全过程

0x00、首先你要有台云服务器,并在控制台安装CentOS7.4-64位

0x01、使用SSH Shell链接服务IP

常用SSH Shell 工具有 windows: XShell、Secure Shell等等

Linux系统下可以直接使用终端 iTerm

0x02、修改SSH登录端口

一、修改sshd_confg配置文件

找到文件中的 Port 22 ,把前面的#注释去掉,改成自己想要的端口!

二、开放端口防火墙

1、执行:iptables -I INPUT -p tcp -m state –state NEW -m tcp –dport 端口号 -j ACCEPT

2、执行:iptables-save

3、执行:iptables -nL –line-number 可以查看端口开放情况

4、执行:systemctl restart sshd.service 重启SSH服务

0x03、安装LNMP

整个安装过程需要几十分钟

1、执行:wget http://soft.vpser.net/lnmp/lnmp1.5.tar.gz -cO lnmp1.5.tar.gz && tar zxf lnmp1.5.tar.gz && cd lnmp1.5 && ./install.sh lnmp

选择MariaDB 10.2.14、Install PHP 7.2.6、 Don’t install Memory Allocator

0x04、安装GIT(可选)

由于网站代码托管在GIT上,所以通过GIT来更新网站。

注意:nginx等网站服务器一直要禁止.git目录的访问
在server{}段内增加

location ~ /\.
{
deny all;
}

0x05、上传网站代码

如果使用git,直接通过git clone https://github.com/xxxx.git 获取代码

0x06、nginx配置vhost与SSL

配置wordpress (用于解决固定链接问题),进入cd /usr/local/nginx/conf 创建 wordpress.conf 内容为:


cd /usr/local/nginx/conf/vhost 创建 abc.com.conf 和 abc.com.ssl.conf 配置域名服务和SSL

内容为(abc.com.conf)

server
    {
        listen 80;
        server_name abc.com;
        return 301 https://$server_name$request_uri;
    }

(abc.com.ssl.conf)

server
    {
        listen 443 ssl;
        server_name abc.com;
        ssl_certificate     /opt/abc.com/Nginx/1_abc.com_bundle.crt;
        ssl_certificate_key /opt/abc.comNginx/2_abc.com.key;
        index index.html index.htm index.php;
        root  /website/abc.com/;
        error_page   404   /404.html;
        include enable-php.conf;
        include wordpress.conf;
        location /nginx_status
        {
            stub_status on;
            access_log   off;
        }

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }
        location ~ /\
        {
            deny  all;
        }
        access_log  /website/wwwlogs/abc.com.log;
    }

ssl_certificate和ssl_certificate_key为证书路径

0x07、修改php.ini配置

打开vim /usr/local/php/etc/php.ini
找到disable_functions 把 scandir 删除.
重启/etc/init.d/php-fpm restart

0x08、修改网站目录Owner和权限

改成www用户\组(千万别搞错目录)

chown www:www -R 网站目录
chmod -R 755 wp-content/

0x09、创建网站数据库用户