小编JK *_*iho的帖子

Xcode更改未修改的故事板和XIB文件

当多人合作时,故事板从git工作流角度来看是一种巨大的痛苦.例如,.storyboard文件中的XML具有其起始<document>标记toolsVersionsystemVersion属性,这些属性由最新文件操作符恰好运行的任何配置更改.大家同步的Xcode版本恰恰似乎帮助toolsVersion,但systemVersion变化不管是什么,这取决于具体的Mac和/或开发运行OS X的版本上.

这是愚蠢的,但大多是无害的.然而,令我们担心的是,在其他时候,只需在故事板之后打开它们,就会自动对故事板进行一些其他更改git pull.也就是说,Alice对故事板进行了更改,提交并将它们推送到存储库.然后鲍勃拉出爱丽丝的变化并打开故事板进行进一步的更改.他打开故事板的那一刻,文件图标立即变为修改,但是,未保存的状态,以及git status已发生的任何数量的变化怪异表演.所有这一切,没有鲍勃改变任何东西或自己保存文件.

我们看到的最常见的自动更改是<classes>故事板文件末尾附近整个标记层次的消失或重新出现.我们还没弄清楚造成这种情况的原因.我们可能在各种.lproj目录中有几个本地化版本的故事板,当在Interface Builder中打开它们时,类层次结构可能会自动从某些层次结构中删除并添加到其他版本中,或者单独留在某些层次结构中.这会导致很多噪音git diff,但实际上并没有破坏任何功能.我们经常会有选择地将我们所做的实际更改添加到git的索引中,提交那些,然后只丢弃自发的,荒谬的<classes>变化.这是为了保持提交小而好,因为它们应该是.然而,最终,由于Xcode不断重新进行更改,它变得太麻烦了,有人只是愤怒地提交它们以及其他一些东西......这很好,直到其他人的Xcode决定要将它们更改为否明显的原因.(我们的提交历史对此很多咒骂.)

是否有其他人看到这种行为?这是我们的一个或多个开发者Mac上的Xcode错误还是配置问题?我们在与XIB文件协作时已经看到了一些类似的行为,但故事板似乎更容易受此影响.

xcode interface-builder storyboard xib ios

129
推荐指数
4
解决办法
2万
查看次数

Django:从ModelAdmin中访问模型实例?

我在网上商店应用程序中有一个Orders模型,它有一个自动递增的主键和一个自己的外键,因为订单可以拆分成多个订单,但必须保持与原始订单的关系.

class Order(models.Model):
    ordernumber = models.AutoField(primary_key=True)
    parent_order = models.ForeignKey('self', null=True, blank=True, related_name='child_orders')
    # .. other fields not relevant here
Run Code Online (Sandbox Code Playgroud)

我已经为管理站点注册了OrderAdmin类.对于详细视图,我已经包含parent_orderfieldsets属性中.当然,默认情况下,它会列出选择框中的所有订单,但这不是所需的行为.相反,对于没有父订单的订单(即未从另一个订单拆分; parent_order是NULL/None),不应显示任何订单.对于已拆分的订单,此应仅显示单个父订单.

有一个相当新的ModelAdmin方法formfield_for_foreignkey,这似乎是完美的,因为查询集可以在其中进行过滤.想象一下,我们正在查看订单#11234的详细视图,该订单已从订单#11208拆分.代码如下

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == 'parent_order':
        # kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=11234)
        return db_field.formfield(**kwargs)
    return super(OrderAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
Run Code Online (Sandbox Code Playgroud)

注释行在Python shell中运行时返回,返回单项查询集,其中包含#11234的#11208订单以及可能已从中拆分的所有其他订单.

当然,我们不能在那里硬编码订单号.我们需要引用ordernumber订单实例的字段,我们正在查看其详细信息页面.像这样:

kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=?????)
Run Code Online (Sandbox Code Playgroud)

我发现没有办法替换????? 参考"当前"订单实例,我挖得很深.selfinside formfield_for_foreignkey指的是ModelAdmin实例,虽然它确实有一个model属性,但它不是订单模型实例(它是ModelBase引用; self.model()返回一个实例,但它的ordernumber是None).

