一夜之间从头开始实现开源 RISC-V。DarkRISCV softcore 一开始是作为开源 RISC-V 指令集的概念证明而开发。虽然与其他 RISC-V 实现相比,DarkRISCV 代码小而粗糙,但其有很多令人印象深刻的功能,包括有:
实现大部分 RISC-V RV32E 指令集,实现大部分 RISC-V RV32I 指令集(缺少 csr*、e * 和 fence*),在超大规模 ku040 中工作频率高达 250MHz(400MHz 带超频!),便宜的 spartan-6 高达 100MHz,适合小型 spartan-3E,例如 XC3S100E!,大多数时间(通常是 71% 的时间)可以维持每条指令 1 个时钟,灵活的 harvard 架构(易于集成缓存控制器、总线桥等),在真正的 xilinx(spartan-3、spartan-6、spartan-7、artix-7、kintex-7 和 kintex ultrascale)中运行良好,在一些真正的 altera 和 lattice FPGA 上运行良好,适用于 RISC-V 的 gcc 9.0.0(无需补丁!),使用 850-1500LUT(核心仅使用 LUT6 技术,取决于启用的功能和优化),可选的 RV32E 支持(与 LUT4 FPGA 配合使用效果更好),可选的 16x16 位 MAC 指令(用于数字信号处理),可选的 coarse-grained multi-threading (MT),pipeline stages 之间没有互锁,BSD 许可证。
DarkRISCV 的主要动机是为围绕 680x0/Coldfire 系列的一些项目创建迁移路径
qq721686791 发布的帖子
-
开源RISC-V的Verilog实现DarkRISCV
-
如何使用 .NET Alloc 拦截
在 PerfView 中有一个 .NET Alloc 选项,它可以拦截每一次对象分配,然后记录下 线程调用栈,再根据分配量计算权重,知道原理后,接下来就可以开启 .NET Alloc 拦截。
需要注意的是,对于这个选项,需要先开启收集,再启动程序,等程序执行完毕后,点击 Stop Collection ,稍等片刻,会看到如下截图。
点击 GC Heap Net MEM (Coarse Sampling) Stack列表,选择我们的进程,会看到当前的 System.String权重占比最高,所以调查它的分配源就是当务之急了,截图如下:
接下来双击 System.String 行,查看它的 Callers,逐一往下翻,终于找到了 Program.Alloc1() 方法,截图如下:
到这里就找到了问题函数 Alloc1() 。 -
实现键盘输入的中断函数
首先我们需要知道键盘是属于外设,所以对应的中断属于外部中断。在讲中断那一章节时,我们知道了外部中断的处理流程,不过对于键盘的输入中断,还需要增加一点点东西。
8048是键盘上的芯片,其主要任务就是监控哪个键被按下,一旦有按键信息,8048就将按键信息传递给键盘控制器8042(8042通常是Intel 8042或兼容芯片,集成在主机内部的主板上),再由8042发送中断信号给8259A。最重要的一点是,键盘的中断号。
我们可以看到键盘对应的是IR1口,这个是硬件上决定的,所以我们无法更改。除此之外,在我们的程序中,我们将IR0口的中断号设置为0x20,后面依次递增,所以我们可以知道键盘的中断号为0x21。这里我们不管按键信息如何,我们只需要知道一旦有按键按下,就会有中断触发,所以我们尝试写一下按键的中断处理函数。
在project/kernel目录下新建keyboard.c、keyboard.h文件,除此之外还需要修改interrupt.c文件。
最后编译运行,可以看到我们一旦按下按键,屏幕便会打印信息,而且释放按键也会打印信息。当然这是后面需要讲解的内容,总之到现在,我们已经成功实现了按键的中断处理函数。
-
搭建网络的方法
在过去,我们运维着“能做一切”的大型单体应用程序。这是一种将产品推向市场的很好的方式,因为刚开始我们也只需要让我们的第一个应用上线。
而且我们总是可以回头再来改进它的。部署一个大应用总是比构建和部署多个小块要容易。
集中式:
集群:
分布式:
分布式和集中式会配合使用。
我们在搭建网站的时候,为了及时响应用户的请求,尤其是高并发请求的时候,我们需要搭建分布式集群来处理请求。我们一个服务器的处理能力是有限的。如果用我们一台设备当作服务器,那么当并发量比较大的时候,同一时间达到上百的访问量。那服务器就宕机了。然后只能重启服务器,当出现高并发访问的时候,就又会宕机。
所以我们需要更多的服务器来并行工作,处理用户的请求。那么问题来了,我们服务器运行的时候,怎么分发大量的请求给不同的服务器呢?
一般会采用(1apache+nTomcat)或者服务器模式来分发并处理请求。或者采用nginx分发请求。
微服务是运行在自己的进程中的可独立部署的服务套件。他们通常使用 HTTP 资源进行通信,每个服务通常负责整个应用中的某一个单一的领域。在流行的电子商务目录例子中,你可以有一个商品条目服务,一个审核服务和一个评价服务,每个都只专注一个领域。
用这种方法让多语言服务(使用不同语言编写的服务)也成为可能,这样我们就可以让 Java/C++ 服务执行更多的计算密集型工作,让 Rails / Node.js 服务更多来支持前端应用等等。
微服务会成为大规模分布式应用的主流架构。任何复杂的工程问题都会归结为devide and conquer(分而治之),意思就是就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……
直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。微服务本质是对服务的拆分,与工程领域惯用的“分而治之”的思路是一致的。
-
朴素贝叶斯算法
朴素贝叶斯算法是统计学味道最浓的一款算法,也是最能体现我们日常生活经验的算法;
与我们读万卷书行万里路形成我们自己的生活经验类似,朴素贝叶斯算法也是基于收集的历史数据分析得到相关事情发生的原因,从而形成解决问题的模型;
与我们面对未知的未来类似,基于自己的生活经验计算各种可能的情况,最终选择一个最大可能的方向进行努力 ,朴素贝叶斯算法也是基于学习的模型计算给定的输入属于各个分类的概率,并选择概率最大的分类作为结果;
朴素贝叶斯法实现简单,学习与预测的效率都很高,是一种常用的方法;该算法是基于贝叶斯定理和特征条件独立假设的分类算法;该算法首先通过分析训练数据得到先验概率、似然度,从而得到输入输出的联合概率分布;最后基于此训练模型,利用贝叶斯定理计算得到输入的后验概率最大的分类;
联合概率P(X,Y)是通过计算先验概率和条件概率得到的;
朴素贝叶斯法通过训练数据集学习得到先验概率(=),=1,2,3,...,P(Y=ck),k=1,2,3,...,K
条件概率(=|=)=((1)=(1),...,()=()|=),=1,2,3,...,P(X=x|Y=ck)=P(X(1)=x(1),...,X(n)=x(n)|Y=ck),k=1,2,3,...,K
-
手把手教你使用映射器
鉴于我们希望把整个工程包下关于数据库操作的 DAO 接口与 Mapper 映射器关联起来,那么就需要包装一个可以扫描包路径的完成映射的注册器类。
当然我们还要把上一章节中简化的 SqlSession 进行完善,由 SqlSession 定义数据库处理接口和获取 Mapper 对象的操作,并把它交给映射器代理类进行使用。
有了 SqlSession 以后,你可以把它理解成一种功能服务,有了功能服务以后还需要给这个功能服务提供一个工厂,来对外统一提供这类服务。比如我们在 Mybatis 中非常常见的操作,开启一个 SqlSession。
以包装接口提供映射器代理类为目标,补全映射器注册机 MapperRegistry,自动扫描包下接口并把每个接口类映射的代理类全部存入映射器代理的 HashMap 缓存中。
而 SqlSession、SqlSessionFactory 是在此注册映射器代理的上次层使用标准定义和对外服务提供的封装,便于用户使用。我们把使用方当成用户 经过这样的封装就就可以更加方便我们后续在框架上功能的继续扩展了,也希望大家可以在学习的过程中对这样的设计结构有一些思考,它可以帮助你解决一些业务功能开发过程中的领域服务包装。
MapperRegistry 提供包路径的扫描和映射器代理类注册机服务,完成接口对象的代理类注册处理。
SqlSession、DefaultSqlSession 用于定义执行 SQL 标准、获取映射器以及将来管理事务等方面的操作。基本我们平常使用 Mybatis 的 API 接口也都是从这个接口类定义的方法进行使用的。
SqlSessionFactory 是一个简单工厂模式,用于提供 SqlSession 服务,屏蔽创建细节,延迟创建过程。 -
Shell脚本
Shell脚本是一款用 C 语言编写的程序,它是用户使用 Linux 系统的必备桥梁。Shell脚本既是一种命令语言,又是一种程序设计语言。Shell脚本是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson 的 sh (shell脚本的缩写)是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell脚本语言。
说了这么多,那什么是脚本呢?简单来说脚本其实就是一条条的文字命令,这些文字命令都是能够看到的,比如可以用记事本执行打开查看、编辑等基础的操作。常见的脚本:如前端有JavaScript,VBScript, ASP,JSP,后端的PHP,数据库操作语言SQL,Perl,Shell,python,Ruby,JavaFX,Lua 等。
-
第一个shell脚本:打开文本编辑器(可以使用 touch/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了。
-
运行 Shell 脚本有两种方法:第一种方法是可以把Shell 脚本作为一个可执行程序,并将所需要的代码保存为 test.sh,并 cd 到相应目录。需要注意的是,一定要把后缀名写成 ./test.sh的形式,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
第二种方法则是把Shell 脚本直接够作为解释器参数。这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,这种方式运行的脚本,不需要在第一行指定解释器信息,不过即使写了也没有什么太大的作用。
-
-
数据库的发展历程
什么是数据库?顾名思义,数据库就是一个按照数据结构来组织、存储和管理数据的“仓库”。
数据库指的是数据都以一定方式储存在一起、能够为多个用户所共享、并且具有尽可能小的冗余度的特点的、与应用程序彼此独立的一个数据集合。
数据库可以通过统一的一些指令对数据进行增、删、改、查等一些列的基本操作。
数据库也可实现数据共享:数据共享中包含了所有的用户可以同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享。
减少数据的冗余度:相比于文件系统,由于数据库实现了数据共享,就会从一定程度上避免了用户各自建立应用文件。减少了大量重复数据,减少了数据冗余,维护了数据的一致性。
保持数据的独立性:数据的独立性包括逻辑独立性,即:数据库中数据库的逻辑结构和应用程序相互独立;和物理独立性,即:数据物理结构的变化不影响数据的逻辑结构。
数据实现集中控制:在文件管理的方式中,数据是一直处于一种分散的状态中,不同的用户或同一用户在不同处理中其文件之间毫无关系。而利用数据库就可以对数据进行集中控制和管理,并通过数据模型表示各种数据的组织以及数据间的联系。
数据一致性和可维护性:以确保数据的安全性和可靠性:主要包括:安全性控制、完整性控制、并发控制,使在同一时间周期内,允许对数据实现多路存取,又能防止用户之间的不正常交互作用。
故障恢复:由数据库管理系统提供一套方法,可及时发现故障和修复故障,从而防止数据被破坏。数据库系统能尽快恢复数据库系统运行时出现的故障,可能是物理上或是逻辑上的错误。比如对系统的误操作造成的数据错误等。
-
什么是数仓
数据仓库的英文全称为Data Warehouse,简称DW。它是面向主题的,集成的,相对稳定的,反映历史变化的一款数据存储集合app,数据仓库被用于支撑企业的分析报告与决策。
数仓可以将不同数据源的数据在一个较高抽象层次上做整合,数据可以围绕某一主题进行汇总,如遇上电商可以围绕的主题有:订单、流量、商品、用户等方面 。数仓中的数据来源于不同数据源的集成,可以是tob业务系统数据源,也可以是toc业务系统数据源,亦或者是erp业务系统数据源,且这些数据源的存储方式可能不同:
有时候会用到mysql数据库、而有时也会用orcale、或者是用hive,基于以上不同的方式,因此使用者们需要做etl操作整合不同的数据源。数仓中的数据保存的是一些列历史快照数据,不允许数据被修改,使用人员只能查询或分析数据。数仓会定期接受新的集成数据,反映最新的数据变化。
-
机器学习多媒体处理应用Waifu2x-Extension-GUI
Waifu2x-Extension-GUI 是一个使用机器学习的多媒体处理应用,借助深度卷积神经网络对图片 & GIF & 视频进行超分辨率放大(即放大与降噪)。
特性:自动化处理多种媒体: 支持处理 图片 的同时,实现了自动化处理 GIF 和 视频全图像风格支持: 内置多种算法, 无论是二次元动漫还是您日常拍摄的照片&录像 ,都可以进行清晰化处理;强大的兼容性: 内置多个引擎, 几乎与所有现代 Windows PC 兼容;灵活的多线程设定: 在为每个引擎提供完备的设置项的同时,您也可以自由调整线程数量,充分利用PC的一切性能;多 GPU 支持: 内置的所有引擎均可支持多显卡,充分利用您的 PC 的所有性能;众多自定义设置: 您可以通过调整软件内的众多自定义设置实现自动化的工作流。
智能设定: 本软件可根据您的PC硬件信息和您要处理文件的信息自动调整部分软件设定;易于使用的图形用户界面;持续的维护与更新。
-
高性能流媒体服务框架ZLMedaKit
ZLMediaKit是一个基于C++11的高性能运营级流媒体服务框架。
ZLMediaKit基于C++11开发,避免使用裸指针,代码稳定可靠,性能优越。支持多种协议(RTSP/RTMP/HLS/HTTP-FLV/WebSocket-FLV/GB28181/HTTP-TS/WebSocket-TS/HTTP-fMP4/WebSocket-fMP4/MP4),支持协议互转。 使用多路复用/多线程/异步网络IO模式开发,并发性能优越,支持海量客户端连接。代码经过长期大量的稳定性、性能测试,已经在线上商用验证已久。 支持linux、macos、ios、android、windows全平台。支持画面秒开、极低延时。提供完善的标准capi可以作SDK用,或供其他语言调用。提供完整的mediaseverice服务器,可以免开发直接部署为商用服务器。 提供完善的restful api 以及web hook,支持丰富的业务逻辑。打通了视频监控协议栈与直播协议栈,对RTSP/RTMP支持都很完善。全面支持H265/H264/AAC/G711/OPUS。
-
大规模Prometheus集群解决方案Thanos
Thanos 是一组可以组成具有长期存储期限的高可用指标系统的组件,可以将其无缝添加到现有 Prometheus 部署之上。
Thanos 利用 Prometheus 2.0 存储格式在任何对象存储中经济高效地存储历史指标数据,同时保留快速查询可能。另外,它提供了所有 Prometheus 的全局查询视图,并且可以即时合并 Prometheus HA 对中的数据。
该项目的具体目标是:指标的全局查询视图。指标的无限保留。组件的高可用性,包括 Prometheus。
-
高性能轻量级即时通讯软件flamingoIM
flamingoIM 是一款高性能、轻量级的即时通讯软件。
目前即时通讯软件实现了如下功能(这里只列举网络相关的功能,其他客户端已经实现的功能不统计在列,请自行发现): 注册 登录 查找好友、查找群 添加好友、添加群 好友列表、群列表、最近会话 单人聊天功能(包括发文字、表情、窗口抖动、离线文件) 群组功能(包括发文字、表情) 群发消息 修改密码 修改个人信息(自定义昵称、签名、个性头像等个人信息) 自动升级功能
客户端还有很多细节功能,比如头像有三种显示模式、好友上线动画、聊天记录、聊天自动回复功能等。
-
同为工程师,到底差在哪里?
一个程序员的成长之路,会经历多个阶段,从初级工程师、中级工程师到高级工程师再到这个领域的专家,但是能成为技术专家的终归是少数,那么,同为工程师,到底差在哪里?是工作年限?还是经验?或者是老板重视程度?是否做出重大业绩?
首先,工作年限长的技术就一定更加高深么?答案是不一定,这个世界上不知道有多少人,每天只是做着重复性的工作,毫无长进。虽说吃过的盐比其他人吃过的饭都多,但就是没记性,不断的重复着过去的错误。
那工作经验丰富的人一定就更高级吗?答案也是不一定,因为有的人虽然长此以往的在做一件事情,积攒了很多经验,但此过程中间并没有夹杂自己的思考,更谈不上经验。
至于老板重视程度,这是结果,而非原因。技术高深,自然就受到重视;而不是相反的:受到了重视,所以技术才变得高深。是否做出重大业绩,这确实是一个足够客观的衡量指标,但依然只是结果。
我们与高级工程师的差距可能就在我们的思维方式,分析问题的能力。遇到问题时,先想想自己的解决方案,然后再问别人,这样才会有比较,发现自己的不足,从而提升自己。
高级工程师可能也不是面面俱到,不是所有的问题都会解决,可能很多问题都没碰到过,或者没有用到相关的技术,但是,遇到问题,知道该怎么去找解决方案。作为一个程序员,遇到问题我们要懂得利用已有的工具方法去解决问题。
高级工程师会考虑得更加全面,不止于眼前,考虑性能和可扩展性,这样才能应对将来不变的需求和更高的性能要求。会进行技术预研和考量,选择合适的方案。善于总结和分享。自己进步的同时也帮助他人进步。 -
RE: npm 如何提交测试版本
进入需要发布到npm上的文件根目录,运行如下命令,加上 --tag beta
// 发布稳定公测版本 npm publish --tag beta // 发布测试版本 npm publish --tag alpha
beta
和alpha
版本的区别bata 版本相对比较稳定,bug少,功能比较新,可以认为是尝鲜体验版本
alpha 版本bug多,多用于开发环境和测试环境
-
即时可用场景式隐私保护高效解决方案WeDPR
WeDPR 是一个有效的隐私保护技术解决方案,需以降低使用门槛、帮助用户快速技术选型、在用户心中建立信任为目标。
为此,微众银行区块链围绕隐私保护核心业务场景,面向各方合作伙伴,率先开源WeDPR即时可用场景式隐私保护解决方案中的一系列核心算法组件,填补领域中的空白,并希望通过提供安全可控、透明可信的隐私保护核心算法组件。
WeDPR可以有效降低使用隐私保护算法组件的技术门槛;减少业务系统集成隐私保护特性的开发成本;提供开箱即用的隐私保护解决方案,缩短合作伙伴实施路径。
WeDPR是一系列即时可用场景式隐私保护高效解决方案套件和服务(参见WeDPR白皮书),由微众银行区块链团队自主研发。
WeDPR致力于解决业务数字化中隐私不“隐”、共享协作不可控等隐私保护风险痛点,在“数据可用不可见”的基础上更进一步,实现隐私数据的“可隐可现、可控可用”的5C隐私保护效果,消除隐私主体的隐私顾虑和业务创新的合规壁垒,助力基于隐私数据的核心价值互联和新兴商业探索,营造公平、对等、共赢的多方数据协作环境,达成数据价值跨主体融合和数据治理的可控平衡。
项目地址: https://github.com/WeBankBlockchain/WeDPR-Lab-Java-SDK
-
RE: electron 9.x 版本, 设置跨域失效怎么办
在全局的app中按照如下设置,然后再去创建窗体就可以了
import { app } from 'electron' // 设置这句后解决了 app.commandLine.appendSwitch('disable-features', 'OutOfBlinkCors')