使用typescript去简单的写一个时间显示的canvas小球

2023-11-06

     在学习完了ts后 一直想找一个项目练手 可网上开源的项目 写的ts项目 还是有点复杂,不太适合刚刚学完ts想练手的同学。

于是就打算自己写一个 ts小项目  

大概需求就是:1 可以根据当前时间 用canvas绘制一个时间

                          2 可以每隔一秒 收集一个小球

                          3 可以 将收集的小球 依次渲染出来

                          4 可以 有倒计时模式

实现效果大概是

从需求可以分析出 用到ts的地方 首先 需要定义的类型 一个小球的类型,数字数据结构 颜色结构等

实现上面的效果,大概需要这几个方法,一个是显示时间的函数,每间隔一秒收集小球 并让小球运动的方法

1,先定义一下结构类型

export type Ball = { // 小球的结构
  x: number,
  y: number,
  g: number,
  vx: number,
  vy: number,
  color: string
}

export type Times = { // 时间结构
  hour: number,
  minute: number,
  second: number
}

export type Site = { // 时间每一个位起始位置
  site: number,
  isSite?: boolean,
  times: number | null
}

 

2 定义一下 0-9 还有冒号的 二维数组 和可选择的时间常量

export const nums = [
  [
    [0, 0, 1, 1, 1, 0, 0],
    [0, 1, 1, 0, 1, 1, 0],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 1, 1, 0, 1, 1, 0],
    [0, 0, 1, 1, 1, 0, 0]
  ],//0
  [
    [0, 0, 0, 1, 1, 0, 0],
    [0, 1, 1, 1, 1, 0, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [1, 1, 1, 1, 1, 1, 1]
  ],//1
  [
    [0, 1, 1, 1, 1, 1, 0],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 0, 1, 1, 0, 0, 0],
    [0, 1, 1, 0, 0, 0, 0],
    [1, 1, 0, 0, 0, 0, 0],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 1, 1, 1, 1, 1]
  ],//2
  [
    [1, 1, 1, 1, 1, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 0, 1, 1, 1, 0, 0],
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 1, 1, 1, 1, 1, 0]
  ],//3
  [
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 1, 1, 1, 0],
    [0, 0, 1, 1, 1, 1, 0],
    [0, 1, 1, 0, 1, 1, 0],
    [1, 1, 0, 0, 1, 1, 0],
    [1, 1, 1, 1, 1, 1, 1],
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 1, 1, 1, 1]
  ],//4
  [
    [1, 1, 1, 1, 1, 1, 1],
    [1, 1, 0, 0, 0, 0, 0],
    [1, 1, 0, 0, 0, 0, 0],
    [1, 1, 1, 1, 1, 1, 0],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 1, 1, 1, 1, 1, 0]
  ],//5
  [
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 1, 1, 0, 0, 0],
    [0, 1, 1, 0, 0, 0, 0],
    [1, 1, 0, 0, 0, 0, 0],
    [1, 1, 0, 1, 1, 1, 0],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 1, 1, 1, 1, 1, 0]
  ],//6
  [
    [1, 1, 1, 1, 1, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 0, 1, 1, 0, 0, 0],
    [0, 0, 1, 1, 0, 0, 0],
    [0, 0, 1, 1, 0, 0, 0],
    [0, 0, 1, 1, 0, 0, 0]
  ],//7
  [
    [0, 1, 1, 1, 1, 1, 0],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 1, 1, 1, 1, 1, 0],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 1, 1, 1, 1, 1, 0]
  ],//8
  [
    [0, 1, 1, 1, 1, 1, 0],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [1, 1, 0, 0, 0, 1, 1],
    [0, 1, 1, 1, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 1, 1, 0],
    [0, 0, 0, 1, 1, 0, 0],
    [0, 1, 1, 0, 0, 0, 0]
  ],//9
  [
    [0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 1, 1, 0],
    [0, 1, 1, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 1, 1, 0],
    [0, 1, 1, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0]
  ]//:
];

export const Colors = ['#C506F6', '#F60692', '#3906F6', '#06F62B', '#B7F606', '#A9E402', '#04F5FD', '#FD5604', '#0377B8', '#8FF5B8', '#F1F806']

然后我们就可以开始写了

