小编mfo*_*bes的帖子

在版本控制下使用IPython笔记本

IPython笔记本电脑置于版本控制之下的好策略是什么?

笔记本格式非常适合版本控制:如果想要版本控制笔记本和输出,那么这非常有效.当人们只想对输入进行版本控制时,就会产生烦恼,不包括可能是大型二进制blob的单元格输出(也就是"构建产品"),特别是对于电影和情节.特别是,我试图找到一个良好的工作流程:

  • 允许我选择包括或排除输出,
  • 如果我不想要它会阻止我意外地提交输出,
  • 允许我保持我的本地版本的输出,
  • 允许我看看当我使用我的版本控制系统更改输入时(即如果我只对版本控制输入但我的本地文件有输出,那么我希望能够看到输入是否已更改(需要提交) ).使用版本控制状态命令将始终注册差异,因为本地文件有输出.)
  • 允许我从更新的干净笔记本更新我的工作笔记本(包含输出).(更新)

如上所述,如果我选择包含输出(例如,在使用nbviewer时这是可取的),那么一切都很好.问题是,当我想要的版本控制输出.有一些工具和脚本可以剥离笔记本的输出,但我经常会遇到以下问题:

  1. 我不小心提交了一个带有输出的版本,从而污染了我的存储库.
  2. 我清除输出以使用版本控制,但实际上宁愿将输出保留在我的本地副本中(例如,有时需要一段时间来重现).
  3. Cell/All Output/Clear菜单选项相比,剥离输出的一些脚本会稍微改变格式,从而在差异中产生不必要的噪声.这可以通过一些答案来解决.
  4. 当将更改提取到文件的干净版本时,我需要找到一些方法将这些更改合并到我的工作笔记本中而无需重新运行所有内容. (更新)

我已经考虑过几个选项,我将在下面讨论,但还没有找到一个很好的综合解决方案.完整的解决方案可能需要对IPython进行一些更改,或者可能依赖于一些简单的外部脚本.我目前使用mercurial,但想要一个也适用于git的解决方案:理想的解决方案是版本控制不可知.

这个问题已经多次讨论过,但从用户的角度来看,没有明确或明确的解决方案.这个问题的答案应该提供明确的策略.如果它需要最近的(甚至开发)版本的IPython或一个易于安装的扩展,这很好.

