Wednesday, January 12, 2022

V2EX - 技术

V2EX - 技术


开发者上班族的副业或出路

Posted: 12 Jan 2022 12:08 AM PST

如题,想问下针对于开发者上班族,想做点副业或者想下未来的出路,之前根据自身情况总结了几个方向:1.接外包 2.做工具类小产品 3.做技术自媒体 4.做跨境电商,虽然总结了自己可以做的几个方向,但是总是看不到什么出路,平常也在这几个方向做过一些尝试到后面也不了了之,想问下各位大佬,您对于个人开发有什么好的规划吗?再次感谢。

百思不得其解: PHP 怎么把一维数组的键值转化为多维数组的键名

Posted: 12 Jan 2022 12:06 AM PST

比如$arr=array('a','b','c','d'); 长度不固定;

要变成$arr['a']['b']['c']['d'], 按照顺序的;

请问有啥办法?

公司裁员了

Posted: 11 Jan 2022 11:59 PM PST

最近经常听到"公司裁员了,有没有内推!",今年的形势这么不好吗?先前有某菇街裁员 30%,不管大厂小厂都有听到裁员的消息。大家伙怎么看???

各位大哥,有谁知道这种图叫什么? 求个搜索关键字。

Posted: 11 Jan 2022 11:58 PM PST

RT, 现在要求画个这样的图,都不知道叫啥。。

https://imgur.com/a/RpMFgeQ

后端程序员转前端,有什么推荐吗

Posted: 11 Jan 2022 11:57 PM PST

最近 5 年一直在做 java 后端,前端还停留在 jquery 框架那一套。最近有时间想重新拿起前端,目标是能做 h5 及小程序开发,大家有推荐的框架及好的项目学习下吗?

2022 PHPer 路在何方?

Posted: 11 Jan 2022 11:57 PM PST

开除员工 是个很艰难的决定

Posted: 11 Jan 2022 11:54 PM PST

昨天下午,新入职约一个月的同事问我一个问题

"说他参考之前代码的实现就是得不到想要的效果"

其实这个问题我在昨天上午已经在 dev 环境留意到了,因为控制台已经给出了提示,我直接先回复他说"检查一下组件是不是没有注册"。

到了快下班时间,他再次过来找我,说这个问题他一筹莫展,搞了一下午没有任何头绪。

于是我到他工位前协助他解决

先看他演示了一下问题所在

然后我开始看代码

不超过 5 分钟即定位到了问题所在,是个很简单的不该出现的问题

import 的组件在 components 里未进行注册 

于是我跟他说了这个事情

他反问道 "他参考的地方并不需要注册"

这时我有点无语了

Vue3 import 已经不需要注册了

但是由于他暂时不熟悉 Vue3 还是采用 Vue2 的方式开发的该组件

这里补充说明一下我们的项目说明:项目整体方案已经升级到了 Vite+Vue3+TS 但是存在大量的 Vue2 组件

在入职前我已经强调了项目目前的方案和整体情况,README.md 里写的已经算是详细且清晰了。

最令人难以接受的是该同事折腾了一晚上,在晚上 10 点多的时候给我发消息说遇到了另一个问题,然后我又远程协助去处理,结果发现是这行代码的问题:

const res = await this.$refs.xxx.someFn 

组件尚未挂载 await 又有什么用呢?况且这里和异步有关系吗?

这是一个有着 10 年工作经验的前端该出现的问题吗?


求解

cnocr 部署在不同机器上,中文识别率不一样。

Posted: 11 Jan 2022 11:54 PM PST

在论坛上搜了大佬们推荐的 ocr 工具,最后使用了 cnocr+cnstd 来识别发票上的文字,开发环境 python install 之后文本识别率提高的,符合业务场景要求。但是部署到生成环境(也是采用 pip install 的方式),中文识别率就变得很低。对比过环境上的模型,都是采用默认的模型( densenet_lite_136-fc )。 有没有用过的大佬来帮忙分析一下,目前想不出还有其他的影响因素。

请教一个 Go 的小白问题

Posted: 11 Jan 2022 11:47 PM PST

