普通视图

发现新文章,点击刷新页面。
昨天 — 2024年7月17日obaby@mars

Gunicorn nginx 反代获取真实 ip 地址

2024年7月17日 15:21

闺蜜圈的后台服务使用 gunicorn 运行,对外接口通过 nginx 进行反代。但是反代有个问题,那就是 gunicorn 获取到的服务器的 ip 地址都是 127.0.0.1。

作为一个强迫症能忍受这个?那自然不行啊。

在 nginx 配置文件中增加 proxy_set_header

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

修改 gunicorn 启动参数,修改日志格式为:

--access-logformat='%({X-Real-IP}i)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'

重启 nginx 以及 gunicorn 服务,就可以记录真实 ip 地址了:

参数说明:

h is the remote address
l is - (not used)
u is - (not used, reserved)
t is the time stamp
r is the status line
s is the status of the request
b is length of response
f is referrer
a is user agent
You can also customize it with the following extra variables that are not used by default:

T - request time (in seconds)
D - request time (in microseconds)
p - the process id
{Header}i - request header (custom)
{Response}o - response header (custom)

 

参考链接:https://stackoverflow.com/questions/25737589/gunicorn-doesnt-log-real-ip-from-nginx

嗯,用快影给大姨妈 App 做了一段视频

2024年7月17日 14:59


闺蜜圈–更好用的大姨妈记录APP
你是否遇到过这些健康问题?
月经日期记不清?
总是被突袭手忙脚乱?

久备不孕很焦虑?
备孕套路傻傻搞不懂?
妇科疾病超忐忑?
难以启齿不敢问别人?
闺蜜圈App可以这样帮助你: 精准预测经期。提前2天提醒你月经即将到来,做好准备,安心等月经,越记越准确哦。
智能推算排卵。每日提醒好孕几率,科学安排同房,不浪费任何一次精卵相爱的机会。
权威健康知识。从痛经、量多等经期知识,到炎症、宫颈癌等妇科疾病,再到两性生活态度,你需要的健康知识这里都有;
闺蜜圈,和你一起在乎你!

官网地址:https://guimiquan.cn    https://dayi.ma

闺蜜百科: https://wiki.guimiquan.cn

iOS 版本:

下载地址:https://apps.apple.com/us/app/%E9%97%BA%E8%9C%9C%E5%9C%88/id6470903382

二维码:

APP安卓版本:

下载地址:https://www.pgyer.com/dayima

二维码:

备用下载链接:

https://app.guimiquan.cn

http://uni.h4ck.org.cn

百度应用市场(安卓):

应用宝(安卓):

下载地址:https://sj.qq.com/appdetail/ma.dayi.app

当前版本:2.3.36(应用审核通过后自动更新)

小程序版本扫码体验:

H5 在线体验版:

https://h5.guimiquan.cn

H5 版本二维码:

系统截图:
个人记录:
闺蜜记录:
个人 中心:
昨天以前obaby@mars

死鸭子事件簿之二

2024年7月16日 10:25

周日的时候,收到反馈,说公司对接的一批设备数据批量失效了。所有人的权限在所有设备上都被取消掉了,这并不是第一次出现用户权限莫名奇妙失效的情况,之前的时候局限于个别人,个别设备。解决方案也很简单粗暴,直接重新下发权限。然鹅,这种大面积失效,用户直接炸锅了。

联系设备厂商,厂商问,有那么着急吗? 用户都炸了,你说能不着急吗?终于中午的时候派了技术过来。下午开始查看设备日志,进行一系列的测试工作。

为了保证用户暂时能用,让研发把所有的设备重新下发了用户权限数据。但是,保留了两台,让他们进行调试以及现场故障排查。在折腾了一下午之后,没有得出神马有用的结论,给其中一台测试设备进行升级固件之后,表示要运行测试一段时间看看效果。看他们暂时也拿不出什么更有建设性意义的方案,暂时于其他人合计先这么处理。跟领导汇报后,领导不认可,要求必须给出问题原因。于是只好带着他们的研发继续去现场进行问题排查。终于,在经历了 4 个小时之后,在十点左右,给出了问题的答案,于下午的结论区别不大:

1.我们删除数据,导致数据出现错乱

2.他们的系统于我们的系统共用出现了数据冲突

3.数据下发过快,导致存储过程出现问题。

对于 1 跟 3 我是极度不认可的,也在群里跟他们据理力争。数据删除是经过确认的单个用户权限删除,并且是通过设备方提供的 mqtt 主题进行数据删除,并没有直接修改设备数据。怎么回导致所有设备六十多台,所有用户的权限集体失效?

数据下发也是通过 mqtt 进行主题发布,设备方订阅消息进行权限处理,有哪里存在速度快慢问题?

至于 2,不知道设备上的数据存储逻辑,不好判断。

终于,又过了一个小时,设备方给回了个可能的原因。平台数据于我们的数据可能存在目录一致性问题,导致数据可能出现加载问题。这个结论相对来说比 13 就靠谱了很多,最起码是可能的诱因,但是依然无法解释在一个时间段所有设备全部失效的问题。

跟各种设备方打交道多了,永远不知道对面的水平到底是如何的。如果不懂技术,那么这几个闪烁其词的理由也就搪塞过去了。但是解决不了问题,在自己要求下,设备方今天安排研发过来进行现场调试。

有时候觉得挺离谱的,到底是哪里来的自信,给出这些不着边际的答案。不由得又让我想到了之前另外一个设备方给的算法,

哥哥,不会写文档就 tm 别写,老老实实写代码行吗?

这些莫名奇妙的自信,真的让人很上火。当然,我也没想到这个死鸭子事件薄能写第二件。当然,以后还有第三件,第四件。

于是,人生就让这些死鸭子给浪费掉了!折腾到 11 点,连《2077》都没来得及玩!艹!

 

抄作业–我的设备

2024年7月11日 15:46

今天一个偶然的机会,看到了一个页面,叫做我的设备。感觉还蛮有意思的,整个页面布局类似于商城的样式,下面依次排列的是设备列表。博主也给出了相关的代码,本来是想着再建个魔板页面抄作业的,抄来抄去抄的有点恶心,于是直接在页面编辑代码的方式把作业给抄了。css 样式加到了页面的自定义 css 中。

最终效果:

页面地址:

※我的设备※

页面文本:

<h3 class="entry-title">家庭娱乐</h3>
    <div class="equipment-item-content">
     
        <div class="equipment-item-content-item">
            <div class="equipment-item-content-item-cover">
                <img class="equipment-item-content-item-image" alt="苹果"
                    src="https://h4ck.org.cn/wp-content/uploads/2024/07/Jietu20240711-134623.jpg">
            </div>
            <div class="equipment-item-content-item-info">
                <div class="equipment-item-content-item-name">
                    群晖(Synology)DS420+ 
                </div>
                <div class="equipment-item-content-item-specification">
                </div>
                <div class="equipment-item-content-item-description">
                    规格:四盘NAS系统:DSM处理器:intel核心数:双核类型:家庭网络存储网口速率:千兆内存容量:2GB
                </div>
                <div class="equipment-item-content-item-toolbar">
                    <div class="equipment-item-content-item-toolbar">
                        <a href="https://item.jd.com/100014227684.html#none" target="_blank">
                        <input class="button-primary button-small" type="button" value="已停售" >
                    </a>
                    </div>                    
                </div>
            </div>
        </div>
        
        <div class="equipment-item-content-item">
            <div class="equipment-item-content-item-cover">
                <img class="equipment-item-content-item-image" alt="苹果"
                    src="https://h4ck.org.cn/wp-content/uploads/2024/07/Jietu20240711-134910.jpg">
            </div>
            <div class="equipment-item-content-item-info">
                <div class="equipment-item-content-item-name">
                    群晖(Synology)DS416j 
                </div>
                <div class="equipment-item-content-item-specification">
                </div>
                <div class="equipment-item-content-item-description">
                    最大支持容量40 TB (10 TB HDD x 4) (容量会随 RAID种类而异)
                </div>
                <div class="equipment-item-content-item-toolbar">
                    <div class="equipment-item-content-item-toolbar">
                        <a href="https://item.jd.com/2436399.html#product-detail" target="_blank">
                        <input class="button-primary button-small" type="button" value="已停售" >
                    </a>
                    </div>                    
                </div>
            </div>
        </div>
        

        <div class="equipment-item-content-item">
            <div class="equipment-item-content-item-cover">
                <img class="equipment-item-content-item-image" alt="苹果"
                    src="https://h4ck.org.cn/wp-content/uploads/2024/07/u55586516742018280fm253fmtautoapp120fJPEG.webp">
            </div>
            <div class="equipment-item-content-item-info">
                <div class="equipment-item-content-item-name">
                    海信60E3F 60英寸 4K电视
                </div>
                <div class="equipment-item-content-item-specification">
                </div>
                <div class="equipment-item-content-item-description">
                    60英寸 4K超高清智慧语音 超薄悬浮全面屏 智能液晶教育彩电电视机支持投屏
                </div>
                <div class="equipment-item-content-item-toolbar">
                    <div class="equipment-item-content-item-toolbar">
                        <a href="https://item.jd.com/100007300763.html" target="_blank">
                        <input class="button-primary button-small" type="button" value="已停售" >
                    </a>
                    </div>                    
                </div>
            </div>
        </div>


        <div class="equipment-item-content-item">
            <div class="equipment-item-content-item-cover">
                <img class="equipment-item-content-item-image" alt="苹果"
                    src="https://h4ck.org.cn/wp-content/uploads/2024/07/Jietu20240711-135439.jpg">
            </div>
            <div class="equipment-item-content-item-info">
                <div class="equipment-item-content-item-name">
                    明基(BenQ)TH670 
                </div>
                <div class="equipment-item-content-item-specification">
                </div>
                <div class="equipment-item-content-item-description">
                    1080P分辨率 3000流明 
                </div>
                <div class="equipment-item-content-item-toolbar">
                    <div class="equipment-item-content-item-toolbar">
                        <a href="https://item.jd.com/2079351.html" target="_blank">
                        <input class="button-primary button-small" type="button" value="已停售" >
                    </a>
                    </div>                    
                </div>
            </div>
        </div>

        <div class="equipment-item-content-item">
            <div class="equipment-item-content-item-cover">
                <img class="equipment-item-content-item-image" alt="苹果"
                    src="https://h4ck.org.cn/wp-content/uploads/2024/07/u323258841206501867fm253fmtautoapp138fJPEG.webp">
            </div>
            <div class="equipment-item-content-item-info">
                <div class="equipment-item-content-item-name">
                    美硕电动幕布
                </div>
                <div class="equipment-item-content-item-specification">
                </div>
                <div class="equipment-item-content-item-description">
                    美硕(MEISHUO) 电动幕布4K3D
                </div>
                <div class="equipment-item-content-item-toolbar">
                    <div class="equipment-item-content-item-toolbar">
                        <a href="https://item.jd.com/2079351.html" target="_blank">
                        <input class="button-primary button-small" type="button" value="已停售" >
                    </a>
                    </div>                    
                </div>
            </div>
        </div>

        <div class="equipment-item-content-item">
            <div class="equipment-item-content-item-cover">
                <img class="equipment-item-content-item-image" alt="苹果"
                    src="https://h4ck.org.cn/wp-content/uploads/2024/07/112017_SP708-silver.jpeg">
            </div>
            <div class="equipment-item-content-item-info">
                <div class="equipment-item-content-item-name">
                    iPad Air2
                </div>
                <div class="equipment-item-content-item-specification">
                </div>
                <div class="equipment-item-content-item-description">
                    iPad Air 2是美国苹果公司(Apple)于2014年10月17日在美国库比蒂诺总部发布的一款平板电脑
                </div>
                <div class="equipment-item-content-item-toolbar">
                    <div class="equipment-item-content-item-toolbar">
                        <a href="https://support.apple.com/zh-cn/112017" target="_blank">
                        <input class="button-primary button-small" type="button" value="已停售" >
                    </a>
                    </div>                    
                </div>
            </div>
        </div>

        <div class="equipment-item-content-item">
            <div class="equipment-item-content-item-cover">
                <img class="equipment-item-content-item-image" alt="苹果"
                    src="https://h4ck.org.cn/wp-content/uploads/2024/07/Jietu20240711-142647.jpg">
            </div>
            <div class="equipment-item-content-item-info">
                <div class="equipment-item-content-item-name">
                    dostyle SD306 2.1音箱
                </div>
                <div class="equipment-item-content-item-specification">
                </div>
                <div class="equipment-item-content-item-description">
                    dostyle SD306重低音 2.1音箱音响低音炮 42W大功率 6.5吋低音
                </div>
                <div class="equipment-item-content-item-toolbar">
                    <div class="equipment-item-content-item-toolbar">
                        <a href="https://item.jd.com/747123.html" target="_blank">
                        <input class="button-primary button-small" type="button" value="已停售" >
                    </a>
                    </div>                    
                </div>
            </div>
        </div>

        <div class="equipment-item-content-item">
            <div class="equipment-item-content-item-cover">
                <img class="equipment-item-content-item-image" alt="苹果"
                    src="https://h4ck.org.cn/wp-content/uploads/2024/07/Jietu20240711-142934.jpg">
            </div>
            <div class="equipment-item-content-item-info">
                <div class="equipment-item-content-item-name">
                    OneOdio头戴式6.5线监听耳机
                </div>
                <div class="equipment-item-content-item-specification">
                </div>
                <div class="equipment-item-content-item-description">
                    OneOdio头戴式电钢琴电子琴专用6.5头有线监听耳机吉他音响效果器电架子鼓声卡通用长线3.5mm Pro 10玫瑰金
                </div>
                <div class="equipment-item-content-item-toolbar">
                    <div class="equipment-item-content-item-toolbar">
                        <a href="https://item.jd.com/10025625310218.html" target="_blank">
                        <input class="button-primary button-small" type="button" value="在售" >
                    </a>
                    </div>                    
                </div>
            </div>
        </div>


    </div>

