首页 文章 精选 留言 我的

精选列表

搜索[轻量版],共10000篇文章
优秀的个人博客,低调大师

美国玩具厂商Tegu使用RFID展台,提升商品销售量

美国玩具公司Tegu部署UHF RFID固定展台,用于展示及销售磁性和木制积木。使用Seeonic提供的内置RFID技术的固定展台,Tegu可以在确保每个门店存货充足的同时进行远程寄售。公司称,现在公司门店可比以往多销售3倍的SKU物品。 Tegu是由Chris和Will Haughey兄弟在2007年成立的。Tegu木制和磁结构玩具一般在独立的专卖店进行销售。这些门店通常都不具有存放太多库存的预算,它们的门店仅会提供少量产品展示(通常为6-8个SKU)。不仅如此,他们并不总会在商品售完后进行补货。 Tegu使用RFID固定展台提升店内销量 (Tegu的智能展台内置Seeonic Sightware RFID读取器,可进行日常物品库存盘点) 为向门店客户提供更多产品选择,Tegu开发了一个称为特殊零售计划(SRI)寄售程序,这样小型门店便可在不购买太多存货的情况下向客户提供更多商品。为管理每个固定展台的货物,Tegu在展台上内置了Seeonic RFID/物联网解决方案平台。该平台使用了超低能耗SightWare UHF RFID阅读器和EYE天线,并在每个玩具的上附着了RFID标签,并使用Seeniq云软件管理远程设备并根据读取数据进行库存分析。 大约两年前,Tegu在5个门店内安装了SRI展台,用于判断提供更多商品是否能带来更多销量。当时,公司要求参与门店对展出物品进行登记并发送已售商品列表。结果证明,该展台可增加2到5倍的销量。 然后,门店管理员有时并没时间记录并报告已售玩具数量,特别是当该负责人同时负责销售,补货及管理时。此外,人工记录系统常常会出错。 因此,2015年8月Tegu联系了Seeonic。Tegu的团队之前便对Interstate电池部署的用于跟踪展示架电池的Seeonic RFID项目有所了解。该团队向Tegu解释了该方案以及所使用的SRI固定展台,该展台可容纳十几个产品。 此后,该公司便开始在Tegucigalpa工厂上在商品上附着RFID标签。公司选择了SmartracDogBone R6 无源UHF RFID标签。每个标签ID号码绑定了玩具SKU信息。 Tegu固定展台内置了SightWare RFID读取器,电池寿命可达1.5年。该设备可使用CDMA及GSM网络向服务器发送数据。因此,店员可将展台放在门店任意位置。 Seeonic公司的共同创始人和首席技术专家 Nicholas Singh称,每日下班前,读取器会读取展台上所有物品的标签。Seeniq云软件接收到库存数据后,会和库存清单进行对比。 该系统将2天内没读取到的物品判断为已售出,每周结束时,Tegu会对已售物品进行付费,然后进行补货。 这些展台非常易于安装。由于读取器为电池供电,因此它们无需放置在插座附近。SightWare系统还可以跟踪读取器电池电量并在需要充电时进行汇报。这时,Tegu会发一个新电池并将旧电池收回充电。Tegu还可随时要求读取器传回实时数据更新。 今年年初,Tegu安装了第一个RFID显示器,目前共安装了35个。未来公司将继续在700家其他门店上进行安装。Sergo称:“我们对该系统的精度信心非常大。” 该读取器允许Tegu在非传统地点销售物品,如日托中心,博物馆,礼品店和一些小孩玩耍的地点。 未来,Tegu将使用SightWare分析来追踪特定门店的销售趋势。届时该公司可以提供一些库存更新的建议。 本文转自d1net(转载)

优秀的个人博客,低调大师

人体时钟canvas版

