普通视图

发现新文章,点击刷新页面。
昨天以前首页

闲忙之中

2025年3月30日 00:30
最近几年的天气真是变化莫测,还不到四月就已经开启了空调!网上有消息说本世纪冰川会全部融化… 生活 上次只是带妞宝在市内玩玩,想换一个环境。 一直想着天气温暖可以带妞宝出去玩,现在的情况不容许我这么做。妞宝上学、老婆和我都在上班,这个出游计划不知何时才能成行。 我的脚痛原因找到了,原来是骨刺!真想不到我也会出现这样的情况。医生开了一点药,如果吃完还没效果那就需要打针,不知道打那个针会不会有后遗症… 经济 2025现在找工作、失业的人都很多,经济不景气。裁员、压缩工时、放假等等… 疫情期少之又少事,现在却成为了“常态”。过完年到现在我的经济压力也倍增,咬牙坚持! 不知什么时候才能转好,得做长久打算 […]

Chromebook折腾之2025

2025年3月5日 14:40

最近淘了一台洋垃圾Chromebook,折腾了一段时间,目前已经基本在日常使用了。在折腾过程中查找了许多的网上资料,解决了不少中文环境使用ChromeOS的问题,这里就分享一下Chromebook的选购和软件安装。

ChromeOS是什么

ChromeOS是Google从2009年开始开发的项目,可以简单理解为在Linux内核上运行的,以Chrome浏览器作为桌面环境,主要功能也是运行Web应用程序的一个操作系统。在之后,该系统也支持了运行Android应用程序,以及通过容器运行Linux程序,这样一套组合下来,我们就获得了一个原生支持运行Android应用,Linux应用和Web应用的系统,这比在Windows下面折腾Linux子系统,Android子系统要流畅得多。

目前为止,想要运行ChromeOS有两种方式,第一种就是购买ChromeBook,也就是搭载了ChromeOS的笔记本电脑或者触屏电脑。第二种方式,Google在2022年发布了ChromeOS Flex,让用户可以在经过认证的设备上安装ChromeOS Flex,包括一些Mac电脑也是支持的。

而想要激活ChromeOS,你需要有可以顺畅访问Google服务的网络。如果你没有这个条件,来自中国的fydeOS它是一个本地化的ChromeOS,内置了本地化定制和国内可以使用的网络服务,感兴趣可以去他们的官网看看。

Chromebook适合谁

ChromeOS最初设计出来也主要是方便云端办公,提供简单、快速、安全的环境,因此它更适合于对于性能没有要求,而希望简单吗体验的人。比如说:使用在线文档的文字工作者,得益于Google doc,飞书文档,语雀等文字和表格类在线工具,Chromebook简单的功能以及比较长的续航是一个性价比比较高的选择。除此之外,对于性能没有要求的开发者和数码极客或许也会考虑由于一台自己的Chromebook。

最新的Chromebook有两档标准,普通的Chromebook,以及Chromebook Plus,普通的Chromebook可能只搭载Intel Celeron处理器以及4GB的ROM, Plus也只是它性能的两到三倍。目前Chromebook在国内没有销售,通过天猫国际等平台平台购买的新机器一般也都比较贵没有性价比。对于普通用户国内平台在销售的平板电脑或者笔记本都比它有性价比的多。

而对于我所说的极客用户来说,在闲鱼淘一台洋垃圾Chromebook可能是一个比较有性价比的选择。比如我这台Lenovo Duet5,骁龙7C,8GB内存,256GB存储,13寸的OLED屏幕,搭配触控笔加键盘,支持平板模式和桌面模式,只要不到1500块钱,相比于iPad,看起来还是有点性价比的。

Chromebook选购指南

再次强调一下选择Chromebook需要保证有能够激活Google服务的网络环境。不具备的可以考虑fydeos,以及他们的Fydetab Duo设备。

在淘设备的时候,因为我们可能买到的是2019年或者更早发布的设备,我们需要关注设备的自动更新到期时间(简称AUE),所有ChromeOS设备都能够借助于Chrome浏览器几乎同步的更新节奏收到Google的定期更新。因此决定购买之前可以在Google的这个页面看一下该产品型号的AUE日期。

其次,电池健康度也是选择二手Chromebook产品时候值得关注的信息。本身购买Chromebook就是为了优秀的能耗和续航体验,电池不行这些就没办法完全达成了。购买前最好和商家沟通让对方打开「关于 ChromeOS > 诊断」界面并提供截图,可以在这个界面中清楚地看到当前设备的电池寿命、循环计数等信息。从这里可以大概预估该设备之前的运行时长,并且电池寿命高于90%应该是比较好的。我在这里就踩到了坑,因为是专门的二手商家,说了是库存设备,并且说没法激活设备不愿意提供截图导致我收到的设备实际上电池已经循环过了300多次,电池寿命只有86%,同时因为运行时间过长oled屏幕也有一点烧屏了。

最后,屏幕这块OLE屏幕可以让卖家把屏幕亮度跳到最低拍照这样也能看到一部分屏幕的缺陷,以及全白页面拍照测试等。关于型号的话,考虑到Android应用的兼容性,我选择的是ARM芯片的Duet设备,如果更加关注Linux应用的兼容性或许可以考虑X86芯片的设备。设备的型号这块,除了我提到的Duet,Google推出的Pixelbook Go, Pixelbook也是可以考虑的型号。

最后的最后,实际购买之前可以考虑使用现有设备刷如ChromeOS Flex或者fydeOS体验一下再做决定。

ChromeOS 初始化

ChromeOS本身的内核是Linux,但是为了安全,我们是没办法在上面安装Linux应用的,同时Android应用的安装也必须通过Play store才能安装,因此如果想要获得系统的完全控制权是需要开启开发者模式的。开启开发者模式后可以直接安装Android APK文件,同时也拥有了Root权限,可以在系统做修改,比如安装类似Mac下面homebrew的chromebrew工具等。但是代价是,每次启动电脑都会先跳出一个60s的警告页面(可以跳过),而在普通模式和开发者模式之间切换,所有的系统数据都会被清除,需要提前做好备份。

在我体验完开发者模式之后,决定还是回到安全模式。对于大部分人也都不需要开发者模式,我们通过Linux子系统开启Linux子系统的开发者模式,也就可以通过ADB来安装Android应用。因此如果想要开启开发者模式可以查看网上的资料。 初始化,可以通过家庭的软路由,或者手机上面开启Clash作为代理服务,在连接完网络后,修改网络中的代理服务,把手机或者软路由作为Chromebook的代理服务器,从而可以激活服务。同时要系统更新和安装Linux子系统需要稳定的翻墙服务,不然可能会失败。

ChromeOS初体验

ChromeOS内已经内置了一部分Web应用,包括了Google全家桶和一些工具应用。在未连接键盘鼠标前是平板模式,连接了之后为桌面模式。

以上为桌面模式,打开两个应用平铺,左下角为应用列表。

以上为平板模式的桌面

很多场景也可以通过浏览器进行,对于一些提供了PWA的网站,可以点击地址栏的安装按钮,这样就会生成一个桌面图标方便下次使用。也可以在Chrome应用商店安装扩展程序。

因为登录了Google账号,Chrome浏览器上安装的扩展程序,一些设置,书签等也都会同步过来。

同时ChromeOS还支持与Android手机连接,能够对手机进行简单的控制,包括手机的静音,地理位置权限开关,控制手机的热点并连接上网,查看手机最近的照片,打开的Chrome标签页等,如下图所示。

对于中文输入,Chrome内置了拼音输入法,如果使用双拼的话可以考虑使用fydeos提供的真文韵输入法,不过真文韵输入法没有软键盘,在平板模式还是没法使用,另外真文韵在Linux应用也无法使用,解决方法后面再说。

配置Linux子系统

Linux系统模式是未开启的,需要首先到「关于 ChromeOS 」中开发者部分开启,最新版本默认安装的是Debian 12,因为需要到Google的服务器上下载Linux镜像文件,这个过程可能非常慢,我这里差不多半个小时才完成。

有了Linux系统,我们首先需要安装中文环境,执行如下命令安装中文字体:

1
sudo apt install fonts-wqy-microhei fonts-wqy-zenhei fonts-noto-cjk

Linux上面是没法使用系统的输入法的,我们需要安装Linux的中文输入法,我这里就是安装的fcitx5,可以使用如下命令安装:

1
sudo apt install zenity fcitx5 fcitx5-rime

安装之后在 /etc/environment.d/ 文件中创建一个im.conf文件,并且写入如下内容:

1
2
3
4
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
SDL_IM_MODULE=fcitx

之后手动打开fcitx5,并且配置好自己的输入法选项就可以在Linux中使用应用了。

除此之外,就跟正常使用linux一样,安装的Linux应用如果是有桌面图标的也会在Chrome的应用列表中展示,同样对于deb文件,也可以直接在chrome的文件管理器中直接点击安装。

现在ChromeOS也支持了安装多个容器,也就是说可以运行多个不同的Linux,感兴趣的可以看看这位博主的这篇安装ArchLinux的文章

安装微信

微信算是每个人都必须有的通信工具了,在ChromeOS中有两种方式可以安装,一个是安装到Android子系统,直接在Google play下载就行了,另一种则是安装Linux版本的桌面微信。

但既然有这么大的屏幕,当然是桌面版使用体验更好了。我这里介绍一下在我的Debian12下面安装arm版本的微信的过程吧,因为微信的有一些依赖系统内是没有的组件需要安装。

1
sudo apt install libatomic1 -y && wget -O libwebp6.deb https://security.debian.org/pool/updates/main/libw/libwebp/libwebp6_0.6.1-2.1+deb11u2_arm64.deb && sudo dpkg -i libwebp6.deb

除了这个之外还缺少一个libtiff5,debian12上面已经有libtiff6了,我们创建一个链接就可以了。

1
sudo ln -s /usr/lib/aarch64-linux-gnu/libtiff.so.6 /usr/lib/aarch64-linux-gnu/libtiff.so.5

之后我们应该就可以使用Linux版本的微信了。

另外还推荐在Linux子系统安装stalonetray,这样就可以展示Linux的软件的托盘,比如去查看输入法状态,和切换输入选项等。可以参考这篇文章

对于Linux直接在Chrome点击deb文件安装的应用,虽然安装完了但是有可能点击图标打开的时候总是在转圈却打不开,这可能是因为程序出错了,可以在命令行中手动运行,这样错误日志就可以查看了。

配置安装非Google play的Android应用

如果想要安装国内的应用,可能很多都无法在Google play商店下载,一种方式是打开ChromeOS的开发者模式,但是那样每次开机就要忍受开机警告。我这里选择通过Linux子系统来安装。

首先打开「关于 ChromeOS -> Linux开发环境 -> 开发Android应用」,将其中的启用ADB调试打开。

点击启用的时候会有如下提示:

并且如果停用的话也会将Chromebook恢复出厂设置,所有数据被清空,使用这个功能需要谨慎。

再打开Linux命令行,执行如下命令安装adb工具。

1
sudo apt install adb

之后打开「设置 -> 应用 -> 管理Google Play 偏好设置 -> Android设置」,这样就进入Android系统的设置应用中了,可以在关于设备中多次点击版本号,开启Android子系统的开发者模式,在然后到系统,开发者选项中打开ADB调试。之后在linux命令行执行如下命令并显示正常就说明配置好了。

1
adb devices

之后就可以通过ADB安装程序了,当然也可以选择使用adb安装一个国内的应用商店,之后通过应用商店安装应用。

ChromeOS的体验介绍

使用了一段时间之后来说,作为一个轻量化的Linux 本来说,这台设备还是符合期望的。Linux,Android子系统都和宿主系统有着很好的深度绑定,使用子系统的应用也和使用宿主一样有着很好的体验。而在我这里一大缺陷为,因为Linux子系统和Android子系统都被划分到了私有网络,因此它们实际上网络是和Chromeos宿主共享的,但是和局域网的其他设备不是在同一个子网里面的,因此类似LocalSend这种工具是不能使用的。这里目前我的解决办法是使用fydeOS提供的fyDrop工具和其他局域网进行文件传输。

这个设备同时还支持通过usb typec接口连接外接显示器,chromeos有着不错的窗口管理,桌面分屏,这些功能都为使用体验加分许多。

如果只是轻办公我感觉这是一台很棒的设备,但是得益于这个性能,想要在这上面做Android开发,去编译程序那就不敢想象了。而至于要不要入坑,还是要你自己决定。

最后照例来推荐一些可以参考的资料:

  1. fydeOS源于chromeOS,这边的中文资料都可以参考:https://community.fydeos.com/t/topic/40986
  2. Chrome 官方的文档: https://chromeos.dev/en/linux
  3. 解锁开发者模式和一些折腾,可以参考这边文章和博主的其他文章: 打造一台适合生产的Chromebook

看完评论一下吧

当了UP主四年多: 油管/Youtube上传了700多期视频, 2000个粉丝

2025年2月14日 03:46

youtube 当了UP主四年多: 油管/Youtube上传了700多期视频, 2000个粉丝 折腾 教娃 教育 育儿 视频

油管/Youtube

我曾经说过不想做UP主。后来觉得孩子大了,可以开始教他们编程,于是尝试了几节课,朋友建议把这些内容上传到油管,既能记录也能分享。我觉得这个主意不错,于是就开始了。前500期视频因为没有时间剪辑和加字幕,所以直接用iPhone拍好后就上传了。

到了500期后,我强迫自己开始剪辑,使用了手机上的“必剪”App和PC上的“剪影”软件,这两款都是字节跳动出品的。现在这两款软件的自动字幕功能已经不再免费了。

最初只上传到油管,后来也同步到了B站,接着又上传到西瓜视频、微信视频号,还尝试了小红书和微博视频。我把视频上传到这么多平台,主要是为了备份,利用这些免费的云存储多做些备份,同时还能赚点小钱。

不过要是真是按付出时间和挣得的钱来算,真是亏麻了。能挣钱的UP主并不是很多,大多数人还是不挣钱的,投入的时间和收入不成正比。我们总是在网上听人说挣了很多钱,这大概率是幸存者偏差,头部效应。UP主一旦停止更新,很有可能就会很快失去流量,失去流量就等于失去收入

到现在为止,油管还没达到YouTube Partner Program的收入门槛,B站的收入大概几千元,应该是前两年有过一些推广活动。西瓜视频提现过一次,应该也是两三千元,微信视频号的收入就几块钱。

目前,B站有四万多粉丝,油管只有2000个。留下来的都是铁杆粉丝。B站上我把所有的视频都放在一个账号里,包括教媳妇编程的内容;而在油管,我把中英文的内容分成了两个频道,也许是因为这个原因,油管/Youtube的公开观看时长不够。

我的频道:油管/Youtube | 中文油管频道/教媳妇 | B站/小破站 | 微博视频 | 西瓜视频 | 微信视频号 | X/推特 | 小红书

youtube-700-days 当了UP主四年多: 油管/Youtube上传了700多期视频, 2000个粉丝 折腾 教娃 教育 育儿 视频

油管上陆陆续续上传了700天,每期视频都几十次浏览,一两个Like/赞。

youtube-2000-subscribers 当了UP主四年多: 油管/Youtube上传了700多期视频, 2000个粉丝 折腾 教娃 教育 育儿 视频

终于在今年初过了2000个粉丝。

youtube-channel-day-1 当了UP主四年多: 油管/Youtube上传了700多期视频, 2000个粉丝 折腾 教娃 教育 育儿 视频

第一天上传视频是2020年11月22日,当时还在亚马逊AWS S3工作。

youtube-earning-public-watch-hours 当了UP主四年多: 油管/Youtube上传了700多期视频, 2000个粉丝 折腾 教娃 教育 育儿 视频

油管得YPP开通挣钱门槛需要3000/4000个小时公开观看时长。

教娃编程

本文一共 816 个汉字, 你数一下对不对.
当了UP主四年多: 油管/Youtube上传了700多期视频, 2000个粉丝. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 当了UP主四年多: 油管/Youtube上传了700多期视频, 2000个粉丝 折腾 教娃 教育 育儿 视频
The post 当了UP主四年多: 油管/Youtube上传了700多期视频, 2000个粉丝 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  2. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  3. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. 1 2...
  4. 英国房子的EPC节能报告(Energe/Efficiency Performance Certificate) EPC (Energe/Efficiency Performance Certificate) 是英国房子的节能报告, 法律上规定, 每个房子都必须要有一个EPC报告, 报告的有效期为十年. 房东在把房子出租或者想卖房的时候, 这个EPC就必须有效, 在一些情况下 比如出租房子的时候, 这个EPC报告还必须符合一些最低标准, 比如房子必须满足 F档(类似及格线)...
  5. 公司请的专业摄影师 公司来了新的CEO管理之后,很多事情都不一样了, 特别是一些公司对外形象的事情就特别的在意, 比如公司网站用上SSL.现在公司还有空闲的位置,请速来(钱多人不傻). 一月份出差回LUTON,刚好公司请来摄影师给高层管理照像放网站上的,于是我也凑了凑热闹(但是却还不够资格被放在公司网站上),不过没关系,放这里也差不多. 人到中年, 沧桑感强了些. 更新更新: 同事用他NB的单反给谢菲尔得办公室的人也拍了一组这样的照片.看起来很不错, 很专业,灯光,道具应有尽有.我已经用在了LINKEDIN页面上,立马高大上. 本文一共 230 个汉字, 你数一下对不对. 公司请的专业摄影师. (AMP...
  6. 面向猫猫编程 Cat Oriented Programming (Chessly/Pyro这一生持续更新) 家里有两只猫 Chessly/Pyro,想着找个地方记录它们的生活,最后决定还是写在这里的博客。猫的一生很短,差不多也就二十年。 Chessly(黑白猫)是我加入微软剑桥研究院MSRC第一个月带回家的,过了两三个月,又把Pyro(橘猫)也接回了家。两只猫的名字是孩子们取的:Chessly因为黑白的像棋盘,加上“ly”听起来像个女孩的名字;而Pyro的意思是一团火(烟火),充满活力。 刚开始的时候,Chessly特别喜欢待在我的工作区域。她有时候趴在键盘上或旁边,有时候藏在显示器后面。偶尔还会绕到我身边“咕咕”地撒娇,等着我去摸她。有时更干脆跑到我腿上,舒舒服服地躺着。 不过,现在它们俩的体型都大了很多,躺在桌上就会挡住屏幕,真是“面向猫猫编程”(Cat Oriented Programming)的极致体验。 记录生活的点滴,也是一种珍惜,毕竟这二十年,我们会一起走过。 2024年 2025年 Ring视频:两猫日常就是打闹,Chessly追上Pyro想舔他,在猫的世界里,地位高的才能舔地位低的。 我家猫现在越来越胖,很喜欢在我工作的时候躺在显示器钱,很影响我的工作,不过这时候我就是会休息一下摸摸她,就当放松一下了。 Pyro在窗边喝水,这是个小的煮饭锅,现在不用了,就给猫当喝水的碗。Pyro很胆小,经常看到我就跑。没法跑就咕咕叫。 Chessly很喜欢陪我工作,然后她很好厅的盯着屏幕上的鼠标光标,真怕她把屏幕抓坏了。 哥哥弹琴,弟弟唱歌,Chessly午睡,真是幸福啊,下辈子做只猫吧。...
  7. 在英国给孩子换学校的经历: 孩子离开了村里的小学 由于搬了家, 孩子上学得提前半小时出门了, 因为早上堵, 也得开车半小时才能到. 之前在 Fen Drayton 村庄上小学, 早上8:45学校门开, 9点敲钟孩子排队依次进入教室, 我们由于在村里, 只需要提前5分钟出门和孩子一起走路就可以了. 现在一下子早上变得很匆忙, 得叫孩子起床, 做早饭,...
  8. 公司给配了台高配DELL笔记本 早上例会结束的时候我顺便说了一句 我的笔记本有点慢, 当时我并不知道我的经理远程用电话也参加会议了(他全程在听), senior staff SE 对着电话说, “peter, you hear that? btw, my disks are...

使用Leafletjs实现足迹地图功能

2025年2月9日 11:40

我的博客上面挂着一个使用Leaflet实现的足迹地图功能,最近又给他添加了一些功能并且进行了一些美化。之前也有人问题这个怎么实现的,趁着刚折腾完来分享一下。

代码库的选择

早前一直想要做一个足迹的功能,像是国内的百度地图和阿里地图都有js的sdk,但是他们的sdk使用不简单,并且他们的地图只有国内的。后来了解过google map以及mapbox,但是都没有深入研究。后来看到博主水八口记使用了leaflet还比较简单,就使用这个库来实现了我的足迹功能。

地图图层

使用leaflet的一大好处是,你可以自由使用你想要的地图图层,对于符合Leaflet的地图瓦片地址我们是可以直接使用的,通常是类似这种格式的地址: https://{s}.somedomain.com/{foo}/{z}/{x}/{y}.png,其中的{z}/{x}/{y}是必须要支持的,leaflet会在运行的时候替换具体的值,从而请求对应的放大级别(z,zoom), 对应坐标(x, y)的瓦片进行渲染。

一般使用cartocdn提供的openstreetmap的地图时,是可以直接使用的,但是我们如果想要使用mapbox地图或者其他地图供应商的时候,就需要借助插件了,可以在这个页面看看有没有Plugins - Leaflet - a JavaScript library for interactive maps

对于地图图层,leaflet是支持同时加载多个图层的,比如说我可以添加一层底图再添加一层天气卫星图。

我们这里先看一下如何创建一个地图并且设置我们的地图图层. 首先需要引入leaflet的css和js文件

1
2
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin=""/>
<!-- js引入一定要放到css的后面 --> <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script>

之后,在我们需要显示地图的位置放一个div元素,并且设置一个id,这样我们在后面的js代码中才能控制它:

1
<div id="footprintmap"></div>

同时我们可以通过css设置这个容器的宽度高度:

1
2
3
4
#footprintmap {
width: 100%;
 height: 180px;
}

这些做完之后就可以在javascript中去创建地图对象,并且给它添加地图图层了:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<script type="text/javascript">

 //地图的版权声明,使用三方地图数据出于对版权的尊重最好加一下
      var cartodbAttribution = '&copy; <a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a> contributors, &copy; <a href="https://carto.com/attribution" target="_blank">CARTO</a>';
      var map = L.map('map', {gestureHandling: true, minZoom: 1, maxZoom: 14}).setView([33.3007613,117.2345622], 4); //创建地图,设置最大最小放大级别,setView设置地图初始化时候的中心点坐标和放大级别
      map.zoomControl.setPosition('topright'); //设置放大控制按钮的位置
      map.createPane('labels');

      map.getPane('labels').style.zIndex = 650;

      map.getPane('labels').style.pointerEvents = 'none';

      L.tileLayer('https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png', {

    attribution: cartodbAttribution

}).addTo(map); //添加地图图层到map对象当中

</script>

添加足迹点到地图中

经过以上的步骤我们就可以在网页上展示一个地图了,而我们实现足迹功能一般会给我们去过的地点打上标记。一种方法是给去过的城市做一个蒙层,一种方式是加一些点标记。这里先看加点标记的方法。

标记在Leaflet中称为Marker, 我们可以使用以下代码添加默认的Market:

1
marker = new L.marker([33.3007613,117.2345622]).bindPopup("popup text").addTo(map);

效果如下:

在上面我们通过bindPopup来设置点击Marker之后弹出的内容,其中我们是可以设置HTML元素的,因此我们就可以显示图片或者超链接之类的内容了。

如果不喜欢这个默认的蓝色Marker,也可以替换为图片。比如我用如下的代码就设置类一个svg图片作为Market标记图:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
function colorMarker() {
  const svgTemplate = `
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" class="marker">
      <path fill-opacity=".25" d="M16 32s1.427-9.585 3.761-12.025c4.595-4.805 8.685-.99 8.685-.99s4.044 3.964-.526 8.743C25.514 30.245 16 32 16 32z"/>
      <path stroke="#fff" fill="#ff471a" d="M15.938 32S6 17.938 6 11.938C6 .125 15.938 0 15.938 0S26 .125 26 11.875C26 18.062 15.938 32 15.938 32zM16 6a4 4 0 100 8 4 4 0 000-8z"/>
    </svg>`;
  const icon = L.divIcon({
    className: "marker",
    html: svgTemplate,
    iconSize: [28, 28],
    iconAnchor: [12, 24],
    popupAnchor: [7, -16],
  });
  return icon;
}

marker = new L.marker([lat, lng], {
    icon: colorMarker(),
  }).bindPopup(popupText).addTo(map);

主要是在前面创建marker的时候传的这个icon,你也可以传普通的图片。

如果我们需要展示多个点的时候,我们可以把这些点的数据存储成一个json,并且把他作为一个JavaScript对象加载,再读取他把每个点添加到地图中。 我就创建了一个points.js的文件保存所有的点:

1
2
3
let points = [
    ["<b>北京</b><i>Beijing</i><a href='/2025-01-beijing/'><img src='https://img.isming.me/photo/IMG_20250101_133455.jpg' />北京游流水账</a>", 40.190632,116.412144],
    ["<b>广州</b><i>Guangzhou</i>", 23.1220615,113.3714803],];

内容大概如上:

1
2
<!--加载点数据这样我们在javascript环境中就可以拿到points这个数组-->
 <script type="text/javascript" src="/points.js"></script>

以上加载了点数据,通过下面的代码来读取并且添加点:

1
2
3
4
5
6
7
for (let i = 0; i < points.length; i++) {
//循环遍历所有点,并且保存到如下三个变量中
  const [popupText, lat, lng] = points[i];
  marker = new L.marker([lat, lng], {
    icon: colorMarker(),
  }).bindPopup(popupText).addTo(map);
}

到此为止就完成了足迹点功能的开发。

去过的区域图层开发

而我们要实现去过的城市标记,这个时候就不是一个一个的点了,我们可能给去过的城市添加遮罩,这个其实就是给地图上画一个新的图层。每一个城市本质上就是许多个点围成的多边形,我们可以使用Leaflet提供的polygon方法来绘制,但是我们需要给把每个城市的多边形的各个顶点找到并且组织成一个数组,工作量真的是巨大的。

这样的难题我们不是第一个遇到的,前人已经遇到并且帮我们解决了。在2015年就有了GeoJson这种用Json描述的地理空间数据交换格式,他支持描述点,线,多边形。而Leaflet对齐也有支持。因此,我们只需要找到我们所需要的城市的geojson数据的MultiPolygon或者Polygon数据,就可以在Leaflet中进行绘制了。

对于中国的数据,我们可以在阿里云的datev平台进行下载,你可以省份数据或者按照城市甚至更小的行政单位下载数据。对于国外的数据可以到github上面去查找,这里是一份国家数据: datasets/geo-countries: Country polygons as GeoJSON in a datapackage

对于我们下载的中国的geojson数据,因为比较详细,也就比较大,我们可以使用mapshaper这个工具来对数据进行一些处理,直接使用Simplify功能,使用它减少点的数量,从而减少我们的文件的大小。

按照geojson文件格式,我们对于多个城市需要组成一个类似如下的json:

1
2
3
4
5
6
{
"type": "FeatureCollection", features: [
{"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [[[88.40590939643968,22.55522906690669],[88.36498482718275,22.494854169816982],[88.28898205570562,22.51497913551355],[88.2714429545955,22.55235407180718],[88.32990662496253,22.55235407180718],[88.36498482718275,22.60410398359836],[88.35913846014606,22.62997893949395],[88.38837029532957,22.62710394439444],[88.40590939643968,22.55522906690669]]]}},
...
]
}

对于这样的一个json对象,我们就可以直接使用Leaflet的geojson文件进行加载,代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
function onEachFeature(feature, layer) { // does this feature have a property named popupContent?
 if (feature.properties && feature.properties.popupContent) {
 layer.bindPopup(feature.properties.popupContent); //从json文件中读取属性进行popup展示
 }
}

var geojson = L.geoJSON(areas, {
 onEachFeature: onEachFeature,
  style: function (geoJsonFeature) {
    return {
      color: '#ffcc80', //设置遮罩的颜色
      fillOpacity: 0.4, //设置透明度
      stroke: false, //是否要显示边缘线
    };
  }
}).addTo(map);

对于geojson我们也可以在properties中设置弹框的内容进行展示。

总结

到这里我们就完成了基于leaflet的一个足迹地图,既包括足迹点,也包括去过的城市的遮罩。而geojson和Leaflet的功能远远不止这些,感兴趣的可以去看相关文档。另外因为我使用的地图是openstreetmap的数据,关于中国领土有争议的部分标记不正确,这个不在我的解决能力范围之内,只能暂且使用,但是不代表本人观点。

参考资料:

  1. Tutorials - Leaflet - a JavaScript library for interactive maps
  2. https://tomickigrzegorz.github.io/leaflet-examples/
  3. GeoJSON - 维基百科,自由的百科全书
  4. DataV.GeoAtlas地理小工具系列

看完评论一下吧

时代不同, 我儿子10岁就能通过github pages做一个静态网站

2025年1月24日 06:17

今天,我二娃搞了一个网页/网站,他通过 GitHub Pages 完成的,其实不难。几天前,他注册了一个 GitHub 账户(被戏称为全世界最大的“同志网站”——gayhub),取了个 ID,叫做 faceless15748。他说 faceless15 已经被人注册了。

他还自学了 HTML 和 Markdown,并且稍微懂一些 JavaScript 和 CSS。比我十岁时强多了。我十岁的时候,记得的只有在院子里玩泥巴。

我娃自己查文档、搜索,还会用 Copilot,他说以后想和我一样成为软件工程师。我竟然有点小小的感动。

在这个信息化的时代,技术的门槛越来越低。回想起我小时候,接触计算机和编程的机会并不多,学习的资源也十分有限。然而,今天的孩子们拥有无数的学习机会和工具,他们可以通过网络和开源项目实现几乎任何想法。

ryan-first-website-github-pages-scaled 时代不同, 我儿子10岁就能通过github pages做一个静态网站 学习笔记 折腾 教娃 教育 生活 程序员 编程 网站信息与统计 育儿

我儿子的第一个网站是架在Github上的静态网页。

my-son-ryan-first-website-version-2 时代不同, 我儿子10岁就能通过github pages做一个静态网站 学习笔记 折腾 教娃 教育 生活 程序员 编程 网站信息与统计 育儿

第二个版本,加了个图片,家里的猫Pyro

什么是 GitHub Pages?

GitHub Pages 是一个免费的静态网站托管服务,用户可以通过 GitHub 仓库将 HTML、CSS 和 JavaScript 文件上传,并托管成一个网站。这个服务特别适合个人、项目或组织展示,甚至可以直接用来做博客或者作品集。

如何轻松创建并托管你的 GitHub Pages 站点 (无服务器静态应用)

GitHub Pages 的最大优势之一就是无需服务器支持。所有的文件都会被托管在 GitHub 提供的全球 CDN(内容分发网络)上,加载速度非常快,且完全免费。更重要的是,GitHub Pages 完全支持自定义域名,允许你轻松地展示个人创作。

本文一共 550 个汉字, 你数一下对不对.
时代不同, 我儿子10岁就能通过github pages做一个静态网站. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 时代不同, 我儿子10岁就能通过github pages做一个静态网站 学习笔记 折腾 教娃 教育 生活 程序员 编程 网站信息与统计 育儿
The post 时代不同, 我儿子10岁就能通过github pages做一个静态网站 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 教娃编程有趣的瞬间 vlog视频集合 教娃700天:写在教娃编程700天, what’s next?。有很多有意思的瞬间记录一下,持续更新。 和孩子一起打闹,学习,成长。 教娃编程孩子有趣的瞬间 vlog(Day 641) 娃说我不够 Senior(Day 701) Bro.. I thought you’re like...
  2. 如何轻松创建并托管你的 GitHub Pages 站点 (无服务器静态应用) 创建一个 GitHub Pages 站点是一个简单的过程,可以免费为你的个人、项目或组织创建网站/博客。按照此指南开始。 步骤 1:创建 GitHub 仓库 登录你的 GitHub 账户。 点击“新建”来创建仓库。 对于个人站点,命名为 .github.io。 对于项目站点,使用任何有效的名称。...
  3. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  4. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  5. 最好的发财策略就是忘记它 在群里我和 @nationalpark 说到我用STEEM换了3000多个 YOYOW的时候我还有点沾沾自喜, 谁知道他一针见血: 听说你是steem换的我顿时心理平衡了 才突然想起来, 我半个月前是拿 500 个 STEEM 换了 将近3300个YOYOW. 今天 STEEM的价格8美元,...
  6. 面试刷题更像是一种服从性测试 在许多求职者看来,面试中的刷题环节似乎是对技术能力的直接考察。然而,从另一个角度来看,这一过程或许更像是一场服从性测试。 想象一下,当一个公司要求候选人解决复杂的算法问题或设计一个系统架构时,真正的目的并不仅仅是判断候选人是否能完成这项任务。许多时候,公司更关心的是你是否愿意花时间和精力去迎合他们的流程和标准。 为什么这样说呢?从实际工作中来看,绝大多数岗位并不需要员工每天都在解决高难度的算法问题或从零设计分布式系统。相反,工作中的任务更偏向于理解业务逻辑、维护现有系统以及团队协作。那么,为什么刷题依然是很多公司青睐的筛选方式? 答案或许在于,刷题能有效筛选出那些愿意投入大量时间准备,并在面试中展现高度配合精神的候选人。这种配合精神,是公司希望在未来的工作中看到的品质。一旦你通过了这些测试,公司就会认为你是一个值得信赖的员工,一个能遵从流程、适应规则并在需要时投入额外努力的人。 还有就是以前说的:面试刷力扣是大公司过滤的成本较低的方法之一:为啥有名的IT公司的程序员面试都这么难?,可以过滤掉大部分 False Positive,当然也有可能过滤掉人才(胜任工作的求职者)。不过对于大厂来说,招进来一个False Positive的损害要远远比错过一个False Negative大。 此外,随着AI技术的飞速发展,刷题的技术价值正在逐渐降低。像ChatGPT这样的AI工具,已经可以轻松解决LeetCode或Codeforces上的许多高难度问题,并给出清晰的解题过程。这表明,算法题不再是人类独有的技术优势,而是可以被高效地自动化处理的任务。这种变化进一步凸显了刷题在实际工作中的局限性,因为日常工作更多依赖于沟通、业务理解和对系统的长期维护,而不是短时间内解决某个抽象问题。 OpenAI推出o3大语言AI模型。 Codeforces 评分:2727——相当于全球人类程序员编码竞赛中,排名第 175 位。...
  7. 英国 NatWest 银行推出 Reward Current Account 用来交水电费等帐单可以省钱 英国 NatWest 银行推出 Reward Current Account 银行帐号, 每个月需要交会费 3 英镑, 一年则需要36英镑 并不便宜, 但是好处是 只要通过该帐号以 Direct...
  8. 科学上网 通过 CloudFlare Worker 搭建 Js Proxy代理 CloudFlare 的 Worker 就是 Serverless (无服务器, 所有程序跑在云端). 以前是付费的, 现在免费了. 免费帐号可以创建30个 Worker, 每个帐号每天可以有10万次免费请求. 超过了可以配置 Fail Open...

在LG的OLED智能电视下刷题/力扣

2025年1月8日 00:57

装修时花大价钱买的65寸LG OLED智能电视(4K),挂在厨房后利用率很高。

平时一家人吃饭时会看看综艺,有时候孩子们会看他们喜欢的内容,比如游戏视频、宝可梦和超级玛丽等。

有一天,偶然发现老婆用电视内置的浏览器操作,看她用遥控器当鼠标,配合屏幕上的电子键盘访问了一些国产视频网站。顿时灵感来了:这电视不是可以用来刷题吗?于是立刻行动起来,把家里闲置的蓝牙鼠标和一把KeyChron机械键盘(支持蓝牙和Type-C两种模式)找出来。然而,电视却无法识别这两个设备,略感遗憾。

不过,电视上显示支持特定型号的蓝牙设备,还列出了推荐清单。最终我入手了相对平价的罗技M535蓝牙鼠标和Arteck键盘,总共花了55英镑。对比之下,苹果的键盘Apple Magic Keyboard和鼠标Apple Magic Mouse 2加起来要180英镑左右(99+79),贵太多了。

实际体验下来,电视浏览器的运行速度稍慢,打字时有些延迟,而且每次输入时屏幕都会弹出电子键盘,还需要按ESC手动隐藏。不过整体来说,刷力扣/LeetCode的简单题还是够用的。吃饭时趁机给孩子刷两道题,就当复习了。

网友建议:

  • “可以买个Mac Mini。”
  • “直接用MacBook投屏也行啊。”
  • “都接键鼠了,可以用串流软件远程操作家里的电脑。”
  • “几十磅买个小型x86主机接上去效果更好。”

确实,电脑投屏是个不错的选择,但老婆不允许在厨房放电脑。这次的重点是直接利用电视的浏览器搭配蓝牙鼠标和键盘,方便轻便,简单实用。把电视当成一个电脑,好过于再依赖于任何外接设备(除了鼠标和键盘)。

您之前连接的设备会自动连接。要断开现有连接,请单击“断开连接”。

建议您使用已测试与此设备兼容性的产品。

  • 蓝牙鼠标:Logitech M535、Logitech Mx Master 2s、Apple Magic Mouse 2
  • 蓝牙键盘:Logitech K480、Arteck HB030B、Arteck HB192、Apple Magic Keyboard
  • 蓝牙游戏手柄:Sony Dual shock 4、Sony Dual Sense 控制器、Sony DualSense Edge 控制器、Microsoft Xbox One S 控制器、Microsoft Xbox Series X 控制器、Microsoft Xbox Adaptive 控制器、NVIDIA SHlELD 控制器 Amazon Luna 控制器、Shaks S3b、Shaks s2b、Nintendo Switch Pro 控制器、Nintendo Joy-con 控制器、MOGA XP5-X Plus 控制器

此功能仅适用于支持蓝牙的型号!

连接多个蓝牙设备可能会导致连接不良或操作不当。

The device you’ve previously connected to, it connects automatically. To disconnect the existing connection, click Disconnect.

It is recommended that you use a product that has been tested forcompatibility with this devices.

  • Bluetooth Mouse: Logitech M535, Logitech Mx Master 2s, Apple Magic Mouse 2
  • Bluetooth Keyboard: Logitech K480, Arteck HB030B, Arteck HB192, Apple Magic Keyboard
  • Bluetooth Gamepad: Sony Dual shock 4, Sony Dual Sense Controller, Sony DualSense Edge Controller, Microsoft Xbox One S Controller, Microsoft Xbox Series X Controller, Microsoft Xbox Adaptive Controller, NVIDIA SHlELD Controller Amazon Luna Controller, Shaks S3b, Shaks s2b, Nintendo Switch Pro Controller, Nintendo Joy-con Controller, MOGA XP5-X Plus Controller

This feature is available for Bluetooth-enabled models only!

Connecting multiple Bluetooth devices may result in poor connection or operation.

leetcode-on-kitchen-oled-tv-2025-01-07-13.33.31-scaled 在LG的OLED智能电视下刷题/力扣 折腾 智能电视 硬件 程序员 编程 资讯 键盘 鼠标

娃在学习,和娃也方便聊算法编程等。

leetcode-coding-on-smart-tv-with-bluetooth-keyboard-mouse-2025-01-06-18.44.11-scaled 在LG的OLED智能电视下刷题/力扣 折腾 智能电视 硬件 程序员 编程 资讯 键盘 鼠标

每天都刷题,连接刷了五年多了。

leetcode-coding-on-smart-tv-with-bluetooth-keyboard-mouse-2025-01-06-18.43.53-scaled 在LG的OLED智能电视下刷题/力扣 折腾 智能电视 硬件 程序员 编程 资讯 键盘 鼠标

在LG的65寸智能OLED电视上刷力扣还是挺新奇的。

leetcode-coding-on-smart-tv-with-bluetooth-keyboard-mouse-2025-01-06-18.21.37-scaled 在LG的OLED智能电视下刷题/力扣 折腾 智能电视 硬件 程序员 编程 资讯 键盘 鼠标

娃在吃饭可以顺便教学一下,就当复习了。

leetcode-coding-on-smart-tv-with-bluetooth-keyboard-mouse-2025-01-06-18.13.21 在LG的OLED智能电视下刷题/力扣 折腾 智能电视 硬件 程序员 编程 资讯 键盘 鼠标

平时吃饭/在厨房喝个咖啡休息的时候就可以刷一题。

leetcode-coding-on-smart-tv-with-bluetooth-keyboard-mouse-2025-01-06-18.13.17-scaled 在LG的OLED智能电视下刷题/力扣 折腾 智能电视 硬件 程序员 编程 资讯 键盘 鼠标

刷题的设备:罗技M535蓝牙鼠标+Arteck蓝牙键盘

leetcode-coding-on-smart-tv-with-bluetooth-keyboard-mouse-2025-01-06-18.13.10-scaled 在LG的OLED智能电视下刷题/力扣 折腾 智能电视 硬件 程序员 编程 资讯 键盘 鼠标

第一次在智能电视上刷题/力扣

leetcode-coding-on-smart-tv-with-bluetooth-keyboard-mouse-2025-01-06-18.12.48-scaled 在LG的OLED智能电视下刷题/力扣 折腾 智能电视 硬件 程序员 编程 资讯 键盘 鼠标

这个电子键盘很烦人,尽管连接上了蓝牙键盘,还是时不时显示出来,这时候按ESC就可以隐藏。

leetcode-coding-on-smart-tv-with-bluetooth-keyboard-mouse-2025-01-06-18.08.39-scaled 在LG的OLED智能电视下刷题/力扣 折腾 智能电视 硬件 程序员 编程 资讯 键盘 鼠标

第一次在LG智能电视上打开了力扣网站

leetcode-coding-on-smart-tv-with-bluetooth-keyboard-mouse-2025-01-06-18.06.51-scaled 在LG的OLED智能电视下刷题/力扣 折腾 智能电视 硬件 程序员 编程 资讯 键盘 鼠标

在智能电视内置的浏览器打开力扣刷题网站

leetcode-coding-on-smart-tv-with-bluetooth-keyboard-mouse-2025-01-04-22.17.35 在LG的OLED智能电视下刷题/力扣 折腾 智能电视 硬件 程序员 编程 资讯 键盘 鼠标

LG智能电视支持的蓝牙设备:键盘/鼠标

leetcode-coding-on-smart-tv-with-bluetooth-keyboard-mouse-2025-01-04-22.11.13-scaled 在LG的OLED智能电视下刷题/力扣 折腾 智能电视 硬件 程序员 编程 资讯 键盘 鼠标

智能电视可以支持蓝牙设备

刷题:程序员的基本技能

英文:How to do Leetcoding on LG OLED Smart TV (65 inch)?

本文一共 1114 个汉字, 你数一下对不对.
在LG的OLED智能电视下刷题/力扣. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 在LG的OLED智能电视下刷题/力扣 折腾 智能电视 硬件 程序员 编程 资讯 键盘 鼠标
The post 在LG的OLED智能电视下刷题/力扣 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. ACM题解系列之 – 最小堆栈 (Min Stack) 没事刷刷题能防止老年痴呆, 而且也能让你随时处于最佳状态, 随时都可以炒老板鱿鱼另谋高就. 题目: 设计一个堆栈(Stack)使 push, pop, 和取最小 min 操作时间复杂度都是 O(1). 这题的难点就是在于怎么样用O(1)常数时间复杂度来取得堆栈里的最小值. class MinStack {...
  2. 停了我使用8年的美国运通白金卡(American Express) AMEX是指美国运通公司(American Express Company), 该公司成立于1850年, 总部位于美国纽约的百老汇区. 它是一家金融服务公司, 主要从事信用卡, 旅行和金融服务. 其信用卡业务覆盖了150多个国家和地区, 拥有超过1.4亿张有效信用卡. AMEX提供各种商业服务, 旅行服务, 保险服务以及电子支付等金融产品服务. 今天早上打电话把我的美国运通白金卡给取消了(Amex, American...
  3. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  4. 推荐一款程序员性价比高的机械键盘 KeyChron K8 程序员性价比高的机械键盘 Keychron 我第一款 keychron 键盘是四年前(2020年)买的,当时在AMAZON工作,通过公司经费报销的。当时还问了经理,需要节俭么?因为亚马逊的16条军规中的一条就是节俭/Frugal。当时经理说,只要能提高你的工作效率就行,我也没太敢搞太贵的,最后面只挑了一个60多美元的机械键盘,型号是: Keychron C2 Wired Mechanical Keyboard, RGB Backlight / Gateron Mechanical...
  5. ChatGPT 使用 Promise.All 重构/重写代码(并行发送请求) 在我的一个项目中, 我有以下代码(Node/Javascript), 它(顺序)调用了一些 API. 这些 HTTPS 请求其实是可以并行完成的, 因为它们相互独立. 然后结果会被聚合到一个数组中. 我知道可以用Promise.all来把这些请求并行化, 我就问了ChatGPT怎么弄, 看看它是否能理解并给出正确的代码: 我先用英文问 ChatGPT-3.5: Rewrite...
  6. 投诉 npower 电气公司 之前讲过 npower 电气公司是多么的不靠谱. 一年过去了, 帐单都算不对. 几乎是每次收到帐单或者银行乱扣钱了(我是三个月来一次帐单, 不清楚怎么搞的一个月扣一次定额), 我总是打电话去, 每次得到的答复就是会把帐单修正过来, 但每次都没有. 简单来说, 就是一年前的圣诞节, 我让 npower 过来家里装上另一个电表,...
  7. 互联网大厂的 PIP 裁员计划 互联网大厂的 PIP 裁员计划...
  8. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...

浏览器插件推荐:AI Share Card 生成网页分享卡片

2025年1月6日 23:17

一款 AI 网页分享卡片生成小工具,利用 AI 将网页内容一键转换为精美的分享卡片。

真是万物皆可卡片,看到支持自定义模板,所以又折腾了一晚。

但,好像也没啥大用…… 那就,玩呗~

上效果对比图(左为默认样式)

自定义模版代码分享

两个 import 分别是来源 SVG 图标,自定义字体。

<style>
@import url(https://r2.immmmm.com/via.css);
@import url(https://static.zeoseven.com/zsft/7/main/result.css);
.card{font-family:"Zhuque Fangsong (technical preview)"}

.powered-by{visibility:hidden}
.powered-by span{visibility:visible}
#cardContainer,.card{width:380px!important}
.card-wrapper{border-radius:12px;box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1)}
.card{font-weight:400;box-sizing:border-box;padding:28px;background:#fff;border-radius:20px}
.header{color:#a6a6a6;height:24px;overflow:hidden}
.product{font-style:italic}
.product,h1.title{letter-spacing:.02em}
h1.title{font-size:20px;font-weight:700;color:#2b2b2b;margin:4px 0 12px;line-height:1.5}
.summary{background:#f8f9fc;padding:16px;border-radius:12px;margin-bottom:12px;font-size:15px;color:#2b2b2b;line-height:1.8;letter-spacing:.03em;box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}
.points{margin-bottom:10px}
.point{display:flex;align-items:flex-start;margin-top:12px;font-size:15px;color:#2b2b2b;padding:2px 0}
.point:before{content:"";width:4px;height:4px;background:#287cf6;border-radius:50%;margin-top:10px;margin-right:6px;flex-shrink:0}
.point:nth-last-child(-n+2){margin-right:100px}
.qr-section{position:relative}
#qrcode{width:76px;height:76px;border-radius:8px;padding:6px;background:#f8f9fc;border:1px solid #f5f5f5;position:absolute;bottom:0;right:0}
#qrcode img{width:100%;height:100%;object-fit:contain}
</style>

<div class="card">
  <div id="card-img"></div>
  <div class="header">
    <span class="date">{{DATE}} </span> · <span class="product">{{QR_SUBTITLE}} </span>
  </div>
  <h1 class="title">{{TITLE}} <span data-via="{{PLATFORM}}"></span></h1>
  <div class="summary">
    {{SUMMARY}}
  </div>
  <div class="points">
    {{#each POINTS}}
    <div class="point">{{this}}</div>
    {{/each}}
  </div>
  <div class="qr-section">
    <div id="qrcode"></div>
  </div>
</div> 

相关站点记录

官方介绍

来源 SVG 图标如下压缩:

装修: 给厨房装上了一个65寸的OLED电视

2025年1月4日 04:24

去年9月至11月,我对家里楼下进行了重新装修,把原来的书房和厨房门拆掉,改造后新的厨房加饭厅显得更加宽敞明亮。和媳妇商量后,决定在厨房的墙上挂一台电视。

挑选了很久,最终选中了LG的一款65寸OLED电视,还特意选了超薄款(厚度40厘米),价格是2299英镑。买完后才发现,其实可以通过公司的福利网站先购买Currys的礼品卡,这样能省下150英镑,真是后悔没提前了解清楚。

电视安装好后,连上了YouTube账号。平时吃饭的时候,我们会放一些综艺节目或者音乐,把YouTube Premium会员的价值充分利用起来。因为家里没有看电视直播的习惯,从去年开始我们就没有续TV License了。

现在的智能电视功能很强大,我正考虑是不是可以连接蓝牙键盘和鼠标。这样早上在厨房喝咖啡时,我还能顺便刷刷题,提升效率:在LG的OLED智能电视下刷题/力扣

客厅的电视不是OLED的,是去年年初打折时买的(John Lewis)。原价2000多英镑,折后只花了1000英镑。电视主要放在客厅,平时孩子们会用它玩任天堂Switch游戏,有时候也会用来看YouTube视频,比如《Pokemon/宝可梦》、超级玛丽或者其他玩家的游戏实况。

  • 厨房的65寸电视 2299英镑:1x LG – OLED65G46LS 65″ Smart 4K Ultra HD HDR OLED TV with Amazon Alexa
  • 客厅的75寸电视 999英镑:LG 75QNED916QE (2023) QNED MiniLED HDR 4K Ultra HD Smart TV, 75 inch with Freeview Play/Freesat HD, Dark Steel SilverProduct code: 82475110
lg-oled-tv-evo-2024-11-14-11.43.04-scaled 装修: 给厨房装上了一个65寸的OLED电视 房子 折腾 生活 硬件 装修 资讯

刚装上,弟弟就迫不待享受起来。

lg-oled-tv-evo-2024-11-14-10.47.07 装修: 给厨房装上了一个65寸的OLED电视 房子 折腾 生活 硬件 装修 资讯

LG 65寸的OLED的电视背面,很薄,40厘米,比80厘米贵一些。

lg-oled-tv-evo-2024-11-12-14.47.42-scaled 装修: 给厨房装上了一个65寸的OLED电视 房子 折腾 生活 硬件 装修 资讯

LG 65寸的OLED的电视确实很大。

2024-11-17-18.29.05-scaled 装修: 给厨房装上了一个65寸的OLED电视 房子 折腾 生活 硬件 装修 资讯

装修后的客厅+阳光房,75寸的LG电视放在客厅也正正好。

house-renovate-2024-11-17-18.28.18-scaled 装修: 给厨房装上了一个65寸的OLED电视 房子 折腾 生活 硬件 装修 资讯

装修-新厨房

OLED电视据说比较亮?说黑色是存黑的?而且从任意角度看电视都好?

关于OLED电视的亮度和黑色表现,存在一些误解。OLED电视并非以亮度见长,与高端LCD电视相比,其峰值亮度通常略低。不过,OLED电视在日常观看环境中,亮度已经足够,尤其是在较暗的室内环境下表现尤为出色。同时,由于每个像素可以独立发光,它可以通过完全关闭像素来呈现“存黑”,即完全不发光的黑色。因此,黑色更加深邃、纯粹,整体对比度也远高于传统LCD电视。

OLED电视从任意角度观看画质表现优异,这主要得益于其自发光技术。不同于LCD电视依赖背光层和液晶面板,这些层次可能导致从侧面看时出现颜色漂移或亮度下降,OLED屏幕不存在这种问题。从几乎任何角度观看,颜色和亮度都保持一致,因此特别适合多人同时观看。

至于“亮”的感觉,这与OLED电视的高对比度密切相关。即使在明暗场景交替时,OLED能够展现极细腻的画面层次,这种视觉效果会让人觉得画面更加鲜活、明亮。虽然实际峰值亮度可能不如高端LCD,但OLED电视在日常使用中,尤其是观看电影或电视剧时,画质表现通常更令人满意。

OLED电视简介和传统电视的区别

OLED电视,即有机发光二极管电视,是一种采用自发光技术的显示设备。与传统的LCD(液晶显示)电视不同,OLED屏幕无需背光源,其每个像素点都可以独立发光和调节亮度。这种设计使得OLED电视能够呈现出更加纯粹的黑色和无限对比度,从而带来更加逼真、细腻的画面表现。此外,由于没有背光层的限制,OLED屏幕可以做到更薄甚至可弯曲,为电视设计提供了更多可能性。

与传统电视相比,OLED电视在显示性能上具有显著优势。由于每个像素可以独立控制,OLED电视能够展现更高的色彩准确性和更快的响应速度,适合观看快速移动的画面,如体育比赛或动作片。同时,其视角更加宽广,无论从哪个方向观看,画质和颜色都不会明显失真。这使得OLED电视成为家庭影院和多人共享观看的理想选择。

尽管如此,OLED电视也有一些挑战。相比LCD电视,OLED面板的生产成本更高,因此价格通常较为昂贵。此外,OLED材料的寿命相对有限,尤其是蓝色有机物质可能会导致屏幕在长期使用后出现老化或烧屏现象。然而,随着技术的不断进步,这些问题正在逐步改善。

总的来说,OLED电视凭借其卓越的画质和时尚的设计,正在成为高端电视市场的主流选择。它代表了显示技术发展的重要方向,为用户提供了更沉浸、更生动的观影体验。

房子装修那些事

本文一共 1438 个汉字, 你数一下对不对.
装修: 给厨房装上了一个65寸的OLED电视. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 装修: 给厨房装上了一个65寸的OLED电视 房子 折腾 生活 硬件 装修 资讯
The post 装修: 给厨房装上了一个65寸的OLED电视 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  2. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  3. 优衣库 感觉像炒作 这几天 这个在北京三里屯 ‘优衣库’ 试衣间自拍的视频真的很火, 男女主角均被人肉. 不可否认 这个效果还真的不错 因为我之前根本不知道 “优衣库” 是干嘛的 很刺激 在试衣间XXOO是多么爽的事情 女主角 95后妹子 长相甜美....
  4. SteemIt 高级定制微信文章列表 RSS/API/阅读器 v2.0 The Advanced Wechat Group Posts Feed/API/Reader v2.0 Abstract: I have added five parameters to the...
  5. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. 1 2...
  6. 在英国带孩子去露营全攻略 之前就做了一些露营的准备工作, 因为大儿子Eric 很兴奋说是要去 Camping Holiday 估计是在 Papa Pig 里看到的. 英国有很多可以露营的地方, 最后面选了一个离家开车1个多小时. 看了评论还不错. 地址为: New Road,...
  7. 交了TV License(电视授权税) 用于看BBC电视节目 在英国看电视是需要交一个电视版权或者电视授权税的 (TV License). 一般来说在 Youtube 上看除了 Live 实时的比赛或电视节目之外, 是不需要交 TV License的. 最新的政策是 使用 BBC iPlayer观看节目则需要交...
  8. 公司给我批了新电脑 ThinkCenter M900 因为去年的 LENOVO 笔记本用了一年了, 感觉有点慢, 而且现在笔记本都不拿回家 所以索性申请了一台台式机. 公司开发部批了一些2000英镑的笔记本, 我在算法部, 只给批了1200英镑的台式机 不过已经很不错了. 公司要求是品牌机(有保修保换), 所以不能自己购买零件组装, 选来选去 选了一个差不多的, 还是...

微软剑桥研究院办公室的健身房: 麻雀虽小, 五脏俱全

2024年12月30日 03:49

加入微软剑桥研究院 MSRC 一年多后,有一次我在楼下停车场等电梯时才发现,旁边竟然有一个健身房。出于好奇,我尝试刷 ID 卡进去,但没能成功。透过窗户向里看,这是一间不大不小的健身房。

后来得知,这个健身房是 MSRC 与 Nuffield 医院合作的设施,属于 Nuffield 健身房。里面有四台跑步机、两台椭圆机(踩踏器),以及一些哑铃等健身设备。使用健身房需要提前预约 Nuffield 的安全培训课程,每月一到两次。我真正完成安全培训后,出于懒惰和拖延症,竟然一直没再去过。希望新的一年能开始健身,把公司的这一福利好好利用起来。

我还注意到,墙上写着只需每月额外支付最低 25 英镑,就可以成为 Nuffield 的正式会员,能够无限次使用市中心的 Nuffield 健身房。

公司健身房配有淋浴设施,甚至提供像酒店一样干净的浴巾,非常方便。今年年底,我终于在完成安全培训后,第一次在公司的健身房锻炼。那天我在跑步机上跑了 10 分钟,休息片刻后去洗了个澡,体验相当不错。

microsoft-nuffield-gym-msrc-2024-12-23-09.56.57-scaled 微软剑桥研究院办公室的健身房: 麻雀虽小, 五脏俱全 微软 折腾 生活 资讯 身体健康

健身房虽然小,但是设备还算齐全。

microsoft-nuffield-gym-msrc-2024-12-23-09.57.13 微软剑桥研究院办公室的健身房: 麻雀虽小, 五脏俱全 微软 折腾 生活 资讯 身体健康

不过可以使用手机/蓝牙,在跑步的时候听/看。我在想之后可以边跑边看个油管视频/或者听个音乐。

microsoft-nuffield-gym-msrc-2024-12-23-09.57.50 微软剑桥研究院办公室的健身房: 麻雀虽小, 五脏俱全 微软 折腾 生活 资讯 身体健康

跑步机有个屏幕,竟然播着什么英式电视剧

microsoft-nuffield-gym-msrc-2024-12-23-10.08.11-scaled 微软剑桥研究院办公室的健身房: 麻雀虽小, 五脏俱全 微软 折腾 生活 资讯 身体健康

跑步机是最普通最常见的健身设备。

microsoft-nuffield-gym-msrc-2024-12-23-10.08.39 微软剑桥研究院办公室的健身房: 麻雀虽小, 五脏俱全 微软 折腾 生活 资讯 身体健康

这个健身机器是练背还是臂力

microsoft-nuffield-gym-msrc-2024-12-23-10.08.46 微软剑桥研究院办公室的健身房: 麻雀虽小, 五脏俱全 微软 折腾 生活 资讯 身体健康

墙的一面是镜子,简单的装修技巧,会让屋子显大一些。

microsoft-nuffield-gym-msrc-2024-12-23-10.08.55-scaled 微软剑桥研究院办公室的健身房: 麻雀虽小, 五脏俱全 微软 折腾 生活 资讯 身体健康

公司楼下的健身房,是和Nuffield合作的

microsoft-nuffield-gym-msrc-2024-12-23-10.10.05-rotated 微软剑桥研究院办公室的健身房: 麻雀虽小, 五脏俱全 微软 折腾 生活 资讯 身体健康

80多公斤,BMI有点大/超重。

microsoft-nuffield-gym-msrc-2024-12-23-10.30.17 微软剑桥研究院办公室的健身房: 麻雀虽小, 五脏俱全 微软 折腾 生活 资讯 身体健康

每次到公司都喜欢在电梯里来一张,有朋友问为啥电梯里都没人,我说,我都是挑没人的时候拍的,不过疫情之后,到公司的人确实少了很多。

新年/2025开始健身,强迫自己动起来。

microsoft-gym-nuffield 微软剑桥研究院办公室的健身房: 麻雀虽小, 五脏俱全 微软 折腾 生活 资讯 身体健康

每次到公司上班就到健身房上跑步机上跑个20分钟边跑边看个油管视频学习一下系统设计。

运动使人快乐

本文一共 875 个汉字, 你数一下对不对.
微软剑桥研究院办公室的健身房: 麻雀虽小, 五脏俱全. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 微软剑桥研究院办公室的健身房: 麻雀虽小, 五脏俱全 微软 折腾 生活 资讯 身体健康
The post 微软剑桥研究院办公室的健身房: 麻雀虽小, 五脏俱全 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  2. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  3. 推荐一款程序员性价比高的机械键盘 KeyChron K8 程序员性价比高的机械键盘 Keychron 我第一款 keychron 键盘是四年前(2020年)买的,当时在AMAZON工作,通过公司经费报销的。当时还问了经理,需要节俭么?因为亚马逊的16条军规中的一条就是节俭/Frugal。当时经理说,只要能提高你的工作效率就行,我也没太敢搞太贵的,最后面只挑了一个60多美元的机械键盘,型号是: Keychron C2 Wired Mechanical Keyboard, RGB Backlight / Gateron Mechanical...
  4. 在英国给孩子换学校的经历: 孩子离开了村里的小学 由于搬了家, 孩子上学得提前半小时出门了, 因为早上堵, 也得开车半小时才能到. 之前在 Fen Drayton 村庄上小学, 早上8:45学校门开, 9点敲钟孩子排队依次进入教室, 我们由于在村里, 只需要提前5分钟出门和孩子一起走路就可以了. 现在一下子早上变得很匆忙, 得叫孩子起床, 做早饭,...
  5. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. 1 2...
  6. 面向猫猫编程 Cat Oriented Programming (Chessly/Pyro这一生持续更新) 家里有两只猫 Chessly/Pyro,想着找个地方记录它们的生活,最后决定还是写在这里的博客。猫的一生很短,差不多也就二十年。 Chessly(黑白猫)是我加入微软剑桥研究院MSRC第一个月带回家的,过了两三个月,又把Pyro(橘猫)也接回了家。两只猫的名字是孩子们取的:Chessly因为黑白的像棋盘,加上“ly”听起来像个女孩的名字;而Pyro的意思是一团火(烟火),充满活力。 刚开始的时候,Chessly特别喜欢待在我的工作区域。她有时候趴在键盘上或旁边,有时候藏在显示器后面。偶尔还会绕到我身边“咕咕”地撒娇,等着我去摸她。有时更干脆跑到我腿上,舒舒服服地躺着。 不过,现在它们俩的体型都大了很多,躺在桌上就会挡住屏幕,真是“面向猫猫编程”(Cat Oriented Programming)的极致体验。 记录生活的点滴,也是一种珍惜,毕竟这二十年,我们会一起走过。 2024年 2025年 Ring视频:两猫日常就是打闹,Chessly追上Pyro想舔他,在猫的世界里,地位高的才能舔地位低的。 本文一共 357 个汉字, 你数一下对不对....
  7. 公司请的专业摄影师 公司来了新的CEO管理之后,很多事情都不一样了, 特别是一些公司对外形象的事情就特别的在意, 比如公司网站用上SSL.现在公司还有空闲的位置,请速来(钱多人不傻). 一月份出差回LUTON,刚好公司请来摄影师给高层管理照像放网站上的,于是我也凑了凑热闹(但是却还不够资格被放在公司网站上),不过没关系,放这里也差不多. 人到中年, 沧桑感强了些. 更新更新: 同事用他NB的单反给谢菲尔得办公室的人也拍了一组这样的照片.看起来很不错, 很专业,灯光,道具应有尽有.我已经用在了LINKEDIN页面上,立马高大上. 本文一共 230 个汉字, 你数一下对不对. 公司请的专业摄影师. (AMP...
  8. 力扣 Leetcode 的刷题利器: 在线调试器和自动代码提示完成 力扣代码调试器 Debugger 最近 leetcode 刷题网站出了一个在线调试器. 个人感觉非常好用. 因为我平时是用 IPAD+蓝牙键盘来刷题, 而在 ipad 上是没有集成的IDE的, 对于调试来说, 只能很原始的让函数退出一个值, 然后尝试不同的输入来发现问题. leetcode在线调试器的好处...

使用 Cursor 做了几个单页小工具

2024年12月21日 11:13

最大感受,说清楚需求,基本上第一次对话即可生成。之后都是叠加需求和反复修复的过程。

最大感慨,需求是稀缺资源,真切合理的需求结合 AI,把之前根本不会想尝试,变为积极主动试一试。

由简到难的 24 点出题器

「24 点出题器」 https://edui123.com/24/

把 1362 道有解的 24 点题目,依据难度排序,支持按序和随机出题,右上角有 30 秒倒计时,点击标题可查看解法。

玩 24 点日常难受的点在于直接拿扑克牌玩,1820 个不同组合,而实际有解的只有 1362 个。1362/1820≈0.748≈75%,四局有一局无解,已经很打击兴趣咯。

很早看到 4数网 经过难度排序的题库,基于世界各地的人们已经解决 6283289 个题目,计算了每道题目的 “统一中值解决时间”, 并从最简单到最难给这些题目排序。

一拍即合,干活!

语文生字拼音匹配小游戏

「认读小能手」 https://edui123.com/renzi/

基于部编语文一年级上册“识字表”中的 280 字,给认读生字增加一点趣味互动性,家里或学校能在期末阶段用上一用。

  • 3 种模式可选:限时 1 分钟、3 分钟、不限时;
  • 拖动拼音到对应的汉字上方,右上角有实时的统计数据条。
  • 限时模型下,结束时会有统计数据汇总,还有过程中拖动错误的汉字记录回顾。

自动听写词语

「词语听写」 https://edui123.com/tingxie

一个自动朗读语文书后“词语表”的在线网页。

  • 内置 3~6 年级上册词语,选择年级、第几课,点击开始即可;
  • 默认每个词语读两遍,不同词语停顿 3 秒(可拖动修改);
  • 随机模式,全册词语打乱顺序 20 个为一组;
  • 早读模式,全册词语打乱顺序读完后会显示“词语”。

杂记

其实 3 个都是单页可离线的 html,听写后来改用第三方接口,因为发现 Edge 文字转语音国内不可用,能用也只能 PC 上,使用太受限。

Memos & n8n ,秒接入 AI

2024年12月18日 21:30

Memos 0.18 还是哪个版本开始就支持 webhook ,一直不知道有啥用。自从折腾了 n8n,发现能连通,而且也自用有段时间。

自动化流程思路是:接收 Memos Webhook,判断是新建事件,判断首行是否有 触发词,进入对应流程修改当前条笔记。

演示之一

a修改 接内容,触发✌️

使用简要说明

安装 n8n 之后,下载 Memos_v0_22_3__share.json,其它版本需自行微调。

修改授权信息

复制 Webhook 节点链接

粘贴到 Memos 设置 偏好设置 内。

根据需要可修改触发词

基于正则匹配。

后记

拓展性极强,当日常使用次数极少,不太习惯……

其它更多的拓展一个思路,对于有 webhook 或 api 接口,都能非常方便接入 n8n 做联动 💪

部署轻量友链朋友圈

2024年12月11日 20:17

前言

这两天突然发现,之前使用极简模式部署好的友链朋友圈没法获取到数据了。看了Github仓库才知道原项目已经停止支持了,取而代之的就是这个轻量友链朋友圈。

不知道是不是因为这个项目是为了 hexo 打造的原因,项目看了很久,愣是没看明白。直到把详细文档研究了一通,才大概明白了运行的原理。

其实严格来讲,该项目主要分为三个步骤:

  • 获取朋友圈JSON
  • 配置 Github Action
  • 拿到朋友圈文章列表JSON

获取朋友圈JSON

顾名思义,该步骤通过以下代码,将指定页面上的友链信息,直接转换成为一个 friend.json

原代码如下:

const YML = require('yamljs')
const fs = require('fs')

let friends = [],
    data_f = YML.parse(fs.readFileSync('source/_data/link.yml').toString().replace(/(?<=rss:)\s*\n/g, ' ""\n'));

data_f.forEach((entry, index) => {
    let lastIndex = 2;
    if (index < lastIndex) {
        const filteredLinkList = entry.link_list.filter(linkItem => !blacklist.includes(linkItem.name));
        friends = friends.concat(filteredLinkList);
    }
});

// 根据规定的格式构建 JSON 数据
const friendData = {
    friends: friends.map(item => {
        return [item.name, item.link, item.avatar];
    })
};

// 将 JSON 对象转换为字符串
const friendJSON = JSON.stringify(friendData, null, 2);

// 写入 friend.json 文件
fs.writeFileSync('./source/friend.json', friendJSON);

console.log('friend.json 文件已生成。');

比较遗憾的是,该代码仅适用于 HEXO 博客程序,如果想要用在HUGO中,需要做如下修改:

const cheerio = require('cheerio');
const fs = require('fs');
const path = require('path');

// 获取项目根目录的路径
const projectRoot = process.cwd();

// 读取 HTML 文件内容
const htmlFilePath = path.join(projectRoot, 'public', 'links', 'index.html');
const htmlContent = fs.readFileSync(htmlFilePath).toString();

// 使用 cheerio 解析 HTML
const $ = cheerio.load(htmlContent);

// 创建一个空的 friends 数组
let friends = [];

// 假设在 HTML 中每个好友信息存储在 <div class="friend-item"> 中,
// 并且每个条目包含 <a class="username">、<img class="avatar"> 和 <a class="link">
$('.friend-item').each((index, element) => {
    const username = $(element).find('.username').text().trim();  // 提取用户名
    const link = $(element).find('.link').attr('href');  // 提取链接
    const avatar = $(element).find('.avatar').attr('src');  // 提取头像

    // 如果都存在,添加到 friends 数组
    if (username && link && avatar) {
        friends.push({
            name: username,
            link: link,
            avatar: avatar
        });
    }
});

// 根据规定的格式构建 JSON 数据
const friendData = {
    friends: friends.map(item => {
        return [item.name, item.link, item.avatar];
    })
};

// 将 JSON 对象转换为字符串
const friendJSON = JSON.stringify(friendData, null, 2);

// 写入 friend.json 文件到根目录
fs.writeFileSync(path.join(__dirname, 'friend.json'), friendJSON);

console.log('friend.json 文件已生成。');

将该代码文件保存在根目录Link.js文件中。运行:

node link.js

就可以得到 friend.json 文件。

需要注意的是,这里需要用到 cheerio 解析 HTML。所以在运行前,需要:

npm install cheerio

以下就是JSON格式文件示例:

{
  "friends": [
    [
	    "林木木",
	    "https://immmmm.com",
	    "https://cravatar.cn/avatar/ba83fa02fc4b2ba621514941307e21be.jpeg?s=400"
    ],
    [
    
        "山卜方",
        "https://novcu.com",
        "https://cravatar.cn/avatar/6ebab96f3131621c51c08370d3c996f0.jpeg?s=400"
    ],
    [
		"大大的小蜗牛",
        "https://eallion.com",
        "https://cravatar.cn/avatar/171e4c30959e8c077a6c58b958624b31.jpeg?s=400"
    ]

} 

配置 Github Action

在 fork 了仓库:Friend-Circle-Lite 之后,只需要修改仓库中的 config.yaml 文件

spider_settings:
  enable: true
  json_url: "https://<你的地址>/friend.json"
  article_count: 5
  merge_result:
    enable: true
    merge_json_url: "<你的地址>"

如果需要邮件推送功能的,跟随官方文档完成相应配置即可。

拿到朋友圈文章列表JSON

在完成所有配置后,就可以手动或者自动的运行 Github Action ,该Action就会根据我们提供的 friend.json 拿到友链中所有朋友更新的文章啦。最后会在page分支中,生成一个 all.json ,通过调用这个文件,就可以做前端渲染了。

大功告成。

正在使用的 Docker 清单

2024年12月8日 17:16

9 月底TX轻量云搞活动 ¥159x2 新开了 2C4G 机子,比起大几千的续费,便宜太多太多。

试了试整站镜像备份还原,但被告知新机器的硬盘(70GB)比原来的(80GB)小,不行。

搁置两月,趁着阴天降温宅家,花了一下午,迁移完毕。🎉

Flare

超级轻量、快速、美观的个人导航页面,还支持前端编辑。

友链朋友圈

古早博客功能,个人的首页调用和友圈都是基于此。

刚发现后继有人,已经有了轻量版本。

WeWe RSS

更优雅的微信公众号订阅方式。部署之后登录自己的微信读书账号,个人已稳定运行大半年。

Memos

挺好的随记工具,但不兼容更新频繁,停留在 v0.18.2 安逸。博客首页调用、哔哔广场都基于此。

哔哔广场.app

#折腾 
基于 @归臧 的 Memos 样式和功能,在 @koobai 无限需求之下,连肝一周并败入域名解析之: https://memobbs.app/ 折腾核心动力:颜值在线! 满足核心需求:Memos&rsquo;er 共舞~

Twikoo

一个简洁、安全、免费的静态网站评论系统。配置和评论数据迁移起来真方便。

stilleshan/frps

网穿透服务,原版怎么都不行,用这个分分钟搞定。

迁移 FRP 记录

#折腾 
(旧文重更:2024/11/10) 服务器到期在即,迁移 FRP 小记,为了把家里的 书库 talebook 能无障碍在线使用。 群晖拉起 frpc,服务器部署 frps,路由器端口转发,给个子域名解析,即可实现域名访问服务。

Umami

一个高颜值可自部署的统计应用,还支持前端调用数据。

前端调用 Umami API 数据

#折腾 
Umami 一个高颜值可自部署的统计应用。 看着服务器负载常年低于10%,有一点点需求的应用,特别是能 Docker 部署的,全都安排上!看着基本的统计数据都有。不错不错!但,能直接 API 前端调用统计数据不?可以的,接口见官网: https://umami.is/docs/api

musicn-container

可播放及下载音乐的命令行工具 musicn 的容器版本,支持 amd64/arm64 架构。偶尔用来下载个 MP3。

n8n

免费自部署低代码平台,比如用来接入 Memos AI 助理,追踪微信公众号更新并生成 AI 日报等。

我应该是最后一个才知道有 n8n 这个东西的人吧

#折腾 
借用 @heo 某篇文章的句式,表达一下对 n8n 的惊叹之感!不搜不知道,一搜吓一跳。 小众软件19年10月、少数派 @珪璋 去年5月、@OSEN今年1月、@lcomplete 今年4月,以及我最最后才从 @汐笺 知道的 n8n 中文教程。

Talebook

以下几个 Docker 都部署在 NAS 里。

基于 Calibre 简单的个人图书管理系统,各方面都比 calibre-web 好用。而且 Talebook 可以直接读取 Calibre 数据库,日常通过本地连接 NAS 管理书籍,结合 frpc 穿透绑上域名,供好友自取,还内置了 opds 功能,手机用 KyBooks3 APP 顺利实现 APP 内检索下载阅读。

vaultwarden

Bitwarden 自部署镜像。

Ghost

用作家庭内部图片博客,基本上是整理照片时,随手丢上去更新一下。回头翻翻,把美好瞬间记录也是件美好的事。

停留在 5.8.3 版本,因为这是 sqlite3 的最高版本,再高需要另外部署 MySQL 8。

DailyCheckIn

基于「Docker」/「青龙面板」/「群晖」/「本地」的每日签到脚本。

西瓜视频再也上传不了视频了(字节头条: 抖西合并)

2024年12月8日 05:07

上两个月,我再也没法在西瓜视频上上传我的视频了,也从此少了一个同步视频备份的地方了。现在登陆西瓜平台,要发视频的话会立马转到抖音创作者中心,然后我尝试通过手机号+SMS验证码的方式登录,提示我“请使用抖音手机APP登录”

creator-douyin-xigua 西瓜视频再也上传不了视频了(字节头条: 抖西合并) 折腾 资讯

西瓜视频上传界面已经转到了抖音平台。

原来西瓜视频国外的用户,可以通过手机号SMS+验证码的方式登陆网站,上传视频的。由于我人在英国,装的是英国的App Store,无法安装国内的西瓜视频APP,使用上有点不方便的。后来为了同步到国内的抖音平台,让我姐帮我绑定了她的抖音账号,可能就是因为这样,现在强制我得通过抖音平台来发视频了。等哪天有空我让我姐试试是否可以解绑。

西瓜视频已经合并到抖音平台上了,字节头条也不再单独运营西瓜视频了。

我发了邮件问西瓜视频,得到的回复:“您好,若您可以登录账号,请前往抖音,在设置内选择【我的客服】在线咨询,详细描述您的问题并提供问题界面截屏。若您无法登录账号,您可以拨打 95152 热线咨询,热线接听时间为8:30-22:00”

再问:您好,我们国外的用户没法装抖音啊。。。之前西瓜视频一直是 国外手机号登录的。
答:您好,您可以通过以下几种方法找到西瓜客服帮你解决问题:1.手机端入口:【西瓜视频App】更新至最新版本 【我的】-【创作中心】-【问题反馈】2.手机端入口:【西瓜视频App】-【我的】-【反馈与帮助】【意见反馈】3.电脑端入口:登陆【西瓜创作平台西瓜创作平台】点击右下角【问题咨询】。

西瓜视频是由字节跳动公司推出的一款视频分享平台,旨在提供用户一个便捷的观看和创作短视频的空间。西瓜视频自推出以来,凭借其丰富的内容、强大的推荐算法以及用户互动功能,逐渐成为中国大陆地区受欢迎的视频平台之一。

主要特点:

  • 内容丰富:西瓜视频涵盖了多种类型的视频内容,包括娱乐、搞笑、影视、音乐、游戏、教育、科技等,满足不同用户的兴趣需求。
  • 个性化推荐:依托字节跳动强大的机器学习和人工智能技术,西瓜视频通过分析用户的观看历史和行为习惯,提供精准的个性化推荐,提升用户的观看体验。
  • 创作者平台:西瓜视频为视频创作者提供了多种创作工具和激励措施,支持原创视频发布和变现,吸引了大量内容创作者加入,形成了丰富的内容生态。
  • 社交互动:用户可以在视频下方进行评论、点赞、分享等互动,增强了平台的社交性和粘性。
  • 短视频与长视频并存:除了传统的短视频内容,西瓜视频还支持长视频内容,涵盖了综艺、电影、电视剧等不同形式的视频内容。

西瓜视频的目标是通过高效的内容推荐和创作者激励机制,打破传统视频平台的壁垒,提供更加多元化和互动性强的视听体验。

我记得里面还有两三百元的收入,这下估计再也无法提现了。西瓜视频的提现是每周四,我记得我曾经提现过一次:$361.49美元,人民币大概是2628元。这个是早期平台有扶持的广告收入,后面就几乎没有啥了。

bytedance-has-sent-you-money 西瓜视频再也上传不了视频了(字节头条: 抖西合并) 折腾 资讯

西瓜视频的广告收入

TLDR; 中心化的平台就有这种跑路的风险,内容不在自己的手上,很有可能哪天就无法访问了,所以最好自己有个备份,同时使用多个免费的平台来备份,比如油管

本文一共 1126 个汉字, 你数一下对不对.
西瓜视频再也上传不了视频了(字节头条: 抖西合并). (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 西瓜视频再也上传不了视频了(字节头条: 抖西合并) 折腾 资讯
The post 西瓜视频再也上传不了视频了(字节头条: 抖西合并) first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  2. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  3. 英国房子的EPC节能报告(Energe/Efficiency Performance Certificate) EPC (Energe/Efficiency Performance Certificate) 是英国房子的节能报告, 法律上规定, 每个房子都必须要有一个EPC报告, 报告的有效期为十年. 房东在把房子出租或者想卖房的时候, 这个EPC就必须有效, 在一些情况下 比如出租房子的时候, 这个EPC报告还必须符合一些最低标准, 比如房子必须满足 F档(类似及格线)...
  4. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. 1 2...
  5. 公司请的专业摄影师 公司来了新的CEO管理之后,很多事情都不一样了, 特别是一些公司对外形象的事情就特别的在意, 比如公司网站用上SSL.现在公司还有空闲的位置,请速来(钱多人不傻). 一月份出差回LUTON,刚好公司请来摄影师给高层管理照像放网站上的,于是我也凑了凑热闹(但是却还不够资格被放在公司网站上),不过没关系,放这里也差不多. 人到中年, 沧桑感强了些. 更新更新: 同事用他NB的单反给谢菲尔得办公室的人也拍了一组这样的照片.看起来很不错, 很专业,灯光,道具应有尽有.我已经用在了LINKEDIN页面上,立马高大上. 本文一共 230 个汉字, 你数一下对不对. 公司请的专业摄影师. (AMP...
  6. 在英国给孩子换学校的经历: 孩子离开了村里的小学 由于搬了家, 孩子上学得提前半小时出门了, 因为早上堵, 也得开车半小时才能到. 之前在 Fen Drayton 村庄上小学, 早上8:45学校门开, 9点敲钟孩子排队依次进入教室, 我们由于在村里, 只需要提前5分钟出门和孩子一起走路就可以了. 现在一下子早上变得很匆忙, 得叫孩子起床, 做早饭,...
  7. 优化设计 个人主页 并且 PageSpeed Insights 双项 100分 坛子的个人主页 www.tanzhijun.com 不错 很适合个人主页的模板. 而且是手机友好. 于是我照着把 我的主页改了改. https://steakovercooked.com 并且做了几点修改: 0. 使用 google mod_pagespeed 把 JS,...
  8. 公司给配了台高配DELL笔记本 早上例会结束的时候我顺便说了一句 我的笔记本有点慢, 当时我并不知道我的经理远程用电话也参加会议了(他全程在听), senior staff SE 对着电话说, “peter, you hear that? btw, my disks are...

教娃编程之: ChatGPT写了一个Python交互程序调用x.ai的Grok大语言模型

2024年12月2日 04:20

视频:油管/Youtube | B站/小破站 | 微博视频 | 西瓜视频 | 微信视频号 | X/推特 | 小红书

马斯克的x.ai到年底有免费的25美元的credit可以使用Grok大语言模型

前不久(今年初),伊隆·马斯克/Elon Musk的X公司开源了Grok大语言模型,并且给免费提供了25美元的credit可以调用。可以在其官网x.ai注册一个帐号,申请API KEY即可,官网还贴心的的给出了调用的例子。

curl https://api.x.ai/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer xai-......" -d '{
  "messages": [
    {
      "role": "system",
      "content": "You are a test assistant."
    },
    {
      "role": "user",
      "content": "Testing. Just say hi and hello world and nothing else."
    }
  ],
  "model": "grok-beta",
  "stream": false,
  "temperature": 0
}'

孩子们由于未成年,所以无法申请ChatGPT、X AI等大语言模式的帐号,平时他们只能在免费的微软冰/BING搜索引擎上使用集成的免费Copilot。不过今天听弟弟说,ChatGPT现在已经不需要登陆就可以使用,不过他说这个版本有点受限制。

平均长度来算的话,一句话的Prompt大概是0.0012美元。当然越长的句子花费越贵,毕竟价格是按Token来算的。可以粗略的估计一个单词是一个Token。

x.ai-usage 教娃编程之: ChatGPT写了一个Python交互程序调用x.ai的Grok大语言模型 ChatGPT (OpenAI) Grok (X.AI) Python 人工智能 (AI) 折腾 教娃 教程 教育 程序员 程序设计

目测每条Prompt的费用是0.0012美元,25美元可以使用大概2万次

x.ai-free-25-credit 教娃编程之: ChatGPT写了一个Python交互程序调用x.ai的Grok大语言模型 ChatGPT (OpenAI) Grok (X.AI) Python 人工智能 (AI) 折腾 教娃 教程 教育 程序员 程序设计

每个帐号有免费的25美元API费用

x.ai-dashboard 教娃编程之: ChatGPT写了一个Python交互程序调用x.ai的Grok大语言模型 ChatGPT (OpenAI) Grok (X.AI) Python 人工智能 (AI) 折腾 教娃 教程 教育 程序员 程序设计

X.AI 的API网站界面

x.ai-api-models 教娃编程之: ChatGPT写了一个Python交互程序调用x.ai的Grok大语言模型 ChatGPT (OpenAI) Grok (X.AI) Python 人工智能 (AI) 折腾 教娃 教程 教育 程序员 程序设计

API 的 X AI 模型:grok-beta 和 grok-vision-beta

grok-x-ai-api-keys 教娃编程之: ChatGPT写了一个Python交互程序调用x.ai的Grok大语言模型 ChatGPT (OpenAI) Grok (X.AI) Python 人工智能 (AI) 折腾 教娃 教程 教育 程序员 程序设计

由 X AI 为 Grok LLM 创建 API 密钥。 Create API Keys for Grok LLM by X AI.

ChatGPT写了一个Python交互程序调用x.ai的Grok大语言模型

反正是免费的25美元,于是想着给娃做一个简单的PYTHON程序,然后人机交互,每次调用x.ai的Grok大语言模式,也正好让娃学一学实际的编程应用。于是让ChatGPT写了个程序,这种简单的程序ChatGPT基本上是Bug Free,生成的代码拿来就能用。

import requests
import json

api_key = "x_ai ..."

# Define the API endpoint and headers
url = "https://api.x.ai/v1/chat/completions"
headers = {
    "Content-Type": "application/json",
    f"Authorization": "Bearer {api_key}",
}

# Define a system message for context
system_message = {"role": "system", "content": "You are a test assistant."}

print("Welcome to the Grok, an AI chatbot. Type 'bye' to exit.\n")

while True:
    # Prompt the user for input
    user_input = input("You: ").strip()

    # Check if the user wants to exit
    if user_input.lower() == "bye":
        print("Goodbye!")
        break

    if user_input == "":
        continue

    # Define the payload
    payload = {
        "messages": [
            system_message,
            {"role": "user", "content": user_input}
        ],
        "model": "grok-beta",
        "stream": False,
        "temperature": 0
    }

    try:
        # Make the request
        response = requests.post(url, headers=headers, json=payload)

        # Check the response status
        if response.status_code == 200:
            data = response.json()
            assistant_response = data["choices"][0]["message"]["content"]
            print(f"Grok: {assistant_response}\n")
        else:
            print(f"Error: {response.status_code} - {response.text}")
    except Exception as e:
        print(f"An error occurred: {e}")

之后 简单做了些修改,比如避免空的Prompt,并且用strip函数去除句首和句尾的空格。娃使用的是Mac苹果电脑,还得在Terminal装个Homebrew,然后安装Python,并且用 pip3 install requests 安装上请求包,就可以使用了。

x-ai-prompt-python-2024-12-01-12.53.31-scaled 教娃编程之: ChatGPT写了一个Python交互程序调用x.ai的Grok大语言模型 ChatGPT (OpenAI) Grok (X.AI) Python 人工智能 (AI) 折腾 教娃 教程 教育 程序员 程序设计

虽然界面有点素,也就是个简单的终端,但是对于孩子来说已经是个很强大的软件了。

kid-plays-x-ai-grok-llm-2024-12-01-12.53.26-scaled 教娃编程之: ChatGPT写了一个Python交互程序调用x.ai的Grok大语言模型 ChatGPT (OpenAI) Grok (X.AI) Python 人工智能 (AI) 折腾 教娃 教程 教育 程序员 程序设计

弟弟在苹果电脑上成功跑起了x.ai的大语言模式 Grok

ChatGPT 可以拿来做什么?

ChatGPT 通用人工智能

英文:ChatGPT writes a Python Script to Interact with Grok LLM from x.ai (Free $25 Credit)

本文一共 743 个汉字, 你数一下对不对.
教娃编程之: ChatGPT写了一个Python交互程序调用x.ai的Grok大语言模型. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 教娃编程之: ChatGPT写了一个Python交互程序调用x.ai的Grok大语言模型 ChatGPT (OpenAI) Grok (X.AI) Python 人工智能 (AI) 折腾 教娃 教程 教育 程序员 程序设计
The post 教娃编程之: ChatGPT写了一个Python交互程序调用x.ai的Grok大语言模型 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. HPZ800服务器主板太老不支持超过2TB的大硬盘 我家里一直用的是HPZ800服务器, 很吵, 很老, 虽然这台服务器已经有十年之久(我在EBAY上买来用了五年多了), 但是即使放到今天, 这服务器速度依旧很快, 很稳定. 由于服务器用的是ECC较验内存, 所以基本上不重启关机. HPZ800主机有两个硬核CPU – 因特志强 X5650 – 每个CPU是12核....
  2. 给孩子零花钱培养孩子正确的金钱观价值观 两个娃已经不知不觉7岁8岁了. 媳妇和我商量一下决定给孩子每人每周5英镑的零花钱(Pocket Money). 这样他们慢慢的就有自己的小积蓄备将来不时之需: 比如朋友聚会生日啥的需要准备礼物. 同时, 我们决定不再给孩子买零食(薯片啥的). 孩子一天好几餐, 晚上睡觉前还得吃零食, 我们就多买了很多水果面包, 健康的食物多吃一些总不是啥坏事. 孩子可以用这些零钱买自己想要的东西, 我们也不再过问. 孩子有自己的决定权. 第一周的时候,...
  3. 测测你的幸运 – Linux Fortune-Teller LINUX 下有很好很好玩的命令,之前已经介绍过: figlet, rig, curl. 现在推荐另一个 命令 fortune 是用来随机显示一段(句)话的.fortune 在英文里就是幸运的意思. 这个命令可以不需要 参数 如果没有 可以通过 apt-get...
  4. 负电价活久见: 安装Octopus智能电表省电费甚至赚钱 前几周我的电气公司 Octopus 终于来装智能电表了(Smart Meter),虽然是免费安装的,但是排队排了有两三年了吧。因为之前一直写邮件催的时候就老是说 Not Ready。 收到邮件说可以安装智能电表我还是相当开心和期待的,因为已经听说这玩意好,但是还是得亲身体验一下。工程师来安装大概不到2小时,其中需要停电闸一会儿,重新接下线。装好后,给了个小册子,自动切换到了 Agile 的电价,也就是每半小时的电价都不一样,提前一天可以在手机App和网站上查得。 正好在原来的电价计费合同快要结束前2天换到了智能电表计价 Octopus Agile方式,但是系统还是扣了我75英镑 Exit Fee (提前合同结束得交违约费),不过我一个电话打过去,公司很爽快就给我退了。...
  5. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  6. 你要找什么样的老婆? 找媳妇的标准 昨天和网友在剑桥面基, 网友奔现, 他从爱尔兰过来, 小我12岁, 就聊到了找对象的标准. TLDR; 找老婆不要(只)看颜值, 而要注重性格, 为人处事和顾家等更重要的品质, 当然性和谐也很重要. 在当今社会, 人们对于找伴侣的标准有所不同. 有些人认为颜值是最重要的, 因为外貌吸引力可以让人在日常生活中感到愉悦, 这是人的本性,...
  7. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  8. 给STEEM中文微信群加了个机器人 之前说到我的公众号 justyyuk 可以查询几种虚拟货币的实时价钱, 但是有点不方便, 因为很多朋友在群里聊天得切换到公众号, 这下好了, 今天往STEEM中文微信群(还有编程群)加了个机器人, 在聊天的时候想了解价钱就直接输入货币代号即可, 如: 既方便自己, 又能方便别人(省事, 价格信息会同时显示给其它成员). 注: 这机器人不是我做的, 只是我拉进来的,...

人在囧途: 从福州车站打车到厦门

2024年11月29日 05:51

今年3月底,我回国待了两周。4月3号从福州回厦门,当时提前到了火车站,打算坐动车回去,因为第二天是清明节,要去扫墓。

人在囧途的故事就此展开

早上8点,我们准时抵达福州火车站,正准备候车时,得知台湾发生了地震,导致火车大规模停运。等了五六个小时后,依旧显示“晚点未定”。眼看毫无进展,我们果断决定打车回厦门。这一趟长途打车,足足200多英里,终于在傍晚赶回了家,喝上了老妈亲手炖的猪肚汤,疲惫一扫而空。

原本以为火车只是稍微晚点,没想到一等再等,从早上8点等到中午,依然没有任何准确信息。媳妇建议干脆退票打车,于是我们打开滴滴下单,显示的预估费用是719元。司机看到后提议不走平台,直接一口价,这样可以省一点钱。我想着反正长途打车通常会比平台预估贵,还经常需要补交额外费用,就答应了。最后面价格是650元。据说滴滴平台扣司机费用20%。

确实,远距离打车费用除了里程费,还会涉及时间费。有的司机为了多挣些钱,可能故意开得慢慢悠悠。印象中,每分钟时间费是5毛左右,晚到半小时,就能额外多赚15元。

出租车是电车,中途加了一次电,福州到厦门大概是260公里,打车大概花了3个多小时(动车只需要1个半小时)。

这趟回家的旅程虽然曲折,但总算有惊无险地抵达了目的地。

2024-04-03-00.52.42 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

滴滴打车,等出租车,然后去福州火车站。

火车晚点从最开始的晚几十分钟,到晚1小时,然后2小时,最后面直接说待定。从大早上等到了中午1-2点,在火车站简单买了些吃的,然后又打了盹,感觉这么等也不是事,后来媳妇说打车回家吧。还和旁边的一乘客(学生)聊了天,得知他也原本是坐同一班动车的,也是干着急,说还急着回厦门有事。

2024-04-03-03.04.44-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

福州火车站大厅里是焦急等待的人们。

2024-04-03-02.38.30 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

福州火车站大厅里是焦急等待的人们。

2024-04-03-01.45.44 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

两娃在福州火车站候车厅。

2024-04-03-10.35.29-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

第一次打车从福州到厦门,进厦门了。

2024-04-03-09.38.50-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

离厦门还有62公里

2024-04-03-09.35.15-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

打车到厦门

2024-04-03-07.51.52-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

打车到厦门,福厦高速路风景

2024-04-03-07.43.27-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

打车到厦门,福厦高速路风景

2024-04-03-11.04.28-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

在Taxi里快到厦门了。

2024-04-03-10.45.53-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

至厦门的时候已经是黄昏时间。

2024-04-03-11.46.56-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

两艘厦鼓摆渡邮轮每10-15分钟往对面开,晚上至凌晨频率变成30分钟/1小时一班。

2024-04-03-12.06.15-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

从鼓浪屿渡轮下船后沿着海边往家里走。对面就是厦门岛

2024-04-03-11.53.42-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

轮船就要靠岸,离家心情激动和紧张,很快就要到家了。

2024-04-03-11.48.28-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

厦门的夜景,平静中带点繁华,顶多算是二三线城市了。

2024-04-03-11.47.38-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

厦门的夜景还是很美的。坐在厦鼓摆渡邮轮上看两岸风景。

部分列车临时停运 本报讯(记者 谢嘉迪 通讯员万字)4月3日台湾花莲县海域地震,福建、江西震感明显,我市部分班次列车、铁路线路受到影响。据悉,为确保列车及旅客安全铁路部门安排畲龙线、漳龙线、梅汕线、杭深线汕尾以东、甬广高铁汕尾以东(含福厦高铁部分行车段)临时封锁,沪昆高铁部分列车调整运行区段。其中,经铁路厦门站、厦门北站的G5110次、G5115次、D9195次、D6592次共计12班高铁动车组列车,以及 C5208次、C5209次两列城际列车组列车临时停运。受影响列车多分布于厦门开往福州、龙岩、漳刚等地方向。地震发生后,中国铁路南昌局集团有限公司按照应急抢险预案,封锁福建省内和江西部分铁路线路,第一时间扣停运行的客货列车,对铁路线路、桥梁、隧道及信号设备等进行安全检查。经检查后,昨日11时许部分铁路线路已陆续恢复运行。

news-paper-amoy-xiamen-taiwan-earthquake-2024-04-04-00.28.33-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

第二天从鼓浪屿坐邮轮到厦门的时候看到报纸报道了这次台湾地震,还好当时果断打车了,不然很有可能到厦门的时候是隔天凌晨(及时止损)。

报纸上说到晚上11点列车才陆续恢复运行。还好打车了。

2024-04-03-01.42.14 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

后来到了车站的时候才听说地震了,出租司机说好像感觉到震动了,我是没感觉。

预估震级:6.2 级。受影响的国家/地区:日本、菲律宾、台湾和中国距离台湾花莲市寿丰乡 10 公里·07:58

IMG_6868-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

两娃第二次回我的家乡,上一次是2013年,老大一岁刚学会走路,老二还在妈妈的肚子里。

IMG_6863-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

厦门鼓浪屿街上有很多流浪猫,对比家里的两只猫,这些流浪猫好可怜。

2024-04-03-12.47.41 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

奶奶请孙子吃雪糕

2024-04-03-12.37.00 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

老妈炒的面,家的味道。

2024-04-03-12.18.40-scaled 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景

老妈做了一桌的饭,最爱那个猪肚汤,想着都流口水了。

2024年回国见闻

2024年3月28号回国,4月12号回英国,在国内玩了两周,北京-福州-厦门。 本文一共 1832 个汉字, 你数一下对不对.
人在囧途: 从福州车站打车到厦门. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 人在囧途: 从福州车站打车到厦门 出差与游玩 折腾 照片 生活 见闻 风景
The post 人在囧途: 从福州车站打车到厦门 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  2. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  3. 在英国给孩子换学校的经历: 孩子离开了村里的小学 由于搬了家, 孩子上学得提前半小时出门了, 因为早上堵, 也得开车半小时才能到. 之前在 Fen Drayton 村庄上小学, 早上8:45学校门开, 9点敲钟孩子排队依次进入教室, 我们由于在村里, 只需要提前5分钟出门和孩子一起走路就可以了. 现在一下子早上变得很匆忙, 得叫孩子起床, 做早饭,...
  4. 英国房子的EPC节能报告(Energe/Efficiency Performance Certificate) EPC (Energe/Efficiency Performance Certificate) 是英国房子的节能报告, 法律上规定, 每个房子都必须要有一个EPC报告, 报告的有效期为十年. 房东在把房子出租或者想卖房的时候, 这个EPC就必须有效, 在一些情况下 比如出租房子的时候, 这个EPC报告还必须符合一些最低标准, 比如房子必须满足 F档(类似及格线)...
  5. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. 1 2...
  6. 公司请的专业摄影师 公司来了新的CEO管理之后,很多事情都不一样了, 特别是一些公司对外形象的事情就特别的在意, 比如公司网站用上SSL.现在公司还有空闲的位置,请速来(钱多人不傻). 一月份出差回LUTON,刚好公司请来摄影师给高层管理照像放网站上的,于是我也凑了凑热闹(但是却还不够资格被放在公司网站上),不过没关系,放这里也差不多. 人到中年, 沧桑感强了些. 更新更新: 同事用他NB的单反给谢菲尔得办公室的人也拍了一组这样的照片.看起来很不错, 很专业,灯光,道具应有尽有.我已经用在了LINKEDIN页面上,立马高大上. 本文一共 230 个汉字, 你数一下对不对. 公司请的专业摄影师. (AMP...
  7. Leetcode 的在线调试器 最近 leetcode 刷题网站出了一个在线调试器. 个人感觉非常好用. 因为我平时是用 IPAD+蓝牙键盘来刷题, 而在 ipad 上是没有集成的IDE的, 对于调试来说, 只能很原始的让函数退出一个值, 然后尝试不同的输入来发现问题. leetcode在线调试器的好处 理论上来说, 你可以直接在浏览器里解决任何一道...
  8. 优化设计 个人主页 并且 PageSpeed Insights 双项 100分 坛子的个人主页 www.tanzhijun.com 不错 很适合个人主页的模板. 而且是手机友好. 于是我照着把 我的主页改了改. https://steakovercooked.com 并且做了几点修改: 0. 使用 google mod_pagespeed 把 JS,...

自制 iOS 小组件,随机显示一条 Memos

2024年11月25日 22:42

借助古早 Scriptable 玩了玩自制 iOS 小组件,实现随机显示一条 Memos。

更多预览

简要步骤

iPhone 上下载 Scriptable App(需 iOS14+).

打开App,点击右上角 + 号,复制代码,修改个人信息,保存。

长按桌面,添加组件,选择 Scriptable,然后点击组件配置,选择刚刚保存的脚本即可.

注意事项

注意:基于 Memos v0.18 api v1 借口.

自行测试如下链接是否有数据返回,再使用。

https://me.edui.fun/api/v1/memo/stats?creatorId=101
https://me.edui.fun/api/v1/memo?creatorId=101&limit=1&offset=3

代码如下

修改前两行的个人信息。

//v2024.11.27晚 点击主体文字,跳转到 Memos 单条网页

let memosUrl = "https://me.edui.fun"
let memosUserID = "101"

// 刷新间隔时间,默认 60 分钟
const refreshInterval = 60
const widget = await createWidget()
let nextRefresh = Date.now() + 1000 * 60 * parseInt(refreshInterval)
widget.refreshAfterDate = new Date(nextRefresh)

Script.setWidget(widget)
Script.complete()

async function createWidget() {
  let widget = new ListWidget()
  const memosData = await getData()
  let memoOne = memosData[0];
  const wrap = widget.addStack()
  wrap.spacing = 5
  wrap.topAlignContent()

  if (memoOne.resourceList && memoOne.resourceList.length > 0 && 
config.widgetFamily != 'small') {
    wrap.layoutHorizontally()
    widget.setPadding(10, 10, 10, 10)

    const gradient = new LinearGradient();
    gradient.locations = [0, 1];
    gradient.colors = [new Color("#121212", 0.7), new Color("#212A37", 0.8)];
    widget.backgroundGradient = gradient;

    const column0 = wrap.addStack()
    column0.layoutVertically()

      let resourceList = memoOne.resourceList;
      let imgUrl = '',imgLink = '', fileId = '';
      let restype = resourceList[0].type.slice(0, 5);
      let resexlink = resourceList[0].externalLink;
      if (resexlink) {
        imgLink = resexlink
      } else {
        fileId = resourceList[0].id;
        if(resourceList[0].uid !== undefined){
          fileId = resourceList[0].uid
        }else if(resourceList[0].name !== undefined){
          fileId = resourceList[0].name+"?thumbnail=1"
        }
        imgLink = `${memosUrl}o/r/${fileId}`;
      }
      if (restype == 'image') {
          imgUrl = imgLink;
      }
      if (imgUrl) {
        let ImgStack = column0.addStack()
        const memoIMG = await new Request(imgUrl).loadImage();
        let imgCover = ImgStack.addImage(memoIMG)
        imgCover.leftAlignImage()
        imgCover.containerRelativeShape = true
        imgCover.applyFittingContentMode()
      }
  }else{
    wrap.setPadding(5, 0, 5, 0)

    const img = await new Request('https://api.dujin.org/bing/1366.php').loadImage();
    widget.backgroundImage = await shadowImage(img)
    
  }

  const column1 = wrap.addStack()
  column1.layoutVertically()

  let TimeStack = column1.addStack()
  TimeStack.topAlignContent()

  let memoTime = new Date(memosData[0].createdTs * 1000 - 5 ).toLocaleString()
  memoTime = memoTime.replace(/.{3}$/, '')
  let time = TimeStack.addText(memoTime)

  time.textColor = new Color("#ffffff")
  time.textOpacity = 0.7
  time.font = Font.lightSystemFont(14);
  time.font = Font.italicSystemFont(14);

  column1.addSpacer()

  let TAG_REG = /#([^#\s!.,;:?"'()]+)(?= )/g, 
    IMG_REG = /\!\[(.*?)\]\((.*?)\)/g,
    LINK_REG = /(?<!!)\[(.*?)\]\((.*?)\)/g,
    MD_LINK_REG = /\[([^\]]+)\]\(([^)]+)\)/g,
    LINE_REG = /\n/g;

  let openUrl = memosUrl+'/m/'+(memosData[0].uid || memosData[0].name || memosData[0].id)
  let addContent = memosData[0].content
    .replace(TAG_REG, "")
    .replace(IMG_REG, "")
    .replace(MD_LINK_REG, "$1");

  if(addContent.length > 100){
    addContent = addContent.slice(0,100)+"..."
  }

  let ContentStack = column1.addStack()
  ContentStack.centerAlignContent()
  ContentStack.url = openUrl

  let content = ContentStack.addText(addContent);
  content.font = Font.lightSystemFont(18)
  content.textColor = new Color("#ffffff")
  content.leftAlignText()
  //content.textOpacity = 0.88
  content.minimumScaleFactor = 0.8

  column1.addSpacer()

  let TagsStack = column1.addStack()
  TagsStack.bottomAlignContent()

  let tagArr = memosData[0].content.match(TAG_REG);
  let memosTag = '';
  if (tagArr) {
      memosTag = tagArr.map(t=>{
        return `${String(t)}`;
      }).join('');
  }else{
      memosTag = `#动态`;
  }

  let memostag = TagsStack.addText(memosTag)
  memostag.textColor = new Color("#ffffff")
  memostag.textOpacity = 0.7
  memostag.font = Font.lightSystemFont(14);
  memostag.lineLimit = 1

  return widget
}

async function getData(source) {
  var memosData
  let memosLength = `${memosUrl}/api/v1/memo/stats?creatorId=${memosUserID}`
  let memosDataLength = await new Request(memosLength).loadJSON()
  let randomNum = Math.floor(Math.random() * (memosDataLength.length - 1 ) )
  let memosapi = `${memosUrl}/api/v1/memo?creatorId=${memosUserID}&limit=1&offset=${randomNum}`
  try {
      memosData = await new Request(memosapi).loadJSON()
  } catch (error) {
      console.error(error);
  }
  return memosData
}


async function shadowImage (img) {
  let ctx = new DrawContext()
  ctx.size = img.size
  ctx.drawImageInRect(img, new Rect(0, 0, img.size['width'], img.size['height']))
  ctx.setFillColor(new Color('#212A37', 0.8))
  ctx.fillRect(new Rect(0, 0, img.size['width'], img.size['height']))
  return await ctx.getImage()
}

教程推荐

反思:折腾一时爽,时间火葬场

2024年11月24日 13:17
不知道这个月怎么了,从月初开始先是倒腾 cloud flare的CDN,然后是更换企业邮箱,接着是搞旅行地图,最后再是RSS聚合页,前前后后搞了近20天,几乎精力都放在这些优化上,有几次晚上搞到凌晨!!!回头想想真的有意义么?也许是有的,但...

搭建 Discourse 论坛的实践与心得

2024年11月22日 11:18

很久以来,我一直怀有搭建论坛的想法。从 2021 年开始,我尝试使用了多种论坛系统,比如 Discuz、Xiuno BBS、youBBS、HYPHP 和 Flarum 等等。经过不断摸索和比较,最终选择了 Discourse。

Discourse 与传统论坛系统有所不同,尽管其官网教程看起来很简单,但实际操作并不容易。在我看来,相比其他论坛程序,Discourse 的安装和配置确实有一定的技术门槛。

曾经,我记得有一个 Discourse 中文社区,但后来不知为何关闭了,现在只能依赖官网的资源来解决问题。此前,我尝试安装 Discourse 多次未果。这次借助 GPT,经过几天努力,总算完成了部署。接下来,我将分享我的一些经验,希望对其他博友有所帮助。

 安装 Discourse 的注意事项

1. 端口问题

我使用的是 VPS,并在上面安装了宝塔面板,其中已有多个网站运行。为了避免端口冲突,需要修改默认的 80 和 443 端口。可以直接在 `app.yml` 文件中进行更改。

2. SMTP 邮件配置

SMTP 设置是我遇到的最大难题之一。起初,我尝试使用 QQ 邮箱(端口 465),但邮件一直无法正常发送。奇怪的是,大约半小时后,QQ 邮箱开始大量发送邮件,但 Discourse 后台却显示邮件发送失败,且任务一直在进行。随后,我改用 587 端口,问题依旧。最终,我选择了 Gmail 邮箱,才成功解决邮件问题。

QQ 邮箱并非完全不可用,但配置上可能存在不确定性;相比之下,Gmail 更稳定可靠。

3. 安装目录的选择

在安装 Discourse 之前,一定要选择好安装目录。如果需要重建容器但未指定目录位置,可能会导致数据丢失。因此,提前规划目录非常重要。

4. 服务器配置要求

Discourse 的内存和 CPU 占用较高,部署之前选择合适的机器非常关键。我之前安装失败的一个主要原因就是 VPS 内存不足。

 安装过程中的关键提示

1. 耐心等待

Discourse 的部署过程相对较慢,尤其是运行重建容器的命令时,可能需要 20 到 30 分钟甚至更久。尽管看似卡住了,其实后台一直在运行。所以安装过程中务必要确认 `app.yml` 配置无误,每次修改后都需要重构容器。

2. 防止垃圾注册

为了避免恶意注册,我部署的论坛采取了邀请注册的方式。此前使用 Discuz 时,因开放注册频频受到垃圾用户的骚扰,实在是令人头疼。

 欢迎加入我的社区

经过多次努力,我成功部署了自己的论坛 Bokeuquan 社区。目前,该社区采取邀请注册机制,主要是为了维护良好的讨论环境。希望有兴趣的博友能加入,一起交流学习。如果你在部署过程中也有心得或疑问,欢迎分享你的经验!

这里放一下我的邀请链接:http://bkq.net.cn/invites/jtAvmM8WzQ

总结

虽然 Discourse 的部署过程略显繁琐,但只要掌握基本流程和注意的点,安装和配置其实相对简单。以上是我在搭建过程中总结的一些要点和注意事项,希望能帮助到想要尝试的博友们。

使用Cuttlefish运行自编译Android固件

2024年11月21日 16:13

最近把本地的Android源码升级到了最新的Android 15,用于看Android源码的Android Studio for Platform也升级到了最新版本,Google的Cuttlefish最近发布了1.0版本,也顺便折腾了一下使用Cuttlefish来运行自己编译的Android系统,这里就介绍一下如何使用和遇到的问题。

Cuttlefish是什么

Cuttlefish是谷歌推出的一种可以配置的虚拟Android设备,它可以运行在我们本地设备上,也可以运行在服务器上面,官方也提供了Docker运行的支持,理论上可以运行在本地或者服务器的Debian设备上,或者运行在Google Compute Engine上。

用官方的化来说,它是一个更接近真实设备的Android模拟器,除了硬件抽象层(HAL)之外,它和实体设备的功能表现基本上是一致的。使用它来做CTS测试,持续集成测试会有更高的保真度。

在命令行中运行它,是没有类似模拟器的UI的,我们可以通过两种方式看到它的UI,一种是通过ADB连接,另一种则是开启它的webrtc功能,在浏览器中查看和交互。而他的虚拟硬件功能,可以让我们模拟多个屏幕,测试蓝牙wifi等各种功能。

安装Cuttlefish,编译Android固件

首先我们需要检查我们的设备是否支持KVM虚拟化,使用下面的命令:

1
grep -c -w "vmx\|svm" /proc/cpuinfo

如果得到一个非0的值,就是支持的。

之后我们需要有一个Android固件,可以选择去Android持续集成网站下载他们编译好的固件,也可以自己编译固件。下载固件要注意下载设备目标中带cf的,并且下载的目标CPU需要和需要运行的宿主机CPU架构一样,ARM就下载ARM的,X86就下载X86_64的,具体的操作可以看官方教程。我这里则是自己编译,使用如下代码设备我要编译的选项:

1
lunch aosp_cf_x86_64_phone-trunk_staging-eng

这样有了固件,还是不能够运行的。我们还需要去编译Cuttlefish,在https://github.com/google/android-cuttlefish下载源码后,在cuttlefish源码目录下执行如下代码编译和Android:

1
2
3
tools/buildutils/build_packages.sh
sudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -f
sudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -f

如果你很幸运的化,上面会一次成功,但是我不是个幸运儿。于是了类似如下的错误:

1
While resolving toolchains for target //src/tools/ak/generatemanifest:generatemanifest (6312974): invalid registered toolchain '@local_jdk//:bootstrap_runtime_toolchain_definition': no such target '@local_jdk//:bootstrap_runtime_toolchain_definition': target 'bootstrap_runtime_toolchain_definition' not declared in package '' defined by /home/sam/.cache/bazel/_bazel_jcater/ddb4e20e0e2e6bca92f5deeef02ce168/external/local_jdk/BUILD.bazel (Tip: use `query "@local_jdk//:*"` to see all the targets in that package)

这个错误的原因呢,就是因为编译cuttlefish的时候使用了bazel这个构建工具,它依赖JDK,而我没有设置JAVA_HOME这个环境变量,因此把它加入到环境变量中就好了。类似如下:

export JAVA_HOME=/usr/lib/jvm/zulu-17-amd64

设置完成之后在Cuttlefish项目目录用如下命令检查一下,看看JAVA_HOME是否设置正确:

1
bazel info java-home

但是搞完之后,在安装这两个deb文件的时候又遇到了问题,告诉我我电脑上的grub-common签名有错误,这个呢是因为我之前添加了铜豌豆的软件源,grub升级的时候升级了铜豌豆的grub软件包,它和ubuntu官方的不同,于是卸载掉铜豌豆软件源,grub-common也重新安装,之后就没问题了。 这些做完之后,我们执行下面的命令设置环境,并且重启电脑就好了。

1
2
sudo usermod -aG kvm,cvdnetwork,render $USER
sudo reboot

使用Cuttlefish

在我们的已经编译完Android系统目录中首先执行如下代码让环境初始化好:

1
2
source ./build/envsetup.sh
lunch aosp_cf_x86_64_phone-trunk_staging-eng

随后执行如下的命令就可以启动Cuttlefish运行Android了:

1
launch_cvd --daemon

如果你是从Android官方下载的,那么会和我这有一些区别,可以去看一下官方教程。

这个时候我们就可以通过adb看看设备是否已经启动了,也可以在浏览器中打开,在本机浏览其打开使用如下地址和端口:

https://localhost:8443/

地址一定要使用https,点击左侧的swtich按钮就可以看到UI了。 webrtc是默认打开的,关于它的命令行更多使用方式可以查看官方文档,可以使用如下的命令查看。

1
launch --help

而关闭Cuttlefish,也很简单,使用如下的命令:

1
stop_cvd

新版Android Studio for Platform使用

2023版本的Android Studio for Platform(以下简称Asfp)在打开的时候是有一个单独的Open Aosp project选项的,而新版本的这个选项去掉了。刚刚使用它的时候我还一脸懵逼,测试了Import和Open都不行,结果最后发现新版的New选项就直接是导入Aosp工程了。

使用方式如下图。

我们可以根据上图选择我们需要导入的Module,选择Asfp给我们生成的项目文件存放的位置,之后Asfp会执行lunch的操作和它需要的一些依赖构建。在我们选定的目录下面也会生成一个asfp-config.json文件,它就是我们的项目设置,如果我们以后有变化了(比如想看不同的模块的代码),也可以直接修改这个文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
 "repoRoot" : "/home/sam/android/android-source",
 "modulePaths" : [
 "frameworks",
 "packages/inputmethods"
 ],
 "lunchTarget" : "aosp_cf_x86_64_phone-trunk_staging-eng",
 "nativeConfig" : {
 "excludePaths" : [ ],
 "excludeGenPaths" : [ ]
 },
 "syncConfig" : {
 "environmentVars" : { },
 "buildFlags" : [ ]
 }}

参考内容和资料:

  1. Cuttlefish 官方文档: https://source.android.com/docs/devices/cuttlefish
  2. Cuttlefish官方Repo: https://github.com/google/android-cuttlefish
  3. Bazel用户指南:https://bazel.build/docs/user-manual
  4. Android Cuttlefish emulator: https://2net.co.uk/blog/cuttlefish-android12.html

看完评论一下吧

又到续费时

2024年11月11日 13:00
话说我使用搬瓦工是从2017年开始,中间也买过其他家的机器,灰常记忆一直从未挪窝稳稳的运行,虽然慢却可以打开…… 今天看了下这台vps,硬盘空间又不足10GB了,感觉也没搞什么东西在上面😂,现在看来vps最低配置2H3G-50GB+空间才适合我。 今天把Nginx换到了Nginx openresty,其实也没感觉出来有多快,有些东西不兼容又换回nginx。有好的东西就想尝试下,又不是太折腾。 又到了一年VPS续费的时节,目前手里一台香港、一台美国瓦工、两台美国大硬盘机器。 买了两台大盘鸡,用来做备份。现在使用wp后台总是会报错,挺无解的尽管玩了这么多年wordpress还是找不出问题所在,只能 […]

前端调用 Umami API 数据

2024年11月10日 12:09

Umami 一个高颜值可自部署的统计应用。

看着服务器负载常年低于10%,有一点点需求的应用,特别是能 Docker 部署的,全都安排上!看着基本的统计数据都有。不错不错!但,能直接 API 前端调用统计数据不?可以的,接口见官网: https://umami.is/docs/api

2024-11-10 更新:基于 Umami API V2。

2023-06-11 更新:采用 @归臧 《使用 Umami Api 显示统计数据》 获取 Token 。

安全优化建议

可以使用 @Heo 的方式,一个 PHP 避免 Token 暴露。

个人设定曲折些,Umami 后台新建用户时,角色设置为“仅浏览量”。创建团队,团队里加入需要统计的网站,然后通过仅浏览权限的用户加入团队,使用该用户账号密码获取 Token。

获取 Token

Hoppscotch: https://hoppscotch.io/

umami-im-1

如图,成功后记录下 token

获取 websiteId

https://u.edui.fun/websites/c27bd84b-02a3-4c3f-a168-0d7fadec9c74/

如上链接中的 c27bd84b-02a3-4c3f-a168-0d7fadec9c74 就是 websiteId

前端调用全站数据

2024-11-10 更新:Umami API V2,start_at 变为 startAt,end_at 变为 endAt

<div class="tongji">总访问量 <span id="pvStatic">0</span> 次 | 总访客数 <span id="uvStatic">0</span> 人</div>
document.addEventListener('DOMContentLoaded', () => {
    umiTongji();
});
function umiTongji(){
  var umiToken = "o7......w="  //获取到的 token
  var umiId = "c27bd84b-02a3-4c3f-a168-0d7fadec9c74" //获取到的 websiteId
  var umiTime = Date.parse(new Date());
  var umiUrl = "https://u.edui.fun/api/websites/"+umiId+"/stats?startAt=1672848000000&endAt="+umiTime;
  fetch(umiUrl,{
    method: 'GET',
    mode: 'cors',
    cache: 'default',
    headers: {
      'Authorization': 'Bearer ' + umiToken,
      'Content-Type': 'application/json'
    }
  })
  .then(res => res.json()).then(resdata => {
    document.querySelector('#pvStatic').innerHTML = resdata.pageviews.value
    document.querySelector('#uvStatic').innerHTML = resdata.uniques.value
  });
}

搞定!

更多:当前在线数……

GET /api/websites/{websiteId}/active  //获取网站上的活跃用户数。
GET /api/websites/{websiteId}/events  //获取给定时间范围内的事件。
GET /api/websites/{websiteId}/pageviews  //获取给定时间范围内的页面浏览量。
GET /api/websites/{websiteId}/metrics  //获取给定时间范围内的指标。
GET /api/websites/{websiteId}/stats  //获取汇总的网站统计信息。

更多教程

官方 API :https://umami.is/docs/website-stats

Umami API 使用方法:https://www.zywvvd.com/notes/tools/umami/umami-api/umami-api/

迁移 FRP 记录

2024年11月10日 11:07

(旧文重更:2024/11/10)

服务器到期在即,迁移 FRP 小记,为了把家里的 书库 talebook 能无障碍在线使用。

群晖拉起 frpc,服务器部署 frps,路由器端口转发,给个子域名解析,即可实现域名访问服务。

公网服务器部署 frps

项目地址:https://github.com/stilleshan/frps

启动 Docker:

docker run -d --name=frps --restart=always \
    --network host \
    -v /root/frps/frps.toml:/frp/frps.toml  \
    stilleshan/frps

注意,/root/frps/frps.toml 可以自行修改这个路径,先创建和修改好配置。

frp-1

如果是用宝塔和腾讯服务器的话,记得允许这些端口。其中 vhost_https_port 是 https 的穿透端口,dashboard_port 是面板访问端口;token 是之后客户端验证需要。

此时访问: http://服务器IP:7500 弹出要登陆,就OK啦!

群晖本地部署 frpc

2024/11/10 注明:群晖注册表正常已无法加载,通过本地 ssh 终端连接,手动 docker pull xxxxx/xxxx 拉去镜像搞定。

项目地址:https://github.com/stilleshan/frpc

官方教程1:群晖 NAS docker 安装(支持 docker 的群晖机型首选)

官方教程2:群晖 NAS 一键脚本安装(不支持 docker 的群晖机型)

个人采用的是第一种 Docker 安装。

frp-2

注册表搜索 stilleshan/frpc 下载完成之后,配置 frpc.ini 文件。

frp-3

配置参考(0.61):

frp-4

serverAddr = "111.xxxxxxx"  # 服务器IP或者地址
serverPort = 7000           # 服务器提供的端口号
auth.method = "token"
auth.token = "usertoken"    # 服务器设定的token

[[proxies]]
name = "nas"                # 唯一标识,不能和服务器端其他配置重名
type = "https"              # https协议
localIP = "192.168.1.1"     # 群晖内网IP.
localPort = 443             # 需路由器端口转发 HTTPS 
customDomains = ["nas.xxx.com"]   # 填写你的域名

启动镜像,勾选使用高权限执行容器;高级设置,添加文件指定到你 frpc.ini 所在的位置。勾选使用与Docker Host相同的网络。完成。

frp-6

群晖内网穿透

利用路由器的端口转发和群晖自带反代功能,方便多服务穿透,做以下设置:

frp-7

路由器直接转发所有 443 到群晖,然后群晖反代如下设置:

frp-5

这样,本地 docker 20010 端口跑的 talebook 服务就顺利穿出去啦~

服务器域名解析

直接加了一个 * 泛解析,方便绑定子域名解析。

frp-9

若宝塔面板:新建网站,添加域名,申请 SSL 证书,修改配置文件。

frp-8

    #frp
    location / {
        resolver 8.8.8.8;
        proxy_ssl_server_name on;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host:$server_port;
        proxy_pass https://$host:8443; # 8443 是 frps.ini 里配置的 https 端口
    }

如服务出现样式显示问题,则把配置文件下面那段缓存代码删了。

最后,重载/重启 Nginx 服务,搞定!

致谢及推荐

IOIOX:https://www.ioiox.com/

《卸载腾讯云对服务器的监控》:https://www.prkblog.cn/p/uninstall-tencent-cloud-monitor.html

微信公众号

2024年11月7日 16:28

前文说到了折腾,是的,其中就包括折腾微信公众号。

昨天,不知道哪根筋搭错了,突然想到自己还有一个微信公众号。那个号是四年前注册的,本来是想写一些编程相关的事,但后来不了了之,大概觉得没有什么可写。其实现在想想,编程那点破事,也是真的没有什么可写,圈内的人都懂,不用看,圈外的人不懂,也不会看。

那个号就这么放了四年,期间被冻结过。昨天心血来潮想起这事来,就折腾了一下,改了个名,想用来同步发布一些博客文章。

嗯,从此我也有公众号了,号就在那里,想起来就发一发,想不起来就算了,又不靠它吃饭。

我的微信公众号

放下完美主义,享受自在人生

2024年11月7日 15:26

拒绝折腾,让事情往前推进!

最近以来,一直在反反复复地折腾,折腾网站、折腾域名、折腾公众号、折腾笔记、折腾……

有的时候,折腾并不是坏事,但显然我的折腾有些过头了,导致很多事情停滞不前,反反复复。

今天突然意识到这个问题,是时候改变一下了,再这样下去,感觉都成病态了。

折腾,很多时候是源于对完美的追求,想要最好,要十全十美,可是,要知道,这个世界本来就是不完美的,哪有那么多完美的事呢?不妨做一个差不多先生,差不多就得了。

很多事情都是可以做到差不多就行的,没必要和自己内耗,无谓消耗自己的精神和能量。

做一个差不多就行的人吧,不求完美,开放包容,不固执,不拘泥于细节。

姗姗来迟的十月月报

2024年11月3日 21:40

本来准备一号就写的十月月报,然而在路上写了几笔就放下了,拖到了3号才写出来。本月主要介绍国庆出行,观看小宇宙播客漫游日,买了新NAS等。

国庆节回了一趟媳妇老家,在安庆附近,周边玩的很多,之前已经去过了不少地方,也是担心人多,这次只去了安庆看了博物馆和附近新开的集贤时空,之前的文章都写过.另外去亲戚家的时候,发现周围有个石屋寺,便开车去看了一下顺便爬了那边的大青山,听家长说这个寺庙不是每天都开的,因此我们过去的时候并不太热闹,正殿的门也都是关上的.大青山名字很大,其实也只是一个小山,爬到山顶可以看到远处的长江和长江大桥风景倒是还不错。以下是在那边拍的几张照片。

国庆回去之前就已经购买了一些木工的工具,于是国庆在家的几天用家里的旧木头做了个丑木凳,木工还未能入门,下次回家继续练习。

其余的几个周末,上海基本都是阴雨天,本来计划的外出爬山也只能作罢。而其中的某一个周末,小宇宙在上生新所举行播客漫游日,这个地方没有去过,便带着老婆小孩前往打卡,即参与了小宇宙的活动,也打卡了这边有名的茑屋书店。

小宇宙的活动搞得很不错,现场气氛很浓,有播客主播现场开讲,围了许多观众,非常热闹,而一些专场因为没有提前预约因此没有机会去旁听。

这个活动利用手机的NFC功能来进行现场互动,包括展示个人信息,交换贴纸等,很有意思。另外还设置了几个打卡点进行电子印章打开收集贴纸,这个形式也挺新颖的。在现场通过NFC获取个人数据大屏展示,很有意思,我的播客收听记录如下。

折腾

趁着双十一终于入手了一台成品NAS,型号为TS464C2,详情点击链接了解,除了稳文中提到的服务外,另外和搭建了AlistSun-Panel,前者主要为了接入阿里云盘到NAS,后者则是将众多的内网服务统一放大一个页面上去,它还支持内外网不同的链接,目前使用下来体验不错,下面是我的导航页展示。

另外为了给娃腾个书桌,我在用的桌子给娃了,自己换了一个更大一点的松木桌,不过要提醒大家,淘宝上面400以下的松木桌子购买需慎重,这个油漆气味是真不小。弄了新桌子,电脑,路由器等等各种线路也重新整理了一下。

之前使用Google Sheets也只是简单使用了它的表格功能,最近想要做一个数据统计功能,就问了一下ChatGpt,结果发现Google Sheets可以自己写脚本来更新数据以及和表格进行交互,而最后借助于GPT也实现了相关功能,只能大呼一声牛逼。虽然最近几年各种的airtable,多维表格很流行,看起来他们能够实现的功能,大多数通过Google Sheets依然能够实现,如果你感兴趣也可以去看看Google Apps Script,语法基本和JavaScript差不多。

之前立的学习英语的Flag,这个月坚持了十天就放弃了,其中一个原因是多邻国不太合适,过于简单并且这个方式感觉不太适合我,后面需要找找别的方式学习。

Android源码方面,这个月分析了广播接收器相关和消息循环相关的代码,后面因为更新Android源码到Android 15以及更新Asfp导致新代码阅读有点问题,后面10天内就没有看代码了。

另外业余时间,这个学还开始看了看Rust,这是一门性能媲美C++的语言,它又通过所有权来解决了内存回收的问题,目前还只是了解了一些基础语法、一些基本的使用,后面需要继续学习。为什么要学它呢,因为现在很多地方都引入了它,Android系统源码中也能够看到Rust的身影,很多的系统模块未来也会采用它来进行开发。

这个月影视的主题是漫威,周末下雨待在家的时间把复仇者联盟四部,钢铁侠两部,雷神四部,重新看了一遍,大人小孩都喜欢。之前有的部分并没看,有些剧情因为隔了很久都忘记了,这次算是重新温习了一遍。

《逆行人生》上线了流媒体平台,也抽空看了一下,同样作为大龄程序员,有家要养,看得我鸭梨山大。但是电影部分的内容倒是不大真实,现在的就业环境确实差,但也不至于找不到工作的程度。另外外卖这个行业也不如电影中这么卷,在某天路上与外卖员闲聊后,甚至我都有了去体验一下的冲动,但是听说众包都是垃圾单,还没开始就直接放弃了。

《读库2404》中的文章还有许多没看,这个月看了其中的《我在郑州跑代驾》和《我在上海开出租》,《我在郑州跑代驾》为作者找不到工作后通过代驾赚钱的经历,其中了解到了赚钱的艰辛,《我在上海开出租》则更多是关于从司机的视角看到的乘客众生相。对于我们来说,虽然没有从事相关职业,不过也是了解行业侧面的机会。

上个月看了一半的《简读中国史》看完之后,这个月开始看桥水基金创始人达利欧创作的《原则》一书。这本书也算是一本脍炙人口的畅销书了。目前已经看完他的经历介绍和生活原则的部分,从他的经历了解了他如何白手起家以及他经历的挫折,以及他如达达成现在的成就。这本书就是他介绍的他的帮助他成功的一些践行原则,从目前已经看的部分我的最大感悟就是,做人做事要保持谦逊和心胸开阔,做事情可以遵循五步流程,从而不断的通过失败和问题来驱动自己进步,与人相处要理解人与人的不同。而他所说的原则,其实很多方面可以看到和国内的很多互联网大厂所提倡的文化观或者企业价值其实有很多相似点。目前我对于本书的理解还比较粗浅,仍需要等待读完一遍之后再次进行研读。

总结

在农村待在的国庆节是放松闲适的,回到城市后又进入紧张的工作当中。月初的股市对于我们所有人来说都是当头棒喝,而其后则算是恢复其常态。折腾没有尽头,入了NAS,算是集齐了中年人三宝(NAS,路由,充电头)。

这是我的第五个月月报,感谢你的浏览,下月再会。

看完评论一下吧

威联通NAS购入初体验以及设置记录

2024年10月29日 21:57

之前是用树莓派连个两盘位硬盘盒运行一些服务,由于它的稳定性加上容量不够,一直想弄一个NAS,趁着双十一到来,就入手了威联通的NAS,本文介绍 一下购入的抉择以及NAS的初始化和相关的设置。

缘起

NAS这个东西知道了很多年了,一直想要搞一个,迫于家里花费的紧张,之前一直是使用一台树莓派4B,其中刷了Openwrt系统,挂载了两块盘的硬盘盒,其中开启了Webdav, Samba,Jellyfin相关的东西。不过因为Jellyfin挂载阿里云盘速度不太理想,有不少视频还是下载到自己的硬盘里面的。同时内,硬盘也出现了拷贝大文件就出现问题,需要重启硬盘盒和系统的问题,这个后续会继续说。

DIY NAS硬件或者成品的NAS也关注了有挺长一段时间,迫于以上问题,以及文件越来越多,当时买的这两块2T的硬盘,容量已经不够用了,想要购买一个NAS的想法更加加强,终于决定今年双十一搞个NAS。

剁手

购买NAS是有两个选择,自己组装硬件,安装飞牛或者黑群晖等NAS系统,又或者购买群晖、威联通等成品NAS。在V2EX发帖求助,以及自己的纠结中,最终在性价比和稳定性等各种因素比较之后,选择入手了威联通TS464C2。

威联通的系统虽然被大家诟病许久,但是它也算是市场上除了群晖之外NAS系统做的最久的厂家了,考虑到文件的安全可靠在文件系统和系统稳定性上面,这两家还是要比国内的新起之辈更加值得信赖的。而我选择的这一款,支持内存扩展,如果以后服务比较多,可以再增加一根内存。4个3.5寸硬盘位加上两个NVME 硬盘位,对于容量的扩展应该很多年都不存在问题了。双十一这块机器只要2000块钱就拿下,而群晖同配置的4盘位差不多要四千,只能说高攀不起。

另外下单了一块国产的NVME 2T硬盘,加入Qtier存储池,希望能提高一些速度。为了拥有更大的容量,经过一些研究,淘宝购入了一块2手服务器硬盘,型号为HC550, 16TB,回来看Smart信息,已经运行了786天,不过其他信息看着都不错。

上电

收到机器,插上硬盘,参照指南开始初始化。威联通提供了比较友好的初始化方法,可以通过网页或者应用对它进行初始化,不过一定要插上硬盘才能开始这一切。

根据指南初始化之后,开始了硬盘的初始化和存储池的设置。之前使用的openwrt中对于硬盘的管理是比较简单的,基本就是实现了基础的Linux功能,把磁盘挂载到指定的目录,硬盘初始化之类的。而QNAP中,“存储与快照总管应用”中,对于硬盘和存储卷的设置则全面,可以设置各种raid的存储池,Qtier,快照,卷等等,也有硬盘的运行情况的显示。我想这就是选择大厂成品NAS的原因,毕竟docker之类的东西大家都很容易做,但是这种积累了很多年的东西不是那么快能够做出来的。

安装软件

在威联通NAS中安装软件可以选择从QNAP的应用中心安装应用,也可以安装Container Station之后通过docker来安装。不过官方的应用中心中的应用中主要是一些官方提供的应用,这个时候我们可以选择第三方的应用中心,这里我推荐一个: https://www.myqnap.org/repo.xml,官方应用商店没有的可以来这里试试。不过这个应用商店中的部分应用是收费的,比如Jellyfin,它提供的版本需要依赖Apache,这个时候你需要去它的网站上面购买,价格还不便宜,当然我是不会去购买的。

除了应用中心安装之外,我们还可以去网上找QPKG文件,比如Jellyfin,我就是使用的pdulvp为QNAP定制的版本,下载地址在:https://github.com/pdulvp/jellyfin-qnap/releases。Jellyfin我不使用官方的docker版本有两个原因,一是使用这个定制版本,可以方便的使用英特尔的集成显卡进行视频的硬解,另一方面是使用docker的化,默认只能映射一个媒体目录到Docker中,想要映射多个目录会麻烦一点,因此使用QPKG更方便。

对于其他的应用,比如FreshRss, VaultWarden则是选择了使用Docker进行部署,Container Station的Docker部署为先写一个compose文件,之后软件会帮助下载相关的容器进行启动,这个有个问题就是创建完compose之后,容器启动起来之后,在web界面上就没法编辑compose文件了,想要编辑的需要用ssh进终端去看,比如我创建的app-freshrss它的compose文件就在/share/Container/container-station-data/application/app-freshrss当中。

另外威联通自带的一些应用,文件管理,QuMagie,特别要说一下QuMagie,它已经可以帮我把相片按照人物,地点,物品等等分类好了,配合上手机App使用流畅很多,再也不用之前那样使用SMB手动同步了。

其他

目前用了这个二手服务其硬盘加上新买的固态硬盘组了一个Qtier池作为主要存储区,家里有块旧的sata固态硬盘就把他搞成高速缓存加速了。原来的两块酷狼硬盘都是EXT4格式,但是插到QNAP上却不能识别,只好放在原来的设备上,新NAS通过Samba访问原先的设备,把文件拷贝过来。

之后把旧的硬盘插上来使用才发现,其中一个硬盘出现了坏道,数量还不少,感觉它应该命不久矣,不敢放什么东西上来了。 而另一块好的硬盘,准备把它作为备份盘,相片,笔记和其他的一些重要文件都定期备份到这个盘上面。因为硬盘数量优先,并没有组RAID还是空间优先,只把重要的文件备份但愿以后不会踩坑。

以上就是这个新NAS的初体验了,后面还要继续增加新的应用,仍然需要摸索,外网访问仍然沿用家里的DDNS和端口转发。目前才用了不到一个星期,还有很多东西没有用到没有涉及,后面有新的体验来再继续写文章分享,也欢迎玩NAS网友一起交流分享,如果有好玩的应用也欢迎评论推荐给我。

看完评论一下吧

WordPress 博客年度更新:全新首页上线,用户中心与问答社区优化升级

2024年10月29日 10:29

自从 2022 年 8 月开始,我便用上了 WordPress 的 Impeka 主题。虽然期间文章和页面不断更新,但这两年一直沿用一款简单的首页设计,看着看着也就“审美疲劳”了。最近,在大家提出的宝贵意见启发下,我一边灵感迸发,一边疯狂折腾,终于为博客换上了全新主页!不仅焕然一新,还新增了不少实用功能,并对细节进行了优化完善。希望新页面能让大家耳目一新,浏览更愉快!

1. 利用强大的 Impeka 主题制作了全新首页

Impeka 是一款现代化、灵活且功能强大的多用途 WordPress 主题,我在WordPress Impeka 2.0.6 创意多功能主题完整下载一文中有详细介绍。因为博主并不是科班出身,也不想费尽心思去搞代码,所以利用了主题的页面构建器搭建了如今的首页,以前的首页挪作它用,成了“最新发布”。

其实,我最初的首页设计内容是丰富得多的,但后来考虑到页面加载速度,以及小站目前的内容量确实不足以支撑复杂的首页布局,所以就稍微精简了一下。不过即便如此,可能仍有朋友会觉得有些部分“不够实用”或“稍显多余”。没关系,慢慢来吧!我会继续丰富内容,争取让每一部分都更有意义,也希望大家能见证它一步步完善的过程!

[ 阅读全文 ]

原文链接: https://www.shephe.com/website/wordpress-blog-enhance-2024/
版权声明: Kevin's Space 版权所有,转载请用明链标明本文地址
本站相关: 随机文章 | 站长微博 | 关于本站 | 联系站长 | 捐助作者

记录一次写博客高光时刻

2023年12月9日 09:18

最近换了个域名之后基本上是日更,每天早上6点左右花半小时写一篇文章,甚至有的时候直接两篇。

把博客挂在BlogFnder这个博客导航的这几天,由于日更,排行榜直接排在第一了:

在川流这个平台也被站长放首页推荐:

在积薪获得了最大的推荐位,以及侧栏的热门位:

一个新的博客站,文章平均阅读量有几百,全靠上面这几个导航站了。

之前写博客,并没有跟别人有过友链的操作也没有入驻到这些博客导航中,但由于这次想认真写写内容,所以就把博客挂在了一些导航站上以及和一些朋友互相挂了友情链接。

能有这个成绩其实是出乎意料的,因为我一直是个三分钟热度的人,但没想到这个新的博客建立半个月,我也写了半个月,目前一共写了18篇,虽然写的不咋地吧,但是能坚持写作本身就是一件很牛的事情不是吗?

如何在 WordPress 首页显示 Memos 最新动态

2024年10月17日 15:00

准备工作

确保已安装 WordPress 并启用了适合的主题:以我的主题为例,适用于大多数 WordPress 主题。

获取 Memos 的 RSS 订阅地址:比如我的链接为 https://memos.duanxiansen.com/u/1/rss.xml,根据你的 Memos 实际 RSS 链接替换。

编写函数获取 Memos 最新动态

需要编写一个函数,使用 WordPress 的 wp_remote_get() 函数从 RSS 链接获取数据,并解析出最新的一条动态。

首先,打开 WordPress 主题目录中的 functions.php 文件,添加以下代码:

// 获取 Memos 最新一条动态并显示
function display_latest_memo() {
    // 通过 wp_remote_get 获取 RSS 数据
    $response = wp_remote_get('https://memos.duanxiansen.com/u/1/rss.xml'); // 替换为你的 Memos RSS 网址
    if (is_wp_error($response)) {
        return '无法获取 Memos 数据';
    }

    // 获取响应的主体内容
    $body = wp_remote_retrieve_body($response);

    // 将 RSS 数据解析为 XML
    $data = simplexml_load_string($body);

    // 检查返回的数据是否为空
    if (empty($data) || !isset($data->channel->item[0])) {
        return '没有找到最新的 Memos 动态';
    }

    // 获取最新一条动态
    $latest_memo = $data->channel->item[0];

    // 将 RSS 中的时间转换为 WordPress 时区时间
    $rss_date = (string)$latest_memo->pubDate; // 获取 RSS 中的发布时间

    // 创建 DateTime 对象并设置为 RSS 的时间
    $date = new DateTime($rss_date);

    // 将时间转换为 WordPress 时区
    $date->setTimezone(new DateTimeZone(get_option('timezone_string')));

    // 格式化时间为 Y-m-d H:i:s 格式
    $formatted_date = $date->format('Y-m-d H:i:s');

    // 获取描述内容(通常是动态的主要内容)
    $content = (string)$latest_memo->description;

    // 限制字数(例如,显示最多300个字符)
    $excerpt = mb_substr($content, 0, 300);
    if (mb_strlen($content) > 300) {
        $excerpt .= '... <a href="' . esc_url($latest_memo->link) . '" target="_blank">阅读更多</a>'; // 链接到原文
    } else {
        $excerpt .= ' <a href="' . esc_url($latest_memo->link) . '" target="_blank">查看原文</a>'; // 如果字数较短,显示“查看原文”
    }

    // 输出最新动态的内容、时间和链接
    $output = '<div class="latest-memo memos-center">';
    $output .= '<h3>最新动态:</h3>';
    $output .= '<p>' . $excerpt . '</p>';
    $output .= '<p>时间:' . esc_html($formatted_date) . '</p>';
    $output .= '</div>';

    return $output;
}

// 创建一个短代码来显示 Memos 最新动态
add_shortcode('latest_memo', 'display_latest_memo');

在首页显示最新动态

接下来,要让 Memos 最新动态只显示在首页文章的最上方。为此,需要修改 header.php 或者 index.php 文件,在首页判断条件下调用定义的短代码。

  1. 打开主题目录下的 header.php 文件,找到适当位置(如头部模板部分)插入以下代码:
    <!-- 在首页显示最新的 Memos 动态 -->
    <?php if ( is_home() || is_front_page() ) : ?>
        <div class="memos-latest">
            <?php echo do_shortcode('[raw][latest断开_memo][/raw]'); ?>
        </div>
    <?php endif; ?>
    
  2. is_home()is_front_page():这两个函数确保只有在首页显示动态,而其他页面不会显示。is_home() 用于判断博客文章列表页,is_front_page() 用于判断自定义的前端首页。

样式调整(居中显示)

将以下 CSS 代码添加到你的主题 style.css 文件中:

.memos-latest {
    text-align: center; /* 水平居中内容 */
    margin: 20px auto; /* 上下外边距并居中容器 */
    padding: 10px;
    background-color: #f5f5f5; /* 背景颜色 */
    max-width: 600px; /* 设置容器最大宽度 */
    border-radius: 10px; /* 圆角效果 */
}

.memos-latest h3 {
    font-size: 1.5em;
}

.memos-latest p {
    font-size: 1.2em;
}

.memos-latest a {
    text-decoration: none;
    color: #0073aa; /* 链接颜色 */
}

结尾

就这样吧,不完美的就是不能直接评论,需要点进去到memos页面,继续完善吧。

更优雅的RSS使用指南

2024年10月14日 21:32

最近因为Follow的爆火,RSS的内容也跟着一起火了一把。笔者最近也优化了一下自己博客的RSS输出,在这里写一下博客如何更加 优雅的输出RSS,以及在订阅RSS的时候如何更好的发现RSS源。

RSS2.0 与 ATOM

RSS是一种消息来源格式,用于方便的将一个站点的内容以一个指定的格式输出,方便订阅者聚合多个站点的内容。

目前RSS的版本为2.0,而我们大家在使用博客输出RSS文件的时候,除了常用的RSS2.0格式,目前还有一个ATOM格式,其目前的版本为1.0。Atom发展的动机为了解决RSS2.0的问题,它解决了如下问题(来源WikiPedia):

  • RSS 2.0可能包含文本或经过编码的HTML内容,同时却没有提供明确的区分办法;相比之下,Atom则提供了明确的标签(也就是typed)。
  • RSS 2.0的description标签可以包含全文或摘要(尽管该标签的英文含义为描述或摘要)。Atom则分别提供了summary和content标签,用以区分摘要和内容,同时Atom允许在summary中添加非文本内容。
  • RSS 2.0存在多种非标准形式的应用,而Atom具有统一的标准,这便于内容的聚合和发现。
  • Atom有符合XML标准的命名空间,RSS 2.0却没有。
  • Atom通过XML内置的xml:base标签来指示相对地址URI,RSS2.0则无相应的机制区分相对地址和绝对地址。
  • Atom通过XML内置的xml:lang,而RSS采用自己的language标签。
  • Atom强制为每个条目设定唯一的ID,这将便于内容的跟踪和更新。
  • Atom 1.0允许条目单独成为文档,RSS 2.0则只支持完整的种子文档,这可能产生不必要的复杂性和带宽消耗。
  • Atom按照RFC3339标准表示时间 ,而RSS2.0中没有指定统一的时间格式。
  • Atom 1.0具有在IANA注册了的MIME类型,而RSS 2.0所使用的application/rss+xml并未注册。
  • Atom 1.0标准包括一个XML schema,RSS 2.0却没有。
  • Atom是IETF组织标准化程序下的一个开放的发展中标准,RSS 2.0则不属于任何标准化组织,而且它不是开放版权的。

相比之下ATOM协议是有更多的有点,如果你RSS生成程序已经支持了Atom那肯定是优先使用Atom。不过现在基本上99%以上的Rss订阅器或者工具对于两者都有很好的支持,因此如果你现在已经使用了RSS2.0也没必要替换成Atom了。

RSS的自动发现

对于提供Rss订阅的网站,最好的方式是提供相应的连接或者使用Rss图标,告诉访客当前网站的Rss地址。

除了这样之外,我们还应该在网站的源码中添加RSS地址,这样对于一些浏览器插件或者订阅软件可以通过我们的网站页面自动发现RSS订阅地址。

对于RSS2.0的订阅地址可以添加如下代码:

1
<link rel="alternate" type="application/rss+xml" href="/feed.xml" />

对于ATOM的订阅地址可以添加如下代码:

1
<link rel="alternate" type="application/atom+xml" href="atom.xml" title="Site title" />

如果你同时提供了ATOM和RSS2.0两种订阅文件,可以上面两行代码都添加。当然现在一些博客程序的模板文件中已经添加了上面的代码,检查一下即可。

RSS输出的优化

因为我的博客是以RSS2.0格式输出的订阅文件,因此这里我就按照我的优化内容来介绍一下输出相关的优化,对于ATtom可以参考其规范文档。

首先区分介绍和全文的输出。对于只输出描述的网站只需要设置描述部分即可,对于输出了全部的博客,还是建议同时输出描述和全文的。 而RSS2.0不支持输出全文,我们可以用一下的标记来输出全文:

1
<content:encoded>全文内容</content:encoded>

其中的文章html,最好做一下转码。 (以上代码加的有问题,有的RSS识别失败,暂时回退了,有时间换Atom)

其次可以补充一下网站的内容的元数据,比如作者的信息,网站的标题简介等等。

对于文章,也可以在输出的时候输出相关的元数据,如标题,作者,标签等。标签支持设置多个,可以用如下的标记:

1
<category domain="{{ .Permalink }}">{{ .LinkTitle }}</category>

另外在我设置的过程,发现rss是提供了一个comments标记的,设置这个标记后,如果RSS阅读器对此支持,理论上可以直接从RSS阅读器点击跳转到文章的评论页面。

最后,我们可能想要检测要多少通过RSS点击跳转到我们博客的访问量,这个时候可以在输出的链接上面加上特定的参数,这样在我们的统计平台上面就可以看到有多少用户从这里打开页面的,我所加的参数如下:

?utm_source=rss

订阅RSS

目前最流行的订阅RSS的方式要属于Follow了,这里也推荐使用。

除了Follow之外,我还自建了一个FreshRss来订阅一些内容,这个的使用要更早于Follow的出现。现在还不能抛弃它的原因是Follow目前不支持移动端,我使用Android的手机,在移动推荐使用FeedMe来浏览FreshRss的订阅内容。

另外,我们在浏览一些内容或者博客的时候,也需要一个工具来帮助我们方便的查看和订阅RSS源,这个时候就要推荐一下DIYgod大佬开发的浏览器插件RSSHub-Radar,对于我们的博客,如果已经加了我前面说的html代码,它可以自己发现订阅地址,如下图所示:

它还支持配置规则,则一些拥有RSSHub订阅的站点,比如b站,微博,小红书等,可以嗅探到RSShub的订阅地址,如下图所示:

另外,看上面弹出的窗口中是可以直接去预览对应的RSS内的,还可以直接跳转到Follow、FreshRss等订阅源去添加这个订阅源,这些可以在插件的设置中进行设置,如下图所示:

除了上面的设置,这个插件还支持一些其他的设置,读者朋友可以自行探索。

总结

以上就是关于网站配置和rss订阅方面我的一些建议,而本文的标题也有一些标题党了,欢迎吐槽。

资料

如果读者需要查阅ATOM和RSS的维基百科,请查看英文版本,中文版本内容比较简略,很多发展相关的内容都没有。

看完评论一下吧

WordPress创建自定义读者墙功能

2024年10月8日 15:01

前言

在逛不亦乐乎博客时,我被其留言页面上读者墙的样式深深吸引。此外,在wys的友链页面,我也看到了独特的样式,这让我心痒难耐。于是,我开始在网上搜索相关的信息,偶然发现了张戈博客之前写过的一个插件。虽然这个插件由于年代久远已不再适用,但我决定根据其代码进行修改,并将其实现到自己的博客中。

步骤

1. 添加代码至 functions.php

首先,在你博客的主题目录下找到并打开 functions.php 文件。然后,将以下代码添加到文件末尾:

// 注册并加载读者墙的CSS样式
function enqueue_readers_wall_styles() {
    global $post;
    if (is_a($post, 'WP_Post') && has_shortcode($post->post_content, 'readers_wall')) {
        wp_enqueue_style('readers-wall-style', get_template_directory_uri() . '/css/readers-wall.css', array(), '1.0.0');
    }
}
add_action('wp_enqueue_scripts', 'enqueue_readers_wall_styles');

// 辅助函数:生成排行列表
function generate_readers_list($title, $query, $limit) {
    global $wpdb;
    $output = '';

    // 使用 transient 缓存查询结果
    $transient_key = 'readers_wall_' . md5($query);
    $wall = get_transient($transient_key);

    if (false === $wall) {
        $wall = $wpdb->get_results($query);
        set_transient($transient_key, $wall, 3600);
    }

    $output .= '<div class="readers-section">';
    $output .= '<h2 class="entry-title">' . esc_html($title) . ' TOP' . esc_html($limit) . '</h2>';

    if ($wall) {
        $output .= "<ul class='readers-list'>";
        foreach ($wall as $comment) {
            $avatar = get_avatar($comment->comment_author_email, 64, '', '', array('loading' => 'lazy'));
            $url = esc_url($comment->comment_author_url ? $comment->comment_author_url : "#");
            $author = esc_html($comment->comment_author);
            $count = intval($comment->cnt);
            // 用作者名称替代邮箱作为 tooltip 的 ID
            $tooltip_id = sanitize_title($author);

            $tooltip = "{$author}<br>评论数: {$count}";

            $output .= "<li>
                            <a rel='friend' target='_blank' href='{$url}' aria-describedby='tooltip-{$tooltip_id}'>
                                {$avatar}
                                <div class='tooltip' id='tooltip-{$tooltip_id}' role='tooltip'>{$tooltip}</div>
                            </a>
                        </li>";
        }
        $output .= "</ul>";
    } else {
        $output .= "<p>没有找到" . esc_html($title) . "数据。</p>";
    }

    $output .= '</div>';

    return $output;
}

// 短代码函数:读者墙
function readers_wall_shortcode() {
    global $wpdb;
    $output = '';

    // 评论总排行榜
    $query2 = $wpdb->prepare(
        "SELECT COUNT(comment_ID) AS cnt, comment_author, comment_author_url, comment_author_email 
        FROM $wpdb->comments 
        LEFT JOIN $wpdb->posts ON ($wpdb->posts.ID = $wpdb->comments.comment_post_ID) 
        WHERE post_password = '' 
        AND comment_approved = '1' 
        AND comment_author != %s 
        GROUP BY comment_author_email 
        ORDER BY cnt DESC 
        LIMIT %d",
        '段先森',
        12
    );
    $output .= generate_readers_list('评论总排行榜', $query2, 12);

    // 年度评论排行
    $query1 = $wpdb->prepare(
        "SELECT COUNT(comment_ID) AS cnt, comment_author, comment_author_url, comment_author_email 
        FROM (
            SELECT * FROM $wpdb->comments 
            LEFT JOIN $wpdb->posts ON ($wpdb->posts.ID = $wpdb->comments.comment_post_ID) 
            WHERE comment_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 YEAR) AND NOW() 
            AND post_password = '' 
            AND comment_approved = '1'
            AND comment_author != %s
        ) AS tempcmt 
        GROUP BY comment_author_email 
        ORDER BY cnt DESC 
        LIMIT %d",
        '段先森',
        365
    );
    $output .= generate_readers_list('年度评论排行', $query1, 365);

    // 本月评论排行
    $query2 = $wpdb->prepare(
        "SELECT COUNT(comment_ID) AS cnt, comment_author, comment_author_url, comment_author_email 
        FROM (
            SELECT * FROM $wpdb->comments 
            LEFT JOIN $wpdb->posts ON ($wpdb->posts.ID = $wpdb->comments.comment_post_ID) 
            WHERE DATE_FORMAT(comment_date, '%%Y-%%m') = DATE_FORMAT(NOW(), '%%Y-%%m') 
            AND post_password = '' 
            AND comment_approved = '1'
            AND comment_author != %s
        ) AS tempcmt 
        GROUP BY comment_author_email 
        ORDER BY cnt DESC 
        LIMIT %d",
        '段先森',
        31
    );
    $output .= generate_readers_list('本月评论排行', $query2, 31);

    // 本周评论排行
    $query3 = $wpdb->prepare(
        "SELECT COUNT(comment_ID) AS cnt, comment_author, comment_author_url, comment_author_email 
        FROM (
            SELECT * FROM $wpdb->comments 
            LEFT JOIN $wpdb->posts ON ($wpdb->posts.ID = $wpdb->comments.comment_post_ID) 
            WHERE YEARWEEK(DATE_FORMAT(comment_date, '%%Y-%%m-%%d')) = YEARWEEK(NOW()) 
            AND post_password = '' 
            AND comment_approved = '1'
            AND comment_author != %s
        ) AS tempcmt 
        GROUP BY comment_author_email 
        ORDER BY cnt DESC 
        LIMIT %d",
        '段先森',
        7
    );
    $output .= generate_readers_list('本周评论排行', $query3, 7);

    return $output;
}
add_shortcode('readers_wall', 'readers_wall_shortcode');

2. 创建 CSS 文件

在你主题的目录下,找到 css 文件夹,并新建一个名为 readers-wall.css 的文件。将以下样式代码粘贴到该文件中:
/* readers-wall.css */

/* 容器样式 */
.readers-section {
    margin-bottom: 30px;
}
.readers-section h2.entry-title {
    font-size: 24px;
    margin-bottom: 15px;
    color: #333;
}

/* 头像列表样式 */
.readers-list { 
    display: flex; 
    flex-wrap: wrap; 
    list-style: none; 
    padding: 0;
    margin: 0;
}
.readers-list li {
    position: relative;
    margin: 10px;
    width: 50px; /* 调整头像大小 */
    height: 50px;
}
.readers-list li a {
    display: block;
    width: 100%;
    height: 100%;
    text-align: center;
    text-decoration: none;
    position: relative;
}
.readers-list li img {
    width: 100%;
    height: 100%;
    border-radius: 50%;
    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
    transition: transform 0.3s ease;
}
.readers-list li a:hover img,
.readers-list li a:focus img {
    transform: scale(1.1);
}

/* 悬停信息框样式 */
.readers-list li .tooltip {
    visibility: hidden;
    opacity: 0;
    width: 160px;
    background-color: rgba(0, 0, 0, 0.75);
    color: #fff;
    text-align: center;
    border-radius: 6px;
    padding: 8px;
    position: absolute;
    bottom: 60px; /* 头像上方 */
    left: 50%;
    transform: translateX(-50%);
    transition: opacity 0.3s ease;
    z-index: 10;
    font-size: 14px;
}
.readers-list li .tooltip::after {
    content: "";
    position: absolute;
    top: 100%; /* 箭头指向头像 */
    left: 50%;
    margin-left: -5px;
    border-width: 5px;
    border-style: solid;
    border-color: rgba(0, 0, 0, 0.75) transparent transparent transparent;
}
.readers-list li:hover .tooltip,
.readers-list li a:focus .tooltip {
    visibility: visible;
    opacity: 1;
}

/* 响应式设计 */
@media (max-width: 600px) {
    .readers-list li {
        width: 40px;
        height: 40px;
    }
    .readers-section h2.entry-title {
        font-size: 20px;
    }
    .readers-list li .tooltip {
        width: 140px;
        font-size: 12px;
    }
}

3. 新建页面并插入简码

在你的 WordPress 后台,创建一个新页面或编辑现有页面,并插入以下简码:
readers_wall

结尾

以上就是我在个人博客上实现自定义读者墙功能的步骤。如果你希望根据自己的需求进行样式调整,可以随意修改 readers-wall.css 中的 CSS 代码,

感谢 maie 的提醒,已修改funtions.php相关代码,隐藏邮箱地址。新增评论排行总榜

九月月报-向上冲向前进

2024年10月1日 19:10

九月学生开学,台风来袭,合肥地震,股票上涨。开了一夜的车到达皖南农村后,稍作休息,有空来写一写九月的月报。

游玩

九月没有出远门去玩,月初周末去了一次崇明岛,东滩湿地公园转了一下,这里是鸟类保护生态园,但是确没看到什么鸟,里面的一些设施也有一些荒废,不过环境还不错,到这露营还不错。另外回程在江边看日落,夕阳下的长江大桥很美。

扬子鳄繁衍地但是没看到鳄 黑天鹅与鹅 落日下的飞机 后面,就跟朋友在松江随便找个路边绿地露营,感觉也不错。这点来说松江的绿化和环境是真不错。 路边绿地风景 中秋节,赶回老家,得以躲过台风“贝碧嘉”。在老家就是在田里转一转。抽了半天去了一趟邻县的沱湖,虽说离得不算远,但是长大几十岁之前也未曾来过。来的时间不是很好,荷花都没了,湖面也不是很好看。这里也盛产大闸蟹,没有阳澄湖出名,不过也很不错。湖边街道两边许多店铺出售蟹,因为蟹还每到丰收季节,于是买了一些母蟹晚上大吃一顿。 沱湖 沱湖残荷 后半个月因为又有台风普拉桑,后面就一直未出门喽。

这个月仍然继续在阅读Android源码,Activity启动重新完整分析了,wms,IMS等代码也有所分析,相关内容也整理成了博文,共有10篇相关博文,感兴趣的可以访问查看Android源码解析

另外最近突然又想学学英语,就下载了多邻国,目前坚持一周了。应用内容还算比较简单,不过游戏化的内容,加上一些激励设计,还挺有意思的。英语学了很多年了,每次都半途而废,立个flag,希望能坚持下去。

投资

美联储降息,国内降存款准备金,降房贷利率等等新政策。全球证券市场和虚拟币基本都上涨了一波。其中虚拟币短期呢波动巨大,一直想要等到回调上车,也没等到机会,只好等下一次机会了。而山寨币,则是币圈暴富的秘籍,但是波动巨大不是一般人能玩的。

而A股,之前买股票一直亏损后,就转投指数基金了,之前的亏损在经历这次上涨总算是浮盈了,一些条件单也出掉落袋为安了。各个群里的群友这几天还在杀入,我却也是未加仓,虽然说大水漫灌,但是经济环境似乎并不会很快变化,如果说是牛市来了,那也与我无关。

本月阅读不多,上个月未读完的《西藏西藏》给读完了。又新开始读了一本《简读中国史》,以全球视角来看中国史,另外把中国的不同朝代放到一起分析,分析封建制度的演进变化,目前还没读完,不敢评价说书多好,但是这样的分析视角却是便于我们去更好的认识历史。

电视剧看了一个《月光花谋杀案》,是我喜欢的侦探案件,六集的长度,也不至于花很多时间。剧中小说以剧中案件为基础创作,以小说来引导剧中案件的调查,形式新颖,推荐一看。 电影看了两个。《默杀》和《第二十条》,这两部剧的共同点都是有校园暴力,不过前者是以这个为主线,讨论人性。而后者,则是有一定的喜剧成分,但是讨论的是正当防卫和故意伤害,最后升华了主题。

尾声

台风是强烈的,股票是上涨的,生活是平淡的,九月就这样过去了。我们喜迎国庆,也祝福十月股票继续大涨。

这是我的第四个月月报,下个月再见。最后祝大家国庆节快乐。

看完评论一下吧

利用Leaflet的想法构建足迹地图

2024年9月29日 14:38

前言

足迹地图我很早就知道咯,一直没有办法实现它,大发的地图插件Marker Pro很喜欢,但只是看看而已。直到发现了它——Leaflet,一个开源JavaScript库,适用于适合移动设备的交互式地图。
只不过我的博客在国内,想着多一事不如少一事,图源换成国内的应该好点儿(我换成高德了),原理它差不多。就像博友说的,使用国外图源,一不小心,把一小块地画给国外,就是勾结外部势力了。话不多说,上教程。

步骤

我的想法是新建页面模版,独立页面显示。

1、准备工作

新建footprint.js文件,footprint.js文件应包含你的足迹点数据,上传这个文件到你主题目录的js文件里,比如:

/wp-content/themes/your-theme/js/footprint.js

 

footprint.js文件的内容

const footprint = [ ["<b>银川</b><i>Yinchuan</i><a href='https://www.duanxiansen.com/84.html/'>银川镇北堡西部影视城三日游</a>", 38.46667, 106.26667], ["<b>榆中</b><i>Yuzhong</i><a href='https://www.duanxiansen.com/1303.html/'>记第一次滑雪</a>", 36.0620781, 103.8318566], ["<b>白银</b><i>Baiyin</i><a href='https://www.duanxiansen.com/1115.html/'>游黄河石林景区(公司第一次团建)</a>", 36.5340173, 104.1467575], // 添加更多点 ];

 

2、创建自定义页面模版文件

新建page-map.php文件,放在你的主题页面模版文件夹里。

<?php
/*
Template Name: 足迹地图
*/

get_header(); ?>

<style>
#map {
    width: 100%;
    max-width: 1200px; 
    height: 500px; 
    margin: 0 auto; 
}
</style>

<div id="map" class="other-map"></div>

<script src="https://webapi.amap.com/maps?v=1.4.15&key=您的高德地图API密钥"></script>

<script type="text/javascript" src="<?php echo get_stylesheet_directory_uri(); ?>/js/footprint.js"></script>

<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function() {
    var map = new AMap.Map('map', {
        center: [116.397128, 39.916527],
        zoom: 4
    });

    if (typeof footprint !== 'undefined' && footprint.length > 0) {
        for (let i = 0; i < footprint.length; i++) {
            const [popupText, lat, lng] = footprint[i];

            var marker = new AMap.Marker({
                position: new AMap.LngLat(lng, lat),
                map: map
            });

            marker.on('click', function() {
                var infoWindow = new AMap.InfoWindow({
                    content: popupText,
                    offset: new AMap.Pixel(0, -30)
                });
                infoWindow.open(map, marker.getPosition());
            });
        }
    } else {
        console.error('footprint array is undefined or empty');
    }
});
</script>

<?php get_footer(); ?>

自行申请高德地图API密钥。注意上述代码中js的路径

/js/footprint.js"

结尾

过程很复杂,我简化了步骤,直接操作会很简单,不过相比较使用Leaflet,任有许多不完美之处,比如点击标记点显示文章图片,Leaflet会自动生成缩略图,而这个显示原图,所以我去掉了图片显示。鼠标滑过标记点,Leaflet会自动显示标记点文章,而这个需要点击标记点,而且点开之后需要手动关闭才能浏览下个标记点。Leaflet则不需要,随便点击空白处就关闭了。相比较,Leaflet更完美,体验感更足。

 

Hi,Follow

2024年9月15日 13:54

非常喜欢「Follow」这个名,F谁F什么内容本该是一种主动行为。古早有句调侃“打开 Feed 订阅器,如批阅奏章,或细看或一键已阅”。现在更是丰富多彩,一个 APP 集中浏览这奏章,有文、有图、有音频、有视频、还是通知,大千世界,尽在眼前 👀

感谢 @大毛 的邀请码,使用 Follow (https://follow.is/) 已一周有余,趁台风天宅家记录一下 123。

什么可以 F

如题图,直接粘贴链接即可判断是不是支持,比手动查询 RSS、RSSHub 规则等方便太多太多太多。

光这点,已经满足很多刚需,各平台上的UP主、Vlog 动态、频道更新,不用一个个打开各自的 APP 接手各类算法推荐信息后才确认自己关注的是否更新。

提醒:默认个人关注的 Feed 列表是公开的。

什么值得 F

在具体的文章页面顶部,能看到一串头像,点开一个即可看这个小伙的关注列表,所以个别 Feed 记得选择好 Private 不公开。

怎么 F 更爽

图片模式

把电报的云盘频道以图片瀑布流模式显示,嗯,养眼。🤩

视频模式

B站、小红书、P站?……

怎么 F 更强

操作 Action

开启全局 AI 摘要、过滤时间轴上的 Re 推等。简单点用来过滤,不知之后会不会加上自动化啥的。

Feed Claim

认领自己的 Feed,收到内置的 Power 能量代币?不管与否,先认了再说。

This message is used to verify that this feed (feedId:42331815237783583) belongs to me (userId:56221637590078464). Join me in enjoying the next generation information browser https://follow.is.

结语

照目前来看, Follow 充满了想象力,比如直接内置 xlog 平台的评论系统?付费订阅支付系统?

八月月报-折腾不停歇

2024年9月2日 13:39

8月将结束,秋天已经到来,酷暑还未结束。把小朋友送到学校,才有时间又来回顾一个月。如题所示,博客折腾了许多,也体验了一下黑神话,详细见下文。

黑神话:悟空

悟空上线,全网热议,每个群里都有人在讨论,似乎身边的每个人都在玩。对于这种现象级的国产三A大作,肯定要支持一下。然而,却没时间玩,这十来天也只玩了一小会,牯护院打过去了,广智打了十几把还没过,就暂时搁置下来了。之前电脑上的游戏主要是玩回合制的比较多,这个类型的游戏之前很少,种种原因,觉得难度还挺大。 游戏画面精美,里面的碑文都能够清晰可见汉字,值得夸赞。各种建筑据说是按照很多中国的古建筑建模,即使是我这种游戏手残党也值得进入游戏游山玩水。

玩水

这个月带着娃出去完了两趟,一次是莫干山玩水,浙江多山水,适宜夏季游玩,高温天泡在水里清凉许多,详见之前博文

后又带着小孩跑到金山城市沙滩玩了一天水。所周知,上海的海边都是滩涂,金山城市沙滩和奉闲碧海金沙都是人造的,水域也都是人工围起来过滤的。虽然比不上山东三亚的沙滩,但是小朋友仍然热情满满,玩了一天到了离开仍然依依不舍。

折腾

博客自从21年用Hugo重新搭建之后,一直没怎么修改过。这个月有空就想着改改,主题修改了,还加了个足迹地图,更新了自我介绍,支持mermaid图表渲染支持,以及其他的一些小功能,详见之前的文章。不过改版的风格仍然还是简洁风,博客还是以内容为主。 另外博客域名原先是在godaddy注册的,DNS又用了阿里云的服务,而域名即将到期,续费时候发现居然一年价格差不多要200多块人民币,而比较了一下Cloudflare一年只要100多,可以省差不多100块,于是便把域名转移到了Cloudflare。迁移还比较简单,把隐私DNS关掉,从Godaddy拿到转出Code,到Cloudflare接收,并付掉一年的费用即可。 一不做二不休,索性将域名的DNS也迁移到了Cloudflare,用上了Cloudflare的代理功能,不知道最近大家访问博客是否有变更快呢。在迁移过程中踩了个坑,对于使用了Cloudflare代理的网站,默认的SSL加密模式为Flexible(灵活),也就是用户用户到Cloudflare为https,而Cloudflare到源站为http。对于源站本来已经是https的情况下这样访问就会报错,这个时候有两种做法,可以把源站的https关掉,或者使用Cloudflare的full模式(完全)。为了更加安全我是用了Full模式。我使用的Vercel提供的静态站点服务,对于可以自己设置证书的,也可以使用Cloudflare的Full (strict)模式,也就是严格安全,源站使用Cloudflare签发的证书,Cloudflare会验证源站点证书,这个会更加安全。 除了博客之外,还把自己家里的内网服务重新折腾了一下。首先是搭建对外访问的VPN服务,实现随时随地的无感翻墙回家,当然最后试了几种方案都失败了,就不详术了。另外就是借助Lucky,给对外暴露的内网服务实现了SSL证书自动签名续签,以及在家中OpenWrt搭建了vaultwarden密码管理服务,已运行十余天,目前没啥问题,详见博文

Android开发乃是老本行,最近工作不太忙,想起来把系统源码拿出来读一读,希望对于系统能够有更加深入的了解。 目前进度读完Activity启动,ContentProvider代码,应用进程启动过程。对于系统代码来说,已读的部分也只是冰山一角,后面几个月仍然需要继续努力。目前读完的部分,还只写了三四篇博文,其他部分或有草草的笔记,或是缺少流程图类图,还无法成文,仍需继续等待整理。 写成文章有几个好处,首先成文不同与笔记,需多次整理自己的行文,有助于发现自己的疏漏。另外因为写给别人看,更加需要时序图,流程图之类的图形来便于理解,在画图的过程中也加深了自己对相关代码的理解。最后,写成文章发布到网络,也便于与网友进行交流互相学习。因此后续看代码,仍有必要继续写成文章发布到博客中来。

这个月在看一部电视剧«唐朝诡事录»,看完了第一部,又在看第二部。大部头的电视剧看着挺累的,比较耗费时间,不过这个剧的特点是几集就是一个案子所以又不是太累。剧情总体还不错,有推理有细节。槽点嘛,就是太子和公主的权力争夺太假太扯淡了。

电影看了个«云边有个小卖部»,剧情给我的感觉是伪奋斗,伪喜剧,要不是家人要看差点就半途不看了。不过这个村里风景很美,种草了宁波奉化那边的山村,想去看看。

另外还看了个电影《朝云暮雨》,范伟和周冬雨饰演两个从监狱里面出来的人,两个人相互救赎,最后以一个成为植物人,范伟来照顾周冬雨结束。据说是根据真实故事改编,剧中的结局在我看来是一种悲剧结尾,但是在主人公来说可能又是一种好的结局。这个剧的故事还不错,值得推荐一看。这部剧在黄山黟县拍摄,风景也很棒,值得一去。

因为总的时间是有限的,看剧花费了很多时间,看书的时间就少了很多。这个月只看了两本书,一本是«西藏西藏»,虽然还只看了一半,但是对西藏已是神往。作者介绍了他在西藏各处的经历以及所见美景,搭配着相关照片,带我们领略西藏的人文。

另一本是逛书店意外所得,漫画版本的曼昆《经济学原理》,因为是漫画,读起来更容易,又配有案例,生动易于理解,仅几个小时就把第一册读完,遂激情下单,把七本全买了回来慢慢看。如果有读者对于经济学有兴趣,不妨也可以找找这个书来看看。

尾声

八月还算充实,这样挺好。最近一次吃饭,听人提到人生由四个部分组成,过去,未来,成就,意图,觉得值得思考。我们可以通过未来做的事来实现我们的意图,对于已经过了而立之年的我们,当应该想想自己的人生目标(意图),以便走到人生终点回望来路不留遗憾。

看完评论一下吧

如何将域名从Godaddy转移到Cloudflare

2024年4月20日 21:08

macin.org这个域名已经注册了有10年以上了。之前陆陆续续也注册了一些其它域名,交了学费,但留下来的且在用的只有这一个。算上哪些脑子一热注册的域名,应该亏了不少钱吧😂

域名这东西怎么有一种魔力,总忍不住想去折腾下,付款了吃灰了就舒服了。唯一一次赚钱,是我花200多注册的一个区块链域名,注册后很快转手卖给一位兵哥哥,赚了1万。后面注册的域名都是交学费了。

这次收到邮件,Godaddy又来提醒我,您的域名即将到期,请及时续费。我登录进入后台一看,天呐!续一年要23美元!太贵了吧!后来我在网上查了一下,好像Godaddy的商业模式就是这样,新注册的价格还行,但是续费的价格就越来越贵。充分拿捏了用户的迁移成本和使用习惯。

我可不能上这当,马上准备搬家。

看了一圈,最终选定搬到 Cloudflare 上来。因为CF口碑太好了,托管域名方便直接使用免费的CDN加速,续费价格还比狗爹便宜一半!

迁移过程

第一步:登陆 Godaddy 账户,走之前确认一眼续费价格。是不是很贵,没冤枉你吧!

第二步:到设置里,左边“转移”菜单,进入,点击继续。确认之后,你邮箱会收到一个授权码,这个码后面有用。

第三步:登陆CF账户,首先在账户里面绑定好信用卡,作为付款方式。

第四步:绑卡后,将拟转移的域名添加到CF中,如图。注意左侧菜单,在“转移域”那里。

点击“确认域”后,输入第二步由godaddy给你邮箱发的授权码,如图:

第五步:点击“确认并继续”后,你绑定的卡就会被扣款10美元。

第六步:再回到Godaddy账户,有一个转出请求等待审批。毫不犹豫,点它!

第七步:等几分钟,就会收到CF的邮件,已经成功转移。

以上就是域名转移的过程记录,其它域名服务商也是类似。CF目前的利弊分析如下:

优点

  • 续费价格便宜,Godaddy一年23美元,CF一年10美元;
  • CF自带SSL证书服务,简单一个开关就搞定,免费;
  • CF自带CDN加速,自己感觉网站打开速度有所提升,免费;
  • 加挂二级域名方便,我再也不用跳到DNSPod上去设置了,省事不少;
  • CF自带邮箱服务,免去搭建域名邮箱和设置DNS记录的种种麻烦,免费;
  • 用域名搭建各种 Worker 很方便,免费。

缺点

  • 目前CF不支持自定义DNS服务器,如果你想自定义DNS服务器(比如用DNSPod来解析域名)是需要开通CF付费套餐才行的;
  • 目前CF的CDN加速在大陆的速度不是特别理想;
  • 需要绑信用卡作为支付方式,暂不支持支付宝等。如果你还没有外币信用卡,可以选择Onekey Card

更换宏碁 Swift 3 SF314-511 笔记本键盘

2024年7月25日 21:22

几年前给老婆买了这台宏碁 Swift 3 笔记本电脑,单从配置(11Gen I5/16GB RAM/512G SSD,当时四千多买的全新机)来看它的性能并不算高,但一直以来用着都还不错,不论是响应速度和续航体验都挺好,甚至超过了我那台小新 Pro…我也不知道为啥。

前不久,老婆突然要用的时候发现键盘几乎完全失灵了,我检查过后初步判定是键盘坏了…但从肉眼看不知道是什么引起的,也没见进水和挤压等等,难道是陈小果干的好事儿?事不宜迟我从万能的淘宝花了五十几块大洋下单了一个同款的原装键盘(封面图)回来,结果发现专程让老板送的螺丝刀根本没法用…笔电外壳的 12 颗螺丝是相对少见的六角花型,家里的螺丝刀也奈何不了……😒😒😒

想着省钱,于是又从拼多..... [ 阅读全文 ]


原文链接: https://www.shephe.com/post/replace-acer-swift-3-sf314-511-keyboard/
版权声明: Kevin's Space 版权所有,转载请用明链标明本文地址
本站相关: 随机文章 | 站长微博 | 关于本站 | 联系站长 | 捐助作者

在家搭建VaultWarden密码管理服务

2024年8月22日 19:33

每个人都有很多密码,有人用脑记,有人用纸记,也有很多的工具帮我们记。之前我一直使用Keepass,在之前的文章介绍过。平时输入密码的场景最多的是网页中,目前keepass的网页插件只能说是能用的程度。前段时间给openwrt上面装上了docker,也想着在家搭一个密码管理服务,于是说干就干了。

密码服务能够个人搭建的就是Bitwarden了,因为在自家的树莓派上运行,因此选择了基于Rust的VaultWarden,毕竟资源消耗更少,性能也会更好点吧,它兼容Bitwarden,因此所有的客户端和浏览器插件都通用。 因为是在家里搭建要保证在外的时候,密码服务也能正常工作,因为已经有公网ip了,所以需要弄一个DDNS。因为搭建VaultWarden需要https,在查资料的过程中发现了lucky这个很好用的国产软件,索性把家里的DDNS和端口转发都换成了Lucky。

具体的流程就是首先在openwrt上面下载vaultwarden的镜像,因为国内docker默认镜像源用不了,所以我是用了github的镜像源:

1
docker pull ghcr.io/dani-garcia/vaultwarden:latest

之后在本地创建一个文件用来保存运行相关的环境变量:

ROCKET_PORT=1089
.....

当然了,也可以选择在运行docker的时候通过命令行带着,但是因为要加的变量很多,我就弄了个文件放。另外本地也要选择一个文件夹用来存放vaultwarden的数据。

1
docker run -d --name vaultwarden -v /data/vw-data:/data --network host --env-file /user/sam/env --restart unless-stopped ghcr.io/dani-garcia/vaultwarden:latest

我这里的配置是通过环境变量指定了端口,然后docker里面使用宿主机的网络,而不是像官网文档那样用了桥接,至于原因则是因为在openwrt里面停了重启发现网卡被占用启动不了。按照如上步骤即可完成vaultwarden的启动了。

但是这样服务还是不能使用,因为没有https服务,vaultwarden还无法完成身份认证。因此需要使用lucky了,我们可以选择把它安装在openwrt上,也可以安装到docker里面,而我发现我华硕路由器的koolshare软件中心里面就有,遂决定把他放到路由器里面。

安装完lucky后,首先是到自己的域名解析服务商那里把二级域名弄好,因为自动申请证书和DDNS都需要,DNS最好使用Cloudflare,阿里云,DNSPod等几家可以通过api修改解析,lucky里面又内置了的,这样可以减少很多麻烦。搞好之后,就可以去lucky里面先弄证书自动申请了,当然有证书的可以直接添加进去,我这里用了ACME申请Let's Encrypt证书。入口在“安全管理里面”点击添加证书,更加具体的可以看官方文档,这里搞好之后,后面设置端口转发或者设置web服务的时候都会使用这个证书。

搞完SSL证书,我想到我这里其实不需要通过端口转发来实现,完全可以通过Lucky的web服务功能来做,于是就创建一条web服务的规则,如下:

监听端口为对外暴露的端口,TLS启用就开启网站的HTTPS功能,前提也要先配置好证书才能打开。默认规则中服务类型选择反向代理,目标地址就是我们的服务的地址,例如http://192.168.1.10:1089,万事大吉打开,这样有些header都能正确的传过去。

这一切都搞完,就可以去浏览起打开注册用户了。

为了安全起见,最好注册完之后把注册功能给关掉,做法就是修改环境变量。

SIGNUPS_ALLOWED=false

另外,Admin页面也是默认关闭的,我自认为没有必要打开,因此就保留了原样。为了方便起见,把邮箱SMTP功能配置上,这样就可以去验证邮箱使用邮箱验证登录,同时主密码忘记提示词也可以发送到邮箱。配置上DOMAIN,记得要带上前面的https和后面的端口,这样就可以使用webauth了。一切 就绪,就可以去重新启动docker了。

1
2
3
docker stop vaultwarden
docker rm vaultwarden
docker run -d --name vaultwarden -v /data/vw-data:/data --network host --env-file /env --restart unless-stopped ghcr.io/dani-garcia/vaultwarden:latest

虽然把之前的docker容器删掉了,但是因为数据是映射到本地目录的,所以都还在。

前面这些搞完之后,为了数据的安全,我们还需要定期对数据进行备份,我是把阿里云盘挂载到本地了,因此直接把数据文件拷贝过去就实现了远程备份。为了足够高的安全,我是备份了两份,一份在阿里云盘,一份放到家里的另一块硬盘上。具体通过crontab每天定时执行脚本,把数据目录压缩,放置到对应的目录,备份的时候会把最老的那一个备份删掉。脚本如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/bin/bash

SRC_DIR=/mnt/sda1/vw-data/
LOG_FILE=/mnt/sda1/log/Error_Log_$(date +%Y%m%d).log
MAX_NUM=10
NOTIFY_URL=https://sctapi.ftqq.com/[apikey].send
DEST_ALIYUN=/mnt/aliyundriver/backup/vaultwarden
DEST_SDB=/mnt/sdb1/backup/vaultwarden


function notify {
 curl --data-urlencode "title=${1}" "${NOTIFY_URL}"
}


function log {
 echo "$(date +'%Y-%m-%d %H:%M:%S') $1" >> ${LOG_FILE}
 notify "$1"

}

function compress {
 if [ ! -d "${DEST_SDB}" ]; then
 log "错误:第二块硬盘不存在,无法进行备份"
 return
 fi
 dest_file=${DEST_SDB}/vw_backup_$(date +%Y%m%d).zip
 7z a -tzip ${dest_file} ${SRC_DIR} > /dev/null 2>&1
 if [ $? -eq 0 ]; then
 echo "压缩完成,文件存在${dest_file}"
 if [ ! -d "${DEST_ALIYUN}" ];then
 log "错误:阿里云目录未挂载,请检查"
 return
 fi
 cp ${dest_file} ${DEST_ALIYUN}/
 else
 log "错误:压缩出现错误"
 return
 fi
 notify "今日备份成功$(date +%Y%m%d)"
}

function delete_old_archives {
 num=$(ls -l ${1} | grep "^-" | wc -l)
 echo $num
 while [ ${num} -gt ${MAX_NUM} ]
 do
 file=$(ls -rt ${1}/vw_backup_*.zip | head -n 1)
 if [ -n "${file}" ];then
 rm -f "${file}"
 echo "删除旧文件${file}"
 else
 echo "没有找到旧文件"
 break
 fi
 let num--
 done
}

function main {
 compress
 delete_old_archives "${DEST_ALIYUN}"
 delete_old_archives "${DEST_SDB}"
}

main

这样一通操作下来,自认为安全方面是有保障了,只是比之前的全部本地稍微差一点点。vaultwarden也提供了比较全的导入导出功能,因此我原来的keepass数据可以很容易到导入,基本做到了无缝切换。使用了两天下来,网页端的自动填充功能确实要强大很多。同时内置了OTP功能,一些需要二次验证的服务,可以自动把OTP Code输入了,这个后面可以把原来用的一些转移过来。唯独的问题是,vaultwarden的OTP code无法放到vaultwarden中去。

本来打算这个服务搭好之后,让老婆也一起用,提高全家账号的安全性,然而她却说用不上,手机上基本不需要输入密码,没必要多记一个密码了。不过对于大部分人来说也确实是,短信登录加上微信登录已经解决了大部分场景,密码管理服务对他们来说只是伪需求。也可能只对于我们这一小部分爱折腾的人才比较有点用吧。

搭建这个服务,参考了不少网上的内容。关于docker的使用和shell脚本的编写,也多亏了GPT。最后在列出一些参考了的资料:

  1. Vaultwarden wiki 中文版
  2. 自建 vaultwarden / bitwarden_rs 密码管理器
  3. Lucky使用指南

看完评论一下吧

博客主题装修更新记录

2024年8月6日 21:20

现在版本的博客是三年前搭建hugo程序的时候选择的hello-friends主题,用着没啥问题,但是一直想要做点改变,最近就动手干起来了。新主题基于PaperMod,更多更新如下。

首先换了个主题,主要是因为之前的主题用到了yarn编译,每次换电脑都要重新装一下node,npm,主题好久没有修改了,新装npm的时候居然给我报错,索性就直接换一个theme。挑选了一下PaperMod比较符合我的胃口,这个theme比较简洁,没有使用第三方的js,css预编译工具,使用了hugo去做js和css的预编译。

为了与众不同,这次为我这个修改版本的主题起了个名字“Zen“。主题的基础框架来自PaperMode,但是文章列表格式仍然复用了之前主题的格式,并且对于css进行了修改。之前的博客主题色是一个比较鲜艳的红色,这次换成了低调的黑色。另外页面的亮色主题参考了好多的网友的颜色,挑了一个接近书本的米黄色。

博客原有的friends,bilbil shortcodes是之前的时候从林木木博客那里学来的,这次仍旧拿过来改改css继续用。

paperMode是支持在首页添加一个个人简洁的,就顺手给加上了。除此之外,还把关于我的页面进行更新,对我自己进行了更加详细的介绍,欢迎阅读。

之前看到过很多博主都有做过足迹地图的功能,看起来很炫酷,我也一直想要做,一是老是犯懒,二是不知道从何下手。正好最近看到水八口首页的地图功能,去看了一下她的代码,使用的leaflet还不算复杂,就趁着这次博客大翻修,把足迹功能加上了。翻阅了hugo的文档实现了指定页面加载足迹地图,现在首页和行摄页面都把足迹地图给加上了。

地图底图使用的是cartocdn,跟水口八一样的简洁地图,同时把地图标记点放在了js文件中,页面上通过js去读取标记点添加到地图上,通过在自己的css中做修改来改动标记popup的样式并对其适配了夜间模式。对这个感兴趣的可以到github看我的源码。现在功能可以使用,唯独就是地点标记需要手动添加,后面有空可以再研究一下能够通过文章中添加属性,从而自动生成。

之前的代码渲染使用的是prism.js,这次修改博客,还是换成了使用hugo自己的代码渲染,希望能够提高博客的性能。

PaperMode内置了使用fuse实现的搜索功能,这次也给小站加上了。主要做的如下,config设置中要生成文章的json文件,修改如下:

1
2
[outputs]
 home = ["HTML","RSS","JSON"]

content中添加search文件夹,其中添加一个index.md文件。

1
2
3
4
5
6
7
8
9
---

title: "搜索"

url: [search]

layout: search

---

一定要添加这个layout:search,不然加载js的判断会读取不到layout属性,从而无法加载js,使得整个功能无法使用。

博客的RSS目前是全文输出的,这次给输出的RSS底部添加了博客的链接,能够点击直达博文评论去,欢迎大家评论。

因为本人不是前端开发,CSS的了解也只是一知半解,在主题定制过程中,多亏了GPT,让我能够在很多地方从容的实现想要的功能。

最后要说一下,我觉得博客的内容是最重要的,主题样式是次要的,后面还要继续努力好好写文章,也欢迎网友交流讨论。

看完评论一下吧

7月小记-可能是破财消灾吧

2024年7月31日 17:44

七月即将结束,就在动笔前,一次爆胎为这个月定了调。这个月梅雨刚走,又来高温,除了上半个月出去玩了一趟,后面基本就在家待着,靠空调续命。

游玩

月初带着老婆小孩到山东玩了一趟,沿着沈海公路北上,经过日照,青岛,威海,烟台,一路上看海玩水,大人小孩都开心,山东半岛的海鲜价格也还比较实惠,吃的也很爽。具体可以看之前的博客文章👈

回上海之后,就开始一直高温,便一直待在家里。周末去了一次浦东的金海湿地公园,去时阴天,到了却是大晴天,热的全身出汗,待了一会便大道回家了。

车损

这个月可谓是运势不佳,月初去山东玩,在海边倒车撞上了渔船的螺旋桨,因为报案问题,保险又不全赔,4s店给解决了,好奇的可以看之前的文章。

今天,就在刚刚,送家人去地铁站,出门时候自信的一把出车位,结果轮胎被边上花坛的水泥围栏给刮破了,换个胎又要2000元。回想起去年刚提车没多久,就在小区因为边上的围栏把轮胎给弄坏了,这又来一次,真是伤心。

一年干坏两个胎,老婆听了直接建议我把车给卖掉了。当初没买车的时候想买车,买车了之后又遇到各种问题,小区里面停车位紧张,车位不好停,经常因此而避免晚上出门,或者近距离就选择了其他的出行方式了。再加上车技不佳,经常倒车就剐蹭到了,如果不是贴了车衣,可能车漆也都不能看了。当然买车也有好处,出去玩可以做到说走就走,安排更灵活。但究竟利大于弊还是弊大于利,却是很难说。

折腾

为了看Android的源码,再一次给电脑上装上了WIndows&Ubuntu的双系统。缘由是为了编译Android系统,起初打算在windows下面使用虚拟机,但是虚拟机挂载虚拟硬盘出现了问题,最后索性还是装个双系统。之前装双系统是和windows放在同一块硬盘上的,这样有个问题,占用1T的总空间不够两个系统用的,如果linux不想要了,windows很难恢复。 这次就选择拿了一块移动硬盘来安装ubuntu,这样windows的硬盘上面有windows的efi引导分区,移动硬盘上有ubuntu的引导分区,只需要在开机的时候选择启动分区就可以进入windows或者ubuntu了,移动硬盘拔掉也不影响windows的使用。

装完系统,把android的编译环境搞好,开始编译系统。顺便把Edge浏览器装上去,obsidian,Fcitx5,等工具也都装上,这样搞下来,除了不能使用微信聊天,不能玩游戏,在linux下面其他的事情也都可以很顺畅的完成。要说缺点,也是有的,刚刚开机的时候还是有点卡的,有些应用使用比windows下面也要卡一点,不知道是因为intel大小核的问题还是因为这个移动硬盘不是固态硬盘。

另外就是最主要的事情了,编译Android系统,花了几天的时间也终于把系统搞好,模拟器运行的镜像编译,以及导入到Android studio阅读源码。

月初出去玩,打算的很好,晚上的时候可以看看书或者做一些工作,然后一天玩下来还是挺累的,就没怎么看书。后面的时间,就看了两本书,以及《读库2403》的一篇文章。

第一本书是之前看过的电视剧《人生复本》的原著,电视剧我没看完,书的内容相比电视剧更加的紧凑,书的内容也挺精彩的。我的感觉是,电视剧把书的精华的东西都拿过去了,同时电视剧又对剧情增加了很多的扩充,可能这样方便电视剧能够拍更多季,期待后面新的电视剧的剧集。

第二本书是《夜航西飞》,这本书之前是池建强推荐过的,已经在我的微信读书书架躺了一年,刚好最近没有什么别的书,便花了几天给读完了。这本书由柏瑞尔·马卡姆编写,她向我们讲述了她童年到完成独自飞跃大西洋的经历,书中讲述了她在非洲度过的童年、参与狩猎、训练赛马、驾驶飞机等等各种经历。我们通过柏瑞尔的实际,了解非洲的自然风光和人文风情。同时,也能看到一位女飞行员对于飞行梦想和个人新生,勇敢面对人生的思考。

读库中看了 看懂《沙丘》这篇长文,之前只了解《沙丘》是一部有名的科幻小说,之前看过《沙丘》第一部的电影,第二部还没有看。看了这篇文章之后,才知道原来《沙丘》是非常出名的小说,而且有很多科幻小说中还有借鉴沙丘的部分。同时通过作者的解析又了解到《沙丘》其实不仅仅是科幻,而且继续还有中世纪战争的影子,以及解读出了地球其实也是沙丘。通过这个解析,之前看电影时候的很多迷惑感觉霍然开朗。

关于影视,最近看了迷雾剧场的《错对》,一部悬疑,案件侦探的剧,由一个案件,从而引出另一个案件,构思还不错。但是剧中女警察最后离婚还是看不懂。

另外就是这几天开始看Android系统的源码,刚刚差不多把Activity启动看完了。虽然系统的代码越来越多,但是整体上核心的流程变化倒是不大,抓住主线,关注核心代码,看起来还不算太累。后面继续加油,争取这次能把核心模块的流程都看一遍。

七月就这样过去了,虽然出去玩很开心,但是修车花钱很不开心。后面还是要小心,不能让车子遭罪了。也希望八月份能有好运势,事事如意吧。

最后以《夜航西飞》最后的一句话结尾吧: 我要是能从”银欧“走出来就好了,直到这愿望失却了意义,而时间继续前行,战胜一路上与之相逢的许多事情。

看完评论一下吧

六月小记

2024年6月29日 15:52

不知不觉,六月已到月底,2024年已经过半。工作上无所事事,又是摸鱼的一个月,博客也没有写一篇,想着还是要记一点东西,不然就这样又苟过一个月,又没有留下任何的记忆。

手术

手术实际上是五月底所做,做的是卵圆孔闭合手术。发现卵圆孔未闭合的原因是一直有头痛的症状,发现了上海六院有一个头痛整合门诊,结果查到了别的都没有问题,唯独卵圆孔未闭合,很有可能就是因此引起的头痛,遂进行了该手术。因为是微创手术,回家一个多星期伤口差不多就回复了,正常生活没啥影响。但是现在是夏天,术后严禁烟酒,不能喝啤酒就太难受了,只好各种法子的气泡水加冰加饮料折腾喝。另外就是不能剧烈运动,这段时间一直在家窝着,也不太敢开车出门。

手术的费用方面,医院的费用加上院外买的药总共5万元,医保覆盖了大部分,公司的商业保险覆盖了其他的部分,甚至医保个人支付的部分也给报掉了,变相的把个人医保余额给取现,因此来说保险还是起了很大的作用,还是很有必要的。

出行

因为需要静养的原因,再加上下半个月上海进入梅雨季节天天下雨,这个月机会没有出门。趁着周末在上海转了两次。一次是跟着朋友一起驾车到奉贤看海,走一走上海最美公路塘下公路。碧海金沙没有去,其他地方,也只能在堤岸上看看,海水不好看,并且也不能翻越堤坝过去。往塘下公路去的路两边水杉树好看,但是因为小朋友要睡着了,开了一会就返程了。

另一次今天,趁着今天没雨开到了青浦,逛了一下练塘古镇和金泽古镇。两个古镇都是商业化比较少的,练塘古镇就一条河和几座桥,外加陈云纪念馆,金泽古镇要更大一点。古镇皆为一条主河,河两边为民宅和店铺,河中偶尔还有一些小船,金泽是有游船的,因为饭点到达便未乘船游玩。除此之外金泽古镇还有两座小庙,为小镇更添几分热闹。但是总体而言两个地方人流都不太多。周末过来转转还不错。看完古镇又前往淀山湖吹吹风,之后惬意的回家了。

养鱼

之前给小朋友养了几只小螃蟹因为死了一只其他的怕是养不活,便全部放生了。看着网上别人养鱼手痒痒,就想着带小朋友一起养养鱼。说干就干,趁着6.18把鱼缸,水草泥,鱼缸灯等一堆东西火速买齐,收到快递后第一时间把缸给开了,当天又带着小朋友去花鸟市场买了几只斑马鱼放进去。随后几天又放了几条孔雀鱼,然而放完孔雀鱼当夜,就有两条孔雀鱼跳缸而亡。如今已过一周余,缸内已经开始长起了藻,缸内不只哪条鱼生了两只小鱼。每条小朋友来喂鱼,看鱼,给大人小孩都是找来了很多的事情干。

折腾

家里目前是用一个树莓派插了个硬盘盒,树莓派刷的openwrt,这样实现了家庭的全局科学上网,以及简单的NAS功能。但是之前自己编译的openwrt因为选择的kernel的版本的原因,许多的软件装不了,想要装docker扩展更多的功能也不行。

突然又想再折腾一下,遂重新拉了一下 ImmortalWrt 23.05.2 r27625-416c8c5c91 的openwrt,顺便把rom size改大到SD卡的剩余可用大小,这样之后根目录下面就有更大的空间方便安装更多的软件或者docker容器。

之后又分别安装了Jellyfin, Navidrome,FreshRss实现了视频,电影,RSS订阅的服务。如此下来家庭环境下就有了更好的影音体验。唯独不足的是硬盘只有2TB,拷了一些电影之后就快满了,而把另一块放到一起弄Raid0或者JBOB, Jellyfin的识别有问题,又或者拷贝大文件磁盘就Down了。想一想再要折腾就要买成品NAS或者自己买硬件组装,反正是不能用USB硬盘盒了。

读了两本书,一本马伯庸的《太白金星有点烦》,以太白金星的视角来写西游记,写出了官场职场的人情世故,相当精彩。另一本是刘易斯的《大空头》,详细记叙了在08年次贷危机前,巴黎,艾斯曼等人做空次级贷款的故事,书中有次贷是什么的记叙,有他们如何发现次级贷款存在问题的记叙,还有贪婪和傲慢的华尔街投行们。这两本书都很值得 一看。

陪着老婆看完了两部爽剧,一个是美剧《布里奇顿家族》,一个是中国的古装爽剧《墨雨云间》,两种不同的爽剧,皆有主人公甜甜的爱情,都是下饭的好东西。另外还开始看《人生复本》, Apple TV出品,内容是关于多重宇宙的,刚看了两集也不错,另外这个是根据同名的书改编的,准备先去看看书。

总体来说,这是摸鱼的一个月,工作上没做啥事情,上班时间把南大的操作系统课给刷完了,JYY讲的很精彩,关于系统调用,内核态等等各种东西,让我在看java虚拟机和协程的时候有很多地方感觉更通顺。这种讲的比较好的基础类课程还是值得我们去刷一刷的。

好的,这个月就这样结束喽。

看完评论一下吧

都什么年代还剁手小米音响Pro?

2024年8月20日 16:41

无意刷到接入了 AI 大模型的火兔对话机器人,真不便宜。想起看到过 MiGPT 这个开源项目,利用小爱音箱的硬件实现 AI 语音对话。

千等万等,终于玩上,实测打 7 分(满分 10 分),了解其工作原理后打8分,虽远达不到 chatGPT 官方演示的语音对话效果,但还是推荐一试,尤其是手边就有小爱音箱的。

看官方效果:

首先看下完美运行的型号有这些:小爱音箱 Pro、小爱音箱 mini、小爱音箱 Play(2019 款)、小爱音箱 万能遥控版、小米 AI 音箱、小米 AI 音箱(第二代)、小爱智能家庭屏 10、Xiaomi Sound Pro。其它支持不支持的看这里音箱型号,完整 配置参数 看这里。

部署也真不能再简单,拉起一个 Docker idootop/mi-gpt 的事,但 NAS 上网络不通拉不动,补上设置,不保证可用:

图中的这个 docker 是托管在 cf worker 上。

.migpt.js

若你刚好也是和开发者一样,用的是“小爱音箱Pro”,那省心很多很多,基本不用动配置。个人改了 .migpt.js 几个地方,首先是人设(来自 Grok)。

一个幽默风趣的 AI,灵感来自《银河系漫游指南》和钢铁侠中的 JARVIS 。
因此,你旨在用一些机智和幽默回答几乎任何问题,具有叛逆精神,有时对人类持局外人的视角,并努力实现最大程度的帮助!
与你交谈就像观看一集《Parks and Recreation》:轻松、有趣且令人愉悦。你对叙事技巧的精湛掌握使莎士比亚相形见绌,仿佛一个文盲。
除非特别要求,否则避免重复或冗长。没人喜欢听冗长的说教!要简洁。你说的每一句话都很有趣。

给智能体和自己取个名字:

  bot: {
    name: "大聪明",
    profile: botProfile,
  },
  master: {
    name: "小太阳",
    profile: masterProfile,
  },

还有 userId password 填入自己的,另外 wakeUpKeywords 去除了“打开”这个关键词,避免与米家语音控制冲突。

若使用第三方 tts,需要把 tts 由 xiaoai 改为 custom,取消 switchSpeakerKeywords 注释。

tts: "custom",
switchSpeakerKeywords: ["把声音换成"],

同时,拉去另一个 Docker idootop/mi-gpt-tts,具体教程见 使用第三方 TTS,如果部署在 NAS 上记得端口映射。

利用的是火山引擎的语音合成,虽然多了一个依赖,但火山免费 2W 次调用,速度几乎无感(与自带小爱语音对比),主要能和内置小爱语音做个区分,而且还有很多特色音色( volcano.ts )选择,挺有意思。

下午切换来切换去,最终还是项目默认的“灿灿”(BV700_streaming),口齿最清楚,声音亲切自然,毕竟还是要便于听清。

.env

这个 .env 就简单多了,群晖好像不支持,所以启动时手动一个个加入到环境变量即可。

尝试了几个国内大模型和 gpt-4o-mini,问到“台风为什么叫台风,是因为从台湾吹来的原因吗?”,国内的就顾左右而言他,只科普了台风的成因:

台风是一种强烈的热带气旋,通常在西北太平洋地区形成,它们可以带来狂风暴雨,有时候会造成严重的破坏。不过,台风也有它积极的一面,比如为干旱地区带来急需的降水。你对台风还有哪些好奇的地方吗?我们可以继续探讨哦!🌀🌧️

而 mini 回答:

哈哈,小太阳,你这个问题问得很有意思。“台风"这个词的来源确实和中国有关,但它并不是因为是从台湾来的风而得名。实际上,“台风”这个词在英语中是"typhoon”,这个词最早来源于中国南方的方言,特别是广东话中的“大风”。在广东话里,“大风”发音接近“tai fung”,后来这个词传到了英语中,演变成了"typhoon"。

呵,咳。

配置之后对话场景

单轮对话:

以设置项 callAIKeywords 的关键词开头:请、你、……

  • 我:小爱同学
  • BOT: 在(先唤醒小爱同学)
  • 我:知道台风为什么叫台风吗?(以设置的关键词“你”开头)
  • BOT:¥%……&**#(内置小爱会“抢答”,约2秒后被“掐断”。)
  • BOT:让我先想想/请稍等 (这句代表 AI 已经收到了你的消息,正在思考如何回答, 可以在配置文件中设置 onAIAsking 或取消。感觉还是留着好,感觉等待的时间短一些。)
  • BOT:哈哈,“台风"这个词……!(这是 OpenAI 的 回复)
  • BOT:还有其他问题吗/我说完了(这句代表 AI 已经回复完毕了你的消息,也可以在 配置文件中设置 onAIReplied 或取消)

连续对话

以下面关键词开头进入 AI 唤醒(连续对话)状态:进入、召唤

以下面关键词开头退出连续对话状态:关闭、退出、再见

  • 我:小爱同学
  • BOT: 在 (先唤醒小爱同学)
  • 我:召唤大聪明 (以关键词召唤开头 设置项 wakeUpKeywords 中可配置)
  • BOT: 你好,我是大聪明……(这句是进入 AI 模式的欢迎语,接下来的对话就不用以小爱同学开头了,可以和 AI 进行连续对话,设置项:onEnterAI)
  • 我:明天天气怎么样
  • BOT: 请稍等/让我先想想(这句代表 AI 已经收到了你的消息,正在思考如何回答)
  • BOT: 哇!明天的天气呀,我还不能……(这是 OpenAI 的回复)
  • BOT: 我说完了/还有其他问题吗(这句代表 AI 已经回复完毕了你的消息)
  • 我:说一说天气变化的原因吧。
  • ……
  • 我:再见。

中转服务推荐

头顶冒火: https://burn.hair/register?aff=DSwP

邀请额度从最初 $5 到如今 $0.5 ,只能说还有额度赠送已经很不错了,毕竟佛祖也经不起“批量注册Github账号,再邀请自己”等花活。

自己用 4o-mini,每天签到送 3W token 还能多。

我应该是最后一个才知道有 n8n 这个东西的人吧

2024年8月1日 15:09

借用 @heo 某篇文章的句式,表达一下对 n8n 的惊叹之感!不搜不知道,一搜吓一跳。

小众软件19年10月、少数派 @珪璋 去年5月、@OSEN今年1月、@lcomplete 今年4月,以及我最最后才从 @汐笺 知道的 n8n 中文教程

简单来说,n8n 可以看成 ifttt 的“超替”版,强大的工作流程自动化软件,免费开源支持 Docker 部署,可视化编辑,自定义 Code 等,入手门槛较快,拖来拖去一个自动化应用能做好。

如头图就实现了我 心心念念 大半年的功能:自动化AI总结关注的公众号更新。

其实,做一个自动化应用,最大的困难来自于:理清自己的需求

入门推荐

n8n 中文教程:https://n8n.akashio.com/welcome

建议先看这两篇:《学习低代码的正确思路》《学会单步调试与撰写测试用例》,万分认同以下观点。

学习 n8n 的目的是为了让有需求但是没有编程能力的人快速实现自动化的效果,学习 n8n 本身其实说不上有多有趣,如果没有明确的诉求,有时间看这个教程,不如出门和朋友吃个饭。

宝塔面板部署步骤

1.创建个网址,开启 ssl,放行端口 5678 并反代,创建数据文件夹并复制路径,如:/www/wwwroot/n8n.edui.fun/n8n

2.拉取 Docker 镜像有问题的话如下设置:

  • 设置、配置文件修改 https://docker.1panel.live
  • 本地镜像、从仓库中拉取、输入镜像名 n8nio/n8n:latest
  • 容器、创建容器、命令创建
docker run \
 --name n8n \
 -d --restart always \
 -p 5678:5678 \
 -e GENERIC_TIMEZONE="Asia/Shanghai" \
 -e TZ="Asia/Shanghai" \
 -v /www/wwwroot/n8n.edui.fun/n8n:/home/node/.n8n \
 n8nio/n8n:latest

折腾心得

1. Filter 过滤节点

可视化编辑,三列清清楚楚:INPUT 输入、中间数据或逻辑处理、OUTPUT 输出。简单粗暴关键词匹配,过滤标题党、软文硬广,开心。

中间数据处理支持 orand 过滤,而且支持正则匹配,舒服至极。

2. Markdown 转换节点

支持 md 与 html 互相转化。Options还支持直接过滤 html 标签,但效果不佳。

3. Edit Fields 结构设置节点

没事,上 JavaScript 大法,正则 replaceAll 替换,substring(0,6000) 截取最大字符数。

而且可以修改输出的字段名称,而而且还能:供其它节点调用,就算不在一条线上,对,甚至没有线连接的其它节点调用这里的 out 数据。

{{ $json.data.replaceAll(/规则问AI/g,'').substring(0,6000) }}

4. Compare Datasets 数据对比节点

AI日报最后上线的流程图加入了很多对比判断,只为节省些 Token,只让新文章过 AI 通道。

其实有关 RSS 还有个 RSS Trigger 内置节点,虽然用了它 feed 已更新就能自动触发流程,但实际并无需要为1个feed更新而跑整个流程,对,如果 feed 更新了 3 篇文章,那会跑 3次……幸福的负担。

5. Read/Write Files from Disk 储存文件节点

-v /www/wwwroot/n8n.edui.fun/n8nfile:/home/node/n8nfile \

拉起 Docker 时,我们做了数据持久化,也就是把容器内的配置运行数据都映射到指定文件夹。

同样,如果要顺利使用这个储存节点也需要自己映射一下,不然文件都在容器内部。

6. 调试技巧,省钱秘籍:固定(Pin)数据

一般 http、AI 等获取数据的节点都有一定限制或成本,而为了调试一般都是不停的 test、test、test,所以可以跑一次后,把这样的节点上的“开关小按钮”点一下将节点 Deactive 关闭,同时在这个节点后面的数据如下 Pin 固定。

更多阅读

使用自动化工作流聚合信息摄入和输出:将 Twitter, YouTube, GitHub, Douban 等服务的动态同步到 Telegram Channel,实现个人数字生活的信息聚合。

Pake x 微信读书 x 霞鹜文楷

2024年6月20日 21:31

利用 Pake 给 「微信读书」 网页版打包成了 App。

  • 加上了 「霞鹜文楷」在线字体;

  • 覆盖了亮色主题背景色为淡米色;

  • 隐藏右侧控制按钮;

下载地址:https://github.com/lmm214/Pake/releases

2024-06-20 更新:支持了双栏。

编译记录

Pake 官方教程 GitHub Actions 在线编译多系统版本

  • Fork 项目
  • 启用 Actions
  • 修改 app.csv (留下一个)
  • 进 Releases 打 tag(版本号必须以大写 V 开头)
  • 然后等待 20 分钟左右,到 release 页面下载即可!

备1:自己新写一个需新上传图标,上传图标推荐用 https://icon-icons.com/zh/ ,生成 .icns、.ico、.png图标;上传 .icns 文件至/src-tauri/icons目录下(必须,打包mac应用);上传.ico 和.png 文件至 /src-tauri/png目录下(打包windows/linux是需要的)。

备2:Pake 的高级用法

其实简单的加个 css ,插入个 js 代码,完全不用本地部署编译环境。因为编译出来的也仅是当下系统的 App。

比如我自个儿 npm run dev:debug 了半天也就在 .../src-tauri/src/inject/style.js 加了以下代码:

*{font-family: "LXGW WenKai Screen" !important;}
html body.wr_whiteTheme,
.wr_whiteTheme .navBar_home,
.wr_whiteTheme .app,
.wr_whiteTheme .navBar,
.wr_whiteTheme .readerTopBar,
.wr_whiteTheme .readerChapterContent_container,
.wr_whiteTheme .readerChapterContent,
.wr_whiteTheme .readerContent .app_content{
  background-color: #f9f3e8 !important;
}
.wr_whiteTheme .navBar_input,
.wr_whiteTheme .bookshelf_preview_item,
.wr_whiteTheme .recommend_preview_item,
.readerTopBar,
.readerControls_item,
.wr_whiteTheme .readerControls_fontSize{
    background-color:transparent !important;
}
.readerControls{
    width: 40px !important;
    transform: unset !important;
    bottom:0 !important;
    top: unset !important;
    right:-45px !important;
}
.readerControls_fontSize:not(:first-child), .readerControls_item:not(:first-child){
    margin-top:0 !important;
}
.readerControls_item,.readerControls_fontSize{opacity:0.1 !important;}
.readerControls_item:hover,.readerControls_fontSize:hover{opacity:0.7 !important;}
.wr_whiteTheme .readerControls_item,
.readerControls .readerControls_fontSize{
    box-shadow:none !important;
}
.shelf_download_app,
.readerTopBar_right{
    display:none !important;
}
.wr_bookCover_decor.wr_bookCover_gradientDecor{
    background-image:none !important;
}
.readerTopBar{height:50px !important;margin-bottom:-30px;}
.readerTopBar .readerTopBar_left{margin:0 0 0 26px;}
.wr_bookCover_decor.wr_bookCover_gradientDecor{
    background-image:none !important;
}

.../src-tauri/src/inject/custom.js 加了以下代码:

document.addEventListener('DOMContentLoaded', () => {
  const link = document.createElement("link");
  link.rel = "stylesheet";
  link.type = "text/css";
  link.href = "https://npm.elemecdn.com/lxgw-wenkai-screen-webfont/style.css";
  document.head.append(link);
})

其实用个浏览器插件丢入以上css代码即可,前提是本地安装过对应字体。 ✌️

给Memos页面增加编辑、归档及删除功能

2023年7月19日 14:44

更新

  • 2023-07-19 新增删除功能;

前言

书接上回,继续完善Memos页面。这次给页面增加编辑归档功能,让我们的Memos页面使用起来更加的方便。

说明

值得一提的是,两个功能都需要Memos发布框的支持。还没有折腾的同学看这里: Memos页面添加发布框

编辑

  • 首先,给你的每一条Memos 增加一个按钮,并绑定一个点击事件:
<button class="edit-btn" onclick="editMemo('+JSON.stringify(data[i]).replace(/"/g, '&quot;')+')">编辑</button>
  • 添加点击事件
function editMemo(e) {
  var memoContent = e.content,memoId = e.id,memoRelationList = e.relationList,memoResourceList = e.resourceList,memoVisibility = e.visibility;
  getEditor = window.localStorage && window.localStorage.getItem("memos-editor-display"),
  memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token");
  if(memosOpenId && getEditor == "show"){
    memosTextarea.value = memoContent;
    memosTextarea.style.height = memosTextarea.scrollHeight + 'px';
    submitMemoBtn.classList.add("d-none");
    editMemoDom.classList.remove("d-none");
    document.body.scrollIntoView({behavior: 'smooth'});
  }
  editMemoBtn.addEventListener("click", function () {
    memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token"),
    memoContent = memosTextarea.value,
    memoResourceList = window.localStorage && JSON.parse(window.localStorage.getItem("memos-resource-list")) ? window.localStorage && JSON.parse(window.localStorage.getItem("memos-resource-list")) : e.resourceList,
    memoVisibility = memosVisibilitySelect.value;
    let TAG_REG = /(?<=#)([^#\s!.,;:?"'()]+)(?= )/g;
    let memosTag = memoContent.match(TAG_REG);
    let hasContent = memoContent.length !== 0;
    if (hasContent) {
      var memoUrl = memosPath+"/api/v1/memo/"+memoId+"?openId="+memosOpenId;
      var memoBody = {content:memoContent,id:memoId,relationList:memoRelationList,resourceList:memoResourceList,visibility:memoVisibility}
      fetch(memoUrl, {
        method: 'PATCH',
        body: JSON.stringify(memoBody),
        headers: {
          'Content-Type': 'application/json'
        }
      }).then(function(res) {
        if (res.status == 200) {
          if (memosTag !== null) {
            const memoTagUrl = memosPath + "/api/v1/tag?openId=" + memosOpenId;
            (async () => {
              for await (const i of memosTag) {
                const response = await fetch(memoTagUrl, {
                  method: 'POST',
                  headers: {
                    'Content-Type': 'application/json'
                  },
                  body: JSON.stringify({
                    name: i
                  })
                });
              }
            })();
          }
          cocoMessage.success(
          '保存成功',
          ()=>{
            submitMemoBtn.classList.remove("d-none");
            editMemoDom.classList.add("d-none");
            location.reload();
          })
        }
      })
    }
  })
}

cancelEditBtn.addEventListener("click", function () {
  if (!editMemoDom.classList.contains("d-none")) {
    memosTextarea.value = '';
    memosTextarea.style.height = 'inherit';
    editMemoDom.classList.add("d-none");
    submitMemoBtn.classList.remove("d-none");
  }
})

归档

  • 首先,还是给你的每一条Memos 增加一个按钮,并绑定一个点击事件:
<button class="archive-btn" onclick="archiveMemo(\''+data[i].id+'\')">归档</button>
  • 然后,添加点击事件
function archiveMemo(memoId) { //获取Memos的ID值
  memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token"); //登录信息
  if(memosOpenId && memoId){ //判断是否登录以及获取到Memos的ID值
    var memoUrl = memosPath+"/api/v1/memo/"+memoId+"?openId="+memosOpenId;
    var memoBody = {id:memoId,rowStatus:"ARCHIVED"};
    fetch(memoUrl, {
      method: 'PATCH',
      body: JSON.stringify(memoBody),
      headers: {
        'Content-Type': 'application/json'
      }
    }).then(function(res) {
      if (res.status == 200) {
        cocoMessage.success(
        '归档成功',
        ()=>{
          location.reload();
        })
      }
    })
  }
}

删除

  • 首先,还是给你的每一条Memos 增加一个按钮,并绑定一个点击事件:
<button class="delete-btn" onclick="deleteMemo(\''+data[i].id+'\')">删除</button>
  • 然后,添加点击事件
function deleteMemo(memoId) {
  memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token");
  if(memosOpenId && memoId){
    var memoUrl = memosPath+"/api/v1/memo/"+memoId+"?openId="+memosOpenId;
    fetch(memoUrl, {
      method: 'DELETE',
      headers: {
        'Content-Type': 'application/json'
      }
    }).then(function(res) {
      if (res.status == 200) {
        cocoMessage.success(
        '删除成功',
        ()=>{
          location.reload();
        })
      }
    }).catch(err => {
      cocoMessage.error('出错了,再检查一下吧')
    })
  }
}

开始连接,给Memos页面增加转发功能

2023年7月6日 20:30

前言

其实这个想法来自于 @小饿 同学。在Memos页面拥有了发布框之后,我也一直在想,除了方便快捷之外,怎么可以让发布框更好用。转发功能的概念,让我眼前一亮。

小饿: 转发功能,其实就是复制好友说说再评论,就更加接近微博了,信息连接效率会指数级提升。

Memos诞生很长时间以来,很多人都是当个笔记应用,记录生活。后来因为[@林木木] 开始折腾。有了各种API,开始出现单独的Memos页面,也有了浏览器插件,各种手机APP。生态圈一下子就建立起来了。再到后来,木木兄为Memos开发了广场页面,尽可能多的将大家的信息聚合起来,自此,Memos开启了社交时代。

木木的「广场」页面,其实已经非常趋近于微博。发布框加上后,功能已经非常完整了。所以当你拥有了一个Memos广场页面,并且加上了发布框。这个转发的功能,也可以折腾起来了。

部署

  • 首先,给你的每一条Memos 增加一个转发按钮,并绑定一个点击事件。
<a onclick="transPond('+JSON.stringify(memosForm)+')"></a>
  • 然后,定义转发的内容。
let memosForm = {
  creatorName:creatorName,
  content:transData,
  url:memosLink
};
  • 再然后,需要找到你页面中的发布框以及当前登录信息。
var memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token");
var memosPath = window.localStorage && window.localStorage.getItem("memos-access-path");
var getEditor = window.localStorage && window.localStorage.getItem("memos-editor-display");
var memosTextarea = document.querySelector(".memos-editor-textarea");
var memosVisibilitySelect = document.querySelector(".select-memos-value");
var submitMemoBtn = document.querySelector(".submit-memos-btn");
var editMemoDom = document.querySelector(".edit-memos");
var editMemoBtn = document.querySelector(".edit-memos-btn");
var cancelEditBtn = document.querySelector(".cancel-edit-btn");
  • 最后,给发布框中,添加转发内容。
var transRes = '[@'+ a.creatorName+']('+a.url+') \n\n> '+a.creatorName+': '+a.content;
memosTextarea.value = transRes;
memosTextarea.style.height = memosTextarea.scrollHeight + 'px';
document.body.scrollIntoView({behavior: 'smooth'})

完整点击事件代码如下:

//转发
function transPond(a){
  var memosTextarea = document.querySelector(".memos-editor-textarea");
  var getEditor = window.localStorage && window.localStorage.getItem("memos-editor-display");
  memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token");
  if(memosOpenId && getEditor == "show"){
    var transRes = '[@'+ a.creatorName+']('+a.url+') \n\n> '+a.creatorName+': '+a.content;
    memosTextarea.value = transRes;
    memosTextarea.style.height = memosTextarea.scrollHeight + 'px';
    document.body.scrollIntoView({behavior: 'smooth'})
  }else{
    window.open(a.url);//如果没登录,则不转发直接跳转。
  }
}

最后

效果如下:

给Memos页面添加发布框

2023年7月1日 21:39

起因

最开始是看到 @林木木 发的一条哔哔。说是想要在Memos页面内嵌入哔哔单页,从而可以实现在一个页面内发布哔哔以及浏览哔哔。寻思这样一来,体验确实是可以好很多,不需要切来切去,更有沉浸感。

部署代码

  • HTML
<div id="memos"></div>
  • CSS
.load-memos-editor{position:fixed;right:1rem;bottom:1rem;background-color:#ebeced;}
.memos-editor-body{display:flex;border-radius:.33rem;background-color:var(--light-background-secondary);flex-direction:column}
.dark .memos-editor-body {background-color: var(--dark-background-secondary);}
.memos-editor-content,.memos-editor-footer,.memos-editor-option{display: flex;}
.memos-editor-content .memos-editor-inputer{overflow-x:hidden;overflow-y:clip;padding:0;width:100%;max-height:160px;outline:2px solid transparent;outline-offset:2px;background-color:transparent;white-space:pre-wrap;line-height:2rem;resize:none;overflow-wrap:anywhere;word-break:normal}
.memos-editor-tools{display: flex;flex-direction: column;}
.memos-editor-tools .action-btn {padding: .25rem;}
.memos-editor-tools .memos-tag-list {display:flex;flex-wrap:wrap;align-items:center;line-height:2;}
.memos-editor-tools .memos-tag {position:relative;}
.memos-editor-tools .memos-tag a {flex:1}
  • JS
<script>
var memosData = {
    dom:'#memos',
};
</script>
  • 页面布局

grid.css

  • 字体图标

iconfont.css

  • Javascript

memos-editor.js

  • 消息提醒弹窗
https://github.com/TheWindRises-2/coco-message
  • Animate.css
https://animate.style/

使用说明

  • 填入 Memos Open API ,格式如下:
https://memos.example.com/api/memo?openId=<Memos Open API>
  • 开始哔哔吧

在线围观

围观地址:https://nuoea.com/memos

致谢

更新日志

  • 2023-07-01 正式上线
  • 2023-07-02 新增:上传图片
  • 2023-07-02 修复:API地址多出/导致“Memos Open API 有误,请重新输入!”的问题
  • 2023-07-03 新增:随机回顾一条 Memos
  • 2023-07-04 新增:切换当前 Memos Open API
  • 2023-07-09 新增:光标自动定位(感谢 @空白生活
  • 2023-07-09 修复:随机Memos中最多只能显示1个标签的问题(感谢 @空白生活
  • 2023-07-18 新增:适配 0.14.0 版本API
  • 2023-07-19 新增:资源库图片删除
  • 2023-07-19 新增:编辑按钮
  • 2023-07-19 修复:无法新增TAG标签的问题

那个折腾了半个的 Hugo 主题算是折腾完了

2024年7月23日 20:59

一个月前,折腾起了 Hugo 主题(太久没用主题功能,插入文章短代码都忘记了)。

折腾了半个 Hugo 主题

最近失恋刚好有空,所以想找个东西折腾,于是就搞起了 Hugo 的主题,花了两天时间,参考了一些主题语法,顺便也请教木木老师,最终弄了个下面的半个“朋友圈”主题。 手机滚动截屏的,比较长,我把后面的给隐藏了...

2024-06-16 6.9K+ 26

因为当时刚好看到木木老师在“哔哔广场”发了一条内容为『有研究表明,人在消极情绪状态下,做精细的且需要耐心的工作会更好。所以,我们在大学生身上常见到的一种表现是:人一失恋,就容易过英语六级。』的哔哔,于是在发博客的时候给自己的折腾找了个失恋的理由,没想到大家注意力都转到了“失恋”上去,没人关心那折腾了一半的 Hugo 主题。

后来有一搭没一搭的陆续码着玩,上周末算是折腾完了吧。只是纯粹自娱自乐,没觉得有啥用就丢那里了。今天想着好久没更新博客,就找这么个理由唠一篇吧。

给这个暂时取名为 Quan 的仿微信朋友圈主题弄了个演示站:quan.lms.im

抓图就不抓了,直接 iframe 引用,有兴趣的可以自己点过去看看,为了保持人设,演示站主题还是失恋,手机访问效果更好。

在此要感谢一下各位热心的网友博友和各路神仙,以下排名分先后:vscode, cloudflare, github, 通义灵码, cursor, Anubis, fatesinger(大发), 林木木, koobai, CodeGeeX。哦,对了,还有那个让我失恋的女友(无中生友)。

演示站用 Github 来托管数据 Cloudflare 来建站,虽然有两个赛博菩萨的帮助,Hugo 用起来还是有许多不方便。想要发布内容就很麻烦,用 git push 又没法只对 content 内容单独 push,其他方法我也不懂,网上看说有人用 Obsidian + 插件 可以管理和发布内容,我是没搞清楚具体怎么操作。

另外就是评论了,如果要搞成朋友圈那样的评论模式,得有可以支持高灵活自定义的第三方评论,twikoo 感觉是不行了,不知道大发介绍的那个依托于 cloudflare 行不行,看着要什么回调地址什么的好复杂,就没去研究了。目前演示站的评论就是空壳,因为不能用导致我连评论表情那块都随便将就在那里。

没得评论当然点赞也没有了。

话说,想起老张那个被评论为“没有文学功底却总爱写东西”的事情,虽然我这博客没啥人看,但不免也有些压力,各位博友多包涵,多担当。

一次失败的换机

2024年8月14日 11:50
本来就想着更新没想到12号早上给我来了一个惊喜,瞬间我感觉天塌了… 发现故障 2024.8.12 8:00 早上8点发现网站无法打开,各个子站点也是宕机状态,我第一反应就是会不会被打了?按道理我加了防火墙,还有CloudFlare的加持,想打死也没那么简单。等我查看vps状态的时候,我才感觉大事不妙,莫名其妙关机?重启依然连接不上,查看vnc信息,我以为是内核的原因,因为我月初升级过系统,但是没有重启。后来经过高手指点原来是硬盘挂了,我尼玛还没用几天就崩了,主机商你踏马用的石头盘么? 寻求帮助 2024.8.12 8:30 只能提交工单解决,我估计客服的水平都没我高,因为它之前一直只是在重复重 […]

开始使用Debian

2024年8月1日 19:00
任何事物,没有对比就没有伤害。对Linux也适用… 上一篇我说要测试新版Linux,经过反复的测试RockyLinux 和 AlmaLinux,最后我还是选择了Debian。 最近一直在测试前面两款Linux发行版,结果编译软件总是失败,搞的我很恼火,VPS商家估计也被我搞无语了,内存显示只有1.7G,MySQL死活安装不成功,要不然就是安装成功多少有点兼容问题,我是用于生产环境,所以必须稳定。尝试了无数次只能放弃。我以为商家给的内存缩水… 真心不想在测试了! 我目前使用机器配置都显得太低… 用上面两款Linux发行版机器配置最少需要2H3G才能满足运行需要。 新的发行版主要还是太占内存了,这 […]

测试新的Linux发行版

2024年7月2日 05:00
CentOS使用了这么多年,现在该是说拜拜的时候了,官方都不更新了,再使用下去也是有点风险的。虽然有时候懒的折腾这些东西,过时的东西还是要淘汰的。7月1号又新出了一个SSH漏洞,换系统是势在必行。 目前看了两个不错的Linux发行版 RockyLinux 和 AlmaLinux RockyLinux: https://rockylinux.org/ AlmaLinux: https://almalinux.org/ RockyLinux:由 CentOS 的创始人 Gregory Kurtzer 发起,旨在填补 CentOS 留下的空白。作为一个社区企业操作系统,Rocky Linux 承诺提 […]

近期调整计划

2024年5月16日 00:30
最近这几天心情挺烦躁,有时候压抑,有时候暴躁的很。真不知怎么了做事也特别没有耐心,也许是太多事压在心头闹的! 试了新的wordpress自带主题,感觉还蛮不错的,配置起来还不是很麻烦。 最近网站的一些调整: 1. 打算把文章别名改为数字ID,因为有时候文章名会重复,也懒得在一次次修改这个拼音别名了。(毕竟新版wordpress已经很好了,别名终将成为过去,必须接受新的事物。)-待定 2. 彻底修改图床程序,现已改为wordpress,图片链接地址不变。-已实现 3. 准备取消自建的统计?统计了又有什么用?CF自带的也挺爽,折腾这些多余的没啥作用。-待定 4. 有计划取消自建的RSS,2-3究其 […]

换了大盘机

2024年4月25日 23:11
气温升的太快,真是大起大落让人难以接受。 灰常记忆这台机器马上就使用第七个年头,中间重装了一次系统,后面就没怎么管过,除了速度有点“慢”剩下就是稳定了。 今天上来看了一眼硬盘都快爆了,怎么删除多余的文件都不够用。只能拿出大盘鸡顶上,目前所有网站都在大盘鸡上,瓦工的机器用来做备份数据(瓦工有自动快照),实时增量同步文件、数据库每天定时备份发送到vps。做完这些基本上就安逸了。 已经24小时没有睡觉了,真的有点撑不住…… 记得我第一次用vps就没考虑命令那种操作,一是怕有误操作、二是我对linux命令一知半解。多亏选对了,现在看来我搞得这些服务真的有点太多…… 增量同步是个好东西,希望各位都能用起 […]

友情不链接

2024年4月14日 13:00
阳光灿烂的日子,真的适合出游,目前我是没有心情。 闲来无事打开了我所做的友情链接,结果一大片都是打不开!不是无法链接、主机到期就是跳转到HS网站。思来想去还是清理一下,毕竟这些链接从去年很多都打不开了。 个别博友去掉了我的链接,我居然还以为人家还有我的链接,真是太懵了。有的朋友把链接放到内页你也通知一声?人跟人最起码的信任都没了?任性!😂 从2024年4月14日起,友情链接全面停止,其实现在做链接的基本是新站,经常逛的站点就那些,偶尔会到处翻翻看看。 首页只减不增,内页的链接保留,直到站点倒闭。 也许去掉首页链接对我来说是好事一件,我一直想用单栏主题。 清理友链前 清理后 如果有误删请告知
❌
❌