请教一个 Go 的小白问题

( A ) func DoSomething(a *A) {         b = a     }  ( B ) func DoSomething(a A) {         b = &a     }     

这两个函数调用的区别具体是什么呢

腾讯会议共享屏幕自动结束, 提示系统分配资源不足

Posted: 11 Jan 2022 11:27 PM PST

这是什么原因导致的? 笔记本是新款的 tp, 11 代酷睿, 内存 16G 的. 内存看着都还很多. 共享屏幕超过半小时就会报这个.

帮同事问的

uni-app 多端小程序选择哪个组件库?

Posted: 11 Jan 2022 11:21 PM PST

看到刚才一个帖子,蛮多商业产品在使用 uni-app ,问下大家都是怎么选择组件库的?

Sony Xperia I iii, App 的后台权限被重置

Posted: 11 Jan 2022 11:16 PM PST

我发现 Spotify 的后台权限,经常被重置。

就是说,我确实已经设置了

  • 不限制后台运行
  • 不优化电池

但是过一段时间,就恢复成默认的"限制后台","优化电池" 了。

有老哥知道是怎么回事么?

请问大家多页面应用怎么做前后端分离?资源定位和前端页面权限控制怎么做?实际项目里是怎么做的?

Posted: 11 Jan 2022 11:05 PM PST

最近在写一个自己的小项目,是一个多页面应用,综合考量下,选择了前后端分离这种架构。

注意,不是单页应用!

某些问题可能有点简单,请多多包涵。

首先,我开始以为的前后端分离是这样的:

  • 服务端负责提供 API (包括权限验证、增删查改、会话)
  • 前端浏览器负责 UI 渲染和逻辑控制,前端相关的 js/css/html 等资源都是静态文件,可以放在 CDN

然后我想到一个路由问题,比如客户端请求了一篇文章的 URL ,该怎么处理? 这里有两种路由格式:

  • /articles/#/1

    nginx 直接返回 /articles.html 或 /articles/index.html ,然后前端解析 hash 并请求相关资源,再渲染出来

  • /articles/1

    这种需要编写 nginx 规则来拆分 URL ,其它基本同上

上面这些遇到简单结构的 URL 还好,但是结构化的复杂的 URL 就不好处理,比如获取用户 1 的文章 1 ,URL 为"/users/1/articles/1",这种又该如何处理?我能想到的是仍然返回 /articles.html 或 /articles/index.html ,然后前端再根据制定的 URL 规则解析处理。

除了路由问题,前端页面的权限控制怎么做?比如有这样一个需求,某些页面只能特定用户访问,任何无权限用户不应该获取到这些页面的任何信息,即便无权限用户根本不能请求相关 API 。

综合上面的问题,我想到一个折中的办法:

  • API 服务端照旧

  • 编写一个"前端"服务端负责前端页面权限验证、管理路由规则,数据获取和操作仍然通过 API 服务。

    比如有这样一个页面"/users/{uid}/dashboard/user-details?uid=xxx",服务端路由 handler 取得客户端的 token ,向 API 服务查询权限, 如果该用户具有某些已标记权限则返回该页面,否则返回 403 或重定向到某页面。

    这样前端服务器仍然可以选择和 API 服务器不一样的技术,可以使用 node 一把梭,也可以用 openresty ,还可以用其它的技术。

  • nginx 只做代理

最后,有更好的办法吗?你们的实际项目又是怎么做的?

请教一下 vue-router 中 addRoute 的问题

Posted: 11 Jan 2022 10:46 PM PST

如题,使用 addRoute 来动态添加路由的时候,从 store 里面调用 actions 的中一个方法从后端获取路由地址。然后再添加到路由中。 代码如下:

router.beforeEach(async (to, from, next) => {   NProgress.start(); // NProgress 开始    if (allowList.includes(to.name)) {     // 若跳转页面非免登录名单,则直接进入     next();   } else {     // 若当前页面需要登录     // 则判断当前页面是否已经拥有登录权限 token     if (storage.get('token')) {       const mainStore = useMainStore();       if (mainStore.routerList === null) {         mainStore.getRouterList().then(res => {           console.log(res)           router.addRoute(res)           next()         })       } else {         next()       }     } else {       // 没有 token 内容,所以进入登录页面       next({ path: '/user' })     }   } }) 

但是浏览器运行到时候却报了警告!

vue-router.esm-bundler.js:72 [Vue Router warn]: The "next" callback was never called inside of : async (to, from, next) => {   NProgress.start(); // NProgress 开始    if (allowList.includes(to.name)) {     // 若跳转页面非免登录名单,则直接进入     next();   } else {     // 若当前页面需要登录     // 则判断当前页面是否已经拥有登录权限 token     if (storage.get('token')) {       const mainStore = useMainStore();       if (mainStore.routerList === null) {         mainStore.getRouterList().then(res => {           console.log(res)           router.addRoute(res)           next()         })       } else {         next()       }     } else {       // 没有 token 内容,所以进入登录页面       next({ path: '/user' })     }   } } . If you are returning a value instead of calling "next", make sure to remove the "next" parameter from your function. 

难道 next 方法不能放在函数中????

来了来了, go 使用 try 来异常处理的实验性小工具

Posted: 11 Jan 2022 10:36 PM PST

https://github.com/ez4o/go-ez

看起来怪怪的

有没有 DDD 开源实战项目推荐?

Posted: 11 Jan 2022 09:49 PM PST

更新 edge 之后,右键「复制指向突出显示的链接」又出现了

Posted: 11 Jan 2022 09:46 PM PST

感觉好牛皮癣啊,开始可以轻松关闭,后来需要很麻烦关闭,好不容易关闭了,早上一更新又出现了。 一直不明白这个功能有什么用,占据了搜索的位置。还不让关。 而且更新为什么要重置的我的设置?太烦人了。

2022 年哪个手势识别库最好用?

Posted: 11 Jan 2022 08:51 PM PST

搜索了下貌似很多都不更新了?

我要做个图片查看器,可以类似手机里的系统图片查看器可以双指放大的那种,貌似一个这种好用的图片查看器 js 组件都没有?说好的前端轮子多呢。我只好自己来了。

最好是有 typescript ,没有的话代码要简单我可以自己改。

求推荐无版权网站

Posted: 11 Jan 2022 08:28 PM PST

自己在日常中,偶尔会用到一些示例素材,如音乐、图片、视频等等,通常都是随便搜一个用一下,本地学习用还无所谓,但是有一些东西需要发布到网上,这时候觉得,这个行为是不尊重版权的。

所以想请教下大家,知不知道有哪些网站,有专门收录无版权的素材,音乐、图片、视频等等都可以。

谢谢!

有没有人能帮我解释一下,这里面的代码.如果我创建一个新窗口,按照这个逻辑,怎么显示出来

Posted: 11 Jan 2022 08:27 PM PST

package com.example.myapplication2

import android.os.Bundle import com.google.android.material.snackbar.Snackbar import androidx.appcompat.app.AppCompatActivity import androidx.navigation.findNavController import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.navigateUp import androidx.navigation.ui.setupActionBarWithNavController import android.view.Menu import android.view.MenuItem import com.example.myapplication2.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

private lateinit var appBarConfiguration: AppBarConfiguration //创建 2 个变量 private lateinit var binding: ActivityMainBinding  override fun onCreate(savedInstanceState: Bundle?) {     super.onCreate(savedInstanceState)      binding = ActivityMainBinding.inflate(layoutInflater)     setContentView(binding.root)      setSupportActionBar(binding.toolbar)      val navController = findNavController(R.id.nav_host_fragment_content_main)     appBarConfiguration = AppBarConfiguration(navController.graph)     setupActionBarWithNavController(navController, appBarConfiguration)      binding.fab.setOnClickListener { view ->         Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)             .setAction("Action", null).show()     } }  override fun onCreateOptionsMenu(menu: Menu): Boolean {     // Inflate the menu; this adds items to the action bar if it is present.     menuInflater.inflate(R.menu.menu_main, menu)     return true }  override fun onOptionsItemSelected(item: MenuItem): Boolean {     return when (item.itemId) {         R.id.action_settings -> true         else -> super.onOptionsItemSelected(item)     } }  override fun onSupportNavigateUp(): Boolean {     val navController = findNavController(R.id.nav_host_fragment_content_main)     return navController.navigateUp(appBarConfiguration)             || super.onSupportNavigateUp() } 

}

我是个萌新,刚学 Kotlin,有没有推荐群一起学习?

按照以上代码,如果我有个按钮 id="create_button" ,按下载入 test_window.xml 窗口. test_window.xml 里面有什么讲究吗?

C 语言,市面上有没有讲软件架构的书

Posted: 11 Jan 2022 08:10 PM PST

市面上很多介绍语法的书,有没有讲架构的,设计小模块到整体过程的书

求分享会主题

Posted: 11 Jan 2022 07:55 PM PST

如题,下周要做分享了,包括但不限于技术方面,技术栈为:Java 、Scala 、大数据。请问各位 V 友有啥好的 idea 吗?

本来想介绍元宇宙的,找了半天资料自己都没弄明白。

2021 年的副业尝试,多做点有长期价值的事

Posted: 11 Jan 2022 07:45 PM PST

过去的皆为序章。2021 年这一篇已经翻过,仔细想想,为自己的 2021 年画个句号。既是回顾自己这一年做的事,也能让自己更多的反思下,好或不好,已经在那里了。

这一年里,我尝试了 4 个方向的事情:

1 、写文章

这一年一共写了 43 篇文章。并开启了每周五发布 [独立开发变现周刊] 的形式

2 、做了 2 个视频课程

  • 《 Electron 实战开发课程》
  • 《 Chrome 浏览器扩展开发》

3 、小产品变现

  • 浏览器插件产品优化后,收入翻倍。
  • ezindie.com 网站重构

4 、做 B 站视频

具体的详细实现过程写在我的博客上: http://liujinkai.com/2022/01/05/2021-summary/

大家可以在评论区分享下 2021 年的收获~

请教 aiohttp clientSession 认证过期带来的重定向问题

Posted: 11 Jan 2022 06:48 PM PST

使用 aiohttp 的背景:

flask 项目需要访问阿里云上部署的 kubeflow api 服务, 这个 api 参数需要使用 query 传递, 因 query 构造过长报了 413,后考虑拆分 query 并发访问服务.

尝试 1 aiphttp + asyncio

大致代码抽象如下

import asyncio import json import re import functools from typing import Dict, List  import aiohttp from loguru import logger   def kubeflow_auth_with_async(func):     """做 kubeflow 的 auth"""     @functools.wraps(func)     async def wrapper(*args, **kwargs):          async with aiohttp.ClientSession() as session:             # login             payload = {                 "username": conf.USERNAME,                 "password": conf.PASSWORD,             }             await session.post(conf.AIX_AUTH_URL, data=payload)             # get req             # async with session.get(conf.PIPELINE_URL) as response:             #     text = await response.text()             response = await session.get(conf.PIPELINE_URL)             text = await response.text()             pattern = r"/dex/auth/aix\?req="             index_beg = re.search(pattern, text).span()             index_end = text.find('"', index_beg[1])             req = text[index_beg[1] : index_end]             params = {"req": req}             # login kubeflow with aix             await session.get(conf.DEX_AUTH_URL, params=params)              return await func(session, *args, **kwargs)      return wrapper   async def async_get_runs(     session: aiohttp.ClientSession,     page_size=1,     page_token=None,     experiment_id=None,     filters=None,     sort_by="created_at desc", ):      if not filters:         filters = {}      query = {         "page_size": page_size,         "page_token": page_token,         "sort_by": sort_by,         "resource_reference_key.type": "EXPERIMENT",         "resource_reference_key.id": experiment_id,         "filter": json.dumps(filters),     }     response = await session.get(         url=f"{conf.PIPELINE_URL}/apis/v1beta1/runs", params=query     )        # async with session.get(     #     url=f"{conf.PIPELINE_URL}/apis/v1beta1/runs", params=query     # ) as response:     # response.raise_for_status()     # return await response.json()      response.raise_for_status()     return await response.json()   @kubeflow_auth_with_async async def gather_fetch_runs(     session: aiohttp.ClientSession,     runs_lst:List[str], ):     exp_id = "xxxxx"     tasks = []     for sub_runs in runs_lst:         filters: dict = {             "predicates": [                 {                     "key": "id",                     "op": FILTER_OPERATIONS.IN.value,                     "string_values": {"values": sub_runs},                  },             ]         }         tasks.append(             async_get_runs(                 session,                 page_size=len(sub_runs),                 experiment_id=exp_id,                 filters=filters,             )         )      return await asyncio.gather(*tasks)   res = [] for r in asyncio.run(gather_fetch_runs(["xxx","xxx","xx"])):     res.extend(r.get("runs", [])) 

请教 V 站大佬

出现的报错,不知道怎么贴图,手动概括一下异常

服务稳定运行一段时间后,会出现突然 500 刷新又可以坚挺一段时间 aiohttp.client_exceptions.ContentypTypeError 从报错信息上看像是 session 失效导致的,被 auth 重定向到了登录页. contentType 变成了 text/html 而请求的 url 重定向到了登录的 url,已经不是我传入的那个  因为没试过 async 函数的装饰器,不知道是不是这个问题, 还有就是 clientSession 的连接池是不是保存了 session 的状态. 装饰器每次都重新请求了.这个 session 按道理不应该还是一样的.  

尝试 2 gevent + request

也试了,没有这个问题,不过访问次数多起来之后容易莫名 GG,大概率是被自己家部署的 kubeflow 反爬了?

scrapy 爬取数据的问题

Posted: 11 Jan 2022 06:29 PM PST

假设要爬取 a 、b 、c url 的页面。但是 b 页面的 url 是从 a url 中获取的,类似的 c 中 b 来。 那么是不是只能通过 yield Requests 嵌套回调函数的形式来解决? 还是有更好的方法呢?

类似如下:

class spider: 	def start_requests:     	yield Requests(url=a)              def parse:     	......         yield Requests(url=b,...,callback=func_b )              def func_b:     	...         yield Requests(url=c,...,callback=func_c )              def func_c:     	...         return item    

另外问下,以上这种情形应该用什么名词。。。

各位大佬们,这个分辨率低的 BUG 怎么修啊?

Posted: 11 Jan 2022 10:20 AM PST

7nr2fH.png [滑稽]

对 delete 和 shared_ptr 的行为 这么理解正确吗?

Posted: 11 Jan 2022 09:16 AM PST

#include <iostream> #include <memory> using namespace std;  class Line { public:     Line(double len, int a);   // 这是构造函数声明     ~Line();  // 这是析构函数声明  private:     double length;     double* nums; };  Line::Line(double len, int a) {     length = len;     nums = new double[a];     cout << "Object is being created" << endl; } Line::~Line(void) {     delete [] nums;     cout << "Object is being deleted" << endl; }  int main() {     Line* line = new Line(1.0, 2);     delete line;      {         shared_ptr<Line> aaa = make_shared<Line>(1.0, 2);     }  	return 0; } 

我对这个程序的理解如下:

delete line;将做出以下动作:

  • 先调用 Line 的析构函数,再释放 line 指向的内存(使用全局的::operator delete )。
    • double 占 8 字节,double*占 4 字节,但考虑内存对齐,所以 line 占的内存为 16 个字节。
  • 在 Line 的析构函数中,执行 delete [] nums;
    • 先调用 double[]的析构函数(话说有这种玩意吗??)
    • 再释放 double[]的内存(使用全局的::operator delete [])

shared_ptr<Line> aaa局部变量做的事情和delete line;一样。

各位大佬看下我的理解对吗

我用我设计的书籍渲染工具,渲染出了站长翻译的 REWORK

Posted: 11 Jan 2022 08:09 AM PST

我的 fork: https://github.com/xieyuheng/rework

我的渲染: https://readonly.link/books/github.com/xieyuheng/rework

会不会还有人不知道 V2EX 的站长是谁?

是他: https://github.com/livid

No comments:

Post a Comment