不知道老网民们还记不记得这个魔性的时钟插件: 作为网上冲浪十数载的网虫,不久前看到这个图瞬间破防,直接梦回10年前的QQ空间,感叹一下岁月蹉跎、时光荏苒、青春不在、不胜唏嘘。 十年后的今天,flash在各个浏览器都已经不再支持,已经是个不再那个只会用脚本打扮QQ空间的我,自然得用青春换来得技术还原一下自己的青春记忆。 首先感谢原作者提供的如此优秀好玩的插件:http://chabudai.org/blog/?p=59 这次为了图方便,就直接那pixi.js来上手做动画了,动画素材来源于油管视频,拿到PS逐帧抠图并导出,这个过程就不再详细介绍了。合成后的精灵图以及对应的json文件我会放在文章末尾。 核心的API是PIXI.AnimatedSprite。 代码也是很短,就直接放到下面了 <!doctype html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>HoneHoneClock</title> <style> * { padding: 0; margin: 0; } html, body { width: 100%; height: 100%; } body { background-color: lightcyan; } canvas { position: absolute; left: 0; top: 0; width: 100%; height: 100%; z-index: 1; } </style> </head> <body> <canvas class="canvas"></canvas> <script src="pixi_5.3.4.min.js"></script> <script src="Stats.min.js"></script> <script> (async function () { const stats = new Stats() document.body.appendChild(stats.domElement) let pageWidth = 0 let pageHeight = 0 let clockHour1, clockHour2 let clockMin1, clockMin2 let clockSec1, clockSec2 const $canvas = document.querySelector('canvas') const renderer = new PIXI.Renderer({ view: $canvas, width: pageWidth, height: pageHeight, transparent: true, autoDensity: true, antialias: true }) // 人体时钟 class Clock extends PIXI.Container { constructor (name) { super() const textures = loader.resources[honeHoneClockJson].textures let frames = [] let aniData = [] if (this.frames) { frames = this.frames aniData = this.aniData } else { aniData = [ { prefix: '0', count: 6, frameFrom: -1, frameTo: -1, }, { prefix: '1', count: 9, frameFrom: -1, frameTo: -1, }, { prefix: '2', count: 7, frameFrom: -1, frameTo: -1, }, { prefix: '3', count: 6, frameFrom: -1, frameTo: -1, }, { prefix: '4', count: 9, frameFrom: -1, frameTo: -1, }, { prefix: '5', count: 14, frameFrom: -1, frameTo: -1, }, { prefix: '6', count: 7, frameFrom: -1, frameTo: -1, }, { prefix: '7', count: 10, frameFrom: -1, frameTo: -1, }, { prefix: '8', count: 7, frameFrom: -1, frameTo: -1, }, { prefix: '9', count: 9, frameFrom: -1, frameTo: -1, }, ] let k = 0 for (let i = 0; i < aniData.length; i++) { const data = aniData[i] data.frameFrom = k for (let j = 1; j <= data.count; j++) { k++ frames.push(textures[`${data.prefix}(${j}).png`]) } data.frameTo = k - 1 } this.frames = frames this.aniData = aniData } const ani = new PIXI.AnimatedSprite(frames) ani.anchor.set(0.5, 1) ani.animationSpeed = 0.4 this.stopAt = -1 ani.onFrameChange = () => { if (ani.currentFrame === this.stopAt) { ani.stop() } } this.addChild(ani) this.name = name this.ani = ani this.num = -1 } set number (number) { if (this.num !== number) { this.num = number this.stopAt = this.aniData[number].frameTo this.ani.gotoAndPlay(this.aniData[number].frameFrom) } } } const stage = new PIXI.Container() stage.name = 'stage' let clockWrap const ticker = new PIXI.Ticker() let now = new Date() let lastTime = now.getTime() const loop = function () { stats.begin() now = new Date() if (now.getTime() - lastTime >= 1000) { let hours = now.getHours() if (hours > 9) { clockHour1.number = Math.floor(hours / 10) clockHour2.number = hours % 10 } else { clockHour1.number = 0 clockHour2.number = hours } let minutes = now.getMinutes() if (minutes > 9) { clockMin1.number = Math.floor(minutes / 10) clockMin2.number = minutes % 10 } else { clockMin1.number = 0 clockMin2.number = minutes } let seconds = now.getSeconds() if (seconds > 9) { clockSec1.number = Math.floor(seconds / 10) clockSec2.number = seconds % 10 } else { clockSec1.number = 0 clockSec2.number = seconds } lastTime = now.getTime() } renderer.render(stage) stats.end() } ticker.add(loop) const honeHoneClockJson = 'HoneHoneClock.json' const loader = new PIXI.Loader() loader.add([honeHoneClockJson]) loader.onComplete.add(async (res) => { clockWrap = new PIXI.Container() clockWrap.position.set((pageWidth - 630) * 0.5, (pageHeight + 150) * 0.5) clockHour1 = new Clock('hour') clockHour2 = new Clock('hour') clockMin1 = new Clock('min') clockMin2 = new Clock('min') clockSec1 = new Clock('sec') clockSec2 = new Clock('sec') clockHour1.position.set(0, 0) clockHour2.position.set(100, 0) clockMin1.position.set(250, 0) clockMin2.position.set(350, 0) clockSec1.position.set(500, 0) clockSec2.position.set(600, 0) clockWrap.addChild(clockHour1) clockWrap.addChild(clockHour2) clockWrap.addChild(clockMin1) clockWrap.addChild(clockMin2) clockWrap.addChild(clockSec1) clockWrap.addChild(clockSec2) stage.addChild(clockWrap) // 开始动画循环 ticker.start() }) loader.load() const onResize = (e) => { pageWidth = document.body.clientWidth pageHeight = document.body.clientHeight if (clockWrap) { clockWrap.position.set((pageWidth - 630) * 0.5, (pageHeight + 150) * 0.5) } renderer.resize(pageWidth, pageHeight) } onResize() window.onresize = onResize })() </script> </body> </html> 完整代码戳这里 在线演示1、在线演示2

