我知道如何使用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) 我创建了一个新的凤凰项目,当我运行mix phoenix.server时,我得到了
[error]后端端口未找到:: inotifywait
在我的控制台中红色.这看起来很危险,因为我还没有真正做过任何事情,所以看起来应该是有用的东西.
我正在尝试实现一个像骰子一样的代理:
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.
我正在用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,任何指针?
我遵循了本教程,我的简单测试总是因为这个错误而失败
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) 我有这个架构:
schema "editables" do
field :title, :string
field :content, :binary
timestamps
end
Run Code Online (Sandbox Code Playgroud)
我希望在应用程序启动时自动创建和填充几行,说我想创建:title包含以下字段的6个条目:page1,page2,......我应该这样做吗?
我想使用IEx.pry逐步使用我的elixir代码,比如ruby中的byebug或Java中的调试点.我试着在这里查看文档:https://github.com/elixir-lang/elixir/blob/4f68c4f10502e0f54a21093bb9a33957e63a9ac4/lib/iex/lib/iex.ex 但没有找到任何内容.谁有人建议这样做的方法?
我在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?
在读了两本书,编程Erlang(Joe Armstrong)和Programming Elixir(Dave Thomas)后,我对现实世界中的Erlang/Elixir有一些疑问.
我在科技谈话中看到了一张桌子(我制作了截图,但我忘记了来源.如果你知道,请发表评论):
+ ---------------------- + ------------------------- + --------- +
| 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) 安装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)
据我所知,我不需要添加任何其他东西.我按照这里的简单步骤:
编辑:我的路由器
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)