gitweixin
  • 首页
  • 小程序代码
    • 资讯读书
    • 工具类
    • O2O
    • 地图定位
    • 社交
    • 行业软件
    • 电商类
    • 互联网类
    • 企业类
    • UI控件
  • 大数据开发
    • Hadoop
    • Spark
    • Hbase
    • Elasticsearch
    • Kafka
    • Flink
    • 数据仓库
    • 数据挖掘
    • flume
    • Kafka
    • Hive
    • shardingsphere
    • solr
  • 开发博客
    • Android
    • php
    • python
    • 运维
    • 技术架构
    • 数据库
  • 程序员网赚
  • bug清单
  • 量化投资
  • 在线查询工具
    • 去行号
    • 在线时间戳转换工具
    • 免费图片批量修改尺寸在线工具
    • SVG转JPG在线工具

Java远程访问工具类

精品微信小程序开发门户,代码全部亲测可用

  • 首页   /  
  • 作者: east
  • ( 页面57 )
Java 5月 13,2021

Java远程访问工具类

我们都知道,xshell、xftp等是远程访问的利器,但在实际工作中,有时要用java代码实现上面这2个工具的基础功能,远程访问和下载等等:

public class RemoteShellUtil {

    private final static Logger LOGGER = LoggerFactory.getLogger(RemoteShellUtil.class);

    private JSch jsch;

    private Session session = null;

    private String user = null;

    private String password = null;

    private String host = null;

    public void setUser(String user) {
        this.user = user;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public void exec(String command) {
        if (this.session == null || !this.session.isConnected()) {
            if (!this.Connect(this.user, this.password, this.host)) {
                LOGGER.error("connect failed");
                return;
            }
        }

        BufferedReader reader = null;
        Channel channel = null;

        try {
            channel = this.session.openChannel("exec");
            ((ChannelExec) channel).setCommand(command);
            channel.setInputStream(null);
            ((ChannelExec) channel).setErrStream(System.err);
            channel.setInputStream(null);
            int exitStatus = channel.getExitStatus();
            channel.connect();
            InputStream in = channel.getInputStream();
            reader = new BufferedReader(new InputStreamReader(in));
            String buf;

            while ((buf = reader.readLine()) != null) {
                LOGGER.info(buf);
            }
        } catch (JSchException | IOException e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
        } finally {
            try {
                if (null != reader) reader.close();
                if (null != channel) channel.disconnect();
                this.session.disconnect();
            } catch (IOException e) {
                LOGGER.error(Throwables.getStackTraceAsString(e));
            }

        }

    }

    public Boolean download(String serverPath, String localpath) {
        if (!checkConnect()) return false;

        ChannelSftp channel = null;

        boolean status = false;
        try {
            channel = (ChannelSftp) this.session.openChannel("sftp");
            channel.connect();
            FileOutputStream out = new FileOutputStream(new File(localpath));
            BufferedOutputStream writer = new BufferedOutputStream(out);
            SftpProgressMonitor var10000 = new SftpProgressMonitor() {
                private long current = 0L;

                @Override
                public void init(int i, String s, String s1, long l) {
                }

                public boolean count(long arg0) {
                    this.current += arg0;
                    return true;
                }

                @Override
                public void end() {
                }
            };
            channel.get(serverPath, writer);
            writer.close();
            status = true;
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
        } finally {
            if (null != channel) channel.disconnect();
            this.session.disconnect();
        }

        return status;
    }

    public Boolean upload(String serverPath, String localpath) {
        if (!checkConnect()) return false;

        ChannelSftp channel = null;

        boolean status = false;
        try {
            channel = (ChannelSftp) this.session.openChannel("sftp");
            channel.connect();
            FileInputStream in = new FileInputStream(new File(localpath));
            BufferedInputStream reader = new BufferedInputStream(in);
            SftpProgressMonitor var10000 = new SftpProgressMonitor() {
                private long current = 0L;

                public boolean count(long arg0) {
                    this.current += arg0;
                    return true;
                }

                public void end() {
                }

                public void init(int arg0, String arg1, String arg2, long arg3) {
                }
            };
            channel.put(reader, serverPath);
            reader.close();
            status = true;
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
        } finally {
            if (null != channel) channel.disconnect();
            this.session.disconnect();
        }

        return status;
    }

    private Boolean Connect(String user, String password, String host) {
        try {
            if (null == this.jsch) this.jsch = new JSch();
            this.session = this.jsch.getSession(user, host, 22);
            this.session.setPassword(password);
            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");
            this.session.setConfig(config);
            this.session.connect();
            return true;
        } catch (Exception e) {
            LOGGER.error("connect failed, reason{}", Throwables.getStackTraceAsString(e));
            return false;
        }
    }

    private Boolean checkConnect() {
        if (this.session == null || !this.session.isConnected()) {
            return this.Connect(this.user, this.password, this.host);
        }
        return true;
    }
}
作者 east
neo4j 5月 11,2021

Neo4j批量插入Java API实例

@Component
public class DatabaseBatchSaveUtil {

    private final static Logger LOGGER = LoggerFactory.getLogger(DatabaseBatchSaveUtil.class);

    private final static String NEO4j_GET_CURRENT_TIME_FUNCTION = "apoc.date.format(timestamp(),\\\"ms\\\",\\\"yyyy-MM-dd HH:mm:ss\\\",\\\"CTT\\\")";

