小编Jan*_*Jan的帖子

依赖解析算法

我正在编写包管理器,为此我希望依赖解析尽可能强大.

每个包都有一个版本列表,每个版本包含以下信息:

  • 可比身份证
  • 依赖关系(包列表以及每个包的一组可接受的版本)
  • 冲突(包的列表以及每个包的一组导致与此版本一起出现问题的版本)
  • 提供(包的列表以及每个包的一个版本,该包也提供/包含)

对于当前状态,我有一个包列表及其当前版本.

我现在想,在给定可用包列表和当前状态的情况下,能够在包列表中获取每个包的版本,考虑给定的约束(依赖性,冲突包,其他包提供的包)和获取每个软件包的版本列表.循环依赖是可能的.

如果无法达到有效状态,则可以更改现有软件包的版本,但这只应在必要时进行.如果无法获得有效状态,应尽可能多地获取原因信息(告诉用户"如果删除X则可以正常工作"等).

如果可能,还应该可以将软件包"锁定"到特定版本,在这种情况下,软件包的版本可能不会更改.

我想要完成的工作与现有的包管理器已经完成的工作非常相似,区别在于不一定需要使用最新版本的包(大多数包管理器似乎都在做的假设).

到目前为止,我唯一的想法是为所有可能版本的包构建所有可能状态的结构,然后删除无效状态.我真的希望这不是唯一的解决方案,因为它感觉非常"蛮力" - 非常.保持在几秒钟内可以获得~500个可用的包,每个包含约100个版本,并且~150个已安装的包将是一个很好的目标(尽管越快越好).

我不相信这是一个特定于语言的问题,但为了更好地说明它,这里有一些pseudecode:

struct Version
    integer id
    list<Package, set<integer>> dependencies
    list<Package, set<integer>> conflicts
    list<Package, set<integer>> provides

struct Package
    string id
    list<Version> versions

struct State
    map<Package, Version> packages
    map<Package, boolean> isVersionLocked

State resolve(State initialState, list<Package> availablePackages, list<Package> newPackages)
{
    // do stuff here
}
Run Code Online (Sandbox Code Playgroud)

(如果你应该有实际的代码或者知道某些事情的现有实现(使用任何语言,C++首选),请随时提及它)

algorithm dependency-management

16
推荐指数
1
解决办法
6821
查看次数

使用void_t检测成员

对于C++ 14中的成员检测,我在这里使用了基于示例的代码,但它似乎没有用.

一个完整的例子:

#include <string>

template <typename...>
using void_t = void;

template <typename, typename = void> class HasMember_substr : public std::false_type {};
template <typename T> class HasMember_substr<T, void_t<typename T::substr>> : public std::true_type {};

template <typename, typename = void> class HasMember_fff : public std::false_type {};
template <typename T> class HasMember_fff<T, void_t<typename T::fff>> : public std::true_type {};

static_assert(HasMember_substr<std::string>::value, "");
static_assert(!HasMember_fff<std::string>::value, "");

int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)

使用编译clang++ --std=c++14 test.cpp在OS X上,编译器版本(clang++ --version):Apple LLVM version 7.0.2 …

c++ c++14

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

NGINX auth_request被忽略

我的nginx.conf中包含以下内容:

location / {
    auth_request /auth;
    add_header Content-Type text/plain;
    return 200 'You are in!';
}

location = /auth {
    proxy_pass http://localhost:5021/auth;
    proxy_pass_request_body off;
    proxy_set_header Host $http_host;
    proxy_set_header X-Original-URI $request_uri;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Authorization $http_authorization;
    proxy_pass_header Authorization;
}
Run Code Online (Sandbox Code Playgroud)

因此,我希望http://localhost:5021/auth在尝试到达时可以访问(一个Flask应用)/。这不会发生,并且使用nginx-debug二进制文件,并且error_log /var/log/nginx/error.log debug;我从没看到期望看到的任何调试输出(请求的日志在此处)。没有错误,没有打印到控制台,也没有任何nginx的日志文件。似乎auth_request只是默默地忽略了该行。

nginx-debug -V(确实包含--with-http_auth_request_module)的输出:

nginx version: nginx/1.15.8
built by gcc 6.4.0 (Alpine 6.4.0) 
built with OpenSSL 1.0.2q  20 …
Run Code Online (Sandbox Code Playgroud)

nginx

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

graphviz circo中节点之间的空间太大

我有一个简单的 .dot 文件(graphviz),如下所示:

digraph Mapper{
  Mapper [label=Mapper];

  General [label=General];
  GeneralNew [label=New];
  GeneralOpen [label=Open];
  GeneralSave [label=Save];
  GeneralClose [label=Close];
  GeneralSettings [label=Settings];
  GeneralHelp [label=Help];
  GeneralAbout [label=About];
  GeneralNewLoad [label="Load symbol set"];
  GeneralNewLoadFile [label="Load symbol set from file"];
  GeneralNewNoLoad [label="Don't load symbols"];
  GeneralOpenFiles [label="OCD|OMAP", shape=record];
  GeneralOpenRecent [label="Open recent"];
  GeneralSaveFiles [label="OMAP|MapperXML", shape=record];
  GeneralHelpStartup [label="Startup tips"];
  GeneralHelpHTML [label="HTML Help"];
  GeneralHelpWhatsThis [label="What's this?"];
  General -> GeneralNew;
  General -> GeneralOpen;
  General -> GeneralSave;
  General -> GeneralClose;
  General -> GeneralSettings;
  General -> GeneralHelp;
  General -> GeneralAbout;
  GeneralNew -> GeneralNewLoad;
  GeneralNew …
Run Code Online (Sandbox Code Playgroud)

dot graphviz

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

Flex RegEx 未匹配?

我现在已经使用 Flex/Bison 工作了大约 6 个小时,这是我无法解决的第一个问题:

我有以下文件...

 state state1: {
     1-3: 255
     4: 255
 }
Run Code Online (Sandbox Code Playgroud)

...我使用 cat 和 | 将其传递给我的 flex/bison 程序。Flex 文件包含这一行:

\bstate\b  { return STATE; }
Run Code Online (Sandbox Code Playgroud)

再往下看这一点:

.*         { fprintf(stderr, "Lexer error on line %d: \"%s\"\n", linenum, yytext); exit(-1); }
Run Code Online (Sandbox Code Playgroud)

人们应该认为 \bstate\b 应该在文件中匹配,但事实并非如此。相反,我得到以下输出:

"exer error on line 1: "state state1: {
Run Code Online (Sandbox Code Playgroud)

这在几个方面都很奇怪。首先,Lexer 中的 L 接缝已被“替换”,但更重要的是,状态没有匹配。为什么???

当然,\bstate\b 位于 .* 之前,并且它们位于正确的部分。

谢谢你的帮助,简

regex bison flex-lexer

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