ponponon

ponponon 查看完整档案

杭州编辑浙江树人大学  |  电子信息工程 编辑  |  填写所在公司/组织 resume.myuniverse.ltd 编辑
编辑

喜欢科技
喜欢IT
喜欢写代码
各种有科技味软硬件都有浓厚兴趣,从小学开始就爱上了硬件DI Y,上了大学开启了专业的学习之 路喜欢c语言,更喜欢python。
自学过深度学习、web后端、web 前端、网络爬虫、数据分析、量化 交易。
一个键盘一个鼠标一个电脑能坐一 整天
QQ:172930158

个人动态

ponponon 发布了文章 · 4月7日

看完这篇,你还敢贸然升级Django3吗?django2升级django3的坑

django 是世界上最好的web框架,并在四月六号正式升级为 django3.2 ,这是 djangolts 版本
image.png
如果你打算从 django2.2 升级到 django3.2 那这篇文章很适合你,因为我帮你踩了很多坑。

![上传中...]()
image.png

├─apps
│  ├─index
│  │  ├─migrations
│  │  ├─templates
│  │  ├─templatetags
│  ├─product
│  │  ├─migrations
│  │  ├─templates
│  └─users
│      ├─migrations
│      ├─templates
├─freshshop
│  └─__pycache__
├─media
│  └─product_imgs
├─static
│  └─assets
│      ├─css
│      ├─fonts
│      ├─img
│      └─js
├─templates

apps命令

问题描述

我喜欢将创建的app单独放在一个apps文件夹中

但是在django3中这样做会遇到如下报错

  File "C:\Users\17293\AppData\Local\Programs\Python\Python38\lib\site-packages\django\core\management\__init__.py", line 375, in execute
    autoreload.check_errors(django.setup)()
  File "C:\Users\17293\AppData\Local\Programs\Python\Python38\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\17293\AppData\Local\Programs\Python\Python38\lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Users\17293\AppData\Local\Programs\Python\Python38\lib\site-packages\django\apps\registry.py", line 91, in populate
    app_config = AppConfig.create(entry)
  File "C:\Users\17293\AppData\Local\Programs\Python\Python38\lib\site-packages\django\apps\config.py", line 246, in create
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Cannot import 'index'. Check that 'apps.index.apps.IndexConfig.name' is correct.

报错原因

待填

解决办法

apps.appname.apps.py处的name属性修改为apps.appname

默认是这样,但是会报错

from django.apps import AppConfig
class IndexConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'index'

修改为

from django.apps import AppConfig
class IndexConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'apps.index'

templates没有提示

问题描述

按照习惯会在根目录下创建一个templates文件夹,在文件夹中方式公共的模板,例如 base.html

但是此处遇到了一个问题,就是pycharm无法识别django3下的templates的内容(app下的templates是可以的,根目录的不行)

问题原因

django2BASE_DIR 使用 os 模块生成,而在 django3 中改成了 pathlib 模块的 Path 类,生成的BASE_DIR 也从字符串变成了 WindowsPath 类实例,因此 pycharm 无法识别(获取未来的pycharm版本会支持)
image.png

解决办法

手动改回 os 模块

查看原文

赞 0 收藏 0 评论 0

ponponon 发布了文章 · 4月4日

千万注意!下载java不要踩的坑!!

下载java,就遇到下面三个网站

https://www.oracle.com/java/t...

https://www.java.com/zh-CN/

https://openjdk.java.net/

第一个是最好的

第二个是下载jre的,也就是用来运行java class的,不是用来开发和学习的,想当程序员请远离

第三个是java的开源版本,最新只有9(或许有新的,但肯定很难找到),不推荐

查看原文

赞 0 收藏 0 评论 0

ponponon 发布了文章 · 4月4日

常见消息队列

赞 0 收藏 0 评论 0

ponponon 收藏了文章 · 3月31日

浅谈 JS 防抖和节流

防抖和节流严格算起来应该属于性能优化的知识,但实际上遇到的频率相当高,处理不当或者放任不管就容易引起浏览器卡死。所以还是很有必要早点掌握的。(信我,你看完肯定就懂了)

从滚动条监听的例子说起

先说一个常见的功能,很多网站会提供这么一个按钮:用于返回顶部。
返回顶部按钮

这个按钮只会在滚动到距离顶部一定位置之后才出现,那么我们现在抽象出这个功能需求-- 监听浏览器滚动事件,返回当前滚条与顶部的距离
这个需求很简单,直接写:

function showTop  () {
    var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
  console.log('滚动条位置:' + scrollTop);
}
window.onscroll  = showTop

但是!

图片描述