我是定义了一个 timeBall 类,这个类里面有 start 开始函数,showTime显示时间函数,readerNum和 update函数

start 这个函数 有一个功能就是根据参数去确定是否开启倒计时

start(endTime?: Date) {
    Balls = []
    this.endTimes = endTime
    this.isState = endTime != undefined
    this.oldTime = getShowTimes(this.isState, endTime)

    clearInterval(Inters)
    Inters = setInterval(() => {
      this.showTime()
      this.update()
    }, 50)
  }

showTime,根据获取的时间 一次在指定位置渲染小球,同时也要渲染收集的小球

 /**
   * 展示具体的时间
   */
  private showTime() {
    this.ctx.clearRect(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);

    let readerArr = getSiteTime(this.oldTime)

    readerArr.forEach((item) => {
      if (item.times != null) {
        if (item.isSite) {
          this.readerNum(MARGIN_LEFT + item.site * (RADIUS + 1), MARGIN_TOP, Math.floor(item.times / 10))
        } else {
          this.readerNum(MARGIN_LEFT + item.site * (RADIUS + 1), MARGIN_TOP, Math.floor(item.times % 10))
        }
      } else {
        this.readerNum(MARGIN_LEFT + item.site * (RADIUS + 1), MARGIN_TOP, 10)
      }
    })

    // 渲染每个小球
    for (let i = 0; i < Balls.length; i++) {
      readerBall(Balls[i].x, Balls[i].y, Balls[i].color, this.ctx)
    }
  }

readerNum 取出对应时间数字的 二维数组 并调用需要函数

  // 将时间用数据绘制出来
  private readerNum(x: number, y: number, num: number) {
    let textNum = nums[num]
    let color = '#B7F606'
    for (let i = 0; i < textNum.length; i++) {
      for (let j = 0; j < textNum[i].length; j++) {
        if (textNum[i][j] === 1) {
          readerBall(x + j * 2 * (RADIUS + 1) + (RADIUS + 1), y + i * 2 * (RADIUS + 1) + (RADIUS + 1), color, this.ctx)
        }
      }
    }
  }

update 函数则是将一秒内变化的数据收集起来,需要一次收集 时分秒上的数据,同时改变收集的小球位置

private update() {
    Nums_second -= 1

    if (Nums_second === 0) { // 说一秒到了
      Nums_second = 1000 / Interval

      let curTime = getShowTimes(this.isState, this.endTimes)
      let curTimeArr = getSiteTime(curTime).filter(tt => tt.times != null)
      let oldTimeArr = getSiteTime(this.oldTime).filter(tt => tt.times != null)

      for (let i = 0; i < curTimeArr.length; i++) {
        if (curTimeArr[i].isSite) { // 十位
          if ((curTimeArr[i].times as number / 10) != (oldTimeArr[i].times as number / 10)) {
            addBall(MARGIN_LEFT + curTimeArr[i].site * (RADIUS + 1), MARGIN_TOP, Math.floor(curTimeArr[i].times as number / 10))
          }
        } else { // 个位
          if ((curTimeArr[i].times as number % 10) != (oldTimeArr[i].times as number % 10)) {
            addBall(MARGIN_LEFT + curTimeArr[i].site * (RADIUS + 1), MARGIN_TOP, Math.floor(curTimeArr[i].times as number % 10))
          }
        }
      }
      this.oldTime = curTime // 需要更新 上一次记录的时间值
    }
    updateBall() // 无论到没到1秒都需要更新小球位置
  }

剩下的是几个公用的方法

首先 getShowTimes 这个方法会返回一个 十分秒每一位上具体显示的数据 同时也划分开 是否需要倒计时

/**
 * 是否开启倒计时
 * @param flag  
 */
function getShowTimes(flag: boolean, endTime?: Date): Times {
  if (!flag) { // 正常显示时间
    let curTime = new Date();
    return {
      hour: curTime.getHours(),
      minute: curTime.getMinutes(),
      second: curTime.getSeconds()
    }
  } else { // 到计时
    let oldTime = endTime as Date
    let newTime = new Date()
    let ret = oldTime.getTime() - newTime.getTime()
    ret = Math.floor(ret / 1000)
    let hours = ret >= 0 ? Math.floor(ret / 3600) : 0

    return {
      hour: hours,
      minute: ret >= 0 ? Math.floor((ret - hours * 3600) / 60) : 0,
      second: ret >= 0 ? Math.floor(ret % 60) : 0
    }
  }
}