css样式:

/* 我的装备 */
.equipment-item-content {
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
    margin: 0 -8px;
}

.equipment-item-content-item {
    width: calc(25% - 12px);
    border-radius: 12px;
    border: 1px solid #000;
    overflow: hidden;
    margin: 8px 6px;
    background: #fff;
    ;
    box-shadow: 0 8px 16px -4px #2c2d300;
    min-height: 400px;
    position: relative;
}

@media screen and (max-width: 1200px) {
    .equipment-item-content-item {
        width: calc(50% - 12px);
    }
}

@media screen and (max-width: 768px) {
    .equipment-item-content-item {
        width: 100%;
    }
}

.equipment-item-content-item-info {
    padding: 8px 16px 16px 16px;
    margin-top: 12px;
}

.equipment-item-content-item-name {
    font-size: 18px;
    font-weight: bold;
    line-height: 1;
    margin-bottom: 8px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    cursor: pointer;
    width: fit-content;
}

.equipment-item-content-item-name:hover {
    color: #425AEF;
}

.equipment-item-content-item-specification {
    font-size: 12px;
    color: rgba(60, 60, 67, 0.8);
    line-height: 1;
    margin-bottom: 12px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.equipment-item-content-item-description {
    line-height: 20px;
    color: rgba(60, 60, 67, 0.8);
    height: 60px;
    display: -webkit-box;
    overflow: hidden;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    font-size: 14px;
}

a.equipment-item-content-item-link {
    font-size: 12px;
    background: #9999992b;
    padding: 4px 8px;
    border-radius: 8px;
    cursor: pointer;
}

a.equipment-item-content-item-link:hover {
    background: #425AEF;
    color: #fff;
}

h2.equipment-item-title {
    line-height: 1;
}

.equipment-item-description {
    line-height: 1;
    margin: 4px 0 8px 0;
    color: rgba(60, 60, 67, 0.8);
}

.equipment-item-content-item-cover {
    width: 100%;
    height: 200px;
    background: #f7f7f9;
    display: flex;
    justify-content: center;
}

img.equipment-item-content-item-image {
    object-fit: cover;
    height: 100%;
}

div#equipment {
    margin-top: 26px;
}

.equipment-item-content-item-toolbar {
    display: flex;
    justify-content: space-between;
    position: absolute;
    bottom: 12px;
    left: 0;
    width: 100%;
    padding: 0 16px;
}

a.bber-reply {
    cursor: pointer;
}

参考链接:https://www.naigou.cn/120.html

视频画质增强–从360到4K?

2024年7月10日 22:09

最近在看一部老美剧《CSI》,比较蛋疼的地方在于下载的视频分辨率比较低640*360,基本可以认为是多年以前的vcd的发分辨率,这个分辨率在4k显示器上看,其实是比较糊的。体验并不好,强忍着看完了一季,但是这个观感确实无法让人满意啊,实在是太差了。

一集电视剧只有不到200m,文件格式那就更古老了rmvb。想当初的天下无敌的文件格式,最终也没落了。连realone基本都看不到了,哎,不禁让人唏嘘啊。

 

搜索了一下potplayer可以使用显卡渲染进行实时视频增强,具体参考这个链接:

https://post.smzdm.com/p/akl65ez4/

我就不再抄一遍了,几个下载地址贴一下:

mpc插件: https://github.com/emoose/VideoRenderer/releases

pot player:potplayer.daum.net/

实际效果对比,vlc(未增强):

potplayer(gpu渲染):

pot player 解码器:

感觉有增强,但是没那么明显。

gpu使用率:

渲染等级:

不过感觉一些画面还是有效果的,不知道是不是心里作用,嘎嘎。

抢车位

2024年7月10日 09:52

下午下班之后 xy 过来找我,说明天下午想请天假回趟家。她的弟弟今年中考,但是貌似成绩可能不大理想。即墨的重点高中可能上不了,问我有没有设么办法。大姐家的孩子正好在我们县城的高中上学,要了个班主任的联系方式问了下。被告知现在要想跨市办学籍已经不可能了,只有参加本市中考的才能录取。建议出分数之后一个是看下分数情况,第二是看下投报的志愿都有哪些。虽然学校在即墨有分校,但是如果不在填报志愿内,依然可能无法录取。

学校的政策原来也在一步步的收紧,去年出台的规定禁止跨市区办理学籍。同样在去年的某个时间看我们县城的高中在黄岛也开了一个分校。现在看来应该是长远布局了,不过县城的高中教学还是蛮成功的,名气相对来说也还可以,虽然不如衡水高中神马的,但是在省内知名度还算是比较高的。甚至我们家小宝上高中的时候都想过不行的话就回去读高中。大姐家的孩子在小学六年级的时候就从淄博到了县城读高中,小学建档政策相对来说还比较宽松,转眼间明天这个姑娘也要高考了。

暂时无法得到进一步的消息了,只能等 xy 的弟弟查到成绩之后再做进一步的打算了。一块坐电梯的时候,她说自己的父母在家已经焦虑的不行了,晚饭都没吃。本来她都不想让我给老师打电话的,怕问了没有后续。“焦虑什么啊?现在啥都不知道,不吃饭也解决不了问题不是?电话还是先问一下吧,他们焦虑他们的,你好歹提前了解下另外的这条路通不通也行啊”当然,最后的结果是这条路可能没那么通。

开车回家,到小区的时候已经八点多了。刚进停车场入口,看到左右边有个车位,更让人惊喜的是车位上还有辆电动车,电动车上还有个大姐。

“你在占车位?”我把头伸出车窗问大姐。

大姐也没搭茬,只是机械的点了点头。然后低头继续做在电动车上看手机。

遇到这种占车位的我一向不喜欢与他们纠缠,主要是也没啥意思还影响自己的心情。小区内的长租车位基本轮不到,现在中间的收费车位也是先到先得。基本到了晚上之后就没什么空车位了。尽管如此,之前也没怎么见到过占车位的。既然被占了,那就往南走,路上又看到1.2 个车位,所谓一个半,是两个0.6 个车位加起来能凑 1.2 个,好巧, 这两个车位都停不进去。

继续往上开,直接出停车场停到了路边。停路边的问题就是停车费波动比较大,这么省 6 块钱,要么被贴单子交 100 块钱,这个也是实属无奈了。

到家后,小姐姐问,”你车停哪去了”

“路边啊”我把车钥匙掏出来扔到桌子上。

“本来我想停中间,给你占个车位的。结果发现那个车位停不进去,我就开走了”小姐姐继续说。

“你说的坡底那个吧?我看了,进不去。无所谓,停路边吧”

“可能也就停个小知豆什么的能行。”

小区内虽然租了一个车位,但是最近自己基本天天加班,晚上开车回来就没地方停了,只能打游击。小区内、公园、路边,公园到八点就关门了。所以多数时候只能选择小区收费停车场或者路边。

比较让人讨厌的是那些停车横跨两个车位的,无形的压缩了旁边的车位空间,之前也有几次自己挤进去了,但是发现一个很严重的问题,两侧的车门都打不开,根本从车里出不来。现在也懒得往里停了,停车折腾半天,折腾进去还出不来。而这种人在哪个停车场都能遇到,嗯,真是 tm 无处不在。

啊,呸!

雨天的周末

2024年7月8日 13:22

小雨淅淅沥沥的下了一星期了,也没有停止的迹象。每天早上准时开始下雨,下午偶尔会有出太阳的时候。周六陪宝子上完钢琴课继续来公司加班,周六的加班依然成了常态,不过这次竟然没看到几个人,可能也是连续一个多月大家都累了吧。