一个解决方案可能是从request.path(/ admin/orders/order/11234 /)中提取订单号,但这真的很难看.我真的希望有更好的方法.

django modeladmin django-admin

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

pull-only repo的'git status'表示分支领先于origin/master.为什么?

所以情况如下:

$ git status #On
branch master
#你的分支在[x]提交之前位于'origin/master'之前.
#

关于SO的问题已有几个问题,但似乎没有一个问题专门针对我所拥有的场景类型.其中一个问题的答案最接近,但没有详细说明.

我会直接引用它:

如果在执行"git pull remote branch"后收到此消息,请尝试使用"git fetch"进行跟进.

Fetch似乎更新了远程分支的本地表示,当你执行"git pull remote branch"时不一定会发生这种情况.

这个提示确实有效.但"不一定会发生吗?" 为什么不?我需要了解这一点.什么拉不做?

我不想接管这个问题,所以这是我的详细情景:

涉及三台电脑.我开发的Mac,git repo(即origin/master)所在的家庭服务器以及从该服务器获取的Webfaction帐户.

我提交并且git push origin master仅在Mac上提交.作为正常工作流程的一部分,在Webfaction上运行的唯一命令是git pull origin master(作为Fabric部署脚本的一部分).我不修改那里的代码.我是一个独立的开发者,所以其他任何人都没有.

我偶尔会登录Webfaction并检查一些事情,包括a git status.不可避免地,我总是得到"你的分支在前面......"的信息.跑步git fetch使消息消失.

我将要添加git fetch到Fabric脚本来完成这个问题,但我想知道为什么需要这样做,特别是在源/主的只拉式克隆上.虽然我每天都使用基本功能,但我并不熟悉Git,所以我们将非常感谢新手友好的解释.

按要求更新,相关位来自config:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@[server_address]:[path/to/repo.git]
[branch "master"]
    remote = origin
    merge = refs/heads/master
Run Code Online (Sandbox Code Playgroud)

git branch git-pull git-push git-fetch

10
推荐指数
3
解决办法
7304
查看次数

如何使用Ctrl-C优雅地终止asyncio脚本?

我已经阅读了所有可以找到的有关如何优雅地处理带有asyncio事件循环并以Ctrl-C终止的脚本的文章,而且在我不打印一个或多个回溯的情况下,我无法使其中的任何一个都能正常工作这样做。答案几乎无处不在,我还无法在这个小脚本中实现其中的任何一个:

import asyncio
import datetime
import functools
import signal


async def display_date(loop):
    end_time = loop.time() + 5.0
    while True:
        print(datetime.datetime.now())
        if (loop.time() + 1.0) >= end_time:
            break
        await asyncio.sleep(1)


def stopper(signame, loop):
    print("Got %s, stopping..." % signame)
    loop.stop()


loop = asyncio.get_event_loop()
for signame in ('SIGINT', 'SIGTERM'):
    loop.add_signal_handler(getattr(signal, signame), functools.partial(stopper, signame, loop))

loop.run_until_complete(display_date(loop))
loop.close()
Run Code Online (Sandbox Code Playgroud)

我想让脚本退出,而不在Ctrl-C(或通过发送的SIGTERM / SIGINT kill)之后打印任何回溯。这段代码RuntimeError: Event loop stopped before Future completed.以我根据先前的答案尝试过的许多其他形式打印,我得到了很多其他类型的异常类和错误消息,却不知道如何解决它们。上面的代码现在很小,但是我之前所做的一些尝试不过是什么,而且都不是正确的。

如果您能够修改脚本以使其优雅地终止,那么不胜感激地向您解释为什么这样做是正确的方法。

python signals sigint python-asyncio

8
推荐指数
2
解决办法
3732
查看次数

如何使用 Django 和 PostgreSQL 安全且原子地递减计数器?

我一直在阅读 PostgreSQL 事务隔离以及它与 Django 的关系transaction.atomic()(例如本文PostgreSQL 文档),但我对这个主题还很不熟悉,而且我不确定我是否理解我所读的内容。

