小编Edw*_*ang的帖子

查找定义 C 函数的头文件

应该不难吧?对?

我目前正在搜索 OpenAFS 代码库以查找 pioctl 的标头定义。我已经把所有的东西都扔了:检查 ctags,搜索 pioctl 的源代码等。我最接近线索的是,有一个包含定义的文件 pioctl_nt.h,除了它是实际上不是我想要的,因为没有一个用户空间代码直接包含它,而且它是特定于 Windows 的。

现在,我不希望您去下载 OpenAFS 代码库并为我找到头文件。不过,我很好奇:当其他一切都失败时,您有什么技巧可以找到所需的头文件?最坏的情况是什么,可能导致代码库中 pioctl 的 grep 实际上没有提出任何看起来像函数定义的东西?

我还应该注意,我可以访问两个已经正确完成的独立用户空间程序,因此理论上我可以对函数进行 O(n) 搜索。但是没有一个头文件弹出给我,而且 n 很大......

编辑:当前问题已解决:pioctl() 是隐式定义的,如下所示:

AFS.xs:2796: error: implicit declaration of function ‘pioctl’
Run Code Online (Sandbox Code Playgroud)

c header openafs

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

ncurses到外壳,然后用键搞乱

我有这个ncurses应用程序正在执行标准配方,暂时退出ncurses,运行外部编辑器/ shell /等等,然后在完成后退回到ncurses.

