易栈网-膘叔

浏览模式: 标准 | 列表 | 图文

之前写的一个关于抓西南航空的示例和方案

下面只是一个简单的示例和步骤

1、 首页查询OMA->OGG,点击搜索,会进入结果页,默认显示为第二天的价格,点击日期可以看到每天的价格

2、 这时候的数据有两种获取方式
a) 请求API,通过浏览器生成的header头来请求,可以用webdriver模拟,速度较慢,但请求一次之后,可以得到API的数据。后续可以用这个API方式来模拟请求
b) 点击页面后,数据存储在sessionStorage中,通过解析sessionStorage来获取时间和价格
3、 在route map页面,任意选择两个地点,只要能够到达,基本上都是通过API来获取数据
---时间较短,没有细弄,现有的数据均通过python+selenium (with chrome)来获取。
针对2.1的方法,因为不可能一直使用chrome来抓取数据这样效率太低了,现在是做了一个测试,是可以通过加载chrome的prefLog,从LOG里找到请求/shopping的数据(也就是首页点击search以后的实际请求)。将对应的参数全部拉取出来。再使用python的Requests进行模拟请求,以获取实际的json数据。
后续又重新拉取了一份:直接将请求第二页的数据拉出来:
即,这些数据就是请求 json的结果,数据首次返回的时候是存在sessionStorage,结果如下:
看起来并没有太复杂的,但其实确实是踩坑不少,比如,你如果是直接用selenium来请求,就会被判非法、IP地址不太正常的情况被判非法、请求速度过快被判非法、直接请求页面也被判。
也是在经历了1天多之后,才相对比较稳定的抓取了指定线路的数据,后面因为被人嘲笑说就这?然后想想就放弃了,没必要,又不是靠这个吃饭,贴一下做个记录
将Typecho/Wordpress/以及一些其他开源相关的迁移了

将Typecho/Wordpress/以及一些其他开源相关的迁移了

如题,将Typecho/Wordpress等一些开源相关的内容,迁移到https://blog.neatcn.com了。当前的Sablog等域名迁回来,以及备案备好后就准备放在国内了。laravel的重构版其实已经完成了80%,又废了;基于typecho的迁移其实也写好了,但因为解析code相关的内容不太完美,也是写好但使用它。

inertiajs for laravel,用来写博客怕影响SEO,才是我短时间内放弃的原因之一~
不管怎么样,再找一个好皮肤就迁过去了(等备案下来再说,最近上海的管局好象是放假了?)吐血中
Error in render: "Error: Ziggy error: 'project' parameter is required for route 'projectPage'."

Error in render: "Error: Ziggy error: 'project' parameter is required for route 'projectPage'."

在使用Ziggy的时候,偶尔会报类似的错误:

Error in render: "Error: Ziggy error: 'project' parameter is required for route 'projectPage'."。
仔细看出错的路由,往往都是有必要参数的,比如Route::any('/test/{user:uuid}',[UserController::class,'test'])->name('test')
象这种路由,如果在JS中直接获取route().current()来获取当前路径并显示,那肯定就会报错。因为current()方法是将参数和路由一并显示出来。
route(route().current())这样的报错怎么处理呢?
其实,只要加上params参数就行了,例如:route(route().current(),route().params).toString(),为什么会有这么妖的写法?是因为在公众号的网页里,如果你要用jssdk,就必须是当前URL,如果不正确,获取的签名也就可能是失败的,因此,才想到用这个恶心的方法。当然你也可以用location.href...
找了台4c8g的机器装了sentry

找了台4c8g的机器装了sentry

sentry这个东西吧,你要不用它,其实也可以只是用它的话呢,你能收集到更详细的信息。平时的错误日志可能是会散的,比如你nginx访问返回500,这时候你还得看程序出错的异常,对应那个时间段 。然后如果当时记录的信息不够详细,你还要倒推,请求了哪些参数,能不能复现,这些参数有没有更方便的请求,带了哪些cookie,有没有session。烦

