宴清都·秋感

吴文英《宴清都·秋感》 万里关河眼。愁凝处,渺渺残照红敛。天低远树,潮分断港,路回淮甸。吟鞭又指孤店。对玉露金风送晚。恨自古、才子佳人,此景此情多感。 吴王故苑。别来良朋鸦集,空叹蓬转。挥毫记烛,飞觞赶月,梦销香断。区区去程何限。倩片纸、丁宁过雁。寄相思,寒雨灯窗,芙蓉旧院。 译文: 身处广袤的江淮平原,山山水水尽收眼底。在愁闷中凝视西方,茫茫暮色中夕阳正一点点地收敛起余晖。身在旷野,只见天边的树显得异常低矮,潮汐在淮河的原入海处分道,大路在一个接一个的湖泊之间迂回延伸。我用马鞭遥指着远处一个孤零零的路边客店,将去那里借宿一宵,并且在那里迎着习习凉风喝上几杯玉露酒。从古至今有多少个才子佳人,如果面对着旷野、夕照、孤店、独酌等的环境,一定会产生出许多寂寞凄凉的感触。

October 20, 2022 · 1 min · 晚晴

主存与CACHE的地址映射

cache主要用来解决CPU 与 主存之间速度不匹配的问题,使用cache 就要注意两个主要的指标,首先命中率要高,其次是cache对而言应该是透明的,即无论是否有cache cpu访存的方法都是一样的; 地址映射方法 全相联映射 顾名思义 每个cahce 可以映射到主存的任意一个位置,cache中保存主存地址+缓存的内容,非常的灵活。 缺点:高速比较器电路难以实现,适合小的cache使用。 直接映射的方式 直接映射也是多对一的映射关系,但是一个主存块只能拷贝到cache的一个特定的行位置去,这种方法cache的容量最好大一点。 缺点:频繁的置换会使cache的效率下降,需要大容量的cache减少置换次数。 组相连映射方式 组相联映射是前两种的折中方式。即分组,在每一组中,分到哪一行是灵活的。 cache的替换策略 最不经常使用(LFU)算法 LFU算法就是将一段时间内最不经常使用的数据换出。为每一行设置一个计数器,被访问的行计数器增加1,换值小的行,不能反映近期cache的访问情况。 近期最少使用(LRU)算法 LRU就是将近期内长久未被访问过的行换出,每行也设置一个计数器,命中则清零,其余行加一,需要替换则将计数器最大值换出,这种方法保护了刚刚复制到cache的新数据,使得cache有较高的命中率。 随机替换 随机替换,不使用计数器,不进行比较,速度要比上两种的速度快,但是会降低命中率,在cache容量较大时,性能只是稍逊于前两种算法。

June 8, 2022 · 1 min · 晚晴

SPI详解(转载)

SPI简介 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。 SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。 SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议 SPI特点 2.1 采用主-从模式(Master-Slave)的控制方式 SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作。 采用同步方式(Synchronous)传输数据 Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse), 时钟脉冲组成了时钟信号(Clock Signal) , 时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样, 来保证数据在两个设备之间是同步传输的. 数据交换(Data Exchanges) SPI 设备间的数据传输之所以又被称为数据交换, 是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 “发送者(Transmitter)” 或者 “接收者(Receiver)”. 在每个 Clock 周期内, SPI 设备都会发送并接收一个 bit 大小的数据, 相当于该设备有一个 bit 大小的数据被交换了. 一个 Slave 设备要想能够接收到 Master 发过来的控制信号, 必须在此之前能够被 Master 设备进行访问 (Access). 所以, Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选, 把想要访问的 Slave 设备选上. 在数据传输的过程中, 每次接收到的数据必须在下一次数据传输之前被采样. 如果之前接收到的数据没有被读取, 那么这些已经接收完成的数据将有可能会被丢弃, 导致 SPI 物理模块最终失效. 因此, 在程序中一般都会在 SPI 传输完数据后, 去读取 SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的。 没有读和写的说法,因为实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。 ...