然后 getSiteTime 这个函数 将每一个时间的十位和个位 还有每一个时间起点位置存储起来

/**
 * 返回 十分秒 每一个的起点坐标和数据
 * @param tt 
 */
function getSiteTime(tt: Times): Site[] {
  return [
    {
      site: 0,
      isSite: true, // true 十位
      times: tt.hour
    },
    {
      site: 15,
      isSite: false, // 个位
      times: tt.hour
    },
    {
      site: 30,
      times: null
    },
    {
      site: 39,
      isSite: true,
      times: tt.minute
    },
    {
      site: 54,
      isSite: false,
      times: tt.minute
    },
    {
      site: 69,
      times: null
    },
    {
      site: 78,
      isSite: true,
      times: tt.second
    },
    {
      site: 93,
      isSite: false,
      times: tt.second
    }
  ]
}

readerBall 是一个小球利用canvas绘制的

// 具体的绘制小圆
function readerBall(x: number, y: number, style: string, ctx: CanvasRenderingContext2D) {
  ctx.fillStyle = style
  ctx.beginPath()
  ctx.arc(x, y, RADIUS, 0, 2 * Math.PI, true)
  ctx.closePath()
  ctx.fill()
}

还有一个收集小球的函数,x,y是这个小球绘制所在的角标,g vx和vy 是一些小球位移的变化参数

/**
 * 收集每个小球 并为每个小球设置初始所在位置
 * @param x 
 * @param y 
 * @param num 
 */
function addBall(x: number, y: number, num: number) {
  let textNum = nums[num]
  for (let i = 0; i < textNum.length; i++) {
    for (let j = 0; j < textNum[i].length; j++) {
      if (textNum[i][j] === 1) {
        let oneBall: Ball = {
          x: x + j * 2 * (RADIUS + 1) + (RADIUS + 1), // 每个小球之间的距离
          y: y + i * 2 * (RADIUS + 1) + (RADIUS + 1),
          g: 1.2 + Math.random(), // 加速度
          vx: Math.pow(-1, Math.ceil(Math.random() * 1000)) * 4, // -4或+4
          vy: -5,
          color: Colors[Math.floor(Math.random() * Colors.length)]
        }
        Balls.push(oneBall)
      }
    }
  }
}

小球运动

让小球 呈现一个抛物线的运动轨迹一次想两边位移  同时需要去除掉移动到屏幕外的数据


/**
 * 让数组中的小球 开始运动
 */
function updateBall() {
  let balls = []
  for (let i = 0; i < Balls.length; i++) {
    Balls[i].x += Balls[i].vx
    Balls[i].y += Balls[i].vy
    Balls[i].vy += Balls[i].g
    if (Balls[i].y >= WINDOW_HEIGHT - RADIUS) { // 落地反弹
      Balls[i].vy = -Balls[i].vy * 0.75
    }
    if (Balls[i].x + RADIUS > 0 && Balls[i].x - RADIUS < WINDOW_WIDTH) { // 每次过滤掉移除屏幕外的数据
      balls.push(Balls[i])
    }
  }
  Balls = balls
}

timeBall 类

import { Ball, Times, Site } from '../basic/types'
import { nums, Colors } from '../basic/basicNum'

const Interval: number = 50
var WINDOW_WIDTH: number = 1024;
var WINDOW_HEIGHT: number = 768;
var RADIUS: number = 8;
var MARGIN_TOP = 60;
var MARGIN_LEFT = 30;
var Nums_second: number = 1000 / Interval

var Balls: Ball[] = [] // 存储所有的小球
let Inters: NodeJS.Timeout // 定时器



export class timeBall {
  private endTimes?: Date // 记录倒计时末端数据
  private isState: boolean = false  // 是否开启倒计时
  private oldTime: Times = {
    hour: 0,
    minute: 0,
    second: 0
  } // 收集老时间