    public static void batchSaveNodeFromDatabase(String jdbcConnectString, String sql, BaseNode baseNode, Map<String, String> columnMap) {
        try {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("call apoc.periodic.iterate('call apoc.load.jdbc(\\\"").append(jdbcConnectString).append("\\\",\\\"").append(sql).append("\\\")', '");
            stringBuilder.append("merge (a:").append(baseNode.typeGetter()).append("{").append(baseNode.uniqueFieldNameGetter()).append(":").append("row.").append(columnMap.get(baseNode.uniqueFieldNameGetter()));
            if (baseNode instanceof CarNode) {
                stringBuilder.append(",vehicleCodeType:row.vehicleCodeTypeStr");
            }
            stringBuilder.append("}) ").append("set ");
            columnMap.forEach((neo4jColumn, dbColumn) -> stringBuilder.append("a.").append(neo4jColumn).append(" = row.").append(dbColumn).append(","));
            if (columnMap.containsKey("updateTime"))
                stringBuilder.deleteCharAt(stringBuilder.length() - 1);
            else stringBuilder.append("a.updateTime = ").append(NEO4j_GET_CURRENT_TIME_FUNCTION);
            stringBuilder.append("' ").append(",{batchSize:1000,iterateList:true})");

            LocalDateTime startTime = LocalDateTime.now();
            CyberQueryExecuteUtil.executeBatchUpdateQuery(stringBuilder.toString());

            LOGGER.info("Save node: {} from database {}, cost {} second", baseNode.typeGetter(), jdbcConnectString, Duration.between(startTime, LocalDateTime.now()).getSeconds());

            Thread.sleep(20000);
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
        }
    }

    public static void batchSaveRelationFromDatabase(String jdbcConnectString, String sql, BaseRelation baseRelation, Map<String, String> columnMap) {
        try {
            BaseNode startNode = baseRelation.getStartNode();
            BaseNode endNod = baseRelation.getEndNode();

            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("call apoc.periodic.iterate('call apoc.load.jdbc(\\\"").append(jdbcConnectString).append("\\\",\\\"").append(sql).append("\\\")', '");

            stringBuilder.append("merge (n:").append(startNode.typeGetter()).append("{").append(startNode.uniqueFieldNameGetter()).append(":").append("row.").append(columnMap.get("startNode"));
            if (startNode instanceof CarNode) {
                stringBuilder.append(",vehicleCodeType:row.vehicleCodeTypeStr");
            }
            stringBuilder.append("}) with * ");

            stringBuilder.append("merge (m:").append(endNod.typeGetter()).append("{").append(endNod.uniqueFieldNameGetter()).append(":").append("row.").append(columnMap.get("endNode"));
            if (endNod instanceof CarNode) {
                stringBuilder.append(",vehicleCodeType:row.vehicleCodeTypeStr2");
            }
            stringBuilder.append("}) with * ");

            stringBuilder.append("merge (n)-[r:").append(baseRelation.getType());
            if (columnMap.containsKey("startTime") || columnMap.containsKey("endTime")) {
                stringBuilder.append("{");
                if (columnMap.containsKey("startTime"))
                    stringBuilder.append("startTime:row.").append(columnMap.get("startTime")).append(",");

                if (columnMap.containsKey("endTime"))
                    stringBuilder.append("endTime:row.").append(columnMap.get("endTime"));
                else stringBuilder.deleteCharAt(stringBuilder.length() - 1);

                stringBuilder.append("}");
            }
            stringBuilder.append("]-(m)");

            columnMap.remove("startNode");
            columnMap.remove("endNode");

            if (!columnMap.isEmpty()) {
                stringBuilder.append(" set  ");
                columnMap.forEach((neo4jColumn, dbColumn) -> stringBuilder.append("r.").append(neo4jColumn).append(" = row.").append(dbColumn).append(","));
                if (columnMap.containsKey("updateTime"))
                    stringBuilder.deleteCharAt(stringBuilder.length() - 1);
                else stringBuilder.append("r.updateTime = ").append(NEO4j_GET_CURRENT_TIME_FUNCTION);
            }

            stringBuilder.append("' ").append(",{batchSize:1000,iterateList:true})");

            LocalDateTime startTime = LocalDateTime.now();
            CyberQueryExecuteUtil.executeBatchUpdateQuery(stringBuilder.toString());

            LOGGER.info("Save relation: {} from database {}, cost {} second", baseRelation.getType(), jdbcConnectString, Duration.between(startTime, LocalDateTime.now()).getSeconds());

            Thread.sleep(20000);
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
        }
    }
}
作者 east
neo4j 5月 9,2021

Neo4j增删改查Java API实例

@Component
public class QueryDao {
    private static final Logger LOGGER = LoggerFactory.getLogger(StatisticDao.class);

    public List<BaseNode> queryNodeByPage(BaseNode baseNode, LocalDateTime lastTime, long pageNum, int pageSize) {
        long skip = pageNum * pageSize;
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("MATCH (n:").append(baseNode.typeGetter());
        if (StringUtils.hasText(baseNode.uniqueValueGetter()))
            stringBuilder.append("{").append(baseNode.uniqueFieldNameGetter()).append(": '").append(baseNode.uniqueValueGetter()).append("'}");
        stringBuilder.append(") ");
        if (null != lastTime)
            stringBuilder.append("WHERE n.updateTime is null OR n.updateTime <= '").append(lastTime.format(Constant.NORMAL_TIME_FORMATTER)).append("' ");
        stringBuilder.append("RETURN n SKIP ").append(skip).append(" LIMIT ").append(pageSize);
        return Lists.newArrayList(CyberQueryExecuteUtil.executeEntityQuery(stringBuilder.toString(), BaseNode.class));
    }

    public List<BaseNode> queryNodeByUniqueValue(BaseNode entity) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("MATCH (n:").append(entity.typeGetter()).append("{").append(entity.uniqueFieldNameGetter()).append(": '");
        if (entity instanceof CarNode) {
            String[] carArray = entity.uniqueValueGetter().split(Constant.carNoTypeSplit);
            stringBuilder.append(carArray[0]).append("'");
            if (1 < carArray.length) {
                stringBuilder.append(",vehicleCodeType:'");
                if (2 > carArray[1].length()) stringBuilder.append("0");
                stringBuilder.append(carArray[1]).append("'");
            }
        } else stringBuilder.append(entity.uniqueValueGetter()).append("'");
        stringBuilder.append("}) RETURN n");
        return Lists.newArrayList(CyberQueryExecuteUtil.executeEntityQuery(stringBuilder.toString(), BaseNode.class));
    }