有了sentry之后呢,这些出错信息,自然也就都带过来了。至少看到出错日志的时候,我能够知道出错行数、出错内容、请求来源、以及请求的参数。甚至还有curl的代码给你。让你可以模拟请求进行复现。
为了装sentry。真的是很痛苦。因为之前买的小鸡都一般是2c4g。对于开发Web来说,2c4g足够了。但sentry要求,至少4c8g,20G空间。20G空间是小事。。。但4c8g真的太贵了。。。腾讯轻量云年购老用户5.5折都要1680一年了。心痛啊。
不过看在他可以收集:flutter、vue以及laravel的错误日志上,我还是购了一台。毕竟网页里的vue出错了。我没法让用户告诉我你打开f12把错误信息截个图我。。
先试试看用一年再说了。为自己的线个项目都建一个project。看看能不能改善现在的开发情况。
---
本来也想用官方的服务的,但sentry.io有时候访问还得爬梯子,速度也不尽如意,创建项目也没有那么多。所以才想了自建,就是成本高了点
rpm数据库修复

rpm数据库修复

因为偷懒,在腾讯云上使用的时候,就直接用了bt面板的镜像,这个镜像用的是centos,也因此就有了yum 和rpm数据库的问题。

因为某次在更新的时候嫌慢,所以直接ctrl+c,然后。。。再次启动的时候就:
yum update
错误:rpmdb: BDB0113 Thread/process 8643/139904725112896 failed: BDB1507 Thread died in Berkeley DB library
错误:db5 错误(-30973) 来自 dbenv->failchk:BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
错误:无法使用 db5 - (-30973) 打开 Packages 索引
错误:无法从 /var/lib/rpm 打开软件包数据库
CRITICAL:yum.main:
Error: rpmdb open failed
---看这个样子,就是数据库坏了。
看起来没什么特别好的办法,只能重建,于是:
# mkdir /var/lib/rpm/backup
# cp -a /var/lib/rpm/__db* /var/lib/rpm/backup/
# rm -rf /var/lib/rpm/__db.[0-9][0-9]*
# rpm --quiet -qa
# rpm --rebuilddb
# yum clean all
yum clean all运行完后会显示 :
已加载插件:fastestmirror, langpacks
Repository epel is listed more than once in the configuration
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
正在清理软件源: centos-sclo-rh epel extras os updates
Cleaning up list of fastest mirrors
至此,修复完毕,因为用的腾讯云,所以直接将源切到腾讯:CentOS (tencent.com),先用yum version看看版本,然后下载相应的repo。最后运行:
yum clean all
yum makecache
世界清静了
引入unplugin-auto-import无效

引入unplugin-auto-import无效

前段时间用React,这段时间用Vue3(用uniapp写小程序的时候也尝试切换到vue3了),本来觉得很累的,毕竟在每次使用都要import {vue} from 'vue'之类的,在使用了unplugin-auto-import插件后,真的少写了好多。但也要看unplugin-auto-import是不是支持。

比如我现在直接引用了vue,象现在onMounted/ref等都不再定义了。
然而刚开始的时候却是怎么都没法用,这时候才发现虽然我代码都是用JS写的,但auto-import插件是ts写的,必须要引入typescript组件,然后他才生成一个:auto-imports.d.ts的文件,这时候配合<script setup>这个所谓vue3的黑魔法,才是妥妥的。
没什么大东西,就是这么记录一下
华为平板M5的webview的一个BUG

华为平板M5的webview的一个BUG

用flutter的webview来展示一个数据页面,因为这个页面如果用原生开发,得费不少时间,而且中间还要显示图表,也可能随时要调整,所以最后改用了webview。

项目是检测内容的结果,因为要检测七大类,每个类都有一个图表和相应的数据呈现,但因为设计稿已经预先有了外框结构,因此内嵌的这个webview的宽度大约在800左右 ,触发了tailwind的sm的效果。所以原来一个检测结果 两列显示的,变成了一列,也因此400左右的高度的,变成了800左右,而有7个项目,则成了5600的高度。
利用webview的jschannel,在resize获取到高度后通过postmessage发送回flutter,flutter获取高度后再setState一下。看起来没差,在小米上很轻松的就显示了。但华为的机器就是不行。中间一块黑屏。
查看LOG,发现一堆bindTextureImage的错误,抛的异常也是Exception updateTextImage,可是我页面上并没有TextImage,所以就开始怀疑Webview了。之前为什么没有怀疑呢,就是因为其他页面上的webview是正常的。
1、将元素中用到Image的先屏蔽一下,仍然报错
2、将webview禁用,无错
3、打印postmessage的值,发现是49xx左右 ,于是强制设定webview的高度为1024,正常
4、不停调整webview的高度,直到3200左右直接黑屏
5、本来在考虑是否用Scrollbar,但事实上因为这个页面的设计稿正好将检测报告放在正中,四周都有内容,不方便全屏到底
最后,将检测报告改用tabbar的HTML来展示 。这样单个Tabbar的高度就算扩展到1000左右也不影响显示,经过测试一切正常。
华为这台机器真LOW啊,然后查了一下,海思960s,还是960的降频版,内存4G,鸿蒙2.0,用了大概3小时,无故大崩了3次,其中2次重启一次是refresh。虽然这是2~3年前的机器,但这也太。
navicat连接腾讯云轻量数据库的一个小坑