April 1, 2022 · 2 min · 晚晴

LNMP下大量请求下报502错误的解决方法

最近正在着手于PHP网页的编写,由于服务器的配置较低,在平常的测压中,mysql服务总是因为内存不够而挂掉,本着学习的态度,使用了阿里的RDS mysql 第一次将网站服务器 与数据库分开,关键是,服务器在腾讯云,好家伙,直接公网连接数据库,本来wordpress 就优化不好,现在的TTFB(首字节时间直接干到500ms),再使用了静态缓存+MemCached,降到了200左右,有一说一,追求快速轻巧的话,还是建议使用其他博客系统吧。 言归正传,我用PHP写了一个API 接口,随机从数据库中取出一条句子,写好后,使用 Apache 的 JMeter 进行压力测试,开始先设置了200个线程。 再服务器查看 访问的日志 200 还行,基本上没有错误。 紧接着,将线程设置为300,心里觉得也没问题,结果一看日志;好家伙,502错误占据了我的屏幕。 排查一下系统的资源占用情况,内存占用 15 % ,cpu 15 % 负载 0.2 …… 见鬼了。。。 是不是 服务器带宽 达到了瓶颈了呢? 接着我又在压力,查了一下 502 错误一般都是由于 PHP FPM导致的 ,简而言之,就是后端挂了, top 命令 一看; 一切正常,测压关闭后,网站又可以正常访问,这说明PHP访问并没有关闭。其他版本PHP下的网站都可以打开,这又排除了服务器带宽的原因。 接着看FPM 的配置文件,各种 buffer ,加大buffer size ,无果。 查阅相关资料后得知 pm.max_children 这一项是最大的进程数,宝塔提示,每个fpm进程,要占用20m的内存,原本是80 ,我将他修改成200,测试 ,500个进程,没有发现502,只是测压时,网站的访问速度确实慢了一点 最长 TTFB 1s,不过这次确实 没有出现502错误了。

February 24, 2022 · 1 min · 晚晴

NGINX服务器 之反向代理与负载均衡