下午回家,继续看《喜人奇妙夜》。综艺类节目,出了喜剧类型的其他的基本不看。整体来说节目的体验感还是不错的,尤其是最后的《九九八十一难》。虽然还是西游的故事,编剧以及演员的水准还是在线的,能猜到故事发展,但是依然颇有新意。好的故事,总是能经得住各种演绎。

 

到了晚上,自然是继续电影专题。《疯狂的麦克斯:狂暴女神》,影片比较长接近 3 个小时。但是剧情还是很紧密的,作为公路片,或者说废土公路片,基本达到了自己的预期。美中不足的地方是,这种电影总想着能用投影仪看,但是,家里人比较多的时候。尤其是宝子在家的时候,这种片子是不适合用投影仪看的,暴力镜头过多。也不大适合跟父母一块看。说道这里,投影仪已经又好几个月没开了。

周日早上时间就自由啦。但是还是七点多就醒了。这就让人很抑郁,明明周末可以都睡会儿的,但是讨厌的生物钟啊,还是会准时的让你醒来。爬起来的时候父母正在吃早饭,问怎么这么早就起来了,才七点多。我也不想起啊,但是也睡不着了呢。还是上班的时候好啊,早上根本起不来,有时还得被叫醒才能爬起来。

 

磨磨蹭蹭的做早饭,宝子还没起。时间倒是过得也快,眨眼九点了。窗外的雨还在继续。今天下午的网球课应该是没了,毕竟露天场地下雨怎么打呢。吃饭的时候提议去打羽毛球,宝子也想去,一拍即合。从高德地图上找了个球场打电话问了下,最早的场子是九点到十点,另外一个就是十一点到十二点了。看了下时间八点五十六,嗯,蛮不错的,定了第一场。主打一个不浪费时间。匆忙扒拉了几口饭,换好衣服就出门了,开车过去之后九点十分左右。不算太迟,场地费一小时 70,需要先交费。

一共 12 个场地,定的场地也正是 12 号最后一个。在一个角落上,场地感觉质量还是蛮不错的。上次打球的时候因为场地不平把脚崴了,意外总是不期而至。这次场地的确比上次要好很多。宝子打羽毛球明显还不是很习惯,球拍的长度以及击球的角度和网球多有不同。因而每次发球的时候就没有那么顺利,不过好在慢慢练习之后还是有所进步的,最后也能打那么几个回合了。

不过,偶尔连续几次发球失败,也有情绪崩溃的时候,感觉都要哭出来了,最后还是倔强的坚持,要再发一个。即使在计时结束的最后一分钟,也要坚持再发几个球过往。这种不服输的精神,竟然让我有些恍惚。我总是跟她说没关系,多练习就好了,毕竟也打了没多久。以后还有的是时间啊。回去的路上虽然发球对她造成一定的困扰,但是在我说我们下周可以再来的时候,她还是蛮高兴的。她知道只要自己练习了,肯定会越来越熟练的。

谨慎的孩子,第一次总是容易说:“我害怕,我不敢”。但是经过示范教学之后,上手的很快,动作也很规范。从来也没期望她成为别人家的孩子,有想法,但是没那么强烈。毕竟自己也没有特别要求她去付出一些,多干些什么。滑雪、大滑梯、轮滑、自行车,最开始总是有那么一点点抗拒,上手之后就开始喜欢上这些运动了。虽然才七月,一起开始想着冬天去滑雪了。上学之后表现还算不错。当然纪律可能没那么好。一方面是同桌比较好动。另外一方面有时候可能她自己也很皮。之前因为跟同桌打闹翻脸了,我电话找了她同桌的家长。那种总有刁民想害朕的想法其实一直在我的脑海里,生怕孩子被欺负。也不断的教育她勇于反抗,该动手就动手,自己不好动手,我也可以动手去解决这些问题。周五下午家长会,三点半的家长会,三点十分从家里出门。结果发现车被堵住了,打电话让等会儿,这等会儿谁知道要等多久呢?开启狂奔模式,从家跑到了学校,终于气喘吁吁跑到学校。看到成群结队的家长正在往教室走,觉得自己应该是没有迟到,刚好提前五分钟到到,教室里家长已经基本都到了。做在课桌前,翻阅课桌上的考卷。老师讲了讲试卷没让带回去。成绩还算不错。数学英语 100,语文 98。最后的小作文,少了描述事情的地点被扣了两分。不过不得不说,英语最后一题的小黑狗是真的黑。

其实想来已经算是不错了,没有特别的要求去做一些离谱的作业。虽然晚上经常吆喝:“我都没时间玩了”但是,玩的时间还是蛮多的。偶尔因为练琴或者斑马英语会占用点时间,整体来说并没有剥夺太多的玩的时间。周六的时候,让我帮忙在她的手表玩兜兜龙的 pk。帮她赢了两场之后他很开心,得到了一个桃子种子。就给种下去了。她说她的同学都好多了。还有每日闯关。打开每日闯关看了下,竟然需要 vip。为了玩每日任务又给开了个 vip,一个季度 69。 自从开了 vip 之后对豆豆龙的兴趣变得更大了,晚上睡觉前都要看看,小宠物获得的关注更多了。

中午吃饭的时候,宝子一直在玩兜兜龙。终于,姥爷忍不住了发火了,嫌弃玩兜兜龙,也不去吃饭。作为一个脾气很好的姥爷,能被逼到这样,看来是真的急眼了。其实与我来说也还好,平时宝子不玩手机,不看短视频。这个兜兜龙刚开的 vip,总是会热乎那么一两天的。习惯了也就好了,毕竟一点电子游戏都不接触也不行的。更何况也不是神马离谱的游戏。

早上起床之后,雨还在断断续续的下着。虽然已经放假了,为了方便看孩子,给孩子报了个托管班,虽然上不够两个月。但是费用却一份都不少,一个月 1800。期间如果有事情去不了,也不退钱。另外一个小朋友刚交完钱,这周回老家待着了,400 多块钱白花了。不过,既然交钱了,那就去吧,在托管班也有个玩伴,并且小朋友也不抵触,那就够了。

货卖袈裟

2024年7月5日 09:21

 货卖袈裟,能识此宝者,分文不取,不识此宝者,重金不卖。 ” 《西游记》

我承认,我又又又又标题党了。小女子哪有神马袈裟可卖,只不过是之前买的显示器,替换下来的两个显示器而已,就是上面配图的这两块。不是神马新鲜货色,买的时间也比较久了,但是使用是没问题的。卖给回收的也没什么意思,一块显示能换一个盆子。不够恶心人的。

1.无亮点,但是屏幕周边的做工一般,边框较宽。
2.有电源线
3.无底座,需要使用支架安装
4.无 hdmi 线,自己买两条吧
5.分辨率 1920*1080
6.两块显示器不是同一批次,稍微有色差,需要自己修正。

当然最主要的当然是女王一手啦,哈哈哈。

具体型号优派(ViewSonic)VX2363smhl-W 23英寸细窄边框爱眼不闪屏 AH-IPS广视角电脑显示器(典雅白色)

  • 商品名称:优派VX2363smhl-W
  • 商品编号:1168558
  • 屏幕尺寸:22-23英寸
  • 屏幕刷新率:60Hz
  • 分辨率:1920*1080
  • 售后服务:3年质保
  • 接口:HDMI,VGA,音频/耳机输出
  • 面板:其他

更详细的信息看这个链接:https://item.jd.com/1168558.html#product-detail

直接可以参考这个,已经下架了:https://item.jd.com/500857.html

说明:

需要的话显示器免费送,但是运费姐姐就不出了哈。可以指定快递,发到付。

需要的话显示器免费送,但是运费姐姐就不出了哈。可以指定快递,发到付。

需要的话显示器免费送,但是运费姐姐就不出了哈。可以指定快递,发到付。

又一个雨天

2024年7月4日 17:54

早上,睁开眼,听到传来了哗哗哗的水声。辨认了下方向,并不是从鱼缸的方向传来的。应该是又下雨了。从床上爬起来,家里静悄悄的,昨天晚上小朋友去小姨家住了。老爸晚上回来给她带了第二天换的衣服和上钢琴课的课本。早上可能很早就起床走了,虽然放假了,为了耗费时间又给她报了托管班。从一定程度上也减轻了父母照顾孩子的压力。

周一小学考完试,周二是最后一天,周三就开始放暑假了。晚上跟之前托管班的老师聊了下,竟然从周三就开始上托管班了,真是无缝衔接啊。托管班并不是单纯的带着小朋友玩,也会提前教一些二年级的东西,这种事情说不上好坏。既然教了,跟着学一下也无可厚非。

上周六上钢琴课的时候,老师说要准备暑假的考级了,得开始加课。昨天下午发消息说一周需要加三节课。考级练习时间短了,需要加大强度。目前先按照每周四节课进行安排,后期看训练效果。

这么看来,虽然是暑假了,但是事情跟上学的时候比也并没有少很多。一样是每天早上送去,下午接回去。白天依旧是上课,去年的托管计划食物,本来以为托管班讲课进度不会太快,并没有买课本。想着家里有打印机,直接下载电子版,上课的时候提前打印好。学到哪里打印到哪里。然而,进度比想象的要快的多,竟然一个托管下来课本都快学完了,最后打印的的课本订书机已经无法装订了,最后只能打孔线装。于是,宝子就每天带着独一无二的线装版课本去上托管班。缺点就是太沉了,比打印的课本厚了一倍,最终也没躲过要打印整本课本。

起晚了,洗刷完换好衣服。也来不及吃饭了,匆匆忙忙开车往公司赶,其实时间尚早,怕的是下雨堵车。一到雨天,青岛的交通基本就是完全瘫痪的状态。到处都红的发紫,路上的行人也形色匆匆。不过好在出门的时候已经不怎么下了,拿着雨伞到车上开上车发现貌似忘带了手机。开车转到楼下,上楼找手机,手表也没带。通过手表的找手机功能,点了一下提示蓝牙已断开。于是猜测可能在包里,重新回到车上,再次找手机,“我在这里,我在这里 yao”,手机在座椅底下发出了叫声。对于华为手机的这个腔调的确是有点奇怪。

下午三点多接到电话,问:“给打上车了吗”

本来以为接上宝子怎么也得三点十分左右,赶紧打开高德地图的打车界面规划路线。现在帮别人叫车之后,竟然可以直接分享实时路线到微信了。通过小程序能实时查看轨迹,这个功能还是蛮不错的。

返回的时候,又看到了希望工程的账号,点进去看了下。高考结束了,新的希望功能助学活动也已经开始了,针对大学生的一对一捐助至少需要 5000。这个对我来说有点多了,虽然有想法,但是穷啊。于是选择了十分之一,算是略尽绵薄之力吧。

