标签: elixir

Elixir:我可以使用Stream.resource逐步读取大数据文件吗?

我知道如何使用Stream.resource()从文件中获取前5行并将它们放在列表中.

str = Stream.resource(fn -> File.open!("./data/fidap011.mtx") end,
                fn file ->
                  case IO.read(file, :line) do
                    data when is_binary(data) -> {[data], file}
                    _ -> {:halt, file}
                  end
                end,
                fn file -> File.close(file) end)
str |>  Enum.take(5)
Run Code Online (Sandbox Code Playgroud)

但是,如何从同一个流中获取接下来的5行呢?如果我再次输入:

str |>  Enum.take(5)
Run Code Online (Sandbox Code Playgroud)

我刚刚得到相同的前5行.

我错过了一些明显的东西吗?

最后,我希望从我的流中读取足够的数据,以产生一些处理该数据的进程.当其中一些进程完成时,我希望从同一个流中读取更多内容,从而处理下一组数据等.应该在这里使用Stream.chunk()吗?但是,如果没有一个例子,我似乎无法直觉.

编辑 - 稍后进行几次设计迭代!

为了我的目的,不使用Stream更容易.相反,我简单地使用创建文件指针/进程

{:ok,fp} = File.open("data/fidap011.mtx")

然后我实际上将那个fp传递给了30000个不同的衍生过程,并且当他们喜欢时,他们可以毫不费力地阅读它.这些进程中的每一个都通过从文件中读取新的状态变量来改变其状态.在下面的模块中oR,vR是两个接收消息的"路由器"进程 - 代码是稀疏矩阵/向量乘法器的一部分.

defmodule M_Cells do
 @moduledoc """
 Provides matrix related code
 Each cell process serves for that row & col
 """

 defp get_next_state( fp ) do
    case …
Run Code Online (Sandbox Code Playgroud)

elixir

12
推荐指数
1
解决办法
5730
查看次数

Ubuntu上的新凤凰项目找不到[错误]后端端口:: inotifywait

我创建了一个新的凤凰项目,当我运行mix phoenix.server时,我得到了

[error]后端端口未找到:: inotifywait

在我的控制台中红色.这看起来很危险,因为我还没有真正做过任何事情,所以看起来应该是有用的东西.

elixir phoenix-framework

12
推荐指数
1
解决办法
1447
查看次数

Elixir - Agent中的随机数字

我正在尝试实现一个像骰子一样的代理:

defmodule Dice do
  @on_load :seed_generator

  def start_link(opts \\ []) do
    Agent.start_link(fn -> [] end, name: __MODULE__)
  end

  def roll(n, val) do
    Agent.cast(__MODULE__, fn(_) ->
      Stream.repeatedly(fn -> :random.uniform(val) end)
      |> Enum.take(n)
    end)
  end

  def seed_generator do
    :random.seed(:erlang.now)
    :ok
  end
end
Run Code Online (Sandbox Code Playgroud)

但是,每次重新启动iex时生成的数字都是相同的.我究竟做错了什么 ?种子不工作,因为 :random.uniform呼叫在代理内部?或者与may相关的东西Stream.

random agent elixir

12
推荐指数
1
解决办法
665
查看次数

在Phoenix Application中为异常设置自定义响应

我正在用ecto写凤凰应用程序,并在测试中有以下片段

{:ok, data} = Poison.encode(%{email: "nonexisting@user.com", password: "mypass"})

conn()
|> put_req_header("content-type", "application/json")
|> put_req_header("accept", "application/json")
|> post(session_path(@endpoint, :create), data)
> json_response(:not_found) == %{}
Run Code Online (Sandbox Code Playgroud)

这会抛出一个Ecto.NoResultsError

我有这个定义

defimpl Plug.Exception, for: Ecto.NoResultsError do
  def status(_exception), do: 404
end
Run Code Online (Sandbox Code Playgroud)

但测试仍然抛出Ecto.NoResultsError,任何指针?

elixir ecto phoenix-framework

12
推荐指数
2
解决办法
1779
查看次数

"无法开始测试交易,因为我们已经在一个内部"

我遵循了本教程,我的简单测试总是因为这个错误而失败

1) test /index returns a list of contacts (WorldNote.ChatsControllerTest)                                             
     test/controllers/chats_controller_test.exs:16                                                                      
     ** (RuntimeError) cannot begin test transaction because we are already inside one                                  
     stacktrace:                                                                                                        
       (ecto) lib/ecto/adapters/sql.ex:321: anonymous fn/6 in Ecto.Adapters.SQL.start_test_transaction/3                
       (ecto) lib/ecto/adapters/sql.ex:615: Ecto.Adapters.SQL.pool_transaction/4                                        
       (ecto) lib/ecto/adapters/sql.ex:314: Ecto.Adapters.SQL.start_test_transaction/3                                  
       test/controllers/chats_controller_test.exs:9: WorldNote.ChatsControllerTest.__ex_unit_setup_0/1                  
       test/controllers/chats_controller_test.exs:1: WorldNote.ChatsControllerTest.__ex_unit__/2    
Run Code Online (Sandbox Code Playgroud)