navicat连接腾讯云轻量数据库的一个小坑

买了腾讯云的轻量数据库,便宜(其实现在和直接买1c1g的数据库也差不多了)。在做数据迁移的时候直接用了navicat的data transfer(这功能真方便)

因为数据库不大,只有2~300M,用datatransfer走起来非常快。基本上3分钟左右 就搞定了。如果我dump sql,再upload & import sql,反而比这个速度还要慢一点。
然后问题就来了,查询的时候,全是乱码,这个很明显,是latin1的问题了,于是上数据库 执行了一下:SHOW SESSION VARIABLES LIKE 'character\_set\_%';果然
character_set_client latin1
character_set_client_handshake ON
character_set_connection latin1
character_set_database utf8mb4
character_set_filesystem binary
character_set_results latin1
character_set_server utf8mb4
character_set_system utf8
这个就纠结了,即使我set names utf8mb4,用datatransfer也是这个问题。
我导数据过来的那一台,也是轻量级数据库,理论上不应该会有这个问题,于是我看一下connection的相关信息。发现正常的那台,encoding居然选的是auto,而这台不正常的选择的是utf-8,难道是因为这个原因?于是切回auto重连。
再次运行SHOW SESSION VARIABLES LIKE 'character\_set\_%';果然 character_set_client 已经恢复成utf8mb4了。
这个问题也真是妖~
之前没有注意过的tailwindcss的响应式设计

之前没有注意过的tailwindcss的响应式设计

tailwindcss现在用的人越来越多了,大量的flex以及固定的text-[],w-[]等自定义的class,确实让人用起来非常方便,然后在页面上也可以用sm:/md:/等前缀符可以直接设置相应大小屏幕所对应的class。如果class太多太长,还可以用@apply来进行自定义的缩短等

之前一直没有注意,在写一些样式的时候就直接<div class="w-full lg:w-1/2 sm:w-1/2 md:w-1/2" >结果发现在更小的屏幕下无法设置,因为sm:是代表了640px,而象手机一般是320px/414px,这时候就没办法设置了。在想着自定义xs:前缀的时候,看了一下官方文档,结果发现上面有标明一个非常重要的话:【不要使用 sm: 来定位移动设备,而应该使用无前缀的功能类来定位移动设备,并在较大的断点处覆盖它们】参考(响应式设计 - Tailwind CSS 中文文档)。
官方提示:【因此,通常最好先为移动设备设计布局,接着在 sm 屏幕上进行更改,然后是 md 屏幕,以此类推。】
所以其实所有的样式理论上应该都是基于小屏幕写的,而比sm还大的屏幕,反而是需要加前缀进行自定义的。比如你需要小屏幕全屏,中屏幕1/2,大屏幕1/3,应该是这样写<div class="w-full sm:w-1/2 md:1/3" >因为lg比md还大,所以lg反而不需要设置了。
纯记录一下。这一个月我是从vue2写到react再返回vue3,快崩溃了。
手贱,把后台和部分前台从React全部换成了Vue3

手贱,把后台和部分前台从React全部换成了Vue3

如题的手贱,其实也不能怪我啊。react格式化的时候老是将换行或者空格生成了{' '}这样的玩意,虽然我另外设置了快捷键来处理它,但总还是嫌麻烦。把pretty等各种插件装了删,删了装,各种配置都用上了,还是不行。除非不自动格式化。

基于这个原因,我暂时忍了忍,还是先vue3吧。
虽然知道这是配置的原因,但真是短时间内找不到了。项目是laravel+react的,要拆开也不是一下子就OK的。等下个版本拆成独立的再从头开始试吧。
吐血。所幸写的几个重要组件(比如canvas画的图,是纯JS的)不受影响。