给PS4重新安装了GT SPORT,但是进入游戏的时候发现首发版赠送的赛车不能用,游戏内提示请再次下载追加内容,原本以为很简单的事情,结果发现不简单,PSN的设计有点反人类。
需要进入PS首页选择內容保存庫然后可能很多搜索结果说在这里可以找到DLC的聚合页面,但其实没有,要进一步选择游戏,例如我选的是GT SPORT,进入游戏详情页面之后,往下选择Platstation Store然后在右侧就能重新安装DLC。
给PS4重新安装了GT SPORT,但是进入游戏的时候发现首发版赠送的赛车不能用,游戏内提示请再次下载追加内容,原本以为很简单的事情,结果发现不简单,PSN的设计有点反人类。
需要进入PS首页选择內容保存庫然后可能很多搜索结果说在这里可以找到DLC的聚合页面,但其实没有,要进一步选择游戏,例如我选的是GT SPORT,进入游戏详情页面之后,往下选择Platstation Store然后在右侧就能重新安装DLC。
PHP8发布之后越发爱不释手,尤其Attribute比Annotation强大不少,Attribute可以对单个参数进行控制,这个功能很强大。演示一下控制器中通过Attribute描述字段来获得当前IP,其实一般解析器都是用来denormalize客户端POST过来的参数,但是为了用到Attribute,我用IP来举例。
<?php
namespace App\Resolver;
use Attribute;
#[Attribute(Attribute::TARGET_PARAMETER)]
final class IP
{
}
先设计一个Attribute申明,注意TARGET_PARAMETER标识作用在参数范围。
<?php
namespace App\Resolver;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
class IPValueResolver implements ValueResolverInterface
{
public function resolve(Request $request, ArgumentMetadata $argument): iterable
{
$argumentType = $argument->getType();
// 检查IP的Attribute
$attributes = $argument->getAttributes(IP::class);
if (count($attributes) == 0 || $argumentType !== 'string') {
return [];
}
yield $request->getClientIp();
}
}
其次,编写一个解析器,注意,Symfony 6.2开始提供ValueResolverInterface,之前版本用ArgumentValueResolverInterface。
public function resolver(#[IP] string $ip): Response
最后,便是在任何控制器的方法中,只要使用了#[IP] string $ip就能方便的取得IP了。正确使用解析器,可以大大降低控制器中和Request对象耦合的重复代码,将预处理的流程都放在解析中!
一直工作在PHP7的版本下,最近把环境都挪到了PHP8下面,具体用的是最新的8.2.3版本。不得不说,这个变化是天翻地覆的,有很多专门的文章写了PHP8的特点,我也稍微记录下自己角度的观察。
public function weibo(WeiboService $weiboService):Response
public function share(string $text, string $ip, ?string $pic = null): void
enum PlatformConfig: int
{
case TENCENT = 1;
case BAIDU = 2;
case ALIPAY = 3;
case APP_ANDROID = 4;
case APP_IOS = 5;
}
readonly class LoginSubscriber implements EventSubscriberInterface
{
public function __construct(private TokenStorageInterface $storage, private JWTService $manager, private LoginRepository $loginRepository)
{
}
}
class Post
{
use Cloneable;
public readonly string $title;
public readonly string $author;
public function __construct(string $title, string $author)
{
$this->title = $title;
$this->author = $author;
}
}
总结就是,PHP8是划时代的,更具有方向性的,我们可以知道PHP团队走在一条正确的道路上。:D
22年真的不太平,圣诞节晚上感觉发冷喉咙痛,果不其然,新冠了。这个病毒有延迟性,当天用抗原无法测出,第三天用抗原可以从痰液中测出两条杠。
基本症状第一天是发冷,全身发冷,只要温度不够就非常难受。需要大量进食高热量食物,然后对我来说比较明显的两个症状是喉咙难受,当然没有吞刀片的地步,但也很难受,其次就是眼压高。我的体温只有前两天有点烧,其他时候都很正常。肌肉很痛,尤其是训练的最后一个部位,痛得很,然后就是手肘老伤的地方有点痛。
终于大概六天的样子我又恢复健康了,感觉不冷了,体温彻底恢复了,但目前还是有些咳嗽。这个新冠还是很痛苦的,远比一般感冒痛苦,传染性尤其强大,身边周围的人没有不阳的。
每隔一段时间我都会去上博看看,上博地理位置优,人少,总之我很喜欢。上次去正巧碰到“宅兹中国——河南夏商周三代文明展”,展品都是来自河南省内发掘的夏、商、周三代重要考古发现。之所以这个展取名“宅兹中国”,就是为了纪念国宝何尊,上面所刻的“宅兹中国”(大意为我要住在天下的中央地区),这几个字是“中国”一词最早的文字记载。
这个展大部分展品都是青铜器,但青铜器本身就是上博强项,所以并没有很吸引我。但看完这个展后,如何定义中国人这三个字带给我思考很多,今天记录下我的一点点简单的想法。
“宅兹中国”展进门就能看到二里头的模型,二里头被认为最有可能是夏朝的都城。当然这就涉及到一个很大的问题,夏朝是否存在?我们所学历史,夏朝是中国的第一个朝代,但因为没有任何夏朝的文字发现,目前尚未完成对夏朝的断代。
我不是探究夏之断代的,也没有这个本事,因为在我心中夏朝是存在的,断代并不重要。我们认为夏朝的人居住在如今中国的版图上,因此认定是最早的中国人,但我在思考,中国人之所以是中国人就必须是建立在居住地点之上吗?
夏朝之后的朝代是商朝,“封神榜”的故事大部分来自于此。从商朝出土的文物来看,各种青铜器有了一个目的很明确且很重要的作用,那就是祭祀。在祭祀的过程中,会对活物进行杀戮,将敌人乃至同胞置于青铜器中煮熟。而在此过程中,还诞生了甲骨文,甲骨文是一个神奇的东西,正是从甲骨文、金文、大篆、小篆一直延续到今天的文字,中华文明对于文字系统的传承跨度在这个星球上独一无二的,但我在思考,中国人之所以是中国人就必须是建立在使用相同文字系统之上吗?
先回答前面夏和商带来的问题,我百分百肯定我们是夏朝和商朝的后代,但是,他们和现代中国人没有双向之联系。祖先定居的地方决定了我们的生活习惯,甚至影响我们的基因。但那只是自然迁徙的一种选择,现代人因为交通便捷,很多华人生活在海外,他们仍然是华夏的种子。
商朝人拥有一套现代人看上去极其血腥的管理模式,直白点,这种暴力统治模式更接近原始人。我们也无法去反对这种行为,因为文明进化的过程都是起伏的。
显然现代中国人并不是以暴力为基准来匹配资源,商朝人是我们的祖先,但他们和地球上其他同时代文明一样,还在被活下去这个目的驱动着,所以武力是他们的第一选择顺位。所以退一步说,夏和商都是地球文明,虽有大同小异,但还没成为“中国人”
那中国人是什么时候成为“中国人”的呢?我以为既不是居住的位置,也不是文字系统传承,而是信仰的统一。我不得不提下周公旦,作为周王朝的第二代统治者,他的伟大在于用一套制度来规范了自己的子民,当然也约束了自己。他系统了解释了人和人之间的关系,以及遵循的规矩。尤其在文化上周公提出了“明德慎罚”的道德规范,制定了完整的礼仪仪式,此外周公曾提出“敬德保民”,制礼作乐,建立典章制度。
用上帝视角来看,环顾此时地球上其他文明,周公旦并没有为了方便统治而创造出一个一神教或者多神教,他所恪守的规律始终建立在人上。我认为正是他的体系诞生了中国人这个概念,甚至可以说接受周公旦想法并且凝聚在一起的人,我们可以叫做中国人,当然此时的中国人概念还没有彻底完成。
谈孔子不得不提下他所处的时代以及他的阶级出身,孔子出生于春秋时期,此时中原大陆是一个大分裂状态。在这个礼乐崩坏背景下,周公旦设计的制度已经成为了摆设,统治者和老百姓成为了狼和羊的关系。此时的普通人是完全没有安生日子的,农作物收成即使好个几年,也不免卷入来年发动的战争中,这种环境简直就是人间炼狱。
我喜欢仲尼,他是贵族出身,他本可以像其他勋贵一样完全为更高级的统治者服务,用自己的智慧鱼肉百姓。但他的伟大就在于他传播的思想站在了老百姓这一面,并且不停地去游说别人相信他的理论。他成天看到那些虚伪的人,一旦拥有了知识就开始欺负弱小,巧取豪夺老百姓的一切。仲尼看不惯这些垃圾,基于周公旦的思想,他提出了“仁”和“礼”的概念,提倡“富民”的理论。正是孔子对周公旦思想的提炼和强化,使得中国人的概念得到发芽生长。
孔子的伟大是穿越时代的,同时期地球其他的文明还是没有能匹敌的对手,即使在仲尼死后五百年,西方才出了一个耶稣。虽然基督教包裹了很多好的、善良的、基于人的想法,但依然是一个一神教模型。
孔子的思想是正确的且先进的,但在大分裂的背景下,不能被当时的统治者接受。好在中国最终迎来秦汉这个大一统时代,于是有了一个好消息,一个坏消息。好消息是,汉武帝刘彻提出罢黜百家,独尊儒术,坏消息是,这个儒术是上过眼药的版本。
董仲舒将孔子作为招牌,把原版的儒学魔改成“三纲五常”和“天人感应”的唯皇帝论,将皇帝和老天联系在一起,添加了神秘主义,底层逻辑居然类似一神论,这是一种大退步。将最底层老百姓置于国家最不重要的位置,却反过来对他们却要求甚多。董仲舒倡导的儒学只有孔子这个名称作为空壳,他给孔子伟大的思想蒙上了尘埃,让本来已经领先地球其他文明两千年的思想发展开始停滞。
当儒学成为显学后,他离皇帝更近了,离老百姓更远了。所有的东西都往上贴,有的好,有的不好,但都被包裹成儒学的一部分,只要被认为对皇帝的统治有利。
到了魏晋时期,儒学已经被魔改的不成样子,成为了一个谁都无法轻松掌握的东西,包含了大量复杂的语言体系,他已经不能被一方势力当做话语权使用了。于是,儒学一度被玄学取代,东晋建立后,其特殊的门阀政治,让原来的儒学世家,纷纷改投玄学门下,摇身一变成为玄学士族。
后来的后来,儒学已经不是原本孔子版本,彻彻底底的成为工具,这里就不铺开说了。
欧洲在14世纪到16世纪发起了“文艺复兴运动”,当时的人们认为,文艺在希腊、罗马古典时代曾高度繁荣,但在中世纪“黑暗时代”却衰败湮没,直到14世纪后才获得“再生”与“复兴”,因此称为“文艺复兴”。
中国人农耕习惯成型的早,思想习惯其实也成型的早,但可惜在历史进化过程中没有将其延续。所以我认为,我们要将先秦诸子百家的东西拿出来看看,好的东西留下来。把原版孔子拿出来,周公旦拿出来,和时代结合,精进中国人的思想,挖掘回原来的样子,来一次思想的复兴。
草草收个尾,快速总结一下,孔子思想体系的核心是“仁”和“礼”,德化社会的最高标准是“礼”,而德化人生的最高价值是“仁”。当我们能够做到这两点,就可以认为是中国人,因为我们的思想一致。
所以,成为中国人不一定需要住在中国的土地上,也不用一样的文字。即使他是黑色的皮肤,不会说中国话,只要能够拥有“仁”和“礼”,我觉得他就可以被认为是中国人。但反过来说,如果“不够仁”,就算他土生土长在中国土地上,说着一口流利中国话,他也不是中国人。
走进健身房,通过锻炼来强化身体,是现在很多人正在做的事。但根据我的观察,表面上参与运动的人多了,健身失败却成为了主流,最具代表性质的便是想减肥之人瘦不下来。更严重的是,即使很多人咬牙坚持几个月甚至几年都没有明显改变,这是哪里出了问题呢?
作为一个长期锻炼者,我发现,健身房里是有潜规则的,只有熟悉了这个潜规则才能改变身体成功。
本文基础观点承接自前次教育的话题,总结就是:最好的教育来自于传承。今天探讨的是,若无法通过传承途径前进,便无疑需要自学成才。以健身房来举例子,有两个原因,首先,这是一个很多人日常会接触到的学习模型。其次,我们这代人的父辈几乎没有健身房锻炼身体习惯,所以更适合用来谈自学。
在学习的过程中,绝大多数多人会犯最多一个问题,方向不对。观察商健里的普通用户,很多人虽有目的,有的喜欢健美,有的喜欢健力,有的要健康,但实际操作却大相径庭。
在这里举个例子,同样带有目的性地去完成一件事情,假设要去开一个餐厅。如果经营不善,可能三个月就歇业了,这是为什么?道理很简单,没有资金了。但如此简单的道理换成健身,很多人却觉得,因为不用花钱,只要投入时间即可,自己可以无限地试错下去。但恰恰相反,时间和金钱都只是一种资源,时间本质比金钱更宝贵。但健身失败的人无法意识到这一点,三个月身体没有变化而持续地坚持锻炼,仿佛只要坚持就能发生质变。很遗憾,只要走错了方向,只能走向失败并且损失资源。所以,你必须能够判断自己是否走在正确的方向上,身体不会说谎!
甚至在这个“坚持”的背后,可能还会因为选择了“坚持”而沾沾自喜,配合互联网打卡功能或发朋友圈鼓励自己。但请不要忘记,我们求的是结果,而不是过程。打卡发圈终究是过程,身体的变化才是结果。甚至,当你拥有成功的结果后,你可以说,你天生如此,从来没进过健身房,因为本质来说健身房也只是一个工具。
走入健身房伊始,作为一个小白,肯定会通过某些途径去学习。自然会在获取资讯的时候多看看相关内容,无论是主动还是被动的。很多人认为只要自己开始学了便是自学,但回到前面说的,还是要以结果为导向。
现在互联网是何等发达,各种教学应有尽有,这里不说内容本身对错问题,为什么同样的动作你也做但是你无法获得同样的效果?人的身体结构是不同的,在实际生活中,绝大多数人是不能通过互联网学习健身成功的。
举个不贴切的例子,如果学习只要简单地看看模仿下,那为什么学生还要去学校呢,所有人都在家自学不就好了。
对付问题的第一步是必须意识到自己有知识短板,几乎百分之九十五的健身房失败者都会撞到这堵墙上。通过观察自己,观察别人在一段时间内的变化,确认自己知识结构的位置。意识到短板之后,才会主动通过外部知识体系补充。所以,只有意识到自己有问题才能前进,才会去主动找知识。
社交的本质就是交易,这个交易未必用金钱来做介质。你需要从任何一个比你优秀的人这里学习他的优点,你应该很虚心的请教他,同时你也应该有能力去真诚的回报他,你可以通过自己的一技之长去和他交换他的知识结构。
所有的技术都包含大量细节,很多时候我们不需要知道什么是对的,而是要知道什么是错的,大部分人只有通过纠错才能前进,而纠错的本质是通晓了原理才行。所以很多时候只有线下的教学才能成功,健身是一个很显性的东西,线下的教学纠错是你成功的关键。
你有一个师傅是无比重要的事情,你如果有很多师傅那就再好不过了,当然所有的东西都要经过自身去验证,不用尽信。这里借用陈云同志和毛主席在延安窑洞的三问三答后的总结,“不唯上、不唯书、只唯实,交换、比较、反复”。
你应该抱着学习的态度来到健身房,你可以选择通过金钱获得私教的指导,也可以通过社交获得师傅的指导,但必须意识到你是需要指导的。在线下纠错模式下的学习效率远比你自己瞎搞来得快,前提是你必须要能甄别出优秀的师傅。
沿着南京西路往东走,必然是外滩,同理,只要正确的方法锻炼,你就能获得正确结果。
反例便是,你没事刷刷健身自媒体,认为自己很努力地在学习,甚至有些自鸣得意。到了健身房没有计划地随便练一练,甚至没有一个动作是正确的。你完全不懂训练,饮食,解刨,训练时你只和相同水平的人交流,聊天浪费了你很多时间。此时你想通过时间的积累来获得成功,很遗憾,这个时候时间不存在,即使你能活到五百岁也不太行。
如果能通过自己的学习在健身房锻炼成功,那证明你会自学了,而这个模型是可以复制的。你完全理解怎么观察自己,怎么寻找帮助,怎么精进,你可以在其他的领域一样成功起来,你的成功可以复制。换言之,职场也是一个学习赛道,你如果能意识到自己的位置和向上社交,才能获得成功。
当你的成功模式可以复制,就如同本文健身的例子,最显著的结果就是你的下一代不会有身体锻炼的困惑,因为你可以指导他,并且传授学习的方法。否则下一代依然会面临健身房模型,如果撞墙则又需要一代人的努力,这才是最可怕的。试想一下,为什么肥胖会伴随家族遗传,他遗传的到底是什么呢?真的只是基因那么简单?
或许你认为我会建议大家要成为师傅,但很遗憾这不是我的观点。当你拥有好东西的时候你确实很希望分享,但作为正经学习这件事情上需要三思,不要去好为人师来满足自己的虚荣心。
如果对方尚未意识到自己存在问题,千万不要去纠错别人,即使你是善意的。因为在实际生活中往往别人会觉得反感,即使一次成功的教学也不能改变整个学习轨迹,只有他自己意识到有学习的渴望,才有可能成功。
和MAC直接用相比,WIN下的HDR有点琢磨不透,我的显示器是KOIOS 3221UD,播放器是POTPLAYER。之前因为都是维持着MAC下设置,看HDR视频总是发暗,经过不懈努力我终于发现。
刚刚过去的上海夏天的温度应该是历年体感最高的,黄梅天都没能成功占领这个城市,每天的白天都被40多的温度占领,到了午夜时分,也是36,37能让人中暑的温度,上海的夏天越来越难过了。
秋天终于来了,虽然还处于不稳定状态,但是大自然让身体是瞬间舒服起来,人的活力也被激发了,白天的户外活动也开始解锁。
只要是外接HDR显示器,只要系统没有重启,是从睡眠中唤醒的,那么在youtube中的HDR选项就会没有,这时候只有重启或者重新插拔DP线。现在12.5更新了,唤醒后再youtube中也有HDR选项了,方便了。
再次测试了下,bug还在,重启后外接显示器还是会丢失youtube里hdr选项。
之前一直在用amap_map_fluttify ,但我发现国内开源太容易半途而废了,当然不去说对错,这东东算是完了,就算以后再发新版本我也不敢用了。
高德官方的flutter插件早就出了,这次小试了下,感觉不错。
相较于以前版本的复杂配置,高德官方版本配置很方便,flutter可以搭配不同的native端!只要在android/app/build.gradle配置,就可以选择你要的SDK版本。
dependencies {
implementation('com.amap.api:3dmap:9.2.1')
implementation('com.amap.api:location:6.1.0')
}
就可以完美使用了,不用自己去加载lib和so,很方便,当然缺点也有。
打开wordpress后台一看,奥哟,升级6.0了,果断升级,没有感觉出任何区别。
最重要的事情记录一笔,之前macbook pro用的是hdmi,由于是hdmi 2.0在mac osx下是无法开启hdr的,所以换了跟display port线,dp 1.4版本,果然在系统偏好设置中,显示器设置中可以看到高动态范围这个选项了!太棒了,内置的radean pro 4gb看4k hdr毫无压力!非常棒!ATI其实有点被低估了!
ps:DP外接显示器后务必安装一个MonitorControl,免费开源的工具,通过DCC调节显示器亮度对比度音量等。
老夫有一台便携屏华硕的MB169C+,但利用率不是很高,出差接苹果用的。之所以利用率不高,就是敲代码时候字体太丑陋。上海疫情期间,台机的1060挂了,迁移到MACBOOK PRO敲代码,又接上了我的便携屏。
仔细研究了下,是华硕VividPixel这个技术在作怪,为了让边缘轮廓显示更锐利。这就奇了怪了,明明是一台用来办公用的屏幕,默认开启这种游戏配置很糟心,文本和图片显示都很诡异。所以,正确的办法就是关闭VividPixel,关闭TraceFree回归到一个正常显示文本的正确模式!一切完美!
最后,这台ASUS还是有一个糟心的地方,不能连接switch!
之前Dart里定义一个函数结构可以用
typedef Widget ItemGenerator<T> ({Key? key, required T model});
这样的语法,但是到了新版本Dart静态检查会建议使用
typedef ItemGenerator<T> = Widget Function({Key? key, required T model});
这就会产生我今天犯下一个隐蔽的bug,引入泛型的时候会不小心写成。
typedef ItemGenerator = Widget Function<T>({Key? key, required T model});
能编译通过,但是在实际场景中你无法为你的变量设置正确的泛型,虽然看上去好像是正确的,补充一句,新的写法可以不单单定义回调,还可以定义一个结构,例如:经常用到的JSON格式在Dart中的定义,使其更具语义化!
typedef JsonMap = Map<String, dynamic>;
AS构建Flutter项目出控制台中文乱码,之前都是修改android/app/build.gradle,添加:
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
但是这次玄学了,怎么restart清缓存都没用,最后参考 https://blog.csdn.net/u011054333/article/details/54175641 使用终极方法,在Windows下,新建GRADLE_OPTS环境变量,值为-Dfile.encoding=utf-8。然后新开一个终端窗口再次使用gradle命令,就会发现这下Gradle已经可以正确识别编码了。
题外话,升级到了JDK18后我的IDEA也出中文乱码了,我惊了,不是18原生支持UTF-8么,只能回到JDK17。
Spring Security是Spring全家桶中负责安全的模块,安全是任何一个应用访问的基础。在我经验中安全主要提供两个主要功能,一个是Authentication,另外一个是Authorization。
Authentication的意思是鉴权,也就是通过请求判断用户身份,传统的手段很多,比如表单登陆,Basic Auth,令牌等等。Authorization就是访问控制,用来控制应用内的ACL(Access Control List,访问控制列表),由此判断当前用户是否有权限来使用对应资源。
Spring Security的设计初衷是所有应用都能使用安全模块,但毫无疑问作为全家桶成员,他在WEB方面是有很多天生优势的,和很多安全系统设计Shiro,Symfony Securiy等是高度相似的,如果有这些产品的经验,会很容易的转换到Spring Security中去。
JWT(JSON Web Token),是JWT组织提出的一种基于JSON在客户端和服务器之间交换用户态的一种规范。
package com.nuspet.yihuan.security.mini;
import org.springframework.security.authentication.AbstractAuthenticationToken;
// 小程序系列的token接口
// 衍生出微信,百度,支付宝等小程序token的类
public abstract class OpenIDToken extends AbstractAuthenticationToken {
// 构造函数的说
// 小程序类型的登陆token没有权限
public OpenIDToken() {
super(null);
super.setAuthenticated(false);
}
// 小程序token都会转换成jwt token 所以不能设置信任为ture
@Override
public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
if (isAuthenticated) {
throw new IllegalArgumentException(
"不能设置小程序类token受信任,最终会转换成信任的jwt token。");
}
super.setAuthenticated(false);
}
}