小编Mic*_*cah的帖子

Git工作流程和rebase与合并问题

我和其他开发人员一起在一个项目上使用Git几个月了.我有几年的SVN经验,所以我想我给这段关系带来了很多包袱.

我听说Git非常适合分支和合并,到目前为止,我只是没有看到它.当然,分支很简单,但是当我尝试合并时,一切都变得很糟糕.现在,我已经习惯了SVN,但在我看来,我只是将一个低于标准的版本系统换成了另一个.

我的搭档告诉我,我的问题源于我不顾一切地合并,并且我应该在很多情况下使用rebase而不是合并.例如,这是他所规定的工作流程:

clone the remote repository
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature
git checkout master
git merge my_new_feature
Run Code Online (Sandbox Code Playgroud)

基本上,创建一个功能分支,始终从主分支到分支,并从分支合并回主分支.需要注意的重要一点是,分支始终保持在本地.

这是我开始的工作流程

clone remote repository
create my_new_feature branch on remote repository
git checkout -b --track my_new_feature origin/my_new_feature
..work, commit, push to origin/my_new_feature
git merge master (to get some changes that my partner added)
..work, commit, push to origin/my_new_feature
git merge master
..finish …
Run Code Online (Sandbox Code Playgroud)

git version-control git-merge git-rebase

949
推荐指数
10
解决办法
20万
查看次数

如何使用RSpec在对象上添加多个should_receive期望值?

在我的Rails控制器中,我正在创建同一模型类的多个实例.我想添加一些RSpec预期,以便我可以测试它是否使用正确的参数创建正确的数字.那么,这就是我的规范中的内容:

Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => @user.id, :position_id => 1, :is_leader => true)
Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "2222", :position_id => 2)
Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "3333", :position_id => 3)
Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "4444", :position_id => 4)

这导致了问题,因为看起来Bandmate类只能设置1个"should_receive"期望值.因此,当我运行该示例时,我收到以下错误:

Spec::Mocks::MockExpectationError in 'BandsController should create all the bandmates when created'
Mock 'Class' expected :create with ({:band_id=>1014, :user_id=>999, :position_id=>1, :is_leader=>true}) but received it with ({:band_id=>1014, :user_id=>"2222", :position_id=>"2"})

这些是第二次创建调用的正确参数,但RSpec正在针对错误的参数进行测试.

有谁知道如何设置我的should_receive期望允许多个不同的电话?

rspec ruby-on-rails

31
推荐指数
1
解决办法
2万
查看次数

Google地图中的标准标记太小

我正在实施像这样的位置选择器:http: //m.rhinvivant-lebendigerrhein.eu/geopick.php?raz = 1

但是当我在我的环境中加载代码时,位置标记突然很小并且在加载页面后被压扁(参见图1).然后我拖动标记后,它变得更小(见图2).

谷歌地图标记太小

有没有人见过这样的东西?这将有助于得到一个暗示我如何解决这个问题,或者我犯了什么错误.

即如何修复标记的大小?

我的代码看起来像这样:

var marker = new google.maps.Marker({
    title: settings.gMapMarkerTitle,
    map: map,
    position: defaultLocationLatLng,
    draggable: true
});
Run Code Online (Sandbox Code Playgroud)

javascript google-maps google-maps-markers zurb-foundation

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

使用jquery的不引人注目的javascript - 好的10分钟教程?

我正在寻找使用JQuery对Unobtrusive Javascript进行10分钟的精彩介绍.我对这个概念完全陌生,我想看看事件绑定如何起作用.

作为一些背景,我正在寻找一个类似于我们在这里所做的"删除此标签"系统.看看源代码,我没有看到任何js,只是一个img标签.这让我觉得必须有外部的js绑定到click事件.我想知道如何做到这一点,我想要一个向我展示的教程!

html javascript jquery unobtrusive-javascript

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

正确的Elixir OTP方式来构建重复任务

我有一个工作流程,涉及每30秒左右醒来并轮询一个数据库以获取更新,对此采取行动,然后再回到睡眠状态.撇开数据库轮询不会扩展和其他类似问题,使用主管,工作人员,任务等构建此工作流的最佳方法是什么?