转载于 https://www.cnblogs.com/jalja/p/6117881.html 作者 : 小禾点点 反向代理 客户端要获取的资源就在服务器上,客户端请求的资源路径就是最终响应资源的服务器路径,这就是正向代理。正向代理的特点:就是我们明确知道要访问哪个网站地址。 反向代理: 客户端想获取服务器集群中(服务1,服务2,服务3 他们的资源相同)中的资源,但是客户端无法与该服务器集群建立连接,但我们可以与另一台服务器(代理服务器)建立连接且该服务器能获取服务器集群中的资源。这个时候客户端就可以通过请求代理服务器,获取想要的资源,但客户端并不知道给他资源的是哪个服务器。这种方式就是反向代理。 负载均衡 当一台服务器的单位时间内的访问量越大的时候,服务器的压力会越大。当一台服务器压力大得超过自身的承受能力的时候,服务器会崩溃。为了避免服务器崩溃,让用户有更好地体验,我们通常通过负载均衡的方式来分担服务器的压力。那么什么是负载均衡呢?我们通过建立很多个服务器,把这些服务器组成一个服务器集群,然后,当用户访问我们网站的时候,先访问一个中间服务器,再让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该选择的服务器。这样,用户的每次访问,都会保证服务器集群中的每个服务器的压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。负载均衡就是采用反向代理的思想。 Nginx中负载均衡的实现 创建fzjh.conf配置文件 在/usr/local/nginx/conf下创建fzjh.conf文件,文件内容如下: user nobody; worker_processes 2; events { worker_connections 1024; } http{ #=upstream设置负载均衡的待选服务器列表,在运行中如果有服务器崩溃那该服务器就会在该列表中移除 upstream mypro{ server 219.133.55.36;#中国万维网 server 115.239.210.27;#百度的ip } server{ listen 8080; #====== 对ngnix更目录做负载均衡=== location / { #==选择要代理的服务器要与upstream对应========== proxy_pass http://mypro; } } } 加载fzjh.conf配置文件 执行命令: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/fzjh.conf 测试是否成功 在这里我们的负载均衡待选服务器列表是百度和中国万维网,也就说我们访问我的主机名+8080 就可以进行测试,如果页面在百度与中国万维网中切换,就表示成功。 Upstream模块详解 Upstream模块:该模块是Nginx服务器的一个重要模块。Upstream模块实现在轮询和客户端ip之间实现后端的负载均衡。常用的指令有ip_hash指令、server指令和upstream指令等。该模块主要进行轮询算法。upstream指令主要是用于设置一组可以在proxy_pass和fastcgi_pass指令中使用额代理服务器,默认负载均衡方式为轮询。 ip_hash指令:在负载均衡系统中,假如用户在某台服务器上登录,那么如果该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的一个服务器,那么此时如果将已经登录服务器A的用户再定位到其他服务器,显然不妥。故而,我们可以采用ip_hash指令解决这个问题,如果客户端请求已经访问了服务器A并登录,那么第二次请求的时候,会将该请求通过哈希算法自动定位到该后端服务器中。简单说ip_hash指令可以实现当用户使用同一浏览器在A服务器登录后,那他后续的所有请求都在同一服务器中进行,Nginx代理服务器不会将他的请求分配到其他服务器上,以此规避用户登录信息在不同服务器间流转的问题,从而保证用户只需登录一次。 ip_hash的使用:在fzjh.conf配置文件中开启该功能 server指令: 主要用于指定服务器的名称和参数。 使用:在fzjh.conf配置文件中开启该功能 注意:在实际开发中weight不要与ip_hash同时使用 负载均衡不同实现方式的优缺点:假如使用硬件的方式实现负载均衡,那么中间的转发机构就是硬件,这个时候运行的效率非常高,但是对应的成本也非常高。如果我们采用软件的方式来实现负载均衡,那么中间的转发机构就是软件,这个时候,运行效率不如硬件,但是成本相对来说低得多。而使用Nginx服务器实现负载均衡,那么就是通过软件的方式来实现负载均衡,并且Nginx本身支持高并发等。故而使用Nginx服务器实现负载均衡,能大大节约企业的成本,并且由于Nginx是服务器软件,其执行效率也是非常高。 转载于 https://www.cnblogs.com/jalja/p/6117881.html

February 21, 2022 · 1 min · 晚晴

NODE JS 三个文件实现路由功能(转载)

原文来自菜鸟教程:https://www.runoob.com/nodejs/nodejs-router.html 我们要为路由提供请求的 URL 和其他需要的 GET 及 POST 参数,随后路由需要根据这些数据来执行相应的代码。 因此,我们需要查看 HTTP 请求,从中提取出请求的 URL 以及 GET/POST 参数。这一功能应当属于路由还是服务器(甚至作为一个模块自身的功能)确实值得探讨,但这里暂定其为我们的HTTP服务器的功能。 我们需要的所有数据都会包含在 request 对象中,该对象作为 onRequest() 回调函数的第一个参数传递。但是为了解析这些数据,我们需要额外的 Node.JS 模块,它们分别是 url 和 querystring 模块。 url.parse(string).query | url.parse(string).pathname | | | | | ------ ------------------- http://localhost:8888/start?foo=bar&hello=world --- ----- | | | | querystring.parse(queryString)["foo"] | | querystring.parse(queryString)["hello"] 当然我们也可以用 querystring 模块来解析 POST 请求体中的参数,稍后会有演示。 现在我们来给 onRequest() 函数加上一些逻辑,用来找出浏览器请求的 URL 路径: Server.Js 文件代码: var http = require("http"); var url = require("url"); function start() { function onRequest(request, response) { var pathname = url.parse(request.url).pathname; console.log("Request for " + pathname + " received."); response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); } http.createServer(onRequest).listen(8888); console.log("Server has started."); } exports.start = start; 好了,我们的应用现在可以通过请求的 URL 路径来区别不同请求了–这使我们得以使用路由(还未完成)来将请求以 URL 路径为基准映射到处理程序上。 ...

