日本东京之旅
2024-09-2439生活6.0k12分钟
一如既往的选择了最便宜的红眼航班,这次旅程来回都是选择的春秋航空日本的航班,没有托运行李额,手提行李最大只能7KG。需要注意的是,飞机落的是成田机场,不是羽田机场,成田机场相对市区较远,另外,从国内起飞不会很严格的检查手提行李箱的重要,但是从日本回国的时候,会很严格的检查重量。值机的时候会有工作人员让你把身上所有的包都取下放在称上称重,超过重量就要托运。而且会称重两次,在登机前也会再次称重,所以在免税店买的东西也算重量。唯一能够避开的方法就是,把超重的东西装口袋里。口袋里的东西不会要求拿出来称重。 春秋航空日本是由日资运作,系统和国内的春秋好像通用。乘务员是日本人 购买行李额使用日元结算,微信小程序无法付款,只能官网或者APP 6月21日 飞机是当天凌晨2点25分从浦东起飞,落地成田机场为当地时间早上的6点25分。降落在成田机场T3。 日本和国内时差1小时,国内5点,日本6点 查攻略会发现,入关申报有两种方式,一种官网电子的,一种是纸质的,推荐使用纸质的。在飞机上空姐会发相关填写的卡片,填好后入关很快,正常的拍照和录入指纹,全程没有过多的交流。 出关后,从T3走到T2,大约10分钟,目的是去买西瓜卡(suica,绿色的交通卡)。到T2后,找到【铁道】标示牌的,下楼,穿过自动门,在右边就能找到售卖点,详细可参考西瓜卡购买攻略。购买3000日元那档,500日元的押金,实际卡里有2500日元,后期钱不够可以用现金在地铁站的机器上充值。 购买完西瓜卡后,再上楼去买到目的地的空港巴士,这次选择住在【新宿】,所以购买从成田到新宿的巴士,单程票为3600日元。上车前在便利店购买了一个饭团和一瓶咖啡。 日本的空港巴士很干净,车上有手机充电插座,还有厕所。到【新宿】车程约为2小时。 到了新宿车站后,找到行李寄存柜,将几个行李箱寄存后,就出发去【浅草寺】啦。 日本地铁站有很多行李寄存的柜子,500日元/8小时,800日元/天,不同的柜子价格不同 有了西瓜卡之后,在东京乘坐地铁非常的方便,无需关注乘坐的电车还是地铁,统统都能刷。导航首推使用【google map】,地铁信息和导航路线显示非常准。 遗憾的是,当天的天气非常差,一直在下雨。浅草寺主要还是室外,所以非常的不方便,但是,人还是巨多。 人太多,雨太大,转头去旁边的咖啡小店坐了一下,然后去吃了午饭,等雨小一些再逛。 午饭后,虽然还是下着雨,依旧前往浅草寺逛逛 求了三次签,前两次连续都是凶,立马挂到旁边栏杆上,把凶留在浅草寺,第三次抽到了吉,然后去买了【心想事成】御守,希望未来能够顺顺利利,心想事成! 逛完浅草是就出发去秋叶原了,原本计划是去晴空塔的,结果一直下雨,登塔也没啥可看的,只能跳过直奔秋叶原了。路上拍到了云雾中的晴空塔。 下次去一定要上去看看。 秋叶原真的是二次元的聚集地,也是电子爱好者的好去处,众多的手办以及电子产品,各种游戏卡片。 路边有很多穿着女仆装的小姐姐。 逛了一会后,去了小红书推荐的一家女仆咖啡厅(at-home cafe)坐坐。到地方后,总共有七层,每一层都有一个咖啡厅。在入口处会写明每个咖啡厅的营业状态以及要等位时间。是的,没看错,需要排队等位。去的时候3楼的咖啡厅排队要100分钟,所以选择了5楼的一家,不用排队。 从众心理,3L应该有什么值得排队的地方,下次有机会去3L体验一下。 小姐姐的英文不是那么的好,再加上自己的英文也烂,所以交流起来比较费事,连蒙带猜的。日语肯定是完全不懂。进门后会给你一张卡片,点了一杯咖啡后,小姐姐会在你面前会图案,大概只能坐一个小时,到点小姐姐会提醒你到点了。 咖啡厅出来后,在附近继续随意逛了一下,就出发回民宿了。 在地铁站里,随意找了一家要排队的店,进去吃了日式猪排饭。味道还不错,就是有点贵。 第一天因为下雨,没有去晴空塔和上野公园 6月22日 第二天安排的是去富士山。这天的天气非常的给力,大晴天。能够清晰的看到富士山。 原本计划这天是自己坐车去河口湖,然后自行游玩几个景点。但是综合考虑下来,不如报一个一天的团,有专门的车送到各个景点,不用担心两个景点之间要如何去的问题,到景点,下来拍照即可,而且留的时间也比较充分。并且报团的费用,和来回的车票费基本相差不多。所以强烈推荐报团。 日本对时间观念还是很强的,可以早到,但是不要迟到!说是早上8.50集合,我们踩点到的,全车人已经齐了,我们是最后到的。 一天团的流程:早上8点50集合,第一站是新仓山浅间公园,第二站是天梯小镇(日川时计店),第三站 忍野八海,午饭自行解决。 第四站 大石公园(河口湖),第五站 罗森。 到集合点大约晚上6点半。 唯一遗憾的是,富士山的雪融化的差不多了 回来后,晚上去吃了寿喜烧。说实话,不如国内的牛牛。 也不知道牛肉是不是真正的和牛,吃不出来,人均285元人民币。挺贵的。下次去避坑。 吃完饭,顺便去逛了下【歌舞伎町】一条街,也没有想象中的那么乱,还是有警察在执勤的。是合法的红灯区,但是看看就好。 6月23日 这天是迪士尼海洋一日游。因为上海也有一个迪士尼乐园,再去日本的迪士尼乐园就没什么意思,去一个不同的主题,所以选择了迪尼斯海洋。 在【新宿】坐大巴去,单程1000日元的车票,大约40分钟就能到门口。当天雨下的超级大,但是去的人还是很多。 整体来说,迪士尼海洋的游玩项目刺激度不高,最刺激的就是【惊魂古堡】跳楼机,看着很高,实际上不会全部掉下来。 提前下载好【Disney Resort】 APP,在上面绑定好门票,可以抢40周年免费的优速通。一开始人有点傻,抢了【海底两万里】的优速通,排队也就20分钟。第二次抢到了【惊魂古堡】的,省了很多排队时间。 ......
新加坡之旅
2024-09-1626生活5.2k10分钟
自己全程规划的一次出国游,圆满的完成啦 自从去年团建去马来西亚游玩以后,就开始想着下一次出国玩了。趁着目前还有时间和精力,有机会还是想出国玩一玩,见见不一样的风景。 2024年2月9日,正式官宣新加坡免签了,就决定第二次出国游去新加坡了!在过年期间就已经开始查酒店和游玩景点攻略了,初版的计划完成后,定的时间也是在4月份的某个周末外加两天假期,总共四天。 这次出国游总共是四人团,和其他三个小伙伴一起组团。后续经过大家的时间协调,不断完成计划,最终出行时间定在了4月11日-4月14日。并且为了让机票便宜点,来回都选择了红眼航班,实际上,在新加坡就玩了三天。 4月10日 今日晚上23点55分的飞机,飞行五个小时,到新加坡为第二日上午5点半。 选乘了东方航空的飞机,浦东-樟宜,机型为空客A350。 基本上主力机型都体验过了. 空客的A320 A321 A350, 波音的B737 B787 来上海那么多年,也是今晚第一次体验了磁悬浮。从龙阳路到浦东机场只要8分钟!听闻磁悬浮最快能到400km/h,后续降速到350km/h,遗憾的是当时乘坐的只到了300km/h。提前了2个半小时就到机场了。 我提前值机选择了65A,比较喜欢靠窗得位置。然而,现场办理登机牌的时候,柜台工作人员告诉我位置没了,然后给我升舱了,从经济舱升级到超级经济舱,还是非常的不错的,唯一遗憾的就是不是靠窗。峰回路转,在飞机推出准备滑行时,我看到前排左边靠窗的位置有两个空位,没有人坐,而此时已经时推出状态,不会再有乘客上飞机且机上乘客基本都已经坐定。当机立断,我就换过去了。最终还是得到了靠窗的超级经济舱。 4月11日 早晨5点多,飞机降落樟宜机场。新加坡和国内没有时差,无需倒时差。 红眼航班会快一点,晚上交通没那么繁忙 飞机落地时,外面下着大雨。坏了,今天计划是去环球玩的,啪一下,心情很低落啊。虽然下着雨,但是整个天气还是很闷热的,一件短袖都能出汗。 机场出来后,坐地铁直奔圣淘沙,途径怡丰城的时候,吃了一个KFC早餐。 进圣淘沙岛很多种方式,坐捷运需要$4, 走路只需要十几分钟,看着时间还早,选择了徒步入岛。雨还是下,但是小了很多。 进岛后,所有的公共交通都是免费的。我们预定了圣淘沙香格里拉酒店,找到了BUS A公交车,坐5站到点下车。 在攻略上看是坐BUS C,但是只看到了BUS A,找了一个保洁阿姨询问,经过阿姨指点去乘坐了BUS A 并且询问司机是否会到酒店。尴尬的是,我都是用英文询问,结果阿姨和司机都会中文,很尬。 很早就到了酒店,只是入住登记,寄存完行李就直奔环球影城啦。 新加坡的环球影城不大,相比北京环球小很多且当天人没有那么多。早上十点开门入园,直接开始玩。 毕竟开园时间还是比较久的,设备没有北环那么新。 小黄人园区要在今年下半年才开,只能在外面看看海报咯。 下午三点环球结束后,回酒店休息下。一样幸运的是,酒店也给升级房型了。订的是山景房,给升级成了海景房,能够看到海上繁忙的货轮,别有一番风味。 晚上去怡丰城的食阁简单吃了晚餐,尝了肉骨茶以及炒粥,人均大约70RMB。 晚餐后想回去酒店的沙滩看日落的,可惜时间没有赶上,到酒店已经快7点了,天已经快要黑了。不过当时天气也不太好,估计大概也是看不到日落。 今天在飞机上的五小时基本没怎么睡好,算是通宵玩乐的一天,会格外的疲惫,小伙伴们到酒店就不想去沙滩再玩了,泳池也没有去。(泳裤白带,没用上) 我独自一人在沙滩边散步了一会,拍了几张夜晚海边的照片。直角椰子树也没有去打卡,算一个小小的遗憾吧,下次来补上。 4月12日 面朝大海,早晨见日出。 然天公不作美,早晨一直在下雨。 本想着早晨去逛下以及看一下日出,可惜,下雨打破的计划,在酒店呆到了中午后出发去市区酒店。直奔卡尔登酒店,位置不错,对面就是来福士商场。 下午一点,雨势渐小,穿着拖鞋,出门去逛各景点了。由于出发时间已晚,按原来计划去国立大学时间必定来不及,顾四人分两队,两人去国立大学,两人去其他各景点。 放弃了国立大学,去了苏丹回教堂、哈芝巷、小印度、福康宁公园、旧禧街警察局和鱼尾狮公园。 这几个景点相距不远,全程走路. 大约五点,在牛车水见面吃晚饭。逛了商场,推荐的肉骨茶已经吃过,换一个。逛了一圈最终选择了精悦蓉。 嗯,第一次吃上了8块钱一碗的米饭。 饭后去逛了滨海湾花园,非常推荐夜晚去,晚上的灯光很好看。去的时候大约8点,也没有查攻略。到那里才发现还有一个灯光秀,大约15分钟,真的非常好看! 逛完后回酒店休息了。 btw,在地铁上看到了街边钢琴,有很多路人即兴弹奏一曲 ......
养育内心的小孩
2024-08-2162生活4.9k9分钟
读《养育你内心的小孩》总结 夹杂着一点自己的感想。 安全感 -> 自由感 -> 价值感 -> 意义感 -> 亲密感 安全感 症状: 如果我不A,就会发生什么事情伤害我。例如:害怕孤独,害怕被抛弃等等。 其实很多时候,害怕是自己内心的恐惧,自己的幻想,实际并不会有什么影响,只是自己无谓的担心。 安全感不应该过高也不应该过低,是处于一个动态变化的过程,有一个适度的区域。适度就是既不会让自己处于无法应对的危险里,也不会影响自己的正常生活。 当感觉没有安全感的时候,深入内心,你到底在害怕什么?结果就是真实发生了,会有什么后果呢?后果真的是难以承受的吗?发生的概率是多大? 根据具体的情况来调整自己的状态。 有时候适度的放弃,求助他人都是不错的选择,不一定所有事情都要靠自己,可以通过他人来获取一定的安全感。 自由感 症状:如果发生了A,我就必须/不能B。 当我们去做一个事情的时候,内心会有两个驱动力:一是感受,二是理性。 感受是情绪的流动,是自我最直接的反应,也就是本我。 理性则是思考的权衡,是大脑结合实际的综合权衡,会判断哪些事情应该做,哪些不应该做,做出一个正确的决策,也就是超我。 如果一件事情,从情绪上来说你愿意去做,同时理性的思考你也应该去做,那么就是身心合一,做事会更有劲;如果二者有分歧,那就是身心分离,做事感到身心俱疲。 自由感则是要做到身心合一。 所谓自由,不是指无条件的自由,而是在一定条件内的自由。 无论是情绪还是理智都支持去做一件事的时候,那么这个时候是能感受到自由的。在生活中,很多时候都是身不由己,无法做出拒绝的选择,只能被动接受,其实这个时候就是失去了自由感。 比如对方对我失望,我就要照顾他的心情,让他不对我失望(但实际上,我并不想这么做) 比如对方不开心,我就要负责开导他。(实际上,关我什么事情) 比如对方有要求时候,我不能拒绝。(工作上经常遇到,想拒绝不能拒绝) 比如放弃自己的感受,为了其他事情。(并不是所有事情都比自己感受重要) 其实有时候对自己的内耗也是一种内心匮乏自由,比如今天休息,我有很闲的时间可以打游戏,但是如果我不学点什么就会觉得很浪费,很焦虑,这是非常典型的自由感的缺失。 为什么会有缺失自由感?很多时候是理性在强迫自己做一些不想做的事情。 深入内心的思考,会发现放弃自由的目的是为了获取安全感。如果不是为了安稳的活下来,谁愿意委屈自己呢?想要自由,就得付出代价,而这个代价可能就是要牺牲一部分的安全感。 自由是安全感被满足的结果。在如今内卷的社会,安全感的确实非常常见,围城现象频繁。只有当内心感到安全时,不会担心自己的生存问题,才会有追求自由的冲动。 同样,超我的过于强大会失去自由感,而本我的放纵也会让安全感确实。自由感也需要一个舒适区,在社会/工作允许的范围内最大化的做自己,在工作和愉悦之间做一个平衡。 正如孔子所言,随心所欲 ,不逾矩 偶尔自由,便是请假去旅游,去躺平。 可以尝试让自己做一点之前不敢做的事情,突破一下自己限制,跟随自己感受去做一点小事情,享受生活中的小自由。 价值感 症状:外界发生了什么,代表我不够好。 价值感是自由的结果。价值感是做事的动力。 一个人在想自己能不能做好的时候,其实已经预设了一个前提:“我是可以做这件事的.” 而自由是安全感的结果,所以价值感就是"我是可以做这件事的,做这件事是安全的。" 价值感是对自己的一种信任,就是相信自己能够做好,相信自己有这个能力,相信自己是可以的。 对于每个人,只要用心发现,价值感其实随处可以找到。简单而言,对于那些你能随手做到的事情,也是一种自我价值的体现,但是人总是会忽略这种价值,会不断的挑战新的高度,将每一次挑战的成功当作是有价值的,总是希望自己可以解锁更多的技能,拥有更多的疆土。 潜意识逻辑 凡是我有的,都是无所谓的;凡是我没有的,都是好的。凡是我会的,都是不重要的;凡是我不会的,都是重要的。 ......
nextcloud性能优化
2024-03-2625技术8.2k16分钟
文件上传限制 nginx默认文件上传大小限制为1MB,需要修改 在server中增加如下配置 client_max_body_size 10m; 修改nextcloud的配置 编辑/etc/php/7.3/fpm/php.ini,更改文件限制: upload_max_filesize=16G post_max_size=16G max_input_time = 3600 max_execute_time = 3600 memory_limit = 512M 使用redis 在config.php文件中添加如下内容 'memcache.local' => '\\OC\Memcache\Redis', 'memcache.distributed' => '\\OC\Memcache\Redis', 'redis' => array( 'host' => '192.168.0.105', 'port' => 6379, 'dbindex'=>0, 'password'=>'', 'timeout'=>1.5 ), 后台安全告警 在nextcloud页面点击管理设置-概览 会出现系统自动检测到告警,虽然不配置不会影响使用,但建议还是修复一下,下面整理了一些告警及解决方案。 问题一: 描述 有些应用程序目录是由与 Web 服务器不同的用户拥有的。如果应用程序是手动安装的,情况可能是这样的。检查以下应用程序目录的权限 解决 提示的是程序目录的权限有问题。出现的原因是,手动安装nextcloud时,网站的目录是手动建立的,文件输入root用户。解决办法是将整个网站目录及其子目录全部更改为www-data所有(nginx): chown ......
nextcloud打造个人网盘
2024-09-2447技术1.3w27分钟
前言 目前有了nas,能够把自己的数据都放到nas上做相关的备份,后续又入手了零刻的EQ12迷你主机来做一个单独的服务器。所以想搭建一个私人网盘,能够同步各端的数据,在外使用方便又快捷。 简介 对比了不少的开源网盘产品,相比下来,Nextcloud是大多数的选择。Nextcloud是Owncloud的分支开源产品,拥有丰富的功能并且社区也比较活跃,各端都有相应的客户端,更容易上手。唯一缺点是使用PHP写的,相对来说性能可能没有那么高。不过用来做私人云盘足够了。 准备工作 拥有docker环境的服务器 docker启动mysql8.0 docker启动redis 安装 这里为了方便,使用docker进行安装(主要不懂php,用docker可以不关注细节) 使用docker下载镜像的时候有两个版本,分别是nextcloud和nextcloud:fpm,前者默认自带apache的服务器,启动就能用,后者则是不带web服务器,需要额外使用web服务器。不过后者的性能会更好一点,所以这里选择了后者。 下载docker镜像 docker pull nextcloud:stable-fpm 创建挂载目录 在自定义目录下创建对应的挂载目录,此处创建目录分别为 mkdir /home/nextcloud/html mkdir /home/nextcloud/html/data mkdir /home/nextcloud/html/config mkdir /home/nextcloud/html/custom_apps mkdir /home/nextcloud/html/themes custom_apps,config,data,themes目录最好都在html目录下,不然后面可能会出现奇奇怪怪的问题。 启动nextcloud镜像 注意这里暴露的是9000端口 docker run -d --name selfnextcloud \ -p 9000:9000 \ -v /home/nextcloud/html:/var/www/html \ -v /home/nextcloud/html/custom_apps:/var/www/html/custom_apps \ -v /home/nextcloud/html/config:/var/www/html/config \ -v /home/nextcloud/html/data:/var/www/html/data ......
request.contextPath失效
2024-03-135前端3.7k7分钟
问题描述 在springboot项目中使用了jsp文件,并且使用el表达式来获取项目路径。 内容如下 <%@ page contentType="text/html;" language="java" pageEncoding="UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="ctx" value="${pageContext.request.contextPath}"/> <!DOCTYPE html> <html> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <link type="text/css" rel="stylesheet" href="${ctx}/cachemanager/css/lib/bootstrap-lib.css"/> </head> 但是在启动后访问路径,并没有按照预期取到相应的工程目录,导致页面内容的无法展示。 通过 ${pageContext.request.contextPath}可在JSP 中取得当前的项目绝对路径,比如当前项目是 http://localhost:8080/demo 则 ${pageContext.request.contextPath} 代表的就是 /demo,其中 / 代表 http://localhost:8080 所以一般使用${pageContext.request.contextPath} 定位资源。 原因 Maven 项目默认使用 web-app 2.3 ......
大马团建游
2024-08-0232生活4.9k9分钟
第一次团建,第一次出国 去年也有一次团建,因为疫情还没有完全放开,计划的是去张家界玩,机票都买好了,结果由于疫情的严重,被迫取消了,退票扣了240元。第一次团建就这样无了。 时间来到2023年,完全放开了疫情,可以不用带口罩了,这一段时间阳的人也非常多。然而,我天生打工人,一次没阳。 疫情放开了,能够自由出国了,预感到了今年的团建会出国,所以早早就去办了护照。有点小小的机智喔 五月中旬,组里又同时组织了马来西亚五日团建游,这抓紧机会抱个大腿。就这么上车了,中间准备签证,准备电话卡等等。 签证直接在官网申请,马来西亚对一寸照的要求特别高,花费213元,大概1-2工作日就能下来 2023年6月7日 今天是团建的第一天,早上8.55的飞机,从浦东飞往吉隆坡。我查询了之前的飞行记录,一般都是9点左右起飞,大约下午2点能到目的地,航线是沿着海岸线飞行,会比较快。 然而,这天的航班由于军事活动原因,推迟了一个小时,并且走的是内陆,绕到了三亚,然后转向直飞吉隆坡,快到吉隆坡的时候,遇到大流量,又绕了一圈才最后降落,时间已经是下午的3点半了。 出了航站楼打车到酒店,用的grab软件。支付宝内嵌的这个软件不太好用,自带的翻译反而会扰乱正常的交流,导致前两次接单的司机都没很好的沟通,被取消的订单。 另外机场的到达层有好几层,每个层的出口都有不同的编号,不知道为什么司机没找到。最后去到了1层的3号门打上了车,此时已经下午5点多了。在去酒店的路上遇到了下班高峰,到酒店基本都18点多了。 从机场到酒店的路上,司机全程车速100km/h 以上,过弯都不带刹车的。那边好像没有过多的摄像头 晚上随便找到一家餐馆吃了饭(不太好吃,还贵),之后就是双子塔拍照啦。 晚上去了茨厂街吃了小吃,肉骨茶太香了。蜜雪冰城开到了国外! 第一晚的酒店是真的棒!!除了酒店顶层带无边泳池,能够看到双子塔。住的三人间也是非常的nice!带厨房,洗衣机,冰箱等等,给同行的同事都羡慕坏了,哈哈哈。可惜只睡一晚,后面酒店就一般了。 2023年6月8日 今天从吉隆坡坐高铁到槟城,高铁最高时速140km/h喔。全程大约4小时。下午3点左右就到了酒店。远远无法和第一晚的酒店相比。 晚上找了一家海鲜餐馆,海鲜+啤酒,痛风套餐安排上了。味道还是不错的,龙虾的量不大有点小贵。 晚上就去壁画街看了各种隐藏在墙上的壁画。 最后在第二天早上尝了牛肉果条,味道很不错! 2023年6月9日 要到我们最后的目的地啦。 从槟城坐飞机到兰卡威,计划在兰卡威呆上两天。 很不幸的是,这次飞机又晚点了。 下午1点半起飞,到兰卡威大约是下午的2点。 在飞机上看,全是水,风景真的太美了。落地后第一感觉就是热,很晒,但是环境真的好。 我们租了车,在岛上能够自由穿行。首先就是回酒店咯。酒店阳台能够看到海,海景房耶! 晚上去了沙滩边的一家餐馆吃饭,巨便宜,巨好吃。而且服务员很好,挑选的海鲜会帮你把多余的水和冰去掉然后再称重。这顿饭堪称一绝,价格还不贵。 饭后就去晚船拖伞咯,一个降落伞,靠船拖着起飞,高度还行,大约50m左右?在上面看看风景很不错,临近日落,很美。 在沙滩边拍出了很美的照片,不用修也是一张大片,真的太棒了。 2023年6月10日 今天是在兰卡威的第二天啦!出海,跳岛游。 比较遗憾的是,浮潜没有预约上,没有机会去体验浮潜了,只能下次咯。 一上午去了好几个岛(忘记名字了),尽情的玩水,尽情欢乐吧。 午饭回程,遇上了暴风阵雨,全身湿透,真落汤鸡0.0 晚上去了瓜镇夜市,小吃一条街,东西真的很便宜,味道也很不错! 2023年6月11日 团建的最后一天啦,今天一整天都在路上。很不巧,早上错过了亚航的值机时间,晚到了那么几分钟,系统关闭没法上飞机了。亚航的服务真好,免费给改签了下午的航班,并且还给我们买了汉堡王。 上午的亚航错过原定的航班,导致了下午4点从吉隆坡飞浦东的航班也错过啦。我们拼命跑呀,在东航结束值机前那么几分钟到了柜台,结果呢?柜台没人了!!!那么就理所当然的错过啦,只能临时买了南航的机票,从广州中转一下,然后飞浦东。 那么,到广州的时间是晚上9点,等一个半小时后,飞到浦东,落地时间是凌晨的1点半。而且落的是浦东的卫星厅S1,走过来又得好远,花了半个小时多。折腾一下到家已经接近4点了,然而不妨碍第二天7点起床0.0 总结 不建议去槟城,没啥好玩的,可以直接从吉隆坡飞到兰卡威。 旅途中奇奇怪怪的经历都拉满,谁能想到一天能错过两趟飞机呢。 总之,这次的旅途非常的愉快。期待明年的团建 ...
A320起飞前准备
2023-12-2427模拟飞行1.0w21分钟
所有描述都仅限模拟飞行。可能存在与真实飞行不相符的操作。请勿带入真实飞行中。 文中的飞机时MSFS默认的A320,存在部分功能的缺失,缺失的一般新飞都不会用到,暂先忽略。 这是自己当初在学习模飞时,根据视频教程总结的一篇简单的学习笔记,方便后续快速回忆。 进入驾驶舱 进入驾驶舱应该绕机做安全检查。(游戏中可忽略) 在设置飞机之前,需要做一些必要的检查,检查电门是否关闭,如果在接通电源时这些电门处于开启状态会造成一些伤害。 首先就是引擎的开关 Engine Master 1&2,白色的Engine Mode Select必须处于Normal位置,正确状态如下图所示 接下来是气象雷达,位于Engine Master的左边,正确位置如下所示 接下来是雨刷 检查完以上的电门后就可以接通电源 接电源先使用外部电源 按下电源之后飞机就开始上电,各个按钮都亮起来了,大致如下 上电大概等40S左右 进行自我测试 才能完成 在开启APU之前需要进行APU的防火报警测试,点TEST按钮会有报警声音,且上面的屏幕有显示APU FIRE,如下两图所示 APU报警测试完成后,可以启动APU 先点击APU上面的那个,大概等3S后 点击APU starter 然后可以看下主屏幕显示 FLAP OPEN: 代表APU进气口已经打开 EGT: 代表APU的小引擎已经开始燃烧 N:代表APU的转速 (APU在机尾部分,启动后可以切出去听下声音喔) 在启动完APU后,我们可以把外部电源给断开,单靠APU来发电 这是原来的外部电源状态 断开后的状态是 断开外部电源后,我们开启APU BLEED(BLEED 是空气源的意思) 开启APU BLEDD之后 ,可以切换到APU Page查看信息 然后开启APU后,我们可以调节下空调的温度 在完成上述基本设置之后,我们后续设置顶板 AIRBUS 320顺序从左到右,从下到上,如下图所示 那么接下来,我们就按照这样的顺序,从左到右,从下到上开始设置 ......
接口型函数
2023-07-2334后端5.2k10分钟
前言 什么是接口型函数?接口型函数指的是用函数实现接口,但是这种方式适用于只有一个函数的接口。 这能够让使用者在调用的时候就会非常简便,既可以传自定义的函数也能够传实现了该接口的结构体作为参数。 举例 在学习geeCache中能够看到其中有接口型函数的案例: //定义一个函数类型 F,并且实现接口 A 的方法,然后在这个方法中调用自己。 //这是 Go 语言中将其他函数(参数返回值定义与 F 一致)转换为接口 A 的常用技巧。 // Getter 定义接口 Getter 和 回调函数 Get(key string)([]byte, error),在缓存不命中时调用 //参数是 key,返回值是 []byte type Getter interface { Get(key string) ([]byte, error) } // GetterFunc 定义函数类型 GetterFunc。 type GetterFunc func(key string) ([]byte, error) // Get GetterFunc实现 ......
A320驾驶舱基础介绍
2024-01-0437模拟飞行6451分钟
A320驾驶舱介绍 视野面板 头顶面板 中央基座 飞行控制装置(FCU)介绍 电子飞行仪器系统(EFIS) 介绍 ...
Java-RMI
2024-03-0714后端6.4k12分钟
简介 RMI (Java Remote Method Invocation) 是指Java 远程方法调用,是一种允许一个 JVM 上的 object 调用另一个 JVM 上 object 方法的机制。 在RMI中对象是通过序列化方式进行编码传输的。(基于序列化和反序列化就可能存在反序列化漏洞了) RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。 官方文档中的示例 示例 定义接口 public interface Hello extends Remote { String sayHello() throws RemoteException; } Java的RMI规定此接口必须派生自java.rmi.Remote,并在每个方法声明抛出RemoteException。 编写实现类 客户端的请求最终会通过这个实现类进行处理并返回结果。 public class HelloService implements Hello{ public String sayHello() throws RemoteException { return "Hello, World"; } ......
A320-飞机概述
2024-03-137模拟飞行1.9k3分钟
1 机身尺寸 A320CEO构型: A320NEO构型: 2 航程 A320 Family range in Nm: 3 发动机选型 4 最大重量 5 舱门高度 6 转弯半径 7 驾驶舱应急设备 8 非增压区 9 天线 通讯天线 导航天线 转自 3系飞行员 ...
serverless-无服务
2023-10-116技术6.7k13分钟
Serverless 架构即“无服务器”架构,它是一种全新的架构方式,是云计算时代一种革命性的架构模式。与云计算、容器和人工智能一样,Serverless 是这两年IT行业的一个热门词汇,它在各种技术文章和论坛上都有很高的曝光度。 目前行业可能更多处在容器 Docker+Kubernetes, 利用 IaaS、PaaS和SaaS 来快速搭建部署应用 什么是Serverless Serverless 圈内俗称为“无服务器架构”,Serverless 不是具体的一个编程框架、类库或者工具。简单来说,Serverless 是一种软件系统架构思想和方法,它的核心思想是用户无须关注支撑应用服务运行的底层主机。这种架构的思想和方法将对未来软件应用的设计、开发和运营产生深远的影响。 所谓“无服务器”,并不是说基于 Serverless 架构的软件应用不需要服务器就可以运行,其指的是用户无须关心软件应用运行涉及的底层服务器的状态、资源(比如 CPU、内存、磁盘及网络)及数量。软件应用正常运行所需要的计算资源由底层的云计算平台动态提供。 Serverless的技术实现 Serverless 的核心思想是让作为计算资源的服务器不再成为用户所关注的一种资源。其目的是提高应用交付的效率,降低应用运营的工作量和成本。以 Serverless 的思想作为基础实现的各种框架、工具及平台,是各种 Serverless 的实现(Implementation)。Serverless不是一个简单的工具或框架。用户不可能简单地通过实施某个产品或工具就能实现 Serverless 的落地。但是,要实现 Serverless 架构的落地,需要一些实实在在的工具和框架作为有力的技术支撑和基础。 随着 Serverless 的日益流行,这几年业界已经出现了多种平台和工具帮助用户进行 Serverless 架构的转型和落地。目前市场上比较流行的 Serverless 工具、框架和平台 有: AWS Lambda,最早被大众所认可的 Serverless 实现。 Azure Functions,来自微软公有云的 Serverless 实现。 OpenWhisk,Apache 社区的开源 Serverless 框架。 Kubeless,基于 Kubernetes ......
五一安吉小游
2024-08-218生活1.4k2分钟
毕业后的第一个五一,也是第一个规划出游的假期呀。感受人潮汹涌 五一将至,与好友商量至舟山两三日游,后观天气有雨且人多船少,担心上岛回不来,遂转至内陆游。 上南京一日游,烟花三月下扬州,后至苏州,最后返沪。一切计划都很完善,就差车票与酒店了。可惜,车票没了,酒店太贵。又,转周边游。安吉-就在周边,驾车三四小时即到,冒着人多的风险,就决定去了。 第一天-大竹海&井空里大峡谷 29日早晨5点驱车直奔大竹海,到时已经十点,碰巧天气有点小雨,人不是很多,游玩还是比较尽兴的。爬了山,看了竹海,也挑战了玻璃桥。 游玩一圈结束后,才中午12点。遂决定驱车前往井空里大峡谷。免门票,就是进去的路因为下雨有些泥泞。徒步深入,真的能够里面的环境所吸引。有山有水,水很清澈,空气很清爽。有人在里面野炊。顺着小路一路向前,逐渐深入,到了无人区,转身返回。 驱车行至酒店,放下包裹,出门体验了第一次的密室逃脱,说实话,自己真的不太适合,毫无头绪思路… 第二天-云上草原 相比第一天,云上草原的人就很多了,完全是云上人海。到景点时快十点了。排队入门已经足足有了8个S弯。(没有上海CP29那么恐怖)。一个半小时后入检票口后坐大巴车至索道处,乘坐索道上了云上草原。里面的风景也很不错的,另一番风味。唯一遗憾的是,人太多了,里面的项目一个没玩上,前面排队也耗费了很多精力,都没有什么精力爬山了,只能拍拍照,坐一坐。 第二天就只玩了一个景点,下午5点半驱车返回上海,大约9点到上海。 回来路上还看到在不到600米的距离上,发生了三起追尾事故。出门在外,小心驾驶。 这一次的自驾游体验还是非常不错的,没有遇到想象中的人潮,也感受了一波自然风景,完美! ...
跳跃表-redis
2023-06-074后端3.6k7分钟
前言 跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。 跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。 Redis使用跳跃表作为有序集合键(zset)的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员(member)是比较长的字符串时,Redis就会使用跳跃表来作为有序集合键的底层实现。 Redis只在两个地方用到了跳跃表,一个是实现有序集合键,另一个是在集群节点中用作内部数据结构,除此之外,跳跃表在Redis里面没有其他用途。 跳跃表 Redis的跳跃表由zskiplistNode和zskiplist两个结构定义,其中zskiplistNode结构用于表示跳跃表节点,而zskiplist结构则用于保存跳跃表节点的相关信息,比如节点的数量,以及指向表头节点和表尾节点的指针等等。 跳跃表示例: header:表头节点 tail:表尾节点 level:记录跳跃表内,层数最大的节点的层数,不包含头节点 length:记录跳跃表长度,不包含头节点 跳跃表节点结构 typedef struct zskiplistNode { //层 struct zskiplistLevel { //前进指针 struct zskiplistNode *forward; //跨度 unsigned int span; } level[]; //后退指针 struct zskiplistNode *backward; //分值 double score; //成员对象 robj *obj; } zskiplistNode; 层:跳跃表节点的level数组可以包含多个元素,每个元素都包含一个指向其他节点的指针,可以通过这些层来加快访问其他节点的速度,一般来说,层的数量越多,访问其他节点的速度就越快。 每次创建一个新跳跃表节点的时候,程序都根据幂次定律(power law,越大的数出现的概率越小)随机生成一个介于1和32之间的值作为level数组的大小,这个大小就是层的“高度”。 前进指针: 每个层都有一个指向表尾方向的前进指针,用于从表头向表尾方向访问节点。 跨度:用于记录两个节点之间的距离。 指向NULL的所有前进指针的跨度都为0,因为它们没有连向任何节点。 ......
整数集合-redis
2023-06-201后端2.4k4分钟
前言 整数集合(intset)是集合键(set)的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。 整数集合 整数集合(intset)是Redis用于保存整数值的集合抽象数据结构,它可以保存类型为int16_t、int32_t或者int64_t的整数值,并且保证集合中不会出现重复元素且有序。 整数集合结构 typedef struct intset { //编码方式 uint32_t encoding; //集合包含的元素数量 uint32_t length; //保存元素的数组 int8_t contents[]; } intset; contents数组存放整数集合中的每个元素,且每个元素不重复。 length记录了元素的个数。 encoding:整数集合的真正的类型。 encoding类型: INTSET_ENC_INT16:contents就是一个int16_t类型的数组,数组里的每个项都是一个int16_t类型的整数值。 INTSET_ENC_INT32:contents就是一个int32_t类型的数组,数组里的每个项都是一个int32_t类型的整数值。 INTSET_ENC_INT64:contents就是一个int64_t类型的数组,数组里的每个项都是一个int64_t类型的整数值。 整数集合示例: 上图的整数集合,包含5个元素,且每个元素的类型是INT16。 整数集合升级 每当我们要将一个新元素添加到整数集合里面,并且新元素的类型比整数集合现有所有元素的类型都要长时,整数集合需要先进行升级(upgrade),然后才能将新元素添加到整数集合里面。 整数集合升级的步骤: 根据新加入的元素类型扩展现有数组的空间大小,并分配新空间; 将原有的所有元素转换成新元素的类型,并将转换后的元素放到正确的位置上且保持数组的有序性; 将新元素添加到底层数组里面。 因为每次向整数集合添加新元素都可能会引起升级,而每次升级都需要对底层数组中已有的所有元素进行类型转换,所以向整数集合添加新元素的时间复杂度为O(N)。 升级的好处: 提升整数集合的灵活性 整数集合可以通过自动升级底层数组来适应新元素,所以我们可以随意地将int16_t、int32_t或者int64_t类型的整数添加到集合中,而不必担心出现类型错误,这种做法非常灵活 节约内存 只有在需要int64的时候才会升级,如果整数都是int16的,则不会使用int64, 进而节约了内存。如果都默认int64,那么会造成一定的浪费。 整数集合不支持降级,一旦升级之后就会保持升级之后的状态。 总结 整数集合是集合键的底层实现之一。 整数集合的底层实现为数组,这个数组以有序、无重复的方式保存集合元素,在有需要时,程序会根据新添加元素的类型,改变这个数组的类型。 升级操作为整数集合带来了操作上的灵活性,并且尽可能地节约了内存。 整数集合只支持升级操作,不支持降级操作。 ...
压缩列表-redis
2023-04-180后端2.6k5分钟
前言 压缩列表(ziplist)是列表键(list)和哈希键(hash)的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现。 压缩列表 压缩列表是Redis为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构。一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值。 压缩列表结构 属性 类型 长度 作用 zlbytes uint32_t 4字节 压缩列表占用的内存字节数:在对压缩列表进行内存重分配, 或者计算 zlend 的位置时使用。 zltail uint32_t 4字节 压缩列表表尾节点的偏移量:用来倒序遍历压缩列表。 zllen uint16_t 2字节 记录了压缩列表包含的节点数量: 当这个属性的值小于 UINT16_MAX (65535)时, 这个属性的值就是压缩列表包含节点的数量; 当这个值等于 UINT16_MAX 时, 节点的真实数量需要遍历整个压缩列表才能计算得出。 entry[] 列表节点 none 压缩列表节点,保存内容,长度由类型决定 zlend uint8_t 1字节 特殊值0xFF(255),用于标记压缩列表的末端 压缩列表节点构成 previous_entry_length: 以字节为单位属性,记录压缩列表中前一个节点的长度。 previous_entry_length属性的长度可以是1字节或者5字节: 如果前一节点的长度小于254字节,那么previous_entry_length属性的长度为1字节:前一节点的长度就保存在这一个字节里面。 如果前一节点的长度大于等于254字节,那么previous_entry_length属性的长度为5字节:其中属性的第一字节会被设置为0xFE(十进制值254),而之后的四个字节则用于保存前一节点的长度。 encoding: 记录节点的content属性所保存数据的类型以及长度 一字节、两字节或者五字节长,值的最高位为00、01或者10的是字节数组编码:这种编码表示节点的content属性保存着字节数组,数组的长度由编码除去最高两位之后的其他位记录; 一字节长,值的最高位以11开头的是整数编码:这种编码表示节点的content属性保存着整数值,整数值的类型和长度由编码除去最高两位之后的其他位记录; ......
字典-redis
2023-04-069后端7.8k15分钟
前言 在字典中,一个键(key)可以和一个值(value)进行关联(或者说将键映射为值),这些关联的键和值就称为键值对。 字典中的每个键都是独一无二的,程序可以在字典中根据键查找与之关联的值,或者通过键来更新值,又或者根据键来删除整个键值对等等。 字典经常作为一种数据结构内置在很多高级编程语言里面,但Redis所使用的C语言并没有内置这种数据结构,因此Redis构建了自己的字典实现。 字典 redis中字典的结构 typedef struct dict { //类型特定函数 dictType *type; //私有数据 void *privdata; //哈希表 dictht ht[2]; // rehash索引 //当rehash不在进行时,值为-1 in trehashidx; /* rehashing not in progress if rehashidx == -1 */ } dict; type属性和privdata属性是针对不同类型的键值对,为创建多态字典而设置的: type属性是一个指向dictType结构的指针,每个dictType结构保存了一簇用于操作特定类型键值对的函数,Redis会为用途不同的字典设置不同的类型特定函数。 privdata属性则保存了需要传给那些类型特定函数的可选参数。 ht属性是一个包含两个项的数组,数组中的每个项都是一个dictht哈希表,一般情况下,字典只使用ht[0]哈希表,ht[1]哈希表只会在对ht[0]哈希表进行rehash时使用。 除了ht[1]之外,另一个和rehash有关的属性就是rehashidx,它记录了rehash目前的进度,如果目前没有在进行rehash,那么它的值为-1。 dictType的结构如下 typedef struct dictType { //计算哈希值的函数 unsigned int (*hashFunction)(const ......
链表-redis
2023-03-312后端2.8k5分钟
前言 链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用的C语言并没有内置这种数据结构,所以Redis构建了自己的链表实现。链表在Redis中的应用非常广泛,比如列表键的底层实现之一就是链表。当一个列表键包含了数量比较多的元素,又或者列表中包含的元素都是比较长的字符串时,Redis就会使用链表作为列表键的底层实现。 链表 链表的结构如下 typedef struct listNode { // 前置节点 struct listNode * prev; // 后置节点 struct listNode * next; // 节点的值 void * value; }listNode; redis在listNode上做了一层封装,使得操作更加方便 typedef struct list { // 表头节点 listNode * head; // 表尾节点 listNode * tail; // 链表所包含的节点数量 unsigned long len; // 节点值复制函数 void *(*dup)(void ......
激进线程池
2023-08-064后端9.3k18分钟
背景 线程池的默认工作方式是:当提交任务后,如果线程数小于核心线程数(corePoolSize),则创建新的线程执行任务。当创建的线程数等于配置的核心线程数时,提交的任务会被加入到设置的阻塞队列中。只有当队列满了,才会创建非核心线程执行任务,直到线程数达到最大线程数(maximumPoolSize)。 激进线程池 默认的线程池工作方式会先把队列打满,如果反过来,我们先让线程池把线程数创建满,之后再将多余的任务放进阻塞队列中,是不是对于任务会执行的更快呢? 实现思路:自定义阻塞队列和拒绝策略。java会更加阻塞队列是否已满来创建线程,那么我们可以用虚假的结果’欺骗’一下线程工厂,让其创建线程执行任务。 代码如下: import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.IntStream; public class RadicalThreadPool { private static AtomicInteger atomicInteger = new AtomicInteger(); public static void main(String[] args) throws Exception { RadicalThreadPool radicalThreadPool = new RadicalThreadPool(); ThreadPoolExecutor threadPool = radicalThreadPool.getThreadPool(); radicalThreadPool.printThreadPoolStatus(threadPool); IntStream.rangeClosed(1,20).forEach(i -> { try{ TimeUnit.SECONDS.sleep(1); }catch (Exception ......
简单动态字符串-redis
2024-01-202后端3.5k7分钟
前言 SDS(简单动态字符串)是 Redis 最基础的数据类型,那么 SDS 字符串是什么?为什么 Redis 没有直接使用 C 语言的字符串表示?二者区别是什么? 什么是SDS SDS(simple dynamic string),意为简单动态字符串,是 Redis 的默认字符串表示。 SDS的结构如下 struct sdshdr { //记录buf数组中已使用字节的数量 //等于SDS所保存字符串的长度 int len; //记录buf数组中未使用字节的数量 int free; //字节数组,用于保存字符串 char buf[]; }; 示例: free属性的值为0,表示这个SDS没有分配任何未使用空间。 len属性的值为5,表示这个SDS保存了一个五字节长的字符串。 buf属性是一个char类型的数组,数组的前五个字节分别保存了’R’、‘e’、‘d’、‘i’、‘s’五个字符,而最后一个字节则保存了空字符’\0’。 SDS遵循C字符串以空字符结尾的惯例,保存空字符的1字节空间不计算在SDS的len属性里面,并且为空字符分配额外的1字节空间。遵循空字符结尾这一惯例的好处是,SDS可以直接重用一部分C字符串函数库里面的函数。 SDS与C字符串的区别 1.常数复杂度获取字符串长度 因为C字符串并不记录自身的长度信息,所以为了获取一个C字符串的长度,程序必须遍历整个字符串,对遇到的每个字符进行计数,直到遇到代表字符串结尾的空字符为止,这个操作的复杂度为O(N)。 和C字符串不同,因为SDS在len属性中记录了SDS本身的长度,所以获取一个SDS长度的复杂度仅为(O)。 通过使用SDS而不是C字符串,Redis将获取字符串长度所需的复杂度从O(N)降低到了O(1),这确保了获取字符串长度的工作不会成为Redis的性能瓶颈。 2.杜绝缓冲区溢出 C字符串不记录自身长度带来的另一个问题是容易造成缓冲区溢出(buffer overflow)。比如,当用户执行strcat()函数时,会假定用户已经为dest分配了足够多的内存,可以容纳src字符串中的所有内容,而一旦假定不成立,就会产生缓冲区溢出。 strcat函数可以将src字符串中的内容拼接到dest字符串的末尾 char *strcat(char *dest, const char ......
顾村公园
2023-10-284生活5291分钟
三月正当时,周末约好友两三去赏花。随意走一走,看看风景。 人挺多的,但是不挤,拍几张照 可惜人太多了,这次没机会体验摩天轮以及好友泛舟 下次一定 ...
disruptor初识
2024-01-212后端1.1w23分钟
最近在看前辈写的代码,梳理下逻辑,发现一处的处理貌似’断了’,仔细了解后才知道是一个异步消费的处理逻辑。进而进行了快速入门学习。 背景 Disruptor 是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于 Disruptor 开发的系统单线程能支撑每秒 600 万订单,2010 年在 QCon 演讲后,获得了业界关注。2011年,企业应用软件专家 Martin Fowler 专门撰写长文介绍。同年它还获得了 Oracle 官方的 Duke 大奖。 从数据结构上来看,Disruptor 是一个支持 生产者 -> 消费者 模式的 环形队列。能够在 无锁 的条件下进行并行消费,也可以根据消费者之间的依赖关系进行先后消费次序。 添加依赖 <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.4.2</version> </dependency> 最新版本为4.0.0.RC1,需要jdk11以上支持 基础使用 创建一个事件类 首先需要创建一个事件类StringEvent,后续处理的数据都放在这个事件中 import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.time.LocalDateTime; @Setter @Getter @ToString public class ......
NAS内网穿透
2023-10-286技术6.9k13分钟
拥有了一台nas,但是没有公网ip,且不支持ipv6,想在通过外网访问的话只能使用内网穿透了。 刚好有一台腾讯云的服务器,8M带宽,一个月1200G的流量,应该够用了,所以自己基于docker搭建一个frp的内网穿透使用。 自己也拥有一个域名,备案了。 本次的安装步骤,理论上适用任何的支持docker的nas设备,不仅限于绿联的。 frp github地址: GitHub-FRP FRP中文文档:概览 | frp (gofrp.org) 服务端 docker拉取镜像 docker pull snowdreamtech/frps 在主机上创建一个目录,用于编写配置,例如/home/frp/dockerfrp,创建文件frps.ini,内容如下 [common] # 服务端和客户端通信端口 bind_port = 8081 # http访问端口,访问该端口进行转发 vhost_http_port = 9099 # 控制面板的端口 dashboard_port = 9098 dashboard_user = admin dashboard_pwd = admin # 开启监控 enable_prometheus = true # 客户端连接时需要的token token=token # 日志信息 log_file ......
初入nas随记
2024-05-168技术1.6k3分钟
一直以来想自己搞一个nas玩玩,搭建一下属于自己的私人仓库以及私有云。在收集各种资料后,一致都推荐群晖或者威联通,当然,更加推荐的是群晖。群晖毕竟是专业做nas的,系统功能丰富,完善,但是价格嘛。。。确实贵上很多,而我又是个初入者,很多功能估计是用不上的,也不太会玩。黑群晖?星际蜗牛?还是因为初学者,不太会折腾,想入一个傻瓜式的nas,能够开箱即用的。 在工作了一段时间后,越发想入手一个nas了,计划是做一个数据收口(没多少数据,可能属于强上)。也就开始在网上一直持续关注,最主要的期望nas上能够挂docker,而docker需要比较大的内存,在群晖几款支持docker的机器上,内存都很小,完全不够用。自己加内存,又是不小的一笔开销。。就一直拖着了 无意之中发现了之前的配件厂-绿联,开始搞nas了,第一次了解到的是DH2600,双盘位,外带M2口以及4G可扩展内存,价格在2399。而且有集中式的APP,也支持docker。对比下自己的需求,完美符合!在我这,完胜群晖呀!所以就一直在持续关注,找个机会下手,毕竟之前有人是1899入手的,我也在等低价。 在等的过程中,绿联发布了DH2600的升级版,DX4600,支持四盘位,两个M2,8G内存,首发价只要2399!根本没有犹豫,当天就预定了。有了前几代nas的开发以及系统的完善,绿联新一代的4600应该是比较好的,至少硬件上来说,没有什么挑剔的。系统方面绿联也在持续完善,不过到目前已经能上手的功能,基本满足了我的日常使用。其他更多的功能还没用的上,希望以后能用上把。 在预定后,足足等了两个星期,到10月10号晚上才付尾款。问了客服是付完尾款要到14号才发货,这谁顶的住啊,刚好周末能折腾下,错过这个周末就要下周了。好消息是,绿联"没有信守承诺",隔天11号就给发货了,13号就收到了,当天晚上开始折腾,周末也能折腾。 外观简约大方,完美,大小比想象中的小,放在角落里刚好。我第一次玩nas,没有什么其他的拆机看啥的,直接上硬盘,加内存就开机了,不得不说,集成式app对于新人非常友好,不用太折腾就能上手。在一个局域网下链接上就能正常使用了。不过奇怪的是,其他人遇到了硬盘扫描需要几个小时,而我插上就能用了,完全没有扫描的过程??不太理解,不过后续用起来确实挺不错的。 目前在nas上搭建了不少的docker应用,也利用自己的腾讯云服务器完成了内网穿透,能够在无公网ip的情况下,随时访问自己的nas应用,还是很舒服的。 关于硬盘,目前就上了一个4T的,估计双11会考虑再买三个盘吧,两个硬盘组个raid1做一些重要数据的备份(感觉没什么重要数据0.0),比如照片,笔记之类的吧,买两个4T的raid1。考虑视频库的占用会比较大,所以想买一个8T的?这个有待商榷。有那么多视频资源需要看吗?再买一个4T的应该够了把。硬盘也贵啊,一个酷狼4T的800,两个1600呀,拼多多的海康西数紫盘8T要1000,合起来2600了! 看看双十一有什么优惠没有把,不然就上两个4T的就好了,8T再等等吧。 最后在TB上了希捷的16T硬盘来存视频资料,不做额外备份了。16T大概1100左右,能够接受。由于大容量盘是氦气盘,用起来声音挺大很明显,而且听说会与漏气的现象,时间久了可能会无法读数据?之后再做一次备份好了。 ...
java实现markdown转html
2023-03-1112后端1.8w37分钟
springboot实现上传markdown文件并且能够转成html格式 一、引入相关pom <dependency> <groupId>org.commonmark</groupId> <artifactId>commonmark</artifactId> <version>0.17.1</version> </dependency> <!--扩展 表格--> <dependency> <groupId>org.commonmark</groupId> <artifactId>commonmark-ext-gfm-tables</artifactId> <version>0.20.0</version> </dependency> <!--扩展 标题--> <dependency> <groupId>org.commonmark</groupId> <artifactId>commonmark-ext-heading-anchor</artifactId> <version>0.20.0</version> </dependency> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.15.3</version> </dependency> 二、编写markdown转html的工具类 Md2htmlUtil.class public class Md2htmlUtil { /** * 增加扩展[标题锚点,表格生成] * Markdown转换成HTML * @param markdown * @return */ public static String markdownToHtmlExtensions(String markdown) { //h标题生成id ......
nuxt2引入axios
2023-02-246前端6.1k12分钟
Nuxtjs2可以使用2种方式来引入axios进行异步数据请求。 第一种 使用@nuxtjs/axios 1.安装 npm install @nuxtjs/axios -d 2.配置 nuxt.config.js export default { axios: { baseURL: 'http://localhost:8699' }, modules: [ '@nuxtjs/axios' ], } 3.能够通过上下文context获得axios对象 async asyncData({ $axios }) { const ip = await $axios.$get('http://icanhazip.com') return { ip } } 4.封装axios 在plugins目录下创建js文件,例如axios.js export default function ({ $axios, redirect }) { $axios.onRequest(config ......
nuxt2使用docker部署
2023-02-213前端3.2k6分钟
直接使用服务器部署也是可以的,当时相对来说会麻烦一点,要保证nuxtjs启动后能够在后台运行,目前看到的方法是安装额外的一个软件来保证nuxtjs能够后台运行。直接使用docker的话则会简单一点。不需要考虑环境问题等等。 Dockerfile文件编写 #1、基于镜像node,版本选择合适稳定版本即可 FROM node:14.15.3 #2、作者 MAINTAINER tmen #3、参数,node的环境为生产环境 ENV NODE_ENV=production #4、任意ipENV ENV HOST 0.0.0.0 #5、容器内创建目录app RUN mkdir -p /app #6、复制当前的内容到容器内容部目录app COPY . /app #7、切换工作目录到app WORKDIR /app #8、暴露端口3000,默认端口 EXPOSE 3000 #9、配置npm的远程仓库 RUN npm config set registry https://registry.npm.taobao.org #10、清除缓存 #RUN npm cache clean --force #11、安装依赖 RUN npm install #12、构建,生成dist文件 #RUN npm ......
vue3如何注册组件
2023-05-274前端1.7k3分钟
一、普通组件注册 1.全局 全局注册组件相对简单一点 在main.js中 import { createApp } from 'vue' import App from './App.vue' // 引入组件 import C from './components/C.vue' const app = createApp(App) //注册组件,前面为使用的名字 app.component('MyTestC', C); app.mount('#app') 注册完可以在任何地方使用 <template> <MyTestC></MyTestC> </template> 2.局部 2.1非语法糖注册 在需要引入的文件中,导入相应的API,注册即可使用,代码如下 <template> <A></A> <B></B> </template> <script> // 导入组合式API import { defineComponent } from "vue"; import A ......
IDEA常用插件
2023-05-0517其他7271分钟
IDEA常用的插件,能够有效的提高开发效率 EasyCode-MybatisCodeHeleer 基于IntelliJ IDEA开发的代码生成插件,支持自定义任意模板(Java,html,js,xml)。 只要是与数据库相关的代码都可以通过自定义模板来生成。支持数据库类型与java类型映射关系配置。 支持同时生成生成多张表的代码。每张表有独立的配置信息。完全的个性化定义,规则由你设置。 该版本用于兼容MybatisCodeHelper插件,方便MybatisCodeHelper插件做代码补全检测等 Alibaba Java Coding Guidelines 阿里巴巴java开发手册规范 JRebel and XRebel 热部署插件,非常的好用 Maven Helper 展示maven导入的包,处理maven的jar包冲突时有效定位,排除冲突的包 MyBatisX 使用mybatis能够有效的跳转对应的方法和sql语句 squaretest 单元测试代码自动生成 SequenceDiagram 查看接口时序图 ...
IDEA的常用配置
2023-09-2010其他2.7k5分钟
IDEA有很多人性化的配置,配置分散在不同的位置,时间一长容易忘记,每次重装或者配置新环境都会显得麻烦,特此记录一些常用的配置,以便后续使用。 这里使用2021版本作为演示,后续版本位置如有变化需要重新找一下,功能应该不会有出入 设置主题 IDEA默认提供了四套主题。没有特殊需求的话,选择Darcula 鼠标滚轮修改字体大小 鼠标悬浮提示 2021.1.3版本的修改到了Code Editing,更高版本的可以在Editor->General->Appearance中找到 自动导包功能 自动导入包以及优化导入的包 设置行号以及方法之间的分隔符 忽略大小写提示 IntelliJ IDEA 的代码提示和补充功能有一个特性:区分大小写。 区分大小写的情况是这样的:比如我们在 Java 代码文件中输入 stringBuffer, IntelliJ IDEA 默认是不会帮我们提示或是代码补充的,但是如果我们输入 StringBuffer 就可以进行代码提示和补充。 tab多行显示 导入包超过多少数量后会改为’*' 修改类头注释信息 设置文件编码 Transparent native-to-ascii conversion 主要用于转换 ascii,一般都要勾选, 不然 Properties 文件中的注释显示的都不会是中文。 设置自动编译 快捷键常见模板 可以自定义 maven配置 本文仅列举了常用的配置,其他配置保持默认的情况下也能够正常使用,如需要修改还要仔细研究设置页面 ...
bcrypt加密简单使用
2023-03-1111技术1.2w25分钟
前言 在开发过程中需要对密码或者其他非明文保存的数据进行加密。对于密码这类不需要知道明文的通常使用单向的哈希存储方式。以前都是使用md5,sha256之类的进行加密,但是不够安全,而bcrypt会更加安全。 bcrypt是一种跨平台的文件加密工具。bcrypt 使用的是布鲁斯·施内尔在1993年发布的 Blowfish 加密算法。由它加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。 前端使用 自己使用vue写的项目,也就在这个环境中使用。 安装 npm install bcryptjs 使用 新建一个cryUtils.js 这里使用的是同步版本,还有异步的函数,可点这里去github查看相关示例 import bcrypt from 'bcryptjs'; // 生成单向hash,每次值都是不一样的 export function encryOpenPwd(key) { if (typeof (key) == 'object') { key = JSON.stringify(key); } // 默认是10轮,可以修改,越大速度越慢 var salt = bcrypt.genSaltSync(10); var hash = bcrypt.hashSync(key, salt); return hash; } // ......
vite使用cdn加载资源
2023-02-259前端5.6k11分钟
升级到vue3之后,官方推荐使用下一代前端开发与构建工具-Vite 相比vue2使用的webpack来说,vite目前还没有webpack那么成熟。但是在开发阶段,vite确实好用。 在项目打包时,默认会把所有的库文件合并到一个大文件中,产生一个打包后的js文件,其中会包含各种库文件,会导致最后打包完成后的文件过大,会减慢打包速度以及后续访问加载的速度。通常会使用cdn加载一些通用的资源来加快打包和访问的速度。 vite在开发时使用的是自己的一套机制,也就是将代码转换成浏览器原生可以使用的type="module",然后让浏览器的js引擎去直接运行js,不再需要使用构建工具打包,所以可以做到秒开。vite的编译使用的是另外一个开源的包rollup,开发时dev server是不会去使用cdn的代码的,只会引用我们安装的node_modules内部的代码。 插件安装 npm install -D rollup-plugin-external-globals npm install -D rollup-plugin-commonjs 添加配置 在vite.config.js中配置如下 import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import commonjs from "rollup-plugin-commonjs"; import externalGlobals from "rollup-plugin-external-globals"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [vue()], build: { rollupOptions: { external: ['vue', 'vuex', 'vueRouter', 'element-plus'], ......
springboot解决跨域
2023-03-116后端3.8k7分钟
一、什么是CORS 跨源资源共享(CORS),也称为跨域资源共享。它允许浏览器跨域访问服务器的资源。 CORS需要服务端和浏览器同时支持,不过目前所有浏览器都支持该功能,主要在服务端进行配置即可。 二、CORS两种请求 浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。 2.1 简单请求 对于简单请求,浏览器直接发出CORS请求。具体来说,就是在头信息之中,增加一个Origin字段。 服务器根据这个值来决定是否同意这次的请求。 如果Origin指定的源不在许可范围内,则浏览器会报错。如果正常,服务端返回的响应头会多几个字段. 2.2 非简单请求 非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。 非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。 浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。 服务端发现在白名单时候,返回Access-Control-Allow-Origin等Header信息。此时预检算完成。 在设置的预检有效期内,预检只会执行一次,后面的请求就和简单请求一样了。当超时了才会再发一次。 三、Springboot解决跨域 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; @Configuration public class CorsConfig { private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); // 是否允许发送Cookie信息 corsConfiguration.setAllowCredentials(true); // 允许任何域名使用 corsConfiguration.addAllowedOriginPattern("*"); ......
重复读取HttpServletRequest
2023-02-256后端1.0w20分钟
需求 需要验证前端请求是否携带token时,通常都会在拦截器中进行配置,只有携带了token的请求才放行,否则拒绝。但是HttpServletRequest只能读取一次,在拦截器中读取后,后续的Controller需要读取就会报错。 如何实现重复读取HttpServletRequest? 解决方案 将HttpServletRequest复制一份,改为可重复读取的。 需要重写HttpServletRequestWrapper的getInputStream()方法,这样就能实现Request重复读取 实现代码 自定义Wrapper public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper { private final String body; public MyHttpServletRequestWrapper(HttpServletRequest request) throws IOException { super(request); this.body = RequestReadUtils.read(request); } public String getBody() { return body; } @Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream bais = new ByteArrayInputStream(body.getBytes()); return ......
初学 Spring security
2023-02-254后端3.6w73分钟
一般在做系统的时候大家或多或少都会涉及到权限处理问题。目前常见的权限处理框架是 shiro和spring security。之前学习spring security看过很多教程,但是都多少都涉及到了一些原理性的东西,对于想快速入手使用的读者来说不太友好。所以,我就简单的把自己学到的总结一下,能够不看底层源码,让你快速入门。文中对认证和授权模块都会覆盖。 建议学有余力或者想深入使用的小伙伴,还是应该多看看文档和源码。 1.前置 为了能够更好的理解后续的流程,我们先从宏观上去认识下整个框架的工作流程。 牢记:spring security是基于过滤器去完成认证和授权功能的。框架中每一个模块都是一个过滤器。过滤链走完了,最后到达接口,完成后续功能。 下面让我们快速上手吧! 2.环境搭建 本文使用了springboot + jwt + mysql + mybatis 实现了前后端分离的权限和授权。 基本的环境搭建就不再细说,可以通过http://start.spring.io快速搭建sringboot的项目, 下面是JWT需要的依赖 <!-- JWT 的相关依赖和 fastjson --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> ......
新版博客
2023-10-2812技术1.2k2分钟
闲言 2021年9月初吧,实习完后我花了大概两周时间完成了自己的博客小站。到今日上线已有6月之久。中间陆陆续续的忙了其他事情,断断续续的学习,文章写的很少。每次写文章总是想把写的完美一点,但是这对于菜鸟的我,又是一件比较费时费力的事情,所以文章传的很少。 转念一想,这博客看的人又没多少,日访问量也就个位数,写的好坏又有何妨呢?也就是自己的一个笔记站罢了,写的差了后续进步了再改正就好了。之后也就转变思路了,把遇到的问题或者学习的比较多放一点。也许能够帮助到和我一样的菜鸟呢?当然,若能遇到大佬指正错误那是荣幸至极。 新版博客 开学以来比较空,等着毕业就行,碰巧遇上了疫情也无法出门,所以就想把原来的博客给提升一下。vue3也出来很久了,那么就打算使用vue3来把博客重新写一遍。 原来的博客可能有点花里花哨了,有些没必要的功能同时在布局上面也显得有些小气,另外对移动端的支持也不是很好,少了现在大家都可能会需要的夜间模式。 在新版的博客上讲布局改为简约风格,少了一些花里胡哨的东西,更加突出主要内容,同时也增加了夜间模式,此外对移动端的支持也做了一定的适配,至少能在移动端上畅读了。 新版博客采用的技术,前端是vue3+vite+elementplus,这里值得提及的是,大部分样式是我自己一行一行写的,虽然不好看,但确实是自己写的。仅有比较复杂,懒的写的样式是采用了elementplus的样式。后端依旧是springboot一套,本来想增加ES来支持文章搜索的,但是数据量太小,没什么必要且服务器内容太小了,就直接使用数据库的模糊搜索了,反正用起来没差,哈哈。 这次的开发速度相对于第一次有了很大的提升,满打满算也就一个星期全部搞定了。主要的时间还是花费在了前端上,写样式,调布局确实比较麻烦。(我是后端开发!!!)虽然我是后端,但是博客这个项目后端确实没啥难的,硬查就好了,访问量又不高,甚至我觉得缓存都没必要加(虽然我加了,但是没啥用)。至少我是这么理解的,有啥不对的欢迎沟通。 为什么不用hexo 别人的博客基本都是hexo,那么为什么不用呢? 用hexo搭建的话,基本一天就能全部搞定。我写这个博客一方面是为了练习下前端(后端确实没有太多练习到0.0),另一方面算是鼓励自己多写多记一点,毕竟自己花了时间搭建的,不能荒废吧。用了hexo就感觉没有什么太大意义了,这个仁者见仁智者见智吧。 有人说,博客更加注重的是内容,而不是用什么搭建,也不是样式。但是现阶段内容不太行的基础上,我还是注重一下搭建和样式吧0.0当然,内容我也会努力提升的! 博客也不仅仅只是记录技术上的问题,有其他想记的或者需要记的都会传上来。也希望我这仅有的知识能够帮助到有缘人。 ...
HelloBlog
2023-10-284技术3761分钟
为什么建站 一方面为了综合练习下自己的技术,完成一个持续运行的项目。有了自己的小站,不仅自己能够随时随地的查看笔记,而且也能分享自己知识。 当然,我只是一个小白菜,所写的文章水平有限,写作水平也有限。这小站就算是记录自己成长历程吧。 关于小站 建站的想法有了一段时间,一直没空。直到8月底离职后才有空,整个写完大概花了15天左右吧,备案的时间有点久。整个小站前端采用Vue2+element,后端为springboot。前端不怎么会,样式写的有点丑,后面有空了在慢慢维护迭代吧。 关于文章 以前没有写过文章,刚开始应该会挺烂的。慢慢学习,慢慢进步~ ...
从零配置环境
2023-10-2820技术6.1k12分钟
一个能够满足日常开发需求的环境总需要各种各样的配置,从前端到后端,到各种各样的工具安装。每一次换电脑或者重装系统都需要来一遍繁杂的流程。 为此,写下了安装环境备忘录,以后配置环境都可以参考。 一、前端 1.安装nvm nvm能够管理多版本的nodejs,解决了node版本不兼容问题,能够在一台机器切换不同版本的node。 下载地址 node https://github.com/coreybutler/nvm-windows/releases 安装后检测是否安装成功 nvm -v 出现版本号和一系列指令则成功 nvm常用的命令 nvm list #查看目前已经安装的版本 nvm list available #显示可下载版本的部分列表 nvm install 10.15.0 #安装指定的版本的nodejs nvm use 10.15.0 #使用指定版本的nodejs 2.安装nodejs 第一种是在官网下载安装 nodejs 下载完可以以下命令来检测是否安装成功,成功均会出现对应版本号 node -v npm -v 另一种是nvm安装 nvm install <version> #nvm install 10.15.0 nvm use <version> #nvm use 10.15.0 可以通过命令查看目前的配置全局路径 npm ......
关于我的导航页
2023-10-2814其他2.5k5分钟
先放上地址,可以打开看看 Tmenの导航 需要记录的网页越来越多,以前都是用浏览器自带的书签,但是浏览器之间的同步不方便,换台电脑同步也比较麻烦。因此,自己想写一个能够不受浏览器限制且能够随时快速同步的页面。所以我也就诞生了写一个自己专属的导航页的想法。 在准备工作完成之后就发现了itab和青柠起始页,一个是浏览器插件,一个也是网页形式(青柠目前也支持了插件形式),都挺好的,也基本都能实现我所需要的功能,但还是没有满足我个人的定制需求。对于青柠页面的清爽也正符合我的个人风格,在后续的开发中更多的参考了青柠的风格,还借鉴了部分功能。在这里也向青柠的开发者表示感谢。 接下来说说自己开发的导航页吧 我更倾向于称呼为导航页,我开发它的主要功能就是能够记录更多的网站地址,能够方便直接的跳转而不是每次都是百度,然后一个个去找,对于有些不方便找的网站或者博客比较费时间。所以它的主要功能就是记录网页地址,因此我把导航区域放在了首页。对于网站导航也支持分组分类,能够根据不同的类型就行分类,也方便查找。把常用的给“钉”到首页,不常用的可以放在二级页面(在导航区域右键打开)。 在初版上线几天后,参考了青柠的便笺开发了自己的便签功能,在非导航区域点击右键可以切换。在便签上线后发现可能某些情况会需要加密功能,所以增加了便签加密功能,尽可能保证私人小秘密~。目前加密的密码忘记了就无法支持找回,所以请牢记自己的加密密码喔。 导航页的壁纸是获取了必应的每日壁纸,每日会进行同步的更换,后续会在合适的位置增加壁纸的相关介绍。 目前后续计划支持待办事项功能,至于更多的功能都会在相同页面进行支持。日常用到的功能都会慢慢的增加,已有的功能也会根据使用的情况进行持续优化。 可能随着功能的增多,网站会变得臃肿,失去了初期的清爽整洁。在后续开发过程中,我会尽量保持网站的清爽,干净,只开发使用频率高和必要的功能,不忘初心。 关于是否要适配移动端,我个人目前没有这个计划,在手机端大多数都是使用app,很少的情况下会使用浏览器,没有像使用PC那样的频繁,适配移动端更多像是做无用功一样,所以目前网页的所有设计都是PC端的,在移动端上不兼容。 最后,如果看到这篇文章的你,恰巧也是该页面的使用者或者即将使用者,在使用中有任何问题或者建议可以通过邮箱或博客留言给作者,通过评估后会加入开发计划。更多的更新信息可以通过导航页的关于查看。 头尾呼应,这也来一个吧~~导航页地址 更新于2022.01.17 自己的导航页上线有一段时间了,在这期间自己频繁的使用也发现了一些不完善和bug,也进行了持续的更新和修复,所有的记录都在页面底部的[关于]能够查看到。 自己使用的是chrome浏览器,但是chrome不支持打开新标签自定义页面,所有我增加了一个chrome插件,上架插件商城需要5美元的费用,考虑到目前使用的人数不多以及支付费用会比较麻烦,所以目前就只能使用非上架模式安装插件了,后续如果使用的人多的话会上架的 (目前就我自己使用,另外类似功能且完成度比我高的页面很多)。 页面是支持多端同步的,而且不限制设备的数量之类啥的,所以会造成多设备之间的数据同步问题。一开始,是使用最简单的办法,每次打开页面都是获取最新数据,但是如果数据没有更新或者在同一设备多次打开,会造成浪费且用户体验感不好,打开页面很慢。对这个问题我进行了持续的优化,目前的解决办法是对同一设备只有在后台数据有修改的情况下才会获取最新数据,否则使用本地的缓存,并且获取数据的过程是异步的,能够加快页面的打开速度。 更新于2023.04.15 原来的导航页冗余的功能太多了,样式显得有些不太美观,或者说看腻了,花了2个星期,UI样式全部重新写,并且技术栈也从原来的vue2升级成了vue3。功能上去掉了基本不用到的笔记功能和todolist,变得非常的纯粹的导航页。 后续有空的会持续更新,优化和增加功能,比如自定义背景,自定义搜索引擎,自定义用户头像等等。 这个导航页我也使用了一段时间了,现在会存在一些小bug,但是整体不影响使用,后续会修复。 ...
docker常用命令
2023-11-257技术5.0k10分钟
简介 Docker是基于Go语言实现的云开源项目。Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。 Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。 总结为一句话:Docker是解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。 安装 官方教程:https://docs.docker.com/engine/install/centos/ 一、卸载原来版本,没有则不会执行 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine 二、安装依赖的工具包 sudo yum install -y yum-utils 三、配置阿里云镜像地址 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #更新下软件包索引 yum makecache fast 四、安装docker相关内容,ce为社区版,ee为企业版本 yum install ......
centos7.x安转常用软件
2023-02-192技术9.4k18分钟
安装JDK 默认服务器没有安装jdk,效果如下 [root@VM-8-12-centos /]# java -version -bash: java: command not found 一、下载jdk 去官网下载对应的jdk版本,这里使用的是jdk11 二、上传并解压 tar -zxvf 文件名 -z 通过gzip指令处理备份文件 -x 从备份文件中还原文件 -v 显示指令执行过程 -f 指定备份文件 需要修改文件夹名字的: [root@VM-8-12-centos jdk]# mv ./jdk-11.0.9 ./jdk11 # mv 原来名字 修改后名字 三、配置环境 vim /etc/profile 在文件后面添加以下内容 #java environment export JAVA_HOME=/home/jdk/jdk11 #自己安装的路径 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin 修改配置文件后,需要让配置文件生效 source /etc/profile ......