多年以前,自己上学的时候也是靠着3000 块钱的助学金去了学校。感谢潍坊市林业局的捐赠,当然也得感谢自己二大爷以及二大爷家的姐姐们。虽然后来在结婚的时候因为种种原因不上门了,但是还是感谢他们这么多年的帮助,让人生变得不那么艰难。

经常在逼乎上看到各种帖子,贫困生就不能看演唱会吗?贫困生就不能买苹果手机吗?贫困生就不能……吗。这种帖子真的不值当的回答,不管是不是钓鱼,作为一个贫困生,这些都不配,是自己不配拥有他们。上学的时候感谢辅导员以及大学的老师,让自己在学生机房勤工俭学,每个月可以有 400 块钱还是 600 块钱来着,记不清楚了。解决了自己的吃饭问题,剩下的就是每年 6000 块钱的助学贷款,而这些贷款,从毕业之后还了 4 年,期间还各种逾期。有时候是自己忘了,有时候是真没钱。大一寒假的时候,学校给发的羽绒服,自己穿了 4 年,真的,从来没穿过那么暖和的羽绒服。

穷啊,是想着怎么在有限的条件下来达到自己的目的。而不是变着法的去追求这些所谓的高品质生活。自己买的第一台电脑,二手的,800 块钱,陪伴了自己两年的大学时光。赛扬 800 的处理器,说白了,就是个垃圾,直到大四要写论文了,还在用着这台古董电脑。终于扛不住了之后,又换了稍微没那么垃圾的处理器,依然是赛扬,终于主频能到 2.1 了。256M 的内存,就是这么可怜。所以,自己的论文实在没什么条件的情况下写出来的。为了装个虚拟机,一个系统能装半天,系统卡的要死,能怎么办呢。只能不断的尝试,忍耐,比其他人呢花费更多的时间。因为穷嘛,就得用时间来换资源。

所以啊,后来自己就讨厌死了等待。能跑高速坚决不走省道,能跑 140 绝对不跑 120。当然,超速是不对的哈,不要超速。虽然 500 块钱,对我来说不是很多。但是既然是助学,那自然希望这 500 块钱花到该花的地方,而不是去看演唱会,或者凑钱买那些所谓的高品质生活。我自己都没去过演唱会呢,如果这钱用来去听了演唱会,还不如我拿着去加油呢。最起码还能跑几百公里不是吗?

毕竟,我现在连给宝子买个课本都得想着从同一个店买,能稍微省点运费,毕竟几块钱也是钱嘛。然而,找了半天依然没有一个店能凑齐这些东西,所以新华书店买了一本,二手东买了另外一本,今天终于到了一本了。另外一本貌似明天能到。

青岛的雨🌧️

2024年7月2日 13:48

虽然北方没有梅雨季节,这几天接连的阴雨似乎也昭示着雨季来临了。这里不是非洲的大草原,自然没有那广阔的草原和奔袭的野兽。只有那肆虐的狂风和冷冷的冰雨。

周六回县城的时候,路上就在淅淅沥沥的下着雨。时大时小,忽及忽慢。早上刚睁开眼,隔着窗户的三层玻璃,隐约能听到大雨打在玻璃上的声音。真的又开始下雨了。

青岛的雨从来都不会独来独往,每次必然都有强风作伴,这一对总是能制造不小的麻烦。

早上到公司楼下的时候,路上的积水已经有五六公分了。强风裹挟着大雨点横着下,时不时的改变方向,不管雨伞朝着那个方向,总也躲不过大雨的偷袭,从下半身到上半身无一幸免。狂风吹着路上的积水竟然出现了层层的波浪,这下真的无路可逃了。

这几天精力又陷入了一个比较困顿的状态,到了晚上十一点左右就特别的困了。也没什么精力再熬一会儿。最近一直在想着将闺蜜圈app从 vue2 迁移到 vue3 上来,上周的时候找了一晚上时间,尝试修改了一部分代码。主要是语法问题,以及系统架构变化导致的兼容性问题。css 的 deep,export import 等等。但是,上周折腾完之后虽然能跑起来了,但是页面一堆的问题,加载直接出错了。

昨天晚上又拿出来两个小时,重新进行了代码的优化。

经过这次折腾,终于页面重新跑起来了。然而,网络请求的兼容性还需要进一步处理。

之所以要进行项目升级,主要是针对所谓的鸿蒙 next 的兼容性。之前看 uni 官方的通告,vue2 版本很可能是不会进行鸿蒙 next 的兼容性适配的,也就是说要想打包鸿蒙 next 的应用至少需要 vue3。早上又看了篇文章,说了针对鸿蒙 next 的适配方案。

虽然提到了方案一:

  方案一,是对存量uni-app项目的开发者非常友好的webview方案,这套架构是业内主流的Hybrid App架构,即逻辑层、视图层分离架构。老版uni-app在App平台使用的是这套架构,微信等各家小程序使用的也是这套架构。使用本方案,可以帮助开发者快速将之前基于uni-app开发的App、小程序、H5等,快速发布成鸿蒙App,快速入驻鸿蒙生态,抢先接收鸿蒙的流量红利。

这个可能也仅限于 vue3 的项目,未雨绸缪,所以提前尝试了一下,将 vue2 的项目升级到了 vue3。升级过程中各种语法以及框架变化还是蛮明显的,其中有一段 vue2 的代码,尝试让现在的各种 ai 升级成 vue3 版本。实际效果并不理想,尤其是所谓的那几个国产的。

baidu comate,没有重新写代码,直接告诉我怎么写怎么引用:

嗯,整体来说就是没啥用

deepseek 直接将我的代码复制到了一份,然后啥也没说:

最靠谱的还是gpt,duckduckgo有免费的 gpt 3.5 turbo,这个还是蛮不错的:

最起码他是真的给我转了,并且转的代码也没问题,完全可用。

窗外雨还在继续,不过现在感觉小了很多了。恼人之处在于,现在身上的衣服全部都是湿的,感觉非常不舒服,只能中午回去换衣服了。

中午顶着瓢泼大雨回到家,家里也没什么能吃的东西。煮了一包泡面,把周日打包回来的剩菜热了一下。将就吃点东西,这些其实倒是也没那么关键。主要是能换身干净的衣服就行啦,吃完饭雨竟然停了,有的地方甚至有斑驳的阳光晒了下来。出门之后发现,早上宜人的温度已经荡然无存,偶尔从乌云后面的太阳偷偷摸摸的出来照射一下雨后的大地,瞬间空气的湿度就上来了。

肆虐的狂风也不见了踪迹,只剩下蒸笼一样的空气。如果说北方多数地区的夏天是烤箱,那么青岛的雨后就是个蒸笼。雾气氤氲,黏黏糊糊。汗水就顺着脸颊流了下来,在户外不多久衣服也就贴在了身上。嗯,当个大包子,感觉的确不怎么样。

宁夏

2024年7月1日 10:57

眨眼间已经到了六月的最后几天了,而后这半年就真的结束了。早在春节之前就约了姐妹一块吃饭,一拖再拖终于到了四月份,信誓旦旦表示,如果四月份再约不上就是小狗。然而,时至今日依然是各种不凑巧。

上周请假在家休息的时候给姐妹发了个消息,却发现也在家趴着。

周五晚依然没约上,不过之前回来的同事倒是有时间,又约了几个前同事以及现同事简单的吃了点东西。吃过饭,看了下时间尚早,在周围找了家台球厅。这家台球厅看起来蛮新的,应该也开业不久。价格不算便宜,之前在银座打球的时候一小时价格以 38,48,58 为主。这家台球厅主要是 48 及 58。不过整体来说环境还算可以。打完球走的时候,前台说下周有比赛,可以参与一下。然而,时间总是不凑巧,找个工作日比赛。这哪有这个时间啊。不过,球厅有很多陪着打球的小姐姐,打球的过程中观察了一下,水平一般,那也没啥意思。

 

老家房子的租客自己买了房子了,想要退租。退租这件事情必须得回去看看了,不然不知道是什么情况,也不知道会不会有什么问题。卷心菜是越卷越结实了,周六也要加班。这个周六实在没空了,跟领导请假。上午陪宝子上完钢琴课就准备回了。

跟小姐姐一块去接宝子回来,送到小姨家。等待的空隙,给家里的老太太打了个电话。前面聊的还算可以,没什么出格的问题。到了后面又开始说生孩子的问题,依然是老一套,年轻就该多吃苦,什么都不重要多个孩子是最想要的。现在我啊,什么都不稀罕,就想多几个孩子。

然而,实际情况是,她现在的生活条件是属于比较好的。出了隔三差五各种“精神类”疾病“折磨”她,实在是也没别的困扰了。衣食无忧,只要自己不钻牛角尖就没什么烦恼。然而,我最讨厌的就是说再要个孩子,什么苦点累点不要紧。年轻人就该多吃苦,也不用挣那么多钱,够用的就行。孩子也不用太有能耐,就在自己身边就行。

在我的记忆里,钱这个东西从来都没有够用的时候。她不知道之前的那么多年自己是怎么过来的,也不知道那种所谓的生活不能叫做生活,充其量算是活着。她更不知道自己不想让自己的孩子再走自己的老路。那种所谓的艰苦奋斗,那种所谓的吃苦没有任何的意义。听到这里我就不想说话了,只是机械的“嗯嗯”算是回应,终于,找了个间隙,我说:“我要去上班了”挂断了电话。

小姐姐回来之后,直接去了后排。我问她为什么不来前面坐?

“先去补身份证啊”她答道。

自从五一出去玩,回来之后身份证就不见了。找遍了所有的地方,找不到任何的踪迹。就这么消失了。区政府办身份证的人不是很多,尽管人不多,但是办下来也用了四五十分钟。主要是拍照比较耗时间。

 

回家的路上雨忽大忽小,路上的车辆也不算多。可能还是因为下雨的原因吧。到了潍坊境内,天就晴了。炽烈的阳光晒在身上,竟然有那么一丝丝的痛感。在家待的时间不多,也不准备买菜了,随便找了家潮汕牛肉火锅吃了点。大众点评上 19 块钱代 100 的代金券。感觉挺划算的样子,然而,在结账的时候被告知代金券只能代菜金,锅底饮料什么的不算。实际上菜金只消费了 160 多, 还差不少,只得作罢。

吃罢饭就该去给三姨送礼了,因为房子出租平时家里没人,还得靠她帮忙去看房。此时,天上竟然也开始淅淅沥沥的下雨了。去超市买些零食,晚上就不准备吃饭了。一个小西瓜,刚好可以解决晚饭的问题。停好车,拿西瓜的时候,发现他已经裂开了。最起码说明一个问题,那就是自己选的这个西瓜还是不错的。