  ctx: CanvasRenderingContext2D
  constructor(id: string) {
    var canvas = document.getElementById(id) as HTMLCanvasElement
    this.ctx = canvas.getContext('2d')!

    canvas.width = WINDOW_WIDTH = document.body.clientWidth
    canvas.height = WINDOW_HEIGHT = document.body.clientHeight

    RADIUS = Math.round((WINDOW_WIDTH - 500) / (7 * 6 + 4 * 2 + 7) * 2) // 每个数字7个球 加冒号 8 加 间隔 *2是为了求半径
    MARGIN_TOP = Math.round(WINDOW_HEIGHT / 5);
    MARGIN_LEFT = Math.round(WINDOW_WIDTH / 10);
  }

  start(endTime?: Date) {
    Balls = []
    this.endTimes = endTime
    this.isState = endTime != undefined
    this.oldTime = getShowTimes(this.isState, endTime)

    clearInterval(Inters)
    Inters = setInterval(() => {
      this.showTime()
      this.update()
    }, 50)
  }

  /**
   * 展示具体的时间
   */
  private showTime() {
    this.ctx.clearRect(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);

    let readerArr = getSiteTime(this.oldTime)

    readerArr.forEach((item) => {
      if (item.times != null) {
        if (item.isSite) {
          this.readerNum(MARGIN_LEFT + item.site * (RADIUS + 1), MARGIN_TOP, Math.floor(item.times / 10))
        } else {
          this.readerNum(MARGIN_LEFT + item.site * (RADIUS + 1), MARGIN_TOP, Math.floor(item.times % 10))
        }
      } else {
        this.readerNum(MARGIN_LEFT + item.site * (RADIUS + 1), MARGIN_TOP, 10)
      }
    })

    // 渲染每个小球
    for (let i = 0; i < Balls.length; i++) {
      readerBall(Balls[i].x, Balls[i].y, Balls[i].color, this.ctx)
    }
  }

  private update() {
    Nums_second -= 1

    if (Nums_second === 0) { // 说一秒到了
      Nums_second = 1000 / Interval

      let curTime = getShowTimes(this.isState, this.endTimes)
      let curTimeArr = getSiteTime(curTime).filter(tt => tt.times != null)
      let oldTimeArr = getSiteTime(this.oldTime).filter(tt => tt.times != null)

      for (let i = 0; i < curTimeArr.length; i++) {
        if (curTimeArr[i].isSite) { // 十位
          if ((curTimeArr[i].times as number / 10) != (oldTimeArr[i].times as number / 10)) {
            addBall(MARGIN_LEFT + curTimeArr[i].site * (RADIUS + 1), MARGIN_TOP, Math.floor(curTimeArr[i].times as number / 10))
          }
        } else { // 个位
          if ((curTimeArr[i].times as number % 10) != (oldTimeArr[i].times as number % 10)) {
            addBall(MARGIN_LEFT + curTimeArr[i].site * (RADIUS + 1), MARGIN_TOP, Math.floor(curTimeArr[i].times as number % 10))
          }
        }
      }
      
      this.oldTime = curTime
    }
    updateBall()
  }



  // 将时间用数据绘制出来
  private readerNum(x: number, y: number, num: number) {
    let textNum = nums[num]
    let color = '#B7F606'
    for (let i = 0; i < textNum.length; i++) {
      for (let j = 0; j < textNum[i].length; j++) {
        if (textNum[i][j] === 1) {
          readerBall(x + j * 2 * (RADIUS + 1) + (RADIUS + 1), y + i * 2 * (RADIUS + 1) + (RADIUS + 1), color, this.ctx)
        }
      }
    }
  }


}

main 中调用

import { timeBall } from './build/fn/ball'
window.onload = function () {

  let Ball = new timeBall('canvas')
  Ball.start()

  let start_btn = document.getElementById('start')
  let stop_btn = document.getElementById('stops')

  start_btn.addEventListener('click', () => { // 开启倒计时
    let myTime = new Date()
    let YY = myTime.getFullYear()
    let MM = myTime.getMonth()
    let DD = myTime.getDate()

    let hh = parseInt(document.getElementById('hh').value)
    let mm = parseInt(document.getElementById('mm').value)
    let ss = parseInt(document.getElementById('mm').value)

    let endT = new Date(YY, MM, DD, hh, mm, ss)
    Ball.start(endT)
  })

  stop_btn.addEventListener('click', () => { // 正常显示
    Ball.start()
  })

}