    public boolean isNodeExistAndFreshLastWeek(BaseNode entity) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("MATCH (n:").append(entity.typeGetter());
        stringBuilder.append("{").append(entity.uniqueFieldNameGetter()).append(": '").append(entity.uniqueValueGetter()).append("'");
        if (entity instanceof CarNode) {
            CarNode carNode = (CarNode) entity;
            if (StringUtils.hasText(carNode.getVehicleCodeType()))
                stringBuilder.append(",vehicleCodeType:'").append(carNode.getVehicleCodeType()).append("'");
        }
        stringBuilder.append("}) WHERE n.updateTime >= '")
                .append(LocalDateTime.now().minusDays(7L).format(Constant.NORMAL_TIME_FORMATTER)).append("' RETURN count(n)");
        Long count = CyberQueryExecuteUtil.executeCountQuery(stringBuilder.toString());
        return 1L <= count;
    }

    public List<BaseRelation> queryEndNodeByStartNodeAndRelationType(BaseNode entity, BaseRelation relationship, BaseNode baseNode) {
        StringBuilder stringBuilder = createBaseCQL(entity, relationship, baseNode);
        stringBuilder.append("RETURN n,m,r");
        return Lists.newArrayList(CyberQueryExecuteUtil.executeEntityQuery(stringBuilder.toString(), relationship.getClass()));
    }

    public List<BaseRelation> queryEndNodeByStartNodeAndRelationType(BaseNode entity, BaseRelation relationship, BaseNode baseNode, LocalDateTime startTime, LocalDateTime endTime) {
        StringBuilder stringBuilder = createBaseCQL(entity, relationship, baseNode);
        stringBuilder.append("WHERE 1=1 ");
        if (null != startTime)
            stringBuilder.append("AND r.startTime > '").append(startTime.format(Constant.NORMAL_TIME_FORMATTER)).append("' ");
        if (null != endTime)
            stringBuilder.append("AND r.endTime < '").append(endTime.format(Constant.NORMAL_TIME_FORMATTER)).append("' ");
        stringBuilder.append("RETURN n,m,r");
        return Lists.newArrayList(CyberQueryExecuteUtil.executeEntityQuery(stringBuilder.toString(), relationship.getClass()));
    }

    public List<BaseRelation> queryRelationByStartNode(BaseNode entity, BaseRelation relationship, BaseNode baseNode) {
        StringBuilder stringBuilder = createBaseCQL(entity, relationship, baseNode);
        stringBuilder.append("WHERE r.joinCount IS NOT NULL ");
        if (null != relationship.getStartTime())
            stringBuilder.append("AND r.startTime > '").append(relationship.getStartTime().format(Constant.NORMAL_TIME_FORMATTER)).append("' ");
        if (null != relationship.getEndTime())
            stringBuilder.append("AND r.endTime < '").append(relationship.getEndTime().format(Constant.NORMAL_TIME_FORMATTER)).append("' ");
        stringBuilder.append("RETURN n,m,r ");
        stringBuilder.append("ORDER BY r.joinCount DESC, r.confidence DESC LIMIT 10");
        return Lists.newArrayList(CyberQueryExecuteUtil.executeEntityQuery(stringBuilder.toString(), relationship.getClass()));
    }

   
    public List<Map<String, Object>> statisticFollowHistory(BaseNode entity, BaseNode baseNode, boolean last3Day) {
        StringBuilder stringBuilder = createBaseCQL(entity, FollowRelation.builder().build(), baseNode);
        if (last3Day)
            stringBuilder.append("WHERE r.endTime >= '")
                    .append(LocalDate.now().minusDays(3L).atStartOfDay().format(Constant.NORMAL_TIME_FORMATTER))
                    .append("' ");
        stringBuilder.append("WITH n,m,");
        stringBuilder.append("SUM(r.joinCount)");
        //stringBuilder.append(last3Day ? "SUM(r.joinCount)" : "COUNT(r)");
        stringBuilder.append(" AS r_count RETURN n,m,r_count ORDER BY r_count DESC LIMIT 5");
        return CyberQueryExecuteUtil.executeOriginResultQuery(stringBuilder.toString());
    }

    public List<FollowRelation> queryLatestByStartNode(BaseNode entity, BaseNode baseNode) {
        StringBuilder stringBuilder = createBaseCQL(entity, FollowRelation.builder().build(), baseNode);
        stringBuilder.append("RETURN n,m,r ORDER BY r.endTime DESC LIMIT 5");
        return Lists.newArrayList(CyberQueryExecuteUtil.executeEntityQuery(stringBuilder.toString(), FollowRelation.class));
    }

    private StringBuilder createBaseCQL(BaseNode entity, BaseRelation relationship, BaseNode baseNode) {
        StringBuilder stringBuilder = new StringBuilder("MATCH ");
        stringBuilder.append("(n:").append(entity.typeGetter()).append("{").append(entity.uniqueFieldNameGetter()).append(": '").append(entity.uniqueValueGetter()).append("'");
        if (entity instanceof CarNode) {
            CarNode carNode = (CarNode) entity;
            if (StringUtils.hasText(carNode.getVehicleCodeType()))
                stringBuilder.append(",vehicleCodeType:'").append(carNode.getVehicleCodeType()).append("'");
        }
        stringBuilder.append("})");
        stringBuilder.append("-");
        stringBuilder.append("[r:").append(relationship.getType()).append("]");
        stringBuilder.append("-");
        stringBuilder.append("(m:").append(baseNode.typeGetter()).append(") ");
        return stringBuilder;
    }
}
/**
 * @author Ricardo.H.Wu
 * @time 2020/8/3 11:04
 */