天快黑的时候,去窗边,凉风吹来,竟然完全没有了中午的热浪袭人的感觉。关掉空调,把所有的窗户打开,让户外的空气流动起来。这个房间内,空气都变得活泼了。

把裂开的西瓜,直接掰开。用勺子吃掉了一半,另外一半实在吃不下了。这种宜人的天气就该出去遛弯了。去处,自然还是西湖公园,路上行人也渐渐的多了起来。路边饭店的停车场也停满了各种车辆,看起来似乎一切都那么完美。

之前在公园走的都是小圈,这次没有延续之前的道路。过桥走到了另外一侧,相比之下,另外一侧人更多一些。可能跟西侧的住宅区有关系吧,沿着河岸走,可以看到成群的广场舞队伍。有那么一瞬间忽然像跟在后面一块扭。

路上有孩童追逐嬉戏,也有不怎么小心差点撞到人,后面跟着慈母咆哮:“你脸上那俩灯泡是装饰品啊!”孩子并没有停下脚步,伴随着清脆的笑声从我俩中间穿了过去。

这才是生活该有的样子,虽然宝子没有跟着来。但是,在陪她玩活着出去活动的时候,我是乐意跟着她一块作的,只要不出事就好。有时候她也会很好奇的问:“为啥咱俩玩,总是很搞笑啊,玩搞笑的”

“怎么啦?搞笑的不好玩啊?不开心”我问。

“没有啊,挺开心的”

“那不就得了”

然后我就带着她一块疯。小时候,父母陪着玩的时间,一只手可能都数的过来。记忆里也不曾有这样的瞬间。在小的时候姐姐们还有时间陪着回去玩,后来,就只剩下那些村里的小伙伴了。再往后,就是同学。现在,几乎只剩下那么一两个同事或者朋友了。

逛着走着,就到了另外一个公园。原本是两个独立的公园。岁月变迁,这俩公园也合成了一个,收费的公园也一去不复返了。这条路从来没有走过,虽然看起来围着湖那么一大圈,但是走下来,也不过两三公里而已。

桥下,有孩子拿着网兜在捞鱼,不过也没看到鱼的痕迹。另外一次是大人们在钓鱼。有的甚至上面还有成像系统,能看到水下的景象。瞬间觉得,钓鱼竟然也是一项科技感十足的运动了。

 

不过这个公园的入口已经抹去了相关的招牌,里面也没有开灯。黑漆漆的一篇,即使在河边捉蝉的人,也不会走进这个大门。

一圈走下来,凉爽的风吹在身上,忽然感觉,似乎也不必那么疲于奔命。有那么一瞬间,甚至有点无欲无求的感觉了。似乎,可以那么心安理得的平庸了。

地域黑

2024年6月27日 17:36

就在上周,一个姐妹送自己一把锁。说之前用的,现在换了新的旧的就没用了。于是就给了我。其实,对于指纹锁这个东西按照我对智能化的挑剔程度,按理说应该早就换上了。但是,在看了下价格之后,觉得似乎没那么大的需求。主要是自己的锁芯刚换过了(也就两三年吧),再换个指纹锁,感觉有点浪费。

所以换锁这件事情也就一直没怎么关注,直到有人免费给送一个,凯迪仕的 x1,20 年的那款,现在貌似也还在卖。那就将就用吧。反正楼下的门禁也坏了,换了之后就不用带钥匙了。倒也方便了不少,本来是想着自己安装的,不过打开之后看着里面的打孔尺寸纸板不禁陷入了沉思,感觉需要开孔切割,开孔好说的,但是切割这件事情真的自己做不了。

从包装上扫码找了个凯迪仕的二维码,在跳转了 n 个小程序之后终于找到了安装的售后,在线上提交了安装申请。之前也没注意,以为是上门之后收取费用,周留的时候看了下,说查不到订单号:

酱紫,行吧,于是直接回了个付费安装。后来就给了个师傅的电话,咨询了一下价格配件齐全的情况下 200 块,还行吧,和自己估计的价格一致。

原本是下午三点,由于是重新预约改到了晚上六七点钟。来的还算及时,安装的速度也很快。装好之后试了下效果还算 ok。于是给家人都录上了指纹,从此就不用带钥匙啦。不过门锁的 wifi 模块竟然是选配的,从淘宝找了一下没有,咸鱼上买了个昨天到货了,折腾一晚上也没连上,最后放弃了,不知道是模块问题还是门锁问题,暂时不管了,就先这样用着吧。

晚上吃饭的时候,小姐姐忽然说,“老妈跟你说过没,她说之前说过:’看孩子的前提是把她的养老保险的钱给交上’ 大概几万块钱”

“没有啊,我没记得有这么个事”我答道。

“她说当时说的时候你也在”小姐姐继续说,“我算了下,结婚后我用了她七万,XX(妹妹)用了她十万”

“行吧,到时无所谓,给她交也没什么,表弟买房的时候不是还借了你 4 万?”我问到。

“那个钱不要了,就算给交了保险了”小姐姐答道。

“嗯嗯,无所谓”我答道,“那不对啊,妹妹用了十万,咋在家里还这么没地位?装修的前也是从这边出的,买房子她自己出了 20 万,对象家出了 20 万。现在 tmd 她婆家还觉得亏了,还想把 20 万再要回去,是脑子有病吗?”

“那管不着啊”小姐姐摆手说,“大学期间的爱情会让她不断的妥协,之前上学时候有多好,现在有多低下”

之前我总说穷山恶水出刁民,这应该也算是地域黑的一种,不过这种地域没有那么明显而已。我也是从这个穷山恶水出来的,而现在我想开的炮却是针对 Q。对于这个地方的人说实话属实没什么好感,同事有一个是这个地方的,老婆已经在家呆了六七年,青岛大学的大学生,毕业之后就做了全职主妇。现在孩子六岁了,马上一年级了,还在家里呆着。而他老公,也就是我的同事,挣得真的多吗?只能说也还可以,但是并没有那么多。那种大男子主义,有时候的确让人感觉挺无语的。

那种关系论,他的弟弟也是大学毕业,毕业之后在深圳呆了一年多,混不下去了,回老家跟着所谓的一个叔叔干活,美其名曰是事业单位,但是没有编制,干了半年连工资都没发过。上次出去吃饭的时候,路上提到这个事情,我问他,不发工资,那干的意义是什么?他说也没什么意义,现在在老家,他爸给三十几万买了车,天天开车上班,连油钱都整不出来。

不得不多,还是家里有钱。像我这种穷逼就不行了,没钱买三十几万的车。也不敢去干不挣钱的活。所有的一切看起来真的风光无限,毕竟,三十万的车开着,脸面大了不是吗?

而妹妹的对象,巧了,也是Q 来的。其实交集并不多,偶尔会家庭聚餐的时候凑在一起。说道聚餐的时候,小姐姐说:“之前有一次,X(妹夫)有人送礼给送了两瓶茅台。本来说好给老爸的,但是最后两瓶酒都拿老家去了。最后去看老爸的时候给了两瓶别的,百十块钱一瓶的。”

不是说百十块钱的酒不好,其实平时我去买酒去亲戚家一般也是买百十块钱左右一瓶的。只是这个行为让人觉得有点匪夷所思,不想给就别吱声。小姐姐继续说;“通过这个事情看来,问题是出在 x 身上,和他家里人的关系不大了。前几天被派出所带走之后,本来挺好的,后来回了一趟家,结果回来之后跟妹妹冷战了。”

“oho,还有这操作?不应该是干了坏事,想想怎么弥补吗?这是哪里来的自信?”我问。

当然,这个问题是没有答案的。这就是我在之前提的,作为一个亲属去吃饭还要被指点江山,到处都是爹味,就让人很反感。本来我也讨厌这种言而无信的人,每天晚上忙着出去喝酒,偶尔回家一趟貌似也是下半夜。当然,不跟我一块生活,我是无所谓的。不过对于 Q 的人,好感度更是到了冰点。

于是引申而来,我一定不会让我的宝子以后找个 Q 的对象,实在是太烂了。不是针对那个,是整个 Q 的都是垃圾。在认识他们之前,对于 Q 的讨厌,最多来源于路上的司机,变道不大转向灯,各种别车的,仔细看看十个里面有 9 个是 Q。所以,没次上去看到 Q 我都躲得远远的,我虽然开的快,但是不像 Q 一样那么没素质。

没错,针对Q,我还真的就是地域黑!

食人族,抓了个打工人,然后把他给放了

2024年6月24日 09:17

最近几天陷入了病痛的折磨中,然而,至于怎么得得这些病确全然没有头绪。周六早上起床之后尚未感觉到任何的异样,然而,陪宝子上完钢琴课。把她送到她小姨家的时候,发现自己完全没有力气爬楼了,腰疼的厉害,一爬楼浑身出汗。

现在想来,可能是周五晚上去台球厅打球累的?之前离职的一个同学在辗转多地之后又回来到了青岛。晚上约着一块吃了个饭,饭局结束想着之前经常去的台球厅充值应该还有一百多的余额。结果到了之后发现灯是黑的,大门也已经紧闭。真好,又跑一个,好在剩的钱不多了。

周六在公司呆了大半天,正好把日历的问题给解决了。然而中午吃饭的时候,已经移动困难了。只能一小步一小步的挪动,吃完饭去车上躺着休息了一会儿感觉稍微好了一些。

下午回到家之后,就躺床上了,根本 不想动。结果到了下午之后开始肚子疼,一阵阵的痛感袭来,真是让人抑郁了。腹背受敌的感觉,腰疼,肚子也疼。

晚上睡觉也没休息好,浑身难受。终于早上去送宝子上学的时候感觉靠不住了,一走路带的右下腹部阵阵疼痛。

回家之后找了找药箱也没什么能吃的药,到社区医院。医生了解了下情况,给安排了个验血。

验血之后,初步结论是细菌感染神马的,给开了一堆药。说如果没有好转,可能就得去大医院做B超了,看是不是阑尾发炎了。

哎,拿着💊回家,然后请假了。连休息都不自由,怪不得食人族都不吃打工人呢,打工人太苦了。

黔驴技穷 — 山穷水复疑无路 柳暗花明又一村

2024年6月22日 20:54

一直想做闺蜜圈app日历的滑动切换效果,然鹅,目前使用的控件是mr calendar。https://ext.dcloud.net.cn/plugin?id=7251

之所以用这个控件,是因为在测试了目前市场上的所有控件,能达到使用效果的,或者说效果最好的就是这个控件了,支持自定义样式,所以实际使用效果还算ok。

不过在使用的过程中,也出现了很多问题,插件其实并没有完全满足自己的需求。在开发的过程中对插件进行了一些修改和完善,之前提到过一些问题,包括但是不限于:

Uniapp 日历组件在 iOS 上的 bug

以及:

日历控件bug太多了,小程序也有问题