index.html

<!--
 * @Author: your name
 * @Date: 2020-10-15 11:19:30
 * @LastEditTime: 2020-10-16 17:10:32
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \ts写canvas时间小球\src\index.html
-->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>canvas小球</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      html,
      body {
        height: 100%;
        position: relative;
        overflow: hidden;
      }
      .form {
        position: absolute;
        top: 0;
        left: 0;
      }
      .form .inputs {
        margin-top: 10px;
      }
      .form .inputs p {
        margin-bottom: 10px;
      }
    </style>
  </head>
  <body>
    <div class="form">
      <h4>默认是显示时间,点击确定未倒计时</h4>
      <div class="inputs">
        <p>时:<input type="number" max="24" min="0" name="" id="hh" /></p>
        <p>分:<input type="number" max="60" min="0" name="" id="mm" /></p>
        <p>秒:<input type="number" max="60" min="0" name="" id="ss" /></p>
      </div>
      <div class="btn">
        <button id="start">开始</button>
        <button id="stops">取消</button>
      </div>
    </div>
    <canvas id="canvas" style="height: 100%">
      当前浏览器不支持Canvas,请更换浏览器后再试
    </canvas>
  </body>
</html>

同时,这里我是使用webpack去编辑的 

webpack.config.js

const path = require('path')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')


module.exports = {
  entry: {
    app: './src/main.js'
  },
  output: {
    filename: '[name].builds.js',
    path: path.resolve(__dirname, 'dist')
  },
  devtool: 'inline-source-map',// 错误追踪
  devServer: { // 告诉web服务器去这里找文件
    contentBase: './dist',
    hot: true
  },
  plugins: [
    new CleanWebpackPlugin(), // 打包之前清空
    new HtmlWebpackPlugin({ template: './src/index.html' })
  ]
}

webpack打包后 会生成dist 直接使用dist里面的html就可以 运行了。因为我是用vscode编辑的 可以直接实时的建ts转换成 js

引用和调用都是 调用js的

 

总结一下 使用的ts

类型定义,类,函数 基本就是这些了。使用ts你会发现 强类型 会及时的提醒所缺是方法和缺少的 属性。