我们有一个 PostgreSQL 支持的 Django 应用程序,其中涉及配额对象。简单来说,就是这样:

class Quota(models.Model):
    obj = models.OneToOneField(AnotherModel)
    count = models.PositiveIntegerField()
Run Code Online (Sandbox Code Playgroud)

该实例控制可以针对该实例执行特定操作的次数objcount被初始化为某个数字,并且只会递减,直到达到零。

任意数量的进程/线程可以同时执行这些操作。基本上,我们需要以原子方式递减(使用 UPDATE)count单个数据库行的 ,而不会出现死锁,并且不会有两个进程/线程,例如从count100 开始,并且都试图将其递减到 99。

我天真的做法是这样的:

with transaction.atomic():
    cursor = connection.cursor()
    cursor.execute('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE')
    Quota.objects.filter(obj=instance).update(count=F('count')-1)
Run Code Online (Sandbox Code Playgroud)

但是,我不确定这是否受此问题的影响,来自链接的文章:

如果在 COMMIT 时数据库无法确定该事务是否可以相对于其他事务的读/写串行执行,那么它将失败并出现 django.db.DatabaseError。即使他们更新了不同的行,这种情况也可能发生。

所有对其执行操作的进程/线程obj都会减少同一行的同一列,所以......也许?我实际上不知道 PostgreSQL“确定事务可以串行执行”涉及什么。

另一种方法可能是:

with transaction.atomic():
    Quota.objects.select_for_update().filter(obj=instance).update(count=F('count')-1)
Run Code Online (Sandbox Code Playgroud)

这似乎执行行级锁定,我的理解是不需要更改隔离级别,但我不知道这是否足以正确处理并发操作。

这些方法中的一种是优选的吗?是否仍然需要进行一些修改来保证原子性和避免死锁?我们python-redis-lock还可以使用类似的方法来阻止 Django 视图级别的并发数据库操作,但这感觉更适合在数据库级别执行。

django postgresql transaction-isolation

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

通过单元重用错误地绘制UITableView分隔符?

我正在开发一个带有故事板的iOS 5项目,因此在IB中使用动态表格单元原型.在其中一个视图中,我有一个带有可变高度单元格的表视图,单元格高度根据内容的高度计算.

tableView:heightForRowAtIndexPath:首次显示表视图时,返回所有单元格的正确值.向下滚动几个项目时一切都很好,但随后出现问题:实际单元格似乎是正确的高度,包括它们的触摸区域,但它们的分隔符在错误的位置(在单元格内而不是它们之间)呈现.

从测量分隔符放置开始,似乎细胞重用可能与此有关.前三个单元格的分隔符正确呈现,但不是第四个.heightForRowAtIndexPath:为它返回正确的高度(在这种情况下为125像素),其包含的子视图都在正确的位置.但是,分隔符仅从前一个分隔符渲染108个像素,将其放置在单元格的125像素高区域内.

这是踢球者:108px是第一个表格单元格的高度,现在看不见了,可能会重复使用.我没有明确的证据,但似乎表视图忽略heightForRowAtIndexPath:了这些单元格,只是根据重用的单元格高度渲染分隔符.

这并不能解释为什么一堆较晚的较短单元格根本不会呈现分隔符.但这就是我必须继续下去的全部内容.

是否有解决方法,IB设置或其他可能有帮助的东西?

uitableview reuseidentifier ios heightforrowatindexpath

7
推荐指数
2
解决办法
1726
查看次数

UITableViewCell框架高度不匹配tableView:heightForRowAtIndexPath:

我正在构建一个具有可变高度自定义表格单元格的UITableView,它们的高度由包含的多行UILabel的大小决定.我已经将tableView:heightForRowAtIndexPath:委托方法连接起来并使用正确计算最终高度sizeWithFont:constrainedToSize:.