在运行的时候会发现存在一个问题:这个函数的默认执行频率,太!高!了!。 高到什么程度呢?以chrome为例,我们可以点击选中一个页面的滚动条,然后点击一次键盘的【向下方向键】,会发现函数执行了8-9次
图片描述

然而实际上我们并不需要如此高频的反馈,毕竟浏览器的性能是有限的,不应该浪费在这里,所以接着讨论如何优化这种场景。

防抖(debounce)

基于上述场景,首先提出第一种思路:在第一次触发事件时,不立即执行函数,而是给出一个期限值比如200ms,然后:

  • 如果在200ms内没有再次触发滚动事件,那么就执行函数
  • 如果在200ms内再次触发滚动事件,那么当前的计时取消,重新开始计时

效果:如果短时间内大量触发同一事件,只会执行一次函数。

实现:既然前面都提到了计时,那实现的关键就在于setTimeout这个函数,由于还需要一个变量来保存计时,考虑维护全局纯净,可以借助闭包来实现:

/*
* fn [function] 需要防抖的函数
* delay [number] 毫秒,防抖期限值
*/
function debounce(fn,delay){
    let timer = null //借助闭包
    return function() {
        if(timer){
            clearTimeout(timer) //进入该分支语句,说明当前正在一个计时过程中,并且又触发了相同事件。所以要取消当前的计时,重新开始计时
            timer = setTimeout(fn,delay) 
        }else{
            timer = setTimeout(fn,delay) // 进入该分支说明当前并没有在计时,那么就开始一个计时
        }
    }
}

当然 上述代码是为了贴合思路,方便理解(这么贴心不给个赞咩?),写完会发现其实 time = setTimeout(fn,delay)是一定会执行的,所以可以稍微简化下:


/*****************************简化后的分割线 ******************************/
function debounce(fn,delay){
    let timer = null //借助闭包
    return function() {
        if(timer){
            clearTimeout(timer) 
        }
        timer = setTimeout(fn,delay) // 简化写法
    }
}
// 然后是旧代码
function showTop  () {
    var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
  console.log('滚动条位置:' + scrollTop);
}
window.onscroll = debounce(showTop,1000) // 为了方便观察效果我们取个大点的间断值,实际使用根据需要来配置

此时会发现,必须在停止滚动1秒以后,才会打印出滚动条位置。

到这里,已经把防抖实现了,现在给出定义:

  • 对于短时间内连续触发的事件(上面的滚动事件),防抖的含义就是让某个时间期限(如上面的1000毫秒)内,事件处理函数只执行一次。

节流(throttle)

继续思考,使用上面的防抖方案来处理问题的结果是:

  • 如果在限定时间段内,不断触发滚动事件(比如某个用户闲着无聊,按住滚动不断的拖来拖去),只要不停止触发,理论上就永远不会输出当前距离顶部的距离。

但是如果产品同学的期望处理方案是:即使用户不断拖动滚动条,也能在某个时间间隔之后给出反馈呢?(此处暂且不论哪种方案更合适,既然产品爸爸说话了我们就先考虑怎么实现)
图片描述

其实很简单:我们可以设计一种类似控制阀门一样定期开放的函数,也就是让函数执行一次后,在某个时间段内暂时失效,过了这段时间后再重新激活(类似于技能冷却时间)。

效果:如果短时间内大量触发同一事件,那么在函数执行一次之后,该函数在指定的时间期限内不再工作,直至过了这段时间才重新生效。

实现 这里借助setTimeout来做一个简单的实现,加上一个状态位valid来表示当前函数是否处于工作状态:

function throttle(fn,delay){
    let valid = true
    return function() {
       if(!valid){
           //休息时间 暂不接客
           return false 
       }
       // 工作时间,执行函数并且在间隔期内把状态位设为无效
        valid = false
        setTimeout(() => {
            fn()
            valid = true;
        }, delay)
    }
}
/* 请注意,节流函数并不止上面这种实现方案,
   例如可以完全不借助setTimeout,可以把状态位换成时间戳,然后利用时间戳差值是否大于指定间隔时间来做判定。
   也可以直接将setTimeout的返回的标记当做判断条件-判断当前定时器是否存在,如果存在表示还在冷却,并且在执行fn之后消除定时器表示激活,原理都一样
    */

// 以下照旧
function showTop  () {
    var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
  console.log('滚动条位置:' + scrollTop);
}
window.onscroll = throttle(showTop,1000) 

运行以上代码的结果是:

  • 如果一直拖着滚动条进行滚动,那么会以1s的时间间隔,持续输出当前位置和顶部的距离

其他应用场景举例