优秀的个人博客,低调大师

docker 摘要(入门版)

Docker 安装 macOS或者windows 下载boot2docker工具 CentOS yum install docker-io -y systemctl start docker docker摘要 docker虚拟化 只虚拟User space 一台机器可以运行20-50个container 启动速度快 对内核有要求(不能像VMware一样可以安装mac,windows和linux) 用于大数据,分布式和集群 container实现 cgroup(内核中对资源的限制机制,通过控制进程(一个container实例)来限制) namespace(每一个容器都是有一个自己网络进程的独立的虚拟环境,实现容器间的隔离 chroot(文件系统的隔离,有一个真实的物理文件系统(物理机上),其他的都是虚拟的文件系统(虚拟的文件系统在内存中)) 以上,cgroup,namespace,chroot都是在linux中,也就是直接调用linux,后来为了跨平台,将上面的封装成了libcontainer库,让docer依赖于它 pid,容器有自己独立的进程表和1号进程 net,容器有自己的network info ipc,container之间的通信 mnt,每个容器都有自己唯一的目录挂载,是真实的挂载目录的子目录 utc,有独立的hostname和domain 层次 server -> hostOS -> docker engine -> app1 使用aufs实现分层的文件系统管理 Image是一种文件系统,里面必须有操作系统或者软件,docker中的系统Image很小,因为只包含很好的最核心的部分,每一个那么多的外围 只读为Image,可写为container,image是java中的class,container是对象 Image类似一个单链表系统,每一个image包含一个指向parent image的指针 每一个parent image的image是base image 层次: debain image(base image) -> apache image -> container 一般base image是操作系统镜像 建议:一个container干一件事情 dockerfile(类似于makefile,是命令的集合) 描述一个Image的层次,就提描述了一个依赖次序,centos -> apache -> container 有了它可以完美的重现出开发环境,方便了测试人员 docker hub(镜像仓库,类似于github) C/S运行 client request -> server -> http server -> router -> job -> driver 使用 docker pull {image name} docker images --no-trunc docker run [OPTIONS] IMAGE[:TAG] [CMD][ARG...] -name -i: iteract -t: tag -d: detach docker ps 不加上-a选项显示的正在运行的容器 加上-a显示所有的容器,包括停止的 docker inspect [ID] docker logs docker build docker rm/kill/stop id, 关闭容器 批量操作: docker rm/kill/stop $(docker ps -a -q) docker run -t -i centos /bin/bash, -t表示是伪tty(就是给一个终端,如果每一个则容器一start就stop了),-i表示iteract(在有了终端这个前提之下,如果attach到容器中,可以执行交互式的命令,如果没有则什么都干不了),-d就是在后台运行,不会在执行了上面这个命令之后直接进入到容器中 进入到了交互之界面,使用exit退出,但是也会stop容器,如果要在一次进入到该容器,需要先start容器,则attach容器,因为-i会前台运行,使用-d则是相反的 docker cp id:path hostpath 自己的摘要 docker在某些方面和git是一样的,不如说对于image镜像都是通过版本控制的,我们从dockeruhb中pull下来镜像文件,如果我们将其启动为一个容器,如果我们在这个容器中进行了修改,docker会通过文件将其修改记录下来,我们可将当当前的容器commit成一个新的image,这就类似于git中的一个commit点 在确定一个容器的时候是使用container id 在确定一个image的时候,是通过name:tag,如果只有name则会选中所有的tag,tag表示一个版本 生成一个image(提交点)的方法有两种,docker commit 和 docker build,在docker build中就是在一个image中执行一个命令的集合在提交成一个新的image

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册