我遇到了一个奇怪的问题:在tableView:cellForRowAtIndexPath:调用数据源方法时,已经如上所述确定了正确的每行高度,但是单元格的框架与该高度不匹配.相反,frame.size.height单元格的属性是表格视图的默认单元格高度(86 px,因为我在Interface Builder中设置它,当包含的UILabel只有一行文本时正确的高度),而不是高度即tableView:heightForRowAtIndexPath:确定为该指数路径是正确的.

我正在cellForRowAtIndexPath:使用队列产生细胞,即

// Using storyboards, this never returns nil, no need to check for it
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"SomeIdentifier"];
NSLog(@"%f", cell.frame.size.height); // 86, not correct if the cell contains a multi-line UILabel
Run Code Online (Sandbox Code Playgroud)

那么,无论iOS在幕后做什么,出列都不是设置单元格的frame属性来匹配计算出的高度.这本身就不那么令人惊讶,因为细胞实例而不是它们的几何体而引起了人们的关注.但是,单元格正确呈现,因此高度属性正在某处设置,但它会在之后发生cellForRowAtIndexPath:.

所以:当我最初填充表格视图时,cell.frame.size.height当我向下滚动列表时,第一次出现的所有单元格都是86.由于在cellForRowAtIndexPath:显示之前的每一行之后的某个时间设置了正确的几何体,所以当我向上滚动时,高度属性对于重新使用后返回视图的每个单元格都是正确的.

在此之后,我可以随意来回滚动表格视图,并且从该点开始,每个单元格的高度属性保持正确.

在任何基于出队的重用发生之前,第一次获得正确的单元高度的正确方法是什么?我需要这个来重新定位表格单元格的子视图.我是否需要手动调用heightForRowAtIndexPath:cellForRowAtIndexPath:,然后手动设置新创建CustomCell实例的框架相匹配的高度?这似乎是多余的,我需要创建一种机制来检测第一次使用错误的帧高度创建单元格的时间,以及稍后使用正确的帧高度进行出列以避免此冗余.

所以,如果有人能够了解这背后的逻辑,我会很感激.

objective-c reusability uitableview ios heightforrowatindexpath

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

在Mercurial中将dev分支合并/转换为稳定分支的正确方法是什么?

我在一家网站开发公司工作,该公司使用Mercurial作为其首选的DVCS.我们目前正在创建已投入生产的新版网站.

站点的稳定开发分支都存在于同一存储库中.在生产现场逃跑的稳定分支,和开发商显然对代码开发(开发从现在起)分支(除了错误修正).

这个模型对我们来说很新鲜.在最后一次主要的生产推动之后,我们从刚刚发布的稳定分支创建了开发分支(使用hg branch dev从最新的稳定版本开始并承诺创建新的技巧).

现在我们正在接近另一个版本,dev分支中存在大量新代码.同时,稳定分支只看到错误修正,所有已经移植dev分支.

当我们对dev分支的状态感到满意并认为它已准备好生产时,我们想要的是当前的dev分支状态成为新的稳定分支.在一个快速的冲程中,稳定的分支将吸收已经对dev分支进行的大量变化.该开发分支会(假设)基本上变为无效,直到我们重新开始开发新的东西,这样的时间.

实际实现这一目标的正确过程是什么?从dev的尖端简单合并,同时检查稳定分支的尖端,或其他什么?正如我所说,所有对稳定的更改都已经存在于开发中,所以我们可以让dev变得稳定.

一旦将dev的神秘变形转换为稳定并且结果被标记,再次开始进一步开发dev开发的过程是什么,因为在合并到stable之后它将没有一个有效的提示来检查?只需查看合并之前的最后一次开发修订,然后提交以创建新提示?这似乎是错的; 我的直觉告诉我,"新开发 "应该从稳定分支的合并和标记的尖端分离出来,但我不知道是怎么做到的.(如上所述,上次我们通过首先创建命名的dev分支来实现这一点;这次我们只想创建一个新的技巧,现有的,虽然可能是非活动后合并 …

merge mercurial branch

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

合成@property(弱)IBOutlet NSWindow*窗口时的EXC_BAD_INSTRUCTION

我是ObjC/Cocoa和Mac开发的新手,并且充满了基础知识.

Lion上Xcode 4.2中新的Cocoa应用程序的简单默认模板如下所示:

// AppDelegate.h
#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;

@end



// Appdelegate.m
#import "AppDelegate.h"

@implementation AppDelegate

@synthesize window = _window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
}