代码很简单

defmodule WorldNote.ChatsControllerTest do
  use ExUnit.Case, async: false
  use Plug.Test
  alias WorldNote.Chats
  alias WorldNote.Repo
  alias Ecto.Adapters.SQL

  setup do
    SQL.begin_test_transaction(Repo)

    on_exit fn ->
      SQL.rollback_test_transaction(Repo)
    end
  end

  test "/index returns a list of contacts" do
    contacts_as_json =
      %Chats{fbid: 1234567890, latitude: …
Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

12
推荐指数
1
解决办法
760
查看次数

如何在Phoenix应用程序启动时预先填充数据库?

我有这个架构:

schema "editables" do
    field :title, :string 
    field :content, :binary
   timestamps
end
Run Code Online (Sandbox Code Playgroud)

我希望在应用程序启动时自动创建和填充几行,说我想创建:title包含以下字段的6个条目:page1,page2,......我应该这样做吗?

elixir ecto phoenix-framework

12
推荐指数
1
解决办法
4409
查看次数

Iex撬开一步一步走?

我想使用IEx.pry逐步使用我的elixir代码,比如ruby中的byebug或Java中的调试点.我试着在这里查看文档:https://github.com/elixir-lang/elixir/blob/4f68c4f10502e0f54a21093bb9a33957e63a9ac4/lib/iex/lib/iex.ex 但没有找到任何内容.谁有人建议这样做的方法?

elixir phoenix-framework iex

12
推荐指数
1
解决办法
2245
查看次数

获取控制台用户输入为chard,char为char

我在Elixir有一个控制台应用程序.我需要通过按键来解释用户的输入.例如,我需要将"q"视为结束会话的命令,而无需用户明确按" aka回车".

IO.getn/2令人惊讶地等待按下,缓冲输入(我几乎可以肯定,这个缓冲是由控制台本身完成的,但是man stty没有提供任何帮助/标志来关闭缓冲.)

Mix.Utils 使用无限循环隐藏用户输入(基本上每隔1ms向控制台发送退格控制序列)IEx代码包含对标准erlang的调用io,这提供了设置回调的唯一能力Tab(用于自动完成).

我的猜测是我必须使用Port,将它附加到:stdin并生成一个进程来监听输入.不幸的是,我坚持尝试实现后者,因为我需要连接到当前运行的控制台,而不是为其他进程创建一个新端口(因为这里有完美的描述.)

我失去了对我怎么附加一个明显的东西Port到当前进程的:stdin(这是BTW列出Port.list/0)或者我应该已经建立了全3管道架构重定向什么类型来:stdin和任何我的程序要puts:stdout

console port command-line-interface elixir

12
推荐指数
2
解决办法
795
查看次数

Erlang/Elixir如何在现实世界中发挥作用

在读了两本书,编程Erlang(Joe Armstrong)Programming Elixir(Dave Thomas)后,我对现实世界中的Erlang/Elixir有一些疑问.

Q1:统一后端开发

我在科技谈话中看到了一张桌子(我制作了截图,但我忘记了来源.如果你知道,请发表评论):

+ ---------------------- + ------------------------- + --------- +
| Technical requirement  | Server A                  | Server B  |
+ ---------------------- + ------------------------- + --------- +
| HTTP Server            | Nginx & Phusion           | Elixir    |
| Request Processing     | Ruby on Rails             | Elixir    |
| Long Running Requests  | Go                        | Elixir    |
| Server-Side State      | Redis                     | Elixir    |
| Persistable Data       | Redis & Mongo             | Elixir …
Run Code Online (Sandbox Code Playgroud)

erlang elixir

12
推荐指数
1
解决办法
1089
查看次数

Absinthe.Plug不可用

安装absinthe_plug后,我收到以下错误:

= Compilation error in file lib/kerrigan_api_web/router.ex ==
** (UndefinedFunctionError) function KerriganApiWeb.Absinthe.Plug.init/1 is undefined (module KerriganApiWeb.Absinthe.Plug is not available)
Run Code Online (Sandbox Code Playgroud)

这是我的代表

{:phoenix, "~> 1.3.0"},
  {:phoenix_pubsub, "~> 1.0"},
  {:phoenix_ecto, "~> 3.2"},
  {:postgrex, ">= 0.0.0"},
  {:phoenix_html, "~> 2.10"},
  {:phoenix_live_reload, "~> 1.0", only: :dev},
  {:gettext, "~> 0.11"},
  {:cowboy, "~> 1.0"},
  {:poison, "~> 3.1"},
  {:absinthe, "~> 1.3.0"},
  {:absinthe_plug, "~> 1.3.0"},
  {:absinthe_ecto, git: "https://github.com/absinthe-graphql/absinthe_ecto.git"},
  {:faker, "~> 0.7"},
Run Code Online (Sandbox Code Playgroud)

据我所知,我不需要添加任何其他东西.我按照这里的简单步骤:

absinthe_slug

编辑:我的路由器

defmodule KerriganApiWeb.Router do
  use KerriganApiWeb, :router

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash …
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework

12
推荐指数
1
解决办法
1987
查看次数