February 17, 2022 · 1 min · 晚晴

安卓 之 HTTP 访问

安卓 之 HTTP 访问 package cn.shilight.shiguang; import android.util.Log; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class http { String result = "{\"result\":\"10002\"}"; public String POST(String url,String data){ try { URL wz = new URL(url); try { HttpURLConnection HTTP= (HttpURLConnection) wz.openConnection(); HTTP.setDoOutput(true); HTTP.setDoInput(true); HTTP.setRequestMethod("POST"); HTTP.setConnectTimeout(3000); HTTP.setUseCaches(false); HTTP.setRequestProperty("Accept-Encoding","identity"); OutputStream outputStream = HTTP.getOutputStream(); outputStream.write(data.getBytes()); int code = HTTP.getResponseCode(); //获得服务器的响应码 Log.i("服务器:", String.valueOf(code)); InputStream inputStream=HTTP.getInputStream();//获取服务器返回输入流 BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream)); StringBuilder response=new StringBuilder(); String line; while ((line=reader.readLine())!=null){ response.append(line); } result = (response.toString()); } catch (IOException e) { e.printStackTrace(); return result; } } catch (MalformedURLException e ){ e.printStackTrace(); return result; }finally { } return result; } //HTTP请求之 post } 注: ...

February 5, 2022 · 1 min · 晚晴

安卓简单登陆界面实现

在安卓开发中登陆界面是必不可少的,好的登陆界面,会给用户更好的体验感。 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/zc" android:layout_width="310dp" android:layout_height="45dp" android:text="注册账号" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.495" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.791" /> <EditText android:id="@+id/editTextTextPassword" android:layout_width="311dp" android:layout_height="55dp" android:ems="10" android:hint="密码" android:inputType="textPassword" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <ImageView android:id="@+id/imageView2" android:layout_width="114dp" android:layout_height="108dp" android:background="@raw/login" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.498" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.186" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="登录" android:textColor="@color/purple_500" android:textSize="40dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.498" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.063" /> <EditText android:id="@+id/editTextText" android:layout_width="311dp" android:layout_height="55dp" android:ems="10" android:hint="账号" android:inputType="text" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.407" /> <Button android:id="@+id/dl" android:layout_width="311dp" android:layout_height="45dp" android:text="登录" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.689" /> <TextView android:id="@+id/forget" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="忘记密码?" android:textColor="#E91E63" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.146" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.564" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_begin="50dp" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_begin="361dp" /> </androidx.constraintlayout.widget.ConstraintLayout> 效果如下 ...

February 5, 2022 · 1 min · 晚晴

REDIS 数据库 在 PHP上的基本使用

Redis 作为 一个高性能的key -value 数据库,去不仅具备高性能,还是用方便。以下是 Redis 的基本使用方法 注意 PHP 需要安装 redis 扩展 否则报错! 连接本地数据库 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); 存入一个值 $redis->set("值的名称", "值的内容"); 取值 $redis->get("值的名称"); (返回字符串)

January 8, 2022 · 1 min · 晚晴

ANDROID STUDIO 之 自定义字体

在开发安卓程序时,ui的美观性尤为重要,字体也是必须要考虑的问题。 设置方法 在Android Studio中创建assets文件目录 注意在main目录下 将字体拖入到该文件中。 在Java中写入一下代码 TextView tittle; //创建一个textview对象 Typeface kaiti = Typeface.createFromAsset(getAssets(), "字体名称.ttf"); tittle = findViewById(R.id.textView); //通过iu绑定到ui tittle.setTypeface(kaiti);//设置字体

February 12, 2021 · 1 min · 晚晴