我将列出一些我已经拥有的想法和我的想法/反对.请帮我弄清楚Elixir-y最方法.(顺便说一句,我对Elixir还很新.)

1.无限循环通过函数调用

只需在其中放入一个简单的递归循环,如下所示:

def do_work() do
  # Check database
  # Do something with result
  # Sleep for a while
  do_work()
end
Run Code Online (Sandbox Code Playgroud)

阅读有关构建网络爬虫教程时,我看到了类似的内容.

我在这里遇到的一个问题是由于递归导致的无限堆栈深度.这会不会导致堆栈溢出,因为我们在每个循环结束时递归?这个结构用于任务的标准Elixir指南,所以我可能错误的堆栈溢出问题.

更新 - 如答案中所述,Elixir中的尾调用递归意味着堆栈溢出在这里不是问题.在最后调用自己的循环是一种可接受的无限循环方式.

2.使用任务,每次重启

这里的基本思想是使用运行一次然后退出的Task,但是将它与具有one-to-one重启策略的Supervisor配对,以便每次完成后重新启动.任务检查数据库,休眠,然后退出.主管看到出口并开始新的出口.

这有利于住在主管内部,但这似乎是滥用主管.除了错误捕获和重新启动之外,它还用于循环.

(注意:使用Task.Supervisor可能还有其他一些功能,而不是普通的Supervisor,而我只是不理解它.)

3.任务+无限递归循环

基本上,将1和2组合在一起,因此它是一个使用无限递归循环的Task.现在它由Supervisor管理,如果崩溃将重新启动,但不会作为工作流的正常部分反复重启.这是目前我最喜欢的方法.

4.其他?

我担心的是,我缺少一些基本的OTP结构.例如,我熟悉Agent和GenServer,但最近我偶然发现了Task.也许正是这种情况下有某种Looper,或者是Task.Supervisor的一些用例.

elixir erlang-otp

13
推荐指数
2
解决办法
4619
查看次数

是否有Rails应用程序的批量电子邮件插件?

有没有人知道一个插件或可用于发送Rails应用程序的批量电子邮件的东西?

具体来说,我希望能够将HTML电子邮件文件传递给rake任务或其他任务,并将其通过电子邮件发送给已注册我网站的所有人,并选中"请向我发送有关XXX的信息"框.

我为自己写了一个黑客攻击的版本,但是我想要一些能够有点智能地限制它自己的东西,如果被打断它可以从中断它.

更新:我最终崩溃并拿出我的信用卡并注册了一个真正的批量电子邮件服务,该死的是正确的选择.由此产生的电子邮件非常专业,它们具有内置的分析功能,还可以与Google Analytics集成,并且由于其他原因而非常棒.

如果您希望使用Rails进行批量电子邮件,我建议使用Mailchimp服务(这里是我的会员链接,其中有注册奖金)以及原始人宝石.这将允许您将数据库中的所有用户电子邮件同步到Mailchimp,然后使用真正的批量服务而不是一些蹩脚的补丁.

另一个更新:我今天听说过Maktoub,这正是我所描述的.免责声明:我从来没有使用它,并且仍然可能很清楚并使用付费服务,但它仍然可能比滚动你自己更好.

email plugins smtp ruby-on-rails bulk

11
推荐指数
2
解决办法
5729
查看次数

将电子邮件组织成线程的算法?

是否有任何命名/着名/特别好的算法用于将电子邮件组织到线程中?

我想在我的网站上添加一个类似于Google网上论坛(和其他邮件列表)的功能,我只是想知道是否有任何已发布的此类组织算法.我知道滚动我自己可能相当容易,但在可通行算法和好算法之间的用户体验可能会有很大差异.

已经在ruby中实现的算法的加分点!

ruby email email-threading

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

构建GenServer调用self的正确方法

我知道让GenServer进程调用本身几乎是不可能的,因为你基本上遇到了死锁.但是,我很好奇是否有一种首选方式来做这种事情.

