我试图改进Java Html文档一点点,但我遇到了问题HttpUrlConntion
.有一点是,如果用户代理是Java VM,某些服务器会阻止请求.另一个问题是HttpUrlConnection
没有设置Referrer
或Location
头字段.由于几个站点使用这些字段来验证内容是从他们自己的站点访问的,因此我也被阻止了.据我所知,唯一的解决方案是替换HTTP协议的URL处理程序.或者有没有办法修改默认的HTTP Handler?
你会如何开始改进一个非常糟糕的系统?
在您建议创建单元测试和重构之前,让我解释一下我的意思.我可以使用这些技术但在这种情况下这将毫无意义.
实际上系统是如此破碎,它没有做它需要做的事情.
例如,系统应计算它发送的消息数量.它主要起作用,但在某些情况下它会"忘记"增加消息计数器的值.问题是,许多其他具有自己的变通方法的模块建立在这个计数器上,如果我纠正计数器,整个系统将变得比现在更糟.解决方案可能是修改所有模块并删除自己的更正,但是有150多个模块需要如此多的协调才能负担得起.
更糟糕的是,有些问题的解决方法不是在系统本身,而是在人们的头脑中.例如,系统不能在一个消息组中表示超过四个相关消息.某些服务需要将五个消息组合在一起.会计部门知道这种限制,每次他们计算这些服务的消息时,他们会计算消息组并将其乘以5/4以获得正确的消息数.绝对没有关于这些偏差的文档,没有人知道现在系统中存在多少这样的东西.
那么你将如何开始改进这个系统呢?你会采取什么策略?
还有一些额外的事情:我是一个单人军队,因此雇用足够的人并重新设计/重构系统是不可接受的答案.在几个星期或几个月内,我真的应该展示一些明显的进展,所以不能选择在几年内进行自我重构.
一些技术细节:系统是用Java和PHP编写的,但我认为这并不重要.它背后有两个数据库,一个是Oracle和一个PostgreSQL数据库.除了代码本身之前提到的缺陷之外,它的编写和记录也非常糟糕.
附加信息:
计数器问题不是同步问题.counter ++语句被添加到某些模块中,而不会添加到其他模块中.快速而肮脏的修复是将它们添加到缺失的位置.长期解决方案是使其成为需要它的模块的一个方面,以后不可能忘记它.我没有修复这样的问题,但是如果我做这个改变,我会打破其他10个模块.
更新:
我接受了Greg D的回答.即使我更喜欢Adam Bellaire,也不会让我知道什么是理想的.谢谢大家的答案.
这是64位Windows 7 Enterprise
和64位Java 7:
java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b20)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)
Run Code Online (Sandbox Code Playgroud)
这种情况同时使用的外壳C:\Windows\SystemWOW64\cmd.exe
(我认为不正确的是64位版本),并与C:\Windows\System32\cmd.exe
(我刚刚发现,脉冲星的礼貌,是尽管路径名称的64位应用程序).
该计划本身是微不足道的:
public class Trivial
{
public static void main(String[] args) {
System.out.println("total = " + toMB(Runtime.getRuntime().totalMemory()));
System.out.println("max = " + toMB(Runtime.getRuntime().maxMemory()));
}
private static long toMB(long bytes) {
return bytes / (1024L * 1024L);
}
}
Run Code Online (Sandbox Code Playgroud)
我只是打打闹闹不同-Xmx
和-Xms
参数,看看会发生什么.虽然我在64位Windows上使用64位Java,但我可以使用几乎所有大小和我想要的初始堆,但这不是正在发生的事情.
java -Xmx16G -Xms2G Trivial
(例如)工作正常.但是,java -Xmx16G -Xms4G …
我有一组单例类,我想避免样板代码.这就是我现在拥有的:
public class Mammal {
protected Mammal() {}
}
public class Cat extends Mammal {
static protected Cat instance = null;
static public Cat getInstance() {
if (null == instance) {
instance = new Cat();
}
return instance;
}
private Cat() {
// something cat-specific
}
}
Run Code Online (Sandbox Code Playgroud)
这有效,并没有任何问题,除了我有许多Mammal
必须复制getInstance()
方法的子类.如果可能的话,我更喜欢这样的东西:
public class Mammal {
protected Mammal() {}
static protected Mammal instance = null;
static public Mammal getInstance() {
if (null == instance) {
instance = new Mammal();
} …
Run Code Online (Sandbox Code Playgroud) 执行下面的代码时出现异常
bool FieldValueMessage::Get(const std::string &field, double & value)
{
string text;
if(Get(field,text))
{
std::stringstream sstr(text);
sstr >> value;
if(sstr.fail())
return false;
else
return true;
}
else
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
获取功能如下
bool HashMapMessage::Get(const std::string &field, std::string & value)
{
Field2Value::iterator i = f2v.find(field);
if(i==f2v.end()){
return false;
} else {
value = i->second;
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
Get函数的调用者.我在这里看不到任何问题.
for(i=quote_fields.begin(),j=0;i!=quote_fields.end();i++,j++){
if (msg->Get((*i).c_str(),tmp)){
if(tmp>0 && x->staging_data[j+1]!=tmp){
x->staging_data[j+1] = tmp;
has_update = true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
调用堆栈是
ntdll.dll!_RtlpCoalesceFreeBlocks@16() + 0x35 bytes
ntdll.dll!_RtlFreeHeap@12() + …
Run Code Online (Sandbox Code Playgroud) 每当我在文本框中输入一个空字符串并尝试保存它时我有这个错误我有这个错误:
Failed to convert property value of type java.lang.String to
required type double for property customerAcctSetting.maxAllowableAmount;
nested exception is java.lang.IllegalArgumentException: Cannot convert value of
type [java.lang.String] to required type [double] for
property maxAllowableAmount:
PropertyEditor [bp.ar.util.NumberFormatUtil$CustomerDoubleEditor] returned
inappropriate value
Run Code Online (Sandbox Code Playgroud)
但是,当我输入无效的数字格式,如"ddd"时,我有这个错误:
Failed to convert property value of type java.lang.String to required
type double for property customerAcctSetting.maxAllowableAmount;
nested exception is java.lang.NumberFormatException: For input string: "ddd"
Run Code Online (Sandbox Code Playgroud)
我的控制器中有这个活页夹:
@InitBinder
public void initBinder(WebDataBinder binder) {
NumberFormatUtil.registerDoubleFormat(binder);
}
Run Code Online (Sandbox Code Playgroud)
我有一个NumberFormatUtil.java
实现静态函数的类registerDoubleFormat(binder)
:
NumberFormatUtil.java
public static void …
Run Code Online (Sandbox Code Playgroud) 找不到关于对等方之间通信如何工作的任何流程图.我知道在启用PAP的Radius中它是如何工作的,但似乎在MS-Chapv2中有很多工作需要开发.
我正在尝试开发RADIUS服务器来接收和验证用户请求.请以信息而不是代码的形式帮助我.
我们应该首先实施哪些敏捷开发的单一方面来改进我们的开发过程,为什么?
我处在一种情况,要求我"调整"我的过程,而不是重新设计它,而"敏捷"似乎是当时的口头禅.如果我们只做一个可以改进某些事物的改变 - 质量,上市时间,文档,透明度等,那么最明显的积极影响是什么?
如果我们选择正确,我们将能够做出第二选择.:-)
更新: 您目前的SDLC是什么?
环境:基本上是"重启".一个小的开发商屈指可数; 传统产品,10 ^ 5-10 ^ 6 LOC,全球部署数万台; 产品是相互依存的; 多年来增加的重要功能,包括许多一次性,不进行重构; 紧张的时间表; 表面质量保证; 没有验尸或"流程大师".
典型流程:
感谢您提供了许多有用的建议和见解!
我很熟悉browser()
,trace()
,traceback()
,和options(error=recover)
.我也在玩调试包,看起来不错.所有这些都使R R领先于我在调试设施方面所使用的其他统计软件包.但与编译的传统语言相比,情况似乎不太有利.这引出了两个问题:
您最想念的其他语言的调试工具是什么?
是否可以在R中添加此功能,因为它存在于当前,还是需要编译器等?
编辑:消除了我提议的条目,因为有人指出它确实存在于R.
(这是在SLES11,Java 7,Tomcat 6,log4j-1.2.16)
我们使用log4j将不同的东西写入不同的日志文件.我继承了这段代码,所以无论好坏,一般结构都会暂时停留.
记录器将创建两个日志文件:main.log
和stats.log
.通过单独的调用将两个记录器记录到某个统计信息(您将在下面看到),并将大量其他内容记录到主日志中.
所以通过我们的代码你会看到类似的东西Log.logMain(someMessageToLog);
.在我们的代码中的一个地方(由多个线程执行)有以下内容:
String statsMessage = createStatsMessage();
Log.logMain(statsMessage);
Log.logStats(statsMessage);
Run Code Online (Sandbox Code Playgroud)
主记录器main
的名称是,统计记录器的名称stats
.问题是,有时在负载很重的情况下,我们会看到main.log
其中包含字符串stats INFO
的行.所有内容main.log
应该只包含在内,main INFO
因为这是记录到该文件的唯一记录器,而且我们在某些行中看到混合输出.这似乎是线程安全问题,但log4j文档说log4j是线程安全的.这是我的意思的一个例子:
2012-03-21 16:01:34,7742012-03-21 16:01:34,774| | stats main INFO [INFO http-8080-18]: [message redacted].
2012-03-21 16:01:36,380| main 2012-03-21 16:01:36,380| INFO [stats INFO http-8080-15]: [message redacted].
2012-03-21 16:01:37,465| main INFO 2012-03-21 16:01:37,465 [| stats http-8080-1]: [message redacted].
Run Code Online (Sandbox Code Playgroud)
这是Log
类(被剥离以仅显示有问题的记录器 - 其中实际上有一堆其他记录器,所有设置都与这些类似):
import org.apache.log4j.*;
import java.io.IOException;
final public class Log
{ …
Run Code Online (Sandbox Code Playgroud) java ×5
64-bit ×1
agile ×1
c++ ×1
debugging ×1
http ×1
http-headers ×1
inheritance ×1
log4j ×1
logging ×1
node.js ×1
process ×1
r ×1
radius ×1
refactoring ×1
singleton ×1
spring-mvc ×1
system ×1
vpn ×1
windows ×1