会更加规范你所写的程序  值得 多多使用

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用typescript去简单的写一个时间显示的canvas小球 的相关文章

  • 计算机网络笔记(一)

    什么是计算机网络 什么是计算机网络 计算机网络就是互连 互联互通 的 自治 无主从关系 的计算机集合 那么 距离远 数据大如何保证互连 通过交换网络互连主机 什么 是 Internet 组成 计算机设备 通信链路 分组交换 数据包转发分组
  • linux unix域socket_python3从零学习-5.8.1、socket—底层网络接口

    源代码 Lib socket py 这个模块提供了访问BSD 套接字 的接口 在所有现代Unix系统 Windows macOS和其他一些平台上可用 这个Python接口是用Python的面向对象风格对Unix系统调用和套接字库接口的直译
  • Kaldi-MFCC模块源码主流程分析

    那么趁着这个机会 研究一下kaldi源码中MFCC部分的内容 不说废话 我们从 compute mfcc feats cc开始讲解 这里是个main函数 需要携带参数 具体使用样例如下 1 compute mfcc feats 其实看到这里
  • JVM完整笔记

    这是我在看课程 黑马程序员JVM完整教程 过程中记的笔记 我觉得该课程总时不长 并且理论 实战是一个入门JVM的好课程 若你看完该课程可以看下面几个参看书进一步深入了解JVM 深入理解Java虚拟机 第二版 实战Java虚拟机 深入JAVA
  • Java基础3--Java流程控制语句

    Java基础3 Java流程控制语句 文章目录 Java基础3 Java流程控制语句 Java循环语句 while循环 do while循环 for循环 增强for循环 Java条件语句 if语句 if else语句 if多分支语句 Jav
  • 【FreeRTOS开发问题】FreeRTOS内存溢出

    FreeRTOS内存溢出 如下图所示 FreeRTOS编译完成后可以看到 系统提示无法分配内存到堆 Objects Template axf Error L6406E No space in execution regions with A
  • Error Microsoft Visual C++ 14.0 is required 最佳解决方法,亲测有效

    这种pip安装不上的包 1 找whl包下载安装 去Python安装包大全中 https www lfd uci edu gohlke pythonlibs 去下载 对应后缀为 whl 的安装包进行安装 后缀为 whl 的安装包进行安装的方法
  • java永久区_Java方法区和永久代

    目前有三大Java虚拟机 HotSpot oracle JRockit IBM J9 JRockit是oracle发明的 用于其WebLogic服务器 IBM JVM是IBM发明的用于其Websphere服务器 因此在某行开发的时候 他们用
  • linux日志打到垃圾箱,shell输出的那个垃圾桶——/dev/null

    昨晚花费一整晚在知乎回答了一个关于shell里面的重定向输出到 dev null的问题 果断今晚也同步发在这里 反正也没人看 以下来自一个重度linux使用患者不请自来的回答 先用简单的语言回答题主的问题 shell程序中 2 gt dev
  • USB学习之一:USB协议基础

    USB开发者论坛http www usb org USB专区 http group ednchina com 93 1 1USB的特点 在USB1 0和USB1 1版本中 只支持1 5Mb s的低速 low speeed 模式 和12Mb
  • 探索健康养老的“最后一公里” 附下载地址

    目前中国机构养老市场参与者主要包括 房地产开发商 保险公司以及一些专业的养老服务企业 其中房地产开发商和保险公司凭借丰富的开发经验和充足的 资金流在市场上处于领先地位 目前市 场主流的机构养老项目的营利模式主要 分三类 即 非销售类 销售类
  • 《Stable Diffusion WebUI折腾实录》在Windows完成安装, 从社区下载热门模型,批量生成小姐姐图片

    环境 操作系统 Windows11 显卡 RTX2060 6GB 显存 安装Python 下载 Python3 10 6 https www python org ftp python 3 10 6 python 3 10 6 amd64
  • 马来西亚旅游不可不去的世外桃源

    全马最漂亮的8大冷门 世外桃源 美到您都不相信这些地方竟然在马来西亚 1 Pulau Besar 柔佛州 情侣来这旅游或蜜月 真的最适合不过了 想要找一个宁静 舒服 温暖的海边度假吗 那么PulauBesar 或许适合你 这里没有其他海边来
  • numpy.arrange函数知识大全

    numpy arrange函数知识大全 numpy arrange函数作用 numpy arrange函数作用 numpy arrange函数的作用是生成带起点和终点的特定步长的排列 根据函数的参数的个数分为以下几种情况 1 只有一个参数