讲完了这两个技巧,下面介绍一下平时开发中常遇到的场景:

  1. 搜索框input事件,例如要支持输入实时搜索可以使用节流方案(间隔一段时间就必须查询相关内容),或者实现输入间隔大于某个值(如500ms),就当做用户输入完成,然后开始搜索,具体使用哪种方案要看业务需求。
  2. 页面resize事件,常见于需要做页面适配的时候。需要根据最终呈现的页面情况进行dom渲染(这种情形一般是使用防抖,因为只需要判断最后一次的变化情况)

思考总结

上述内容基于防抖和节流的核心思路设计了简单的实现算法,但是不代表实际的库(例如undercore js)的源码就直接是这样的,最起码的可以看出,在上述代码实现中,因为showTop本身的很简单,无需考虑作用域和参数传递,所以连apply都没有用到,实际上肯定还要考虑传递argument以及上下文环境(毕竟apply需要用到this对象)。这里的相关知识在本专栏《柯里化》和《this对象》的文章里也有提到。本文依然坚持突出核心代码,尽可能剥离无关功能点的思路行文因此不做赘述。


惯例:如果内容有错误的地方欢迎指出(觉得看着不理解不舒服想吐槽也完全没问题);如果有帮助,欢迎点赞和收藏,转载请征得同意后著明出处,如果有问题也欢迎私信交流,主页有邮箱地址

查看原文

ponponon 关注了用户 · 3月31日

安歌 @linlinma

RingCentral厦门前端,随缘答题,不定期写文章。

---小广告分割线---
RingCentral厦门、杭州地区目前有大量hc(可以长期远程办公).
朝九晚五,不打卡不加班;
年假超长,入职即享10天起;
免费英文口语课,帮助提升口语;
需要内推请私信或投递简历到邮箱
ma13635251979@163.com(微信13635251979)
全程跟进面试进度,提供力所能及的咨询帮助~

关注 949

ponponon 发布了文章 · 3月30日

vagrant ssh Bad owner or permissions on

报错代码

vagrant ssh
Bad owner or permissions on C:\\Users\\17293/.ssh/config

在通过vagrant登录本地的ubuntu18虚拟机的时候,遇上了这个报错。

解决办法 :
错误方法: 删除 config 这个文件(这个方法有用,但是不应该这样做,会影响其他ssh功能)
正确方法: 把 虚拟机的信息填写到config 文件中

image.png

image.png

查看原文

赞 0 收藏 0 评论 0

ponponon 发布了文章 · 3月29日

powershell 命令显示不全

问题描述

在使用 powershell 中你是否有过这样的烦恼
image.png
命令显示不全,结尾变成了点点点

万恶的 windwos ,怎么办呢?

解决方案

在末尾增加 |fl
image.png

fl就是Format-List的缩写

参考链接:使用格式命令更改输出视图

查看原文

赞 0 收藏 0 评论 0

ponponon 发布了文章 · 3月24日

vmware+vagrant环境搭建全过程,手把手教学

杂谈

杂谈vagrant相关的技术和行业动态

参考文章 Vagrant+Miniconda+PyCharm

vagrant和virtualbox是什么关系?

vagrantvirtulbox提供了开箱即用的功能,是vagrant默认的虚拟机,是情同手足的关系

VirtualBox提供程序与VirtualBox版本4.0.x,4.1.x,4.2.x,4.3.x,5.0.x,5.1.x,5.2.x,6.0.x和6.1.x兼容。不支持其他版本,提供程序将显示错误消息。请注意,不支持VirtualBox的beta版和预发行版,并且可能行为不当。

vagrant可以和vmware搭配使用吗?

可以的,vagrant首页就把vagrantvmware放在一起了,有了新欢,忘了旧爱。

image.png

但不是所有的box都有对应的vmware(大部分都没有),HashiCorp组织提供的box往往有vmware版本VirtualBoxVMware Workstation Hyper-v

image.png

HashiCorp为Vagrant开发了官方的 VMware FusionVMware Workstation  提供商。该提供商允许Vagrant为基于VMware的计算机提供动力,并利用VMware软件提供的更高的稳定性和性能。

在Vagrant网站上的VMware提供程序页面上了解有关VMware提供程序的更多信息 。

vagrant和其他虚拟化技术的区别

常见的虚拟化技术:

  • 虚拟机:代表有 VirtualBoxVMware Workstation ParallelsHyper-v
  • 容器:代表有 docker
  • 虚拟机插件: 代表有 vagrant

安装与配置

box版本说明

本教程以 https://app.vagrantup.com/hashicorp/boxes/bionic64 此教程对应的版本为例。
这是一个 hashicorp 提供的box,下载vmware版本即可。
image.png

