跳转到内容
View in the app

A better way to browse. Learn more.

彼岸论坛

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

小天管理

管理员
  • 注册日期

  • 最后上线

小天管理 发表的所有内容

  1. 按照 v 友=菜市场大妈的逻辑,现在“悲观清醒的人”还非常多,大家不妨拿住就是。
  2. 最近跑步的时候瞎想,在间歇训练总想着以一个稳定的平均速度在操场跑圈,但是普通的手表没有办法让我非常及时、直观的知道当前的配速与目标配速的差距。 联想到基普乔格破 2 时行动时,前方有一辆投射投影的配速车 还有田径比赛的时候跑道侧有移动的灯光标识。 感觉如果有这样一个东西在足够便宜的前提下,会让人操场跑圈跑间歇的时候可能更舒服的? 来请教一下,有没有比较成熟且不会很贵的方案。 抖音上刷到一家类似的(但是产品线功能更全的),报价 7 位数开始,有点恐怖了。 叠甲:跑间歇的时候快个几秒慢的几秒当然不会很影响到训练效果,只是在想有没有什么可以更有趣的方式
  3. 可以打出很长的句子,感觉更加智能了,仿佛有了云词库的感觉(实际上只是本地引擎算法) GitHub 地址: https://github.com/gaboolic/rime-frost
  4. 做数据库应用开发多年,有这方面的远程工作吗
  5. 最近有很多朋友咨询如何开通港卡及券商开户。我就整理了下之前的办理的过程, 📝 行前准备 预约:联系了开户行支行的工作人员帮忙预约,超级方便! 材料准备:身份证、港澳通行证必不可少,还有保留好过关小票,还有可能用到地址证明 充电宝:这个真的太重要了,请一定要带! 🚄 行程安排 我是周五晚上从长沙出发,坐高铁到深圳,第二天一大早就开启了我的香港之旅: 07:53 到达香港西九龙 08:40 左右抵达永隆银行(德辅道中) 小贴士:建议大家也选择中环附近办理,因为银行分行集中,超级方便! 🏦 开户历程 招商永隆 & ZA Bank 刚到永隆银行门口时还没开门,我就去附近吃了个早餐。回来后已经有人排队了,但还好只有两三位。 等待的时候,我顺便在线申请了 ZA Bank 的账户。小伙伴们注意啦,用我的邀请码 JYU7T6 会获得最高 500HKD 奖赏券哦! 永隆银行的开户过程超级顺利,大概半小时就搞定了。他们会问问开户原因,可能需要看下流水,整体氛围很轻松。 中国银行 永隆办完直接去了附近的中银分行。等待时间不长,但开户过程稍微久了点,大约 1 小时。 需要下载两个 App:中银香港和 BoC Pay 。银行职员超级 nice,全程帮我操作,我只需要填写必要信息。 ⚡小插曲:隔壁小哥因为收不到验证码放弃了开户。所以一定要提前开通漫游! 💡 实用小贴士 充电宝:可以在 7-11 借用 ChargeSPOT 移动充电宝。 电话卡:同样在 7-11 可以买到 clubsim 卡。 🌃 回程 下午大概 5 点多坐地跌到福田口岸,行程有点赶。 此外,到香港后,也可以在线上开通中国银行,不需要到中国银行的业务网网点。还有就是朋友有朋友开通过程遇到柜员 更多情况看博文:一日港卡开户亲身经历
  6. GPT 说用 SIGNAL 或 win32api 捕捉关闭信号,但是我试了一下都只能在用 Ctrl+C 关闭的时候能成功触发。我想要能在直接把 python 的窗口关掉的时候也能执行这个功能
  7. 价格直逼松哥的中号虾。 gap10 年,感觉饭要吃不起了~
  8. Magician-Concurrent Magician-Concurrent 是一个并发编程工具包,当你需要并发执行某些代码的时候,不需要自己创建和管理线程,除此之外里面还提供了生产者与消费者模型 初始化配置 导入依赖 <dependency> <groupId>com.github.yuyenews</groupId> <artifactId>Magician-Concurrent</artifactId> <version>1.0.0</version> </dependency> 并发处理任务 MagicianConcurrent.getConcurrentTaskSync() .setTimeout(1000) // 超时时间 .setTimeUnit(TimeUnit.MILLISECONDS) // 超时时间的单位 .add(() -> { // 添加一个任务 // 在这里可以写上任务的业务逻辑 }, (result, e) -> { // 此任务处理后的回调 if(result.equals(ConcurrentTaskResultEnum.FAIL)){ // 任务失败,此时 e 里面有详细的异常信息 } else if(result.equals(ConcurrentTaskResultEnum.SUCCESS)) { // 任务成功,此时 e 是空的 } }) .add(() -> { // 添加一个任务 // 在这里可以写上任务的业务逻辑 }, (result, e) -> { // 此任务处理后的回调 if(result.equals(ConcurrentTaskResultEnum.FAIL)){ // 任务失败,此时 e 里面有详细的异常信息 } else if(result.equals(ConcurrentTaskResultEnum.SUCCESS)) { // 任务成功,此时 e 是空的 } }) .start(); 添加进去的任务会并发执行,但是在它们执行完之前,这整个代码块会同步等待在这,一直等到所有任务执行完或者超时才会继续往下走。 这里面的超时时间就是用来设置同步等待多久的。 如果设置为 0 表示一直等到所有任务完成为止 设置为大于 0 的时候,表示只等待这么久 并发处理 List ,Set 等所有 Collection 类的集合里的元素 同步执行 // 假如有一个 List 需要并发处理里面的元素 List<String> dataList = new ArrayList<>(); 每个元素并发执行 // 只需要将他传入 syncRunner 方法即可 MagicianConcurrent.getConcurrentCollectionSync() .syncRunner(dataList, data -> { // 这里可以拿到 List 里的元素,进行处理 // List 里的元素是什么类型,这个 data 就是什么类型 System.out.println(data); }, 10, // 每组多少条元素 1, // 每组之间同步等待多久 TimeUnit.MINUTES // 等待的时间单位 ); 这个方法会将传进去的集合分成若干组,每组的大小由参数指定。 这些组会排队执行,但是每一组在执行的时候都是并发的,里面的每一个元素都会由单独的线程去处理。 需要等一组处理完了,才会处理下一组,但是有时候我们不想这么死板的等待,所以可以设置一个超时时间,超过了这个期限就不等了,直接进行下一组,所以这里的最后两个参数就是用来设置这个期限的。 每一组并发执行 // 也可以用 syncGroupRunner 方法 MagicianConcurrent.getConcurrentCollectionSync() .syncGroupRunner(dataList, data -> { // 这里可以拿到每一组的元素,进行处理 // 这个 data 就是每一组 List ,可以自己迭代处理 System.out.println(data); }, 10, // 每组多少条元素 1, // 每组之间同步等待多久 TimeUnit.MINUTES // 等待的时间单位 ); 这个方法会将传进去的集合分成若干组,每组的大小由参数指定。 每一组由单独的线程处理。 会一直同步等待在这里,直到所有组都处理完了才会进行下一步,但是有时候我们不想这么死板的等待,所以可以设置一个超时时间,超过了这个期限就不等了,直接执行下一步。所以这里的最后两个参数就是用来设置这个期限的。 异步执行 其实就是将上面 [同步处理] 的代码放到了一个线程里,内部处理依然是上面 [同步处理] 的逻辑,但是这整个代码块将会异步执行,不需要等在这。所以个别相同的参数就不再重复解释了。 // 假如有一个 List 需要并发处理里面的元素 List<String> dataList = new ArrayList<>(); 每个元素并发执行 // 只需要将他传入 asyncRunner 方法即可 MagicianConcurrent.ConcurrentCollectionAsync( 1, // 核心线程数 1, // 最大线程数 1, // 线程空闲时间 TimeUnit.MINUTES // 空闲时间单位 .asyncRunner(dataList, data -> { // 这里可以拿到 List 里的元素,进行处理 System.out.println(data); }, 10, // 每组多少条元素 1, // 每组之间同步等待多久 TimeUnit.MINUTES // 等待的时间单位 ); ConcurrentCollectionAsync 里的参数其实就是线程池的参数,除了上面这种写法,还可以这样写。 每调用一次 asyncRunner 都会占用一个线程,而这些线程都是由一个线程池在管理。 ConcurrentCollectionAsync concurrentCollectionAsync = MagicianConcurrent.ConcurrentCollectionAsync( 1, // 核心线程数 1, // 最大线程数 1, // 线程空闲时间 TimeUnit.MINUTES // 空闲时间单位 ); concurrentCollectionAsync.asyncRunner(dataList, data -> { // 这里可以拿到 List 里的元素,进行处理 System.out.println(data); }, 10, // 每组多少条元素 1, // 每组之间同步等待多久 TimeUnit.MINUTES // 等待的时间单位 ); concurrentCollectionAsync.asyncRunner(dataList2, data -> { // 这里可以拿到 List 里的元素,进行处理 System.out.println(data); }, 10, // 每组多少条元素 1, // 每组之间同步等待多久 TimeUnit.MINUTES // 等待的时间单位 ); concurrentCollectionAsync.asyncRunner(dataList3, data -> { // 这里可以拿到 List 里的元素,进行处理 System.out.println(data); }, 10, // 每组多少条元素 1, // 每组之间同步等待多久 TimeUnit.MINUTES // 等待的时间单位 ); 用这个方法可以管理线程池 // 关闭线程池 concurrentCollectionAsync.shutdown(); // 立刻关闭线程池 concurrentCollectionAsync.shutdownNow(); // 获取线程池 ThreadPoolExecutor threadPoolExecutor = concurrentCollectionAsync.getPoolExecutor(); 每一组并发执行 // 也可以用 asyncGroupRunner 方法,每个参数的具体含义可以参考文档 MagicianConcurrent.ConcurrentCollectionAsync( 1, // 核心线程数 1, // 最大线程数 1, // 线程空闲时间 TimeUnit.MINUTES // 空闲时间单位 .asyncGroupRunner(dataList, data -> { // 这里可以拿到 List 里的元素,进行处理 System.out.println(data); }, 10, // 每组多少条元素 1, // 每组之间同步等待多久 TimeUnit.MINUTES // 等待的时间单位 同上 并发处理所有 Map 类的集合里的元素 Map 的逻辑跟 Collection 一模一样,只不过是传入的集合变成了 Map ,就不再累述了,感谢理解。 同步执行 每个元素并发执行 // 假如有一个 Map 需要并发处理里面的元素 Map<String, Object> dataMap = new HashMap<>(); // 只需要将他传入 syncRunner 方法即可 MagicianConcurrent.getConcurrentMapSync() .syncRunner(dataMap, (key, value) -> { // 这里可以拿到 Map 里的元素,进行处理 System.out.println(key); System.out.println(value); }, 10, 1, TimeUnit.MINUTES); 每一组并发执行 // 也可以用 syncGroupRunner 方法 MagicianConcurrent.getConcurrentMapSync() .syncGroupRunner(dataMap, data -> { // 这里可以拿到每一组 Map 进行处理 System.out.println(data); }, 10, 1, TimeUnit.MINUTES); 异步执行 每个元素并发执行 // 假如有一个 Map 需要并发处理里面的元素 Map<String, Object> dataMap = new HashMap<>(); // 只需要将他传入 asyncRunner 方法即可 MagicianConcurrent.getConcurrentMapAsync( 1, 1, 1, TimeUnit.MINUTES ).asyncRunner(dataMap, (key, value) -> { // 这里可以拿到 Map 里的元素,进行处理 System.out.println(key); System.out.println(value); }, 10, 1, TimeUnit.MINUTES); 每一组并发执行 // 也可以用 asyncGroupRunner 方法 MagicianConcurrent.getConcurrentMapAsync( 1, 1, 1, TimeUnit.MINUTES ).asyncGroupRunner(dataMap, data -> { // 这里可以拿到每一组 Map 进行处理 System.out.println(data); }, 10, 1, TimeUnit.MINUTES); 生产者与消费者 这是一个多对多的模型,多个生产者可以给多个消费者推送不同类型的数据, // 创建一组生产者与消费者,而这样组可以创建无限个 // 每一组的生产者都只会把数据推送给同一组的消费者 MagicianConcurrent.getProducerAndConsumerManager() .addProducer(new MagicianProducer() { // 添加一个生产者(可以添加多个) /** * 设置 ID ,必须全局唯一,默认是当前类的全名 * 如果采用默认值,可以不重写这个方法 * @return */ @Override public String getId() { return super.getId(); } /** * 设置 producer 方法是否重复执行,默认重复 * 如果采用默认值,可以不重写这个方法 * @return */ @Override public boolean getLoop() { return super.getLoop(); } /** * 设置 是否等消费者全部空闲了才继续生产下一轮数据,默认 false * 如果采用默认值,可以不重写这个方法 * @return */ @Override public boolean getAllFree() { return super.getAllFree(); } /** * 当生产者启动后,会自动执行这个方法,我们可以在这个方法里生产数据,并通过 publish 方法发布给消费者 * * 这边举一个例子 * 假如我们需要不断地扫描某张表,根据里面的数据状态去执行一些业务逻辑 * 那么我们可以在这个方法里写一个查询的逻辑,然后将查询到数据发送给消费者 */ @Override public void producer() { // 根据上面的例子,我们可以查询这张表里符合条件的数据 List<Object> dataList = selectList(); // 然后将他推送给消费者 // 可以推送任意类型的数据 this.publish(dataList); /* * 如果你只需要执行一次,那么到此就结束了,这个生产者也可以被回收掉了 * * 但是如果你需要不断地执行上述操作,来维护这张表里的数据,这个时候你有两种做法 * 第一种:加一个 while 循环 * 但是这种方式有个问题,如果消费者的消费速度跟不上,那么就很容易造成消费者队列积压,出现内存问题。 * 而数据积压太久又会影响时效性,可能你推送给消费者的时候,这条数据需要处理,但是等到被消费的时候又不需要处理了,这样容易出现数据错乱的问题。 * * 第二种:等消费者把你推给他的数据消费完了,再推送下一轮,而我们就是采用的这种 * 如果你想用这种方式,那么你不需要再写其他的任何逻辑,只需要将上面提到的 getLoop 方法重写一下,并返回 true 即可 * 当你设置为 true 以后,生产者在推送完一轮后会不断地监视消费者,当发现了空闲的消费者才会推送下一轮数据,并且数据只会推送给这个空闲的消费者 * * 如果你想等所有消费者都空闲了以后再推送下一轮,而不是发现一个空闲的就推送一轮 * 那么你可以重写上面提到的 getAllFree 方法,返回 true 即可 */ } }) .addConsumer(new MagicianConsumer() { // 添加一个消费者,可以添加多个 /** * 设置 ID ,必须全局唯一,默认是当前类的全名 * 如果采用默认值,可以不重写这个方法 * @return */ @Override public String getId() { return super.getId(); } /** * 心跳通知,消费者每消费一个任务,都会触发一下这个方法 * 我们可以根据他触发的频率来判断这个消费者的活跃度 * * 注意!!! * 这个方法里不可以有耗时的操作,不然会将消费者阻塞的 * 如果一定要加耗时的操作,那么务必在新线程里搞 * @param id */ @Override public void pulse(String id) { new Thread(()->{ // 如果你需要在这个方法里搞一些耗时的操作,那么务必要像这样开启一个新线程 // 不然消费者会被阻塞的 }).start(); } /** * 消费频率限制,默认 10 毫秒,取值范围:0 - long 的最大值,单位:毫秒 * * 如果任务执行的耗时小于 execFrequencyLimit ,则等待 execFrequencyLimit 毫秒后再消费下一个任务 * * 首先这是一个生产者和消费者多对多的模型结构,我们以一个生产者对多个消费者来举例 * 生产者生产的数据只有一份,但是他会推送给多个消费者 * 而我们之所以要配置多个消费者,是因为需要他们执行不同的业务逻辑 * 多个消费者执行的业务逻辑不同,也就意味着他们需要的数据大概率会不同 * * 比如消费者 A 需要处理男性的数据,消费者 B 需要处理女性的数据 * 如果生产者刚好连续推送了几批男性的数据,那么这会导致消费者 B 筛选不到女性数据,那么他就不会处理业务逻辑了 * 这么一来,消费者 B 就会无限接近空转,而空转会引起 CPU 占用率过大,所以必须加以限制 * * 千万不要小看这个问题,本人曾经在实战中亲测过,做不做这个限制,CPU 的占有率会达到 10 倍的差距 * 当然了,这跟消费者的业务逻辑还是有一定关系的,具体情况具体看待 * 如果你的消费者几乎不会出现空转,那么这里可以设置为 0 * */ @Override public long getExecFrequencyLimit() { return super.getExecFrequencyLimit(); } /** * 这个方法会接收到生产者推送过来的数据 * 在里面执行相应的业务逻辑即可 * @param data */ @Override public void doRunner(Object data) { // data 可以是任何类型 // 因为能给他推送数据的消费者是固定的,所以 data 有可能收到的类型也是固定的 // 所以我们可以在这里自己判断,然后转化即可 // 为什么不用泛型?这是为了兼容多个生产者,因为他们推送的数据类型可能会不同 } }) .start(); } 项目官网:https://magician-io.com
  9. 什么牌子的剃须刀好用,现在用的手动剃须刀,1-2 次就得换刀片, 太不耐用了
  10. claude 3.5 sonnet 有多强?我把 github.com/suniw/fhash 这个仓库地址扔给模型,(c++)源码,让它帮我翻译成 xcode 代码。一次成功,我没增改一行代码,程序员你慌不慌? 效果展示 https://i.imgur.com/Ae6jryg.mp4 佩服佩服!!!!
  11. RealtimeAPI - 像人类一样与 AI 实时交谈 https://realtimeapi.net/
  12. 昨天也没剧烈运动 纯粹是骑车的时候蹬用力点,骑车一小时左右,今天起床神清气爽(不排除是放假的心理因素)。大家快运动起来吧,摆脱亚健康
  13. 功能简单点都无所谓 源码齐全开箱即用 包部署 方便二开的就好
  14. 有没有能够跳过带有商品介绍回答的插件。 旧版网页或者第三方的浏览器会不会有这个功能,不太像每次都看折叠一些利益相关的回答
  15. 有点点想收台三星来玩玩 日常往返中欧,因此对 NFC 的需求是:在欧洲绑当地 VISA/Mastercard 银行卡日常消费,在国内用来刷交通卡。再加个 NFC 模拟门禁的需求。 不知道 Samsung Pay 分不分地区,国内交通卡和 VISA/Mastercard 以及 NFC 模拟能否共存?以及这些跟机器硬件地区版本和系统地区版本有没有关系?
  16. 完整的报错内容如下所示: 2024-10-02 01:15:19.714 ERROR 29348 --- [ main] o.s.b.web.embedded.tomcat.TomcatStarter : Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'reqEnvContextFilterRegistrationBean' defined in class path resource [com/example/common/core/CommonCoreConfiguration.class]: Unsatisfied dependency expressed through method 'reqEnvContextFilterRegistrationBean' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'reqEnvContextFilter': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'sys.app-name' in value "${sys.app-name}" 这个问题显然是因为无法解析出 sys.app-name 的值导致的,然而奇怪就奇怪在这个值我很明确我已经设置过了,在 application.properties 中,有下面的配置 sys.app-name=demo sys.ms-name=demo 按说是不该出现这个问题的,但是却会报这个问题 我的项目中并没有直接使用 sys.app-name 这个值,但由于这个是我公司的 demo 项目,内部的公司依赖可能在某处解析了该值,只是我不知道而已,我没法通过不使用该值或者给他一个默认值的方法来解决这个问题 我使用的 jdk 版本为 8 ,maven 版本为 3.5.3 搜索引擎上的方法我基本都尝试过了,都无法解决该问题,我实在没法了所以我来这问问各位,希望有大佬能救一下
  17. 启用了三指拖移,用 mac 触控板三指操作有的时候是进行拖拽 有的时候是多选,很随机,所以如果想要进行选择多个文件,触控板的具体手指操作是什么?(在不按住 command 的的情况下)
  18. 虽然现在也还是一个老韭菜,但我还是想说说自己心路历程。 19 年中入场购买基金,时机还算不错,最初是抱着重在参与的心态,选择了每天几十块钱的定投模式。 20 年股市开始上涨,看着账号收益不断创新高,虽然总收益不过一千,但是躺着赚钱的感觉很好。 当时关注着各种小道消息,想知道明天是涨还是跌,能涨到多少点。 中间出现波动调整时害怕收益清零都会选择下车。这时候的策略是小资金定投入场,出现波动就全清。 自我感觉股市真能赚到钱,而且还不费力,定投就好了,开始各种在好友面前晒收益秀操作,对于自己关于股市的认知各种自信,在好友群中各种指点江山。 得益于当时行情确实不错,每轮调整完了以后都能涨回去,让我误以为反正都会涨回去的。所以定投的金额开始加大,涨得好的时候还会额外追加资金,害怕错过了上车机会而损失一大笔收益,胆子也越来越大,这样的想法让我在 21 年出现比较大调整的时候还是一直在保持定投。 这个时候心态上已经发生了变化,变得不愿意卖出了,觉得卖出会是一种损失,虽然知道现在也很高了,停了定投,但是我要等下一个更高点的到来,看着基金账户中浮盈的金额满心欢喜。 时间来到 21 年 12 月份,股市开始大幅下跌,此时我的心态还是和之前一样,反正都会涨回来的。在下跌过程中还在不停地补仓,但是这次股市没有再涨回来,直到今天也还有 45%的亏损。 我觉得每一轮牛市入场的新人,一开始是很容易赚到钱的。但是要么投入不高,要么卖点不对,绝大多数都会带着更多的资金重返股市,而这个时候才是亏损的开始。 起初股市送了你一笔学费,你不选择去学好相关知识,那就只能让你多交点学费了。 附上自己其中一张基金买卖的截图。
  19. 公司有个海外区块链长期金融项目(职位), 选中我做人才培养储备, 征询我的意见. 我的感觉是现在区块链好像没人提了, 不知未来发展如何, 请业内人士指点现在学区块链 blockchain 的话, 将来有(钱)前景吗? 谢谢
  20. Google 搜了下有好多家。奈飞小铺、奈飞 Pro 之类的。不知道靠不靠谱
  21. 有人安装了吗?和 Pro 比起来怎么样?

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.