不过好在最后这些问题都是解决掉了,但是,对于日历滑动却一直没有解决。如果单独的使用日历的滑动效果是没问题的。日历插件的滑动效果是使用swiper实现的:

<swiper class="mr-calendar__container__content" vertical :current="currentIndex" :duration="duration"
                @animationfinish="animationfinish" skip-hidden-item-layout circular>
                <swiper-item class="mr-calendar__container__content__item" v-for="(item, itemIndex) in showMonthList"
                    :key="itemIndex">
                    <view class="mr-calendar__container__content__item__bg">{{item.month}}</view>
                    <view v-for="(row, index) in item.days" :key="index"
                        class="mr-calendar__container__content__item__row">
                        <view class="mr-calendar__container__content__item__col"
                            :class="{ 'is-range': type === 'range' }" v-for="day in row" :key="day.format">
                            <mr-calendar-item :day="day" :cell-class="cellClass" :type="type"
                                :selected-value="selectedValue" :selection="selection" @click="onDayClick">
                            </mr-calendar-item>
                        </view>
                    </view>
                </swiper-item>
            </swiper>

滑动实现逻辑:

animationfinish(e) {
                const oldDate = this.currentDate;
                const index = e.detail.current;
                this.currentIndex = index;
                this.currentDate = this.showMonthList[index].id;
                this.setShowMonthList(index);
                this.$emit('date-change', this.currentDate, oldDate);
            },

然而,这个日历组件在动态修改自定义加载的日历数据之后,不会直接渲染。需要主动调用插件的fresh方法,例如下面的样子:

monthChange(e){
                console.log('monthChange',e)
                this.customDate = [{
                                    cellClass: 'custom-cell',
                                    date: '2024-07-24',
                                    top: [{
                                            class: 'custom-cell-top-1',
                                            text: '①'
                                        },
                                        // {
                                        //  class: 'custom-cell-top-2',
                                        //  text: '6'
                                        // }
                                    ]
                                },
                                {
                                    cellClass: 'custom-cell',
                                    date: '2024-07-24',
                                    top: [{
                                            class: 'custom-cell-top-1',
                                            text: '①'
                                        },
                                        // {
                                        //  class: 'custom-cell-top-2',
                                        //  text: '6'
                                        // }
                                    ]
                                },
                                {
                                    cellClass: 'custom-cell',
                                    date: '2024-07-21',
                                    top: [{
                                            class: 'custom-cell-top-1',
                                            text: '①'
                                        },
                                        {
                                         class: 'custom-cell-top-2',
                                         text: '6'
                                        }
                                    ]
                                },
                                {
                                    cellClass: 'custom-cell',
                                    date: '2024-07-20',
                                    top: [{
                                            class: 'custom-cell-top-1',
                                            text: '①'
                                        },
                                        // {
                                        //  class: 'custom-cell-top-2',
                                        //  text: '6'
                                        // }
                                    ]
                                }]
                                // setTimeout(()=>{
                                this.$refs.calendar.refresh();
                                    
                                // },1000)
                                // this.$set(this.)
                 
            }

然鹅,就是this.$refs.calendar.refresh();这行代码导致刷新的时候日历组件出错了。变成了混乱过状态。

但是,不调用这个方法,添加的数据就不会显示。原日历组件没有月份跳转的功能,

插件的月份跳转就是通过滑动实现的,由于之前在测试的时候滑动一直有问题,我自己进行了修改添加了两个button进行月份调整,就是顶部的两个单箭头。

这两个单箭头的实现是通过下面的方法:

toMonth(month) {
                // console.log('toMonth');
                if (!this.currentDate) return;
                let oldDate = this.currentDate;
                let backDate = this.currentDate;
                let tempCurrentDate = null;
            
                if (typeof this.currentDate === 'string') {
                    let tempCurrentDateString = this.currentDate;
                    if (tempCurrentDateString.length < 8) {
                        // console.log('short');
                        tempCurrentDateString = tempCurrentDateString + '/01';
                        tempCurrentDate = new EDate([tempCurrentDateString]);
                        backDate = new EDate([tempCurrentDateString]);
                    }
                }
                if (month === 0) {
                    const currentDate = new EDate().format('YYYY/MM');
                    if (currentDate === this.currentDate) return;
                    this.currentDate = currentDate;
                    backDate = this.currentDate;
                    this.setShowMonthList(this.currentIndex);
                } else {
            
                    backDate = EDate.modify(backDate, {
                        m: month
                    })
                    // backDate = 
                    this.currentDate = EDate.modify(tempCurrentDate, {
                        m: month
                    }).format('YYYY/MM');
            // 		this.currentDate = dateFormat(EDate.modify(tempCurrentDate, {
            // 			m: month
            // 		}),'yyyy/MM');
            
                    this.setShowMonthList(this.currentIndex);
                }
                // this.$emit('date-change', this.currentDate, oldDate);
                console.log('’mr calendar', 'month change current index= ', this.currentIndex)
                this.$emit('month-change', backDate, oldDate);
            },

实际上上面的方法在使用的过程中也没任何的问题,同样调用refresh方法也不会出现错位的情况。但是滑动就会出问题,并且滑动方法中直接调用toMonth方法来切换,一样会出现错的情况。开始以为是currentIndex的问题,但是监视了一下currentIndex的变化和修改,不管调用或者不调用refresh方法,索引值都是一样的,没有看出任何的不同来。昨晚折腾到八点多,一度想放弃了。包括showMonthList的监视,也没看出任何问题。最后一度想放弃了,主要是实在没有头绪,也不知道该从哪里下手,大概的情况知道,但是怎么修复完全是一脸懵逼,作为一个非专业前端,做的功能全部都靠抄抄抄,自己写代码实在是能力有限啊,来自战五渣的痛,在这一刻真的是黔驴技穷了,完全不知道该怎么继续了。

然而,就这么放弃总不是自己的风格,今天上午决定再挣扎一番,之前连汇编代码复杂算法都搞得定,这tm都有源代码的高级语言还能把自己难住了,姐姐我就不信了!!

今天上午找研发聊了一下,说修改属性页面不刷新的问题,他提供了个方法,直接调用this.$set 来对属性赋值,但是这个方法测试后依然无效。

实现代码里有一段是:

this.currentIndex = index;
                    const [beforeIndex, currentIndex, afterIndex] = [
                        [2, 0, 1],
                        [0, 1, 2],
                        [1, 2, 0]
                    ][this.currentIndex];
                    const before = this.showMonthList.find(item => item.id === beforeDate) || this.getMonthDays(
                        beforeDate);
                    const current = this.showMonthList.find(item => item.id === currentDate) || this.getMonthDays(
                        currentDate);
                    const after = this.showMonthList.find(item => item.id === afterDate) || this.getMonthDays(afterDate);
                    this.showMonthList[beforeIndex] = before;
                    this.showMonthList[currentIndex] = current;
                    this.showMonthList[afterIndex] = after;

这个东西,其实我一直没搞明白是要干嘛,聊了下才反应过来,对应的是当前的showMonthList的索引,不管在任何时间,所有的月份都是三个数组,在滑动的过程中索引值就会根据上面的代码进行变化。到这里,我忽然想到问题的关键是什么了,通过toMonth进行月份切换和滑动切换对应的月份数组可能是不一样的。

完善监控代码,对showMonthList修改前后的数据进行对比。

watch: {
            visible(val) {
                clearTimeout(this.watchTimer);
                setTimeout(() => {
                    this.active = val
                }, 100);
                if (this.visibleSync) {
                    clearTimeout(this.closeTimer)
                }
                if (val) {
                    this.visibleSync = val;
                    this.initValue();
                } else {
                    this.watchTimer = setTimeout(() => {
                        this.showMonthList = [];
                        this.currentIndex = 1;
                        this.visibleSync = val
                    }, 300)
                }
            },
             currentIndex(newVal, oldVal) {
                  console.log(`currentIndex changed from ${oldVal} to ${newVal}`);
                  // 在这里可以执行更多的逻辑
                },
            showMonthList(newVal, oldVal) {
                  console.log(`showMonthList changed from ${oldVal} to ${newVal}`);
                  // 在这里可以执行更多的逻辑
                  console.log('----------------old------------------')
                    oldVal.forEach((item) => {
                  		console.log(item.id);
                  	});
                  
                  console.log('----------------new------------------')
                  newVal.forEach((item) => {
                        console.log(item.id);
                    });
                    console.log('----------------end------------------')
                },
                
        },

这时候有观察了一下数据监视的变化,在不调用刷新的情况下,通过toMonth方法调用的showMonthList月份都是连续的,比如[2024/02,2024/03,2024/04],[2024/03,2024/04,2024/05]

然而,滑动切换,showMonthList的月份不在连续了:[2024/10,2024/11,2024/09]

那么此时refresh里面的代码就有问题了:

setShowMonthList(index, refresh) {
                if (!this.currentDate) return;
                const currentDate = this.currentDate;
                const beforeDate = EDate.modify(`${this.currentDate}/01`, {
                    m: -1
                }).format('YYYY/MM'); // ios 预览下 new Date('2019/02')返回null
                const afterDate = EDate.modify(`${this.currentDate}/01`, {
                    m: +1
                }).format('YYYY/MM');
                if (!this.showMonthList.length || refresh) {
                    const before = this.getMonthDays(beforeDate);
                    const current = this.getMonthDays(currentDate);
                    const after = this.getMonthDays(afterDate);
                    this.showMonthList = [before, current, after];
                } else {
                    this.currentIndex = index;
                    const [beforeIndex, currentIndex, afterIndex] = [
                        [2, 0, 1],
                        [0, 1, 2],
                        [1, 2, 0]
                    ][this.currentIndex];
                    const before = this.showMonthList.find(item => item.id === beforeDate) || this.getMonthDays(
                        beforeDate);
                    const current = this.showMonthList.find(item => item.id === currentDate) || this.getMonthDays(
                        currentDate);
                    const after = this.showMonthList.find(item => item.id === afterDate) || this.getMonthDays(afterDate);
                    this.showMonthList[beforeIndex] = before;
                    this.showMonthList[currentIndex] = current;
                    this.showMonthList[afterIndex] = after;
                }
            },

上述代码通过refresh if (!this.showMonthList.length || refresh) 参数判断是否要刷新,在刷新的情况下直接重建了这三个月的数据。然而,这三个月的数据是根据上面的代码:

const currentDate = this.currentDate; const beforeDate = EDate.modify(`${this.currentDate}/01`, { m: -1 }).format('YYYY/MM'); // ios 预览下 new Date('2019/02')返回null const afterDate = EDate.modify(`${this.currentDate}/01`, { m: +1 }).format('YYYY/MM');

来实现的,这个月份是通过顺序创建出来的,那么在滑动的时候,因为showMonthList是乱序的,而刷新导致强制重建了顺序的数据,这就直接bug了。想明白了这点,那么要修复也就终于有头绪了。

