首页> 标签> Ruby
"Ruby"
共 3868 条结果
全部 问答 文章 公开课 课程 电子书 技术圈 体验
ruby 给钉钉群发一条消息
给钉钉群发一条工作消息用途如下:Ipa, apk,打包完成了, 可以用作测试群表格导出成功了, 一般的群消息比如后台日志报警等等步骤如下群设置 - 智能群助手 - 添加机器人 - 选择 - 自定义机器人设置里面要设置一个自定义关键词, 比如这里面 我起个名字 summerxx上篇说到我用一个 ruby 程序, 自动导出了一个表, 之后我发一条消息到钉钉群, 告诉大家, 表已经导出成功, 请查看桌面首先我们定义个 DingDing 类# 钉钉机器人 class DingDing # 发送 markdown 消息 def DingDing.send_markdown(title, markdown) # 这个就是申请机器人后给的 token token = '' params = %Q+{ 'msgtype': 'markdown', 'markdown': { 'title': '#{title}', 'text': '#{markdown}' } }+ `curl --silent \ -H \"Content-Type: application/json\" \ -d \"#{params}\" \ https://oapi.dingtalk.com/robot/send?access_token=#{token}` end end其中 Curl 是一个常用的命令行数据传输工具,可以方便的从命令行创建网络请求。它支持众多协议,支持如 HTTP, HTTPS, FTP, FTPS, SFTP, IMAP, SMTP, POP3 等等协议。Curl 提供了很多强大的功能,我们可以利用它来进行 HTTP 请求、上传/下载文件等,且支持 Cookie、用户密码验证、代理隧道、限速等。这里我用来发一个HTTPS 请求在需要的地方调用下, 就会发一条消息了DingDing.send_markdown("excel导出完成", "请查看桌面summerxx")Curl的一些用法可以参照这里https://blog.csdn.net/zfw_666666/article/details/126161447
文章
机器人  ·  数据安全/隐私保护  ·  Ruby
2023-02-03
Git学习(一)(上)
一、版本控制的发展本地版本控制系统->集中式版本控制系统->分布式集中控制系统本地版本控制系统:早期为了方便查找历史版本,而推出版本控制最流行的一种叫做 RCS,现今许多计算机系统上都还看得到它的踪影。RCS 的工作原理是在硬盘上保存补丁集(补丁是指文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容。缺点:无法在不同系统上的开发者协同工作集中式版本控制系统可以由多个客户机访问这个服务器,进行协同操作缺点:如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照。代表:CVS、Subversion以及Perforce分布式集中控制系统优点:客户端并不只提取最新版本的文件快照, 而是把代码仓库完整地镜像下来,包括完整的历史记录。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。代表:Git、Mercurial、Bazaar以及 Darcs二、Git的诞生2.1 Git 诞生的背景同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。Linus 在1991年创建了开源的 Linux,从此,Linux 系统不断发展,已经成为最大的服务器系统软件了。在1991-2002年期间,世界各地的志愿者把源代码文件通过 diff 的方式发给 Linus,然后由 Linus 本人通过手工方式合并代码。你也许会想,为什么 Linus 不把 Linux 代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus 坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和 Linux 的开源精神不符。2.2 Linus 两周完成 Git到 2002 年,Linux 系统已经发展了十年了,代码库之大让 Linus 很难继续通过手工方式管理了,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码,BitKeeper 的东家 BitMover 公司也免费授权 Linux 社区使用这个版本控制系统。后来 BitMover 公司发现社区有人试图破解 BitKeeper 的协议,于是 BitMover 公司收了回 Linux 社区的免费使用权。这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。 他们对新的系统制订了若干目标:速度简单的设计对非线性开发模式的强力支持(允许成千上万个并行开发的分支)完全分布式有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)于是,Linus 花了两周时间自己用 C 写了一个分布式版本控制系统,这就是 Git!一个月之内,Linux 系统的源码已经由 Git 管理了!2.3 Git 的发展壮大自 2005 年诞生以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统。Git 迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub 网站上线了,它为开源项目免费提供 Git 存储,无数开源项目开始迁移至 GitHub ,包括jQuery,PHP,Ruby等等。2.4 CODE CHINAGitCodeCODE CHINA 使用手册三、Git的安装3.1 Windows下安装Git 官方网站下载3.2 Git GUI,Git Bash,Git CMD之间的区别3.2.1 Git BashBash,Unix shell的一种,Linux与Mac OS X v10.4都将它作为默认shell。Git Bash就是一个shell,是Windows下的命令行工具,可以执行Linux命令。Git Bash是基于CMD的,在CMD的基础上增添一些新的命令与功能。所以建议在使用的时候,用Bash更加方便。3.2.2 Git CMD(命令行提示符)是Windows操作系统上的命令行解释程序。当你在Windows上安装git并且习惯使用命令行时,可以使用cmd来运行git命令。3.2.3 Git GUI基本上针对那些不喜欢黑屏(即命令行)编码的人。它提供了一个图形用户界面来运行您喜欢的git命令。四、Git的一些命令4.1 config$ git config --global user.name "李老师" $ git config --global user.email li@csdn.net4.1.1 检查某项配置​git config ​ $ git config user.name 李老师4.1.2 配置命令颜色$ git config --global color.ui true4.2 忽略特殊文件​.gitignore​在Git 工作区的根目录下创建一个特殊的 ​.gitignore文件​# Windows: Thumbs.db ehthumbs.db Desktop.ini # Python: *.py[cod] *.so *.egg *.egg-info dist build # My configurations: db.ini deploy_key_rsa4.2.1 强制添加被忽略的文件遇到添加一个文件到 Git,但发现添加不了,原因是这个文件被.gitignore忽略了:$ git add App.classThe following paths are ignored by one of your .gitignore files:App.classUse -f if you really want to add them.如果你确实想添加该文件,可以用-f强制添加到 Git:$ git add -f App.class4.2.2 检查忽略规则​git check-ignore​$ git check-ignore -v App.class.gitignore:3:*.class App.classGit会告诉我们,.gitignore的第3行规则忽略了该文件,于是我们就可以知道应该修订哪个规则。4.2.3 添加例外规则# 排除所有.开头的隐藏文件: .* # 排除所有.class文件: *.class # 不排除.gitignore和App.class: !.gitignore !App.class4.3 配置别名除了通过 配置忽略文件 来提高git commit 时的便捷性外,Git 中还有一种可以让大家在敲入 Git 命令时偷懒的办法——那就是配置 Git 别名。4.3.1 配置 git status/commit/checkout/branch$ git config --global alias.st status$ git config --global alias.co checkout$ git config --global alias.ci commit$ git config --global alias.br branch配置完成以上别名后,以后提交就可以简写成:$ git ci -m “sth.”4.3.2 配置 git reset HEAD file再比如git reset HEAD file命令,他可以把暂存区的修改撤销掉(unstage),重新放回工作区。既然是一个unstage操作,就可以配置一个unstage别名:$ git config --global alias.unstage ‘reset HEAD’当你敲入命令:$ git unstage test.py实际上 Git 执行的是:$ git reset HEAD test.py4.3.3 配置 git log -1配置一个git last,让其显示最后一次提交信息:$ git config --global alias.last ‘log -1’这样,用git last就能显示最近一次的提交:$ git lastcommit 4aac6c7ee018f24d2dabfd01a1e09c77612e1a4e (HEAD -> master)Author: Miykael_xxm xiongjiamu@gmail.comDate: Tue Nov 17 11:14:15 2020 +0800branch test
文章
存储  ·  JavaScript  ·  Linux  ·  Shell  ·  PHP  ·  开发工具  ·  git  ·  开发者  ·  Ruby  ·  Windows
2023-01-29
技术文档 | OpenSCA技术原理之composer依赖解析
OpenSCA知识小课堂开课了!今天主要介绍基于composer包管理器的组件成分解析原理。composer介绍composer是PHP的依赖管理工具。开发者受到Node.js的npm及Ruby的bundler启发,composer设计上与两者有诸多相似。composer的依赖管理文件是composer.json。开发者可以在composer.json中指定每个依赖项的版本范围或使用composer require/update/remove ${name}命令管理依赖项。如果一个项目中存在composer.json文件,便可以执行composer install命令自动安装当前项目所需的依赖项并生成composer.lock文件composer.json完整文件结构如下:{ "name": "cakephp/app", "type": "project", "license": "MIT", "require": { "php": ">=7.2", "cakephp/cakephp": "^4.3", "cakephp/migrations": "^3.2", "cakephp/plugin-installer": "^1.3", "mobiledetect/mobiledetectlib": "^2.8" }, "require-dev": { "cakephp/bake": "^2.6", "cakephp/cakephp-codesniffer": "^4.5", "cakephp/debug_kit": "^4.5", "josegonzalez/dotenv": "^3.2", "phpunit/phpunit": "~8.5.0 || ^9.3" }, }其中name为项目名称;type为包的类型,有library、project、metapackage和composer-plugin四种类型,默认情况下为library;license为项目声明的许可证,可以是一个字符串或是一个字符串数组。require-dev为开发环境或测试使用的依赖,require为生产环境使用的依赖,依赖写法为"name":"version",版本可以指定准确版本或一个范围。解析算法composer.lockcomposer.lock文件为自动生成的文件,可以准确定位到PHP项目使用的依赖及版本,所以优先解析composer.lock文件。composer.lock文件结构如下:{ "packages": [ { "name": "a", "version": "1.1.0", "require": { "c": "1.1.*" } }, { "name": "b", "version": "1.2.2", "require": { "c": "^1.0.2" } }, { "name": "c", "version": "1.1.2" } ], "packages-dev": [] }其中packages和packages-dev字段包含项目使用的所有直接和间接依赖,而且记录了组件间的依赖关系,packages为生产环境的依赖,packages-dev为开发环境的依赖。示例:{ "name": "a", "version": "1.1.0", "require": { "c": "1.1.*" } } 代表项目依赖1.1.0版本的组件a,且该组件依赖版本约束为1.1.*的组件c。同理可知项目依赖1.2.2版本的组件b,且该组件依赖版本约束为^1.0.2的组件c。且组件a和组件b都没有被其他依赖所依赖,所以可知这两个组件是项目的直接依赖。注:1.1.*代表版本号需要>=1.1.0且<1.2.0^1.0.2代表版本号需要>=1.0.2且<2.0.0由此可以构建出当前项目的依赖结构:实线代表直接依赖,虚线代表间接依赖图:composer.lock检测结果示例composer.jsoncomposer.json为开发者管理的依赖管理文件,在未找到composer.lock文件时将解析该文件。composer.json仅包含直接依赖,在项目构建时会从composer仓库下载需要的间接依赖并构建为composer.lock文件,因此可以模拟composer构建流程来获取项目引用的组件依赖。composer.json文件结构如下:{ "name": "foo", "type": "project", "license": "MIT", "require": { "a": "^1.1.0", "b": "^1.2.0", }, "require-dev": {}, }require为项目实际使用的直接依赖,require-dev为项目开发时使用的直接依赖。例如:"a": "^1.1.0"代表项目依赖版本约束为^1.1.0的组件a。"b": "^1.2.0"代表项目依赖版本约束为^1.2.0的组件b。分析到这里我们可以总结出如下图依赖关系:实线代表直接依赖通过该依赖关系可以看出项目组件的直接依赖及组件的版本范围,但无法得知组件依赖的具体版本。在没有composer.lock文件的情况下,为了进一步获取依赖的准确版本及间接依赖,需要从composer仓库下载对应组件的详细信息。例如组件a的详细信息结构为:{ "packages": { "a": [ { "version": "1.0.1", "require": { "c": "^1.0.0" } }, { "version": "1.1.0", "require": { "c": "^1.1.0" } } ] } }其中packages字段为组件及各个版本信息的映射,require字段为组件的依赖信息。对于本例来说,组件a的约束为^1.1.0,要求版本号>=1.1.0且<2.0.0,所以选择1.1.0版本。因此组件依赖结构就变成了:按照这种方式层级解析便可获取整个项目的依赖信息。图:composer.json检测结果示例感谢每一位开源社区成员对OpenSCA的支持和贡献。OpenSCA的代码会在GitHub和Gitee持续迭代,欢迎Star和PR,成为我们的开源贡献者,也可提交问题或建议至Issues。我们会参考大家的建议不断完善OpenSCA开源项目,敬请期待更多功能的支持。GitHub:https://github.com/XmirrorSecurity/OpenSCA-cli/releasesGitee:https://gitee.com/XmirrorSecurity/OpenSCA-cli/releasesOpenSCA官网:https://opensca.xmirror.cn/联系我们添加小助手(微信号:opensca1)加入OpenSCA社区技术交流群或关注公众号:OpenSCA社区
文章
算法  ·  JavaScript  ·  PHP  ·  开发者  ·  Ruby
2023-02-02
别梦依稀咒逝川,Ruby二十八年前|M1芯片Mac os系统配置Ruby(3.0.0) on Rails(6.1.1)开发环境
在每个开发者心里,都会有一门“最好”的语言,在这个世界的某个深处,在一些矫矫不群的人们心中,这门语言的名字叫做Ruby,它今年二十八岁了,历史和Java一样的悠久,但是它没有大厂背书、它的性能被开发者诟病、时至今日依然无法高效利用多核资源,甚至于它每年都要被“死亡”一次,相比于有太阳计算机系统、甲骨文、IBM 这些大公司支持的 Java,它是那么的一无所有,但是,它又拥有全世界最虔诚的“信徒”,拥有最活跃的开发者社区,这一切,又让它是那么的应有尽有。是的,这就是Rubyist的理念:有的时候,你想证明给一万个人看,到后来,你发现只得到了一个明白的人,那就够了。本次我们尝试在最新的M1芯片Mac os(Big Sur 11.2.2)中搭建最新版Ruby3.0.0以及Web开发框架Rails6.1.1,全新的芯片、全新的征途、全新的开始:首先我们来看看M1芯片的命令行,如果你是从老版本Mac迁移过来的,比如笔者(Mojave),最好将老的Bash命令行更换成zsh,zsh是一款功能比bash更强大的终端(shell)系统,既可以作为一个交互式终端,也可以作为一个脚本解释器,这里更换必要性是指如果使用Bash编译Ruby3.0,可能会发生一些未知错误。执行命令切换zsh:sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"安装成功后,确保在应用程序-》实用工具-》终端-》简介中,不要勾选Rosetta,因为接下来我们需要以arm架构的homebrew进行安装,所以所有的编译和运行动作都不需要Rosetta的参与:随后重启终端,开始安装amr架构的Homebrew:/bin/bash -c "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh)"然后编辑配置文件 ~/.zshrc,加入如下内容:path=('/opt/homebrew/bin' $path) export PATH存盘之后执行命令:source ~/.zshrc查看新brew的位置:➜ ~ which brew /opt/homebrew/bin/brew如果返回的是/opt/homebrew/bin/brew就说明安装成功,接着更新一下版本:➜ ~ brew cleanup && brew update Already up-to-date.如果没有代理,可以选择设置一下国内源:# brew git -C "$(brew --repo)" remote set-url origin https://mirrors.ustc.edu.cn/brew.git # core git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git # cask git -C "$(brew --repo homebrew/cask)" remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.zprofile source ~/.zprofile接下来我们来安装Ruby3.0,业界比较主流的安装方式大抵两种:rvm或者rbenv,这里我们使用rbenv,它其实就是一个类似python中conda一样的多版本管理软件包,可以方便一些老项目以低版本ruby运行,比如ruby2.6。Ruby 依赖 OpenSSL和AutoConf这俩个包,提前预装好,如果是迁移过来的Openssl可能版本比较低,最好重新安装最新的1.1j版本:brew reinstall openssl@1.1 brew reinstall autoconf随后安装rbenv,执行命令:brew install ruby-build rbenv之后将rbenv命令添加到zsh命令行的环境变量中:echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.zshrc source ~/.zshrc重启命令行,键入rbenv:➜ ~ rbenv rbenv 1.1.2 Usage: rbenv <command> [<args>] Some useful rbenv commands are: commands List all available rbenv commands local Set or show the local application-specific Ruby version global Set or show the global Ruby version shell Set or show the shell-specific Ruby version install Install a Ruby version using ruby-build uninstall Uninstall a specific Ruby version rehash Rehash rbenv shims (run this after installing executables) version Show the current Ruby version and its origin versions List installed Ruby versions which Display the full path to an executable whence List all Ruby versions that contain the given executable如果返回版本号和相关操作,问题就不大了,不过最好通过脚本诊断一下,确保后续编译不会出问题:curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash诊断没有报错误即可:➜ ~ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash Checking for `rbenv' in PATH: /opt/homebrew/bin/rbenv Checking for rbenv shims in PATH: OK Checking `rbenv install' support: multiple You seem to have multiple `rbenv-install' in the following locations. Please pick just one installation and remove the others. /Users/liuyue/.rbenv/plugins/ruby-build/bin/rbenv-install /opt/homebrew/bin/rbenv-install Counting installed Ruby versions: 1 versions Checking RubyGems settings: OK Auditing installed plugins: OK接下来,由于众所周知的学术问题,rbenv下载二进制安装包会非常的缓慢,所以我们可以通过国内镜像来手动下载:https://cache.ruby-china.com/pub/ruby/这里下载ruby3.0正式版:然后将压缩包手动拷贝到rbenv的安装目录:~/.rbenv/cache这里的~/.rbenv/cache有可能不存在,可以手动创建:mkdir ~/.rbenv/cache拷贝安装包:cp ~/Downloads/ruby-3.0.0.tar.gz ~/.rbenv/cache/ruby-3.0.0.tar.gz紧接着我们终于可以安装Ruby3.0本体了:brew link openssl --force RUBY_CONFIGURE_OPTS=--with-openssl-dir=/opt/homebrew/Cellar/openssl@1.1/1.1.1j rbenv install 3.0.0由于笔者之前安装过openssl,所以这次强制指定由arm架构的openssl来编译安装。安装成功后键入rbenv versions:➜ ~ rbenv versions * system (set by /Users/liuyue/.rbenv/version) 3.0.0可以看到,除了M1系统默认的版本,又出现了一个3.0.0版本,我们可以使用 rbenv global命令来切换版本:➜ ~ rbenv global 3.0.0 ➜ ~ rbenv versions system * 3.0.0 (set by /Users/liuyue/.rbenv/version)随后输入ruby -v:➜ ~ ruby -v ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [arm64-darwin20]可以看到版本已经切换到3.0,并且内核版本是arm64位,如果需要系统默认版本,还可以切回来:➜ ~ rbenv global system ➜ ~ ruby -v ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.arm64e-darwin20]系统默认是ruby 2.6.3,最好不要动它。接着我们就可以安装Rails了:gem install rails -v 6.1.1安装成功后,刷新一下:rbenv rehash然后查看版本号:➜ ~ rails -v Rails 6.1.1 ➜ ~创建一个新项目:rails new myrails进入项目目录:cd myrails启动服务:rails s千呼万唤始出来:结语:作为同龄语言,如果说Java是闪现在天上的瑰丽,那么Ruby就是埋藏于地底的炽热,同样伟大但各擅胜场,而事实上同样作为脚本语言的Ruby更多的是在和Python对比,Python近几年在数据分析和深度学习领域的突飞猛进让Ruby难以望其项背,而Ruby在Mac系统中软件包管理层面却有着统治级的地位,就像你玩儿Mac就避免不了Homebrew,接触Homebrew就无法躲开Ruby。很多人唱衰Ruby,认为它过时了,而在Rubyist的心中则正相反,它太超前了,正是和M1芯片一样,是超越时代的产物,也许有一天,它会“死亡”,但绝不会是今天,最后,用十九世纪美国小说家赫尔曼·梅尔维尔《白鲸》中的一节和诸君共勉:“有些人死在退潮里;有些人死在浅水滩里;有些人却死在洪水里。” ——第一百三十五章,亚哈最后一次追击白鲸时,对阻拦他的大副斯达巴克说。
文章
机器学习/深度学习  ·  开发框架  ·  Java  ·  Shell  ·  开发者  ·  芯片  ·  iOS开发  ·  Ruby  ·  MacOS  ·  Python
2023-02-02
千姿百态,瞬息万变,Win11系统NeoVim打造全能/全栈编辑器(前端/Css/Js/Vue/Golang/Ruby/ChatGpt)
我曾经多次向人推荐Vim,其热情程度有些类似现在卖保险的,有的时候,人们会因为一些弥足珍贵的美好暗暗渴望一个巨大的负面,比如因为想重温手动挡的快乐而渴望买下一辆二十万公里的老爷车,比如因为所谓完美的音质而舍不得一个老旧的有线耳机,比如因为一个铜炉火锅而期待北京那漫长而寒冷的冬天。 也许有的人会因为Vim而放弃169刀的JetBrains全家桶,没错,Vim的快乐,就是手动挡的快乐,懂得自然懂,不懂的永远也不会懂,但如果没有用Vim敲过代码,那么绝对枉生于有Vim的世界。之前一篇:上古神兵,先天至宝,Win11平台安装和配置NeoVim0.8.2编辑器搭建Python3开发环境(2023最新攻略),我们已经配置好了Python3开发环境,本次继续添砖加瓦,让NeoVim进化为全栈编辑器,全知全能,无所不通。全能补全:coc.nvim之前配置Python补全,我们使用过NCM2扩展插件:Plug 'ncm2/ncm2' Plug 'roxma/nvim-yarp' Plug 'ncm2/ncm2-bufword' Plug 'ncm2/ncm2-path' Plug 'ncm2/ncm2-jedi'五个插件,仅仅为了Python的补全,而Coc.nvim 通过 Microsoft 的 Language Server Protocol,支持许多编程语言,包括 JavaScript, Python, C++ ,Ruby等等。同时还可以通过设置和扩展进行灵活定制,满足不同用户的需求。 重新编写配置:Plug 'neoclide/coc.nvim', {'branch': 'release'}安装插件::PlugInstall安装Python补全::CocInstall coc-pyls就这么简单。随后,还可以对其他目标语言进行设置,比如想支持Golang的补全,通过命令::CocConfig打开配置文件,Win11默认路径是:~\AppData\Local\nvim\coc-settings.json{ "languageserver": { "golang": { "command": "gopls", "rootPatterns": [ "go.mod" ], "filetypes": [ "go" ] } }, "suggest.noselect": false, "coc.preferences.diagnostic.displayByAle": true, "suggest.floatEnable": true }添加Golang的配置,这里使用gopls模块。 正确配置之后,就可以使用代码补全了 例如我们输入 fmt. 就会提示fmt包中的方法,默认选择第一个,使用< C-n > < C-p > 上下选择,回车确认,nvim下可以使用悬浮窗功能。 类似的,如果想配置Ruby的智能提示,设置不需要配置文件,只需要安装对应模块即可:gem install solargraph随后NeoVim内运行命令::CocInstall coc-solargraph但这也带来了一个问题,即编译运行的时候,默认运行的语言是Python,如何让Vim程序自动进行判断?只需要修改配置即可:autocmd FileType python nnoremap <C-B> :sp <CR> :term python % <CR> autocmd FileType go nnoremap <C-B> :sp <CR> :term go run % <CR> nnoremap <C-W> :bd!<CR>这里通过NeoVim中的autocmd进行判断,如果是Python代码就通过python解释器运行,如果是golang代码就通过Golang的编译器进行编译,互不影响。 NeoVim 的 autocmd 是用来自动执行命令的一种机制。它可以在特定的事件发生时触发命令的执行,比如打开文件、保存文件等。这样可以自动地对文件进行格式化、添加头部信息等操作。 前端的补全更简单,一键式命令安装即可::CocInstall coc-vetur coc-json coc-html coc-css但前端页面默认是没有闭合高亮的,所以推荐下面这个插件:Plug 'leafOfTree/vim-matchtag'它可以针对前端页面标签的闭合进行动态高亮: 非常方便。快捷操作与配置也许有人会因为诸如保存、注释以及记录等操作还需要输入vim命令而苦恼,但其实这并不是什么问题,Vim也可以自动保存:Plug 'Pocco81/auto-save.nvim'这样就可以免去:w的操作。单行以及多行的批量注释可以依赖这个插件:Plug 'tpope/vim-commentary'这样就可以通过组合键gc快速进行注释操作了。 编辑操作记录可以依赖这个插件:Plug 'mhinz/vim-startify'如此可以在首页动态的选择曾经编辑过的文件: 想要传统IDE那样的动态调节字体大小?let s:fontsize = 12 function! AdjustFontSize(amount) let s:fontsize = s:fontsize+a:amount :execute "GuiFont! Consolas:h" . s:fontsize endfunction inoremap <expr> <TAB> pumvisible() ? "\<C-y>" : "\<CR>" inoremap <expr> <Esc> pumvisible() ? "\<C-e>" : "\<Esc>" inoremap <expr> <C-j> pumvisible() ? "\<C-n>" : "\<Down>" inoremap <expr> <C-k> pumvisible() ? "\<C-p>" : "\<Up>"通过tab键选择自动补全的代码提示?" In insert mode, pressing ctrl + numpad's+ increases the font inoremap <C-kPlus> <Esc>:call AdjustFontSize(1)<CR>a inoremap <C-kMinus> <Esc>:call AdjustFontSize(-1)<CR>a在Vim中,你甚至可以和ChatGpt一亲芳泽:use({ 'terror/chatgpt.nvim', run = 'pip3 install -r requirements.txt' })当然,在用户目录下需要chatgpt的apikey或者token: ~/.chatgpt-nvim.json:{ "authorization": "<API-KEY>", # Optional API key "session_token": "<SESSION-TOKEN>" # Your ChatGPT session token }由于api-key是收费的,这里建议使用token: 访问 https://chat.openai.com/chat 并且登录 按F12打开开发者工具 在应用的标签上 > 选择Cookies 直接复制\_\_Secure-next-auth.session-token的value值写到上面的session\_token中即可。效果如下: 最后,完整的全栈NeoVim配置:call plug#begin('C:\nvim-win64\nvim-win64\share\nvim\plugged') Plug 'navarasu/onedark.nvim' Plug 'pablopunk/native-sidebar.vim' Plug 'Pocco81/auto-save.nvim' Plug 'leafOfTree/vim-matchtag' Plug 'mhinz/vim-startify' Plug 'neoclide/coc.nvim', {'branch': 'release'} Plug 'tpope/vim-commentary' call plug#end() let g:onedark_config = { \ 'style': 'warm', \} colorscheme onedark let g:native_sidebar_shortcut = '<c-t>' set clipboard^=unnamed,unnamedplus syntax on "syntax highlighting, see :help syntax filetype plugin indent on "file type detection, see :help filetype set number "display line number set path+=** "improves searching, see :help path set noswapfile "disable use of swap files set wildmenu "completion menu set backspace=indent,eol,start "ensure proper backspace functionality set undodir=~/.cache/nvim/undo "undo ability will persist after exiting file set undofile "see :help undodir and :help undofile set incsearch "see results while search is being typed, see :help incsearch set smartindent "auto indent on new lines, see :help smartindent set ic "ignore case when searching set expandtab "expanding tab to spaces set tabstop=4 "setting tab to 4 columns set shiftwidth=4 "setting tab to 4 columns set softtabstop=4 "setting tab to 4 columns set showmatch "display matching bracket or parenthesis set hlsearch incsearch "highlight all pervious search pattern with incsearch highlight ColorColumn ctermbg=9 "display ugly bright red bar at color column number " Keybind Ctrl+l to clear search nnoremap <C-l> :nohl<CR><C-l>:echo "Search Cleared"<CR> " When python filetype is detected, F5 can be used to execute script " autocmd FileType python nnoremap <buffer> <c-b> :<cr>:exec '!python' shellescape(expand('%:p'), 1)<cr> autocmd FileType python nnoremap <C-B> :sp <CR> :term python % <CR> autocmd FileType go nnoremap <C-B> :sp <CR> :term go run % <CR> nnoremap <C-W> :bd!<CR> let s:fontsize = 12 function! AdjustFontSize(amount) let s:fontsize = s:fontsize+a:amount :execute "GuiFont! Consolas:h" . s:fontsize endfunction inoremap <expr> <TAB> pumvisible() ? "\<C-y>" : "\<CR>" inoremap <expr> <Esc> pumvisible() ? "\<C-e>" : "\<Esc>" inoremap <expr> <C-j> pumvisible() ? "\<C-n>" : "\<Down>" inoremap <expr> <C-k> pumvisible() ? "\<C-p>" : "\<Up>" " In insert mode, pressing ctrl + numpad's+ increases the font inoremap <C-kPlus> <Esc>:call AdjustFontSize(1)<CR>a inoremap <C-kMinus> <Esc>:call AdjustFontSize(-1)<CR>a只需要不到70行的配置,我们就拥有了一个万能的Vim编辑器。结语满打满算,七个插件,全知全能,而我们需要做的,只是一行简单的:PlugInstall。因为什么?因为热爱,如果是真爱,哪怕风情万千遇到不解风情,也所甘愿,哪怕没人懂,也要周周至至做出来。
文章
前端开发  ·  JavaScript  ·  IDE  ·  编译器  ·  Go  ·  开发工具  ·  C++  ·  开发者  ·  Ruby  ·  Python
2023-02-02
python 第三方库安装技巧
Python 是一门优雅的语言,简洁的语法,强大的功能。当然丰富的第三方库,更能加速开发。那么问题来了,如何安装这些第三方库(包)呢?安装第三方库的方式其实不多。下面就介绍一些技巧。源码安装很多第三方库都是开源的,几乎都可以在github 或者 pypi上找到源码。找到源码格式大概都是 zip 、 tar.zip、 tar.bz2格式的压缩包。解压这些包,进入解压好的文件夹,通常会看见一个 setup.py 的文件。打开命令行,进入该文件夹。运行python setup.py install• 1这个命令,就能把这个第三库安装到系统里,也就是你的 Python 路径,windows大概是在 C:\Python2.7\Lib\site-packages。Linux会在 /usr/local/lib/python2.7/dist-packages。Mac 应该在 /Library/Python/2.7/site-packages。如果是在 virtulenv环境下安装,这个包就被安装在所建立的虚拟环境下的 site-packages/目录下。想要卸载这些库也很简单,进入 site-packages,直接删掉库文件就 OK 啦。当然,这些安装可能有一点麻烦,需要下载,解压,再运行安装,卸载也不是很方便。有没有一种工具,可以帮外面管理这些库呢?包管理器 (pip 和 easy_install)现在很多编程语言,都带有包管理器,例如 Ruby 的 gem,nodejs的npm。Python当然也不例外,拥有大名鼎鼎的 pip和 easy_install。前面说到的pypi就是一些 python第三库所在的源,使用 pip 或者 easy_install 安装模块,会搜索这个源,然后自动下载安装。比如我们需要安装 flask 框架具体命令如下:pip install flask 或 easy_install flask简单吧,一个简单的命令就搞定。卸载也很方便,例如我们需要卸载flaskpip uninstall flask查看所安装的包,包括系统自带的和手动安装的pip list还可以搜索包pip search flask还可以重定向输出项目使用的库。pip freeze > requirements.txt这样就会把该环境下的第三方库重定向到 requirements.txt文件内,如果给别人安装项目的依赖,只需要运行:pip install -r requirements.txt很方便吧。当然,有时候,我们的网络并不是那么顺畅,pip是在线安装的,可不可以离线呢?当然可以啦,pip install 的第一步,就是在 pypi 上寻找包,然后下载到本地。如果网络不好,可以先建一个本地的仓库,把常用的包离线下载。比如可以下载 flask 的源码pip intall flask-master.zip同样也可以安装。最新版本的pip也支持git安装,只需要使用其git地址就行pip install git+https://github.com/kennethreitz/requests.git• 1不过这种安装方式相当的慢。它的原来就是先clone到本地的临时目录,然后再安装zip包。当然在安装后也可能会出错,比如:pip 安装包出错: Could not import setuptools这是因为 python 环境中没有 setuptools 这个包。安装上就可以了:$ pip install -U setuptools至于如何用Pycharm如何添加第三方库和插件,请看AIEarth是一个由众多领域内专家博主共同打造的学术平台,旨在建设一个拥抱智慧未来的学术殿堂!【平台地址:https://devpress.csdn.net/aiearth】 很高兴认识你!加入我们共同进步!
文章
JavaScript  ·  Linux  ·  开发工具  ·  git  ·  Ruby  ·  Python  ·  Windows
2023-02-01
本地GitLab服务器搭建
本地GitLab服务器搭建一、简介        GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。安装方法是参考GitLab在GitHub上的Wiki页面。Gitlab是被广泛使用的基于git的开源代码管理平台, 基于Ruby on Rails构建, 主要针对软件开发过程中产生的代码和文档进行管理, Gitlab主要针对group和project两个维度进行代码和文档管理, 其中group是群组, project是工程项目, 一个group可以管理多个project, 可以理解为一个群组中有多项软件开发任务, 而一个project中可能包含多个branch, 意为每个项目中有多个分支, 分支间相互独立, 不同分支可以进行归并。二、安装GitLab2.1、依赖安装        通过以下命令安装GitLab依赖的工具:sudo apt-get install -y curl openssh-server ca-certificates tzdata perl部分版本的Ubuntu已经安装了如上工具:2.2、安装邮件服务工具(可选)        安装 Postfix 以发送电子邮件通知。如果您想使用其他解决方案发送电子邮件,请跳过此步骤并sudo apt-get install -y postfixsudo apt-get install -y postfix正在读取软件包列表... 完成正在分析软件包的依赖关系树        正在读取状态信息... 完成        下列软件包是自动安装的并且现在不需要了:  gir1.2-geocodeglib-1.0 libegl1-mesa libwayland-egl1-mesa ubuntu-web-launchers使用'sudo apt autoremove'来卸载它(它们)。建议安装:  procmail postfix-mysql postfix-pgsql postfix-ldap postfix-pcre postfix-lmdb postfix-sqlite sasl2-bin dovecot-common resolvconf postfix-cdb postfix-doc下列【新】软件包将被安装:  postfix升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 10 个软件包未被升级。需要下载 1,147 kB 的归档。解压缩后会消耗 4,078 kB 的额外空间。获取:1 http://cn.archive.ubuntu.com/ubuntu bionic-updates/main amd64 postfix amd64 3.3.0-1ubuntu0.4 [1,147 kB]已下载 1,147 kB,耗时 8秒 (142 kB/s)                                                                                                                                                                        正在预设定软件包 ...正在选中未选择的软件包 postfix。(正在读取数据库 ... 系统当前共安装有 178062 个文件和目录。)正准备解包 .../postfix_3.3.0-1ubuntu0.4_amd64.deb  ...正在解包 postfix (3.3.0-1ubuntu0.4) ...正在设置 postfix (3.3.0-1ubuntu0.4) ...Created symlink /etc/systemd/system/multi-user.target.wants/postfix.service → /lib/systemd/system/postfix.service.正在添加组"postfix" (GID 129)...完成。正在添加系统用户"postfix" (UID 125)...正在将新用户"postfix" (UID 125)添加到组"postfix"...无法创建主目录"/var/spool/postfix"Creating /etc/postfix/dynamicmaps.cf正在添加组"postdrop" (GID 130)...完成。setting myhostname: lybsetting alias mapssetting alias databasemailname is not a fully qualified domain name.  Not changing /etc/mailname.setting destinations: $myhostname, lyb, localhost.localdomain, , localhostsetting relayhost:setting mynetworks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128setting mailbox_size_limit: 0setting recipient_delimiter: +setting inet_interfaces: allsetting inet_protocols: all/etc/aliases does not exist, creating it.WARNING: /etc/aliases exists, but does not have a root alias.Postfix (main.cf) is now set up with a default configuration.  If you need tomake changes, edit /etc/postfix/main.cf (and others) as needed.  To viewPostfix configuration values, see postconf(1).After modifying main.cf, be sure to run 'service postfix reload'.Running newaliases正在处理用于 ureadahead (0.100.0-21) 的触发器 ...正在处理用于 systemd (237-3ubuntu10.56) 的触发器 ...正在处理用于 man-db (2.8.3-2ubuntu0.1) 的触发器 ...正在处理用于 rsyslog (8.32.0-1ubuntu4.2) 的触发器 ...正在处理用于 ufw (0.36-0ubuntu0.18.04.2) 的触发器 ...正在处理用于 libc-bin (2.27-3ubuntu1.6) 的触发器 ...2.3、配置GitLab 软件源镜像        通过如下命令来配置GitLab软件镜像:curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash执行后会有如下信息输出:2.4、安装GitLab        通过如下命令安装GitLab:sudo apt-get install gitlab-jh命令执行后会有如下信息输出:2.5、启动GitLab实例        通过如下命令启动GitLab:sudo gitlab-ctl reconfigure sudo gitlab-ctl start sudo gitlab-ctl reconfigure执行时间较长,请耐心等待。执行完成之后通过如下命令来查看GitLab的状态:sudo gitlab-ctl status2.6、配置防火墙        通过如下命令配置防火墙:sudo ufw allow https sudo ufw allow http sudo ufw allow ssh sudo ufw enable sudo ufw status命令执行后会有如下信息输出:2.7、设置GitLab自启动        通过如下命令设置GitLab服务自启动:systemctl enable gitlab-runsvdir.service2.8、GitLab登陆        访问 Linux 服务器 IP 地址即可,如果想访问 EXTERNAL_URL 指定的域名还需要配置 域名服务器或本地 hosts 文件。 初次登录时需要为 gitlab 的 root 用户设置密码。
文章
Ubuntu  ·  Linux  ·  网络安全  ·  开发工具  ·  数据库  ·  数据安全/隐私保护  ·  git  ·  Ruby
2023-01-12
使用VScode搭建Rust开发环境
使用VScode搭建Rust开发环境1、安装rust-analyzer        它会实时编译和分析你的 Rust 代码,提示代码中的错误,并对类型进行标注。参考手册:https://rust-analyzer.github.io/manual.html。2、安装Rust Syntax        Rust Syntax为代码提供语法高亮。3、安装crates        crates可以帮助你分析当前项目的依赖是否是最新的版本。4、安装Better TOML        Rust 使用Better TOML做项目的配置管理。5、安装Rust Test Lens        Rust Test Lens可以快速运行某个Rust测试。6、 安装Tabnine AI Autocomplete        基于 AI 的自动补全,可以帮助你更快地撰写代码。支持Java、C、PHP、Go、C#、Ruby、Objective-C、Rust、Swift、Type、OCaml、Scala、Kotlin、Perl、SQL、HTML、CSS和Bash。主流编程语言几乎都囊括在内。
文章
SQL  ·  人工智能  ·  Rust  ·  前端开发  ·  Go  ·  Scala  ·  C#  ·  iOS开发  ·  Kotlin  ·  Ruby
2023-01-12
成功解决centos7虚拟机开机后提示ABRT has detected 1 problem(s)
遇到问题开启虚拟机准备做实验的时候,收到一个提示:ABRT已经检测到一个问题:ABRT has detected 1 problem(s). For more info run: abrt-cli list--since 1673100767如下图解决方案后面有提示,让执行命令,根据提示执行命令查看详细信息[root@mufenggrow ~]# abrt-cli list --since 1673100767 id 901b9c001951f5d221faf7b8aa9e299eacb7be10 reason: vmtoolsd killed by SIGTRAP time: 2023年01月07日 星期六 22时19分26秒 cmdline: /usr/bin/vmtoolsd -n vmusr package: open-vm-tools-10.2.5-3.el7 uid: 0 (root) count: 1 Directory: /var/spool/abrt/ccpp-2023-01-07-22:19:26-88204 已禁用自动报告功能。请考虑启用该功能,方法是 作为有 root 特权的用户使用命令 'abrt-auto-reporting enabled' [root@mufenggrow ~]# 按照在上面提示的最下面的提示来操作,启动自动报告功能:abrt-auto-reporting enabled设置完后需要重启操作系统总结既然遇到了ABRT命令,我们就一起看看这个abrt-cli命令是干嘛的root@mufenggrow ~]# abrt-cli --help 用法:abrt-cli [--authenticate] [--version] COMMAND [DIR]... list, ls 列出 [in DIRs] 的问题 remove, rm 删除问题目录 DIR report, e 分析并报告 DIR 中的问题数据 info, i 输出有关 DIR 的信息 status, st 显示最近的崩溃计数 process, p 处理多个问题 查询了相关的资料,发现这个ABRT工具,是一个自动汇报错误分析工具:有三个作用:简化用户汇报软件问题的程序在提交给开发者的报告中提供全面的信息提供重要的故障数据以便排列优先次序及安排支持ABRT工具的工作流程:在最常用的编程环境下挂入专用的故障处置器为 C/C++ 应用程序注册故障时用的 core dump 程序为漏网的 Python 异常注册处置器为漏网的 Ruby 异常注册处置器提供 JNI 代理器检测漏网的 Java 异常在系统日志内寻找可疑的符串检测内核 oops检测 Machine-check 异常在 Xorg 的日志内检测 Xorg 故障检查描述问题的文件是否存在检测及检阅 kdump 创建的内核转储档提供命令行及图像界面工具(abrt-cli 及 gnome-abrt)发送报告及检阅已发报告在 ABRT 的故障数据服务器上收集数据。ABRT 服务器的主要用途是协助维护者安排工作的优先次序,及就已知或已修正的问题向用户提供指引。关于ABRT如何运作的知识,可以参考: https://abrt.readthedocs.io/en/latest/
文章
Java  ·  Linux  ·  C++  ·  开发者  ·  Ruby  ·  Python
2023-01-31
RabbitMQ学习笔记(一)----RabbitMQ的基本概念以及5种队列模式
概要今天开始学习消息中间件,根据项目需求,目前选择的消息中间件是RabbitMQ。让我们一起来认识下RabbitMQ吧。AMQP 的简介在说RabbitMQ之前我们先简单的认识一下AMQP 协议,AMQP(Advanced Message Queuing Protocol) 直译为高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP 的主要特征是是面向对象,队列,路由(包括点对点的发布/订阅)、可靠性,安全。RabbitMQ 的简介RabbitMQ 是一个开源的AMQP 实现,服务器端用Erlang 语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 同时其有消息确认机制和持久化机制,可靠性高。RabbitMQ 组件概念ConnectionFactory、Connection、ChannelConnection 是RabbitMQ的socket 链接,它封装了socket协议相关部分逻辑,ConnectionFactory是Connection的制造工厂,Channel 是我们 信息管道。我们的大部分业务操作都是在Channel 接口中完成,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等。Broker消息队列服务器的实体Exchange消息交换机,它指定消息按什么规则,路由到哪个队列。Queue消息队列的载体,每个消息都会被投入到一个或多个队列。可以看成是一个有序的数组,Binding绑定,是一个操作,它的作用就是把exchange和queue按照路由规则绑定起来。RabbitMQ中通过绑定,以路由键作为桥梁将Exchange与Queue 关联起来(Exchange---->Routing Key---->Queue) ,这样RabbitMQ 就知道如何正确地将消息路由到指定的队列了,通过queueBind方法将Exchange、Routing Key 与Queue绑定起来。Routing Key路由关键字,exchange 根据这个关键字进行消息投递,Routing Key 需要与Exchange Type 及Binding Key 联合使用才能最终生效。 RabbitMQ为Routing Key设定的长度限制为255 bytes。vhost虚拟主机,一个broker 里可以开设多个vhost,用作不同用户的权限分离。producer消息生产者,就是投递消息的程序。consumer消息消费者,就是接受消息的程序channel消息通道,在客户端的每个连接里,可建立多个channel,每个channel 代表一个会话任务。五种队列模式简单队列简单队列就是 生产者和消费者一对一工作队列工作队列就是一个生产者、2个消费者。但是在MQ中一个消息不能被两个消费者同时消费,要么被C1消费,要么被C2消费。这种模式类似于集群,能者多劳,性能好的可以安排多消费,性能低的可以安排低消费。默认分发方式: 轮询分发其他分发方式:公平分发使用公平分发,必须关闭自动应答,改为手动应答。消费者端添加代码:channel.basicQos(1);----------------------------------完美的分割线------------------------------------一般在实际应用场景中,我们基本上不会将消息直接投递到队列里,而是投递到Exchange(交换器,下图中的x)里, 由Exchange 将消息路由到一个或多个Queue 中。发布订阅模式这种模式可以满足消费者发布一个消息,多个消费者消费同一个消息的需求。广播给所有的接收者。如上图所示,生产者(P)发送到Exchange(X)的所有消息都会路由到图中的两个Queue,并最终被两个消费者(C1与C2)消费。1.一个生产者,多个消费者。通过交换器将消息投递到不同的队列里。2.每个消费者都有自己的队列3.生产者没有把消息发送到队列,而是发送到交换器Exchange里,Exchange 没有持久化功能,所以必须要与队列绑定4。每个队列都绑定到交换器5.生产者发送的消息经过交换器,路由到队列就能实现一个消息被多个消费者消费。发布订阅模式代码讲解伪代码—生产者1.创建mq连接,通道2.声明交换器–fanout 模式,把消息发送到交换器上(注意:交换器没有存储信息功能,不能持久化信息,因此,如果交换器没有绑定队列,那么消息就会丢失)伪代码—消费者3.创建mq连接,通道4.声明队列5.把队列绑定上交换器6.消费者监听该队列的通道路由器模式Routing路由模式是在订阅模式基础上的完善,可以在生产消息的时候加入key 值,与key 值匹配的消费者消费信息。以上图为例:我们以RoutingKey=“error” 发送消息到Exchange,则消息会路由到 Queue1(amqp.gen-S9b…,这是由RabbitMQ自动生成的Queue名称)和Queue2(amqp.gen-Agl…);如果我们以RoutingKey="info"或RoutingKey="warning"来发送消息,则消息只会路由到Queue2。如果我们以其他的RoutingKey来发送消息,则消息不会路由到这两个Queue中。路由器模式代码讲解伪代码–生产者1.创建mq链接、通道2.声明交换机–direct模式,把消息发送到交换机上,并指定routingKey,(注意:交换机没有存储信息功能,不能持久化消息,因此,如果交换机没有绑定队列,那么消息就丢失了)伪代码–消费者3.创建mq链接、通道4。声明队列5.把对列绑定到上交换机,并指定routingKey,多个就绑定多个routingKey消费者监听该队列的通道通配符模式–Topic 模式通配符模式是在路由模式的升级,它允许key模糊匹配,* 代表一个或者多个词,通过通配符模式我们可以将C1对应的一个key准确定为item.add。而C2 我们就不需要一个个写出key值,而是用item.# 代替即可。表示匹配一个。表示匹配一个或多个。如上图所示,我们以RoutingKey=“xx.orange.rabbit” 发送消息到Exchange,则消息会路由到Q1和Q2。RoutingKey=“lazy.orange.rabbit” 的消息会路由到Q1和Q2。RoutingKey="lazy.brown.fox"的消息会路由到Q2。RoutingKey=“lazy.pink.rabbit” 的消息会路由到Q2(只会投递给Q2一次,虽然这个RoutingKey与Q2的两个bindingKey 都匹配);routingKey=”quick.brown.fox”、routingKey=”orange”、routingKey=”quick.orange.male.rabbit”的消息将会被丢弃,因为它们没有匹配任何bindingKey通配符模式代码讲解伪代码–生产者1.创建mq链接、通道2.声明交换机–topic模式,把消息发送到交换机上,并指定routingKey(注意:交换机没有存储信息功能,不能持久化消息,因此,如果交换机没有绑定队列,那么消息就丢失了)伪代码–消费者3.创建mq链接、通道4.声明队列5.把对列绑定到上交换机,并指定routingKey(可以用*和#来进行模糊匹配)消费者监听该队列的通道RPC 模式MQ 本身是基于异步的消息处理,前面的示例中所有的生产者(P)将消息发送到RabbitMQ后不会知道消费者(C)处理成功或者失败。在实际的应用场景中,我们很可能需要一些同步处理,需要同步等待服务端将我的消息处理完成后在进行下一步的处理,这相当于RPC(Remote Procedure Call, 远程过程调用)。在RabbitMQ中也支持RPC参考https://blog.csdn.net/u013256816/article/details/59117354源代码https://github.com/XWxiaowei/90-Java-demo-2/tree/master/course-24-rabbitmq/rabbitmq-demo
文章
消息中间件  ·  存储  ·  安全  ·  前端开发  ·  Java  ·  中间件  ·  网络架构  ·  Ruby  ·  Python
2023-01-31
1 2 3 4 5 6 7 8 9
...
20
跳转至:
开发与运维
5628 人关注 | 131483 讨论 | 302136 内容
+ 订阅
  • 【原创】淘宝关键词搜索爬取与解析
  • C#实现把图片转换为ico格式
  • gRPC(八)生态 grpc-gateway 应用:同一个服务端支持Rpc和Restful Api
