<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[少年的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/FSDAFU</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; FSDAFU]]></copyright><item><title><![CDATA[Google Play应用支付测试失败问题：BILLING UNAVAILABLE]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/163251925</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/163251925</guid><author>FSDAFU</author><pubDate>Mon, 27 Jul 2026 22:42:01 +0800</pubDate><description><![CDATA[Google Play发布应用进行支付测试出现Billing Unavailable的解决方案]]></description><category></category></item><item><title><![CDATA[在Docker中部署Flask时静态资源404解决方案]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/135172952</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/135172952</guid><author>FSDAFU</author><pubDate>Sat, 23 Dec 2023 19:18:37 +0800</pubDate><description><![CDATA[Flask应当在运行脚本同级目录下创建static文件夹，所有静态资源应当放入static中，但是此种方法虽然能在编译器或cmd中使用python运行，但是在使用docker部署时容易出问题，当将python脚本打包如docker并运行时，可以看到Flask能够正常处理请求事件，但是查找static中的静态资源时会出现404的错误，解决这个问题只需要将Flask的开发环境改为生产环境即可。]]></description><category></category></item><item><title><![CDATA[JavaScript await/async]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/135172867</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/135172867</guid><author>FSDAFU</author><pubDate>Sat, 23 Dec 2023 19:15:29 +0800</pubDate><description><![CDATA[因为await后的代码会加入到微队列中，直至该方法的多次调用均执行完毕（指await前面的代码）后才会执行微队列中的回调函数（await后面的代码），此时await后的代码访问的全局变量为最后一次调用该异步方法（await前面的代码）时修改的全局变量值。js中的await是一个语法糖，其内部是由then实现的，如代码{A();await B();1.2 遇到await时，如果await的方法是系统级api（如ajax等）跳转到1.4，否则进入await指向的方法，跳转到1.1，没遇到await到1.3。]]></description><category></category></item><item><title><![CDATA[WebRTC RTCDataChannel]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/134351652</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/134351652</guid><author>FSDAFU</author><pubDate>Sat, 11 Nov 2023 18:07:17 +0800</pubDate><description><![CDATA[关于WebRTC IP泄露的问题：对于Chrome、Edge（以及其他Chrome内核的浏览器，其他浏览器请自行测试）等浏览器，两类候选者（主机候选者、反射候选者）安全性不同，其中主机候选者采用mDNS协议，能够避免ip泄露的问题（用户可以自行打印候选项，得到的ip地址类似 dbd415d1-afa1-4eb0-a4b7-ba553fd74e4f.local，该值即使用mDNS协议处理过的ip地址），而STUN服务器获取到的候选项（即反射候选者）则会得到实际的IP地址。但TURN并非必须的。]]></description><category></category></item><item><title><![CDATA[VS打包.Net应用程序安装包安装后只有.dll没有.exe解决方案]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/134078230</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/134078230</guid><author>FSDAFU</author><pubDate>Fri, 27 Oct 2023 15:56:47 +0800</pubDate><description><![CDATA[具体打包流程直接参考网上其他.net framework框架打包流程，但有一点不同，遇到下图选项时，千万不要选择主输出而是选择发布项，针对.net系列框架有效。]]></description><category></category></item><item><title><![CDATA[C# 保证异步方法顺序执行]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/133039302</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/133039302</guid><author>FSDAFU</author><pubDate>Tue, 19 Sep 2023 18:05:30 +0800</pubDate><description><![CDATA[通常会有一些异步方法需要顺序执行，如对一个Socket进行异步发送，想要确保信息按照调用异步时的顺序进行发送，但使用普通的异步方法不能保证发送顺序，会导致对方接受结果为乱序发送。
具体实现思路：首先为每一个顺序声明一个ValueTask或Task全局变量a，然后每次调用异步方法时等待a中存储的前一个ValueTask或Task，同时将此次异步方法返回给a，这样就能实现异步的顺序发送。具体代码如下：
接收端代码：
{
    Socket socket = new Socket(AddressFamily.I]]></description><category></category></item><item><title><![CDATA[C# 从源码理解ValueTask.Result为何是非阻塞的]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/133038871</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/133038871</guid><author>FSDAFU</author><pubDate>Tue, 19 Sep 2023 18:00:30 +0800</pubDate><description><![CDATA[上图为代码和调试过程中监视的局部变量情况，图中两行蓝底的变量分别是async异步方法直接返回的ValueTask和由ValueTask包装后的async异步方法返回的Task，前面提到过，_obj私有变量在ValueTask中用于存储Task<TResult>或IValueTaskSource<TResult>对象，而从图中不难发现，两个ValueTask的_obj其类型均是AsyncTaskMethodBuilder。最后展示一段代码的测试，来对比异步方法返回ValueTask和Task的性能开销。]]></description><category></category></item><item><title><![CDATA[C# 图解await]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/132177987</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/132177987</guid><author>FSDAFU</author><pubDate>Tue, 08 Aug 2023 22:43:29 +0800</pubDate><description><![CDATA[由此可见，await同步阻塞其后面所跟异步方法，但同样又会使其所在方法变为异步（第一张图同理）上图输出结果是：1 主（主线程ID，下同）、3 主、5 主、7 主、2 主、8 子1（子线程1 ID）、x1 子1、x2 子N、6 子N、4 子N，其中，G方法进入异步时是由子线程1执行，但await时的结果并不一致，有时后续x2是子线程1执行，有时系统又创建了一个新的子线程来执行后续代码，推断可能是由于有时执行到G方法的await时子线程1已被销毁所致，由此可见，同一方法内的多个await是同步顺序。]]></description><category></category></item><item><title><![CDATA[C# 性能优化 List&LinkedList&Dictionary]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/130875362</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/130875362</guid><author>FSDAFU</author><pubDate>Thu, 25 May 2023 21:10:14 +0800</pubDate><description><![CDATA[抛开Dictionary代码内部具体实现，从哈希的原理上来看，哈希表虽然需要数组来进行存储，但本身是基于散列来存储的，插入不必说，删除是借助“链表”来实现高效的：哈希表必然要解决的一个问题是哈希冲突，在C#中是采用“拉链法”来解决这个问题的，但在此并非采用真正的链表（如果是的话，最坏情况下插入、查询会退化成ListNode），在Dictionary内部采用Entry结构体存储数据，并且该结构体中存有下一个节点的索引位置，因此删除操作只需要修改删除该节点并将其前驱节点的next指向其后继结点。]]></description><category></category></item><item><title><![CDATA[C# IOCP SocketAsyncEventArgs 使用流程]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/130821649</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/130821649</guid><author>FSDAFU</author><pubDate>Tue, 23 May 2023 10:31:07 +0800</pubDate><description><![CDATA[如果在 “4” 处采用异步，则初始化后将同步接收代码交由异步处理，后续操作则不会引发错误。从上图不难看出：如果极端情况下，Accept后的Socket会一直或较长一段时间内处于同步状态，此时将会占用主线程来执行相关数据处理工作，会影响后续Socket的Accept。在Windows系统下，该异步方法采用IOCP来实现，在Linux方法下通过epoll来实现，C#原生Socket仅有Select能够支持简单的“并发”，如果想在Linux平台实现高效率，可以采用此方法以达到epoll的效率。]]></description><category></category></item><item><title><![CDATA[机器学习-随笔（待续）]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/129677637</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/129677637</guid><author>FSDAFU</author><pubDate>Tue, 21 Mar 2023 12:33:31 +0800</pubDate><description><![CDATA[一般来说一些复杂的、同时具有多种功能的模型需要多个损失函数进行组合，甚至需要自己编写损失函数来对网络进行评估和更新。自定义损失函数的编写方式和神经网络模型编写方式一样，只不过并没有网络结构，因此__init__()中并不需要进行额外的定义，不过如果想要在初始化损失函数的时候定义一些权重参数等也是可以的。Kmeans聚类、knn精度节省内存。]]></description><category></category></item><item><title><![CDATA[VS2022 利用C++开发Linux平台共享链接库.so方法]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/129674528</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/129674528</guid><author>FSDAFU</author><pubDate>Mon, 20 Mar 2023 19:54:34 +0800</pubDate><description><![CDATA[在Linux平台上与Windows的动态链接库（.dll）对应的是共享链接库（.so），接下来的图示为使用c++开发共享链接库的步骤（以VS2022为例）最后编译的so文件路径为bin/x64(或x86等)/Debug（或Release）/yourCppFileName.so。配置项目略，直接创建即可。之后进入项目，删掉main.cpp，并且新建cpp文件。最后在项目上右键，重新生成即可。首次进行此操作可能需要进行远程连接。项目-右键-属性，修改编译目标文件格式。]]></description><category></category></item><item><title><![CDATA[Java操作数据库以及预处理和事务的效率测试]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/115581216</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/115581216</guid><author>FSDAFU</author><pubDate>Sat, 10 Apr 2021 17:52:29 +0800</pubDate><description><![CDATA[加载数据库固定代码：
Class.forName("com.mysql.jdbc.Driver");
String urlString = "jdbc:mysql://localhost:3306/lkkl?serverTimezone= GMT%2B8&amp;useUnicode=true&amp;characterEncoding=utf8";
String usernameString = "root";
String passwordString = "123456";
Connection co]]></description><category></category></item><item><title><![CDATA[二进制图片数据上传至服务器]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/115446837</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/115446837</guid><author>FSDAFU</author><pubDate>Mon, 05 Apr 2021 20:54:56 +0800</pubDate><description><![CDATA[图片上传至服务器方法：

（1）使用form表单上传
（2）使用ajax中的formdata格式上传
（3）将图片转为base64格式数据上传
（4）将图片转为二进制格式数据上传

由于form表单和ajax的formdata格式上传数据的灵活性不强，在此只介绍后两种方式。
1.将图片转为base64
图片转为base64后，因其编码格式特殊（将每三个字节拆分成四个字节），会使图片大小变为原来的4/3（清晰度不会发生任何变化），与二进制数据表示图片相比，这在上传较大图片以及较多图片时会占用较多的内存空间。因]]></description><category></category></item><item><title><![CDATA[MySQL 随笔]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/114777866</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/114777866</guid><author>FSDAFU</author><pubDate>Sun, 14 Mar 2021 13:21:48 +0800</pubDate><description><![CDATA[MySQL：

启动数据库：net start mysql

登录数据库：mysql -u root -p
回车后会显示Enter password：

输入密码后显示如下内容即登录成功：

显示所有数据库：show databases;

]]></description><category></category></item><item><title><![CDATA[margin的合并与float浮动的讨论]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/114728866</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/114728866</guid><author>FSDAFU</author><pubDate>Sat, 13 Mar 2021 09:18:04 +0800</pubDate><description><![CDATA[margin 合并现象：

1） 相邻的两个兄弟元素的外边距取两者之间的最大值进行合并（如上一元素的margin_bottom与下一元素的margin-top将会取一个最大值设为二者之间的间距）

2）清除浮动后，该元素的margin-top将会与上一浮动元素的padding+height+margin之和取最大值，成为该元素与浮动元素上一个兄弟元素（没有则为父级元素顶部）之间的距离

3）当某一元素为其父级元素的第一个或最后一个元素时（若其紧贴父级元素的上边或下边）会发生上或下边距合并。上边距合并：父元素]]></description><category></category></item><item><title><![CDATA[CSS随笔]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/114714974</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/114714974</guid><author>FSDAFU</author><pubDate>Sat, 13 Mar 2021 00:21:28 +0800</pubDate><description><![CDATA[CSS 零散知识点（不定期更新）


1、span标签的display属性必须设置为block后才能设置宽度

2、若想要某元素相对于父元素来进行绝对定位，需要父元素position属性设为除static之外的任何值，该元素position属性设为absolute

3、当需要将两元素并列排列时，需要将两元素的float属性同时设置为left才可（该）

4、当font-size属性设置为12px以下时，在部分浏览器中无法识别，一律按12px显示

5、当鼠标放置在某元素上，如果需要指针呈现小手的形状，需要]]></description><category></category></item><item><title><![CDATA[Java 爬虫]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/114576624</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/114576624</guid><author>FSDAFU</author><pubDate>Wed, 10 Mar 2021 09:27:26 +0800</pubDate><description><![CDATA[Java 爬虫


一、Jsoup
1. 爬取本地HTML文件
用Jsoup读取本地HTML文件需要File类打开相应文件并用Jsoup.parse()方法进行文件与DOM对象的转换
File desktopDirFile =FileSystemView.getFileSystemView().getHomeDirectory();
//getHomeDirectory()方法获取桌面路径，用于将生成的存储数据的Excel文件存放在桌面

File doce = new File(desktopDirFil]]></description><category></category></item><item><title><![CDATA[C#源码—List数组]]></title><link>https://blog.youkuaiyun.com/FSDAFU/article/details/110938898</link><guid>https://blog.youkuaiyun.com/FSDAFU/article/details/110938898</guid><author>FSDAFU</author><pubDate>Fri, 11 Dec 2020 10:09:46 +0800</pubDate><description><![CDATA[List 变量
  在开发过程中，List数组常被应用于数据、对象的存储，通过阅读List数组底层的实现代码，可以更好地了解List数组各种方法的实现原理、应用场合，从而正确的运用List数组，提高程序的运行效率，避免不必要的开销。
T类型数组：保存向List数组中添加的变量（从该变量的数组类型可以看出List数组底层使用Array数组来存储数据）
private T[] _items;

该变量为private类型，不可直接访问，但在后续方法中反复出现
private int _size;

该变量用于返]]></description><category></category></item></channel></rss>