@end
Run Code Online (Sandbox Code Playgroud)

我一直在用它作为各种实验的基础.在自动引用计数(该项目被设置为使用)读了- 这篇文章,例如,我认为一个可能,甚至应该更换assign预选赛NSWindow *windowweak,但似乎并不如此.

该应用程序建立罚款,但在启动过程中挂起,与Thread 1: Program received signal: "EXC_BAD_INSTRUCTION"AppDelegate.m上线@synthesize window = _window;.

更改限定符strong使程序的工作,但我看不出它是如何有意义,从去assignstrong.我得到的印象是,非ARC/ARC的配对分配/弱,保留/强.

一个更有经验的编码器朋友建议,即使weak限定符导致window …

weak-references objective-c iboutlet automatic-ref-counting

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

自动布局没有明确的宽度约束和大于或等于尾随空间的行为不当

我有一个滚动视图直接包含在视图控制器的内容视图中,在两个维度中都是完整大小.从滚动视图到其超视图(水平)和布局指南(垂直)的顶部,底部,前导和尾随空间约束都设置为0. VC最终意味着嵌套为一个或两个子视图控制器地方.我正在使用故事板.

我在滚动视图中放置了许多元素并将它们约束到它,但我看到了各种奇怪的行为.下面是一个屏幕截图,其中选择了滚动视图的所有子视图以显示其约束.滚动视图对顶层视图的四个约束在其中不可见.视图控制器已设置为自由形式大小,其顶级视图(以及相应的滚动视图的内容视图)高616点,保证在运行时需要滚动.

约束可视化

在分析屏幕截图之前,这里列出了我正在努力实现的事情.

  1. 元素之间的垂直间距由设计者设置并固定.(顺便说一句,此线框中的垂直约束,文本样式等都不是最终的;整个图像仅用于说明目的.)
  2. 所有标签(最顶层的标签除外)应以其固有尺寸开始,向上扩展到滚动视图的宽度(减去两侧标准的HIG水平空间20磅).
  3. 按钮不太可能比这更大,但在本地化意外的情况下,我们希望它们的行为就像标签一样.("另一个按钮"有一个额外的垂直≥约束;它与这个问题无关.)
  4. Web视图具有固定的高度,其宽度应由滚动视图的宽度确定; 两侧标准20 pt水平空间.
  5. 文本视图具有最小高度(此处为67磅),但如果包含的文本太大而不适合,则它们应垂直展开.它们都不可编辑或可滚动.与网络视图一样,它们与前缘和后缘之间的水平间隔为标准的20磅.

如您所见,没有一个元素具有明确的宽度约束.整个事物依赖于元素和滚动视图之间的前导和尾随空间约束.在我看来,布局在某种程度上优雅地适用于假想的未来超过320 pt的iPhone,而不会改变约束.它也可以在旋转到横向方向后工作(它可能看起来有点傻,但它会起作用).

我将逐步完成这些要点,必要时参考屏幕截图.

1:这很有效,这里没什么特别的.

2:标签的主要限制是所有简单的等于20磅的标准空间.尾随约束大于或等于20磅标准,表面上允许它们scrollView.frame.size.width-40变宽,但不宽.

3:2相同.

4和5:这里有趣的地方.Web视图和文本视图都列为Misplaced Views,IB表示它们的帧在运行时会有所不同.表示正确帧的橙色虚线边框仅水平到达具有大于或等于尾随约束的最长元素; 这里,它是"具有长标题的按钮",其右边缘是虚线边界边缘的结束.


构建这组视图及其约束,我预计会遇到一些麻烦.我知道让UITextViews垂直高于这里定义的≥67高度会很困难,也许只能通过代码实现.通过IB单独使标签和按钮按上述方式工作似乎也有点不确定.

