跳转到内容
彼岸论坛

小天管理

管理员
  • 内容数

    19567
  • 注册日期

  • 最后上线

  • 得奖次数

    5

小天管理 发表的所有内容

  1. 小时候 遇到烦恼的事情,一睡觉就会很快的忘记。 但是现在会过不去了, 什么情况 。 就比如最近遇到的电梯里,劝阻别人不要再电梯里推搡 。 她应该是老一辈的教育方式,想吓唬小孩子,将其拖出电梯 ,说着,你现在给我出去 。 小孩子就抱住母亲的大腿 。 然后母亲就扶着电梯 ,硬要将其拖出去 。 只是吓唬,并没有真的拖出去 。 我就进了电梯,小区的电梯,有点晃 ,嘟囔了一句, 不要再电梯里推搡 。 然后母亲脾气就来了,说,我听到了 ,我教育我的小孩子关你什么事情 。 我说,你有脾气也别朝我发 , 我只是再说,不要再电梯里推搡。 然后母亲就重复那句话,我教育小孩关你屁事,然后小孩子的父亲也朝我说,关你屁事 。 然后我上到回家后,越想越气,然后报警,跟物业联系 , 从物业得知 监控是没有录音的 ,也不能作为辱骂的证据 。 警察也推荐社区调节,他们不管这种民事 。 民事只能去法院起诉 。 当天也是很气,想着睡一觉就好了 , 但是一晚上都在想着如何报复,我控制不住的去想 。 也只是想想 。 如果真的实施我也承受不住代价 。 求助一下, 1 ,我该不该说那句话 。 2 ,我是不是心里扭曲 。 3 ,我该如何去忘记这个事情 。 4 ,因为是在同一幢 , 以后碰到该怎么办 。
  2. 工作找不到,家里人有公司,想去找一些公司接下软件开发的单子,但是不知道怎么去找到客户,不知道有没有 V 友有这方面的经验,想请教一下。。。
  3. 自从几年前去天才吧给我鼓包的 MBP 换电池换了一千五软妹币后,我对 MBP 就没什么好感了 后来主力就在用 Mac mini ,从 M1 换到 M2 Pro ,都挺不错的,风扇都是微微的凉风 虽然 mini 体积本来就不算太大,但总想着要是能再小一点就好了,最好能小到 Apple TV 那么小 名字我都想好了,就叫 Mac micro (狗头 mini 这个模具都用了好多年了,哪怕把电源拿掉换成 type-c 也能小一半吧 或者说,为什么苹果不去做更小的主机呢
  4. 下个版本我们要做前端插件化改造,最近在做技术调研。 大致需求: 前端画布项目,画布左侧有组件库,组件库中的组件可以拖拽到画布进行编排,每个组件有一个参数设置面板。 下个版本,每个组件做成一个插件(当然,有些组件是内置的,无需做成插件),组件插件输出 zip 包,可以上传、安装和卸载插件,主应用动态加载插件。有什么成熟的解决方案吗?
  5. 比如说在视频剪辑的性能上,MacBook Air M3 可以流畅回放的工程,自己配台式机的话,需要什么级别的处理器和显卡?
  6. 个人博客地址: https://penghh.fun RSS 订阅链接: https://penghh.fun/atom.xml
  7. 家里的开点民宿的小买卖,刚上架美团,来了单客人求人家帮忙写了个好评 结果美团发通知判定为刷单行为,订单数据不作数了 然后上小红书搜了下,说是因为好评发送得时候地点要在酒店附近?或者客户的行动轨迹要在当地 这我就纳闷了,那像我这样 位置权限都不放开给 app 的,或者说旅行期间没打开过美团的,岂不是都算刷单,有没哥们儿能帮我分析分析的。
  8. 前言 最近写了一个小程序, 后端用 springboot 搭建的单体, 鉴权就是使用的springboot + security 因为实现方式和网上检索的教程有些差异, 所以想请教一下, 接入 security 的正确打开方式是什么 正文 我会先讲解一下我的实现思路, 实现方法, 设计思路, 思路来源等等 然后举例说明网络检索的实现方式和差异 接着倒出我的疑惑, 不吝赐教, 烦请指正 项目结构 ├── security │ ├── config │ │ └── WebSecurityConfiguration.java │ ├── filter │ │ ├── GlobalBearerAuthenticationConverter.java │ │ └── GlobalBearerTokenAuthenticationFilter.java │ ├── handler │ │ ├── GlobalAccessDeniedHandler.java │ │ ├── GlobalAuthenticationEntryPoint.java │ │ ├── GlobalAuthenticationFailureHandler.java │ │ └── GlobalAuthenticationSuccessHandler.java │ ├── holder │ │ └── UserHolder.java │ ├── impl │ │ ├── GlobalAuthenticationFilter.java │ │ ├── GlobalAuthenticationProvider.java │ │ ├── GlobalAuthenticationToken.java │ │ ├── phone │ │ │ ├── program │ │ │ │ └── mini │ │ │ │ └── wechat │ │ │ │ ├── WeChatMiniProgramAuthenticationFilter.java │ │ │ │ ├── WeChatMiniProgramAuthenticationProvider.java │ │ │ │ └── WeChatMiniProgramAuthenticationToken.java │ │ │ └── sms │ │ │ ├── PhoneSmsAuthenticationFilter.java │ │ │ ├── PhoneSmsAuthenticationProvider.java │ │ │ └── PhoneSmsAuthenticationToken.java │ │ └── refresh │ │ ├── RefreshAuthenticationFilter.java │ │ ├── RefreshAuthenticationProvider.java │ │ └── RefreshAuthenticationToken.java │ ├── properties │ │ ├── JwtProperties.java │ │ └── WebSecurityProperties.java │ ├── service │ │ ├── GlobalUserDetailsChecker.java │ │ ├── GlobalUserDetailsService.java │ │ └── UserInitService.java │ └── source │ ├── GlobalWebAuthenticationDetails.java │ └── GlobalWebAuthenticationDetailsSource.java 思路讲解 阅读源码 UsernamePasswordAuthenticationFilter public class UsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter { public static final String SPRING_SECURITY_FORM_USERNAME_KEY = "username"; public static final String SPRING_SECURITY_FORM_PASSWORD_KEY = "password"; private static final AntPathRequestMatcher DEFAULT_ANT_PATH_REQUEST_MATCHER = new AntPathRequestMatcher("/login", "POST"); private String usernameParameter = SPRING_SECURITY_FORM_USERNAME_KEY; private String passwordParameter = SPRING_SECURITY_FORM_PASSWORD_KEY; private boolean postOnly = true; public UsernamePasswordAuthenticationFilter() { super(DEFAULT_ANT_PATH_REQUEST_MATCHER); } public UsernamePasswordAuthenticationFilter(AuthenticationManager authenticationManager) { super(DEFAULT_ANT_PATH_REQUEST_MATCHER, authenticationManager); } @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { if (this.postOnly && !request.getMethod().equals("POST")) { throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod()); } String username = obtainUsername(request); username = (username != null) ? username : ""; username = username.trim(); String password = obtainPassword(request); password = (password != null) ? password : ""; UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password); // Allow subclasses to set the "details" property setDetails(request, authRequest); return this.getAuthenticationManager().authenticate(authRequest); } 这是 Spring Security 中非常关键的一个基类, 等同于 Spring 框架原生态的给了你一个实现模板, 以常见的 username/password 的形式, 实现了基本的鉴权入口 private static final AntPathRequestMatcher DEFAULT_ANT_PATH_REQUEST_MATCHER = new AntPathRequestMatcher("/login","POST"); 这行代码决定了这个 Filter 只用来处理 Http 接口路径 为 /login 的请求 解析参数 String username = obtainUsername(request); username = (username != null) ? username : ""; username = username.trim(); String password = obtainPassword(request); password = (password != null) ? password : ""; 本质就是读取 Query 参数, 没有非常深入的东西 构建 Authentication UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password); UsernamePasswordAuthenticationToken 这个类是比较重要 Authentication 类, 基本就相当于持有鉴权 未认证前, 存储 username/password/detail 认证后, 存储服务端发放的认证信息, 比如 Token?Cookie?Session?Or Other? 构建 Detail setDetails(request, authRequest); 这个 details 本质上也是 Authentication 中比较重要的东西, 可以用来解析和存储鉴权相关的数据, 比如请求头解析, UA/IP/Token/SessionId/Cookies 等等, 具体看想怎么用 鉴权验证 return this.getAuthenticationManager().authenticate(authRequest); getAuthenticationManager().authenticate()这是一段非常关键的代码, 因为此刻会进入 Security 除了 Filter 以外, 另外一个非常重要的概念, Provider, 也就是 AuthenticationProvider public interface AuthenticationProvider { Authentication authenticate(Authentication authentication) throws AuthenticationException; boolean supports(Class<?> authentication); } 他的作用就是接收未认证前的 Authentication, 进行解析,验证等操作, 然后返回认证后的 Authentication 同时 supports(Class<?> authentication)函数则是为了区分不同的 Authentication 寻找思路 基于以上源码可知, Security 最基本的几个单元已经找到了 Filter Authentication Provider 请求进入 Web 容器, 经由过滤器, 当 Filter 判断请求路径为登录请求, 则根据参数生成未认证 Authentication, 然后将未认证 Authentication 交由 Provider 进行认证, 并返回认证后的 Authentication Filter 可以制定请求路径, 可以处理一个或者多个请求路径 Authentication 可以制定存储单元, 不同的登陆方式存储单元不同 Provider 可以进行认证, 可以根据不同的 Authentication 来处理 基于以上结论, 那么我的基本思路是不是就可以有了 于是乎, 就有了以下设计方案 设计思路 public abstract class GlobalAuthenticationFilter extends AbstractAuthenticationProcessingFilter { private final HttpMethod method; public GlobalAuthenticationFilter(String pattern, HttpMethod method) { super(new AntPathRequestMatcher(pattern, method.name()), SpringUtil.getBean(AuthenticationManager.class)); this.method = method; } @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException { if (!method.matches(request.getMethod())) { throw new AuthenticationServiceException("登陆请求协议不支持"); } GlobalAuthenticationToken authentication = combinationAuthentication(request); return getAuthenticationManager().authenticate(authentication); } public abstract GlobalAuthenticationToken combinationAuthentication(HttpServletRequest request) throws IOException; 我先定义一个全局抽象 Filter 基类 GlobalAuthenticationFilter, 将必要的 Filter 实现流程定义好 然后将请求路径和协议, 通过构造函数的形式, 限制子实现的基本构造 定义一个 combinationAuthentication 函数, 将参数的解析和无认证的 Authentication 生成交由子实现 public class GlobalAuthenticationToken extends AbstractAuthenticationToken { private final Object principal; private final Object credentials; public GlobalAuthenticationToken(Object principal) { this(principal, null); } public GlobalAuthenticationToken(Object principal, Object credentials) { this(principal, credentials, null); } public GlobalAuthenticationToken(Object principal, Object credentials, Object details) { super(AuthorityUtils.NO_AUTHORITIES); this.principal = principal; this.credentials = credentials; setDetails(details); } public GlobalAuthenticationToken( Object principal, Object credentials, Object details, Collection<? extends GrantedAuthority> authorities ) { super(authorities); this.principal = principal; this.credentials = credentials; setDetails(details); setAuthenticated(true); } public static GlobalAuthenticationToken unauthenticated(Object principal) { return new GlobalAuthenticationToken(principal); } public static GlobalAuthenticationToken unauthenticated(Object principal, Object credentials) { return new GlobalAuthenticationToken(principal, credentials); } public static GlobalAuthenticationToken unauthenticated(Object principal, Object credentials, Object details) { return new GlobalAuthenticationToken(principal, credentials, details); } public static GlobalAuthenticationToken authenticated(Object principal) { return new GlobalAuthenticationToken(principal, null, null, AuthorityUtils.NO_AUTHORITIES); } public static GlobalAuthenticationToken authenticated(Object principal, Object credentials) { return new GlobalAuthenticationToken(principal, credentials, null, AuthorityUtils.NO_AUTHORITIES); } public static GlobalAuthenticationToken authenticated(Object principal, Object credentials, Object details) { return new GlobalAuthenticationToken(principal, credentials, details, AuthorityUtils.NO_AUTHORITIES); } @Override public Object getCredentials() { return credentials; } @Override public Object getPrincipal() { return principal; } } 我先定义一个全局 Authentication 基类 GlobalAuthenticationToken, 包含基本的 principal/credentials 以及源于 AbstractAuthenticationToken 的 detail 和 authorities 因为某些鉴权场景的特殊性, 我将构造函数尽可能全面的限制, 以防子实现出现缺漏, 并提供了足够的静态函数来支撑, 简化构造流程 @SuppressWarnings("unchecked") public abstract class GlobalAuthenticationProvider<AuthenticationToken extends Authentication> implements AuthenticationProvider { private final Class<AuthenticationToken> clazz; @Resource private UserDetailsService userDetailsService; @Resource private UserDetailsChecker userDetailsChecker; { Type superClass = getClass().getGenericSuperclass(); if (superClass instanceof ParameterizedType) { this.clazz = (Class<AuthenticationToken>) ((ParameterizedType) superClass).getActualTypeArguments()[0]; } else { throw new IllegalArgumentException("泛型类型未找到"); } } @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { String username = validate4Username((AuthenticationToken) authentication); UserDetails userDetails = userDetailsService.loadUserByUsername(username); userDetailsChecker.check(userDetails); GlobalAuthenticationToken token = GlobalAuthenticationToken.authenticated(userDetails, null, authentication.getDetails()); token.setDetails(authentication.getDetails()); return token; } public abstract String validate4Username(AuthenticationToken authentication); @Override public boolean supports(Class<?> authentication) { return clazz.isAssignableFrom(authentication); } } 我先定义一个全局抽象 Provider 基类 GlobalAuthenticationProvider, 并严格按照 Provider 的核心思路进行固有实现 通过泛型参数将 supports(Class<?> authentication)默认处理 定义抽象函数 abstract String validate4Username(AuthenticationToken authentication) 交由子类进行认证逻辑 其中有涉及到两个重点实现 @Resource private UserDetailsService userDetailsService; @Resource private UserDetailsChecker userDetailsChecker; public interface UserDetailsService { UserDetails loadUserByUsername(String username) throws UsernameNotFoundException; } public interface UserDetailsChecker { void check(UserDetails toCheck); } 同样也是 Security 中较为核心的接口定义 其中 UserDetailsService 提供了开放实现接口 loadUserByUsername UserDetailsChecker 提供了 check 前者用来获取相关用户信息 后者用来校验相关用户信息 比如我的默认实现 @Slf4j @Service @RequiredArgsConstructor public class GlobalUserDetailsService implements UserDetailsService { private final UserService userService; @Override public UserDetails loadUserByUsername(String phone) throws UsernameNotFoundException { try { return Optional.ofNullable(userService.getByPhoneIncludeDelete(phone)) .orElseGet(() -> userService.newUser(phone)); } catch (Exception e) { log.error("加载用户失败={}", e.getMessage(), e); throw new UsernameNotFoundException("手机号异常", e); } } } @Component public class GlobalUserDetailsChecker implements UserDetailsChecker { @Override public void check(UserDetails user) { Assert.isTrue(user.isAccountNonLocked(), () -> new LockedException("账户已锁定")); Assert.isTrue(user.isEnabled(), () -> new DisabledException("账户已禁用")); Assert.isTrue(user.isAccountNonExpired(), () -> new AccountExpiredException("账户已过期")); Assert.isTrue(user.isCredentialsNonExpired(), () -> new CredentialsExpiredException("账户认证已过期")); } } 以上只是一个很简略的认证实现 具体实现 如我在[项目结构] 中展示的 我分别基于以上抽象, 实现了, 手机号/短信验证码 鉴权认证逻辑 @Component public class PhoneSmsAuthenticationFilter extends GlobalAuthenticationFilter { public static final String SPRING_SECURITY_FORM_PHONE_KEY = "phone"; public static final String SPRING_SECURITY_FORM_SMS_CODE_KEY = "smsCode"; public static final String SPRING_SECURITY_FROM_URI_PATTEN = "/**/user/login/phone"; public static final HttpMethod SPRING_SECURITY_FROM_METHOD = HttpMethod.GET; public PhoneSmsAuthenticationFilter() { super(SPRING_SECURITY_FROM_URI_PATTEN, SPRING_SECURITY_FROM_METHOD); } @Override public GlobalAuthenticationToken combinationAuthentication(HttpServletRequest request) { String phone = StrUtil.nullToEmpty( StrUtil.cleanBlank(request.getParameter(SPRING_SECURITY_FORM_PHONE_KEY))); String smsCode = StrUtil.nullToEmpty( StrUtil.cleanBlank(request.getParameter(SPRING_SECURITY_FORM_SMS_CODE_KEY))); GlobalWebAuthenticationDetails details = (GlobalWebAuthenticationDetails) authenticationDetailsSource.buildDetails( request); details .setClientType(ClientType.WeChatMiniProgram) .setLoginType(LoginType.PhoneSms); return new PhoneSmsAuthenticationToken(phone, smsCode, details); } } @Getter public class PhoneSmsAuthenticationToken extends GlobalAuthenticationToken { private final String phone; private final String smsCode; public PhoneSmsAuthenticationToken(String phone, String smsCode, Object details) { super(phone, smsCode, details); this.phone = phone; this.smsCode = smsCode; } } @Component @RequiredArgsConstructor public class PhoneSmsAuthenticationProvider extends GlobalAuthenticationProvider<PhoneSmsAuthenticationToken> { private final SmsService smsService; @Override public String validate4Username(PhoneSmsAuthenticationToken authentication) { String phone = authentication.getPhone(); String smsCode = authentication.getSmsCode(); String ip = ((GlobalWebAuthenticationDetails) authentication.getDetails()).getIp(); smsService.verifySmsCode(phone, ip, smsCode); return phone; } } 实现了, 微信小程序手机号快速验证 鉴权认证逻辑 @Component public class WeChatMiniProgramAuthenticationFilter extends GlobalAuthenticationFilter { public static final String SPRING_SECURITY_FORM_APP_ID_KEY = "appId"; public static final String SPRING_SECURITY_FORM_PHONE_CODE_KEY = "phoneCode"; public static final String SPRING_SECURITY_FROM_URI_PATTEN = "/user/login/wechat/miniapp"; public static final HttpMethod SPRING_SECURITY_FROM_METHOD = HttpMethod.POST; public WeChatMiniProgramAuthenticationFilter() { super(SPRING_SECURITY_FROM_URI_PATTEN, SPRING_SECURITY_FROM_METHOD); } @Override public GlobalAuthenticationToken combinationAuthentication(HttpServletRequest request) throws IOException { JSONObject paramJson = JSONUtil.parseObj(IoUtil.read(request.getInputStream(), StandardCharsets.UTF_8)); String appId = paramJson.getStr(SPRING_SECURITY_FORM_APP_ID_KEY); String phoneCode = paramJson.getStr(SPRING_SECURITY_FORM_PHONE_CODE_KEY); GlobalWebAuthenticationDetails details = (GlobalWebAuthenticationDetails) authenticationDetailsSource.buildDetails( request); details .setClientType(ClientType.WeChatMiniProgram) .setLoginType(LoginType.WeChatMiniProgram); return new WeChatMiniProgramAuthenticationToken(appId, phoneCode, details); } } @Getter public class WeChatMiniProgramAuthenticationToken extends GlobalAuthenticationToken { private final String appId; private final String phoneCode; public WeChatMiniProgramAuthenticationToken(String appId, String phoneCode, Object details) { super(appId, phoneCode, details); this.appId = appId; this.phoneCode = phoneCode; } } @Component @RequiredArgsConstructor public class WeChatMiniProgramAuthenticationProvider extends GlobalAuthenticationProvider<WeChatMiniProgramAuthenticationToken> { private final WxMiniAppService wxMiniAppService; @Override public String validate4Username(WeChatMiniProgramAuthenticationToken authentication) { if (ApplicationTools.isNotProd()) { throw new BadCredentialsException("当前环境不支持该登录方式!"); } String appId = authentication.getAppId(); String phoneCode = authentication.getPhoneCode(); if (!wxMiniAppService.switchover(appId)) { throw new BadCredentialsException(StrUtil.format("未找到对应微信小城 AppId=[{}]配置,请核实后重试", appId)); } WxMaPhoneNumberInfo phoneNoInfo; try { phoneNoInfo = wxMiniAppService .getUserService() .getPhoneNoInfo(phoneCode); } catch (WxErrorException e) { throw new BadCredentialsException(e .getError() .getErrorMsg()); } return phoneNoInfo.getPurePhoneNumber(); } } 实现了, 通过 refreshToken 刷新 Token 鉴权认证逻辑 篇幅有限, 这里就不继续贴代码了 基于此, 甚至还可以实现各类情况的鉴权认证过程, 不局限以上 Oauth2 的认证流程实现肯定是不一样的, 暂时不在此进行讨论 网络检索 类似直接写一个 Controller, 以常规化的 controller->service->dao(mapper)的方式, 比比皆是 当然也同样检索到类似我上述实现方式的文章, 只是大同小异 疑惑 以上是 Security 的正确打开方式? 还有其他实现思路和方案吗? 我自己的实现方式, 始终给我一种不够优雅, 不够简洁, 甚至于不方便定位的感觉 所以我想请教佬们关于这一点的看法
  9. Infuse 一年 18 优惠,非常适合小雅 emby 媒体库,apple tv 用户强烈推荐 优惠地址地址: https://firecore.cn/promo 小雅影视媒体库全家桶 永久免费的小雅 EMBY 媒体库全家桶搭建教程 https://xiaoyahost.pro/meitiku/xiaoyaemby/ tvOS 「 AppleTV 」上使用 小雅 xiaoya 媒体库 EMBY https://xiaoyahost.pro/appletv/emby/
  10. 目前的设备是 Mac mini 16 + 256G 版本,但是使用了一年多发现现在不够用了。 目前使用 Flutter 开发 ios 和 android 的软件。同时在开发软件的同时需要打开 Xcode 调试,并且还需要打开 Idea 跑一个 Springboot 的后端服务+一个后台管理的页面。 其他就是一些常见的软件,比如微信、QQ 什么的聊天软件,通常需要挂到后台。 需求:目前想使用 Macbook ,不想使用 mac mini 了,不知道各位有什么好的建议,预算大概在 10000 左右。 大家有什么好的建议没呢
  11. I wanted to share some job opportunities at TikTok. we are TikTok Global E-commerce Customer Business team. Our product engineering team is responsible for building an e-commerce ecosystem that is innovative, secure and intuitive for our users. We're currently hiring for mobile engineers at all levels in Seattle. We look forward to having you on board! Jobs details: - Tech Lead - Android Software Engineer: https://careers.tiktok.com/s/i6B6m5Sb - Tech Lead - IOS Software Engineer: https://careers.tiktok.com/s/i6B6XXSo - Senior Android Software Engineer: https://careers.tiktok.com/s/i6B67hUu - Senior iOS Software Engineer: https://careers.tiktok.com/s/i6BMLHLv - Software Engineer: https://careers.tiktok.com/s/i6BMeBPB 我们这边主要是 TT 电商,大前端基础架构的,会负责整个 TT 电商在大前端方向的性能优化和基建的工作,目前主要的 HC 在西雅图,合适的朋友欢迎加入~
  12. 由于没有美区 Paypal ,一直都是用礼品卡充值。不知道 iCloud+能不能余额来开通?
  13. 从来没用过这个 app,但是天天打骚扰电话
  14. 游戏行业卷了很多年 Unity 游戏开发者 主导设计过很多个游戏常用的框架,系统 上线的游戏产品有几个千万级别的 年龄 30+ 问题 主要使用的语言是 C#; 用过:JavaScript,TypeScript ,Objective-C ,C ,等等 (当然用过仅仅是因为项目中有一些需要源生功能需要) 目前厌倦了游戏行业,想转别的行业,但是一时又不知道向着哪个方向转 Reddit 上看了几篇同样想从 unity 转的,都是 .net 方向的 想听听 V 友的建议 谢谢
  15. 细化一下需求: AI 生产力:跑跑 SD ,跑跑 LLM ( 70B ?) 游戏娱乐:Stream 游戏(艾尔登法环) 预算范围:15000 (不含显示器、鼠键)
  16. 公司在香港,岗位是纯技术,公司主营发币,工资发 usdt ,这样的岗位有米有法律风险。 有了解的大佬愿意聊聊么。
  17. 看了些信息,都说 WiFi 信号不好,另外就是品控看脸。 不玩游戏,纯家用和轻办公,买这个是否合适? 另外,自己单买内存硬盘(如机器同品牌型号的)是否比直接带的价格更有性价比,还是买配好的?
  18. 前几天跟装维聊天 装维说上海电信现在大流量用户拨号会分到 116.网段。 主要是针对 PCDN 用户,说 116 网段会跑不起来。 我看了一下,我家和我同事家都在 116 网段了,我 pt 用户,暂时没发现啥影响,连接性什么的。
  19. 试驾宋 L ,动力啥的都满意,就是过坎的时候后排有点颠簸 试驾 N7 ,感觉的确质感上提升了很多,后排都是电动调节加按摩,屏幕多了很多,音响也好了不少。但是后排车窗有点小,贵了 2 万,和宋 L 顶配比没有智驾和四驱
  20. 远程岗位 远程岗位 远程岗位 职责 负责澳洲生活缴费平台的开发、接口对接。 所需技能和经验: 熟悉各种支付通道对接(支付宝、微信、各种信用卡、paypal 等) 熟悉支付流程 熟悉 laravel 框架,并使用 laravel 框架开发非前后端分离项目与前后端分离项目的经验 工作时间: 大小周 10:00-19:00 午休两小时 薪资区间: 8-13K 联系方式: Email: ansonyims@gmail.com
  21. ?si=XQJR8uwgAcbqASeG 无论怎么说,只有用过一段时间才能知道这是正经的优化手段还是纯整活的操作 很显然软盘已经退出历史舞台,但是 Windows 的盘符仍然从 C 开始。所以我就想,既然 Windows 的引导方式已经不依赖软盘,那能不能让 Windows 的盘符改成别的?于是就找到了这个视频。 这位老哥是在虚拟机上弄的,我在物理机上复现了一遍,把 Windows 盘符改成了 A 。目前没发现什么严重的错误提示,可以正常添加用户和对应的权限;如果电脑里没别的主分区,虚拟内存和休眠功能是默认禁用的,如果有第二个主分区,系统会给这个分区分配成 C 盘,页面文件和休眠文件就放在这里;绝大部分 UWP 应用能正常运行,appx 文件也可以正常安装,但我发现我其中一个 OEM 驱动安装程序运行不了; Windows Update 也能正常更新。 作者说过了,永远不要把除 C 以外的字母用作系统盘,因为有些应用只认 C 盘。所以我想知道,把系统盘符改了之后还适合日常乃至长期使用么?这也许能防御大多数病毒和流氓软件?
  22. Anki 卡组详见: https://v2ex.com/t/1015472 新建了一个 Anki 日语学习交流群,主要讨论(基于 Anki 的)日语学习、日本留学工作生活等和日本相关的内容。欢迎大家加群闲聊。 群链接: https://t.me/ankijapan ,或在 Telegram 中直接搜索 AnkiJapan 加入。
  23. 之前开土区全家桶大概 500RMB 一年,现在涨到 4k 多实在吃不消。听人说阿根廷便宜,但是现在风控很严,容易被 ban 是真的吗? ip 和信用卡的问题都能解决,求大佬指点
  24. 黄金一号都要 110 120 了,以前 75.。。我还嫌弃不喜欢买
  25. 一个小团队整出来的,https://www.zijizhang.com/u/qianduanren 一个简化独立开发者和个体户记账麻烦的 app, 确实牛逼,之前找人代记账,每年基本最少 1000+,现在自己可以在手机上记账报税了,一年 200 多就搞定了,推荐给各位大佬,喜欢的点赞,独立开发者不容易
×
×
  • 创建新的...