小编Kir*_*ill的帖子

初学者的Erlang/OTP行为

正如我从"Erlang and OTP in action"一书中所理解的那样,行为一词指的是:

  • 行为界面,这是一组功能;
  • 行为实现,即特定于应用程序的代码(回调模块);
  • 行为容器,这是一个过程.

题:

Erlang/OTP初学者应该了解哪些行为?是否有可能简单地描述和理解OTP行为的概念?

什么'回调函数'在Elang/OTP的上下文中实际意味着什么?

我们可以考虑行为实现中的回调,因为Java中的方法会覆盖吗?

该书说,以下代码中库函数'gen_server:start_link/4'的关联回调函数是'Module:init/1'.

这是否意味着使用init/1我们调用gen_server:start_link/4库函数?或者这意味着什么呢?

-module(tr_server).

-behaviour(gen_server).

-include_lib("eunit/include/eunit.hrl").

%% API
-export([
         start_link/1,
         start_link/0,
         get_count/0,
         stop/0
         ]).

%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
         terminate/2, code_change/3]).

-define(SERVER, ?MODULE).
-define(DEFAULT_PORT, 1055).

-record(state, {port, lsock, request_count = 0}).


%%%===================================================================
%%% API
%%%===================================================================


%%--------------------------------------------------------------------
%% @doc Starts the server.
%%
%% @spec start_link(Port::integer()) -> {ok, Pid}
%% where
%%  Pid = pid()
%% @end
%%--------------------------------------------------------------------
start_link(Port) ->
    gen_server:start_link({local, ?SERVER}, ?MODULE, [Port], []).

%% @spec start_link() …
Run Code Online (Sandbox Code Playgroud)

erlang callback erlang-otp

30
推荐指数
3
解决办法
8417
查看次数

如何调试Erlang代码?

我有一些Ruby和Java背景,我习惯于在错误日志中有确切的行数.

因此,如果编译代码中存在错误,我将在控制台输出中看到导致异常的行数.

就像在这个Ruby示例中一样:

my_ruby_code.rb:13:in `/': divided by 0 (ZeroDivisionError)
    from my_ruby_code.rb:13
Run Code Online (Sandbox Code Playgroud)

它简单而快速 - 我只需转到第13行并修复错误.

相反,Erlang只是说:

** exception error: no match of right hand side value [xxxx]
 in function my_module:my_fun/1
 in call from my_module:other_fun/2
Run Code Online (Sandbox Code Playgroud)

没有行号可供查看.

如果我有两行像

X = Param1,
Y = Param2,
Run Code Online (Sandbox Code Playgroud)

在'my_fun'中,怎么能理解问题出在哪一行?

另外,我试图从Vim切换到Emacs + Elang模式,但到目前为止我唯一的奖励就是能够在Emacs(Ck`)中循环编译错误.

因此,编写代码和寻找简单的逻辑错误(如"右手边不匹配")的过程似乎有点麻烦.

我试图在代码中添加许多"io:format"行,但这是需要时间的额外工作.

我也尝试过使用distel,但只需要10步就可以打开调试器一次.

问题:

  1. 调试Erlang代码的最简单直接的方法是什么?
  2. 与Vim相比,Emacs的erlang模式在Erlang开发方面有哪些优势?
  3. 您更喜欢哪种开发'write-compile-debug'循环?你是否让Emacs编译并运行终端中的代码?如何在Erlang代码中搜索错误?

debugging vim emacs erlang

29
推荐指数
3
解决办法
1万
查看次数

原始地理坐标与图形节点之间的最短路径

我已经实现了一个简单的Dijkstra算法,用于在Java上查找.osm地图上的最短路径.

从.osm文件创建的图形中的路径查找效果非常好.但是,如果用户的当前位置和/或目标不是此图的节点(只是原始坐标),我们如何将这些坐标"链接"到图形以使路径查找工作?

简单直接的解决方案"找到最接近当前位置节点并绘制直线"似乎并不现实.如果我们遇到附图所示的情况怎么办?(UPD) 在此输入图像描述

这里的问题是,在我们开始任何"智能"寻路算法(如Dijkstra's)之前,我们将当前位置与图形"链接",但它只是根据毕达哥拉斯定理的一个愚蠢的公式(斜边是一个斜边)来找到最近的节点.地理坐标和这个公式不是"寻路" - 它不能考虑障碍和节点类型.

换句话说 - 如果B是图中的节点,我们如何找到A和B之间的最短路径,而A不是节点?

您是否听说过此问题的其他解决方案?

java dijkstra geospatial shortest-path pythagorean

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

如何从.osm文件在数据库中构建"道路"图

要求的结果:

具有两个表,"边缘"和"节点"的数据库,可用于生成表示某个区域(例如城市)中所有可行驶道路(高速公路)的图形.数据集是从.osm文件解析的.

背景:

我要第二次尝试创建一个包含两个表的数据库 - 节点和边,可用于对其进行不同的最短路径计算.

首先,我尝试手动将不同的数据提取到数据库中(php脚本):

  • 将.osm文件中的所有节点解析为"节点"表
  • 将所有边解析为'edges'表(即解析方法并生成边缘(由起始节点和目标节点组成),同时将标记添加到边缘;
  • 从边缘表中删除所有具有黑名单标签(不是高速公路)的边缘;
  • 从节点表中删除边表中不存在的所有节点.

问题是这个序列非常不可靠,它只能在小型数据集上运行"如此",例如数千个节点,而不是数百万个.

问题:

对于由数百万个节点和边组成的数据库,道路提取(基于某个标签过滤器生成边缘)非常慢.

可能的方法:

我这次要做的事情:

  • 设置PostgreSQL rdbms;
  • 使用OSM现成脚本解析.osm文件以获取完整的节点,方式和关系表;
  • 使用某些标签(例如"高速公路")将所有边缘从路径表中提取到新的"边缘"表中;
  • 将edge表中存在的所有节点提取到一个新的graph_nodes表中;
  • 之后我可能会从'edges'和'graph_nodes'表中生成一个'道路'图表.

题:

如何正确地将.osm文件解析为数据库以使"边"和"节点"表成为结果?

如何从.osm中仅将可行驶的道路提取到数据库中?

我该如何快速完成(我的意思是为数百万个节点和边缘表运行数小时的脚本,而不是数周)?

我应该考虑到关系吗?

如果是的话,我该怎么做?

mysql postgresql openstreetmap xml-parsing

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

PostgreSQL 中可以并行 SELECT 语句吗?

SQL和数据库新手的一个问题

我读过一些关于数据库并发的文章,但同时更新是其中描述最频繁的事情。

但是,我只想从数据库中获取信息。

所以,有以下问题:

是否可以同时从数据库中执行多个 SELECT?这些 SELECT 会干扰吗?情况2可能吗?

通常情况(1):

  • [经过时间:0秒]
  • 从表 1 中选择内容 1
  • 获取第一个 SELECT 的结果
  • [经过时间:1.5秒]
  • 从表 1 中选择某些内容 2
  • 获取第二个 SELECT 的结果
  • [经过时间:3秒]

并发查询案例(2):

  • [经过时间:0秒]
  • 从表 1 中选择内容 1
  • [经过时间:0.001秒]
  • 从表 1 中选择某些内容 2
  • 获取第一个 SELECT 的结果
  • [经过时间:1.5秒]
  • 获取第二个 SELECT 的结果
  • [经过时间:1.5001秒]

postgresql parallel-processing

4
推荐指数
1
解决办法
9448
查看次数