在刷新的时候,如果showMonthList为空直接重建,如果存在showMonthList的情况,应该是将showMonthList里面的月份进行数据渲染回填,这才是正确的逻辑,修复后的代码:

// 滑动刷新 重新生成的数据,与原来的数据不一致 导致数据出错
            setShowMonthList(index, refresh) {
                if (!this.currentDate) return;
                let currentDate = this.currentDate;
                let beforeDate = EDate.modify(`${this.currentDate}/01`, {
                    m: -1
                }).format('YYYY/MM'); // ios 预览下 new Date('2019/02')返回null
                let afterDate = EDate.modify(`${this.currentDate}/01`, {
                    m: +1
                }).format('YYYY/MM');
                
                
                if (!this.showMonthList.length || refresh) {
                    //处理刷新逻辑 如果存在列表 按照旧列表刷新数据内容 刷新旧列表,否则创建
                    if (this.showMonthList.length>0){
                        beforeDate =  this.showMonthList[0].id
                        currentDate = this.showMonthList[1].id
                        afterDate = this.showMonthList[2].id
                    }
                    const before = this.getMonthDays(beforeDate);
                    const current = this.getMonthDays(currentDate);
                    const after = this.getMonthDays(afterDate);
                    this.showMonthList = [before, current, after];
                } else {
                    this.currentIndex = index;
                    const [beforeIndex, currentIndex, afterIndex] = [
                        [2, 0, 1],
                        [0, 1, 2],
                        [1, 2, 0]
                    ][this.currentIndex];
                    const before = this.showMonthList.find(item => item.id === beforeDate) || this.getMonthDays(
                        beforeDate);
                    const current = this.showMonthList.find(item => item.id === currentDate) || this.getMonthDays(
                        currentDate);
                    const after = this.showMonthList.find(item => item.id === afterDate) || this.getMonthDays(afterDate);
                    this.showMonthList[beforeIndex] = before;
                    this.showMonthList[currentIndex] = current;
                    this.showMonthList[afterIndex] = after;
                }
            },

现在再次调用数据刷新,是真的是刷新数据,不是重建数据了,这个bug就算是修复了。其实之前也想过这个问题,不过对于渲染逻辑没想清楚,所以也没下手。

至此,滑动问题完美解决,下个版本就可以安排上啦。

看来,要解决这个也没那么难,这不就柳暗花明又一村了~~

Uniapp 下安卓的权限申请

2024年6月19日 14:20

安卓手机各种定制化的系统,真的是一言难尽。尤其是国内的这些手机厂商各种定制化的系统,底层修改加上深度定制。也就导致了为了适应国内的手机厂商系统,要做大量的工作。

这几天在准备闺蜜圈的更新发版,再加入了推送之后。由于系统的角标设置问题,最终是通过原生插件实现的。想着多找几个设备测试下实际的效果。

百度的 mtc 平台之前充了 200 块钱,停止做 app 之后里面有一些余额已知没用完,结果再次想使用的时候结果要求进行企业认证。当时就懵逼了。

现在真机租用的价格是真的离谱,一块钱一分钟,没有任何的优惠。

结果第一台机器就遇到了让输入身份证号验证的情况,5 块钱白花了。

这 tm 我咋知道号码是啥,联系客服结果折腾半天都没找到人工,最后加 qq 群才有人联系自己,加微信,把时间返还了。就离谱。不过在测试的时候还是发现了一个问题,那就是竟然在一些手机上无法访问图片。

为了满足华为市场上架要求,增加了一个弹窗用来显示权限申请的提示。实现逻辑:

UNIAPP 华为应用商店 未同步告知权限申请的使用目的

然而,也正是因为这个代码,貌似导致在 android 11 以上的系统失效了。具体原因可能是安卓权限的细化导致的,已经不在有这个存储权限申请了,取代的是更加细化的权限:

在Android14上与应用交互的用户现在可以授予对其媒体库的部分访问权限(READ_MEDIA_IMAGES和READ_MEDIA_VIDEO)。

新对话框包含以下选项:

●  选择照片和视频: Android14中的新功能。用户选择想要提供给应用的特定照片和视频;

●  全部允许:用户授予对设备上所有照片和视频的完整库访问权限;

●  不允许:用户拒绝所有访问。

如果用户选择了“选择照片和视频”并且应用稍后再次请求READ_MEDIA_IMAGES 或者 READ_MEDIA_VIDEO权限,系统会显示不同的对话框,让用户有机会授予完全访问的权限,维持现状,或者授予对其他照片和视频的访问权限。为了帮助应用支持新的变化,系统引入了一个新的权限READ_MEDIA_VISUAL_USER_SELECTED。

如果应用不声明READ_MEDIA_VISUAL_USER_SELECTED权限,则会发生以下行为:

●  在用户与应用会话期间,将会授予对用户选择的照片和视频的READ_MEDIA_IMAGES 和 READ_MEDIA_VIDEO 临时访问权限。当应用移到后台或者当用户主动杀死应用时,系统最终会拒绝这些权限。此行为就像其他一次性权限一样;

●  如果应用稍后需要访问其他照片和视频,必须手动请求权限重新获得权限。

https://developers.vivo.com/doc/d/6ca290306e294b11ae2d6bf14757fd1d
  • Android 10。分区存储、限制访问不可重置的硬件标识符、限制对剪贴板数据的访问权限
  • Android 11。强制执行分区存储、单次授权、自动重置权限、软件包可见性。
  • Android 12。授予大致位置信息权限、剪贴板访问通知、更安全的组件导出。
  • Android 13。细化的媒体权限、内置图片选择器、隐藏剪贴板中的敏感内容、屏蔽不匹配的 Intent、针对 Wifi 设备的新运行时权限、广告 ID 权限。

 

不得不说因为这些更新导致的一些问题,的确比较棘手。主要是系统版本,厂商定制合并到一块,这个问题就麻烦了。

搜索之后发现uniapp 的 uts 插件:https://ext.dcloud.net.cn/plugin?id=15597

然而,这个插件的问题,貌似在 uniapp 项目中导入之后申请权限没有看到效果,不知道是因为代码问题还是什么其他问题导致的。底层的实现逻辑应该是:https://github.com/getActivity/XXPermissions?tab=readme-ov-file

这个开源项目看起来相对更靠谱一些,后期如果需要喜欢权限申请以及判断,可能还是得将这个项目代码集成到原生插件中实现。

如果项目已经适配了 Android 10 分区存储特性,请在 AndroidManifest.xml 中加入
<manifest>

    <application>

        <!-- 告知 XXPermissions 当前项目已经适配了分区存储特性 -->
        <meta-data
            android:name="ScopedStorage"
            android:value="true" />

    </application>

</manifest>
如果当前项目没有适配这特性,那么这一步骤可以忽略

需要注意的是:这个选项是框架用于判断当前项目是否适配了分区存储,需要注意的是,如果你的项目已经适配了分区存储特性,可以使用 READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 来申请权限,如果你的项目还没有适配分区特性,就算申请了 READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 权限也会导致无法正常读取外部存储上面的文件,如果你的项目没有适配分区存储,请使用 MANAGE_EXTERNAL_STORAGE 来申请权限,这样才能正常读取外部存储上面的文件,你如果想了解更多关于 Android 10 分区存储的特性,可以点击此处查看和学习。

这一系列的权限细分,适配起来就比较蛋疼了。

目前暂时的解决方案,针对华为系列的手机进行权限提醒,其他的暂时先不做处理了:

if (plus.os.name != "iOS") {
                    var androidVersion = plus.os.version;
                    console.log('Android版本信息:', androidVersion);
                    console.log('系统信息:', plus.os.name);
                    // this.showToast(androidVersion);
                    let info = uni.getSystemInfoSync();
                    console.log('手机品牌:' + info.brand); // 输出手机品牌
                    if (info.brand === 'huawei' ||info.brand === 'honor') {

                        let result = await this.$store.dispatch("permitions/requestPermissions",
                            'READ_EXTERNAL_STORAGE')
                        if (result !== 1) return
                    } else {
                        // let result =await this.$store.dispatch("permitions/requestPermissions",
                        // 	'MANAGE_EXTERNAL_STORAGE')
                        // if (result !== 1) return
                        // 针对安卓13以上不处理 声明权限
                    }

                }

一圈下来,钱都花光了要~~

一分钟一块钱,从来没觉得时间这么值钱过~~

 

这“该死”的仪式感

2024年6月17日 12:55

失而复得

很久很久以前,写过一篇文章叫做《寻表记》,说小朋友的电话手表不见了。后来自己过生日的时候又给小朋友买了一块。

然而,就在周五晚上去接小朋友回家的时候,她又把之前丢失的手表给带回来了。问具体的情况,说是在一个通许的橱子里找到了,里面还有她同桌之前开运动会的时候丢失的小兔子。

现在来还原事件,应该还是不知道让谁给拿走了,后来发现没法用。又给放到了别人的橱子里,同样,还有一个伴随着小兔子。这几个东西很可能你是运动会那天一起失踪的。

于是,现在小朋友有了两块表,问题是,我只有一张电话卡。

又又又去修导航了

话不多说,直接看图吧

之前只是说盖住了,没想到盖住这么多,说话声音都听不见。车在电话基本是废了。跟修理厂沟通后,首先是安装 mic,实在不行再进行打孔。这个导航换的真是一波三折,命途多舛啊。

这仪式感

周日是父亲节,不过父亲节的存在感,感觉比母亲节弱了不少。看不到太多的宣传,也没看到很多的活动,当然也有可能是因为自己闭目塞听。

然而,这天正好是小朋友小姨家的小朋友过一周岁的生日。为此,还准备了满满的项目单。

看着这长长的节目单,不禁陷入了沉思。现在宝子都七岁了,从来有过这么隆重的周岁礼。

他们九点半就去了,在家里给宝子简单化妆,换衣服,毕竟她也是要去拍照的。刚多十点多小朋友就坐不住了,说想去。问题是去了也很无聊啊,就只能那么呆着。

不过最后还是在十点半之前过去了,找到房间之后,就听到她的那个弟弟在里面哭。想来也是折腾了太久已经累了。

娃的爷爷奶奶一脸的笑容,不管娃怎么哭都是满脸笑容。反观娃的姥姥姥爷,尤其是姥爷,看着娃在那里哭那是一脸的心疼。更何况这一年基本都是姥姥姥爷在看着,爷爷奶奶一共出现了不到一个月。

这满脸的心疼和笑容,在一霎那忽然就成了一副对比鲜明的画面。看着自己陪伴了一年的娃,转眼间成了别人的“玩物”,当然,都是为了所谓的仪式感。在我看来,这个流程没有必要那么长,简单拍拍就行了。那种画面,让我想起了一句话,自己种的好好的白菜被猪拱了。之前是拱了闺女,现在又拱了外孙。