@Data
public abstract class BaseNode {

    @Id
    @GeneratedValue
    private Long id;

    @Convert(Neo4jLocalDateTimeConvert.class)
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime = LocalDateTime.now();

    public abstract String typeGetter();

    public abstract String uniqueFieldNameGetter();

    public abstract String uniqueValueGetter();

    public abstract void uniqueValueSetter(String uniqueValue);

    public DtoNeo4jNode convertToResponseEntity() {
        return DtoNeo4jNode.builder()
                .label(typeGetter())
                .id(uniqueValueGetter())
                .data(this)
                .build();
    }
}

@Data
public abstract class BaseRelation {

@Id
@GeneratedValue
private Long id;

@StartNode
private BaseNode startNode;

@EndNode
private BaseNode endNode;

@Convert(Neo4jLocalDateTimeConvert.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;

@Convert(Neo4jLocalDateTimeConvert.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;

@Convert(Neo4jLocalDateTimeConvert.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime = LocalDateTime.now();

public abstract String getType();

public abstract DtoNeo4jEdge convertToResponseEntity();

}

作者 east
neo4j 5月 8,2021

Neo4j封装的基础查询Java API

import com.alibaba.fastjson.JSON;
import com.google.common.base.Throwables;
import com.google.common.collect.Lists;
import org.neo4j.ogm.model.QueryStatistics;
import org.neo4j.ogm.model.Result;
import org.neo4j.ogm.session.Session;
import org.neo4j.ogm.session.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Component
public class CyberQueryExecuteUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(CyberQueryExecuteUtil.class);

    private static SessionFactory SESSION_FACTORY;

    @Autowired
    public void init(SessionFactory sessionFactory) {
        SESSION_FACTORY = sessionFactory;
    }

    /**
     * 执行统计方法
     *
     * @param cql cypher查询语句
     * @return 统计结果
     */
    public static Long executeCountQuery(String cql) {
        try {
            Session session = SESSION_FACTORY.openSession();
            Long count = session.queryForObject(Long.class, cql, new HashMap<>());
            session.clear();
            LOGGER.debug("Neo4j cypher query: [{}], result: [{}]", cql, count);
            return count;
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
            return 0L;
        }
    }

    /**
     * 执行实体查询方法
     *
     * @param cql       cypher查询语句
     * @param className 实体类型
     * @return 查询结果
     */
    public static <T> Iterable<T> executeEntityQuery(String cql, Class<T> className) {
        try {
            Session session = SESSION_FACTORY.openSession();
            Iterable<T> response = session.query(className, cql, new HashMap<>());
            session.clear();
            LOGGER.debug("Neo4j cypher query: [{}]", cql);
            return response;
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
            return new ArrayList<>();
        }
    }

    /**
     * 执行实体查询方法
     *
     * @param cql cypher查询语句
     * @return 查询原始结果
     */
    public static List<Map<String, Object>> executeOriginResultQuery(String cql) {
        try {
            Session session = SESSION_FACTORY.openSession();
            Result response = session.query(cql, new HashMap<>());
            session.clear();
            LOGGER.debug("Neo4j cypher query: [{}], status: [{}]", cql, JSON.toJSONString(response.queryStatistics()));
            return Lists.newArrayList(response.queryResults());
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
            return new ArrayList<>();
        }
    }

    /**
     * 执行neo4j更新语句
     *
     * @param cql cypher更新语句
     */
    public static void executeUpdateQuery(String cql) {
        try {
            Session session = SESSION_FACTORY.openSession();
            Result result = session.query(cql, new HashMap<>());
            QueryStatistics queryStatistics = result.queryStatistics();
            session.clear();
            LOGGER.debug("Neo4j execute cql: [{}] contain update:[{}], status: [{}]", cql, queryStatistics.containsUpdates(), JSON.toJSON(queryStatistics));
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
        }
    }

    /**
     * 执行neo4j批量更新语句
     *
     * @param cql cypher批量更新语句
     */
    public static void executeBatchUpdateQuery(String cql) {
        try {
            Session session = SESSION_FACTORY.openSession();
            Result result = session.query(cql, new HashMap<>());
            QueryStatistics queryStatistics = result.queryStatistics();
            session.clear();
            LOGGER.debug("Neo4j batch save cql: [{}] contain update:[{}], status: [{}]", cql, queryStatistics.containsUpdates(), JSON.toJSON(queryStatistics));
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
        }
    }

    /**
     * 执行neo4j批量更新语句
     *
     * @param cql cypher批量更新语句
     */
    public static void executeBatchUpdateQuery(String cql, Map<String, Object> param) {
        try {
            Session session = SESSION_FACTORY.openSession();
            Result result = session.query(cql, param);
            QueryStatistics queryStatistics = result.queryStatistics();
            session.clear();
            LOGGER.debug("Neo4j batch save cql: [{}] contain update:[{}], status: [{}]", cql, queryStatistics.containsUpdates(), JSON.toJSON(queryStatistics));
        } catch (Exception e) {
            LOGGER.error(Throwables.getStackTraceAsString(e));
        }
    }
}
作者 east
广告联盟 5月 5,2021

admob如何收款和升级SDK提醒

最近探索了不少网赚模式,觉得开发app还是有一些优势。个人站长觉得竞争更大,网站做大了还怕被攻击,没不断更新网站内容会被搜索网站降权。app是上架后就可以躺赚,只要不被应用商店下架或移动广告升级。开网店要回答用户咨询,要打包、要处理退货等繁琐环节。

如果做国外app,首选是用admob,如果还有旧版本SDK,要注意升级到新的版本,才不会没广告展示。下面是admob的SDK升级提醒:

请阅读以下内容,了解这些更改会如何影响您的应用。
Google 移动广告 SDK Android v20.0.0 和 iOS v8.0.0 将于 2021 年初发布。更新到这样的主要版本后,一些现有的 API 将被更改或弃用。请考虑如下事项:
•在这些版本推出之前,请考虑根据下面的迁移指南更新现有应用中 API 的使用。•在 GMA SDK 版本 8.0.0 (iOS) 或 20.0.0 (Android) 推出之后,请确保所有的应用都已根据下面的迁移指南进行了更新,然后再发布您的应用。•如果将 GMA SDK 更新为版本 8.0.0 (iOS) 或 20.0.0 (Android),但没有同时根据迁移指南对以下 API 进行更改,会导致应用的构建或编译出现问题,且可能会影响收入。•升级到版本 8.0.0 (iOS) 或 20.0.0 (Android) 时对 GMA SDK 的破坏性更改不会破坏面向较旧 SDK 版本的现有实现方式。
下面列出了在更新到最新版 SDK 之前需要执行相应操作的主要 API 更改。如需查看更改(包括其他破坏性更改)的完整列表,请参阅下面的迁移指南。
尊敬的发布商:
您好!从 2018 年 1 月 23 日起,我们将不再支持低于 7.0.0 版的 Android 版和 iOS 版 Google 移动广告 SDK。为确保在此日期之后能继续投放 AdMob 广告,请升级至最新版的 Google 移动广告 SDK。
新版 SDK 推出了多种新功能,不仅能帮助您提高收入,还有助于打造出色的用户体验。具体包括:新增了一些广告格式、改进了中介报告功能、提升了广告投放的稳定性,等等。
您可以在此处以及我们的版本说明(Android 版/iOS 版)中,详细了解这些功能并查看我们的通告。

admob如何收款

admob收款建议用招商银行,之前也用中国银行,后来中国银行要收手续费了。招商银行收款招商银行总部地址和 SWIFT BIC 就可以。

收款行:China Merchants Bank, H.O. Shenzhen, China

SWIFTCODE:CMBCCNBS

例如:

在国内上不了adsense,如何文明上网,在这里ZC问题不好直接分享,可以加下面微信(微信号: tao17youhui),备注:adsense,拉到交流分享群,分享更多app及网赚经验。

作者 east
大数据开发 5月 4,2021

大数据即席查询框架技术选型

目前应用比较广泛的几种即席查询框架有Druid、Kylin、Presto、Impala、Spark SQL和Elasticsearch,针对响应时间、数据支持、技术特点等方面的对比如表

针对上表的对比情况,分析汇总如下。

● Druid:实时处理时序数据的OLAP数据库,因为它的索引首先按照时间进行分片,查询的时候也是按照时间线去路由索引的。

● Kylin:核心是Cube,Cube是一种预计算技术,基本思路是预先对数据进行多维索引,查询时只扫描索引而不访问原始数据,从而提高查询速度。

● Presto:它没有使用MapReduce,大部分场景下比Hive快一个数量级,其中的关键是所有的处理都在内存中完成。

● Impala:基于内存运算,速度快,支持的数据源没有Presto多。

● Spark SQL:基于Spark平台上的一个OLAP框架,基本思路是增加机器以实现并行计算,从而提高查询速度。

● Elasticsearch:最大的特点是使用倒排索引解决了索引存在的问题。根据研究,Elasticsearch在数据获取和聚集时用的资源比在Druid中高。框架选型如下。

● 从超大数据的查询效率来看:Druid > Kylin > Presto >Spark SQL。

● 从支持的数据源种类来看:Presto > Spark SQL > Kylin >Druid。

作者 east
广告联盟 5月 3,2021

adsense对比propellerads使用实测

注册门槛:我是先有了admob账号,然后再开adsense账号,开的过程也是一波三折,刚开始被拒绝过,后来终于成功了。看到adsense广告单价比admob的高,当时有点小兴奋。

用户体验: adsense广告用户体验还是比较好,虽然也有弹窗,但广告看起来没那么讨厌。我用中国ip看propellerads觉得广告看起来有些low,还有些是用成人电影诱导用户。觉得用户一看这广告,会觉得我的网站是垃圾网站。

广告单价:adsense广告能自动匹配内容,广告点击率还是可以的。Google作为大公司,广告主比较信赖,投放广告出得起价钱。最近adsense由于无效流量问题被暂停几天,才不得不找别的广告代替。在adsense再不济一天几美元的,在
propellerads 就变得很惨淡了。在adsense,美国(US)是我第一收入来源,在
propellerads 不知为什么,收入为零。


propellerads 总收入


propellerads 各个国家收入


adsense收入

adsense各个国家收入比例

结论:网站还是优先使用adsense的广告,但是adsense相对严格,以后可能会由于无效流量被暂停广告(不是自己刷及能控制的),最好有多个adsense帐号,并且没有帐户关联来规避风险,同时测试别的广告平台来做备份。

作者 east
数据仓库 5月 2,2021

数据仓库分层及命名规则

数据仓库中的数据要想真正发挥最大的作用,必须对数据仓库进行分层,数据仓库分层的优点如下。

● 把复杂问题简单化。可以将一个复杂的任务分解成多个步骤来完成,每层只处理单一的步骤。

● 减少重复开发。规范数据分层,通过使用中间层数据,可以大大减少重复计算量,增加计算结果的复用性。

● 隔离原始数据。使真实数据与最终统计数据解耦。数据仓库具体如何分层取决于设计者对数据仓库的整体规划,不过大部分的思路是相似的。

本数据仓库分为五层,如下所述。

● ODS层:原始数据层,存放原始数据,直接加载原始日志、数据,数据保持原貌不做处理。

● DWD层:明细数据层,对ODS层数据进行清洗(去除空值、脏数据、超过极限范围的数据)、维度退化、脱敏等。

● DWS层:服务数据层,以DWD层的数据为基础,按天进行轻度汇总。

● DWT层:主题数据层,以DWS层的数据为基础,按主题进行汇总,获得每个主题的全量数据表。

● ADS层:数据应用层,面向实际的数据需求,为各种统计报表提供数据。数据仓库分层后要遵守一定的数据仓库命名规范,本项目中的规范如下。

1.表命名ODS层命名为ods_表名。

DWD层命名为dwd_dim/fact_表名。DWS层命名为dws_表名。

DWT层命名为dwt_购物车。ADS层命名为ads_表名。临时表命名为tmp_×××。用户行为表以.log为后缀。

2.脚本命名脚本命名格式为数据源to目标_db/log.sh。用户行为需求相关脚本以.log为后缀;业务数据需求相关脚本以.db为后缀。

作者 east
数据仓库 4月 28,2021

关系型数据库(关系模型)转变为数据仓库(维度模型)示例

关系模型示意如图1所示,严格遵循第三范式(3NF)。从图1中可以看出,模型较为松散、零碎,物理表数量多,但数据冗余程度低。由于数据分布于众多的表中,因此这些数据可以更为灵活地被应用,功能性较强。关系模型主要应用于OLTP中,为了保证数据的一致性及避免冗余,大部分业务系统的表都是遵循第三范式的。

维度模型示意如图2所示,其主要应用于OLAP中,通常以某一张事实表为中心进行表的组织,主要面向业务,其特征是可能存在数据的冗余,但用户能方便地得到数据。关系模型虽然数据冗余程度低,但在大规模数据中进行跨表分析、统计、查询时,会造成多表关联,这会大大降低执行效率。所以通常我们采用维度模型建模,把各种相关表整理成事实表和维度表两种。所有的维度表围绕事实表进行解释。

图1 关系模型示意
图2 维度模型示意
作者 east
企业类 4月 23,2021

创客孵化器微信小程序代码

各地创客空间如雨后春笋,功能:

有图文的创客介绍。

入驻申请。项目基本信息、提交图片

预约看房。留下联系方式。

服务集市:各类记账等公司。

import util from './../../utils/util.js';
Page({
  data: {
    sortindex:0,  //排序索引
    sortid:null,  //排序id
    sort:[],
    activitylist:[], //会议室列表列表
    scrolltop:null, //滚动位置
    page: 0  //分页
  },
  onLoad: function () { //加载数据渲染页面
    this.fetchConferenceData();
    this.fetchSortData();
  },
  fetchSortData:function(){ //获取筛选条件
    this.setData({
      "sort": [
          {
              "id": 0,
              "title": "热门点击"
          },
          {
              "id": 1,
              "title": "最新发布"
          },
          {
              "id": 2,
              "title": "最多参与"
          },
      ]
    })
  },
  fetchConferenceData:function(){  //获取会议室列表
    const perpage = 10;
    this.setData({
      page:this.data.page+1
    })
    const page = this.data.page;
    const newlist = [];
    for (var i = (page-1)*perpage; i < page*perpage; i++) {
      newlist.push({
        "id":i+1,
        "name":"云栖技术分享日(云栖TechDay"+(i+1)+")",
        "status": util.getRandomArrayElement(["进行中","报名中","已结束"]),
        "time": "2016/07/12 14:00",
        "coments": Math.floor(Math.random()*1000),
        "address":"杭州云栖小镇咖啡馆  (杭州云计算产业园内)",
        "imgurl":"http://pic.58pic.com/58pic/12/34/51/85d58PICkjf.jpg"
      })
    }
    this.setData({
      activitylist:this.data.activitylist.concat(newlist)
    })
  },
  setSortBy:function(e){ //选择排序方式
    const d= this.data;
    const dataset = e.currentTarget.dataset;
    this.setData({
      sortindex:dataset.sortindex,
      sortid:dataset.sortid
    })
    console.log('排序方式id:'+this.data.sortid);
  },
  setStatusClass:function(e){ //设置状态颜色
    console.log(e);
  },
  scrollHandle:function(e){ //滚动事件
    this.setData({
      scrolltop:e.detail.scrollTop
    })
  },
  goToTop:function(){ //回到顶部
    this.setData({
      scrolltop:0
    })
  },
  scrollLoading:function(){ //滚动加载
    this.fetchConferenceData();
  },
  onPullDownRefresh:function(){ //下拉刷新
    this.setData({
      page:0,
      activitylist:[]
    })
    this.fetchConferenceData();
    this.fetchSortData();
    setTimeout(()=>{
      wx.stopPullDownRefresh()
    },1000)
  }
})

下载地址:工程代码

作者 east
开发博客 4月 17,2021

微信小程序语音识别、语音合成(微信同声传译)使用代码实例

最近在开发一款“单词大作战”的微信小程序,想增加语音识别、语音合成这2个功能。(让用户能听到单词的读音,并对比自己读音是否标准正确)。

查了一下资料,大概有几种方式:用百度翻译(需要配置后台来转发)、讯飞(听说效果最好,但好像要收费并要配置后台来转发 )。还有用微信同声传译插件。

微信同声传译插件使用最方便,目前功能还是尽善尽美,但一直在升级,是个人开发者不错的选择。用微信扫描下面小程序可以体验语音合成和语音识别的功能:

官方的开发文档:https://mp.weixin.qq.com/wxopen/plugindevdoc?appid=wx069ba97219f66d99&token=251348119&lang=zh_CN

使用步骤:

1、 在微信公众平台配置,找到设置–第三方设置–插件管理–点击添加插件,
搜索微信同声传译并添加

2、 在项目根目录app.json文件中配置

 "plugins": {
    "WechatSI": {
      "version": "0.3.4",
      "provider": "wx069ba97219f66d99"
    }
  },

语音合成:

在pages的js中加入插件初始化代码

const innerAudioContext = wx.createInnerAudioContext();
innerAudioContext.autoplay = true;
const plugin = requirePlugin('WechatSI');

由于语音合成原理是微信同声传译是在同声传译后台生产录音,下载播放录音。可以在页面加载阶段生产录音,在使用的地方播放录音,就不会有延迟。

//在全局定义变量
var remoteAudio = null;

//在开始阶段加载
 plugin.textToSpeech({
     lang: "en_US",
     tts: true,
     content: word,
     success: function(res) {
         console.log("succ tts", res.filename)   
        // this.playAudio(res.filename);
        remoteAudio = res.filename;
       
     },
     fail: function(res) {
         console.log("fail tts", res)
     }
 })
  },


//在实际需要使用语音合成地方
innerAudioContext.stop();
console.log("remoteAudio: " + remoteAudio);
innerAudioContext.src = remoteAudio;
innerAudioContext.play();
innerAudioContext.onError((e) => {
  console.log(e.errMsg)      
  console.log(e.errCode)      
  })

语音识别:

在pages的js中加入插件初始化代码

//引入插件:微信同声传译
const plugin = requirePlugin('WechatSI');
//获取全局唯一的语音识别管理器recordRecoManager
const manager = plugin.getRecordRecognitionManager();
// 设置采集声音参数
const options = {
  sampleRate: 44100,
  numberOfChannels: 1,
  encodeBitRate: 192000,
  format: 'aac'
}

在 onload()中加入初始化代码

//识别语音
this.initRecord();

在需要加入语音识别地方加入下面代码:

 //语音  --按住说话
  touchStart: function(e) {
    wx.vibrateShort() //按键震动效果(15ms)
    manager.start(options)
    this.setData({
      recordState: true, //录音状态为真
      tips: '松开结束',
    })

  },
  //语音  --松开结束
  touchEnd: function(e) {
    // 语音结束识别
    manager.stop();
    this.setData({
      recordState: false,
    })

  },
  //识别语音 -- 初始化
  initRecord: function() {
    const that = this;
    // 有新的识别内容返回,则会调用此事件
    manager.onRecognize = function(res) {
      console.log(res)
    }
    // 正常开始录音识别时会调用此事件
    manager.onStart = function(res) {
      console.log("成功开始录音识别", res)
    }
    // 识别错误事件
    manager.onError = function(res) {
      console.error("error msg:", res.retcode, res.msg)
    }
    //识别结束事件
    manager.onStop = function(res) {
      console.log('..............结束录音')
      console.log('录音总时长 -->' + res.duration + 'ms');
      console.log('语音内容 --> ' + res.result);
      if (res.result == '') {
        wx.showModal({
          title: '提示',
          content: '听不清楚,请重新说一遍!',
          showCancel: false,
          success: function(res) {}
        })
        return;
      }
      //下面有些代码有一些业务代码,要根据自己实际进行替换
      if(res.result == this.myword){
        that.setData({
          content: that.myword + '读音正确' //去掉自动添加的句号
        }) 
          next();
      }else{
        that.setData({
          recordState: false, //录音状态为真
          content: that.myword +'读音不准',
        })
        plugin.textToSpeech({
          lang: "en_US",
          tts: true,
          content: that.myword,
          success: function(res) {
              console.log("succ tts", res.filename)                
          },
          fail: function(res) {
              console.log("fail tts", res)
          }
      })
      }
    }
  },

 


作者 east
O2O 4月 6,2021

切换城市微信小程序代码

一款O2O的微信小程序,切换城市是最基本的组件。选择拼音,切换到全国各个市。

var city = require('../../utils/city.js');


Page({
  data: {
    searchLetter: [],
    showLetter: "",
    winHeight: 0,
    tHeight:0,
    bHeight:0,
    startPageY:0,
    cityList:[],
    isShowLetter:false,
    scrollTop:0,
    city:""
  },
  onLoad: function (options) {
    // 生命周期函数--监听页面加载
    var searchLetter = city.searchLetter;
    var cityList=city.cityList();
    // console.log(cityInfo);

    var sysInfo = wx.getSystemInfoSync();
    console.log(sysInfo);
    var winHeight = sysInfo.windowHeight;

    //添加要匹配的字母范围值
    //1、更加屏幕高度设置子元素的高度
    var itemH = winHeight / searchLetter.length;
    var tempObj = [];
    for (var i = 0; i < searchLetter.length; i++) {
      var temp = {};
      temp.name = searchLetter[i];
      temp.tHeight = i * itemH;
      temp.bHeight = (i + 1) * itemH;

      tempObj.push(temp)
    }
    
    this.setData({
      winHeight: winHeight,
      itemH: itemH,
      searchLetter: tempObj,
      cityList:cityList
    })

    console.log(this.data.cityInfo);
  },
  onReady: function () {
    // 生命周期函数--监听页面初次渲染完成

  },
  onShow: function () {
    // 生命周期函数--监听页面显示

  },
  onHide: function () {
    // 生命周期函数--监听页面隐藏

  },
  onUnload: function () {
    // 生命周期函数--监听页面卸载

  },
  onPullDownRefresh: function () {
    // 页面相关事件处理函数--监听用户下拉动作

  },
  onReachBottom: function () {
    // 页面上拉触底事件的处理函数

  },
  onShareAppMessage: function () {
    // 用户点击右上角分享
    return {
      title: 'title', // 分享标题
      desc: 'desc', // 分享描述
      path: 'path' // 分享路径
    }
  },
  searchStart: function (e) {
    var showLetter = e.currentTarget.dataset.letter;
    var pageY = e.touches[0].pageY;
    this.setScrollTop(this,showLetter);
    this.nowLetter(pageY,this);
      this.setData({
        showLetter: showLetter,
        startPageY: pageY,
        isShowLetter:true,
      })
  },
  searchMove: function (e) {
    var pageY = e.touches[0].pageY;
    var startPageY=this.data.startPageY;
    var tHeight=this.data.tHeight;
    var bHeight=this.data.bHeight;
    var showLetter = 0;
    console.log(pageY);
    if(startPageY-pageY>0){ //向上移动
        if(pageY<tHeight){
          // showLetter=this.mateLetter(pageY,this);
          this.nowLetter(pageY,this);
        }
    }else{//向下移动
        if(pageY>bHeight){
            // showLetter=this.mateLetter(pageY,this);
            this.nowLetter(pageY,this);
        }
    }
  },
  searchEnd: function (e) {
    // console.log(e);
    // var showLetter=e.currentTarget.dataset.letter;
    var that=this;
    setTimeout(function(){
      that.setData({
      isShowLetter:false
    })
    },1000)
    
  },
  nowLetter: function (pageY, that) {//当前选中的信息
    var letterData = this.data.searchLetter;
    var bHeight = 0;
    var tHeight = 0;
    var showLetter="";
    for (var i = 0; i < letterData.length; i++) {
      if (letterData[i].tHeight <= pageY && pageY<= letterData[i].bHeight) {
        bHeight = letterData[i].bHeight; 
        tHeight = letterData[i].tHeight;
        showLetter = letterData[i].name;
        break;
      }
    }

    this.setScrollTop(that,showLetter);

    that.setData({
      bHeight:bHeight,
      tHeight:tHeight,
      showLetter:showLetter,
      startPageY:pageY
      })
  },
  bindScroll:function(e){
    console.log(e.detail)
  },
  setScrollTop:function(that,showLetter){
      var scrollTop=0;
      var cityList=that.data.cityList;
      var cityCount=0;
      var initialCount=0;
      for(var i=0;i<cityList.length;i++){
         if(showLetter==cityList[i].initial){
           scrollTop=initialCount*30+cityCount*41;
            break;
         }else{
            initialCount++;
            cityCount+=cityList[i].cityInfo.length;
         }
      }

      that.setData({
        scrollTop:scrollTop
      })
  },
  bindCity:function(e){
    var city=e.currentTarget.dataset.city;
    this.setData({city:city})
  }
})

下载地址:工程地址

作者 east

上一 1 … 56 57 58 … 92 下一个

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。回复”chatgpt”获取免注册可用chatgpt。回复“大数据”获取多本大数据电子书

标签

AIGC AI创作 bert chatgpt github GPT-3 gpt3 GTP-3 hive mysql O2O tensorflow UI控件 不含后台 交流 共享经济 出行 图像 地图定位 外卖 多媒体 娱乐 小程序 布局 带后台完整项目 开源项目 搜索 支付 效率 教育 日历 机器学习 深度学习 物流 用户系统 电商 画图 画布(canvas) 社交 签到 联网 读书 资讯 阅读 预订

官方QQ群

小程序开发群:74052405

大数据开发群: 952493060

近期文章

