最近和我的同事一起讨论了如何在Scrum项目中组织版本控制.更具体地说,分支创建的标准(每个开发人员,每个任务,每个故事,每个Sprint?)和集成方法.
我的意见是组织它的一个有用的方法是为每个用户故事创建一个分支,这样你就可以在完成后将每个Story集成到可释放的trunk中,并且它还允许你总是拥有应用程序的"可交付版本"任何时候.
因此,如果一个故事无法完成,它可能会被排除在外,并且不会影响sprint版本.(考虑到集中式工具,如果使用分布式工具,则考虑因素会有所不同)
我想知道你自己的方法,你喜欢哪种工具,以及你从经验和所吸取的教训中看到的利弊.
我正在构建我的第一个真正的WPF应用程序(即第一个打算供我以外的人使用),我仍然围绕着在WPF中做事的最佳方式.这是一个相当简单的数据访问应用程序,使用仍然相当新的实体框架,但我无法在线找到大量的指导,以便将这两种技术(WPF和EF)结合使用的最佳方式.所以我想我会抛弃我接近它的方式,看看是否有人有更好的建议.
我正在使用SQL Server 2008的实体框架.EF让我觉得它比它需要的要复杂得多,而且还不成熟,但Linq-to-SQL显然已经死了,所以我不妨使用这项技术MS似乎专注于.
这是一个简单的应用程序,所以我(还)认为不适合在它周围构建一个单独的数据层.当我想获取数据时,我使用相当简单的Linq-to-Entity查询,通常直接来自我的代码隐藏,例如:
var families = from family in entities.Family.Include("Person")
orderby family.PrimaryLastName, family.Tag
select family;
Run Code Online (Sandbox Code Playgroud)Linq-to-Entity查询返回IOrderedQueryable结果,该结果不会自动反映基础数据的更改,例如,如果我通过代码向实体数据模型添加新记录,则此新记录的存在不会自动反映在引用Linq查询的各种控件.因此,我将这些查询的结果抛入ObservableCollection,以捕获底层数据更改:
familyOC = new ObservableCollection<Family>(families.ToList());
Run Code Online (Sandbox Code Playgroud)然后我将ObservableCollection映射到CollectionViewSource,这样我就可以进行过滤,排序等,而无需返回数据库.
familyCVS.Source = familyOC;
familyCVS.View.Filter = new Predicate<object>(ApplyFamilyFilter);
familyCVS.View.SortDescriptions.Add(new System.ComponentModel.SortDescription("PrimaryLastName", System.ComponentModel.ListSortDirection.Ascending));
familyCVS.View.SortDescriptions.Add(new System.ComponentModel.SortDescription("Tag", System.ComponentModel.ListSortDirection.Ascending));
Run Code Online (Sandbox Code Playgroud)然后我将各种控件和what-not绑定到CollectionViewSource:
<ListBox DockPanel.Dock="Bottom" Margin="5,5,5,5"
Name="familyList"
ItemsSource="{Binding Source={StaticResource familyCVS}, Path=., Mode=TwoWay}"
IsSynchronizedWithCurrentItem="True"
ItemTemplate="{StaticResource familyTemplate}"
SelectionChanged="familyList_SelectionChanged" />
Run Code Online (Sandbox Code Playgroud)当我需要添加或删除记录/对象时,我从实体数据模型和ObservableCollection手动执行此操作:
private void DeletePerson(Person person)
{
entities.DeleteObject(person);
entities.SaveChanges();
personOC.Remove(person);
}
Run Code Online (Sandbox Code Playgroud)我通常使用StackPanel和DockPanel控件来定位元素.有时我会使用Grid,但似乎很难维护:如果要在网格顶部添加新行,则必须触摸网格直接托管的每个控件,以告诉它使用新行.Uggh.(微软似乎从未真正获得DRY概念.)
我几乎从不使用VS WPF设计器来添加,修改或定位控件.VS附带的WPF设计器对于查看表单的外观有点模糊,但即使如此,也不是真的,特别是如果您使用的数据模板不能绑定到可用的数据模板设计时间.如果我需要编辑我的XAML,我会像男人一样手动操作.
我的大部分真实代码都是使用C#而不是XAML.正如我在别处提到的那样,完全除了我还不习惯"思考"它的事实之外,XAML让我觉得它是一种笨重,丑陋的语言,这也恰好伴随着糟糕的设计师和智能感知支持,并且无法调试.Uggh.因此,每当我能够清楚地看到如何在C#代码中执行某些操作时,我无法轻易地看到如何在XAML中执行操作,而是在C#中执行此操作,并且没有道歉.关于如何在WPF页面中使用代码隐藏(例如,用于事件处理)这是一个很好的做法,已经有很多文章,但至少到目前为止,这对我来说毫无意义.当我能使用像C#一样漂亮,干净的语言,拥有世界一流的编辑器,近乎完美的时候,为什么我应该用一种难看的,笨重的语言做一些语法,一个令人难以置信的语法,一个令人惊讶的糟糕的编辑器,几乎没有类型的安全性智能感知,
这就是我所处的位置.有什么建议?我错过了这方面的任何重要部分吗?我应该考虑采取哪些不同的做法?
我看到的是一个POST请求我做结束后发生的10或20秒的崩溃(didReceiveResponse
,didReceiveData
而connectionDidFinishLoading
所有消防在飞机坠毁前发生了好).
这是我用来发出请求的代码:
NSURL* url = [[NSURL alloc] initWithString:urlString];
[urlString release];
NSData* requestData = [jsonData dataUsingEncoding:NSUTF8StringEncoding];
NSString* requestDataLengthString = [[NSString alloc] initWithFormat:@"%d", [requestData length]];
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:requestData];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:requestDataLengthString forHTTPHeaderField:@"Content-Length"];
[request setTimeoutInterval:30.0];
[url release];
[requestData release];
[requestDataLengthString release];
m_URLConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[request release];
Run Code Online (Sandbox Code Playgroud)
什么是这个崩溃非常奇怪的是这样的:如果我不叫 setHTTPBody我的NSData
对象,setValue:@"application/json"
为Content-Type
和setValue:requestDataLengthString
对Content-Length
,碰撞也不会发生.我对发生的事情感到十分困惑.据我所知,崩溃直接NSData
与我的请求发送对象有关.当它崩溃时,崩溃(EXEC_BAD_ACCESS
)的调用堆栈中的顶部元素如下: …
是否可以在IronPython中使用LINQ类型和扩展方法?
如果是这样的话?还有更多的pythonic做同样的事情吗?
我怎么能在WPF的代码隐藏中做到这一点?
<Grid Background="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}"/>
Run Code Online (Sandbox Code Playgroud) 让我说我有一个文本框,我想填补整行.我会给它一个这样的风格:
input.wide {display:block; width: 100%}
Run Code Online (Sandbox Code Playgroud)
这会导致问题,因为宽度基于文本框的内容.文本框默认具有边距,边框和填充,这使得100%宽度的文本框大于其容器.
例如,在右边:
有没有办法让文本框填充其容器的宽度而不扩展到它之外?
这是一些示例HTML来显示我的意思:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Untitled Page</title>
<style type="text/css">
#outer{border: 1px solid #000; width: 320px; margin: 0px;padding:0px}
#inner{margin: 20px; padding: 20px; background: #999;border: 1px solid #000;}
input.wide {display:block; margin: 0px}
input.normal {display:block; float: right}
</style>
</head>
<body>
<div id="outer">
<div id="inner">
<input type="text" class="wide" />
<input type="text" class="normal" />
<div style="clear:both;"></div>
</div>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
如果运行此操作,您可以通过查看"普通"文本框看到"宽"文本框伸出容器."普通"文本框浮动到容器的实际边缘.我正在尝试使"宽"文本框填充其容器,而不像"普通"文本框那样扩展到边缘之外.
我正在使用他们的Python库实现Google数据源.我希望库中的响应能够使用simplejson库在另一个Python脚本中导入.
但是,即使他们的示例也没有在JSONLint中验证:
{cols:
[{id:'name',label:'Name',type:'string'},
{id:'salary',label:'Salary',type:'number'},
{id:'full_time',label:'Full Time Employee',type:'boolean'}],
rows:
[{c:[{v:'Jim'},{v:800,f:'$800'},{v:false}]},
{c:[{v:'Bob'},{v:7000,f:'$7,000'},{v:true}]},
{c:[{v:'Mike'},{v:10000,f:'$10,000'},{v:true}]},
{c:[{v:'Alice'},{v:12500,f:'$12,500'},{v:true}]}]}
Run Code Online (Sandbox Code Playgroud)
如何调整simplejson'loads'函数来导入上面的JSON?我认为主要问题是对象键不是字符串.
我宁愿不写一个正则表达式来将键转换为字符串,因为我认为这样的代码会很难维护.
我正在尝试使用simplejson将上面的json导入到python中时出现"Expecting property name:line 1 column 1(char 1)"错误.
我有一个带有选择字段和div的表单我希望根据用户选择的值更新值.
例:
<select name="mysel" id="msel">
<option value="test1">Test1</option>
<option value="test2">Test2</option>
<option value="test3">Test3</option>
</select>
<div id="myresult"></div>
Run Code Online (Sandbox Code Playgroud)
如果用户选择test2,我希望div更新为"这是测试2和其他信息",依此类推.
任何有关这方面的帮助将不胜感激.
ANSI标准是否要求逻辑运算符在C或C++中被短路?
我很困惑,因为我记得K&R的书说你的代码不应该依赖于这些操作被短路,因为它们可能没有.有人可以指出标准中的哪个位置逻辑操作始终是短路的吗?我最感兴趣的是C++,C的答案也很棒.
我还记得读(不记得在哪里)评估顺序没有严格定义,所以你的代码不应该依赖或假设表达式中的函数将按特定的顺序执行:在语句的末尾所有引用的函数将被调用,但编译器可以自由选择最有效的顺序.
标准是否表明该表达式的评估顺序?
if( functionA() && functionB() && functionC() ) cout<<"Hello world";
Run Code Online (Sandbox Code Playgroud) c c++ operator-precedence short-circuiting logical-operators
我们的产品历史悠久(12年左右).
它的起源是VB3(版本1)和后来的VB6(版本2).(版本号是"狗早餐",版本控制是一场噩梦.
我已经在这里参与了几年.我们在.Net平台上开发了第3版,但版本2继续得到定期版本的支持 - 每年约3或4个版本.
我在开始时介绍了夜间自动构建版本,我们的产品版本号是2.2.2.每个人都计划只发布2.2.3,但自动构建过程和VB6的"有趣"3部分编号系统,意味着我们需要使用第三部分 - 构建/修订号 - 这应该是它应该的.
所以我们发布了版本2.3(内置版本为"无论什么")并开始使用2.4(每晚增加内部版本号),然后是2.5,然后是2.6等.
内部版本号远离公共视图,但可用于支持目的,即使我们很少发布多个版本的版本 - 我们偶尔需要修补.
确保一致性.现在我们达到2.9.我们即将进入2.10(两点九,最多两点十).不幸的是,非技术人员正在读这个像一个有理数的人(两点一).他们无法理解为什么我们不只是去3.0版 - 就像计数一样.(为了支持目的,内部版本号仅显示在"帮助/关于"屏幕上).
我不认为产品(主要数量)升级是有保证的,特别是由于市场预期的这种预期.
有没有正确的方法在这里继续?(2.10或3.0或更好的东西 - 或者甚至更重要?)
(注意:我已经花了一些时间来确保版本号现在显示为2.09,而不是2.9(在我们的网站上,产品启动画面和各种其他公共场所等),所以当我们移动到2.10时它可能更有意义,但这可能同样令人困惑,因为2.09实际上是一个比2.8更低的有理数......)
也可以看看:
wpf ×2
agile ×1
c ×1
c# ×1
c++ ×1
css ×1
forms ×1
html ×1
iphone ×1
ironpython ×1
jquery ×1
linq ×1
objective-c ×1
python ×1
scrum ×1
simplejson ×1
versioning ×1