小编ijt*_*ijt的帖子

我如何从Elixir安静地离开?

Process.exit(self, :normal)做的工作,但它打印出来** (EXIT from #PID<0.49.0>) normal.有没有办法退出没有消息?

elixir

23
推荐指数
1
解决办法
5118
查看次数

如何在Elixir应用程序中找到工作人员?

通过入门教程的主管和应用程序部分,我正在为底部的监督树问题编写单元测试.我尝试启动顶级主管,但失败了,出现此错误:

  1) test all buckets die if registry dies (KV.SupervisorTest)
     test/kv/supervisor_test.exs:4
     ** (EXIT from #PID<0.111.0>) shutdown: failed to start child: GenEvent
         ** (EXIT) already started: #PID<0.75.0>
Run Code Online (Sandbox Code Playgroud)

显然应用程序已经启动,因此我需要访问其工作进程.如果我有主管,我可以使用Supervisor.which_children来获取它们.要做到这一点,也许有助于运行kv应用程序:

iex(28)> kvpid = :application.info[:running][:kv]
#PID<0.77.0>
Run Code Online (Sandbox Code Playgroud)

所以现在我有了应用程序的PID.是否有某种方法可以从中获取根管理程序进程,或者我是否必须手动将其注册到某处以从测试中获取它?

或者有没有办法直接从他们的名字中获取工人?我试过:erlang.whereis但它找不到工人:

iex(33)> :erlang.whereis KV.Registry
:undefined
Run Code Online (Sandbox Code Playgroud)

我尝试直接使用模块的名称,但这也不起作用:

test "all buckets die if registry dies" do
    reg = KV.Registry
    KV.Registry.create(reg, "shopping")
    {:ok, shopping_bucket} = KV.Registry.lookup(reg, "shopping")

    Process.exit(reg, :shutdown)
    assert_receive {:exit, "shopping", ^shopping_bucket}
end
Run Code Online (Sandbox Code Playgroud)

它失败并出现此错误:

1) test all buckets die if registry dies (KV.SupervisorTest) …
Run Code Online (Sandbox Code Playgroud)

elixir erlang-otp

10
推荐指数
2
解决办法
4272
查看次数

使用Elixir Ecto,如何在迁移中添加has_many关系?

我想写这样的东西:

defmodule JobHunt.Repo.Migrations.CompaniesHaveManyJobs do
  use Ecto.Migration

  def change do
    alter table (:companies) do
      add :jobs, :has_many, Job
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

mix ecto.migrate使用此迁移运行会出错,那么正确的方法是什么?

elixir ecto

7
推荐指数
2
解决办法
4007
查看次数

如何找出 Docker 选择了哪个随机端口?

我跑了这个:

$ docker run -p 8080 --rm my_container 
Run Code Online (Sandbox Code Playgroud)

我猜将容器端口 8080 映射到主机上的某个随机可用端口。但是我如何找出哪个端口?

docker

7
推荐指数
1
解决办法
6133
查看次数

如何让 Elixir/Phoenix LiveComponent 向其自身而不是其父级发送消息?

我正在编写一个 ClockComponent 来了解 Phoenix LiveComponents。我几乎拥有它,但它正在向其父级发送 :tick 消息。我怎样才能让它向自己发送该消息?我想用myself()而不是self()但显然那不是一回事。

defmodule ClockComponent do
  use Phoenix.LiveComponent

  @impl true
  def mount(socket) do
    if connected?(socket), do: :timer.send_interval(1000, self(), :tick)
    {:ok, assign(socket, date: :calendar.local_time())}
  end

  def handle_info(:tick, socket) do
    {:noreply, assign(socket, date: :calendar.local_time())}
  end

  @impl true
  def render(assigns) do
    ~L"""
    The time is <%= @date |> Timex.to_datetime("America/Denver") |> Timex.format!("{RFC1123}") %>
    """
  end
end
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework phoenix-live-view

7
推荐指数
1
解决办法
2106
查看次数

为Erlang监督员准备临时子女有什么意义?