这几乎是有效的,除了之后ncurses得到的前几个按键显然是假的; 如果我按两次向上箭头,ncurses认为^ [和A分别被看到.

以前有人见过这种行为并知道解决这个问题的神奇之处是什么?如果它有帮助,这是Ruby ncurses库.

ruby ncurses

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

Yesod为一个站点提供多个持久后端

开发和生产之间的一个常见模式是开发网站将使用sqlite,因为它是零设置,但随后在生产中使用PostgresSQL或MySQL.但是,在Yesod生成的默认Settings.hs脚手架文件中,只指定了一个持久后端.有没有办法让开发配置使用一个持久后端,而生产配置又使用另一个?此外,这些应具有不同的数据库设置YAML文件,以便可以为sqlite配置简单的文件名,但生产数据库凭据永远不会访问VCS存储库.

haskell yesod

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

GitHub:如何对超过1500行的新文件进行代码审查

在我工作的项目中,我们有一个主要功能分支,即将合并到主分支中.有很多提交不应单独审核,所以我为分支创建了一个PR并查看了每个文件的差异https://github.com/haskell/cabal/pull/2952/files

但是,有一些新文件超过了GitHub的1500行差异限制.我可以单击查看该文件,但GitHub的评论界面不再可用.

所以问题是,如何在GitHub上添加文件,文件中有超过1500行?

git github

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

编写模式同义词的更好方法

在我的旅行过程中,我写了这个模式的同义词:

pattern ConsK :: a -> D k (StreamK k a) -> StreamK k a
pattern ConsK x xs <- StreamK (Cons x ((UnsafeD . StreamK) -> xs)) where
    ConsK x (UnsafeD (StreamK xs)) = StreamK (Cons x xs)
Run Code Online (Sandbox Code Playgroud)

最后一行捕获了此模式同义词的意图:虚拟构造函数ConsK包装(with StreamK)和unwraps(xs)其参数.当我在这个构造函数上进行模式匹配时,我只想让包装操作解包,并且需要包装的解包操作.

不幸的是,据我所知,我必须写一个非常难看的ViewPatternsed模式同义词.有没有办法写得更好?

haskell

5
推荐指数
0
解决办法
167
查看次数

使用延迟模态从fixpoint运算符计算(无限)树

这是一个涉及循环绑定和无限数据结构的函数式编程难题.有一点背景,所以请紧紧抓住.

那个设定.让我们定义一个表示递归数据类型的数据类型:

type Var = String
data STerm = SMu Var STerm
           | SVar Var
           | SArrow STerm STerm
           | SBottom
           | STop
   deriving (Show)
Run Code Online (Sandbox Code Playgroud)

t ::= ??. t | ? | t ? t | ? | ?.请注意,⊥表示没有居民的类型,而⊤表示所有居民的类型.请注意(??. ?) = ?,因为μ是最小的固定点运算符.

我们可以解释递归的数据类型为无限树,从多次展开产生??. tt[? ? ??. t].(有关此过程的正式描述,请参阅http://lucacardelli.name/Papers/SRT.pdf)在Haskell中,我们可以定义一种懒惰树,它没有μ-binders或变量:

data LTerm = LArrow LTerm LTerm
           | LBottom
           | LTop
   deriving (Show)
Run Code Online (Sandbox Code Playgroud)

并且,在普通的Haskell中,转换函数从一个到另一个:

convL :: [(Var, LTerm)] -> STerm -> …
Run Code Online (Sandbox Code Playgroud)

haskell infinite coinduction

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

从 gcc/clang 获取 libasan 的位置

当我使用 编译时-fsanitize=address,GCC/Clang 隐式地使用 ASAN 动态库,该库为 ASAN 提供运行时支持。如果您构建的库是由另一个应用程序动态加载的,则必须设置LD_PRELOAD为包含此动态库,以便它在应用程序启动时运行。

通常不清楚libasan.so希望使用哪个GCC/Clang副本,因为您的系统上可能有多个 ASAN 副本(如果您安装了多个编译器。)是否有可靠的方法来确定您需要的共享库的位置装载?

gcc clang address-sanitizer

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

GraphQL:在一次网络调用中进行查询和变异

我将给出一个 GitHub GraphQL API 的具体示例(这是我想要解决的特定问题),但这个问题似乎可以概括为 GraphQL。

假设我想为存储库 pytorch/pytorch 上的问题 #1234 添加“高优先级”标签。根据API文档,我应该使用突变https://developer.github.com/v4/mutation/addlabelstolabelable/输入要求:

labelIds ([ID!]!)
The ids of the labels to add.

labelableId (ID!)
The id of the labelable object to add labels to.
Run Code Online (Sandbox Code Playgroud)

好的,请问如何获取 ID?在我的代码中,我知道我想要标签“高优先级”,但为了实际将其传达给此突变,我必须首先将“高优先级”解析为 ID,但首先执行另一个 GraphQL 调用。我想要标记的内容也是如此:我有一个 pytorch/pytorch#1234 形式的唯一标识符,但我没有 ID,我必须查找它。)

因此,在一天结束时,我必须执行3 个API 调用来标记某些内容,而我本可以在 REST 中完成,而不是通过一次调用来完成。一般来说,我看到很多 GraphQL 突变 API 只在 ID 中进行交互(即使系统有其他可用的规范标识符),我最终不得不进行额外的往返。我做错了吗?或者这确实是 GraphQL 的设计方式吗?

github-api graphql

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

使用JavaScript对象的共享*测试深度相等*

关于在JavaScript中测试两个对象以实现深度相等的主题,已经有很多墨水.但是,没有人关心区分以下两个对象:

var o1 = [{},{}];
var subitem = {};
var o2 = [subitem, subitem];
var o3 = [{}, {}];
Run Code Online (Sandbox Code Playgroud)

大多数深度相等算法会说o1,o2并且o3是相同的.我想要一个算法,说明o1并且o2不相等,但是o1并且o3相等.换句话说,我想要一个算法,告诉我指针是否具有相同的结构.我关心这个因为如果我对第一个元素进行了修改,则反映在第二个元素中o2,而不是在第二个元素中o1.

这意味着循环结构的深度相等应该起作用:

var o1 = [];
o1.push(o1);
var o2 = [];
o2.push(o2);
// deepGraphEqual(o1, o2) == true
var o3 = [[]];
o3[0].push(o3);
// deepGraphEqual(o1, o3) == false
Run Code Online (Sandbox Code Playgroud)

如果你要避免改变项目,你可能需要ECMAScript6地图,所以我会接受使用它们的解决方案.

javascript ecmascript-6

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

带有其他输出的命令行进度条

在命令行上获取进度条的一种流行方法是使用回车符,它会覆盖上一行,如以下脚本所示:

#!/bin/bash
echo -ne '[#   ] 25%\r'
sleep 1
echo -ne '[##  ] 50%\r'
sleep 1
echo -ne '[### ] 75%\r'
sleep 1
echo -ne '[####] 100%\r'
Run Code Online (Sandbox Code Playgroud)

这是可行的......如果你需要打印一个进度条。但是更复杂的脚本可能希望在输出诊断输出的同时打印进度条。您希望命令行应用程序的缓冲区按如下方式演变(以 分隔----):

[#   ] 25%
----
msg1
[#   ] 25%
----
msg1
msg2
[#   ] 25%
----
msg1
msg2
[##  ] 50%
Run Code Online (Sandbox Code Playgroud)

等等。现在,流行的方法失败了:

#!/bin/bash
echo -ne '[#   ] 25%\r'
echo "msg 1"
sleep 1
echo "msg 2"
echo -ne '[##  ] 50%\r'
echo "msg 3"
sleep 1
echo "msg …
Run Code Online (Sandbox Code Playgroud)

bash shell terminal

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