想到的是网页和文本视图报告的正确框架只有最宽的标签或按钮宽.看起来,通过这种设置,滚动视图实际上不会是320点宽,而是只需要适合最长元素及其间距所需的宽度,并且Web和文本视图应该符合要求.鉴于滚动视图被严格限制在顶层视图的所有边上,设置为320点宽,我不知道为什么会这样.SOMETHING显然必须定义滚动视图的初始宽度,但为什么不是我从滚动视图到顶层视图的约束呢?

鉴于上述这组视图的规范,我需要做些什么才能改变它?

这个案例表明我还没有正确理解Auto Layout,我希望这些答案可以让我了解它的许多重要方面.

interface-builder uiscrollview ios autolayout nslayoutconstraint

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

通过命名管道或 rsyslog 将时间戳添加到 systemd 管理的服务的日志输出中

我必须处理一个专有的遗留服务(在 Debian 10 上运行),该服务将各种(大致)信息和通知级别的内容记录到标准输出中,并将(大致)警告和错误级别的内容记录到标准错误中。--stdout <path>两者都可以使用和命令行参数写入文件--stderr <path>。我们这个守护进程的 systemd 单元文件如下所示(精简到最基本的部分):

[Unit]
Description=Some legacy proprietary thing
After=network.target

[Service]
ExecStart=/usr/local/bin/thing \
  --stdout /var/log/thing/stdout.log \
  --stderr /var/log/thing/stderr.log

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

问题是写入 stdout.log 和 stderr.log 的行不包含我们现在需要的时间戳。该应用程序对我们来说是一个黑匣子,修改其日志输出以包含时间戳是不可行的。

在我的研究中,我发现了两种可能适用的选择。如果你还有其他人,我很想听听他们的声音。

选项1

为 stdout 和 stderr创建命名管道mkfifo,并使遗留应用程序使用它们作为--stdout--stderr目标。然后,设置一个进程来读取这些管道,将每一行通过管道传输到命令ts,这会添加一个很好的时间戳,如下所示:

$ echo foo | ts '[%Y-%m-%d %H.%M.%.S]'
[2021-08-10 16.16.21.506571] foo
Run Code Online (Sandbox Code Playgroud)

这些带有时间戳的行可能会通过管道写入日志文件,一个用于 stdout,一个用于 stderr。

选项2

在 systemd 单元文件中,我们可以设置StandardOutputStandardErrorto syslog,然后设置SyslogIdentifier为可以与 rsyslog 一起使用的某个字符串,添加时间戳并将最后一行写入日志文件。

不幸的是,我还没有找到一种方法让 systemd 区分 stdout 和 stderr:它们都会被发送到 …

logging named-pipes mkfifo systemd

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

Python:从子类调用超类方法时超过最大递归深度

我有一个由三个类组成的继承链:Baz继承自Bar继承自Foo.我想在Foo类中定义一个方法,当在子类中调用时,返回其父类的输出,并附加自己的东西.这是所需的输出:

>>> foo = Foo()
>>> bar = Bar()
>>> baz = Baz()
>>> print foo.get_defining_fields()
['in Foo']
>>> print bar.get_defining_fields()
['in Foo', 'in Bar']
>>> print baz.get_defining_fields()
['in Foo', 'in Bar', 'in Baz']
Run Code Online (Sandbox Code Playgroud)

问题是,我误解了super()由子类调用的超类方法或其他一些子类化细节的使用.这个位工作正常:

>>> print foo.get_defining_fields()
['in Foo']
Run Code Online (Sandbox Code Playgroud)

bar.get_defining_fields()产生一个无限循环,运行自己直到a RuntimeError被提升而不是foo.get_defining_fields像我想要的那样召唤并停在那里.

这是代码.

class Foo(object):
    def _defining_fields(self):
        return ['in Foo']

    def get_defining_fields(self):
        if self.__class__ == Foo:
            # Top of the chain, don't call super()
            return self._defining_fields()
        return super(self.__class__, self).get_defining_fields() + self._defining_fields()

class Bar(Foo): …
Run Code Online (Sandbox Code Playgroud)

python recursion inheritance exception

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