主管在那里重启失败的进程.临时进程是永远不应重新启动的进程.那么,为什么要为主管打扰这种类型的孩子呢?是否主要是因为它们可以作为one_for_all策略的一部分终止,或者当应用程序终止时?

erlang erlang-otp

6
推荐指数
2
解决办法
421
查看次数

为什么GNU configure将SIZEOF_INT等的宏定义为特定的整数值?

如果您要完全定义这些,为什么不将它们定义为

#define SIZEOF_INT sizeof(int)
Run Code Online (Sandbox Code Playgroud)

即使有人试图使用它们来编译不同的架构,它们也是正确的吗?

c

6
推荐指数
1
解决办法
72
查看次数

如何使用Elixir制作单文件脚本,而不会产生过多的输出?

我想做一些似乎应该很简单的事情,即创建一个输出问候消息的脚本而不是其他内容.这个脚本非常简单,不需要多个文件.这是我试过的:

[ ~/elixir ] cat hello.exs
#!/usr/bin/env iex
IO.puts "Hello world!"
:init.stop

[ ~/elixir ] ./hello.exs
Erlang/OTP 17 [erts-6.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Hello world!
Interactive Elixir (1.0.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> [ ~/elixir ]
Run Code Online (Sandbox Code Playgroud)

这非常接近期望的结果,但我正在寻找像--quiet或--silent标志来抑制Erlang和Elixir启动消息.将-S标志添加到iex没有帮助:

[ ~/elixir ] cat hello.exs
#!/usr/bin/env iex -S
IO.puts "Hello world!"
:init.stop

[ ~/elixir ] ./hello.exs
Erlang/OTP 17 [erts-6.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

-S : Could not find executable ./hello.exs
Run Code Online (Sandbox Code Playgroud)

我知道有可能( …

elixir

5
推荐指数
1
解决办法
1119
查看次数

如何在 Go 中以编程方式将 SQS 队列订阅到 SNS 主题?

这是我尝试使用的 aws-sdk-go 版本 53eb8b070e9a5067829fd029539966181632032a。

// main.go
package main

import (
    "errors"
    "fmt"
    "log"
    "net/http"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/sns"
    "github.com/aws/aws-sdk-go/service/sqs"
)

func main() {
    if err := makeTopicAndQueue(); err != nil {
        log.Fatalf("aws-sns-sqs: %v", err)
    }
}

func makeTopicAndQueue() error {
    sess, err := session.NewSession(&aws.Config{
        HTTPClient:  &http.Client{},
        Region:      aws.String("us-east-2"),
        Credentials: nil,
        MaxRetries:  aws.Int(0),
    })

    log.Printf("Creating an SNS topic.")
    snsClient := sns.New(sess, &aws.Config{})
    topicName := "test-topic"
    out, err := snsClient.CreateTopic(&sns.CreateTopicInput{Name: aws.String(topicName)})
    if err != nil {
        return fmt.Errorf(`creating topic "%s": %v`, topicName, err) …
Run Code Online (Sandbox Code Playgroud)

aws-sdk-go

5
推荐指数
1
解决办法
2002
查看次数

如何列出 Go 项目中的所有导入周期?

我正在重构一个 Go 项目,其中所有内容都在一个模块中,并拆分出子包。完成此操作后,会有许多导入周期。为了让项目再次编译,我必须消除它们。但是,在进行了我认为消除了周期的更改后,导入周期计数似乎保持不变。我用这个命令计算周期:

go build 2>&1 | grep package | wc -l
Run Code Online (Sandbox Code Playgroud)

即使我做了看起来应该删除一个周期的工作,甚至在我不再在列表中看到我删除的周期之后,它仍然报告 6。这让我想知道它是否只报告了问题的一部分。

我也尝试过

go build -gcflags="-e" 2>&1 | grep package | wc -l
Run Code Online (Sandbox Code Playgroud)

正如https://menno.io/posts/showing-all-go-compiler-errors/所建议的,但它给出了相同的结果。

go

5
推荐指数
1
解决办法
361
查看次数