<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Programmer]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/sqlxx</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sqlxx]]></copyright><item><title><![CDATA[stm32驱动xpt2046触摸屏]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/154120163</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/154120163</guid><author>sqlxx</author><pubDate>Thu, 30 Oct 2025 11:38:21 +0800</pubDate><description><![CDATA[本文介绍了如何使用STM32F103RB驱动XPT2046电阻式触摸屏控制器。主要内容包括：1) XPT2046芯片的引脚功能说明；2) STM32CubeMX中的硬件配置步骤；3) 关键驱动代码实现，包括触摸坐标读取和中断处理；4) 实际应用中的坐标转换和校准方法。作者提供了完整的工程代码，并演示了如何通过触摸屏获取坐标数据，为后续实现屏幕绘图功能奠定了基础。项目代码已开源在GitHub的lcd_driver分支。]]></description><category></category></item><item><title><![CDATA[2.4寸SPI串口ILI9341芯片彩色LCD驱动]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/153879662</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/153879662</guid><author>sqlxx</author><pubDate>Sat, 25 Oct 2025 17:38:56 +0800</pubDate><description><![CDATA[本文介绍了240×320分辨率LCD屏与STM32F103RB单片机的连接与驱动方法。硬件连接包括电源、SPI接口、控制引脚等，其中背光(PWM)、复位、片选等引脚需特殊配置。软件部分提供了初始化、清屏、设置显示方向、画点画线等核心功能实现，采用SPI通信协议控制屏幕。通过定义宏和函数封装，实现了屏幕基本操作，包括横竖屏切换、区域设置、颜色填充等。项目代码已开源，可作为STM32驱动LCD的参考方案。]]></description><category></category></item><item><title><![CDATA[记一次springboot应用偶发502错误的排查过程]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/121429478</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/121429478</guid><author>sqlxx</author><pubDate>Fri, 19 Nov 2021 19:46:17 +0800</pubDate><description><![CDATA[我们有一个系统，自上线以来，总隔三差五有用户反馈偶尔会有请求502 bad gateway的情况产生，但发生频率不高，也没发现有什么规律。经反复测试我们发现如果系统开启了图片水印功能，这个现象就比较容易重现（刷新带有图片的页面的时候）。所以我们初步怀疑这个情况和图片处理肯定是有点关系的。502的error code是nginx返回的，而且返回速度很快，看起来上游要么是直接拒绝连接了，要么是连接上了之后很快返回了。通过直接访问springboot应用尝试，发现是后一种情况，chrome里面提示net::ERR]]></description><category></category></item><item><title><![CDATA[HTTP/2 简介]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/119056336</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/119056336</guid><author>sqlxx</author><pubDate>Sat, 24 Jul 2021 12:37:31 +0800</pubDate><description><![CDATA[HTTP/2，简称h2，是HTTP协议自1999年的HTTP1.1发布之后的首个更新。它主要基于SPDY协议，于2015年5月正式发表，多数浏览器已经在2015年底前支持了该协议。HTTP/2的最显著的改进主要体现在多路复用、允许设置请求优先级、压缩算法、二进制传输等，这些特性使得使用HTTP/2的应用获得更快、更简单、更稳定的效果。目前流行的RPC框架grpc也是采用了HTTP/2来进行传输的。
HTTP/2没有改动HTTP的应用语义。之前熟悉的请求方法、状态码、URI、http headers等概念还是]]></description><category></category></item><item><title><![CDATA[通过Java使用opencv识别二维码]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/116667222</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/116667222</guid><author>sqlxx</author><pubDate>Tue, 11 May 2021 20:04:13 +0800</pubDate><description><![CDATA[OpenCV的全称是Open Source Computer Vision Library，它是一个跨平台的计算机视觉库，由英特尔公司发起并参与开发，以BSD许可证授权发行，可以在商业和研究领域中免费使用。OpenCV本身由C++语言开发，但也具有各种其他语言的接口，并支持windows、linux、ios、android等各种操作系统。本文将介绍如何使用OpenCV与Java语言进行二维码识别。

OpenCV的安装

目前OpenCV最新的版本是4.5.2，根据所在平台不同，OpenCV有多种安装方式。]]></description><category></category></item><item><title><![CDATA[Celery入门]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/105450818</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/105450818</guid><author>sqlxx</author><pubDate>Sat, 11 Apr 2020 13:05:27 +0800</pubDate><description><![CDATA[Celery是一个简单可靠的分布式任务队列，它主要关注于实时任务处理，同时也能够支持定时任务。这个项目目前在github上有14.8k颗星，是一个比较热门的项目。Celery是采用Python语言编写的，但其他语言也可以实现它的协议，或者通过webhook与之交互。Celery本身也比较精巧，据官方文档介绍，Celery的核心总共只有7000多行代码，但有14000多行测试代码，所以质量应该也还是...]]></description><category></category></item><item><title><![CDATA[TCP backlog在Linux下是如何工作的]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/90311918</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/90311918</guid><author>sqlxx</author><pubDate>Sat, 18 May 2019 12:07:31 +0800</pubDate><description><![CDATA[原文链接：http://veithen.io/2014/01/01/how-tcp-backlog-works-in-linux.html

当一个应用使用listen syscall将一个socket变成LISTEN状态时，它需要为该socket指定一个backlog值。这个backlog值通常被认为是接收传入连接的队列的长度限制。





因为TCP采用三次握手，一个连接在到达可以被ac...]]></description><category></category></item><item><title><![CDATA[国税总局发票助手二维码生成的CRC计算]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/76474600</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/76474600</guid><author>sqlxx</author><pubDate>Tue, 01 Aug 2017 08:07:17 +0800</pubDate><description><![CDATA[最近为了在我们的应用里生成发票信息的二维码，根据国税总局的二维码文档（见文后），唯一麻烦的地方就是需要计算一个CRC16的值。中间主要碰到了两个问题，一是文档中没有描述中文编码方式，经过试验，我们发现编码方式应为GBK。二是CRC值的生成，网上找了一些代码，生成的CRC16总是和总局发票助手生成的CRC16不一样。最后还是自己根据以下算法写了一个：


1)将字节流的前2字节放入一个长度为1]]></description><category></category></item><item><title><![CDATA[About Face 3 读书笔记]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/46765939</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/46765939</guid><author>sqlxx</author><pubDate>Sun, 05 Jul 2015 21:37:43 +0800</pubDate><description><![CDATA[About Face3
第一章 目标导向的设计
产品成功的关键是目标，而不是特性
好的设计让用户更有效率
交互设计不是凭空猜测



第二章 实现模型和心理模型
心理模型：用户心中认为这件东西是怎样工作的
实现模型：实际上是怎样工作的
表现模型：看起来是怎样工作的
表现模型越接近于心理模型，软件的易用性更强，反之
用户界面设计应该基于信息时代的思维方式，而不是局限于机械时]]></description><category></category></item><item><title><![CDATA[Java 8 特性 – 终极指南]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/40920155</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/40920155</guid><author>sqlxx</author><pubDate>Sat, 08 Nov 2014 14:11:31 +0800</pubDate><description><![CDATA[Java 8 特性 – 终极指南 （原文：http://www.javacodegeeks.com/2014/05/java-8-features-tutorial.html ）
编者注：Java 8出现在公众视野中已经有一段时间了，在这期间，种种迹象都表明Java 8是一个非常重要的版本。
我们已经在Java Code Geeks提供了很多丰富的]]></description><category></category></item><item><title><![CDATA[Ruby的p puts print]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/8948356</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/8948356</guid><author>sqlxx</author><pubDate>Sun, 19 May 2013 23:44:09 +0800</pubDate><description><![CDATA[ruby中有好几个输出到console的方法，最常见的是p, puts和print。 每次用的时候都会查一下这些方法的区别，不过过段时间又忘了。。。所以记录在这里，下次直接来这里找就可以了:)


puts方法在输出后，会自动换行(如果输出的字符串本身有换行，则puts不会再加额外的换行上去)，并且会转义。puts可以接受多个参数，每个参数都是输出成单独的一行。Kernel的puts ==]]></description><category></category></item><item><title><![CDATA[About class << self in ruby]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/8309923</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/8309923</guid><author>sqlxx</author><pubDate>Mon, 17 Dec 2012 23:36:06 +0800</pubDate><description><![CDATA[在ruby中经常可以见到这样的写法：
class A
  class << self
     def hello
        puts "hello"
     end
   end
end
这样的写法和
class A
  def self.hello
     puts "hello"
   end
end

可以说是完全一样的。第一种写法的一个好处是，如果需要在一个class]]></description><category></category></item><item><title><![CDATA[A Tour of Go - Exercise: Web Crawler]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/8302855</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/8302855</guid><author>sqlxx</author><pubDate>Sun, 16 Dec 2012 22:47:19 +0800</pubDate><description><![CDATA[A Tour of Go




Exercise: Web Crawler

In this exercise you'll use Go's concurrency features to parallelize a web crawler.
Modify the Crawl function to fetch URLs in parallel without fetching]]></description><category></category></item><item><title><![CDATA[A Tour of Go  - Exercise: Equivalent Binary Trees]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/8302604</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/8302604</guid><author>sqlxx</author><pubDate>Sun, 16 Dec 2012 21:23:34 +0800</pubDate><description><![CDATA[A Tour of Go




Exercise: Equivalent Binary Trees

There can be many different binary trees with the same sequence of values stored at the leaves. For example, here are two binary trees storin]]></description><category></category></item><item><title><![CDATA[A Tour of Go: Exercise: Rot13 Reader]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/8301966</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/8301966</guid><author>sqlxx</author><pubDate>Sun, 16 Dec 2012 17:03:15 +0800</pubDate><description><![CDATA[A Tour of Go




Exercise: Rot13 Reader

A common pattern is an io.Reader that wraps another io.Reader,
 modifying the stream in some way.
For example, the gzip.NewReader function takes an io]]></description><category></category></item><item><title><![CDATA[如何重启 synology nas的sshd]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/8288782</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/8288782</guid><author>sqlxx</author><pubDate>Thu, 13 Dec 2012 00:22:57 +0800</pubDate><description><![CDATA[/usr/syno/sbin/synoservice --restart ssh]]></description><category></category></item><item><title><![CDATA[ruby中gsub和gsub!的区别]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/8164554</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/8164554</guid><author>sqlxx</author><pubDate>Thu, 08 Nov 2012 23:40:12 +0800</pubDate><description><![CDATA[ruby中带“!"和不带"!"的方法的最大的区别就是带”!"的会改变调用对象本身了。比方说str.gsub(/a/, 'b')，不会改变str本身，只会返回一个新的str。而str.gsub!(/a/, 'b')就会把str本身给改了。


但是gsub和gsub!还有另外一个不同点就是，gsub不管怎么样都会返回一个新的字符串，而gsub!只有在有字符被替换的情况下才会返回一个新的字符串，]]></description><category></category></item><item><title><![CDATA[如何用最少的比较次数找出一个数列的最大和最小值]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/7422381</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/7422381</guid><author>sqlxx</author><pubDate>Mon, 02 Apr 2012 21:03:07 +0800</pubDate><description><![CDATA[当我们需要找出一个数列中的最大值或者最小值的时候，至少需要n-1次比较。如果我们同时需要找到最大值和最小值，最常见的做法就是对每个元素，分别和最大值和最小值都比一下，这样每个元素都需要2次的比较。但这里其实是可以优化的，如果我们同时取出数列中的两个元素，先让他们自己比较一下，然后把比较大的那个和当前最大值比，把比较小的那个和当前最小值比。这样2个元素只需要3次比较就能完成，比之前能够节省1次比较时]]></description><category></category></item><item><title><![CDATA[jboss AS7 如何监听所有地址]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/6647366</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/6647366</guid><author>sqlxx</author><pubDate>Sat, 30 Jul 2011 21:51:17 +0800</pubDate><description><![CDATA[jboss AS7默认和之前的版本一样，只监听127.0.0.1，用真实ip是不能访问的。 对于以前的版本我们可以在启动时运行run -b xxx.xxx.xxx.xxx来解决这个问题，但在AS7中，需要修改standalone\configuration\standalone.xml，找到



        
            
        




改为]]></description><category></category></item><item><title><![CDATA[为什么android中的AlertDialog要用一个内部的static class Builder来创建呢？]]></title><link>https://blog.youkuaiyun.com/sqlxx/article/details/6173840</link><guid>https://blog.youkuaiyun.com/sqlxx/article/details/6173840</guid><author>sqlxx</author><pubDate>Mon, 07 Feb 2011 15:16:00 +0800</pubDate><description><![CDATA[最近看一些android的代码，发现他的AlertDialog是需要用类似下面的代码来创建的：
new AlertDialog.Builder(this)
    .xxxx 
进入到AlertDialog的源代码，可以看到AlertDialog是继承于Dialog，并且他的构造函数都是声明成protected的。而Builder是一个内部的public static class. Build]]></description><category></category></item></channel></rss>