更新:我一直在玩我修改过的笔记本版本,可以选择.clean使用Gregory Crosswhite的建议保存每次保存的版本.这满足了我的大多数约束,但是仍然没有解决以下问题:

  1. 这还不是一个标准的解决方案(需要修改ipython源.有没有办法通过简单的扩展来实现这种行为?需要某种on-save钩子.
  2. 我对当前工作流程的一个问题是拉动变化.这些将进入.clean文件,然后需要以某种方式集成到我的工作版本中.(当然,我总是可以重新执行笔记本,但这可能会很痛苦,特别是如果某些结果取决于长时间的计算,并行计算等).我还不知道如何解决这个问题.也许涉及像ipycache这样的扩展的工作流可能会起作用,但这似乎有点过于复杂.

笔记

删除(剥离)输出

  • 笔记本电脑运行时,可以使用Cell/All Output/Clear菜单选项删除输出.
  • 有一些用于删除输出的脚本,例如删除输出的脚本nbstripout.py,但不会产生与使用笔记本界面相同的输出.这最终包含在ipython/nbconvert repo中,但是已经关闭,说明这些更改现在包含在ipython/ipython中,但相应的功能似乎还没有包含在内. (更新)话虽如此,Gregory Crosswhite的解决方案显示这很容易做到,即使没有调用ipython/nbconvert因此,如果可以正确地连接它,这种方法可能是可行的.(然而,将它附加到每个版本控制系统似乎不是一个好主意 - 这应该以某种方式挂钩到笔记本机制.)

新闻组

问题

version-control ipython jupyter-notebook

548
推荐指数
14
解决办法
6万
查看次数

IPython(Jupyter)MathJaX序言

如何设置MathJax"序言"以便在IPython(或Jupyter)笔记本中重复使用,方便其他人阅读我的文档(在http://nbviewer.org上)并且适用于LaTeX/PDF代?

背景

我想使用IPython(现在是Jupyter)笔记本来处理我后来通过LaTeX(使用ipython nbconvert)转换为PDF的文档.问题是如何在几乎每个文档中包含一堆宏定义.就像是:

\newcommand{\vect}[1]{\vec{#1}}
\newcommand{\abs}[1]{\lvert#1\rvert}
\DeclareMathOperator{\erf}{erf}
Run Code Online (Sandbox Code Playgroud)

就笔记本电脑而言,一个令人不满意的解决方案是将它们简单地包含在笔记本顶部的降价单元中,嵌入两个美元符号之间,$$因此它被解释为数学.如果这是在一些介绍性文本之后完成的,那么它甚至不会影响输出.

问题是,当转换为LaTeX(用于PDF导出)时,这些命令嵌入在LaTeX文件的数学环境中.这有几个问题:

  1. 类似的命令\DeclareMathOperator必须出现在LaTeX文档前言中.
  2. 命令定义是等式的本地,在文档的后面部分不可用.(这可以通过使用\gdef或者克服来解决,\global\def但是必须要求MathJax识别这些命令,其中某些东西\let\gdef{\def}在某种程度上是从LaTeX中隐藏的.我发现使这项工作的任何方式都相当于一个丑陋的黑客.)
  3. 有时命令已经在LaTeX中定义并且需要\renewcommand(MathJax不支持,但也可以由\let\renewcommand\newcommand等等提供,这对我来说似乎是合理的,因为MathJax无法知道前导码可能用于最终的LaTeX文件) .

可能解决方案是通过添加代码(不确定等效于此处......)为MathJax提供一组宏\DeclareMathOperator.

<script type="text/x-mathjax-config">
MathJax.Hub.Config({
  TeX: {
    Macros: {
      vect: ["{\\vec #1}",1],
      abs: ["{\\lvert #1 \\rvert}",1]
    }
  }
});
</script>
Run Code Online (Sandbox Code Playgroud)

custom.js文件,然后在转换为PDF时提供包含的LaTeX包.我对这种方法的问题是:如何custom.js为其他人(协作者和查看者)分发文件和LaTeX样式文件?

  1. 我希望协作者能够编辑和阅读我的文档,而无需在其全局配置中安装自定义扩展.具体来说,我可以要求他们运行一个命令,就像python setup.py configure他们下载/签出我的代码一样,对项目进行本地修改,比如ipython_notebook_config.py在包含笔记本的所有目录中填充文件,但是不喜欢安装扩展或修改他们的个人全局custom.js文件.

    我的绊脚石是我不知道如何将本地custom.js文件中的贡献添加到笔记本链中,并怀疑这可能违反了安全策略.

    最好的解决方案不需要我的协作者的任何操作.

  2. 我希望我的笔记本能够在http://nbviewer.org上工作,并且人们能够下载笔记本并制作PDF.(我认为这排除了使用 …

ipython mathjax pandoc ipython-notebook

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

推秘密变更集

这可能看起来很矛盾,我知道秘密更改集应该是私有的,但如果我想备份这些秘密更改集怎么办?

我平行地与一些分支机构合作,有时候我想推一个分支机构,而不是其他分支机构.为了达到这个目的,我在不同的克隆工作,但我讨厌这个.

所以现在mercurial有阶段,我可以建立秘密分支,并在同一个存储库中拥有所有内容.问题是在秘密分支的开始和它的发布之间,我想要备份那些秘密变更集(我在另一台机器上有一个克隆,只是为了保存我的备份以防万一我的本地仓库或我的机器发生了什么).

有没有办法做到这一点或我的工作流程是完全错误的?

mercurial mercurial-phases

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

如何告知(本地)服务器是非发布的?

当我无法访问远程文件时,如何告诉mercurial远程服务器(例如bitbucket)是非发布的.hg/hgrc

背景

最近版本的mercurial有一个阶段概念,允许用户跟踪哪些变更集已被共享(public),哪些变量集没有(draft).更改集rebase允许存储库更改操作draft,但不允许更改集,public因为其他操作可能取决于后者.

将更改集推送到公共服务器将public默认将其阶段更改为,但如果服务器是私有的或专用于代码审查(即人们不应该提取),则推送到"非发布"服务器不应更改相.

记录的方式告诉善变的服务器是不公开的是将增加[phases]部分到.hg/hgrc文件服务器上:

[phases]
publishing = false
Run Code Online (Sandbox Code Playgroud)

在我看来应该有一种方法可以在我的一个本地hgrc文件中包含一行说明特定服务器是非发布的,但我找不到任何文档来建议如何.也许这个行为可以用钩子定制?

参考

mercurial bitbucket mercurial-phases

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

在C++命名空间中使用内置类型(double,int等)?

我可以让内置的类型,如intdouble在C++命名空间中可用?

#include <complex>

typedef int my_int;

namespace my_namespace {
  namespace std = ::std;  // Works
  using ::my_int;         // Works

  using ::int;            // Fails: "expected unqualified-id before 'int'"
  typedef ::int int;      // Fails: "expected unqualified-id before 'int'"
}

typedef int out::int;     // Fails: "expected unqualified-id before 'int'"

my_namespace::my_int x;            // Works
my_namespace::std::complex<int> c; // Works

// I would like to use this:
my_namespace::int x2;    // Fails: "expected unqualified-id before 'int'" 
Run Code Online (Sandbox Code Playgroud)

我怀疑这是由于语言限制,禁止在其中使用带有关键字的限定标识符(int在本例中),但我希望有一些方法可以揭示这些.

用例

我正在尝试使用命名空间来组织类型,以便外部工具(SWIG)可以适当地用另一种语言包装函数.例如: …

c++ swig typedef namespaces built-in

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