<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[NON blog]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Next__One</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Next__One]]></copyright><item><title><![CDATA[electron-api-gateway]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/116424506</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/116424506</guid><author>Next__One</author><pubDate>Wed, 05 May 2021 13:37:46 +0800</pubDate><description><![CDATA[ApiGateway  设计
1.项目说明
这是一个基于electron主进程的api管理框架。我们项目组对electron技术的使用较多，这个也算是经验的总结，经历过生产环境的考验。本项目的所有代码和文档都是我个人完成，只是将框架的核心思想提取出来实现并开源。
1.1 框架要解决的问题
首先说一下项目的组成，我们是一个以electron为核心的PC端项目，以安装包的形式发布版本。
1.1.1 项目现状

进程数量多：其中带UI进程窗口40个以上，还有一些无UI的进程。
进程实现的语言多：有electron]]></description><category></category></item><item><title><![CDATA[语音助手]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/116424253</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/116424253</guid><author>Next__One</author><pubDate>Wed, 05 May 2021 13:06:41 +0800</pubDate><description><![CDATA[语音助手

前言：相信大家都听过语音助手，虽然比较鸡肋，但确实有一部分人用过，比如苹果的Siri，微软的小娜。本次要做的业务也是跟这个功能类似，通过语音操作自己的软件中的部分功能。

1.项目简介

先讲一下项目的大体框架，这是一个基于electron实现的pc端应用程序，前端技术栈主要是node+vue+electron。一开始，这个语音助手功能是使用electron渲染进程实现的一个窗口，当时在这个窗口中处理语音交互，以及用户语音动作的执行。后来，考虑到助手功能以后会对接其他业务，所以选择将助手功能独立]]></description><category></category></item><item><title><![CDATA[js树操作，层级遍历，先序序列化与反序列化]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/88380814</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/88380814</guid><author>Next__One</author><pubDate>Sun, 10 Mar 2019 17:14:10 +0800</pubDate><description><![CDATA[js树操作，层级遍历，先序序列化与反序列化


class TreeNode {
    /**
     * 树节点
     * @param value
     */
    constructor(value) {
        this.value = value;
        this.left = null;
        this.right = null;
    }
...]]></description><category></category></item><item><title><![CDATA[border-box宽度计算方式]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/85873229</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/85873229</guid><author>Next__One</author><pubDate>Sat, 05 Jan 2019 20:59:26 +0800</pubDate><description><![CDATA[css3 box-sizing定义了两种盒模型：

content-box
border-box

没有padding-box哦，别瞎猜。
二者区别就是容器的宽度计算方式不同：
content-box是块级默认属性，宽度计算方式为：
boxWidth=padding-left+padding-right+border-left+border-right+width;

border-box
这种盒...]]></description><category></category></item><item><title><![CDATA[es6 实现拖拽类Drag]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/85761380</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/85761380</guid><author>Next__One</author><pubDate>Fri, 04 Jan 2019 10:44:39 +0800</pubDate><description><![CDATA[1.es6 class的使用
之前在Jquery时代，实现拖拽功能都是使用函数直接搞，有了es6中的class，可以很好的封装相关的功能，只要给个ID就可以，想拖谁就拖谁！不过步骤还是老一套。

先在拖拽元素DOM上添加onmousedown事件，获取鼠标点击位置，并添加document的onmousemove事件和onmouseup事件
只要鼠标不弹起，就会执行onmousemove事件，然后事...]]></description><category></category></item><item><title><![CDATA[Redux官网Counter最基本示例的思考]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/85683016</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/85683016</guid><author>Next__One</author><pubDate>Thu, 03 Jan 2019 11:10:45 +0800</pubDate><description><![CDATA[1.不使用redux实现
如果不使用redux，仅仅依靠react去实现Counter功能是极其简单的。代码如下：

index.js
import React from 'react';
import ReactDOM from 'react-dom';
import Counter from './components/Counter';

const render = ()=&amp;gt; Rea...]]></description><category></category></item><item><title><![CDATA[rest接口如何适应jsonp的方案]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/85051673</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/85051673</guid><author>Next__One</author><pubDate>Mon, 17 Dec 2018 16:39:30 +0800</pubDate><description><![CDATA[rest接口如何适应jsonp的方案
我的要做的事很简单，在html中，跨域调用一个rest接口，
后端接口实现使用Node（语言无关），rest接口都是返回json数据的，如果不在页面上进行任何处理，是不可以在页面是使用的。
直接给出方案，前端使用jquery，只需要将dataType改成jsonp，
其他的就和普通的axaj无差别了。前端代码如下：
let url = &amp;quot;http://loca...]]></description><category></category></item><item><title><![CDATA[字节跳动2019届校招笔试题二]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/83153231</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/83153231</guid><author>Next__One</author><pubDate>Thu, 18 Oct 2018 21:20:50 +0800</pubDate><description><![CDATA[2.为了提高文章质量，每一篇文章（假设全部都是英文）都会有m民编辑进行审核，每个编辑独立工作，会把觉得有问题的句子通过下表记录下来，比如[1,10]，1表示病句的第一个字符，10表示病句的最后一个字符。也就是从1到10着10个字符组成的句子，是有问题的。
现在需要把多名编辑有问题的句子合并起来，送个总编辑进行最终的审核。比如编辑A指出的病句是[1,10]，[32,45];编辑B指出的病句是[5,1...]]></description><category></category></item><item><title><![CDATA[字节跳动2019届校招笔试题]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/83151781</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/83151781</guid><author>Next__One</author><pubDate>Thu, 18 Oct 2018 19:41:16 +0800</pubDate><description><![CDATA[1.世界杯开幕式会在球场C举行，球场C的球迷看台可以容纳M*N个球迷。在球场售票完成后，现官方想统计此次开幕式一共有多少个球队球迷群体，最大的球队球迷群体有多少人。
经调研发现，球迷群体在选座时有以下特性：
同球队的球迷群体会选择相邻座位，不同球队的球迷群体会选择不相邻的座位（注解：相邻包括前后相邻，左右相邻，斜对角相邻）
给定一个M*N的二维球场，0代表该位置没有坐人，1代表该位置已有选择，希望...]]></description><category></category></item><item><title><![CDATA[HTTP请求行、请求头、请求体详解]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/82965628</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/82965628</guid><author>Next__One</author><pubDate>Mon, 08 Oct 2018 11:23:54 +0800</pubDate><description><![CDATA[原文地址：https://blog.youkuaiyun.com/u010256388/article/details/68491509


引用

学习Web开发不好好学习HTTP报文，将会“打拳不练功，到老一场空”，你花在犯迷糊上的时间比你沉下心来学习HTTP的时间肯定会多很多。
HTTP请求报文解剖&amp;nbsp;HTTP请求报文由3部分组成（请求行+请求头+请求体）：&amp;nbsp;&amp;nbsp;下面是一个实际...]]></description><category></category></item><item><title><![CDATA[shell处理HBase命令的执行结果]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/81630509</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/81630509</guid><author>Next__One</author><pubDate>Mon, 13 Aug 2018 15:17:53 +0800</pubDate><description><![CDATA[shell处理HBase命令的执行结果

方法1生成文件 
优点：可以更加详细的处理输出结果文件； 
  缺点：形成很多结果文件，需要有写入权限

current=`date &quot;+%Y-%m-%d %H:%M:%S&quot;`  
timeStamp=`date -d &quot;$current&quot; +%s`    
currentTimeStamp=$((timeStamp*1000+`date &quot;+%N&quot;`/1...]]></description><category></category></item><item><title><![CDATA[使用BlockingQueue查找某个文件夹下的所有文本文件中是否包含文字]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/79015464</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/79015464</guid><author>Next__One</author><pubDate>Tue, 09 Jan 2018 17:35:00 +0800</pubDate><description><![CDATA[阻塞队列的使用：public class FileCrawler implements Runnable {
    private final BlockingQueue<File> fileQueue = new LinkedBlockingQueue<>(10);
    final List<String> result = new ArrayList<>(16);
    private]]></description><category></category></item><item><title><![CDATA[使用原生NIO实现一个echo服务器]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/78995647</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/78995647</guid><author>Next__One</author><pubDate>Sun, 07 Jan 2018 16:42:30 +0800</pubDate><description><![CDATA[tcp的拆包处理使用的是定长解码的方式。 
服务器端：public class EchoServer {
    public static final int port = 8888;    public static void main(String[] args) throws IOException {
        Selector selector = Selector.open();]]></description><category></category></item><item><title><![CDATA[最新版Spark2.2读取多种文件格式数据]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/78840908</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/78840908</guid><author>Next__One</author><pubDate>Tue, 19 Dec 2017 11:35:50 +0800</pubDate><description><![CDATA[Spark2.0+的文件读取Spark可以读取多种格式文件，csv，json，parque。因此对应就有很多函数与之对应。在Spark2.0以后一般使用SparkSession来操作DataFrame、Dataset来完成数据分析。这些读取不同格式文件的函数就是SparkSession的成员DataFrameReader的方法。该类就是将文件系统（HDFS，LocalFileSystem（一定要在每]]></description><category></category></item><item><title><![CDATA[java常用位操作]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/78767284</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/78767284</guid><author>Next__One</author><pubDate>Sun, 10 Dec 2017 20:42:16 +0800</pubDate><description><![CDATA[public class TestIndex {
    /**
     * 数组越界
     * 这个方法是java源码中常用的一个数组越界的判断检测
     * 顺便复习一下位操作
     */
    public static int read(byte[] b, int off, int len) throws Exception {
        // parameter ch]]></description><category></category></item><item><title><![CDATA[jvm 判断对象是否已经死亡]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/78755731</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/78755731</guid><author>Next__One</author><pubDate>Fri, 08 Dec 2017 21:23:21 +0800</pubDate><description><![CDATA[如何判断java对象已经死亡？容易想到的就是引用计数算法，就说的是给对象添加一个引用计数器，每当有一个地方引用到他，就加1；引用失效就减1。但是这样做是有问题的。 
看下例子：public class ReferenceCountingGC {
    public Object instace = null;
//  一个200M的对象
    private byte[] bigSize = n]]></description><category></category></item><item><title><![CDATA[使用netty+zookeeper+protobuf实现一个RPC过程]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/78753167</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/78753167</guid><author>Next__One</author><pubDate>Fri, 08 Dec 2017 16:40:45 +0800</pubDate><description><![CDATA[上次实现了一个基于java序列化和阻塞IO模型的RPC过程，效率很低，这次换用NIO来实现。代码有点多,尽量写清楚一点。 
这是maven的版本依赖，先放在前面，接下来就可以复制了。。。    <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>]]></description><category></category></item><item><title><![CDATA[用java序列化和阻塞IO模型实现RPC]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/78710839</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/78710839</guid><author>Next__One</author><pubDate>Mon, 04 Dec 2017 16:14:07 +0800</pubDate><description><![CDATA[RPC是远程过程调用，对于java而言，就是两个JVM通信，一个JVM a想要调用另一个JVM b中的类。b把执行结果在发送给a的过程。好，我们就是要来实现这个过程。 
两个接口：public interface IDiff {
    double diff(double a,double b);
}public interface ISum {
    public int sum(int a,]]></description><category></category></item><item><title><![CDATA[遇到一个比较有意思的NIO问题！]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/78681995</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/78681995</guid><author>Next__One</author><pubDate>Thu, 30 Nov 2017 22:47:36 +0800</pubDate><description><![CDATA[关于NIO的ByteBuffer操作很多人都会，但有时候稍不注意就会犯错。比如：private void doWrite(SocketChannel sc, String response) throws IOException {
        if (response != null && response.trim().length() > 0) {
            ByteBuff]]></description><category></category></item><item><title><![CDATA[使用java解压GZip文件]]></title><link>https://blog.youkuaiyun.com/Next__One/article/details/78668923</link><guid>https://blog.youkuaiyun.com/Next__One/article/details/78668923</guid><author>Next__One</author><pubDate>Wed, 29 Nov 2017 19:24:00 +0800</pubDate><description><![CDATA[Java中有可以直接解压gzip文件的输入流。/**
     * 获取文件名（去掉.gz后缀）
     * @param path
     * @return
     */
    public static String getPrefix(String path) {
        int index = path.lastIndexOf('.');
        return pa]]></description><category></category></item></channel></rss>