也怪自己太没有仪式感,当然了,这不是自己的娃,自己也不能说什么。毕竟,人家是要仪式感的。

啧啧,这“该死的”仪式感。

上菜的时候也是说,尽量早点上,过节人挺多的。也是这时候,我才意识到,哦,原来真的是父亲节,多少还是有那么一点点的区别的。

浅谈 Uniapp 推送–iOS推送调试

2024年6月15日 14:33

懒惰,果然是会上瘾的。虽然这周比较忙,没有时间更新相关的功能以及测试。但是要说一点时间都没有,那自然是不可能的。拖拖拉拉终于就到了今天了,哼哼唧唧的开始测试 iOS 下的推送相关功能。

真的是,如果不努力躺平了,那就能快乐一整天。

结果在使用 hbuilder 进行真机调试的时候,上来就给来了个下马威:

在模拟器上推送的时候,app 开着是一切 ok 的,但是一点关掉 app,离线推送就挂了。

猜测可能是模拟器不支持离线推送,那么就直接真机跑吧。但是,这时候又出现蛋疼的问题了,自定义基座安装失败:

无法安装此 app,因为无法验证其完整性。这是神马高端错误?

搜索了一下发现都是废话,感觉没什么用。回忆了一下之前的打包过程,忽然想起来,可能在上次打自定义基座包的时候选择的 mobileprovision 文件可能是 appstore 的。果断更换ad hoc 的文件,重新打自定义基座包,再次使用 hbuilder 安装就 ok啦。

现在进行服务端的离线推送,手机上就能收到推送了,奶思~~

所以,进行离线推送调试的时候一定要使用真机,并且要安装自定义基座包。

也谈轻量云自动快照备份

2024年6月14日 17:11

之前在轻量云进行快照备份都是手工处理的,一般是升级系统或者版本发布的时候进行备份。但是这个备份机制有个比较麻烦的问题在于快照并不是非常及时。例如用户上传的头像文件,这些是存在服务器上的,手工备份就有点麻烦。

前几天看到杜郎的《腾讯云轻量应用服务器初体验》里面提到了自动备份脚本,体验了一下,能用,但是备份策略有点过于简单。轻量云一共可以创建两个快照,但是至于保留策略,提供了两种,一个是保留旧的,一个是保留新的。

代码的处理逻辑也很简单粗暴:

# 删除之前较早一个备份,就是列表里的第二个,状态需要正常才能删除
                SnapshotState = (get_rest['SnapshotSet'][Instanceidx]['SnapshotState'])
                if SnapshotState == 'NORMAL':
                    SnapshotId = (get_rest['SnapshotSet'][Instanceidx]['SnapshotId'])
                    DeleteSnapshots_re = DeleteSnapshots(SecretId, SecretKey, SnapshotId, region)
                    if DeleteSnapshots_re != False:
                        # 删除之前一个后,再进行备份
                        print('已经删除完成快照ID为{0}的快照,现在准备开始备份实例'.format(SnapshotId))
                        CreateInstanceSnapshot(SecretId, SecretKey, region, InstanceIds)

这个参数Instanceidx 本质上其实是个数组索引,所以要么删除第一个,要么删除第二个。如果我想长期保留一个快照该怎么办?答案是,没办法。哈哈哈。

先来说下这个东西怎么配置吧。

1.新建函数服务,选择从头开始,输入函数你改成,运行环境选 python 2.7

2. 事件函数,选择本地上传zip 包,文件下载地址:https://github.com/obaby/TencentLighthouseAutoSnapshot/blob/main/Lighthouse-Auto-Snapshot.zip

 

3.配置所需参数除了图上的,还需要添加KeepPolicy 1 或者 2

参数说明:

:param SecretId: str 腾讯云账号SecretId
:param SecretKey: str 腾讯云账号SecretKey

从这个地址创建或者查看:https://console.cloud.tencent.com/cam/capi
Regions_InstanceIds 为区域:实例 id 拼接,通过冒号拼接
实例地域
    "ap-beijing", "ap-chengdu", "ap-guangzhou", "ap-hongkong", "ap-nanjing", "ap-shanghai", "ap-singapore", "ap-tokyo", "eu-moscow", "na-siliconvalley"

eg:
ap-shanghai:guimiquan

将 guimiquan 替换为你的轻量云实例 id,实例与所在区域需要一致
:param Instanceidx: int 0:删除最新的保留最早的备份,这样可以有一个固定备份,1:删除最早
:param KeepPolicy: int 快照保留策略 1:默认删除逻辑 根据上述删除策略进行快照删除 2:保留特定扩展名的快照(如果快照名称包含 keep 或者 保留 将不会删除该快照),如果都包含按照上述删除策略删除快照

4. 触发器,每天零点,或者自定义

5.测试

 

6. 备份效果

为了满足自己的要求,增加了一项功能,也就是添加了一个KeepPolicy参数,如果快照名称包含 keep 或者 保留 两个说明,那么会删除其他的快照,如果所有的快照都包含这个标记,那么会根据删除策略删除较久或者较新的快照。在这个机制下就可以自己定义要长期保留的快照了。

代码实现(未做优化,简单粗暴型):

def main(SecretId, SecretKey, region, InstanceIds, Instanceidx=1, KeepPolicy=2):
    """
    GOGO
    :param SecretId: str 腾讯云账号SecretId
    :param SecretKey: str 腾讯云账号SecretKey
    :param region: str 实例地域
    :param InstanceIds: str 实例ID
    param Instanceidx: int 0:删除最新的保留最早的备份,这样可以有一个固定备份,1:删除最早
    """
    get_rest = get_info(SecretId, SecretKey, region, InstanceIds)
    if get_rest != False:
        TotalCount = get_rest['TotalCount']
        # 快照数
        if TotalCount < 2:
            # 直接备份
            CreateInstanceSnapshot(SecretId, SecretKey, region, InstanceIds)
        elif TotalCount == 2:
            if KeepPolicy ==1:
                # 删除之前较早一个备份,就是列表里的第二个,状态需要正常才能删除
                SnapshotState = (get_rest['SnapshotSet'][Instanceidx]['SnapshotState'])
                if SnapshotState == 'NORMAL':
                    SnapshotId = (get_rest['SnapshotSet'][Instanceidx]['SnapshotId'])
                    DeleteSnapshots_re = DeleteSnapshots(SecretId, SecretKey, SnapshotId, region)
                    if DeleteSnapshots_re != False:
                        # 删除之前一个后,再进行备份
                        print('已经删除完成快照ID为{0}的快照,现在准备开始备份实例'.format(SnapshotId))
                        CreateInstanceSnapshot(SecretId, SecretKey, region, InstanceIds)
            else:
                # 使用其他保留策略 备份名称中包含 keep 或者 保留 字样的快照保留 如果都保留,按照 0 1 策略删除
                snapshots = get_rest['SnapshotSet']
                snapshot_id = None
                for s in snapshots:
                    if 'keep' in  s['SnapshotName'] or u'保留' in  s['SnapshotName']:
                        continue
                    else:
                        snapshot_id = s['SnapshotId']
                if snapshot_id is not None:
                    print('准备删除快照ID为{0}的快照'.format(snapshot_id))
                    DeleteSnapshots_re = DeleteSnapshots(SecretId, SecretKey, snapshot_id, region)
                    if DeleteSnapshots_re != False:
                        # 删除之前一个后,再进行备份
                        print('已经删除完成快照ID为{0}的快照,现在准备开始备份实例'.format(snapshot_id))
                        CreateInstanceSnapshot(SecretId, SecretKey, region, InstanceIds)
                else:
                    print('多个快照都被设置为长期保存,根据删除策略进行快照删除')
                    SnapshotState = (get_rest['SnapshotSet'][Instanceidx]['SnapshotState'])
                    if SnapshotState == 'NORMAL':
                        SnapshotId = (get_rest['SnapshotSet'][Instanceidx]['SnapshotId'])
                        DeleteSnapshots_re = DeleteSnapshots(SecretId, SecretKey, SnapshotId, region)
                        if DeleteSnapshots_re != False:
                            # 删除之前一个后,再进行备份
                            print('已经删除完成快照ID为{0}的快照,现在准备开始备份实例'.format(SnapshotId))
                            CreateInstanceSnapshot(SecretId, SecretKey, region, InstanceIds)
        else:
            print('当前快照数量存在问题,请登录腾讯云后台检查并删除多余的快照后操作')
            time.sleep(5)
            exit()

 

项目开源地址:

https://github.com/obaby/TencentLighthouseAutoSnapshot

青岛的雾🌫️

2024年6月14日 14:07

早上带着宝子去上学,天空雾蒙蒙的。已经不是轻雾薄雾,而是已经能滴水的那种雾气。偶尔一阵风吹过让人有种下雨的错觉。宝子把外套的帽子带上了,说,哇,下雨了。

在回青岛之前,很少能体验到连续几天的大雾。最多可能那么一上午就消散了。来了青岛之后才发现,这些大雾真的是驱散都驱散不了,早上会起雾,下午会起雾,夜里也会起雾。

没当看到这种大雾,总会想起《寂静岭》里的那个大雾,这么多年过去了,虽然电影讲述的故事已经记不清楚,但是里面的大雾却深深的刻在了脑海里。尤其是开车在能见度不到 3 0 米的时候,甚至都不知道前面雾气里是什么。

最近几年在雾天跑长途的机会少了,县城拆迁的时候。要帮父母忙着跑各种手续,有时候是自己,有时候带着他们差不多每周都要跑一趟,或在夜间,或在白天。有时候也会遇到高速封闭的时候,这时候就只能从e 高速上找开放的入口,辗转到这个地方上高速。

在高速上,前方没车的时候,就只是白茫茫的雾气,车灯穿不透,视线看不穿。也只能尽量低速行驶,偶尔前面出现一辆车,或许会开着雾灯,或许会打着双闪。当然,更多的时候是双闪,此时就可以跟在它的后面跑一段,等到了岔路口或者匝道的地方可能就会失去这个目标,继续去寻找下一个目标。

好在,手机上的导航能知道前方的道路走向,不然,在看不到路牌的情况下真的不知道该往哪里走。

偶尔出现的团雾,更是有种进入了烟雾弹中的感觉,所有的感官都失效了,看不到路上的标线,也看不到周围的车辆。似乎时节都与世隔绝了,穿出团雾路段才能稍稍的松口气。雾大的时候,中午的太阳都无能为力,给人一种黄昏的感觉,看不到炽烈的阳光。或许,此时能让大雾消散的,只有一场大雨,或者是十级的狂风。

现在貌似又到了大雾天频发的季节了。连空气都变得湿漉漉,不用拧都能开始滴水了。

 

❌
❌