  • AUTOSAR如何在多个供应商交付的配置中避免ARXML不兼容?
  • C++thread pool(线程池)设计应关注哪些扩展性问题?
  • 各类MCAL(Microcontroller Abstraction Layer)如何与AUTOSAR工具链解耦?
  • 如何设计AUTOSAR中的“域控制器”以支持未来扩展?
  • C++ 中避免悬挂引用的企业策略有哪些?
  • 嵌入式电机:如何在低速和高负载状态下保持FOC(Field-Oriented Control)算法的电流控制稳定?
  • C++如何在插件式架构中使用反射实现模块隔离?
  • C++如何追踪内存泄漏(valgrind/ASan等)并定位到业务代码?
  • C++大型系统中如何组织头文件和依赖树?
  • 如何进行AUTOSAR模块的持续集成(CI)部署与版本控制?

文章归档

  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年1月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年7月
  • 2018年6月

分类目录

  • Android (73)
  • bug清单 (79)
  • C++ (34)
  • Fuchsia (15)
  • php (4)
  • python (42)
  • sklearn (1)
  • 云计算 (20)
  • 人工智能 (61)
    • chatgpt (21)
      • 提示词 (6)
    • Keras (1)
    • Tensorflow (3)
    • 大模型 (1)
    • 智能体 (4)
    • 深度学习 (14)
  • 储能 (44)
  • 前端 (4)
  • 大数据开发 (484)
    • CDH (6)
    • datax (4)
    • doris (28)
    • Elasticsearch (15)
    • Flink (78)
    • flume (7)
    • Hadoop (19)
    • Hbase (23)
    • Hive (40)
    • Impala (2)
    • Java (71)
    • Kafka (10)
    • neo4j (5)
    • shardingsphere (6)
    • solr (5)
    • Spark (99)
    • spring (11)
    • 数据仓库 (9)
    • 数据挖掘 (7)
    • 海豚调度器 (9)
    • 运维 (33)
      • Docker (2)
  • 小游戏代码 (1)
  • 小程序代码 (139)
    • O2O (16)
    • UI控件 (5)
    • 互联网类 (23)
    • 企业类 (6)
    • 地图定位 (9)
    • 多媒体 (6)
    • 工具类 (25)
    • 电商类 (22)
    • 社交 (7)
    • 行业软件 (7)
    • 资讯读书 (11)
  • 嵌入式 (70)
    • autosar (63)
    • RTOS (1)
    • 总线 (1)
  • 开发博客 (16)
    • Harmony (9)
  • 技术架构 (6)
  • 数据库 (32)
    • mongodb (1)
    • mysql (13)
    • pgsql (2)
    • redis (1)
    • tdengine (4)
  • 未分类 (6)
  • 程序员网赚 (20)
    • 广告联盟 (3)
    • 私域流量 (5)
    • 自媒体 (5)
  • 量化投资 (4)
  • 面试 (14)

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org

All Rights Reserved by Gitweixin.本站收集网友上传代码, 如有侵犯版权,请发邮件联系yiyuyos@gmail.com删除.