- 博客(173)
- 资源 (8)
- 收藏
- 关注
原创 Mix.Project
定义和操作 Mix 项目。Mix 项目是通过在模块中调用 来定义的,通常放置在 文件中:配置为了配置 Mix,使用 的模块需要导出一个 函数,该函数返回一个关键字列表,代表项目的配置。这个配置可以通过 读取。注意,如果没有定义项目, 也不会失败;这使得许多 Mix 任务在没有项目的情况下也能工作。如果一个任务需要项目被定义,或者需要访问项目中的特定函数,可以调用 ,如果项目没有定义,它会抛出 异常。 返回的选项列表并不固定,因为许多 Mix 任务都会从这个配置列表中读取自定义的选项。以
2024-12-11 17:15:53 287
原创 Elixir修改Hex镜像源及相关配置
在 Elixir 项目中,我们通过运行获取依赖,如果使用默认的国外镜像源,下载依赖时可能会遇到网络问题。这里我已经配置成国内镜像源了。要修改 Hex 镜像源,既可以通过命令,也可以通过命令行配置。环境变量是HEX_MIRROR。其实在的“修改镜像源”一节我也介绍了如何配置 Elixir 的镜像源。除了mirror_url,Hex 还有许多其他配置,我们可以通过以上是 Hex 2.0.6 版本的配置。
2024-12-09 14:34:27 546
原创 Elixir GenServer
GenServer是一个用来实现客户端-服务器模式中服务器的行为模块。GenServer是一个普通的 Elixir 进程,同其他 Elixir 进程一样,它可以用来保存状态、异步执行代码等。使用这个模块来实现通用服务器进程(GenServer)的优势在于,它有一套标准的接口函数,并提供用于跟踪和错误报告的功能。同时它也可以用到一个监督树中。fill:#333;color:#333;color:#333;fill:none;
2024-12-07 19:03:34 630
原创 Elixir Task.Supervisor
是一个任务监督者。该模块定义了一个监督者,可以用来动态监督任务。子进程描述支持的选项参见的文档。更多示例请参见Task模块。
2024-12-06 10:38:42 269
原创 Elixir DynamicSupervisor
一个被优化为仅动态启动子进程的监督者。Supervisor模块被设计用来处理静态子进程,它们在监督者启动时按给定顺序启动。启动时没有子进程。相反,子进程是通过按需启动的,且子进程之间没有顺序。这使得能通过使用高效的数据结构管理数百万子进程以及并发执行某些操作(如关闭)。
2024-12-06 10:13:34 638
原创 Elixir PartitionSupervisor
一个负载均衡监督者。在大型系统中,某些进程可能会成为瓶颈。如果这些进程是无状态的,或者它的状态在不同实例之间没有yi’lai可以被轻易地分区,并且它们之间没有依赖关系,那么它们可以使用 PartitionSupervisor 来创建多个隔离且独立的分区。
2024-12-06 10:12:01 474
原创 Elixir Supervisor
Supervisor是一个用于实现监督者的模块。监督者是一个监督其他进程的进程,被监督的进程我们称为子进程。监督者用来构建一个进程层级结构,称为监督树。监督树提供了容错性,并封装了应用的启动和停止。有两种方式启动监督者,一是通过,二是定义一个监督者模块并实现所需的回调。以下大部分示例都是使用前者,但也有使用后者的。
2024-12-05 19:24:18 1138
原创 Elixir Application
是用于处理应用和定义应用回调的模块。应用是 Erlang/OTP 中打包软件的惯用方式。为了理解这个概念,它类似于其他编程语言中常见的“库”的概念,但又有一些额外的特性。应用是一个实现特定功能的组件,具有标准化的目录结构、配置和生命周期。应用程序可以被加载、启动和停止。每个应用程序还有自己的环境,它提供了一个统一的API来配置每个应用。开发人员通常与应用环境及其回调模块打交道。因此,我们首先讨论它们,然后再深入应用资源文件和生命周期的细节。
2024-12-05 00:01:43 1105
原创 Elixir Task
用于方便的派生和等待异步任务。任务是一个执行一个特定动作的进程,期间几乎不与其他进程通信。任务的常用场景是通过异步计算将顺序代码转化成并发代码。通过async派生的任务可以(也只能)由调用进程等待结果,如上例所示。其原理是派生进程会在计算完成时向调用者发送一个消息。相比于通过spawn/1派生的进程,任务包含了监控和日志。除了async/1和await/2,任务也可以做为监控树的一部分启动,以及动态在远程节点派生。稍后我们会介绍。
2024-12-04 16:42:48 1100
原创 Elixir Agent
代理是一个围绕状态的简单抽象。在 Elixir 中,通常需要共享或存储状态,这些状态必须从不同的进程访问,或者由同一进程在不同时间点访问。Agent模块提供了一个简单的服务实现,允许通过简单的API访问和更新状态。
2024-12-04 16:39:42 406
原创 如何快速接纳 Emacs
之前一直使用 vscode 做为编辑器,但是后来我发现这家伙实在太费电了,即便我的笔记本有80瓦时的容量,也能明显感觉电量飞快流失。这让我非常不爽,于是我决定转向 Emacs,其实我接触 Emacs 也有较长一段时间了,但是一直没有完全投入它的怀抱,因为实在是不怎么习惯,用上 Emacs 就像突然瞎了一样,工作效率太低。所以我决定重新思考这个问题,为什么觉得不习惯,怎样才能快速习惯?
2024-11-01 16:17:24 1027
原创 Programming Elixir笔记
💡 等号代表模式匹配,当匹配成功时,就会发生绑定。其中表达式的值会做为模式匹配的结果。绑定只会发生在等号左边的变量,等号两边都没有变量或者变量出现在等号右边都只会做匹配。等号左边的变量可以重复绑定,也就是说绑定其实是可变的,所以做为函数式语言,elixir并不纯粹,不像Erlang,变量只能绑定一次。要让等号左边的变量只做匹配,不做绑定,可以使用,如^a=1,此时如果a的值不是1,匹配就会失败,因为不做绑定,所以a要提前绑定一个值。操作符称为 pin。此外,在同一次模式匹配中,变量是不变的,不可重复绑定。
2024-10-28 16:49:25 674
原创 如何在本地运行threejs官方示例
不是必须的,但是如果你的 js 文件中有中文,在浏览器打开查看的时候可能会看到乱码。像 gin 这样的框架,静态文件服务底层也是用的 go 原生库,所以也是加上上面的代码就可以了,如果不是用的 go 原生库封装的静态文件服务,就需要去看看对应的文档了。当然新版浏览器也支持这样的语法了,兼容性可以去网上查看,最新的 Edge 和 Google 应该都没问题。另外一个要注意的地方是,如果要自己编写 threejs demo,在引入 threejs 库的时候,可以。亲测不行,倍感崩溃。,这不就齐活了吗,然鹅。
2024-10-23 14:38:37 430
原创 数组中超过一半的元素
还有一种叫 Boyer-Moore 投票算法,时间复杂度 O(n),空间复杂度 O(1)。它的思路类似于消消乐,我们将超过一半的数叫做众数,先将数组分成众数和其他数两个阵营,然后一一相消,剩下的就是众数了。这个问题要解起来不难,暴力计数,转为 map,排序都能解决。但是他们的空间复杂度都不低,即便排序能做到 O(1) 的空间复杂度,但最低的时间复杂度也是 O(nlogn)。在 elixir 中我们可以用 reduce 来实现这个迭代过程。有一个数组,找出其中数量超过的元素是谁。
2024-10-18 15:32:43 194 1
原创 Elixir 工具篇
学习一门新的语言之前,有必要先了解下它提供的工具。通过这些工具我们才能编译和运行代码,这俗话说的好,纸上得来终觉浅,绝知此事,它要躬行呐!实践永远是学习的不二法门。相比于 erlang,elixir 提供的工具要更加现代化。安装完 elixir 之后,你会得到四个工具,它们都在 elixir 安装目录的bin目录下,分别是elixirelixirciex和mix。打开看一下你就会发现它们其实都是脚本。没错,都是脚本!这些文件中,不带扩展名的是 Linux 脚本,.batWindows 命令行脚本,
2024-10-18 10:07:31 1172
原创 生成 Excel 表列名称
一开始以为就是一个简单的26进制转换,到底还是大意了,这里的每一位都是没有0的,而且能取到进制的最大值。正常26进制每一位都是0到25,但是这里却是1到26。只不过和正常的 n 进制转换不同,我们不能直接用 n 去取模和取余,而是应该用 n-1。Excel 大家都用过,它的列名是用字母编号的,A 表示第一列,B 表示第二列,AA 表示第27列,AB 表示第28列等等。实际上每次都多加了1,所以在计算每一位的值时要将它减出来。来构造每一位的值,连递归都不用写了,可以说是十分优雅了。的范围是1到26,我们将。
2024-10-16 14:11:25 1214
原创 WordPress+Nginx 安装教程
WordPress是一个开源的网站建设工具,可以用它来“快速”搭建个人博客,官网等等。它本身是用 php 开发的,本身部署不复杂,主要是需要一些配套的东西才能跑起来,网上的一些教程也是写的不清不楚,本文针对非 php 技术栈人员, phper 勿扰。我们会分 Windows 和 Linux 两个平台来说明部署过程,由于 WordPress 本身是 php 开发的,与平台无关,所以首先我们从下载 WorpPress 源码,目前的最新版是 6.6.2。它是一个压缩包,到这里第一步就结束了。
2024-10-15 18:36:21 1282
原创 Elixir求解螺旋矩阵问题
首先我们把矩阵分成第一行和剩余部分,第一行很好生成,就是一个长度为 n 的递增数组,如果递归能构造出剩余部分,那么问题就解决了。我们是在 elixir 中求解,没有变量,没有循环,但是我们有递归。首先我们要先确定可重复的计算是什么,已 3x3 的螺旋矩阵为例,我们沿着顺时针方向用不同颜色标注出每次递归的内容,如下图所示。,但它是反过来,按顺时针方向螺旋输出矩阵,这不是巧了嘛这不,通过反转和转置,我们只需要每次将矩阵的第一行拼接到结果数组中就行了。在 elixir 中,矩阵矩阵转置也很秒,优雅,实在是优雅。
2024-09-27 18:09:01 443
原创 GitLab-CI/CD指南
由于公司没有运维,写go服务时各个环境编译部署还是略显麻烦,由于代码管理使用的是 gitlab,所以决定使用 gitlab 自带的 CI/CD 来做自动编译和部署,这样每次提交代码以后就可以自动部署到服务器上了。Executor的类型在注册 Runner 的时候确定,比较常用的是 Docker 和 SSH。GitLab,Runner 和 Executor 之间的关系如下图所示(图片来自GitLab官方文档)。
2024-08-10 18:54:18 2245 2
原创 BAT脚本for循环的坑
这里是第一个坑,bat 是解释执行的,它并不会重复展开同一个变量,我们需要使用。最近又在写 bat 脚本,主要是利用 for 循环遍历目录下的所有文件,然后做一些处理,很不巧,又遇到一些坑,特此记录一下。接下来是第二个坑,我在 for 循环内调用了另一些 bat 脚本,它需要不带扩展名的文件名称做为参数,假设我的脚本叫。出现这个问题和调用 bat 有关,如果是可执行程序的话,是没有这个问题的。,在进入第二遍循环时,变量也不再展开。关于这里的匹配规则,网上有大把的资料,我就不再多费笔墨了。
2024-07-31 22:48:05 900
原创 Elixir求解找零钱问题
没有循环和全局变量,这是从命令式语言转向函数式语言的一大障碍,许多人在使用函数式编程语言时,会突然发现自己不会写代码了。elixir其实也不是没有循环,函数式语言的循环可以通过列表和递归来实现,这是函数式语言的两大利器,用好列表可以解决绝大多数问题。好了思路清晰了,现在的问题是如何在循环过程中记录中间结果,毕竟没有全局变量可以用,而且变量还不可变。找零钱是一个经典的动态规划问题,我们需要利用一堆零钱凑出想要的金额,并使得使用的零钱数量最少。不仅可以用来做累加累乘,它的结果也可以是一个列表,字典,任意都行。
2024-07-20 18:42:08 265
原创 记录Linux安装go环境的一个坑
所以解压一直失败,用wget命令就可以了。go官网给的下载链接其实是一个302响应,在浏览器的调试窗口就能看到。可以说是简单至极了,但就是这么简单的一件事,却有一个坑,那就是下载的过程,如果是用curl下载,比如。curl命令默认不会跟踪重定向,而wget会。如果非要用curl下载需要使用。首先下载Linux安装包,然后解压配置环境变量即可,参考。这样就能正确下载go安装包了。
2024-07-08 10:59:48 517
原创 Windows服务运维脚本指南
但问题是我们希望程序能在独立的进程中运行,并且不带命令行窗口,不能随着命令行的关闭而结束,因为我的程序是一个网络服务,它需要一直运行。当然,获取进程PID并写入文件也可以通过脚本来实现,只是我的服务已经写入PID了,所以我的脚本就直接读取它了,感兴趣的朋友可以尝试自己实现通过脚本维护PID。选项不仅可以用来执行指令,还可以用来对结果进行过滤,这里我们希望提取第4行(注意第一行有空行),第二列的内容,也就是进程ID,和我们之前从pid文件中获取的进程id进行比较,来判断进程是否存在。,这样也能正确匹配。
2024-06-22 19:02:01 1514
原创 Go导入私有仓库
这个问题其实分两种情况来看,如果你自己的仓库是一个“正规”的仓库,使用域名访问,不带端口,通过HTTPS访问,唯一的区别是你的仓库是私有的。最后的最后,如果你使用的是GoLand或者IDEA,这类IDE好像有自己的环境变量机制,直接修改系统环境变量有时候不会生效,你需要在IDE里面设置或者在它的命令行通过。接下来就是比较复杂的情况,比如仓库是非标的,通过IP地址访问,或者需要带端口访问,还有只能通过HTTP访问等。如果你只有某个组下的仓库是私有的,可以通过路径指定,多个域名通过逗号分隔。
2024-04-09 13:59:02 973
原创 Phoenix概念篇
Elixir和Phoenix的作者也是Rails社区的核心开发者,如果是之前接触过Ruby on Rails的开发者,对Phoenix也许不会感到太陌生。笔者没有接触过Ruby on Rails,只能从Go语言的经验和角度出发去对比理解。如果说一开始Phoenix的确脱胎于Rails,经过这么多版本的迭代,加上Elixir的语法特点,Phoenix也一定产生了一些特有的变化。上一期我们学习了Phoenix入门篇,书接上回,这次我们重点介绍下Phoenix框架中的一些概念,并继续探索它的架构设计思想。
2024-03-26 16:58:06 1001
原创 Phoenix入门篇
Phoenix是Elixir开发的web框架,采用MVC架构。如果你有其他网络框架(如Ruby on Rails或Django)的开发经验,会对Phoenix的许多组件和概念感到熟悉。Phoenix兼顾了开发效率和运行性能,同时也有一些有趣的新特性,如用于实时通信的channel以及高效的预编译模板。在学习Phoenix之前,需要熟悉Elixir,因为Phoenix项目本身也是一个Elixir应用。本文是Phoenix的入门教程,旨在帮助你快速创建一个Phoenix项目并运行起来。
2024-03-19 11:56:46 1691
原创 JumpServer初探
如果刷新无效,可以点击表格中的主机名,这是一个链接,到资产详情页,右边有一个快速更新的模块,分辨点击这两个刷新按钮,看到OK后关掉,再回到资产列表,应该就能看到”可连接“状态变为绿色叉叉,并且服务器信息页成功显示出来了。在”用户“栏选择的是JumpServer的用户,也就是第一步创建的用户,”资产“栏也有系统用户选择,这里选的是第四步创建的用户,然后在资产栏选择运行访问的资产,这样一条授权规则就创建好了,他将JumpServer用户,服务器和服务器账户关联了起来。如果已有资产,可以点击更新设置特权用户。
2023-12-08 17:45:03 205
原创 Unity调用dll踩坑记
刚开始我们认为是dll本身的问题,但是经过测试发现dll本身没有问题,直接通过C#或者python调用dll,返回的内存都是正确的。使用debug库之后,调用dll时,unity直接崩溃,而且是悄无声息的,就这么退出了,不带走一片云彩。debug模式的dll该如何释放内存,目前还没有解决,但是如果不释放,确实会导致内存占用上涨,但好歹在编辑模式下,暂且放过它吧。刚开始确实很正常,直到后来有一次升级了dll,替换了部分依赖的dll,然后就GG了,dll返回的内存和预想不同,某些字节顺序被打乱了。
2023-11-23 21:18:38 1235
原创 【Phoenix】请求的生命周期
本文的目的是讨论Phoenix请求的生命周期。我们实战添加两个新的页面,并讨论整个过程是如何串起来的。让我们从添加第一个新页面开始。
2023-11-16 00:48:32 377
原创 安卓如何卸载应用
最后再强调一遍,此方式是用来卸载哪些无法通过正常方式卸载的系统应用的,而且不需要获取手机root权限,应该不会有人用这种方式卸载第三方应用吧。查看所有的包名,有些包名是可以大致猜出对应的应用的,毕竟大厂程序员写代码都讲究一个可读性。获取应用包名的方式比较多,这里我只讨论仅使用adb的方式,因为并不像为了这一点小事引入或安装更多东西。回车,然后在手机上打开你想卸载的软件,此时命令行中就会打印出刚才打开的软件的包名。说完了怎么卸载,那么最关键的是如何获取想要卸载的应用的包名呢?回车,退出监视模式,然后再用。
2023-08-09 23:55:45 979
原创 【erlang】并发篇
在之前的中,我们并没有介绍PID这个类型,它和并发息息相关,因此我们在这里来学习它。PID是进程标识符的意思,用来标识一个erlang进程。在所有相连的erlang节点中,PID都是唯一的。但是PID会被复用,当一个进程终止后,它的PID可以被其他进程再次使用。进程ID用尖括号包裹的3个点分十进制表示,每个分量是一个十进制数字,一般x和z都是零,如果是一个远端主机上的进程的话,x就不为0了。通过self/0函数可以获取进程自己的PID,is_pid/1函数可以用来判断一个值是否是PID。
2023-04-15 15:52:33 620 1
原创 rebar3安装-windows篇
已经不难看出它的地位了。rebar官网地址是,上面有安装和使用文档,推荐看一看。rebar3的安装并不像通常的windows程序那样简单直接,所以本文会对rebar的安装做一个介绍。能看到这里我就默认大家都有erlang环境了,所以我们直接进入rebar3的安装。
2023-04-14 21:59:48 1388
原创 【erlang】入门篇
欢迎入坑erlang,erlang是一种高并发,容错和分布式的函数式编程语言。本文详细介绍了erlang的安装和开发环境,如何使用erlang shell,以及如何运行erlang代码,既可以在erlang shell中运行,也可以在命令行中运行,也可以作为脚本运行。最后是关于erlang中一些语法约定。
2023-03-05 11:25:02 1370
原创 递归与尾递归
栈帧是一个函数一次运行的快照,是函数的内部状态。再多思考一点,如果将函数调用看作一条时间线,先执行的函数是过去,被调用的函数是未来,也就是过去需要用到将来的结果,这显然是不可能的,至少目前我们的物理学还是因果的。所以一般只有函数式编程语言的编译器会去做尾递归优化,然而并不是所有的递归都是天然的尾递归,许多时候需要我们手动消除状态,方式就是把局部变量(状态)变成参数,我称之为状态参数化。注意,尾递归优化需要编译器的支持,我们在这里讨论的是尾递归的本质以及如何把编译器不能优化的递归改写成可以优化的递归。
2023-02-17 12:52:54 493
原创 如何实现RTMP协议
rtmp是Adobe公司出品的流媒体传输协议,它的全称是Real Time Messaging Protocol,是一个实时消息传输协议,学习RTMP一定要抓住 一个关键点:消息。rtmp协议的原文可以在Adobe官网下载,内容十分精简,建议读一读原文。rtmp的核心是消息交换,是一个基于TCP的协议,消息被分成消息块(chunk)使用TCP传输。每个chunk都携带一个id,称为chunk id,接收端根据chunk id将分块重新组装成完整的消息。
2023-02-01 22:18:23 1899 4
原创 【操作系统】模式切换篇
什么是CPU的模式?这和CPU的发展过程有关,最开始CPU是8位的,后来发展到16位,然后是32位,现在是64位,多少多少位指的是寄存器的位宽。CPU能使用的寄存器宽度以及CPU使用的指令等就构成了CPU的模式,比如16位模式和32位模式,注意除了寄存器,不同模式下CPU对指令的解释也是不同的,因此16位模式的程序是不能在32位模式下运行的。为了向后兼容,后来的CPU要能运行在之前CPU的模式下,比如32位CPU也能跑16位模式,这样在之前CPU上编写的程序也能在新CPU上运行。
2022-12-14 21:03:41 1288
ColorBlack.css
2020-05-14
Geany暗黑主题文件
2019-11-09
Geany美化配置文件
2019-11-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人