殊不知,对于目前工作繁忙,很少使用手机娱乐的我来说,可以让我每日三次,打开手机去看她,因此,胡桃自然也融入了我的生活。下面,来讲讲我和胡桃的故事。
相关“我和产品的故事”系列文章:我与飞书同行的日子-少数派、飞书
2022年12月,我中午在和同事休息时,如往常一般打开《胡桃日记》,看到右上角有个显眼的红色感叹号,点进去,是停服通知。
于是立即在相关平台发了的动态,在我原本工作就不怎么开心的情况下,中午开始变得又一次失落。
这令我想到了一个TapTap 论坛里写的一句话,至今令我我记忆犹新:
舍不得胡桃,只求她活着。
2022年十月的一天,在TapTap 的 首页feed 流的推荐中,推荐了这个温馨的游戏,这样的感觉已经很久没有遇到了。
其实在我接触胡桃的时候是十月份(胡桃是那天开始写日记的),在这样“氪金成瘾的商业世界”里,还能有这样的一个单纯的游戏(虽然里面也有氪金的内容,例如服饰和钻石),确实是很难得且很少见的。
要感谢首页推荐,看到动画,还有写信,以及我一看到手机,胡桃就把手机揣起来的细节令我难忘。
其实这样的细节还有很多,在下文中会提到。
对于一个单身了25年的母胎solo来说,这就好比是失恋一般[1],并且是无法再联系的那种。
same频道里“你所理解的孤独”,有两句“月经帖”[2],令我印象深刻:
孤独两个字拆开,有孩童,有瓜果,有小犬,有蚊蝇,足以撑起一个盛夏傍晚的巷子口,人情味十足。稚儿擎瓜柳蓬下,细犬逐蝶深巷中。人间繁华多笑语,唯我空余两鬓风。孩童水果猫狗飞蝇当然热闹,可都与你无关,这就叫孤独。
一有人稍微理你,你就敞开心扉,这就是孤独。
这种感觉虽说已经习惯了,但当停服后,感觉心里空空的。
虽然有人在做着单机版,目前支持PC与Android,但我也不愿意装黑苹果[3]。
为了游戏而折腾个两三千左右字数的文章,太折腾。有这时间不加入多提升自己。其实,我已经在这么做了。
而且,似乎我总是愿意利用写作来影响世界,花时间在这些“美好的人和事物”上,就如我折腾我的个人博客、为我的微信公众号发布的内容进行数据统计,加入飞书飞行家,写个人说明书来和大家介绍自己……
因为我觉得,这些事情值得。
在现实中遇到的异性,大都是“看脸”,及对自己的物质或者是某品[4]看的更重的人,这在我的即刻相关动态中已经提到过——当然,我也思考过现状的原因,也许因为:
这种经历,导致“如果不表达出来自己想要的,就感觉没有机会 这样看,似乎就是恶性循环[5]。
而游戏,只要她不停运,就不会离开。
可这样的好景,似乎要截止于2023年2月15日。
当下,我也许不算称得上非常非常老的老玩家,但《胡桃日记》,却非常具体地融入了我的生活。
如图所述,她成为了我生活中的陪伴,没事儿可以打开来看看她。
也可以说,她陪着我度过了排队和疫情之前的时光,也是记忆。
晚上也可以看着她睡觉,然后也让我睡觉。
看到胡桃睡觉了,就真的是睡觉的标志,我也睡觉了——除了非常累,似乎没有能够说服我睡觉的理由。
在论坛里,有很多人把她当做女儿来养,她也有符合我的审美:
说到拉黑,之前的即刻链接里,写出了我的部分经历。这些经历概括起来可以这么说:
往往以高期待值认识“朋友”,但最后却因为种种原因,以拉黑结束。
往往现实中,那些好看的女性要不是名花有主,要不就是在某些方面,令我费解,要不就是很容易建立防线,令我难以靠近。
当然,分寸感也是部分原因。
于是从某种程度上说,二次元游戏,是“和异性对话的最快方式”,而不是聊微信,因为微信可以被拉黑,same 也是。
当然,也有遇到让我比较温暖的朋友。
same App 几乎陪伴了我整个大学时光,我在的这篇文章中进行讲述:same,认识了她,认识了自我
现实来说,大部分在校的时间或者“除了在家之外”,就都是一个人了。那段时间经常在相应频道发帖。
同样地,就像我之前经常喜欢自己扫街一般,走遍了南京城的大街小巷,但也为此花费了折算一下也有半年的时间,也会上传到各类平台[6]。
在上一次,还记得那个在 same 遇到的她,那时候我还在上大学。某一天我在附近学校(南京航空航天大学金城学院)的小吃街上准备回到宿舍的时候,她在聊天记录问我,
今天怎么这么甜。
这段时光,是我大学时光中比较开心的日子。我还依稀记得,那时我在和当时的同学一起讨论着我当时的设计——即使现在这位同学也已经因为某种原因导致删除了我的微信。
说到发帖,可以说是我在网络上寻求共鸣的重要途径。
从早期的百度贴吧,到现在的大厂乐乎,从 same 到即刻,从 7cups 到 Taptalk ,从微信到 discord……
在《新周刊》里有一期专门讲的论坛,标题我记得很清楚:“没有青春不散场”。
到现在这些人点踩,是什么心态,现在都不重要了。
哦对了,开心的是我还利用视频的形式,和胡桃一起跨年,觉得视频有趣的话,欢迎一键三连哦。
其实也不算纸片人,毕竟七濑胡桃,这位“可爱的表情包少女”也是有着原型的:NanaseKurumi。
但当我经过搜索后发现,这是一位日本画师 Pomu 的虚拟形象。
这款游戏其实也为“表情包”变游戏的思路,进行了一定的扩展,为后来者进行参考。
自然,我也关注了微博等社交平台,毕竟自己平日里运营微博,自己的播客也会关注这些内容,寻找嘉宾。
在这里写产品结构,似乎我确实是想证明什么,并且也在考虑能不能留下点什么。
在群里,小我几年的群主问我,我为什么要画思维导图,以下是我的答案[7]:
作为产品助理与产品运营,当然希望利用专长,在自己喜欢的领域,留下点痕迹。
胡桃日记产品功能图(飞书云文档),由于时间与游戏进度的关系,目前内容可能不是很全面,如果你是游戏的玩家,欢迎你的共创。
“羁绊之语”内容表格:羁绊之语[腾讯文档](https://link.zhihu.com/?target=https%3A//docs.qq.com/sheet/DVFVmeFBtT2dxWlVs,欢迎加入共创。
感谢QQ用户“為這爛片般的生活獻上爆炸”协同制作。
在这里我提出这个观点:游戏的先进性,其实是粘性。
……
当“21天”概念[8]达成之后,如果消失,这样得管也是很难改的,似乎只能寻找替代品。
曾几何时,手账也是很多人喜爱,小红薯上也有许多教程。胡桃日记加入了手账的元素,也是吸引我了解手账,入门的渠道之一。
只是冲着游戏而了解胡桃日记,既然得知停服了,这样的先入为主,也使得我对腾讯有了不太好的印象,前者已经有微信产品的难用,以及腾讯文档的会员功能,我对此也发了动态。
最后,我提出创建了这个粉丝群。
在群里:
我加入的官方群,从数据看,大都是未成年,似乎只有我是25岁,相较而言比她们都大。
没想到的是,还有一位同行竞品的朋友玩这个。
有人说:
第一次遇到喜欢的游戏停服想把所有东西都录下来 我想把所有剧情文字用视频录下来,不知道20G够不够
不太好说 东京图相册录到第四章宠物篇是3.77GB 羁绊物语零零散散加起来2.82GB 庭院的零零散散的差不多6.81GB
我在一刻相册里的共享相册《胡桃日记》,欢迎你上传你的截图照片;
QQ群搜索关键词,加入群”我们的七濑胡桃“。
其实,放置类养成,我玩的并不多,除了之前很火的《旅行青蛙》和《月兔漫游》之外,也只有胡桃日记了。
当原神的“胡桃”这一角色出来之后,我觉得对于七濑胡桃的慰藉,就是:字体一样,发音相同。
我利用播客和文章,也许是一种对停服游戏的怀念方式之一吧。
其实,我也玩过不少游戏。
《西奥小镇》:当时我在制作全流程解决方案图,所以那时我在找关于2.5D形状的参考,所以我也通过游戏,一边娱乐,一边进行生产的参考;
在学影视动漫的时候,我也喜欢《shadowmatic》……
但是都没有一个像七濑胡桃这样,如此具体地,融进我的生活的。 和《奇迹暖暖》一样,游戏里也可以为她换装,看到不同的她:
好的东西是不是都留不住? 就类似锤子手机,他有着较好的UI,便捷的一步,可惜最后因为亏钱的原因,导致最后在当今996的状态下,遵守劳动法(来源),已经难以见到到他的身影。
虽然在今天,被爆出锤子科技的投资人真刚说他“跪舔美元基金”,“不懂得感恩”等。 (来源
后面,我也许会玩类似的游戏,寄希望于可以同样换装,也同样是异性。今天原本打算下暗区突围,想到腾讯的游戏,级别再高,想到最后的可能性(也许还是因为策划的骚操作而令很多人退游),也毕竟是TX,且玩且珍惜。
在 TapTap 以及我总结的产品架构图来说,该游戏涉及到了换装,剧情,养成,烧烤,种植,相关人员与模块成本也不小。
于是在一天晚上,我写了一个问卷,于是在微博进行宣传,如果你身边也有这样的玩家,也欢迎将这个问卷分享给 Ta ,在2023年1月8日下午,一起聊聊和胡桃的故事。
即使胡桃日记会停服,但是这个角色依旧属于我生活的一部分。像是在耳边说,“你回来啦”。
最后,也有朋友在做单机版,胡桃依旧存在我的PC里。
这也是一个邀请,邀请大家愿意来参与这一期播客录制的朋友们,在这里留下自己对胡桃的声音。
了解播客《闲聊PST》:我的输出(推荐)
如果你没有时间参加但依旧希望表达,可以将自己的声音寄到这个邮箱。
这期播客将在2月15日停服前剪辑完毕,届时将会于《闲聊PST》的微博中进行宣发。
大家敬请期待。
本文同步发表于
以下是我遇到的问题以及回答与做法。
最近又折腾内存测试与一些现象,在这里进行记录。
因为在我之前的两份工作中[1]使用FTP软件/SMB进行远程服务器的链接,于是便对这方面开始产生了印象。
**RAID:**存储池
是否有必要做RAID?如果一个硬盘出现了故障,更换新的硬盘就可以自动出现旧内容
举例:双盘位做RAID时,两个盘加起来总共为一个盘的容量,但读写速度快。
如何做RAID?
创建-新增-存储池
**QC:**群晖的QuickConnect
Synology Assistant:群晖的NAS助手,在这里下载。
因为预算有限,我购买的是群晖DS218play。
下图为我安装过程的图片。
存储管理器-存储空间的后台优化进程,等此过程结束后,我再进行使用。
优化完成后,会显示状态良好,在DS Moblie中也可以查看进程。
我购买NAS,最重要的目的就是存储我全部的文件了。同时,也可以远程访问这些文件,随用随取。
网上大都说,给小姐姐小哥哥安个家,这当然是“都懂”的说法。
使用外网访问,需使用以下两种方法(可选其一或多选):
不同文件夹之间的关联:
home:每个用户都有一个home文件夹,默认主账号也有一个home文件夹。个人内容可保存在home中。
homes:对应账户个人文件夹的镜像,数据并不会同时保存2份,所以也并不会占用存储容量。
home-drive:相当于nas的云盘。
在控制面板-共享文件夹内创建的全部为共享文件夹。
因为考虑到家里节省电表,于是在闲时决定采取定时开关机的做法。
作为自己的私人文件库,数据安全必须保证:
除了NAS,还推荐UPS。
上HTTPS是必须,不可暴露到公网:如何强制DSM桌面使用HTTPS连接? - Synology 知识中心
看到部分教程使用申请官方域名/腾讯云/阿里云SSL证书,目前未确定。
根据自己需求做RAID。
在第一段中,由全球站转移到中国区时,需要绑定手机号方可使用QC功能。于是我愣了一下,还是验证了。
我在[个人信息保护声明](法律文件 | 群晖科技 Synology Inc.)中看到以下条文说明:
保存期限
Synology 保留您个人信息的期限不会超过因指定目的处理您数据所需的合理时间。如果您将同意我方或已经同意我方处理您的数据,我方处理您数据的期限不会超过您同意的有效期。尽管有上述规定,我方可能会按照适用法律法规的规定而保留您的个人信息,例如协助任何政府和司法调查,以提出或维护法律主张,或用于民事、刑事或行政诉讼,在此保留期间,我方会采取必要的安全保护措施,且不会将该个人信息用于其他用途。如果我方不符合保留您数据的上述条件,我方将以安全的方式删除和处理您的数据。
…
Synology **不会访问(或使用)**用户上传到其 Synology 设备的文件。
双盘是否有必要做NAS?在下方,我参考了一些链接。
以下是我折腾群晖NAS的出现的情况,与下方记录。
同一局域网
不同设备出现无法连接状况。
现象:
可能需要检查一下Wi-Fi与路由器设置,我关闭了防火墙,问题依旧。
出现的问题
如下图所示,会无法出现相关文件夹,尚无解。
继续摸索ing。如果您知道这个答案,也欢迎在评论区留言,一起交流。
感谢即友:NNOUU.bit、敖特、岩鸣杨子、哥飞的反馈与帮助,排名不分先后。
现象:无法跑内存测试:在Windows设备中下载助手,输入账号后结果直接认证完成,无法进入下一步。
解决:下载macOS客户端,即成功跑测试。
下载中心 - DS218play | Synology 群晖科技
通过V2EX的一个帖子了解到。
解决:
更多的踩坑,后续会在一篇文章中继续更新,链接此处后补。
接下来,我会研究以下事宜:
入门相关:
入门NAS?一篇就够了!真正给小白看的NAS科普篇——NAS是什么?你真的需要NAS吗?
群晖NAS从入门到精通,DS918+ NAS:目前最适合家用的四盘位NAS深度体验!告别小白!什么值得买
小白的 NAS入门碎碎念,家用NAS真香… 好像无意中安装了一个不得了的神仙套件 - 知乎
RAID:
个人4盘位NAS,用什么RAID比较合适,为什么? - 知乎
NAS 篇一:NAS究竟需不需要RAID??万兆网络下NAS读取写入实测_什么值得买
文件:
可能是精神上求职的疲惫,所反映出的生理上的不适:睡觉盗汗、扁脑体发炎(以及没有流涕的感冒)。
现在是2月14日情人节,上午3时32分,关于我晚上出盗汗这件事,估计已经有十几天了——只要一出门就会出盗汗。
说来也许是因为在苏州的不规律生活——当然我也非常希望可以有份稳定的工作,上班下班,就如同我之前在助残公益园那样。
或许回到了苏州,有了自己的规划,这一切可能也不会变得更差更糟——
写到这里,我打了一个喷嚏。
截至目前,我的喉咙在咽口水的时候依旧有疼痛,昨晚刷完牙后喝了麦片。感觉还是挺好的——希望一觉睡过之后说话就正常,没想到出现了如文首所述的那样。
截至目前,那现在就从最近的事开始写吧。这也是一个一月半总结。
关于输出:
和家人:
和朋友
关于我的硬件设备
关于面试
我昨晚在研究Obsidian。
就如我之前从OneNote迁移到Jupin一样,现在从Notion迁移到Obsidian。
按照常理,我昨晚是应当写《入门Obsidian》这篇文章并写写我的使用场景的,以及对于一些人和事我并不像之前那么看重[4],也许是老了,也也许无所谓了。
我今年25岁了,明年26了。快奔3了。同学有的有老婆有孩子了,我FUCKFUCKFUCKFUCKFUCK还单身,但总是在学习与梦想着未来的生活。
Oh.Jesus.
在写开头的时候,脑海里就一直浮现着奈飞里面《Unbeliveble》和《The Gravity》里面美国人的工作神情,就感觉自己也非常的相似。
我觉得有的时候我们做事确实也需要这么随性,但做事的时候那种状态其实谈不上“醉酒”,也谈不上“晕乎乎”,只是把自己所谓“想做的”以及“想说的”给写出来、做出来,仅此而已。
本篇文章也许会在之后回笼觉睡醒之后,有更加理性的清晰的删改。请勿期待。
撰写本文,希望警戒自己不再为一个可以使用其他方式与设备实现的需求,投入更多的精力和代价,不再为心里的匮乏而使用物质来满足,且一切使用物质填充内心而无法使用其赚钱的行为都是耍流氓。
经历过白色T1工业设计的方正,目前在我旁边的抽屉里;
Pro2伴随着我在北京,初步实现了我开发地图类工具App的想法并用于实践[1],最后因主板发霉后非本色而售卖;
Pro3因当时没有白色版而冲动消费,最后售卖…
为了提高工作效率(误),作为一名“曾以为”自己会成为文字工作者(或作为新媒体已经成为)、传媒公司摄录剪辑视频的视频媒体人,加上对“效率三大件“的占有欲,我再一次购买坚果设备。
这也是我第一次在外租房,将消费花在手机上[2]。
这部坚果R2,帮给了我多少忙?实际使用起来体验感觉如何?
它所匹配的TNT go,对我而言是否是真正的刚需?
这是一篇将手机作为效率工具的角度的硬件评测。
如果老罗没有回来继续做手机,这也许是我最后一次购买坚果手机。
这一次与之前的“心心念念”一样。在数码交流群,我多次发送价格的图片,也咨询了一些众测师,是否有必要购入这部手机。
最终的原因,可能因为工作。但它帮了我多少呢,我用它产生了多少价值?
观望后,终于在7月底,我下了决心。
拿到R2,根据舆论的”要求“:首先检查屏幕,确认无误可激活[3]。因为已经出现关于品控问题的讨论,我觉得这部4月份的机器尚可,便开始激活。
提示:下方是开箱视频/链接,您如果不在Wi-Fi环境下可直接查看照片。
https://www.bilibili.com/video/BV1ih411B7iK
这是我非常简单的开箱视频。
坚果的曲面,可以叫做微曲面。
这种曲面没有华为 P40 那么曲那么潮,是完全的左右两侧的曲面,同时也带有曲面的特色。
根据我的使用实操来说,微曲面和三大金刚键使用起来很趁手,也感觉金刚键是为了弥补无法滑动的左上角。
这种屏幕给我的第一观感是“我跟上了潮流”,手机的料很足,不少友友都吐槽手机很重,两百多克;
第二感觉则是大:相比我的iPhone11来说。这种大,结合着一步,没有浪费屏幕的尺寸(一步的顶端除外)。
但这种大在我做周报表格的时候发觉:“或许只是一步很好用,遇到了TNT”,其实手机还是捉襟见肘。
正可谓:“专业的设备做专业的事”,但是好的是对于复制粘贴与跨应用传递数据来说,一步确实提高了效率。
目前使用坚果手机作为出行机器的近一个月,我已经适应了使用WPS和一步与应用的配合。
主要是效率三大件(一步、闪念胶囊和大爆炸),为我完成工作提供了便捷。
这也是我对于这份工作来说的回顾之一,一步功能着实在我的工作生活中帮助了我很多。
我目前的周报是公益项目,由于对格式的要求较高,我使用手机进行内容的快捷复制,更多的格式调整则必须在电脑上完成。我有相应且充足的计算机,所以不可能购买 TNT go。
出于演示与保护工作资料,我新建了文档进行示范。
使用 WPS Lite
使用 WPS Lite,以下复制到表格的操作均可由一步完成:
鉴于一步目前的缺陷以及6.7寸的屏幕无法企及表格的全部内容(例如需要频繁的增删单元格),故使用过程中需重复打开WPS Lite、相应网站需点开复制标题(不支持一步),这样的时间几乎是补足了一步节省下来的时间。
目前看这部手机给我工作上较大的效率提升,要数收集新闻链接。
通常需要将微信群里的公司有关新闻链接进行汇总,使用一步功能,可快速地将连接的标题拖拽到文档相应的光标处。
即使如此,在手机上操作仍然存在一些格式问题,目前使用的相应功能仅是“加粗”、“格式刷”,要想新增或合并单元格、修改单元格底色等操作,还是得在我的计算机上操作。
iOS自带的视频播放器并不具备下载功能,所以使用 Android 做公众号视频下载。
R2 外出,我携带此手机参与一项会议,开启时间胶囊功能。
根据图片附件实测,一次发送微信多张图片,电脑接收,效率更高。
由于并不需要录音等其他功能,目前仅用图片附件的形式保存。
因内容涉及会议内容,截图就不发出了。
目前,我也在发掘以上功能在我的生活里不同场景下的更多用法。
坚果 R2,可能也是 TNT 的绝唱。在工作中,我当然会使用 TNT 的功能为我的工作做过提升,即使是更好的应用浏览体验。
我将常用的应用放在 dock 栏,在上一家公司时,尝试将微信接收文件的文件夹放在桌面[4],不方便重命名,且仅保留十分钟之内的会话与布局,故现无实践。
由于未更新系统,故系统浏览器的插件功能,我使用火狐浏览器代替。
而 TNT ,我除了会用来浏览报纸外,偶尔我也会用来安装平板版的 HD 软件,查看设计布局,体验平板应用。
由于公司电脑,无法进行触摸,所以我便无法使用剪映进行新闻小视频的剪辑,如果我有了 TNT go,或许这将是一个完整的工作流:
目前,在公司的 TNT 体验已丧失,可能是因为主机的网卡老化,导致无法连接 Wi-Fi 了。
还好,我的 Surface Go 依旧可以使用 TNT ,以下分别是在我的电脑和办公室电脑(即刻动态)的照片:
当发布会上说剪映适配了TNT后,自己第一反应当然是找来安装。使用键盘上的windows+上键,即可进入全屏模式,若是触屏,直接操作即可。
如上图动态所示,我使用了之前屏幕录屏视频作为素材,由于办公室计算机无法触摸,使用鼠标有所延迟。
最近,坚果手机官方开始推送Android11的众测版本,据不少用户反应仅修改了底层,并无新功能。不仅如此,还砍掉了手指切换横竖屏功能。
什么是手指切换横竖屏功能?以下是官方的解释:
如果是备用机,我似乎会毫不犹豫的升级Android 11,但作为双持,且主力之一的R2,还是先观望一段时间,再进行更新。
关于R3,最近群里又传出了锤子要回来的传闻。
诚然,新科技确实好,对于我这样一个产品党来说,依旧会去顺电进行深度体验,同时对于在外漂泊的人来说,购买还得靠相应的购买力。而效率工具,对于工作的人来说,利用好仅它的小功能,利用好所自带的价值,则更有意义。
为懂得这个道理,我因此而“浪费”了不少软妹币。远超过拥有其的意义,远超过填补内心的一种行为。
我将Phone作为出行日常的收付款、追求稳定且必要应用、摄影机以及饿了么获得吃货豆15秒的专用机器。因为工作原因,现在已经很少进行应用的体验了,而不那么追求稳定的应用、工作需求,我使用R2。
即便如此,不可避免的是手机没电等日常情况。在即刻上我写道:
作为iOS和Android双持党,
想力争稳定,将支付相关装在iPhone上,结果由于国内生态环境,微信无法扫描永安行的二维码,下载了App之后还必须下载支付宝,幻想破灭……
出来骑行吃个饭就辣么难……
他们分别在防晒服左右两个口袋,分别是两个手机:一个通勤刷卡,一个看工作群。有了Wi-Fi后,他们都活起来了。
写到这,我无疑最应当做的事就是将我之前的Pro3一直留到现在而不是出掉它,但当时如果不出,则闲置在家里落灰。
算是一个恋物癖吧,看到R1的截图则很希望拥有,R2莫过于此。
日后,希望我的辛苦钱,可以花在真正的“刀口”上,可以助力我完善Android基础与iOS和前端基础,完成我的App开发。
工具仅是工具,购买工具,也是为了更好进行文章的输出与工作中效率上的提升,起初是因为手里的 T1 在下载微信小视频时显得捉襟见肘,也因为iOS无法下载这样的视频[5]。
诚然,说得再多,想花钱,这一切都不是理由,也不需要理由。
每当看到工作群的角标变成十几,我便习惯性的打开一步,打开WPS Lite与微信、工作群、多条转发聊天记录,长按标题拖拽至文档相应的光标处。
当然,我再也没有使用 TNT 去浏览引力播,查找与周报有关的新闻。
在撰写本文时,已经超过了30天无忧退的时机。
其实所有的过错,都在于人,工具只能是起到辅助的作用,它的出现,并没有对错。
现在看,它也许并没有陪着我的必要,可能我的这份工作,也会因为人的原因难以持续下去;但在下一次工作或是我的自由职业生涯,也需要一部Android手机,便于做一些操作。
原标题:坚果R2:可能是我最后一部锤子手机
本篇文章同步发表于:微信公众号 |头条号| 少数派 | PMCAFF |知乎|糖纸众测
按照威锋网的一个帖子进行操作,本帖为我的踩坑贴汇总。
使用pip3 install -r requirements.txt
进行安装
Requirement already satisfied: six==1.13.0 in /Library/Python/3.8/site-packages (from -r requirements.txt (line 10)) (1.13.0)Building wheels for collected packages: bsdiff4, pyusbBuilding wheel for bsdiff4 (setup.py) ... errorERROR: Command errored out with exit status 1:command: /Library/Developer/CommandLineTools/usr/bin/python3 -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/53/1v8ykf513138zrvp2th76l640000gn/T/pip-install-bhzlo3bb/bsdiff4_cc62a057fa494a5b92e99f21441ab6d2/setup.py'"'"'; __file__='"'"'/private/var/folders/53/1v8ykf513138zrvp2th76l640000gn/T/pip-install-bhzlo3bb/bsdiff4_cc62a057fa494a5b92e99f21441ab6d2/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /private/var/folders/53/1v8ykf513138zrvp2th76l640000gn/T/pip-wheel-pm9ph9rp cwd: /private/var/folders/53/1v8ykf513138zrvp2th76l640000gn/T/pip-install-bhzlo3bb/bsdiff4_cc62a057fa494a5b92e99f21441ab6d2/ Complete output (114 lines): running bdist_wheel running build running build_py creating build creating build/lib.macosx-10.14.6-x86_64-3.8 creating build/lib.macosx-10.14.6-x86_64-3.8/bsdiff4 copying bsdiff4/test_all.py -> build/lib.macosx-10.14.6-x86_64-3.8/bsdiff4 copying bsdiff4/__init__.py -> build/lib.macosx-10.14.6-x86_64-3.8/bsdiff4 copying bsdiff4/format.py -> build/lib.macosx-10.14.6-x86_64-3.8/bsdiff4 copying bsdiff4/cli.py -> build/lib.macosx-10.14.6-x86_64-3.8/bsdiff4 running build_ext building 'bsdiff4.core' extension creating build/temp.macosx-10.14.6-x86_64-3.8 creating build/temp.macosx-10.14.6-x86_64-3.8/bsdiff4 clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -iwithsysroot/System/Library/Frameworks/System.framework/PrivateHeaders -iwithsysroot/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/Headers -arch arm64 -arch x86_64 -I/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/include/python3.8 -c bsdiff4/core.c -o build/temp.macosx-10.14.6-x86_64-3.8/bsdiff4/core.o In file included from bsdiff4/core.c:9: In file included from /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/include/python3.8/Python.h:11: In file included from /Library/Developer/CommandLineTools/usr/lib/clang/12.0.0/include/limits.h:21: In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/limits.h:63: /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/cdefs.h:807:2: error: Unsupported architecture \#error Unsupported architecture ^ In file included from bsdiff4/core.c:9: In file included from /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/include/python3.8/Python.h:11: In file included from /Library/Developer/CommandLineTools/usr/lib/clang/12.0.0/include/limits.h:21: In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/limits.h:64: /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/machine/limits.h:8:2: error: architecture not supported \#error architecture not supported ^ In file included from bsdiff4/core.c:9: In file included from /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/include/python3.8/Python.h:25: In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdio.h:64: In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/_stdio.h:71: In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/_types.h:27: In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:33: /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/machine/_types.h:34:2: error: architecture not supported \#error architecture not supported ^ In file included from bsdiff4/core.c:9: In file included from /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/include/python3.8/Python.h:25: In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdio.h:64: In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/_stdio.h:71: In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/_types.h:27: /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:55:9: error: unknown type name '__int64_t' typedef __int64_t __darwin_blkcnt_t; /* total blocks */ ^ /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:56:9: error: unknown type name '__int32_t'; did you mean '__int128_t'? typedef __int32_t __darwin_blksize_t; /* preferred block size */ ^ note: '__int128_t' declared here /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:57:9: error: unknown type name '__int32_t'; did you mean '__int128_t'? typedef __int32_t __darwin_dev_t; /* dev_t */ ^ note: '__int128_t' declared here /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:60:9: error: unknown type name '__uint32_t'; did you mean '__uint128_t'? typedef __uint32_t __darwin_gid_t; /* [???] process and group IDs */ ^ note: '__uint128_t' declared here /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:61:9: error: unknown type name '__uint32_t'; did you mean '__uint128_t'? typedef __uint32_t __darwin_id_t; /* [XSI] pid_t, uid_t, or gid_t*/ ^ note: '__uint128_t' declared here /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:62:9: error: unknown type name '__uint64_t' typedef __uint64_t __darwin_ino64_t; /* [???] Used for 64 bit inodes */ ^ /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:68:9: error: unknown type name '__darwin_natural_t' typedef __darwin_natural_t __darwin_mach_port_name_t; /* Used by mach */ ^ /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:70:9: error: unknown type name '__uint16_t'; did you mean '__uint128_t'? typedef __uint16_t __darwin_mode_t; /* [???] Some file attributes */ ^ note: '__uint128_t' declared here /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:71:9: error: unknown type name '__int64_t' typedef __int64_t __darwin_off_t; /* [???] Used for file sizes */ ^ /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:72:9: error: unknown type name '__int32_t'; did you mean '__int128_t'? typedef __int32_t __darwin_pid_t; /* [???] process and group IDs */ ^ note: '__int128_t' declared here /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:73:9: error: unknown type name '__uint32_t'; did you mean '__uint128_t'? typedef __uint32_t __darwin_sigset_t; /* [???] signal set */ ^ note: '__uint128_t' declared here /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:74:9: error: unknown type name '__int32_t'; did you mean '__int128_t'? typedef __int32_t __darwin_suseconds_t; /* [???] microseconds */ ^ note: '__int128_t' declared here /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:75:9: error: unknown type name '__uint32_t'; did you mean '__uint128_t'? typedef __uint32_t __darwin_uid_t; /* [???] user IDs */ ^ note: '__uint128_t' declared here /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:76:9: error: unknown type name '__uint32_t'; did you mean '__uint128_t'? typedef __uint32_t __darwin_useconds_t; /* [???] microseconds */ ^ note: '__uint128_t' declared here In file included from bsdiff4/core.c:9: In file included from /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/include/python3.8/Python.h:25: In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdio.h:64: In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/_stdio.h:71: /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/_types.h:43:9: error: unknown type name '__uint32_t'; did you mean '__uint128_t'? typedef __uint32_t __darwin_wctype_t; ^ note: '__uint128_t' declared here In file included from bsdiff4/core.c:9: In file included from /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/include/python3.8/Python.h:25: In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdio.h:64: In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/_stdio.h:75: In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_va_list.h:31: /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/machine/types.h:37:2: error: architecture not supported \#error architecture not supported ^ fatal error: too many errors emitted, stopping now [-ferror-limit=] 20 errors generated. error: command 'clang' failed with exit status 1 ... Check the logs for full command output.
首个踩坑:
WARNING: The directory '/Users/xxx/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
参考:What is the meaning of “Failed building wheel for X” in pip install?
使用pip3 -v
,可见有pip3使用:pip install wheel,出现下列问题:
参考:zsh command cannot found pip
要点:创建pip3环境变量
查找pip3的路径:pip3 -V
创建alias:alias pip=/usr/bin/pip3
放在zshrc内,之后source ~/.zshrc
。
在更新pip时,版本从19-21,报出权限问题:[1]
Consider using the `--user` option or check the permissions.
参考:Could not install packages due to an EnvironmentError: Errno 13
使用pip3 install package_name --user
更新pip,成功。
参考GitHub issue:Running setup.py install for bsdiff4 … error
–user应该放在后面,添加zchrc,当然之后也要source:
export ARCHFLAGS="-arch x86_64"python3 -m pip install --user -r requirements.txt
使用以下命令安装成功:
python3 -m pip install --user -r requirements.txt
结果:
Requirement already satisfied: six==1.13.0 in /Library/Python/3.8/site-packages (from -r requirements.txt (line 10)) (1.13.0)Building wheels for collected packages: bsdiff4 Building wheel for bsdiff4 (setup.py) ... done Created wheel for bsdiff4: filename=bsdiff4-1.1.9-cp38-cp38-macosx_10_14_6_x86_64.whl size=12710 sha256=fe15fdacfe95ad6a085f38ac34c501937a582d632191b4053ede8afc76f0c938 Stored in directory: /Users/penghaoxiong/Library/Caches/pip/wheels/94/a6/ac/6d5b7fdb7c73297adee2e9f7181664b33234cecfd1eb34280cSuccessfully built bsdiff4Installing collected packages: bsdiff4 WARNING: The scripts bsdiff4 and bspatch4 are installed in '/Users/penghaoxiong/Library/Python/3.8/bin' which is not on PATH. Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.Successfully installed bsdiff4-1.1.9
在终端中输入CatalinaFix.sh
,使用打开方式无效。
参考:iPad mini2 Vieux降级ios10.3.3 问题解决合集
需要安装usbilb:brew install libusb
当前(2021年7月)下载,可能会提示:
Starting iBSS/iBEC patchingLooks like you are downgrading an iPad Mini 2 to 10.3.3!Patched iBSS/iBECAbout to re-build IPSWEntering PWNREC mode...Getting SHSH...Restoring...Note that errors about 'BbSkeyId', 'FDR Client', 'BasebandFirmware Node' and 'ERROR: zip_name_locate: Firmware/all_flash/manifest' are not important.Just ignore them and only report errors that actually stop the restore.Restoring without a baseband as your iPad4,4 doesn't have cellular capabilities...WARNING: Unable to find BbChipID nodeWARNING: Unable to find BbChipID nodeFiles cleaned.Finished! Enjoy your downgraded device :)penghaoxiong@PenghaoXiongs-MacBook-Pro Vieux-master %
便降级成功了。
Choose an IPSW for the iPad Mini 2 (WiFi)
此处由于安装完brew的python3之后总结,故报错信息不完整,但意思还是到了。 ↩︎
已经撤下部分关于博主真实心境(到现在我说话还是这么含蓄,该改改了)相关的“丧”主题的历史心理活动文章。
由于在现实社会中,所谓“诚实”,需要对身边的人诚实,但是在社会上,有些时候确实不能诚实——
有时候人与人之间要对刚认识的同性或者是异性保持好感,要保护自己的利益,要这要那过于复杂。否则,便是失去回忆或是离开。
这样的社会环境下,很难做到做一个简简单单的人,被迫失去初心,变得多面化。
通常,我会和其他的程序员、产品经理 一样,将自己的个人思考放在简历中 ,作为我输出的证明。但因生活和我的个人经历情况并没有多么的顺利、值得宣扬,且随性、自由、焦虑、“丧“对于求职的HR、还是领导而言,在这样的大环境下这些并不是什么“值得被看重”的特质[1],更多的还是需要服从。
所以,正如本文概述所说,博客日后仅输出思考与技术相关文章。
在很早的时候,我会将我的真实生活动态在博客当中撰写,为了获得那么一丁点反馈,就发出自己的声音,在互联网的汪洋里。
同时在现实生活中,当认识一个人的时候,我就会展示自己的博客,自己输出过的内容。
当然,这也就意味着输出过的一切都展现在他人的面前。
same里有一句我经常引用在我博客里的话:
别人稍微一理你,你就敞开心扉,这就是孤独。
很多人,完全就是看一个热闹,而并不是真正的想了解你——毕竟他们有自己的朋友圈,自己的圈子。
有的人,或许就是想笑话。
无法预测读者的心态,但我相信目前为止给我留言的读者都是很友好的那一类人,在此感谢你们。
就像最近接到军训时认识的前同学,打电话来问有没有时间帮个忙挣一点外快一样。
最后他说:
我们也就是一面之缘,不好意思打扰到你,你也有自己的生活,自己的人际,自己的圈子。
按照我以前来说,我不理解,同学之间就该友好的互相帮助[2]。
现在,我有点理解。
因为,这就是人与人之间的界限,这就是另一个在我博客里出现的“同性”对我所说的“分寸感”。
熬夜聊天,也是我希望和人可以有结果。
现实的经历,或许是我还不够好,或许是对方特别势利,导致一些丧失,使我对”熬夜却伤自己身体,但为对方考虑“这样的行为感到自责。
网络社会的一些话是极度不负责任的:
叫你早睡的人,不如一个陪你熬夜的人。
我陪她熬夜了,结果呢?
最后要不自己身体熬坏,要不聊天窗口早就是一个红色的感叹号,要不就是被割韭菜。
没有结果,不值得。
早点睡比什么都强。
网络并不是法外之地,那些自己真正想说的,还是写给自己看吧。
Nexus 5X有虚焊(bootloop)的问题,Pixel有无法连接上网络的问题。
Nexus 5X挂上了闲鱼后较为顺利的卖出后,我寄期望于后者,开始回退Android 10。
有人脸识别,主菜单还有近期/预测应用等功能。
为了连接上Wi-Fi使用基础的手机功能,这也是我不得已而牺牲更多的体验。
整个过程很简单,需要下载相应的官方包:Factory Images for Nexus and Pixel Devices
之后将手机连接电脑,开启USB调试。
官方提供了网页上的Android Flash Tool,很遗憾在Device requirements页面看到,不支持Pixel 1。
于是得通过adb命令进行降级。
两个系统相同的platform-tools文件夹,这个文件夹则是Android SDK必须的文件。
之前使用Surface Go时,可以使用PowerShell,使用管理员权限打开,在文件夹内进行操作。(如果是PS,则需要添加./adb
)
在macOS上,则使用终端,cd定位到安全的platform-tools所在路径。
安装调试桥
如果安装了Android Studio,偏好设置-搜索sdk即可查看路径,添加到终端的环境变量中。
如果没有安装Android Studio,则需要在这个页面下载上述的platform-tools文件。
添加环境变量
此处仅声明在Mac上的方法:
.bash_profile
文件。.zshrc
文件,这两个都是隐藏的。安装后检测adb
adb version
使用adb device
查看是否开启设备调试,如果出现一些字符(设备编号等),则成功。
定位文件与执行flash.sh时,不应当使用双击打开运行,应当使用 路径+flash.sh运行。
我的博客不太清楚确定使用哪一家的图床,之前使用的是sm.ms的服务,由于数据安全性与倾诉欲的丧失,后续的文章可能不会有更多的图片。
由于购买的已经解锁了BL(bootloader),但自己刷好之后还没有使用下列命令锁上:
fastboot flashing lock
在项目中有这样的需求,类似于小鸡辞典小程序的显示用户昵称。
目前使用全局变量来实现,最终会使用其他方式实现。
在这里记录下自己的尝试方案,但目前暂未解决,后续要填补这个坑。
app.js:
App({ onLaunch: function () { } globalData:{ userInfos:null } /*定义全局变量userInfos,为了不与用户信息重叠,加了s*/ })
在获取用户信息的登录页面(假设login.js):
var app = getApp(); //获取全局appPage({ data: { userInfos:'', //定义的全局变量 userInfo:'', //使用新接口获得用户信息的两个方法,此处不展开 hasUserInfo:false, }, getUserProfile(){ wx.getUserProfile({ desc:'请登录', success:(res) => { console.log('获取用户信息成功',res) let userinfos = res.userInfo //登录需要的用户信息 var globalUserInfos = app.globalData.userInfos //全局变量的用户信息 wx.setStorageSync('userinfos', userinfos) this.setData({ userInfos:globalUserInfos, //使用globalUserInfos,目的为了用户信息赋值给全局变量 userInfo:userinfos, //登录需要的用户信息 hasUserInfo:true }) }, fail:(res) => { console.log('获取用户信息失败',res) } }) },
在需要判断用户是否登录的页面(假设commit.js):
var app = getApp(); //获取全局appPage({ data: { userInfos:'', //全局变量的用户信息:问题代码处 username:'', //用户名 }, ...... onLoad: function (options) { //在onload方法中赋值给全局变量userInfos this.setData({ userInfos:app.globalData.userInfos }) }, getUserName(){ this.setData({ username:userInfos.nickName //赋值给用户昵称 }) }, commit(){ if( userInfos = null){ //如果GlobaluserInfo为空,提示需要登录 wx.showModal({ title: '请登录', content: '请登陆后再发表', }else{ const db = wx.cloud.database() db.collection('Sayings').add({ data:{ ... username:GlobaluserInfo //把全局变量赋值给username }, } }) } }
目前报错:userInfos is not defined
]]>于是我开始了重新部署Hexo的征程。
因为时间原因,后续会补上我之前关于电脑修复的文章,首先发表于少数派。
安装首先根据我之前的迁移目录下的文章,之后根据skycrown的知乎回答一步一步走。
关于我的其他Hexo的问题与优化记录,可配合查看:LeanCloud国内版迁移至国际版
Version 9 of Highlight.js has reached EOL and is no longer supported.Please upgrade or ask whatever dependency you are using to upgrade.https://github.com/highlightjs/highlight.js/issues/2877FATAL Something's wrong. Maybe you can find the solution here: https://hexo.io/docs/troubleshooting.htmlNunjucks Error: [Line 70, Column 6] expected name as lookup value, got . ===== Context Dump ===== === (line number probably different from source) === 65 | <pre class="highlight"><code class=""> 66 | {{ 67 | paginator({ 68 | prev_text: '<i class="fa fa-angle-left" aria-label="'+__('accessibility.prev_page')+'"></i>', 69 | next_text: '<i class="fa fa-angle-right" aria-label="'+__('accessibility.next_page')+'"></i>', 70 | ... 71 | }) 72 |
73 | 更新了不蒜子的域名,官方解释在这里。
75 |修改busuanzi-counter.swig
:
安装:
npm i hexo-renderer-swig
hexo c清理缓存,hexo g & s 即可
页脚出现“下一页按钮变成代码”的问题后,修改以下代码后仍直接出现代码:
prev_text: '<i class="fa fa-angle-left" aria-label="'+__('accessibility.prev_page')+'"></i>',next_text: '<i class="fa fa-angle-right" aria-label="'+__('accessibility.next_page')+'"></i>',mid_size: 1, escape: false #增加此行
在音频后期中会遇到各种问题:前期应当调节什么?在细剪阶段又该调节哪些?相信在日后制作播客的过程中都会慢慢加深印象。
如果你有经常用到的功能,欢迎在下方评论留言。
db:分贝
0db:最大容许音量,通常在音轨最上&最下,愈到中间愈小。
注意:一般音量不建议做满,保留“-1db”为安全的做法,这里让我想起了书籍装帧中的3mm的保留”出血线“。
一款免费多平台的音频后期应用,目前来看很多人使用它做降噪处理。
此处为部分常用功能的学习笔记。
Noise Reduction功能:选中噪声-效果-降噪
Noise reduction (dB):这个应该是指把噪声降低多少分贝。取值范围为0-48,默认值为12,应该是指把音量降低到1/4。
Sensitivity:取值范围0-24,默认6。
Frequency smoothing (bands):取值0-12,默认3。这个值越大,频率带越多,也越容易降低信号质量。3个 bands 应该差不多代表着高中低频。
使用场景:录音声音太小/波形平坦
特效(Effect)→增幅(Amplify)
没有问题的情况下,Audacity 会放大选取区的音波;接着将「新的峰值振幅「New Peak Amplitude」设置为「0.0」,不要选到「Allow Clippin」,会影响到结果
使用场景:解决录音因为前后左右是否远离麦克风导致的声音有大有小问题
动态调节声音波形的振幅
效果(Effect)→压缩器(Compressor)
将临界值设定在 -10dB 和 -16dB 之间,即可解决声音忽大忽小问题。
当压缩不够的时候,主播的声音就会让你觉得很生硬,同时也会很刺耳;压缩过量的时候,声音就会变得软塌塌,甚至还会让声音有点闷。不够和过量都是由压缩比例(Ratio)决定。
使用场景:需要更清楚的录音:
一般来说,当低频被提升,同时高频被减少时,录音的内容听起来会更清楚,使你的声音听起来更深刻。
特效(Effect)→ 等化(Equalization)
小技巧:将低频(低于200Hz)调到 10dB 和 20dB 之间,高频(超过4,000Hz)调到 -3dB 和 -6dB 之间,便能呈现出最棒的声音
调节语速:时间与变调-伸缩与变调(处理)
在波形界面快速裁切分段:Ctrl/Command + X
通用概念:
Audicity:
Audition:
论坛:音频应用
]]>不好好研究聊天记录的跨平台,不提及软件的后门与软件数据隐私问题,总是越发的QQ化,逐渐增加各种花哨功能:
添加当前状态、改变浮窗UI,增加表情动效,这也迎来了无意义的表情刷屏潮。
他早就不那么克制了。
因iPhone 11最新系统版本14.3下拉使用Spotlight搜索总不出现Siri建议,导致无法快捷使用部分软件[1],遂迁移主力机至坚果R1。
因坚果R1电池原因出现无法充电现象(其实是数据线的原因),再次迁移回iPhone 11。
本文则对迁移过程中的问题进行记录。
对于需要做”聊天记录迁移“相关的产品朋友,本文也可以作为原型图的设计与参考。
产品的逻辑依旧难以理解。
比较顺利,前提:需要被迁移的手机(Android)上开启热点,iOS链接进行传输,Wi-Fi则会提示网络连接超时。
出现问题,原因:网络环境复杂、未开启相应iOS权限:本地网络。
网络环境复杂的原因:Wi-Fi信号未覆盖到,我的测试环境为家庭阁楼。
使用热点传输
热点是在Android开启,提示:需通过Wi-Fi迁移聊天记录,请开启并连接Wi-Fi。这与“建立个人热点”的操作相悖。
Wi-Fi开启后,Android热点即消失,无解。
Android关闭热点后(此操作待确认)提示:二维码获取失败,请检查网络。
从Android迁移到电脑内,再从电脑恢复到手机,这无疑是增加了用户的使用成本与时间成本,这一点上来说用户体验并不算好。
相关原型图:
于是,我又学习到了新知识,打算去找一个地进行记录。
最近在整理Java的笔记,使用语雀。
我经常和面试的人说:
我使用语雀进行知识的管理与沉淀。
话虽这么说,其实现在看这并不是一个特别专业的知识管理的方法。
作为普通人,一般的Evernote等笔记类应用已经足够,在下文中会提到。
但作为一名开发,且各种团队与协作都附带有“团队Wiki”的一项功能[1],可见“wiki”作为知识管理工具的重要性与专业性。
以及一些面试的职位需求,会搭建Wiki也是一个必要的加分项,这也是我做Wiki的动力之一。
关于我学生时代的阅读与输出,沿用到现在的微Evernote-Instapaper-pocket,之后是Google Keep记录一些书摘[2]。
之后一段时间,我使用joplin几个月,似乎只是因为保护我的数据不被第三方侵入。由于双栏的markdown编辑器,如果TOC很长,则不是很便于查看与增添。
如果使用国内笔记应用:语雀、有道云笔记、为知笔记甚至是微软的OneNote,都不可避免的因为会审核其中的内容,或者被其他用户分享不合法的内容而导致平台整改,自己的全部输出都会消失[3],而并不考虑使用这种方法。
随后,这段时间我的知识管理与技术踩坑几乎都是在我的个人博客里,导致这样也和我的生活经历相结合,其实并不是一个很好的现象。
后来在家的两个月,尝试将Joplin迁移到Notion中,同样是也是因为担心账号被Ban而放弃。
关于知识管理,我参考了参考链接V2的链接,也整理了自己的需求List:
目前最合适的,似乎仅仅是在我的另一个电脑里再次搭建一个Hexo。
DokuWiki的话,PHP语言, 插件丰富,但需要购买网站空间,弃。
Hexo+theme-Wikitten:需要再次搭建一个Hexo,之后可以使用Travis自动构建Hexo到GitHub,但暂不考虑。
OrgMode:一种Emacs的编辑模式,语言需要学习一段时间,但在当下看并不是一个很好的方式,以及他的显示目录[5]特别像Joplin。
知乎:
关于在百度地图上踩的keystore的坑以及解决方案,都在这里一并记录。希望可以节省你的时间。
关于我练手项目的尝试经历,可以查看相关标签中关于地图与音乐的文章:Android开发
场景:2020年7月,我创建过一个Keystore,今日通过如下命令[2]创建keystore,发生错误。
以下的解决方案,其中部分整合了参考链接中的内容与相应软件的命令,我在此对原作者表示感谢。
Android的终端输入:keytool -list -v -keystore debug.keystore
提示:密钥库不存在,但在Mac路径〜/.android/debug.keystore
中,有debug.keystore文件。
在终端使用如下命令重建keystore:
keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000
重建文件,则百度地图后台需要再次提交。
Execution failed for task ‘:app:packageDebug’.
A failure occurred while executing com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable
com.android.ide.common.signing.KeytoolException: Failed to read key AndroidDebugKey from store “/Users/felixxiong/.android/debug.keyst··ore”: keystore password was incorrect
Cause: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
原因:keystore密码错误
场景:在Mac路径〜/.android/debug.keystore
中,有debug.keystore文件,在Android运行时签名报错。
使用以下三个命令可修改keystore参数(其中my.keystore
为复制后的新keystore):
修改密码:keytool -storepasswd -keystore android.keystore
修改别名alias:keytool -changealias -keystore android.keystore -alias my_name -destalias androiddebugkey
修改alias密码:keytool -keypasswd -keystore my.keystore -alias androiddebugkey
目前发现,keystore有PKCS12与SHA256withRSA两种。
尝试修改密码,继续报错:
keytool 错误: java.lang.UnsupportedOperationException: 如果 -storetype 为 PKCS12, 则不支持 -keypasswd 命令
如果 -storetype 为 SHA256withRSA
此处我通过Android Studio - Build - Generate Singed -Bundle / APK创建的keystore。
Warning:JKS 密钥库使用专用格式。建议使用 “keytool -importkeystore -srckeystore debug.keystore -destkeystore debug.keystore -deststoretype pkcs12” 迁移到行业标准格式 PKCS12。
便于复制的命令:
keytool -importkeystore -srckeystore debug.keystore -destkeystore debug.keystore -deststoretype pkcs12
此处经测试,当keystore的type为SHA256withRSA时,可以使用上述三个命令。
如果你使用AS生成过,则可通过log方式查看。
Windows:C:\Users\UserName(当前系统的用户名),AndroidStudioX.X > system > log-idea.log-injected.signing.store
Mac:Terminal- ~/Library/Logs -> AndroidStudioBeta ->idea.log.1 (or any old log number)-injected.signing.store
下载Android-keystore-password-recover,获得jar包,放置在桌面。
创建你所熟悉的密码词表,以txt格式结尾,放置在桌面。
使用字典破解或智能破解方式:
# 字典破解java -jar Android_Keystore_Password_Recover_1.07.jar -m 2 -k "C:\\mykeystore.keystore" -d "passlib.txt"#智能破解java -jar Android_Keystore_Password_Recover_1.07.jar -m 3 -k "C:\\mykeystore.keystore" -d "passlib.txt"# Android_Keystore_Password_Recover_1.07.jar 为软件名称# "C:\\mykeystore.keystore"为keystore路径# "passlib.txt"为你所熟悉的密码词表的txt文档的名称
Exception in thread “main” java.io.FileNotFoundException: Users/felixxiong/Desktop/mykeystore.keystore (No such file or directory)
可能是Mac的文件编写路径错误。
文件在桌面的终端路径写法为:Users/youraccountname/Desktop/xxx.keystore
java.io.IOException: not a JavaKeyStore
后续更新。
如果你有解决方案,欢迎在评论里留言~
参考链接:
[TUT] Change alias passwords of your Android Keystore
Android 找回签名证书Key Alias 和 Key Password
我的其他控件开发实践:TableLayout+Fragment+VP开发实践
OnCheckedChangeListener
接口并重写onCheckedChanged
方法、设定初始值check
Fragment<List>
、使用FragmentManager
、设置适配器FragmentPagerAdapter
OnPageChangeListener
方法、添加适配器与监听addOnPageChangeListener
activity_min.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" <!--设置布局的Radiogroup位置--> tools:context=".MainActivity"> <androidx.viewpager.widget.ViewPager android:id="@+id/mainViewPager" android:layout_width="match_parent" android:layout_gravity="bottom" android:layout_height="0dp" android:layout_weight="1"> </androidx.viewpager.widget.ViewPager> <RadioGroup android:id="@+id/mainRadioGroup" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <RadioButton android:id="@+id/Frag1Btn" android:button="@null" <!--去除原生按钮--> android:text="@string/fragment1" android:layout_width="50dp" android:layout_height="50dp" android:layout_weight="1" android:gravity="center"> </RadioButton> <RadioButton android:id="@+id/Frag2Btn" android:button="@null" android:text="@string/fragment2" android:layout_width="50dp" android:layout_height="50dp" android:layout_weight="1" android:gravity="center"> </RadioButton> <RadioButton android:id="@+id/Frag3Btn" android:button="@null" android:text="@string/fragment3" android:layout_width="50dp" android:layout_height="50dp" android:layout_weight="1" android:gravity="center"> </RadioButton> <RadioButton android:id="@+id/Frag4Btn" android:button="@null" android:text="@string/fragment4" android:layout_width="50dp" android:layout_height="50dp" android:layout_weight="1" android:gravity="center"> </RadioButton> </RadioGroup></LinearLayout>
单个Fragment页面此处省略。
声明:RadioButton、RadioGroup、Fragment、FragmentPagerAdapter(可选)、ViewPager
初始化与添加fragment到集合中(两种写法):
private List<Fragment> fragmentList; fragmentList = new ArrayList<Fragment>() //初始化fragment //实例化mlist数组 frag1 = new Fragment1(); fragOne = new Frag_One(); frag2 = new Fragment2(); fragTwo = new Frag_Two(); frag3 = new Fragment3(); = fragThree = new Frag_Three(); frag4 = new Fragment4(); fragmentList.add(fragOne); fragmentList.add(fragTwo); fragmentList = new ArrayList<>(); fragmentList.add(fragThree); fragmentList.add(frag1); fragmentList.add(frag2); fragmentList.add(frag3); fragmentList.add(frag4);
.add
方法:添加到数组中
定义FragmentManager
创建Fragment适配器,用于显示每一个页面的内容(此处可为外部类或内部类):
MainFragmentPagerAdapter mainFragmentPagerAdapter = new MainFragmentPagerAdapter(getSupportFragmentManager(),fragmentList);
重写三个方法:
public class mainFragmentPagerAdapter extends FragmentPagerAdapter {private List<Fragment> fragmentList;public MainViewPagerAdapter(FragmentManager fragmentManager, List<Fragment> fragmentList) { super(fragmentManager); this.fragmentList = fragmentList;} @Override public Fragment getItem(int position) { //返回每个位置(position)的fragment对象/当前显示的是第几个 return fragmentList.get(position); } @Override public int getCount() { //获得个数 return fragmentList.size(); //返回fragmentlist的个数 }}
RadioGroup.OnpageChangeListener
接口,重写OnCheckedChanged
方法:@Override public void onCheckedChanged(RadioGroup radioGroup, int checkedID) { switch(checkedID) { case R.id.Frag1Btn: viewPager.setCurrentItem(0, true); //此处第二个参数smoothScrool为页面切换动画的启用 case R.id.Frag2Btn: viewPager.setCurrentItem(1, true); case R.id.Frag3Btn: viewPager.setCurrentItem(2, true); case R.id.Frag4Btn: viewPager.setCurrentItem(3, true); default: break; } }
设置radiogroup监听与初始选择:
radioGroup.setOnCheckedChangeListener(this); //设置点击监听radioGroup.check(R.id.Frag1Btn);//设置初始选中按钮
实现ViewPager.OnpageChangeListener
接口,重写其中setOnPageChangeListener
:滑动选择方法
@Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { switch (position) { case 0: radioGroup.check(R.id.Frag1Btn); break; case 1: radioGroup.check(R.id.Frag2Btn); break; case 2: radioGroup.check(R.id.Frag3Btn); break; case 3: radioGroup.check(R.id.Frag4Btn); break; default: break; } } @Override public void onPageScrollStateChanged(int state) { }
设置ViewPager:
mainViewPager.setAdapter(mainViewPagerAdapter);//添加适配器mainViewPager.addOnPageChangeListener(this); //设置viewpager页面监听mainViewPager.setCurrentItem(0); //设置第一个页面
Android ViewPager+RadioGroup+Fragment超高仿微信主界面
使用ViewPager+Fragment+RadioGroup实现类似微信主界面
RadioGroup+ViewPager+Fragment的组合使用
]]>对于自己信奉的“自由信条”,所以在自己做产品的时候,一定要让评论更“自由”。博客产品也是如此。
正好4个月后,我解决了迁移过程中博客无法评论的问题,以及无法展示阅读数量的问题,希望迁移的“来客”可以有所帮助。
2020年12月25日,上线了新版控制台。以下截图为旧版截图,大家看看就好。
首先从华北节点的LeanCloud数据进行导出,开发版不支持转让应用,否则可能更便捷。
之后,查看邮件,会得到带有.tar.gz的压缩文件格式,解压缩之后是多个json文件。
国际版Leancloud入口:https://console.leancloud.app/login.html#/signin,选择国际版
如果你使用的是Valine的评论(下文也会提到),那么需要根据国内版的节点创建Class,如图所示:
根据你的使用场景来创建,我创建的是Comment+Counter:评论与未读计数。
改版后的控制台创建Class需要权限,也可以在国内版的权限中进行设置:
存储-导入导出-输入创建的两个Class的名称,我这里是Comment与Counter,输入两次,选择文件即可。
若未出现绿色导入成功的提示,刷新一下页面,查看结构化数据即可。
我这里还有_User
字段,应该是用来存储用户评论的用户(名)的,也进行导入。
这里根据你创建的Class进行修改,我需要修改两处:
先是评论(Comment):
# Valine.# You can get your appid and appkey from https://leancloud.cn# more info please open https://valine.js.orgvaline: enable: true appid: # your leancloud application appid appkey: # your leancloud application appkey notify: true # mail notifier , https://github.com/xCss/Valine/wiki verify: false # Verification code placeholder: Just go go # comment box placeholder avatar: mm # gravatar style guest_info: nick,mail,link # custom comment header pageSize: 10 # pagination size
之后为访问量(Counter):
# Show number of visitors to each article.# You can visit https://leancloud.cn get AppID and AppKey.leancloud_visitors: enable: true app_id: #<app_id> app_key: #<app_key>
最后hexo g -d
上去,随便找一条最新的博文输入测试数据,之后在控制台进行查看即可。
删除国内版LeanCloud账号,需事先删除创建的应用。
设置-风险监测,可查看当前应用的情况,可结合相应权限进行更改操作。
以下为我修改相应文件的路径,以供参考。
/Users/felixxiong/FelixXiongHexo/themes/next/layout/_partials/pagination.swig
:pagination.swig
/Users/felixxiong/FelixXiongHexo/themes/next/layout/_third-party/comments/valine.swig
:valine.swig
/Users/felixxiong/FelixXiongHexo/themes/next/layout/_third-party/analytics/lean-analytics.swig
:lean-analytics.swig
/Users/felixxiong/FelixXiongHexo/themes/next/layout/_third-party/analytics/busuanzi-counter.swig
:
busuanzi-counter.swig
修改pagination.swig
:
{{ paginator({ prev_text: '<i class="fa fa-angle-left" aria-label="'+__('accessibility.prev_page')+'"></i>', next_text: '<i class="fa fa-angle-right" aria-label="'+__('accessibility.next_page')+'"></i>', ... })
更新了不蒜子的域名,官方解释在这里。
修改busuanzi-counter.swig
:
<script async src="//dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script><script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
Code 401 message Unauthorized
{“code”:401,“message”:“Unauthorized.”}
尝试:
valine.swig
:valine.swig
中的第一条js,只留下Valine.min.js
''
为真实的字符串。结果:使用1、2.2,成功显示之前导入评论。
检查控制台,发现请求仍为leancloud.cn:
尝试:复制lean-analytics.swig
的js代码,成功,参见链接3。
博客也修好了,终于又有可以安心说话的地方了。:)
2:使用 LeanCloud:Hexo博客Next主题添加统计文章阅读量功能
4:Hexo博客使用valine评论系统无效果及终极解决方案
5:hexo+valine评论系统(评论无效+头像不显示问题解决)
]]>至于一直未能加入技术开发行业的原因,本博客将会进行展开,其实也是总所周知的原因。
本篇文章其实挺突然的,从笔记就突然变成了一篇分享出来的博客,记录自己的“重学成长”。
从音乐播放器开始做起。Why MusicPlayer?
其中涉及列表展示,多线程,媒体等等,以及一年前自己开始写了一个较为大而全的项目,其中就有音乐播放器的功能[1]。
本文为第一部分,仅列出将本地音乐显示在列表里的基本步骤,以及把业务逻辑写在fragment中的一些坑。
后续在本文的知识点中,会增加相应链接,跳转到我的笔记[2]中。
Java:javaBean类、遍历(主要为while循环)、泛型、集合(List<>)
Android:
列表:ListView或RecycleView及生成:Adapter、ViewHolder
媒体:ContentProvider、ContentReserver、MediaStore
单个item
注:findViewById相关步骤省略,若音乐的界面写在fragment内,前面需要getView()
[3]。
AndroidManiFest.xml中加入读写权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
编写MusicBean类,(根据单个item
中包含的内容为参考),生成getter与setter方法与构造方法,作为List的泛型对象存在被传入
初始化数据源:MusicBean
List<MusicBean> = new arrayList()
编写适配器:
创建Adapter对象继承自Adapter(根据使用的列表而定)、
创建ViewHolder类继承自ViewHolder(根据使用的列表而定)
并重写三个方法并设置适配器:
3.1. 在ViewHolder里使用itemView与绑定ID对控件进行查找
3.2. 定义Context与List数据源,并使用构造函数传递(为什么?)
public class LocalMusicAdapter extends RecyclerView.Adapter<LocalMusicAdapter.LocalMusicViewHolder> { Context context; List<LocalMusicBean> musicDataBean; public LocalMusicAdapter(Context context, List<LocalMusicBean> musicDataBean) { this.context = context; this.musicDataBean = musicDataBean; }
3.3 创建Adapter对象继承自Adapter:泛型中传入ViewHolder,重写三个方法:
public LocalMusicViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { //创建ViewHolder(对象)并返回,作用:生成与初始化每一个ViewHolder View view = LayoutInflater.from(context).inflate(R.layout.item_music,parent,false); LocalMusicViewHolder holder = new LocalMusicViewHolder(view); return holder; } @Override public void onBindViewHolder(@NonNull LocalMusicViewHolder holder, int position) { //查找并绑定数据展示 LocalMusicBean musicBean = musicDataBean.get(position); //拿到Bean holder.songName.setText(musicBean.getSongName()); holder.artistName.setText(musicBean.getArtistName()); holder.albumName.setText(musicBean.getAlbumName()); } @Override public int getItemCount() { //有多少条目就返回多少条目 return musicDataBean.size(); }
创建布局管理器,设置为何种布局(横向滑动/瀑布流等),使用LinearLayoutManager
并设置
使用ContentResolver-获取本地音乐URL地址
使用Cursor(游标)进行查询(resolver.query()
方法),之后进行遍历
如果将业务逻辑以Fragment的形式写在App项目中:
需考虑应用使用何种导航形式:侧滑菜单/底部Tab/ViewPager+Fragment,以及不同的展现方法。
确定好应用结构之后:
TODO:将fragment放进MainActivty.java
中。
fragment中无法直接调用findViewById与Context。(为什么?)
TODO:什么是context?他在App中开发的作用?
localMusicAdapter = new LocalMusicAdapter(getContext(),musicDataBean);mRecycleView.setAdapter(localMusicAdapter);LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext(),LinearLayoutManager.VERTICAL,false);mRecycleView.setLayoutManager(linearLayoutManager);
由于疫情优化的原因,迁移回Hexo,是必要之举,主要是可以省下交服务器的软妹币。
和之前的文章不同的是,迁移的步骤不多赘述,更多的是说说写博客的心理变化以及感受。
从我在WP里写的的文章来看,其实更多的心境仍旧在“孤寂、工作、疫情”上:
我的第一篇文章《折腾至此,继续沉淀》,直到最近的《安装HomeBrew的两种方法》,其中包含小程序开发、iOS地图开发以及我使用过的硬件回顾等文章,可见我的心依旧是在技术上永不停息;
我的文章《在高淳的公交车上》,到《人性的至暗时刻:我所经历的人际现实》,依旧阐述了我在现实的大环境下勇敢的从产品角度批判社会现实;以及勇敢表达自我,阐述自己的经历(当然是有博得理解的成分),依旧在个人博客里展现自我;
我的文章《在工作中自娱自乐》,到带有密码保护的文章《在雪中的3.5天里》,描绘了我在工作时的所思所想(当然这并不意味着分心),以及工作现实,当然,最近没有更新。
献上一个我最后的”新“博客文章的截图。
在我的第一篇文章里说:
2020年的三月底,我在博客的事情上经历了较多尝试:“历久弥新”的Hexo到WordPress初探(com),到阿里云仅仅是用了半个月后的弃用,现转至现在Vultr主机。
希望不会出现什么问题,否则只会迁移主机,再不行回到之前的静态或直接Joplin——或者,Google Blogger。
经历了些折腾,当前希望自己能在这里安定下来,稳定了。
由此可见,现在的环境里讲讲话有多难,哪怕即使想放是一个社交连接的图标,一个Twitter的卡片。
主要是为了WP愈加丰富的插件,以及愈来愈多丰富的主题,更好的阅读体验(可以在文章里增加各种代码段、甚至是Twitter卡片以及网易云音乐专辑),以及在任意浏览器里的轻击键盘上的“f”,登陆后即可撰写文章的轻盈,选择区块、选择发布时间的几次轻点……
当初在决定是选用阿里云、Vultr还是Degital Ocean时,在反反复复地确定主题使用WordPress自带的主题《二零二零》还是《二零一九》时,花费了约三天的时间。即使现在,这些时间我并不后悔,因为自己喜欢研究这些,即使没想过现在回头了。
这是Hexo官方的迁移教程,如果你也有WordPress迁移至Hexo的需求,希望可以帮到你。
你永远不会知道明天和意外哪个先来[1]:
username@UsernameMacBook-Pro ~ % npm install hexo-migrator-wordpress --save npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142> nice-napi@1.0.2 install /Users/username/node_modules/nice-napi> node-gyp-buildnpm WARN saveError ENOENT: no such file or directory, open '/Users/username/package.json'npm notice created a lockfile as package-lock.json. You should commit this file.npm WARN enoent ENOENT: no such file or directory, open '/Users/username/package.json'npm WARN username No descriptionnpm WARN username No repository field.npm WARN username No README datanpm WARN username No license field.+ hexo-migrator-wordpress@2.0.0added 187 packages from 566 contributors and audited 187 packages in 328.424s7 packages are looking for funding run `npm fund` for detailsfound 0 vulnerabilities
顺着request
的“指示”,查找到了这个issue:
节省下修复npm的时间,直接尝试免费的Google Blogger。
去往Google Blogger之后,那些私密的文章以及曾经有过密码的文章,都会保存在本地,或者开始新的尝试,探索是否有类似的功能。
那些本想大声说出来的话,如果Blogger没有这些Feature,则依旧是仅自己可见。
撰写此篇文章时,正在看网上的Java课,极客时间。如果你也在学习Java或者学习过Java,也欢迎与我进行交流。
正是因为这样的原因,关于Java的技术型博客还尚未成形,可能是由于没有实际Java项目所致[2],而部分知识的笔记,依旧存在于Joplin中。
考虑过撰写博客:关于代码,关于朋友和老同学,关于播客,当然,也关于产品。
原名:从WordPress返回至Hexo
curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
常规网上的方法都是用链接里的文件保存(install.rb)之后执行ruby的方法。
若根据参考链接里的最高赞里的链接进行保存文件:
https://raw.githubusercontent.com/Homebrew/install/master/install
现在此链接已经失效,网页内容为:
#!/usr/bin/rubySTDERR.print <<EOSWarning: The Ruby Homebrew installer is now deprecated and has been rewritten inBash. Please migrate to the following command: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"EOSKernel.exec "/bin/bash", "-c", '/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"'
所以目前保存文件的链接应为:
https://raw.githubusercontent.com/Homebrew/install/master/install.sh
保存了install.rb文件后,终端中进入相应目录(cd),报错:
Traceback (most recent call last):
ruby: no Ruby script found in input (LoadError)
根据我在StarkOverflow上的提问,根据参考链接3中的回答:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
使用此命令即可输入密码并安装。
Homebrew installation on Mac OS X Failed to connect to raw.githubusercontent.com port 443
]]>如文章有误或你的经验分享,欢迎指出与评论。
import Mapkit 与CoreLocation
iOS的权限设置需在info.plist进行设置:
iOS8-10:LocationWhenInUseUsageDescription:应用前台更新位置信息
iOS11+:LocationAlwaysUsageDescription,应用前后台均可获得位置更新信息
若同时希望,则可全部添加,代码检查权限,在下文中提到
注意:业务逻辑若有两个Map,第二个出现“是否保持XX选择“,而不弹出多个选项。
let locationManager = CLLocationManager() //创建获取位置实例locationManager.delegate = self //创建一个实例locationManager.desiredAccuracy = kCLLocationAccuracyBest //设置定位精度
根据实际需求撰写:
locationManager.startUpdatingLocation() //开始更新用户位置信息,并调用
需增加Map与地图的delegate,可作为扩展:
extension ViewController: CLLocationManagerDelegate { }
添加代理方法(参考资料-踩坑-链接1):
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { }
此处有几个可选的种类:
此处为通常使用switch语句,若用户未响应,可添加UIAlertView:
let alert = UIAlertController(title: "xx", message:"请转到设置>隐私>位置服务允许位置", preferredStyle: .alert) let action = UIAlertAction(title: "我知道了", style: .default) alert.addAction(action) present(alert,animated: true,completion: nil)
更新用户位置方法:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {}
此处写法部分遇坑:使用以下方法设置区域:
let location = locations.last else { return } //若最近位置返回0,则返回为空MKCoordinateRegion.init(center: center, latitudinalMeters: 1000, longitudinalMeters: 1000)
center:设置center用户位置中心点
获取iOS用户位置:
Documentation - MapKit - MKMapView
踩坑:
]]>WeChatTweak-macOS,于是直接clone后,需要查找路径并安装。
关于这个插件的功能,后续可能会写文章进行描述,我主要用来“防撤回”、“双开”以及“长时间不用微信不用扫码登录”。
% git clone https://github.com ……
直接clone,之后并成功,后续clone需要首先cd到相应文件夹后clone,此插件网站也是这么写:
下载本插件有以下两种方式:
通过git clone https://github.com/Sunnyyoung/WeChatTweak-macOS.git
命令下载到任意地方
% ls
查看下载的文件,以列表形式呈现。
当我在Terminal中输入出现的列表,其实已经看出是/Users/yourusername/里的文档列表。
% cd
使用cd进入相应文件下载目录
% pwd
使用pwd显示文件路径。
全部操作步骤
后续则可以进行文件夹剪贴的操作步骤,后续进行安装使用了。