随机推荐

  • 使用Android studio 查看其它app的布局的结构

    日常开发过程中 难免会遇到一些比较好看的布局 这时候我们就想学习一下别人的布局结构 以便参考 如果是前端开发的话 直接用Chrome可以查看别人布局的结构 如果是android的就比较麻烦一些 不过也是可以的 只需要简单的两步 下面来演示一
  • 逻辑判断

    一 论证推理 1 1 基本原理 论证的基本原理 话题一致 例如 甲论证 中国足球不行 这个论点时 乙说 你行你上 这就是典型的话题不一致 因为 我足球行不行 和 国足行不行 是没有关系的 1 2 解题步骤 所有的论据都是为论点服务的 1 明
  • vs+qt添加qtOpengl时,要小写

    奇怪了 一开始添加模块时 写成了Opengl 是qmake错误 改成opengl就可以了
  • 一个简单的测试案例

    题目 有一个处理单价为5角钱的饮料的自动售货机软件测试用例的设计 其规格说明如下 若投入5角钱或1元钱的硬币 押下 橙汁 或 啤酒 的按钮 则相应的饮料就送出来 若售货机没有零钱找 则一个显示 零钱找完 的红灯亮 这时在投入1元硬币并押下按
  • Python · 无限画板(零)· 简介

    项目 GitHub 地址 免费线上示例产品 该示例产品的源代码 封面图对应的项目的源代码 需求 方案 在上一篇文章 用 Python 打造 AIGC 的 操作系统 里 我提到过这个 Python 无限画板的项目 carefree drawb
  • Pytorch CAM特征可视化

    背景 类别激活映射 Class Activation Mapping CAM 用于对深度学习特征可视化 通过特征响应定位图像的关键部位 为深度学习可解释性提供了一种方法 ACM以热力图的方式展示了图像局部响应的强弱信息 对应于更强的位置具有
  • 无线打印机服务器安全吗,注意安全 彻底拒绝打印机被非法共享

    为了提高打印机的利用率 不少单位往往会通过局域网对打印机进行共享使用 不过这样一来 局域网内的非法用户也有可能趁机使用共享打印机 从而造成打印成本的 节节攀升 为了阻止非法用户对打印机随意进行共享 本文特意总结了以下几则 拒绝 妙招 相信这
  • 2021 Android面经及求职总结

    投递情况 主要投递了国内和国外的互联网公司 同时也投递了一些币圈企业 最终斩获battmd offer和一币圈的百万年薪offer 关于如何准备面试 可以关注我的面试准备系列文章如何准备一场技术面试 offer斩获情况 大大小小共12家公司
  • K8S学习之Statefulset

    Statefulset概念 应用场景包括 1 稳定的持久化存储 即Pod重新调度后还是能访问到相同的持久化数据 基于PVC来实现 2 稳定的网络标志 即Pod重新调度后其PodName和HostName不变 基于Headless Servi
  • MySQL 异步复制源自动故障转移

    1 异步复制源架构 1 1基于主从复制的异步复制源 从MySQL 8 0 22开始支持异步连接故障转移机制 我们可以在一套主从复制架构的基础上 创建一个异步复制连接的Replica副本 当主从复制Source发生意外宕机 业务提升Repli
  • Nethereum:.NET应用和以太坊智能合约的桥梁

    Nethereum基本上是目前唯一可用的 NET平台下的web3 js移植包 在这个教程中 我们将首先编写并部署一个简单的智能合约 然后创建一个简单的 NET应用 并使用Nethereum来访问以太坊上的智能合约 Nethereum是通过以
  • vim编辑文件出错: Another program may be editing the same file.An edit session for this file crashed.

    以下是错误详细代码 E325 ATTENTION Found a swap file by the name schema xml swp owned by root dated Thu May 28 21 19 42 2020 file
  • mvcc匹配规则

    1 当前快照读读出的事务id
  • Oracle<-->MySQL

    to char 123 456 FM9 990 09 format 123 456 2 default en US 9 999 999 to char 123 cast 123 as unsigned int unsigned signed
  • 软件测试工具比较

    软件测试工具比较 作者 乔元 来源 无忧软件测试网 http www csai cn 2005年11月18日 随着软件测试的地位逐步提高 测试的重要性逐步显现 测试工具的应用已经成为了普遍的趋势 目前用于测试的工具已经比较多了 这些测试工具
  • 在Ubuntu16.04上安装QQ

    在Ubuntu16 04上安装QQ 霾大 1 个月前 最近装了双系统win10 ubuntu16 04 想在ubuntu上装个QQ 然后发现 在网上找了不少教程 都是装的wine qq 装了才发现显示版本过低 登不上去啊 后来发现用cros
  • MySQL数据库(二)SQL语言和数据类型

    成功不易 加倍努力 1 SQL语言 1 1 关系型数据库的常见组件 1 2 SQL语言的兴起与语法标准 2 管理数据库 2 1 创建数据库 2 2 修改数据库 2 3 删除数据库 2 4 查看数据库列表 3 数据类型 3 1 整数型 3 2
  • linux定时调用存储过程,linux下crontab定时执行shell脚本调用oracle 存储过程

    问题 脚本内调用存储过程 脚本直接执行没问题 使用crontab 执行脚本存储过程未执行 原因 缺少oracle环境变量 解决 在shell脚本里添加oracle的环境变量 bin sh PATH PATH HOME bin 环境变量 ex
  • 获取层级(结构树)

    public ResponseDTO
  • 使用typescript去简单的写一个时间显示的canvas小球

    在学习完了ts后 一直想找一个项目练手 可网上开源的项目 写的ts项目 还是有点复杂 不太适合刚刚学完ts想练手的同学 于是就打算自己写一个 ts小项目 大概需求就是 1 可以根据当前时间 用canvas绘制一个时间 2 可以每隔一秒 收集