分类 未分类 下的文章
对分页和瀑布流的UI呈现的再次理解
之前对分页和瀑布流的理解比较简单, 就是手机滑动更适合瀑布流而电脑点击更适合分页. 今天才发现自己想简单了.
确实, 电脑上鼠标拖拉和滚动都不如手机上的手指滑动操作方便.上滑就特别适合加载新的数据.
但是,数据呈现的目的是不同的,两种方式各有优劣. 虽然瀑布流在手机上发扬光大, 但两者不是以手机或电脑来区分的.
我最近做的小程序, 需要呈现很多数据, 并且这些数据还需要增删改查. 因为是手机用, 我想当然认为瀑布流体验更好(当然实现难度也大), 就选择了用瀑布流.
然而近期发现一些问题, 用户反馈有时候数据会乱, 常常是重复. 查了下不是数据库的问题, 而是界面呈现的问题. 当然这种情况重新进入小程序也能解决. 我增加了一些控制, 在从数据库取数据的时候禁止用户操作, 但只解决了一部分问题.
最近打算用js面向对象的方法重构这部分代码, 写到增删改查的时候想到了这个问题: 在UI设计中, 瀑布流的方式是否适合呈现有大量数据的增删改查的页面?
如果增加了一个数据, 需要考虑这个数据增加的位置. 如果增加的数据排在前面已经显示的数据中, 那么就要重新请求已显示的数据. 但数据库的查询是按分页进行的, 我应该请求哪些分页? 似乎从数据增加位置之后的分页都要请求. 那么新数据增加在第几页? 需要计算,且计算结果必须和数据库自己的排序计算结果一致. 如果请求这之后的所有分页,有可能数据量非常大. 而且界面现在显示了N页, 增加1条数据变成了N页+1条, 而数据库是按页请求, 这样又不对齐了, 显示的最后一条数据要么从显示中删除, 要么再请求一整页.
删除有同样的问题. 修改操作如果修改的是排序的依据, 也存在新数据排到了哪儿的问题, 新旧位置之间的数据都要更新,或者用算法保持与数据库端一致.
这个逻辑就会变得复杂. 根源是: 数据库是按照分页方式请求的, 前端的增删操作导致前端数据和数据库数据无法对齐. 需要大量操作使两端对齐, 耗费本地计算和带宽, 感觉很不经济.
用分页就解决了, 非常简单, 增删改查后, 只要再次请求当前页就好了!即便是删除数据导致当前页消失, 也很容易计算到最近还存在数据的页是第几页.
这个问题抛给了metaso和gpt4o,两者都给出了否定的回答, 都指出分页更适合.
根据metaso给出的链接参考: https://blog.csdn.net/weixin_64051447/article/details/129420444, 其中有一个引文很重要:
滚动是延续,而点击是决定。—— Josh Porter
瀑布流就是为了不断地让用户看新的东西(新数据不断延续没有终点), 而点击是用户自己决定要看哪一部分东西.
所以瀑布流适合给用户不断地灌输新的数据, 而分页适合让用户管理数据.
贴一下gpt4o的回答, 我觉得总结得挺好
gpt4o的回答
在UI设计中,瀑布流(也称为无限滚动)是一种常见的布局方式,尤其适用于展示大量内容,例如图片库、社交媒体动态等。然而,这种布局方式在某些场景中可能并不合适,特别是在需要对大量数据进行增删改查(CRUD操作)的页面上。
瀑布流布局的优势:
- 用户体验:用户可以不间断地浏览内容,不需要经过分页的过程。
- 视觉吸引力:对于展示图像、视频等多媒体内容时,瀑布流能够更好地利用屏幕空间,看起来更加美观。
- 加载效率:通过懒加载技术,可以动态加载内容,从而减少初始加载时间,提高性能。
在增删改查页面中使用瀑布流可能的问题:
- 可查找性差:当用户需要查找特定数据时,瀑布流不如分页结构直观。无限滚动让定位特定记录变得困难。
- 数据管理复杂:频繁的数据增删操作可能导致数据的顺序和显示出现问题,需要复杂的逻辑进行维护。
- 浏览状态难以保存:用户在进行编辑后需要返回列表时,不容易恢复到之前的浏览位置,这会影响用户体验。
- 性能问题:随着数据量增加,长时间滚动会占用更多内存,可能导致性能下降。
适合增删改查页面的替代设计方案:
-
分页设计:
- 每页显示固定数量的数据,便于管理和查找特定记录。
- 提供清晰的导航条,让用户能够快速跳转到不同页码。
-
列表视图和表格视图结合:
- 使用表格视图提供清晰的数据结构显示,便于排序和筛选。
- 提供简单直观的数据操作按钮,例如新增、编辑或删除。
-
搜索和筛选功能:
- 提供强大的搜索栏和筛选条件,让用户能够快速找到所需数据。
- 动态更新结果,提高交互效率。
-
分区加载:
- 结合懒加载技术,仅在用户需要时才加载更多内容,但采用明确的分段结构,而非无限滚动。
综上所述,对于有大量数据且涉及频繁增删改查操作的页面设计来说,更建议采取分页设计、结合列表和表格视图,以及提供强大的搜索和筛选功能来提升用户体验。瀑布流布局虽有其独特优势,但在这种场景中并不是最佳选择。
用jest测试微信小程序
jest也是微信官方推荐的.
最简单的方式: jest安装后, 在目录下运行jest
就可以. 它会搜索当前目录和所有子目录,并运行*.test.js
结尾的所有测试,并汇总.
对于微信中的一些全局模块如wx
, 需要mock. 在测试目录下建立__mocks__/
目录, 所有要mock的都放在这儿. 如放个wx.js
在*.test.js
中, 对全局的wx赋值global.wx=require('__mocks__/wx.js')
.
wx.js
使用module.exports
导出即可.
除了自己直接写mock模拟的函数外(如写一个wx.cloud.database = function mockFunc(){}
的mock函数), 还可以用jest的mock函数const mockFunc = jest.fn(函数体);wx.cloud.database = mockFunc
. 这样被mock的函数就会自带统计和记录功能.
如:
- 统计mock函数被调用的次数
mockFunc.mock.calls.length
- mock函数第n次调用时的第x个参数值
mockFunc.mock.calls[n][x]
- mock函数第n次调用的返回结果
mockFunc.mock.result[n].value
- mock函数最后一次调用的第一个参数
mockFunc.mock.lastCall[0]
- 对class的mock, 同样可以使用
new
const myMock1 = jest.fn();const a = new myMock1();
- mock函数定义每一次的返回值,并且尅循环调用
mockFunc.mockReturnValueOnce(10).mockReturnValueOnce('x').mockReturnValue(true)
- mock模块的异步Promise返回值
import axios from 'axios';
jest.mock('axios');
const users = [{name: 'Bob'}];
const resp = {data: users};
axios.get.mockResolvedValue(resp);
- mock一个模块的部分函数和值
刘国梁备战巴黎奥运前接受采访说的几句话, 反传统但适合于任何事
五块金牌是留给勇敢者的, 智慧者的, 发挥最好的人才配得上.
阅读理解: 勇敢和智慧, 即胆识
. 主观的胆识才能遇到和抓住客观的机遇. 发挥最好, 也就是说能力最强并不能拿到冠军, 要临场发挥最好. 也就是说, 我们自己每个人恃才傲物, 觉得自己能力很强, 但只有在实战中发挥出来, 才能赢.
你面面俱到, 练得没有漏洞是不可能的, 只是在这些当中, 能够提炼出重点, 把这些得分手段精益求精, 把短板,把对手抓你的地方有所突破, 有所改善.
阅读理解: 面面俱到没有漏洞等于不可能. 所以没有人是完美的, 不要完美主义. 那要怎么做? 要把重点的得分手段去精益求精, 把短板(是指对方攻击自己的点)有所突破和改善. 这和木桶理论有一点矛盾, 或者说, 和用木桶理论作为解释一切的手段有矛盾. 木桶理论说最短的木板决定装水的容量, 所以要把所有的短板都补长, 所以要方方面面每个木板都做高, 做完美. 木桶理论有什么问题? 木桶是装水的, 不让静态的水流失的手段,所以木桶理论仅仅是防御静止的成果流失的手段, 只守而不攻, 并且是不去区分地防守. 个人资源是有限的, 环境是动态变化的, 而完美是不可能的, 把所有资源都投入防守, 面对动荡变化的环境, 最后只会成果越来越少,就像拎着装水的木桶在疾驰在颠簸路面上疾驰, 木桶上下翻滚, 然后我们的精力却全部放在修补木桶的短板上. 回到刘教头的话, 短板只能是有所突破和改善就很好了, 并且要补对手攻击自己的短板, 如果自己知道的弱点而别人不知道, 无法攻击也就无所谓去弥补. 面面俱到不可能, 要加强得分手段, 也就是要攻击对方, 要得分, 要开源, 而不是只是固守现有的成果. 所以, 强调木桶理论很容易故步自封陷入完美主义, 防御不存在的假想敌. 开源节流, 不能只节流不开源. 并且要突出自己的优势去开源, 去最大可能地发挥优势主动去抢夺(市场/资源/分数). 对于短板的修补要有针对性, 争取突破改善, 而不是要把短板做到最好. 短板之所以是短板, 就是自己天生或习惯弱于对方的, 补短板是事倍功半, 要补, 但要在自己有限的资源下看性价比.
会打球和会赢球是两码事
阅读理解: 能力强和能成功是两码事. 自己很强, 会很多事情, 很勤奋, 但就能成功吗? 两码事. 所以不要总是想着自己多强,或者把资源都投入让自己变强. 是不是很反传统? 除了变强,还要去赢. 强为什么不等于赢? 还是因为"强"是静态的,是此时此刻的一个状态, 而"赢"是动态的, 是竞争,是争取, 是随机应变. 如果不能随机应变,发挥自己的强, 适应竞争的环境,打败现实的对手(而不是想象的不存在的对手).
在赛场上的时候, 侥幸和犹豫, 想赢怕输, 这是失败的根本.宁肯坚决地错,也不犹豫地对. 因为你坚定下来的东西一定是你的认知.
阅读理解: 坚决地错, 很反传统. 传统有道是"三思而后行",但这未必是对的. 坚决地错和犹豫地对有什么根本区别? 坚决就是出自自己的认知, 犹豫就是混杂了别人的想法. 因为对别人的想法理解不通透, 所以即使是对也不知道为什么对, 又因为与自己想法的冲突, 因此犹豫.但在赛场上, 在战场上商场上, 一是没有时间给你犹豫, 二是没有足够的信息给你犹豫, 在那一刻必须做出尽快的决定, 无论对错. 如果是错的, 也是事后有了结果,有了充足的时间再去分析, 然后纠正的改善的是自己的认知, 而不是去简单听从别人的意见.所以, 坚决地错, 就是坚定执行自己的认知, 即便是错误的, 也是改善自己认知的机会. 如果没错过, 也就不可能提升自己的认知.
如果你在犹豫的时候,其实你怀疑的是自己,把位置摆低,去拼这五个项目,而不要去守.
阅读理解: 去拼,不要去守. 是换个方式讲上面说的
得分手段精益求精
.得分
就是要进攻, 进攻才能开源, 开源才有节流的资本, 才有能守的对象. 然而, 在激烈的竞争中, 主动进攻胜于被动防守. 被动防守总是容易消极的, 盯着自己的错误而不是别人的错误, 只能防止资本的减少而不能增加资本.
实现梦想,不留遗憾, 相信自己,相信团队.
阅读理解: 这句话虽然是末尾的一句祝福打气话, 但是也是再一次强调了前面说的话. 实现梦想不留遗憾, 也就是要去拼, 做自己想做的. 相信自己也就是要坚定和实践自己的认知. 相信团队, 做很多事情都不是一个人能完成的, 如果是一个团队去做, 要彼此信任才能减少不必要的内耗.
自定义微信小程序导航栏
默认的导航栏NavigationBar不支持触摸事件, 需要自定义导航栏. 官方社区有个文档可以参考https://developers.weixin.qq.com/community/develop/article/doc/000a8c989307888cbe1abbf675f413
以下是gpt4o的回答.
在微信小程序中,原生的导航栏(通过 navigationBarTitleText
等配置项定义的顶部标题栏)本身不支持直接添加点击事件。不过,你可以采用一些变通的方法来实现类似的效果。
自定义导航栏
你可以通过自己编写一个自定义导航栏组件来实现点击事件。这通常涉及隐藏原生导航栏,并在页面顶部放置一个自定义视图组件。
隐藏原生导航栏
在 app.json
或单个页面的 json
文件中,将 navigationStyle
设置为 "custom"
。
{
"navigationStyle": "custom"
}
创建自定义导航栏
创建一个自定义组件,例如 custom-navbar
:
custom-navbar.wxml
<view class="navbar">
<view class="navbar-title" bindtap="onTitleClick">{{title}}</view>
</view>
custom-navbar.wxss
.navbar {
height: 40px;
background-color: #fff;
display: flex;
justify-content: center;
align-items: center;
}
.navbar-title {
font-size: 18px;
}
custom-navbar.js
Component({
properties: {
title: {
type: String,
value: '默认标题'
}
},
methods: {
onTitleClick() {
// 自定义逻辑,比如跳转或者弹出提示等
wx.showToast({
title: '标题被点击了',
icon: 'none'
});
}
}
})
在页面中使用自定义导航栏
page.wxml
<custom-navbar title="我的标题"></custom-navbar>
<view class="page-content">
<!-- 页面内容 -->
</view>
这样一来,你就可以在自定义导航栏中处理各种点击事件,完全掌控其行为和样式。此外,自定义导航栏组件可以反复使用,还能根据需要灵活调整。
学习小红书
先是介绍了newrank 新红网站, 可以搜索小红书的一些数据. 和小红书官方的蒲公英类似. 注意不是千帆, 千帆是卖家订单管理.
新红虽然是非官方, 数据刷新肯定不如官方及时, 但是比蒲公英的数据肯定更全面的. 蒲公英的目的是要推荐商家与博主合作, 并且管理自己与博主合作的笔记, 所以像是笔记版的1688, 包括筛选博主, 筛选笔记,管理合作的笔记. 所以是没有全局的数据的, 比如某一个类别的整体数据表现. 当然单个博主的数据还是挺全面的. 包括其笔记内容和粉丝画像等.
新红和蒲公英对比
数据 | 新红 | 蒲公英 |
---|---|---|
大盘数据 | 有, 种草流量大盘可看到类别下面的商业笔记和种草达人数量, 计算含商量 | 无 |
博主筛选,找对标账号 | 有, 找红人-红人搜索 , 按作者类别/ 粉丝数/ 进行筛选.列表中可以看到合作品牌数 |
有, 在寻找博主-博主广场 中, 可以按内容类目/ 粉丝量搜索. 但合作的笔记数需要点入博主详情页, 笔记案例-按笔记类型-合作笔记 中查看, 也可以看近期传播表现-近90日 查看笔记数据 |
课程内容
这一节说定位和赛道,我认为本质还是降本(成本维度)增效(变现维度),另外看自身能力(能不能做)和优势(做的比别人好).
除了上面的优势外, 还有所谓养成号
,如挑战减肥多少斤第N天.
赛道: 主题 .
三类赛道:
- 观点: 心理学,情感等,输出价值观
- 类目: 类似电商类目的选择
- 人设: 经营自己,相对较难
变现: 广告/咨询/社区/群聊
评估广告变现能力:
- 不同赛道的含商量, 大牌不太在乎变现, 可能只想种草. 对应一个垂类市场变现能力就强
定义含商量: 商业笔记数量/种草达人数量 种草大盘
如 影视综: 6345/63110 = 0.1商业笔记(报备)/种草达人.
科技互联网 0.03, 美妆: 0.3 健康养生:0.4 职场: 0.01 旅游: 0.05 家居家装: 0.1 运动健身: 0.08 摄影摄像: 0.01 情感星座: 0.1 科学科普: 0.04 母婴 17w/79w=0.23 美食: 0.05 生活: 0.08 交通工具 <0.01 教育 0.03
小博主主要走非报备. 报备:非报备=1:1
- 对标账号的变现能力分析
举例账号: 内在小孩关爱计划
teacher账号 阿言roy(地方的MCN) 挪威Talk
其他 魏知新(No1 麻瓜MCN)
搭建人设
个人优势转化为他人价值(1. 利他; 2. 观点引发共鸣)
个人简介: 1. 介绍成就; 2. 经历; 3. 账号主要内容; 4. 联系人/Slogan
小红书主页经营:
头像/背景/介绍/打卡瞬间/封面 (这些都是告知算法自己是什么账号)
深耕.不单单是重复,还要做深.
商家倾向于投中小博主(1~5W)
红人搜索:作者类别
维系微信和小红书群。小红书群用于转发点赞,微信群用于聊天。
图文还是视频?答:从图文转视频。
知识类成本<非知识类的成本
单一场景<多场景
xx 100个系列
数码赛道抽奖比较容易提升点赞
标题反复强调相同的点,形成强化
呈现形式带植入点(产品植入)就容易变现广告
利用社会资源降低成本
要判断选题吸引观众的原因:是标题文字还是封面图片?
笔记分为两种:冲流量和粉丝的笔记(未来隐藏)和长期呈现的
笔记要写得扎心
观众为什么要点进来形成流量?奔着热点话题.
一开始不要打造差异化,先形成足够的用户(做好模仿),再去差异,筛选出用户。
小红书选题策略
- 流量选题
- 人设选题
- 商业选题
选题需要挖掘而不是去凭空想
自动化:在发现页找选题:点赞高的题目->搜索->看其中有多少点赞高的->看点赞高的作者粉丝数是否低->给出评分。最后要排除封面太好看点进来的。
点赞高有三个原因:1选题好,2粉丝多,3封面靓。要去排除2和3,找到仅因为选题好而获赞的选题。(粉丝少但流量高)
新鲜度:区分是最近的流行爆款(一个月内)还是长期的爆款(年年有)
建立选题库
通过tag寻找。点击tag->筛选->最热->回到上面的路径,找低粉高赞的选题。
通过笔记灵感寻找。小红书“创作服务平台“->笔记灵感->最热。有点接近于笔记灵感
同样的选题反复讲。 看到还有个区别是内容更加真诚更容易吸引人。
新红查找法(付费的)。新红中按互动量排名搜索。
还可以按爆款笔记排行榜查。
火过的选题还会再火,过段时间再次做。
C语言Struct+Flash实现类似JSON配置文件的方式
JS中存储JSON只要简单的将object stringify以后写入文件就可以. 反过来读取就是读入文件为字符串再parse.
C语言如何实现配置文件呢? struct当然是最像json的了, 保存就用Flash.
这儿需要注意struct和flash的麻烦之处.
struct的成员变量无论是什么类型,都需要内存地址对齐. struct变量所占内存是连续的, 且大小可以整除最大的变量类型大小. 比如 struct{char a; long b;}x;
那么sizeof(x)
不是1+8=9,而是16. 这样如果flash寸土寸金就会显得浪费, 此时可以都用char存储. 这样存储时为了提高内存访问效率, 可以看这篇文章的解析, 有图示.
另外,struct类型的变量名不是地址, 如上面的x,要访问这个变量的地址需要加&,如&x
. 这和数组就很不一样. 数组的变量名就是数组的地址. struct变量名其实更像普通变量.
flash 在前面讲过了, 每次写入需要擦除, 擦除需要整个扇区.
简单的做法, 就是把struct转为空指针, 并按大小存储到flash中. 读取也是同样.
MCU Flash开发的诸多坑
存储数据必然有读和写. Flash当然也有. 但是, Flash的写是非常特殊的, 会引出一系列问题.
- 首先, Flash数据只能从1改为0, 那就意味着写以前必须得先把要写的字节都变成0xFF. 还好, 一般都会提供一个erase擦除的函数.
- 然而, 擦除操作必须要擦除整个sector! sector(一般翻译为扇区)是flash的最小单位, 具体多大看设置, 从512B到4K不等. BL2028N上有一个
_MAX_SS
和_MIN_SS
的宏定义, 默认为512, SS是Sector Size的简称. - 所以如果你要写, 那么你需要擦除整个扇区的数据. 如果你不擦除, 那么你写的结果事实上是和当前扇区上的值
相与
的结果
参考这个STM32 Flash读写的说明, 写数据要经过解锁-擦除-写入-上锁
四个步骤.
所以正常来说还是用一个flash的库比较好, 比如easyFlash.EasyFlash在2019年v4.0以前只支持字符串值的读写. BL2028N使用的easyFlash正好是2018年的, 只能读写字符串.
将使用JSON.stringify将对象中的函数也作为字符串输出
感谢AI给出答案啊, 非常有用, 尤其是在第三方文档跟一坨屎一样的时候,还不如直接看原始代码.
var obj = {
name: "John",
age: 30,
city: "New York",
myFunction: function() {
console.log ("Hello");
}
};
// 自定义replacer函数
function replacer(key, val) {
if (typeof val === 'function') {
return val.toString ();
}
return val;
}
// 转换为JSON字符串
var jsonString = JSON.stringify(obj, replacer);
console.log (jsonString);
输出的json复制到vscode里格式化一下, 就能读了
命令行端纯文字网页浏览器browsh
linux上有很多, 但几乎都不支持js. 包括:lynx elinks links w3m w3m-img等
links使用特殊的编译模式从源码编译的话, 可以支持JavaScript http://links.twibright.com/user_en.html#ap-javascript . 但是links没有默认支持js的原因也是bug太多.
然后就出现了这个神器: browsh, 不但能运行JavaScript, 甚至还能显示图片看视频!
windows上支持得有问题. 可以用docker: docker run -it browsh/browsh
需要firefox在后台运行. 原理其实是将图片和视频转换为最接近的字符. 不过也超级牛X了.
快捷键: https://www.brow.sh/docs/keybindings/
但是对中文的支持有很多问题. 很多文字缺失了.仔细看了下, 都是只显示奇数而不显示偶数, 如"下载百度APP"只能显示为"下百APP"
借古喻今之一下
上次辞职的是谪仙人
谪仙人就是李白,你猜到了吗
李白四十岁左右到了长安,这个称号是贺知章给他起的。贺知章这时候年纪已经很大了,马上也要辞职:不过是告老还乡。他看了李白的文章惊为天人,给他送个外号:谪仙人,也就是被贬下凡间的神仙。李白诗仙的名号大概就是从这时候来的。贺知章告老还乡前给唐玄宗李隆基推荐了李白,李老板先是给他翰林院供奉的职位做着,主要就是做做文宣写写稿子。有一天李老板坐在沈香子亭里,忽然情绪来了,召集李白来应景谢谢文章,谁知道把李白弄过来,他喝多了还没醒。给凉水洗把脸弄清醒了,李白下笔成文,皇帝惊为天人。又有一次,李白又又又跟着皇上喝多了,结果让高力士给子脱鞋。高力士哪受得了这个,后来就通过杨贵妃说李白坏话。后来李老板要给李白升个官,杨贵妃就给拦着。李白也生气,就辞官了。隆基老板还是豪爽,给了好些金子。辞官离开长安这期间,写了《东武吟》,一是用诗赠别好友,二是纪念在皇帝身边这些个日子,三是感叹世事无常,人情冷暖。想着自己能力了得,不输世间英雄豪杰,如今却只能学古人归隐山林。
写这个话题,是想现在爆火的大厂离职文学,腾讯阿里华为字节,进得了大厂自然各个身手了得。一朝离职,一时爽快,后话如何,未来怎样?没有人知道。网上各位吃瓜群众自然是看个热闹,借他人离职宣泄自己的情绪,大概也不会关心后来会怎样。然而太阳底下无新事,大厂离职这些桥段,历史上也必然一次次发生过。与其一时宣泄情绪,不如看看历史。说严肃点儿是以史为鉴,说轻松点儿是找点故事读读,说功利点儿是还能学点老祖宗的知识,享受一点文章诗词的熏陶,岂不是比天天上滑这些看过就忘的笔记帖子要好?至少这历史其中多是真的,那网上说自己如何如何,真真假假还不知怎么分辨呢。
附新唐书李白辞官相关情节。
天宝初...故白亦至长安。往见贺知章,知章见其文,叹曰:“子,谪仙人也!”言于玄宗,召见金銮殿,论当世事,奏颂一篇。帝赐食,亲为调羹,有诏供奉翰林。白犹与饮徒醉于市。帝坐沈香子亭,意有所感,欲得白为乐章,召入,而白已醉,左右以水颒面,稍解,授笔成文,婉丽精切,无留思。帝爱其才,数宴见。白尝侍帝,醉,使高力士脱靴。力士素贵,耻之,擿其诗以激杨贵妃,帝欲官白,妃辄沮止。白自知不为亲近所容,益骜放不自修......恳求还山,帝赐金放还。
借古喻今之一
职场不开心,竟然被老板娘排挤,从顶级大厂离职,准备回乡下隐居!
没照片!没照片!没照片!
老板姓李,国内顶级大厂!辞职不干了!注意,厂子绝对是顶级中的顶级,我不说,用小拇指都能猜到!不是吹,我文字功底特别好,我有个老大哥姓贺,夸我些文章写得好,跟神仙下凡一样!贺大哥在李老板的厂里多年,就跟李老板推荐我去给他写文章,我就这么老板直接面试进厂了!文章好大家就愿意看,给厂子外面的人讲讲我厂的好事说说李老板的好话,厂子的经营业绩大大提高,老板当然也特别高兴啊!我到了厂子在文宣部,时不时和老板一起喝酒。有一次喝多了,就有些狂了,让老板的高秘书帮我脱鞋。高秘书天天伺候老板家,就感觉我在侮辱他,哪知道我只是喝多了!结果听人说高秘书私下里给老板娘打小报告,老板要给我升职老板娘就挡着不让!我向来性格直,受不了这些气,不让我干我还就不干了!跟李老板辞职了,老板发了笔钱给我。今天就跟几个要好的兄弟姐妹告别了,回乡下隐居去了!最后写篇文章,在这儿发个帖纪念一下。文章就叫《东武吟》吧。
还没猜出来什么厂?唐厂!
以上参考《新唐书》卷二百二列传第一百二十七。评论区猜猜是谁😁😁😁
对雾视屏(远视屏/拉远镜)的体验
体验了宁联眼科的雾视屏2天. 说下体验.
先说下原理和结构. 远视屏有一个Android手机,1个屏幕灯, 两个摄像头,一个主体结构组成.
主体结构有点像一个17寸的显示器,上部放屏幕灯和两个摄像头.摄像头一个对人, 一个对桌面. 主体结构内部是一对拉远镜, 内部下侧放着安卓手机, 屏幕感觉在5~6寸. 屏幕灯的开关是独立的. 主体结构右侧有音量加减/信号切换/亮度/开关键. 后侧有1个hdmi,2个USB-A口, 1个type-c电源口. 电源是最大输出12V 3A.
功能上, 可从HDMI输入显示, 也可以切换内部安卓系统显示(通过信号切换键), 内嵌了一些护眼应用和学习应用.
主要原理就是把安卓屏通过拉远镜拉远.
拉远镜中的图形有一些畸变. 像是看投影在球体内侧的图像一样.
长期使用有些头晕的感觉.
拉远镜中的虚像应该是比较远, 是不是平行光不太清楚.感觉好像很大, 但用相机靠近主体结构同时拍虚像和原安卓屏幕, 发现大小竟然是一样的.
但是距离主体结构不同的距离, 在相机中所占的比例是相同的, 而不是像正常景物,随着距离增大而变小. 也就是虚像的视角大小几乎不变.
个人感觉是顾此失彼. 这个屏幕视角宽度, 只有我看我14寸笔记本的1/3大. 小点的字根本看不清. 比如用ps或blender中都有很多小字体,没法看. 也即是虽然睫状肌放松了,但看起来却费力了.
千瓜数据小红书平台2024十大生活趋势报告的解读
原文链接
十大趋势:发疯文学,精神远方,游戏人间, 审慎消费, 玄学药方, 悦己, 新型陪伴, 热衷标签, 小众运动, 慢生活.
这些趋势似乎描述了这样的人: 心情压抑苦闷, 生活忙碌单调, 努力换不回好的回报, 命运无常, 经济拮据, 孤独无助, 无人倾诉, 向往更好的生活体验, 对未来不再抱有幻想, 将目光从幻想中美好的未来收回到当下可以立即获得的新鲜快乐.
小程序端使用css动画
小程序端支持css动画. 虽然应用了@keyframes
会报一条警告, 但事实上又可以使用
/* 定义动画 */
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
/* 应用于特定元素,例如类名为 spin-element 的元素 */
.spin-element {
display: inline-block;
/* 设置旋转的中心点 */
transform-origin: center;
/* 应用动画 */
animation: spin 2s linear infinite; /* 动画名称、持续时间、动画曲线、无限循环 */
}