查看更多 >
人工智能
2797 人关注 | 11338 讨论 | 97083 内容
+ 订阅
  • 数据结构 | 链式二叉树【递归的终极奥义】
  • 基于springboot + Semantic UI 的个人博客系统(源码+开发过程的详细视频+部署说明,超详细,非常推荐!!!)
  • 算法工程师打死都要记住的20条常用shell命令
查看更多 >
安全
1195 人关注 | 23959 讨论 | 81356 内容
+ 订阅
  • 阿里云国际版如何注册图解
  • 阿里云国际版注册账号免备案,支持USDT等多外币
  • 阿里云国际版账号注册流程免绑卡余额充值
查看更多 >
数据库
252607 人关注 | 50875 讨论 | 94946 内容
+ 订阅
  • 阿里云国际版注册账号免备案,支持USDT等多外币
  • gRPC(六)进阶:拦截器 interceptor
  • 基于springboot + Semantic UI 的个人博客系统(源码+开发过程的详细视频+部署说明,超详细,非常推荐!!!)
查看更多 >
微服务
23000 人关注 | 11337 讨论 | 33332 内容
+ 订阅
  • gRPC(三)基础:gRPC快速入门
  • gRPC(一)入门:什么是RPC?
  • 面试必问:说一下 Java 虚拟机的内存布局?
查看更多 >