安装 vagrant

下载连接:https://www.vagrantup.com/dow...
![上传中...]()
image.png

一路next就行

安装vmware

可以参考这个连接:https://www.ghpym.com/vmware1...

安装vagrant为vmware准备的插件

根据官方文档的描述,我们需要安装一些工具来为vagrantvmware上运行提供支持(这在virtulbox是不需要的)

image.png

安装 Vagrant VMware Utility

下载页面 https://www.vagrantup.com/vmw...
image.png

查看原文

赞 0 收藏 0 评论 2

ponponon 发布了文章 · 3月22日

rust中的“箭头函数” ->和=>的区别

初学rust,相信你会像我一样被rust庞杂的语法震惊到

下面的代码看起来像是javaJavaScript的结合体

use std::io::prelude::*;
use std::fs::OpenOptions;

fn main() -> std::io::Result<()> {
   
    let mut file = OpenOptions::new()
            .append(true).open("D:\\text.txt")?;

    file.write(b" APPEND WORD")?;

    Ok(())
}
fn main() {
    let mut v = vec![1, 2, 4, 8];
    println!("{}", match v.get(0) {
        Some(value) => value.to_string(),
        None => "None".to_string()
    });
}

关于 => 的用法

rust作为一门只有6岁的新语言,从jsjavapython等高级语言中吸收了很多语法

=>JavaScript中表示箭头函数,是一种为了为了在定义函数时省略function关键字的语法糖

而在rust语言中=>是“匹配准备语法的部分”。

用通俗一点的话来讲就是,在使用match语句的时候,对于每一种不同的情况进行匹配,如果匹配成功了之后,就执行这个=>符号后面所对应的那些代码。

参考链接:
TypeScript 函数
JavaScript初学者必看“箭头函数”

关于 -> 的用法

-> 表明的是函数的返回值类型

就像python里面的类型注释

fn max(array: &[i32]) -> i32 {
    let mut max_index = 0;
    let mut i = 1;
    while i < array.len() {
        if array[i] > array[max_index] {
            max_index = i;
        }
        i += 1;
    }
    return  array[max_index];
}



fn main() {
    let a = [2, 4, 6, 3, 1];
    println!("max = {}", max(&a));
}
查看原文

赞 0 收藏 0 评论 0

ponponon 发布了文章 · 3月19日

[ python ]下载推特视频,破解m3u8、ts加密

哪个少年不想下载推特的视频
这里给出两个推特视频下载的链接
https://www.downloadtwittervi...
https://twdown.net/?error=nov...

但这并不意味着所有的视频都可以被下载了

有一些视频是带锁的,这两个网站就不能帮我们下载了

这时候,我提供了一个更好的办法

先来看看推特是如何为我们呈现视频的吧

看不见的视频链接

视频并不是明文链接镶嵌在html中的
image
甚至不出现在meidia中
image

你在哪

那么,视频是怎么呈现出来的呢,这就归功与js了

立正

将所有资源从大到小排序
image.png
发现体积比较大的都是一些.ts文件,这是什么东西呢

可以参考这篇文章加密的m3u8、ts文件合并

这些ts文件就是我们需要的视频,不过还不能直接使用他们

image.png

接下来切换到 XHR 选项卡,并点击waterful,根据时间升序排序

通过观察ts文件,可以发现这些ts文件都是来自.m3u8结尾的文件里面

image.png

揭晓谜底的时候

不想废话了,直接抛出答案

从右侧的列表中可以发现,会有多个 m3u8
每个都有不同的作用,秘密就藏在这里面

第一个 m3u8 保存的是清晰度信息
image.png
320x568 480x852等等
第二个(或者第三个、第四个)保存的就是ts文件的路径了

image.png

多个ts组个在一个就可以变成我们熟悉的mp4文件了

合体

先手动把ts和m3u8(包含ts信息那个)文件下载到本地,并把链接地址改成本地地址

image.png
image.png

然后,使用ffmpeg下载并合并。

ffmpeg -i HdNz1kaz.m3u8 -c copy new.mp4
如果你不知道什么是ffmpeg是什么的话,就去了解一下,并且把它安装到你的本地环境

此时我们就获得了new.mp4文件
一起来播放它吧
image.png

我从哪里来

此时你可能还有一个提问,第一个m3u8文件的链接从哪里来,是这样的
对于公开的视频
![上传中...]()
image.png
直接放在了一个json文件中,搜索一下就知道
很简单

image.png

image

查看原文

赞 0 收藏 0 评论 0

认证与成就

  • 获得 16 次点赞
  • 获得 3 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 3 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2018-11-29
个人主页被 3.2k 人浏览