假设以下场景:我有一个队列,我正在弹出的东西.如果队列是空的,我想重新填充它.我可以像这样构造它:

def handle_call(:refill_queue, state) do
  new_state = put_some_stuff_in_queue(state)
  {:reply, new_state}
end

def handle_call(:pop, state) do
  if is_empty_queue(state) do
    GenServer.call(self, :refill_queue)
  end

  val,new_state = pop_something(state)

  {:reply, val, new_state}
end
Run Code Online (Sandbox Code Playgroud)

这里的一个大问题是,当我们尝试重新填充队列时,这将会死锁.我过去使用的一个解决方案是使用cast更多,因此它不会死锁.像这样(的变化callcast进行补充)

def handle_cast(:refill_queue, state) do
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我认为它不起作用,因为pop在实际填充队列之前,异步转换重新填充队列可能会返回,这意味着我将尝试弹出一个空队列.

无论如何,核心问题是:处理这个问题的最佳方法什么?我假设答案是put_some_stuff_in_queue直接在pop通话中打电话,但我想检查一下.换句话说,它似乎是做正确的事是使handle_callhandle_cast尽可能简单,基本上只是包装来在实际工作情况等功能.然后,创建尽可能多的handle_*函数来覆盖您将要处理的所有可能情况,而不是handle_call(:foo)依次调用handle_call(:bar).

elixir gen-server

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

使用Ruby 1.9.3和邮件gem进行字符编码

我正在尝试使用Ruby邮件宝石来解析电子邮件字符串,而我正在使用角色编码.请收到以下电子邮件:

MIME-Version: 1.0
Sender: foobar@example.com
Received: by 10.142.239.17 with HTTP; Thu, 14 Jun 2012 06:00:18 -0700 (PDT)
Date: Thu, 14 Jun 2012 09:00:18 -0400
Delivered-To: foobar@gmail.com
X-Google-Sender-Auth: MxfFrMybNjBoBt4O4GwAn9cMsko
Message-ID: <CAGErOzF3FV5NvzN3zUpLGPok96SFzK18Z4HerzyYNALnzgMVaA@mail.gmail.com>
Subject: Re: [Lorem Ipsum] Foo updated the forum topic 'Reply by email test'
From: Foo Bar <foo@example.com>
To: Foo <c49964d167e08e7d4a1930e6565f23c258be19a0@foo.example.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

This email has accents:=A0R=E9sum=E9
>
> --------- Reply Above This Line ------------
>
> Email parsing with accents: R=E9sum=E9
>
> Click here …
Run Code Online (Sandbox Code Playgroud)

ruby email utf-8 character-encoding

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

在Elixir/Mix/Phoenix应用程序中放置服务/初始化代码的位置?

我有一个Elixir/Mix应用程序(也有凤凰城,但也有很多非凤凰城的东西),我想知道什么是最好的做法,用于放入"启动"代码,例如动态地将孩子添加到主管,解雇关闭"我还活着!" ping或其他你希望在启动后立即发生的事情.

一个显而易见的地方是Application文件,但预期的返回是从中返回的Supervisor.start_link(children, opts).所以,例如,在Phoenix应用程序中,我可以这样做:

defmodule MyApp do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec

    children = [
      supervisor(MyApp.Repo, []),
      supervisor(MyApp.Endpoint, []),
      supervisor(MyApp.DynamicSupervisorThingy, [])
    ]
    opts = [strategy: :one_for_one, name: MyApp.Supervisor]
    start_val = Supervisor.start_link(children, opts)



    # --- Put things right here that I want to start ----
    MyApp.DynamicSupervisorThingy.add_children_dynamically()
    MyApp.SomeModule.do_some_thingy()
    MyApp.OtherModule.send_some_pings()
    if MIX_ENV == :prod do
      MyApp.YetAnother.prod_stuff_i_dont_want_in_dev()
    end


    start_val
  end
end
Run Code Online (Sandbox Code Playgroud)

这似乎是错的,但我无法弄清楚我应该把这段代码放在哪里.

elixir phoenix-framework

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